- reset background/border/shadow on :not(.is-open) so hover/focus cannot leak the panel look
- return focus to the button only on Escape close, not on outside-click
- add a :focus-visible ring on the toggle button for keyboard users
- keep the info line visible in the popover
- namespace and unbind the toggle handlers to avoid stacking on re-init
Add an ITimezoneProvider.ConvertUnspecifiedToUtc helper that computes the
UTC ticks and keeps boundary values unchanged instead of throwing, then use
it in the System.Text.Json and Newtonsoft converters and the MVC model
binder. Normalize the Volo.Docs commit date filters to UTC for consistency.
AbpDateTimeConverterBase.Normalize converts an Unspecified DateTime to UTC via
`new DateTimeOffset(value, offset).UtcDateTime` when the clock is UTC and a user
timezone is set. For values within the timezone offset distance of
DateTime.MinValue/MaxValue (most notably the DateTime.MinValue placeholder), this
throws ArgumentOutOfRangeException. The exception was swallowed and logged as
"Could not convert DateTime with unspecified Kind using timezone '...'." on every
serialization, flooding logs for positive-offset users (e.g. Asia/Shanghai +08:00).
Catch the boundary ArgumentOutOfRangeException explicitly, keep the value unchanged,
and log it at Debug level instead of Warning so it stays traceable without polluting
production logs. Other unexpected failures still log a warning.
Also make Volo.Docs GitHubDocumentSource return a Utc-kind placeholder
(DateTime.SpecifyKind(DateTime.MinValue, Utc)) and use Author.Date.UtcDateTime, so it
no longer emits Unspecified placeholders in the first place.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Index.cshtml.cs: cache the rendered parameter name set so
IsParameterVisible doesn't allocate a HashSet per call inside the cshtml
loop; clarify per-rule semantics in comments (empty allow-list is an
explicit "never show", null/unknown-key rules fail-open)
- forms-validation.md: drop the inaccurate IValidationRule reference and
describe MudBlazor's actual validation surface (ValidationAttribute on
the Validation parameter, Func<T,string>/Func<T,IEnumerable<string>>,
optional FluentValidation)
- book-store/part-02.md: use {(int)context.Item.Type} for the BookType
localization key to stay consistent with the rest of the tutorial
- Introduce a new "BlazorUI" doc-params dimension (Blazorise / MudBlazor) so
Blazor docs can show MudBlazor variants of code samples next to the existing
Blazorise ones
- Cover framework/ui/blazor (overall, theming, basic-theme, forms-validation,
submit-button, page-layout, page-header, page-toolbar-extensions,
entity-action-extensions, data-table-column-extensions, error-handling,
customization-overriding-components)
- Cover ui-themes (index, basic-theme, lepton-x, lepton-x-lite)
- Cover tutorials (book-store part 02/03/09/10, todo single-layer/layered,
modular-crm part 03/05/06, book-store-with-abp-suite part-05)
- Add an optional "DependsOn" map to DocumentParameterDto so a parameter can
be hidden when dependencies aren't satisfied (e.g. only show BlazorUI when
UI is one of Blazor/BlazorServer/BlazorWebApp). Visibility is evaluated on
the server in the project document index page.
Introduces support for extracting SEO metadata from document content by adding a new DocumentSeoDto, updating renderers to handle a new [doc-seo] section, and exposing this data in the project document page. The page now uses the SEO description if available, improving meta tag generation. Also adds error handling for scrollspy initialization in vs.js.
Moved the TOC generation for documents to occur after navigation DTO initialization, ensuring TOC items are generated only when document content is available. This improves code clarity and maintains correct TOC population.
Relocated ITocGeneratorService and TocHeading to the Application.Contracts project, and TocGeneratorService to the Application project. This improves project structure by separating contracts and implementations from the web layer.
Replaces the use of a fixed max TOC level with a level count parameter in TOC generation methods and logic. This change improves flexibility by allowing the number of heading levels included in the TOC to be specified, rather than a maximum heading level value.
Enhanced TocGeneratorService by refactoring heading parsing, optimizing inline text extraction, and improving handling of empty or invalid markdown. Added helper methods for pipeline creation, heading construction, and inline processing for better readability and maintainability.
Replaces flat TocHeading list with hierarchical TocItem structure for document table of contents. Updates rendering logic, service interface, and implementation to support nested headings and configurable levels.
Added checks for the presence of the 'Closer' string before substring operations in ScribanDocumentSectionRenderer. This prevents exceptions when the closer is not found in the document content.
Updated the TableOfContents partial to accept a List<TocHeading> instead of the full IndexModel, simplifying its interface. Adjusted the Index.cshtml to pass Model.TocHeadings directly. Removed the unused TableOfContents.cshtml.cs code-behind file.
Replaces the internal Heading record in TocGeneratorService with a new public TocHeading record class. Updates all references and method signatures to use TocHeading, improving code clarity and reusability.
Replaces HTML-based TOC generation with a model-based approach by extracting heading data from markdown and rendering the table of contents via a new partial view. Removes the custom Markdig extension and related classes, updates the service interface, and adapts the page model and views to use the new heading list.
Replaces the previous HTML-based table of contents (TOC) extraction using HtmlAgilityPack with a Markdig-based approach. Introduces custom Markdig extensions and renderers to extract headings directly from markdown, updates the TOC service and interface, and removes the HtmlAgilityPack dependency from the project.
Introduces a Heading record to replace tuple usage for TOC headings, improving code readability and maintainability. Updates related logic in TocGeneratorService to use the new Heading type and adds constants for heading levels.
Replaces client-side TOC generation with a new ITocGeneratorService and TocGeneratorService using HtmlAgilityPack. Updates the project page to render the TOC from the server, removes bootstrap-toc dependencies, and adjusts related JS and CSS for the new TOC structure. Adds HtmlAgilityPack as a dependency.