uview-ultra 4.5.46

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 (1015) hide show
  1. package/LICENSE +20 -0
  2. package/README.md +76 -0
  3. package/changelog.md +1421 -0
  4. package/components/up-action-sheet/actionSheet.js +26 -0
  5. package/components/up-action-sheet/actionSheet.uts +36 -0
  6. package/components/up-action-sheet/props.js +62 -0
  7. package/components/up-action-sheet/props.uts +66 -0
  8. package/components/up-action-sheet/types.uts +86 -0
  9. package/components/up-action-sheet/up-action-sheet.uvue +390 -0
  10. package/components/up-action-sheet/up-action-sheet.vue +348 -0
  11. package/components/up-action-sheet-data/up-action-sheet-data.uvue +112 -0
  12. package/components/up-action-sheet-data/up-action-sheet-data.vue +109 -0
  13. package/components/up-agreement/up-agreement.uvue +80 -0
  14. package/components/up-agreement/up-agreement.vue +91 -0
  15. package/components/up-album/album.js +28 -0
  16. package/components/up-album/album.uts +28 -0
  17. package/components/up-album/props.js +93 -0
  18. package/components/up-album/props.uts +84 -0
  19. package/components/up-album/up-album.uvue +377 -0
  20. package/components/up-album/up-album.vue +261 -0
  21. package/components/up-alert/alert.js +22 -0
  22. package/components/up-alert/alert.uts +22 -0
  23. package/components/up-alert/props.js +46 -0
  24. package/components/up-alert/props.uts +48 -0
  25. package/components/up-alert/up-alert.uvue +286 -0
  26. package/components/up-alert/up-alert.vue +231 -0
  27. package/components/up-avatar/avatar.js +28 -0
  28. package/components/up-avatar/avatar.uts +28 -0
  29. package/components/up-avatar/props.js +82 -0
  30. package/components/up-avatar/props.uts +82 -0
  31. package/components/up-avatar/up-avatar.uvue +242 -0
  32. package/components/up-avatar/up-avatar.vue +168 -0
  33. package/components/up-avatar-group/avatarGroup.js +23 -0
  34. package/components/up-avatar-group/avatarGroup.uts +23 -0
  35. package/components/up-avatar-group/props.js +54 -0
  36. package/components/up-avatar-group/props.uts +55 -0
  37. package/components/up-avatar-group/up-avatar-group.uvue +160 -0
  38. package/components/up-avatar-group/up-avatar-group.vue +109 -0
  39. package/components/up-back-top/backtop.js +27 -0
  40. package/components/up-back-top/backtop.uts +27 -0
  41. package/components/up-back-top/props.js +56 -0
  42. package/components/up-back-top/props.uts +57 -0
  43. package/components/up-back-top/up-back-top.uvue +161 -0
  44. package/components/up-back-top/up-back-top.vue +141 -0
  45. package/components/up-badge/badge.js +27 -0
  46. package/components/up-badge/badge.uts +27 -0
  47. package/components/up-badge/props.js +79 -0
  48. package/components/up-badge/props.uts +89 -0
  49. package/components/up-badge/up-badge.uvue +266 -0
  50. package/components/up-badge/up-badge.vue +157 -0
  51. package/components/up-barcode/up-barcode.uvue +818 -0
  52. package/components/up-barcode/up-barcode.vue +902 -0
  53. package/components/up-box/box.js +24 -0
  54. package/components/up-box/box.uts +24 -0
  55. package/components/up-box/props.js +57 -0
  56. package/components/up-box/props.uts +58 -0
  57. package/components/up-box/up-box.uvue +143 -0
  58. package/components/up-box/up-box.vue +104 -0
  59. package/components/up-button/button.js +42 -0
  60. package/components/up-button/button.uts +42 -0
  61. package/components/up-button/nvue.scss +46 -0
  62. package/components/up-button/props.js +155 -0
  63. package/components/up-button/props.uts +164 -0
  64. package/components/up-button/up-button.uvue +611 -0
  65. package/components/up-button/up-button.vue +456 -0
  66. package/components/up-button/vue.scss +85 -0
  67. package/components/up-calendar/calendar.js +75 -0
  68. package/components/up-calendar/calendar.uts +61 -0
  69. package/components/up-calendar/header.uvue +233 -0
  70. package/components/up-calendar/header.vue +239 -0
  71. package/components/up-calendar/month.uvue +565 -0
  72. package/components/up-calendar/month.vue +709 -0
  73. package/components/up-calendar/props.js +262 -0
  74. package/components/up-calendar/props.uts +244 -0
  75. package/components/up-calendar/types.uts +18 -0
  76. package/components/up-calendar/up-calendar.uvue +829 -0
  77. package/components/up-calendar/up-calendar.vue +922 -0
  78. package/components/up-calendar/util.js +86 -0
  79. package/components/up-calendar/util.uts +93 -0
  80. package/components/up-calendar-strip/calendarStrip.js +36 -0
  81. package/components/up-calendar-strip/props.js +70 -0
  82. package/components/up-calendar-strip/up-calendar-strip.vue +515 -0
  83. package/components/up-canvas/up-canvas.uvue +508 -0
  84. package/components/up-canvas/up-canvas.vue +655 -0
  85. package/components/up-car-keyboard/carKeyboard.js +15 -0
  86. package/components/up-car-keyboard/carKeyboard.uts +16 -0
  87. package/components/up-car-keyboard/props.js +17 -0
  88. package/components/up-car-keyboard/props.uts +27 -0
  89. package/components/up-car-keyboard/up-car-keyboard.uvue +369 -0
  90. package/components/up-car-keyboard/up-car-keyboard.vue +357 -0
  91. package/components/up-card/card.uts +58 -0
  92. package/components/up-card/props.js +140 -0
  93. package/components/up-card/props.uts +150 -0
  94. package/components/up-card/up-card.uvue +308 -0
  95. package/components/up-card/up-card.vue +188 -0
  96. package/components/up-cascader/up-cascader.uvue +427 -0
  97. package/components/up-cascader/up-cascader.vue +331 -0
  98. package/components/up-cate-tab/up-cate-tab.uvue +426 -0
  99. package/components/up-cate-tab/up-cate-tab.vue +374 -0
  100. package/components/up-cell/cell.js +35 -0
  101. package/components/up-cell/cell.uts +35 -0
  102. package/components/up-cell/props.js +113 -0
  103. package/components/up-cell/props.uts +108 -0
  104. package/components/up-cell/up-cell.uvue +336 -0
  105. package/components/up-cell/up-cell.vue +266 -0
  106. package/components/up-cell-group/cellGroup.js +16 -0
  107. package/components/up-cell-group/cellGroup.uts +16 -0
  108. package/components/up-cell-group/props.js +16 -0
  109. package/components/up-cell-group/props.uts +26 -0
  110. package/components/up-cell-group/up-cell-group.uvue +70 -0
  111. package/components/up-cell-group/up-cell-group.vue +72 -0
  112. package/components/up-checkbox/checkbox.js +27 -0
  113. package/components/up-checkbox/checkbox.uts +27 -0
  114. package/components/up-checkbox/props.js +76 -0
  115. package/components/up-checkbox/props.uts +77 -0
  116. package/components/up-checkbox/up-checkbox.uvue +533 -0
  117. package/components/up-checkbox/up-checkbox.vue +409 -0
  118. package/components/up-checkbox-group/checkboxGroup.js +29 -0
  119. package/components/up-checkbox-group/checkboxGroup.uts +29 -0
  120. package/components/up-checkbox-group/props.js +93 -0
  121. package/components/up-checkbox-group/props.uts +84 -0
  122. package/components/up-checkbox-group/up-checkbox-group.uvue +211 -0
  123. package/components/up-checkbox-group/up-checkbox-group.vue +185 -0
  124. package/components/up-choose/up-choose.uvue +130 -0
  125. package/components/up-choose/up-choose.vue +117 -0
  126. package/components/up-circle-progress/circleProgress.js +15 -0
  127. package/components/up-circle-progress/props.js +10 -0
  128. package/components/up-circle-progress/up-circle-progress.vue +187 -0
  129. package/components/up-city-locate/up-city-locate.uvue +188 -0
  130. package/components/up-city-locate/up-city-locate.vue +162 -0
  131. package/components/up-code/code.js +21 -0
  132. package/components/up-code/code.uts +20 -0
  133. package/components/up-code/props.js +36 -0
  134. package/components/up-code/props.uts +47 -0
  135. package/components/up-code/up-code.uvue +184 -0
  136. package/components/up-code/up-code.vue +117 -0
  137. package/components/up-code-input/codeInput.js +29 -0
  138. package/components/up-code-input/codeInput.uts +29 -0
  139. package/components/up-code-input/props.js +90 -0
  140. package/components/up-code-input/props.uts +83 -0
  141. package/components/up-code-input/up-code-input.uvue +365 -0
  142. package/components/up-code-input/up-code-input.vue +269 -0
  143. package/components/up-col/col.js +19 -0
  144. package/components/up-col/col.uts +19 -0
  145. package/components/up-col/props.js +32 -0
  146. package/components/up-col/props.uts +41 -0
  147. package/components/up-col/up-col.uvue +215 -0
  148. package/components/up-col/up-col.vue +160 -0
  149. package/components/up-collapse/collapse.js +17 -0
  150. package/components/up-collapse/collapse.uts +17 -0
  151. package/components/up-collapse/props.js +21 -0
  152. package/components/up-collapse/props.uts +23 -0
  153. package/components/up-collapse/up-collapse.uvue +133 -0
  154. package/components/up-collapse/up-collapse.vue +116 -0
  155. package/components/up-collapse-item/collapseItem.js +26 -0
  156. package/components/up-collapse-item/collapseItem.uts +26 -0
  157. package/components/up-collapse-item/props.js +66 -0
  158. package/components/up-collapse-item/props.uts +69 -0
  159. package/components/up-collapse-item/up-collapse-item.uvue +294 -0
  160. package/components/up-collapse-item/up-collapse-item.vue +279 -0
  161. package/components/up-color-picker/up-color-picker.uvue +1045 -0
  162. package/components/up-color-picker/up-color-picker.vue +1081 -0
  163. package/components/up-column-notice/columnNotice.js +24 -0
  164. package/components/up-column-notice/columnNotice.uts +24 -0
  165. package/components/up-column-notice/props.js +57 -0
  166. package/components/up-column-notice/props.uts +59 -0
  167. package/components/up-column-notice/up-column-notice.uvue +198 -0
  168. package/components/up-column-notice/up-column-notice.vue +162 -0
  169. package/components/up-copy/up-copy.uvue +77 -0
  170. package/components/up-copy/up-copy.vue +75 -0
  171. package/components/up-count-down/countDown.js +18 -0
  172. package/components/up-count-down/countDown.uts +18 -0
  173. package/components/up-count-down/props.js +26 -0
  174. package/components/up-count-down/props.uts +37 -0
  175. package/components/up-count-down/up-count-down.uvue +198 -0
  176. package/components/up-count-down/up-count-down.vue +186 -0
  177. package/components/up-count-down/utils.js +62 -0
  178. package/components/up-count-down/utils.uts +67 -0
  179. package/components/up-count-to/countTo.js +25 -0
  180. package/components/up-count-to/countTo.uts +25 -0
  181. package/components/up-count-to/props.js +61 -0
  182. package/components/up-count-to/props.uts +72 -0
  183. package/components/up-count-to/up-count-to.uvue +309 -0
  184. package/components/up-count-to/up-count-to.vue +209 -0
  185. package/components/up-coupon/up-coupon.uvue +346 -0
  186. package/components/up-coupon/up-coupon.vue +415 -0
  187. package/components/up-cropper/up-cropper.uvue +899 -0
  188. package/components/up-cropper/up-cropper.vue +1392 -0
  189. package/components/up-datetime-picker/datetimePicker.js +40 -0
  190. package/components/up-datetime-picker/datetimePicker.uts +45 -0
  191. package/components/up-datetime-picker/dayjs.esm.min.js +7 -0
  192. package/components/up-datetime-picker/props.js +165 -0
  193. package/components/up-datetime-picker/props.uts +169 -0
  194. package/components/up-datetime-picker/up-datetime-picker.uvue +960 -0
  195. package/components/up-datetime-picker/up-datetime-picker.vue +765 -0
  196. package/components/up-divider/divider.js +23 -0
  197. package/components/up-divider/divider.uts +22 -0
  198. package/components/up-divider/props.js +46 -0
  199. package/components/up-divider/props.uts +57 -0
  200. package/components/up-divider/up-divider.uvue +151 -0
  201. package/components/up-divider/up-divider.vue +112 -0
  202. package/components/up-dragsort/up-dragsort.uvue +821 -0
  203. package/components/up-dragsort/up-dragsort.vue +410 -0
  204. package/components/up-dropdown/dropdown.uts +25 -0
  205. package/components/up-dropdown/props.js +61 -0
  206. package/components/up-dropdown/props.uts +72 -0
  207. package/components/up-dropdown/types.uts +5 -0
  208. package/components/up-dropdown/up-dropdown.uvue +366 -0
  209. package/components/up-dropdown/up-dropdown.vue +297 -0
  210. package/components/up-dropdown-item/dropdown-item.uts +25 -0
  211. package/components/up-dropdown-item/props.js +47 -0
  212. package/components/up-dropdown-item/props.uts +56 -0
  213. package/components/up-dropdown-item/up-dropdown-item.uvue +196 -0
  214. package/components/up-dropdown-item/up-dropdown-item.vue +123 -0
  215. package/components/up-empty/empty.js +26 -0
  216. package/components/up-empty/empty.uts +24 -0
  217. package/components/up-empty/props.js +61 -0
  218. package/components/up-empty/props.uts +71 -0
  219. package/components/up-empty/up-empty.uvue +193 -0
  220. package/components/up-empty/up-empty.vue +116 -0
  221. package/components/up-flex/flex.js +10 -0
  222. package/components/up-flex/flex.uts +10 -0
  223. package/components/up-flex/props.js +12 -0
  224. package/components/up-flex/props.uts +13 -0
  225. package/components/up-flex/up-flex.uvue +71 -0
  226. package/components/up-flex/up-flex.vue +62 -0
  227. package/components/up-float-button/up-float-button.uvue +194 -0
  228. package/components/up-float-button/up-float-button.vue +160 -0
  229. package/components/up-form/form.js +22 -0
  230. package/components/up-form/form.uts +22 -0
  231. package/components/up-form/props.js +47 -0
  232. package/components/up-form/props.uts +57 -0
  233. package/components/up-form/types.uts +18 -0
  234. package/components/up-form/up-form.uvue +480 -0
  235. package/components/up-form/up-form.vue +297 -0
  236. package/components/up-form-item/formItem.js +24 -0
  237. package/components/up-form-item/formItem.uts +24 -0
  238. package/components/up-form-item/props.js +55 -0
  239. package/components/up-form-item/props.uts +65 -0
  240. package/components/up-form-item/up-form-item.uvue +349 -0
  241. package/components/up-form-item/up-form-item.vue +276 -0
  242. package/components/up-gap/gap.js +19 -0
  243. package/components/up-gap/gap.uts +19 -0
  244. package/components/up-gap/props.js +27 -0
  245. package/components/up-gap/props.uts +36 -0
  246. package/components/up-gap/up-gap.uvue +53 -0
  247. package/components/up-gap/up-gap.vue +38 -0
  248. package/components/up-goods-sku/up-goods-sku.uvue +564 -0
  249. package/components/up-goods-sku/up-goods-sku.vue +436 -0
  250. package/components/up-grid/grid.js +17 -0
  251. package/components/up-grid/grid.uts +17 -0
  252. package/components/up-grid/props.js +29 -0
  253. package/components/up-grid/props.uts +37 -0
  254. package/components/up-grid/up-grid.uvue +161 -0
  255. package/components/up-grid/up-grid.vue +119 -0
  256. package/components/up-grid-item/gridItem.js +16 -0
  257. package/components/up-grid-item/gridItem.uts +16 -0
  258. package/components/up-grid-item/props.js +16 -0
  259. package/components/up-grid-item/props.uts +27 -0
  260. package/components/up-grid-item/up-grid-item.uvue +227 -0
  261. package/components/up-grid-item/up-grid-item.vue +244 -0
  262. package/components/up-guide/guide.js +16 -0
  263. package/components/up-guide/props.js +53 -0
  264. package/components/up-guide/up-guide.vue +274 -0
  265. package/components/up-icon/icon.js +36 -0
  266. package/components/up-icon/icon.uts +33 -0
  267. package/components/up-icon/icons.js +426 -0
  268. package/components/up-icon/icons.uts +222 -0
  269. package/components/up-icon/props.js +92 -0
  270. package/components/up-icon/props.uts +101 -0
  271. package/components/up-icon/up-icon.uvue +300 -0
  272. package/components/up-icon/up-icon.vue +259 -0
  273. package/components/up-icon/upicon.ttf +0 -0
  274. package/components/up-icon/util.js +212 -0
  275. package/components/up-image/image.js +30 -0
  276. package/components/up-image/image.uts +30 -0
  277. package/components/up-image/props.js +87 -0
  278. package/components/up-image/props.uts +88 -0
  279. package/components/up-image/up-image.uvue +254 -0
  280. package/components/up-image/up-image.vue +253 -0
  281. package/components/up-index-anchor/indexAnchor.js +19 -0
  282. package/components/up-index-anchor/indexAnchor.uts +19 -0
  283. package/components/up-index-anchor/props.js +31 -0
  284. package/components/up-index-anchor/props.uts +41 -0
  285. package/components/up-index-anchor/up-index-anchor.uvue +146 -0
  286. package/components/up-index-anchor/up-index-anchor.vue +124 -0
  287. package/components/up-index-item/indexItem.uts +15 -0
  288. package/components/up-index-item/props.js +8 -0
  289. package/components/up-index-item/props.uts +15 -0
  290. package/components/up-index-item/up-index-item.uvue +109 -0
  291. package/components/up-index-item/up-index-item.vue +105 -0
  292. package/components/up-index-list/indexList.js +21 -0
  293. package/components/up-index-list/indexList.uts +21 -0
  294. package/components/up-index-list/props.js +41 -0
  295. package/components/up-index-list/props.uts +51 -0
  296. package/components/up-index-list/up-index-list.uvue +594 -0
  297. package/components/up-index-list/up-index-list.vue +643 -0
  298. package/components/up-input/input.js +48 -0
  299. package/components/up-input/input.uts +49 -0
  300. package/components/up-input/props.js +198 -0
  301. package/components/up-input/props.uts +198 -0
  302. package/components/up-input/up-input.uvue +571 -0
  303. package/components/up-input/up-input.vue +441 -0
  304. package/components/up-keyboard/keyboard.js +30 -0
  305. package/components/up-keyboard/keyboard.uts +30 -0
  306. package/components/up-keyboard/props.js +86 -0
  307. package/components/up-keyboard/props.uts +97 -0
  308. package/components/up-keyboard/up-keyboard.uvue +253 -0
  309. package/components/up-keyboard/up-keyboard.vue +188 -0
  310. package/components/up-lazy-load/lazyLoad.uts +19 -0
  311. package/components/up-lazy-load/props.uts +74 -0
  312. package/components/up-lazy-load/up-lazy-load.uvue +340 -0
  313. package/components/up-lazy-load/up-lazy-load.vue +280 -0
  314. package/components/up-line/line.js +20 -0
  315. package/components/up-line/line.uts +20 -0
  316. package/components/up-line/props.js +36 -0
  317. package/components/up-line/props.uts +37 -0
  318. package/components/up-line/up-line.uvue +97 -0
  319. package/components/up-line/up-line.vue +61 -0
  320. package/components/up-line-progress/lineProgress.js +19 -0
  321. package/components/up-line-progress/lineProgress.uts +9 -0
  322. package/components/up-line-progress/props.js +30 -0
  323. package/components/up-line-progress/up-line-progress.uvue +165 -0
  324. package/components/up-line-progress/up-line-progress.vue +155 -0
  325. package/components/up-link/link.js +26 -0
  326. package/components/up-link/link.uts +23 -0
  327. package/components/up-link/props.js +41 -0
  328. package/components/up-link/props.uts +43 -0
  329. package/components/up-link/up-link.uvue +136 -0
  330. package/components/up-link/up-link.vue +75 -0
  331. package/components/up-list/list.js +28 -0
  332. package/components/up-list/list.uts +33 -0
  333. package/components/up-list/props.js +101 -0
  334. package/components/up-list/props.uts +111 -0
  335. package/components/up-list/up-list.uvue +255 -0
  336. package/components/up-list/up-list.vue +230 -0
  337. package/components/up-list-item/listItem.js +15 -0
  338. package/components/up-list-item/listItem.uts +15 -0
  339. package/components/up-list-item/props.js +11 -0
  340. package/components/up-list-item/props.uts +21 -0
  341. package/components/up-list-item/up-list-item.uvue +126 -0
  342. package/components/up-list-item/up-list-item.vue +155 -0
  343. package/components/up-loading-icon/loadingIcon.js +30 -0
  344. package/components/up-loading-icon/loadingIcon.uts +28 -0
  345. package/components/up-loading-icon/props.js +62 -0
  346. package/components/up-loading-icon/props.uts +71 -0
  347. package/components/up-loading-icon/up-loading-icon.uvue +439 -0
  348. package/components/up-loading-icon/up-loading-icon.vue +357 -0
  349. package/components/up-loading-page/loadingPage.js +24 -0
  350. package/components/up-loading-page/loadingPage.uts +24 -0
  351. package/components/up-loading-page/props.js +57 -0
  352. package/components/up-loading-page/props.uts +58 -0
  353. package/components/up-loading-page/up-loading-page.uvue +197 -0
  354. package/components/up-loading-page/up-loading-page.vue +109 -0
  355. package/components/up-loadmore/loadmore.js +32 -0
  356. package/components/up-loadmore/loadmore.uts +32 -0
  357. package/components/up-loadmore/props.js +96 -0
  358. package/components/up-loadmore/props.uts +107 -0
  359. package/components/up-loadmore/up-loadmore.uvue +247 -0
  360. package/components/up-loadmore/up-loadmore.vue +132 -0
  361. package/components/up-markdown/marked.esm.js +7 -0
  362. package/components/up-markdown/up-markdown.uvue +171 -0
  363. package/components/up-markdown/up-markdown.vue +289 -0
  364. package/components/up-message-input/up-message-input.uvue +113 -0
  365. package/components/up-message-input/up-message-input.vue +111 -0
  366. package/components/up-modal/modal.js +36 -0
  367. package/components/up-modal/modal.uts +36 -0
  368. package/components/up-modal/props.js +111 -0
  369. package/components/up-modal/props.uts +113 -0
  370. package/components/up-modal/up-modal.uvue +407 -0
  371. package/components/up-modal/up-modal.vue +268 -0
  372. package/components/up-navbar/navbar.js +33 -0
  373. package/components/up-navbar/navbar.uts +34 -0
  374. package/components/up-navbar/props.js +97 -0
  375. package/components/up-navbar/props.uts +98 -0
  376. package/components/up-navbar/theme-vars.scss +26 -0
  377. package/components/up-navbar/up-navbar.uvue +467 -0
  378. package/components/up-navbar/up-navbar.vue +316 -0
  379. package/components/up-navbar-mini/navbarMini.js +23 -0
  380. package/components/up-navbar-mini/navbarMini.uts +23 -0
  381. package/components/up-navbar-mini/props.js +51 -0
  382. package/components/up-navbar-mini/props.uts +53 -0
  383. package/components/up-navbar-mini/up-navbar-mini.uvue +184 -0
  384. package/components/up-navbar-mini/up-navbar-mini.vue +135 -0
  385. package/components/up-no-network/noNetwork.js +18 -0
  386. package/components/up-no-network/noNetwork.uts +18 -0
  387. package/components/up-no-network/props.js +21 -0
  388. package/components/up-no-network/props.uts +31 -0
  389. package/components/up-no-network/up-no-network.uvue +218 -0
  390. package/components/up-no-network/up-no-network.vue +231 -0
  391. package/components/up-notice-bar/noticeBar.js +27 -0
  392. package/components/up-notice-bar/noticeBar.uts +27 -0
  393. package/components/up-notice-bar/props.js +72 -0
  394. package/components/up-notice-bar/props.uts +74 -0
  395. package/components/up-notice-bar/theme-vars.scss +25 -0
  396. package/components/up-notice-bar/up-notice-bar.uvue +179 -0
  397. package/components/up-notice-bar/up-notice-bar.vue +110 -0
  398. package/components/up-notify/notify.js +22 -0
  399. package/components/up-notify/notify.uts +22 -0
  400. package/components/up-notify/props.js +51 -0
  401. package/components/up-notify/props.uts +56 -0
  402. package/components/up-notify/up-notify.uvue +327 -0
  403. package/components/up-notify/up-notify.vue +248 -0
  404. package/components/up-novel-reader/content-normalizer.js +80 -0
  405. package/components/up-novel-reader/content-normalizer.uts +112 -0
  406. package/components/up-novel-reader/layout-engine.js +222 -0
  407. package/components/up-novel-reader/layout-engine.uts +256 -0
  408. package/components/up-novel-reader/measure-adapter.js +69 -0
  409. package/components/up-novel-reader/measure-adapter.uts +56 -0
  410. package/components/up-novel-reader/novelReader.js +35 -0
  411. package/components/up-novel-reader/novelReader.uts +37 -0
  412. package/components/up-novel-reader/persistence.js +143 -0
  413. package/components/up-novel-reader/persistence.uts +137 -0
  414. package/components/up-novel-reader/props.js +97 -0
  415. package/components/up-novel-reader/props.uts +97 -0
  416. package/components/up-novel-reader/reader-catalog.uvue +92 -0
  417. package/components/up-novel-reader/reader-catalog.vue +202 -0
  418. package/components/up-novel-reader/reader-content.uvue +167 -0
  419. package/components/up-novel-reader/reader-content.vue +227 -0
  420. package/components/up-novel-reader/reader-core.js +158 -0
  421. package/components/up-novel-reader/reader-core.uts +175 -0
  422. package/components/up-novel-reader/reader-settings.uvue +136 -0
  423. package/components/up-novel-reader/reader-settings.vue +215 -0
  424. package/components/up-novel-reader/reader-toolbar.uvue +127 -0
  425. package/components/up-novel-reader/reader-toolbar.vue +303 -0
  426. package/components/up-novel-reader/theme-vars.scss +49 -0
  427. package/components/up-novel-reader/up-novel-reader.uvue +831 -0
  428. package/components/up-novel-reader/up-novel-reader.vue +760 -0
  429. package/components/up-number-box/numberBox.js +40 -0
  430. package/components/up-number-box/numberBox.uts +40 -0
  431. package/components/up-number-box/props.js +145 -0
  432. package/components/up-number-box/props.uts +148 -0
  433. package/components/up-number-box/up-number-box.uvue +630 -0
  434. package/components/up-number-box/up-number-box.vue +417 -0
  435. package/components/up-number-keyboard/numberKeyboard.js +17 -0
  436. package/components/up-number-keyboard/numberKeyboard.uts +17 -0
  437. package/components/up-number-keyboard/props.js +21 -0
  438. package/components/up-number-keyboard/props.uts +32 -0
  439. package/components/up-number-keyboard/up-number-keyboard.uvue +223 -0
  440. package/components/up-number-keyboard/up-number-keyboard.vue +234 -0
  441. package/components/up-overlay/overlay.js +18 -0
  442. package/components/up-overlay/overlay.uts +18 -0
  443. package/components/up-overlay/props.js +26 -0
  444. package/components/up-overlay/props.uts +28 -0
  445. package/components/up-overlay/up-overlay.uvue +96 -0
  446. package/components/up-overlay/up-overlay.vue +67 -0
  447. package/components/up-pagination/up-pagination.uvue +417 -0
  448. package/components/up-pagination/up-pagination.vue +283 -0
  449. package/components/up-parse/node/node.vue +599 -0
  450. package/components/up-parse/parse.js +22 -0
  451. package/components/up-parse/parser.js +1334 -0
  452. package/components/up-parse/props.js +48 -0
  453. package/components/up-parse/props.uts +68 -0
  454. package/components/up-parse/up-parse.uvue +561 -0
  455. package/components/up-parse/up-parse.vue +554 -0
  456. package/components/up-pdf-reader/props.js +19 -0
  457. package/components/up-pdf-reader/props.uts +19 -0
  458. package/components/up-pdf-reader/up-pdf-reader.uvue +83 -0
  459. package/components/up-pdf-reader/up-pdf-reader.vue +58 -0
  460. package/components/up-picker/picker.js +31 -0
  461. package/components/up-picker/picker.uts +31 -0
  462. package/components/up-picker/props.js +108 -0
  463. package/components/up-picker/props.uts +119 -0
  464. package/components/up-picker/up-picker.uvue +550 -0
  465. package/components/up-picker/up-picker.vue +336 -0
  466. package/components/up-picker-column/props.js +7 -0
  467. package/components/up-picker-column/props.uts +7 -0
  468. package/components/up-picker-column/up-picker-column.uvue +25 -0
  469. package/components/up-picker-column/up-picker-column.vue +36 -0
  470. package/components/up-picker-data/up-picker-data.uvue +149 -0
  471. package/components/up-picker-data/up-picker-data.vue +137 -0
  472. package/components/up-popover/props.js +59 -0
  473. package/components/up-popover/props.uts +58 -0
  474. package/components/up-popover/up-popover.uvue +161 -0
  475. package/components/up-popover/up-popover.vue +109 -0
  476. package/components/up-popup/popup.js +30 -0
  477. package/components/up-popup/popup.uts +29 -0
  478. package/components/up-popup/props.js +86 -0
  479. package/components/up-popup/props.uts +96 -0
  480. package/components/up-popup/up-popup.uvue +433 -0
  481. package/components/up-popup/up-popup.vue +378 -0
  482. package/components/up-poster/up-poster.uvue +944 -0
  483. package/components/up-poster/up-poster.vue +628 -0
  484. package/components/up-pull-refresh/up-pull-refresh.uvue +326 -0
  485. package/components/up-pull-refresh/up-pull-refresh.vue +319 -0
  486. package/components/up-qrcode/qrcode.js +1275 -0
  487. package/components/up-qrcode/qrcode.uts +480 -0
  488. package/components/up-qrcode/up-qrcode.uvue +502 -0
  489. package/components/up-qrcode/up-qrcode.vue +493 -0
  490. package/components/up-radio/props.js +71 -0
  491. package/components/up-radio/props.uts +81 -0
  492. package/components/up-radio/radio.js +27 -0
  493. package/components/up-radio/radio.uts +27 -0
  494. package/components/up-radio/up-radio.uvue +512 -0
  495. package/components/up-radio/up-radio.vue +382 -0
  496. package/components/up-radio-group/props.js +95 -0
  497. package/components/up-radio-group/props.uts +90 -0
  498. package/components/up-radio-group/radioGroup.js +30 -0
  499. package/components/up-radio-group/radioGroup.uts +30 -0
  500. package/components/up-radio-group/up-radio-group.uvue +211 -0
  501. package/components/up-radio-group/up-radio-group.vue +184 -0
  502. package/components/up-rate/props.js +80 -0
  503. package/components/up-rate/props.uts +82 -0
  504. package/components/up-rate/rate.js +26 -0
  505. package/components/up-rate/rate.uts +27 -0
  506. package/components/up-rate/up-rate.uvue +484 -0
  507. package/components/up-rate/up-rate.vue +367 -0
  508. package/components/up-read-more/props.js +63 -0
  509. package/components/up-read-more/props.uts +61 -0
  510. package/components/up-read-more/readMore.js +23 -0
  511. package/components/up-read-more/readMore.uts +23 -0
  512. package/components/up-read-more/up-read-more.uvue +252 -0
  513. package/components/up-read-more/up-read-more.vue +169 -0
  514. package/components/up-refresh-virtual-list/up-refresh-virtual-list.uvue +95 -0
  515. package/components/up-refresh-virtual-list/up-refresh-virtual-list.vue +100 -0
  516. package/components/up-root-toast-host/up-root-toast-host.vue +12 -0
  517. package/components/up-row/props.js +22 -0
  518. package/components/up-row/props.uts +31 -0
  519. package/components/up-row/row.js +17 -0
  520. package/components/up-row/row.uts +17 -0
  521. package/components/up-row/up-row.uvue +137 -0
  522. package/components/up-row/up-row.vue +104 -0
  523. package/components/up-row-notice/props.js +41 -0
  524. package/components/up-row-notice/props.uts +43 -0
  525. package/components/up-row-notice/rowNotice.js +21 -0
  526. package/components/up-row-notice/rowNotice.uts +21 -0
  527. package/components/up-row-notice/up-row-notice.uvue +310 -0
  528. package/components/up-row-notice/up-row-notice.vue +346 -0
  529. package/components/up-safe-bottom/props.js +7 -0
  530. package/components/up-safe-bottom/props.uts +6 -0
  531. package/components/up-safe-bottom/up-safe-bottom.uvue +60 -0
  532. package/components/up-safe-bottom/up-safe-bottom.vue +54 -0
  533. package/components/up-scroll-list/nvue.js +31 -0
  534. package/components/up-scroll-list/props.js +36 -0
  535. package/components/up-scroll-list/props.uts +38 -0
  536. package/components/up-scroll-list/scrollList.js +20 -0
  537. package/components/up-scroll-list/scrollList.uts +20 -0
  538. package/components/up-scroll-list/scrollWxs.wxs +50 -0
  539. package/components/up-scroll-list/up-scroll-list.uvue +262 -0
  540. package/components/up-scroll-list/up-scroll-list.vue +253 -0
  541. package/components/up-search/props.js +156 -0
  542. package/components/up-search/props.uts +152 -0
  543. package/components/up-search/search.js +41 -0
  544. package/components/up-search/search.uts +41 -0
  545. package/components/up-search/up-search.uvue +537 -0
  546. package/components/up-search/up-search.vue +347 -0
  547. package/components/up-section/section.js +16 -0
  548. package/components/up-section/section.uts +16 -0
  549. package/components/up-select/up-select.uvue +323 -0
  550. package/components/up-select/up-select.vue +239 -0
  551. package/components/up-short-video/up-short-video.uvue +659 -0
  552. package/components/up-short-video/up-short-video.vue +488 -0
  553. package/components/up-signature/up-signature.uvue +563 -0
  554. package/components/up-signature/up-signature.vue +534 -0
  555. package/components/up-skeleton/props.js +61 -0
  556. package/components/up-skeleton/props.uts +69 -0
  557. package/components/up-skeleton/skeleton.js +25 -0
  558. package/components/up-skeleton/skeleton.uts +22 -0
  559. package/components/up-skeleton/up-skeleton.uvue +279 -0
  560. package/components/up-skeleton/up-skeleton.vue +246 -0
  561. package/components/up-slider/props.js +95 -0
  562. package/components/up-slider/props.uts +102 -0
  563. package/components/up-slider/slider.js +28 -0
  564. package/components/up-slider/slider.uts +25 -0
  565. package/components/up-slider/up-slider.uvue +679 -0
  566. package/components/up-slider/up-slider.vue +524 -0
  567. package/components/up-status-bar/props.js +10 -0
  568. package/components/up-status-bar/props.uts +12 -0
  569. package/components/up-status-bar/statusBar.js +15 -0
  570. package/components/up-status-bar/statusBar.uts +15 -0
  571. package/components/up-status-bar/up-status-bar.uvue +52 -0
  572. package/components/up-status-bar/up-status-bar.vue +46 -0
  573. package/components/up-steps/props.js +41 -0
  574. package/components/up-steps/props.uts +43 -0
  575. package/components/up-steps/steps.js +21 -0
  576. package/components/up-steps/steps.uts +22 -0
  577. package/components/up-steps/up-steps.uvue +153 -0
  578. package/components/up-steps/up-steps.vue +118 -0
  579. package/components/up-steps-item/props.js +31 -0
  580. package/components/up-steps-item/props.uts +33 -0
  581. package/components/up-steps-item/stepsItem.js +18 -0
  582. package/components/up-steps-item/stepsItem.uts +18 -0
  583. package/components/up-steps-item/up-steps-item.uvue +448 -0
  584. package/components/up-steps-item/up-steps-item.vue +349 -0
  585. package/components/up-sticky/props.js +42 -0
  586. package/components/up-sticky/props.uts +52 -0
  587. package/components/up-sticky/sticky.js +20 -0
  588. package/components/up-sticky/sticky.uts +20 -0
  589. package/components/up-sticky/up-sticky.uvue +238 -0
  590. package/components/up-sticky/up-sticky.vue +220 -0
  591. package/components/up-subsection/props.js +66 -0
  592. package/components/up-subsection/props.uts +68 -0
  593. package/components/up-subsection/subsection.js +26 -0
  594. package/components/up-subsection/subsection.uts +26 -0
  595. package/components/up-subsection/theme-vars.scss +41 -0
  596. package/components/up-subsection/up-subsection.uvue +404 -0
  597. package/components/up-subsection/up-subsection.vue +327 -0
  598. package/components/up-swipe-action/props.js +16 -0
  599. package/components/up-swipe-action/props.uts +18 -0
  600. package/components/up-swipe-action/swipeAction.js +15 -0
  601. package/components/up-swipe-action/swipeAction.uts +16 -0
  602. package/components/up-swipe-action/up-swipe-action.uvue +105 -0
  603. package/components/up-swipe-action/up-swipe-action.vue +95 -0
  604. package/components/up-swipe-action-item/alipay.sjs +229 -0
  605. package/components/up-swipe-action-item/index.wxs +252 -0
  606. package/components/up-swipe-action-item/nvue.js +174 -0
  607. package/components/up-swipe-action-item/other.js +178 -0
  608. package/components/up-swipe-action-item/other.uts +176 -0
  609. package/components/up-swipe-action-item/props.js +52 -0
  610. package/components/up-swipe-action-item/props.uts +53 -0
  611. package/components/up-swipe-action-item/swipeActionItem.js +23 -0
  612. package/components/up-swipe-action-item/swipeActionItem.uts +24 -0
  613. package/components/up-swipe-action-item/types.uts +11 -0
  614. package/components/up-swipe-action-item/up-swipe-action-item.uvue +476 -0
  615. package/components/up-swipe-action-item/up-swipe-action-item.vue +752 -0
  616. package/components/up-swipe-action-item/wxs.js +15 -0
  617. package/components/up-swiper/props.js +132 -0
  618. package/components/up-swiper/props.uts +142 -0
  619. package/components/up-swiper/swiper.js +40 -0
  620. package/components/up-swiper/swiper.uts +39 -0
  621. package/components/up-swiper/up-swiper.uvue +455 -0
  622. package/components/up-swiper/up-swiper.vue +274 -0
  623. package/components/up-swiper-indicator/props.js +31 -0
  624. package/components/up-swiper-indicator/props.uts +41 -0
  625. package/components/up-swiper-indicator/swipterIndicator.js +19 -0
  626. package/components/up-swiper-indicator/swipterIndicator.uts +19 -0
  627. package/components/up-swiper-indicator/up-swiper-indicator.uvue +147 -0
  628. package/components/up-swiper-indicator/up-swiper-indicator.vue +112 -0
  629. package/components/up-switch/props.js +64 -0
  630. package/components/up-switch/props.uts +82 -0
  631. package/components/up-switch/switch.js +24 -0
  632. package/components/up-switch/switch.uts +27 -0
  633. package/components/up-switch/theme-vars.scss +41 -0
  634. package/components/up-switch/up-switch.uvue +257 -0
  635. package/components/up-switch/up-switch.vue +211 -0
  636. package/components/up-tabbar/props.js +57 -0
  637. package/components/up-tabbar/props.uts +66 -0
  638. package/components/up-tabbar/tabbar.js +24 -0
  639. package/components/up-tabbar/tabbar.uts +24 -0
  640. package/components/up-tabbar/up-tabbar.uvue +254 -0
  641. package/components/up-tabbar/up-tabbar.vue +208 -0
  642. package/components/up-tabbar-item/midButtonGeometry.js +23 -0
  643. package/components/up-tabbar-item/midButtonGeometry.uts +15 -0
  644. package/components/up-tabbar-item/props.js +71 -0
  645. package/components/up-tabbar-item/props.uts +81 -0
  646. package/components/up-tabbar-item/tabbarItem.js +27 -0
  647. package/components/up-tabbar-item/tabbarItem.uts +27 -0
  648. package/components/up-tabbar-item/up-tabbar-item.uvue +554 -0
  649. package/components/up-tabbar-item/up-tabbar-item.vue +428 -0
  650. package/components/up-table/props.js +7 -0
  651. package/components/up-table/props.uts +39 -0
  652. package/components/up-table/table.uts +21 -0
  653. package/components/up-table/up-table.uvue +128 -0
  654. package/components/up-table/up-table.vue +132 -0
  655. package/components/up-table2/tableRow.uvue +389 -0
  656. package/components/up-table2/tableRow.vue +329 -0
  657. package/components/up-table2/up-table2.uvue +1504 -0
  658. package/components/up-table2/up-table2.vue +911 -0
  659. package/components/up-tabs/props.js +76 -0
  660. package/components/up-tabs/props.uts +73 -0
  661. package/components/up-tabs/tabs.js +34 -0
  662. package/components/up-tabs/tabs.uts +35 -0
  663. package/components/up-tabs/types.uts +19 -0
  664. package/components/up-tabs/up-tabs.uvue +691 -0
  665. package/components/up-tabs/up-tabs.vue +561 -0
  666. package/components/up-tabs-item/props.js +7 -0
  667. package/components/up-tabs-item/props.uts +7 -0
  668. package/components/up-tabs-item/up-tabs-item.uvue +23 -0
  669. package/components/up-tabs-item/up-tabs-item.vue +34 -0
  670. package/components/up-tabs-pro/up-tabs-pro.uvue +242 -0
  671. package/components/up-tabs-pro/up-tabs-pro.vue +202 -0
  672. package/components/up-tag/props.js +91 -0
  673. package/components/up-tag/props.uts +100 -0
  674. package/components/up-tag/tag.js +30 -0
  675. package/components/up-tag/tag.uts +30 -0
  676. package/components/up-tag/theme-vars.scss +21 -0
  677. package/components/up-tag/up-tag.uvue +469 -0
  678. package/components/up-tag/up-tag.vue +377 -0
  679. package/components/up-td/props.js +7 -0
  680. package/components/up-td/props.uts +7 -0
  681. package/components/up-td/td.uts +19 -0
  682. package/components/up-td/up-td.uvue +124 -0
  683. package/components/up-td/up-td.vue +99 -0
  684. package/components/up-text/props.js +123 -0
  685. package/components/up-text/props.uts +159 -0
  686. package/components/up-text/text.js +40 -0
  687. package/components/up-text/text.uts +45 -0
  688. package/components/up-text/up-text.uvue +536 -0
  689. package/components/up-text/up-text.vue +365 -0
  690. package/components/up-text/value.js +87 -0
  691. package/components/up-textarea/props.js +132 -0
  692. package/components/up-textarea/props.uts +130 -0
  693. package/components/up-textarea/textarea.js +40 -0
  694. package/components/up-textarea/textarea.uts +40 -0
  695. package/components/up-textarea/up-textarea.uvue +440 -0
  696. package/components/up-textarea/up-textarea.vue +294 -0
  697. package/components/up-th/props.js +7 -0
  698. package/components/up-th/props.uts +7 -0
  699. package/components/up-th/th.uts +16 -0
  700. package/components/up-th/up-th.uvue +93 -0
  701. package/components/up-th/up-th.vue +69 -0
  702. package/components/up-title/up-title.uvue +27 -0
  703. package/components/up-title/up-title.vue +38 -0
  704. package/components/up-toast/toast.js +30 -0
  705. package/components/up-toast/toast.uts +29 -0
  706. package/components/up-toast/up-toast.uvue +390 -0
  707. package/components/up-toast/up-toast.vue +354 -0
  708. package/components/up-toolbar/props.js +41 -0
  709. package/components/up-toolbar/props.uts +43 -0
  710. package/components/up-toolbar/toolbar.js +21 -0
  711. package/components/up-toolbar/toolbar.uts +20 -0
  712. package/components/up-toolbar/up-toolbar.uvue +162 -0
  713. package/components/up-toolbar/up-toolbar.vue +131 -0
  714. package/components/up-tooltip/props.js +61 -0
  715. package/components/up-tooltip/props.uts +69 -0
  716. package/components/up-tooltip/tooltip.js +25 -0
  717. package/components/up-tooltip/up-tooltip.uvue +514 -0
  718. package/components/up-tooltip/up-tooltip.vue +325 -0
  719. package/components/up-tr/props.js +7 -0
  720. package/components/up-tr/props.uts +7 -0
  721. package/components/up-tr/up-tr.uvue +19 -0
  722. package/components/up-tr/up-tr.vue +37 -0
  723. package/components/up-transition/nvue-ani-map.js +75 -0
  724. package/components/up-transition/props.js +27 -0
  725. package/components/up-transition/props.uts +36 -0
  726. package/components/up-transition/transition.js +18 -0
  727. package/components/up-transition/transition.uts +18 -0
  728. package/components/up-transition/transitionMixin.js +164 -0
  729. package/components/up-transition/up-transition.uvue +182 -0
  730. package/components/up-transition/up-transition.vue +280 -0
  731. package/components/up-transition/vue.ani-style.scss +113 -0
  732. package/components/up-tree/tree-node.uvue +185 -0
  733. package/components/up-tree/tree-node.vue +141 -0
  734. package/components/up-tree/up-tree.uvue +825 -0
  735. package/components/up-tree/up-tree.vue +604 -0
  736. package/components/up-upload/mixin.js +23 -0
  737. package/components/up-upload/mixin.uts +24 -0
  738. package/components/up-upload/props.js +176 -0
  739. package/components/up-upload/props.uts +176 -0
  740. package/components/up-upload/types.uts +38 -0
  741. package/components/up-upload/up-upload.uvue +1131 -0
  742. package/components/up-upload/up-upload.vue +930 -0
  743. package/components/up-upload/upload.js +46 -0
  744. package/components/up-upload/upload.uts +46 -0
  745. package/components/up-upload/utils.js +183 -0
  746. package/components/up-upload/utils.uts +213 -0
  747. package/components/up-video/danmaku.js +96 -0
  748. package/components/up-video/danmaku.uts +106 -0
  749. package/components/up-video/props.js +200 -0
  750. package/components/up-video/types.uts +48 -0
  751. package/components/up-video/up-video.uvue +1451 -0
  752. package/components/up-video/up-video.vue +1349 -0
  753. package/components/up-video/video-danmaku.uvue +296 -0
  754. package/components/up-video/video-danmaku.vue +264 -0
  755. package/components/up-video/video-slider.uvue +210 -0
  756. package/components/up-video/video-slider.vue +201 -0
  757. package/components/up-video/video-utils.js +105 -0
  758. package/components/up-video/video-utils.uts +127 -0
  759. package/components/up-video/video.js +77 -0
  760. package/components/up-video/video.uts +78 -0
  761. package/components/up-view/up-view.uvue +93 -0
  762. package/components/up-view/up-view.vue +95 -0
  763. package/components/up-virtual-list/up-virtual-list.uvue +265 -0
  764. package/components/up-virtual-list/up-virtual-list.vue +241 -0
  765. package/components/up-waterfall/props.uts +49 -0
  766. package/components/up-waterfall/up-waterfall.uvue +456 -0
  767. package/components/up-waterfall/up-waterfall.vue +444 -0
  768. package/components/up-waterfall/waterfall.uts +20 -0
  769. package/index.js +344 -0
  770. package/index.scss +28 -0
  771. package/index.uts +91 -0
  772. package/libs/composable/useFuncIndex.uts +873 -0
  773. package/libs/composable/useUltraUI.js +201 -0
  774. package/libs/composable/useUltraUI.uts +184 -0
  775. package/libs/config/color.js +19 -0
  776. package/libs/config/color.uts +17 -0
  777. package/libs/config/config.js +48 -0
  778. package/libs/config/config.uts +33 -0
  779. package/libs/config/props.js +210 -0
  780. package/libs/config/props.uts +6 -0
  781. package/libs/config/zIndex.js +20 -0
  782. package/libs/config/zIndex.uts +20 -0
  783. package/libs/css/color.scss +311 -0
  784. package/libs/css/common.scss +121 -0
  785. package/libs/css/components.scss +37 -0
  786. package/libs/css/flex.scss +368 -0
  787. package/libs/css/h5.scss +0 -0
  788. package/libs/css/mixin.scss +8 -0
  789. package/libs/css/mp.scss +0 -0
  790. package/libs/css/nvue.scss +0 -0
  791. package/libs/css/theme-legacy-bridge.scss +6 -0
  792. package/libs/css/theme-vars-core.scss +201 -0
  793. package/libs/css/theme-vars.scss +1 -0
  794. package/libs/css/vue.scss +35 -0
  795. package/libs/function/calc.js +70 -0
  796. package/libs/function/colorGradient.js +134 -0
  797. package/libs/function/colorGradient.uts +316 -0
  798. package/libs/function/debounce.js +29 -0
  799. package/libs/function/debounce.uts +33 -0
  800. package/libs/function/digit.js +167 -0
  801. package/libs/function/digit.uts +182 -0
  802. package/libs/function/index.js +853 -0
  803. package/libs/function/index.uts +852 -0
  804. package/libs/function/platform.js +75 -0
  805. package/libs/function/platform.uts +75 -0
  806. package/libs/function/test.js +332 -0
  807. package/libs/function/test.uts +337 -0
  808. package/libs/function/throttle.js +34 -0
  809. package/libs/function/throttle.uts +36 -0
  810. package/libs/i18n/index.js +88 -0
  811. package/libs/i18n/index.uts +141 -0
  812. package/libs/i18n/locale-packs.js +11 -0
  813. package/libs/i18n/locale-packs.uts +11 -0
  814. package/libs/i18n/locales/all.js +23 -0
  815. package/libs/i18n/locales/all.uts +23 -0
  816. package/libs/i18n/locales/de.js +99 -0
  817. package/libs/i18n/locales/de.uts +99 -0
  818. package/libs/i18n/locales/en.js +99 -0
  819. package/libs/i18n/locales/en.uts +99 -0
  820. package/libs/i18n/locales/es.js +99 -0
  821. package/libs/i18n/locales/es.uts +99 -0
  822. package/libs/i18n/locales/fr.js +99 -0
  823. package/libs/i18n/locales/fr.uts +99 -0
  824. package/libs/i18n/locales/ja.js +99 -0
  825. package/libs/i18n/locales/ja.uts +99 -0
  826. package/libs/i18n/locales/ko.js +99 -0
  827. package/libs/i18n/locales/ko.uts +99 -0
  828. package/libs/i18n/locales/ru.js +99 -0
  829. package/libs/i18n/locales/ru.uts +99 -0
  830. package/libs/i18n/locales/th.js +99 -0
  831. package/libs/i18n/locales/th.uts +99 -0
  832. package/libs/i18n/locales/zh-Hans.js +99 -0
  833. package/libs/i18n/locales/zh-Hans.uts +99 -0
  834. package/libs/i18n/locales/zh-Hant.js +99 -0
  835. package/libs/i18n/locales/zh-Hant.uts +99 -0
  836. package/libs/luch-request/adapters/index.js +97 -0
  837. package/libs/luch-request/adapters/index.uts +114 -0
  838. package/libs/luch-request/core/InterceptorManager.js +50 -0
  839. package/libs/luch-request/core/InterceptorManager.uts +41 -0
  840. package/libs/luch-request/core/Request.js +198 -0
  841. package/libs/luch-request/core/Request.uts +134 -0
  842. package/libs/luch-request/core/buildFullPath.js +20 -0
  843. package/libs/luch-request/core/buildFullPath.uts +20 -0
  844. package/libs/luch-request/core/defaults.js +29 -0
  845. package/libs/luch-request/core/defaults.uts +30 -0
  846. package/libs/luch-request/core/dispatchRequest.js +3 -0
  847. package/libs/luch-request/core/dispatchRequest.uts +89 -0
  848. package/libs/luch-request/core/mergeConfig.js +103 -0
  849. package/libs/luch-request/core/mergeConfig.uts +115 -0
  850. package/libs/luch-request/core/settle.js +16 -0
  851. package/libs/luch-request/core/settle.uts +32 -0
  852. package/libs/luch-request/helpers/buildURL.js +69 -0
  853. package/libs/luch-request/helpers/buildURL.uts +64 -0
  854. package/libs/luch-request/helpers/combineURLs.js +14 -0
  855. package/libs/luch-request/helpers/combineURLs.uts +14 -0
  856. package/libs/luch-request/helpers/isAbsoluteURL.js +14 -0
  857. package/libs/luch-request/helpers/isAbsoluteURL.uts +14 -0
  858. package/libs/luch-request/index.d.ts +116 -0
  859. package/libs/luch-request/index.js +3 -0
  860. package/libs/luch-request/index.uts +3 -0
  861. package/libs/luch-request/utils/clone.js +264 -0
  862. package/libs/luch-request/utils/clone.uts +38 -0
  863. package/libs/luch-request/utils.js +131 -0
  864. package/libs/luch-request/utils.uts +66 -0
  865. package/libs/marked-uts/LICENSE +21 -0
  866. package/libs/marked-uts/common/Hooks.uts +71 -0
  867. package/libs/marked-uts/common/Instance.uts +273 -0
  868. package/libs/marked-uts/common/Lexer.uts +1083 -0
  869. package/libs/marked-uts/common/Parser.uts +367 -0
  870. package/libs/marked-uts/common/Renderer.uts +244 -0
  871. package/libs/marked-uts/common/TextRenderer.uts +74 -0
  872. package/libs/marked-uts/common/Tokenizer.uts +1122 -0
  873. package/libs/marked-uts/common/defaults.uts +25 -0
  874. package/libs/marked-uts/common/helpers.uts +165 -0
  875. package/libs/marked-uts/common/marked.uts +8 -0
  876. package/libs/marked-uts/common/rules.uts +603 -0
  877. package/libs/marked-uts/package.json +102 -0
  878. package/libs/marked-uts/readme.md +159 -0
  879. package/libs/marked-uts/utssdk/Hooks.interface.uts +34 -0
  880. package/libs/marked-uts/utssdk/Lexer.interface.uts +51 -0
  881. package/libs/marked-uts/utssdk/Marked.interface.uts +35 -0
  882. package/libs/marked-uts/utssdk/MarkedOptions.interface.uts +155 -0
  883. package/libs/marked-uts/utssdk/Parser.interface.uts +20 -0
  884. package/libs/marked-uts/utssdk/Renderer.interface.uts +34 -0
  885. package/libs/marked-uts/utssdk/Rules.interface.uts +296 -0
  886. package/libs/marked-uts/utssdk/TextRenderer.interface.uts +14 -0
  887. package/libs/marked-uts/utssdk/Tokenizer.interface.uts +38 -0
  888. package/libs/marked-uts/utssdk/Tokens.interface.uts +312 -0
  889. package/libs/marked-uts/utssdk/app-android/config.json +3 -0
  890. package/libs/marked-uts/utssdk/app-android/index.uts +23 -0
  891. package/libs/marked-uts/utssdk/app-android/libs/JSReg3.jar +0 -0
  892. package/libs/marked-uts/utssdk/app-harmony/index.uts +2 -0
  893. package/libs/marked-uts/utssdk/app-ios/config.json +3 -0
  894. package/libs/marked-uts/utssdk/app-ios/index.uts +85 -0
  895. package/libs/marked-uts/utssdk/app-js/index.uts +2 -0
  896. package/libs/marked-uts/utssdk/interface.uts +933 -0
  897. package/libs/marked-uts/utssdk/mp-weixin/index.uts +2 -0
  898. package/libs/marked-uts/utssdk/unierror.uts +39 -0
  899. package/libs/marked-uts/utssdk/web/index.uts +2 -0
  900. package/libs/root/LICENSE +21 -0
  901. package/libs/root/root-toast-host.vue +31 -0
  902. package/libs/root/runtime.js +11 -0
  903. package/libs/theme/runtime.js +440 -0
  904. package/libs/theme/theme.js +681 -0
  905. package/libs/util/async-validator.js +1343 -0
  906. package/libs/util/async-validator.uts +412 -0
  907. package/libs/util/calendar.js +546 -0
  908. package/libs/util/calendar.uts +546 -0
  909. package/libs/util/emitter.js +51 -0
  910. package/libs/util/route.js +124 -0
  911. package/libs/util/route.uts +130 -0
  912. package/libs/vite/app-icon-font.js +95 -0
  913. package/libs/vite/index.js +50 -0
  914. package/libs/vite/utils.js +48 -0
  915. package/libs/vue.js +3 -0
  916. package/libs/vue.uts +8 -0
  917. package/package.json +113 -0
  918. package/theme.scss +116 -0
  919. package/types/common.uts +14 -0
  920. package/types/comps/_common.d.ts +9 -0
  921. package/types/comps/actionSheet.d.ts +125 -0
  922. package/types/comps/album.d.ts +91 -0
  923. package/types/comps/alert.d.ts +55 -0
  924. package/types/comps/avatar.d.ts +85 -0
  925. package/types/comps/avatarGroup.d.ts +62 -0
  926. package/types/comps/backTop.d.ts +74 -0
  927. package/types/comps/badge.d.ts +76 -0
  928. package/types/comps/button.d.ts +169 -0
  929. package/types/comps/calendar.d.ts +271 -0
  930. package/types/comps/calendarStrip.d.ts +115 -0
  931. package/types/comps/cell.d.ts +133 -0
  932. package/types/comps/cellGroup.d.ts +27 -0
  933. package/types/comps/checkbox.d.ts +81 -0
  934. package/types/comps/checkboxGroup.d.ts +93 -0
  935. package/types/comps/code.d.ts +69 -0
  936. package/types/comps/codeInput.d.ts +98 -0
  937. package/types/comps/col.d.ts +43 -0
  938. package/types/comps/collapse.d.ts +52 -0
  939. package/types/comps/collapseItem.d.ts +83 -0
  940. package/types/comps/countDown.d.ts +60 -0
  941. package/types/comps/countTo.d.ts +88 -0
  942. package/types/comps/datetimePicker.d.ts +178 -0
  943. package/types/comps/divider.d.ts +58 -0
  944. package/types/comps/empty.d.ts +72 -0
  945. package/types/comps/form.d.ts +102 -0
  946. package/types/comps/formItem.d.ts +68 -0
  947. package/types/comps/gap.d.ts +35 -0
  948. package/types/comps/grid.d.ts +34 -0
  949. package/types/comps/gridItem.d.ts +28 -0
  950. package/types/comps/guide.d.ts +45 -0
  951. package/types/comps/icon.d.ts +98 -0
  952. package/types/comps/image.d.ts +119 -0
  953. package/types/comps/indexAnchor.d.ts +38 -0
  954. package/types/comps/indexItem.d.ts +18 -0
  955. package/types/comps/indexList.d.ts +39 -0
  956. package/types/comps/input.d.ts +234 -0
  957. package/types/comps/keyboard.d.ts +129 -0
  958. package/types/comps/line.d.ts +44 -0
  959. package/types/comps/lineProgress.d.ts +51 -0
  960. package/types/comps/link.d.ts +51 -0
  961. package/types/comps/list.d.ts +92 -0
  962. package/types/comps/listItem.d.ts +18 -0
  963. package/types/comps/loadMore.d.ts +108 -0
  964. package/types/comps/loadingIcon.d.ts +68 -0
  965. package/types/comps/loadingPage.d.ts +58 -0
  966. package/types/comps/modal.d.ts +115 -0
  967. package/types/comps/navbar.d.ts +113 -0
  968. package/types/comps/navbarMini.d.ts +78 -0
  969. package/types/comps/noNetwork.d.ts +40 -0
  970. package/types/comps/noticeBar.d.ts +85 -0
  971. package/types/comps/notify.d.ts +73 -0
  972. package/types/comps/novelReader.d.ts +103 -0
  973. package/types/comps/numberBox.d.ts +219 -0
  974. package/types/comps/overlay.d.ts +46 -0
  975. package/types/comps/pagination.d.ts +96 -0
  976. package/types/comps/parse.d.ts +101 -0
  977. package/types/comps/picker.d.ts +119 -0
  978. package/types/comps/popup.d.ts +107 -0
  979. package/types/comps/radio.d.ts +81 -0
  980. package/types/comps/radioGroup.d.ts +97 -0
  981. package/types/comps/rate.d.ts +85 -0
  982. package/types/comps/readMore.d.ts +80 -0
  983. package/types/comps/rootToastHost.d.ts +3 -0
  984. package/types/comps/row.d.ts +34 -0
  985. package/types/comps/safeBottom.d.ts +16 -0
  986. package/types/comps/scrollList.d.ts +51 -0
  987. package/types/comps/search.d.ts +167 -0
  988. package/types/comps/skeleton.d.ts +70 -0
  989. package/types/comps/slider.d.ts +79 -0
  990. package/types/comps/statusBar.d.ts +22 -0
  991. package/types/comps/steps.d.ts +48 -0
  992. package/types/comps/stepsItem.d.ts +41 -0
  993. package/types/comps/sticky.d.ts +48 -0
  994. package/types/comps/subsection.d.ts +79 -0
  995. package/types/comps/swipeAction.d.ts +24 -0
  996. package/types/comps/swipeActionItem.d.ts +71 -0
  997. package/types/comps/swiper.d.ts +147 -0
  998. package/types/comps/swiperIndicator.d.ts +37 -0
  999. package/types/comps/switch.d.ts +73 -0
  1000. package/types/comps/tabbar.d.ts +54 -0
  1001. package/types/comps/tabbarItem.d.ts +78 -0
  1002. package/types/comps/tabs.d.ts +91 -0
  1003. package/types/comps/tabsPro.d.ts +64 -0
  1004. package/types/comps/tag.d.ts +93 -0
  1005. package/types/comps/text.d.ts +115 -0
  1006. package/types/comps/textarea.d.ts +163 -0
  1007. package/types/comps/toast.d.ts +59 -0
  1008. package/types/comps/tooltip.d.ts +71 -0
  1009. package/types/comps/transition.d.ts +61 -0
  1010. package/types/comps/upload.d.ts +163 -0
  1011. package/types/comps/video.d.ts +170 -0
  1012. package/types/comps.d.ts +120 -0
  1013. package/types/index.d.ts +374 -0
  1014. package/types/index.uts +11 -0
  1015. package/types/package.json +26 -0
