What happened
List from @astryxdesign/core accepts aria-label at the type level and drops it at runtime, so six lists across the desktop app ship with no accessible name. A screen reader announces them as "list, N items" with nothing identifying what the list holds.
The type contract says the prop is supported. ListProps extends BaseProps<HTMLUListElement | HTMLOListElement>, and BaseProps documents itself as keeping aria-* (node_modules/@astryxdesign/core/src/BaseProps.ts). TypeScript therefore accepts aria-label on every call site.
The implementation never reads it. List destructures a fixed set of props with no rest element and spreads nothing onto the root, so the ul carries only role="list" and — when a header is passed — aria-labelledby:
// node_modules/@astryxdesign/core/dist/List/List.js
"aria-labelledby": header != null ? headerId : undefined,
...
role: "list",
Source and compiled output agree; there is no rest spread in either.
Affected call sites
packages/ui/src/plan-reminder-panel.tsx:468 — the 计划提醒 task list (copy.page.listAriaLabel)
packages/ui/src/plan-reminder-panel.tsx:516 — the run-history list (copy.page.runsAriaLabel)
apps/desktop/src/renderer/settings/about-settings-page.tsx:160 — the privacy list (copy.privacyLabel)
apps/desktop/src/renderer/settings/permission-center-page.tsx:210 — the OS permission list (copy.osListAria)
apps/desktop/src/renderer/settings/permission-center-page.tsx:457 — the per-capability guidance list (copy.guidanceAria)
apps/desktop/src/renderer/settings/permission-center-page.tsx:486 — the per-capability audit list (copy.auditAria)
Every one of those copy strings is dead. Four of them predate #2155, so this is not a regression from the 计划提醒 rebuild — it is a seam that has been quietly swallowing names for a while.
How to reproduce
- Run the desktop app and open Settings → 权限中心.
- Inspect the permission list's
ul in DevTools, or run document.querySelectorAll('ul[role=list]') and read getAttribute('aria-label').
- The attribute is absent, though
permission-center-page.tsx:210 passes aria-label={copy.osListAria}.
The same check on the 计划提醒 page's .maka-module-page-rows list shows the same result.
Suggested fix
Patch the vendored component rather than reworking six call sites. patches/@astryxdesign+core+0.2.0.patch already carries a FieldLabel change, so the seam exists: let List forward aria-label (or accept a rest spread) onto the root element.
The alternative — using List's own header prop, which wires aria-labelledby — is the design system's intended naming mechanism, but it renders a visible heading. All six of these lists already sit under a page title, a tab, or a section heading, so a second visible label would be redundant. Making the documented aria-label prop actually work is the smaller change and matches what the type already promises.
Environment
- Maka commit:
076e653ff
- OS: macOS (Darwin 25.5.0)
- Surface: Desktop
@astryxdesign/core 0.2.0
What happened
Listfrom@astryxdesign/coreacceptsaria-labelat the type level and drops it at runtime, so six lists across the desktop app ship with no accessible name. A screen reader announces them as "list, N items" with nothing identifying what the list holds.The type contract says the prop is supported.
ListProps extends BaseProps<HTMLUListElement | HTMLOListElement>, andBasePropsdocuments itself as keepingaria-*(node_modules/@astryxdesign/core/src/BaseProps.ts). TypeScript therefore acceptsaria-labelon every call site.The implementation never reads it.
Listdestructures a fixed set of props with no rest element and spreads nothing onto the root, so theulcarries onlyrole="list"and — when aheaderis passed —aria-labelledby:Source and compiled output agree; there is no rest spread in either.
Affected call sites
packages/ui/src/plan-reminder-panel.tsx:468— the 计划提醒 task list (copy.page.listAriaLabel)packages/ui/src/plan-reminder-panel.tsx:516— the run-history list (copy.page.runsAriaLabel)apps/desktop/src/renderer/settings/about-settings-page.tsx:160— the privacy list (copy.privacyLabel)apps/desktop/src/renderer/settings/permission-center-page.tsx:210— the OS permission list (copy.osListAria)apps/desktop/src/renderer/settings/permission-center-page.tsx:457— the per-capability guidance list (copy.guidanceAria)apps/desktop/src/renderer/settings/permission-center-page.tsx:486— the per-capability audit list (copy.auditAria)Every one of those copy strings is dead. Four of them predate #2155, so this is not a regression from the 计划提醒 rebuild — it is a seam that has been quietly swallowing names for a while.
How to reproduce
ulin DevTools, or rundocument.querySelectorAll('ul[role=list]')and readgetAttribute('aria-label').permission-center-page.tsx:210passesaria-label={copy.osListAria}.The same check on the 计划提醒 page's
.maka-module-page-rowslist shows the same result.Suggested fix
Patch the vendored component rather than reworking six call sites.
patches/@astryxdesign+core+0.2.0.patchalready carries aFieldLabelchange, so the seam exists: letListforwardaria-label(or accept a rest spread) onto the root element.The alternative — using
List's ownheaderprop, which wiresaria-labelledby— is the design system's intended naming mechanism, but it renders a visible heading. All six of these lists already sit under a page title, a tab, or a section heading, so a second visible label would be redundant. Making the documentedaria-labelprop actually work is the smaller change and matches what the type already promises.Environment
076e653ff@astryxdesign/core0.2.0