Unplanned
Last Updated: 24 Feb 2026 21:46 by Mike
Created by: BENAISSA
Comments: 7
Category: UI for Blazor
Type: Feature Request
85
I would like to be able to customize the keyboard shortcuts in all applicable components in the Telerik UI for Blazor
Unplanned
Last Updated: 23 Feb 2026 08:45 by ADMIN
Created by: Amanatios Amanatidis
Comments: 1
Category: UI for Blazor
Type: Feature Request
1

Hello,

We want the grid column chooser to have a search bar for the user to search what column they need to add/remove to the grid.
We use many non-visible columns in our grid and allow the user to customize what they want to see via the column chooser.  
However, since the user cannot search the available columns they have to scroll with their mouse through a large list to find what they want.
(Notice the scroll bar in the following screenshot)

 

Thank you

Unplanned
Last Updated: 18 Feb 2026 13:35 by ADMIN
Created by: Ivan
Comments: 0
Category: UI for Blazor
Type: Feature Request
0
Add the option to specify the initially selected tool within the Grid's GridToolBarSmartBoxTool. Currently, when the Search, Semantic Search, and the AI Assistant are enabled, the Search tool is selected by default. 
Unplanned
Last Updated: 13 Feb 2026 08:38 by ADMIN
Created by: David
Comments: 1
Category: UI for Blazor
Type: Feature Request
1

Draft feature request (copy/paste)

Title: Add per-column value converters (WPF-style) to Telerik Blazor Grid columns

Product: UI for Blazor → Grid
Type: Feature Request

Description:
In Telerik UI for WPF, grid column definitions can reference a converter by name (e.g., IValueConverter) to transform values for display without writing a custom cell template for each column.

In Telerik UI for Blazor Grid, templates are currently the primary way to change how values render in a column (which works, but becomes repetitive across many columns/grids).

Request:
Add a column-level conversion API that allows specifying a converter/formatter function for display (and optionally editing). Example concepts:

  • Converter="nameof(MyConverters.StatusToText)"

  • or DisplayConverter="(item) => …" / ValueFormatter="Func<TItem, object, string>"

  • optionally ConvertBack-like support for editing scenarios (or separate EditConverter)

Why this is needed:

  • Reduces repeated <Template> markup for simple formatting/transformations

  • Centralizes formatting/conversion logic in reusable code

  • Improves maintainability and consistency across grids

  • Eases migration for teams coming from Telerik WPF where converters are a common pattern

Use cases:

  • Enum/int → user-friendly text

  • Boolean → “Yes/No”, icons, badges

  • Null/empty → placeholder text

  • Code → display name (via lookup)

  • Domain-specific formatting shared across many grids

Workarounds today:

  • Column <Template> or computed properties (both valid, but not as concise/reusable for large grids)

  • Extracting RenderFragments can reduce repetition, but still requires templating infrastructure for what is logically a simple conversion step

Expected behavior:

  • Converter applies consistently anywhere the column renders (cell, export if applicable, etc.)

  • Works with sorting/filtering in a predictable way (ideally sorting/filtering still uses raw field value unless explicitly configured)


 

Unplanned
Last Updated: 05 Feb 2026 11:27 by Daniel

We use QueryableExtensions.ToDataSourceResultmethod to load some data in our component. And at some moment we need to cancel data loading. But ToDataSourceResult method doesn’t support CancellationToken. So we are forced to use a workaround and just ignore the task's result. But task is still executing and causing the performance hit

It would be great if you implemented support for this feature!

Unplanned
Last Updated: 28 Jan 2026 06:51 by ADMIN
Created by: Kelly
Comments: 12
Category: UI for Blazor
Type: Feature Request
67
Once Drag and Drop is available, it would be nice to have Kanban board component with fully configurable cards.
Unplanned
Last Updated: 07 Jan 2026 14:02 by ADMIN
Created by: Isaac
Comments: 3
Category: UI for Blazor
Type: Feature Request
1

Magnifiable Image Component

A Blazor component designed to provide an interactive image magnification experience, similar to popular eCommerce websites.

