diff --git a/app/components/About/GovernanceList.vue b/app/components/About/GovernanceList.vue
new file mode 100644
index 0000000000..aa89b6559a
--- /dev/null
+++ b/app/components/About/GovernanceList.vue
@@ -0,0 +1,61 @@
+
+
+
+
+ -
+
+
![]()
+
+
+
+ @{{ 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..2c6acac753 100644
--- a/app/pages/about.vue
+++ b/app/pages/about.vue
@@ -1,5 +1,4 @@
@@ -179,7 +174,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 +228,12 @@ const roleLabels = computed(
-
diff --git a/app/pages/pds.vue b/app/pages/pds.vue
index cc937df40c..4de6e01037 100644
--- a/app/pages/pds.vue
+++ b/app/pages/pds.vue
@@ -142,7 +142,7 @@ const totalAccounts = computed(() => pdsUsers.value.length)
{{ $t('pds.community.empty') }}
-
+
- pdsUsers.value.length)
@error="handleImageError(user.handle)"
width="48"
height="48"
- class="w-12 h-12 rounded-lg ring-2 ring-transparent group-hover:ring-accent transition-all duration-200 ease-out group-hover:scale-125 will-change-transform"
+ class="w-12 h-12 rounded-md ring-1 ring-transparent group-hover:ring-accent transition-all duration-200 ease-out"
loading="lazy"
/>
diff --git a/i18n/locales/en.json b/i18n/locales/en.json
index 7e119affa7..7c8f035eaf 100644
--- a/i18n/locales/en.json
+++ b/i18n/locales/en.json
@@ -1185,6 +1185,8 @@
"team": {
"title": "Team",
"governance": "Governance",
+ "maintainers": "Maintainers",
+ "role_core": "core",
"role_steward": "steward",
"role_maintainer": "maintainer",
"sponsor": "sponsor",
diff --git a/i18n/schema.json b/i18n/schema.json
index ee385067bd..57f82b4731 100644
--- a/i18n/schema.json
+++ b/i18n/schema.json
@@ -3559,6 +3559,12 @@
"governance": {
"type": "string"
},
+ "maintainers": {
+ "type": "string"
+ },
+ "role_core": {
+ "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
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, {