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

@elementmints/date

v1.1.0

Published

A lightweight, dependency-free, attribute-driven date picker library

Downloads

26

Readme

@elementmints/date

npm version CI bundle size license

A lightweight (<10 KB gzipped), dependency-free, attribute-driven date picker for the web. Drop in a script tag, add data-datepicker to an input, and you're done -- no configuration required.

Features

  • Auto-init -- just add data-datepicker to any <input> and the picker initializes itself
  • Segment editing -- type directly into day, month, and year segments with arrow-key navigation
  • Dual format -- separate display format (DD/MM/YYYY) from the submitted value (ISO, epoch, or unix)
  • Validation -- built-in required, min/max range, and custom rules (weekday, future, past); async validation via URL
  • Accessibility -- full ARIA attributes, focus trapping, screen-reader announcements, keyboard navigation
  • Internationalization -- locale-aware month and day names powered by Intl.DateTimeFormat
  • Theming -- light, dark, and system-preference themes via CSS custom properties
  • Zero dependencies -- no runtime dependencies, ever

Quick Start

CDN

The fastest way to get started. Include the script and stylesheet, then add data-datepicker to an input:

<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@elementmints/date/dist/date.min.css">
<script src="https://cdn.jsdelivr.net/npm/@elementmints/date/dist/iife/date.min.js"></script>

<input type="text" data-datepicker>

That's it. The picker auto-initializes on DOMContentLoaded.

NPM

npm install @elementmints/date
import { initAll } from '@elementmints/date';
import '@elementmints/date/css';

// Initialize all [data-datepicker] elements on the page
initAll();

Or create instances manually:

import { DatePicker } from '@elementmints/date';
import '@elementmints/date/css';

const picker = new DatePicker(document.getElementById('my-input'));

HTML Attributes

All configuration is driven by data-* attributes on the input element (or its parent container).

| Attribute | Default | Description | | --- | --- | --- | | data-datepicker | -- | Required. Marks the element for auto-initialization. | | data-format | YYYY-MM-DD | Display format string. Tokens: DD, MM, YYYY. | | data-min | -- | Minimum selectable date (ISO string, e.g. 2026-01-01). | | data-max | -- | Maximum selectable date (ISO string, e.g. 2026-12-31). | | data-value | -- | Initial date value (ISO string). | | data-value-type | iso | Output format for the submitted value: iso, epoch, or unix. | | data-locale | en | BCP 47 locale tag for month/day names (e.g. de-DE, fr-FR, ja). | | data-week-start | 1 | First day of the week: 0 = Sunday, 1 = Monday, ... 6 = Saturday. | | data-theme | system | Visual theme: light, dark, or system (follows OS preference). | | data-placeholder | -- | Placeholder text shown when the input is empty. | | data-required | false | Whether a date value is required for form validation. | | data-disabled-dates | -- | Comma-separated ISO date strings to disable (e.g. 2026-12-25,2026-01-01). | | data-validate | -- | Comma-separated validation rules: weekday, future, past. | | data-validate-url | -- | URL for async server-side validation (receives a POST with the date). | | data-disabled | false | Disables the date picker entirely. | | data-read-only | false | Makes the input read-only (calendar still opens but value cannot change). | | data-name | -- | Name attribute for the hidden form input used in submission. | | data-close-on-select | true | Whether the calendar closes automatically after selecting a date. | | data-show-today | true | Show the "Today" button in the calendar footer. | | data-show-clear | true | Show the "Clear" button in the calendar footer. | | data-keyboard | true | Enable keyboard navigation within the calendar. | | data-class-name | -- | Custom CSS class(es) added to the picker wrapper element. | | data-position | auto | Calendar popup position: bottom, top, or auto. |

Examples

Basic Date Picker

<input type="text" data-datepicker>

Min and Max Range

<input type="text" data-datepicker
       data-min="2026-01-01"
       data-max="2026-12-31">

Custom Display Format

<input type="text" data-datepicker
       data-format="DD/MM/YYYY">

Dark Theme

<input type="text" data-datepicker
       data-theme="dark">

Locale

<input type="text" data-datepicker
       data-locale="de-DE"
       data-format="DD.MM.YYYY">

Required with Validation

<input type="text" data-datepicker
       data-required
       data-min="2026-01-01"
       data-placeholder="Select a date">

Custom Validation Rules

<!-- Weekdays only -->
<input type="text" data-datepicker
       data-validate="weekday">

<!-- Future dates only -->
<input type="text" data-datepicker
       data-validate="future">

Async Server-Side Validation

<input type="text" data-datepicker
       data-validate-url="/api/check-availability">

Disabled Specific Dates

<input type="text" data-datepicker
       data-disabled-dates="2026-12-25,2026-12-26,2026-01-01">

JavaScript API

When using the IIFE bundle, the API is available on window.DatePicker. When using ES modules, import directly from the package.

DatePicker (class)

