@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,126 @@
1
+ # PasswordInput 密码输入框
2
+
3
+ ### 介绍
4
+
5
+ 带网格的输入框组件,可以用于输入密码、短信验证码等场景,通常与[数字键盘](/components/number-keyboard/)组件配合使用。
6
+
7
+ ### 引入
8
+
9
+ ```tsx
10
+ import { PasswordInput } from "@fjyueke/bify-core";
11
+ ```
12
+
13
+ ## 代码演示
14
+
15
+ ### 基础用法
16
+
17
+ 搭配数字键盘组件来实现密码输入功能。
18
+
19
+ ```tsx
20
+ function BasicPasswordInput() {
21
+ const [open, setOpen] = useState(false)
22
+ const [value, setValue] = useState("123")
23
+
24
+ return (
25
+ <>
26
+ <PasswordInput focus value={value} onFocus={() => setOpen(true)} />
27
+ <NumberKeyboard
28
+ open={open}
29
+ onKeyPress={(key) => setValue(value + key)}
30
+ onBackspace={() => setValue(value.substring(0, value.length - 1))}
31
+ onHide={() => setOpen(false)}
32
+ />
33
+ </>
34
+ )
35
+ }
36
+ ```
37
+
38
+ ### 自定义长度
39
+
40
+ 通过 `length` 属性来设置密码长度。
41
+
42
+ ```tsx
43
+ <PasswordInput length={6} value="123" />
44
+ ```
45
+
46
+ ### 格子间距
47
+
48
+ 通过 `gutter` 属性来设置格子之间的间距。
49
+
50
+ ```tsx
51
+ <PasswordInput gutter={10} value="123" />
52
+ ```
53
+
54
+ ### 明文展示
55
+
56
+ 将 `mask` 设置为 `false` 可以明文展示输入的内容,适用于短信验证码等场景。
57
+
58
+ ```tsx
59
+ <PasswordInput mask={false} value="123" />
60
+ ```
61
+
62
+ ### 提示信息
63
+
64
+ 通过 `feedback` 属性设置提示信息,例如当输入六位时提示密码错误。
65
+
66
+ ```tsx
67
+ <PasswordInput feedback="密码为 6 位数字" value="123" />
68
+ <PasswordInput feedback={{ color: "danger", children: "密码为 6 位数字" }} value="123" />
69
+ <PasswordInput feedback={<PasswordInput.Feedback color="danger" children="密码为 6 位数字" />} value="123" />
70
+ ```
71
+
72
+ ## API
73
+
74
+ ### PasswordInput Props
75
+
76
+ | 参数 | 说明 | 类型 | 默认值 |
77
+ |----------|-------------------------------------|--------------|-----------------------------|
78
+ | value | 密码值 | _string_ | `''` |
79
+ | length | 密码最大长度 | _number \| string_ | `6` |
80
+ | gutter | 输入框格子之间的间距,如 `20px` `2em`,默认单位为`px` | _number \| string_ | `0` |
81
+ | mask | 是否隐藏密码内容 | _boolean_ | `true` |
82
+ | focus | 是否聚焦,聚焦时会显示光标 | _boolean_ | `false` |
83
+ | feedback | 输入框下方文字提示 | _ReactText \| PasswordInputFeedbackProps \| ReactElement_ | - |
84
+
85
+ ### PasswordInput Events
86
+
87
+ | 事件名 | 说明 | 回调参数 |
88
+ |---------|----------|------|
89
+ | onFocus | 输入框聚焦时触发 | - |
90
+
91
+
92
+ ### PasswordInput.Feedback Props
93
+
94
+ | 参数 | 说明 | 类型 | 默认值 |
95
+ |-------|---------------------------------------------------------|----------|-----|
96
+ | color | 颜色,可选值为 `primary` `info` `success` `warning` `danger` | _string_ | - |
97
+
98
+ ## 主题定制
99
+
100
+ ### 样式变量
101
+
102
+ 组件提供了下列 CSS 变量,可用于自定义样式,使用方法请参考 [ConfigProvider](/components/config-provider/) 组件。
103
+
104
+ | 名称 | 默认值 | 描述 |
105
+ |------------------------------------------|-----------------------------------|-----|
106
+ | password-input-height | _50px * $hd_ | - |
107
+ | password-input-margin | _0 var(--padding-md)_ | - |
108
+ | password-input-border-radius | _6px * $hd_ | - |
109
+ | password-input-item-font-size | _20px * $hd_ | - |
110
+ | password-input-item-background-color | _var(--white)_ | - |
111
+ | password-input-mask-size | _10px * $hd_ | - |
112
+ | password-input-mask-width | _var(--password-input-mask-size)_ | - |
113
+ | password-input-mask-height | _var(--password-input-mask-size)_ | - |
114
+ | password-input-mask-color | _var(--black)_ | - |
115
+ | password-input-cursor-color | _var(--text-color)_ | - |
116
+ | password-input-cursor-width | _1px * $hd_ | - |
117
+ | password-input-cursor-height | _40%_ | - |
118
+ | password-input-cursor-animation-duration | _1s_ | - |
119
+ | password-input-feedback-margin-top | _var(--padding-md)_ | - |
120
+ | password-input-feedback-font-size | _var(--font-size-md)_ | - |
121
+ | password-input-feedback-color | _var(--gray-6)_ | - |
122
+ | password-input-feedback-primary-color | _var(--primary-color)_ | - |
123
+ | password-input-feedback-info-color | _var(--info-color)_ | - |
124
+ | password-input-feedback-success-color | _var(--success-color)_ | - |
125
+ | password-input-feedback-warning-color | _var(--warning-color)_ | - |
126
+ | password-input-feedback-danger-color | _var(--danger-color)_ | - |
@@ -0,0 +1,124 @@
1
+ import { NumberKeyboard, PasswordInput } from "@fjyueke/bify-core"
2
+ import { useState } from "react"
3
+ import Block from "../../../components/block"
4
+ import Page from "../../../components/page"
5
+ import "./index.scss"
6
+
7
+ interface OpenKeyboardProps {
8
+ open?: string
9
+
10
+ onOpen?(open: string): void
11
+ }
12
+
13
+ function BasicPasswordInput(props: OpenKeyboardProps) {
14
+ const { open, onOpen } = props
15
+ const [value, setValue] = useState("123")
16
+
17
+ return (
18
+ <>
19
+ <PasswordInput focus value={value} onFocus={() => onOpen?.("basic")} />
20
+ <NumberKeyboard
21
+ open={open === "basic"}
22
+ onKeyPress={(key) => setValue(value + key)}
23
+ onBackspace={() => setValue(value.substring(0, value.length - 1))}
24
+ onHide={() => onOpen?.("")}
25
+ />
26
+ </>
27
+ )
28
+ }
29
+
30
+ function CustomLengthPasswordInput(props: OpenKeyboardProps) {
31
+ const { open, onOpen } = props
32
+ const [value, setValue] = useState("123")
33
+
34
+ return (
35
+ <>
36
+ <PasswordInput focus length={6} value={value} onFocus={() => onOpen?.("length")} />
37
+ <NumberKeyboard
38
+ open={open === "length"}
39
+ onKeyPress={(key) => setValue(value + key)}
40
+ onBackspace={() => setValue(value.substring(0, value.length - 1))}
41
+ onHide={() => onOpen?.("")}
42
+ />
43
+ </>
44
+ )
45
+ }
46
+
47
+ function GutterPasswordInput(props: OpenKeyboardProps) {
48
+ const { open, onOpen } = props
49
+ const [value, setValue] = useState("123")
50
+
51
+ return (
52
+ <>
53
+ <PasswordInput focus gutter={10} value={value} onFocus={() => onOpen?.("gutter")} />
54
+ <NumberKeyboard
55
+ open={open === "gutter"}
56
+ onKeyPress={(key) => setValue(value + key)}
57
+ onBackspace={() => setValue(value.substring(0, value.length - 1))}
58
+ onHide={() => onOpen?.("")}
59
+ />
60
+ </>
61
+ )
62
+ }
63
+
64
+ function NoMaskPasswordInput(props: OpenKeyboardProps) {
65
+ const { open, onOpen } = props
66
+ const [value, setValue] = useState("123")
67
+
68
+ return (
69
+ <>
70
+ <PasswordInput focus mask={false} value={value} onFocus={() => onOpen?.("mask")} />
71
+ <NumberKeyboard
72
+ open={open === "mask"}
73
+ onKeyPress={(key) => setValue(value + key)}
74
+ onBackspace={() => setValue(value.substring(0, value.length - 1))}
75
+ onHide={() => onOpen?.("")}
76
+ />
77
+ </>
78
+ )
79
+ }
80
+
81
+ function PasswordInputWithFeedback(props: OpenKeyboardProps) {
82
+ const { open, onOpen } = props
83
+ const [value, setValue] = useState("123")
84
+
85
+ return (
86
+ <>
87
+ <PasswordInput
88
+ focus
89
+ feedback="密码为 6 位数字"
90
+ value={value}
91
+ onFocus={() => onOpen?.("feedback")}
92
+ />
93
+ <NumberKeyboard
94
+ open={open === "feedback"}
95
+ onKeyPress={(key) => setValue(value + key)}
96
+ onBackspace={() => setValue(value.substring(0, value.length - 1))}
97
+ onHide={() => onOpen?.("")}
98
+ />
99
+ </>
100
+ )
101
+ }
102
+
103
+ export default function PasswordInputDemo() {
104
+ const [open, setOpen] = useState("")
105
+ return (
106
+ <Page title="PasswordInput 密码输入框" className="password-input-demo">
107
+ <Block title="基础用法">
108
+ <BasicPasswordInput open={open} onOpen={setOpen} />
109
+ </Block>
110
+ <Block title="自定义长度">
111
+ <CustomLengthPasswordInput open={open} onOpen={setOpen} />
112
+ </Block>
113
+ <Block title="格子间距">
114
+ <GutterPasswordInput open={open} onOpen={setOpen} />
115
+ </Block>
116
+ <Block title="明文展示">
117
+ <NoMaskPasswordInput open={open} onOpen={setOpen} />
118
+ </Block>
119
+ <Block title="提示信息">
120
+ <PasswordInputWithFeedback open={open} onOpen={setOpen} />
121
+ </Block>
122
+ </Page>
123
+ )
124
+ }
@@ -0,0 +1,61 @@
1
+ ## API
2
+
3
+ ### Picker Props
4
+
5
+ | 参数 | 说明 | 类型 | 默认值 |
6
+ | -------------------------------------- | --------------------------------------------------------- | -------------------------------------------- | --------------------------------- |
7
+ | defaultValue | 默认选中的值 | _string \| string[]_ | - |
8
+ | value | 选中的值 | _string \| string[]_ | - |
9
+ | title | 顶部栏标题 | _ReactNode_ | - |
10
+ | confirmText <br>`v0.1.1-alpha.5` | 确认按钮文字 | _ReactNode_ | `确认` |
11
+ | cancelText <br>`v0.1.1-alpha.5` | 取消按钮文字 | _ReactNode_ | `取消` |
12
+ | columns <br>`v0.1.1-alpha.5` | 对象数组,配置每一列显示的数据 | _PickerOptionData[] \| PickerOptionData[][]_ | - |
13
+ | columnsFieldNames <br>`v0.1.1-alpha.5` | 自定义 columns 结构中的字段 | _{label?: string,value?: string}_ | `{label: "label",value: "value"}` |
14
+ | loading | 是否显示加载状态 | _boolean_ | `false` |
15
+ | readonly | 是否为只读状态,只读状态下无法切换选项 | _boolean_ | `false` |
16
+ | siblingCount | 可见的选项相邻个数 | _number_ | `3` |
17
+ | optionHeight <br>`v0.1.1-alpha.5` | 选项高度,支持 `px` `vw` `vh` `rem` `rpx` 单位,默认 `px` | _number\|string_ | `44` |
18
+
19
+ ### Picker Events
20
+
21
+ 当选择器有多列时,事件回调参数会返回数组。
22
+
23
+ | 事件名 | 说明 | 回调参数 |
24
+ | --------- | ------------------ | ------------------------------------------------------------------------------------ |
25
+ | onConfirm | 点击完成按钮时触发 | 单列:选中值,选中值对应的选项对象<br>多列:所有列选中值,所有列选中值对应的选项对象 |
26
+ | onCancel | 点击取消按钮时触发 | 单列:选中值,选中值对应的选项对象<br>多列:所有列选中值,所有列选中值对应的选项对象 |
27
+ | onChange | 选项改变时触发 | 单列:选中值,选中值对应的选项对象<br>多列:所有列选中值,当前列对应的选项对象 |
28
+
29
+ ### Picker.Toolbar Props
30
+
31
+ | 参数 | 说明 | 类型 | 默认值 |
32
+ | -------- | -------- | ---------- | ------ |
33
+ | children | 头部内容 | _ReactNoe_ | - |
34
+
35
+ ### Picker.Title Props
36
+
37
+ | 参数 | 说明 | 类型 | 默认值 |
38
+ | -------- | ---------- | ---------- | ------ |
39
+ | children | 顶部栏标题 | _ReactNoe_ | - |
40
+
41
+ ### Picker.Button Props
42
+
43
+ | 参数 | 说明 | 类型 | 默认值 |
44
+ | -------- | -------- | ----------------------- | ------ |
45
+ | children | 按钮内容 | _ReactNoe_ | - |
46
+ | type | 按钮类型 | _"cancel" \| "confirm"_ | - |
47
+
48
+ ### Picker.Column Props
49
+
50
+ | 参数 | 说明 | 类型 | 默认值 |
51
+ | -------- | -------- | ---------- | ------ |
52
+ | children | 一列选项 | _ReactNoe_ | - |
53
+
54
+ ### Picker.Option Props
55
+
56
+ | 参数 | 说明 | 类型 | 默认值 |
57
+ | -------- | ------------ | ---------- | ------- |
58
+ | children | 选项内容 | _ReactNoe_ | - |
59
+ | value | 选项对应的值 | _string_ | - |
60
+ | label | 选项内容 | _ReactNoe_ | - |
61
+ | disabled | 是否禁用选项 | _boolean_ | `false` |
@@ -0,0 +1,336 @@
1
+ # Picker 选择器
2
+
3
+ ### 介绍
4
+
5
+ 提供多个选项集合供用户选择,支持单列选择和多列级联,通常与[弹出层](/components/popup/)组件配合使用。
6
+
7
+ ### 引入
8
+
9
+ ```tsx
10
+ import { Picker } from "@fjyueke/bify-core"
11
+ ```
12
+
13
+ ## 代码演示
14
+
15
+ ### 基础用法
16
+
17
+ ```tsx
18
+ function BasicPicker() {
19
+ const columns = useMemo(
20
+ () => [
21
+ { label: "杭州", value: "Hangzhou" },
22
+ { label: "宁波", value: "Ningbo" },
23
+ { label: "温州", value: "Wenzhou" },
24
+ { label: "绍兴", value: "Shaoxing" },
25
+ { label: "湖州", value: "Huzhou" },
26
+ ],
27
+ [],
28
+ )
29
+
30
+ return (
31
+ <>
32
+ <Toast id="toast" />
33
+ <Picker
34
+ title="标题"
35
+ columns={columns}
36
+ onChange={(value) => Toast.open(`当前值:${value}`)}
37
+ onConfirm={(value) => Toast.open(`当前值:${value}`)}
38
+ ></Picker>
39
+ </>
40
+ )
41
+ }
42
+ ```
43
+
44
+ ### 默认选中项
45
+
46
+ 通过 `defaultValue` 属性设置初始选中项的值。
47
+
48
+ ```tsx
49
+ function DefaultPicker() {
50
+ const columns = useMemo(
51
+ () => [
52
+ { label: "杭州", value: "Hangzhou" },
53
+ { label: "宁波", value: "Ningbo" },
54
+ { label: "温州", value: "Wenzhou" },
55
+ { label: "绍兴", value: "Shaoxing" },
56
+ { label: "湖州", value: "Huzhou" },
57
+ ],
58
+ [],
59
+ )
60
+ return (
61
+ <>
62
+ <Toast id="toast" />
63
+ <Picker
64
+ defaultValue="Wenzhou"
65
+ title="标题"
66
+ columns={columns}
67
+ onChange={(value) => Toast.open(`当前值:${value}`)}
68
+ onConfirm={(value) => Toast.open(`当前值:${value}`)}
69
+ ></Picker>
70
+ </>
71
+ )
72
+ }
73
+ ```
74
+
75
+ ### 多列选择
76
+
77
+ ```tsx
78
+ function PickerWithMultiColumns() {
79
+ const columns = useMemo(
80
+ () => [
81
+ [
82
+ { label: "周一", value: "Monday" },
83
+ { label: "周二", value: "Tuesday" },
84
+ { label: "周三", value: "Wednesday" },
85
+ { label: "周四", value: "Thursday" },
86
+ { label: "周五", value: "Friday" },
87
+ ],
88
+ [
89
+ { label: "上午", value: "morning" },
90
+ { label: "下午", value: "afternoon" },
91
+ { label: "晚上", value: "evening" },
92
+ ],
93
+ ],
94
+ [],
95
+ )
96
+ return (
97
+ <>
98
+ <Toast id="toast" />
99
+ <Picker
100
+ defaultValue={["Monday", "evening"]}
101
+ title="标题"
102
+ columns={columns}
103
+ onChange={(value) => Toast.open(`当前值:${value}`)}
104
+ onConfirm={(value) => Toast.open(`当前值:${value}`)}
105
+ ></Picker>
106
+ </>
107
+ )
108
+ }
109
+ ```
110
+
111
+ ### 禁用选项
112
+
113
+ 通过设置 `disabled` 来禁用该选项。
114
+
115
+ ```tsx
116
+ function DisabledPicker() {
117
+ const columns = useMemo(
118
+ () => [
119
+ { label: "杭州", value: "Hangzhou" },
120
+ { label: "宁波", value: "Ningbo" },
121
+ { label: "温州", value: "Wenzhou", disabled: true },
122
+ { label: "绍兴", value: "Shaoxing" },
123
+ { label: "湖州", value: "Huzhou" },
124
+ ],
125
+ [],
126
+ )
127
+ return (
128
+ <Picker
129
+ columns={columns}
130
+ onChange={(value) => Toast.open(`当前值:${value}`)}
131
+ onConfirm={(value) => Toast.open(`当前值:${value}`)}
132
+ ></Picker>
133
+ )
134
+ }
135
+ ```
136
+
137
+ > Tips: 通过设置 confirmText="",cancelText=""不显示顶部栏
138
+
139
+ ### 加载状态
140
+
141
+ 若选择器数据是异步获取的,可以通过 `loading` 属性显示加载提示。
142
+
143
+ ```tsx
144
+ function LoadingPicker() {
145
+ const columns = useMemo(
146
+ () => [
147
+ { label: "杭州", value: "Hangzhou" },
148
+ { label: "宁波", value: "Ningbo" },
149
+ { label: "温州", value: "Wenzhou" },
150
+ { label: "绍兴", value: "Shaoxing" },
151
+ { label: "湖州", value: "Huzhou" },
152
+ ],
153
+ [],
154
+ )
155
+
156
+ return (
157
+ <>
158
+ <Toast id="toast" />
159
+ <Picker
160
+ loading
161
+ title="标题"
162
+ columns={columns}
163
+ onChange={(value) => Toast.open(`当前值:${value}`)}
164
+ onConfirm={(value) => Toast.open(`当前值:${value}`)}
165
+ ></Picker>
166
+ </>
167
+ )
168
+ }
169
+ ```
170
+
171
+ ### 搭配弹出层使用
172
+
173
+ 在实际场景中,Picker 通常作为用于辅助表单填写,可以搭配 Popup 和 Field 实现该效果。
174
+
175
+ ```tsx
176
+ function PickerPopup() {
177
+ const [value, setValue] = useState("")
178
+ const [openPicker, setOpenPicker] = useState(false)
179
+ const columns = useMemo(
180
+ () => [
181
+ { label: "杭州", value: "Hangzhou" },
182
+ { label: "宁波", value: "Ningbo" },
183
+ { label: "温州", value: "Wenzhou" },
184
+ { label: "绍兴", value: "Shaoxing" },
185
+ { label: "湖州", value: "Huzhou" },
186
+ ],
187
+ [],
188
+ )
189
+ return (
190
+ <>
191
+ <Field label="城市" isLink onClick={() => setOpenPicker(true)}>
192
+ <Input readonly placeholder="选择城市" value={value} />
193
+ </Field>
194
+ <Popup open={openPicker} rounded placement="bottom" onClose={setOpenPicker}>
195
+ <Popup.Backdrop />
196
+ <Picker
197
+ title="搭配弹出层使用"
198
+ cancelText="取消"
199
+ confirmText="确认"
200
+ columns={columns}
201
+ onCancel={() => setOpenPicker(false)}
202
+ onConfirm={(values) => {
203
+ setValue(values as string)
204
+ setOpenPicker(false)
205
+ }}
206
+ ></Picker>
207
+ </Popup>
208
+ </>
209
+ )
210
+ }
211
+ ```
212
+
213
+ ### 手动控制 DOM
214
+
215
+ 通过 `Picker.Toolbar` `Picker.Title` `Picker.Button` `Picker.Column` `Picker.Option` 手动控制 DOM 渲染
216
+
217
+ ```tsx
218
+ function ManualPicker() {
219
+ return (
220
+ <>
221
+ <Toast id="toast" />
222
+ <Picker
223
+ onChange={(value) => Toast.open(`当前值:${value}`)}
224
+ onConfirm={(value) => Toast.open(`当前值:${value}`)}
225
+ >
226
+ <Picker.Toolbar>
227
+ <Picker.Button>取消</Picker.Button>
228
+ <Picker.Title>标题</Picker.Title>
229
+ <Picker.Button>确认</Picker.Button>
230
+ </Picker.Toolbar>
231
+ <Picker.Column>
232
+ <Picker.Option>周一</Picker.Option>
233
+ <Picker.Option>周二</Picker.Option>
234
+ <Picker.Option>周三</Picker.Option>
235
+ <Picker.Option>周四</Picker.Option>
236
+ <Picker.Option>周五</Picker.Option>
237
+ </Picker.Column>
238
+ <Picker.Column>
239
+ <Picker.Option>上午</Picker.Option>
240
+ <Picker.Option>下午</Picker.Option>
241
+ <Picker.Option>晚上</Picker.Option>
242
+ </Picker.Column>
243
+ </Picker>
244
+ </>
245
+ )
246
+ }
247
+ ```
248
+
249
+ ## API
250
+
251
+ ### Picker Props
252
+
253
+ | 参数 | 说明 | 类型 | 默认值 |
254
+ | -------------------------------------- | --------------------------------------------------------- | -------------------------------------------- | --------------------------------- |
255
+ | defaultValue | 默认选中的值 | _string \| string[]_ | - |
256
+ | value | 选中的值 | _string \| string[]_ | - |
257
+ | title | 顶部栏标题 | _ReactNode_ | - |
258
+ | confirmText <br>`v0.1.1-alpha.5` | 确认按钮文字 | _ReactNode_ | `确认` |
259
+ | cancelText <br>`v0.1.1-alpha.5` | 取消按钮文字 | _ReactNode_ | `取消` |
260
+ | columns <br>`v0.1.1-alpha.5` | 对象数组,配置每一列显示的数据 | _PickerOptionData[] \| PickerOptionData[][]_ | - |
261
+ | columnsFieldNames <br>`v0.1.1-alpha.5` | 自定义 columns 结构中的字段 | _{label?: string,value?: string}_ | `{label: "label",value: "value"}` |
262
+ | loading | 是否显示加载状态 | _boolean_ | `false` |
263
+ | readonly | 是否为只读状态,只读状态下无法切换选项 | _boolean_ | `false` |
264
+ | siblingCount | 可见的选项相邻个数 | _number_ | `3` |
265
+ | optionHeight <br>`v0.1.1-alpha.5` | 选项高度,支持 `px` `vw` `vh` `rem` `rpx` 单位,默认 `px` | _number\|string_ | `44` |
266
+
267
+ ### Picker Events
268
+
269
+ 当选择器有多列时,事件回调参数会返回数组。
270
+
271
+ | 事件名 | 说明 | 回调参数 |
272
+ | --------- | ------------------ | ------------------------------------------------------------------------------------ |
273
+ | onConfirm | 点击完成按钮时触发 | 单列:选中值,选中值对应的选项对象<br>多列:所有列选中值,所有列选中值对应的选项对象 |
274
+ | onCancel | 点击取消按钮时触发 | 单列:选中值,选中值对应的选项对象<br>多列:所有列选中值,所有列选中值对应的选项对象 |
275
+ | onChange | 选项改变时触发 | 单列:选中值,选中值对应的选项对象<br>多列:所有列选中值,当前列对应的选项对象 |
276
+
277
+ ### Picker.Toolbar Props
278
+
279
+ | 参数 | 说明 | 类型 | 默认值 |
280
+ | -------- | -------- | ---------- | ------ |
281
+ | children | 头部内容 | _ReactNoe_ | - |
282
+
283
+ ### Picker.Title Props
284
+
285
+ | 参数 | 说明 | 类型 | 默认值 |
286
+ | -------- | ---------- | ---------- | ------ |
287
+ | children | 顶部栏标题 | _ReactNoe_ | - |
288
+
289
+ ### Picker.Button Props
290
+
291
+ | 参数 | 说明 | 类型 | 默认值 |
292
+ | -------- | -------- | ----------------------- | ------ |
293
+ | children | 按钮内容 | _ReactNoe_ | - |
294
+ | type | 按钮类型 | _"cancel" \| "confirm"_ | - |
295
+
296
+ ### Picker.Column Props
297
+
298
+ | 参数 | 说明 | 类型 | 默认值 |
299
+ | -------- | -------- | ---------- | ------ |
300
+ | children | 一列选项 | _ReactNoe_ | - |
301
+
302
+ ### Picker.Option Props
303
+
304
+ | 参数 | 说明 | 类型 | 默认值 |
305
+ | -------- | ------------ | ---------- | ------- |
306
+ | children | 选项内容 | _ReactNoe_ | - |
307
+ | value | 选项对应的值 | _string_ | - |
308
+ | label | 选项内容 | _ReactNoe_ | - |
309
+ | disabled | 是否禁用选项 | _boolean_ | `false` |
310
+
311
+ ## 主题定制
312
+
313
+ ### 样式变量
314
+
315
+ 组件提供了下列 CSS 变量,可用于自定义样式,使用方法请参考 [ConfigProvider](/components/config-provider/) 组件。
316
+
317
+ | 名称 | 默认值 | 描述 |
318
+ | ------------------------------------------ | ----------------------------------------- | ---- |
319
+ | --picker-background-color | _var(--white)_ | - |
320
+ | --picker-toolbar-height | _44px \* $hd_ | - |
321
+ | --picker-title-font-size | _var(--font-size-lg)_ | - |
322
+ | --picker-title-line-height | _var(--line-height-md)_ | - |
323
+ | --picker-action-padding | _0 var(--padding-md)_ | - |
324
+ | --picker-action-font-size | _var(--font-size-md)_ | - |
325
+ | --picker-confirm-action-color | _var(--text-link-color)_ | - |
326
+ | --picker-cancel-action-color | _var(--gray-6)_ | - |
327
+ | --picker-swipe-transition-duration | _800ms_ | - |
328
+ | --picker-column-transition-zero-duration | _0_ | - |
329
+ | --picker-column-transition-switch-duration | _200ms_ | - |
330
+ | --picker-column-transition-duration | _var(--picker-swipe-transition-duration)_ | - |
331
+ | --picker-option-color | _var(--black)_ | - |
332
+ | --picker-option-padding | _0 var(--padding-base)_ | - |
333
+ | --picker-option-font-size | _var(--font-size-lg)_ | - |
334
+ | --picker-option-disabled-opacity | _0.3_ | - |
335
+ | --picker-loading-icon-color | _var(--primary-color)_ | - |
336
+ | --picker-loading-mask-color | _rgba(255, 255, 255, 0.9)_ | - |