Summary
RemixIconButton/FortalIconButton exposes the same accessible name on two semantics nodes.
Found while validating #80 at b16636b017f3c8832d8f27f316cc24c0ad92ce8a.
Evidence
RemixIconButton.build assigns the label twice:
semanticLabel on the outer NakedButton;
- the same
label on a nested Semantics/MergeSemantics.
Minimal reproduction:
testWidgets('icon button has one accessible name', (tester) async {
await tester.pumpRemixApp(
FortalIconButton(
icon: Icons.refresh,
semanticLabel: 'Refresh',
onPressed: () {},
),
);
expect(find.bySemanticsLabel('Refresh'), findsOneWidget);
// Actual: 2 matching semantics nodes.
});
A FortalButton(label: 'Save', semanticLabel: 'Save') under the same harness produces one match, so this is not a general NakedButton problem.
Expected
One focusable, actionable button node owns the accessible name, enabled/loading state, hint, and tap action.
Suggested direction
Make the outer NakedButton the single semantic owner. Merge loading/live-region information onto that contract without adding a second labelled descendant. If the inner surface needs semantics for another reason, exclude its duplicate name.
Acceptance criteria
Ownership
The duplicate is introduced by Remix composition after NakedButton; Naked UI does not need a change for this issue.
Summary
RemixIconButton/FortalIconButtonexposes the same accessible name on two semantics nodes.Found while validating #80 at
b16636b017f3c8832d8f27f316cc24c0ad92ce8a.Evidence
RemixIconButton.buildassigns the label twice:semanticLabelon the outerNakedButton;labelon a nestedSemantics/MergeSemantics.Minimal reproduction:
A
FortalButton(label: 'Save', semanticLabel: 'Save')under the same harness produces one match, so this is not a generalNakedButtonproblem.Expected
One focusable, actionable button node owns the accessible name, enabled/loading state, hint, and tap action.
Suggested direction
Make the outer
NakedButtonthe single semantic owner. Merge loading/live-region information onto that contract without adding a second labelled descendant. If the inner surface needs semantics for another reason, exclude its duplicate name.Acceptance criteria
semanticHint,excludeSemantics, focus, and long-press behavior remain covered.Ownership
The duplicate is introduced by Remix composition after
NakedButton; Naked UI does not need a change for this issue.