Toolbar
Documentație pentru componenta FodToolbar
1. Descriere Generală
FodToolbar
este o componentă container flexibilă pentru organizarea acțiunilor și controalelor într-o bară orizontală. Este ideală pentru crearea de bare de instrumente, antete de secțiuni sau grupări de butoane și controale.
Caracteristici principale: - Layout flexibil cu suport pentru spacing - Mod compact (dense) pentru economisirea spațiului - Control asupra padding-ului lateral (gutters) - Integrare perfectă cu FodSpacer pentru aliniere - Container semantic pentru acțiuni grupate - Design responsive - Suport pentru orice tip de conținut
2. Ghid de Utilizare API
Toolbar simplu
<FodToolbar>
<FodButton Variant="FodVariant.Text" StartIcon="@FodIcons.Material.Filled.Add">
Adaugă
</FodButton>
<FodButton Variant="FodVariant.Text" StartIcon="@FodIcons.Material.Filled.Edit">
Editează
</FodButton>
<FodButton Variant="FodVariant.Text" StartIcon="@FodIcons.Material.Filled.Delete">
Șterge
</FodButton>
</FodToolbar>
Toolbar cu spacer pentru aliniere
<FodToolbar>
<FodIconButton Icon="@FodIcons.Material.Filled.Menu" />
<FodText Typo="Typo.h6" Class="mx-3">
Dashboard
</FodText>
<FodSpacer />
<FodIconButton Icon="@FodIcons.Material.Filled.Notifications" />
<FodIconButton Icon="@FodIcons.Material.Filled.AccountCircle" />
</FodToolbar>
Toolbar compact (dense)
<FodToolbar Dense="true">
<FodButton Size="FodSize.Small">Salvează</FodButton>
<FodButton Size="FodSize.Small">Anulează</FodButton>
<FodSpacer />
<FodButton Size="FodSize.Small" Color="FodColor.Error">
Șterge
</FodButton>
</FodToolbar>
Toolbar fără gutters
<FodToolbar DisableGutters="true">
<FodButton Variant="FodVariant.Text" FullWidth="true">
Opțiunea 1
</FodButton>
<FodButton Variant="FodVariant.Text" FullWidth="true">
Opțiunea 2
</FodButton>
<FodButton Variant="FodVariant.Text" FullWidth="true">
Opțiunea 3
</FodButton>
</FodToolbar>
Toolbar pentru filtrare și căutare
<FodToolbar>
<FodTextField T="string"
Label="Caută"
Variant="FodVariant.Outlined"
Margin="Margin.Dense"
AdornmentIcon="@FodIcons.Material.Filled.Search"
Adornment="Adornment.Start"
@bind-Value="searchText" />
<FodSpacer />
<FodSelect T="string"
Label="Sortează după"
Variant="FodVariant.Outlined"
Margin="Margin.Dense"
@bind-Value="sortBy"
Style="min-width: 150px;">
<FodSelectItem Value="name">Nume</FodSelectItem>
<FodSelectItem Value="date">Dată</FodSelectItem>
<FodSelectItem Value="size">Dimensiune</FodSelectItem>
</FodSelect>
<FodIconButton Icon="@FodIcons.Material.Filled.FilterList"
Color="@(showFilters ? FodColor.Primary : FodColor.Default)"
OnClick="@(() => showFilters = !showFilters)" />
</FodToolbar>
@code {
private string searchText = "";
private string sortBy = "name";
private bool showFilters = false;
}
Toolbar pentru navigare în pagini
<FodToolbar>
<FodText Typo="Typo.body2">
Afișare @startItem - @endItem din @totalItems
</FodText>
<FodSpacer />
<FodIconButton Icon="@FodIcons.Material.Filled.FirstPage"
Disabled="@(currentPage == 1)"
OnClick="GoToFirstPage" />
<FodIconButton Icon="@FodIcons.Material.Filled.ChevronLeft"
Disabled="@(currentPage == 1)"
OnClick="GoToPreviousPage" />
<FodText Typo="Typo.body2" Class="mx-2">
Pagina @currentPage din @totalPages
</FodText>
<FodIconButton Icon="@FodIcons.Material.Filled.ChevronRight"
Disabled="@(currentPage == totalPages)"
OnClick="GoToNextPage" />
<FodIconButton Icon="@FodIcons.Material.Filled.LastPage"
Disabled="@(currentPage == totalPages)"
OnClick="GoToLastPage" />
</FodToolbar>
@code {
private int currentPage = 1;
private int totalPages = 10;
private int itemsPerPage = 20;
private int totalItems = 200;
private int startItem => (currentPage - 1) * itemsPerPage + 1;
private int endItem => Math.Min(currentPage * itemsPerPage, totalItems);
}
Toolbar pentru editor de text
<FodToolbar Dense="true">
<FodButtonGroup Variant="FodVariant.Text" Size="FodSize.Small">
<FodIconButton Icon="@FodIcons.Material.Filled.FormatBold"
Color="@(isBold ? FodColor.Primary : FodColor.Default)"
OnClick="@(() => isBold = !isBold)" />
<FodIconButton Icon="@FodIcons.Material.Filled.FormatItalic"
Color="@(isItalic ? FodColor.Primary : FodColor.Default)"
OnClick="@(() => isItalic = !isItalic)" />
<FodIconButton Icon="@FodIcons.Material.Filled.FormatUnderlined"
Color="@(isUnderlined ? FodColor.Primary : FodColor.Default)"
OnClick="@(() => isUnderlined = !isUnderlined)" />
</FodButtonGroup>
<FodDivider Orientation="Orientation.Vertical" FlexItem="true" Class="mx-2" />
<FodButtonGroup Variant="FodVariant.Text" Size="FodSize.Small">
<FodIconButton Icon="@FodIcons.Material.Filled.FormatAlignLeft" />
<FodIconButton Icon="@FodIcons.Material.Filled.FormatAlignCenter" />
<FodIconButton Icon="@FodIcons.Material.Filled.FormatAlignRight" />
<FodIconButton Icon="@FodIcons.Material.Filled.FormatAlignJustify" />
</FodButtonGroup>
<FodDivider Orientation="Orientation.Vertical" FlexItem="true" Class="mx-2" />
<FodIconButton Icon="@FodIcons.Material.Filled.FormatListBulleted" Size="FodSize.Small" />
<FodIconButton Icon="@FodIcons.Material.Filled.FormatListNumbered" Size="FodSize.Small" />
</FodToolbar>
@code {
private bool isBold = false;
private bool isItalic = false;
private bool isUnderlined = false;
}
Toolbar pentru tabel
<FodToolbar>
<FodText Typo="Typo.h6">Utilizatori</FodText>
<FodSpacer />
<FodButton Variant="FodVariant.Outlined"
StartIcon="@FodIcons.Material.Filled.FileDownload">
Export
</FodButton>
<FodButton Variant="FodVariant.Filled"
Color="FodColor.Primary"
StartIcon="@FodIcons.Material.Filled.Add">
Adaugă utilizator
</FodButton>
</FodToolbar>
<FodTable Items="@users" Class="mt-4">
<!-- Conținut tabel -->
</FodTable>
Toolbar cu acțiuni contextuale
<FodToolbar>
@if (selectedItems.Any())
{
<FodCheckbox Checked="@allSelected"
CheckedChanged="ToggleSelectAll"
Color="FodColor.Primary" />
<FodText Typo="Typo.body2" Class="mx-3">
@selectedItems.Count selectate
</FodText>
<FodButton Variant="FodVariant.Text"
StartIcon="@FodIcons.Material.Filled.Delete"
Color="FodColor.Error"
OnClick="DeleteSelected">
Șterge
</FodButton>
<FodButton Variant="FodVariant.Text"
StartIcon="@FodIcons.Material.Filled.Archive"
OnClick="ArchiveSelected">
Arhivează
</FodButton>
}
else
{
<FodText Typo="Typo.h6">Documente</FodText>
}
<FodSpacer />
<FodIconButton Icon="@FodIcons.Material.Filled.ViewList"
Color="@(viewMode == "list" ? FodColor.Primary : FodColor.Default)"
OnClick="@(() => viewMode = "list")" />
<FodIconButton Icon="@FodIcons.Material.Filled.ViewModule"
Color="@(viewMode == "grid" ? FodColor.Primary : FodColor.Default)"
OnClick="@(() => viewMode = "grid")" />
</FodToolbar>
@code {
private List<int> selectedItems = new();
private bool allSelected = false;
private string viewMode = "list";
}
Toolbar responsive
<FodToolbar>
<FodHidden Breakpoint="Breakpoint.SmAndUp">
<FodIconButton Icon="@FodIcons.Material.Filled.Menu"
OnClick="@(() => drawerOpen = true)" />
</FodHidden>
<FodText Typo="Typo.h6" Class="mx-3">
Aplicația Mea
</FodText>
<FodHidden Breakpoint="Breakpoint.Xs">
<FodButton Variant="FodVariant.Text">Acasă</FodButton>
<FodButton Variant="FodVariant.Text">Despre</FodButton>
<FodButton Variant="FodVariant.Text">Servicii</FodButton>
<FodButton Variant="FodVariant.Text">Contact</FodButton>
</FodHidden>
<FodSpacer />
<FodButton Variant="FodVariant.Filled" Color="FodColor.Primary">
Înregistrare
</FodButton>
</FodToolbar>
3. Atribute disponibile
Proprietate | Tip | Descriere | Valoare Implicită |
---|---|---|---|
Dense |
bool |
Activează modul compact cu padding redus | false |
DisableGutters |
bool |
Dezactivează padding-ul lateral | false |
ChildContent |
RenderFragment |
Conținutul toolbar-ului | - |
Class |
string |
Clase CSS adiționale | null |
Style |
string |
Stiluri inline | null |
UserAttributes |
Dictionary<string, object> |
Atribute HTML adiționale | null |
4. Clase CSS generate
Clasă | Condiție | Descriere |
---|---|---|
fod-toolbar |
Întotdeauna | Clasa de bază |
fod-toolbar-dense |
Dense="true" |
Mod compact |
fod-toolbar-gutters |
DisableGutters="false" |
Padding lateral |
5. Stilizare și personalizare
/* Toolbar cu înălțime personalizată */
.custom-height-toolbar {
min-height: 48px;
}
/* Toolbar cu fundal gradient */
.gradient-toolbar {
background: linear-gradient(45deg, #3f51b5, #2196f3);
color: white;
}
.gradient-toolbar .fod-button {
color: white;
}
/* Toolbar cu umbră */
.elevated-toolbar {
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
background-color: white;
border-radius: 4px;
margin-bottom: 16px;
}
/* Toolbar sticky */
.sticky-toolbar {
position: sticky;
top: 0;
z-index: 100;
background-color: white;
border-bottom: 1px solid rgba(0,0,0,0.12);
}
/* Toolbar cu separatoare vizuale */
.sectioned-toolbar > *:not(:last-child) {
border-right: 1px solid rgba(0,0,0,0.12);
padding-right: 16px;
margin-right: 16px;
}
/* Toolbar transparent */
.transparent-toolbar {
background-color: transparent;
backdrop-filter: blur(10px);
-webkit-backdrop-filter: blur(10px);
}
6. Integrare cu alte componente
În AppBar
<FodAppBar>
<FodToolbar>
<FodIconButton Icon="@FodIcons.Material.Filled.Menu"
Edge="Edge.Start"
Color="FodColor.Inherit" />
<FodText Typo="Typo.h6">
Aplicația Mea
</FodText>
<FodSpacer />
<FodIconButton Icon="@FodIcons.Material.Filled.MoreVert"
Edge="Edge.End"
Color="FodColor.Inherit" />
</FodToolbar>
</FodAppBar>
În Card header
<FodCard>
<FodToolbar Class="pa-2">
<FodAvatar Size="FodSize.Small">
<FodImage Src="user-avatar.jpg" />
</FodAvatar>
<div class="ml-3">
<FodText Typo="Typo.subtitle1">John Doe</FodText>
<FodText Typo="Typo.caption" Color="FodColor.Secondary">
Acum 2 ore
</FodText>
</div>
<FodSpacer />
<FodIconButton Icon="@FodIcons.Material.Filled.MoreVert" Size="FodSize.Small" />
</FodToolbar>
<FodCardContent>
<!-- Conținut card -->
</FodCardContent>
</FodCard>
În Dialog actions
<FodDialog Open="@dialogOpen">
<FodDialogTitle>Confirmare</FodDialogTitle>
<FodDialogContent>
Sunteți sigur că doriți să ștergeți acest element?
</FodDialogContent>
<FodDialogActions>
<FodToolbar DisableGutters="true">
<FodCheckbox @bind-Checked="dontAskAgain"
Label="Nu întreba din nou" />
<FodSpacer />
<FodButton OnClick="@(() => dialogOpen = false)">
Anulează
</FodButton>
<FodButton Color="FodColor.Error" Variant="FodVariant.Filled">
Șterge
</FodButton>
</FodToolbar>
</FodDialogActions>
</FodDialog>
7. Patterns comune
Toolbar cu state
<FodToolbar>
<FodChipSet @bind-SelectedChip="selectedFilter" Mandatory="true">
<FodChip Value="all">Toate</FodChip>
<FodChip Value="active">Active</FodChip>
<FodChip Value="completed">Finalizate</FodChip>
<FodChip Value="archived">Arhivate</FodChip>
</FodChipSet>
<FodSpacer />
<FodBadge Content="@GetItemCount()" Color="FodColor.Primary" Overlap="false">
<FodText Typo="Typo.body2">elemente</FodText>
</FodBadge>
</FodToolbar>
@code {
private object selectedFilter = "all";
private int GetItemCount()
{
return selectedFilter switch
{
"all" => 156,
"active" => 89,
"completed" => 45,
"archived" => 22,
_ => 0
};
}
}
Toolbar cu acțiuni în grup
<FodToolbar>
<FodMenu>
<ActivatorContent>
<FodButton Variant="FodVariant.Outlined"
EndIcon="@FodIcons.Material.Filled.ArrowDropDown">
Acțiuni
</FodButton>
</ActivatorContent>
<ChildContent>
<FodMenuItem OnClick="DuplicateItems">
<FodIcon Icon="@FodIcons.Material.Filled.ContentCopy" Class="mr-2" />
Duplică
</FodMenuItem>
<FodMenuItem OnClick="MoveItems">
<FodIcon Icon="@FodIcons.Material.Filled.DriveFileMove" Class="mr-2" />
Mută
</FodMenuItem>
<FodMenuItem OnClick="ExportItems">
<FodIcon Icon="@FodIcons.Material.Filled.FileDownload" Class="mr-2" />
Exportă
</FodMenuItem>
</ChildContent>
</FodMenu>
<FodSpacer />
<FodButtonGroup Variant="FodVariant.Outlined">
<FodButton StartIcon="@FodIcons.Material.Filled.ViewList">Listă</FodButton>
<FodButton StartIcon="@FodIcons.Material.Filled.ViewModule">Grilă</FodButton>
</FodButtonGroup>
</FodToolbar>
8. Accesibilitate
- Folosiți
role="toolbar"
pentru grupuri de controale - Grupați butoanele înrudite cu
FodButtonGroup
- Asigurați ordine logică de tab pentru navigare cu tastatura
- Folosiți etichete descriptive pentru screen readers
<FodToolbar UserAttributes="@(new Dictionary<string, object> { ["role"] = "toolbar" })">
<FodButtonGroup Variant="FodVariant.Text"
UserAttributes="@(new Dictionary<string, object> { ["aria-label"] = "Formatare text" })">
<FodIconButton Icon="@FodIcons.Material.Filled.FormatBold"
aria-label="Bold" />
<FodIconButton Icon="@FodIcons.Material.Filled.FormatItalic"
aria-label="Italic" />
</FodButtonGroup>
</FodToolbar>
9. Performanță
- Layout flexibil - Folosește CSS Flexbox pentru performanță
- Minimal re-renders - Structură simplă fără state intern
- CSS classes - Generate o singură dată la inițializare
10. Bune practici
- Grupare logică - Grupați controalele înrudite
- Spacing consistent - Folosiți FodSpacer pentru aliniere
- Dense pentru toolbars secundare - Economisiți spațiu vertical
- Responsive design - Ascundeți/afișați elemente pe diferite ecrane
- Visual hierarchy - Diferențiați acțiunile principale de cele secundare
11. Limitări și considerații
- Nu are înălțime fixă implicită - se adaptează la conținut
- Nu oferă scroll orizontal automat pentru overflow
- Necesită styling manual pentru fundaluri colorate
12. Exemple avansate
Toolbar multi-linie
<div>
<FodToolbar>
<FodText Typo="Typo.h5">Rapoarte</FodText>
<FodSpacer />
<FodButton Variant="FodVariant.Outlined">Setări</FodButton>
</FodToolbar>
<FodToolbar Dense="true" Class="mt-2">
<FodChipSet Filter="true" Mandatory="false" Multiple="true">
<FodChip>Vânzări</FodChip>
<FodChip>Marketing</FodChip>
<FodChip>Financiar</FodChip>
<FodChip>HR</FodChip>
</FodChipSet>
<FodSpacer />
<FodText Typo="Typo.caption" Color="FodColor.Secondary">
Actualizat: @DateTime.Now.ToString("HH:mm")
</FodText>
</FodToolbar>
</div>
Toolbar adaptiv cu collapse
<FodToolbar>
<FodHidden Breakpoint="Breakpoint.MdAndUp" Invert="true">
<!-- Desktop: toate opțiunile vizibile -->
<FodButton Variant="FodVariant.Text">Opțiune 1</FodButton>
<FodButton Variant="FodVariant.Text">Opțiune 2</FodButton>
<FodButton Variant="FodVariant.Text">Opțiune 3</FodButton>
<FodButton Variant="FodVariant.Text">Opțiune 4</FodButton>
</FodHidden>
<FodHidden Breakpoint="Breakpoint.MdAndUp">
<!-- Mobile: meniu dropdown -->
<FodMenu>
<ActivatorContent>
<FodIconButton Icon="@FodIcons.Material.Filled.MoreVert" />
</ActivatorContent>
<ChildContent>
<FodMenuItem>Opțiune 1</FodMenuItem>
<FodMenuItem>Opțiune 2</FodMenuItem>
<FodMenuItem>Opțiune 3</FodMenuItem>
<FodMenuItem>Opțiune 4</FodMenuItem>
</ChildContent>
</FodMenu>
</FodHidden>
</FodToolbar>
13. Troubleshooting
Elementele nu se aliniază corect
- Verificați că folosiți
FodSpacer
pentru spacing - Verificați că elementele au
display: flex
implicit
Toolbar-ul are prea mult spațiu
- Folosiți
Dense="true"
pentru padding redus - Folosiți
DisableGutters="true"
pentru a elimina padding lateral
Overflow pe ecrane mici
- Implementați un design responsive cu
FodHidden
- Folosiți meniuri dropdown pentru gruparea opțiunilor
14. Concluzie
FodToolbar
este o componentă esențială pentru organizarea controalelor și acțiunilor în interfețe Blazor. Cu opțiuni flexibile pentru spacing și dimensiune, se integrează perfect în diverse contexte - de la bare de aplicație până la secțiuni de filtrare și controale pentru tabele. Simplitatea sa permite personalizare extensivă păstrând în același timp performanța optimă.