vome-core 0.3.64 → 0.3.66

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 (345) hide show
  1. package/dist/admin/api/client.js +7 -2
  2. package/dist/admin/components/ui/avatar/Avatar.vue +18 -18
  3. package/dist/admin/components/ui/avatar/AvatarFallback.vue +21 -21
  4. package/dist/admin/components/ui/avatar/AvatarImage.vue +16 -16
  5. package/dist/admin/components/ui/avatar/index.js +1 -1
  6. package/dist/admin/components/ui/badge/Badge.vue +26 -26
  7. package/dist/admin/components/ui/button/Button.vue +31 -31
  8. package/dist/admin/components/ui/checkbox/Checkbox.vue +35 -35
  9. package/dist/admin/components/ui/checkbox/index.js +1 -1
  10. package/dist/admin/components/ui/dialog/Dialog.vue +19 -19
  11. package/dist/admin/components/ui/dialog/DialogClose.vue +15 -15
  12. package/dist/admin/components/ui/dialog/DialogContent.vue +267 -267
  13. package/dist/admin/components/ui/dialog/DialogDescription.vue +23 -23
  14. package/dist/admin/components/ui/dialog/DialogFooter.vue +27 -27
  15. package/dist/admin/components/ui/dialog/DialogHeader.vue +17 -17
  16. package/dist/admin/components/ui/dialog/DialogOverlay.vue +21 -21
  17. package/dist/admin/components/ui/dialog/DialogScrollContent.vue +60 -60
  18. package/dist/admin/components/ui/dialog/DialogTitle.vue +23 -23
  19. package/dist/admin/components/ui/dialog/DialogTrigger.vue +15 -15
  20. package/dist/admin/components/ui/dialog/index.js +1 -1
  21. package/dist/admin/components/ui/dropdown-menu/DropdownMenu.vue +19 -19
  22. package/dist/admin/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue +39 -39
  23. package/dist/admin/components/ui/dropdown-menu/DropdownMenuContent.vue +39 -39
  24. package/dist/admin/components/ui/dropdown-menu/DropdownMenuGroup.vue +15 -15
  25. package/dist/admin/components/ui/dropdown-menu/DropdownMenuItem.vue +31 -31
  26. package/dist/admin/components/ui/dropdown-menu/DropdownMenuLabel.vue +23 -23
  27. package/dist/admin/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue +21 -21
  28. package/dist/admin/components/ui/dropdown-menu/DropdownMenuRadioItem.vue +40 -40
  29. package/dist/admin/components/ui/dropdown-menu/DropdownMenuSeparator.vue +23 -23
  30. package/dist/admin/components/ui/dropdown-menu/DropdownMenuShortcut.vue +17 -17
  31. package/dist/admin/components/ui/dropdown-menu/DropdownMenuSub.vue +18 -18
  32. package/dist/admin/components/ui/dropdown-menu/DropdownMenuSubContent.vue +27 -27
  33. package/dist/admin/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue +31 -31
  34. package/dist/admin/components/ui/dropdown-menu/DropdownMenuTrigger.vue +17 -17
  35. package/dist/admin/components/ui/dropdown-menu/index.js +1 -1
  36. package/dist/admin/components/ui/input/Input.vue +183 -183
  37. package/dist/admin/components/ui/input/index.js +1 -1
  38. package/dist/admin/components/ui/label/Label.vue +26 -26
  39. package/dist/admin/components/ui/label/index.js +1 -1
  40. package/dist/admin/components/ui/scroll-area/ScrollArea.vue +33 -33
  41. package/dist/admin/components/ui/scroll-area/ScrollBar.vue +32 -32
  42. package/dist/admin/components/ui/scroll-area/index.js +1 -1
  43. package/dist/admin/components/ui/select/Select.vue +19 -19
  44. package/dist/admin/components/ui/select/SelectContent.vue +51 -51
  45. package/dist/admin/components/ui/select/SelectGroup.vue +15 -15
  46. package/dist/admin/components/ui/select/SelectItem.vue +53 -53
  47. package/dist/admin/components/ui/select/SelectItemText.vue +15 -15
  48. package/dist/admin/components/ui/select/SelectLabel.vue +17 -17
  49. package/dist/admin/components/ui/select/SelectScrollDownButton.vue +26 -26
  50. package/dist/admin/components/ui/select/SelectScrollUpButton.vue +26 -26
  51. package/dist/admin/components/ui/select/SelectSeparator.vue +19 -19
  52. package/dist/admin/components/ui/select/SelectTrigger.vue +44 -44
  53. package/dist/admin/components/ui/select/SelectValue.vue +15 -15
  54. package/dist/admin/components/ui/select/index.js +1 -1
  55. package/dist/admin/components/ui/separator/Separator.vue +29 -29
  56. package/dist/admin/components/ui/separator/index.js +1 -1
  57. package/dist/admin/components/ui/sheet/Sheet.vue +19 -19
  58. package/dist/admin/components/ui/sheet/SheetClose.vue +15 -15
  59. package/dist/admin/components/ui/sheet/SheetContent.vue +63 -63
  60. package/dist/admin/components/ui/sheet/SheetDescription.vue +21 -21
  61. package/dist/admin/components/ui/sheet/SheetFooter.vue +16 -16
  62. package/dist/admin/components/ui/sheet/SheetHeader.vue +15 -15
  63. package/dist/admin/components/ui/sheet/SheetOverlay.vue +21 -21
  64. package/dist/admin/components/ui/sheet/SheetTitle.vue +21 -21
  65. package/dist/admin/components/ui/sheet/SheetTrigger.vue +15 -15
  66. package/dist/admin/components/ui/sheet/index.js +1 -1
  67. package/dist/admin/components/ui/sonner/Toaster.vue +117 -117
  68. package/dist/admin/components/ui/sonner/index.js +1 -1
  69. package/dist/admin/components/ui/table/Table.vue +16 -16
  70. package/dist/admin/components/ui/table/TableBody.vue +17 -17
  71. package/dist/admin/components/ui/table/TableCaption.vue +17 -17
  72. package/dist/admin/components/ui/table/TableCell.vue +22 -22
  73. package/dist/admin/components/ui/table/TableEmpty.vue +34 -34
  74. package/dist/admin/components/ui/table/TableFooter.vue +17 -17
  75. package/dist/admin/components/ui/table/TableHead.vue +17 -17
  76. package/dist/admin/components/ui/table/TableHeader.vue +17 -17
  77. package/dist/admin/components/ui/table/TableRow.vue +17 -17
  78. package/dist/admin/components/ui/table/index.js +1 -1
  79. package/dist/admin/components/ui/tabs/Tabs.vue +24 -24
  80. package/dist/admin/components/ui/tabs/TabsContent.vue +21 -21
  81. package/dist/admin/components/ui/tabs/TabsList.vue +24 -24
  82. package/dist/admin/components/ui/tabs/TabsTrigger.vue +26 -26
  83. package/dist/admin/components/ui/tabs/index.js +1 -1
  84. package/dist/admin/components/ui/tooltip/Tooltip.vue +19 -19
  85. package/dist/admin/components/ui/tooltip/TooltipContent.vue +34 -34
  86. package/dist/admin/components/ui/tooltip/TooltipProvider.vue +14 -14
  87. package/dist/admin/components/ui/tooltip/TooltipTrigger.vue +15 -15
  88. package/dist/admin/components/ui/tooltip/index.js +1 -1
  89. package/dist/admin/components/vm-action-btn.vue +136 -136
  90. package/dist/admin/components/vm-aside-list-item.vue +136 -136
  91. package/dist/admin/components/vm-aside.vue +229 -229
  92. package/dist/admin/components/vm-auto-perm-dialog.vue +371 -371
  93. package/dist/admin/components/vm-card-grid.vue +37 -37
  94. package/dist/admin/components/vm-card-head.vue +45 -45
  95. package/dist/admin/components/vm-card-meta.vue +22 -22
  96. package/dist/admin/components/vm-card-title.vue +56 -56
  97. package/dist/admin/components/vm-card.vue +176 -176
  98. package/dist/admin/components/vm-check-tree.vue +340 -340
  99. package/dist/admin/components/vm-clamp-text.vue +39 -39
  100. package/dist/admin/components/vm-dept-tree.vue +497 -497
  101. package/dist/admin/components/vm-empty.vue +68 -68
  102. package/dist/admin/components/vm-eps-perm-picker.vue +123 -123
  103. package/dist/admin/components/vm-form-dialog.vue +632 -632
  104. package/dist/admin/components/vm-group-cascader.vue +560 -560
  105. package/dist/admin/components/vm-icon-btn.vue +88 -88
  106. package/dist/admin/components/vm-icon-picker.vue +647 -647
  107. package/dist/admin/components/vm-inline-search.vue +61 -61
  108. package/dist/admin/components/vm-loading.vue +114 -114
  109. package/dist/admin/components/vm-markdown.vue +405 -405
  110. package/dist/admin/components/vm-marquee.vue +265 -265
  111. package/dist/admin/components/vm-page-tabs.vue +94 -94
  112. package/dist/admin/components/vm-perm-section.vue +57 -57
  113. package/dist/admin/components/vm-ri-icon.vue +23 -23
  114. package/dist/admin/components/vm-role-picker.vue +314 -314
  115. package/dist/admin/components/vm-split-layout.vue +106 -106
  116. package/dist/admin/components/vm-thumb.vue +49 -49
  117. package/dist/admin/components/vm-view-path-picker.vue +59 -59
  118. package/dist/admin/crud/auto-fields.js +1 -1
  119. package/dist/admin/crud/components/vm-avatar.vue +104 -104
  120. package/dist/admin/crud/components/vm-color-picker.vue +1626 -1626
  121. package/dist/admin/crud/components/vm-column-custom.vue +193 -193
  122. package/dist/admin/crud/components/vm-context-menu.vue +105 -105
  123. package/dist/admin/crud/components/vm-copy-btn.vue +102 -102
  124. package/dist/admin/crud/components/vm-date-calendar-panel.vue +537 -537
  125. package/dist/admin/crud/components/vm-date-picker.vue +75 -75
  126. package/dist/admin/crud/components/vm-date-range.vue +88 -88
  127. package/dist/admin/crud/components/vm-date-text.vue +42 -42
  128. package/dist/admin/crud/components/vm-datetime-field.vue +215 -215
  129. package/dist/admin/crud/components/vm-datetime-picker.vue +9 -9
  130. package/dist/admin/crud/components/vm-dict-tag.vue +112 -112
  131. package/dist/admin/crud/components/vm-ellipsis-text.vue +34 -34
  132. package/dist/admin/crud/components/vm-form-hint.vue +81 -81
  133. package/dist/admin/crud/components/vm-json-code.vue +41 -41
  134. package/dist/admin/crud/components/vm-json-editor.vue +161 -161
  135. package/dist/admin/crud/components/vm-json-kv-editor.vue +318 -318
  136. package/dist/admin/crud/components/vm-kv-row.vue +51 -51
  137. package/dist/admin/crud/components/vm-multi-select.vue +279 -279
  138. package/dist/admin/crud/components/vm-number-range.vue +204 -204
  139. package/dist/admin/crud/components/vm-preview-viewer.vue +894 -894
  140. package/dist/admin/crud/components/vm-radio.vue +87 -87
  141. package/dist/admin/crud/components/vm-richtext.vue +313 -313
  142. package/dist/admin/crud/components/vm-select.vue +570 -570
  143. package/dist/admin/crud/components/vm-status-tag.vue +158 -158
  144. package/dist/admin/crud/components/vm-switch.vue +158 -158
  145. package/dist/admin/crud/components/vm-tag-list.vue +108 -108
  146. package/dist/admin/crud/components/vm-text-link.vue +52 -52
  147. package/dist/admin/crud/components/vm-toggle-switch.vue +84 -84
  148. package/dist/admin/crud/components/vm-tree-select.vue +450 -450
  149. package/dist/admin/crud/components/vm-upload-item.vue +298 -298
  150. package/dist/admin/crud/components/vm-upload.vue +436 -436
  151. package/dist/admin/crud/config.js +1 -1
  152. package/dist/admin/crud/confirm.js +1 -1
  153. package/dist/admin/crud/crud-page-request.js +1 -1
  154. package/dist/admin/crud/data-i18n.js +1 -1
  155. package/dist/admin/crud/dict.js +1 -1
  156. package/dist/admin/crud/export-fetch.js +1 -1
  157. package/dist/admin/crud/index.js +1 -0
  158. package/dist/admin/crud/key.js +1 -1
  159. package/dist/admin/crud/plugins.js +1 -1
  160. package/dist/admin/crud/span.js +1 -1
  161. package/dist/admin/crud/style.js +1 -1
  162. package/dist/admin/crud/useCrud.js +3 -0
  163. package/dist/admin/crud/validate.js +1 -1
  164. package/dist/admin/crud/vm-add-btn.vue +70 -70
  165. package/dist/admin/crud/vm-adv-search.vue +83 -83
  166. package/dist/admin/crud/vm-crud.vue +711 -711
  167. package/dist/admin/crud/vm-data-i18n-btn.vue +456 -456
  168. package/dist/admin/crud/vm-data-i18n-lang.vue +183 -183
  169. package/dist/admin/crud/vm-export-btn.vue +183 -183
  170. package/dist/admin/crud/vm-flex.vue +14 -14
  171. package/dist/admin/crud/vm-form.vue +33 -15
  172. package/dist/admin/crud/vm-import-btn.vue +747 -747
  173. package/dist/admin/crud/vm-multi-delete-btn.vue +49 -49
  174. package/dist/admin/crud/vm-pagination.vue +212 -212
  175. package/dist/admin/crud/vm-refresh-btn.vue +35 -35
  176. package/dist/admin/crud/vm-row.vue +55 -55
  177. package/dist/admin/crud/vm-search-key.vue +78 -78
  178. package/dist/admin/crud/vm-search.vue +466 -466
  179. package/dist/admin/crud/vm-table.vue +1390 -1390
  180. package/dist/admin/crud/vm-tabs.vue +94 -94
  181. package/dist/admin/crud/vm-toolbar.vue +357 -357
  182. package/dist/admin/crud/vm-upsert.vue +765 -765
  183. package/dist/admin/directives/perm.js +1 -1
  184. package/dist/admin/env.d.ts +1 -1
  185. package/dist/admin/hooks/useUpload.js +1 -1
  186. package/dist/admin/index.d.ts +1 -31
  187. package/dist/admin/lib/browser.js +1 -1
  188. package/dist/admin/lib/cn.js +1 -1
  189. package/dist/admin/lib/dialog-float.js +1 -1
  190. package/dist/admin/lib/export-excel.js +1 -1
  191. package/dist/admin/lib/import-excel.js +1 -1
  192. package/dist/admin/lib/json.js +1 -1
  193. package/dist/admin/lib/menu.js +1 -1
  194. package/dist/admin/lib/micro-locale.js +1 -1
  195. package/dist/admin/lib/micro-theme.js +1 -1
  196. package/dist/admin/lib/shell.js +1 -1
  197. package/dist/admin/lib/theme-color-options.js +1 -1
  198. package/dist/admin/lib/tree.js +1 -1
  199. package/dist/admin/lib/upload.js +1 -1
  200. package/dist/admin/lib/video-frame.js +1 -1
  201. package/dist/admin/router/create.js +1 -1
  202. package/dist/admin/router/guards.js +1 -1
  203. package/dist/admin/router/index.d.ts +1 -5
  204. package/dist/admin/service/index.d.ts +1 -11
  205. package/dist/admin/styles/base.css +121 -121
  206. package/dist/admin/vendor/browser-image-compression.js +1144 -1144
  207. package/dist/admin/vendor/decimal-js.js +12 -12
  208. package/dist/admin/vendor/xlsx.js +263 -263
  209. package/dist/ai/index.js +1 -1
  210. package/dist/client/admin-vendor.d.ts +1 -13
  211. package/dist/client/ai-model-registry.js +1 -1
  212. package/dist/client/base.js +1 -1
  213. package/dist/client/configure.js +1 -1
  214. package/dist/client/dict.js +1 -1
  215. package/dist/client/eps-payload.js +1 -1
  216. package/dist/client/eps.js +1 -1
  217. package/dist/client/index.d.ts +1 -7
  218. package/dist/client/index.js +1 -1
  219. package/dist/client/locale-change.js +1 -1
  220. package/dist/client/locale-store.js +1 -1
  221. package/dist/client/service.js +1 -1
  222. package/dist/client/vite-admin.d.ts +1 -40
  223. package/dist/client/vite-admin.js +1 -1
  224. package/dist/client/vite-auto-import.d.ts +1 -2
  225. package/dist/client/vite-auto-import.js +1 -1
  226. package/dist/client/vite-micro-proxy.d.ts +1 -20
  227. package/dist/client/vite-micro-proxy.js +1 -1
  228. package/dist/client/vite-plugin-eps.d.ts +1 -20
  229. package/dist/client/vite-plugin-eps.js +1 -1
  230. package/dist/client/vite-resolve.d.ts +1 -16
  231. package/dist/client/vite-resolve.js +1 -1
  232. package/dist/config/index.js +1 -1
  233. package/dist/core/index.d.ts +1 -1
  234. package/dist/index.js +1 -1
  235. package/dist/ioc/index.d.ts +1 -1
  236. package/dist/server/index.d.ts +1 -1
  237. package/dist/server/index.js +1 -1
  238. package/dist/shared/datetime-picker.js +1 -1
  239. package/dist/shared/decimal.js +1 -1
  240. package/dist/shared/excel.js +1 -1
  241. package/dist/shared/index.js +1 -1
  242. package/dist/shared/locale-json.js +1 -1
  243. package/dist/shared/tree.js +1 -1
  244. package/package.json +1 -1
  245. package/typings/admin/base/auth.ts +24 -24
  246. package/typings/admin/base/permission.ts +19 -19
  247. package/typings/admin/comm/cascader.ts +7 -7
  248. package/typings/admin/comm/check-tree.ts +7 -7
  249. package/typings/admin/comm/crud.ts +427 -427
  250. package/typings/admin/comm/eps.ts +86 -86
  251. package/typings/admin/comm/request.ts +16 -16
  252. package/typings/admin/comm/service.ts +43 -43
  253. package/typings/admin/comm/upload.ts +39 -39
  254. package/typings/admin/theme.ts +10 -10
  255. package/typings/admin/vome/browser.ts +11 -11
  256. package/typings/admin/vome/module.ts +13 -13
  257. package/typings/admin/vome/tags.ts +9 -9
  258. package/typings/comm/crud.ts +83 -83
  259. package/typings/comm/page.ts +18 -18
  260. package/typings/comm/scan.ts +6 -6
  261. package/typings/common.ts +4 -4
  262. package/typings/context/data.ts +10 -10
  263. package/typings/ext/market-seat.ts +42 -42
  264. package/typings/ext/market.ts +55 -55
  265. package/typings/ext/module.ts +64 -64
  266. package/typings/ext/plugin.ts +38 -38
  267. package/typings/ioc/metadata.ts +34 -34
  268. package/typings/logger/config.ts +6 -6
  269. package/typings/routing/crud.ts +199 -199
  270. package/typings/routing/eps.ts +88 -88
  271. package/typings/routing/meta.ts +63 -63
  272. package/typings/routing/register.ts +21 -21
  273. package/typings/routing/scan-context.ts +7 -7
  274. package/dist/admin/api/client.d.ts +0 -50
  275. package/dist/admin/components/ui/avatar/index.d.ts +0 -3
  276. package/dist/admin/components/ui/badge/index.d.ts +0 -6
  277. package/dist/admin/components/ui/button/index.d.ts +0 -7
  278. package/dist/admin/components/ui/checkbox/index.d.ts +0 -1
  279. package/dist/admin/components/ui/dialog/index.d.ts +0 -10
  280. package/dist/admin/components/ui/dropdown-menu/index.d.ts +0 -15
  281. package/dist/admin/components/ui/input/index.d.ts +0 -1
  282. package/dist/admin/components/ui/label/index.d.ts +0 -1
  283. package/dist/admin/components/ui/scroll-area/index.d.ts +0 -2
  284. package/dist/admin/components/ui/select/index.d.ts +0 -11
  285. package/dist/admin/components/ui/separator/index.d.ts +0 -1
  286. package/dist/admin/components/ui/sheet/index.d.ts +0 -8
  287. package/dist/admin/components/ui/sonner/index.d.ts +0 -1
  288. package/dist/admin/components/ui/table/index.d.ts +0 -9
  289. package/dist/admin/components/ui/tabs/index.d.ts +0 -4
  290. package/dist/admin/components/ui/tooltip/index.d.ts +0 -4
  291. package/dist/admin/crud/auto-fields.d.ts +0 -68
  292. package/dist/admin/crud/config.d.ts +0 -5
  293. package/dist/admin/crud/confirm.d.ts +0 -19
  294. package/dist/admin/crud/crud-page-request.d.ts +0 -21
  295. package/dist/admin/crud/data-i18n.d.ts +0 -62
  296. package/dist/admin/crud/dict.d.ts +0 -4
  297. package/dist/admin/crud/export-fetch.d.ts +0 -22
  298. package/dist/admin/crud/index.d.ts +0 -60
  299. package/dist/admin/crud/json-kv.d.ts +0 -9
  300. package/dist/admin/crud/key.d.ts +0 -22
  301. package/dist/admin/crud/paging.d.ts +0 -2
  302. package/dist/admin/crud/plugins.d.ts +0 -63
  303. package/dist/admin/crud/registry.d.ts +0 -3
  304. package/dist/admin/crud/span.d.ts +0 -17
  305. package/dist/admin/crud/style.d.ts +0 -82
  306. package/dist/admin/crud/useCrud.d.ts +0 -21
  307. package/dist/admin/crud/validate.d.ts +0 -7
  308. package/dist/admin/directives/perm.d.ts +0 -3
  309. package/dist/admin/hooks/useBrowser.d.ts +0 -6
  310. package/dist/admin/hooks/useUpload.d.ts +0 -8
  311. package/dist/admin/hooks/useVome.d.ts +0 -10
  312. package/dist/admin/lib/browser.d.ts +0 -3
  313. package/dist/admin/lib/cn.d.ts +0 -2
  314. package/dist/admin/lib/compress-image.d.ts +0 -12
  315. package/dist/admin/lib/dialog-float.d.ts +0 -8
  316. package/dist/admin/lib/eps.d.ts +0 -2
  317. package/dist/admin/lib/export-excel.d.ts +0 -9
  318. package/dist/admin/lib/file-preview.d.ts +0 -9
  319. package/dist/admin/lib/import-excel.d.ts +0 -21
  320. package/dist/admin/lib/json.d.ts +0 -11
  321. package/dist/admin/lib/menu.d.ts +0 -3
  322. package/dist/admin/lib/micro-locale.d.ts +0 -5
  323. package/dist/admin/lib/micro-theme.d.ts +0 -14
  324. package/dist/admin/lib/module.d.ts +0 -21
  325. package/dist/admin/lib/scarce-assets.d.ts +0 -5
  326. package/dist/admin/lib/shell.d.ts +0 -8
  327. package/dist/admin/lib/theme-color-options.d.ts +0 -15
  328. package/dist/admin/lib/tree.d.ts +0 -2
  329. package/dist/admin/lib/upload.d.ts +0 -17
  330. package/dist/admin/lib/video-frame.d.ts +0 -6
  331. package/dist/admin/router/create.d.ts +0 -16
  332. package/dist/admin/router/guards.d.ts +0 -6
  333. package/dist/admin/router/menu-routes.d.ts +0 -13
  334. package/dist/admin/stores/app.d.ts +0 -13
  335. package/dist/admin/stores/tags.d.ts +0 -14
  336. package/dist/admin/stores/user.d.ts +0 -48
  337. package/dist/client/ai-model-registry.d.ts +0 -16
  338. package/dist/client/base.d.ts +0 -28
  339. package/dist/client/configure.d.ts +0 -33
  340. package/dist/client/dict.d.ts +0 -31
  341. package/dist/client/eps-payload.d.ts +0 -3
  342. package/dist/client/eps.d.ts +0 -17
  343. package/dist/client/locale-change.d.ts +0 -16
  344. package/dist/client/locale-store.d.ts +0 -105
  345. package/dist/client/service.d.ts +0 -29
