design-system-next 2.15.7 → 2.16.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 (32) hide show
  1. package/dist/design-system-next.es.js +6951 -6512
  2. package/dist/design-system-next.es.js.gz +0 -0
  3. package/dist/design-system-next.umd.js +14 -14
  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 +1 -1
  8. package/package.json +1 -1
  9. package/src/App.vue +43 -1642
  10. package/src/assets/styles/tailwind.css +27 -6
  11. package/src/components/attribute-filter/attribute-filter.ts +134 -0
  12. package/src/components/attribute-filter/attribute-filter.vue +141 -0
  13. package/src/components/attribute-filter/use-attribute-filter.ts +125 -0
  14. package/src/components/card/card.ts +12 -0
  15. package/src/components/card/card.vue +1 -1
  16. package/src/components/card/use-card.ts +33 -12
  17. package/src/components/date-picker/date-picker.ts +13 -5
  18. package/src/components/date-picker/date-picker.vue +2 -1
  19. package/src/components/date-picker/date-range-picker/date-range-picker.ts +14 -6
  20. package/src/components/date-picker/date-range-picker/date-range-picker.vue +2 -1
  21. package/src/components/dropdown/dropdown.ts +26 -27
  22. package/src/components/dropdown/dropdown.vue +52 -42
  23. package/src/components/list/list.ts +0 -4
  24. package/src/components/select/select-ladderized/select-ladderized.ts +16 -12
  25. package/src/components/select/select-ladderized/select-ladderized.vue +11 -8
  26. package/src/components/select/select-ladderized/use-select-ladderized.ts +2 -0
  27. package/src/components/select/select-multiple/select-multiple.ts +8 -4
  28. package/src/components/select/select-multiple/select-multiple.vue +21 -11
  29. package/src/components/select/select-multiple/use-select-multiple.ts +18 -5
  30. package/src/components/select/select.ts +4 -0
  31. package/src/components/select/select.vue +11 -8
  32. package/src/components/select/use-select.ts +4 -2
@@ -39,8 +39,7 @@ export const dropdownPropTypes = {
39
39
  },
40
40
  menuList: {
41
41
  type: Array as PropType<MenuListType[] | string[] | Record<string, unknown>[]>,
42
- required: true,
43
- default: [],
42
+ default: () => [],
44
43
  },
