@veritree/ui 0.76.1-1 → 0.76.1-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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@veritree/ui",
3
- "version": "0.76.1-1",
3
+ "version": "0.76.1-3",
4
4
  "description": "veritree ui library",
5
5
  "type": "module",
6
6
  "main": "index.js",
@@ -15,10 +15,10 @@
15
15
  "release": "np --no-tests --no-2fa"
16
16
  },
17
17
  "dependencies": {
18
- "@floating-ui/dom": "^1.2.0",
18
+ "@floating-ui/dom": "^1.6.5",
19
19
  "@linusborg/vue-simple-portal": "^0.1.5",
20
- "@veritree/icons": "^0.60.0",
21
- "v-calendar": "^2.4.2"
20
+ "@sum.cumo/vue-datepicker": "^4.0.0",
21
+ "@veritree/icons": "^0.62.0"
22
22
  },
23
23
  "devDependencies": {
24
24
  "@babel/eslint-parser": "^7.23.10",
@@ -33,7 +33,7 @@
33
33
  "stylelint-config-prettier": "^9.0.5",
34
34
  "stylelint-config-recommended-vue": "^1.5.0",
35
35
  "stylelint-config-standard": "^36.0.0",
36
- "tailwindcss": "^3.4.1"
36
+ "tailwindcss": "^3.4.3"
37
37
  },
