Skip to content

Releases

v2.0.0

Choose a tag to compare

@github-actions github-actions released this 12 Nov 14:43

2.0.0 (2026-11-12)

⚠ BREAKING CHANGES

  • NTComponents, NTComponents.AspNetCore, and
    NTComponents.Extensions no longer ship net9.0 builds.

  • feat!: remove legacy TnT components and obsolete APIs

Delete every TnT* component, service, and enum along with the obsolete
NTInputSelect and NTInputFile, their scripts, styles, and tests. Rename the
surviving shared types to NT names (NTEvent, NTDisabledDateTime,
NTVirtualizeItemsProviderResult, NTComponentIdentifier, NTServiceExt), move
still-used helper types into their own files, and drop the AspNetCore
TnTItemsProviderRequest model binder and the NTC1077-1079 suppressions.

Update the docs site examples, LiveTest pages, AOT smoke app, and tests to
the NT equivalents, remove LiveTest demos that only exercised TnT
components, and replace the README color-migration section with a 2.0
upgrade guide.

  • TnT* components, AddTnTServices(), ITnTDialogService,
    ITnTToastService, TnTColor, Size, TextAlign, LayoutDirection, NTInputSelect,
    and NTInputFile are removed. Use the NT* equivalents listed in the README.

  • ci(release): publish to NuGet with trusted publishing

Replace the long-lived NUGET_API_KEY secret with NuGet/login OIDC in the
release and prerelease workflows. The short-lived key from the login step
pushes the packages and unlists superseded previews; the jobs now need
id-token: write and the NUGET_USER secret.

  • chore(charts): bump submodule for trusted publishing

Picks up the Charts AGENTS.md net10/net11 fix and its NuGet trusted
publishing workflows.

  • ci: pin Playwright jobs to Ubuntu 24.04

ubuntu-latest now resolves to Ubuntu 26.04, where Playwright cannot
install Chromium. Pin the AOT Linux x64 smoke, the dotnet-test matrix, and
the release job (all install Playwright) to ubuntu-24.04, matching the
arm64 runner.

  • chore(charts): bump submodule for the Ubuntu 24.04 runner pin

  • ci: install Playwright Chromium without apt dependencies

The hosted Ubuntu runners cannot reach the Ubuntu package mirrors, so the
--with-deps apt step failed every Linux integration and AOT smoke job. The
runner images already ship Google Chrome and its system libraries, so
install only the Chromium browser the tests use.

  • test(fab): drop legacy TnTFabContainer offset checks

The FAB offsets page no longer renders TnT FAB containers, so the test
timed out waiting for .tnt-fab-container. Keep the NT FAB placement checks,
including the legacy .tnt-header/.tnt-footer class variants the FAB styles
still support.

  • ci(aot): make the browser smoke observable and bounded

macOS AOT jobs hung after publish with no output, and the job timeout
discarded their logs. Log each browser smoke attempt, bound the DevTools
socket close and the static server's socket reads, and pass Chrome
--use-mock-keychain and --password-store=basic so a fresh profile cannot
block on the macOS keychain. Move the 20-minute limit to the smoke step,
where a timeout keeps the log, and give the job 30 minutes.

  • ci(aot): smoke-test macOS with Safari instead of headless Chrome

Headless Chrome hung on macOS after DevTools connected, so macOS now runs
the browser smoke through safaridriver (WebDriver) and checks the same
smoke marker. AOT_SMOKE_BROWSER still selects a Chromium browser. The
Chromium DevTools calls get a hard 10-second wall-clock bound, and both
paths log progress every 10 seconds.

  • ci(aot): report browser errors when the Safari smoke fails

Safari renders the AOT smoke app but never shows its toast or snackbar.
Collect window errors, unhandled rejections, and console errors in the
smoke app, and on a failed Safari smoke print them with the page-script
registration state, toast and snackbar host counts, and module import
results.

  • ci(aot): build the TypeScript modules before the AOT smoke publish

The components' .razor.js modules are compiled from TypeScript and are not
checked in, and the AOT workflow never built them, so every module import
in the smoke app fell back to index.html. Safari reported the text/html
MIME type; the previous Chromium check passed without the modules. Check
out submodules, run npm ci, and run build:ts:release on every runner, as
the release workflow does.

  • ci(aot): expect NT color variables in the smoke check

NTColor.ToCssNTColorVariable() emits var(--nt-color-), but the smoke
marker still expected var(--tnt-color-
) for the toast and snackbar
colors. The old Chromium check passed without evaluating this, so the
stale values went unnoticed.

  • feat(theme)!: drop --tnt-color tokens and the theme compatibility stylesheet

