@industry-theme/repository-composition-panels 0.6.24 → 0.6.26

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 (44) hide show
  1. package/dist/{BufferResource-DdBroP8T.js → BufferResource-BpwdsDX0.js} +2 -2
  2. package/dist/{BufferResource-DdBroP8T.js.map → BufferResource-BpwdsDX0.js.map} +1 -1
  3. package/dist/{CanvasRenderer-BDNCY5O9.js → CanvasRenderer-CPXgnUH1.js} +3 -3
  4. package/dist/{CanvasRenderer-BDNCY5O9.js.map → CanvasRenderer-CPXgnUH1.js.map} +1 -1
  5. package/dist/{Filter-CRFHnDlT.js → Filter-mj7HIghB.js} +2 -2
  6. package/dist/{Filter-CRFHnDlT.js.map → Filter-mj7HIghB.js.map} +1 -1
  7. package/dist/{RenderTargetSystem-D2aJ1wgA.js → RenderTargetSystem-hvP6wkm5.js} +3 -3
  8. package/dist/{RenderTargetSystem-D2aJ1wgA.js.map → RenderTargetSystem-hvP6wkm5.js.map} +1 -1
  9. package/dist/{WebGLRenderer-BC7QWBvA.js → WebGLRenderer-CSpWLo6L.js} +4 -4
  10. package/dist/{WebGLRenderer-BC7QWBvA.js.map → WebGLRenderer-CSpWLo6L.js.map} +1 -1
  11. package/dist/{WebGPURenderer-kG50TdbS.js → WebGPURenderer-Dlw7vvZU.js} +4 -4
  12. package/dist/{WebGPURenderer-kG50TdbS.js.map → WebGPURenderer-Dlw7vvZU.js.map} +1 -1
  13. package/dist/{browserAll-B-6hqqmg.js → browserAll-C1iy5xbx.js} +3 -3
  14. package/dist/{browserAll-B-6hqqmg.js.map → browserAll-C1iy5xbx.js.map} +1 -1
  15. package/dist/{index-DqpaKlrF.js → index-BwWx2Yhi.js} +1166 -524
  16. package/dist/{index-DqpaKlrF.js.map → index-BwWx2Yhi.js.map} +1 -1
  17. package/dist/{init-rtMA0Dd6.js → init-DGC3XtNO.js} +3 -3
  18. package/dist/{init-rtMA0Dd6.js.map → init-DGC3XtNO.js.map} +1 -1
  19. package/dist/panels/CollectionMapPanel.d.ts +8 -0
  20. package/dist/panels/CollectionMapPanel.d.ts.map +1 -1
  21. package/dist/panels/PackageCompositionPanel.d.ts +2 -0
  22. package/dist/panels/PackageCompositionPanel.d.ts.map +1 -1
  23. package/dist/panels/components/DependencyRow.d.ts.map +1 -1
  24. package/dist/panels/components/FilterBar.d.ts.map +1 -1
  25. package/dist/panels/components/PackageDetailCard.d.ts +16 -0
  26. package/dist/panels/components/PackageDetailCard.d.ts.map +1 -0
  27. package/dist/panels/components/PackageSummaryCard.d.ts +10 -0
  28. package/dist/panels/components/PackageSummaryCard.d.ts.map +1 -0
  29. package/dist/panels/components/index.d.ts +3 -1
  30. package/dist/panels/components/index.d.ts.map +1 -1
  31. package/dist/panels/overworld-map/OverworldMapPanel.d.ts +4 -0
  32. package/dist/panels/overworld-map/OverworldMapPanel.d.ts.map +1 -1
  33. package/dist/panels/overworld-map/components/IsometricInteractionManager.d.ts +18 -1
  34. package/dist/panels/overworld-map/components/IsometricInteractionManager.d.ts.map +1 -1
  35. package/dist/panels.bundle.js +1 -1
  36. package/dist/types/index.d.ts +8 -1
  37. package/dist/types/index.d.ts.map +1 -1
  38. package/dist/utils/envParser.d.ts +29 -0
  39. package/dist/utils/envParser.d.ts.map +1 -0
  40. package/dist/webworkerAll-BmgxtxZy.js +3 -0
  41. package/dist/webworkerAll-BmgxtxZy.js.map +1 -0
  42. package/package.json +3 -3
  43. package/dist/webworkerAll-Bvp7nJ85.js +0 -3
  44. package/dist/webworkerAll-Bvp7nJ85.js.map +0 -1
@@ -151,28 +151,17 @@ const Activity$1 = createLucideIcon$1("activity", __iconNode$qk);
151
151
  * See the LICENSE file in the root directory of this source tree.
152
152
  */
153
153
  const __iconNode$qj = [
154
- ["path", { d: "M5 12h14", key: "1ays0h" }],
155
- ["path", { d: "m12 5 7 7-7 7", key: "xquz4c" }]
156
- ];
157
- const ArrowRight$1 = createLucideIcon$1("arrow-right", __iconNode$qj);
158
- /**
159
- * @license lucide-react v0.552.0 - ISC
160
- *
161
- * This source code is licensed under the ISC license.
162
- * See the LICENSE file in the root directory of this source tree.
163
- */
164
- const __iconNode$qi = [
165
154
  ["path", { d: "m5 12 7-7 7 7", key: "hav0vg" }],
166
155
  ["path", { d: "M12 19V5", key: "x0mq9r" }]
167
156
  ];
168
- const ArrowUp$1 = createLucideIcon$1("arrow-up", __iconNode$qi);
157
+ const ArrowUp$1 = createLucideIcon$1("arrow-up", __iconNode$qj);
169
158
  /**
170
159
  * @license lucide-react v0.552.0 - ISC
171
160
  *
172
161
  * This source code is licensed under the ISC license.
173
162
  * See the LICENSE file in the root directory of this source tree.
174
163
  */
175
- const __iconNode$qh = [
164
+ const __iconNode$qi = [
176
165
  [
177
166
  "path",
178
167
  {
@@ -183,59 +172,70 @@ const __iconNode$qh = [
183
172
  ["path", { d: "m3.3 7 8.7 5 8.7-5", key: "g66t2b" }],
184
173
  ["path", { d: "M12 22V12", key: "d0xqtd" }]
185
174
  ];
186
- const Box$1 = createLucideIcon$1("box", __iconNode$qh);
175
+ const Box$1 = createLucideIcon$1("box", __iconNode$qi);
187
176
  /**
188
177
  * @license lucide-react v0.552.0 - ISC
189
178
  *
190
179
  * This source code is licensed under the ISC license.
191
180
  * See the LICENSE file in the root directory of this source tree.
192
181
  */
193
- const __iconNode$qg = [["path", { d: "M20 6 9 17l-5-5", key: "1gmf2c" }]];
194
- const Check$1 = createLucideIcon$1("check", __iconNode$qg);
182
+ const __iconNode$qh = [["path", { d: "M20 6 9 17l-5-5", key: "1gmf2c" }]];
183
+ const Check$1 = createLucideIcon$1("check", __iconNode$qh);
195
184
  /**
196
185
  * @license lucide-react v0.552.0 - ISC
197
186
  *
198
187
  * This source code is licensed under the ISC license.
199
188
  * See the LICENSE file in the root directory of this source tree.
200
189
  */
201
- const __iconNode$qf = [["path", { d: "m6 9 6 6 6-6", key: "qrunsl" }]];
202
- const ChevronDown$1 = createLucideIcon$1("chevron-down", __iconNode$qf);
190
+ const __iconNode$qg = [["path", { d: "m6 9 6 6 6-6", key: "qrunsl" }]];
191
+ const ChevronDown$1 = createLucideIcon$1("chevron-down", __iconNode$qg);
203
192
  /**
204
193
  * @license lucide-react v0.552.0 - ISC
205
194
  *
206
195
  * This source code is licensed under the ISC license.
207
196
  * See the LICENSE file in the root directory of this source tree.
208
197
  */
209
- const __iconNode$qe = [["path", { d: "m15 18-6-6 6-6", key: "1wnfg3" }]];
210
- const ChevronLeft$1 = createLucideIcon$1("chevron-left", __iconNode$qe);
198
+ const __iconNode$qf = [["path", { d: "m15 18-6-6 6-6", key: "1wnfg3" }]];
199
+ const ChevronLeft$1 = createLucideIcon$1("chevron-left", __iconNode$qf);
211
200
  /**
212
201
  * @license lucide-react v0.552.0 - ISC
213
202
  *
214
203
  * This source code is licensed under the ISC license.
215
204
  * See the LICENSE file in the root directory of this source tree.
216
205
  */
217
- const __iconNode$qd = [["path", { d: "m9 18 6-6-6-6", key: "mthhwq" }]];
218
- const ChevronRight$1 = createLucideIcon$1("chevron-right", __iconNode$qd);
206
+ const __iconNode$qe = [["path", { d: "m9 18 6-6-6-6", key: "mthhwq" }]];
207
+ const ChevronRight$1 = createLucideIcon$1("chevron-right", __iconNode$qe);
219
208
  /**
220
209
  * @license lucide-react v0.552.0 - ISC
221
210
  *
222
211
  * This source code is licensed under the ISC license.
223
212
  * See the LICENSE file in the root directory of this source tree.
224
213
  */
225
- const __iconNode$qc = [["path", { d: "m18 15-6-6-6 6", key: "153udz" }]];
226
- const ChevronUp$1 = createLucideIcon$1("chevron-up", __iconNode$qc);
214
+ const __iconNode$qd = [["path", { d: "m18 15-6-6-6 6", key: "153udz" }]];
215
+ const ChevronUp$1 = createLucideIcon$1("chevron-up", __iconNode$qd);
227
216
  /**
228
217
  * @license lucide-react v0.552.0 - ISC
229
218
  *
230
219
  * This source code is licensed under the ISC license.
231
220
  * See the LICENSE file in the root directory of this source tree.
232
221
  */
233
- const __iconNode$qb = [
222
+ const __iconNode$qc = [
234
223
  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
235
224
  ["line", { x1: "12", x2: "12", y1: "8", y2: "12", key: "1pkeuh" }],
236
225
  ["line", { x1: "12", x2: "12.01", y1: "16", y2: "16", key: "4dfq90" }]
237
226
  ];
238
- const CircleAlert$1 = createLucideIcon$1("circle-alert", __iconNode$qb);
227
+ const CircleAlert$1 = createLucideIcon$1("circle-alert", __iconNode$qc);
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$qb = [
235
+ ["path", { d: "M21.801 10A10 10 0 1 1 17 3.335", key: "yps3ct" }],
236
+ ["path", { d: "m9 11 3 3L22 4", key: "1pflzl" }]
237
+ ];
238
+ const CircleCheckBig$1 = createLucideIcon$1("circle-check-big", __iconNode$qb);
239
239
  /**
240
240
  * @license lucide-react v0.552.0 - ISC
241
241
  *
@@ -1554,6 +1554,7 @@ const DependencyRow = ({ dependency }) => {
1554
1554
  borderRadius: `${theme2.radii[1]}px`,
1555
1555
  fontSize: `${theme2.fontSizes[0]}px`,
1556
1556
  fontWeight: theme2.fontWeights.medium,
1557
+ fontFamily: theme2.fonts.body,
1557
1558
  minWidth: "36px",
1558
1559
  textAlign: "center"
1559
1560
  };
@@ -1616,11 +1617,12 @@ const DependencyRow = ({ dependency }) => {
1616
1617
  display: "flex",
1617
1618
  alignItems: "center",
1618
1619
  justifyContent: "space-between",
1619
- padding: `${theme2.space[2]}px ${theme2.space[3]}px`,
1620
+ padding: `${theme2.space[3]}px ${theme2.space[2]}px`,
1620
1621
  backgroundColor: theme2.colors.background,
1621
- borderRadius: `${theme2.radii[1]}px`,
1622
+ borderRadius: 0,
1622
1623
  fontSize: `${theme2.fontSizes[1]}px`,
1623
- border: `1px solid ${theme2.colors.border}`,
1624
+ fontFamily: theme2.fonts.body,
1625
+ borderBottom: `1px solid ${theme2.colors.border}`,
1624
1626
  transition: "all 0.2s"
1625
1627
  },
1626
1628
  onMouseEnter: () => setIsHovered(true),
@@ -1692,7 +1694,16 @@ const DependencyRow = ({ dependency }) => {
1692
1694
  children: copied ? /* @__PURE__ */ jsx(Check$1, { size: 12 }) : /* @__PURE__ */ jsx(Copy$1, { size: 12 })
1693
1695
  }
1694
1696
  ),
1695
- /* @__PURE__ */ jsx("span", { style: { color: theme2.colors.textSecondary }, children: dependency.version })
1697
+ /* @__PURE__ */ jsx(
1698
+ "span",
1699
+ {
1700
+ style: {
1701
+ color: theme2.colors.textSecondary,
1702
+ fontFamily: theme2.fonts.body
1703
+ },
1704
+ children: dependency.version
1705
+ }
1706
+ )
1696
1707
  ]
1697
1708
  }
1698
1709
  )
