@melt-js/comps-vben 0.0.0-stage → 2026.11.8-2

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 (618) hide show
  1. package/LICENSE +10 -0
  2. package/README.md +91 -2
  3. package/hel_dist/assets/index-DaBGAjzb.js +478 -0
  4. package/hel_dist/assets/style-CcRbEt6_.css +2 -0
  5. package/hel_dist/entry.js +20 -0
  6. package/hel_dist/hel-meta.json +116 -0
  7. package/hel_dist/index.html +37 -0
  8. package/hel_proxy/entry.js +20 -0
  9. package/hel_proxy/entry.js.map +1 -0
  10. package/hel_proxy_es/entry.js +11 -0
  11. package/hel_proxy_es/entry.js.map +1 -0
  12. package/package.json +101 -3
  13. package/scripts/check-tdz.mjs +20 -0
  14. package/scripts/check.mjs +18 -0
  15. package/scripts/meta.mjs +28 -0
  16. package/scripts/prepublishOnly.mjs +42 -0
  17. package/scripts/publish-stage.mjs +25 -0
  18. package/src/common-ui/components/api-component/api-component.vue +273 -0
  19. package/src/common-ui/components/api-component/index.ts +7 -0
  20. package/src/common-ui/components/api-component/types.ts +72 -0
  21. package/src/common-ui/components/captcha/hooks/useCaptchaPoints.ts +19 -0
  22. package/src/common-ui/components/captcha/index.ts +7 -0
  23. package/src/common-ui/components/captcha/point-selection-captcha/index.vue +176 -0
  24. package/src/common-ui/components/captcha/point-selection-captcha/point-selection-captcha-card.vue +86 -0
  25. package/src/common-ui/components/captcha/slider-captcha/index.vue +254 -0
  26. package/src/common-ui/components/captcha/slider-captcha/slider-captcha-action.vue +65 -0
  27. package/src/common-ui/components/captcha/slider-captcha/slider-captcha-bar.vue +40 -0
  28. package/src/common-ui/components/captcha/slider-captcha/slider-captcha-content.vue +53 -0
  29. package/src/common-ui/components/captcha/slider-rotate-captcha/index.vue +213 -0
  30. package/src/common-ui/components/captcha/slider-translate-captcha/index.vue +311 -0
  31. package/src/common-ui/components/captcha/types.ts +210 -0
  32. package/src/common-ui/components/col-page/col-page.vue +111 -0
  33. package/src/common-ui/components/col-page/index.ts +2 -0
  34. package/src/common-ui/components/col-page/types.ts +26 -0
  35. package/src/common-ui/components/count-to/count-to.vue +123 -0
  36. package/src/common-ui/components/count-to/index.ts +2 -0
  37. package/src/common-ui/components/count-to/types.ts +53 -0
  38. package/src/common-ui/components/cropper/cropper.vue +981 -0
  39. package/src/common-ui/components/cropper/index.ts +1 -0
  40. package/src/common-ui/components/ellipsis-text/ellipsis-text.vue +232 -0
  41. package/src/common-ui/components/ellipsis-text/index.ts +1 -0
  42. package/src/common-ui/components/icon-picker/icon-picker.vue +322 -0
  43. package/src/common-ui/components/icon-picker/icons.ts +56 -0
  44. package/src/common-ui/components/icon-picker/index.ts +2 -0
  45. package/src/common-ui/components/icon-picker/types.ts +26 -0
  46. package/src/common-ui/components/index.ts +51 -0
  47. package/src/common-ui/components/json-viewer/index.ts +3 -0
  48. package/src/common-ui/components/json-viewer/index.vue +128 -0
  49. package/src/common-ui/components/json-viewer/style.scss +91 -0
  50. package/src/common-ui/components/json-viewer/types.ts +44 -0
  51. package/src/common-ui/components/loading/directive.ts +132 -0
  52. package/src/common-ui/components/loading/index.ts +3 -0
  53. package/src/common-ui/components/loading/loading.vue +39 -0
  54. package/src/common-ui/components/loading/spinner.vue +28 -0
  55. package/src/common-ui/components/page/index.ts +2 -0
  56. package/src/common-ui/components/page/page.vue +107 -0
  57. package/src/common-ui/components/page/types.ts +23 -0
  58. package/src/common-ui/components/resize/index.ts +1 -0
  59. package/src/common-ui/components/resize/resize.vue +1269 -0
  60. package/src/common-ui/components/tippy/directive.ts +100 -0
  61. package/src/common-ui/components/tippy/index.ts +67 -0
  62. package/src/common-ui/components/tree/index.ts +1 -0
  63. package/src/common-ui/components/tree/tree.vue +25 -0
  64. package/src/common-ui/index.ts +2 -0
  65. package/src/common-ui/ui/about/about.ts +14 -0
  66. package/src/common-ui/ui/about/about.vue +183 -0
  67. package/src/common-ui/ui/about/index.ts +1 -0
  68. package/src/common-ui/ui/authentication/auth-title.vue +13 -0
  69. package/src/common-ui/ui/authentication/code-login.vue +127 -0
  70. package/src/common-ui/ui/authentication/dingding-login.vue +113 -0
  71. package/src/common-ui/ui/authentication/forget-password.vue +116 -0
  72. package/src/common-ui/ui/authentication/index.ts +7 -0
  73. package/src/common-ui/ui/authentication/login-expired-modal.vue +95 -0
  74. package/src/common-ui/ui/authentication/login.vue +186 -0
  75. package/src/common-ui/ui/authentication/qrcode-login.vue +105 -0
  76. package/src/common-ui/ui/authentication/register.vue +121 -0
  77. package/src/common-ui/ui/authentication/third-party-login.vue +71 -0
  78. package/src/common-ui/ui/authentication/types.ts +70 -0
  79. package/src/common-ui/ui/dashboard/analysis/analysis-chart-card.vue +24 -0
  80. package/src/common-ui/ui/dashboard/analysis/analysis-charts-tabs.vue +40 -0
  81. package/src/common-ui/ui/dashboard/analysis/analysis-overview.vue +55 -0
  82. package/src/common-ui/ui/dashboard/analysis/index.ts +3 -0
  83. package/src/common-ui/ui/dashboard/index.ts +3 -0
  84. package/src/common-ui/ui/dashboard/typing.ts +50 -0
  85. package/src/common-ui/ui/dashboard/workbench/index.ts +5 -0
  86. package/src/common-ui/ui/dashboard/workbench/workbench-header.vue +48 -0
  87. package/src/common-ui/ui/dashboard/workbench/workbench-project.vue +73 -0
  88. package/src/common-ui/ui/dashboard/workbench/workbench-quick-nav.vue +56 -0
  89. package/src/common-ui/ui/dashboard/workbench/workbench-todo.vue +63 -0
  90. package/src/common-ui/ui/dashboard/workbench/workbench-trends.vue +64 -0
  91. package/src/common-ui/ui/fallback/fallback.ts +25 -0
  92. package/src/common-ui/ui/fallback/fallback.vue +164 -0
  93. package/src/common-ui/ui/fallback/icons/icon-403.vue +151 -0
  94. package/src/common-ui/ui/fallback/icons/icon-404.vue +154 -0
  95. package/src/common-ui/ui/fallback/icons/icon-500.vue +215 -0
  96. package/src/common-ui/ui/fallback/icons/icon-coming-soon.vue +262 -0
  97. package/src/common-ui/ui/fallback/icons/icon-offline.vue +112 -0
  98. package/src/common-ui/ui/fallback/icons/warning.svg +1 -0
  99. package/src/common-ui/ui/fallback/index.ts +2 -0
  100. package/src/common-ui/ui/index.ts +5 -0
  101. package/src/common-ui/ui/profile/base-setting.vue +58 -0
  102. package/src/common-ui/ui/profile/index.ts +6 -0
  103. package/src/common-ui/ui/profile/notification-setting.vue +52 -0
  104. package/src/common-ui/ui/profile/password-setting.vue +59 -0
  105. package/src/common-ui/ui/profile/profile.vue +64 -0
  106. package/src/common-ui/ui/profile/security-setting.vue +52 -0
  107. package/src/common-ui/ui/profile/types.ts +21 -0
  108. package/src/configs/subApp.ts +1 -0
  109. package/src/entrance/libProperties.ts +34 -0
  110. package/src/entrance/libTypes.js +9 -0
  111. package/src/form-ui/components/form-actions.vue +178 -0
  112. package/src/form-ui/components/form-field-array.vue +234 -0
  113. package/src/form-ui/config.ts +117 -0
  114. package/src/form-ui/deprecation.ts +18 -0
  115. package/src/form-ui/field-name.ts +106 -0
  116. package/src/form-ui/form-api.ts +766 -0
  117. package/src/form-ui/form-codec.ts +40 -0
  118. package/src/form-ui/form-render/context.ts +25 -0
  119. package/src/form-ui/form-render/dependencies.ts +305 -0
  120. package/src/form-ui/form-render/expandable.ts +105 -0
  121. package/src/form-ui/form-render/form-field.vue +644 -0
  122. package/src/form-ui/form-render/form-group.vue +126 -0
  123. package/src/form-ui/form-render/form-label.vue +35 -0
  124. package/src/form-ui/form-render/form.vue +205 -0
  125. package/src/form-ui/form-render/helper.ts +65 -0
  126. package/src/form-ui/form-render/index.ts +3 -0
  127. package/src/form-ui/form-render/schema.ts +534 -0
  128. package/src/form-ui/form-render/utils.ts +170 -0
  129. package/src/form-ui/form-runtime-field.ts +82 -0
  130. package/src/form-ui/form-runtime.ts +325 -0
  131. package/src/form-ui/form-value-transform.ts +235 -0
  132. package/src/form-ui/index.ts +39 -0
  133. package/src/form-ui/rule-registry.ts +17 -0
  134. package/src/form-ui/types.ts +1054 -0
  135. package/src/form-ui/use-custom-field-value.ts +124 -0
  136. package/src/form-ui/use-form-context.ts +148 -0
  137. package/src/form-ui/use-vben-form.ts +81 -0
  138. package/src/form-ui/vben-form.vue +79 -0
  139. package/src/form-ui/vben-use-form.vue +187 -0
  140. package/src/layout-ui/components/index.ts +5 -0
  141. package/src/layout-ui/components/layout-content.vue +75 -0
  142. package/src/layout-ui/components/layout-footer.vue +46 -0
  143. package/src/layout-ui/components/layout-header.vue +89 -0
  144. package/src/layout-ui/components/layout-sidebar.vue +484 -0
  145. package/src/layout-ui/components/layout-tabbar.vue +30 -0
  146. package/src/layout-ui/components/widgets/index.ts +2 -0
  147. package/src/layout-ui/components/widgets/sidebar-collapse-button.vue +25 -0
  148. package/src/layout-ui/components/widgets/sidebar-fixed-button.vue +27 -0
  149. package/src/layout-ui/header-scroll-state.ts +28 -0
  150. package/src/layout-ui/hooks/use-layout.ts +53 -0
  151. package/src/layout-ui/hooks/use-sidebar-drag.ts +152 -0
  152. package/src/layout-ui/index.ts +2 -0
  153. package/src/layout-ui/vben-layout.ts +188 -0
  154. package/src/layout-ui/vben-layout.vue +768 -0
  155. package/src/layouts/authentication/authentication.vue +196 -0
  156. package/src/layouts/authentication/form.vue +38 -0
  157. package/src/layouts/authentication/icons/slogan.vue +4568 -0
  158. package/src/layouts/authentication/index.ts +2 -0
  159. package/src/layouts/authentication/toolbar.vue +49 -0
  160. package/src/layouts/authentication/types.ts +1 -0
  161. package/src/layouts/basic/README.md +7 -0
  162. package/src/layouts/basic/content/content-spinner.vue +12 -0
  163. package/src/layouts/basic/content/content.vue +112 -0
  164. package/src/layouts/basic/content/index.ts +2 -0
  165. package/src/layouts/basic/content/use-content-spinner.ts +98 -0
  166. package/src/layouts/basic/copyright/copyright.vue +49 -0
  167. package/src/layouts/basic/copyright/index.ts +1 -0
  168. package/src/layouts/basic/footer/footer.vue +11 -0
  169. package/src/layouts/basic/footer/index.ts +1 -0
  170. package/src/layouts/basic/header/header.vue +408 -0
  171. package/src/layouts/basic/header/index.ts +1 -0
  172. package/src/layouts/basic/index.ts +1 -0
  173. package/src/layouts/basic/layout.vue +478 -0
  174. package/src/layouts/basic/menu/extra-menu.vue +41 -0
  175. package/src/layouts/basic/menu/index.ts +5 -0
  176. package/src/layouts/basic/menu/menu.vue +45 -0
  177. package/src/layouts/basic/menu/mixed-menu.vue +46 -0
  178. package/src/layouts/basic/menu/use-extra-menu.ts +179 -0
  179. package/src/layouts/basic/menu/use-mixed-menu.ts +181 -0
  180. package/src/layouts/basic/menu/use-navigation.ts +74 -0
  181. package/src/layouts/basic/tabbar/index.ts +2 -0
  182. package/src/layouts/basic/tabbar/tabbar.vue +84 -0
  183. package/src/layouts/basic/tabbar/use-tabbar.ts +229 -0
  184. package/src/layouts/basic/use-layout-scroll.ts +85 -0
  185. package/src/layouts/hooks/index.ts +98 -0
  186. package/src/layouts/iframe/iframe-router-view.vue +86 -0
  187. package/src/layouts/iframe/iframe-view.vue +3 -0
  188. package/src/layouts/iframe/index.ts +2 -0
  189. package/src/layouts/index.ts +4 -0
  190. package/src/layouts/route-cached/cached-tab-keys.ts +13 -0
  191. package/src/layouts/route-cached/index.ts +2 -0
  192. package/src/layouts/route-cached/route-cached-page.vue +36 -0
  193. package/src/layouts/route-cached/route-cached-view.vue +97 -0
  194. package/src/layouts/widgets/breadcrumb-routes.ts +41 -0
  195. package/src/layouts/widgets/breadcrumb.vue +78 -0
  196. package/src/layouts/widgets/check-updates/check-updates.vue +136 -0
  197. package/src/layouts/widgets/check-updates/index.ts +1 -0
  198. package/src/layouts/widgets/color-toggle.vue +64 -0
  199. package/src/layouts/widgets/global-search/global-search.vue +173 -0
  200. package/src/layouts/widgets/global-search/index.ts +1 -0
  201. package/src/layouts/widgets/global-search/search-panel.vue +299 -0
  202. package/src/layouts/widgets/index.ts +12 -0
  203. package/src/layouts/widgets/language-toggle.vue +48 -0
  204. package/src/layouts/widgets/layout-toggle.vue +64 -0
  205. package/src/layouts/widgets/lock-screen/index.ts +2 -0
  206. package/src/layouts/widgets/lock-screen/lock-screen-modal.vue +110 -0
  207. package/src/layouts/widgets/lock-screen/lock-screen.vue +167 -0
  208. package/src/layouts/widgets/notification/index.ts +3 -0
  209. package/src/layouts/widgets/notification/notification.vue +210 -0
  210. package/src/layouts/widgets/notification/types.ts +19 -0
  211. package/src/layouts/widgets/preferences/blocks/block.vue +22 -0
  212. package/src/layouts/widgets/preferences/blocks/checkbox-item.vue +63 -0
  213. package/src/layouts/widgets/preferences/blocks/custom/custom.vue +121 -0
  214. package/src/layouts/widgets/preferences/blocks/draggable-list.vue +138 -0
  215. package/src/layouts/widgets/preferences/blocks/general/animation.vue +56 -0
  216. package/src/layouts/widgets/preferences/blocks/general/general.vue +94 -0
  217. package/src/layouts/widgets/preferences/blocks/index.ts +21 -0
  218. package/src/layouts/widgets/preferences/blocks/input-item.vue +71 -0
  219. package/src/layouts/widgets/preferences/blocks/layout/breadcrumb.vue +61 -0
  220. package/src/layouts/widgets/preferences/blocks/layout/content.vue +53 -0
  221. package/src/layouts/widgets/preferences/blocks/layout/copyright.vue +56 -0
  222. package/src/layouts/widgets/preferences/blocks/layout/footer.vue +17 -0
  223. package/src/layouts/widgets/preferences/blocks/layout/header.vue +78 -0
  224. package/src/layouts/widgets/preferences/blocks/layout/layout.vue +112 -0
  225. package/src/layouts/widgets/preferences/blocks/layout/navigation.vue +50 -0
  226. package/src/layouts/widgets/preferences/blocks/layout/sidebar.vue +108 -0
  227. package/src/layouts/widgets/preferences/blocks/layout/tabbar.vue +106 -0
  228. package/src/layouts/widgets/preferences/blocks/layout/widget.vue +188 -0
  229. package/src/layouts/widgets/preferences/blocks/number-field-item.vue +74 -0
  230. package/src/layouts/widgets/preferences/blocks/select-item.vue +76 -0
  231. package/src/layouts/widgets/preferences/blocks/shortcut-keys/global.vue +55 -0
  232. package/src/layouts/widgets/preferences/blocks/switch-item.vue +55 -0
  233. package/src/layouts/widgets/preferences/blocks/theme/builtin.vue +162 -0
  234. package/src/layouts/widgets/preferences/blocks/theme/color-mode.vue +26 -0
  235. package/src/layouts/widgets/preferences/blocks/theme/font-size.vue +62 -0
  236. package/src/layouts/widgets/preferences/blocks/theme/radius.vue +38 -0
  237. package/src/layouts/widgets/preferences/blocks/theme/theme.vue +114 -0
  238. package/src/layouts/widgets/preferences/blocks/toggle-item.vue +46 -0
  239. package/src/layouts/widgets/preferences/icons/content-compact.vue +119 -0
  240. package/src/layouts/widgets/preferences/icons/full-content.vue +50 -0
  241. package/src/layouts/widgets/preferences/icons/header-mixed-nav.vue +202 -0
  242. package/src/layouts/widgets/preferences/icons/header-nav.vue +119 -0
  243. package/src/layouts/widgets/preferences/icons/header-sidebar-nav.vue +177 -0
  244. package/src/layouts/widgets/preferences/icons/index.ts +12 -0
  245. package/src/layouts/widgets/preferences/icons/mixed-nav.vue +161 -0
  246. package/src/layouts/widgets/preferences/icons/setting.vue +12 -0
  247. package/src/layouts/widgets/preferences/icons/sidebar-mixed-nav.vue +173 -0
  248. package/src/layouts/widgets/preferences/icons/sidebar-nav.vue +153 -0
  249. package/src/layouts/widgets/preferences/index.ts +3 -0
  250. package/src/layouts/widgets/preferences/preferences-button.vue +31 -0
  251. package/src/layouts/widgets/preferences/preferences-drawer.vue +674 -0
  252. package/src/layouts/widgets/preferences/preferences.vue +93 -0
  253. package/src/layouts/widgets/preferences/use-open-preferences.ts +16 -0
  254. package/src/layouts/widgets/theme-toggle/index.ts +1 -0
  255. package/src/layouts/widgets/theme-toggle/theme-button.vue +164 -0
  256. package/src/layouts/widgets/theme-toggle/theme-toggle.vue +83 -0
  257. package/src/layouts/widgets/timezone/index.ts +1 -0
  258. package/src/layouts/widgets/timezone/timezone-button.vue +92 -0
  259. package/src/layouts/widgets/user-dropdown/index.ts +1 -0
  260. package/src/layouts/widgets/user-dropdown/user-dropdown.vue +578 -0
  261. package/src/main.ts +17 -0
  262. package/src/menu-ui/components/collapse-transition.vue +96 -0
  263. package/src/menu-ui/components/index.ts +4 -0
  264. package/src/menu-ui/components/menu-badge-dot.vue +28 -0
  265. package/src/menu-ui/components/menu-badge.vue +57 -0
  266. package/src/menu-ui/components/menu-item.vue +140 -0
  267. package/src/menu-ui/components/menu.vue +880 -0
  268. package/src/menu-ui/components/normal-menu/index.ts +2 -0
  269. package/src/menu-ui/components/normal-menu/normal-menu.ts +27 -0
  270. package/src/menu-ui/components/normal-menu/normal-menu.vue +162 -0
  271. package/src/menu-ui/components/sub-menu-content.vue +105 -0
  272. package/src/menu-ui/components/sub-menu.vue +276 -0
  273. package/src/menu-ui/hooks/index.ts +2 -0
  274. package/src/menu-ui/hooks/use-menu-context.ts +55 -0
  275. package/src/menu-ui/hooks/use-menu-scroll.ts +46 -0
  276. package/src/menu-ui/hooks/use-menu.ts +48 -0
  277. package/src/menu-ui/index.ts +4 -0
  278. package/src/menu-ui/menu.vue +32 -0
  279. package/src/menu-ui/sub-menu.vue +71 -0
  280. package/src/menu-ui/types.ts +154 -0
  281. package/src/menu-ui/utils/index.ts +52 -0
  282. package/src/plugins/echarts/README.md +41 -0
  283. package/src/plugins/echarts/echarts-ui.vue +15 -0
  284. package/src/plugins/echarts/echarts.ts +40 -0
  285. package/src/plugins/echarts/index.ts +4 -0
  286. package/src/plugins/echarts/types.ts +28 -0
  287. package/src/plugins/echarts/use-echarts.ts +213 -0
  288. package/src/plugins/index.ts +2 -0
  289. package/src/plugins/motion/README.md +26 -0
  290. package/src/plugins/motion/index.ts +8 -0
  291. package/src/plugins/motion/types.ts +26 -0
  292. package/src/plugins/plugins-context.ts +39 -0
  293. package/src/plugins/tiptap/extensions.ts +452 -0
  294. package/src/plugins/tiptap/index.ts +4 -0
  295. package/src/plugins/tiptap/preview.vue +34 -0
  296. package/src/plugins/tiptap/style.css +112 -0
  297. package/src/plugins/tiptap/tiptap.vue +324 -0
  298. package/src/plugins/tiptap/toolbar.ts +374 -0
  299. package/src/plugins/tiptap/types.ts +87 -0
  300. package/src/plugins/tiptap/use-tiptap-toolbar.ts +176 -0
  301. package/src/plugins/types.ts +24 -0
  302. package/src/plugins/vxe-table/README.md +50 -0
  303. package/src/plugins/vxe-table/api.ts +202 -0
  304. package/src/plugins/vxe-table/extends.ts +150 -0
  305. package/src/plugins/vxe-table/index.ts +10 -0
  306. package/src/plugins/vxe-table/init.ts +151 -0
  307. package/src/plugins/vxe-table/style.css +128 -0
  308. package/src/plugins/vxe-table/types.ts +116 -0
  309. package/src/plugins/vxe-table/use-vxe-grid.ts +86 -0
  310. package/src/plugins/vxe-table/use-vxe-grid.vue +564 -0
  311. package/src/plugins/vxe-table/viewed-row/index.ts +8 -0
  312. package/src/plugins/vxe-table/viewed-row/types.ts +84 -0
  313. package/src/plugins/vxe-table/viewed-row/use-viewed-row.ts +590 -0
  314. package/src/popup-ui/alert/AlertBuilder.ts +244 -0
  315. package/src/popup-ui/alert/alert.ts +101 -0
  316. package/src/popup-ui/alert/alert.vue +220 -0
  317. package/src/popup-ui/alert/index.ts +14 -0
  318. package/src/popup-ui/drawer/drawer-api.ts +178 -0
  319. package/src/popup-ui/drawer/drawer.ts +192 -0
  320. package/src/popup-ui/drawer/drawer.vue +359 -0
  321. package/src/popup-ui/drawer/index.ts +7 -0
  322. package/src/popup-ui/drawer/use-drawer.ts +210 -0
  323. package/src/popup-ui/index.ts +3 -0
  324. package/src/popup-ui/modal/index.ts +7 -0
  325. package/src/popup-ui/modal/modal-api.ts +191 -0
  326. package/src/popup-ui/modal/modal.ts +212 -0
  327. package/src/popup-ui/modal/modal.vue +395 -0
  328. package/src/popup-ui/modal/use-modal-draggable.ts +141 -0
  329. package/src/popup-ui/modal/use-modal.ts +222 -0
  330. package/src/shadcn-ui/assets/index.css +1 -0
  331. package/src/shadcn-ui/components/avatar/avatar.vue +76 -0
  332. package/src/shadcn-ui/components/avatar/index.ts +1 -0
  333. package/src/shadcn-ui/components/back-top/back-top.vue +43 -0
  334. package/src/shadcn-ui/components/back-top/backtop.ts +38 -0
  335. package/src/shadcn-ui/components/back-top/index.ts +1 -0
  336. package/src/shadcn-ui/components/back-top/use-backtop.ts +45 -0
  337. package/src/shadcn-ui/components/breadcrumb/breadcrumb-background.vue +111 -0
  338. package/src/shadcn-ui/components/breadcrumb/breadcrumb-view.vue +39 -0
  339. package/src/shadcn-ui/components/breadcrumb/breadcrumb.vue +98 -0
  340. package/src/shadcn-ui/components/breadcrumb/index.ts +3 -0
  341. package/src/shadcn-ui/components/breadcrumb/types.ts +17 -0
  342. package/src/shadcn-ui/components/button/button-group.vue +98 -0
  343. package/src/shadcn-ui/components/button/button.ts +55 -0
  344. package/src/shadcn-ui/components/button/button.vue +42 -0
  345. package/src/shadcn-ui/components/button/check-button-group.vue +196 -0
  346. package/src/shadcn-ui/components/button/icon-button.vue +78 -0
  347. package/src/shadcn-ui/components/button/index.ts +5 -0
  348. package/src/shadcn-ui/components/checkbox/checkbox.vue +26 -0
  349. package/src/shadcn-ui/components/checkbox/index.ts +1 -0
  350. package/src/shadcn-ui/components/collapsible/collapsible-params-item.vue +123 -0
  351. package/src/shadcn-ui/components/collapsible/collapsible-params.vue +268 -0
  352. package/src/shadcn-ui/components/collapsible/collapsible.vue +79 -0
  353. package/src/shadcn-ui/components/collapsible/index.ts +4 -0
  354. package/src/shadcn-ui/components/collapsible/type.ts +22 -0
  355. package/src/shadcn-ui/components/context-menu/context-menu.vue +128 -0
  356. package/src/shadcn-ui/components/context-menu/index.ts +3 -0
  357. package/src/shadcn-ui/components/context-menu/interface.ts +42 -0
  358. package/src/shadcn-ui/components/count-to-animator/count-to-animator.vue +128 -0
  359. package/src/shadcn-ui/components/count-to-animator/index.ts +1 -0
  360. package/src/shadcn-ui/components/descriptions/descriptions-cell.vue +129 -0
  361. package/src/shadcn-ui/components/descriptions/descriptions-item.vue +57 -0
  362. package/src/shadcn-ui/components/descriptions/descriptions-row.vue +112 -0
  363. package/src/shadcn-ui/components/descriptions/descriptions.vue +91 -0
  364. package/src/shadcn-ui/components/descriptions/index.ts +4 -0
  365. package/src/shadcn-ui/components/descriptions/types.ts +93 -0
  366. package/src/shadcn-ui/components/descriptions/use-descriptions.ts +216 -0
  367. package/src/shadcn-ui/components/dropdown-menu/dropdown-menu.vue +49 -0
  368. package/src/shadcn-ui/components/dropdown-menu/dropdown-radio-menu.vue +52 -0
  369. package/src/shadcn-ui/components/dropdown-menu/index.ts +4 -0
  370. package/src/shadcn-ui/components/dropdown-menu/interface.ts +32 -0
  371. package/src/shadcn-ui/components/expandable-arrow/expandable-arrow.vue +31 -0
  372. package/src/shadcn-ui/components/expandable-arrow/index.ts +1 -0
  373. package/src/shadcn-ui/components/full-screen/full-screen.vue +41 -0
  374. package/src/shadcn-ui/components/full-screen/index.ts +1 -0
  375. package/src/shadcn-ui/components/hover-card/hover-card.vue +55 -0
  376. package/src/shadcn-ui/components/hover-card/index.ts +2 -0
  377. package/src/shadcn-ui/components/icon/icon.vue +35 -0
  378. package/src/shadcn-ui/components/icon/index.ts +1 -0
  379. package/src/shadcn-ui/components/index.ts +26 -0
  380. package/src/shadcn-ui/components/input-password/index.ts +1 -0
  381. package/src/shadcn-ui/components/input-password/input-password.vue +57 -0
  382. package/src/shadcn-ui/components/input-password/password-strength.vue +66 -0
  383. package/src/shadcn-ui/components/logo/index.ts +1 -0
  384. package/src/shadcn-ui/components/logo/logo.vue +152 -0
  385. package/src/shadcn-ui/components/pin-input/index.ts +3 -0
  386. package/src/shadcn-ui/components/pin-input/input.vue +122 -0
  387. package/src/shadcn-ui/components/pin-input/types.ts +30 -0
  388. package/src/shadcn-ui/components/popover/index.ts +1 -0
  389. package/src/shadcn-ui/components/popover/popover.vue +60 -0
  390. package/src/shadcn-ui/components/render-content/index.ts +1 -0
  391. package/src/shadcn-ui/components/render-content/render-content.vue +59 -0
  392. package/src/shadcn-ui/components/scrollbar/index.ts +1 -0
  393. package/src/shadcn-ui/components/scrollbar/scrollbar.vue +165 -0
  394. package/src/shadcn-ui/components/segmented/index.ts +3 -0
  395. package/src/shadcn-ui/components/segmented/segmented.vue +75 -0
  396. package/src/shadcn-ui/components/segmented/tabs-indicator.vue +37 -0
  397. package/src/shadcn-ui/components/segmented/types.ts +6 -0
  398. package/src/shadcn-ui/components/select/index.ts +1 -0
  399. package/src/shadcn-ui/components/select/select.vue +57 -0
  400. package/src/shadcn-ui/components/spine-text/index.ts +1 -0
  401. package/src/shadcn-ui/components/spine-text/spine-text.vue +49 -0
  402. package/src/shadcn-ui/components/spinner/index.ts +2 -0
  403. package/src/shadcn-ui/components/spinner/loading.vue +140 -0
  404. package/src/shadcn-ui/components/spinner/spinner.vue +138 -0
  405. package/src/shadcn-ui/components/table-action/action-dropdown-item.vue +116 -0
  406. package/src/shadcn-ui/components/table-action/action-item.vue +98 -0
  407. package/src/shadcn-ui/components/table-action/index.ts +3 -0
  408. package/src/shadcn-ui/components/table-action/table-action.vue +218 -0
  409. package/src/shadcn-ui/components/table-action/types.ts +75 -0
  410. package/src/shadcn-ui/components/tooltip/help-tooltip.vue +31 -0
  411. package/src/shadcn-ui/components/tooltip/index.ts +2 -0
  412. package/src/shadcn-ui/components/tooltip/tooltip.vue +44 -0
  413. package/src/shadcn-ui/components.json +15 -0
  414. package/src/shadcn-ui/index.ts +39 -0
  415. package/src/shadcn-ui/ui/accordion/Accordion.vue +16 -0
  416. package/src/shadcn-ui/ui/accordion/AccordionContent.vue +28 -0
  417. package/src/shadcn-ui/ui/accordion/AccordionItem.vue +29 -0
  418. package/src/shadcn-ui/ui/accordion/AccordionTrigger.vue +39 -0
  419. package/src/shadcn-ui/ui/accordion/index.ts +4 -0
  420. package/src/shadcn-ui/ui/alert-dialog/AlertDialog.vue +20 -0
  421. package/src/shadcn-ui/ui/alert-dialog/AlertDialogAction.vue +13 -0
  422. package/src/shadcn-ui/ui/alert-dialog/AlertDialogCancel.vue +13 -0
  423. package/src/shadcn-ui/ui/alert-dialog/AlertDialogContent.vue +101 -0
  424. package/src/shadcn-ui/ui/alert-dialog/AlertDialogDescription.vue +28 -0
  425. package/src/shadcn-ui/ui/alert-dialog/AlertDialogFooter.vue +20 -0
  426. package/src/shadcn-ui/ui/alert-dialog/AlertDialogHeader.vue +18 -0
  427. package/src/shadcn-ui/ui/alert-dialog/AlertDialogOverlay.vue +31 -0
  428. package/src/shadcn-ui/ui/alert-dialog/AlertDialogTitle.vue +26 -0
  429. package/src/shadcn-ui/ui/alert-dialog/AlertDialogTrigger.vue +13 -0
  430. package/src/shadcn-ui/ui/alert-dialog/index.ts +9 -0
  431. package/src/shadcn-ui/ui/avatar/Avatar.vue +25 -0
  432. package/src/shadcn-ui/ui/avatar/AvatarFallback.vue +31 -0
  433. package/src/shadcn-ui/ui/avatar/AvatarImage.vue +17 -0
  434. package/src/shadcn-ui/ui/avatar/index.ts +3 -0
  435. package/src/shadcn-ui/ui/badge/Badge.vue +33 -0
  436. package/src/shadcn-ui/ui/badge/badge.ts +25 -0
  437. package/src/shadcn-ui/ui/badge/index.ts +3 -0
  438. package/src/shadcn-ui/ui/breadcrumb/Breadcrumb.vue +13 -0
  439. package/src/shadcn-ui/ui/breadcrumb/BreadcrumbEllipsis.vue +25 -0
  440. package/src/shadcn-ui/ui/breadcrumb/BreadcrumbItem.vue +18 -0
  441. package/src/shadcn-ui/ui/breadcrumb/BreadcrumbLink.vue +27 -0
  442. package/src/shadcn-ui/ui/breadcrumb/BreadcrumbList.vue +23 -0
  443. package/src/shadcn-ui/ui/breadcrumb/BreadcrumbPage.vue +21 -0
  444. package/src/shadcn-ui/ui/breadcrumb/BreadcrumbSeparator.vue +24 -0
  445. package/src/shadcn-ui/ui/breadcrumb/index.ts +7 -0
  446. package/src/shadcn-ui/ui/button/Button.vue +36 -0
  447. package/src/shadcn-ui/ui/button/button.ts +35 -0
  448. package/src/shadcn-ui/ui/button/index.ts +3 -0
  449. package/src/shadcn-ui/ui/card/Card.vue +23 -0
  450. package/src/shadcn-ui/ui/card/CardAction.vue +23 -0
  451. package/src/shadcn-ui/ui/card/CardContent.vue +15 -0
  452. package/src/shadcn-ui/ui/card/CardDescription.vue +18 -0
  453. package/src/shadcn-ui/ui/card/CardFooter.vue +18 -0
  454. package/src/shadcn-ui/ui/card/CardHeader.vue +23 -0
  455. package/src/shadcn-ui/ui/card/CardTitle.vue +18 -0
  456. package/src/shadcn-ui/ui/card/index.ts +7 -0
  457. package/src/shadcn-ui/ui/checkbox/Checkbox.vue +49 -0
  458. package/src/shadcn-ui/ui/checkbox/index.ts +1 -0
  459. package/src/shadcn-ui/ui/context-menu/ContextMenu.vue +18 -0
  460. package/src/shadcn-ui/ui/context-menu/ContextMenuCheckboxItem.vue +51 -0
  461. package/src/shadcn-ui/ui/context-menu/ContextMenuContent.vue +44 -0
  462. package/src/shadcn-ui/ui/context-menu/ContextMenuGroup.vue +13 -0
  463. package/src/shadcn-ui/ui/context-menu/ContextMenuItem.vue +45 -0
  464. package/src/shadcn-ui/ui/context-menu/ContextMenuLabel.vue +32 -0
  465. package/src/shadcn-ui/ui/context-menu/ContextMenuPortal.vue +13 -0
  466. package/src/shadcn-ui/ui/context-menu/ContextMenuRadioGroup.vue +22 -0
  467. package/src/shadcn-ui/ui/context-menu/ContextMenuRadioItem.vue +51 -0
  468. package/src/shadcn-ui/ui/context-menu/ContextMenuSeparator.vue +24 -0
  469. package/src/shadcn-ui/ui/context-menu/ContextMenuShortcut.vue +20 -0
  470. package/src/shadcn-ui/ui/context-menu/ContextMenuSub.vue +16 -0
  471. package/src/shadcn-ui/ui/context-menu/ContextMenuSubContent.vue +37 -0
  472. package/src/shadcn-ui/ui/context-menu/ContextMenuSubTrigger.vue +39 -0
  473. package/src/shadcn-ui/ui/context-menu/ContextMenuTrigger.vue +15 -0
  474. package/src/shadcn-ui/ui/context-menu/index.ts +14 -0
  475. package/src/shadcn-ui/ui/dialog/Dialog.vue +16 -0
  476. package/src/shadcn-ui/ui/dialog/DialogClose.vue +13 -0
  477. package/src/shadcn-ui/ui/dialog/DialogContent.vue +149 -0
  478. package/src/shadcn-ui/ui/dialog/DialogDescription.vue +28 -0
  479. package/src/shadcn-ui/ui/dialog/DialogFooter.vue +33 -0
  480. package/src/shadcn-ui/ui/dialog/DialogHeader.vue +18 -0
  481. package/src/shadcn-ui/ui/dialog/DialogOverlay.vue +34 -0
  482. package/src/shadcn-ui/ui/dialog/DialogScrollContent.vue +69 -0
  483. package/src/shadcn-ui/ui/dialog/DialogTitle.vue +28 -0
  484. package/src/shadcn-ui/ui/dialog/DialogTrigger.vue +13 -0
  485. package/src/shadcn-ui/ui/dialog/index.ts +10 -0
  486. package/src/shadcn-ui/ui/dialog/use-dialog-state-events.ts +84 -0
  487. package/src/shadcn-ui/ui/dropdown-menu/DropdownMenu.vue +20 -0
  488. package/src/shadcn-ui/ui/dropdown-menu/DropdownMenuCheckboxItem.vue +51 -0
  489. package/src/shadcn-ui/ui/dropdown-menu/DropdownMenuContent.vue +50 -0
  490. package/src/shadcn-ui/ui/dropdown-menu/DropdownMenuGroup.vue +13 -0
  491. package/src/shadcn-ui/ui/dropdown-menu/DropdownMenuItem.vue +44 -0
  492. package/src/shadcn-ui/ui/dropdown-menu/DropdownMenuLabel.vue +30 -0
  493. package/src/shadcn-ui/ui/dropdown-menu/DropdownMenuRadioGroup.vue +22 -0
  494. package/src/shadcn-ui/ui/dropdown-menu/DropdownMenuRadioItem.vue +52 -0
  495. package/src/shadcn-ui/ui/dropdown-menu/DropdownMenuSeparator.vue +26 -0
  496. package/src/shadcn-ui/ui/dropdown-menu/DropdownMenuShortcut.vue +20 -0
  497. package/src/shadcn-ui/ui/dropdown-menu/DropdownMenuSub.vue +20 -0
  498. package/src/shadcn-ui/ui/dropdown-menu/DropdownMenuSubContent.vue +37 -0
  499. package/src/shadcn-ui/ui/dropdown-menu/DropdownMenuSubTrigger.vue +38 -0
  500. package/src/shadcn-ui/ui/dropdown-menu/DropdownMenuTrigger.vue +18 -0
  501. package/src/shadcn-ui/ui/dropdown-menu/index.ts +16 -0
  502. package/src/shadcn-ui/ui/form/FormControl.vue +20 -0
  503. package/src/shadcn-ui/ui/form/FormDescription.vue +23 -0
  504. package/src/shadcn-ui/ui/form/FormField.vue +35 -0
  505. package/src/shadcn-ui/ui/form/FormItem.vue +24 -0
  506. package/src/shadcn-ui/ui/form/FormLabel.vue +25 -0
  507. package/src/shadcn-ui/ui/form/FormMessage.vue +24 -0
  508. package/src/shadcn-ui/ui/form/index.ts +10 -0
  509. package/src/shadcn-ui/ui/form/injectionKeys.ts +16 -0
  510. package/src/shadcn-ui/ui/form/useFormField.ts +35 -0
  511. package/src/shadcn-ui/ui/hover-card/HoverCard.vue +16 -0
  512. package/src/shadcn-ui/ui/hover-card/HoverCardContent.vue +42 -0
  513. package/src/shadcn-ui/ui/hover-card/HoverCardTrigger.vue +13 -0
  514. package/src/shadcn-ui/ui/hover-card/index.ts +3 -0
  515. package/src/shadcn-ui/ui/index.ts +32 -0
  516. package/src/shadcn-ui/ui/input/Input.vue +54 -0
  517. package/src/shadcn-ui/ui/input/index.ts +1 -0
  518. package/src/shadcn-ui/ui/label/Label.vue +29 -0
  519. package/src/shadcn-ui/ui/label/index.ts +1 -0
  520. package/src/shadcn-ui/ui/number-field/NumberField.vue +29 -0
  521. package/src/shadcn-ui/ui/number-field/NumberFieldContent.vue +22 -0
  522. package/src/shadcn-ui/ui/number-field/NumberFieldDecrement.vue +36 -0
  523. package/src/shadcn-ui/ui/number-field/NumberFieldIncrement.vue +36 -0
  524. package/src/shadcn-ui/ui/number-field/NumberFieldInput.vue +23 -0
  525. package/src/shadcn-ui/ui/number-field/index.ts +5 -0
  526. package/src/shadcn-ui/ui/pagination/Pagination.vue +31 -0
  527. package/src/shadcn-ui/ui/pagination/PaginationContent.vue +27 -0
  528. package/src/shadcn-ui/ui/pagination/PaginationEllipsis.vue +29 -0
  529. package/src/shadcn-ui/ui/pagination/PaginationFirst.vue +50 -0
  530. package/src/shadcn-ui/ui/pagination/PaginationItem.vue +47 -0
  531. package/src/shadcn-ui/ui/pagination/PaginationLast.vue +50 -0
  532. package/src/shadcn-ui/ui/pagination/PaginationNext.vue +50 -0
  533. package/src/shadcn-ui/ui/pagination/PaginationPrevious.vue +50 -0
  534. package/src/shadcn-ui/ui/pagination/index.ts +8 -0
  535. package/src/shadcn-ui/ui/pin-input/PinInput.vue +38 -0
  536. package/src/shadcn-ui/ui/pin-input/PinInputGroup.vue +26 -0
  537. package/src/shadcn-ui/ui/pin-input/PinInputSeparator.vue +17 -0
  538. package/src/shadcn-ui/ui/pin-input/PinInputSlot.vue +31 -0
  539. package/src/shadcn-ui/ui/pin-input/index.ts +4 -0
  540. package/src/shadcn-ui/ui/popover/Popover.vue +16 -0
  541. package/src/shadcn-ui/ui/popover/PopoverAnchor.vue +13 -0
  542. package/src/shadcn-ui/ui/popover/PopoverContent.vue +44 -0
  543. package/src/shadcn-ui/ui/popover/PopoverTrigger.vue +13 -0
  544. package/src/shadcn-ui/ui/popover/index.ts +4 -0
  545. package/src/shadcn-ui/ui/progress/Progress.vue +58 -0
  546. package/src/shadcn-ui/ui/progress/index.ts +1 -0
  547. package/src/shadcn-ui/ui/radio-group/RadioGroup.vue +30 -0
  548. package/src/shadcn-ui/ui/radio-group/RadioGroupItem.vue +43 -0
  549. package/src/shadcn-ui/ui/radio-group/index.ts +2 -0
  550. package/src/shadcn-ui/ui/resizable/ResizableHandle.vue +48 -0
  551. package/src/shadcn-ui/ui/resizable/ResizablePanel.vue +32 -0
  552. package/src/shadcn-ui/ui/resizable/ResizablePanelGroup.vue +32 -0
  553. package/src/shadcn-ui/ui/resizable/index.ts +3 -0
  554. package/src/shadcn-ui/ui/scroll-area/ScrollArea.vue +40 -0
  555. package/src/shadcn-ui/ui/scroll-area/ScrollBar.vue +41 -0
  556. package/src/shadcn-ui/ui/scroll-area/index.ts +2 -0
  557. package/src/shadcn-ui/ui/select/Select.vue +16 -0
  558. package/src/shadcn-ui/ui/select/SelectContent.vue +65 -0
  559. package/src/shadcn-ui/ui/select/SelectGroup.vue +13 -0
  560. package/src/shadcn-ui/ui/select/SelectItem.vue +49 -0
  561. package/src/shadcn-ui/ui/select/SelectItemText.vue +13 -0
  562. package/src/shadcn-ui/ui/select/SelectLabel.vue +22 -0
  563. package/src/shadcn-ui/ui/select/SelectScrollDownButton.vue +33 -0
  564. package/src/shadcn-ui/ui/select/SelectScrollUpButton.vue +33 -0
  565. package/src/shadcn-ui/ui/select/SelectSeparator.vue +24 -0
  566. package/src/shadcn-ui/ui/select/SelectTrigger.vue +43 -0
  567. package/src/shadcn-ui/ui/select/SelectValue.vue +13 -0
  568. package/src/shadcn-ui/ui/select/index.ts +11 -0
  569. package/src/shadcn-ui/ui/separator/Separator.vue +33 -0
  570. package/src/shadcn-ui/ui/separator/index.ts +1 -0
  571. package/src/shadcn-ui/ui/sheet/Sheet.vue +16 -0
  572. package/src/shadcn-ui/ui/sheet/SheetClose.vue +13 -0
  573. package/src/shadcn-ui/ui/sheet/SheetContent.vue +110 -0
  574. package/src/shadcn-ui/ui/sheet/SheetDescription.vue +26 -0
  575. package/src/shadcn-ui/ui/sheet/SheetFooter.vue +16 -0
  576. package/src/shadcn-ui/ui/sheet/SheetHeader.vue +16 -0
  577. package/src/shadcn-ui/ui/sheet/SheetOverlay.vue +11 -0
  578. package/src/shadcn-ui/ui/sheet/SheetTitle.vue +26 -0
  579. package/src/shadcn-ui/ui/sheet/SheetTrigger.vue +13 -0
  580. package/src/shadcn-ui/ui/sheet/index.ts +10 -0
  581. package/src/shadcn-ui/ui/sheet/sheet.ts +24 -0
  582. package/src/shadcn-ui/ui/switch/Switch.vue +45 -0
  583. package/src/shadcn-ui/ui/switch/index.ts +1 -0
  584. package/src/shadcn-ui/ui/tabs/Tabs.vue +29 -0
  585. package/src/shadcn-ui/ui/tabs/TabsContent.vue +26 -0
  586. package/src/shadcn-ui/ui/tabs/TabsList.vue +31 -0
  587. package/src/shadcn-ui/ui/tabs/TabsTrigger.vue +33 -0
  588. package/src/shadcn-ui/ui/tabs/index.ts +5 -0
  589. package/src/shadcn-ui/ui/textarea/Textarea.vue +35 -0
  590. package/src/shadcn-ui/ui/textarea/index.ts +1 -0
  591. package/src/shadcn-ui/ui/toggle/Toggle.vue +45 -0
  592. package/src/shadcn-ui/ui/toggle/index.ts +2 -0
  593. package/src/shadcn-ui/ui/toggle/toggle.ts +27 -0
  594. package/src/shadcn-ui/ui/toggle-group/ToggleGroup.vue +64 -0
  595. package/src/shadcn-ui/ui/toggle-group/ToggleGroupItem.vue +56 -0
  596. package/src/shadcn-ui/ui/toggle-group/index.ts +2 -0
  597. package/src/shadcn-ui/ui/tooltip/Tooltip.vue +16 -0
  598. package/src/shadcn-ui/ui/tooltip/TooltipContent.vue +55 -0
  599. package/src/shadcn-ui/ui/tooltip/TooltipProvider.vue +13 -0
  600. package/src/shadcn-ui/ui/tooltip/TooltipTrigger.vue +13 -0
  601. package/src/shadcn-ui/ui/tooltip/index.ts +4 -0
  602. package/src/shadcn-ui/ui/tree/index.ts +4 -0
  603. package/src/shadcn-ui/ui/tree/tree.vue +689 -0
  604. package/src/shadcn-ui/ui/tree/types.ts +70 -0
  605. package/src/styles/index.css +9 -0
  606. package/src/tabs-ui/components/index.ts +2 -0
  607. package/src/tabs-ui/components/tabs/tabs.vue +150 -0
  608. package/src/tabs-ui/components/tabs-chrome/tabs.vue +211 -0
  609. package/src/tabs-ui/components/widgets/index.ts +3 -0
  610. package/src/tabs-ui/components/widgets/tool-more.vue +18 -0
  611. package/src/tabs-ui/components/widgets/tool-refresh.vue +18 -0
  612. package/src/tabs-ui/components/widgets/tool-screen.vue +19 -0
  613. package/src/tabs-ui/index.ts +3 -0
  614. package/src/tabs-ui/tabs-view.vue +106 -0
  615. package/src/tabs-ui/types.ts +73 -0
  616. package/src/tabs-ui/use-tabs-drag.ts +129 -0
  617. package/src/tabs-ui/use-tabs-view-scroll.ts +202 -0
  618. package/src/types/shims.d.ts +2 -0
