@fjyueke/bify-mcp 1.0.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 (210) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +34 -0
  3. package/dist/index.d.ts +1 -0
  4. package/dist/index.js +248 -0
  5. package/metaData/components/action-sheet/api.md +74 -0
  6. package/metaData/components/action-sheet/doc.md +243 -0
  7. package/metaData/components/action-sheet/example/index.tsx +116 -0
  8. package/metaData/components/area-picker/api.md +25 -0
  9. package/metaData/components/area-picker/doc.md +132 -0
  10. package/metaData/components/area-picker/example/index.tsx +60 -0
  11. package/metaData/components/avatar/api.md +19 -0
  12. package/metaData/components/avatar/doc.md +170 -0
  13. package/metaData/components/avatar/example/index.tsx +76 -0
  14. package/metaData/components/back-top/api.md +21 -0
  15. package/metaData/components/back-top/doc.md +142 -0
  16. package/metaData/components/back-top/example/index.tsx +96 -0
  17. package/metaData/components/backdrop/api.md +20 -0
  18. package/metaData/components/backdrop/doc.md +98 -0
  19. package/metaData/components/backdrop/example/index.tsx +33 -0
  20. package/metaData/components/badge/api.md +10 -0
  21. package/metaData/components/badge/doc.md +169 -0
  22. package/metaData/components/badge/example/index.tsx +81 -0
  23. package/metaData/components/button/api.md +31 -0
  24. package/metaData/components/button/doc.md +235 -0
  25. package/metaData/components/button/example/index.tsx +235 -0
  26. package/metaData/components/calendar/api.md +62 -0
  27. package/metaData/components/calendar/doc.md +516 -0
  28. package/metaData/components/calendar/example/index.tsx +501 -0
  29. package/metaData/components/cascader/api.md +55 -0
  30. package/metaData/components/cascader/doc.md +358 -0
  31. package/metaData/components/cascader/example/index.tsx +159 -0
  32. package/metaData/components/cell/api.md +37 -0
  33. package/metaData/components/cell/doc.md +158 -0
  34. package/metaData/components/cell/example/index.tsx +44 -0
  35. package/metaData/components/checkbox/api.md +35 -0
  36. package/metaData/components/checkbox/doc.md +203 -0
  37. package/metaData/components/checkbox/example/index.tsx +94 -0
  38. package/metaData/components/circle/api.md +17 -0
  39. package/metaData/components/circle/doc.md +123 -0
  40. package/metaData/components/circle/example/index.tsx +81 -0
  41. package/metaData/components/collapse/api.md +31 -0
  42. package/metaData/components/collapse/doc.md +142 -0
  43. package/metaData/components/collapse/example/index.tsx +81 -0
  44. package/metaData/components/config-provider/api.md +7 -0
  45. package/metaData/components/config-provider/doc.md +193 -0
  46. package/metaData/components/config-provider/example/index.tsx +54 -0
  47. package/metaData/components/countdown/api.md +46 -0
  48. package/metaData/components/countdown/doc.md +167 -0
  49. package/metaData/components/countdown/example/index.tsx +70 -0
  50. package/metaData/components/datetime-picker/api.md +25 -0
  51. package/metaData/components/datetime-picker/doc.md +317 -0
  52. package/metaData/components/datetime-picker/example/index.tsx +265 -0
  53. package/metaData/components/dialog/api.md +66 -0
  54. package/metaData/components/dialog/doc.md +292 -0
  55. package/metaData/components/dialog/example/index.tsx +138 -0
  56. package/metaData/components/divider/api.md +15 -0
  57. package/metaData/components/divider/doc.md +108 -0
  58. package/metaData/components/divider/example/index.tsx +45 -0
  59. package/metaData/components/dropdown-menu/api.md +37 -0
  60. package/metaData/components/dropdown-menu/doc.md +279 -0
  61. package/metaData/components/dropdown-menu/example/index.tsx +182 -0
  62. package/metaData/components/empty/api.md +20 -0
  63. package/metaData/components/empty/doc.md +126 -0
  64. package/metaData/components/empty/example/index.tsx +66 -0
  65. package/metaData/components/field/api.md +10 -0
  66. package/metaData/components/field/doc.md +274 -0
  67. package/metaData/components/field/example/index.tsx +203 -0
  68. package/metaData/components/fixed-nav/api.md +21 -0
  69. package/metaData/components/fixed-nav/doc.md +196 -0
  70. package/metaData/components/fixed-nav/example/index.tsx +80 -0
  71. package/metaData/components/fixed-view/api.md +10 -0
  72. package/metaData/components/fixed-view/doc.md +25 -0
  73. package/metaData/components/fixed-view/example/index.tsx +12 -0
  74. package/metaData/components/flex/api.md +18 -0
  75. package/metaData/components/flex/doc.md +103 -0
  76. package/metaData/components/flex/example/index.tsx +58 -0
  77. package/metaData/components/floating-bubble/api.md +18 -0
  78. package/metaData/components/floating-bubble/doc.md +94 -0
  79. package/metaData/components/floating-bubble/example/index.tsx +55 -0
  80. package/metaData/components/floating-panel/api.md +19 -0
  81. package/metaData/components/floating-panel/doc.md +174 -0
  82. package/metaData/components/floating-panel/example/index.tsx +131 -0
  83. package/metaData/components/form/api.md +124 -0
  84. package/metaData/components/form/doc.md +759 -0
  85. package/metaData/components/form/example/index.tsx +222 -0
  86. package/metaData/components/grid/api.md +28 -0
  87. package/metaData/components/grid/doc.md +167 -0
  88. package/metaData/components/grid/example/index.tsx +80 -0
  89. package/metaData/components/image/api.md +42 -0
  90. package/metaData/components/image/doc.md +117 -0
  91. package/metaData/components/image/example/index.tsx +76 -0
  92. package/metaData/components/index-list/api.md +39 -0
  93. package/metaData/components/index-list/doc.md +176 -0
  94. package/metaData/components/index-list/example/index.tsx +110 -0
  95. package/metaData/components/list/api.md +30 -0
  96. package/metaData/components/list/doc.md +317 -0
  97. package/metaData/components/list/example/index.tsx +218 -0
  98. package/metaData/components/loading/api.md +10 -0
  99. package/metaData/components/loading/doc.md +113 -0
  100. package/metaData/components/loading/example/index.tsx +47 -0
  101. package/metaData/components/navbar/api.md +26 -0
  102. package/metaData/components/navbar/doc.md +85 -0
  103. package/metaData/components/navbar/example/index.tsx +28 -0
  104. package/metaData/components/notice-bar/api.md +28 -0
  105. package/metaData/components/notice-bar/doc.md +154 -0
  106. package/metaData/components/notice-bar/example/index.tsx +107 -0
  107. package/metaData/components/notify/api.md +28 -0
  108. package/metaData/components/notify/doc.md +140 -0
  109. package/metaData/components/notify/example/index.tsx +89 -0
  110. package/metaData/components/number-keyboard/api.md +21 -0
  111. package/metaData/components/number-keyboard/doc.md +247 -0
  112. package/metaData/components/number-keyboard/example/index.tsx +201 -0
  113. package/metaData/components/pagination/api.md +18 -0
  114. package/metaData/components/pagination/doc.md +113 -0
  115. package/metaData/components/pagination/example/index.tsx +73 -0
  116. package/metaData/components/password-input/api.md +25 -0
  117. package/metaData/components/password-input/doc.md +126 -0
  118. package/metaData/components/password-input/example/index.tsx +124 -0
  119. package/metaData/components/picker/api.md +61 -0
  120. package/metaData/components/picker/doc.md +336 -0
  121. package/metaData/components/picker/example/index.tsx +232 -0
  122. package/metaData/components/popup/api.md +48 -0
  123. package/metaData/components/popup/doc.md +150 -0
  124. package/metaData/components/popup/example/index.tsx +214 -0
  125. package/metaData/components/progress/api.md +11 -0
  126. package/metaData/components/progress/doc.md +105 -0
  127. package/metaData/components/progress/example/index.tsx +58 -0
  128. package/metaData/components/pull-refresh/api.md +18 -0
  129. package/metaData/components/pull-refresh/doc.md +198 -0
  130. package/metaData/components/pull-refresh/example/index.tsx +153 -0
  131. package/metaData/components/radio/api.md +26 -0
  132. package/metaData/components/radio/doc.md +201 -0
  133. package/metaData/components/radio/example/index.tsx +103 -0
  134. package/metaData/components/rate/api.md +23 -0
  135. package/metaData/components/rate/doc.md +122 -0
  136. package/metaData/components/rate/example/index.tsx +36 -0
  137. package/metaData/components/rolling-text/api.md +23 -0
  138. package/metaData/components/rolling-text/doc.md +153 -0
  139. package/metaData/components/rolling-text/example/index.tsx +150 -0
  140. package/metaData/components/safe-area/api.md +8 -0
  141. package/metaData/components/safe-area/doc.md +30 -0
  142. package/metaData/components/safe-area/example/index.tsx +16 -0
  143. package/metaData/components/search/api.md +35 -0
  144. package/metaData/components/search/doc.md +185 -0
  145. package/metaData/components/search/example/index.tsx +101 -0
  146. package/metaData/components/share-sheet/api.md +48 -0
  147. package/metaData/components/share-sheet/doc.md +215 -0
  148. package/metaData/components/share-sheet/example/index.tsx +143 -0
  149. package/metaData/components/sidebar/api.md +28 -0
  150. package/metaData/components/sidebar/doc.md +122 -0
  151. package/metaData/components/sidebar/example/index.tsx +58 -0
  152. package/metaData/components/signature/api.md +19 -0
  153. package/metaData/components/signature/doc.md +115 -0
  154. package/metaData/components/signature/example/index.tsx +56 -0
  155. package/metaData/components/skeleton/api.md +45 -0
  156. package/metaData/components/skeleton/doc.md +131 -0
  157. package/metaData/components/skeleton/example/index.tsx +80 -0
  158. package/metaData/components/slider/api.md +28 -0
  159. package/metaData/components/slider/doc.md +151 -0
  160. package/metaData/components/slider/example/index.tsx +54 -0
  161. package/metaData/components/space/api.md +12 -0
  162. package/metaData/components/space/doc.md +125 -0
  163. package/metaData/components/space/example/index.tsx +75 -0
  164. package/metaData/components/stepper/api.md +37 -0
  165. package/metaData/components/stepper/doc.md +152 -0
  166. package/metaData/components/stepper/example/index.tsx +45 -0
  167. package/metaData/components/steps/api.md +9 -0
  168. package/metaData/components/steps/doc.md +143 -0
  169. package/metaData/components/steps/example/index.tsx +93 -0
  170. package/metaData/components/sticky/api.md +16 -0
  171. package/metaData/components/sticky/doc.md +87 -0
  172. package/metaData/components/sticky/example/index.tsx +62 -0
  173. package/metaData/components/swipe-cell/api.md +19 -0
  174. package/metaData/components/swipe-cell/doc.md +105 -0
  175. package/metaData/components/swipe-cell/example/index.tsx +62 -0
  176. package/metaData/components/swiper/api.md +22 -0
  177. package/metaData/components/swiper/doc.md +228 -0
  178. package/metaData/components/swiper/example/index.tsx +118 -0
  179. package/metaData/components/switch/api.md +17 -0
  180. package/metaData/components/switch/doc.md +110 -0
  181. package/metaData/components/switch/example/index.tsx +57 -0
  182. package/metaData/components/tabbar/api.md +27 -0
  183. package/metaData/components/tabbar/doc.md +160 -0
  184. package/metaData/components/tabbar/example/index.tsx +99 -0
  185. package/metaData/components/tabs/api.md +36 -0
  186. package/metaData/components/tabs/doc.md +307 -0
  187. package/metaData/components/tabs/example/index.tsx +231 -0
  188. package/metaData/components/tag/api.md +17 -0
  189. package/metaData/components/tag/doc.md +162 -0
  190. package/metaData/components/tag/example/index.tsx +84 -0
  191. package/metaData/components/text-ellipsis/api.md +26 -0
  192. package/metaData/components/text-ellipsis/doc.md +135 -0
  193. package/metaData/components/text-ellipsis/example/index.tsx +44 -0
  194. package/metaData/components/timeline/api.md +20 -0
  195. package/metaData/components/timeline/doc.md +210 -0
  196. package/metaData/components/timeline/example/index.tsx +145 -0
  197. package/metaData/components/toast/api.md +39 -0
  198. package/metaData/components/toast/doc.md +256 -0
  199. package/metaData/components/toast/example/index.tsx +136 -0
  200. package/metaData/components/tree-select/api.md +19 -0
  201. package/metaData/components/tree-select/doc.md +185 -0
  202. package/metaData/components/tree-select/example/index.tsx +112 -0
  203. package/metaData/components/uploader/api.md +32 -0
  204. package/metaData/components/uploader/doc.md +340 -0
  205. package/metaData/components/uploader/example/index.tsx +222 -0
  206. package/metaData/components/watermark/api.md +18 -0
  207. package/metaData/components/watermark/doc.md +97 -0
  208. package/metaData/components/watermark/example/index.tsx +62 -0
  209. package/metaData/components-index.json +274 -0
  210. package/package.json +56 -0
