zenkit-css 1.2.1 → 1.2.3

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.
@@ -0,0 +1,614 @@
1
+ // ========================================
2
+ // ZenKit - Date Range Component
3
+ // Date range picker / Date range calendar
4
+ // ========================================
5
+
6
+ @use '../abstracts/variables' as *;
7
+
8
+ // ----------------------------------------
9
+ // Date Range Picker Container
10
+ // ----------------------------------------
11
+ .daterange {
12
+ display: inline-flex;
13
+ align-items: center;
14
+ gap: 0.5rem;
15
+ padding: 0.5rem 0.75rem;
16
+ background-color: var(--bg);
17
+ border: 1px solid var(--border);
18
+ border-radius: $border-radius;
19
+ cursor: pointer;
20
+ transition: border-color $transition-fast $transition-timing,
21
+ box-shadow $transition-fast $transition-timing;
22
+
23
+ &:hover {
24
+ border-color: var(--gray-400);
25
+ }
26
+
27
+ &:focus-within {
28
+ border-color: var(--primary);
29
+ box-shadow: 0 0 0 3px rgba($primary, 0.15);
30
+ }
31
+ }
32
+
33
+ .daterange-icon {
34
+ display: flex;
35
+ align-items: center;
36
+ justify-content: center;
37
+ color: var(--text-muted);
38
+
39
+ svg {
40
+ width: 1rem;
41
+ height: 1rem;
42
+ }
43
+ }
44
+
45
+ .daterange-inputs {
46
+ display: flex;
47
+ align-items: center;
48
+ gap: 0.5rem;
49
+ }
50
+
51
+ .daterange-input {
52
+ width: 120px;
53
+ padding: 0;
54
+ font-size: var(--text-sm);
55
+ color: var(--text);
56
+ background: transparent;
57
+ border: none;
58
+ outline: none;
59
+
60
+ &::placeholder {
61
+ color: var(--text-muted);
62
+ }
63
+ }
64
+
65
+ .daterange-separator {
66
+ color: var(--text-muted);
67
+ font-size: var(--text-sm);
68
+ }
69
+
70
+ .daterange-clear {
71
+ display: flex;
72
+ align-items: center;
73
+ justify-content: center;
74
+ padding: 0.25rem;
75
+ color: var(--text-muted);
76
+ background: transparent;
77
+ border: none;
78
+ border-radius: $border-radius-sm;
79
+ cursor: pointer;
80
+ opacity: 0;
81
+ transition: opacity $transition-fast $transition-timing,
82
+ color $transition-fast $transition-timing;
83
+
84
+ svg {
85
+ width: 0.875rem;
86
+ height: 0.875rem;
87
+ }
88
+
89
+ &:hover {
90
+ color: var(--text);
91
+ }
92
+ }
93
+
94
+ .daterange:hover .daterange-clear {
95
+ opacity: 1;
96
+ }
97
+
98
+ // ----------------------------------------
99
+ // Date Range Dropdown
100
+ // ----------------------------------------
101
+ .daterange-dropdown {
102
+ position: absolute;
103
+ top: 100%;
104
+ left: 0;
105
+ z-index: $z-dropdown;
106
+ margin-top: 0.5rem;
107
+ background-color: var(--bg);
108
+ border: 1px solid var(--border);
109
+ border-radius: $border-radius-lg;
110
+ box-shadow: $shadow-lg;
111
+ opacity: 0;
112
+ visibility: hidden;
113
+ transform: translateY(-8px);
114
+ transition: opacity $transition-fast $transition-timing,
115
+ visibility $transition-fast $transition-timing,
116
+ transform $transition-fast $transition-timing;
117
+
118
+ &.is-open {
119
+ opacity: 1;
120
+ visibility: visible;
121
+ transform: translateY(0);
122
+ }
123
+ }
124
+
125
+ // ----------------------------------------
126
+ // Date Range Calendar Container
127
+ // ----------------------------------------
128
+ .daterange-calendars {
129
+ display: flex;
130
+ gap: 0;
131
+ }
132
+
133
+ .daterange-calendar {
134
+ padding: 1rem;
135
+ min-width: 280px;
136
+
137
+ &:not(:last-child) {
138
+ border-right: 1px solid var(--border);
139
+ }
140
+ }
141
+
142
+ // ----------------------------------------
143
+ // Calendar Header
144
+ // ----------------------------------------
145
+ .daterange-calendar-header {
146
+ display: flex;
147
+ align-items: center;
148
+ justify-content: space-between;
149
+ margin-bottom: 1rem;
150
+ }
151
+
152
+ .daterange-calendar-title {
153
+ font-size: var(--text-base);
154
+ font-weight: $font-weight-semibold;
155
+ color: var(--text);
156
+ }
157
+
158
+ .daterange-calendar-nav {
159
+ display: flex;
160
+ gap: 0.25rem;
161
+ }
162
+
163
+ .daterange-calendar-btn {
164
+ display: flex;
165
+ align-items: center;
166
+ justify-content: center;
167
+ width: 2rem;
168
+ height: 2rem;
169
+ padding: 0;
170
+ color: var(--text-muted);
171
+ background: transparent;
172
+ border: none;
173
+ border-radius: $border-radius;
174
+ cursor: pointer;
175
+ transition: color $transition-fast $transition-timing,
176
+ background-color $transition-fast $transition-timing;
177
+
178
+ &:hover {
179
+ color: var(--text);
180
+ background-color: var(--gray-100);
181
+ }
182
+
183
+ &:disabled {
184
+ opacity: 0.5;
185
+ cursor: not-allowed;
186
+ }
187
+
188
+ svg {
189
+ width: 1rem;
190
+ height: 1rem;
191
+ }
192
+ }
193
+
194
+ // ----------------------------------------
195
+ // Calendar Weekdays
196
+ // ----------------------------------------
197
+ .daterange-weekdays {
198
+ display: grid;
199
+ grid-template-columns: repeat(7, 1fr);
200
+ margin-bottom: 0.5rem;
201
+ }
202
+
203
+ .daterange-weekday {
204
+ padding: 0.5rem;
205
+ font-size: var(--text-xs);
206
+ font-weight: $font-weight-medium;
207
+ color: var(--text-muted);
208
+ text-align: center;
209
+ text-transform: uppercase;
210
+ }
211
+
212
+ // ----------------------------------------
213
+ // Calendar Days
214
+ // ----------------------------------------
215
+ .daterange-days {
216
+ display: grid;
217
+ grid-template-columns: repeat(7, 1fr);
218
+ gap: 2px;
219
+ }
220
+
221
+ .daterange-day {
222
+ display: flex;
223
+ align-items: center;
224
+ justify-content: center;
225
+ width: 36px;
226
+ height: 36px;
227
+ font-size: var(--text-sm);
228
+ color: var(--text);
229
+ background: transparent;
230
+ border: none;
231
+ border-radius: $border-radius;
232
+ cursor: pointer;
233
+ transition: color $transition-fast $transition-timing,
234
+ background-color $transition-fast $transition-timing;
235
+
236
+ &:hover:not(:disabled):not(.daterange-day-selected) {
237
+ background-color: var(--gray-100);
238
+ }
239
+
240
+ &:disabled {
241
+ color: var(--text-muted);
242
+ opacity: 0.5;
243
+ cursor: not-allowed;
244
+ }
245
+ }
246
+
247
+ .daterange-day-other-month {
248
+ color: var(--text-muted);
249
+ opacity: 0.5;
250
+ }
251
+
252
+ .daterange-day-today {
253
+ font-weight: $font-weight-semibold;
254
+ color: var(--primary);
255
+ }
256
+
257
+ .daterange-day-selected {
258
+ color: var(--white);
259
+ background-color: var(--primary);
260
+
261
+ &:hover {
262
+ background-color: var(--primary-600);
263
+ }
264
+ }
265
+
266
+ .daterange-day-in-range {
267
+ background-color: var(--primary-100);
268
+ border-radius: 0;
269
+ }
270
+
271
+ .daterange-day-range-start {
272
+ border-radius: $border-radius 0 0 $border-radius;
273
+ }
274
+
275
+ .daterange-day-range-end {
276
+ border-radius: 0 $border-radius $border-radius 0;
277
+ }
278
+
279
+ .daterange-day-range-start.daterange-day-range-end {
280
+ border-radius: $border-radius;
281
+ }
282
+
283
+ // ----------------------------------------
284
+ // Presets Panel
285
+ // ----------------------------------------
286
+ .daterange-presets {
287
+ padding: 1rem;
288
+ border-left: 1px solid var(--border);
289
+ min-width: 180px;
290
+ }
291
+
292
+ .daterange-presets-title {
293
+ font-size: var(--text-xs);
294
+ font-weight: $font-weight-medium;
295
+ color: var(--text-muted);
296
+ text-transform: uppercase;
297
+ letter-spacing: 0.05em;
298
+ margin-bottom: 0.75rem;
299
+ }
300
+
301
+ .daterange-preset {
302
+ display: block;
303
+ width: 100%;
304
+ padding: 0.5rem 0.75rem;
305
+ font-size: var(--text-sm);
306
+ color: var(--text);
307
+ background: transparent;
308
+ border: none;
309
+ border-radius: $border-radius;
310
+ text-align: left;
311
+ cursor: pointer;
312
+ transition: background-color $transition-fast $transition-timing;
313
+
314
+ &:hover {
315
+ background-color: var(--gray-100);
316
+ }
317
+
318
+ &.is-active {
319
+ color: var(--primary);
320
+ background-color: var(--primary-50);
321
+ }
322
+ }
323
+
324
+ // ----------------------------------------
325
+ // Date Range Footer
326
+ // ----------------------------------------
327
+ .daterange-footer {
328
+ display: flex;
329
+ align-items: center;
330
+ justify-content: space-between;
331
+ padding: 0.75rem 1rem;
332
+ border-top: 1px solid var(--border);
333
+ }
334
+
335
+ .daterange-footer-left {
336
+ display: flex;
337
+ align-items: center;
338
+ gap: 0.5rem;
339
+ }
340
+
341
+ .daterange-footer-right {
342
+ display: flex;
343
+ align-items: center;
344
+ gap: 0.5rem;
345
+ }
346
+
347
+ .daterange-selected-display {
348
+ font-size: var(--text-sm);
349
+ color: var(--text-muted);
350
+ }
351
+
352
+ // ----------------------------------------
353
+ // Date Range Sizes
354
+ // ----------------------------------------
355
+ .daterange-sm {
356
+ padding: 0.375rem 0.625rem;
357
+
358
+ .daterange-input {
359
+ width: 100px;
360
+ font-size: var(--text-xs);
361
+ }
362
+ }
363
+
364
+ .daterange-lg {
365
+ padding: 0.625rem 0.875rem;
366
+
367
+ .daterange-input {
368
+ width: 140px;
369
+ font-size: var(--text-base);
370
+ }
371
+ }
372
+
373
+ // ----------------------------------------
374
+ // Date Range States
375
+ // ----------------------------------------
376
+ .daterange-disabled {
377
+ opacity: 0.6;
378
+ pointer-events: none;
379
+ background-color: var(--bg-muted);
380
+ }
381
+
382
+ .daterange-error {
383
+ border-color: var(--danger);
384
+
385
+ &:focus-within {
386
+ border-color: var(--danger);
387
+ box-shadow: 0 0 0 3px rgba($danger, 0.15);
388
+ }
389
+ }
390
+
391
+ .daterange-success {
392
+ border-color: var(--success);
393
+
394
+ &:focus-within {
395
+ border-color: var(--success);
396
+ box-shadow: 0 0 0 3px rgba($success, 0.15);
397
+ }
398
+ }
399
+
400
+ // ----------------------------------------
401
+ // Date Range Inline
402
+ // ----------------------------------------
403
+ .daterange-inline {
404
+ .daterange-dropdown {
405
+ position: static;
406
+ opacity: 1;
407
+ visibility: visible;
408
+ transform: none;
409
+ margin-top: 0;
410
+ box-shadow: none;
411
+ border: 1px solid var(--border);
412
+ }
413
+ }
414
+
415
+ // ----------------------------------------
416
+ // Date Range Compact (Single Calendar)
417
+ // ----------------------------------------
418
+ .daterange-compact {
419
+ .daterange-calendars {
420
+ flex-direction: column;
421
+ }
422
+
423
+ .daterange-calendar:not(:last-child) {
424
+ border-right: none;
425
+ border-bottom: 1px solid var(--border);
426
+ }
427
+ }
428
+
429
+ // ----------------------------------------
430
+ // Time Selection
431
+ // ----------------------------------------
432
+ .daterange-time {
433
+ display: flex;
434
+ align-items: center;
435
+ gap: 0.5rem;
436
+ padding: 0.75rem 1rem;
437
+ border-top: 1px solid var(--border);
438
+ }
439
+
440
+ .daterange-time-label {
441
+ font-size: var(--text-sm);
442
+ color: var(--text-muted);
443
+ }
444
+
445
+ .daterange-time-inputs {
446
+ display: flex;
447
+ align-items: center;
448
+ gap: 0.25rem;
449
+ }
450
+
451
+ .daterange-time-input {
452
+ width: 50px;
453
+ padding: 0.375rem 0.5rem;
454
+ font-size: var(--text-sm);
455
+ text-align: center;
456
+ color: var(--text);
457
+ background-color: var(--bg);
458
+ border: 1px solid var(--border);
459
+ border-radius: $border-radius;
460
+
461
+ &:focus {
462
+ outline: none;
463
+ border-color: var(--primary);
464
+ }
465
+ }
466
+
467
+ .daterange-time-separator {
468
+ color: var(--text-muted);
469
+ }
470
+
471
+ // ----------------------------------------
472
+ // Month/Year Selection
473
+ // ----------------------------------------
474
+ .daterange-month-select,
475
+ .daterange-year-select {
476
+ padding: 0.25rem 0.5rem;
477
+ font-size: var(--text-sm);
478
+ font-weight: $font-weight-medium;
479
+ color: var(--text);
480
+ background: transparent;
481
+ border: 1px solid transparent;
482
+ border-radius: $border-radius;
483
+ cursor: pointer;
484
+ transition: border-color $transition-fast $transition-timing,
485
+ background-color $transition-fast $transition-timing;
486
+
487
+ &:hover {
488
+ background-color: var(--gray-100);
489
+ border-color: var(--border);
490
+ }
491
+ }
492
+
493
+ // ----------------------------------------
494
+ // Comparison Mode
495
+ // ----------------------------------------
496
+ .daterange-comparison {
497
+ .daterange-day-comparison {
498
+ position: relative;
499
+
500
+ &::after {
501
+ content: "";
502
+ position: absolute;
503
+ bottom: 2px;
504
+ left: 50%;
505
+ transform: translateX(-50%);
506
+ width: 4px;
507
+ height: 4px;
508
+ background-color: var(--warning);
509
+ border-radius: 50%;
510
+ }
511
+ }
512
+ }
513
+
514
+ // ----------------------------------------
515
+ // Dark Mode
516
+ // ----------------------------------------
517
+ [data-theme="dark"] {
518
+ .daterange {
519
+ background-color: var(--gray-800);
520
+ border-color: var(--gray-600);
521
+
522
+ &:hover {
523
+ border-color: var(--gray-500);
524
+ }
525
+ }
526
+
527
+ .daterange-dropdown {
528
+ background-color: var(--gray-800);
529
+ border-color: var(--gray-700);
530
+ }
531
+
532
+ .daterange-calendar:not(:last-child) {
533
+ border-color: var(--gray-700);
534
+ }
535
+
536
+ .daterange-calendar-btn:hover {
537
+ background-color: var(--gray-700);
538
+ }
539
+
540
+ .daterange-day:hover:not(:disabled):not(.daterange-day-selected) {
541
+ background-color: var(--gray-700);
542
+ }
543
+
544
+ .daterange-day-in-range {
545
+ background-color: rgba($primary, 0.2);
546
+ }
547
+
548
+ .daterange-presets {
549
+ border-color: var(--gray-700);
550
+ }
551
+
552
+ .daterange-preset:hover {
553
+ background-color: var(--gray-700);
554
+ }
555
+
556
+ .daterange-preset.is-active {
557
+ background-color: rgba($primary, 0.2);
558
+ }
559
+
560
+ .daterange-footer {
561
+ border-color: var(--gray-700);
562
+ }
563
+
564
+ .daterange-time {
565
+ border-color: var(--gray-700);
566
+ }
567
+
568
+ .daterange-time-input {
569
+ background-color: var(--gray-900);
570
+ border-color: var(--gray-600);
571
+ }
572
+
573
+ .daterange-month-select:hover,
574
+ .daterange-year-select:hover {
575
+ background-color: var(--gray-700);
576
+ border-color: var(--gray-600);
577
+ }
578
+ }
579
+
580
+ // ----------------------------------------
581
+ // Responsive
582
+ // ----------------------------------------
583
+ @media (max-width: 767px) {
584
+ .daterange-calendars {
585
+ flex-direction: column;
586
+ }
587
+
588
+ .daterange-calendar:not(:last-child) {
589
+ border-right: none;
590
+ border-bottom: 1px solid var(--border);
591
+ }
592
+
593
+ .daterange-presets {
594
+ border-left: none;
595
+ border-top: 1px solid var(--border);
596
+ }
597
+
598
+ .daterange-dropdown {
599
+ position: fixed;
600
+ top: auto;
601
+ bottom: 0;
602
+ left: 0;
603
+ right: 0;
604
+ margin-top: 0;
605
+ max-height: 90vh;
606
+ overflow-y: auto;
607
+ border-radius: $border-radius-lg $border-radius-lg 0 0;
608
+ transform: translateY(100%);
609
+
610
+ &.is-open {
611
+ transform: translateY(0);
612
+ }
613
+ }
614
+ }