design-system-next 2.13.6 → 2.14.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.
Files changed (38) hide show
  1. package/dist/design-system-next.es.js +11820 -10296
  2. package/dist/design-system-next.es.js.gz +0 -0
  3. package/dist/design-system-next.umd.js +17 -12
  4. package/dist/design-system-next.umd.js.gz +0 -0
  5. package/dist/main.css +1 -1
  6. package/dist/main.css.gz +0 -0
  7. package/dist/package.json.d.ts +3 -1
  8. package/package.json +3 -1
  9. package/src/App.vue +1 -83
  10. package/src/assets/styles/tailwind.css +13 -11
  11. package/src/components/date-picker/date-picker.ts +0 -1
  12. package/src/components/date-picker/date-picker.vue +2 -2
  13. package/src/components/date-picker/date-range-picker/date-range-picker.vue +59 -36
  14. package/src/components/dropdown/dropdown.ts +3 -2
  15. package/src/components/dropdown/dropdown.vue +2 -2
  16. package/src/components/dropdown/use-dropdown.ts +89 -70
  17. package/src/components/input/input.ts +0 -1
  18. package/src/components/input/input.vue +1 -1
  19. package/src/components/list/ladderized-list/ladderized-list-back.vue +2 -1
  20. package/src/components/list/ladderized-list/ladderized-list.vue +3 -18
  21. package/src/components/list/ladderized-list/use-ladderized-list.ts +33 -21
  22. package/src/components/list/list.ts +4 -1
  23. package/src/components/list/list.vue +155 -136
  24. package/src/components/select/select-ladderized/select-ladderized.ts +19 -1
  25. package/src/components/select/select-ladderized/select-ladderized.vue +42 -41
  26. package/src/components/select/select-ladderized/use-select-ladderized.ts +20 -33
  27. package/src/components/select/select-multiple/select-multiple.ts +19 -1
  28. package/src/components/select/select-multiple/select-multiple.vue +18 -15
  29. package/src/components/select/select-multiple/use-select-multiple.ts +5 -15
  30. package/src/components/select/select.ts +19 -1
  31. package/src/components/select/select.vue +50 -53
  32. package/src/components/select/use-select.ts +4 -13
  33. package/src/components/sidenav/use-sidenav.ts +10 -3
  34. package/src/components/table/table.ts +33 -3
  35. package/src/components/table/table.vue +46 -13
  36. package/src/components/table/use-draggable-table-rows.ts +57 -0
  37. package/src/components/table/use-table.ts +143 -7
  38. package/src/components/textarea/textarea.vue +7 -1
package/src/App.vue CHANGED
@@ -1,85 +1,3 @@
1
1
  <template>
2
- <div class="spr-h-[75vh]">
3
- <spr-table :headers="headers" :data-table="data" :full-height="true" :sticky-column="1">
4
- <template #footer>
5
- <spr-table-pagination
6
- v-model:selected-row-count="selectedRowCount"
7
- v-model:current-page="currentPage"
8
- :total-items="totalItems"
9
- :dropdown-selection="dropdownSelection"
10
- :version="'backend'"
11
- :editable-current-page="true"
12
- @previous="handlePrevious"
13
- @next="handleNext"
14
- />
15
- </template>
16
- </spr-table>
17
- </div>
18
- <label class="spr-font-main spr-text-[14px] spr-non-italic spr-font-medium" style="">
19
- 10 Rows
20
- </label>
21
- <input class="spr-font-main spr-text-[14px] spr-non-italic spr-font-medium" />
2
+ <div>Test Component Here</div>
22
3
  </template>
