design-system-next 2.7.29 → 2.7.31

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.
@@ -1,12 +1,10 @@
1
1
  <template>
2
2
  <div
3
- class="
4
- spr-py-size-spacing-2xs spr-px-size-spacing-xs
5
- spr-body-xs-regular
6
- spr-flex spr-items-center spr-gap-size-spacing-5xs
7
- spr-border-solid spr-border-0 spr-border-b spr-border-color-weak
8
- spr-cursor-pointer
9
- "
3
+ :class="[
4
+ 'spr-flex spr-cursor-pointer spr-items-center spr-gap-size-spacing-5xs spr-px-size-spacing-xs spr-py-size-spacing-2xs',
5
+ 'spr-body-xs-regular',
6
+ 'spr-border-color-weak spr-border-0 spr-border-b spr-border-solid',
7
+ ]"
10
8
  @click="handleBackClick"
11
9
  >
12
10
  <Icon icon="ph:arrow-left" class="spr-size-4" />
@@ -20,15 +18,15 @@ import { Icon } from '@iconify/vue';
20
18
  const props = defineProps({
21
19
  label: {
22
20
  type: String,
23
- default: "Back"
21
+ default: 'Back',
24
22
  },
25
23
  });
26
24
 
27
25
  const emit = defineEmits({
28
- back: () => true
26
+ back: () => true,
29
27
  });
30
28
 
31
29
  const handleBackClick = () => {
32
- emit("back");
30
+ emit('back');
33
31
  };
34
32
  </script>
@@ -16,7 +16,7 @@ export const ladderizedListPropTypes = {
16
16
  removeCurrentLevelInBackLabel: {
17
17
  type: Boolean,
18
18
  default: false,
19
- }
19
+ },
20
20
  };
21
21
 
