From ceef757fcc804a40dec0bacd4ce406fa67b1101b Mon Sep 17 00:00:00 2001 From: Rshig <90143161+rshigg@users.noreply.github.com> Date: Thu, 29 Jan 2026 18:00:27 -0500 Subject: [PATCH 1/2] feat: add collapsible sections to the package page --- app/components/CollapsibleSection.vue | 81 ++ app/components/PackageAccessControlsList.vue | 309 ++++++++ app/components/PackageDependenciesList.vue | 66 ++ .../PackageDownloadStatsContent.vue | 225 ++++++ app/components/PackageInstallScriptsList.vue | 108 +++ app/components/PackageMaintainersList.vue | 243 ++++++ .../PackageOptionalDependenciesList.vue | 56 ++ .../PackagePeerDependenciesList.vue | 75 ++ app/components/PackagePlaygroundsList.vue | 186 +++++ app/components/PackageVersionsList.vue | 724 ++++++++++++++++++ app/pages/[...package].vue | 259 ++++--- 11 files changed, 2228 insertions(+), 104 deletions(-) create mode 100644 app/components/CollapsibleSection.vue create mode 100644 app/components/PackageAccessControlsList.vue create mode 100644 app/components/PackageDependenciesList.vue create mode 100644 app/components/PackageDownloadStatsContent.vue create mode 100644 app/components/PackageInstallScriptsList.vue create mode 100644 app/components/PackageMaintainersList.vue create mode 100644 app/components/PackageOptionalDependenciesList.vue create mode 100644 app/components/PackagePeerDependenciesList.vue create mode 100644 app/components/PackagePlaygroundsList.vue create mode 100644 app/components/PackageVersionsList.vue diff --git a/app/components/CollapsibleSection.vue b/app/components/CollapsibleSection.vue new file mode 100644 index 000000000..06bd5db31 --- /dev/null +++ b/app/components/CollapsibleSection.vue @@ -0,0 +1,81 @@ + + + + + diff --git a/app/components/PackageAccessControlsList.vue b/app/components/PackageAccessControlsList.vue new file mode 100644 index 000000000..418efe239 --- /dev/null +++ b/app/components/PackageAccessControlsList.vue @@ -0,0 +1,309 @@ + + + diff --git a/app/components/PackageDependenciesList.vue b/app/components/PackageDependenciesList.vue new file mode 100644 index 000000000..e71ebb41e --- /dev/null +++ b/app/components/PackageDependenciesList.vue @@ -0,0 +1,66 @@ + + + diff --git a/app/components/PackageDownloadStatsContent.vue b/app/components/PackageDownloadStatsContent.vue new file mode 100644 index 000000000..b314075be --- /dev/null +++ b/app/components/PackageDownloadStatsContent.vue @@ -0,0 +1,225 @@ + + + + + diff --git a/app/components/PackageInstallScriptsList.vue b/app/components/PackageInstallScriptsList.vue new file mode 100644 index 000000000..5e737891c --- /dev/null +++ b/app/components/PackageInstallScriptsList.vue @@ -0,0 +1,108 @@ + + + diff --git a/app/components/PackageMaintainersList.vue b/app/components/PackageMaintainersList.vue new file mode 100644 index 000000000..9d8c2bcb0 --- /dev/null +++ b/app/components/PackageMaintainersList.vue @@ -0,0 +1,243 @@ + + + diff --git a/app/components/PackageOptionalDependenciesList.vue b/app/components/PackageOptionalDependenciesList.vue new file mode 100644 index 000000000..524b093c2 --- /dev/null +++ b/app/components/PackageOptionalDependenciesList.vue @@ -0,0 +1,56 @@ + + + diff --git a/app/components/PackagePeerDependenciesList.vue b/app/components/PackagePeerDependenciesList.vue new file mode 100644 index 000000000..d5f657e55 --- /dev/null +++ b/app/components/PackagePeerDependenciesList.vue @@ -0,0 +1,75 @@ + + + diff --git a/app/components/PackagePlaygroundsList.vue b/app/components/PackagePlaygroundsList.vue new file mode 100644 index 000000000..daa54cd3f --- /dev/null +++ b/app/components/PackagePlaygroundsList.vue @@ -0,0 +1,186 @@ + + + diff --git a/app/components/PackageVersionsList.vue b/app/components/PackageVersionsList.vue new file mode 100644 index 000000000..04f41a9e9 --- /dev/null +++ b/app/components/PackageVersionsList.vue @@ -0,0 +1,724 @@ + + + diff --git a/app/pages/[...package].vue b/app/pages/[...package].vue index 17de5aceb..56c9ae2cc 100644 --- a/app/pages/[...package].vue +++ b/app/pages/[...package].vue @@ -887,63 +887,32 @@ function handleClick(event: MouseEvent) { - -
-

- - {{ $t('package.readme.title') }} - -

- -
-

- {{ $t('package.readme.no_readme') }} - {{ - $t('package.readme.view_on_github') - }} -

-
- -
+
-
+ + +
+

+ + {{ $t('package.readme.title') }} + +

+ +
+

+ {{ $t('package.readme.no_readme') }} + {{ + $t('package.readme.view_on_github') + }} +

+
@@ -1049,9 +1091,9 @@ function handleClick(event: MouseEvent) { .package-page { display: grid; gap: 2rem; + grid-auto-rows: min-content; /* Mobile: single column, sidebar above readme */ - grid-template-columns: minmax(0, 1fr); grid-template-areas: 'header' 'install' @@ -1076,11 +1118,20 @@ function handleClick(event: MouseEvent) { @media (min-width: 1280px) { .package-page { grid-template-columns: 1fr 20rem; + /* Use min-content for top rows, 1fr for readme to absorb any extra sidebar height */ + grid-template-rows: repeat(3, min-content) 1fr; grid-template-areas: 'header sidebar' 'install sidebar' 'vulns sidebar' 'readme sidebar'; + + &:not(:has(.area-vulns)) { + /* If there is no vulnerabilities section we don't want extra space above the readme */ + .area-readme { + grid-row: vulns / readme; + } + } } } From 22b823e83bd7b43088ee2548f8007b9d9a794148 Mon Sep 17 00:00:00 2001 From: Rshig <90143161+rshigg@users.noreply.github.com> Date: Sat, 31 Jan 2026 10:31:20 -0500 Subject: [PATCH 2/2] consolidate PackageDependencies components --- app/components/CollapsibleSection.vue | 2 +- app/components/PackageDependenciesList.vue | 116 +++++++++++++----- .../PackageOptionalDependenciesList.vue | 56 --------- .../PackagePeerDependenciesList.vue | 75 ----------- app/pages/[...package].vue | 19 +-- 5 files changed, 98 insertions(+), 170 deletions(-) delete mode 100644 app/components/PackageOptionalDependenciesList.vue delete mode 100644 app/components/PackagePeerDependenciesList.vue diff --git a/app/components/CollapsibleSection.vue b/app/components/CollapsibleSection.vue index 06bd5db31..886b78171 100644 --- a/app/components/CollapsibleSection.vue +++ b/app/components/CollapsibleSection.vue @@ -18,7 +18,7 @@ defineProps<{ > -
+
-const props = defineProps<{ - dependencies: Record -}>() +const { t } = useI18n() -// Fetch outdated info for dependencies -const outdatedDeps = useOutdatedDependencies(() => props.dependencies) +const props = defineProps< + | { + type: 'dependencies' | 'optional' + dependencies: Record + } + | { + type: 'peer' + dependencies: Record + meta: Record + } +>() + +// Only fetch outdated info for regular dependencies +const outdatedDeps = + props.type === 'dependencies' ? useOutdatedDependencies(() => props.dependencies) : null // Expanded state -const depsExpanded = shallowRef(false) +const expanded = shallowRef(false) -// Sort dependencies alphabetically +// Sort dependencies const sortedDependencies = computed(() => { if (!props.dependencies) return [] - return Object.entries(props.dependencies).sort(([a], [b]) => a.localeCompare(b)) + + const entries = Object.entries(props.dependencies).map(([name, version]) => { + const outdated = outdatedDeps?.value?.[name] ?? null + return { + name, + version, + optional: props.type === 'peer' && !!props.meta?.[name]?.optional, + outdated, + versionClass: outdated ? getVersionClass(outdated) : 'text-fg-subtle', + versionTooltip: outdated ? getOutdatedTooltip(outdated, t) : version, + } + }) + + // Peer deps: required first, then optional; others: alphabetical + // Since non-peer deps always have optional=false, we can use the same sort for all + return entries.sort((a, b) => { + if (a.optional !== b.optional) return a.optional ? 1 : -1 + return a.name.localeCompare(b.name) + }) +}) + +// i18n key prefix based on type +const i18nPrefix = computed(() => { + switch (props.type) { + case 'peer': + return 'package.peer_dependencies' + case 'optional': + return 'package.optional_dependencies' + default: + case 'dependencies': + return 'package.dependencies' + } }) diff --git a/app/components/PackageOptionalDependenciesList.vue b/app/components/PackageOptionalDependenciesList.vue deleted file mode 100644 index 524b093c2..000000000 --- a/app/components/PackageOptionalDependenciesList.vue +++ /dev/null @@ -1,56 +0,0 @@ - - - diff --git a/app/components/PackagePeerDependenciesList.vue b/app/components/PackagePeerDependenciesList.vue deleted file mode 100644 index d5f657e55..000000000 --- a/app/components/PackagePeerDependenciesList.vue +++ /dev/null @@ -1,75 +0,0 @@ - - - diff --git a/app/pages/[...package].vue b/app/pages/[...package].vue index 56c9ae2cc..e8728d954 100644 --- a/app/pages/[...package].vue +++ b/app/pages/[...package].vue @@ -889,7 +889,7 @@ function handleClick(event: MouseEvent) {
-