Move every theme token to --nt-color-. Remove nt-theme-compat, which
mapped --nt-color-
to --tnt-color-, and stop NTHeadDependencies from
loading it; --nt-color-transparent now lives in nt-measurements. Remove
the $tnt-color-
SCSS aliases, the --tnt-color fallback in the color
lookup, and the legacy aliases the theme creator wrote. The theme runtime
fallback, snackbar defaults, docs site and LiveTest themes, Material
theme converter, and the Charts AOT test app now use --nt-color-*.

  • themes and custom CSS must define and use --nt-color-*
    tokens; --tnt-color-* tokens are no longer read.

  • refactor!: rename every tnt- name to nt-

Rename the remaining tnt- CSS classes, custom properties, SCSS mixins and
variables, data-tnt-* attributes, the element, and the
date picker's dataset keys to their nt- forms.

Where an nt- equivalent already existed, remove the tnt- copy instead:
the theme runtime's data-tnt-theme* attributes, tnt-* attribute fallbacks,
and tnt-theme-changed event; the .tnt-header/.tnt-footer FAB selectors;
and the static tnt- typescale mixins and classes, whose callers now use
the token-based nt- mixins.

Remove code that only served removed TnT components: the accordion and
side-nav toggles, the TnTBody fill-remaining observer, the unstyled
injection, addHidden, the legacy supporting-text key
handler, and the unused _inputBase, _buttonStyleMixins, _corners, and
_textAlignments partials.

  • tnt- CSS classes, custom properties, data attributes,
    the element, and the tnt-theme-changed event are now
    nt-. Update custom CSS, JavaScript, and test selectors that target them.

  • refactor!: rename the tntid attribute and tnt_ id prefix to ntid and nt_

Components now mark their root with an ntid attribute whose generated
values start with nt_. NTComponents.customAttribute and the component
identifier constant follow the new name.

  • the component identifier attribute is now ntid and
    generated identifiers start with nt_. Update selectors that target
    [tntid] or tnt_ values.

  • chore: rename the private npm package to ntcomponents-js-tests

  • chore: clean up legacy TnT references found in review

  • Drop compilerconfig.json and .gitignore entries for removed components.
  • Remove the bUnit mock for the deleted TnTRippleEffect module.
  • Stop checking and setting the legacy __tntThemeBootstrapped flag.
  • Remove the dead "TnT" type-name filters in the docs catalog and its test.
  • Rename the TnTComponents..test.js suites to NTComponents..test.js and
    the tnTEvent test variable to ntEvent.
  • Update docs and agent instructions that still described TnTComponents,
    legacy TnT components, ToLegacyColor(), or .NET 9 support.
  • Keep the sans-serif fallback in nt-typescale(), which the removed
    tnt-typescale() provided, and align the unused title-medium size
    variable with the 16px Material 3 baseline.
  • chore(charts): bump submodule for the README cleanup

  • ci(coverage): raise the coverage threshold to 90%

  • ci(coverage): evaluate coverage across the whole project

  • animation: NTAnimation.Once and AnimateOut are removed. Use
    Repeat (Once, Reverse, or Replay) for visible animations and
    Trigger="Manual" with Shown to animate content in and out. Distance is
    now nullable and defaults per variant (24px for slides, 30px for shared
    axis).

  • icons: Icon parameters on NT components now use NTIcon instead
    of TnTIcon, and MaterialIcon.Color is NTColor? instead of TnTColor.
    Replace TnTColor.X with NTColor.X, and use null where OnSurface or None
    was used to inherit the text color.

  • size: ButtonSize on NT buttons, NTNavLink, NTButtonGroup,
    NTFabMenu, and NTSplitButton; Size on NTProgress, NTLoader, and
    NTBreadcrumb; NTInputFile.InputButtonSize and UploadButtonSize; and
    NTButtonBase.EffectiveProgressSize now use NTSize. Replace Size.X with
    NTSize.X, Size.XS with NTSize.Smallest, and Size.XL with
    NTSize.Largest.

Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com

  • colors: Color parameters on NT components (buttons, cards,
    chips, menus, navigation, form fields, progress, tags, tooltips,
    toasts, snackbars, and others), INTSnackbar, INTToast, the
    INTSnackbarService and INTToastService ShowAsync overloads,
    NTSnackbarQueueScriptOptions, and NTButtonBase.EffectiveProgressColor
    now use NTColor instead of TnTColor. Replace TnTColor.X with NTColor.X;
    use null or Transparent where TnTColor.None was used. Apps that do not
    render NTHeadDependencies must load _content/NTComponents/nt-theme-compat.css
    or define --nt-color-* variables.

Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com

  • tests: CI now enforces 90% line and branch coverage for NTComponents.
  • NTCarousel: Carousel API, layout, and item registration model have changed; required parameters and accessibility contracts enforced.
  • mcp,api,validation,docs,infra: Public API input validation is now enforced; invalid requests return errors instead of being normalized or ignored. CORS, host, and rate limiting are now strictly applied. TypeScript build/minification is required before .NET builds. See README for migration details.
  • core,ci,docs: Removed DynamicallyAccessedMembers from generic type constraints and updated TnTInputFile disposal logic for .NET 11 compatibility. Consumers targeting .NET 11 may need to update their code to matc...
