diff --git a/Radzen.Blazor.Tests/TextTests.cs b/Radzen.Blazor.Tests/TextTests.cs index 482b4c19b..d0b1e5316 100644 --- a/Radzen.Blazor.Tests/TextTests.cs +++ b/Radzen.Blazor.Tests/TextTests.cs @@ -312,5 +312,38 @@ namespace Radzen.Blazor.Tests Assert.Contains("section-title", component.Markup); Assert.Contains("rz-link", component.Markup); } + + [Fact] + public void Text_Anchor_Renders_DefaultScreenReaderText() + { + using var ctx = new TestContext(); + ctx.JSInterop.Mode = JSRuntimeMode.Loose; + + var component = ctx.RenderComponent(parameters => + { + parameters.Add(p => p.TextStyle, TextStyle.H2); + parameters.Add(p => p.Text, "Section Title"); + parameters.Add(p => p.Anchor, "section-title"); + }); + + Assert.Contains(@"Link to this section", component.Markup); + } + + [Fact] + public void Text_Anchor_Renders_CustomScreenReaderText() + { + using var ctx = new TestContext(); + ctx.JSInterop.Mode = JSRuntimeMode.Loose; + + var component = ctx.RenderComponent(parameters => + { + parameters.Add(p => p.TextStyle, TextStyle.H2); + parameters.Add(p => p.Text, "Section Title"); + parameters.Add(p => p.Anchor, "section-title"); + parameters.Add(p => p.AnchorAriaLabel, "Link to Section Title"); + }); + + Assert.Contains(@"Link to Section Title", component.Markup); + } } } diff --git a/Radzen.Blazor/RadzenStrings.Designer.cs b/Radzen.Blazor/RadzenStrings.Designer.cs index 175fbe503..807f17ae0 100644 --- a/Radzen.Blazor/RadzenStrings.Designer.cs +++ b/Radzen.Blazor/RadzenStrings.Designer.cs @@ -603,6 +603,7 @@ namespace Radzen.Blazor { public static string TimeSpanPicker_SecondsUnitText { get { return ResourceManager.GetString("TimeSpanPicker_SecondsUnitText", resourceCulture); } } public static string TimeSpanPicker_MillisecondsUnitText { get { return ResourceManager.GetString("TimeSpanPicker_MillisecondsUnitText", resourceCulture); } } public static string TimeSpanPicker_MicrosecondsUnitText { get { return ResourceManager.GetString("TimeSpanPicker_MicrosecondsUnitText", resourceCulture); } } + public static string Text_AnchorAriaLabel { get { return ResourceManager.GetString("Text_AnchorAriaLabel", resourceCulture); } } public static string Upload_ImageAlternateText { get { return ResourceManager.GetString("Upload_ImageAlternateText", resourceCulture); } } public static string Upload_ChooseText { get { return ResourceManager.GetString("Upload_ChooseText", resourceCulture); } } public static string Upload_DeleteText { get { return ResourceManager.GetString("Upload_DeleteText", resourceCulture); } } diff --git a/Radzen.Blazor/RadzenStrings.de.resx b/Radzen.Blazor/RadzenStrings.de.resx index c0fb8dcfd..d8847bb36 100644 --- a/Radzen.Blazor/RadzenStrings.de.resx +++ b/Radzen.Blazor/RadzenStrings.de.resx @@ -2233,5 +2233,7 @@ Die ausgewählten Zellen müssen einen gültigen rechteckigen Bereich bilden, bevor sie verbunden werden können. + + Link zu diesem Abschnitt \ No newline at end of file diff --git a/Radzen.Blazor/RadzenStrings.es.resx b/Radzen.Blazor/RadzenStrings.es.resx index c20272cd8..54e6291f0 100644 --- a/Radzen.Blazor/RadzenStrings.es.resx +++ b/Radzen.Blazor/RadzenStrings.es.resx @@ -2233,5 +2233,7 @@ Las celdas seleccionadas deben formar un rango rectangular válido antes de poder combinarse. + + Enlace a esta sección \ No newline at end of file diff --git a/Radzen.Blazor/RadzenStrings.fr.resx b/Radzen.Blazor/RadzenStrings.fr.resx index cb91a55fb..08f397755 100644 --- a/Radzen.Blazor/RadzenStrings.fr.resx +++ b/Radzen.Blazor/RadzenStrings.fr.resx @@ -2233,5 +2233,7 @@ Les cellules sélectionnées doivent former une plage rectangulaire valide avant de pouvoir être fusionnées. + + Lien vers cette section \ No newline at end of file diff --git a/Radzen.Blazor/RadzenStrings.it.resx b/Radzen.Blazor/RadzenStrings.it.resx index 696f8516a..389d4e27c 100644 --- a/Radzen.Blazor/RadzenStrings.it.resx +++ b/Radzen.Blazor/RadzenStrings.it.resx @@ -2233,5 +2233,7 @@ Le celle selezionate devono formare un intervallo rettangolare valido prima di poter essere unite. + + Collegamento a questa sezione \ No newline at end of file diff --git a/Radzen.Blazor/RadzenStrings.ja.resx b/Radzen.Blazor/RadzenStrings.ja.resx index f7cf0c97f..5b373b5d4 100644 --- a/Radzen.Blazor/RadzenStrings.ja.resx +++ b/Radzen.Blazor/RadzenStrings.ja.resx @@ -2233,5 +2233,7 @@ 選択したセルを結合するには、有効な長方形の範囲になっている必要があります。 + + このセクションへのリンク \ No newline at end of file diff --git a/Radzen.Blazor/RadzenStrings.resx b/Radzen.Blazor/RadzenStrings.resx index 6ae6710b3..033ef7515 100644 --- a/Radzen.Blazor/RadzenStrings.resx +++ b/Radzen.Blazor/RadzenStrings.resx @@ -2243,5 +2243,7 @@ The selected cells must form a valid rectangular range before they can be merged. + + Link to this section diff --git a/Radzen.Blazor/RadzenText.cs b/Radzen.Blazor/RadzenText.cs index 8f77d3fb7..832bdb700 100644 --- a/Radzen.Blazor/RadzenText.cs +++ b/Radzen.Blazor/RadzenText.cs @@ -124,6 +124,9 @@ namespace Radzen.Blazor [Parameter] public string? Path { get; set; } + [Parameter] + public string? AriaLabel { get; set; } + private string GetAnchor() { if (string.IsNullOrEmpty(Path)) @@ -179,6 +182,10 @@ namespace Radzen.Blazor builder.OpenComponent(7); builder.AddAttribute(8, "Icon", "link"); builder.CloseComponent(); + builder.OpenElement(9, "span"); + builder.AddAttribute(10, "class", "rz-sr-only"); + builder.AddContent(11, AriaLabel); + builder.CloseElement(); builder.CloseElement(); } @@ -244,6 +251,20 @@ namespace Radzen.Blazor [Parameter] public string? Anchor { get; set; } + string? anchorAriaLabel; + + /// + /// Gets or sets the visually hidden text of the anchor link rendered when is set. + /// Provides an accessible name for the anchor link. Localizable via the Text_AnchorAriaLabel resource key. + /// + /// The anchor link label. Default is "Link to this section". + [Parameter] + public string AnchorAriaLabel + { + get => anchorAriaLabel ?? Localize(nameof(RadzenStrings.Text_AnchorAriaLabel)); + set => anchorAriaLabel = value; + } + /// protected override void BuildRenderTree(RenderTreeBuilder builder) { @@ -423,9 +444,10 @@ namespace Radzen.Blazor { builder.OpenComponent(6); builder.AddAttribute(7, nameof(RadzenTextAnchor.Path), Anchor); + builder.AddAttribute(8, nameof(RadzenTextAnchor.AriaLabel), AnchorAriaLabel); builder.CloseComponent(); } - builder.AddElementReferenceCapture(8, capture => Element = capture); + builder.AddElementReferenceCapture(9, capture => Element = capture); builder.CloseElement(); } }