wedux-ui 0.1.0

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 (231) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +184 -0
  3. package/miniprogram_dist/behaviors/formField.js +35 -0
  4. package/miniprogram_dist/components/avatar/avatar.js +70 -0
  5. package/miniprogram_dist/components/avatar/avatar.json +4 -0
  6. package/miniprogram_dist/components/avatar/avatar.scss +68 -0
  7. package/miniprogram_dist/components/avatar/avatar.wxml +15 -0
  8. package/miniprogram_dist/components/avatar-group/avatar-group.js +45 -0
  9. package/miniprogram_dist/components/avatar-group/avatar-group.json +7 -0
  10. package/miniprogram_dist/components/avatar-group/avatar-group.scss +4 -0
  11. package/miniprogram_dist/components/avatar-group/avatar-group.wxml +3 -0
  12. package/miniprogram_dist/components/back-top/back-top.js +68 -0
  13. package/miniprogram_dist/components/back-top/back-top.json +4 -0
  14. package/miniprogram_dist/components/back-top/back-top.scss +43 -0
  15. package/miniprogram_dist/components/back-top/back-top.wxml +10 -0
  16. package/miniprogram_dist/components/badge/badge.js +100 -0
  17. package/miniprogram_dist/components/badge/badge.json +4 -0
  18. package/miniprogram_dist/components/badge/badge.scss +98 -0
  19. package/miniprogram_dist/components/badge/badge.wxml +11 -0
  20. package/miniprogram_dist/components/button/button.js +152 -0
  21. package/miniprogram_dist/components/button/button.json +4 -0
  22. package/miniprogram_dist/components/button/button.scss +499 -0
  23. package/miniprogram_dist/components/button/button.wxml +21 -0
  24. package/miniprogram_dist/components/button-group/button-group.js +51 -0
  25. package/miniprogram_dist/components/button-group/button-group.json +4 -0
  26. package/miniprogram_dist/components/button-group/button-group.scss +8 -0
  27. package/miniprogram_dist/components/button-group/button-group.wxml +3 -0
  28. package/miniprogram_dist/components/calendar/calendar.js +308 -0
  29. package/miniprogram_dist/components/calendar/calendar.json +4 -0
  30. package/miniprogram_dist/components/calendar/calendar.scss +141 -0
  31. package/miniprogram_dist/components/calendar/calendar.wxml +47 -0
  32. package/miniprogram_dist/components/card/card.js +44 -0
  33. package/miniprogram_dist/components/card/card.json +4 -0
  34. package/miniprogram_dist/components/card/card.scss +143 -0
  35. package/miniprogram_dist/components/card/card.wxml +31 -0
  36. package/miniprogram_dist/components/checkbox/checkbox.js +43 -0
  37. package/miniprogram_dist/components/checkbox/checkbox.json +4 -0
  38. package/miniprogram_dist/components/checkbox/checkbox.scss +77 -0
  39. package/miniprogram_dist/components/checkbox/checkbox.wxml +13 -0
  40. package/miniprogram_dist/components/checkbox-button/checkbox-button.js +43 -0
  41. package/miniprogram_dist/components/checkbox-button/checkbox-button.json +4 -0
  42. package/miniprogram_dist/components/checkbox-button/checkbox-button.scss +39 -0
  43. package/miniprogram_dist/components/checkbox-button/checkbox-button.wxml +8 -0
  44. package/miniprogram_dist/components/checkbox-group/checkbox-group.js +84 -0
  45. package/miniprogram_dist/components/checkbox-group/checkbox-group.json +4 -0
  46. package/miniprogram_dist/components/checkbox-group/checkbox-group.scss +9 -0
  47. package/miniprogram_dist/components/checkbox-group/checkbox-group.wxml +3 -0
  48. package/miniprogram_dist/components/color-picker/color-picker.js +348 -0
  49. package/miniprogram_dist/components/color-picker/color-picker.json +7 -0
  50. package/miniprogram_dist/components/color-picker/color-picker.scss +383 -0
  51. package/miniprogram_dist/components/color-picker/color-picker.wxml +232 -0
  52. package/miniprogram_dist/components/date-picker/date-picker.js +1289 -0
  53. package/miniprogram_dist/components/date-picker/date-picker.json +7 -0
  54. package/miniprogram_dist/components/date-picker/date-picker.scss +468 -0
  55. package/miniprogram_dist/components/date-picker/date-picker.wxml +214 -0
  56. package/miniprogram_dist/components/divider/divider.js +34 -0
  57. package/miniprogram_dist/components/divider/divider.json +4 -0
  58. package/miniprogram_dist/components/divider/divider.scss +75 -0
  59. package/miniprogram_dist/components/divider/divider.wxml +8 -0
  60. package/miniprogram_dist/components/drawer/drawer.js +104 -0
  61. package/miniprogram_dist/components/drawer/drawer.json +4 -0
  62. package/miniprogram_dist/components/drawer/drawer.scss +171 -0
  63. package/miniprogram_dist/components/drawer/drawer.wxml +22 -0
  64. package/miniprogram_dist/components/ellipsis/ellipsis.js +38 -0
  65. package/miniprogram_dist/components/ellipsis/ellipsis.json +4 -0
  66. package/miniprogram_dist/components/ellipsis/ellipsis.scss +22 -0
  67. package/miniprogram_dist/components/ellipsis/ellipsis.wxml +7 -0
  68. package/miniprogram_dist/components/flex/flex.js +81 -0
  69. package/miniprogram_dist/components/flex/flex.json +4 -0
  70. package/miniprogram_dist/components/flex/flex.scss +4 -0
  71. package/miniprogram_dist/components/flex/flex.wxml +3 -0
  72. package/miniprogram_dist/components/float-button/float-button.js +78 -0
  73. package/miniprogram_dist/components/float-button/float-button.json +4 -0
  74. package/miniprogram_dist/components/float-button/float-button.scss +54 -0
  75. package/miniprogram_dist/components/float-button/float-button.wxml +9 -0
  76. package/miniprogram_dist/components/form/form.js +142 -0
  77. package/miniprogram_dist/components/form/form.json +4 -0
  78. package/miniprogram_dist/components/form/form.scss +11 -0
  79. package/miniprogram_dist/components/form/form.wxml +3 -0
  80. package/miniprogram_dist/components/form/validator.js +220 -0
  81. package/miniprogram_dist/components/form-item/form-item.js +240 -0
  82. package/miniprogram_dist/components/form-item/form-item.json +4 -0
  83. package/miniprogram_dist/components/form-item/form-item.scss +59 -0
  84. package/miniprogram_dist/components/form-item/form-item.wxml +33 -0
  85. package/miniprogram_dist/components/gradient-text/gradient-text.js +54 -0
  86. package/miniprogram_dist/components/gradient-text/gradient-text.json +4 -0
  87. package/miniprogram_dist/components/gradient-text/gradient-text.scss +7 -0
  88. package/miniprogram_dist/components/gradient-text/gradient-text.wxml +1 -0
  89. package/miniprogram_dist/components/h/h.js +60 -0
  90. package/miniprogram_dist/components/h/h.json +4 -0
  91. package/miniprogram_dist/components/h/h.scss +53 -0
  92. package/miniprogram_dist/components/h/h.wxml +1 -0
  93. package/miniprogram_dist/components/highlight/highlight.js +77 -0
  94. package/miniprogram_dist/components/highlight/highlight.json +4 -0
  95. package/miniprogram_dist/components/highlight/highlight.scss +8 -0
  96. package/miniprogram_dist/components/highlight/highlight.wxml +12 -0
  97. package/miniprogram_dist/components/infinite-scroll/infinite-scroll.js +31 -0
  98. package/miniprogram_dist/components/infinite-scroll/infinite-scroll.json +4 -0
  99. package/miniprogram_dist/components/infinite-scroll/infinite-scroll.scss +31 -0
  100. package/miniprogram_dist/components/infinite-scroll/infinite-scroll.wxml +12 -0
  101. package/miniprogram_dist/components/input/input.js +59 -0
  102. package/miniprogram_dist/components/input/input.json +4 -0
  103. package/miniprogram_dist/components/input/input.scss +96 -0
  104. package/miniprogram_dist/components/input/input.wxml +34 -0
  105. package/miniprogram_dist/components/input-otp/input-otp.js +106 -0
  106. package/miniprogram_dist/components/input-otp/input-otp.json +4 -0
  107. package/miniprogram_dist/components/input-otp/input-otp.scss +122 -0
  108. package/miniprogram_dist/components/input-otp/input-otp.wxml +38 -0
  109. package/miniprogram_dist/components/layout/layout.js +50 -0
  110. package/miniprogram_dist/components/layout/layout.json +4 -0
  111. package/miniprogram_dist/components/layout/layout.scss +10 -0
  112. package/miniprogram_dist/components/layout/layout.wxml +3 -0
  113. package/miniprogram_dist/components/layout-content/layout-content.js +47 -0
  114. package/miniprogram_dist/components/layout-content/layout-content.json +4 -0
  115. package/miniprogram_dist/components/layout-content/layout-content.scss +5 -0
  116. package/miniprogram_dist/components/layout-content/layout-content.wxml +13 -0
  117. package/miniprogram_dist/components/layout-footer/layout-footer.js +59 -0
  118. package/miniprogram_dist/components/layout-footer/layout-footer.json +4 -0
  119. package/miniprogram_dist/components/layout-footer/layout-footer.scss +23 -0
  120. package/miniprogram_dist/components/layout-footer/layout-footer.wxml +16 -0
  121. package/miniprogram_dist/components/layout-header/layout-header.js +59 -0
  122. package/miniprogram_dist/components/layout-header/layout-header.json +4 -0
  123. package/miniprogram_dist/components/layout-header/layout-header.scss +23 -0
  124. package/miniprogram_dist/components/layout-header/layout-header.wxml +16 -0
  125. package/miniprogram_dist/components/layout-sider/layout-sider.js +48 -0
  126. package/miniprogram_dist/components/layout-sider/layout-sider.json +4 -0
  127. package/miniprogram_dist/components/layout-sider/layout-sider.scss +13 -0
  128. package/miniprogram_dist/components/layout-sider/layout-sider.wxml +5 -0
  129. package/miniprogram_dist/components/list/list.js +55 -0
  130. package/miniprogram_dist/components/list/list.json +4 -0
  131. package/miniprogram_dist/components/list/list.scss +51 -0
  132. package/miniprogram_dist/components/list/list.wxml +9 -0
  133. package/miniprogram_dist/components/list-item/list-item.js +24 -0
  134. package/miniprogram_dist/components/list-item/list-item.json +4 -0
  135. package/miniprogram_dist/components/list-item/list-item.scss +51 -0
  136. package/miniprogram_dist/components/list-item/list-item.wxml +14 -0
  137. package/miniprogram_dist/components/navigation-bar/navigation-bar.js +77 -0
  138. package/miniprogram_dist/components/navigation-bar/navigation-bar.json +4 -0
  139. package/miniprogram_dist/components/navigation-bar/navigation-bar.scss +63 -0
  140. package/miniprogram_dist/components/navigation-bar/navigation-bar.wxml +35 -0
  141. package/miniprogram_dist/components/number-animation/number-animation.js +124 -0
  142. package/miniprogram_dist/components/number-animation/number-animation.json +4 -0
  143. package/miniprogram_dist/components/number-animation/number-animation.scss +3 -0
  144. package/miniprogram_dist/components/number-animation/number-animation.wxml +1 -0
  145. package/miniprogram_dist/components/popover/popover.js +183 -0
  146. package/miniprogram_dist/components/popover/popover.json +4 -0
  147. package/miniprogram_dist/components/popover/popover.scss +69 -0
  148. package/miniprogram_dist/components/popover/popover.wxml +19 -0
  149. package/miniprogram_dist/components/qr-code/qr-code.js +216 -0
  150. package/miniprogram_dist/components/qr-code/qr-code.json +4 -0
  151. package/miniprogram_dist/components/qr-code/qr-code.scss +8 -0
  152. package/miniprogram_dist/components/qr-code/qr-code.wxml +16 -0
  153. package/miniprogram_dist/components/radio/radio.js +38 -0
  154. package/miniprogram_dist/components/radio/radio.json +4 -0
  155. package/miniprogram_dist/components/radio/radio.scss +50 -0
  156. package/miniprogram_dist/components/radio/radio.wxml +12 -0
  157. package/miniprogram_dist/components/radio-button/radio-button.js +39 -0
  158. package/miniprogram_dist/components/radio-button/radio-button.json +4 -0
  159. package/miniprogram_dist/components/radio-button/radio-button.scss +39 -0
  160. package/miniprogram_dist/components/radio-button/radio-button.wxml +8 -0
  161. package/miniprogram_dist/components/radio-group/radio-group.js +72 -0
  162. package/miniprogram_dist/components/radio-group/radio-group.json +4 -0
  163. package/miniprogram_dist/components/radio-group/radio-group.scss +9 -0
  164. package/miniprogram_dist/components/radio-group/radio-group.wxml +3 -0
  165. package/miniprogram_dist/components/rate/rate.js +90 -0
  166. package/miniprogram_dist/components/rate/rate.json +4 -0
  167. package/miniprogram_dist/components/rate/rate.scss +59 -0
  168. package/miniprogram_dist/components/rate/rate.wxml +16 -0
  169. package/miniprogram_dist/components/select/select.js +201 -0
  170. package/miniprogram_dist/components/select/select.json +7 -0
  171. package/miniprogram_dist/components/select/select.scss +235 -0
  172. package/miniprogram_dist/components/select/select.wxml +79 -0
  173. package/miniprogram_dist/components/stepper/stepper.js +113 -0
  174. package/miniprogram_dist/components/stepper/stepper.json +4 -0
  175. package/miniprogram_dist/components/stepper/stepper.scss +73 -0
  176. package/miniprogram_dist/components/stepper/stepper.wxml +23 -0
  177. package/miniprogram_dist/components/switch/switch.js +42 -0
  178. package/miniprogram_dist/components/switch/switch.json +4 -0
  179. package/miniprogram_dist/components/switch/switch.scss +77 -0
  180. package/miniprogram_dist/components/switch/switch.wxml +10 -0
  181. package/miniprogram_dist/components/tab-bar/tab-bar.js +53 -0
  182. package/miniprogram_dist/components/tab-bar/tab-bar.json +4 -0
  183. package/miniprogram_dist/components/tab-bar/tab-bar.scss +53 -0
  184. package/miniprogram_dist/components/tab-bar/tab-bar.wxml +12 -0
  185. package/miniprogram_dist/components/tag/tag.js +87 -0
  186. package/miniprogram_dist/components/tag/tag.json +4 -0
  187. package/miniprogram_dist/components/tag/tag.scss +138 -0
  188. package/miniprogram_dist/components/tag/tag.wxml +12 -0
  189. package/miniprogram_dist/components/textarea/textarea.js +46 -0
  190. package/miniprogram_dist/components/textarea/textarea.json +4 -0
  191. package/miniprogram_dist/components/textarea/textarea.scss +51 -0
  192. package/miniprogram_dist/components/textarea/textarea.wxml +20 -0
  193. package/miniprogram_dist/components/theme-provider/presets.js +101 -0
  194. package/miniprogram_dist/components/theme-provider/theme-provider.js +34 -0
  195. package/miniprogram_dist/components/theme-provider/theme-provider.json +4 -0
  196. package/miniprogram_dist/components/theme-provider/theme-provider.scss +3 -0
  197. package/miniprogram_dist/components/theme-provider/theme-provider.wxml +3 -0
  198. package/miniprogram_dist/components/time-picker/time-picker.js +136 -0
  199. package/miniprogram_dist/components/time-picker/time-picker.json +7 -0
  200. package/miniprogram_dist/components/time-picker/time-picker.scss +135 -0
  201. package/miniprogram_dist/components/time-picker/time-picker.wxml +47 -0
  202. package/miniprogram_dist/components/tooltip/tooltip.js +179 -0
  203. package/miniprogram_dist/components/tooltip/tooltip.json +4 -0
  204. package/miniprogram_dist/components/tooltip/tooltip.scss +66 -0
  205. package/miniprogram_dist/components/tooltip/tooltip.wxml +17 -0
  206. package/miniprogram_dist/components/tree/tree.js +647 -0
  207. package/miniprogram_dist/components/tree/tree.json +4 -0
  208. package/miniprogram_dist/components/tree/tree.scss +178 -0
  209. package/miniprogram_dist/components/tree/tree.wxml +59 -0
  210. package/miniprogram_dist/components/tree-select/tree-select.js +260 -0
  211. package/miniprogram_dist/components/tree-select/tree-select.json +8 -0
  212. package/miniprogram_dist/components/tree-select/tree-select.scss +250 -0
  213. package/miniprogram_dist/components/tree-select/tree-select.wxml +118 -0
  214. package/miniprogram_dist/components/upload/upload.js +387 -0
  215. package/miniprogram_dist/components/upload/upload.json +4 -0
  216. package/miniprogram_dist/components/upload/upload.scss +258 -0
  217. package/miniprogram_dist/components/upload/upload.wxml +142 -0
  218. package/miniprogram_dist/components/watermark/watermark.js +260 -0
  219. package/miniprogram_dist/components/watermark/watermark.json +4 -0
  220. package/miniprogram_dist/components/watermark/watermark.scss +35 -0
  221. package/miniprogram_dist/components/watermark/watermark.wxml +13 -0
  222. package/miniprogram_dist/libs/qrcodegen.js +714 -0
  223. package/miniprogram_dist/libs/seemly.min.js +547 -0
  224. package/miniprogram_dist/libs/tempo_1_0_0.js +1264 -0
  225. package/miniprogram_dist/libs/validator_13_56_26.min.js +5282 -0
  226. package/miniprogram_dist/styles/demo.scss +96 -0
  227. package/miniprogram_dist/styles/iconfont.scss +91 -0
  228. package/miniprogram_dist/styles/theme.scss +126 -0
  229. package/miniprogram_dist/styles/tokens.scss +292 -0
  230. package/miniprogram_dist/utils/relations.js +21 -0
  231. package/package.json +25 -0
