Skip to content

fix(tabs): ensure tablist is keyboard reachable when no active tab is defined#2072

Open
akashsonune wants to merge 19 commits into
mainfrom
fix/a11y-tabs-keyboard-entry-without-active-tab
Open

fix(tabs): ensure tablist is keyboard reachable when no active tab is defined#2072
akashsonune wants to merge 19 commits into
mainfrom
fix/a11y-tabs-keyboard-entry-without-active-tab

Conversation

@akashsonune
Copy link
Copy Markdown
Member

@akashsonune akashsonune commented May 15, 2026

Tablist is not reachable when there is no active tab


Documentation.
Examples.
Dashboards Demo.
Playwright report.

Coverage Reports:

Code Coverage

chintankavathia and others added 18 commits May 12, 2026 13:36
…kerConfig

BREAKING CHANGE: `CriterionDefinition.datepickerConfig` type narrowed

The type of `datepickerConfig` in `CriterionDefinition` (filtered-search) changed from `DatepickerInputConfig` to `Omit<DatepickerInputConfig, 'enableDateRange' | 'enableTwoMonthDateRange'>`.

The properties `enableDateRange` and `enableTwoMonthDateRange ` are no longer accepted in `datepickerConfig` when used with filtered-search criteria, as they had no effect in that context.

Migration: Remove any `enableDateRange` and `enableTwoMonthDateRange` properties from your `datepickerConfig` objects passed to `CriterionDefinition`.
Adding a set of utilities that allows customers
to create selects with custom backed value selection,
for instance using `si-tree-view`.

A very simple version of it can look like this:

```ts
@component({
  selector: 'app-tree-select',
  imports: [SiSelectComboboxComponent, SiSelectDropdownDirective, SiTreeViewComponent],
  template: `
    <si-select-combobox>
      @if (select.value(); as val) {
        {{ val }}
      } @else {
        <span class="text-secondary">Select a location...</span>
      }
    </si-select-combobox>

    <ng-template si-select-dropdown>
      <si-tree-view
        class="d-block"
        ariaLabel="Locations"
        [items]="items()"
        [enableSelection]="true"
        [singleSelectMode]="true"
        [isVirtualized]="false"
        (treeItemClicked)="selectItem($event)"
      />
    </ng-template>
  `,
  changeDetection: ChangeDetectionStrategy.OnPush,
  hostDirectives: [
    {
      directive: SiCustomSelectDirective,
      inputs: ['disabled', 'readonly', 'value'],
      outputs: ['valueChange']
    }
  ]
})
export class TreeSelectComponent {
  protected readonly select = inject(SiCustomSelectDirective);

  /** The tree items to display. */
  readonly items = input<TreeItem[]>([]);

  selectItem(item: TreeItem): void {
    if (item.label) {
      this.select.updateValue(item.label as string);
      this.select.close();
    }
  }
}
```

The goal is to empower applications
to build selects with whatever content they need
while we take care of accesibility and proper appereance.

Closes #1840
chore(demo): wrap thead th elements in tr for proper table styling
@akashsonune akashsonune changed the title fix(tabs): ensure tablist is keyboard reachable when no active tab is… fix(tabs): ensure tablist is keyboard reachable when no active tab is defined May 15, 2026
@akashsonune akashsonune marked this pull request as ready for review May 15, 2026 14:59
@akashsonune akashsonune requested review from a team as code owners May 15, 2026 14:59
Copy link
Copy Markdown
Contributor

@gemini-code-assist gemini-code-assist Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request introduces a tabindexValue computed signal to manage the tabindex attribute within the SiTabBaseDirective. The review identifies that using a computed signal for this logic is problematic because it depends on a non-signal property from the focus key manager, which will not trigger necessary updates during keyboard navigation. Furthermore, the current implementation may result in multiple tabs having a zero tabindex. The feedback recommends replacing the signal with a method to ensure proper re-evaluation and correct roving tabindex behavior.

Comment thread projects/element-ng/tabs/si-tab-base.directive.ts Outdated
@akashsonune
Copy link
Copy Markdown
Member Author

akashsonune commented May 15, 2026

@panch1739 @dr-itz WDYT?

Alternatively as per- https://www.w3.org/WAI/ARIA/apg/patterns/tabs/ there should be at least one tab active. In that case, we can make the first non disabled tab as active if no active tab is provided. Shall we do this instead?

@akashsonune akashsonune force-pushed the fix/a11y-tabs-keyboard-entry-without-active-tab branch from 15a5ae0 to 05e7c36 Compare May 15, 2026 15:07
Copy link
Copy Markdown
Member

@chintankavathia chintankavathia left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@akashsonune please rebase

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants