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

schedula-core

v1.7.0

Published

Fast, lightweight Gantt chart & resource scheduler component in vanilla JavaScript. Zero dependencies, framework-agnostic, single <script> tag. MIT core with optional PRO plugins (drag & drop, resize, dependency links, calendar).

Readme

SchedulaCore

A fast, lightweight Gantt/scheduler component for the web. No framework dependencies — works with vanilla JavaScript or any frontend stack. And when you do use a framework, there's an official wrapper for React, Vue 3 and Angular, so you can drop it in as a native component (<SchedulaGantt … />) with declarative props, typed APIs and reactive updates — no manual DOM wiring.

SchedulaCore Blue Theme

Live Demo

npm React Vue Angular

Open live demo

Features

  • Resource-based Gantt view — rows are resources, columns are time
  • Multiple item stylesrect, round-rect, arrow, circle
  • Built-in themes — Default, Dark, Blue, Soft (switchable at runtime)
  • Task popup — click any item to view/edit (built-in, no configuration needed)
  • Resource grouping and filtering — multi-group toggle, text search
  • Smooth animations — animated shifts, transitions and progress bars
  • Event notifications — intercept every action via window.SchedulaHandlers
  • Plugin architecture — extend via ISchedulaPlugin
  • IIFE bundle — drop a single <script> tag, no build step needed
  • Official React / Vue / Angular wrappers — native component, declarative props, reactive updates (schedula-core-react, schedula-core-vue, schedula-core-angular)

Free vs PRO

| Feature | Free | PRO | |---------|------|-----| | JSON data, themes, animations, popup | ✓ | ✓ | | Switchable views (zoom) | ✓ | ✓ | | Event notifications | ✓ | ✓ | | Customizable settings | ✓ | ✓ | | Drag & drop items | | ✓ | | Resize items | | ✓ | | Edit mode toggle (runtime) | | ✓ | | Dependency links | | ✓ | | Calendar exceptions & holidays | | ✓ | | Context menus (customizable) | | ✓ | | Events / milestones | | ✓ | | Resource & item icons | | ✓ | | Custom popup provider | | ✓ | | Incremental update API | | ✓ |


Install

With npm (bundler — Vite, webpack, esbuild, …):

npm install schedula-core
import { SchedulaCore, SchedulaSettings } from 'schedula-core';
import 'schedula-core/css';        // core styles
import 'schedula-core/css/popup';  // task popup
// optional themes: import 'schedula-core/css/themes';

Bundled TypeScript types are included — no @types package needed.

React / Vue / Angular — use the official wrappers (declarative, typed components):

| Framework | Package | |---|---| | React 17+ | npm i schedula-core schedula-core-react | | Vue 3 | npm i schedula-core schedula-core-vue | | Angular 16+ | npm i schedula-core schedula-core-angular |

See INTEGRATION.md for full examples, plus Next.js, Nuxt, Svelte and Blazor.

Or via a <script> tag (no build step, no npm):

<link rel="stylesheet" href="https://unpkg.com/schedula-core/css/schedula-core.css">
<script src="https://unpkg.com/schedula-core"></script>

Want to see it first? A standalone, offline demo is bundled in the package — open package-demo.html in a browser (no server needed).


Quick start

<link rel="stylesheet" href="css/schedula-core.css">
<div id="scheduler"></div>
<script src="js/schedula-core.min.js"></script>

<script>
    var data = {
        Resources: [
            { Id: "1", Name: "Alice", Items: [
                { Id: "t1", Text: "Design phase", Offset: 0, Width: 2880, Color1: "#2043D9" },
                { Id: "t2", Text: "Development",  Offset: 2880, Width: 4320, Color1: "#006BF7" }
            ]},
            { Id: "2", Name: "Bob", Items: [
                { Id: "t3", Text: "Testing", Offset: 1440, Width: 1440, Color1: "#00AAB5" }
            ]}
        ]
    };

    var settings = new SchedulaSettings();
    settings.date = new Date();

    var scheduler = new SchedulaCore("scheduler", data, settings);
    scheduler.init();
</script>

settings.date is the reference date for the timeline. Each item's Offset is the start position in minutes from that date, and Width is the duration in minutes. The component handles all the rendering — click any item to open the built-in popup.


Data format

Resources and Items

{
    Resources: [
        {
            Id: "r1",              // unique resource identifier
            Name: "Alice",         // display name
            Group: 1,              // optional: for group filtering
            Items: [ ... ]         // array of scheduled tasks
        }
    ]
}

