NgLaydate

January 19, 2026 Β· View on GitHub

NgLaydate

A minimalist, powerful, and beautifully designed Date & Time Picker for Angular 18+, built with Signals.

NPM package GitHub Release Date GitHub repo size GitHub Stars NPM downloads CI/CD GitHub license Angular Signals Code style: prettier PRs Welcome

δΈ­ζ–‡η‰ˆ | English

πŸ”— Live Demo

Check out the component in action: https://lanxuexing.github.io/ng-laydate/


✨ Features

  • πŸš€ Signals-Based: High performance and reactive by design.
  • πŸ“… Comprehensive Modes: Supports year, month, date, time, and datetime.
  • πŸ”— Range Selection: Simple or linked range selection (consecutive months).
  • ⚑ Shortcuts: Customizable quick-selection buttons (sidebar or footer).
  • 🎨 Rich Themes: Includes default, molv (teal), grid, circle, dark, and a special fullpanel (side-by-side) theme.
  • πŸ•’ Precision Control: Intelligent H:M:S column visibility and auto-scrolling.
  • 🌏 Internationalization: Full support for Chinese (cn) and English (en).
  • 🚩 Special Days: Built-in Gregorian festivals and customizable Holiday/Workday markers.
  • πŸ–‹οΈ Custom Content: Flexible cell rendering via cellRender or mark functions.
  • ⚑ Performance: Optimized rendering engine with smart diffing and requestAnimationFrame for smooth 60fps interactions.
  • πŸ–₯️ SSR Ready: Fully compatible with Angular Universal / Server-Side Rendering (SSR).
  • πŸŒ“ Dark Mode: Premium dark theme support.
  • πŸ“ Form Support: Full two-way binding support for Template-driven and Reactive Forms (ControlValueAccessor).

πŸ“¦ Installation

This component is available as an Angular Library.

npm install ng-laydate

πŸš€ Quick Start

1. Import Directive

Register NgLaydateDirective in your standalone component or module.

import { NgLaydateDirective } from 'ng-laydate';

@Component({
  standalone: true,
  imports: [NgLaydateDirective, ...]
})
export class MyComponent {}

Just add the [laydate] directive to any input element.

<!-- Simple Date Picker -->
<input type="text" laydate placeholder="Select Date">

<!-- Datetime Range with FullPanel Theme -->
<input type="text" [laydate]="{
  type: 'datetime',
  range: true,
}" placeholder="Select DateTime Range">

2. Forms Support (Two-way Binding)

The component fully implements ControlValueAccessor, allowing you to use ngModel or formControlName seamlessly.

Template-driven Form

<input type="text" laydate [(ngModel)]="dateValue">

Reactive Form

<form [formGroup]="myForm">
  <input type="text" laydate formControlName="date">
</form>

3. Component Usage

Use the component directly for static or embedded pickers.

<ng-laydate
  [config]="{position: 'static', theme: 'molv'}"
  (done)="onDateSelected($event)"
/>

βš™οΈ Configuration (LaydateConfig)

PropertyTypeDefaultDescription
idstring-Custom ID for the picker instance.
type'year'|'month'|'date'|'time'|'datetime''date'The type of selector to display.
rangeboolean|stringfalseEnable range selection. Can be true (separator -) or a customized string (e.g. ' ~ ').
rangeLinkedbooleanfalseWhen true, left and right panels are linked (consecutive months).
formatstring'yyyy-MM-dd'The date output format (e.g., yyyy-MM-dd HH:mm:ss).
valuestring | Date-Initial value of the picker.
isInitValuebooleantrueWhether to automatically populate the initial value to the element.
min / maxstring | Date | number-Min/Max selectable date. Supports string, Date, or numeric offset (-7 is 7 days ago).
triggerstring'click'Event that triggers the picker (e.g., focus, click).
themestring | string[]'default'Theme name (molv, grid, circle, fullpanel, dark) or Hex color.
shortcutsArray-Adv shortcuts (e.g., [{text: 'Today', value: new Date()}]).
shorthandRecord<string, string>-Simple shortcuts (e.g., {'yesterday': '2024-01-01'}).
btnsstring[]['clear', 'now', 'confirm']Footer buttons to display and their order.
lang'cn' | 'en''cn'Language toggle.
weekStartnumber0Start of the week (0-6, 0 is Sunday).
darkModebooleanfalseForce enable dark mode regardless of theme.
showbooleanfalseWhether to show the picker immediately on render.
showBottombooleantrueWhether to display the footer.
isPreviewbooleantrueShow the live selection preview in the footer.
autoConfirmbooleantrueAutomatically confirm and close on selection (single mode only).
calendarbooleanfalseShow ISO calendar (festivals/solar terms).
markRecord | Function-Mark days (e.g., {'0-0-15': 'Mid'}).
disabledDateFunction-Callback for disabling specific dates. Returns true to disable.
disabledTimeFunction-Callback for disabling specific hours/minutes/seconds.
cellRenderFunction-Custom renderer for date cells (inserting HTML).
formatToDisplayFunction-Formats the value for input box display only.
holidays[string[], string[]]-Highlight holidays/workdays. Format: [[holidys], [workdays]].
shadeboolean | number-Show background overlay or set its opacity.
zIndexnumber66666666The CSS z-index of the picker.
position'absolute'|'fixed'|'static''absolute'The positioning strategy.

πŸ”” Callbacks

  • ready: Triggered when the picker is rendered.
  • change: Triggered whenever a value changes.
  • done: Triggered when selection is confirmed.
  • close: Triggered when the picker is closed.
  • onConfirm / onNow / onClear: Triggered on footer button clicks.

🌈 Themes & Aesthetics

The component supports a variety of visual styles to match your application:

  • Dark: Deep dark mode for professional dashboards.

Tip

Custom Colors: Pass any hex color to theme (e.g., {theme: '#722ed1'}) to instantly brand the component to match your application.

πŸ›  Development

This repository is structured as an Angular Workspace.

  • Library Path: projects/ng-laydate
  • Demo Path: projects/laydate-demo

Scripts

  • npm start: Run the demo application.
  • npm run build:lib: Build the library for production.
  • npm run build:demo: Build the demo application.
  • npm run build:all: Build everything in one go.

For more complex examples and advanced usage, please refer to the demo source code.

Built with ❀️ for the Angular Community.