From 843bf2aa35b8a0addc91b618a72b1eacd64d4011 Mon Sep 17 00:00:00 2001 From: Loengry Date: Thu, 18 Sep 2025 10:49:48 -0600 Subject: [PATCH 1/2] feat(datatable): keyboard support header and checkbox. PLAT-951 --- .../Datatable/Table/components/TableCheckbox.tsx | 1 + .../_internal/BaseTable/BaseTable.styles.tsx | 5 +++++ src/components/_internal/BaseTable/Head/Head.tsx | 16 ++++++++++++++++ 3 files changed, 22 insertions(+) diff --git a/src/components/Datatable/Table/components/TableCheckbox.tsx b/src/components/Datatable/Table/components/TableCheckbox.tsx index dd50a48fa..aea133c8b 100644 --- a/src/components/Datatable/Table/components/TableCheckbox.tsx +++ b/src/components/Datatable/Table/components/TableCheckbox.tsx @@ -41,6 +41,7 @@ const TableCheckbox = forwardRef( disabled={isDisabled} id={checkboxId} name={name} + tabIndex={0} type="checkbox" {...props} /> diff --git a/src/components/_internal/BaseTable/BaseTable.styles.tsx b/src/components/_internal/BaseTable/BaseTable.styles.tsx index c1ddc3c1c..49493841c 100644 --- a/src/components/_internal/BaseTable/BaseTable.styles.tsx +++ b/src/components/_internal/BaseTable/BaseTable.styles.tsx @@ -161,6 +161,11 @@ export const StyledBaseTable = styled.table` display: block; } } + + &:focus-visible + .ds-table-checkbox-mark { + outline: 3px solid var(--sscds-focus-indicator-color); + outline-offset: 1px; + } } .ds-table-checkbox-mark { diff --git a/src/components/_internal/BaseTable/Head/Head.tsx b/src/components/_internal/BaseTable/Head/Head.tsx index 13944135f..8874c9cb6 100644 --- a/src/components/_internal/BaseTable/Head/Head.tsx +++ b/src/components/_internal/BaseTable/Head/Head.tsx @@ -21,6 +21,12 @@ const StyledTh = styled.th<{ sticky?: string }>` ${makeStickyColumn}; + &[data-focus-visible='true']:focus-visible { + outline: 3px solid var(--sscds-focus-indicator-color); + outline-offset: -3px; + box-shadow: none; + } + ${({ sticky }) => sticky === 'left' && css` @@ -50,6 +56,16 @@ function Head>({ ...column.getSortByToggleProps({ ...column.getSortByToggleProps(), title: column.canSort ? `Sort ${column.Header}` : undefined, + ...(column.canSort && { + tabIndex: 0, + 'data-focus-visible': true, + onKeyDown: (event: React.KeyboardEvent) => { + if (event.key === 'Enter' || event.key === ' ') { + event.preventDefault(); + column.toggleSortBy(); + } + }, + }), }), ...shrinkIfSticky(column.sticky), }); From c7177055d5bed98a6448eacd2eeda0309ab1d98a Mon Sep 17 00:00:00 2001 From: Loengry Date: Thu, 18 Sep 2025 11:13:52 -0600 Subject: [PATCH 2/2] feat(focusTrap): add missing return. PLAT-951 --- src/components/FocusTrap/useFocusTrap.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/FocusTrap/useFocusTrap.ts b/src/components/FocusTrap/useFocusTrap.ts index 0eddaabf1..12daefd7d 100644 --- a/src/components/FocusTrap/useFocusTrap.ts +++ b/src/components/FocusTrap/useFocusTrap.ts @@ -113,6 +113,7 @@ const useFocusTrap = ({ event.preventDefault(); lastElement.focus(); } + return; } // Tab: going forwards