Back to Home

Tree View

A modern, minimalist hierarchical tree component inspired by Notion and shadcn/ui. Features drag & drop, Livewire integration, and smooth animations.

Basic Usage

A clean, minimal tree view for files and folders:

<neura::tree :items="$items" :selectable="true" />

Variants

Minimal, clean variants for different use cases:

Default

Ghost

Bordered

<neura::tree :items="$items" variant="default" />
<neura::tree :items="$items" variant="ghost" />
<neura::tree :items="$items" variant="bordered" />

Drag & Drop

Intuitive drag and drop with visual feedback. Drop before, after, or inside folders:
💡 Try dragging items to reorganize the tree
<neura::tree 
    :items="$items"
    @tree:move="handleMove($event.detail)"
/>

<script>
function handleMove(detail) {
    console.log('Moved:', detail.item);
    console.log('To:', detail.target);
    console.log('Position:', detail.position); // 'before', 'after', 'inside'
}
</script>

Livewire Integration

Seamlessly sync tree state with Livewire properties:

<?php

class FileManager extends Component
{
    public $files = [
        [
            'id' => '1',
            'type' => 'folder',
            'name' => 'Documents',
            'children' => [...]
        ],
    ];

    public function render()
    {
        return view('livewire.file-manager');
    }
}


<neura::tree 
    :items="$files"
    wire-model="files"
    :selectable="true"
    @tree:select="$wire.handleSelect($event.detail)"
    @tree:move="$wire.handleMove($event.detail)"
/>

Sizes

Three size options for different contexts:

Small

Medium

Large

<neura::tree :items="$items" size="sm" />
<neura::tree :items="$items" size="md" />
<neura::tree :items="$items" size="lg" />

Selection

Single or multi-select support with keyboard modifiers:

Single Select

Multi-Select (Ctrl/Cmd + Click)


<neura::tree :items="$items" :selectable="true" />


<neura::tree :items="$items" :selectable="true" :multiSelect="true" />


<neura::tree 
    :items="$items"
    :selectable="true"
    @tree:select="console.log($event.detail)"
/>

With Badges

Add count badges or status indicators (Notion style):
$items = [
    [
        'id' => '1',
        'type' => 'folder',
        'name' => 'Inbox',
        'badge' => '3', // Badge text
        'children' => [...]
    ],
];

<neura::tree :items="$items" />

Real-World Example

A complete file manager interface:

Data Structure

$items = [
    [
        'id' => 'unique-id',        // Required: unique identifier
        'type' => 'folder',          // Required: 'folder' or 'file'/'document'
        'name' => 'Folder Name',     // Required: display name
        'label' => 'Custom Label',   // Optional: override name
        'icon' => 'code',            // Optional: 'image', 'code' or custom
        'iconClass' => 'text-blue-500', // Optional: custom icon color
        'badge' => '5',              // Optional: badge text/number
        'children' => [              // Optional: nested items (for folders)
            [...],
        ],
    ],
];

Properties

Property Type Default Description
items array [] Tree data structure
variant string default Style variant (default, ghost, bordered)
size string md Size (sm, md, lg)
selectable boolean false Enable item selection
multiSelect boolean false Enable multi-select (Ctrl/Cmd + click)
showIcons boolean true Show file/folder icons
expandAll boolean false Expand all folders by default
onlyFolders boolean false Show only folders, hide files
wireModel string null Livewire property name for two-way binding

Events

Event Payload Description
tree:select { selected: [], item } Fired when selection changes
tree:move { item, target, position, items } Fired when an item is moved via drag & drop