ngxsmk-datepicker 2.3.1 → 2.4.0
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 +942 -922
- package/docs/API.md +2423 -2413
- package/docs/COMPATIBILITY.md +471 -471
- package/docs/INTEGRATION.md +703 -703
- package/docs/IONIC_INTEGRATION.md +228 -228
- package/docs/LOCALE-GUIDE.md +300 -300
- package/docs/PLUGIN-ARCHITECTURE.md +930 -930
- package/docs/SSR-EXAMPLE.md +427 -427
- package/docs/THEME-TOKENS.md +324 -324
- package/docs/TIMEZONE.md +307 -307
- package/docs/extension-points.md +419 -419
- package/docs/signal-forms.md +600 -600
- package/docs/signals.md +266 -266
- package/docs/ssr.md +305 -305
- package/package.json +106 -104
- package/schematics/collection.json +10 -0
- package/schematics/ng-add/schema.json +14 -0
- package/schematics/tsconfig.json +17 -0
- package/CHANGELOG.md +0 -1246
- package/LICENSE +0 -21
- package/MIGRATION.md +0 -1794
- package/docs/FEATURE_SCOPING.md +0 -60
- package/docs/IONIC_TESTING.md +0 -148
- package/docs/REFACTOR_PLAN.md +0 -38
- package/docs/SEO.md +0 -214
- package/fesm2022/ngxsmk-datepicker.mjs +0 -14693
- package/types/ngxsmk-datepicker.d.ts +0 -2489
package/docs/THEME-TOKENS.md
CHANGED
|
@@ -1,324 +1,324 @@
|
|
|
1
|
-
# Theme Tokens & CSS Custom Properties
|
|
2
|
-
|
|
3
|
-
**Last updated:**
|
|
4
|
-
|
|
5
|
-
Complete reference for all CSS custom properties (CSS variables) available in ngxsmk-datepicker.
|
|
6
|
-
|
|
7
|
-
## Overview
|
|
8
|
-
|
|
9
|
-
ngxsmk-datepicker uses CSS custom properties for theming, allowing you to customize the appearance without modifying the component's internal styles. All variables are prefixed with `--datepicker-` and can be overridden at any level in your CSS.
|
|
10
|
-
|
|
11
|
-
## Color Tokens
|
|
12
|
-
|
|
13
|
-
### Primary Colors
|
|
14
|
-
|
|
15
|
-
| Variable | Default (Light) | Default (Dark) | Description |
|
|
16
|
-
|----------|----------------|----------------|-------------|
|
|
17
|
-
| `--datepicker-primary-color` | `#6d28d9` | `#8b5cf6` | Primary brand color for selected dates, buttons, and focus states |
|
|
18
|
-
| `--datepicker-primary-contrast` | `#ffffff` | `#ffffff` | Text color on primary color background |
|
|
19
|
-
|
|
20
|
-
### Background Colors
|
|
21
|
-
|
|
22
|
-
| Variable | Default (Light) | Default (Dark) | Description |
|
|
23
|
-
|----------|----------------|----------------|-------------|
|
|
24
|
-
| `--datepicker-background` | `#ffffff` | `#1f2937` | Main background color for calendar container |
|
|
25
|
-
| `--datepicker-range-background` | `#f5f3ff` | `rgba(139, 92, 246, 0.15)` | Background color for date range selection |
|
|
26
|
-
| `--datepicker-hover-background` | `#f3f4f6` | `#374151` | Background color for hover states |
|
|
27
|
-
|
|
28
|
-
### Text Colors
|
|
29
|
-
|
|
30
|
-
| Variable | Default (Light) | Default (Dark) | Description |
|
|
31
|
-
|----------|----------------|----------------|-------------|
|
|
32
|
-
| `--datepicker-text-color` | `#1f2937` | `#f3f4f6` | Primary text color |
|
|
33
|
-
| `--datepicker-subtle-text-color` | `#6b7280` | `#9ca3af` | Secondary/subtle text color for labels and hints |
|
|
34
|
-
|
|
35
|
-
### Border Colors
|
|
36
|
-
|
|
37
|
-
| Variable | Default (Light) | Default (Dark) | Description |
|
|
38
|
-
|----------|----------------|----------------|-------------|
|
|
39
|
-
| `--datepicker-border-color` | `#e5e7eb` | `#374151` | Border color for inputs, calendar, and dividers |
|
|
40
|
-
|
|
41
|
-
## Shadow Tokens
|
|
42
|
-
|
|
43
|
-
| Variable | Default (Light) | Default (Dark) | Description |
|
|
44
|
-
|----------|----------------|----------------|-------------|
|
|
45
|
-
| `--datepicker-shadow-sm` | `0 1px 2px 0 rgba(0, 0, 0, 0.05)` | `0 1px 2px 0 rgba(0, 0, 0, 0.3)` | Small shadow for subtle elevation |
|
|
46
|
-
| `--datepicker-shadow-md` | `0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)` | `0 4px 6px -1px rgba(0, 0, 0, 0.3), 0 2px 4px -1px rgba(0, 0, 0, 0.2)` | Medium shadow for popover and elevated elements |
|
|
47
|
-
| `--datepicker-shadow-lg` | `0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)` | `0 10px 15px -3px rgba(0, 0, 0, 0.3), 0 4px 6px -2px rgba(0, 0, 0, 0.2)` | Large shadow for modal overlays |
|
|
48
|
-
| `--datepicker-shadow-xl` | `0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04)` | Same as light | Extra large shadow (not used in dark theme) |
|
|
49
|
-
|
|
50
|
-
## Typography Tokens
|
|
51
|
-
|
|
52
|
-
| Variable | Default | Description |
|
|
53
|
-
|----------|---------|-------------|
|
|
54
|
-
| `--datepicker-font-size-base` | `14px` | Base font size for most text |
|
|
55
|
-
| `--datepicker-font-size-sm` | `12px` | Small font size for labels and hints |
|
|
56
|
-
| `--datepicker-font-size-lg` | `16px` | Large font size for headers |
|
|
57
|
-
| `--datepicker-font-size-xl` | `18px` | Extra large font size |
|
|
58
|
-
| `--datepicker-line-height` | `1.5` | Line height for text |
|
|
59
|
-
|
|
60
|
-
## Spacing Tokens
|
|
61
|
-
|
|
62
|
-
| Variable | Default | Description |
|
|
63
|
-
|----------|---------|-------------|
|
|
64
|
-
| `--datepicker-spacing-xs` | `4px` | Extra small spacing |
|
|
65
|
-
| `--datepicker-spacing-sm` | `8px` | Small spacing |
|
|
66
|
-
| `--datepicker-spacing-md` | `12px` | Medium spacing (default) |
|
|
67
|
-
| `--datepicker-spacing-lg` | `16px` | Large spacing |
|
|
68
|
-
| `--datepicker-spacing-xl` | `20px` | Extra large spacing |
|
|
69
|
-
| `--datepicker-spacing-2xl` | `24px` | 2X large spacing |
|
|
70
|
-
|
|
71
|
-
## Border Radius Tokens
|
|
72
|
-
|
|
73
|
-
| Variable | Default | Description |
|
|
74
|
-
|----------|---------|-------------|
|
|
75
|
-
| `--datepicker-radius-sm` | `6px` | Small border radius |
|
|
76
|
-
| `--datepicker-radius-md` | `8px` | Medium border radius (default) |
|
|
77
|
-
| `--datepicker-radius-lg` | `12px` | Large border radius |
|
|
78
|
-
| `--datepicker-radius-xl` | `16px` | Extra large border radius |
|
|
79
|
-
|
|
80
|
-
## Transition Tokens
|
|
81
|
-
|
|
82
|
-
| Variable | Default | Description |
|
|
83
|
-
|----------|---------|-------------|
|
|
84
|
-
| `--datepicker-transition` | `opacity 0.15s cubic-bezier(0.4, 0, 0.2, 1), transform 0.15s cubic-bezier(0.4, 0, 0.2, 1), background-color 0.15s cubic-bezier(0.4, 0, 0.2, 1), border-color 0.15s cubic-bezier(0.4, 0, 0.2, 1), box-shadow 0.15s cubic-bezier(0.4, 0, 0.2, 1)` | Default transition for animations |
|
|
85
|
-
|
|
86
|
-
## Global CSS Variables Override
|
|
87
|
-
|
|
88
|
-
When CSS variables are defined in a global `:root` selector, the ThemeBuilderService will now properly override them with enhanced specificity and `!important` flags to ensure your theme values take precedence.
|
|
89
|
-
|
|
90
|
-
```css
|
|
91
|
-
/* When CSS variables are defined in global :root selector */
|
|
92
|
-
:root {
|
|
93
|
-
--datepicker-primary-color: #ff0000;
|
|
94
|
-
--datepicker-primary-contrast: #ffffff;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
/* ThemeBuilderService will now properly override these global variables */
|
|
98
|
-
```
|
|
99
|
-
|
|
100
|
-
**Note**: If you have CSS variables defined in a global `:root` selector, ThemeBuilderService will now properly override them with enhanced specificity and `!important` flags to ensure your theme values take precedence.
|
|
101
|
-
|
|
102
|
-
## Usage Examples
|
|
103
|
-
|
|
104
|
-
### Basic Theme Override
|
|
105
|
-
|
|
106
|
-
```css
|
|
107
|
-
/* Override at component level */
|
|
108
|
-
ngxsmk-datepicker {
|
|
109
|
-
--datepicker-primary-color: #3b82f6;
|
|
110
|
-
--datepicker-primary-contrast: #ffffff;
|
|
111
|
-
--datepicker-range-background: #dbeafe;
|
|
112
|
-
}
|
|
113
|
-
```
|
|
114
|
-
|
|
115
|
-
### Brand Color Theme
|
|
116
|
-
|
|
117
|
-
```css
|
|
118
|
-
/* Blue brand theme */
|
|
119
|
-
ngxsmk-datepicker {
|
|
120
|
-
--datepicker-primary-color: #2563eb;
|
|
121
|
-
--datepicker-primary-contrast: #ffffff;
|
|
122
|
-
--datepicker-range-background: #dbeafe;
|
|
123
|
-
--datepicker-border-color: #93c5fd;
|
|
124
|
-
--datepicker-hover-background: #eff6ff;
|
|
125
|
-
}
|
|
126
|
-
```
|
|
127
|
-
|
|
128
|
-
### Green Brand Theme
|
|
129
|
-
|
|
130
|
-
```css
|
|
131
|
-
/* Green brand theme */
|
|
132
|
-
ngxsmk-datepicker {
|
|
133
|
-
--datepicker-primary-color: #10b981;
|
|
134
|
-
--datepicker-primary-contrast: #ffffff;
|
|
135
|
-
--datepicker-range-background: #d1fae5;
|
|
136
|
-
--datepicker-border-color: #6ee7b7;
|
|
137
|
-
--datepicker-hover-background: #ecfdf5;
|
|
138
|
-
}
|
|
139
|
-
```
|
|
140
|
-
|
|
141
|
-
### Compact Mode
|
|
142
|
-
|
|
143
|
-
```css
|
|
144
|
-
/* Compact spacing for dense UIs */
|
|
145
|
-
ngxsmk-datepicker {
|
|
146
|
-
--datepicker-spacing-xs: 2px;
|
|
147
|
-
--datepicker-spacing-sm: 4px;
|
|
148
|
-
--datepicker-spacing-md: 6px;
|
|
149
|
-
--datepicker-spacing-lg: 8px;
|
|
150
|
-
--datepicker-spacing-xl: 12px;
|
|
151
|
-
--datepicker-spacing-2xl: 16px;
|
|
152
|
-
--datepicker-font-size-base: 12px;
|
|
153
|
-
--datepicker-font-size-sm: 10px;
|
|
154
|
-
--datepicker-radius-md: 4px;
|
|
155
|
-
--datepicker-radius-sm: 2px;
|
|
156
|
-
}
|
|
157
|
-
```
|
|
158
|
-
|
|
159
|
-
### High Contrast Theme
|
|
160
|
-
|
|
161
|
-
```css
|
|
162
|
-
/* High contrast for accessibility */
|
|
163
|
-
ngxsmk-datepicker {
|
|
164
|
-
--datepicker-primary-color: #000000;
|
|
165
|
-
--datepicker-primary-contrast: #ffffff;
|
|
166
|
-
--datepicker-background: #ffffff;
|
|
167
|
-
--datepicker-text-color: #000000;
|
|
168
|
-
--datepicker-border-color: #000000;
|
|
169
|
-
--datepicker-hover-background: #f0f0f0;
|
|
170
|
-
--datepicker-range-background: #e0e0e0;
|
|
171
|
-
}
|
|
172
|
-
```
|
|
173
|
-
|
|
174
|
-
### Material Design Theme
|
|
175
|
-
|
|
176
|
-
```css
|
|
177
|
-
/* Material Design inspired */
|
|
178
|
-
ngxsmk-datepicker {
|
|
179
|
-
--datepicker-primary-color: #6200ee;
|
|
180
|
-
--datepicker-primary-contrast: #ffffff;
|
|
181
|
-
--datepicker-range-background: #e1bee7;
|
|
182
|
-
--datepicker-border-color: #b39ddb;
|
|
183
|
-
--datepicker-hover-background: #f3e5f5;
|
|
184
|
-
--datepicker-radius-md: 4px;
|
|
185
|
-
--datepicker-shadow-md: 0 2px 4px rgba(0,0,0,0.2);
|
|
186
|
-
}
|
|
187
|
-
```
|
|
188
|
-
|
|
189
|
-
### Tailwind Integration
|
|
190
|
-
|
|
191
|
-
```css
|
|
192
|
-
/* Using Tailwind CSS variables */
|
|
193
|
-
ngxsmk-datepicker {
|
|
194
|
-
--datepicker-primary-color: var(--tw-color-blue-600);
|
|
195
|
-
--datepicker-primary-contrast: var(--tw-color-white);
|
|
196
|
-
--datepicker-background: var(--tw-color-white);
|
|
197
|
-
--datepicker-text-color: var(--tw-color-gray-900);
|
|
198
|
-
--datepicker-border-color: var(--tw-color-gray-300);
|
|
199
|
-
--datepicker-hover-background: var(--tw-color-gray-100);
|
|
200
|
-
}
|
|
201
|
-
```
|
|
202
|
-
|
|
203
|
-
### Design System Integration (TokiForge)
|
|
204
|
-
|
|
205
|
-
```css
|
|
206
|
-
/* TokiForge design tokens */
|
|
207
|
-
ngxsmk-datepicker {
|
|
208
|
-
--datepicker-primary-color: var(--toki-color-primary);
|
|
209
|
-
--datepicker-primary-contrast: var(--toki-color-on-primary);
|
|
210
|
-
--datepicker-background: var(--toki-color-surface);
|
|
211
|
-
--datepicker-text-color: var(--toki-color-on-surface);
|
|
212
|
-
--datepicker-border-color: var(--toki-color-outline);
|
|
213
|
-
--datepicker-hover-background: var(--toki-color-surface-variant);
|
|
214
|
-
--datepicker-spacing-md: var(--toki-spacing-md);
|
|
215
|
-
--datepicker-radius-md: var(--toki-radius-md);
|
|
216
|
-
}
|
|
217
|
-
```
|
|
218
|
-
|
|
219
|
-
## Scoped Theming
|
|
220
|
-
|
|
221
|
-
You can apply different themes to different datepicker instances:
|
|
222
|
-
|
|
223
|
-
```css
|
|
224
|
-
/* Theme for specific datepicker */
|
|
225
|
-
.my-custom-datepicker {
|
|
226
|
-
--datepicker-primary-color: #ec4899;
|
|
227
|
-
--datepicker-range-background: #fce7f3;
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
/* Another theme for different datepicker */
|
|
231
|
-
.my-other-datepicker {
|
|
232
|
-
--datepicker-primary-color: #06b6d4;
|
|
233
|
-
--datepicker-range-background: #cffafe;
|
|
234
|
-
}
|
|
235
|
-
```
|
|
236
|
-
|
|
237
|
-
```html
|
|
238
|
-
<ngxsmk-datepicker class="my-custom-datepicker" mode="single"></ngxsmk-datepicker>
|
|
239
|
-
<ngxsmk-datepicker class="my-other-datepicker" mode="range"></ngxsmk-datepicker>
|
|
240
|
-
```
|
|
241
|
-
|
|
242
|
-
## Dark Theme
|
|
243
|
-
|
|
244
|
-
The component automatically applies dark theme variables when `[theme]="'dark'"` is set:
|
|
245
|
-
|
|
246
|
-
```html
|
|
247
|
-
<ngxsmk-datepicker [theme]="'dark'"></ngxsmk-datepicker>
|
|
248
|
-
```
|
|
249
|
-
|
|
250
|
-
You can also override dark theme variables:
|
|
251
|
-
|
|
252
|
-
```css
|
|
253
|
-
ngxsmk-datepicker.dark-theme {
|
|
254
|
-
--datepicker-primary-color: #a78bfa;
|
|
255
|
-
--datepicker-background: #111827;
|
|
256
|
-
}
|
|
257
|
-
```
|
|
258
|
-
|
|
259
|
-
## Complete Variable List
|
|
260
|
-
|
|
261
|
-
For reference, here's the complete list of all CSS custom properties:
|
|
262
|
-
|
|
263
|
-
```css
|
|
264
|
-
/* Colors */
|
|
265
|
-
--datepicker-primary-color
|
|
266
|
-
--datepicker-primary-contrast
|
|
267
|
-
--datepicker-range-background
|
|
268
|
-
--datepicker-background
|
|
269
|
-
--datepicker-text-color
|
|
270
|
-
--datepicker-subtle-text-color
|
|
271
|
-
--datepicker-border-color
|
|
272
|
-
--datepicker-hover-background
|
|
273
|
-
|
|
274
|
-
/* Shadows */
|
|
275
|
-
--datepicker-shadow-sm
|
|
276
|
-
--datepicker-shadow-md
|
|
277
|
-
--datepicker-shadow-lg
|
|
278
|
-
--datepicker-shadow-xl
|
|
279
|
-
|
|
280
|
-
/* Typography */
|
|
281
|
-
--datepicker-font-size-base
|
|
282
|
-
--datepicker-font-size-sm
|
|
283
|
-
--datepicker-font-size-lg
|
|
284
|
-
--datepicker-font-size-xl
|
|
285
|
-
--datepicker-line-height
|
|
286
|
-
|
|
287
|
-
/* Spacing */
|
|
288
|
-
--datepicker-spacing-xs
|
|
289
|
-
--datepicker-spacing-sm
|
|
290
|
-
--datepicker-spacing-md
|
|
291
|
-
--datepicker-spacing-lg
|
|
292
|
-
--datepicker-spacing-xl
|
|
293
|
-
--datepicker-spacing-2xl
|
|
294
|
-
|
|
295
|
-
/* Border Radius */
|
|
296
|
-
--datepicker-radius-sm
|
|
297
|
-
--datepicker-radius-md
|
|
298
|
-
--datepicker-radius-lg
|
|
299
|
-
--datepicker-radius-xl
|
|
300
|
-
|
|
301
|
-
/* Transitions */
|
|
302
|
-
--datepicker-transition
|
|
303
|
-
```
|
|
304
|
-
|
|
305
|
-
## Best Practices
|
|
306
|
-
|
|
307
|
-
1. **Use CSS Variables**: Always use CSS custom properties for theming, not direct style overrides
|
|
308
|
-
2. **Scope Appropriately**: Apply theme variables at the appropriate scope (component, page, or global)
|
|
309
|
-
3. **Maintain Contrast**: Ensure sufficient contrast ratios for accessibility (WCAG AA minimum)
|
|
310
|
-
4. **Test Dark Mode**: Always test your custom themes in both light and dark modes
|
|
311
|
-
5. **Use Design Tokens**: Integrate with your design system's token system when available
|
|
312
|
-
|
|
313
|
-
## Browser Support
|
|
314
|
-
|
|
315
|
-
CSS custom properties are supported in all modern browsers:
|
|
316
|
-
- Chrome 49+
|
|
317
|
-
- Firefox 31+
|
|
318
|
-
- Safari 9.1+
|
|
319
|
-
- Edge 15+
|
|
320
|
-
|
|
321
|
-
For older browsers, consider using a CSS custom properties polyfill or provide fallback values.
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
1
|
+
# Theme Tokens & CSS Custom Properties
|
|
2
|
+
|
|
3
|
+
**Last updated:** July 2, 2026 - **Current stable:** v2.4.0
|
|
4
|
+
|
|
5
|
+
Complete reference for all CSS custom properties (CSS variables) available in ngxsmk-datepicker.
|
|
6
|
+
|
|
7
|
+
## Overview
|
|
8
|
+
|
|
9
|
+
ngxsmk-datepicker uses CSS custom properties for theming, allowing you to customize the appearance without modifying the component's internal styles. All variables are prefixed with `--datepicker-` and can be overridden at any level in your CSS.
|
|
10
|
+
|
|
11
|
+
## Color Tokens
|
|
12
|
+
|
|
13
|
+
### Primary Colors
|
|
14
|
+
|
|
15
|
+
| Variable | Default (Light) | Default (Dark) | Description |
|
|
16
|
+
|----------|----------------|----------------|-------------|
|
|
17
|
+
| `--datepicker-primary-color` | `#6d28d9` | `#8b5cf6` | Primary brand color for selected dates, buttons, and focus states |
|
|
18
|
+
| `--datepicker-primary-contrast` | `#ffffff` | `#ffffff` | Text color on primary color background |
|
|
19
|
+
|
|
20
|
+
### Background Colors
|
|
21
|
+
|
|
22
|
+
| Variable | Default (Light) | Default (Dark) | Description |
|
|
23
|
+
|----------|----------------|----------------|-------------|
|
|
24
|
+
| `--datepicker-background` | `#ffffff` | `#1f2937` | Main background color for calendar container |
|
|
25
|
+
| `--datepicker-range-background` | `#f5f3ff` | `rgba(139, 92, 246, 0.15)` | Background color for date range selection |
|
|
26
|
+
| `--datepicker-hover-background` | `#f3f4f6` | `#374151` | Background color for hover states |
|
|
27
|
+
|
|
28
|
+
### Text Colors
|
|
29
|
+
|
|
30
|
+
| Variable | Default (Light) | Default (Dark) | Description |
|
|
31
|
+
|----------|----------------|----------------|-------------|
|
|
32
|
+
| `--datepicker-text-color` | `#1f2937` | `#f3f4f6` | Primary text color |
|
|
33
|
+
| `--datepicker-subtle-text-color` | `#6b7280` | `#9ca3af` | Secondary/subtle text color for labels and hints |
|
|
34
|
+
|
|
35
|
+
### Border Colors
|
|
36
|
+
|
|
37
|
+
| Variable | Default (Light) | Default (Dark) | Description |
|
|
38
|
+
|----------|----------------|----------------|-------------|
|
|
39
|
+
| `--datepicker-border-color` | `#e5e7eb` | `#374151` | Border color for inputs, calendar, and dividers |
|
|
40
|
+
|
|
41
|
+
## Shadow Tokens
|
|
42
|
+
|
|
43
|
+
| Variable | Default (Light) | Default (Dark) | Description |
|
|
44
|
+
|----------|----------------|----------------|-------------|
|
|
45
|
+
| `--datepicker-shadow-sm` | `0 1px 2px 0 rgba(0, 0, 0, 0.05)` | `0 1px 2px 0 rgba(0, 0, 0, 0.3)` | Small shadow for subtle elevation |
|
|
46
|
+
| `--datepicker-shadow-md` | `0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)` | `0 4px 6px -1px rgba(0, 0, 0, 0.3), 0 2px 4px -1px rgba(0, 0, 0, 0.2)` | Medium shadow for popover and elevated elements |
|
|
47
|
+
| `--datepicker-shadow-lg` | `0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)` | `0 10px 15px -3px rgba(0, 0, 0, 0.3), 0 4px 6px -2px rgba(0, 0, 0, 0.2)` | Large shadow for modal overlays |
|
|
48
|
+
| `--datepicker-shadow-xl` | `0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04)` | Same as light | Extra large shadow (not used in dark theme) |
|
|
49
|
+
|
|
50
|
+
## Typography Tokens
|
|
51
|
+
|
|
52
|
+
| Variable | Default | Description |
|
|
53
|
+
|----------|---------|-------------|
|
|
54
|
+
| `--datepicker-font-size-base` | `14px` | Base font size for most text |
|
|
55
|
+
| `--datepicker-font-size-sm` | `12px` | Small font size for labels and hints |
|
|
56
|
+
| `--datepicker-font-size-lg` | `16px` | Large font size for headers |
|
|
57
|
+
| `--datepicker-font-size-xl` | `18px` | Extra large font size |
|
|
58
|
+
| `--datepicker-line-height` | `1.5` | Line height for text |
|
|
59
|
+
|
|
60
|
+
## Spacing Tokens
|
|
61
|
+
|
|
62
|
+
| Variable | Default | Description |
|
|
63
|
+
|----------|---------|-------------|
|
|
64
|
+
| `--datepicker-spacing-xs` | `4px` | Extra small spacing |
|
|
65
|
+
| `--datepicker-spacing-sm` | `8px` | Small spacing |
|
|
66
|
+
| `--datepicker-spacing-md` | `12px` | Medium spacing (default) |
|
|
67
|
+
| `--datepicker-spacing-lg` | `16px` | Large spacing |
|
|
68
|
+
| `--datepicker-spacing-xl` | `20px` | Extra large spacing |
|
|
69
|
+
| `--datepicker-spacing-2xl` | `24px` | 2X large spacing |
|
|
70
|
+
|
|
71
|
+
## Border Radius Tokens
|
|
72
|
+
|
|
73
|
+
| Variable | Default | Description |
|
|
74
|
+
|----------|---------|-------------|
|
|
75
|
+
| `--datepicker-radius-sm` | `6px` | Small border radius |
|
|
76
|
+
| `--datepicker-radius-md` | `8px` | Medium border radius (default) |
|
|
77
|
+
| `--datepicker-radius-lg` | `12px` | Large border radius |
|
|
78
|
+
| `--datepicker-radius-xl` | `16px` | Extra large border radius |
|
|
79
|
+
|
|
80
|
+
## Transition Tokens
|
|
81
|
+
|
|
82
|
+
| Variable | Default | Description |
|
|
83
|
+
|----------|---------|-------------|
|
|
84
|
+
| `--datepicker-transition` | `opacity 0.15s cubic-bezier(0.4, 0, 0.2, 1), transform 0.15s cubic-bezier(0.4, 0, 0.2, 1), background-color 0.15s cubic-bezier(0.4, 0, 0.2, 1), border-color 0.15s cubic-bezier(0.4, 0, 0.2, 1), box-shadow 0.15s cubic-bezier(0.4, 0, 0.2, 1)` | Default transition for animations |
|
|
85
|
+
|
|
86
|
+
## Global CSS Variables Override
|
|
87
|
+
|
|
88
|
+
When CSS variables are defined in a global `:root` selector, the ThemeBuilderService will now properly override them with enhanced specificity and `!important` flags to ensure your theme values take precedence.
|
|
89
|
+
|
|
90
|
+
```css
|
|
91
|
+
/* When CSS variables are defined in global :root selector */
|
|
92
|
+
:root {
|
|
93
|
+
--datepicker-primary-color: #ff0000;
|
|
94
|
+
--datepicker-primary-contrast: #ffffff;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/* ThemeBuilderService will now properly override these global variables */
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
**Note**: If you have CSS variables defined in a global `:root` selector, ThemeBuilderService will now properly override them with enhanced specificity and `!important` flags to ensure your theme values take precedence.
|
|
101
|
+
|
|
102
|
+
## Usage Examples
|
|
103
|
+
|
|
104
|
+
### Basic Theme Override
|
|
105
|
+
|
|
106
|
+
```css
|
|
107
|
+
/* Override at component level */
|
|
108
|
+
ngxsmk-datepicker {
|
|
109
|
+
--datepicker-primary-color: #3b82f6;
|
|
110
|
+
--datepicker-primary-contrast: #ffffff;
|
|
111
|
+
--datepicker-range-background: #dbeafe;
|
|
112
|
+
}
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### Brand Color Theme
|
|
116
|
+
|
|
117
|
+
```css
|
|
118
|
+
/* Blue brand theme */
|
|
119
|
+
ngxsmk-datepicker {
|
|
120
|
+
--datepicker-primary-color: #2563eb;
|
|
121
|
+
--datepicker-primary-contrast: #ffffff;
|
|
122
|
+
--datepicker-range-background: #dbeafe;
|
|
123
|
+
--datepicker-border-color: #93c5fd;
|
|
124
|
+
--datepicker-hover-background: #eff6ff;
|
|
125
|
+
}
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### Green Brand Theme
|
|
129
|
+
|
|
130
|
+
```css
|
|
131
|
+
/* Green brand theme */
|
|
132
|
+
ngxsmk-datepicker {
|
|
133
|
+
--datepicker-primary-color: #10b981;
|
|
134
|
+
--datepicker-primary-contrast: #ffffff;
|
|
135
|
+
--datepicker-range-background: #d1fae5;
|
|
136
|
+
--datepicker-border-color: #6ee7b7;
|
|
137
|
+
--datepicker-hover-background: #ecfdf5;
|
|
138
|
+
}
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
### Compact Mode
|
|
142
|
+
|
|
143
|
+
```css
|
|
144
|
+
/* Compact spacing for dense UIs */
|
|
145
|
+
ngxsmk-datepicker {
|
|
146
|
+
--datepicker-spacing-xs: 2px;
|
|
147
|
+
--datepicker-spacing-sm: 4px;
|
|
148
|
+
--datepicker-spacing-md: 6px;
|
|
149
|
+
--datepicker-spacing-lg: 8px;
|
|
150
|
+
--datepicker-spacing-xl: 12px;
|
|
151
|
+
--datepicker-spacing-2xl: 16px;
|
|
152
|
+
--datepicker-font-size-base: 12px;
|
|
153
|
+
--datepicker-font-size-sm: 10px;
|
|
154
|
+
--datepicker-radius-md: 4px;
|
|
155
|
+
--datepicker-radius-sm: 2px;
|
|
156
|
+
}
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
### High Contrast Theme
|
|
160
|
+
|
|
161
|
+
```css
|
|
162
|
+
/* High contrast for accessibility */
|
|
163
|
+
ngxsmk-datepicker {
|
|
164
|
+
--datepicker-primary-color: #000000;
|
|
165
|
+
--datepicker-primary-contrast: #ffffff;
|
|
166
|
+
--datepicker-background: #ffffff;
|
|
167
|
+
--datepicker-text-color: #000000;
|
|
168
|
+
--datepicker-border-color: #000000;
|
|
169
|
+
--datepicker-hover-background: #f0f0f0;
|
|
170
|
+
--datepicker-range-background: #e0e0e0;
|
|
171
|
+
}
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
### Material Design Theme
|
|
175
|
+
|
|
176
|
+
```css
|
|
177
|
+
/* Material Design inspired */
|
|
178
|
+
ngxsmk-datepicker {
|
|
179
|
+
--datepicker-primary-color: #6200ee;
|
|
180
|
+
--datepicker-primary-contrast: #ffffff;
|
|
181
|
+
--datepicker-range-background: #e1bee7;
|
|
182
|
+
--datepicker-border-color: #b39ddb;
|
|
183
|
+
--datepicker-hover-background: #f3e5f5;
|
|
184
|
+
--datepicker-radius-md: 4px;
|
|
185
|
+
--datepicker-shadow-md: 0 2px 4px rgba(0,0,0,0.2);
|
|
186
|
+
}
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
### Tailwind Integration
|
|
190
|
+
|
|
191
|
+
```css
|
|
192
|
+
/* Using Tailwind CSS variables */
|
|
193
|
+
ngxsmk-datepicker {
|
|
194
|
+
--datepicker-primary-color: var(--tw-color-blue-600);
|
|
195
|
+
--datepicker-primary-contrast: var(--tw-color-white);
|
|
196
|
+
--datepicker-background: var(--tw-color-white);
|
|
197
|
+
--datepicker-text-color: var(--tw-color-gray-900);
|
|
198
|
+
--datepicker-border-color: var(--tw-color-gray-300);
|
|
199
|
+
--datepicker-hover-background: var(--tw-color-gray-100);
|
|
200
|
+
}
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
### Design System Integration (TokiForge)
|
|
204
|
+
|
|
205
|
+
```css
|
|
206
|
+
/* TokiForge design tokens */
|
|
207
|
+
ngxsmk-datepicker {
|
|
208
|
+
--datepicker-primary-color: var(--toki-color-primary);
|
|
209
|
+
--datepicker-primary-contrast: var(--toki-color-on-primary);
|
|
210
|
+
--datepicker-background: var(--toki-color-surface);
|
|
211
|
+
--datepicker-text-color: var(--toki-color-on-surface);
|
|
212
|
+
--datepicker-border-color: var(--toki-color-outline);
|
|
213
|
+
--datepicker-hover-background: var(--toki-color-surface-variant);
|
|
214
|
+
--datepicker-spacing-md: var(--toki-spacing-md);
|
|
215
|
+
--datepicker-radius-md: var(--toki-radius-md);
|
|
216
|
+
}
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
## Scoped Theming
|
|
220
|
+
|
|
221
|
+
You can apply different themes to different datepicker instances:
|
|
222
|
+
|
|
223
|
+
```css
|
|
224
|
+
/* Theme for specific datepicker */
|
|
225
|
+
.my-custom-datepicker {
|
|
226
|
+
--datepicker-primary-color: #ec4899;
|
|
227
|
+
--datepicker-range-background: #fce7f3;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/* Another theme for different datepicker */
|
|
231
|
+
.my-other-datepicker {
|
|
232
|
+
--datepicker-primary-color: #06b6d4;
|
|
233
|
+
--datepicker-range-background: #cffafe;
|
|
234
|
+
}
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
```html
|
|
238
|
+
<ngxsmk-datepicker class="my-custom-datepicker" mode="single"></ngxsmk-datepicker>
|
|
239
|
+
<ngxsmk-datepicker class="my-other-datepicker" mode="range"></ngxsmk-datepicker>
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
## Dark Theme
|
|
243
|
+
|
|
244
|
+
The component automatically applies dark theme variables when `[theme]="'dark'"` is set:
|
|
245
|
+
|
|
246
|
+
```html
|
|
247
|
+
<ngxsmk-datepicker [theme]="'dark'"></ngxsmk-datepicker>
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
You can also override dark theme variables:
|
|
251
|
+
|
|
252
|
+
```css
|
|
253
|
+
ngxsmk-datepicker.dark-theme {
|
|
254
|
+
--datepicker-primary-color: #a78bfa;
|
|
255
|
+
--datepicker-background: #111827;
|
|
256
|
+
}
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
## Complete Variable List
|
|
260
|
+
|
|
261
|
+
For reference, here's the complete list of all CSS custom properties:
|
|
262
|
+
|
|
263
|
+
```css
|
|
264
|
+
/* Colors */
|
|
265
|
+
--datepicker-primary-color
|
|
266
|
+
--datepicker-primary-contrast
|
|
267
|
+
--datepicker-range-background
|
|
268
|
+
--datepicker-background
|
|
269
|
+
--datepicker-text-color
|
|
270
|
+
--datepicker-subtle-text-color
|
|
271
|
+
--datepicker-border-color
|
|
272
|
+
--datepicker-hover-background
|
|
273
|
+
|
|
274
|
+
/* Shadows */
|
|
275
|
+
--datepicker-shadow-sm
|
|
276
|
+
--datepicker-shadow-md
|
|
277
|
+
--datepicker-shadow-lg
|
|
278
|
+
--datepicker-shadow-xl
|
|
279
|
+
|
|
280
|
+
/* Typography */
|
|
281
|
+
--datepicker-font-size-base
|
|
282
|
+
--datepicker-font-size-sm
|
|
283
|
+
--datepicker-font-size-lg
|
|
284
|
+
--datepicker-font-size-xl
|
|
285
|
+
--datepicker-line-height
|
|
286
|
+
|
|
287
|
+
/* Spacing */
|
|
288
|
+
--datepicker-spacing-xs
|
|
289
|
+
--datepicker-spacing-sm
|
|
290
|
+
--datepicker-spacing-md
|
|
291
|
+
--datepicker-spacing-lg
|
|
292
|
+
--datepicker-spacing-xl
|
|
293
|
+
--datepicker-spacing-2xl
|
|
294
|
+
|
|
295
|
+
/* Border Radius */
|
|
296
|
+
--datepicker-radius-sm
|
|
297
|
+
--datepicker-radius-md
|
|
298
|
+
--datepicker-radius-lg
|
|
299
|
+
--datepicker-radius-xl
|
|
300
|
+
|
|
301
|
+
/* Transitions */
|
|
302
|
+
--datepicker-transition
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
## Best Practices
|
|
306
|
+
|
|
307
|
+
1. **Use CSS Variables**: Always use CSS custom properties for theming, not direct style overrides
|
|
308
|
+
2. **Scope Appropriately**: Apply theme variables at the appropriate scope (component, page, or global)
|
|
309
|
+
3. **Maintain Contrast**: Ensure sufficient contrast ratios for accessibility (WCAG AA minimum)
|
|
310
|
+
4. **Test Dark Mode**: Always test your custom themes in both light and dark modes
|
|
311
|
+
5. **Use Design Tokens**: Integrate with your design system's token system when available
|
|
312
|
+
|
|
313
|
+
## Browser Support
|
|
314
|
+
|
|
315
|
+
CSS custom properties are supported in all modern browsers:
|
|
316
|
+
- Chrome 49+
|
|
317
|
+
- Firefox 31+
|
|
318
|
+
- Safari 9.1+
|
|
319
|
+
- Edge 15+
|
|
320
|
+
|
|
321
|
+
For older browsers, consider using a CSS custom properties polyfill or provide fallback values.
|
|
322
|
+
|
|
323
|
+
|
|
324
|
+
|