Tree View

Hierarchical expandable tree for nested data like file browsers, categories, and org structures.

This component requires softui.js for interactive behavior.

Default

src
components
Button.tsx
Card.tsx
Modal.tsx
utils
helpers.ts
format.ts
index.ts
public
favicon.ico
robots.txt
package.json
<div class="sui-tree">
  <div class="sui-tree-item expanded">
    <div class="sui-tree-label">
      <span class="sui-tree-toggle"><svg viewBox="0 0 24 24"><polyline points="9 18 15 12 9 6"/></svg></span>
      <span class="sui-tree-text">src</span>
    </div>
    <div class="sui-tree-children">
      <div class="sui-tree-item expanded">
        <div class="sui-tree-label">
          <span class="sui-tree-toggle"><svg viewBox="0 0 24 24"><polyline points="9 18 15 12 9 6"/></svg></span>
          <span class="sui-tree-text">components</span>
        </div>
        <div class="sui-tree-children">
          <div class="sui-tree-item">
            <div class="sui-tree-label">
              <span class="sui-tree-toggle-spacer"></span>
              <span class="sui-tree-text">Button.tsx</span>
            </div>
          </div>
          <div class="sui-tree-item">
            <div class="sui-tree-label">
              <span class="sui-tree-toggle-spacer"></span>
              <span class="sui-tree-text">Card.tsx</span>
            </div>
          </div>
          <div class="sui-tree-item">
            <div class="sui-tree-label">
              <span class="sui-tree-toggle-spacer"></span>
              <span class="sui-tree-text">Modal.tsx</span>
            </div>
          </div>
        </div>
      </div>
      <div class="sui-tree-item">
        <div class="sui-tree-label">
          <span class="sui-tree-toggle"><svg viewBox="0 0 24 24"><polyline points="9 18 15 12 9 6"/></svg></span>
          <span class="sui-tree-text">utils</span>
        </div>
        <div class="sui-tree-children">
          <div class="sui-tree-item">
            <div class="sui-tree-label">
              <span class="sui-tree-toggle-spacer"></span>
              <span class="sui-tree-text">helpers.ts</span>
            </div>
          </div>
          <div class="sui-tree-item">
            <div class="sui-tree-label">
              <span class="sui-tree-toggle-spacer"></span>
              <span class="sui-tree-text">format.ts</span>
            </div>
          </div>
        </div>
      </div>
      <div class="sui-tree-item">
        <div class="sui-tree-label">
          <span class="sui-tree-toggle-spacer"></span>
          <span class="sui-tree-text">index.ts</span>
        </div>
      </div>
    </div>
  </div>
  <div class="sui-tree-item">
    <div class="sui-tree-label">
      <span class="sui-tree-toggle"><svg viewBox="0 0 24 24"><polyline points="9 18 15 12 9 6"/></svg></span>
      <span class="sui-tree-text">public</span>
    </div>
    <div class="sui-tree-children">
      <div class="sui-tree-item">
        <div class="sui-tree-label">
          <span class="sui-tree-toggle-spacer"></span>
          <span class="sui-tree-text">favicon.ico</span>
        </div>
      </div>
      <div class="sui-tree-item">
        <div class="sui-tree-label">
          <span class="sui-tree-toggle-spacer"></span>
          <span class="sui-tree-text">robots.txt</span>
        </div>
      </div>
    </div>
  </div>
  <div class="sui-tree-item">
    <div class="sui-tree-label">
      <span class="sui-tree-toggle-spacer"></span>
      <span class="sui-tree-text">package.json</span>
    </div>
  </div>
</div>

With Icons

