Skip to content

Commit d361288

Browse files
committed
fix: address a few small a11y issues
1 parent fe1dd9f commit d361288

4 files changed

Lines changed: 24 additions & 9 deletions

File tree

app/components/AppFooter.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
</a>
1818
</div>
1919
</div>
20-
<p class="text-xs text-fg-subtle/60 text-center sm:text-left m-0">
20+
<p class="text-xs text-fg-muted text-center sm:text-left m-0">
2121
npm is a registered trademark of npm, Inc. This site is not affiliated with npm, Inc.
2222
</p>
2323
</div>

app/pages/[...package].vue

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -415,7 +415,7 @@ defineOgImageComponent('Package', {
415415
:href="`https://npm.chart.dev/${pkg.name}`"
416416
target="_blank"
417417
rel="noopener noreferrer"
418-
class="text-fg-subtle hover:text-fg transition-colors duration-200"
418+
class="text-fg-subtle hover:text-fg transition-colors duration-200 inline-flex items-center justify-center min-w-6 min-h-6 -m-1 p-1"
419419
title="View download trends"
420420
>
421421
<span class="i-carbon-chart-line w-3.5 h-3.5 inline-block" aria-hidden="true" />
@@ -433,7 +433,7 @@ defineOgImageComponent('Package', {
433433
:href="`https://npmgraph.js.org/?q=${pkg.name}`"
434434
target="_blank"
435435
rel="noopener noreferrer"
436-
class="text-fg-subtle hover:text-fg transition-colors duration-200"
436+
class="text-fg-subtle hover:text-fg transition-colors duration-200 inline-flex items-center justify-center min-w-6 min-h-6 -m-1 p-1"
437437
title="View dependency graph"
438438
>
439439
<span class="i-carbon-network-3 w-3.5 h-3.5 inline-block" aria-hidden="true" />
@@ -445,7 +445,7 @@ defineOgImageComponent('Package', {
445445
:href="`https://node-modules.dev/grid/depth#install=${pkg.name}${displayVersion?.version ? `@${displayVersion.version}` : ''}`"
446446
target="_blank"
447447
rel="noopener noreferrer"
448-
class="text-fg-subtle hover:text-fg transition-colors duration-200"
448+
class="text-fg-subtle hover:text-fg transition-colors duration-200 inline-flex items-center justify-center min-w-6 min-h-6 -m-1 p-1"
449449
title="Inspect dependency tree on node-modules.dev"
450450
>
451451
<span

server/api/registry/readme/[...pkg].get.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ export default defineCachedEventHandler(
9696
swr: true,
9797
getKey: event => {
9898
const pkg = getRouterParam(event, 'pkg') ?? ''
99-
return `readme:v3:${pkg.replace(/\/+$/, '').trim()}`
99+
return `readme:v4:${pkg.replace(/\/+$/, '').trim()}`
100100
},
101101
},
102102
)

server/utils/readme.ts

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -239,12 +239,27 @@ export async function renderReadmeHtml(
239239
const collectedLinks: PlaygroundLink[] = []
240240
const seenUrls = new Set<string>()
241241

242-
// Shift heading levels down by 2 for semantic correctness
242+
// Track heading hierarchy to ensure sequential order for accessibility
243243
// Page h1 = package name, h2 = "Readme" section heading
244-
// So README h1 → h3, h2 → h4, etc. (capped at h6)
245-
// But keep visual styling via data-level attribute
244+
// So README starts at h3, and we ensure no levels are skipped
245+
// Visual styling preserved via data-level attribute (original depth)
246+
let lastSemanticLevel = 2 // Start after h2 (the "Readme" section heading)
246247
renderer.heading = function ({ tokens, depth }: Tokens.Heading) {
247-
const semanticLevel = Math.min(depth + 2, 6)
248+
// Calculate the target semantic level based on document structure
249+
// Start at h3 (since page h1 + section h2 already exist)
250+
// But ensure we never skip levels - can only go down by 1 or stay same/go up
251+
let semanticLevel: number
252+
if (depth === 1) {
253+
// README h1 always becomes h3
254+
semanticLevel = 3
255+
} else {
256+
// For deeper levels, ensure sequential order
257+
// Don't allow jumping more than 1 level deeper than previous
258+
const maxAllowed = Math.min(lastSemanticLevel + 1, 6)
259+
semanticLevel = Math.min(depth + 2, maxAllowed)
260+
}
261+
262+
lastSemanticLevel = semanticLevel
248263
const text = this.parser.parseInline(tokens)
249264
return `<h${semanticLevel} data-level="${depth}">${text}</h${semanticLevel}>\n`
250265
}

0 commit comments

Comments
 (0)