@ncds/ui-admin 1.6.3 → 1.6.4-alpha.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 (262) hide show
  1. package/mcp/bin/server.d.ts +1 -0
  2. package/mcp/bin/server.js +67 -0
  3. package/mcp/bin/server.mjs +14 -0
  4. package/mcp/bin/tools/getComponentHtml.d.ts +3 -0
  5. package/mcp/bin/tools/getComponentHtml.js +30 -0
  6. package/mcp/bin/tools/getComponentProps.d.ts +3 -0
  7. package/mcp/bin/tools/getComponentProps.js +16 -0
  8. package/mcp/bin/tools/listComponents.d.ts +3 -0
  9. package/mcp/bin/tools/listComponents.js +15 -0
  10. package/mcp/bin/tools/ping.d.ts +11 -0
  11. package/mcp/bin/tools/ping.js +30 -0
  12. package/mcp/bin/tools/searchComponent.d.ts +3 -0
  13. package/mcp/bin/tools/searchComponent.js +20 -0
  14. package/mcp/bin/tools/validateHtml.d.ts +10 -0
  15. package/mcp/bin/tools/validateHtml.js +142 -0
  16. package/mcp/bin/types.d.ts +28 -0
  17. package/mcp/bin/types.js +5 -0
  18. package/mcp/bin/utils/dataLoader.d.ts +11 -0
  19. package/mcp/bin/utils/dataLoader.js +68 -0
  20. package/mcp/bin/utils/logger.d.ts +18 -0
  21. package/mcp/bin/utils/logger.js +27 -0
  22. package/mcp/bin/utils/response.d.ts +23 -0
  23. package/mcp/bin/utils/response.js +31 -0
  24. package/mcp/bin/version.d.ts +1 -0
  25. package/mcp/bin/version.js +4 -0
  26. package/mcp/data/.gitkeep +0 -0
  27. package/mcp/data/_meta.json +7 -0
  28. package/mcp/data/badge-group.json +73 -0
  29. package/mcp/data/badge.json +86 -0
  30. package/mcp/data/bread-crumb.json +22 -0
  31. package/mcp/data/breadcrumb.json +31 -0
  32. package/mcp/data/button-group.json +65 -0
  33. package/mcp/data/button.json +114 -0
  34. package/mcp/data/carousel-arrow.json +59 -0
  35. package/mcp/data/carousel-number-group.json +57 -0
  36. package/mcp/data/carousel.json +22 -0
  37. package/mcp/data/checkbox.json +31 -0
  38. package/mcp/data/combobox.json +114 -0
  39. package/mcp/data/date-picker.json +77 -0
  40. package/mcp/data/divider.json +56 -0
  41. package/mcp/data/dot.json +55 -0
  42. package/mcp/data/dropdown.json +81 -0
  43. package/mcp/data/empty-state.json +34 -0
  44. package/mcp/data/featured-icon.json +83 -0
  45. package/mcp/data/file-input.json +76 -0
  46. package/mcp/data/horizontal-tab.json +71 -0
  47. package/mcp/data/image-file-input.json +97 -0
  48. package/mcp/data/input.json +104 -0
  49. package/mcp/data/modal.json +85 -0
  50. package/mcp/data/notification.json +116 -0
  51. package/mcp/data/number-input.json +128 -0
  52. package/mcp/data/pagination.json +65 -0
  53. package/mcp/data/password-input.json +47 -0
  54. package/mcp/data/progress-bar.json +51 -0
  55. package/mcp/data/progress-circle.json +54 -0
  56. package/mcp/data/radio.json +31 -0
  57. package/mcp/data/range-date-picker-with-buttons.json +64 -0
  58. package/mcp/data/range-date-picker.json +55 -0
  59. package/mcp/data/select-dropdown.json +32 -0
  60. package/mcp/data/select.json +64 -0
  61. package/mcp/data/selectbox.json +129 -0
  62. package/mcp/data/slider.json +57 -0
  63. package/mcp/data/spinner.json +54 -0
  64. package/mcp/data/switch.json +71 -0
  65. package/mcp/data/tab.json +122 -0
  66. package/mcp/data/tag.json +66 -0
  67. package/mcp/data/textarea.json +88 -0
  68. package/mcp/data/toggle.json +59 -0
  69. package/mcp/data/tooltip.json +123 -0
  70. package/mcp/data/vertical-tab.json +64 -0
  71. package/mcp/templates/.mcp.json.example +8 -0
  72. package/mcp/templates/README.md +31 -0
  73. package/package.json +26 -3
  74. package/dist/cjs/assets/scripts/comboBox.js +0 -280
  75. package/dist/cjs/assets/scripts/datePicker.js +0 -706
  76. package/dist/cjs/assets/scripts/featuredIcon.js +0 -95
  77. package/dist/cjs/assets/scripts/fileInput/FileInput.js +0 -183
  78. package/dist/cjs/assets/scripts/fileInput/FileInputModel.js +0 -246
  79. package/dist/cjs/assets/scripts/fileInput/FileInputView.js +0 -455
  80. package/dist/cjs/assets/scripts/fileInput/const/classNames.js +0 -35
  81. package/dist/cjs/assets/scripts/fileInput/const/index.js +0 -27
  82. package/dist/cjs/assets/scripts/fileInput/const/types.js +0 -13
  83. package/dist/cjs/assets/scripts/fileInput/index.js +0 -44
  84. package/dist/cjs/assets/scripts/imageFileInput/ImageFileInput.js +0 -187
  85. package/dist/cjs/assets/scripts/imageFileInput/ImageFileInputModel.js +0 -255
  86. package/dist/cjs/assets/scripts/imageFileInput/ImageFileInputView.js +0 -354
  87. package/dist/cjs/assets/scripts/imageFileInput/const/classNames.js +0 -41
  88. package/dist/cjs/assets/scripts/imageFileInput/const/index.js +0 -27
  89. package/dist/cjs/assets/scripts/imageFileInput/const/types.js +0 -13
  90. package/dist/cjs/assets/scripts/imageFileInput/index.js +0 -44
  91. package/dist/cjs/assets/scripts/index.js +0 -30
  92. package/dist/cjs/assets/scripts/modal/Modal.js +0 -116
  93. package/dist/cjs/assets/scripts/modal/ModalActions.js +0 -128
  94. package/dist/cjs/assets/scripts/modal/ModalContent.js +0 -46
  95. package/dist/cjs/assets/scripts/modal/ModalHeader.js +0 -115
  96. package/dist/cjs/assets/scripts/modal/const/classNames.js +0 -41
  97. package/dist/cjs/assets/scripts/modal/const/index.js +0 -27
  98. package/dist/cjs/assets/scripts/modal/const/types.js +0 -5
  99. package/dist/cjs/assets/scripts/modal/index.js +0 -61
  100. package/dist/cjs/assets/scripts/modal/utils/contentUtils.js +0 -35
  101. package/dist/cjs/assets/scripts/notification/FloatingNotification.js +0 -180
  102. package/dist/cjs/assets/scripts/notification/FullWidthNotification.js +0 -120
  103. package/dist/cjs/assets/scripts/notification/MessageNotification.js +0 -146
  104. package/dist/cjs/assets/scripts/notification/Notification.js +0 -116
  105. package/dist/cjs/assets/scripts/notification/const/classNames.js +0 -50
  106. package/dist/cjs/assets/scripts/notification/const/icons.js +0 -45
  107. package/dist/cjs/assets/scripts/notification/const/index.js +0 -87
  108. package/dist/cjs/assets/scripts/notification/const/sizes.js +0 -54
  109. package/dist/cjs/assets/scripts/notification/const/types.js +0 -14
  110. package/dist/cjs/assets/scripts/notification/index.js +0 -92
  111. package/dist/cjs/assets/scripts/notification/utils.js +0 -92
  112. package/dist/cjs/assets/scripts/progress-bar/ProgressBar.js +0 -272
  113. package/dist/cjs/assets/scripts/progress-bar/index.js +0 -12
  114. package/dist/cjs/assets/scripts/selectBox.js +0 -319
  115. package/dist/cjs/assets/scripts/shared/ButtonCloseX.js +0 -46
  116. package/dist/cjs/assets/scripts/tab.js +0 -40
  117. package/dist/cjs/assets/scripts/tag/Tag.js +0 -268
  118. package/dist/cjs/assets/scripts/tag/const/classNames.js +0 -24
  119. package/dist/cjs/assets/scripts/tag/const/index.js +0 -38
  120. package/dist/cjs/assets/scripts/tag/const/sizes.js +0 -13
  121. package/dist/cjs/assets/scripts/tag/const/types.js +0 -5
  122. package/dist/cjs/assets/scripts/tag/index.js +0 -44
  123. package/dist/cjs/assets/scripts/tooltip/Tooltip.js +0 -380
  124. package/dist/cjs/assets/scripts/tooltip/TooltipLayerManager.js +0 -84
  125. package/dist/cjs/assets/scripts/tooltip/const/classNames.js +0 -29
  126. package/dist/cjs/assets/scripts/tooltip/const/constants.js +0 -56
  127. package/dist/cjs/assets/scripts/tooltip/const/icons.js +0 -15
  128. package/dist/cjs/assets/scripts/tooltip/const/index.js +0 -123
  129. package/dist/cjs/assets/scripts/tooltip/const/templates.js +0 -49
  130. package/dist/cjs/assets/scripts/tooltip/const/types.js +0 -5
  131. package/dist/cjs/assets/scripts/tooltip/index.js +0 -57
  132. package/dist/cjs/assets/scripts/tooltip/utils.js +0 -41
  133. package/dist/cjs/assets/scripts/utils/unifiedBox/DOMRenderer.js +0 -384
  134. package/dist/cjs/assets/scripts/utils/unifiedBox/DropdownModel.js +0 -368
  135. package/dist/cjs/assets/scripts/utils/unifiedBox/UnifiedBoxController.js +0 -681
  136. package/dist/cjs/assets/scripts/utils/unifiedBox/UnifiedBoxManager.js +0 -711
  137. package/dist/esm/assets/scripts/comboBox.js +0 -275
  138. package/dist/esm/assets/scripts/datePicker.js +0 -699
  139. package/dist/esm/assets/scripts/featuredIcon.js +0 -90
  140. package/dist/esm/assets/scripts/fileInput/FileInput.js +0 -178
  141. package/dist/esm/assets/scripts/fileInput/FileInputModel.js +0 -241
  142. package/dist/esm/assets/scripts/fileInput/FileInputView.js +0 -450
  143. package/dist/esm/assets/scripts/fileInput/const/classNames.js +0 -25
  144. package/dist/esm/assets/scripts/fileInput/const/index.js +0 -2
  145. package/dist/esm/assets/scripts/fileInput/const/types.js +0 -7
  146. package/dist/esm/assets/scripts/fileInput/index.js +0 -9
  147. package/dist/esm/assets/scripts/imageFileInput/ImageFileInput.js +0 -182
  148. package/dist/esm/assets/scripts/imageFileInput/ImageFileInputModel.js +0 -250
  149. package/dist/esm/assets/scripts/imageFileInput/ImageFileInputView.js +0 -349
  150. package/dist/esm/assets/scripts/imageFileInput/const/classNames.js +0 -30
  151. package/dist/esm/assets/scripts/imageFileInput/const/index.js +0 -2
  152. package/dist/esm/assets/scripts/imageFileInput/const/types.js +0 -7
  153. package/dist/esm/assets/scripts/imageFileInput/index.js +0 -9
  154. package/dist/esm/assets/scripts/index.js +0 -28
  155. package/dist/esm/assets/scripts/modal/Modal.js +0 -110
  156. package/dist/esm/assets/scripts/modal/ModalActions.js +0 -123
  157. package/dist/esm/assets/scripts/modal/ModalContent.js +0 -41
  158. package/dist/esm/assets/scripts/modal/ModalHeader.js +0 -110
  159. package/dist/esm/assets/scripts/modal/const/classNames.js +0 -31
  160. package/dist/esm/assets/scripts/modal/const/index.js +0 -2
  161. package/dist/esm/assets/scripts/modal/const/types.js +0 -1
  162. package/dist/esm/assets/scripts/modal/index.js +0 -15
  163. package/dist/esm/assets/scripts/modal/utils/contentUtils.js +0 -28
  164. package/dist/esm/assets/scripts/notification/FloatingNotification.js +0 -176
  165. package/dist/esm/assets/scripts/notification/FullWidthNotification.js +0 -115
  166. package/dist/esm/assets/scripts/notification/MessageNotification.js +0 -141
  167. package/dist/esm/assets/scripts/notification/Notification.js +0 -111
  168. package/dist/esm/assets/scripts/notification/const/classNames.js +0 -44
  169. package/dist/esm/assets/scripts/notification/const/icons.js +0 -39
  170. package/dist/esm/assets/scripts/notification/const/index.js +0 -4
  171. package/dist/esm/assets/scripts/notification/const/sizes.js +0 -48
  172. package/dist/esm/assets/scripts/notification/const/types.js +0 -8
  173. package/dist/esm/assets/scripts/notification/index.js +0 -11
  174. package/dist/esm/assets/scripts/notification/utils.js +0 -79
  175. package/dist/esm/assets/scripts/progress-bar/ProgressBar.js +0 -267
  176. package/dist/esm/assets/scripts/progress-bar/index.js +0 -1
  177. package/dist/esm/assets/scripts/selectBox.js +0 -314
  178. package/dist/esm/assets/scripts/shared/ButtonCloseX.js +0 -38
  179. package/dist/esm/assets/scripts/tab.js +0 -35
  180. package/dist/esm/assets/scripts/tag/Tag.js +0 -263
  181. package/dist/esm/assets/scripts/tag/const/classNames.js +0 -16
  182. package/dist/esm/assets/scripts/tag/const/index.js +0 -3
  183. package/dist/esm/assets/scripts/tag/const/sizes.js +0 -7
  184. package/dist/esm/assets/scripts/tag/const/types.js +0 -1
  185. package/dist/esm/assets/scripts/tag/index.js +0 -9
  186. package/dist/esm/assets/scripts/tooltip/Tooltip.js +0 -375
  187. package/dist/esm/assets/scripts/tooltip/TooltipLayerManager.js +0 -79
  188. package/dist/esm/assets/scripts/tooltip/const/classNames.js +0 -23
  189. package/dist/esm/assets/scripts/tooltip/const/constants.js +0 -50
  190. package/dist/esm/assets/scripts/tooltip/const/icons.js +0 -9
  191. package/dist/esm/assets/scripts/tooltip/const/index.js +0 -4
  192. package/dist/esm/assets/scripts/tooltip/const/templates.js +0 -42
  193. package/dist/esm/assets/scripts/tooltip/const/types.js +0 -1
  194. package/dist/esm/assets/scripts/tooltip/index.js +0 -10
  195. package/dist/esm/assets/scripts/tooltip/utils.js +0 -35
  196. package/dist/esm/assets/scripts/utils/unifiedBox/DOMRenderer.js +0 -379
  197. package/dist/esm/assets/scripts/utils/unifiedBox/DropdownModel.js +0 -363
  198. package/dist/esm/assets/scripts/utils/unifiedBox/UnifiedBoxController.js +0 -676
  199. package/dist/esm/assets/scripts/utils/unifiedBox/UnifiedBoxManager.js +0 -706
  200. package/dist/types/assets/scripts/comboBox.d.ts +0 -91
  201. package/dist/types/assets/scripts/datePicker.d.ts +0 -87
  202. package/dist/types/assets/scripts/featuredIcon.d.ts +0 -23
  203. package/dist/types/assets/scripts/fileInput/FileInput.d.ts +0 -67
  204. package/dist/types/assets/scripts/fileInput/FileInputModel.d.ts +0 -70
  205. package/dist/types/assets/scripts/fileInput/FileInputView.d.ts +0 -77
  206. package/dist/types/assets/scripts/fileInput/const/classNames.d.ts +0 -17
  207. package/dist/types/assets/scripts/fileInput/const/index.d.ts +0 -3
  208. package/dist/types/assets/scripts/fileInput/const/types.d.ts +0 -132
  209. package/dist/types/assets/scripts/fileInput/index.d.ts +0 -4
  210. package/dist/types/assets/scripts/imageFileInput/ImageFileInput.d.ts +0 -64
  211. package/dist/types/assets/scripts/imageFileInput/ImageFileInputModel.d.ts +0 -74
  212. package/dist/types/assets/scripts/imageFileInput/ImageFileInputView.d.ts +0 -80
  213. package/dist/types/assets/scripts/imageFileInput/const/classNames.d.ts +0 -20
  214. package/dist/types/assets/scripts/imageFileInput/const/index.d.ts +0 -3
  215. package/dist/types/assets/scripts/imageFileInput/const/types.d.ts +0 -126
  216. package/dist/types/assets/scripts/imageFileInput/index.d.ts +0 -4
  217. package/dist/types/assets/scripts/index.d.ts +0 -33
  218. package/dist/types/assets/scripts/modal/Modal.d.ts +0 -28
  219. package/dist/types/assets/scripts/modal/ModalActions.d.ts +0 -19
  220. package/dist/types/assets/scripts/modal/ModalContent.d.ts +0 -14
  221. package/dist/types/assets/scripts/modal/ModalHeader.d.ts +0 -16
  222. package/dist/types/assets/scripts/modal/const/classNames.d.ts +0 -23
  223. package/dist/types/assets/scripts/modal/const/index.d.ts +0 -3
  224. package/dist/types/assets/scripts/modal/const/types.d.ts +0 -62
  225. package/dist/types/assets/scripts/modal/index.d.ts +0 -8
  226. package/dist/types/assets/scripts/modal/utils/contentUtils.d.ts +0 -11
  227. package/dist/types/assets/scripts/notification/FloatingNotification.d.ts +0 -25
  228. package/dist/types/assets/scripts/notification/FullWidthNotification.d.ts +0 -22
  229. package/dist/types/assets/scripts/notification/MessageNotification.d.ts +0 -23
  230. package/dist/types/assets/scripts/notification/Notification.d.ts +0 -22
  231. package/dist/types/assets/scripts/notification/const/classNames.d.ts +0 -44
  232. package/dist/types/assets/scripts/notification/const/icons.d.ts +0 -26
  233. package/dist/types/assets/scripts/notification/const/index.d.ts +0 -6
  234. package/dist/types/assets/scripts/notification/const/sizes.d.ts +0 -33
  235. package/dist/types/assets/scripts/notification/const/types.d.ts +0 -20
  236. package/dist/types/assets/scripts/notification/index.d.ts +0 -8
  237. package/dist/types/assets/scripts/notification/utils.d.ts +0 -9
  238. package/dist/types/assets/scripts/progress-bar/ProgressBar.d.ts +0 -68
  239. package/dist/types/assets/scripts/progress-bar/index.d.ts +0 -2
  240. package/dist/types/assets/scripts/selectBox.d.ts +0 -77
  241. package/dist/types/assets/scripts/shared/ButtonCloseX.d.ts +0 -6
  242. package/dist/types/assets/scripts/tab.d.ts +0 -8
  243. package/dist/types/assets/scripts/tag/Tag.d.ts +0 -28
  244. package/dist/types/assets/scripts/tag/const/classNames.d.ts +0 -12
  245. package/dist/types/assets/scripts/tag/const/index.d.ts +0 -4
  246. package/dist/types/assets/scripts/tag/const/sizes.d.ts +0 -8
  247. package/dist/types/assets/scripts/tag/const/types.d.ts +0 -34
  248. package/dist/types/assets/scripts/tag/index.d.ts +0 -4
  249. package/dist/types/assets/scripts/tooltip/Tooltip.d.ts +0 -55
  250. package/dist/types/assets/scripts/tooltip/TooltipLayerManager.d.ts +0 -22
  251. package/dist/types/assets/scripts/tooltip/const/classNames.d.ts +0 -18
  252. package/dist/types/assets/scripts/tooltip/const/constants.d.ts +0 -34
  253. package/dist/types/assets/scripts/tooltip/const/icons.d.ts +0 -5
  254. package/dist/types/assets/scripts/tooltip/const/index.d.ts +0 -6
  255. package/dist/types/assets/scripts/tooltip/const/templates.d.ts +0 -17
  256. package/dist/types/assets/scripts/tooltip/const/types.d.ts +0 -15
  257. package/dist/types/assets/scripts/tooltip/index.d.ts +0 -7
  258. package/dist/types/assets/scripts/tooltip/utils.d.ts +0 -3
  259. package/dist/types/assets/scripts/utils/unifiedBox/DOMRenderer.d.ts +0 -108
  260. package/dist/types/assets/scripts/utils/unifiedBox/DropdownModel.d.ts +0 -158
  261. package/dist/types/assets/scripts/utils/unifiedBox/UnifiedBoxController.d.ts +0 -171
  262. package/dist/types/assets/scripts/utils/unifiedBox/UnifiedBoxManager.d.ts +0 -99
