Skip to content
silverpoint
Documentation menu

Concepts

Drill-down & hierarchies

New in 0.6. SquarifiedTreemap and SunburstChart drill down under your control: the chart keeps no root of its own, it tells you which node was asked for and draws the one you pass back.

Try it

Click a rectangle or a ring, or focus a chart and press Enter or Space. Both charts read the same root, so they drill down together. Click the centre of the sunburst, or the frame of the treemap, to go back up.

City budgetCity budget
City budget
nodeamount
City budget69,364
City budget › Public works19,197, 27.7% of City budget
City budget › Public works › Street lighting8,015, 41.8% of Public works
City budget › Public works › Bridges6,154, 32.1% of Public works
City budget › Public works › Water mains2,878, 15% of Public works
City budget › Public works › Water mains › Water mains: staff2,069, 71.9% of Water mains
City budget › Public works › Water mains › Water mains: materials809, 28.1% of Water mains
City budget › Public works › Roads2,150, 11.2% of Public works
City budget › Public works › Roads › Roads: staff1,760, 81.9% of Roads
City budget › Public works › Roads › Roads: materials390, 18.1% of Roads
City budget › Administration18,611, 26.8% of City budget
City budget › Administration › IT services8,252, 44.3% of Administration
City budget › Administration › Payroll6,768, 36.4% of Administration
City budget › Administration › Records3,591, 19.3% of Administration
City budget › Administration › Records › Records: staff3,281, 91.4% of Records
City budget › Administration › Records › Records: materials310, 8.6% of Records
City budget › Safety13,294, 19.2% of City budget
City budget › Safety › Emergency planning6,265, 47.1% of Safety
City budget › Safety › Lifeguards5,224, 39.3% of Safety
City budget › Safety › Lifeguards › Lifeguards: materials2,953, 56.5% of Lifeguards
City budget › Safety › Lifeguards › Lifeguards: staff2,271, 43.5% of Lifeguards
City budget › Safety › Fire service1,805, 13.6% of Safety
City budget › Parks10,626, 15.3% of City budget
City budget › Parks › Playgrounds5,030, 47.3% of Parks
City budget › Parks › Playgrounds › Playgrounds: materials2,865, 57% of Playgrounds
City budget › Parks › Playgrounds › Playgrounds: staff2,165, 43% of Playgrounds
City budget › Parks › Tree care2,835, 26.7% of Parks
City budget › Parks › Sports fields2,761, 26% of Parks
City budget › Parks › Sports fields › Sports fields: staff2,455, 88.9% of Sports fields
City budget › Parks › Sports fields › Sports fields: materials306, 11.1% of Sports fields
City budget › Culture7,636, 11% of City budget
City budget › Culture › Libraries3,177, 41.6% of Culture
City budget › Culture › Libraries › Libraries: materials2,265, 71.3% of Libraries
City budget › Culture › Libraries › Libraries: staff912, 28.7% of Libraries
City budget › Culture › Museum2,999, 39.3% of Culture
City budget › Culture › Festivals1,460, 19.1% of Culture
City budget › Culture › Festivals › Festivals: staff1,275, 87.3% of Festivals
City budget › Culture › Festivals › Festivals: materials185, 12.7% of Festivals
City budgetCity budget
City budget
nodeamount
City budget69,364
City budget › Public works19,197, 27.7% of City budget
City budget › Public works › Street lighting8,015, 41.8% of Public works
City budget › Public works › Bridges6,154, 32.1% of Public works
City budget › Public works › Water mains2,878, 15% of Public works
City budget › Public works › Water mains › Water mains: staff2,069, 71.9% of Water mains
City budget › Public works › Water mains › Water mains: materials809, 28.1% of Water mains
City budget › Public works › Roads2,150, 11.2% of Public works
City budget › Public works › Roads › Roads: staff1,760, 81.9% of Roads
City budget › Public works › Roads › Roads: materials390, 18.1% of Roads
City budget › Administration18,611, 26.8% of City budget
City budget › Administration › IT services8,252, 44.3% of Administration
City budget › Administration › Payroll6,768, 36.4% of Administration
City budget › Administration › Records3,591, 19.3% of Administration
City budget › Administration › Records › Records: staff3,281, 91.4% of Records
City budget › Administration › Records › Records: materials310, 8.6% of Records
City budget › Safety13,294, 19.2% of City budget
City budget › Safety › Emergency planning6,265, 47.1% of Safety
City budget › Safety › Lifeguards5,224, 39.3% of Safety
City budget › Safety › Lifeguards › Lifeguards: materials2,953, 56.5% of Lifeguards
City budget › Safety › Lifeguards › Lifeguards: staff2,271, 43.5% of Lifeguards
City budget › Safety › Fire service1,805, 13.6% of Safety
City budget › Parks10,626, 15.3% of City budget
City budget › Parks › Playgrounds5,030, 47.3% of Parks
City budget › Parks › Playgrounds › Playgrounds: materials2,865, 57% of Playgrounds
City budget › Parks › Playgrounds › Playgrounds: staff2,165, 43% of Playgrounds
City budget › Parks › Tree care2,835, 26.7% of Parks
City budget › Parks › Sports fields2,761, 26% of Parks
City budget › Parks › Sports fields › Sports fields: staff2,455, 88.9% of Sports fields
City budget › Parks › Sports fields › Sports fields: materials306, 11.1% of Sports fields
City budget › Culture7,636, 11% of City budget
City budget › Culture › Libraries3,177, 41.6% of Culture
City budget › Culture › Libraries › Libraries: materials2,265, 71.3% of Libraries
City budget › Culture › Libraries › Libraries: staff912, 28.7% of Libraries
City budget › Culture › Museum2,999, 39.3% of Culture
City budget › Culture › Festivals1,460, 19.1% of Culture
City budget › Culture › Festivals › Festivals: staff1,275, 87.3% of Festivals
City budget › Culture › Festivals › Festivals: materials185, 12.7% of Festivals
rootId: null

How it works

  • The data is one row per node, linked to its parent: idKey, parentKey (null for the root), labelKey and valueKey on the leaves. TreeChart reads the same rows.
  • Activating a node emits its id; activating the drawn root emits its parent's id, and null at the top.
  • Store it and pass it back as rootId. Without a handler the chart does not drill: there is no hidden state, so a server render with a rootId is exactly the client's.
  • depth limits the levels drawn below the root.
  • By keyboard the hierarchy walks as a WAI-ARIA tree, and each node is announced with its path, its value and its share of its parent.
  • Rows that do not make a valid hierarchy warn SP020 in development.

The event

ReactVueAngularReflex
Root inrootId:root-id[rootId]root_id
Root asked foronRootChange@root-change(rootChange)on_root_change

In your code

tsx
import { useState } from 'react';
import { SquarifiedTreemap } from '@silverpoint/react/squarified-treemap';
import { SunburstChart } from '@silverpoint/react/sunburst-chart';

// One row per node: { id, parent, name, amount }; the root's parent is null.
export function Budget({ data }: { data: Node[] }) {
  const [root, setRoot] = useState<string | null>(null);
  const keys = { idKey: 'id', parentKey: 'parent', labelKey: 'name', valueKey: 'amount' } as const;
  return (
    <>
      <SquarifiedTreemap data={data} {...keys} rootId={root} onRootChange={setRoot} title="City budget" />
      <SunburstChart data={data} {...keys} rootId={root} onRootChange={setRoot} title="City budget" />
    </>
  );
}