npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

ts-treeview

v0.2.0

Published

Bootstrap Tree View for TS compatibility.

Readme

ts-treeview

TreeView List written with TypeScript for easy integration into projects. Based on Bootstrap styles, but code is very simple and you can change everything by ourselves.

No dependencies, vanila JS

I made this tree view becouse i cant find 'easy to use' treeview for TS and my NodeJs project Maptorium

Demo

Instalation

In your html file, add ts-treeview.css and ts-treeview.js from the folder dist.

For TS users

Install ts-treeview by npm manager

npm install ts-treeview

After include ts-treeview to your project

import TreeView from "ts-treeview";

Usage

HTML prepared list

<div id="treeview">
    <h6 class="pt-3 pl-3">Folders</h6>
    <hr>
    <ul class="mb-1 pl-3 pb-2">
        <li>
            <a class="closed">
                <i class="fas fa-angle-right rotate"></i>
                <span><i class="far fa-envelope-open ic-w mx-1"></i>Mail</span>
            </a>
            <ul class="nested">
                <li><i class="far fa-bell ic-w mr-1"></i>Offers</li>
                <li><i class="far fa-address-book ic-w mr-1"></i>Contacts</li>
                <li>
                    <a class="closed">
                      <i class="fas fa-angle-right rotate"></i>
                      <span><i class="far fa-calendar-alt ic-w mx-1"></i>Calendar</span>
                    </a>
                    <ul class="nested">
                      <li><i class="far fa-clock ic-w mr-1"></i>Deadlines</li>
                      <li><i class="fas fa-users ic-w mr-1"></i>Meetings</li>
                      <li><i class="fas fa-basketball-ball ic-w mr-1"></i>Workouts</li>
                      <li><i class="fas fa-mug-hot ic-w mr-1"></i>Events</li>
                    </ul>
                </li>
            </ul>
        </li>
    </ul>
</div>

After init TreeList plugin.

let treeview = new TreeList({
    element: "treeview"
});

This code parses HTML and binds events to the list.

JSON Data

let listData = [
    {
        text: "Mail",
        icon: ["far", "fa-envelope-open"],
        iconOpen: ["far", "fa-envelope-open"],
        id: "someidstring",
        items: [
            {
                text: "Offers",
                icon: ["far", "fa-bell"]
            },
            {
                text: "Contacts",
                icon: ["far", "fa-address-book"]
            },
            {
                text: "Calendar",
                icon: ["far", "fa-calendar-alt"],
                items: [
                    {
                        text: "Deadlines",
                        icon: ["far", "fa-clock"]
                    },
                    {
                        text: "Meetings",
                        icon: ["fas", "fa-users"]
                    },
                    {
                        text: "Workouts",
                        icon: ["fas", "fa-basketball-ball"]
                    },
                    {
                        text: "Events",
                        icon: ["fas", "fa-mug-hot"]
                    }
                ]
            }
        ]
    }
]

Prepare HTML container

<div id="treeview"></div>

After init TreeList plugin.

let treeview = new TreeList({
    element: "treeview",
    items: listData
});

This code parses JSON, does DOM for list and binds events.

Options

Class

//HTML container ID where list will be attached
element: string,
//Change default class for container
class?: Array<string>,
//If null, no header will be created
header?: string | null,
//Change default class for header 
headerClass?: Array<string>,
//If true, dblclick event on item will replace item with text field. (not implemented)
editable?: boolean,
//Array with list items
items?: Array<ListItem>,
//Replace standart class for item there
listClass?: Array<string>,
//Replace standart class for sub list
subListClass?: Array<string>,
//Replace standart class for item what not contain sub items
itemClass?: Array<string>
//If item contain sub items, item will be created with this class instead of itemClass
listSubClass?: Array<string>,
//If litem contain sub items, arrow with class will be shown
listSubArrowClass?: Array<string>,
//Replace standart check box class
checkBoxClass?: Array<string>,

Item

//Item text
text:string,
/*
* Custom ID for item. If ID is empty, it will be inserted in the next step:
* For top level ID will be 0, 1, 2, 3.
* For child items ID will be 0.0, 0.1, ..., 3.0, 3.1
* For child items ID will be 0.0.0, 0.0.1, ..., 3.0.0, 3.0.1
* And so on
*/
id?:string,
//Item icon class
icon?: Array<string>,
//Item icon class to change when sub item`s list expanded
iconOpen?:Array<string>
//Reserved. Not implemented.
closed?: boolean,
//If item must be together with check box
checkBox?: boolean,
//List of sub items
items?: Array<ListItem> | null

Methods

| Method | Returns | Description | |-|-|-| |on(<EventType>, (ID:string))|void| Register the recall to be triggered. The item ID is returned where the event occurred.| |update(<Item>)|bollean|Update items with new json data. Replace/delete all sub-items if not specified in json. Returns true if item was found with ID, false - if not.| |remove(ID:string)| boolean | Remove item from DOM. Also remove all sub-items. Returns true if item was found, false - if not.|

EventType

Available events for the list. If an item has sub-items, that item is recognized as a folder.

edit = "edit",
itemclick = "item.click",
itemdblclick = "item.dblclick",
folderclick = "folder.click",
folderdblclick = "folder.dblclick",
itemcheckbox = "item.checkbox",
foldercheckbox = "folder.checkbox"

Example

//init Treelist and parse JSON Data
let treeview = new TreeList({
    element: "treeview",
    items: listData
});
//Fired when item is clicked
treeview.on("item.click", (elID) => {
    console.log('Element click', elID);
});
//Fired when item is dbl clicked.
treeview.on("item.dblclick", (elID) => {
    console.log("Element dblclick", elID);
})
//Fired when item what have sub items is clicked.
treeview.on("folder.click", (elID) => {
    console.log('Folder click', elID);
});
//Fired when item what have sub items is dbl clicked.
treeview.on("folder.dblclick", (elID) => {
    console.log("Folder dblclick", elID);
})
//Fired when checkbox for item is clicked
treeview.on("item.checkbox", (elID, checked) => {
    console.log('Item checkbox', elID, checked);
});
//Fired when checkbox for folder is clicked.
treeview.on("folder.checkbox", (elID, checked) => {
    console.log("Folder checkbox", elID, checked);
})
document.getElementById("itemEnable").addEventListener("click", () => {
    //Show checkboxes for items only
    treeview.checkbox(true, "item");
});

document.getElementById("folderEnable").addEventListener("click", () => {
    //Show checkboxes for folder only
    treeview.checkbox(true, "folder");
});

document.getElementById("bothEnable").addEventListener("click", () => {
    //Show checkboxes for folder and item
    treeview.checkbox(true, "both");
});

document.getElementById("bothDisable").addEventListener("click", () => {
    //Hide checkboxes
    treeview.checkbox(false);
});