@@ -0,0 +1,142 @@
1
+ <!-- Grid Mode -->
2
+ <view
3
+ wx:if="{{mode === 'grid'}}"
4
+ class="w-upload w-upload--grid {{(disabled || _formItemDisabled) ? 'w-upload--disabled' : ''}}"
5
+ >
6
+ <view
7
+ wx:for="{{fileList}}"
8
+ wx:key="index"
9
+ class="w-upload__grid-item"
10
+ style="{{_itemStyle}}"
11
+ data-index="{{index}}"
12
+ bindtap="handlePreview"
13
+ >
14
+ <!-- Image -->
15
+ <image
16
+ wx:if="{{item.type === 'image'}}"
17
+ class="w-upload__thumb"
18
+ src="{{item.thumb || item.url}}"
19
+ mode="aspectFill"
20
+ />
21
+ <!-- Video -->
22
+ <block wx:elif="{{item.type === 'video'}}">
23
+ <image class="w-upload__thumb" src="{{item.thumb || item.url}}" mode="aspectFill" />
24
+ <text class="w-upload__video-icon iconfont icon-play_fill"></text>
25
+ </block>
26
+ <!-- File -->
27
+ <view wx:else class="w-upload__file-info">
28
+ <text class="w-upload__file-icon iconfont icon-file"></text>
29
+ <text class="w-upload__file-name">{{item.name || '文件'}}</text>
30
+ </view>
31
+
32
+ <!-- Error overlay -->
33
+ <view
34
+ wx:if="{{item.status === 'error'}}"
35
+ class="w-upload__error-overlay"
36
+ catchtap="handleRetry"
37
+ data-index="{{index}}"
38
+ >
39
+ <text class="w-upload__retry-icon iconfont icon-retry"></text>
40
+ </view>
41
+
42
+ <!-- Progress bar -->
43
+ <view wx:if="{{item.status === 'uploading'}}" class="w-upload__progress">
44
+ <view class="w-upload__progress-bar" style="width: {{item.progress || 0}}%"></view>
45
+ </view>
46
+
47
+ <!-- Delete button -->
48
+ <view
49
+ wx:if="{{!readonly && !(disabled || _formItemDisabled)}}"
50
+ class="w-upload__delete"
51
+ catchtap="handleDelete"
52
+ data-index="{{index}}"
53
+ >
54
+ <text class="w-upload__delete-icon iconfont icon-close"></text>
55
+ </view>
56
+ </view>
57
+
58
+ <!-- Add button (grid) -->
59
+ <view
60
+ wx:if="{{!readonly && !(disabled || _formItemDisabled) && _showAdd}}"
61
+ class="w-upload__add"
62
+ style="{{_itemStyle}}"
63
+ bindtap="handleChoose"
64
+ >
65
+ <slot wx:if="{{_useSlot}}" />
66
+ <text wx:else class="w-upload__add-icon iconfont icon-add"></text>
67
+ </view>
68
+ </view>
69
+
70
+ <!-- List Mode -->
71
+ <view
72
+ wx:else
73
+ class="w-upload w-upload--list {{(disabled || _formItemDisabled) ? 'w-upload--disabled' : ''}}"
74
+ >
75
+ <view wx:for="{{fileList}}" wx:key="index" class="w-upload__list-item">
76
+ <!-- Thumb / Icon -->
77
+ <view
78
+ wx:if="{{item.type === 'image' || item.type === 'video'}}"
79
+ class="w-upload__list-thumb"
80
+ data-index="{{index}}"
81
+ bindtap="handlePreview"
82
+ >
83
+ <image class="w-upload__list-thumb-img" src="{{item.thumb || item.url}}" mode="aspectFill" />
84
+ </view>
85
+ <view wx:else class="w-upload__list-icon" data-index="{{index}}" bindtap="handlePreview">
86
+ <text class="iconfont icon-file"></text>
87
+ </view>
88
+
89
+ <!-- Content -->
90
+ <view class="w-upload__list-content" data-index="{{index}}" bindtap="handleListContentTap">
91
+ <view class="w-upload__list-name">{{item.name || item.url}}</view>
92
+ <view class="w-upload__list-meta">
93
+ <text wx:if="{{item.size}}" class="w-upload__list-size">{{_fileSizes[index] || ''}}</text>
94
+ <text
95
+ wx:if="{{item.status === 'uploading'}}"
96
+ class="w-upload__list-status w-upload__list-status--uploading"
97
+ >
98
+ {{item.progress || 0}}%
99
+ </text>
100
+ <text
101
+ wx:if="{{item.status === 'error'}}"
102
+ class="w-upload__list-status w-upload__list-status--error"
103
+ >
104
+ 重新上传
105
+ </text>
106
+ </view>
107
+ <!-- List progress bar -->
108
+ <view
109
+ wx:if="{{item.status === 'uploading' || item.status === 'error'}}"
110
+ class="w-upload__list-progress"
111
+ >
112
+ <view
113
+ class="w-upload__list-progress-bar {{item.status === 'error' ? 'w-upload__list-progress-bar--error' : ''}}"
114
+ style="width: {{item.progress || 0}}%"
115
+ ></view>
116
+ </view>
117
+ </view>
118
+
119
+ <!-- Delete -->
120
+ <view
121
+ wx:if="{{!readonly && !(disabled || _formItemDisabled)}}"
122
+ class="w-upload__list-delete"
123
+ catchtap="handleDelete"
124
+ data-index="{{index}}"
125
+ >
126
+ <text class="iconfont icon-close"></text>
127
+ </view>
128
+ </view>
129
+
130
+ <!-- Add button (list) -->
131
+ <view
132
+ wx:if="{{!readonly && !(disabled || _formItemDisabled) && _showAdd}}"
133
+ class="w-upload__list-add"
134
+ bindtap="handleChoose"
135
+ >
136
+ <slot wx:if="{{_useSlot}}" />
137
+ <block wx:else>
138
+ <text class="w-upload__list-add-icon iconfont icon-add"></text>
139
+ <text>选择文件</text>
140
+ </block>
141
+ </view>
142
+ </view>
@@ -0,0 +1,260 @@
1
+ Component({
2
+ properties: {
3
+ content: {
4
+ type: String,
5
+ value: '',
6
+ },
7
+ fontSize: {
8
+ type: Number,
9
+ value: 14,
10
+ },
11
+ fontColor: {
12
+ type: String,
13
+ value: 'rgba(128, 128, 128, 0.15)',
14
+ },
15
+ fontWeight: {
16
+ type: String,
17
+ value: 'normal',
18
+ },
19
+ fontFamily: {
20
+ type: String,
21
+ value: 'sans-serif',
22
+ },
23
+ width: {
24
+ type: Number,
25
+ value: 120,
26
+ },
27
+ height: {
28
+ type: Number,
29
+ value: 64,
30
+ },
31
+ rotate: {
32
+ type: Number,
33
+ value: -22,
34
+ },
35
+ xGap: {
36
+ type: Number,
37
+ value: 0,
38
+ },
39
+ yGap: {
40
+ type: Number,
41
+ value: 0,
42
+ },
43
+ xOffset: {
44
+ type: Number,
45
+ value: 0,
46
+ },
47
+ yOffset: {
48
+ type: Number,
49
+ value: 0,
50
+ },
51
+ zIndex: {
52
+ type: Number,
53
+ value: 10,
54
+ },
55
+ image: {
56
+ type: String,
57
+ value: '',
58
+ },
59
+ imageWidth: {
60
+ type: Number,
61
+ value: 0,
62
+ },
63
+ imageHeight: {
64
+ type: Number,
65
+ value: 0,
66
+ },
67
+ imageOpacity: {
68
+ type: Number,
69
+ value: 1,
70
+ },
71
+ cross: {
72
+ type: Boolean,
73
+ value: false,
74
+ },
75
+ fullscreen: {
76
+ type: Boolean,
77
+ value: false,
78
+ },
79
+ lineHeight: {
80
+ type: Number,
81
+ value: 0,
82
+ },
83
+ selectable: {
84
+ type: Boolean,
85
+ value: true,
86
+ },
87
+ globalRotate: {
88
+ type: Number,
89
+ value: 0,
90
+ },
91
+ },
92
+
93
+ data: {
94
+ _bgStyle: '',
95
+ _canvasW: 0,
96
+ _canvasH: 0,
97
+ },
98
+
99
+ lifetimes: {
100
+ attached() {
101
+ this._draw();
102
+ },
103
+ },
104
+
105
+ observers: {
106
+ 'content, fontSize, fontColor, fontWeight, fontFamily, width, height, rotate, xGap, yGap, xOffset, yOffset, image, imageWidth, imageHeight, imageOpacity, cross, lineHeight, globalRotate'() {
107
+ this._draw();
108
+ },
109
+ },
110
+
111
+ methods: {
112
+ _draw() {
113
+ const props = this.data;
114
+ const content = props.content;
115
+ const image = props.image;
116
+
117
+ if (!content && !image) {
118
+ this.setData({ _bgStyle: '' });
119
+ return;
120
+ }
121
+
122
+ const dpr = wx.getWindowInfo().pixelRatio || 2;
123
+ const cellW = props.width;
124
+ const cellH = props.height;
125
+ const xGap = props.xGap;
126
+ const yGap = props.yGap;
127
+ const patternW = cellW + xGap;
128
+ const patternH = cellH + yGap;
129
+ const canvasW = props.cross ? patternW * 2 : patternW;
130
+ const canvasH = props.cross ? patternH * 2 : patternH;
131
+
132
+ this.setData({
133
+ _canvasW: canvasW,
134
+ _canvasH: canvasH,
135
+ });
136
+
137
+ wx.nextTick(() => {
138
+ const query = this.createSelectorQuery();
139
+ query
140
+ .select('#watermark-canvas')
141
+ .fields({ node: true, size: true })
142
+ .exec((res) => {
143
+ if (!res || !res[0] || !res[0].node) return;
144
+
145
+ const canvas = res[0].node;
146
+ canvas.width = canvasW * dpr;
147
+ canvas.height = canvasH * dpr;
148
+ const ctx = canvas.getContext('2d');
149
+ ctx.scale(dpr, dpr);
150
+
151
+ if (image) {
152
+ this._drawImage(canvas, ctx, canvasW, canvasH, dpr, props);
153
+ } else {
154
+ this._drawText(ctx, canvasW, canvasH, props);
155
+ this._export(canvas, canvasW, canvasH, dpr, props);
156
+ }
157
+ });
158
+ });
159
+ },
160
+
161
+ _drawSingleMark(ctx, x, y, props) {
162
+ const cellW = props.width;
163
+ const cellH = props.height;
164
+ const rotate = props.rotate;
165
+
166
+ ctx.save();
167
+ ctx.translate(x + cellW / 2, y + cellH / 2);
168
+ ctx.rotate((rotate * Math.PI) / 180);
169
+
170
+ const fontSize = props.fontSize;
171
+ const lh = props.lineHeight || fontSize * 1.5;
172
+ ctx.font = `${props.fontWeight} ${fontSize}px ${props.fontFamily}`;
173
+ ctx.fillStyle = props.fontColor;
174
+ ctx.textAlign = 'center';
175
+ ctx.textBaseline = 'middle';
176
+
177
+ const lines = props.content.split('\n');
178
+ const totalH = lines.length * lh;
179
+ const startY = -totalH / 2 + lh / 2;
180
+
181
+ lines.forEach((line, i) => {
182
+ ctx.fillText(line, 0, startY + i * lh);
183
+ });
184
+
185
+ ctx.restore();
186
+ },
187
+
188
+ _drawText(ctx, canvasW, canvasH, props) {
189
+ const patternW = props.width + props.xGap;
190
+ const patternH = props.height + props.yGap;
191
+
192
+ this._drawSingleMark(ctx, 0, 0, props);
193
+
194
+ if (props.cross) {
195
+ this._drawSingleMark(ctx, patternW, patternH, props);
196
+ }
197
+ },
198
+
199
+ _drawImage(canvas, ctx, canvasW, canvasH, dpr, props) {
200
+ const img = canvas.createImage();
201
+ img.onload = () => {
202
+ let iw = props.imageWidth || img.width;
203
+ let ih = props.imageHeight || img.height;
204
+ if (!props.imageWidth && !props.imageHeight) {
205
+ iw = img.width;
206
+ ih = img.height;
207
+ } else if (props.imageWidth && !props.imageHeight) {
208
+ ih = (img.height / img.width) * iw;
209
+ } else if (!props.imageWidth && props.imageHeight) {
210
+ iw = (img.width / img.height) * ih;
211
+ }
212
+
213
+ const cellW = props.width;
214
+ const cellH = props.height;
215
+ const patternW = cellW + props.xGap;
216
+ const patternH = cellH + props.yGap;
217
+
218
+ const drawOne = (x, y) => {
219
+ ctx.save();
220
+ ctx.translate(x + cellW / 2, y + cellH / 2);
221
+ ctx.rotate((props.rotate * Math.PI) / 180);
222
+ ctx.globalAlpha = props.imageOpacity;
223
+ ctx.drawImage(img, -iw / 2, -ih / 2, iw, ih);
224
+ ctx.restore();
225
+ };
226
+
227
+ drawOne(0, 0);
228
+ if (props.cross) {
229
+ drawOne(patternW, patternH);
230
+ }
231
+
232
+ this._export(canvas, canvasW, canvasH, dpr, props);
233
+ };
234
+ img.onerror = () => {
235
+ console.warn('[w-watermark] image load failed:', props.image);
236
+ };
237
+ img.src = props.image;
238
+ },
239
+
240
+ _export(canvas, canvasW, canvasH, dpr, props) {
241
+ const dataURL = canvas.toDataURL('image/png');
242
+ const bgSize = `${canvasW}px ${canvasH}px`;
243
+ const xOffset = props.xOffset;
244
+ const yOffset = props.yOffset;
245
+ const bgPos = `${xOffset}px ${yOffset}px`;
246
+
247
+ let style =
248
+ `background-image: url('${dataURL}');` +
249
+ `background-size: ${bgSize};` +
250
+ 'background-repeat: repeat;' +
251
+ `background-position: ${bgPos};`;
252
+
253
+ if (props.globalRotate) {
254
+ style += `transform: rotate(${props.globalRotate}deg);`;
255
+ }
256
+
257
+ this.setData({ _bgStyle: style });
258
+ },
259
+ },
260
+ });
@@ -0,0 +1,4 @@
1
+ {
2
+ "component": true,
3
+ "styleIsolation": "apply-shared"
4
+ }
@@ -0,0 +1,35 @@
1
+ .w-watermark {
2
+ position: relative;
3
+ height: 100%;
4
+
5
+ &--fullscreen {
6
+ position: fixed;
7
+ top: 0;
8
+ left: 0;
9
+ width: 100vw;
10
+ height: 100vh;
11
+ pointer-events: none;
12
+ z-index: 100;
13
+ }
14
+
15
+ &__layer {
16
+ position: absolute;
17
+ top: 0;
18
+ left: 0;
19
+ width: 100%;
20
+ height: 100%;
21
+ pointer-events: none;
22
+ }
23
+
24
+ &--no-select {
25
+ pointer-events: auto;
26
+ }
27
+
28
+ &__canvas {
29
+ position: fixed;
30
+ left: -9999px;
31
+ top: -9999px;
32
+ opacity: 0;
33
+ pointer-events: none;
34
+ }
35
+ }
@@ -0,0 +1,13 @@
1
+ <view class="w-watermark {{fullscreen ? 'w-watermark--fullscreen' : ''}}">
2
+ <slot></slot>
3
+ <view
4
+ class="w-watermark__layer {{selectable ? '' : 'w-watermark--no-select'}}"
5
+ style="z-index: {{zIndex}}; {{_bgStyle}}"
6
+ ></view>
7
+ <canvas
8
+ type="2d"
9
+ id="watermark-canvas"
10
+ class="w-watermark__canvas"
11
+ style="width: {{_canvasW}}px; height: {{_canvasH}}px;"
12
+ ></canvas>
13
+ </view>