oxy-uni-ui 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (355) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +13 -0
  3. package/attributes.json +1 -0
  4. package/components/common/AbortablePromise.ts +28 -0
  5. package/components/common/abstracts/_config.scss +7 -0
  6. package/components/common/abstracts/_function.scss +89 -0
  7. package/components/common/abstracts/_mixin.scss +385 -0
  8. package/components/common/abstracts/variable.scss +974 -0
  9. package/components/common/base64.ts +29 -0
  10. package/components/common/canvasHelper.ts +49 -0
  11. package/components/common/clickoutside.ts +25 -0
  12. package/components/common/event.ts +8 -0
  13. package/components/common/interceptor.ts +43 -0
  14. package/components/common/props.ts +51 -0
  15. package/components/common/util.ts +778 -0
  16. package/components/composables/index.ts +11 -0
  17. package/components/composables/useCell.ts +13 -0
  18. package/components/composables/useChildren.ts +113 -0
  19. package/components/composables/useCountDown.ts +138 -0
  20. package/components/composables/useLockScroll.ts +37 -0
  21. package/components/composables/useParent.ts +41 -0
  22. package/components/composables/usePopover.ts +176 -0
  23. package/components/composables/useQueue.ts +52 -0
  24. package/components/composables/useRaf.ts +37 -0
  25. package/components/composables/useTouch.ts +43 -0
  26. package/components/composables/useTranslate.ts +12 -0
  27. package/components/composables/useUpload.ts +364 -0
  28. package/components/oxy-action-sheet/index.scss +204 -0
  29. package/components/oxy-action-sheet/oxy-action-sheet.vue +155 -0
  30. package/components/oxy-action-sheet/types.ts +118 -0
  31. package/components/oxy-backtop/index.scss +25 -0
  32. package/components/oxy-backtop/oxy-backtop.vue +45 -0
  33. package/components/oxy-backtop/types.ts +37 -0
  34. package/components/oxy-badge/index.scss +63 -0
  35. package/components/oxy-badge/oxy-badge.vue +61 -0
  36. package/components/oxy-badge/types.ts +41 -0
  37. package/components/oxy-button/index.scss +336 -0
  38. package/components/oxy-button/oxy-button.vue +195 -0
  39. package/components/oxy-button/types.ts +133 -0
  40. package/components/oxy-calendar/index.scss +158 -0
  41. package/components/oxy-calendar/oxy-calendar.vue +451 -0
  42. package/components/oxy-calendar/types.ts +217 -0
  43. package/components/oxy-calendar-view/index.scss +0 -0
  44. package/components/oxy-calendar-view/month/index.scss +162 -0
  45. package/components/oxy-calendar-view/month/month.vue +389 -0
  46. package/components/oxy-calendar-view/month/types.ts +20 -0
  47. package/components/oxy-calendar-view/monthPanel/index.scss +89 -0
  48. package/components/oxy-calendar-view/monthPanel/month-panel.vue +374 -0
  49. package/components/oxy-calendar-view/monthPanel/types.ts +48 -0
  50. package/components/oxy-calendar-view/oxy-calendar-view.vue +111 -0
  51. package/components/oxy-calendar-view/types.ts +109 -0
  52. package/components/oxy-calendar-view/utils.ts +429 -0
  53. package/components/oxy-calendar-view/year/index.scss +153 -0
  54. package/components/oxy-calendar-view/year/types.ts +20 -0
  55. package/components/oxy-calendar-view/year/year.vue +202 -0
  56. package/components/oxy-calendar-view/yearPanel/index.scss +24 -0
  57. package/components/oxy-calendar-view/yearPanel/types.ts +38 -0
  58. package/components/oxy-calendar-view/yearPanel/year-panel.vue +135 -0
  59. package/components/oxy-card/index.scss +71 -0
  60. package/components/oxy-card/oxy-card.vue +37 -0
  61. package/components/oxy-card/types.ts +30 -0
  62. package/components/oxy-cell/index.scss +206 -0
  63. package/components/oxy-cell/oxy-cell.vue +140 -0
  64. package/components/oxy-cell/types.ts +111 -0
  65. package/components/oxy-cell-group/index.scss +56 -0
  66. package/components/oxy-cell-group/oxy-cell-group.vue +45 -0
  67. package/components/oxy-cell-group/types.ts +32 -0
  68. package/components/oxy-checkbox/index.scss +285 -0
  69. package/components/oxy-checkbox/oxy-checkbox.vue +177 -0
  70. package/components/oxy-checkbox/types.ts +68 -0
  71. package/components/oxy-checkbox-group/index.scss +20 -0
  72. package/components/oxy-checkbox-group/oxy-checkbox-group.vue +100 -0
  73. package/components/oxy-checkbox-group/types.ts +59 -0
  74. package/components/oxy-circle/index.scss +18 -0
  75. package/components/oxy-circle/oxy-circle.vue +296 -0
  76. package/components/oxy-circle/types.ts +54 -0
  77. package/components/oxy-col/index.scss +19 -0
  78. package/components/oxy-col/oxy-col.vue +49 -0
  79. package/components/oxy-col/types.ts +15 -0
  80. package/components/oxy-col-picker/index.scss +168 -0
  81. package/components/oxy-col-picker/oxy-col-picker.vue +498 -0
  82. package/components/oxy-col-picker/types.ts +166 -0
  83. package/components/oxy-collapse/index.scss +55 -0
  84. package/components/oxy-collapse/oxy-collapse.vue +151 -0
  85. package/components/oxy-collapse/types.ts +58 -0
  86. package/components/oxy-collapse-item/index.scss +90 -0
  87. package/components/oxy-collapse-item/oxy-collapse-item.vue +171 -0
  88. package/components/oxy-collapse-item/types.ts +48 -0
  89. package/components/oxy-config-provider/oxy-config-provider.vue +73 -0
  90. package/components/oxy-config-provider/types.ts +1052 -0
  91. package/components/oxy-count-down/index.scss +15 -0
  92. package/components/oxy-count-down/oxy-count-down.vue +60 -0
  93. package/components/oxy-count-down/types.ts +41 -0
  94. package/components/oxy-count-down/utils.ts +52 -0
  95. package/components/oxy-count-to/index.scss +7 -0
  96. package/components/oxy-count-to/oxy-count-to.vue +125 -0
  97. package/components/oxy-count-to/types.ts +117 -0
  98. package/components/oxy-curtain/index.scss +85 -0
  99. package/components/oxy-curtain/oxy-curtain.vue +172 -0
  100. package/components/oxy-curtain/types.ts +73 -0
  101. package/components/oxy-datetime-picker/index.scss +164 -0
  102. package/components/oxy-datetime-picker/oxy-datetime-picker.vue +801 -0
  103. package/components/oxy-datetime-picker/types.ts +231 -0
  104. package/components/oxy-datetime-picker-view/oxy-datetime-picker-view.vue +499 -0
  105. package/components/oxy-datetime-picker-view/types.ts +120 -0
  106. package/components/oxy-datetime-picker-view/util.ts +30 -0
  107. package/components/oxy-design-uni/oxy-design-uni.vue +5 -0
  108. package/components/oxy-divider/index.scss +100 -0
  109. package/components/oxy-divider/oxy-divider.vue +52 -0
  110. package/components/oxy-divider/types.ts +35 -0
  111. package/components/oxy-drop-menu/index.scss +86 -0
  112. package/components/oxy-drop-menu/oxy-drop-menu.vue +166 -0
  113. package/components/oxy-drop-menu/types.ts +38 -0
  114. package/components/oxy-drop-menu-item/index.scss +66 -0
  115. package/components/oxy-drop-menu-item/oxy-drop-menu-item.vue +221 -0
  116. package/components/oxy-drop-menu-item/types.ts +94 -0
  117. package/components/oxy-fab/index.scss +116 -0
  118. package/components/oxy-fab/oxy-fab.vue +276 -0
  119. package/components/oxy-fab/types.ts +66 -0
  120. package/components/oxy-floating-panel/index.scss +64 -0
  121. package/components/oxy-floating-panel/oxy-floating-panel.vue +140 -0
  122. package/components/oxy-floating-panel/type.ts +32 -0
  123. package/components/oxy-form/oxy-form.vue +207 -0
  124. package/components/oxy-form/types.ts +76 -0
  125. package/components/oxy-form-item/index.scss +18 -0
  126. package/components/oxy-form-item/oxy-form-item.vue +56 -0
  127. package/components/oxy-form-item/types.ts +16 -0
  128. package/components/oxy-gap/index.scss +9 -0
  129. package/components/oxy-gap/oxy-gap.vue +36 -0
  130. package/components/oxy-gap/types.ts +17 -0
  131. package/components/oxy-grid/index.scss +9 -0
  132. package/components/oxy-grid/oxy-grid.vue +106 -0
  133. package/components/oxy-grid/types.ts +50 -0
  134. package/components/oxy-grid-item/index.scss +148 -0
  135. package/components/oxy-grid-item/oxy-grid-item.vue +176 -0
  136. package/components/oxy-grid-item/types.ts +77 -0
  137. package/components/oxy-icon/index.scss +1230 -0
  138. package/components/oxy-icon/oxy-icon.vue +53 -0
  139. package/components/oxy-icon/oxy-icons.ttf +0 -0
  140. package/components/oxy-icon/types.ts +21 -0
  141. package/components/oxy-img/index.scss +19 -0
  142. package/components/oxy-img/oxy-img.vue +81 -0
  143. package/components/oxy-img/types.ts +61 -0
  144. package/components/oxy-img-cropper/index.scss +231 -0
  145. package/components/oxy-img-cropper/oxy-img-cropper.vue +664 -0
  146. package/components/oxy-img-cropper/types.ts +76 -0
  147. package/components/oxy-index-anchor/index.scss +35 -0
  148. package/components/oxy-index-anchor/oxy-index-anchor.vue +55 -0
  149. package/components/oxy-index-anchor/type.ts +9 -0
  150. package/components/oxy-index-bar/index.scss +39 -0
  151. package/components/oxy-index-bar/oxy-index-bar.vue +156 -0
  152. package/components/oxy-index-bar/type.ts +23 -0
  153. package/components/oxy-input/index.scss +323 -0
  154. package/components/oxy-input/oxy-input.vue +300 -0
  155. package/components/oxy-input/placeholder.scss +21 -0
  156. package/components/oxy-input/types.ts +189 -0
  157. package/components/oxy-input-number/index.scss +132 -0
  158. package/components/oxy-input-number/oxy-input-number.vue +464 -0
  159. package/components/oxy-input-number/types.ts +101 -0
  160. package/components/oxy-keyboard/constants.ts +81 -0
  161. package/components/oxy-keyboard/index.scss +102 -0
  162. package/components/oxy-keyboard/key/index.scss +79 -0
  163. package/components/oxy-keyboard/key/index.vue +76 -0
  164. package/components/oxy-keyboard/key/types.ts +11 -0
  165. package/components/oxy-keyboard/oxy-keyboard.vue +206 -0
  166. package/components/oxy-keyboard/types.ts +92 -0
  167. package/components/oxy-loading/index.scss +37 -0
  168. package/components/oxy-loading/oxy-loading.vue +90 -0
  169. package/components/oxy-loading/types.ts +22 -0
  170. package/components/oxy-loadmore/index.scss +39 -0
  171. package/components/oxy-loadmore/oxy-loadmore.vue +59 -0
  172. package/components/oxy-loadmore/types.ts +30 -0
  173. package/components/oxy-message-box/index.scss +108 -0
  174. package/components/oxy-message-box/index.ts +87 -0
  175. package/components/oxy-message-box/oxy-message-box.vue +291 -0
  176. package/components/oxy-message-box/types.ts +132 -0
  177. package/components/oxy-navbar/index.scss +93 -0
  178. package/components/oxy-navbar/oxy-navbar.vue +111 -0
  179. package/components/oxy-navbar/types.ts +52 -0
  180. package/components/oxy-navbar-capsule/index.scss +66 -0
  181. package/components/oxy-navbar-capsule/oxy-navbar-capsule.vue +35 -0
  182. package/components/oxy-navbar-capsule/types.ts +8 -0
  183. package/components/oxy-notice-bar/index.scss +68 -0
  184. package/components/oxy-notice-bar/oxy-notice-bar.vue +266 -0
  185. package/components/oxy-notice-bar/types.ts +67 -0
  186. package/components/oxy-notify/index.scss +34 -0
  187. package/components/oxy-notify/index.ts +61 -0
  188. package/components/oxy-notify/oxy-notify.vue +85 -0
  189. package/components/oxy-notify/types.ts +66 -0
  190. package/components/oxy-number-keyboard/index.scss +78 -0
  191. package/components/oxy-number-keyboard/key/index.scss +81 -0
  192. package/components/oxy-number-keyboard/key/index.vue +78 -0
  193. package/components/oxy-number-keyboard/key/types.ts +11 -0
  194. package/components/oxy-number-keyboard/oxy-number-keyboard.vue +151 -0
  195. package/components/oxy-number-keyboard/types.ts +83 -0
  196. package/components/oxy-overlay/index.scss +17 -0
  197. package/components/oxy-overlay/oxy-overlay.vue +47 -0
  198. package/components/oxy-overlay/types.ts +25 -0
  199. package/components/oxy-pagination/index.scss +57 -0
  200. package/components/oxy-pagination/oxy-pagination.vue +110 -0
  201. package/components/oxy-pagination/types.ts +41 -0
  202. package/components/oxy-password-input/index.scss +124 -0
  203. package/components/oxy-password-input/oxy-password-input.vue +49 -0
  204. package/components/oxy-password-input/types.ts +33 -0
  205. package/components/oxy-picker/index.scss +110 -0
  206. package/components/oxy-picker/oxy-picker.vue +412 -0
  207. package/components/oxy-picker/types.ts +189 -0
  208. package/components/oxy-picker-view/index.scss +92 -0
  209. package/components/oxy-picker-view/oxy-picker-view.vue +369 -0
  210. package/components/oxy-picker-view/types.ts +152 -0
  211. package/components/oxy-popover/index.scss +116 -0
  212. package/components/oxy-popover/oxy-popover.vue +180 -0
  213. package/components/oxy-popover/types.ts +69 -0
  214. package/components/oxy-popup/index.scss +84 -0
  215. package/components/oxy-popup/oxy-popup.vue +169 -0
  216. package/components/oxy-popup/types.ts +95 -0
  217. package/components/oxy-progress/index.scss +68 -0
  218. package/components/oxy-progress/oxy-progress.vue +197 -0
  219. package/components/oxy-progress/types.ts +35 -0
  220. package/components/oxy-radio/index.scss +301 -0
  221. package/components/oxy-radio/oxy-radio.vue +118 -0
  222. package/components/oxy-radio/types.ts +42 -0
  223. package/components/oxy-radio-group/index.scss +23 -0
  224. package/components/oxy-radio-group/oxy-radio-group.vue +51 -0
  225. package/components/oxy-radio-group/types.ts +39 -0
  226. package/components/oxy-rate/index.scss +25 -0
  227. package/components/oxy-rate/oxy-rate.vue +178 -0
  228. package/components/oxy-rate/types.ts +103 -0
  229. package/components/oxy-resize/index.scss +27 -0
  230. package/components/oxy-resize/oxy-resize.vue +144 -0
  231. package/components/oxy-resize/types.ts +6 -0
  232. package/components/oxy-root-portal/oxy-root-portal.vue +50 -0
  233. package/components/oxy-row/index.scss +10 -0
  234. package/components/oxy-row/oxy-row.vue +42 -0
  235. package/components/oxy-row/types.ts +16 -0
  236. package/components/oxy-search/index.scss +148 -0
  237. package/components/oxy-search/oxy-search.vue +187 -0
  238. package/components/oxy-search/types.ts +93 -0
  239. package/components/oxy-segmented/index.scss +101 -0
  240. package/components/oxy-segmented/oxy-segmented.vue +143 -0
  241. package/components/oxy-segmented/types.ts +71 -0
  242. package/components/oxy-select-picker/index.scss +102 -0
  243. package/components/oxy-select-picker/oxy-select-picker.vue +432 -0
  244. package/components/oxy-select-picker/types.ts +123 -0
  245. package/components/oxy-sidebar/index.scss +25 -0
  246. package/components/oxy-sidebar/oxy-sidebar.vue +63 -0
  247. package/components/oxy-sidebar/types.ts +38 -0
  248. package/components/oxy-sidebar-item/index.scss +97 -0
  249. package/components/oxy-sidebar-item/oxy-sidebar-item.vue +116 -0
  250. package/components/oxy-sidebar-item/types.ts +31 -0
  251. package/components/oxy-signature/index.scss +31 -0
  252. package/components/oxy-signature/oxy-signature.vue +630 -0
  253. package/components/oxy-signature/types.ts +108 -0
  254. package/components/oxy-skeleton/index.scss +96 -0
  255. package/components/oxy-skeleton/index.ts +1 -0
  256. package/components/oxy-skeleton/oxy-skeleton.vue +110 -0
  257. package/components/oxy-skeleton/types.ts +69 -0
  258. package/components/oxy-slider/index.scss +98 -0
  259. package/components/oxy-slider/oxy-slider.vue +356 -0
  260. package/components/oxy-slider/types.ts +138 -0
  261. package/components/oxy-sort-button/index.scss +89 -0
  262. package/components/oxy-sort-button/oxy-sort-button.vue +69 -0
  263. package/components/oxy-sort-button/types.ts +43 -0
  264. package/components/oxy-status-tip/images/collect.png +0 -0
  265. package/components/oxy-status-tip/images/content.png +0 -0
  266. package/components/oxy-status-tip/images/network.png +0 -0
  267. package/components/oxy-status-tip/images/search.png +0 -0
  268. package/components/oxy-status-tip/index.scss +37 -0
  269. package/components/oxy-status-tip/oxy-status-tip.vue +71 -0
  270. package/components/oxy-status-tip/types.ts +50 -0
  271. package/components/oxy-step/index.scss +235 -0
  272. package/components/oxy-step/oxy-step.vue +150 -0
  273. package/components/oxy-step/types.ts +33 -0
  274. package/components/oxy-steps/index.scss +10 -0
  275. package/components/oxy-steps/oxy-steps.vue +28 -0
  276. package/components/oxy-steps/types.ts +50 -0
  277. package/components/oxy-sticky/index.scss +9 -0
  278. package/components/oxy-sticky/oxy-sticky.vue +190 -0
  279. package/components/oxy-sticky/types.ts +13 -0
  280. package/components/oxy-sticky-box/index.scss +6 -0
  281. package/components/oxy-sticky-box/oxy-sticky-box.vue +155 -0
  282. package/components/oxy-sticky-box/types.ts +11 -0
  283. package/components/oxy-swipe-action/index.scss +22 -0
  284. package/components/oxy-swipe-action/oxy-swipe-action.vue +294 -0
  285. package/components/oxy-swipe-action/types.ts +40 -0
  286. package/components/oxy-swiper/index.scss +53 -0
  287. package/components/oxy-swiper/oxy-swiper.vue +318 -0
  288. package/components/oxy-swiper/types.ts +264 -0
  289. package/components/oxy-swiper-nav/index.scss +159 -0
  290. package/components/oxy-swiper-nav/oxy-swiper-nav.vue +37 -0
  291. package/components/oxy-swiper-nav/types.ts +42 -0
  292. package/components/oxy-switch/index.scss +58 -0
  293. package/components/oxy-switch/oxy-switch.vue +83 -0
  294. package/components/oxy-switch/types.ts +58 -0
  295. package/components/oxy-tab/index.scss +16 -0
  296. package/components/oxy-tab/oxy-tab.vue +88 -0
  297. package/components/oxy-tab/types.ts +30 -0
  298. package/components/oxy-tabbar/index.scss +62 -0
  299. package/components/oxy-tabbar/oxy-tabbar.vue +91 -0
  300. package/components/oxy-tabbar/types.ts +73 -0
  301. package/components/oxy-tabbar-item/index.scss +55 -0
  302. package/components/oxy-tabbar-item/oxy-tabbar-item.vue +99 -0
  303. package/components/oxy-tabbar-item/types.ts +51 -0
  304. package/components/oxy-table/index.scss +163 -0
  305. package/components/oxy-table/oxy-table.vue +283 -0
  306. package/components/oxy-table/types.ts +58 -0
  307. package/components/oxy-table-col/index.scss +46 -0
  308. package/components/oxy-table-col/oxy-table-col.vue +149 -0
  309. package/components/oxy-table-col/types.ts +54 -0
  310. package/components/oxy-tabs/index.scss +299 -0
  311. package/components/oxy-tabs/oxy-tabs.vue +443 -0
  312. package/components/oxy-tabs/types.ts +107 -0
  313. package/components/oxy-tag/index.scss +115 -0
  314. package/components/oxy-tag/oxy-tag.vue +148 -0
  315. package/components/oxy-tag/types.ts +81 -0
  316. package/components/oxy-text/index.scss +37 -0
  317. package/components/oxy-text/oxy-text.vue +139 -0
  318. package/components/oxy-text/types.ts +98 -0
  319. package/components/oxy-textarea/index.scss +340 -0
  320. package/components/oxy-textarea/oxy-textarea.vue +296 -0
  321. package/components/oxy-textarea/placeholder.scss +20 -0
  322. package/components/oxy-textarea/types.ts +288 -0
  323. package/components/oxy-toast/index.scss +75 -0
  324. package/components/oxy-toast/index.ts +92 -0
  325. package/components/oxy-toast/oxy-toast.vue +198 -0
  326. package/components/oxy-toast/types.ts +181 -0
  327. package/components/oxy-tooltip/index.scss +66 -0
  328. package/components/oxy-tooltip/oxy-tooltip.vue +141 -0
  329. package/components/oxy-tooltip/types.ts +107 -0
  330. package/components/oxy-transition/index.scss +95 -0
  331. package/components/oxy-transition/oxy-transition.vue +232 -0
  332. package/components/oxy-transition/types.ts +98 -0
  333. package/components/oxy-upload/index.scss +175 -0
  334. package/components/oxy-upload/oxy-upload.vue +673 -0
  335. package/components/oxy-upload/types.ts +391 -0
  336. package/components/oxy-video-preview/index.scss +34 -0
  337. package/components/oxy-video-preview/oxy-video-preview.vue +72 -0
  338. package/components/oxy-video-preview/types.ts +23 -0
  339. package/components/oxy-watermark/index.scss +18 -0
  340. package/components/oxy-watermark/oxy-watermark.vue +486 -0
  341. package/components/oxy-watermark/types.ts +76 -0
  342. package/dayjs/constant.js +26 -0
  343. package/dayjs/index.d.ts +430 -0
  344. package/dayjs/index.js +542 -0
  345. package/dayjs/locale/en.js +13 -0
  346. package/dayjs/utils.js +59 -0
  347. package/global.d.ts +101 -0
  348. package/index.ts +12 -0
  349. package/locale/index.ts +32 -0
  350. package/locale/lang/ar-SA.ts +133 -0
  351. package/locale/lang/en-US.ts +133 -0
  352. package/locale/lang/zh-CN.ts +137 -0
  353. package/package.json +1 -0
  354. package/tags.json +1 -0
  355. package/web-types.json +1 -0
