@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.
- package/dist/Popover.d.ts +3 -1
- package/dist/Tooltip.d.ts +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/styles.css +160 -163
- package/dist/tooltip.cjs.development.js +104 -127
- package/dist/tooltip.cjs.development.js.map +1 -1
- package/dist/tooltip.cjs.production.min.js +1 -1
- package/dist/tooltip.cjs.production.min.js.map +1 -1
- package/dist/tooltip.esm.js +105 -128
- package/dist/tooltip.esm.js.map +1 -1
- package/dist/utils.d.ts +3 -0
- package/package.json +7 -9
|
@@ -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"),
|
|
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":"81BAqOA,SAASA,EAAqBC,GAC5B,OAAQA,GACN,IAAK,WACH,MAAO,YACT,IAAK,YACH,MAAO,UACT,IAAK,cACH,MAAO,eACT,IAAK,eACH,MAAO,aACT,QACE,OAAOA,EAEb,oBCrNMC,EAAiBC,EAAAA,mBACrBC,GAEIC,EAAoB,WACxB,IAAMC,EAAUC,aAAWL,GAC3B,GAAe,MAAXI,EACF,MAAME,MAAM,oDAEd,OAAOF,CACT,EAqKaG,EAAiBC,EAAMC,YAGlC,SAAeC,EAAAA,GAAkC,IAA9CC,IAAAA,SACHC,EACET,IADMU,IAAAA,YAAaC,IAAAA,WAAYC,IAAAA,OAE3BC,GAAQC,IAF2BA,qBAEP,CAAEP,IAAAA,IACpC,OACEF,gBAACU,EAAQA,SAAAC,EAAA,CACPC,UAAWC,EACT,cACA,CACE,uBAAwBR,GAE1B,gBAEFS,MAAOP,EAAOQ,OACD,eAACV,GACVC,EAAWC,OACXC,GAEHL,EAGP,IAEA,SAASa,EACPC,EACAC,GAEA,QAAKD,IACEA,IAAWC,GAASD,EAAOE,SAASD,GAC7C,CCxOAE,EAAsBA,uBAAC,2BD4DwB,SAK1CC,GAAA,IAJHlB,IAAAA,SAAQmB,EAAAD,EACR9B,UAAAA,aAAY,eAAc+B,EAI1BC,EA7BqB,SACrBC,EACAC,GAEA,IAAAC,EAA0C1B,EAAM2B,UAAkB,GAC5DC,OAAuBlC,IAAV8B,QAAoC9B,IAAb+B,EAC1C,OAAIG,EAAmB,CAACJ,EAAOC,EAAUG,GAClC,CAHaF,EAAA,GAAkBA,EAAA,GAGGE,EAC3C,CAqBoDC,GAHlDxB,cACAyB,gBAEOzB,EAAWkB,EAAA,GAAEO,EAAcP,EAAA,GAAEK,EAAUL,EAAA,GAIxCQ,EAAiB/B,EAAMgC,OAAO,MAC9BC,EAAiBjC,EAAMgC,OAAO,MAEQE,EAAAA,EAAAA,UAC1CH,EAAeI,QACfF,EAAeE,QACf,CACEC,UAAW,CACT,CAAEC,KAAM,QAASC,SAAS,GAC1B,CACED,KAAM,SACNE,QAAS,CACPC,OAAQ,CAAC,EAAG,MAIlBjD,UAAWA,IAbPgB,IAAAA,OAAQD,IAAAA,WAAYmC,IAAAA,YAiB5BzC,EAAM0C,WAAU,WACVD,GACFA,GAEJ,GAAG,CAACpC,EAAaoC,IAEjB,IAAME,EAAe3C,EAAM4C,aAAY,WACrC,IAAMC,EAAc,CAClB,gBAAiB,SACjB,gBAAiBxC,EACjBH,IAAK6B,EACLe,KAAM,UAQR,OAAOlB,EAAaiB,OAAmBA,EANjB,CACpBE,QAAS,SAACC,GACRA,EAAEC,iBACFnB,GAAe,SAAAoB,GAAI,OAAKA,IAC1B,GAGH,GAAE,CAACnB,EAAgB1B,EAAayB,EAAgBF,IAEjDuB,EAAAA,kBAAkB,CAAClB,EAAgBF,IAAiB,WAAA,OAClDD,GAAe,MAEjB,IAAMsB,EAAmB,CACvBL,QAAS,SAACC,GACRA,EAAEC,iBACFnB,GAAe,EAChB,EACDgB,KAAM,UAEFrC,EAAsBT,EAAM4C,aAAY,WA8B5C,MA7BqB,CACnBS,KAAM,SACN,aAAc,QACdnD,IAAK+B,EACLqB,UAAW,SAACC,GACQ,WAAdA,EAAMC,KACRnD,GAAeyB,GAAe,EAEjC,EACD2B,OAAQ,SAACF,GACP,IAAMG,EAAwBH,EAAMI,cAEpC,GACGD,GACkD,OAAnDA,EAAsBE,aAAa,YAFrC,CAKA,IAAMC,EAAwB7C,EAC5BiB,EAAeE,QACfuB,GAEII,EAAwB9C,EAC5Be,EAAeI,QACfuB,GAGErD,IADiBwD,IAA0BC,GACfhC,GAAe,EAV7C,CAWJ,EAGH,GAAE,CAACG,EAAgB5B,EAAayB,IAWjC,OACE9B,EAAA+D,cAACvE,EAAewE,SAAQ,CAACC,MAXe,CACxC5D,YAAAA,EACA0B,eAAAA,EACAE,eAAAA,EACA1B,OAAAA,EACAD,WAAAA,EACAG,oBAAAA,EACA2C,iBAAAA,EACAT,aAAAA,IAIGxC,EAGP,6BAkBqE,SAGhE+D,GAAA,IAFH/D,IAAAA,SACGgE,EAAIC,EAAAF,EAAAG,GAEPC,EAA6B3E,IAC7B,OAAO4E,EAAAA,aAAapE,SADZiD,iBACgDe,GAC1D,kDAjB6D,SAAiBK,GAAA,IAAdrE,IAAAA,SACtDwC,EAAiBhD,IAAjBgD,aACFzB,EAAQlB,EAAMyE,SAASC,KAAKvE,GAClC,OAAOoE,eAAarD,EAAOyB,IAC7B,kBD1F+C,SAc1CtB,GAAA,IAAAsD,EAAAC,EAAAC,EAICC,EACAC,EAlBJxF,IAAAA,UACAyF,IAAAA,QACA7E,IAAAA,SACAS,IAAAA,UAASqE,EAAA5D,EACT6D,OAAAA,cAAcD,EAAAE,EAAA9D,EACd+D,qBAAAA,cAA4BD,EAAAE,EAAAhE,EAC5BiE,qBAAAA,cAA4BD,EAAAE,EAAAlE,EAC5BmE,wBAAAA,cAA8BD,EAAAE,EAAApE,EAC9BqE,oBAAAA,cAA0BD,EAAAE,EAAAtE,EAC1BuE,gBAAAA,cAAsBD,EACtBE,IAAAA,QACA/E,IAAAA,MACGqD,EAAIC,EAAA/C,EAAAgD,GAE+B1C,EAAAA,EAAQA,SAACuD,GAAxCY,EAAWC,EAAA,GAAEC,EAAcD,EAAA,GAC5BE,EAAkBjE,SAAO,MACzBkE,EAAYC,cAAY,eAK9BC,EAKIC,EAAAA,YAAY,CACdC,qBAAsB,SAACpG,EAAKqG,EAAOC,GAAM,OACvCC,aAAWvG,EAAKqG,EAAOC,EAAO,EAChCjH,UAAWD,EAAqBC,GAChCmH,WAAY,CACVlE,EAAAA,OAAOmE,EAAKA,MAACC,YACbC,EAAAA,OACAC,QAAM,CAAEC,QAASJ,EAAKA,MAACC,WAAYI,QAASC,EAAAA,WAAW,CAAEzE,OAAQ,MACjE0E,EAAAA,MAAM,CACJC,QAASlB,EACTc,QAASK,EAAcA,eAACC,YAd5BC,IAAAA,KACAC,IAAAA,eACAC,IAAAA,eACWC,IAAXlI,UAgBImI,EAAe,WACnBC,aAAa5C,GACbD,EAAiB8C,YAAW,WAC1B5B,GAAe,EAChB,GAAE,MAGC6B,EAAe,WACnBF,aAAa7C,GACbC,EAAkB6C,YAAW,WAC3B5B,GAAe,EAChB,GAAE,MAGLhG,EAAM0C,WAAU,WACd,OAAO,WACLiF,aAAa7C,GACb6C,aAAa5C,GAEhB,GAAE,IACH/E,EAAM0C,WAAU,WACdoF,QAAQC,IAAIN,EACd,GAAG,CAACA,IAEJ,IAAMO,EAAsBrH,EAAA,CAC1B,mBAAoBmF,EAAcI,OAAYxG,IAEzC4F,GAAwB,CAAE2C,QAAS,WAAA,OAAMjC,GAAe,EAAK,IAC7DV,GAAwB,CAAE7B,OAAQ,WAAA,OAAMuC,GAAe,EAAM,IAE7DZ,GAAwB,CAAEsC,aAAAA,IAC1BtC,GAAwB,CAAEyC,aAAAA,IAE1BrC,GAA2B,CAC9BlC,UAAW,SAAAN,GACK,WAAVA,EAAEQ,KAAkBwC,GAAe,GACzB,MAAVhD,EAAEQ,KAAyB,UAAVR,EAAEQ,MACrBR,EAAEC,iBACF+C,GAAgBF,GAEpB,IAGGJ,GAAuB,CAC1B3C,QAAS,WAAA,OAAMiD,GAAgBF,EAAY,IAI/C,OACE9F,EAAA+D,cAAA/D,EAAAkI,SAAA,KACG3D,EAAYA,aAACpE,EAAQQ,EAAA,CACpBT,IAAKoH,EAAKa,cACPH,IAELhI,EAAA+D,cAAA,MAAApD,EAAA,CACEC,UAAWC,EAAWD,EAAW,cAAe,CAC9C,wBAtII,UAsIqBiF,GAAiC,aAAZA,IAEhD3F,IAAKoH,EAAKc,YACVtH,WACKyG,EAAc,CACjBc,QAASvC,GAAed,OAAUtF,EAAY,QAC3CoB,GAELuC,KAAK,UACLiF,GAAIpC,EACJwB,aAAetC,OAAsC1F,EAAfgI,EACtCG,aAAezC,OAAsC1F,EAAfmI,GAClC1D,GAEHa,EACAE,GAAUU,GACT5F,EAAA+D,cAACwE,aACC,CAAA3H,UAAU,4BACVmC,QAAS,WAAA,OAAMiD,GAAe,EAAM,EACpClD,KAAK,SAAQ,aACF,gBAEX9C,EAAA+D,cAACyE,YAAS,CAAA,cAAa,UAG3BxI,EACE+D,cAAA,MAAA,CAAAnD,UAAkC6G,wBAAAA,MAAAA,GAA2B,OAA3BA,EAAAA,EAAiBgB,MAAM,WAAvBhB,EAAA9C,EAA8B,IAChEzE,IAAK+F,EACLnF,MAAO,CACL4H,KAA0B,SAApBlB,EAAeN,YAAK,EAApBtC,EAAsB+D,EAC5BC,WAAKpB,EAAAA,EAAeN,cAAfrC,EAAsBgE,MAMvC"}
|
|
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"}
|
package/dist/tooltip.esm.js
CHANGED
|
@@ -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
|
-
|
|
212
|
-
var
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
offset:
|
|
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
|
-
|
|
226
|
-
|
|
227
|
-
|
|
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(
|
|
255
|
-
|
|
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
|
-
|
|
285
|
-
|
|
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
|
-
|
|
263
|
+
popoverTriggerProps = _usePopoverContext.popoverTriggerProps;
|
|
300
264
|
var child = React.Children.only(children);
|
|
301
|
-
return cloneElement(child,
|
|
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
|
-
|
|
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
|
-
|
|
323
|
-
},
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
}
|
|
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);
|