Skip to content

Commit 897244e

Browse files
committed
fix: update sticky package header logic
1 parent ab9b15e commit 897244e

6 files changed

Lines changed: 174 additions & 154 deletions

File tree

app/components/Package/Header.vue

Lines changed: 103 additions & 99 deletions
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,7 @@ const likeAction = async () => {
248248

249249
<template>
250250
<!-- Package header -->
251-
<header class="bg-bg pt-2">
251+
<header class="bg-bg pt-2 w-full container">
252252
<!-- Package name and version -->
253253
<div class="flex items-baseline justify-between gap-x-2 gap-y-1 flex-wrap min-w-0">
254254
<CopyToClipboardButton
@@ -320,112 +320,116 @@ const likeAction = async () => {
320320
</header>
321321
<div
322322
ref="header"
323-
class="bg-bg sticky top-14 z-1 border-b border-border flex flex-col md:flex-row-reverse items-baseline justify-between gap-x-2 gap-y-1 flex-wrap min-w-0 pt-2"
323+
class="w-full bg-bg sticky top-14 z-1 border-b border-border pt-2"
324324
:class="[$style.packageHeader]"
325325
data-testid="package-subheader"
326326
>
327327
<div
328-
class="flex items-center max-md:justify-between max-md:w-full max-md:flex-row-reverse gap-2"
328+
class="w-full container flex flex-col md:flex-row-reverse items-baseline justify-between gap-x-2 gap-y-1 flex-wrap"
329329
>
330-
<ButtonBase
331-
variant="secondary"
332-
:aria-label="$t('common.scroll_to_top')"
333-
@click="scrollToTop"
334-
classicon="i-lucide:arrow-up"
335-
:class="showScrollToTop ? '' : 'opacity-0 pointer-events-none select-none'"
336-
class="py-1.5 px-2.5 sm:me-2"
337-
:tabindex="showScrollToTop ? 0 : -1"
338-
/>
339-
<div class="flex-inline items-center flex-nowrap gap-1 font-mono text-fg-muted">
340-
<template v-if="displayVersion && hasProvenance(displayVersion)">
341-
<TooltipApp
342-
:text="
343-
provenanceData && provenanceStatus !== 'pending'
344-
? $t('package.provenance_section.built_and_signed_on', {
345-
provider: provenanceData.providerLabel,
346-
})
347-
: $t('package.verified_provenance')
348-
"
349-
position="bottom"
350-
strategy="fixed"
351-
>
352-
<LinkBase
353-
variant="button-secondary"
354-
:to="packageRoute(packageName, resolvedVersion, '#provenance')"
355-
:aria-label="$t('package.provenance_section.view_more_details')"
356-
classicon="i-lucide:shield-check"
357-
class="py-1.5 px-2.5 me-2"
358-
/>
359-
</TooltipApp>
360-
</template>
361-
<!-- Version resolution indicator (e.g., "latest → 4.2.0") -->
362-
<template v-if="requestedVersion && resolvedVersion !== requestedVersion">
363-
<TooltipApp
364-
:text="requestedVersion"
365-
position="bottom"
366-
strategy="fixed"
367-
class="vertical-middle"
368-
>
369-
<span class="i-lucide:cable rtl-flip min-w-3 w-3 h-3 mx-1" aria-hidden="true" />
370-
</TooltipApp>
371-
</template>
372-
<!-- Version selector -->
373-
<VersionSelector
374-
v-if="resolvedVersion && pkg?.versions && pkg?.['dist-tags']"
375-
:package-name="packageName"
376-
:current-version="resolvedVersion"
377-
:versions="pkg.versions"
378-
:dist-tags="pkg['dist-tags']"
379-
:url-pattern="versionUrlPattern"
330+
<div
331+
class="flex items-center max-md:justify-between max-md:w-full max-md:flex-row-reverse gap-2"
332+
>
333+
<ButtonBase
334+
variant="secondary"
335+
:aria-label="$t('common.scroll_to_top')"
336+
@click="scrollToTop"
337+
classicon="i-lucide:arrow-up"
338+
:class="showScrollToTop ? '' : 'opacity-0 pointer-events-none select-none'"
339+
class="py-1.5 px-2.5 sm:me-2"
340+
:tabindex="showScrollToTop ? 0 : -1"
380341
/>
342+
<div class="flex-inline items-center flex-nowrap gap-1 font-mono text-fg-muted">
343+
<template v-if="displayVersion && hasProvenance(displayVersion)">
344+
<TooltipApp
345+
:text="
346+
provenanceData && provenanceStatus !== 'pending'
347+
? $t('package.provenance_section.built_and_signed_on', {
348+
provider: provenanceData.providerLabel,
349+
})
350+
: $t('package.verified_provenance')
351+
"
352+
position="bottom"
353+
strategy="fixed"
354+
>
355+
<LinkBase
356+
variant="button-secondary"
357+
:to="packageRoute(packageName, resolvedVersion, '#provenance')"
358+
:aria-label="$t('package.provenance_section.view_more_details')"
359+
classicon="i-lucide:shield-check"
360+
class="py-1.5 px-2.5 me-2"
361+
/>
362+
</TooltipApp>
363+
</template>
364+
<!-- Version resolution indicator (e.g., "latest → 4.2.0") -->
365+
<template v-if="requestedVersion && resolvedVersion !== requestedVersion">
366+
<TooltipApp
367+
:text="requestedVersion"
368+
position="bottom"
369+
strategy="fixed"
370+
class="vertical-middle"
371+
>
372+
<span class="i-lucide:cable rtl-flip min-w-3 w-3 h-3 mx-1" aria-hidden="true" />
373+
</TooltipApp>
374+
</template>
375+
<!-- Version selector -->
376+
<VersionSelector
377+
v-if="resolvedVersion && pkg?.versions && pkg?.['dist-tags']"
378+
:package-name="packageName"
379+
:current-version="resolvedVersion"
380+
:versions="pkg.versions"
381+
:dist-tags="pkg['dist-tags']"
382+
:url-pattern="versionUrlPattern"
383+
/>
384+
</div>
381385
</div>
382-
</div>
383-
<!-- Docs + Code — inline on desktop, floating bottom bar on mobile -->
384-
<nav
385-
v-if="resolvedVersion"
386-
:aria-label="$t('package.navigation')"
387-
class="flex gap-4 me-auto -mb-px"
388-
:style="navExtraOffsetStyle"
389-
:class="$style.packageNav"
390-
>
391-
<LinkBase
392-
v-if="mainLink"
393-
:to="mainLink"
394-
aria-keyshortcuts="m"
395-
class="decoration-none border-b-2 p-1 hover:border-accent/50 lowercase"
396-
:class="page === 'main' ? 'border-accent text-accent!' : 'border-transparent'"
397-
>
398-
{{ $t('package.links.main') }}
399-
</LinkBase>
400-
<LinkBase
401-
v-if="docsLink"
402-
:to="docsLink"
403-
aria-keyshortcuts="d"
404-
class="decoration-none border-b-2 p-1 hover:border-accent/50"
405-
:class="page === 'docs' ? 'border-accent text-accent!' : 'border-transparent'"
406-
>
407-
{{ $t('package.links.docs') }}
408-
</LinkBase>
409-
<LinkBase
410-
v-if="codeLink"
411-
:to="codeLink"
412-
aria-keyshortcuts="."
413-
class="decoration-none border-b-2 p-1 hover:border-accent/50"
414-
:class="page === 'code' ? 'border-accent text-accent!' : 'border-transparent'"
386+
<!-- Docs + Code — inline on desktop, floating bottom bar on mobile -->
387+
<nav
388+
v-if="resolvedVersion"
389+
:aria-label="$t('package.navigation')"
390+
class="flex gap-4 me-auto -mb-px"
391+
:style="navExtraOffsetStyle"
392+
:class="$style.packageNav"
415393
>
416-
{{ $t('package.links.code') }}
417-
</LinkBase>
418-
<LinkBase
419-
v-if="diffLink"
420-
:to="diffLink"
421-
:title="$t('compare.compare_versions_title')"
422-
aria-keyshortcuts="f"
423-
class="decoration-none border-b-2 p-1 hover:border-accent/50"
424-
:class="page === 'diff' ? 'border-accent text-accent!' : 'border-transparent'"
425-
>
426-
{{ $t('compare.compare_versions') }}
427-
</LinkBase>
428-
</nav>
394+
<LinkBase
395+
v-if="mainLink"
396+
:to="mainLink"
397+
aria-keyshortcuts="m"
398+
class="decoration-none border-b-2 p-1 hover:border-accent/50 lowercase"
399+
:class="page === 'main' ? 'border-accent text-accent!' : 'border-transparent'"
400+
>
401+
{{ $t('package.links.main') }}
402+
</LinkBase>
403+
<LinkBase
404+
v-if="docsLink"
405+
:to="docsLink"
406+
aria-keyshortcuts="d"
407+
class="decoration-none border-b-2 p-1 hover:border-accent/50"
408+
:class="page === 'docs' ? 'border-accent text-accent!' : 'border-transparent'"
409+
>
410+
{{ $t('package.links.docs') }}
411+
</LinkBase>
412+
<LinkBase
413+
v-if="codeLink"
414+
:to="codeLink"
415+
aria-keyshortcuts="."
416+
class="decoration-none border-b-2 p-1 hover:border-accent/50"
417+
:class="page === 'code' ? 'border-accent text-accent!' : 'border-transparent'"
418+
>
419+
{{ $t('package.links.code') }}
420+
</LinkBase>
421+
<LinkBase
422+
v-if="diffLink"
423+
:to="diffLink"
424+
:title="$t('compare.compare_versions_title')"
425+
aria-keyshortcuts="f"
426+
class="decoration-none border-b-2 p-1 hover:border-accent/50"
427+
:class="page === 'diff' ? 'border-accent text-accent!' : 'border-transparent'"
428+
>
429+
{{ $t('compare.compare_versions') }}
430+
</LinkBase>
431+
</nav>
432+
</div>
429433
</div>
430434
</template>
431435

app/components/VersionSelector.vue

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,6 @@ const versionToTags = computed(() => buildVersionToTagsMap(props.distTags))
7474
7575
/** Get URL for a specific version */
7676
function getVersionUrl(version: string): string {
77-
console.log('props.urlPattern', props.urlPattern)
7877
return props.urlPattern.replace('{version}', version)
7978
}
8079

app/pages/diff/[[org]]/[packageName]/v/[versionRange].vue

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -125,17 +125,14 @@ useSeoMeta({
125125

126126
<template>
127127
<main class="flex-1 flex flex-col min-h-0">
128-
<div class="w-full container -mb-px">
129-
<PackageHeader
130-
:pkg="pkg"
131-
:resolved-version="fromVersion"
132-
:display-version="pkg?.requestedVersion"
133-
:latest-version="latestVersionDetailed"
134-
:version-url-pattern="fromVersionUrlPattern"
135-
page="diff"
136-
/>
137-
</div>
138-
<span class="block h-px w-full bg-border" />
128+
<PackageHeader
129+
:pkg="pkg"
130+
:resolved-version="fromVersion"
131+
:display-version="pkg?.requestedVersion"
132+
:latest-version="latestVersionDetailed"
133+
:version-url-pattern="fromVersionUrlPattern"
134+
page="diff"
135+
/>
139136

140137
<!-- Error: invalid route -->
141138
<div v-if="!versionRange" class="container py-20 text-center">

app/pages/package-code/[[org]]/[packageName]/v/[version]/[...filePath].vue

Lines changed: 38 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -338,17 +338,14 @@ defineOgImageComponent('Default', {
338338

339339
<template>
340340
<main class="flex-1 flex flex-col">
341-
<div class="w-full container -mb-px">
342-
<PackageHeader
343-
:pkg="pkg"
344-
:resolved-version="version"
345-
:display-version="pkg?.requestedVersion"
346-
:latest-version="latestVersion"
347-
:version-url-pattern="versionUrlPattern"
348-
page="code"
349-
/>
350-
</div>
351-
<span class="block h-px w-full bg-border" />
341+
<PackageHeader
342+
:pkg="pkg"
343+
:resolved-version="version"
344+
:display-version="pkg?.requestedVersion"
345+
:latest-version="latestVersion"
346+
:version-url-pattern="versionUrlPattern"
347+
page="code"
348+
/>
352349

353350
<!-- Error: no version -->
354351
<div v-if="!version" class="container py-20 text-center">
@@ -376,7 +373,7 @@ defineOgImageComponent('Default', {
376373
<div v-else-if="fileTree" class="flex flex-1" dir="ltr">
377374
<!-- File tree sidebar - sticky with internal scroll -->
378375
<aside
379-
class="w-64 lg:w-72 border-ie border-border shrink-0 hidden md:block bg-bg-subtle sticky top-28 self-start h-[calc(100vh-7rem)] overflow-y-auto"
376+
class="w-64 lg:w-72 border-ie border-border shrink-0 hidden md:block bg-bg-subtle sticky top-25 self-start h-[calc(100vh-7rem)] overflow-y-auto"
380377
>
381378
<CodeFileTree
382379
:tree="fileTree.tree"
@@ -388,7 +385,7 @@ defineOgImageComponent('Default', {
388385

389386
<!-- File content / Directory listing - sticky with internal scroll on desktop -->
390387
<div
391-
class="flex-1 min-w-0 overflow-x-hidden sticky top-28 self-start h-[calc(100vh-7rem)] overflow-y-auto"
388+
class="flex-1 min-w-0 overflow-x-hidden sticky top-25 self-start overflow-y-auto"
392389
ref="contentContainer"
393390
>
394391
<!-- File viewer -->
@@ -419,14 +416,40 @@ defineOgImageComponent('Default', {
419416
{{ mode.label }}
420417
</button>
421418
</div>
422-
<div class="flex items-center gap-3 text-sm">
419+
<!-- Breadcrumb navigation -->
420+
<nav
421+
:aria-label="$t('code.file_path')"
422+
class="flex items-center gap-0.5 font-mono text-sm overflow-x-auto"
423+
dir="ltr"
424+
>
425+
<NuxtLink
426+
v-if="filePath"
427+
:to="getCurrentCodeUrlWithPath()"
428+
class="text-fg-muted hover:text-fg transition-colors shrink-0"
429+
>
430+
{{ $t('code.root') }}
431+
</NuxtLink>
432+
<span v-else class="text-fg shrink-0">{{ $t('code.root') }}</span>
433+
<template v-for="(crumb, i) in breadcrumbs" :key="crumb.path">
434+
<span class="text-fg-subtle">/</span>
435+
<NuxtLink
436+
v-if="i < breadcrumbs.length - 1"
437+
:to="getCurrentCodeUrlWithPath(crumb.path)"
438+
class="text-fg-muted hover:text-fg transition-colors"
439+
>
440+
{{ crumb.name }}
441+
</NuxtLink>
442+
<span v-else class="text-fg">{{ crumb.name }}</span>
443+
</template>
444+
</nav>
445+
<!-- <div class="flex items-center gap-3 text-sm">
423446
<span class="text-fg-muted" dir="auto">{{
424447
$t('code.lines', { count: fileContent.lines })
425448
}}</span>
426449
<span v-if="currentNode?.size" class="text-fg-subtle">{{
427450
bytesFormatter.format(currentNode.size)
428451
}}</span>
429-
</div>
452+
</div> -->
430453
</div>
431454
<div class="flex items-center gap-2">
432455
<button

app/pages/package-docs/[...path].vue

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -134,17 +134,14 @@ const showEmptyState = computed(() => docsData.value?.status !== 'ok')
134134

135135
<template>
136136
<div class="docs-page flex-1 flex flex-col">
137-
<div class="w-full container -mb-px">
138-
<PackageHeader
139-
:pkg="pkg"
140-
:resolved-version="resolvedVersion"
141-
:display-version="pkg?.requestedVersion"
142-
:latest-version="latestVersionDetailed"
143-
:version-url-pattern="versionUrlPattern"
144-
page="docs"
145-
/>
146-
</div>
147-
<span class="block h-px w-full bg-border" />
137+
<PackageHeader
138+
:pkg="pkg"
139+
:resolved-version="resolvedVersion"
140+
:display-version="pkg?.requestedVersion"
141+
:latest-version="latestVersionDetailed"
142+
:version-url-pattern="versionUrlPattern"
143+
page="docs"
144+
/>
148145

149146
<div class="flex" dir="ltr">
150147
<!-- Sidebar TOC -->
@@ -198,8 +195,8 @@ const showEmptyState = computed(() => docsData.value?.status !== 'ok')
198195
<style>
199196
/* Layout constants - must match AppHeader height */
200197
.docs-page {
201-
--app-header-height: 57px;
202-
--docs-header-height: 57px;
198+
--app-header-height: 56px;
199+
--docs-header-height: 44px;
203200
--combined-header-height: calc(var(--app-header-height) + var(--docs-header-height));
204201
}
205202

0 commit comments

Comments
 (0)