@zengrid/core 1.2.2 → 1.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.
Files changed (105) hide show
  1. package/dist/index.cjs.js +1879 -1095
  2. package/dist/index.esm.js +1936 -1161
  3. package/dist/package.json +2 -2
  4. package/dist/src/datetime-core/formatting/date-formatter.d.ts +2 -0
  5. package/dist/src/datetime-core/formatting/date-formatter.d.ts.map +1 -1
  6. package/dist/src/datetime-core/theming/datetime.css +463 -407
  7. package/dist/src/editing/checkbox/checkbox-dom.d.ts.map +1 -1
  8. package/dist/src/editing/datetime/date-editor/date-editor.d.ts.map +1 -1
  9. package/dist/src/editing/datetime/date-range-editor/date-range-calendar.d.ts.map +1 -1
  10. package/dist/src/editing/editor-manager/editor-manager.d.ts +23 -1
  11. package/dist/src/editing/editor-manager/editor-manager.d.ts.map +1 -1
  12. package/dist/src/editing/number/number-editor.d.ts.map +1 -1
  13. package/dist/src/editing/select/select-editor.d.ts.map +1 -1
  14. package/dist/src/features/column-drag/drag-mouse-handler.d.ts +1 -0
  15. package/dist/src/features/column-drag/drag-mouse-handler.d.ts.map +1 -1
  16. package/dist/src/features/copy-paste/clipboard-manager.d.ts +24 -2
  17. package/dist/src/features/copy-paste/clipboard-manager.d.ts.map +1 -1
  18. package/dist/src/features/loading/loading-indicator.d.ts.map +1 -1
  19. package/dist/src/features/loading/loading.styles.css +346 -342
  20. package/dist/src/features/selection/selection-manager.d.ts +14 -0
  21. package/dist/src/features/selection/selection-manager.d.ts.map +1 -1
  22. package/dist/src/grid/grid-core.d.ts.map +1 -1
  23. package/dist/src/grid/grid-setup.d.ts.map +1 -1
  24. package/dist/src/index.d.ts +9 -2
  25. package/dist/src/index.d.ts.map +1 -1
  26. package/dist/src/plugins/clipboard/clipboard-plugin.d.ts +21 -0
  27. package/dist/src/plugins/clipboard/clipboard-plugin.d.ts.map +1 -0
  28. package/dist/src/plugins/clipboard/index.d.ts +3 -0
  29. package/dist/src/plugins/clipboard/index.d.ts.map +1 -0
  30. package/dist/src/plugins/column/column-plugin.d.ts.map +1 -1
  31. package/dist/src/plugins/dom/dom-plugin.d.ts.map +1 -1
  32. package/dist/src/plugins/editing/editing-plugin.d.ts.map +1 -1
  33. package/dist/src/plugins/filter-ui/field-state-utils.d.ts +6 -0
  34. package/dist/src/plugins/filter-ui/field-state-utils.d.ts.map +1 -0
  35. package/dist/src/plugins/filter-ui/filter-chip-bar.d.ts +16 -0
  36. package/dist/src/plugins/filter-ui/filter-chip-bar.d.ts.map +1 -0
  37. package/dist/src/plugins/filter-ui/filter-chip-descriptors.d.ts +4 -0
  38. package/dist/src/plugins/filter-ui/filter-chip-descriptors.d.ts.map +1 -0
  39. package/dist/src/plugins/filter-ui/filter-popup-dom.d.ts +32 -0
  40. package/dist/src/plugins/filter-ui/filter-popup-dom.d.ts.map +1 -0
  41. package/dist/src/plugins/filter-ui/filter-popup.d.ts +3 -0
  42. package/dist/src/plugins/filter-ui/filter-popup.d.ts.map +1 -0
  43. package/dist/src/plugins/filter-ui/filter-ui-operators.d.ts +9 -0
  44. package/dist/src/plugins/filter-ui/filter-ui-operators.d.ts.map +1 -0
  45. package/dist/src/plugins/filter-ui/filter-ui-types.d.ts +56 -0
  46. package/dist/src/plugins/filter-ui/filter-ui-types.d.ts.map +1 -0
  47. package/dist/src/plugins/filter-ui/grid-filter-ui.d.ts +20 -0
  48. package/dist/src/plugins/filter-ui/grid-filter-ui.d.ts.map +1 -0
  49. package/dist/src/plugins/filter-ui/index.d.ts +1 -0
  50. package/dist/src/plugins/filter-ui/index.d.ts.map +1 -1
  51. package/dist/src/plugins/header/header-dom-operations.d.ts +6 -0
  52. package/dist/src/plugins/header/header-dom-operations.d.ts.map +1 -1
  53. package/dist/src/plugins/header/header-plugin.d.ts.map +1 -1
  54. package/dist/src/plugins/header/header-registry-setup.d.ts.map +1 -1
  55. package/dist/src/plugins/header/header-rendering.d.ts.map +1 -1
  56. package/dist/src/plugins/header/header-types.d.ts +8 -1
  57. package/dist/src/plugins/header/header-types.d.ts.map +1 -1
  58. package/dist/src/plugins/index.d.ts +4 -0
  59. package/dist/src/plugins/index.d.ts.map +1 -1
  60. package/dist/src/plugins/keyboard/index.d.ts +3 -0
  61. package/dist/src/plugins/keyboard/index.d.ts.map +1 -0
  62. package/dist/src/plugins/keyboard/keyboard-nav-utils.d.ts +13 -0
  63. package/dist/src/plugins/keyboard/keyboard-nav-utils.d.ts.map +1 -0
  64. package/dist/src/plugins/keyboard/keyboard-plugin.d.ts +17 -0
  65. package/dist/src/plugins/keyboard/keyboard-plugin.d.ts.map +1 -0
  66. package/dist/src/plugins/lifecycle/lifecycle-plugin.d.ts +1 -0
  67. package/dist/src/plugins/lifecycle/lifecycle-plugin.d.ts.map +1 -1
  68. package/dist/src/plugins/pagination/pagination-plugin.d.ts.map +1 -1
  69. package/dist/src/plugins/rendering/rendering-plugin.d.ts.map +1 -1
  70. package/dist/src/plugins/selection/selection-plugin.d.ts.map +1 -1
  71. package/dist/src/reactive/store.d.ts +1 -0
  72. package/dist/src/reactive/store.d.ts.map +1 -1
  73. package/dist/src/reactive/types.d.ts +1 -0
  74. package/dist/src/reactive/types.d.ts.map +1 -1
  75. package/dist/src/rendering/cache/renderer-cache.interface.d.ts +6 -0
  76. package/dist/src/rendering/cache/renderer-cache.interface.d.ts.map +1 -1
  77. package/dist/src/rendering/cell-positioner/cell-positioner.d.ts +21 -0
  78. package/dist/src/rendering/cell-positioner/cell-positioner.d.ts.map +1 -1
  79. package/dist/src/rendering/headers/header-renderer.interface.d.ts +6 -0
  80. package/dist/src/rendering/headers/header-renderer.interface.d.ts.map +1 -1
  81. package/dist/src/rendering/headers/renderers/sortable-header-renderer.d.ts +4 -0
  82. package/dist/src/rendering/headers/renderers/sortable-header-renderer.d.ts.map +1 -1
  83. package/dist/src/rendering/renderers/dropdown/dropdown-dom.d.ts.map +1 -1
  84. package/dist/src/rendering/renderers/dropdown/dropdown-renderer.d.ts +2 -0
  85. package/dist/src/rendering/renderers/dropdown/dropdown-renderer.d.ts.map +1 -1
  86. package/dist/src/rendering/renderers/dropdown/dropdown-state.d.ts.map +1 -1
  87. package/dist/src/rendering/renderers/renderer.interface.d.ts +7 -0
  88. package/dist/src/rendering/renderers/renderer.interface.d.ts.map +1 -1
  89. package/dist/src/styles/a11y.css +20 -0
  90. package/dist/src/styles/calendar.css +291 -0
  91. package/dist/src/styles/cell-overflow.css +129 -0
  92. package/dist/src/styles/cell-renderers.css +90 -0
  93. package/dist/src/styles/date-picker.css +125 -0
  94. package/dist/src/styles/dropdown.css +156 -0
  95. package/dist/src/styles/filter.css +166 -0
  96. package/dist/src/styles/grid.css +91 -287
  97. package/dist/src/styles/header.css +60 -0
  98. package/dist/src/styles/overlays.css +44 -0
  99. package/dist/src/styles/tokens.css +86 -0
  100. package/dist/src/styles.css +24 -1112
  101. package/dist/src/types/grid.d.ts +32 -2
  102. package/dist/src/types/grid.d.ts.map +1 -1
  103. package/package.json +3 -3
  104. package/dist/src/grid/filter-ui.d.ts +0 -71
  105. package/dist/src/grid/filter-ui.d.ts.map +0 -1
