@keenmate/web-daterangepicker 1.11.0 → 1.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/src/css/_base.css CHANGED
@@ -1,232 +1,285 @@
1
- /* ==============================================================================
2
- DATE RANGE PICKER - BASE STYLES
3
- ==============================================================================
4
- Base container styles, input field, and calendar popup */
5
-
6
- /* ==============================================================================
7
- DATE PICKER INPUT FIELD
8
- ============================================================================== */
9
-
10
- /* Input element itself (actual <input> tag) */
11
- .drp-input {
12
- width: 100%;
13
- font-family: var(--drp-font-family, var(--base-font-family, inherit));
14
- font-size: var(--drp-input-size-md-font);
15
- line-height: var(--drp-line-height-normal);
16
- color: var(--drp-input-color);
17
- background-color: var(--drp-input-bg);
18
- border: var(--drp-input-border);
19
- border-radius: var(--drp-border-radius);
20
- padding: var(--drp-input-size-md-padding-v) var(--drp-input-size-md-padding-h);
21
- padding-right: calc(var(--drp-input-size-md-padding-h) * 2.5); /* Extra space for calendar icon */
22
- height: var(--drp-input-size-md-height);
23
- box-sizing: border-box;
24
- transition: border-color var(--drp-transition-fast) var(--drp-easing-snappy),
25
- box-shadow var(--drp-transition-fast) var(--drp-easing-snappy);
26
- }
27
-
28
- .drp-input::placeholder {
29
- color: var(--drp-input-placeholder-color);
30
- opacity: 0.6;
31
- }
32
-
33
- .drp-input:hover:not(:disabled) {
34
- border: var(--drp-input-border-hover);
35
- }
36
-
37
- .drp-input:focus {
38
- outline: none;
39
- border: var(--drp-input-border-focus);
40
- box-shadow: 0 0 0 var(--drp-input-focus-shadow-size) var(--drp-input-focus-shadow-color);
41
- }
42
-
43
- .drp-input:disabled {
44
- opacity: var(--drp-opacity-disabled);
45
- cursor: not-allowed;
46
- background-color: var(--drp-input-bg-disabled);
47
- }
48
-
49
- /* Input Size Variants */
50
- .drp-input.drp-input--xs {
51
- font-size: var(--drp-input-size-xs-font);
52
- padding: var(--drp-input-size-xs-padding-v) var(--drp-input-size-xs-padding-h);
53
- padding-right: calc(var(--drp-input-size-xs-padding-h) * 2.5);
54
- height: var(--drp-input-size-xs-height);
55
- }
56
-
57
- .drp-input.drp-input--sm {
58
- font-size: var(--drp-input-size-sm-font);
59
- padding: var(--drp-input-size-sm-padding-v) var(--drp-input-size-sm-padding-h);
60
- padding-right: calc(var(--drp-input-size-sm-padding-h) * 2.5);
61
- height: var(--drp-input-size-sm-height);
62
- }
63
-
64
- .drp-input.drp-input--lg {
65
- font-size: var(--drp-input-size-lg-font);
66
- padding: var(--drp-input-size-lg-padding-v) var(--drp-input-size-lg-padding-h);
67
- padding-right: calc(var(--drp-input-size-lg-padding-h) * 2.5);
68
- height: var(--drp-input-size-lg-height);
69
- }
70
-
71
- .drp-input.drp-input--xl {
72
- font-size: var(--drp-input-size-xl-font);
73
- padding: var(--drp-input-size-xl-padding-v) var(--drp-input-size-xl-padding-h);
74
- padding-right: calc(var(--drp-input-size-xl-padding-h) * 2.5);
75
- height: var(--drp-input-size-xl-height);
76
- }
77
-
78
- /* ==============================================================================
79
- INPUT WRAPPER CONTAINER (for positioning calendar icon)
80
- ============================================================================== */
81
-
82
- .drp-date-picker-input {
83
- position: relative;
84
- cursor: pointer;
85
- display: inline-block;
86
- width: 100%;
87
- }
88
-
89
- /* Calendar icon */
90
- .drp-date-picker-input::after {
91
- content: '📅';
92
- position: absolute;
93
- right: var(--drp-input-size-md-padding-h);
94
- top: 50%;
95
- transform: translateY(-50%);
96
- pointer-events: none;
97
- opacity: var(--drp-input-icon-opacity);
98
- font-size: var(--drp-input-size-md-icon-size);
99
- }
100
-
101
- /* Size variant icon positioning */
102
- .drp-date-picker-input.drp-date-picker-input--xs::after {
103
- right: var(--drp-input-size-xs-padding-h);
104
- font-size: var(--drp-input-size-xs-icon-size);
105
- }
106
-
107
- .drp-date-picker-input.drp-date-picker-input--sm::after {
108
- right: var(--drp-input-size-sm-padding-h);
109
- font-size: var(--drp-input-size-sm-icon-size);
110
- }
111
-
112
- .drp-date-picker-input.drp-date-picker-input--lg::after {
113
- right: var(--drp-input-size-lg-padding-h);
114
- font-size: var(--drp-input-size-lg-icon-size);
115
- }
116
-
117
- .drp-date-picker-input.drp-date-picker-input--xl::after {
118
- right: var(--drp-input-size-xl-padding-h);
119
- font-size: var(--drp-input-size-xl-icon-size);
120
- }
121
-
122
- /* ==============================================================================
123
- CALENDAR POPUP CONTAINER
124
- ============================================================================== */
125
-
126
- .drp-date-picker {
127
- position: absolute;
128
- z-index: var(--drp-z-index-dropdown);
129
- font-family: var(--drp-font-family, var(--base-font-family, inherit));
130
- background: var(--drp-dropdown-bg);
131
- border: var(--drp-border);
132
- border-radius: var(--drp-border-radius-lg);
133
- box-shadow: var(--drp-shadow-xl);
134
- padding: var(--drp-spacing-md);
135
- min-width: var(--drp-month-min-width);
136
- max-width: var(--drp-calendar-max-width);
137
- box-sizing: border-box;
138
- user-select: none;
139
- }
140
-
141
- /* Hide by default */
142
- .drp-date-picker:not(.drp-date-picker--visible) {
143
- display: none;
144
- }
145
-
146
- /* Inline mode modifier */
147
- .drp-date-picker--inline {
148
- position: relative !important;
149
- display: block !important;
150
- z-index: auto;
151
- min-width: 0;
152
- max-width: 100%;
153
- width: fit-content;
154
- box-sizing: border-box;
155
- }
156
-
157
- /* ==============================================================================
158
- MONTHS CONTAINER (MULTI-MONTH LAYOUT)
159
- ============================================================================== */
160
-
161
- .drp-date-picker__months {
162
- display: flex;
163
- gap: var(--drp-spacing-lg);
164
- }
165
-
166
- /* Allow wrapping for inline mode on small screens */
167
- .drp-date-picker--inline .drp-date-picker__months {
168
- flex-wrap: wrap;
169
- }
170
-
171
- /* Grid layout mode */
172
- .drp-date-picker__months--grid {
173
- display: grid;
174
- grid-template-columns: repeat(var(--drp-grid-columns, 3), minmax(0, 1fr));
175
- grid-template-rows: repeat(var(--drp-grid-rows, 2), auto);
176
- gap: var(--drp-spacing-lg);
177
- width: 100%;
178
- }
179
-
180
- /* Responsive breakpoints for grid */
181
- @media (max-width: 1200px) {
182
- .drp-date-picker__months--grid {
183
- grid-template-columns: repeat(min(var(--drp-grid-columns, 3), 3), minmax(0, 1fr));
184
- }
185
- }
186
-
187
- @media (max-width: 768px) {
188
- .drp-date-picker__months--grid {
189
- grid-template-columns: repeat(min(var(--drp-grid-columns, 3), 2), minmax(0, 1fr));
190
- }
191
- }
192
-
193
- @media (max-width: 480px) {
194
- .drp-date-picker__months--grid {
195
- grid-template-columns: minmax(0, 1fr);
196
- }
197
- }
198
-
199
- /* ==============================================================================
200
- INDIVIDUAL MONTH CONTAINER
201
- ============================================================================== */
202
-
203
- .drp-date-picker__month {
204
- flex: 1;
205
- min-width: var(--drp-month-min-width);
206
- /* Make month a flex column container so calendar-container can fill vertical space */
207
- display: flex;
208
- flex-direction: column;
209
- }
210
-
211
- /* Allow shrinking for inline mode */
212
- .drp-date-picker--inline .drp-date-picker__month {
213
- min-width: var(--drp-month-min-width-inline);
214
- }
215
-
216
- /* Grid layout: remove min-width to allow proper grid sizing */
217
- .drp-date-picker__months--grid .drp-date-picker__month {
218
- min-width: 0;
219
- width: 100%;
220
- }
221
-
222
- /* Calendar container for swapping between calendar grid and rolling selector */
223
- .drp-date-picker__calendar-container {
224
- position: relative; /* Establishes containing block for absolute positioning */
225
- /* Fill available vertical space in month container */
226
- flex: 1;
227
- display: flex;
228
- flex-direction: column;
229
- min-height: 0; /* Allow flex item to shrink below content size if needed */
230
- /* Calendar grid (weekdays + days) determines minimum size
231
- Rolling selector overlays absolutely and fills this expanded space */
232
- }
1
+ /* ==============================================================================
2
+ DATE RANGE PICKER - BASE STYLES
3
+ ==============================================================================
4
+ Base container styles, input field, and calendar popup */
5
+
6
+ /* ==============================================================================
7
+ DATE PICKER INPUT FIELD
8
+ ============================================================================== */
9
+
10
+ /* Input element itself (actual <input> tag) */
11
+ .drp-input {
12
+ width: 100%;
13
+ font-family: var(--drp-font-family, var(--base-font-family, inherit));
14
+ font-size: var(--drp-input-size-md-font);
15
+ line-height: var(--drp-line-height-normal);
16
+ color: var(--drp-input-color);
17
+ background-color: var(--drp-input-bg);
18
+ border: var(--drp-input-border);
19
+ border-radius: var(--drp-border-radius);
20
+ padding: var(--drp-input-size-md-padding-v) var(--drp-input-size-md-padding-h);
21
+ padding-right: calc(var(--drp-input-size-md-padding-h) * 2.5); /* Extra space for calendar icon */
22
+ height: var(--drp-input-size-md-height);
23
+ box-sizing: border-box;
24
+ transition: border-color var(--drp-transition-fast) var(--drp-easing-snappy),
25
+ box-shadow var(--drp-transition-fast) var(--drp-easing-snappy);
26
+ }
27
+
28
+ .drp-input::placeholder {
29
+ color: var(--drp-input-placeholder-color);
30
+ opacity: 0.6;
31
+ }
32
+
33
+ .drp-input:hover:not(:disabled) {
34
+ border: var(--drp-input-border-hover);
35
+ }
36
+
37
+ .drp-input:focus {
38
+ outline: none;
39
+ border: var(--drp-input-border-focus);
40
+ box-shadow: 0 0 0 var(--drp-input-focus-shadow-size) var(--drp-input-focus-shadow-color);
41
+ }
42
+
43
+ .drp-input:disabled {
44
+ opacity: var(--drp-opacity-disabled);
45
+ cursor: not-allowed;
46
+ background-color: var(--drp-input-bg-disabled);
47
+ }
48
+
49
+ /* Input Size Variants */
50
+ .drp-input.drp-input--xs {
51
+ font-size: var(--drp-input-size-xs-font);
52
+ padding: var(--drp-input-size-xs-padding-v) var(--drp-input-size-xs-padding-h);
53
+ padding-right: calc(var(--drp-input-size-xs-padding-h) * 2.5);
54
+ height: var(--drp-input-size-xs-height);
55
+ }
56
+
57
+ .drp-input.drp-input--sm {
58
+ font-size: var(--drp-input-size-sm-font);
59
+ padding: var(--drp-input-size-sm-padding-v) var(--drp-input-size-sm-padding-h);
60
+ padding-right: calc(var(--drp-input-size-sm-padding-h) * 2.5);
61
+ height: var(--drp-input-size-sm-height);
62
+ }
63
+
64
+ .drp-input.drp-input--lg {
65
+ font-size: var(--drp-input-size-lg-font);
66
+ padding: var(--drp-input-size-lg-padding-v) var(--drp-input-size-lg-padding-h);
67
+ padding-right: calc(var(--drp-input-size-lg-padding-h) * 2.5);
68
+ height: var(--drp-input-size-lg-height);
69
+ }
70
+
71
+ .drp-input.drp-input--xl {
72
+ font-size: var(--drp-input-size-xl-font);
73
+ padding: var(--drp-input-size-xl-padding-v) var(--drp-input-size-xl-padding-h);
74
+ padding-right: calc(var(--drp-input-size-xl-padding-h) * 2.5);
75
+ height: var(--drp-input-size-xl-height);
76
+ }
77
+
78
+ /* ==============================================================================
79
+ INPUT WRAPPER CONTAINER (for positioning calendar icon)
80
+ ============================================================================== */
81
+
82
+ .drp-date-picker-input {
83
+ position: relative;
84
+ cursor: pointer;
85
+ display: inline-block;
86
+ width: 100%;
87
+ }
88
+
89
+ /* Calendar icon */
90
+ .drp-date-picker-input::after {
91
+ content: '📅';
92
+ position: absolute;
93
+ right: var(--drp-input-size-md-padding-h);
94
+ top: 50%;
95
+ transform: translateY(-50%);
96
+ pointer-events: none;
97
+ opacity: var(--drp-input-icon-opacity);
98
+ font-size: var(--drp-input-size-md-icon-size);
99
+ }
100
+
101
+ /* Size variant icon positioning */
102
+ .drp-date-picker-input.drp-date-picker-input--xs::after {
103
+ right: var(--drp-input-size-xs-padding-h);
104
+ font-size: var(--drp-input-size-xs-icon-size);
105
+ }
106
+
107
+ .drp-date-picker-input.drp-date-picker-input--sm::after {
108
+ right: var(--drp-input-size-sm-padding-h);
109
+ font-size: var(--drp-input-size-sm-icon-size);
110
+ }
111
+
112
+ .drp-date-picker-input.drp-date-picker-input--lg::after {
113
+ right: var(--drp-input-size-lg-padding-h);
114
+ font-size: var(--drp-input-size-lg-icon-size);
115
+ }
116
+
117
+ .drp-date-picker-input.drp-date-picker-input--xl::after {
118
+ right: var(--drp-input-size-xl-padding-h);
119
+ font-size: var(--drp-input-size-xl-icon-size);
120
+ }
121
+
122
+ /* ==============================================================================
123
+ CALENDAR POPUP CONTAINER
124
+ ============================================================================== */
125
+
126
+ .drp-date-picker {
127
+ position: fixed;
128
+ z-index: var(--drp-z-index-dropdown);
129
+ font-family: var(--drp-font-family, var(--base-font-family, inherit));
130
+ background: var(--drp-dropdown-bg);
131
+ border: var(--drp-border);
132
+ border-radius: var(--drp-border-radius-lg);
133
+ box-shadow: var(--drp-shadow-xl);
134
+ padding: var(--drp-spacing-md);
135
+ min-width: var(--drp-month-min-width);
136
+ max-width: var(--drp-calendar-max-width);
137
+ box-sizing: border-box;
138
+ user-select: none;
139
+ }
140
+
141
+ /* Non-inline pickers (floating + modal) use a flex column layout so that
142
+ the months area is the only scrollable region — header, summary, and
143
+ action bar stay anchored at the top/bottom regardless of how tall the
144
+ multi-month content is. Without this, when the calendar is taller than
145
+ its constrained height (modal max-height, or Floating UI's size
146
+ middleware in floating mode), the action buttons scroll out of view.
147
+ `min-height: 0` on the months area is required so it can shrink below
148
+ its intrinsic content size — flex defaults to `min-height: auto` which
149
+ prevents shrinking and breaks the inner scroll. */
150
+ .drp-date-picker:not(.drp-date-picker--inline) {
151
+ display: flex;
152
+ flex-direction: column;
153
+ overflow: hidden;
154
+ }
155
+
156
+ .drp-date-picker:not(.drp-date-picker--inline) > .drp-date-picker__months,
157
+ .drp-date-picker:not(.drp-date-picker--inline) > .drp-date-picker__months--grid {
158
+ flex: 1 1 auto;
159
+ min-height: 0;
160
+ overflow-y: auto;
161
+ /* Inline padding gives breathing room for visual decoration that
162
+ extends beyond the day-cell box: the focused-day outline (4px:
163
+ 2px offset + 2px width) and the badge cell's hover scale(1.05).
164
+ Two reasons this matters:
165
+ 1. Without the padding, first-column cells have their outline
166
+ clipped on the left.
167
+ 2. `overflow-y: auto` silently coerces `overflow-x: visible` to
168
+ `auto`, so any pixel of horizontal overflow trips a scrollbar.
169
+ The badge scale on the rightmost cell would do exactly that. */
170
+ padding-inline: 4px;
171
+ }
172
+
173
+ .drp-date-picker:not(.drp-date-picker--inline) > .drp-date-picker__unified-header,
174
+ .drp-date-picker:not(.drp-date-picker--inline) > .drp-date-picker__summary,
175
+ .drp-date-picker:not(.drp-date-picker--inline) > .drp-date-picker__actions {
176
+ flex-shrink: 0;
177
+ }
178
+
179
+ /* Per-month headers (month name + prev/next nav, or static text in unified
180
+ mode) stick to the top of the scrolling months area so they stay visible
181
+ as the user scrolls through days. For multi-month layouts in a single row,
182
+ all headers stick simultaneously and look like a continuous header bar.
183
+ For grid layouts, each row's headers stick when that row is being scrolled
184
+ through, then unstick once the row is fully past. */
185
+ .drp-date-picker:not(.drp-date-picker--inline) .drp-date-picker__month .drp-date-picker__header {
186
+ position: sticky;
187
+ top: 0;
188
+ background: var(--drp-dropdown-bg);
189
+ /* Above day cells (z-index: auto = 0) so the days scroll behind the header
190
+ instead of bleeding through it. */
191
+ z-index: 2;
192
+ }
193
+
194
+ /* Hide by default */
195
+ .drp-date-picker:not(.drp-date-picker--visible) {
196
+ display: none;
197
+ }
198
+
199
+ /* Inline mode modifier */
200
+ .drp-date-picker--inline {
201
+ position: relative !important;
202
+ display: block !important;
203
+ z-index: auto;
204
+ min-width: 0;
205
+ max-width: 100%;
206
+ width: fit-content;
207
+ box-sizing: border-box;
208
+ }
209
+
210
+ /* ==============================================================================
211
+ MONTHS CONTAINER (MULTI-MONTH LAYOUT)
212
+ ============================================================================== */
213
+
214
+ .drp-date-picker__months {
215
+ display: flex;
216
+ gap: var(--drp-spacing-lg);
217
+ }
218
+
219
+ /* Allow wrapping for inline mode on small screens */
220
+ .drp-date-picker--inline .drp-date-picker__months {
221
+ flex-wrap: wrap;
222
+ }
223
+
224
+ /* Grid layout mode */
225
+ .drp-date-picker__months--grid {
226
+ display: grid;
227
+ grid-template-columns: repeat(var(--drp-grid-columns, 3), minmax(0, 1fr));
228
+ grid-template-rows: repeat(var(--drp-grid-rows, 2), auto);
229
+ gap: var(--drp-spacing-lg);
230
+ width: 100%;
231
+ }
232
+
233
+ /* Responsive breakpoints for grid */
234
+ @media (max-width: 1200px) {
235
+ .drp-date-picker__months--grid {
236
+ grid-template-columns: repeat(min(var(--drp-grid-columns, 3), 3), minmax(0, 1fr));
237
+ }
238
+ }
239
+
240
+ @media (max-width: 768px) {
241
+ .drp-date-picker__months--grid {
242
+ grid-template-columns: repeat(min(var(--drp-grid-columns, 3), 2), minmax(0, 1fr));
243
+ }
244
+ }
245
+
246
+ @media (max-width: 480px) {
247
+ .drp-date-picker__months--grid {
248
+ grid-template-columns: minmax(0, 1fr);
249
+ }
250
+ }
251
+
252
+ /* ==============================================================================
253
+ INDIVIDUAL MONTH CONTAINER
254
+ ============================================================================== */
255
+
256
+ .drp-date-picker__month {
257
+ flex: 1;
258
+ min-width: var(--drp-month-min-width);
259
+ /* Make month a flex column container so calendar-container can fill vertical space */
260
+ display: flex;
261
+ flex-direction: column;
262
+ }
263
+
264
+ /* Allow shrinking for inline mode */
265
+ .drp-date-picker--inline .drp-date-picker__month {
266
+ min-width: var(--drp-month-min-width-inline);
267
+ }
268
+
269
+ /* Grid layout: remove min-width to allow proper grid sizing */
270
+ .drp-date-picker__months--grid .drp-date-picker__month {
271
+ min-width: 0;
272
+ width: 100%;
273
+ }
274
+
275
+ /* Calendar container for swapping between calendar grid and rolling selector */
276
+ .drp-date-picker__calendar-container {
277
+ position: relative; /* Establishes containing block for absolute positioning */
278
+ /* Fill available vertical space in month container */
279
+ flex: 1;
280
+ display: flex;
281
+ flex-direction: column;
282
+ min-height: 0; /* Allow flex item to shrink below content size if needed */
283
+ /* Calendar grid (weekdays + days) determines minimum size
284
+ Rolling selector overlays absolutely and fills this expanded space */
285
+ }
@@ -206,6 +206,20 @@
206
206
  border-style: dashed !important;
