diff --git a/packages/react/src/Autocomplete/AutocompleteInput.tsx b/packages/react/src/Autocomplete/AutocompleteInput.tsx index d512a53e3cf..1428ed82a91 100644 --- a/packages/react/src/Autocomplete/AutocompleteInput.tsx +++ b/packages/react/src/Autocomplete/AutocompleteInput.tsx @@ -6,6 +6,7 @@ import TextInput from '../TextInput' import {useMergedRefs} from '../hooks/useMergedRefs' import type {ComponentProps} from '../utils/types' import useSafeTimeout from '../hooks/useSafeTimeout' +import {mergeProps} from '../utils/mergeProps' type InternalAutocompleteInputProps = { // eslint-disable-next-line @typescript-eslint/no-explicit-any @@ -170,22 +171,26 @@ const AutocompleteInput = React.forwardRef( return ( ) diff --git a/packages/react/src/Autocomplete/AutocompleteOverlay.tsx b/packages/react/src/Autocomplete/AutocompleteOverlay.tsx index f330153c2ba..a642f13dc69 100644 --- a/packages/react/src/Autocomplete/AutocompleteOverlay.tsx +++ b/packages/react/src/Autocomplete/AutocompleteOverlay.tsx @@ -10,6 +10,7 @@ import VisuallyHidden from '../_VisuallyHidden' import classes from './AutocompleteOverlay.module.css' import {clsx} from 'clsx' +import {mergeProps} from '../utils/mergeProps' type AutocompleteOverlayInternalProps = { /** @@ -36,6 +37,12 @@ function AutocompleteOverlay({ throw new Error('AutocompleteContext returned null values') } const overlayProps = {...oldOverlayProps, ...newOverlayProps} + const { + className: overlayClassName, + onClickOutside: consumerOnClickOutside, + onEscape: consumerOnEscape, + ...overlayRest + } = overlayProps const {inputRef, scrollContainerRef, selectedItemLength, setShowMenu, showMenu = false} = autocompleteContext const computedAnchorRef = useRef(null) @@ -62,6 +69,12 @@ function AutocompleteOverlay({ const closeOptionList = useCallback(() => { setShowMenu(false) }, [setShowMenu]) + const onClickOutside = consumerOnClickOutside + ? mergeProps({onClickOutside: closeOptionList}, {onClickOutside: consumerOnClickOutside}).onClickOutside + : closeOptionList + const onEscape = consumerOnEscape + ? mergeProps({onEscape: closeOptionList}, {onEscape: consumerOnEscape}).onEscape + : closeOptionList if (typeof window === 'undefined') { return null @@ -69,15 +82,19 @@ function AutocompleteOverlay({ return showMenu ? ( {children} diff --git a/packages/react/src/Checkbox/Checkbox.test.tsx b/packages/react/src/Checkbox/Checkbox.test.tsx index 350801edaa3..dab14224720 100644 --- a/packages/react/src/Checkbox/Checkbox.test.tsx +++ b/packages/react/src/Checkbox/Checkbox.test.tsx @@ -54,11 +54,11 @@ describe('Checkbox', () => { expect(checkbox.checked).toEqual(false) await user.click(checkbox) - expect(handleChange).toHaveBeenCalled() + expect(handleChange).toHaveBeenCalledTimes(1) expect(checkbox.checked).toEqual(true) await user.click(checkbox) - expect(handleChange).toHaveBeenCalled() + expect(handleChange).toHaveBeenCalledTimes(2) expect(checkbox.checked).toEqual(false) }) diff --git a/packages/react/src/Checkbox/Checkbox.tsx b/packages/react/src/Checkbox/Checkbox.tsx index 047a0660c02..63cf5bef9bf 100644 --- a/packages/react/src/Checkbox/Checkbox.tsx +++ b/packages/react/src/Checkbox/Checkbox.tsx @@ -15,6 +15,7 @@ import {CheckboxGroupContext} from '../CheckboxGroup/CheckboxGroupContext' import classes from './Checkbox.module.css' import sharedClasses from './shared.module.css' import type {WithSlotMarker} from '../utils/types' +import {mergeProps} from '../utils/mergeProps' export type CheckboxProps = { /** @@ -87,7 +88,6 @@ const Checkbox = React.forwardRef( const inputProps = { type: 'checkbox', disabled, - ref: appliedRef, checked: indeterminate ? false : checked, defaultChecked, required, @@ -96,7 +96,6 @@ const Checkbox = React.forwardRef( onChange: handleOnChange, value, name: value, - ...rest, } useLayoutEffect(() => { @@ -118,9 +117,10 @@ const Checkbox = React.forwardRef( } }) return ( - // @ts-expect-error inputProp needs a non nullable ref diff --git a/packages/react/src/DataTable/Table.tsx b/packages/react/src/DataTable/Table.tsx index deb39f018df..12bebb2409f 100644 --- a/packages/react/src/DataTable/Table.tsx +++ b/packages/react/src/DataTable/Table.tsx @@ -12,6 +12,7 @@ import {ScrollableRegion} from '../ScrollableRegion' import {Button} from '../internal/components/ButtonReset' import classes from './Table.module.css' import type {PolymorphicProps} from '../utils/modern-polymorphic' +import {mergeProps} from '../utils/mergeProps' // ---------------------------------------------------------------------------- // Table @@ -52,12 +53,11 @@ const Table = React.forwardRef(function Table( className={clsx('TableOverflowWrapper', classes.TableOverflowWrapper)} > @@ -108,12 +108,13 @@ export type TableHeaderProps = Omit, 'align align?: CellAlignment } -function TableHeader({align, children, ...rest}: TableHeaderProps) { +function TableHeader({align, children, className, ...rest}: TableHeaderProps) { return ( + {children} ) @@ -215,8 +220,7 @@ function TableCell({align, className, children, scope, ...rest}: TableCellProps) return ( ({ }: TableContainerProps) { const Component = as || 'div' return ( - + {children} ) @@ -354,7 +361,7 @@ export type TableSkeletonProps = React.ComponentPropsWit function TableSkeleton({cellPadding, columns, rows = 10, ...rest}: TableSkeletonProps) { const {gridTemplateColumns} = useTableLayout(columns) return ( -
+
+
{Array.isArray(columns) diff --git a/packages/react/src/Details/Details.tsx b/packages/react/src/Details/Details.tsx index f578cb222b9..7a7b5cf4846 100644 --- a/packages/react/src/Details/Details.tsx +++ b/packages/react/src/Details/Details.tsx @@ -3,6 +3,7 @@ import {warning} from '../utils/warning' import {clsx} from 'clsx' import classes from './Details.module.css' import {useMergedRefs} from '../hooks/useMergedRefs' +import {mergeProps} from '../utils/mergeProps' const Root = React.forwardRef( // eslint-disable-next-line @typescript-eslint/no-explicit-any @@ -28,9 +29,8 @@ const Root = React.forwardRef( return (
{children} @@ -52,7 +52,10 @@ export type SummaryProps = { function Summary({as, children, ...props}: SummaryProps) { const Component = as ?? 'summary' return ( - + {children} ) diff --git a/packages/react/src/FilteredActionList/FilteredActionList.tsx b/packages/react/src/FilteredActionList/FilteredActionList.tsx index e004536ca55..6514bbfa10e 100644 --- a/packages/react/src/FilteredActionList/FilteredActionList.tsx +++ b/packages/react/src/FilteredActionList/FilteredActionList.tsx @@ -23,6 +23,7 @@ import {useVirtualizer} from '@tanstack/react-virtual' import {useMergedRefs, useProvidedRefOrCreate} from '../hooks' import {useFeatureFlag} from '../FeatureFlags' import {FilteredActionListInput} from './FilteredActionListInput' +import {mergeProps} from '../utils/mergeProps' const menuScrollMargins: ScrollIntoViewOptions = {startMargin: 0, endMargin: 8} @@ -631,21 +632,26 @@ const MappedActionListItem = forwardRef | React.KeyboardEvent) => { - if (typeof onAction === 'function') - onAction(item, e as React.MouseEvent | React.KeyboardEvent) - }} - data-id={id} ref={ref} - {...rest} + {...(mergeProps( + { + role: 'option', + onSelect: (e: React.MouseEvent | React.KeyboardEvent) => { + if (typeof onAction === 'function') + onAction(item, e as React.MouseEvent | React.KeyboardEvent) + }, + 'data-id': id, + className, + }, + rest, + ) as React.ComponentProps)} > {LeadingVisual ? ( diff --git a/packages/react/src/Overlay/Overlay.tsx b/packages/react/src/Overlay/Overlay.tsx index 31ee7ebcf5d..95ea414fa99 100644 --- a/packages/react/src/Overlay/Overlay.tsx +++ b/packages/react/src/Overlay/Overlay.tsx @@ -11,6 +11,7 @@ import classes from './Overlay.module.css' import {clsx} from 'clsx' import {useFeatureFlag} from '../FeatureFlags' import type {heightMap, widthMap} from './constants' +import {mergeProps} from '../utils/mergeProps' type StyledOverlayProps = { width?: keyof typeof widthMap @@ -91,27 +92,31 @@ export const BaseOverlay = React.forwardRef( ): ReactElement => { return ( ) }, @@ -216,16 +221,20 @@ const Overlay = React.forwardRef( const overlayContent = ( ) diff --git a/packages/react/src/Pagination/Pagination.tsx b/packages/react/src/Pagination/Pagination.tsx index 48a88907063..99c9004ee3b 100644 --- a/packages/react/src/Pagination/Pagination.tsx +++ b/packages/react/src/Pagination/Pagination.tsx @@ -5,6 +5,7 @@ import type {ResponsiveValue} from '../hooks/useResponsiveValue' import {viewportRanges} from '../hooks/useResponsiveValue' import {clsx} from 'clsx' import classes from './Pagination.module.css' +import {mergeProps} from '../utils/mergeProps' const getViewportRangesToHidePages = (showPages: PaginationProps['showPages']) => { if (showPages && typeof showPages !== 'boolean') { @@ -144,10 +145,14 @@ function Pagination({ return (