Skip to content

Commit ed4a2a4

Browse files
authored
feat(OtpInput ): support responsive layout (#6284)
* refactor: 移动变量节点位置方便覆盖 * refactor: 更改样式名称纠正单词拼写错误 * doc: 更新样式
1 parent d4d76e4 commit ed4a2a4

File tree

7 files changed

+55
-41
lines changed

7 files changed

+55
-41
lines changed

src/BootstrapBlazor.Server/Components/Samples/OtpInputs.razor

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,11 @@
1010
.otp-input-demo {
1111
text-align: center;
1212
}
13+
14+
.otp-input-demo .bb-otp-input {
15+
--bb-otp-item-width: 32px;
16+
--bb-otp-font-size: 1.2em;
17+
}
1318
</style>
1419
</HeadContent>
1520

src/BootstrapBlazor.Server/Components/Samples/Tutorials/MFA/TwoFactorApp.razor.css

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
font-weight: 400;
3737
}
3838

39-
::deep .bb-opt-input .bb-opt-item {
40-
--bb-opt-item-width: 50px;
41-
--bb-opt-font-size: 2em;
39+
::deep .bb-otp-input .bb-otp-item {
40+
--bb-otp-item-width: 50px;
41+
--bb-otp-font-size: 2em;
4242
}

src/BootstrapBlazor/Components/Input/OtpInput.razor.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,11 @@ public partial class OtpInput
3535
[Parameter]
3636
public string? PlaceHolder { get; set; }
3737

38-
private string? ClassString => CssBuilder.Default("bb-opt-input")
38+
private string? ClassString => CssBuilder.Default("bb-otp-input")
3939
.AddClassFromAttributes(AdditionalAttributes)
4040
.Build();
4141

42-
private string? InputClassString => CssBuilder.Default("bb-opt-item")
42+
private string? InputClassString => CssBuilder.Default("bb-otp-item")
4343
.AddClass("input-number-fix", Type == OtpInputType.Number)
4444
.AddClass(ValidCss)
4545
.Build();

src/BootstrapBlazor/Components/Input/OtpInput.razor.js

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@
33
export function init(id, invoke, method) {
44
const el = document.getElementById(id);
55
const skipKeys = ['Enter', 'Tab', 'Shift', 'Control', 'Alt'];
6-
EventHandler.on(el, 'input', '.bb-opt-item', e => {
6+
EventHandler.on(el, 'input', '.bb-otp-item', e => {
77
const isNumber = e.target.getAttribute('type') === 'number';
88
if (isNumber && e.target.value.length > 1) {
99
e.target.value = e.target.value.slice(1, 2);
1010
}
1111
setValue(el, invoke, method);
1212
});
13-
EventHandler.on(el, 'keydown', '.bb-opt-item', e => {
13+
EventHandler.on(el, 'keydown', '.bb-otp-item', e => {
1414
if (e.ctrlKey) {
1515
return;
1616
}
@@ -40,7 +40,7 @@ export function init(id, invoke, method) {
4040
e.preventDefault();
4141
}
4242
});
43-
EventHandler.on(el, 'focus', '.bb-opt-item', e => {
43+
EventHandler.on(el, 'focus', '.bb-otp-item', e => {
4444
if (e.target.select) {
4545
e.target.select();
4646
}
@@ -49,7 +49,7 @@ export function init(id, invoke, method) {
4949
EventHandler.on(el, 'paste', e => {
5050
if (e.clipboardData && e.clipboardData.getData) {
5151
const pastedText = e.clipboardData.getData('text/plain');
52-
const inputs = [...el.querySelectorAll('.bb-opt-item')];
52+
const inputs = [...el.querySelectorAll('.bb-otp-item')];
5353
if (inputs.find(i => i.getAttribute('disabled') || i.getAttribute('readonly'))) {
5454
return;
5555
}
@@ -69,20 +69,20 @@ export function init(id, invoke, method) {
6969
}
7070

7171
const setValue = (el, invoke, method) => {
72-
const val = [...el.querySelectorAll('.bb-opt-item')].map(input => input.value).join('');
72+
const val = [...el.querySelectorAll('.bb-otp-item')].map(input => input.value).join('');
7373
invoke.invokeMethodAsync(method, val);
7474
}
7575

7676
const setPrevFocus = (el, target) => {
77-
const inputs = [...el.querySelectorAll('.bb-opt-item')];
77+
const inputs = [...el.querySelectorAll('.bb-otp-item')];
7878
let index = inputs.indexOf(target);
7979
if (index > 0) {
8080
setFocus(inputs[index - 1]);
8181
}
8282
}
8383

8484
const setNextFocus = (el, target) => {
85-
const inputs = [...el.querySelectorAll('.bb-opt-item')];
85+
const inputs = [...el.querySelectorAll('.bb-otp-item')];
8686
let index = inputs.indexOf(target);
8787
if (index < inputs.length - 1) {
8888
setFocus(inputs[index + 1]);
Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,24 @@
1-
.bb-opt-input {
1+
.bb-otp-input {
2+
--bb-otp-item-width: #{$bb-otp-item-width};
3+
--bb-otp-item-disabled-color: #{$bb-otp-item-disabled-color};
4+
--bb-otp-item-padding: #{$bb-otp-item-padding};
5+
--bb-otp-item-margin: #{$bb-otp-item-margin};
6+
--bb-otp-font-size: #{$bb-otp-font-size};
7+
--bb-otp-border-width: #{$bb-otp-border-width};
28
white-space: nowrap;
39
overflow: hidden;
410

5-
.bb-opt-item {
6-
--bb-opt-item-width: 66px;
7-
--bb-opt-item-disabled-color: #b8b8b8;
8-
--bb-opt-item-padding: #{$bb-opt-item-padding};
9-
--bb-opt-item-margin: #{$bb-opt-item-margin};
10-
--bb-opt-font-size: #{$bb-opt-font-size};
11-
--bb-opt-border-width: #{$bb-opt-border-width};
11+
.bb-otp-item {
1212
display: inline-block;
13-
border: var(--bb-opt-border-width) solid var(--bs-border-color);
14-
font-size: var(--bb-opt-font-size);
15-
padding: var(--bb-opt-item-padding);
13+
border: var(--bb-otp-border-width) solid var(--bs-border-color);
14+
font-size: var(--bb-otp-font-size);
15+
padding: var(--bb-otp-item-padding);
1616
border-radius: var(--bs-border-radius);
17-
width: var(--bb-opt-item-width);
18-
height: var(--bb-opt-item-width);
17+
width: var(--bb-otp-item-width);
18+
height: var(--bb-otp-item-width);
1919

2020
&:not(:last-child) {
21-
margin-right: var(--bb-opt-item-margin);
21+
margin-right: var(--bb-otp-item-margin);
2222
}
2323

2424
&[type] {
@@ -33,9 +33,16 @@
3333
&.is-invalid {
3434
--bs-border-color: var(--bs-danger);
3535
}
36+
37+
&span {
38+
color: var(--bb-otp-item-disabled-color);
39+
}
3640
}
41+
}
3742

38-
span.bb-opt-item {
39-
color: var(--bb-opt-item-disabled-color);
43+
@media (min-width: 768px) {
44+
.bb-otp-input {
45+
--bb-otp-item-width: 66px;
46+
--bb-otp-font-size: 3em;
4047
}
4148
}

src/BootstrapBlazor/wwwroot/scss/theme/bootstrapblazor.scss

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -315,10 +315,12 @@ $bb-viewer-border-radius: 50%;
315315
$bb-ip-cell-max-width: 30px;
316316

317317
// OptInput
318-
$bb-opt-item-padding: 0 .5em;
319-
$bb-opt-item-margin: .5rem;
320-
$bb-opt-font-size: 3em;
321-
$bb-opt-border-width: 1px;
318+
$bb-otp-item-width: 38px;
319+
$bb-otp-item-disabled-color: #b8b8b8;
320+
$bb-otp-item-padding: 0 .5em;
321+
$bb-otp-item-margin: .5rem;
322+
$bb-otp-font-size: 1.5em;
323+
$bb-otp-border-width: 1px;
322324

323325
// Layout
324326
$bb-layout-header-height: 50px;

test/UnitTest/Components/OtpInputTest.cs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public void OtpInput_Ok()
1919
pb.Add(a => a.Digits, 6);
2020
});
2121

22-
var items = cut.FindAll(".bb-opt-item");
22+
var items = cut.FindAll(".bb-otp-item");
2323
Assert.Equal(6, items.Count);
2424

2525
var item = items[0];
@@ -36,21 +36,21 @@ public void Readonly_Ok()
3636
pb.Add(a => a.IsReadonly, true);
3737
});
3838

39-
var item = cut.Find(".bb-opt-item");
39+
var item = cut.Find(".bb-otp-item");
4040
Assert.Contains("readonly=\"readonly\"", item.OuterHtml);
4141

4242
cut.SetParametersAndRender(pb =>
4343
{
4444
pb.Add(a => a.IsReadonly, false);
4545
});
46-
item = cut.Find(".bb-opt-item");
47-
Assert.Equal("<input type=\"number\" class=\"bb-opt-item input-number-fix\" inputmode=\"numeric\">", item.OuterHtml);
46+
item = cut.Find(".bb-otp-item");
47+
Assert.Equal("<input type=\"number\" class=\"bb-otp-item input-number-fix\" inputmode=\"numeric\">", item.OuterHtml);
4848

4949
cut.SetParametersAndRender(pb =>
5050
{
5151
pb.Add(a => a.IsDisabled, true);
5252
});
53-
item = cut.Find(".bb-opt-item");
53+
item = cut.Find(".bb-otp-item");
5454
Assert.Contains("disabled=\"disabled\"", item.OuterHtml);
5555
}
5656

@@ -63,16 +63,16 @@ public void Type_Ok()
6363
pb.Add(a => a.PlaceHolder, "X");
6464
});
6565

66-
var item = cut.Find(".bb-opt-item");
67-
Assert.Equal("<input type=\"text\" class=\"bb-opt-item\" maxlength=\"1\" placeholder=\"X\">", item.OuterHtml);
66+
var item = cut.Find(".bb-otp-item");
67+
Assert.Equal("<input type=\"text\" class=\"bb-otp-item\" maxlength=\"1\" placeholder=\"X\">", item.OuterHtml);
6868

6969
cut.SetParametersAndRender(pb =>
7070
{
7171
pb.Add(a => a.Type, OtpInputType.Password);
7272
pb.Add(a => a.PlaceHolder, null);
7373
});
74-
item = cut.Find(".bb-opt-item");
75-
Assert.Equal("<input type=\"password\" class=\"bb-opt-item\" maxlength=\"1\">", item.OuterHtml);
74+
item = cut.Find(".bb-otp-item");
75+
Assert.Equal("<input type=\"password\" class=\"bb-otp-item\" maxlength=\"1\">", item.OuterHtml);
7676
}
7777

7878
[Fact]

0 commit comments

Comments
 (0)