Tree View

Expandable/collapsible nested hierarchy using nested data-list.

Live Demo

Source

HTML + JavaScript
<div data-component="tree-view">
    <div data-list="nodes">
        <template>
            <div class="tree-node">
                <div class="tree-header" data-action="toggleNode">
                    <span data-bind="expanded ? '▼' : '▶'"></span>
                    <span data-bind="label"></span>
                </div>
                <!-- Nested data-list for children -->
                <div data-show="expanded" data-list="children">
                    <template>
                        <div class="tree-node">
                            <span data-bind="label"></span>
                        </div>
                    </template>
                </div>
            </div>
        </template>
    </div>
</div>

<script>
wildflower.component('tree-view', {
    state: {
        nodes: [
            { label: 'src', icon: '📁', expanded: true, children: [
                { label: 'components', icon: '📁', expanded: false, children: [
                    { label: 'Header.js', icon: '📄', children: [] },
                    { label: 'Footer.js', icon: '📄', children: [] }
                ]},
                { label: 'utils', icon: '📁', expanded: false, children: [
                    { label: 'format.js', icon: '📄', children: [] }
                ]}
            ]}
        ]
    },
    toggleNode(e, el, { item }) {
        item.expanded = !item.expanded;
    }
});
</script>

Key Points

  • Nested data-list elements render tree levels. Each node's children array becomes its own list
  • data-show="expanded" on the children container handles expand/collapse per node
  • Action handlers receive { item } in list context and work at any nesting depth; no need to track indices
  • data-bind="expanded ? '▼' : '▶'" uses a ternary expression to swap the chevron icon