src
components
Button.tsx
Card.tsx
index.ts
config.json
public
logo.png
favicon.ico
<div class="sui-tree">
  <div class="sui-tree-item expanded">
    <div class="sui-tree-label">
      <span class="sui-tree-toggle"><svg viewBox="0 0 24 24"><polyline points="9 18 15 12 9 6"/></svg></span>
      <span class="sui-tree-icon"><svg viewBox="0 0 24 24"><path d="M22 19a2 2 0 01-2 2H4a2 2 0 01-2-2V5a2 2 0 012-2h5l2 3h9a2 2 0 012 2z"/></svg></span>
      <span class="sui-tree-text">src</span>
    </div>
    <div class="sui-tree-children">
      <div class="sui-tree-item">
        <div class="sui-tree-label">
          <span class="sui-tree-toggle"><svg viewBox="0 0 24 24"><polyline points="9 18 15 12 9 6"/></svg></span>
          <span class="sui-tree-icon"><svg viewBox="0 0 24 24"><path d="M22 19a2 2 0 01-2 2H4a2 2 0 01-2-2V5a2 2 0 012-2h5l2 3h9a2 2 0 012 2z"/></svg></span>
          <span class="sui-tree-text">components</span>
        </div>
        <div class="sui-tree-children">
          <div class="sui-tree-item">
            <div class="sui-tree-label">
              <span class="sui-tree-toggle-spacer"></span>
              <span class="sui-tree-icon"><svg viewBox="0 0 24 24"><polyline points="16 18 22 12 16 6"/><polyline points="8 6 2 12 8 18"/></svg></span>
              <span class="sui-tree-text">Button.tsx</span>
            </div>
          </div>
          <div class="sui-tree-item">
            <div class="sui-tree-label">
              <span class="sui-tree-toggle-spacer"></span>
              <span class="sui-tree-icon"><svg viewBox="0 0 24 24"><polyline points="16 18 22 12 16 6"/><polyline points="8 6 2 12 8 18"/></svg></span>
              <span class="sui-tree-text">Card.tsx</span>
            </div>
          </div>
        </div>
      </div>
      <div class="sui-tree-item">
        <div class="sui-tree-label">
          <span class="sui-tree-toggle-spacer"></span>
          <span class="sui-tree-icon"><svg viewBox="0 0 24 24"><path d="M14 2H6a2 2 0 00-2 2v16a2 2 0 002 2h12a2 2 0 002-2V8z"/><polyline points="14 2 14 8 20 8"/></svg></span>
          <span class="sui-tree-text">index.ts</span>
        </div>
      </div>
      <div class="sui-tree-item">
        <div class="sui-tree-label">
          <span class="sui-tree-toggle-spacer"></span>
          <span class="sui-tree-icon"><svg viewBox="0 0 24 24"><circle cx="12" cy="12" r="3"/><path d="M19.4 15a1.65 1.65 0 00.33 1.82l.06.06a2 2 0 010 2.83 2 2 0 01-2.83 0l-.06-.06a1.65 1.65 0 00-1.82-.33 1.65 1.65 0 00-1 1.51V21a2 2 0 01-4 0v-.09A1.65 1.65 0 009 19.4a1.65 1.65 0 00-1.82.33l-.06.06a2 2 0 01-2.83-2.83l.06-.06A1.65 1.65 0 004.68 15a1.65 1.65 0 00-1.51-1H3a2 2 0 010-4h.09A1.65 1.65 0 004.6 9a1.65 1.65 0 00-.33-1.82l-.06-.06a2 2 0 012.83-2.83l.06.06A1.65 1.65 0 009 4.68a1.65 1.65 0 001-1.51V3a2 2 0 014 0v.09a1.65 1.65 0 001 1.51 1.65 1.65 0 001.82-.33l.06-.06a2 2 0 012.83 2.83l-.06.06A1.65 1.65 0 0019.4 9a1.65 1.65 0 001.51 1H21a2 2 0 010 4h-.09a1.65 1.65 0 00-1.51 1z"/></svg></span>
          <span class="sui-tree-text">config.json</span>
        </div>
      </div>
    </div>
  </div>
  <div class="sui-tree-item">
    <div class="sui-tree-label">
      <span class="sui-tree-toggle"><svg viewBox="0 0 24 24"><polyline points="9 18 15 12 9 6"/></svg></span>
      <span class="sui-tree-icon"><svg viewBox="0 0 24 24"><path d="M22 19a2 2 0 01-2 2H4a2 2 0 01-2-2V5a2 2 0 012-2h5l2 3h9a2 2 0 012 2z"/></svg></span>
      <span class="sui-tree-text">public</span>
    </div>
    <div class="sui-tree-children">
      <div class="sui-tree-item">
        <div class="sui-tree-label">
          <span class="sui-tree-toggle-spacer"></span>
          <span class="sui-tree-icon"><svg viewBox="0 0 24 24"><rect x="3" y="3" width="18" height="18" rx="2" ry="2"/><circle cx="8.5" cy="8.5" r="1.5"/><polyline points="21 15 16 10 5 21"/></svg></span>
          <span class="sui-tree-text">logo.png</span>
        </div>
      </div>
      <div class="sui-tree-item">
        <div class="sui-tree-label">
          <span class="sui-tree-toggle-spacer"></span>
          <span class="sui-tree-icon"><svg viewBox="0 0 24 24"><path d="M14 2H6a2 2 0 00-2 2v16a2 2 0 002 2h12a2 2 0 002-2V8z"/><polyline points="14 2 14 8 20 8"/></svg></span>
          <span class="sui-tree-text">favicon.ico</span>
        </div>
      </div>
    </div>
  </div>