Read more

v2.0.0-preview.83

v2.0.0-preview.83 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 12 Nov 04:15

2.0.0-preview.83 (2026-11-12)

⚠ BREAKING CHANGES

  • NTComponents, NTComponents.AspNetCore, and
    NTComponents.Extensions no longer ship net9.0 builds.

  • feat!: remove legacy TnT components and obsolete APIs

Delete every TnT* component, service, and enum along with the obsolete
NTInputSelect and NTInputFile, their scripts, styles, and tests. Rename the
surviving shared types to NT names (NTEvent, NTDisabledDateTime,
NTVirtualizeItemsProviderResult, NTComponentIdentifier, NTServiceExt), move
still-used helper types into their own files, and drop the AspNetCore
TnTItemsProviderRequest model binder and the NTC1077-1079 suppressions.

Update the docs site examples, LiveTest pages, AOT smoke app, and tests to
the NT equivalents, remove LiveTest demos that only exercised TnT
components, and replace the README color-migration section with a 2.0
upgrade guide.

  • TnT* components, AddTnTServices(), ITnTDialogService,
    ITnTToastService, TnTColor, Size, TextAlign, LayoutDirection, NTInputSelect,
    and NTInputFile are removed. Use the NT* equivalents listed in the README.

  • ci(release): publish to NuGet with trusted publishing

Replace the long-lived NUGET_API_KEY secret with NuGet/login OIDC in the
release and prerelease workflows. The short-lived key from the login step
pushes the packages and unlists superseded previews; the jobs now need
id-token: write and the NUGET_USER secret.

  • chore(charts): bump submodule for trusted publishing

Picks up the Charts AGENTS.md net10/net11 fix and its NuGet trusted
publishing workflows.

  • ci: pin Playwright jobs to Ubuntu 24.04

ubuntu-latest now resolves to Ubuntu 26.04, where Playwright cannot
install Chromium. Pin the AOT Linux x64 smoke, the dotnet-test matrix, and
the release job (all install Playwright) to ubuntu-24.04, matching the
arm64 runner.

  • chore(charts): bump submodule for the Ubuntu 24.04 runner pin

  • ci: install Playwright Chromium without apt dependencies

The hosted Ubuntu runners cannot reach the Ubuntu package mirrors, so the
--with-deps apt step failed every Linux integration and AOT smoke job. The
runner images already ship Google Chrome and its system libraries, so
install only the Chromium browser the tests use.

  • test(fab): drop legacy TnTFabContainer offset checks

The FAB offsets page no longer renders TnT FAB containers, so the test
timed out waiting for .tnt-fab-container. Keep the NT FAB placement checks,
including the legacy .tnt-header/.tnt-footer class variants the FAB styles
still support.

  • ci(aot): make the browser smoke observable and bounded

macOS AOT jobs hung after publish with no output, and the job timeout
discarded their logs. Log each browser smoke attempt, bound the DevTools
socket close and the static server's socket reads, and pass Chrome
--use-mock-keychain and --password-store=basic so a fresh profile cannot
block on the macOS keychain. Move the 20-minute limit to the smoke step,
where a timeout keeps the log, and give the job 30 minutes.

  • ci(aot): smoke-test macOS with Safari instead of headless Chrome

Headless Chrome hung on macOS after DevTools connected, so macOS now runs
the browser smoke through safaridriver (WebDriver) and checks the same
smoke marker. AOT_SMOKE_BROWSER still selects a Chromium browser. The
Chromium DevTools calls get a hard 10-second wall-clock bound, and both
paths log progress every 10 seconds.

  • ci(aot): report browser errors when the Safari smoke fails

Safari renders the AOT smoke app but never shows its toast or snackbar.
Collect window errors, unhandled rejections, and console errors in the
smoke app, and on a failed Safari smoke print them with the page-script
registration state, toast and snackbar host counts, and module import
results.

  • ci(aot): build the TypeScript modules before the AOT smoke publish

The components' .razor.js modules are compiled from TypeScript and are not
checked in, and the AOT workflow never built them, so every module import
in the smoke app fell back to index.html. Safari reported the text/html
MIME type; the previous Chromium check passed without the modules. Check
out submodules, run npm ci, and run build:ts:release on every runner, as
the release workflow does.

  • ci(aot): expect NT color variables in the smoke check

NTColor.ToCssNTColorVariable() emits var(--nt-color-), but the smoke
marker still expected var(--tnt-color-
) for the toast and snackbar
colors. The old Chromium check passed without evaluating this, so the
stale values went unnoticed.

  • feat(theme)!: drop --tnt-color tokens and the theme compatibility stylesheet

Move every theme token to --nt-color-. Remove nt-theme-compat, which
mapped --nt-color-
to --tnt-color-, and stop NTHeadDependencies from
loading it; --nt-color-transparent now lives in nt-measurements. Remove
the $tnt-color-
SCSS aliases, the --tnt-color fallback in the color
lookup, and the legacy aliases the theme creator wrote. The theme runtime
fallback, snackbar defaults, docs site and LiveTest themes, Material
theme converter, and the Charts AOT test app now use --nt-color-*.

  • themes and custom CSS must define and use --nt-color-*
    tokens; --tnt-color-* tokens are no longer read.

  • refactor!: rename every tnt- name to nt-

Rename the remaining tnt- CSS classes, custom properties, SCSS mixins and
variables, data-tnt-* attributes, the element, and the
date picker's dataset keys to their nt- forms.

Where an nt- equivalent already existed, remove the tnt- copy instead:
the theme runtime's data-tnt-theme* attributes, tnt-* attribute fallbacks,
and tnt-theme-changed event; the .tnt-header/.tnt-footer FAB selectors;
and the static tnt- typescale mixins and classes, whose callers now use
the token-based nt- mixins.

Remove code that only served removed TnT components: the accordion and
side-nav toggles, the TnTBody fill-remaining observer, the unstyled
injection, addHidden, the legacy supporting-text key
handler, and the unused _inputBase, _buttonStyleMixins, _corners, and
_textAlignments partials.

  • tnt- CSS classes, custom properties, data attributes,
    the element, and the tnt-theme-changed event are now
    nt-. Update custom CSS, JavaScript, and test selectors that target them.

  • refactor!: rename the tntid attribute and tnt_ id prefix to ntid and nt_

Components now mark their root with an ntid attribute whose generated
values start with nt_. NTComponents.customAttribute and the component
identifier constant follow the new name.

  • the component identifier attribute is now ntid and
    generated identifiers start with nt_. Update selectors that target
    [tntid] or tnt_ values.

  • chore: rename the private npm package to ntcomponents-js-tests

  • chore: clean up legacy TnT references found in review

  • Drop compilerconfig.json and .gitignore entries for removed components.
  • Remove the bUnit mock for the deleted TnTRippleEffect module.
  • Stop checking and setting the legacy __tntThemeBootstrapped flag.
  • Remove the dead "TnT" type-name filters in the docs catalog and its test.
  • Rename the TnTComponents..test.js suites to NTComponents..test.js and
    the tnTEvent test variable to ntEvent.
  • Update docs and agent instructions that still described TnTComponents,
    legacy TnT components, ToLegacyColor(), or .NET 9 support.
  • Keep the sans-serif fallback in nt-typescale(), which the removed
    tnt-typescale() provided, and align the unused title-medium size
    variable with the 16px Material 3 baseline.
  • chore(charts): bump submodule for the README cleanup

  • ci(coverage): raise the coverage threshold to 90%

  • ci(coverage): evaluate coverage across the whole project