@@ -1719,8 +1730,7 @@ const FilterBar = ({
1719
1730
  {
1720
1731
  style: {
1721
1732
  display: "flex",
1722
- flexDirection: "column",
1723
- gap: `${theme2.space[2]}px`
1733
+ flexDirection: "column"
1724
1734
  },
1725
1735
  children: [
1726
1736
  /* @__PURE__ */ jsxs(
@@ -1753,9 +1763,10 @@ const FilterBar = ({
1753
1763
  onChange: (e2) => onSearchChange(e2.target.value),
1754
1764
  style: {
1755
1765
  width: "100%",
1756
- padding: `${theme2.space[2]}px ${theme2.space[5]}px`,
1757
- borderRadius: `${theme2.radii[2]}px`,
1758
- border: `1px solid ${theme2.colors.border}`,
1766
+ padding: `${theme2.space[3]}px ${theme2.space[5]}px`,
1767
+ borderRadius: 0,
1768
+ border: "none",
1769
+ borderBottom: `1px solid ${theme2.colors.border}`,
1759
1770
  backgroundColor: theme2.colors.backgroundSecondary,
1760
1771
  color: theme2.colors.text,
1761
1772
  fontSize: `${theme2.fontSizes[1]}px`,
@@ -1788,7 +1799,7 @@ const FilterBar = ({
1788
1799
  ]
1789
1800
  }
1790
1801
  ),
1791
- showFilters && /* @__PURE__ */ jsx("div", { style: { display: "flex", gap: `${theme2.space[1]}px`, width: "100%" }, children: availableFilters.map((type2) => {
1802
+ showFilters && /* @__PURE__ */ jsx("div", { style: { display: "flex", width: "100%" }, children: availableFilters.map((type2) => {
1792
1803
  const isActive = activeFilters.has(type2);
1793
1804
  return /* @__PURE__ */ jsxs(
1794
1805
  "button",
@@ -1796,12 +1807,13 @@ const FilterBar = ({
1796
1807
  onClick: () => onToggleFilter(type2),
1797
1808
  style: {
1798
1809
  flex: 1,
1799
- padding: `${theme2.space[1]}px ${theme2.space[2]}px`,
1810
+ padding: `${theme2.space[2]}px ${theme2.space[2]}px`,
1800
1811
  fontSize: `${theme2.fontSizes[0]}px`,
1801
1812
  fontWeight: theme2.fontWeights.medium,
1802
1813
  fontFamily: theme2.fonts.body,
1803
- borderRadius: `${theme2.radii[1]}px`,
1804
- border: `1px solid ${isActive ? theme2.colors.primary : theme2.colors.border}`,
1814
+ borderRadius: 0,
1815
+ border: "none",
1816
+ borderRight: `1px solid ${theme2.colors.border}`,
1805
1817
  backgroundColor: isActive ? `${theme2.colors.primary}20` : theme2.colors.backgroundSecondary,
1806
1818
  color: isActive ? theme2.colors.primary : theme2.colors.text,
1807
1819
  cursor: "pointer",
@@ -2565,6 +2577,110 @@ const OtherScriptsSection = ({
2565
2577
  )
2566
2578
  ] });
2567
2579
  };
2580
+ function parseEnvJson(content2) {
2581
+ const parsed = JSON.parse(content2);
2582
+ if (!parsed.variables || !Array.isArray(parsed.variables)) {
2583
+ throw new Error('Invalid env.json: missing "variables" array');
2584
+ }
2585
+ return parsed.variables.map((v2) => ({
2586
+ name: v2.name,
2587
+ description: v2.description,
2588
+ required: v2.required ?? false,
2589
+ default: v2.default,
2590
+ example: v2.example,
2591
+ group: v2.group,
2592
+ link: v2.link
2593
+ }));
2594
+ }
2595
+ const urlPattern = /https?:\/\/[^\s)>\]]+/gi;
2596
+ function parseDotEnv(content2) {
2597
+ const lines = content2.split("\n");
2598
+ const variables = [];
2599
+ const commentBuffer = [];
2600
+ let currentGroup = void 0;
2601
+ const sectionPatterns = [
2602
+ /^#\s*===\s*(.+?)\s*===\s*$/,
2603
+ // # === Section ===
2604
+ /^##\s+(.+?)\s*$/,
2605
+ // ## Section
2606
+ /^#\s*\[(.+?)\]\s*$/
2607
+ // # [Section]
2608
+ ];
2609
+ for (const line of lines) {
2610
+ const trimmed = line.trim();
2611
+ if (!trimmed) {
2612
+ commentBuffer.length = 0;
2613
+ continue;
2614
+ }
2615
+ if (trimmed.startsWith("#")) {
2616
+ let isSection = false;
2617
+ for (const pattern of sectionPatterns) {
2618
+ const sectionMatch = trimmed.match(pattern);
2619
+ if (sectionMatch) {
2620
+ currentGroup = sectionMatch[1].trim();
2621
+ commentBuffer.length = 0;
2622
+ isSection = true;
2623
+ break;
2624
+ }
2625
+ }
2626
+ if (!isSection) {
2627
+ commentBuffer.push(trimmed.slice(1).trim());
2628
+ }
2629
+ continue;
2630
+ }
2631
+ const match = trimmed.match(/^([A-Z_][A-Z0-9_]*)=(.*)$/i);
2632
+ if (match) {
2633
+ const [, name2, value] = match;
2634
+ let required = false;
2635
+ let link2 = void 0;
2636
+ const descriptionParts = [];
2637
+ for (const comment2 of commentBuffer) {
2638
+ const lowerComment = comment2.toLowerCase();
2639
+ if (!link2) {
2640
+ const urlMatch = comment2.match(urlPattern);
2641
+ if (urlMatch) {
2642
+ link2 = urlMatch[0];
2643
+ }
2644
+ }
2645
+ if (lowerComment === "required" || lowerComment === "(required)") {
2646
+ required = true;
2647
+ } else if (lowerComment.includes("required")) {
2648
+ required = true;
2649
+ descriptionParts.push(
2650
+ comment2.replace(/\s*\(?\s*required\s*\)?\s*/gi, "").trim()
2651
+ );
2652
+ } else {
2653
+ descriptionParts.push(comment2);
2654
+ }
2655
+ }
2656
+ const description = descriptionParts.filter(Boolean).join(" ") || void 0;
2657
+ const defaultValue = value.trim() || void 0;
2658
+ variables.push({
2659
+ name: name2,
2660
+ description,
2661
+ required,
2662
+ default: defaultValue,
2663
+ example: defaultValue,
2664
+ group: currentGroup,
2665
+ link: link2
2666
+ });
2667
+ commentBuffer.length = 0;
2668
+ }
2669
+ }
2670
+ return variables;
2671
+ }
2672
+ function parseEnvFile(content2, fileType) {
2673
+ if (fileType === "json") {
2674
+ return {
2675
+ variables: parseEnvJson(content2),
2676
+ format: "json"
2677
+ };
2678
+ }
2679
+ return {
2680
+ variables: parseDotEnv(content2),
2681
+ format: "dotenv"
2682
+ };
2683
+ }
2568
2684
  const dependencyTypeOrder = {
2569
2685
  peer: 0,
2570
2686
  production: 1,
@@ -2594,369 +2710,42 @@ function extractDependencies(packageLayer) {
2594
2710
  return a2.name.localeCompare(b2.name);
2595
2711
  });
2596
2712
  }
2597
- function findInternalDependencies(pkg, allPackages) {
2598
- const currentName = pkg.packageData.name;
2599
- const allDeps = /* @__PURE__ */ new Set([
2600
- ...Object.keys(pkg.packageData.dependencies || {}),
2601
- ...Object.keys(pkg.packageData.devDependencies || {}),
2602
- ...Object.keys(pkg.packageData.peerDependencies || {})
2603
- ]);
2604
- const dependsOn = allPackages.filter(
2605
- (p2) => p2.packageData.name !== currentName && allDeps.has(p2.packageData.name)
2606
- );
2607
- const usedBy = allPackages.filter((other) => {
2608
- if (other.packageData.name === currentName) return false;
2609
- const otherDeps = /* @__PURE__ */ new Set([
2610
- ...Object.keys(other.packageData.dependencies || {}),
2611
- ...Object.keys(other.packageData.devDependencies || {}),
2612
- ...Object.keys(other.packageData.peerDependencies || {})
2613
- ]);
2614
- return otherDeps.has(currentName);
2615
- });
2616
- return { dependsOn, usedBy };
2617
- }
2618
- const PackageSummaryCard = ({
2619
- pkg,
2620
- allPackages,
2621
- onClick,
2622
- onHover
2623
- }) => {
2624
- var _a, _b;
2625
- const { theme: theme2 } = useTheme();
2626
- const deps = pkg.packageData.dependencies || {};
2627
- const devDeps = pkg.packageData.devDependencies || {};
2628
- const peerDeps = pkg.packageData.peerDependencies || {};
2629
- const totalDeps = Object.keys(deps).length + Object.keys(devDeps).length + Object.keys(peerDeps).length;
2630
- const configFilesArray = pkg.configFiles ? Object.values(pkg.configFiles).filter((c2) => c2 == null ? void 0 : c2.exists) : [];
2631
- configFilesArray.filter((c2) => !(c2 == null ? void 0 : c2.isInherited)).length;
2632
- const inheritedConfigs = configFilesArray.filter(
2633
- (c2) => c2 == null ? void 0 : c2.isInherited
2634
- ).length;
2635
- const commands = ((_a = pkg.packageData.availableCommands) == null ? void 0 : _a.length) || 0;
2636
- const { dependsOn, usedBy } = useMemo(
2637
- () => findInternalDependencies(pkg, allPackages),
2638
- [pkg, allPackages]
2639
- );
2640
- const hasInternalDeps = dependsOn.length > 0 || usedBy.length > 0;
2641
- const packageRole = useMemo(() => {
2642
- if (dependsOn.length === 0 && usedBy.length === 0) {
2643
- return null;
2644
- }
2645
- if (dependsOn.length === 0 && usedBy.length > 0) {
2646
- return { label: "core", icon: Box$1, color: "#10b981" };
2647
- }
2648
- if (dependsOn.length > 0 && usedBy.length === 0) {
2649
- return { label: "app", icon: Layers$1, color: "#8b5cf6" };
2650
- }
2651
- return { label: "shared", icon: LayoutGrid$1, color: "#f59e0b" };
2652
- }, [dependsOn.length, usedBy.length]);
2653
- return /* @__PURE__ */ jsxs(
2654
- "button",
2655
- {
2656
- onClick,
2657
- style: {
2658
- display: "flex",
2659
- flexDirection: "column",
2660
- gap: "8px",
2661
- padding: "12px",
2662
- backgroundColor: theme2.colors.backgroundSecondary,
2663
- border: `1px solid ${theme2.colors.border}`,
2664
- borderRadius: "0",
2665
- cursor: "pointer",
2666
- textAlign: "left",
2667
- transition: "all 0.15s ease",
2668
- width: "100%"
2669
- },
2670
- onMouseEnter: (e2) => {
2671
- e2.currentTarget.style.borderColor = theme2.colors.primary;
2672
- e2.currentTarget.style.backgroundColor = theme2.colors.backgroundTertiary;
2673
- onHover == null ? void 0 : onHover(pkg);
2674
- },
2675
- onMouseLeave: (e2) => {
2676
- e2.currentTarget.style.borderColor = theme2.colors.border;
2677
- e2.currentTarget.style.backgroundColor = theme2.colors.backgroundSecondary;
2678
- onHover == null ? void 0 : onHover(null);
2679
- },
2680
- children: [
2681
- /* @__PURE__ */ jsxs("div", { style: { display: "flex", alignItems: "center", gap: "8px" }, children: [
2682
- /* @__PURE__ */ jsx(
2683
- PackageManagerIcon,
2684
- {
2685
- packageManager: pkg.packageData.packageManager,
2686
- size: 20
2687
- }
2688
- ),
2689
- /* @__PURE__ */ jsxs("div", { style: { flex: 1, minWidth: 0 }, children: [
2690
- /* @__PURE__ */ jsx(
2691
- "div",
2692
- {
2693
- style: {
2694
- fontSize: theme2.fontSizes[2],
2695
- fontWeight: theme2.fontWeights.semibold,
2696
- fontFamily: theme2.fonts.body,
2697
- color: theme2.colors.text,
2698
- overflow: "hidden",
2699
- textOverflow: "ellipsis",
2700
- whiteSpace: "nowrap"
2701
- },
2702
- children: pkg.packageData.name
2703
- }
2704
- ),
2705
- /* @__PURE__ */ jsxs(
2706
- "div",
2707
- {
2708
- style: {
2709
- fontSize: theme2.fontSizes[0],
2710
- fontFamily: theme2.fonts.body,
2711
- color: theme2.colors.textSecondary
2712
- },
2713
- children: [
2714
- pkg.packageData.path || "/",
2715
- pkg.packageData.version && ` • v${pkg.packageData.version}`
2716
- ]
2717
- }
2718
- )
2719
- ] }),
2720
- pkg.packageData.isMonorepoRoot && ((_b = pkg.packageData.monorepoMetadata) == null ? void 0 : _b.orchestrator) && /* @__PURE__ */ jsx(
2721
- OrchestratorBadge,
2722
- {
2723
- orchestrator: pkg.packageData.monorepoMetadata.orchestrator,
2724
- rootRole: pkg.packageData.monorepoMetadata.rootRole,
2725
- size: "sm"
2726
- }
2727
- ),
2728
- packageRole && /* @__PURE__ */ jsxs(
2729
- "span",
2730
- {
2731
- style: {
2732
- display: "flex",
2733
- alignItems: "center",
2734
- gap: "4px",
2735
- padding: "3px 8px",
2736
- backgroundColor: packageRole.color + "20",
2737
- color: packageRole.color,
2738
- borderRadius: "4px",
2739
- fontSize: theme2.fontSizes[0],
2740
- fontWeight: theme2.fontWeights.medium,
2741
- fontFamily: theme2.fonts.body,
2742
- flexShrink: 0
2743
- },
2744
- children: [
2745
- /* @__PURE__ */ jsx(packageRole.icon, { size: 12 }),
2746
- packageRole.label
2747
- ]
2748
- }
2749
- ),
2750
- /* @__PURE__ */ jsx(ChevronRight$1, { size: 16, color: theme2.colors.textSecondary })
2751
- ] }),
2752
- (pkg.packageData.description || pkg.packageData.license) && /* @__PURE__ */ jsxs(
2753
- "div",
2754
- {
2755
- style: {
2756
- display: "flex",
2757
- flexDirection: "column",
2758
- gap: "4px"
2759
- },
2760
- children: [
2761
- pkg.packageData.description && /* @__PURE__ */ jsx(
2762
- "div",
2763
- {
2764
- style: {
2765
- fontSize: theme2.fontSizes[0],
2766
- fontFamily: theme2.fonts.body,
2767
- color: theme2.colors.textSecondary,
2768
- lineHeight: 1.4,
2769
- overflow: "hidden",
2770
- display: "-webkit-box",
2771
- WebkitLineClamp: 2,
2772
- WebkitBoxOrient: "vertical"
2773
- },
2774
- children: pkg.packageData.description
2775
- }
2776
- ),
2777
- pkg.packageData.license && /* @__PURE__ */ jsx(
2778
- "div",
2779
- {
2780
- style: {
2781
- display: "flex",
2782
- alignItems: "center",
2783
- gap: "4px",
2784
- fontSize: theme2.fontSizes[0]
2785
- },
2786
- children: /* @__PURE__ */ jsx(
2787
- "span",
2788
- {
2789
- style: {
2790
- padding: "1px 6px",
2791
- backgroundColor: theme2.colors.textSecondary + "15",
2792
- color: theme2.colors.textSecondary,
2793
- borderRadius: "3px",
2794
- fontWeight: theme2.fontWeights.medium,
2795
- fontFamily: theme2.fonts.body
2796
- },
2797
- children: pkg.packageData.license
2798
- }
2799
- )
2800
- }
2801
- )
2802
- ]
2803
- }
2804
- ),
2805
- hasInternalDeps && /* @__PURE__ */ jsxs(
2806
- "div",
2807
- {
2808
- style: {
2809
- display: "flex",
2810
- flexDirection: "column",
2811
- gap: "4px",
2812
- fontSize: theme2.fontSizes[0]
2813
- },
2814
- children: [
2815
- dependsOn.length > 0 && /* @__PURE__ */ jsxs(
2816
- "div",
2817
- {
2818
- style: {
2819
- display: "flex",
2820
- alignItems: "center",
2821
- gap: "6px",
2822
- flexWrap: "wrap"
2823
- },
2824
- children: [
2825
- /* @__PURE__ */ jsxs(
2826
- "span",
2827
- {
2828
- style: {
2829
- color: theme2.colors.textSecondary,
2830
- fontFamily: theme2.fonts.body,
2831
- display: "flex",
2832
- alignItems: "center",
2833
- gap: "2px"
2834
- },
2835
- children: [
2836
- /* @__PURE__ */ jsx(ArrowRight$1, { size: 10 }),
2837
- "uses"
2838
- ]
2839
- }
2840
- ),
2841
- dependsOn.map((dep) => /* @__PURE__ */ jsx(
2842
- "span",
2843
- {
2844
- style: {
2845
- padding: "2px 6px",
2846
- backgroundColor: theme2.colors.primary + "15",
2847
- color: theme2.colors.primary,
2848
- borderRadius: "4px",
2849
- fontWeight: theme2.fontWeights.medium,
2850
- fontFamily: theme2.fonts.body
2851
- },
2852
- children: dep.packageData.name
2853
- },
2854
- dep.id
2855
- ))
2856
- ]
2857
- }
2858
- ),
2859
- usedBy.length > 0 && /* @__PURE__ */ jsxs(
2860
- "div",
2861
- {
2862
- style: {
2863
- display: "flex",
2864
- alignItems: "center",
2865
- gap: "6px",
2866
- flexWrap: "wrap"
2867
- },
2868
- children: [
2869
- /* @__PURE__ */ jsx(
2870
- "span",
2871
- {
2872
- style: {
2873
- color: theme2.colors.textSecondary,
2874
- fontFamily: theme2.fonts.body
2875
- },
2876
- children: "used by"
2877
- }
2878
- ),
2879
- usedBy.map((dep) => /* @__PURE__ */ jsx(
2880
- "span",
2881
- {
2882
- style: {
2883
- padding: "2px 6px",
2884
- backgroundColor: theme2.colors.textSecondary + "20",
2885
- color: theme2.colors.textSecondary,
2886
- borderRadius: "4px",
2887
- fontWeight: theme2.fontWeights.medium,
2888
- fontFamily: theme2.fonts.body
2889
- },
2890
- children: dep.packageData.name
2891
- },
2892
- dep.id
2893
- ))
2894
- ]
2895
- }
2896
- )
2897
- ]
2898
- }
2899
- ),
2900
- /* @__PURE__ */ jsxs(
2901
- "div",
2902
- {
2903
- style: {
2904
- display: "flex",
2905
- gap: "12px",
2906
- fontSize: theme2.fontSizes[0],
2907
- fontFamily: theme2.fonts.body,
2908
- color: theme2.colors.textSecondary
2909
- },
2910
- children: [
2911
- /* @__PURE__ */ jsxs("div", { style: { display: "flex", alignItems: "center", gap: "4px" }, children: [
2912
- /* @__PURE__ */ jsx(Package$1, { size: 12 }),
2913
- /* @__PURE__ */ jsxs("span", { children: [
2914
- totalDeps,
2915
- " deps"
2916
- ] })
2917
- ] }),
2918
- /* @__PURE__ */ jsxs("div", { style: { display: "flex", alignItems: "center", gap: "4px" }, children: [
2919
- /* @__PURE__ */ jsx(Settings$1, { size: 12 }),
2920
- /* @__PURE__ */ jsxs("span", { children: [
2921
- configFilesArray.length,
2922
- " configs",
2923
- inheritedConfigs > 0 && /* @__PURE__ */ jsxs("span", { style: { color: theme2.colors.primary }, children: [
2924
- " ",
2925
- "(",
2926
- inheritedConfigs,
2927
- "↑)"
2928
- ] })
2929
- ] })
2930
- ] }),
2931
- /* @__PURE__ */ jsxs("div", { style: { display: "flex", alignItems: "center", gap: "4px" }, children: [
2932
- /* @__PURE__ */ jsx(Terminal$1, { size: 12 }),
2933
- /* @__PURE__ */ jsxs("span", { children: [
2934
- commands,
2935
- " commands"
2936
- ] })
2937
- ] })
2938
- ]
2939
- }
2940
- )
2941
- ]
2942
- }
2943
- );
2944
- };
2945
- const PackageCard = ({
2713
+ const PackageDetailCard = ({
2946
2714
  pkg,
2947
2715
  isExpanded,
2948
2716
  onToggle,
2949
2717
  onCommandClick,
2950
2718
  onConfigClick,
2951
2719
  onPackageClick,
2952
- standalone = false
2720
+ standalone = false,
2721
+ readFile
2953
2722
  }) => {
2954
- var _a, _b, _c, _d, _e2, _f, _g, _h;
2723
+ var _a, _b, _c, _d, _e2, _f, _g, _h, _i;
2955
2724
  const { theme: theme2 } = useTheme();
2956
2725
  const [activeTab, setActiveTab] = useState("dependencies");
2957
2726
  const [activeFilters, setActiveFilters] = useState(/* @__PURE__ */ new Set());
2958
2727
  const [searchQuery, setSearchQuery] = useState("");
2959
2728
  const [showInfoModal, setShowInfoModal] = useState(false);
2729
+ const [envVariables, setEnvVariables] = useState([]);
2730
+ const [envLoading, setEnvLoading] = useState(false);
2731
+ const [envError, setEnvError] = useState(null);
2732
+ const groupedEnvVariables = useMemo(() => {
2733
+ const groups = /* @__PURE__ */ new Map();
2734
+ for (const variable of envVariables) {
2735
+ const group = variable.group;
2736
+ if (!groups.has(group)) {
2737
+ groups.set(group, []);
2738
+ }
2739
+ groups.get(group).push(variable);
2740
+ }
2741
+ const sortedGroups = Array.from(groups.entries()).sort(([a2], [b2]) => {
2742
+ if (a2 === void 0 && b2 === void 0) return 0;
2743
+ if (a2 === void 0) return 1;
2744
+ if (b2 === void 0) return -1;
2745
+ return a2.localeCompare(b2);
2746
+ });
2747
+ return sortedGroups;
2748
+ }, [envVariables]);
2960
2749
  const configFiles = useMemo(() => {
2961
2750
  if (!pkg.configFiles) return [];
2962
2751
  return Object.entries(pkg.configFiles).filter(([, config]) => config == null ? void 0 : config.exists).map(([name2, config]) => ({ name: name2, ...config }));
@@ -2966,6 +2755,34 @@ const PackageCard = ({
2966
2755
  const inherited = configFiles.filter((c2) => c2.isInherited).length;
2967
2756
  return { local, inherited, total: configFiles.length };
2968
2757
  }, [configFiles]);
2758
+ const envConfig = (_a = pkg.configFiles) == null ? void 0 : _a.envvars;
2759
+ const hasEnvConfig = (envConfig == null ? void 0 : envConfig.exists) ?? false;
2760
+ useEffect(() => {
2761
+ if (activeTab !== "env" || !(envConfig == null ? void 0 : envConfig.exists) || !readFile) {
2762
+ return;
2763
+ }
2764
+ const fetchEnvFile = async () => {
2765
+ setEnvLoading(true);
2766
+ setEnvError(null);
2767
+ try {
2768
+ const filePath = pkg.packageData.path ? `${pkg.packageData.path}/${envConfig.path}` : envConfig.path;
2769
+ const content2 = await readFile(filePath);
2770
+ const result = parseEnvFile(content2, envConfig.type);
2771
+ const sorted = [...result.variables].sort(
2772
+ (a2, b2) => a2.name.localeCompare(b2.name)
2773
+ );
2774
+ setEnvVariables(sorted);
2775
+ } catch (err) {
2776
+ setEnvError(
2777
+ err instanceof Error ? err.message : "Failed to load env file"
2778
+ );
2779
+ setEnvVariables([]);
2780
+ } finally {
2781
+ setEnvLoading(false);
2782
+ }
2783
+ };
2784
+ fetchEnvFile();
2785
+ }, [activeTab, envConfig, readFile, pkg.packageData.path]);
2969
2786
  const commands = pkg.packageData.availableCommands || [];
2970
2787
  const dependencyItems = useMemo(() => extractDependencies(pkg), [pkg]);
2971
2788
  const depCounts = useMemo(
@@ -3085,7 +2902,7 @@ const PackageCard = ({
3085
2902
  title: "Open package folder",
3086
2903
  children: [
3087
2904
  /* @__PURE__ */ jsx(Folder$1, { size: 12 }),
3088
- pkg.packageData.path || "/"
2905
+ pkg.packageData.path || "root"
3089
2906
  ]
3090
2907
  }
3091
2908
  )
@@ -3140,7 +2957,7 @@ const PackageCard = ({
3140
2957
  children: pkg.packageData.license
3141
2958
  }
3142
2959
  ),
3143
- (pkg.packageData.author || ((_a = pkg.packageData.authors) == null ? void 0 : _a[0])) && /* @__PURE__ */ jsxs(
2960
+ (pkg.packageData.author || ((_b = pkg.packageData.authors) == null ? void 0 : _b[0])) && /* @__PURE__ */ jsxs(
3144
2961
  "span",
3145
2962
  {
3146
2963
  style: {
@@ -3150,7 +2967,7 @@ const PackageCard = ({
3150
2967
  },
3151
2968
  children: [
3152
2969
  "by ",
3153
- pkg.packageData.author || ((_b = pkg.packageData.authors) == null ? void 0 : _b[0])
2970
+ pkg.packageData.author || ((_c = pkg.packageData.authors) == null ? void 0 : _c[0])
3154
2971
  ]
3155
2972
  }
3156
2973
  )
@@ -3174,6 +2991,13 @@ const PackageCard = ({
3174
2991
  label: "Dependencies",
3175
2992
  count: dependencyItems.length
3176
2993
  },
2994
+ ...hasEnvConfig ? [
2995
+ {
2996
+ id: "env",
2997
+ label: "Env",
2998
+ count: 1
2999
+ }
3000
+ ] : [],
3177
3001
  {
3178
3002
  id: "configs",
3179
3003
  label: "Configs",
@@ -3183,10 +3007,10 @@ const PackageCard = ({
3183
3007
  {
3184
3008
  id: "lenses",
3185
3009
  label: "Lenses",
3186
- count: ((_c = pkg.qualityMetrics) == null ? void 0 : _c.lensReadiness) ? Object.values(pkg.qualityMetrics.lensReadiness).filter(
3010
+ count: ((_d = pkg.qualityMetrics) == null ? void 0 : _d.lensReadiness) ? Object.values(pkg.qualityMetrics.lensReadiness).filter(
3187
3011
  (l2) => l2.ready
3188
3012
  ).length : 0,
3189
- total: ((_d = pkg.qualityMetrics) == null ? void 0 : _d.lensReadiness) ? Object.keys(pkg.qualityMetrics.lensReadiness).length : 0
3013
+ total: ((_e2 = pkg.qualityMetrics) == null ? void 0 : _e2.lensReadiness) ? Object.keys(pkg.qualityMetrics.lensReadiness).length : 0
3190
3014
  }
3191
3015
  ].map((tab2) => /* @__PURE__ */ jsxs(
3192
3016
  "button",
@@ -3237,6 +3061,259 @@ const PackageCard = ({
3237
3061
  overflow: "auto"
3238
3062
  },
3239
3063
  children: [
3064
+ activeTab === "env" && envConfig && /* @__PURE__ */ jsxs("div", { children: [
3065
+ /* @__PURE__ */ jsxs(
3066
+ "div",
3067
+ {
3068
+ style: {
3069
+ display: "flex",
3070
+ alignItems: "center",
3071
+ justifyContent: "space-between",
3072
+ padding: `${theme2.space[2]}px ${theme2.space[4]}px`,
3073
+ borderBottom: `1px solid ${theme2.colors.border}`
3074
+ },
3075
+ children: [
3076
+ /* @__PURE__ */ jsx(
3077
+ "span",
3078
+ {
3079
+ style: {
3080
+ fontSize: theme2.fontSizes[0],
3081
+ fontFamily: theme2.fonts.body,
3082
+ color: theme2.colors.textSecondary
3083
+ },
3084
+ children: envVariables.length > 0 ? `${envVariables.length} variables` : "Environment Variables"
3085
+ }
3086
+ ),
3087
+ /* @__PURE__ */ jsxs(
3088
+ "button",
3089
+ {
3090
+ onClick: () => onConfigClick == null ? void 0 : onConfigClick(envConfig),
3091
+ style: {
3092
+ display: "flex",
3093
+ alignItems: "center",
3094
+ gap: "4px",
3095
+ padding: "4px 8px",
3096
+ backgroundColor: "transparent",
3097
+ border: `1px solid ${theme2.colors.border}`,
3098
+ borderRadius: "4px",
3099
+ cursor: "pointer",
3100
+ color: theme2.colors.textSecondary,
3101
+ fontSize: theme2.fontSizes[0],
3102
+ fontFamily: theme2.fonts.body
3103
+ },
3104
+ title: `Open ${envConfig.path}`,
3105
+ children: [
3106
+ /* @__PURE__ */ jsx(FileText$1, { size: 12 }),
3107
+ envConfig.path
3108
+ ]
3109
+ }
3110
+ )
3111
+ ]
3112
+ }
3113
+ ),
3114
+ envLoading && /* @__PURE__ */ jsx(
3115
+ "div",
3116
+ {
3117
+ style: {
3118
+ padding: "20px",
3119
+ textAlign: "center",
3120
+ color: theme2.colors.textSecondary,
3121
+ fontSize: theme2.fontSizes[1],
3122
+ fontFamily: theme2.fonts.body
3123
+ },
3124
+ children: "Loading environment variables..."
3125
+ }
3126
+ ),
3127
+ envError && /* @__PURE__ */ jsxs(
3128
+ "div",
3129
+ {
3130
+ style: {
3131
+ padding: "12px",
3132
+ backgroundColor: theme2.colors.error + "15",
3133
+ border: `1px solid ${theme2.colors.error}30`,
3134
+ borderRadius: "6px",
3135
+ color: theme2.colors.error,
3136
+ fontSize: theme2.fontSizes[1],
3137
+ fontFamily: theme2.fonts.body,
3138
+ display: "flex",
3139
+ alignItems: "center",
3140
+ gap: "8px"
3141
+ },
3142
+ children: [
3143
+ /* @__PURE__ */ jsx(CircleAlert$1, { size: 16 }),
3144
+ envError
3145
+ ]
3146
+ }
3147
+ ),
3148
+ !envLoading && !envError && envVariables.length > 0 && /* @__PURE__ */ jsx(
3149
+ "div",
3150
+ {
3151
+ style: {
3152
+ display: "flex",
3153
+ flexDirection: "column"
3154
+ },
3155
+ children: groupedEnvVariables.map(([groupName, variables]) => /* @__PURE__ */ jsxs("div", { children: [
3156
+ groupName && /* @__PURE__ */ jsx(
3157
+ "div",
3158
+ {
3159
+ style: {
3160
+ padding: "8px 12px",
3161
+ backgroundColor: theme2.colors.backgroundTertiary,
3162
+ borderBottom: `1px solid ${theme2.colors.border}`,
3163
+ fontSize: theme2.fontSizes[0],
3164
+ fontFamily: theme2.fonts.body,
3165
+ fontWeight: theme2.fontWeights.semibold,
3166
+ color: theme2.colors.textSecondary,
3167
+ textTransform: "uppercase",
3168
+ letterSpacing: "0.5px"
3169
+ },
3170
+ children: groupName
3171
+ }
3172
+ ),
3173
+ variables.map((variable) => /* @__PURE__ */ jsxs(
3174
+ "div",
3175
+ {
3176
+ style: {
3177
+ padding: `${theme2.space[3]}px ${theme2.space[4]}px`,
3178
+ backgroundColor: theme2.colors.background,
3179
+ borderBottom: `1px solid ${theme2.colors.border}`
3180
+ },
3181
+ children: [
3182
+ /* @__PURE__ */ jsxs(
3183
+ "div",
3184
+ {
3185
+ style: {
3186
+ display: "flex",
3187
+ alignItems: "center",
3188
+ gap: "8px",
3189
+ marginBottom: variable.description ? "6px" : 0
3190
+ },
3191
+ children: [
3192
+ /* @__PURE__ */ jsx(
3193
+ "code",
3194
+ {
3195
+ style: {
3196
+ fontSize: theme2.fontSizes[1],
3197
+ fontFamily: theme2.fonts.monospace,
3198
+ color: theme2.colors.text,
3199
+ fontWeight: theme2.fontWeights.medium
3200
+ },
3201
+ children: variable.name
3202
+ }
3203
+ ),
3204
+ variable.link && /* @__PURE__ */ jsx(
3205
+ "a",
3206
+ {
3207
+ href: variable.link,
3208
+ target: "_blank",
3209
+ rel: "noopener noreferrer",
3210
+ style: {
3211
+ display: "flex",
3212
+ alignItems: "center",
3213
+ color: theme2.colors.accent,
3214
+ opacity: 0.7,
3215
+ transition: "opacity 0.15s ease"
3216
+ },
3217
+ onMouseEnter: (e2) => {
3218
+ e2.currentTarget.style.opacity = "1";
3219
+ },
3220
+ onMouseLeave: (e2) => {
3221
+ e2.currentTarget.style.opacity = "0.7";
3222
+ },
3223
+ title: variable.link,
3224
+ children: /* @__PURE__ */ jsx(ExternalLink$1, { size: 12 })
3225
+ }
3226
+ ),
3227
+ variable.required ? /* @__PURE__ */ jsxs(
3228
+ "span",
3229
+ {
3230
+ style: {
3231
+ display: "flex",
3232
+ alignItems: "center",
3233
+ gap: "3px",
3234
+ padding: "2px 6px",
3235
+ backgroundColor: theme2.colors.error + "20",
3236
+ color: theme2.colors.error,
3237
+ borderRadius: "4px",
3238
+ fontSize: theme2.fontSizes[0],
3239
+ fontFamily: theme2.fonts.body,
3240
+ fontWeight: theme2.fontWeights.medium
3241
+ },
3242
+ children: [
3243
+ /* @__PURE__ */ jsx(CircleAlert$1, { size: 10 }),
3244
+ "required"
3245
+ ]
3246
+ }
3247
+ ) : /* @__PURE__ */ jsxs(
3248
+ "span",
3249
+ {
3250
+ style: {
3251
+ display: "flex",
3252
+ alignItems: "center",
3253
+ gap: "3px",
3254
+ padding: "2px 6px",
3255
+ backgroundColor: theme2.colors.success + "20",
3256
+ color: theme2.colors.success,
3257
+ borderRadius: "4px",
3258
+ fontSize: theme2.fontSizes[0],
3259
+ fontFamily: theme2.fonts.body
3260
+ },
3261
+ children: [
3262
+ /* @__PURE__ */ jsx(CircleCheckBig$1, { size: 10 }),
3263
+ "optional"
3264
+ ]
3265
+ }
3266
+ ),
3267
+ variable.default && /* @__PURE__ */ jsxs(
3268
+ "span",
3269
+ {
3270
+ style: {
3271
+ fontSize: theme2.fontSizes[0],
3272
+ fontFamily: theme2.fonts.monospace,
3273
+ color: theme2.colors.textSecondary
3274
+ },
3275
+ children: [
3276
+ "default: ",
3277
+ variable.default
3278
+ ]
3279
+ }
3280
+ )
3281
+ ]
3282
+ }
3283
+ ),
3284
+ variable.description && /* @__PURE__ */ jsx(
3285
+ "div",
3286
+ {
3287
+ style: {
3288
+ fontSize: theme2.fontSizes[1],
3289
+ fontFamily: theme2.fonts.body,
3290
+ color: theme2.colors.textSecondary,
3291
+ lineHeight: 1.4
3292
+ },
3293
+ children: variable.description
3294
+ }
3295
+ )
3296
+ ]
3297
+ },
3298
+ variable.name
3299
+ ))
3300
+ ] }, groupName ?? "__ungrouped__"))
3301
+ }
3302
+ ),
3303
+ !envLoading && !envError && envVariables.length === 0 && !readFile && /* @__PURE__ */ jsx(
3304
+ "div",
3305
+ {
3306
+ style: {
3307
+ padding: "20px",
3308
+ textAlign: "center",
3309
+ color: theme2.colors.textSecondary,
3310
+ fontSize: theme2.fontSizes[1],
3311
+ fontFamily: theme2.fonts.body
3312
+ },
3313
+ children: "Click the file to view environment variables"
3314
+ }
3315
+ )
3316
+ ] }),
3240
3317
  activeTab === "configs" && /* @__PURE__ */ jsx("div", { style: { padding: "12px" }, children: /* @__PURE__ */ jsx(ConfigList, { configs: configFiles, onConfigClick }) }),
3241
3318
  activeTab === "lenses" && /* @__PURE__ */ jsxs(
3242
3319
  "div",
@@ -3250,7 +3327,7 @@ const PackageCard = ({
3250
3327
  /* @__PURE__ */ jsx(
3251
3328
  LensReadinessSection,
3252
3329
  {
3253
- lensReadiness: (_e2 = pkg.qualityMetrics) == null ? void 0 : _e2.lensReadiness
3330
+ lensReadiness: (_f = pkg.qualityMetrics) == null ? void 0 : _f.lensReadiness
3254
3331
  }
3255
3332
  ),
3256
3333
  /* @__PURE__ */ jsx(
@@ -3295,7 +3372,6 @@ const PackageCard = ({
3295
3372
  "div",
3296
3373
  {
3297
3374
  style: {
3298
- padding: "12px",
3299
3375
  borderBottom: `1px solid ${theme2.colors.border}`
3300
3376
  },
3301
3377
  children: /* @__PURE__ */ jsx(
@@ -3310,59 +3386,44 @@ const PackageCard = ({
3310
3386
  )
3311
3387
  }
3312
3388
  ),
3313
- /* @__PURE__ */ jsxs(
3389
+ /* @__PURE__ */ jsx(
3314
3390
  "div",
3315
3391
  {
3316
- style: { flex: 1, overflow: "auto", padding: "8px 12px" },
3317
- children: [
3318
- /* @__PURE__ */ jsxs(
3319
- "div",
3320
- {
3321
- style: {
3322
- fontSize: theme2.fontSizes[0],
3323
- fontFamily: theme2.fonts.body,
3324
- color: theme2.colors.textSecondary,
3325
- marginBottom: "8px"
3326
- },
3327
- children: [
3328
- "Showing ",
3329
- filteredDependencies.length,
3330
- " of",
3331
- " ",
3332
- dependencyItems.length
3333
- ]
3334
- }
3335
- ),
3336
- /* @__PURE__ */ jsx(
3337
- "div",
3338
- {
3339
- style: {
3340
- display: "flex",
3341
- flexDirection: "column",
3342
- gap: "4px"
3343
- },
3344
- children: filteredDependencies.length === 0 ? /* @__PURE__ */ jsx(
3345
- "div",
3346
- {
3347
- style: {
3348
- padding: "12px",
3349
- textAlign: "center",
3350
- color: theme2.colors.textSecondary,
3351
- fontSize: theme2.fontSizes[1],
3352
- fontFamily: theme2.fonts.body
3353
- },
3354
- children: "No dependencies match your filters"
3355
- }
3356
- ) : filteredDependencies.map((dep) => /* @__PURE__ */ jsx(
3357
- DependencyRow,
3358
- {
3359
- dependency: dep
3392
+ style: {
3393
+ flex: 1,
3394
+ overflow: "auto",
3395
+ scrollbarWidth: "none",
3396
+ msOverflowStyle: "none"
3397
+ },
3398
+ className: "hide-scrollbar",
3399
+ children: /* @__PURE__ */ jsx(
3400
+ "div",
3401
+ {
3402
+ style: {
3403
+ display: "flex",
3404
+ flexDirection: "column"
3405
+ },
3406
+ children: filteredDependencies.length === 0 ? /* @__PURE__ */ jsx(
3407
+ "div",
3408
+ {
3409
+ style: {
3410
+ padding: "12px",
3411
+ textAlign: "center",
3412
+ color: theme2.colors.textSecondary,
3413
+ fontSize: theme2.fontSizes[1],
3414
+ fontFamily: theme2.fonts.body
3360
3415
  },
3361
- `${dep.name}-${dep.dependencyType}`
3362
- ))
3363
- }
3364
- )
3365
- ]
3416
+ children: "No dependencies match your filters"
3417
+ }
3418
+ ) : filteredDependencies.map((dep) => /* @__PURE__ */ jsx(
3419
+ DependencyRow,
3420
+ {
3421
+ dependency: dep
3422
+ },
3423
+ `${dep.name}-${dep.dependencyType}`
3424
+ ))
3425
+ }
3426
+ )
3366
3427
  }
3367
3428
  )
3368
3429
  ] }),
@@ -3469,7 +3530,7 @@ const PackageCard = ({
3469
3530
  title: "Open package folder",
3470
3531
  children: [
3471
3532
  /* @__PURE__ */ jsx(Folder$1, { size: 12 }),
3472
- pkg.packageData.path || "/"
3533
+ pkg.packageData.path || "root"
3473
3534
  ]
3474
3535
  }
3475
3536
  )
@@ -3491,6 +3552,13 @@ const PackageCard = ({
3491
3552
  label: "Deps",
3492
3553
  count: dependencyItems.length
3493
3554
  },
3555
+ ...hasEnvConfig ? [
3556
+ {
3557
+ id: "env",
3558
+ label: "Env",
3559
+ count: 1
3560
+ }
3561
+ ] : [],
3494
3562
  {
3495
3563
  id: "configs",
3496
3564
  label: "Configs",
@@ -3500,10 +3568,10 @@ const PackageCard = ({
3500
3568
  {
3501
3569
  id: "lenses",
3502
3570
  label: "Lenses",
3503
- count: ((_f = pkg.qualityMetrics) == null ? void 0 : _f.lensReadiness) ? Object.values(pkg.qualityMetrics.lensReadiness).filter(
3571
+ count: ((_g = pkg.qualityMetrics) == null ? void 0 : _g.lensReadiness) ? Object.values(pkg.qualityMetrics.lensReadiness).filter(
3504
3572
  (l2) => l2.ready
3505
3573
  ).length : 0,
3506
- total: ((_g = pkg.qualityMetrics) == null ? void 0 : _g.lensReadiness) ? Object.keys(pkg.qualityMetrics.lensReadiness).length : 0
3574
+ total: ((_h = pkg.qualityMetrics) == null ? void 0 : _h.lensReadiness) ? Object.keys(pkg.qualityMetrics.lensReadiness).length : 0
3507
3575
  }
3508
3576
  ].map((tab2) => /* @__PURE__ */ jsxs(
3509
3577
  "button",
@@ -3554,6 +3622,259 @@ const PackageCard = ({
3554
3622
  overflow: "auto"
3555
3623
  },
3556
3624
  children: [
3625
+ activeTab === "env" && envConfig && /* @__PURE__ */ jsxs("div", { children: [
3626
+ /* @__PURE__ */ jsxs(
3627
+ "div",
3628
+ {
3629
+ style: {
3630
+ display: "flex",
3631
+ alignItems: "center",
3632
+ justifyContent: "space-between",
3633
+ padding: `${theme2.space[2]}px ${theme2.space[4]}px`,
3634
+ borderBottom: `1px solid ${theme2.colors.border}`
3635
+ },
3636
+ children: [
3637
+ /* @__PURE__ */ jsx(
3638
+ "span",
3639
+ {
3640
+ style: {
3641
+ fontSize: theme2.fontSizes[0],
3642
+ fontFamily: theme2.fonts.body,
3643
+ color: theme2.colors.textSecondary
3644
+ },
3645
+ children: envVariables.length > 0 ? `${envVariables.length} variables` : "Environment Variables"
3646
+ }
3647
+ ),
3648
+ /* @__PURE__ */ jsxs(
3649
+ "button",
3650
+ {
3651
+ onClick: () => onConfigClick == null ? void 0 : onConfigClick(envConfig),
3652
+ style: {
3653
+ display: "flex",
3654
+ alignItems: "center",
3655
+ gap: "4px",
3656
+ padding: "4px 8px",
3657
+ backgroundColor: "transparent",
3658
+ border: `1px solid ${theme2.colors.border}`,
3659
+ borderRadius: "4px",
3660
+ cursor: "pointer",
3661
+ color: theme2.colors.textSecondary,
3662
+ fontSize: theme2.fontSizes[0],
3663
+ fontFamily: theme2.fonts.body
3664
+ },
3665
+ title: `Open ${envConfig.path}`,
3666
+ children: [
3667
+ /* @__PURE__ */ jsx(FileText$1, { size: 12 }),
3668
+ envConfig.path
3669
+ ]
3670
+ }
3671
+ )
3672
+ ]
3673
+ }
3674
+ ),
3675
+ envLoading && /* @__PURE__ */ jsx(
3676
+ "div",
3677
+ {
3678
+ style: {
3679
+ padding: "20px",
3680
+ textAlign: "center",
3681
+ color: theme2.colors.textSecondary,
3682
+ fontSize: theme2.fontSizes[1],
3683
+ fontFamily: theme2.fonts.body
3684
+ },
3685
+ children: "Loading environment variables..."
3686
+ }
3687
+ ),
3688
+ envError && /* @__PURE__ */ jsxs(
3689
+ "div",
3690
+ {
3691
+ style: {
3692
+ padding: "12px",
3693
+ backgroundColor: theme2.colors.error + "15",
3694
+ border: `1px solid ${theme2.colors.error}30`,
3695
+ borderRadius: "6px",
3696
+ color: theme2.colors.error,
3697
+ fontSize: theme2.fontSizes[1],
3698
+ fontFamily: theme2.fonts.body,
3699
+ display: "flex",
3700
+ alignItems: "center",
3701
+ gap: "8px"
3702
+ },
3703
+ children: [
3704
+ /* @__PURE__ */ jsx(CircleAlert$1, { size: 16 }),
3705
+ envError
3706
+ ]
3707
+ }
3708
+ ),
3709
+ !envLoading && !envError && envVariables.length > 0 && /* @__PURE__ */ jsx(
3710
+ "div",
3711
+ {
3712
+ style: {
3713
+ display: "flex",
3714
+ flexDirection: "column"
3715
+ },
3716
+ children: groupedEnvVariables.map(([groupName, variables]) => /* @__PURE__ */ jsxs("div", { children: [
3717
+ groupName && /* @__PURE__ */ jsx(
3718
+ "div",
3719
+ {
3720
+ style: {
3721
+ padding: "8px 12px",
3722
+ backgroundColor: theme2.colors.backgroundTertiary,
3723
+ borderBottom: `1px solid ${theme2.colors.border}`,
3724
+ fontSize: theme2.fontSizes[0],
3725
+ fontFamily: theme2.fonts.body,
3726
+ fontWeight: theme2.fontWeights.semibold,
3727
+ color: theme2.colors.textSecondary,
3728
+ textTransform: "uppercase",
3729
+ letterSpacing: "0.5px"
3730
+ },
3731
+ children: groupName
3732
+ }
3733
+ ),
3734
+ variables.map((variable) => /* @__PURE__ */ jsxs(
3735
+ "div",
3736
+ {
3737
+ style: {
3738
+ padding: `${theme2.space[3]}px ${theme2.space[4]}px`,
3739
+ backgroundColor: theme2.colors.background,
3740
+ borderBottom: `1px solid ${theme2.colors.border}`
3741
+ },
3742
+ children: [
3743
+ /* @__PURE__ */ jsxs(
3744
+ "div",
3745
+ {
3746
+ style: {
3747
+ display: "flex",
3748
+ alignItems: "center",
3749
+ gap: "8px",
3750
+ marginBottom: variable.description ? "6px" : 0
3751
+ },
3752
+ children: [
3753
+ /* @__PURE__ */ jsx(
3754
+ "code",
3755
+ {
3756
+ style: {
3757
+ fontSize: theme2.fontSizes[1],
3758
+ fontFamily: theme2.fonts.monospace,
3759
+ color: theme2.colors.text,
3760
+ fontWeight: theme2.fontWeights.medium
3761
+ },
3762
+ children: variable.name
3763
+ }
3764
+ ),
3765
+ variable.link && /* @__PURE__ */ jsx(
3766
+ "a",
3767
+ {
3768
+ href: variable.link,
3769
+ target: "_blank",
3770
+ rel: "noopener noreferrer",
3771
+ style: {
3772
+ display: "flex",
3773
+ alignItems: "center",
3774
+ color: theme2.colors.accent,
3775
+ opacity: 0.7,
3776
+ transition: "opacity 0.15s ease"
3777
+ },
3778
+ onMouseEnter: (e2) => {
3779
+ e2.currentTarget.style.opacity = "1";
3780
+ },
3781
+ onMouseLeave: (e2) => {
3782
+ e2.currentTarget.style.opacity = "0.7";
3783
+ },
3784
+ title: variable.link,
3785
+ children: /* @__PURE__ */ jsx(ExternalLink$1, { size: 12 })
3786
+ }
3787
+ ),
3788
+ variable.required ? /* @__PURE__ */ jsxs(
3789
+ "span",
3790
+ {
3791
+ style: {
3792
+ display: "flex",
3793
+ alignItems: "center",
3794
+ gap: "3px",
3795
+ padding: "2px 6px",
3796
+ backgroundColor: theme2.colors.error + "20",
3797
+ color: theme2.colors.error,
3798
+ borderRadius: "4px",
3799
+ fontSize: theme2.fontSizes[0],
3800
+ fontFamily: theme2.fonts.body,
3801
+ fontWeight: theme2.fontWeights.medium
3802
+ },
3803
+ children: [
3804
+ /* @__PURE__ */ jsx(CircleAlert$1, { size: 10 }),
3805
+ "required"
3806
+ ]
3807
+ }
3808
+ ) : /* @__PURE__ */ jsxs(
3809
+ "span",
3810
+ {
3811
+ style: {
3812
+ display: "flex",
3813
+ alignItems: "center",
3814
+ gap: "3px",
3815
+ padding: "2px 6px",
3816
+ backgroundColor: theme2.colors.success + "20",
3817
+ color: theme2.colors.success,
3818
+ borderRadius: "4px",
3819
+ fontSize: theme2.fontSizes[0],
3820
+ fontFamily: theme2.fonts.body
3821
+ },
3822
+ children: [
3823
+ /* @__PURE__ */ jsx(CircleCheckBig$1, { size: 10 }),
3824
+ "optional"
3825
+ ]
3826
+ }
3827
+ ),
3828
+ variable.default && /* @__PURE__ */ jsxs(
3829
+ "span",
3830
+ {
3831
+ style: {
3832
+ fontSize: theme2.fontSizes[0],
3833
+ fontFamily: theme2.fonts.monospace,
3834
+ color: theme2.colors.textSecondary
3835
+ },
3836
+ children: [
3837
+ "default: ",
3838
+ variable.default
3839
+ ]
3840
+ }
3841
+ )
3842
+ ]
3843
+ }
3844
+ ),
3845
+ variable.description && /* @__PURE__ */ jsx(
3846
+ "div",
3847
+ {
3848
+ style: {
3849
+ fontSize: theme2.fontSizes[1],
3850
+ fontFamily: theme2.fonts.body,
3851
+ color: theme2.colors.textSecondary,
3852
+ lineHeight: 1.4
3853
+ },
3854
+ children: variable.description
3855
+ }
3856
+ )
3857
+ ]
3858
+ },
3859
+ variable.name
3860
+ ))
3861
+ ] }, groupName ?? "__ungrouped__"))
3862
+ }
3863
+ ),
3864
+ !envLoading && !envError && envVariables.length === 0 && !readFile && /* @__PURE__ */ jsx(
3865
+ "div",
3866
+ {
3867
+ style: {
3868
+ padding: "20px",
3869
+ textAlign: "center",
3870
+ color: theme2.colors.textSecondary,
3871
+ fontSize: theme2.fontSizes[1],
3872
+ fontFamily: theme2.fonts.body
3873
+ },
3874
+ children: "Click the file to view environment variables"
3875
+ }
3876
+ )
3877
+ ] }),
3557
3878
  activeTab === "configs" && /* @__PURE__ */ jsx("div", { style: { padding: "12px" }, children: /* @__PURE__ */ jsx(
3558
3879
  ConfigList,
3559
3880
  {
@@ -3565,7 +3886,7 @@ const PackageCard = ({
3565
3886
  /* @__PURE__ */ jsx(
3566
3887
  LensReadinessSection,
3567
3888
  {
3568
- lensReadiness: (_h = pkg.qualityMetrics) == null ? void 0 : _h.lensReadiness
3889
+ lensReadiness: (_i = pkg.qualityMetrics) == null ? void 0 : _i.lensReadiness
3569
3890
  }
3570
3891
  ),
3571
3892
  /* @__PURE__ */ jsx(
@@ -3608,7 +3929,6 @@ const PackageCard = ({
3608
3929
  "div",
3609
3930
  {
3610
3931
  style: {
3611
- padding: "12px",
3612
3932
  borderBottom: `1px solid ${theme2.colors.border}`
3613
3933
  },
3614
3934
  children: /* @__PURE__ */ jsx(
@@ -3623,59 +3943,44 @@ const PackageCard = ({
3623
3943
  )
3624
3944
  }
3625
3945
  ),
3626
- /* @__PURE__ */ jsxs(
3946
+ /* @__PURE__ */ jsx(
3627
3947
  "div",
3628
3948
  {
3629
- style: { flex: 1, overflow: "auto", padding: "8px 12px" },
3630
- children: [
3631
- /* @__PURE__ */ jsxs(
3632
- "div",
3633
- {
3634
- style: {
3635
- fontSize: theme2.fontSizes[0],
3636
- fontFamily: theme2.fonts.body,
3637
- color: theme2.colors.textSecondary,
3638
- marginBottom: "8px"
3639
- },
3640
- children: [
3641
- "Showing ",
3642
- filteredDependencies.length,
3643
- " of",
3644
- " ",
3645
- dependencyItems.length
3646
- ]
3647
- }
3648
- ),
3649
- /* @__PURE__ */ jsx(
3650
- "div",
3651
- {
3652
- style: {
3653
- display: "flex",
3654
- flexDirection: "column",
3655
- gap: "4px"
3656
- },
3657
- children: filteredDependencies.length === 0 ? /* @__PURE__ */ jsx(
3658
- "div",
3659
- {
3660
- style: {
3661
- padding: "12px",
3662
- textAlign: "center",
3663
- color: theme2.colors.textSecondary,
3664
- fontSize: theme2.fontSizes[1],
3665
- fontFamily: theme2.fonts.body
3666
- },
3667
- children: "No dependencies match your filters"
3668
- }
3669
- ) : filteredDependencies.map((dep) => /* @__PURE__ */ jsx(
3670
- DependencyRow,
3671
- {
3672
- dependency: dep
3949
+ style: {
3950
+ flex: 1,
3951
+ overflow: "auto",
3952
+ scrollbarWidth: "none",
3953
+ msOverflowStyle: "none"
3954
+ },
3955
+ className: "hide-scrollbar",
3956
+ children: /* @__PURE__ */ jsx(
3957
+ "div",
3958
+ {
3959
+ style: {
3960
+ display: "flex",
3961
+ flexDirection: "column"
3962
+ },
3963
+ children: filteredDependencies.length === 0 ? /* @__PURE__ */ jsx(
3964
+ "div",
3965
+ {
3966
+ style: {
3967
+ padding: "12px",
3968
+ textAlign: "center",
3969
+ color: theme2.colors.textSecondary,
3970
+ fontSize: theme2.fontSizes[1],
3971
+ fontFamily: theme2.fonts.body
3673
3972
  },
3674
- `${dep.name}-${dep.dependencyType}`
3675
- ))
3676
- }
3677
- )
3678
- ]
3973
+ children: "No dependencies match your filters"
3974
+ }
3975
+ ) : filteredDependencies.map((dep) => /* @__PURE__ */ jsx(
3976
+ DependencyRow,
3977
+ {
3978
+ dependency: dep
3979
+ },
3980
+ `${dep.name}-${dep.dependencyType}`
3981
+ ))
3982
+ }
3983
+ )
3679
3984
  }
3680
3985
  )
3681
3986
  ] }),
@@ -3697,6 +4002,257 @@ const PackageCard = ({
3697
4002
  }
3698
4003
  );
3699
4004
  };
4005
+ function findInternalDependencies(pkg, allPackages) {
4006
+ const currentName = pkg.packageData.name;
4007
+ const allDeps = /* @__PURE__ */ new Set([
4008
+ ...Object.keys(pkg.packageData.dependencies || {}),
4009
+ ...Object.keys(pkg.packageData.devDependencies || {}),
4010
+ ...Object.keys(pkg.packageData.peerDependencies || {})
4011
+ ]);
4012
+ const dependsOn = allPackages.filter(
4013
+ (p2) => p2.packageData.name !== currentName && allDeps.has(p2.packageData.name)
4014
+ );
4015
+ const usedBy = allPackages.filter((other) => {
4016
+ if (other.packageData.name === currentName) return false;
4017
+ const otherDeps = /* @__PURE__ */ new Set([
4018
+ ...Object.keys(other.packageData.dependencies || {}),
4019
+ ...Object.keys(other.packageData.devDependencies || {}),
4020
+ ...Object.keys(other.packageData.peerDependencies || {})
4021
+ ]);
4022
+ return otherDeps.has(currentName);
4023
+ });
4024
+ return { dependsOn, usedBy };
4025
+ }
4026
+ const PackageSummaryCard = ({
4027
+ pkg,
4028
+ allPackages,
4029
+ onClick,
4030
+ onHover
4031
+ }) => {
4032
+ var _a, _b;
4033
+ const { theme: theme2 } = useTheme();
4034
+ const deps = pkg.packageData.dependencies || {};
4035
+ const devDeps = pkg.packageData.devDependencies || {};
4036
+ const peerDeps = pkg.packageData.peerDependencies || {};
4037
+ const totalDeps = Object.keys(deps).length + Object.keys(devDeps).length + Object.keys(peerDeps).length;
4038
+ const configFilesArray = pkg.configFiles ? Object.values(pkg.configFiles).filter((c2) => c2 == null ? void 0 : c2.exists) : [];
4039
+ const inheritedConfigs = configFilesArray.filter(
4040
+ (c2) => c2 == null ? void 0 : c2.isInherited
4041
+ ).length;
4042
+ const commands = ((_a = pkg.packageData.availableCommands) == null ? void 0 : _a.length) || 0;
4043
+ const { dependsOn, usedBy } = useMemo(
4044
+ () => findInternalDependencies(pkg, allPackages),
4045
+ [pkg, allPackages]
4046
+ );
4047
+ const packageRole = useMemo(() => {
4048
+ if (dependsOn.length === 0 && usedBy.length === 0) {
4049
+ return null;
4050
+ }
4051
+ if (dependsOn.length === 0 && usedBy.length > 0) {
4052
+ return { label: "core", icon: Box$1, color: "#10b981" };
4053
+ }
4054
+ if (dependsOn.length > 0 && usedBy.length === 0) {
4055
+ return { label: "app", icon: Layers$1, color: "#8b5cf6" };
4056
+ }
4057
+ return { label: "shared", icon: LayoutGrid$1, color: "#f59e0b" };
4058
+ }, [dependsOn.length, usedBy.length]);
4059
+ return /* @__PURE__ */ jsxs(
4060
+ "button",
4061
+ {
4062
+ onClick,
4063
+ style: {
4064
+ display: "flex",
4065
+ flexDirection: "column",
4066
+ gap: "8px",
4067
+ padding: "20px",
4068
+ backgroundColor: theme2.colors.backgroundSecondary,
4069
+ border: `1px solid ${theme2.colors.border}`,
4070
+ borderRadius: "0",
4071
+ cursor: "pointer",
4072
+ textAlign: "left",
4073
+ transition: "all 0.15s ease",
4074
+ width: "100%"
4075
+ },
4076
+ onMouseEnter: (e2) => {
4077
+ e2.currentTarget.style.borderColor = theme2.colors.primary;
4078
+ e2.currentTarget.style.backgroundColor = theme2.colors.backgroundTertiary;
4079
+ onHover == null ? void 0 : onHover(pkg);
4080
+ },
4081
+ onMouseLeave: (e2) => {
4082
+ e2.currentTarget.style.borderColor = theme2.colors.border;
4083
+ e2.currentTarget.style.backgroundColor = theme2.colors.backgroundSecondary;
4084
+ onHover == null ? void 0 : onHover(null);
4085
+ },
4086
+ children: [
4087
+ /* @__PURE__ */ jsxs("div", { style: { display: "flex", alignItems: "center", gap: "8px" }, children: [
4088
+ /* @__PURE__ */ jsx(
4089
+ PackageManagerIcon,
4090
+ {
4091
+ packageManager: pkg.packageData.packageManager,
4092
+ size: 20
4093
+ }
4094
+ ),
4095
+ /* @__PURE__ */ jsxs("div", { style: { flex: 1, minWidth: 0 }, children: [
4096
+ /* @__PURE__ */ jsx(
4097
+ "div",
4098
+ {
4099
+ style: {
4100
+ fontSize: theme2.fontSizes[3],
4101
+ fontWeight: theme2.fontWeights.semibold,
4102
+ fontFamily: theme2.fonts.body,
4103
+ color: theme2.colors.text,
4104
+ overflow: "hidden",
4105
+ textOverflow: "ellipsis",
4106
+ whiteSpace: "nowrap"
4107
+ },
4108
+ children: pkg.packageData.name
4109
+ }
4110
+ ),
4111
+ /* @__PURE__ */ jsxs(
4112
+ "div",
4113
+ {
4114
+ style: {
4115
+ fontSize: theme2.fontSizes[1],
4116
+ fontFamily: theme2.fonts.body,
4117
+ color: theme2.colors.textSecondary
4118
+ },
4119
+ children: [
4120
+ pkg.packageData.path || "root",
4121
+ pkg.packageData.version && ` • v${pkg.packageData.version}`
4122
+ ]
4123
+ }
4124
+ )
4125
+ ] }),
4126
+ pkg.packageData.isMonorepoRoot && ((_b = pkg.packageData.monorepoMetadata) == null ? void 0 : _b.orchestrator) && /* @__PURE__ */ jsx(
4127
+ OrchestratorBadge,
4128
+ {
4129
+ orchestrator: pkg.packageData.monorepoMetadata.orchestrator,
4130
+ rootRole: pkg.packageData.monorepoMetadata.rootRole,
4131
+ size: "sm"
4132
+ }
4133
+ ),
4134
+ packageRole && /* @__PURE__ */ jsxs(
4135
+ "span",
4136
+ {
4137
+ style: {
4138
+ display: "flex",
4139
+ alignItems: "center",
4140
+ gap: "4px",
4141
+ padding: "3px 8px",
4142
+ backgroundColor: packageRole.color + "20",
4143
+ color: packageRole.color,
4144
+ borderRadius: "4px",
4145
+ fontSize: theme2.fontSizes[1],
4146
+ fontWeight: theme2.fontWeights.medium,
4147
+ fontFamily: theme2.fonts.body,
4148
+ flexShrink: 0
4149
+ },
4150
+ children: [
4151
+ /* @__PURE__ */ jsx(packageRole.icon, { size: 12 }),
4152
+ packageRole.label
4153
+ ]
4154
+ }
4155
+ ),
4156
+ /* @__PURE__ */ jsx(ChevronRight$1, { size: 16, color: theme2.colors.textSecondary })
4157
+ ] }),
4158
+ (pkg.packageData.description || pkg.packageData.license) && /* @__PURE__ */ jsxs(
4159
+ "div",
4160
+ {
4161
+ style: {
4162
+ display: "flex",
4163
+ flexDirection: "column",
4164
+ gap: "4px"
4165
+ },
4166
+ children: [
4167
+ pkg.packageData.description && /* @__PURE__ */ jsx(
4168
+ "div",
4169
+ {
4170
+ style: {
4171
+ fontSize: theme2.fontSizes[1],
4172
+ fontFamily: theme2.fonts.body,
4173
+ color: theme2.colors.textSecondary,
4174
+ lineHeight: 1.4,
4175
+ overflow: "hidden",
4176
+ display: "-webkit-box",
4177
+ WebkitLineClamp: 2,
4178
+ WebkitBoxOrient: "vertical"
4179
+ },
4180
+ children: pkg.packageData.description
4181
+ }
4182
+ ),
4183
+ pkg.packageData.license && /* @__PURE__ */ jsx(
4184
+ "div",
4185
+ {
4186
+ style: {
4187
+ display: "flex",
4188
+ alignItems: "center",
4189
+ gap: "4px",
4190
+ fontSize: theme2.fontSizes[1]
4191
+ },
4192
+ children: /* @__PURE__ */ jsx(
4193
+ "span",
4194
+ {
4195
+ style: {
4196
+ padding: "1px 6px",
4197
+ backgroundColor: theme2.colors.textSecondary + "15",
4198
+ color: theme2.colors.textSecondary,
4199
+ borderRadius: "3px",
4200
+ fontWeight: theme2.fontWeights.medium,
4201
+ fontFamily: theme2.fonts.body
4202
+ },
4203
+ children: pkg.packageData.license
4204
+ }
4205
+ )
4206
+ }
4207
+ )
4208
+ ]
4209
+ }
4210
+ ),
4211
+ /* @__PURE__ */ jsxs(
4212
+ "div",
4213
+ {
4214
+ style: {
4215
+ display: "flex",
4216
+ gap: "12px",
4217
+ fontSize: theme2.fontSizes[1],
4218
+ fontFamily: theme2.fonts.body,
4219
+ color: theme2.colors.textSecondary
4220
+ },
4221
+ children: [
4222
+ /* @__PURE__ */ jsxs("div", { style: { display: "flex", alignItems: "center", gap: "4px" }, children: [
4223
+ /* @__PURE__ */ jsx(Package$1, { size: 12 }),
4224
+ /* @__PURE__ */ jsxs("span", { children: [
4225
+ totalDeps,
4226
+ " deps"
4227
+ ] })
4228
+ ] }),
4229
+ /* @__PURE__ */ jsxs("div", { style: { display: "flex", alignItems: "center", gap: "4px" }, children: [
4230
+ /* @__PURE__ */ jsx(Settings$1, { size: 12 }),
4231
+ /* @__PURE__ */ jsxs("span", { children: [
4232
+ configFilesArray.length,
4233
+ " configs",
4234
+ inheritedConfigs > 0 && /* @__PURE__ */ jsxs("span", { style: { color: theme2.colors.primary }, children: [
4235
+ " ",
4236
+ "(",
4237
+ inheritedConfigs,
4238
+ "↑)"
4239
+ ] })
4240
+ ] })
4241
+ ] }),
4242
+ /* @__PURE__ */ jsxs("div", { style: { display: "flex", alignItems: "center", gap: "4px" }, children: [
4243
+ /* @__PURE__ */ jsx(Terminal$1, { size: 12 }),
4244
+ /* @__PURE__ */ jsxs("span", { children: [
4245
+ commands,
4246
+ " commands"
4247
+ ] })
4248
+ ] })
4249
+ ]
4250
+ }
4251
+ )
4252
+ ]
4253
+ }
4254
+ );
4255
+ };
3700
4256
  const PackageCompositionPanelContent = ({
3701
4257
  packages,
3702
4258
  isLoading = false,
@@ -3706,7 +4262,8 @@ const PackageCompositionPanelContent = ({
3706
4262
  onPackageClick,
3707
4263
  onPackageHover,
3708
4264
  onPackageSelect,
3709
- events
4265
+ events,
4266
+ readFile
3710
4267
  }) => {
3711
4268
  const { theme: theme2 } = useTheme();
3712
4269
  const [selectedPackageId, setSelectedPackageId] = useState(
@@ -3755,7 +4312,7 @@ const PackageCompositionPanelContent = ({
3755
4312
  }
3756
4313
  if (packages.length === 1) {
3757
4314
  return /* @__PURE__ */ jsx(
3758
- PackageCard,
4315
+ PackageDetailCard,
3759
4316
  {
3760
4317
  pkg: packages[0],
3761
4318
  isExpanded: true,
@@ -3764,7 +4321,8 @@ const PackageCompositionPanelContent = ({
3764
4321
  onCommandClick,
3765
4322
  onConfigClick,
3766
4323
  onPackageClick,
3767
- standalone: true
4324
+ standalone: true,
4325
+ readFile
3768
4326
  }
3769
4327
  );
3770
4328
  }
@@ -3957,7 +4515,7 @@ const PackageCompositionPanelContent = ({
3957
4515
  }
3958
4516
  ),
3959
4517
  /* @__PURE__ */ jsx("div", { style: { flex: 1, overflow: "hidden" }, children: selectedPackage && /* @__PURE__ */ jsx(
3960
- PackageCard,
4518
+ PackageDetailCard,
3961
4519
  {
3962
4520
  pkg: selectedPackage,
3963
4521
  isExpanded: true,
@@ -3966,7 +4524,8 @@ const PackageCompositionPanelContent = ({
3966
4524
  onCommandClick,
3967
4525
  onConfigClick,
3968
4526
  onPackageClick,
3969
- standalone: true
4527
+ standalone: true,
4528
+ readFile
3970
4529
  }
3971
4530
  ) })
3972
4531
  ]
@@ -4046,7 +4605,7 @@ const PackageCompositionPanelPreview = () => {
4046
4605
  }
4047
4606
  );
4048
4607
  };
4049
- const PackageCompositionPanel = ({ context: context2, events }) => {
4608
+ const PackageCompositionPanel = ({ context: context2, actions, events }) => {
4050
4609
  var _a;
4051
4610
  const packagesSlice = context2.packages;
4052
4611
  const packages = ((_a = packagesSlice == null ? void 0 : packagesSlice.data) == null ? void 0 : _a.packages) ?? [];
@@ -4080,7 +4639,8 @@ const PackageCompositionPanel = ({ context: context2, events }) => {
4080
4639
  isLoading,
4081
4640
  onPackageHover: handlePackageHover,
4082
4641
  onPackageSelect: handlePackageSelect,
4083
- events
4642
+ events,
4643
+ readFile: actions.readFile
4084
4644
  }
4085
4645
  );
4086
4646
  };
@@ -105383,7 +105943,7 @@ const browserExt = {
105383
105943
  },
105384
105944
  test: () => true,
105385
105945
  load: async () => {
105386
- await import("./browserAll-B-6hqqmg.js");
105946
+ await import("./browserAll-C1iy5xbx.js");
105387
105947
  }
105388
105948
  };
105389
105949
  const webworkerExt = {
@@ -105394,7 +105954,7 @@ const webworkerExt = {
105394
105954
  },
105395
105955
  test: () => typeof self !== "undefined" && self.WorkerGlobalScope !== void 0,
105396
105956
  load: async () => {
105397
- await import("./webworkerAll-Bvp7nJ85.js");
105957
+ await import("./webworkerAll-BmgxtxZy.js");
105398
105958
  }
105399
105959
  };
105400
105960
  class ObservablePoint {
@@ -117637,19 +118197,19 @@ async function autoDetectRenderer(options) {
117637
118197
  for (let i2 = 0; i2 < preferredOrder.length; i2++) {
117638
118198
  const rendererType = preferredOrder[i2];
117639
118199
  if (rendererType === "webgpu" && await isWebGPUSupported()) {
117640
- const { WebGPURenderer } = await import("./WebGPURenderer-kG50TdbS.js");
118200
+ const { WebGPURenderer } = await import("./WebGPURenderer-Dlw7vvZU.js");
117641
118201
  RendererClass = WebGPURenderer;
117642
118202
  finalOptions = { ...options, ...options.webgpu };
117643
118203
  break;
117644
118204
  } else if (rendererType === "webgl" && isWebGLSupported(
117645
118205
  options.failIfMajorPerformanceCaveat ?? AbstractRenderer.defaultOptions.failIfMajorPerformanceCaveat
117646
118206
  )) {
117647
- const { WebGLRenderer } = await import("./WebGLRenderer-BC7QWBvA.js");
118207
+ const { WebGLRenderer } = await import("./WebGLRenderer-CSpWLo6L.js");
117648
118208
  RendererClass = WebGLRenderer;
117649
118209
  finalOptions = { ...options, ...options.webgl };
117650
118210
  break;
117651
118211
  } else if (rendererType === "canvas") {
117652
- const { CanvasRenderer } = await import("./CanvasRenderer-BDNCY5O9.js");
118212
+ const { CanvasRenderer } = await import("./CanvasRenderer-CPXgnUH1.js");
117653
118213
  RendererClass = CanvasRenderer;
117654
118214
  finalOptions = { ...options, ...options.canvasOptions };
117655
118215
  break;
@@ -132772,8 +133332,10 @@ class IsometricInteractionManager {
132772
133332
  this.sprites = /* @__PURE__ */ new Map();
132773
133333
  this.dragState = null;
132774
133334
  this.hoveredNodeId = null;
133335
+ this.selectedNodeId = null;
132775
133336
  this.draggingEnabled = true;
132776
133337
  this.mapBounds = null;
133338
+ this.hoverColor = 16776960;
132777
133339
  this.onGlobalPointerMove = (event) => {
132778
133340
  var _a, _b;
132779
133341
  if (!this.dragState || !this.dragState.isDragging) return;
@@ -132794,6 +133356,12 @@ class IsometricInteractionManager {
132794
133356
  if (this.wouldCollide(this.dragState.nodeId, { gridX: newGridX, gridY: newGridY })) {
132795
133357
  return;
132796
133358
  }
133359
+ const movedDistance = Math.sqrt(
133360
+ Math.pow(newGridX - this.dragState.spriteStartPos.gridX, 2) + Math.pow(newGridY - this.dragState.spriteStartPos.gridY, 2)
133361
+ );
133362
+ if (movedDistance > 0.5) {
133363
+ this.dragState.hasMoved = true;
133364
+ }
132797
133365
  this.dragState.instance.update(newGridX, newGridY);
132798
133366
  this.updateNearbyHighlights(this.dragState.nodeId, { gridX: newGridX, gridY: newGridY });
132799
133367
  (_b = (_a = this.events).onDragMove) == null ? void 0 : _b.call(_a, this.dragState.nodeId, newGridX, newGridY);
@@ -132813,6 +133381,7 @@ class IsometricInteractionManager {
132813
133381
  this.config = config;
132814
133382
  this.events = events;
132815
133383
  this.mapBounds = config.mapBounds || null;
133384
+ this.selectedColor = config.selectedColor ?? 3900150;
132816
133385
  }
132817
133386
  /**
132818
133387
  * Register a sprite for interaction
@@ -132873,6 +133442,7 @@ class IsometricInteractionManager {
132873
133442
  nodeId,
132874
133443
  instance,
132875
133444
  isDragging: true,
133445
+ hasMoved: false,
132876
133446
  dragStartPos: { x: event.global.x, y: event.global.y },
132877
133447
  spriteStartPos: { gridX: instance.gridPosition.gridX, gridY: instance.gridPosition.gridY },
132878
133448
  nearbySprites: /* @__PURE__ */ new Set()
@@ -132941,9 +133511,9 @@ class IsometricInteractionManager {
132941
133511
  * Finish dragging - snap to grid and cleanup
132942
133512
  */
132943
133513
  finishDrag() {
132944
- var _a, _b;
133514
+ var _a, _b, _c, _d;
132945
133515
  if (!this.dragState) return;
132946
- const { nodeId, instance, nearbySprites } = this.dragState;
133516
+ const { nodeId, instance, nearbySprites, hasMoved } = this.dragState;
132947
133517
  let snappedGridX = Math.round(instance.gridPosition.gridX);
132948
133518
  let snappedGridY = Math.round(instance.gridPosition.gridY);
132949
133519
  const clamped = this.clampToMapBounds(snappedGridX, snappedGridY, instance.size);
@@ -132956,19 +133526,24 @@ class IsometricInteractionManager {
132956
133526
  instance.update(snappedGridX, snappedGridY);
132957
133527
  instance.sprite.cursor = "pointer";
132958
133528
  instance.highlight.cursor = "pointer";
132959
- if (this.hoveredNodeId !== nodeId) {
133529
+ if (this.hoveredNodeId !== nodeId && this.selectedNodeId !== nodeId) {
132960
133530
  instance.highlight.visible = false;
132961
133531
  }
132962
133532
  for (const nearbyId of nearbySprites) {
132963
133533
  const nearbyInstance = this.sprites.get(nearbyId);
132964
- if (nearbyInstance && this.hoveredNodeId !== nearbyId) {
133534
+ if (nearbyInstance && this.hoveredNodeId !== nearbyId && this.selectedNodeId !== nearbyId) {
132965
133535
  nearbyInstance.highlight.visible = false;
132966
133536
  }
132967
133537
  }
132968
133538
  if (this.viewport) {
132969
133539
  this.viewport.plugins.resume("drag");
132970
133540
  }
132971
- (_b = (_a = this.events).onDragEnd) == null ? void 0 : _b.call(_a, nodeId, snappedGridX, snappedGridY);
133541
+ if (hasMoved) {
133542
+ (_b = (_a = this.events).onDragEnd) == null ? void 0 : _b.call(_a, nodeId, snappedGridX, snappedGridY);
133543
+ } else {
133544
+ this.setSelected(nodeId);
133545
+ (_d = (_c = this.events).onClick) == null ? void 0 : _d.call(_c, nodeId);
133546
+ }
132972
133547
  const eventTarget = this.viewport || this.worldContainer;
132973
133548
  eventTarget.off("globalpointermove", this.onGlobalPointerMove);
132974
133549
  eventTarget.off("pointerup", this.onPointerUp);
@@ -132985,14 +133560,16 @@ class IsometricInteractionManager {
132985
133560
  (_b = (_a = this.events).onHover) == null ? void 0 : _b.call(_a, nodeId);
132986
133561
  }
132987
133562
  /**
132988
- * Handle pointer out - hide highlight (unless dragging)
133563
+ * Handle pointer out - hide highlight (unless dragging or selected)
132989
133564
  */
132990
133565
  onPointerOut(nodeId, instance) {
132991
133566
  var _a, _b;
132992
133567
  if (this.hoveredNodeId === nodeId) {
132993
133568
  this.hoveredNodeId = null;
132994
133569
  }
132995
- if (!this.dragState || this.dragState.nodeId !== nodeId) {
133570
+ const isDragging = this.dragState && this.dragState.nodeId === nodeId;
133571
+ const isSelected = this.selectedNodeId === nodeId;
133572
+ if (!isDragging && !isSelected) {
132996
133573
  instance.highlight.visible = false;
132997
133574
  }
132998
133575
  (_b = (_a = this.events).onHoverEnd) == null ? void 0 : _b.call(_a, nodeId);
@@ -133007,6 +133584,55 @@ class IsometricInteractionManager {
133007
133584
  instance.highlight.cursor = enabled ? "pointer" : "default";
133008
133585
  }
133009
133586
  }
133587
+ /**
133588
+ * Set the selected node
133589
+ */
133590
+ setSelected(nodeId) {
133591
+ const previousSelected = this.selectedNodeId;
133592
+ this.selectedNodeId = nodeId;
133593
+ if (previousSelected && previousSelected !== nodeId) {
133594
+ const prevInstance = this.sprites.get(previousSelected);
133595
+ if (prevInstance) {
133596
+ if (this.hoveredNodeId !== previousSelected) {
133597
+ prevInstance.highlight.visible = false;
133598
+ }
133599
+ this.updateHighlightColor(prevInstance, false);
133600
+ }
133601
+ }
133602
+ if (nodeId) {
133603
+ const instance = this.sprites.get(nodeId);
133604
+ if (instance) {
133605
+ instance.highlight.visible = true;
133606
+ this.updateHighlightColor(instance, true);
133607
+ }
133608
+ }
133609
+ }
133610
+ /**
133611
+ * Get the currently selected node ID
133612
+ */
133613
+ getSelectedNodeId() {
133614
+ return this.selectedNodeId;
133615
+ }
133616
+ /**
133617
+ * Update highlight color based on selected state
133618
+ */
133619
+ updateHighlightColor(instance, isSelected) {
133620
+ const color2 = isSelected ? this.selectedColor : this.hoverColor;
133621
+ instance.highlight.clear();
133622
+ const pos = gridToScreen(instance.gridPosition.gridX, instance.gridPosition.gridY);
133623
+ const hoverSize = 4 * instance.size;
133624
+ const tileWidth = hoverSize * (this.config.tileWidth ?? 64);
133625
+ const tileHeight = hoverSize * (this.config.tileHeight ?? 32);
133626
+ instance.highlight.setStrokeStyle({ width: 3, color: color2, alpha: 1 });
133627
+ instance.highlight.setFillStyle({ color: color2, alpha: isSelected ? 0.25 : 0.1 });
133628
+ instance.highlight.moveTo(pos.screenX, pos.screenY - tileHeight / 2);
133629
+ instance.highlight.lineTo(pos.screenX + tileWidth / 2, pos.screenY);
133630
+ instance.highlight.lineTo(pos.screenX, pos.screenY + tileHeight / 2);
133631
+ instance.highlight.lineTo(pos.screenX - tileWidth / 2, pos.screenY);
133632
+ instance.highlight.closePath();
133633
+ instance.highlight.fill();
133634
+ instance.highlight.stroke();
133635
+ }
133010
133636
  /**
133011
133637
  * Check if position would cause boundary overlap with other sprites
133012
133638
  * Boundary size is 4 × size tiles, extending 2 × size in each direction
@@ -133885,6 +134511,8 @@ const OverworldMapPanelContent = ({
133885
134511
  height,
133886
134512
  isLoading = false,
133887
134513
  onProjectMoved,
134514
+ onNodeClicked,
134515
+ selectedNodeId,
133888
134516
  isEditingRegions = false,
133889
134517
  customRegions = [],
133890
134518
  onAddRegion,
@@ -134096,6 +134724,9 @@ const OverworldMapPanelContent = ({
134096
134724
  },
134097
134725
  onDragEnd: (nodeId, gridX, gridY) => {
134098
134726
  onProjectMoved == null ? void 0 : onProjectMoved(nodeId, gridX, gridY);
134727
+ },
134728
+ onClick: (nodeId) => {
134729
+ onNodeClicked == null ? void 0 : onNodeClicked(nodeId);
134099
134730
  }
134100
134731
  }
134101
134732
  );
@@ -134497,6 +135128,11 @@ const OverworldMapPanelContent = ({
134497
135128
  renderPlaceholdersRef.current();
134498
135129
  }
134499
135130
  }, [isEditingRegions]);
135131
+ useEffect(() => {
135132
+ if (interactionRef.current) {
135133
+ interactionRef.current.setSelected(selectedNodeId ?? null);
135134
+ }
135135
+ }, [selectedNodeId]);
134500
135136
  return /* @__PURE__ */ jsxs(
134501
135137
  "div",
134502
135138
  {
@@ -134823,7 +135459,9 @@ const CollectionMapPanelContent = ({
134823
135459
  regionLayout,
134824
135460
  isLoading = false,
134825
135461
  regionCallbacks,
134826
- addRepositoryToCollection
135462
+ addRepositoryToCollection,
135463
+ onRepositoryClicked,
135464
+ selectedRepositoryId
134827
135465
  }) => {
134828
135466
  var _a;
134829
135467
  const customRegions = React2__default.useMemo(
@@ -135316,6 +135954,8 @@ This indicates a sprite was rendered without valid backing data.`
135316
135954
  customRegions,
135317
135955
  collectionKey: collection.id,
135318
135956
  onProjectMoved: handleProjectMoved,
135957
+ onNodeClicked: onRepositoryClicked,
135958
+ selectedNodeId: selectedRepositoryId,
135319
135959
  onViewportReady: handleViewportReady,
135320
135960
  onAddRegion: async (position2) => {
135321
135961
  const order2 = position2.row * 10 + position2.col;
@@ -135480,7 +136120,9 @@ const CollectionMapPanel = ({ context: context2, actions }) => {
135480
136120
  dependencies,
135481
136121
  isLoading,
135482
136122
  regionCallbacks,
135483
- addRepositoryToCollection: actions.addRepositoryToCollection
136123
+ addRepositoryToCollection: actions.addRepositoryToCollection,
136124
+ onRepositoryClicked: actions.onRepositoryClicked,
136125
+ selectedRepositoryId: actions.selectedRepositoryId
135484
136126
  }
135485
136127
  ) });
135486
136128
  };
@@ -136577,4 +137219,4 @@ export {
136577
137219
  UPDATE_PRIORITY as y,
136578
137220
  removeItems as z
136579
137221
  };
136580
- //# sourceMappingURL=index-DqpaKlrF.js.map
137222
+ //# sourceMappingURL=index-BwWx2Yhi.js.map