Skip to content

Commit 348e81d

Browse files
committed
Merge remote-tracking branch 'origin/main' into fix-a11y-extract-btn-component
# Conflicts: # app/components/Package/Versions.vue
2 parents b323b78 + d731543 commit 348e81d

36 files changed

Lines changed: 626 additions & 88 deletions

.github/workflows/ci.yml

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -117,11 +117,12 @@ jobs:
117117
- name: 🧪 Component tests
118118
run: pnpm test:nuxt run --coverage --reporter=junit --outputFile=test-report.junit.xml
119119

120-
- name: ⬆︎ Upload test results to Codecov
121-
if: ${{ !cancelled() }}
122-
uses: codecov/test-results-action@0fa95f0e1eeaafde2c782583b36b28ad0d8c77d3 # v1
120+
- name: ⬆︎ Upload coverage reports to Codecov
121+
uses: codecov/codecov-action@671740ac38dd9b0130fbe1cec585b89eea48d3de # v5
123122
with:
124-
token: ${{ secrets.CODECOV_TOKEN }}
123+
report_type: test_results
124+
env:
125+
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
125126

126127
- name: ⬆︎ Upload coverage reports to Codecov
127128
uses: codecov/codecov-action@671740ac38dd9b0130fbe1cec585b89eea48d3de # v5

.oxlintrc.json