Features

  • drop net9, remove legacy TnT components, NuGet trusted publishing (#129) (40109ef)

Bug Fixes

  • release: stop the NTComponents package check referencing TnTColor (1b7a0a3)

v2.0.0-preview.82

v2.0.0-preview.82 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 06 Nov 06:00

2.0.0-preview.82 (2026-11-06)

Features

  • editor: rework NTRichTextEditor surface, tools, and value sync (a94995a)
  • menus: add TargetSelector to NTContextMenu (bb13f0f)
  • navrail: use the modal rail on small portrait screens (4b198bf)
  • virtualize: debounce scroll-driven loads (22a25f8)

Bug Fixes

  • form: fire BindAfter on blur only after a change (eff6194)
  • form: show chosen file names in static NTFileUpload (fbb027f)
  • grid: keep placeholder rows at data row height (c5505c7)
  • tabs: docked NTPopoutTab content fills the tab panel height (35ec525)

v2.0.0-preview.81

v2.0.0-preview.81 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 04 Nov 18:25

2.0.0-preview.81 (2026-11-04)

Features

  • form: add date range picker (5ef6849)

v2.0.0-preview.80

v2.0.0-preview.80 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 30 Oct 02:16

2.0.0-preview.80 (2026-10-30)

Bug Fixes

  • tooltip: render NTTooltip in the top layer so masked containers can't clip it (89db4e9)
  • virtualize: reload cached rows when a background load reports a new total (9efe306)

v2.0.0-preview.79

v2.0.0-preview.79 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 29 Oct 03:16

2.0.0-preview.79 (2026-10-29)

Bug Fixes

  • site: keep shown example code inside the docs container (7aa3834)

v2.0.0-preview.78

v2.0.0-preview.78 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 28 Oct 03:38

2.0.0-preview.78 (2026-10-28)

Features

  • charts: document legend scrolling and long axis labels (70fc0b3)
  • grid: add FullHeight to fill a bounded page layout (ebf00b3)
  • menu: attach NTContextMenu to an element by id (c869776)
  • tabs: add NTPopoutTab that pops out into a window (2eda91c)
  • window: cascade new windows and add inline Floating mode (855e991)

Bug Fixes

  • grid: keep placeholder rows at the data row height (c6d72e0)

v2.0.0-preview.77

v2.0.0-preview.77 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 25 Oct 22:22

2.0.0-preview.77 (2026-10-25)

Features

  • analyzers: add rules for chip, navigation rail, window, accordion, virtualize, responsive, dialog, badge and owned attributes (6e29ba4)
  • analyzers: grade rules by impact and document every rule (07ca2fb)
  • analyzers: port card, carousel, data grid, progress and animation rules to the render tree walker (4ac685e)
  • analyzers: port icon button, FAB and FAB menu rules to the shared walker (598b1f8)
  • analyzers: port input rules and add form and editor rules (NTC1059-1064, NTC1104-1108) (3ebbbde)
  • analyzers: port split button, button group, menu and nav link rules (9e058eb)
  • analyzers: report ignored layout parameters and builder helpers (b495d58)
  • analyzers: report missing parents, nested forms, and undefined enums (3241ac1)
  • grid: adapt NTDataGrid to small screens (eb81e47)
  • grid: add drag-to-scroll to NTDataGrid (3998546)

Bug Fixes

  • analyzers: fall back to the component location for unmapped attributes (de9d782)

v2.0.0-preview.76

v2.0.0-preview.76 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 21 Oct 19:37

2.0.0-preview.76 (2026-10-21)

Bug Fixes

v2.0.0-preview.75

v2.0.0-preview.75 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 21 Oct 03:39

2.0.0-preview.75 (2026-10-21)

Features

  • core: add NTDebouncer and obsolete TnTDebouncer (b483e96)
  • docs: generate code documentation for NTComponents.Charts (773873c)
  • site: add Charts documentation, demos and getting started guide (9fb0b6a)

Bug Fixes

  • build: let Components.Authorization flow to net11 consumers (d94f423)
  • deps: remove the Authorization pin Dependabot added to Extensions (26a34b0), closes #106
  • mcp: list reference types that derive from exposed parameter types (5ae9e37)
  • tooltip: use the Material 3 medium corner for rich tooltips (7649e0e)

Performance Improvements

  • buttons: simplify class building in buttons, cards, chips and carousel (e93e9f9)
  • components: trim per-render work in navigation, menus, overlays and theming (52b0d1a)
  • core: cut allocations in shared builders and base components (79685cf)
  • fonts: load Roboto and icon fonts from separate stylesheets (41be583)
  • form: cache per-render work in form base classes and inputs (00d0dfd)
  • grid: cut per-row and per-render work in NTDataGrid (e85f92a)
  • js: share button interaction listeners and track active ripple hosts (442d51e)
  • scheduler: resolve each event once per render and lay out lanes in one sweep (6abb471)
  • shapes: ship precomputed shape points instead of generating them (7cb7519)