misp-ui-library-test 0.0.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 (373) hide show
  1. package/README.md +113 -0
  2. package/dist/theme-chalk/alert/index.scss +152 -0
  3. package/dist/theme-chalk/avatar/index.scss +51 -0
  4. package/dist/theme-chalk/backtop/index.scss +38 -0
  5. package/dist/theme-chalk/badge/index.scss +63 -0
  6. package/dist/theme-chalk/breadcrumb/index.scss +36 -0
  7. package/dist/theme-chalk/breadcrumb-item/index.scss +36 -0
  8. package/dist/theme-chalk/button/index.scss +157 -0
  9. package/dist/theme-chalk/card/index.scss +38 -0
  10. package/dist/theme-chalk/chart/index.scss +21 -0
  11. package/dist/theme-chalk/checkbox/index.scss +358 -0
  12. package/dist/theme-chalk/col/index.scss +131 -0
  13. package/dist/theme-chalk/container/index.scss +40 -0
  14. package/dist/theme-chalk/css/alert.css +484 -0
  15. package/dist/theme-chalk/css/avatar.css +409 -0
  16. package/dist/theme-chalk/css/backtop.css +401 -0
  17. package/dist/theme-chalk/css/badge.css +419 -0
  18. package/dist/theme-chalk/css/breadcrumb-item.css +395 -0
  19. package/dist/theme-chalk/css/breadcrumb.css +395 -0
  20. package/dist/theme-chalk/css/button.css +587 -0
  21. package/dist/theme-chalk/css/card.css +397 -0
  22. package/dist/theme-chalk/css/chart.css +386 -0
  23. package/dist/theme-chalk/css/checkbox.css +648 -0
  24. package/dist/theme-chalk/css/col.css +2111 -0
  25. package/dist/theme-chalk/css/container.css +404 -0
  26. package/dist/theme-chalk/css/dialog.css +505 -0
  27. package/dist/theme-chalk/css/divider.css +405 -0
  28. package/dist/theme-chalk/css/drawer.css +546 -0
  29. package/dist/theme-chalk/css/empty.css +394 -0
  30. package/dist/theme-chalk/css/form.css +561 -0
  31. package/dist/theme-chalk/css/icon.css +1534 -0
  32. package/dist/theme-chalk/css/image.css +400 -0
  33. package/dist/theme-chalk/css/input-number.css +424 -0
  34. package/dist/theme-chalk/css/input.css +721 -0
  35. package/dist/theme-chalk/css/link.css +424 -0
  36. package/dist/theme-chalk/css/loading.css +483 -0
  37. package/dist/theme-chalk/css/message-box.css +479 -0
  38. package/dist/theme-chalk/css/message.css +456 -0
  39. package/dist/theme-chalk/css/no-data.css +397 -0
  40. package/dist/theme-chalk/css/notification.css +431 -0
  41. package/dist/theme-chalk/css/page-header.css +396 -0
  42. package/dist/theme-chalk/css/pagination.css +565 -0
  43. package/dist/theme-chalk/css/popover.css +421 -0
  44. package/dist/theme-chalk/css/popper.css +454 -0
  45. package/dist/theme-chalk/css/progress.css +451 -0
  46. package/dist/theme-chalk/css/radio.css +626 -0
  47. package/dist/theme-chalk/css/rate.css +414 -0
  48. package/dist/theme-chalk/css/result.css +403 -0
  49. package/dist/theme-chalk/css/row.css +433 -0
  50. package/dist/theme-chalk/css/scrollbar.css +422 -0
  51. package/dist/theme-chalk/css/select.css +1897 -0
  52. package/dist/theme-chalk/css/skeleton-item.css +407 -0
  53. package/dist/theme-chalk/css/skeleton.css +390 -0
  54. package/dist/theme-chalk/css/slider.css +460 -0
  55. package/dist/theme-chalk/css/spinner.css +403 -0
  56. package/dist/theme-chalk/css/statistic.css +396 -0
  57. package/dist/theme-chalk/css/status-timeline-chart.css +388 -0
  58. package/dist/theme-chalk/css/step.css +496 -0
  59. package/dist/theme-chalk/css/steps.css +496 -0
  60. package/dist/theme-chalk/css/switch.css +507 -0
  61. package/dist/theme-chalk/css/tab-pane.css +457 -0
  62. package/dist/theme-chalk/css/table.css +461 -0
  63. package/dist/theme-chalk/css/tabs-navigation.css +925 -0
  64. package/dist/theme-chalk/css/tabs.css +457 -0
  65. package/dist/theme-chalk/css/tag.css +599 -0
  66. package/dist/theme-chalk/css/time-picker.css +683 -0
  67. package/dist/theme-chalk/css/timeline-item.css +459 -0
  68. package/dist/theme-chalk/css/timeline.css +459 -0
  69. package/dist/theme-chalk/css/tooltip.css +485 -0
  70. package/dist/theme-chalk/css/tree.css +473 -0
  71. package/dist/theme-chalk/css/upload.css +665 -0
  72. package/dist/theme-chalk/dialog/index.scss +168 -0
  73. package/dist/theme-chalk/divider/index.scss +46 -0
  74. package/dist/theme-chalk/drawer/index.scss +172 -0
  75. package/dist/theme-chalk/empty/index.scss +36 -0
  76. package/dist/theme-chalk/fonts/element-icons.ttf +0 -0
  77. package/dist/theme-chalk/fonts/element-icons.woff +0 -0
  78. package/dist/theme-chalk/form/index.scss +220 -0
  79. package/dist/theme-chalk/icon/index.scss +1171 -0
  80. package/dist/theme-chalk/image/index.scss +39 -0
  81. package/dist/theme-chalk/index.scss +127 -0
  82. package/dist/theme-chalk/input/index.scss +363 -0
  83. package/dist/theme-chalk/input-number/index.scss +71 -0
  84. package/dist/theme-chalk/link/index.scss +75 -0
  85. package/dist/theme-chalk/loading/index.scss +131 -0
  86. package/dist/theme-chalk/message/index.scss +100 -0
  87. package/dist/theme-chalk/message-box/index.scss +131 -0
  88. package/dist/theme-chalk/mixins.scss +203 -0
  89. package/dist/theme-chalk/no-data/index.scss +36 -0
  90. package/dist/theme-chalk/notification/index.scss +76 -0
  91. package/dist/theme-chalk/page-header/index.scss +36 -0
  92. package/dist/theme-chalk/pagination/index.scss +225 -0
  93. package/dist/theme-chalk/popover/index.scss +56 -0
  94. package/dist/theme-chalk/popper/index.scss +89 -0
  95. package/dist/theme-chalk/progress/index.scss +105 -0
  96. package/dist/theme-chalk/radio/index.scss +328 -0
  97. package/dist/theme-chalk/rate/index.scss +56 -0
  98. package/dist/theme-chalk/reset.scss +262 -0
  99. package/dist/theme-chalk/result/index.scss +46 -0
  100. package/dist/theme-chalk/row/index.scss +88 -0
  101. package/dist/theme-chalk/scrollbar/index.scss +67 -0
  102. package/dist/theme-chalk/select/index.scss +223 -0
  103. package/dist/theme-chalk/skeleton/index.scss +30 -0
  104. package/dist/theme-chalk/skeleton-item/index.scss +49 -0
  105. package/dist/theme-chalk/slider/index.scss +113 -0
  106. package/dist/theme-chalk/spinner/index.scss +40 -0
  107. package/dist/theme-chalk/statistic/index.scss +38 -0
  108. package/dist/theme-chalk/status-timeline-chart/index.scss +23 -0
  109. package/dist/theme-chalk/step/index.scss +160 -0
  110. package/dist/theme-chalk/steps/index.scss +160 -0
  111. package/dist/theme-chalk/switch/index.scss +153 -0
  112. package/dist/theme-chalk/tab-pane/index.scss +112 -0
  113. package/dist/theme-chalk/table/index.scss +110 -0
  114. package/dist/theme-chalk/tabs/index.scss +112 -0
  115. package/dist/theme-chalk/tabs-navigation/index.scss +631 -0
  116. package/dist/theme-chalk/tag/index.scss +138 -0
  117. package/dist/theme-chalk/themes/blue.scss +76 -0
  118. package/dist/theme-chalk/themes/dark.scss +99 -0
  119. package/dist/theme-chalk/themes/index.scss +260 -0
  120. package/dist/theme-chalk/themes/light.scss +99 -0
  121. package/dist/theme-chalk/time-picker/index.scss +332 -0
  122. package/dist/theme-chalk/timeline/index.scss +119 -0
  123. package/dist/theme-chalk/timeline-item/index.scss +119 -0
  124. package/dist/theme-chalk/tooltip/index.scss +122 -0
  125. package/dist/theme-chalk/tree/index.scss +125 -0
  126. package/dist/theme-chalk/upload/index.scss +348 -0
  127. package/dist/theme-chalk/variables.scss +93 -0
  128. package/dist/vue2-ui-library.cjs.temp.js.map +1 -0
  129. package/dist/vue2-ui-library.common.js +28 -0
  130. package/dist/vue2-ui-library.common.js.map +1 -0
  131. package/dist/vue2-ui-library.esm.js +29 -0
  132. package/dist/vue2-ui-library.umd.js +27 -0
  133. package/package.json +161 -0
  134. package/src/directives/clickoutside/index.js +111 -0
  135. package/src/directives/init/index.js +50 -0
  136. package/src/directives/resize/index.js +69 -0
  137. package/src/index.js +174 -0
  138. package/src/mixins/emitter.js +47 -0
  139. package/src/mixins/focus.js +42 -0
  140. package/src/mixins/locale.js +24 -0
  141. package/src/mixins/migrating.js +46 -0
  142. package/src/packages/alert/index.js +12 -0
  143. package/src/packages/alert/src/main.vue +98 -0
  144. package/src/packages/aside/index.js +12 -0
  145. package/src/packages/aside/src/main.vue +20 -0
  146. package/src/packages/auto-grid-layout/index.js +18 -0
  147. package/src/packages/auto-grid-layout/prop.js +92 -0
  148. package/src/packages/auto-grid-layout/src/components/GridItem.vue +759 -0
  149. package/src/packages/auto-grid-layout/src/components/GridLayout.vue +367 -0
  150. package/src/packages/auto-grid-layout/src/main.vue +287 -0
  151. package/src/packages/auto-grid-layout/src/utils/DOM.js +46 -0
  152. package/src/packages/auto-grid-layout/src/utils/interact.js +333 -0
  153. package/src/packages/auto-grid-layout/src/utils/responsiveUtils.js +75 -0
  154. package/src/packages/auto-grid-layout/src/utils/utils.js +339 -0
  155. package/src/packages/autocomplete/index.js +12 -0
  156. package/src/packages/autocomplete/src/main.vue +170 -0
  157. package/src/packages/avatar/index.js +12 -0
  158. package/src/packages/avatar/src/main.vue +87 -0
  159. package/src/packages/backtop/index.js +12 -0
  160. package/src/packages/backtop/src/main.vue +120 -0
  161. package/src/packages/badge/index.js +12 -0
  162. package/src/packages/badge/src/main.vue +53 -0
  163. package/src/packages/breadcrumb/index.js +12 -0
  164. package/src/packages/breadcrumb/src/main.vue +34 -0
  165. package/src/packages/breadcrumb-item/index.js +12 -0
  166. package/src/packages/breadcrumb-item/src/main.vue +41 -0
  167. package/src/packages/button/index.js +13 -0
  168. package/src/packages/button/src/main.vue +106 -0
  169. package/src/packages/calendar/index.js +12 -0
  170. package/src/packages/calendar/src/main.vue +173 -0
  171. package/src/packages/card/index.js +12 -0
  172. package/src/packages/card/src/main.vue +26 -0
  173. package/src/packages/carousel/index.js +12 -0
  174. package/src/packages/carousel/src/main.vue +186 -0
  175. package/src/packages/carousel-item/index.js +12 -0
  176. package/src/packages/carousel-item/src/main.vue +34 -0
  177. package/src/packages/cascader/index.js +12 -0
  178. package/src/packages/cascader/src/main.vue +232 -0
  179. package/src/packages/chart/index.js +7 -0
  180. package/src/packages/chart/src/axis-chart.js +700 -0
  181. package/src/packages/chart/src/main.vue +828 -0
  182. package/src/packages/chart/src/utils.js +21 -0
  183. package/src/packages/checkbox/index.js +44 -0
  184. package/src/packages/checkbox/src/main.vue +312 -0
  185. package/src/packages/col/index.js +12 -0
  186. package/src/packages/col/src/main.vue +85 -0
  187. package/src/packages/collapse/index.js +12 -0
  188. package/src/packages/collapse/src/main.vue +69 -0
  189. package/src/packages/collapse-item/index.js +12 -0
  190. package/src/packages/collapse-item/src/main.vue +75 -0
  191. package/src/packages/color-picker/index.js +12 -0
  192. package/src/packages/color-picker/src/main.vue +206 -0
  193. package/src/packages/container/index.js +12 -0
  194. package/src/packages/container/src/main.vue +33 -0
  195. package/src/packages/date-picker/index.js +12 -0
  196. package/src/packages/date-picker/src/main.vue +246 -0
  197. package/src/packages/descriptions/index.js +12 -0
  198. package/src/packages/descriptions/src/main.vue +89 -0
  199. package/src/packages/descriptions-item/index.js +12 -0
  200. package/src/packages/descriptions-item/src/main.vue +26 -0
  201. package/src/packages/dialog/index.js +12 -0
  202. package/src/packages/dialog/src/main.vue +336 -0
  203. package/src/packages/divider/index.js +12 -0
  204. package/src/packages/divider/src/main.vue +37 -0
  205. package/src/packages/drawer/index.js +7 -0
  206. package/src/packages/drawer/src/main.vue +310 -0
  207. package/src/packages/dropdown/index.js +12 -0
  208. package/src/packages/dropdown/src/main.vue +82 -0
  209. package/src/packages/dropdown-menu-item/index.js +12 -0
  210. package/src/packages/dropdown-menu-item/src/main.vue +29 -0
  211. package/src/packages/empty/index.js +12 -0
  212. package/src/packages/empty/src/img-empty.vue +12 -0
  213. package/src/packages/empty/src/main.vue +49 -0
  214. package/src/packages/footer/index.js +12 -0
  215. package/src/packages/footer/src/main.vue +20 -0
  216. package/src/packages/form/index.js +13 -0
  217. package/src/packages/form/src/form-field.vue +790 -0
  218. package/src/packages/form/src/form-item.vue +464 -0
  219. package/src/packages/form/src/label-wrap.vue +127 -0
  220. package/src/packages/form/src/main.vue +442 -0
  221. package/src/packages/form-item/index.js +11 -0
  222. package/src/packages/header/index.js +12 -0
  223. package/src/packages/header/src/main.vue +20 -0
  224. package/src/packages/icon/index.js +12 -0
  225. package/src/packages/icon/src/main.vue +48 -0
  226. package/src/packages/image/index.js +12 -0
  227. package/src/packages/image/src/main.vue +224 -0
  228. package/src/packages/input/index.js +13 -0
  229. package/src/packages/input/src/calcTextareaHeight.js +123 -0
  230. package/src/packages/input/src/main.vue +510 -0
  231. package/src/packages/input-number/index.js +12 -0
  232. package/src/packages/input-number/src/main.vue +121 -0
  233. package/src/packages/link/index.js +12 -0
  234. package/src/packages/link/src/main.vue +53 -0
  235. package/src/packages/loading/index.js +17 -0
  236. package/src/packages/loading/src/directive.js +54 -0
  237. package/src/packages/loading/src/main.vue +38 -0
  238. package/src/packages/loading/src/service.js +63 -0
  239. package/src/packages/main/index.js +12 -0
  240. package/src/packages/main/src/main.vue +12 -0
  241. package/src/packages/menu/index.js +12 -0
  242. package/src/packages/menu/src/main.vue +117 -0
  243. package/src/packages/menu-item/index.js +12 -0
  244. package/src/packages/menu-item/src/main.vue +61 -0
  245. package/src/packages/message/index.js +95 -0
  246. package/src/packages/message/src/main.vue +131 -0
  247. package/src/packages/message-box/index.js +75 -0
  248. package/src/packages/message-box/src/main.vue +207 -0
  249. package/src/packages/no-data/index.js +8 -0
  250. package/src/packages/no-data/src/main.vue +23 -0
  251. package/src/packages/notification/index.js +72 -0
  252. package/src/packages/notification/src/main.vue +139 -0
  253. package/src/packages/option/index.js +13 -0
  254. package/src/packages/page-header/index.js +12 -0
  255. package/src/packages/page-header/src/main.vue +27 -0
  256. package/src/packages/pagination/index.js +12 -0
  257. package/src/packages/pagination/src/main.vue +255 -0
  258. package/src/packages/popconfirm/index.js +12 -0
  259. package/src/packages/popconfirm/src/main.vue +89 -0
  260. package/src/packages/popover/index.js +12 -0
  261. package/src/packages/popover/src/main.vue +452 -0
  262. package/src/packages/progress/index.js +12 -0
  263. package/src/packages/progress/src/main.vue +236 -0
  264. package/src/packages/radio/index.js +44 -0
  265. package/src/packages/radio/src/main.vue +291 -0
  266. package/src/packages/rate/index.js +12 -0
  267. package/src/packages/rate/src/main.vue +129 -0
  268. package/src/packages/result/index.js +12 -0
  269. package/src/packages/result/src/main.vue +52 -0
  270. package/src/packages/row/index.js +12 -0
  271. package/src/packages/row/src/main.vue +57 -0
  272. package/src/packages/scrollbar/index.js +12 -0
  273. package/src/packages/scrollbar/src/bar.vue +116 -0
  274. package/src/packages/scrollbar/src/main.vue +124 -0
  275. package/src/packages/select/index.js +15 -0
  276. package/src/packages/select/src/clickoutside.js +20 -0
  277. package/src/packages/select/src/main.vue +1055 -0
  278. package/src/packages/select/src/navigation-mixin.js +49 -0
  279. package/src/packages/select/src/option.vue +249 -0
  280. package/src/packages/select/src/select-dropdown.vue +95 -0
  281. package/src/packages/select/src/utils.js +5 -0
  282. package/src/packages/skeleton/index.js +12 -0
  283. package/src/packages/skeleton/src/main.vue +76 -0
  284. package/src/packages/skeleton-item/index.js +12 -0
  285. package/src/packages/skeleton-item/src/img-placeholder.vue +13 -0
  286. package/src/packages/skeleton-item/src/main.vue +22 -0
  287. package/src/packages/slider/index.js +12 -0
  288. package/src/packages/slider/src/main.vue +176 -0
  289. package/src/packages/spinner/index.js +12 -0
  290. package/src/packages/spinner/src/main.vue +27 -0
  291. package/src/packages/statistic/index.js +12 -0
  292. package/src/packages/statistic/src/main.vue +100 -0
  293. package/src/packages/status-timeline-chart/index.js +7 -0
  294. package/src/packages/status-timeline-chart/src/constants.js +20 -0
  295. package/src/packages/status-timeline-chart/src/main.vue +499 -0
  296. package/src/packages/status-timeline-chart/src/option-builder.js +475 -0
  297. package/src/packages/step/index.js +12 -0
  298. package/src/packages/step/src/main.vue +183 -0
  299. package/src/packages/steps/index.js +12 -0
  300. package/src/packages/steps/src/main.vue +57 -0
  301. package/src/packages/submenu/index.js +12 -0
  302. package/src/packages/submenu/src/main.vue +68 -0
  303. package/src/packages/switch/index.js +12 -0
  304. package/src/packages/switch/src/main.vue +166 -0
  305. package/src/packages/tab-pane/index.js +12 -0
  306. package/src/packages/tab-pane/src/main.vue +74 -0
  307. package/src/packages/table/index.js +8 -0
  308. package/src/packages/table/src/components/PagePagination.vue +82 -0
  309. package/src/packages/table/src/main.vue +153 -0
  310. package/src/packages/tabs/index.js +12 -0
  311. package/src/packages/tabs/src/main.vue +167 -0
  312. package/src/packages/tabs-navigation/index.js +7 -0
  313. package/src/packages/tabs-navigation/src/main.vue +462 -0
  314. package/src/packages/tag/index.js +12 -0
  315. package/src/packages/tag/src/main.vue +194 -0
  316. package/src/packages/time-picker/index.js +17 -0
  317. package/src/packages/time-picker/src/date-utils.js +455 -0
  318. package/src/packages/time-picker/src/main.vue +321 -0
  319. package/src/packages/time-picker/src/pane/date-range.vue +193 -0
  320. package/src/packages/time-picker/src/pane/date-time-range.vue +362 -0
  321. package/src/packages/time-picker/src/pane/date-time.vue +362 -0
  322. package/src/packages/time-picker/src/pane/date.vue +441 -0
  323. package/src/packages/time-picker/src/pane/time.vue +260 -0
  324. package/src/packages/time-picker/src/time-input.vue +203 -0
  325. package/src/packages/time-picker/src/time-range-input.vue +170 -0
  326. package/src/packages/timeline/index.js +12 -0
  327. package/src/packages/timeline/src/main.vue +24 -0
  328. package/src/packages/timeline-item/index.js +12 -0
  329. package/src/packages/timeline-item/src/main.vue +78 -0
  330. package/src/packages/tooltip/index.js +12 -0
  331. package/src/packages/tooltip/src/main.js +367 -0
  332. package/src/packages/transfer/index.js +8 -0
  333. package/src/packages/transfer/src/main.vue +229 -0
  334. package/src/packages/transfer/src/transfer-panel.vue +245 -0
  335. package/src/packages/transitions/collapse-transition.js +75 -0
  336. package/src/packages/tree/index.js +12 -0
  337. package/src/packages/tree/src/main.vue +322 -0
  338. package/src/packages/tree/src/model/node.js +348 -0
  339. package/src/packages/tree/src/model/tree-store.js +354 -0
  340. package/src/packages/tree/src/model/util.js +10 -0
  341. package/src/packages/tree/src/tree-node.vue +262 -0
  342. package/src/packages/upload/index.js +9 -0
  343. package/src/packages/upload/src/main.vue +415 -0
  344. package/src/playground/mixins/element.js +98 -0
  345. package/src/playground/types/element.js +197 -0
  346. package/src/playground/types/layout.js +80 -0
  347. package/src/plugins/i18n.js +125 -0
  348. package/src/styles/fonts/element-icons.ttf +0 -0
  349. package/src/styles/fonts/element-icons.woff +0 -0
  350. package/src/styles/index.scss +138 -0
  351. package/src/styles/reset.scss +257 -0
  352. package/src/styles/themes/blue.scss +75 -0
  353. package/src/styles/themes/dark.scss +98 -0
  354. package/src/styles/themes/index.scss +34 -0
  355. package/src/styles/themes/light.scss +98 -0
  356. package/src/styles/themes/variables.scss +233 -0
  357. package/src/styles/variables.scss +146 -0
  358. package/src/utils/async-validator/index.js +659 -0
  359. package/src/utils/browser/index.js +39 -0
  360. package/src/utils/color.js +76 -0
  361. package/src/utils/dom/index.js +421 -0
  362. package/src/utils/dom/scrollbar-width.js +49 -0
  363. package/src/utils/draggable/core.js +379 -0
  364. package/src/utils/draggable/draggable.js +478 -0
  365. package/src/utils/draggable/index.js +61 -0
  366. package/src/utils/draggable/sortable.js +751 -0
  367. package/src/utils/lodash/index.js +2395 -0
  368. package/src/utils/moment/index.js +909 -0
  369. package/src/utils/playground/index.js +37 -0
  370. package/src/utils/popper/index.js +308 -0
  371. package/src/utils/popper/popper.js +1132 -0
  372. package/src/utils/popper/popup-manager.js +288 -0
  373. package/src/utils/popper/popup.js +344 -0
