Skip to content

Commit f0285db

Browse files
committed
Adjusted compare grid to allow layout to eventually fit to more than 4 packages at once.
1 parent e784d3a commit f0285db

3 files changed

Lines changed: 41 additions & 11 deletions

File tree

app/components/Compare/ComparisonGrid.vue

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ const props = defineProps<{
1717
1818
/** Total column count including the optional no-dep column */
1919
const totalColumns = computed(() => props.columns.length + (props.showNoDependency ? 1 : 0))
20+
const visibleColumns = computed(() => Math.min(totalColumns.value, 4))
2021
2122
/** Compute plain-text tooltip for a replacement column */
2223
function getReplacementTooltip(col: ComparisonGridColumn): string {
@@ -28,10 +29,16 @@ function getReplacementTooltip(col: ComparisonGridColumn): string {
2829

2930
<template>
3031
<div class="overflow-x-auto">
31-
<div class="comparison-grid" :style="{ '--package-count': totalColumns }">
32+
<div
33+
class="comparison-grid"
34+
:style="{
35+
'--package-count': totalColumns,
36+
'--visible-columns': visibleColumns,
37+
}"
38+
>
3239
<!-- Header row -->
3340
<div class="comparison-header">
34-
<div class="comparison-label" />
41+
<div class="comparison-label relative bg-bg" />
3542

3643
<!-- Package columns -->
3744
<div
@@ -105,20 +112,30 @@ function getReplacementTooltip(col: ComparisonGridColumn): string {
105112

106113
<style scoped>
107114
.comparison-grid {
115+
--label-column-width: 140px;
116+
--package-column-width: calc((100% - var(--label-column-width)) / var(--visible-columns));
108117
display: grid;
109118
gap: 0;
110119
grid-template-columns:
111-
minmax(110px, 150px)
112-
repeat(var(--package-count), minmax(0, 1fr));
120+
var(--label-column-width)
121+
repeat(var(--package-count), minmax(var(--package-column-width), var(--package-column-width)));
113122
}
114123
115124
.comparison-header {
116125
display: contents;
117126
}
118127
119128
.comparison-header > .comparison-label {
120-
padding: 0.75rem 1rem;
121-
border-bottom: 1px solid var(--color-border);
129+
z-index: 3;
130+
}
131+
132+
.comparison-label {
133+
position: sticky;
134+
left: 0;
135+
z-index: 2;
136+
inline-size: var(--label-column-width);
137+
min-inline-size: var(--label-column-width);
138+
isolation: isolate;
122139
}
123140
124141
.comparison-header > .comparison-cell-header {

app/components/Compare/FacetRow.vue

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,9 @@ function isCellLoading(index: number): boolean {
8888
<template>
8989
<div class="contents">
9090
<!-- Label cell -->
91-
<div class="comparison-label flex items-center gap-1.5 px-4 py-3 border-b border-border">
91+
<div
92+
class="comparison-label relative bg-bg flex items-center gap-1.5 px-4 py-3 border-b border-border"
93+
>
9294
<span class="text-xs text-fg-muted uppercase tracking-wider">{{ label }}</span>
9395
<TooltipApp v-if="description" :text="description" position="top">
9496
<span class="i-lucide:info w-3 h-3 text-fg-subtle cursor-help" aria-hidden="true" />
@@ -151,3 +153,13 @@ function isCellLoading(index: number): boolean {
151153
</div>
152154
</div>
153155
</template>
156+
157+
<style lang="css" scoped>
158+
.comparison-label {
159+
position: sticky;
160+
left: 0;
161+
z-index: 2;
162+
inline-size: var(--label-column-width);
163+
min-inline-size: var(--label-column-width);
164+
}
165+
</style>

app/pages/compare.vue

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ const { locale } = useI18n()
1111
const router = useRouter()
1212
const canGoBack = useCanGoBack()
1313
const { copied, copy } = useClipboard({ copiedDuring: 2000 })
14+
const maxPackages = 4
1415
1516
// Sync packages with URL query param (stable ref - doesn't change on other query changes)
1617
const packagesParam = useRouteQuery<string>('packages', '', { mode: 'replace' })
@@ -23,7 +24,7 @@ const packages = computed({
2324
.split(',')
2425
.map(p => p.trim())
2526
.filter(p => p.length > 0)
26-
.slice(0, 4)
27+
.slice(0, maxPackages)
2728
},
2829
set(value) {
2930
packagesParam.value = value.length > 0 ? value.join(',') : ''
@@ -61,12 +62,12 @@ const gridColumns = computed(() =>
6162
6263
// Whether we can add the no-dep column (not already added and have room)
6364
const canAddNoDep = computed(
64-
() => packages.value.length < 4 && !packages.value.includes(NO_DEPENDENCY_ID),
65+
() => packages.value.length < maxPackages && !packages.value.includes(NO_DEPENDENCY_ID),
6566
)
6667
6768
// Add "no dependency" column to comparison
6869
function addNoDep() {
69-
if (packages.value.length >= 4) return
70+
if (packages.value.length >= maxPackages) return
7071
if (packages.value.includes(NO_DEPENDENCY_ID)) return
7172
packages.value = [...packages.value, NO_DEPENDENCY_ID]
7273
}
@@ -191,7 +192,7 @@ useSeoMeta({
191192
<h2 id="packages-heading" class="text-xs text-fg-subtle uppercase tracking-wider mb-3">
192193
{{ $t('compare.packages.section_packages') }}
193194
</h2>
194-
<ComparePackageSelector v-model="packages" :max="4" />
195+
<ComparePackageSelector v-model="packages" :max="maxPackages" />
195196

196197
<!-- "No dep" replacement suggestions (native, simple) -->
197198
<div v-if="noDepSuggestions.length > 0" class="mt-3 space-y-2">

0 commit comments

Comments
 (0)