Skip to content

update biome - #968

Open
Trombach wants to merge 6 commits into
mainfrom
dependencies/biome
Open

update biome#968
Trombach wants to merge 6 commits into
mainfrom
dependencies/biome

Conversation

@Trombach

@Trombach Trombach commented Feb 15, 2026

Copy link
Copy Markdown
Owner

Summary by CodeRabbit

  • New Features

    • Enabled experimental full HTML support for improved markup handling.
  • Bug Fixes

    • Improved accessibility with ARIA labels, presentation roles, and explicit button behavior.
  • Style

    • Updated text-wrapping and component width constraints for more consistent layout; minor head/markup adjustments.
  • Chores

    • Updated tooling/configuration and removed an obsolete release script; added editor formatting/code-action settings.

@dokploy-hetzner-trombach

dokploy-hetzner-trombach Bot commented Feb 15, 2026

Copy link
Copy Markdown

Dokploy Preview Deployment

Name Status Preview Updated (UTC)
Frontend ✅ Done Preview URL 2026-02-23T20:57:00.587Z

@github-actions github-actions Bot added the dependencies Pull requests that update a dependency file label Feb 15, 2026
@coderabbitai

coderabbitai Bot commented Feb 15, 2026

Copy link
Copy Markdown

Note

Reviews paused

It 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 reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Updated 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

Cohort / File(s) Summary
Biome / Editor / Scripts
biome.json, package.json, .zed/settings.json
Switched Biome $schema to local ./node_modules/@biomejs/biome/configuration_schema.json; removed overrides for **/*.svelte, **/*.astro, **/*.vue; enabled html.experimentalFullSupportEnabled; removed bump-version script; added .zed Svelte Biome formatter and code actions.
Accessibility & ARIA
src/components/AstroIcon.astro, src/components/Background/Blobs.astro, src/components/ExternalLink.astro, src/components/Footer/Footer.astro, src/components/MenuButton.astro
Added <title> to SVG, role="presentation" on SVGs, aria-label for favicon images, aria-label="astro.build" on footer links, and type="button" on menu button.
Layout / Template
src/layouts/Layout.astro
Removed <!doctype html> and inserted an additional ThemeProvider in the head (resulting in multiple ThemeProvider inclusions).
Content / Image & Styling
src/components/Projects/ProjectCard/ProjectCard.astro, src/components/Projects/ProjectPage/PageBody.astro
Changed ProjectCard max-width class; PageBody image condition now requires cover.image && cover.alt (removed cover guard), replaced sizes template literal with plain string, and updated text-wrapping classes.
Formatting / Whitespace
many src/components/... files (src/components/Contact/..., src/components/Head/SEO.astro, src/components/Home/About/..., src/components/Nav/..., src/components/Graph/Graph.svelte, etc.)
Inserted blank lines after frontmatter delimiters, minor indentation/whitespace tweaks; no behavioral changes except stated items above.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

Poem

🐇 A nibble, a tweak, a tidy little hop,

Biome moved home and linting stops to shop,
SVGs now hum a kinder tune,
ThemeProviders dance up in the head, by noon,
I thump my feet — this patch is ready to hop!

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 inconclusive)

Check name Status Explanation Resolution
Title check ❓ Inconclusive The title is vague and non-descriptive; while it mentions 'biome,' it doesn't convey what aspect of biome was updated or why, leaving the main point of the changeset unclear. Provide a more specific title that describes the primary change, such as 'Migrate Biome schema to local configuration' or 'Update Biome configuration and enable HTML support'.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch dependencies/biome

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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-label on the anchor overrides and downgrades the accessible link name.

aria-label on 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 image alt. Consider aligning the label with the alt text, or omitting the aria-label entirely and letting the image alt serve 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-label on an aria-hidden element 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 explicit aria-label, the rendered element has both attributes. aria-hidden="true" removes the element entirely from the accessibility tree, so any aria-label on it is ignored by screen readers.

Decide on intent:

  • Keep favicon decorative (current behaviour): remove the new aria-label additions from lines 51 and 62 — aria-hidden already handles it.
  • Expose favicon to AT: remove "aria-hidden": true from imageProps and keep (or improve) the aria-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 with role="img" and aria-labelledby for full AT coverage.

The <title> element improves accessibility, but browser/screen-reader support for SVG <title> without explicit ARIA hooks is inconsistent. Adding role="img" on the <svg> and aria-labelledby referencing the title's id provides 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: Consider aria-hidden="true" over role="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.

Comment thread src/components/Projects/ProjectCard/CardBody.astro Outdated
Comment thread src/pages/projects/index.astro Outdated
Comment thread src/pages/projects/index.astro Outdated
{
projects
.sort((a, b) => sortOrder.indexOf(a.id) - sortOrder.indexOf(b.id))
.sort((_a, _b) => sortOrder.indexOf(_a._id) - sortOrder.indexOf(_b._id))

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

_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.

Suggested change
.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.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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-label is silently dropped because imageProps already sets aria-hidden="true".

When aria-hidden="true" is present, the element is fully removed from the accessibility tree — any aria-label on 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 new aria-label attributes 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-hidden from imageProps and keep aria-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: Consider aria-hidden="true" instead of role="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 (the sr-only span 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> with role="img" and aria-labelledby for fuller screen-reader support.

<title> alone is announced inconsistently across AT/browser combos (e.g., NVDA+Firefox requires aria-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: Consider aria-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>, or aria-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.

@Trombach
Trombach force-pushed the dependencies/biome branch from 43dec22 to 14482ea Compare April 12, 2026 17:07

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

📥 Commits

Reviewing files that changed from the base of the PR and between 43dec22 and 14482ea.

📒 Files selected for processing (26)
  • .zed/settings.json
  • biome.json
  • package.json
  • src/components/AstroIcon.astro
  • src/components/Background/Blobs.astro
  • src/components/Contact/FormFields.astro
  • src/components/Contact/SendEmailResponse.astro
  • src/components/ExternalLink.astro
  • src/components/Footer/Footer.astro
  • src/components/Graph/Graph.svelte
  • src/components/Head/SEO.astro
  • src/components/Home/About/AboutText.astro
  • src/components/Home/About/MeCard/MeCard.astro
  • src/components/Home/About/MeCard/MeCardData.astro
  • src/components/Home/About/MeCard/MeCardImage.astro
  • src/components/Home/About/ProseAbout.astro
  • src/components/Home/About/Tech.astro
  • src/components/Home/About/TechGrid.astro
  • src/components/Home/Hero/Hero.astro
  • src/components/MenuButton.astro
  • src/components/Nav/NavLink.astro
  • src/components/Nav/Navbar.astro
  • src/components/Nav/NavigationMenu.astro
  • src/components/Projects/ProjectCard/ProjectCard.astro
  • src/components/Projects/ProjectPage/PageBody.astro
  • src/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

Comment on lines +51 to +52
<img aria-label={`favicon for ${href}`} {...imageProps} class="w-4 inline-block my-0 mr-1" />
<a {href} {...props} class="whitespace-normal">

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

🧩 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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependencies Pull requests that update a dependency file

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant