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

@preline/datepicker

v4.2.0

Published

Preline UI is an open-source set of prebuilt UI components based on the utility-first Tailwind CSS framework.

Downloads

3,124

Readme

Advanced Datepicker

Create visually appealing and interactive datepickers in combination with the Datepicker JavaScript plugin.

npm License: MIT Demo

Contents

Overview

The Advanced Datepicker component provides a comprehensive date selection interface with support for custom templates, multiple date formats, time selection, and integration with Vanilla Calendar Pro. It offers flexible configuration options for styling and behavior.

Key Features:

  • Date and time selection
  • Custom select inputs for months, years, and time
  • Multiple date formats and locales
  • Custom templates for arrows and time display
  • Integration with Vanilla Calendar Pro
  • Programmatic control via JavaScript API
  • Utility classes support

Installation

To get started, install Datepicker plugin via npm, else you can skip this step if you are already using Preline UI as a package.

npm i @preline/select @preline/datepicker

CSS

Use @source to register the plugin's JavaScript path for Tailwind CSS scanning, then @import the plugin's CSS files into your Tailwind CSS file.

Use styles.css with theme.css for the default themed appearance:

@import "tailwindcss";

/* @preline/select */
@source "../node_modules/@preline/select/*.js";
@import "./node_modules/@preline/select/variants.css";

/* @preline/datepicker */
@source "../node_modules/@preline/datepicker/*.js";
@import "./node_modules/@preline/datepicker/variants.css";
@import "./node_modules/@preline/datepicker/styles.css";
@import "./node_modules/@preline/datepicker/theme.css";

Use styles-utility.css instead when you plan to style the datepicker entirely with Tailwind utility classes. In this case theme.css is not needed:

@import "tailwindcss";

/* @preline/select */
@source "../node_modules/@preline/select/*.js";
@import "./node_modules/@preline/select/variants.css";
@import "./node_modules/@preline/select/theme.css";

/* @preline/datepicker */
@source "../node_modules/@preline/datepicker/*.js";
@import "./node_modules/@preline/datepicker/variants.css";
@import "./node_modules/@preline/datepicker/styles-utility.css";

@preline/select is required for styling the embedded select dropdowns used in custom-select mode.

JavaScript

Include the JavaScript that powers the interactive elements near the end of your </body> tag:

<script src="./node_modules/@preline/datepicker/index.js"></script>

Manual Initialization

Use the non-auto entry if you need manual initialization. In this mode, automatic initialization on page load is not included, so the component should be initialized explicitly.

<script type="module">
  import HSDatepicker from "@preline/datepicker/non-auto.mjs";

  new HSDatepicker(document.querySelector("#datepicker"));
</script>

Via Bundler

When using a bundler (Vite, webpack, etc.), import the plugin directly as an ES module. vanilla-calendar-pro and the Advanced Select plugin are bundled inside @preline/datepicker, so no separate imports are needed.

@preline/datepicker is the auto-init entry: it scans the DOM and initializes matching elements automatically.

import "@preline/datepicker";

@preline/datepicker/non-auto is the manual entry: use it when you want explicit control over when initialization happens, either via autoInit() or by creating a specific instance yourself.

import HSDatepicker from "@preline/datepicker/non-auto";

HSDatepicker.autoInit();

// Or initialize a specific element manually
const el = document.querySelector("#datepicker");
if (el) new HSDatepicker(el);

TypeScript

This package ships with TypeScript type definitions. No additional @types/ package is needed.

Basic usage

The following example demonstrates the minimal HTML structure required for an advanced datepicker component. This is a base template without custom styling - you can apply your own CSS classes and styles as needed. The datepicker appears when the input is focused.

<input
  class="hs-datepicker"
  type="text" placeholder="" 
  readonly
  data-hs-datepicker='{
    "type": "default",
    "dateMax": "2050-12-31",
    "styles": {
      "week": "vc-week",
      "weekDay": "vc-week__day",
      "dates": "vc-dates",
      "date": "vc-date",
      "arrowPrev": "vc-arrow vc-arrow_prev",
      "arrowNext": "vc-arrow vc-arrow_next"
    },
    "mode": "custom-select"
  }'>

Structure Requirements:

  • hs-datepicker: Required class on the input element
  • data-hs-datepicker: Required attribute containing configuration options as JSON
  • readonly attribute on the input to prevent manual editing
  • type="text" on the input element

Initial State:

  • Input field is empty by default
  • Datepicker appears when input is focused or clicked

Configuration Options

Data Options

Note: This component requires the use of the Vanilla Calendar Pro plugin. Most options available in the plugin are available in our wrapper. Check Vanilla Calendar Pro Options for more details.

Data options are specified in the data-hs-datepicker attribute as a JSON object.

| Option | Target Element | Type | Default | Description | | --- | --- | --- | --- | --- | | data-hs-datepicker | Input element | - | - | Activate a Datepicker by specifying on an element. Should be added to the element itself. | | :mode | Inside data-hs-datepicker | "default" | "custom-select" | "default" | This option allows you to specify the operational mode of the datepicker. default uses standard layout provided by Vanilla Calendar Pro. custom-select activates custom select inputs for months, years and time elements. | | :applyUtilityClasses | Inside data-hs-datepicker | boolean | false | Specifies whether to apply utility classes to the datepicker. If set to true, the datepicker receives utility classes based on the primary theme. | | :inputModeOptions.dateSeparator | Inside data-hs-datepicker | string | "." | Specifies the character used to separate the year, month, and day in the date format displayed in the input field. E.g., / produces a date format like 2024/01/22. | | :inputModeOptions.itemsSeparator | Inside data-hs-datepicker | string | ", " | Specifies the character or string used to separate multiple date entries in the input field when multiple dates are selected. E.g., \| produces a format like 2024-01-22 \| 2024-01-23. | | :styles.customSelect.shared | Inside data-hs-datepicker | object | - | Defines shared styling configurations for Advanced Custom Select components. These styles are consistently applied to all instances of the Advanced Custom Select within the wrapper. See Advanced Select Options for available options. | | :styles.customSelect.months | Inside data-hs-datepicker | object | - | Defines additional styling configurations specifically for the "months" instance of the Advanced Custom Select. See Advanced Select Options for available options. | | :styles.customSelect.years | Inside data-hs-datepicker | object | - | Defines additional styling configurations specifically for the "years" instance of the Advanced Custom Select. See Advanced Select Options for available options. | | :styles.customSelect.hours | Inside data-hs-datepicker | object | - | Defines additional styling configurations specifically for the "hours" instance of the Advanced Custom Select. See Advanced Select Options for available options. | | :styles.customSelect.minutes | Inside data-hs-datepicker | object | - | Defines additional styling configurations specifically for the "minutes" instance of the Advanced Custom Select. See Advanced Select Options for available options. | | :styles.customSelect.meridiem | Inside data-hs-datepicker | object | - | Defines additional styling configurations specifically for the "meridiem" instance of the Advanced Custom Select. See Advanced Select Options for available options. | | :templates.time | Inside data-hs-datepicker | string | - | Allows to define a custom HTML template for rendering the time selection interface within the datepicker. | | :templates.arrowPrev | Inside data-hs-datepicker | string | - | Allows to define a custom HTML template for the "previous" navigation arrow in the datepicker. | | :templates.arrowNext | Inside data-hs-datepicker | string | - | Allows to define a custom HTML template for the "next" navigation arrow in the datepicker. | | :dateFormat | Inside data-hs-datepicker | string | - | Allows to define a custom date format. | | :dateLocale | Inside data-hs-datepicker | string | - | Allows to define the locale for the datepicker. | | :replaceTodayWithText | Inside data-hs-datepicker | boolean | - | Replace the current day name with the text "Today". |

Example:

<input
  class="hs-datepicker"
  type="text"
  readonly
  data-hs-datepicker='{
    "mode": "custom-select",
    "dateFormat": "YYYY-MM-DD",
    "dateLocale": "en",
    "inputModeOptions": {
      "dateSeparator": "/"
    }
  }'>

Tailwind Modifiers

| Name | Description | | --- | --- | | hs-vc-date-today:* | A modifier that applies Tailwind classes to the current date (marked as "today") using the attribute data-vc-date-today. | | hs-vc-date-selected:* | A modifier that applies Tailwind classes to the selected dates using the attribute data-vc-date-selected. | | hs-vc-date-weekend:* | A modifier that applies Tailwind classes to weekend dates using the attribute data-vc-date-weekend. | | hs-vc-week-day-off:* | A modifier that applies Tailwind classes to weekdays marked as "day off" using the attribute data-vc-week-day-off. | | hs-vc-date-month-prev:* | A modifier that applies Tailwind classes to dates belonging to the previous month using the class data-vc-date-month="prev". | | hs-vc-date-month-next:* | A modifier that applies Tailwind classes to dates belonging to the next month using the attribute data-vc-date-month="next". | | hs-vc-calendar-selected-middle:* | A modifier that applies Tailwind classes to dates that are in the middle of a selected range using the attribute data-vc-date-selected="middle". | | hs-vc-calendar-selected-first:* | A modifier that applies Tailwind classes to the first date in a selected range using the attribute data-vc-date-selected="first". | | hs-vc-calendar-selected-last:* | A modifier that applies Tailwind classes to the last date in a selected range using the attribute data-vc-date-selected="last". | | hs-vc-months-month-selected:* | A modifier that applies Tailwind classes to the currently selected month using the attribute data-vc-months-month-selected. | | hs-vc-years-year-selected:* | A modifier that applies Tailwind classes to the currently selected year using the attribute data-vc-years-year-selected. |

JavaScript API

Note: This component requires the use of the Vanilla Calendar Pro plugin. Most methods available in the plugin are available through our wrapper. Check Vanilla Calendar Pro Methods for more details.

The HSDatepicker object is available in the global window object after the plugin is loaded. Most methods from Vanilla Calendar Pro are available through the wrapper.

Instance Methods

These methods are called on a datepicker instance.

| Method | Parameters | Return Type | Description | | --- | --- | --- | --- | | getCurrentState() | None | { selectedDates: DatesArr, selectedTime: string } | Returns the current state of the datepicker including selected dates and time. | | formatDate(date, format) | date: string \| number \| Dateformat: string (optional) | string | Formats a date according to the specified format or the datepicker's default format. | | destroy() | None | void | Destroys the datepicker instance, removes all generated markup, classes, and event listeners. Use when removing datepicker from DOM. |

Static Methods

These methods are called directly on the HSDatepicker class.

| Method | Parameters | Return Type | Description | | --- | --- | --- | --- | | HSDatepicker.getInstance(target, isInstance) | target: HTMLElement \| string (CSS selector)isInstance: boolean (optional) | HTMLElement \| { id: string \| number, element: HSDatepicker } \| null | Returns the datepicker instance or element associated with the target. If isInstance is true, returns collection item object { id, element } where element is the HSDatepicker instance. If isInstance is false or omitted, returns the DOM element (HTMLElement). Returns null if datepicker instance is not found. |

Usage Examples

Example 1: Getting current state

// Get the datepicker instance
const instance = HSDatepicker.getInstance('.hs-datepicker', true);

if (instance) {
  const { element } = instance;
  // Get current state
  const state = element.getCurrentState();

  console.log('Selected dates:', state.selectedDates);
  console.log('Selected time:', state.selectedTime);
}

Example 2: Formatting dates

const instance = HSDatepicker.getInstance('.hs-datepicker', true);

if (instance) {
  const { element } = instance;
  // Format a date
  const formatted = element.formatDate(new Date(), 'YYYY-MM-DD');

  console.log('Formatted date:', formatted);
}

Example 3: Destroying datepicker instance

const instance = HSDatepicker.getInstance('.hs-datepicker', true);

if (instance) {
  const { element } = instance;
  const removeBtn = document.querySelector('#hs-remove-btn');

  removeBtn.addEventListener('click', () => {
    // Clean up before removing from DOM
    element.destroy();
    // Now safe to remove the element
    document.querySelector('.hs-datepicker').remove();
  });
}

Events

Datepicker instances emit events that can be listened to for date selection lifecycle hooks.

| Event Name | When Fired | Callback Parameter | Description | | --- | --- | --- | --- | | on:change | When the selected date or time changes | { selectedDates: string[], selectedTime: string } (current selection state) | Fires after the user picks a date or changes the time. The payload matches the shape returned by getCurrentState(). |

Event Usage Example

// Get datepicker instance
const instance = HSDatepicker.getInstance('.hs-datepicker', true);

if (instance) {
  const { element } = instance;

  // Listen for date or time changes
  element.on('change', ({ selectedDates, selectedTime }) => {
    console.log('Selected dates:', selectedDates);
    console.log('Selected time:', selectedTime);
    // Update dependent fields, validate form, etc.
  });
}

Common Patterns

Pattern 1: Custom Select Mode

Use custom select inputs for months, years, and time.

<input
  class="hs-datepicker"
  type="text"
  readonly
  data-hs-datepicker='{
    "mode": "custom-select"
  }'>

Pattern 2: Custom Date Format

Set a custom date format and separator.

<input
  class="hs-datepicker"
  type="text"
  readonly
  data-hs-datepicker='{
    "dateFormat": "YYYY-MM-DD",
    "inputModeOptions": {
      "dateSeparator": "/"
    }
  }'>

License

Copyright (c) 2026 Preline Labs.

Licensed under the MIT License.