Skip to content

Commit 95c7554

Browse files
committed
feat(ui): update the ui to better match the existing modal and improve a11y
1 parent 9eb9dfa commit 95c7554

4 files changed

Lines changed: 112 additions & 10 deletions

File tree

app/components/Package/VersionDistribution.vue

Lines changed: 103 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import type {
99
import { useElementSize } from '@vueuse/core'
1010
import { useCssVariables } from '~/composables/useColors'
1111
import { OKLCH_NEUTRAL_FALLBACK, transparentizeOklch } from '~/utils/colors'
12+
import TooltipApp from '~/components/Tooltip/App.vue'
1213
1314
type TooltipParams = MinimalCustomFormatParams<VueUiXyDatapointItem[]> & {
1415
bars: VueUiXyDatasetBarItem[]
@@ -202,6 +203,38 @@ const xyDataset = computed<VueUiXyDatasetItem[]>(() => {
202203
const xAxisLabels = computed(() => {
203204
return chartDataset.value.map(item => item.name)
204205
})
206+
207+
// Handle keyboard navigation for semver group toggle
208+
function handleGroupingKeydown(event: KeyboardEvent) {
209+
if (event.key === 'Enter' || event.key === ' ') {
210+
event.preventDefault()
211+
// Toggle between major and minor
212+
groupingMode.value = groupingMode.value === 'major' ? 'minor' : 'major'
213+
} else if (event.key === 'ArrowLeft' || event.key === 'ArrowRight') {
214+
event.preventDefault()
215+
// Arrow keys also toggle
216+
groupingMode.value = groupingMode.value === 'major' ? 'minor' : 'major'
217+
}
218+
}
219+
220+
// Calculate last week date range (matches npm's "last-week" API)
221+
const startDate = computed(() => {
222+
const today = new Date()
223+
const yesterday = new Date(
224+
Date.UTC(today.getUTCFullYear(), today.getUTCMonth(), today.getUTCDate() - 1),
225+
)
226+
const startObj = new Date(yesterday)
227+
startObj.setUTCDate(startObj.getUTCDate() - 6)
228+
return startObj.toISOString().slice(0, 10)
229+
})
230+
231+
const endDate = computed(() => {
232+
const today = new Date()
233+
const yesterday = new Date(
234+
Date.UTC(today.getUTCFullYear(), today.getUTCMonth(), today.getUTCDate() - 1),
235+
)
236+
return yesterday.toISOString().slice(0, 10)
237+
})
205238
</script>
206239

207240
<template>
@@ -218,47 +251,113 @@ const xAxisLabels = computed(() => {
218251
{{ $t('package.versions.distribution_title') }}
219252
</label>
220253
<div
221-
class="inline-flex items-center bg-bg-subtle border border-border rounded-md overflow-hidden w-fit"
254+
class="flex items-center bg-bg-subtle border border-border rounded-md focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent/70"
222255
role="group"
223256
:aria-label="$t('package.versions.distribution_title')"
257+
tabindex="0"
258+
@keydown="handleGroupingKeydown"
224259
>
225260
<button
226261
type="button"
227262
:class="[
228-
'px-4 py-1.75 font-mono text-sm transition-colors',
263+
'px-4 py-1.75 font-mono text-sm transition-colors rounded-s-md',
229264
groupingMode === 'major'
230265
? 'bg-accent text-bg font-medium'
231266
: 'text-fg-subtle hover:text-fg hover:bg-bg-subtle/50',
232267
]"
233268
:aria-pressed="groupingMode === 'major'"
234269
:disabled="pending"
270+
tabindex="-1"
235271
@click="groupingMode = 'major'"
236272
>
237273
{{ $t('package.versions.grouping_major') }}
238274
</button>
239275
<button
240276
type="button"
241277
:class="[
242-
'px-4 py-1.75 font-mono text-sm transition-colors border-is border-border',
278+
'px-4 py-1.75 font-mono text-sm transition-colors rounded-e-md border-is border-border',
243279
groupingMode === 'minor'
244280
? 'bg-accent text-bg font-medium'
245281
: 'text-fg-subtle hover:text-fg hover:bg-bg-subtle/50',
246282
]"
247283
:aria-pressed="groupingMode === 'minor'"
248284
:disabled="pending"
285+
tabindex="-1"
249286
@click="groupingMode = 'minor'"
250287
>
251288
{{ $t('package.versions.grouping_minor') }}
252289
</button>
253290
</div>
254291
</div>
292+
293+
<div class="grid grid-cols-2 gap-2 flex-1">
294+
<TooltipApp
295+
:text="$t('package.versions.date_range_tooltip')"
296+
position="bottom"
297+
:teleportTo="inModal ? '#chart-modal' : undefined"
298+
class="w-full"
299+
>
300+
<div class="flex flex-col gap-1 w-full">
301+
<label
302+
for="versionDistStartDate"
303+
class="text-3xs font-mono text-fg-subtle tracking-wide uppercase"
304+
>
305+
{{ $t('package.trends.start_date') }}
306+
</label>
307+
<div class="relative flex items-center">
308+
<span
309+
class="absolute inset-is-2 i-carbon:calendar w-4 h-4 text-fg-subtle shrink-0 pointer-events-none"
310+
aria-hidden="true"
311+
/>
312+
<InputBase
313+
id="versionDistStartDate"
314+
:model-value="startDate"
315+
disabled
316+
type="date"
317+
class="w-full min-w-0 bg-transparent ps-7"
318+
size="medium"
319+
/>
320+
</div>
321+
</div>
322+
</TooltipApp>
323+
324+
<TooltipApp
325+
:text="$t('package.versions.date_range_tooltip')"
326+
position="bottom"
327+
:teleportTo="inModal ? '#chart-modal' : undefined"
328+
class="w-full"
329+
>
330+
<div class="flex flex-col gap-1 w-full">
331+
<label
332+
for="versionDistEndDate"
333+
class="text-3xs font-mono text-fg-subtle tracking-wide uppercase"
334+
>
335+
{{ $t('package.trends.end_date') }}
336+
</label>
337+
<div class="relative flex items-center">
338+
<span
339+
class="absolute inset-is-2 i-carbon:calendar w-4 h-4 text-fg-subtle shrink-0 pointer-events-none"
340+
aria-hidden="true"
341+
/>
342+
<InputBase
343+
id="versionDistEndDate"
344+
:model-value="endDate"
345+
disabled
346+
type="date"
347+
class="w-full min-w-0 bg-transparent ps-7"
348+
size="medium"
349+
/>
350+
</div>
351+
</div>
352+
</TooltipApp>
353+
</div>
255354
</div>
256355

257356
<SettingsToggle
258357
v-model="hideSmallVersions"
259358
:label="$t('package.versions.hide_old_versions')"
260359
:tooltip="$t('package.versions.hide_old_versions_tooltip')"
261-
tooltip-position="right"
360+
tooltip-position="bottom"
262361
:tooltip-teleport-to="inModal ? '#chart-modal' : undefined"
263362
justify="start"
264363
:class="pending ? 'opacity-50 pointer-events-none' : ''"

i18n/locales/en.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -277,12 +277,13 @@
277277
"all_covered": "All versions are covered by tags above",
278278
"deprecated_title": "{version} (deprecated)",
279279
"view_all": "View {count} version | View all {count} versions",
280-
"distribution_title": "Last Week of Version Distributions",
280+
"distribution_title": "Semver Group",
281281
"distribution_modal_title": "Versions",
282282
"grouping_major": "Major",
283283
"grouping_minor": "Minor",
284284
"hide_old_versions": "Hide old versions",
285-
"hide_old_versions_tooltip": "Hide versions older than 1 year"
285+
"hide_old_versions_tooltip": "Hide versions older than 1 year",
286+
"date_range_tooltip": "Last week of version distributions only"
286287
},
287288
"dependencies": {
288289
"title": "Dependency ({count}) | Dependencies ({count})",

lunaria/files/en-GB.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -277,12 +277,13 @@
277277
"all_covered": "All versions are covered by tags above",
278278
"deprecated_title": "{version} (deprecated)",
279279
"view_all": "View {count} version | View all {count} versions",
280-
"distribution_title": "Last Week of Version Distributions",
280+
"distribution_title": "Semver Group",
281281
"distribution_modal_title": "Versions",
282282
"grouping_major": "Major",
283283
"grouping_minor": "Minor",
284284
"hide_old_versions": "Hide old versions",
285-
"hide_old_versions_tooltip": "Hide versions older than 1 year"
285+
"hide_old_versions_tooltip": "Hide versions older than 1 year",
286+
"date_range_tooltip": "Last week of version distributions only"
286287
},
287288
"dependencies": {
288289
"title": "Dependency ({count}) | Dependencies ({count})",

lunaria/files/en-US.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -277,12 +277,13 @@
277277
"all_covered": "All versions are covered by tags above",
278278
"deprecated_title": "{version} (deprecated)",
279279
"view_all": "View {count} version | View all {count} versions",
280-
"distribution_title": "Last Week of Version Distributions",
280+
"distribution_title": "Semver Group",
281281
"distribution_modal_title": "Versions",
282282
"grouping_major": "Major",
283283
"grouping_minor": "Minor",
284284
"hide_old_versions": "Hide old versions",
285-
"hide_old_versions_tooltip": "Hide versions older than 1 year"
285+
"hide_old_versions_tooltip": "Hide versions older than 1 year",
286+
"date_range_tooltip": "Last week of version distributions only"
286287
},
287288
"dependencies": {
288289
"title": "Dependency ({count}) | Dependencies ({count})",

0 commit comments

Comments
 (0)