45
44
  searchableMenu: {
46
45
  type: Boolean,
@@ -87,6 +86,29 @@ export const dropdownPropTypes = {
87
86
  type: String,
88
87
  default: '100%',
89
88
  },
89
+ autoHide: {
90
+ type: Boolean,
91
+ default: true,
92
+ },
93
+ triggers: {
94
+ type: Array as PropType<(typeof TRIGGER_EVENTS)[number][]>,
95
+ validator: (value: (typeof TRIGGER_EVENTS)[number][]) => {
96
+ return value.every((val) => TRIGGER_EVENTS.includes(val));
97
+ },
98
+ default: () => ['click'],
99
+ },
100
+ popperTriggers: {
101
+ type: Array as PropType<(typeof TRIGGER_EVENTS)[number][]>,
102
+ validator: (value: (typeof TRIGGER_EVENTS)[number][]) => {
103
+ return value.every((val) => TRIGGER_EVENTS.includes(val));
104
+ },
105
+ default: () => [],
106
+ },
107
+ popperStrategy: {
108
+ type: String,
109
+ validator: (value: 'fixed' | 'absolute') => POPPER_STRATEGY_TYPES.includes(value),
110
+ default: 'absolute',
111
+ },
90
112
  popperWidth: {
91
113
  type: String,
92
114
  default: '100%',
@@ -95,10 +117,9 @@ export const dropdownPropTypes = {
95
117
  type: String,
96
118
  default: 'unset',
97
119
  },
98
- popperStrategy: {
120
+ popperContainer: {
99
121
  type: String,
100
- validator: (value: 'fixed' | 'absolute') => POPPER_STRATEGY_TYPES.includes(value),
101
- default: 'absolute',
122
+ default: '',
102
123
  },
103
124
  disabled: {
104
125
  type: Boolean,
@@ -116,32 +137,10 @@ export const dropdownPropTypes = {
116
137
  type: Boolean,
117
138
  default: false,
118
139
  },
119
- dropdown: {
120
- type: Boolean,
121
- default: false,
122
- },
123
140
  lozenge: {
124
141
  type: Boolean,
125
142
  default: false,
126
143
  },
127
- triggers: {
128
- type: Array as PropType<(typeof TRIGGER_EVENTS)[number][]>,
129
- validator: (value: (typeof TRIGGER_EVENTS)[number][]) => {
130
- return value.every((val) => TRIGGER_EVENTS.includes(val));
131
- },
132
- default: () => ['click'],
133
- },
134
- popperTriggers: {
135
- type: Array as PropType<(typeof TRIGGER_EVENTS)[number][]>,
136
- validator: (value: (typeof TRIGGER_EVENTS)[number][]) => {
137
- return value.every((val) => TRIGGER_EVENTS.includes(val));
138
- },
139
- default: () => [],
140
- },
141
- autoHide: {
142
- type: Boolean,
143
- default: true,
144
- },
145
144
  };
146
145
 
147
146
  export const dropdownEmitTypes = {
@@ -8,7 +8,7 @@
8
8
  :popper-triggers="props.popperTriggers"
9
9
  :auto-hide="props.autoHide"
10
10
  :disabled="isDropdownPopperDisabled"
11
- :container="`#${props.id}`"
11
+ :container="props.popperContainer ? props.popperContainer : `#${props.id}`"
12
12
  :strategy="
13
13
  props.popperStrategy === 'fixed' || props.popperStrategy === 'absolute' ? props.popperStrategy : 'absolute'
14
14
  "
@@ -30,47 +30,57 @@
30
30
  ></div>
31
31
 
32
32
  <template #popper>
33
- <div
34
- ref="dropdownRef"
35
- :class="[
36
- 'spr-grid spr-max-h-[300px] spr-gap-0.5 spr-overflow-y-auto spr-overflow-x-hidden',
37
- !props.ladderized || isLadderizedSearch,
38
- ]"
39
- :style="{
40
- width: props.popperInnerWidth,
41
- }"
42
- >
43
- <template v-if="dropdownMenuList.length > 0">
44
- <spr-list
45
- v-if="!props.ladderized || isLadderizedSearch"
46
- v-model="selectedListItems"
47
- :menu-list="dropdownMenuList"
48
- :searchable-menu="props.searchableMenu"
49
- :group-items-by="props.groupItemsBy"
50
- :multi-select="props.multiSelect"
51
- :pre-selected-items="dropdownValue"
52
- :no-check="props.noCheckInList"
53
- :dropdown="props.dropdown"
54
- :lozenge="props.lozenge"
55
- @update:model-value="handleSelectedItem"
56
- />
57
- <spr-ladderized-list
58
- v-else
59
- v-model="dropdownValue"
60
- :ladderized="props.ladderized"
61
- :dropdown="props.dropdown"
62
- :menu-list="dropdownMenuList"
63
- :searchable-menu="props.searchableMenu"
64
- :remove-current-level-in-back-label="removeCurrentLevelInBackLabel"
65
- @update:model-value="handleSelectedLadderizedItem"
66
- />
67
- </template>
68
- <template v-else>
69
- <div class="spr-flex spr-items-center spr-justify-center spr-p-2 spr-text-center">
70
- <span class="spr-body-sm-regular spr-m-0">No results found</span>
71
- </div>
72
- </template>
73
- </div>
33
+ <template v-if="$slots.popper">
34
+ <div
35
+ class="spr-overflow-y-auto spr-overflow-x-hidden spr-p-2"
36
+ :style="{
37
+ width: props.popperInnerWidth,
38
+ }"
39
+ >
40
+ <slot name="popper" />
41
+ </div>
42
+ </template>
43
+ <template v-else>
44
+ <div
45
+ ref="dropdownRef"
46
+ :class="[
47
+ 'spr-grid spr-max-h-[300px] spr-gap-0.5 spr-overflow-y-auto spr-overflow-x-hidden',
48
+ !props.ladderized || isLadderizedSearch,
49
+ ]"
50
+ :style="{
51
+ width: props.popperInnerWidth,
52
+ }"
53
+ >
54
+ <template v-if="dropdownMenuList.length > 0">
55
+ <spr-list
56
+ v-if="!props.ladderized || isLadderizedSearch"
57
+ v-model="selectedListItems"
58
+ :menu-list="dropdownMenuList"
59
+ :searchable-menu="props.searchableMenu"
60
+ :group-items-by="props.groupItemsBy"
61
+ :multi-select="props.multiSelect"
62
+ :pre-selected-items="dropdownValue"
63
+ :no-check="props.noCheckInList"
64
+ :lozenge="props.lozenge"
65
+ @update:model-value="handleSelectedItem"
66
+ />
67
+ <spr-ladderized-list
68
+ v-else
69
+ v-model="dropdownValue"
70
+ :ladderized="props.ladderized"
71
+ :menu-list="dropdownMenuList"
72
+ :searchable-menu="props.searchableMenu"
73
+ :remove-current-level-in-back-label="removeCurrentLevelInBackLabel"
74
+ @update:model-value="handleSelectedLadderizedItem"
75
+ />
76
+ </template>
77
+ <template v-else>
78
+ <div class="spr-flex spr-items-center spr-justify-center spr-p-2 spr-text-center">
79
+ <span class="spr-body-sm-regular spr-m-0">No results found</span>
80
+ </div>
81
+ </template>
82
+ </div>
83
+ </template>
74
84
  </template>