@@ -0,0 +1,340 @@
1
+ # Uploader 文件上传
2
+
3
+ ### 介绍
4
+
5
+ 用于将本地的图片或文件上传至服务器,并在上传过程中展示预览图。目前 Uploader 组件不包含将文件上传至服务器的接口逻辑,该步骤需要自行实现。
6
+
7
+ ### 引入
8
+
9
+ ```tsx
10
+ import { Uploader } from "taroify/core"
11
+ ```
12
+
13
+ ## 代码演示
14
+
15
+ ### 基础用法
16
+
17
+ 文件上传触发 `onUpload` 事件,获取到对应的 `file` 对象。
18
+
19
+ ```tsx
20
+ function BasicUploader() {
21
+ const [file, setFile] = useState<Uploader.File>()
22
+
23
+ function onUpload() {
24
+ chooseImage({
25
+ count: 1,
26
+ sizeType: ["original", "compressed"],
27
+ sourceType: ["album", "camera"],
28
+ }).then(({ tempFiles }) => {
29
+ setFile({
30
+ url: tempFiles[0].path,
31
+ type: tempFiles[0].type,
32
+ name: tempFiles[0].originalFileObj?.name,
33
+ })
34
+ })
35
+ }
36
+
37
+ return <Uploader value={file} onUpload={onUpload} onChange={setFile} />
38
+ }
39
+ ```
40
+
41
+ ### 文件预览
42
+
43
+ 通过 `value` 属性可以绑定已经上传的文件列表,并展示文件列表的预览图。
44
+
45
+ ```tsx
46
+ function PreviewUploader() {
47
+ const [files, setFiles] = useState<Uploader.File[]>([
48
+ {
49
+ url: "https://img01.yzcdn.cn/vant/leaf.jpg",
50
+ },
51
+ {
52
+ url: "https://img.yzcdn.cn/vant/tree.jpg",
53
+ },
54
+ ])
55
+
56
+ function onUpload() {
57
+ chooseImage({
58
+ count: 1,
59
+ sizeType: ["original", "compressed"],
60
+ sourceType: ["album", "camera"],
61
+ }).then(({ tempFiles }) => {
62
+ setFiles([
63
+ ...files,
64
+ ...tempFiles.map(({ path, type, originalFileObj }) => ({
65
+ type,
66
+ url: path,
67
+ name: originalFileObj?.name,
68
+ })),
69
+ ])
70
+ })
71
+ }
72
+
73
+ return <Uploader value={files} multiple onUpload={onUpload} onChange={setFiles} />
74
+ }
75
+ ```
76
+
77
+ ### 上传状态
78
+
79
+ 通过 `status` 属性可以标识上传状态,`uploading` 表示上传中,`failed` 表示上传失败,`completed` 表示上传完成。
80
+
81
+ ```tsx
82
+ function UploaderWithStatus() {
83
+ const [files, setFiles] = useState<Uploader.File[]>([
84
+ {
85
+ url: "https://img01.yzcdn.cn/vant/leaf.jpg",
86
+ status: "uploading",
87
+ message: "上传中...",
88
+ },
89
+ {
90
+ url: "https://img01.yzcdn.cn/vant/tree.jpg",
91
+ status: "failed",
92
+ message: "上传失败",
93
+ },
94
+ ])
95
+
96
+ function onUpload() {
97
+ chooseImage({
98
+ count: 1,
99
+ sizeType: ["original", "compressed"],
100
+ sourceType: ["album", "camera"],
101
+ }).then(({ tempFiles }) => {
102
+ setFiles([
103
+ ...files,
104
+ ...tempFiles.map(({ path, type, originalFileObj }) => ({
105
+ type,
106
+ url: path,
107
+ name: originalFileObj?.name,
108
+ })),
109
+ ])
110
+ })
111
+ }
112
+
113
+ return <Uploader value={files} multiple onUpload={onUpload} onChange={setFiles} />
114
+ }
115
+ ```
116
+
117
+ ### 限制上传数量
118
+
119
+ 通过 `maxFiles` 属性可以限制上传文件的数量,上传数量达到限制后,会自动隐藏上传区域。
120
+
121
+ ```tsx
122
+ function MaxFilesUploader() {
123
+ const [files, setFiles] = useState<Uploader.File[]>([])
124
+
125
+ function onUpload() {
126
+ chooseImage({
127
+ count: 1,
128
+ sizeType: ["original", "compressed"],
129
+ sourceType: ["album", "camera"],
130
+ }).then(({ tempFiles }) => {
131
+ setFiles([
132
+ ...files,
133
+ ...tempFiles.map(({ path, type, originalFileObj }) => ({
134
+ type,
135
+ url: path,
136
+ name: originalFileObj?.name,
137
+ })),
138
+ ])
139
+ })
140
+ }
141
+
142
+ return <Uploader value={files} multiple maxFiles={2} onUpload={onUpload} onChange={setFiles} />
143
+ }
144
+ ```
145
+
146
+ ### 自定义上传样式
147
+
148
+ 通过children可以自定义上传区域的样式。
149
+
150
+ ```tsx
151
+ function CustomUploader() {
152
+ const [files, setFiles] = useState<Uploader.File[]>([])
153
+ function onUpload() {
154
+ chooseImage({
155
+ count: 1,
156
+ sizeType: ["original", "compressed"],
157
+ sourceType: ["album", "camera"],
158
+ }).then(({ tempFiles }) => {
159
+ setFiles([
160
+ ...files,
161
+ ...tempFiles.map(({ path, type, originalFileObj }) => ({
162
+ type,
163
+ url: path,
164
+ name: originalFileObj?.name,
165
+ })),
166
+ ])
167
+ })
168
+ }
169
+ return (
170
+ <Uploader multiple value={files} onChange={setFiles} onUpload={onUpload}>
171
+ <Button icon={<Plus />} color="primary">
172
+ 上传文件
173
+ </Button>
174
+ </Uploader>
175
+ )
176
+ }
177
+ ```
178
+
179
+ ### 自定义上传列表项
180
+
181
+ 通过自定义 `itemrender` 控制每个上传区块
182
+ ```tsx
183
+ function CustomPreviewUploader() {
184
+ const [files, setFiles] = useState<Uploader.File[]>([
185
+ {
186
+ url: "https://img01.yzcdn.cn/vant/leaf.jpg",
187
+ },
188
+ ])
189
+
190
+ function onUpload() {
191
+ chooseImage({
192
+ sizeType: ["original", "compressed"],
193
+ sourceType: ["album", "camera"],
194
+ }).then(({ tempFiles }) => {
195
+ setFiles([
196
+ ...files,
197
+ ...tempFiles.map(({ path, type, originalFileObj }) => ({
198
+ type,
199
+ url: path,
200
+ name: originalFileObj?.name,
201
+ })),
202
+ ])
203
+ })
204
+ }
205
+
206
+ const itemRender = ({ file }: { file: Uploader.File }) => {
207
+ return (
208
+ <Uploader.Image
209
+ key={file.url}
210
+ url={file.url}
211
+ name={file.name}
212
+ type={file.type}
213
+ onRemove={() => setFiles(files.filter((item) => item !== file))}
214
+ >
215
+ <View className="preview-cover taroify-ellipsis">图片名称</View>
216
+ </Uploader.Image>
217
+ )
218
+ }
219
+
220
+ return (
221
+ <Uploader
222
+ value={files}
223
+ multiple
224
+ onUpload={onUpload}
225
+ onChange={setFiles}
226
+ itemRender={itemRender}
227
+ />
228
+ )
229
+ }
230
+ ```
231
+
232
+ ```scss
233
+ .preview-cover {
234
+ position: absolute;
235
+ bottom: 0;
236
+ box-sizing: border-box;
237
+ width: 100%;
238
+ padding: 4px * 2;
239
+ color: #fff;
240
+ font-size: 12px * 2;
241
+ text-align: center;
242
+ background: rgba(0, 0, 0, 0.3);
243
+ }
244
+ ```
245
+
246
+ ### 禁用文件上传
247
+
248
+ 通过 `disabled` 属性禁用文件上传。
249
+
250
+ ```tsx
251
+ <Uploader disabled />
252
+ ```
253
+
254
+ ## API
255
+
256
+ ### Props
257
+
258
+ | 参数 | 说明 | 类型 | 默认值 |
259
+ | --- | --- | --- | --- |
260
+ | defaultValue | 默认已上传的文件列表 | _UploadFile[]_ | - |
261
+ | value | 已上传的文件列表 | _UploadFile[]_ | - |
262
+ | name | 标识符,可以在回调函数的第二项参数中获取 | _number \| string_ | - |
263
+ | multiple | 是否开启图片多选,部分安卓机型不支持 | _boolean_ | `false` |
264
+ | disabled | 是否禁用文件上传 | _boolean_ | `false` |
265
+ | readonly | 是否将上传区域设置为只读状态 | _boolean_ | `false` |
266
+ | removable | 是否展示删除按钮 | _boolean_ | `true` |
267
+ | maxFiles | 文件上传数量限制 | _number \| string_ | - |
268
+
269
+ ### Events
270
+
271
+ | 事件名 | 说明 | 回调参数 |
272
+ | --------------------- | ---------------------- | ------------------- |
273
+ | onUpload | 点击上传区域时触发 | _event: ITouchEvent_ |
274
+ | onChange | 已上传图片列表改变后触发 | _file: UploadFile \| UploadFile[]_ |
275
+
276
+
277
+ ### UploadFile
278
+ | 参数 | 说明 | 类型 |
279
+ | -------------------- | ---------------------- | ------------------- |
280
+ | url | 下载地址 | _string_ |
281
+ | type | 文件类型(包含image时显示图标,其他显示) | _string_ |
282
+ | name | 文件名称 | _string_ |
283
+ | removable | 是否可删除 | _boolean_ |
284
+ | status | 上传状态(uploading|failed|completed) | _string_ |
285
+ | message | uploading|failed 状态时文字提示 | _string_ |
286
+
287
+
288
+ ## 主题定制
289
+
290
+ ### 样式变量
291
+
292
+ 组件提供了下列 CSS 变量,可用于自定义样式,使用方法请参考 [ConfigProvider](/components/config-provider/) 组件。
293
+
294
+ | 名称 | 默认值 | 描述 |
295
+ |-------------------------------------------|-------------------------------------------|-----|
296
+ | --uploader-size | _80px * $hd_ | - |
297
+ | --uploader-disabled-opacity | _var(--disabled-opacity)_ | - |
298
+ | --uploader-upload-size | _var(--uploader-size)_ | - |
299
+ | --uploader-upload-width | _var(--uploader-upload-size)_ | - |
300
+ | --uploader-upload-height | _var(--uploader-upload-size)_ | - |
301
+ | --uploader-upload-margin | _0 var(--padding-xs) var(--padding-xs) 0_ | - |
302
+ | --uploader-upload-background-color | _var(--gray-1)_ | - |
303
+ | --uploader-upload-active-background-color | _var(--active-color)_ | - |
304
+ | --uploader-upload-icon-color | _var(--gray-4)_ | - |
305
+ | --uploader-upload-icon-font-size | _24px * $hd_ | - |
306
+ | --uploader-upload-text-margin-top | _var(--padding-xs)_ | - |
307
+ | --uploader-upload-text-color | _var(--gray-6)_ | - |
308
+ | --uploader-upload-text-font-size | _var(--font-size-sm)_ | - |
309
+ | --uploader-preview-margin | _0 var(--padding-xs) var(--padding-xs) 0_ | - |
310
+ | --uploader-preview-image-size | _var(--uploader-size)_ | - |
311
+ | --uploader-preview-image-width | _var(--uploader-preview-image-size)_ | - |
312
+ | --uploader-preview-image-height | _var(--uploader-preview-image-size)_ | - |
313
+ | --uploader-remove-size | _14px * $hd_ | - |
314
+ | --uploader-remove-width | _var(--uploader-remove-size)_ | - |
315
+ | --uploader-remove-height | _var(--uploader-remove-size)_ | - |
316
+ | --uploader-remove-background-color | _rgba(0, 0, 0, 0.7)_ | - |
317
+ | --uploader-remove-border-radius | _0 0 0 12px * $hd_ | - |
318
+ | --uploader-remove-icon-font-size | _16px * $hd_ | - |
319
+ | --uploader-remove-icon-color | _var(--white)_ | - |
320
+ | --uploader-file-size | _var(--uploader-size)_ | - |
321
+ | --uploader-file-width | _var(--uploader-file-size)_ | - |
322
+ | --uploader-file-height | _var(--uploader-file-size)_ | - |
323
+ | --uploader-file-background-color | _var(--background-color)_ | - |
324
+ | --uploader-file-icon-font-size | _20px * $hd_ | - |
325
+ | --uploader-file-icon-color | _var(--gray-7)_ | - |
326
+ | --uploader-file-name-padding | _0 var(--padding-base)_ | - |
327
+ | --uploader-file-name-margin-top | _var(--padding-xs)_ | - |
328
+ | --uploader-file-name-font-size | _var(--font-size-sm)_ | - |
329
+ | --uploader-file-name-color | _var(--gray-7)_ | - |
330
+ | --uploader-mask-color | _var(--white)_ | - |
331
+ | --uploader-mask-background-color | _rgba(50, 50, 51, 0.88)_ | - |
332
+ | --uploader-mask-icon-size | _22px * $hd_ | - |
333
+ | --uploader-mask-message-margin-top | _6px * $hd_ | - |
334
+ | --uploader-mask-message-padding | _0 var(--padding-base)_ | - |
335
+ | --uploader-mask-message-font-size | _var(--font-size-sm)_ | - |
336
+ | --uploader-mask-message-line-height | _var(--line-height-xs)_ | - |
337
+ | --uploader-loading-icon-size | _22px * $hd_ | - |
338
+ | --uploader-loading-icon-width | _var(--uploader-loading-icon-size)_ | - |
339
+ | --uploader-loading-icon-height | _var(--uploader-loading-icon-size)_ | - |
340
+ | --uploader-loading-icon-color | _var(--white)_ | - |
@@ -0,0 +1,222 @@
1
+ import { Button, Uploader } from "@fjyueke/bify-core"
2
+ import { Plus } from "@fjyueke/bify-icons"
3
+ import { View } from "@tarojs/components"
4
+ import { chooseImage } from "@tarojs/taro"
5
+ import { useState } from "react"
6
+ import Block from "../../../components/block"
7
+ import Page from "../../../components/page"
8
+ import "./index.scss"
9
+
10
+ function BasicUploader() {
11
+ const [file, setFile] = useState<Uploader.File>()
12
+
13
+ function onUpload() {
14
+ chooseImage({
15
+ count: 1,
16
+ sizeType: ["original", "compressed"],
17
+ sourceType: ["album", "camera"],
18
+ }).then(({ tempFiles }) => {
19
+ setFile({
20
+ url: tempFiles[0].path,
21
+ type: tempFiles[0].type,
22
+ name: tempFiles[0].originalFileObj?.name,
23
+ })
24
+ })
25
+ }
26
+
27
+ return <Uploader value={file} onUpload={onUpload} onChange={setFile} />
28
+ }
29
+
30
+ function PreviewUploader() {
31
+ const [files, setFiles] = useState<Uploader.File[]>([
32
+ {
33
+ url: "https://img01.yzcdn.cn/vant/leaf.jpg",
34
+ },
35
+ {
36
+ url: "https://img.yzcdn.cn/vant/tree.jpg",
37
+ },
38
+ ])
39
+
40
+ function onUpload() {
41
+ chooseImage({
42
+ count: 1,
43
+ sizeType: ["original", "compressed"],
44
+ sourceType: ["album", "camera"],
45
+ }).then(({ tempFiles }) => {
46
+ setFiles([
47
+ ...files,
48
+ ...tempFiles.map(({ path, type, originalFileObj }) => ({
49
+ type,
50
+ url: path,
51
+ name: originalFileObj?.name,
52
+ })),
53
+ ])
54
+ })
55
+ }
56
+
57
+ return <Uploader value={files} multiple onUpload={onUpload} onChange={setFiles} />
58
+ }
59
+
60
+ function UploaderWithStatus() {
61
+ const [files, setFiles] = useState<Uploader.File[]>([
62
+ {
63
+ url: "https://img01.yzcdn.cn/vant/leaf.jpg",
64
+ status: "uploading",
65
+ message: "上传中...",
66
+ },
67
+ {
68
+ url: "https://img01.yzcdn.cn/vant/tree.jpg",
69
+ status: "failed",
70
+ message: "上传失败",
71
+ },
72
+ ])
73
+
74
+ function onUpload() {
75
+ chooseImage({
76
+ count: 1,
77
+ sizeType: ["original", "compressed"],
78
+ sourceType: ["album", "camera"],
79
+ }).then(({ tempFiles }) => {
80
+ setFiles([
81
+ ...files,
82
+ ...tempFiles.map(({ path, type, originalFileObj }) => ({
83
+ type,
84
+ url: path,
85
+ name: originalFileObj?.name,
86
+ })),
87
+ ])
88
+ })
89
+ }
90
+
91
+ return <Uploader value={files} multiple onUpload={onUpload} onChange={setFiles} />
92
+ }
93
+
94
+ function MaxFilesUploader() {
95
+ const [files, setFiles] = useState<Uploader.File[]>([])
96
+
97
+ function onUpload() {
98
+ chooseImage({
99
+ count: 1,
100
+ sizeType: ["original", "compressed"],
101
+ sourceType: ["album", "camera"],
102
+ }).then(({ tempFiles }) => {
103
+ setFiles([
104
+ ...files,
105
+ ...tempFiles.map(({ path, type, originalFileObj }) => ({
106
+ type,
107
+ url: path,
108
+ name: originalFileObj?.name,
109
+ })),
110
+ ])
111
+ })
112
+ }
113
+
114
+ return <Uploader value={files} multiple maxFiles={2} onUpload={onUpload} onChange={setFiles} />
115
+ }
116
+
117
+ function CustomUploader() {
118
+ const [files, setFiles] = useState<Uploader.File[]>([])
119
+ function onUpload() {
120
+ chooseImage({
121
+ count: 1,
122
+ sizeType: ["original", "compressed"],
123
+ sourceType: ["album", "camera"],
124
+ }).then(({ tempFiles }) => {
125
+ setFiles([
126
+ ...files,
127
+ ...tempFiles.map(({ path, type, originalFileObj }) => ({
128
+ type,
129
+ url: path,
130
+ name: originalFileObj?.name,
131
+ })),
132
+ ])
133
+ })
134
+ }
135
+ return (
136
+ <Uploader multiple value={files} onChange={setFiles} onUpload={onUpload}>
137
+ <Button icon={<Plus />} color="primary">
138
+ 上传文件
139
+ </Button>
140
+ </Uploader>
141
+ )
142
+ }
143
+
144
+ function CustomPreviewUploader() {
145
+ const [files, setFiles] = useState<Uploader.File[]>([
146
+ {
147
+ url: "https://img01.yzcdn.cn/vant/leaf.jpg",
148
+ },
149
+ ])
150
+
151
+ function onUpload() {
152
+ chooseImage({
153
+ sizeType: ["original", "compressed"],
154
+ sourceType: ["album", "camera"],
155
+ }).then(({ tempFiles }) => {
156
+ setFiles([
157
+ ...files,
158
+ ...tempFiles.map(({ path, type, originalFileObj }) => ({
159
+ type,
160
+ url: path,
161
+ name: originalFileObj?.name,
162
+ })),
163
+ ])
164
+ })
165
+ }
166
+
167
+ const itemRender = ({ file }: { file: Uploader.File }) => {
168
+ return (
169
+ <Uploader.Image
170
+ key={file.url}
171
+ url={file.url}
172
+ name={file.name}
173
+ type={file.type}
174
+ onRemove={() => setFiles(files.filter((item) => item !== file))}
175
+ >
176
+ <View className="preview-cover taroify-ellipsis">图片名称</View>
177
+ </Uploader.Image>
178
+ )
179
+ }
180
+
181
+ return (
182
+ <Uploader
183
+ value={files}
184
+ multiple
185
+ onUpload={onUpload}
186
+ onChange={setFiles}
187
+ itemRender={itemRender}
188
+ />
189
+ )
190
+ }
191
+
192
+ function DisabledUploader() {
193
+ return <Uploader disabled />
194
+ }
195
+
196
+ export default function UploaderDemo() {
197
+ return (
198
+ <Page title="Uploader 文件上传" className="uploader-demo">
199
+ <Block title="基础用法">
200
+ <BasicUploader />
201
+ </Block>
202
+ <Block title="文件预览">
203
+ <PreviewUploader />
204
+ </Block>
205
+ <Block title="上传状态">
206
+ <UploaderWithStatus />
207
+ </Block>
208
+ <Block title="限制上传数量">
209
+ <MaxFilesUploader />
210
+ </Block>
211
+ <Block title="自定义上传样式">
212
+ <CustomUploader />
213
+ </Block>
214
+ <Block title="自定义上传列表项">
215
+ <CustomPreviewUploader />
216
+ </Block>
217
+ <Block title="禁用文件上传">
218
+ <DisabledUploader />
219
+ </Block>
220
+ </Page>
221
+ )
222
+ }
@@ -0,0 +1,18 @@
1
+ ## API
2
+
3
+ ### Props
4
+
5
+ | 参数 | 说明 | 类型 | 默认值 |
6
+ | --------- | ----------------------------------------------------------- | ------------------ | --------- |
7
+ | width | 水印宽度 | _number_ | `80` |
8
+ | height | 水印高度 | _number_ | `80` |
9
+ | zIndex | 水印的 z-index | _number \| string_ | `100` |
10
+ | content | 文字水印的内容 | _string_ | - |
11
+ | image | 图片水印的内容,如果与 `content` 同时传入,优先使用图片水印 | _string_ | - |
12
+ | rotate | 水印的旋转角度 | _number_ | `-11` |
13
+ | fullPage | 水印是否全屏显示 | _boolean_ | `false` |
14
+ | gapX | 水印之间的水平间隔 | _number_ | `20` |
15
+ | gapY | 水印之间的垂直间隔 | _number_ | `20` |
16
+ | textColor | 文字水印的颜色 | _string_ | `#dcdee0` |
17
+ | textSize | 文字水印的大小 | _number_ | `20` |
18
+ | opacity | 水印的透明度 | _number_ | - |
@@ -0,0 +1,97 @@
1
+ # Watermark 水印
2
+
3
+ ### 介绍
4
+
5
+ 在页面上添加特定的文字或图案作为水印,可用于防止信息盗用。
6
+
7
+ 请升级 `taroify` 到 >= `v0.1.1-alpha.11` 版本来使用该组件。
8
+
9
+ ### 引入
10
+
11
+ ```tsx
12
+ import { Watermark } from "@fjyueke/bify-core"
13
+ ```
14
+
15
+ ## 代码演示
16
+
17
+ ### 文字水印
18
+
19
+ 通过 `content` 属性来设置水印的文字。
20
+
21
+ ```tsx
22
+ <Watermark content="Taroify" />
23
+ ```
24
+
25
+ ### 图片水印
26
+
27
+ 通过 `image` 属性来设置水印图片,并使用 `opacity` 来调整水印的整体透明度。
28
+
29
+ ```tsx
30
+ <Watermark image="https://fastly.jsdelivr.net/npm/@vant/assets/vant-watermark.png" opacity={0.2} />
31
+ ```
32
+
33
+ ### 自定义间隔
34
+
35
+ 通过 `gapX` 和 `gapY` 属性来控制多个重复水印之间的间隔。
36
+
37
+ ```tsx
38
+ <Watermark
39
+ image="https://fastly.jsdelivr.net/npm/@vant/assets/vant-watermark.png"
40
+ gapX={30}
41
+ gapY={10}
42
+ opacity={0.2}
43
+ />
44
+ ```
45
+
46
+ ### 自定义倾斜角度
47
+
48
+ 通过 `rotate` 属性来控制水印的倾斜角度,默认值为`-11`。
49
+
50
+ ```tsx
51
+ <Watermark
52
+ image="https://fastly.jsdelivr.net/npm/@vant/assets/vant-watermark.png"
53
+ rotate={22}
54
+ opacity={0.2}
55
+ />
56
+ ```
57
+
58
+ ### 显示范围
59
+
60
+ 通过 `fullPage` 属性来控制水印的显示范围。
61
+
62
+ ```tsx
63
+ <Watermark
64
+ image="https://fastly.jsdelivr.net/npm/@vant/assets/vant-watermark.png"
65
+ opacity={0.2}
66
+ fullPage
67
+ />
68
+ ```
69
+
70
+ ## API
71
+
72
+ ### Props
73
+
74
+ | 参数 | 说明 | 类型 | 默认值 |
75
+ | --------- | ----------------------------------------------------------- | ------------------ | --------- |
76
+ | width | 水印宽度 | _number_ | `80` |
77
+ | height | 水印高度 | _number_ | `80` |
78
+ | zIndex | 水印的 z-index | _number \| string_ | `100` |
79
+ | content | 文字水印的内容 | _string_ | - |
80
+ | image | 图片水印的内容,如果与 `content` 同时传入,优先使用图片水印 | _string_ | - |
81
+ | rotate | 水印的旋转角度 | _number_ | `-11` |
82
+ | fullPage | 水印是否全屏显示 | _boolean_ | `false` |
83
+ | gapX | 水印之间的水平间隔 | _number_ | `20` |
84
+ | gapY | 水印之间的垂直间隔 | _number_ | `20` |
85
+ | textColor | 文字水印的颜色 | _string_ | `#dcdee0` |
86
+ | textSize | 文字水印的大小 | _number_ | `20` |
87
+ | opacity | 水印的透明度 | _number_ | - |
88
+
89
+ ## 主题定制
90
+
91
+ ### 样式变量
92
+
93
+ 组件提供了下列 CSS 变量,可用于自定义样式,使用方法请参考 [ConfigProvider 组件](/components/config-provider)。
94
+
95
+ | 名称 | 默认值 | 描述 |
96
+ | ------------------- | ------ | --------------------- |
97
+ | --watermark-z-index | _100_ | 根节点的 z-index 层级 |