Changelog #
All notable changes to this project are documented here. The format follows Keep a Changelog and the project uses Semantic Versioning (before 1.0, minor versions may break the API).
[Unreleased] #
mdlib-pure stays 0.1.1 (no change to the npm package). Wrapper releases:
ngx-mdlib-pure 0.2.0 (GitHub release angular-v0.2.0) and
MdlibPure.Blazor 0.2.0 (blazor-v0.2.0), both with the entries below.
Changed #
-
<mdlib-podcast-editor>dispatcheschangeonly when focus leaves the editor (moves inside it do not count), like<mdlib-editor>and native inputs; before, it followed every typing pause.inputis unchanged. -
ngx-mdlib-pure0.1.1 (GitHub releaseangular-v0.1.1): requiresmdlib-pure ^0.1.1, so apps get the<mdlib-editor>fixes of 0.1.1 (value set as a property before connection, missing form APIs). Same code as 0.1.0; the packaged README installs the 0.1.1 tarballs.
Added #
-
Blazor
OnValueCommit(MdlibPure.Blazor 0.2.0) onMarkdownEditor(EventCallback<string?>) andPodcastEditor(EventCallback<PodcastEpisode>): the user left the editor, after the pendingValueChanged. The counterpart of Angular'svalueCommit. -
ngx-mdlib-pure/podcast(Angular, ngx-mdlib-pure 0.2.0):PodcastEditor, the podcast rundown editor as<mdlib-podcast-editor>with[(value)]of a typedPodcastEpisode, aControlValueAccessor, and the Blazor component's hosting options (grammar,tagColors,tasks,documents,readOnly,compact,currentLine,runningTimer) and events. Tested in Chromium (unit) and in the SSR demo's/podcastpage. -
templates/podcast/element.js: the<mdlib-podcast-editor>element, moved from the Blazor package and shared by both wrappers;stylesalso takesCSSStyleSheetobjects. -
npm run checkverifies binding parity (AGENTS.md rule 11): every plugin export has a name in the elements, the Blazor and Angular plugin lists match it, and every custom element is wrapped by both. -
Copyable podcast plugin example and split editor at
/podcast/: participant completion, section durations ([](time:5:00:00)), interactive checkboxes, linked supporting documents, local drafts and per-document undo/redo. Markdown links open in a new browser tab. All sample people and content are fictional; the guide covers its Blazor integration. Seedocs/podcast.md; the library's package exports and core syntax are unchanged. -
Podcast sample, hosting options for an application with its own rundown server (defaults unchanged): grammar options of
podcast()(durations: 'clock'with titled[titolo](time:04:30)tags, free@name/#topictags with fixed, written or hashed colours,lineBlocks,looseTasks),[titolo](doc:name)document links, and editor optionstasks: 'notify',documents: 'host',readOnly,compact,current,runningTimer(with an optional countdown text shown in the chip) with their callbacks.PodcastEditorexposes them as parameters andEventCallbacks (OnTaskToggle,OnOpenDocument,OnActiveDocumentChanged), withPodcastGrammar,PodcastTaskMode,PodcastDocumentMode. New tokens--podcast-height,--podcast-font-size. -
Blazor wrapper 0.1.1 (GitHub release
blazor-v0.1.1):PodcastEditorandPodcastEpisode, with configurable participants, typed episode binding, supporting documents, planned durations and automatic assets. Shared with the site sample; tested in Server, WebAssembly, Auto and Static SSR, including enhanced navigation.
[0.1.1] — 2026-10-30 #
mdlib-pure only, as the npm tarball of the GitHub release mdlib-pure-v0.1.1
(still not on the npm registry). ngx-mdlib-pure 0.1.0 works with it
unchanged; MdlibPure.Blazor 0.1.0 still bundles the 0.1.0 elements and theme.
Fixed #
<mdlib-editor>: avalueset as a property before the element was connected (React 19, Vue) was replaced by the missing attribute, so the editor started empty; avalueset beforedefineElements()hid the setter. Both now work (#1).<mdlib-editor>in test DOMs: noTypeErrorwhereElementInternalshas nosetFormValue()(jsdom 29) orattachInternals()is missing.theme.cssunder Tailwind's preflight: list markers, link underlines and inline images are kept, so.mdlooks the same with or without Tailwind.theme.css: code blocks are 14px as intended (they were 11.4px: the browser's baremonospaceshrinks em sizes); footnote references no longer stretch their line; task-list checkboxes line up with the indent.
[0.1.0] — 2026-10-29 #
First release. Not on a registry yet: mdlib-pure and ngx-mdlib-pure are not
on npm, MdlibPure.Blazor is not on nuget.org. Each is attached to a GitHub
release instead (mdlib-pure-v0.1.0, angular-v0.1.0, blazor-v0.1.0; see
README.md, "Install").
Core (mdlib-pure, ~11 KB gzip, zero dependencies) #
- CommonMark 0.31.2: all 652 spec examples pass (also in Chromium with the DOM-based entity decoder).
- Two-phase parser (blocks, then inlines) with an extensible rule registry:
block rules, inline rules, delimiter rules, AST transforms, render
overrides; ordering with
before/after, replacement by name. - mdast-compatible AST; optional block
positions. - Output as HTML string, DOM (
renderTo, no HTML parsing unless raw HTML is present) or VNodes. - Options:
html,sanitize,allowUrl,decodeEntity,classes,attributes,highlight,positions. - Safe defaults: raw HTML not recognized; URL allowlist (http, https,
mailto, tel, sms, relative; raster
data:images only);sanitizeapplied on every output path. - Linear time on adversarial input; nesting capped at
MAX_NESTING. - Throughput on par with marked, ahead of markdown-it (see
bench/).
Plugins and integrations #
mdlib-pure/gfm: tables, strikethrough, extended autolinks, task lists, footnotes, tag filter, GitHub alerts (54/54 GFM extension examples).mdlib-pure/headings: GitHub-compatible heading ids, permalinks,toc().mdlib-pure/container::::container blocks.mdlib-pure/math:$…$,$$…$$,$$blocks,renderhook for KaTeX/MathJax.mdlib-pure/deflist: definition lists.mdlib-pure/mark:==highlight==.mdlib-pure/frontmatter: YAML/TOML front matter.mdlib-pure/mermaid: Mermaid diagrams without depending on Mermaid; lazy loading, strict security level, theme from the tokens.mdlib-pure/adapter: React, Preact and Vue elements.mdlib-pure/element:<mdlib-markdown>and<mdlib-editor>Web Components (editor with live preview, debounced events, echo-safe value binding, form-associated, disabled bydisabledor a<fieldset>) andeditor.css. Thekatexloader takes KaTeX's ownrenderMathInElement.mdlib-pure/entities: full entity table for non-browser environments.theme.csswith semantic--md-*tokens (light/dark viacolor-scheme);tailwind.cssfor Tailwind CSS v4.
Bindings #
MdlibPure.Blazor0.1.0 (NuGet, inbindings/blazor/, not on nuget.org; the.nupkgis on the GitHub releaseblazor-v0.1.0):<Markdown>and<MarkdownEditor @bind-Value>for every Blazor render mode,IMarkdownServicefor the AST, KaTeX and Mermaid bundled and loaded on demand.ngx-mdlib-pure0.1.0 (npm, inbindings/angular/, not published yet):MarkdownEditor(<mdlib-editor [(value)]>, aControlValueAccessorforngModeland reactive forms) andMarkdownViewer(<mdlib-markdown>) as standalone components for Angular 21 and 22,provideMdlibPure(),MarkdownService(AST, TOC, HTML, also on the server); SSR with hydration.
Tooling #
AGENTS.mdguide for AI agents, tested by having an agent build a plugin from it; plugin template; CI on Node 22/24 and Chromium.npm packbuildsdist/(prepack);dist/has no bare chunk imports, so bundlers print no "Ignoring this import" warnings.