design-system-next 2.24.2 → 2.26.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/dist/design-system-next.es.d.ts +152 -114
  2. package/dist/design-system-next.es.js +10058 -9379
  3. package/dist/design-system-next.es.js.gz +0 -0
  4. package/dist/design-system-next.umd.js +12 -12
  5. package/dist/design-system-next.umd.js.gz +0 -0
  6. package/dist/main.css +1 -1
  7. package/dist/main.css.gz +0 -0
  8. package/package.json +3 -2
  9. package/src/App.vue +1 -89
  10. package/src/components/date-picker/date-picker.ts +9 -12
  11. package/src/components/date-picker/date-picker.vue +1 -1
  12. package/src/components/date-picker/date-range-picker/date-range-picker.ts +9 -12
  13. package/src/components/date-picker/date-range-picker/use-date-range-picker.ts +64 -49
  14. package/src/components/date-picker/month-year-picker/month-year-picker.ts +134 -0
  15. package/src/components/date-picker/month-year-picker/month-year-picker.vue +233 -0
  16. package/src/components/date-picker/month-year-picker/use-month-year-picker.ts +603 -0
  17. package/src/components/date-picker/use-date-picker.ts +88 -147
  18. package/src/components/list/list-item/list-item.ts +60 -60
  19. package/src/components/list/list.ts +5 -0
  20. package/src/components/list/list.vue +2 -0
  21. package/src/components/list/use-list.ts +36 -3
  22. package/src/components/radio-grouped/radio-grouped.ts +65 -65
  23. package/src/components/radio-grouped/use-radio-grouped.ts +62 -62
  24. package/src/components/select/select-multiple/use-select-multiple.ts +7 -3
  25. package/src/components/select/use-select.ts +9 -5
  26. package/src/components/sidepanel/sidepanel.ts +7 -0
  27. package/src/components/sidepanel/sidepanel.vue +24 -4
  28. package/src/components/sidepanel/use-sidepanel.ts +4 -0
  29. package/src/components/table/table-header-dropdown/table-header-dropdown.vue +5 -1
  30. package/src/components/table/table.vue +14 -0
  31. package/src/components/table/use-table.ts +1 -2
