From e517a32125ada63720800cec5934621480e337ca Mon Sep 17 00:00:00 2001 From: Kamil Emeleev Date: Wed, 4 Mar 2026 20:40:34 +0300 Subject: [PATCH 1/5] feat(Table): draft sort icon hover behavior --- .../TableColumnHeader.module.css | 10 ++++++++++ .../TableColumnHeader/TableColumnHeader.tsx | 17 +++++++++++++---- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/packages/components/src/components/Table/components/TableColumnHeader/TableColumnHeader.module.css b/packages/components/src/components/Table/components/TableColumnHeader/TableColumnHeader.module.css index d61424db..985aa5f2 100644 --- a/packages/components/src/components/Table/components/TableColumnHeader/TableColumnHeader.module.css +++ b/packages/components/src/components/Table/components/TableColumnHeader/TableColumnHeader.module.css @@ -97,6 +97,7 @@ .sortIcon { display: flex; visibility: hidden; + opacity: 1; &.active { visibility: visible; @@ -111,3 +112,12 @@ margin: auto; } } + +.sortable:where(.hovered, .focusVisible) .sortIcon { + visibility: visible; + opacity: 1; +} + +.sortable:where(.hovered, .focusVisible) .sortIcon:not(.active) { + opacity: 0.4; +} diff --git a/packages/components/src/components/Table/components/TableColumnHeader/TableColumnHeader.tsx b/packages/components/src/components/Table/components/TableColumnHeader/TableColumnHeader.tsx index a1ba5822..cf24967d 100644 --- a/packages/components/src/components/Table/components/TableColumnHeader/TableColumnHeader.tsx +++ b/packages/components/src/components/Table/components/TableColumnHeader/TableColumnHeader.tsx @@ -2,7 +2,7 @@ import { useRef } from 'react'; -import { useFocusRing, mergeProps, clsx } from '@koobiq/react-core'; +import { useFocusRing, mergeProps, useHover, clsx } from '@koobiq/react-core'; import { IconChevronUpS16, IconChevronDownS16 } from '@koobiq/react-icons'; import type { TableState, @@ -58,15 +58,23 @@ export function TableColumnHeader({ }: ColumnProps = column.props; const { isFocusVisible, focusProps } = useFocusRing(); + const { isHovered, hoverProps } = useHover({ isDisabled: !allowsSorting }); const isActive = state.sortDescriptor?.column === column.key; const direction = isActive ? state.sortDescriptor?.direction : undefined; + const isPreview = !isActive && (isHovered || isFocusVisible); + const iconDirection = isPreview ? 'ascending' : direction; const defaultIcon = - direction === 'ascending' ? : ; + iconDirection === 'ascending' ? ( + + ) : ( + + ); - const iconToRender = renderSortIcon?.({ direction, isActive }) ?? defaultIcon; + const iconToRender = + renderSortIcon?.({ direction: iconDirection, isActive }) ?? defaultIcon; const columnSortIcon = allowsSorting && (