From ed0d7b6ecf9b29ac70b3d758bd26c5b5e767e474 Mon Sep 17 00:00:00 2001 From: Jonathan Yeong Date: Thu, 29 Jan 2026 22:40:15 -0500 Subject: [PATCH 01/10] feat: add package manager select dropdown This replaces the tab list so it's extra clear to the user what package manager they've selected. It also lets use use it in the connector modal to be explicit on the package manager choice. --- app/components/ConnectorModal.vue | 34 +++--- app/components/PackageManagerSelect.vue | 150 ++++++++++++++++++++++++ app/pages/[...package].vue | 6 + test/nuxt/components.spec.ts | 9 ++ 4 files changed, 184 insertions(+), 15 deletions(-) create mode 100644 app/components/PackageManagerSelect.vue diff --git a/app/components/ConnectorModal.vue b/app/components/ConnectorModal.vue index 7807110c..bad8a6b8 100644 --- a/app/components/ConnectorModal.vue +++ b/app/components/ConnectorModal.vue @@ -125,21 +125,25 @@ watch(open, isOpen => { > $ {{ executeNpmxConnectorCommand }} - +
+ + + +

{{ $t('connector.modal.paste_token') }}

diff --git a/app/components/PackageManagerSelect.vue b/app/components/PackageManagerSelect.vue new file mode 100644 index 00000000..933b6eb0 --- /dev/null +++ b/app/components/PackageManagerSelect.vue @@ -0,0 +1,150 @@ + + + diff --git a/app/pages/[...package].vue b/app/pages/[...package].vue index 0be15840..db73a43a 100644 --- a/app/pages/[...package].vue +++ b/app/pages/[...package].vue @@ -800,6 +800,7 @@ function handleClick(event: MouseEvent) { +
+
{ describe('DateTime', () => { @@ -1293,4 +1294,12 @@ describe('component accessibility audits', () => { expect(results.violations).toEqual([]) }) }) + + describe('PackageManagerSelect', () => { + it('should have no accessibility violations', async () => { + const component = await mountSuspended(PackageManagerSelect) + const results = await runAxe(component) + expect(results.violations).toEqual([]) + }) + }) }) From 41bd452ed006ea69c75052c4b4e7b59d9caafd66 Mon Sep 17 00:00:00 2001 From: Jonathan Yeong Date: Fri, 30 Jan 2026 08:01:57 -0500 Subject: [PATCH 02/10] fix: clean up css classes for better rtl support --- app/components/ConnectorModal.vue | 2 +- app/components/PackageManagerSelect.vue | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/components/ConnectorModal.vue b/app/components/ConnectorModal.vue index bad8a6b8..22add063 100644 --- a/app/components/ConnectorModal.vue +++ b/app/components/ConnectorModal.vue @@ -125,7 +125,7 @@ watch(open, isOpen => { > $ {{ executeNpmxConnectorCommand }} -
+
- - +
Date: Fri, 30 Jan 2026 17:59:02 -0500 Subject: [PATCH 07/10] fix: focus ring clipping in the install area --- app/pages/[...package].vue | 1 - 1 file changed, 1 deletion(-) diff --git a/app/pages/[...package].vue b/app/pages/[...package].vue index 4ce162e1..7c1d95f4 100644 --- a/app/pages/[...package].vue +++ b/app/pages/[...package].vue @@ -1074,7 +1074,6 @@ function handleClick(event: MouseEvent) { .area-install { grid-area: install; - overflow-x: hidden; } .area-vulns { From 2e663a08e1c0e7a6ca0ef54d1aeb1bf1062119e3 Mon Sep 17 00:00:00 2001 From: Jonathan Yeong Date: Fri, 30 Jan 2026 18:12:07 -0500 Subject: [PATCH 08/10] fix: update aria label --- app/components/PackageManagerSelect.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/components/PackageManagerSelect.vue b/app/components/PackageManagerSelect.vue index 327bebb7..1936f777 100644 --- a/app/components/PackageManagerSelect.vue +++ b/app/components/PackageManagerSelect.vue @@ -95,7 +95,7 @@ function handleKeydown(event: KeyboardEvent) { class="flex items-center gap-1.5 px-2 py-2 font-mono text-xs text-fg-muted bg-bg-subtle border border-border-subtle border-solid rounded-md transition-colors duration-150 hover:(text-fg border-border-hover) active:scale-95 focus:border-border-hover focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-fg/50 hover:text-fg" :aria-expanded="isOpen" aria-haspopup="listbox" - :aria-label="$t('settings.package_manager')" + :aria-label="$t('package.get_started.pm_label')" :aria-controls="listboxId" @click="toggle" @keydown="handleKeydown" @@ -132,7 +132,7 @@ function handleKeydown(event: KeyboardEvent) { ? `${listboxId}-${packageManagers[highlightedIndex]?.id}` : undefined " - :aria-label="$t('settings.package_manager')" + :aria-label="$t('package.get_started.pm_label')" :style="getDropdownStyle()" class="fixed bg-bg-subtle border border-border rounded-md shadow-lg z-50" > From ee7e2de5e31555e933e55eeb0815b8f18d3658b0 Mon Sep 17 00:00:00 2001 From: Jonathan Yeong Date: Fri, 30 Jan 2026 18:37:35 -0500 Subject: [PATCH 09/10] fix: prevent flicker on hard refresh --- app/components/PackageManagerSelect.vue | 40 +++++++++++++++++++++---- 1 file changed, 34 insertions(+), 6 deletions(-) diff --git a/app/components/PackageManagerSelect.vue b/app/components/PackageManagerSelect.vue index 1936f777..8a9bc4df 100644 --- a/app/components/PackageManagerSelect.vue +++ b/app/components/PackageManagerSelect.vue @@ -24,10 +24,6 @@ useEventListener('scroll', close, true) const inputId = useId() const listboxId = `${inputId}-listbox` -const pm = computed(() => { - return packageManagers.find(p => p.id === selectedPM.value) ?? packageManagers[0] -}) - function toggle() { if (isOpen.value) { close() @@ -100,8 +96,20 @@ function handleKeydown(event: KeyboardEvent) { @click="toggle" @keydown="handleKeydown" > -