Skip to main content
The Tooltip component wraps Gantt and displays a floating tooltip when the user hovers over a task bar. You can use the default tooltip or supply your own Svelte component to render custom content.

Basic setup

Wrap Gantt with Tooltip and pass the shared api:
<script>
  import { Gantt, Tooltip } from "@svar-ui/svelte-gantt";
  import { getData } from "./data";

  const data = getData();
  let api = $state();
</script>

<Tooltip {api}>
  <Gantt
    tasks={data.tasks}
    links={data.links}
    scales={data.scales}
    bind:this={api}
  />
</Tooltip>

Tooltip props

api
IApi
The Gantt API object. The tooltip component uses it to read the hovered task’s data.
content
Component<{ data: ITask }>
A Svelte component used to render the tooltip body. It receives the hovered task as data.

Custom tooltip content

Create a Svelte component that accepts a data prop of type ITask and render whatever you need:
<!-- MyTooltipContent.svelte -->
<script>
  import { format } from "date-fns";
  let { data } = $props();

  const mask = "yyyy.MM.dd";
</script>

{#if data}
  <div class="data">
    <div class="text">
      <span class="caption">{data.type}:</span>
      {data.text}
    </div>
    <div class="text">
      <span class="caption">start:</span>
      {format(data.start, mask)}
    </div>
    {#if data.end}
      <div class="text">
        <span class="caption">end:</span>
        {format(data.end, mask)}
      </div>
    {/if}
  </div>
{/if}

<style>
  .data {
    white-space: nowrap;
    background-color: var(--wx-tooltip-background);
    padding: 3px 8px;
  }
  .text {
    font-family: var(--wx-font-family);
    color: var(--wx-color-primary-font);
    font-size: 13px;
    text-transform: capitalize;
    margin-bottom: 5px;
  }
  .text:last-child {
    margin-bottom: 0;
  }
  .caption {
    font-weight: 700;
  }
</style>
Then pass the component to Tooltip via the content prop:
<script>
  import { Gantt, Tooltip } from "@svar-ui/svelte-gantt";
  import MyTooltipContent from "./MyTooltipContent.svelte";
  import { getData } from "./data";

  const data = getData();
  let api = $state();
</script>

<Tooltip {api} content={MyTooltipContent}>
  <Gantt
    tasks={data.tasks}
    links={data.links}
    scales={data.scales}
    bind:this={api}
  />
</Tooltip>

Tooltip with children slot

Instead of the content prop you can pass markup directly as children. The Tooltip component forwards children into the tooltip container:
<script>
  import { Gantt, Tooltip } from "@svar-ui/svelte-gantt";
  import { getData } from "./data";

  const data = getData();
  let api = $state();
</script>

<Tooltip {api}>
  {#snippet children()}
    <div style="padding: 4px 8px; font-weight: bold;">Custom tooltip</div>
  {/snippet}
  <Gantt
    tasks={data.tasks}
    links={data.links}
    scales={data.scales}
    bind:this={api}
  />
</Tooltip>
Use content when you need access to the hovered task’s data inside the tooltip. Use children for static content that does not depend on the task.

Build docs developers (and LLMs) love