<script>
  import { InlineNotification, UnorderedList, ListItem, Link,  } from "carbon-components-svelte";
  import Preview from "../../components/Preview.svelte";
</script>

## Default

The `nodes` prop accepts an array of child nodes. Each node should contain `id` and `text` properties.

Optional properties include `disabled`, `icon`, and `nodes`.

A parent node contains `nodes` while a leaf node does not.

<InlineNotification svx-ignore lowContrast title="Note:" kind="info" hideCloseButton>
  <div class="body-short-01">
    In version 0.86.0, the <strong>children</strong> prop was renamed to <strong>nodes</strong> for <Link target="_blank" href="https://svelte.dev/docs/svelte/v5-migration-guide#The-children-prop-is-reserved">Svelte 5 compatibility</Link>.
  </div>
</InlineNotification>

<InlineNotification svx-ignore lowContrast title="Note:" kind="info" hideCloseButton>
  <div class="body-short-01">Every node must have a unique id.</div>
</InlineNotification>

<FileSource src="/framed/TreeView/TreeView" />

## Slottable node

By default, each item renders the value of `node.text`. Use the data from `let:node` directive to override the default slot.

The destructured `let:node` contains the following properties:

<UnorderedList svx-ignore style="margin-bottom: var(--cds-spacing-08)">
  <ListItem><strong>id</strong>: the node id</ListItem>
  <ListItem><strong>text</strong>: the node text</ListItem>
  <ListItem><strong>expanded</strong>: true if the node is expanded</ListItem>
  <ListItem><strong>leaf</strong>: true if the node does not have child nodes</ListItem>
  <ListItem><strong>disabled</strong>: true if the node is disabled</ListItem>
  <ListItem><strong>selected</strong>: true if the node is selected</ListItem>
</UnorderedList>

<FileSource src="/framed/TreeView/TreeViewSlot" />

## Initial active node

The active node can be set through `activeId`.

<FileSource src="/framed/TreeView/TreeViewActive" />

## Compact size

Set `size` to `"compact"` to use the compact variant.

<FileSource src="/framed/TreeView/TreeViewCompact" />

## With icons

To render a node with an icon, define an `icon` property with a Carbon Svelte icon as its value.

<FileSource src="/framed/TreeView/TreeViewIcons" />

## Initial expanded nodes

Expanded nodes can be set using `expandedIds`.

<FileSource src="/framed/TreeView/TreeViewExpanded" />

## Initial multiple selected nodes

Initial multiple selected nodes can be set using `selectedIds`.

<FileSource src="/framed/TreeView/TreeViewMultiselect" />

## Expand all nodes

To programmatically expand all nodes, access the component instance using the [bind:this](https://svelte.dev/docs#bind_element) directive and invoke the `TreeView.expandAll()` accessor.

<FileSource src="/framed/TreeView/TreeViewExpandAll" />

## Collapse all nodes

Similarly, invoke `TreeView.collapseAll()` to collapse all nodes.

<FileSource src="/framed/TreeView/TreeViewCollapseAll" />

## Expand a subset of nodes

Use the `TreeView.expandNodes` method to expand only a subset of nodes.

The method accepts an argument that takes a node and returns a boolean.

If no argument is provided, all nodes will be expanded.

<FileSource src="/framed/TreeView/TreeViewExpandNodes" />

## Collapse a subset of nodes

Use the `TreeView.collapseNodes` method to collapse a subset of nodes.

If no argument is provided, all nodes will be collapsed.

<FileSource src="/framed/TreeView/TreeViewCollapseNodes" />

## Show a specific node

Use the `TreeView.showNode` method to show a specific node.

If a matching node is found, it will be expanded, selected, and focused.

<FileSource src="/framed/TreeView/TreeViewShowNode" />

## Flat data structure

If working with a flat data structure, use the `toHierarchy` utility
to convert a flat data structure into a hierarchical array accepted by the `nodes` prop.

<FileSource src="/framed/TreeView/TreeViewFlatArray" />