Item fields

| Field | Type | Required | Description | |-------|------|----------|-------------| | Id | string | yes | Unique identifier | | Text | string | yes | Display title | | Offset | number | yes | Start position (minutes from settings.date) | | Width | number | yes | Duration in minutes | | Color1 | string | | Hex color (e.g. "#2043D9") | | Description | string | | Second line of text | | Completion | number | | Progress percentage (0-100) | | Effort | number | | Net working minutes (calendar-aware, PRO) | | Classes | string | | CSS classes (space-separated) | | Link | string | | Dependency link to another item's Id (PRO) | | Type | string | | Shape override: "Arrow", "Circle", "Gantt" |

How positioning works: settings.date is the origin of the timeline (typically today or the start of the planning period). An item with Offset: 1440 starts 1 day after settings.date (1440 minutes = 24 hours). An item with Width: 2880 lasts 2 days.


API

var scheduler = new SchedulaCore(elementId, data, settings);
scheduler.init();

| Method | Description | |--------|-------------| | init() | Build the component (call once) | | refresh() | Redraw after external data changes | | setData(data) | Replace all data and redraw | | setView(n) | Set visible time units (e.g. 30 = 30-day window) | | setStyle(style) | Item shape: "rect", "round-rect", "arrow", "circle" | | filterItems(text) | Filter items by text (empty = clear filter) |


Settings

var settings = new SchedulaSettings();

// Timeline
settings.date           = new Date();    // reference start date
settings.timeUnitsView  = 30;           // visible days
settings.timeUnitVal    = 1440;         // minutes per time unit (1440 = 1 day)
settings.gridStep       = 1440;         // snap grid in minutes

// Appearance
settings.gStyle         = 'round-rect'; // item shape
settings.resourceHeight = 48;           // row height in px
settings.resourceWidth  = 200;          // sidebar width in px
settings.hilightSunday  = true;         // highlight Sundays
settings.animation      = true;         // CSS transitions
settings.locale         = 'en-US';      // date format locale

NotificationPlugin

Intercept scheduler events without modifying the component — edit notification-handlers.js:

window.SchedulaHandlers = {
    // Return false to cancel the action (veto)
    onBeforeItemChange(item, oldState) { return true; },
    onBeforeItemAdd(item)              { return true; },
    onBeforeItemDelete(item)           { return true; },

    // Post-action hooks
    onItemChanged(item, element) { console.log('changed', item.Id); },
    onItemAdded(item)            { console.log('added', item); },
    onItemDeleted(item)          { console.log('deleted', item.Id); },
    onItemSaved(item)            { console.log('saved', item); },
    onItemResizing(item, widthMinutes, element) { /* PRO: live resize feedback */ },
    onCalendarChanged(rule, action) { console.log(action, rule); },
};

Load the plugin before the core bundle:

<script src="js/notification-handlers.js"></script>
<script src="js/schedula-core.min.js"></script>

Themes

settings.theme = 'theme-dark';
// or: 'theme-blue', 'theme-soft', '' (default)

Browser support

ES2015+ (Chrome, Firefox, Edge, Safari). IE not supported.


Used in production

| Product | Industry | Notes | |---------|----------|-------| | OVERCORE | Hotel & hospitality | Booking and room scheduling software | | MECCANICA H7 | Manufacturing | Production scheduling for mechanical workshops | | SCHEDULA Planner | Manufacturing / ERP | Production planning with ERP integration |


PRO license

SchedulaCore PRO adds drag & drop, resize, runtime edit mode, dependency links, calendar exceptions & holidays, context menus, resource/item icons, custom popups and the incremental update API.

Licensing is per project, not per developer — one license covers your whole team. All licenses are perpetual (one-time payment) and include 1 year of updates and support. Every license lets you build your application and ship it to unlimited end users.

| License | Price | What it covers | |---------|-------|----------------| | Single Project | €499 | Use in one application. Ship it to unlimited end users — internal or commercial. | | Unlimited Projects | €1,990 | Use in any number of applications within your company. Unlimited end users. | | OEM / Redistribution | Contact us | Required only if SchedulaCore PRO is redistributed as a component, or embedded in a product or SaaS that is resold or sublicensed to third parties. |

For comparison, comparable commercial Gantt components are priced at $700–900 per developer. SchedulaCore PRO is licensed per project, so one license covers your entire team.

To purchase or request a quote: [email protected]


License

MIT — see LICENSE. PRO plugins are distributed under a separate commercial license.