update biome - #968
Conversation
Dokploy Preview Deployment
|
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
📝 WalkthroughWalkthroughUpdated Biome config (schema path, removed framework-specific overrides, enabled experimental full HTML support), added Zed/Svelte editor settings, removed one npm script, and applied small accessibility, markup, and whitespace changes across several Astro/Svelte components and the Layout. Changes
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~20 minutes Possibly related PRs
Poem
🚥 Pre-merge checks | ✅ 2 | ❌ 1❌ Failed checks (1 inconclusive)
✅ Passed checks (2 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
095dad6 to
4b84529
Compare
There was a problem hiding this comment.
Actionable comments posted: 3
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (2)
src/components/Footer/Footer.astro (1)
35-50:⚠️ Potential issue | 🟡 Minor
aria-labelon the anchor overrides and downgrades the accessible link name.
aria-labelon an<a>takes precedence over the name computed from a child<img alt="...">. Here, screen readers will announce"astro.build, link"instead of the more descriptive"Built with Astro, link"that was previously derived from the imagealt. Consider aligning the label with thealttext, or omitting thearia-labelentirely and letting the imagealtserve as the link's accessible name.💡 Suggested fix
-<a aria-label="astro.build" href="https://astro.build" class="md:hidden"> +<a aria-label="Built with Astro" href="https://astro.build" class="md:hidden">-<a aria-label="astro.build" href="https://astro.build" class="hidden md:block"> +<a aria-label="Built with Astro" href="https://astro.build" class="hidden md:block">🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/components/Footer/Footer.astro` around lines 35 - 50, The anchor elements in Footer.astro currently set aria-label="astro.build", which overrides the child Image alt text and produces a less descriptive accessible name; remove the aria-label attributes from the two <a> tags (or change them to exactly match their child Image alt values like "Built with Astro") so the link name is either the image alt ("Built with Astro") or the desired descriptive label instead of "astro.build". Update the two anchor elements that wrap the Image components accordingly.src/components/ExternalLink.astro (1)
32-43:⚠️ Potential issue | 🟡 Minor
aria-labelon anaria-hiddenelement is a no-op — the additions at lines 51 and 62 are ineffective.
imageProps(lines 32–43) includes"aria-hidden": true. Because{...imageProps}is spread on the same<img>after the explicitaria-label, the rendered element has both attributes.aria-hidden="true"removes the element entirely from the accessibility tree, so anyaria-labelon it is ignored by screen readers.Decide on intent:
- Keep favicon decorative (current behaviour): remove the new
aria-labeladditions from lines 51 and 62 —aria-hiddenalready handles it.- Expose favicon to AT: remove
"aria-hidden": truefromimagePropsand keep (or improve) thearia-label.🐛 Option A — keep decorative, remove the dead aria-labels (recommended)
- <img aria-label={`favicon for ${href}`} {...imageProps} class="w-4 inline-block my-0 mr-1" /> + <img {...imageProps} class="w-4 inline-block my-0 mr-1" />- <img aria-label={`favicon for ${href}`} {...imageProps} class="w-4 inline-block my-0 ml-1" /> + <img {...imageProps} class="w-4 inline-block my-0 ml-1" />🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/components/ExternalLink.astro` around lines 32 - 43, The img prop object imageProps currently sets "aria-hidden": true, which makes any aria-label on the same <img> a no-op; keep the favicon decorative: remove the explicit aria-label attributes that were added where {...imageProps} is spread (the two <img> usages that pass imageProps), leaving imageProps as-is; alternatively, if you want the favicon exposed to assistive tech, remove "aria-hidden": true from imageProps and ensure a meaningful aria-label is provided—pick one approach and make the corresponding change to either imageProps or the two <img> elements.
🧹 Nitpick comments (2)
src/components/AstroIcon.astro (1)
7-15:<title>added — consider pairing withrole="img"andaria-labelledbyfor full AT coverage.The
<title>element improves accessibility, but browser/screen-reader support for SVG<title>without explicit ARIA hooks is inconsistent. Addingrole="img"on the<svg>andaria-labelledbyreferencing the title'sidprovides reliable accessible-name computation across all major AT.♻️ Optional enhancement
+<title id="astro-logo-title">Astro Logo</title> <svg width="100%" height="100%" viewBox="0 0 85 107" fill="none" xmlns="http://www.w3.org/2000/svg" + role="img" + aria-labelledby="astro-logo-title" {...Astro.props} > - <title>Astro Logo</title>🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/components/AstroIcon.astro` around lines 7 - 15, The SVG in the AstroIcon component lacks explicit ARIA hooks: give the <title> a stable id (e.g., title-astro-icon) and update the <svg> to include role="img" and aria-labelledby pointing to that title id so assistive tech reliably computes the accessible name; keep Astro.props spread unchanged and ensure the title id is unique if multiple icons are rendered.src/components/Graph/Graph.svelte (1)
13-14: Consideraria-hidden="true"overrole="presentation"for this decorative SVG.
role="presentation"removes the element's implicit ARIA role semantics but some screen readers may still traverse and announce descendant content.aria-hidden="true"is the more robust and universally recommended approach for completely hiding a purely decorative graphic from the accessibility tree.♿ Suggested change
<svg - role="presentation" + aria-hidden="true" viewBox="0 0 312.49279 300"🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/components/Graph/Graph.svelte` around lines 13 - 14, The SVG in Graph.svelte is decorative; replace the role="presentation" attribute on the <svg> element with aria-hidden="true" to remove it from the accessibility tree (and remove the now-unnecessary role attribute), and verify there are no interactive or focusable descendant elements inside the same SVG (or make them accessible if present) so that the graphic is fully hidden from assistive technologies.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@src/components/Projects/ProjectCard/CardBody.astro`:
- Line 3: The render currently calls titleCase(title) but the named import was
removed; fix by either restoring the radash import (add back the named import
"title as titleCase" from "radash" alongside the existing dash import) or
replace the call to titleCase(title) with an inline JS transformation on the
title variable (e.g., implement the desired casing using String methods: split,
map and capitalize first char of each word, then join) so the reference
titleCase is no longer used.
In `@src/pages/projects/index.astro`:
- Line 6: The import of Layout is currently declared as a type-only import
("import type Layout") but Layout is a runtime Astro component used at render
points (see usages around the earlier reported lines), so remove the "type"
modifier and import Layout as a normal runtime value (e.g., change "import type
Layout" to a regular import of Layout) so the component can be used as a value
in the template; verify the imports for Layout and any other runtime components
are not using "import type".
- Line 33: The comparator in the sort call uses a non-existent property `_id`
and misleading parameter names `_a`/`_b`; update the comparator to access the
correct `id` property on entries (e.g., use `a.id` and `b.id`) and rename the
parameters to something meaningful like `a` and `b` so the expression becomes
`sort((a, b) => sortOrder.indexOf(a.id) - sortOrder.indexOf(b.id))`, ensuring
`sortOrder` contains matching `id` strings.
---
Outside diff comments:
In `@src/components/ExternalLink.astro`:
- Around line 32-43: The img prop object imageProps currently sets
"aria-hidden": true, which makes any aria-label on the same <img> a no-op; keep
the favicon decorative: remove the explicit aria-label attributes that were
added where {...imageProps} is spread (the two <img> usages that pass
imageProps), leaving imageProps as-is; alternatively, if you want the favicon
exposed to assistive tech, remove "aria-hidden": true from imageProps and ensure
a meaningful aria-label is provided—pick one approach and make the corresponding
change to either imageProps or the two <img> elements.
In `@src/components/Footer/Footer.astro`:
- Around line 35-50: The anchor elements in Footer.astro currently set
aria-label="astro.build", which overrides the child Image alt text and produces
a less descriptive accessible name; remove the aria-label attributes from the
two <a> tags (or change them to exactly match their child Image alt values like
"Built with Astro") so the link name is either the image alt ("Built with
Astro") or the desired descriptive label instead of "astro.build". Update the
two anchor elements that wrap the Image components accordingly.
---
Nitpick comments:
In `@src/components/AstroIcon.astro`:
- Around line 7-15: The SVG in the AstroIcon component lacks explicit ARIA
hooks: give the <title> a stable id (e.g., title-astro-icon) and update the
<svg> to include role="img" and aria-labelledby pointing to that title id so
assistive tech reliably computes the accessible name; keep Astro.props spread
unchanged and ensure the title id is unique if multiple icons are rendered.
In `@src/components/Graph/Graph.svelte`:
- Around line 13-14: The SVG in Graph.svelte is decorative; replace the
role="presentation" attribute on the <svg> element with aria-hidden="true" to
remove it from the accessibility tree (and remove the now-unnecessary role
attribute), and verify there are no interactive or focusable descendant elements
inside the same SVG (or make them accessible if present) so that the graphic is
fully hidden from assistive technologies.
| { | ||
| projects | ||
| .sort((a, b) => sortOrder.indexOf(a.id) - sortOrder.indexOf(b.id)) | ||
| .sort((_a, _b) => sortOrder.indexOf(_a._id) - sortOrder.indexOf(_b._id)) |
There was a problem hiding this comment.
_id does not exist on collection entries — use id.
Pipeline confirms: "Property '_id' does not exist on type '{ id: string; ... }'". The Astro 5 Content Layer entry shape exposes id, not _id. The parameter prefix _ is also misleading here since _a and _b are actively used in the comparator body.
🐛 Proposed fix
-.sort((_a, _b) => sortOrder.indexOf(_a._id) - sortOrder.indexOf(_b._id))
+.sort((a, b) => sortOrder.indexOf(a.id) - sortOrder.indexOf(b.id))📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| .sort((_a, _b) => sortOrder.indexOf(_a._id) - sortOrder.indexOf(_b._id)) | |
| .sort((a, b) => sortOrder.indexOf(a.id) - sortOrder.indexOf(b.id)) |
🧰 Tools
🪛 GitHub Actions: CI
[error] 33-33: Property '_id' does not exist on type '{ id: string; body?: string; collection: "projects"; data: { cover: { image?: { src: string; width: number; height: number; format: "png" | "jpg" | "jpeg" | "tiff" | "webp" | "gif" | "svg" | "avif"; } | undefined; alt?: string | undefined; }; title: string; description: string; meta?: { ...; } | undefined; }; render...'.
[error] 33-33: Property '_id' does not exist on type '{ id: string; body?: string; collection: "projects"; data: { cover: { image?: { src: string; width: number; height: number; format: "png" | "jpg" | "jpeg" | "tiff" | "webp" | "gif" | "svg" | "avif"; } | undefined; alt?: string | undefined; }; title: string; description: string; meta?: { ...; } | undefined; }; render...'.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@src/pages/projects/index.astro` at line 33, The comparator in the sort call
uses a non-existent property `_id` and misleading parameter names `_a`/`_b`;
update the comparator to access the correct `id` property on entries (e.g., use
`a.id` and `b.id`) and rename the parameters to something meaningful like `a`
and `b` so the expression becomes `sort((a, b) => sortOrder.indexOf(a.id) -
sortOrder.indexOf(b.id))`, ensuring `sortOrder` contains matching `id` strings.
There was a problem hiding this comment.
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
src/components/ExternalLink.astro (1)
32-43:⚠️ Potential issue | 🟡 Minor
aria-labelis silently dropped becauseimagePropsalready setsaria-hidden="true".When
aria-hidden="true"is present, the element is fully removed from the accessibility tree — anyaria-labelon that element is ignored by all ATs per the ARIA specification. The two attributes are semantically contradictory:
aria-hidden="true"→ "this element doesn't exist to screen readers"aria-label="…"→ "announce this element as…"Since favicons are purely decorative,
aria-hidden="true"(the existing behaviour) is the correct choice. The newaria-labelattributes do not improve accessibility; they create a false impression that they do.Fix options:
🛠️ Option A — Remove the contradictory
aria-label(keep images decorative)- <img aria-label={`favicon for ${href}`} {...imageProps} class="w-4 inline-block my-0 mr-1" /> + <img {...imageProps} class="w-4 inline-block my-0 mr-1" />- <img aria-label={`favicon for ${href}`} {...imageProps} class="w-4 inline-block my-0 ml-1" /> + <img {...imageProps} class="w-4 inline-block my-0 ml-1" />🛠️ Option B — Make the favicon visible to AT (remove
aria-hiddenfromimagePropsand keeparia-label)const imageProps = favicon && ({ width: 16, height: 16, src: `data:image/png;base64,${uint8ArrayToBase64(favicon)}`, alt: "favicon", fetchpriority: "low", loading: "lazy", decoding: "async", - "aria-hidden": true, } as const satisfies HTMLAttributes<"img">);Also applies to: 51-52, 62-62
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/components/ExternalLink.astro` around lines 32 - 43, The favicon image is decorative so keep aria-hidden on imageProps (the const imageProps built from favicon and uint8ArrayToBase64) and remove any aria-labels being added to those favicon images elsewhere (the usages referenced at the other spots), since aria-hidden="true" makes aria-label ineffective and contradictory; update code to stop passing aria-label to the elements that spread imageProps (or remove any explicit aria-label attributes near those image usages) so the image remains decorative and accessible.
🧹 Nitpick comments (3)
src/components/MenuButton.astro (1)
3-3: Consideraria-hidden="true"instead ofrole="presentation"for the decorative SVG.
role="presentation"strips the SVG element's own semantic role, but child elements (<g>,<rect>, etc.) may still surface implicit roles in some assistive technologies.aria-hidden="true"suppresses the entire subtree, which is the more idiomatic and thorough pattern for purely decorative icons that already have a text alternative (thesr-onlyspan on line 46).♿ Proposed change
<svg - role="presentation" + aria-hidden="true" class="fill-foreground size-8" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" >🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/components/MenuButton.astro` at line 3, The decorative SVG in the MenuButton component currently uses role="presentation"; replace that with aria-hidden="true" to ensure the entire SVG subtree is ignored by assistive tech (so its children like <g> or <rect> won’t create implicit roles) while keeping the visible text alternative in the sr-only span; locate the SVG element in the MenuButton component and update the attribute accordingly.src/components/AstroIcon.astro (1)
7-15: Consider pairing<title>withrole="img"andaria-labelledbyfor fuller screen-reader support.
<title>alone is announced inconsistently across AT/browser combos (e.g., NVDA+Firefox requiresaria-labelledby). The standard pattern:♿ Proposed enhancement for consistent AT support
<svg width="100%" height="100%" viewBox="0 0 85 107" fill="none" xmlns="http://www.w3.org/2000/svg" + role="img" + aria-labelledby="astro-logo-title" {...Astro.props} > - <title>Astro Logo</title> + <title id="astro-logo-title">Astro Logo</title>🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/components/AstroIcon.astro` around lines 7 - 15, The SVG in AstroIcon.astro currently has a <title> but lacks explicit accessibility attributes; update the <svg> element to include role="img" and an aria-labelledby that references the <title> id (e.g., give the <title> a unique id like "astro-title") so assistive tech reliably announces it; ensure the title element is updated with that id and that any props spreading ({...Astro.props}) does not override these attributes.src/components/Graph/Graph.svelte (1)
14-14: Consideraria-hidden="true"for a decorative animated SVG.
role="presentation"only removes the element's implicit ARIA role; the element and its descendant<path>nodes remain exposed to assistive technologies. For a purely decorative SVG with no accessible name (<title>,<desc>, oraria-label),aria-hidden="true"is the recommended approach per WAI-ARIA guidance—it removes the entire element and its subtree from the accessibility tree.♿ Proposed change
<svg - role="presentation" + aria-hidden="true" viewBox="0 0 312.49279 300"🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@src/components/Graph/Graph.svelte` at line 14, The SVG in Graph.svelte currently uses role="presentation" which still exposes its subtree; update the SVG element (the one with role="presentation") to use aria-hidden="true" (or add aria-hidden="true" alongside role if you prefer) to remove the entire SVG and its descendant <path> elements from the accessibility tree; ensure there are no accessible name attributes (no <title>, <desc>, aria-label) on that SVG before committing the change.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Outside diff comments:
In `@src/components/ExternalLink.astro`:
- Around line 32-43: The favicon image is decorative so keep aria-hidden on
imageProps (the const imageProps built from favicon and uint8ArrayToBase64) and
remove any aria-labels being added to those favicon images elsewhere (the usages
referenced at the other spots), since aria-hidden="true" makes aria-label
ineffective and contradictory; update code to stop passing aria-label to the
elements that spread imageProps (or remove any explicit aria-label attributes
near those image usages) so the image remains decorative and accessible.
---
Nitpick comments:
In `@src/components/AstroIcon.astro`:
- Around line 7-15: The SVG in AstroIcon.astro currently has a <title> but lacks
explicit accessibility attributes; update the <svg> element to include
role="img" and an aria-labelledby that references the <title> id (e.g., give the
<title> a unique id like "astro-title") so assistive tech reliably announces it;
ensure the title element is updated with that id and that any props spreading
({...Astro.props}) does not override these attributes.
In `@src/components/Graph/Graph.svelte`:
- Line 14: The SVG in Graph.svelte currently uses role="presentation" which
still exposes its subtree; update the SVG element (the one with
role="presentation") to use aria-hidden="true" (or add aria-hidden="true"
alongside role if you prefer) to remove the entire SVG and its descendant <path>
elements from the accessibility tree; ensure there are no accessible name
attributes (no <title>, <desc>, aria-label) on that SVG before committing the
change.
In `@src/components/MenuButton.astro`:
- Line 3: The decorative SVG in the MenuButton component currently uses
role="presentation"; replace that with aria-hidden="true" to ensure the entire
SVG subtree is ignored by assistive tech (so its children like <g> or <rect>
won’t create implicit roles) while keeping the visible text alternative in the
sr-only span; locate the SVG element in the MenuButton component and update the
attribute accordingly.
43dec22 to
14482ea
Compare
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@src/components/ExternalLink.astro`:
- Around line 51-52: Remove the conflicting aria-label on the favicon <img>
elements in ExternalLink.astro (the elements that spread imageProps) and rely on
the decorative pattern instead: ensure imageProps includes aria-hidden: true and
set alt="" (empty alt) on those <img> elements, then delete the
aria-label={`favicon for ${href}`} attributes (apply the same change for both
occurrences where imageProps is used) so the icons remain decorative and do not
create mixed accessibility semantics.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: 8f2f0695-8518-49ab-b6c4-f6f4547e89a4
📒 Files selected for processing (26)
.zed/settings.jsonbiome.jsonpackage.jsonsrc/components/AstroIcon.astrosrc/components/Background/Blobs.astrosrc/components/Contact/FormFields.astrosrc/components/Contact/SendEmailResponse.astrosrc/components/ExternalLink.astrosrc/components/Footer/Footer.astrosrc/components/Graph/Graph.sveltesrc/components/Head/SEO.astrosrc/components/Home/About/AboutText.astrosrc/components/Home/About/MeCard/MeCard.astrosrc/components/Home/About/MeCard/MeCardData.astrosrc/components/Home/About/MeCard/MeCardImage.astrosrc/components/Home/About/ProseAbout.astrosrc/components/Home/About/Tech.astrosrc/components/Home/About/TechGrid.astrosrc/components/Home/Hero/Hero.astrosrc/components/MenuButton.astrosrc/components/Nav/NavLink.astrosrc/components/Nav/Navbar.astrosrc/components/Nav/NavigationMenu.astrosrc/components/Projects/ProjectCard/ProjectCard.astrosrc/components/Projects/ProjectPage/PageBody.astrosrc/layouts/Layout.astro
💤 Files with no reviewable changes (1)
- package.json
✅ Files skipped from review due to trivial changes (17)
- src/components/Home/About/MeCard/MeCardImage.astro
- src/components/Home/About/TechGrid.astro
- src/components/Home/About/AboutText.astro
- src/components/Contact/SendEmailResponse.astro
- src/components/Home/Hero/Hero.astro
- src/components/Nav/NavigationMenu.astro
- src/components/Home/About/Tech.astro
- src/components/Nav/NavLink.astro
- src/components/AstroIcon.astro
- src/components/Nav/Navbar.astro
- src/components/Background/Blobs.astro
- src/components/Home/About/MeCard/MeCard.astro
- src/components/Footer/Footer.astro
- src/components/Graph/Graph.svelte
- .zed/settings.json
- src/components/Home/About/ProseAbout.astro
- src/components/Home/About/MeCard/MeCardData.astro
🚧 Files skipped from review as they are similar to previous changes (7)
- src/components/Contact/FormFields.astro
- src/components/Head/SEO.astro
- src/components/Projects/ProjectCard/ProjectCard.astro
- src/components/MenuButton.astro
- src/layouts/Layout.astro
- biome.json
- src/components/Projects/ProjectPage/PageBody.astro
| <img aria-label={`favicon for ${href}`} {...imageProps} class="w-4 inline-block my-0 mr-1" /> | ||
| <a {href} {...props} class="whitespace-normal"> |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
cat -n src/components/ExternalLink.astro | sed -n '40,70p'Repository: Trombach/astro-homepage
Length of output: 1128
🏁 Script executed:
cat -n src/components/ExternalLink.astro | sed -n '30,45p'Repository: Trombach/astro-homepage
Length of output: 541
Remove conflicting accessibility semantics on favicon images.
On lines 51 and 62, aria-label is added to <img> elements, but imageProps sets aria-hidden: true. The aria-hidden attribute removes the element from the accessibility tree, making the aria-label ineffective and creating conflicting intent. For decorative favicon icons, use the pattern: empty alt="" with aria-hidden: true, and remove the aria-label.
Suggested fix
const imageProps =
favicon &&
({
width: 16,
height: 16,
src: `data:image/png;base64,${uint8ArrayToBase64(favicon)}`,
- alt: "favicon",
+ alt: "",
fetchpriority: "low",
loading: "lazy",
decoding: "async",
"aria-hidden": true,
} as const satisfies HTMLAttributes<"img">);
-<img aria-label={`favicon for ${href}`} {...imageProps} class="w-4 inline-block my-0 mr-1" />
+<img {...imageProps} class="w-4 inline-block my-0 mr-1" />
-<img aria-label={`favicon for ${href}`} {...imageProps} class="w-4 inline-block my-0 ml-1" />
+<img {...imageProps} class="w-4 inline-block my-0 ml-1" />🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@src/components/ExternalLink.astro` around lines 51 - 52, Remove the
conflicting aria-label on the favicon <img> elements in ExternalLink.astro (the
elements that spread imageProps) and rely on the decorative pattern instead:
ensure imageProps includes aria-hidden: true and set alt="" (empty alt) on those
<img> elements, then delete the aria-label={`favicon for ${href}`} attributes
(apply the same change for both occurrences where imageProps is used) so the
icons remain decorative and do not create mixed accessibility semantics.
Summary by CodeRabbit
New Features
Bug Fixes
Style
Chores