File Finder
A macOS Finder-style document browser with an expandable folder tree, breadcrumb navigation, and grid/list views.
Preview
- Contracts Folder
- Invoices Folder
- Reports Folder
-
README.txt 2 KBTXT
This folder is empty.
@php
$tree = [
[
'id' => 'contracts',
'name' => 'Contracts',
'type' => 'folder',
'children' => [
['id' => 'msa', 'name' => 'Master Service Agreement.pdf', 'type' => 'file', 'mime' => 'application/pdf', 'size' => 248320, 'modified' => 'Mar 2'],
['id' => 'nda', 'name' => 'Mutual NDA.docx', 'type' => 'file', 'mime' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'size' => 38912, 'modified' => 'Feb 18'],
[
'id' => 'signed',
'name' => 'Signed',
'type' => 'folder',
'children' => [
['id' => 'msa-signed', 'name' => 'MSA-signed.pdf', 'type' => 'file', 'mime' => 'application/pdf', 'size' => 261120, 'modified' => 'Mar 4'],
],
],
],
],
[
'id' => 'invoices',
'name' => 'Invoices',
'type' => 'folder',
'children' => [
['id' => 'inv-2024', 'name' => 'Invoices-2024.xlsx', 'type' => 'file', 'mime' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'size' => 51200, 'modified' => 'Jan 9'],
['id' => 'inv-export', 'name' => 'export.csv', 'type' => 'file', 'mime' => 'text/csv', 'size' => 14336, 'modified' => 'Jan 9'],
['id' => 'inv-0042', 'name' => 'INV-0042.pdf', 'type' => 'file', 'mime' => 'application/pdf', 'size' => 88064, 'modified' => 'Dec 30'],
],
],
[
'id' => 'reports',
'name' => 'Reports',
'type' => 'folder',
'children' => [
['id' => 'q4', 'name' => 'Q4-summary.pdf', 'type' => 'file', 'mime' => 'application/pdf', 'size' => 512000, 'modified' => 'Jan 15'],
['id' => 'chart', 'name' => 'revenue-chart.png', 'type' => 'file', 'mime' => 'image/png', 'size' => 204800, 'modified' => 'Jan 14'],
['id' => 'raw', 'name' => 'raw-data.zip', 'type' => 'file', 'mime' => 'application/zip', 'size' => 1572864, 'modified' => 'Jan 12'],
],
],
['id' => 'readme', 'name' => 'README.txt', 'type' => 'file', 'mime' => 'text/plain', 'size' => 2048, 'modified' => 'Today'],
];
@endphp
<div class="mx-auto h-[28rem] w-full max-w-4xl">
<x-ui.file-finder :items="$tree" />
</div>
Installation
php artisan ui:add pro/file-finder
Note
This component ships an Alpine behavior module at
resources/js/ui/file-finder.js. Import it once from your bundle so it registers on alpine:init:
import './file-finder.js';
Use with AI
A brief for your coding agent: install command, usage, props, guidance and the rules. Copy it, or open a prompt about this component in an assistant.
# Brok UI: File Finder (`file-finder`)
A macOS Finder-style document browser with an expandable folder tree, breadcrumb navigation, and grid/list views.
Brok UI is a Laravel Blade component registry. Installed components are plain Blade files the app owns.
## Install
```bash
php artisan ui:add pro/file-finder
```
## Usage
```blade
@php
$tree = [
[
'id' => 'contracts',
'name' => 'Contracts',
'type' => 'folder',
'children' => [
['id' => 'msa', 'name' => 'Master Service Agreement.pdf', 'type' => 'file', 'mime' => 'application/pdf', 'size' => 248320, 'modified' => 'Mar 2'],
['id' => 'nda', 'name' => 'Mutual NDA.docx', 'type' => 'file', 'mime' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'size' => 38912, 'modified' => 'Feb 18'],
[
'id' => 'signed',
'name' => 'Signed',
'type' => 'folder',
'children' => [
['id' => 'msa-signed', 'name' => 'MSA-signed.pdf', 'type' => 'file', 'mime' => 'application/pdf', 'size' => 261120, 'modified' => 'Mar 4'],
],
],
],
],
[
'id' => 'invoices',
'name' => 'Invoices',
'type' => 'folder',
'children' => [
['id' => 'inv-2024', 'name' => 'Invoices-2024.xlsx', 'type' => 'file', 'mime' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'size' => 51200, 'modified' => 'Jan 9'],
['id' => 'inv-export', 'name' => 'export.csv', 'type' => 'file', 'mime' => 'text/csv', 'size' => 14336, 'modified' => 'Jan 9'],
['id' => 'inv-0042', 'name' => 'INV-0042.pdf', 'type' => 'file', 'mime' => 'application/pdf', 'size' => 88064, 'modified' => 'Dec 30'],
],
],
[
'id' => 'reports',
'name' => 'Reports',
'type' => 'folder',
'children' => [
['id' => 'q4', 'name' => 'Q4-summary.pdf', 'type' => 'file', 'mime' => 'application/pdf', 'size' => 512000, 'modified' => 'Jan 15'],
['id' => 'chart', 'name' => 'revenue-chart.png', 'type' => 'file', 'mime' => 'image/png', 'size' => 204800, 'modified' => 'Jan 14'],
['id' => 'raw', 'name' => 'raw-data.zip', 'type' => 'file', 'mime' => 'application/zip', 'size' => 1572864, 'modified' => 'Jan 12'],
],
],
['id' => 'readme', 'name' => 'README.txt', 'type' => 'file', 'mime' => 'text/plain', 'size' => 2048, 'modified' => 'Today'],
];
@endphp
<div class="mx-auto h-[28rem] w-full max-w-4xl">
<x-ui.file-finder :items="$tree" />
</div>
```
## Use when
- Use when users need to upload, inspect, edit, annotate, or sign real documents as part of the workflow.
- Browsing a hierarchical set of folders and files inside the app, such as a document library or asset manager.
- Needing a familiar Finder-style tree, breadcrumb, and grid/list toggle instead of a flat file list.
## Avoid when
- Do not use a heavy document interface when the same task can be completed more simply in structured product UI.
- Use search and filters for large document sets, but retain browse paths for users who do not know the exact filename.
- The set of files is flat with no folders; a simple list or table of file-thumbnail tiles is lighter weight.
- The files must be uploaded, not just browsed; pair this with a dedicated upload control.
## Anti-patterns
- Heavy document UI when structured fields are simpler
## Rules
- Use the `<brok:file-finder>` tag (or `<x-ui.file-finder>`) in Blade; do not rewrite the component.
- Prefer the documented props and variants over utility-class overrides; when a utility must win, use the `!` important modifier.
- Use semantic design tokens (`bg-primary`, `text-muted-foreground`), never raw colour utilities.
- Keep the `data-slot` attributes; they are the styling and test hooks.
## Links
- Docs: https://brokui.dev/docs/components/file-finder
Working in Claude Code, Cursor or Codex? Give the agent the whole registry through the MCP server or the Brok UI skill.
API
Props
No documented props. Pass normal Blade attributes through the component root.
Slots
default—
Data slots
Stable hooks for CSS overrides and browser tests.
No data-slot selectors found in the registry source.
Behavior
- Renders a server-side static shell first (a plain folder/file list) so the browser works without JavaScript, then the interactive tree, breadcrumb, and grid/list toggle take over once Alpine boots.
- Selecting a folder navigates into it and updates the breadcrumb trail; selecting a file marks it as the active selection.
- Switching between grid and list view keeps the current folder and selection.
- Installs a JavaScript behavior module when the registry item includes resources/js/ui files.
Guidance
Upload, inspect, edit, annotate, or sign a real document.
Use when
- Use when users need to upload, inspect, edit, annotate, or sign real documents as part of the workflow.
- Browsing a hierarchical set of folders and files inside the app, such as a document library or asset manager.
- Needing a familiar Finder-style tree, breadcrumb, and grid/list toggle instead of a flat file list.
Avoid when
- Do not use a heavy document interface when the same task can be completed more simply in structured product UI.
- Use search and filters for large document sets, but retain browse paths for users who do not know the exact filename.
- The set of files is flat with no folders; a simple list or table of file-thumbnail tiles is lighter weight.
- The files must be uploaded, not just browsed; pair this with a dedicated upload control.
Use instead
- Structured product form
- Direct data entry
Anti-patterns
- Heavy document UI when structured fields are simpler
- Anatomy
Accessibility
- Keyboard
- No component-owned keyboard interaction; native element behavior applies.
- Focus
none
- The static server-rendered shell means the file tree is fully browsable, with real links and headings, even without JavaScript.
- The interactive grid tracks the active item via aria-activedescendant, so keyboard users can move selection without losing focus from the list.
- Semantic HTML and a stable
data-slotattribute for styling and scripting hooks. - Focus-visible rings use the
ringtoken, so keyboard focus is always visible. - Disabled and invalid states are conveyed to assistive tech, not by color alone.
- Targets WCAG 2.2 AA; verify contrast in light, dark, admin and customer surfaces in the preview.
- Labels go through
__()and layout uses logical properties (ms-*,text-start), so it mirrors underdir="rtl"— flip the preview to RTL to confirm. - Dark mode uses the same semantic tokens under the
darkclass; high contrast follows forced-color system tokens.
Livewire
Livewire can update this component through forwarded wire:* attributes.
Source
Source available with Pro
This preview shows the real Pro component, while its installable source is delivered only through the authenticated registry. Activate a license, then use the installation command above.
Open the authenticated source endpoint
Ownership & lifecycle
Owner, release state, review evidence and adoption for this item.
- Owner
- Platform UI (@JoshJML)
- Current version
-
1.3.0 - Status
- Stable
- License
-
pro - Accessibility reviewed
- No review date recorded
- Last breaking change
- No date recorded
- Deprecation
- Not deprecated