38
38
  "engines": {
39
39
  "npm": ">=8.0.0",
@@ -2,10 +2,8 @@
2
2
  <VTPopover>
3
3
  <VTPopoverTrigger ref="trigger">
4
4
  <button :class="classComputed" :disabled="disabled" @click.prevent>
5
- <span v-if="valueModel">{{
6
- new Date(valueModel).toISOString().split('T')[0]
7
- }}</span>
8
- <span class="text-gray-500" v-else>yyyy-mm-dd</span>
5
+ <span v-if="valueModel">{{ valueModelFormatted }}</span>
6
+ <span class="text-gray-500" v-else>{{ format }}</span>
9
7
  <span
10
8
  v-if="!iconless"
11
9
  class="pointer-events-none absolute right-3 top-1/2 -translate-y-1/2"
@@ -15,17 +13,24 @@
15
13
  </span>
16
14
  </button>
17
15
  </VTPopoverTrigger>
18
- <VTPopoverContent @hidden="$emit('hidden')" @shown="$emit('shown')">
19
- <DatePicker
16
+ <VTPopoverContent @hidden="$emit('hidden')" @shown="onShown">
17
+ <Datepicker
20
18
  v-model="valueModel"
21
- :min-date="min"
22
- :max-date="max"
23
- :model-config="modelConfig"
24
- :available-dates="availableDates"
25
- color="null"
26
- class="min-w-full"
27
- @dayclick="onDayClick"
28
- />
19
+ :inline="true"
20
+ :initial-view="initialView"
21
+ :minimum-view="minimumView"
22
+ :maximum-view="maximumView"
23
+ :show-edge-dates="showEdgeDates"
24
+ :disabled-dates="disabledDates"
25
+ @input="onInput"
26
+ >
27
+ <template #prevIntervalBtn>
28
+ <IconChevronLeft />
29
+ </template>
30
+ <template #nextIntervalBtn>
31
+ <IconChevronRight />
32
+ </template>
33
+ </Datepicker>
29
34
  </VTPopoverContent>
30
35
  </VTPopover>
31
36
  </template>
@@ -38,7 +43,9 @@ import {
38
43
  import VTPopover from './../Popover/VTPopover.vue';
39
44
  import VTPopoverTrigger from './../Popover/VTPopoverTrigger.vue';
40
45
  import VTPopoverContent from './../Popover/VTPopoverContent.vue';
41
- import DatePicker from 'v-calendar/lib/components/date-picker.umd';
46
+ import Datepicker from '@sum.cumo/vue-datepicker';
47
+ import { IconChevronLeft, IconChevronRight } from '@veritree/icons';
48
+ import { format } from 'date-fns';
42
49
 
43
50
  export default {
44
51
  name: 'VTInputDate',
@@ -46,16 +53,18 @@ export default {
46
53
  mixins: [formControlMixin, formControlStyleMixin],
47
54
 
48
55
  components: {
56
+ Datepicker,
57
+ IconChevronLeft,
58
+ IconChevronRight,
49
59
  VTPopover,
50
60
  VTPopoverTrigger,
51
61
  VTPopoverContent,
52
- DatePicker,
53
62
  },
54
63
 
55
64
  props: {
56
- availableDates: {
57
- type: Object,
58
- default: null,
65
+ format: {
66
+ type: String,
67
+ default: 'YYYY-MM-DD',
59
68
  },
60
69
  min: {
61
70
  type: [String, Date],
@@ -65,17 +74,26 @@ export default {
65
74
  type: [String, Date],
66
75
  default: null,
67
76
  },
77
+ initialView: {
78
+ type: String,
79
+ default: 'day',
80
+ },
81
+ minimumView: {
82
+ type: String,
83
+ default: 'day',
84
+ },
85
+ maximumView: {
86
+ type: String,
87
+ default: 'year',
88
+ },
89
+ showEdgeDates: {
90
+ type: Boolean,
91
+ default: true,
92
+ },
68
93
  iconless: {
69
94
  type: Boolean,
70
95
  default: false,
71
96
  },
72
- modelConfig: {
73
- type: Object,
74
- default: () => ({
75
- type: 'string',
76
- mask: 'YYYY-MM-DD',
77
- }),
78
- },
79
97
  },
80
98
 
81
99
  computed: {
@@ -88,12 +106,313 @@ export default {
88
106
  this.$emit('change', newDate);
89
107
  },
90
108
  },
109
+
110
+ valueModelFormatted() {
111
+ return format(this.value, this.format, {
112
+ useAdditionalDayOfYearTokens: true,
113
+ });
114
+ },
115
+
116
+ disabledDates() {
117
+ return {
118
+ to: this.min,
119
+ from: this.max,
120
+ };
121
+ },
91
122
  },
92
123
 
93
124
  methods: {
94
- onDayClick() {
125
+ onShown() {
126
+ this.$emit('shown');
127
+ this.setFocus();
128
+ },
129
+
130
+ /**
131
+ * Sets the focus on the datepicker element.
132
+ * If there is a selected date, it focuses on that date.
133
+ * If there is no selected date, it focuses on today's date.
134
+ */
135
+ setFocus() {
136
+ const elDatepicker = document.querySelector('.vdp-datepicker');
137
+
138
+ if (!elDatepicker) {
139
+ return;
140
+ }
141
+
142
+ const elSelected = elDatepicker.querySelector('.selected');
143
+
144
+ if (elSelected) {
145
+ elSelected.focus();
146
+ return;
147
+ }
148
+
149
+ const elToday = elDatepicker.querySelector('.today');
150
+
151
+ if (elToday) {
152
+ elToday.focus();
153
+ }
154
+ },
155
+
156
+ onInput() {
95
157
  this.$refs.trigger.cancel();
96
158
  },
97
159
  },
98
160
  };
99
161
  </script>
162
+
163
+ <style>
164
+ .rtl {
165
+ direction: rtl;
166
+ }
167
+
168
+ .vdp-datepicker {
169
+ font-size: 14px;
170
+ }
171
+
172
+ .vdp-datepicker__calendar .today {
173
+ background-color: #f2f2f2;
174
+ }
175
+
176
+ .vdp-datepicker__calendar {
177
+ & button {
178
+ background: inherit;
179
+ text-align: center;
180
+ }
181
+
182
+ & button:disabled {
183
+ color: #ddd;
184
+ }
185
+ }
186
+
187
+ /* header */
188
+ .vdp-datepicker__calendar header {
189
+ display: flex;
190
+
191
+ & button {
192
+ border: none;
193
+ }
194
+
195
+ & button:hover:not(:disabled) {
196
+ background: #f2f2f2;
197
+ }
198
+
199
+ & button.vdp-datepicker__up {
200
+ color: inherit;
201
+ font-weight: 500;
202
+ flex-grow: 1;
203
+ }
204
+
205
+ & .next,
206
+ & .prev {
207
+ border-radius: 50%;
208
+ display: flex;
209
+ align-items: center;
210
+ justify-content: center;
211
+ flex-shrink: 0;
212
+ height: 2rem;
213
+ aspect-ratio: 1 / 1;
214
+ position: relative;
215
+ }
216
+
217
+ & .next .default,
218
+ & .prev .default {
219
+ display: flex;
220
+ text-indent: -10000px;
221
+ }
222
+
223
+ & .next .default:after,
224
+ & .prev .default:after {
225
+ border: 6px solid transparent;
226
+ content: '';
227
+ left: 50%;
228
+ position: absolute;
229
+ top: 50%;
230
+ transform: translateX(-50%) translateY(-50%);
231
+ }
232
+
233
+ & .next.rtl,
234
+ & .prev.rtl {
235
+ transform: rotate(180deg);
236
+ }
237
+
238
+ & .prev .default:after {
239
+ border-right: 10px solid #000;
240
+ margin-left: -5px;
241
+ }
242
+
243
+ & .prev:disabled .default:after {
244
+ border-right: 10px solid #ddd;
245
+ }
246
+
247
+ & .next .default:after {
248
+ border-left: 10px solid #000;
249
+ margin-left: 5px;
250
+ }
251
+
252
+ & .next:disabled .default:after {
253
+ border-left: 10px solid #ddd;
254
+ }
255
+ }
256
+
257
+ /* body (days, months and years) */
258
+ .vdp-datepicker__calendar .picker-cells {
259
+ display: grid;
260
+ list-style: none;
261
+ margin: 0;
262
+ padding: 0;
263
+
264
+ &:has(.cell.day) {
265
+ grid-template-columns: repeat(7, 1fr);
266
+ }
267
+
268
+ &:has(.cell.month),
269
+ &:has(.cell.year) {
270
+ min-height: calc(6 * 2rem);
271
+ grid-template-columns: repeat(3, 1fr);
272
+ }
273
+
274
+ & .cell {
275
+ border: 1px solid transparent;
276
+ }
277
+
278
+ & .cell:not(.selected):focus {
279
+ border-color: #cccccc;
280
+ }
281
+
282
+ & .cell.day {
283
+ border-radius: 50%;
284
+ /* height: 2rem; */
285
+ aspect-ratio: 1 / 1;
286
+ }
287
+ }
288
+
289
+ /* cell states */
290
+ .vdp-datepicker__calendar .cell:not(.blank):not(.disabled).day,
291
+ .vdp-datepicker__calendar .cell:not(.blank):not(.disabled).month,
292
+ .vdp-datepicker__calendar .cell:not(.blank):not(.disabled).year {
293
+ cursor: pointer;
294
+ }
295
+
296
+ .vdp-datepicker__calendar .cell:not(.blank):not(.disabled).day:hover,
297
+ .vdp-datepicker__calendar .cell:not(.blank):not(.disabled).month:hover,
298
+ .vdp-datepicker__calendar .cell:not(.blank):not(.disabled).year:hover {
299
+ border-color: #333;
300
+ }
301
+
302
+ .vdp-datepicker__calendar .cell:not(.blank):not(.disabled).day:focus,
303
+ .vdp-datepicker__calendar .cell:not(.blank):not(.disabled).month:focus,
304
+ .vdp-datepicker__calendar .cell:not(.blank):not(.disabled).year:focus {
305
+ z-index: 1;
306
+ }
307
+
308
+ .vdp-datepicker__calendar .cell.muted {
309
+ color: #ccc;
310
+ }
311
+
312
+ .vdp-datepicker__calendar .cell.selected {
313
+ background: #333;
314
+ color: #fff;
315
+ }
316
+
317
+ .vdp-datepicker__calendar .cell.selected.highlighted,
318
+ .vdp-datepicker__calendar .cell.selected:hover {
319
+ background: #333;
320
+ }
321
+
322
+ .vdp-datepicker__calendar .cell.highlighted {
323
+ background: #cae5ed;
324
+ color: #104756;
325
+ }
326
+
327
+ .vdp-datepicker__calendar .cell.highlighted.disabled {
328
+ color: #accad2;
329
+ }
330
+
331
+ .vdp-datepicker__calendar .cell.muted.disabled:not(.selected) {
332
+ color: #ddd;
333
+ }
334
+
335
+ .vdp-datepicker__calendar .cell.muted.disabled:not(.selected).highlighted {
336
+ color: #accad2;
337
+ }
338
+
339
+ .vdp-datepicker__calendar .day-header {
340
+ display: grid;
341
+ grid-template-columns: repeat(7, 1fr);
342
+
343
+ & span {
344
+ display: flex;
345
+ align-items: center;
346
+ justify-content: center;
347
+ aspect-ratio: 1 / 1;
348
+ height: 2rem;
349
+ color: #767676;
350
+ font-size: 14px;
351
+ white-space: nowrap;
352
+ }
353
+ }
354
+
355
+ /* .vdp-datepicker__calendar .picker-view {
356
+ width: inherit;
357
+ } */
358
+
359
+ .vdp-datepicker__calendar .picker-view .cells-wrapper {
360
+ overflow: hidden;
361
+ position: relative;
362
+ }
363
+
364
+ .vdp-datepicker__calendar .picker-view .cells-wrapper .picker-cells {
365
+ transition: all 0.25s ease-in-out;
366
+ }
367
+
368
+ .vdp-datepicker__calendar .picker-view .slide-right-enter-active {
369
+ top: 0;
370
+ }
371
+
372
+ .vdp-datepicker__calendar .picker-view .slide-right-leave-active {
373
+ position: absolute;
374
+ top: 0;
375
+ }
376
+
377
+ .vdp-datepicker__calendar .picker-view .slide-right-enter {
378
+ transform: translate(100%);
379
+ }
380
+
381
+ .vdp-datepicker__calendar .picker-view .slide-right-leave-to {
382
+ transform: translate(-100%);
383
+ }
384
+
385
+ .vdp-datepicker__calendar .picker-view .slide-left-enter-active {
386
+ top: 0;
387
+ }
388
+
389
+ .vdp-datepicker__calendar .picker-view .slide-left-leave-active {
390
+ position: absolute;
391
+ top: 0;
392
+ }
393
+
394
+ .vdp-datepicker__calendar .picker-view .slide-left-enter {
395
+ transform: translate(-100%);
396
+ }
397
+
398
+ .vdp-datepicker__calendar .picker-view .slide-left-leave-to {
399
+ transform: translate(100%);
400
+ }
401
+
402
+ .view-leave-active {
403
+ position: absolute;
404
+ }
405
+
406
+ .vdp-datepicker__calendar-button,
407
+ .vdp-datepicker__clear-button {
408
+ border: none;
409
+ font-style: normal;
410
+ }
411
+
412
+ .vdp-datepicker__calendar-button.input-group-append,
413
+ .vdp-datepicker__calendar-button.input-group-prepend,
414
+ .vdp-datepicker__clear-button.input-group-append,
415
+ .vdp-datepicker__clear-button.input-group-prepend {
416
+ padding: 0;
417
+ }
418
+ </style>