@tiny-design/react 1.0.11 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/es/auto-complete/index.js +9 -0
- package/es/auto-complete/index.js.map +1 -0
- package/es/date-picker/style/_index.scss +0 -1
- package/es/date-picker/style/index.css +0 -1
- package/es/index.d.ts +2 -1
- package/es/index.js +3 -2
- package/es/input-otp/index.d.ts +1 -0
- package/es/input-otp/index.js +9 -0
- package/es/input-otp/index.js.map +1 -0
- package/es/input-otp/input-otp.d.ts +13 -0
- package/es/input-otp/input-otp.js +128 -0
- package/es/input-otp/input-otp.js.map +1 -0
- package/es/input-otp/otp-input.js +60 -0
- package/es/input-otp/otp-input.js.map +1 -0
- package/es/input-otp/style/_index.scss +53 -0
- package/es/input-otp/style/index.css +71 -0
- package/es/input-otp/style/index.d.ts +1 -0
- package/es/input-otp/style/index.js +1 -0
- package/es/input-otp/types.d.ts +31 -0
- package/es/loader/style/_index.scss +3 -3
- package/es/loader/style/index.css +1 -3
- package/es/style/_component.scss +2 -1
- package/es/time-picker/style/_index.scss +0 -1
- package/es/time-picker/style/index.css +0 -1
- package/lib/auto-complete/index.js +8 -0
- package/lib/auto-complete/index.js.map +1 -0
- package/lib/date-picker/style/_index.scss +0 -1
- package/lib/date-picker/style/index.css +0 -1
- package/lib/index.d.ts +2 -1
- package/lib/index.js +152 -150
- package/lib/input-otp/index.js +8 -0
- package/lib/input-otp/index.js.map +1 -0
- package/lib/input-otp/input-otp.d.ts +13 -0
- package/lib/input-otp/input-otp.js +131 -0
- package/lib/input-otp/input-otp.js.map +1 -0
- package/lib/input-otp/otp-input.js +63 -0
- package/lib/input-otp/otp-input.js.map +1 -0
- package/lib/input-otp/style/_index.scss +53 -0
- package/lib/input-otp/style/index.css +71 -0
- package/lib/input-otp/style/index.d.ts +1 -0
- package/lib/input-otp/style/index.js +1 -0
- package/lib/input-otp/types.d.ts +31 -0
- package/lib/loader/style/_index.scss +3 -3
- package/lib/loader/style/index.css +1 -3
- package/lib/style/_component.scss +2 -1
- package/lib/time-picker/style/_index.scss +0 -1
- package/lib/time-picker/style/index.css +0 -1
- package/package.json +3 -3
package/lib/index.js
CHANGED
|
@@ -5,83 +5,84 @@ const require_index$1 = require("./alert/index.js");
|
|
|
5
5
|
const require_index$2 = require("./sticky/index.js");
|
|
6
6
|
const require_index$3 = require("./anchor/index.js");
|
|
7
7
|
const require_index$4 = require("./aspect-ratio/index.js");
|
|
8
|
-
const
|
|
9
|
-
const require_index$
|
|
10
|
-
const require_index$
|
|
11
|
-
const require_index$
|
|
12
|
-
const require_index$
|
|
13
|
-
const require_index$
|
|
8
|
+
const require_index$5 = require("./auto-complete/index.js");
|
|
9
|
+
const require_index$6 = require("./avatar/index.js");
|
|
10
|
+
const require_index$7 = require("./back-top/index.js");
|
|
11
|
+
const require_index$8 = require("./badge/index.js");
|
|
12
|
+
const require_index$9 = require("./breadcrumb/index.js");
|
|
13
|
+
const require_index$10 = require("./button/index.js");
|
|
14
14
|
const require_en_US = require("./locale/en_US.js");
|
|
15
15
|
const require_use_locale = require("./_utils/use-locale.js");
|
|
16
|
-
const require_index$
|
|
17
|
-
const require_index$
|
|
18
|
-
const require_index$
|
|
19
|
-
const require_index$
|
|
20
|
-
const require_index$
|
|
21
|
-
const require_index$
|
|
22
|
-
const require_index$
|
|
23
|
-
const require_index$
|
|
24
|
-
const require_index$
|
|
25
|
-
const require_index$
|
|
26
|
-
const require_index$
|
|
27
|
-
const require_index$
|
|
28
|
-
const require_index$
|
|
29
|
-
const require_index$
|
|
30
|
-
const require_index$
|
|
31
|
-
const require_index$
|
|
32
|
-
const require_index$
|
|
33
|
-
const require_index$
|
|
34
|
-
const require_index$
|
|
35
|
-
const require_index$
|
|
36
|
-
const require_index$
|
|
37
|
-
const require_index$
|
|
38
|
-
const require_index$
|
|
39
|
-
const require_index$
|
|
40
|
-
const require_index$
|
|
41
|
-
const require_index$
|
|
42
|
-
const require_index$
|
|
43
|
-
const require_index$
|
|
44
|
-
const require_index$
|
|
45
|
-
const require_index$
|
|
46
|
-
const require_index$
|
|
47
|
-
const require_index$
|
|
48
|
-
const require_index$
|
|
49
|
-
const require_index$
|
|
50
|
-
const require_index$
|
|
51
|
-
const require_index$
|
|
52
|
-
const require_index$
|
|
53
|
-
const require_index$
|
|
54
|
-
const require_index$
|
|
55
|
-
const require_index$
|
|
56
|
-
const require_index$
|
|
57
|
-
const require_index$
|
|
58
|
-
const require_index$
|
|
59
|
-
const require_index$
|
|
60
|
-
const require_index$
|
|
61
|
-
const require_index$
|
|
62
|
-
const require_index$
|
|
63
|
-
const require_index$
|
|
64
|
-
const require_index$
|
|
65
|
-
const require_index$
|
|
66
|
-
const require_index$
|
|
67
|
-
const require_index$
|
|
68
|
-
const require_index$
|
|
69
|
-
const require_index$
|
|
70
|
-
const require_index$
|
|
71
|
-
const require_index$
|
|
72
|
-
const require_index$
|
|
73
|
-
const require_index$
|
|
74
|
-
const require_index$
|
|
75
|
-
const require_index$
|
|
76
|
-
const require_index$
|
|
77
|
-
const require_index$
|
|
78
|
-
const require_index$
|
|
79
|
-
const require_index$
|
|
80
|
-
const require_index$
|
|
81
|
-
const require_index$
|
|
82
|
-
const require_index$
|
|
83
|
-
const require_index$
|
|
84
|
-
const require_index$
|
|
16
|
+
const require_index$11 = require("./calendar/index.js");
|
|
17
|
+
const require_index$12 = require("./card/index.js");
|
|
18
|
+
const require_index$13 = require("./carousel/index.js");
|
|
19
|
+
const require_index$14 = require("./cascader/index.js");
|
|
20
|
+
const require_index$15 = require("./checkbox/index.js");
|
|
21
|
+
const require_index$16 = require("./intl-provider/index.js");
|
|
22
|
+
const require_index$17 = require("./config-provider/index.js");
|
|
23
|
+
const require_index$18 = require("./copy-to-clipboard/index.js");
|
|
24
|
+
const require_index$19 = require("./col/index.js");
|
|
25
|
+
const require_index$20 = require("./collapse/index.js");
|
|
26
|
+
const require_index$21 = require("./color-picker/index.js");
|
|
27
|
+
const require_index$22 = require("./countdown/index.js");
|
|
28
|
+
const require_index$23 = require("./date-picker/index.js");
|
|
29
|
+
const require_index$24 = require("./descriptions/index.js");
|
|
30
|
+
const require_index$25 = require("./divider/index.js");
|
|
31
|
+
const require_index$26 = require("./dropdown/index.js");
|
|
32
|
+
const require_index$27 = require("./overlay/index.js");
|
|
33
|
+
const require_index$28 = require("./drawer/index.js");
|
|
34
|
+
const require_index$29 = require("./empty/index.js");
|
|
35
|
+
const require_index$30 = require("./flex/index.js");
|
|
36
|
+
const require_index$31 = require("./flip/index.js");
|
|
37
|
+
const require_index$32 = require("./form/index.js");
|
|
38
|
+
const require_index$33 = require("./image/index.js");
|
|
39
|
+
const require_index$34 = require("./input/index.js");
|
|
40
|
+
const require_index$35 = require("./input-number/index.js");
|
|
41
|
+
const require_index$36 = require("./input-otp/index.js");
|
|
42
|
+
const require_index$37 = require("./input-password/index.js");
|
|
43
|
+
const require_index$38 = require("./keyboard/index.js");
|
|
44
|
+
const require_index$39 = require("./layout/index.js");
|
|
45
|
+
const require_index$40 = require("./link/index.js");
|
|
46
|
+
const require_index$41 = require("./pagination/index.js");
|
|
47
|
+
const require_index$42 = require("./list/index.js");
|
|
48
|
+
const require_index$43 = require("./loader/index.js");
|
|
49
|
+
const require_index$44 = require("./loading-bar/index.js");
|
|
50
|
+
const require_index$45 = require("./menu/index.js");
|
|
51
|
+
const require_index$46 = require("./message/index.js");
|
|
52
|
+
const require_index$47 = require("./native-select/index.js");
|
|
53
|
+
const require_index$48 = require("./row/index.js");
|
|
54
|
+
const require_index$49 = require("./modal/index.js");
|
|
55
|
+
const require_index$50 = require("./notification/index.js");
|
|
56
|
+
const require_index$51 = require("./popover/index.js");
|
|
57
|
+
const require_index$52 = require("./pop-confirm/index.js");
|
|
58
|
+
const require_index$53 = require("./progress/index.js");
|
|
59
|
+
const require_index$54 = require("./radio/index.js");
|
|
60
|
+
const require_index$55 = require("./rate/index.js");
|
|
61
|
+
const require_index$56 = require("./result/index.js");
|
|
62
|
+
const require_index$57 = require("./scroll-indicator/index.js");
|
|
63
|
+
const require_index$58 = require("./segmented/index.js");
|
|
64
|
+
const require_index$59 = require("./select/index.js");
|
|
65
|
+
const require_index$60 = require("./skeleton/index.js");
|
|
66
|
+
const require_index$61 = require("./tooltip/index.js");
|
|
67
|
+
const require_index$62 = require("./slider/index.js");
|
|
68
|
+
const require_index$63 = require("./split/index.js");
|
|
69
|
+
const require_index$64 = require("./split-button/index.js");
|
|
70
|
+
const require_index$65 = require("./space/index.js");
|
|
71
|
+
const require_index$66 = require("./speed-dial/index.js");
|
|
72
|
+
const require_index$67 = require("./steps/index.js");
|
|
73
|
+
const require_index$68 = require("./statistic/index.js");
|
|
74
|
+
const require_index$69 = require("./strength-indicator/index.js");
|
|
75
|
+
const require_index$70 = require("./switch/index.js");
|
|
76
|
+
const require_index$71 = require("./table/index.js");
|
|
77
|
+
const require_index$72 = require("./tabs/index.js");
|
|
78
|
+
const require_index$73 = require("./tag/index.js");
|
|
79
|
+
const require_index$74 = require("./textarea/index.js");
|
|
80
|
+
const require_index$75 = require("./timeline/index.js");
|
|
81
|
+
const require_index$76 = require("./time-picker/index.js");
|
|
82
|
+
const require_index$77 = require("./transfer/index.js");
|
|
83
|
+
const require_index$78 = require("./tree/index.js");
|
|
84
|
+
const require_index$79 = require("./typography/index.js");
|
|
85
|
+
const require_index$80 = require("./upload/index.js");
|
|
85
86
|
const require_with_locale = require("./intl-provider/with-locale.js");
|
|
86
87
|
const require_with_spin = require("./with-spin/with-spin.js");
|
|
87
88
|
const require_zh_CN = require("./locale/zh_CN.js");
|
|
@@ -89,83 +90,84 @@ const require_use_theme = require("./_utils/use-theme.js");
|
|
|
89
90
|
exports.Alert = require_index$1;
|
|
90
91
|
exports.Anchor = require_index$3;
|
|
91
92
|
exports.AspectRatio = require_index$4;
|
|
92
|
-
exports.AutoComplete =
|
|
93
|
-
exports.Avatar = require_index$
|
|
94
|
-
exports.BackTop = require_index$
|
|
95
|
-
exports.Badge = require_index$
|
|
96
|
-
exports.Breadcrumb = require_index$
|
|
97
|
-
exports.Button = require_index$
|
|
98
|
-
exports.Calendar = require_index$
|
|
99
|
-
exports.Card = require_index$
|
|
100
|
-
exports.Carousel = require_index$
|
|
101
|
-
exports.Cascader = require_index$
|
|
102
|
-
exports.Checkbox = require_index$
|
|
103
|
-
exports.Col = require_index$
|
|
104
|
-
exports.Collapse = require_index$
|
|
105
|
-
exports.ColorPicker = require_index$
|
|
106
|
-
exports.ConfigProvider = require_index$
|
|
107
|
-
exports.CopyToClipboard = require_index$
|
|
108
|
-
exports.Countdown = require_index$
|
|
109
|
-
exports.DatePicker = require_index$
|
|
110
|
-
exports.Descriptions = require_index$
|
|
111
|
-
exports.Divider = require_index$
|
|
112
|
-
exports.Drawer = require_index$
|
|
113
|
-
exports.Dropdown = require_index$
|
|
114
|
-
exports.Empty = require_index$
|
|
115
|
-
exports.Flex = require_index$
|
|
116
|
-
exports.Flip = require_index$
|
|
117
|
-
exports.Form = require_index$
|
|
118
|
-
exports.Image = require_index$
|
|
119
|
-
exports.Input = require_index$
|
|
120
|
-
exports.InputNumber = require_index$
|
|
121
|
-
exports.
|
|
122
|
-
exports.
|
|
123
|
-
exports.
|
|
124
|
-
exports.
|
|
125
|
-
exports.
|
|
126
|
-
exports.
|
|
127
|
-
exports.
|
|
128
|
-
exports.
|
|
129
|
-
exports.
|
|
130
|
-
exports.
|
|
131
|
-
exports.
|
|
132
|
-
exports.
|
|
133
|
-
exports.
|
|
134
|
-
exports.
|
|
135
|
-
exports.
|
|
136
|
-
exports.
|
|
137
|
-
exports.
|
|
138
|
-
exports.
|
|
139
|
-
exports.
|
|
140
|
-
exports.
|
|
141
|
-
exports.
|
|
142
|
-
exports.
|
|
143
|
-
exports.
|
|
144
|
-
exports.
|
|
145
|
-
exports.
|
|
146
|
-
exports.
|
|
147
|
-
exports.
|
|
148
|
-
exports.
|
|
149
|
-
exports.
|
|
150
|
-
exports.
|
|
151
|
-
exports.
|
|
152
|
-
exports.
|
|
153
|
-
exports.
|
|
93
|
+
exports.AutoComplete = require_index$5;
|
|
94
|
+
exports.Avatar = require_index$6;
|
|
95
|
+
exports.BackTop = require_index$7;
|
|
96
|
+
exports.Badge = require_index$8;
|
|
97
|
+
exports.Breadcrumb = require_index$9;
|
|
98
|
+
exports.Button = require_index$10;
|
|
99
|
+
exports.Calendar = require_index$11;
|
|
100
|
+
exports.Card = require_index$12;
|
|
101
|
+
exports.Carousel = require_index$13;
|
|
102
|
+
exports.Cascader = require_index$14;
|
|
103
|
+
exports.Checkbox = require_index$15;
|
|
104
|
+
exports.Col = require_index$19;
|
|
105
|
+
exports.Collapse = require_index$20;
|
|
106
|
+
exports.ColorPicker = require_index$21;
|
|
107
|
+
exports.ConfigProvider = require_index$17;
|
|
108
|
+
exports.CopyToClipboard = require_index$18;
|
|
109
|
+
exports.Countdown = require_index$22;
|
|
110
|
+
exports.DatePicker = require_index$23;
|
|
111
|
+
exports.Descriptions = require_index$24;
|
|
112
|
+
exports.Divider = require_index$25;
|
|
113
|
+
exports.Drawer = require_index$28;
|
|
114
|
+
exports.Dropdown = require_index$26;
|
|
115
|
+
exports.Empty = require_index$29;
|
|
116
|
+
exports.Flex = require_index$30;
|
|
117
|
+
exports.Flip = require_index$31;
|
|
118
|
+
exports.Form = require_index$32;
|
|
119
|
+
exports.Image = require_index$33;
|
|
120
|
+
exports.Input = require_index$34;
|
|
121
|
+
exports.InputNumber = require_index$35;
|
|
122
|
+
exports.InputOTP = require_index$36;
|
|
123
|
+
exports.InputPassword = require_index$37;
|
|
124
|
+
exports.IntlProvider = require_index$16;
|
|
125
|
+
exports.Keyboard = require_index$38;
|
|
126
|
+
exports.Layout = require_index$39;
|
|
127
|
+
exports.Link = require_index$40;
|
|
128
|
+
exports.List = require_index$42;
|
|
129
|
+
exports.Loader = require_index$43;
|
|
130
|
+
exports.LoadingBar = require_index$44;
|
|
131
|
+
exports.Menu = require_index$45;
|
|
132
|
+
exports.Message = require_index$46;
|
|
133
|
+
exports.Modal = require_index$49;
|
|
134
|
+
exports.NativeSelect = require_index$47;
|
|
135
|
+
exports.Notification = require_index$50;
|
|
136
|
+
exports.Overlay = require_index$27;
|
|
137
|
+
exports.Pagination = require_index$41;
|
|
138
|
+
exports.PopConfirm = require_index$52;
|
|
139
|
+
exports.Popover = require_index$51;
|
|
140
|
+
exports.Progress = require_index$53;
|
|
141
|
+
exports.Radio = require_index$54;
|
|
142
|
+
exports.Rate = require_index$55;
|
|
143
|
+
exports.Result = require_index$56;
|
|
144
|
+
exports.Row = require_index$48;
|
|
145
|
+
exports.ScrollIndicator = require_index$57;
|
|
146
|
+
exports.Segmented = require_index$58;
|
|
147
|
+
exports.Select = require_index$59;
|
|
148
|
+
exports.Skeleton = require_index$60;
|
|
149
|
+
exports.Slider = require_index$62;
|
|
150
|
+
exports.Space = require_index$65;
|
|
151
|
+
exports.SpeedDial = require_index$66;
|
|
152
|
+
exports.Split = require_index$63;
|
|
153
|
+
exports.SplitButton = require_index$64;
|
|
154
|
+
exports.Statistic = require_index$68;
|
|
155
|
+
exports.Steps = require_index$67;
|
|
154
156
|
exports.Sticky = require_index$2;
|
|
155
|
-
exports.StrengthIndicator = require_index$
|
|
156
|
-
exports.Switch = require_index$
|
|
157
|
-
exports.Table = require_index$
|
|
158
|
-
exports.Tabs = require_index$
|
|
159
|
-
exports.Tag = require_index$
|
|
160
|
-
exports.Textarea = require_index$
|
|
161
|
-
exports.TimePicker = require_index$
|
|
162
|
-
exports.Timeline = require_index$
|
|
163
|
-
exports.Tooltip = require_index$
|
|
164
|
-
exports.Transfer = require_index$
|
|
157
|
+
exports.StrengthIndicator = require_index$69;
|
|
158
|
+
exports.Switch = require_index$70;
|
|
159
|
+
exports.Table = require_index$71;
|
|
160
|
+
exports.Tabs = require_index$72;
|
|
161
|
+
exports.Tag = require_index$73;
|
|
162
|
+
exports.Textarea = require_index$74;
|
|
163
|
+
exports.TimePicker = require_index$76;
|
|
164
|
+
exports.Timeline = require_index$75;
|
|
165
|
+
exports.Tooltip = require_index$61;
|
|
166
|
+
exports.Transfer = require_index$77;
|
|
165
167
|
exports.Transition = require_index;
|
|
166
|
-
exports.Tree = require_index$
|
|
167
|
-
exports.Typography = require_index$
|
|
168
|
-
exports.Upload = require_index$
|
|
168
|
+
exports.Tree = require_index$78;
|
|
169
|
+
exports.Typography = require_index$79;
|
|
170
|
+
exports.Upload = require_index$80;
|
|
169
171
|
exports.en_US = require_en_US;
|
|
170
172
|
exports.useLocale = require_use_locale.useLocale;
|
|
171
173
|
exports.useTheme = require_use_theme.useTheme;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["InputOTP"],"sources":["../../src/input-otp/index.tsx"],"sourcesContent":["import InputOTP from './input-otp';\n\nexport default InputOTP;\n"],"mappings":";AAEA,IAAA,8CAAeA"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { InputOTPProps } from "./types.js";
|
|
2
|
+
import React from "react";
|
|
3
|
+
|
|
4
|
+
//#region src/input-otp/input-otp.d.ts
|
|
5
|
+
interface InputOTPRef {
|
|
6
|
+
focus: () => void;
|
|
7
|
+
blur: () => void;
|
|
8
|
+
nativeElement: HTMLDivElement | null;
|
|
9
|
+
}
|
|
10
|
+
declare const InputOTP: React.ForwardRefExoticComponent<InputOTPProps & React.RefAttributes<InputOTPRef>>;
|
|
11
|
+
//#endregion
|
|
12
|
+
export { InputOTP };
|
|
13
|
+
//# sourceMappingURL=input-otp.d.ts.map
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
const require_runtime = require("../_virtual/_rolldown/runtime.js");
|
|
2
|
+
const require_config_context = require("../config-provider/config-context.js");
|
|
3
|
+
const require_general = require("../_utils/general.js");
|
|
4
|
+
const require_otp_input = require("./otp-input.js");
|
|
5
|
+
let react = require("react");
|
|
6
|
+
react = require_runtime.__toESM(react);
|
|
7
|
+
let classnames = require("classnames");
|
|
8
|
+
classnames = require_runtime.__toESM(classnames);
|
|
9
|
+
let react_jsx_runtime = require("react/jsx-runtime");
|
|
10
|
+
//#region src/input-otp/input-otp.tsx
|
|
11
|
+
function strToArr(str) {
|
|
12
|
+
return (str || "").split("");
|
|
13
|
+
}
|
|
14
|
+
const InputOTP = react.default.forwardRef((props, ref) => {
|
|
15
|
+
const { length = 6, size = "md", defaultValue, value, onChange, formatter, separator, disabled = false, mask, autoFocus, autoComplete, className, style, prefixCls: customisedCls, onFocus, ...otherProps } = props;
|
|
16
|
+
const configContext = (0, react.useContext)(require_config_context.ConfigContext);
|
|
17
|
+
const prefixCls = require_general.getPrefixCls("input-otp", configContext.prefixCls, customisedCls);
|
|
18
|
+
const inputSize = size || configContext.componentSize || "md";
|
|
19
|
+
const containerRef = (0, react.useRef)(null);
|
|
20
|
+
const inputsRef = (0, react.useRef)({});
|
|
21
|
+
const internalFormatter = (0, react.useCallback)((txt) => formatter ? formatter(txt) : txt, [formatter]);
|
|
22
|
+
const [valueCells, setValueCells] = (0, react.useState)(() => strToArr(internalFormatter(defaultValue || "")));
|
|
23
|
+
(0, react.useEffect)(() => {
|
|
24
|
+
if (value !== void 0) setValueCells(strToArr(value));
|
|
25
|
+
}, [value]);
|
|
26
|
+
react.default.useImperativeHandle(ref, () => ({
|
|
27
|
+
focus: () => {
|
|
28
|
+
let nextIndex = 0;
|
|
29
|
+
for (let i = 0; i < length; i += 1) {
|
|
30
|
+
if (!inputsRef.current[i]?.value) {
|
|
31
|
+
nextIndex = i;
|
|
32
|
+
break;
|
|
33
|
+
}
|
|
34
|
+
nextIndex = i;
|
|
35
|
+
}
|
|
36
|
+
inputsRef.current[nextIndex]?.focus();
|
|
37
|
+
},
|
|
38
|
+
blur: () => {
|
|
39
|
+
for (let i = 0; i < length; i += 1) inputsRef.current[i]?.blur();
|
|
40
|
+
},
|
|
41
|
+
nativeElement: containerRef.current
|
|
42
|
+
}));
|
|
43
|
+
const triggerValueCellsChange = (0, react.useCallback)((nextValueCells) => {
|
|
44
|
+
setValueCells((prev) => {
|
|
45
|
+
const prevValue = prev.join("");
|
|
46
|
+
const nextValue = nextValueCells.join("");
|
|
47
|
+
if (onChange && prevValue !== nextValue) onChange(nextValue);
|
|
48
|
+
return nextValueCells;
|
|
49
|
+
});
|
|
50
|
+
}, [onChange]);
|
|
51
|
+
const patchValue = (0, react.useCallback)((index, txt) => {
|
|
52
|
+
let nextCells = [...valueCells];
|
|
53
|
+
for (let i = 0; i < index; i += 1) if (!nextCells[i]) nextCells[i] = "";
|
|
54
|
+
if (txt.length <= 1) nextCells[index] = txt;
|
|
55
|
+
else nextCells = nextCells.slice(0, index).concat(strToArr(txt));
|
|
56
|
+
nextCells = nextCells.slice(0, length);
|
|
57
|
+
for (let i = nextCells.length - 1; i >= 0; i -= 1) {
|
|
58
|
+
if (nextCells[i]) break;
|
|
59
|
+
nextCells.pop();
|
|
60
|
+
}
|
|
61
|
+
nextCells = strToArr(internalFormatter(nextCells.map((c) => c || " ").join(""))).map((c, i) => {
|
|
62
|
+
if (c === " " && !nextCells[i]) return nextCells[i];
|
|
63
|
+
return c;
|
|
64
|
+
});
|
|
65
|
+
return nextCells;
|
|
66
|
+
}, [
|
|
67
|
+
valueCells,
|
|
68
|
+
length,
|
|
69
|
+
internalFormatter
|
|
70
|
+
]);
|
|
71
|
+
const onInputChange = (0, react.useCallback)((index, txt) => {
|
|
72
|
+
const nextCells = patchValue(index, txt);
|
|
73
|
+
const nextIndex = Math.min(index + txt.length, length - 1);
|
|
74
|
+
if (nextIndex !== index && nextCells[index] !== void 0) inputsRef.current[nextIndex]?.focus();
|
|
75
|
+
triggerValueCellsChange(nextCells);
|
|
76
|
+
}, [
|
|
77
|
+
patchValue,
|
|
78
|
+
length,
|
|
79
|
+
triggerValueCellsChange
|
|
80
|
+
]);
|
|
81
|
+
const onInputActiveChange = (0, react.useCallback)((nextIndex) => {
|
|
82
|
+
const clampedIndex = Math.max(0, Math.min(nextIndex, length - 1));
|
|
83
|
+
inputsRef.current[clampedIndex]?.focus();
|
|
84
|
+
}, [length]);
|
|
85
|
+
const onInputFocus = (0, react.useCallback)((event, index) => {
|
|
86
|
+
if (onFocus) onFocus(event);
|
|
87
|
+
}, [onFocus]);
|
|
88
|
+
const renderSeparator = (0, react.useMemo)(() => {
|
|
89
|
+
if (!separator) return null;
|
|
90
|
+
return (index) => {
|
|
91
|
+
const separatorNode = typeof separator === "function" ? separator(index) : separator;
|
|
92
|
+
if (!separatorNode) return null;
|
|
93
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
94
|
+
className: `${prefixCls}__separator`,
|
|
95
|
+
children: separatorNode
|
|
96
|
+
});
|
|
97
|
+
};
|
|
98
|
+
}, [separator, prefixCls]);
|
|
99
|
+
const cls = (0, classnames.default)(prefixCls, className, `${prefixCls}_${inputSize}`, { [`${prefixCls}_disabled`]: disabled });
|
|
100
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
101
|
+
...otherProps,
|
|
102
|
+
ref: containerRef,
|
|
103
|
+
className: cls,
|
|
104
|
+
style,
|
|
105
|
+
role: "group",
|
|
106
|
+
children: Array.from({ length }).map((_, index) => {
|
|
107
|
+
const singleValue = valueCells[index] || "";
|
|
108
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react.default.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_otp_input.default, {
|
|
109
|
+
ref: (el) => {
|
|
110
|
+
inputsRef.current[index] = el;
|
|
111
|
+
},
|
|
112
|
+
index,
|
|
113
|
+
size: inputSize,
|
|
114
|
+
prefixCls,
|
|
115
|
+
value: singleValue,
|
|
116
|
+
disabled,
|
|
117
|
+
mask,
|
|
118
|
+
autoFocus: index === 0 && autoFocus,
|
|
119
|
+
autoComplete,
|
|
120
|
+
onChange: onInputChange,
|
|
121
|
+
onActiveChange: onInputActiveChange,
|
|
122
|
+
onFocus: (e) => onInputFocus(e, index)
|
|
123
|
+
}), index < length - 1 && renderSeparator?.(index)] }, `otp-${index}`);
|
|
124
|
+
})
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
InputOTP.displayName = "InputOTP";
|
|
128
|
+
//#endregion
|
|
129
|
+
exports.default = InputOTP;
|
|
130
|
+
|
|
131
|
+
//# sourceMappingURL=input-otp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input-otp.js","names":["React","ConfigContext","getPrefixCls","OTPInput"],"sources":["../../src/input-otp/input-otp.tsx"],"sourcesContent":["import React, { useRef, useState, useEffect, useContext, useCallback, useMemo } from 'react';\nimport classNames from 'classnames';\nimport { ConfigContext } from '../config-provider/config-context';\nimport { getPrefixCls } from '../_utils/general';\nimport { InputOTPProps } from './types';\nimport OTPInput from './otp-input';\n\nfunction strToArr(str: string): string[] {\n return (str || '').split('');\n}\n\nexport interface InputOTPRef {\n focus: () => void;\n blur: () => void;\n nativeElement: HTMLDivElement | null;\n}\n\nconst InputOTP = React.forwardRef<InputOTPRef, InputOTPProps>(\n (props, ref) => {\n const {\n length = 6,\n size = 'md',\n defaultValue,\n value,\n onChange,\n formatter,\n separator,\n disabled = false,\n mask,\n autoFocus,\n autoComplete,\n className,\n style,\n prefixCls: customisedCls,\n onFocus,\n ...otherProps\n } = props;\n\n const configContext = useContext(ConfigContext);\n const prefixCls = getPrefixCls('input-otp', configContext.prefixCls, customisedCls);\n const inputSize = size || configContext.componentSize || 'md';\n\n const containerRef = useRef<HTMLDivElement>(null);\n const inputsRef = useRef<Record<number, HTMLInputElement | null>>({});\n\n // Formatter helper\n const internalFormatter = useCallback(\n (txt: string) => (formatter ? formatter(txt) : txt),\n [formatter]\n );\n\n // Value state\n const [valueCells, setValueCells] = useState<string[]>(() =>\n strToArr(internalFormatter(defaultValue || ''))\n );\n\n useEffect(() => {\n if (value !== undefined) {\n setValueCells(strToArr(value));\n }\n }, [value]);\n\n // Imperative handle\n React.useImperativeHandle(ref, () => ({\n focus: () => {\n // Focus first empty cell (or last cell if all filled)\n let nextIndex = 0;\n for (let i = 0; i < length; i += 1) {\n if (!inputsRef.current[i]?.value) {\n nextIndex = i;\n break;\n }\n nextIndex = i;\n }\n inputsRef.current[nextIndex]?.focus();\n },\n blur: () => {\n for (let i = 0; i < length; i += 1) {\n inputsRef.current[i]?.blur();\n }\n },\n nativeElement: containerRef.current,\n }));\n\n // Trigger onChange when value cells change\n const triggerValueCellsChange = useCallback(\n (nextValueCells: string[]) => {\n setValueCells((prev) => {\n const prevValue = prev.join('');\n const nextValue = nextValueCells.join('');\n if (onChange && prevValue !== nextValue) {\n onChange(nextValue);\n }\n return nextValueCells;\n });\n },\n [onChange]\n );\n\n // Patch value at given index\n const patchValue = useCallback(\n (index: number, txt: string) => {\n let nextCells = [...valueCells];\n\n // Fill cells till index\n for (let i = 0; i < index; i += 1) {\n if (!nextCells[i]) {\n nextCells[i] = '';\n }\n }\n\n if (txt.length <= 1) {\n nextCells[index] = txt;\n } else {\n nextCells = nextCells.slice(0, index).concat(strToArr(txt));\n }\n nextCells = nextCells.slice(0, length);\n\n // Clean trailing empty cells\n for (let i = nextCells.length - 1; i >= 0; i -= 1) {\n if (nextCells[i]) {\n break;\n }\n nextCells.pop();\n }\n\n // Format if needed\n const formattedValue = internalFormatter(\n nextCells.map((c) => c || ' ').join('')\n );\n nextCells = strToArr(formattedValue).map((c, i) => {\n if (c === ' ' && !nextCells[i]) {\n return nextCells[i];\n }\n return c;\n });\n\n return nextCells;\n },\n [valueCells, length, internalFormatter]\n );\n\n // Handle input change\n const onInputChange = useCallback(\n (index: number, txt: string) => {\n const nextCells = patchValue(index, txt);\n const nextIndex = Math.min(index + txt.length, length - 1);\n if (nextIndex !== index && nextCells[index] !== undefined) {\n inputsRef.current[nextIndex]?.focus();\n }\n triggerValueCellsChange(nextCells);\n },\n [patchValue, length, triggerValueCellsChange]\n );\n\n // Handle active change (arrow keys, backspace)\n const onInputActiveChange = useCallback(\n (nextIndex: number) => {\n const clampedIndex = Math.max(0, Math.min(nextIndex, length - 1));\n inputsRef.current[clampedIndex]?.focus();\n },\n [length]\n );\n\n // Handle focus — keep focus on the interacted cell\n const onInputFocus = useCallback(\n (event: React.FocusEvent<HTMLInputElement>, index: number) => {\n if (onFocus) {\n (onFocus as React.FocusEventHandler<HTMLDivElement>)(event as unknown as React.FocusEvent<HTMLDivElement>);\n }\n },\n [onFocus]\n );\n\n // Render separator\n const renderSeparator = useMemo(() => {\n if (!separator) return null;\n return (index: number) => {\n const separatorNode =\n typeof separator === 'function' ? separator(index) : separator;\n if (!separatorNode) return null;\n return (\n <span className={`${prefixCls}__separator`}>\n {separatorNode}\n </span>\n );\n };\n }, [separator, prefixCls]);\n\n const cls = classNames(prefixCls, className, `${prefixCls}_${inputSize}`, {\n [`${prefixCls}_disabled`]: disabled,\n });\n\n return (\n <div\n {...otherProps}\n ref={containerRef}\n className={cls}\n style={style}\n role=\"group\"\n >\n {Array.from({ length }).map((_, index) => {\n const singleValue = valueCells[index] || '';\n return (\n <React.Fragment key={`otp-${index}`}>\n <OTPInput\n ref={(el) => {\n inputsRef.current[index] = el;\n }}\n index={index}\n size={inputSize}\n prefixCls={prefixCls}\n value={singleValue}\n disabled={disabled}\n mask={mask}\n autoFocus={index === 0 && autoFocus}\n autoComplete={autoComplete}\n onChange={onInputChange}\n onActiveChange={onInputActiveChange}\n onFocus={(e) => onInputFocus(e, index)}\n />\n {index < length - 1 && renderSeparator?.(index)}\n </React.Fragment>\n );\n })}\n </div>\n );\n }\n);\n\nInputOTP.displayName = 'InputOTP';\n\nexport default InputOTP;\n"],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
const require_runtime = require("../_virtual/_rolldown/runtime.js");
|
|
2
|
+
let react = require("react");
|
|
3
|
+
react = require_runtime.__toESM(react);
|
|
4
|
+
let classnames = require("classnames");
|
|
5
|
+
classnames = require_runtime.__toESM(classnames);
|
|
6
|
+
let react_jsx_runtime = require("react/jsx-runtime");
|
|
7
|
+
//#region src/input-otp/otp-input.tsx
|
|
8
|
+
const OTPInput = react.default.forwardRef((props, ref) => {
|
|
9
|
+
const { index, value, disabled, mask, size = "md", autoFocus, autoComplete, prefixCls, onChange, onActiveChange, onFocus } = props;
|
|
10
|
+
const inputRef = (0, react.useRef)(null);
|
|
11
|
+
const setRef = (0, react.useCallback)((el) => {
|
|
12
|
+
inputRef.current = el;
|
|
13
|
+
if (typeof ref === "function") ref(el);
|
|
14
|
+
else if (ref) ref.current = el;
|
|
15
|
+
}, [ref]);
|
|
16
|
+
const syncSelection = (0, react.useCallback)(() => {
|
|
17
|
+
requestAnimationFrame(() => {
|
|
18
|
+
const inputEle = inputRef.current;
|
|
19
|
+
if (document.activeElement === inputEle && inputEle) inputEle.select();
|
|
20
|
+
});
|
|
21
|
+
}, []);
|
|
22
|
+
const onInternalInput = (e) => {
|
|
23
|
+
onChange(index, e.target.value);
|
|
24
|
+
};
|
|
25
|
+
const onInternalFocus = (e) => {
|
|
26
|
+
onFocus?.(e);
|
|
27
|
+
syncSelection();
|
|
28
|
+
};
|
|
29
|
+
const onInternalKeyDown = (event) => {
|
|
30
|
+
const { key, ctrlKey, metaKey } = event;
|
|
31
|
+
if (key === "ArrowLeft") onActiveChange(index - 1);
|
|
32
|
+
else if (key === "ArrowRight") onActiveChange(index + 1);
|
|
33
|
+
else if (key === "z" && (ctrlKey || metaKey)) event.preventDefault();
|
|
34
|
+
else if (key === "Backspace" && !value) onActiveChange(index - 1);
|
|
35
|
+
syncSelection();
|
|
36
|
+
};
|
|
37
|
+
const displayValue = mask && typeof mask === "string" && value ? mask : value;
|
|
38
|
+
const inputType = mask === true ? "password" : "text";
|
|
39
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
|
|
40
|
+
ref: setRef,
|
|
41
|
+
"aria-label": `OTP Input ${index + 1}`,
|
|
42
|
+
type: inputType,
|
|
43
|
+
inputMode: "numeric",
|
|
44
|
+
autoComplete: autoComplete || "one-time-code",
|
|
45
|
+
className: (0, classnames.default)(`${prefixCls}__cell`, `${prefixCls}__cell_${size}`, {
|
|
46
|
+
[`${prefixCls}__cell_disabled`]: disabled,
|
|
47
|
+
[`${prefixCls}__cell_mask`]: mask
|
|
48
|
+
}),
|
|
49
|
+
value: displayValue,
|
|
50
|
+
disabled,
|
|
51
|
+
autoFocus,
|
|
52
|
+
onInput: onInternalInput,
|
|
53
|
+
onFocus: onInternalFocus,
|
|
54
|
+
onKeyDown: onInternalKeyDown,
|
|
55
|
+
onMouseDown: syncSelection,
|
|
56
|
+
onMouseUp: syncSelection
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
OTPInput.displayName = "OTPInput";
|
|
60
|
+
//#endregion
|
|
61
|
+
exports.default = OTPInput;
|
|
62
|
+
|
|
63
|
+
//# sourceMappingURL=otp-input.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"otp-input.js","names":["React"],"sources":["../../src/input-otp/otp-input.tsx"],"sourcesContent":["import React, { useRef, useCallback } from 'react';\nimport classNames from 'classnames';\nimport { OTPInputCellProps } from './types';\n\nconst OTPInput = React.forwardRef<HTMLInputElement, OTPInputCellProps>(\n (props, ref) => {\n const {\n index,\n value,\n disabled,\n mask,\n size = 'md',\n autoFocus,\n autoComplete,\n prefixCls,\n onChange,\n onActiveChange,\n onFocus,\n } = props;\n\n const inputRef = useRef<HTMLInputElement | null>(null);\n\n // Merge refs\n const setRef = useCallback(\n (el: HTMLInputElement | null) => {\n inputRef.current = el;\n if (typeof ref === 'function') {\n ref(el);\n } else if (ref) {\n (ref as React.MutableRefObject<HTMLInputElement | null>).current = el;\n }\n },\n [ref]\n );\n\n const syncSelection = useCallback(() => {\n requestAnimationFrame(() => {\n const inputEle = inputRef.current;\n if (document.activeElement === inputEle && inputEle) {\n inputEle.select();\n }\n });\n }, []);\n\n const onInternalInput = (e: React.FormEvent<HTMLInputElement>): void => {\n onChange(index, (e.target as HTMLInputElement).value);\n };\n\n const onInternalFocus: React.FocusEventHandler<HTMLInputElement> = (e) => {\n onFocus?.(e);\n syncSelection();\n };\n\n const onInternalKeyDown: React.KeyboardEventHandler<HTMLInputElement> = (event) => {\n const { key, ctrlKey, metaKey } = event;\n\n if (key === 'ArrowLeft') {\n onActiveChange(index - 1);\n } else if (key === 'ArrowRight') {\n onActiveChange(index + 1);\n } else if (key === 'z' && (ctrlKey || metaKey)) {\n event.preventDefault();\n } else if (key === 'Backspace' && !value) {\n onActiveChange(index - 1);\n }\n\n syncSelection();\n };\n\n const displayValue = mask && typeof mask === 'string' && value ? mask : value;\n const inputType = mask === true ? 'password' : 'text';\n\n return (\n <input\n ref={setRef}\n aria-label={`OTP Input ${index + 1}`}\n type={inputType}\n inputMode=\"numeric\"\n autoComplete={autoComplete || 'one-time-code'}\n className={classNames(`${prefixCls}__cell`, `${prefixCls}__cell_${size}`, {\n [`${prefixCls}__cell_disabled`]: disabled,\n [`${prefixCls}__cell_mask`]: mask,\n })}\n value={displayValue}\n disabled={disabled}\n autoFocus={autoFocus}\n onInput={onInternalInput}\n onFocus={onInternalFocus}\n onKeyDown={onInternalKeyDown}\n onMouseDown={syncSelection}\n onMouseUp={syncSelection}\n />\n );\n }\n);\n\nOTPInput.displayName = 'OTPInput';\n\nexport default OTPInput;\n"],"mappings":";;;;;;;AAIA,MAAM,WAAWA,MAAAA,QAAM,YACpB,OAAO,QAAQ;CACd,MAAM,EACJ,OACA,OACA,UACA,MACA,OAAO,MACP,WACA,cACA,WACA,UACA,gBACA,YACE;CAEJ,MAAM,YAAA,GAAA,MAAA,QAA2C,KAAK;CAGtD,MAAM,UAAA,GAAA,MAAA,cACH,OAAgC;AAC/B,WAAS,UAAU;AACnB,MAAI,OAAO,QAAQ,WACjB,KAAI,GAAG;WACE,IACR,KAAwD,UAAU;IAGvE,CAAC,IAAI,CACN;CAED,MAAM,iBAAA,GAAA,MAAA,mBAAkC;AACtC,8BAA4B;GAC1B,MAAM,WAAW,SAAS;AAC1B,OAAI,SAAS,kBAAkB,YAAY,SACzC,UAAS,QAAQ;IAEnB;IACD,EAAE,CAAC;CAEN,MAAM,mBAAmB,MAA+C;AACtE,WAAS,OAAQ,EAAE,OAA4B,MAAM;;CAGvD,MAAM,mBAA8D,MAAM;AACxE,YAAU,EAAE;AACZ,iBAAe;;CAGjB,MAAM,qBAAmE,UAAU;EACjF,MAAM,EAAE,KAAK,SAAS,YAAY;AAElC,MAAI,QAAQ,YACV,gBAAe,QAAQ,EAAE;WAChB,QAAQ,aACjB,gBAAe,QAAQ,EAAE;WAChB,QAAQ,QAAQ,WAAW,SACpC,OAAM,gBAAgB;WACb,QAAQ,eAAe,CAAC,MACjC,gBAAe,QAAQ,EAAE;AAG3B,iBAAe;;CAGjB,MAAM,eAAe,QAAQ,OAAO,SAAS,YAAY,QAAQ,OAAO;CACxE,MAAM,YAAY,SAAS,OAAO,aAAa;AAE/C,QACE,iBAAA,GAAA,kBAAA,KAAC,SAAD;EACE,KAAK;EACL,cAAY,aAAa,QAAQ;EACjC,MAAM;EACN,WAAU;EACV,cAAc,gBAAgB;EAC9B,YAAA,GAAA,WAAA,SAAsB,GAAG,UAAU,SAAS,GAAG,UAAU,SAAS,QAAQ;IACvE,GAAG,UAAU,mBAAmB;IAChC,GAAG,UAAU,eAAe;GAC9B,CAAC;EACF,OAAO;EACG;EACC;EACX,SAAS;EACT,SAAS;EACT,WAAW;EACX,aAAa;EACb,WAAW;EACX,CAAA;EAGP;AAED,SAAS,cAAc"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
@use '../../style/variables' as *;
|
|
2
|
+
@use '../../input/style/mixin' as *;
|
|
3
|
+
|
|
4
|
+
.#{$prefix}-input-otp {
|
|
5
|
+
display: inline-flex;
|
|
6
|
+
align-items: center;
|
|
7
|
+
gap: 8px;
|
|
8
|
+
|
|
9
|
+
&__cell {
|
|
10
|
+
@include input-default;
|
|
11
|
+
|
|
12
|
+
width: 36px;
|
|
13
|
+
height: 36px;
|
|
14
|
+
text-align: center;
|
|
15
|
+
padding: 0;
|
|
16
|
+
font-size: $input-md-font-size;
|
|
17
|
+
border-radius: $input-border-radius;
|
|
18
|
+
caret-color: currentcolor;
|
|
19
|
+
|
|
20
|
+
&_sm {
|
|
21
|
+
width: 28px;
|
|
22
|
+
height: 28px;
|
|
23
|
+
font-size: $input-sm-font-size;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
&_md {
|
|
27
|
+
width: 36px;
|
|
28
|
+
height: 36px;
|
|
29
|
+
font-size: $input-md-font-size;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
&_lg {
|
|
33
|
+
width: 44px;
|
|
34
|
+
height: 44px;
|
|
35
|
+
font-size: $input-lg-font-size;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
&_disabled {
|
|
39
|
+
@include input-default-disabled;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
&__separator {
|
|
44
|
+
display: inline-flex;
|
|
45
|
+
align-items: center;
|
|
46
|
+
color: var(--ty-color-text-secondary);
|
|
47
|
+
font-size: $font-size-base;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
&_disabled {
|
|
51
|
+
cursor: not-allowed;
|
|
52
|
+
}
|
|
53
|
+
}
|