diff --git a/src/BootstrapBlazor.Server/Components/Samples/OtpInputs.razor b/src/BootstrapBlazor.Server/Components/Samples/OtpInputs.razor index d11cf344841..edd6a0722fd 100644 --- a/src/BootstrapBlazor.Server/Components/Samples/OtpInputs.razor +++ b/src/BootstrapBlazor.Server/Components/Samples/OtpInputs.razor @@ -10,6 +10,11 @@ .otp-input-demo { text-align: center; } + + .otp-input-demo .bb-otp-input { + --bb-otp-item-width: 32px; + --bb-otp-font-size: 1.2em; + } diff --git a/src/BootstrapBlazor.Server/Components/Samples/Tutorials/MFA/TwoFactorApp.razor.css b/src/BootstrapBlazor.Server/Components/Samples/Tutorials/MFA/TwoFactorApp.razor.css index 19bf25fc0f6..2e1798c8048 100644 --- a/src/BootstrapBlazor.Server/Components/Samples/Tutorials/MFA/TwoFactorApp.razor.css +++ b/src/BootstrapBlazor.Server/Components/Samples/Tutorials/MFA/TwoFactorApp.razor.css @@ -36,7 +36,7 @@ font-weight: 400; } -::deep .bb-opt-input .bb-opt-item { - --bb-opt-item-width: 50px; - --bb-opt-font-size: 2em; +::deep .bb-otp-input .bb-otp-item { + --bb-otp-item-width: 50px; + --bb-otp-font-size: 2em; } diff --git a/src/BootstrapBlazor/Components/Input/OtpInput.razor.cs b/src/BootstrapBlazor/Components/Input/OtpInput.razor.cs index 8c77af39509..525cf7e743e 100644 --- a/src/BootstrapBlazor/Components/Input/OtpInput.razor.cs +++ b/src/BootstrapBlazor/Components/Input/OtpInput.razor.cs @@ -35,11 +35,11 @@ public partial class OtpInput [Parameter] public string? PlaceHolder { get; set; } - private string? ClassString => CssBuilder.Default("bb-opt-input") + private string? ClassString => CssBuilder.Default("bb-otp-input") .AddClassFromAttributes(AdditionalAttributes) .Build(); - private string? InputClassString => CssBuilder.Default("bb-opt-item") + private string? InputClassString => CssBuilder.Default("bb-otp-item") .AddClass("input-number-fix", Type == OtpInputType.Number) .AddClass(ValidCss) .Build(); diff --git a/src/BootstrapBlazor/Components/Input/OtpInput.razor.js b/src/BootstrapBlazor/Components/Input/OtpInput.razor.js index a71c14bc08b..a6df921500a 100644 --- a/src/BootstrapBlazor/Components/Input/OtpInput.razor.js +++ b/src/BootstrapBlazor/Components/Input/OtpInput.razor.js @@ -3,14 +3,14 @@ export function init(id, invoke, method) { const el = document.getElementById(id); const skipKeys = ['Enter', 'Tab', 'Shift', 'Control', 'Alt']; - EventHandler.on(el, 'input', '.bb-opt-item', e => { + EventHandler.on(el, 'input', '.bb-otp-item', e => { const isNumber = e.target.getAttribute('type') === 'number'; if (isNumber && e.target.value.length > 1) { e.target.value = e.target.value.slice(1, 2); } setValue(el, invoke, method); }); - EventHandler.on(el, 'keydown', '.bb-opt-item', e => { + EventHandler.on(el, 'keydown', '.bb-otp-item', e => { if (e.ctrlKey) { return; } @@ -40,7 +40,7 @@ export function init(id, invoke, method) { e.preventDefault(); } }); - EventHandler.on(el, 'focus', '.bb-opt-item', e => { + EventHandler.on(el, 'focus', '.bb-otp-item', e => { if (e.target.select) { e.target.select(); } @@ -49,7 +49,7 @@ export function init(id, invoke, method) { EventHandler.on(el, 'paste', e => { if (e.clipboardData && e.clipboardData.getData) { const pastedText = e.clipboardData.getData('text/plain'); - const inputs = [...el.querySelectorAll('.bb-opt-item')]; + const inputs = [...el.querySelectorAll('.bb-otp-item')]; if (inputs.find(i => i.getAttribute('disabled') || i.getAttribute('readonly'))) { return; } @@ -69,12 +69,12 @@ export function init(id, invoke, method) { } const setValue = (el, invoke, method) => { - const val = [...el.querySelectorAll('.bb-opt-item')].map(input => input.value).join(''); + const val = [...el.querySelectorAll('.bb-otp-item')].map(input => input.value).join(''); invoke.invokeMethodAsync(method, val); } const setPrevFocus = (el, target) => { - const inputs = [...el.querySelectorAll('.bb-opt-item')]; + const inputs = [...el.querySelectorAll('.bb-otp-item')]; let index = inputs.indexOf(target); if (index > 0) { setFocus(inputs[index - 1]); @@ -82,7 +82,7 @@ const setPrevFocus = (el, target) => { } const setNextFocus = (el, target) => { - const inputs = [...el.querySelectorAll('.bb-opt-item')]; + const inputs = [...el.querySelectorAll('.bb-otp-item')]; let index = inputs.indexOf(target); if (index < inputs.length - 1) { setFocus(inputs[index + 1]); diff --git a/src/BootstrapBlazor/Components/Input/OtpInput.razor.scss b/src/BootstrapBlazor/Components/Input/OtpInput.razor.scss index 69f902e19f6..8fe342e2f60 100644 --- a/src/BootstrapBlazor/Components/Input/OtpInput.razor.scss +++ b/src/BootstrapBlazor/Components/Input/OtpInput.razor.scss @@ -1,24 +1,24 @@ -.bb-opt-input { +.bb-otp-input { + --bb-otp-item-width: #{$bb-otp-item-width}; + --bb-otp-item-disabled-color: #{$bb-otp-item-disabled-color}; + --bb-otp-item-padding: #{$bb-otp-item-padding}; + --bb-otp-item-margin: #{$bb-otp-item-margin}; + --bb-otp-font-size: #{$bb-otp-font-size}; + --bb-otp-border-width: #{$bb-otp-border-width}; white-space: nowrap; overflow: hidden; - .bb-opt-item { - --bb-opt-item-width: 66px; - --bb-opt-item-disabled-color: #b8b8b8; - --bb-opt-item-padding: #{$bb-opt-item-padding}; - --bb-opt-item-margin: #{$bb-opt-item-margin}; - --bb-opt-font-size: #{$bb-opt-font-size}; - --bb-opt-border-width: #{$bb-opt-border-width}; + .bb-otp-item { display: inline-block; - border: var(--bb-opt-border-width) solid var(--bs-border-color); - font-size: var(--bb-opt-font-size); - padding: var(--bb-opt-item-padding); + border: var(--bb-otp-border-width) solid var(--bs-border-color); + font-size: var(--bb-otp-font-size); + padding: var(--bb-otp-item-padding); border-radius: var(--bs-border-radius); - width: var(--bb-opt-item-width); - height: var(--bb-opt-item-width); + width: var(--bb-otp-item-width); + height: var(--bb-otp-item-width); &:not(:last-child) { - margin-right: var(--bb-opt-item-margin); + margin-right: var(--bb-otp-item-margin); } &[type] { @@ -33,9 +33,16 @@ &.is-invalid { --bs-border-color: var(--bs-danger); } + + &span { + color: var(--bb-otp-item-disabled-color); + } } +} - span.bb-opt-item { - color: var(--bb-opt-item-disabled-color); +@media (min-width: 768px) { + .bb-otp-input { + --bb-otp-item-width: 66px; + --bb-otp-font-size: 3em; } } diff --git a/src/BootstrapBlazor/wwwroot/scss/theme/bootstrapblazor.scss b/src/BootstrapBlazor/wwwroot/scss/theme/bootstrapblazor.scss index 460d4ff4129..ecb160ce76c 100644 --- a/src/BootstrapBlazor/wwwroot/scss/theme/bootstrapblazor.scss +++ b/src/BootstrapBlazor/wwwroot/scss/theme/bootstrapblazor.scss @@ -315,10 +315,12 @@ $bb-viewer-border-radius: 50%; $bb-ip-cell-max-width: 30px; // OptInput -$bb-opt-item-padding: 0 .5em; -$bb-opt-item-margin: .5rem; -$bb-opt-font-size: 3em; -$bb-opt-border-width: 1px; +$bb-otp-item-width: 38px; +$bb-otp-item-disabled-color: #b8b8b8; +$bb-otp-item-padding: 0 .5em; +$bb-otp-item-margin: .5rem; +$bb-otp-font-size: 1.5em; +$bb-otp-border-width: 1px; // Layout $bb-layout-header-height: 50px; diff --git a/test/UnitTest/Components/OtpInputTest.cs b/test/UnitTest/Components/OtpInputTest.cs index 6bc6172c5ac..0869355b738 100644 --- a/test/UnitTest/Components/OtpInputTest.cs +++ b/test/UnitTest/Components/OtpInputTest.cs @@ -19,7 +19,7 @@ public void OtpInput_Ok() pb.Add(a => a.Digits, 6); }); - var items = cut.FindAll(".bb-opt-item"); + var items = cut.FindAll(".bb-otp-item"); Assert.Equal(6, items.Count); var item = items[0]; @@ -36,21 +36,21 @@ public void Readonly_Ok() pb.Add(a => a.IsReadonly, true); }); - var item = cut.Find(".bb-opt-item"); + var item = cut.Find(".bb-otp-item"); Assert.Contains("readonly=\"readonly\"", item.OuterHtml); cut.SetParametersAndRender(pb => { pb.Add(a => a.IsReadonly, false); }); - item = cut.Find(".bb-opt-item"); - Assert.Equal("", item.OuterHtml); + item = cut.Find(".bb-otp-item"); + Assert.Equal("", item.OuterHtml); cut.SetParametersAndRender(pb => { pb.Add(a => a.IsDisabled, true); }); - item = cut.Find(".bb-opt-item"); + item = cut.Find(".bb-otp-item"); Assert.Contains("disabled=\"disabled\"", item.OuterHtml); } @@ -63,16 +63,16 @@ public void Type_Ok() pb.Add(a => a.PlaceHolder, "X"); }); - var item = cut.Find(".bb-opt-item"); - Assert.Equal("", item.OuterHtml); + var item = cut.Find(".bb-otp-item"); + Assert.Equal("", item.OuterHtml); cut.SetParametersAndRender(pb => { pb.Add(a => a.Type, OtpInputType.Password); pb.Add(a => a.PlaceHolder, null); }); - item = cut.Find(".bb-opt-item"); - Assert.Equal("", item.OuterHtml); + item = cut.Find(".bb-otp-item"); + Assert.Equal("", item.OuterHtml); } [Fact]