@@ -0,0 +1,40 @@
1
+ import type { ExtractPropTypes, PropType } from 'vue'
2
+ import { baseProps, makeBooleanProp, makeStringProp } from '../common/props'
3
+
4
+ export type SwipeActionStatus = 'left' | 'close' | 'right'
5
+
6
+ // 点击关闭按钮、滑动关闭按钮、通过控制value关闭按钮
7
+ export type SwipeActionReason = 'click' | 'swipe' | 'value'
8
+
9
+ export type SwipeActionPosition = SwipeActionStatus | 'inside'
10
+
11
+ export type SwipeActionBeforeClose = (reason: SwipeActionReason, position: SwipeActionPosition) => void
12
+
13
+ export const swipeActionProps = {
14
+ ...baseProps,
15
+
16
+ /**
17
+ * 滑动按钮的状态,使用v-model进行双向绑定。
18
+ * 可选值为:'left'(左滑)、'close'(关闭状态)、'right'(右滑)。
19
+ * 类型:string
20
+ * 默认值:'close'
21
+ */
22
+ modelValue: makeStringProp<SwipeActionStatus>('close'),
23
+
24
+ /**
25
+ * 是否禁用滑动操作。
26
+ * 类型:boolean
27
+ * 默认值:false
28
+ */
29
+ disabled: makeBooleanProp(false),
30
+
31
+ /**
32
+ * 在关闭滑动按钮前调用的钩子函数。
33
+ * 可以在此函数中执行一些关闭前的操作,如确认提示等。
34
+ * 类型:function
35
+ * 默认值:无
36
+ */
37
+ beforeClose: Function as PropType<SwipeActionBeforeClose>
38
+ }
39
+
40
+ export type SwipeActionProps = ExtractPropTypes<typeof swipeActionProps>
@@ -0,0 +1,53 @@
1
+ @import '../common/abstracts/variable';
2
+ @import '../common/abstracts/mixin';
3
+
4
+ @include b(swiper) {
5
+ position: relative;
6
+
7
+ @include e(track) {
8
+ border-radius: $-swiper-radius;
9
+ overflow: hidden;
10
+ transform: translateY(0);
11
+ }
12
+
13
+ @include e(item) {
14
+ display: flex;
15
+ align-items: center;
16
+ box-sizing: border-box;
17
+ padding: $-swiper-item-padding;
18
+
19
+ @include m(slot) {
20
+ // 问题来自 https://github.com/dcloudio/uni-app/issues/4629,支付宝小程序不支持属性选择器
21
+ /* #ifdef MP */
22
+ :deep() {
23
+ /* #ifdef MP-WEIXIN */
24
+ view:not([class]) {
25
+ width: 100%;
26
+ height: 100%;
27
+ }
28
+ /* #endif */
29
+ /* #ifndef MP-WEIXIN */
30
+ view {
31
+ width: 100%;
32
+ height: 100%;
33
+ }
34
+ /* #endif */
35
+ }
36
+ /* #endif */
37
+ }
38
+ }
39
+
40
+ @include e(image, video) {
41
+ width: 100%;
42
+ transition: all 0.3s ease;
43
+ }
44
+
45
+ @include e(text) {
46
+ // 随便搞个样式,反正用户还是会覆盖的
47
+ position: absolute;
48
+ right: 24rpx;
49
+ top: 24rpx;
50
+ color: $-swiper-item-text-color;
51
+ font-size: $-swiper-item-text-fs;
52
+ }
53
+ }
@@ -0,0 +1,318 @@
1
+ <template>
2
+ <view :class="`oxy-swiper ${customClass}`" :style="customStyle">
3
+ <!-- #ifdef MP-WEIXIN -->
4
+ <scroll-view scroll-x scroll-y style="width: 100%; height: 100%">
5
+ <!-- #endif -->
6
+ <swiper
7
+ :adjust-height="adjustHeight"
8
+ :adjust-vertical-height="adjustVerticalHeight"
9
+ class="oxy-swiper__track"
10
+ :autoplay="autoplay && !videoPlaying"
11
+ :current="navCurrent"
12
+ :interval="interval"
13
+ :duration="duration"
14
+ :circular="loop"
15
+ :vertical="direction == 'vertical'"
16
+ :easing-function="easingFunction"
17
+ :previous-margin="addUnit(previousMargin)"
18
+ :next-margin="addUnit(nextMargin)"
19
+ :snap-to-edge="snapToEdge"
20
+ :display-multiple-items="displayMultipleItems"
21
+ :style="{ height: addUnit(height) }"
22
+ @change="handleChange"
23
+ @animationfinish="handleAnimationfinish"
24
+ >
25
+ <swiper-item v-for="(item, index) in list" :key="index" :class="swiperItemClass">
26
+ <slot :item="item" :index="index">
27
+ <video
28
+ v-if="isVideo(item)"
29
+ :id="`video-${index}-${uid}`"
30
+ :style="{ height: addUnit(height) }"
31
+ :src="isObj(item) ? item[valueKey] : item"
32
+ :poster="isObj(item) ? item.poster : ''"
33
+ :class="`oxy-swiper__video ${customItemClass} ${getCustomItemClass(currentValue, index, list)}`"
34
+ @play="handleVideoPaly"
35
+ @pause="handleVideoPause"
36
+ :enable-progress-gesture="false"
37
+ :loop="videoLoop"
38
+ :muted="muted"
39
+ :autoplay="autoplayVideo"
40
+ objectFit="cover"
41
+ @click="handleClick(index, item)"
42
+ />
43
+ <image
44
+ v-else
45
+ :src="isObj(item) ? item[valueKey] : item"
46
+ :class="`oxy-swiper__image ${customImageClass} ${customItemClass} ${getCustomItemClass(currentValue, index, list)}`"
47
+ :style="{ height: addUnit(height) }"
48
+ :mode="imageMode"
49
+ @click="handleClick(index, item)"
50
+ />
51
+ <text v-if="isObj(item) && item[textKey]" :class="`oxy-swiper__text ${customTextClass}`" :style="customTextStyle">
52
+ {{ item[textKey] }}
53
+ </text>
54
+ </slot>
55
+ </swiper-item>
56
+ </swiper>
57
+ <!-- #ifdef MP-WEIXIN -->
58
+ </scroll-view>
59
+ <!-- #endif -->
60
+
61
+ <template v-if="indicator">
62
+ <slot name="indicator" :current="currentValue" :total="list.length"></slot>
63
+ <oxy-swiper-nav
64
+ v-if="!$slots.indicator"
65
+ :custom-class="customIndicatorClass"
66
+ :type="swiperIndicator.type"
67
+ :current="swiperIndicator.current"
68
+ :total="swiperIndicator.total"
69
+ :direction="swiperIndicator.direction"
70
+ :indicator-position="swiperIndicator.indicatorPosition"
71
+ :min-show-num="swiperIndicator.minShowNum"
72
+ :show-controls="swiperIndicator.showControls"
73
+ @change="handleIndicatorChange"
74
+ />
75
+ </template>
76
+ </view>
77
+ </template>
78
+ <script lang="ts">
79
+ export default {
80
+ name: 'oxy-swiper',
81
+ options: {
82
+ addGlobalClass: true,
83
+ virtualHost: true,
84
+ styleIsolation: 'shared'
85
+ }
86
+ }
87
+ </script>
88
+
89
+ <script lang="ts" setup>
90
+ import OxySwiperNav from '../oxy-swiper-nav/oxy-swiper-nav.vue'
91
+ import { computed, watch, ref, getCurrentInstance, useSlots } from 'vue'
92
+ import { addUnit, isObj, isImageUrl, isVideoUrl, uuid, isDef } from '../common/util'
93
+ import { swiperProps, type SwiperList } from './types'
94
+ import type { SwiperNavProps } from '../oxy-swiper-nav/types'
95
+ const slots = useSlots()
96
+
97
+ const props = defineProps(swiperProps)
98
+ const emit = defineEmits(['click', 'change', 'animationfinish', 'update:current'])
99
+ const navCurrent = ref<number>(props.current) // 当前滑块 swiper使用
100
+ const currentValue = ref<number>(props.current) // 当前滑块
101
+
102
+ /**
103
+ * 更新当前滑块
104
+ * @param current 当前滑块索引
105
+ * @param force 是否强制更新swiper绑定的的current
106
+ */
107
+ const updateCurrent = (current: number, force: boolean = false) => {
108
+ currentValue.value = current
109
+ if (force) {
110
+ navCurrent.value = current
111
+ }
112
+ emit('update:current', current)
113
+ }
114
+
115
+ const videoPlaying = ref<boolean>(false) // 当前是否在播放视频
116
+
117
+ const { proxy } = getCurrentInstance() as any
118
+
119
+ const uid = ref<string>(uuid())
120
+
121
+ watch(
122
+ () => props.current,
123
+ (val) => {
124
+ if (val < 0) {
125
+ props.loop ? goToEnd() : goToStart()
126
+ } else if (val >= props.list.length) {
127
+ props.loop ? goToStart() : goToEnd()
128
+ } else {
129
+ navTo(val)
130
+ }
131
+ }
132
+ )
133
+
134
+ const swiperItemClass = computed(() => {
135
+ return `oxy-swiper__item ${slots.default ? 'oxy-swiper__item--slot' : ''}`
136
+ })
137
+
138
+ const swiperIndicator = computed(() => {
139
+ const { list, direction, indicatorPosition, indicator } = props
140
+ const swiperIndicator: Partial<SwiperNavProps> = {
141
+ current: currentValue.value || 0,
142
+ total: list.length || 0,
143
+ direction: direction || 'horizontal',
144
+ indicatorPosition: indicatorPosition || 'bottom'
145
+ }
146
+ if (isObj(indicator)) {
147
+ swiperIndicator.type = indicator.type || 'dots'
148
+ swiperIndicator.minShowNum = indicator.minShowNum || 2
149
+ swiperIndicator.showControls = indicator.showControls || false
150
+ }
151
+ return swiperIndicator
152
+ })
153
+
154
+ const getMediaType = (item: string | SwiperList, type: 'video' | 'image') => {
155
+ const checkType = (url: string) => (type === 'video' ? isVideoUrl(url) : isImageUrl(url))
156
+
157
+ if (isObj(item)) {
158
+ return item.type && ['video', 'image'].includes(item.type) ? item.type === type : checkType(item[props.valueKey])
159
+ } else {
160
+ return checkType(item)
161
+ }
162
+ }
163
+
164
+ const isVideo = (item: string | SwiperList) => {
165
+ return getMediaType(item, 'video')
166
+ }
167
+
168
+ const isImage = (item: string | SwiperList) => {
169
+ return getMediaType(item, 'image')
170
+ }
171
+
172
+ function navTo(index: number) {
173
+ if (index === currentValue.value) return
174
+ updateCurrent(index, true)
175
+ }
176
+
177
+ function goToStart() {
178
+ navTo(0)
179
+ }
180
+
181
+ function goToEnd() {
182
+ navTo(props.list.length - 1)
183
+ }
184
+
185
+ // 视频播放
186
+ function handleVideoPaly() {
187
+ props.stopAutoplayWhenVideoPlay && (videoPlaying.value = true)
188
+ }
189
+
190
+ // 视频暂停
191
+ function handleVideoPause() {
192
+ videoPlaying.value = false
193
+ }
194
+
195
+ /**
196
+ * 是否为当前滑块的前一个滑块
197
+ * @param current
198
+ * @param index
199
+ * @param list
200
+ */
201
+ function isPrev(current: number, index: number, list: string[] | SwiperList[]) {
202
+ return (current - 1 + list.length) % list.length === index
203
+ }
204
+
205
+ /**
206
+ * 是否为当前滑块的后一个滑块
207
+ * @param current
208
+ * @param index
209
+ * @param list
210
+ */
211
+ function isNext(current: number, index: number, list: string[] | SwiperList[]) {
212
+ return (current + 1 + list.length) % list.length === index
213
+ }
214
+
215
+ function getCustomItemClass(current: number, index: number, list: string[] | SwiperList[]) {
216
+ let customItemClass: string = ''
217
+ if (isPrev(current, index, list)) {
218
+ customItemClass = props.customPrevClass || props.customPrevImageClass
219
+ }
220
+ if (isNext(current, index, list)) {
221
+ customItemClass = props.customNextClass || props.customNextImageClass
222
+ }
223
+ return customItemClass
224
+ }
225
+
226
+ /**
227
+ * 轮播滑块切换时触发
228
+ */
229
+ function handleChange(e: { detail: { current: number; source: string } }) {
230
+ const { current, source } = e.detail
231
+ const previous = currentValue.value
232
+ emit('change', { current, source })
233
+ if (current !== currentValue.value) {
234
+ const forceUpdate = source === 'autoplay' || source === 'touch'
235
+ updateCurrent(current, forceUpdate)
236
+ }
237
+ handleVideoChange(previous, current)
238
+ }
239
+
240
+ /**
241
+ * 处理视频切换
242
+ */
243
+ function handleVideoChange(previous: number, current: number) {
244
+ handleStopVideoPaly(previous)
245
+ handleStartVideoPaly(current)
246
+ }
247
+
248
+ /**
249
+ * 开始播放指定视频
250
+ * @param index
251
+ */
252
+ function handleStartVideoPaly(index: number) {
253
+ if (props.autoplayVideo) {
254
+ const currentItem = props.list[index]
255
+ if (isDef(currentItem) && isVideo(currentItem)) {
256
+ const video = uni.createVideoContext(`video-${index}-${uid.value}`, proxy)
257
+ video.play()
258
+ }
259
+ }
260
+ }
261
+
262
+ /**
263
+ * 停止播放指定视频
264
+ * @param index
265
+ */
266
+ function handleStopVideoPaly(index: number) {
267
+ if (props.stopPreviousVideo) {
268
+ const previousItem = props.list[index]
269
+ if (isDef(previousItem) && isVideo(previousItem)) {
270
+ const video = uni.createVideoContext(`video-${index}-${uid.value}`, proxy)
271
+ video.pause()
272
+ }
273
+ } else if (props.stopAutoplayWhenVideoPlay) {
274
+ handleVideoPause()
275
+ }
276
+ }
277
+
278
+ /**
279
+ * 滑块动画结束
280
+ */
281
+ function handleAnimationfinish(e: { detail: { current: any; source: string } }) {
282
+ const { current, source } = e.detail
283
+ if (current !== currentValue.value) {
284
+ const forceUpdate = source === 'autoplay' || source === 'touch'
285
+ updateCurrent(current, forceUpdate)
286
+ }
287
+ /**
288
+ * 滑块动画结束时触发
289
+ */
290
+ emit('animationfinish', { current, source })
291
+ }
292
+
293
+ /**
294
+ * 点击滑块事件
295
+ * @param index 点击的滑块下标
296
+ * @param item 点击的滑块内容
297
+ */
298
+ function handleClick(index: number, item: string | SwiperList) {
299
+ emit('click', { index, item })
300
+ }
301
+
302
+ function handleIndicatorChange({ dir }: { dir: 'prev' | 'next' }) {
303
+ const { list, loop } = props
304
+ const total = list.length
305
+ let nextPos = dir === 'next' ? currentValue.value + 1 : currentValue.value - 1
306
+ if (loop) {
307
+ nextPos = dir === 'next' ? (currentValue.value + 1) % total : (currentValue.value - 1 + total) % total
308
+ } else {
309
+ nextPos = nextPos < 0 || nextPos >= total ? currentValue.value : nextPos
310
+ }
311
+ if (nextPos === currentValue.value) return
312
+ navTo(nextPos)
313
+ }
314
+ </script>
315
+
316
+ <style lang="scss" scoped>
317
+ @import './index.scss';
318
+ </style>
@@ -0,0 +1,264 @@
1
+ import type { ExtractPropTypes, PropType } from 'vue'
2
+ import { baseProps, makeBooleanProp, makeNumberProp, makeNumericProp, makeStringProp } from '../common/props'
3
+ import type { SwiperNavProps } from '../oxy-swiper-nav/types'
4
+ import type { ImageMode } from '../oxy-img/types'
5
+
6
+ /**
7
+ * 轮播滑动方向
8
+ */
9
+ export type DirectionType = 'horizontal' | 'vertical'
10
+
11
+ /**
12
+ * 切换动画
13
+ */
14
+ export type EasingType = 'default' | 'linear' | 'easeInCubic' | 'easeOutCubic' | 'easeInOutCubic'
15
+
16
+ /**
17
+ * 指示器位置
18
+ */
19
+ export type IndicatorPositionType = 'left' | 'top-left' | 'top' | 'top-right' | 'bottom-left' | 'bottom' | 'bottom-right' | 'right'
20
+
21
+ /**
22
+ * first:第一个滑块。
23
+ * current:实时的当前滑块。
24
+ * highest:高度最大的滑块。
25
+ * none:不根据滑块调整高度,容器高度取决于自身样式。
26
+ */
27
+ export type AdjustHeightType = 'first' | 'current' | 'highest' | 'none'
28
+
29
+ // 资源类型
30
+ export type SwiperItemType = 'image' | 'video'
31
+
32
+ export interface SwiperList {
33
+ [key: string]: any
34
+ // 图片、视频等资源地址
35
+ value?: string
36
+ // 视频资源的封面
37
+ poster?: string
38
+ // 资源文件类型,可选值:'image' | 'video'
39
+ type?: SwiperItemType
40
+ }
41
+
42
+ export const swiperProps = {
43
+ ...baseProps,
44
+
45
+ /**
46
+ * 是否自动播放轮播图
47
+ * 类型:boolean
48
+ * 默认值:true
49
+ */
50
+ autoplay: makeBooleanProp(true),
51
+
52
+ /**
53
+ * 当前轮播在哪一项(下标)
54
+ * 类型:number
55
+ * 默认值:0
56
+ */
57
+ current: makeNumberProp(0),
58
+
59
+ /**
60
+ * 轮播滑动方向,可选值:'horizontal'(水平)或'vertical'(垂直)
61
+ * 类型:string
62
+ * 默认值:'horizontal'
63
+ */
64
+ direction: makeStringProp<DirectionType>('horizontal'),
65
+
66
+ /**
67
+ * 同时显示的滑块数量
68
+ * 类型:number
69
+ * 默认值:1
70
+ */
71
+ displayMultipleItems: makeNumberProp(1),
72
+
73
+ /**
74
+ * 滑动动画时长,单位为毫秒
75
+ * 类型:number
76
+ * 默认值:300
77
+ */
78
+ duration: makeNumberProp(300),
79
+
80
+ /**
81
+ * 指定 swiper 切换缓动动画类型
82
+ * 类型:string
83
+ * 默认值:'default'
84
+ */
85
+ easingFunction: makeStringProp<EasingType>('default'),
86
+
87
+ /**
88
+ * 轮播的高度
89
+ * 类型:number 或 string(数字或可转换为数字的字符串)
90
+ * 默认值:'192'
91
+ */
92
+ height: makeNumericProp('192'),
93
+
94
+ /**
95
+ * 轮播间隔时间,单位为毫秒
96
+ * 类型:number
97
+ * 默认值:5000
98
+ */
99
+ interval: makeNumberProp(5000),
100
+
101
+ /**
102
+ * 图片列表,可以是一个图片对象数组或字符串数组
103
+ * 类型:array
104
+ * 默认值:空数组
105
+ */
106
+ list: {
107
+ type: Array as PropType<SwiperList[] | string[]>,
108
+ default: () => []
109
+ },
110
+
111
+ /**
112
+ * 是否循环播放轮播图
113
+ * 类型:boolean
114
+ * 默认值:true
115
+ */
116
+ loop: makeBooleanProp(true),
117
+
118
+ /**
119
+ * 视频是否循环播放
120
+ * 类型:boolean
121
+ * 默认值:true
122
+ */
123
+ videoLoop: makeBooleanProp(true),
124
+
125
+ /**
126
+ * 视频是否静音播放
127
+ * 类型:boolean
128
+ * 默认值:true
129
+ */
130
+ muted: makeBooleanProp(true),
131
+
132
+ /**
133
+ * 后边距
134
+ * 类型:number 或 string(数字或可转换为数字的字符串)
135
+ * 默认值:'0'
136
+ */
137
+ nextMargin: makeNumericProp('0'),
138
+
139
+ /**
140
+ * 页码信息展示位置,可选值:'left' | 'top-left' | 'top' | 'top-right' | 'bottom-left' | 'bottom' | 'bottom-right' | 'right'
141
+ * 类型:string
142
+ * 默认值:'bottom'
143
+ */
144
+ indicatorPosition: makeStringProp<IndicatorPositionType>('bottom'),
145
+ /**
146
+ * 前边距
147
+ * 类型:number 或 string(数字或可转换为数字的字符串)
148
+ * 默认值:'0'
149
+ */
150
+ previousMargin: makeNumericProp('0'),
151
+ /**
152
+ * 是否应用边距到第一个、最后一个元素
153
+ * 类型:boolean
154
+ * 默认值:false
155
+ */
156
+ snapToEdge: makeBooleanProp(false),
157
+ /**
158
+ * 指示器全部配置,可以是布尔值或指示器配置对象
159
+ * 类型:boolean 或 object
160
+ * 默认值:true
161
+ */
162
+ indicator: {
163
+ type: [Boolean, Object] as PropType<boolean | Partial<SwiperNavProps>>,
164
+ default: true
165
+ },
166
+
167
+ /**
168
+ * 图片裁剪、缩放的模式
169
+ * 类型:string
170
+ * 默认值:'aspectFill'
171
+ */
172
+ imageMode: makeStringProp<ImageMode>('aspectFill'),
173
+ /**
174
+ * 选项对象中,value 对应的 key
175
+ */
176
+ valueKey: makeStringProp('value'),
177
+ /**
178
+ * 选项对象中,标题 text 对应的 key
179
+ */
180
+ textKey: makeStringProp('text'),
181
+ /**
182
+ * 视频是否自动播放
183
+ * 类型:boolean
184
+ * 默认值:true
185
+ */
186
+ autoplayVideo: makeBooleanProp(true),
187
+ /**
188
+ * 切换轮播项时是否停止上一个视频的播放
189
+ * 类型:boolean
190
+ * 默认值:true
191
+ */
192
+ stopPreviousVideo: makeBooleanProp(true),
193
+ /**
194
+ * 视频播放时是否停止自动轮播
195
+ * 类型:boolean
196
+ * 默认值:false
197
+ */
198
+ stopAutoplayWhenVideoPlay: makeBooleanProp(false),
199
+ /**
200
+ * 自动以指定滑块的高度为整个容器的高度。当 vertical 为 true 时,默认不调整
201
+ * 仅支付宝小程序支持
202
+ * 类型:'first' | 'current' | 'highest' | 'none'
203
+ * 默认值:false
204
+ */
205
+ adjustHeight: makeStringProp<AdjustHeightType>('highest'),
206
+ /**
207
+ * vertical 为 true 时强制使 adjust-height 生效。
208
+ * 仅支付宝小程序支持
209
+ * 类型:boolean
210
+ * 默认值:false
211
+ */
212
+ adjustVerticalHeight: makeBooleanProp(false),
213
+ /**
214
+ * 自定义指示器类名
215
+ * 类型:string
216
+ */
217
+ customIndicatorClass: makeStringProp(''),
218
+
219
+ /**
220
+ * 自定义图片类名
221
+ * 类型:string
222
+ */
223
+ customImageClass: makeStringProp(''),
224
+
225
+ /**
226
+ * 自定义上一个图片类名
227
+ * 类型:string
228
+ */
229
+ customPrevImageClass: makeStringProp(''),
230
+
231
+ /**
232
+ * 自定义下一个图片类名
233
+ * 类型:string
234
+ */
235
+ customNextImageClass: makeStringProp(''),
236
+
237
+ /**
238
+ * 自定义swiper子项类名
239
+ * 类型:string
240
+ */
241
+ customItemClass: makeStringProp(''),
242
+ /**
243
+ * 自定义上一个子项类名
244
+ * 类型:string
245
+ */
246
+ customPrevClass: makeStringProp(''),
247
+ /**
248
+ * 自定义下一个子项类名
249
+ * 类型:string
250
+ */
251
+ customNextClass: makeStringProp(''),
252
+ /**
253
+ * 自定义文字标题类名
254
+ * 类型:string
255
+ */
256
+ customTextClass: makeStringProp(''),
257
+ /**
258
+ * 自定义文字标题样式
259
+ * 类型:string
260
+ */
261
+ customTextStyle: makeStringProp('')
262
+ }
263
+
264
+ export type SwiperProps = ExtractPropTypes<typeof swiperProps>