@foreach (var item in Items)
{
var isSelected = string.Equals(item.Value, SelectedValue, StringComparison.Ordinal);
var tabIndex = isSelected || (!HasSelectedValue && string.Equals(item.Value, FirstEnabledValue, StringComparison.Ordinal)) ? 0 : -1;
}
@code {
[Parameter]
public IReadOnlyList Items { get; set; } = [];
[Parameter]
public string? SelectedValue { get; set; }
[Parameter]
public EventCallback SelectedValueChanged { get; set; }
[Parameter]
public string AriaLabel { get; set; } = "Options";
[Parameter]
public string? CssClass { get; set; }
private bool HasSelectedValue =>
!string.IsNullOrWhiteSpace(SelectedValue) && Items.Any(item => !item.IsDisabled && string.Equals(item.Value, SelectedValue, StringComparison.Ordinal));
private string? FirstEnabledValue =>
Items.FirstOrDefault(item => !item.IsDisabled)?.Value;
private string BuildCssClass() =>
string.IsNullOrWhiteSpace(CssClass) ? "segmented-tabs" : $"segmented-tabs {CssClass}";
private Task SelectAsync(string value) =>
SelectedValueChanged.InvokeAsync(value);
private async Task HandleKeyDownAsync(KeyboardEventArgs args, string currentValue)
{
var enabledItems = Items.Where(item => !item.IsDisabled).ToList();
if (enabledItems.Count == 0)
{
return;
}
var currentIndex = enabledItems.FindIndex(item => string.Equals(item.Value, currentValue, StringComparison.Ordinal));
if (currentIndex < 0)
{
currentIndex = 0;
}
var nextValue = args.Key switch
{
"ArrowRight" or "ArrowDown" => enabledItems[Math.Min(currentIndex + 1, enabledItems.Count - 1)].Value,
"ArrowLeft" or "ArrowUp" => enabledItems[Math.Max(currentIndex - 1, 0)].Value,
"Home" => enabledItems[0].Value,
"End" => enabledItems[^1].Value,
_ => null
};
if (string.IsNullOrWhiteSpace(nextValue))
{
return;
}
await SelectAsync(nextValue);
}
}