@entur/tooltip 4.0.0-beta.0 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"tooltip.cjs.development.js","sources":["../src/Tooltip.tsx","../src/Popover.tsx","../src/index.tsx"],"sourcesContent":["import React, { cloneElement, useRef, useState } from 'react';\n\nimport classNames from 'classnames';\nimport {\n useFloating,\n autoUpdate,\n offset,\n flip,\n shift,\n Placement as FloatingUIPlacement,\n arrow,\n limitShift,\n} from '@floating-ui/react-dom';\n\nimport { useRandomId } from '@entur/utils';\nimport { CloseIcon } from '@entur/icons';\nimport { IconButton } from '@entur/button';\nimport { space, borderRadiuses } from '@entur/tokens';\n\nimport './Tooltip.scss';\n\ntype Modifier = {\n name: string;\n enabled?: boolean;\n requires?: Array<string>;\n requiresIfExists?: Array<string>;\n options?: Record<string, unknown>;\n data?: Record<string, unknown>;\n [key: string]: any;\n};\n\nexport type Placement =\n | 'top'\n | 'top-left'\n | 'top-start'\n | 'top-right'\n | 'top-end'\n | 'left'\n | 'right'\n | 'bottom-left'\n | 'bottom-start'\n | 'bottom'\n | 'bottom-right'\n | 'bottom-end';\n\ntype ChildEventListner = {\n 'aria-describedby'?: string;\n onFocus?: () => void;\n onBlur?: () => void;\n onMouseEnter?: (e: React.MouseEvent) => void;\n onMouseLeave?: () => void;\n onKeyDown?: (e: React.KeyboardEvent) => void;\n onKeyUp?: (e: React.KeyboardEvent) => void;\n onClick?: (e: React.MouseEvent) => void;\n};\n\n/** @deprecated use variant=\"negative\" instead */\nconst error = 'error';\n\nexport type TooltipProps = {\n /** Plassering av tooltip-en */\n placement: Placement;\n /** Innholdet i tooltip-boksen */\n content: React.ReactNode;\n /** Elementet som skal ha tooltip-funksjonalitet */\n children: React.ReactElement;\n /** Om tooltip-en skal vises */\n isOpen?: boolean;\n /** Ekstra klassenavn for tooltip */\n className?: string;\n /** Åpner ikke tooltip ved hover-events\n * @default false\n */\n disableHoverListener?: boolean;\n /** Åpner ikke tooltip ved focus-events\n * @default false\n */\n disableFocusListener?: boolean;\n disableKeyboardListener?: boolean;\n disableClickListner?: boolean;\n /** Viser en lukkeknapp om man kontrollerer åpningen av Tooltip vha `isOpen`\n * @default true\n */\n showCloseButton?: boolean;\n /** Valideringsvariant for Tooltip */\n variant?: 'negative' | typeof error;\n /** @deprecated Ikke lenger støttet. Meld fra på #talk-designsystem hvis du trenger støtte for\n * overskrivinger av plasseringen til Tooltip!\n */\n popperModifiers?: Modifier[];\n [key: string]: any;\n};\n\nexport const Tooltip: React.FC<TooltipProps> = ({\n placement,\n content,\n children,\n className,\n isOpen = false,\n disableHoverListener = false,\n disableFocusListener = false,\n disableKeyboardListener = true,\n disableClickListner = true,\n showCloseButton = true,\n variant,\n style,\n ...rest\n}) => {\n const [showTooltip, setShowTooltip] = useState(isOpen);\n const tooltipArrowRef = useRef(null);\n const tooltipId = useRandomId('eds-tooltip');\n let hoverOpenTimer: ReturnType<typeof setTimeout>;\n let hoverCloseTimer: ReturnType<typeof setTimeout>;\n\n // calculations for floating-UI tooltip position\n const {\n refs,\n floatingStyles,\n middlewareData,\n placement: actualPlacement,\n } = useFloating({\n whileElementsMounted: (ref, float, update) =>\n autoUpdate(ref, float, update),\n placement: standardisePlacement(placement),\n middleware: [\n offset(space.extraSmall),\n flip(),\n shift({ padding: space.extraSmall, limiter: limitShift({ offset: 8 }) }),\n arrow({\n element: tooltipArrowRef,\n padding: borderRadiuses.medium,\n }),\n ],\n });\n\n const onMouseEnter = () => {\n clearTimeout(hoverCloseTimer);\n hoverOpenTimer = setTimeout(() => {\n setShowTooltip(true);\n }, 150);\n };\n\n const onMouseLeave = () => {\n clearTimeout(hoverOpenTimer);\n hoverCloseTimer = setTimeout(() => {\n setShowTooltip(false);\n }, 300);\n };\n\n React.useEffect(() => {\n return () => {\n clearTimeout(hoverOpenTimer);\n clearTimeout(hoverCloseTimer);\n };\n }, []);\n React.useEffect(() => {\n console.log(actualPlacement);\n }, [actualPlacement]);\n\n const referenceListenerProps: ChildEventListner = {\n 'aria-describedby': showTooltip ? tooltipId : undefined,\n // focusListner\n ...(!disableFocusListener && { onFocus: () => setShowTooltip(true) }),\n ...(!disableFocusListener && { onBlur: () => setShowTooltip(false) }),\n // hoverListner\n ...(!disableHoverListener && { onMouseEnter }),\n ...(!disableHoverListener && { onMouseLeave }),\n // keyboardListner\n ...(!disableKeyboardListener && {\n onKeyDown: e => {\n if (e.key === 'Escape') setShowTooltip(false);\n if (e.key === ' ' || e.key === 'Enter') {\n e.preventDefault();\n setShowTooltip(!showTooltip);\n }\n },\n }),\n // clickListner\n ...(!disableClickListner && {\n onClick: () => setShowTooltip(!showTooltip),\n }),\n };\n\n return (\n <>\n {cloneElement(children, {\n ref: refs.setReference,\n ...referenceListenerProps,\n })}\n <div\n className={classNames(className, 'eds-tooltip', {\n 'eds-tooltip--negative': variant === error || variant === 'negative',\n })}\n ref={refs.setFloating}\n style={{\n ...floatingStyles,\n display: showTooltip && content ? undefined : 'none',\n ...style,\n }}\n role=\"tooltip\"\n id={tooltipId}\n onMouseEnter={!disableHoverListener ? onMouseEnter : undefined}\n onMouseLeave={!disableHoverListener ? onMouseLeave : undefined}\n {...rest}\n >\n {content}\n {isOpen && showCloseButton && (\n <IconButton\n className=\"eds-tooltip__close-button\"\n onClick={() => setShowTooltip(false)}\n type=\"button\"\n aria-label=\"Lukk tooltip\"\n >\n <CloseIcon aria-hidden=\"true\" />\n </IconButton>\n )}\n <div\n className={`eds-tooltip__arrow--${actualPlacement?.split('-')?.[0]}`}\n ref={tooltipArrowRef}\n style={{\n left: middlewareData.arrow?.x,\n top: middlewareData.arrow?.y,\n }}\n />\n </div>\n </>\n );\n};\n\nfunction standardisePlacement(placement: string): FloatingUIPlacement {\n switch (placement) {\n case 'top-left':\n return 'top-start';\n case 'top-right':\n return 'top-end';\n case 'bottom-left':\n return 'bottom-start';\n case 'bottom-right':\n return 'bottom-end';\n default:\n return placement as FloatingUIPlacement;\n }\n}\n","import React, { cloneElement, createContext, useContext } from 'react';\n\nimport { usePopper } from 'react-popper';\nimport { Placement } from '@popperjs/core';\nimport classNames from 'classnames';\n\nimport { Contrast } from '@entur/layout';\nimport { useOnClickOutside } from '@entur/utils';\n\nimport './Popover.scss';\n\ntype PopoverContentCallbackProps = {\n ref: React.Ref<HTMLDivElement>;\n};\n\ntype PopoverContextProps = {\n showPopover: boolean;\n triggerElement?: React.RefObject<HTMLButtonElement>;\n contentElement: React.RefObject<HTMLDivElement>;\n styles: { [key: string]: React.CSSProperties };\n attributes: { [key: string]: { [key: string]: string } | undefined };\n closeButtonProps: Record<string, unknown>;\n popoverContentProps: (\n e: PopoverContentCallbackProps,\n ) => Record<string, unknown>;\n triggerProps: () => Record<string, unknown>;\n [key: string]: any;\n};\n\nconst PopoverContext = createContext<PopoverContextProps | undefined>(\n undefined,\n);\nconst usePopoverContext = () => {\n const context = useContext(PopoverContext);\n if (context == null) {\n throw Error('usePopoverContext must be used within <Popover/>');\n }\n return context;\n};\n\nconst useCustomState = (\n state?: boolean,\n setState?: React.Dispatch<React.SetStateAction<boolean>>,\n): [boolean, React.Dispatch<React.SetStateAction<boolean>>, boolean] => {\n const [internalState, setInternalState] = React.useState<boolean>(false);\n const controlled = state !== undefined && setState !== undefined;\n if (controlled) return [state, setState, controlled];\n return [internalState, setInternalState, controlled];\n};\n\nexport type PopoverProps = {\n /** Innholdet i Popover */\n children: React.ReactNode;\n /** Plasseringen av Popover\n * @default \"bottom-start\"\n */\n placement?: Placement;\n /** Hvis du ønsker å styre state selv kan du sende inn state her */\n showPopover?: boolean;\n /** Hvis du ønsker å styre state selv kan du sende inn setState her */\n setShowPopover?: React.Dispatch<React.SetStateAction<boolean>>;\n};\n\nexport const Popover: React.FC<PopoverProps> = ({\n children,\n placement = 'bottom-start',\n showPopover: controlledState,\n setShowPopover: setControlledState,\n}) => {\n const [showPopover, setShowPopover, controlled] = useCustomState(\n controlledState,\n setControlledState,\n );\n const triggerElement = React.useRef(null);\n const contentElement = React.useRef(null);\n\n const { styles, attributes, forceUpdate } = usePopper(\n triggerElement.current,\n contentElement.current,\n {\n modifiers: [\n { name: 'arrow', enabled: false },\n {\n name: 'offset',\n options: {\n offset: [0, 8],\n },\n },\n ],\n placement: placement,\n },\n );\n\n React.useEffect(() => {\n if (forceUpdate) {\n forceUpdate();\n }\n }, [showPopover, forceUpdate]);\n\n const triggerProps = React.useCallback(() => {\n const buttonProps = {\n 'aria-haspopup': 'dialog',\n 'aria-expanded': showPopover,\n ref: triggerElement,\n type: 'button',\n };\n const buttonOnClick = {\n onClick: (e: React.MouseEvent) => {\n e.preventDefault();\n setShowPopover(prev => !prev);\n },\n };\n return controlled ? buttonProps : { ...buttonProps, ...buttonOnClick };\n }, [triggerElement, showPopover, setShowPopover, controlled]);\n\n useOnClickOutside([contentElement, triggerElement], () =>\n setShowPopover(false),\n );\n const closeButtonProps = {\n onClick: (e: React.MouseEvent) => {\n e.preventDefault();\n setShowPopover(false);\n },\n type: 'button',\n };\n const popoverContentProps = React.useCallback(() => {\n const contentProps = {\n role: 'dialog',\n 'aria-modal': 'false',\n ref: contentElement,\n onKeyDown: (event: React.KeyboardEvent) => {\n if (event.key === 'Escape') {\n showPopover && setShowPopover(false);\n }\n },\n onBlur: (event: React.FocusEvent) => {\n const elementReceivingFocus = event.relatedTarget as HTMLElement;\n // The check for 'tabindex=-1' is a special case for focus handling in Docz\n if (\n !elementReceivingFocus ||\n elementReceivingFocus.getAttribute('tabindex') === '-1'\n )\n return;\n const focusElementIsPopover = elementContainsElement(\n contentElement.current,\n elementReceivingFocus,\n );\n const focusElementIsTrigger = elementContainsElement(\n triggerElement.current,\n elementReceivingFocus,\n );\n const isValidBlur = !focusElementIsPopover && !focusElementIsTrigger;\n if (showPopover && isValidBlur) setShowPopover(false);\n },\n };\n return contentProps;\n }, [contentElement, showPopover, setShowPopover]);\n const contextValue: PopoverContextProps = {\n showPopover,\n triggerElement,\n contentElement,\n styles,\n attributes,\n popoverContentProps,\n closeButtonProps,\n triggerProps,\n };\n return (\n <PopoverContext.Provider value={contextValue}>\n {children}\n </PopoverContext.Provider>\n );\n};\n\nexport type PopoverTriggerProps = {\n /** Knapp som skal brukes for å åpne Popover */\n children: React.ReactElement;\n};\n\nexport const PopoverTrigger: React.FC<PopoverTriggerProps> = ({ children }) => {\n const { triggerProps } = usePopoverContext();\n const child = React.Children.only(children) as React.ReactElement<any>;\n return cloneElement(child, triggerProps());\n};\n\nexport type PopoverCloseButtonProps = {\n /** En valgfri knapp som kan legges inn for å lukke Popover */\n children: React.ReactElement;\n};\n\nexport const PopoverCloseButton: React.FC<PopoverCloseButtonProps> = ({\n children,\n ...rest\n}) => {\n const { closeButtonProps } = usePopoverContext();\n return cloneElement(children, { ...closeButtonProps, ...rest });\n};\n\nexport type PopoverContentProps = {\n /**Innholdet til Popover */\n children: React.ReactNode;\n};\n\nexport const PopoverContent = React.forwardRef<\n HTMLDivElement,\n PopoverContentProps\n>(({ children }, ref: React.Ref<HTMLDivElement>) => {\n const { showPopover, attributes, styles, popoverContentProps } =\n usePopoverContext();\n const props = popoverContentProps({ ref });\n return (\n <Contrast\n className={classNames(\n 'eds-popover',\n {\n 'eds-popover--hidden': !showPopover,\n },\n 'eds-contrast',\n )}\n style={styles.popper}\n aria-hidden={!showPopover}\n {...attributes.styles}\n {...props}\n >\n {children}\n </Contrast>\n );\n});\n\nfunction elementContainsElement(\n parent: HTMLElement | null,\n child: HTMLElement,\n) {\n if (!parent) return false;\n return parent === child || parent.contains(child);\n}\n","import { warnAboutMissingStyles } from '@entur/utils';\nimport './index.scss';\n\nwarnAboutMissingStyles('tooltip');\n\nexport * from './Tooltip';\nexport * from './Popover';\n"],"names":["error","Tooltip","placement","content","children","className","isOpen","disableHoverListener","disableFocusListener","disableKeyboardListener","disableClickListner","showCloseButton","variant","style","rest","_excluded","useState","showTooltip","setShowTooltip","tooltipArrowRef","useRef","tooltipId","useRandomId","hoverOpenTimer","hoverCloseTimer","useFloating","whileElementsMounted","ref","float","update","autoUpdate","standardisePlacement","middleware","offset","space","extraSmall","flip","shift","padding","limiter","limitShift","arrow","element","borderRadiuses","medium","refs","floatingStyles","middlewareData","actualPlacement","onMouseEnter","clearTimeout","setTimeout","onMouseLeave","React","useEffect","console","log","referenceListenerProps","undefined","onFocus","onBlur","onKeyDown","e","key","preventDefault","onClick","createElement","Fragment","cloneElement","setReference","classNames","setFloating","display","role","id","IconButton","type","CloseIcon","split","left","x","top","y","PopoverContext","createContext","usePopoverContext","context","useContext","Error","useCustomState","state","setState","internalState","setInternalState","controlled","Popover","controlledState","showPopover","setControlledState","setShowPopover","triggerElement","contentElement","usePopper","current","modifiers","name","enabled","options","styles","attributes","forceUpdate","triggerProps","useCallback","buttonProps","buttonOnClick","prev","useOnClickOutside","closeButtonProps","popoverContentProps","contentProps","event","elementReceivingFocus","relatedTarget","getAttribute","focusElementIsPopover","elementContainsElement","focusElementIsTrigger","isValidBlur","contextValue","Provider","value","PopoverTrigger","child","Children","only","PopoverCloseButton","PopoverContent","forwardRef","props","Contrast","popper","parent","contains","warnAboutMissingStyles"],"mappings":"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"}
1
+ {"version":3,"file":"tooltip.cjs.development.js","sources":["../src/utils.ts","../src/Tooltip.tsx","../src/Popover.tsx","../src/index.tsx"],"sourcesContent":["import { Placement as FloatingUIPlacement } from '@floating-ui/react-dom';\n\nexport type Placement =\n | 'top'\n | 'top-left'\n | 'top-start'\n | 'top-right'\n | 'top-end'\n | 'left'\n | 'right'\n | 'bottom-left'\n | 'bottom-start'\n | 'bottom'\n | 'bottom-right'\n | 'bottom-end';\n\nexport function standardisePlacement(placement: string): FloatingUIPlacement {\n switch (placement) {\n case 'top-left':\n return 'top-start';\n case 'top-right':\n return 'top-end';\n case 'bottom-left':\n return 'bottom-start';\n case 'bottom-right':\n return 'bottom-end';\n default:\n return placement as FloatingUIPlacement;\n }\n}\n","import React, { cloneElement, useRef, useState } from 'react';\n\nimport classNames from 'classnames';\nimport {\n useFloating,\n autoUpdate,\n offset,\n flip,\n shift,\n arrow,\n limitShift,\n} from '@floating-ui/react-dom';\n\nimport { useRandomId } from '@entur/utils';\nimport { CloseIcon } from '@entur/icons';\nimport { IconButton } from '@entur/button';\nimport { space, borderRadiuses } from '@entur/tokens';\n\nimport { Placement, standardisePlacement } from './utils';\n\nimport './Tooltip.scss';\n\ntype Modifier = {\n name: string;\n enabled?: boolean;\n requires?: Array<string>;\n requiresIfExists?: Array<string>;\n options?: Record<string, unknown>;\n data?: Record<string, unknown>;\n [key: string]: any;\n};\n\ntype ChildEventListner = {\n 'aria-describedby'?: string;\n onFocus?: () => void;\n onBlur?: () => void;\n onMouseEnter?: (e: React.MouseEvent) => void;\n onMouseLeave?: () => void;\n onKeyDown?: (e: React.KeyboardEvent) => void;\n onKeyUp?: (e: React.KeyboardEvent) => void;\n onClick?: (e: React.MouseEvent) => void;\n};\n\n/** @deprecated use variant=\"negative\" instead */\nconst error = 'error';\n\nexport type TooltipProps = {\n /** Plassering av tooltip-en */\n placement: Placement;\n /** Innholdet i tooltip-boksen */\n content: React.ReactNode;\n /** Elementet som skal ha tooltip-funksjonalitet */\n children: React.ReactElement;\n /** Om tooltip-en skal vises */\n isOpen?: boolean;\n /** Ekstra klassenavn for tooltip */\n className?: string;\n /** Åpner ikke tooltip ved hover-events\n * @default false\n */\n disableHoverListener?: boolean;\n /** Åpner ikke tooltip ved focus-events\n * @default false\n */\n disableFocusListener?: boolean;\n disableKeyboardListener?: boolean;\n disableClickListner?: boolean;\n /** Viser en lukkeknapp om man kontrollerer åpningen av Tooltip vha `isOpen`\n * @default true\n */\n showCloseButton?: boolean;\n /** Valideringsvariant for Tooltip */\n variant?: 'negative' | typeof error;\n /** @deprecated Ikke lenger støttet. Meld fra på #talk-designsystem hvis du trenger støtte for\n * overskrivinger av plasseringen til Tooltip!\n */\n popperModifiers?: Modifier[];\n [key: string]: any;\n};\n\nexport const Tooltip: React.FC<TooltipProps> = ({\n placement,\n content,\n children,\n className,\n isOpen = false,\n disableHoverListener = false,\n disableFocusListener = false,\n disableKeyboardListener = true,\n disableClickListner = true,\n showCloseButton = true,\n variant,\n style,\n ...rest\n}) => {\n const [showTooltip, setShowTooltip] = useState(isOpen);\n const tooltipArrowRef = useRef(null);\n const tooltipId = useRandomId('eds-tooltip');\n const hoverOpenTimer = useRef<ReturnType<typeof setTimeout>>();\n const hoverCloseTimer = useRef<ReturnType<typeof setTimeout>>();\n\n // calculations for floating-UI tooltip position\n const {\n refs,\n floatingStyles,\n middlewareData,\n placement: actualPlacement,\n } = useFloating({\n whileElementsMounted: (ref, float, update) =>\n autoUpdate(ref, float, update),\n placement: standardisePlacement(placement),\n middleware: [\n offset(space.extraSmall),\n flip(),\n shift({ padding: space.extraSmall, limiter: limitShift({ offset: 8 }) }),\n arrow({\n element: tooltipArrowRef,\n padding: borderRadiuses.medium,\n }),\n ],\n });\n\n const onMouseEnter = () => {\n clearTimeout(hoverCloseTimer.current);\n hoverOpenTimer.current = setTimeout(() => {\n setShowTooltip(true);\n }, 150);\n };\n\n const onMouseLeave = () => {\n clearTimeout(hoverOpenTimer.current);\n hoverCloseTimer.current = setTimeout(() => {\n setShowTooltip(false);\n }, 300);\n };\n\n React.useEffect(() => {\n return () => {\n clearTimeout(hoverOpenTimer.current);\n clearTimeout(hoverCloseTimer.current);\n };\n }, []);\n\n const referenceListenerProps: ChildEventListner = {\n 'aria-describedby': showTooltip ? tooltipId : undefined,\n // focusListner\n ...(!disableFocusListener && { onFocus: () => setShowTooltip(true) }),\n ...(!disableFocusListener && { onBlur: () => setShowTooltip(false) }),\n // hoverListner\n ...(!disableHoverListener && { onMouseEnter }),\n ...(!disableHoverListener && { onMouseLeave }),\n // keyboardListner\n ...(!disableKeyboardListener && {\n onKeyDown: e => {\n if (e.key === 'Escape') setShowTooltip(false);\n if (e.key === ' ' || e.key === 'Enter') {\n e.preventDefault();\n setShowTooltip(!showTooltip);\n }\n },\n }),\n // clickListner\n ...(!disableClickListner && {\n onClick: () => setShowTooltip(!showTooltip),\n }),\n };\n\n return (\n <>\n {cloneElement(children, {\n ref: refs.setReference,\n ...referenceListenerProps,\n })}\n <div\n className={classNames(className, 'eds-tooltip', {\n 'eds-tooltip--negative': variant === error || variant === 'negative',\n })}\n ref={refs.setFloating}\n style={{\n ...floatingStyles,\n display: showTooltip && content ? undefined : 'none',\n ...style,\n }}\n role=\"tooltip\"\n id={tooltipId}\n onMouseEnter={!disableHoverListener ? onMouseEnter : undefined}\n onMouseLeave={!disableHoverListener ? onMouseLeave : undefined}\n {...rest}\n >\n {content}\n {isOpen && showCloseButton && (\n <IconButton\n className=\"eds-tooltip__close-button\"\n onClick={() => setShowTooltip(false)}\n type=\"button\"\n aria-label=\"Lukk tooltip\"\n >\n <CloseIcon aria-hidden=\"true\" />\n </IconButton>\n )}\n <div\n className={`eds-tooltip__arrow--${actualPlacement?.split('-')?.[0]}`}\n ref={tooltipArrowRef}\n style={{\n left: middlewareData.arrow?.x,\n top: middlewareData.arrow?.y,\n }}\n />\n </div>\n </>\n );\n};\n","import React, {\n cloneElement,\n createContext,\n MutableRefObject,\n useContext,\n} from 'react';\n\nimport classNames from 'classnames';\nimport {\n useFloating,\n autoUpdate,\n offset,\n flip,\n shift,\n limitShift,\n} from '@floating-ui/react-dom';\n\nimport { Contrast } from '@entur/layout';\nimport { mergeRefs, useOnClickOutside } from '@entur/utils';\nimport { space } from '@entur/tokens';\n\nimport { Placement, standardisePlacement } from './utils';\n\nimport './Popover.scss';\n\nexport type PopoverProps = {\n /** Innholdet i Popover */\n children: React.ReactNode;\n /** Plasseringen av Popover\n * @default \"bottom-start\"\n */\n placement?: Placement;\n /** Hvis du ønsker å styre state selv kan du sende inn state her */\n showPopover?: boolean;\n /** Hvis du ønsker å styre state selv kan du sende inn setState her */\n setShowPopover?: React.Dispatch<React.SetStateAction<boolean>>;\n};\n\nexport const Popover: React.FC<PopoverProps> = ({\n children,\n placement = 'bottom-start',\n showPopover: controlledState,\n setShowPopover: setControlledState,\n}) => {\n const [showPopover, setShowPopover, controlled] = useCustomState(\n controlledState,\n setControlledState,\n );\n\n // calculations for floating-UI popover position\n const { refs, floatingStyles } = useFloating<HTMLButtonElement>({\n whileElementsMounted: (ref, float, update) =>\n autoUpdate(ref, float, update),\n placement: standardisePlacement(placement),\n middleware: [\n offset(space.extraSmall),\n flip(),\n shift({ padding: space.extraSmall, limiter: limitShift({ offset: 8 }) }),\n ],\n });\n\n useOnClickOutside([refs.floating, refs.reference], () =>\n setShowPopover(false),\n );\n\n const popoverTriggerProps = {\n 'aria-haspopup': 'dialog',\n 'aria-expanded': showPopover,\n ref: refs.setReference,\n type: 'button',\n ...(!controlled && {\n onClick: () => setShowPopover(prev => !prev),\n }),\n };\n\n const popoverContentProps = {\n role: 'dialog',\n 'aria-modal': false,\n 'aria-hidden': !showPopover,\n ref: refs.setFloating,\n style: { ...(!showPopover && { display: 'none' }) },\n onKeyDown: (event: React.KeyboardEvent) => {\n if (event.key === 'Escape') setShowPopover(false);\n },\n onBlur: (event: React.FocusEvent) => {\n const elementReceivingFocus = event.relatedTarget as HTMLElement;\n // The check for 'tabindex=-1' is a special case for focus handling in Docz\n if (\n !elementReceivingFocus ||\n elementReceivingFocus.getAttribute('tabindex') === '-1'\n )\n return;\n const focusedElementIsPopover = elementContainsElement(\n refs.floating.current,\n elementReceivingFocus,\n );\n const focusedElementIsTrigger = elementContainsElement(\n refs.reference.current,\n elementReceivingFocus,\n );\n const popoverShouldClose =\n !focusedElementIsPopover && !focusedElementIsTrigger;\n if (showPopover && popoverShouldClose) setShowPopover(false);\n },\n };\n\n const closeButtonProps = {\n onClick: () => setShowPopover(false),\n type: 'button',\n };\n\n const contextValue: PopoverContextProps = {\n showPopover,\n floatingStyles,\n popoverTriggerProps,\n popoverContentProps,\n closeButtonProps,\n };\n\n return (\n <PopoverContext.Provider value={contextValue}>\n {children}\n </PopoverContext.Provider>\n );\n};\n\nexport type PopoverTriggerProps = {\n /** Knapp som skal brukes for å åpne Popover */\n children: React.ReactElement;\n};\n\nexport const PopoverTrigger: React.FC<PopoverTriggerProps> = ({ children }) => {\n const { popoverTriggerProps } = usePopoverContext();\n const child = React.Children.only(children) as React.ReactElement<any>;\n return cloneElement(child, popoverTriggerProps);\n};\n\nexport type PopoverCloseButtonProps = {\n /** En valgfri knapp som kan legges inn for å lukke Popover */\n children: React.ReactElement;\n};\n\nexport const PopoverCloseButton: React.FC<PopoverCloseButtonProps> = ({\n children,\n ...rest\n}) => {\n const { closeButtonProps } = usePopoverContext();\n return cloneElement(children, { ...closeButtonProps, ...rest });\n};\n\nexport type PopoverContentProps = {\n /**Innholdet til Popover */\n children: React.ReactNode;\n className?: string;\n style?: React.CSSProperties;\n};\n\nexport const PopoverContent = React.forwardRef<\n HTMLDivElement,\n PopoverContentProps\n>(({ children, className, style }, ref: React.Ref<HTMLDivElement>) => {\n const { floatingStyles, popoverContentProps } = usePopoverContext();\n return (\n <Contrast\n className={classNames(className, 'eds-popover')}\n {...popoverContentProps}\n style={{ ...floatingStyles, ...popoverContentProps.style, ...style }}\n // @ts-expect-error correct type for floating cannot be set via useFloating\n ref={mergeRefs(popoverContentProps.ref, ref)}\n >\n {children}\n </Contrast>\n );\n});\n\ntype PopoverContextProps = {\n showPopover: boolean;\n floatingStyles: React.CSSProperties;\n closeButtonProps: Record<string, unknown>;\n popoverContentProps: {\n role: string;\n 'aria-modal': boolean;\n 'aria-hidden': boolean;\n ref: MutableRefObject<HTMLElement> | ((node: HTMLElement | null) => void);\n style: React.CSSProperties;\n onKeyDown: (event: React.KeyboardEvent) => void;\n onBlur: (event: React.FocusEvent) => void;\n };\n popoverTriggerProps: Record<string, unknown>;\n};\n\nconst PopoverContext = createContext<PopoverContextProps | undefined>(\n undefined,\n);\nconst usePopoverContext = () => {\n const context = useContext(PopoverContext);\n if (context == null) {\n throw Error('usePopoverContext must be used within <Popover/>');\n }\n return context;\n};\n\nconst useCustomState = (\n state?: boolean,\n setState?: React.Dispatch<React.SetStateAction<boolean>>,\n): [boolean, React.Dispatch<React.SetStateAction<boolean>>, boolean] => {\n const [internalState, setInternalState] = React.useState<boolean>(false);\n const controlled = state !== undefined && setState !== undefined;\n if (controlled) return [state, setState, controlled];\n return [internalState, setInternalState, controlled];\n};\n\nfunction elementContainsElement(\n parent: HTMLElement | null,\n child: HTMLElement,\n) {\n if (!parent) return false;\n return parent === child || parent.contains(child);\n}\n","import { warnAboutMissingStyles } from '@entur/utils';\nimport './index.scss';\n\nwarnAboutMissingStyles('tooltip');\n\nexport * from './Tooltip';\nexport * from './Popover';\nexport { Placement } from './utils';\n"],"names":["standardisePlacement","placement","error","Tooltip","content","children","className","isOpen","disableHoverListener","disableFocusListener","disableKeyboardListener","disableClickListner","showCloseButton","variant","style","rest","_excluded","useState","showTooltip","setShowTooltip","tooltipArrowRef","useRef","tooltipId","useRandomId","hoverOpenTimer","hoverCloseTimer","useFloating","whileElementsMounted","ref","float","update","autoUpdate","middleware","offset","space","extraSmall","flip","shift","padding","limiter","limitShift","arrow","element","borderRadiuses","medium","refs","floatingStyles","middlewareData","actualPlacement","onMouseEnter","clearTimeout","current","setTimeout","onMouseLeave","React","useEffect","referenceListenerProps","undefined","onFocus","onBlur","onKeyDown","e","key","preventDefault","onClick","createElement","Fragment","cloneElement","setReference","classNames","setFloating","display","role","id","IconButton","type","CloseIcon","split","left","x","top","y","Popover","controlledState","showPopover","setControlledState","setShowPopover","useCustomState","controlled","useOnClickOutside","floating","reference","popoverTriggerProps","prev","popoverContentProps","event","elementReceivingFocus","relatedTarget","getAttribute","focusedElementIsPopover","elementContainsElement","focusedElementIsTrigger","popoverShouldClose","closeButtonProps","contextValue","PopoverContext","Provider","value","PopoverTrigger","usePopoverContext","child","Children","only","PopoverCloseButton","PopoverContent","forwardRef","Contrast","mergeRefs","createContext","context","useContext","Error","state","setState","internalState","setInternalState","parent","contains","warnAboutMissingStyles"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@entur/utils"),t=require("react"),r=require("classnames"),n=require("@floating-ui/react-dom"),o=require("@entur/icons"),i=require("@entur/button"),a=require("@entur/tokens"),s=require("react-popper"),u=require("@entur/layout");function l(){return l=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},l.apply(this,arguments)}function c(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)t.indexOf(r=i[n])>=0||(o[r]=e[r]);return o}var d=["placement","content","children","className","isOpen","disableHoverListener","disableFocusListener","disableKeyboardListener","disableClickListner","showCloseButton","variant","style"];function p(e){switch(e){case"top-left":return"top-start";case"top-right":return"top-end";case"bottom-left":return"bottom-start";case"bottom-right":return"bottom-end";default:return e}}var f=["children"],v=t.createContext(void 0),m=function(){var e=t.useContext(v);if(null==e)throw Error("usePopoverContext must be used within <Popover/>");return e},b=t.forwardRef((function(e,n){var o=e.children,i=m(),a=i.showPopover,s=i.attributes,c=i.styles,d=(0,i.popoverContentProps)({ref:n});return t.createElement(u.Contrast,l({className:r("eds-popover",{"eds-popover--hidden":!a},"eds-contrast"),style:c.popper,"aria-hidden":!a},s.styles,d),o)}));function y(e,t){return!!e&&(e===t||e.contains(t))}e.warnAboutMissingStyles("tooltip"),exports.Popover=function(r){var n=r.children,o=r.placement,i=void 0===o?"bottom-start":o,a=function(e,r){var n=t.useState(!1),o=void 0!==e&&void 0!==r;return o?[e,r,o]:[n[0],n[1],o]}(r.showPopover,r.setShowPopover),u=a[0],c=a[1],d=a[2],p=t.useRef(null),f=t.useRef(null),m=s.usePopper(p.current,f.current,{modifiers:[{name:"arrow",enabled:!1},{name:"offset",options:{offset:[0,8]}}],placement:i}),b=m.styles,h=m.attributes,g=m.forceUpdate;t.useEffect((function(){g&&g()}),[u,g]);var w=t.useCallback((function(){var e={"aria-haspopup":"dialog","aria-expanded":u,ref:p,type:"button"};return d?e:l({},e,{onClick:function(e){e.preventDefault(),c((function(e){return!e}))}})}),[p,u,c,d]);e.useOnClickOutside([f,p],(function(){return c(!1)}));var E={onClick:function(e){e.preventDefault(),c(!1)},type:"button"},C=t.useCallback((function(){return{role:"dialog","aria-modal":"false",ref:f,onKeyDown:function(e){"Escape"===e.key&&u&&c(!1)},onBlur:function(e){var t=e.relatedTarget;if(t&&"-1"!==t.getAttribute("tabindex")){var r=y(f.current,t),n=y(p.current,t);u&&!r&&!n&&c(!1)}}}}),[f,u,c]);return t.createElement(v.Provider,{value:{showPopover:u,triggerElement:p,contentElement:f,styles:b,attributes:h,popoverContentProps:C,closeButtonProps:E,triggerProps:w}},n)},exports.PopoverCloseButton=function(e){var r=e.children,n=c(e,f),o=m();return t.cloneElement(r,l({},o.closeButtonProps,n))},exports.PopoverContent=b,exports.PopoverTrigger=function(e){var r=e.children,n=m().triggerProps,o=t.Children.only(r);return t.cloneElement(o,n())},exports.Tooltip=function(s){var u,f,v,m,b,y=s.placement,h=s.content,g=s.children,w=s.className,E=s.isOpen,C=void 0!==E&&E,P=s.disableHoverListener,k=void 0!==P&&P,x=s.disableFocusListener,L=void 0!==x&&x,O=s.disableKeyboardListener,q=void 0===O||O,T=s.disableClickListner,B=void 0===T||T,S=s.showCloseButton,M=void 0===S||S,R=s.variant,D=s.style,F=c(s,d),N=t.useState(C),_=N[0],j=N[1],K=t.useRef(null),I=e.useRandomId("eds-tooltip"),A=n.useFloating({whileElementsMounted:function(e,t,r){return n.autoUpdate(e,t,r)},placement:p(y),middleware:[n.offset(a.space.extraSmall),n.flip(),n.shift({padding:a.space.extraSmall,limiter:n.limitShift({offset:8})}),n.arrow({element:K,padding:a.borderRadiuses.medium})]}),H=A.refs,U=A.floatingStyles,z=A.middlewareData,G=A.placement,J=function(){clearTimeout(b),m=setTimeout((function(){j(!0)}),150)},Q=function(){clearTimeout(m),b=setTimeout((function(){j(!1)}),300)};t.useEffect((function(){return function(){clearTimeout(m),clearTimeout(b)}}),[]),t.useEffect((function(){console.log(G)}),[G]);var V=l({"aria-describedby":_?I:void 0},!L&&{onFocus:function(){return j(!0)}},!L&&{onBlur:function(){return j(!1)}},!k&&{onMouseEnter:J},!k&&{onMouseLeave:Q},!q&&{onKeyDown:function(e){"Escape"===e.key&&j(!1)," "!==e.key&&"Enter"!==e.key||(e.preventDefault(),j(!_))}},!B&&{onClick:function(){return j(!_)}});return t.createElement(t.Fragment,null,t.cloneElement(g,l({ref:H.setReference},V)),t.createElement("div",l({className:r(w,"eds-tooltip",{"eds-tooltip--negative":"error"===R||"negative"===R}),ref:H.setFloating,style:l({},U,{display:_&&h?void 0:"none"},D),role:"tooltip",id:I,onMouseEnter:k?void 0:J,onMouseLeave:k?void 0:Q},F),h,C&&M&&t.createElement(i.IconButton,{className:"eds-tooltip__close-button",onClick:function(){return j(!1)},type:"button","aria-label":"Lukk tooltip"},t.createElement(o.CloseIcon,{"aria-hidden":"true"})),t.createElement("div",{className:"eds-tooltip__arrow--"+(null==G||null==(u=G.split("-"))?void 0:u[0]),ref:K,style:{left:null==(f=z.arrow)?void 0:f.x,top:null==(v=z.arrow)?void 0:v.y}})))};
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@entur/utils"),t=require("react"),r=require("classnames"),n=require("@floating-ui/react-dom"),o=require("@entur/icons"),i=require("@entur/button"),a=require("@entur/tokens"),l=require("@entur/layout");function s(){return s=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},s.apply(this,arguments)}function u(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)t.indexOf(r=i[n])>=0||(o[r]=e[r]);return o}function c(e){switch(e){case"top-left":return"top-start";case"top-right":return"top-end";case"bottom-left":return"bottom-start";case"bottom-right":return"bottom-end";default:return e}}var d=["placement","content","children","className","isOpen","disableHoverListener","disableFocusListener","disableKeyboardListener","disableClickListner","showCloseButton","variant","style"],f=["children"],p=t.forwardRef((function(n,o){var i=n.children,a=n.className,u=n.style,c=m(),d=c.floatingStyles,f=c.popoverContentProps;return t.createElement(l.Contrast,s({className:r(a,"eds-popover")},f,{style:s({},d,f.style,u),ref:e.mergeRefs(f.ref,o)}),i)})),v=t.createContext(void 0),m=function(){var e=t.useContext(v);if(null==e)throw Error("usePopoverContext must be used within <Popover/>");return e};function g(e,t){return!!e&&(e===t||e.contains(t))}e.warnAboutMissingStyles("tooltip"),exports.Popover=function(r){var o=r.children,i=r.placement,l=void 0===i?"bottom-start":i,u=function(e,r){var n=t.useState(!1),o=void 0!==e&&void 0!==r;return o?[e,r,o]:[n[0],n[1],o]}(r.showPopover,r.setShowPopover),d=u[0],f=u[1],p=u[2],m=n.useFloating({whileElementsMounted:function(e,t,r){return n.autoUpdate(e,t,r)},placement:c(l),middleware:[n.offset(a.space.extraSmall),n.flip(),n.shift({padding:a.space.extraSmall,limiter:n.limitShift({offset:8})})]}),y=m.refs,b=m.floatingStyles;e.useOnClickOutside([y.floating,y.reference],(function(){return f(!1)}));var h=s({"aria-haspopup":"dialog","aria-expanded":d,ref:y.setReference,type:"button"},!p&&{onClick:function(){return f((function(e){return!e}))}}),w={role:"dialog","aria-modal":!1,"aria-hidden":!d,ref:y.setFloating,style:s({},!d&&{display:"none"}),onKeyDown:function(e){"Escape"===e.key&&f(!1)},onBlur:function(e){var t=e.relatedTarget;if(t&&"-1"!==t.getAttribute("tabindex")){var r=g(y.floating.current,t),n=g(y.reference.current,t);d&&!r&&!n&&f(!1)}}};return t.createElement(v.Provider,{value:{showPopover:d,floatingStyles:b,popoverTriggerProps:h,popoverContentProps:w,closeButtonProps:{onClick:function(){return f(!1)},type:"button"}}},o)},exports.PopoverCloseButton=function(e){var r=e.children,n=u(e,f),o=m();return t.cloneElement(r,s({},o.closeButtonProps,n))},exports.PopoverContent=p,exports.PopoverTrigger=function(e){var r=e.children,n=m().popoverTriggerProps,o=t.Children.only(r);return t.cloneElement(o,n)},exports.Tooltip=function(l){var f,p,v,m=l.placement,g=l.content,y=l.children,b=l.className,h=l.isOpen,w=void 0!==h&&h,C=l.disableHoverListener,E=void 0!==C&&C,P=l.disableFocusListener,x=void 0!==P&&P,k=l.disableKeyboardListener,S=void 0===k||k,L=l.disableClickListner,O=void 0===L||L,T=l.showCloseButton,R=void 0===T||T,q=l.variant,B=l.style,F=u(l,d),M=t.useState(w),N=M[0],_=M[1],j=t.useRef(null),D=e.useRandomId("eds-tooltip"),K=t.useRef(),I=t.useRef(),A=n.useFloating({whileElementsMounted:function(e,t,r){return n.autoUpdate(e,t,r)},placement:c(m),middleware:[n.offset(a.space.extraSmall),n.flip(),n.shift({padding:a.space.extraSmall,limiter:n.limitShift({offset:8})}),n.arrow({element:j,padding:a.borderRadiuses.medium})]}),H=A.refs,U=A.floatingStyles,z=A.middlewareData,G=A.placement,J=function(){clearTimeout(I.current),K.current=setTimeout((function(){_(!0)}),150)},Q=function(){clearTimeout(K.current),I.current=setTimeout((function(){_(!1)}),300)};t.useEffect((function(){return function(){clearTimeout(K.current),clearTimeout(I.current)}}),[]);var V=s({"aria-describedby":N?D:void 0},!x&&{onFocus:function(){return _(!0)}},!x&&{onBlur:function(){return _(!1)}},!E&&{onMouseEnter:J},!E&&{onMouseLeave:Q},!S&&{onKeyDown:function(e){"Escape"===e.key&&_(!1)," "!==e.key&&"Enter"!==e.key||(e.preventDefault(),_(!N))}},!O&&{onClick:function(){return _(!N)}});return t.createElement(t.Fragment,null,t.cloneElement(y,s({ref:H.setReference},V)),t.createElement("div",s({className:r(b,"eds-tooltip",{"eds-tooltip--negative":"error"===q||"negative"===q}),ref:H.setFloating,style:s({},U,{display:N&&g?void 0:"none"},B),role:"tooltip",id:D,onMouseEnter:E?void 0:J,onMouseLeave:E?void 0:Q},F),g,w&&R&&t.createElement(i.IconButton,{className:"eds-tooltip__close-button",onClick:function(){return _(!1)},type:"button","aria-label":"Lukk tooltip"},t.createElement(o.CloseIcon,{"aria-hidden":"true"})),t.createElement("div",{className:"eds-tooltip__arrow--"+(null==G||null==(f=G.split("-"))?void 0:f[0]),ref:j,style:{left:null==(p=z.arrow)?void 0:p.x,top:null==(v=z.arrow)?void 0:v.y}})))};
2
2
  //# sourceMappingURL=tooltip.cjs.production.min.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tooltip.cjs.production.min.js","sources":["../src/Tooltip.tsx","../src/Popover.tsx","../src/index.tsx"],"sourcesContent":["import React, { cloneElement, useRef, useState } from 'react';\n\nimport classNames from 'classnames';\nimport {\n useFloating,\n autoUpdate,\n offset,\n flip,\n shift,\n Placement as FloatingUIPlacement,\n arrow,\n limitShift,\n} from '@floating-ui/react-dom';\n\nimport { useRandomId } from '@entur/utils';\nimport { CloseIcon } from '@entur/icons';\nimport { IconButton } from '@entur/button';\nimport { space, borderRadiuses } from '@entur/tokens';\n\nimport './Tooltip.scss';\n\ntype Modifier = {\n name: string;\n enabled?: boolean;\n requires?: Array<string>;\n requiresIfExists?: Array<string>;\n options?: Record<string, unknown>;\n data?: Record<string, unknown>;\n [key: string]: any;\n};\n\nexport type Placement =\n | 'top'\n | 'top-left'\n | 'top-start'\n | 'top-right'\n | 'top-end'\n | 'left'\n | 'right'\n | 'bottom-left'\n | 'bottom-start'\n | 'bottom'\n | 'bottom-right'\n | 'bottom-end';\n\ntype ChildEventListner = {\n 'aria-describedby'?: string;\n onFocus?: () => void;\n onBlur?: () => void;\n onMouseEnter?: (e: React.MouseEvent) => void;\n onMouseLeave?: () => void;\n onKeyDown?: (e: React.KeyboardEvent) => void;\n onKeyUp?: (e: React.KeyboardEvent) => void;\n onClick?: (e: React.MouseEvent) => void;\n};\n\n/** @deprecated use variant=\"negative\" instead */\nconst error = 'error';\n\nexport type TooltipProps = {\n /** Plassering av tooltip-en */\n placement: Placement;\n /** Innholdet i tooltip-boksen */\n content: React.ReactNode;\n /** Elementet som skal ha tooltip-funksjonalitet */\n children: React.ReactElement;\n /** Om tooltip-en skal vises */\n isOpen?: boolean;\n /** Ekstra klassenavn for tooltip */\n className?: string;\n /** Åpner ikke tooltip ved hover-events\n * @default false\n */\n disableHoverListener?: boolean;\n /** Åpner ikke tooltip ved focus-events\n * @default false\n */\n disableFocusListener?: boolean;\n disableKeyboardListener?: boolean;\n disableClickListner?: boolean;\n /** Viser en lukkeknapp om man kontrollerer åpningen av Tooltip vha `isOpen`\n * @default true\n */\n showCloseButton?: boolean;\n /** Valideringsvariant for Tooltip */\n variant?: 'negative' | typeof error;\n /** @deprecated Ikke lenger støttet. Meld fra på #talk-designsystem hvis du trenger støtte for\n * overskrivinger av plasseringen til Tooltip!\n */\n popperModifiers?: Modifier[];\n [key: string]: any;\n};\n\nexport const Tooltip: React.FC<TooltipProps> = ({\n placement,\n content,\n children,\n className,\n isOpen = false,\n disableHoverListener = false,\n disableFocusListener = false,\n disableKeyboardListener = true,\n disableClickListner = true,\n showCloseButton = true,\n variant,\n style,\n ...rest\n}) => {\n const [showTooltip, setShowTooltip] = useState(isOpen);\n const tooltipArrowRef = useRef(null);\n const tooltipId = useRandomId('eds-tooltip');\n let hoverOpenTimer: ReturnType<typeof setTimeout>;\n let hoverCloseTimer: ReturnType<typeof setTimeout>;\n\n // calculations for floating-UI tooltip position\n const {\n refs,\n floatingStyles,\n middlewareData,\n placement: actualPlacement,\n } = useFloating({\n whileElementsMounted: (ref, float, update) =>\n autoUpdate(ref, float, update),\n placement: standardisePlacement(placement),\n middleware: [\n offset(space.extraSmall),\n flip(),\n shift({ padding: space.extraSmall, limiter: limitShift({ offset: 8 }) }),\n arrow({\n element: tooltipArrowRef,\n padding: borderRadiuses.medium,\n }),\n ],\n });\n\n const onMouseEnter = () => {\n clearTimeout(hoverCloseTimer);\n hoverOpenTimer = setTimeout(() => {\n setShowTooltip(true);\n }, 150);\n };\n\n const onMouseLeave = () => {\n clearTimeout(hoverOpenTimer);\n hoverCloseTimer = setTimeout(() => {\n setShowTooltip(false);\n }, 300);\n };\n\n React.useEffect(() => {\n return () => {\n clearTimeout(hoverOpenTimer);\n clearTimeout(hoverCloseTimer);\n };\n }, []);\n React.useEffect(() => {\n console.log(actualPlacement);\n }, [actualPlacement]);\n\n const referenceListenerProps: ChildEventListner = {\n 'aria-describedby': showTooltip ? tooltipId : undefined,\n // focusListner\n ...(!disableFocusListener && { onFocus: () => setShowTooltip(true) }),\n ...(!disableFocusListener && { onBlur: () => setShowTooltip(false) }),\n // hoverListner\n ...(!disableHoverListener && { onMouseEnter }),\n ...(!disableHoverListener && { onMouseLeave }),\n // keyboardListner\n ...(!disableKeyboardListener && {\n onKeyDown: e => {\n if (e.key === 'Escape') setShowTooltip(false);\n if (e.key === ' ' || e.key === 'Enter') {\n e.preventDefault();\n setShowTooltip(!showTooltip);\n }\n },\n }),\n // clickListner\n ...(!disableClickListner && {\n onClick: () => setShowTooltip(!showTooltip),\n }),\n };\n\n return (\n <>\n {cloneElement(children, {\n ref: refs.setReference,\n ...referenceListenerProps,\n })}\n <div\n className={classNames(className, 'eds-tooltip', {\n 'eds-tooltip--negative': variant === error || variant === 'negative',\n })}\n ref={refs.setFloating}\n style={{\n ...floatingStyles,\n display: showTooltip && content ? undefined : 'none',\n ...style,\n }}\n role=\"tooltip\"\n id={tooltipId}\n onMouseEnter={!disableHoverListener ? onMouseEnter : undefined}\n onMouseLeave={!disableHoverListener ? onMouseLeave : undefined}\n {...rest}\n >\n {content}\n {isOpen && showCloseButton && (\n <IconButton\n className=\"eds-tooltip__close-button\"\n onClick={() => setShowTooltip(false)}\n type=\"button\"\n aria-label=\"Lukk tooltip\"\n >\n <CloseIcon aria-hidden=\"true\" />\n </IconButton>\n )}\n <div\n className={`eds-tooltip__arrow--${actualPlacement?.split('-')?.[0]}`}\n ref={tooltipArrowRef}\n style={{\n left: middlewareData.arrow?.x,\n top: middlewareData.arrow?.y,\n }}\n />\n </div>\n </>\n );\n};\n\nfunction standardisePlacement(placement: string): FloatingUIPlacement {\n switch (placement) {\n case 'top-left':\n return 'top-start';\n case 'top-right':\n return 'top-end';\n case 'bottom-left':\n return 'bottom-start';\n case 'bottom-right':\n return 'bottom-end';\n default:\n return placement as FloatingUIPlacement;\n }\n}\n","import React, { cloneElement, createContext, useContext } from 'react';\n\nimport { usePopper } from 'react-popper';\nimport { Placement } from '@popperjs/core';\nimport classNames from 'classnames';\n\nimport { Contrast } from '@entur/layout';\nimport { useOnClickOutside } from '@entur/utils';\n\nimport './Popover.scss';\n\ntype PopoverContentCallbackProps = {\n ref: React.Ref<HTMLDivElement>;\n};\n\ntype PopoverContextProps = {\n showPopover: boolean;\n triggerElement?: React.RefObject<HTMLButtonElement>;\n contentElement: React.RefObject<HTMLDivElement>;\n styles: { [key: string]: React.CSSProperties };\n attributes: { [key: string]: { [key: string]: string } | undefined };\n closeButtonProps: Record<string, unknown>;\n popoverContentProps: (\n e: PopoverContentCallbackProps,\n ) => Record<string, unknown>;\n triggerProps: () => Record<string, unknown>;\n [key: string]: any;\n};\n\nconst PopoverContext = createContext<PopoverContextProps | undefined>(\n undefined,\n);\nconst usePopoverContext = () => {\n const context = useContext(PopoverContext);\n if (context == null) {\n throw Error('usePopoverContext must be used within <Popover/>');\n }\n return context;\n};\n\nconst useCustomState = (\n state?: boolean,\n setState?: React.Dispatch<React.SetStateAction<boolean>>,\n): [boolean, React.Dispatch<React.SetStateAction<boolean>>, boolean] => {\n const [internalState, setInternalState] = React.useState<boolean>(false);\n const controlled = state !== undefined && setState !== undefined;\n if (controlled) return [state, setState, controlled];\n return [internalState, setInternalState, controlled];\n};\n\nexport type PopoverProps = {\n /** Innholdet i Popover */\n children: React.ReactNode;\n /** Plasseringen av Popover\n * @default \"bottom-start\"\n */\n placement?: Placement;\n /** Hvis du ønsker å styre state selv kan du sende inn state her */\n showPopover?: boolean;\n /** Hvis du ønsker å styre state selv kan du sende inn setState her */\n setShowPopover?: React.Dispatch<React.SetStateAction<boolean>>;\n};\n\nexport const Popover: React.FC<PopoverProps> = ({\n children,\n placement = 'bottom-start',\n showPopover: controlledState,\n setShowPopover: setControlledState,\n}) => {\n const [showPopover, setShowPopover, controlled] = useCustomState(\n controlledState,\n setControlledState,\n );\n const triggerElement = React.useRef(null);\n const contentElement = React.useRef(null);\n\n const { styles, attributes, forceUpdate } = usePopper(\n triggerElement.current,\n contentElement.current,\n {\n modifiers: [\n { name: 'arrow', enabled: false },\n {\n name: 'offset',\n options: {\n offset: [0, 8],\n },\n },\n ],\n placement: placement,\n },\n );\n\n React.useEffect(() => {\n if (forceUpdate) {\n forceUpdate();\n }\n }, [showPopover, forceUpdate]);\n\n const triggerProps = React.useCallback(() => {\n const buttonProps = {\n 'aria-haspopup': 'dialog',\n 'aria-expanded': showPopover,\n ref: triggerElement,\n type: 'button',\n };\n const buttonOnClick = {\n onClick: (e: React.MouseEvent) => {\n e.preventDefault();\n setShowPopover(prev => !prev);\n },\n };\n return controlled ? buttonProps : { ...buttonProps, ...buttonOnClick };\n }, [triggerElement, showPopover, setShowPopover, controlled]);\n\n useOnClickOutside([contentElement, triggerElement], () =>\n setShowPopover(false),\n );\n const closeButtonProps = {\n onClick: (e: React.MouseEvent) => {\n e.preventDefault();\n setShowPopover(false);\n },\n type: 'button',\n };\n const popoverContentProps = React.useCallback(() => {\n const contentProps = {\n role: 'dialog',\n 'aria-modal': 'false',\n ref: contentElement,\n onKeyDown: (event: React.KeyboardEvent) => {\n if (event.key === 'Escape') {\n showPopover && setShowPopover(false);\n }\n },\n onBlur: (event: React.FocusEvent) => {\n const elementReceivingFocus = event.relatedTarget as HTMLElement;\n // The check for 'tabindex=-1' is a special case for focus handling in Docz\n if (\n !elementReceivingFocus ||\n elementReceivingFocus.getAttribute('tabindex') === '-1'\n )\n return;\n const focusElementIsPopover = elementContainsElement(\n contentElement.current,\n elementReceivingFocus,\n );\n const focusElementIsTrigger = elementContainsElement(\n triggerElement.current,\n elementReceivingFocus,\n );\n const isValidBlur = !focusElementIsPopover && !focusElementIsTrigger;\n if (showPopover && isValidBlur) setShowPopover(false);\n },\n };\n return contentProps;\n }, [contentElement, showPopover, setShowPopover]);\n const contextValue: PopoverContextProps = {\n showPopover,\n triggerElement,\n contentElement,\n styles,\n attributes,\n popoverContentProps,\n closeButtonProps,\n triggerProps,\n };\n return (\n <PopoverContext.Provider value={contextValue}>\n {children}\n </PopoverContext.Provider>\n );\n};\n\nexport type PopoverTriggerProps = {\n /** Knapp som skal brukes for å åpne Popover */\n children: React.ReactElement;\n};\n\nexport const PopoverTrigger: React.FC<PopoverTriggerProps> = ({ children }) => {\n const { triggerProps } = usePopoverContext();\n const child = React.Children.only(children) as React.ReactElement<any>;\n return cloneElement(child, triggerProps());\n};\n\nexport type PopoverCloseButtonProps = {\n /** En valgfri knapp som kan legges inn for å lukke Popover */\n children: React.ReactElement;\n};\n\nexport const PopoverCloseButton: React.FC<PopoverCloseButtonProps> = ({\n children,\n ...rest\n}) => {\n const { closeButtonProps } = usePopoverContext();\n return cloneElement(children, { ...closeButtonProps, ...rest });\n};\n\nexport type PopoverContentProps = {\n /**Innholdet til Popover */\n children: React.ReactNode;\n};\n\nexport const PopoverContent = React.forwardRef<\n HTMLDivElement,\n PopoverContentProps\n>(({ children }, ref: React.Ref<HTMLDivElement>) => {\n const { showPopover, attributes, styles, popoverContentProps } =\n usePopoverContext();\n const props = popoverContentProps({ ref });\n return (\n <Contrast\n className={classNames(\n 'eds-popover',\n {\n 'eds-popover--hidden': !showPopover,\n },\n 'eds-contrast',\n )}\n style={styles.popper}\n aria-hidden={!showPopover}\n {...attributes.styles}\n {...props}\n >\n {children}\n </Contrast>\n );\n});\n\nfunction elementContainsElement(\n parent: HTMLElement | null,\n child: HTMLElement,\n) {\n if (!parent) return false;\n return parent === child || parent.contains(child);\n}\n","import { warnAboutMissingStyles } from '@entur/utils';\nimport './index.scss';\n\nwarnAboutMissingStyles('tooltip');\n\nexport * from './Tooltip';\nexport * from './Popover';\n"],"names":["standardisePlacement","placement","PopoverContext","createContext","undefined","usePopoverContext","context","useContext","Error","PopoverContent","React","forwardRef","ref","children","_usePopoverContext3","showPopover","attributes","styles","props","popoverContentProps","Contrast","_extends","className","classNames","style","popper","elementContainsElement","parent","child","contains","warnAboutMissingStyles","_ref","_ref$placement","_useCustomState","state","setState","_React$useState","useState","controlled","useCustomState","setShowPopover","triggerElement","useRef","contentElement","usePopper","current","modifiers","name","enabled","options","offset","forceUpdate","useEffect","triggerProps","useCallback","buttonProps","type","onClick","e","preventDefault","prev","useOnClickOutside","closeButtonProps","role","onKeyDown","event","key","onBlur","elementReceivingFocus","relatedTarget","getAttribute","focusElementIsPopover","focusElementIsTrigger","createElement","Provider","value","_ref3","rest","_objectWithoutPropertiesLoose","_excluded","_usePopoverContext2","cloneElement","_ref2","Children","only","_actualPlacement$spli","_middlewareData$arrow","_middlewareData$arrow2","hoverOpenTimer","hoverCloseTimer","content","_ref$isOpen","isOpen","_ref$disableHoverList","disableHoverListener","_ref$disableFocusList","disableFocusListener","_ref$disableKeyboardL","disableKeyboardListener","_ref$disableClickList","disableClickListner","_ref$showCloseButton","showCloseButton","variant","showTooltip","_useState","setShowTooltip","tooltipArrowRef","tooltipId","useRandomId","_useFloating","useFloating","whileElementsMounted","float","update","autoUpdate","middleware","space","extraSmall","flip","shift","padding","limiter","limitShift","arrow","element","borderRadiuses","medium","refs","floatingStyles","middlewareData","actualPlacement","onMouseEnter","clearTimeout","setTimeout","onMouseLeave","console","log","referenceListenerProps","onFocus","Fragment","setReference","setFloating","display","id","IconButton","CloseIcon","split","left","x","top","y"],"mappings":"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"}
1
+ {"version":3,"file":"tooltip.cjs.production.min.js","sources":["../src/utils.ts","../src/Popover.tsx","../src/index.tsx","../src/Tooltip.tsx"],"sourcesContent":["import { Placement as FloatingUIPlacement } from '@floating-ui/react-dom';\n\nexport type Placement =\n | 'top'\n | 'top-left'\n | 'top-start'\n | 'top-right'\n | 'top-end'\n | 'left'\n | 'right'\n | 'bottom-left'\n | 'bottom-start'\n | 'bottom'\n | 'bottom-right'\n | 'bottom-end';\n\nexport function standardisePlacement(placement: string): FloatingUIPlacement {\n switch (placement) {\n case 'top-left':\n return 'top-start';\n case 'top-right':\n return 'top-end';\n case 'bottom-left':\n return 'bottom-start';\n case 'bottom-right':\n return 'bottom-end';\n default:\n return placement as FloatingUIPlacement;\n }\n}\n","import React, {\n cloneElement,\n createContext,\n MutableRefObject,\n useContext,\n} from 'react';\n\nimport classNames from 'classnames';\nimport {\n useFloating,\n autoUpdate,\n offset,\n flip,\n shift,\n limitShift,\n} from '@floating-ui/react-dom';\n\nimport { Contrast } from '@entur/layout';\nimport { mergeRefs, useOnClickOutside } from '@entur/utils';\nimport { space } from '@entur/tokens';\n\nimport { Placement, standardisePlacement } from './utils';\n\nimport './Popover.scss';\n\nexport type PopoverProps = {\n /** Innholdet i Popover */\n children: React.ReactNode;\n /** Plasseringen av Popover\n * @default \"bottom-start\"\n */\n placement?: Placement;\n /** Hvis du ønsker å styre state selv kan du sende inn state her */\n showPopover?: boolean;\n /** Hvis du ønsker å styre state selv kan du sende inn setState her */\n setShowPopover?: React.Dispatch<React.SetStateAction<boolean>>;\n};\n\nexport const Popover: React.FC<PopoverProps> = ({\n children,\n placement = 'bottom-start',\n showPopover: controlledState,\n setShowPopover: setControlledState,\n}) => {\n const [showPopover, setShowPopover, controlled] = useCustomState(\n controlledState,\n setControlledState,\n );\n\n // calculations for floating-UI popover position\n const { refs, floatingStyles } = useFloating<HTMLButtonElement>({\n whileElementsMounted: (ref, float, update) =>\n autoUpdate(ref, float, update),\n placement: standardisePlacement(placement),\n middleware: [\n offset(space.extraSmall),\n flip(),\n shift({ padding: space.extraSmall, limiter: limitShift({ offset: 8 }) }),\n ],\n });\n\n useOnClickOutside([refs.floating, refs.reference], () =>\n setShowPopover(false),\n );\n\n const popoverTriggerProps = {\n 'aria-haspopup': 'dialog',\n 'aria-expanded': showPopover,\n ref: refs.setReference,\n type: 'button',\n ...(!controlled && {\n onClick: () => setShowPopover(prev => !prev),\n }),\n };\n\n const popoverContentProps = {\n role: 'dialog',\n 'aria-modal': false,\n 'aria-hidden': !showPopover,\n ref: refs.setFloating,\n style: { ...(!showPopover && { display: 'none' }) },\n onKeyDown: (event: React.KeyboardEvent) => {\n if (event.key === 'Escape') setShowPopover(false);\n },\n onBlur: (event: React.FocusEvent) => {\n const elementReceivingFocus = event.relatedTarget as HTMLElement;\n // The check for 'tabindex=-1' is a special case for focus handling in Docz\n if (\n !elementReceivingFocus ||\n elementReceivingFocus.getAttribute('tabindex') === '-1'\n )\n return;\n const focusedElementIsPopover = elementContainsElement(\n refs.floating.current,\n elementReceivingFocus,\n );\n const focusedElementIsTrigger = elementContainsElement(\n refs.reference.current,\n elementReceivingFocus,\n );\n const popoverShouldClose =\n !focusedElementIsPopover && !focusedElementIsTrigger;\n if (showPopover && popoverShouldClose) setShowPopover(false);\n },\n };\n\n const closeButtonProps = {\n onClick: () => setShowPopover(false),\n type: 'button',\n };\n\n const contextValue: PopoverContextProps = {\n showPopover,\n floatingStyles,\n popoverTriggerProps,\n popoverContentProps,\n closeButtonProps,\n };\n\n return (\n <PopoverContext.Provider value={contextValue}>\n {children}\n </PopoverContext.Provider>\n );\n};\n\nexport type PopoverTriggerProps = {\n /** Knapp som skal brukes for å åpne Popover */\n children: React.ReactElement;\n};\n\nexport const PopoverTrigger: React.FC<PopoverTriggerProps> = ({ children }) => {\n const { popoverTriggerProps } = usePopoverContext();\n const child = React.Children.only(children) as React.ReactElement<any>;\n return cloneElement(child, popoverTriggerProps);\n};\n\nexport type PopoverCloseButtonProps = {\n /** En valgfri knapp som kan legges inn for å lukke Popover */\n children: React.ReactElement;\n};\n\nexport const PopoverCloseButton: React.FC<PopoverCloseButtonProps> = ({\n children,\n ...rest\n}) => {\n const { closeButtonProps } = usePopoverContext();\n return cloneElement(children, { ...closeButtonProps, ...rest });\n};\n\nexport type PopoverContentProps = {\n /**Innholdet til Popover */\n children: React.ReactNode;\n className?: string;\n style?: React.CSSProperties;\n};\n\nexport const PopoverContent = React.forwardRef<\n HTMLDivElement,\n PopoverContentProps\n>(({ children, className, style }, ref: React.Ref<HTMLDivElement>) => {\n const { floatingStyles, popoverContentProps } = usePopoverContext();\n return (\n <Contrast\n className={classNames(className, 'eds-popover')}\n {...popoverContentProps}\n style={{ ...floatingStyles, ...popoverContentProps.style, ...style }}\n // @ts-expect-error correct type for floating cannot be set via useFloating\n ref={mergeRefs(popoverContentProps.ref, ref)}\n >\n {children}\n </Contrast>\n );\n});\n\ntype PopoverContextProps = {\n showPopover: boolean;\n floatingStyles: React.CSSProperties;\n closeButtonProps: Record<string, unknown>;\n popoverContentProps: {\n role: string;\n 'aria-modal': boolean;\n 'aria-hidden': boolean;\n ref: MutableRefObject<HTMLElement> | ((node: HTMLElement | null) => void);\n style: React.CSSProperties;\n onKeyDown: (event: React.KeyboardEvent) => void;\n onBlur: (event: React.FocusEvent) => void;\n };\n popoverTriggerProps: Record<string, unknown>;\n};\n\nconst PopoverContext = createContext<PopoverContextProps | undefined>(\n undefined,\n);\nconst usePopoverContext = () => {\n const context = useContext(PopoverContext);\n if (context == null) {\n throw Error('usePopoverContext must be used within <Popover/>');\n }\n return context;\n};\n\nconst useCustomState = (\n state?: boolean,\n setState?: React.Dispatch<React.SetStateAction<boolean>>,\n): [boolean, React.Dispatch<React.SetStateAction<boolean>>, boolean] => {\n const [internalState, setInternalState] = React.useState<boolean>(false);\n const controlled = state !== undefined && setState !== undefined;\n if (controlled) return [state, setState, controlled];\n return [internalState, setInternalState, controlled];\n};\n\nfunction elementContainsElement(\n parent: HTMLElement | null,\n child: HTMLElement,\n) {\n if (!parent) return false;\n return parent === child || parent.contains(child);\n}\n","import { warnAboutMissingStyles } from '@entur/utils';\nimport './index.scss';\n\nwarnAboutMissingStyles('tooltip');\n\nexport * from './Tooltip';\nexport * from './Popover';\nexport { Placement } from './utils';\n","import React, { cloneElement, useRef, useState } from 'react';\n\nimport classNames from 'classnames';\nimport {\n useFloating,\n autoUpdate,\n offset,\n flip,\n shift,\n arrow,\n limitShift,\n} from '@floating-ui/react-dom';\n\nimport { useRandomId } from '@entur/utils';\nimport { CloseIcon } from '@entur/icons';\nimport { IconButton } from '@entur/button';\nimport { space, borderRadiuses } from '@entur/tokens';\n\nimport { Placement, standardisePlacement } from './utils';\n\nimport './Tooltip.scss';\n\ntype Modifier = {\n name: string;\n enabled?: boolean;\n requires?: Array<string>;\n requiresIfExists?: Array<string>;\n options?: Record<string, unknown>;\n data?: Record<string, unknown>;\n [key: string]: any;\n};\n\ntype ChildEventListner = {\n 'aria-describedby'?: string;\n onFocus?: () => void;\n onBlur?: () => void;\n onMouseEnter?: (e: React.MouseEvent) => void;\n onMouseLeave?: () => void;\n onKeyDown?: (e: React.KeyboardEvent) => void;\n onKeyUp?: (e: React.KeyboardEvent) => void;\n onClick?: (e: React.MouseEvent) => void;\n};\n\n/** @deprecated use variant=\"negative\" instead */\nconst error = 'error';\n\nexport type TooltipProps = {\n /** Plassering av tooltip-en */\n placement: Placement;\n /** Innholdet i tooltip-boksen */\n content: React.ReactNode;\n /** Elementet som skal ha tooltip-funksjonalitet */\n children: React.ReactElement;\n /** Om tooltip-en skal vises */\n isOpen?: boolean;\n /** Ekstra klassenavn for tooltip */\n className?: string;\n /** Åpner ikke tooltip ved hover-events\n * @default false\n */\n disableHoverListener?: boolean;\n /** Åpner ikke tooltip ved focus-events\n * @default false\n */\n disableFocusListener?: boolean;\n disableKeyboardListener?: boolean;\n disableClickListner?: boolean;\n /** Viser en lukkeknapp om man kontrollerer åpningen av Tooltip vha `isOpen`\n * @default true\n */\n showCloseButton?: boolean;\n /** Valideringsvariant for Tooltip */\n variant?: 'negative' | typeof error;\n /** @deprecated Ikke lenger støttet. Meld fra på #talk-designsystem hvis du trenger støtte for\n * overskrivinger av plasseringen til Tooltip!\n */\n popperModifiers?: Modifier[];\n [key: string]: any;\n};\n\nexport const Tooltip: React.FC<TooltipProps> = ({\n placement,\n content,\n children,\n className,\n isOpen = false,\n disableHoverListener = false,\n disableFocusListener = false,\n disableKeyboardListener = true,\n disableClickListner = true,\n showCloseButton = true,\n variant,\n style,\n ...rest\n}) => {\n const [showTooltip, setShowTooltip] = useState(isOpen);\n const tooltipArrowRef = useRef(null);\n const tooltipId = useRandomId('eds-tooltip');\n const hoverOpenTimer = useRef<ReturnType<typeof setTimeout>>();\n const hoverCloseTimer = useRef<ReturnType<typeof setTimeout>>();\n\n // calculations for floating-UI tooltip position\n const {\n refs,\n floatingStyles,\n middlewareData,\n placement: actualPlacement,\n } = useFloating({\n whileElementsMounted: (ref, float, update) =>\n autoUpdate(ref, float, update),\n placement: standardisePlacement(placement),\n middleware: [\n offset(space.extraSmall),\n flip(),\n shift({ padding: space.extraSmall, limiter: limitShift({ offset: 8 }) }),\n arrow({\n element: tooltipArrowRef,\n padding: borderRadiuses.medium,\n }),\n ],\n });\n\n const onMouseEnter = () => {\n clearTimeout(hoverCloseTimer.current);\n hoverOpenTimer.current = setTimeout(() => {\n setShowTooltip(true);\n }, 150);\n };\n\n const onMouseLeave = () => {\n clearTimeout(hoverOpenTimer.current);\n hoverCloseTimer.current = setTimeout(() => {\n setShowTooltip(false);\n }, 300);\n };\n\n React.useEffect(() => {\n return () => {\n clearTimeout(hoverOpenTimer.current);\n clearTimeout(hoverCloseTimer.current);\n };\n }, []);\n\n const referenceListenerProps: ChildEventListner = {\n 'aria-describedby': showTooltip ? tooltipId : undefined,\n // focusListner\n ...(!disableFocusListener && { onFocus: () => setShowTooltip(true) }),\n ...(!disableFocusListener && { onBlur: () => setShowTooltip(false) }),\n // hoverListner\n ...(!disableHoverListener && { onMouseEnter }),\n ...(!disableHoverListener && { onMouseLeave }),\n // keyboardListner\n ...(!disableKeyboardListener && {\n onKeyDown: e => {\n if (e.key === 'Escape') setShowTooltip(false);\n if (e.key === ' ' || e.key === 'Enter') {\n e.preventDefault();\n setShowTooltip(!showTooltip);\n }\n },\n }),\n // clickListner\n ...(!disableClickListner && {\n onClick: () => setShowTooltip(!showTooltip),\n }),\n };\n\n return (\n <>\n {cloneElement(children, {\n ref: refs.setReference,\n ...referenceListenerProps,\n })}\n <div\n className={classNames(className, 'eds-tooltip', {\n 'eds-tooltip--negative': variant === error || variant === 'negative',\n })}\n ref={refs.setFloating}\n style={{\n ...floatingStyles,\n display: showTooltip && content ? undefined : 'none',\n ...style,\n }}\n role=\"tooltip\"\n id={tooltipId}\n onMouseEnter={!disableHoverListener ? onMouseEnter : undefined}\n onMouseLeave={!disableHoverListener ? onMouseLeave : undefined}\n {...rest}\n >\n {content}\n {isOpen && showCloseButton && (\n <IconButton\n className=\"eds-tooltip__close-button\"\n onClick={() => setShowTooltip(false)}\n type=\"button\"\n aria-label=\"Lukk tooltip\"\n >\n <CloseIcon aria-hidden=\"true\" />\n </IconButton>\n )}\n <div\n className={`eds-tooltip__arrow--${actualPlacement?.split('-')?.[0]}`}\n ref={tooltipArrowRef}\n style={{\n left: middlewareData.arrow?.x,\n top: middlewareData.arrow?.y,\n }}\n />\n </div>\n </>\n );\n};\n"],"names":["standardisePlacement","placement","PopoverContent","React","forwardRef","ref","children","className","style","_usePopoverContext3","usePopoverContext","floatingStyles","popoverContentProps","createElement","Contrast","_extends","classNames","mergeRefs","PopoverContext","createContext","undefined","context","useContext","Error","elementContainsElement","parent","child","contains","warnAboutMissingStyles","_ref","_ref$placement","_useCustomState","state","setState","_React$useState","useState","controlled","useCustomState","showPopover","setShowPopover","_useFloating","useFloating","whileElementsMounted","float","update","autoUpdate","middleware","offset","space","extraSmall","flip","shift","padding","limiter","limitShift","refs","useOnClickOutside","floating","reference","popoverTriggerProps","setReference","type","onClick","prev","role","setFloating","display","onKeyDown","event","key","onBlur","elementReceivingFocus","relatedTarget","getAttribute","focusedElementIsPopover","current","focusedElementIsTrigger","Provider","value","closeButtonProps","_ref3","rest","_objectWithoutPropertiesLoose","_excluded","_usePopoverContext2","cloneElement","_ref2","Children","only","_actualPlacement$spli","_middlewareData$arrow","_middlewareData$arrow2","content","_ref$isOpen","isOpen","_ref$disableHoverList","disableHoverListener","_ref$disableFocusList","disableFocusListener","_ref$disableKeyboardL","disableKeyboardListener","_ref$disableClickList","disableClickListner","_ref$showCloseButton","showCloseButton","variant","showTooltip","_useState","setShowTooltip","tooltipArrowRef","useRef","tooltipId","useRandomId","hoverOpenTimer","hoverCloseTimer","arrow","element","borderRadiuses","medium","middlewareData","actualPlacement","onMouseEnter","clearTimeout","setTimeout","onMouseLeave","useEffect","referenceListenerProps","onFocus","e","preventDefault","Fragment","id","IconButton","CloseIcon","split","left","x","top","y"],"mappings":"ooBAgBM,SAAUA,EAAqBC,GACnC,OAAQA,GACN,IAAK,WACH,MAAO,YACT,IAAK,YACH,MAAO,UACT,IAAK,cACH,MAAO,eACT,IAAK,eACH,MAAO,aACT,QACE,OAAOA,EAEb,gNCgIaC,EAAiBC,EAAMC,YAGlC,SAAiCC,EAAAA,GAAkC,IAAhEC,IAAAA,SAAUC,IAAAA,UAAWC,IAAAA,MACxBC,EAAgDC,IAAxCC,IAAAA,eAAgBC,IAAAA,oBACxB,OACET,EAAAU,cAACC,EAAQA,SAAAC,EAAA,CACPR,UAAWS,EAAWT,EAAW,gBAC7BK,EAAmB,CACvBJ,MAAKO,EAAA,CAAA,EAAOJ,EAAmBC,EAAoBJ,MAAUA,GAE7DH,IAAKY,EAASA,UAACL,EAAoBP,IAAKA,KAEvCC,EAGP,IAkBMY,EAAiBC,EAAAA,mBACrBC,GAEIV,EAAoB,WACxB,IAAMW,EAAUC,aAAWJ,GAC3B,GAAe,MAAXG,EACF,MAAME,MAAM,oDAEd,OAAOF,CACT,EAYA,SAASG,EACPC,EACAC,GAEA,QAAKD,IACEA,IAAWC,GAASD,EAAOE,SAASD,GAC7C,CCvNAE,EAAsBA,uBAAC,2BDmCwB,SAK1CC,GAAA,IAJHvB,IAAAA,SAAQwB,EAAAD,EACR5B,UAAAA,aAAY,eAAc6B,EAI1BC,EA8JqB,SACrBC,EACAC,GAEA,IAAAC,EAA0C/B,EAAMgC,UAAkB,GAC5DC,OAAuBhB,IAAVY,QAAoCZ,IAAba,EAC1C,OAAIG,EAAmB,CAACJ,EAAOC,EAAUG,GAClC,CAHaF,EAAA,GAAkBA,EAAA,GAGGE,EAC3C,CAtKoDC,GAHlDC,cACAC,gBAEOD,EAAWP,EAAA,GAAEQ,EAAcR,EAAA,GAAEK,EAAUL,EAAA,GAM9CS,EAAiCC,EAAAA,YAA+B,CAC9DC,qBAAsB,SAACrC,EAAKsC,EAAOC,GAAM,OACvCC,aAAWxC,EAAKsC,EAAOC,EAAO,EAChC3C,UAAWD,EAAqBC,GAChC6C,WAAY,CACVC,EAAAA,OAAOC,EAAKA,MAACC,YACbC,EAAAA,OACAC,QAAM,CAAEC,QAASJ,EAAKA,MAACC,WAAYI,QAASC,EAAAA,WAAW,CAAEP,OAAQ,SAP7DQ,IAAAA,KAAM5C,IAAAA,eAWd6C,EAAiBA,kBAAC,CAACD,EAAKE,SAAUF,EAAKG,YAAY,WAAA,OACjDnB,GAAe,MAGjB,IAAMoB,EAAmB5C,EAAA,CACvB,gBAAiB,SACjB,gBAAiBuB,EACjBjC,IAAKkD,EAAKK,aACVC,KAAM,WACDzB,GAAc,CACjB0B,QAAS,WAAA,OAAMvB,GAAe,SAAAwB,GAAI,OAAKA,IAAK,IAI1CnD,EAAsB,CAC1BoD,KAAM,SACN,cAAc,EACd,eAAgB1B,EAChBjC,IAAKkD,EAAKU,YACVzD,MAAKO,EAAA,IAASuB,GAAe,CAAE4B,QAAS,SACxCC,UAAW,SAACC,GACQ,WAAdA,EAAMC,KAAkB9B,GAAe,EAC5C,EACD+B,OAAQ,SAACF,GACP,IAAMG,EAAwBH,EAAMI,cAEpC,GACGD,GACkD,OAAnDA,EAAsBE,aAAa,YAFrC,CAKA,IAAMC,EAA0BlD,EAC9B+B,EAAKE,SAASkB,QACdJ,GAEIK,EAA0BpD,EAC9B+B,EAAKG,UAAUiB,QACfJ,GAIEjC,IADDoC,IAA4BE,GACQrC,GAAe,EAXpD,CAYJ,GAgBF,OACEpC,EAAAU,cAACK,EAAe2D,SAAQ,CAACC,MATe,CACxCxC,YAAAA,EACA3B,eAAAA,EACAgD,oBAAAA,EACA/C,oBAAAA,EACAmE,iBAVuB,CACvBjB,QAAS,WAAA,OAAMvB,GAAe,EAAM,EACpCsB,KAAM,YAaHvD,EAGP,6BAkBqE,SAGhE0E,GAAA,IAFH1E,IAAAA,SACG2E,EAAIC,EAAAF,EAAAG,GAEPC,EAA6B1E,IAC7B,OAAO2E,EAAAA,aAAa/E,SADZyE,iBACgDE,GAC1D,kDAjB6D,SAAiBK,GAAA,IAAdhF,IAAAA,SACtDqD,EAAwBjD,IAAxBiD,oBACFjC,EAAQvB,EAAMoF,SAASC,KAAKlF,GAClC,OAAO+E,EAAYA,aAAC3D,EAAOiC,EAC7B,kBEvD+C,SAc1C9B,GAAA,IAAA4D,EAAAC,EAAAC,EAbH1F,IAAAA,UACA2F,IAAAA,QACAtF,IAAAA,SACAC,IAAAA,UAASsF,EAAAhE,EACTiE,OAAAA,cAAcD,EAAAE,EAAAlE,EACdmE,qBAAAA,cAA4BD,EAAAE,EAAApE,EAC5BqE,qBAAAA,cAA4BD,EAAAE,EAAAtE,EAC5BuE,wBAAAA,cAA8BD,EAAAE,EAAAxE,EAC9ByE,oBAAAA,cAA0BD,EAAAE,EAAA1E,EAC1B2E,gBAAAA,cAAsBD,EACtBE,IAAAA,QACAjG,IAAAA,MACGyE,EAAIC,EAAArD,EAAAsD,GAE+BhD,EAAAA,EAAQA,SAAC2D,GAAxCY,EAAWC,EAAA,GAAEC,EAAcD,EAAA,GAC5BE,EAAkBC,SAAO,MACzBC,EAAYC,cAAY,eACxBC,EAAiBH,EAAAA,SACjBI,EAAkBJ,EAAAA,SAGxBtE,EAKIC,EAAAA,YAAY,CACdC,qBAAsB,SAACrC,EAAKsC,EAAOC,GAAM,OACvCC,aAAWxC,EAAKsC,EAAOC,EAAO,EAChC3C,UAAWD,EAAqBC,GAChC6C,WAAY,CACVC,EAAAA,OAAOC,EAAKA,MAACC,YACbC,EAAAA,OACAC,QAAM,CAAEC,QAASJ,EAAKA,MAACC,WAAYI,QAASC,EAAAA,WAAW,CAAEP,OAAQ,MACjEoE,EAAAA,MAAM,CACJC,QAASP,EACTzD,QAASiE,EAAcA,eAACC,YAd5B/D,IAAAA,KACA5C,IAAAA,eACA4G,IAAAA,eACWC,IAAXvH,UAgBIwH,EAAe,WACnBC,aAAaR,EAAgBvC,SAC7BsC,EAAetC,QAAUgD,YAAW,WAClCf,GAAe,EAChB,GAAE,MAGCgB,EAAe,WACnBF,aAAaT,EAAetC,SAC5BuC,EAAgBvC,QAAUgD,YAAW,WACnCf,GAAe,EAChB,GAAE,MAGLzG,EAAM0H,WAAU,WACd,OAAO,WACLH,aAAaT,EAAetC,SAC5B+C,aAAaR,EAAgBvC,SAEhC,GAAE,IAEH,IAAMmD,EAAsB/G,EAAA,CAC1B,mBAAoB2F,EAAcK,OAAY3F,IAEzC8E,GAAwB,CAAE6B,QAAS,WAAA,OAAMnB,GAAe,EAAK,IAC7DV,GAAwB,CAAE5B,OAAQ,WAAA,OAAMsC,GAAe,EAAM,IAE7DZ,GAAwB,CAAEyB,aAAAA,IAC1BzB,GAAwB,CAAE4B,aAAAA,IAE1BxB,GAA2B,CAC9BjC,UAAW,SAAA6D,GACK,WAAVA,EAAE3D,KAAkBuC,GAAe,GACzB,MAAVoB,EAAE3D,KAAyB,UAAV2D,EAAE3D,MACrB2D,EAAEC,iBACFrB,GAAgBF,GAEpB,IAGGJ,GAAuB,CAC1BxC,QAAS,WAAA,OAAM8C,GAAgBF,EAAY,IAI/C,OACEvG,EAAAU,cAAAV,EAAA+H,SAAA,KACG7C,EAAYA,aAAC/E,EAAQS,EAAA,CACpBV,IAAKkD,EAAKK,cACPkE,IAEL3H,EAAAU,cAAA,MAAAE,EAAA,CACER,UAAWS,EAAWT,EAAW,cAAe,CAC9C,wBAnII,UAmIqBkG,GAAiC,aAAZA,IAEhDpG,IAAKkD,EAAKU,YACVzD,WACKG,EAAc,CACjBuD,QAASwC,GAAed,OAAUxE,EAAY,QAC3CZ,GAELwD,KAAK,UACLmE,GAAIpB,EACJU,aAAezB,OAAsC5E,EAAfqG,EACtCG,aAAe5B,OAAsC5E,EAAfwG,GAClC3C,GAEHW,EACAE,GAAUU,GACTrG,EAAAU,cAACuH,aACC,CAAA7H,UAAU,4BACVuD,QAAS,WAAA,OAAM8C,GAAe,EAAM,EACpC/C,KAAK,SAAQ,aACF,gBAEX1D,EAAAU,cAACwH,YAAS,CAAA,cAAa,UAG3BlI,EACEU,cAAA,MAAA,CAAAN,UAAkCiH,wBAAAA,MAAAA,GAA2B,OAA3BA,EAAAA,EAAiBc,MAAM,WAAvBd,EAAA/B,EAA8B,IAChEpF,IAAKwG,EACLrG,MAAO,CACL+H,KAA0B,SAApBhB,EAAeJ,YAAK,EAApBzB,EAAsB8C,EAC5BC,WAAKlB,EAAAA,EAAeJ,cAAfxB,EAAsB+C,MAMvC"}
@@ -1,11 +1,10 @@
1
- import { useRandomId, useOnClickOutside, warnAboutMissingStyles } from '@entur/utils';
1
+ import { useRandomId, useOnClickOutside, mergeRefs, warnAboutMissingStyles } from '@entur/utils';
2
2
  import React, { useState, useRef, cloneElement, createContext, useContext } from 'react';
3
3
  import classNames from 'classnames';
4
4
  import { useFloating, autoUpdate, offset, flip, shift, limitShift, arrow } from '@floating-ui/react-dom';
5
5
  import { CloseIcon } from '@entur/icons';
6
6
  import { IconButton } from '@entur/button';
7
7
  import { space, borderRadiuses } from '@entur/tokens';
8
- import { usePopper } from 'react-popper';
9
8
  import { Contrast } from '@entur/layout';
10
9
 
11
10
  function _extends() {
@@ -35,6 +34,21 @@ function _objectWithoutPropertiesLoose(source, excluded) {
35
34
  return target;
36
35
  }
37
36
 
37
+ function standardisePlacement(placement) {
38
+ switch (placement) {
39
+ case 'top-left':
40
+ return 'top-start';
41
+ case 'top-right':
42
+ return 'top-end';
43
+ case 'bottom-left':
44
+ return 'bottom-start';
45
+ case 'bottom-right':
46
+ return 'bottom-end';
47
+ default:
48
+ return placement;
49
+ }
50
+ }
51
+
38
52
  var _excluded$1 = ["placement", "content", "children", "className", "isOpen", "disableHoverListener", "disableFocusListener", "disableKeyboardListener", "disableClickListner", "showCloseButton", "variant", "style"];
39
53
  /** @deprecated use variant="negative" instead */
40
54
  var error = 'error';
@@ -64,8 +78,8 @@ var Tooltip = function Tooltip(_ref) {
64
78
  setShowTooltip = _useState[1];
65
79
  var tooltipArrowRef = useRef(null);
66
80
  var tooltipId = useRandomId('eds-tooltip');
67
- var hoverOpenTimer;
68
- var hoverCloseTimer;
81
+ var hoverOpenTimer = useRef();
82
+ var hoverCloseTimer = useRef();
69
83
  // calculations for floating-UI tooltip position
70
84
  var _useFloating = useFloating({
71
85
  whileElementsMounted: function whileElementsMounted(ref, _float, update) {
@@ -87,26 +101,23 @@ var Tooltip = function Tooltip(_ref) {
87
101
  middlewareData = _useFloating.middlewareData,
88
102
  actualPlacement = _useFloating.placement;
89
103
  var onMouseEnter = function onMouseEnter() {
90
- clearTimeout(hoverCloseTimer);
91
- hoverOpenTimer = setTimeout(function () {
104
+ clearTimeout(hoverCloseTimer.current);
105
+ hoverOpenTimer.current = setTimeout(function () {
92
106
  setShowTooltip(true);
93
107
  }, 150);
94
108
  };
95
109
  var onMouseLeave = function onMouseLeave() {
96
- clearTimeout(hoverOpenTimer);
97
- hoverCloseTimer = setTimeout(function () {
110
+ clearTimeout(hoverOpenTimer.current);
111
+ hoverCloseTimer.current = setTimeout(function () {
98
112
  setShowTooltip(false);
99
113
  }, 300);
100
114
  };
101
115
  React.useEffect(function () {
102
116
  return function () {
103
- clearTimeout(hoverOpenTimer);
104
- clearTimeout(hoverCloseTimer);
117
+ clearTimeout(hoverOpenTimer.current);
118
+ clearTimeout(hoverCloseTimer.current);
105
119
  };
106
120
  }, []);
107
- React.useEffect(function () {
108
- console.log(actualPlacement);
109
- }, [actualPlacement]);
110
121
  var referenceListenerProps = _extends({
111
122
  'aria-describedby': showTooltip ? tooltipId : undefined
112
123
  }, !disableFocusListener && {
@@ -166,38 +177,8 @@ var Tooltip = function Tooltip(_ref) {
166
177
  }
167
178
  })));
168
179
  };
169
- function standardisePlacement(placement) {
170
- switch (placement) {
171
- case 'top-left':
172
- return 'top-start';
173
- case 'top-right':
174
- return 'top-end';
175
- case 'bottom-left':
176
- return 'bottom-start';
177
- case 'bottom-right':
178
- return 'bottom-end';
179
- default:
180
- return placement;
181
- }
182
- }
183
180
 
184
181
  var _excluded = ["children"];
185
- var PopoverContext = /*#__PURE__*/createContext(undefined);
186
- var usePopoverContext = function usePopoverContext() {
187
- var context = useContext(PopoverContext);
188
- if (context == null) {
189
- throw Error('usePopoverContext must be used within <Popover/>');
190
- }
191
- return context;
192
- };
193
- var useCustomState = function useCustomState(state, setState) {
194
- var _React$useState = React.useState(false),
195
- internalState = _React$useState[0],
196
- setInternalState = _React$useState[1];
197
- var controlled = state !== undefined && setState !== undefined;
198
- if (controlled) return [state, setState, controlled];
199
- return [internalState, setInternalState, controlled];
200
- };
201
182
  var Popover = function Popover(_ref) {
202
183
  var children = _ref.children,
203
184
  _ref$placement = _ref.placement,
@@ -208,86 +189,69 @@ var Popover = function Popover(_ref) {
208
189
  showPopover = _useCustomState[0],
209
190
  setShowPopover = _useCustomState[1],
210
191
  controlled = _useCustomState[2];
211
- var triggerElement = React.useRef(null);
212
- var contentElement = React.useRef(null);
213
- var _usePopper = usePopper(triggerElement.current, contentElement.current, {
214
- modifiers: [{
215
- name: 'arrow',
216
- enabled: false
217
- }, {
218
- name: 'offset',
219
- options: {
220
- offset: [0, 8]
221
- }
222
- }],
223
- placement: placement
192
+ // calculations for floating-UI popover position
193
+ var _useFloating = useFloating({
194
+ whileElementsMounted: function whileElementsMounted(ref, _float, update) {
195
+ return autoUpdate(ref, _float, update);
196
+ },
197
+ placement: standardisePlacement(placement),
198
+ middleware: [offset(space.extraSmall), flip(), shift({
199
+ padding: space.extraSmall,
200
+ limiter: limitShift({
201
+ offset: 8
202
+ })
203
+ })]
224
204
  }),
225
- styles = _usePopper.styles,
226
- attributes = _usePopper.attributes,
227
- forceUpdate = _usePopper.forceUpdate;
228
- React.useEffect(function () {
229
- if (forceUpdate) {
230
- forceUpdate();
231
- }
232
- }, [showPopover, forceUpdate]);
233
- var triggerProps = React.useCallback(function () {
234
- var buttonProps = {
235
- 'aria-haspopup': 'dialog',
236
- 'aria-expanded': showPopover,
237
- ref: triggerElement,
238
- type: 'button'
239
- };
240
- var buttonOnClick = {
241
- onClick: function onClick(e) {
242
- e.preventDefault();
243
- setShowPopover(function (prev) {
244
- return !prev;
245
- });
246
- }
247
- };
248
- return controlled ? buttonProps : _extends({}, buttonProps, buttonOnClick);
249
- }, [triggerElement, showPopover, setShowPopover, controlled]);
250
- useOnClickOutside([contentElement, triggerElement], function () {
205
+ refs = _useFloating.refs,
206
+ floatingStyles = _useFloating.floatingStyles;
207
+ useOnClickOutside([refs.floating, refs.reference], function () {
251
208
  return setShowPopover(false);
252
209
  });
210
+ var popoverTriggerProps = _extends({
211
+ 'aria-haspopup': 'dialog',
212
+ 'aria-expanded': showPopover,
213
+ ref: refs.setReference,
214
+ type: 'button'
215
+ }, !controlled && {
216
+ onClick: function onClick() {
217
+ return setShowPopover(function (prev) {
218
+ return !prev;
219
+ });
220
+ }
221
+ });
222
+ var popoverContentProps = {
223
+ role: 'dialog',
224
+ 'aria-modal': false,
225
+ 'aria-hidden': !showPopover,
226
+ ref: refs.setFloating,
227
+ style: _extends({}, !showPopover && {
228
+ display: 'none'
229
+ }),
230
+ onKeyDown: function onKeyDown(event) {
231
+ if (event.key === 'Escape') setShowPopover(false);
232
+ },
233
+ onBlur: function onBlur(event) {
234
+ var elementReceivingFocus = event.relatedTarget;
235
+ // The check for 'tabindex=-1' is a special case for focus handling in Docz
236
+ if (!elementReceivingFocus || elementReceivingFocus.getAttribute('tabindex') === '-1') return;
237
+ var focusedElementIsPopover = elementContainsElement(refs.floating.current, elementReceivingFocus);
238
+ var focusedElementIsTrigger = elementContainsElement(refs.reference.current, elementReceivingFocus);
239
+ var popoverShouldClose = !focusedElementIsPopover && !focusedElementIsTrigger;
240
+ if (showPopover && popoverShouldClose) setShowPopover(false);
241
+ }
242
+ };
253
243
  var closeButtonProps = {
254
- onClick: function onClick(e) {
255
- e.preventDefault();
256
- setShowPopover(false);
244
+ onClick: function onClick() {
245
+ return setShowPopover(false);
257
246
  },
258
247
  type: 'button'
259
248
  };
260
- var popoverContentProps = React.useCallback(function () {
261
- var contentProps = {
262
- role: 'dialog',
263
- 'aria-modal': 'false',
264
- ref: contentElement,
265
- onKeyDown: function onKeyDown(event) {
266
- if (event.key === 'Escape') {
267
- showPopover && setShowPopover(false);
268
- }
269
- },
270
- onBlur: function onBlur(event) {
271
- var elementReceivingFocus = event.relatedTarget;
272
- // The check for 'tabindex=-1' is a special case for focus handling in Docz
273
- if (!elementReceivingFocus || elementReceivingFocus.getAttribute('tabindex') === '-1') return;
274
- var focusElementIsPopover = elementContainsElement(contentElement.current, elementReceivingFocus);
275
- var focusElementIsTrigger = elementContainsElement(triggerElement.current, elementReceivingFocus);
276
- var isValidBlur = !focusElementIsPopover && !focusElementIsTrigger;
277
- if (showPopover && isValidBlur) setShowPopover(false);
278
- }
279
- };
280
- return contentProps;
281
- }, [contentElement, showPopover, setShowPopover]);
282
249
  var contextValue = {
283
250
  showPopover: showPopover,
284
- triggerElement: triggerElement,
285
- contentElement: contentElement,
286
- styles: styles,
287
- attributes: attributes,
251
+ floatingStyles: floatingStyles,
252
+ popoverTriggerProps: popoverTriggerProps,
288
253
  popoverContentProps: popoverContentProps,
289
- closeButtonProps: closeButtonProps,
290
- triggerProps: triggerProps
254
+ closeButtonProps: closeButtonProps
291
255
  };
292
256
  return React.createElement(PopoverContext.Provider, {
293
257
  value: contextValue
@@ -296,9 +260,9 @@ var Popover = function Popover(_ref) {
296
260
  var PopoverTrigger = function PopoverTrigger(_ref2) {
297
261
  var children = _ref2.children;
298
262
  var _usePopoverContext = usePopoverContext(),
299
- triggerProps = _usePopoverContext.triggerProps;
263
+ popoverTriggerProps = _usePopoverContext.popoverTriggerProps;
300
264
  var child = React.Children.only(children);
301
- return cloneElement(child, triggerProps());
265
+ return cloneElement(child, popoverTriggerProps);
302
266
  };
303
267
  var PopoverCloseButton = function PopoverCloseButton(_ref3) {
304
268
  var children = _ref3.children,
@@ -308,23 +272,36 @@ var PopoverCloseButton = function PopoverCloseButton(_ref3) {
308
272
  return cloneElement(children, _extends({}, closeButtonProps, rest));
309
273
  };
310
274
  var PopoverContent = /*#__PURE__*/React.forwardRef(function (_ref4, ref) {
311
- var children = _ref4.children;
275
+ var children = _ref4.children,
276
+ className = _ref4.className,
277
+ style = _ref4.style;
312
278
  var _usePopoverContext3 = usePopoverContext(),
313
- showPopover = _usePopoverContext3.showPopover,
314
- attributes = _usePopoverContext3.attributes,
315
- styles = _usePopoverContext3.styles,
279
+ floatingStyles = _usePopoverContext3.floatingStyles,
316
280
  popoverContentProps = _usePopoverContext3.popoverContentProps;
317
- var props = popoverContentProps({
318
- ref: ref
319
- });
320
281
  return React.createElement(Contrast, _extends({
321
- className: classNames('eds-popover', {
322
- 'eds-popover--hidden': !showPopover
323
- }, 'eds-contrast'),
324
- style: styles.popper,
325
- "aria-hidden": !showPopover
326
- }, attributes.styles, props), children);
282
+ className: classNames(className, 'eds-popover')
283
+ }, popoverContentProps, {
284
+ style: _extends({}, floatingStyles, popoverContentProps.style, style),
285
+ // @ts-expect-error correct type for floating cannot be set via useFloating
286
+ ref: mergeRefs(popoverContentProps.ref, ref)
287
+ }), children);
327
288
  });
289
+ var PopoverContext = /*#__PURE__*/createContext(undefined);
290
+ var usePopoverContext = function usePopoverContext() {
291
+ var context = useContext(PopoverContext);
292
+ if (context == null) {
293
+ throw Error('usePopoverContext must be used within <Popover/>');
294
+ }
295
+ return context;
296
+ };
297
+ var useCustomState = function useCustomState(state, setState) {
298
+ var _React$useState = React.useState(false),
299
+ internalState = _React$useState[0],
300
+ setInternalState = _React$useState[1];
301
+ var controlled = state !== undefined && setState !== undefined;
302
+ if (controlled) return [state, setState, controlled];
303
+ return [internalState, setInternalState, controlled];
304
+ };
328
305
  function elementContainsElement(parent, child) {
329
306
  if (!parent) return false;
330
307
  return parent === child || parent.contains(child);