Skip to content

fix(ui): Astryx List silently drops aria-label, leaving six lists unnamed #2189

Description

@Astro-Han

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

  1. Run the desktop app and open Settings → 权限中心.
  2. Inspect the permission list's ul in DevTools, or run document.querySelectorAll('ul[role=list]') and read getAttribute('aria-label').
  3. 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

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions