@sellmate/design-system 0.0.12 → 0.0.13

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 (210) hide show
  1. package/dist/{esm/resolveColor-BYf-ybt2.js → cjs/color-Oz29vj7L.js} +6 -14
  2. package/dist/cjs/color-Oz29vj7L.js.map +1 -0
  3. package/dist/cjs/design-system.cjs.js +1 -1
  4. package/dist/cjs/loader.cjs.js +1 -1
  5. package/dist/cjs/resolveColor-CauSLF0s.js +18 -0
  6. package/dist/{esm/resolveColor-BYf-ybt2.js.map → cjs/resolveColor-CauSLF0s.js.map} +1 -1
  7. package/dist/cjs/sd-badge.cjs.entry.js +3 -2
  8. package/dist/cjs/sd-badge.entry.cjs.js.map +1 -1
  9. package/dist/cjs/sd-button.sd-tooltip-portal.entry.cjs.js.map +1 -0
  10. package/dist/cjs/sd-button_2.cjs.entry.js +222 -0
  11. package/dist/cjs/sd-checkbox.sd-icon.sd-input.sd-portal.sd-select.sd-select-multiple.sd-select-multiple-group.sd-select-option.sd-select-option-group.entry.cjs.js.map +1 -0
  12. package/dist/cjs/sd-checkbox_9.cjs.entry.js +1650 -0
  13. package/dist/cjs/{sd-date-box_2.cjs.entry.js → sd-date-box.cjs.entry.js} +1 -119
  14. package/dist/cjs/sd-date-box.entry.cjs.js.map +1 -0
  15. package/dist/cjs/sd-date-picker.cjs.entry.js +2 -2
  16. package/dist/cjs/sd-date-range-picker.cjs.entry.js +2 -2
  17. package/dist/cjs/sd-guide.cjs.entry.js +109 -0
  18. package/dist/cjs/sd-guide.entry.cjs.js.map +1 -0
  19. package/dist/cjs/sd-pagination_2.cjs.entry.js +4 -4
  20. package/dist/cjs/sd-popover.cjs.entry.js +2 -2
  21. package/dist/cjs/sd-table.cjs.entry.js +2 -2
  22. package/dist/cjs/sd-tag.cjs.entry.js +1 -1
  23. package/dist/collection/collection-manifest.json +3 -0
  24. package/dist/collection/components/event-management.js +20 -0
  25. package/dist/collection/components/event-management.js.map +1 -0
  26. package/dist/collection/components/sd-badge/sd-badge.js +1 -1
  27. package/dist/collection/components/sd-checkbox/sd-checkbox.css +2 -1
  28. package/dist/collection/components/sd-checkbox/sd-checkbox.js +1 -1
  29. package/dist/collection/components/sd-date-picker/sd-date-picker.js +2 -2
  30. package/dist/collection/components/sd-date-range-picker/sd-date-range-picker.js +2 -2
  31. package/dist/collection/components/sd-guide/sd-guide.js +2 -2
  32. package/dist/collection/components/sd-icon/sd-icon.js +1 -1
  33. package/dist/collection/components/sd-input/sd-input.js +2 -2
  34. package/dist/collection/components/sd-pagination/sd-pagination.js +2 -2
  35. package/dist/collection/components/sd-popover/sd-popover.js +2 -2
  36. package/dist/collection/components/sd-portal/sd-portal.js +1 -1
  37. package/dist/collection/components/sd-select/sd-select-option/sd-select-option.css +6 -0
  38. package/dist/collection/components/sd-select/sd-select-option/sd-select-option.js +3 -4
  39. package/dist/collection/components/sd-select/sd-select-option/sd-select-option.js.map +1 -1
  40. package/dist/collection/components/sd-select/sd-select.js +7 -136
  41. package/dist/collection/components/sd-select/sd-select.js.map +1 -1
  42. package/dist/collection/components/sd-select-multiple/sd-select-multiple.css +1504 -0
  43. package/dist/collection/components/sd-select-multiple/sd-select-multiple.js +585 -0
  44. package/dist/collection/components/sd-select-multiple/sd-select-multiple.js.map +1 -0
  45. package/dist/collection/components/sd-select-multiple-group/sd-select-multiple-group.css +1499 -0
  46. package/dist/collection/components/sd-select-multiple-group/sd-select-multiple-group.js +754 -0
  47. package/dist/collection/components/sd-select-multiple-group/sd-select-multiple-group.js.map +1 -0
  48. package/dist/collection/components/sd-select-multiple-group/sd-select-option-group/sd-select-option-group.css +1412 -0
  49. package/dist/collection/components/sd-select-multiple-group/sd-select-option-group/sd-select-option-group.js +265 -0
  50. package/dist/collection/components/sd-select-multiple-group/sd-select-option-group/sd-select-option-group.js.map +1 -0
  51. package/dist/collection/components/sd-table/sd-table.js +2 -2
  52. package/dist/collection/components/sd-tag/sd-tag.js +1 -1
  53. package/dist/collection/components/sd-tooltip/sd-tooltip.js +2 -2
  54. package/dist/collection/components/sd-tooltip-portal/sd-tooltip-portal.js +1 -1
  55. package/dist/components/{p-BVMP8_7g.js → p-BBm_kUA7.js} +5 -5
  56. package/dist/components/{p-BVMP8_7g.js.map → p-BBm_kUA7.js.map} +1 -1
  57. package/dist/components/{p-D7VWdAch.js → p-BqCRj-SM.js} +3 -3
  58. package/dist/components/{p-D7VWdAch.js.map → p-BqCRj-SM.js.map} +1 -1
  59. package/dist/components/p-Cf4fh47I.js +106 -0
  60. package/dist/components/p-Cf4fh47I.js.map +1 -0
  61. package/dist/components/{p-hwVfUtSx.js → p-CuDrOaaO.js} +5 -5
  62. package/dist/components/p-CuDrOaaO.js.map +1 -0
  63. package/dist/components/{p-CiTGsdkP.js → p-Cw2pw4LC.js} +7 -7
  64. package/dist/components/{p-CiTGsdkP.js.map → p-Cw2pw4LC.js.map} +1 -1
  65. package/dist/components/{p-BbUf81Wx.js → p-D0hPGqjM.js} +5 -5
  66. package/dist/components/{p-BbUf81Wx.js.map → p-D0hPGqjM.js.map} +1 -1
  67. package/dist/components/{p-exVR_ekC.js → p-D267VRcj.js} +3 -3
  68. package/dist/components/{p-exVR_ekC.js.map → p-D267VRcj.js.map} +1 -1
  69. package/dist/components/{p-CI-1-u3u.js → p-DVFPBdfj.js} +3 -3
  70. package/dist/components/{p-CI-1-u3u.js.map → p-DVFPBdfj.js.map} +1 -1
  71. package/dist/components/{p-CwnpMbLt.js → p-DfkKMnWF.js} +9 -10
  72. package/dist/components/p-DfkKMnWF.js.map +1 -0
  73. package/dist/components/p-sQ8mybM7.js +115 -0
  74. package/dist/components/p-sQ8mybM7.js.map +1 -0
  75. package/dist/components/{p-BO6LLSyN.js → p-tyC8W4sw.js} +3 -3
  76. package/dist/components/{p-BO6LLSyN.js.map → p-tyC8W4sw.js.map} +1 -1
  77. package/dist/components/sd-badge.js +1 -1
  78. package/dist/components/sd-button.js +1 -1
  79. package/dist/components/sd-checkbox.js +1 -1
  80. package/dist/components/sd-date-picker.js +5 -5
  81. package/dist/components/sd-date-range-picker.js +5 -5
  82. package/dist/components/sd-guide.js +5 -5
  83. package/dist/components/sd-icon.js +1 -1
  84. package/dist/components/sd-input.js +1 -1
  85. package/dist/components/sd-pagination.js +1 -1
  86. package/dist/components/sd-popover.js +5 -5
  87. package/dist/components/sd-portal.js +1 -1
  88. package/dist/components/sd-select-multiple-group.d.ts +11 -0
  89. package/dist/components/sd-select-multiple-group.js +389 -0
  90. package/dist/components/sd-select-multiple-group.js.map +1 -0
  91. package/dist/components/sd-select-multiple.d.ts +11 -0
  92. package/dist/components/sd-select-multiple.js +335 -0
  93. package/dist/components/sd-select-multiple.js.map +1 -0
  94. package/dist/components/sd-select-option-group.d.ts +11 -0
  95. package/dist/components/sd-select-option-group.js +9 -0
  96. package/dist/components/sd-select-option-group.js.map +1 -0
  97. package/dist/components/sd-select-option.js +1 -1
  98. package/dist/components/sd-select.js +14 -136
  99. package/dist/components/sd-select.js.map +1 -1
  100. package/dist/components/sd-table.js +8 -8
  101. package/dist/components/sd-tag.js +1 -1
  102. package/dist/components/sd-tooltip-portal.js +1 -1
  103. package/dist/components/sd-tooltip.js +1 -1
  104. package/dist/design-system/design-system.esm.js +1 -1
  105. package/dist/design-system/{p-4cd267c5.entry.js → p-02d30a1b.entry.js} +2 -2
  106. package/dist/design-system/p-0529b7d6.entry.js +2 -0
  107. package/dist/design-system/p-0529b7d6.entry.js.map +1 -0
  108. package/dist/design-system/{p-fe6d6d27.entry.js → p-131f639a.entry.js} +2 -2
  109. package/dist/design-system/p-3fe6dda9.entry.js +2 -0
  110. package/dist/design-system/p-3fe6dda9.entry.js.map +1 -0
  111. package/dist/design-system/p-52454cc4.entry.js +2 -0
  112. package/dist/design-system/p-52454cc4.entry.js.map +1 -0
  113. package/dist/design-system/p-70a394fe.entry.js +2 -0
  114. package/dist/design-system/p-70a394fe.entry.js.map +1 -0
  115. package/dist/design-system/p-7ae03d45.entry.js +2 -0
  116. package/dist/design-system/p-7ae03d45.entry.js.map +1 -0
  117. package/dist/design-system/p-BoLmB6pG.js +2 -0
  118. package/dist/design-system/{p-BYf-ybt2.js.map → p-BoLmB6pG.js.map} +1 -1
  119. package/dist/design-system/{p-BYf-ybt2.js → p-CgyTlXBV.js} +2 -2
  120. package/dist/design-system/p-CgyTlXBV.js.map +1 -0
  121. package/dist/design-system/{p-5af93f6e.entry.js → p-a7ef9b22.entry.js} +2 -2
  122. package/dist/design-system/{p-7dcff5f4.entry.js → p-ab46652a.entry.js} +2 -2
  123. package/dist/design-system/{p-c89d383a.entry.js → p-b5abb919.entry.js} +2 -2
  124. package/dist/design-system/{p-585f1e0c.entry.js → p-cdaa51d7.entry.js} +2 -2
  125. package/dist/design-system/sd-badge.entry.esm.js.map +1 -1
  126. package/dist/design-system/sd-button.sd-tooltip-portal.entry.esm.js.map +1 -0
  127. package/dist/design-system/sd-checkbox.sd-icon.sd-input.sd-portal.sd-select.sd-select-multiple.sd-select-multiple-group.sd-select-option.sd-select-option-group.entry.esm.js.map +1 -0
  128. package/dist/design-system/sd-date-box.entry.esm.js.map +1 -0
  129. package/dist/design-system/sd-guide.entry.esm.js.map +1 -0
  130. package/dist/{cjs/resolveColor-DxvExwgo.js → esm/color-CgyTlXBV.js} +4 -17
  131. package/dist/esm/color-CgyTlXBV.js.map +1 -0
  132. package/dist/esm/design-system.js +1 -1
  133. package/dist/esm/loader.js +1 -1
  134. package/dist/esm/resolveColor-CswQ9y2Q.js +16 -0
  135. package/dist/{cjs/resolveColor-DxvExwgo.js.map → esm/resolveColor-CswQ9y2Q.js.map} +1 -1
  136. package/dist/esm/sd-badge.entry.js +3 -2
  137. package/dist/esm/sd-badge.entry.js.map +1 -1
  138. package/dist/esm/sd-button.sd-tooltip-portal.entry.js.map +1 -0
  139. package/dist/esm/sd-button_2.entry.js +219 -0
  140. package/dist/esm/sd-checkbox.sd-icon.sd-input.sd-portal.sd-select.sd-select-multiple.sd-select-multiple-group.sd-select-option.sd-select-option-group.entry.js.map +1 -0
  141. package/dist/esm/sd-checkbox_9.entry.js +1640 -0
  142. package/dist/esm/{sd-date-box_2.entry.js → sd-date-box.entry.js} +3 -120
  143. package/dist/esm/sd-date-box.entry.js.map +1 -0
  144. package/dist/esm/sd-date-picker.entry.js +2 -2
  145. package/dist/esm/sd-date-range-picker.entry.js +2 -2
  146. package/dist/esm/sd-guide.entry.js +107 -0
  147. package/dist/esm/sd-guide.entry.js.map +1 -0
  148. package/dist/esm/sd-pagination_2.entry.js +4 -4
  149. package/dist/esm/sd-popover.entry.js +2 -2
  150. package/dist/esm/sd-table.entry.js +2 -2
  151. package/dist/esm/sd-tag.entry.js +1 -1
  152. package/dist/types/components/event-management.d.ts +6 -0
  153. package/dist/types/components/sd-select/sd-select.d.ts +0 -6
  154. package/dist/types/components/sd-select-multiple/sd-select-multiple.d.ts +54 -0
  155. package/dist/types/components/sd-select-multiple-group/sd-select-multiple-group.d.ts +75 -0
  156. package/dist/types/components/sd-select-multiple-group/sd-select-option-group/sd-select-option-group.d.ts +24 -0
  157. package/dist/types/components.d.ts +336 -12
  158. package/hydrate/index.js +759 -72
  159. package/hydrate/index.mjs +759 -72
  160. package/package.json +2 -2
  161. package/dist/cjs/sd-button.sd-guide.sd-icon.sd-portal.entry.cjs.js.map +0 -1
  162. package/dist/cjs/sd-button_4.cjs.entry.js +0 -587
  163. package/dist/cjs/sd-checkbox.cjs.entry.js +0 -81
  164. package/dist/cjs/sd-checkbox.entry.cjs.js.map +0 -1
  165. package/dist/cjs/sd-date-box.sd-input.entry.cjs.js.map +0 -1
  166. package/dist/cjs/sd-select-option.cjs.entry.js +0 -55
  167. package/dist/cjs/sd-select-option.entry.cjs.js.map +0 -1
  168. package/dist/cjs/sd-select.cjs.entry.js +0 -371
  169. package/dist/cjs/sd-select.entry.cjs.js.map +0 -1
  170. package/dist/cjs/sd-tooltip-portal.cjs.entry.js +0 -158
  171. package/dist/cjs/sd-tooltip-portal.entry.cjs.js.map +0 -1
  172. package/dist/components/p-CwnpMbLt.js.map +0 -1
  173. package/dist/components/p-hwVfUtSx.js.map +0 -1
  174. package/dist/design-system/p-3824f9a6.entry.js +0 -2
  175. package/dist/design-system/p-3824f9a6.entry.js.map +0 -1
  176. package/dist/design-system/p-71ac64b0.entry.js +0 -2
  177. package/dist/design-system/p-71ac64b0.entry.js.map +0 -1
  178. package/dist/design-system/p-9f6aa159.entry.js +0 -2
  179. package/dist/design-system/p-9f6aa159.entry.js.map +0 -1
  180. package/dist/design-system/p-bfd17f46.entry.js +0 -2
  181. package/dist/design-system/p-bfd17f46.entry.js.map +0 -1
  182. package/dist/design-system/p-c7b6d94d.entry.js +0 -2
  183. package/dist/design-system/p-c7b6d94d.entry.js.map +0 -1
  184. package/dist/design-system/p-ca8e64cf.entry.js +0 -2
  185. package/dist/design-system/p-ca8e64cf.entry.js.map +0 -1
  186. package/dist/design-system/p-d4395043.entry.js +0 -2
  187. package/dist/design-system/p-d4395043.entry.js.map +0 -1
  188. package/dist/design-system/sd-button.sd-guide.sd-icon.sd-portal.entry.esm.js.map +0 -1
  189. package/dist/design-system/sd-checkbox.entry.esm.js.map +0 -1
  190. package/dist/design-system/sd-date-box.sd-input.entry.esm.js.map +0 -1
  191. package/dist/design-system/sd-select-option.entry.esm.js.map +0 -1
  192. package/dist/design-system/sd-select.entry.esm.js.map +0 -1
  193. package/dist/design-system/sd-tooltip-portal.entry.esm.js.map +0 -1
  194. package/dist/esm/sd-button.sd-guide.sd-icon.sd-portal.entry.js.map +0 -1
  195. package/dist/esm/sd-button_4.entry.js +0 -582
  196. package/dist/esm/sd-checkbox.entry.js +0 -79
  197. package/dist/esm/sd-checkbox.entry.js.map +0 -1
  198. package/dist/esm/sd-date-box.sd-input.entry.js.map +0 -1
  199. package/dist/esm/sd-select-option.entry.js +0 -53
  200. package/dist/esm/sd-select-option.entry.js.map +0 -1
  201. package/dist/esm/sd-select.entry.js +0 -369
  202. package/dist/esm/sd-select.entry.js.map +0 -1
  203. package/dist/esm/sd-tooltip-portal.entry.js +0 -156
  204. package/dist/esm/sd-tooltip-portal.entry.js.map +0 -1
  205. /package/dist/design-system/{p-4cd267c5.entry.js.map → p-02d30a1b.entry.js.map} +0 -0
  206. /package/dist/design-system/{p-fe6d6d27.entry.js.map → p-131f639a.entry.js.map} +0 -0
  207. /package/dist/design-system/{p-5af93f6e.entry.js.map → p-a7ef9b22.entry.js.map} +0 -0
  208. /package/dist/design-system/{p-7dcff5f4.entry.js.map → p-ab46652a.entry.js.map} +0 -0
  209. /package/dist/design-system/{p-c89d383a.entry.js.map → p-b5abb919.entry.js.map} +0 -0
  210. /package/dist/design-system/{p-585f1e0c.entry.js.map → p-cdaa51d7.entry.js.map} +0 -0
