---
title: "1.20 release notes"
canonical_url: "https://www.nutrient.io/guides/web/release-notes/1-20/"
md_url: "https://www.nutrient.io/guides/web/release-notes/1-20.md"
last_updated: "2026-08-13T00:00:00.000Z"
description: "Lists important changes for Nutrient Web SDK 1.20"
---

Nutrient Web SDK 1.20 deprecates the blocks UI customization API in favor of the `ui` slot configuration; adds support for default parameter values in PDF JavaScript; and tightens runtime validation across the model, toolbar, and tool item APIs. It also stops the secondary toolbar from permanently covering document content, speeds up Content Editor startup and thumbnails sidebar resizing, updates GdPicture, and ships a broad round of collaboration, forms, and rendering fixes. See the [changelog](https://www.nutrient.io/guides/web/changelog.md#1.20.0) for full details.

### The blocks UI customization API is deprecated

The `ui._blocks` customization API is deprecated and will be removed in a future release. Use the [`ui` slot configuration](https://www.nutrient.io/guides/web/user-interface/ui-customization/introduction/) instead. **If you customize the UI through blocks, migrate to the equivalent slot.**

```js

// Deprecated: block-based customization.
NutrientViewer.load({
  ui: {
    _blocks: {
      [NutrientViewer.Interfaces.Search]: ({ props }) => ({
        content: myCustomSearch(props),
      }),
    },
  },
});

// Use the equivalent slot instead.
NutrientViewer.load({
  ui: {
    search: (getInstance, id) => ({
      render: () => myCustomSearch(),
    }),
  },
});

```

Because `_blocks` isn’t part of the published type declarations, the console is the only channel available for this notice. Loading a configuration that uses it now logs one deprecation warning:

- Configuring the same component through both APIs logs an additional warning per component, naming the slot path and the block so you know exactly what to migrate. Which of the two renders depends on the component and on what the slot provides, so this case was previously invisible. The `minimal` UI preset hides every slot a block maps onto, so conflicts surface there too.

- Passing `_blocks` to `instance.setUI()` has never had an effect — the value is always overwritten with the current one — and now reports that instead of failing silently.

For the list of slots and what each one replaces, refer to the [UI customization](https://www.nutrient.io/guides/web/user-interface/ui-customization/introduction.md) and [supported slots](https://www.nutrient.io/guides/web/user-interface/ui-customization/supported-slots.md) guides.

### Default parameter values in PDF JavaScript

PDF JavaScript function declarations now support default parameter values, so documents whose scripts rely on them evaluate correctly instead of failing to parse:

```js

function formatTotal(amount, currency = "USD") {
  return amount + " " + currency;
}

```

For more information, refer to the [JavaScript support](https://www.nutrient.io/guides/web/forms/javascript-validation.md) guide.

### Stricter validation for models, toolbars, and tool items

Model, toolbar, and tool item validation now runs on shared schemas rather than hand-written checks, which closes a set of holes where malformed input was accepted or surfaced as an opaque `TypeError`. **Input that was previously tolerated now throws**, so review any call site that passes values built from user input or an external source.

- Non-finite numbers (`NaN`, `Infinity`, `-Infinity`) are rejected where a number is expected — for example, `Bookmark.sortKey` and `CustomOverlayItem.pageIndex`.

- Malformed comments, mentionable users, and document descriptors report a named validation error. For example, `new NutrientViewer.DocumentDescriptor(null)` now throws `DocumentDescriptor: Expected an object.` instead of `TypeError: Cannot destructure property 'filePath' of 'null'`.

- `instance.setMentionableUsers()` stored its argument unchecked and now applies the same rules as the `load()` configuration path.

- `avatarUrl` and `description` on mentionable users are checked whenever they’re present, not only when they’re truthy, so values such as `0` and `false` are no longer accepted.

- Toolbar items, tool items, Document Editor footer items, and inline text selection toolbar items reject invalid `string` and `mediaQueries` values consistently across all variants.

- DOM nodes in tool items are validated by node type rather than with `instanceof Node`, so a node created in another realm — an iframe, for example — is accepted.

For any given invalid input, the field reported first is unchanged, so error strings you match on in existing code stay the same.

### Read-only geometry model types

The geometry models — `Rect`, `Point`, `Size`, `Inset`, `DrawingPoint`, and `TransformationMatrix` — now expose read-only properties and the same standard Immutable Record method subset as every other model. This is a type-only change: Runtime behavior is untouched, and these objects were already immutable. **TypeScript now reports an error where your code assigns to a property**; use `set()` to derive a new value instead:

```js

const rect = new NutrientViewer.Geometry.Rect({
  left: 0,
  top: 0,
  width: 100,
  height: 50,
});

// Previously allowed by the types, but never applied at runtime.
// rect.left = 10;

// Derive a new value instead.
const movedRect = rect.set("left", 10);

```

### Secondary toolbar no longer covers document content

The secondary toolbar reserves scrollable space while it’s open instead of overlaying the document, so content underneath it is always reachable. The space is reserved above the first page with the default toolbar placement, and below the last page when `toolbarPlacement` is `BOTTOM`.

### Performance improvements

- Content Editor startup is faster because fonts are cached and reused across editing sessions instead of being loaded again for each one.

- The thumbnails sidebar feels immediate while being resized: Thumbnails settle directly at their final position rather than animating into it, so the list no longer shifts after it renders and click targets stay steady.

### Other additions

- GdPicture is updated to 14.4.7. Refer to the [GdPicture changelog](https://www.nutrient.io/guides/dotnet/changelog.md#14.4.7) for details.

- Progressive page renders that exhaust WebAssembly memory now surface a typed out-of-memory error instead of retrying through direct rendering, which prevents memory-exhaustion crash loops on very large pages.

### Collaboration and forms

- Fixes updates to annotations, comments, and form fields being silently discarded when Collaboration Permissions are enabled and the update was issued before Document Engine acknowledged the record’s creation.

- Fixes chained form field calculations not being fully recalculated when the document’s calculation order lists dependent fields before the fields they depend on.

- Fixes Document Compare requiring a trailing slash on the AI Assistant `backendUrl`.

### Rendering and editing

- Fixes washed-out colors when rendering PDFs that use CMYK transparency groups with process black or DeviceN shadings.

- Fixes dashed lines with fractional dash patterns rendering as solid lines.

- Fixes free text callout annotations sometimes rendering text too small or clipped.

- Fixes ink strokes changing after they’re completed.

- Fixes a crash on Safari and iOS 15.4–16 when rendering text containing a URL.

### User interface

- Fixes the viewer losing its scroll position when opening or closing the sidebar, which left it showing a blank page or jumping to the first page instead of staying on the current page.

- Fixes annotation placement when browser extensions load with custom toolbars.

- Fixes the loading skeleton showing its toolbar at the top when `toolbarPlacement` is set to `BOTTOM`.

- Fixes the text annotation opacity slider on mobile closing after a single step instead of following a press and drag to the chosen value.

- Fixes reopening the reply editor when returning to a comment thread with an unsaved edit.

- Fixes rich text annotation editor text selection spanning multiple nodes in the shadow DOM viewer variant.

- Fixes measurement settings modal colors for built-in and custom dark themes.

### Loading, platform, and API reference

- Fixes aborting `NutrientViewer.load()` with an `AbortSignal` hanging instead of rejecting when the SDK is rendered in an iframe.

- Fixes a `ReferenceError` in the Node SDK when applying an `importDocument` document operation on Node.js 18 and 19, which have no global `File`.

- Fixes corrupted type signatures and missing property descriptions on several API reference pages, along with the annotation class names shown for `defaultAnnotationsSidebarContent` and `defaultEditableAnnotationTypes`.

For a full list of fixes, refer to the [changelog](https://www.nutrient.io/guides/web/changelog.md#1.20.0).

Document Engine 1.5.6 or later can run this release. In server-backed mode, using `SearchType.WORD_BASED`, removing password protection during PDF export, and removing annotation notes after an XFDF roundtrip require Document Engine 1.16.0 or later. Document-defined annotation tab order requires Document Engine 1.18.0 or later. See the [Web SDK and Document Engine compatibility requirements](https://www.nutrient.io/guides/document-engine/viewer/client-integration/web.md#version-compatibility).

For a complete list of changes, bug fixes, and improvements, refer to the [changelog](https://www.nutrient.io/guides/web/changelog.md#1.20.0). For previous release notes, refer to the [Web SDK 1.19 release notes](https://www.nutrient.io/guides/web/release-notes/1-19.md). We appreciate your feedback and contributions as we continue to enhance Nutrient Web SDK.
---

## Related pages

- [1 0](/guides/web/release-notes/1-0.md)
- [1 1](/guides/web/release-notes/1-1.md)
- [1 10](/guides/web/release-notes/1-10.md)
- [1 11](/guides/web/release-notes/1-11.md)
- [1 12](/guides/web/release-notes/1-12.md)
- [1 13 1](/guides/web/release-notes/1-13-1.md)
- [1 13](/guides/web/release-notes/1-13.md)
- [1 14](/guides/web/release-notes/1-14.md)
- [1 15](/guides/web/release-notes/1-15.md)
- [1 16](/guides/web/release-notes/1-16.md)
- [1 17](/guides/web/release-notes/1-17.md)
- [1 18](/guides/web/release-notes/1-18.md)
- [1 19](/guides/web/release-notes/1-19.md)
- [1 2](/guides/web/release-notes/1-2.md)
- [1 3](/guides/web/release-notes/1-3.md)
- [1 4](/guides/web/release-notes/1-4.md)
- [1 5](/guides/web/release-notes/1-5.md)
- [1 6](/guides/web/release-notes/1-6.md)
- [1 7](/guides/web/release-notes/1-7.md)
- [1 8](/guides/web/release-notes/1-8.md)
- [1 9](/guides/web/release-notes/1-9.md)
- [2017 3](/guides/web/release-notes/2017-3.md)
- [2017 6](/guides/web/release-notes/2017-6.md)
- [Update your PSPDFKit for Web to version 2017.7](/guides/web/release-notes/2017-7.md)
- [Upgrade annotations in PSPDFKit Web 2017.8](/guides/web/release-notes/2017-8.md)
- [Explore new features in PSPDFKit for Web 2017.9](/guides/web/release-notes/2017-9.md)
- [New features in the 2018.1 migration guide](/guides/web/release-notes/2018-1.md)
- [PSPDFKit for Web 2018.2 migration insights](/guides/web/release-notes/2018-2.md)
- [Discover the new features in PSPDFKit for Web 2018.3](/guides/web/release-notes/2018-3.md)
- [Explore PSPDFKit for Web 2018.4 features](/guides/web/release-notes/2018-4.md)
- [Explore new features in PSPDFKit 2018.5](/guides/web/release-notes/2018-5.md)
- [Explore PSPDFKit for Web 2018.6 enhancements](/guides/web/release-notes/2018-6.md)
- [Explore the new features in PSPDFKit 2018.7](/guides/web/release-notes/2018-7.md)
- [Key updates in PSPDFKit for Web 2019.1](/guides/web/release-notes/2019-1.md)
- [2019 2](/guides/web/release-notes/2019-2.md)
- [PSPDFKit for Web 2019.3 migration highlights](/guides/web/release-notes/2019-3.md)
- [Essential updates in PSPDFKit for Web 2019.4](/guides/web/release-notes/2019-4.md)
- [PSPDFKit for Web 2019.5 migration insights](/guides/web/release-notes/2019-5.md)
- [Key changes in PSPDFKit for Web 2020.1](/guides/web/release-notes/2020-1.md)
- [Seamless migration to PSPDFKit for Web 2020.2](/guides/web/release-notes/2020-2.md)
- [Upgrade to PSPDFKit Web 2020.3 seamlessly](/guides/web/release-notes/2020-3.md)
- [PSPDFKit Web and Server 2020.4 migration update](/guides/web/release-notes/2020-4.md)
- [Unified CRUD API enhancements for easy migration](/guides/web/release-notes/2020-5.md)
- [PSPDFKit Web 2020.6 migration insights](/guides/web/release-notes/2020-6.md)
- [Upgrade to PSPDFKit for Web 2021.1 with ease](/guides/web/release-notes/2021-1.md)
- [Seamlessly migrate to PSPDFKit for Web 2021.2](/guides/web/release-notes/2021-2.md)
- [2021 3](/guides/web/release-notes/2021-3.md)
- [PSPDFKit 2021.4 migration guide for seamless updates](/guides/web/release-notes/2021-4.md)
- [Migration guide for PSPDFKit 2021.5](/guides/web/release-notes/2021-5.md)
- [2021 6](/guides/web/release-notes/2021-6.md)
- [PSPDFKit 2022.1.1 migration changes](/guides/web/release-notes/2022-1.md)
- [Enhancements in PSPDFKit for Web 2022.2](/guides/web/release-notes/2022-2.md)
- [Explore the new features of PSPDFKit for Web 2022.3](/guides/web/release-notes/2022-3.md)
- [PSPDFKit for Web 2022.4 migration overview](/guides/web/release-notes/2022-4.md)
- [Key improvements in PSPDFKit for Web 2022.5](/guides/web/release-notes/2022-5.md)
- [Discover the key updates in PSPDFKit for Web 2023.1](/guides/web/release-notes/2023-1.md)
- [PSPDFKit 2023.2 migration and updates](/guides/web/release-notes/2023-2.md)
- [Key updates in PSPDFKit for Web 2023.3](/guides/web/release-notes/2023-3.md)
- [Explore key updates in PSPDFKit for Web 2023.4](/guides/web/release-notes/2023-4.md)
- [Key updates in PSPDFKit for Web 2023.5](/guides/web/release-notes/2023-5.md)
- [Essential Nutrient Web SDK 2024.1 migration tips](/guides/web/release-notes/2024-1.md)
- [2024 2](/guides/web/release-notes/2024-2.md)
- [2024 3](/guides/web/release-notes/2024-3.md)
- [2024 4](/guides/web/release-notes/2024-4.md)
- [2024 5](/guides/web/release-notes/2024-5.md)
- [2024 7](/guides/web/release-notes/2024-7.md)
- [2024 8](/guides/web/release-notes/2024-8.md)
- [Upgrading Nutrient Web SDK](/guides/web/release-notes/upgrading.md)

