Update tooltip (#187)

* Show article tooltip onClick

* remove unused imports

* Resolve conversations
This commit is contained in:
Ilya Y 2023-08-21 14:15:32 +03:00 committed by GitHub
parent a6cae1abb7
commit f0bb04b33d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 71 additions and 11 deletions

View File

@ -554,9 +554,26 @@ a[data-toggle='tooltip'] {
} }
.tooltip { .tooltip {
@include font-size(1.4rem);
position: relative;
padding: 8px; padding: 8px;
background: #141414; border-radius: 4px;
font-size: 12px;
color: white;
max-width: 400px; max-width: 400px;
box-sizing: border-box;
background: var(--black-500);
color: var(--default-color-invert);
&::after {
content: '';
position: absolute;
left: 50%;
bottom: -4px;
transform: translateX(-50%);
width: 0;
height: 0;
border-style: solid;
border-width: 4px 4px 0 4px;
border-color: var(--black-500) transparent transparent transparent;
}
} }

View File

@ -1,4 +1,4 @@
import { createEffect, For, createMemo, onMount, Show, createSignal } from 'solid-js' import { createEffect, For, createMemo, onMount, Show, createSignal, onCleanup } from 'solid-js'
import { Title } from '@solidjs/meta' import { Title } from '@solidjs/meta'
import { clsx } from 'clsx' import { clsx } from 'clsx'
import { getPagePath } from '@nanostores/router' import { getPagePath } from '@nanostores/router'
@ -128,23 +128,66 @@ export const FullArticle = (props: Props) => {
setIsReactionsLoaded(true) setIsReactionsLoaded(true)
}) })
const clickHandlers = []
const documentClickHandlers = []
onMount(() => { onMount(() => {
const tooltipElements: NodeListOf<HTMLLinkElement> = const tooltipElements: NodeListOf<HTMLLinkElement> =
document.querySelectorAll('[data-toggle="tooltip"]') document.querySelectorAll('[data-toggle="tooltip"]')
if (!tooltipElements) return if (!tooltipElements) return
tooltipElements.forEach((element) => { tooltipElements.forEach((element) => {
const tooltip = document.createElement('div') const tooltip = document.createElement('div')
tooltip.classList.add(styles.tooltip) tooltip.classList.add(styles.tooltip)
tooltip.textContent = element.dataset.originalTitle tooltip.textContent = element.dataset.originalTitle
document.body.appendChild(tooltip) document.body.appendChild(tooltip)
createPopper(element, tooltip, { placement: 'top' }) element.setAttribute('href', 'javascript: void(0);')
createPopper(element, tooltip, {
placement: 'top',
modifiers: [
{
name: 'offset',
options: {
offset: [0, 8]
}
}
]
})
tooltip.style.visibility = 'hidden' tooltip.style.visibility = 'hidden'
element.addEventListener('mouseenter', () => { let isTooltipVisible = false
tooltip.style.visibility = 'visible'
}) const handleClick = () => {
element.addEventListener('mouseleave', () => { if (isTooltipVisible) {
tooltip.style.visibility = 'hidden' tooltip.style.visibility = 'hidden'
}) isTooltipVisible = false
} else {
tooltip.style.visibility = 'visible'
isTooltipVisible = true
}
}
const handleDocumentClick = (e) => {
if (isTooltipVisible && e.target !== element && e.target !== tooltip) {
tooltip.style.visibility = 'hidden'
isTooltipVisible = false
}
}
element.addEventListener('click', handleClick)
document.addEventListener('click', handleDocumentClick)
clickHandlers.push({ element, handler: handleClick })
documentClickHandlers.push(handleDocumentClick)
})
})
onCleanup(() => {
clickHandlers.forEach(({ element, handler }) => {
element.removeEventListener('click', handler)
})
documentClickHandlers.forEach((handler) => {
document.removeEventListener('click', handler)
}) })
}) })