23
-
24
- <script setup lang="ts">
25
- import SprTable from "@/components/table/table.vue";
26
- import SprTablePagination from "@/components/table/table-pagination/table-pagination.vue"
27
- import { ref, watch } from 'vue';
28
- import tableData from "@/mock/tableData";
29
-
30
- const headers = ref([
31
- { field: 'name', name: 'Role Name', sort: true, hasAvatar: true, hasSubtext: true },
32
- { field: 'lastUpdate', name: 'Date', sort: true, hasAvatar: false, hasSubtext: false },
33
- { field: 'test', name: 'Test', sort: true, hasAvatar: false, hasSubtext: false },
34
- { field: 'test', name: 'Test', sort: true, hasAvatar: false, hasSubtext: false },
35
- { field: 'test', name: 'Test', sort: true, hasAvatar: false, hasSubtext: false },
36
- { field: 'test', name: 'Test', sort: true, hasAvatar: false, hasSubtext: false },
37
- { field: 'test', name: 'Test', sort: true, hasAvatar: false, hasSubtext: false },
38
- { field: 'test', name: 'Test', sort: true, hasAvatar: false, hasSubtext: false },
39
- { field: 'status', name: 'Status', sort: true, hasAvatar: false, hasSubtext: false },
40
- ]);
41
-
42
-
43
- const totalItems = ref(tableData.value.length);
44
- const currentPage = ref(1);
45
- const dropdownSelection = [
46
- { text: '10', value: '10' },
47
- { text: '20', value: '20' },
48
- { text: '30', value: '30' },
49
- { text: '100', value: '100' },
50
- { text: '1000', value: '1000' },
51
- ];
52
-
53
- const selectedRowCount = ref(10);
54
- const data = ref(tableData.value.slice(0, selectedRowCount.value));
55
- const updateDataTable = () => {
56
- data.value = tableData.value.slice((currentPage.value - 1) * selectedRowCount.value, currentPage.value * selectedRowCount.value);
57
- }
58
- watch(selectedRowCount, () => {
59
- currentPage.value = 1; // Reset to first page when row count changes
60
- updateDataTable();
61
- });
62
-
63
- watch(currentPage, (newValue) => {
64
- console.log('Current Page:', newValue);
65
- if(!currentPage.value) return;
66
- else if (currentPage.value > Math.ceil(totalItems.value / selectedRowCount.value)) {
67
- currentPage.value = Math.ceil(totalItems.value / selectedRowCount.value);
68
- }
69
- updateDataTable();
70
- });
71
-
72
- const handlePrevious = () => {
73
- if (currentPage.value > 1) {
74
- currentPage.value--;
75
- updateDataTable();
76
- }
77
- };
78
-
79
- const handleNext = () => {
80
- if (currentPage.value * selectedRowCount.value < totalItems.value) {
81
- currentPage.value++;
82
- updateDataTable();
83
- }
84
- };
85
- </script>
@@ -68,7 +68,7 @@
68
68
 
69
69
  .v-popper__wrapper {
70
70
  .v-popper__inner {
71
- @apply spr-overflow-hidden spr-rounded-none spr-border-none spr-bg-transparent spr-shadow-none;
71
+ @apply spr-overflow-hidden spr-rounded-none spr-border-none spr-bg-transparent spr-shadow-drop;
72
72
 
73
73
  .slide-fade-enter-active {
74
74
  @apply spr-duration-300 spr-ease-out;
@@ -89,7 +89,6 @@
89
89
  }
90
90
  }
91
91
  }
92
-
93
92
  /* #endregion - Sidenav */
94
93
 
95
94
  /* #region - Tooltips */
@@ -97,7 +96,7 @@
97
96
  #tooltip-full-width-wrapper {
98
97
  .v-popper__wrapper {
99
98
  .v-popper__inner {
100
- @apply spr-background-color-inverted spr-text-color-inverted-strong spr-body-xs-regular spr-break-all spr-rounded-border-radius-md spr-px-2 spr-py-1.5 spr-font-main spr-opacity-100;
99
+ @apply spr-background-color-inverted spr-text-color-inverted-strong spr-body-xs-regular spr-break-all spr-rounded-border-radius-md spr-px-2 spr-py-1.5 spr-font-main spr-opacity-100 spr-shadow-drop;
101
100
  }
102
101
 
103
102
  .v-popper__arrow-outer {
@@ -109,7 +108,7 @@
109
108
  #tooltip-wrapper {
110
109
  .v-popper__wrapper {
111
110
  .v-popper__inner {
112
- @apply spr-max-w-full;
111
+ @apply spr-max-w-full spr-shadow-drop;
113
112
  }
114
113
  }
115
114
  }
@@ -117,7 +116,7 @@
117
116
  #tooltip-full-width-wrapper {
118
117
  .v-popper__wrapper {
119
118
  .v-popper__inner {
120
- @apply spr-max-w-[280px];
119
+ @apply spr-max-w-[280px] spr-shadow-drop;
121
120
  }
122
121
  }
123
122
  }
@@ -129,7 +128,7 @@
129
128
 
130
129
  .v-popper__wrapper {
131
130
  .v-popper__inner {
132
- @apply spr-border-color-weak spr-w-full spr-rounded-xl spr-border spr-border-solid spr-font-main spr-shadow-none;
131
+ @apply spr-border-color-weak spr-w-full spr-rounded-xl spr-border spr-border-solid spr-font-main spr-shadow-drop;
133
132
 
134
133
  &::-webkit-scrollbar-track {
135
134
  @apply spr-rounded-br-xl spr-rounded-tr-xl;
@@ -142,15 +141,14 @@
142
141
  }
143
142
  }
144
143
 
145
- #contact-number-country-dropdown {
144
+ #input-contact-number-country-dropdown,
145
+ #input-currency-dropdown {
146
146
  #dropdown-wrapper[data-popper-placement='top-start'] {
147
- margin-top: -4px;
148
- margin-left: -8px;
147
+ @apply spr-ml-[-8px] spr-mt-[-4px];
149
148
  }
150
149
 
151
150
  #dropdown-wrapper[data-popper-placement='bottom-start'] {
152
- margin-top: 4px;
153
- margin-left: -8px;
151
+ @apply spr-ml-[-8px] spr-mt-[4px];
154
152
  }
155
153
  }
156
154
  /* #endregion - Dropdown */
@@ -199,6 +197,10 @@
199
197
  tbody::-webkit-scrollbar {
200
198
  @apply spr-h-0 spr-w-0; /* Hides the scrollbar in WebKit browsers */
201
199
  }
200
+
201
+ .empty-table-dropzone-dragged-class {
202
+ @apply spr-hidden;
203
+ }
202
204
  }
203
205
  /* #endregion - Table */
204
206
 
