diff --git a/src/components/CodespacesButton.tsx b/src/components/CodespacesButton.tsx
index 33afdfe61..28f6c4f5a 100644
--- a/src/components/CodespacesButton.tsx
+++ b/src/components/CodespacesButton.tsx
@@ -11,11 +11,11 @@ export const CodespacesButton = ({ href, fullWidth = false }: CodespacesButtonPr
Open in Codespaces
- (opens in new tab)
+
Free GitHub account required
diff --git a/src/components/CommunitySection.tsx b/src/components/CommunitySection.tsx
index 84a1d8ae1..8104d15a3 100644
--- a/src/components/CommunitySection.tsx
+++ b/src/components/CommunitySection.tsx
@@ -65,10 +65,10 @@ export const CommunitySection = ({ aside }: { aside?: ReactNode }): JSX.Element
- {card.cta} (opens in new tab)
+ {card.cta}
))}
diff --git a/src/components/CommunitySidebar.tsx b/src/components/CommunitySidebar.tsx
index 7e8b7475f..c18a14135 100644
--- a/src/components/CommunitySidebar.tsx
+++ b/src/components/CommunitySidebar.tsx
@@ -131,13 +131,13 @@ export const CommunitySidebar = ({
{hasThread ? "Share & Discuss" : "Join the Community"}
- (opens in new tab)
+
Get help or share your solution
diff --git a/src/components/ConsentBanner.tsx b/src/components/ConsentBanner.tsx
index ba20eb24f..4b014314a 100644
--- a/src/components/ConsentBanner.tsx
+++ b/src/components/ConsentBanner.tsx
@@ -35,7 +35,6 @@ export function ConsentBanner(): JSX.Element {
type="button"
onClick={reset}
aria-label="Reset cookie preferences"
- title="Reset cookie preferences"
style={{ bottom: 'calc(env(safe-area-inset-bottom, 0px) + 5rem)' }}
className="fixed right-4 z-50 flex h-11 w-11 items-center justify-center rounded-full border border-border bg-background text-muted-foreground shadow-md transition-colors hover:bg-accent hover:text-accent-foreground focus-ring"
>
diff --git a/src/components/ContributorBadge.tsx b/src/components/ContributorBadge.tsx
index 016843788..2c6674a73 100644
--- a/src/components/ContributorBadge.tsx
+++ b/src/components/ContributorBadge.tsx
@@ -28,12 +28,12 @@ export const ContributorBadge = ({ name, url, glow = false, label = "Challenge B
{content}
- (opens in new tab)
+
);
}
diff --git a/src/components/DiscussionSection.tsx b/src/components/DiscussionSection.tsx
index 6b40b322a..11bc1d50f 100644
--- a/src/components/DiscussionSection.tsx
+++ b/src/components/DiscussionSection.tsx
@@ -24,10 +24,10 @@ export const DiscussionSection = ({ adventureId, levelId, discussionUrl }: Discu
- Join the Discussion on {COMMUNITY_DISPLAY_NAME} (opens in new tab)
+ Join the Discussion on {COMMUNITY_DISPLAY_NAME}
);
@@ -58,7 +58,7 @@ export const DiscussionSection = ({ adventureId, levelId, discussionUrl }: Discu
key={`${post.username}-${post.created_at}`}
href={post.topicUrl}
target="_blank"
- rel="noopener noreferrer"
+ rel="noopener noreferrer" aria-describedby="new-tab-hint"
className="block card-glow rounded-xl border border-border bg-[hsl(var(--surface))] p-5 transition-all focus-ring"
>
diff --git a/src/components/LevelCard.tsx b/src/components/LevelCard.tsx
index 5b84bfd08..761fab366 100644
--- a/src/components/LevelCard.tsx
+++ b/src/components/LevelCard.tsx
@@ -37,10 +37,10 @@ export const LevelCard = ({ level, headingLevel = "h2" }: LevelCardProps): JSX.E
- Open in GitHub Codespaces (opens in new tab)
+ Open in GitHub Codespaces
@@ -49,8 +49,8 @@ export const LevelCard = ({ level, headingLevel = "h2" }: LevelCardProps): JSX.E
Discussion
diff --git a/src/components/Navbar.tsx b/src/components/Navbar.tsx
index 58d533302..ae04f726c 100644
--- a/src/components/Navbar.tsx
+++ b/src/components/Navbar.tsx
@@ -44,11 +44,11 @@ const NavLinks = ({ onNavigate }: NavLinksProps): JSX.Element => (
- Community (opens in new tab)
+ Community
@@ -135,7 +135,7 @@ export const Navbar = (): JSX.Element => {
ref={triggerRef}
onClick={() => setMenuOpen((o) => !o)}
className="flex h-11 w-11 items-center justify-center rounded-md border border-border bg-[hsl(var(--surface))] text-foreground/70 hover:text-foreground transition-all focus-ring"
- aria-label={menuOpen ? "Close menu" : "Open menu"}
+ aria-label="Menu"
aria-expanded={menuOpen}
aria-controls="mobile-menu"
>
diff --git a/src/components/PageHero.tsx b/src/components/PageHero.tsx
index 968144ce1..099dd7b3a 100644
--- a/src/components/PageHero.tsx
+++ b/src/components/PageHero.tsx
@@ -22,9 +22,9 @@ const renderCta = (cta: Cta, isPrimary: boolean): JSX.Element => {
if (cta.external) {
return (
-
+
{cta.label}
- (opens in new tab)
+
);
}
diff --git a/src/components/PersonNameLink.tsx b/src/components/PersonNameLink.tsx
index bd2853f8a..bf25b0ff6 100644
--- a/src/components/PersonNameLink.tsx
+++ b/src/components/PersonNameLink.tsx
@@ -15,12 +15,12 @@ export const PersonNameLink = ({ name, url }: PersonNameLinkProps): JSX.Element
{name}
- (opens in new tab)
+
);
};
diff --git a/src/components/RewardsCard.tsx b/src/components/RewardsCard.tsx
index c39f8be8c..13f080ac9 100644
--- a/src/components/RewardsCard.tsx
+++ b/src/components/RewardsCard.tsx
@@ -28,12 +28,12 @@ export const RewardsCard = ({ rewards, compact = false, levelDeadline, deadlineP
Community Voices
- (opens in new tab)
+
.
@@ -67,12 +67,12 @@ export const RewardsCard = ({ rewards, compact = false, levelDeadline, deadlineP
See the points & ranking rules for the full breakdown
- (opens in new tab)
+
)}
diff --git a/src/pages/Accessibility.tsx b/src/pages/Accessibility.tsx
index 55f955af7..ed3b5b848 100644
--- a/src/pages/Accessibility.tsx
+++ b/src/pages/Accessibility.tsx
@@ -42,10 +42,10 @@ const Accessibility = (): JSX.Element => {
Tested with{" "}
-
- axe-core (opens in new tab)
+
+ axe-core
{" "}
on every pull request preview, in both light and dark mode.
@@ -203,10 +203,10 @@ const Accessibility = (): JSX.Element => {
- open an accessibility issue (opens in new tab)
+ open an accessibility issue
. The form prompts for the page, your assistive technology, and severity, which helps
us reproduce and prioritize.
@@ -264,10 +264,10 @@ const Accessibility = (): JSX.Element => {
- ACCESSIBILITY.md (opens in new tab)
+ ACCESSIBILITY.md
{" "}
and applies to every change.
@@ -286,10 +286,10 @@ const Accessibility = (): JSX.Element => {
- mgifford/ACCESSIBILITY.md (opens in new tab)
+ mgifford/ACCESSIBILITY.md
, a community resource for accessibility best practices, testing criteria, and
issue severity frameworks. Thank you to Mike Gifford and all contributors for
diff --git a/src/pages/ChallengeDetail.tsx b/src/pages/ChallengeDetail.tsx
index 730ea5ac1..50da9cb22 100644
--- a/src/pages/ChallengeDetail.tsx
+++ b/src/pages/ChallengeDetail.tsx
@@ -219,7 +219,7 @@ const StructuredLayout = ({ adventure, level, rewardsBelowFold, hasSolution }: S
{
title: "Get Started",
content: [
- `
Open in GitHub Codespaces . The devcontainer development container: a portable, reproducible coding environment defined by a configuration file is pre-configured and starts automatically. When you push from Codespaces, GitHub forks the repository to your account automatically.
`,
+ `
Open in GitHub Codespaces . The devcontainer development container: a portable, reproducible coding environment defined by a configuration file is pre-configured and starts automatically. When you push from Codespaces, GitHub forks the repository to your account automatically.
`,
`
Prefer working locally? Clone the repo and open it in any editor that supports the Dev Containers specification (VS Code Visual Studio Code , JetBrains, and others). The devcontainer config will be detected automatically.
`,
].join("\n"),
},
@@ -262,10 +262,10 @@ const StructuredLayout = ({ adventure, level, rewardsBelowFold, hasSolution }: S
- challenge thread (opens in new tab)
+ challenge thread
{" "}
on {COMMUNITY_DISPLAY_NAME}.
@@ -276,12 +276,12 @@ const StructuredLayout = ({ adventure, level, rewardsBelowFold, hasSolution }: S
Share your achievement on LinkedIn
- (opens in new tab)
+
@@ -323,12 +323,12 @@ const StructuredLayout = ({ adventure, level, rewardsBelowFold, hasSolution }: S
{tool.name}
- (opens in new tab)
+
) : (
{tool.name}
@@ -354,12 +354,12 @@ const StructuredLayout = ({ adventure, level, rewardsBelowFold, hasSolution }: S
{link.title}
- (opens in new tab)
+
diff --git a/src/pages/CommunityGuide.tsx b/src/pages/CommunityGuide.tsx
index c752e2acf..4da385e83 100644
--- a/src/pages/CommunityGuide.tsx
+++ b/src/pages/CommunityGuide.tsx
@@ -55,8 +55,8 @@ const CommunityGuide = (): JSX.Element => {
Create your account to access challenges, Q&A, community discussions, and everything else.
-
- Create an account (opens in new tab)
+
+ Create an account
@@ -65,8 +65,8 @@ const CommunityGuide = (): JSX.Element => {
Say hello and tell the community who you are and what you're working on. It's the first step.
-
- Say hello (opens in new tab)
+
+ Say hello
@@ -75,8 +75,8 @@ const CommunityGuide = (): JSX.Element => {
Stuck on a technical problem? Post a clear question and get answers from the community. No question is too basic.
-
- Ask a question (opens in new tab)
+
+ Ask a question
@@ -85,8 +85,8 @@ const CommunityGuide = (): JSX.Element => {
Share a tutorial, showcase a project, or write about what you've learned. Every contribution makes the community stronger.
-
- Share something (opens in new tab)
+
+ Share something
@@ -101,8 +101,8 @@ const CommunityGuide = (): JSX.Element => {
Hands-on scenarios with broken environments, misconfigured pipelines, and real-world failures to debug and fix. Post your solution and see how others approached it.
-
- Start a challenge (opens in new tab)
+
+ Start a challenge
@@ -111,8 +111,8 @@ const CommunityGuide = (): JSX.Element => {
Bring your expertise and experience. Help build adventures for others to learn from open source tech with a broken scenario, a real-world failure, or a skill gap. Shape the next adventure.
-
- Submit an idea (opens in new tab)
+
+ Submit an idea
@@ -130,8 +130,8 @@ const CommunityGuide = (): JSX.Element => {
].map((item) => (
-
- {item.label} (opens in new tab)
+
+ {item.label}
))}
diff --git a/src/pages/Contribute.tsx b/src/pages/Contribute.tsx
index b2d68a30c..cb2209e53 100644
--- a/src/pages/Contribute.tsx
+++ b/src/pages/Contribute.tsx
@@ -62,8 +62,8 @@ const Contribute = (): JSX.Element => {
Browse the forum, see what the community is building, and sign up to get started. Introduce yourself and get a feel for how {BRAND_NAME} works.
-
- Create an account (opens in new tab)
+
+ Create an account
@@ -83,21 +83,21 @@ const Contribute = (): JSX.Element => {
Have a scenario that would make a great challenge? Submit your idea on GitHub. Ready to go further? Pick up an approved idea and implement the full adventure.
-
- Read the adventure ideas guide (opens in new tab)
+
+ Read the adventure ideas guide
-
- Browse open adventure ideas (opens in new tab)
+
+ Browse open adventure ideas
@@ -107,8 +107,8 @@ const Contribute = (): JSX.Element => {
Stay up to date with what is happening across the open source community. Answer the question of the week and tell us what topics you would like to see covered next.
-
- Read the weekly digest (opens in new tab)
+
+ Read the weekly digest
@@ -117,8 +117,8 @@ const Contribute = (): JSX.Element => {
Running a local meetup, user group, or open source community? Use {BRAND_NAME} as a vendor-agnostic home for your discussions and announcements. Find existing groups, join as a speaker, or bring open source to your local community.
-
- Explore meetups and groups (opens in new tab)
+
+ Explore meetups and groups
@@ -129,17 +129,17 @@ const Contribute = (): JSX.Element => {
Follow us, repost what we share, and mention {BRAND_NAME} to your network. Writing about us in a blog post or podcast episode? Share it with us by email or mention us on social media and we would love to repost.