22
22
  export const ladderizedListEmitTypes = {
@@ -3,12 +3,26 @@
3
3
  <transition :name="transitionName" mode="out-in">
4
4
  <div v-if="activeLevel % 2 === 0">
5
5
  <spr-ladderized-list-back v-if="activeLevel > 0" :label="backLabel ?? 'Back'" @back="handleBackClick" />
6
- <spr-list v-model="selectedListItem" class="spr-p-size-spacing-3xs" :menu-list="activeList" :multi-select="false" :ladderized="true" @update:model-value="(value) => handleSelectedListItem(value[0])" />
6
+ <spr-list
7
+ v-model="selectedListItem"
8
+ class="spr-p-size-spacing-3xs"
9
+ :menu-list="activeList"
10
+ :multi-select="false"
11
+ :ladderized="true"
12
+ @update:model-value="(value) => handleSelectedListItem(value[0])"
13
+ />
7
14
  </div>
8
-
15
+
9
16
  <div v-else>
10
17
  <spr-ladderized-list-back v-if="activeLevel > 0" :label="backLabel ?? 'Back'" @back="handleBackClick" />
11
- <spr-list v-model="selectedListItem" class="spr-p-size-spacing-3xs" :menu-list="activeList" :multi-select="false" :ladderized="true" @update:model-value="(value) => handleSelectedListItem(value[0])" />
18
+ <spr-list
19
+ v-model="selectedListItem"
20
+ class="spr-p-size-spacing-3xs"
21
+ :menu-list="activeList"
22
+ :multi-select="false"
23
+ :ladderized="true"
24
+ @update:model-value="(value) => handleSelectedListItem(value[0])"
25
+ />
12
26
  </div>
13
27
  </transition>
14
28
  </div>
@@ -16,6 +30,7 @@
16
30
 
17
31
  <script setup lang="ts">
18
32
  import SprList from '@/components/list/list.vue';
33
+
19
34
  import { ladderizedListPropTypes, ladderizedListEmitTypes } from './ladderized-list';
20
35
  import { useLadderizedList } from './use-ladderized-list';
21
36
  import SprLadderizedListBack from './ladderized-list-back.vue';
@@ -23,8 +38,15 @@ import SprLadderizedListBack from './ladderized-list-back.vue';
23
38
  const props = defineProps(ladderizedListPropTypes);
24
39
  const emit = defineEmits(ladderizedListEmitTypes);
25
40
 
26
- const { activeLevel, selectedListItem, handleSelectedListItem, activeList, handleBackClick, transitionName, backLabel } = useLadderizedList(props, emit);
27
-
41
+ const {
42
+ activeLevel,
43
+ selectedListItem,
44
+ handleSelectedListItem,
45
+ activeList,
46
+ handleBackClick,
47
+ transitionName,
48
+ backLabel,
49
+ } = useLadderizedList(props, emit);
28
50
  </script>
29
51
 
30
52
  <style scoped>
@@ -32,7 +54,7 @@ const { activeLevel, selectedListItem, handleSelectedListItem, activeList, handl
32
54
  .slide-left-leave-active,
33
55
  .slide-right-enter-active,
34
56
  .slide-right-leave-active {
35
- transition: all 0.25s ease-out;
57
+ transition: all 150ms ease-out;
36
58
  }
37
59
 
38
60
  .slide-left-enter-from,
@@ -1,27 +1,32 @@
1
1
  import { computed, onBeforeMount, ref, toRefs } from 'vue';
2
+ import { useVModel } from '@vueuse/core';
3
+
4
+ import { LadderizedListPropTypes, LadderizedListEmitTypes } from './ladderized-list';
5
+
2
6
  import type { SetupContext } from 'vue';
3
7
  import type { MenuListType } from '../list';
4
- import { LadderizedListPropTypes, LadderizedListEmitTypes } from './ladderized-list';
5
- import { useVModel } from '@vueuse/core'
6
8
 
7
- export const useLadderizedList = (props: LadderizedListPropTypes, emit: SetupContext<LadderizedListEmitTypes>['emit']) => {
9
+ export const useLadderizedList = (
10
+ props: LadderizedListPropTypes,
11
+ emit: SetupContext<LadderizedListEmitTypes>['emit'],
12
+ ) => {
8
13
  const ladderizedListOutput = useVModel(props, 'modelValue', emit); // List of items for v-model
9
14
  const { menuList, removeCurrentLevelInBackLabel } = toRefs(props);
10
- const transitionName = ref("slide-left");
11
- const backLabel = ref("");
12
-
15
+ const transitionName = ref('slide-left');
16
+ const backLabel = ref('');
17
+
13
18
  // Variables used for internal logic
14
19
  const selectedListItem = ref<MenuListType[]>([]); // List of items for recording the selected item
15
20
  const activeLevel = ref(0);
16
- const activeList = ref<MenuListType[]>(menuList.value); // List of items to display in the active level
21
+ const activeList = ref<MenuListType[]>(menuList.value); // List of items to display in the active level
17
22
  const prevList = ref<MenuListType[]>([]);
18
23
 
19
24
  const handleSelectedListItem = (item: MenuListType) => {
20
- transitionName.value = "slide-left";
25
+ transitionName.value = 'slide-left';
21
26
  // Update UI for selectedListItem
22
27
  updateSelectedListItem(item);
23
28
 
24
- const isSameLevel = computed(() => prevList.value.some(listItem => listItem.value === item.value));
29
+ const isSameLevel = computed(() => prevList.value.some((listItem) => listItem.value === item.value));
25
30
 
26
31
  // Update the activeList and activeLevel
27
32
  if (!isSameLevel.value) {
@@ -29,27 +34,27 @@ export const useLadderizedList = (props: LadderizedListPropTypes, emit: SetupCon
29
34
  } else {
30
35
  replaceItemInOutput(item);
31
36
  }
32
-
37
+
33
38
  if (item.sublevel && item.sublevel.length > 0) updateLevel(item);
34
39
  // Update output value
35
- emit("update:modelValue", ladderizedListOutput.value);
40
+ emit('update:modelValue', ladderizedListOutput.value);
36
41
  };
37
42
 
38
43
  // Update UI display for selectedListItem
39
44
  const updateSelectedListItem = (item: MenuListType) => {
40
- if(selectedListItem.value[activeLevel.value]) {
45
+ if (selectedListItem.value[activeLevel.value]) {
41
46
  selectedListItem.value[activeLevel.value] = item;
42
47
  } else {
43
48
  selectedListItem.value.push(item);
44
49
  }
45
- }
50
+ };
46
51
 
47
52
  // Update the activeList, prevList and activeLevel
48
53
  const updateLevel = (item: MenuListType) => {
49
54
  activeLevel.value += 1;
50
55
  prevList.value = activeList.value;
51
56
  activeList.value = item.sublevel ?? activeList.value;
52
- }
57
+ };
53
58
 
54
59
  // Append the new item to the output
55
60
  const appendItemToOutput = (item: MenuListType) => {
@@ -57,41 +62,41 @@ export const useLadderizedList = (props: LadderizedListPropTypes, emit: SetupCon
57
62
  if (ladderizedListOutput.value[ladderizedListOutput.value.length - 1] === item.value) return;
58
63
 
59
64
  // Update back label text
60
- if (backLabel.value !== "") {
61
- const textArray = backLabel.value.split(", ");
65
+ if (backLabel.value !== '') {
66
+ const textArray = backLabel.value.split(', ');
62
67
  textArray?.push(item.text);
63
- backLabel.value = textArray?.join(", ") ?? "";
68
+ backLabel.value = textArray?.join(', ') ?? '';
64
69
  } else {
65
70
  backLabel.value = item.text;
66
71
  }
67
72
 
68
73
  // Update output value
69
74
  ladderizedListOutput.value.push(item.value.toString());
70
- }
75
+ };
71
76
 
72
77
  // Replace the last item in the output with the new item
73
78
  const replaceItemInOutput = (item: MenuListType) => {
74
79
  // Update back label text
75
- const textArray = backLabel.value.trim().split(",");
80
+ const textArray = backLabel.value.trim().split(',');
76
81
  textArray?.pop();
77
82
  textArray?.push(item.text);
78
- backLabel.value = textArray?.join(", ") ?? "";
83
+ backLabel.value = textArray?.join(', ') ?? '';
79
84
 
80
85
  // Update output value
81
86
  const valueArray = ladderizedListOutput.value;
82
87
  valueArray?.pop();
83
88
  valueArray?.push(item.value);
84
89
  ladderizedListOutput.value = valueArray ?? [];
85
- }
90
+ };
86
91
 
87
92
  const handleBackClick = () => {
88
- transitionName.value = "slide-right";
93
+ transitionName.value = 'slide-right';
89
94
  activeLevel.value -= 1;
90
95
  if (activeLevel.value > 0) {
91
96
  // Update back label text
92
- const textArray = backLabel.value.trim().split(",");
97
+ const textArray = backLabel.value.trim().split(',');
93
98
  textArray?.pop();
94
- backLabel.value = textArray?.join(", ") ?? "";
99
+ backLabel.value = textArray?.join(', ') ?? '';
95
100
  // Update output value
96
101
  const valueArray = ladderizedListOutput.value;
97
102
  valueArray?.pop();
@@ -99,13 +104,13 @@ export const useLadderizedList = (props: LadderizedListPropTypes, emit: SetupCon
99
104
 
100
105
  // Get previous activeList from menuList
101
106
  for (let i = 0; i < activeLevel.value; i++) {
102
- activeList.value = props.menuList.find(item => item.value === ladderizedListOutput.value[i])?.sublevel ?? [];
107
+ activeList.value = props.menuList.find((item) => item.value === ladderizedListOutput.value[i])?.sublevel ?? [];
103
108
  }
104
109
  } else {
105
110
  // Reset values
106
111
  activeList.value = props.menuList;
107
112
  ladderizedListOutput.value = [];
108
- backLabel.value = "";
113
+ backLabel.value = '';
109
114
  activeLevel.value = 0;
110
115
  }
111
116
  };
@@ -118,9 +123,7 @@ export const useLadderizedList = (props: LadderizedListPropTypes, emit: SetupCon
118
123
 
119
124
  // On initialize, traverse through the activeList based from ladderizedListOutput
120
125
  ladderizedListOutput.value.forEach((preSelectedItem: string) => {
121
- const item = activeList.value.find(
122
- (menuItem) => String(menuItem.value) === String(preSelectedItem),
123
- );
126
+ const item = activeList.value.find((menuItem) => String(menuItem.value) === String(preSelectedItem));
124
127
 
125
128
  if (item) {
126
129
  updateSelectedListItem(item);
@@ -134,12 +137,12 @@ export const useLadderizedList = (props: LadderizedListPropTypes, emit: SetupCon
134
137
  }
135
138
  });
136
139
 
137
- if(removeCurrentLevelInBackLabel.value && tempBackLabel.length > 0) {
140
+ if (removeCurrentLevelInBackLabel.value && tempBackLabel.length > 0) {
138
141
  tempBackLabel.pop();
139
142
  }
140
143
 
141
144
  // Update back label text
142
- backLabel.value = tempBackLabel.length > 0 ? tempBackLabel.join(", ") : "Back";
145
+ backLabel.value = tempBackLabel.length > 0 ? tempBackLabel.join(', ') : 'Back';
143
146
  }
144
147
  };
145
148
 
@@ -148,12 +151,12 @@ export const useLadderizedList = (props: LadderizedListPropTypes, emit: SetupCon
148
151
  initializeMenuList();
149
152
  });
150
153
 
151
- return {
152
- activeLevel,
153
- activeList,
154
- handleSelectedListItem,
155
- handleBackClick,
156
- selectedListItem,
154
+ return {
155
+ activeLevel,
156
+ activeList,
157
+ handleSelectedListItem,
158
+ handleBackClick,
159
+ selectedListItem,
157
160
  transitionName,
158
161
  backLabel,
159
162
  };
@@ -1,8 +1,10 @@
1
1
  import { ref, toRefs, computed, ComputedRef, watch, onMounted } from 'vue';
2
+ import { useVModel } from '@vueuse/core';
3
+
2
4
  import classNames from 'classnames';
5
+
3
6
  import type { SetupContext } from 'vue';
4
7
  import type { ListPropTypes, ListEmitTypes, MenuListType, GroupedMenuListType } from './list';
5
- import { useVModel } from '@vueuse/core';
6
8
 
7
9
  interface ListClasses {
8
10
  listItemClasses: string;
@@ -91,20 +93,25 @@ export const useList = (props: ListPropTypes, emit: SetupContext<ListEmitTypes>[
91
93
  };
92
94
 
93
95
  const setPreSelectedItems = () => {
94
- if (preSelectedItems.value && preSelectedItems.value.length > 0) {
95
- preSelectedItems.value.forEach((preSelectedItem: string) => {
96
- const alreadySelected = selectedItems.value.some(
97
- (selectedItem) => String(selectedItem.value) === String(preSelectedItem),
98
- );
96
+ if (!preSelectedItems.value?.length) return;
99
97
 
100
- if (alreadySelected) return;
98
+ const selected = preSelectedItems.value
99
+ .map((preSelectedItem: string) =>
100
+ localizedMenuList.value.find((menuItem) => String(menuItem.value) === String(preSelectedItem)),
101
+ )
102
+ .filter(Boolean) as MenuListType[];
101
103
 
102
- const item = localizedMenuList.value.find((menuItem) => String(menuItem.value) === String(preSelectedItem));
104
+ if (multiSelect.value) {
105
+ selectedItems.value = selected;
106
+ } else {
107
+ const firstItem = selected[0];
103
108
 
104
- if (item) {
105
- selectedItems.value = [...selectedItems.value, item];
106
- }
107
- });
109
+ if (
110
+ firstItem &&
111
+ !selectedItems.value.some((selectedItem) => String(selectedItem.value) === String(firstItem.value))
112
+ ) {
113
+ selectedItems.value = [firstItem];
114
+ }
108
115
  }
109
116
  };
110
117
 
@@ -114,9 +121,7 @@ export const useList = (props: ListPropTypes, emit: SetupContext<ListEmitTypes>[
114
121
  });
115
122
 
116
123
  const handleSelectedItem = (item: MenuListType) => {
117
- if (!multiSelect.value) {
118
- selectedItems.value = [item];
119
- } else {
124
+ if (multiSelect.value) {
120
125
  const index = selectedItems.value.findIndex((selectedItem: MenuListType) => selectedItem.value === item.value);
121
126
 
122
127
  if (index === -1) {
@@ -127,6 +132,8 @@ export const useList = (props: ListPropTypes, emit: SetupContext<ListEmitTypes>[
127
132
  updatedItems.splice(index, 1);
128
133
  selectedItems.value = updatedItems;
129
134
  }
135
+ } else {
136
+ selectedItems.value = [item];
130
137
  }
131
138
  };
132
139
  // #endregion - Helper Methods
@@ -13,10 +13,10 @@
13
13
  }"
14
14
  >
15
15
  <input
16
+ :id="defaultId"
16
17
  ref="switchRef"
17
18
  v-model="proxyValue"
18
19
  type="checkbox"
19
- :id="defaultId"
20
20
  name="checkbox"
21
21
  :class="[
22
22
  'input spr-absolute spr-left-0 spr-top-0 spr-z-10 spr-m-0 spr-h-6 spr-w-12 spr-opacity-0',
@@ -46,12 +46,22 @@ import { useSwitch } from './use-switch';
46
46
  const props = defineProps(switchPropTypes);
47
47
  const emit = defineEmits(switchEmitTypes);
48
48
 
49
- const defaultId = props.id ? props.id + '_' + Math.random().toString(36).substring(2, 8) : 'switch_input_' + Math.random().toString(36).substring(2, 8);
49
+ const defaultId = props.id
50
+ ? props.id + '_' + Math.random().toString(36).substring(2, 8)
51
+ : 'switch_input_' + Math.random().toString(36).substring(2, 8);
50
52
 
51
53
  const proxyValue = useVModel(props, 'modelValue', emit);
52
54
 
53
- const { switchWrapperRef, switchRef, switchProps, switchMarkClass, switchTextClass, switchInputClass, isLeftTextLabel, isRightTextLabel } =
54
- useSwitch(props);
55
+ const {
56
+ switchWrapperRef,
57
+ switchRef,
58
+ switchProps,
59
+ switchMarkClass,
60
+ switchTextClass,
61
+ switchInputClass,
62
+ isLeftTextLabel,
63
+ isRightTextLabel,
64
+ } = useSwitch(props);
55
65
  </script>
56
66
 
57
67
  <style lang="scss" scoped>