@@ -27,7 +27,6 @@ export const datePickerPropTypes = {
27
27
  id: {
28
28
  type: String,
29
29
  required: true,
30
- default: 'date-picker',
31
30
  },
32
31
  modelValue: {
33
32
  type: String,
@@ -266,7 +266,7 @@
266
266
  </Menu>
267
267
  <div v-if="props.displayHelper" :class="datePickerClasses.datePickerInputHelperClasses">
268
268
  <slot name="helperMessage">
269
- <Icon v-if="props.helperIcon" :icon="props.helperIcon" width="20px" height="20px" />
269
+ <Icon v-if="props.helperIcon" class="spr-h-5 spr-min-h-5 spr-w-5 spr-min-w-5" :icon="props.helperIcon" />
270
270
  <span>{{ props.helperText }}</span>
271
271
  </slot>
272
272
  </div>
@@ -330,7 +330,7 @@ const {
330
330
  handleTabClick,
331
331
  handleBackspace,
332
332
  clearDate,
333
- handleSlotClick
333
+ handleSlotClick,
334
334
  } = useDatePicker(props, emit);
335
335
 
336
336
  defineExpose({
@@ -1,42 +1,49 @@
1
1
  <template>
2
2
  <div>
3
3
  <Menu
4
- v-model:shown="datePopperState"
5
- aria-id="date-range-picker-wrapper"
6
- distance="4"
7
- :placement="finalPlacement"
8
- :triggers="[]"
9
- :popper-hide-triggers="[]"
10
- :auto-hide="false"
11
- :disabled="isDateRangePickerPopperDisabled"
12
- :container="`#${props.id}`"
13
- :reference="activeInputRef"
14
- :strategy="
15
- props.popperStrategy === 'fixed' || props.popperStrategy === 'absolute' ? props.popperStrategy : 'absolute'
16
- "
17
- :delay="0"
18
- :auto-placement="!isUsingCustomSlot"
19
- :style="{
20
- width: props.width,
21
- }"
22
- >
4
+ v-model:shown="datePopperState"
5
+ aria-id="date-range-picker-wrapper"
6
+ distance="4"
7
+ :placement="finalPlacement"
8
+ :triggers="[]"
9
+ :popper-hide-triggers="[]"
10
+ :auto-hide="false"
11
+ :disabled="isDateRangePickerPopperDisabled"
12
+ :container="`#${props.id}`"
13
+ :reference="activeInputRef"
14
+ :strategy="
15
+ props.popperStrategy === 'fixed' || props.popperStrategy === 'absolute' ? props.popperStrategy : 'absolute'
16
+ "
17
+ :delay="0"
18
+ :auto-placement="!isUsingCustomSlot"
19
+ :style="{
20
+ width: props.width,
21
+ }"
22
+ >
23
23
  <div :id="props.id" class="spr-grid spr-gap-size-spacing-4xs">
24
24
  <label v-if="props.label" :for="props.id" :class="dateRangePickerClasses.labelClasses">
25
25
  {{ props.label }}
26
26
  </label>
27
-
27
+
28
28
  <!-- Date Range Input Container -->
29
- <div class="spr-flex spr-items-center spr-gap-2 spr-w-full">
29
+ <div class="spr-flex spr-w-full spr-items-center spr-gap-2">
30
30
  <slot :handle-click="handleCustomComponentClick">
31
31
  <!-- fallback: original input fields -->
32
32
  <!-- Start Date Input -->
33
- <div ref="startDateContainerRef" :class="['spr-flex-1', dateRangePickerClasses.dateRangePickerBaseInputClasses]" @click.stop="handleStartDateClick" >
33
+ <div
34
+ ref="startDateContainerRef"
35
+ :class="['spr-flex-1', dateRangePickerClasses.dateRangePickerBaseInputClasses]"
36
+ @click.stop="handleStartDateClick"
37
+ >
34
38
  <div class="spr-flex spr-h-full spr-items-center spr-gap-1.5">
35
39
  <input
36
40
  :id="`${props.id}-start-month`"
37
41
  ref="startMonthInputRef"
38
42
  v-model="startMonthInput"
39
- :class="['spr-w-[38px] spr-min-w-[38px] spr-uppercase', dateRangePickerClasses.dateRangePickerInputClasses]"
43
+ :class="[
44
+ 'spr-w-[38px] spr-min-w-[38px] spr-uppercase',
45
+ dateRangePickerClasses.dateRangePickerInputClasses,
46
+ ]"
40
47
  type="text"
41
48
  placeholder="MMM"
42
49
  maxlength="3"
@@ -51,7 +58,10 @@
51
58
  :id="`${props.id}-start-date`"
52
59
  ref="startDateInputRef"
53
60
  v-model="startDateInput"
54
- :class="['spr-w-[24px] spr-min-w-[24px] spr-text-center', dateRangePickerClasses.dateRangePickerInputClasses]"
61
+ :class="[
62
+ 'spr-w-[24px] spr-min-w-[24px] spr-text-center',
63
+ dateRangePickerClasses.dateRangePickerInputClasses,
64
+ ]"
55
65
  type="text"
56
66
  placeholder="DD"
57
67
  maxlength="2"
@@ -84,13 +94,20 @@
84
94
  <!-- Separator -->
85
95
  <span class="spr-text-color-strong spr-font-size-200 spr-text-color-weak">{{ props.separator }}</span>
86
96
  <!-- End Date Input -->
