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,486 @@
1
+ <template>
2
+ <view :class="rootClass" :style="rootStyle">
3
+ <canvas
4
+ v-if="!canvasOffScreenable && showCanvas"
5
+ type="2d"
6
+ :style="{ height: canvasHeight + 'px', width: canvasWidth + 'px', visibility: 'hidden' }"
7
+ :canvas-id="canvasId"
8
+ :id="canvasId"
9
+ />
10
+ </view>
11
+ </template>
12
+
13
+ <script lang="ts">
14
+ export default {
15
+ name: 'oxy-watermark',
16
+ options: {
17
+ addGlobalClass: true,
18
+ virtualHost: true,
19
+ styleIsolation: 'shared'
20
+ }
21
+ }
22
+ </script>
23
+
24
+ <script lang="ts" setup>
25
+ import { computed, onMounted, ref, watch, nextTick, type CSSProperties } from 'vue'
26
+ import { addUnit, buildUrlWithParams, isBase64Image, objToStyle, uuid } from '../common/util'
27
+ import { watermarkProps } from './types'
28
+
29
+ const props = defineProps(watermarkProps)
30
+
31
+ watch(
32
+ () => props,
33
+ () => {
34
+ doReset()
35
+ },
36
+ { deep: true }
37
+ )
38
+
39
+ const canvasId = ref<string>(`water${uuid()}`) // canvas 组件的唯一标识符
40
+ const waterMarkUrl = ref<string>('') // canvas生成base64水印
41
+ const canvasOffScreenable = ref<boolean>(uni.canIUse('createOffscreenCanvas') && Boolean(uni.createOffscreenCanvas)) // 是否可以使用离屏canvas
42
+ const pixelRatio = ref<number>(uni.getSystemInfoSync().pixelRatio) // 像素比
43
+ const canvasHeight = ref<number>((props.height + props.gutterY) * pixelRatio.value) // canvas画布高度
44
+ const canvasWidth = ref<number>((props.width + props.gutterX) * pixelRatio.value) // canvas画布宽度
45
+ const showCanvas = ref<boolean>(true) // 是否展示canvas
46
+
47
+ /**
48
+ * 水印css类
49
+ */
50
+ const rootClass = computed(() => {
51
+ let classess: string = 'oxy-watermark'
52
+ if (props.fullScreen) {
53
+ classess = `${classess} is-fullscreen`
54
+ }
55
+ return `${classess} ${props.customClass}`
56
+ })
57
+
58
+ /**
59
+ * 水印样式
60
+ */
61
+ const rootStyle = computed(() => {
62
+ const style: CSSProperties = {
63
+ opacity: props.opacity,
64
+ backgroundSize: addUnit(props.width + props.gutterX)
65
+ }
66
+ if (waterMarkUrl.value) {
67
+ style['backgroundImage'] = `url('${waterMarkUrl.value}')`
68
+ }
69
+ return `${objToStyle(style)}${props.customStyle}`
70
+ })
71
+
72
+ onMounted(() => {
73
+ doInit()
74
+ })
75
+
76
+ function doReset() {
77
+ showCanvas.value = true
78
+ canvasHeight.value = (props.height + props.gutterY) * pixelRatio.value
79
+ canvasWidth.value = (props.width + props.gutterX) * pixelRatio.value
80
+ nextTick(() => {
81
+ doInit()
82
+ })
83
+ }
84
+
85
+ function doInit() {
86
+ // #ifdef H5
87
+ // h5使用document.createElement创建canvas,不用展示canvas标签
88
+ showCanvas.value = false
89
+ // #endif
90
+ const { width, height, color, size, fontStyle, fontWeight, fontFamily, content, rotate, gutterX, gutterY, image, imageHeight, imageWidth } = props
91
+
92
+ // 创建水印
93
+ createWaterMark(width, height, color, size, fontStyle, fontWeight, fontFamily, content, rotate, gutterX, gutterY, image, imageHeight, imageWidth)
94
+ }
95
+
96
+ /**
97
+ * 创建水印图片
98
+ * @param width canvas宽度
99
+ * @param height canvas高度
100
+ * @param color canvas字体颜色
101
+ * @param size canvas字体大小
102
+ * @param fontStyle canvas字体样式
103
+ * @param fontWeight canvas字体字重
104
+ * @param fontFamily canvas字体系列
105
+ * @param content canvas内容
106
+ * @param rotate 倾斜角度
107
+ * @param gutterX X轴间距
108
+ * @param gutterY Y轴间距
109
+ * @param image canvas图片
110
+ * @param imageHeight canvas图片高度
111
+ * @param imageWidth canvas图片宽度
112
+ */
113
+ function createWaterMark(
114
+ width: number,
115
+ height: number,
116
+ color: string,
117
+ size: number,
118
+ fontStyle: string,
119
+ fontWeight: number | string,
120
+ fontFamily: string,
121
+ content: string,
122
+ rotate: number,
123
+ gutterX: number,
124
+ gutterY: number,
125
+ image: string,
126
+ imageHeight: number,
127
+ imageWidth: number
128
+ ) {
129
+ const canvasHeight = (height + gutterY) * pixelRatio.value
130
+ const canvasWidth = (width + gutterX) * pixelRatio.value
131
+ const contentWidth = width * pixelRatio.value
132
+ const contentHeight = height * pixelRatio.value
133
+ const fontSize = size * pixelRatio.value
134
+ // #ifndef H5
135
+ if (canvasOffScreenable.value) {
136
+ createOffscreenCanvas(
137
+ canvasHeight,
138
+ canvasWidth,
139
+ contentWidth,
140
+ contentHeight,
141
+ rotate,
142
+ fontSize,
143
+ fontFamily,
144
+ fontStyle,
145
+ fontWeight,
146
+ color,
147
+ content,
148
+ image,
149
+ imageHeight,
150
+ imageWidth
151
+ )
152
+ } else {
153
+ createCanvas(canvasHeight, contentWidth, rotate, fontSize, color, content, image, imageHeight, imageWidth)
154
+ }
155
+ // #endif
156
+ // #ifdef H5
157
+ createH5Canvas(
158
+ canvasHeight,
159
+ canvasWidth,
160
+ contentWidth,
161
+ contentHeight,
162
+ rotate,
163
+ fontSize,
164
+ fontFamily,
165
+ fontStyle,
166
+ fontWeight,
167
+ color,
168
+ content,
169
+ image,
170
+ imageHeight,
171
+ imageWidth
172
+ )
173
+ // #endif
174
+ }
175
+
176
+ /**
177
+ * 创建离屏canvas
178
+ * @param canvasHeight canvas高度
179
+ * @param canvasWidth canvas宽度
180
+ * @param contentWidth 内容宽度
181
+ * @param contentHeight 内容高度
182
+ * @param rotate 内容倾斜角度
183
+ * @param fontSize 字体大小
184
+ * @param fontFamily 字体系列
185
+ * @param fontStyle 字体样式
186
+ * @param fontWeight 字体字重
187
+ * @param color 字体颜色
188
+ * @param content 内容
189
+ * @param image canvas图片
190
+ * @param imageHeight canvas图片高度
191
+ * @param imageWidth canvas图片宽度
192
+ */
193
+ function createOffscreenCanvas(
194
+ canvasHeight: number,
195
+ canvasWidth: number,
196
+ contentWidth: number,
197
+ contentHeight: number,
198
+ rotate: number,
199
+ fontSize: number,
200
+ fontFamily: string,
201
+ fontStyle: string,
202
+ fontWeight: string | number,
203
+ color: string,
204
+ content: string,
205
+ image: string,
206
+ imageHeight: number,
207
+ imageWidth: number
208
+ ) {
209
+ // 创建离屏canvas
210
+ const canvas: any = uni.createOffscreenCanvas({ height: canvasHeight, width: canvasWidth, type: '2d' })
211
+ const ctx: any = canvas.getContext('2d')
212
+ if (ctx) {
213
+ if (image) {
214
+ const img = canvas.createImage() as HTMLImageElement
215
+ drawImageOffScreen(ctx, img, image, imageHeight, imageWidth, rotate, contentWidth, contentHeight, canvas)
216
+ } else {
217
+ drawTextOffScreen(ctx, content, contentWidth, contentHeight, rotate, fontSize, fontFamily, fontStyle, fontWeight, color, canvas)
218
+ }
219
+ } else {
220
+ console.error('无法获取canvas上下文,请确认当前环境是否支持canvas')
221
+ }
222
+ }
223
+
224
+ /**
225
+ * 非H5创建canvas
226
+ * 不支持创建离屏canvas时调用
227
+ * @param contentHeight 内容高度
228
+ * @param contentWidth 内容宽度
229
+ * @param rotate 内容倾斜角度
230
+ * @param fontSize 字体大小
231
+ * @param color 字体颜色
232
+ * @param content 内容
233
+ * @param image canvas图片
234
+ * @param imageHeight canvas图片高度
235
+ * @param imageWidth canvas图片宽度
236
+ */
237
+ function createCanvas(
238
+ contentHeight: number,
239
+ contentWidth: number,
240
+ rotate: number,
241
+ fontSize: number,
242
+ color: string,
243
+ content: string,
244
+ image: string,
245
+ imageHeight: number,
246
+ imageWidth: number
247
+ ) {
248
+ const ctx = uni.createCanvasContext(canvasId.value)
249
+ if (ctx) {
250
+ if (image) {
251
+ drawImageOnScreen(ctx, image, imageHeight, imageWidth, rotate, contentWidth, contentHeight)
252
+ } else {
253
+ drawTextOnScreen(ctx, content, contentWidth, rotate, fontSize, color)
254
+ }
255
+ } else {
256
+ console.error('无法获取canvas上下文,请确认当前环境是否支持canvas')
257
+ }
258
+ }
259
+
260
+ /**
261
+ * h5创建canvas
262
+ * @param canvasHeight canvas高度
263
+ * @param canvasWidth canvas宽度
264
+ * @param contentWidth 水印内容宽度
265
+ * @param contentHeight 水印内容高度
266
+ * @param rotate 水印内容倾斜角度
267
+ * @param fontSize 水印字体大小
268
+ * @param fontFamily 水印字体系列
269
+ * @param fontStyle 水印字体样式
270
+ * @param fontWeight 水印字体字重
271
+ * @param color 水印字体颜色
272
+ * @param content 水印内容
273
+ */
274
+ function createH5Canvas(
275
+ canvasHeight: number,
276
+ canvasWidth: number,
277
+ contentWidth: number,
278
+ contentHeight: number,
279
+ rotate: number,
280
+ fontSize: number,
281
+ fontFamily: string,
282
+ fontStyle: string,
283
+ fontWeight: string | number,
284
+ color: string,
285
+ content: string,
286
+ image: string,
287
+ imageHeight: number,
288
+ imageWidth: number
289
+ ) {
290
+ const canvas = document.createElement('canvas')
291
+ const ctx = canvas.getContext('2d')
292
+ canvas.setAttribute('width', `${canvasWidth}px`)
293
+ canvas.setAttribute('height', `${canvasHeight}px`)
294
+ if (ctx) {
295
+ if (image) {
296
+ const img = new Image()
297
+ drawImageOffScreen(ctx, img, image, imageHeight, imageWidth, rotate, contentWidth, contentHeight, canvas)
298
+ } else {
299
+ drawTextOffScreen(ctx, content, contentWidth, contentHeight, rotate, fontSize, fontFamily, fontStyle, fontWeight, color, canvas)
300
+ }
301
+ } else {
302
+ console.error('无法获取canvas上下文,请确认当前环境是否支持canvas')
303
+ }
304
+ }
305
+
306
+ /**
307
+ * 绘制离屏文字canvas
308
+ * @param ctx canvas上下文
309
+ * @param content 水印内容
310
+ * @param contentWidth 水印宽度
311
+ * @param contentHeight 水印高度
312
+ * @param rotate 水印内容倾斜角度
313
+ * @param fontSize 水印字体大小
314
+ * @param fontFamily 水印字体系列
315
+ * @param fontStyle 水印字体样式
316
+ * @param fontWeight 水印字体字重
317
+ * @param color 水印字体颜色
318
+ * @param canvas canvas实例
319
+ */
320
+ function drawTextOffScreen(
321
+ ctx: CanvasRenderingContext2D,
322
+ content: string,
323
+ contentWidth: number,
324
+ contentHeight: number,
325
+ rotate: number,
326
+ fontSize: number,
327
+ fontFamily: string,
328
+ fontStyle: string,
329
+ fontWeight: string | number,
330
+ color: string,
331
+ canvas: HTMLCanvasElement
332
+ ) {
333
+ ctx.textBaseline = 'middle'
334
+ ctx.textAlign = 'center'
335
+ ctx.translate(contentWidth / 2, contentWidth / 2)
336
+ ctx.rotate((Math.PI / 180) * rotate)
337
+ ctx.font = `${fontStyle} normal ${fontWeight} ${fontSize}px/${contentHeight}px ${fontFamily}`
338
+ ctx.fillStyle = color
339
+ ctx.fillText(content, 0, 0)
340
+ ctx.restore()
341
+ waterMarkUrl.value = canvas.toDataURL()
342
+ }
343
+
344
+ /**
345
+ * 绘制在屏文字canvas
346
+ * @param ctx canvas上下文
347
+ * @param content 水印内容
348
+ * @param contentWidth 水印宽度
349
+ * @param rotate 水印内容倾斜角度
350
+ * @param fontSize 水印字体大小
351
+ * @param color 水印字体颜色
352
+ */
353
+ function drawTextOnScreen(ctx: UniApp.CanvasContext, content: string, contentWidth: number, rotate: number, fontSize: number, color: string) {
354
+ ctx.setTextBaseline('middle')
355
+ ctx.setTextAlign('center')
356
+ ctx.translate(contentWidth / 2, contentWidth / 2)
357
+ ctx.rotate((Math.PI / 180) * rotate)
358
+ ctx.setFillStyle(color)
359
+ ctx.setFontSize(fontSize)
360
+ ctx.fillText(content, 0, 0)
361
+ ctx.restore()
362
+ ctx.draw()
363
+ // #ifdef MP-DINGTALK
364
+ // 钉钉小程序的canvasToTempFilePath接口与其他平台不一样
365
+ ;(ctx as any).toTempFilePath({
366
+ success(res: any) {
367
+ showCanvas.value = false
368
+ waterMarkUrl.value = res.filePath
369
+ }
370
+ })
371
+ // #endif
372
+ // #ifndef MP-DINGTALK
373
+ uni.canvasToTempFilePath({
374
+ canvasId: canvasId.value,
375
+ success: (res) => {
376
+ showCanvas.value = false
377
+ waterMarkUrl.value = res.tempFilePath
378
+ }
379
+ })
380
+ // #endif
381
+ }
382
+
383
+ /**
384
+ * 绘制离屏图片canvas
385
+ * @param ctx canvas上下文
386
+ * @param img 水印图片对象
387
+ * @param image 水印图片地址
388
+ * @param imageHeight 水印图片高度
389
+ * @param imageWidth 水印图片宽度
390
+ * @param rotate 水印内容倾斜角度
391
+ * @param contentWidth 水印宽度
392
+ * @param contentHeight 水印高度
393
+ * @param canvas canvas实例
394
+ */
395
+ async function drawImageOffScreen(
396
+ ctx: CanvasRenderingContext2D,
397
+ img: HTMLImageElement,
398
+ image: string,
399
+ imageHeight: number,
400
+ imageWidth: number,
401
+ rotate: number,
402
+ contentWidth: number,
403
+ contentHeight: number,
404
+ canvas: HTMLCanvasElement
405
+ ) {
406
+ ctx.translate(contentWidth / 2, contentHeight / 2)
407
+ ctx.rotate((Math.PI / 180) * Number(rotate))
408
+ img.crossOrigin = 'anonymous'
409
+ img.referrerPolicy = 'no-referrer'
410
+
411
+ if (isBase64Image(image)) {
412
+ img.src = image
413
+ } else {
414
+ img.src = buildUrlWithParams(image, {
415
+ timestamp: `${new Date().getTime()}`
416
+ })
417
+ }
418
+ img.onload = () => {
419
+ ctx.drawImage(
420
+ img,
421
+ (-imageWidth * pixelRatio.value) / 2,
422
+ (-imageHeight * pixelRatio.value) / 2,
423
+ imageWidth * pixelRatio.value,
424
+ imageHeight * pixelRatio.value
425
+ )
426
+ ctx.restore()
427
+ waterMarkUrl.value = canvas.toDataURL()
428
+ }
429
+ }
430
+
431
+ /**
432
+ * 绘制在屏图片canvas
433
+ * @param ctx canvas上下文
434
+ * @param image 水印图片地址
435
+ * @param imageHeight 水印图片高度
436
+ * @param imageWidth 水印图片宽度
437
+ * @param rotate 水印内容倾斜角度
438
+ * @param contentWidth 水印宽度
439
+ * @param contentHeight 水印高度
440
+ */
441
+ function drawImageOnScreen(
442
+ ctx: UniApp.CanvasContext,
443
+ image: string,
444
+ imageHeight: number,
445
+ imageWidth: number,
446
+ rotate: number,
447
+ contentWidth: number,
448
+ contentHeight: number
449
+ ) {
450
+ ctx.translate(contentWidth / 2, contentHeight / 2)
451
+ ctx.rotate((Math.PI / 180) * Number(rotate))
452
+
453
+ ctx.drawImage(
454
+ image,
455
+ (-imageWidth * pixelRatio.value) / 2,
456
+ (-imageHeight * pixelRatio.value) / 2,
457
+ imageWidth * pixelRatio.value,
458
+ imageHeight * pixelRatio.value
459
+ )
460
+ ctx.restore()
461
+ ctx.draw(false, () => {
462
+ // #ifdef MP-DINGTALK
463
+ // 钉钉小程序的canvasToTempFilePath接口与其他平台不一样
464
+ ;(ctx as any).toTempFilePath({
465
+ success(res: any) {
466
+ showCanvas.value = false
467
+ waterMarkUrl.value = res.filePath
468
+ }
469
+ })
470
+ // #endif
471
+ // #ifndef MP-DINGTALK
472
+ uni.canvasToTempFilePath({
473
+ canvasId: canvasId.value,
474
+ success: (res) => {
475
+ showCanvas.value = false
476
+ waterMarkUrl.value = res.tempFilePath
477
+ }
478
+ })
479
+ // #endif
480
+ })
481
+ }
482
+ </script>
483
+
484
+ <style lang="scss" scoped>
485
+ @import './index.scss';
486
+ </style>
@@ -0,0 +1,76 @@
1
+ import type { ExtractPropTypes } from 'vue'
2
+ import { baseProps, makeBooleanProp, makeNumberProp, makeNumericProp, makeStringProp } from '../common/props'
3
+
4
+ export const watermarkProps = {
5
+ ...baseProps,
6
+ /**
7
+ * 显示内容
8
+ */
9
+ content: makeStringProp(''),
10
+ /**
11
+ * 显示图片的地址,支持网络图片和base64(钉钉小程序仅支持网络图片)
12
+ */
13
+ image: makeStringProp(''),
14
+ /**
15
+ * 图片高度
16
+ */
17
+ imageHeight: makeNumberProp(100),
18
+ /**
19
+ * 图片高度
20
+ */
21
+ imageWidth: makeNumberProp(100),
22
+ /**
23
+ * X轴间距,单位px
24
+ */
25
+ gutterX: makeNumberProp(0),
26
+ /**
27
+ * Y轴间距,单位px
28
+ */
29
+ gutterY: makeNumberProp(0),
30
+ /**
31
+ * canvas画布宽度,单位px
32
+ */
33
+ width: makeNumberProp(100),
34
+ /**
35
+ * canvas画布高度,单位px
36
+ */
37
+ height: makeNumberProp(100),
38
+ /**
39
+ * 是否为全屏水印
40
+ */
41
+ fullScreen: makeBooleanProp(true),
42
+ /**
43
+ * 水印字体颜色
44
+ */
45
+ color: makeStringProp('#8c8c8c'),
46
+ /**
47
+ * 水印字体大小,单位px
48
+ */
49
+ size: makeNumberProp(14),
50
+ /**
51
+ * 水印字体样式(仅微信和h5支持),可能的值:normal、italic、oblique
52
+ */
53
+ fontStyle: makeStringProp('normal'),
54
+ /**
55
+ * 水印字体的粗细(仅微信和h5支持)
56
+ */
57
+ fontWeight: makeNumericProp('normal'),
58
+ /**
59
+ * 水印字体系列(仅微信和h5支持)
60
+ */
61
+ fontFamily: makeStringProp('PingFang SC'),
62
+ /**
63
+ * 水印旋转角度
64
+ */
65
+ rotate: makeNumberProp(-25),
66
+ /**
67
+ * 自定义层级
68
+ */
69
+ zIndex: makeNumberProp(1100),
70
+ /**
71
+ * 自定义透明度,取值 0~1
72
+ */
73
+ opacity: makeNumberProp(0.5)
74
+ }
75
+
76
+ export type WatermarkProps = ExtractPropTypes<typeof watermarkProps>
@@ -0,0 +1,26 @@
1
+ /* eslint-disable */
2
+ export var SECONDS_A_MINUTE = 60;
3
+ export var SECONDS_A_HOUR = SECONDS_A_MINUTE * 60;
4
+ export var SECONDS_A_DAY = SECONDS_A_HOUR * 24;
5
+ export var SECONDS_A_WEEK = SECONDS_A_DAY * 7;
6
+ export var MILLISECONDS_A_SECOND = 1e3;
7
+ export var MILLISECONDS_A_MINUTE = SECONDS_A_MINUTE * MILLISECONDS_A_SECOND;
8
+ export var MILLISECONDS_A_HOUR = SECONDS_A_HOUR * MILLISECONDS_A_SECOND;
9
+ export var MILLISECONDS_A_DAY = SECONDS_A_DAY * MILLISECONDS_A_SECOND;
10
+ export var MILLISECONDS_A_WEEK = SECONDS_A_WEEK * MILLISECONDS_A_SECOND; // English locales
11
+
12
+ export var MS = 'millisecond';
13
+ export var S = 'second';
14
+ export var MIN = 'minute';
15
+ export var H = 'hour';
16
+ export var D = 'day';
17
+ export var W = 'week';
18
+ export var M = 'month';
19
+ export var Q = 'quarter';
20
+ export var Y = 'year';
21
+ export var DATE = 'date';
22
+ export var FORMAT_DEFAULT = 'YYYY-MM-DDTHH:mm:ssZ';
23
+ export var INVALID_DATE_STRING = 'Invalid Date'; // regex
24
+
25
+ export var REGEX_PARSE = /^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/;
26
+ export var REGEX_FORMAT = /\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g;