75
85
  </Menu>
76
86
  </template>
@@ -82,10 +82,6 @@ export const listPropTypes = {
82
82
  type: Boolean,
83
83
  default: false,
84
84
  },
85
- dropdown: {
86
- type: Boolean,
87
- default: false,
88
- },
89
85
  lozenge: {
90
86
  type: Boolean,
91
87
  default: false,
@@ -101,6 +101,10 @@ export const selectLadderizedPropTypes = {
101
101
  type: Number,
102
102
  default: 6,
103
103
  },
104
+ autoHide: {
105
+ type: Boolean,
106
+ default: false,
107
+ },
104
108
  triggers: {
105
109
  type: Array as PropType<(typeof TRIGGER_EVENTS)[number][]>,
106
110
  validator: (value: (typeof TRIGGER_EVENTS)[number][]) => {
@@ -115,26 +119,26 @@ export const selectLadderizedPropTypes = {
115
119
  },
116
120
  default: () => [],
117
121
  },
118
- autoHide: {
119
- type: Boolean,
120
- default: false,
121
- },
122
- wrapperPosition: {
122
+ popperStrategy: {
123
123
  type: String,
124
- default: 'relative',
124
+ validator: (value: 'fixed' | 'absolute') => POPPER_STRATEGY_TYPES.includes(value),
125
+ default: 'absolute',
125
126
  },
126
- width: {
127
+ popperWidth: {
127
128
  type: String,
128
129
  default: '100%',
129
130
  },
130
- popperWidth: {
131
+ popperContainer: {
131
132
  type: String,
132
- default: '100%',
133
+ default: '',
133
134
  },
134
- popperStrategy: {
135
+ wrapperPosition: {
135
136
  type: String,
136
- validator: (value: 'fixed' | 'absolute') => POPPER_STRATEGY_TYPES.includes(value),
137
- default: 'absolute',
137
+ default: 'relative',
138
+ },
139
+ width: {
140
+ type: String,
141
+ default: '100%',
138
142
  },
139
143
  removeCurrentLevelInBackLabel: {
140
144
  type: Boolean,
@@ -16,7 +16,7 @@
16
16
  :popper-triggers="props.popperTriggers"
17
17
  :auto-hide="props.autoHide"
18
18
  :disabled="isLadderizedSelectPopperDisabled"
19
- :container="`#ladderized-select-popper-${props.id}`"
19
+ :container="props.popperContainer ? props.popperContainer : `#ladderized-select-popper-${props.id}`"
20
20
  :strategy="
21
21
  props.popperStrategy === 'fixed' || props.popperStrategy === 'absolute' ? props.popperStrategy : 'absolute'
22
22
  "
@@ -42,13 +42,16 @@
42
42
  :error="props.error"
43
43
  >
44
44
  <template #icon>
45
- <div class="spr-flex spr-items-center spr-gap-1">
46
- <Icon
47
- v-if="props.clearable && inputText"
48
- class="spr-cursor-pointer"
49
- icon="ph:x"
50
- @click.stop="handleClear"
51
- />
45
+ <div
46
+ :class="[
47
+ 'spr-flex spr-items-center spr-gap-1',
48
+ {
49
+ 'spr-cursor-pointer': !props.disabled,
50
+ 'spr-cursor-not-allowed': props.disabled,
51
+ },
52
+ ]"
53
+ >
54
+ <Icon v-if="props.clearable && inputText" icon="ph:x" @click.stop="handleClear" />
52
55
  <Icon icon="ph:caret-down" />
53
56
  </div>
54
57
  </template>
@@ -147,6 +147,8 @@ export const useSelectLadderized = (
147
147
  };
148
148
 
149
149
  const handleClear = () => {
150
+ if (disabled.value) return;
151
+
150
152
  wasCleared.value = true;
151
153
 
152
154
  inputText.value = '';
@@ -87,6 +87,10 @@ export const multiSelectPropTypes = {
87
87
  },
88
88
  default: () => [],
89
89
  },
90
+ autoHide: {
91
+ type: Boolean,
92
+ default: false,
93
+ },
90
94
  popperTriggers: {
91
95
  type: Array as PropType<(typeof TRIGGER_EVENTS)[number][]>,
92
96
  validator: (value: (typeof TRIGGER_EVENTS)[number][]) => {
@@ -94,10 +98,6 @@ export const multiSelectPropTypes = {
94
98
  },
95
99
  default: () => [],
96
100
  },
97
- autoHide: {
98
- type: Boolean,
99
- default: false,
100
- },
101
101
  popperStrategy: {
102
102
  type: String,
103
103
  validator: (value: 'fixed' | 'absolute') => POPPER_STRATEGY_TYPES.includes(value),
@@ -107,6 +107,10 @@ export const multiSelectPropTypes = {
107
107
  type: String,
108
108
  default: '100%',
109
109
  },
110
+ popperContainer: {
111
+ type: String,
112
+ default: '',
113
+ },
110
114
  width: {
111
115
  type: String,
112
116
  default: '100%',
@@ -16,7 +16,7 @@
16
16
  :popper-triggers="props.popperTriggers"
17
17
  :auto-hide="props.autoHide"
18
18
  :disabled="isMultiSelectPopperDisabled"
19
- :container="`#multi-select-${props.id}`"
19
+ :container="props.popperContainer ? props.popperContainer : `#multi-select-${props.id}`"
20
20
  :strategy="
21
21
  props.popperStrategy === 'fixed' || props.popperStrategy === 'absolute' ? props.popperStrategy : 'absolute'
22
22
  "
@@ -48,12 +48,19 @@
48
48
  </template>
49
49
  </div>
50
50
  <div :class="multiSelectClasses.chippedIconClasses">
51
- <div class="spr-flex spr-items-center spr-gap-1">
51
+ <div
52
+ :class="[
53
+ 'spr-flex spr-items-center spr-gap-1',
54
+ {
55
+ 'spr-cursor-pointer': !props.disabled,
56
+ 'spr-cursor-not-allowed': props.disabled,
57
+ },
58
+ ]"
59
+ >
52
60
  <Icon
53
61
  v-if="props.clearable && inputText"
54
- class="spr-cursor-pointer"
55
62
  icon="ph:x"
56
- @click.stop="handleClear"
63
+ @click.stop="!props.disabled ? handleClear : null"
57
64
  />
58
65
  <Icon icon="ph:caret-down" />
59
66
  </div>
@@ -91,13 +98,16 @@
91
98
  :error="props.error"
92
99
  >
93
100
  <template #icon>
94
- <div class="spr-flex spr-items-center spr-gap-1">
95
- <Icon
96
- v-if="props.clearable && inputText"
97
- class="spr-cursor-pointer"
98
- icon="ph:x"
99
- @click.stop="handleClear"
100
- />
101
+ <div
102
+ :class="[
103
+ 'spr-flex spr-items-center spr-gap-1',
104
+ {
105
+ 'spr-cursor-pointer': !props.disabled,
106
+ 'spr-cursor-not-allowed': props.disabled,
107
+ },
108
+ ]"
109
+ >
110
+ <Icon v-if="props.clearable && inputText" icon="ph:x" @click.stop="handleClear" />
101
111
  <Icon icon="ph:caret-down" />
102
112
  </div>
103
113
  </template>
@@ -316,11 +316,13 @@ export const useMultiSelect = (props: MultiSelectPropTypes, emit: SetupContext<M
316
316
  * Clears the selection and input text, and closes the multi-select.
317
317
  */
318
318
  const handleClear = () => {
319
- emit('update:modelValue', []);
319
+ if (disabled.value) return;
320
320
 
321
321
  multiSelectedListItems.value = [];
322
322
  inputText.value = '';
323
323
  multiSelectPopperState.value = false;
324
+
325
+ emit('update:modelValue', []);
324
326
  };
325
327
 
326
328
  watch(multiSelectModel, () => {
@@ -356,11 +358,22 @@ export const useMultiSelect = (props: MultiSelectPropTypes, emit: SetupContext<M
356
358
  /**
357
359
  * Handles closing the multi-select when clicking outside.
358
360
  */
359
- onClickOutside(multiSelectRef, () => {
360
- multiSelectPopperState.value = false;
361
+ onClickOutside(
362
+ multiSelectRef,
363
+ (event) => {
364
+ // If click happened inside the floating popper content, don't treat as outside
365
+ if (multipleSelectPopperRef.value && multipleSelectPopperRef.value.contains(event.target as Node)) {
366
+ return;
367
+ }
361
368
 
362
- updateMultiSelectedItemsFromValue();
363
- });
369
+ multiSelectPopperState.value = false;
370
+
371
+ updateMultiSelectedItemsFromValue();
372
+ },
373
+ {
374
+ ignore: [multipleSelectPopperRef],
375
+ },
376
+ );
364
377
 
365
378
  useInfiniteScroll(
366
379
  multipleSelectPopperRef,
@@ -105,6 +105,10 @@ export const selectPropTypes = {
105
105
  type: String,
106
106
  default: '100%',
107
107
  },
108
+ popperContainer: {
109
+ type: String,
110
+ default: '',
111
+ },
108
112
  width: {
109
113
  type: String,
110
114
  default: '100%',
@@ -16,7 +16,7 @@
16
16
  :popper-triggers="props.popperTriggers"
17
17
  :auto-hide="props.autoHide"
18
18
  :disabled="isSelectPopperDisabled"
19
- :container="`#select-popper-${props.id}`"
19
+ :container="props.popperContainer ? props.popperContainer : `#select-popper-${props.id}`"
20
20
  :strategy="
21
21
  props.popperStrategy === 'fixed' || props.popperStrategy === 'absolute' ? props.popperStrategy : 'absolute'
22
22
  "
@@ -47,13 +47,16 @@
47
47
  @click="props.searchable ? (selectPopperState = true) : null"
48
48
  >
49
49
  <template #icon>
50
- <div class="spr-flex spr-cursor-pointer spr-items-center">
51
- <Icon
52
- v-if="props.clearable && inputText"
53
- class="spr-cursor-pointer"
54
- icon="ph:x"
55
- @click.stop="handleClear"
56
- />
50
+ <div
51
+ :class="[
52
+ 'spr-flex spr-items-center spr-gap-1',
53
+ {
54
+ 'spr-cursor-pointer': !props.disabled,
55
+ 'spr-cursor-not-allowed': props.disabled,
56
+ },
57
+ ]"
58
+ >
59
+ <Icon v-if="props.clearable && inputText" icon="ph:x" @click.stop="handleClear" />
57
60
  <Icon icon="ph:caret-down" />
58
61
  </div>
59
62
  </template>
@@ -301,10 +301,12 @@ export const useSelect = (props: SelectPropTypes, emit: SetupContext<SelectEmitT
301
301
  };
302
302
 
303
303
  const handleClear = () => {
304
- emit('update:modelValue', '');
305
- emit('search-string', '');
304
+ if (disabled.value) return;
306
305
 
307
306
  inputText.value = '';
307
+
308
+ emit('update:modelValue', '');
309
+ emit('search-string', '');
308
310
  };
309
311
 
310
312
  watch(selectModel, () => {