Skip to content

finding(components): PageAccordionItem.icon is declared in page:accordion but never read #4721

Description

@yinlianghui

Measured while implementing #4652. Filed unassigned. Duplicate-searched (keyword +
PageAccordionItem + page:accordion + the renderer path): no open issue covers it.

The finding

The identical defect shape as #4632/#4652, in a different component. packages/components/src/renderers/layout/containers.tsx:771-776 declares a local (not exported from @object-ui/types) interface for the page:accordion layout container:

interface PageAccordionItem {
  label: any;
  icon?: string;
  collapsed?: boolean;
  children: any[];
}

PageAccordionRenderer (same file, lines ~778-838) reads item.label, item.collapsed and item.value/item.children — never item.icon. Grepping icon across the whole renderer body (ComponentRegistry.register('accordion', PageAccordionRenderer, { namespace: 'page', ... })) returns no read.

This is a different component from the one #4652 fixed: page:accordion (namespace page, a layout container registered separately, isContainer: true) vs. ui:accordion / AccordionSchema.items: AccordionItem[] (namespace ui, the disclosure primitive packages/types/src/disclosure.ts declares). Different file, different interface, different registration — out of #4652's declared file surface, so not folded into that PR under the bounded in-place exemption (AGENTS.md-equivalent dispatch discipline: same defect class, different file/claim).

Impact

Dormant, same shape as the sibling findings: an author who declares icon on a page:accordion panel gets a correctly rendered accordion panel with the icon silently dropped. Nothing goes red.

Unmeasured here: whether any catalog entry, docs page, or example app authors icon on a page:accordion item — that sweep is part of taking this card, and decides enforce-or-remove per the established family framing (#4632/#4652).

Options

Enforce-or-remove, decided by measured pull (the #4632/#4652 ruling's framing):

  1. Wire icon — render it alongside item.labelStr in the trigger.
  2. Retire the declaration if the sweep shows no pull.

Related: #4632, #4652, #4631 (three/four-surface reconciliation instrument — here there is no Zod mirror since PageAccordionItem is a page-container-local interface, not a @object-ui/types export, so this may be a two-surface case: local interface + renderer).

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions