Skip to content

Commit 302e6fe

Browse files
committed
better way to display competitors
1 parent 53c776d commit 302e6fe

File tree

2 files changed

+59
-4
lines changed

2 files changed

+59
-4
lines changed

src/routes/$libraryId/$version.docs.npm-stats.tsx

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,9 @@ import {
3030
getPackageColor,
3131
} from '~/components/npm-stats'
3232
import {
33-
getLibraryComparisonPackages,
33+
getLibraryNpmPackages,
3434
getAvailableFrameworkAdapters,
35+
getAvailableCompetitors,
3536
frameworkMeta,
3637
defaultColors,
3738
} from '~/utils/npm-packages'
@@ -86,8 +87,8 @@ function RouteComponent() {
8687
const search = Route.useSearch()
8788
const navigate = Route.useNavigate()
8889

89-
// Get library-specific packages with comparison packages
90-
const libraryPackages = getLibraryComparisonPackages(library)
90+
// Get library-specific packages (without competitors - they're shown as suggestions)
91+
const libraryPackages = getLibraryNpmPackages(library)
9192

9293
// Use search params or default to library packages
9394
const packageGroups: PackageGroup[] = search.packageGroups ?? libraryPackages
@@ -223,6 +224,9 @@ function RouteComponent() {
223224
packageGroups,
224225
)
225226

227+
// Get available competitor packages that aren't already in the chart
228+
const availableCompetitors = getAvailableCompetitors(library, packageGroups)
229+
226230
const handleBaselineChange = (packageName: string) => {
227231
navigate({
228232
to: '.',
@@ -358,14 +362,42 @@ function RouteComponent() {
358362
>
359363
<Plus className="w-3 h-3" />
360364
<span className="font-medium" style={{ color }}>
361-
{frameworkMeta[framework]?.name ?? framework}
365+
🌴 {frameworkMeta[framework]?.name ?? framework}-
366+
{library.id.charAt(0).toUpperCase() + library.id.slice(1)}
362367
</span>
363368
</button>
364369
</Tooltip>
365370
))}
366371
</div>
367372
)}
368373

374+
{/* Suggested Competitor Packages */}
375+
{availableCompetitors.length > 0 && (
376+
<div className="flex flex-wrap items-center gap-2 mb-4">
377+
<span className="text-xs text-gray-500 dark:text-gray-400">
378+
Compare with:
379+
</span>
380+
{availableCompetitors.map((competitor) => {
381+
const mainPackage = competitor.packages[0]?.name
382+
if (!mainPackage) return null
383+
const color = competitor.color ?? defaultColors[0]
384+
return (
385+
<Tooltip key={mainPackage} content={`Add ${mainPackage}`}>
386+
<button
387+
onClick={() => handleAddPackage(mainPackage, color)}
388+
className="flex items-center gap-1.5 px-2 py-1 text-xs rounded-md bg-gray-500/10 hover:bg-gray-500/20 transition-colors"
389+
>
390+
<Plus className="w-3 h-3" />
391+
<span className="font-medium" style={{ color }}>
392+
{mainPackage}
393+
</span>
394+
</button>
395+
</Tooltip>
396+
)
397+
})}
398+
</div>
399+
)}
400+
369401
{/* Color Picker Popover */}
370402
{colorPickerPackage && colorPickerPosition && (
371403
<ColorPickerPopover

src/utils/npm-packages.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,8 +205,31 @@ export function getLibraryNpmPackages(library: LibrarySlim): PackageGroup[] {
205205
return [getLibraryPackageGroup(library)]
206206
}
207207

208+
/**
209+
* Get available competitor packages for a library that aren't already in the current packages.
210+
*/
211+
export function getAvailableCompetitors(
212+
library: LibrarySlim,
213+
currentPackages: PackageGroup[],
214+
): PackageGroup[] {
215+
const competitors = libraryCompetitors[library.id] ?? []
216+
if (competitors.length === 0) return []
217+
218+
// Get all package names currently in the chart
219+
const currentPackageNames = new Set(
220+
currentPackages.flatMap((pg) => pg.packages.map((p) => p.name)),
221+
)
222+
223+
// Filter out competitors that are already added
224+
return competitors.filter((competitor) => {
225+
const mainPackageName = competitor.packages[0]?.name
226+
return mainPackageName && !currentPackageNames.has(mainPackageName)
227+
})
228+
}
229+
208230
/**
209231
* Get comparison packages for a library (library + competitors).
232+
* @deprecated Use getLibraryNpmPackages for default packages and getAvailableCompetitors for suggestions
210233
*/
211234
export function getLibraryComparisonPackages(
212235
library: LibrarySlim,

0 commit comments

Comments
 (0)