Lines changed: 67 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"$schema": "https://unpkg.com/oxlint/configuration_schema.json",
33
"plugins": ["unicorn", "typescript", "oxc", "vue", "vitest"],
4-
"jsPlugins": ["@e18e/eslint-plugin"],
4+
"jsPlugins": ["@e18e/eslint-plugin", "eslint-plugin-regexp"],
55
"categories": {
66
"correctness": "error",
77
"suspicious": "warn",
@@ -17,7 +17,72 @@
1717
"e18e/prefer-timer-args": "error",
1818
"e18e/prefer-date-now": "error",
1919
"e18e/prefer-regex-test": "error",
20-
"e18e/prefer-array-some": "error"
20+
"e18e/prefer-array-some": "error",
21+
// RegExp - Possible Errors (most critical)
22+
"regexp/no-contradiction-with-assertion": "error",
23+
"regexp/no-dupe-disjunctions": "error",
24+
"regexp/no-empty-alternative": "error",
25+
"regexp/no-empty-capturing-group": "error",
26+
"regexp/no-empty-character-class": "error",
27+
"regexp/no-empty-group": "error",
28+
"regexp/no-empty-lookarounds-assertion": "error",
29+
"regexp/no-escape-backspace": "error",
30+
"regexp/no-invalid-regexp": "error",
31+
"regexp/no-lazy-ends": "error",
32+
"regexp/no-misleading-capturing-group": "error",
33+
"regexp/no-misleading-unicode-character": "error",
34+
"regexp/no-missing-g-flag": "error",
35+
"regexp/no-optional-assertion": "error",
36+
"regexp/no-potentially-useless-backreference": "error",
37+
"regexp/no-super-linear-backtracking": "error",
38+
"regexp/no-useless-assertions": "error",
39+
"regexp/no-useless-backreference": "error",
40+
"regexp/no-useless-dollar-replacements": "error",
41+
"regexp/strict": "error",
42+
// RegExp - Best Practices
43+
"regexp/confusing-quantifier": "warn",
44+
"regexp/control-character-escape": "error",
45+
"regexp/negation": "error",
46+
"regexp/no-dupe-characters-character-class": "error",
47+
"regexp/no-empty-string-literal": "error",
48+
"regexp/no-extra-lookaround-assertions": "error",
49+
"regexp/no-invisible-character": "error",
50+
"regexp/no-legacy-features": "error",
51+
"regexp/no-non-standard-flag": "error",
52+
"regexp/no-obscure-range": "error",
53+
"regexp/no-octal": "error",
54+
"regexp/no-standalone-backslash": "error",
55+
"regexp/no-trivially-nested-assertion": "error",
56+
"regexp/no-trivially-nested-quantifier": "error",
57+
"regexp/no-unused-capturing-group": "warn",
58+
"regexp/no-useless-character-class": "error",
59+
"regexp/no-useless-flag": "error",
60+
"regexp/no-useless-lazy": "error",
61+
"regexp/no-useless-quantifier": "error",
62+
"regexp/no-useless-range": "error",
63+
"regexp/no-useless-set-operand": "error",
64+
"regexp/no-useless-string-literal": "error",
65+
"regexp/no-useless-two-nums-quantifier": "error",
66+
"regexp/no-zero-quantifier": "error",
67+
"regexp/optimal-lookaround-quantifier": "warn",
68+
"regexp/optimal-quantifier-concatenation": "error",
69+
"regexp/prefer-predefined-assertion": "error",
70+
"regexp/prefer-range": "error",
71+
"regexp/prefer-set-operation": "error",
72+
"regexp/simplify-set-operations": "error",
73+
"regexp/use-ignore-case": "error",
74+
// RegExp - Stylistic Issues (less critical, focused on consistency)
75+
"regexp/match-any": "warn",
76+
"regexp/no-useless-escape": "warn",
77+
"regexp/no-useless-non-capturing-group": "warn",
78+
"regexp/prefer-character-class": "warn",
79+
"regexp/prefer-d": "warn",
80+
"regexp/prefer-plus-quantifier": "warn",
81+
"regexp/prefer-question-quantifier": "warn",
82+
"regexp/prefer-star-quantifier": "warn",
83+
"regexp/prefer-unicode-codepoint-escapes": "warn",
84+
"regexp/prefer-w": "warn",
85+
"regexp/sort-flags": "warn"
2186
},
2287
"overrides": [
2388
{

.vscode/settings.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
{
2-
"i18n-ally.localesPaths": ["./i18n/locales"],
2+
"editor.defaultFormatter": "oxc.oxc-vscode",
3+
"editor.formatOnSave": true,
34
"i18n-ally.keystyle": "nested",
5+
"i18n-ally.localesPaths": ["./i18n/locales"],
46
"typescript.tsdk": "node_modules/typescript/lib"
57
}

app/components/ColumnPicker.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ function handleReset() {
8585
v-if="isOpen"
8686
ref="menuRef"
8787
:id="menuId"
88-
class="absolute inset-is-0 sm:inset-is-auto sm:inset-ie-0 mt-2 w-60 bg-bg-subtle border border-border rounded-lg shadow-lg z-20"
88+
class="absolute top-full inset-ie-0 sm:inset-is-auto sm:inset-ie-0 mt-2 w-60 bg-bg-subtle border border-border rounded-lg shadow-lg z-20"
8989
role="group"
9090
:aria-label="$t('filters.columns.show')"
9191
>

app/components/Header/AuthModal.client.vue

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,12 @@ const handleInput = shallowRef('')
66
const route = useRoute()
77
const { user, logout } = useAtproto()
88
9+
// https://atproto.com supports 4 locales as of 2026-02-07
10+
const { locale } = useI18n()
11+
const currentLang = locale.value.split('-')[0] ?? 'en'
12+
const localeSubPath = ['ko', 'pt', 'ja'].includes(currentLang) ? currentLang : ''
13+
const atprotoLink = `https://atproto.com/${localeSubPath}`
14+
915
async function handleBlueskySignIn() {
1016
await authRedirect('https://bsky.social', { redirectTo: route.fullPath })
1117
}
@@ -76,7 +82,7 @@ async function handleLogin() {
7682
<span class="font-bold">npmx.dev</span>
7783
</template>
7884
<template #atproto>
79-
<a href="https://atproto.com" target="_blank" class="text-blue-400 hover:underline">
85+
<a :href="atprotoLink" target="_blank" class="text-blue-400 hover:underline">
8086
AT Protocol
8187
</a>
8288
</template>

app/components/Package/DownloadAnalytics.vue

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,7 @@ function formatXyDataset(
174174
type: 'line',
175175
series: dataset.map(d => d.downloads),
176176
color: accent.value,
177+
useArea: true,
177178
},
178179
],
179180
dates: dataset.map(d => d.timestampEnd),
@@ -187,6 +188,7 @@ function formatXyDataset(
187188
type: 'line',
188189
series: dataset.map(d => d.downloads),
189190
color: accent.value,
191+
useArea: true,
190192
},
191193
],
192194
dates: dataset.map(d => d.timestamp),
@@ -200,6 +202,7 @@ function formatXyDataset(
200202
type: 'line',
201203
series: dataset.map(d => d.downloads),
202204
color: accent.value,
205+
useArea: true,
203206
},
204207
],
205208
dates: dataset.map(d => d.timestamp),
@@ -213,6 +216,7 @@ function formatXyDataset(
213216
type: 'line',
214217
series: dataset.map(d => d.downloads),
215218
color: accent.value,
219+
useArea: true,
216220
},
217221
],
218222
dates: dataset.map(d => d.timestamp),
@@ -1044,6 +1048,14 @@ const chartConfig = computed(() => {
10441048
<ClientOnly v-if="chartData.dataset">
10451049
<div>
10461050
<VueUiXy :dataset="chartData.dataset" :config="chartConfig" class="[direction:ltr]">
1051+
<!-- Subtle gradient applied for a unique series (chart modal) -->
1052+
<template #area-gradient="{ series: chartModalSeries, id: gradientId }">
1053+
<linearGradient :id="gradientId" x1="0" x2="0" y1="0" y2="1">
1054+
<stop offset="0%" :stop-color="chartModalSeries.color" stop-opacity="0.2" />
1055+
<stop offset="100%" :stop-color="colors.bg" stop-opacity="0" />
1056+
</linearGradient>
1057+
</template>
1058+
10471059
<!-- Custom legend for multiple series -->
10481060
<template v-if="isMultiPackageMode" #legend="{ legend }">
10491061
<div class="flex gap-4 flex-wrap justify-center">

app/composables/useStructuredFilters.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ export function parseSearchOperators(input: string): ParsedSearchOperators {
4242

4343
// Regex to match operators: name:value, desc:value, description:value, kw:value, keyword:value
4444
// Value continues until whitespace or next operator
45-
const operatorRegex = /\b(name|desc|description|kw|keyword):([^\s]+)/gi
45+
const operatorRegex = /\b(name|desc|description|kw|keyword):(\S+)/gi
4646

4747
let remaining = input
4848
let match

app/pages/about.vue

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ const { data: contributors, status: contributorsStatus } = useFetch<GitHubContri
5353
type="button"
5454
class="inline-flex items-center gap-2 font-mono text-sm text-fg-muted hover:text-fg transition-colors duration-200 rounded focus-visible:outline-accent/70 shrink-0"
5555
@click="router.back()"
56+
v-show="router.options.history.state.back !== null"
5657
>
5758
<span class="i-carbon:arrow-left rtl-flip w-4 h-4" aria-hidden="true" />
5859
<span class="hidden sm:inline">{{ $t('nav.back') }}</span>

app/pages/compare.vue

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,7 @@ useSeoMeta({
118118
type="button"
119119
class="inline-flex items-center gap-2 font-mono text-sm text-fg-muted hover:text-fg transition-colors duration-200 rounded focus-visible:outline-accent/70 shrink-0"
120120
@click="router.back()"
121+
v-show="router.options.history.state.back !== null"
121122
>
122123
<span class="i-carbon:arrow-left rtl-flip w-4 h-4" aria-hidden="true" />
123124
<span class="hidden sm:inline">{{ $t('nav.back') }}</span>

app/pages/privacy.vue

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ const { locale } = useI18n()
3030
type="button"
3131
class="inline-flex items-center gap-2 font-mono text-sm text-fg-muted hover:text-fg transition-colors duration-200 rounded focus-visible:outline-accent/70 shrink-0"
3232
@click="router.back()"
33+
v-show="router.options.history.state.back !== null"
3334
>
3435
<span class="i-carbon:arrow-left rtl-flip w-4 h-4" aria-hidden="true" />
3536
<span class="sr-only sm:not-sr-only">{{ $t('nav.back') }}</span>

0 commit comments

Comments
 (0)