Admin App breaking changes
Overview
PREREQUISITES: The described breaking changes are introduced in version Sitefinity CMS 15.4.8640.
Sitefinity CMS 15.4.8640 upgrades the Admin App from Angular 19 to Angular 21, and from Kendo UI for Angular 18.5 to Kendo UI for Angular 23.2. This article explains how these upgrades affect your Admin App extensions and custom styling, and how to rebuild your extensions. It applies when you upgrade from a Sitefinity CMS version earlier than 15.4.8640.
Admin App extensions are webpack bundles. At runtime, the Admin App provides @angular/*, rxjs, tslib, and the Admin App extensibility API to your extensions, and the import.plugin.ts plugin in the build folder of the extensions project replaces the imports of these packages with references to the copies in the Admin App. For this reason, the Angular major version that you use to build your extensions must match the Angular major version of the Admin App.
IMPORTANT: Extensions that are built on Angular 19 are not guaranteed to work with Sitefinity CMS 15.4.8640 and later. After you upgrade, rebuild your extensions on Angular 21.
The public Admin App extensibility API in @progress/sitefinity-adminapp-sdk is not changed. You use classes such as ExtensionBase, the command, field, and grid extension points, and the dependency injection tokens the same way as before.
Who is affected
| Your situation | Required action |
|---|---|
| You upgrade to Sitefinity CMS 15.4.8640 or later and use Admin App extensions that are built on Angular 19. | Rebuild your extensions on Angular 21. For more information, see Rebuild your extensions. |
| You use only the prebuilt extension samples. | Rebuild the samples from the repository tag that matches your Sitefinity CMS version. |
You override Kendo UI .k-* CSS classes or Kendo theme variables in the Admin App, for example, in a custom theme. | Verify the appearance of the Admin App after the upgrade. For more information, see Kendo UI changes. |
| Your extensions bundle their own Kendo UI for Angular components. | Use a Kendo UI for Angular version that supports Angular 21 and verify your extensions against the new theme. |
You use the @progress/sitefinity-component-framework npm package. | Upgrade to version 12.1.0 or later of the package, which declares Angular 21 peer dependencies. |
| You stay on a Sitefinity CMS version earlier than 15.4.8640. | No action is required. Continue to use the extensions repository tag that matches your Sitefinity CMS version. |
Summary of changes
| Area | Before | Now |
|---|---|---|
| Angular | 19.2 | 21.2 |
| TypeScript | 5.5 | 5.9 |
| Node.js for building extensions | 16 LTS (recommended) | ^20.19.0, ^22.12.0, or >=24.0.0 (required) |
| ESLint | 9, with .eslintrc.json | 10, with flat config in eslint.config.mjs |
| Kendo UI for Angular | 18.5.2 | 23.2.2 |
| Kendo default theme | 10.2.0 | 13.1.1 |
| Kendo UI for jQuery, used by the HTML editor | 2025.4.1321 | 2026.2.520 |
@progress/sitefinity-component-framework | 12.0.0, with Angular 19.x peer dependencies | 12.1.0, with Angular 21.x peer dependencies |
@progress/sitefinity-adminapp-sdk | 15.4.8639 and earlier | 15.4.8640 |
Rebuild your extensions
Prerequisites
PREREQUISITES: Before you rebuild your extensions, ensure the following:
- You have installed Node.js
^20.19.0,^22.12.0, or>=24.0.0. Angular 21, Angular CLI 21, and ESLint 10 do not support earlier Node.js versions, including Node.js 16, Node.js 18, and Node.js 20 versions earlier than 20.19.- You use TypeScript 5.9.x. Angular 21 does not support earlier TypeScript versions.
Get the extensions project for your Sitefinity CMS version
If you started your extensions project from a copy of the Sitefinity Admin App extensions repository, the simplest way to migrate is to take the Angular 21 version of the build files from the repository and reapply your own code and customizations. If you maintain your own project structure, perform the procedures in the following sections.
-
Clone the Sitefinity GitHub repository » Sitefinity Admin App extensions, or open your existing copy.
-
Check out the tag that matches your Sitefinity CMS version and update the samples submodule.
For example, for Sitefinity CMS 15.4.8640, run the following commands:bashgit checkout 15.4.8640.0 git submodule update --init --recursiveTo find your Sitefinity CMS version, in the main menu, click Administration » Version and Licensing.
Update the dependencies
The following table lists the dev dependency versions that the extensions repository uses:
| Package | Angular 19 | Angular 21 |
|---|---|---|
@angular/* packages: animations, common, compiler, compiler-cli, core, forms, platform-browser, platform-browser-dynamic, and router | 19.2.18 | 21.2.5 |
@angular/cli | 19.2.19 | 21.2.3 |
@angular-devkit/build-angular | 19.2.19 | 21.2.3 |
@angular-builders/custom-webpack | 19.0.0 | 21.0.3 |
typescript | 5.5.4 | 5.9.3 |
rxjs | 7.8.1 | 7.8.2 |
webpack | 5.98.0 | 5.105.4 |
style-loader | 3.3.1 | 4.0.0 |
@types/node | 22.13.4 | 25.5.0 |
zone.js | 0.15.0 | 0.15.0 (not changed) |
@progress/sitefinity-component-framework | 12.0.0 | 12.1.0 |
@progress/sitefinity-adminapp-sdk | 15.4.8639 and earlier | 15.4.8640 |
The linting packages are consolidated as follows:
| Removed packages | Added packages |
|---|---|
@angular-eslint/builder, @angular-eslint/eslint-plugin, @angular-eslint/eslint-plugin-template, and @angular-eslint/template-parser | angular-eslint 21.3.1 |
@typescript-eslint/eslint-plugin and @typescript-eslint/parser | typescript-eslint 8.57.2 |
eslint 9.20.1 | eslint 10.1.0, @eslint/js 10.0.1, and globals 15.15.0 |
For the authoritative list of versions, see the package.json file at the repository tag that matches your Sitefinity CMS version.
To update the dependencies, perform the following:
-
In your
package.jsonfile, update the dev dependencies to the versions listed above. -
Delete the
node_modulesfolder and thepackage-lock.jsonfile.-
On Windows, run the following command in PowerShell:
powershellRemove-Item -Recurse -Force node_modules, package-lock.json -
On macOS and Linux, run the following command:
bashrm -rf node_modules package-lock.json
-
-
Install the packages:
bashnpm install
NOTE:
@progress/sitefinity-adminapp-sdkdeclares Angular peer dependencies<=19.2.x. As a result,npm installmight stop with anERESOLVEerror. In this case, runnpm install --legacy-peer-depsornpm install -f. If you install the packages from the lock file of the extensions repository withnpm ci, this error does not occur.
Update the tsconfig.json file
In the compilerOptions section of the tsconfig.json file, perform the following:
- Change the value of
moduleResolutionfromnodetobundler. - Remove the
liboption.
TypeScript then uses the default libraries for theES2022target, including the DOM. If your code relies on specificlibentries, keep them.
The following example shows the relevant compiler options after the change:
{
"compilerOptions": {
"module": "es2020",
"moduleResolution": "bundler",
"target": "ES2022"
}
}
Update the angular.json file
By default, Angular CLI 20 and later generate files without type suffixes, such as .component, .service, and .directive. To keep the file naming of the samples, for example, foo.component.ts and foo.service.ts, add the following schematics section at the end of the angular.json file:
"schematics": {
"@schematics/angular:component": { "type": "component" },
"@schematics/angular:directive": { "type": "directive" },
"@schematics/angular:service": { "type": "service" },
"@schematics/angular:guard": { "typeSeparator": "." },
"@schematics/angular:interceptor": { "typeSeparator": "." },
"@schematics/angular:module": { "typeSeparator": "." },
"@schematics/angular:pipe": { "typeSeparator": "." },
"@schematics/angular:resolver": { "typeSeparator": "." }
}
This setting affects only the files that you generate with ng generate. If you do not need this file naming, skip this step.
Update the build folder
The build folder of the extensions repository contains the custom webpack configuration and the import plugin. These files work with Angular 21 with only one typing change in import.plugin.ts. If you copied the build folder to your project, replace it with the latest version from the repository.
If you keep your own build folder, in the import.plugin.ts file, change the declaration of delegatedModuleId from let delegatedModuleId = null; to let delegatedModuleId;.
Migrate to the ESLint flat config
ESLint 10 supports only the flat config format. To migrate, perform the following:
- Delete the
.eslintrc.json,.eslintignore, and.eslintcachefiles. - Copy the
eslint.config.mjsfile from the extensions repository to the root of your project. - Add
.eslintcacheto your.gitignorefile.
You run npm run lint and ng lint the same way as before.
Update your extension code
Build your extensions against Angular 21 and TypeScript 5.9 and fix the reported errors. Use the official Angular update guide and select the upgrade from version 19 to 20, and then from version 20 to 21.
For the changes that are most relevant to Admin App extensions, see Angular changes that affect extension code.
Build and deploy your extensions
-
Start the development server:
bashnpm startThe Admin App is served on
http://localhost:3000. -
Verify that your extensions load and work against your Sitefinity CMS instance.
For more information about configuring Sitefinity CMS for extension development, see Sitefinity GitHub repository » Configure Sitefinity CMS for development of custom extensions. -
Build the extensions bundle:
bashnpm run buildTo build a minified bundle, run
npm run build:prod. -
From the
distfolder, copy the generated*.extensions.bundle.jsfile. -
In the
adminappfolder of your Sitefinity CMS web application, replace the old bundle with the new one. -
Restart Sitefinity CMS.
Angular changes that affect extension code
Angular 21 and TypeScript 5.9 are stricter than Angular 19 and TypeScript 5.5. Review your extension code against the changes below. For the complete list of changes, see the Angular release notes for 20.0.0 and 21.0.0.
Removed and changed APIs
InjectFlagsis removed.inject(),Injector.get(), andTestBed.inject()no longer accept it.TestBed.get()andTestBed.flushEffects()are removed. UseTestBed.inject()andTestBed.tick()instead.NgModuleFactoryis removed, together with themoduleIdandinterpolationcomponent options.Injector.get()no longer has the overload that accepts and returnsany.afterRenderis renamed toafterEveryRender.provideExperimentalZonelessChangeDetectionis renamed toprovideZonelessChangeDetection, andprovideExperimentalCheckNoChangesForDebugis renamed toprovideCheckNoChangesConfig.UpgradeAdapteris removed.- Import
ApplicationConfigfrom@angular/coreinstead of from@angular/platform-browser. - In templates,
inandvoidare reserved operators. To reference a member namedvoid, usethis.void. - Type checking of host bindings (
typeCheckHostBindings) is enabled by default. Existing type errors in host bindings can fail the build. - In development mode,
ng-reflect-*attributes are no longer emitted by default. Tests or CSS selectors that depend on these attributes stop working. - The new
FormArraydirective can conflict with custom directives or inputs namedFormArray. - In the Router,
lastSuccessfulNavigationis now a signal, and navigation can take more asynchronous steps to complete. This can change the timing in your tests. AsyncPipenow reports errors toErrorHandler. In tests, uncaught listener errors are thrown again.
Deprecated APIs
The following APIs are deprecated, but are still available in Angular 21. You do not need to change them now.
*ngIf,*ngFor, and*ngSwitch
The recommended replacements are the built-in@if,@for, and@switchblocks. To migrate your templates automatically, runng generate @angular/core:control-flow.ComponentFactoryResolver- HammerJS
@angular/platform-browser-dynamic
For example, in the print-preview.component.html file of the print preview sample, the following template:
<h1 *ngIf="dataItem" [textContent]="dataItem.Title"></h1>
<h1 *ngIf="!dataItem">Loading..</h1>
is replaced with the following template:
@if (dataItem) {
<h1 [textContent]="dataItem.Title"></h1>
}
@if (!dataItem) {
<h1>Loading..</h1>
}
TypeScript and third-party packages
- TypeScript 5.9 has stricter type checking. Expect to fix implicit
anyand type inference errors in your custom code. - Any additional npm packages that your extensions use must be compatible with Angular 21 and with the supported Node.js versions.
Kendo UI changes
All Kendo UI for Angular packages in the Admin App are upgraded from 18.5.2 to 23.2.2, and the Kendo default theme is upgraded from 10.2.0 to 13.1.1. Kendo UI for jQuery, which the HTML editor uses, is upgraded from 2025.4.1321 to 2026.2.520.
The Admin App uses Kendo UI in the date and time pickers, the tree views in selectors, the pager, the splitter, charts, tooltips, icons, and the HTML field editor.
NOTE: Extensions do not inherit Kendo UI from the Admin App. The Admin App shares only
@angular/*,rxjs,tslib, and the Admin App extensibility API with your extensions.
Breaking changes in Kendo UI
The following changes are relevant if you use custom CSS in the Admin App, or if your extensions bundle Kendo UI for Angular:
| Version | Change | Who can be affected |
|---|---|---|
| Kendo theme 13.0 and Kendo UI for Angular 23.0 | Default option classes are no longer rendered. Size, roundness, and fill mode classes, such as k-button-md and k-rounded-md, are omitted when they match the default value. The theme color is rendered as a separate class. For example, k-button-solid k-button-primary replaces k-button-solid-primary. | Custom CSS that targets compound classes, such as .k-*-solid-primary, or .k-*-md classes. These selectors stop matching without any warning. |
| Kendo theme 13.0 and Kendo UI for Angular 23.0 | The TreeView markup is restructured. k-treeview-item-content replaces k-treeview-top, k-treeview-mid, and k-treeview-bot. The k-hover, k-focus, k-selected, and k-disabled state classes move from k-treeview-leaf to k-treeview-item-content. The new --kendo-treeview-level CSS variable controls the indentation. Chevron icons replace the caret icons. | Custom CSS that targets tree rows, for example, in selector fields. |
| Kendo UI for Angular 23.0 | fillMode, size, and themeColor default to undefined, and the theme determines the appearance. These options no longer accept the 'none' value. | Extensions that bundle Kendo UI for Angular components and set these options. The build fails with a compile-time error. |
| Kendo theme 12.0 | The $kendo-[component]-padding-x and $kendo-[component]-padding-y SCSS variables are renamed to their -md forms, for example, $kendo-button-md-padding-x. | Custom Kendo theme SCSS that you build from source. The old variable names stop applying without any warning. |
| Kendo theme 11.0 | The legacy Sass color variables, such as $kendo-color-primary, are removed. Use k-color(primary) and the related functions instead. | Custom Kendo theme SCSS that you build from source. The build fails. |
| Kendo UI for Angular 19.0 | In the date and time pickers, clearTitle is renamed to adaptiveCloseButtonTitle, and title and subtitle are renamed to adaptiveTitle and adaptiveSubtitle. min and max now have default values. | Extensions that bundle Kendo UI for Angular date inputs. The build fails with a compile-time error. |
| Kendo UI for jQuery 2026.1 and 2026.2 | In the HTML editor, the default appearance changes the same way as in Kendo UI for Angular. The k-overlay-light loader overlay class is renamed to k-overlay. Chevron icons replace the caret icons. The Editor API is not changed. | Custom CSS that targets the HTML editor toolbar or the loading overlay. |
For more information, see the following Telerik resources:
- Kendo UI for Angular changelog
- Kendo UI for Angular rendering changes
- Kendo UI for Angular system requirements
- Kendo theme breaking changes in version 11, version 12, and version 13
Visual and markup changes in the Admin App
The following changes are visible in the Admin App. They indicate what you might see if you use custom styling:
- Date and time pickers
The layout of the calendar and clock toggle buttons is changed, and Kendo UI uses its own font icons. The.k-widgetclass is no longer rendered. The.k-inputand.k-pickerelements have a border andoverflow: hidden. - Calendar
The day cells have a different default shape and hover style. - HTML editor toolbar
Thek-toolbar-solid,k-toolbar-md, andk-button-solidmodifier classes are no longer applied. As a result, standalone toolbar buttons use the default outline appearance. - MVC pages in the frontend
TheTelerik.Web.UIstylesheet loads after the Admin App styles and overrides some.k-inputstyles. The Admin App compensates for this. However, custom stylesheets that reset.k-*classes can still interfere with the Admin App.
Verify your custom styling and extensions
- If you override Kendo UI
.k-*selectors or Kendo theme variables in the Admin App, verify the appearance after the upgrade. Pay particular attention to tree views, buttons, date and time pickers, and the HTML editor toolbar. - If your extensions bundle their own Kendo UI for Angular components, use a version that supports Angular 21 and verify your extensions against the new theme. Kendo UI for Angular 23.2.2 supports Angular 19 to 21.
Other changes in the Admin App
The Admin App also updates third-party libraries that it uses internally. These libraries are not shared with extensions. The following updates might affect your users:
oidc-client-tsis upgraded to 3.5.0, which adds validation of the ID tokennonce. If your users sign in with external identity providers, test the sign-in after the upgrade.dompurifyis upgraded to 3.4.0, which includes upstream security fixes. The sanitizer is stricter against attack payloads. The allowed lists of elements and attributes are not changed.
Troubleshooting
| Symptom | Cause and solution |
|---|---|
npm install fails with an ERESOLVE error. | @progress/sitefinity-adminapp-sdk declares Angular peer dependencies <=19.2.x. Run npm install --legacy-peer-deps or npm install -f. |
You receive the The Angular CLI requires a minimum Node.js version error, or ESLint reports syntax errors. | Your Node.js version is not supported. Upgrade Node.js to ^20.19.0, ^22.12.0, or >=24.0.0. |
ng lint reports errors about .eslintrc. | The legacy ESLint configuration files are still in your project. Delete them and use eslint.config.mjs. |
TypeScript reports errors about moduleResolution or unresolved packages. | In the tsconfig.json file, set moduleResolution to bundler and module to es2020. |
| Your extensions load on the development server, but not in Sitefinity CMS. | The deployed bundle is built on Angular 19 or against a different SDK version. Rebuild your extensions from the repository tag that matches your Sitefinity CMS version and deploy the new bundle. |