A four-state linear-partition hierarchy chart in DOM blocks — one level per row or column, length proportional to value, click-to-drill with a breadcrumb, honest label truncation with tooltips, and an sr-only breakdown table.
Preview in your theme
Loading preview…
This component is part of Pro
The install command, prompt and concept map are included with a Pro license — one purchase unlocks every Pro component, forever.
status="ready" · direction="down" — 25 stack samples, 4 of 5 levels drawn. Click a block to make it the whole width; Backspace or a crumb walks back. Last opened: nothing yet. Last leaf picked: none.
CPU time by call stackEach row is one frame deeper · gaps are self time
934 ms total · 4 of 5 levels shown
Icicle of request: 934 ms split into 3 blocks across 4 levels, depth running downward. Largest handleRequest, 854 ms, 91.4% of request. Smallest telemetry, 12 ms, 1.3%. 11 blocks are too short to carry a label. 2 blocks hold levels below the 4 drawn. Every value is listed in the table that follows.
Each row is one level in, and a block's width is its share of the block it sits under, biggest first. Click or press Enter to open one, Backspace to go back. 2 blocks keep deeper levels behind a dashed edge. 11 blocks are too short to label — hover for the full name, arrow into them, or read the table.
The gaps at the end of a row are real: 576 ms is charged to 13 blocks directly rather than to anything inside them.
Every entry inside request, with its level, its value, the part charged to it directly, its share of the block that contains it, and its share of request.
Entry
Inside
Level
Value
Charged directly
Share of group
Share of request
handleRequest
request
1
854 ms
3 ms
91.4%
91.4%
renderDocumentTree
handleRequest
2
402 ms
30 ms
47.1%
43%
resolveComponentGraph
renderDocumentTree
3
273 ms
86 ms
67.9%
29.2%
hydrateServerProps
resolveComponentGraph
4
187 ms
145 ms
68.5%
20%
deepMergeDefaults
hydrateServerProps
5
42 ms
42 ms
22.5%
4.5%
serializeToHtmlStream
renderDocumentTree
3
74 ms
74 ms
18.4%
7.9%
collectCriticalCss
renderDocumentTree
3
25 ms
25 ms
6.2%
2.7%
queryDatabase
handleRequest
2
205 ms
16 ms
24%
21.9%
runPreparedStatement
queryDatabase
3
184 ms
114 ms
89.8%
19.7%
decodeResultSet
runPreparedStatement
4
70 ms
46 ms
38%
7.5%
inflateColumnChunk
decodeResultSet
5
24 ms
24 ms
34.3%
2.6%
acquireConnectionFromPool
queryDatabase
3
5 ms
5 ms
2.4%
0.5%
authenticateSession
handleRequest
2
111 ms
9 ms
13%
11.9%
verifyJsonWebToken
authenticateSession
3
74 ms
65 ms
66.7%
7.9%
base64UrlDecode
verifyJsonWebToken
4
9 ms
9 ms
12.2%
1%
loadSessionFromCache
authenticateSession
3
28 ms
28 ms
25.2%
3%
writeResponse
handleRequest
2
75 ms
24 ms
8.8%
8%
compressBrotli
writeResponse
3
51 ms
51 ms
68%
5.5%
parseBody
handleRequest
2
58 ms
15 ms
6.8%
6.2%
decodeUtf8
parseBody
3
43 ms
43 ms
74.1%
4.6%
garbageCollector
request
1
68 ms
17 ms
7.3%
7.3%
markLiveObjects
garbageCollector
2
34 ms
34 ms
50%
3.6%
sweepYoungGeneration
garbageCollector
2
17 ms
17 ms
25%
1.8%
telemetry
request
1
12 ms
6 ms
1.3%
1.3%
flushSpansToCollector
telemetry
2
6 ms
6 ms
50%
0.6%
status="ready" · direction="right" — the same profile turned a quarter. Depth now runs left to right, so every level keeps the full column width for its name instead of getting narrower the deeper it sits.
CPU time by call stackColumns instead of rows · height={300}
934 ms total · 4 of 5 levels shown
Icicle of request: 934 ms split into 3 blocks across 4 levels, depth running left to right. Largest handleRequest, 854 ms, 91.4% of request. Smallest telemetry, 12 ms, 1.3%. 9 blocks are too short to carry a label. 2 blocks hold levels below the 4 drawn. Every value is listed in the table that follows.
Each column is one level in, and a block's height is its share of the block it sits under, biggest first. Click or press Enter to open one, Backspace to go back. 2 blocks keep deeper levels behind a dashed edge. 9 blocks are too short to label — hover for the full name, arrow into them, or read the table. 2 of those are thinner than a pixel; nothing is widened to a minimum, because length taken from a sibling would stop the level summing to its parent.
The gaps at the end of a column are real: 576 ms is charged to 13 blocks directly rather than to anything inside them.
Every entry inside request, with its level, its value, the part charged to it directly, its share of the block that contains it, and its share of request.
Entry
Inside
Level
Value
Charged directly
Share of group
Share of request
handleRequest
request
1
854 ms
3 ms
91.4%
91.4%
renderDocumentTree
handleRequest
2
402 ms
30 ms
47.1%
43%
resolveComponentGraph
renderDocumentTree
3
273 ms
86 ms
67.9%
29.2%
hydrateServerProps
resolveComponentGraph
4
187 ms
145 ms
68.5%
20%
deepMergeDefaults
hydrateServerProps
5
42 ms
42 ms
22.5%
4.5%
serializeToHtmlStream
renderDocumentTree
3
74 ms
74 ms
18.4%
7.9%
collectCriticalCss
renderDocumentTree
3
25 ms
25 ms
6.2%
2.7%
queryDatabase
handleRequest
2
205 ms
16 ms
24%
21.9%
runPreparedStatement
queryDatabase
3
184 ms
114 ms
89.8%
19.7%
decodeResultSet
runPreparedStatement
4
70 ms
46 ms
38%
7.5%
inflateColumnChunk
decodeResultSet
5
24 ms
24 ms
34.3%
2.6%
acquireConnectionFromPool
queryDatabase
3
5 ms
5 ms
2.4%
0.5%
authenticateSession
handleRequest
2
111 ms
9 ms
13%
11.9%
verifyJsonWebToken
authenticateSession
3
74 ms
65 ms
66.7%
7.9%
base64UrlDecode
verifyJsonWebToken
4
9 ms
9 ms
12.2%
1%
loadSessionFromCache
authenticateSession
3
28 ms
28 ms
25.2%
3%
writeResponse
handleRequest
2
75 ms
24 ms
8.8%
8%
compressBrotli
writeResponse
3
51 ms
51 ms
68%
5.5%
parseBody
handleRequest
2
58 ms
15 ms
6.8%
6.2%
decodeUtf8
parseBody
3
43 ms
43 ms
74.1%
4.6%
garbageCollector
request
1
68 ms
17 ms
7.3%
7.3%
markLiveObjects
garbageCollector
2
34 ms
34 ms
50%
3.6%
sweepYoungGeneration
garbageCollector
2
17 ms
17 ms
25%
1.8%
telemetry
request
1
12 ms
6 ms
1.3%
1.3%
flushSpansToCollector
telemetry
2
6 ms
6 ms
50%
0.6%
direction="right" · maxLevels={6} — a nine-level directory tree with long folder names, 6 of 9 levels drawn. The block that holds the three levels below the budget keeps a dashed right edge and still opens on click.
Disk usage by folderDeep tree, long names — the layout this direction exists for
28.2K KB total · 6 of 9 levels shown
Icicle of repository: 28.2K KB split into 3 blocks across 6 levels, depth running left to right. Largest node_modules, 24.3K KB, 86.1% of repository. Smallest src, 1.2K KB, 4.4%. 19 blocks are too short to carry a label. 1 block holds levels below the 6 drawn. Every value is listed in the table that follows.
Each column is one level in, and a block's height is its share of the block it sits under, biggest first. Click or press Enter to open one, Backspace to go back. 1 block keeps deeper levels behind a dashed edge. 19 blocks are too short to label — hover for the full name, arrow into them, or read the table. 10 of those are thinner than a pixel; nothing is widened to a minimum, because length taken from a sibling would stop the level summing to its parent.
The gaps at the end of a column are real: 2.1K KB is charged to 1 block directly rather than to anything inside it.
Every entry inside repository, with its level, its value, the part charged to it directly, its share of the block that contains it, and its share of repository.
Entry
Inside
Level
Value
Charged directly
Share of group
Share of repository
node_modules
repository
1
24.3K KB
—
86.1%
86.1%
@internal
node_modules
2
14.2K KB
—
58.5%
50.4%
design-system
@internal
3
12.1K KB
—
85%
42.8%
dist
design-system
4
12.1K KB
—
100%
42.8%
esm
dist
5
6.8K KB
—
56.1%
24%
components
esm
6
4.8K KB
2.1K KB
71.1%
17.1%
chart
components
7
2.7K KB
—
55.6%
9.5%
icicle
chart
8
1.8K KB
—
66.4%
6.3%
index.js
icicle
9
1.8K KB
1.8K KB
100%
6.3%
sunburst
chart
8
900 KB
—
33.6%
3.2%
index.js
sunburst
9
900 KB
900 KB
100%
3.2%
primitives
esm
6
2K KB
2K KB
28.9%
6.9%
cjs
dist
5
5.3K KB
5.3K KB
43.9%
18.8%
analytics-client
@internal
3
2.1K KB
—
15%
7.6%
dist
analytics-client
4
2.1K KB
2.1K KB
100%
7.6%
typescript
node_modules
2
8.8K KB
—
36%
31%
lib
typescript
3
8.8K KB
8.8K KB
100%
31%
react-dom
node_modules
2
1.3K KB
—
5.4%
4.7%
cjs
react-dom
3
1.3K KB
1.3K KB
100%
4.7%
public
repository
1
2.7K KB
—
9.6%
9.6%
fonts
public
2
1.7K KB
1.7K KB
64.4%
6.2%
illustrations
public
2
960 KB
960 KB
35.6%
3.4%
src
repository
1
1.2K KB
—
4.4%
4.4%
components
src
2
698 KB
—
56.6%
2.5%
ui
components
3
410 KB
410 KB
58.7%
1.5%
charts
components
3
288 KB
288 KB
41.3%
1%
app
src
2
275 KB
—
22.3%
1%
(dashboard)
app
3
165 KB
—
60%
0.6%
workspaces
(dashboard)
4
165 KB
—
100%
0.6%
[workspaceId]
workspaces
5
165 KB
—
100%
0.6%
settings
[workspaceId]
6
91 KB
91 KB
55.2%
0.3%
members
[workspaceId]
6
74 KB
74 KB
44.8%
0.3%
(marketing)
app
3
110 KB
—
40%
0.4%
pricing
(marketing)
4
62 KB
62 KB
56.4%
0.2%
changelog
(marketing)
4
48 KB
48 KB
43.6%
0.2%
lib
src
2
260 KB
—
21.1%
0.9%
internationalization
lib
3
260 KB
—
100%
0.9%
message-catalogues
internationalization
4
260 KB
—
100%
0.9%
en-GB
message-catalogues
5
132 KB
132 KB
50.8%
0.5%
de-DE
message-catalogues
5
128 KB
128 KB
49.2%
0.5%
Edge cases: two samples of the same frame (they sum to 800ms), a 0.1% block holding a 0.03% leaf — both drawn at their true sub-pixel width and never floored, a 54-character frame name truncated with the full name on hover, a group holding more of its own time than its children, plus one negative and one zero entry, dropped and named in the footnote.
Icicle of job: 1.3K ms split into 1 block across 3 levels, depth running downward. Largest import, 1.3K ms, 100% of job. 3 blocks are too short to carry a label. Every value is listed in the table that follows.
Each row is one level in, and a block's width is its share of the block it sits under, biggest first. Click or press Enter to open one, Backspace to go back. 3 blocks are too short to label — hover for the full name, arrow into them, or read the table. 2 of those are thinner than a pixel; nothing is widened to a minimum, because length taken from a sibling would stop the level summing to its parent.
The gaps at the end of a row are real: 300.9 ms is charged to 3 blocks directly rather than to anything inside them.
Left out of the partition: 1 negative entry, 1 at zero or not a number — a block has no negative length.
Every entry inside job, with its level, its value, the part charged to it directly, its share of the block that contains it, and its share of job.
Degenerate: a single path, so the first row is one block at 100% and size encodes nothing. Level 3 covers only 23% of level 2 — the rest is time charged to loadRuntime itself, left as a gap rather than spread over its children.
One branch, all of itOne branch, and a large self-time gap
1.1K ms total · 3 of 3 levels shown
Icicle of invocation: 1.1K ms split into 1 block across 3 levels, depth running downward. Largest cold start, 1.1K ms, 100% of invocation. Every value is listed in the table that follows.
Each row is one level in, and a block's width is its share of the block it sits under, biggest first. Click or press Enter to open one, Backspace to go back.
The gaps at the end of a row are real: 820 ms is charged to 1 block directly rather than to anything inside it.
Every entry inside invocation, with its level, its value, the part charged to it directly, its share of the block that contains it, and its share of invocation.
Entry
Inside
Level
Value
Charged directly
Share of group
Share of invocation
cold start
invocation
1
1.1K ms
—
100%
100%
loadRuntime
cold start
2
1.1K ms
820 ms
100%
100%
linkNativeModules
loadRuntime
3
240 ms
240 ms
22.6%
22.6%
maxLevels={2} · rowHeight={44} — the compact end of the same component: two rows only, every block that holds more marked with a dashed bottom edge, and taller rows for touch.
CPU time by call stackTwo levels, 44px rows
934 ms total · 2 of 5 levels shown
Icicle of request: 934 ms split into 3 blocks across 2 levels, depth running downward. Largest handleRequest, 854 ms, 91.4% of request. Smallest telemetry, 12 ms, 1.3%. 5 blocks are too short to carry a label. 5 blocks hold levels below the 2 drawn. Every value is listed in the table that follows.
Each row is one level in, and a block's width is its share of the block it sits under, biggest first. Click or press Enter to open one, Backspace to go back. 5 blocks keep deeper levels behind a dashed edge. 5 blocks are too short to label — hover for the full name, arrow into them, or read the table.
The gaps at the end of a row are real: 576 ms is charged to 13 blocks directly rather than to anything inside them.
Every entry inside request, with its level, its value, the part charged to it directly, its share of the block that contains it, and its share of request.
Entry
Inside
Level
Value
Charged directly
Share of group
Share of request
handleRequest
request
1
854 ms
3 ms
91.4%
91.4%
renderDocumentTree
handleRequest
2
402 ms
30 ms
47.1%
43%
resolveComponentGraph
renderDocumentTree
3
273 ms
86 ms
67.9%
29.2%
hydrateServerProps
resolveComponentGraph
4
187 ms
145 ms
68.5%
20%
deepMergeDefaults
hydrateServerProps
5
42 ms
42 ms
22.5%
4.5%
serializeToHtmlStream
renderDocumentTree
3
74 ms
74 ms
18.4%
7.9%
collectCriticalCss
renderDocumentTree
3
25 ms
25 ms
6.2%
2.7%
queryDatabase
handleRequest
2
205 ms
16 ms
24%
21.9%
runPreparedStatement
queryDatabase
3
184 ms
114 ms
89.8%
19.7%
decodeResultSet
runPreparedStatement
4
70 ms
46 ms
38%
7.5%
inflateColumnChunk
decodeResultSet
5
24 ms
24 ms
34.3%
2.6%
acquireConnectionFromPool
queryDatabase
3
5 ms
5 ms
2.4%
0.5%
authenticateSession
handleRequest
2
111 ms
9 ms
13%
11.9%
verifyJsonWebToken
authenticateSession
3
74 ms
65 ms
66.7%
7.9%
base64UrlDecode
verifyJsonWebToken
4
9 ms
9 ms
12.2%
1%
loadSessionFromCache
authenticateSession
3
28 ms
28 ms
25.2%
3%
writeResponse
handleRequest
2
75 ms
24 ms
8.8%
8%
compressBrotli
writeResponse
3
51 ms
51 ms
68%
5.5%
parseBody
handleRequest
2
58 ms
15 ms
6.8%
6.2%
decodeUtf8
parseBody
3
43 ms
43 ms
74.1%
4.6%
garbageCollector
request
1
68 ms
17 ms
7.3%
7.3%
markLiveObjects
garbageCollector
2
34 ms
34 ms
50%
3.6%
sweepYoungGeneration
garbageCollector
2
17 ms
17 ms
25%
1.8%
telemetry
request
1
12 ms
6 ms
1.3%
1.3%
flushSpansToCollector
telemetry
2
6 ms
6 ms
50%
0.6%
status="empty" — the query ran and returned no paths. A different sentence from "still loading".
CPU time by call stackNo samples recorded yet
Nothing to partition yet
An icicle needs at least one path with an amount above zero.
status="loading" — four pulsing rows in the same geometry, aria-hidden, plus one sr-only status line. No timers.
CPU time by call stackFetching profile
Loading breakdown
status="error" with onRetry — press Try again to swap to ready. Omit onRetry and the button never renders.