@industry-theme/alexandria-panels 0.1.9 → 0.1.12

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.
Files changed (52) hide show
  1. package/dist/index.d.ts +9 -3
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/mocks/panelContext.d.ts +41 -0
  4. package/dist/mocks/panelContext.d.ts.map +1 -1
  5. package/dist/panels/GitHubProjectsPanel/GitHubProjectsPanel.stories.d.ts +34 -0
  6. package/dist/panels/GitHubProjectsPanel/GitHubProjectsPanel.stories.d.ts.map +1 -0
  7. package/dist/panels/GitHubProjectsPanel/index.d.ts +11 -0
  8. package/dist/panels/GitHubProjectsPanel/index.d.ts.map +1 -0
  9. package/dist/panels/GitHubProjectsPanel/tools.d.ts +32 -0
  10. package/dist/panels/GitHubProjectsPanel/tools.d.ts.map +1 -0
  11. package/dist/panels/GitHubProjectsPanel/types.d.ts +74 -0
  12. package/dist/panels/GitHubProjectsPanel/types.d.ts.map +1 -0
  13. package/dist/panels/GitHubStarredPanel/GitHubStarredPanel.stories.d.ts +26 -0
  14. package/dist/panels/GitHubStarredPanel/GitHubStarredPanel.stories.d.ts.map +1 -0
  15. package/dist/panels/GitHubStarredPanel/index.d.ts +12 -0
  16. package/dist/panels/GitHubStarredPanel/index.d.ts.map +1 -0
  17. package/dist/panels/GitHubStarredPanel/tools.d.ts +28 -0
  18. package/dist/panels/GitHubStarredPanel/tools.d.ts.map +1 -0
  19. package/dist/panels/GitHubStarredPanel/types.d.ts +64 -0
  20. package/dist/panels/GitHubStarredPanel/types.d.ts.map +1 -0
  21. package/dist/panels/LocalProjectsPanel/LocalProjectCard.d.ts.map +1 -1
  22. package/dist/panels/WorkspacesListPanel/index.d.ts.map +1 -1
  23. package/dist/panels/WorkspacesListPanel/types.d.ts +2 -0
  24. package/dist/panels/WorkspacesListPanel/types.d.ts.map +1 -1
  25. package/dist/panels/shared/GitHubRepositoryCard.d.ts +26 -0
  26. package/dist/panels/shared/GitHubRepositoryCard.d.ts.map +1 -0
  27. package/dist/panels/shared/github-types.d.ts +51 -0
  28. package/dist/panels/shared/github-types.d.ts.map +1 -0
  29. package/dist/panels.bundle.js +1693 -1012
  30. package/dist/panels.bundle.js.map +1 -1
  31. package/dist/tools/index.d.ts +0 -1
  32. package/dist/tools/index.d.ts.map +1 -1
  33. package/dist/tools.bundle.js +0 -97
  34. package/dist/types/index.d.ts +0 -1
  35. package/dist/types/index.d.ts.map +1 -1
  36. package/package.json +1 -1
  37. package/dist/panels/DependenciesPanel/DependenciesPanel.stories.d.ts +0 -59
  38. package/dist/panels/DependenciesPanel/DependenciesPanel.stories.d.ts.map +0 -1
  39. package/dist/panels/DependenciesPanel/components/DependencyInfoModal.d.ts +0 -8
  40. package/dist/panels/DependenciesPanel/components/DependencyInfoModal.d.ts.map +0 -1
  41. package/dist/panels/DependenciesPanel/components/DependencyRow.d.ts +0 -8
  42. package/dist/panels/DependenciesPanel/components/DependencyRow.d.ts.map +0 -1
  43. package/dist/panels/DependenciesPanel/components/FilterBar.d.ts +0 -17
  44. package/dist/panels/DependenciesPanel/components/FilterBar.d.ts.map +0 -1
  45. package/dist/panels/DependenciesPanel/components/index.d.ts +0 -4
  46. package/dist/panels/DependenciesPanel/components/index.d.ts.map +0 -1
  47. package/dist/panels/DependenciesPanel/index.d.ts +0 -7
  48. package/dist/panels/DependenciesPanel/index.d.ts.map +0 -1
  49. package/dist/panels/DependenciesPanel/tools.d.ts +0 -35
  50. package/dist/panels/DependenciesPanel/tools.d.ts.map +0 -1
  51. package/dist/panels/DependenciesPanel/types.d.ts +0 -36
  52. package/dist/panels/DependenciesPanel/types.d.ts.map +0 -1
