@ncds/ui-admin 1.6.3 → 1.6.4-alpha.0

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