@industry-theme/file-city-panel 0.2.20 → 0.2.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/panels/CodeCityPanel.d.ts.map +1 -1
- package/dist/panels/CodeCityPanel.stories.d.ts.map +1 -1
- package/dist/panels/components/AgentActivityView.d.ts +29 -0
- package/dist/panels/components/AgentActivityView.d.ts.map +1 -0
- package/dist/panels/components/AgentActivityView.stories.d.ts +34 -0
- package/dist/panels/components/AgentActivityView.stories.d.ts.map +1 -0
- package/dist/panels/components/LegendTabs.d.ts +29 -0
- package/dist/panels/components/LegendTabs.d.ts.map +1 -0
- package/dist/panels/components/LegendTabs.stories.d.ts +38 -0
- package/dist/panels/components/LegendTabs.stories.d.ts.map +1 -0
- package/dist/panels/utils/qualityLayers.d.ts +13 -1
- package/dist/panels/utils/qualityLayers.d.ts.map +1 -1
- package/dist/panels.bundle.js +1037 -38
- package/dist/panels.bundle.js.map +1 -1
- package/package.json +1 -1
package/dist/panels.bundle.js
CHANGED
|
@@ -106,7 +106,7 @@ const createLucideIcon = (iconName, iconNode) => {
|
|
|
106
106
|
* This source code is licensed under the ISC license.
|
|
107
107
|
* See the LICENSE file in the root directory of this source tree.
|
|
108
108
|
*/
|
|
109
|
-
const __iconNode$
|
|
109
|
+
const __iconNode$b = [
|
|
110
110
|
[
|
|
111
111
|
"path",
|
|
112
112
|
{
|
|
@@ -115,14 +115,14 @@ const __iconNode$5 = [
|
|
|
115
115
|
}
|
|
116
116
|
]
|
|
117
117
|
];
|
|
118
|
-
const Activity = createLucideIcon("activity", __iconNode$
|
|
118
|
+
const Activity = createLucideIcon("activity", __iconNode$b);
|
|
119
119
|
/**
|
|
120
120
|
* @license lucide-react v0.552.0 - ISC
|
|
121
121
|
*
|
|
122
122
|
* This source code is licensed under the ISC license.
|
|
123
123
|
* See the LICENSE file in the root directory of this source tree.
|
|
124
124
|
*/
|
|
125
|
-
const __iconNode$
|
|
125
|
+
const __iconNode$a = [
|
|
126
126
|
["path", { d: "M10 12h4", key: "a56b0p" }],
|
|
127
127
|
["path", { d: "M10 8h4", key: "1sr2af" }],
|
|
128
128
|
["path", { d: "M14 21v-3a2 2 0 0 0-4 0v3", key: "1rgiei" }],
|
|
@@ -135,27 +135,105 @@ const __iconNode$4 = [
|
|
|
135
135
|
],
|
|
136
136
|
["path", { d: "M6 21V5a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v16", key: "16ra0t" }]
|
|
137
137
|
];
|
|
138
|
-
const Building2 = createLucideIcon("building-2", __iconNode$
|
|
138
|
+
const Building2 = createLucideIcon("building-2", __iconNode$a);
|
|
139
139
|
/**
|
|
140
140
|
* @license lucide-react v0.552.0 - ISC
|
|
141
141
|
*
|
|
142
142
|
* This source code is licensed under the ISC license.
|
|
143
143
|
* See the LICENSE file in the root directory of this source tree.
|
|
144
144
|
*/
|
|
145
|
-
const __iconNode$
|
|
145
|
+
const __iconNode$9 = [
|
|
146
146
|
["path", { d: "M3 3v16a2 2 0 0 0 2 2h16", key: "c24i48" }],
|
|
147
147
|
["path", { d: "M18 17V9", key: "2bz60n" }],
|
|
148
148
|
["path", { d: "M13 17V5", key: "1frdt8" }],
|
|
149
149
|
["path", { d: "M8 17v-3", key: "17ska0" }]
|
|
150
150
|
];
|
|
151
|
-
const ChartColumn = createLucideIcon("chart-column", __iconNode$
|
|
151
|
+
const ChartColumn = createLucideIcon("chart-column", __iconNode$9);
|
|
152
152
|
/**
|
|
153
153
|
* @license lucide-react v0.552.0 - ISC
|
|
154
154
|
*
|
|
155
155
|
* This source code is licensed under the ISC license.
|
|
156
156
|
* See the LICENSE file in the root directory of this source tree.
|
|
157
157
|
*/
|
|
158
|
-
const __iconNode$
|
|
158
|
+
const __iconNode$8 = [["path", { d: "m6 9 6 6 6-6", key: "qrunsl" }]];
|
|
159
|
+
const ChevronDown = createLucideIcon("chevron-down", __iconNode$8);
|
|
160
|
+
/**
|
|
161
|
+
* @license lucide-react v0.552.0 - ISC
|
|
162
|
+
*
|
|
163
|
+
* This source code is licensed under the ISC license.
|
|
164
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
165
|
+
*/
|
|
166
|
+
const __iconNode$7 = [["path", { d: "m9 18 6-6-6-6", key: "mthhwq" }]];
|
|
167
|
+
const ChevronRight = createLucideIcon("chevron-right", __iconNode$7);
|
|
168
|
+
/**
|
|
169
|
+
* @license lucide-react v0.552.0 - ISC
|
|
170
|
+
*
|
|
171
|
+
* This source code is licensed under the ISC license.
|
|
172
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
173
|
+
*/
|
|
174
|
+
const __iconNode$6 = [
|
|
175
|
+
[
|
|
176
|
+
"path",
|
|
177
|
+
{
|
|
178
|
+
d: "M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49",
|
|
179
|
+
key: "ct8e1f"
|
|
180
|
+
}
|
|
181
|
+
],
|
|
182
|
+
["path", { d: "M14.084 14.158a3 3 0 0 1-4.242-4.242", key: "151rxh" }],
|
|
183
|
+
[
|
|
184
|
+
"path",
|
|
185
|
+
{
|
|
186
|
+
d: "M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143",
|
|
187
|
+
key: "13bj9a"
|
|
188
|
+
}
|
|
189
|
+
],
|
|
190
|
+
["path", { d: "m2 2 20 20", key: "1ooewy" }]
|
|
191
|
+
];
|
|
192
|
+
const EyeOff = createLucideIcon("eye-off", __iconNode$6);
|
|
193
|
+
/**
|
|
194
|
+
* @license lucide-react v0.552.0 - ISC
|
|
195
|
+
*
|
|
196
|
+
* This source code is licensed under the ISC license.
|
|
197
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
198
|
+
*/
|
|
199
|
+
const __iconNode$5 = [
|
|
200
|
+
[
|
|
201
|
+
"path",
|
|
202
|
+
{
|
|
203
|
+
d: "M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0",
|
|
204
|
+
key: "1nclc0"
|
|
205
|
+
}
|
|
206
|
+
],
|
|
207
|
+
["circle", { cx: "12", cy: "12", r: "3", key: "1v7zrd" }]
|
|
208
|
+
];
|
|
209
|
+
const Eye = createLucideIcon("eye", __iconNode$5);
|
|
210
|
+
/**
|
|
211
|
+
* @license lucide-react v0.552.0 - ISC
|
|
212
|
+
*
|
|
213
|
+
* This source code is licensed under the ISC license.
|
|
214
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
215
|
+
*/
|
|
216
|
+
const __iconNode$4 = [
|
|
217
|
+
[
|
|
218
|
+
"path",
|
|
219
|
+
{
|
|
220
|
+
d: "M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z",
|
|
221
|
+
key: "1oefj6"
|
|
222
|
+
}
|
|
223
|
+
],
|
|
224
|
+
["path", { d: "M14 2v5a1 1 0 0 0 1 1h5", key: "wfsgrz" }],
|
|
225
|
+
["path", { d: "M10 9H8", key: "b1mrlr" }],
|
|
226
|
+
["path", { d: "M16 13H8", key: "t4e002" }],
|
|
227
|
+
["path", { d: "M16 17H8", key: "z1uh3a" }]
|
|
228
|
+
];
|
|
229
|
+
const FileText = createLucideIcon("file-text", __iconNode$4);
|
|
230
|
+
/**
|
|
231
|
+
* @license lucide-react v0.552.0 - ISC
|
|
232
|
+
*
|
|
233
|
+
* This source code is licensed under the ISC license.
|
|
234
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
235
|
+
*/
|
|
236
|
+
const __iconNode$3 = [
|
|
159
237
|
[
|
|
160
238
|
"path",
|
|
161
239
|
{
|
|
@@ -165,14 +243,14 @@ const __iconNode$2 = [
|
|
|
165
243
|
],
|
|
166
244
|
["path", { d: "M14 2v5a1 1 0 0 0 1 1h5", key: "wfsgrz" }]
|
|
167
245
|
];
|
|
168
|
-
const File = createLucideIcon("file", __iconNode$
|
|
246
|
+
const File = createLucideIcon("file", __iconNode$3);
|
|
169
247
|
/**
|
|
170
248
|
* @license lucide-react v0.552.0 - ISC
|
|
171
249
|
*
|
|
172
250
|
* This source code is licensed under the ISC license.
|
|
173
251
|
* See the LICENSE file in the root directory of this source tree.
|
|
174
252
|
*/
|
|
175
|
-
const __iconNode$
|
|
253
|
+
const __iconNode$2 = [
|
|
176
254
|
[
|
|
177
255
|
"path",
|
|
178
256
|
{
|
|
@@ -181,7 +259,20 @@ const __iconNode$1 = [
|
|
|
181
259
|
}
|
|
182
260
|
]
|
|
183
261
|
];
|
|
184
|
-
const Folder = createLucideIcon("folder", __iconNode$
|
|
262
|
+
const Folder = createLucideIcon("folder", __iconNode$2);
|
|
263
|
+
/**
|
|
264
|
+
* @license lucide-react v0.552.0 - ISC
|
|
265
|
+
*
|
|
266
|
+
* This source code is licensed under the ISC license.
|
|
267
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
268
|
+
*/
|
|
269
|
+
const __iconNode$1 = [
|
|
270
|
+
["line", { x1: "6", x2: "6", y1: "3", y2: "15", key: "17qcm7" }],
|
|
271
|
+
["circle", { cx: "18", cy: "6", r: "3", key: "1h7g24" }],
|
|
272
|
+
["circle", { cx: "6", cy: "18", r: "3", key: "fqmcym" }],
|
|
273
|
+
["path", { d: "M18 9a9 9 0 0 1-9 9", key: "n2h4wq" }]
|
|
274
|
+
];
|
|
275
|
+
const GitBranch = createLucideIcon("git-branch", __iconNode$1);
|
|
185
276
|
/**
|
|
186
277
|
* @license lucide-react v0.552.0 - ISC
|
|
187
278
|
*
|
|
@@ -2605,29 +2696,632 @@ const Legend = ({
|
|
|
2605
2696
|
children: fileType.name
|
|
2606
2697
|
}
|
|
2607
2698
|
),
|
|
2608
|
-
/* @__PURE__ */ jsx(
|
|
2699
|
+
/* @__PURE__ */ jsx(
|
|
2700
|
+
"span",
|
|
2701
|
+
{
|
|
2702
|
+
style: {
|
|
2703
|
+
fontSize: theme2.fontSizes[0],
|
|
2704
|
+
fontFamily: theme2.fonts.body,
|
|
2705
|
+
color: theme2.colors.textSecondary,
|
|
2706
|
+
flexShrink: 0
|
|
2707
|
+
},
|
|
2708
|
+
children: fileType.count
|
|
2709
|
+
}
|
|
2710
|
+
)
|
|
2711
|
+
]
|
|
2712
|
+
},
|
|
2713
|
+
fileType.id
|
|
2714
|
+
))
|
|
2715
|
+
}
|
|
2716
|
+
)
|
|
2717
|
+
] })
|
|
2718
|
+
]
|
|
2719
|
+
}
|
|
2720
|
+
);
|
|
2721
|
+
};
|
|
2722
|
+
const AgentActivityView = ({
|
|
2723
|
+
layers,
|
|
2724
|
+
onLayerClick,
|
|
2725
|
+
onClearAll,
|
|
2726
|
+
showHeader = true
|
|
2727
|
+
}) => {
|
|
2728
|
+
const { theme: theme2 } = useTheme();
|
|
2729
|
+
const [expandedLayers, setExpandedLayers] = React.useState(/* @__PURE__ */ new Set());
|
|
2730
|
+
const toggleExpanded = (id2) => {
|
|
2731
|
+
setExpandedLayers((prev) => {
|
|
2732
|
+
const next = new Set(prev);
|
|
2733
|
+
if (next.has(id2)) {
|
|
2734
|
+
next.delete(id2);
|
|
2735
|
+
} else {
|
|
2736
|
+
next.add(id2);
|
|
2737
|
+
}
|
|
2738
|
+
return next;
|
|
2739
|
+
});
|
|
2740
|
+
};
|
|
2741
|
+
const formatTimestamp = (timestamp) => {
|
|
2742
|
+
const date = new Date(timestamp);
|
|
2743
|
+
return date.toLocaleTimeString(void 0, {
|
|
2744
|
+
hour: "2-digit",
|
|
2745
|
+
minute: "2-digit",
|
|
2746
|
+
second: "2-digit"
|
|
2747
|
+
});
|
|
2748
|
+
};
|
|
2749
|
+
const getFileName = (path) => {
|
|
2750
|
+
const parts = path.split("/");
|
|
2751
|
+
return parts[parts.length - 1];
|
|
2752
|
+
};
|
|
2753
|
+
const getDirectory = (path) => {
|
|
2754
|
+
const parts = path.split("/");
|
|
2755
|
+
if (parts.length <= 1) return "";
|
|
2756
|
+
return parts.slice(0, -1).join("/");
|
|
2757
|
+
};
|
|
2758
|
+
if (layers.length === 0) {
|
|
2759
|
+
return /* @__PURE__ */ jsxs(
|
|
2760
|
+
"div",
|
|
2761
|
+
{
|
|
2762
|
+
style: {
|
|
2763
|
+
display: "flex",
|
|
2764
|
+
flexDirection: "column",
|
|
2765
|
+
flex: 1,
|
|
2766
|
+
backgroundColor: theme2.colors.background,
|
|
2767
|
+
...showHeader && {
|
|
2768
|
+
border: `1px solid ${theme2.colors.border}`,
|
|
2769
|
+
borderRadius: "6px"
|
|
2770
|
+
},
|
|
2771
|
+
overflow: "hidden"
|
|
2772
|
+
},
|
|
2773
|
+
children: [
|
|
2774
|
+
showHeader && /* @__PURE__ */ jsx(
|
|
2775
|
+
"div",
|
|
2776
|
+
{
|
|
2777
|
+
style: {
|
|
2778
|
+
display: "flex",
|
|
2779
|
+
alignItems: "center",
|
|
2780
|
+
justifyContent: "space-between",
|
|
2781
|
+
padding: "12px 16px",
|
|
2782
|
+
backgroundColor: theme2.colors.backgroundLight,
|
|
2783
|
+
borderBottom: `1px solid ${theme2.colors.border}`
|
|
2784
|
+
},
|
|
2785
|
+
children: /* @__PURE__ */ jsxs(
|
|
2786
|
+
"div",
|
|
2787
|
+
{
|
|
2788
|
+
style: {
|
|
2789
|
+
display: "flex",
|
|
2790
|
+
alignItems: "center",
|
|
2791
|
+
gap: "8px",
|
|
2792
|
+
color: theme2.colors.primary,
|
|
2793
|
+
fontFamily: theme2.fonts.body,
|
|
2794
|
+
fontWeight: 600,
|
|
2795
|
+
fontSize: theme2.fontSizes[1]
|
|
2796
|
+
},
|
|
2797
|
+
children: [
|
|
2798
|
+
/* @__PURE__ */ jsx(Activity, { size: 16 }),
|
|
2799
|
+
"Agent Activity"
|
|
2800
|
+
]
|
|
2801
|
+
}
|
|
2802
|
+
)
|
|
2803
|
+
}
|
|
2804
|
+
),
|
|
2805
|
+
/* @__PURE__ */ jsxs(
|
|
2806
|
+
"div",
|
|
2807
|
+
{
|
|
2808
|
+
style: {
|
|
2809
|
+
display: "flex",
|
|
2810
|
+
flexDirection: "column",
|
|
2811
|
+
alignItems: "center",
|
|
2812
|
+
justifyContent: "center",
|
|
2813
|
+
flex: 1,
|
|
2814
|
+
padding: "32px 16px",
|
|
2815
|
+
color: theme2.colors.textSecondary,
|
|
2816
|
+
fontFamily: theme2.fonts.body,
|
|
2817
|
+
fontSize: theme2.fontSizes[0]
|
|
2818
|
+
},
|
|
2819
|
+
children: [
|
|
2820
|
+
/* @__PURE__ */ jsx(Activity, { size: 32, style: { opacity: 0.3, marginBottom: "8px" } }),
|
|
2821
|
+
/* @__PURE__ */ jsx("span", { children: "No agent activity yet" })
|
|
2822
|
+
]
|
|
2823
|
+
}
|
|
2824
|
+
)
|
|
2825
|
+
]
|
|
2826
|
+
}
|
|
2827
|
+
);
|
|
2828
|
+
}
|
|
2829
|
+
return /* @__PURE__ */ jsxs(
|
|
2830
|
+
"div",
|
|
2831
|
+
{
|
|
2832
|
+
style: {
|
|
2833
|
+
display: "flex",
|
|
2834
|
+
flexDirection: "column",
|
|
2835
|
+
flex: 1,
|
|
2836
|
+
backgroundColor: theme2.colors.background,
|
|
2837
|
+
...showHeader && {
|
|
2838
|
+
border: `1px solid ${theme2.colors.border}`,
|
|
2839
|
+
borderRadius: "6px"
|
|
2840
|
+
},
|
|
2841
|
+
overflow: "hidden"
|
|
2842
|
+
},
|
|
2843
|
+
children: [
|
|
2844
|
+
showHeader && /* @__PURE__ */ jsxs(
|
|
2845
|
+
"div",
|
|
2846
|
+
{
|
|
2847
|
+
style: {
|
|
2848
|
+
display: "flex",
|
|
2849
|
+
alignItems: "center",
|
|
2850
|
+
justifyContent: "space-between",
|
|
2851
|
+
padding: "12px 16px",
|
|
2852
|
+
backgroundColor: theme2.colors.backgroundLight,
|
|
2853
|
+
borderBottom: `1px solid ${theme2.colors.border}`,
|
|
2854
|
+
flexShrink: 0
|
|
2855
|
+
},
|
|
2856
|
+
children: [
|
|
2857
|
+
/* @__PURE__ */ jsxs(
|
|
2858
|
+
"div",
|
|
2859
|
+
{
|
|
2860
|
+
style: {
|
|
2861
|
+
display: "flex",
|
|
2862
|
+
alignItems: "center",
|
|
2863
|
+
gap: "8px",
|
|
2864
|
+
color: theme2.colors.primary,
|
|
2865
|
+
fontFamily: theme2.fonts.body,
|
|
2866
|
+
fontWeight: 600,
|
|
2867
|
+
fontSize: theme2.fontSizes[1]
|
|
2868
|
+
},
|
|
2869
|
+
children: [
|
|
2870
|
+
/* @__PURE__ */ jsx(Activity, { size: 16 }),
|
|
2871
|
+
"Agent Activity",
|
|
2872
|
+
/* @__PURE__ */ jsx(
|
|
2873
|
+
"span",
|
|
2874
|
+
{
|
|
2875
|
+
style: {
|
|
2876
|
+
backgroundColor: theme2.colors.primary,
|
|
2877
|
+
color: theme2.colors.background,
|
|
2878
|
+
padding: "2px 8px",
|
|
2879
|
+
borderRadius: "10px",
|
|
2880
|
+
fontSize: theme2.fontSizes[0],
|
|
2881
|
+
fontWeight: 500
|
|
2882
|
+
},
|
|
2883
|
+
children: layers.length
|
|
2884
|
+
}
|
|
2885
|
+
)
|
|
2886
|
+
]
|
|
2887
|
+
}
|
|
2888
|
+
),
|
|
2889
|
+
onClearAll && /* @__PURE__ */ jsxs(
|
|
2890
|
+
"button",
|
|
2891
|
+
{
|
|
2892
|
+
onClick: onClearAll,
|
|
2893
|
+
style: {
|
|
2894
|
+
display: "flex",
|
|
2895
|
+
alignItems: "center",
|
|
2896
|
+
gap: "4px",
|
|
2897
|
+
padding: "4px 10px",
|
|
2898
|
+
fontSize: theme2.fontSizes[0],
|
|
2899
|
+
fontFamily: theme2.fonts.body,
|
|
2900
|
+
color: theme2.colors.textSecondary,
|
|
2901
|
+
backgroundColor: "transparent",
|
|
2902
|
+
border: `1px solid ${theme2.colors.border}`,
|
|
2903
|
+
borderRadius: "4px",
|
|
2904
|
+
cursor: "pointer",
|
|
2905
|
+
transition: "all 0.15s ease"
|
|
2906
|
+
},
|
|
2907
|
+
title: "Clear all agent activity",
|
|
2908
|
+
children: [
|
|
2909
|
+
/* @__PURE__ */ jsx(X, { size: 12 }),
|
|
2910
|
+
"Clear All"
|
|
2911
|
+
]
|
|
2912
|
+
}
|
|
2913
|
+
)
|
|
2914
|
+
]
|
|
2915
|
+
}
|
|
2916
|
+
),
|
|
2917
|
+
/* @__PURE__ */ jsx(
|
|
2918
|
+
"div",
|
|
2919
|
+
{
|
|
2920
|
+
style: {
|
|
2921
|
+
display: "flex",
|
|
2922
|
+
flexDirection: "column",
|
|
2923
|
+
flex: 1,
|
|
2924
|
+
overflowY: "auto"
|
|
2925
|
+
},
|
|
2926
|
+
children: [...layers].sort((a, b) => (b.timestamp ?? 0) - (a.timestamp ?? 0)).map((layer, index) => {
|
|
2927
|
+
const isExpanded = expandedLayers.has(layer.id);
|
|
2928
|
+
const fileCount = layer.items.length;
|
|
2929
|
+
return /* @__PURE__ */ jsxs(
|
|
2930
|
+
"div",
|
|
2931
|
+
{
|
|
2932
|
+
style: {
|
|
2933
|
+
borderBottom: index < layers.length - 1 ? `1px solid ${theme2.colors.border}` : "none"
|
|
2934
|
+
},
|
|
2935
|
+
children: [
|
|
2936
|
+
/* @__PURE__ */ jsxs(
|
|
2937
|
+
"div",
|
|
2938
|
+
{
|
|
2939
|
+
onClick: () => toggleExpanded(layer.id),
|
|
2940
|
+
style: {
|
|
2941
|
+
display: "flex",
|
|
2942
|
+
alignItems: "center",
|
|
2943
|
+
gap: "12px",
|
|
2944
|
+
padding: "12px 16px",
|
|
2945
|
+
backgroundColor: layer.enabled ? "transparent" : `${theme2.colors.backgroundLight}`,
|
|
2946
|
+
opacity: layer.enabled ? 1 : 0.6,
|
|
2947
|
+
cursor: "pointer",
|
|
2948
|
+
transition: "all 0.15s ease"
|
|
2949
|
+
},
|
|
2950
|
+
children: [
|
|
2951
|
+
/* @__PURE__ */ jsx(
|
|
2952
|
+
"div",
|
|
2953
|
+
{
|
|
2954
|
+
style: {
|
|
2955
|
+
display: "flex",
|
|
2956
|
+
alignItems: "center",
|
|
2957
|
+
justifyContent: "center",
|
|
2958
|
+
width: "20px",
|
|
2959
|
+
height: "20px",
|
|
2960
|
+
color: theme2.colors.textSecondary,
|
|
2961
|
+
flexShrink: 0
|
|
2962
|
+
},
|
|
2963
|
+
children: isExpanded ? /* @__PURE__ */ jsx(ChevronDown, { size: 16 }) : /* @__PURE__ */ jsx(ChevronRight, { size: 16 })
|
|
2964
|
+
}
|
|
2965
|
+
),
|
|
2966
|
+
/* @__PURE__ */ jsx(
|
|
2967
|
+
"div",
|
|
2968
|
+
{
|
|
2969
|
+
style: {
|
|
2970
|
+
width: "16px",
|
|
2971
|
+
height: "16px",
|
|
2972
|
+
backgroundColor: layer.color,
|
|
2973
|
+
borderRadius: "4px",
|
|
2974
|
+
flexShrink: 0,
|
|
2975
|
+
boxShadow: `0 0 8px ${layer.color}60`
|
|
2976
|
+
}
|
|
2977
|
+
}
|
|
2978
|
+
),
|
|
2979
|
+
/* @__PURE__ */ jsxs(
|
|
2980
|
+
"div",
|
|
2981
|
+
{
|
|
2982
|
+
style: {
|
|
2983
|
+
display: "flex",
|
|
2984
|
+
flexDirection: "column",
|
|
2985
|
+
gap: "2px",
|
|
2986
|
+
flex: 1,
|
|
2987
|
+
minWidth: 0
|
|
2988
|
+
},
|
|
2989
|
+
children: [
|
|
2990
|
+
/* @__PURE__ */ jsx(
|
|
2991
|
+
"div",
|
|
2992
|
+
{
|
|
2993
|
+
style: {
|
|
2994
|
+
display: "flex",
|
|
2995
|
+
alignItems: "center",
|
|
2996
|
+
gap: "8px"
|
|
2997
|
+
},
|
|
2998
|
+
children: /* @__PURE__ */ jsx(
|
|
2999
|
+
"span",
|
|
3000
|
+
{
|
|
3001
|
+
style: {
|
|
3002
|
+
fontFamily: theme2.fonts.body,
|
|
3003
|
+
fontSize: theme2.fontSizes[1],
|
|
3004
|
+
fontWeight: 500,
|
|
3005
|
+
color: theme2.colors.text,
|
|
3006
|
+
overflow: "hidden",
|
|
3007
|
+
textOverflow: "ellipsis",
|
|
3008
|
+
whiteSpace: "nowrap"
|
|
3009
|
+
},
|
|
3010
|
+
children: layer.name
|
|
3011
|
+
}
|
|
3012
|
+
)
|
|
3013
|
+
}
|
|
3014
|
+
),
|
|
3015
|
+
/* @__PURE__ */ jsxs(
|
|
3016
|
+
"div",
|
|
3017
|
+
{
|
|
3018
|
+
style: {
|
|
3019
|
+
display: "flex",
|
|
3020
|
+
alignItems: "center",
|
|
3021
|
+
gap: "12px",
|
|
3022
|
+
fontFamily: theme2.fonts.body,
|
|
3023
|
+
fontSize: theme2.fontSizes[0],
|
|
3024
|
+
color: theme2.colors.textSecondary
|
|
3025
|
+
},
|
|
3026
|
+
children: [
|
|
3027
|
+
/* @__PURE__ */ jsxs("span", { children: [
|
|
3028
|
+
fileCount,
|
|
3029
|
+
" ",
|
|
3030
|
+
fileCount === 1 ? "file" : "files"
|
|
3031
|
+
] }),
|
|
3032
|
+
layer.timestamp && /* @__PURE__ */ jsx("span", { children: formatTimestamp(layer.timestamp) })
|
|
3033
|
+
]
|
|
3034
|
+
}
|
|
3035
|
+
)
|
|
3036
|
+
]
|
|
3037
|
+
}
|
|
3038
|
+
),
|
|
3039
|
+
/* @__PURE__ */ jsx(
|
|
3040
|
+
"button",
|
|
3041
|
+
{
|
|
3042
|
+
onClick: (e) => {
|
|
3043
|
+
e.stopPropagation();
|
|
3044
|
+
onLayerClick == null ? void 0 : onLayerClick(layer.id);
|
|
3045
|
+
},
|
|
3046
|
+
style: {
|
|
3047
|
+
display: "flex",
|
|
3048
|
+
alignItems: "center",
|
|
3049
|
+
justifyContent: "center",
|
|
3050
|
+
width: "32px",
|
|
3051
|
+
height: "32px",
|
|
3052
|
+
padding: 0,
|
|
3053
|
+
backgroundColor: "transparent",
|
|
3054
|
+
border: `1px solid ${theme2.colors.border}`,
|
|
3055
|
+
borderRadius: "4px",
|
|
3056
|
+
cursor: onLayerClick ? "pointer" : "default",
|
|
3057
|
+
color: layer.enabled ? theme2.colors.primary : theme2.colors.textSecondary,
|
|
3058
|
+
flexShrink: 0,
|
|
3059
|
+
transition: "all 0.15s ease"
|
|
3060
|
+
},
|
|
3061
|
+
title: layer.enabled ? "Hide layer" : "Show layer",
|
|
3062
|
+
children: layer.enabled ? /* @__PURE__ */ jsx(Eye, { size: 16 }) : /* @__PURE__ */ jsx(EyeOff, { size: 16 })
|
|
3063
|
+
}
|
|
3064
|
+
)
|
|
3065
|
+
]
|
|
3066
|
+
}
|
|
3067
|
+
),
|
|
3068
|
+
isExpanded && /* @__PURE__ */ jsx(
|
|
3069
|
+
"div",
|
|
3070
|
+
{
|
|
3071
|
+
style: {
|
|
3072
|
+
backgroundColor: theme2.colors.backgroundLight,
|
|
3073
|
+
borderTop: `1px solid ${theme2.colors.border}`
|
|
3074
|
+
},
|
|
3075
|
+
children: layer.items.map((item, itemIndex) => /* @__PURE__ */ jsxs(
|
|
3076
|
+
"div",
|
|
3077
|
+
{
|
|
3078
|
+
style: {
|
|
3079
|
+
display: "flex",
|
|
3080
|
+
alignItems: "center",
|
|
3081
|
+
gap: "8px",
|
|
3082
|
+
padding: "8px 16px 8px 48px",
|
|
3083
|
+
borderBottom: itemIndex < layer.items.length - 1 ? `1px solid ${theme2.colors.border}40` : "none"
|
|
3084
|
+
},
|
|
3085
|
+
children: [
|
|
3086
|
+
/* @__PURE__ */ jsx(
|
|
3087
|
+
FileText,
|
|
3088
|
+
{
|
|
3089
|
+
size: 14,
|
|
3090
|
+
style: {
|
|
3091
|
+
color: layer.color,
|
|
3092
|
+
flexShrink: 0
|
|
3093
|
+
}
|
|
3094
|
+
}
|
|
3095
|
+
),
|
|
3096
|
+
/* @__PURE__ */ jsxs(
|
|
3097
|
+
"div",
|
|
3098
|
+
{
|
|
3099
|
+
style: {
|
|
3100
|
+
display: "flex",
|
|
3101
|
+
flexDirection: "column",
|
|
3102
|
+
gap: "1px",
|
|
3103
|
+
minWidth: 0,
|
|
3104
|
+
flex: 1
|
|
3105
|
+
},
|
|
3106
|
+
children: [
|
|
3107
|
+
/* @__PURE__ */ jsx(
|
|
3108
|
+
"span",
|
|
3109
|
+
{
|
|
3110
|
+
style: {
|
|
3111
|
+
fontFamily: theme2.fonts.body,
|
|
3112
|
+
fontSize: theme2.fontSizes[0],
|
|
3113
|
+
color: theme2.colors.text,
|
|
3114
|
+
overflow: "hidden",
|
|
3115
|
+
textOverflow: "ellipsis",
|
|
3116
|
+
whiteSpace: "nowrap"
|
|
3117
|
+
},
|
|
3118
|
+
children: getFileName(item.path)
|
|
3119
|
+
}
|
|
3120
|
+
),
|
|
3121
|
+
getDirectory(item.path) && /* @__PURE__ */ jsx(
|
|
3122
|
+
"span",
|
|
3123
|
+
{
|
|
3124
|
+
style: {
|
|
3125
|
+
fontFamily: theme2.fonts.body,
|
|
3126
|
+
fontSize: "10px",
|
|
3127
|
+
color: theme2.colors.textSecondary,
|
|
3128
|
+
overflow: "hidden",
|
|
3129
|
+
textOverflow: "ellipsis",
|
|
3130
|
+
whiteSpace: "nowrap"
|
|
3131
|
+
},
|
|
3132
|
+
children: getDirectory(item.path)
|
|
3133
|
+
}
|
|
3134
|
+
)
|
|
3135
|
+
]
|
|
3136
|
+
}
|
|
3137
|
+
),
|
|
3138
|
+
/* @__PURE__ */ jsx(
|
|
3139
|
+
"span",
|
|
3140
|
+
{
|
|
3141
|
+
style: {
|
|
3142
|
+
fontFamily: theme2.fonts.body,
|
|
3143
|
+
fontSize: "10px",
|
|
3144
|
+
color: theme2.colors.textSecondary,
|
|
3145
|
+
backgroundColor: `${layer.color}20`,
|
|
3146
|
+
padding: "2px 6px",
|
|
3147
|
+
borderRadius: "3px",
|
|
3148
|
+
textTransform: "uppercase",
|
|
3149
|
+
flexShrink: 0
|
|
3150
|
+
},
|
|
3151
|
+
children: item.renderStrategy
|
|
3152
|
+
}
|
|
3153
|
+
)
|
|
3154
|
+
]
|
|
3155
|
+
},
|
|
3156
|
+
item.path
|
|
3157
|
+
))
|
|
3158
|
+
}
|
|
3159
|
+
)
|
|
3160
|
+
]
|
|
3161
|
+
},
|
|
3162
|
+
layer.id
|
|
3163
|
+
);
|
|
3164
|
+
})
|
|
3165
|
+
}
|
|
3166
|
+
)
|
|
3167
|
+
]
|
|
3168
|
+
}
|
|
3169
|
+
);
|
|
3170
|
+
};
|
|
3171
|
+
const LegendTabs = ({
|
|
3172
|
+
tabs,
|
|
3173
|
+
defaultTab,
|
|
3174
|
+
onTabChange
|
|
3175
|
+
}) => {
|
|
3176
|
+
var _a;
|
|
3177
|
+
const { theme: theme2 } = useTheme();
|
|
3178
|
+
const [activeTab, setActiveTab] = React.useState(
|
|
3179
|
+
defaultTab || ((_a = tabs[0]) == null ? void 0 : _a.id) || "agent"
|
|
3180
|
+
);
|
|
3181
|
+
React.useEffect(() => {
|
|
3182
|
+
if (tabs.length > 0 && !tabs.find((t) => t.id === activeTab)) {
|
|
3183
|
+
setActiveTab(tabs[0].id);
|
|
3184
|
+
}
|
|
3185
|
+
}, [tabs, activeTab]);
|
|
3186
|
+
const handleTabClick = (tabId) => {
|
|
3187
|
+
setActiveTab(tabId);
|
|
3188
|
+
onTabChange == null ? void 0 : onTabChange(tabId);
|
|
3189
|
+
};
|
|
3190
|
+
if (tabs.length === 0) {
|
|
3191
|
+
return /* @__PURE__ */ jsx(
|
|
3192
|
+
"div",
|
|
3193
|
+
{
|
|
3194
|
+
style: {
|
|
3195
|
+
display: "flex",
|
|
3196
|
+
alignItems: "center",
|
|
3197
|
+
justifyContent: "center",
|
|
3198
|
+
flex: 1,
|
|
3199
|
+
padding: "24px 16px",
|
|
3200
|
+
color: theme2.colors.textSecondary,
|
|
3201
|
+
fontFamily: theme2.fonts.body,
|
|
3202
|
+
fontSize: theme2.fontSizes[0],
|
|
3203
|
+
fontStyle: "italic"
|
|
3204
|
+
},
|
|
3205
|
+
children: "No data available"
|
|
3206
|
+
}
|
|
3207
|
+
);
|
|
3208
|
+
}
|
|
3209
|
+
if (tabs.length === 1) {
|
|
3210
|
+
return /* @__PURE__ */ jsx("div", { style: { display: "flex", flexDirection: "column", flex: 1, minHeight: 0 }, children: tabs[0].content });
|
|
3211
|
+
}
|
|
3212
|
+
const activeTabData = tabs.find((t) => t.id === activeTab);
|
|
3213
|
+
return /* @__PURE__ */ jsxs(
|
|
3214
|
+
"div",
|
|
3215
|
+
{
|
|
3216
|
+
style: {
|
|
3217
|
+
display: "flex",
|
|
3218
|
+
flexDirection: "column",
|
|
3219
|
+
flex: 1,
|
|
3220
|
+
minHeight: 0,
|
|
3221
|
+
overflow: "hidden"
|
|
3222
|
+
},
|
|
3223
|
+
children: [
|
|
3224
|
+
/* @__PURE__ */ jsx(
|
|
3225
|
+
"div",
|
|
3226
|
+
{
|
|
3227
|
+
style: {
|
|
3228
|
+
display: "flex",
|
|
3229
|
+
flexShrink: 0
|
|
3230
|
+
},
|
|
3231
|
+
children: tabs.map((tab, index) => {
|
|
3232
|
+
const isActive = tab.id === activeTab;
|
|
3233
|
+
return /* @__PURE__ */ jsxs(
|
|
3234
|
+
"button",
|
|
3235
|
+
{
|
|
3236
|
+
onClick: () => handleTabClick(tab.id),
|
|
3237
|
+
style: {
|
|
3238
|
+
display: "flex",
|
|
3239
|
+
alignItems: "center",
|
|
3240
|
+
justifyContent: "center",
|
|
3241
|
+
gap: "6px",
|
|
3242
|
+
flex: 1,
|
|
3243
|
+
padding: "10px 12px",
|
|
3244
|
+
backgroundColor: theme2.colors.background,
|
|
3245
|
+
border: `1px solid ${theme2.colors.border}`,
|
|
3246
|
+
borderBottom: isActive ? `1px solid ${theme2.colors.background}` : `1px solid ${theme2.colors.border}`,
|
|
3247
|
+
borderLeft: index === 0 ? `1px solid ${theme2.colors.border}` : "none",
|
|
3248
|
+
marginBottom: "-1px",
|
|
3249
|
+
cursor: "pointer",
|
|
3250
|
+
fontFamily: theme2.fonts.body,
|
|
3251
|
+
fontSize: theme2.fontSizes[0],
|
|
3252
|
+
fontWeight: isActive ? 600 : 400,
|
|
3253
|
+
color: isActive ? theme2.colors.text : theme2.colors.textSecondary,
|
|
3254
|
+
opacity: isActive ? 1 : 0.9,
|
|
3255
|
+
transition: "all 0.15s ease"
|
|
3256
|
+
},
|
|
3257
|
+
children: [
|
|
3258
|
+
/* @__PURE__ */ jsx(
|
|
3259
|
+
"span",
|
|
3260
|
+
{
|
|
3261
|
+
style: {
|
|
3262
|
+
display: "flex",
|
|
3263
|
+
alignItems: "center",
|
|
3264
|
+
color: isActive ? theme2.colors.primary : theme2.colors.textSecondary
|
|
3265
|
+
},
|
|
3266
|
+
children: tab.icon
|
|
3267
|
+
}
|
|
3268
|
+
),
|
|
3269
|
+
/* @__PURE__ */ jsx("span", { children: tab.label }),
|
|
3270
|
+
tab.count !== void 0 && tab.count > 0 && /* @__PURE__ */ jsx(
|
|
2609
3271
|
"span",
|
|
2610
3272
|
{
|
|
2611
3273
|
style: {
|
|
2612
|
-
|
|
2613
|
-
|
|
2614
|
-
|
|
2615
|
-
|
|
3274
|
+
backgroundColor: isActive ? theme2.colors.primary : theme2.colors.border,
|
|
3275
|
+
color: isActive ? theme2.colors.background : theme2.colors.textSecondary,
|
|
3276
|
+
padding: "1px 6px",
|
|
3277
|
+
borderRadius: "8px",
|
|
3278
|
+
fontSize: "10px",
|
|
3279
|
+
fontWeight: 500,
|
|
3280
|
+
minWidth: "18px",
|
|
3281
|
+
textAlign: "center"
|
|
2616
3282
|
},
|
|
2617
|
-
children:
|
|
3283
|
+
children: tab.count
|
|
2618
3284
|
}
|
|
2619
3285
|
)
|
|
2620
3286
|
]
|
|
2621
3287
|
},
|
|
2622
|
-
|
|
2623
|
-
)
|
|
2624
|
-
}
|
|
2625
|
-
|
|
2626
|
-
|
|
3288
|
+
tab.id
|
|
3289
|
+
);
|
|
3290
|
+
})
|
|
3291
|
+
}
|
|
3292
|
+
),
|
|
3293
|
+
/* @__PURE__ */ jsx(
|
|
3294
|
+
"div",
|
|
3295
|
+
{
|
|
3296
|
+
style: {
|
|
3297
|
+
display: "flex",
|
|
3298
|
+
flexDirection: "column",
|
|
3299
|
+
flex: 1,
|
|
3300
|
+
minHeight: 0,
|
|
3301
|
+
overflow: "auto",
|
|
3302
|
+
borderTop: `1px solid ${theme2.colors.border}`
|
|
3303
|
+
},
|
|
3304
|
+
children: activeTabData == null ? void 0 : activeTabData.content
|
|
3305
|
+
}
|
|
3306
|
+
)
|
|
2627
3307
|
]
|
|
2628
3308
|
}
|
|
2629
3309
|
);
|
|
2630
3310
|
};
|
|
3311
|
+
const createAgentTab = (content, count2) => ({
|
|
3312
|
+
id: "agent",
|
|
3313
|
+
label: "Agent",
|
|
3314
|
+
icon: /* @__PURE__ */ jsx(Activity, { size: 14 }),
|
|
3315
|
+
count: count2,
|
|
3316
|
+
content
|
|
3317
|
+
});
|
|
3318
|
+
const createGitTab = (content, count2) => ({
|
|
3319
|
+
id: "git",
|
|
3320
|
+
label: "Git",
|
|
3321
|
+
icon: /* @__PURE__ */ jsx(GitBranch, { size: 14 }),
|
|
3322
|
+
count: count2,
|
|
3323
|
+
content
|
|
3324
|
+
});
|
|
2631
3325
|
function getDefaultExportFromCjs(x) {
|
|
2632
3326
|
return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, "default") ? x["default"] : x;
|
|
2633
3327
|
}
|
|
@@ -14258,9 +14952,11 @@ const COLOR_MODES = [
|
|
|
14258
14952
|
{ id: "fileTypes", name: "File Types", description: "Color by file extension" },
|
|
14259
14953
|
{ id: "git", name: "Git Status", description: "Color by git changes" },
|
|
14260
14954
|
{ id: "coverage", name: "Test Coverage", description: "Color by test coverage %" },
|
|
14261
|
-
{ id: "eslint", name: "Linting", description: "Color by ESLint issues" },
|
|
14955
|
+
{ id: "eslint", name: "Linting (ESLint)", description: "Color by ESLint issues" },
|
|
14956
|
+
{ id: "biome-lint", name: "Linting (Biome)", description: "Color by Biome lint issues" },
|
|
14262
14957
|
{ id: "typescript", name: "Type Safety", description: "Color by TypeScript errors" },
|
|
14263
|
-
{ id: "prettier", name: "Formatting", description: "Color by Prettier issues" },
|
|
14958
|
+
{ id: "prettier", name: "Formatting (Prettier)", description: "Color by Prettier issues" },
|
|
14959
|
+
{ id: "biome-format", name: "Formatting (Biome)", description: "Color by Biome format issues" },
|
|
14264
14960
|
{ id: "knip", name: "Dead Code", description: "Color by unused exports" },
|
|
14265
14961
|
{ id: "alexandria", name: "Documentation", description: "Color by doc coverage" }
|
|
14266
14962
|
];
|
|
@@ -14270,9 +14966,11 @@ const DEFAULT_COLOR_MODES = [
|
|
|
14270
14966
|
];
|
|
14271
14967
|
const QUALITY_COLOR_MODES = [
|
|
14272
14968
|
{ id: "coverage", name: "Test Coverage", description: "Color by test coverage %" },
|
|
14273
|
-
{ id: "eslint", name: "Linting", description: "Color by ESLint issues" },
|
|
14969
|
+
{ id: "eslint", name: "Linting (ESLint)", description: "Color by ESLint issues" },
|
|
14970
|
+
{ id: "biome-lint", name: "Linting (Biome)", description: "Color by Biome lint issues" },
|
|
14274
14971
|
{ id: "typescript", name: "Type Safety", description: "Color by TypeScript errors" },
|
|
14275
|
-
{ id: "prettier", name: "Formatting", description: "Color by Prettier issues" },
|
|
14972
|
+
{ id: "prettier", name: "Formatting (Prettier)", description: "Color by Prettier issues" },
|
|
14973
|
+
{ id: "biome-format", name: "Formatting (Biome)", description: "Color by Biome format issues" },
|
|
14276
14974
|
{ id: "knip", name: "Dead Code", description: "Color by unused exports" },
|
|
14277
14975
|
{ id: "alexandria", name: "Documentation", description: "Color by doc coverage" }
|
|
14278
14976
|
];
|
|
@@ -14458,6 +15156,116 @@ function createEslintHighlightLayers(buildings, eslintMetrics) {
|
|
|
14458
15156
|
}
|
|
14459
15157
|
return layers;
|
|
14460
15158
|
}
|
|
15159
|
+
function createBiomeLintHighlightLayers(buildings, biomeLintMetrics) {
|
|
15160
|
+
const buildingsByPath = new Map(buildings.map((b) => [b.path, b]));
|
|
15161
|
+
const metricsByPath = new Map(biomeLintMetrics.map((m) => [normalizePath(m.file), m]));
|
|
15162
|
+
const layerGroups = {
|
|
15163
|
+
clean: [],
|
|
15164
|
+
// 0 issues - green
|
|
15165
|
+
minor: [],
|
|
15166
|
+
// 1-3 issues - orange
|
|
15167
|
+
moderate: [],
|
|
15168
|
+
// 4-10 issues - orange-red
|
|
15169
|
+
significant: [],
|
|
15170
|
+
// 11-25 issues - red
|
|
15171
|
+
severe: [],
|
|
15172
|
+
// 26+ issues - dark red
|
|
15173
|
+
noData: []
|
|
15174
|
+
// No metric data
|
|
15175
|
+
};
|
|
15176
|
+
for (const [path, building] of buildingsByPath) {
|
|
15177
|
+
const normalizedPath = normalizePath(path);
|
|
15178
|
+
const metric = metricsByPath.get(normalizedPath);
|
|
15179
|
+
if (!metric) {
|
|
15180
|
+
layerGroups.noData.push({
|
|
15181
|
+
path: building.path,
|
|
15182
|
+
type: "file",
|
|
15183
|
+
renderStrategy: "fill"
|
|
15184
|
+
});
|
|
15185
|
+
} else {
|
|
15186
|
+
const issues = metric.issueCount;
|
|
15187
|
+
let bucket;
|
|
15188
|
+
if (issues === 0) bucket = "clean";
|
|
15189
|
+
else if (issues <= 3) bucket = "minor";
|
|
15190
|
+
else if (issues <= 10) bucket = "moderate";
|
|
15191
|
+
else if (issues <= 25) bucket = "significant";
|
|
15192
|
+
else bucket = "severe";
|
|
15193
|
+
layerGroups[bucket].push({
|
|
15194
|
+
path: building.path,
|
|
15195
|
+
type: "file",
|
|
15196
|
+
renderStrategy: "fill"
|
|
15197
|
+
});
|
|
15198
|
+
}
|
|
15199
|
+
}
|
|
15200
|
+
const layers = [];
|
|
15201
|
+
if (layerGroups.clean.length > 0) {
|
|
15202
|
+
layers.push({
|
|
15203
|
+
id: "biome-lint-clean",
|
|
15204
|
+
name: "0 issues",
|
|
15205
|
+
enabled: true,
|
|
15206
|
+
color: "#22c55e",
|
|
15207
|
+
// green - only for no lint issues
|
|
15208
|
+
priority: 50,
|
|
15209
|
+
items: layerGroups.clean
|
|
15210
|
+
});
|
|
15211
|
+
}
|
|
15212
|
+
if (layerGroups.minor.length > 0) {
|
|
15213
|
+
layers.push({
|
|
15214
|
+
id: "biome-lint-minor",
|
|
15215
|
+
name: "1-3 issues",
|
|
15216
|
+
enabled: true,
|
|
15217
|
+
color: "#f97316",
|
|
15218
|
+
// orange
|
|
15219
|
+
priority: 50,
|
|
15220
|
+
items: layerGroups.minor
|
|
15221
|
+
});
|
|
15222
|
+
}
|
|
15223
|
+
if (layerGroups.moderate.length > 0) {
|
|
15224
|
+
layers.push({
|
|
15225
|
+
id: "biome-lint-moderate",
|
|
15226
|
+
name: "4-10 issues",
|
|
15227
|
+
enabled: true,
|
|
15228
|
+
color: "#ea580c",
|
|
15229
|
+
// orange-600 (darker orange)
|
|
15230
|
+
priority: 50,
|
|
15231
|
+
items: layerGroups.moderate
|
|
15232
|
+
});
|
|
15233
|
+
}
|
|
15234
|
+
if (layerGroups.significant.length > 0) {
|
|
15235
|
+
layers.push({
|
|
15236
|
+
id: "biome-lint-significant",
|
|
15237
|
+
name: "11-25 issues",
|
|
15238
|
+
enabled: true,
|
|
15239
|
+
color: "#ef4444",
|
|
15240
|
+
// red
|
|
15241
|
+
priority: 50,
|
|
15242
|
+
items: layerGroups.significant
|
|
15243
|
+
});
|
|
15244
|
+
}
|
|
15245
|
+
if (layerGroups.severe.length > 0) {
|
|
15246
|
+
layers.push({
|
|
15247
|
+
id: "biome-lint-severe",
|
|
15248
|
+
name: "26+ issues",
|
|
15249
|
+
enabled: true,
|
|
15250
|
+
color: "#991b1b",
|
|
15251
|
+
// dark red
|
|
15252
|
+
priority: 50,
|
|
15253
|
+
items: layerGroups.severe
|
|
15254
|
+
});
|
|
15255
|
+
}
|
|
15256
|
+
if (layerGroups.noData.length > 0) {
|
|
15257
|
+
layers.push({
|
|
15258
|
+
id: "biome-lint-nodata",
|
|
15259
|
+
name: "No data",
|
|
15260
|
+
enabled: true,
|
|
15261
|
+
color: "#6b7280",
|
|
15262
|
+
// gray
|
|
15263
|
+
priority: 40,
|
|
15264
|
+
items: layerGroups.noData
|
|
15265
|
+
});
|
|
15266
|
+
}
|
|
15267
|
+
return layers;
|
|
15268
|
+
}
|
|
14461
15269
|
function createTypescriptHighlightLayers(buildings, typescriptMetrics) {
|
|
14462
15270
|
const buildingsByPath = new Map(buildings.map((b) => [b.path, b]));
|
|
14463
15271
|
const metricsByPath = new Map(typescriptMetrics.map((m) => [normalizePath(m.file), m]));
|
|
@@ -14678,6 +15486,116 @@ function createPrettierHighlightLayers(buildings, prettierMetrics) {
|
|
|
14678
15486
|
}
|
|
14679
15487
|
return layers;
|
|
14680
15488
|
}
|
|
15489
|
+
function createBiomeFormatHighlightLayers(buildings, biomeFormatMetrics) {
|
|
15490
|
+
const buildingsByPath = new Map(buildings.map((b) => [b.path, b]));
|
|
15491
|
+
const metricsByPath = new Map(biomeFormatMetrics.map((m) => [normalizePath(m.file), m]));
|
|
15492
|
+
const layerGroups = {
|
|
15493
|
+
clean: [],
|
|
15494
|
+
// 0 issues - green
|
|
15495
|
+
minor: [],
|
|
15496
|
+
// 1-3 issues - orange
|
|
15497
|
+
moderate: [],
|
|
15498
|
+
// 4-10 issues - orange-red
|
|
15499
|
+
significant: [],
|
|
15500
|
+
// 11-25 issues - red
|
|
15501
|
+
severe: [],
|
|
15502
|
+
// 26+ issues - dark red
|
|
15503
|
+
noData: []
|
|
15504
|
+
// No metric data
|
|
15505
|
+
};
|
|
15506
|
+
for (const [path, building] of buildingsByPath) {
|
|
15507
|
+
const normalizedPath = normalizePath(path);
|
|
15508
|
+
const metric = metricsByPath.get(normalizedPath);
|
|
15509
|
+
if (!metric) {
|
|
15510
|
+
layerGroups.noData.push({
|
|
15511
|
+
path: building.path,
|
|
15512
|
+
type: "file",
|
|
15513
|
+
renderStrategy: "fill"
|
|
15514
|
+
});
|
|
15515
|
+
} else {
|
|
15516
|
+
const issues = metric.issueCount;
|
|
15517
|
+
let bucket;
|
|
15518
|
+
if (issues === 0) bucket = "clean";
|
|
15519
|
+
else if (issues <= 3) bucket = "minor";
|
|
15520
|
+
else if (issues <= 10) bucket = "moderate";
|
|
15521
|
+
else if (issues <= 25) bucket = "significant";
|
|
15522
|
+
else bucket = "severe";
|
|
15523
|
+
layerGroups[bucket].push({
|
|
15524
|
+
path: building.path,
|
|
15525
|
+
type: "file",
|
|
15526
|
+
renderStrategy: "fill"
|
|
15527
|
+
});
|
|
15528
|
+
}
|
|
15529
|
+
}
|
|
15530
|
+
const layers = [];
|
|
15531
|
+
if (layerGroups.clean.length > 0) {
|
|
15532
|
+
layers.push({
|
|
15533
|
+
id: "biome-format-clean",
|
|
15534
|
+
name: "0 issues",
|
|
15535
|
+
enabled: true,
|
|
15536
|
+
color: "#22c55e",
|
|
15537
|
+
// green - only for perfect formatting
|
|
15538
|
+
priority: 50,
|
|
15539
|
+
items: layerGroups.clean
|
|
15540
|
+
});
|
|
15541
|
+
}
|
|
15542
|
+
if (layerGroups.minor.length > 0) {
|
|
15543
|
+
layers.push({
|
|
15544
|
+
id: "biome-format-minor",
|
|
15545
|
+
name: "1-3 issues",
|
|
15546
|
+
enabled: true,
|
|
15547
|
+
color: "#f97316",
|
|
15548
|
+
// orange
|
|
15549
|
+
priority: 50,
|
|
15550
|
+
items: layerGroups.minor
|
|
15551
|
+
});
|
|
15552
|
+
}
|
|
15553
|
+
if (layerGroups.moderate.length > 0) {
|
|
15554
|
+
layers.push({
|
|
15555
|
+
id: "biome-format-moderate",
|
|
15556
|
+
name: "4-10 issues",
|
|
15557
|
+
enabled: true,
|
|
15558
|
+
color: "#ea580c",
|
|
15559
|
+
// orange-600 (darker orange)
|
|
15560
|
+
priority: 50,
|
|
15561
|
+
items: layerGroups.moderate
|
|
15562
|
+
});
|
|
15563
|
+
}
|
|
15564
|
+
if (layerGroups.significant.length > 0) {
|
|
15565
|
+
layers.push({
|
|
15566
|
+
id: "biome-format-significant",
|
|
15567
|
+
name: "11-25 issues",
|
|
15568
|
+
enabled: true,
|
|
15569
|
+
color: "#ef4444",
|
|
15570
|
+
// red
|
|
15571
|
+
priority: 50,
|
|
15572
|
+
items: layerGroups.significant
|
|
15573
|
+
});
|
|
15574
|
+
}
|
|
15575
|
+
if (layerGroups.severe.length > 0) {
|
|
15576
|
+
layers.push({
|
|
15577
|
+
id: "biome-format-severe",
|
|
15578
|
+
name: "26+ issues",
|
|
15579
|
+
enabled: true,
|
|
15580
|
+
color: "#991b1b",
|
|
15581
|
+
// dark red
|
|
15582
|
+
priority: 50,
|
|
15583
|
+
items: layerGroups.severe
|
|
15584
|
+
});
|
|
15585
|
+
}
|
|
15586
|
+
if (layerGroups.noData.length > 0) {
|
|
15587
|
+
layers.push({
|
|
15588
|
+
id: "biome-format-nodata",
|
|
15589
|
+
name: "No data",
|
|
15590
|
+
enabled: true,
|
|
15591
|
+
color: "#6b7280",
|
|
15592
|
+
// gray
|
|
15593
|
+
priority: 40,
|
|
15594
|
+
items: layerGroups.noData
|
|
15595
|
+
});
|
|
15596
|
+
}
|
|
15597
|
+
return layers;
|
|
15598
|
+
}
|
|
14681
15599
|
function createKnipHighlightLayers(buildings, knipMetrics) {
|
|
14682
15600
|
const buildingsByPath = new Map(buildings.map((b) => [b.path, b]));
|
|
14683
15601
|
const metricsByPath = new Map(knipMetrics.map((m) => [normalizePath(m.file), m]));
|
|
@@ -14859,7 +15777,7 @@ function createAlexandriaHighlightLayers(buildings, alexandriaMetrics) {
|
|
|
14859
15777
|
return layers;
|
|
14860
15778
|
}
|
|
14861
15779
|
function getLayersForColorMode(mode, buildings, qualityData, fileColorLayers, gitLayers) {
|
|
14862
|
-
var _a, _b, _c, _d, _e;
|
|
15780
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
14863
15781
|
switch (mode) {
|
|
14864
15782
|
case "fileTypes":
|
|
14865
15783
|
return fileColorLayers;
|
|
@@ -14875,23 +15793,33 @@ function getLayersForColorMode(mode, buildings, qualityData, fileColorLayers, gi
|
|
|
14875
15793
|
return createEslintHighlightLayers(buildings, qualityData.fileMetrics.eslint);
|
|
14876
15794
|
}
|
|
14877
15795
|
return [];
|
|
15796
|
+
case "biome-lint":
|
|
15797
|
+
if ((_b = qualityData == null ? void 0 : qualityData.fileMetrics) == null ? void 0 : _b["biome-lint"]) {
|
|
15798
|
+
return createBiomeLintHighlightLayers(buildings, qualityData.fileMetrics["biome-lint"]);
|
|
15799
|
+
}
|
|
15800
|
+
return [];
|
|
14878
15801
|
case "typescript":
|
|
14879
|
-
if ((
|
|
15802
|
+
if ((_c = qualityData == null ? void 0 : qualityData.fileMetrics) == null ? void 0 : _c.typescript) {
|
|
14880
15803
|
return createTypescriptHighlightLayers(buildings, qualityData.fileMetrics.typescript);
|
|
14881
15804
|
}
|
|
14882
15805
|
return [];
|
|
14883
15806
|
case "prettier":
|
|
14884
|
-
if ((
|
|
15807
|
+
if ((_d = qualityData == null ? void 0 : qualityData.fileMetrics) == null ? void 0 : _d.prettier) {
|
|
14885
15808
|
return createPrettierHighlightLayers(buildings, qualityData.fileMetrics.prettier);
|
|
14886
15809
|
}
|
|
14887
15810
|
return [];
|
|
15811
|
+
case "biome-format":
|
|
15812
|
+
if ((_e = qualityData == null ? void 0 : qualityData.fileMetrics) == null ? void 0 : _e["biome-format"]) {
|
|
15813
|
+
return createBiomeFormatHighlightLayers(buildings, qualityData.fileMetrics["biome-format"]);
|
|
15814
|
+
}
|
|
15815
|
+
return [];
|
|
14888
15816
|
case "knip":
|
|
14889
|
-
if ((
|
|
15817
|
+
if ((_f = qualityData == null ? void 0 : qualityData.fileMetrics) == null ? void 0 : _f.knip) {
|
|
14890
15818
|
return createKnipHighlightLayers(buildings, qualityData.fileMetrics.knip);
|
|
14891
15819
|
}
|
|
14892
15820
|
return [];
|
|
14893
15821
|
case "alexandria":
|
|
14894
|
-
if ((
|
|
15822
|
+
if ((_g = qualityData == null ? void 0 : qualityData.fileMetrics) == null ? void 0 : _g.alexandria) {
|
|
14895
15823
|
return createAlexandriaHighlightLayers(buildings, qualityData.fileMetrics.alexandria);
|
|
14896
15824
|
}
|
|
14897
15825
|
return [];
|
|
@@ -14999,7 +15927,7 @@ const CodeCityPanelContent = ({
|
|
|
14999
15927
|
return COLOR_MODES.find((m) => m.id === colorMode) || COLOR_MODES[0];
|
|
15000
15928
|
}, [colorMode]);
|
|
15001
15929
|
const hoveredFileMetric = useMemo(() => {
|
|
15002
|
-
var _a2, _b2, _c2, _d2, _e2, _f2, _g2, _h2, _i2, _j2, _k2, _l2;
|
|
15930
|
+
var _a2, _b2, _c2, _d2, _e2, _f2, _g2, _h2, _i2, _j2, _k2, _l2, _m, _n, _o, _p;
|
|
15003
15931
|
if (!((_a2 = hoverInfo == null ? void 0 : hoverInfo.hoveredBuilding) == null ? void 0 : _a2.path)) return null;
|
|
15004
15932
|
const filePath = hoverInfo.hoveredBuilding.path;
|
|
15005
15933
|
if (!qualityData) return null;
|
|
@@ -15021,8 +15949,18 @@ const CodeCityPanelContent = ({
|
|
|
15021
15949
|
}
|
|
15022
15950
|
return { type: "eslint", value: null, label: "No lint data" };
|
|
15023
15951
|
}
|
|
15952
|
+
case "biome-lint": {
|
|
15953
|
+
const metric = (_f2 = (_e2 = qualityData.fileMetrics) == null ? void 0 : _e2["biome-lint"]) == null ? void 0 : _f2.find((m) => m.file === filePath);
|
|
15954
|
+
if (metric) {
|
|
15955
|
+
const parts = [];
|
|
15956
|
+
if (metric.errorCount > 0) parts.push(`${metric.errorCount} error${metric.errorCount > 1 ? "s" : ""}`);
|
|
15957
|
+
if (metric.warningCount > 0) parts.push(`${metric.warningCount} warning${metric.warningCount > 1 ? "s" : ""}`);
|
|
15958
|
+
return { type: "biome-lint", value: metric, label: parts.length > 0 ? parts.join(", ") : "No issues" };
|
|
15959
|
+
}
|
|
15960
|
+
return { type: "biome-lint", value: null, label: "No lint data" };
|
|
15961
|
+
}
|
|
15024
15962
|
case "typescript": {
|
|
15025
|
-
const metric = (
|
|
15963
|
+
const metric = (_h2 = (_g2 = qualityData.fileMetrics) == null ? void 0 : _g2.typescript) == null ? void 0 : _h2.find((m) => m.file === filePath);
|
|
15026
15964
|
if (metric) {
|
|
15027
15965
|
const errors = metric.errorCount;
|
|
15028
15966
|
return { type: "typescript", value: metric, label: errors > 0 ? `${errors} type error${errors > 1 ? "s" : ""}` : "No type errors" };
|
|
@@ -15030,15 +15968,23 @@ const CodeCityPanelContent = ({
|
|
|
15030
15968
|
return { type: "typescript", value: null, label: "No type data" };
|
|
15031
15969
|
}
|
|
15032
15970
|
case "prettier": {
|
|
15033
|
-
const metric = (
|
|
15971
|
+
const metric = (_j2 = (_i2 = qualityData.fileMetrics) == null ? void 0 : _i2.prettier) == null ? void 0 : _j2.find((m) => m.file === filePath);
|
|
15034
15972
|
if (metric) {
|
|
15035
15973
|
const issues = metric.issueCount;
|
|
15036
15974
|
return { type: "prettier", value: metric, label: issues > 0 ? `${issues} formatting issue${issues > 1 ? "s" : ""}` : "Properly formatted" };
|
|
15037
15975
|
}
|
|
15038
15976
|
return { type: "prettier", value: null, label: "No format data" };
|
|
15039
15977
|
}
|
|
15978
|
+
case "biome-format": {
|
|
15979
|
+
const metric = (_l2 = (_k2 = qualityData.fileMetrics) == null ? void 0 : _k2["biome-format"]) == null ? void 0 : _l2.find((m) => m.file === filePath);
|
|
15980
|
+
if (metric) {
|
|
15981
|
+
const issues = metric.issueCount;
|
|
15982
|
+
return { type: "biome-format", value: metric, label: issues > 0 ? `${issues} formatting issue${issues > 1 ? "s" : ""}` : "Properly formatted" };
|
|
15983
|
+
}
|
|
15984
|
+
return { type: "biome-format", value: null, label: "No format data" };
|
|
15985
|
+
}
|
|
15040
15986
|
case "knip": {
|
|
15041
|
-
const metric = (
|
|
15987
|
+
const metric = (_n = (_m = qualityData.fileMetrics) == null ? void 0 : _m.knip) == null ? void 0 : _n.find((m) => m.file === filePath);
|
|
15042
15988
|
if (metric) {
|
|
15043
15989
|
const issues = metric.issueCount;
|
|
15044
15990
|
return { type: "knip", value: metric, label: issues > 0 ? `${issues} unused export${issues > 1 ? "s" : ""}` : "No dead code" };
|
|
@@ -15046,7 +15992,7 @@ const CodeCityPanelContent = ({
|
|
|
15046
15992
|
return { type: "knip", value: null, label: "No dead code data" };
|
|
15047
15993
|
}
|
|
15048
15994
|
case "alexandria": {
|
|
15049
|
-
const metric = (
|
|
15995
|
+
const metric = (_p = (_o = qualityData.fileMetrics) == null ? void 0 : _o.alexandria) == null ? void 0 : _p.find((m) => m.file === filePath);
|
|
15050
15996
|
if (metric) {
|
|
15051
15997
|
const issues = metric.issueCount;
|
|
15052
15998
|
return { type: "alexandria", value: metric, label: issues > 0 ? `${issues} doc issue${issues > 1 ? "s" : ""}` : "Well documented" };
|
|
@@ -15254,16 +16200,36 @@ const CodeCityPanelContent = ({
|
|
|
15254
16200
|
enabled: layer.enabled
|
|
15255
16201
|
}));
|
|
15256
16202
|
}, [highlightLayers]);
|
|
16203
|
+
const agentActivityLayers = useMemo(() => {
|
|
16204
|
+
const agentLayers = highlightLayers.filter(
|
|
16205
|
+
(layer) => layer.id.startsWith("event-highlight")
|
|
16206
|
+
);
|
|
16207
|
+
return agentLayers.map((layer) => ({
|
|
16208
|
+
id: layer.id,
|
|
16209
|
+
name: layer.name,
|
|
16210
|
+
color: layer.color,
|
|
16211
|
+
enabled: layer.enabled,
|
|
16212
|
+
items: layer.items.map((item) => ({
|
|
16213
|
+
path: item.path,
|
|
16214
|
+
type: item.type,
|
|
16215
|
+
renderStrategy: item.renderStrategy || "fill"
|
|
16216
|
+
})),
|
|
16217
|
+
timestamp: layer.timestamp
|
|
16218
|
+
}));
|
|
16219
|
+
}, [highlightLayers]);
|
|
16220
|
+
const hasAgentActivity = agentActivityLayers.length > 0;
|
|
15257
16221
|
const legendQualityMetrics = useMemo(() => {
|
|
15258
|
-
const qualityModeIds = ["coverage", "eslint", "typescript", "prettier", "knip", "alexandria"];
|
|
16222
|
+
const qualityModeIds = ["coverage", "eslint", "biome-lint", "typescript", "prettier", "biome-format", "knip", "alexandria"];
|
|
15259
16223
|
if (!qualityModeIds.includes(colorMode)) {
|
|
15260
16224
|
return [];
|
|
15261
16225
|
}
|
|
15262
16226
|
const qualityLayerPrefixes = {
|
|
15263
16227
|
coverage: "coverage-",
|
|
15264
16228
|
eslint: "eslint-",
|
|
16229
|
+
"biome-lint": "biome-lint-",
|
|
15265
16230
|
typescript: "typescript-",
|
|
15266
16231
|
prettier: "prettier-",
|
|
16232
|
+
"biome-format": "biome-format-",
|
|
15267
16233
|
knip: "knip-",
|
|
15268
16234
|
alexandria: "alexandria-"
|
|
15269
16235
|
};
|
|
@@ -15329,7 +16295,7 @@ const CodeCityPanelContent = ({
|
|
|
15329
16295
|
}, []);
|
|
15330
16296
|
const toggleQualityMetric = useCallback((id2) => {
|
|
15331
16297
|
setHighlightLayers((prev) => {
|
|
15332
|
-
const qualityPrefixes = ["coverage-", "eslint-", "typescript-", "prettier-", "knip-", "alexandria-"];
|
|
16298
|
+
const qualityPrefixes = ["coverage-", "eslint-", "biome-lint-", "typescript-", "prettier-", "biome-format-", "knip-", "alexandria-"];
|
|
15333
16299
|
const isQualityLayer = (layerId) => qualityPrefixes.some((p) => layerId.startsWith(p));
|
|
15334
16300
|
const qualityLayers2 = prev.filter((l) => isQualityLayer(l.id));
|
|
15335
16301
|
const clickedLayer = qualityLayers2.find((l) => l.id === id2);
|
|
@@ -15787,7 +16753,40 @@ const CodeCityPanelContent = ({
|
|
|
15787
16753
|
]
|
|
15788
16754
|
}
|
|
15789
16755
|
),
|
|
15790
|
-
/* @__PURE__ */ jsx(
|
|
16756
|
+
hasAgentActivity ? /* @__PURE__ */ jsx(
|
|
16757
|
+
LegendTabs,
|
|
16758
|
+
{
|
|
16759
|
+
tabs: [
|
|
16760
|
+
createAgentTab(
|
|
16761
|
+
/* @__PURE__ */ jsx(
|
|
16762
|
+
AgentActivityView,
|
|
16763
|
+
{
|
|
16764
|
+
layers: agentActivityLayers,
|
|
16765
|
+
onLayerClick: toggleAgentLayer,
|
|
16766
|
+
onClearAll: clearAgentLayers,
|
|
16767
|
+
showHeader: false
|
|
16768
|
+
}
|
|
16769
|
+
),
|
|
16770
|
+
agentActivityLayers.length
|
|
16771
|
+
),
|
|
16772
|
+
...legendGitStatus.length > 0 ? [
|
|
16773
|
+
createGitTab(
|
|
16774
|
+
/* @__PURE__ */ jsx(
|
|
16775
|
+
Legend,
|
|
16776
|
+
{
|
|
16777
|
+
fileTypes: [],
|
|
16778
|
+
gitStatus: legendGitStatus,
|
|
16779
|
+
onGitStatusClick: toggleGitStatus,
|
|
16780
|
+
position: layout.legendPosition
|
|
16781
|
+
}
|
|
16782
|
+
),
|
|
16783
|
+
legendGitStatus.reduce((sum, s) => sum + s.count, 0)
|
|
16784
|
+
)
|
|
16785
|
+
] : []
|
|
16786
|
+
],
|
|
16787
|
+
defaultTab: "agent"
|
|
16788
|
+
}
|
|
16789
|
+
) : /* @__PURE__ */ jsx(
|
|
15791
16790
|
Legend,
|
|
15792
16791
|
{
|
|
15793
16792
|
fileTypes: legendFileTypes,
|