Features

  • Interactive Magnifier: On mouse hover, a magnifier appears beside the image, following the cursor and displaying a zoomed-in portion of the image. At the same time an overlay appears on the image indicating the zoomed-in portion of the image.
  • Screen Space Awareness: The magnifier dynamically stretches to fill the available space to the right or left of the image, ensuring optimal use of the viewport and consistent margins.
  • Popover Integration: Utilizes Telerik's Popover for the magnifier, ensuring it appears above all other UI elements and avoids clipping or stacking issues.
  • Configurable Magnification: The magnification scale is configurable via the MagnifyScale parameter.
  • Accessibility: The image is wrapped in a button for keyboard accessibility, and all images support alt text.
  • Full-Size View: Clicking the image opens a modal window displaying the image at its actual size.

Sample Code

MagnifiableImage.razor

@inject IJSRuntime JS
@using Microsoft.JSInterop

@* Container *@
<div @ref="_containerRef" class="@($"magnifiable-image-container {Class}")" style="height: @Height;  width: @Width;">
    
    @* Image *@
    <button @onclick="@OnClick" class="magnifiable-image-button">
        <img src="@Image.Src" alt="@Image.Alt" style="height: 100%; width: 100%;"
             @onmousemove="@OnMouseMove" @onmouseenter="@OnMouseEnterAsync" @onmouseleave="@OnMouseLeave"/>
    </button>
    
    @* Magnifier *@
    <TelerikPopover @ref="_popoverRef" AnchorSelector=".magnifiable-image-container" Position="@(_showOnRight ? PopoverPosition.Right : PopoverPosition.Left)" Offset="@MagnifierMargin"
                    Width="@($"{_magnifierWidth}px")" Height="@($"{_magnifierHeight}px")" Class="popover-magnifier" Collision="PopoverCollision.Fit">
        <PopoverContent>
            
            @* Magnified Image *@
            <img src="@Image.Src" alt="@Image.Alt" class="magnified-image"
                 style="@($"width: {_magnifiedImageWidth}px; height: {_magnifiedImageHeight}px; transform: translateX({_magnifiedImageTransformX}px) translateY({_magnifiedImageTransformY}px); left: {_magnifiedImageLeft}px; top: {_magnifiedImageTop}px;")"/>
        
        </PopoverContent>
    </TelerikPopover>
    
    @* Magnifier Overlay *@
    @if (_isMouseOver)
    {
        <div class="magnifier-overlay" 
             style="@($"width: {_magnifierOverlayWidth}px; height: {_magnifierOverlayHeight}px; transform: translateX({_magnifierOverlayTransformX}px) translateY({_magnifierOverlayTransformY}px);  left: {_magnifierOverlayLeft}px; top: {_magnifierOverlayTop}px;")))">
        </div>
    }
    
    @* Actual Image *@
    <TelerikWindow @bind-Visible="@_isClicked" Modal="true" CloseOnOverlayClick="true" Draggable="false" Resizable="false" Class="window-rounded">
        <WindowActions>
            <WindowAction Name="Close"/>
        </WindowActions>
        <WindowContent>
            <img src="@Image.Src" alt="@Image.Alt"/>
        </WindowContent>
    </TelerikWindow>
    
</div>