@@ -0,0 +1,1269 @@
1
+ <script lang="ts" setup>
2
+ /**
3
+ * This components is refactored from vue-drag-resize: https://github.com/kirillmurashov/vue-drag-resize
4
+ */
5
+
6
+ import {
7
+ computed,
8
+ getCurrentInstance,
9
+ nextTick,
10
+ onBeforeUnmount,
11
+ onMounted,
12
+ ref,
13
+ toRefs,
14
+ watch,
15
+ } from 'vue';
16
+
17
+ const props = defineProps({
18
+ stickSize: {
19
+ type: Number,
20
+ default: 8,
21
+ },
22
+ parentScaleX: {
23
+ type: Number,
24
+ default: 1,
25
+ },
26
+ parentScaleY: {
27
+ type: Number,
28
+ default: 1,
29
+ },
30
+ isActive: {
31
+ type: Boolean,
32
+ default: false,
33
+ },
34
+ preventActiveBehavior: {
35
+ type: Boolean,
36
+ default: false,
37
+ },
38
+ isDraggable: {
39
+ type: Boolean,
40
+ default: true,
41
+ },
42
+ isResizable: {
43
+ type: Boolean,
44
+ default: true,
45
+ },
46
+ aspectRatio: {
47
+ type: Boolean,
48
+ default: false,
49
+ },
50
+ parentLimitation: {
51
+ type: Boolean,
52
+ default: false,
53
+ },
54
+ snapToGrid: {
55
+ type: Boolean,
56
+ default: false,
57
+ },
58
+ gridX: {
59
+ type: Number,
60
+ default: 50,
61
+ validator(val: number) {
62
+ return val >= 0;
63
+ },
64
+ },
65
+ gridY: {
66
+ type: Number,
67
+ default: 50,
68
+ validator(val: number) {
69
+ return val >= 0;
70
+ },
71
+ },
72
+ parentW: {
73
+ type: Number,
74
+ default: 0,
75
+ validator(val: number) {
76
+ return val >= 0;
77
+ },
78
+ },
79
+ parentH: {
80
+ type: Number,
81
+ default: 0,
82
+ validator(val: number) {
83
+ return val >= 0;
84
+ },
85
+ },
86
+ w: {
87
+ type: [String, Number],
88
+ default: 200,
89
+ validator(val: number) {
90
+ return typeof val === 'string' ? val === 'auto' : val >= 0;
91
+ },
92
+ },
93
+ h: {
94
+ type: [String, Number],
95
+ default: 200,
96
+ validator(val: number) {
97
+ return typeof val === 'string' ? val === 'auto' : val >= 0;
98
+ },
99
+ },
100
+ minw: {
101
+ type: Number,
102
+ default: 50,
103
+ validator(val: number) {
104
+ return val >= 0;
105
+ },
106
+ },
107
+ minh: {
108
+ type: Number,
109
+ default: 50,
110
+ validator(val: number) {
111
+ return val >= 0;
112
+ },
113
+ },
114
+ x: {
115
+ type: Number,
116
+ default: 0,
117
+ validator(val: number) {
118
+ return typeof val === 'number';
119
+ },
120
+ },
121
+ y: {
122
+ type: Number,
123
+ default: 0,
124
+ validator(val: number) {
125
+ return typeof val === 'number';
126
+ },
127
+ },
128
+ z: {
129
+ type: [String, Number],
130
+ default: 'auto',
131
+ validator(val: number) {
132
+ return typeof val === 'string' ? val === 'auto' : val >= 0;
133
+ },
134
+ },
135
+ dragHandle: {
136
+ type: String,
137
+ default: null,
138
+ },
139
+ dragCancel: {
140
+ type: String,
141
+ default: null,
142
+ },
143
+ sticks: {
144
+ type: Array<'bl' | 'bm' | 'br' | 'ml' | 'mr' | 'tl' | 'tm' | 'tr'>,
145
+ default() {
146
+ return ['tl', 'tm', 'tr', 'mr', 'br', 'bm', 'bl', 'ml'];
147
+ },
148
+ },
149
+ axis: {
150
+ type: String,
151
+ default: 'both',
152
+ validator(val: string) {
153
+ return ['both', 'none', 'x', 'y'].includes(val);
154
+ },
155
+ },
156
+ contentClass: {
157
+ type: String,
158
+ required: false,
159
+ default: '',
160
+ },
161
+ });
162
+
163
+ const emit = defineEmits([
164
+ 'clicked',
165
+ 'dragging',
166
+ 'dragstop',
167
+ 'resizing',
168
+ 'resizestop',
169
+ 'activated',
170
+ 'deactivated',
171
+ ]);
172
+
173
+ const styleMapping = {
174
+ y: {
175
+ t: 'top',
176
+ m: 'marginTop',
177
+ b: 'bottom',
178
+ },
179
+ x: {
180
+ l: 'left',
181
+ m: 'marginLeft',
182
+ r: 'right',
183
+ },
184
+ };
185
+
186
+ function addEvents(events: Map<string, (...args: any[]) => void>) {
187
+ events.forEach((cb, eventName) => {
188
+ document.documentElement.addEventListener(eventName, cb);
189
+ });
190
+ }
191
+
192
+ function removeEvents(events: Map<string, (...args: any[]) => void>) {
193
+ events.forEach((cb, eventName) => {
194
+ document.documentElement.removeEventListener(eventName, cb);
195
+ });
196
+ }
197
+
198
+ const {
199
+ stickSize,
200
+ parentScaleX,
201
+ parentScaleY,
202
+ isActive,
203
+ preventActiveBehavior,
204
+ isDraggable,
205
+ isResizable,
206
+ aspectRatio,
207
+ parentLimitation,
208
+ snapToGrid,
209
+ gridX,
210
+ gridY,
211
+ parentW,
212
+ parentH,
213
+ w,
214
+ h,
215
+ minw,
216
+ minh,
217
+ x,
218
+ y,
219
+ z,
220
+ dragHandle,
221
+ dragCancel,
222
+ sticks,
223
+ axis,
224
+ contentClass,
225
+ } = toRefs(props);
226
+
227
+ // states
228
+ const active = ref(false);
229
+ const zIndex = ref<null | number>(null);
230
+ const parentWidth = ref<null | number>(null);
231
+ const parentHeight = ref<null | number>(null);
232
+ const left = ref<null | number>(null);
233
+ const top = ref<null | number>(null);
234
+ const right = ref<null | number>(null);
235
+ const bottom = ref<null | number>(null);
236
+
237
+ const aspectFactor = ref<null | number>(null);
238
+
239
+ // state end
240
+
241
+ const stickDrag = ref(false);
242
+ const bodyDrag = ref(false);
243
+ const dimensionsBeforeMove = ref({
244
+ pointerX: 0,
245
+ pointerY: 0,
246
+ x: 0,
247
+ y: 0,
248
+ w: 0,
249
+ h: 0,
250
+ top: 0,
251
+ right: 0,
252
+ bottom: 0,
253
+ left: 0,
254
+ width: 0,
255
+ height: 0,
256
+ });
257
+ const limits = ref({
258
+ left: { min: null as null | number, max: null as null | number },
259
+ right: { min: null as null | number, max: null as null | number },
260
+ top: { min: null as null | number, max: null as null | number },
261
+ bottom: { min: null as null | number, max: null as null | number },
262
+ });
263
+ const currentStick = ref<null | string>(null);
264
+
265
+ const parentElement = ref<HTMLElement | null>(null);
266
+
267
+ function getPointerPosition(
268
+ ev: Partial<{
269
+ pageX: number;
270
+ pageY: number;
271
+ touches: ArrayLike<{ pageX: number; pageY: number }>;
272
+ }>,
273
+ ): null | { pointerX: number; pointerY: number } {
274
+ const touch = ev.touches?.[0];
275
+ const pointerX = ev.pageX ?? touch?.pageX;
276
+ const pointerY = ev.pageY ?? touch?.pageY;
277
+
278
+ if (
279
+ pointerX === null ||
280
+ pointerX === undefined ||
281
+ pointerY === null ||
282
+ pointerY === undefined
283
+ ) {
284
+ return null;
285
+ }
286
+
287
+ return { pointerX, pointerY };
288
+ }
289
+
290
+ const width = computed(() => {
291
+ const currentParentWidth = parentWidth.value;
292
+ const currentLeft = left.value;
293
+ const currentRight = right.value;
294
+
295
+ if (
296
+ currentParentWidth === null ||
297
+ currentLeft === null ||
298
+ currentRight === null
299
+ ) {
300
+ return 0;
301
+ }
302
+
303
+ return currentParentWidth - currentLeft - currentRight;
304
+ });
305
+
306
+ const height = computed(() => {
307
+ const currentParentHeight = parentHeight.value;
308
+ const currentTop = top.value;
309
+ const currentBottom = bottom.value;
310
+
311
+ if (
312
+ currentParentHeight === null ||
313
+ currentTop === null ||
314
+ currentBottom === null
315
+ ) {
316
+ return 0;
317
+ }
318
+
319
+ return currentParentHeight - currentTop - currentBottom;
320
+ });
321
+
322
+ const rect = computed(() => ({
323
+ left: Math.round(left.value ?? 0),
324
+ top: Math.round(top.value ?? 0),
325
+ width: Math.round(width.value),
326
+ height: Math.round(height.value),
327
+ }));
328
+
329
+ const saveDimensionsBeforeMove = ({
330
+ pointerX,
331
+ pointerY,
332
+ }: {
333
+ pointerX: number;
334
+ pointerY: number;
335
+ }) => {
336
+ dimensionsBeforeMove.value.pointerX = pointerX;
337
+ dimensionsBeforeMove.value.pointerY = pointerY;
338
+
339
+ dimensionsBeforeMove.value.left = left.value as number;
340
+ dimensionsBeforeMove.value.right = right.value as number;
341
+ dimensionsBeforeMove.value.top = top.value as number;
342
+ dimensionsBeforeMove.value.bottom = bottom.value as number;
343
+
344
+ dimensionsBeforeMove.value.width = width.value as number;
345
+ dimensionsBeforeMove.value.height = height.value as number;
346
+
347
+ aspectFactor.value = width.value / height.value;
348
+ };
349
+
350
+ const sideCorrectionByLimit = (
351
+ limit: { max: number; min: number },
352
+ current: number,
353
+ ) => {
354
+ let value = current;
355
+
356
+ if (limit.min !== null && current < limit.min) {
357
+ value = limit.min;
358
+ } else if (limit.max !== null && limit.max < current) {
359
+ value = limit.max;
360
+ }
361
+
362
+ return value;
363
+ };
364
+
365
+ const rectCorrectionByLimit = (rect: {
366
+ newBottom: number;
367
+ newLeft: number;
368
+ newRight: number;
369
+ newTop: number;
370
+ }) => {
371
+ // const { limits } = this;
372
+ let { newRight, newLeft, newBottom, newTop } = rect;
373
+
374
+ type RectRange = {
375
+ max: number;
376
+ min: number;
377
+ };
378
+
379
+ newLeft = sideCorrectionByLimit(limits.value.left as RectRange, newLeft);
380
+ newRight = sideCorrectionByLimit(limits.value.right as RectRange, newRight);
381
+ newTop = sideCorrectionByLimit(limits.value.top as RectRange, newTop);
382
+ newBottom = sideCorrectionByLimit(
383
+ limits.value.bottom as RectRange,
384
+ newBottom,
385
+ );
386
+
387
+ return {
388
+ newLeft,
389
+ newRight,
390
+ newTop,
391
+ newBottom,
392
+ };
393
+ };
394
+
395
+ const rectCorrectionByAspectRatio = (rect: {
396
+ newBottom: number;
397
+ newLeft: number;
398
+ newRight: number;
399
+ newTop: number;
400
+ }) => {
401
+ let { newLeft, newRight, newTop, newBottom } = rect;
402
+ const currentParentWidth = parentWidth.value;
403
+ const currentParentHeight = parentHeight.value;
404
+ const stick = currentStick.value;
405
+ const factor = aspectFactor.value;
406
+
407
+ if (
408
+ currentParentWidth === null ||
409
+ currentParentHeight === null ||
410
+ !stick ||
411
+ factor === null
412
+ ) {
413
+ return { newLeft, newRight, newTop, newBottom };
414
+ }
415
+
416
+ let newWidth = currentParentWidth - newLeft - newRight;
417
+ let newHeight = currentParentHeight - newTop - newBottom;
418
+
419
+ if (stick[1] === 'm') {
420
+ const deltaHeight = newHeight - dimensionsBeforeMove.value.height;
421
+
422
+ newLeft -= (deltaHeight * factor) / 2;
423
+ newRight -= (deltaHeight * factor) / 2;
424
+ } else if (stick[0] === 'm') {
425
+ const deltaWidth = newWidth - dimensionsBeforeMove.value.width;
426
+
427
+ newTop -= deltaWidth / factor / 2;
428
+ newBottom -= deltaWidth / factor / 2;
429
+ } else if (newWidth / newHeight > factor) {
430
+ newWidth = factor * newHeight;
431
+
432
+ if (stick[1] === 'l') {
433
+ newLeft = currentParentWidth - newRight - newWidth;
434
+ } else {
435
+ newRight = currentParentWidth - newLeft - newWidth;
436
+ }
437
+ } else {
438
+ newHeight = newWidth / factor;
439
+
440
+ if (stick[0] === 't') {
441
+ newTop = currentParentHeight - newBottom - newHeight;
442
+ } else {
443
+ newBottom = currentParentHeight - newTop - newHeight;
444
+ }
445
+ }
446
+
447
+ return { newLeft, newRight, newTop, newBottom };
448
+ };
449
+
450
+ const stickMove = (delta: { x: number; y: number }) => {
451
+ const stick = currentStick.value;
452
+
453
+ if (!stick) {
454
+ return;
455
+ }
456
+
457
+ let newTop = dimensionsBeforeMove.value.top;
458
+ let newBottom = dimensionsBeforeMove.value.bottom;
459
+ let newLeft = dimensionsBeforeMove.value.left;
460
+ let newRight = dimensionsBeforeMove.value.right;
461
+ switch (stick[0]) {
462
+ case 'b': {
463
+ newBottom = dimensionsBeforeMove.value.bottom + delta.y;
464
+
465
+ if (snapToGrid.value) {
466
+ newBottom =
467
+ (parentHeight.value as number) -
468
+ Math.round(
469
+ ((parentHeight.value as number) - newBottom) / gridY.value,
470
+ ) *
471
+ gridY.value;
472
+ }
473
+
474
+ break;
475
+ }
476
+
477
+ case 't': {
478
+ newTop = dimensionsBeforeMove.value.top - delta.y;
479
+
480
+ if (snapToGrid.value) {
481
+ newTop = Math.round(newTop / gridY.value) * gridY.value;
482
+ }
483
+
484
+ break;
485
+ }
486
+ default: {
487
+ break;
488
+ }
489
+ }
490
+
491
+ switch (stick[1]) {
492
+ case 'l': {
493
+ newLeft = dimensionsBeforeMove.value.left - delta.x;
494
+
495
+ if (snapToGrid.value) {
496
+ newLeft = Math.round(newLeft / gridX.value) * gridX.value;
497
+ }
498
+
499
+ break;
500
+ }
501
+
502
+ case 'r': {
503
+ newRight = dimensionsBeforeMove.value.right + delta.x;
504
+
505
+ if (snapToGrid.value) {
506
+ newRight =
507
+ (parentWidth.value as number) -
508
+ Math.round(((parentWidth.value as number) - newRight) / gridX.value) *
509
+ gridX.value;
510
+ }
511
+
512
+ break;
513
+ }
514
+ default: {
515
+ break;
516
+ }
517
+ }
518
+
519
+ ({ newLeft, newRight, newTop, newBottom } = rectCorrectionByLimit({
520
+ newLeft,
521
+ newRight,
522
+ newTop,
523
+ newBottom,
524
+ }));
525
+
526
+ if (aspectRatio.value) {
527
+ ({ newLeft, newRight, newTop, newBottom } = rectCorrectionByAspectRatio({
528
+ newLeft,
529
+ newRight,
530
+ newTop,
531
+ newBottom,
532
+ }));
533
+ }
534
+
535
+ left.value = newLeft;
536
+ right.value = newRight;
537
+ top.value = newTop;
538
+ bottom.value = newBottom;
539
+
540
+ emit('resizing', rect.value);
541
+ };
542
+
543
+ const stickUp = () => {
544
+ stickDrag.value = false;
545
+ // dimensionsBeforeMove.value = {
546
+ // pointerX: 0,
547
+ // pointerY: 0,
548
+ // x: 0,
549
+ // y: 0,
550
+ // w: 0,
551
+ // h: 0,
552
+ // };
553
+
554
+ Object.assign(dimensionsBeforeMove.value, {
555
+ pointerX: 0,
556
+ pointerY: 0,
557
+ x: 0,
558
+ y: 0,
559
+ w: 0,
560
+ h: 0,
561
+ });
562
+
563
+ limits.value = {
564
+ left: { min: null, max: null },
565
+ right: { min: null, max: null },
566
+ top: { min: null, max: null },
567
+ bottom: { min: null, max: null },
568
+ };
569
+
570
+ emit('resizing', rect.value);
571
+ emit('resizestop', rect.value);
572
+ };
573
+
574
+ const calcDragLimitation = () => {
575
+ return {
576
+ left: { min: 0, max: (parentWidth.value as number) - width.value },
577
+ right: { min: 0, max: (parentWidth.value as number) - width.value },
578
+ top: { min: 0, max: (parentHeight.value as number) - height.value },
579
+ bottom: { min: 0, max: (parentHeight.value as number) - height.value },
580
+ };
581
+ };
582
+
583
+ const calcResizeLimits = () => {
584
+ const parentLim = parentLimitation.value ? 0 : null;
585
+ const currentAspectFactor = aspectFactor.value;
586
+ const currentLeft = left.value;
587
+ const currentRight = right.value;
588
+ const currentTop = top.value;
589
+ const currentBottom = bottom.value;
590
+ const stick = currentStick.value;
591
+
592
+ if (
593
+ currentLeft === null ||
594
+ currentRight === null ||
595
+ currentTop === null ||
596
+ currentBottom === null
597
+ ) {
598
+ return {
599
+ left: { min: parentLim, max: parentLim },
600
+ right: { min: parentLim, max: parentLim },
601
+ top: { min: parentLim, max: parentLim },
602
+ bottom: { min: parentLim, max: parentLim },
603
+ };
604
+ }
605
+
606
+ let minWidth = minw.value;
607
+ let minHeight = minh.value;
608
+
609
+ if (aspectRatio.value && currentAspectFactor) {
610
+ if (minWidth / minHeight > currentAspectFactor) {
611
+ minHeight = minWidth / currentAspectFactor;
612
+ } else {
613
+ minWidth = currentAspectFactor * minHeight;
614
+ }
615
+ }
616
+
617
+ const limits = {
618
+ left: {
619
+ min: parentLim,
620
+ max: currentLeft + (width.value - minWidth),
621
+ },
622
+ right: {
623
+ min: parentLim,
624
+ max: currentRight + (width.value - minWidth),
625
+ },
626
+ top: {
627
+ min: parentLim,
628
+ max: currentTop + (height.value - minHeight),
629
+ },
630
+ bottom: {
631
+ min: parentLim,
632
+ max: currentBottom + (height.value - minHeight),
633
+ },
634
+ };
635
+
636
+ if (aspectRatio.value && currentAspectFactor) {
637
+ const aspectLimits = {
638
+ left: {
639
+ min:
640
+ currentLeft -
641
+ Math.min(currentTop, currentBottom) * currentAspectFactor * 2,
642
+ max:
643
+ currentLeft +
644
+ ((height.value - minHeight) / 2) * currentAspectFactor * 2,
645
+ },
646
+ right: {
647
+ min:
648
+ currentRight -
649
+ Math.min(currentTop, currentBottom) * currentAspectFactor * 2,
650
+ max:
651
+ currentRight +
652
+ ((height.value - minHeight) / 2) * currentAspectFactor * 2,
653
+ },
654
+ top: {
655
+ min:
656
+ currentTop -
657
+ (Math.min(currentLeft, currentRight) / currentAspectFactor) * 2,
658
+ max:
659
+ currentTop + ((width.value - minWidth) / 2 / currentAspectFactor) * 2,
660
+ },
661
+ bottom: {
662
+ min:
663
+ currentBottom -
664
+ (Math.min(currentLeft, currentRight) / currentAspectFactor) * 2,
665
+ max:
666
+ currentBottom +
667
+ ((width.value - minWidth) / 2 / currentAspectFactor) * 2,
668
+ },
669
+ };
670
+
671
+ if (stick?.[0] === 'm') {
672
+ limits.left = {
673
+ min: Math.max(
674
+ limits.left.min ?? aspectLimits.left.min,
675
+ aspectLimits.left.min,
676
+ ),
677
+ max: Math.min(limits.left.max, aspectLimits.left.max),
678
+ };
679
+ limits.right = {
680
+ min: Math.max(
681
+ limits.right.min ?? aspectLimits.right.min,
682
+ aspectLimits.right.min,
683
+ ),
684
+ max: Math.min(limits.right.max, aspectLimits.right.max),
685
+ };
686
+ } else if (stick?.[1] === 'm') {
687
+ limits.top = {
688
+ min: Math.max(
689
+ limits.top.min ?? aspectLimits.top.min,
690
+ aspectLimits.top.min,
691
+ ),
692
+ max: Math.min(limits.top.max, aspectLimits.top.max),
693
+ };
694
+ limits.bottom = {
695
+ min: Math.max(
696
+ limits.bottom.min ?? aspectLimits.bottom.min,
697
+ aspectLimits.bottom.min,
698
+ ),
699
+ max: Math.min(limits.bottom.max, aspectLimits.bottom.max),
700
+ };
701
+ }
702
+ }
703
+
704
+ return limits;
705
+ };
706
+
707
+ const positionStyle = computed(() => ({
708
+ top: `${top.value ?? 0}px`,
709
+ left: `${left.value ?? 0}px`,
710
+ zIndex: zIndex.value ?? 'auto',
711
+ }));
712
+
713
+ const sizeStyle = computed(() => ({
714
+ width: w.value === 'auto' ? 'auto' : `${width.value}px`,
715
+ height: h.value === 'auto' ? 'auto' : `${height.value}px`,
716
+ }));
717
+
718
+ const stickStyles = computed(() => (stick: string) => {
719
+ const stickStyle = {
720
+ width: `${stickSize.value / parentScaleX.value}px`,
721
+ height: `${stickSize.value / parentScaleY.value}px`,
722
+ [styleMapping.y[stick[0] as 'b' | 'm' | 't'] as 'height' | 'width']:
723
+ `${stickSize.value / parentScaleX.value / -2}px`,
724
+ [styleMapping.x[stick[1] as 'l' | 'm' | 'r'] as 'height' | 'width']:
725
+ `${stickSize.value / parentScaleX.value / -2}px`,
726
+ };
727
+ return stickStyle;
728
+ });
729
+
730
+ const bodyMove = (delta: { x: number; y: number }) => {
731
+ let newTop = dimensionsBeforeMove.value.top - delta.y;
732
+ let newBottom = dimensionsBeforeMove.value.bottom + delta.y;
733
+ let newLeft = dimensionsBeforeMove.value.left - delta.x;
734
+ let newRight = dimensionsBeforeMove.value.right + delta.x;
735
+
736
+ if (snapToGrid.value) {
737
+ let alignTop = true;
738
+ let alignLeft = true;
739
+
740
+ let diffT = newTop - Math.floor(newTop / gridY.value) * gridY.value;
741
+ let diffB =
742
+ (parentHeight.value as number) -
743
+ newBottom -
744
+ Math.floor(((parentHeight.value as number) - newBottom) / gridY.value) *
745
+ gridY.value;
746
+ let diffL = newLeft - Math.floor(newLeft / gridX.value) * gridX.value;
747
+ let diffR =
748
+ (parentWidth.value as number) -
749
+ newRight -
750
+ Math.floor(((parentWidth.value as number) - newRight) / gridX.value) *
751
+ gridX.value;
752
+
753
+ if (diffT > gridY.value / 2) {
754
+ diffT -= gridY.value;
755
+ }
756
+ if (diffB > gridY.value / 2) {
757
+ diffB -= gridY.value;
758
+ }
759
+ if (diffL > gridX.value / 2) {
760
+ diffL -= gridX.value;
761
+ }
762
+ if (diffR > gridX.value / 2) {
763
+ diffR -= gridX.value;
764
+ }
765
+
766
+ if (Math.abs(diffB) < Math.abs(diffT)) {
767
+ alignTop = false;
768
+ }
769
+ if (Math.abs(diffR) < Math.abs(diffL)) {
770
+ alignLeft = false;
771
+ }
772
+
773
+ newTop -= alignTop ? diffT : diffB;
774
+ newBottom = (parentHeight.value as number) - height.value - newTop;
775
+ newLeft -= alignLeft ? diffL : diffR;
776
+ newRight = (parentWidth.value as number) - width.value - newLeft;
777
+ }
778
+
779
+ ({
780
+ newLeft: left.value,
781
+ newRight: right.value,
782
+ newTop: top.value,
783
+ newBottom: bottom.value,
784
+ } = rectCorrectionByLimit({ newLeft, newRight, newTop, newBottom }));
785
+
786
+ emit('dragging', rect.value);
787
+ };
788
+
789
+ const bodyUp = () => {
790
+ bodyDrag.value = false;
791
+ emit('dragging', rect.value);
792
+ emit('dragstop', rect.value);
793
+
794
+ // dimensionsBeforeMove.value = { pointerX: 0, pointerY: 0, x: 0, y: 0, w: 0, h: 0 };
795
+ Object.assign(dimensionsBeforeMove.value, {
796
+ pointerX: 0,
797
+ pointerY: 0,
798
+ x: 0,
799
+ y: 0,
800
+ w: 0,
801
+ h: 0,
802
+ });
803
+
804
+ limits.value = {
805
+ left: { min: null, max: null },
806
+ right: { min: null, max: null },
807
+ top: { min: null, max: null },
808
+ bottom: { min: null, max: null },
809
+ };
810
+ };
811
+
812
+ const stickDown = (
813
+ stick: string,
814
+ ev: { pageX: any; pageY: any; touches?: any },
815
+ force = false,
816
+ ) => {
817
+ if ((!isResizable.value || !active.value) && !force) {
818
+ return;
819
+ }
820
+
821
+ const pointerPosition = getPointerPosition(ev);
822
+
823
+ if (!pointerPosition) {
824
+ return;
825
+ }
826
+
827
+ stickDrag.value = true;
828
+
829
+ saveDimensionsBeforeMove(pointerPosition);
830
+
831
+ currentStick.value = stick;
832
+
833
+ limits.value = calcResizeLimits();
834
+ };
835
+
836
+ const move = (ev: MouseEvent & TouchEvent) => {
837
+ if (!stickDrag.value && !bodyDrag.value) {
838
+ return;
839
+ }
840
+
841
+ ev.stopPropagation();
842
+
843
+ const pointerPosition = getPointerPosition(ev);
844
+
845
+ if (!pointerPosition) {
846
+ return;
847
+ }
848
+
849
+ const delta = {
850
+ x:
851
+ (dimensionsBeforeMove.value.pointerX - pointerPosition.pointerX) /
852
+ parentScaleX.value,
853
+ y:
854
+ (dimensionsBeforeMove.value.pointerY - pointerPosition.pointerY) /
855
+ parentScaleY.value,
856
+ };
857
+
858
+ if (stickDrag.value) {
859
+ stickMove(delta);
860
+ }
861
+
862
+ if (bodyDrag.value) {
863
+ switch (axis.value) {
864
+ case 'none': {
865
+ return;
866
+ }
867
+ case 'x': {
868
+ delta.y = 0;
869
+
870
+ break;
871
+ }
872
+ case 'y': {
873
+ delta.x = 0;
874
+
875
+ break;
876
+ }
877
+ // No default
878
+ }
879
+ bodyMove(delta);
880
+ }
881
+ };
882
+
883
+ const up = () => {
884
+ if (stickDrag.value) {
885
+ stickUp();
886
+ } else if (bodyDrag.value) {
887
+ bodyUp();
888
+ }
889
+ };
890
+
891
+ const deselect = () => {
892
+ if (preventActiveBehavior.value) {
893
+ return;
894
+ }
895
+ active.value = false;
896
+ };
897
+
898
+ const domEvents = ref(
899
+ new Map([
900
+ ['mousedown', deselect],
901
+ ['mouseleave', up],
902
+ ['mousemove', move],
903
+ ['mouseup', up],
904
+ ['touchcancel', up],
905
+ ['touchend', up],
906
+ ['touchmove', move],
907
+ ['touchstart', up],
908
+ ]),
909
+ );
910
+
911
+ const container = ref<HTMLDivElement>();
912
+
913
+ onMounted(() => {
914
+ const currentInstance = getCurrentInstance();
915
+ const $el = currentInstance?.vnode.el as HTMLElement;
916
+
917
+ parentElement.value = $el?.parentNode as HTMLElement;
918
+ parentWidth.value = parentW.value ?? parentElement.value?.clientWidth;
919
+ parentHeight.value = parentH.value ?? parentElement.value?.clientHeight;
920
+
921
+ left.value = x.value;
922
+ top.value = y.value;
923
+ const containerElement = container.value;
924
+ const contentWidth =
925
+ w.value === 'auto'
926
+ ? (containerElement?.scrollWidth ?? 0)
927
+ : (w.value as number);
928
+ const contentHeight =
929
+ h.value === 'auto'
930
+ ? (containerElement?.scrollHeight ?? 0)
931
+ : (h.value as number);
932
+ right.value = (parentWidth.value ?? 0) - contentWidth - (left.value ?? 0);
933
+ bottom.value = (parentHeight.value ?? 0) - contentHeight - (top.value ?? 0);
934
+
935
+ addEvents(domEvents.value);
936
+
937
+ if (dragHandle.value) {
938
+ [...($el?.querySelectorAll(dragHandle.value) || [])].forEach(
939
+ (dragHandle) => {
940
+ (dragHandle as HTMLElement).dataset.dragHandle = String(
941
+ currentInstance?.uid,
942
+ );
943
+ },
944
+ );
945
+ }
946
+
947
+ if (dragCancel.value) {
948
+ [...($el?.querySelectorAll(dragCancel.value) || [])].forEach(
949
+ (cancelHandle) => {
950
+ (cancelHandle as HTMLElement).dataset.dragCancel = String(
951
+ currentInstance?.uid,
952
+ );
953
+ },
954
+ );
955
+ }
956
+ });
957
+ onBeforeUnmount(() => {
958
+ removeEvents(domEvents.value);
959
+ });
960
+
961
+ const bodyDown = (ev: MouseEvent & TouchEvent) => {
962
+ const { target, button } = ev;
963
+ const targetElement = target instanceof HTMLElement ? target : null;
964
+ const uid = getCurrentInstance()?.uid.toString();
965
+
966
+ if (!preventActiveBehavior.value) {
967
+ active.value = true;
968
+ }
969
+
970
+ if (button && button !== 0) {
971
+ return;
972
+ }
973
+
974
+ emit('clicked', ev);
975
+
976
+ if (!active.value) {
977
+ return;
978
+ }
979
+
980
+ if (
981
+ dragHandle.value &&
982
+ targetElement &&
983
+ targetElement.dataset.dragHandle !== uid
984
+ ) {
985
+ return;
986
+ }
987
+
988
+ if (dragCancel.value && targetElement?.dataset.dragCancel === uid) {
989
+ return;
990
+ }
991
+
992
+ if (ev.stopPropagation !== undefined) {
993
+ ev.stopPropagation();
994
+ }
995
+
996
+ if (ev.preventDefault !== undefined) {
997
+ ev.preventDefault();
998
+ }
999
+
1000
+ const pointerPosition = getPointerPosition(ev);
1001
+
1002
+ if (!pointerPosition) {
1003
+ return;
1004
+ }
1005
+
1006
+ if (isDraggable.value) {
1007
+ bodyDrag.value = true;
1008
+ }
1009
+
1010
+ saveDimensionsBeforeMove(pointerPosition);
1011
+
1012
+ if (parentLimitation.value) {
1013
+ limits.value = calcDragLimitation();
1014
+ }
1015
+ };
1016
+
1017
+ watch(
1018
+ () => active.value,
1019
+ (isActive) => {
1020
+ if (isActive) {
1021
+ emit('activated');
1022
+ } else {
1023
+ emit('deactivated');
1024
+ }
1025
+ },
1026
+ );
1027
+
1028
+ watch(
1029
+ () => isActive.value,
1030
+ (val) => {
1031
+ active.value = val;
1032
+ },
1033
+ { immediate: true },
1034
+ );
1035
+
1036
+ watch(
1037
+ () => z.value,
1038
+ (val) => {
1039
+ if (typeof val === 'number' && val >= 0) {
1040
+ zIndex.value = val;
1041
+ } else if (val === 'auto') {
1042
+ zIndex.value = null;
1043
+ }
1044
+ },
1045
+ { immediate: true },
1046
+ );
1047
+
1048
+ watch(
1049
+ () => x.value,
1050
+ (newVal, oldVal) => {
1051
+ const currentLeft = left.value;
1052
+ const currentTop = top.value;
1053
+
1054
+ if (
1055
+ stickDrag.value ||
1056
+ bodyDrag.value ||
1057
+ currentLeft === null ||
1058
+ currentTop === null ||
1059
+ newVal === currentLeft
1060
+ ) {
1061
+ return;
1062
+ }
1063
+
1064
+ const delta = oldVal - newVal;
1065
+
1066
+ bodyDown({ pageX: currentLeft, pageY: currentTop } as MouseEvent &
1067
+ TouchEvent);
1068
+ bodyMove({ x: delta, y: 0 });
1069
+
1070
+ nextTick(() => {
1071
+ bodyUp();
1072
+ });
1073
+ },
1074
+ );
1075
+
1076
+ watch(
1077
+ () => y.value,
1078
+ (newVal, oldVal) => {
1079
+ const currentLeft = left.value;
1080
+ const currentTop = top.value;
1081
+
1082
+ if (
1083
+ stickDrag.value ||
1084
+ bodyDrag.value ||
1085
+ currentLeft === null ||
1086
+ currentTop === null ||
1087
+ newVal === currentTop
1088
+ ) {
1089
+ return;
1090
+ }
1091
+
1092
+ const delta = oldVal - newVal;
1093
+
1094
+ bodyDown({ pageX: currentLeft, pageY: currentTop } as MouseEvent &
1095
+ TouchEvent);
1096
+ bodyMove({ x: 0, y: delta });
1097
+
1098
+ nextTick(() => {
1099
+ bodyUp();
1100
+ });
1101
+ },
1102
+ );
1103
+
1104
+ watch(
1105
+ () => w.value,
1106
+ (newVal, oldVal) => {
1107
+ const currentRight = right.value;
1108
+ const currentTop = top.value;
1109
+
1110
+ if (stickDrag.value || bodyDrag.value || newVal === width.value) {
1111
+ return;
1112
+ }
1113
+
1114
+ if (currentRight === null || currentTop === null) {
1115
+ return;
1116
+ }
1117
+
1118
+ const stick = 'mr';
1119
+ const delta = (oldVal as number) - (newVal as number);
1120
+
1121
+ stickDown(
1122
+ stick,
1123
+ { pageX: currentRight, pageY: currentTop + height.value / 2 },
1124
+ true,
1125
+ );
1126
+ stickMove({ x: delta, y: 0 });
1127
+
1128
+ nextTick(() => {
1129
+ stickUp();
1130
+ });
1131
+ },
1132
+ );
1133
+
1134
+ watch(
1135
+ () => h.value,
1136
+ (newVal, oldVal) => {
1137
+ const currentLeft = left.value;
1138
+ const currentBottom = bottom.value;
1139
+
1140
+ if (stickDrag.value || bodyDrag.value || newVal === height.value) {
1141
+ return;
1142
+ }
1143
+
1144
+ if (currentLeft === null || currentBottom === null) {
1145
+ return;
1146
+ }
1147
+
1148
+ const stick = 'bm';
1149
+ const delta = (oldVal as number) - (newVal as number);
1150
+
1151
+ stickDown(
1152
+ stick,
1153
+ { pageX: currentLeft + width.value / 2, pageY: currentBottom },
1154
+ true,
1155
+ );
1156
+ stickMove({ x: 0, y: delta });
1157
+
1158
+ nextTick(() => {
1159
+ stickUp();
1160
+ });
1161
+ },
1162
+ );
1163
+
1164
+ watch(
1165
+ () => parentW.value,
1166
+ (val) => {
1167
+ right.value = val - width.value - (left.value ?? 0);
1168
+ parentWidth.value = val;
1169
+ },
1170
+ );
1171
+
1172
+ watch(
1173
+ () => parentH.value,
1174
+ (val) => {
1175
+ bottom.value = val - height.value - (top.value ?? 0);
1176
+ parentHeight.value = val;
1177
+ },
1178
+ );
1179
+ </script>
1180
+
1181
+ <template>
1182
+ <div
1183
+ :class="`${active || isActive ? 'active' : 'inactive'} ${contentClass ? contentClass : ''}`"
1184
+ :style="positionStyle"
1185
+ class="resize"
1186
+ @mousedown="bodyDown($event as TouchEvent & MouseEvent)"
1187
+ @touchend="up"
1188
+ @touchstart="bodyDown($event as TouchEvent & MouseEvent)"
1189
+ >
1190
+ <div ref="container" :style="sizeStyle" class="content-container">
1191
+ <slot></slot>
1192
+ </div>
1193
+ <div
1194
+ v-for="(stick, index) of sticks"
1195
+ :key="index"
1196
+ :class="[`resize-stick-${stick}`, isResizable ? '' : 'not-resizable']"
1197
+ :style="stickStyles(stick)"
1198
+ class="resize-stick"
1199
+ @mousedown.stop.prevent="
1200
+ stickDown(stick, $event as TouchEvent & MouseEvent)
1201
+ "
1202
+ @touchstart.stop.prevent="
1203
+ stickDown(stick, $event as TouchEvent & MouseEvent)
1204
+ "
1205
+ ></div>
1206
+ </div>
1207
+ </template>
1208
+
1209
+ <style lang="css" scoped>
1210
+ .resize {
1211
+ position: absolute;
1212
+ box-sizing: border-box;
1213
+ }
1214
+
1215
+ .resize.active::before {
1216
+ position: absolute;
1217
+ top: 0;
1218
+ left: 0;
1219
+ box-sizing: border-box;
1220
+ width: 100%;
1221
+ height: 100%;
1222
+ outline: 1px dashed #d6d6d6;
1223
+ content: '';
1224
+ }
1225
+
1226
+ .resize-stick {
1227
+ position: absolute;
1228
+ box-sizing: border-box;
1229
+ font-size: 1px;
1230
+ background: #fff;
1231
+ border: 1px solid #6c6c6c;
1232
+ box-shadow: 0 0 2px #bbb;
1233
+ }
1234
+
1235
+ .inactive .resize-stick {
1236
+ display: none;
1237
+ }
1238
+
1239
+ .resize-stick-tl,
1240
+ .resize-stick-br {
1241
+ cursor: nwse-resize;
1242
+ }
1243
+
1244
+ .resize-stick-tm,
1245
+ .resize-stick-bm {
1246
+ left: 50%;
1247
+ cursor: ns-resize;
1248
+ }
1249
+
1250
+ .resize-stick-tr,
1251
+ .resize-stick-bl {
1252
+ cursor: nesw-resize;
1253
+ }
1254
+
1255
+ .resize-stick-ml,
1256
+ .resize-stick-mr {
1257
+ top: 50%;
1258
+ cursor: ew-resize;
1259
+ }
1260
+
1261
+ .resize-stick.not-resizable {
1262
+ display: none;
1263
+ }
1264
+
1265
+ .content-container {
1266
+ position: relative;
1267
+ display: block;
1268
+ }
1269
+ </style>