podo-ui 1.0.12 → 1.0.14
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/cdn/podo-datepicker.css +131 -1
- package/cdn/podo-datepicker.js +354 -2
- package/cdn/podo-datepicker.min.css +2 -2
- package/cdn/podo-datepicker.min.js +2 -2
- package/cdn/podo-ui.css +1 -1
- package/cdn/podo-ui.min.css +1 -1
- package/dist/react/molecule/datepicker.d.ts +8 -0
- package/dist/react/molecule/datepicker.d.ts.map +1 -1
- package/dist/react/molecule/datepicker.js +203 -3
- package/dist/react/molecule/datepicker.module.scss +126 -0
- package/package.json +1 -1
- package/vanilla/datepicker.css +130 -0
- package/vanilla/datepicker.js +353 -1
package/cdn/podo-datepicker.css
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* Podo UI DatePicker CSS v1.0.
|
|
2
|
+
* Podo UI DatePicker CSS v1.0.14
|
|
3
3
|
* https://podoui.com
|
|
4
4
|
* MIT License
|
|
5
5
|
*/
|
|
@@ -197,6 +197,59 @@
|
|
|
197
197
|
flex-shrink: 0;
|
|
198
198
|
}
|
|
199
199
|
|
|
200
|
+
/* ============================================
|
|
201
|
+
Navigation (quickSelect + period mode, integrated in input)
|
|
202
|
+
============================================ */
|
|
203
|
+
.podo-datepicker__input--with-nav {
|
|
204
|
+
padding: 0;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
.podo-datepicker__nav-arrow {
|
|
208
|
+
display: flex;
|
|
209
|
+
align-items: center;
|
|
210
|
+
justify-content: center;
|
|
211
|
+
width: 40px;
|
|
212
|
+
min-height: 100%;
|
|
213
|
+
background: none;
|
|
214
|
+
border: none;
|
|
215
|
+
cursor: pointer;
|
|
216
|
+
transition: background 0.2s;
|
|
217
|
+
flex-shrink: 0;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
.podo-datepicker__nav-arrow:hover:not(:disabled) {
|
|
221
|
+
background: var(--podo-default-hover);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
.podo-datepicker__nav-arrow:disabled {
|
|
225
|
+
opacity: 0.4;
|
|
226
|
+
cursor: not-allowed;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
.podo-datepicker__nav-arrow i {
|
|
230
|
+
font-size: 16px;
|
|
231
|
+
color: var(--podo-text-body);
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
.podo-datepicker__nav-arrow--left {
|
|
235
|
+
border-right: 1px solid var(--podo-border);
|
|
236
|
+
border-radius: var(--podo-radius-md) 0 0 var(--podo-radius-md);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
.podo-datepicker__nav-arrow--right {
|
|
240
|
+
border-left: 1px solid var(--podo-border);
|
|
241
|
+
border-radius: 0 var(--podo-radius-md) var(--podo-radius-md) 0;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
.podo-datepicker__preset-label {
|
|
245
|
+
font-size: var(--podo-font-size-md);
|
|
246
|
+
color: var(--podo-text-body);
|
|
247
|
+
white-space: nowrap;
|
|
248
|
+
flex-shrink: 0;
|
|
249
|
+
padding-left: var(--podo-spacing-3);
|
|
250
|
+
font-weight: 600;
|
|
251
|
+
}
|
|
252
|
+
|
|
200
253
|
/* ============================================
|
|
201
254
|
Dropdown
|
|
202
255
|
============================================ */
|
|
@@ -488,6 +541,57 @@
|
|
|
488
541
|
background: var(--podo-primary-hover);
|
|
489
542
|
}
|
|
490
543
|
|
|
544
|
+
/* ==============================================
|
|
545
|
+
Quick Select Panel
|
|
546
|
+
============================================== */
|
|
547
|
+
|
|
548
|
+
.podo-datepicker__dropdown-body {
|
|
549
|
+
display: flex;
|
|
550
|
+
gap: var(--podo-spacing-4);
|
|
551
|
+
min-width: 0;
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
.podo-datepicker__quick-select-panel {
|
|
555
|
+
display: flex;
|
|
556
|
+
flex-direction: column;
|
|
557
|
+
gap: var(--podo-spacing-1);
|
|
558
|
+
min-width: 100px;
|
|
559
|
+
padding-right: var(--podo-spacing-4);
|
|
560
|
+
border-right: 1px solid var(--podo-border);
|
|
561
|
+
flex-shrink: 0;
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
.podo-datepicker__quick-select-item {
|
|
565
|
+
display: flex;
|
|
566
|
+
align-items: center;
|
|
567
|
+
padding: var(--podo-spacing-2) var(--podo-spacing-3);
|
|
568
|
+
background: none;
|
|
569
|
+
border: none;
|
|
570
|
+
border-radius: var(--podo-radius-sm);
|
|
571
|
+
cursor: pointer;
|
|
572
|
+
transition: background 0.2s, color 0.2s;
|
|
573
|
+
color: var(--podo-text-body);
|
|
574
|
+
white-space: nowrap;
|
|
575
|
+
text-align: left;
|
|
576
|
+
font-size: 14px;
|
|
577
|
+
line-height: 1.5;
|
|
578
|
+
}
|
|
579
|
+
|
|
580
|
+
.podo-datepicker__quick-select-item:hover:not(.podo-datepicker__quick-select-item--disabled):not(.podo-datepicker__quick-select-item--active) {
|
|
581
|
+
background: var(--podo-default-hover);
|
|
582
|
+
}
|
|
583
|
+
|
|
584
|
+
.podo-datepicker__quick-select-item--active {
|
|
585
|
+
color: var(--podo-primary);
|
|
586
|
+
background: var(--podo-primary-fill, rgba(124, 58, 237, 0.08));
|
|
587
|
+
font-weight: 600;
|
|
588
|
+
}
|
|
589
|
+
|
|
590
|
+
.podo-datepicker__quick-select-item--disabled {
|
|
591
|
+
color: var(--podo-text-disabled, #adb5bd);
|
|
592
|
+
cursor: not-allowed;
|
|
593
|
+
}
|
|
594
|
+
|
|
491
595
|
/* ==============================================
|
|
492
596
|
Responsive Styles (min 360px support)
|
|
493
597
|
============================================== */
|
|
@@ -497,6 +601,16 @@
|
|
|
497
601
|
.podo-datepicker__period-calendar-right {
|
|
498
602
|
display: none;
|
|
499
603
|
}
|
|
604
|
+
|
|
605
|
+
.podo-datepicker__quick-select-panel {
|
|
606
|
+
min-width: 80px;
|
|
607
|
+
padding-right: var(--podo-spacing-3);
|
|
608
|
+
}
|
|
609
|
+
|
|
610
|
+
.podo-datepicker__quick-select-item {
|
|
611
|
+
font-size: 13px;
|
|
612
|
+
padding: var(--podo-spacing-2);
|
|
613
|
+
}
|
|
500
614
|
}
|
|
501
615
|
|
|
502
616
|
/* 480px 이하: padding/gap 축소 */
|
|
@@ -574,4 +688,20 @@
|
|
|
574
688
|
height: 16px;
|
|
575
689
|
font-size: 16px;
|
|
576
690
|
}
|
|
691
|
+
|
|
692
|
+
.podo-datepicker__quick-select-panel {
|
|
693
|
+
display: none;
|
|
694
|
+
}
|
|
695
|
+
|
|
696
|
+
.podo-datepicker__nav-arrow {
|
|
697
|
+
width: 32px;
|
|
698
|
+
}
|
|
699
|
+
|
|
700
|
+
.podo-datepicker__nav-arrow i {
|
|
701
|
+
font-size: 14px;
|
|
702
|
+
}
|
|
703
|
+
|
|
704
|
+
.podo-datepicker__preset-label {
|
|
705
|
+
display: none;
|
|
706
|
+
}
|
|
577
707
|
}
|
package/cdn/podo-datepicker.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* Podo UI DatePicker v1.0.
|
|
2
|
+
* Podo UI DatePicker v1.0.14
|
|
3
3
|
* https://podoui.com
|
|
4
4
|
* MIT License
|
|
5
5
|
*/
|
|
@@ -31,8 +31,115 @@
|
|
|
31
31
|
yearSuffix: '년',
|
|
32
32
|
reset: '초기화',
|
|
33
33
|
apply: '적용',
|
|
34
|
+
quickSelect: {
|
|
35
|
+
today: '오늘',
|
|
36
|
+
yesterday: '어제',
|
|
37
|
+
thisWeek: '이번 주',
|
|
38
|
+
lastWeek: '지난 주',
|
|
39
|
+
last7Days: '최근 7일',
|
|
40
|
+
last30Days: '최근 30일',
|
|
41
|
+
thisMonth: '이번 달',
|
|
42
|
+
lastMonth: '지난 달',
|
|
43
|
+
},
|
|
34
44
|
};
|
|
35
45
|
|
|
46
|
+
// ============================================
|
|
47
|
+
// Quick Select Presets
|
|
48
|
+
// ============================================
|
|
49
|
+
|
|
50
|
+
const QUICK_SELECT_KEYS = [
|
|
51
|
+
'today', 'yesterday', 'thisWeek', 'lastWeek',
|
|
52
|
+
'last7Days', 'last30Days', 'thisMonth', 'lastMonth',
|
|
53
|
+
];
|
|
54
|
+
|
|
55
|
+
function getPresetRange(key) {
|
|
56
|
+
const today = new Date();
|
|
57
|
+
const todayStart = new Date(today.getFullYear(), today.getMonth(), today.getDate());
|
|
58
|
+
|
|
59
|
+
switch (key) {
|
|
60
|
+
case 'today':
|
|
61
|
+
return { start: new Date(todayStart), end: new Date(todayStart) };
|
|
62
|
+
case 'yesterday': {
|
|
63
|
+
const d = new Date(todayStart);
|
|
64
|
+
d.setDate(d.getDate() - 1);
|
|
65
|
+
return { start: d, end: new Date(d) };
|
|
66
|
+
}
|
|
67
|
+
case 'thisWeek': {
|
|
68
|
+
const dayOfWeek = todayStart.getDay();
|
|
69
|
+
const start = new Date(todayStart);
|
|
70
|
+
start.setDate(start.getDate() - dayOfWeek);
|
|
71
|
+
const end = new Date(start);
|
|
72
|
+
end.setDate(end.getDate() + 6);
|
|
73
|
+
return { start, end };
|
|
74
|
+
}
|
|
75
|
+
case 'lastWeek': {
|
|
76
|
+
const dayOfWeek = todayStart.getDay();
|
|
77
|
+
const thisWeekStart = new Date(todayStart);
|
|
78
|
+
thisWeekStart.setDate(thisWeekStart.getDate() - dayOfWeek);
|
|
79
|
+
const start = new Date(thisWeekStart);
|
|
80
|
+
start.setDate(start.getDate() - 7);
|
|
81
|
+
const end = new Date(start);
|
|
82
|
+
end.setDate(end.getDate() + 6);
|
|
83
|
+
return { start, end };
|
|
84
|
+
}
|
|
85
|
+
case 'last7Days': {
|
|
86
|
+
const start = new Date(todayStart);
|
|
87
|
+
start.setDate(start.getDate() - 6);
|
|
88
|
+
return { start, end: new Date(todayStart) };
|
|
89
|
+
}
|
|
90
|
+
case 'last30Days': {
|
|
91
|
+
const start = new Date(todayStart);
|
|
92
|
+
start.setDate(start.getDate() - 29);
|
|
93
|
+
return { start, end: new Date(todayStart) };
|
|
94
|
+
}
|
|
95
|
+
case 'thisMonth': {
|
|
96
|
+
const start = new Date(todayStart.getFullYear(), todayStart.getMonth(), 1);
|
|
97
|
+
const end = new Date(todayStart.getFullYear(), todayStart.getMonth() + 1, 0);
|
|
98
|
+
return { start, end };
|
|
99
|
+
}
|
|
100
|
+
case 'lastMonth': {
|
|
101
|
+
const start = new Date(todayStart.getFullYear(), todayStart.getMonth() - 1, 1);
|
|
102
|
+
const end = new Date(todayStart.getFullYear(), todayStart.getMonth(), 0);
|
|
103
|
+
return { start, end };
|
|
104
|
+
}
|
|
105
|
+
default:
|
|
106
|
+
return { start: todayStart, end: todayStart };
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// ============================================
|
|
111
|
+
// Navigation Helpers
|
|
112
|
+
// ============================================
|
|
113
|
+
|
|
114
|
+
function getNavigationStepForPreset(key) {
|
|
115
|
+
switch (key) {
|
|
116
|
+
case 'today': case 'yesterday': return { type: 'days', count: 1 };
|
|
117
|
+
case 'thisWeek': case 'lastWeek': case 'last7Days': return { type: 'days', count: 7 };
|
|
118
|
+
case 'last30Days': return { type: 'days', count: 30 };
|
|
119
|
+
case 'thisMonth': case 'lastMonth': return { type: 'month', count: 1 };
|
|
120
|
+
default: return { type: 'days', count: 1 };
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
function calculateNavigationStep(start, end) {
|
|
125
|
+
const diffMs = new Date(end.getFullYear(), end.getMonth(), end.getDate()).getTime()
|
|
126
|
+
- new Date(start.getFullYear(), start.getMonth(), start.getDate()).getTime();
|
|
127
|
+
return { type: 'days', count: Math.round(diffMs / 86400000) + 1 };
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
function shiftDateRange(start, end, step, dir) {
|
|
131
|
+
if (step.type === 'month') {
|
|
132
|
+
const shift = step.count * dir;
|
|
133
|
+
const newStart = new Date(start.getFullYear(), start.getMonth() + shift, 1);
|
|
134
|
+
const newEnd = new Date(newStart.getFullYear(), newStart.getMonth() + 1, 0);
|
|
135
|
+
return { start: newStart, end: newEnd };
|
|
136
|
+
}
|
|
137
|
+
const shift = step.count * dir;
|
|
138
|
+
const s = new Date(start); s.setDate(s.getDate() + shift);
|
|
139
|
+
const e = new Date(end); e.setDate(e.getDate() + shift);
|
|
140
|
+
return { start: s, end: e };
|
|
141
|
+
}
|
|
142
|
+
|
|
36
143
|
// ============================================
|
|
37
144
|
// Helper Functions
|
|
38
145
|
// ============================================
|
|
@@ -234,6 +341,7 @@
|
|
|
234
341
|
* @param {string} [options.format] - Date/time format (y: year, m: month, d: day, h: hour, i: minute)
|
|
235
342
|
* @param {Object} [options.initialCalendar] - Initial calendar display month { start, end }
|
|
236
343
|
* @param {Object} [options.yearRange] - Year range for year selector { min, max }
|
|
344
|
+
* @param {boolean} [options.quickSelect=false] - Show quick select preset panel (period mode only)
|
|
237
345
|
*/
|
|
238
346
|
constructor(container, options = {}) {
|
|
239
347
|
this.container =
|
|
@@ -268,10 +376,17 @@
|
|
|
268
376
|
this.format = options.format;
|
|
269
377
|
this.initialCalendar = options.initialCalendar || {};
|
|
270
378
|
this.yearRange = options.yearRange;
|
|
379
|
+
this.quickSelect = options.quickSelect || false;
|
|
380
|
+
|
|
381
|
+
// Merge quickSelect texts
|
|
382
|
+
if (options.texts?.quickSelect) {
|
|
383
|
+
this.texts.quickSelect = { ...DEFAULT_TEXTS.quickSelect, ...options.texts.quickSelect };
|
|
384
|
+
}
|
|
271
385
|
|
|
272
386
|
// State
|
|
273
387
|
this.isOpen = false;
|
|
274
388
|
this.selectingPart = null;
|
|
389
|
+
this.navigationStep = null;
|
|
275
390
|
|
|
276
391
|
// 초기 달력 표시 월 계산
|
|
277
392
|
if (this.value.date) {
|
|
@@ -330,6 +445,8 @@
|
|
|
330
445
|
this.container.innerHTML = '';
|
|
331
446
|
this.container.className = PREFIX;
|
|
332
447
|
|
|
448
|
+
const showNavigation = this.quickSelect && this.mode === 'period';
|
|
449
|
+
|
|
333
450
|
// Input wrapper
|
|
334
451
|
this.inputEl = createElement('div', `${PREFIX}__input`);
|
|
335
452
|
if (this.disabled) this.inputEl.classList.add(`${PREFIX}__input--disabled`);
|
|
@@ -343,6 +460,36 @@
|
|
|
343
460
|
this.iconEl = createElement('i', `${PREFIX}__icon ${iconClass}`);
|
|
344
461
|
this.inputEl.appendChild(this.iconEl);
|
|
345
462
|
|
|
463
|
+
if (showNavigation) {
|
|
464
|
+
this.inputEl.classList.add(`${PREFIX}__input--with-nav`);
|
|
465
|
+
|
|
466
|
+
// Left arrow (prepend before inputContent)
|
|
467
|
+
this._prevArrowBtn = createElement('button', `${PREFIX}__nav-arrow ${PREFIX}__nav-arrow--left`);
|
|
468
|
+
this._prevArrowBtn.type = 'button';
|
|
469
|
+
this._prevArrowBtn.innerHTML = '<i class="icon-expand-left"></i>';
|
|
470
|
+
this._prevArrowBtn.disabled = this.disabled || this.isNavDisabled(-1);
|
|
471
|
+
this._prevArrowBtn.addEventListener('click', (e) => { e.stopPropagation(); this.handleNavigate(-1); });
|
|
472
|
+
this.inputEl.insertBefore(this._prevArrowBtn, this.inputContentEl);
|
|
473
|
+
|
|
474
|
+
// Preset label
|
|
475
|
+
this._presetLabelEl = createElement('span', `${PREFIX}__preset-label`);
|
|
476
|
+
this.updatePresetLabel();
|
|
477
|
+
this.inputEl.insertBefore(this._presetLabelEl, this.inputContentEl);
|
|
478
|
+
|
|
479
|
+
// Remove calendar icon
|
|
480
|
+
if (this.iconEl && this.iconEl.parentNode) {
|
|
481
|
+
this.iconEl.parentNode.removeChild(this.iconEl);
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
// Right arrow (append after content)
|
|
485
|
+
this._nextArrowBtn = createElement('button', `${PREFIX}__nav-arrow ${PREFIX}__nav-arrow--right`);
|
|
486
|
+
this._nextArrowBtn.type = 'button';
|
|
487
|
+
this._nextArrowBtn.innerHTML = '<i class="icon-expand-right"></i>';
|
|
488
|
+
this._nextArrowBtn.disabled = this.disabled || this.isNavDisabled(1);
|
|
489
|
+
this._nextArrowBtn.addEventListener('click', (e) => { e.stopPropagation(); this.handleNavigate(1); });
|
|
490
|
+
this.inputEl.appendChild(this._nextArrowBtn);
|
|
491
|
+
}
|
|
492
|
+
|
|
346
493
|
this.container.appendChild(this.inputEl);
|
|
347
494
|
|
|
348
495
|
// Dropdown
|
|
@@ -550,7 +697,18 @@
|
|
|
550
697
|
|
|
551
698
|
// Calendar(s)
|
|
552
699
|
if (this.mode === 'period') {
|
|
553
|
-
this.
|
|
700
|
+
const showQS = this.quickSelect && this.mode === 'period';
|
|
701
|
+
|
|
702
|
+
if (showQS) {
|
|
703
|
+
const body = createElement('div', `${PREFIX}__dropdown-body`);
|
|
704
|
+
body.appendChild(this.renderQuickSelectPanel());
|
|
705
|
+
const calWrapper = createElement('div', `${PREFIX}__period-calendars-wrapper`);
|
|
706
|
+
this.renderPeriodCalendarsInto(calWrapper);
|
|
707
|
+
body.appendChild(calWrapper);
|
|
708
|
+
this.dropdownEl.appendChild(body);
|
|
709
|
+
} else {
|
|
710
|
+
this.renderPeriodCalendars();
|
|
711
|
+
}
|
|
554
712
|
} else {
|
|
555
713
|
this.renderCalendar(this.viewDate, (date) => this.handleViewDateChange(date));
|
|
556
714
|
}
|
|
@@ -561,6 +719,123 @@
|
|
|
561
719
|
}
|
|
562
720
|
}
|
|
563
721
|
|
|
722
|
+
/**
|
|
723
|
+
* Quick Select 패널 렌더링
|
|
724
|
+
* @returns {HTMLElement}
|
|
725
|
+
*/
|
|
726
|
+
renderQuickSelectPanel() {
|
|
727
|
+
const panel = createElement('div', `${PREFIX}__quick-select-panel`);
|
|
728
|
+
|
|
729
|
+
QUICK_SELECT_KEYS.forEach((key) => {
|
|
730
|
+
const label = this.texts.quickSelect?.[key] || key;
|
|
731
|
+
const disabled = this.isQSPresetDisabled(key);
|
|
732
|
+
const active = this.isQSPresetActive(key);
|
|
733
|
+
|
|
734
|
+
const btn = document.createElement('button');
|
|
735
|
+
btn.type = 'button';
|
|
736
|
+
btn.textContent = label;
|
|
737
|
+
btn.className = `${PREFIX}__quick-select-item`;
|
|
738
|
+
if (active) btn.classList.add(`${PREFIX}__quick-select-item--active`);
|
|
739
|
+
if (disabled) {
|
|
740
|
+
btn.classList.add(`${PREFIX}__quick-select-item--disabled`);
|
|
741
|
+
btn.disabled = true;
|
|
742
|
+
}
|
|
743
|
+
|
|
744
|
+
if (!disabled) {
|
|
745
|
+
btn.addEventListener('mousedown', (e) => {
|
|
746
|
+
e.preventDefault();
|
|
747
|
+
e.stopPropagation();
|
|
748
|
+
this.handleQuickSelect(key);
|
|
749
|
+
});
|
|
750
|
+
}
|
|
751
|
+
|
|
752
|
+
panel.appendChild(btn);
|
|
753
|
+
});
|
|
754
|
+
|
|
755
|
+
return panel;
|
|
756
|
+
}
|
|
757
|
+
|
|
758
|
+
isQSPresetDisabled(key) {
|
|
759
|
+
const { start, end } = getPresetRange(key);
|
|
760
|
+
|
|
761
|
+
if (this.minDate) {
|
|
762
|
+
const min = this.minDate instanceof Date ? this.minDate : this.minDate.date;
|
|
763
|
+
const minDay = new Date(min.getFullYear(), min.getMonth(), min.getDate());
|
|
764
|
+
if (end < minDay) return true;
|
|
765
|
+
}
|
|
766
|
+
|
|
767
|
+
if (this.maxDate) {
|
|
768
|
+
const max = this.maxDate instanceof Date ? this.maxDate : this.maxDate.date;
|
|
769
|
+
const maxDay = new Date(max.getFullYear(), max.getMonth(), max.getDate());
|
|
770
|
+
if (start > maxDay) return true;
|
|
771
|
+
}
|
|
772
|
+
|
|
773
|
+
return false;
|
|
774
|
+
}
|
|
775
|
+
|
|
776
|
+
isQSPresetActive(key) {
|
|
777
|
+
if (!this.tempValue.date || !this.tempValue.endDate) return false;
|
|
778
|
+
const { start, end } = getPresetRange(key);
|
|
779
|
+
return isSameDay(this.tempValue.date, start) && isSameDay(this.tempValue.endDate, end);
|
|
780
|
+
}
|
|
781
|
+
|
|
782
|
+
handleQuickSelect(key) {
|
|
783
|
+
let { start, end } = getPresetRange(key);
|
|
784
|
+
// minDate/maxDate로 클램핑
|
|
785
|
+
if (this.minDate) {
|
|
786
|
+
const min = this.minDate instanceof Date ? this.minDate : this.minDate.date;
|
|
787
|
+
const minDay = new Date(min.getFullYear(), min.getMonth(), min.getDate());
|
|
788
|
+
if (start < minDay) start = minDay;
|
|
789
|
+
}
|
|
790
|
+
if (this.maxDate) {
|
|
791
|
+
const max = this.maxDate instanceof Date ? this.maxDate : this.maxDate.date;
|
|
792
|
+
const maxDay = new Date(max.getFullYear(), max.getMonth(), max.getDate());
|
|
793
|
+
if (end > maxDay) end = maxDay;
|
|
794
|
+
}
|
|
795
|
+
this.tempValue = { date: start, endDate: end, time: this.tempValue.time, endTime: this.tempValue.endTime };
|
|
796
|
+
this.viewDate = new Date(start.getFullYear(), start.getMonth(), 1);
|
|
797
|
+
this.endViewDate = new Date(end.getFullYear(), end.getMonth(), 1);
|
|
798
|
+
this.navigationStep = getNavigationStepForPreset(key);
|
|
799
|
+
|
|
800
|
+
if (!this.showActions) {
|
|
801
|
+
this.value = { ...this.tempValue };
|
|
802
|
+
this.onChange?.(this.value);
|
|
803
|
+
this.close();
|
|
804
|
+
}
|
|
805
|
+
this.renderInputContent();
|
|
806
|
+
this.updateNavArrows();
|
|
807
|
+
this.renderDropdown();
|
|
808
|
+
}
|
|
809
|
+
|
|
810
|
+
/**
|
|
811
|
+
* PeriodCalendars를 지정된 컨테이너에 렌더링
|
|
812
|
+
* @param {HTMLElement} container
|
|
813
|
+
*/
|
|
814
|
+
renderPeriodCalendarsInto(container) {
|
|
815
|
+
const wrapper = createElement('div', `${PREFIX}__period-calendars`);
|
|
816
|
+
const isMobile = this.isMobileView();
|
|
817
|
+
|
|
818
|
+
const leftCal = createElement('div', `${PREFIX}__period-calendar-left`);
|
|
819
|
+
const leftCalendar = this.createCalendarElement(
|
|
820
|
+
this.viewDate,
|
|
821
|
+
(date) => this.handleViewDateChange(date),
|
|
822
|
+
{ maxViewDate: isMobile ? undefined : this.endViewDate }
|
|
823
|
+
);
|
|
824
|
+
leftCal.appendChild(leftCalendar);
|
|
825
|
+
wrapper.appendChild(leftCal);
|
|
826
|
+
|
|
827
|
+
const rightCal = createElement('div', `${PREFIX}__period-calendar-right`);
|
|
828
|
+
const rightCalendar = this.createCalendarElement(
|
|
829
|
+
this.endViewDate,
|
|
830
|
+
(date) => this.handleEndViewDateChange(date),
|
|
831
|
+
{ minViewDate: this.viewDate }
|
|
832
|
+
);
|
|
833
|
+
rightCal.appendChild(rightCalendar);
|
|
834
|
+
wrapper.appendChild(rightCal);
|
|
835
|
+
|
|
836
|
+
container.appendChild(wrapper);
|
|
837
|
+
}
|
|
838
|
+
|
|
564
839
|
renderCalendar(viewDate, onViewDateChange, opts = {}) {
|
|
565
840
|
const calendar = createElement('div', `${PREFIX}__calendar`);
|
|
566
841
|
|
|
@@ -1033,9 +1308,11 @@
|
|
|
1033
1308
|
endDate: existingStartDate,
|
|
1034
1309
|
endTime: adjustedEndTime,
|
|
1035
1310
|
};
|
|
1311
|
+
this.navigationStep = calculateNavigationStep(newDate, existingStartDate);
|
|
1036
1312
|
} else {
|
|
1037
1313
|
const adjustedEndTime = this.adjustTimeForDate(newDate, this.tempValue.endTime);
|
|
1038
1314
|
this.tempValue = { ...this.tempValue, endDate: newDate, endTime: adjustedEndTime };
|
|
1315
|
+
this.navigationStep = calculateNavigationStep(existingStartDate, newDate);
|
|
1039
1316
|
}
|
|
1040
1317
|
} else {
|
|
1041
1318
|
const adjustedTime = this.adjustTimeForDate(newDate, this.tempValue.time);
|
|
@@ -1131,6 +1408,81 @@
|
|
|
1131
1408
|
this.renderInputContent();
|
|
1132
1409
|
}
|
|
1133
1410
|
|
|
1411
|
+
handleNavigate(direction) {
|
|
1412
|
+
const dv = this.showActions ? this.tempValue : this.value;
|
|
1413
|
+
if (!dv?.date || !dv?.endDate || !this.navigationStep) return;
|
|
1414
|
+
|
|
1415
|
+
const { start, end } = shiftDateRange(dv.date, dv.endDate, this.navigationStep, direction);
|
|
1416
|
+
|
|
1417
|
+
if (this.minDate) {
|
|
1418
|
+
const min = this.minDate instanceof Date ? this.minDate : this.minDate.date;
|
|
1419
|
+
if (start < new Date(min.getFullYear(), min.getMonth(), min.getDate())) return;
|
|
1420
|
+
}
|
|
1421
|
+
if (this.maxDate) {
|
|
1422
|
+
const max = this.maxDate instanceof Date ? this.maxDate : this.maxDate.date;
|
|
1423
|
+
if (end > new Date(max.getFullYear(), max.getMonth(), max.getDate())) return;
|
|
1424
|
+
}
|
|
1425
|
+
|
|
1426
|
+
const newValue = { date: start, endDate: end, time: dv.time, endTime: dv.endTime };
|
|
1427
|
+
this.tempValue = newValue;
|
|
1428
|
+
this.value = { ...newValue };
|
|
1429
|
+
this.viewDate = new Date(start.getFullYear(), start.getMonth(), 1);
|
|
1430
|
+
this.endViewDate = new Date(end.getFullYear(), end.getMonth(), 1);
|
|
1431
|
+
this.emitChange();
|
|
1432
|
+
this.renderInputContent();
|
|
1433
|
+
this.updateNavArrows();
|
|
1434
|
+
if (this.isOpen) this.renderDropdown();
|
|
1435
|
+
}
|
|
1436
|
+
|
|
1437
|
+
isNavDisabled(direction) {
|
|
1438
|
+
const dv = this.showActions ? this.tempValue : this.value;
|
|
1439
|
+
if (!dv?.date || !dv?.endDate || !this.navigationStep) return true;
|
|
1440
|
+
const { start, end } = shiftDateRange(dv.date, dv.endDate, this.navigationStep, direction);
|
|
1441
|
+
if (direction === -1 && this.minDate) {
|
|
1442
|
+
const min = this.minDate instanceof Date ? this.minDate : this.minDate.date;
|
|
1443
|
+
return start < new Date(min.getFullYear(), min.getMonth(), min.getDate());
|
|
1444
|
+
}
|
|
1445
|
+
if (direction === 1 && this.maxDate) {
|
|
1446
|
+
const max = this.maxDate instanceof Date ? this.maxDate : this.maxDate.date;
|
|
1447
|
+
return end > new Date(max.getFullYear(), max.getMonth(), max.getDate());
|
|
1448
|
+
}
|
|
1449
|
+
return false;
|
|
1450
|
+
}
|
|
1451
|
+
|
|
1452
|
+
updateNavArrows() {
|
|
1453
|
+
if (this._prevArrowBtn) {
|
|
1454
|
+
this._prevArrowBtn.disabled = this.disabled || this.isNavDisabled(-1);
|
|
1455
|
+
}
|
|
1456
|
+
if (this._nextArrowBtn) {
|
|
1457
|
+
this._nextArrowBtn.disabled = this.disabled || this.isNavDisabled(1);
|
|
1458
|
+
}
|
|
1459
|
+
this.updatePresetLabel();
|
|
1460
|
+
}
|
|
1461
|
+
|
|
1462
|
+
getActivePresetLabel() {
|
|
1463
|
+
const dv = this.showActions ? this.tempValue : this.value;
|
|
1464
|
+
if (!dv?.date || !dv?.endDate) return null;
|
|
1465
|
+
for (const key of QUICK_SELECT_KEYS) {
|
|
1466
|
+
const { start, end } = getPresetRange(key);
|
|
1467
|
+
if (isSameDay(dv.date, start) && isSameDay(dv.endDate, end)) {
|
|
1468
|
+
return this.texts.quickSelect?.[key] || key;
|
|
1469
|
+
}
|
|
1470
|
+
}
|
|
1471
|
+
return null;
|
|
1472
|
+
}
|
|
1473
|
+
|
|
1474
|
+
updatePresetLabel() {
|
|
1475
|
+
if (!this._presetLabelEl) return;
|
|
1476
|
+
const label = this.getActivePresetLabel();
|
|
1477
|
+
if (label) {
|
|
1478
|
+
this._presetLabelEl.textContent = `${label} :`;
|
|
1479
|
+
this._presetLabelEl.style.display = '';
|
|
1480
|
+
} else {
|
|
1481
|
+
this._presetLabelEl.textContent = '';
|
|
1482
|
+
this._presetLabelEl.style.display = 'none';
|
|
1483
|
+
}
|
|
1484
|
+
}
|
|
1485
|
+
|
|
1134
1486
|
handleReset() {
|
|
1135
1487
|
this.tempValue = {};
|
|
1136
1488
|
this.close();
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
/*! Podo UI DatePicker CSS v1.0.
|
|
2
|
-
.podo-datepicker{--podo-bg-block:var(--color-bg-block,#ffffff);--podo-bg-modal:var(--color-bg-modal,#ffffff);--podo-bg-disabled:var(--color-bg-disabled,#f5f5f5);--podo-border:var(--color-border,#e0e0e0);--podo-border-hover:var(--color-border-hover,#bdbdbd);--podo-text-body:var(--color-text-body,#212121);--podo-text-sub:var(--color-text-sub,#757575);--podo-text-disabled:var(--color-text-disabled,#9e9e9e);--podo-primary:var(--color-primary,#7c3aed);--podo-primary-hover:var(--color-primary-hover,#6d28d9);--podo-primary-fill:var(--color-primary-fill,rgba(124,58,237,0.1));--podo-primary-reverse:var(--color-primary-reverse,#ffffff);--podo-default:var(--color-default,#f5f5f5);--podo-default-fill:var(--color-default-fill,#eeeeee);--podo-default-hover:var(--color-default-hover,#e0e0e0);--podo-default-reverse:var(--color-default-reverse,#212121);--podo-radius-sm:var(--radius-2,4px);--podo-radius-md:var(--radius-3,8px);--podo-spacing-1:var(--spacing-1,4px);--podo-spacing-2:var(--spacing-2,8px);--podo-spacing-3:var(--spacing-3,12px);--podo-spacing-4:var(--spacing-4,16px);--podo-spacing-5:var(--spacing-5,20px);--podo-font-size-sm:13px;--podo-font-size-md:14px;--podo-font-size-lg:16px;}.podo-datepicker{position:relative;display:inline-block;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,'Helvetica Neue',Arial,sans-serif;font-size:var(--podo-font-size-md);line-height:1.5;}.podo-datepicker__input{display:flex;align-items:center;gap:var(--podo-spacing-2);padding:var(--podo-spacing-3) var(--podo-spacing-4);background:var(--podo-bg-block);border:1px solid var(--podo-border);border-radius:var(--podo-radius-md);cursor:pointer;transition:border-color 0.2s;}.podo-datepicker__input:hover{border-color:var(--podo-border-hover);}.podo-datepicker__input--active{border-color:var(--podo-primary);}.podo-datepicker__input--disabled{background:var(--podo-bg-disabled);cursor:not-allowed;opacity:0.6;}.podo-datepicker__input-content{flex:1;display:flex;align-items:center;gap:var(--podo-spacing-2);}.podo-datepicker__part{display:flex;flex:1;align-items:center;justify-content:center;padding:0 var(--podo-spacing-2);background:none;border:none;border-radius:var(--podo-radius-sm);cursor:pointer;transition:background 0.2s;color:var(--podo-text-body);white-space:nowrap;font-variant-numeric:tabular-nums;font-family:inherit;font-size:var(--podo-font-size-md);}.podo-datepicker__part:hover{background:var(--podo-default);}.podo-datepicker__part--active{background:var(--podo-default-fill);}.podo-datepicker__part--placeholder{color:var(--podo-text-disabled);}.podo-datepicker__separator{color:var(--podo-text-body);padding:0 var(--podo-spacing-1);font-size:var(--podo-font-size-md);}.podo-datepicker__time-section{display:flex;align-items:center;justify-content:center;gap:0;}.podo-datepicker__time-select{appearance:none;-webkit-appearance:none;-moz-appearance:none;background:none;border:none;padding:0 var(--podo-spacing-2);flex:1;text-align:center;text-align-last:center;color:var(--podo-text-body);cursor:pointer;border-radius:var(--podo-radius-sm);transition:background 0.2s;font-variant-numeric:tabular-nums;font-family:inherit;font-size:var(--podo-font-size-md);}.podo-datepicker__time-select:hover{background:var(--podo-default);}.podo-datepicker__time-select:focus{outline:none;background:var(--podo-default-fill);}.podo-datepicker__time-select--placeholder{color:var(--podo-text-disabled);}.podo-datepicker__time-select:disabled{cursor:not-allowed;opacity:0.6;}.podo-datepicker__time-separator{color:var(--podo-text-body);font-size:var(--podo-font-size-md);}.podo-datepicker__icon{display:flex;align-items:center;justify-content:center;width:20px;height:20px;font-size:20px;line-height:1;color:var(--podo-text-sub);flex-shrink:0;}.podo-datepicker__dropdown{position:absolute;top:calc(100%+var(--podo-spacing-2));left:0;z-index:1000;display:flex;flex-direction:column;gap:10px;padding:var(--podo-spacing-5);background:var(--podo-bg-modal);border-radius:var(--podo-radius-md);box-shadow:0 6px 18px -3px rgba(50,50,50,0.12);}.podo-datepicker__dropdown--right{left:auto;right:0;}.podo-datepicker__calendar{display:flex;flex-direction:column;gap:10px;min-width:280px;max-width:100%;}.podo-datepicker__calendar-nav{display:flex;align-items:center;gap:var(--podo-spacing-4);height:40px;}.podo-datepicker__nav-button{display:flex;align-items:center;justify-content:center;width:40px;height:40px;background:var(--podo-default);border:none;border-radius:var(--podo-radius-md);cursor:pointer;transition:background 0.2s;}.podo-datepicker__nav-button:hover{background:var(--podo-default-hover);}.podo-datepicker__nav-button:disabled{opacity:0.5;cursor:not-allowed;}.podo-datepicker__nav-button i{font-size:20px;color:var(--podo-text-body);}.podo-datepicker__nav-title{flex:1;display:flex;align-items:center;justify-content:center;gap:var(--podo-spacing-1);}.podo-datepicker__nav-select-wrapper{position:relative;display:flex;align-items:center;}.podo-datepicker__nav-select-wrapper::after{content:'';position:absolute;right:var(--podo-spacing-2);top:50%;transform:translateY(-50%);width:0;height:0;border-left:4px solid transparent;border-right:4px solid transparent;border-top:5px solid var(--podo-text-body);pointer-events:none;}.podo-datepicker__nav-select{appearance:none;-webkit-appearance:none;-moz-appearance:none;background:none;border:none;padding:var(--podo-spacing-2) 24px var(--podo-spacing-2) var(--podo-spacing-2);border-radius:var(--podo-radius-sm);cursor:pointer;transition:background 0.2s;color:var(--podo-text-body);font-family:inherit;font-size:var(--podo-font-size-lg);font-weight:600;}.podo-datepicker__nav-select:hover{background:var(--podo-default);}.podo-datepicker__nav-select:focus{outline:none;background:var(--podo-default-fill);}.podo-datepicker__calendar-grid{display:flex;flex-direction:column;gap:var(--podo-spacing-2);padding-top:var(--podo-spacing-3);border-top:1px solid var(--podo-border);}.podo-datepicker__calendar-row{display:flex;width:100%;min-width:0;}.podo-datepicker__calendar-cell{flex:1;min-width:0;display:flex;align-items:center;justify-content:center;height:40px;font-size:var(--podo-font-size-md);background:none;border:none;border-radius:var(--podo-radius-md);cursor:pointer;transition:background 0.2s;font-family:inherit;color:var(--podo-text-body);}.podo-datepicker__calendar-cell--header{color:var(--podo-text-sub);cursor:default;font-weight:500;}.podo-datepicker__calendar-cell--other{color:var(--podo-text-disabled);}.podo-datepicker__calendar-cell--today{font-weight:600;color:var(--podo-primary);}.podo-datepicker__calendar-cell--selected{background:var(--podo-primary);color:var(--podo-primary-reverse);font-weight:600;}.podo-datepicker__calendar-cell--in-range{background:var(--podo-primary-fill);border-radius:0;}.podo-datepicker__calendar-cell--range-start{background:var(--podo-primary);color:var(--podo-primary-reverse);font-weight:600;border-radius:var(--podo-radius-md);}.podo-datepicker__calendar-cell--range-end{background:var(--podo-primary);color:var(--podo-primary-reverse);font-weight:600;border-radius:var(--podo-radius-md);}.podo-datepicker__calendar-cell--disabled{color:var(--podo-text-disabled);background:var(--podo-default);border:none;border-radius:0;outline:none;cursor:not-allowed;}.podo-datepicker__calendar-cell--disabled:hover{background:var(--podo-default);}.podo-datepicker__calendar-cell:not(.podo-datepicker__calendar-cell--header):not(.podo-datepicker__calendar-cell--selected):not(.podo-datepicker__calendar-cell--disabled):not(.podo-datepicker__calendar-cell--range-start):not(.podo-datepicker__calendar-cell--range-end):not(.podo-datepicker__calendar-cell--in-range):hover{background:var(--podo-default);}.podo-datepicker__period-calendars{display:flex;gap:var(--podo-spacing-4);}.podo-datepicker__period-calendar-left,.podo-datepicker__period-calendar-right{flex:1;}.podo-datepicker__actions{display:flex;align-items:center;justify-content:space-between;gap:var(--podo-spacing-3);padding-top:var(--podo-spacing-3);border-top:1px solid var(--podo-border);}.podo-datepicker__period-text{font-size:var(--podo-font-size-md);color:var(--podo-primary);flex:1;}.podo-datepicker__action-buttons{display:flex;gap:var(--podo-spacing-3);flex-shrink:0;}.podo-datepicker__action-button{display:inline-flex;align-items:center;justify-content:center;gap:var(--podo-spacing-2);padding:var(--podo-spacing-3) var(--podo-spacing-4);border-radius:var(--podo-radius-md);cursor:pointer;transition:background 0.2s;white-space:nowrap;font-family:inherit;font-size:var(--podo-font-size-md);}.podo-datepicker__action-button i{display:flex;align-items:center;justify-content:center;width:18px;height:18px;font-size:18px;line-height:1;}.podo-datepicker__action-button--reset{background:var(--podo-default-fill);border:1px solid var(--podo-border);color:var(--podo-default-reverse);}.podo-datepicker__action-button--reset:hover{background:var(--podo-default-hover);}.podo-datepicker__action-button--apply{background:var(--podo-primary);border:none;color:var(--podo-primary-reverse);}.podo-datepicker__action-button--apply:hover{background:var(--podo-primary-hover);}@media screen and (max-width:600px){.podo-datepicker__period-calendar-right{display:none;}}@media screen and (max-width:480px){.podo-datepicker__dropdown{padding:var(--podo-spacing-4);gap:var(--podo-spacing-3);}.podo-datepicker__calendar{min-width:260px;gap:var(--podo-spacing-3);}.podo-datepicker__calendar-nav{height:36px;gap:var(--podo-spacing-3);}.podo-datepicker__nav-button{width:36px;height:36px;}.podo-datepicker__calendar-cell{height:36px;}}@media screen and (max-width:400px){.podo-datepicker__dropdown{padding:var(--podo-spacing-3);gap:var(--podo-spacing-2);max-width:calc(100vw - var(--podo-spacing-4));box-sizing:border-box;}.podo-datepicker__calendar{min-width:0;width:100%;gap:var(--podo-spacing-2);}.podo-datepicker__calendar-nav{height:32px;gap:var(--podo-spacing-2);}.podo-datepicker__nav-button{width:32px;height:32px;}.podo-datepicker__nav-button i{font-size:18px;}.podo-datepicker__calendar-cell{height:32px;}.podo-datepicker__actions{flex-wrap:wrap;gap:var(--podo-spacing-2);}.podo-datepicker__action-button{padding:var(--podo-spacing-2) var(--podo-spacing-3);}.podo-datepicker__action-button i{width:16px;height:16px;font-size:16px;}}
|
|
1
|
+
/*! Podo UI DatePicker CSS v1.0.14 | MIT License | https://podoui.com */
|
|
2
|
+
.podo-datepicker{--podo-bg-block:var(--color-bg-block,#ffffff);--podo-bg-modal:var(--color-bg-modal,#ffffff);--podo-bg-disabled:var(--color-bg-disabled,#f5f5f5);--podo-border:var(--color-border,#e0e0e0);--podo-border-hover:var(--color-border-hover,#bdbdbd);--podo-text-body:var(--color-text-body,#212121);--podo-text-sub:var(--color-text-sub,#757575);--podo-text-disabled:var(--color-text-disabled,#9e9e9e);--podo-primary:var(--color-primary,#7c3aed);--podo-primary-hover:var(--color-primary-hover,#6d28d9);--podo-primary-fill:var(--color-primary-fill,rgba(124,58,237,0.1));--podo-primary-reverse:var(--color-primary-reverse,#ffffff);--podo-default:var(--color-default,#f5f5f5);--podo-default-fill:var(--color-default-fill,#eeeeee);--podo-default-hover:var(--color-default-hover,#e0e0e0);--podo-default-reverse:var(--color-default-reverse,#212121);--podo-radius-sm:var(--radius-2,4px);--podo-radius-md:var(--radius-3,8px);--podo-spacing-1:var(--spacing-1,4px);--podo-spacing-2:var(--spacing-2,8px);--podo-spacing-3:var(--spacing-3,12px);--podo-spacing-4:var(--spacing-4,16px);--podo-spacing-5:var(--spacing-5,20px);--podo-font-size-sm:13px;--podo-font-size-md:14px;--podo-font-size-lg:16px;}.podo-datepicker{position:relative;display:inline-block;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,'Helvetica Neue',Arial,sans-serif;font-size:var(--podo-font-size-md);line-height:1.5;}.podo-datepicker__input{display:flex;align-items:center;gap:var(--podo-spacing-2);padding:var(--podo-spacing-3) var(--podo-spacing-4);background:var(--podo-bg-block);border:1px solid var(--podo-border);border-radius:var(--podo-radius-md);cursor:pointer;transition:border-color 0.2s;}.podo-datepicker__input:hover{border-color:var(--podo-border-hover);}.podo-datepicker__input--active{border-color:var(--podo-primary);}.podo-datepicker__input--disabled{background:var(--podo-bg-disabled);cursor:not-allowed;opacity:0.6;}.podo-datepicker__input-content{flex:1;display:flex;align-items:center;gap:var(--podo-spacing-2);}.podo-datepicker__part{display:flex;flex:1;align-items:center;justify-content:center;padding:0 var(--podo-spacing-2);background:none;border:none;border-radius:var(--podo-radius-sm);cursor:pointer;transition:background 0.2s;color:var(--podo-text-body);white-space:nowrap;font-variant-numeric:tabular-nums;font-family:inherit;font-size:var(--podo-font-size-md);}.podo-datepicker__part:hover{background:var(--podo-default);}.podo-datepicker__part--active{background:var(--podo-default-fill);}.podo-datepicker__part--placeholder{color:var(--podo-text-disabled);}.podo-datepicker__separator{color:var(--podo-text-body);padding:0 var(--podo-spacing-1);font-size:var(--podo-font-size-md);}.podo-datepicker__time-section{display:flex;align-items:center;justify-content:center;gap:0;}.podo-datepicker__time-select{appearance:none;-webkit-appearance:none;-moz-appearance:none;background:none;border:none;padding:0 var(--podo-spacing-2);flex:1;text-align:center;text-align-last:center;color:var(--podo-text-body);cursor:pointer;border-radius:var(--podo-radius-sm);transition:background 0.2s;font-variant-numeric:tabular-nums;font-family:inherit;font-size:var(--podo-font-size-md);}.podo-datepicker__time-select:hover{background:var(--podo-default);}.podo-datepicker__time-select:focus{outline:none;background:var(--podo-default-fill);}.podo-datepicker__time-select--placeholder{color:var(--podo-text-disabled);}.podo-datepicker__time-select:disabled{cursor:not-allowed;opacity:0.6;}.podo-datepicker__time-separator{color:var(--podo-text-body);font-size:var(--podo-font-size-md);}.podo-datepicker__icon{display:flex;align-items:center;justify-content:center;width:20px;height:20px;font-size:20px;line-height:1;color:var(--podo-text-sub);flex-shrink:0;}.podo-datepicker__input--with-nav{padding:0;}.podo-datepicker__nav-arrow{display:flex;align-items:center;justify-content:center;width:40px;min-height:100%;background:none;border:none;cursor:pointer;transition:background 0.2s;flex-shrink:0;}.podo-datepicker__nav-arrow:hover:not(:disabled){background:var(--podo-default-hover);}.podo-datepicker__nav-arrow:disabled{opacity:0.4;cursor:not-allowed;}.podo-datepicker__nav-arrow i{font-size:16px;color:var(--podo-text-body);}.podo-datepicker__nav-arrow--left{border-right:1px solid var(--podo-border);border-radius:var(--podo-radius-md) 0 0 var(--podo-radius-md);}.podo-datepicker__nav-arrow--right{border-left:1px solid var(--podo-border);border-radius:0 var(--podo-radius-md) var(--podo-radius-md) 0;}.podo-datepicker__preset-label{font-size:var(--podo-font-size-md);color:var(--podo-text-body);white-space:nowrap;flex-shrink:0;padding-left:var(--podo-spacing-3);font-weight:600;}.podo-datepicker__dropdown{position:absolute;top:calc(100%+var(--podo-spacing-2));left:0;z-index:1000;display:flex;flex-direction:column;gap:10px;padding:var(--podo-spacing-5);background:var(--podo-bg-modal);border-radius:var(--podo-radius-md);box-shadow:0 6px 18px -3px rgba(50,50,50,0.12);}.podo-datepicker__dropdown--right{left:auto;right:0;}.podo-datepicker__calendar{display:flex;flex-direction:column;gap:10px;min-width:280px;max-width:100%;}.podo-datepicker__calendar-nav{display:flex;align-items:center;gap:var(--podo-spacing-4);height:40px;}.podo-datepicker__nav-button{display:flex;align-items:center;justify-content:center;width:40px;height:40px;background:var(--podo-default);border:none;border-radius:var(--podo-radius-md);cursor:pointer;transition:background 0.2s;}.podo-datepicker__nav-button:hover{background:var(--podo-default-hover);}.podo-datepicker__nav-button:disabled{opacity:0.5;cursor:not-allowed;}.podo-datepicker__nav-button i{font-size:20px;color:var(--podo-text-body);}.podo-datepicker__nav-title{flex:1;display:flex;align-items:center;justify-content:center;gap:var(--podo-spacing-1);}.podo-datepicker__nav-select-wrapper{position:relative;display:flex;align-items:center;}.podo-datepicker__nav-select-wrapper::after{content:'';position:absolute;right:var(--podo-spacing-2);top:50%;transform:translateY(-50%);width:0;height:0;border-left:4px solid transparent;border-right:4px solid transparent;border-top:5px solid var(--podo-text-body);pointer-events:none;}.podo-datepicker__nav-select{appearance:none;-webkit-appearance:none;-moz-appearance:none;background:none;border:none;padding:var(--podo-spacing-2) 24px var(--podo-spacing-2) var(--podo-spacing-2);border-radius:var(--podo-radius-sm);cursor:pointer;transition:background 0.2s;color:var(--podo-text-body);font-family:inherit;font-size:var(--podo-font-size-lg);font-weight:600;}.podo-datepicker__nav-select:hover{background:var(--podo-default);}.podo-datepicker__nav-select:focus{outline:none;background:var(--podo-default-fill);}.podo-datepicker__calendar-grid{display:flex;flex-direction:column;gap:var(--podo-spacing-2);padding-top:var(--podo-spacing-3);border-top:1px solid var(--podo-border);}.podo-datepicker__calendar-row{display:flex;width:100%;min-width:0;}.podo-datepicker__calendar-cell{flex:1;min-width:0;display:flex;align-items:center;justify-content:center;height:40px;font-size:var(--podo-font-size-md);background:none;border:none;border-radius:var(--podo-radius-md);cursor:pointer;transition:background 0.2s;font-family:inherit;color:var(--podo-text-body);}.podo-datepicker__calendar-cell--header{color:var(--podo-text-sub);cursor:default;font-weight:500;}.podo-datepicker__calendar-cell--other{color:var(--podo-text-disabled);}.podo-datepicker__calendar-cell--today{font-weight:600;color:var(--podo-primary);}.podo-datepicker__calendar-cell--selected{background:var(--podo-primary);color:var(--podo-primary-reverse);font-weight:600;}.podo-datepicker__calendar-cell--in-range{background:var(--podo-primary-fill);border-radius:0;}.podo-datepicker__calendar-cell--range-start{background:var(--podo-primary);color:var(--podo-primary-reverse);font-weight:600;border-radius:var(--podo-radius-md);}.podo-datepicker__calendar-cell--range-end{background:var(--podo-primary);color:var(--podo-primary-reverse);font-weight:600;border-radius:var(--podo-radius-md);}.podo-datepicker__calendar-cell--disabled{color:var(--podo-text-disabled);background:var(--podo-default);border:none;border-radius:0;outline:none;cursor:not-allowed;}.podo-datepicker__calendar-cell--disabled:hover{background:var(--podo-default);}.podo-datepicker__calendar-cell:not(.podo-datepicker__calendar-cell--header):not(.podo-datepicker__calendar-cell--selected):not(.podo-datepicker__calendar-cell--disabled):not(.podo-datepicker__calendar-cell--range-start):not(.podo-datepicker__calendar-cell--range-end):not(.podo-datepicker__calendar-cell--in-range):hover{background:var(--podo-default);}.podo-datepicker__period-calendars{display:flex;gap:var(--podo-spacing-4);}.podo-datepicker__period-calendar-left,.podo-datepicker__period-calendar-right{flex:1;}.podo-datepicker__actions{display:flex;align-items:center;justify-content:space-between;gap:var(--podo-spacing-3);padding-top:var(--podo-spacing-3);border-top:1px solid var(--podo-border);}.podo-datepicker__period-text{font-size:var(--podo-font-size-md);color:var(--podo-primary);flex:1;}.podo-datepicker__action-buttons{display:flex;gap:var(--podo-spacing-3);flex-shrink:0;}.podo-datepicker__action-button{display:inline-flex;align-items:center;justify-content:center;gap:var(--podo-spacing-2);padding:var(--podo-spacing-3) var(--podo-spacing-4);border-radius:var(--podo-radius-md);cursor:pointer;transition:background 0.2s;white-space:nowrap;font-family:inherit;font-size:var(--podo-font-size-md);}.podo-datepicker__action-button i{display:flex;align-items:center;justify-content:center;width:18px;height:18px;font-size:18px;line-height:1;}.podo-datepicker__action-button--reset{background:var(--podo-default-fill);border:1px solid var(--podo-border);color:var(--podo-default-reverse);}.podo-datepicker__action-button--reset:hover{background:var(--podo-default-hover);}.podo-datepicker__action-button--apply{background:var(--podo-primary);border:none;color:var(--podo-primary-reverse);}.podo-datepicker__action-button--apply:hover{background:var(--podo-primary-hover);}.podo-datepicker__dropdown-body{display:flex;gap:var(--podo-spacing-4);min-width:0;}.podo-datepicker__quick-select-panel{display:flex;flex-direction:column;gap:var(--podo-spacing-1);min-width:100px;padding-right:var(--podo-spacing-4);border-right:1px solid var(--podo-border);flex-shrink:0;}.podo-datepicker__quick-select-item{display:flex;align-items:center;padding:var(--podo-spacing-2) var(--podo-spacing-3);background:none;border:none;border-radius:var(--podo-radius-sm);cursor:pointer;transition:background 0.2s,color 0.2s;color:var(--podo-text-body);white-space:nowrap;text-align:left;font-size:14px;line-height:1.5;}.podo-datepicker__quick-select-item:hover:not(.podo-datepicker__quick-select-item--disabled):not(.podo-datepicker__quick-select-item--active){background:var(--podo-default-hover);}.podo-datepicker__quick-select-item--active{color:var(--podo-primary);background:var(--podo-primary-fill,rgba(124,58,237,0.08));font-weight:600;}.podo-datepicker__quick-select-item--disabled{color:var(--podo-text-disabled,#adb5bd);cursor:not-allowed;}@media screen and (max-width:600px){.podo-datepicker__period-calendar-right{display:none;}.podo-datepicker__quick-select-panel{min-width:80px;padding-right:var(--podo-spacing-3);}.podo-datepicker__quick-select-item{font-size:13px;padding:var(--podo-spacing-2);}}@media screen and (max-width:480px){.podo-datepicker__dropdown{padding:var(--podo-spacing-4);gap:var(--podo-spacing-3);}.podo-datepicker__calendar{min-width:260px;gap:var(--podo-spacing-3);}.podo-datepicker__calendar-nav{height:36px;gap:var(--podo-spacing-3);}.podo-datepicker__nav-button{width:36px;height:36px;}.podo-datepicker__calendar-cell{height:36px;}}@media screen and (max-width:400px){.podo-datepicker__dropdown{padding:var(--podo-spacing-3);gap:var(--podo-spacing-2);max-width:calc(100vw - var(--podo-spacing-4));box-sizing:border-box;}.podo-datepicker__calendar{min-width:0;width:100%;gap:var(--podo-spacing-2);}.podo-datepicker__calendar-nav{height:32px;gap:var(--podo-spacing-2);}.podo-datepicker__nav-button{width:32px;height:32px;}.podo-datepicker__nav-button i{font-size:18px;}.podo-datepicker__calendar-cell{height:32px;}.podo-datepicker__actions{flex-wrap:wrap;gap:var(--podo-spacing-2);}.podo-datepicker__action-button{padding:var(--podo-spacing-2) var(--podo-spacing-3);}.podo-datepicker__action-button i{width:16px;height:16px;font-size:16px;}.podo-datepicker__quick-select-panel{display:none;}.podo-datepicker__nav-arrow{width:32px;}.podo-datepicker__nav-arrow i{font-size:14px;}.podo-datepicker__preset-label{display:none;}}
|