@@ -21,15 +21,6 @@ const version = computed(() => route.params.version as string)
2121const isScrolled = ref (false )
2222const { y } = useWindowScroll ()
2323
24- watch ([y , () => tableData .value .length , viewMode ], ([newY , count , mode ]) => {
25- if (mode !== ' table' && mode !== ' cards' ) {
26- isScrolled .value = false
27- return
28- }
29- const threshold = mode === ' table' ? 8 : 3
30- isScrolled .value = newY > 0 && count >= threshold
31- })
32-
3324// Fetch total install size
3425const {
3526 data : installSize,
@@ -55,6 +46,12 @@ function compare(a: SizeEntry, b: SizeEntry) {
5546 return sortDir .value === ' asc' ? comparison : - comparison
5647}
5748
49+ const { data : sizereqData } = usePackageDependencySizes (
50+ packageName ,
51+ version ,
52+ computed (() => installSize .value ?.dependencies ),
53+ )
54+
5855const tableData = computed (() => {
5956 if (! installSize .value ) return []
6057
@@ -63,12 +60,21 @@ const tableData = computed(() => {
6360 // Add dependencies
6461 if (installSize .value .dependencies ) {
6562 for (const dep of installSize .value .dependencies ) {
63+ const serverData = sizereqData .value ?.[dep .name ]
64+ const isSuccess = serverData ?.kind === ' success'
65+
6666 entries .push ({
6767 name: dep .name ,
6868 version: dep .version ,
69- selfSize: dep .size ,
70- totalSize: dep .totalSize ?? NaN ,
71- depCount: dep .dependencyCount ?? NaN ,
69+ selfSize: isSuccess && serverData .packageSize ? serverData .packageSize .selfSize : dep .size ,
70+ totalSize:
71+ isSuccess && serverData .packageSize
72+ ? serverData .packageSize .totalSize
73+ : (dep .totalSize ?? NaN ),
74+ depCount:
75+ isSuccess && serverData .packageSize
76+ ? serverData .packageSize .dependencyCount
77+ : (dep .dependencyCount ?? NaN ),
7278 percentage: (dep .size / installSize .value .totalSize ) * 100 ,
7379 })
7480 }
@@ -79,6 +85,20 @@ const tableData = computed(() => {
7985 return entries
8086})
8187
88+ const isStickyEnabled = computed (() => {
89+ if (viewMode .value !== ' table' && viewMode .value !== ' cards' ) return false
90+ const threshold = viewMode .value === ' table' ? 18 : 8
91+ return tableData .value .length >= threshold
92+ })
93+
94+ watch ([y , isStickyEnabled ], ([newY , stickyEnabled ]) => {
95+ if (! stickyEnabled ) {
96+ isScrolled .value = false
97+ return
98+ }
99+ isScrolled .value = newY > 0
100+ })
101+
82102useSeoMeta ({
83103 title : () => ` Sizes - ${packageName .value } - npmx ` ,
84104 description : () => ` Dependency sizes for ${packageName .value }@${version .value } ` ,
@@ -104,12 +124,13 @@ const bytesFormatter = useBytesFormatter()
104124 </div >
105125
106126 <header
107- class =" sticky top-[55px] z-20 border-b transition-all duration-300"
108- :class ="
127+ class =" z-20 border-b transition-all duration-300"
128+ :class =" [
129+ isStickyEnabled ? 'sticky top-[55px]' : '',
109130 isScrolled
110131 ? 'bg-bg/80 backdrop-blur-md pt-2 pb-2 border-border/50 shadow-sm'
111- : 'pt-4 pb-8 border-transparent'
112- "
132+ : 'pt-4 pb-8 border-transparent',
133+ ] "
113134 >
114135 <div class =" max-w-4xl mx-auto px-4 sm:px-8" >
115136 <div
@@ -127,10 +148,7 @@ const bytesFormatter = useBytesFormatter()
127148 class =" flex items-center gap-2 text-fg-muted font-mono transition-all duration-300 shrink-0"
128149 :class =" isScrolled ? 'text-xs' : 'text-lg'"
129150 >
130- <LinkBase
131- :to =" packageRoute(packageName, version)"
132- class =" hover:text-accent transition-colors"
133- >
151+ <LinkBase :to =" packageRoute(packageName, version)" >
134152 {{ packageName }}
135153 </LinkBase >
136154 <span >@</span >
@@ -204,7 +222,7 @@ const bytesFormatter = useBytesFormatter()
204222 :version =" version"
205223 :package-size =" installSize"
206224 class =" transition-all duration-300 min-w-[100px]"
207- :class =" isScrolled ? 'flex-1' : 'w-full '"
225+ :class =" isScrolled ? 'flex-1' : ''"
208226 :height =" isScrolled ? 'h-6' : 'h-10'"
209227 />
210228
0 commit comments