@@ -0,0 +1,1451 @@
1
+ <template>
2
+ <view
3
+ class="up-video"
4
+ :class="[customClass, fullscreen ? 'up-video--fullscreen' : '']"
5
+ :style="[rootStyle, addStyle(customStyle)]"
6
+ >
7
+ <video
8
+ :id="innerVideoId"
9
+ class="up-video__player"
10
+ :src="playingSrc"
11
+ :poster="currentPoster"
12
+ :controls="false"
13
+ :autoplay="nativeAutoplay"
14
+ :loop="loop"
15
+ :muted="innerMuted"
16
+ :initial-time="initialTime"
17
+ :object-fit="objectFit"
18
+ :direction="nativeDirection"
19
+ :show-fullscreen-btn="false"
20
+ :show-play-btn="false"
21
+ :show-center-play-btn="false"
22
+ :show-mute-btn="false"
23
+ :enable-progress-gesture="enableProgressGesture"
24
+ :page-gesture="pageGesture"
25
+ :vslide-gesture="vslideGesture"
26
+ :auto-pause-if-navigate="autoPauseIfNavigate"
27
+ :auto-pause-if-open-native="autoPauseIfOpenNative"
28
+ @play="onPlay"
29
+ @pause="onPause"
30
+ @ended="onEnded"
31
+ @timeupdate="onTimeUpdate"
32
+ @waiting="onWaiting"
33
+ @error="onError"
34
+ @progress="onProgress"
35
+ @fullscreenchange="onFullscreenChange"
36
+ @loadedmetadata="onLoadedMetadata"
37
+ ></video>
38
+
39
+ <!-- 自绘控制层。uni-app-x 的 video 是原生组件,内部无法承载子节点,
40
+ 因此这里用同级的绝对定位覆盖层,进全屏后请走原生全屏按钮。 -->
41
+ <view class="up-video__layer">
42
+ <VideoDanmaku
43
+ v-if="enableDanmu"
44
+ ref="danmaku"
45
+ class="up-video__danmu-layer"
46
+ :list="activeDanmuList"
47
+ :open="innerDanmuOpen"
48
+ :color="danmuColor"
49
+ :fontSize="danmuFontSize"
50
+ :duration="danmuDuration"
51
+ :area="danmuArea"
52
+ :opacity="danmuOpacity"
53
+ :max="danmuMax"
54
+ ></VideoDanmaku>
55
+
56
+ <view class="up-video__layer" @click="onPlayerTap"></view>
57
+
58
+ <view v-if="loading" class="up-video__layer up-video__center">
59
+ <up-loading-icon mode="circle" color="#ffffff" size="30"></up-loading-icon>
60
+ </view>
61
+
62
+ <view v-if="errored" class="up-video__layer up-video__center up-video__mask">
63
+ <text class="up-video__hint">{{ t('up.video.video_error') }}</text>
64
+ <view class="up-video__retry" @click.stop="retry">
65
+ <text class="up-video__retry-text">{{ t('up.common.retry') }}</text>
66
+ </view>
67
+ </view>
68
+
69
+ <view v-if="coverVisible" class="up-video__layer up-video__cover" @click="onCoverTap">
70
+ <image v-if="currentPoster" class="up-video__cover-image" :src="currentPoster" mode="aspectFill"></image>
71
+ <view class="up-video__cover-mask"></view>
72
+ <view v-if="showCenterPlayBtn" class="up-video__cover-btn">
73
+ <up-icon name="play-right-fill" color="#ffffff" size="26"></up-icon>
74
+ </view>
75
+ </view>
76
+
77
+ <view v-if="topBarVisible" class="up-video__top">
78
+ <view v-if="showBack" class="up-video__icon-btn" @click="onBack">
79
+ <up-icon :name="backIcon" color="#ffffff" size="20"></up-icon>
80
+ </view>
81
+ <text v-if="title" class="up-video__top-title">{{ title }}</text>
82
+ </view>
83
+
84
+ <view v-if="locked" class="up-video__unlock" @click="toggleLock">
85
+ <up-icon name="lock-fill" color="#ffffff" size="18"></up-icon>
86
+ </view>
87
+
88
+ <view v-if="barVisible" class="up-video__controls">
89
+ <view class="up-video__row">
90
+ <view class="up-video__icon-btn" @click="toggle">
91
+ <up-icon :name="playing ? 'pause' : 'play-right-fill'" color="#ffffff" size="18"></up-icon>
92
+ </view>
93
+ <text class="up-video__time">{{ timeText }}</text>
94
+ <VideoSlider
95
+ :percent="progressPercent"
96
+ :buffered="bufferedPercent"
97
+ :activeColor="activeColor"
98
+ @start="onProgressStart"
99
+ @changing="onProgressChanging"
100
+ @change="onProgressChange"
101
+ ></VideoSlider>
102
+ <text class="up-video__time">{{ durationText }}</text>
103
+ <view v-if="showVolume" class="up-video__icon-btn" @click="togglePanel('volume')">
104
+ <up-icon :name="volumeIcon" color="#ffffff" size="18"></up-icon>
105
+ </view>
106
+ <view v-if="danmuEntryVisible" class="up-video__icon-btn" @click="togglePanel('danmu')">
107
+ <up-icon name="chat-fill" color="#ffffff" size="18"></up-icon>
108
+ </view>
109
+ <view v-if="showRate" class="up-video__text-btn" @click="togglePanel('rate')">
110
+ <text class="up-video__btn-text">{{ rateText }}</text>
111
+ </view>
112
+ <view v-if="showLock" class="up-video__icon-btn" @click="toggleLock">
113
+ <up-icon name="lock-fill" color="#ffffff" size="18"></up-icon>
114
+ </view>
115
+ <view v-if="showFullscreenBtn" class="up-video__icon-btn" @click="toggleFullscreen">
116
+ <view class="up-video__fullscreen">
117
+ <view class="up-video__corner-tl"></view>
118
+ <view class="up-video__corner-tr"></view>
119
+ <view class="up-video__corner-bl"></view>
120
+ <view class="up-video__corner-br"></view>
121
+ </view>
122
+ </view>
123
+ </view>
124
+ </view>
125
+
126
+ <view v-if="panel == 'rate'" class="up-video__layer up-video__panel" @click="closePanel">
127
+ <view class="up-video__panel-body" @click="noop">
128
+ <text class="up-video__panel-title">{{ t('up.video.video_rate') }}</text>
129
+ <view
130
+ v-for="(item, index) in rates"
131
+ :key="index"
132
+ class="up-video__panel-item"
133
+ @click="setRate(item)"
134
+ >
135
+ <text
136
+ class="up-video__panel-text"
137
+ :style="{ color: item == innerRate ? activeColor : '#ffffff' }"
138
+ >{{ item }}x</text>
139
+ </view>
140
+ </view>
141
+ </view>
142
+
143
+ <view v-if="panel == 'episode'" class="up-video__layer up-video__panel" @click="closePanel">
144
+ <view class="up-video__panel-body up-video__panel-body--wide" @click="noop">
145
+ <text class="up-video__panel-title">{{ t('up.video.video_episodes') }}</text>
146
+ <view class="up-video__episode-grid">
147
+ <view
148
+ v-for="(item, index) in episodeList"
149
+ :key="index"
150
+ class="up-video__episode-cell"
151
+ :style="{ width: episodeWidth }"
152
+ @click="switchEpisode(index)"
153
+ >
154
+ <view class="up-video__episode" :style="episodeStyle(index)">
155
+ <text class="up-video__episode-text">{{ item.title }}</text>
156
+ </view>
157
+ </view>
158
+ </view>
159
+ </view>
160
+ </view>
161
+
162
+ <view v-if="panel == 'volume'" class="up-video__volume" @click="noop">
163
+ <view class="up-video__icon-btn" @click="toggleMute">
164
+ <up-icon :name="volumeIcon" color="#ffffff" size="16"></up-icon>
165
+ </view>
166
+ <text class="up-video__volume-label">{{ t('up.video.video_volume') }}</text>
167
+ <VideoSlider
168
+ :percent="volumePercent"
169
+ :activeColor="activeColor"
170
+ @changing="onVolumeChanging"
171
+ @change="onVolumeChange"
172
+ ></VideoSlider>
173
+ <text class="up-video__volume-value">{{ volumeText }}</text>
174
+ </view>
175
+ </view>
176
+
177
+ <view v-if="currentAd != null" class="up-video__ad">
178
+ <video
179
+ v-if="currentAd.src != ''"
180
+ :id="adVideoId"
181
+ class="up-video__ad-media"
182
+ :src="currentAd.src"
183
+ :controls="false"
184
+ :muted="innerMuted"
185
+ autoplay
186
+ object-fit="contain"
187
+ @timeupdate="onAdTimeUpdate"
188
+ @ended="onAdEnded"
189
+ @error="onAdEnded"
190
+ ></video>
191
+ <image
192
+ v-else-if="currentAd.image != ''"
193
+ class="up-video__ad-media"
194
+ :src="currentAd.image"
195
+ mode="aspectFill"
196
+ @click="onAdClick"
197
+ ></image>
198
+ <view class="up-video__ad-bar">
199
+ <text class="up-video__ad-tag">{{ adTagText }}</text>
200
+ <view v-if="currentAd.link != ''" class="up-video__ad-btn" @click="onAdClick">
201
+ <text class="up-video__ad-btn-text">{{ t('up.video.video_adDetail') }}</text>
202
+ </view>
203
+ <view v-if="adCanSkip" class="up-video__ad-btn" @click="skipAd">
204
+ <text class="up-video__ad-btn-text">{{ t('up.video.video_skipAd') }}</text>
205
+ </view>
206
+ </view>
207
+ </view>
208
+
209
+ <view v-if="pauseAdVisible" class="up-video__pause-ad">
210
+ <image
211
+ class="up-video__pause-ad-media"
212
+ :src="pauseAdItem.image"
213
+ mode="aspectFit"
214
+ @click="onAdClick"
215
+ ></image>
216
+ <view class="up-video__pause-ad-close" @click="closePauseAd">
217
+ <up-icon name="close" color="#ffffff" size="14"></up-icon>
218
+ </view>
219
+ </view>
220
+
221
+ <view v-if="panel == 'danmu'" class="up-video__danmu-input">
222
+ <input
223
+ class="up-video__danmu-field"
224
+ :value="danmuText"
225
+ type="text"
226
+ :placeholder="t('up.video.video_danmuPlaceholder')"
227
+ placeholder-style="color: rgba(255, 255, 255, 0.5)"
228
+ confirm-type="send"
229
+ @input="onDanmuInput"
230
+ @confirm="onDanmuConfirm"
231
+ />
232
+ <view class="up-video__danmu-send" :style="{ backgroundColor: activeColor }" @click="sendDanmu()">
233
+ <text class="up-video__danmu-send-text">{{ t('up.video.video_send') }}</text>
234
+ </view>
235
+ </view>
236
+ </view>
237
+ </template>
238
+
239
+ <script setup lang="uts">
240
+ import { computed, getCurrentInstance, nextTick, onBeforeUnmount, onMounted, ref, watch } from 'vue'
241
+ import { addStyle, addUnit, guid, toast } from '../../libs/function/index.uts'
242
+ import { t } from '../../libs/i18n/index.uts'
243
+ import defProps from './video.uts'
244
+ import VideoDanmaku from './video-danmaku.uvue'
245
+ import VideoSlider from './video-slider.uvue'
246
+ import {
247
+ adSkippable,
248
+ clampNumber,
249
+ formatVideoTime,
250
+ normalizeAds,
251
+ normalizeEpisodes,
252
+ normalizeRateList,
253
+ pickAds,
254
+ progressToTime,
255
+ toNumber,
256
+ timeToProgress
257
+ } from './video-utils.uts'
258
+ import { UPVideoAd } from './types.uts'
259
+
260
+ defineOptions({
261
+ styleIsolation: 'app-and-page',
262
+ name: 'up-video'
263
+ })
264
+
265
+ const props = defineProps({
266
+ // 视频地址,传了 episodes 时作为兜底地址
267
+ src: { type: String, default: (defProps['video'] as UTSJSONObject)['src'] },
268
+ poster: { type: String, default: (defProps['video'] as UTSJSONObject)['poster'] },
269
+ title: { type: String, default: (defProps['video'] as UTSJSONObject)['title'] },
270
+ width: { type: [String, Number], default: (defProps['video'] as UTSJSONObject)['width'] },
271
+ height: { type: [String, Number], default: (defProps['video'] as UTSJSONObject)['height'] },
272
+ radius: { type: [String, Number], default: (defProps['video'] as UTSJSONObject)['radius'] },
273
+ objectFit: { type: String, default: (defProps['video'] as UTSJSONObject)['objectFit'] },
274
+ autoplay: { type: Boolean, default: (defProps['video'] as UTSJSONObject)['autoplay'] },
275
+ loop: { type: Boolean, default: (defProps['video'] as UTSJSONObject)['loop'] },
276
+ muted: { type: Boolean, default: (defProps['video'] as UTSJSONObject)['muted'] },
277
+ initialTime: { type: [String, Number], default: (defProps['video'] as UTSJSONObject)['initialTime'] },
278
+ controls: { type: Boolean, default: (defProps['video'] as UTSJSONObject)['controls'] },
279
+ showCenterPlayBtn: { type: Boolean, default: (defProps['video'] as UTSJSONObject)['showCenterPlayBtn'] },
280
+ showFullscreenBtn: { type: Boolean, default: (defProps['video'] as UTSJSONObject)['showFullscreenBtn'] },
281
+ showBack: { type: Boolean, default: (defProps['video'] as UTSJSONObject)['showBack'] },
282
+ backIcon: { type: String, default: (defProps['video'] as UTSJSONObject)['backIcon'] },
283
+ autoHide: { type: [String, Number], default: (defProps['video'] as UTSJSONObject)['autoHide'] },
284
+ showLock: { type: Boolean, default: (defProps['video'] as UTSJSONObject)['showLock'] },
285
+ showRate: { type: Boolean, default: (defProps['video'] as UTSJSONObject)['showRate'] },
286
+ rate: { type: [String, Number], default: (defProps['video'] as UTSJSONObject)['rate'] },
287
+ rateList: { type: Array, default: (defProps['video'] as UTSJSONObject)['rateList'] },
288
+ showVolume: { type: Boolean, default: (defProps['video'] as UTSJSONObject)['showVolume'] },
289
+ volume: { type: [String, Number], default: (defProps['video'] as UTSJSONObject)['volume'] },
290
+ enableDanmu: { type: Boolean, default: (defProps['video'] as UTSJSONObject)['enableDanmu'] },
291
+ danmuList: { type: Array, default: (defProps['video'] as UTSJSONObject)['danmuList'] },
292
+ danmuBtn: { type: Boolean, default: (defProps['video'] as UTSJSONObject)['danmuBtn'] },
293
+ danmuOpen: { type: Boolean, default: (defProps['video'] as UTSJSONObject)['danmuOpen'] },
294
+ danmuColor: { type: String, default: (defProps['video'] as UTSJSONObject)['danmuColor'] },
295
+ danmuFontSize: { type: [String, Number], default: (defProps['video'] as UTSJSONObject)['danmuFontSize'] },
296
+ danmuDuration: { type: [String, Number], default: (defProps['video'] as UTSJSONObject)['danmuDuration'] },
297
+ danmuArea: { type: String, default: (defProps['video'] as UTSJSONObject)['danmuArea'] },
298
+ danmuOpacity: { type: [String, Number], default: (defProps['video'] as UTSJSONObject)['danmuOpacity'] },
299
+ danmuMax: { type: [String, Number], default: (defProps['video'] as UTSJSONObject)['danmuMax'] },
300
+ episodes: { type: Array, default: (defProps['video'] as UTSJSONObject)['episodes'] },
301
+ episodeIndex: { type: [String, Number], default: (defProps['video'] as UTSJSONObject)['episodeIndex'] },
302
+ episodeColumns: { type: [String, Number], default: (defProps['video'] as UTSJSONObject)['episodeColumns'] },
303
+ autoNext: { type: Boolean, default: (defProps['video'] as UTSJSONObject)['autoNext'] },
304
+ ads: { type: Array, default: (defProps['video'] as UTSJSONObject)['ads'] },
305
+ enableProgressGesture: { type: Boolean, default: (defProps['video'] as UTSJSONObject)['enableProgressGesture'] },
306
+ pageGesture: { type: Boolean, default: (defProps['video'] as UTSJSONObject)['pageGesture'] },
307
+ vslideGesture: { type: Boolean, default: (defProps['video'] as UTSJSONObject)['vslideGesture'] },
308
+ direction: { type: [String, Number], default: (defProps['video'] as UTSJSONObject)['direction'] },
309
+ autoPauseIfNavigate: { type: Boolean, default: (defProps['video'] as UTSJSONObject)['autoPauseIfNavigate'] },
310
+ autoPauseIfOpenNative: { type: Boolean, default: (defProps['video'] as UTSJSONObject)['autoPauseIfOpenNative'] },
311
+ videoId: { type: String, default: (defProps['video'] as UTSJSONObject)['videoId'] },
312
+ activeColor: { type: String, default: (defProps['video'] as UTSJSONObject)['activeColor'] },
313
+ customStyle: {
314
+ type: [Object, String],
315
+ default: () => ({}),
316
+ },
317
+ customClass: {
318
+ type: String,
319
+ default: ''
320
+ }
321
+ })
322
+
323
+ const emit = defineEmits([
324
+ 'play', 'pause', 'ended', 'timeupdate', 'waiting', 'error', 'progress',
325
+ 'fullscreenchange', 'loadedmetadata', 'ratechange', 'controlstoggle', 'lock',
326
+ 'back', 'volumechange', 'danmu-toggle', 'danmu', 'episode-change',
327
+ 'ad-start', 'ad-end', 'ad-skip', 'ad-click',
328
+ 'update:rate', 'update:volume', 'update:danmuOpen', 'update:episodeIndex'
329
+ ])
330
+
331
+ const instance = getCurrentInstance()?.proxy
332
+ const danmaku = ref<ComponentPublicInstance | null>(null)
333
+ const ctx = ref<VideoContext | null>(null)
334
+ let hideTimer = 0
335
+ let adTimer = 0
336
+
337
+ const innerVideoId = ref(props.videoId != '' ? props.videoId : 'up-video-' + guid(10, false))
338
+ const adVideoId = ref(innerVideoId.value + '-ad')
339
+
340
+ const playing = ref(false)
341
+ const started = ref(false)
342
+ const loading = ref(false)
343
+ const errored = ref(false)
344
+ const currentTime = ref(0)
345
+ const videoDuration = ref(0)
346
+ const buffered = ref(0)
347
+ const dragging = ref(false)
348
+ const dragPercent = ref(0)
349
+ const controlsVisible = ref(true)
350
+ const locked = ref(false)
351
+ const fullscreen = ref(false)
352
+ // '' | rate | episode | volume | danmu
353
+ const panel = ref('')
354
+ const innerRate = ref(toNumber(props.rate, 0) > 0 ? toNumber(props.rate, 1) : 1)
355
+ const innerVolume = ref(clampNumber(props.volume, 0, 1))
356
+ const innerMuted = ref(props.muted)
357
+ const innerDanmuOpen = ref(props.danmuOpen)
358
+ const innerEpisodeIndex = ref(parseInt(props.episodeIndex.toString()) || 0)
359
+ const danmuText = ref('')
360
+ const currentAd = ref<UPVideoAd | null>(null)
361
+ const adRole = ref('')
362
+ const adElapsed = ref(0)
363
+ const adDuration = ref(0)
364
+ const prerollCursor = ref(0)
365
+ const postrollCursor = ref(0)
366
+ const pauseAdVisible = ref(false)
367
+
368
+ const noop = (): void => {}
369
+
370
+ // ============ 计算属性 ============
371
+ const rootStyle = computed((): UTSJSONObject => {
372
+ const style = {
373
+ width: addUnit(props.width),
374
+ height: addUnit(props.height)
375
+ } as UTSJSONObject
376
+ if ((props.radius ?? '') != '') {
377
+ style['borderRadius'] = addUnit(props.radius)
378
+ }
379
+ return style
380
+ })
381
+
382
+ // uni 的 direction 只接受 0 / 90 / -90,-1 表示交给系统判断
383
+ const nativeDirection = computed((): number => {
384
+ const direction = toNumber(props.direction, -1)
385
+ if (direction == 0 || direction == 90 || direction == -90) return direction
386
+ return -1
387
+ })
388
+
389
+ const episodeList = computed((): Array<UTSJSONObject> => normalizeEpisodes(props.episodes))
390
+ const currentEpisode = computed((): UTSJSONObject | null => {
391
+ const index = innerEpisodeIndex.value
392
+ if (index < 0 || index >= episodeList.value.length) return null
393
+ return episodeList.value[index]
394
+ })
395
+ const playingSrc = computed((): string => {
396
+ const episode = currentEpisode.value
397
+ if (episode != null && (episode['src'] ?? '') != '') return episode['src'] as string
398
+ return props.src
399
+ })
400
+ const currentPoster = computed((): string => {
401
+ const episode = currentEpisode.value
402
+ if (episode != null && (episode['poster'] ?? '') != '') return episode['poster'] as string
403
+ return props.poster
404
+ })
405
+ const activeDanmuList = computed((): Array<any> => {
406
+ return props.danmuList as Array<any>
407
+ })
408
+
409
+ const rates = computed((): number[] => normalizeRateList(props.rateList))
410
+ const normalizedAds = computed((): UPVideoAd[] => normalizeAds(props.ads))
411
+ const prerollAds = computed((): UPVideoAd[] => pickAds(normalizedAds.value, 'preroll'))
412
+ const postrollAds = computed((): UPVideoAd[] => pickAds(normalizedAds.value, 'postroll'))
413
+ const pauseAdItem = computed((): UPVideoAd | null => {
414
+ const list = pickAds(normalizedAds.value, 'pause')
415
+ return list.length > 0 ? list[0] : null
416
+ })
417
+
418
+ // 有前置广告时交给组件自己调度,避免原生自动播放抢在广告之前
419
+ const nativeAutoplay = computed((): boolean => props.autoplay && prerollAds.value.length == 0)
420
+
421
+ const coverVisible = computed((): boolean => !started.value && currentAd.value == null)
422
+ const topBarVisible = computed((): boolean => {
423
+ return controlsVisible.value && !locked.value && currentAd.value == null && (props.showBack || props.title != '')
424
+ })
425
+ const barVisible = computed((): boolean => {
426
+ return props.controls && controlsVisible.value && !locked.value && currentAd.value == null
427
+ })
428
+ const danmuEntryVisible = computed((): boolean => props.enableDanmu && props.danmuBtn)
429
+
430
+ const progressPercent = computed((): number => {
431
+ return dragging.value ? dragPercent.value : timeToProgress(currentTime.value, videoDuration.value)
432
+ })
433
+ const bufferedPercent = computed((): number => clampNumber(buffered.value, 0, 100))
434
+ const timeText = computed((): string => {
435
+ const time = dragging.value ? progressToTime(dragPercent.value, videoDuration.value) : currentTime.value
436
+ return formatVideoTime(time)
437
+ })
438
+ const durationText = computed((): string => formatVideoTime(videoDuration.value))
439
+ const rateText = computed((): string => innerRate.value.toString() + 'x')
440
+ const volumePercent = computed((): number => {
441
+ return innerMuted.value ? 0 : clampNumber(innerVolume.value * 100, 0, 100)
442
+ })
443
+ const volumeText = computed((): string => Math.round(volumePercent.value).toString())
444
+ const volumeIcon = computed((): string => {
445
+ return (innerMuted.value || innerVolume.value <= 0) ? 'volume-off' : 'volume'
446
+ })
447
+ const episodeWidth = computed((): string => {
448
+ const columns = Math.max(1, parseInt(props.episodeColumns.toString()) || 1)
449
+ return (100 / columns).toFixed(4) + '%'
450
+ })
451
+ const adCanSkip = computed((): boolean => {
452
+ return currentAd.value != null && adSkippable(currentAd.value, adElapsed.value)
453
+ })
454
+ const adTagText = computed((): string => {
455
+ if (currentAd.value == null) return ''
456
+ const total = toNumber(adDuration.value, 0)
457
+ if (total > 0) {
458
+ const left = Math.max(0, Math.ceil(total - adElapsed.value))
459
+ return t('up.video.adCountdown', { seconds: left } as UTSJSONObject)
460
+ }
461
+ return t('up.video.ad')
462
+ })
463
+
464
+ const episodeStyle = (index: number): UTSJSONObject => {
465
+ const active = index == innerEpisodeIndex.value
466
+ return {
467
+ backgroundColor: active ? props.activeColor : 'rgba(255, 255, 255, 0.16)'
468
+ } as UTSJSONObject
469
+ }
470
+
471
+ // ============ VideoContext ============
472
+ const getContext = (): VideoContext | null => {
473
+ if (ctx.value == null) {
474
+ ctx.value = uni.createVideoContext(innerVideoId.value, instance)
475
+ }
476
+ return ctx.value
477
+ }
478
+
479
+ // ============ 播放控制 ============
480
+ const playMain = (): void => {
481
+ started.value = true
482
+ errored.value = false
483
+ closePauseAd()
484
+ const context = getContext()
485
+ if (context != null) context.play()
486
+ }
487
+
488
+ const play = (): void => {
489
+ if (currentAd.value != null) return
490
+ if (playAdQueue('preroll')) return
491
+ playMain()
492
+ }
493
+
494
+ const pause = (): void => {
495
+ const context = getContext()
496
+ if (context != null) context.pause()
497
+ }
498
+
499
+ const toggle = (): void => {
500
+ if (playing.value) {
501
+ pause()
502
+ } else {
503
+ play()
504
+ }
505
+ }
506
+
507
+ const stop = (): void => {
508
+ const context = getContext()
509
+ if (context != null) context.stop()
510
+ playing.value = false
511
+ started.value = false
512
+ currentTime.value = 0
513
+ }
514
+
515
+ const seek = (time: any): number => {
516
+ const target = clampNumber(time, 0, videoDuration.value > 0 ? videoDuration.value : toNumber(time, 0))
517
+ const context = getContext()
518
+ if (context != null) context.seek(target)
519
+ currentTime.value = target
520
+ danmaku.value?.$callMethod('reset', target)
521
+ return target
522
+ }
523
+
524
+ const retry = (): void => {
525
+ errored.value = false
526
+ loading.value = true
527
+ nextTick(() => playMain())
528
+ }
529
+
530
+ // 换源、换集后把播放态清干净,广告游标一起重置
531
+ const resetPlayback = (): void => {
532
+ playing.value = false
533
+ started.value = false
534
+ loading.value = false
535
+ errored.value = false
536
+ currentTime.value = 0
537
+ videoDuration.value = 0
538
+ buffered.value = 0
539
+ dragging.value = false
540
+ prerollCursor.value = 0
541
+ postrollCursor.value = 0
542
+ closePauseAd()
543
+ danmaku.value?.$callMethod('reset', 0)
544
+ }
545
+
546
+ // ============ 原生事件 ============
547
+ const onPlay = (e: UniEvent): void => {
548
+ playing.value = true
549
+ started.value = true
550
+ loading.value = false
551
+ errored.value = false
552
+ closePauseAd()
553
+ applyRate()
554
+ applyVolume()
555
+ scheduleHide()
556
+ emit('play', e)
557
+ }
558
+
559
+ const onPause = (e: UniEvent): void => {
560
+ playing.value = false
561
+ showControls()
562
+ if (pauseAdItem.value != null && started.value && currentAd.value == null) {
563
+ pauseAdVisible.value = true
564
+ }
565
+ emit('pause', e)
566
+ }
567
+
568
+ const onEnded = (e: UniEvent): void => {
569
+ playing.value = false
570
+ emit('ended', e)
571
+ if (props.loop) return
572
+ if (props.autoNext && innerEpisodeIndex.value < episodeList.value.length - 1) {
573
+ switchEpisode(innerEpisodeIndex.value + 1)
574
+ return
575
+ }
576
+ if (playAdQueue('postroll')) return
577
+ started.value = false
578
+ currentTime.value = 0
579
+ showControls()
580
+ }
581
+
582
+ const onTimeUpdate = (e: UniCustomEvent<UTSJSONObject>): void => {
583
+ const detail = e.detail
584
+ if (!dragging.value && detail['currentTime'] != null) {
585
+ currentTime.value = toNumber(detail['currentTime'], 0)
586
+ }
587
+ if (toNumber(detail['duration'], 0) > 0) {
588
+ videoDuration.value = toNumber(detail['duration'], 0)
589
+ }
590
+ loading.value = false
591
+ danmaku.value?.$callMethod('sync', currentTime.value)
592
+ emit('timeupdate', e)
593
+ }
594
+
595
+ const onWaiting = (e: UniEvent): void => {
596
+ loading.value = true
597
+ emit('waiting', e)
598
+ }
599
+
600
+ const onError = (e: UniEvent): void => {
601
+ loading.value = false
602
+ playing.value = false
603
+ errored.value = true
604
+ emit('error', e)
605
+ }
606
+
607
+ const onProgress = (e: UniCustomEvent<UTSJSONObject>): void => {
608
+ if (e.detail['buffered'] != null) {
609
+ buffered.value = toNumber(e.detail['buffered'], 0)
610
+ }
611
+ emit('progress', e)
612
+ }
613
+
614
+ const onFullscreenChange = (e: UniCustomEvent<UTSJSONObject>): void => {
615
+ fullscreen.value = e.detail['fullScreen'] == true
616
+ showControls()
617
+ emit('fullscreenchange', e)
618
+ }
619
+
620
+ const onLoadedMetadata = (e: UniCustomEvent<UTSJSONObject>): void => {
621
+ if (toNumber(e.detail['duration'], 0) > 0) {
622
+ videoDuration.value = toNumber(e.detail['duration'], 0)
623
+ }
624
+ loading.value = false
625
+ emit('loadedmetadata', e)
626
+ }
627
+
628
+ // ============ 控制层显示 ============
629
+ const clearHideTimer = (): void => {
630
+ if (hideTimer != 0) {
631
+ clearTimeout(hideTimer)
632
+ hideTimer = 0
633
+ }
634
+ }
635
+
636
+ const scheduleHide = (): void => {
637
+ clearHideTimer()
638
+ const delay = toNumber(props.autoHide, 0)
639
+ if (delay <= 0) return
640
+ hideTimer = setTimeout(() => {
641
+ // 面板打开或暂停时不收起,避免操作被打断
642
+ if (panel.value != '' || !playing.value) return
643
+ controlsVisible.value = false
644
+ emit('controlstoggle', false)
645
+ }, delay)
646
+ }
647
+
648
+ const showControls = (): void => {
649
+ controlsVisible.value = true
650
+ scheduleHide()
651
+ }
652
+
653
+ const toggleControls = (): void => {
654
+ controlsVisible.value = !controlsVisible.value
655
+ emit('controlstoggle', controlsVisible.value)
656
+ if (controlsVisible.value) scheduleHide()
657
+ }
658
+
659
+ const togglePanel = (name: string): void => {
660
+ panel.value = panel.value == name ? '' : name
661
+ if (panel.value != '') clearHideTimer()
662
+ else scheduleHide()
663
+ }
664
+
665
+ const closePanel = (): void => {
666
+ panel.value = ''
667
+ scheduleHide()
668
+ }
669
+
670
+ const onPlayerTap = (): void => {
671
+ if (locked.value) return
672
+ if (panel.value != '') {
673
+ closePanel()
674
+ return
675
+ }
676
+ toggleControls()
677
+ }
678
+
679
+ const onCoverTap = (): void => {
680
+ play()
681
+ }
682
+
683
+ const toggleLock = (): void => {
684
+ locked.value = !locked.value
685
+ if (locked.value) {
686
+ panel.value = ''
687
+ controlsVisible.value = false
688
+ toast(t('up.video.lock'))
689
+ } else {
690
+ showControls()
691
+ toast(t('up.video.unlock'))
692
+ }
693
+ emit('lock', locked.value)
694
+ }
695
+
696
+ const onBack = (): void => {
697
+ if (fullscreen.value) {
698
+ exitFullScreen()
699
+ return
700
+ }
701
+ emit('back')
702
+ }
703
+
704
+ // ============ 进度拖动 ============
705
+ const onProgressStart = (): void => {
706
+ dragging.value = true
707
+ dragPercent.value = timeToProgress(currentTime.value, videoDuration.value)
708
+ clearHideTimer()
709
+ }
710
+
711
+ const onProgressChanging = (percent: number): void => {
712
+ dragPercent.value = percent
713
+ }
714
+
715
+ const onProgressChange = (percent: number): void => {
716
+ dragging.value = false
717
+ seek(progressToTime(percent, videoDuration.value))
718
+ scheduleHide()
719
+ }
720
+
721
+ // ============ 倍速 ============
722
+ const applyRate = (): void => {
723
+ const context = getContext()
724
+ if (context != null) context.playbackRate(innerRate.value)
725
+ }
726
+
727
+ const setRate = (rate: any, silent: boolean = false): void => {
728
+ const value = toNumber(rate, 0)
729
+ if (value <= 0) return
730
+ innerRate.value = value
731
+ applyRate()
732
+ closePanel()
733
+ if (!silent) {
734
+ emit('update:rate', value)
735
+ emit('ratechange', value)
736
+ }
737
+ }
738
+
739
+ // ============ 音量 ============
740
+ // uni-app-x 没有播放器级音量接口,App 端只能靠 muted 静音,
741
+ // 因此这里只维护内部状态并同步给 video 的 muted。
742
+ const applyVolume = (): void => {
743
+ if (innerVolume.value <= 0) innerMuted.value = true
744
+ return innerMuted.value ? 0 : clampNumber(innerVolume.value, 0, 1)
745
+ }
746
+
747
+ const setVolume = (value: any, silent: boolean = false): void => {
748
+ innerVolume.value = clampNumber(value, 0, 1)
749
+ if (innerVolume.value > 0) innerMuted.value = false
750
+ applyVolume()
751
+ if (!silent) {
752
+ emit('update:volume', innerVolume.value)
753
+ emit('volumechange', {
754
+ volume: innerVolume.value,
755
+ muted: innerMuted.value
756
+ } as UTSJSONObject)
757
+ }
758
+ }
759
+
760
+ const onVolumeChanging = (percent: number): void => {
761
+ setVolume(percent / 100, true)
762
+ }
763
+
764
+ const onVolumeChange = (percent: number): void => {
765
+ setVolume(percent / 100)
766
+ }
767
+
768
+ const toggleMute = (): void => {
769
+ innerMuted.value = !innerMuted.value
770
+ applyVolume()
771
+ emit('volumechange', {
772
+ volume: innerVolume.value,
773
+ muted: innerMuted.value
774
+ } as UTSJSONObject)
775
+ }
776
+
777
+ // ============ 弹幕 ============
778
+ const toggleDanmu = (): void => {
779
+ innerDanmuOpen.value = !innerDanmuOpen.value
780
+ emit('update:danmuOpen', innerDanmuOpen.value)
781
+ emit('danmu-toggle', innerDanmuOpen.value)
782
+ }
783
+
784
+ const sendDanmu = (payload: any = null): UTSJSONObject | null => {
785
+ let text = ''
786
+ let color = props.danmuColor
787
+ let type = 'scroll'
788
+ if (typeof payload == 'string') {
789
+ text = payload
790
+ } else if (payload != null) {
791
+ const source = payload as UTSJSONObject
792
+ if ((source['text'] ?? '') != '') text = source['text'] as string
793
+ if ((source['color'] ?? '') != '') color = source['color'] as string
794
+ if ((source['type'] ?? '') != '') type = source['type'] as string
795
+ } else {
796
+ text = danmuText.value
797
+ }
798
+ if (text == '') return null
799
+ const item = {
800
+ text: text,
801
+ color: color,
802
+ time: currentTime.value,
803
+ type: type
804
+ } as UTSJSONObject
805
+ if (danmaku.value != null) {
806
+ if (!innerDanmuOpen.value) {
807
+ innerDanmuOpen.value = true
808
+ emit('update:danmuOpen', true)
809
+ }
810
+ danmaku.value?.$callMethod('push', item)
811
+ }
812
+ danmuText.value = ''
813
+ closePanel()
814
+ emit('danmu', item)
815
+ return item
816
+ }
817
+
818
+ const onDanmuInput = (e: UniInputInputEvent): void => {
819
+ danmuText.value = e.detail.value
820
+ }
821
+
822
+ const onDanmuConfirm = (e: UniEvent): void => {
823
+ sendDanmu(null)
824
+ }
825
+
826
+ // ============ 选集 ============
827
+ const switchEpisode = (index: any, silent: boolean = false): void => {
828
+ closePanel()
829
+ const target = parseInt(index.toString())
830
+ if (isNaN(target) || target < 0 || target >= episodeList.value.length) return
831
+ if (target == innerEpisodeIndex.value && started.value) return
832
+ innerEpisodeIndex.value = target
833
+ resetPlayback()
834
+ if (!silent) {
835
+ emit('update:episodeIndex', target)
836
+ emit('episode-change', {
837
+ index: target,
838
+ episode: episodeList.value[target]
839
+ } as UTSJSONObject)
840
+ }
841
+ // 等 src 生效后再播,否则部分平台会播上一集
842
+ nextTick(() => play())
843
+ }
844
+
845
+ const playNext = (): void => {
846
+ switchEpisode(innerEpisodeIndex.value + 1)
847
+ }
848
+
849
+ // ============ 全屏 ============
850
+ const requestFullScreen = (): void => {
851
+ const context = getContext()
852
+ if (context == null) return
853
+ const direction = nativeDirection.value
854
+ if (direction == -1) {
855
+ context.requestFullScreen({} as RequestFullScreenOptions)
856
+ } else {
857
+ context.requestFullScreen({ direction: direction } as RequestFullScreenOptions)
858
+ }
859
+ }
860
+
861
+ const exitFullScreen = (): void => {
862
+ const context = getContext()
863
+ if (context != null) context.exitFullScreen()
864
+ }
865
+
866
+ const toggleFullscreen = (): void => {
867
+ if (fullscreen.value) {
868
+ exitFullScreen()
869
+ } else {
870
+ requestFullScreen()
871
+ }
872
+ }
873
+
874
+ // ============ 广告 ============
875
+ const clearAdTimer = (): void => {
876
+ if (adTimer != 0) {
877
+ clearInterval(adTimer)
878
+ adTimer = 0
879
+ }
880
+ }
881
+
882
+ const finishAd = (skipped: boolean = false): void => {
883
+ const ad = currentAd.value
884
+ const role = adRole.value
885
+ clearAdTimer()
886
+ currentAd.value = null
887
+ adRole.value = ''
888
+ adElapsed.value = 0
889
+ adDuration.value = 0
890
+ if (ad != null) {
891
+ emit('ad-end', { ad: ad, skipped: skipped } as UTSJSONObject)
892
+ }
893
+ nextTick(() => {
894
+ if (role == 'preroll') {
895
+ if (!playAdQueue('preroll')) playMain()
896
+ return
897
+ }
898
+ if (role == 'postroll' && !playAdQueue('postroll')) {
899
+ // 后置广告播完回到封面
900
+ started.value = false
901
+ currentTime.value = 0
902
+ }
903
+ })
904
+ }
905
+
906
+ const startAd = (ad: UPVideoAd): void => {
907
+ // 先落 currentAd,再暂停正片,避免异步的 pause 事件把暂停贴片顶出来
908
+ currentAd.value = ad
909
+ adElapsed.value = 0
910
+ adDuration.value = toNumber(ad.duration, 0)
911
+ panel.value = ''
912
+ pause()
913
+ closePauseAd()
914
+ emit('ad-start', ad)
915
+ // 图片广告没有 timeupdate,用定时器走倒计时
916
+ if (ad.src == '') {
917
+ clearAdTimer()
918
+ adTimer = setInterval(() => {
919
+ adElapsed.value += 0.5
920
+ if (adDuration.value > 0 && adElapsed.value >= adDuration.value) finishAd()
921
+ }, 500)
922
+ }
923
+ }
924
+
925
+ const playAdQueue = (role: string): boolean => {
926
+ const list = role == 'preroll' ? prerollAds.value : postrollAds.value
927
+ const cursor = role == 'preroll' ? prerollCursor : postrollCursor
928
+ if (cursor.value >= list.length) return false
929
+ const ad = list[cursor.value]
930
+ cursor.value += 1
931
+ adRole.value = role
932
+ startAd(ad)
933
+ return true
934
+ }
935
+
936
+ const onAdTimeUpdate = (e: UniCustomEvent<UTSJSONObject>): void => {
937
+ if (e.detail['currentTime'] != null) {
938
+ adElapsed.value = toNumber(e.detail['currentTime'], 0)
939
+ }
940
+ if (adDuration.value == 0 && toNumber(e.detail['duration'], 0) > 0) {
941
+ adDuration.value = toNumber(e.detail['duration'], 0)
942
+ }
943
+ }
944
+
945
+ const onAdEnded = (e: UniEvent): void => {
946
+ finishAd(false)
947
+ }
948
+
949
+ const skipAd = (): void => {
950
+ if (!adCanSkip.value) return
951
+ emit('ad-skip', currentAd.value)
952
+ finishAd(true)
953
+ }
954
+
955
+ const onAdClick = (): void => {
956
+ // 只抛事件,跳转交给业务侧决定
957
+ emit('ad-click', currentAd.value ?? pauseAdItem.value)
958
+ }
959
+
960
+ const closePauseAd = (): void => {
961
+ pauseAdVisible.value = false
962
+ }
963
+
964
+ // ============ 监听 ============
965
+ watch((): string => props.src, () => {
966
+ resetPlayback()
967
+ })
968
+
969
+ watch((): number => parseInt(props.episodeIndex.toString()) || 0, (value: number) => {
970
+ if (value != innerEpisodeIndex.value) switchEpisode(value, true)
971
+ })
972
+
973
+ watch((): number => toNumber(props.rate, 0), (value: number) => {
974
+ if (value > 0) setRate(value, true)
975
+ })
976
+
977
+ watch((): number => clampNumber(props.volume, 0, 1), (value: number) => {
978
+ innerVolume.value = value
979
+ applyVolume()
980
+ })
981
+
982
+ watch((): boolean => props.muted, (value: boolean) => {
983
+ innerMuted.value = value
984
+ applyVolume()
985
+ })
986
+
987
+ watch((): boolean => props.danmuOpen, (value: boolean) => {
988
+ innerDanmuOpen.value = value
989
+ })
990
+
991
+ onMounted(() => {
992
+ applyVolume()
993
+ if (props.autoplay) {
994
+ // 原生 autoplay 已经被前置广告接管时,这里补一次调度
995
+ if (prerollAds.value.length > 0) {
996
+ play()
997
+ } else {
998
+ started.value = true
999
+ }
1000
+ }
1001
+ scheduleHide()
1002
+ })
1003
+
1004
+ onBeforeUnmount(() => {
1005
+ clearHideTimer()
1006
+ clearAdTimer()
1007
+ })
1008
+
1009
+ defineExpose({
1010
+ play,
1011
+ pause,
1012
+ toggle,
1013
+ stop,
1014
+ seek,
1015
+ retry,
1016
+ sendDanmu,
1017
+ toggleDanmu,
1018
+ toggleControls,
1019
+ toggleLock,
1020
+ toggleFullscreen,
1021
+ requestFullScreen,
1022
+ exitFullScreen,
1023
+ switchEpisode,
1024
+ playNext,
1025
+ skipAd,
1026
+ closePanel,
1027
+ closePauseAd,
1028
+ playing,
1029
+ started,
1030
+ currentTime,
1031
+ videoDuration,
1032
+ fullscreen,
1033
+ locked,
1034
+ panel
1035
+ })
1036
+ </script>
1037
+
1038
+ <style lang="scss" scoped>
1039
+ @import "../../libs/css/components.scss";
1040
+
1041
+ .up-video {
1042
+ position: relative;
1043
+ overflow: hidden;
1044
+ background-color: #000000;
1045
+ }
1046
+
1047
+ .up-video__player {
1048
+ width: 100%;
1049
+ height: 100%;
1050
+ }
1051
+
1052
+ /* 控制层统一铺满 video 节点 */
1053
+ .up-video__layer {
1054
+ position: absolute;
1055
+ top: 0;
1056
+ left: 0;
1057
+ right: 0;
1058
+ bottom: 0;
1059
+ }
1060
+
1061
+ .up-video__danmu-layer {
1062
+ position: absolute;
1063
+ top: 0;
1064
+ left: 0;
1065
+ right: 0;
1066
+ bottom: 0;
1067
+ }
1068
+
1069
+ .up-video__center {
1070
+ align-items: center;
1071
+ justify-content: center;
1072
+ }
1073
+
1074
+ .up-video__mask {
1075
+ background-color: rgba(0, 0, 0, 0.5);
1076
+ }
1077
+
1078
+ .up-video__hint {
1079
+ color: #ffffff;
1080
+ font-size: 14px;
1081
+ }
1082
+
1083
+ .up-video__retry {
1084
+ flex-direction: row;
1085
+ align-items: center;
1086
+ justify-content: center;
1087
+ margin-top: 10px;
1088
+ padding: 4px 14px;
1089
+ border-radius: 30px;
1090
+ border-width: 1px;
1091
+ border-style: solid;
1092
+ border-color: rgba(255, 255, 255, 0.7);
1093
+ }
1094
+
1095
+ .up-video__retry-text {
1096
+ color: #ffffff;
1097
+ font-size: 12px;
1098
+ }
1099
+
1100
+ .up-video__cover {
1101
+ align-items: center;
1102
+ justify-content: center;
1103
+ background-color: #000000;
1104
+ }
1105
+
1106
+ .up-video__cover-image {
1107
+ position: absolute;
1108
+ top: 0;
1109
+ left: 0;
1110
+ width: 100%;
1111
+ height: 100%;
1112
+ }
1113
+
1114
+ .up-video__cover-mask {
1115
+ position: absolute;
1116
+ top: 0;
1117
+ left: 0;
1118
+ right: 0;
1119
+ bottom: 0;
1120
+ background-color: rgba(0, 0, 0, 0.25);
1121
+ }
1122
+
1123
+ .up-video__cover-btn {
1124
+ width: 52px;
1125
+ height: 52px;
1126
+ border-radius: 26px;
1127
+ flex-direction: row;
1128
+ align-items: center;
1129
+ justify-content: center;
1130
+ background-color: rgba(0, 0, 0, 0.45);
1131
+ }
1132
+
1133
+ .up-video__top {
1134
+ position: absolute;
1135
+ top: 0;
1136
+ left: 0;
1137
+ right: 0;
1138
+ height: 40px;
1139
+ flex-direction: row;
1140
+ align-items: center;
1141
+ padding-left: 6px;
1142
+ padding-right: 6px;
1143
+ background-color: rgba(0, 0, 0, 0.3);
1144
+ }
1145
+
1146
+ .up-video__top-title {
1147
+ flex: 1;
1148
+ margin-left: 6px;
1149
+ color: #ffffff;
1150
+ font-size: 14px;
1151
+ lines: 1;
1152
+ text-overflow: ellipsis;
1153
+ overflow: hidden;
1154
+ }
1155
+
1156
+ .up-video__icon-btn {
1157
+ width: 30px;
1158
+ height: 30px;
1159
+ flex-direction: row;
1160
+ align-items: center;
1161
+ justify-content: center;
1162
+ }
1163
+
1164
+ .up-video__text-btn {
1165
+ height: 30px;
1166
+ padding-left: 5px;
1167
+ padding-right: 5px;
1168
+ flex-direction: row;
1169
+ align-items: center;
1170
+ justify-content: center;
1171
+ }
1172
+
1173
+ .up-video__btn-text {
1174
+ color: #ffffff;
1175
+ font-size: 12px;
1176
+ }
1177
+
1178
+ .up-video__controls {
1179
+ position: absolute;
1180
+ left: 0;
1181
+ right: 0;
1182
+ bottom: 0;
1183
+ padding-left: 4px;
1184
+ padding-right: 4px;
1185
+ background-color: rgba(0, 0, 0, 0.35);
1186
+ }
1187
+
1188
+ .up-video__row {
1189
+ flex-direction: row;
1190
+ align-items: center;
1191
+ }
1192
+
1193
+ .up-video__time {
1194
+ width: 44px;
1195
+ color: #ffffff;
1196
+ font-size: 11px;
1197
+ text-align: center;
1198
+ }
1199
+
1200
+ .up-video__unlock {
1201
+ position: absolute;
1202
+ left: 12px;
1203
+ top: 50%;
1204
+ margin-top: -16px;
1205
+ width: 32px;
1206
+ height: 32px;
1207
+ border-radius: 16px;
1208
+ flex-direction: row;
1209
+ align-items: center;
1210
+ justify-content: center;
1211
+ background-color: rgba(0, 0, 0, 0.5);
1212
+ }
1213
+
1214
+ /* 全屏图标用 4 个角括号拼出来,图标字体里没有对应字形 */
1215
+ .up-video__fullscreen {
1216
+ position: relative;
1217
+ width: 15px;
1218
+ height: 15px;
1219
+ }
1220
+
1221
+ .up-video__corner-tl,
1222
+ .up-video__corner-tr,
1223
+ .up-video__corner-bl,
1224
+ .up-video__corner-br {
1225
+ position: absolute;
1226
+ width: 6px;
1227
+ height: 6px;
1228
+ border-style: solid;
1229
+ border-color: #ffffff;
1230
+ border-top-width: 0;
1231
+ border-right-width: 0;
1232
+ border-bottom-width: 0;
1233
+ border-left-width: 0;
1234
+ }
1235
+
1236
+ .up-video__corner-tl {
1237
+ top: 0;
1238
+ left: 0;
1239
+ border-top-width: 2px;
1240
+ border-left-width: 2px;
1241
+ }
1242
+
1243
+ .up-video__corner-tr {
1244
+ top: 0;
1245
+ right: 0;
1246
+ border-top-width: 2px;
1247
+ border-right-width: 2px;
1248
+ }
1249
+
1250
+ .up-video__corner-bl {
1251
+ bottom: 0;
1252
+ left: 0;
1253
+ border-bottom-width: 2px;
1254
+ border-left-width: 2px;
1255
+ }
1256
+
1257
+ .up-video__corner-br {
1258
+ bottom: 0;
1259
+ right: 0;
1260
+ border-bottom-width: 2px;
1261
+ border-right-width: 2px;
1262
+ }
1263
+
1264
+ .up-video__panel {
1265
+ flex-direction: row;
1266
+ justify-content: flex-end;
1267
+ background-color: rgba(0, 0, 0, 0.4);
1268
+ }
1269
+
1270
+ .up-video__panel-body {
1271
+ width: 104px;
1272
+ height: 100%;
1273
+ padding: 10px;
1274
+ background-color: rgba(0, 0, 0, 0.85);
1275
+ }
1276
+
1277
+ .up-video__panel-body--wide {
1278
+ width: 240px;
1279
+ }
1280
+
1281
+ .up-video__panel-title {
1282
+ color: rgba(255, 255, 255, 0.6);
1283
+ font-size: 12px;
1284
+ margin-bottom: 6px;
1285
+ }
1286
+
1287
+ .up-video__panel-item {
1288
+ height: 32px;
1289
+ justify-content: center;
1290
+ }
1291
+
1292
+ .up-video__panel-text {
1293
+ font-size: 13px;
1294
+ }
1295
+
1296
+ .up-video__episode-grid {
1297
+ flex-direction: row;
1298
+ flex-wrap: wrap;
1299
+ }
1300
+
1301
+ .up-video__episode {
1302
+ height: 32px;
1303
+ margin: 3px;
1304
+ border-radius: 4px;
1305
+ flex-direction: row;
1306
+ align-items: center;
1307
+ justify-content: center;
1308
+ }
1309
+
1310
+ .up-video__episode-text {
1311
+ color: #ffffff;
1312
+ font-size: 12px;
1313
+ }
1314
+
1315
+ .up-video__volume {
1316
+ position: absolute;
1317
+ right: 44px;
1318
+ bottom: 44px;
1319
+ width: 200px;
1320
+ flex-direction: row;
1321
+ align-items: center;
1322
+ padding-left: 4px;
1323
+ padding-right: 10px;
1324
+ border-radius: 30px;
1325
+ background-color: rgba(0, 0, 0, 0.85);
1326
+ }
1327
+
1328
+ .up-video__volume-label {
1329
+ color: rgba(255, 255, 255, 0.7);
1330
+ font-size: 11px;
1331
+ margin-right: 6px;
1332
+ }
1333
+
1334
+ .up-video__volume-value {
1335
+ width: 28px;
1336
+ margin-left: 6px;
1337
+ color: #ffffff;
1338
+ font-size: 11px;
1339
+ text-align: right;
1340
+ }
1341
+
1342
+ .up-video__ad {
1343
+ position: absolute;
1344
+ top: 0;
1345
+ left: 0;
1346
+ right: 0;
1347
+ bottom: 0;
1348
+ background-color: #000000;
1349
+ }
1350
+
1351
+ .up-video__ad-media {
1352
+ width: 100%;
1353
+ height: 100%;
1354
+ }
1355
+
1356
+ .up-video__ad-bar {
1357
+ position: absolute;
1358
+ top: 8px;
1359
+ right: 8px;
1360
+ flex-direction: row;
1361
+ align-items: center;
1362
+ }
1363
+
1364
+ .up-video__ad-tag {
1365
+ color: #ffffff;
1366
+ font-size: 11px;
1367
+ padding: 2px 6px;
1368
+ border-radius: 3px;
1369
+ background-color: rgba(0, 0, 0, 0.55);
1370
+ }
1371
+
1372
+ .up-video__ad-btn {
1373
+ margin-left: 6px;
1374
+ padding: 2px 8px;
1375
+ border-radius: 3px;
1376
+ flex-direction: row;
1377
+ align-items: center;
1378
+ border-width: 1px;
1379
+ border-style: solid;
1380
+ border-color: rgba(255, 255, 255, 0.6);
1381
+ background-color: rgba(0, 0, 0, 0.55);
1382
+ }
1383
+
1384
+ .up-video__ad-btn-text {
1385
+ color: #ffffff;
1386
+ font-size: 11px;
1387
+ }
1388
+
1389
+ .up-video__pause-ad {
1390
+ position: absolute;
1391
+ top: 0;
1392
+ left: 0;
1393
+ right: 0;
1394
+ bottom: 0;
1395
+ align-items: center;
1396
+ justify-content: center;
1397
+ background-color: rgba(0, 0, 0, 0.6);
1398
+ }
1399
+
1400
+ .up-video__pause-ad-media {
1401
+ width: 70%;
1402
+ height: 60%;
1403
+ }
1404
+
1405
+ .up-video__pause-ad-close {
1406
+ position: absolute;
1407
+ top: 8px;
1408
+ right: 8px;
1409
+ width: 24px;
1410
+ height: 24px;
1411
+ border-radius: 12px;
1412
+ flex-direction: row;
1413
+ align-items: center;
1414
+ justify-content: center;
1415
+ background-color: rgba(0, 0, 0, 0.6);
1416
+ }
1417
+
1418
+ .up-video__danmu-input {
1419
+ position: absolute;
1420
+ left: 8px;
1421
+ right: 8px;
1422
+ bottom: 8px;
1423
+ flex-direction: row;
1424
+ align-items: center;
1425
+ padding: 4px 4px 4px 12px;
1426
+ border-radius: 30px;
1427
+ background-color: rgba(0, 0, 0, 0.85);
1428
+ }
1429
+
1430
+ .up-video__danmu-field {
1431
+ flex: 1;
1432
+ height: 30px;
1433
+ color: #ffffff;
1434
+ font-size: 13px;
1435
+ }
1436
+
1437
+ .up-video__danmu-send {
1438
+ height: 28px;
1439
+ padding-left: 14px;
1440
+ padding-right: 14px;
1441
+ border-radius: 20px;
1442
+ flex-direction: row;
1443
+ align-items: center;
1444
+ justify-content: center;
1445
+ }
1446
+
1447
+ .up-video__danmu-send-text {
1448
+ color: #ffffff;
1449
+ font-size: 12px;
1450
+ }
1451
+ </style>