From ca5bcc708598d69270a8645c2fa6a00dc0c9397b Mon Sep 17 00:00:00 2001 From: Kyzyl-ool Kezhik Date: Mon, 4 Sep 2023 12:25:17 +0300 Subject: [PATCH] feat(Popover): accept function as a children (#900) Co-authored-by: kkmch --- src/components/Link/Link.scss | 1 - .../Popover/__stories__/Popover.stories.tsx | 55 +++++++++++-------- .../Popover/components/Trigger/Trigger.tsx | 15 +++-- src/components/constants.ts | 1 + src/components/utils/useActionHandlers.ts | 7 ++- 5 files changed, 49 insertions(+), 30 deletions(-) diff --git a/src/components/Link/Link.scss b/src/components/Link/Link.scss index 3663faa56..cc5215f59 100644 --- a/src/components/Link/Link.scss +++ b/src/components/Link/Link.scss @@ -12,7 +12,6 @@ $block: '.#{variables.$ns}link'; &:focus { outline: 2px solid var(--g-color-line-focus); } - &:focus:not(:focus-visible) { outline: 0; } diff --git a/src/components/Popover/__stories__/Popover.stories.tsx b/src/components/Popover/__stories__/Popover.stories.tsx index aefc018eb..2e5d3a384 100644 --- a/src/components/Popover/__stories__/Popover.stories.tsx +++ b/src/components/Popover/__stories__/Popover.stories.tsx @@ -206,27 +206,31 @@ WithCustomAnchor.args = { content: 'Popover content', }; +const tooltipId = 'tooltipId'; +const popoverId = 'popoverId'; + const AccessibleTemplate: StoryFn = () => { - const [openTooltip, setOpenTooltip] = React.useState(false); const [openPopover, setOpenPopover] = React.useState(false); const ref = React.useRef(null); return (
- - + + {({onClick}) => ( + + )} = () => { }} autoclosable={false} openOnHover={false} - focusTrap={true} + focusTrap // eslint-disable-next-line jsx-a11y/no-autofocus - autoFocus={true} + autoFocus restoreFocusRef={ref} > - + {({onClick}) => ( + + )}
); diff --git a/src/components/Popover/components/Trigger/Trigger.tsx b/src/components/Popover/components/Trigger/Trigger.tsx index 4ce98bc06..f66f5607e 100644 --- a/src/components/Popover/components/Trigger/Trigger.tsx +++ b/src/components/Popover/components/Trigger/Trigger.tsx @@ -2,7 +2,12 @@ import React from 'react'; import {useActionHandlers} from '../../../utils/useActionHandlers'; -export type TriggerProps = { +interface TriggerArgs { + onClick: React.MouseEventHandler; + onKeyDown: React.KeyboardEventHandler; +} + +export interface TriggerProps { /** * Tooltip's opened state */ @@ -34,8 +39,8 @@ export type TriggerProps = { /** * Tooltip's trigger content */ - children?: React.ReactNode; -}; + children?: React.ReactNode | ((triggerArgs: TriggerArgs) => React.ReactNode); +} export const Trigger = ({ open, @@ -75,7 +80,9 @@ export const Trigger = ({ const {onKeyDown} = useActionHandlers(handleClick); - return ( + return typeof children === 'function' ? ( + {children({onClick: handleClick, onKeyDown})} + ) : ( // The event handler should only be used to capture bubbled events // eslint-disable-next-line jsx-a11y/no-static-element-interactions
any; @@ -15,7 +17,10 @@ interface UseActionHandlersResult { export function useActionHandlers(callback?: AnyFunction): UseActionHandlersResult { const onKeyDown = React.useCallback( (event: React.KeyboardEvent) => { - if (callback && ['Enter', ' ', 'Spacebar'].includes(event.key)) { + if ( + callback && + [KeyCode.ENTER, KeyCode.SPACEBAR, KeyCode.SPACEBAR_OLD].includes(event.key) + ) { callback(event); } },