@@ -30,8 +30,9 @@ import {
3030 getPackageColor ,
3131} from '~/components/npm-stats'
3232import {
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
0 commit comments