@@ -1,676 +0,0 @@
1
- var __assign = this && this.__assign || function () {
2
- __assign = Object.assign || function (t) {
3
- for (var s, i = 1, n = arguments.length; i < n; i++) {
4
- s = arguments[i];
5
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
6
- }
7
- return t;
8
- };
9
- return __assign.apply(this, arguments);
10
- };
11
- /**
12
- * SelectBox 통합 컨트롤러
13
- * 이벤트 처리, UI 상태 제어, 사용자 인터랙션 담당
14
- */
15
- var UnifiedBoxController = /** @class */function () {
16
- function UnifiedBoxController(config) {
17
- this.isOpen = false;
18
- this.focusedIndex = -1;
19
- this.isKeyboardNavigation = false;
20
- this.scrollLockHandlers = null;
21
- // DOM 요소들
22
- this.optionElements = [];
23
- this.scrollPosition = 0;
24
- this.mouseMoveHandlerAttached = false;
25
- this.lastFilteredOptionsCount = 0; // 이전 필터링된 옵션 개수 (성능 최적화)
26
- this.lastFilteredOptionsHash = ''; // 이전 필터링된 옵션 해시 (성능 최적화)
27
- this.lastScrollBottomTime = 0;
28
- this.config = config;
29
- this.setupEventHandlers();
30
- this.config.model.addListener(this);
31
- }
32
- /**
33
- * 상태 변경 리스너 (Observer Pattern)
34
- */
35
- UnifiedBoxController.prototype.onStateChange = function (newState, changedFields) {
36
- var _a, _b;
37
- // 드롭다운 열기/닫기 상태 동기화
38
- if (changedFields.includes('isOpen')) {
39
- this.isOpen = newState.isOpen;
40
- this.updateDropdownVisibility(newState.isOpen);
41
- }
42
- // 포커스 상태 동기화
43
- if (changedFields.includes('focusedIndex')) {
44
- this.focusedIndex = newState.focusedIndex;
45
- this.updateFocusedOption(newState.focusedIndex);
46
- }
47
- // 옵션 리스트 업데이트
48
- if (this.shouldUpdateOptions(changedFields)) {
49
- this.updateOptionsDisplay(newState);
50
- }
51
- // 선택 상태 변경 알림
52
- if (changedFields.includes('selectedValues')) {
53
- (_b = (_a = this.config).onSelectionChange) === null || _b === void 0 ? void 0 : _b.call(_a, newState.selectedValues);
54
- }
55
- // 검색어 변경 알림은 UnifiedSelectBox에서 디바운싱 적용 후 처리하므로 여기서는 호출하지 않음
56
- // (디바운싱이 적용되지 않은 즉시 호출을 방지하기 위해)
57
- };
58
- /**
59
- * 이벤트 핸들러 설정
60
- */
61
- UnifiedBoxController.prototype.setupEventHandlers = function () {
62
- var _this = this;
63
- // 외부 클릭 핸들러
64
- this.outsideClickHandler = function (e) {
65
- var target = e.target;
66
- var isInsideTrigger = _this.config.triggerElement.contains(target);
67
- var isInsideDropdown = _this.config.dropdownElement.contains(target);
68
- if (isInsideTrigger || isInsideDropdown) {
69
- return;
70
- }
71
- _this.close();
72
- };
73
- // 키보드 핸들러
74
- this.keyDownHandler = function (e) {
75
- _this.handleKeyDown(e);
76
- };
77
- if (this.config.type !== 'combobox') {
78
- this.config.triggerElement.addEventListener('click', function () {
79
- var _a, _b;
80
- if (!_this.config.disabled && ((_b = (_a = _this.config).canToggle) === null || _b === void 0 ? void 0 : _b.call(_a)) !== false) {
81
- _this.toggle();
82
- }
83
- });
84
- }
85
- // 키보드 이벤트
86
- this.config.triggerElement.addEventListener('keydown', this.keyDownHandler);
87
- };
88
- /**
89
- * 드롭다운 열기
90
- */
91
- UnifiedBoxController.prototype.open = function () {
92
- var _a, _b;
93
- if (this.config.disabled || this.isOpen) return;
94
- this.config.model.setOpen(true);
95
- this.adjustDropdownPosition();
96
- this.enableOutsideClick();
97
- this.enableScrollLock();
98
- this.enableScrollBottomDetection(); // 스크롤 감지 활성화
99
- (_b = (_a = this.config).onOpen) === null || _b === void 0 ? void 0 : _b.call(_a);
100
- };
101
- /**
102
- * 드롭다운 닫기
103
- */
104
- UnifiedBoxController.prototype.close = function () {
105
- var _a, _b;
106
- if (!this.isOpen) return;
107
- this.config.model.setOpen(false);
108
- this.disableOutsideClick();
109
- this.disableScrollLock();
110
- this.disableScrollBottomDetection(); // 스크롤 감지 비활성화
111
- this.isKeyboardNavigation = false;
112
- (_b = (_a = this.config).onClose) === null || _b === void 0 ? void 0 : _b.call(_a);
113
- };
114
- /**
115
- * 드롭다운 토글
116
- */
117
- UnifiedBoxController.prototype.toggle = function () {
118
- if (this.isOpen) {
119
- this.close();
120
- } else {
121
- this.open();
122
- }
123
- };
124
- /**
125
- * 키보드 입력 처리
126
- */
127
- UnifiedBoxController.prototype.handleKeyDown = function (event) {
128
- var state = this.config.model.getState();
129
- switch (event.key) {
130
- case 'ArrowDown':
131
- event.preventDefault();
132
- this.isKeyboardNavigation = true;
133
- if (!state.isOpen) {
134
- this.open();
135
- } else {
136
- this.config.model.setFocusedIndex(state.focusedIndex + 1);
137
- }
138
- break;
139
- case 'ArrowUp':
140
- event.preventDefault();
141
- this.isKeyboardNavigation = true;
142
- if (state.isOpen) {
143
- this.config.model.setFocusedIndex(state.focusedIndex - 1);
144
- }
145
- break;
146
- case 'Enter':
147
- event.preventDefault();
148
- if (state.isOpen && state.focusedIndex >= 0 && state.focusedIndex < state.filteredOptions.length) {
149
- var focusedOption = state.filteredOptions[state.focusedIndex];
150
- this.config.model.toggleOption(focusedOption.id);
151
- }
152
- break;
153
- case 'Escape':
154
- event.preventDefault();
155
- if (state.isOpen) {
156
- this.close();
157
- }
158
- break;
159
- default:
160
- // 문자 입력으로 옵션 검색
161
- if (event.key.length === 1 && !event.ctrlKey && !event.metaKey) {
162
- this.searchOption(event.key);
163
- }
164
- break;
165
- }
166
- };
167
- /**
168
- * 옵션 검색
169
- */
170
- UnifiedBoxController.prototype.searchOption = function (char) {
171
- var state = this.config.model.getState();
172
- var options = state.filteredOptions;
173
- var startIndex = this.focusedIndex >= 0 ? this.focusedIndex + 1 : 0;
174
- for (var i = 0; i < options.length; i++) {
175
- var index = (startIndex + i) % options.length;
176
- var option = options[index];
177
- // option.label이 존재하고 문자열인지 확인
178
- if (option && option.label && typeof option.label === 'string') {
179
- if (option.label.toLowerCase().startsWith(char.toLowerCase())) {
180
- this.config.model.setFocusedIndex(index);
181
- break;
182
- }
183
- }
184
- }
185
- };
186
- /**
187
- * 드롭다운 표시/숨김 업데이트
188
- */
189
- UnifiedBoxController.prototype.updateDropdownVisibility = function (isOpen) {
190
- this.config.dropdownElement.style.display = isOpen ? 'block' : 'none';
191
- };
192
- /**
193
- * 옵션 표시 업데이트
194
- */
195
- UnifiedBoxController.prototype.updateOptionsDisplay = function (state) {
196
- var hasFilteredOptions = state.filteredOptions.length > 0;
197
- var countChanged = this.lastFilteredOptionsCount !== state.filteredOptions.length;
198
- // 빈 옵션일 때 해시 초기화 및 전체 렌더링
199
- if (!hasFilteredOptions) {
200
- this.lastFilteredOptionsHash = '';
201
- this.lastFilteredOptionsCount = 0;
202
- } else {
203
- // 옵션 개수가 변경되었는지 먼저 확인 (빠른 체크)
204
- var optionsChanged = countChanged;
205
- // 개수가 변경되지 않았을 때만 해시 계산 (O(n) 연산 최소화)
206
- if (!optionsChanged) {
207
- var currentHash = state.filteredOptions.map(function (opt) {
208
- return opt.id;
209
- }).join(',');
210
- optionsChanged = this.lastFilteredOptionsHash !== currentHash;
211
- if (optionsChanged) {
212
- this.lastFilteredOptionsHash = currentHash;
213
- }
214
- } else {
215
- // 개수가 변경되었으면 해시도 재계산
216
- this.lastFilteredOptionsHash = state.filteredOptions.map(function (opt) {
217
- return opt.id;
218
- }).join(',');
219
- }
220
- // 옵션이 변경되지 않았고 선택 상태만 변경된 경우 DOM 조작만 수행
221
- if (!optionsChanged) {
222
- // 선택 상태만 업데이트 (전체 재렌더링 방지)
223
- this.optionElements.forEach(function (element, index) {
224
- var _a;
225
- var optionId = (_a = state.filteredOptions[index]) === null || _a === void 0 ? void 0 : _a.id;
226
- if (!optionId) return;
227
- var isSelected = state.selectedValues.includes(optionId);
228
- var isFocused = index === state.focusedIndex;
229
- // 선택 상태 업데이트
230
- if (isSelected) {
231
- element.classList.add('ncua-select-dropdown__option--selected');
232
- element.setAttribute('aria-selected', 'true');
233
- } else {
234
- element.classList.remove('ncua-select-dropdown__option--selected');
235
- element.setAttribute('aria-selected', 'false');
236
- }
237
- // 포커스 상태 업데이트
238
- if (isFocused) {
239
- element.classList.add('ncua-select-dropdown__option--focused');
240
- } else {
241
- element.classList.remove('ncua-select-dropdown__option--focused');
242
- }
243
- });
244
- return; // 전체 재렌더링 불필요
245
- }
246
- }
247
- // 옵션이 변경되었거나 빈 경우에만 전체 렌더링
248
- var renderableOptions = state.filteredOptions.map(function (option, index) {
249
- return __assign(__assign({}, option), {
250
- selected: state.selectedValues.includes(option.id),
251
- focused: index === state.focusedIndex
252
- });
253
- });
254
- var showNoResults = state.filteredOptions.length === 0 && (state.showAllItems || state.searchValue.length > 0);
255
- var optionsList = this.config.dropdownElement.querySelector('.ncua-select-dropdown__options');
256
- if (optionsList) {
257
- this.optionElements = this.config.renderer.updateOptionsList(optionsList, renderableOptions, this.config.renderConfig, showNoResults);
258
- // 옵션 클릭 이벤트 등록
259
- this.attachOptionEventHandlers();
260
- // 캐시 업데이트 (이미 위에서 업데이트했으면 다시 업데이트하지 않음)
261
- if (!this.lastFilteredOptionsHash) {
262
- this.lastFilteredOptionsHash = state.filteredOptions.map(function (opt) {
263
- return opt.id;
264
- }).join(',');
265
- }
266
- this.lastFilteredOptionsCount = state.filteredOptions.length;
267
- }
268
- };
269
- /**
270
- * 포커스된 옵션 업데이트
271
- */
272
- UnifiedBoxController.prototype.updateFocusedOption = function (focusedIndex) {
273
- this.optionElements.forEach(function (element, index) {
274
- if (index === focusedIndex) {
275
- element.classList.add('ncua-select-dropdown__option--focused');
276
- element.scrollIntoView({
277
- block: 'nearest'
278
- });
279
- } else {
280
- element.classList.remove('ncua-select-dropdown__option--focused');
281
- }
282
- });
283
- };
284
- /**
285
- * 옵션 클릭 이벤트 핸들러 등록
286
- */
287
- UnifiedBoxController.prototype.attachOptionEventHandlers = function () {
288
- var _this = this;
289
- // 기존 이벤트 리스너 제거
290
- this.removeOptionEventHandlers();
291
- this.optionElements.forEach(function (element, index) {
292
- var optionId = element.getAttribute('data-value');
293
- // data-value가 없거나 빈 문자열인 경우에도 처리
294
- if (optionId === null) return;
295
- // 클릭 이벤트 핸들러 생성 및 저장
296
- var clickHandler = function (event) {
297
- event.preventDefault();
298
- event.stopPropagation();
299
- _this.config.model.toggleOption(optionId);
300
- // 단일 선택 모드에서는 선택 후 드롭다운 닫기
301
- if (!_this.config.model.isMultiple()) {
302
- setTimeout(function () {
303
- return _this.close();
304
- }, 100);
305
- }
306
- };
307
- var hoverHandler = function () {
308
- if (!_this.isKeyboardNavigation) {
309
- _this.config.model.setFocusedIndex(index);
310
- }
311
- };
312
- // 이벤트 리스너 등록
313
- element.addEventListener('click', clickHandler);
314
- element.addEventListener('mouseenter', hoverHandler);
315
- // 나중에 제거할 수 있도록 핸들러 저장
316
- element._clickHandler = clickHandler;
317
- element._hoverHandler = hoverHandler;
318
- });
319
- // 마우스 이동 감지 (한 번만 등록)
320
- if (!this.mouseMoveHandlerAttached) {
321
- this.config.dropdownElement.addEventListener('mousemove', function () {
322
- _this.isKeyboardNavigation = false;
323
- });
324
- this.mouseMoveHandlerAttached = true;
325
- }
326
- };
327
- /**
328
- * 옵션 이벤트 핸들러 제거
329
- */
330
- UnifiedBoxController.prototype.removeOptionEventHandlers = function () {
331
- this.optionElements.forEach(function (element) {
332
- var clickHandler = element._clickHandler;
333
- var hoverHandler = element._hoverHandler;
334
- if (clickHandler) {
335
- element.removeEventListener('click', clickHandler);
336
- delete element._clickHandler;
337
- }
338
- if (hoverHandler) {
339
- element.removeEventListener('mouseenter', hoverHandler);
340
- delete element._hoverHandler;
341
- }
342
- });
343
- };
344
- /**
345
- * 옵션 업데이트가 필요한지 판단
346
- */
347
- UnifiedBoxController.prototype.shouldUpdateOptions = function (changedFields) {
348
- return changedFields.some(function (field) {
349
- return ['options', 'filteredOptions', 'selectedValues', 'showAllItems'].includes(field);
350
- });
351
- };
352
- /**
353
- * 외부 클릭 감지 활성화
354
- */
355
- UnifiedBoxController.prototype.enableOutsideClick = function () {
356
- document.addEventListener('mousedown', this.outsideClickHandler);
357
- };
358
- /**
359
- * 외부 클릭 감지 비활성화
360
- */
361
- UnifiedBoxController.prototype.disableOutsideClick = function () {
362
- document.removeEventListener('mousedown', this.outsideClickHandler);
363
- };
364
- /**
365
- * 스크롤 잠금 활성화 (드롭다운 내부 스크롤은 허용)
366
- * ComboBox 또는 multiple 모드에서는 스크롤 잠금 비활성화
367
- */
368
- UnifiedBoxController.prototype.enableScrollLock = function () {
369
- var _this = this;
370
- // ComboBox 또는 multiple 모드에서는 스크롤 잠금 비활성화
371
- if (this.config.type === 'combobox' || this.config.model.isMultiple()) {
372
- return;
373
- }
374
- this.scrollPosition = window.pageYOffset;
375
- this.scrollLockHandlers = {
376
- wheel: function (e) {
377
- // 드롭다운 내부에서 발생한 이벤트 처리
378
- if (_this.config.dropdownElement && _this.config.dropdownElement.contains(e.target)) {
379
- // 드롭다운 내부의 스크롤 가능한 요소 찾기
380
- var scrollableElement = _this.findScrollableParent(e.target, _this.config.dropdownElement);
381
- if (scrollableElement) {
382
- var deltaY = e.deltaY;
383
- var scrollTop = scrollableElement.scrollTop,
384
- scrollHeight = scrollableElement.scrollHeight,
385
- clientHeight = scrollableElement.clientHeight;
386
- // 스크롤이 위쪽 끝에 도달했고 위로 스크롤하려는 경우
387
- if (scrollTop === 0 && deltaY < 0) {
388
- e.preventDefault();
389
- return;
390
- }
391
- // 스크롤이 아래쪽 끝에 도달했고 아래로 스크롤하려는 경우
392
- if (scrollTop + clientHeight >= scrollHeight && deltaY > 0) {
393
- e.preventDefault();
394
- return;
395
- }
396
- // 드롭다운 내부 스크롤 허용
397
- return;
398
- }
399
- }
400
- // 드롭다운 외부의 모든 스크롤 방지
401
- e.preventDefault();
402
- },
403
- touchmove: function (e) {
404
- // 드롭다운 내부에서의 터치 스크롤 처리
405
- if (_this.config.dropdownElement && _this.config.dropdownElement.contains(e.target)) {
406
- var scrollableElement = _this.findScrollableParent(e.target, _this.config.dropdownElement);
407
- if (scrollableElement) {
408
- // 터치 스크롤은 브라우저가 자동으로 처리하도록 허용
409
- return;
410
- }
411
- }
412
- // 드롭다운 외부의 터치 스크롤 방지
413
- e.preventDefault();
414
- },
415
- keydown: function (e) {
416
- // 페이지 스크롤 키만 막기 (화살표 키는 드롭다운 네비게이션에서 처리)
417
- var keys = ['PageUp', 'PageDown', 'Home', 'End', 'Space'];
418
- if (keys.includes(e.key) || e.key === ' ') {
419
- e.preventDefault();
420
- }
421
- }
422
- };
423
- document.addEventListener('wheel', this.scrollLockHandlers.wheel, {
424
- passive: false
425
- });
426
- document.addEventListener('touchmove', this.scrollLockHandlers.touchmove, {
427
- passive: false
428
- });
429
- document.addEventListener('keydown', this.scrollLockHandlers.keydown);
430
- };
431
- /**
432
- * 스크롤 가능한 부모 요소 찾기
433
- */
434
- UnifiedBoxController.prototype.findScrollableParent = function (element, boundary) {
435
- var current = element;
436
- while (current && current !== boundary && boundary.contains(current)) {
437
- var computedStyle = window.getComputedStyle(current);
438
- var overflowY = computedStyle.overflowY;
439
- if (overflowY === 'auto' || overflowY === 'scroll') {
440
- var scrollHeight = current.scrollHeight,
441
- clientHeight = current.clientHeight;
442
- if (scrollHeight > clientHeight) {
443
- return current;
444
- }
445
- }
446
- current = current.parentElement;
447
- }
448
- return null;
449
- };
450
- /**
451
- * 스크롤 잠금 해제
452
- */
453
- UnifiedBoxController.prototype.disableScrollLock = function () {
454
- if (this.scrollLockHandlers) {
455
- document.removeEventListener('wheel', this.scrollLockHandlers.wheel);
456
- document.removeEventListener('touchmove', this.scrollLockHandlers.touchmove);
457
- document.removeEventListener('keydown', this.scrollLockHandlers.keydown);
458
- this.scrollLockHandlers = null;
459
- }
460
- };
461
- /**
462
- * 마우스 호버 처리 (외부에서 호출용)
463
- */
464
- UnifiedBoxController.prototype.handleMouseHover = function (index) {
465
- if (!this.isKeyboardNavigation) {
466
- this.config.model.setFocusedIndex(index);
467
- }
468
- };
469
- /**
470
- * 옵션 배열 업데이트
471
- */
472
- UnifiedBoxController.prototype.updateOptions = function (options) {
473
- var _this = this;
474
- this.config.model.updateOptions(options);
475
- // 스크롤 리스너는 이미 등록되어 있으므로 제거/재등록 불필요
476
- // DOM이 완전히 교체되는 경우에만 재등록 필요 (현재는 updateContainerChildren에서 요소 재사용)
477
- // 옵션 업데이트 후 스크롤 감지가 필요한 경우에만 확인
478
- if (this.isOpen && this.config.onScrollBottom && !this.scrollBottomHandler) {
479
- // 스크롤 리스너가 없을 때만 등록 (드롭다운이 열려있고 리스너가 없는 경우)
480
- requestAnimationFrame(function () {
481
- _this.enableScrollBottomDetection();
482
- });
483
- }
484
- };
485
- UnifiedBoxController.prototype.getIsOpen = function () {
486
- return this.config.model.getState().isOpen;
487
- };
488
- UnifiedBoxController.prototype.setFocus = function (index) {
489
- this.config.model.setFocusedIndex(index);
490
- };
491
- UnifiedBoxController.prototype.getFocusedIndex = function () {
492
- return this.config.model.getState().focusedIndex;
493
- };
494
- /**
495
- * DropdownUtils 호환을 위한 정적 팩토리 메서드
496
- */
497
- UnifiedBoxController.createFromDropdownConfig = function (config) {
498
- // DropdownModel 생성
499
- var model = new (require('./DropdownModel').DropdownModel)(config.options || [], false);
500
- // DOMRenderer 생성
501
- var renderer = new (require('./DOMRenderer').DOMRenderer)();
502
- // UnifiedBoxController 생성
503
- var controllerConfig = {
504
- triggerElement: config.triggerElement,
505
- dropdownElement: config.dropdownElement,
506
- model: model,
507
- renderer: renderer,
508
- renderConfig: {
509
- listboxId: 'dropdown-utils',
510
- multiple: false,
511
- maxHeight: 275,
512
- size: 'md'
513
- },
514
- onOpen: config.onOpen,
515
- onClose: config.onClose,
516
- onSelectionChange: function (values) {
517
- var _a, _b, _c;
518
- var index = (_b = (_a = config.options) === null || _a === void 0 ? void 0 : _a.findIndex(function (opt) {
519
- return opt.id === values[0];
520
- })) !== null && _b !== void 0 ? _b : -1;
521
- if (index >= 0) (_c = config.onOptionSelect) === null || _c === void 0 ? void 0 : _c.call(config, index);
522
- }
523
- };
524
- return new UnifiedBoxController(controllerConfig);
525
- };
526
- /**
527
- * 드롭다운 위치 조정 (화면 크기에 따라 up/down 방향 결정)
528
- * 단일 선택 모드에서만 적용
529
- */
530
- UnifiedBoxController.prototype.adjustDropdownPosition = function () {
531
- if (!this.config.dropdownElement || !this.config.triggerElement) return;
532
- // ComboBox 또는 multiple 모드에서는 위치 조정 비활성화
533
- if (this.config.type === 'combobox' || this.config.model.isMultiple()) {
534
- return;
535
- }
536
- // 일시적으로 드롭다운을 보이게 해서 크기 측정
537
- var dropdown = this.config.dropdownElement;
538
- var originalDisplay = dropdown.style.display;
539
- var originalVisibility = dropdown.style.visibility;
540
- dropdown.style.display = 'block';
541
- dropdown.style.visibility = 'hidden';
542
- var result = this.calculateDropdownPosition();
543
- // 방향에 따른 클래스 설정
544
- dropdown.classList.remove('ncua-select-dropdown--up', 'ncua-select-dropdown--down');
545
- dropdown.classList.add("ncua-select-dropdown--".concat(result.direction));
546
- // 미세 위치 조정
547
- this.adjustDropdownPositionDetails(dropdown);
548
- // 원래 상태로 복원
549
- dropdown.style.display = originalDisplay;
550
- dropdown.style.visibility = originalVisibility;
551
- };
552
- /**
553
- * 드롭다운 위치 계산 (React dropdownUtils.ts 로직 참고)
554
- */
555
- UnifiedBoxController.prototype.calculateDropdownPosition = function () {
556
- if (!this.config.triggerElement || !this.config.dropdownElement) {
557
- return {
558
- direction: 'down',
559
- maxHeight: this.config.renderConfig.maxHeight
560
- };
561
- }
562
- var triggerRect = this.config.triggerElement.getBoundingClientRect();
563
- var viewportHeight = window.innerHeight;
564
- var dropdownHeight = Math.min(this.config.renderConfig.maxHeight, this.estimateDropdownHeight());
565
- var offset = 20; // 여유 공간
566
- // 아래쪽 공간이 충분한지 확인
567
- var spaceBelow = viewportHeight - triggerRect.bottom;
568
- if (spaceBelow < dropdownHeight + offset) {
569
- return {
570
- direction: 'up',
571
- maxHeight: this.config.renderConfig.maxHeight
572
- };
573
- } else {
574
- return {
575
- direction: 'down',
576
- maxHeight: this.config.renderConfig.maxHeight
577
- };
578
- }
579
- };
580
- /**
581
- * 드롭다운 예상 높이 계산
582
- */
583
- UnifiedBoxController.prototype.estimateDropdownHeight = function () {
584
- var itemHeight = 40; // 대략적인 옵션 항목 높이
585
- var itemCount = this.config.model.getState().filteredOptions.length || this.config.model.getState().options.length;
586
- return Math.min(itemCount * itemHeight, this.config.renderConfig.maxHeight);
587
- };
588
- /**
589
- * 드롭다운 세부 위치 조정 (뷰포트 경계 처리)
590
- */
591
- UnifiedBoxController.prototype.adjustDropdownPositionDetails = function (dropdownElement) {
592
- var dropdownRect = dropdownElement.getBoundingClientRect();
593
- var viewportWidth = window.innerWidth;
594
- var viewportHeight = window.innerHeight;
595
- // 좌우 위치 조정
596
- if (dropdownRect.right > viewportWidth) {
597
- var overflow = dropdownRect.right - viewportWidth;
598
- var currentLeft = parseInt(dropdownElement.style.left || '0');
599
- dropdownElement.style.left = "".concat(currentLeft - overflow - 10, "px");
600
- }
601
- if (dropdownRect.left < 0) {
602
- dropdownElement.style.left = '10px';
603
- }
604
- // 상하 위치 조정 (이미 up/down 방향이 결정된 후 미세 조정)
605
- if (dropdownRect.bottom > viewportHeight) {
606
- var overflow = dropdownRect.bottom - viewportHeight;
607
- var currentMaxHeight = parseInt(dropdownElement.style.maxHeight || String(this.config.renderConfig.maxHeight));
608
- dropdownElement.style.maxHeight = "".concat(currentMaxHeight - overflow - 10, "px");
609
- }
610
- };
611
- /**
612
- * 스크롤 바닥 감지 활성화
613
- */
614
- UnifiedBoxController.prototype.enableScrollBottomDetection = function () {
615
- var _this = this;
616
- if (!this.config.onScrollBottom) return;
617
- // 이미 리스너가 등록되어 있으면 중복 등록 방지
618
- if (this.scrollBottomHandler) return;
619
- var optionsList = this.config.dropdownElement.querySelector('.ncua-select-dropdown__options');
620
- if (!optionsList) return;
621
- this.scrollBottomHandler = function (e) {
622
- var _a, _b;
623
- var target = e.target;
624
- var scrollTop = target.scrollTop;
625
- var scrollHeight = target.scrollHeight;
626
- var clientHeight = target.clientHeight;
627
- // 바닥에서 10px 이내에 도달했을 때
628
- var threshold = 10;
629
- var isAtBottom = scrollTop + clientHeight >= scrollHeight - threshold;
630
- if (isAtBottom) {
631
- var now = Date.now();
632
- // 500ms 디바운스 (중복 호출 방지)
633
- if (now - _this.lastScrollBottomTime > 100) {
634
- _this.lastScrollBottomTime = now;
635
- (_b = (_a = _this.config).onScrollBottom) === null || _b === void 0 ? void 0 : _b.call(_a);
636
- }
637
- }
638
- };
639
- optionsList.addEventListener('scroll', this.scrollBottomHandler);
640
- };
641
- /**
642
- * 스크롤 바닥 감지 비활성화
643
- */
644
- UnifiedBoxController.prototype.disableScrollBottomDetection = function () {
645
- if (this.scrollBottomHandler) {
646
- var optionsList = this.config.dropdownElement.querySelector('.ncua-select-dropdown__options');
647
- if (optionsList) {
648
- optionsList.removeEventListener('scroll', this.scrollBottomHandler);
649
- }
650
- this.scrollBottomHandler = undefined;
651
- }
652
- };
653
- /**
654
- * disabled 상태 설정
655
- */
656
- UnifiedBoxController.prototype.setDisabled = function (disabled) {
657
- this.config.disabled = disabled;
658
- // disabled로 설정될 때 드롭다운이 열려있으면 닫기
659
- if (disabled && this.isOpen) {
660
- this.close();
661
- }
662
- };
663
- /**
664
- * 정리
665
- */
666
- UnifiedBoxController.prototype.destroy = function () {
667
- this.config.model.removeListener(this);
668
- this.disableOutsideClick();
669
- this.disableScrollLock();
670
- this.removeOptionEventHandlers();
671
- this.disableScrollBottomDetection(); // 스크롤 감지 정리
672
- this.config.triggerElement.removeEventListener('keydown', this.keyDownHandler);
673
- };
674
- return UnifiedBoxController;
675
- }();
676
- export { UnifiedBoxController };