@@ -1,407 +1,463 @@
1
- /**
2
- * ZenGrid DateTime Suite - Core Styles
3
- *
4
- * Uses CSS variables for theming. Variables are set by ThemeManager.
5
- * Can be overridden by users for customization.
6
- */
7
-
8
- /* ============================================
9
- CSS Variables (defaults, overridden by JS)
10
- ============================================ */
11
-
12
- :root {
13
- /* Primary colors */
14
- --zg-datetime-primary-color: #2563eb;
15
- --zg-datetime-primary-hover-color: #1d4ed8;
16
-
17
- /* Text colors */
18
- --zg-datetime-text-color: #1f2937;
19
- --zg-datetime-text-secondary-color: #6b7280;
20
-
21
- /* Background colors */
22
- --zg-datetime-background-color: #ffffff;
23
- --zg-datetime-popup-background-color: #ffffff;
24
-
25
- /* Border */
26
- --zg-datetime-border-color: #e5e7eb;
27
- --zg-datetime-border-radius: 6px;
28
-
29
- /* Focus */
30
- --zg-datetime-focus-ring-color: rgba(37, 99, 235, 0.5);
31
-
32
- /* States */
33
- --zg-datetime-error-color: #dc2626;
34
- --zg-datetime-today-color: #dbeafe;
35
- --zg-datetime-selected-color: #2563eb;
36
- --zg-datetime-range-color: #eff6ff;
37
-
38
- /* Typography */
39
- --zg-datetime-font-family: inherit;
40
- --zg-datetime-font-size: 14px;
41
-
42
- /* Spacing */
43
- --zg-datetime-popup-padding: 12px;
44
- --zg-datetime-trigger-padding: 8px 12px;
45
-
46
- /* Shadows */
47
- --zg-datetime-popup-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);
48
-
49
- /* Transitions */
50
- --zg-datetime-transition: 150ms ease;
51
- }
52
-
53
- /* Dark theme */
54
- [data-zg-datetime-theme="dark"] {
55
- --zg-datetime-primary-color: #3b82f6;
56
- --zg-datetime-primary-hover-color: #60a5fa;
57
- --zg-datetime-text-color: #f9fafb;
58
- --zg-datetime-text-secondary-color: #9ca3af;
59
- --zg-datetime-background-color: #1f2937;
60
- --zg-datetime-popup-background-color: #1f2937;
61
- --zg-datetime-border-color: #374151;
62
- --zg-datetime-focus-ring-color: rgba(59, 130, 246, 0.5);
63
- --zg-datetime-error-color: #f87171;
64
- --zg-datetime-today-color: #1e3a5f;
65
- --zg-datetime-selected-color: #3b82f6;
66
- --zg-datetime-range-color: #1e293b;
67
- --zg-datetime-popup-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.3), 0 4px 6px -2px rgba(0, 0, 0, 0.2);
68
- }
69
-
70
- /* ============================================
71
- Base Container
72
- ============================================ */
73
-
74
- .zg-datetime-container {
75
- position: relative;
76
- display: inline-block;
77
- font-family: var(--zg-datetime-font-family);
78
- font-size: var(--zg-datetime-font-size);
79
- color: var(--zg-datetime-text-color);
80
- }
81
-
82
- /* ============================================
83
- Trigger Button
84
- ============================================ */
85
-
86
- .zg-datetime-trigger {
87
- display: inline-flex;
88
- align-items: center;
89
- gap: 8px;
90
- padding: var(--zg-datetime-trigger-padding);
91
- background-color: var(--zg-datetime-background-color);
92
- border: 1px solid var(--zg-datetime-border-color);
93
- border-radius: var(--zg-datetime-border-radius);
94
- color: var(--zg-datetime-text-color);
95
- font-family: inherit;
96
- font-size: inherit;
97
- cursor: pointer;
98
- transition: border-color var(--zg-datetime-transition), box-shadow var(--zg-datetime-transition);
99
- min-width: 0;
100
- text-align: left;
101
- }
102
-
103
- .zg-datetime-trigger:hover:not(:disabled) {
104
- border-color: var(--zg-datetime-primary-color);
105
- }
106
-
107
- .zg-datetime-trigger:focus {
108
- outline: none;
109
- border-color: var(--zg-datetime-primary-color);
110
- box-shadow: 0 0 0 3px var(--zg-datetime-focus-ring-color);
111
- }
112
-
113
- .zg-datetime-trigger:disabled {
114
- opacity: 0.5;
115
- cursor: not-allowed;
116
- }
117
-
118
- .zg-datetime-trigger-text {
119
- flex: 1;
120
- overflow: hidden;
121
- text-overflow: ellipsis;
122
- white-space: nowrap;
123
- }
124
-
125
- .zg-datetime-trigger-text.placeholder {
126
- color: var(--zg-datetime-text-secondary-color);
127
- }
128
-
129
- .zg-datetime-trigger-icon {
130
- flex-shrink: 0;
131
- width: 16px;
132
- height: 16px;
133
- color: var(--zg-datetime-text-secondary-color);
134
- }
135
-
136
- .zg-datetime-trigger-icon svg {
137
- display: block;
138
- width: 100%;
139
- height: 100%;
140
- }
141
-
142
- /* ============================================
143
- Popup Container
144
- ============================================ */
145
-
146
- .zg-datetime-popup {
147
- position: fixed;
148
- top: 0;
149
- left: 0;
150
- z-index: 9999;
151
- display: none;
152
- background-color: var(--zg-datetime-popup-background-color);
153
- border: 1px solid var(--zg-datetime-border-color);
154
- border-radius: var(--zg-datetime-border-radius);
155
- box-shadow: var(--zg-datetime-popup-shadow);
156
- padding: var(--zg-datetime-popup-padding);
157
- will-change: transform;
158
- }
159
-
160
- .zg-datetime-popup[data-zg-datetime-popup="true"] {
161
- display: block;
162
- }
163
-
164
- /* Placement indicators for styling */
165
- .zg-datetime-popup[data-zg-placement="top"] {
166
- /* Arrow pointing down if needed */
167
- }
168
-
169
- .zg-datetime-popup[data-zg-placement="bottom"] {
170
- /* Arrow pointing up if needed */
171
- }
172
-
173
- /* ============================================
174
- Calendar Wrapper (for vanilla-calendar-pro)
175
- ============================================ */
176
-
177
- .zg-datetime-calendar-wrapper {
178
- /* Container for vanilla-calendar-pro instance */
179
- }
180
-
181
- /* Override vanilla-calendar-pro styles to match theme */
182
- .zg-datetime-calendar-wrapper .vanilla-calendar {
183
- --vc-bg: var(--zg-datetime-popup-background-color);
184
- --vc-text-color: var(--zg-datetime-text-color);
185
- --vc-border-color: var(--zg-datetime-border-color);
186
- --vc-border-radius: var(--zg-datetime-border-radius);
187
- --vc-text-disabled-color: var(--zg-datetime-text-secondary-color);
188
- --vc-text-today-color: var(--zg-datetime-primary-color);
189
- --vc-bg-today: var(--zg-datetime-today-color);
190
- --vc-text-selected-color: #ffffff;
191
- --vc-bg-selected: var(--zg-datetime-selected-color);
192
- --vc-bg-hover: var(--zg-datetime-range-color);
193
- font-family: var(--zg-datetime-font-family);
194
- }
195
-
196
- /* ============================================
197
- Input Field (for editors)
198
- ============================================ */
199
-
200
- .zg-datetime-input {
201
- width: 100%;
202
- padding: 8px 12px;
203
- background-color: var(--zg-datetime-background-color);
204
- border: 1px solid var(--zg-datetime-border-color);
205
- border-radius: var(--zg-datetime-border-radius);
206
- color: var(--zg-datetime-text-color);
207
- font-family: inherit;
208
- font-size: inherit;
209
- transition: border-color var(--zg-datetime-transition), box-shadow var(--zg-datetime-transition);
210
- }
211
-
212
- .zg-datetime-input:focus {
213
- outline: none;
214
- border-color: var(--zg-datetime-primary-color);
215
- box-shadow: 0 0 0 3px var(--zg-datetime-focus-ring-color);
216
- }
217
-
218
- .zg-datetime-input::placeholder {
219
- color: var(--zg-datetime-text-secondary-color);
220
- }
221
-
222
- .zg-datetime-input:disabled {
223
- opacity: 0.5;
224
- cursor: not-allowed;
225
- }
226
-
227
- .zg-datetime-input.error {
228
- border-color: var(--zg-datetime-error-color);
229
- }
230
-
231
- .zg-datetime-input.error:focus {
232
- box-shadow: 0 0 0 3px rgba(220, 38, 38, 0.3);
233
- }
234
-
235
- /* ============================================
236
- Date Range Specific
237
- ============================================ */
238
-
239
- .zg-datetime-range-container {
240
- display: flex;
241
- align-items: center;
242
- gap: 8px;
243
- }
244
-
245
- .zg-datetime-range-separator {
246
- color: var(--zg-datetime-text-secondary-color);
247
- }
248
-
249
- .zg-datetime-range-input {
250
- flex: 1;
251
- min-width: 0;
252
- }
253
-
254
- /* Date Range Editor Header */
255
- .zg-date-range-header {
256
- display: flex;
257
- justify-content: space-between;
258
- align-items: center;
259
- padding: 8px 0;
260
- margin-bottom: 12px;
261
- border-bottom: 1px solid var(--zg-datetime-border-color);
262
- }
263
-
264
- .zg-date-range-display {
265
- font-weight: 500;
266
- color: var(--zg-datetime-text-color);
267
- }
268
-
269
- .zg-date-range-buttons {
270
- display: flex;
271
- gap: 8px;
272
- }
273
-
274
- .zg-date-range-btn {
275
- padding: 6px 12px;
276
- border: 1px solid var(--zg-datetime-border-color);
277
- border-radius: var(--zg-datetime-border-radius);
278
- background-color: var(--zg-datetime-background-color);
279
- color: var(--zg-datetime-text-color);
280
- font-family: inherit;
281
- font-size: 13px;
282
- cursor: pointer;
283
- transition: background-color var(--zg-datetime-transition), border-color var(--zg-datetime-transition);
284
- }
285
-
286
- .zg-date-range-btn:hover {
287
- border-color: var(--zg-datetime-primary-color);
288
- }
289
-
290
- .zg-date-range-btn-apply {
291
- background-color: var(--zg-datetime-primary-color);
292
- border-color: var(--zg-datetime-primary-color);
293
- color: #ffffff;
294
- }
295
-
296
- .zg-date-range-btn-apply:hover {
297
- background-color: var(--zg-datetime-primary-hover-color);
298
- border-color: var(--zg-datetime-primary-hover-color);
299
- }
300
-
301
- .zg-date-range-label {
302
- font-size: 12px;
303
- font-weight: 500;
304
- color: var(--zg-datetime-text-secondary-color);
305
- margin-bottom: 8px;
306
- text-transform: uppercase;
307
- letter-spacing: 0.5px;
308
- }
309
-
310
- .zg-date-range-calendars {
311
- display: flex;
312
- gap: 16px;
313
- }
314
-
315
- /* ============================================
316
- Time Picker Specific
317
- ============================================ */
318
-
319
- .zg-datetime-time-container {
320
- display: flex;
321
- align-items: center;
322
- gap: 4px;
323
- }
324
-
325
- .zg-datetime-time-input {
326
- width: 48px;
327
- text-align: center;
328
- padding: 8px 4px;
329
- }
330
-
331
- .zg-datetime-time-separator {
332
- color: var(--zg-datetime-text-secondary-color);
333
- font-weight: 500;
334
- }
335
-
336
- .zg-datetime-time-ampm {
337
- padding: 8px 12px;
338
- background-color: var(--zg-datetime-background-color);
339
- border: 1px solid var(--zg-datetime-border-color);
340
- border-radius: var(--zg-datetime-border-radius);
341
- color: var(--zg-datetime-text-color);
342
- font-family: inherit;
343
- font-size: inherit;
344
- cursor: pointer;
345
- }
346
-
347
- /* ============================================
348
- Display Renderers (read-only cells)
349
- ============================================ */
350
-
351
- .zg-datetime-display {
352
- padding: 4px 8px;
353
- color: var(--zg-datetime-text-color);
354
- font-family: var(--zg-datetime-font-family);
355
- font-size: var(--zg-datetime-font-size);
356
- }
357
-
358
- .zg-datetime-display.empty {
359
- color: var(--zg-datetime-text-secondary-color);
360
- }
361
-
362
- /* ============================================
363
- Animations
364
- ============================================ */
365
-
366
- @keyframes zg-datetime-fade-in {
367
- from {
368
- opacity: 0;
369
- }
370
- to {
371
- opacity: 1;
372
- }
373
- }
374
-
375
- .zg-datetime-popup[data-zg-datetime-popup="true"] {
376
- animation: zg-datetime-fade-in var(--zg-datetime-transition);
377
- }
378
-
379
- /* ============================================
380
- Accessibility
381
- ============================================ */
382
-
383
- /* High contrast mode support */
384
- @media (prefers-contrast: high) {
385
- .zg-datetime-trigger,
386
- .zg-datetime-input {
387
- border-width: 2px;
388
- }
389
-
390
- .zg-datetime-trigger:focus,
391
- .zg-datetime-input:focus {
392
- outline: 2px solid currentColor;
393
- outline-offset: 2px;
394
- }
395
- }
396
-
397
- /* Reduced motion support */
398
- @media (prefers-reduced-motion: reduce) {
399
- .zg-datetime-popup[data-zg-datetime-popup="true"] {
400
- animation: none;
401
- }
402
-
403
- .zg-datetime-trigger,
404
- .zg-datetime-input {
405
- transition: none;
406
- }
407
- }
1
+ /**
2
+ * ZenGrid DateTime Suite - Core Styles
3
+ *
4
+ * Uses CSS variables for theming. Variables are set by ThemeManager.
5
+ * Can be overridden by users for customization.
6
+ */
7
+
8
+ /* ============================================
9
+ CSS Variables (defaults, overridden by JS)
10
+ ============================================ */
11
+
12
+ :root {
13
+ /* Primary colors */
14
+ --zg-datetime-primary-color: #2563eb;
15
+ --zg-datetime-primary-hover-color: #1d4ed8;
16
+
17
+ /* Text colors */
18
+ --zg-datetime-text-color: #1f2937;
19
+ --zg-datetime-text-secondary-color: #6b7280;
20
+
21
+ /* Background colors */
22
+ --zg-datetime-background-color: #ffffff;
23
+ --zg-datetime-popup-background-color: #ffffff;
24
+
25
+ /* Border */
26
+ --zg-datetime-border-color: #e5e7eb;
27
+ --zg-datetime-border-radius: 6px;
28
+
29
+ /* Focus */
30
+ --zg-datetime-focus-ring-color: rgba(37, 99, 235, 0.5);
31
+
32
+ /* States */
33
+ --zg-datetime-error-color: #dc2626;
34
+ --zg-datetime-today-color: #dbeafe;
35
+ --zg-datetime-selected-color: #2563eb;
36
+ --zg-datetime-range-color: #eff6ff;
37
+
38
+ /* Typography */
39
+ --zg-datetime-font-family: inherit;
40
+ --zg-datetime-font-size: 14px;
41
+
42
+ /* Spacing */
43
+ --zg-datetime-popup-padding: 12px;
44
+ --zg-datetime-trigger-padding: 8px 12px;
45
+
46
+ /* Shadows */
47
+ --zg-datetime-popup-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);
48
+
49
+ /* Transitions */
50
+ --zg-datetime-transition: 150ms ease;
51
+ }
52
+
53
+ /* Dark theme — also inherit the grid's own dark theme (set on the grid
54
+ container as data-theme="dark" / .zg-theme-dark by the theme manager) so
55
+ read-only date cells recolor with the grid, not just the datetime widgets. */
56
+ [data-zg-datetime-theme="dark"],
57
+ [data-theme="dark"],
58
+ .zg-theme-dark {
59
+ --zg-datetime-primary-color: #3b82f6;
60
+ --zg-datetime-primary-hover-color: #60a5fa;
61
+ --zg-datetime-text-color: #f9fafb;
62
+ --zg-datetime-text-secondary-color: #9ca3af;
63
+ --zg-datetime-background-color: #1f2937;
64
+ --zg-datetime-popup-background-color: #1f2937;
65
+ --zg-datetime-border-color: #374151;
66
+ --zg-datetime-focus-ring-color: rgba(59, 130, 246, 0.5);
67
+ --zg-datetime-error-color: #f87171;
68
+ --zg-datetime-today-color: #1e3a5f;
69
+ --zg-datetime-selected-color: #3b82f6;
70
+ --zg-datetime-range-color: #1e293b;
71
+ --zg-datetime-popup-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.3), 0 4px 6px -2px rgba(0, 0, 0, 0.2);
72
+ }
73
+
74
+ /* ============================================
75
+ Base Container
76
+ ============================================ */
77
+
78
+ .zg-datetime-container {
79
+ position: relative;
80
+ display: inline-block;
81
+ font-family: var(--zg-datetime-font-family);
82
+ font-size: var(--zg-datetime-font-size);
83
+ color: var(--zg-datetime-text-color);
84
+ }
85
+
86
+ /* ============================================
87
+ Trigger Button
88
+ ============================================ */
89
+
90
+ .zg-datetime-trigger {
91
+ display: inline-flex;
92
+ align-items: center;
93
+ gap: 8px;
94
+ padding: var(--zg-datetime-trigger-padding);
95
+ background-color: var(--zg-datetime-background-color);
96
+ border: 1px solid var(--zg-datetime-border-color);
97
+ border-radius: var(--zg-datetime-border-radius);
98
+ color: var(--zg-datetime-text-color);
99
+ font-family: inherit;
100
+ font-size: inherit;
101
+ cursor: pointer;
102
+ transition: border-color var(--zg-datetime-transition), box-shadow var(--zg-datetime-transition);
103
+ min-width: 0;
104
+ text-align: left;
105
+ }
106
+
107
+ .zg-datetime-trigger:hover:not(:disabled) {
108
+ border-color: var(--zg-datetime-primary-color);
109
+ }
110
+
111
+ .zg-datetime-trigger:focus {
112
+ outline: none;
113
+ border-color: var(--zg-datetime-primary-color);
114
+ box-shadow: 0 0 0 3px var(--zg-datetime-focus-ring-color);
115
+ }
116
+
117
+ .zg-datetime-trigger:disabled {
118
+ opacity: 0.5;
119
+ cursor: not-allowed;
120
+ }
121
+
122
+ .zg-datetime-trigger-text {
123
+ flex: 1;
124
+ overflow: hidden;
125
+ text-overflow: ellipsis;
126
+ white-space: nowrap;
127
+ }
128
+
129
+ .zg-datetime-trigger-text.placeholder {
130
+ color: var(--zg-datetime-text-secondary-color);
131
+ }
132
+
133
+ .zg-datetime-trigger-icon {
134
+ flex-shrink: 0;
135
+ width: 16px;
136
+ height: 16px;
137
+ color: var(--zg-datetime-text-secondary-color);
138
+ }
139
+
140
+ .zg-datetime-trigger-icon svg {
141
+ display: block;
142
+ width: 100%;
143
+ height: 100%;
144
+ }
145
+
146
+ /* ============================================
147
+ Popup Container
148
+ ============================================ */
149
+
150
+ .zg-datetime-popup {
151
+ position: fixed;
152
+ top: 0;
153
+ left: 0;
154
+ z-index: 9999;
155
+ display: none;
156
+ background-color: var(--zg-datetime-popup-background-color);
157
+ border: 1px solid var(--zg-datetime-border-color);
158
+ border-radius: var(--zg-datetime-border-radius);
159
+ box-shadow: var(--zg-datetime-popup-shadow);
160
+ padding: var(--zg-datetime-popup-padding);
161
+ will-change: transform;
162
+ }
163
+
164
+ .zg-datetime-popup[data-zg-datetime-popup="true"] {
165
+ display: block;
166
+ }
167
+
168
+ /* Placement indicators for styling */
169
+ .zg-datetime-popup[data-zg-placement="top"] {
170
+ /* Arrow pointing down if needed */
171
+ }
172
+
173
+ .zg-datetime-popup[data-zg-placement="bottom"] {
174
+ /* Arrow pointing up if needed */
175
+ }
176
+
177
+ /* ============================================
178
+ Calendar Wrapper (for vanilla-calendar-pro)
179
+ ============================================ */
180
+
181
+ .zg-datetime-calendar-wrapper {
182
+ /* Container for vanilla-calendar-pro instance */
183
+ }
184
+
185
+ /* Override vanilla-calendar-pro styles to match theme */
186
+ .zg-datetime-calendar-wrapper .vanilla-calendar {
187
+ --vc-bg: var(--zg-datetime-popup-background-color);
188
+ --vc-text-color: var(--zg-datetime-text-color);
189
+ --vc-border-color: var(--zg-datetime-border-color);
190
+ --vc-border-radius: var(--zg-datetime-border-radius);
191
+ --vc-text-disabled-color: var(--zg-datetime-text-secondary-color);
192
+ --vc-text-today-color: var(--zg-datetime-primary-color);
193
+ --vc-bg-today: var(--zg-datetime-today-color);
194
+ --vc-text-selected-color: #ffffff;
195
+ --vc-bg-selected: var(--zg-datetime-selected-color);
196
+ --vc-bg-hover: var(--zg-datetime-range-color);
197
+ font-family: var(--zg-datetime-font-family);
198
+ }
199
+
200
+ /* ============================================
201
+ Input Field (for editors)
202
+ ============================================ */
203
+
204
+ .zg-datetime-input {
205
+ width: 100%;
206
+ padding: 8px 12px;
207
+ background-color: var(--zg-datetime-background-color);
208
+ border: 1px solid var(--zg-datetime-border-color);
209
+ border-radius: var(--zg-datetime-border-radius);
210
+ color: var(--zg-datetime-text-color);
211
+ font-family: inherit;
212
+ font-size: inherit;
213
+ transition: border-color var(--zg-datetime-transition), box-shadow var(--zg-datetime-transition);
214
+ }
215
+
216
+ .zg-datetime-input:focus {
217
+ outline: none;
218
+ border-color: var(--zg-datetime-primary-color);
219
+ box-shadow: 0 0 0 3px var(--zg-datetime-focus-ring-color);
220
+ }
221
+
222
+ .zg-datetime-input::placeholder {
223
+ color: var(--zg-datetime-text-secondary-color);
224
+ }
225
+
226
+ .zg-datetime-input:disabled {
227
+ opacity: 0.5;
228
+ cursor: not-allowed;
229
+ }
230
+
231
+ .zg-datetime-input.error {
232
+ border-color: var(--zg-datetime-error-color);
233
+ }
234
+
235
+ .zg-datetime-input.error:focus {
236
+ box-shadow: 0 0 0 3px rgba(220, 38, 38, 0.3);
237
+ }
238
+
239
+ /* ============================================
240
+ Cell-editor context: make the date/time editor input fill the cell and
241
+ use the grid's green editing highlight so it matches the text/number/select
242
+ editors instead of the datetime suite's default blue rounded box.
243
+ ============================================ */
244
+
245
+ .zg-editor-container .zg-datetime-input {
246
+ height: 100%;
247
+ border: 2px solid var(--zg-border-editing, #4caf50);
248
+ border-radius: 0;
249
+ box-sizing: border-box;
250
+ }
251
+
252
+ .zg-editor-container .zg-datetime-input:focus {
253
+ border-color: var(--zg-border-editing, #4caf50);
254
+ box-shadow: none;
255
+ }
256
+
257
+ /* Theme the vanilla-calendar-pro chrome to the grid's green/white editor look
258
+ (it mounts as `.vc` directly inside the popup and ships its own palette). */
259
+
260
+ /* Selected day -> editor green */
261
+ .zg-datetime-popup .vc-date[data-vc-date-selected] .vc-date__btn {
262
+ background-color: var(--zg-border-editing, #4caf50);
263
+ color: #fff;
264
+ }
265
+
266
+ /* Today -> editor green accent */
267
+ .zg-datetime-popup .vc-date[data-vc-date-today] .vc-date__btn {
268
+ color: var(--zg-border-editing, #4caf50);
269
+ font-weight: 600;
270
+ }
271
+
272
+ /* Drop the library's rose weekend accent so it matches the neutral grid theme */
273
+ .zg-datetime-popup .vc-date[data-vc-date-weekend] .vc-date__btn,
274
+ .zg-datetime-popup .vc-week__day[data-vc-week-day-off] {
275
+ color: inherit;
276
+ }
277
+
278
+ /* Hover on a selectable day -> soft green tint */
279
+ .zg-datetime-popup .vc-date:not([data-vc-date-selected]):not([data-vc-date-disabled]) .vc-date__btn:hover {
280
+ background-color: color-mix(in srgb, var(--zg-border-editing, #4caf50) 15%, transparent);
281
+ color: var(--zg-border-editing, #4caf50);
282
+ }
283
+
284
+ /* Header controls (month/year, prev/next arrows) -> green on hover/focus */
285
+ .zg-datetime-popup .vc-arrow:hover,
286
+ .zg-datetime-popup .vc-month:hover,
287
+ .zg-datetime-popup .vc-year:hover {
288
+ color: var(--zg-border-editing, #4caf50);
289
+ }
290
+
291
+ /* ============================================
292
+ Date Range Specific
293
+ ============================================ */
294
+
295
+ .zg-datetime-range-container {
296
+ display: flex;
297
+ align-items: center;
298
+ gap: 8px;
299
+ }
300
+
301
+ .zg-datetime-range-separator {
302
+ color: var(--zg-datetime-text-secondary-color);
303
+ }
304
+
305
+ .zg-datetime-range-input {
306
+ flex: 1;
307
+ min-width: 0;
308
+ }
309
+
310
+ /* Date Range Editor Header */
311
+ .zg-date-range-header {
312
+ display: flex;
313
+ justify-content: space-between;
314
+ align-items: center;
315
+ padding: 8px 0;
316
+ margin-bottom: 12px;
317
+ border-bottom: 1px solid var(--zg-datetime-border-color);
318
+ }
319
+
320
+ .zg-date-range-display {
321
+ font-weight: 500;
322
+ color: var(--zg-datetime-text-color);
323
+ }
324
+
325
+ .zg-date-range-buttons {
326
+ display: flex;
327
+ gap: 8px;
328
+ }
329
+
330
+ .zg-date-range-btn {
331
+ padding: 6px 12px;
332
+ border: 1px solid var(--zg-datetime-border-color);
333
+ border-radius: var(--zg-datetime-border-radius);
334
+ background-color: var(--zg-datetime-background-color);
335
+ color: var(--zg-datetime-text-color);
336
+ font-family: inherit;
337
+ font-size: 13px;
338
+ cursor: pointer;
339
+ transition: background-color var(--zg-datetime-transition), border-color var(--zg-datetime-transition);
340
+ }
341
+
342
+ .zg-date-range-btn:hover {
343
+ border-color: var(--zg-datetime-primary-color);
344
+ }
345
+
346
+ .zg-date-range-btn-apply {
347
+ background-color: var(--zg-datetime-primary-color);
348
+ border-color: var(--zg-datetime-primary-color);
349
+ color: #ffffff;
350
+ }
351
+
352
+ .zg-date-range-btn-apply:hover {
353
+ background-color: var(--zg-datetime-primary-hover-color);
354
+ border-color: var(--zg-datetime-primary-hover-color);
355
+ }
356
+
357
+ .zg-date-range-label {
358
+ font-size: 12px;
359
+ font-weight: 500;
360
+ color: var(--zg-datetime-text-secondary-color);
361
+ margin-bottom: 8px;
362
+ text-transform: uppercase;
363
+ letter-spacing: 0.5px;
364
+ }
365
+
366
+ .zg-date-range-calendars {
367
+ display: flex;
368
+ gap: 16px;
369
+ }
370
+
371
+ /* ============================================
372
+ Time Picker Specific
373
+ ============================================ */
374
+
375
+ .zg-datetime-time-container {
376
+ display: flex;
377
+ align-items: center;
378
+ gap: 4px;
379
+ }
380
+
381
+ .zg-datetime-time-input {
382
+ width: 48px;
383
+ text-align: center;
384
+ padding: 8px 4px;
385
+ }
386
+
387
+ .zg-datetime-time-separator {
388
+ color: var(--zg-datetime-text-secondary-color);
389
+ font-weight: 500;
390
+ }
391
+
392
+ .zg-datetime-time-ampm {
393
+ padding: 8px 12px;
394
+ background-color: var(--zg-datetime-background-color);
395
+ border: 1px solid var(--zg-datetime-border-color);
396
+ border-radius: var(--zg-datetime-border-radius);
397
+ color: var(--zg-datetime-text-color);
398
+ font-family: inherit;
399
+ font-size: inherit;
400
+ cursor: pointer;
401
+ }
402
+
403
+ /* ============================================
404
+ Display Renderers (read-only cells)
405
+ ============================================ */
406
+
407
+ .zg-datetime-display {
408
+ padding: 4px 8px;
409
+ color: var(--zg-datetime-text-color);
410
+ font-family: var(--zg-datetime-font-family);
411
+ font-size: var(--zg-datetime-font-size);
412
+ }
413
+
414
+ .zg-datetime-display.empty {
415
+ color: var(--zg-datetime-text-secondary-color);
416
+ }
417
+
418
+ /* ============================================
419
+ Animations
420
+ ============================================ */
421
+
422
+ @keyframes zg-datetime-fade-in {
423
+ from {
424
+ opacity: 0;
425
+ }
426
+ to {
427
+ opacity: 1;
428
+ }
429
+ }
430
+
431
+ .zg-datetime-popup[data-zg-datetime-popup="true"] {
432
+ animation: zg-datetime-fade-in var(--zg-datetime-transition);
433
+ }
434
+
435
+ /* ============================================
436
+ Accessibility
437
+ ============================================ */
438
+
439
+ /* High contrast mode support */
440
+ @media (prefers-contrast: high) {
441
+ .zg-datetime-trigger,
442
+ .zg-datetime-input {
443
+ border-width: 2px;
444
+ }
445
+
446
+ .zg-datetime-trigger:focus,
447
+ .zg-datetime-input:focus {
448
+ outline: 2px solid currentColor;
449
+ outline-offset: 2px;
450
+ }
451
+ }
452
+
453
+ /* Reduced motion support */
454
+ @media (prefers-reduced-motion: reduce) {
455
+ .zg-datetime-popup[data-zg-datetime-popup="true"] {
456
+ animation: none;
457
+ }
458
+
459
+ .zg-datetime-trigger,
460
+ .zg-datetime-input {
461
+ transition: none;
462
+ }
463
+ }