const el = document.querySelector('#my-input');
const picker = new DatePicker(el);

// Open / close the calendar
picker.open();
picker.close();

// Get and set the value
picker.getValue();          // Returns the value string (ISO/epoch/unix) or null
picker.setValue('2026-06-15'); // Set by ISO string
picker.setValue(new Date());   // Set by Date object

// Get and set the Date object
picker.getDate();           // Returns a Date or null
picker.setDate(new Date(2026, 5, 15));

// Tear down completely
picker.destroy();

initAll() / destroyAll()

import { initAll, destroyAll, getInstance } from '@elementmints/date';

// Initialize all [data-datepicker] elements
initAll();

// Get a specific instance
const picker = getInstance(document.getElementById('my-input'));

// Destroy all instances
destroyAll();

Events

The date picker dispatches custom events on the input element:

| Event | Detail | Description | | --- | --- | --- | | datepicker:change | { value: string, date: Date } | Fired when the selected date changes. | | datepicker:open | -- | Fired when the calendar opens. | | datepicker:close | -- | Fired when the calendar closes. |

document.querySelector('#my-input').addEventListener('datepicker:change', (e) => {
  console.log('Selected:', e.detail.value, e.detail.date);
});

Web Component

The <date-picker> custom element is automatically registered when using the IIFE bundle. With ES modules, call defineElement() first:

import { defineElement } from '@elementmints/date';
defineElement();
<date-picker data-format="DD/MM/YYYY" data-required></date-picker>

The element creates an <input> internally and supports the same data-* attributes. It also exposes open(), close(), getValue(), setValue(), getDate(), and setDate() methods directly on the DOM element.

Framework Adapters

React

import React, { useState } from 'react';
import { createReactDatePicker } from '@elementmints/date/adapters/react';
import '@elementmints/date/css';

const DatePickerInput = createReactDatePicker(React);

function App() {
  const [value, setValue] = useState('');

  return (
    <DatePickerInput
      value={value}
      onChange={(v) => setValue(v)}
      format="DD/MM/YYYY"
      theme="system"
      placeholder="Pick a date"
    />
  );
}

Vue

<script setup>
import { ref } from 'vue';
import { defineComponent, h, ref as vRef, onMounted, onBeforeUnmount, watch } from 'vue';
import { createVueDatePicker } from '@elementmints/date/adapters/vue';
import '@elementmints/date/css';

const DatePickerInput = createVueDatePicker({
  defineComponent, h, ref: vRef, onMounted, onBeforeUnmount, watch,
});

const date = ref('');
</script>

<template>
  <DatePickerInput v-model="date" format="DD/MM/YYYY" />
</template>

Angular

import { Component, Input, Output, EventEmitter } from '@angular/core';
import { createAngularDatePicker } from '@elementmints/date/adapters/angular';

const { componentClass, metadata } = createAngularDatePicker({
  Component, Input, Output, EventEmitter,
});

@Component({
  selector: 'app-datepicker',
  template: `<input #inputEl type="text" data-datepicker />`,
})
export class DatePickerComponent extends componentClass {
  // Inherits all inputs, outputs, and lifecycle hooks
}
<app-datepicker
  [value]="dateValue"
  [format]="'DD/MM/YYYY'"
  [theme]="'dark'"
  (dateChange)="onDateChange($event)">
</app-datepicker>

Theming

The date picker is styled entirely with CSS custom properties. Override them to match your design system:

:root {
  /* Colors */
  --dp-primary: #3b82f6;
  --dp-primary-hover: #2563eb;
  --dp-bg: #ffffff;
  --dp-surface: #ffffff;
  --dp-border: #e2e8f0;
  --dp-text: #1e293b;
  --dp-text-muted: #94a3b8;
  --dp-text-disabled: #cbd5e1;
  --dp-error: #ef4444;
  --dp-success: #22c55e;

  /* Layout */
  --dp-radius: 8px;
  --dp-shadow: 0 4px 16px rgba(0, 0, 0, 0.12);
  --dp-day-size: 36px;

  /* Typography */
  --dp-font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto,
    'Helvetica Neue', Arial, sans-serif;
  --dp-font-size: 14px;

  /* Motion */
  --dp-transition-speed: 150ms;
}

Use the data-theme attribute (or the --dp-* variables directly) to switch between light and dark modes. The system theme automatically follows the user's OS preference via prefers-color-scheme.

Browser Support

| Browser | Version | |---|---| | Chrome | 80+ | | Firefox | 78+ | | Safari | 14+ | | Edge | 80+ | | iOS Safari | 14+ | | Chrome Android | 80+ |

The library uses Intl.DateTimeFormat for locale support and customElements.define for the Web Component. Both are widely supported in the listed browsers.

Contributing

Contributions are welcome! Please see CONTRIBUTING.md for development setup, coding standards, and the pull request process.

License

MIT -- Copyright (c) 2026 ElementMint