<style>
    .magnifiable-image-container {
        position: relative;
        display: inline-block;
        cursor: zoom-in;
    }
    
    .magnifiable-image-button {
        background: none;
        border: none;
        padding: 0;
        margin: 0;
        font: inherit;
        color: inherit;
        cursor: inherit !important;
        outline: none;
        box-shadow: none;
        appearance: none;
        -webkit-appearance: none;
        -moz-appearance: none;
        display: block;
        width: 100%;
        height: 100%;
    }
        .magnifiable-image-button:focus-visible {
            outline: none;
            box-shadow: 0 0 0 2px color-mix(in srgb, var(--kendo-color-on-app-surface, #424242) 50%, transparent);
        }
    
    .popover-magnifier {
        overflow: hidden;
        border-radius: 0;
        position: relative;
        top: @(_adjustForTelerikFit ? $"{(_showOnBottom ? "" : "-")}{MagnifierMargin/4}px" : $"{(_showOnBottom ? "" : "-")}{MagnifierMargin}px");
    }
    
    .magnified-image {
        position: absolute;
    }
    
    .magnifier-overlay {
        position: absolute;
        background: color-mix(in srgb, var(--kendo-color-primary, #1274AC) 15%, transparent);
        pointer-events: none;
        z-index: 5;
        box-sizing: border-box;
        display: block;
    }
</style>

@code 
{
    [Parameter] public required ImageInfo Image { get; set; }

    /// <summary>
    /// The height of the image (e.g., "200px", "100%", or "auto"). Default is "auto".
    /// </summary>
    [Parameter]
    public string Height { get; set; } = "auto";

    /// <summary>
    /// The width of the image (e.g., "200px", "100%", or "auto"). Default is "auto".
    /// </summary>
    [Parameter]
    public string Width { get; set; } = "auto";

    /// <summary>
    /// The magnification scale for the magnifier. Default is 3 (3x magnification).
    /// </summary>
    [Parameter] 
    public double MagnifyScale { get; set; } = 3;

    /// <summary>
    /// Applies additional CSS classes to the MagnifiableImage's root element for custom styling and visual modifications.
    /// </summary>
    [Parameter]
    public string Class { get; set; } = string.Empty;

    private const int MagnifierMargin = 24;
    
    // State for magnifier visibility and container reference
    private bool _isMouseOver;
    private bool _isClicked;
    private ElementReference _containerRef;
    private TelerikPopover? _popoverRef;

    // Image and magnified image dimensions
    private double _imageWidth;
    private double _imageHeight;
    private double _magnifiedImageWidth;
    private double _magnifiedImageHeight;
    
    // Magnifier position and size
    private bool _showOnRight = true;
    private bool _showOnBottom = true;
    private bool _adjustForTelerikFit;
    private double _magnifierWidth;
    private double _magnifierHeight;

    // Magnified image offset within the magnifier
    private double _magnifiedImageLeft;
    private double _magnifiedImageTop;
    
    // Mouse position clamping bounds
    private double _minMouseX;
    private double _minMouseY;
    private double _maxMouseX;
    private double _maxMouseY;
    
    // Mouse position and transform for magnified image
    private double _mouseX;
    private double _mouseY;
    private double _magnifiedImageTransformX;
    private double _magnifiedImageTransformY;

    // Magnifier overlay size and transform
    private double _magnifierOverlayWidth;
    private double _magnifierOverlayHeight;
    private double _magnifierOverlayLeft;
    private double _magnifierOverlayTop;
    private double _magnifierOverlayTransformX;
    private double _magnifierOverlayTransformY;

    private void OnClick()
    {
        _isClicked = true;
    }

    private async Task OnMouseEnterAsync()
    {
        _isMouseOver = true;
        _popoverRef?.Show();
        
        // Get layout info about the image container using getElementLayoutInfo from wwwroot/js/magnifiable-image.js
        var containerLayoutInfo = await JS.InvokeAsync<ElementLayoutInfo>("getElementLayoutInfo", _containerRef);
        
        // Store image size
        _imageWidth = containerLayoutInfo.Width;
        _imageHeight = containerLayoutInfo.Height;
        _magnifiedImageWidth = _imageWidth * MagnifyScale;
        _magnifiedImageHeight = _imageHeight * MagnifyScale;
        
        // Determine magnifier position based on available space
        _showOnRight = containerLayoutInfo.DistanceFromViewportRight >= containerLayoutInfo.DistanceFromViewportLeft;
        _adjustForTelerikFit = Math.Abs(containerLayoutInfo.DistanceFromViewportBottom - containerLayoutInfo.DistanceFromViewportTop) < 20;
        _showOnBottom = containerLayoutInfo.DistanceFromViewportBottom >= containerLayoutInfo.DistanceFromViewportTop;
        
        // Calculate magnifier size based on available space
        _magnifierWidth = _showOnRight 
            ? containerLayoutInfo.DistanceFromViewportRight - MagnifierMargin*2
            : containerLayoutInfo.DistanceFromViewportLeft - MagnifierMargin*2;
        _magnifierHeight = containerLayoutInfo.ViewportHeight - MagnifierMargin*2;
        
        // Center the magnified image in the magnifier
        _magnifiedImageLeft = (_magnifierWidth / 2) - (_imageWidth / 2); 
        _magnifiedImageTop = (_magnifierHeight / 2) - (_imageHeight / 2);
        
        // Calculate min and max mouse X/Y to prevent showing empty space in the magnifier
        _minMouseX = Math.Floor((_magnifierWidth / MagnifyScale) / 2);
        _minMouseY = Math.Floor((_magnifierHeight / MagnifyScale) / 2); 
        _maxMouseX = Math.Ceiling(_imageWidth - ((_magnifierWidth / MagnifyScale) / 2));
        _maxMouseY = Math.Ceiling(_imageHeight - ((_magnifierHeight / MagnifyScale) / 2));

        // Calculate magnifier overlay size and position
        _magnifierOverlayWidth = Math.Floor(Math.Clamp(_magnifierWidth / MagnifyScale, 0, _imageWidth)) - 1;
        _magnifierOverlayHeight = Math.Floor(Math.Clamp(_magnifierHeight / MagnifyScale, 0, _imageHeight)) - 1;
        _magnifierOverlayLeft = -((_magnifierOverlayWidth / 2) + 1);
        _magnifierOverlayTop = -((_magnifierOverlayHeight / 2) + 1);
    }

    private void OnMouseLeave()
    {
        _isMouseOver = false;
        _popoverRef?.Hide();
    }

    private void OnMouseMove(MouseEventArgs e)
    {
        // Clamp mouse X/Y to prevent showing empty space in the magnifier
        if (_minMouseX > _maxMouseX) _mouseX = _imageWidth / 2;
        else _mouseX = Math.Clamp(e.OffsetX, _minMouseX, _maxMouseX);
        if (_minMouseY > _maxMouseY) _mouseY = _imageHeight / 2;
        else _mouseY = Math.Clamp(e.OffsetY, _minMouseY, _maxMouseY);
        
        // Calculate the transform for the magnified image
        _magnifiedImageTransformX = -Math.Round((_mouseX * MagnifyScale) - (_imageWidth / 2));
        _magnifiedImageTransformY = -Math.Round((_mouseY * MagnifyScale) - (_imageHeight / 2));

        // Calculate the transform for the magnifier overlay
        _magnifierOverlayTransformX = Math.Round(_mouseX);
        _magnifierOverlayTransformY = Math.Round(_mouseY);
        
        _popoverRef?.Refresh();
    }

    private record ElementLayoutInfo(
        double Width, 
        double Height, 
        double ViewportHeight,
        double DistanceFromViewportLeft, // distance from viewport's left edge to element's left edge
        double DistanceFromViewportRight, // distance from element's right edge to viewport's right edge
        double DistanceFromViewportTop, // distance from viewport's top edge to element's top edge
        double DistanceFromViewportBottom); // distance from element's bottom edge to viewport's bottom edge
}

magnifiable-image.js

// Returns width, height, and the space to the left and right of the element relative to the viewport
window.getElementLayoutInfo = (element) => {
    if (!element) return null;
    const elementRect = element.getBoundingClientRect();
    return {
        width: elementRect.width,
        height: elementRect.height,
        viewportHeight: window.innerHeight,
        distanceFromViewportLeft: elementRect.left, // distance from viewport's left edge to element's left edge
        distanceFromViewportRight: window.innerWidth - elementRect.right, // distance from element's right edge to viewport's right edge
        distanceFromViewportTop: elementRect.top, // distance from viewport's top edge to element's top edge
        distanceFromViewportBottom: window.innerHeight - elementRect.bottom // distance from element's bottom edge to viewport's bottom edge
    };
};

Note

Only tested in Blazor WebAssembly. The component may see performance issues in Blazor Server.

Unplanned
Last Updated: 31 Dec 2025 10:54 by ADMIN
Created by: The Telerik
Comments: 0
Category: UI for Blazor
Type: Feature Request
0
Add Hourly Frequecy  option in In-bulit  Recurrence Frequecy Tabs
Unplanned
Last Updated: 26 Nov 2025 08:46 by Janick

Please expose the popup collision settings of the Popup and Popover components to all other applicable components, such as:

  • AutoComplete
  • ColorPicker
  • ComboBox
  • DropDownList
  • DatePicker
  • DateRangePicker
  • DateTimePicker
  • MultiColumnComboBox
  • MultiSelect
  • TimePicker
  • Tooltip
Unplanned
Last Updated: 14 Nov 2025 13:57 by ADMIN
Created by: Stefan
Comments: 0
Category: UI for Blazor
Type: Feature Request
1
Please add Blazor OTP input control
Unplanned
Last Updated: 13 Nov 2025 18:18 by Rob

I realize we can build Blazor components to associate "label" to controls, but IMHO, this should come standard with any control tool set. Reasons:

1.  Coding simplicity

2.  Automatic theme inheritance

3.  Flexibility in label positioning relative to the control (left, right, top, bottom)

Example:

<TelerikCheckBox Label="Is Chasssis" LabelPosition="left" @bind-Value="equipment.IsChassis"/>

 

I realize you folks put some effort into a "Floating Label", but my users have rejected this implementation because:

1.  Having Text in a label as a means to identify the label makes them think a value is already provided (so they try to remove it or call for support).

2.  When typing in the label and the appearance of the label identification appears above adds to their confusion as they are used to seeing validation errors appearing above a label.

 

 

 

Unplanned
Last Updated: 11 Nov 2025 11:03 by ADMIN
Created by: Kinga
Comments: 3
Category: UI for Blazor
Type: Feature Request
20

Hi,

is it possible to add control of vertical timeline like this (https://antblazor.com/en-US/components/timeline) with extra features like:

  • adding new items with button on top
  • inline edit
  • item selection
  • item actions

I also attached image of what i build based on control from link above, I would like to implement something similar with Telerik.

Maybe you can recommend some other controls to replace it with?

Thank you :)

Unplanned
Last Updated: 10 Nov 2025 10:33 by ADMIN
The IsEntityFrameworkProvider method in the DataSource package returns false when the provider is Entity Framework Core. 
Unplanned
Last Updated: 27 Oct 2025 11:21 by Deasun
Created by: Emil
Comments: 4
Category: UI for Blazor
Type: Feature Request
7
Is there a chance that there will be added a Treemap component in the near future?
Unplanned
Last Updated: 22 Oct 2025 07:54 by Ak
Make the demos possible to launch from a desktop shortcut, similarly to the UI for ASP.NET Core demos. 
Unplanned
Last Updated: 09 Oct 2025 09:48 by ADMIN
Created by: Olivier
Comments: 0
Category: UI for Blazor
Type: Feature Request
0

Hi !

I tried using the combobox but, since my datasource is too big and I need grouping, therefore virtualization is not possible, I need to do the filtering on the server side, using the OnRead method to fetch my data based on what the user has entered in the input field. The problem is that the client side filtering is always active and I can't reproduce the same type of filtering I do server side on the client side and I lose some results. I think it would be really nice if we could specify to not filter client side or something like that, to give us more control.

Thank you very much !

Unplanned
Last Updated: 06 Oct 2025 14:21 by Sadik

Description

Affected components: those inheriting from TelerikInputBase (e.g., TelerikDatePicker). When an exception is thrown inside an async Task event handler for the OnChange, OnBlur, OnOpen, and ValueChanged events, the exception is completely and silently swallowed. The exception is not caught by ErrorBoundary.

Related: #6333, #12364

Steps To Reproduce

  1. Use a standard ErrorBoundary in MainLayout.razor.
<ErrorBoundary>
    <ChildContent>
        @Body
    </ChildContent>
    <ErrorContent>
        <p class="error">An unhandled error has occurred.</p>
    </ErrorContent>
</ErrorBoundary>
  1. Declare a TelerikDatePicker and bind an async Task method to the ValueChanged or OnChange event.
<TelerikDatePicker Value="@DatePickerValue"
                   ValueChanged="@((DateTime inputDate) => OnDatePickerValueChanged(inputDate))">
</TelerikDatePicker>


<TelerikButton OnClick="@(() => throw new Exception("Exception from button"))">Click to test ErrorBoundary</TelerikButton>

@code {
    private DateTime DatePickerValue { get; set; } = DateTime.Today;

    private async Task OnDatePickerValueChanged(DateTime newValue)
    {
        throw new InvalidOperationException("This exception should be caught by the ErrorBoundary!");
    }
}
  1. Run the page and select a date in the DatePicker.

Actual Behavior

The exception thrown in the OnDatePickerValueChanged event handler is not caught by ErrorBoundary.

Expected Behavior

The exception thrown in the OnDatePickerValueChanged event handler is caught by ErrorBoundary.

Browser

All

Last working version of Telerik UI for Blazor (if regression)

No response

Unplanned
Last Updated: 06 Oct 2025 14:03 by Sadik

Description

Affected components: those inheriting from TelerikSelectBase (e.g., TelerikDropDownList, TelerikComboBox, TelerikMultiSelect, TelerikAutoComplete). When an exception is thrown inside an async Task event handler for the OnChange, OnBlur, OnOpen, and ValueChanged events, the exception is completely and silently swallowed. The exception is not caught by ErrorBoundary.

Related: #6333

Steps To Reproduce

Steps to Reproduce

  1. Use a standard ErrorBoundary in MainLayout.razor.
<ErrorBoundary>
    <ChildContent>
        @Body
    </ChildContent>
    <ErrorContent>
        <p class="error">An unhandled error has occurred.</p>
    </ErrorContent>
</ErrorBoundary>
  1. Declare a TelerikDropDownList and bind an async Task method to the ValueChanged or OnChange event.
<TelerikDropDownList 
    Data="@DropDownData"                  
    ValueChanged="@( (int newValue) => OnDropDownValueChanged(newValue))"       
    TextField="@nameof(TestItem.Name)"
    ValueField="@nameof(TestItem.Id)" />

<TelerikButton OnClick="@(() => throw new Exception("Exception from button"))">Click to test ErrorBoundary</TelerikButton>

@code {
    private int? SelectedDropDownValue;

    private List<TestItem> DropDownData = new()
    {
        new() { Id = 1, Name = "Select me to throw exception" },
    };

    private async Task OnDropDownValueChanged(int newValue)
    {
        throw new InvalidOperationException("This exception should be caught by the ErrorBoundary!");
    }

    public class TestItem
    {
        public int Id { get; set; }
        public string Name { get; set; } = string.Empty;
    }
}
  1. Run the page and select the item in the DropDownList's list.

Actual Behavior

The exception thrown in the OnDropDownValueChanged event handler is not caught by ErrorBoundary.

Expected Behavior

The exception thrown in the OnDropDownValueChanged event handler is caught by ErrorBoundary.

Browser

All

Last working version of Telerik UI for Blazor (if regression)

No response

Unplanned
Last Updated: 26 Sep 2025 08:08 by ADMIN
Created by: improwise
Comments: 9
Category: UI for Blazor
Type: Feature Request
58

I'd like to have an ExpansionPanel component where I can declare my desired panel instances and their content in the markup.

Similar to https://www.telerik.com/kendo-angular-ui/components/layout/expansionpanel/

Unplanned
Last Updated: 19 Sep 2025 09:46 by Thomas

One really nice feature MudBlazor UI has is the Dialog component. You can pass a component to the Dialog Service and it will display it in a modal dialog.

Existing Example

An example of this would be:

             var orderParams = new DialogParameters();
                orderParams.Add("SelectedOrderHeader", Item);
                orderParams.Add("EditMode", "Add");
                orderParams.Add("SelectedOrderDetail", new OMSOrderDetail());
          
                DialogService.Show<OrdersDetailForm>("Click on orders grid to continue", orderParams);

 

<OrderDetailsForm> is a custom Blazor component.

Does the Telerik Blazor dev team have any plans for implementing something like this?

          
1 2 3 4 5 6