nopopper-fix
All checks were successful
deploy / testbuild (push) Successful in 2m15s
deploy / Update templates on Mailgun (push) Has been skipped

This commit is contained in:
Untone 2024-10-09 18:13:56 +03:00
parent 45bd8674f8
commit 16da6e94cf
3 changed files with 38 additions and 59 deletions

15
package-lock.json generated
View File

@ -98,7 +98,6 @@
"rollup-plugin-visualizer": "^5.12.0", "rollup-plugin-visualizer": "^5.12.0",
"sass": "^1.79.4", "sass": "^1.79.4",
"solid-js": "^1.9.2", "solid-js": "^1.9.2",
"solid-popper": "^0.3.0",
"solid-tiptap": "0.7.0", "solid-tiptap": "0.7.0",
"solid-transition-group": "^0.2.3", "solid-transition-group": "^0.2.3",
"storybook": "^8.3.5", "storybook": "^8.3.5",
@ -22674,20 +22673,6 @@
"seroval-plugins": "^1.1.0" "seroval-plugins": "^1.1.0"
} }
}, },
"node_modules/solid-popper": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/solid-popper/-/solid-popper-0.3.0.tgz",
"integrity": "sha512-XlfEWAyxGGqFgg/uRpF+BemSfCqjbLA8p6fToDa+6v3paw3eBQj0TU08aBOIj2VeigaEiz8ZTlDx1eBLVRivBg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=10"
},
"peerDependencies": {
"@popperjs/core": "^2.11",
"solid-js": "^1.2"
}
},
"node_modules/solid-refresh": { "node_modules/solid-refresh": {
"version": "0.6.3", "version": "0.6.3",
"resolved": "https://registry.npmjs.org/solid-refresh/-/solid-refresh-0.6.3.tgz", "resolved": "https://registry.npmjs.org/solid-refresh/-/solid-refresh-0.6.3.tgz",

View File

@ -105,7 +105,6 @@
"rollup-plugin-visualizer": "^5.12.0", "rollup-plugin-visualizer": "^5.12.0",
"sass": "^1.79.4", "sass": "^1.79.4",
"solid-js": "^1.9.2", "solid-js": "^1.9.2",
"solid-popper": "^0.3.0",
"solid-tiptap": "0.7.0", "solid-tiptap": "0.7.0",
"solid-transition-group": "^0.2.3", "solid-transition-group": "^0.2.3",
"storybook": "^8.3.5", "storybook": "^8.3.5",

View File

@ -1,5 +1,5 @@
import { JSX, Show, createSignal, onMount } from 'solid-js' import { JSX, Show, createSignal, onCleanup, onMount } from 'solid-js'
import usePopper from 'solid-popper' import { createTooltip } from '~/lib/createTooltip'
import styles from './Popover.module.scss' import styles from './Popover.module.scss'
@ -7,63 +7,58 @@ type Props = {
children: (setTooltipEl: (el: HTMLElement | null) => void) => JSX.Element children: (setTooltipEl: (el: HTMLElement | null) => void) => JSX.Element
content: string | JSX.Element content: string | JSX.Element
disabled?: boolean disabled?: boolean
placement?: 'top' | 'bottom' | 'left' | 'right'
offset?: [number, number]
} }
export const Popover = (props: Props) => { export const Popover = (props: Props) => {
const [show, setShow] = createSignal(false) const [show, setShow] = createSignal(false)
const [anchor, setAnchor] = createSignal<HTMLElement>() const [anchor, setAnchor] = createSignal<HTMLElement>()
const [popper, setPopper] = createSignal<HTMLElement>() const [tooltip, setTooltip] = createSignal<HTMLElement>()
usePopper(anchor, popper, { let tooltipInstance: ReturnType<typeof createTooltip> | undefined
modifiers: [
{ onMount(() => {
name: 'offset', const anchorEl = anchor()
options: { const tooltipEl = tooltip()
offset: [0, 8]
} if (anchorEl && tooltipEl && !props.disabled) {
}, tooltipInstance = createTooltip(anchorEl, tooltipEl, {
{ placement: props.placement || 'top',
name: 'flip', offset: props.offset || [0, 8]
options: { })
fallbackPlacements: ['top', 'bottom'] }
}
}
]
}) })
const showEvents = ['mouseenter', 'focus'] onCleanup(() => {
const hideEvents = ['mouseleave', 'blur'] tooltipInstance?.destroy()
})
const handleMouseOver = () => setShow(true) const handleMouseOver = () => {
const handleMouseOut = () => setShow(false) if (!props.disabled) {
setShow(true)
tooltipInstance?.update()
}
}
if (!props.disabled) { const handleMouseOut = () => {
onMount(() => { setShow(false)
if (!anchor()) return
showEvents.forEach((event) => {
anchor()?.addEventListener(event, handleMouseOver)
})
hideEvents.forEach((event) => {
anchor()?.addEventListener(event, handleMouseOut)
})
return () => {
showEvents.forEach((event) => {
anchor()?.removeEventListener(event, handleMouseOver)
})
hideEvents.forEach((event) => {
anchor()?.removeEventListener(event, handleMouseOut)
})
}
})
} }
return ( return (
<> <>
{props.children(setAnchor)} <div
onMouseEnter={handleMouseOver}
onMouseLeave={handleMouseOut}
onFocusIn={handleMouseOver}
onFocusOut={handleMouseOut}
>
{props.children(setAnchor)}
</div>
<Show when={show() && !props.disabled}> <Show when={show() && !props.disabled}>
<div ref={setPopper} class={styles.tooltip}> <div ref={setTooltip} class={styles.tooltip}>
{props.content} {props.content}
<div class={styles.arrow} data-popper-arrow={true} /> <div class={styles.arrow} />
</div> </div>
</Show> </Show>
</> </>