From 0ce1c401aa49ee4814ada2ac258bd6d790da05ed Mon Sep 17 00:00:00 2001
From: Vordgi
Date: Sat, 16 May 2026 14:24:06 +0100
Subject: [PATCH 1/6] feat: update governance list and design
---
app/components/About/GovernanceList.vue | 60 +++++++++++++++++++
app/components/About/LogoList.vue | 4 +-
app/pages/about.vue | 80 +++++++------------------
i18n/locales/en.json | 1 +
i18n/schema.json | 3 +
server/api/contributors.get.ts | 17 ++++--
6 files changed, 100 insertions(+), 65 deletions(-)
create mode 100644 app/components/About/GovernanceList.vue
diff --git a/app/components/About/GovernanceList.vue b/app/components/About/GovernanceList.vue
new file mode 100644
index 0000000000..4c6c7b89f9
--- /dev/null
+++ b/app/components/About/GovernanceList.vue
@@ -0,0 +1,60 @@
+
+
+
+
+ -
+
+
![]()
+
+
+
+ @{{ person.login }}
+
+
+
+ {{ roleLabels[person.role] ?? person.role }}
+
+
+ {{ $t('about.team.sponsor') }}
+
+
+
+
+
+
diff --git a/app/components/About/LogoList.vue b/app/components/About/LogoList.vue
index 8e9bd819fb..03945b705c 100644
--- a/app/components/About/LogoList.vue
+++ b/app/components/About/LogoList.vue
@@ -35,7 +35,7 @@ const props = defineProps<{
:href="item.url"
target="_blank"
rel="noopener noreferrer"
- class="relative flex items-center justify-center h-16 rounded-md bg-bg-muted hover:bg-bg-subtle border border-border transition-colors py-1 px-3"
+ class="relative flex items-center justify-center h-16 rounded-md bg-bg-muted hover:bg-bg-subtle border border-border hover:border-border-hover transition-colors py-1 px-3"
:style="{ paddingBlock: item.normalisingIndent }"
:aria-label="item.name"
>
@@ -65,7 +65,7 @@ const props = defineProps<{
:href="groupItem.url"
target="_blank"
rel="noopener noreferrer"
- class="relative flex items-center justify-center h-full aspect-square rounded-md hover:bg-bg-subtle border border-transparent hover:border-border transition-colors p-1.5"
+ class="relative flex items-center justify-center h-full aspect-square rounded-md hover:bg-bg-subtle border border-transparent hover:border-border-hover transition-colors p-1.5"
:style="{ paddingBlock: groupItem.normalisingIndent }"
:aria-label="groupItem.name"
>
diff --git a/app/pages/about.vue b/app/pages/about.vue
index 5e898e23c7..45a5fb5aff 100644
--- a/app/pages/about.vue
+++ b/app/pages/about.vue
@@ -33,19 +33,15 @@ const pmLinks = {
const { data: contributors, status: contributorsStatus } = useLazyFetch('/api/contributors')
const governanceMembers = computed(
- () => contributors.value?.filter(c => c.role !== 'contributor') ?? [],
+ () => contributors.value?.filter(c => c.role === 'steward' || c.role === 'core') ?? [],
)
-const communityContributors = computed(
- () => contributors.value?.filter(c => c.role === 'contributor') ?? [],
+const maintainersMembers = computed(
+ () => contributors.value?.filter(c => c.role === 'maintainer') ?? [],
)
-const roleLabels = computed(
- () =>
- ({
- steward: $t('about.team.role_steward'),
- maintainer: $t('about.team.role_maintainer'),
- }) as Partial>,
+const communityContributors = computed(
+ () => contributors.value?.filter(c => c.role === 'contributor') ?? [],
)
@@ -179,7 +175,7 @@ const roleLabels = computed(
{{ $t('about.contributors.description') }}
-
+
-
- -
-
-
-
-
- @{{ person.login }}
-
-
-
- {{ roleLabels[person.role] ?? person.role }}
-
-
- {{ $t('about.team.sponsor') }}
-
-
-
-
-
+
+
+
+
+
+
+ {{ $t('about.team.maintainers') }}
+
+
+
@@ -263,12 +229,12 @@ const roleLabels = computed(
-
diff --git a/i18n/locales/en.json b/i18n/locales/en.json
index 7e119affa7..94c475f361 100644
--- a/i18n/locales/en.json
+++ b/i18n/locales/en.json
@@ -1185,6 +1185,7 @@
"team": {
"title": "Team",
"governance": "Governance",
+ "maintainers": "Maintainers",
"role_steward": "steward",
"role_maintainer": "maintainer",
"sponsor": "sponsor",
diff --git a/i18n/schema.json b/i18n/schema.json
index ee385067bd..b96ce0c76e 100644
--- a/i18n/schema.json
+++ b/i18n/schema.json
@@ -3559,6 +3559,9 @@
"governance": {
"type": "string"
},
+ "maintainers": {
+ "type": "string"
+ },
"role_steward": {
"type": "string"
},
diff --git a/server/api/contributors.get.ts b/server/api/contributors.get.ts
index 597d0a2dfd..c7e4329158 100644
--- a/server/api/contributors.get.ts
+++ b/server/api/contributors.get.ts
@@ -1,4 +1,4 @@
-export type Role = 'steward' | 'maintainer' | 'contributor'
+export type Role = 'steward' | 'maintainer' | 'contributor' | 'core'
export interface GitHubContributor {
login: string
@@ -18,17 +18,19 @@ const FALLBACK_STEWARDS = new Set(['danielroe', 'patak-cat'])
interface TeamMembers {
steward: Set
+ core: Set
maintainer: Set
}
async function fetchTeamMembers(token: string): Promise {
const teams: Record = {
steward: 'stewards',
+ core: 'core',
maintainer: 'maintainers',
}
try {
- const result: TeamMembers = { steward: new Set(), maintainer: new Set() }
+ const result: TeamMembers = { steward: new Set(), maintainer: new Set(), core: new Set() }
for (const [role, slug] of Object.entries(teams) as [keyof TeamMembers, string][]) {
const response = await fetch(
@@ -110,8 +112,9 @@ async function fetchSponsorable(token: string, logins: string[]): Promise() }
+ return { steward: FALLBACK_STEWARDS, maintainer: new Set(), core: new Set() }
})()
const allContributors: GitHubAPIContributor[] = []
@@ -169,7 +172,9 @@ export default defineCachedEventHandler(
// Identify maintainers (stewards + maintainers) and check their sponsors status
const maintainerLogins = filtered
- .filter(c => teams.steward.has(c.login) || teams.maintainer.has(c.login))
+ .filter(
+ c => teams.steward.has(c.login) || teams.core.has(c.login) || teams.maintainer.has(c.login),
+ )
.map(c => c.login)
const sponsorable = githubToken
From e6d219ba08943ca487304aad51ba39fd629aa263 Mon Sep 17 00:00:00 2001
From: Vordgi
Date: Sat, 16 May 2026 14:30:14 +0100
Subject: [PATCH 2/6] test: cover about-governance-list
---
test/nuxt/a11y.spec.ts | 32 ++++++++++++++++++++++++++++++++
1 file changed, 32 insertions(+)
diff --git a/test/nuxt/a11y.spec.ts b/test/nuxt/a11y.spec.ts
index 5d0865d77f..a8d990d2cd 100644
--- a/test/nuxt/a11y.spec.ts
+++ b/test/nuxt/a11y.spec.ts
@@ -144,6 +144,7 @@ import {
AppMark,
AboutLogoImg,
AboutLogoList,
+ AboutGovernanceList,
AuthorAvatar,
AuthorList,
BackButton,
@@ -517,6 +518,37 @@ describe('component accessibility audits', () => {
})
})
+ describe('AboutGovernanceList', () => {
+ it('should have no accessibility violations', async () => {
+ const component = await mountSuspended(AboutGovernanceList, {
+ props: {
+ members: [
+ {
+ id: 1,
+ login: 'steward1',
+ avatar_url: 'https://github.com/steward1.png',
+ html_url: 'https://github.com/steward1',
+ contributions: 100,
+ role: 'steward',
+ sponsors_url: 'https://github.com/sponsors/steward1',
+ },
+ {
+ id: 3,
+ login: 'contributor1',
+ avatar_url: 'https://github.com/contributor1.png',
+ html_url: 'https://github.com/contributor1',
+ contributions: 100,
+ role: 'contributor',
+ sponsors_url: 'https://github.com/sponsors/contributor1',
+ },
+ ],
+ },
+ })
+ const results = await runAxe(component)
+ expect(results.violations).toEqual([])
+ })
+ })
+
describe('BaseCard', () => {
it('should have no accessibility violations', async () => {
const component = await mountSuspended(BaseCard, {
From 7912c394dafd77a8dc91b3d31b9f32cb2fb9b43e Mon Sep 17 00:00:00 2001
From: Vordgi
Date: Sat, 16 May 2026 14:30:49 +0100
Subject: [PATCH 3/6] chore: remove unused import
---
app/pages/about.vue | 1 -
1 file changed, 1 deletion(-)
diff --git a/app/pages/about.vue b/app/pages/about.vue
index 45a5fb5aff..c1db44691d 100644
--- a/app/pages/about.vue
+++ b/app/pages/about.vue
@@ -1,5 +1,4 @@