@@ -0,0 +1,1132 @@
1
+ /**
2
+ * @fileoverview Popper.js - 弹出层定位库
3
+ * @description 用于创建和定位弹出层靠近其参考元素的强大库,支持多种位置、边界检测、自动翻转等功能
4
+ * @version 1.16.1
5
+ * @license MIT
6
+ * @copyright Copyright (c) 2016 Federico Zivolo and contributors
7
+ * @module utils/popper/popper
8
+ */
9
+
10
+ ;(function (root, factory) {
11
+ if (typeof define === 'function' && define.amd) {
12
+ define(factory)
13
+ } else if (typeof module === 'object' && module.exports) {
14
+ module.exports = factory()
15
+ } else {
16
+ root.Popper = factory()
17
+ }
18
+ })(this, function () {
19
+ 'use strict'
20
+
21
+ var root = window
22
+
23
+ /**
24
+ * 默认配置选项
25
+ * @type {Object}
26
+ * @memberof Popper
27
+ * @static
28
+ */
29
+ var DEFAULTS = {
30
+ placement: 'bottom',
31
+ gpuAcceleration: true,
32
+ offset: 0,
33
+ boundariesElement: 'viewport',
34
+ boundariesPadding: 5,
35
+ preventOverflowOrder: ['left', 'right', 'top', 'bottom'],
36
+ flipBehavior: 'flip',
37
+ arrowElement: '[x-arrow]',
38
+ arrowOffset: 0,
39
+ modifiers: ['shift', 'offset', 'preventOverflow', 'keepTogether', 'arrow', 'flip', 'applyStyle'],
40
+ modifiersIgnored: [],
41
+ forceAbsolute: false,
42
+ }
43
+
44
+ /**
45
+ * 创建新的 Popper.js 实例
46
+ * @class Popper
47
+ * @classdesc 用于管理弹出层定位的核心类
48
+ * @param {HTMLElement} reference - 用于定位弹出层的参考元素
49
+ * @param {HTMLElement|Object} popper - 用作弹出层的 HTML 元素,或用于生成弹出层的配置对象
50
+ * @param {Object} [options] - 配置选项
51
+ * @param {String} [options.placement='bottom'] - 弹出层位置
52
+ * @param {HTMLElement|String} [options.arrowElement='[x-arrow]'] - 用作箭头的 DOM 节点或 CSS 选择器
53
+ * @param {Boolean} [options.gpuAcceleration=true] - 是否使用 GPU 加速渲染
54
+ * @param {Number} [options.offset=0] - 弹出层偏移像素
55
+ * @param {String|Element} [options.boundariesElement='viewport'] - 定义弹出层边界的元素
56
+ * @param {Number} [options.boundariesPadding=5] - 边界内边距
57
+ * @param {Array} [options.preventOverflowOrder] - 防止溢出的检查顺序
58
+ * @param {String|Array} [options.flipBehavior='flip'] - 翻转行为配置
59
+ * @param {Array} [options.modifiers] - 修饰器函数列表
60
+ * @param {Array} [options.modifiersIgnored=[]] - 要忽略的修饰器
61
+ * @param {Boolean} [options.removeOnDestroy=false] - 销毁时是否自动移除弹出层
62
+ */
63
+ function Popper(reference, popper, options) {
64
+ this._reference = reference.jquery ? reference[0] : reference
65
+ this.state = {}
66
+
67
+ var isNotDefined = typeof popper === 'undefined' || popper === null
68
+ var isConfig = popper && Object.prototype.toString.call(popper) === '[object Object]'
69
+ if (isNotDefined || isConfig) {
70
+ this._popper = this.parse(isConfig ? popper : {})
71
+ } else {
72
+ this._popper = popper.jquery ? popper[0] : popper
73
+ }
74
+
75
+ this._options = Object.assign({}, DEFAULTS, options)
76
+
77
+ this._options.modifiers = this._options.modifiers.map(
78
+ function (modifier) {
79
+ if (this._options.modifiersIgnored.indexOf(modifier) !== -1) return
80
+
81
+ if (modifier === 'applyStyle') {
82
+ this._popper.setAttribute('x-placement', this._options.placement)
83
+ }
84
+
85
+ return this.modifiers[modifier] || modifier
86
+ }.bind(this)
87
+ )
88
+
89
+ this.state.position = this._getPosition(this._popper, this._reference)
90
+ setStyle(this._popper, { position: this.state.position, top: 0 })
91
+
92
+ this.update()
93
+
94
+ this._setupEventListeners()
95
+ return this
96
+ }
97
+
98
+ /**
99
+ * 销毁 Popper 实例
100
+ * @method
101
+ * @memberof Popper
102
+ * @instance
103
+ * @description 清理样式、移除事件监听器,可选移除 DOM 元素
104
+ * @returns {Popper} Popper 实例,支持链式调用
105
+ */
106
+ Popper.prototype.destroy = function () {
107
+ this._popper.removeAttribute('x-placement')
108
+ this._popper.style.left = ''
109
+ this._popper.style.position = ''
110
+ this._popper.style.top = ''
111
+ this._popper.style[getSupportedPropertyName('transform')] = ''
112
+ this._removeEventListeners()
113
+
114
+ if (this._options.removeOnDestroy) {
115
+ this._popper.remove()
116
+ }
117
+ return this
118
+ }
119
+
120
+ /**
121
+ * 更新弹出层位置
122
+ * @method
123
+ * @memberof Popper
124
+ * @instance
125
+ * @description 重新计算偏移量并应用新样式
126
+ * @fires Popper#onUpdate
127
+ * @returns {void}
128
+ */
129
+ Popper.prototype.update = function () {
130
+ var data = { instance: this, styles: {} }
131
+
132
+ data.placement = this._options.placement
133
+ data._originalPlacement = this._options.placement
134
+
135
+ data.offsets = this._getOffsets(this._popper, this._reference, data.placement)
136
+
137
+ data.boundaries = this._getBoundaries(data, this._options.boundariesPadding, this._options.boundariesElement)
138
+
139
+ data = this.runModifiers(data, this._options.modifiers)
140
+
141
+ if (typeof this.state.updateCallback === 'function') {
142
+ this.state.updateCallback(data)
143
+ }
144
+ }
145
+
146
+ /**
147
+ * 注册创建完成回调
148
+ * @method
149
+ * @memberof Popper
150
+ * @instance
151
+ * @description Popper 初始化完成后执行回调函数
152
+ * @param {Function} callback - 回调函数,接收 Popper 实例作为第一个参数
153
+ * @returns {Popper} Popper 实例,支持链式调用
154
+ */
155
+ Popper.prototype.onCreate = function (callback) {
156
+ callback(this)
157
+ return this
158
+ }
159
+
160
+ /**
161
+ * 注册更新回调
162
+ * @method
163
+ * @memberof Popper
164
+ * @instance
165
+ * @description 每次 Popper 更新后执行回调函数(首次 update 调用不触发)
166
+ * @param {Function} callback - 回调函数,接收坐标和样式信息作为参数
167
+ * @returns {Popper} Popper 实例,支持链式调用
168
+ */
169
+ Popper.prototype.onUpdate = function (callback) {
170
+ this.state.updateCallback = callback
171
+ return this
172
+ }
173
+
174
+ /**
175
+ * 从配置对象生成弹出层元素
176
+ * @method
177
+ * @memberof Popper
178
+ * @instance
179
+ * @param {Object} config - 配置对象
180
+ * @param {String} [config.tagName='div'] - 弹出层标签名
181
+ * @param {Array} [config.classNames=['popper']] - 要应用的类名数组
182
+ * @param {Array} [config.attributes=[]] - 要应用的属性数组
183
+ * @param {HTMLElement|String} [config.parent=document.body] - 父元素
184
+ * @param {String} [config.content=''] - 弹出层内容
185
+ * @param {String} [config.contentType='text'] - 内容类型
186
+ * @param {String} [config.arrowTagName='div'] - 箭头元素标签名
187
+ * @param {Array} [config.arrowClassNames=['popper__arrow']] - 箭头元素类名
188
+ * @param {Array} [config.arrowAttributes=['x-arrow']] - 箭头元素属性
189
+ * @returns {HTMLElement} 生成的弹出层 DOM 元素
190
+ * @private
191
+ */
192
+ Popper.prototype.parse = function (config) {
193
+ var defaultConfig = {
194
+ tagName: 'div',
195
+ classNames: ['popper'],
196
+ attributes: [],
197
+ parent: root.document.body,
198
+ content: '',
199
+ contentType: 'text',
200
+ arrowTagName: 'div',
201
+ arrowClassNames: ['popper__arrow'],
202
+ arrowAttributes: ['x-arrow'],
203
+ }
204
+ config = Object.assign({}, defaultConfig, config)
205
+
206
+ var d = root.document
207
+
208
+ var popper = d.createElement(config.tagName)
209
+ addClassNames(popper, config.classNames)
210
+ addAttributes(popper, config.attributes)
211
+ if (config.contentType === 'node') {
212
+ popper.appendChild(config.content.jquery ? config.content[0] : config.content)
213
+ } else if (config.contentType === 'html') {
214
+ popper.innerHTML = config.content
215
+ } else {
216
+ popper.textContent = config.content
217
+ }
218
+
219
+ if (config.arrowTagName) {
220
+ var arrow = d.createElement(config.arrowTagName)
221
+ addClassNames(arrow, config.arrowClassNames)
222
+ addAttributes(arrow, config.arrowAttributes)
223
+ popper.appendChild(arrow)
224
+ }
225
+
226
+ var parent = config.parent.jquery ? config.parent[0] : config.parent
227
+
228
+ if (typeof parent === 'string') {
229
+ parent = d.querySelectorAll(config.parent)
230
+ if (parent.length > 1) {
231
+ console.warn('WARNING: the given parent query matched more than one element, the first one will be used')
232
+ }
233
+ if (parent.length === 0) {
234
+ throw "ERROR: the given parent doesn't exists!"
235
+ }
236
+ parent = parent[0]
237
+ }
238
+ if (parent.length > 1 && parent instanceof Element === false) {
239
+ console.warn('WARNING: you have passed as parent a list of elements, the first one will be used')
240
+ parent = parent[0]
241
+ }
242
+
243
+ parent.appendChild(popper)
244
+
245
+ return popper
246
+
247
+ /**
248
+ * 为元素添加类名
249
+ * @function addClassNames
250
+ * @ignore
251
+ * @param {HTMLElement} element - 目标元素
252
+ * @param {Array} classNames - 类名数组
253
+ * @returns {void}
254
+ */
255
+ function addClassNames(element, classNames) {
256
+ classNames.forEach(function (className) {
257
+ element.classList.add(className)
258
+ })
259
+ }
260
+
261
+ /**
262
+ * 为元素添加属性
263
+ * @function addAttributes
264
+ * @ignore
265
+ * @param {HTMLElement} element - 目标元素
266
+ * @param {Array} attributes - 属性数组
267
+ * @returns {void}
268
+ */
269
+ function addAttributes(element, attributes) {
270
+ attributes.forEach(function (attribute) {
271
+ element.setAttribute(attribute.split(':')[0], attribute.split(':')[1] || '')
272
+ })
273
+ }
274
+ }
275
+
276
+ /**
277
+ * 获取弹出层应使用的定位类型
278
+ * @method
279
+ * @memberof Popper
280
+ * @instance
281
+ * @private
282
+ * @param {HTMLElement} popper - 弹出层元素
283
+ * @param {HTMLElement} reference - 参考元素
284
+ * @returns {String} 定位类型:'absolute' | 'fixed'
285
+ */
286
+ Popper.prototype._getPosition = function (popper, reference) {
287
+ var container = getOffsetParent(reference)
288
+
289
+ if (this._options.forceAbsolute) {
290
+ return 'absolute'
291
+ }
292
+
293
+ var isParentFixed = isFixed(reference, container)
294
+ return isParentFixed ? 'fixed' : 'absolute'
295
+ }
296
+
297
+ /**
298
+ * 计算弹出层偏移量
299
+ * @method
300
+ * @memberof Popper
301
+ * @instance
302
+ * @private
303
+ * @param {HTMLElement} popper - 弹出层元素
304
+ * @param {HTMLElement} reference - 参考元素
305
+ * @param {String} placement - 放置位置
306
+ * @returns {Object} 包含 popper 和 reference 偏移量的对象
307
+ */
308
+ Popper.prototype._getOffsets = function (popper, reference, placement) {
309
+ placement = placement.split('-')[0]
310
+ var popperOffsets = {}
311
+
312
+ popperOffsets.position = this.state.position
313
+ var isParentFixed = popperOffsets.position === 'fixed'
314
+
315
+ var referenceOffsets = getOffsetRectRelativeToCustomParent(reference, getOffsetParent(popper), isParentFixed)
316
+
317
+ var popperRect = getOuterSizes(popper)
318
+
319
+ if (['right', 'left'].indexOf(placement) !== -1) {
320
+ popperOffsets.top = referenceOffsets.top + referenceOffsets.height / 2 - popperRect.height / 2
321
+ if (placement === 'left') {
322
+ popperOffsets.left = referenceOffsets.left - popperRect.width
323
+ } else {
324
+ popperOffsets.left = referenceOffsets.right
325
+ }
326
+ } else {
327
+ popperOffsets.left = referenceOffsets.left + referenceOffsets.width / 2 - popperRect.width / 2
328
+ if (placement === 'top') {
329
+ popperOffsets.top = referenceOffsets.top - popperRect.height
330
+ } else {
331
+ popperOffsets.top = referenceOffsets.bottom
332
+ }
333
+ }
334
+
335
+ popperOffsets.width = popperRect.width
336
+ popperOffsets.height = popperRect.height
337
+
338
+ return {
339
+ popper: popperOffsets,
340
+ reference: referenceOffsets,
341
+ }
342
+ }
343
+
344
+ /**
345
+ * 设置事件监听器
346
+ * @method
347
+ * @memberof Popper
348
+ * @instance
349
+ * @private
350
+ * @description 监听窗口 resize 和滚动事件,自动更新弹出层位置
351
+ * @returns {void}
352
+ */
353
+ Popper.prototype._setupEventListeners = function () {
354
+ this.state.updateBound = this.update.bind(this)
355
+ root.addEventListener('resize', this.state.updateBound)
356
+ if (this._options.boundariesElement !== 'window') {
357
+ var target = getScrollParent(this._reference)
358
+ if (target === root.document.body || target === root.document.documentElement) {
359
+ target = root
360
+ }
361
+ target.addEventListener('scroll', this.state.updateBound)
362
+ this.state.scrollTarget = target
363
+ }
364
+ }
365
+
366
+ /**
367
+ * 移除事件监听器
368
+ * @method
369
+ * @memberof Popper
370
+ * @instance
371
+ * @private
372
+ * @description 清理 resize 和滚动事件监听器
373
+ * @returns {void}
374
+ */
375
+ Popper.prototype._removeEventListeners = function () {
376
+ root.removeEventListener('resize', this.state.updateBound)
377
+ if (this._options.boundariesElement !== 'window' && this.state.scrollTarget) {
378
+ this.state.scrollTarget.removeEventListener('scroll', this.state.updateBound)
379
+ this.state.scrollTarget = null
380
+ }
381
+ this.state.updateBound = null
382
+ }
383
+
384
+ /**
385
+ * 计算边界限制
386
+ * @method
387
+ * @memberof Popper
388
+ * @instance
389
+ * @private
390
+ * @param {Object} data - 包含 offsets 属性的数据对象
391
+ * @param {Number} padding - 边界内边距
392
+ * @param {Element} boundariesElement - 定义边界的元素
393
+ * @returns {Object} 边界坐标对象
394
+ */
395
+ Popper.prototype._getBoundaries = function (data, padding, boundariesElement) {
396
+ var boundaries = {}
397
+ var width, height
398
+ if (boundariesElement === 'window') {
399
+ var body = root.document.body,
400
+ html = root.document.documentElement
401
+
402
+ height = Math.max(body.scrollHeight, body.offsetHeight, html.clientHeight, html.scrollHeight, html.offsetHeight)
403
+ width = Math.max(body.scrollWidth, body.offsetWidth, html.clientWidth, html.scrollWidth, html.offsetWidth)
404
+
405
+ boundaries = {
406
+ top: 0,
407
+ right: width,
408
+ bottom: height,
409
+ left: 0,
410
+ }
411
+ } else if (boundariesElement === 'viewport') {
412
+ var offsetParent = getOffsetParent(this._popper)
413
+ var scrollParent = getScrollParent(this._popper)
414
+ var offsetParentRect = getOffsetRect(offsetParent)
415
+
416
+ var getScrollTopValue = function (element) {
417
+ return element == document.body ? Math.max(document.documentElement.scrollTop, document.body.scrollTop) : element.scrollTop
418
+ }
419
+ var getScrollLeftValue = function (element) {
420
+ return element == document.body ? Math.max(document.documentElement.scrollLeft, document.body.scrollLeft) : element.scrollLeft
421
+ }
422
+
423
+ var scrollTop = data.offsets.popper.position === 'fixed' ? 0 : getScrollTopValue(scrollParent)
424
+ var scrollLeft = data.offsets.popper.position === 'fixed' ? 0 : getScrollLeftValue(scrollParent)
425
+
426
+ boundaries = {
427
+ top: 0 - (offsetParentRect.top - scrollTop),
428
+ right: root.document.documentElement.clientWidth - (offsetParentRect.left - scrollLeft),
429
+ bottom: root.document.documentElement.clientHeight - (offsetParentRect.top - scrollTop),
430
+ left: 0 - (offsetParentRect.left - scrollLeft),
431
+ }
432
+ } else {
433
+ if (getOffsetParent(this._popper) === boundariesElement) {
434
+ boundaries = {
435
+ top: 0,
436
+ left: 0,
437
+ right: boundariesElement.clientWidth,
438
+ bottom: boundariesElement.clientHeight,
439
+ }
440
+ } else {
441
+ boundaries = getOffsetRect(boundariesElement)
442
+ }
443
+ }
444
+ boundaries.left += padding
445
+ boundaries.right -= padding
446
+ boundaries.top = boundaries.top + padding
447
+ boundaries.bottom = boundaries.bottom - padding
448
+ return boundaries
449
+ }
450
+
451
+ /**
452
+ * 运行修饰器函数
453
+ * @method
454
+ * @memberof Popper
455
+ * @instance
456
+ * @public
457
+ * @param {Object} data - 数据对象
458
+ * @param {Array} modifiers - 修饰器函数数组
459
+ * @param {Function} [ends] - 结束条件函数
460
+ * @returns {Object} 处理后的数据对象
461
+ */
462
+ Popper.prototype.runModifiers = function (data, modifiers, ends) {
463
+ var modifiersToRun = modifiers.slice()
464
+ if (ends !== undefined) {
465
+ modifiersToRun = this._options.modifiers.slice(0, getArrayKeyIndex(this._options.modifiers, ends))
466
+ }
467
+
468
+ modifiersToRun.forEach(
469
+ function (modifier) {
470
+ if (isFunction(modifier)) {
471
+ data = modifier.call(this, data)
472
+ }
473
+ }.bind(this)
474
+ )
475
+
476
+ return data
477
+ }
478
+
479
+ /**
480
+ * 检查修饰器依赖
481
+ * @method
482
+ * @memberof Popper
483
+ * @instance
484
+ * @param {String} requesting - 请求的修饰器名称
485
+ * @param {String} requested - 被请求的修饰器名称
486
+ * @returns {Boolean} 是否依赖
487
+ */
488
+ Popper.prototype.isModifierRequired = function (requesting, requested) {
489
+ var index = getArrayKeyIndex(this._options.modifiers, requesting)
490
+ return !!this._options.modifiers.slice(0, index).filter(function (modifier) {
491
+ return modifier === requested
492
+ }).length
493
+ }
494
+
495
+ /**
496
+ * 修饰器列表
497
+ * @namespace Popper.modifiers
498
+ * @memberof Popper
499
+ * @static
500
+ * @type {Object}
501
+ */
502
+ Popper.prototype.modifiers = {}
503
+
504
+ /**
505
+ * 应用样式修饰器
506
+ * @method
507
+ * @memberof Popper.modifiers
508
+ * @static
509
+ * @param {Object} data - update 方法生成的数据对象
510
+ * @returns {Object} 相同的数据对象
511
+ */
512
+ Popper.prototype.modifiers.applyStyle = function (data) {
513
+ var styles = {
514
+ position: data.offsets.popper.position,
515
+ }
516
+
517
+ var left = Math.round(data.offsets.popper.left)
518
+ var top = Math.round(data.offsets.popper.top)
519
+
520
+ var prefixedProperty
521
+ if (this._options.gpuAcceleration && (prefixedProperty = getSupportedPropertyName('transform'))) {
522
+ styles[prefixedProperty] = 'translate3d(' + left + 'px, ' + top + 'px, 0)'
523
+ styles.top = 0
524
+ styles.left = 0
525
+ } else {
526
+ styles.left = left
527
+ styles.top = top
528
+ }
529
+
530
+ Object.assign(styles, data.styles)
531
+
532
+ setStyle(this._popper, styles)
533
+
534
+ this._popper.setAttribute('x-placement', data.placement)
535
+
536
+ if (this.isModifierRequired(this.modifiers.applyStyle, this.modifiers.arrow) && data.offsets.arrow) {
537
+ setStyle(data.arrowElement, data.offsets.arrow)
538
+ }
539
+
540
+ return data
541
+ }
542
+
543
+ /**
544
+ * 偏移修饰器
545
+ * @method
546
+ * @memberof Popper.modifiers
547
+ * @static
548
+ * @param {Object} data - update 方法生成的数据对象
549
+ * @returns {Object} 修改后的数据对象
550
+ */
551
+ Popper.prototype.modifiers.shift = function (data) {
552
+ var placement = data.placement
553
+ var basePlacement = placement.split('-')[0]
554
+ var shiftVariation = placement.split('-')[1]
555
+
556
+ if (shiftVariation) {
557
+ var reference = data.offsets.reference
558
+ var popper = getPopperClientRect(data.offsets.popper)
559
+
560
+ var shiftOffsets = {
561
+ y: {
562
+ start: { top: reference.top },
563
+ end: { top: reference.top + reference.height - popper.height },
564
+ },
565
+ x: {
566
+ start: { left: reference.left },
567
+ end: { left: reference.left + reference.width - popper.width },
568
+ },
569
+ }
570
+
571
+ var axis = ['bottom', 'top'].indexOf(basePlacement) !== -1 ? 'x' : 'y'
572
+
573
+ data.offsets.popper = Object.assign(popper, shiftOffsets[axis][shiftVariation])
574
+ }
575
+
576
+ return data
577
+ }
578
+
579
+ /**
580
+ * 防止溢出修饰器
581
+ * @method
582
+ * @memberof Popper.modifiers
583
+ * @static
584
+ * @param {Object} data - update 方法生成的数据对象
585
+ * @returns {Object} 修改后的数据对象
586
+ */
587
+ Popper.prototype.modifiers.preventOverflow = function (data) {
588
+ var order = this._options.preventOverflowOrder
589
+ var popper = getPopperClientRect(data.offsets.popper)
590
+
591
+ var check = {
592
+ left: function () {
593
+ var left = popper.left
594
+ if (popper.left < data.boundaries.left) {
595
+ left = Math.max(popper.left, data.boundaries.left)
596
+ }
597
+ return { left: left }
598
+ },
599
+ right: function () {
600
+ var left = popper.left
601
+ if (popper.right > data.boundaries.right) {
602
+ left = Math.min(popper.left, data.boundaries.right - popper.width)
603
+ }
604
+ return { left: left }
605
+ },
606
+ top: function () {
607
+ var top = popper.top
608
+ if (popper.top < data.boundaries.top) {
609
+ top = Math.max(popper.top, data.boundaries.top)
610
+ }
611
+ return { top: top }
612
+ },
613
+ bottom: function () {
614
+ var top = popper.top
615
+ if (popper.bottom > data.boundaries.bottom) {
616
+ top = Math.min(popper.top, data.boundaries.bottom - popper.height)
617
+ }
618
+ return { top: top }
619
+ },
620
+ }
621
+
622
+ order.forEach(function (direction) {
623
+ data.offsets.popper = Object.assign(popper, check[direction]())
624
+ })
625
+
626
+ return data
627
+ }
628
+
629
+ /**
630
+ * 保持在一起修饰器
631
+ * @method
632
+ * @memberof Popper.modifiers
633
+ * @static
634
+ * @param {Object} data - update 方法生成的数据对象
635
+ * @returns {Object} 修改后的数据对象
636
+ */
637
+ Popper.prototype.modifiers.keepTogether = function (data) {
638
+ var popper = getPopperClientRect(data.offsets.popper)
639
+ var reference = data.offsets.reference
640
+ var f = Math.floor
641
+
642
+ if (popper.right < f(reference.left)) {
643
+ data.offsets.popper.left = f(reference.left) - popper.width
644
+ }
645
+ if (popper.left > f(reference.right)) {
646
+ data.offsets.popper.left = f(reference.right)
647
+ }
648
+ if (popper.bottom < f(reference.top)) {
649
+ data.offsets.popper.top = f(reference.top) - popper.height
650
+ }
651
+ if (popper.top > f(reference.bottom)) {
652
+ data.offsets.popper.top = f(reference.bottom)
653
+ }
654
+
655
+ return data
656
+ }
657
+
658
+ /**
659
+ * 翻转修饰器
660
+ * @method
661
+ * @memberof Popper.modifiers
662
+ * @static
663
+ * @param {Object} data - update 方法生成的数据对象
664
+ * @returns {Object} 修改后的数据对象
665
+ * @note 需要 preventOverflow 修饰器在其之前执行才能正常工作
666
+ */
667
+ Popper.prototype.modifiers.flip = function (data) {
668
+ if (!this.isModifierRequired(this.modifiers.flip, this.modifiers.preventOverflow)) {
669
+ console.warn('WARNING: preventOverflow modifier is required by flip modifier in order to work!')
670
+ return data
671
+ }
672
+
673
+ if (data.flipped && data.placement === data._originalPlacement) {
674
+ return data
675
+ }
676
+
677
+ var placement = data.placement.split('-')[0]
678
+ var placementOpposite = getOppositePlacement(placement)
679
+ var variation = data.placement.split('-')[1] || ''
680
+
681
+ var flipOrder = []
682
+ if (this._options.flipBehavior === 'flip') {
683
+ flipOrder = [placement, placementOpposite]
684
+ } else {
685
+ flipOrder = this._options.flipBehavior
686
+ }
687
+
688
+ flipOrder.forEach(
689
+ function (step, index) {
690
+ if (placement !== step || flipOrder.length === index + 1) {
691
+ return
692
+ }
693
+
694
+ placement = data.placement.split('-')[0]
695
+ placementOpposite = getOppositePlacement(placement)
696
+
697
+ var popperOffsets = getPopperClientRect(data.offsets.popper)
698
+
699
+ var a = ['right', 'bottom'].indexOf(placement) !== -1
700
+
701
+ if ((a && Math.floor(data.offsets.reference[placement]) > Math.floor(popperOffsets[placementOpposite])) || (!a && Math.floor(data.offsets.reference[placement]) < Math.floor(popperOffsets[placementOpposite]))) {
702
+ data.flipped = true
703
+ data.placement = flipOrder[index + 1]
704
+ if (variation) {
705
+ data.placement += '-' + variation
706
+ }
707
+ data.offsets.popper = this._getOffsets(this._popper, this._reference, data.placement).popper
708
+
709
+ data = this.runModifiers(data, this._options.modifiers, this._flip)
710
+ }
711
+ }.bind(this)
712
+ )
713
+ return data
714
+ }
715
+
716
+ /**
717
+ * 偏移量修饰器
718
+ * @method
719
+ * @memberof Popper.modifiers
720
+ * @static
721
+ * @param {Object} data - update 方法生成的数据对象
722
+ * @returns {Object} 修改后的数据对象
723
+ */
724
+ Popper.prototype.modifiers.offset = function (data) {
725
+ var offset = this._options.offset
726
+ var popper = data.offsets.popper
727
+
728
+ if (data.placement.indexOf('left') !== -1) {
729
+ popper.top -= offset
730
+ } else if (data.placement.indexOf('right') !== -1) {
731
+ popper.top += offset
732
+ } else if (data.placement.indexOf('top') !== -1) {
733
+ popper.left -= offset
734
+ } else if (data.placement.indexOf('bottom') !== -1) {
735
+ popper.left += offset
736
+ }
737
+ return data
738
+ }
739
+
740
+ /**
741
+ * 箭头修饰器
742
+ * @method
743
+ * @memberof Popper.modifiers
744
+ * @static
745
+ * @param {Object} data - update 方法生成的数据对象
746
+ * @returns {Object} 修改后的数据对象
747
+ * @note 需要 keepTogether 修饰器在其之前执行才能正常工作
748
+ */
749
+ Popper.prototype.modifiers.arrow = function (data) {
750
+ var arrow = this._options.arrowElement
751
+ var arrowOffset = this._options.arrowOffset
752
+
753
+ if (typeof arrow === 'string') {
754
+ arrow = this._popper.querySelector(arrow)
755
+ }
756
+
757
+ if (!arrow) {
758
+ return data
759
+ }
760
+
761
+ if (!this._popper.contains(arrow)) {
762
+ console.warn('WARNING: arrowElement must be child of its popper element!')
763
+ return data
764
+ }
765
+
766
+ if (!this.isModifierRequired(this.modifiers.arrow, this.modifiers.keepTogether)) {
767
+ console.warn('WARNING: keepTogether modifier is required by arrow modifier in order to work!')
768
+ return data
769
+ }
770
+
771
+ var arrowStyle = {}
772
+ var placement = data.placement.split('-')[0]
773
+ var popper = getPopperClientRect(data.offsets.popper)
774
+ var reference = data.offsets.reference
775
+ var isVertical = ['left', 'right'].indexOf(placement) !== -1
776
+
777
+ var len = isVertical ? 'height' : 'width'
778
+ var side = isVertical ? 'top' : 'left'
779
+ var altSide = isVertical ? 'left' : 'top'
780
+ var opSide = isVertical ? 'bottom' : 'right'
781
+ var arrowSize = getOuterSizes(arrow)[len]
782
+
783
+ if (reference[opSide] - arrowSize < popper[side]) {
784
+ data.offsets.popper[side] -= popper[side] - (reference[opSide] - arrowSize)
785
+ }
786
+ if (reference[side] + arrowSize > popper[opSide]) {
787
+ data.offsets.popper[side] += reference[side] + arrowSize - popper[opSide]
788
+ }
789
+
790
+ var center = reference[side] + (arrowOffset || reference[len] / 2 - arrowSize / 2)
791
+
792
+ var sideValue = center - popper[side]
793
+
794
+ sideValue = Math.max(Math.min(popper[len] - arrowSize - 8, sideValue), 8)
795
+ arrowStyle[side] = sideValue
796
+ arrowStyle[altSide] = ''
797
+
798
+ data.offsets.arrow = arrowStyle
799
+ data.arrowElement = arrow
800
+
801
+ return data
802
+ }
803
+
804
+ /**
805
+ * 获取元素的外部尺寸
806
+ * @function getOuterSizes
807
+ * @ignore
808
+ * @param {HTMLElement} element - 目标元素
809
+ * @returns {Object} 包含 width 和 height 属性的对象
810
+ * @private
811
+ */
812
+ function getOuterSizes(element) {
813
+ var _display = element.style.display,
814
+ _visibility = element.style.visibility
815
+ element.style.display = 'block'
816
+ element.style.visibility = 'hidden'
817
+ var calcWidthToForceRepaint = element.offsetWidth
818
+
819
+ var styles = root.getComputedStyle(element)
820
+ var x = parseFloat(styles.marginTop) + parseFloat(styles.marginBottom)
821
+ var y = parseFloat(styles.marginLeft) + parseFloat(styles.marginRight)
822
+ var result = { width: element.offsetWidth + y, height: element.offsetHeight + x }
823
+
824
+ element.style.display = _display
825
+ element.style.visibility = _visibility
826
+ return result
827
+ }
828
+
829
+ /**
830
+ * 获取相反的放置位置
831
+ * @function getOppositePlacement
832
+ * @ignore
833
+ * @param {String} placement - 原始位置
834
+ * @returns {String} 翻转后的位置
835
+ * @private
836
+ */
837
+ function getOppositePlacement(placement) {
838
+ var hash = { left: 'right', right: 'left', bottom: 'top', top: 'bottom' }
839
+ return placement.replace(/left|right|bottom|top/g, function (matched) {
840
+ return hash[matched]
841
+ })
842
+ }
843
+
844
+ /**
845
+ * 根据弹出层偏移量生成类似 getBoundingClientRect 的输出
846
+ * @function getPopperClientRect
847
+ * @ignore
848
+ * @param {Object} popperOffsets - 弹出层偏移量对象
849
+ * @returns {Object} 类似 ClientRect 的输出对象
850
+ * @private
851
+ */
852
+ function getPopperClientRect(popperOffsets) {
853
+ var offsets = Object.assign({}, popperOffsets)
854
+ offsets.right = offsets.left + offsets.width
855
+ offsets.bottom = offsets.top + offsets.height
856
+ return offsets
857
+ }
858
+
859
+ /**
860
+ * 获取数组中指定键的索引
861
+ * @function getArrayKeyIndex
862
+ * @ignore
863
+ * @param {Array} arr - 目标数组
864
+ * @param {*} keyToFind - 要查找的键
865
+ * @returns {Number|null} 索引值
866
+ * @private
867
+ */
868
+ function getArrayKeyIndex(arr, keyToFind) {
869
+ var i = 0,
870
+ key
871
+ for (key in arr) {
872
+ if (arr[key] === keyToFind) {
873
+ return i
874
+ }
875
+ i++
876
+ }
877
+ return null
878
+ }
879
+
880
+ /**
881
+ * 获取元素的 CSS 计算属性
882
+ * @function getStyleComputedProperty
883
+ * @ignore
884
+ * @param {HTMLElement} element - 目标元素
885
+ * @param {String} property - 属性名
886
+ * @returns {String} CSS 属性值
887
+ * @private
888
+ */
889
+ function getStyleComputedProperty(element, property) {
890
+ var css = root.getComputedStyle(element, null)
891
+ return css[property]
892
+ }
893
+
894
+ /**
895
+ * 获取元素的偏移父元素
896
+ * @function getOffsetParent
897
+ * @ignore
898
+ * @param {HTMLElement} element - 目标元素
899
+ * @returns {HTMLElement} 偏移父元素
900
+ * @private
901
+ */
902
+ function getOffsetParent(element) {
903
+ var offsetParent = element.offsetParent
904
+ return offsetParent === root.document.body || !offsetParent ? root.document.documentElement : offsetParent
905
+ }
906
+
907
+ /**
908
+ * 获取元素的滚动父元素
909
+ * @function getScrollParent
910
+ * @ignore
911
+ * @param {HTMLElement} element - 目标元素
912
+ * @returns {HTMLElement} 滚动父元素
913
+ * @private
914
+ */
915
+ function getScrollParent(element) {
916
+ var parent = element.parentNode
917
+
918
+ if (!parent) {
919
+ return element
920
+ }
921
+
922
+ if (parent === root.document) {
923
+ if (root.document.body.scrollTop || root.document.body.scrollLeft) {
924
+ return root.document.body
925
+ } else {
926
+ return root.document.documentElement
927
+ }
928
+ }
929
+
930
+ if (
931
+ ['scroll', 'auto'].indexOf(getStyleComputedProperty(parent, 'overflow')) !== -1 ||
932
+ ['scroll', 'auto'].indexOf(getStyleComputedProperty(parent, 'overflow-x')) !== -1 ||
933
+ ['scroll', 'auto'].indexOf(getStyleComputedProperty(parent, 'overflow-y')) !== -1
934
+ ) {
935
+ return parent
936
+ }
937
+ return getScrollParent(element.parentNode)
938
+ }
939
+
940
+ /**
941
+ * 检查元素是否为固定定位
942
+ * @function isFixed
943
+ * @ignore
944
+ * @param {HTMLElement} element - 目标元素
945
+ * @returns {Boolean} 是否为固定定位
946
+ * @private
947
+ */
948
+ function isFixed(element) {
949
+ if (element === root.document.body) {
950
+ return false
951
+ }
952
+ if (getStyleComputedProperty(element, 'position') === 'fixed') {
953
+ return true
954
+ }
955
+ return element.parentNode ? isFixed(element.parentNode) : element
956
+ }
957
+
958
+ /**
959
+ * 为元素设置样式
960
+ * @function setStyle
961
+ * @ignore
962
+ * @param {HTMLElement} element - 目标元素
963
+ * @param {Object} styles - 样式对象
964
+ * @returns {void}
965
+ * @private
966
+ */
967
+ function setStyle(element, styles) {
968
+ function is_numeric(n) {
969
+ return n !== '' && !isNaN(parseFloat(n)) && isFinite(n)
970
+ }
971
+ Object.keys(styles).forEach(function (prop) {
972
+ var unit = ''
973
+ if (['width', 'height', 'top', 'right', 'bottom', 'left'].indexOf(prop) !== -1 && is_numeric(styles[prop])) {
974
+ unit = 'px'
975
+ }
976
+ element.style[prop] = styles[prop] + unit
977
+ })
978
+ }
979
+
980
+ /**
981
+ * 检查变量是否为函数
982
+ * @function isFunction
983
+ * @ignore
984
+ * @param {*} functionToCheck - 要检查的变量
985
+ * @returns {Boolean} 是否为函数
986
+ * @private
987
+ */
988
+ function isFunction(functionToCheck) {
989
+ var getType = {}
990
+ return functionToCheck && getType.toString.call(functionToCheck) === '[object Function]'
991
+ }
992
+
993
+ /**
994
+ * 获取元素相对于其偏移父元素的位置
995
+ * @function getOffsetRect
996
+ * @ignore
997
+ * @param {HTMLElement} element - 目标元素
998
+ * @returns {Object} 位置对象
999
+ * @private
1000
+ */
1001
+ function getOffsetRect(element) {
1002
+ var elementRect = {
1003
+ width: element.offsetWidth,
1004
+ height: element.offsetHeight,
1005
+ left: element.offsetLeft,
1006
+ top: element.offsetTop,
1007
+ }
1008
+
1009
+ elementRect.right = elementRect.left + elementRect.width
1010
+ elementRect.bottom = elementRect.top + elementRect.height
1011
+
1012
+ return elementRect
1013
+ }
1014
+
1015
+ /**
1016
+ * 获取元素的边界客户端矩形
1017
+ * @function getBoundingClientRect
1018
+ * @ignore
1019
+ * @param {HTMLElement} element - 目标元素
1020
+ * @returns {Object} 客户端矩形对象
1021
+ * @private
1022
+ */
1023
+ function getBoundingClientRect(element) {
1024
+ var rect = element.getBoundingClientRect()
1025
+
1026
+ var isIE = navigator.userAgent.indexOf('MSIE') != -1
1027
+
1028
+ var rectTop = isIE && element.tagName === 'HTML' ? -element.scrollTop : rect.top
1029
+
1030
+ return {
1031
+ left: rect.left,
1032
+ top: rectTop,
1033
+ right: rect.right,
1034
+ bottom: rect.bottom,
1035
+ width: rect.right - rect.left,
1036
+ height: rect.bottom - rectTop,
1037
+ }
1038
+ }
1039
+
1040
+ /**
1041
+ * 获取元素相对于其父元素的偏移量
1042
+ * @function getOffsetRectRelativeToCustomParent
1043
+ * @ignore
1044
+ * @param {HTMLElement} element - 目标元素
1045
+ * @param {HTMLElement} parent - 父元素
1046
+ * @param {Boolean} fixed - 是否为固定定位
1047
+ * @returns {Object} 矩形对象
1048
+ * @private
1049
+ */
1050
+ function getOffsetRectRelativeToCustomParent(element, parent, fixed) {
1051
+ var elementRect = getBoundingClientRect(element)
1052
+ var parentRect = getBoundingClientRect(parent)
1053
+
1054
+ if (fixed) {
1055
+ var scrollParent = getScrollParent(parent)
1056
+ parentRect.top += scrollParent.scrollTop
1057
+ parentRect.bottom += scrollParent.scrollTop
1058
+ parentRect.left += scrollParent.scrollLeft
1059
+ parentRect.right += scrollParent.scrollLeft
1060
+ }
1061
+
1062
+ var rect = {
1063
+ top: elementRect.top - parentRect.top,
1064
+ left: elementRect.left - parentRect.left,
1065
+ bottom: elementRect.top - parentRect.top + elementRect.height,
1066
+ right: elementRect.left - parentRect.left + elementRect.width,
1067
+ width: elementRect.width,
1068
+ height: elementRect.height,
1069
+ }
1070
+ return rect
1071
+ }
1072
+
1073
+ /**
1074
+ * 获取带浏览器前缀的 CSS 属性名
1075
+ * @function getSupportedPropertyName
1076
+ * @ignore
1077
+ * @param {String} property - 属性名
1078
+ * @returns {String|null} 带前缀的属性名
1079
+ * @private
1080
+ */
1081
+ function getSupportedPropertyName(property) {
1082
+ var prefixes = ['', 'ms', 'webkit', 'moz', 'o']
1083
+
1084
+ for (var i = 0; i < prefixes.length; i++) {
1085
+ var toCheck = prefixes[i] ? prefixes[i] + property.charAt(0).toUpperCase() + property.slice(1) : property
1086
+ if (typeof root.document.body.style[toCheck] !== 'undefined') {
1087
+ return toCheck
1088
+ }
1089
+ }
1090
+ return null
1091
+ }
1092
+
1093
+ /**
1094
+ * Object.assign() 方法的 Polyfill
1095
+ * @function Object.assign
1096
+ * @ignore
1097
+ * @see {@link https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/assign}
1098
+ */
1099
+ if (!Object.assign) {
1100
+ Object.defineProperty(Object, 'assign', {
1101
+ enumerable: false,
1102
+ configurable: true,
1103
+ writable: true,
1104
+ value: function (target) {
1105
+ if (target === undefined || target === null) {
1106
+ throw new TypeError('Cannot convert first argument to object')
1107
+ }
1108
+
1109
+ var to = Object(target)
1110
+ for (var i = 1; i < arguments.length; i++) {
1111
+ var nextSource = arguments[i]
1112
+ if (nextSource === undefined || nextSource === null) {
1113
+ continue
1114
+ }
1115
+ nextSource = Object(nextSource)
1116
+
1117
+ var keysArray = Object.keys(nextSource)
1118
+ for (var nextIndex = 0, len = keysArray.length; nextIndex < len; nextIndex++) {
1119
+ var nextKey = keysArray[nextIndex]
1120
+ var desc = Object.getOwnPropertyDescriptor(nextSource, nextKey)
1121
+ if (desc !== undefined && desc.enumerable) {
1122
+ to[nextKey] = nextSource[nextKey]
1123
+ }
1124
+ }
1125
+ }
1126
+ return to
1127
+ },
1128
+ })
1129
+ }
1130
+
1131
+ return Popper
1132
+ })