Charts · Distributions & comparisons
IntervalChart
| task | crew | from | to | length |
|---|---|---|---|---|
| Signage | North crew | 2026-03-15 | 2026-03-21 | 6 |
| Grading | North crew | 2026-02-17 | 2026-03-07 | 18 |
| Signage | North crew | 2026-03-09 | 2026-03-31 | 22 |
| Drainage | North crew | 2026-02-19 | 2026-02-24 | 5 |
| Grading | North crew | 2026-02-21 | 2026-03-16 | 23 |
| Fencing | South crew | 2026-02-20 | 2026-03-05 | 13 |
| Paving | South crew | 2026-01-02 | 2026-01-16 | 14 |
| Paving | South crew | 2026-03-03 | 2026-03-09 | 6 |
| Formwork | South crew | 2026-03-06 | 2026-03-10 | 4 |
| Lighting | Bridge team | 2026-01-26 | 2026-02-08 | 13 |
| Drainage | Bridge team | 2026-02-26 | 2026-03-16 | 18 |
| Fencing | Bridge team | 2026-02-04 | 2026-02-19 | 15 |
| Grading | Bridge team | 2026-03-14 | 2026-03-31 | 17 |
| Formwork | Survey | 2026-03-22 | 2026-03-31 | 9 |
| Signage | Survey | 2026-02-21 | 2026-03-08 | 15 |
| Grading | Survey | 2026-03-17 | 2026-03-26 | 9 |
| task | crew | from | to | length |
|---|---|---|---|---|
| Signage | North crew | 2026-03-15 | 2026-03-21 | 6 |
| Grading | North crew | 2026-02-17 | 2026-03-07 | 18 |
| Signage | North crew | 2026-03-09 | 2026-03-31 | 22 |
| Drainage | North crew | 2026-02-19 | 2026-02-24 | 5 |
| Grading | North crew | 2026-02-21 | 2026-03-16 | 23 |
| Fencing | South crew | 2026-02-20 | 2026-03-05 | 13 |
| Paving | South crew | 2026-01-02 | 2026-01-16 | 14 |
| Paving | South crew | 2026-03-03 | 2026-03-09 | 6 |
| Formwork | South crew | 2026-03-06 | 2026-03-10 | 4 |
| Lighting | Bridge team | 2026-01-26 | 2026-02-08 | 13 |
| Drainage | Bridge team | 2026-02-26 | 2026-03-16 | 18 |
| Fencing | Bridge team | 2026-02-04 | 2026-02-19 | 15 |
| Grading | Bridge team | 2026-03-14 | 2026-03-31 | 17 |
| Formwork | Survey | 2026-03-22 | 2026-03-31 | 9 |
| Signage | Survey | 2026-02-21 | 2026-03-08 | 15 |
| Grading | Survey | 2026-03-17 | 2026-03-26 | 9 |
| task | crew | from | to | length |
|---|---|---|---|---|
| Signage | North crew | 2026-03-15 | 2026-03-21 | 6 |
| Grading | North crew | 2026-02-17 | 2026-03-07 | 18 |
| Signage | North crew | 2026-03-09 | 2026-03-31 | 22 |
| Drainage | North crew | 2026-02-19 | 2026-02-24 | 5 |
| Grading | North crew | 2026-02-21 | 2026-03-16 | 23 |
| Fencing | South crew | 2026-02-20 | 2026-03-05 | 13 |
| Paving | South crew | 2026-01-02 | 2026-01-16 | 14 |
| Paving | South crew | 2026-03-03 | 2026-03-09 | 6 |
| Formwork | South crew | 2026-03-06 | 2026-03-10 | 4 |
| Lighting | Bridge team | 2026-01-26 | 2026-02-08 | 13 |
| Drainage | Bridge team | 2026-02-26 | 2026-03-16 | 18 |
| Fencing | Bridge team | 2026-02-04 | 2026-02-19 | 15 |
| Grading | Bridge team | 2026-03-14 | 2026-03-31 | 17 |
| Formwork | Survey | 2026-03-22 | 2026-03-31 | 9 |
| Signage | Survey | 2026-02-21 | 2026-03-08 | 15 |
| Grading | Survey | 2026-03-17 | 2026-03-26 | 9 |
| task | crew | from | to | length |
|---|---|---|---|---|
| Signage | North crew | 2026-03-15 | 2026-03-21 | 6 |
| Grading | North crew | 2026-02-17 | 2026-03-07 | 18 |
| Signage | North crew | 2026-03-09 | 2026-03-31 | 22 |
| Drainage | North crew | 2026-02-19 | 2026-02-24 | 5 |
| Grading | North crew | 2026-02-21 | 2026-03-16 | 23 |
| Fencing | South crew | 2026-02-20 | 2026-03-05 | 13 |
| Paving | South crew | 2026-01-02 | 2026-01-16 | 14 |
| Paving | South crew | 2026-03-03 | 2026-03-09 | 6 |
| Formwork | South crew | 2026-03-06 | 2026-03-10 | 4 |
| Lighting | Bridge team | 2026-01-26 | 2026-02-08 | 13 |
| Drainage | Bridge team | 2026-02-26 | 2026-03-16 | 18 |
| Fencing | Bridge team | 2026-02-04 | 2026-02-19 | 15 |
| Grading | Bridge team | 2026-03-14 | 2026-03-31 | 17 |
| Formwork | Survey | 2026-03-22 | 2026-03-31 | 9 |
| Signage | Survey | 2026-02-21 | 2026-03-08 | 15 |
| Grading | Survey | 2026-03-17 | 2026-03-26 | 9 |
Example
The chart above, in each framework. Pick a framework once and every example on the site follows it. `axis="date"` reads ISO `YYYY-MM-DD` days in UTC.
npm install @silverpoint/react @silverpoint/grounds @silverpoint/fontsimport '@silverpoint/fonts/fonts.css';
import '@silverpoint/grounds/styles.css';
import { IntervalChart } from '@silverpoint/react/interval-chart';
const data = [
{ crew: 'North crew', task: 'Signage', from: '2026-03-15', to: '2026-03-21' },
{ crew: 'North crew', task: 'Grading', from: '2026-02-17', to: '2026-03-07' },
{ crew: 'North crew', task: 'Signage', from: '2026-03-09', to: '2026-03-31' },
{ crew: 'North crew', task: 'Drainage', from: '2026-02-19', to: '2026-02-24' },
{ crew: 'North crew', task: 'Grading', from: '2026-02-21', to: '2026-03-16' },
{ crew: 'South crew', task: 'Fencing', from: '2026-02-20', to: '2026-03-05' },
{ crew: 'South crew', task: 'Paving', from: '2026-01-02', to: '2026-01-16' },
{ crew: 'South crew', task: 'Paving', from: '2026-03-03', to: '2026-03-09' },
{ crew: 'South crew', task: 'Formwork', from: '2026-03-06', to: '2026-03-10' },
{ crew: 'Bridge team', task: 'Lighting', from: '2026-01-26', to: '2026-02-08' },
{ crew: 'Bridge team', task: 'Drainage', from: '2026-02-26', to: '2026-03-16' },
{ crew: 'Bridge team', task: 'Fencing', from: '2026-02-04', to: '2026-02-19' },
// … 4 more rows of the same shape
];
export default function App() {
return (
<div style={{ width: 480 }}>
<IntervalChart
data={data}
laneKey="crew"
startKey="from"
endKey="to"
labelKey="task"
axis="date"
title="Crew schedule"
/>
</div>
);
}npm install @silverpoint/vue @silverpoint/grounds @silverpoint/fonts<script setup lang="ts">
import '@silverpoint/fonts/fonts.css';
import '@silverpoint/grounds/styles.css';
import { SpIntervalChart } from '@silverpoint/vue/interval-chart';
const data = [
{ crew: 'North crew', task: 'Signage', from: '2026-03-15', to: '2026-03-21' },
{ crew: 'North crew', task: 'Grading', from: '2026-02-17', to: '2026-03-07' },
{ crew: 'North crew', task: 'Signage', from: '2026-03-09', to: '2026-03-31' },
{ crew: 'North crew', task: 'Drainage', from: '2026-02-19', to: '2026-02-24' },
{ crew: 'North crew', task: 'Grading', from: '2026-02-21', to: '2026-03-16' },
{ crew: 'South crew', task: 'Fencing', from: '2026-02-20', to: '2026-03-05' },
{ crew: 'South crew', task: 'Paving', from: '2026-01-02', to: '2026-01-16' },
{ crew: 'South crew', task: 'Paving', from: '2026-03-03', to: '2026-03-09' },
{ crew: 'South crew', task: 'Formwork', from: '2026-03-06', to: '2026-03-10' },
{ crew: 'Bridge team', task: 'Lighting', from: '2026-01-26', to: '2026-02-08' },
{ crew: 'Bridge team', task: 'Drainage', from: '2026-02-26', to: '2026-03-16' },
{ crew: 'Bridge team', task: 'Fencing', from: '2026-02-04', to: '2026-02-19' },
// … 4 more rows of the same shape
];
</script>
<template>
<div style="width: 480px">
<SpIntervalChart
:data="data"
lane-key="crew"
start-key="from"
end-key="to"
label-key="task"
axis="date"
title="Crew schedule"
/>
</div>
</template>npm install @silverpoint/angular @silverpoint/grounds @silverpoint/fonts// src/styles.css:
// @import '@silverpoint/fonts/fonts.css';
// @import '@silverpoint/grounds/styles.css';
import { Component } from '@angular/core';
import { SpIntervalChart } from '@silverpoint/angular/interval-chart';
@Component({
selector: 'app-root',
imports: [SpIntervalChart],
template: `
<div style="width: 480px">
<sp-interval-chart
[data]="data"
laneKey="crew"
startKey="from"
endKey="to"
labelKey="task"
axis="date"
title="Crew schedule"
/>
</div>
`,
})
export class App {
protected readonly data = [
{ crew: 'North crew', task: 'Signage', from: '2026-03-15', to: '2026-03-21' },
{ crew: 'North crew', task: 'Grading', from: '2026-02-17', to: '2026-03-07' },
{ crew: 'North crew', task: 'Signage', from: '2026-03-09', to: '2026-03-31' },
{ crew: 'North crew', task: 'Drainage', from: '2026-02-19', to: '2026-02-24' },
{ crew: 'North crew', task: 'Grading', from: '2026-02-21', to: '2026-03-16' },
{ crew: 'South crew', task: 'Fencing', from: '2026-02-20', to: '2026-03-05' },
{ crew: 'South crew', task: 'Paving', from: '2026-01-02', to: '2026-01-16' },
{ crew: 'South crew', task: 'Paving', from: '2026-03-03', to: '2026-03-09' },
{ crew: 'South crew', task: 'Formwork', from: '2026-03-06', to: '2026-03-10' },
{ crew: 'Bridge team', task: 'Lighting', from: '2026-01-26', to: '2026-02-08' },
{ crew: 'Bridge team', task: 'Drainage', from: '2026-02-26', to: '2026-03-16' },
{ crew: 'Bridge team', task: 'Fencing', from: '2026-02-04', to: '2026-02-19' },
// … 4 more rows of the same shape
];
}pip install reflex-silverpoint-reactimport reflex as rx
from reflex_silverpoint_react import interval_chart
DATA = [
{"crew": "North crew", "task": "Signage", "from": "2026-03-15", "to": "2026-03-21"},
{"crew": "North crew", "task": "Grading", "from": "2026-02-17", "to": "2026-03-07"},
{"crew": "North crew", "task": "Signage", "from": "2026-03-09", "to": "2026-03-31"},
{"crew": "North crew", "task": "Drainage", "from": "2026-02-19", "to": "2026-02-24"},
{"crew": "North crew", "task": "Grading", "from": "2026-02-21", "to": "2026-03-16"},
{"crew": "South crew", "task": "Fencing", "from": "2026-02-20", "to": "2026-03-05"},
{"crew": "South crew", "task": "Paving", "from": "2026-01-02", "to": "2026-01-16"},
{"crew": "South crew", "task": "Paving", "from": "2026-03-03", "to": "2026-03-09"},
{"crew": "South crew", "task": "Formwork", "from": "2026-03-06", "to": "2026-03-10"},
{"crew": "Bridge team", "task": "Lighting", "from": "2026-01-26", "to": "2026-02-08"},
{"crew": "Bridge team", "task": "Drainage", "from": "2026-02-26", "to": "2026-03-16"},
{"crew": "Bridge team", "task": "Fencing", "from": "2026-02-04", "to": "2026-02-19"},
# … 4 more rows of the same shape
]
def index() -> rx.Component:
return rx.box(
interval_chart(
data=DATA,
lane_key="crew",
start_key="from",
end_key="to",
label_key="task",
axis="date",
title="Crew schedule",
),
width="480px",
)
app = rx.App()
app.add_page(index)Import
Each chart has its own subpath, so a bundle only carries the charts it uses. Every adapter also exports every chart from its barrel.
| Framework | Import |
|---|---|
| React | import { IntervalChart } from '@silverpoint/react/interval-chart'; |
| Vue | import { SpIntervalChart } from '@silverpoint/vue/interval-chart'; |
| Angular | import { SpIntervalChart } from '@silverpoint/angular/interval-chart'; // <sp-interval-chart> |
| Reflex | from reflex_silverpoint_react import interval_chart |
Props
The props IntervalChart adds to the ones every chart takes. Accessor props (…Key, keys, names) name fields of your rows and are ignored without data.
| React / Angular | Vue | Reflex | Type | Description |
|---|---|---|---|---|
laneKey | lane-key | lane_key | Accessor<string> | — |
startKey | start-key | start_key | Accessor<number | string | null | undefined> | — |
endKey | end-key | end_key | Accessor<number | string | null | undefined> | — |
labelKey | label-key | label_key | Accessor<string | null | undefined> | — |
axis | axis | axis | 'number' | 'date' | date reads ISO YYYY-MM-DD days in UTC; number by default. |
Common props
Every chart also takes these. Framework conventions: camelCase in React and Angular, kebab-case in Vue templates, snake_case in Reflex. Read more about them.
Show the 22 common props
| React / Angular | Vue | Reflex | Type | Description |
|---|---|---|---|---|
data | data | data | readonly Datum[] | Rows to draw. If omitted, the demo dataset is rendered (REQ-093) and the accessor props (…_key, keys, names) are ignored. |
ground | ground | ground | GroundRef | Style ground: silverpoint or cyanotype, or a ground object. Defaults to the app provider's, or silverpoint. |
substrate | substrate | substrate | SubstrateName | Prepared substrate within the ground (REQ-046). |
mode | mode | mode | InkMode | ink by default; precision disables inking (REQ-021). |
seed | seed | seed | Seed | Seed. If omitted, it is derived from id stably (REQ-003). |
id | id | id | string | Stable identifier. If omitted, it is generated deterministically. |
height | height | height | number | Height of the drawing area in px. Width is the container's unless pinned. |
width | width | width | number | — |
chrome | chrome | chrome | 'card' | 'bare' | card draws the full frame; bare only the drawing area (REQ-095). |
hatchFill | hatch-fill | hatch_fill | 'tile' | 'per-shape' | How areas are filled (REQ-029). |
title | title | title | string | — |
badge | badge | badge | string | — |
value | value | value | string | number | — |
unit | unit | unit | string | — |
footerLeft | footer-left | footer_left | string | — |
footerRight | footer-right | footer_right | string | — |
label | label | label | string | Accessible name. If omitted, it is derived from title (REQ-120). |
description | description | description | string | Long description for screen readers (REQ-120). |
dataTable | data-table | data_table | 'visible' | 'hidden' | 'none' | Tabular alternative; hidden leaves it for assistive technology only (REQ-121). |
locale | locale | locale | string | — |
numberFormat | number-format | number_format | Intl.NumberFormatOptions | — |
className | class-name | class_name | string | — |
Events
Pointer and keyboard exploration are built in. The item under the pointer or focus is reported, and a click, Enter or Space selects it. The item is { seriesKey, index, datum, value, point: { x, y } }.
| Framework | Active item | Selection | Custom readout |
|---|---|---|---|
| React | onActiveChange | onSelect | tooltip={(item, readout) => …} |
| Vue | @active-change | @select | <template #tooltip> |
| Angular | (activeChange) | (select) | <ng-template spTooltip> |
| Reflex | on_active_change | on_select | tooltip=tooltip_template(…) |