Production Ready

BW DatePicker

A lightweight, zero-dependency datepicker with a powerful plugin architecture. Built for modern web applications.

~8KB
Core Size
0
Dependencies
11
Plugins
View Demos GitHub
npm install @bw-ui/datepicker

Interactive Demos

Try each plugin configuration. Click on input fields to open the datepicker.

Core

Basic datepicker functionality

Required
import { BWDatePicker } from '@bw-ui/datepicker';
import '@bw-ui/datepicker/css';
const picker = new BWDatePicker('#date-input', {
  mode: 'popup',
  format: 'YYYY-MM-DD',
});

Theming

Dark mode & CSS variables

Plugin
import { ThemingPlugin } from '@bw-ui/datepicker-theming';

picker.use(ThemingPlugin, {
  theme: 'dark',
  autoDetect: true,
  persist: true,
});

Positioning

Auto-flip & viewport collision

Plugin
import { PositioningPlugin } from '@bw-ui/datepicker-positioning';

picker.use(PositioningPlugin, {
  placement: 'top',
  alignment: 'left',
  autoFlip: true,
  offset: { x: 0, y: 8 },
});

Accessibility

Keyboard nav, ARIA, focus trap

Plugin
import { AccessibilityPlugin } from '@bw-ui/datepicker-accessibility';

picker.use(AccessibilityPlugin, {
  enableKeyboardNav: true,
  enableFocusTrap: true,
  enableAnnouncer: true,
});

Locale

17+ languages, i18n support

Plugin
import { LocalePlugin } from '@bw-ui/datepicker-locale';

picker.use(LocalePlugin, {
  locale: 'fr-FR',
  firstDayOfWeek: 1,
});

Mobile

Touch & swipe gestures

Plugin
import { MobilePlugin } from '@bw-ui/datepicker-mobile';

picker.use(MobilePlugin, {
  enableTouch: true,
  enableSwipe: true,
  swipeThreshold: 50,
});

Input Handler

Input masking & validation

Plugin
import { InputHandlerPlugin } from '@bw-ui/datepicker-input-handler';

picker.use(InputHandlerPlugin, {
  format: 'DD/MM/YYYY',
  enableMask: true,
  validateOnBlur: true,
});

Date Utils

Date manipulation utilities

Plugin
import { DateUtilsPlugin } from '@bw-ui/datepicker-date-utils';

picker.use(DateUtilsPlugin);

const utils = picker.getPlugin('date-utils');
utils.calculator.addDays(new Date(), 7);

Range Selection

Select date ranges with presets

New
import { RangePlugin } from '@bw-ui/datepicker-range';

picker.use(RangePlugin, {
    presets: [
    'today',
    'last7days',
    'thisQuarter',
    ]
});

Dual Calendar

Side-by-side month view

New
import { DualCalendarPlugin } from '@bw-ui/datepicker-dual-calendar';

picker.use(DualCalendarPlugin, {
  monthsToShow: 2,
  syncNavigation: true,
});

Data

Async data loading & badges

New
import { DataPlugin } from '@bw-ui/datepicker-data';

picker.use(DataPlugin, {
  loader: async (month, year) => {
    const res = await fetch(`/api/events?m=${month}&y=${year}`);
    return res.json();
  },
  showBadges: true,
});

Full Example

All plugins combined

Complete
import { BWDatePicker } from '@bw-ui/datepicker';
import { ThemingPlugin } from '@bw-ui/datepicker-theming';
import { PositioningPlugin } from '@bw-ui/datepicker-positioning';
import { AccessibilityPlugin } from '@bw-ui/datepicker-accessibility';

const picker = new BWDatePicker('#date')
  .use(ThemingPlugin, { theme: 'dark' })
  .use(PositioningPlugin, { autoFlip: true })
  .use(AccessibilityPlugin);

Inline Mode

Always visible calendar

Mode
new BWDatePicker('#calendar', {
  mode: 'inline',
});

Modal Mode

Centered overlay dialog

Mode
new BWDatePicker('#date', {
  mode: 'modal',
});

Multi-Date Selection

Select multiple dates with validation

Plugin
import { MultiDatePlugin } from '@bw-ui/datepicker-multidate';

new BWDatePicker('#date')
  .use(MultiDatePlugin, {
    maxDates: 2,
    minDates: 2,
    format: 'MM.DD.YYYY',
    separator: ' | ',
    showClearButton: true,
    showCountBadge: true,
  });

All Packages

Install only what you need. Each plugin is a separate package.

@bw-ui/datepicker
Core datepicker with plugin system
~8KB Required
@bw-ui/datepicker-theming
Dark mode, CSS variables, theme persistence
~3KB Plugin
@bw-ui/datepicker-positioning
Auto-flip, viewport collision, smart placement
~2KB Plugin
@bw-ui/datepicker-accessibility
Keyboard navigation, ARIA, focus trap
~4KB Plugin
@bw-ui/datepicker-locale
17+ languages, i18n, custom translations
~5KB Plugin
@bw-ui/datepicker-mobile
Touch support, swipe gestures
~3KB Plugin
@bw-ui/datepicker-input-handler
Input masking, validation, auto-correct
~3KB Plugin
@bw-ui/datepicker-date-utils
Date manipulation, formatting, parsing
~6KB Plugin
@bw-ui/datepicker-range
Date range selection with presets
~4KB New
@bw-ui/datepicker-dual-calendar
Side-by-side dual month view
~3KB New
@bw-ui/datepicker-data
Async data loading, badges, events
~3KB New
@bw-ui/datepicker-react
React bindings for the BW DatePicker library.
~6.38KB New
@bw-ui/datepicker-vue
Vue 3 bindings for the BW DatePicker library.
~6.58KB New
@bw-ui/datepicker-multidate
Multi-date selection plugin for @bw-ui/datepicker.
~2.8KB New