@@ -1,265 +1,265 @@
1
- <template>
2
- <div
3
- class="vm-marquee"
4
- :class="{ 'is-paused': hoverPaused }"
5
- @mouseenter="onEnter"
6
- @mouseleave="onLeave"
7
- >
8
- <div v-if="showIcon" class="vm-marquee__icon" aria-hidden="true">
9
- <slot name="icon">
10
- <VmRiIcon v-if="icon" :name="icon" />
11
- </slot>
12
- </div>
13
- <div ref="viewportRef" class="vm-marquee__viewport">
14
- <div ref="trackRef" class="vm-marquee__track">
15
- {{ currentText }}
16
- </div>
17
- </div>
18
- </div>
19
- </template>
20
-
21
- <script setup lang="ts">
22
- import {
23
- computed,
24
- nextTick,
25
- onMounted,
26
- onUnmounted,
27
- ref,
28
- useSlots,
29
- watch,
30
- } from 'vue'
31
- import VmRiIcon from './vm-ri-icon.vue'
32
-
33
- defineOptions({ name: 'vm-marquee' })
34
-
35
- const props = withDefaults(
36
- defineProps<{
37
- /** 消息列表;仅 1 条时单条循环 */
38
- messages?: string[]
39
- /** Remix Icon 名,如 ri-notification-3-line;也可用 #icon 插槽完全自定义 */
40
- icon?: string
41
- /** 单条滚完后的停顿(毫秒) */
42
- pause?: number
43
- /** 滚动速度(px/s) */
44
- speed?: number
45
- /** 悬停暂停 */
46
- pauseOnHover?: boolean
47
- }>(),
48
- {
49
- messages: () => [],
50
- pause: 3000,
51
- speed: 60,
52
- pauseOnHover: true,
53
- },
54
- )
55
-
56
- const slots = useSlots()
57
- const showIcon = computed(() => Boolean(props.icon) || Boolean(slots.icon))
58
-
59
- const list = computed(() =>
60
- (props.messages || []).map((s) => String(s ?? '').trim()).filter(Boolean),
61
- )
62
-
63
- const index = ref(0)
64
- const currentText = computed(() => list.value[index.value] ?? '')
65
-
66
- const viewportRef = ref<HTMLElement | null>(null)
67
- const trackRef = ref<HTMLElement | null>(null)
68
- const hoverPaused = ref(false)
69
-
70
- let anim: Animation | null = null
71
- let pauseTimer: ReturnType<typeof setTimeout> | null = null
72
- let pauseResolve: (() => void) | null = null
73
- /** 递增后旧循环全部退出,避免 messages 变更时双循环 */
74
- let loopGen = 0
75
-
76
- function clearPauseTimer() {
77
- if (pauseTimer != null) {
78
- clearTimeout(pauseTimer)
79
- pauseTimer = null
80
- }
81
- if (pauseResolve) {
82
- const resolve = pauseResolve
83
- pauseResolve = null
84
- resolve()
85
- }
86
- }
87
-
88
- function cancelAnim() {
89
- anim?.cancel()
90
- anim = null
91
- }
92
-
93
- function advanceIndex() {
94
- const n = list.value.length
95
- if (n <= 0) {
96
- index.value = 0
97
- return
98
- }
99
- index.value = (index.value + 1) % n
100
- }
101
-
102
- function sleep(ms: number) {
103
- return new Promise<void>((resolve) => {
104
- clearPauseTimer()
105
- pauseResolve = resolve
106
- pauseTimer = setTimeout(() => {
107
- pauseTimer = null
108
- pauseResolve = null
109
- resolve()
110
- }, ms)
111
- })
112
- }
113
-
114
- async function waitWhileHovered(gen: number) {
115
- while (hoverPaused.value && gen === loopGen) {
116
- await sleep(100)
117
- }
118
- }
119
-
120
- async function runOnce(gen: number): Promise<void> {
121
- const viewport = viewportRef.value
122
- const track = trackRef.value
123
- if (!viewport || !track || !list.value.length || gen !== loopGen) return
124
-
125
- await nextTick()
126
- if (gen !== loopGen) return
127
- await nextTick()
128
- if (gen !== loopGen) return
129
-
130
- const from = viewport.clientWidth
131
- const textW = Math.max(track.scrollWidth, 1)
132
- const to = -textW
133
- const distance = from - to
134
- const duration = Math.max(
135
- 800,
136
- Math.round((distance / Math.max(props.speed, 1)) * 1000),
137
- )
138
-
139
- cancelAnim()
140
- // translateY(-50%) 与 top:50% 配合做垂直居中(动画不能只用 translateX)
141
- const tx = (x: number) => `translateY(-50%) translateX(${x}px)`
142
- track.style.transform = tx(from)
143
-
144
- anim = track.animate(
145
- [{ transform: tx(from) }, { transform: tx(to) }],
146
- {
147
- duration,
148
- easing: 'linear',
149
- fill: 'forwards',
150
- },
151
- )
152
-
153
- if (hoverPaused.value) anim.pause()
154
-
155
- try {
156
- await anim.finished
157
- } catch {
158
- // cancel() 会 reject
159
- } finally {
160
- if (anim) anim = null
161
- }
162
- }
163
-
164
- async function loop(gen: number) {
165
- while (gen === loopGen && list.value.length) {
166
- if (index.value >= list.value.length) index.value = 0
167
- await runOnce(gen)
168
- if (gen !== loopGen || !list.value.length) break
169
- await waitWhileHovered(gen)
170
- if (gen !== loopGen) break
171
- await sleep(Math.max(0, props.pause))
172
- if (gen !== loopGen) break
173
- await waitWhileHovered(gen)
174
- if (gen !== loopGen) break
175
- advanceIndex()
176
- }
177
- }
178
-
179
- function restart() {
180
- loopGen += 1
181
- const gen = loopGen
182
- clearPauseTimer()
183
- cancelAnim()
184
- if (index.value >= list.value.length) index.value = 0
185
- if (!list.value.length) return
186
- void loop(gen)
187
- }
188
-
189
- function onEnter() {
190
- if (!props.pauseOnHover) return
191
- hoverPaused.value = true
192
- anim?.pause()
193
- }
194
-
195
- function onLeave() {
196
- if (!props.pauseOnHover) return
197
- hoverPaused.value = false
198
- anim?.play()
199
- }
200
-
201
- onMounted(() => {
202
- restart()
203
- })
204
-
205
- onUnmounted(() => {
206
- loopGen += 1
207
- clearPauseTimer()
208
- cancelAnim()
209
- })
210
-
211
- watch(
212
- () => [props.messages, props.speed, props.pause] as const,
213
- () => {
214
- restart()
215
- },
216
- { deep: true },
217
- )
218
- </script>
219
-
220
- <style lang="scss" scoped>
221
- .vm-marquee {
222
- display: flex;
223
- align-items: center;
224
- gap: 8px;
225
- width: 100%;
226
- min-width: 0;
227
- min-height: var(--vm-control-height, 32px);
228
- padding: 0 10px;
229
- border: 1px solid var(--border);
230
- border-radius: var(--vm-control-radius, 8px);
231
- background: var(--muted);
232
- color: var(--foreground);
233
- overflow: hidden;
234
- }
235
-
236
- .vm-marquee__icon {
237
- flex-shrink: 0;
238
- display: inline-flex;
239
- align-items: center;
240
- justify-content: center;
241
- color: var(--brand, #4e5dff);
242
- font-size: 16px;
243
- line-height: 1;
244
- }
245
-
246
- .vm-marquee__viewport {
247
- position: relative;
248
- flex: 1;
249
- align-self: stretch;
250
- min-width: 0;
251
- min-height: 0;
252
- overflow: hidden;
253
- }
254
-
255
- .vm-marquee__track {
256
- position: absolute;
257
- top: 50%;
258
- left: 0;
259
- white-space: nowrap;
260
- font-size: 13px;
261
- line-height: 1.5;
262
- transform: translateY(-50%);
263
- will-change: transform;
264
- }
265
- </style>
1
+ <template>
2
+ <div
3
+ class="vm-marquee"
4
+ :class="{ 'is-paused': hoverPaused }"
5
+ @mouseenter="onEnter"
6
+ @mouseleave="onLeave"
7
+ >
8
+ <div v-if="showIcon" class="vm-marquee__icon" aria-hidden="true">
9
+ <slot name="icon">
10
+ <VmRiIcon v-if="icon" :name="icon" />
11
+ </slot>
12
+ </div>
13
+ <div ref="viewportRef" class="vm-marquee__viewport">
14
+ <div ref="trackRef" class="vm-marquee__track">
15
+ {{ currentText }}
16
+ </div>
17
+ </div>
18
+ </div>
19
+ </template>
20
+
21
+ <script setup lang="ts">
22
+ import {
23
+ computed,
24
+ nextTick,
25
+ onMounted,
26
+ onUnmounted,
27
+ ref,
28
+ useSlots,
29
+ watch,
30
+ } from 'vue'
31
+ import VmRiIcon from './vm-ri-icon.vue'
32
+
33
+ defineOptions({ name: 'vm-marquee' })
34
+
35
+ const props = withDefaults(
36
+ defineProps<{
37
+ /** 消息列表;仅 1 条时单条循环 */
38
+ messages?: string[]
39
+ /** Remix Icon 名,如 ri-notification-3-line;也可用 #icon 插槽完全自定义 */
40
+ icon?: string
41
+ /** 单条滚完后的停顿(毫秒) */
42
+ pause?: number
43
+ /** 滚动速度(px/s) */
44
+ speed?: number
45
+ /** 悬停暂停 */
46
+ pauseOnHover?: boolean
47
+ }>(),
48
+ {
49
+ messages: () => [],
50
+ pause: 3000,
51
+ speed: 60,
52
+ pauseOnHover: true,
53
+ },
54
+ )
55
+
56
+ const slots = useSlots()
57
+ const showIcon = computed(() => Boolean(props.icon) || Boolean(slots.icon))
58
+
59
+ const list = computed(() =>
60
+ (props.messages || []).map((s) => String(s ?? '').trim()).filter(Boolean),
61
+ )
62
+
63
+ const index = ref(0)
64
+ const currentText = computed(() => list.value[index.value] ?? '')
65
+
66
+ const viewportRef = ref<HTMLElement | null>(null)
67
+ const trackRef = ref<HTMLElement | null>(null)
68
+ const hoverPaused = ref(false)
69
+
70
+ let anim: Animation | null = null
71
+ let pauseTimer: ReturnType<typeof setTimeout> | null = null
72
+ let pauseResolve: (() => void) | null = null
73
+ /** 递增后旧循环全部退出,避免 messages 变更时双循环 */
74
+ let loopGen = 0
75
+
76
+ function clearPauseTimer() {
77
+ if (pauseTimer != null) {
78
+ clearTimeout(pauseTimer)
79
+ pauseTimer = null
80
+ }
81
+ if (pauseResolve) {
82
+ const resolve = pauseResolve
83
+ pauseResolve = null
84
+ resolve()
85
+ }
86
+ }
87
+
88
+ function cancelAnim() {
89
+ anim?.cancel()
90
+ anim = null
91
+ }
92
+
93
+ function advanceIndex() {
94
+ const n = list.value.length
95
+ if (n <= 0) {
96
+ index.value = 0
97
+ return
98
+ }
99
+ index.value = (index.value + 1) % n
100
+ }
101
+
102
+ function sleep(ms: number) {
103
+ return new Promise<void>((resolve) => {
104
+ clearPauseTimer()
105
+ pauseResolve = resolve
106
+ pauseTimer = setTimeout(() => {
107
+ pauseTimer = null
108
+ pauseResolve = null
109
+ resolve()
110
+ }, ms)
111
+ })
112
+ }
113
+
114
+ async function waitWhileHovered(gen: number) {
115
+ while (hoverPaused.value && gen === loopGen) {
116
+ await sleep(100)
117
+ }
118
+ }
119
+
120
+ async function runOnce(gen: number): Promise<void> {
121
+ const viewport = viewportRef.value
122
+ const track = trackRef.value
123
+ if (!viewport || !track || !list.value.length || gen !== loopGen) return
124
+
125
+ await nextTick()
126
+ if (gen !== loopGen) return
127
+ await nextTick()
128
+ if (gen !== loopGen) return
129
+
130
+ const from = viewport.clientWidth
131
+ const textW = Math.max(track.scrollWidth, 1)
132
+ const to = -textW
133
+ const distance = from - to
134
+ const duration = Math.max(
135
+ 800,
136
+ Math.round((distance / Math.max(props.speed, 1)) * 1000),
137
+ )
138
+
139
+ cancelAnim()
140
+ // translateY(-50%) 与 top:50% 配合做垂直居中(动画不能只用 translateX)
141
+ const tx = (x: number) => `translateY(-50%) translateX(${x}px)`
142
+ track.style.transform = tx(from)
143
+
144
+ anim = track.animate(
145
+ [{ transform: tx(from) }, { transform: tx(to) }],
146
+ {
147
+ duration,
148
+ easing: 'linear',
149
+ fill: 'forwards',
150
+ },
151
+ )
152
+
153
+ if (hoverPaused.value) anim.pause()
154
+
155
+ try {
156
+ await anim.finished
157
+ } catch {
158
+ // cancel() 会 reject
159
+ } finally {
160
+ if (anim) anim = null
161
+ }
162
+ }
163
+
164
+ async function loop(gen: number) {
165
+ while (gen === loopGen && list.value.length) {
166
+ if (index.value >= list.value.length) index.value = 0
167
+ await runOnce(gen)
168
+ if (gen !== loopGen || !list.value.length) break
169
+ await waitWhileHovered(gen)
170
+ if (gen !== loopGen) break
171
+ await sleep(Math.max(0, props.pause))
172
+ if (gen !== loopGen) break
173
+ await waitWhileHovered(gen)
174
+ if (gen !== loopGen) break
175
+ advanceIndex()
176
+ }
177
+ }
178
+
179
+ function restart() {
180
+ loopGen += 1
181
+ const gen = loopGen
182
+ clearPauseTimer()
183
+ cancelAnim()
184
+ if (index.value >= list.value.length) index.value = 0
185
+ if (!list.value.length) return
186
+ void loop(gen)
187
+ }
188
+
189
+ function onEnter() {
190
+ if (!props.pauseOnHover) return
191
+ hoverPaused.value = true
192
+ anim?.pause()
193
+ }
194
+
195
+ function onLeave() {
196
+ if (!props.pauseOnHover) return
197
+ hoverPaused.value = false
198
+ anim?.play()
199
+ }
200
+
201
+ onMounted(() => {
202
+ restart()
203
+ })
204
+
205
+ onUnmounted(() => {
206
+ loopGen += 1
207
+ clearPauseTimer()
208
+ cancelAnim()
209
+ })
210
+
211
+ watch(
212
+ () => [props.messages, props.speed, props.pause] as const,
213
+ () => {
214
+ restart()
215
+ },
216
+ { deep: true },
217
+ )
218
+ </script>
219
+
220
+ <style lang="scss" scoped>
221
+ .vm-marquee {
222
+ display: flex;
223
+ align-items: center;
224
+ gap: 8px;
225
+ width: 100%;
226
+ min-width: 0;
227
+ min-height: var(--vm-control-height, 32px);
228
+ padding: 0 10px;
229
+ border: 1px solid var(--border);
230
+ border-radius: var(--vm-control-radius, 8px);
231
+ background: var(--muted);
232
+ color: var(--foreground);
233
+ overflow: hidden;
234
+ }
235
+
236
+ .vm-marquee__icon {
237
+ flex-shrink: 0;
238
+ display: inline-flex;
239
+ align-items: center;
240
+ justify-content: center;
241
+ color: var(--brand, #4e5dff);
242
+ font-size: 16px;
243
+ line-height: 1;
244
+ }
245
+
246
+ .vm-marquee__viewport {
247
+ position: relative;
248
+ flex: 1;
249
+ align-self: stretch;
250
+ min-width: 0;
251
+ min-height: 0;
252
+ overflow: hidden;
253
+ }
254
+
255
+ .vm-marquee__track {
256
+ position: absolute;
257
+ top: 50%;
258
+ left: 0;
259
+ white-space: nowrap;
260
+ font-size: 13px;
261
+ line-height: 1.5;
262
+ transform: translateY(-50%);
263
+ will-change: transform;
264
+ }
265
+ </style>