tooltip.tsx 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. import { Tooltip as KobalteTooltip } from "@kobalte/core/tooltip"
  2. import { children, createSignal, Match, onMount, splitProps, Switch, type JSX } from "solid-js"
  3. import type { ComponentProps } from "solid-js"
  4. export interface TooltipProps extends ComponentProps<typeof KobalteTooltip> {
  5. value: JSX.Element
  6. class?: string
  7. inactive?: boolean
  8. }
  9. export function Tooltip(props: TooltipProps) {
  10. const [open, setOpen] = createSignal(false)
  11. const [local, others] = splitProps(props, ["children", "class", "inactive"])
  12. const c = children(() => local.children)
  13. onMount(() => {
  14. const childElements = c()
  15. if (childElements instanceof HTMLElement) {
  16. childElements.addEventListener("focus", () => setOpen(true))
  17. childElements.addEventListener("blur", () => setOpen(false))
  18. } else if (Array.isArray(childElements)) {
  19. for (const child of childElements) {
  20. if (child instanceof HTMLElement) {
  21. child.addEventListener("focus", () => setOpen(true))
  22. child.addEventListener("blur", () => setOpen(false))
  23. }
  24. }
  25. }
  26. })
  27. return (
  28. <Switch>
  29. <Match when={local.inactive}>{local.children}</Match>
  30. <Match when={true}>
  31. <KobalteTooltip forceMount gutter={4} {...others} open={open()} onOpenChange={setOpen}>
  32. <KobalteTooltip.Trigger as={"div"} data-component="tooltip-trigger" class={local.class}>
  33. {c()}
  34. </KobalteTooltip.Trigger>
  35. <KobalteTooltip.Portal>
  36. <KobalteTooltip.Content data-component="tooltip" data-placement={props.placement}>
  37. {others.value}
  38. {/* <KobalteTooltip.Arrow data-slot="tooltip-arrow" /> */}
  39. </KobalteTooltip.Content>
  40. </KobalteTooltip.Portal>
  41. </KobalteTooltip>
  42. </Match>
  43. </Switch>
  44. )
  45. }