ngxsmk-datepicker 2.3.0-beta.0 → 2.3.1
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/CHANGELOG.md +8 -2
- package/MIGRATION.md +24 -5
- package/README.md +64 -81
- package/docs/API.md +8 -1
- package/docs/COMPATIBILITY.md +2 -1
- package/docs/INTEGRATION.md +2 -1
- package/docs/IONIC_INTEGRATION.md +2 -1
- package/docs/IONIC_TESTING.md +2 -1
- package/docs/LOCALE-GUIDE.md +2 -1
- package/docs/PLUGIN-ARCHITECTURE.md +2 -1
- package/docs/SEO.md +2 -1
- package/docs/SSR-EXAMPLE.md +2 -1
- package/docs/THEME-TOKENS.md +2 -1
- package/docs/TIMEZONE.md +14 -1
- package/docs/extension-points.md +2 -1
- package/docs/signal-forms.md +2 -1
- package/docs/signals.md +2 -1
- package/docs/ssr.md +2 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,23 +2,29 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
|
|
5
|
-
**Last updated:**
|
|
5
|
+
**Last updated:** June 3, 2026 - **Current stable:** v2.3.1
|
|
6
6
|
|
|
7
7
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
8
8
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
9
9
|
|
|
10
10
|
## [Unreleased]
|
|
11
11
|
|
|
12
|
-
## [2.3.
|
|
12
|
+
## [2.3.1] - 2026-06-03
|
|
13
13
|
|
|
14
14
|
### Added
|
|
15
15
|
|
|
16
|
+
- **Natural Language Input**: Integrated a lightweight, zero-dependency parser engine that resolves text expressions like "today", "tomorrow", relative day/week offsets, and quarter descriptors. Features a dynamic preview suggestion tooltip beneath the input field.
|
|
17
|
+
- **Multi-Calendar View**: Supported side-by-side calendar renders via `[calendars]="2"` or `[calendars]="3"` inputs, with seamless range highlights extending across all month boundaries.
|
|
18
|
+
- **Dynamic Presets Factory**: Introduced the `[rangePresetFactory]` callback input allowing developers to supply dynamic rolling ranges (e.g., fiscal quarters or rolling business-day windows).
|
|
19
|
+
- **Invalid Range Warning**: Highlights ranges with a warning style if a disabled date falls inside the selected range, emitting details via the `(invalidRange)` output.
|
|
20
|
+
- **Timezone Selector UI**: Added a searchable timezone dropdown via `[showTimezoneSelector]="true"` input, with timezone change values emitted via the `(timezoneChange)` output.
|
|
16
21
|
- **Shadow DOM Compatibility (Issue #268)**: Added full, native support for running inside Angular Shadow DOM containers (`ViewEncapsulation.ShadowDom`) and Custom Web Components.
|
|
17
22
|
- Interaction listeners now query and utilize `event.composedPath()` to correctly identify clicked targets originating inside the component shadow boundary, preventing calendar dropdowns and header custom selects from closing prematurely due to event target retargeting.
|
|
18
23
|
- Added new comprehensive Shadow DOM unit test suite (`shadow-dom-compatibility.spec.ts`).
|
|
19
24
|
|
|
20
25
|
### Changed
|
|
21
26
|
|
|
27
|
+
- **AOT & AoT Compilation Boundaries**: Refactored internal component signals (`_isCalendarOpen`, `_currentMonthSignal`, and `_currentYearSignal`) to `protected` access modifiers to prevent strict production AoT compilation errors.
|
|
22
28
|
- **Code Quality & Cognitive Complexity Reductions**:
|
|
23
29
|
- Flattened highly nested condition structures in `CustomSelectComponent.onDocumentTouchStart()`, reducing cognitive complexity to well below the limit of 15.
|
|
24
30
|
- Decomposed monolithic date check inside `NgxsmkDatepickerComponent.containsNode()` into private helper functions (`containsNodeViaComposedPath`, `containsNodeViaDOM`), drastically improving maintainability and reducing complexity down to 2.
|
package/MIGRATION.md
CHANGED
|
@@ -2,10 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
This document provides migration instructions for upgrading between major versions of ngxsmk-datepicker.
|
|
4
4
|
|
|
5
|
-
**Last updated:**
|
|
5
|
+
**Last updated:** June 3, 2026 - **Current stable:** v2.3.1
|
|
6
6
|
|
|
7
7
|
## Table of Contents
|
|
8
8
|
|
|
9
|
+
- [v2.2.15 → v2.3.1](#v2215---v231)
|
|
9
10
|
- [v2.2.7 → v2.2.11](#v227---v228)
|
|
10
11
|
- [v2.2.6 → v2.2.7](#v226---v227)
|
|
11
12
|
- [v2.2.3 → v2.2.6](#v223---v226)
|
|
@@ -58,12 +59,30 @@ This document provides migration instructions for upgrading between major versio
|
|
|
58
59
|
- [v1.8.0 → v1.9.0](#v180---v190)
|
|
59
60
|
- [v1.7.0 → v1.8.0](#v170---v180)
|
|
60
61
|
|
|
62
|
+
## v2.2.15 → v2.3.1
|
|
63
|
+
|
|
64
|
+
### Changes
|
|
65
|
+
|
|
66
|
+
- **Natural Language Input**: Standard text inputs can now resolve relative expressions (e.g. "today", "tomorrow", relative day/week/month/year offsets, quarter descriptors). Controlled via `[enableNaturalLanguage]` and emits via `(naturalLanguageResolved)`.
|
|
67
|
+
- **Multi-Calendar Layouts**: Support for showing 2 or 3 calendars side-by-side via `[calendars]`.
|
|
68
|
+
- **Dynamic Presets**: Supply a custom preset callback via `[rangePresetFactory]`.
|
|
69
|
+
- **Timezone Selection**: Searchable timezone selection dropdown via `[showTimezoneSelector]`.
|
|
70
|
+
- **Range Warnings**: Emits `(invalidRange)` if a range contains disabled dates.
|
|
71
|
+
|
|
72
|
+
### Migration Steps
|
|
73
|
+
|
|
74
|
+
No breaking changes. Upgrade with:
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
npm install ngxsmk-datepicker@2.3.1
|
|
78
|
+
```
|
|
79
|
+
|
|
61
80
|
## npm: skip v2.2.12
|
|
62
81
|
|
|
63
|
-
The **`2.2.12`** package on the registry is missing **`fesm2022/`** and **`types/`**. Stay on **`2.2.11`** or upgrade to **`2.3.
|
|
82
|
+
The **`2.2.12`** package on the registry is missing **`fesm2022/`** and **`types/`**. Stay on **`2.2.11`** or upgrade to **`2.3.1`** (or newer) once published ([#230](https://github.com/NGXSMK/ngxsmk-datepicker/issues/230)).
|
|
64
83
|
|
|
65
84
|
```bash
|
|
66
|
-
npm install ngxsmk-datepicker@2.3.
|
|
85
|
+
npm install ngxsmk-datepicker@2.3.1
|
|
67
86
|
```
|
|
68
87
|
|
|
69
88
|
## v2.2.7 → v2.2.11
|
|
@@ -77,7 +96,7 @@ npm install ngxsmk-datepicker@2.3.0
|
|
|
77
96
|
No breaking changes.
|
|
78
97
|
|
|
79
98
|
```bash
|
|
80
|
-
npm install ngxsmk-datepicker@2.3.
|
|
99
|
+
npm install ngxsmk-datepicker@2.3.1
|
|
81
100
|
```
|
|
82
101
|
|
|
83
102
|
## v2.2.6 → v2.2.7
|
|
@@ -92,7 +111,7 @@ npm install ngxsmk-datepicker@2.3.0
|
|
|
92
111
|
No breaking changes. Use **2.2.11** on npm (the `2.2.7` npm package was incomplete; 2.2.11 matches the intended 2.2.7 release).
|
|
93
112
|
|
|
94
113
|
```bash
|
|
95
|
-
npm install ngxsmk-datepicker@2.3.
|
|
114
|
+
npm install ngxsmk-datepicker@2.3.1
|
|
96
115
|
```
|
|
97
116
|
|
|
98
117
|
## v2.2.3 → v2.2.6
|
package/README.md
CHANGED
|
@@ -11,7 +11,6 @@
|
|
|
11
11
|
### _The Gold Standard for Premium Angular Calendar Selection_
|
|
12
12
|
|
|
13
13
|
[](https://www.npmjs.com/package/ngxsmk-datepicker)
|
|
14
|
-
[](https://github.com/NGXSMK/ngxsmk-datepicker/actions/workflows/ci.yml)
|
|
15
14
|
[](https://angular.io/)
|
|
16
15
|
[](https://github.com/NGXSMK/ngxsmk-datepicker/blob/main/LICENSE)
|
|
17
16
|
[](https://buymeacoffee.com/toozuuu)
|
|
@@ -20,23 +19,21 @@
|
|
|
20
19
|
|
|
21
20
|
**`npm i ngxsmk-datepicker`**
|
|
22
21
|
|
|
23
|
-
[Live
|
|
24
|
-
|
|
25
|
-
*StackBlitz:* after it boots, run `npm install` then `npm start` in the terminal to serve the demo app (`demo-app`).
|
|
22
|
+
[Explore Live Demo](https://ngxsmk.github.io/ngxsmk-datepicker/) • [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)
|
|
26
23
|
|
|
27
24
|
</div>
|
|
28
25
|
|
|
29
26
|
---
|
|
30
27
|
|
|
31
|
-
**Last updated:**
|
|
28
|
+
**Last updated:** June 3, 2026 - **Current stable:** v2.3.1
|
|
32
29
|
|
|
33
30
|
### **Overview**
|
|
34
31
|
|
|
35
32
|
**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.
|
|
36
33
|
|
|
37
|
-
> **Stable Release**: `v2.3.
|
|
34
|
+
> **Stable Release**: `v2.3.1` is the current stable release with compiled `fesm2022` output and type declarations.
|
|
38
35
|
>
|
|
39
|
-
> **Stable line**: v2.
|
|
36
|
+
> **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 **v2.3.1** on npm.
|
|
40
37
|
|
|
41
38
|
---
|
|
42
39
|
|
|
@@ -44,16 +41,14 @@
|
|
|
44
41
|
|
|
45
42
|
1. [📷 Screenshots](#-screenshots)
|
|
46
43
|
2. [✨ Features](#-features)
|
|
47
|
-
3. [
|
|
48
|
-
4. [
|
|
49
|
-
5. [
|
|
50
|
-
6. [
|
|
51
|
-
7. [
|
|
52
|
-
8. [
|
|
53
|
-
9. [
|
|
54
|
-
10. [
|
|
55
|
-
11. [🎨 Theming](#-theming)
|
|
56
|
-
12. [⌨️ Keyboard Navigation](#-keyboard-navigation)
|
|
44
|
+
3. [📋 Compatibility](#-compatibility)
|
|
45
|
+
4. [🌍 Localization (i18n)](#-localization-i18n)
|
|
46
|
+
5. [📦 Installation](#-installation)
|
|
47
|
+
6. [🚀 Quick Start](#-quick-start)
|
|
48
|
+
7. [🔌 Framework Integration](#-framework-integration)
|
|
49
|
+
8. [⚙️ API Reference](#-api-reference)
|
|
50
|
+
9. [🎨 Theming](#-theming)
|
|
51
|
+
10. [⌨️ Keyboard Navigation](#-keyboard-navigation)
|
|
57
52
|
|
|
58
53
|
---
|
|
59
54
|
|
|
@@ -72,7 +67,7 @@
|
|
|
72
67
|
- 💎 **Signal-Driven Engine**: Hyper-reactive state management using Angular Signals.
|
|
73
68
|
- 🌓 **Native Dark Mode**: Beautifully crafted themes for light and dark environments.
|
|
74
69
|
- 📱 **Mobile-First UX**: Native mobile picker integration with touch gestures and haptic feedback.
|
|
75
|
-
- 🧩 **
|
|
70
|
+
- 🧩 **Zero Dependencies**: Lightweight standalone component with no external bloat.
|
|
76
71
|
- ⚡ **Performance++**: Lazy-loaded calendar months, memoized calculations, and tree-shakable architecture.
|
|
77
72
|
|
|
78
73
|
### **Advanced Functionality**
|
|
@@ -84,27 +79,6 @@
|
|
|
84
79
|
- 🚀 **Zoneless Ready**: Optimized for the future of Angular—works perfectly without zone.js.
|
|
85
80
|
- ♿ **Full Accessibility**: WAI-ARIA compliant with extensive keyboard navigation support.
|
|
86
81
|
|
|
87
|
-
## Why this library?
|
|
88
|
-
|
|
89
|
-
Use **ngxsmk-datepicker** when you want a focused **date / range picker** with strong **mobile**, **i18n**, **timezone**, and **SSR** story on **Angular 17+**, without adopting a full Material UI stack. It is a **standalone** component with **Luxon** as the single date peer (plus Angular).
|
|
90
|
-
|
|
91
|
-
| | ngxsmk-datepicker | Angular Material datepicker |
|
|
92
|
-
| --- | --- | --- |
|
|
93
|
-
| **Fit** | Picker-first; optional Material/CDK peers for overlays only | Part of Material; best when you already use Material forms & CDK |
|
|
94
|
-
| **Peer deps** | Angular + **Luxon** | **@angular/material** + **@angular/cdk** |
|
|
95
|
-
| **Forms** | Template-driven, Reactive Forms, Signals; **Signal Forms** (`[field]`) on Angular 21+ | Reactive + template-driven; integrates with Material form field |
|
|
96
|
-
| **Stack** | Tree-shakable package aimed at picker scenarios | Broader design system and bundle footprint |
|
|
97
|
-
|
|
98
|
-
This is **not** a drop-in replacement for every Material datepicker API; choose based on whether you need **Material’s form-field ecosystem** or a **standalone picker** you can theme and ship with **zoneless** / **SSR** setups. 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.
|
|
99
|
-
|
|
100
|
-
## **🌐 Discoverability**
|
|
101
|
-
|
|
102
|
-
**Maintainers (GitHub):** consider repository **Topics** such as: `angular`, `datepicker`, `date-range-picker`, `luxon`, `standalone-components`, `i18n`, `angular-universal`, `ionic`, `accessibility`.
|
|
103
|
-
|
|
104
|
-
**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.
|
|
105
|
-
|
|
106
|
-
**Security:** report sensitive issues per [SECURITY.md](https://github.com/NGXSMK/ngxsmk-datepicker/blob/main/SECURITY.md), not via public issues.
|
|
107
|
-
|
|
108
82
|
## **📋 Compatibility**
|
|
109
83
|
|
|
110
84
|
For detailed compatibility information, see [COMPATIBILITY.md](https://github.com/NGXSMK/ngxsmk-datepicker/blob/main/projects/ngxsmk-datepicker/docs/COMPATIBILITY.md).
|
|
@@ -163,30 +137,21 @@ Features marked as experimental may change:
|
|
|
163
137
|
|
|
164
138
|
For details, see [CONTRIBUTING.md](https://github.com/NGXSMK/ngxsmk-datepicker/blob/main/CONTRIBUTING.md#deprecation-policy).
|
|
165
139
|
|
|
166
|
-
##
|
|
140
|
+
## **🚀 Installation**
|
|
141
|
+
|
|
142
|
+
Install the package using npm:
|
|
167
143
|
|
|
168
144
|
```bash
|
|
169
|
-
npm install ngxsmk-datepicker@
|
|
145
|
+
npm install ngxsmk-datepicker@latest
|
|
170
146
|
```
|
|
171
147
|
|
|
172
148
|
### Alternative installation
|
|
173
149
|
|
|
174
|
-
You can install without npm using
|
|
175
|
-
|
|
176
|
-
| Method | Command |
|
|
177
|
-
|--------|--------|
|
|
178
|
-
| **Yarn** | `yarn add ngxsmk-datepicker@2.3.0` |
|
|
179
|
-
| **pnpm** | `pnpm add ngxsmk-datepicker@2.3.0` |
|
|
180
|
-
| **Bun** | `bun add ngxsmk-datepicker@2.3.0` |
|
|
181
|
-
| **From Git** | `npm install github:NGXSMK/ngxsmk-datepicker#v2.3.0` (requires the repo to have built output or you build from source) |
|
|
182
|
-
| **Local path** | Build the library in the repo (`npx ng build ngxsmk-datepicker`), then `npm install /path/to/ngxsmk-datepicker/dist/ngxsmk-datepicker` |
|
|
183
|
-
| **CDN (ESM)** | Use [unpkg](https://unpkg.com/ngxsmk-datepicker@2.3.0/) or [jsDelivr](https://cdn.jsdelivr.net/npm/ngxsmk-datepicker@2.3.0/) in your bundler or import map; peer dependencies (Angular, etc.) must be installed in your app. |
|
|
184
|
-
|
|
185
|
-
For all options and caveats, see [docs/INSTALLATION.md](docs/INSTALLATION.md).
|
|
150
|
+
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.
|
|
186
151
|
|
|
187
152
|
## **Usage**
|
|
188
153
|
|
|
189
|
-
ngxsmk-datepicker is a standalone component, so you can import it directly into your component or module.
|
|
154
|
+
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>`).
|
|
190
155
|
|
|
191
156
|
### Signal Forms (Angular 21)
|
|
192
157
|
|
|
@@ -256,7 +221,7 @@ For detailed Signal Forms integration including dirty state tracking, see the [S
|
|
|
256
221
|
|
|
257
222
|
#### **1. Import the Component**
|
|
258
223
|
|
|
259
|
-
|
|
224
|
+
In your component file (e.g., app.component.ts), import NgxsmkDatepickerComponent.
|
|
260
225
|
|
|
261
226
|
import { Component } from '@angular/core';
|
|
262
227
|
import { NgxsmkDatepickerComponent, DateRange, HolidayProvider } from 'ngxsmk-datepicker';
|
|
@@ -286,8 +251,6 @@ All public exports (component, utilities, types, services) come from the main pa
|
|
|
286
251
|
}
|
|
287
252
|
}
|
|
288
253
|
|
|
289
|
-
**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>`).
|
|
290
|
-
|
|
291
254
|
#### **2. Add it to Your Template**
|
|
292
255
|
|
|
293
256
|
Use the `<ngxsmk-datepicker>` selector in your HTML template.
|
|
@@ -368,7 +331,7 @@ export class MaterialFormComponent {
|
|
|
368
331
|
}
|
|
369
332
|
```
|
|
370
333
|
|
|
371
|
-
**Non-Standalone (NgModules):** Add the directive file from [INTEGRATION.md § Angular Material](
|
|
334
|
+
**Non-Standalone (NgModules):** Add the directive file from [INTEGRATION.md § Angular Material](docs/INTEGRATION.md#angular-material), then add it to your module `imports` (with `NgxsmkDatepickerComponent`, `MatFormFieldModule`, etc.) and use `ngxsmkMatFormFieldControl` on the datepicker in templates.
|
|
372
335
|
|
|
373
336
|
**With Date Range:**
|
|
374
337
|
|
|
@@ -387,9 +350,6 @@ For best integration with Ionic, import the integration styles in your global CS
|
|
|
387
350
|
@import "ngxsmk-datepicker/styles/ionic-integration.css";
|
|
388
351
|
```
|
|
389
352
|
|
|
390
|
-
**Automatic Theming:**
|
|
391
|
-
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.
|
|
392
|
-
|
|
393
353
|
Works seamlessly with Ionic form components and follows Ionic design patterns:
|
|
394
354
|
|
|
395
355
|
```typescript
|
|
@@ -558,6 +518,10 @@ By default, the datepicker input is `readonly` to prevent invalid date strings a
|
|
|
558
518
|
| classes | object | undefined | Tailwind-friendly class overrides (wrapper, input, popover, etc.). |
|
|
559
519
|
| enableGoogleCalendar| boolean | false | Enable seamless Google Calendar integration and sync. |
|
|
560
520
|
| googleClientId | string \| null | null | Google API OAuth 2.0 Web Client ID for authentication. |
|
|
521
|
+
| calendars | number | 1 | Multi-calendar display layout (supports 1, 2, or 3 side-by-side calendars). |
|
|
522
|
+
| rangePresetFactory | (today: Date) => DatePreset[] | null | Callback function supplying dynamic rolling range presets. |
|
|
523
|
+
| showTimezoneSelector | boolean | false | Enables searchable IANA timezone selection dropdown UI. |
|
|
524
|
+
| enableNaturalLanguage | boolean | false | Enables manual relative keyboard typing input (e.g. "today", "in 3 days"). |
|
|
561
525
|
|
|
562
526
|
### **Outputs**
|
|
563
527
|
|
|
@@ -566,6 +530,9 @@ By default, the datepicker input is `readonly` to prevent invalid date strings a
|
|
|
566
530
|
| valueChange | DatepickerValue | Emits the newly selected date, range, or array of dates. |
|
|
567
531
|
| action | { type: string; payload?: any } | Emits various events like `dateSelected`, `timeChanged`, etc. |
|
|
568
532
|
| googleSyncClick | void | Emitted when the user clicks the Google Calendar sync button. |
|
|
533
|
+
| invalidRange | { start: Date; end: Date; disabledDatesInside: Date[] } | Emitted when selected date range contains disabled dates. |
|
|
534
|
+
| naturalLanguageResolved | Date \| { start: Date; end: Date } | Emitted when user types relative natural language date input. |
|
|
535
|
+
| timezoneChange | string | Emitted when timezone selection is changed. |
|
|
569
536
|
|
|
570
537
|
## **🎨 Theming**
|
|
571
538
|
|
|
@@ -633,14 +600,14 @@ The `locale` input controls all internationalization. It automatically formats m
|
|
|
633
600
|
|
|
634
601
|
ngxsmk-datepicker v2.2.x now features **full localization synchronization** for:
|
|
635
602
|
|
|
636
|
-
-
|
|
637
|
-
-
|
|
638
|
-
-
|
|
639
|
-
-
|
|
603
|
+
- 🇺🇸 English (`en`)
|
|
604
|
+
- 🇩🇪 German (`de`)
|
|
605
|
+
- 🇫🇷 French (`fr`)
|
|
606
|
+
- 🇪🇸 Spanish (`es`)
|
|
640
607
|
- 🇸🇪 Swedish (`sv`)
|
|
641
|
-
-
|
|
642
|
-
-
|
|
643
|
-
-
|
|
608
|
+
- 🇰🇷 Korean (`ko`)
|
|
609
|
+
- 🇨🇳 Chinese (`zh`)
|
|
610
|
+
- 🇯🇵 Japanese (`ja`)
|
|
644
611
|
|
|
645
612
|
### **Usage Example**
|
|
646
613
|
|
|
@@ -705,7 +672,7 @@ const myHooks: DatepickerHooks = {
|
|
|
705
672
|
<ngxsmk-datepicker [hooks]="myHooks" [customShortcuts]="shortcuts" mode="single"> </ngxsmk-datepicker>
|
|
706
673
|
```
|
|
707
674
|
|
|
708
|
-
All date cells are keyboard accessible with proper ARIA attributes for screen readers.
|
|
675
|
+
All date cells are keyboard accessible with proper ARIA attributes for screen readers.
|
|
709
676
|
|
|
710
677
|
See [Extension Points Guide](./projects/ngxsmk-datepicker/docs/extension-points.md) for detailed customization options.
|
|
711
678
|
|
|
@@ -730,14 +697,11 @@ This library has been optimized for maximum performance:
|
|
|
730
697
|
- ✅ **Date Validation**: Fixed "Today" unselectable bug by normalizing `minDate` boundary checks.
|
|
731
698
|
- ✅ **Keyboard Shortcuts**: Updated "Today" selection shortcut to use timezone-aware calculation.
|
|
732
699
|
- ✅ **Validation messages**: User-facing i18n strings for invalid date, min/max; `validationError` output and on-screen error display
|
|
733
|
-
- ✅ **
|
|
734
|
-
- ✅ **
|
|
735
|
-
- ✅ **
|
|
736
|
-
- ✅ **
|
|
737
|
-
- ✅ **
|
|
738
|
-
- ✅ **Performance**: Optimized template bindings with memoized functions
|
|
739
|
-
- ✅ **Accessibility**: Better focus states and keyboard navigation
|
|
740
|
-
- ✅ **Build System**: Improved build configuration and optimization
|
|
700
|
+
- ✅ **Calendar loading state**: Visual spinner + text and screen-reader announcement while calendar opens/generates
|
|
701
|
+
- ✅ **Demo theme**: Light/dark theme toggle and system preference now correctly switch the demo UI
|
|
702
|
+
- ✅ **Installation options**: Full install guide (npm, Yarn, pnpm, Bun, Git, CDN, etc.) and demo page updates
|
|
703
|
+
- ✅ **Accessibility**: Loading state announced via live region; validation errors exposed for a11y
|
|
704
|
+
- ✅ **Type Safety**: New translation keys and strictly typed inputs/outputs
|
|
741
705
|
|
|
742
706
|
### **Performance Enhancements:**
|
|
743
707
|
|
|
@@ -891,9 +855,13 @@ We welcome and appreciate contributions from the community! Whether it's reporti
|
|
|
891
855
|
|
|
892
856
|
## **📄 Changelog**
|
|
893
857
|
|
|
894
|
-
|
|
858
|
+
For a full list of changes, please refer to the [CHANGELOG.md](https://github.com/NGXSMK/ngxsmk-datepicker/blob/main/CHANGELOG.md) file.
|
|
859
|
+
|
|
860
|
+
### **v2.3.1** (Current Stable)`r`n`r`n- **npm**: Published tarballs include compiled `fesm2022/` output and type declarations.
|
|
895
861
|
|
|
896
|
-
|
|
862
|
+
### **Earlier Versions**
|
|
863
|
+
|
|
864
|
+
For older version details, please refer to the [full CHANGELOG.md](https://github.com/NGXSMK/ngxsmk-datepicker/blob/main/CHANGELOG.md).
|
|
897
865
|
|
|
898
866
|
## **🎨 Theming with TokiForge**
|
|
899
867
|
|
|
@@ -901,6 +869,11 @@ Looking for a powerful theming solution for your Angular application? Check out
|
|
|
901
869
|
|
|
902
870
|
### Why TokiForge?
|
|
903
871
|
|
|
872
|
+
- ✅ **Framework-agnostic** — Works with Angular, React, Vue, Svelte, and vanilla JS
|
|
873
|
+
- ✅ **Runtime theme switching** — Change themes dynamically without rebuilds
|
|
874
|
+
- ✅ **Type-safe** — Full TypeScript support for design tokens
|
|
875
|
+
- ✅ **Lightweight** — <3 KB gzipped runtime footprint
|
|
876
|
+
- ✅ **CSS custom properties** — Zero JS overhead in static mode
|
|
904
877
|
- ✅ **SSR compatible** — Works seamlessly with Angular Universal
|
|
905
878
|
|
|
906
879
|
Perfect for managing design tokens, creating theme systems, and implementing dark mode in your Angular applications!
|
|
@@ -913,9 +886,19 @@ Perfect for managing design tokens, creating theme systems, and implementing dar
|
|
|
913
886
|
|
|
914
887
|
MIT License - see [LICENSE](https://github.com/NGXSMK/ngxsmk-datepicker/blob/main/LICENSE) file for details.
|
|
915
888
|
|
|
916
|
-
## **🔍 SEO
|
|
889
|
+
## **🔍 SEO & Discoverability**
|
|
890
|
+
|
|
891
|
+
This library is optimized for search engine visibility, especially for European markets:
|
|
917
892
|
|
|
918
|
-
|
|
893
|
+
- **Keywords**: Angular datepicker, date range picker, calendar component, Angular 17-21, TypeScript, Signal Forms, SSR compatible
|
|
894
|
+
- **European SEO**: Optimized for Germany, France, Spain, Italy, Netherlands, Poland, Portugal, Sweden, Norway, Finland, Denmark, Belgium, Switzerland, Austria, and United Kingdom
|
|
895
|
+
- **Multi-language Support**: hreflang tags for 15+ European languages and locales
|
|
896
|
+
- **European Geo-targeting**: Geo tags and structured data optimized for European Union countries
|
|
897
|
+
- **Meta Tags**: Comprehensive Open Graph and Twitter Card support with European locale alternates
|
|
898
|
+
- **Structured Data**: JSON-LD schema markup with European audience targeting and area served information
|
|
899
|
+
- **Documentation**: Complete API documentation with examples
|
|
900
|
+
- **Performance**: Optimized bundle size (~127KB) for fast loading
|
|
901
|
+
- **European Localization**: Full i18n support for European date formats, week start days, and regional preferences
|
|
919
902
|
|
|
920
903
|
## **👨💻 Author**
|
|
921
904
|
|
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**: 2.
|
|
5
|
+
**Version**: 2.3.1+ | **Last updated**: June 3, 2026
|
|
6
6
|
|
|
7
7
|
## Stable vs experimental
|
|
8
8
|
|
|
@@ -102,6 +102,10 @@ import { NgxsmkDatepickerComponent } from 'ngxsmk-datepicker';
|
|
|
102
102
|
| `enableHapticFeedback` | `boolean` | `false` | Stable | Trigger haptic feedback on supported devices when selecting/clearing. | `[enableHapticFeedback]="true"` |
|
|
103
103
|
| `enablePullToRefresh` | `boolean` | `false` | Experimental | Reserve for future pull-to-refresh on mobile. | — |
|
|
104
104
|
| `enableVoiceInput` | `boolean` | `false` | Experimental | Reserve for future voice input. | — |
|
|
105
|
+
| `calendars` | `number` | `1` | Stable | Multi-calendar display layout (1, 2, or 3 months side-by-side) | `[calendars]="2"` |
|
|
106
|
+
| `rangePresetFactory` | `(today: Date) => DatePreset[]` | `null` | Stable | Callback function supplying dynamic range presets | `[rangePresetFactory]="myPresetFactory"` |
|
|
107
|
+
| `showTimezoneSelector` | `boolean` | `false` | Stable | Enables searchable timezone selection dropdown UI | `[showTimezoneSelector]="true"` |
|
|
108
|
+
| `enableNaturalLanguage` | `boolean` | `false` | Stable | Enables relative natural language input parsing (e.g. "today", "tomorrow") | `[enableNaturalLanguage]="true"` |
|
|
105
109
|
|
|
106
110
|
##### Outputs
|
|
107
111
|
|
|
@@ -111,6 +115,9 @@ import { NgxsmkDatepickerComponent } from 'ngxsmk-datepicker';
|
|
|
111
115
|
| `action` | `EventEmitter<{ type: string; payload?: any }>` | Stable | Emitted on user actions (dateSelected, timeChanged, etc.) | `(action)="handleAction($event)"` |
|
|
112
116
|
| `googleSyncClick` | `EventEmitter<void>` | Stable | Emitted when the user clicks the Google Calendar sync button. | `(googleSyncClick)="onSyncClick()"` |
|
|
113
117
|
| `validationError` | `EventEmitter<{ code: string; message: string }>` | Stable | Emitted when validation fails (e.g. invalid typed date, date before min, after max). Message is translated. | `(validationError)="onValidationError($event)"` |
|
|
118
|
+
| `invalidRange` | `EventEmitter<{ start: Date; end: Date; disabledDatesInside: Date[] }>` | Stable | Emitted when selected date range contains disabled dates | `(invalidRange)="onInvalidRange($event)"` |
|
|
119
|
+
| `naturalLanguageResolved` | `EventEmitter<Date \| { start: Date; end: Date }>` | Stable | Emitted when natural language input is parsed successfully | `(naturalLanguageResolved)="onResolved($event)"` |
|
|
120
|
+
| `timezoneChange` | `EventEmitter<string>` | Stable | Emitted when timezone is changed via selector UI | `(timezoneChange)="onTimezoneChange($event)"` |
|
|
114
121
|
|
|
115
122
|
#### Methods
|
|
116
123
|
|
package/docs/COMPATIBILITY.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Version Compatibility Matrix
|
|
2
2
|
|
|
3
|
-
**Last updated:**
|
|
3
|
+
**Last updated:** June 3, 2026 - **Current stable:** v2.3.1
|
|
4
4
|
|
|
5
5
|
This document provides comprehensive compatibility information for `ngxsmk-datepicker` across different Angular versions, Zone.js configurations, and SSR/CSR setups.
|
|
6
6
|
|
|
@@ -468,3 +468,4 @@ Recommended validation before tagging a release:
|
|
|
468
468
|
**Ionic/Capacitor sample**: The `examples/ionic-test-app` project may require `npm install --legacy-peer-deps` when Ionic’s peers lag Angular—see [examples/ionic-test-app/README.md](../../../examples/ionic-test-app/README.md).
|
|
469
469
|
|
|
470
470
|
|
|
471
|
+
|
package/docs/INTEGRATION.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Integration Guides
|
|
2
2
|
|
|
3
|
-
**Last updated:**
|
|
3
|
+
**Last updated:** June 3, 2026 - **Current stable:** v2.3.1
|
|
4
4
|
|
|
5
5
|
This document provides integration examples for using ngxsmk-datepicker with popular frameworks and libraries.
|
|
6
6
|
|
|
@@ -700,3 +700,4 @@ See the demo app **Integrations** page for a full "Datepicker in a modal" exampl
|
|
|
700
700
|
- [Locale Guide](./LOCALE-GUIDE.md)
|
|
701
701
|
|
|
702
702
|
|
|
703
|
+
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Ionic Framework Integration Guide
|
|
2
2
|
|
|
3
|
-
**Last updated:**
|
|
3
|
+
**Last updated:** June 3, 2026 - **Current stable:** v2.3.1
|
|
4
4
|
|
|
5
5
|
This guide provides step-by-step instructions for integrating ngxsmk-datepicker with Ionic Angular applications.
|
|
6
6
|
|
|
@@ -225,3 +225,4 @@ export class DatepickerPage {
|
|
|
225
225
|
- [Capacitor Keyboard Plugin](https://capacitorjs.com/docs/apis/keyboard)
|
|
226
226
|
|
|
227
227
|
|
|
228
|
+
|
package/docs/IONIC_TESTING.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Ionic Integration Testing Guide
|
|
2
2
|
|
|
3
|
-
**Last updated:**
|
|
3
|
+
**Last updated:** June 3, 2026 - **Current stable:** v2.3.1
|
|
4
4
|
|
|
5
5
|
This document provides comprehensive testing instructions for verifying ngxsmk-datepicker compatibility with Ionic Framework.
|
|
6
6
|
|
|
@@ -145,3 +145,4 @@ jobs:
|
|
|
145
145
|
4. **Report issues** with detailed information
|
|
146
146
|
|
|
147
147
|
|
|
148
|
+
|
package/docs/LOCALE-GUIDE.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Locale Packs & i18n Contributor Guide
|
|
2
2
|
|
|
3
|
-
**Last updated:**
|
|
3
|
+
**Last updated:** June 3, 2026 - **Current stable:** v2.3.1
|
|
4
4
|
|
|
5
5
|
Guide for adding locale support and contributing translations to ngxsmk-datepicker.
|
|
6
6
|
|
|
@@ -297,3 +297,4 @@ If you encounter issues with a specific locale or want to contribute improvement
|
|
|
297
297
|
**Thank you for contributing to ngxsmk-datepicker's internationalization!**
|
|
298
298
|
|
|
299
299
|
|
|
300
|
+
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Plugin Architecture
|
|
2
2
|
|
|
3
|
-
**Last updated:**
|
|
3
|
+
**Last updated:** June 3, 2026 - **Current stable:** v2.3.1
|
|
4
4
|
|
|
5
5
|
ngxsmk-datepicker features a powerful **plugin architecture** that allows you to extend and customize the component's behavior without modifying its core code. This architecture is built on a **hook-based system** that provides extension points throughout the component's lifecycle.
|
|
6
6
|
|
|
@@ -927,3 +927,4 @@ The plugin architecture in ngxsmk-datepicker provides:
|
|
|
927
927
|
For more examples and detailed hook documentation, see [Extension Points Guide](./extension-points.md).
|
|
928
928
|
|
|
929
929
|
|
|
930
|
+
|
package/docs/SEO.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# SEO Optimization Guide
|
|
2
2
|
|
|
3
|
-
**Last updated:**
|
|
3
|
+
**Last updated:** June 3, 2026 - **Current stable:** v2.3.1
|
|
4
4
|
|
|
5
5
|
This document outlines the SEO optimizations implemented for ngxsmk-datepicker to improve search engine visibility and discoverability.
|
|
6
6
|
|
|
@@ -211,3 +211,4 @@ ngxsmk-datepicker has been optimized for search engines with comprehensive meta
|
|
|
211
211
|
- [Web.dev SEO Guide](https://web.dev/learn/seo/)
|
|
212
212
|
|
|
213
213
|
|
|
214
|
+
|
package/docs/SSR-EXAMPLE.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Server-Side Rendering (SSR) Example
|
|
2
2
|
|
|
3
|
-
**Last updated:**
|
|
3
|
+
**Last updated:** June 3, 2026 - **Current stable:** v2.3.1
|
|
4
4
|
|
|
5
5
|
Complete example demonstrating ngxsmk-datepicker with Angular Universal (SSR).
|
|
6
6
|
|
|
@@ -424,3 +424,4 @@ test('datepicker works after SSR hydration', async ({ page }) => {
|
|
|
424
424
|
- [Platform Detection](https://angular.io/api/common/isPlatformBrowser)
|
|
425
425
|
|
|
426
426
|
|
|
427
|
+
|
package/docs/THEME-TOKENS.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Theme Tokens & CSS Custom Properties
|
|
2
2
|
|
|
3
|
-
**Last updated:**
|
|
3
|
+
**Last updated:** June 3, 2026 - **Current stable:** v2.3.1
|
|
4
4
|
|
|
5
5
|
Complete reference for all CSS custom properties (CSS variables) available in ngxsmk-datepicker.
|
|
6
6
|
|
|
@@ -321,3 +321,4 @@ CSS custom properties are supported in all modern browsers:
|
|
|
321
321
|
For older browsers, consider using a CSS custom properties polyfill or provide fallback values.
|
|
322
322
|
|
|
323
323
|
|
|
324
|
+
|
package/docs/TIMEZONE.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Timezone Support
|
|
2
2
|
|
|
3
|
-
**Last updated:**
|
|
3
|
+
**Last updated:** June 3, 2026 - **Current stable:** v2.3.1
|
|
4
4
|
|
|
5
5
|
## Overview
|
|
6
6
|
|
|
@@ -258,6 +258,19 @@ const date = new Date(serverResponse.dateString.replace('Z', '')); // Don't remo
|
|
|
258
258
|
- **Description**: IANA timezone name for date formatting
|
|
259
259
|
- **Example**: `'America/New_York'`, `'UTC'`, `'Europe/London'`
|
|
260
260
|
|
|
261
|
+
### Input: `showTimezoneSelector`
|
|
262
|
+
|
|
263
|
+
- **Type**: `boolean`
|
|
264
|
+
- **Default**: `false`
|
|
265
|
+
- **Description**: Enables a searchable timezone selection dropdown UI in the datepicker header.
|
|
266
|
+
- **Example**: `[showTimezoneSelector]="true"`
|
|
267
|
+
|
|
268
|
+
### Output: `timezoneChange`
|
|
269
|
+
|
|
270
|
+
- **Type**: `EventEmitter<string>`
|
|
271
|
+
- **Description**: Emitted when the user changes the active timezone via the selector UI.
|
|
272
|
+
- **Example**: `(timezoneChange)="onTimezoneChange($event)"`
|
|
273
|
+
|
|
261
274
|
### Utility Functions
|
|
262
275
|
|
|
263
276
|
The library exports timezone utility functions:
|
package/docs/extension-points.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Extension Points and Hooks
|
|
2
2
|
|
|
3
|
-
**Last updated:**
|
|
3
|
+
**Last updated:** June 3, 2026 - **Current stable:** v2.3.1
|
|
4
4
|
|
|
5
5
|
ngxsmk-datepicker provides comprehensive extension points through the `hooks` input, allowing you to customize rendering, validation, keyboard shortcuts, formatting, and event handling.
|
|
6
6
|
|
|
@@ -416,3 +416,4 @@ import {
|
|
|
416
416
|
```
|
|
417
417
|
|
|
418
418
|
|
|
419
|
+
|
package/docs/signal-forms.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Signal Forms Integration
|
|
2
2
|
|
|
3
|
-
**Last updated:**
|
|
3
|
+
**Last updated:** June 3, 2026 - **Current stable:** v2.3.1
|
|
4
4
|
|
|
5
5
|
This guide covers using ngxsmk-datepicker with Angular 21+ Signal Forms API.
|
|
6
6
|
|
|
@@ -597,3 +597,4 @@ If `form().dirty()` returns `false` after selecting a date:
|
|
|
597
597
|
4. **Check dev console warnings**: In development mode, the datepicker logs warnings if it falls back to direct signal mutation, which may not track dirty state correctly.
|
|
598
598
|
|
|
599
599
|
|
|
600
|
+
|
package/docs/signals.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Signals Integration Guide
|
|
2
2
|
|
|
3
|
-
**Last updated:**
|
|
3
|
+
**Last updated:** June 3, 2026 - **Current stable:** v2.3.1
|
|
4
4
|
|
|
5
5
|
ngxsmk-datepicker is fully compatible with Angular Signals, providing seamless integration with both traditional reactive forms and modern signal-based patterns.
|
|
6
6
|
|
|
@@ -263,3 +263,4 @@ dateSignal = signal<DatepickerValue>(null);
|
|
|
263
263
|
The datepicker supports both patterns simultaneously, so you can migrate gradually.
|
|
264
264
|
|
|
265
265
|
|
|
266
|
+
|
package/docs/ssr.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Server-Side Rendering (SSR) Guide
|
|
2
2
|
|
|
3
|
-
**Last updated:**
|
|
3
|
+
**Last updated:** June 3, 2026 - **Current stable:** v2.3.1
|
|
4
4
|
|
|
5
5
|
ngxsmk-datepicker is fully compatible with Angular Universal and server-side rendering. This guide covers SSR setup, best practices, and troubleshooting.
|
|
6
6
|
|
|
@@ -302,3 +302,4 @@ export class SSRExampleComponent {
|
|
|
302
302
|
- [Platform Detection](https://angular.dev/api/common/isPlatformBrowser)
|
|
303
303
|
|
|
304
304
|
|
|
305
|
+
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ngxsmk-datepicker",
|
|
3
|
-
"version": "2.3.
|
|
3
|
+
"version": "2.3.1",
|
|
4
4
|
"description": "Lightweight, accessible date and range picker for Angular 17+. Standalone component, Signals, SSR and zoneless-ready, Luxon-based i18n and timezones.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Sachin Dilshan",
|