@@ -9,6 +9,7 @@ import type {
99import { useElementSize } from ' @vueuse/core'
1010import { useCssVariables } from ' ~/composables/useColors'
1111import { OKLCH_NEUTRAL_FALLBACK , transparentizeOklch } from ' ~/utils/colors'
12+ import TooltipApp from ' ~/components/Tooltip/App.vue'
1213
1314type TooltipParams = MinimalCustomFormatParams <VueUiXyDatapointItem []> & {
1415 bars: VueUiXyDatasetBarItem []
@@ -202,6 +203,38 @@ const xyDataset = computed<VueUiXyDatasetItem[]>(() => {
202203const 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' : ''"
0 commit comments