Skip to content

Commit b4e40e3

Browse files
authored
Merge branch 'main' into feat/llms-txt
2 parents 16c42ce + 5530873 commit b4e40e3

41 files changed

Lines changed: 381 additions & 80 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 42 additions & 0 deletions
Loading
Lines changed: 42 additions & 1 deletion
Loading

app/assets/logos/oss-partners/index.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import LogoFastCheck from './fast-check.svg'
2929
import LogoLunaria from './lunaria.svg'
3030
import LogoJsr from './jsr.svg'
3131
import LogoIconify from './iconify.svg'
32+
import LogoIconifyLight from './iconify-light.svg'
3233
import LogoFloatingUi from './floating-ui-vue.svg'
3334
import LogoBlento from './blento.svg'
3435

@@ -188,7 +189,10 @@ export const OSS_PARTNERS = [
188189
},
189190
{
190191
name: 'Iconify',
191-
logo: LogoIconify,
192+
logo: {
193+
dark: LogoIconify,
194+
light: LogoIconifyLight,
195+
},
192196
url: 'https://iconify.design/',
193197
},
194198
{

app/components/Package/List.vue

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -75,18 +75,15 @@ const paginationMode = computed(() =>
7575
)
7676
const currentPage = computed(() => props.currentPage ?? 1)
7777
const pageSize = computed(() => props.pageSize ?? 25)
78-
// Numeric page size for virtual scroll and arithmetic (when 'all' is selected, use 25 as default)
79-
const numericPageSize = computed(() => (pageSize.value === 'all' ? 25 : pageSize.value))
78+
// Numeric page size for virtual scroll and arithmetic (use 25 as default)
79+
const numericPageSize = computed(() => pageSize.value)
8080
8181
// Compute paginated results for paginated mode
8282
const displayedResults = computed(() => {
8383
if (paginationMode.value === 'infinite') {
8484
return props.results
8585
}
86-
// 'all' page size means show everything (YOLO)
87-
if (pageSize.value === 'all') {
88-
return props.results
89-
}
86+
9087
const start = (currentPage.value - 1) * numericPageSize.value
9188
const end = start + numericPageSize.value
9289
return props.results.slice(start, end)

app/components/Package/ListToolbar.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ function getSortKeyLabelKey(key: SortKey): string {
147147
$t(
148148
'filters.count.showing_paginated',
149149
{
150-
pageSize: pageSize === 'all' ? $n(filteredCount) : Math.min(pageSize, filteredCount),
150+
pageSize: Math.min(pageSize, filteredCount),
151151
count: $n(filteredCount),
152152
},
153153
filteredCount,

app/components/Package/Versions.vue

Lines changed: 38 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,22 @@ const effectiveCurrentVersion = computed(
115115
116116
// Semver range filter
117117
const semverFilter = ref('')
118+
119+
// Load all versions when a valid semver filter is entered
120+
watch(semverFilter, async newFilter => {
121+
const trimmed = newFilter.trim()
122+
if (trimmed === '' || hasLoadedAll.value) return
123+
if (!validRange(trimmed)) return
124+
125+
try {
126+
const allVersions = await loadAllVersions()
127+
processLoadedVersions(allVersions)
128+
// Auto-expand "Other versions" so filtered results are visible
129+
otherVersionsExpanded.value = true
130+
} catch {
131+
// Silently fail — user can still use the filter with already-known versions
132+
}
133+
})
118134
// Collect all known versions: initial props + dynamically loaded ones
119135
const allKnownVersions = computed(() => {
120136
const versions = new Set(Object.keys(props.versions))
@@ -196,8 +212,10 @@ const visibleTagRows = computed(() => {
196212
? allTagRows.value
197213
: allTagRows.value.filter(row => !row.primaryVersion.deprecated)
198214
const rows = isFilterActive.value
199-
? rowsMaybeFilteredForDeprecation.filter(row =>
200-
filteredVersionSet.value.has(row.primaryVersion.version),
215+
? rowsMaybeFilteredForDeprecation.filter(
216+
row =>
217+
filteredVersionSet.value.has(row.primaryVersion.version) ||
218+
getTagVersions(row.tag).some(v => filteredVersionSet.value.has(v.version)),
201219
)
202220
: rowsMaybeFilteredForDeprecation
203221
const first = rows.slice(0, MAX_VISIBLE_TAGS)
@@ -215,7 +233,11 @@ const visibleTagRows = computed(() => {
215233
const hiddenTagRows = computed(() => {
216234
const hiddenRows = allTagRows.value.filter(row => !visibleTagRows.value.includes(row))
217235
const rows = isFilterActive.value
218-
? hiddenRows.filter(row => filteredVersionSet.value.has(row.primaryVersion.version))
236+
? hiddenRows.filter(
237+
row =>
238+
filteredVersionSet.value.has(row.primaryVersion.version) ||
239+
getTagVersions(row.tag).some(v => filteredVersionSet.value.has(v.version)),
240+
)
219241
: hiddenRows
220242
return rows
221243
})
@@ -435,6 +457,14 @@ function getExpandedTagVersions(tag: string, primaryVersion: string): VersionDis
435457
return versions.filter(v => filteredVersionSet.value.has(v.version))
436458
}
437459
460+
// Check if a tag row's children are expanded (manually or via active filter)
461+
function isTagExpanded(tag: string, primaryVersion: string): boolean {
462+
return (
463+
expandedTags.value.has(tag) ||
464+
(isFilterActive.value && getExpandedTagVersions(tag, primaryVersion).length > 0)
465+
)
466+
}
467+
438468
function findClaimingTag(version: string): string | null {
439469
const versionChannel = getPrereleaseChannel(version)
440470
@@ -583,7 +613,7 @@ function majorGroupContainsCurrent(group: (typeof otherMajorGroups.value)[0]): b
583613
v-if="getTagVersions(row.tag).length > 1 || !hasLoadedAll"
584614
type="button"
585615
class="size-5 -me-1 flex items-center justify-center text-fg-subtle hover:text-fg transition-colors rounded-sm relative z-10"
586-
:aria-expanded="expandedTags.has(row.tag)"
616+
:aria-expanded="isTagExpanded(row.tag, row.primaryVersion.version)"
587617
:aria-label="
588618
expandedTags.has(row.tag)
589619
? $t('package.versions.collapse', { tag: row.tag })
@@ -602,7 +632,9 @@ function majorGroupContainsCurrent(group: (typeof otherMajorGroups.value)[0]): b
602632
v-else
603633
class="size-3 transition-transform duration-200 rtl-flip"
604634
:class="
605-
expandedTags.has(row.tag) ? 'i-lucide:chevron-down' : 'i-lucide:chevron-right'
635+
isTagExpanded(row.tag, row.primaryVersion.version)
636+
? 'i-lucide:chevron-down'
637+
: 'i-lucide:chevron-right'
606638
"
607639
aria-hidden="true"
608640
/>
@@ -671,10 +703,7 @@ function majorGroupContainsCurrent(group: (typeof otherMajorGroups.value)[0]): b
671703

672704
<!-- Expanded versions -->
673705
<div
674-
v-if="
675-
expandedTags.has(row.tag) &&
676-
getExpandedTagVersions(row.tag, row.primaryVersion.version).length
677-
"
706+
v-if="isTagExpanded(row.tag, row.primaryVersion.version)"
678707
class="ms-4 ps-2 border-is border-border space-y-0.5 pe-2"
679708
>
680709
<div

app/components/PaginationControls.vue

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -22,23 +22,17 @@ const effectiveMode = computed<PaginationMode>(() =>
2222
shouldShowControls.value ? 'paginated' : 'infinite',
2323
)
2424
25-
// When 'all' is selected, there's only 1 page with everything
26-
const isShowingAll = computed(() => pageSize.value === 'all')
27-
const totalPages = computed(() =>
28-
isShowingAll.value ? 1 : Math.ceil(props.totalItems / (pageSize.value as number)),
29-
)
25+
const totalPages = computed(() => Math.ceil(props.totalItems / (pageSize.value as number)))
3026
3127
// Whether to show the mode toggle (hidden in table view since table always uses pagination)
3228
const showModeToggle = computed(() => props.viewMode !== 'table')
3329
3430
const startItem = computed(() => {
3531
if (props.totalItems === 0) return 0
36-
if (isShowingAll.value) return 1
3732
return (currentPage.value - 1) * (pageSize.value as number) + 1
3833
})
3934
4035
const endItem = computed(() => {
41-
if (isShowingAll.value) return props.totalItems
4236
return Math.min(currentPage.value * (pageSize.value as number), props.totalItems)
4337
})
4438
@@ -106,8 +100,8 @@ const visiblePages = computed(() => {
106100
function handlePageSizeChange(event: Event) {
107101
const target = event.target as HTMLSelectElement
108102
const value = target.value
109-
// Handle 'all' as a special string value, otherwise parse as number
110-
const newSize = (value === 'all' ? 'all' : Number(value)) as PageSize
103+
104+
const newSize = Number(value) as PageSize
111105
pageSize.value = newSize
112106
// Reset to page 1 when changing page size
113107
currentPage.value = 1
@@ -159,10 +153,7 @@ function handlePageSizeChange(event: Event) {
159153
@change="handlePageSizeChange"
160154
:items="
161155
PAGE_SIZE_OPTIONS.map(size => ({
162-
label:
163-
size === 'all'
164-
? $t('filters.pagination.all_yolo')
165-
: $t('filters.pagination.per_page', { count: size }),
156+
label: $t('filters.pagination.per_page', { count: size }),
166157
value: String(size),
167158
}))
168159
"

app/composables/usePackageListPreferences.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,22 @@ export function usePackageListPreferences() {
4141
},
4242
})
4343

44+
// One-time migration: replace legacy 'all' with the current maximum page size
45+
watch(
46+
isHydrated,
47+
hydrated => {
48+
if (!hydrated) {
49+
return
50+
}
51+
52+
if ((preferences.value.pageSize as unknown) === 'all') {
53+
preferences.value.pageSize = Math.max(...PAGE_SIZE_OPTIONS) as PageSize
54+
save()
55+
}
56+
},
57+
{ immediate: true },
58+
)
59+
4460
const pageSize = computed({
4561
get: () => preferences.value.pageSize,
4662
set: (value: PageSize) => {

app/pages/org/[org].vue

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,9 +65,7 @@ const currentPage = shallowRef(1)
6565
6666
// Calculate total pages
6767
const totalPages = computed(() => {
68-
if (pageSize.value === 'all') return 1
69-
const numericSize = typeof pageSize.value === 'number' ? pageSize.value : 25
70-
return Math.ceil(sortedPackages.value.length / numericSize)
68+
return Math.ceil(sortedPackages.value.length / pageSize.value)
7169
})
7270
7371
// Reset to page 1 when filters change

app/pages/package/[[org]]/[name].vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1179,7 +1179,7 @@ const showSkeleton = shallowRef(false)
11791179
<div class="space-y-1 sm:col-span-3">
11801180
<dt class="text-xs text-fg-subtle uppercase tracking-wider flex items-center gap-1">
11811181
{{ $t('package.stats.install_size') }}
1182-
<TooltipApp v-if="sizeTooltip" :text="sizeTooltip">
1182+
<TooltipApp v-if="sizeTooltip" :text="sizeTooltip" interactive>
11831183
<span
11841184
tabindex="0"
11851185
class="inline-flex items-center justify-center min-w-6 min-h-6 -m-1 p-1 text-fg-subtle cursor-help focus-visible:outline-2 focus-visible:outline-accent/70 rounded"

0 commit comments

Comments
 (0)