ngxsmk-datepicker 3.0.5-beta.0 → 3.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -12,7 +12,6 @@
12
12
 
13
13
  [![npm version](https://img.shields.io/npm/v/ngxsmk-datepicker.svg?style=flat-square&color=6d28d9)](https://www.npmjs.com/package/ngxsmk-datepicker)
14
14
  [![npm downloads](https://img.shields.io/npm/dm/ngxsmk-datepicker.svg?style=flat-square)](https://www.npmjs.com/package/ngxsmk-datepicker)
15
- [![CI](https://img.shields.io/github/actions/workflow/status/NGXSMK/ngxsmk-datepicker/ci.yml?branch=main&label=CI&style=flat-square)](https://github.com/NGXSMK/ngxsmk-datepicker/actions/workflows/ci.yml)
16
15
  [![Angular](https://img.shields.io/badge/Angular-17%2B-DD0031.svg?style=flat-square&logo=angular)](https://angular.io/)
17
16
  [![License](https://img.shields.io/badge/license-MIT-blue.svg?style=flat-square)](https://github.com/NGXSMK/ngxsmk-datepicker/blob/main/LICENSE)
18
17
  [![WhatsApp Channel](https://img.shields.io/badge/WhatsApp-Channel-25D366?style=flat-square&logo=whatsapp&logoColor=white)](https://whatsapp.com/channel/0029Vb8PWpz1XquUOnGPUM2p)
@@ -22,23 +21,21 @@
22
21
 
23
22
  **`npm i ngxsmk-datepicker`**
24
23
 
25
- [Live demo](https://ngxsmk.github.io/ngxsmk-datepicker/) • [WhatsApp Channel](https://whatsapp.com/channel/0029Vb8PWpz1XquUOnGPUM2p) • [StackBlitz (repo)](https://stackblitz.com/github/NGXSMK/ngxsmk-datepicker) • [API docs](https://github.com/NGXSMK/ngxsmk-datepicker/blob/main/projects/ngxsmk-datepicker/docs/API.md) • [Issues](https://github.com/NGXSMK/ngxsmk-datepicker/issues) • [Buy me a coffee](https://buymeacoffee.com/toozuuu)
26
-
27
- *StackBlitz:* after it boots, run `npm install` then `npm start` in the terminal to serve the demo app (`demo-app`).
24
+ [Explore Live Demo](https://ngxsmk.github.io/ngxsmk-datepicker/) • [WhatsApp Channel](https://whatsapp.com/channel/0029Vb8PWpz1XquUOnGPUM2p) • [Buy me a coffee](https://buymeacoffee.com/toozuuu) • [API Documentation](https://github.com/NGXSMK/ngxsmk-datepicker/blob/main/projects/ngxsmk-datepicker/docs/API.md) • [Submit Issue](https://github.com/NGXSMK/ngxsmk-datepicker/issues)
28
25
 
29
26
  </div>
30
27
 
31
28
  ---
32
29
 
33
- **Last updated:** August 22, 2026 - **Current stable:** v3.0.5
30
+ **Last updated:** September 8, 2026 - **Current stable:** v3.0.6
34
31
 
35
32
  ### **Overview**
36
33
 
37
34
  **ngxsmk-datepicker** is a high-performance, enterprise-ready date and range picker engineered for the modern Angular ecosystem (v17+). Built from the ground up with **Angular Signals**, it delivers a seamless, zoneless-ready experience for both desktop and mobile (Ionic) applications.
38
35
 
39
- > **Stable Release**: `v3.0.5` is the current stable release with compiled `fesm2022` output and type declarations.
36
+ > **Stable Release**: `v3.0.6` is the current stable release with compiled `fesm2022` output and type declarations.
40
37
  >
41
- > **Stable line**: v2.3.x includes side-by-side **`calendars`**, **natural language input**, searchable **timezone selection dropdown UI**, dynamic range presets, and warning range highlighting. Versions **2.0.10** and **2.0.11** were broken and have been **unpublished**; use **v2.1.1+** or current **v3.0.5** on npm.
38
+ > **Stable line**: v2.3.x includes side-by-side **`calendars`**, **natural language input**, searchable **timezone selection dropdown UI**, dynamic range presets, and warning range highlighting. Versions **2.0.10** and **2.0.11** were broken and have been **unpublished**; use **v2.1.1+** or current **v3.0.6** on npm.
42
39
 
43
40
  ---
44
41
 
@@ -46,16 +43,14 @@
46
43
 
47
44
  1. [📷 Screenshots](#-screenshots)
48
45
  2. [✨ Features](#-features)
49
- 3. [🤔 Why this library?](#why-this-library)
50
- 4. [🌐 Discoverability](#-discoverability)
51
- 5. [📋 Compatibility](#-compatibility)
52
- 6. [🌍 Localization (i18n)](#-localization-i18n)
53
- 7. [📦 Installation](#-installation)
54
- 8. [🚀 Quick start / usage](#usage)
55
- 9. [🔌 Framework Integration](#-framework-integration)
56
- 10. [⚙️ API Reference](#-api-reference)
57
- 11. [🎨 Theming](#-theming)
58
- 12. [⌨️ Keyboard Navigation](#-keyboard-navigation)
46
+ 3. [📋 Compatibility](#-compatibility)
47
+ 4. [🌍 Localization (i18n)](#-localization-i18n)
48
+ 5. [📦 Installation](#-installation)
49
+ 6. [🚀 Quick Start](#-quick-start)
50
+ 7. [🔌 Framework Integration](#-framework-integration)
51
+ 8. [⚙️ API Reference](#-api-reference)
52
+ 9. [🎨 Theming](#-theming)
53
+ 10. [⌨️ Keyboard Navigation](#-keyboard-navigation)
59
54
 
60
55
  ---
61
56
 
@@ -74,7 +69,7 @@
74
69
  - 💎 **Signal-Driven Engine**: Hyper-reactive state management using Angular Signals.
75
70
  - 🌓 **Native Dark Mode**: Beautifully crafted themes for light and dark environments.
76
71
  - 📱 **Mobile-First UX**: Native mobile picker integration with touch gestures and haptic feedback.
77
- - 🧩 **Minimal footprint**: Standalone component; **Luxon** is the only date peer beyond Angular (no full UI suite required).
72
+ - 🧩 **Zero Dependencies**: Lightweight standalone component with no external bloat.
78
73
  - ⚡ **Performance++**: Lazy-loaded calendar months, memoized calculations, and tree-shakable architecture.
79
74
 
80
75
  ### **Advanced Functionality**
@@ -83,17 +78,30 @@
83
78
  - 🗓️ **Adjacent Month Days (`showOtherMonths`)**: Display trailing and leading days from adjacent months in the calendar grid.
84
79
  - 📐 **Responsive Control (`[responsive]`)**: Disable viewport max-width responsive overrides for fixed-width container embedding (#299).
85
80
  - 🌐 **8-Language i18n**: Full localization for `en`, `de`, `es`, `sv`, `ko`, `zh`, `ja`, and `fr`.
86
- - 🔢 **ISO Week Numbers**: Optional week-number column via `[showWeekNumbers]`.
87
- - ⌨️ **Guided Input Masking**: `[inputMask]` auto-inserts separators as users type (e.g. `12` → `12/`).
88
- - 🌍 **Secondary Calendars**: Annotate day cells with Hijri, Jalali, Hebrew, Buddhist, or Japanese dates via `[secondaryCalendar]`.
89
- - 🏨 **Availability Calendars**: Per-day prices, indicator dots, and classes via `[dayMetadata]`; server-driven blocked dates via `[asyncDateFilter]`.
90
- - 🎛️ **Custom Action Bars**: `[calendarHeaderTemplate]` / `[calendarFooterTemplate]` slots with `clear()`/`close()` actions.
91
81
  - 🛠️ **Plugin Architecture**: Extend functionality via hooks for rendering, validation, and shortcuts.
92
- - 🤖 **Model Context Protocol (MCP) & AI Assistant**: Standalone MCP server (`@ngxsmk/datepicker-mcp`) with date intelligence tools, plus embedded UI AI prompt bar (`[enableAi]`). See [MCP Integration Guide](docs/MCP_INTEGRATION.md).
93
82
  - 🧪 **Signal Forms Native**: Direct integration with Angular 21's new Signal Forms API.
94
83
  - 🚀 **Zoneless Ready**: Optimized for the future of Angular—works perfectly without zone.js.
95
84
  - ♿ **Full Accessibility**: WAI-ARIA compliant with extensive keyboard navigation support.
96
85
 
86
+ ## **⚖️ Why ngxsmk-datepicker? (Comparison)**
87
+
88
+ | Capability | **ngxsmk-datepicker** | @angular/material | ngx-bootstrap | ng-pick-datetime |
89
+ | --- | :---: | :---: | :---: | :---: |
90
+ | Standalone / no NgModule | ✅ | ✅ | ⚠️ | ❌ |
91
+ | Signals & Zoneless-ready | ✅ | ⚠️ | ❌ | ❌ |
92
+ | SSR / Angular Universal | ✅ | ✅ | ⚠️ | ❌ |
93
+ | Date **range** picker | ✅ | ✅ | ✅ | ✅ |
94
+ | Multiple / week / month / quarter / year modes | ✅ | ❌ | ❌ | ❌ |
95
+ | Time & timezone-aware selection | ✅ | ❌ | ⚠️ | ✅ |
96
+ | Natural-language input ("next friday") | ✅ | ❌ | ❌ | ❌ |
97
+ | Dual-range **comparison** highlight | ✅ | ❌ | ❌ | ❌ |
98
+ | Built-in i18n (8 languages) + RTL | ✅ | ⚠️ | ⚠️ | ⚠️ |
99
+ | React / Vue / Web-Component wrappers | ✅ | ❌ | ❌ | ❌ |
100
+ | Zero peer-dep bloat (only Luxon) | ✅ | ⚠️ | ⚠️ | ⚠️ |
101
+ | Actively maintained (Angular 17–21+) | ✅ | ✅ | ⚠️ | ❌ |
102
+
103
+ <sub>✅ first-class · ⚠️ partial / extra
104
+
97
105
  ## Why this library?
98
106
 
99
107
  Use **ngxsmk-datepicker** when you want an enterprise-grade **date / range picker** with strong **mobile**, **i18n**, **timezone**, **Ionic**, and **SSR** support on **Angular 17–22+**, without adopting a heavy Material UI stack or legacy Day.js dependencies.
@@ -112,15 +120,7 @@ Use **ngxsmk-datepicker** when you want an enterprise-grade **date / range picke
112
120
  | **Google Calendar Sync & Multi-Calendars** | ✅ Built-in | ❌ Requires custom code | ❌ Not supported |
113
121
  | **SSR / Hydration Safety** | ✅ 100% Guarded (`DOCUMENT`) | ⚠️ Requires CDK SSR overlays | ❌ Window access errors |
114
122
 
115
- This is **not** a heavy UI framework; it is a **standalone datepicker** engineered for maximum performance, accessibility, and theming flexibility. See the [live demo](https://ngxsmk.github.io/ngxsmk-datepicker/) and [COMPATIBILITY](https://github.com/NGXSMK/ngxsmk-datepicker/blob/main/projects/ngxsmk-datepicker/docs/COMPATIBILITY.md) for details.
116
-
117
- ## **🌐 Discoverability**
118
-
119
- **Maintainers (GitHub):** consider repository **Topics** such as: `angular`, `datepicker`, `date-range-picker`, `luxon`, `standalone-components`, `i18n`, `angular-universal`, `ionic`, `accessibility`.
120
-
121
- **Community:** if this project helped you, stars and accurate comparisons in blog posts or issue threads help others find it. Curated lists (for example **awesome-angular**-style repos) usually accept small PRs that add a one-line link and follow their contribution rules—check each list’s guidelines before opening a PR.
122
-
123
- **Security:** report sensitive issues per [SECURITY.md](https://github.com/NGXSMK/ngxsmk-datepicker/blob/main/SECURITY.md), not via public issues.
123
+ This is **not** a heavy UI framework; it is a **standalone datepicker** engineered for maximum performance, accessibility, and theming flexibility. See the [live demo](https://ngxsmk.github.io/ngxsmk-datepicker/) and [COMPATIBILITY](https://github.com/NGXSMK/ngxsmk-datepicker/blob/main/projects/ngxsmk-datepicker/docs/COMPATIBILITY.md) for details.</sub>
124
124
 
125
125
  ## **📋 Compatibility**
126
126
 
@@ -180,36 +180,21 @@ Features marked as experimental may change:
180
180
 
181
181
  For details, see [CONTRIBUTING.md](https://github.com/NGXSMK/ngxsmk-datepicker/blob/main/CONTRIBUTING.md#deprecation-policy).
182
182
 
183
- ## **📦 Installation**
183
+ ## **🚀 Installation**
184
184
 
185
- ```bash
186
- ng add ngxsmk-datepicker
187
- ```
188
-
189
- The `ng add` schematic installs the package, adds the `luxon` peer dependency if it is missing, and prints a getting-started snippet. Plain npm works too:
185
+ Install the package using npm:
190
186
 
191
187
  ```bash
192
- npm install ngxsmk-datepicker@3.0.5
188
+ npm install ngxsmk-datepicker@latest
193
189
  ```
194
190
 
195
191
  ### Alternative installation
196
192
 
197
- You can install without npm using any of these methods (peer dependencies must still be installed in your app):
198
-
199
- | Method | Command |
200
- |--------|--------|
201
- | **Yarn** | `yarn add ngxsmk-datepicker@3.0.5` |
202
- | **pnpm** | `pnpm add ngxsmk-datepicker@3.0.5` |
203
- | **Bun** | `bun add ngxsmk-datepicker@3.0.5` |
204
- | **From Git** | `npm install github:NGXSMK/ngxsmk-datepicker#v3.0.5` (requires the repo to have built output or you build from source) |
205
- | **Local path** | Build the library in the repo (`npx ng build ngxsmk-datepicker`), then `npm install /path/to/ngxsmk-datepicker/dist/ngxsmk-datepicker` |
206
- | **CDN (ESM)** | Use [unpkg](https://unpkg.com/ngxsmk-datepicker@3.0.5/) or [jsDelivr](https://cdn.jsdelivr.net/npm/ngxsmk-datepicker@3.0.5/) in your bundler or import map; peer dependencies (Angular, etc.) must be installed in your app. |
207
-
208
- For all options and caveats, see [docs/INSTALLATION.md](docs/INSTALLATION.md).
193
+ You can install without npm using Yarn, pnpm, Bun, from Git, a local path, or via CDN (ESM). Peer dependencies must still be installed in your app. For all options and caveats, see [INSTALLATION.md](../../docs/INSTALLATION.md) in the repo root.
209
194
 
210
195
  ## **Usage**
211
196
 
212
- ngxsmk-datepicker is a standalone component, so you can import it directly into your component or module.
197
+ ngxsmk-datepicker is a standalone component, so you can import it directly into your component or module. If you see **NG1010** (`'imports' must be an array... Value could not be determined statically`) when using the Angular compiler plugin or in strict AOT builds, use `NgxsmkDatepickerModule` in your `imports` array instead of `NgxsmkDatepickerComponent` (same template: `<ngxsmk-datepicker>`).
213
198
 
214
199
  ### Signal Forms (Angular 21)
215
200
 
@@ -279,7 +264,7 @@ For detailed Signal Forms integration including dirty state tracking, see the [S
279
264
 
280
265
  #### **1. Import the Component**
281
266
 
282
- All public exports (component, utilities, types, services) come from the main package entry: `'ngxsmk-datepicker'` (there is no separate `/utils` subpath). In your component file (e.g., app.component.ts), import the component (or the module—see troubleshooting below).
267
+ In your component file (e.g., app.component.ts), import NgxsmkDatepickerComponent.
283
268
 
284
269
  import { Component } from '@angular/core';
285
270
  import { NgxsmkDatepickerComponent, DateRange, HolidayProvider } from 'ngxsmk-datepicker';
@@ -309,8 +294,6 @@ All public exports (component, utilities, types, services) come from the main pa
309
294
  }
310
295
  }
311
296
 
312
- **If you see NG1010** (`'imports' must be an array... Value could not be determined statically`) when using the Angular compiler plugin or in strict AOT builds, use the wrapper module instead: `import { NgxsmkDatepickerModule } from 'ngxsmk-datepicker'` and set `imports: [NgxsmkDatepickerModule]`. The template stays the same (`<ngxsmk-datepicker>`).
313
-
314
297
  #### **2. Add it to Your Template**
315
298
 
316
299
  Use the `<ngxsmk-datepicker>` selector in your HTML template.
@@ -360,7 +343,7 @@ class MyHolidayProvider implements HolidayProvider {
360
343
 
361
344
  ### **Angular Material Form Fields**
362
345
 
363
- Integrate with Angular Material's form field components for a seamless Material Design experience. Works with both standalone and non-standalone components:
346
+ Integrate with Angular Material's form field components for a seamless Material Design experience. Import the optional **`ngxsmk-datepicker/material`** entry (keeps `@angular/material` out of the main bundle):
364
347
 
365
348
  **Standalone Components:**
366
349
 
@@ -370,16 +353,28 @@ import { FormControl, FormGroup, ReactiveFormsModule } from "@angular/forms";
370
353
  import { MatFormFieldModule } from "@angular/material/form-field";
371
354
  import { MatInputModule } from "@angular/material/input";
372
355
  import { NgxsmkDatepickerComponent } from "ngxsmk-datepicker";
356
+ import { NgxsmkDatepickerMatFormFieldControlDirective } from "ngxsmk-datepicker/material";
373
357
 
374
358
  @Component({
375
359
  selector: "app-material-form",
376
360
  standalone: true,
377
- imports: [ReactiveFormsModule, MatFormFieldModule, MatInputModule, NgxsmkDatepickerComponent],
361
+ imports: [
362
+ ReactiveFormsModule,
363
+ MatFormFieldModule,
364
+ MatInputModule,
365
+ NgxsmkDatepickerComponent,
366
+ NgxsmkDatepickerMatFormFieldControlDirective,
367
+ ],
378
368
  template: `
379
369
  <form [formGroup]="myForm">
380
370
  <mat-form-field appearance="outline">
381
371
  <mat-label>Select Date</mat-label>
382
- <ngxsmk-datepicker mode="single" formControlName="date" placeholder="Choose a date"> </ngxsmk-datepicker>
372
+ <ngxsmk-datepicker
373
+ ngxsmkMatFormFieldControl
374
+ mode="single"
375
+ formControlName="date"
376
+ placeholder="Choose a date"
377
+ ></ngxsmk-datepicker>
383
378
  </mat-form-field>
384
379
  </form>
385
380
  `,
@@ -391,17 +386,18 @@ export class MaterialFormComponent {
391
386
  }
392
387
  ```
393
388
 
394
- **Non-Standalone (NgModules):** Add the directive file from [INTEGRATION.md § Angular Material](projects/ngxsmk-datepicker/docs/INTEGRATION.md#angular-material), then add it to your module `imports` (with `NgxsmkDatepickerComponent`, `MatFormFieldModule`, etc.) and use `ngxsmkMatFormFieldControl` on the datepicker in templates.
389
+ **Non-Standalone (NgModules):** Import `NgxsmkDatepickerMatFormFieldControlDirective` from `ngxsmk-datepicker/material` into your module `imports` (with `NgxsmkDatepickerComponent`, `MatFormFieldModule`, etc.) and put `ngxsmkMatFormFieldControl` on the datepicker. See [INTEGRATION.md § Angular Material](docs/INTEGRATION.md#angular-material).
395
390
 
396
391
  **With Date Range:**
397
392
 
398
393
  ```html
399
394
  <mat-form-field appearance="fill">
400
395
  <mat-label>Date Range</mat-label>
401
- <ngxsmk-datepicker mode="range" [showTime]="true" formControlName="dateRange"> </ngxsmk-datepicker>
396
+ <ngxsmk-datepicker ngxsmkMatFormFieldControl mode="range" [showTime]="true" formControlName="dateRange"></ngxsmk-datepicker>
402
397
  </mat-form-field>
403
398
  ```
404
399
 
400
+ **Optional date adapters** (date-fns / Day.js / Luxon) live on a separate entry: `import { DateFnsAdapter } from 'ngxsmk-datepicker/adapters'`.
405
401
  ### **Ionic Components**
406
402
 
407
403
  For best integration with Ionic, import the integration styles in your global CSS/SCSS file:
@@ -410,9 +406,6 @@ For best integration with Ionic, import the integration styles in your global CS
410
406
  @import "ngxsmk-datepicker/styles/ionic-integration.css";
411
407
  ```
412
408
 
413
- **Automatic Theming:**
414
- The datepicker automatically detects and uses Ionic CSS variables (e.g., `--ion-color-primary`, `--ion-background-color`) so it matches your app's theme out of the box without extra configuration.
415
-
416
409
  Works seamlessly with Ionic form components and follows Ionic design patterns:
417
410
 
418
411
  ```typescript
@@ -543,38 +536,6 @@ By default, the datepicker input is `readonly` to prevent invalid date strings a
543
536
  2. **Custom Validation Logic:**
544
537
  If you prefer the readonly behavior, ensure your form submission handler explicitly checks `form.invalid` before proceeding, as the browser won't stop the submit button click.
545
538
 
546
- ### **Built-in Reactive Forms Validators**
547
-
548
- `ngxsmk-datepicker` exports convenient, type-safe Angular `ValidatorFn` functions for standard form validation:
549
-
550
- ```typescript
551
- import { FormControl, FormGroup } from '@angular/forms';
552
- import {
553
- ngxsmkMinDateValidator,
554
- ngxsmkMaxDateValidator,
555
- ngxsmkDateRangeValidator,
556
- ngxsmkBlockedDatesValidator
557
- } from 'ngxsmk-datepicker';
558
-
559
- const form = new FormGroup({
560
- // Minimum date validator (Date, string, or dynamic factory)
561
- arrivalDate: new FormControl(null, [ngxsmkMinDateValidator(new Date())]),
562
-
563
- // Maximum date validator
564
- departureDate: new FormControl(null, [ngxsmkMaxDateValidator(new Date(2026, 11, 31))]),
565
-
566
- // Range validation: requires both dates, 2 to 14 days duration
567
- tripRange: new FormControl(null, [
568
- ngxsmkDateRangeValidator({ minDays: 2, maxDays: 14, requireBoth: true })
569
- ]),
570
-
571
- // Disallow weekends or specific blackout dates
572
- bookingDate: new FormControl(null, [
573
- ngxsmkBlockedDatesValidator((d: Date) => d.getDay() === 0 || d.getDay() === 6)
574
- ]),
575
- });
576
- ```
577
-
578
539
  ## **⚙️ API Reference**
579
540
 
580
541
  ### **Inputs**
@@ -585,8 +546,7 @@ const form = new FormGroup({
585
546
  | inline | boolean \| 'always' \| 'auto' | false | Controls the display mode. `true` or `'always'` for inline, `'auto'` for responsive. |
586
547
  | locale | string | navigator.language | Sets the locale for language and regional formatting (e.g., 'en-US', 'de-DE'). |
587
548
  | theme | 'light' \| 'dark' | 'light' | The color theme. |
588
- | showRanges | boolean | true | If true, displays custom predefined ranges panel when in 'range' mode. |
589
- | showPresets | boolean | false | If true, displays standard quick presets (*Today*, *Yesterday*, *Last 7 Days*, *This Month*, etc.). |
549
+ | showRanges | boolean | true | If true, displays the predefined ranges panel when in 'range' mode. |
590
550
  | minDate | DateInput | null | The earliest selectable date. |
591
551
  | maxDate | DateInput | null | The latest selectable date. |
592
552
  | isInvalidDate | (date: Date) => boolean | () => false | A function to programmatically disable specific dates. |
@@ -615,17 +575,10 @@ const form = new FormGroup({
615
575
  | enableGoogleCalendar| boolean | false | Enable seamless Google Calendar integration and sync. |
616
576
  | googleClientId | string \| null | null | Google API OAuth 2.0 Web Client ID for authentication. |
617
577
  | calendars | number | 1 | Multi-calendar display layout (supports 1, 2, or 3 side-by-side calendars). |
578
+ | changeActiveMonthOnSelection | boolean | true | If false, selecting a date won't shift the visible month(s) — useful in multi-calendar mode to keep both calendars fixed when picking a date from the second/third one. |
618
579
  | rangePresetFactory | (today: Date) => DatePreset[] | null | Callback function supplying dynamic rolling range presets. |
619
580
  | showTimezoneSelector | boolean | false | Enables searchable IANA timezone selection dropdown UI. |
620
581
  | enableNaturalLanguage | boolean | false | Enables manual relative keyboard typing input (e.g. "today", "in 3 days"). |
621
- | showWeekNumbers | boolean | false | Shows an ISO 8601 week-number column on the left of the day grid. |
622
- | weekNumberLabel | string | 'Wk' | Header label for the week-number column (e.g. "KW", "S"). |
623
- | inputMask | boolean \| string | false | Guided input masking while typing: `true` uses `displayFormat` (or MM/DD/YYYY); a string (e.g. `'DD.MM.YYYY'`) sets an explicit pattern. Requires `allowTyping`. |
624
- | asyncDateFilter | (start: Date, end: Date) => Promise<DateInput[]> | null | Server-driven disabled dates: called with the visible range on every navigation; resolved dates are disabled. Stale responses are discarded. |
625
- | secondaryCalendar | 'islamic' \| 'persian' \| 'hebrew' \| 'buddhist' \| 'japanese' | null | Annotates each day cell with its date in a second calendar system (rendered via Intl; the grid stays Gregorian). |
626
- | dayMetadata | (date: Date) => DayMetadata | null | Per-day decorations without templates: label under the day number (e.g. a price), indicator dot color, extra CSS classes, tooltip. |
627
- | calendarHeaderTemplate | TemplateRef | null | Custom content at the top of the popover/inline calendar. Context: `let-actions` → `{ clear(), close() }`. |
628
- | calendarFooterTemplate | TemplateRef | null | Replaces the default Clear/Close footer with custom actions. Context: `let-actions` → `{ clear(), close() }`. |
629
582
 
630
583
  ### **Outputs**
631
584
 
@@ -637,8 +590,6 @@ const form = new FormGroup({
637
590
  | invalidRange | { start: Date; end: Date; disabledDatesInside: Date[] } | Emitted when selected date range contains disabled dates. |
638
591
  | naturalLanguageResolved | Date \| { start: Date; end: Date } | Emitted when user types relative natural language date input. |
639
592
  | timezoneChange | string | Emitted when timezone selection is changed. |
640
- | asyncDateFilterLoading | boolean | Emits true while an `asyncDateFilter` request is in flight, false when it settles. |
641
- | asyncDateFilterError | unknown | Emitted when `asyncDateFilter` rejects; the previous disabled set is kept. |
642
593
 
643
594
  ## **🎨 Theming**
644
595
 
@@ -706,14 +657,14 @@ The `locale` input controls all internationalization. It automatically formats m
706
657
 
707
658
  ngxsmk-datepicker v2.4.0+ now features **full localization synchronization** for:
708
659
 
709
- - �� English (`en`)
710
- - �� German (`de`)
711
- - �� French (`fr`)
712
- - �� Spanish (`es`)
660
+ - 🇺🇸 English (`en`)
661
+ - 🇩🇪 German (`de`)
662
+ - 🇫🇷 French (`fr`)
663
+ - 🇪🇸 Spanish (`es`)
713
664
  - 🇸🇪 Swedish (`sv`)
714
- - �� Korean (`ko`)
715
- - �� Chinese (`zh`)
716
- - �� Japanese (`ja`)
665
+ - 🇰🇷 Korean (`ko`)
666
+ - 🇨🇳 Chinese (`zh`)
667
+ - 🇯🇵 Japanese (`ja`)
717
668
 
718
669
  ### **Usage Example**
719
670
 
@@ -778,7 +729,7 @@ const myHooks: DatepickerHooks = {
778
729
  <ngxsmk-datepicker [hooks]="myHooks" [customShortcuts]="shortcuts" mode="single"> </ngxsmk-datepicker>
779
730
  ```
780
731
 
781
- All date cells are keyboard accessible with proper ARIA attributes for screen readers. The component is built with **accessibility in mind**: keyboard navigation, ARIA roles and labels, and live regions for announcements. For details see [API.md – Keyboard Support](projects/ngxsmk-datepicker/docs/API.md#keyboard-support) and the ARIA-related inputs (e.g. `closeAriaLabel`, `clearAriaLabel`) in the API reference.
732
+ All date cells are keyboard accessible with proper ARIA attributes for screen readers.
782
733
 
783
734
  See [Extension Points Guide](./projects/ngxsmk-datepicker/docs/extension-points.md) for detailed customization options.
784
735
 
@@ -803,14 +754,11 @@ This library has been optimized for maximum performance:
803
754
  - ✅ **Date Validation**: Fixed "Today" unselectable bug by normalizing `minDate` boundary checks.
804
755
  - ✅ **Keyboard Shortcuts**: Updated "Today" selection shortcut to use timezone-aware calculation.
805
756
  - ✅ **Validation messages**: User-facing i18n strings for invalid date, min/max; `validationError` output and on-screen error display
806
- - ✅ **Change Detection**: Fixed OnPush change detection issues with proper `markForCheck()` triggers
807
- - ✅ **Date Comparison**: Fixed null safety issues in date range comparisons
808
- - ✅ **Memory Leaks**: Added cache size limits to prevent memory leaks
809
- - ✅ **Type Safety**: Improved TypeScript types and null safety checks
810
- - ✅ **Mobile UX**: Enhanced mobile interactions and touch feedback
811
- - ✅ **Performance**: Optimized template bindings with memoized functions
812
- - ✅ **Accessibility**: Better focus states and keyboard navigation
813
- - ✅ **Build System**: Improved build configuration and optimization
757
+ - ✅ **Calendar loading state**: Visual spinner + text and screen-reader announcement while calendar opens/generates
758
+ - ✅ **Demo theme**: Light/dark theme toggle and system preference now correctly switch the demo UI
759
+ - ✅ **Installation options**: Full install guide (npm, Yarn, pnpm, Bun, Git, CDN, etc.) and demo page updates
760
+ - ✅ **Accessibility**: Loading state announced via live region; validation errors exposed for a11y
761
+ - ✅ **Type Safety**: New translation keys and strictly typed inputs/outputs
814
762
 
815
763
  ### **Performance Enhancements:**
816
764
 
@@ -884,7 +832,8 @@ npm run build:analyze
884
832
 
885
833
  **Build Output:**
886
834
 
887
- - Main bundle: `dist/ngxsmk-datepicker/fesm2022/ngxsmk-datepicker.mjs` (~127KB)
835
+ - Main bundle: `dist/ngxsmk-datepicker/fesm2022/ngxsmk-datepicker.mjs` (~127KB gzipped / published target; raw FESM is larger)
836
+ - Optional: `ngxsmk-datepicker-adapters.mjs`, `ngxsmk-datepicker-material.mjs` (secondary entries)
888
837
  - Type definitions: `dist/ngxsmk-datepicker/index.d.ts`
889
838
  - Source maps: Automatically removed from production builds
890
839
 
@@ -964,9 +913,15 @@ We welcome and appreciate contributions from the community! Whether it's reporti
964
913
 
965
914
  ## **📄 Changelog**
966
915
 
967
- **Recent:** Use **v3.0.5** on npm. The v2.3.x line adds side-by-side multi-calendar layouts, natural language typing, timezone selector UI dropdown, warning style selections, and strict TypeScript/AOT stability. Versions 2.0.10 and 2.0.11 are unpublished; use v2.1.1+ or **v3.0.5**.
916
+ For a full list of changes, please refer to the [CHANGELOG.md](https://github.com/NGXSMK/ngxsmk-datepicker/blob/main/CHANGELOG.md) file.
917
+
918
+ ### **v3.0.6** (Current Stable)
919
+
920
+ - **npm**: Published tarballs include compiled `fesm2022/` output and type declarations.
968
921
 
969
- For the full list of changes, see [CHANGELOG.md](https://github.com/NGXSMK/ngxsmk-datepicker/blob/main/CHANGELOG.md).
922
+ ### **Earlier Versions**
923
+
924
+ For older version details, please refer to the [full CHANGELOG.md](https://github.com/NGXSMK/ngxsmk-datepicker/blob/main/CHANGELOG.md).
970
925
 
971
926
  ## **🎨 Theming with TokiForge**
972
927
 
@@ -974,6 +929,11 @@ Looking for a powerful theming solution for your Angular application? Check out
974
929
 
975
930
  ### Why TokiForge?
976
931
 
932
+ - ✅ **Framework-agnostic** — Works with Angular, React, Vue, Svelte, and vanilla JS
933
+ - ✅ **Runtime theme switching** — Change themes dynamically without rebuilds
934
+ - ✅ **Type-safe** — Full TypeScript support for design tokens
935
+ - ✅ **Lightweight** — <3 KB gzipped runtime footprint
936
+ - ✅ **CSS custom properties** — Zero JS overhead in static mode
977
937
  - ✅ **SSR compatible** — Works seamlessly with Angular Universal
978
938
 
979
939
  Perfect for managing design tokens, creating theme systems, and implementing dark mode in your Angular applications!
@@ -986,9 +946,16 @@ Perfect for managing design tokens, creating theme systems, and implementing dar
986
946
 
987
947
  MIT License - see [LICENSE](https://github.com/NGXSMK/ngxsmk-datepicker/blob/main/LICENSE) file for details.
988
948
 
989
- ## **🔍 SEO (demo site)**
949
+ ## **🔍 SEO & Discoverability**
950
+
951
+ This library is optimized for search engine visibility, AI search engines, and global developer discovery:
990
952
 
991
- The hosted **[live demo](https://ngxsmk.github.io/ngxsmk-datepicker/)** build ships with meta tags (Open Graph, Twitter cards, `hreflang`, structured data) and locale-aware content for broader discovery. For **GitHub/npm** visibility—topics, awesome lists, StackBlitz, and security reporting—see [**Discoverability**](#-discoverability) near the top of this README.
953
+ - **Keywords**: Angular DatePicker, Date Range Picker, Calendar Component, Angular 17-22+, Signals, Zoneless Angular, TypeScript, Signal Forms, Timezone Dropdown, Secondary Calendars (Hijri, Jalali), SSR Compatible, Ionic DatePicker
954
+ - **Global & European SEO**: Optimized for worldwide developer discovery across North America, Europe (Germany, France, UK, Spain, Sweden, Netherlands, Poland), Asia (Japan, South Korea, China), and Latin America
955
+ - **Multi-language Support**: i18n support and hreflang meta tags for 15+ global languages and regional locales
956
+ - **Social & Community Visibility**: Rich Open Graph metadata, Twitter Cards, JSON-LD structured data (SoftwareApplication & Organization schema), and official [WhatsApp Channel](https://whatsapp.com/channel/0029Vb8PWpz1XquUOnGPUM2p) updates
957
+ - **Documentation**: Complete API documentation with live interactive code examples
958
+ - **Performance**: Optimized bundle size (~127KB) for fast initial page load and high Lighthouse SEO scores
992
959
 
993
960
  ## **👨‍💻 Author**
994
961
 
package/docs/API.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  This document describes the stable public API of ngxsmk-datepicker with comprehensive real-world examples. APIs marked as **stable** are guaranteed to remain backward-compatible within the same major version. APIs marked as **experimental** may change in future releases.
4
4
 
5
- **Version**: 3.0.3+ (includes unreleased `main` additions) | **Last updated**: July 24, 2026
5
+ **Version**: 3.0.6 | **Last updated**: September 8, 2026
6
6
 
7
7
  ## Stable vs experimental
8
8
 
@@ -84,7 +84,7 @@ import { NgxsmkDatepickerComponent } from 'ngxsmk-datepicker';
84
84
  | `hooks` | `DatepickerHooks \| null` | `null` | Stable | Extension points for customization | `[hooks]="customHooks"` |
85
85
  | `enableKeyboardShortcuts` | `boolean` | `true` | Stable | Enable/disable keyboard shortcuts. Press '?' for help. | `[enableKeyboardShortcuts]="false"` |
86
86
  | `customShortcuts` | `{ [key: string]: (context: KeyboardShortcutContext) => boolean } \| null` | `null` | Stable | Custom keyboard shortcuts map | `[customShortcuts]="myShortcuts"` |
87
- | `autoApplyClose` | `boolean` | `false` | Stable | Auto-close calendar after selection | `[autoApplyClose]="true"` |
87
+ | `autoApplyClose` | `boolean` | `false` | Stable | Opt-in auto-close after a complete selection. Forced off when `showTime` / `timeOnly` / inline. | `[autoApplyClose]="true"` |
88
88
  | `clearLabel` | `string` | `'Clear'` | Stable | Custom label for clear button | `clearLabel="Reset"` |
89
89
  | `closeLabel` | `string` | `'Close'` | Stable | Custom label for close button | `closeLabel="Done"` |
90
90
  | `prevMonthAriaLabel` | `string` | `'Previous month'` | Stable | ARIA label for previous month button | `prevMonthAriaLabel="Go to previous month"` |
@@ -2343,6 +2343,34 @@ interface DatepickerClasses {
2343
2343
 
2344
2344
  ## Exported Utilities
2345
2345
 
2346
+ ### Constraints Snapshot
2347
+
2348
+ **Status**: Stable (v3.0.6+)
2349
+
2350
+ Allowed-day truth for min/max, disabled dates/ranges, holidays, async disabled sets, and `isInvalidDate`. The Host rebuilds an immutable snapshot when constraint inputs change; forms validators map `ConstraintDenial` codes to public error keys. See `docs/adr/0001-hybrid-constraints-snapshot.md` and root `CONTEXT.md`.
2351
+
2352
+ ```typescript
2353
+ import {
2354
+ Constraints,
2355
+ buildConstraints,
2356
+ EMPTY_CONSTRAINTS_SOURCES,
2357
+ type ConstraintsSources,
2358
+ type ConstraintsSnapshot,
2359
+ type DayVerdict,
2360
+ type ConstraintDenial,
2361
+ } from 'ngxsmk-datepicker';
2362
+
2363
+ const snap = Constraints.build({
2364
+ ...EMPTY_CONSTRAINTS_SOURCES,
2365
+ minDate: new Date(2026, 0, 1),
2366
+ maxDate: new Date(2026, 11, 31),
2367
+ disabledDates: ['2026-01-15'],
2368
+ });
2369
+
2370
+ snap.isAllowed(new Date(2026, 0, 15)); // false
2371
+ snap.evaluate(new Date(2026, 0, 15)); // { allowed: false, denial: { code: 'disabledDate', ... } }
2372
+ ```
2373
+
2346
2374
  ### Date Utilities
2347
2375
 
2348
2376
  **Status**: Stable
@@ -2363,6 +2391,24 @@ export function getDaysInMonth(year: number, month: number): number;
2363
2391
  export function getFirstDayOfMonth(year: number, month: number): number;
2364
2392
  ```
2365
2393
 
2394
+ ## Secondary entry points
2395
+
2396
+ Optional packages stay out of the main FESM:
2397
+
2398
+ | Import path | Contents | Notes |
2399
+ |-------------|----------|--------|
2400
+ | `ngxsmk-datepicker` | Component, validators, Constraints, utils, config | Main bundle |
2401
+ | `ngxsmk-datepicker/adapters` | `DateFnsAdapter`, `DayjsAdapter`, `LuxonAdapter` | Install the matching peer library |
2402
+ | `ngxsmk-datepicker/material` | `NgxsmkDatepickerMatFormFieldControlDirective`, `provideMaterialFormFieldControl` | Requires `@angular/material` + `@angular/cdk` |
2403
+ | `ngxsmk-datepicker/styles/*` | CSS assets | Styles only |
2404
+
2405
+ ```typescript
2406
+ import { DateFnsAdapter } from 'ngxsmk-datepicker/adapters';
2407
+ import { NgxsmkDatepickerMatFormFieldControlDirective } from 'ngxsmk-datepicker/material';
2408
+ ```
2409
+
2410
+ `NativeDateAdapter` / `DateAdapter` remain on the main entry.
2411
+
2366
2412
  ## Virtual scrolling
2367
2413
 
2368
2414
  Year and decade views use the internal `calculateVirtualScroll` utility and visible-index signals so that only visible items are rendered when year ranges are large (e.g. 100+ years). The main calendar grid uses lazy month rendering via `_visibleCalendarIndicesSignal`. For very large ranges, consider limiting `yearRange` for optimal performance.