@@ -0,0 +1,233 @@
1
+ <template>
2
+ <div>
3
+ <Menu
4
+ v-model:shown="monthYearPopperState"
5
+ aria-id="month-year-picker-wrapper"
6
+ distance="4"
7
+ :placement="props.placement"
8
+ :triggers="[]"
9
+ :popper-hide-triggers="[]"
10
+ :auto-hide="true"
11
+ :disabled="isMonthYearPickerPopperDisabled"
12
+ :container="props.popperContainer ? props.popperContainer : `#${props.id}`"
13
+ :strategy="
14
+ props.popperStrategy === 'fixed' || props.popperStrategy === 'absolute' ? props.popperStrategy : 'absolute'
15
+ "
16
+ :delay="0"
17
+ :style="{
18
+ position: props.wrapperPosition,
19
+ width: props.width,
20
+ }"
21
+ >
22
+ <div :id="props.id" class="spr-grid spr-gap-size-spacing-4xs">
23
+ <label v-if="props.label" :for="props.id" :class="monthYearPickerClasses.labelClasses">
24
+ {{ props.label }}
25
+ </label>
26
+ <slot :handle-click="handleSlotClick">
27
+ <div
28
+ ref="monthYearPickerRef"
29
+ :class="[monthYearPickerClasses.monthYearPickerBaseInputClasses, 'spr-relative spr-z-10']"
30
+ @click="monthYearPopperState = true"
31
+ >
32
+ <div class="spr-flex spr-h-full spr-items-center spr-gap-1.5">
33
+ <input
34
+ :id="`${props.id}-month`"
35
+ ref="monthInputRef"
36
+ v-model="monthInput"
37
+ :class="['spr-w-[38px] spr-min-w-[38px]', monthYearPickerClasses.monthYearPickerInputClasses]"
38
+ type="text"
39
+ placeholder="MMM"
40
+ maxlength="3"
41
+ :disabled="props.disabled"
42
+ :readonly="props.readonly"
43
+ autocomplete="off"
44
+ @input="handleMonthInput"
45
+ @keyup="handleMonthInput"
46
+ @keydown="handleBackspace('month', $event)"
47
+ />
48
+ <span class="spr-text-color-strong spr-font-size-200 spr-text-color-weak">/</span>
49
+ <input
50
+ :id="`${props.id}-year`"
51
+ ref="yearInputRef"
52
+ v-model="yearInput"
53
+ :class="['spr-w-[42px] spr-min-w-[42px]', monthYearPickerClasses.monthYearPickerInputClasses]"
54
+ type="text"
55
+ placeholder="YYYY"
56
+ maxlength="4"
57
+ :disabled="props.disabled"
58
+ :readonly="props.readonly"
59
+ autocomplete="off"
60
+ @input="handleYearInput"
61
+ @keyup="handleYearInput"
62
+ @keydown="handleBackspace('year', $event)"
63
+ />
64
+ </div>
65
+ <div class="spr-flex spr-items-center spr-justify-center">
66
+ <Icon class="spr-text-color-supporting spr-h-4 spr-w-4" icon="ph:calendar-blank" />
67
+ </div>
68
+ </div>
69
+ </slot>
70
+ </div>
71
+
72
+ <template #popper>
73
+ <div ref="monthYearPickerRef">
74
+ <div
75
+ :class="[
76
+ 'spr-flex spr-justify-between spr-gap-2 spr-px-4 spr-py-3',
77
+ 'spr-border spr-border-x-0 spr-border-b spr-border-t-0 spr-border-solid spr-border-mushroom-200',
78
+ ]"
79
+ >
80
+ <!-- Tabs -->
81
+ <div class="spr-flex spr-gap-1">
82
+ <spr-button
83
+ :class="getTabClasses('tab-months')"
84
+ variant="secondary"
85
+ size="small"
86
+ @click="handleTabClick('tab-months')"
87
+ >
88
+ {{ getMonthObject('monthValue', selectedMonth ?? 0)?.fullText || 'Month' }}
89
+ </spr-button>
90
+ <spr-button
91
+ :class="getTabClasses('tab-years')"
92
+ variant="secondary"
93
+ size="small"
94
+ @click="handleTabClick('tab-years')"
95
+ >
96
+ {{ yearInput || 'Year' }}
97
+ </spr-button>
98
+ </div>
99
+
100
+ <!-- Next & Previous Buttons (for Year Tab) -->
101
+ <div v-if="currentTab === 'tab-years'" class="spr-flex spr-gap-1">
102
+ <spr-button
103
+ class="spr-cursor-pointer"
104
+ variant="secondary"
105
+ size="small"
106
+ :disabled="yearTabIsPreviousButtonDisabled"
107
+ @click="yearTabGoToPreviousPage"
108
+ >
109
+ <Icon icon="ph:caret-left" />
110
+ </spr-button>
111
+ <spr-button
112
+ class="spr-cursor-pointer"
113
+ variant="secondary"
114
+ size="small"
115
+ :disabled="yearTabIsNextButtonDisabled"
116
+ @click="yearTabGoToNextPage"
117
+ >
118
+ <Icon icon="ph:caret-right" />
119
+ </spr-button>
120
+ </div>
121
+ </div>
122
+ <div class="spr-px-4 spr-pb-4 spr-pt-2">
123
+ <!-- Months Tab -->
124
+ <div v-if="currentTab === 'tab-months'" class="spr-grid spr-grid-cols-4 spr-gap-2">
125
+ <div
126
+ v-for="(month, monthIndex) in monthsList"
127
+ :key="monthIndex"
128
+ :class="[
129
+ monthYearPickerClasses.monthsTabItemsBaseClasses,
130
+ {
131
+ 'spr-text-color-brand-base': month.monthValue === currentDate.month(),
132
+ 'spr-border-color-weak hover:spr-background-color-hover active:spr-background-color-pressed':
133
+ month.text.toLowerCase() !== monthInput.toLowerCase(),
134
+ 'spr-border-color-brand-base spr-background-color-single-active':
135
+ month.text.toLowerCase() === monthInput.toLowerCase(),
136
+ },
137
+ ]"
138
+ @click="monthTabHandleSelectedMonth(month)"
139
+ >
140
+ <span>{{ month.text }}</span>
141
+
142
+ <div
143
+ v-if="month.monthValue === currentDate.month()"
144
+ class="spr-background-color-brand-base spr-absolute spr-bottom-2 spr-m-auto spr-h-1 spr-w-1 spr-rounded-full"
145
+ ></div>
146
+ </div>
147
+ </div>
148
+
149
+ <!-- Years Tab -->
150
+ <div v-if="currentTab === 'tab-years'" class="spr-grid spr-grid-cols-4 spr-gap-2">
151
+ <div
152
+ v-for="(year, index) in yearTabCurrentYearPage"
153
+ :key="index"
154
+ :class="[
155
+ monthYearPickerClasses.yearsTabItemsBaseClasses,
156
+ {
157
+ 'spr-text-color-brand-base': year === currentDate.year(),
158
+ 'spr-border-color-weak hover:spr-background-color-hover active:spr-background-color-pressed':
159
+ year !== Number(yearInput),
160
+ 'spr-border-color-brand-base spr-background-color-single-active': year === Number(yearInput),
161
+ },
162
+ ]"
163
+ @click="yearTabHandleSelectedYear(String(year))"
164
+ >
165
+ <span>{{ year }}</span>
166
+ <div
167
+ v-if="year === currentDate.year()"
168
+ class="spr-background-color-brand-base spr-absolute spr-bottom-2 spr-m-auto spr-h-1 spr-w-1 spr-rounded-full"
169
+ ></div>
170
+ </div>
171
+ </div>
172
+ </div>
173
+ </div>
174
+ </template>
175
+ </Menu>
176
+ <div v-if="props.displayHelper" :class="monthYearPickerClasses.monthYearPickerInputHelperClasses">
177
+ <slot name="helperMessage">
178
+ <Icon v-if="props.helperIcon" class="spr-h-5 spr-min-h-5 spr-w-5 spr-min-w-5" :icon="props.helperIcon" />
179
+ <span>{{ props.helperText }}</span>
180
+ </slot>
181
+ </div>
182
+ </div>
183
+ </template>
184
+
185
+ <script lang="ts" setup>
186
+ import { Menu } from 'floating-vue';
187
+ import { Icon } from '@iconify/vue';
188
+
189
+ import 'floating-vue/dist/style.css';
190
+
191
+ import { monthYearPickerPropTypes, monthYearPickerEmitTypes } from './month-year-picker';
192
+ import { useMonthYearPicker } from './use-month-year-picker';
193
+
194
+ import SprButton from '@/components/button/button.vue';
195
+
196
+ const props = defineProps(monthYearPickerPropTypes);
197
+ const emit = defineEmits(monthYearPickerEmitTypes);
198
+
199
+ const {
200
+ monthYearPickerClasses,
201
+ monthYearPickerRef,
202
+ monthInputRef,
203
+ yearInputRef,
204
+ monthYearPopperState,
205
+ currentTab,
206
+ currentDate,
207
+ monthsList,
208
+ monthInput,
209
+ yearInput,
210
+ selectedMonth,
211
+ monthTabHandleSelectedMonth,
212
+ yearTabCurrentYearPage,
213
+ yearTabGoToPreviousPage,
214
+ yearTabGoToNextPage,
215
+ yearTabIsPreviousButtonDisabled,
216
+ yearTabIsNextButtonDisabled,
217
+ yearTabHandleSelectedYear,
218
+ getMonthObject,
219
+ getTabClasses,
220
+ isMonthYearPickerPopperDisabled,
221
+ handleMonthInput,
222
+ handleYearInput,
223
+ handleTabClick,
224
+ handleBackspace,
225
+ clearMonthYear,
226
+ handleSlotClick,
227
+ } = useMonthYearPicker(props, emit);
228
+
229
+ defineExpose({
230
+ clear: () => clearMonthYear(),
231
+ });
232
+ </script>
233
+