@industry-theme/file-city-panel 0.2.21 → 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.
@@ -1 +1 @@
1
- {"version":3,"file":"CodeCityPanel.d.ts","sourceRoot":"","sources":["../../src/panels/CodeCityPanel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA4D,MAAM,OAAO,CAAC;AAuBjF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAQpD;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AA0qCD;;;;;;;;;;GAUG;AACH,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,mBAAmB,CAEvD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,oBAAoB,EAAE,KAAK,CAAC,EA8BxC,CAAC"}
1
+ {"version":3,"file":"CodeCityPanel.d.ts","sourceRoot":"","sources":["../../src/panels/CodeCityPanel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA4D,MAAM,OAAO,CAAC;AAuBjF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAQpD;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AA8rCD;;;;;;;;;;GAUG;AACH,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,mBAAmB,CAEvD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,oBAAoB,EAAE,KAAK,CAAC,EA8BxC,CAAC"}
@@ -25,8 +25,10 @@ export interface QualitySliceData {
25
25
  fileCoverage?: Record<string, number>;
26
26
  fileMetrics?: {
27
27
  eslint?: FileMetricData[];
28
+ 'biome-lint'?: FileMetricData[];
28
29
  typescript?: FileMetricData[];
29
30
  prettier?: FileMetricData[];
31
+ 'biome-format'?: FileMetricData[];
30
32
  knip?: FileMetricData[];
31
33
  alexandria?: FileMetricData[];
32
34
  };
@@ -47,7 +49,7 @@ export interface HighlightLayer {
47
49
  /**
48
50
  * Color mode options for the visualization
49
51
  */
50
- export type ColorMode = 'fileTypes' | 'git' | 'coverage' | 'eslint' | 'typescript' | 'prettier' | 'knip' | 'alexandria';
52
+ export type ColorMode = 'fileTypes' | 'git' | 'coverage' | 'eslint' | 'biome-lint' | 'typescript' | 'prettier' | 'biome-format' | 'knip' | 'alexandria';
51
53
  /**
52
54
  * Color mode configuration
53
55
  */
@@ -121,6 +123,11 @@ export declare function createMetricHighlightLayers(buildings: CityBuilding[], m
121
123
  * Uses a stricter color scheme: green only for clean files, orange-to-red for any issues
122
124
  */
123
125
  export declare function createEslintHighlightLayers(buildings: CityBuilding[], eslintMetrics: FileMetricData[]): HighlightLayer[];
126
+ /**
127
+ * Create Biome Lint highlight layers
128
+ * Uses a stricter color scheme: green only for clean files, orange-to-red for any issues
129
+ */
130
+ export declare function createBiomeLintHighlightLayers(buildings: CityBuilding[], biomeLintMetrics: FileMetricData[]): HighlightLayer[];
124
131
  /**
125
132
  * Create TypeScript highlight layers
126
133
  * Uses a stricter color scheme: green only for clean files, orange-to-red for any issues
@@ -131,6 +138,11 @@ export declare function createTypescriptHighlightLayers(buildings: CityBuilding[
131
138
  * Uses a stricter color scheme: green only for clean files, orange-to-red for any issues
132
139
  */
133
140
  export declare function createPrettierHighlightLayers(buildings: CityBuilding[], prettierMetrics: FileMetricData[]): HighlightLayer[];
141
+ /**
142
+ * Create Biome Format highlight layers
143
+ * Uses a stricter color scheme: green only for clean files, orange-to-red for any issues
144
+ */
145
+ export declare function createBiomeFormatHighlightLayers(buildings: CityBuilding[], biomeFormatMetrics: FileMetricData[]): HighlightLayer[];
134
146
  /**
135
147
  * Create Knip highlight layers
136
148
  * Uses a stricter color scheme: green only for clean files, orange-to-red for any issues
@@ -1 +1 @@
1
- {"version":3,"file":"qualityLayers.d.ts","sourceRoot":"","sources":["../../../src/panels/utils/qualityLayers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"qualityLayers.d.ts","sourceRoot":"","sources":["../../../src/panels/utils/qualityLayers.ts"],"names":[],"mappings":"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"}
@@ -14952,9 +14952,11 @@ const COLOR_MODES = [
14952
14952
  { id: "fileTypes", name: "File Types", description: "Color by file extension" },
14953
14953
  { id: "git", name: "Git Status", description: "Color by git changes" },
14954
14954
  { id: "coverage", name: "Test Coverage", description: "Color by test coverage %" },
14955
- { 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" },
14956
14957
  { id: "typescript", name: "Type Safety", description: "Color by TypeScript errors" },
14957
- { 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" },
14958
14960
  { id: "knip", name: "Dead Code", description: "Color by unused exports" },
14959
14961
  { id: "alexandria", name: "Documentation", description: "Color by doc coverage" }
14960
14962
  ];
@@ -14964,9 +14966,11 @@ const DEFAULT_COLOR_MODES = [
14964
14966
  ];
14965
14967
  const QUALITY_COLOR_MODES = [
14966
14968
  { id: "coverage", name: "Test Coverage", description: "Color by test coverage %" },
14967
- { 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" },
14968
14971
  { id: "typescript", name: "Type Safety", description: "Color by TypeScript errors" },
14969
- { 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" },
14970
14974
  { id: "knip", name: "Dead Code", description: "Color by unused exports" },
14971
14975
  { id: "alexandria", name: "Documentation", description: "Color by doc coverage" }
14972
14976
  ];
@@ -15152,6 +15156,116 @@ function createEslintHighlightLayers(buildings, eslintMetrics) {
15152
15156
  }
15153
15157
  return layers;
15154
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
+ }
15155
15269
  function createTypescriptHighlightLayers(buildings, typescriptMetrics) {
15156
15270
  const buildingsByPath = new Map(buildings.map((b) => [b.path, b]));
15157
15271
  const metricsByPath = new Map(typescriptMetrics.map((m) => [normalizePath(m.file), m]));
@@ -15372,6 +15486,116 @@ function createPrettierHighlightLayers(buildings, prettierMetrics) {
15372
15486
  }
15373
15487
  return layers;
15374
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
+ }
15375
15599
  function createKnipHighlightLayers(buildings, knipMetrics) {
15376
15600
  const buildingsByPath = new Map(buildings.map((b) => [b.path, b]));
15377
15601
  const metricsByPath = new Map(knipMetrics.map((m) => [normalizePath(m.file), m]));
@@ -15553,7 +15777,7 @@ function createAlexandriaHighlightLayers(buildings, alexandriaMetrics) {
15553
15777
  return layers;
15554
15778
  }
15555
15779
  function getLayersForColorMode(mode, buildings, qualityData, fileColorLayers, gitLayers) {
15556
- var _a, _b, _c, _d, _e;
15780
+ var _a, _b, _c, _d, _e, _f, _g;
15557
15781
  switch (mode) {
15558
15782
  case "fileTypes":
15559
15783
  return fileColorLayers;
@@ -15569,23 +15793,33 @@ function getLayersForColorMode(mode, buildings, qualityData, fileColorLayers, gi
15569
15793
  return createEslintHighlightLayers(buildings, qualityData.fileMetrics.eslint);
15570
15794
  }
15571
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 [];
15572
15801
  case "typescript":
15573
- if ((_b = qualityData == null ? void 0 : qualityData.fileMetrics) == null ? void 0 : _b.typescript) {
15802
+ if ((_c = qualityData == null ? void 0 : qualityData.fileMetrics) == null ? void 0 : _c.typescript) {
15574
15803
  return createTypescriptHighlightLayers(buildings, qualityData.fileMetrics.typescript);
15575
15804
  }
15576
15805
  return [];
15577
15806
  case "prettier":
15578
- if ((_c = qualityData == null ? void 0 : qualityData.fileMetrics) == null ? void 0 : _c.prettier) {
15807
+ if ((_d = qualityData == null ? void 0 : qualityData.fileMetrics) == null ? void 0 : _d.prettier) {
15579
15808
  return createPrettierHighlightLayers(buildings, qualityData.fileMetrics.prettier);
15580
15809
  }
15581
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 [];
15582
15816
  case "knip":
15583
- if ((_d = qualityData == null ? void 0 : qualityData.fileMetrics) == null ? void 0 : _d.knip) {
15817
+ if ((_f = qualityData == null ? void 0 : qualityData.fileMetrics) == null ? void 0 : _f.knip) {
15584
15818
  return createKnipHighlightLayers(buildings, qualityData.fileMetrics.knip);
15585
15819
  }
15586
15820
  return [];
15587
15821
  case "alexandria":
15588
- if ((_e = qualityData == null ? void 0 : qualityData.fileMetrics) == null ? void 0 : _e.alexandria) {
15822
+ if ((_g = qualityData == null ? void 0 : qualityData.fileMetrics) == null ? void 0 : _g.alexandria) {
15589
15823
  return createAlexandriaHighlightLayers(buildings, qualityData.fileMetrics.alexandria);
15590
15824
  }
15591
15825
  return [];
@@ -15693,7 +15927,7 @@ const CodeCityPanelContent = ({
15693
15927
  return COLOR_MODES.find((m) => m.id === colorMode) || COLOR_MODES[0];
15694
15928
  }, [colorMode]);
15695
15929
  const hoveredFileMetric = useMemo(() => {
15696
- 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;
15697
15931
  if (!((_a2 = hoverInfo == null ? void 0 : hoverInfo.hoveredBuilding) == null ? void 0 : _a2.path)) return null;
15698
15932
  const filePath = hoverInfo.hoveredBuilding.path;
15699
15933
  if (!qualityData) return null;
@@ -15715,8 +15949,18 @@ const CodeCityPanelContent = ({
15715
15949
  }
15716
15950
  return { type: "eslint", value: null, label: "No lint data" };
15717
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
+ }
15718
15962
  case "typescript": {
15719
- const metric = (_f2 = (_e2 = qualityData.fileMetrics) == null ? void 0 : _e2.typescript) == null ? void 0 : _f2.find((m) => m.file === filePath);
15963
+ const metric = (_h2 = (_g2 = qualityData.fileMetrics) == null ? void 0 : _g2.typescript) == null ? void 0 : _h2.find((m) => m.file === filePath);
15720
15964
  if (metric) {
15721
15965
  const errors = metric.errorCount;
15722
15966
  return { type: "typescript", value: metric, label: errors > 0 ? `${errors} type error${errors > 1 ? "s" : ""}` : "No type errors" };
@@ -15724,15 +15968,23 @@ const CodeCityPanelContent = ({
15724
15968
  return { type: "typescript", value: null, label: "No type data" };
15725
15969
  }
15726
15970
  case "prettier": {
15727
- const metric = (_h2 = (_g2 = qualityData.fileMetrics) == null ? void 0 : _g2.prettier) == null ? void 0 : _h2.find((m) => m.file === filePath);
15971
+ const metric = (_j2 = (_i2 = qualityData.fileMetrics) == null ? void 0 : _i2.prettier) == null ? void 0 : _j2.find((m) => m.file === filePath);
15728
15972
  if (metric) {
15729
15973
  const issues = metric.issueCount;
15730
15974
  return { type: "prettier", value: metric, label: issues > 0 ? `${issues} formatting issue${issues > 1 ? "s" : ""}` : "Properly formatted" };
15731
15975
  }
15732
15976
  return { type: "prettier", value: null, label: "No format data" };
15733
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
+ }
15734
15986
  case "knip": {
15735
- const metric = (_j2 = (_i2 = qualityData.fileMetrics) == null ? void 0 : _i2.knip) == null ? void 0 : _j2.find((m) => m.file === filePath);
15987
+ const metric = (_n = (_m = qualityData.fileMetrics) == null ? void 0 : _m.knip) == null ? void 0 : _n.find((m) => m.file === filePath);
15736
15988
  if (metric) {
15737
15989
  const issues = metric.issueCount;
15738
15990
  return { type: "knip", value: metric, label: issues > 0 ? `${issues} unused export${issues > 1 ? "s" : ""}` : "No dead code" };
@@ -15740,7 +15992,7 @@ const CodeCityPanelContent = ({
15740
15992
  return { type: "knip", value: null, label: "No dead code data" };
15741
15993
  }
15742
15994
  case "alexandria": {
15743
- const metric = (_l2 = (_k2 = qualityData.fileMetrics) == null ? void 0 : _k2.alexandria) == null ? void 0 : _l2.find((m) => m.file === filePath);
15995
+ const metric = (_p = (_o = qualityData.fileMetrics) == null ? void 0 : _o.alexandria) == null ? void 0 : _p.find((m) => m.file === filePath);
15744
15996
  if (metric) {
15745
15997
  const issues = metric.issueCount;
15746
15998
  return { type: "alexandria", value: metric, label: issues > 0 ? `${issues} doc issue${issues > 1 ? "s" : ""}` : "Well documented" };
@@ -15967,15 +16219,17 @@ const CodeCityPanelContent = ({
15967
16219
  }, [highlightLayers]);
15968
16220
  const hasAgentActivity = agentActivityLayers.length > 0;
15969
16221
  const legendQualityMetrics = useMemo(() => {
15970
- const qualityModeIds = ["coverage", "eslint", "typescript", "prettier", "knip", "alexandria"];
16222
+ const qualityModeIds = ["coverage", "eslint", "biome-lint", "typescript", "prettier", "biome-format", "knip", "alexandria"];
15971
16223
  if (!qualityModeIds.includes(colorMode)) {
15972
16224
  return [];
15973
16225
  }
15974
16226
  const qualityLayerPrefixes = {
15975
16227
  coverage: "coverage-",
15976
16228
  eslint: "eslint-",
16229
+ "biome-lint": "biome-lint-",
15977
16230
  typescript: "typescript-",
15978
16231
  prettier: "prettier-",
16232
+ "biome-format": "biome-format-",
15979
16233
  knip: "knip-",
15980
16234
  alexandria: "alexandria-"
15981
16235
  };
@@ -16041,7 +16295,7 @@ const CodeCityPanelContent = ({
16041
16295
  }, []);
16042
16296
  const toggleQualityMetric = useCallback((id2) => {
16043
16297
  setHighlightLayers((prev) => {
16044
- const qualityPrefixes = ["coverage-", "eslint-", "typescript-", "prettier-", "knip-", "alexandria-"];
16298
+ const qualityPrefixes = ["coverage-", "eslint-", "biome-lint-", "typescript-", "prettier-", "biome-format-", "knip-", "alexandria-"];
16045
16299
  const isQualityLayer = (layerId) => qualityPrefixes.some((p) => layerId.startsWith(p));
16046
16300
  const qualityLayers2 = prev.filter((l) => isQualityLayer(l.id));
16047
16301
  const clickedLayer = qualityLayers2.find((l) => l.id === id2);