87
- <div ref="endDateContainerRef" :class="['spr-flex-1', dateRangePickerClasses.dateRangePickerBaseInputClasses]" @click.stop="handleEndDateClick">
97
+ <div
98
+ ref="endDateContainerRef"
99
+ :class="['spr-flex-1', dateRangePickerClasses.dateRangePickerBaseInputClasses]"
100
+ @click.stop="handleEndDateClick"
101
+ >
88
102
  <div class="spr-flex spr-h-full spr-items-center spr-gap-1.5">
89
103
  <input
90
104
  :id="`${props.id}-end-month`"
91
105
  ref="endMonthInputRef"
92
106
  v-model="endMonthInput"
93
- :class="['spr-w-[38px] spr-min-w-[38px] spr-uppercase', dateRangePickerClasses.dateRangePickerInputClasses]"
107
+ :class="[
108
+ 'spr-w-[38px] spr-min-w-[38px] spr-uppercase',
109
+ dateRangePickerClasses.dateRangePickerInputClasses,
110
+ ]"
94
111
  type="text"
95
112
  placeholder="MMM"
96
113
  maxlength="3"
@@ -105,7 +122,10 @@
105
122
  :id="`${props.id}-end-date`"
106
123
  ref="endDateInputRef"
107
124
  v-model="endDateInput"
108
- :class="['spr-w-[24px] spr-min-w-[24px] spr-text-center', dateRangePickerClasses.dateRangePickerInputClasses]"
125
+ :class="[
126
+ 'spr-w-[24px] spr-min-w-[24px] spr-text-center',
127
+ dateRangePickerClasses.dateRangePickerInputClasses,
128
+ ]"
109
129
  type="text"
110
130
  placeholder="DD"
111
131
  maxlength="2"
@@ -244,11 +264,11 @@
244
264
  'spr-text-color-disabled': calendarTabIsInactiveMonthDates(day),
245
265
 
246
266
  // Selected Date (Start or End) - Use brand color scheme from date picker
247
- 'spr-background-color-brand-base active:spr-background-color-brand-pressed spr-text-color-inverted-strong !spr-text-white-50 active:spr-scale-95 spr-font-medium':
267
+ 'spr-background-color-brand-base active:spr-background-color-brand-pressed spr-text-color-inverted-strong spr-font-medium !spr-text-white-50 active:spr-scale-95':
248
268
  calendarTabIsSelectedDate(day),
249
269
 
250
270
  // In Range (between start and end) - Light green background with brand outline, no border, using spr- prefix
251
- 'spr-bg-green-100 spr-cursor-pointer spr-outline spr-outline-1 spr-outline-offset-[-0.5px] spr-outline-kangkong-700':
271
+ 'spr-cursor-pointer spr-bg-green-100 spr-outline spr-outline-1 spr-outline-offset-[-0.5px] spr-outline-kangkong-700':
252
272
  calendarTabIsInRange(day),
253
273
 
254
274
  // Unselected Date - Gray border, no hover effects
@@ -264,7 +284,7 @@
264
284
  <span>{{ day.date.date() }}</span>
265
285
  <div
266
286
  v-if="calendarTabIsTodayIndicator(day)"
267
- class="spr-bg-green-600 spr-absolute spr-bottom-1 spr-m-auto spr-h-1 spr-w-1 spr-rounded-full"
287
+ class="spr-absolute spr-bottom-1 spr-m-auto spr-h-1 spr-w-1 spr-rounded-full spr-bg-green-600"
268
288
  ></div>
269
289
  </div>
270
290
  <div v-else></div>
@@ -281,9 +301,11 @@
281
301
  {
282
302
  'spr-text-color-brand-base': month.monthValue === currentDate.month(),
283
303
  'spr-border-color-weak hover:spr-background-color-hover active:spr-background-color-pressed':
284
- month.text.toLowerCase() !== startMonthInput.toLowerCase() && month.text.toLowerCase() !== endMonthInput.toLowerCase(),
304
+ month.text.toLowerCase() !== startMonthInput.toLowerCase() &&
305
+ month.text.toLowerCase() !== endMonthInput.toLowerCase(),
285
306
  'spr-border-color-brand-base spr-background-color-single-active':
286
- month.text.toLowerCase() === startMonthInput.toLowerCase() || month.text.toLowerCase() === endMonthInput.toLowerCase(),
307
+ month.text.toLowerCase() === startMonthInput.toLowerCase() ||
308
+ month.text.toLowerCase() === endMonthInput.toLowerCase(),
287
309
  },
