Apply BitFileInput improvements (#12742) - #12744
Conversation
WalkthroughBitFileInput adds validation options, previews, removal callbacks, browser file handling, accessibility attributes, customizable styles, color and size variants, expanded demos, and tests covering the new behavior. ChangesBitFileInput improvements
Estimated code review effort: 4 (Complex) | ~60 minutes Sequence Diagram(s)sequenceDiagram
participant User
participant BitFileInput
participant FileInput
participant Browser
User->>BitFileInput: Select, drop, or paste files
BitFileInput->>FileInput: Initialize file and drag/drop handlers
FileInput->>Browser: Assign files and dispatch change
Browser->>BitFileInput: Return metadata, previews, and dimensions
BitFileInput->>BitFileInput: Validate files and invoke callbacks
User->>BitFileInput: Remove a file
BitFileInput->>FileInput: Remove file and revoke preview URL
BitFileInput->>BitFileInput: Invoke OnRemove and OnChange
Suggested reviewers: Poem
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
|
@coderabbitai full-review |
|
✅ Action performedFull review finished. Your plan includes PR reviews subject to rate limits. More reviews will be available in 8 minutes. |
|
@coderabbitai full-review |
|
✅ Action performedFull review finished. |
There was a problem hiding this comment.
Actionable comments posted: 4
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
src/BlazorUI/Bit.BlazorUI/Components/Inputs/FileInput/BitFileInput.ts (1)
15-25: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick winIndex can collide after
removeFile+ append.
lastIndexis derived from the current count of items forid, not the max existingindex. After a file is removed mid-list and then more files are appended, the new item'sindexcan collide with a remaining item'sindex(differentfileId, sameid+index). This metadata is returned to the Blazor side, so any consumer relying on index for ordering/keys can get duplicate/inconsistent values.Repro: append 3 files (indices 0,1,2) → remove the item at index 1 → append 1 more file → new item gets index
0 + 2 = 2, colliding with the surviving item at index 2.🐛 Proposed fix — derive next index from max existing index, not count
- const lastIndex = append ? FileInput._fileInputs.filter(f => f.id === id).length : 0; + const existingItems = FileInput._fileInputs.filter(f => f.id === id); + const lastIndex = append && existingItems.length > 0 + ? Math.max(...existingItems.map(f => f.index)) + 1 + : 0;🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/BlazorUI/Bit.BlazorUI/Components/Inputs/FileInput/BitFileInput.ts` around lines 15 - 25, Update the `lastIndex` calculation in the file-mapping flow to derive the next index from the maximum existing `index` for the same `id`, rather than the current item count; use zero as the starting offset when no items exist. Preserve the existing `index + lastIndex` assignment and all other file metadata behavior.
🧹 Nitpick comments (1)
src/BlazorUI/Bit.BlazorUI/Components/Inputs/FileInput/BitFileInput.razor (1)
34-35: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick winAvoid setting both
aria-labelandaria-labelledbysimultaneously.When
AriaLabelis set and the label button is rendered, both attributes end up on the<input>. Per spec, aria-labelledby will take precedence over aria-label if both are applied, making the user-suppliedAriaLabelsilently ignored in that case.♻️ Proposed fix
- aria-label="`@AriaLabel`" - aria-labelledby="@(LabelTemplate is null && HideLabel is false ? _buttonId : null)" + aria-label="@(LabelTemplate is null && HideLabel is false ? null : AriaLabel)" + aria-labelledby="@(LabelTemplate is null && HideLabel is false ? _buttonId : null)"🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/BlazorUI/Bit.BlazorUI/Components/Inputs/FileInput/BitFileInput.razor` around lines 34 - 35, Update the accessibility attributes on the input in BitFileInput so aria-labelledby is assigned only when AriaLabel is not set, while preserving the existing label-button condition. Ensure AriaLabel takes precedence and never renders simultaneously with aria-labelledby.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@src/BlazorUI/Bit.BlazorUI/Components/Inputs/FileInput/BitFileInput.razor`:
- Around line 76-89: Update the remove-button markup in BitFileInput so it is
disabled and cannot invoke RemoveFile(file) when IsEnabled is false. Preserve
the existing enabled-state behavior, styling, and accessibility attributes.
In `@src/BlazorUI/Bit.BlazorUI/Components/Inputs/FileInput/BitFileInput.razor.cs`:
- Around line 252-256: Update RemoveFile to return immediately when IsEnabled is
false, before performing any file-removal logic. Keep the existing empty-file
guard and removal behavior unchanged when the component is enabled.
- Around line 252-281: Update RemoveFile after mutating _files to explicitly
reset each remaining file’s IsValid state and MaxCountErrorMessage, then reapply
the MaxCount validation by position so only files beyond MaxCount remain
invalid. Ensure this recalculation occurs before invoking OnChange and
StateHasChanged, while preserving the existing removal callbacks and JavaScript
operations.
In `@src/BlazorUI/Bit.BlazorUI/Components/Inputs/FileInput/BitFileInput.ts`:
- Around line 45-66: Update onDragEnter and onDragLeave to also return
immediately when inputElement.disabled is true, preventing drag highlight
classes and dragCounter changes for disabled inputs while preserving the
existing file checks and enabled-input behavior.
---
Outside diff comments:
In `@src/BlazorUI/Bit.BlazorUI/Components/Inputs/FileInput/BitFileInput.ts`:
- Around line 15-25: Update the `lastIndex` calculation in the file-mapping flow
to derive the next index from the maximum existing `index` for the same `id`,
rather than the current item count; use zero as the starting offset when no
items exist. Preserve the existing `index + lastIndex` assignment and all other
file metadata behavior.
---
Nitpick comments:
In `@src/BlazorUI/Bit.BlazorUI/Components/Inputs/FileInput/BitFileInput.razor`:
- Around line 34-35: Update the accessibility attributes on the input in
BitFileInput so aria-labelledby is assigned only when AriaLabel is not set,
while preserving the existing label-button condition. Ensure AriaLabel takes
precedence and never renders simultaneously with aria-labelledby.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository UI
Review profile: CHILL
Plan: Pro
Run ID: 0fa0f64f-63d1-4da0-b8e9-4874782194c8
📒 Files selected for processing (12)
src/BlazorUI/Bit.BlazorUI/Components/Inputs/FileInput/BitFileInput.razorsrc/BlazorUI/Bit.BlazorUI/Components/Inputs/FileInput/BitFileInput.razor.cssrc/BlazorUI/Bit.BlazorUI/Components/Inputs/FileInput/BitFileInput.scsssrc/BlazorUI/Bit.BlazorUI/Components/Inputs/FileInput/BitFileInput.tssrc/BlazorUI/Bit.BlazorUI/Components/Inputs/FileInput/BitFileInputClassStyles.cssrc/BlazorUI/Bit.BlazorUI/Components/Inputs/FileInput/BitFileInputInfo.cssrc/BlazorUI/Bit.BlazorUI/Components/Inputs/FileInput/BitFileInputJsRuntimeExtensions.cssrc/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Core/Pages/Components/Inputs/FileInput/BitFileInputDemo.razorsrc/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Core/Pages/Components/Inputs/FileInput/BitFileInputDemo.razor.cssrc/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Core/Pages/Components/Inputs/FileInput/BitFileInputDemo.razor.samples.cssrc/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Core/Pages/Components/Inputs/FileInput/BitFileInputDemo.razor.scsssrc/BlazorUI/Tests/Bit.BlazorUI.Tests/Components/Inputs/FileInput/BitFileInputTests.cs
|
@coderabbitai full-review |
|
✅ Action performedFull review finished. |
There was a problem hiding this comment.
Actionable comments posted: 2
🧹 Nitpick comments (6)
src/BlazorUI/Tests/Bit.BlazorUI.Tests/Components/Inputs/FileInput/BitFileInputTests.cs (2)
516-527: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low valueThis test no longer exercises removal.
RemoveFilenow returns atif (_files.Any() is false) return;, so with an empty file list nothing after the guard runs — the assertion is trivially true. It still guards against a throw, but consider renaming it to reflect that (e.g....ShouldBeNoOpWhenNoFilesSelected) so the gap isn't mistaken for real removal coverage.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/BlazorUI/Tests/Bit.BlazorUI.Tests/Components/Inputs/FileInput/BitFileInputTests.cs` around lines 516 - 527, Rename BitFileInputRemoveFileShouldClearAllFilesWhenNullProvided to reflect that calling RemoveFile(null) with no selected files is a no-op, such as a name ending in ShouldBeNoOpWhenNoFilesSelected. Keep the existing empty-state setup and assertion unchanged.
647-719: 🎯 Functional Correctness | 🔵 Trivial | 🏗️ Heavy liftTest gap: none of the new validation logic is covered.
The added tests are all render/attribute assertions. The riskiest new code in this PR —
ApplyListValidations(MaxCount/MaxTotalSizere-validation and theListValidationFailedreset after removals),MinSize,FileValidatorincluding its exception path, duplicate detection, and theOnRemove/OnInvalidcallback ordering — has no coverage. Since these paths run throughHandleOnChange, they need a stubbedBitBlazorUI.FileInput.setupvia bunit'sJSInterop. Happy to draft those tests if useful.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/BlazorUI/Tests/Bit.BlazorUI.Tests/Components/Inputs/FileInput/BitFileInputTests.cs` around lines 647 - 719, Add bUnit tests for BitFileInput.HandleOnChange using a JSInterop stub for BitBlazorUI.FileInput.setup, covering ApplyListValidations MaxCount/MaxTotalSize revalidation, ListValidationFailed reset after removals, MinSize, FileValidator success and exception paths, duplicate detection, and OnRemove/OnInvalid callback ordering. Assert each validation result and callback sequence while preserving the existing render and attribute tests.src/BlazorUI/Bit.BlazorUI/Components/Inputs/FileInput/BitFileInput.razor (1)
19-24: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value
AriaLabelon the browse button overrides its visible text.The button renders visible text (
Label ?? "Browse") and also getsaria-label="@AriaLabel". WhenAriaLabelis set and doesn't contain the visible label, the accessible name no longer matches the visible one (WCAG 2.5.3 Label in Name), which breaks speech-input users. Consider scopingAriaLabelto the input element only, or documenting that it replaces the button's accessible name.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/BlazorUI/Bit.BlazorUI/Components/Inputs/FileInput/BitFileInput.razor` around lines 19 - 24, Update the browse button markup in BitFileInput so AriaLabel does not override the accessible name of its visible Label ?? "Browse" text; scope AriaLabel to the file input element instead, or otherwise ensure the button’s accessible name contains its visible label.src/BlazorUI/Bit.BlazorUI/Components/Inputs/FileInput/BitFileInput.scss (1)
78-82: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value
.bit-fin-dscborrows--bit-fin-fs-fontsize, which is the file-size variable.Coupling the description size to the file-size token means a theme can't tune one without the other. A dedicated
--bit-fin-dsc-fontsizein each size class would keep the two independent.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/BlazorUI/Bit.BlazorUI/Components/Inputs/FileInput/BitFileInput.scss` around lines 78 - 82, Update the .bit-fin-dsc rule to use a dedicated --bit-fin-dsc-fontsize token, and define that token independently in each relevant size class alongside the existing file-size variable. Remove the description’s dependency on --bit-fin-fs-fontsize while preserving the current sizing behavior through matching defaults.src/BlazorUI/Bit.BlazorUI/Components/Inputs/FileInput/BitFileInput.razor.cs (1)
596-635: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value
HandleOnChangehas noIsEnabledguard, unlike the other public entry points.The DOM
disabledattribute and the JS drop/paste handlers both gate on disabled state, so this isn't reachable today. Still, a syntheticchangedispatch (or a future markup change that drops thedisabledbinding) would bypass every guard. A singleif (IsEnabled is false) return;next to theIsDisposedcheck keeps the invariant local.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/BlazorUI/Bit.BlazorUI/Components/Inputs/FileInput/BitFileInput.razor.cs` around lines 596 - 635, Update HandleOnChange to return immediately when IsEnabled is false, placing the guard next to the existing IsDisposed check. Preserve the current file processing behavior for enabled, non-disposed inputs.src/BlazorUI/Bit.BlazorUI/Components/Inputs/FileInput/BitFileInput.ts (1)
291-319: 🩺 Stability & Availability | 🔵 Trivial | 💤 Low valueUnbounded recursion/enumeration when expanding dropped directories.
collectEntryrecurses with no depth or file-count cap, so a deep or very large dropped tree keeps the UI awaiting indefinitely and can exhaust memory beforesetFilesever runs. Consider a depth limit and/or a max-file cutoff (and ideally aligning the cutoff withMaxCount).🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/BlazorUI/Bit.BlazorUI/Components/Inputs/FileInput/BitFileInput.ts` around lines 291 - 319, Update FileInput.collectEntry to enforce bounded directory traversal, propagating the current depth and accumulated file limit through recursive calls. Stop reading or recursing once the configured maximum file count, preferably aligned with MaxCount, is reached, and add a depth cap so deeply nested dropped directories terminate before setFiles is delayed indefinitely.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@src/BlazorUI/Bit.BlazorUI/Components/Inputs/FileInput/BitFileInput.razor`:
- Around line 59-69: Update the Files list rendering in BitFileInput so each
iteration always has a keyed wrapper with role="listitem" surrounding both the
FileViewTemplate and default rendering branches. Move the existing
`@key`="file.FileId" and role="listitem" attributes outside the conditional while
preserving the current template and fallback content.
In `@src/BlazorUI/Bit.BlazorUI/Components/Inputs/FileInput/BitFileInput.ts`:
- Around line 16-17: Update the lastIndex calculation in the FileInput
initialization flow to determine the maximum existing index using reduce rather
than spreading existingItems into Math.max. Preserve the current empty-list
fallback of 0 and increment the computed maximum by 1 for appended items.
---
Nitpick comments:
In `@src/BlazorUI/Bit.BlazorUI/Components/Inputs/FileInput/BitFileInput.razor`:
- Around line 19-24: Update the browse button markup in BitFileInput so
AriaLabel does not override the accessible name of its visible Label ?? "Browse"
text; scope AriaLabel to the file input element instead, or otherwise ensure the
button’s accessible name contains its visible label.
In `@src/BlazorUI/Bit.BlazorUI/Components/Inputs/FileInput/BitFileInput.razor.cs`:
- Around line 596-635: Update HandleOnChange to return immediately when
IsEnabled is false, placing the guard next to the existing IsDisposed check.
Preserve the current file processing behavior for enabled, non-disposed inputs.
In `@src/BlazorUI/Bit.BlazorUI/Components/Inputs/FileInput/BitFileInput.scss`:
- Around line 78-82: Update the .bit-fin-dsc rule to use a dedicated
--bit-fin-dsc-fontsize token, and define that token independently in each
relevant size class alongside the existing file-size variable. Remove the
description’s dependency on --bit-fin-fs-fontsize while preserving the current
sizing behavior through matching defaults.
In `@src/BlazorUI/Bit.BlazorUI/Components/Inputs/FileInput/BitFileInput.ts`:
- Around line 291-319: Update FileInput.collectEntry to enforce bounded
directory traversal, propagating the current depth and accumulated file limit
through recursive calls. Stop reading or recursing once the configured maximum
file count, preferably aligned with MaxCount, is reached, and add a depth cap so
deeply nested dropped directories terminate before setFiles is delayed
indefinitely.
In
`@src/BlazorUI/Tests/Bit.BlazorUI.Tests/Components/Inputs/FileInput/BitFileInputTests.cs`:
- Around line 516-527: Rename
BitFileInputRemoveFileShouldClearAllFilesWhenNullProvided to reflect that
calling RemoveFile(null) with no selected files is a no-op, such as a name
ending in ShouldBeNoOpWhenNoFilesSelected. Keep the existing empty-state setup
and assertion unchanged.
- Around line 647-719: Add bUnit tests for BitFileInput.HandleOnChange using a
JSInterop stub for BitBlazorUI.FileInput.setup, covering ApplyListValidations
MaxCount/MaxTotalSize revalidation, ListValidationFailed reset after removals,
MinSize, FileValidator success and exception paths, duplicate detection, and
OnRemove/OnInvalid callback ordering. Assert each validation result and callback
sequence while preserving the existing render and attribute tests.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository UI
Review profile: CHILL
Plan: Pro Plus
Run ID: 11cb2986-2535-4c4c-864d-d4b7b820dd1f
📒 Files selected for processing (12)
src/BlazorUI/Bit.BlazorUI/Components/Inputs/FileInput/BitFileInput.razorsrc/BlazorUI/Bit.BlazorUI/Components/Inputs/FileInput/BitFileInput.razor.cssrc/BlazorUI/Bit.BlazorUI/Components/Inputs/FileInput/BitFileInput.scsssrc/BlazorUI/Bit.BlazorUI/Components/Inputs/FileInput/BitFileInput.tssrc/BlazorUI/Bit.BlazorUI/Components/Inputs/FileInput/BitFileInputClassStyles.cssrc/BlazorUI/Bit.BlazorUI/Components/Inputs/FileInput/BitFileInputInfo.cssrc/BlazorUI/Bit.BlazorUI/Components/Inputs/FileInput/BitFileInputJsRuntimeExtensions.cssrc/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Core/Pages/Components/Inputs/FileInput/BitFileInputDemo.razorsrc/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Core/Pages/Components/Inputs/FileInput/BitFileInputDemo.razor.cssrc/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Core/Pages/Components/Inputs/FileInput/BitFileInputDemo.razor.samples.cssrc/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Core/Pages/Components/Inputs/FileInput/BitFileInputDemo.razor.scsssrc/BlazorUI/Tests/Bit.BlazorUI.Tests/Components/Inputs/FileInput/BitFileInputTests.cs
|
@coderabbitai full-review |
|
✅ Action performedFull review finished. |
There was a problem hiding this comment.
♻️ Duplicate comments (2)
src/BlazorUI/Bit.BlazorUI/Components/Inputs/FileInput/BitFileInput.ts (1)
16-17: 🩺 Stability & Availability | 🟡 Minor | ⚡ Quick win
Math.max(...)spread can throwRangeErrorfor very large directory selections.Still unaddressed from the earlier review: with
Directory+Append, the existing item count can exceed the engine's argument limit. Areduceavoids it.🐛 Proposed fix
- const existingItems = append ? FileInput._fileInputs.filter(f => f.id === id) : []; - const lastIndex = existingItems.length ? Math.max(...existingItems.map(f => f.index)) + 1 : 0; + const existingItems = append ? FileInput._fileInputs.filter(f => f.id === id) : []; + const lastIndex = existingItems.reduce((max, f) => f.index > max ? f.index : max, -1) + 1;🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/BlazorUI/Bit.BlazorUI/Components/Inputs/FileInput/BitFileInput.ts` around lines 16 - 17, Update the lastIndex calculation in the FileInput initialization flow to avoid spreading existingItems.map(...) into Math.max. Use a reduce-based maximum over existingItems, preserving the current empty-list fallback of 0 and incrementing the computed maximum by one for appended items.src/BlazorUI/Bit.BlazorUI/Components/Inputs/FileInput/BitFileInput.razor (1)
59-69: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win
role="list"still gets non-listitemchildren whenFileViewTemplateis used.The
role="listitem"wrapper (and@key) only exists in theelsebranch, so a custom template produces an invalid ARIA list structure.♿ Proposed fix
`@foreach` (var file in Files) { if (FileViewTemplate is not null) { - `@FileViewTemplate`(file) + <div `@key`="file.FileId" role="listitem"> + `@FileViewTemplate`(file) + </div> }🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/BlazorUI/Bit.BlazorUI/Components/Inputs/FileInput/BitFileInput.razor` around lines 59 - 69, Update the Files rendering loop in BitFileInput so every direct child of the role="list" container, including custom FileViewTemplate output, is wrapped in a keyed element with role="listitem". Preserve the existing default file-content rendering and ensure `@key`="file.FileId" remains applied per file.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Duplicate comments:
In `@src/BlazorUI/Bit.BlazorUI/Components/Inputs/FileInput/BitFileInput.razor`:
- Around line 59-69: Update the Files rendering loop in BitFileInput so every
direct child of the role="list" container, including custom FileViewTemplate
output, is wrapped in a keyed element with role="listitem". Preserve the
existing default file-content rendering and ensure `@key`="file.FileId" remains
applied per file.
In `@src/BlazorUI/Bit.BlazorUI/Components/Inputs/FileInput/BitFileInput.ts`:
- Around line 16-17: Update the lastIndex calculation in the FileInput
initialization flow to avoid spreading existingItems.map(...) into Math.max. Use
a reduce-based maximum over existingItems, preserving the current empty-list
fallback of 0 and incrementing the computed maximum by one for appended items.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository UI
Review profile: CHILL
Plan: Pro Plus
Run ID: 5c425802-92a8-400f-9a1b-a2fda16b0b79
📒 Files selected for processing (12)
src/BlazorUI/Bit.BlazorUI/Components/Inputs/FileInput/BitFileInput.razorsrc/BlazorUI/Bit.BlazorUI/Components/Inputs/FileInput/BitFileInput.razor.cssrc/BlazorUI/Bit.BlazorUI/Components/Inputs/FileInput/BitFileInput.scsssrc/BlazorUI/Bit.BlazorUI/Components/Inputs/FileInput/BitFileInput.tssrc/BlazorUI/Bit.BlazorUI/Components/Inputs/FileInput/BitFileInputClassStyles.cssrc/BlazorUI/Bit.BlazorUI/Components/Inputs/FileInput/BitFileInputInfo.cssrc/BlazorUI/Bit.BlazorUI/Components/Inputs/FileInput/BitFileInputJsRuntimeExtensions.cssrc/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Core/Pages/Components/Inputs/FileInput/BitFileInputDemo.razorsrc/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Core/Pages/Components/Inputs/FileInput/BitFileInputDemo.razor.cssrc/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Core/Pages/Components/Inputs/FileInput/BitFileInputDemo.razor.samples.cssrc/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Core/Pages/Components/Inputs/FileInput/BitFileInputDemo.razor.scsssrc/BlazorUI/Tests/Bit.BlazorUI.Tests/Components/Inputs/FileInput/BitFileInputTests.cs
closes #12742
Summary by CodeRabbit
acceptgeneration (including omitting when it would allow everything).accept/ARIA/attributes and preview-related behavior.