#6329·astryx

[Markdown] Task list checkboxes have generic accessible name "Checkbox"

Author: yosefadiCreated Sep 15, 2026Updated Sep 15, 2026

Describe the bug

Markdown renders task lists via CheckboxList/CheckboxListItem, but every checkbox's accessible name is the generic string "Checkbox" instead of the item's text.

Repro (0.5.2, 0.6.1 same):

typescript
import { Markdown } from "@astryxdesign/core/Markdown";

<Markdown>{"- [ ] first task\n- [x] second task"}</Markdown>

Inspect the two input[type="checkbox"] elements. Each has an associated <label> whose text is "Checkbox" (the fallback t('@astryx.checkboxList.item.checkbox')), not "first task" / "second task". Screen readers announce "Checkbox, not checked" twice.

CheckboxListItem already documents that a rich label requires aria-label:

A string label names the checkbox automatically. A rich (ReactNode) label cannot, so pass a concise string equivalent via the standard aria-label — otherwise the checkbox falls back to the generic name "Checkbox" and every rich-label item in a list announces identically to screen readers.

Markdown builds rich labels (inline markdown) without passing aria-label, so it always hits the fallback.

Expected: each checkbox's accessible name equals the item's text (e.g. "first task"), derived as plain text from the item's markdown, while the visible label keeps rich formatting (bold/links).

Suggested fix: in packages/core/src/Markdown/Markdown.tsx list rendering, pass aria-label={plainText(itemText)} to CheckboxListItem when label is a ReactNode. The dev warning in CheckboxListItem already flags this pattern — the fix is ~5 lines and has no visual change.

Context: found while building a read-path workaround in a consumer app. The app now works around it locally by splitting task blocks and setting aria-label itself, but it would be better fixed upstream. Happy to open a PR (aria-label only — mixed-list rendering is a separate issue).