tooltip.tsx 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. import { Tooltip as KobalteTooltip } from "@kobalte/core/tooltip"
  2. import { createSignal, Match, 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. contentClass?: string
  8. contentStyle?: JSX.CSSProperties
  9. inactive?: boolean
  10. forceOpen?: boolean
  11. }
  12. export interface TooltipKeybindProps extends Omit<TooltipProps, "value"> {
  13. title: string
  14. keybind: string
  15. }
  16. export function TooltipKeybind(props: TooltipKeybindProps) {
  17. const [local, others] = splitProps(props, ["title", "keybind"])
  18. return (
  19. <Tooltip
  20. {...others}
  21. value={
  22. <div data-slot="tooltip-keybind">
  23. <span>{local.title}</span>
  24. <span data-slot="tooltip-keybind-key">{local.keybind}</span>
  25. </div>
  26. }
  27. />
  28. )
  29. }
  30. export function Tooltip(props: TooltipProps) {
  31. const [open, setOpen] = createSignal(false)
  32. const [local, others] = splitProps(props, [
  33. "children",
  34. "class",
  35. "contentClass",
  36. "contentStyle",
  37. "inactive",
  38. "forceOpen",
  39. "value",
  40. ])
  41. return (
  42. <Switch>
  43. <Match when={local.inactive}>{local.children}</Match>
  44. <Match when={true}>
  45. <KobalteTooltip gutter={4} {...others} open={local.forceOpen || open()} onOpenChange={setOpen}>
  46. <KobalteTooltip.Trigger as={"div"} data-component="tooltip-trigger" class={local.class}>
  47. {local.children}
  48. </KobalteTooltip.Trigger>
  49. <KobalteTooltip.Portal>
  50. <KobalteTooltip.Content
  51. data-component="tooltip"
  52. data-placement={props.placement}
  53. data-force-open={local.forceOpen}
  54. class={local.contentClass}
  55. style={local.contentStyle}
  56. >
  57. {local.value}
  58. {/* <KobalteTooltip.Arrow data-slot="tooltip-arrow" /> */}
  59. </KobalteTooltip.Content>
  60. </KobalteTooltip.Portal>
  61. </KobalteTooltip>
  62. </Match>
  63. </Switch>
  64. )
  65. }