Skip to content

Commit b972f7b

Browse files
feat: use tooltip over disabled input
1 parent 70f7615 commit b972f7b

4 files changed

Lines changed: 58 additions & 47 deletions

File tree

app/components/Package/Card.vue

Lines changed: 6 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -65,25 +65,12 @@ const numberFormatter = useNumberFormatter()
6565
>
6666
</component>
6767

68-
<div class="relative z-1">
69-
<label>
70-
<span class="sr-only"> {{ $t('package.card.select') }}: {{ result.package.name }} </span>
71-
72-
<input
73-
data-package-card-checkbox
74-
class="md:opacity-0 group-focus-within:opacity-100 checked:opacity-100 md:group-hover:opacity-100 size-4 cursor-pointer accent-accent border border-fg-muted/30 hover:border-accent transition-colors disabled:opacity-30 disabled:cursor-not-allowed"
75-
type="checkbox"
76-
:checked="isSelected"
77-
:disabled="isMaxSelected && !isSelected"
78-
:title="
79-
isMaxSelected && !isSelected
80-
? $t('package.card.select_maximum', MAX_PACKAGE_SELECTION)
81-
: undefined
82-
"
83-
@change="togglePackageSelection(result.package.name)"
84-
/>
85-
</label>
86-
</div>
68+
<PackageSelectionCheckbox
69+
:package-name="result.package.name"
70+
:disabled="isMaxSelected && !isSelected"
71+
:checked="isSelected"
72+
@change="togglePackageSelection"
73+
/>
8774
</header>
8875

8976
<div class="flex flex-col sm:flex-row sm:justify-start sm:items-start gap-6 sm:gap-8">
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
<script setup lang="ts">
2+
const props = defineProps<{
3+
packageName: string
4+
checked: boolean
5+
disabled?: boolean
6+
}>()
7+
8+
const emit = defineEmits<{
9+
(e: 'change', packageName: string): void
10+
}>()
11+
12+
const { t } = useI18n()
13+
const disabledText = t('package.card.select_maximum', MAX_PACKAGE_SELECTION)
14+
</script>
15+
16+
<template>
17+
<div class="relative z-1">
18+
<label>
19+
<span class="sr-only" v-if="disabled">{{ disabledText }}</span>
20+
<span class="sr-only" v-else> {{ $t('package.card.select') }}: {{ packageName }} </span>
21+
22+
<TooltipApp v-if="disabled" :text="disabledText" position="top">
23+
<input
24+
class="opacity-0 group-hover:opacity-100 size-4 accent-accent border border-fg-muted/30 hover:cursor-not-allowed"
25+
:class="{ 'opacity-100! disabled:opacity-30!': isTouchDevice() }"
26+
type="checkbox"
27+
:disabled
28+
/>
29+
</TooltipApp>
30+
31+
<input
32+
v-else
33+
data-package-card-checkbox
34+
class="opacity-0 group-focus-within:opacity-100 checked:opacity-100 group-hover:opacity-100 size-4 cursor-pointer accent-accent border border-fg-muted/30 hover:border-accent transition-colors disabled:group-hover:opacity-30 disabled:hover:cursor-not-allowed"
35+
:class="{ 'opacity-100! disabled:opacity-30!': isTouchDevice() }"
36+
type="checkbox"
37+
:checked
38+
:disabled
39+
@change="emit('change', packageName)"
40+
/>
41+
</label>
42+
</div>
43+
</template>

app/components/Package/SelectionView.vue

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,8 @@ const { data, pending } = useAsyncData(
1111
const results = await Promise.all(
1212
selectedPackages.value.map(name =>
1313
$fetch(`/api/registry/package-meta/${encodeURIComponent(name)}`)
14-
.then(response => {
15-
return { package: response }
16-
})
17-
.catch(err => {
18-
console.error(`Failed to fetch package ${name}:`, err)
19-
return null
20-
}),
14+
.then(response => ({ package: response }))
15+
.catch(() => []),
2116
),
2217
)
2318
return results as NpmSearchResult[]

app/components/Package/TableRow.vue

Lines changed: 7 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -201,27 +201,13 @@ const allMaintainersText = computed(() => {
201201
<span v-else class="text-fg-subtle"> - </span>
202202
</td>
203203

204-
<td class="pe-2 relative z-1">
205-
<div class="flex items-center justify-center h-full">
206-
<label>
207-
<span class="sr-only">
208-
{{ $t('package.card.select') }}
209-
</span>
210-
<input
211-
data-package-card-checkbox
212-
class="md:opacity-0 group-focus-within:opacity-100 checked:opacity-100 md:group-hover:opacity-100 size-4 cursor-pointer accent-accent border border-fg-muted/30 hover:border-accent transition-colors disabled:opacity-30 disabled:cursor-not-allowed"
213-
type="checkbox"
214-
:checked="isSelected"
215-
:disabled="isMaxSelected && !isSelected"
216-
:title="
217-
isMaxSelected && !isSelected
218-
? $t('package.card.select_maximum', MAX_PACKAGE_SELECTION)
219-
: undefined
220-
"
221-
@change="togglePackageSelection(result.package.name)"
222-
/>
223-
</label>
224-
</div>
204+
<td class="pe-2">
205+
<PackageSelectionCheckbox
206+
:package-name="result.package.name"
207+
:disabled="isMaxSelected && !isSelected"
208+
:checked="isSelected"
209+
@change="togglePackageSelection"
210+
/>
225211
</td>
226212
</tr>
227213
</template>

0 commit comments

Comments
 (0)