Tree
Basic example
Section titled “Basic example”Tree component with the default settings. Check the console log for the triggered events.
<vscode-tree id="tree-basic-example"> <vscode-tree-item> Fruits <vscode-tree-item> Citrus Fruits <vscode-tree-item>Orange</vscode-tree-item> <vscode-tree-item>Lemon</vscode-tree-item> <vscode-tree-item>Grapefruit</vscode-tree-item> </vscode-tree-item> <vscode-tree-item> Berries <vscode-tree-item>Strawberry</vscode-tree-item> <vscode-tree-item>Blueberry</vscode-tree-item> <vscode-tree-item>Raspberry</vscode-tree-item> </vscode-tree-item> <vscode-tree-item> Tropical Fruits <vscode-tree-item>Mango</vscode-tree-item> <vscode-tree-item>Pineapple</vscode-tree-item> <vscode-tree-item>Papaya</vscode-tree-item> </vscode-tree-item> </vscode-tree-item> <vscode-tree-item> Vegetables <vscode-tree-item> Leafy Greens <vscode-tree-item>Spinach</vscode-tree-item> <vscode-tree-item>Lettuce</vscode-tree-item> <vscode-tree-item>Kale</vscode-tree-item> </vscode-tree-item> <vscode-tree-item> Root Vegetables <vscode-tree-item>Carrot</vscode-tree-item> <vscode-tree-item>Beetroot</vscode-tree-item> <vscode-tree-item>Radish</vscode-tree-item> </vscode-tree-item> <vscode-tree-item> Nightshades <vscode-tree-item>Tomato</vscode-tree-item> <vscode-tree-item>Eggplant</vscode-tree-item> <vscode-tree-item>Bell Pepper</vscode-tree-item> </vscode-tree-item> </vscode-tree-item></vscode-tree>
const tree = document.querySelector("#tree-basic-example");tree.addEventListener("vsc-tree-select", (event) => { console.log(event);});
Icons can be added using named slots. Any valid HTML content can be used as an icon.
- Icon area: The display area for icons is limited to 16×16 pixels. Content that exceeds this size will be clipped.
- Available slots:
icon-branch
— shown when a branch item is collapsed.icon-branch-opened
— shown when a branch item is expanded.icon-leaf
— shown for leaf items
The visibility of each icon depends on the state of the corresponding tree item.
Codicons
Section titled “Codicons”To use the icons, the codicons.css file must be included in the page:
<link rel="stylesheet" href="path/to/codicon.css" id="vscode-codicon-stylesheet">
Note the required id
on the link element!
To use web fonts in web components, the component needs to include
the font stylesheet in addition to the page. This id serves as a lookup so
the icon component can automatically create and insert it’s own link tag.
<vscode-tree> <vscode-tree-item> <vscode-icon name="folder" slot="icon-branch"></vscode-icon> <vscode-icon name="folder-opened" slot="icon-branch-opened" ></vscode-icon> vscode-tree <vscode-tree-item> <vscode-icon name="file" slot="icon-leaf"></vscode-icon> helpers.test.ts </vscode-tree-item> <vscode-tree-item> <vscode-icon name="file" slot="icon-leaf"></vscode-icon>helpers.ts </vscode-tree-item> <vscode-tree-item> <vscode-icon name="file" slot="icon-leaf"></vscode-icon>index.ts </vscode-tree-item> <vscode-tree-item> <vscode-icon name="file" slot="icon-leaf"></vscode-icon> tree-context.ts </vscode-tree-item> <vscode-tree-item> <vscode-icon name="file" slot="icon-leaf"></vscode-icon> vscode-tree.styles.ts </vscode-tree-item> <vscode-tree-item> <vscode-icon name="file" slot="icon-leaf"></vscode-icon> vscode-tree.test.ts </vscode-tree-item> <vscode-tree-item> <vscode-icon name="file" slot="icon-leaf"></vscode-icon>vscode-tree.ts </vscode-tree-item> </vscode-tree-item></vscode-tree>
Custom icons
Section titled “Custom icons”Another example with <img>
tags.
<vscode-tree> <vscode-tree-item open> <img src="/material-icons/folder.svg" slot="icon-branch" /> <img src="/material-icons/folder-open.svg" slot="icon-branch-opened" /> vscode-tree <vscode-tree-item> <img src="/material-icons/test-ts.svg" slot="icon-leaf" /> helpers.test.ts </vscode-tree-item> <vscode-tree-item> <img src="/material-icons/typescript.svg" slot="icon-leaf" /> helpers.ts </vscode-tree-item> <vscode-tree-item> <img src="/material-icons/typescript.svg" slot="icon-leaf" /> index.ts </vscode-tree-item> <vscode-tree-item> <img src="/material-icons/typescript.svg" slot="icon-leaf" /> tree-context.ts </vscode-tree-item> <vscode-tree-item> <img src="/material-icons/typescript.svg" slot="icon-leaf" /> vscode-tree.styles.ts </vscode-tree-item> <vscode-tree-item> <img src="/material-icons/test-ts.svg" slot="icon-leaf" /> vscode-tree.test.ts </vscode-tree-item> <vscode-tree-item> <img src="/material-icons/typescript.svg" slot="icon-leaf" /> vscode-tree.ts </vscode-tree-item> </vscode-tree-item></vscode-tree>
img[slot="icon-branch"],img[slot="icon-branch-opened"],img[slot="icon-leaf"] { display: block; height: 16px; width: 16px;}
Flat tree
Section titled “Flat tree”The Tree component can also be used to display lists.
<vscode-tree> <vscode-tree-item> <vscode-icon name="git-commit" slot="icon-leaf"></vscode-icon> bump distro </vscode-tree-item> <vscode-tree-item> <vscode-icon name="git-commit" slot="icon-leaf"></vscode-icon> Update milestone </vscode-tree-item> <vscode-tree-item> <vscode-icon name="git-commit" slot="icon-leaf"></vscode-icon> env – tweak shell resolve experience on startup </vscode-tree-item> <vscode-tree-item> <vscode-icon name="git-commit" slot="icon-leaf"></vscode-icon> Merge pull request #107126 from Timmmm/atomic_tabs </vscode-tree-item> <vscode-tree-item> <vscode-icon name="git-commit" slot="icon-leaf"></vscode-icon> Simplify changes from #108193 </vscode-tree-item></vscode-tree>
Rich content
Section titled “Rich content”You can place any HTML content inside a <vscode-tree-item>
component.
tsconfig.json
<vscode-tree> <vscode-tree-item open> <div class="file"> <vscode-icon name="file"></vscode-icon> <div class="filename">tsconfig.json</div> <vscode-badge variant="counter">2</vscode-badge> </div> <vscode-tree-item> <div class="message"> <div class="actions"> <vscode-icon name="error"></vscode-icon> </div> <div class="message-details"> <div class="message-line"> <span class="message-raw" >Cannot find type definition file for 'mocha'.</span > <div class="message-error-code">ts</div> <div class="message-location">[Ln 1, Col 1]</div> <div class="action-bar"> <vscode-toolbar-button icon="chevron-down" class="toggle-button open"></vscode-toolbar-button> </div> </div> <div class="toggleable open"> <div class="message-line"> <span class="message-raw" > The file is in the program because:</span > </div> <div class="message-line"> <span class="message-raw" > Entry point of type library 'mocha' specified in compilerOptions</span > </div> </div> </div> </div> </vscode-tree-item> <vscode-tree-item> <div class="message"> <div class="actions"> <vscode-icon name="error"></vscode-icon> </div> <div class="message-details"> <div class="message-line"> <span class="message-raw" >Cannot find type definition file for 'user-agent-data-types'.</span > <div class="message-error-code">ts</div> <div class="message-location">[Ln 1, Col 1]</div> <div class="action-bar"> <vscode-toolbar-button icon="chevron-down" class="toggle-button open"></vscode-toolbar-button> </div> </div> <div class="toggleable open"> <div class="message-line"> <span class="message-raw" > The file is in the program because:</span > </div> <div class="message-line"> <span class="message-raw" > Entry point of type library 'user-agent-data-types' specified in compilerOptions</span > </div> </div> </div> </div> </vscode-tree-item> </vscode-tree-item></vscode-tree>
.file { align-items: center; display: flex;}
.file vscode-icon { margin-right: 6px;}
.filename { display: block;}
vscode-badge[variant="counter"] { display: block; margin-left: 10px;}
.message { display: flex;}
.actions { align-items: center; display: flex; height: 22px; margin: 0 6px;}
.actions vscode-icon { color: var(--vscode-problemsErrorIcon-foreground);}
.message-details { overflow: hidden;}
.toggleable { display: none;}
.toggleable.open { display: block;}
.message-line { display: flex; white-space: nowrap;}
.message-raw { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;}
.message-error-code { margin-left: 6px; opacity: 0.7;}
.message-location { margin-left: 6px; opacity: 0.7;}
.action-bar { margin-left: 6px;}
.action-bar vscode-toolbar-button { display: block;}
.action-bar vscode-toolbar-button.open { transform: rotate(180deg);}
const toggleButtons = document.querySelectorAll(".toggle-button");
toggleButtons.forEach((bt) => { bt.addEventListener("click", () => { const message = bt.closest(".message"); const toggleableSection = message.querySelector(".toggleable");
bt.classList.toggle("open"); toggleableSection.classList.toggle("open"); });});