</div>

With Lines

src
components
Button.tsx
Card.tsx
Modal.tsx
utils
helpers.ts
index.ts
<div class="sui-tree sui-tree-lines">
  <div class="sui-tree-item expanded">
    <div class="sui-tree-label">
      <span class="sui-tree-toggle"><svg viewBox="0 0 24 24"><polyline points="9 18 15 12 9 6"/></svg></span>
      <span class="sui-tree-icon"><svg viewBox="0 0 24 24"><path d="M22 19a2 2 0 01-2 2H4a2 2 0 01-2-2V5a2 2 0 012-2h5l2 3h9a2 2 0 012 2z"/></svg></span>
      <span class="sui-tree-text">src</span>
    </div>
    <div class="sui-tree-children">
      <div class="sui-tree-item expanded">
        <div class="sui-tree-label">
          <span class="sui-tree-toggle"><svg viewBox="0 0 24 24"><polyline points="9 18 15 12 9 6"/></svg></span>
          <span class="sui-tree-icon"><svg viewBox="0 0 24 24"><path d="M22 19a2 2 0 01-2 2H4a2 2 0 01-2-2V5a2 2 0 012-2h5l2 3h9a2 2 0 012 2z"/></svg></span>
          <span class="sui-tree-text">components</span>
        </div>
        <div class="sui-tree-children">
          <div class="sui-tree-item">
            <div class="sui-tree-label">
              <span class="sui-tree-toggle-spacer"></span>
              <span class="sui-tree-icon"><svg viewBox="0 0 24 24"><polyline points="16 18 22 12 16 6"/><polyline points="8 6 2 12 8 18"/></svg></span>
              <span class="sui-tree-text">Button.tsx</span>
            </div>
          </div>
          <div class="sui-tree-item">
            <div class="sui-tree-label">
              <span class="sui-tree-toggle-spacer"></span>
              <span class="sui-tree-icon"><svg viewBox="0 0 24 24"><polyline points="16 18 22 12 16 6"/><polyline points="8 6 2 12 8 18"/></svg></span>
              <span class="sui-tree-text">Card.tsx</span>
            </div>
          </div>
          <div class="sui-tree-item">
            <div class="sui-tree-label">
              <span class="sui-tree-toggle-spacer"></span>
              <span class="sui-tree-icon"><svg viewBox="0 0 24 24"><polyline points="16 18 22 12 16 6"/><polyline points="8 6 2 12 8 18"/></svg></span>
              <span class="sui-tree-text">Modal.tsx</span>
            </div>
          </div>
        </div>
      </div>
      <div class="sui-tree-item">
        <div class="sui-tree-label">
          <span class="sui-tree-toggle"><svg viewBox="0 0 24 24"><polyline points="9 18 15 12 9 6"/></svg></span>
          <span class="sui-tree-icon"><svg viewBox="0 0 24 24"><path d="M22 19a2 2 0 01-2 2H4a2 2 0 01-2-2V5a2 2 0 012-2h5l2 3h9a2 2 0 012 2z"/></svg></span>
          <span class="sui-tree-text">utils</span>
        </div>
        <div class="sui-tree-children">
          <div class="sui-tree-item">
            <div class="sui-tree-label">
              <span class="sui-tree-toggle-spacer"></span>
              <span class="sui-tree-icon"><svg viewBox="0 0 24 24"><path d="M14 2H6a2 2 0 00-2 2v16a2 2 0 002 2h12a2 2 0 002-2V8z"/><polyline points="14 2 14 8 20 8"/></svg></span>
              <span class="sui-tree-text">helpers.ts</span>
            </div>
          </div>
        </div>
      </div>
      <div class="sui-tree-item">
        <div class="sui-tree-label">
          <span class="sui-tree-toggle-spacer"></span>
          <span class="sui-tree-icon"><svg viewBox="0 0 24 24"><path d="M14 2H6a2 2 0 00-2 2v16a2 2 0 002 2h12a2 2 0 002-2V8z"/><polyline points="14 2 14 8 20 8"/></svg></span>
          <span class="sui-tree-text">index.ts</span>
        </div>
      </div>
    </div>
  </div>
</div>

With Checkboxes