207
207
  }
208
208
 
209
+ /* --------------------------------------
210
+ Hover preview (range mode, half-selected state)
211
+ Paints the would-be range live as the user moves the mouse looking for an
212
+ end date. Quieter than drag-preview by design: this is exploratory, not
213
+ committed action.
214
+ -------------------------------------- */
215
+ .drp-date-picker__day--hover-preview {
216
+ background-color: color-mix(in srgb, var(--drp-day-range-bg) calc(var(--drp-day-hover-preview-bg-opacity) * 100%), transparent);
217
+ }
218
+
219
+ .drp-date-picker__day--hover-preview-invalid {
220
+ background-color: color-mix(in srgb, var(--drp-day-drag-invalid-bg) calc(var(--drp-day-hover-preview-invalid-bg-opacity) * 100%), transparent);
221
+ }
222
+
209
223
  /* --------------------------------------
210
224
  Invalid range states (showInvalidRange)
211
225
  Used when beforeDateSelectCallback returns { action: 'restore', showInvalidRange: true }
@@ -127,7 +127,14 @@
127
127
  flex: 1;
128
128
  min-width: 0; /* Allow flex child to shrink below content size (enables ellipsis on items) */
129
129
  height: 100%; /* Fill parent height */
130
+ /* Without border-box, the 1px top+bottom border pushes the rendered height to
131
+ 100% + 2px, overflowing the rolling-selector container and overlapping the
132
+ elements below it. */
133
+ box-sizing: border-box;
130
134
  overflow-y: auto;
135
+ /* Prevent scroll chaining: when the user reaches the top/bottom of this list,
136
+ the wheel/touch event would otherwise bubble up and scroll the page. */
137
+ overscroll-behavior: contain;
131
138
  border: var(--drp-rolling-border);
132
139
  border-radius: var(--drp-border-radius-lg);
133
140
  /* Flex layout to control child item sizing */