Formats, quote prefixes and hyperlinks are now copied, empty source
cells blank their destinations and cut clears the source, matching
Excel. Entering a value over a formula cell replaces the formula, quote
prefixed entries store literal text and undo restores cells exactly as
captured, including after redo.
Breaking change: RangeSnapshotCommandBase snapshots cells as detached
clones (Dictionary<CellRef, Cell?>) instead of a value/formula/format
tuple.
For IDictionary data the aggregate Property is a dynamic LINQ expression, so
reflection cannot resolve its type and isNumeric was always false, causing
Sum/Average/Min/Max to degrade to Count. Fall back to the configured Type when
reflection fails, mirroring RadzenPivotField.FilterPropertyType.
CJK, kana, hangul, fullwidth forms and emoji render at roughly twice
the digit width (15.25px regular / 15.75px bold, measured against
Excel), so the ASCII fallback under-sized such columns by half. Runs
over runes so surrogate pairs count as one glyph.
A width that snugly fits content rendered with the browser theme font
can clip in Excel, which renders the Normal style font with different
character widths - most visibly currency values whose digits are wider
in Aptos Narrow than in typical UI fonts.
On export, auto fitted columns recompute their width from the column
content using per-character advance widths of Aptos Narrow 11 measured
against Excel (regular and bold), keeping the larger of the model width
and the required width. The in-component width is unchanged.
Canvas metrics of the theme font differ from what other renderers use
for the same content (Excel renders exported columns with the Normal
style font), so an exact fit can clip after export. 3% covers the
observed drift while keeping the in-component fit tight.
Exported files write Aptos Narrow 11 as the Normal style font but column
widths were converted with Calibri 11's 7px maximum digit width, and
columns at the default width were not exported at all - Excel applied
its own 68px default and numeric cells overflowed as ####.
XLSX column widths are measured in characters of the Normal font's
maximum digit width (ISO/IEC 29500 18.3.1.13). Excel renders Aptos
Narrow 11 columns at 7.5px per character (measured empirically), so the
conversion now uses a per-font digit width - 7.5 for Aptos Narrow,
scaled by font size, 7 for Calibri and other fonts - selected from the
file's Normal font on read. The default column width is persisted as
sheetFormatPr defaultColWidth and restored on load, so default-width
columns render at the same pixel width in Excel as in the component.
Replaces the character-count width estimate with Excel-faithful auto fit:
the displayed text (number format applied to the evaluated value) of the
column's populated cells is measured with canvas.measureText using the
active theme's cell font, so formulas, number formats, bold and
conditional formatting fit correctly in any theme. Empty columns keep
their width, merged cells are ignored, hidden rows are included and the
width is clamped to Excel's 255 character limit. The behavior was
verified against Excel via COM automation.
Auto fitted columns are tracked per column and persisted as bestFit in
XLSX; manual resize and undo clear the flag.
Add explicit TagName to RadzenText usages that rendered real heading
elements (H1-H6, DisplayH1-H6, Subtitle1/2) purely for visual styling,
and convert raw HTML headings in examples to RadzenText with proper
TextStyle and TagName. Visual labels now render as <p>, genuine
headings use correct levels without skips (WCAG 1.3.1).
Fixes#2596
RadzenFormField rendered for="@Component" on the wrapping <div> (invalid - <div>
does not take for) and on the label even when Component was unset, producing for=""
which accessibility checkers flag as a label with no association. Removed the div
for and only emit the label for when Component is set. Updated the FormFieldTextBox
demo to give each input an id matching the FormField Component so the label resolves.
The chart tooltip is driven by the chart's mousemove and closes on plot mouseleave,
so moving the pointer onto the tooltip (which overlays the plot) counted as leaving
the chart and dismissed it. Make the chart tooltip container pointer-events: none so
the pointer passes through to the chart, which keeps tracking and the tooltip stays
visible. Normal (non-chart) tooltips keep pointer-events: auto.
The .rz-switch focus styles targeted the wrapper, but the focusable element is the
visually hidden input, so :focus / :focus-visible never matched. Use :focus-within
and :has(:focus-visible) so the wrapper reflects the input's keyboard focus.
RadzenTree only moved focusedIndex on Arrow/Home/End without scrolling, so the
focused node could end up off-screen below the scroll viewport. OnKeyPress now
scrolls the active item into view via a new Radzen.scrollIntoViewIfNeededById JS
helper. Also gate the TreeCheckBoxes demo ItemRender so it only forces the first
category to indeterminate before it has been expanded (the tree cannot know child
checked states until the branch is expanded).
RadzenSwitch wrapped its hidden input in a <label> used purely for styling, which
accessibility checkers flag as an empty form label (a label with no text content).
The wrapper is now a <span> with an onclick that toggles the switch, and the input
stops click propagation so Space does not double-toggle. External RadzenLabel/for
association to the input id is unchanged.
In Server RenderMode a collapsed expandable item rendered an empty <ul role="menu">,
which is invalid ARIA (a menu must contain at least one menuitem) and is flagged by
accessibility checkers. The submenu (Expander + ul) is now rendered only when it has
content, and aria-controls references it only when it exists.
Adds PanelMenuRenderMode (Client default, Server) so large menus can keep the
DOM small by rendering child items only while their parent is expanded.
- RadzenPanelMenu.RenderMode parameter; child content gated on expanded in Server mode.
- Keyboard expand decisions (Enter/Space, ArrowRight) key off ChildContent instead of
rendered items.Count so collapsed branches expand in Server mode.
- Fix focus/selection loss on collapse: RadzenPanelMenuItem.Dispose now routes nested
items to ParentItem.RemoveItem (matching AddItem) instead of Parent.RemoveItem, which
reset focusedIndex/currentItems.
- Keep the expand arrow visible for expandable items with no rendered children in Server
mode via the rz-navigation-item-expandable class.