Documents
Resume.pdf
Cover Letter.docx
Portfolio.pdf
Images
photo.jpg
banner.png
<div class="sui-tree">
  <div class="sui-tree-item expanded">
    <div class="sui-tree-label">
      <span class="sui-tree-toggle"><svg viewBox="0 0 24 24"><polyline points="9 18 15 12 9 6"/></svg></span>
      <label class="sui-checkbox"><input type="checkbox"><span class="sui-check-mark"></span></label>
      <span class="sui-tree-text">Documents</span>
    </div>
    <div class="sui-tree-children">
      <div class="sui-tree-item">
        <div class="sui-tree-label">
          <span class="sui-tree-toggle-spacer"></span>
          <label class="sui-checkbox"><input type="checkbox" checked><span class="sui-check-mark"></span></label>
          <span class="sui-tree-text">Resume.pdf</span>
        </div>
      </div>
      <div class="sui-tree-item">
        <div class="sui-tree-label">
          <span class="sui-tree-toggle-spacer"></span>
          <label class="sui-checkbox"><input type="checkbox" checked><span class="sui-check-mark"></span></label>
          <span class="sui-tree-text">Cover Letter.docx</span>
        </div>
      </div>
      <div class="sui-tree-item">
        <div class="sui-tree-label">
          <span class="sui-tree-toggle-spacer"></span>
          <label class="sui-checkbox"><input type="checkbox"><span class="sui-check-mark"></span></label>
          <span class="sui-tree-text">Portfolio.pdf</span>
        </div>
      </div>
    </div>
  </div>
  <div class="sui-tree-item expanded">
    <div class="sui-tree-label">
      <span class="sui-tree-toggle"><svg viewBox="0 0 24 24"><polyline points="9 18 15 12 9 6"/></svg></span>
      <label class="sui-checkbox"><input type="checkbox" checked><span class="sui-check-mark"></span></label>
      <span class="sui-tree-text">Images</span>
    </div>
    <div class="sui-tree-children">
      <div class="sui-tree-item">
        <div class="sui-tree-label">
          <span class="sui-tree-toggle-spacer"></span>
          <label class="sui-checkbox"><input type="checkbox" checked><span class="sui-check-mark"></span></label>
          <span class="sui-tree-text">photo.jpg</span>
        </div>
      </div>
      <div class="sui-tree-item">
        <div class="sui-tree-label">
          <span class="sui-tree-toggle-spacer"></span>
          <label class="sui-checkbox"><input type="checkbox" checked><span class="sui-check-mark"></span></label>
          <span class="sui-tree-text">banner.png</span>
        </div>
      </div>
    </div>
  </div>
</div>

Sizes

Small
src
index.ts
config.json
Default
src
index.ts
config.json
Large
src
index.ts
config.json
<!-- Small -->
<div class="sui-tree sui-tree-sm">
  <div class="sui-tree-item expanded">
    <div class="sui-tree-label">
      <span class="sui-tree-toggle"><svg viewBox="0 0 24 24"><polyline points="9 18 15 12 9 6"/></svg></span>
      <span class="sui-tree-text">src</span>
    </div>
    <div class="sui-tree-children">
      <div class="sui-tree-item">
        <div class="sui-tree-label">
          <span class="sui-tree-toggle-spacer"></span>
          <span class="sui-tree-text">index.ts</span>
        </div>
      </div>
      <div class="sui-tree-item">
        <div class="sui-tree-label">
          <span class="sui-tree-toggle-spacer"></span>
          <span class="sui-tree-text">config.json</span>
        </div>
      </div>
    </div>
  </div>
</div>

<!-- Default -->
<div class="sui-tree">
  <div class="sui-tree-item expanded">
    <div class="sui-tree-label">
      <span class="sui-tree-toggle"><svg viewBox="0 0 24 24"><polyline points="9 18 15 12 9 6"/></svg></span>
      <span class="sui-tree-text">src</span>
    </div>
    <div class="sui-tree-children">
      <div class="sui-tree-item">
        <div class="sui-tree-label">
          <span class="sui-tree-toggle-spacer"></span>
          <span class="sui-tree-text">index.ts</span>
        </div>
      </div>
      <div class="sui-tree-item">
        <div class="sui-tree-label">
          <span class="sui-tree-toggle-spacer"></span>
          <span class="sui-tree-text">config.json</span>
        </div>
      </div>
    </div>
  </div>
</div>

<!-- Large -->
<div class="sui-tree sui-tree-lg">
  <div class="sui-tree-item expanded">
    <div class="sui-tree-label">
      <span class="sui-tree-toggle"><svg viewBox="0 0 24 24"><polyline points="9 18 15 12 9 6"/></svg></span>
      <span class="sui-tree-text">src</span>
    </div>
    <div class="sui-tree-children">
      <div class="sui-tree-item">
        <div class="sui-tree-label">
          <span class="sui-tree-toggle-spacer"></span>
          <span class="sui-tree-text">index.ts</span>
        </div>
      </div>
      <div class="sui-tree-item">
        <div class="sui-tree-label">
          <span class="sui-tree-toggle-spacer"></span>
          <span class="sui-tree-text">config.json</span>
        </div>
      </div>
    </div>
  </div>
</div>

Raised

project
src
App.tsx
index.ts
package.json
<div class="sui-tree sui-tree-raised sui-tree-lines">
  <!-- same tree structure as other examples -->
  <!-- sui-tree-raised adds a raised neumorphic container -->
</div>

Inset

project
src
App.tsx
index.ts
package.json
<div class="sui-tree sui-tree-inset sui-tree-lines">
  <div class="sui-tree-item expanded">
    <div class="sui-tree-label">
      <span class="sui-tree-toggle"><svg viewBox="0 0 24 24"><polyline points="9 18 15 12 9 6"/></svg></span>
      <span class="sui-tree-icon"><svg viewBox="0 0 24 24"><path d="M22 19a2 2 0 01-2 2H4a2 2 0 01-2-2V5a2 2 0 012-2h5l2 3h9a2 2 0 012 2z"/></svg></span>
      <span class="sui-tree-text">project</span>
    </div>
    <div class="sui-tree-children">
      <div class="sui-tree-item expanded">
        <div class="sui-tree-label">
          <span class="sui-tree-toggle"><svg viewBox="0 0 24 24"><polyline points="9 18 15 12 9 6"/></svg></span>
          <span class="sui-tree-icon"><svg viewBox="0 0 24 24"><path d="M22 19a2 2 0 01-2 2H4a2 2 0 01-2-2V5a2 2 0 012-2h5l2 3h9a2 2 0 012 2z"/></svg></span>
          <span class="sui-tree-text">src</span>
        </div>
        <div class="sui-tree-children">
          <div class="sui-tree-item">
            <div class="sui-tree-label">
              <span class="sui-tree-toggle-spacer"></span>
              <span class="sui-tree-icon"><svg viewBox="0 0 24 24"><polyline points="16 18 22 12 16 6"/><polyline points="8 6 2 12 8 18"/></svg></span>
              <span class="sui-tree-text">App.tsx</span>
            </div>
          </div>
          <div class="sui-tree-item">
            <div class="sui-tree-label">
              <span class="sui-tree-toggle-spacer"></span>
              <span class="sui-tree-icon"><svg viewBox="0 0 24 24"><path d="M14 2H6a2 2 0 00-2 2v16a2 2 0 002 2h12a2 2 0 002-2V8z"/><polyline points="14 2 14 8 20 8"/></svg></span>
              <span class="sui-tree-text">index.ts</span>
            </div>
          </div>
        </div>
      </div>
      <div class="sui-tree-item">
        <div class="sui-tree-label">
          <span class="sui-tree-toggle-spacer"></span>
          <span class="sui-tree-icon"><svg viewBox="0 0 24 24"><circle cx="12" cy="12" r="3"/><path d="M19.4 15a1.65 1.65 0 00.33 1.82l.06.06a2 2 0 010 2.83 2 2 0 01-2.83 0l-.06-.06a1.65 1.65 0 00-1.82-.33 1.65 1.65 0 00-1 1.51V21a2 2 0 01-4 0v-.09A1.65 1.65 0 009 19.4a1.65 1.65 0 00-1.82.33l-.06.06a2 2 0 01-2.83-2.83l.06-.06A1.65 1.65 0 004.68 15a1.65 1.65 0 00-1.51-1H3a2 2 0 010-4h.09A1.65 1.65 0 004.6 9a1.65 1.65 0 00-.33-1.82l-.06-.06a2 2 0 012.83-2.83l.06.06A1.65 1.65 0 009 4.68a1.65 1.65 0 001-1.51V3a2 2 0 014 0v.09a1.65 1.65 0 001 1.51 1.65 1.65 0 001.82-.33l.06-.06a2 2 0 012.83 2.83l-.06.06A1.65 1.65 0 0019.4 9a1.65 1.65 0 001.51 1H21a2 2 0 010 4h-.09a1.65 1.65 0 00-1.51 1z"/></svg></span>
          <span class="sui-tree-text">package.json</span>
        </div>
      </div>
    </div>
  </div>
</div>

Delete this item?

This action cannot be undone. This will permanently delete the item and remove all associated data.