288
310
  ]"
289
311
  @click="monthTabHandleSelectedMonth(month)"
@@ -308,7 +330,8 @@
308
330
  'spr-text-color-brand-base': year === currentDate.year(),
309
331
  'spr-border-color-weak hover:spr-background-color-hover active:spr-background-color-pressed':
310
332
  year !== Number(startYearInput) && year !== Number(endYearInput),
311
- 'spr-border-color-brand-base spr-background-color-single-active': year === Number(startYearInput) || year === Number(endYearInput),
333
+ 'spr-border-color-brand-base spr-background-color-single-active':
334
+ year === Number(startYearInput) || year === Number(endYearInput),
312
335
  },
313
336
  ]"
314
337
  @click="yearTabHandleSelectedYear(String(year))"
@@ -324,10 +347,10 @@
324
347
  </div>
325
348
  </template>
326
349
  </Menu>
327
-
350
+
328
351
  <div v-if="props.displayHelper" :class="dateRangePickerClasses.dateRangePickerInputHelperClasses">
329
352
  <slot name="helperMessage">
330
- <Icon v-if="props.helperIcon" :icon="props.helperIcon" width="20px" height="20px" />
353
+ <Icon v-if="props.helperIcon" class="spr-h-5 spr-min-h-5 spr-w-5 spr-min-w-5" :icon="props.helperIcon" />
331
354
  <span>{{ props.helperText }}</span>
332
355
  </slot>
333
356
  </div>
@@ -409,4 +432,4 @@ const {
409
432
  handleEndDateClick,
410
433
  handleCustomComponentClick,
411
434
  } = useDateRangePicker(props, emit);
412
- </script>
435
+ </script>
@@ -124,7 +124,7 @@ export const dropdownPropTypes = {
124
124
  },
125
125
  default: () => ['click'],
126
126
  },
127
- popperTriggers: {
127
+ popperTriggers: {
128
128
  type: Array as PropType<(typeof TRIGGER_EVENTS)[number][]>,
129
129
  validator: (value: (typeof TRIGGER_EVENTS)[number][]) => {
130
130
  return value.every((val) => TRIGGER_EVENTS.includes(val));
@@ -134,13 +134,14 @@ export const dropdownPropTypes = {
134
134
  autoHide: {
135
135
  type: Boolean,
136
136
  default: true,
137
- }
137
+ },
138
138
  };
139
139
 
140
140
  export const dropdownEmitTypes = {
141
141
  'infinite-scroll-trigger': Boolean,
142
142
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
143
143
  'update:modelValue': (_value: unknown) => true, // Accept any type of value
144
+ 'popper-state': Boolean,
144
145
  };
145
146
 
146
147
  export type DropdownPropTypes = ExtractPropTypes<typeof dropdownPropTypes>;
@@ -1,6 +1,6 @@
1
1
  <template>
2
2
  <Menu
3
- :shown="dropdownPopperState"
3
+ v-model:shown="dropdownPopperState"
4
4
  aria-id="dropdown-wrapper"
5
5
  distance="4"
6
6
  :placement="props.placement"
@@ -33,8 +33,8 @@
33
33
  <div
34
34
  ref="dropdownRef"
35
35
  :class="[
36
- (!props.ladderized || isLadderizedSearch) && 'spr-p-2',
37
36
  'spr-grid spr-max-h-[300px] spr-gap-0.5 spr-overflow-y-auto spr-overflow-x-hidden',
37
+ !props.ladderized || isLadderizedSearch,
38
38
  ]"
39
39
  :style="{
40
40
  width: props.popperInnerWidth,