@@ -0,0 +1,754 @@
1
+ import { Host, h, } from "@stencil/core";
2
+ import { BaseDropdownEvent } from "../../utils/base-dropdown-event";
3
+ import { SelectKeyboardNavigation } from "../../utils/select-keyboard-navigation";
4
+ export class SdSelectMultipleGroup extends BaseDropdownEvent {
5
+ constructor() {
6
+ super();
7
+ }
8
+ el;
9
+ // props
10
+ value = null;
11
+ label = '';
12
+ options = [];
13
+ placeholder = '선택';
14
+ optionPlaceholder = '옵션이 없습니다.';
15
+ width = '200px';
16
+ dropdownHeight = '260px';
17
+ disabled = false;
18
+ clearable = false;
19
+ searchable = false;
20
+ useCheckbox = false;
21
+ // props - custom styles
22
+ containerStyle = {};
23
+ triggerStyle = {};
24
+ dropdownStyle = {};
25
+ optionStyle = {};
26
+ labelStyle = {};
27
+ // props - custom slots
28
+ optionRenderer;
29
+ // states
30
+ filteredOptions = this.options;
31
+ isOpen = false;
32
+ searchText = null;
33
+ itemIndex = -1;
34
+ isScrolled = false;
35
+ // events
36
+ sdChange;
37
+ dropDownShow;
38
+ selectRef;
39
+ searchRef;
40
+ optionRef;
41
+ dropdownRef;
42
+ valueChanged() {
43
+ this.sdChange?.emit(this.value);
44
+ }
45
+ optionsChanged() {
46
+ this.filteredOptions = this.options;
47
+ this.filterOptions();
48
+ }
49
+ searchTextChanged() {
50
+ this.filterOptions();
51
+ }
52
+ async itemIndexChanged(newIndex, oldIndex) {
53
+ if (this.searchable) {
54
+ const searchInput = await this.getNativeInputElement();
55
+ if (this.itemIndex === -1) {
56
+ searchInput?.focus();
57
+ return;
58
+ }
59
+ else if (searchInput?.matches(':focus')) {
60
+ searchInput?.blur();
61
+ }
62
+ }
63
+ const optionElements = Array.from(this.dropdownRef?.querySelectorAll('.sd-select-multiple__dropdown sd-select-option') || []);
64
+ const currentItem = optionElements?.[this.itemIndex];
65
+ if (!currentItem || !this.isOpen)
66
+ return;
67
+ this.optionRef = currentItem;
68
+ const isOptionDisabled = await this.optionRef.isDisabled();
69
+ if (isOptionDisabled) {
70
+ newIndex > oldIndex ? this.itemIndex++ : this.itemIndex--;
71
+ return;
72
+ }
73
+ this.scrollToOption(currentItem);
74
+ }
75
+ async isOpenChanged() {
76
+ // Base class의 이벤트 관리 호출 - 다른 select와의 이벤트 충돌 방지
77
+ this.onDropdownToggle(this.isOpen);
78
+ const selectedOption = this.getSelectedOption();
79
+ if (!selectedOption) {
80
+ this.itemIndex = -1;
81
+ }
82
+ else {
83
+ this.itemIndex = this.options.indexOf(selectedOption[0]);
84
+ }
85
+ this.dropDownShow?.emit({ isOpen: this.isOpen });
86
+ if (this.isOpen === false)
87
+ return;
88
+ await new Promise(resolve => setTimeout(resolve, 10));
89
+ const optionElements = Array.from(this.dropdownRef?.querySelectorAll('.sd-select-multiple__dropdown sd-select-item') || []);
90
+ const currentItem = optionElements?.[this.itemIndex];
91
+ // 드롭다운이 열릴 때 검색 입력에 포커스
92
+ if (this.searchable) {
93
+ const searchInput = await this.getNativeInputElement();
94
+ searchInput?.focus();
95
+ }
96
+ if (!currentItem)
97
+ return;
98
+ await new Promise(resolve => setTimeout(resolve, 10)); // 추가 딜레이
99
+ this.scrollToOption(currentItem);
100
+ }
101
+ connectedCallback() {
102
+ // props가 모두 설정된 후에 실행되므로 올바른 options 값을 가져올 수 있음
103
+ this.filteredOptions = this.options;
104
+ this.initializeEvent(); // global dropdown Manager에 등록 + 이벤트 핸들러 초기화
105
+ }
106
+ disconnectedCallback() {
107
+ this.cleanupEvent(); // global dropdown Manager에서 제거 + 이벤트 정리
108
+ }
109
+ handleDocumentClick(event) {
110
+ if (!this.selectRef?.contains(event.target)) {
111
+ this.isOpen = false;
112
+ }
113
+ }
114
+ handleDocumentKeydown(keyboardEvent) {
115
+ keyboardEvent.stopPropagation();
116
+ const targetKey = ['ArrowDown', 'ArrowUp', 'Enter', 'Escape'];
117
+ if (!targetKey.includes(keyboardEvent.key))
118
+ return;
119
+ keyboardEvent.preventDefault();
120
+ switch (keyboardEvent.key) {
121
+ case 'ArrowDown':
122
+ case 'ArrowUp':
123
+ const keyboardNavigation = new SelectKeyboardNavigation(this.searchable, this.filteredOptions);
124
+ const nextIndex = keyboardNavigation.getNextIndex(this.itemIndex, keyboardEvent.key);
125
+ this.itemIndex = nextIndex;
126
+ break;
127
+ case 'Enter':
128
+ const selectedOption = this.filteredOptions[this.itemIndex];
129
+ if (selectedOption && !selectedOption.disabled) {
130
+ this.handleOptionSelection(selectedOption);
131
+ }
132
+ break;
133
+ case 'Escape':
134
+ this.isOpen = false;
135
+ break;
136
+ }
137
+ }
138
+ // event handlers
139
+ handleTriggerClick = (event) => {
140
+ event.stopPropagation();
141
+ if (!this.disabled) {
142
+ this.isOpen = !this.isOpen;
143
+ this.dropDownShow?.emit({ isOpen: this.isOpen });
144
+ }
145
+ };
146
+ handleOptionClick = (detail) => {
147
+ const { option, event } = detail;
148
+ event.stopPropagation();
149
+ if (option.type === 'group')
150
+ this.handleGroupOptionClick(detail);
151
+ if (option.type === 'subgroup')
152
+ this.handleSubGroupOptionClick(detail);
153
+ if (option.type === 'item')
154
+ this.handleOptionSelection(option);
155
+ };
156
+ handleGroupOptionClick = (detail) => {
157
+ const { option, isSelected } = detail;
158
+ const childOptions = this.options.filter(opt => opt.parent === option.value && !opt.disabled);
159
+ childOptions.forEach(subgroup => {
160
+ this.handleSubGroupOptionClick({
161
+ option: subgroup,
162
+ isSelected: isSelected || isSelected === null,
163
+ });
164
+ });
165
+ };
166
+ handleSubGroupOptionClick = (detail) => {
167
+ const { option, isSelected } = detail;
168
+ const childOptions = this.options.filter(opt => opt.parent === option.value && !opt.disabled);
169
+ if (isSelected || isSelected === null) {
170
+ // 모든 자식 옵션이 선택된 경우, 모두 선택 해제
171
+ this.value =
172
+ this.value?.filter(selected => !childOptions.some(child => child.value === selected.value)) ||
173
+ null;
174
+ }
175
+ else {
176
+ // 일부 또는 전체 자식 옵션이 선택되지 않은 경우, 모두 선택
177
+ const newSelections = childOptions.filter(child => !this.value?.some(selected => selected.value === child.value));
178
+ this.value = [...(this.value || []), ...newSelections];
179
+ }
180
+ };
181
+ filterOptions() {
182
+ if (!this.searchText || this.searchText.trim() === '') {
183
+ // 검색어가 없으면 전체 옵션 표시
184
+ this.filteredOptions = this.options;
185
+ }
186
+ else {
187
+ // 검색어가 있으면 필터링
188
+ this.filteredOptions = this.options.filter(option => option.label.toLowerCase().includes(this.searchText.toLowerCase()));
189
+ }
190
+ }
191
+ getSelectedOption() {
192
+ return this.options.filter(option => this.value?.includes(option));
193
+ }
194
+ handleDropdownScroll = (event) => {
195
+ const target = event.target;
196
+ const scrollTop = target.scrollTop;
197
+ // 스크롤이 조금이라도 되면 그림자 표시
198
+ this.isScrolled = scrollTop > 0;
199
+ };
200
+ async getNativeInputElement() {
201
+ if (this.searchRef) {
202
+ return this.searchRef.getNativeElement();
203
+ }
204
+ return null;
205
+ }
206
+ handleOptionSelection = (option) => {
207
+ if (!option || option.disabled)
208
+ return;
209
+ const isAlreadySelected = this.value?.some(opt => opt.value === option.value);
210
+ if (isAlreadySelected) {
211
+ // 이미 선택된 옵션인 경우, 선택 해제
212
+ this.value = this.value?.filter(opt => opt.value !== option.value) || null;
213
+ }
214
+ else {
215
+ // 새로운 옵션 선택
216
+ this.value = [...(this.value || []), option];
217
+ }
218
+ };
219
+ isAllChildrenSelected(parentOption) {
220
+ const childOptions = this.options.filter(option => option.parent === parentOption.value);
221
+ const isChecked = childOptions.filter(child => this.value?.some(selected => selected.value === child.value));
222
+ if (isChecked.length === childOptions.length)
223
+ return true;
224
+ if (isChecked.length > 0)
225
+ return null;
226
+ return false;
227
+ }
228
+ closeDropdown() {
229
+ this.isOpen = false;
230
+ }
231
+ scrollToOption(optionElement) {
232
+ if (!this.dropdownRef || !optionElement)
233
+ return;
234
+ const dropdown = this.dropdownRef;
235
+ const optionTop = optionElement.offsetTop;
236
+ const optionHeight = optionElement.offsetHeight;
237
+ const dropdownScrollTop = dropdown.scrollTop;
238
+ const dropdownHeight = dropdown.clientHeight;
239
+ const searchContainer = dropdown.querySelector('.sd-select__search-container');
240
+ const searchOffset = searchContainer ? searchContainer.offsetHeight : 0;
241
+ const visibleTop = dropdownScrollTop + searchOffset;
242
+ const visibleBottom = dropdownScrollTop + dropdownHeight;
243
+ if (optionTop < visibleTop) {
244
+ dropdown.scrollTop = optionTop - searchOffset;
245
+ }
246
+ else if (optionTop + optionHeight > visibleBottom) {
247
+ dropdown.scrollTop = optionTop + optionHeight - dropdownHeight + searchOffset;
248
+ }
249
+ }
250
+ render() {
251
+ const style = {
252
+ '--select-width': this.width || '200px',
253
+ '--select-dropdown-height': this.dropdownHeight || '260px',
254
+ };
255
+ return (h(Host, { key: 'b2dd93262b0d07ca7991b9a9c4b4b643ece0132d', style: style }, h("div", { key: '02759e35f71bcc24242d55448218947232232c84', class: {
256
+ 'sd-select-multiple-group': true,
257
+ 'sd-select-multiple-group--open': this.isOpen,
258
+ 'sd-select-multiple-group--disabled': this.disabled,
259
+ }, style: this.containerStyle, ref: el => (this.selectRef = el) }, this.renderLabel(this.label, this.labelStyle), h("div", { key: 'de24276ab88ecad8e49d1766153c84366380cf68', class: "sd-select-multiple-group__container" }, this.renderTrigger(), this.renderDropdown()))));
260
+ }
261
+ renderLabel(label, labelStyle) {
262
+ if (!label)
263
+ return null;
264
+ return (h("label", { class: "sd-select-multiple-group__label", style: labelStyle }, label));
265
+ }
266
+ renderTrigger() {
267
+ const selectedOption = this.getSelectedOption();
268
+ return (h("div", { class: "sd-select-multiple-group__trigger", tabindex: this.disabled ? -1 : 0, onClick: this.handleTriggerClick, style: this.triggerStyle }, h("span", { class: "sd-select-multiple-group__value" }, !selectedOption
269
+ ? '선택'
270
+ : selectedOption.length
271
+ ? selectedOption.map(option => option.label).join(', ')
272
+ : this.placeholder), this.clearable && selectedOption?.length > 0 && !this.disabled && (h("sd-icon", { key: "close-icon", name: "close", size: 10, color: "#888", class: "sd-select-multiple-group__clear", onClick: event => {
273
+ event.stopPropagation();
274
+ this.value = null;
275
+ } })), h("sd-icon", { key: "arrow-icon", name: "arrowDown", color: "#888", class: {
276
+ 'sd-select-multiple-group__arrow': true,
277
+ 'sd-select-multiple-group__arrow--open': this.isOpen,
278
+ } })));
279
+ }
280
+ renderDropdown() {
281
+ if (this.isOpen === false)
282
+ return null;
283
+ return (h("sd-portal", { open: this.isOpen, parentRef: this.selectRef, onSdClose: this.closeDropdown }, h("div", { class: "sd-select-multiple-group__dropdown", style: this.dropdownStyle, onScroll: this.handleDropdownScroll }, this.searchable && (h("div", { class: {
284
+ 'sd-select-multiple-group__search-container': true,
285
+ 'sd-select-multiple-group__search-container--scrolled': this.isScrolled,
286
+ }, onClick: event => event.stopPropagation() }, h("sd-input", { ref: el => (this.searchRef = el), value: this.searchText, placeholder: "\uAC80\uC0C9", clearable: true, inputStyle: { 'padding-left': '8px' }, autofocus: true, onSdInput: event => {
287
+ this.searchText = String(event?.detail);
288
+ }, onSdFocus: () => {
289
+ this.itemIndex = -1;
290
+ } }, h("sd-icon", { name: "search", size: 16, color: "#737373", slot: "prefix" })))), this.filteredOptions.length > 0 ? (this.filteredOptions.map((option, index) => (h("slot", { name: `option-${option.value}` }, h("sd-select-option-group", { option: option, index: index, isSelected: option.type === 'item'
291
+ ? this.value?.some(selected => selected.value === option.value)
292
+ : this.isAllChildrenSelected(option), isFocused: index === this.itemIndex, optionStyle: this.optionStyle, onOptionClick: ({ detail, }) => this.handleOptionClick(detail), useCheckbox: this.useCheckbox }))))) : (h("slot", { name: "option-placeholder" }, h("div", { class: 'sd-select-multiple-group__option-placeholder', style: this.optionStyle }, this.optionPlaceholder))))));
293
+ }
294
+ static get is() { return "sd-select-multiple-group"; }
295
+ static get originalStyleUrls() {
296
+ return {
297
+ "$": ["sd-select-multiple-group.scss"]
298
+ };
299
+ }
300
+ static get styleUrls() {
301
+ return {
302
+ "$": ["sd-select-multiple-group.css"]
303
+ };
304
+ }
305
+ static get properties() {
306
+ return {
307
+ "value": {
308
+ "type": "unknown",
309
+ "mutable": true,
310
+ "complexType": {
311
+ "original": "SelectOptionGroup[] | null",
312
+ "resolved": "SelectOptionGroup[] | null",
313
+ "references": {
314
+ "SelectOptionGroup": {
315
+ "location": "local",
316
+ "path": "C:/Users/KimMeeKyeong/Documents/sellmate/frontend/design-system/packages/stencil/src/components/sd-select-multiple-group/sd-select-multiple-group.tsx",
317
+ "id": "src/components/sd-select-multiple-group/sd-select-multiple-group.tsx::SelectOptionGroup"
318
+ }
319
+ }
320
+ },
321
+ "required": false,
322
+ "optional": false,
323
+ "docs": {
324
+ "tags": [],
325
+ "text": ""
326
+ },
327
+ "getter": false,
328
+ "setter": false,
329
+ "defaultValue": "null"
330
+ },
331
+ "label": {
332
+ "type": "string",
333
+ "mutable": false,
334
+ "complexType": {
335
+ "original": "string",
336
+ "resolved": "string",
337
+ "references": {}
338
+ },
339
+ "required": false,
340
+ "optional": false,
341
+ "docs": {
342
+ "tags": [],
343
+ "text": ""
344
+ },
345
+ "getter": false,
346
+ "setter": false,
347
+ "reflect": false,
348
+ "attribute": "label",
349
+ "defaultValue": "''"
350
+ },
351
+ "options": {
352
+ "type": "unknown",
353
+ "mutable": true,
354
+ "complexType": {
355
+ "original": "SelectOptionGroup[]",
356
+ "resolved": "SelectOptionGroup[]",
357
+ "references": {
358
+ "SelectOptionGroup": {
359
+ "location": "local",
360
+ "path": "C:/Users/KimMeeKyeong/Documents/sellmate/frontend/design-system/packages/stencil/src/components/sd-select-multiple-group/sd-select-multiple-group.tsx",
361
+ "id": "src/components/sd-select-multiple-group/sd-select-multiple-group.tsx::SelectOptionGroup"
362
+ }
363
+ }
364
+ },
365
+ "required": false,
366
+ "optional": false,
367
+ "docs": {
368
+ "tags": [],
369
+ "text": ""
370
+ },
371
+ "getter": false,
372
+ "setter": false,
373
+ "defaultValue": "[]"
374
+ },
375
+ "placeholder": {
376
+ "type": "string",
377
+ "mutable": false,
378
+ "complexType": {
379
+ "original": "string",
380
+ "resolved": "string",
381
+ "references": {}
382
+ },
383
+ "required": false,
384
+ "optional": false,
385
+ "docs": {
386
+ "tags": [],
387
+ "text": ""
388
+ },
389
+ "getter": false,
390
+ "setter": false,
391
+ "reflect": false,
392
+ "attribute": "placeholder",
393
+ "defaultValue": "'\uC120\uD0DD'"
394
+ },
395
+ "optionPlaceholder": {
396
+ "type": "string",
397
+ "mutable": false,
398
+ "complexType": {
399
+ "original": "string",
400
+ "resolved": "string",
401
+ "references": {}
402
+ },
403
+ "required": false,
404
+ "optional": false,
405
+ "docs": {
406
+ "tags": [],
407
+ "text": ""
408
+ },
409
+ "getter": false,
410
+ "setter": false,
411
+ "reflect": false,
412
+ "attribute": "option-placeholder",
413
+ "defaultValue": "'\uC635\uC158\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.'"
414
+ },
415
+ "width": {
416
+ "type": "string",
417
+ "mutable": false,
418
+ "complexType": {
419
+ "original": "string",
420
+ "resolved": "string",
421
+ "references": {}
422
+ },
423
+ "required": false,
424
+ "optional": false,
425
+ "docs": {
426
+ "tags": [],
427
+ "text": ""
428
+ },
429
+ "getter": false,
430
+ "setter": false,
431
+ "reflect": false,
432
+ "attribute": "width",
433
+ "defaultValue": "'200px'"
434
+ },
435
+ "dropdownHeight": {
436
+ "type": "string",
437
+ "mutable": false,
438
+ "complexType": {
439
+ "original": "string",
440
+ "resolved": "string",
441
+ "references": {}
442
+ },
443
+ "required": false,
444
+ "optional": false,
445
+ "docs": {
446
+ "tags": [],
447
+ "text": ""
448
+ },
449
+ "getter": false,
450
+ "setter": false,
451
+ "reflect": false,
452
+ "attribute": "dropdown-height",
453
+ "defaultValue": "'260px'"
454
+ },
455
+ "disabled": {
456
+ "type": "boolean",
457
+ "mutable": false,
458
+ "complexType": {
459
+ "original": "boolean",
460
+ "resolved": "boolean",
461
+ "references": {}
462
+ },
463
+ "required": false,
464
+ "optional": false,
465
+ "docs": {
466
+ "tags": [],
467
+ "text": ""
468
+ },
469
+ "getter": false,
470
+ "setter": false,
471
+ "reflect": false,
472
+ "attribute": "disabled",
473
+ "defaultValue": "false"
474
+ },
475
+ "clearable": {
476
+ "type": "boolean",
477
+ "mutable": false,
478
+ "complexType": {
479
+ "original": "boolean",
480
+ "resolved": "boolean",
481
+ "references": {}
482
+ },
483
+ "required": false,
484
+ "optional": false,
485
+ "docs": {
486
+ "tags": [],
487
+ "text": ""
488
+ },
489
+ "getter": false,
490
+ "setter": false,
491
+ "reflect": false,
492
+ "attribute": "clearable",
493
+ "defaultValue": "false"
494
+ },
495
+ "searchable": {
496
+ "type": "boolean",
497
+ "mutable": false,
498
+ "complexType": {
499
+ "original": "boolean",
500
+ "resolved": "boolean",
501
+ "references": {}
502
+ },
503
+ "required": false,
504
+ "optional": false,
505
+ "docs": {
506
+ "tags": [],
507
+ "text": ""
508
+ },
509
+ "getter": false,
510
+ "setter": false,
511
+ "reflect": false,
512
+ "attribute": "searchable",
513
+ "defaultValue": "false"
514
+ },
515
+ "useCheckbox": {
516
+ "type": "boolean",
517
+ "mutable": false,
518
+ "complexType": {
519
+ "original": "boolean",
520
+ "resolved": "boolean",
521
+ "references": {}
522
+ },
523
+ "required": false,
524
+ "optional": false,
525
+ "docs": {
526
+ "tags": [],
527
+ "text": ""
528
+ },
529
+ "getter": false,
530
+ "setter": false,
531
+ "reflect": false,
532
+ "attribute": "use-checkbox",
533
+ "defaultValue": "false"
534
+ },
535
+ "containerStyle": {
536
+ "type": "unknown",
537
+ "mutable": false,
538
+ "complexType": {
539
+ "original": "SelectStyleProps['containerStyle']",
540
+ "resolved": "undefined | { [key: string]: string; }",
541
+ "references": {
542
+ "SelectStyleProps": {
543
+ "location": "import",
544
+ "path": "../sd-select/sd-select",
545
+ "id": "src/components/sd-select/sd-select.tsx::SelectStyleProps"
546
+ }
547
+ }
548
+ },
549
+ "required": false,
550
+ "optional": false,
551
+ "docs": {
552
+ "tags": [],
553
+ "text": ""
554
+ },
555
+ "getter": false,
556
+ "setter": false,
557
+ "defaultValue": "{}"
558
+ },
559
+ "triggerStyle": {
560
+ "type": "unknown",
561
+ "mutable": false,
562
+ "complexType": {
563
+ "original": "SelectStyleProps['triggerStyle']",
564
+ "resolved": "undefined | { [key: string]: string; }",
565
+ "references": {
566
+ "SelectStyleProps": {
567
+ "location": "import",
568
+ "path": "../sd-select/sd-select",
569
+ "id": "src/components/sd-select/sd-select.tsx::SelectStyleProps"
570
+ }
571
+ }
572
+ },
573
+ "required": false,
574
+ "optional": false,
575
+ "docs": {
576
+ "tags": [],
577
+ "text": ""
578
+ },
579
+ "getter": false,
580
+ "setter": false,
581
+ "defaultValue": "{}"
582
+ },
583
+ "dropdownStyle": {
584
+ "type": "unknown",
585
+ "mutable": false,
586
+ "complexType": {
587
+ "original": "SelectStyleProps['dropdownStyle']",
588
+ "resolved": "undefined | { [key: string]: string; }",
589
+ "references": {
590
+ "SelectStyleProps": {
591
+ "location": "import",
592
+ "path": "../sd-select/sd-select",
593
+ "id": "src/components/sd-select/sd-select.tsx::SelectStyleProps"
594
+ }
595
+ }
596
+ },
597
+ "required": false,
598
+ "optional": false,
599
+ "docs": {
600
+ "tags": [],
601
+ "text": ""
602
+ },
603
+ "getter": false,
604
+ "setter": false,
605
+ "defaultValue": "{}"
606
+ },
607
+ "optionStyle": {
608
+ "type": "unknown",
609
+ "mutable": false,
610
+ "complexType": {
611
+ "original": "SelectStyleProps['optionStyle']",
612
+ "resolved": "undefined | { [key: string]: string; }",
613
+ "references": {
614
+ "SelectStyleProps": {
615
+ "location": "import",
616
+ "path": "../sd-select/sd-select",
617
+ "id": "src/components/sd-select/sd-select.tsx::SelectStyleProps"
618
+ }
619
+ }
620
+ },
621
+ "required": false,
622
+ "optional": false,
623
+ "docs": {
624
+ "tags": [],
625
+ "text": ""
626
+ },
627
+ "getter": false,
628
+ "setter": false,
629
+ "defaultValue": "{}"
630
+ },
631
+ "labelStyle": {
632
+ "type": "unknown",
633
+ "mutable": false,
634
+ "complexType": {
635
+ "original": "SelectStyleProps['labelStyle']",
636
+ "resolved": "undefined | { [key: string]: string; }",
637
+ "references": {
638
+ "SelectStyleProps": {
639
+ "location": "import",
640
+ "path": "../sd-select/sd-select",
641
+ "id": "src/components/sd-select/sd-select.tsx::SelectStyleProps"
642
+ }
643
+ }
644
+ },
645
+ "required": false,
646
+ "optional": false,
647
+ "docs": {
648
+ "tags": [],
649
+ "text": ""
650
+ },
651
+ "getter": false,
652
+ "setter": false,
653
+ "defaultValue": "{}"
654
+ },
655
+ "optionRenderer": {
656
+ "type": "unknown",
657
+ "mutable": false,
658
+ "complexType": {
659
+ "original": "(option: SelectOption, index: number, isSelected: boolean) => any",
660
+ "resolved": "((option: SelectOption, index: number, isSelected: boolean) => any) | undefined",
661
+ "references": {
662
+ "SelectOption": {
663
+ "location": "import",
664
+ "path": "../sd-select/sd-select",
665
+ "id": "src/components/sd-select/sd-select.tsx::SelectOption"
666
+ }
667
+ }
668
+ },
669
+ "required": false,
670
+ "optional": true,
671
+ "docs": {
672
+ "tags": [],
673
+ "text": ""
674
+ },
675
+ "getter": false,
676
+ "setter": false
677
+ }
678
+ };
679
+ }
680
+ static get states() {
681
+ return {
682
+ "filteredOptions": {},
683
+ "isOpen": {},
684
+ "searchText": {},
685
+ "itemIndex": {},
686
+ "isScrolled": {}
687
+ };
688
+ }
689
+ static get events() {
690
+ return [{
691
+ "method": "sdChange",
692
+ "name": "sdChange",
693
+ "bubbles": true,
694
+ "cancelable": true,
695
+ "composed": true,
696
+ "docs": {
697
+ "tags": [],
698
+ "text": ""
699
+ },
700
+ "complexType": {
701
+ "original": "SelectMultipleEvents['sdChange']",
702
+ "resolved": "SelectOption[] | null",
703
+ "references": {
704
+ "SelectMultipleEvents": {
705
+ "location": "import",
706
+ "path": "../sd-select/sd-select",
707
+ "id": "src/components/sd-select/sd-select.tsx::SelectMultipleEvents"
708
+ }
709
+ }
710
+ }
711
+ }, {
712
+ "method": "dropDownShow",
713
+ "name": "dropDownShow",
714
+ "bubbles": true,
715
+ "cancelable": true,
716
+ "composed": true,
717
+ "docs": {
718
+ "tags": [],
719
+ "text": ""
720
+ },
721
+ "complexType": {
722
+ "original": "SelectMultipleEvents['dropDownShow']",
723
+ "resolved": "{ isOpen: boolean; }",
724
+ "references": {
725
+ "SelectMultipleEvents": {
726
+ "location": "import",
727
+ "path": "../sd-select/sd-select",
728
+ "id": "src/components/sd-select/sd-select.tsx::SelectMultipleEvents"
729
+ }
730
+ }
731
+ }
732
+ }];
733
+ }
734
+ static get elementRef() { return "el"; }
735
+ static get watchers() {
736
+ return [{
737
+ "propName": "value",
738
+ "methodName": "valueChanged"
739
+ }, {
740
+ "propName": "options",
741
+ "methodName": "optionsChanged"
742
+ }, {
743
+ "propName": "searchText",
744
+ "methodName": "searchTextChanged"
745
+ }, {
746
+ "propName": "itemIndex",
747
+ "methodName": "itemIndexChanged"
748
+ }, {
749
+ "propName": "isOpen",
750
+ "methodName": "isOpenChanged"
751
+ }];
752
+ }
753
+ }
754
+ //# sourceMappingURL=sd-select-multiple-group.js.map