@@ -3,7 +3,7 @@
3
3
  try {
4
4
  if (typeof document != "undefined") {
5
5
  var elementStyle = document.createElement("style");
6
- elementStyle.appendChild(document.createTextNode("/* Container query for responsive LocalProjectCard */\n.local-projects-panel {\n container-type: inline-size;\n container-name: local-projects;\n height: 100%;\n}\n\n/* Compact mode when container is 400px or less */\n@container local-projects (max-width: 400px) {\n .local-projects-panel {\n padding: 8px !important;\n gap: 8px !important;\n }\n\n .local-projects-list {\n gap: 8px !important;\n }\n\n .local-project-card {\n padding: 8px !important;\n }\n}"));
6
+ elementStyle.appendChild(document.createTextNode("/* Container query for responsive LocalProjectCard */\n.local-projects-panel {\n container-type: inline-size;\n container-name: local-projects;\n height: 100%;\n}\n\n/* Animated underline that grows from left on hover */\n.local-project-card .project-name-underline {\n position: relative;\n text-decoration: none;\n}\n\n.local-project-card .project-name-underline::after {\n content: '';\n position: absolute;\n left: 0;\n bottom: -3px;\n width: 0;\n height: 2px;\n background-color: var(--underline-color);\n transition: width 0.2s ease-out;\n}\n\n.local-project-card:hover .project-name-underline::after {\n width: 100%;\n}\n\n/* Compact mode when container is 400px or less */\n@container local-projects (max-width: 400px) {\n .local-projects-panel {\n padding: 8px !important;\n gap: 8px !important;\n }\n\n .local-projects-list {\n gap: 8px !important;\n }\n\n .local-project-card {\n padding: 8px !important;\n }\n}"));
7
7
  document.head.appendChild(elementStyle);
8
8
  }
9
9
  } catch (e) {
@@ -140,46 +140,7 @@ const createLucideIcon = (iconName, iconNode) => {
140
140
  * This source code is licensed under the ISC license.
141
141
  * See the LICENSE file in the root directory of this source tree.
142
142
  */
143
- const __iconNode$l = [
144
- [
145
- "path",
146
- {
147
- d: "M2.97 12.92A2 2 0 0 0 2 14.63v3.24a2 2 0 0 0 .97 1.71l3 1.8a2 2 0 0 0 2.06 0L12 19v-5.5l-5-3-4.03 2.42Z",
148
- key: "lc1i9w"
149
- }
150
- ],
151
- ["path", { d: "m7 16.5-4.74-2.85", key: "1o9zyk" }],
152
- ["path", { d: "m7 16.5 5-3", key: "va8pkn" }],
153
- ["path", { d: "M7 16.5v5.17", key: "jnp8gn" }],
154
- [
155
- "path",
156
- {
157
- d: "M12 13.5V19l3.97 2.38a2 2 0 0 0 2.06 0l3-1.8a2 2 0 0 0 .97-1.71v-3.24a2 2 0 0 0-.97-1.71L17 10.5l-5 3Z",
158
- key: "8zsnat"
159
- }
160
- ],
161
- ["path", { d: "m17 16.5-5-3", key: "8arw3v" }],
162
- ["path", { d: "m17 16.5 4.74-2.85", key: "8rfmw" }],
163
- ["path", { d: "M17 16.5v5.17", key: "k6z78m" }],
164
- [
165
- "path",
166
- {
167
- d: "M7.97 4.42A2 2 0 0 0 7 6.13v4.37l5 3 5-3V6.13a2 2 0 0 0-.97-1.71l-3-1.8a2 2 0 0 0-2.06 0l-3 1.8Z",
168
- key: "1xygjf"
169
- }
170
- ],
171
- ["path", { d: "M12 8 7.26 5.15", key: "1vbdud" }],
172
- ["path", { d: "m12 8 4.74-2.85", key: "3rx089" }],
173
- ["path", { d: "M12 13.5V8", key: "1io7kd" }]
174
- ];
175
- const Boxes = createLucideIcon("boxes", __iconNode$l);
176
- /**
177
- * @license lucide-react v0.552.0 - ISC
178
- *
179
- * This source code is licensed under the ISC license.
180
- * See the LICENSE file in the root directory of this source tree.
181
- */
182
- const __iconNode$k = [
143
+ const __iconNode$q = [
183
144
  ["path", { d: "M10 12h4", key: "a56b0p" }],
184
145
  ["path", { d: "M10 8h4", key: "1sr2af" }],
185
146
  ["path", { d: "M14 21v-3a2 2 0 0 0-4 0v3", key: "1rgiei" }],
@@ -192,83 +153,111 @@ const __iconNode$k = [
192
153
  ],
193
154
  ["path", { d: "M6 21V5a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v16", key: "16ra0t" }]
194
155
  ];
195
- const Building2 = createLucideIcon("building-2", __iconNode$k);
156
+ const Building2 = createLucideIcon("building-2", __iconNode$q);
196
157
  /**
197
158
  * @license lucide-react v0.552.0 - ISC
198
159
  *
199
160
  * This source code is licensed under the ISC license.
200
161
  * See the LICENSE file in the root directory of this source tree.
201
162
  */
202
- const __iconNode$j = [["path", { d: "M20 6 9 17l-5-5", key: "1gmf2c" }]];
203
- const Check = createLucideIcon("check", __iconNode$j);
163
+ const __iconNode$p = [["path", { d: "M20 6 9 17l-5-5", key: "1gmf2c" }]];
164
+ const Check = createLucideIcon("check", __iconNode$p);
204
165
  /**
205
166
  * @license lucide-react v0.552.0 - ISC
206
167
  *
207
168
  * This source code is licensed under the ISC license.
208
169
  * See the LICENSE file in the root directory of this source tree.
209
170
  */
210
- const __iconNode$i = [
171
+ const __iconNode$o = [["path", { d: "m6 9 6 6 6-6", key: "qrunsl" }]];
172
+ const ChevronDown = createLucideIcon("chevron-down", __iconNode$o);
173
+ /**
174
+ * @license lucide-react v0.552.0 - ISC
175
+ *
176
+ * This source code is licensed under the ISC license.
177
+ * See the LICENSE file in the root directory of this source tree.
178
+ */
179
+ const __iconNode$n = [["path", { d: "m9 18 6-6-6-6", key: "mthhwq" }]];
180
+ const ChevronRight = createLucideIcon("chevron-right", __iconNode$n);
181
+ /**
182
+ * @license lucide-react v0.552.0 - ISC
183
+ *
184
+ * This source code is licensed under the ISC license.
185
+ * See the LICENSE file in the root directory of this source tree.
186
+ */
187
+ const __iconNode$m = [
211
188
  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
212
- ["path", { d: "M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3", key: "1u773s" }],
213
- ["path", { d: "M12 17h.01", key: "p32p05" }]
189
+ ["line", { x1: "12", x2: "12", y1: "8", y2: "12", key: "1pkeuh" }],
190
+ ["line", { x1: "12", x2: "12.01", y1: "16", y2: "16", key: "4dfq90" }]
214
191
  ];
215
- const CircleQuestionMark = createLucideIcon("circle-question-mark", __iconNode$i);
192
+ const CircleAlert = createLucideIcon("circle-alert", __iconNode$m);
216
193
  /**
217
194
  * @license lucide-react v0.552.0 - ISC
218
195
  *
219
196
  * This source code is licensed under the ISC license.
220
197
  * See the LICENSE file in the root directory of this source tree.
221
198
  */
222
- const __iconNode$h = [
199
+ const __iconNode$l = [
223
200
  ["rect", { width: "14", height: "14", x: "8", y: "8", rx: "2", ry: "2", key: "17jyea" }],
224
201
  ["path", { d: "M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2", key: "zix9uf" }]
225
202
  ];
226
- const Copy = createLucideIcon("copy", __iconNode$h);
203
+ const Copy = createLucideIcon("copy", __iconNode$l);
227
204
  /**
228
205
  * @license lucide-react v0.552.0 - ISC
229
206
  *
230
207
  * This source code is licensed under the ISC license.
231
208
  * See the LICENSE file in the root directory of this source tree.
232
209
  */
233
- const __iconNode$g = [
210
+ const __iconNode$k = [
234
211
  ["path", { d: "M10 12h.01", key: "1kxr2c" }],
235
212
  ["path", { d: "M18 20V6a2 2 0 0 0-2-2H8a2 2 0 0 0-2 2v14", key: "36qu9e" }],
236
213
  ["path", { d: "M2 20h20", key: "owomy5" }]
237
214
  ];
238
- const DoorClosed = createLucideIcon("door-closed", __iconNode$g);
215
+ const DoorClosed = createLucideIcon("door-closed", __iconNode$k);
239
216
  /**
240
217
  * @license lucide-react v0.552.0 - ISC
241
218
  *
242
219
  * This source code is licensed under the ISC license.
243
220
  * See the LICENSE file in the root directory of this source tree.
244
221
  */
245
- const __iconNode$f = [
222
+ const __iconNode$j = [
223
+ ["path", { d: "M12 15V3", key: "m9g1x1" }],
224
+ ["path", { d: "M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4", key: "ih7n3h" }],
225
+ ["path", { d: "m7 10 5 5 5-5", key: "brsn70" }]
226
+ ];
227
+ const Download = createLucideIcon("download", __iconNode$j);
228
+ /**
229
+ * @license lucide-react v0.552.0 - ISC
230
+ *
231
+ * This source code is licensed under the ISC license.
232
+ * See the LICENSE file in the root directory of this source tree.
233
+ */
234
+ const __iconNode$i = [
246
235
  ["path", { d: "M15 3h6v6", key: "1q9fwt" }],
247
236
  ["path", { d: "M10 14 21 3", key: "gplh6r" }],
248
237
  ["path", { d: "M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6", key: "a6xqqp" }]
249
238
  ];
250
- const ExternalLink = createLucideIcon("external-link", __iconNode$f);
239
+ const ExternalLink = createLucideIcon("external-link", __iconNode$i);
251
240
  /**
252
241
  * @license lucide-react v0.552.0 - ISC
253
242
  *
254
243
  * This source code is licensed under the ISC license.
255
244
  * See the LICENSE file in the root directory of this source tree.
256
245
  */
257
- const __iconNode$e = [
246
+ const __iconNode$h = [
258
247
  ["circle", { cx: "12", cy: "12", r: "3", key: "1v7zrd" }],
259
248
  ["path", { d: "M3 7V5a2 2 0 0 1 2-2h2", key: "aa7l1z" }],
260
249
  ["path", { d: "M17 3h2a2 2 0 0 1 2 2v2", key: "4qcy5o" }],
261
250
  ["path", { d: "M21 17v2a2 2 0 0 1-2 2h-2", key: "6vwrx8" }],
262
251
  ["path", { d: "M7 21H5a2 2 0 0 1-2-2v-2", key: "ioqczr" }]
263
252
  ];
264
- const Focus = createLucideIcon("focus", __iconNode$e);
253
+ const Focus = createLucideIcon("focus", __iconNode$h);
265
254
  /**
266
255
  * @license lucide-react v0.552.0 - ISC
267
256
  *
268
257
  * This source code is licensed under the ISC license.
269
258
  * See the LICENSE file in the root directory of this source tree.
270
259
  */
271
- const __iconNode$d = [
260
+ const __iconNode$g = [
272
261
  [
273
262
  "path",
274
263
  {
@@ -280,14 +269,14 @@ const __iconNode$d = [
280
269
  ["path", { d: "M18 19c-2.8 0-5-2.2-5-5v8", key: "pkpw2h" }],
281
270
  ["circle", { cx: "20", cy: "19", r: "2", key: "1obnsp" }]
282
271
  ];
283
- const FolderGit2 = createLucideIcon("folder-git-2", __iconNode$d);
272
+ const FolderGit2 = createLucideIcon("folder-git-2", __iconNode$g);
284
273
  /**
285
274
  * @license lucide-react v0.552.0 - ISC
286
275
  *
287
276
  * This source code is licensed under the ISC license.
288
277
  * See the LICENSE file in the root directory of this source tree.
289
278
  */
290
- const __iconNode$c = [
279
+ const __iconNode$f = [
291
280
  [
292
281
  "path",
293
282
  {
@@ -296,14 +285,14 @@ const __iconNode$c = [
296
285
  }
297
286
  ]
298
287
  ];
299
- const FolderOpen = createLucideIcon("folder-open", __iconNode$c);
288
+ const FolderOpen = createLucideIcon("folder-open", __iconNode$f);
300
289
  /**
301
290
  * @license lucide-react v0.552.0 - ISC
302
291
  *
303
292
  * This source code is licensed under the ISC license.
304
293
  * See the LICENSE file in the root directory of this source tree.
305
294
  */
306
- const __iconNode$b = [
295
+ const __iconNode$e = [
307
296
  [
308
297
  "path",
309
298
  {
@@ -312,14 +301,28 @@ const __iconNode$b = [
312
301
  }
313
302
  ]
314
303
  ];
315
- const Folder = createLucideIcon("folder", __iconNode$b);
304
+ const Folder = createLucideIcon("folder", __iconNode$e);
305
+ /**
306
+ * @license lucide-react v0.552.0 - ISC
307
+ *
308
+ * This source code is licensed under the ISC license.
309
+ * See the LICENSE file in the root directory of this source tree.
310
+ */
311
+ const __iconNode$d = [
312
+ ["circle", { cx: "12", cy: "18", r: "3", key: "1mpf1b" }],
313
+ ["circle", { cx: "6", cy: "6", r: "3", key: "1lh9wr" }],
314
+ ["circle", { cx: "18", cy: "6", r: "3", key: "1h7g24" }],
315
+ ["path", { d: "M18 9v2c0 .6-.4 1-1 1H7c-.6 0-1-.4-1-1V9", key: "1uq4wg" }],
316
+ ["path", { d: "M12 12v3", key: "158kv8" }]
317
+ ];
318
+ const GitFork = createLucideIcon("git-fork", __iconNode$d);
316
319
  /**
317
320
  * @license lucide-react v0.552.0 - ISC
318
321
  *
319
322
  * This source code is licensed under the ISC license.
320
323
  * See the LICENSE file in the root directory of this source tree.
321
324
  */
322
- const __iconNode$a = [
325
+ const __iconNode$c = [
323
326
  ["path", { d: "M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8", key: "5wwlr5" }],
324
327
  [
325
328
  "path",
@@ -329,14 +332,14 @@ const __iconNode$a = [
329
332
  }
330
333
  ]
331
334
  ];
332
- const House = createLucideIcon("house", __iconNode$a);
335
+ const House = createLucideIcon("house", __iconNode$c);
333
336
  /**
334
337
  * @license lucide-react v0.552.0 - ISC
335
338
  *
336
339
  * This source code is licensed under the ISC license.
337
340
  * See the LICENSE file in the root directory of this source tree.
338
341
  */
339
- const __iconNode$9 = [
342
+ const __iconNode$b = [
340
343
  [
341
344
  "path",
342
345
  {
@@ -359,52 +362,44 @@ const __iconNode$9 = [
359
362
  }
360
363
  ]
361
364
  ];
362
- const Layers = createLucideIcon("layers", __iconNode$9);
365
+ const Layers = createLucideIcon("layers", __iconNode$b);
363
366
  /**
364
367
  * @license lucide-react v0.552.0 - ISC
365
368
  *
366
369
  * This source code is licensed under the ISC license.
367
370
  * See the LICENSE file in the root directory of this source tree.
368
371
  */
369
- const __iconNode$8 = [["path", { d: "M21 12a9 9 0 1 1-6.219-8.56", key: "13zald" }]];
370
- const LoaderCircle = createLucideIcon("loader-circle", __iconNode$8);
372
+ const __iconNode$a = [["path", { d: "M21 12a9 9 0 1 1-6.219-8.56", key: "13zald" }]];
373
+ const LoaderCircle = createLucideIcon("loader-circle", __iconNode$a);
371
374
  /**
372
375
  * @license lucide-react v0.552.0 - ISC
373
376
  *
374
377
  * This source code is licensed under the ISC license.
375
378
  * See the LICENSE file in the root directory of this source tree.
376
379
  */
377
- const __iconNode$7 = [
378
- ["path", { d: "M8 6L12 2L16 6", key: "1yvkyx" }],
379
- ["path", { d: "M12 2V22", key: "r89rzk" }]
380
+ const __iconNode$9 = [
381
+ ["rect", { width: "18", height: "11", x: "3", y: "11", rx: "2", ry: "2", key: "1w4ew1" }],
382
+ ["path", { d: "M7 11V7a5 5 0 0 1 10 0v4", key: "fwvmzm" }]
380
383
  ];
381
- const MoveUp = createLucideIcon("move-up", __iconNode$7);
384
+ const Lock = createLucideIcon("lock", __iconNode$9);
382
385
  /**
383
386
  * @license lucide-react v0.552.0 - ISC
384
387
  *
385
388
  * This source code is licensed under the ISC license.
386
389
  * See the LICENSE file in the root directory of this source tree.
387
390
  */
388
- const __iconNode$6 = [
389
- [
390
- "path",
391
- {
392
- d: "M11 21.73a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73z",
393
- key: "1a0edw"
394
- }
395
- ],
396
- ["path", { d: "M12 22V12", key: "d0xqtd" }],
397
- ["polyline", { points: "3.29 7 12 12 20.71 7", key: "ousv84" }],
398
- ["path", { d: "m7.5 4.27 9 5.15", key: "1c824w" }]
391
+ const __iconNode$8 = [
392
+ ["path", { d: "M8 6L12 2L16 6", key: "1yvkyx" }],
393
+ ["path", { d: "M12 2V22", key: "r89rzk" }]
399
394
  ];
400
- const Package = createLucideIcon("package", __iconNode$6);
395
+ const MoveUp = createLucideIcon("move-up", __iconNode$8);
401
396
  /**
402
397
  * @license lucide-react v0.552.0 - ISC
403
398
  *
404
399
  * This source code is licensed under the ISC license.
405
400
  * See the LICENSE file in the root directory of this source tree.
406
401
  */
407
- const __iconNode$5 = [
402
+ const __iconNode$7 = [
408
403
  [
409
404
  "path",
410
405
  {
@@ -413,57 +408,81 @@ const __iconNode$5 = [
413
408
  }
414
409
  ]
415
410
  ];
416
- const Pen = createLucideIcon("pen", __iconNode$5);
411
+ const Pen = createLucideIcon("pen", __iconNode$7);
417
412
  /**
418
413
  * @license lucide-react v0.552.0 - ISC
419
414
  *
420
415
  * This source code is licensed under the ISC license.
421
416
  * See the LICENSE file in the root directory of this source tree.
422
417
  */
423
- const __iconNode$4 = [
418
+ const __iconNode$6 = [
424
419
  ["path", { d: "M5 12h14", key: "1ays0h" }],
425
420
  ["path", { d: "M12 5v14", key: "s699le" }]
426
421
  ];
427
- const Plus = createLucideIcon("plus", __iconNode$4);
422
+ const Plus = createLucideIcon("plus", __iconNode$6);
428
423
  /**
429
424
  * @license lucide-react v0.552.0 - ISC
430
425
  *
431
426
  * This source code is licensed under the ISC license.
432
427
  * See the LICENSE file in the root directory of this source tree.
433
428
  */
434
- const __iconNode$3 = [
435
- ["path", { d: "m16 16 3-8 3 8c-.87.65-1.92 1-3 1s-2.13-.35-3-1Z", key: "7g6ntu" }],
436
- ["path", { d: "m2 16 3-8 3 8c-.87.65-1.92 1-3 1s-2.13-.35-3-1Z", key: "ijws7r" }],
437
- ["path", { d: "M7 21h10", key: "1b0cd5" }],
438
- ["path", { d: "M12 3v18", key: "108xh3" }],
439
- ["path", { d: "M3 7h2c2 0 5-1 7-2 2 1 5 2 7 2h2", key: "3gwbw2" }]
429
+ const __iconNode$5 = [
430
+ ["path", { d: "M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8", key: "1357e3" }],
431
+ ["path", { d: "M3 3v5h5", key: "1xhq8a" }]
440
432
  ];
441
- const Scale = createLucideIcon("scale", __iconNode$3);
433
+ const RotateCcw = createLucideIcon("rotate-ccw", __iconNode$5);
442
434
  /**
443
435
  * @license lucide-react v0.552.0 - ISC
444
436
  *
445
437
  * This source code is licensed under the ISC license.
446
438
  * See the LICENSE file in the root directory of this source tree.
447
439
  */
448
- const __iconNode$2 = [
440
+ const __iconNode$4 = [
449
441
  ["path", { d: "m21 21-4.34-4.34", key: "14j7rj" }],
450
442
  ["circle", { cx: "11", cy: "11", r: "8", key: "4ej97u" }]
451
443
  ];
452
- const Search = createLucideIcon("search", __iconNode$2);
444
+ const Search = createLucideIcon("search", __iconNode$4);
453
445
  /**
454
446
  * @license lucide-react v0.552.0 - ISC
455
447
  *
456
448
  * This source code is licensed under the ISC license.
457
449
  * See the LICENSE file in the root directory of this source tree.
458
450
  */
459
- const __iconNode$1 = [
451
+ const __iconNode$3 = [
452
+ [
453
+ "path",
454
+ {
455
+ d: "M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z",
456
+ key: "r04s7s"
457
+ }
458
+ ]
459
+ ];
460
+ const Star = createLucideIcon("star", __iconNode$3);
461
+ /**
462
+ * @license lucide-react v0.552.0 - ISC
463
+ *
464
+ * This source code is licensed under the ISC license.
465
+ * See the LICENSE file in the root directory of this source tree.
466
+ */
467
+ const __iconNode$2 = [
460
468
  ["path", { d: "M10 11v6", key: "nco0om" }],
461
469
  ["path", { d: "M14 11v6", key: "outv1u" }],
462
470
  ["path", { d: "M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6", key: "miytrc" }],
463
471
  ["path", { d: "M3 6h18", key: "d0wm0j" }],
464
472
  ["path", { d: "M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2", key: "e791ji" }]
465
473
  ];
466
- const Trash2 = createLucideIcon("trash-2", __iconNode$1);
474
+ const Trash2 = createLucideIcon("trash-2", __iconNode$2);
475
+ /**
476
+ * @license lucide-react v0.552.0 - ISC
477
+ *
478
+ * This source code is licensed under the ISC license.
479
+ * See the LICENSE file in the root directory of this source tree.
480
+ */
481
+ const __iconNode$1 = [
482
+ ["path", { d: "M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2", key: "975kel" }],
483
+ ["circle", { cx: "12", cy: "7", r: "4", key: "17ys0d" }]
484
+ ];
485
+ const User = createLucideIcon("user", __iconNode$1);
467
486
  /**
468
487
  * @license lucide-react v0.552.0 - ISC
469
488
  *
@@ -546,7 +565,7 @@ const LANGUAGE_COLORS = {
546
565
  Shell: "#89e051",
547
566
  PowerShell: "#012456"
548
567
  };
549
- const getLanguageColor = (language) => {
568
+ const getLanguageColor$1 = (language) => {
550
569
  return LANGUAGE_COLORS[language] || "#6e7681";
551
570
  };
552
571
  const LocalProjectCard = ({
@@ -566,7 +585,7 @@ const LocalProjectCard = ({
566
585
  workspacePath,
567
586
  userHomePath
568
587
  }) => {
569
- var _a, _b, _c, _d, _e;
588
+ var _a, _b, _c, _d, _e, _f;
570
589
  const { theme } = useTheme();
571
590
  const [isHovered, setIsHovered] = useState(false);
572
591
  const [copiedPath, setCopiedPath] = useState(false);
@@ -863,6 +882,7 @@ const LocalProjectCard = ({
863
882
  children: /* @__PURE__ */ jsx(
864
883
  "span",
865
884
  {
885
+ className: ((_c = entry.github) == null ? void 0 : _c.primaryLanguage) ? "project-name-underline" : void 0,
866
886
  style: {
867
887
  flex: 1,
868
888
  fontSize: `${theme.fontSizes[2]}px`,
@@ -871,9 +891,7 @@ const LocalProjectCard = ({
871
891
  overflow: "hidden",
872
892
  textOverflow: "ellipsis",
873
893
  whiteSpace: "nowrap",
874
- textDecoration: "underline",
875
- textDecorationColor: ((_c = entry.github) == null ? void 0 : _c.primaryLanguage) ? getLanguageColor(entry.github.primaryLanguage) : theme.colors.textSecondary,
876
- textUnderlineOffset: "3px"
894
+ "--underline-color": ((_d = entry.github) == null ? void 0 : _d.primaryLanguage) ? getLanguageColor$1(entry.github.primaryLanguage) : theme.colors.textSecondary
877
895
  },
878
896
  children: entry.name
879
897
  }
@@ -905,8 +923,8 @@ const LocalProjectCard = ({
905
923
  opacity: isHovered ? 0 : 1,
906
924
  transition: "opacity 0.15s ease"
907
925
  },
908
- title: ((_d = entry.github) == null ? void 0 : _d.description) || displayPath,
909
- children: ((_e = entry.github) == null ? void 0 : _e.description) || displayPath
926
+ title: ((_e = entry.github) == null ? void 0 : _e.description) || displayPath,
927
+ children: ((_f = entry.github) == null ? void 0 : _f.description) || displayPath
910
928
  }
911
929
  ),
912
930
  /* @__PURE__ */ jsx(
@@ -938,10 +956,10 @@ const LocalProjectCard = ({
938
956
  }
939
957
  );
940
958
  };
941
- const PANEL_ID$6 = "industry-theme.local-projects";
942
- const createPanelEvent$2 = (type, payload) => ({
959
+ const PANEL_ID$9 = "industry-theme.local-projects";
960
+ const createPanelEvent$4 = (type, payload) => ({
943
961
  type,
944
- source: PANEL_ID$6,
962
+ source: PANEL_ID$9,
945
963
  timestamp: Date.now(),
946
964
  payload
947
965
  });
@@ -977,7 +995,7 @@ const LocalProjectsPanelContent = ({
977
995
  try {
978
996
  await panelActions.openRepository(entry);
979
997
  setWindowStates((prev) => new Map(prev).set(entry.path, "ready"));
980
- events.emit(createPanelEvent$2(`${PANEL_ID$6}:repository-opened`, { entry }));
998
+ events.emit(createPanelEvent$4(`${PANEL_ID$9}:repository-opened`, { entry }));
981
999
  } catch (error) {
982
1000
  console.error("Error opening repository:", error);
983
1001
  setWindowStates((prev) => new Map(prev).set(entry.path, "closed"));
@@ -988,14 +1006,14 @@ const LocalProjectsPanelContent = ({
988
1006
  useEffect(() => {
989
1007
  const unsubscribers = [
990
1008
  // Filter event from tools
991
- events.on(`${PANEL_ID$6}:filter`, (event) => {
1009
+ events.on(`${PANEL_ID$9}:filter`, (event) => {
992
1010
  var _a2;
993
1011
  if (((_a2 = event.payload) == null ? void 0 : _a2.filter) !== void 0) {
994
1012
  setFilter(event.payload.filter);
995
1013
  }
996
1014
  }),
997
1015
  // Select repository event from tools
998
- events.on(`${PANEL_ID$6}:select-repository`, (event) => {
1016
+ events.on(`${PANEL_ID$9}:select-repository`, (event) => {
999
1017
  var _a2;
1000
1018
  const identifier = (_a2 = event.payload) == null ? void 0 : _a2.identifier;
1001
1019
  if (identifier) {
@@ -1004,12 +1022,12 @@ const LocalProjectsPanelContent = ({
1004
1022
  );
1005
1023
  if (entry) {
1006
1024
  setSelectedEntry(entry);
1007
- events.emit(createPanelEvent$2(`${PANEL_ID$6}:repository-selected`, { entry }));
1025
+ events.emit(createPanelEvent$4(`${PANEL_ID$9}:repository-selected`, { entry }));
1008
1026
  }
1009
1027
  }
1010
1028
  }),
1011
1029
  // Open repository event from tools
1012
- events.on(`${PANEL_ID$6}:open-repository`, (event) => {
1030
+ events.on(`${PANEL_ID$9}:open-repository`, (event) => {
1013
1031
  var _a2;
1014
1032
  const identifier = (_a2 = event.payload) == null ? void 0 : _a2.identifier;
1015
1033
  if (identifier) {
@@ -1057,7 +1075,7 @@ const LocalProjectsPanelContent = ({
1057
1075
  };
1058
1076
  const handleSelectRepository = (entry) => {
1059
1077
  setSelectedEntry(entry);
1060
- events.emit(createPanelEvent$2(`${PANEL_ID$6}:repository-selected`, { entry }));
1078
+ events.emit(createPanelEvent$4(`${PANEL_ID$9}:repository-selected`, { entry }));
1061
1079
  };
1062
1080
  const normalizedFilter = filter.trim().toLowerCase();
1063
1081
  const filteredAndSortedRepositories = useMemo(() => {
@@ -1318,10 +1336,10 @@ const LocalProjectsPanelPreview = () => {
1318
1336
  }
1319
1337
  );
1320
1338
  };
1321
- const PANEL_ID$5 = "industry-theme.workspace-repositories";
1322
- const createPanelEvent$1 = (type, payload) => ({
1339
+ const PANEL_ID$8 = "industry-theme.workspace-repositories";
1340
+ const createPanelEvent$3 = (type, payload) => ({
1323
1341
  type,
1324
- source: PANEL_ID$5,
1342
+ source: PANEL_ID$8,
1325
1343
  timestamp: Date.now(),
1326
1344
  payload
1327
1345
  });
@@ -1386,7 +1404,7 @@ const WorkspaceRepositoriesPanelContent = ({
1386
1404
  (repository) => {
1387
1405
  var _a;
1388
1406
  events.emit(
1389
- createPanelEvent$1("repository:selected", {
1407
+ createPanelEvent$3("repository:selected", {
1390
1408
  repositoryId: ((_a = repository.github) == null ? void 0 : _a.id) || repository.name,
1391
1409
  repository,
1392
1410
  repositoryPath: repository.path
@@ -1399,7 +1417,7 @@ const WorkspaceRepositoriesPanelContent = ({
1399
1417
  (repository) => {
1400
1418
  var _a;
1401
1419
  events.emit(
1402
- createPanelEvent$1("repository:opened", {
1420
+ createPanelEvent$3("repository:opened", {
1403
1421
  repositoryId: ((_a = repository.github) == null ? void 0 : _a.id) || repository.name,
1404
1422
  repository
1405
1423
  })
@@ -1440,7 +1458,7 @@ const WorkspaceRepositoriesPanelContent = ({
1440
1458
  );
1441
1459
  useEffect(() => {
1442
1460
  const unsubscribers = [
1443
- events.on(`${PANEL_ID$5}:select-repository`, (event) => {
1461
+ events.on(`${PANEL_ID$8}:select-repository`, (event) => {
1444
1462
  var _a;
1445
1463
  const path = (_a = event.payload) == null ? void 0 : _a.repositoryPath;
1446
1464
  if (path) {
@@ -1450,7 +1468,7 @@ const WorkspaceRepositoriesPanelContent = ({
1450
1468
  }
1451
1469
  }
1452
1470
  }),
1453
- events.on(`${PANEL_ID$5}:open-repository`, (event) => {
1471
+ events.on(`${PANEL_ID$8}:open-repository`, (event) => {
1454
1472
  var _a;
1455
1473
  const path = (_a = event.payload) == null ? void 0 : _a.repositoryPath;
1456
1474
  if (path) {
@@ -2139,10 +2157,10 @@ const WorkspaceCard = ({
2139
2157
  }
2140
2158
  );
2141
2159
  };
2142
- const PANEL_ID$4 = "industry-theme.workspaces-list";
2143
- const createPanelEvent = (type, payload) => ({
2160
+ const PANEL_ID$7 = "industry-theme.workspaces-list";
2161
+ const createPanelEvent$2 = (type, payload) => ({
2144
2162
  type,
2145
- source: PANEL_ID$4,
2163
+ source: PANEL_ID$7,
2146
2164
  timestamp: Date.now(),
2147
2165
  payload
2148
2166
  });
@@ -2159,7 +2177,6 @@ const WorkspacesListPanelContent = ({
2159
2177
  const [workspaceRepositories, setWorkspaceRepositories] = useState(
2160
2178
  /* @__PURE__ */ new Map()
2161
2179
  );
2162
- const [isCreating, setIsCreating] = useState(false);
2163
2180
  const panelActions = actions;
2164
2181
  const workspacesSlice = context.getSlice("workspaces");
2165
2182
  const workspaces = useMemo(
@@ -2218,7 +2235,7 @@ const WorkspacesListPanelContent = ({
2218
2235
  (workspace) => {
2219
2236
  setSelectedWorkspaceId(workspace.id);
2220
2237
  events.emit(
2221
- createPanelEvent(`${PANEL_ID$4}:workspace:selected`, {
2238
+ createPanelEvent$2(`${PANEL_ID$7}:workspace:selected`, {
2222
2239
  workspaceId: workspace.id,
2223
2240
  workspace
2224
2241
  })
@@ -2235,7 +2252,7 @@ const WorkspacesListPanelContent = ({
2235
2252
  try {
2236
2253
  await panelActions.openWorkspace(workspace.id);
2237
2254
  events.emit(
2238
- createPanelEvent(`${PANEL_ID$4}:workspace:opened`, {
2255
+ createPanelEvent$2(`${PANEL_ID$7}:workspace:opened`, {
2239
2256
  workspaceId: workspace.id,
2240
2257
  workspace
2241
2258
  })
@@ -2259,7 +2276,7 @@ const WorkspacesListPanelContent = ({
2259
2276
  try {
2260
2277
  await panelActions.deleteWorkspace(workspace.id);
2261
2278
  events.emit(
2262
- createPanelEvent(`${PANEL_ID$4}:workspace:deleted`, {
2279
+ createPanelEvent$2(`${PANEL_ID$7}:workspace:deleted`, {
2263
2280
  workspaceId: workspace.id
2264
2281
  })
2265
2282
  );
@@ -2281,33 +2298,15 @@ const WorkspacesListPanelContent = ({
2281
2298
  },
2282
2299
  [panelActions, context]
2283
2300
  );
2284
- const handleCreateWorkspace = useCallback(async () => {
2285
- if (!panelActions.createWorkspace) {
2286
- console.warn("Create workspace action not available");
2287
- return;
2288
- }
2289
- const name = window.prompt("Enter workspace name:");
2290
- if (!(name == null ? void 0 : name.trim())) return;
2291
- try {
2292
- setIsCreating(true);
2293
- const workspace = await panelActions.createWorkspace(name.trim());
2294
- events.emit(
2295
- createPanelEvent(`${PANEL_ID$4}:workspace:created`, {
2296
- workspaceId: workspace.id,
2297
- workspace
2298
- })
2299
- );
2300
- await context.refresh("workspace", "workspaces");
2301
- } catch (error) {
2302
- console.error("Failed to create workspace:", error);
2303
- } finally {
2304
- setIsCreating(false);
2305
- }
2306
- }, [panelActions, events, context]);
2301
+ const handleCreateWorkspace = useCallback(() => {
2302
+ events.emit(
2303
+ createPanelEvent$2(`${PANEL_ID$7}:create-workspace-requested`, {})
2304
+ );
2305
+ }, [events]);
2307
2306
  useEffect(() => {
2308
2307
  const unsubscribers = [
2309
2308
  // Select workspace event from tools
2310
- events.on(`${PANEL_ID$4}:select-workspace`, (event) => {
2309
+ events.on(`${PANEL_ID$7}:select-workspace`, (event) => {
2311
2310
  var _a2;
2312
2311
  const workspaceId = (_a2 = event.payload) == null ? void 0 : _a2.workspaceId;
2313
2312
  if (workspaceId) {
@@ -2318,7 +2317,7 @@ const WorkspacesListPanelContent = ({
2318
2317
  }
2319
2318
  }),
2320
2319
  // Open workspace event from tools
2321
- events.on(`${PANEL_ID$4}:open-workspace`, (event) => {
2320
+ events.on(`${PANEL_ID$7}:open-workspace`, (event) => {
2322
2321
  var _a2;
2323
2322
  const workspaceId = (_a2 = event.payload) == null ? void 0 : _a2.workspaceId;
2324
2323
  if (workspaceId) {
@@ -2330,14 +2329,14 @@ const WorkspacesListPanelContent = ({
2330
2329
  }),
2331
2330
  // Create workspace event from tools
2332
2331
  events.on(
2333
- `${PANEL_ID$4}:create-workspace`,
2332
+ `${PANEL_ID$7}:create-workspace`,
2334
2333
  async (event) => {
2335
2334
  const { name, description } = event.payload || {};
2336
2335
  if (name && panelActions.createWorkspace) {
2337
2336
  try {
2338
2337
  const workspace = await panelActions.createWorkspace(name, { description });
2339
2338
  events.emit(
2340
- createPanelEvent(`${PANEL_ID$4}:workspace:created`, {
2339
+ createPanelEvent$2(`${PANEL_ID$7}:workspace:created`, {
2341
2340
  workspaceId: workspace.id,
2342
2341
  workspace
2343
2342
  })
@@ -2454,11 +2453,10 @@ const WorkspacesListPanelContent = ({
2454
2453
  children: /* @__PURE__ */ jsx(Search, { size: 16 })
2455
2454
  }
2456
2455
  ),
2457
- panelActions.createWorkspace && /* @__PURE__ */ jsx(
2456
+ /* @__PURE__ */ jsx(
2458
2457
  "button",
2459
2458
  {
2460
2459
  onClick: handleCreateWorkspace,
2461
- disabled: isCreating,
2462
2460
  style: {
2463
2461
  display: "flex",
2464
2462
  alignItems: "center",
@@ -2469,8 +2467,7 @@ const WorkspacesListPanelContent = ({
2469
2467
  border: `1px solid ${theme.colors.border}`,
2470
2468
  backgroundColor: theme.colors.primary,
2471
2469
  color: theme.colors.background,
2472
- cursor: isCreating ? "not-allowed" : "pointer",
2473
- opacity: isCreating ? 0.6 : 1,
2470
+ cursor: "pointer",
2474
2471
  transition: "all 0.15s ease"
2475
2472
  },
2476
2473
  title: "Create new workspace",
@@ -2624,929 +2621,1445 @@ const WorkspacesListPanelPreview = () => {
2624
2621
  }
2625
2622
  );
2626
2623
  };
2627
- const DependencyInfoModal = ({
2628
- isOpen,
2629
- onClose
2624
+ const GitHubRepositoryCard = ({
2625
+ repository,
2626
+ localRepo,
2627
+ onClone,
2628
+ onOpen,
2629
+ isLoading = false,
2630
+ isSelected = false,
2631
+ onSelect
2630
2632
  }) => {
2631
2633
  const { theme } = useTheme();
2632
- if (!isOpen) return null;
2633
- return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx(
2634
+ const [isHovered, setIsHovered] = useState(false);
2635
+ const isCloned = Boolean(localRepo);
2636
+ const handleClone = useCallback(
2637
+ (e) => {
2638
+ e.stopPropagation();
2639
+ if (onClone && !isLoading) {
2640
+ onClone(repository);
2641
+ }
2642
+ },
2643
+ [onClone, repository, isLoading]
2644
+ );
2645
+ const handleOpen = useCallback(
2646
+ (e) => {
2647
+ e.stopPropagation();
2648
+ if (onOpen && localRepo && !isLoading) {
2649
+ onOpen(localRepo.path);
2650
+ }
2651
+ },
2652
+ [onOpen, localRepo, isLoading]
2653
+ );
2654
+ const handleClick = useCallback(() => {
2655
+ if (onSelect) {
2656
+ onSelect(repository);
2657
+ }
2658
+ }, [onSelect, repository]);
2659
+ const handleOpenOnGitHub = useCallback(
2660
+ (e) => {
2661
+ e.stopPropagation();
2662
+ window.open(repository.html_url, "_blank", "noopener,noreferrer");
2663
+ },
2664
+ [repository.html_url]
2665
+ );
2666
+ const getRelativeTime = (dateString) => {
2667
+ const date = new Date(dateString);
2668
+ const now = /* @__PURE__ */ new Date();
2669
+ const diffMs = now.getTime() - date.getTime();
2670
+ const diffDays = Math.floor(diffMs / (1e3 * 60 * 60 * 24));
2671
+ if (diffDays === 0) return "today";
2672
+ if (diffDays === 1) return "yesterday";
2673
+ if (diffDays < 7) return `${diffDays} days ago`;
2674
+ if (diffDays < 30) return `${Math.floor(diffDays / 7)} weeks ago`;
2675
+ if (diffDays < 365) return `${Math.floor(diffDays / 30)} months ago`;
2676
+ return `${Math.floor(diffDays / 365)} years ago`;
2677
+ };
2678
+ return /* @__PURE__ */ jsxs(
2634
2679
  "div",
2635
2680
  {
2681
+ onClick: handleClick,
2682
+ onMouseEnter: () => setIsHovered(true),
2683
+ onMouseLeave: () => setIsHovered(false),
2636
2684
  style: {
2637
- position: "fixed",
2638
- top: 0,
2639
- left: 0,
2640
- right: 0,
2641
- bottom: 0,
2642
- backgroundColor: theme.colors.muted,
2643
- zIndex: theme.zIndices[4],
2644
2685
  display: "flex",
2645
- alignItems: "center",
2646
- justifyContent: "center"
2686
+ alignItems: "flex-start",
2687
+ gap: "12px",
2688
+ padding: "12px",
2689
+ borderRadius: "8px",
2690
+ backgroundColor: isSelected ? `${theme.colors.primary}15` : isHovered ? theme.colors.backgroundTertiary : "transparent",
2691
+ border: `1px solid ${isSelected ? theme.colors.primary : "transparent"}`,
2692
+ cursor: onSelect ? "pointer" : "default",
2693
+ transition: "background-color 0.15s, border-color 0.15s"
2647
2694
  },
2648
- onClick: onClose,
2649
- children: /* @__PURE__ */ jsxs(
2650
- "div",
2651
- {
2652
- style: {
2653
- backgroundColor: theme.colors.background,
2654
- borderRadius: `${theme.radii[3]}px`,
2655
- maxWidth: "600px",
2656
- maxHeight: "80vh",
2657
- width: "90%",
2658
- overflow: "hidden",
2659
- display: "flex",
2660
- flexDirection: "column",
2661
- boxShadow: theme.shadows[3]
2662
- },
2663
- onClick: (e) => e.stopPropagation(),
2664
- children: [
2665
- /* @__PURE__ */ jsxs(
2666
- "div",
2667
- {
2668
- style: {
2669
- padding: `${theme.space[4]}px`,
2670
- borderBottom: `1px solid ${theme.colors.border}`,
2671
- display: "flex",
2672
- alignItems: "center",
2673
- justifyContent: "space-between"
2674
- },
2675
- children: [
2676
- /* @__PURE__ */ jsxs(
2677
- "h2",
2678
- {
2679
- style: {
2680
- fontSize: `${theme.fontSizes[4]}px`,
2681
- fontWeight: theme.fontWeights.semibold,
2682
- color: theme.colors.text,
2683
- display: "flex",
2684
- alignItems: "center",
2685
- gap: `${theme.space[2]}px`,
2686
- margin: 0
2687
- },
2688
- children: [
2689
- /* @__PURE__ */ jsx(CircleQuestionMark, { size: 20 }),
2690
- "Understanding Dependencies"
2691
- ]
2692
- }
2693
- ),
2695
+ children: [
2696
+ /* @__PURE__ */ jsx(
2697
+ RepositoryAvatar,
2698
+ {
2699
+ owner: repository.owner.login,
2700
+ customAvatarUrl: repository.owner.avatar_url,
2701
+ size: 40
2702
+ }
2703
+ ),
2704
+ /* @__PURE__ */ jsxs("div", { style: { flex: 1, minWidth: 0 }, children: [
2705
+ /* @__PURE__ */ jsxs(
2706
+ "div",
2707
+ {
2708
+ style: {
2709
+ display: "flex",
2710
+ alignItems: "center",
2711
+ gap: "8px",
2712
+ marginBottom: "4px"
2713
+ },
2714
+ children: [
2715
+ /* @__PURE__ */ jsx(
2716
+ "span",
2717
+ {
2718
+ style: {
2719
+ fontSize: `${theme.fontSizes[2]}px`,
2720
+ fontWeight: theme.fontWeights.semibold,
2721
+ fontFamily: theme.fonts.body,
2722
+ color: isCloned ? "#10b981" : theme.colors.text,
2723
+ overflow: "hidden",
2724
+ textOverflow: "ellipsis",
2725
+ whiteSpace: "nowrap"
2726
+ },
2727
+ title: repository.full_name,
2728
+ children: repository.name
2729
+ }
2730
+ ),
2731
+ repository.private && /* @__PURE__ */ jsx("span", { title: "Private repository", children: /* @__PURE__ */ jsx(
2732
+ Lock,
2733
+ {
2734
+ size: 12,
2735
+ style: { color: theme.colors.textSecondary, flexShrink: 0 }
2736
+ }
2737
+ ) }),
2738
+ repository.fork && /* @__PURE__ */ jsx("span", { title: "Forked repository", children: /* @__PURE__ */ jsx(
2739
+ GitFork,
2740
+ {
2741
+ size: 12,
2742
+ style: { color: theme.colors.textSecondary, flexShrink: 0 }
2743
+ }
2744
+ ) })
2745
+ ]
2746
+ }
2747
+ ),
2748
+ /* @__PURE__ */ jsx(
2749
+ "div",
2750
+ {
2751
+ style: {
2752
+ fontSize: `${theme.fontSizes[0]}px`,
2753
+ fontFamily: theme.fonts.body,
2754
+ color: theme.colors.textSecondary,
2755
+ marginBottom: "4px"
2756
+ },
2757
+ children: repository.owner.login
2758
+ }
2759
+ ),
2760
+ repository.description && /* @__PURE__ */ jsx(
2761
+ "div",
2762
+ {
2763
+ style: {
2764
+ fontSize: `${theme.fontSizes[1]}px`,
2765
+ fontFamily: theme.fonts.body,
2766
+ color: theme.colors.textSecondary,
2767
+ lineHeight: theme.lineHeights.body,
2768
+ overflow: "hidden",
2769
+ textOverflow: "ellipsis",
2770
+ display: "-webkit-box",
2771
+ WebkitLineClamp: 2,
2772
+ WebkitBoxOrient: "vertical",
2773
+ marginBottom: "8px"
2774
+ },
2775
+ children: repository.description
2776
+ }
2777
+ ),
2778
+ /* @__PURE__ */ jsxs(
2779
+ "div",
2780
+ {
2781
+ style: {
2782
+ display: "flex",
2783
+ alignItems: "center",
2784
+ gap: "12px",
2785
+ fontSize: `${theme.fontSizes[0]}px`,
2786
+ fontFamily: theme.fonts.body,
2787
+ color: theme.colors.textSecondary
2788
+ },
2789
+ children: [
2790
+ repository.language && /* @__PURE__ */ jsxs("span", { style: { display: "flex", alignItems: "center", gap: "4px" }, children: [
2694
2791
  /* @__PURE__ */ jsx(
2695
- "button",
2792
+ "span",
2696
2793
  {
2697
- onClick: onClose,
2698
2794
  style: {
2699
- background: "none",
2700
- border: "none",
2701
- color: theme.colors.textSecondary,
2702
- cursor: "pointer",
2703
- padding: `${theme.space[1]}px`
2704
- },
2705
- children: /* @__PURE__ */ jsx(X, { size: 20 })
2706
- }
2707
- )
2708
- ]
2709
- }
2710
- ),
2711
- /* @__PURE__ */ jsxs(
2712
- "div",
2713
- {
2714
- style: {
2715
- padding: `${theme.space[4]}px`,
2716
- overflow: "auto",
2717
- flex: 1
2718
- },
2719
- children: [
2720
- /* @__PURE__ */ jsxs(
2721
- Section,
2722
- {
2723
- icon: /* @__PURE__ */ jsx(Package, { size: 18 }),
2724
- title: "Dependency Types",
2725
- theme,
2726
- children: [
2727
- /* @__PURE__ */ jsx(
2728
- InfoItem,
2729
- {
2730
- badge: { text: "prod", color: theme.colors.primary },
2731
- title: "Production Dependencies",
2732
- description: "Required for your application to run in production. These are bundled with your app and affect its size and security.",
2733
- theme
2734
- }
2735
- ),
2736
- /* @__PURE__ */ jsx(
2737
- InfoItem,
2738
- {
2739
- badge: { text: "dev", color: theme.colors.secondary },
2740
- title: "Development Dependencies",
2741
- description: "Only needed during development (build tools, testing, linters). Not included in production builds.",
2742
- theme
2743
- }
2744
- ),
2745
- /* @__PURE__ */ jsx(
2746
- InfoItem,
2747
- {
2748
- badge: { text: "peer", color: theme.colors.accent },
2749
- title: "Peer Dependencies",
2750
- description: "Expected to be provided by the consumer of your package. Important for library authors to specify compatibility.",
2751
- theme
2752
- }
2753
- )
2754
- ]
2795
+ width: "8px",
2796
+ height: "8px",
2797
+ borderRadius: "50%",
2798
+ backgroundColor: getLanguageColor(repository.language)
2799
+ }
2755
2800
  }
2756
2801
  ),
2757
- /* @__PURE__ */ jsxs(
2758
- Section,
2759
- {
2760
- icon: /* @__PURE__ */ jsx(Scale, { size: 18 }),
2761
- title: "Common Licenses",
2762
- theme,
2763
- children: [
2764
- /* @__PURE__ */ jsx(
2765
- InfoItem,
2766
- {
2767
- badge: { text: "MIT", color: theme.colors.success },
2768
- title: "Permissive Licenses (MIT, Apache, BSD)",
2769
- description: "Few restrictions. Can use in commercial projects. Must include copyright notice.",
2770
- theme
2771
- }
2772
- ),
2773
- /* @__PURE__ */ jsx(
2774
- InfoItem,
2775
- {
2776
- badge: { text: "GPL", color: theme.colors.warning },
2777
- title: "Copyleft Licenses (GPL, LGPL, AGPL)",
2778
- description: "Requires sharing source code of derivative works. Can impact your project's licensing.",
2779
- theme
2780
- }
2781
- )
2782
- ]
2783
- }
2784
- )
2785
- ]
2786
- }
2787
- )
2788
- ]
2789
- }
2790
- )
2802
+ repository.language
2803
+ ] }),
2804
+ repository.stargazers_count !== void 0 && repository.stargazers_count > 0 && /* @__PURE__ */ jsxs("span", { style: { display: "flex", alignItems: "center", gap: "4px" }, children: [
2805
+ /* @__PURE__ */ jsx(Star, { size: 12 }),
2806
+ formatNumber(repository.stargazers_count)
2807
+ ] }),
2808
+ /* @__PURE__ */ jsxs("span", { children: [
2809
+ "Updated ",
2810
+ getRelativeTime(repository.pushed_at || repository.updated_at)
2811
+ ] })
2812
+ ]
2813
+ }
2814
+ )
2815
+ ] }),
2816
+ /* @__PURE__ */ jsxs(
2817
+ "div",
2818
+ {
2819
+ style: {
2820
+ display: "flex",
2821
+ alignItems: "center",
2822
+ gap: "8px",
2823
+ flexShrink: 0
2824
+ },
2825
+ children: [
2826
+ /* @__PURE__ */ jsx(
2827
+ "button",
2828
+ {
2829
+ type: "button",
2830
+ onClick: handleOpenOnGitHub,
2831
+ style: {
2832
+ display: "flex",
2833
+ alignItems: "center",
2834
+ justifyContent: "center",
2835
+ width: "32px",
2836
+ height: "32px",
2837
+ borderRadius: "6px",
2838
+ border: `1px solid ${theme.colors.border}`,
2839
+ backgroundColor: "transparent",
2840
+ color: theme.colors.textSecondary,
2841
+ cursor: "pointer",
2842
+ transition: "background-color 0.15s, color 0.15s"
2843
+ },
2844
+ title: "Open on GitHub",
2845
+ onMouseEnter: (e) => {
2846
+ e.currentTarget.style.backgroundColor = theme.colors.backgroundTertiary;
2847
+ e.currentTarget.style.color = theme.colors.text;
2848
+ },
2849
+ onMouseLeave: (e) => {
2850
+ e.currentTarget.style.backgroundColor = "transparent";
2851
+ e.currentTarget.style.color = theme.colors.textSecondary;
2852
+ },
2853
+ children: /* @__PURE__ */ jsx(ExternalLink, { size: 16 })
2854
+ }
2855
+ ),
2856
+ isCloned ? /* @__PURE__ */ jsxs(
2857
+ "button",
2858
+ {
2859
+ type: "button",
2860
+ onClick: handleOpen,
2861
+ disabled: isLoading || !onOpen,
2862
+ style: {
2863
+ display: "flex",
2864
+ alignItems: "center",
2865
+ gap: "6px",
2866
+ padding: "6px 12px",
2867
+ borderRadius: "6px",
2868
+ border: "none",
2869
+ backgroundColor: "#10b981",
2870
+ color: "#ffffff",
2871
+ fontSize: `${theme.fontSizes[1]}px`,
2872
+ fontWeight: theme.fontWeights.medium,
2873
+ fontFamily: theme.fonts.body,
2874
+ cursor: isLoading || !onOpen ? "not-allowed" : "pointer",
2875
+ opacity: isLoading || !onOpen ? 0.6 : 1,
2876
+ transition: "opacity 0.15s"
2877
+ },
2878
+ title: "Open in workspace",
2879
+ children: [
2880
+ /* @__PURE__ */ jsx(FolderOpen, { size: 14 }),
2881
+ "Open"
2882
+ ]
2883
+ }
2884
+ ) : /* @__PURE__ */ jsxs(
2885
+ "button",
2886
+ {
2887
+ type: "button",
2888
+ onClick: handleClone,
2889
+ disabled: isLoading || !onClone,
2890
+ style: {
2891
+ display: "flex",
2892
+ alignItems: "center",
2893
+ gap: "6px",
2894
+ padding: "6px 12px",
2895
+ borderRadius: "6px",
2896
+ border: "none",
2897
+ backgroundColor: theme.colors.primary,
2898
+ color: theme.colors.background,
2899
+ fontSize: `${theme.fontSizes[1]}px`,
2900
+ fontWeight: theme.fontWeights.medium,
2901
+ fontFamily: theme.fonts.body,
2902
+ cursor: isLoading || !onClone ? "not-allowed" : "pointer",
2903
+ opacity: isLoading || !onClone ? 0.6 : 1,
2904
+ transition: "opacity 0.15s"
2905
+ },
2906
+ title: "Clone repository",
2907
+ children: [
2908
+ /* @__PURE__ */ jsx(Download, { size: 14 }),
2909
+ "Clone"
2910
+ ]
2911
+ }
2912
+ )
2913
+ ]
2914
+ }
2915
+ )
2916
+ ]
2791
2917
  }
2792
- ) });
2918
+ );
2919
+ };
2920
+ function getLanguageColor(language) {
2921
+ const colors = {
2922
+ TypeScript: "#3178c6",
2923
+ JavaScript: "#f7df1e",
2924
+ Python: "#3572A5",
2925
+ Rust: "#dea584",
2926
+ Go: "#00ADD8",
2927
+ Java: "#b07219",
2928
+ Ruby: "#701516",
2929
+ PHP: "#4F5D95",
2930
+ "C++": "#f34b7d",
2931
+ C: "#555555",
2932
+ "C#": "#178600",
2933
+ Swift: "#F05138",
2934
+ Kotlin: "#A97BFF",
2935
+ Shell: "#89e051",
2936
+ HTML: "#e34c26",
2937
+ CSS: "#563d7c",
2938
+ Vue: "#41b883",
2939
+ Svelte: "#ff3e00"
2940
+ };
2941
+ return colors[language] || "#8b949e";
2942
+ }
2943
+ function formatNumber(num) {
2944
+ if (num >= 1e6) {
2945
+ return `${(num / 1e6).toFixed(1)}M`;
2946
+ }
2947
+ if (num >= 1e3) {
2948
+ return `${(num / 1e3).toFixed(1)}K`;
2949
+ }
2950
+ return num.toString();
2951
+ }
2952
+ const PANEL_ID$6 = "industry-theme.github-starred";
2953
+ const createPanelEvent$1 = (type, payload) => ({
2954
+ type,
2955
+ source: PANEL_ID$6,
2956
+ timestamp: Date.now(),
2957
+ payload
2958
+ });
2959
+ const GitHubStarredPanel = (props) => {
2960
+ return /* @__PURE__ */ jsx(GitHubStarredPanelContent, { ...props });
2793
2961
  };
2794
- const Section = ({ icon, title, theme, children }) => /* @__PURE__ */ jsxs("div", { style: { marginBottom: `${theme.space[5]}px` }, children: [
2795
- /* @__PURE__ */ jsxs(
2796
- "h3",
2962
+ const GitHubStarredPanelContent = ({
2963
+ context,
2964
+ actions,
2965
+ events
2966
+ }) => {
2967
+ var _a, _b, _c;
2968
+ const { theme } = useTheme();
2969
+ const [filter, setFilter] = useState("");
2970
+ const [selectedRepo, setSelectedRepo] = useState(null);
2971
+ const starredSlice = context.getSlice("githubStarred");
2972
+ const localReposSlice = context.getSlice("alexandriaRepositories");
2973
+ const repositories = useMemo(
2974
+ () => {
2975
+ var _a2;
2976
+ return ((_a2 = starredSlice == null ? void 0 : starredSlice.data) == null ? void 0 : _a2.repositories) || [];
2977
+ },
2978
+ [(_a = starredSlice == null ? void 0 : starredSlice.data) == null ? void 0 : _a.repositories]
2979
+ );
2980
+ const loading = (starredSlice == null ? void 0 : starredSlice.loading) ?? false;
2981
+ const error = (_b = starredSlice == null ? void 0 : starredSlice.data) == null ? void 0 : _b.error;
2982
+ const localRepos = useMemo(
2983
+ () => {
2984
+ var _a2;
2985
+ return ((_a2 = localReposSlice == null ? void 0 : localReposSlice.data) == null ? void 0 : _a2.repositories) || [];
2986
+ },
2987
+ [(_c = localReposSlice == null ? void 0 : localReposSlice.data) == null ? void 0 : _c.repositories]
2988
+ );
2989
+ const panelActions = actions;
2990
+ const localRepoMap = useMemo(() => {
2991
+ const map = /* @__PURE__ */ new Map();
2992
+ localRepos.forEach((entry) => {
2993
+ var _a2, _b2, _c2;
2994
+ if ((_a2 = entry.github) == null ? void 0 : _a2.id) {
2995
+ map.set(entry.github.id, {
2996
+ path: entry.path,
2997
+ name: entry.name,
2998
+ githubFullName: entry.github.id,
2999
+ githubId: entry.github.id
3000
+ });
3001
+ }
3002
+ if (((_b2 = entry.github) == null ? void 0 : _b2.owner) && ((_c2 = entry.github) == null ? void 0 : _c2.name)) {
3003
+ const fullName = `${entry.github.owner}/${entry.github.name}`;
3004
+ map.set(fullName, {
3005
+ path: entry.path,
3006
+ name: entry.name,
3007
+ githubFullName: fullName
3008
+ });
3009
+ }
3010
+ map.set(entry.name, {
3011
+ path: entry.path,
3012
+ name: entry.name
3013
+ });
3014
+ });
3015
+ return map;
3016
+ }, [localRepos]);
3017
+ const normalizedFilter = filter.trim().toLowerCase();
3018
+ const filteredRepositories = useMemo(() => {
3019
+ if (!normalizedFilter) {
3020
+ return repositories;
3021
+ }
3022
+ return repositories.filter((repo) => {
3023
+ var _a2;
3024
+ const haystack = [
3025
+ repo.name,
3026
+ repo.full_name,
3027
+ ((_a2 = repo.owner) == null ? void 0 : _a2.login) ?? "",
3028
+ repo.description ?? "",
3029
+ repo.language ?? ""
3030
+ ].join(" ").toLowerCase();
3031
+ return haystack.includes(normalizedFilter);
3032
+ });
3033
+ }, [repositories, normalizedFilter]);
3034
+ const sortedRepositories = useMemo(() => {
3035
+ return [...filteredRepositories].sort(
3036
+ (a, b) => a.name.localeCompare(b.name, void 0, { sensitivity: "base" })
3037
+ );
3038
+ }, [filteredRepositories]);
3039
+ const handleClone = useCallback(
3040
+ async (repo) => {
3041
+ if (panelActions.cloneRepository) {
3042
+ await panelActions.cloneRepository(repo);
3043
+ events.emit(
3044
+ createPanelEvent$1(`${PANEL_ID$6}:repository-cloned`, {
3045
+ repository: repo
3046
+ })
3047
+ );
3048
+ }
3049
+ },
3050
+ [panelActions, events]
3051
+ );
3052
+ const handleOpen = useCallback(
3053
+ async (localPath) => {
3054
+ if (panelActions.openRepository) {
3055
+ await panelActions.openRepository(localPath);
3056
+ }
3057
+ },
3058
+ [panelActions]
3059
+ );
3060
+ const handleSelect = useCallback(
3061
+ (repo) => {
3062
+ setSelectedRepo(repo);
3063
+ events.emit(
3064
+ createPanelEvent$1(`${PANEL_ID$6}:repository-selected`, { repository: repo })
3065
+ );
3066
+ },
3067
+ [events]
3068
+ );
3069
+ const handleRefresh = useCallback(async () => {
3070
+ if (panelActions.refreshStarred) {
3071
+ await panelActions.refreshStarred();
3072
+ }
3073
+ }, [panelActions]);
3074
+ useEffect(() => {
3075
+ const unsubscribers = [
3076
+ events.on(`${PANEL_ID$6}:filter`, (event) => {
3077
+ var _a2;
3078
+ setFilter(((_a2 = event.payload) == null ? void 0 : _a2.filter) || "");
3079
+ }),
3080
+ events.on(`${PANEL_ID$6}:select-repository`, (event) => {
3081
+ var _a2;
3082
+ const identifier = (_a2 = event.payload) == null ? void 0 : _a2.identifier;
3083
+ if (identifier) {
3084
+ const repo = repositories.find(
3085
+ (r) => r.name === identifier || r.full_name === identifier || r.full_name.toLowerCase() === identifier.toLowerCase()
3086
+ );
3087
+ if (repo) {
3088
+ handleSelect(repo);
3089
+ }
3090
+ }
3091
+ }),
3092
+ events.on(`${PANEL_ID$6}:clone-repository`, (event) => {
3093
+ var _a2;
3094
+ const identifier = (_a2 = event.payload) == null ? void 0 : _a2.identifier;
3095
+ if (identifier) {
3096
+ const repo = repositories.find(
3097
+ (r) => r.name === identifier || r.full_name === identifier || r.full_name.toLowerCase() === identifier.toLowerCase()
3098
+ );
3099
+ if (repo) {
3100
+ void handleClone(repo);
3101
+ }
3102
+ }
3103
+ })
3104
+ ];
3105
+ return () => {
3106
+ unsubscribers.forEach((unsub) => unsub());
3107
+ };
3108
+ }, [events, repositories, handleSelect, handleClone]);
3109
+ const baseContainerStyle = {
3110
+ display: "flex",
3111
+ flexDirection: "column",
3112
+ height: "100%",
3113
+ backgroundColor: theme.colors.backgroundSecondary
3114
+ };
3115
+ if (loading && repositories.length === 0) {
3116
+ return /* @__PURE__ */ jsx("div", { style: baseContainerStyle, children: /* @__PURE__ */ jsx(
3117
+ "div",
3118
+ {
3119
+ style: {
3120
+ flex: 1,
3121
+ display: "flex",
3122
+ alignItems: "center",
3123
+ justifyContent: "center",
3124
+ padding: "32px",
3125
+ textAlign: "center"
3126
+ },
3127
+ children: /* @__PURE__ */ jsxs(
3128
+ "div",
3129
+ {
3130
+ style: {
3131
+ display: "flex",
3132
+ flexDirection: "column",
3133
+ alignItems: "center",
3134
+ gap: "16px"
3135
+ },
3136
+ children: [
3137
+ /* @__PURE__ */ jsx(
3138
+ LoaderCircle,
3139
+ {
3140
+ size: 32,
3141
+ style: { color: theme.colors.textSecondary },
3142
+ className: "animate-spin"
3143
+ }
3144
+ ),
3145
+ /* @__PURE__ */ jsx(
3146
+ "h3",
3147
+ {
3148
+ style: {
3149
+ margin: 0,
3150
+ color: theme.colors.text,
3151
+ fontSize: `${theme.fontSizes[3]}px`,
3152
+ fontWeight: theme.fontWeights.semibold,
3153
+ fontFamily: theme.fonts.body
3154
+ },
3155
+ children: "Loading starred repositories..."
3156
+ }
3157
+ )
3158
+ ]
3159
+ }
3160
+ )
3161
+ }
3162
+ ) });
3163
+ }
3164
+ if (error && repositories.length === 0) {
3165
+ return /* @__PURE__ */ jsx("div", { style: baseContainerStyle, children: /* @__PURE__ */ jsx(
3166
+ "div",
3167
+ {
3168
+ style: {
3169
+ flex: 1,
3170
+ display: "flex",
3171
+ alignItems: "center",
3172
+ justifyContent: "center",
3173
+ padding: "32px",
3174
+ textAlign: "center"
3175
+ },
3176
+ children: /* @__PURE__ */ jsxs(
3177
+ "div",
3178
+ {
3179
+ style: {
3180
+ display: "flex",
3181
+ flexDirection: "column",
3182
+ alignItems: "center",
3183
+ gap: "16px",
3184
+ maxWidth: "360px"
3185
+ },
3186
+ children: [
3187
+ /* @__PURE__ */ jsx(
3188
+ CircleAlert,
3189
+ {
3190
+ size: 32,
3191
+ style: { color: theme.colors.error || "#ef4444" }
3192
+ }
3193
+ ),
3194
+ /* @__PURE__ */ jsxs("div", { children: [
3195
+ /* @__PURE__ */ jsx(
3196
+ "h3",
3197
+ {
3198
+ style: {
3199
+ margin: 0,
3200
+ marginBottom: "8px",
3201
+ color: theme.colors.text,
3202
+ fontSize: `${theme.fontSizes[3]}px`,
3203
+ fontWeight: theme.fontWeights.semibold,
3204
+ fontFamily: theme.fonts.body
3205
+ },
3206
+ children: "Unable to load repositories"
3207
+ }
3208
+ ),
3209
+ /* @__PURE__ */ jsx(
3210
+ "p",
3211
+ {
3212
+ style: {
3213
+ margin: 0,
3214
+ color: theme.colors.textSecondary,
3215
+ lineHeight: theme.lineHeights.body,
3216
+ fontFamily: theme.fonts.body
3217
+ },
3218
+ children: error
3219
+ }
3220
+ )
3221
+ ] }),
3222
+ /* @__PURE__ */ jsxs(
3223
+ "button",
3224
+ {
3225
+ type: "button",
3226
+ onClick: handleRefresh,
3227
+ style: {
3228
+ display: "inline-flex",
3229
+ alignItems: "center",
3230
+ gap: "8px",
3231
+ padding: "10px 18px",
3232
+ borderRadius: "6px",
3233
+ border: "none",
3234
+ backgroundColor: theme.colors.primary,
3235
+ color: theme.colors.background,
3236
+ fontWeight: theme.fontWeights.semibold,
3237
+ fontSize: `${theme.fontSizes[1]}px`,
3238
+ fontFamily: theme.fonts.body,
3239
+ cursor: "pointer"
3240
+ },
3241
+ children: [
3242
+ /* @__PURE__ */ jsx(RotateCcw, { size: 16 }),
3243
+ "Try again"
3244
+ ]
3245
+ }
3246
+ )
3247
+ ]
3248
+ }
3249
+ )
3250
+ }
3251
+ ) });
3252
+ }
3253
+ return /* @__PURE__ */ jsxs(
3254
+ "div",
2797
3255
  {
2798
3256
  style: {
2799
- fontSize: `${theme.fontSizes[2]}px`,
2800
- fontWeight: theme.fontWeights.semibold,
2801
- color: theme.colors.text,
2802
- marginBottom: `${theme.space[3]}px`,
2803
- display: "flex",
2804
- alignItems: "center",
2805
- gap: `${theme.space[2]}px`
3257
+ ...baseContainerStyle,
3258
+ padding: "16px",
3259
+ gap: "12px"
2806
3260
  },
2807
3261
  children: [
2808
- icon,
2809
- title
3262
+ /* @__PURE__ */ jsxs("div", { style: { position: "relative" }, children: [
3263
+ /* @__PURE__ */ jsx(
3264
+ Search,
3265
+ {
3266
+ size: 16,
3267
+ style: {
3268
+ position: "absolute",
3269
+ top: "50%",
3270
+ left: "12px",
3271
+ transform: "translateY(-50%)",
3272
+ color: theme.colors.textSecondary,
3273
+ pointerEvents: "none"
3274
+ }
3275
+ }
3276
+ ),
3277
+ /* @__PURE__ */ jsx(
3278
+ "input",
3279
+ {
3280
+ type: "text",
3281
+ value: filter,
3282
+ placeholder: "Filter starred repositories...",
3283
+ onChange: (event) => setFilter(event.target.value),
3284
+ style: {
3285
+ width: "100%",
3286
+ padding: "8px 12px 8px 36px",
3287
+ borderRadius: "6px",
3288
+ border: `1px solid ${theme.colors.border}`,
3289
+ backgroundColor: theme.colors.background,
3290
+ color: theme.colors.text,
3291
+ fontSize: `${theme.fontSizes[1]}px`,
3292
+ fontFamily: theme.fonts.body,
3293
+ outline: "none"
3294
+ }
3295
+ }
3296
+ )
3297
+ ] }),
3298
+ error && repositories.length > 0 && /* @__PURE__ */ jsxs(
3299
+ "div",
3300
+ {
3301
+ style: {
3302
+ display: "flex",
3303
+ alignItems: "center",
3304
+ gap: "8px",
3305
+ padding: "10px 14px",
3306
+ borderRadius: "6px",
3307
+ backgroundColor: `${theme.colors.error || "#ef4444"}20`,
3308
+ color: theme.colors.error || "#ef4444",
3309
+ fontSize: `${theme.fontSizes[1]}px`,
3310
+ fontFamily: theme.fonts.body
3311
+ },
3312
+ children: [
3313
+ /* @__PURE__ */ jsx(CircleAlert, { size: 16 }),
3314
+ /* @__PURE__ */ jsx("span", { children: error })
3315
+ ]
3316
+ }
3317
+ ),
3318
+ /* @__PURE__ */ jsxs(
3319
+ "div",
3320
+ {
3321
+ style: {
3322
+ flex: 1,
3323
+ overflowY: "auto",
3324
+ display: "flex",
3325
+ flexDirection: "column",
3326
+ gap: "4px"
3327
+ },
3328
+ children: [
3329
+ sortedRepositories.map((repo) => /* @__PURE__ */ jsx(
3330
+ GitHubRepositoryCard,
3331
+ {
3332
+ repository: repo,
3333
+ localRepo: localRepoMap.get(repo.full_name),
3334
+ onClone: handleClone,
3335
+ onOpen: handleOpen,
3336
+ onSelect: handleSelect,
3337
+ isSelected: (selectedRepo == null ? void 0 : selectedRepo.id) === repo.id
3338
+ },
3339
+ repo.id
3340
+ )),
3341
+ sortedRepositories.length === 0 && repositories.length > 0 && /* @__PURE__ */ jsx(
3342
+ "div",
3343
+ {
3344
+ style: {
3345
+ padding: "32px",
3346
+ textAlign: "center",
3347
+ color: theme.colors.textSecondary
3348
+ },
3349
+ children: /* @__PURE__ */ jsx("p", { style: { margin: 0 }, children: "No repositories match your filter." })
3350
+ }
3351
+ ),
3352
+ repositories.length === 0 && !loading && /* @__PURE__ */ jsxs(
3353
+ "div",
3354
+ {
3355
+ style: {
3356
+ padding: "32px",
3357
+ textAlign: "center",
3358
+ color: theme.colors.textSecondary
3359
+ },
3360
+ children: [
3361
+ /* @__PURE__ */ jsx(
3362
+ Star,
3363
+ {
3364
+ size: 32,
3365
+ style: { marginBottom: "12px", opacity: 0.5 }
3366
+ }
3367
+ ),
3368
+ /* @__PURE__ */ jsx("p", { style: { margin: 0 }, children: "You haven't starred any repositories yet." })
3369
+ ]
3370
+ }
3371
+ )
3372
+ ]
3373
+ }
3374
+ )
2810
3375
  ]
2811
3376
  }
2812
- ),
2813
- /* @__PURE__ */ jsx(
3377
+ );
3378
+ };
3379
+ const GitHubStarredPanelPreview = () => {
3380
+ const { theme } = useTheme();
3381
+ return /* @__PURE__ */ jsxs(
2814
3382
  "div",
2815
3383
  {
2816
3384
  style: {
3385
+ padding: "12px",
3386
+ fontSize: `${theme.fontSizes[0]}px`,
3387
+ fontFamily: theme.fonts.body,
3388
+ color: theme.colors.text,
2817
3389
  display: "flex",
2818
3390
  flexDirection: "column",
2819
- gap: `${theme.space[2]}px`
3391
+ gap: "8px"
2820
3392
  },
2821
- children
3393
+ children: [
3394
+ /* @__PURE__ */ jsxs(
3395
+ "div",
3396
+ {
3397
+ style: {
3398
+ display: "flex",
3399
+ alignItems: "center",
3400
+ gap: "6px",
3401
+ fontWeight: theme.fontWeights.semibold
3402
+ },
3403
+ children: [
3404
+ /* @__PURE__ */ jsx(Star, { size: 16, style: { color: "#f59e0b" } }),
3405
+ /* @__PURE__ */ jsx("span", { children: "Starred Repositories" })
3406
+ ]
3407
+ }
3408
+ ),
3409
+ /* @__PURE__ */ jsx(
3410
+ "div",
3411
+ {
3412
+ style: {
3413
+ fontSize: `${theme.fontSizes[0]}px`,
3414
+ fontFamily: theme.fonts.body,
3415
+ color: theme.colors.textSecondary,
3416
+ marginTop: "4px"
3417
+ },
3418
+ children: "Browse your starred GitHub repositories"
3419
+ }
3420
+ )
3421
+ ]
2822
3422
  }
2823
- )
2824
- ] });
2825
- const InfoItem = ({ badge, title, description, theme }) => /* @__PURE__ */ jsxs(
2826
- "div",
2827
- {
2828
- style: {
2829
- padding: `${theme.space[3]}px`,
2830
- backgroundColor: theme.colors.backgroundSecondary,
2831
- borderRadius: `${theme.radii[2]}px`,
2832
- border: `1px solid ${theme.colors.border}`
2833
- },
2834
- children: [
2835
- /* @__PURE__ */ jsxs(
2836
- "div",
2837
- {
2838
- style: {
2839
- display: "flex",
2840
- alignItems: "center",
2841
- gap: `${theme.space[2]}px`,
2842
- marginBottom: `${theme.space[1]}px`
2843
- },
2844
- children: [
2845
- /* @__PURE__ */ jsx(
2846
- "span",
2847
- {
2848
- style: {
2849
- padding: `${theme.space[1]}px ${theme.space[2]}px`,
2850
- borderRadius: `${theme.radii[1]}px`,
2851
- fontSize: `${theme.fontSizes[0]}px`,
2852
- fontWeight: theme.fontWeights.medium,
2853
- backgroundColor: `${badge.color}20`,
2854
- color: badge.color
2855
- },
2856
- children: badge.text
2857
- }
2858
- ),
2859
- /* @__PURE__ */ jsx(
2860
- "span",
2861
- {
2862
- style: {
2863
- fontSize: `${theme.fontSizes[1]}px`,
2864
- fontWeight: theme.fontWeights.medium,
2865
- color: theme.colors.text
2866
- },
2867
- children: title
2868
- }
2869
- )
2870
- ]
2871
- }
2872
- ),
2873
- /* @__PURE__ */ jsx(
2874
- "div",
2875
- {
2876
- style: {
2877
- fontSize: `${theme.fontSizes[1]}px`,
2878
- color: theme.colors.textSecondary,
2879
- lineHeight: theme.lineHeights.relaxed
2880
- },
2881
- children: description
2882
- }
2883
- )
2884
- ]
2885
- }
2886
- );
2887
- const DependencyRow = ({ dependency }) => {
3423
+ );
3424
+ };
3425
+ const PANEL_ID$5 = "industry-theme.github-projects";
3426
+ const createPanelEvent = (type, payload) => ({
3427
+ type,
3428
+ source: PANEL_ID$5,
3429
+ timestamp: Date.now(),
3430
+ payload
3431
+ });
3432
+ const GitHubProjectsPanel = (props) => {
3433
+ return /* @__PURE__ */ jsx(GitHubProjectsPanelContent, { ...props });
3434
+ };
3435
+ const GitHubProjectsPanelContent = ({
3436
+ context,
3437
+ actions,
3438
+ events
3439
+ }) => {
3440
+ var _a, _b, _c, _d, _e, _f;
2888
3441
  const { theme } = useTheme();
2889
- const [isHovered, setIsHovered] = useState(false);
2890
- const [copied, setCopied] = useState(false);
2891
- const getDependencyTypeBadgeStyle = (type) => {
2892
- const baseStyle = {
2893
- padding: `${theme.space[1]}px ${theme.space[2]}px`,
2894
- borderRadius: `${theme.radii[1]}px`,
2895
- fontSize: `${theme.fontSizes[0]}px`,
2896
- fontWeight: theme.fontWeights.medium,
2897
- minWidth: "36px",
2898
- textAlign: "center"
2899
- };
2900
- switch (type) {
2901
- case "production":
2902
- return {
2903
- ...baseStyle,
2904
- backgroundColor: `${theme.colors.primary}20`,
2905
- color: theme.colors.primary
2906
- };
2907
- case "development":
2908
- return {
2909
- ...baseStyle,
2910
- backgroundColor: `${theme.colors.secondary}20`,
2911
- color: theme.colors.secondary
2912
- };
2913
- case "peer":
2914
- return {
2915
- ...baseStyle,
2916
- backgroundColor: `${theme.colors.accent}20`,
2917
- color: theme.colors.accent
2918
- };
2919
- default:
2920
- return {
2921
- ...baseStyle,
2922
- backgroundColor: theme.colors.backgroundLight,
2923
- color: theme.colors.textSecondary
2924
- };
3442
+ const [filter, setFilter] = useState("");
3443
+ const [collapsedSections, setCollapsedSections] = useState(/* @__PURE__ */ new Set());
3444
+ const [selectedRepo, setSelectedRepo] = useState(null);
3445
+ const projectsSlice = context.getSlice("githubProjects");
3446
+ const localReposSlice = context.getSlice("alexandriaRepositories");
3447
+ const userRepositories = useMemo(
3448
+ () => {
3449
+ var _a2;
3450
+ return ((_a2 = projectsSlice == null ? void 0 : projectsSlice.data) == null ? void 0 : _a2.userRepositories) || [];
3451
+ },
3452
+ [(_a = projectsSlice == null ? void 0 : projectsSlice.data) == null ? void 0 : _a.userRepositories]
3453
+ );
3454
+ const organizations = useMemo(
3455
+ () => {
3456
+ var _a2;
3457
+ return ((_a2 = projectsSlice == null ? void 0 : projectsSlice.data) == null ? void 0 : _a2.organizations) || [];
3458
+ },
3459
+ [(_b = projectsSlice == null ? void 0 : projectsSlice.data) == null ? void 0 : _b.organizations]
3460
+ );
3461
+ const orgRepositories = useMemo(
3462
+ () => {
3463
+ var _a2;
3464
+ return ((_a2 = projectsSlice == null ? void 0 : projectsSlice.data) == null ? void 0 : _a2.orgRepositories) || {};
3465
+ },
3466
+ [(_c = projectsSlice == null ? void 0 : projectsSlice.data) == null ? void 0 : _c.orgRepositories]
3467
+ );
3468
+ const currentUser = (_d = projectsSlice == null ? void 0 : projectsSlice.data) == null ? void 0 : _d.currentUser;
3469
+ const loading = (projectsSlice == null ? void 0 : projectsSlice.loading) ?? false;
3470
+ const error = (_e = projectsSlice == null ? void 0 : projectsSlice.data) == null ? void 0 : _e.error;
3471
+ const localRepos = useMemo(
3472
+ () => {
3473
+ var _a2;
3474
+ return ((_a2 = localReposSlice == null ? void 0 : localReposSlice.data) == null ? void 0 : _a2.repositories) || [];
3475
+ },
3476
+ [(_f = localReposSlice == null ? void 0 : localReposSlice.data) == null ? void 0 : _f.repositories]
3477
+ );
3478
+ const panelActions = actions;
3479
+ const localRepoMap = useMemo(() => {
3480
+ const map = /* @__PURE__ */ new Map();
3481
+ localRepos.forEach((entry) => {
3482
+ var _a2, _b2, _c2;
3483
+ if ((_a2 = entry.github) == null ? void 0 : _a2.id) {
3484
+ map.set(entry.github.id, {
3485
+ path: entry.path,
3486
+ name: entry.name,
3487
+ githubFullName: entry.github.id,
3488
+ githubId: entry.github.id
3489
+ });
3490
+ }
3491
+ if (((_b2 = entry.github) == null ? void 0 : _b2.owner) && ((_c2 = entry.github) == null ? void 0 : _c2.name)) {
3492
+ const fullName = `${entry.github.owner}/${entry.github.name}`;
3493
+ map.set(fullName, {
3494
+ path: entry.path,
3495
+ name: entry.name,
3496
+ githubFullName: fullName
3497
+ });
3498
+ }
3499
+ map.set(entry.name, {
3500
+ path: entry.path,
3501
+ name: entry.name
3502
+ });
3503
+ });
3504
+ return map;
3505
+ }, [localRepos]);
3506
+ const normalizedFilter = filter.trim().toLowerCase();
3507
+ const filterRepos = useCallback(
3508
+ (repos) => {
3509
+ if (!normalizedFilter) return repos;
3510
+ return repos.filter((repo) => {
3511
+ var _a2;
3512
+ const haystack = [
3513
+ repo.name,
3514
+ repo.full_name,
3515
+ ((_a2 = repo.owner) == null ? void 0 : _a2.login) ?? "",
3516
+ repo.description ?? "",
3517
+ repo.language ?? ""
3518
+ ].join(" ").toLowerCase();
3519
+ return haystack.includes(normalizedFilter);
3520
+ });
3521
+ },
3522
+ [normalizedFilter]
3523
+ );
3524
+ const filteredUserRepos = useMemo(
3525
+ () => filterRepos(userRepositories),
3526
+ [filterRepos, userRepositories]
3527
+ );
3528
+ const filteredOrgRepos = useMemo(() => {
3529
+ const result = {};
3530
+ for (const [orgLogin, repos] of Object.entries(orgRepositories)) {
3531
+ const filtered = filterRepos(repos);
3532
+ if (filtered.length > 0) {
3533
+ result[orgLogin] = filtered;
3534
+ }
2925
3535
  }
2926
- };
2927
- const handleCopy = async (e) => {
2928
- e.preventDefault();
2929
- e.stopPropagation();
2930
- try {
2931
- const copyText = `${dependency.name}@${dependency.version}`;
2932
- await navigator.clipboard.writeText(copyText);
2933
- setCopied(true);
2934
- setTimeout(() => setCopied(false), 2e3);
2935
- } catch (err) {
2936
- console.error("Failed to copy:", err);
3536
+ return result;
3537
+ }, [filterRepos, orgRepositories]);
3538
+ const allRepositories = useMemo(() => {
3539
+ const all = [...userRepositories];
3540
+ for (const repos of Object.values(orgRepositories)) {
3541
+ all.push(...repos);
2937
3542
  }
2938
- };
2939
- const actionButtonStyle = {
2940
- padding: `${theme.space[1]}px`,
2941
- borderRadius: `${theme.radii[1]}px`,
3543
+ return all;
3544
+ }, [userRepositories, orgRepositories]);
3545
+ const hasData = userRepositories.length > 0 || organizations.length > 0 || Object.keys(orgRepositories).length > 0;
3546
+ const handleClone = useCallback(
3547
+ async (repo) => {
3548
+ if (panelActions.cloneRepository) {
3549
+ await panelActions.cloneRepository(repo);
3550
+ events.emit(
3551
+ createPanelEvent(`${PANEL_ID$5}:repository-cloned`, {
3552
+ repository: repo
3553
+ })
3554
+ );
3555
+ }
3556
+ },
3557
+ [panelActions, events]
3558
+ );
3559
+ const handleOpen = useCallback(
3560
+ async (localPath) => {
3561
+ if (panelActions.openRepository) {
3562
+ await panelActions.openRepository(localPath);
3563
+ }
3564
+ },
3565
+ [panelActions]
3566
+ );
3567
+ const handleSelect = useCallback(
3568
+ (repo) => {
3569
+ setSelectedRepo(repo);
3570
+ events.emit(
3571
+ createPanelEvent(`${PANEL_ID$5}:repository-selected`, { repository: repo })
3572
+ );
3573
+ },
3574
+ [events]
3575
+ );
3576
+ const handleRefresh = useCallback(async () => {
3577
+ if (panelActions.refreshProjects) {
3578
+ await panelActions.refreshProjects();
3579
+ }
3580
+ }, [panelActions]);
3581
+ const toggleSection = useCallback((owner) => {
3582
+ setCollapsedSections((prev) => {
3583
+ const next = new Set(prev);
3584
+ if (next.has(owner)) {
3585
+ next.delete(owner);
3586
+ } else {
3587
+ next.add(owner);
3588
+ }
3589
+ return next;
3590
+ });
3591
+ }, []);
3592
+ useEffect(() => {
3593
+ const unsubscribers = [
3594
+ events.on(`${PANEL_ID$5}:filter`, (event) => {
3595
+ var _a2;
3596
+ setFilter(((_a2 = event.payload) == null ? void 0 : _a2.filter) || "");
3597
+ }),
3598
+ events.on(`${PANEL_ID$5}:toggle-section`, (event) => {
3599
+ var _a2;
3600
+ const owner = (_a2 = event.payload) == null ? void 0 : _a2.owner;
3601
+ if (owner) {
3602
+ toggleSection(owner);
3603
+ }
3604
+ }),
3605
+ events.on(`${PANEL_ID$5}:select-repository`, (event) => {
3606
+ var _a2;
3607
+ const identifier = (_a2 = event.payload) == null ? void 0 : _a2.identifier;
3608
+ if (identifier) {
3609
+ const repo = allRepositories.find(
3610
+ (r) => r.name === identifier || r.full_name === identifier || r.full_name.toLowerCase() === identifier.toLowerCase()
3611
+ );
3612
+ if (repo) {
3613
+ handleSelect(repo);
3614
+ }
3615
+ }
3616
+ }),
3617
+ events.on(`${PANEL_ID$5}:clone-repository`, (event) => {
3618
+ var _a2;
3619
+ const identifier = (_a2 = event.payload) == null ? void 0 : _a2.identifier;
3620
+ if (identifier) {
3621
+ const repo = allRepositories.find(
3622
+ (r) => r.name === identifier || r.full_name === identifier || r.full_name.toLowerCase() === identifier.toLowerCase()
3623
+ );
3624
+ if (repo) {
3625
+ void handleClone(repo);
3626
+ }
3627
+ }
3628
+ })
3629
+ ];
3630
+ return () => {
3631
+ unsubscribers.forEach((unsub) => unsub());
3632
+ };
3633
+ }, [events, allRepositories, toggleSection, handleSelect, handleClone]);
3634
+ const baseContainerStyle = {
2942
3635
  display: "flex",
2943
- alignItems: "center",
2944
- justifyContent: "center",
2945
- border: "none",
2946
- backgroundColor: "transparent",
2947
- cursor: "pointer",
2948
- transition: "all 0.15s ease",
2949
- opacity: isHovered ? 1 : 0,
2950
- pointerEvents: isHovered ? "auto" : "none"
3636
+ flexDirection: "column",
3637
+ height: "100%",
3638
+ backgroundColor: theme.colors.backgroundSecondary
2951
3639
  };
2952
- return /* @__PURE__ */ jsxs(
2953
- "div",
2954
- {
2955
- style: {
2956
- display: "flex",
2957
- alignItems: "center",
2958
- justifyContent: "space-between",
2959
- padding: `${theme.space[2]}px ${theme.space[3]}px`,
2960
- backgroundColor: theme.colors.background,
2961
- borderRadius: `${theme.radii[1]}px`,
2962
- fontSize: `${theme.fontSizes[1]}px`,
2963
- border: `1px solid ${theme.colors.border}`,
2964
- transition: "all 0.2s"
2965
- },
2966
- onMouseEnter: () => setIsHovered(true),
2967
- onMouseLeave: () => setIsHovered(false),
2968
- children: [
2969
- /* @__PURE__ */ jsxs(
3640
+ if (loading && !hasData) {
3641
+ return /* @__PURE__ */ jsx("div", { style: baseContainerStyle, children: /* @__PURE__ */ jsx(
3642
+ "div",
3643
+ {
3644
+ style: {
3645
+ flex: 1,
3646
+ display: "flex",
3647
+ alignItems: "center",
3648
+ justifyContent: "center",
3649
+ padding: "32px",
3650
+ textAlign: "center"
3651
+ },
3652
+ children: /* @__PURE__ */ jsxs(
2970
3653
  "div",
2971
3654
  {
2972
3655
  style: {
2973
3656
  display: "flex",
3657
+ flexDirection: "column",
2974
3658
  alignItems: "center",
2975
- gap: `${theme.space[2]}px`,
2976
- flex: 1,
2977
- minWidth: 0
3659
+ gap: "16px"
2978
3660
  },
2979
3661
  children: [
2980
- /* @__PURE__ */ jsx("span", { style: getDependencyTypeBadgeStyle(dependency.dependencyType), children: dependency.dependencyType === "production" ? "prod" : dependency.dependencyType === "development" ? "dev" : "peer" }),
2981
3662
  /* @__PURE__ */ jsx(
2982
- "span",
3663
+ LoaderCircle,
2983
3664
  {
2984
- style: {
2985
- fontWeight: theme.fontWeights.medium,
2986
- color: theme.colors.text,
2987
- overflow: "hidden",
2988
- textOverflow: "ellipsis",
2989
- whiteSpace: "nowrap"
2990
- },
2991
- children: dependency.name
3665
+ size: 32,
3666
+ style: { color: theme.colors.textSecondary },
3667
+ className: "animate-spin"
2992
3668
  }
2993
3669
  ),
2994
3670
  /* @__PURE__ */ jsx(
2995
- "a",
3671
+ "h3",
2996
3672
  {
2997
- href: `https://www.npmjs.com/package/${dependency.name}`,
2998
- target: "_blank",
2999
- rel: "noopener noreferrer",
3000
3673
  style: {
3001
- ...actionButtonStyle,
3002
- color: theme.colors.textSecondary,
3003
- textDecoration: "none",
3004
- flexShrink: 0
3674
+ margin: 0,
3675
+ color: theme.colors.text,
3676
+ fontSize: `${theme.fontSizes[3]}px`,
3677
+ fontWeight: theme.fontWeights.semibold,
3678
+ fontFamily: theme.fonts.body
3005
3679
  },
3006
- title: "View on npm",
3007
- children: /* @__PURE__ */ jsx(ExternalLink, { size: 12 })
3680
+ children: "Loading your repositories..."
3008
3681
  }
3009
3682
  )
3010
3683
  ]
3011
3684
  }
3012
- ),
3013
- /* @__PURE__ */ jsxs(
3685
+ )
3686
+ }
3687
+ ) });
3688
+ }
3689
+ if (error && !hasData) {
3690
+ return /* @__PURE__ */ jsx("div", { style: baseContainerStyle, children: /* @__PURE__ */ jsx(
3691
+ "div",
3692
+ {
3693
+ style: {
3694
+ flex: 1,
3695
+ display: "flex",
3696
+ alignItems: "center",
3697
+ justifyContent: "center",
3698
+ padding: "32px",
3699
+ textAlign: "center"
3700
+ },
3701
+ children: /* @__PURE__ */ jsxs(
3014
3702
  "div",
3015
3703
  {
3016
3704
  style: {
3017
3705
  display: "flex",
3706
+ flexDirection: "column",
3018
3707
  alignItems: "center",
3019
- gap: "4px"
3708
+ gap: "16px",
3709
+ maxWidth: "360px"
3020
3710
  },
3021
3711
  children: [
3022
3712
  /* @__PURE__ */ jsx(
3023
- "button",
3713
+ CircleAlert,
3024
3714
  {
3025
- type: "button",
3026
- onClick: handleCopy,
3027
- style: {
3028
- ...actionButtonStyle,
3029
- color: copied ? theme.colors.success || "#10b981" : theme.colors.textSecondary
3030
- },
3031
- title: copied ? "Copied!" : `Copy ${dependency.name}@${dependency.version}`,
3032
- children: copied ? /* @__PURE__ */ jsx(Check, { size: 12 }) : /* @__PURE__ */ jsx(Copy, { size: 12 })
3715
+ size: 32,
3716
+ style: { color: theme.colors.error || "#ef4444" }
3033
3717
  }
3034
3718
  ),
3035
- /* @__PURE__ */ jsx("span", { style: { color: theme.colors.textSecondary }, children: dependency.version })
3036
- ]
3037
- }
3038
- )
3039
- ]
3040
- }
3041
- );
3042
- };
3043
- const FilterBar = ({
3044
- activeFilters,
3045
- onToggleFilter,
3046
- searchQuery,
3047
- onSearchChange,
3048
- counts
3049
- }) => {
3050
- const { theme } = useTheme();
3051
- const availableFilters = [
3052
- ...counts.peer > 0 ? ["peer"] : [],
3053
- ...counts.production > 0 ? ["production"] : [],
3054
- ...counts.development > 0 ? ["development"] : []
3055
- ];
3056
- const showFilters = availableFilters.length > 1;
3057
- return /* @__PURE__ */ jsxs(
3058
- "div",
3059
- {
3060
- style: {
3061
- display: "flex",
3062
- flexDirection: "column",
3063
- gap: `${theme.space[2]}px`
3064
- },
3065
- children: [
3066
- /* @__PURE__ */ jsxs(
3067
- "div",
3068
- {
3069
- style: {
3070
- position: "relative",
3071
- display: "flex",
3072
- alignItems: "center"
3073
- },
3074
- children: [
3075
- /* @__PURE__ */ jsx(
3076
- Search,
3077
- {
3078
- size: 14,
3079
- style: {
3080
- position: "absolute",
3081
- left: `${theme.space[3]}px`,
3082
- color: theme.colors.textSecondary,
3083
- pointerEvents: "none"
3719
+ /* @__PURE__ */ jsxs("div", { children: [
3720
+ /* @__PURE__ */ jsx(
3721
+ "h3",
3722
+ {
3723
+ style: {
3724
+ margin: 0,
3725
+ marginBottom: "8px",
3726
+ color: theme.colors.text,
3727
+ fontSize: `${theme.fontSizes[3]}px`,
3728
+ fontWeight: theme.fontWeights.semibold,
3729
+ fontFamily: theme.fonts.body
3730
+ },
3731
+ children: "Unable to load repositories"
3084
3732
  }
3085
- }
3086
- ),
3087
- /* @__PURE__ */ jsx(
3088
- "input",
3089
- {
3090
- type: "text",
3091
- placeholder: "Search dependencies...",
3092
- value: searchQuery,
3093
- onChange: (e) => onSearchChange(e.target.value),
3094
- style: {
3095
- width: "100%",
3096
- padding: `${theme.space[2]}px ${theme.space[5]}px`,
3097
- borderRadius: `${theme.radii[2]}px`,
3098
- border: `1px solid ${theme.colors.border}`,
3099
- backgroundColor: theme.colors.backgroundSecondary,
3100
- color: theme.colors.text,
3101
- fontSize: `${theme.fontSizes[1]}px`,
3102
- fontFamily: theme.fonts.body,
3103
- outline: "none",
3104
- transition: "all 0.2s"
3733
+ ),
3734
+ /* @__PURE__ */ jsx(
3735
+ "p",
3736
+ {
3737
+ style: {
3738
+ margin: 0,
3739
+ color: theme.colors.textSecondary,
3740
+ lineHeight: theme.lineHeights.body,
3741
+ fontFamily: theme.fonts.body
3742
+ },
3743
+ children: error
3105
3744
  }
3106
- }
3107
- ),
3108
- searchQuery && /* @__PURE__ */ jsx(
3745
+ )
3746
+ ] }),
3747
+ /* @__PURE__ */ jsxs(
3109
3748
  "button",
3110
3749
  {
3111
- onClick: () => onSearchChange(""),
3750
+ type: "button",
3751
+ onClick: handleRefresh,
3112
3752
  style: {
3113
- position: "absolute",
3114
- right: `${theme.space[2]}px`,
3115
- padding: `${theme.space[1]}px`,
3116
- display: "flex",
3753
+ display: "inline-flex",
3117
3754
  alignItems: "center",
3118
- justifyContent: "center",
3119
- backgroundColor: "transparent",
3755
+ gap: "8px",
3756
+ padding: "10px 18px",
3757
+ borderRadius: "6px",
3120
3758
  border: "none",
3121
- cursor: "pointer",
3122
- borderRadius: `${theme.radii[1]}px`
3759
+ backgroundColor: theme.colors.primary,
3760
+ color: theme.colors.background,
3761
+ fontWeight: theme.fontWeights.semibold,
3762
+ fontSize: `${theme.fontSizes[1]}px`,
3763
+ fontFamily: theme.fonts.body,
3764
+ cursor: "pointer"
3123
3765
  },
3124
- title: "Clear search",
3125
- children: /* @__PURE__ */ jsx(X, { size: 14, color: theme.colors.textSecondary })
3766
+ children: [
3767
+ /* @__PURE__ */ jsx(RotateCcw, { size: 16 }),
3768
+ "Try again"
3769
+ ]
3126
3770
  }
3127
3771
  )
3128
3772
  ]
3129
3773
  }
3130
- ),
3131
- showFilters && /* @__PURE__ */ jsx("div", { style: { display: "flex", gap: `${theme.space[1]}px`, width: "100%" }, children: availableFilters.map((type) => {
3132
- const isActive = activeFilters.has(type);
3133
- return /* @__PURE__ */ jsxs(
3134
- "button",
3135
- {
3136
- onClick: () => onToggleFilter(type),
3137
- style: {
3138
- flex: 1,
3139
- padding: `${theme.space[1]}px ${theme.space[2]}px`,
3140
- fontSize: `${theme.fontSizes[0]}px`,
3141
- fontWeight: theme.fontWeights.medium,
3142
- fontFamily: theme.fonts.body,
3143
- borderRadius: `${theme.radii[1]}px`,
3144
- border: `1px solid ${isActive ? theme.colors.primary : theme.colors.border}`,
3145
- backgroundColor: isActive ? `${theme.colors.primary}20` : theme.colors.backgroundSecondary,
3146
- color: isActive ? theme.colors.primary : theme.colors.text,
3147
- cursor: "pointer",
3148
- transition: "all 0.2s"
3149
- },
3150
- children: [
3151
- type === "production" ? "Prod" : type === "development" ? "Dev" : "Peer",
3152
- /* @__PURE__ */ jsxs(
3153
- "span",
3154
- {
3155
- style: { marginLeft: `${theme.space[1]}px`, opacity: 0.7 },
3156
- children: [
3157
- "(",
3158
- counts[type],
3159
- ")"
3160
- ]
3161
- }
3162
- )
3163
- ]
3164
- },
3165
- type
3166
- );
3167
- }) })
3168
- ]
3169
- }
3170
- );
3171
- };
3172
- const dependencyTypeOrder = {
3173
- peer: 0,
3174
- production: 1,
3175
- development: 2
3176
- };
3177
- function extractDependencies(packageLayer) {
3178
- const { dependencies, devDependencies, peerDependencies } = packageLayer.packageData;
3179
- const items = [];
3180
- if (dependencies) {
3181
- Object.entries(dependencies).forEach(([name, version]) => {
3182
- items.push({ name, version, dependencyType: "production" });
3183
- });
3184
- }
3185
- if (devDependencies) {
3186
- Object.entries(devDependencies).forEach(([name, version]) => {
3187
- items.push({ name, version, dependencyType: "development" });
3188
- });
3189
- }
3190
- if (peerDependencies) {
3191
- Object.entries(peerDependencies).forEach(([name, version]) => {
3192
- items.push({ name, version, dependencyType: "peer" });
3193
- });
3194
- }
3195
- return items.sort((a, b) => {
3196
- const typeCompare = dependencyTypeOrder[a.dependencyType] - dependencyTypeOrder[b.dependencyType];
3197
- if (typeCompare !== 0) return typeCompare;
3198
- return a.name.localeCompare(b.name);
3199
- });
3200
- }
3201
- const DependenciesPanelContent = ({
3202
- context
3203
- }) => {
3204
- var _a;
3205
- const { theme } = useTheme();
3206
- const [selectedPackagePath, setSelectedPackagePath] = useState(
3207
- null
3208
- );
3209
- const [activeFilters, setActiveFilters] = useState(/* @__PURE__ */ new Set());
3210
- const [searchQuery, setSearchQuery] = useState("");
3211
- const [showInfoModal, setShowInfoModal] = useState(false);
3212
- const packagesSlice = context.getSlice("packages");
3213
- const isLoading = context.isSliceLoading("packages");
3214
- const hasPackages = context.hasSlice("packages");
3215
- const packages = useMemo(() => {
3216
- var _a2;
3217
- return ((_a2 = packagesSlice == null ? void 0 : packagesSlice.data) == null ? void 0 : _a2.packages) ?? [];
3218
- }, [(_a = packagesSlice == null ? void 0 : packagesSlice.data) == null ? void 0 : _a.packages]);
3219
- const effectiveSelectedPath = useMemo(() => {
3220
- if (selectedPackagePath !== null) return selectedPackagePath;
3221
- if (packages.length === 1) return packages[0].packageData.path;
3222
- const rootPackage = packages.find((p) => p.packageData.path === "");
3223
- if (rootPackage) return "";
3224
- return null;
3225
- }, [selectedPackagePath, packages]);
3226
- const selectedPackage = useMemo(() => {
3227
- if (effectiveSelectedPath === null) return null;
3228
- return packages.find((p) => p.packageData.path === effectiveSelectedPath);
3229
- }, [effectiveSelectedPath, packages]);
3230
- const dependencyItems = useMemo(() => {
3231
- if (!selectedPackage) return [];
3232
- return extractDependencies(selectedPackage);
3233
- }, [selectedPackage]);
3234
- const counts = useMemo(() => {
3235
- return {
3236
- all: dependencyItems.length,
3237
- production: dependencyItems.filter((d) => d.dependencyType === "production").length,
3238
- development: dependencyItems.filter(
3239
- (d) => d.dependencyType === "development"
3240
- ).length,
3241
- peer: dependencyItems.filter((d) => d.dependencyType === "peer").length
3242
- };
3243
- }, [dependencyItems]);
3244
- const handleToggleFilter = (type) => {
3245
- setActiveFilters((prev) => {
3246
- const next = new Set(prev);
3247
- if (next.has(type)) {
3248
- next.delete(type);
3249
- } else {
3250
- next.add(type);
3251
- }
3252
- return next;
3253
- });
3254
- };
3255
- const filteredDependencies = useMemo(() => {
3256
- let filtered = [...dependencyItems];
3257
- if (searchQuery.trim()) {
3258
- const query = searchQuery.toLowerCase();
3259
- filtered = filtered.filter(
3260
- (dep) => dep.name.toLowerCase().includes(query)
3261
- );
3262
- }
3263
- const allTypes = ["production", "development", "peer"];
3264
- const availableTypes = allTypes.filter((t) => counts[t] > 0);
3265
- const isAllSelected = activeFilters.size === 0 || availableTypes.every((t) => activeFilters.has(t));
3266
- if (!isAllSelected && activeFilters.size > 0) {
3267
- filtered = filtered.filter((dep) => activeFilters.has(dep.dependencyType));
3268
- }
3269
- return filtered;
3270
- }, [dependencyItems, searchQuery, activeFilters, counts]);
3271
- if (isLoading) {
3272
- return /* @__PURE__ */ jsx(
3273
- "div",
3274
- {
3275
- style: {
3276
- padding: `${theme.space[3]}px`,
3277
- height: "100%",
3278
- display: "flex",
3279
- alignItems: "center",
3280
- justifyContent: "center",
3281
- color: theme.colors.textSecondary,
3282
- backgroundColor: theme.colors.background,
3283
- fontFamily: theme.fonts.body
3284
- },
3285
- children: "Loading packages..."
3774
+ )
3286
3775
  }
3287
- );
3776
+ ) });
3288
3777
  }
3289
- if (!hasPackages || packages.length === 0) {
3778
+ const renderSectionHeader = (owner, repoCount, icon, isOrg = false) => {
3779
+ const isCollapsed = collapsedSections.has(owner);
3290
3780
  return /* @__PURE__ */ jsxs(
3291
- "div",
3781
+ "button",
3292
3782
  {
3783
+ type: "button",
3784
+ onClick: () => toggleSection(owner),
3293
3785
  style: {
3294
- padding: `${theme.space[3]}px`,
3295
- height: "100%",
3786
+ width: "100%",
3296
3787
  display: "flex",
3297
- flexDirection: "column",
3298
3788
  alignItems: "center",
3299
- justifyContent: "center",
3300
- gap: `${theme.space[2]}px`,
3301
- color: theme.colors.textSecondary,
3789
+ justifyContent: "space-between",
3790
+ padding: "10px 12px",
3302
3791
  backgroundColor: theme.colors.background,
3303
- fontFamily: theme.fonts.body
3792
+ border: "none",
3793
+ borderRadius: "6px",
3794
+ cursor: "pointer",
3795
+ textAlign: "left",
3796
+ marginBottom: isCollapsed ? "0" : "8px"
3797
+ },
3798
+ onMouseEnter: (e) => {
3799
+ e.currentTarget.style.backgroundColor = theme.colors.backgroundTertiary;
3800
+ },
3801
+ onMouseLeave: (e) => {
3802
+ e.currentTarget.style.backgroundColor = theme.colors.background;
3304
3803
  },
3305
3804
  children: [
3306
- /* @__PURE__ */ jsx(Package, { size: 32 }),
3307
- /* @__PURE__ */ jsx("p", { style: { margin: 0 }, children: "No package data available" })
3805
+ /* @__PURE__ */ jsxs("div", { style: { display: "flex", alignItems: "center", gap: "8px" }, children: [
3806
+ isCollapsed ? /* @__PURE__ */ jsx(ChevronRight, { size: 16, color: theme.colors.textSecondary }) : /* @__PURE__ */ jsx(ChevronDown, { size: 16, color: theme.colors.textSecondary }),
3807
+ icon,
3808
+ /* @__PURE__ */ jsx(
3809
+ "span",
3810
+ {
3811
+ style: {
3812
+ fontSize: `${theme.fontSizes[2]}px`,
3813
+ fontWeight: theme.fontWeights.semibold,
3814
+ fontFamily: theme.fonts.body,
3815
+ color: theme.colors.text
3816
+ },
3817
+ children: owner
3818
+ }
3819
+ ),
3820
+ isOrg && /* @__PURE__ */ jsx(
3821
+ "span",
3822
+ {
3823
+ style: {
3824
+ fontSize: `${theme.fontSizes[0]}px`,
3825
+ fontFamily: theme.fonts.body,
3826
+ color: theme.colors.textSecondary,
3827
+ backgroundColor: theme.colors.backgroundSecondary,
3828
+ padding: "2px 6px",
3829
+ borderRadius: "3px"
3830
+ },
3831
+ children: "org"
3832
+ }
3833
+ )
3834
+ ] }),
3835
+ /* @__PURE__ */ jsxs(
3836
+ "span",
3837
+ {
3838
+ style: {
3839
+ fontSize: `${theme.fontSizes[0]}px`,
3840
+ fontFamily: theme.fonts.body,
3841
+ color: theme.colors.textSecondary
3842
+ },
3843
+ children: [
3844
+ repoCount,
3845
+ " ",
3846
+ repoCount === 1 ? "repo" : "repos"
3847
+ ]
3848
+ }
3849
+ )
3308
3850
  ]
3309
3851
  }
3310
3852
  );
3311
- }
3853
+ };
3312
3854
  return /* @__PURE__ */ jsxs(
3313
3855
  "div",
3314
3856
  {
3315
3857
  style: {
3316
- height: "100%",
3317
- display: "flex",
3318
- flexDirection: "column",
3319
- backgroundColor: theme.colors.background,
3320
- color: theme.colors.text,
3321
- fontFamily: theme.fonts.body,
3322
- overflow: "hidden"
3858
+ ...baseContainerStyle,
3859
+ padding: "16px",
3860
+ gap: "12px"
3323
3861
  },
3324
3862
  children: [
3325
- /* @__PURE__ */ jsxs(
3863
+ /* @__PURE__ */ jsxs("div", { style: { position: "relative" }, children: [
3864
+ /* @__PURE__ */ jsx(
3865
+ Search,
3866
+ {
3867
+ size: 16,
3868
+ style: {
3869
+ position: "absolute",
3870
+ top: "50%",
3871
+ left: "12px",
3872
+ transform: "translateY(-50%)",
3873
+ color: theme.colors.textSecondary,
3874
+ pointerEvents: "none"
3875
+ }
3876
+ }
3877
+ ),
3878
+ /* @__PURE__ */ jsx(
3879
+ "input",
3880
+ {
3881
+ type: "text",
3882
+ value: filter,
3883
+ placeholder: "Filter repositories...",
3884
+ onChange: (event) => setFilter(event.target.value),
3885
+ style: {
3886
+ width: "100%",
3887
+ padding: "8px 12px 8px 36px",
3888
+ borderRadius: "6px",
3889
+ border: `1px solid ${theme.colors.border}`,
3890
+ backgroundColor: theme.colors.background,
3891
+ color: theme.colors.text,
3892
+ fontSize: `${theme.fontSizes[1]}px`,
3893
+ fontFamily: theme.fonts.body,
3894
+ outline: "none"
3895
+ }
3896
+ }
3897
+ )
3898
+ ] }),
3899
+ error && hasData && /* @__PURE__ */ jsxs(
3326
3900
  "div",
3327
3901
  {
3328
3902
  style: {
3329
- flexShrink: 0,
3330
- padding: `${theme.space[3]}px`,
3331
- paddingBottom: `${theme.space[2]}px`,
3332
3903
  display: "flex",
3333
- flexDirection: "column",
3334
- gap: `${theme.space[2]}px`,
3335
- borderBottom: `1px solid ${theme.colors.border}`
3904
+ alignItems: "center",
3905
+ gap: "8px",
3906
+ padding: "10px 14px",
3907
+ borderRadius: "6px",
3908
+ backgroundColor: `${theme.colors.error || "#ef4444"}20`,
3909
+ color: theme.colors.error || "#ef4444",
3910
+ fontSize: `${theme.fontSizes[1]}px`,
3911
+ fontFamily: theme.fonts.body
3336
3912
  },
3337
3913
  children: [
3338
- /* @__PURE__ */ jsxs(
3339
- "div",
3340
- {
3341
- style: {
3342
- display: "flex",
3343
- alignItems: "center",
3344
- justifyContent: "space-between"
3345
- },
3346
- children: [
3347
- /* @__PURE__ */ jsx(
3348
- "h3",
3349
- {
3350
- style: {
3351
- fontSize: `${theme.fontSizes[2]}px`,
3352
- fontWeight: theme.fontWeights.semibold,
3353
- color: theme.colors.text,
3354
- display: "flex",
3355
- alignItems: "center",
3356
- gap: `${theme.space[2]}px`,
3357
- margin: 0
3358
- },
3359
- children: packages.length > 1 ? /* @__PURE__ */ jsxs(Fragment, { children: [
3360
- /* @__PURE__ */ jsx(Boxes, { size: 16 }),
3361
- "Monorepo Dependencies",
3362
- /* @__PURE__ */ jsxs(
3363
- "span",
3364
- {
3365
- style: {
3366
- fontSize: `${theme.fontSizes[0]}px`,
3367
- fontWeight: theme.fontWeights.body,
3368
- color: theme.colors.textSecondary
3369
- },
3370
- children: [
3371
- "(",
3372
- packages.length,
3373
- ")"
3374
- ]
3375
- }
3376
- )
3377
- ] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
3378
- /* @__PURE__ */ jsx(Package, { size: 16 }),
3379
- "Dependencies"
3380
- ] })
3381
- }
3382
- ),
3383
- /* @__PURE__ */ jsxs(
3384
- "button",
3385
- {
3386
- onClick: () => setShowInfoModal(true),
3387
- style: {
3388
- padding: `${theme.space[1]}px ${theme.space[2]}px`,
3389
- fontSize: `${theme.fontSizes[0]}px`,
3390
- fontWeight: theme.fontWeights.medium,
3391
- fontFamily: theme.fonts.body,
3392
- borderRadius: `${theme.radii[1]}px`,
3393
- border: `1px solid ${theme.colors.border}`,
3394
- backgroundColor: theme.colors.backgroundSecondary,
3395
- color: theme.colors.primary,
3396
- cursor: "pointer",
3397
- display: "flex",
3398
- alignItems: "center",
3399
- gap: `${theme.space[1]}px`,
3400
- transition: "all 0.2s"
3401
- },
3402
- children: [
3403
- /* @__PURE__ */ jsx(CircleQuestionMark, { size: 12 }),
3404
- "Learn More"
3405
- ]
3406
- }
3407
- )
3408
- ]
3409
- }
3410
- ),
3411
- packages.length > 1 && /* @__PURE__ */ jsx(
3412
- "select",
3413
- {
3414
- value: effectiveSelectedPath ?? "__none__",
3415
- onChange: (e) => setSelectedPackagePath(e.target.value === "__none__" ? null : e.target.value),
3416
- style: {
3417
- width: "100%",
3418
- padding: `${theme.space[2]}px`,
3419
- borderRadius: `${theme.radii[1]}px`,
3420
- border: `1px solid ${theme.colors.border}`,
3421
- backgroundColor: theme.colors.backgroundSecondary,
3422
- color: theme.colors.text,
3423
- fontSize: `${theme.fontSizes[1]}px`,
3424
- fontFamily: theme.fonts.body,
3425
- cursor: "pointer"
3426
- },
3427
- children: packages.map((pkg) => /* @__PURE__ */ jsxs("option", { value: pkg.packageData.path, children: [
3428
- pkg.packageData.name,
3429
- " (",
3430
- pkg.packageData.path || "root",
3431
- ")"
3432
- ] }, pkg.packageData.path || "__root__"))
3433
- }
3434
- ),
3435
- packages.length === 1 && selectedPackage && /* @__PURE__ */ jsxs(
3436
- "div",
3437
- {
3438
- style: {
3439
- fontSize: `${theme.fontSizes[0]}px`,
3440
- color: theme.colors.textSecondary
3441
- },
3442
- children: [
3443
- selectedPackage.packageData.name,
3444
- " • ",
3445
- dependencyItems.length,
3446
- " dependencies"
3447
- ]
3448
- }
3449
- ),
3450
- selectedPackage && dependencyItems.length > 0 && /* @__PURE__ */ jsx(
3451
- FilterBar,
3452
- {
3453
- activeFilters,
3454
- onToggleFilter: handleToggleFilter,
3455
- searchQuery,
3456
- onSearchChange: setSearchQuery,
3457
- counts
3458
- }
3459
- )
3914
+ /* @__PURE__ */ jsx(CircleAlert, { size: 16 }),
3915
+ /* @__PURE__ */ jsx("span", { children: error })
3460
3916
  ]
3461
3917
  }
3462
3918
  ),
3463
- selectedPackage && dependencyItems.length > 0 && /* @__PURE__ */ jsxs(
3919
+ /* @__PURE__ */ jsxs(
3464
3920
  "div",
3465
3921
  {
3466
3922
  style: {
3467
3923
  flex: 1,
3468
- overflow: "auto",
3469
- padding: `${theme.space[2]}px ${theme.space[3]}px ${theme.space[3]}px`
3924
+ overflowY: "auto",
3925
+ display: "flex",
3926
+ flexDirection: "column",
3927
+ gap: "16px"
3470
3928
  },
3471
3929
  children: [
3472
- /* @__PURE__ */ jsxs(
3930
+ filteredUserRepos.length > 0 && /* @__PURE__ */ jsxs("div", { children: [
3931
+ renderSectionHeader(
3932
+ currentUser || "Your Repositories",
3933
+ filteredUserRepos.length,
3934
+ /* @__PURE__ */ jsx(User, { size: 16, color: theme.colors.textSecondary })
3935
+ ),
3936
+ !collapsedSections.has(currentUser || "Your Repositories") && /* @__PURE__ */ jsx("div", { style: { display: "flex", flexDirection: "column", gap: "4px" }, children: filteredUserRepos.sort(
3937
+ (a, b) => a.name.localeCompare(b.name, void 0, { sensitivity: "base" })
3938
+ ).map((repo) => /* @__PURE__ */ jsx(
3939
+ GitHubRepositoryCard,
3940
+ {
3941
+ repository: repo,
3942
+ localRepo: localRepoMap.get(repo.full_name),
3943
+ onClone: handleClone,
3944
+ onOpen: handleOpen,
3945
+ onSelect: handleSelect,
3946
+ isSelected: (selectedRepo == null ? void 0 : selectedRepo.id) === repo.id
3947
+ },
3948
+ repo.id
3949
+ )) })
3950
+ ] }),
3951
+ organizations.map((org) => {
3952
+ const repos = filteredOrgRepos[org.login];
3953
+ if (!repos || repos.length === 0) return null;
3954
+ return /* @__PURE__ */ jsxs("div", { children: [
3955
+ renderSectionHeader(
3956
+ org.login,
3957
+ repos.length,
3958
+ /* @__PURE__ */ jsx(Building2, { size: 16, color: theme.colors.textSecondary }),
3959
+ true
3960
+ ),
3961
+ !collapsedSections.has(org.login) && /* @__PURE__ */ jsx("div", { style: { display: "flex", flexDirection: "column", gap: "4px" }, children: repos.sort(
3962
+ (a, b) => a.name.localeCompare(b.name, void 0, { sensitivity: "base" })
3963
+ ).map((repo) => /* @__PURE__ */ jsx(
3964
+ GitHubRepositoryCard,
3965
+ {
3966
+ repository: repo,
3967
+ localRepo: localRepoMap.get(repo.full_name),
3968
+ onClone: handleClone,
3969
+ onOpen: handleOpen,
3970
+ onSelect: handleSelect,
3971
+ isSelected: (selectedRepo == null ? void 0 : selectedRepo.id) === repo.id
3972
+ },
3973
+ repo.id
3974
+ )) })
3975
+ ] }, org.id);
3976
+ }),
3977
+ filteredUserRepos.length === 0 && Object.keys(filteredOrgRepos).length === 0 && hasData && /* @__PURE__ */ jsx(
3473
3978
  "div",
3474
3979
  {
3475
3980
  style: {
3476
- fontSize: `${theme.fontSizes[0]}px`,
3477
- color: theme.colors.textSecondary,
3478
- marginBottom: `${theme.space[2]}px`
3981
+ padding: "32px",
3982
+ textAlign: "center",
3983
+ color: theme.colors.textSecondary
3479
3984
  },
3480
- children: [
3481
- "Showing ",
3482
- filteredDependencies.length,
3483
- " of ",
3484
- dependencyItems.length,
3485
- " dependencies"
3486
- ]
3985
+ children: /* @__PURE__ */ jsx("p", { style: { margin: 0 }, children: "No repositories match your filter." })
3487
3986
  }
3488
3987
  ),
3489
- /* @__PURE__ */ jsx(
3988
+ !hasData && !loading && /* @__PURE__ */ jsxs(
3490
3989
  "div",
3491
3990
  {
3492
3991
  style: {
3493
- display: "flex",
3494
- flexDirection: "column",
3495
- gap: `${theme.space[1]}px`
3992
+ padding: "32px",
3993
+ textAlign: "center",
3994
+ color: theme.colors.textSecondary
3496
3995
  },
3497
- children: filteredDependencies.length === 0 ? /* @__PURE__ */ jsx(
3498
- "div",
3499
- {
3500
- style: {
3501
- padding: `${theme.space[3]}px`,
3502
- textAlign: "center",
3503
- color: theme.colors.textSecondary,
3504
- fontSize: `${theme.fontSizes[1]}px`
3505
- },
3506
- children: "No dependencies match your filters"
3507
- }
3508
- ) : filteredDependencies.map((dep) => /* @__PURE__ */ jsx(
3509
- DependencyRow,
3510
- {
3511
- dependency: dep
3512
- },
3513
- `${dep.name}-${dep.dependencyType}`
3514
- ))
3996
+ children: [
3997
+ /* @__PURE__ */ jsx(
3998
+ FolderGit2,
3999
+ {
4000
+ size: 32,
4001
+ style: { marginBottom: "12px", opacity: 0.5 }
4002
+ }
4003
+ ),
4004
+ /* @__PURE__ */ jsx("p", { style: { margin: 0 }, children: "No repositories found." })
4005
+ ]
3515
4006
  }
3516
4007
  )
3517
4008
  ]
3518
4009
  }
3519
- ),
3520
- !selectedPackage && packages.length > 1 && /* @__PURE__ */ jsx(
4010
+ )
4011
+ ]
4012
+ }
4013
+ );
4014
+ };
4015
+ const GitHubProjectsPanelPreview = () => {
4016
+ const { theme } = useTheme();
4017
+ return /* @__PURE__ */ jsxs(
4018
+ "div",
4019
+ {
4020
+ style: {
4021
+ padding: "12px",
4022
+ fontSize: `${theme.fontSizes[0]}px`,
4023
+ fontFamily: theme.fonts.body,
4024
+ color: theme.colors.text,
4025
+ display: "flex",
4026
+ flexDirection: "column",
4027
+ gap: "8px"
4028
+ },
4029
+ children: [
4030
+ /* @__PURE__ */ jsxs(
3521
4031
  "div",
3522
4032
  {
3523
4033
  style: {
3524
- flex: 1,
3525
4034
  display: "flex",
3526
4035
  alignItems: "center",
3527
- justifyContent: "center",
3528
- color: theme.colors.textSecondary,
3529
- fontSize: `${theme.fontSizes[1]}px`
4036
+ gap: "6px",
4037
+ fontWeight: theme.fontWeights.semibold
3530
4038
  },
3531
- children: "Select a package to view its dependencies"
4039
+ children: [
4040
+ /* @__PURE__ */ jsx(FolderGit2, { size: 16, style: { color: theme.colors.primary } }),
4041
+ /* @__PURE__ */ jsx("span", { children: "GitHub Projects" })
4042
+ ]
3532
4043
  }
3533
4044
  ),
3534
4045
  /* @__PURE__ */ jsx(
3535
- DependencyInfoModal,
4046
+ "div",
3536
4047
  {
3537
- isOpen: showInfoModal,
3538
- onClose: () => setShowInfoModal(false)
4048
+ style: {
4049
+ fontSize: `${theme.fontSizes[0]}px`,
4050
+ fontFamily: theme.fonts.body,
4051
+ color: theme.colors.textSecondary,
4052
+ marginTop: "4px"
4053
+ },
4054
+ children: "Your repositories and organization projects"
3539
4055
  }
3540
4056
  )
3541
4057
  ]
3542
4058
  }
3543
4059
  );
3544
4060
  };
3545
- const DependenciesPanel = (props) => {
3546
- return /* @__PURE__ */ jsx(DependenciesPanelContent, { ...props });
3547
- };
3548
- const PANEL_ID$3 = "industry-theme.local-projects";
3549
- const filterProjectsTool = {
4061
+ const PANEL_ID$4 = "industry-theme.local-projects";
4062
+ const filterProjectsTool$1 = {
3550
4063
  name: "filter_projects",
3551
4064
  description: "Filter the local projects list by name, owner, or path",
3552
4065
  inputs: {
@@ -3569,7 +4082,7 @@ const filterProjectsTool = {
3569
4082
  tags: ["filter", "search", "projects"],
3570
4083
  tool_call_template: {
3571
4084
  call_template_type: "panel_event",
3572
- event_type: `${PANEL_ID$3}:filter`
4085
+ event_type: `${PANEL_ID$4}:filter`
3573
4086
  }
3574
4087
  };
3575
4088
  const selectProjectTool = {
@@ -3595,7 +4108,7 @@ const selectProjectTool = {
3595
4108
  tags: ["select", "project", "navigation"],
3596
4109
  tool_call_template: {
3597
4110
  call_template_type: "panel_event",
3598
- event_type: `${PANEL_ID$3}:select-repository`
4111
+ event_type: `${PANEL_ID$4}:select-repository`
3599
4112
  }
3600
4113
  };
3601
4114
  const openProjectTool = {
@@ -3621,21 +4134,21 @@ const openProjectTool = {
3621
4134
  tags: ["open", "project", "workspace"],
3622
4135
  tool_call_template: {
3623
4136
  call_template_type: "panel_event",
3624
- event_type: `${PANEL_ID$3}:open-repository`
4137
+ event_type: `${PANEL_ID$4}:open-repository`
3625
4138
  }
3626
4139
  };
3627
4140
  const localProjectsPanelTools = [
3628
- filterProjectsTool,
4141
+ filterProjectsTool$1,
3629
4142
  selectProjectTool,
3630
4143
  openProjectTool
3631
4144
  ];
3632
4145
  const localProjectsPanelToolsMetadata = {
3633
- id: PANEL_ID$3,
4146
+ id: PANEL_ID$4,
3634
4147
  name: "Local Projects Panel",
3635
4148
  description: "Tools for browsing and managing local Alexandria repositories",
3636
4149
  tools: localProjectsPanelTools
3637
4150
  };
3638
- const PANEL_ID$2 = "industry-theme.workspace-repositories";
4151
+ const PANEL_ID$3 = "industry-theme.workspace-repositories";
3639
4152
  const selectRepositoryTool = {
3640
4153
  name: "select_workspace_repository",
3641
4154
  description: "Selects a repository in the workspace panel",
@@ -3659,7 +4172,7 @@ const selectRepositoryTool = {
3659
4172
  tags: ["workspace", "repository", "select"],
3660
4173
  tool_call_template: {
3661
4174
  call_template_type: "panel_event",
3662
- event_type: `${PANEL_ID$2}:select-repository`
4175
+ event_type: `${PANEL_ID$3}:select-repository`
3663
4176
  }
3664
4177
  };
3665
4178
  const refreshWorkspaceTool = {
@@ -3684,7 +4197,7 @@ const refreshWorkspaceTool = {
3684
4197
  tags: ["workspace", "refresh"],
3685
4198
  tool_call_template: {
3686
4199
  call_template_type: "panel_event",
3687
- event_type: `${PANEL_ID$2}:refresh-workspace`
4200
+ event_type: `${PANEL_ID$3}:refresh-workspace`
3688
4201
  }
3689
4202
  };
3690
4203
  const openRepositoryTool = {
@@ -3710,7 +4223,7 @@ const openRepositoryTool = {
3710
4223
  tags: ["workspace", "repository", "open"],
3711
4224
  tool_call_template: {
3712
4225
  call_template_type: "panel_event",
3713
- event_type: `${PANEL_ID$2}:open-repository`
4226
+ event_type: `${PANEL_ID$3}:open-repository`
3714
4227
  }
3715
4228
  };
3716
4229
  const workspaceRepositoriesPanelTools = [
@@ -3719,12 +4232,12 @@ const workspaceRepositoriesPanelTools = [
3719
4232
  openRepositoryTool
3720
4233
  ];
3721
4234
  const workspaceRepositoriesPanelToolsMetadata = {
3722
- id: PANEL_ID$2,
4235
+ id: PANEL_ID$3,
3723
4236
  name: "Workspace Repositories Panel",
3724
4237
  description: "Tools provided by the workspace repositories panel",
3725
4238
  tools: workspaceRepositoriesPanelTools
3726
4239
  };
3727
- const PANEL_ID$1 = "industry-theme.workspaces-list";
4240
+ const PANEL_ID$2 = "industry-theme.workspaces-list";
3728
4241
  const filterWorkspacesTool = {
3729
4242
  name: "filter_workspaces",
3730
4243
  description: "Filter the workspaces list by workspace name, description, or repository names within workspaces",
@@ -3748,7 +4261,7 @@ const filterWorkspacesTool = {
3748
4261
  tags: ["filter", "search", "workspaces"],
3749
4262
  tool_call_template: {
3750
4263
  call_template_type: "panel_event",
3751
- event_type: `${PANEL_ID$1}:filter`
4264
+ event_type: `${PANEL_ID$2}:filter`
3752
4265
  }
3753
4266
  };
3754
4267
  const selectWorkspaceTool = {
@@ -3774,7 +4287,7 @@ const selectWorkspaceTool = {
3774
4287
  tags: ["select", "workspace", "navigation"],
3775
4288
  tool_call_template: {
3776
4289
  call_template_type: "panel_event",
3777
- event_type: `${PANEL_ID$1}:select-workspace`
4290
+ event_type: `${PANEL_ID$2}:select-workspace`
3778
4291
  }
3779
4292
  };
3780
4293
  const openWorkspaceTool = {
@@ -3800,7 +4313,7 @@ const openWorkspaceTool = {
3800
4313
  tags: ["open", "workspace", "window"],
3801
4314
  tool_call_template: {
3802
4315
  call_template_type: "panel_event",
3803
- event_type: `${PANEL_ID$1}:open-workspace`
4316
+ event_type: `${PANEL_ID$2}:open-workspace`
3804
4317
  }
3805
4318
  };
3806
4319
  const createWorkspaceTool = {
@@ -3831,7 +4344,7 @@ const createWorkspaceTool = {
3831
4344
  tags: ["create", "workspace", "new"],
3832
4345
  tool_call_template: {
3833
4346
  call_template_type: "panel_event",
3834
- event_type: `${PANEL_ID$1}:create-workspace`
4347
+ event_type: `${PANEL_ID$2}:create-workspace`
3835
4348
  }
3836
4349
  };
3837
4350
  const workspacesListPanelTools = [
@@ -3841,21 +4354,119 @@ const workspacesListPanelTools = [
3841
4354
  createWorkspaceTool
3842
4355
  ];
3843
4356
  const workspacesListPanelToolsMetadata = {
3844
- id: PANEL_ID$1,
4357
+ id: PANEL_ID$2,
3845
4358
  name: "Workspaces List Panel",
3846
4359
  description: "Tools for browsing and managing workspaces",
3847
4360
  tools: workspacesListPanelTools
3848
4361
  };
3849
- const PANEL_ID = "principal-ade.dependencies-panel";
3850
- const filterDependenciesTool = {
3851
- name: "filter_dependencies",
3852
- description: "Filter the dependencies list by package name",
4362
+ const PANEL_ID$1 = "industry-theme.github-starred";
4363
+ const filterStarredTool = {
4364
+ name: "filter_starred_repositories",
4365
+ description: "Filter the starred repositories list by repository name, owner, language, or description",
4366
+ inputs: {
4367
+ type: "object",
4368
+ properties: {
4369
+ filter: {
4370
+ type: "string",
4371
+ description: "Search term to filter repositories (matches name, owner, language, or description)"
4372
+ }
4373
+ },
4374
+ required: ["filter"]
4375
+ },
4376
+ outputs: {
4377
+ type: "object",
4378
+ properties: {
4379
+ success: { type: "boolean" },
4380
+ message: { type: "string" }
4381
+ }
4382
+ },
4383
+ tags: ["filter", "search", "starred", "github"],
4384
+ tool_call_template: {
4385
+ call_template_type: "panel_event",
4386
+ event_type: `${PANEL_ID$1}:filter`
4387
+ }
4388
+ };
4389
+ const selectStarredRepositoryTool = {
4390
+ name: "select_starred_repository",
4391
+ description: "Select a starred repository by its name or full name (owner/repo)",
4392
+ inputs: {
4393
+ type: "object",
4394
+ properties: {
4395
+ identifier: {
4396
+ type: "string",
4397
+ description: "Repository identifier - can be the repository name or full name (owner/repo)"
4398
+ }
4399
+ },
4400
+ required: ["identifier"]
4401
+ },
4402
+ outputs: {
4403
+ type: "object",
4404
+ properties: {
4405
+ success: { type: "boolean" },
4406
+ message: { type: "string" },
4407
+ repository: {
4408
+ type: "object",
4409
+ description: "The selected repository data"
4410
+ }
4411
+ }
4412
+ },
4413
+ tags: ["select", "starred", "github", "repository"],
4414
+ tool_call_template: {
4415
+ call_template_type: "panel_event",
4416
+ event_type: `${PANEL_ID$1}:select-repository`
4417
+ }
4418
+ };
4419
+ const cloneStarredRepositoryTool = {
4420
+ name: "clone_starred_repository",
4421
+ description: "Clone a starred repository to the local machine",
4422
+ inputs: {
4423
+ type: "object",
4424
+ properties: {
4425
+ identifier: {
4426
+ type: "string",
4427
+ description: "Repository identifier - can be the repository name or full name (owner/repo)"
4428
+ }
4429
+ },
4430
+ required: ["identifier"]
4431
+ },
4432
+ outputs: {
4433
+ type: "object",
4434
+ properties: {
4435
+ success: { type: "boolean" },
4436
+ message: { type: "string" },
4437
+ localPath: {
4438
+ type: "string",
4439
+ description: "Path where the repository was cloned"
4440
+ }
4441
+ }
4442
+ },
4443
+ tags: ["clone", "starred", "github", "repository"],
4444
+ tool_call_template: {
4445
+ call_template_type: "panel_event",
4446
+ event_type: `${PANEL_ID$1}:clone-repository`
4447
+ }
4448
+ };
4449
+ const githubStarredPanelTools = [
4450
+ filterStarredTool,
4451
+ selectStarredRepositoryTool,
4452
+ cloneStarredRepositoryTool
4453
+ ];
4454
+ const githubStarredPanelToolsMetadata = {
4455
+ id: PANEL_ID$1,
4456
+ name: "GitHub Starred Panel",
4457
+ description: "Tools for browsing and managing starred GitHub repositories",
4458
+ tools: githubStarredPanelTools
4459
+ };
4460
+ const PANEL_ID = "industry-theme.github-projects";
4461
+ const filterProjectsTool = {
4462
+ name: "filter_github_projects",
4463
+ description: "Filter the GitHub projects list by repository name, owner, language, or description",
3853
4464
  inputs: {
3854
4465
  type: "object",
3855
4466
  properties: {
3856
4467
  filter: {
3857
4468
  type: "string",
3858
- description: "Search term to filter dependencies by name"
4469
+ description: "Search term to filter repositories (matches name, owner, language, or description)"
3859
4470
  }
3860
4471
  },
3861
4472
  required: ["filter"]
@@ -3867,75 +4478,110 @@ const filterDependenciesTool = {
3867
4478
  message: { type: "string" }
3868
4479
  }
3869
4480
  },
3870
- tags: ["filter", "search", "dependencies"],
4481
+ tags: ["filter", "search", "projects", "github"],
3871
4482
  tool_call_template: {
3872
4483
  call_template_type: "panel_event",
3873
4484
  event_type: `${PANEL_ID}:filter`
3874
4485
  }
3875
4486
  };
3876
- const selectDependencyTypeTool = {
3877
- name: "select_dependency_type",
3878
- description: "Filter dependencies by type (production, development, or peer)",
4487
+ const toggleOwnerSectionTool = {
4488
+ name: "toggle_owner_section",
4489
+ description: "Expand or collapse an owner section (user or organization) in the projects panel",
4490
+ inputs: {
4491
+ type: "object",
4492
+ properties: {
4493
+ owner: {
4494
+ type: "string",
4495
+ description: "The owner name (username or organization login) to toggle"
4496
+ }
4497
+ },
4498
+ required: ["owner"]
4499
+ },
4500
+ outputs: {
4501
+ type: "object",
4502
+ properties: {
4503
+ success: { type: "boolean" },
4504
+ message: { type: "string" },
4505
+ collapsed: { type: "boolean" }
4506
+ }
4507
+ },
4508
+ tags: ["toggle", "section", "projects", "github"],
4509
+ tool_call_template: {
4510
+ call_template_type: "panel_event",
4511
+ event_type: `${PANEL_ID}:toggle-section`
4512
+ }
4513
+ };
4514
+ const selectProjectRepositoryTool = {
4515
+ name: "select_project_repository",
4516
+ description: "Select a project repository by its name or full name (owner/repo)",
3879
4517
  inputs: {
3880
4518
  type: "object",
3881
4519
  properties: {
3882
- type: {
4520
+ identifier: {
3883
4521
  type: "string",
3884
- enum: ["production", "development", "peer", "all"],
3885
- description: "The dependency type to filter by"
4522
+ description: "Repository identifier - can be the repository name or full name (owner/repo)"
3886
4523
  }
3887
4524
  },
3888
- required: ["type"]
4525
+ required: ["identifier"]
3889
4526
  },
3890
4527
  outputs: {
3891
4528
  type: "object",
3892
4529
  properties: {
3893
4530
  success: { type: "boolean" },
3894
- selectedType: { type: "string" }
4531
+ message: { type: "string" },
4532
+ repository: {
4533
+ type: "object",
4534
+ description: "The selected repository data"
4535
+ }
3895
4536
  }
3896
4537
  },
3897
- tags: ["filter", "type", "dependencies"],
4538
+ tags: ["select", "projects", "github", "repository"],
3898
4539
  tool_call_template: {
3899
4540
  call_template_type: "panel_event",
3900
- event_type: `${PANEL_ID}:select-type`
4541
+ event_type: `${PANEL_ID}:select-repository`
3901
4542
  }
3902
4543
  };
3903
- const selectPackageTool = {
3904
- name: "select_package",
3905
- description: "Select a package to view its dependencies (for monorepos)",
4544
+ const cloneProjectRepositoryTool = {
4545
+ name: "clone_project_repository",
4546
+ description: "Clone a project repository to the local machine",
3906
4547
  inputs: {
3907
4548
  type: "object",
3908
4549
  properties: {
3909
- packagePath: {
4550
+ identifier: {
3910
4551
  type: "string",
3911
- description: "The path of the package to select"
4552
+ description: "Repository identifier - can be the repository name or full name (owner/repo)"
3912
4553
  }
3913
4554
  },
3914
- required: ["packagePath"]
4555
+ required: ["identifier"]
3915
4556
  },
3916
4557
  outputs: {
3917
4558
  type: "object",
3918
4559
  properties: {
3919
4560
  success: { type: "boolean" },
3920
- selectedPackage: { type: "string" }
4561
+ message: { type: "string" },
4562
+ localPath: {
4563
+ type: "string",
4564
+ description: "Path where the repository was cloned"
4565
+ }
3921
4566
  }
3922
4567
  },
3923
- tags: ["select", "package", "monorepo"],
4568
+ tags: ["clone", "projects", "github", "repository"],
3924
4569
  tool_call_template: {
3925
4570
  call_template_type: "panel_event",
3926
- event_type: `${PANEL_ID}:select-package`
4571
+ event_type: `${PANEL_ID}:clone-repository`
3927
4572
  }
3928
4573
  };
3929
- const dependenciesPanelTools = [
3930
- filterDependenciesTool,
3931
- selectDependencyTypeTool,
3932
- selectPackageTool
4574
+ const githubProjectsPanelTools = [
4575
+ filterProjectsTool,
4576
+ toggleOwnerSectionTool,
4577
+ selectProjectRepositoryTool,
4578
+ cloneProjectRepositoryTool
3933
4579
  ];
3934
- const dependenciesPanelToolsMetadata = {
4580
+ const githubProjectsPanelToolsMetadata = {
3935
4581
  id: PANEL_ID,
3936
- name: "Dependencies Panel",
3937
- description: "Tools for viewing and exploring package dependencies",
3938
- tools: dependenciesPanelTools
4582
+ name: "GitHub Projects Panel",
4583
+ description: "Tools for browsing and managing your GitHub repositories and organization repositories",
4584
+ tools: githubProjectsPanelTools
3939
4585
  };
3940
4586
  const panels = [
3941
4587
  {
@@ -4004,21 +4650,46 @@ const panels = [
4004
4650
  },
4005
4651
  {
4006
4652
  metadata: {
4007
- id: "principal-ade.dependencies-panel",
4008
- name: "Dependencies",
4009
- icon: "Package",
4653
+ id: "industry-theme.github-starred",
4654
+ name: "Starred",
4655
+ icon: "Star",
4010
4656
  version: "0.1.0",
4011
- author: "Principal ADE",
4012
- description: "View and explore package dependencies",
4013
- slices: ["packages"],
4014
- tools: dependenciesPanelTools
4657
+ author: "Industry Theme",
4658
+ description: "Browse your starred GitHub repositories",
4659
+ slices: ["githubStarred", "alexandriaRepositories"],
4660
+ tools: githubStarredPanelTools
4661
+ },
4662
+ component: GitHubStarredPanel,
4663
+ onMount: async (context) => {
4664
+ console.log("GitHub Starred Panel mounted");
4665
+ if (context.hasSlice("githubStarred") && !context.isSliceLoading("githubStarred")) {
4666
+ await context.refresh(void 0, "githubStarred");
4667
+ }
4668
+ },
4669
+ onUnmount: async (_context) => {
4670
+ console.log("GitHub Starred Panel unmounting");
4671
+ }
4672
+ },
4673
+ {
4674
+ metadata: {
4675
+ id: "industry-theme.github-projects",
4676
+ name: "GitHub Projects",
4677
+ icon: "FolderGit2",
4678
+ version: "0.1.0",
4679
+ author: "Industry Theme",
4680
+ description: "Your repositories and organization projects",
4681
+ slices: ["githubProjects", "alexandriaRepositories"],
4682
+ tools: githubProjectsPanelTools
4015
4683
  },
4016
- component: DependenciesPanel,
4017
- onMount: async (_context) => {
4018
- console.log("Dependencies Panel mounted");
4684
+ component: GitHubProjectsPanel,
4685
+ onMount: async (context) => {
4686
+ console.log("GitHub Projects Panel mounted");
4687
+ if (context.hasSlice("githubProjects") && !context.isSliceLoading("githubProjects")) {
4688
+ await context.refresh(void 0, "githubProjects");
4689
+ }
4019
4690
  },
4020
4691
  onUnmount: async (_context) => {
4021
- console.log("Dependencies Panel unmounting");
4692
+ console.log("GitHub Projects Panel unmounting");
4022
4693
  }
4023
4694
  }
4024
4695
  ];
@@ -4029,7 +4700,11 @@ const onPackageUnload = async () => {
4029
4700
  console.log("Alexandria Panels package unloading");
4030
4701
  };
4031
4702
  export {
4032
- DependenciesPanel,
4703
+ GitHubProjectsPanel,
4704
+ GitHubProjectsPanelPreview,
4705
+ GitHubRepositoryCard,
4706
+ GitHubStarredPanel,
4707
+ GitHubStarredPanelPreview,
4033
4708
  LocalProjectCard,
4034
4709
  LocalProjectsPanel,
4035
4710
  LocalProjectsPanelPreview,
@@ -4038,12 +4713,17 @@ export {
4038
4713
  WorkspaceRepositoriesPanel,
4039
4714
  WorkspacesListPanel,
4040
4715
  WorkspacesListPanelPreview,
4716
+ cloneProjectRepositoryTool,
4717
+ cloneStarredRepositoryTool,
4041
4718
  createWorkspaceTool,
4042
- dependenciesPanelTools,
4043
- dependenciesPanelToolsMetadata,
4044
- filterDependenciesTool,
4045
- filterProjectsTool,
4719
+ filterProjectsTool as filterGitHubProjectsTool,
4720
+ filterProjectsTool$1 as filterProjectsTool,
4721
+ filterStarredTool,
4046
4722
  filterWorkspacesTool,
4723
+ githubProjectsPanelTools,
4724
+ githubProjectsPanelToolsMetadata,
4725
+ githubStarredPanelTools,
4726
+ githubStarredPanelToolsMetadata,
4047
4727
  localProjectsPanelTools,
4048
4728
  localProjectsPanelToolsMetadata,
4049
4729
  onPackageLoad,
@@ -4053,11 +4733,12 @@ export {
4053
4733
  openWorkspaceTool,
4054
4734
  panels,
4055
4735
  refreshWorkspaceTool,
4056
- selectDependencyTypeTool,
4057
- selectPackageTool,
4736
+ selectProjectRepositoryTool,
4058
4737
  selectProjectTool,
4059
4738
  selectRepositoryTool,
4739
+ selectStarredRepositoryTool,
4060
4740
  selectWorkspaceTool,
4741
+ toggleOwnerSectionTool,
4061
4742
  workspaceRepositoriesPanelTools,
4062
4743
  workspaceRepositoriesPanelToolsMetadata,
4063
4744
  workspacesListPanelTools,