CreativeEditor SDK - Full Changelog ================================================== Version 1.83.0 Released: October 1, 2026 -------------------------------------------------- **Breaking Changes** **CMYK & Spot Colors** - **Engine:** Improved CMYK colors with ICC-accurate conversion through the document CMYK profile instead of basic channel inversion. A key-only black and a rich black now render as different colors, as they print. This changes previews and raster exports. An export that keeps device CMYK is unchanged, because it writes ink values and converts nothing. - **Engine:** Improved tinted CMYK colors by scaling print ink values instead of blending the converted color toward white. - **Engine:** Fixed a spot color used as a gradient color stop, which now renders with its defined approximation. It previously rendered as magenta, the placeholder for an undefined spot color. - **Engine:** Fixed the tint of a spot color used as a drop shadow color, which rendering ignored. - **Engine:** Added the `scene/colorConversionMode` property, which selects how a scene converts CMYK values for display. A new scene is `Managed` and converts through the document CMYK profile. A scene saved before this release loads as `Legacy` and keeps the previous CMYK channel-inversion conversion. Set the property to `Managed` to adopt the accurate CMYK conversion for an existing design. Spot colors use the corrected approximation and tint handling in both modes; a CMYK spot approximation follows the selected mode. - **Engine:** `convertColorToColorSpace` now converts a CMYK color to sRGB through the document CMYK profile in a `Managed` scene, so it returns the same color the engine renders. The returned values differ from the previous channel inversion. A `Legacy` scene keeps the previous conversion. - **Engine:** `convertColorToColorSpace` now fails with `COLOR.PROFILE_NOT_LOADED` when a conversion needs the CMYK profile and the profile is still loading. The call requests the profile; run `update()` until loading finishes before converting again. If no usable profile can be loaded, conversion reports a missing profile with the failed URI. Fix the profile setting before retrying. It previously returned an unmanaged color that a later call would not repeat. A `Legacy` scene needs no profile and never fails this way. - **Engine:** Added `loadCMYKProfile`, which waits for the document CMYK profile before trying `fallbackCMYKProfileUri` when needed. Await it before dependent conversions and after changing profiles. CMYK fills, text, strokes, shadows, and effects keep an export waiting while the profile loads. If no usable profile can be read, the export completes with the unmanaged conversion and reports the failed URI once. - **Engine:** In Managed scenes, sRGB colors and RGB-only spot colors now convert to CMYK through the document or fallback profile. Conversion can fail while the profile loads. Wait for `loadCMYKProfile()` to complete before converting a color to CMYK. Profiles that only convert CMYK to RGB continue to use a simple formula. **Asset Placement, Drag & Drop** - **Engine (Android / Swift / Web / Node):** Applying an asset now takes an optional placement. It puts the new block in a given parent, centered on a given point. Android: Added overloads of `applyAssetSourceAsset` and `defaultApplyAsset` that take an `AssetPlacement`. Swift: Added `apply(sourceID:assetResult:placement:)` and `defaultApplyAsset(assetResult:placement:)`, which take an `AssetPlacement`. Web / Node: `engine.asset.apply` and `engine.asset.defaultApplyAsset` now take a `placement` option. - **Engine:** Added a drag gesture that swaps two image fills. It is off by default. The `dragToSwapFills/enabled` setting turns it on. - **Engine/Web:** The engine now handles drag & drop from outside the canvas. It outlines the block that would take the drop and runs the `asset.drop` action on release. By default the action replaces that block's content, or adds the asset where it was released. Register your own `asset.drop` to change it. - **Engine:** The `page/highlightDropTarget` outline now follows the dragged element without a frame of delay, and marks the page the element lands on when `page/reparentBlocksToSceneWhenOutOfPage` is on. - **Engine/Web:** While the swap gesture holds an image, a preview of the image follows the pointer. Escape cancels the swap. - **Editor/Web:** Users can now drag a library asset onto an image to replace it. A drop on a page adds the asset where it was released. A press and hold starts the same drag on a touch screen, and on a small screen the library closes to show the canvas. The `ly.img.dragAndDrop.asset` feature key turns it on, and the Design, Photo, Video, Advanced and Advanced Video editors have it on. - **Editor/Web:** A configuration that lists its feature keys and predates this release does not list `ly.img.dragAndDrop.asset`, so its library cards can no longer be dragged. Add the key, or declare the release the configuration was written for with `setEditorCompatibilityVersion`. - **Editor/Web:** A library drop no longer applies the asset to the selected block. To keep that behavior, register your own `asset.drop` action that applies the asset to the selection. - **Editor/Web:** A drop runs the `asset.drop` action. Register your own with `cesdk.actions.register('asset.drop', …)` to handle drops from your own drag source. - **Editor/Web:** A library drag no longer carries the `//ly.img.asset` data type. A custom drop target that read it no longer receives library drags. It now carries the asset source and the asset id under the types `ASSET_SOURCE_TYPE` and `ASSET_ID_TYPE`, and the content kind under `contentKindType(kind)`, which `@cesdk/engine` exports. - **Editor/Web:** Users can now swap two images. Press and hold an image, or hold Alt, then drag it onto another image. The `dragToSwapFills/enabled` engine setting turns it on, and the Design, Photo, Video, Advanced and Advanced Video editors have it on. - **Editor/Web:** Screen readers now announce the result of a drop. **Text Alignment** - **Engine:** Text blocks and captions have a new alignment, `Justify`. It widens the gaps between words to fill the block width. The last line of a paragraph keeps its natural width. An older engine opens a scene with justified text and shows it aligned like `Auto`. - **Engine (Swift + Android):** Swift: `HorizontalTextAlignment` has a new `justify` case. The raw value of `auto` changes from `3` to `4`. This fixes a crash when an app read the alignment of a text block set to `Auto`. Update a `switch` that lists every case. Android: `HorizontalAlignment` has a new `Justify` value. Update a `when` that lists every value. **Timeline Customization** - **Editor/iOS:** Added timeline customization. Pass a `Timeline.Configuration` to `Timeline` to configure the timeline instead of rebuilding it. - **Editor/iOS + Android:** iOS: `Timeline` now renders its tracks alone: no header, and no "Add Clip" or "Add Audio" button. An integration that mounts `Timeline` — or the deprecated `DefaultTimelineComponent` — without a configuration loses those three surfaces and keeps compiling, so add them back with `header(_:)`, `addClip` and `addAudio`. An integration built on the video starter kit is unchanged, because the starter kit declares all three. Android: The timeline now renders its tracks alone by default: no header, and no "Add Clip" or "Add Audio" button. Add each surface through `headerListBuilder`, `addClipButton` and `addAudioButton`. The video starter kit declares all three, so its timeline is unchanged. - **Editor/iOS:** Every built-in timeline item and add-content option now takes an `isEnabled`, matching the canvas menu buttons. `DefaultTimelineComponent` is deprecated and renamed to `Timeline`, which is now both the component and the namespace for everything that customizes it. - **Editor/iOS:** The timeline's "Add Clip" and "Add Audio" buttons are now configurable. Choose which sources appear and in which order, relabel or re-icon them, replace what a built-in source does, hide one conditionally, or add your own with `Timeline.AddClipOption.custom(…)`. Add Clip offers the camera and the asset library by default, and `Timeline.AddClipOption.photoRoll()` adds the privacy-friendly photo picker. Add Audio offers music and voiceover. Both buttons also take a `title` and an `icon` that replace the button's own label. - **Editor/iOS:** The timeline header is now configurable. Set your own items leading, centered, or trailing with `header(_:)` and `Timeline.ItemGroup`, or adjust the built-in header with `modifyHeader(_:)` so later built-in items still reach your integration. `addFirst(placement:_:)` and `addLast(placement:_:)` place an item at an edge without naming a neighbouring one. `Timeline.Labels.timecode`, `Timeline.Buttons.playPause`, `Timeline.Buttons.loop`, `Timeline.Buttons.toggleExpanded` and `Timeline.Spacer` build the built-in items. `playPause` and `loop` take an `icon`, `timecode` and `toggleExpanded` a whole `label`, and each button also takes an `action` that replaces what it does. - **Editor/iOS:** The timeline height is now expressed in track rows instead of points. It grows to at most three tracks by default, or you can set a fixed number of tracks. - **Editor/iOS:** The timeline's expanded state can now be driven by your own binding through `Timeline(context:configuration:isExpanded:)`. **Resource Loading** - **Engine:** `forceLoadResources` now waits for fonts. Before, it could finish while a font was still loading. Text was then measured with a different font. - **Engine:** `getState` now reports `Pending` after `setFont`, while the font loads. Before, it reported `Ready` too early. - **Engine:** `forceLoadResources` now reports an error when a resource did not load. Before, it reported success. - **Migration guide:** Migrating to v1.83 ([iOS](https://img.ly/docs/cesdk/ios/to-v1-83-6ee1d1/), [Android](https://img.ly/docs/cesdk/android/to-v1-83-6ee1d1/)) shows how to declare the timeline's header and buttons. --- **Deprecations** _All items below remain functional this release; migrate before they are removed._ **Asset Sources** - **Engine (Web + Node):** `asset.canManageAssets` is deprecated. It reports whether a source declared the deprecated `canManageAssets` flag, not whether assets can be added to or removed from that source. To control whether an upload button is offered, use the `canAdd` option on an asset library entry instead. **Stroke Caps & Scene Duration** - **Engine:** `setStrokeCap` and `getStrokeCap` are now deprecated in the C++ API, as they already were on Web, Android and iOS. Use `setStrokeStartCap` and `setStrokeEndCap` to set each end, and `getStrokeStartCap` and `getStrokeEndCap` to read them. - **Engine:** `getTotalSceneDuration` is now deprecated in the C++ API, as it already was on Web and Android. Use `getDuration` with a page block instead. **Navigation Bar Configuration** - **Editor/Web:** The `ui.elements.navigation.position` configuration option is deprecated. Use `cesdk.ui.setNavigationBarPosition()` instead. --- **New Features** **Editor Configuration & Platform Support** - **Editor/Android:** Add support for Android 17. - **Editor/Web:** `@cesdk/cesdk-js` now exports the `SceneDesignUnit` type. - **Editor/Web:** `cesdk.setEditorCompatibilityVersion('1.82.0')` pins an editor configuration to the CE.SDK version it was written for, so listed behavior changes from later versions do not apply to it. Call it after `cesdk.resetEditor()`, which clears any previous pin. The CE.SDK editor configurations and starter kits pin it for you; a configuration that does not pin gets the current release's behavior. **Layers, Pages & Grouping** - **Editor/Web:** Added keyboard shortcuts for the stacking order. `Cmd/Ctrl+]` and `Cmd/Ctrl+[` move the selection one step towards the front and the back; `]` and `[` move it all the way. They run the new `selection.bringForward`, `selection.sendBackward`, `selection.bringToFront` and `selection.sendToBack` actions, which move every selected block and can be run directly with `cesdk.actions.run('selection.bringToFront')`. - **Editor/Web:** Added a layer and page list, opened from a new button at the bottom of the dock. It shows the document's pages above the layers of the page being worked on. A row selects its block, renames it in place, hides it, locks it, and opens a menu of the commands that apply to it. Holding Alt on the eye or the padlock leaves only that row shown or unlocked, and holding it again brings the rest back. Dragging a row reorders the block or moves it into a group or another page. Pressing the space under the rows or a section heading clears the selection. A selection made on the canvas scrolls its row into view. The design and advanced editor configurations declare the dock button as an `ly.img.assetLibrary.dock` entry keyed `ly.img.layerList` whose click handler opens the panel; an integration with its own dock order adds the same entry, or opens the list by its panel id, `//ly.img.panel/layers`. - **Editor/Web:** Every row of the layer and page list can show a thumbnail of its block, kept current as the block changes. Enabled with the `ly.img.layerList.thumbnails` feature. - **Editor/Web:** The list is gated by the `ly.img.layerList` feature and its children `ly.img.layerList.panel`, `.visibility`, `.lock`, `.reorder`, `.rename` and `.menu`, so the panel and each row control can be turned off on its own. All are enabled by default. - **Editor/Web:** `ly.img.layerList.pages` and `ly.img.layerList.layers` choose which lists the panel holds, and are both enabled by default. `ly.img.layerList.combined` replaces both with a single tree of every page and its layers, and is off by default. - **Editor/Web:** `ly.img.layerList.canvasFollow` scrolls the canvas to the block a row picks, and follows a page row only by default. `cesdk.feature.set('ly.img.layerList.canvasFollow', true)` follows every row; `cesdk.feature.disable('ly.img.layerList.canvasFollow')` follows none. - **Editor/Web:** The menu on a layer or page row is driven by the Component Order APIs under the new `ly.img.layerList.menu` UI area (`cesdk.ui.setComponentOrder`, `getComponentOrder`, `insertOrderComponent`, `updateOrderComponent`, `removeOrderComponent`). A page row and a layer row read their own order, selected with `when: { rowKind: 'page' | 'layer' }`. The built-in entries are registered as components (`ly.img.layerList.menu.rename`, `.duplicate`, `.delete`, `.group`, `.ungroup`, `.bringToFront`, `.bringForward`, `.sendBackward`, `.sendToBack`, `.page.addAbove`, `.page.addBelow`) and custom entries can be added with `cesdk.ui.registerComponent`. - **Editor/Web:** A row's padlock writes the engine's own transform lock, so it is saved with the scene and applies on the canvas. A locked block, and a block inside a locked group, does not reorder by drag, by the row menu or by the bracket keys. It can still be selected, inspected and restyled. - **Engine:** A block that already belongs to a group can be grouped again, so a group can be made inside another group from a selection. A selection that spans two containers now moves every member into the new group. `isGroupable` refuses a block grouped together with a container it sits inside, which would make that container a child of itself, and it also refuses a scene, a page and an empty selection. - **Editor/Web:** Added the `page.add` action. Override it to choose where a new page is inserted. - **Editor/Web:** Added the `page.moveUp` and `page.moveDown` actions, which move the selected page. **Snapping & Image Source Sets** - **Engine:** Added equal-distance snapping. A dragged block snaps to equal spacing with its siblings, and a badge shows the size of each gap. While the snap holds the block, the engine does not round its position to the pixel grid. It is off by default. Turn it on with the `features/equalDistanceSnappingEnabled` setting. - **Engine:** Set `features/automaticSourceSetsEnabled` to true and an image fill you add gets the smaller entries of its source set by itself, so the engine can draw a small image where the full one is not needed. A fill that comes from a loaded scene gets none, and a duplicate or an undo step keeps the entries it has. The smallest entry is 512 pixels on the long edge and the largest is your own image, so an image under 1024 pixels gets none and an export still uses the full resolution. An entry is a JPEG at quality 90 for an image without alpha and a PNG for one with it. The setting is off by default. The entries are transient resources that state the `buffer` scheme: `saveToArchive` carries their bytes and needs nothing, while `saveToString` needs a persistence callback (on web and iOS) or the entries stored by hand first (on Android), or it reports the scheme and stops. **Print Setup, Exclusion Areas & Photobooks** - **Engine:** A new `exclusionArea` block marks a region of a page that content must stay out of, for example a window on an envelope or a spine on a book cover. An exclusion area is left out of an export, or cut out of it with the new `exclusionArea/punchOut` property. The new `exclusionArea/constrains` property says whether the exclusion area holds content out of itself while the user drags, nudges or resizes a block. It is off by default, so a new exclusion area marks a region and nothing more. Turn it on for a region the engine must hold content out of, an envelope window or a die cut. An exclusion area groups only with another exclusion area, so the marker cannot be welded to the artwork it marks. A scene that holds an exclusion area does not open in an earlier version of the engine. See [Exclusion Areas](https://img.ly/docs/cesdk/js/concepts/exclusion-areas-c2b87b/). - **Engine:** The new `findAllInExclusionAreas` API returns every block that overlaps an exclusion area, see [Exclusion Areas](https://img.ly/docs/cesdk/js/concepts/exclusion-areas-c2b87b/). - **Engine:** Pages carry a safety inset, an inward distance from the page edge that marks where content must stay for print. Set it with the new `page/safetyEnabled` and `page/safetyInset/left`, `/top`, `/right`, `/bottom` properties. Its guide appears while a drag, or a move or resize with the arrow keys, comes near it. Set `page/safetyRevealDuringTransform` to `false` to draw the guide all the time. See [Pages](https://img.ly/docs/cesdk/js/concepts/pages-7b6bae/). - **Engine:** The new export options `exportPdfWithCropMarks` and `exportPdfWithRegistrationMarks` add crop marks and registration marks to a PDF export, both off by default. See the [Export to PDF](https://img.ly/docs/cesdk/js/export-save-publish/export/to-pdf-95e04b/) guide. - **Editor/Web:** Selecting an exclusion area now shows an Exclusion Area Settings panel with two toggles: whether the area holds other blocks out, and whether it cuts its region out of the export. Enable it with the new `ly.img.page.printMarks.exclusionArea` feature key. - **Editor/Web:** Added a Photobook Editor starter kit that builds a print-ready photo book from a template: a layouts library per page format, auto-fill that matches each photo to the slot that crops it least, live design validation, a page-spread preview, and export to PDF/X-4 with a FOGRA39 output intent. Export runs in the browser by default and can offload rendering to the bundled Node server. - **Editor/Web:** Added a Print Setup panel in the document inspector. Bleed is now set per side, with a lock that links the sides, replacing the single document-wide value. - **Editor/Web:** The Print Setup panel adds crop and registration marks to PDF exports, with a configurable offset, length and weight. The offset and length are in the scene's design unit, the weight in points. Exports via the export button or `cesdk.utils.export()` include them; each print-mark option a caller passes overrides the panel for that one option. `cesdk.export()` and `engine.block.export()` are unchanged. - **Editor/Web:** Added Feature API keys `'ly.img.page.printMarks.crop'` and `'ly.img.page.printMarks.registration'`, which control the printer's marks in the Print Setup panel. Enabled in the advanced editor configuration, disabled elsewhere. Their parent key `'ly.img.page.printMarks'` turns both on at once. - **Editor/Web:** Added Feature API key `'ly.img.page.bleedColor'`, which controls the bleed color row in the Print Setup panel. - **Editor/Web:** New Safety Margin controls set an inward inset on each of the four sides, seeded at 10mm when first enabled. The document inspector sets the margin for every page, and selecting a page sets that page alone. Enable the controls with the new `ly.img.page.printMarks.safetyMargin` feature key, which is on in the design and advanced editor configurations. **CMYK Profiles & Imported JPEGs** - **Engine:** Added `setCMYKProfile` and `setCMYKProfileFromData` to use a document's CMYK profile for previews and raster exports. You can also inspect or remove the profile and configure rendering intent and black point compensation. - **Engine:** Imported JPEG fills can retain and render their source color space, ICC profile and decode ranges without changing the original image bytes. - **Engine:** Such a definition applies only while its image buffer holds the bytes it was read from. A write that changes those bytes switches the definition off, and writing them back switches it on again. **Text Backgrounds** - **Engine:** Added `setTextBackgroundColor` and `getTextBackgroundColors`. They set and read the background color of a range of text. A fully transparent color removes the background. The run background is independent of the block background and draws on top of it. - **Engine:** Added the text block properties `text/backgroundPadding/left`, `text/backgroundPadding/top`, `text/backgroundPadding/right`, `text/backgroundPadding/bottom` and `text/backgroundCornerRadius`. They set the size and the corners of the background of the text runs. Caption blocks get the same properties under `caption/`, and a caption track keeps them in sync. **Timeline, Navigation & Crop Customization** - **Editor/iOS:** `ForceCropMode.ifNeeded` now takes a configurable `threshold` that sets the tolerated difference between the current dimensions and the preset, matching Android. `.ifNeeded` keeps the previous behavior with a default threshold of `0.0001`. To tolerate a range of aspect ratios, use the midpoint of the range as the preset ratio and half of the range as the threshold. - **Editor/Android:** Added timeline customization. Configure the timeline with `Timeline.remember` and pass it as the `bottomPanel` instead of rebuilding it. - **Editor/Android:** The timeline's "Add Clip" and "Add Audio" buttons are now configurable through the new `addClipButton` and `addAudioButton` properties of `Timeline`. Both buttons and their menu entries are ordinary editor components, so they take the same `vectorIcon`, `textString`, `enabled` and `visible` properties as a dock button. Use `Timeline.Button.rememberAddClip` and `Timeline.Button.rememberAddAudio` to choose and reorder the entries built by `Timeline.AddClipOption.rememberCamera`, `rememberGallery`, `rememberLibrary`, `Timeline.AddAudioOption.rememberMusic` and `rememberVoiceover`, or add your own source with `Timeline.AddClipOption.remember` and `Timeline.AddAudioOption.remember`. Add Clip offers the camera and the asset library by default, Add Audio offers music and voiceover. Assign `null` to remove a button, or provide your own `EditorComponent` to replace it. A button with one remaining entry triggers it directly instead of opening a menu, and names that entry instead of showing the generic label. - **Editor/Android:** The timeline header is now configurable through the new `headerListBuilder` property of `Timeline`. Place your own components at the start, center or end, or adjust the built-in header with `Timeline.HeaderListBuilder.remember().modify { }` so that header items added in a future release still reach your integration. `Timeline.Label.rememberTimecode`, `Timeline.Button.rememberPlayPause`, `rememberLoop` and `rememberToggleExpanded` build the built-in items. Removing every header item removes the player bar with it. - **Editor/Android:** The timeline's expanded state can now be driven by your own `MutableState` through the new `expandedState` property of `Timeline`. It sets the initial state and stays in sync as the user or your integration expands and collapses the timeline, because the expand/collapse toggle writes back to it. By default the editor owns the state, which starts expanded and survives configuration changes. - **Editor/Web:** The navigation bar and the inspector bar can now be placed below the canvas with `cesdk.ui.setNavigationBarPosition('bottom')` and `cesdk.ui.setInspectorBarPosition('bottom')`. Both default to `'top'`. Call them after the editor configuration plugin, because `resetEditor()` restores the default placement. **AI Prompts & Reference Images** - **Editor/Web:** Added `builder.PromptInput()` to render a prompt field in a registered panel. The field grows with its text, from three lines to ten, and carries no resize handle. Its `attachments` option adds a row of the images the prompt refers to. Each carries a remove button, beside a button that asks the panel for another one. Without that option the field renders alone. - **Plugins/Web:** The prompt takes as many reference images as the model's schema allows. An image property of type `array` opens `maxItems` slots and receives a list, so a gateway model such as Seedream 4.5 takes ten images and FLUX.2 edit four. A string property, or an array whose schema names no limit, keeps one. - **Plugins/Web:** Added the Create Image from Reference quick action to the canvas menu of a selected image. It opens the image generation panel on the provider that owns the action, with the image attached to the prompt beside any images already there, and is disabled once the prompt has no room left. Every image-to-image provider offers it, and the feature key `ly.img.plugin-ai-image-generation-web.quickAction.createImage` turns it off. **Licensed Codecs** - **Engine/Node:** Added support for licensed codec packs downloaded from the licensing dashboard on Linux x86_64. Packs are automatically detected in `$HOME/.local/share/cesdk-codecs`; set `CESDK_LICENSED_CODEC_PACK` to use a custom installation directory. --- **Improvements & Behavior Changes** **Performance** - **Engine:** A PDF export with `exportPdfWithHighCompatibility` disabled no longer holds a decoded copy of an image above `maxImageSize` in the image cache. Such an export needs less memory. - **Engine/Web:** `CreativeEngine.init()` is faster, and no longer hangs when a browser's video codec does not answer. - **Engine:** Improved undo and redo performance in large scenes. - **Engine:** Improved emoji detection, text creation, shaping, and typing performance while reducing memory churn for long plain and wrapped text. - **Engine:** Improved scrolling performance. - **Engine:** An image is no longer decoded at full resolution to build a hit-test mask or to read its width and height. A scene with large photos now holds much less memory, and an export of it is faster. **Color Management & PDF Output** - **Engine:** A PDF export now writes the `TrimBox` and the `BleedBox` of every page that has a bleed margin (`page/margin`). The `MediaBox` alone does not say where a print shop cuts. The `TrimBox` is the page frame and the `BleedBox` is the sheet around it. A page with no bleed gets no boxes, because its sheet is already the trim. A page whose bleed is not a rectangle gets no boxes either, because a PDF page box is a rectangle. That covers a page with a non-rectangular shape and a page using `page/marginScale`, whose cut line is a die line. No export changes size, and there is no new option to set. - **Engine:** CMYK and YCCK JPEGs without embedded profiles now use the document CMYK profile in managed scenes. Set `scene/colorConversionMode` to `Managed` to update an existing scene; `Legacy` preserves its previous appearance. Images with embedded profiles now have consistent colors in the editor and server-side renders. **Node Native Argument Validation** - **Engine/Node Native:** `block.export`, `block.exportAudio`, `block.addImage`, `block.applyAnimation` and `scene.zoomToBlock` report an error for an argument of the wrong shape instead of acting on a coerced value. `block.exportAudio` accepts only `(block, options)`, the signature it declares and the one the web bindings accept; a positional mime type is no longer taken. `editor.setSetting` on an `Int` setting requires a whole number instead of truncating one. - **Engine/Node Native:** `block.export` checks each option's value, not only its type, and accepts the full option set the web bindings accept. `pngCompressionLevel` must be 0-9, and `jpegQuality`, `webpQuality` and `pdfImageQuality` must be above 0 and at most 1; the PDF and underlayer options are now declared, so a typo in one is reported instead of ignored. `block.addImage` accepts `Absolute`, `Percent` or `Auto` for `sizeMode` and `positionMode`, and reports any other value. - **Engine/Node Native:** `block.export` reports an error for an `abortSignal` instead of ignoring it. This binding cannot stop a running export, so accepting the option would have let code written against the web bindings run without ever aborting. `onProgress` is now declared too, so a misspelled name is reported rather than dropped in silence. **Editor Layout, Labels & Configuration** - **Engine/Android:** Explicitly declare API 34 as `minCompileSdk` in AAR metadata. This preserves the existing consumer requirement when building with AGP 9. - **Editor/Web:** An unnamed page now reads with its number — "Page 1", "Page 2" — matching the title the canvas draws, and a video track and a caption track read "Track" and "Caption Track" where both previously read "Graphic". This is the fallback name `cesdk.utils.generateBlockName` returns, so it also shows in the inspector header and on a timeline clip. - **Editor/Web:** The dock in the design and advanced editor configurations ends with a spacer that holds the new button at the bottom, so a dock entry appended with `position: 'end'` lands below it. Pass `before: 'ly.img.spacer'` to keep a button up with the libraries. - **Editor/Android:** The timeline's looping toggle moved from the center of the header to the end, next to the expand/collapse toggle. The play button now sits in the middle of the header. - **Editor/Android:** The timeline height is now expressed in track rows instead of pixels, through the new `height` property of `Timeline`. It grows to at most three tracks by default with `TimelineHeight.Dynamic`, or you can set a fixed number of tracks with `TimelineHeight.Fixed`. - **Editor/Web:** Removed the translation keys `input.bleedMargin.select` and `property.bleedMargin`. The panel labels the bleed with `input.bleed` and its four side inputs with `input.sides.top`, `input.sides.right`, `input.sides.bottom` and `input.sides.left`. Override those instead. - **Editor/Web:** Grid and safety margin controls now live in one "Grids & Guides" panel, opened from a row in the document and page inspectors. - **Editor/Web:** The navigation bar's actions dropdown now has the accessible name and tooltip "Show more options". - **Editor/Web:** `resetEditor()` no longer switches the engine's video captions off, so a video configuration no longer has to switch them back on. The caption UI stays gated by the `ly.img.video.caption` feature. **AI Generation Panels** - **Plugins/Web:** The input tabs of the AI image and video generation panels name the conversion: "Text to Image" and "Image to Image", or "Text to Video" and "Image to Video". Override them with the `ly.img.plugin-ai-image-generation-web.fromText.label` and `.fromImage.label` keys, or the matching video keys. - **Plugins/Web:** The input tabs no longer show an "Input" label, so the `ly.img.plugin-ai-generation-web.fromType.label` key is no longer used. - **Plugins/Web:** An AI generation panel now shows its reference image inside the prompt, rather than in a separate preview above it. An image selected on the canvas is offered in that row, outlined so it stands out on either theme, and attaches with one click. Selecting an image that is already attached highlights it. - **Plugins/Web:** `CommonProperties.ImageUrl` now renders the prompt as well as the image. A model whose schema has no image property keeps a prompt on its own. - **Plugins/Web:** The Text and Image switch in an AI generation panel is now a pair of tabs, not a segmented control. The arrow keys move between them, which the segmented control did not support. - **Plugins/Web:** Quick actions gain the new prompt field: Combine Images, Create Variant, Edit Image, Remix Page with Prompt, Swap Background and Change Text To. - **Editor/iOS:** The image style thumbnails in the AI image generation plugin no longer draw a border. **License Diagnostics** - **Engine:** A license with a missing or wrong value now fails with `LICENSE.CLAIM_INVALID`, which names the value, instead of `LICENSE.INVALID`. --- **Bug Fixes** **Engine** - An archive no longer keeps a `buffer://` URL for a resource it could not include. Such an archive pointed a block at a different file and crashed the engine when it was loaded. `saveToArchive` now reports `SCENE.ARCHIVE_BUFFER_DATA_MISSING`, and loading an archive that already holds one clears the reference. - `saveToArchive` now finishes when a referenced resource cannot be loaded. In the browser it returned a promise that never settled, so a download did nothing and gave no error. On the native engines it crashed the process. A missing image, an unreachable host, and an unloadable font in the settings all caused this. The archive keeps the original URI of such a resource. - A malformed block id inside an array is refused as well, so `block.group([5.7, 8.7])` reports an error rather than grouping the blocks those values round to. - Combining blocks no longer shows a fill that the first block had hidden. The result now keeps the fill hidden, as it was. - A `data:` URI now loads on every platform. Only the browser accepted one before, because it passes the URI to the host rather than fetching it, so a scene that loaded in a browser failed to load on Node, Android, iOS, macOS and Windows. - `block.getTypeface` answers for a text block that was never given a typeface, on every binding. The engine bundles a default font but shipped no typeface declaring it, so the call reported that the default was not registered even though the font it names is present. - `block.getTextFontWeights` reports the weight the default font actually has. For a block with no typeface it previously answered `normal` regardless — a weight the bundled default, which is Semi Bold, does not have. - A `data:` URI now loads when its base64 payload is split over several lines or holds spaces. Such a URI gave an error, or an image built from only part of the data. - Undo, redo and applying a template no longer crash when the scene holds a page without a parent. Such a page is one that is not appended yet, or a duplicate made with `attachToParent` set to false. Page carousel mode no longer crashes on such a page either. - An image that is flipped both horizontally and vertically becomes axis-aligned again after a content-aware resize or a crop preset. The rotation could land just short of a full turn, which left the image mirrored and made the crop tool move the wrong edges. - The fill API now reports an unknown block as `BLOCK.UNKNOWN` instead of `BLOCK.FILL_MISSING`. - An image that was added or drawn while the canvas was zoomed out is no longer shown at that low resolution after zooming in. It is decoded again at the resolution the canvas needs. - Fixed a v4 license that failed to unlock the SDK when the license server added a field that the SDK does not read. - A locked block now holds what sits inside it. A child of a locked group or track cannot be dragged, nudged or resized on the canvas, and `alignHorizontally`, `alignVertically`, `distributeHorizontally` and `distributeVertically` skip it, where before only the block's own lock counted. `isAlignable` and `isDistributable` give the same answer as those endpoints. Each block keeps its own flag, so unlocking a container leaves a child that was locked on its own still locked. The chain stops at the page and at the scene: a lock on either holds only the block that carries it. `setTransformLocked` and `isTransformLocked` are unchanged and still read and write a block's own flag. - Resizing a block no longer moves the opposite edge when the handle is dragged back to the start size or against a movement constraint. - A cropping resize that the page movement constraint or an exclusion area stops no longer keeps scaling the content. The frame held its edge while the image behind it grew with the pointer. - A scene export no longer takes its size from a hidden block. A block that is hidden, on its own or inside a group, now changes neither the pixel size nor the content of an exported scene. The exported pixel dimensions get smaller for a scene that holds a hidden block outside its pages. A page export keeps its size from the page, so it is not affected. - A scene export no longer takes its size from a block that stays out of the export. A block with `includedInExport` set to false now changes neither the pixel size nor the content of an exported scene. A page export keeps its size from the page, so it is not affected. - A source set now keeps every entry. Two files of the same width are two entries, and only the first one stayed before. - The engine now reads the size of a source set entry that states a width and height of `0`. Such an entry gave the engine no way to tell a small file from a large one, so it could load a large file into a small block. - Fixed SRT caption imports with non-ASCII UTF-8 text. - A text block on a path no longer draws its block background. The rectangle did not follow the curve. The setting stays, and the background draws again when the path is removed. - A video export of a page no longer hangs at the first frame when a block on another page is still loading. A block with an error on another page no longer cancels the export. - A video export of a page now draws only the blocks of that page, as an image export does. A block outside that page, for example on another page at the same place, no longer appears in the video. - A text getter no longer moves a running camera animation, and it costs 7× less while one runs. The text APIs still refresh the text before they read it, also when implicit updates are off. - Fixed a crash in `restoreBuffers` on macOS when the engine already held a buffer. The call now replaces the buffers as documented. **Engine (Web + Node)** - A promise from `engine.actions.run()` that is discarded while the run is still in flight at `engine.dispose()` no longer surfaces as an unhandled rejection. Awaiting it still rejects with `Engine has been disposed.` - Web: A string with a lone UTF-16 surrogate, such as text cut in the middle of an emoji, no longer loses characters or breaks the scene. The engine stores U+FFFD in its place. A scene saved with such a string now loads again. A scene that an older release saved with such a string still fails to load. Node: A string with a lone UTF-16 surrogate no longer loses characters or breaks the scene. The engine stores U+FFFD in its place, as `@cesdk/node-native` does on Node.js and Deno. **Engine (Web + Node Native)** - Node Native: A method that returns a promise now rejects when an argument is invalid, instead of throwing before the promise is created. A caller who wrote `.catch()` — which is what a promise-returning method invites — did not see the failure at all. Web: A method that returns a promise now rejects when an argument is invalid, instead of throwing before the promise is created. This affects `asset.findAssets`, the two `addLocalAssetSourceFromJSON*` methods, `block.loadFromURL`, `block.loadFromArchiveURL`, the two `add*FileURIToSourceSet` methods, `scene.createFromImage`, `scene.createFromVideo`, and the four `editor` URI and font helpers. **Engine/Web** - A negative block id, or one above `4294967295`, now reports the same error as any other malformed id. Both used to surface an internal message about "an argument of type unsigned int". - A license error during initialization now rejects with its `EngineError`. Before, it was a `WasmLoadError` that reported missing assets. - `editor.getSetting` and `editor.setSetting` report an unknown key as a proper engine error, carrying the same code, hint and documentation link every other engine error has. They previously threw a plain `Invalid setting key` error with none of that. The check now asks the engine instead of consulting a built-in list of keys, so a setting the engine supports is no longer refused because the list had not been updated for it. **Engine/Node** - A block id that is not a whole number in `[0, 4294967295]` is now refused. Such an id used to be converted rather than rejected, so it reached a different, existing block: `getName(5.7)` returned block 5's name, `getName(NaN)` read block 0, and a setter wrote to the block it converted onto. - A failed license request during `CreativeEngine.init` no longer stops the Node process while the engine assets still load. **Engine/Node Native** - `actions.get(id)` returns the function you registered instead of always `undefined`, so a host can invoke a registered action synchronously by reference as it can on the web bindings. - `asset.fetchAsset` now reports an error for an asset source that does not implement `fetchAsset`. It previously terminated the whole Node process, which no `try`/`catch` could prevent. - `editor.setSafeAreaInsets` keeps the value of every side you leave out. It previously reset an omitted side to zero. - An asset reaches a source's `applyAsset`, `applyAssetToBlock` and `applyAssetProperty` callback without its empty optional fields, matching the web bindings. A callback that tested `if (asset.credits)` previously took that branch for an asset with no credits. - `block.setTextFontSize` and `block.getTextFontSizes` treat their `unit` option the way the web bindings do. Both boundaries carry the scene's own font-size unit, so a value already in that unit is passed through untouched. They converted to and from points instead, so on a Pixel scene at 300 dpi `setTextFontSize(text, 54, { unit: 'Pixel' })` stored 54 × 72 / 300, and every later read of the raw `text/fontSize` value — `block.getTextRuns` among them — was smaller than the web bindings' by the same 4.17 factor. - `asset.canManageAssets` reports whether a source declared the deprecated `canManageAssets` flag, matching the web bindings. It previously probed the engine and answered a different question — whether assets could be added to or removed from the source — so a source added with `addLocalSource` reported `true` where the web bindings report `false`. - `block.combine` reports an unknown boolean operation as the same engine error the web bindings report, naming every operation it accepts. It previously refused the call from a list kept in the binding, with an error carrying none of the usual code, hint or documentation link, and the list had to be updated by hand whenever the engine learned a new operation. - `CreativeEngine.init` with an invalid license now rejects with an error that `try`/`catch` can handle. Before, it stopped the Node process. **Engine/Android** - Fixed a crash in `getAudioInfoFromVideo` for a video with audio tracks. The call now returns the `AudioTrackInfo` list. - Fixed a crash in `setCameraPreview` when the `mirroredState` flow changes after the first frame. The orientation update now runs on the engine thread. - Video preview and export no longer fail with a decoder resource error for high-resolution videos, such as 4K phone recordings. A decoder that decodes slowly is no longer treated as stuck and rejected, and the low-latency decode preference no longer excludes hardware decoders that do not advertise the feature. - Fixed popping sounds when exporting videos with loud or overlapping audio. - Fixed audio being cut off at the end of video and audio exports. **Editor/Web** - An action still running when the editor is disposed no longer logs an unhandled rejection. - An asset or asset source credit registered without a `url` now shows its name in the asset info popover instead of the literal text "name". - A locked block no longer moves in the stacking order and no longer flips. Bring Forward, Send Backward and Flip in the canvas menu, and the Position controls in the inspector, now refuse it the way dragging it on the canvas already did. - A block inside a locked group counts as locked everywhere. It was possible to reorder, flip or align one, even though the group could not be moved. - The camera animation started by `scroll.toPage` and `scroll.toBlock` no longer throws `Cannot read properties of null (reading 'setPositionX')` when the editor is disposed mid-animation. The animation now stops instead. - `ly.img.shape.options` now gates only the shape option controls it names — points, inner diameter, sides, corner radius and line width. The Replace Shape and Edit Path rows keep their own flags, `ly.img.replace.shape` and `ly.img.shape.edit`, so enabling one of those is enough to show it, in the inspector panel's Shape section and in the inspector bar's Shape button alike. Previously all three were hidden together. - The text background controls are disabled for text on a path. - Fixed an issue where the measurement theme design tokens would not be parsed properly ended up breaking the layout of the asset library grid. - The video timeline no longer scrolls to a selected clip that is already visible. Selecting, dragging or trimming a clip no longer shifts it away from the pointer, and a long clip no longer snaps to its start. The timeline still scrolls to a clip that is selected while completely out of view. - As an Adopter, clicking a different placeholder after closing the replace panel opens the panel again. Before, it opened again only for the first placeholder that was selected. - The replace panel stays open while you move or resize the selected block on the canvas. Before, it closed when the drag started. - A library card dragged immediately after it is pressed now shows its thumbnail while it is dragged. It sometimes showed an empty box instead. **Editor/iOS + Android** - Fixed an issue where auto captions could not transcribe video recorded with the camera or added without the `video` block kind. **Editor/iOS** - Fixed the "None" image style in the AI image generation plugin showing a blank box instead of an icon in the style selector and the style picker sheet. **Editor/Android** - Fixed `InspectorBar.Button.rememberVoiceover()` sharing its id with `rememberMoveAsClip()`. The button now uses `InspectorBar.Button.Id.voiceover`, so it can be addressed in `InspectorBar.ListBuilder.modify` and no longer collides with the move-as-clip button. - Fixed the timeline Play button not restarting playback from the beginning when the playhead is at the end and looping is off. **Editor/Flutter + RN** - Fixed an issue on iOS where closing the editor kept it in memory and kept playing video and audio until the editor was opened again. **Camera/iOS** - Fixed second-camera clips and photos appearing at the wrong time on the timeline when a session mixed single-camera and Dual Camera captures. **Plugins/Web** - The Create Video quick action, now labelled Create Video from Reference, attaches the selected image to the video prompt beside any images already there, is disabled once the prompt has no room left, and opens the panel on the provider that owns the action. Before, the image was stored under the image provider's id and never reached the video panel, and providers whose image property is not `image_urls` never received it. - A print-ready PDF export now finds its ICC profile in a bundled app. Version 1.82.2 Released: September 26, 2026 -------------------------------------------------- **Breaking Changes** **Non Breaking Changes** - Engine: A license with a missing or wrong value now fails with `LICENSE.CLAIM_INVALID`, which names the value, instead of `LICENSE.INVALID`. - Engine/Web: A license error during initialization now rejects with its `EngineError`. Before, it was a `WasmLoadError` that reported missing assets. - Engine/Node: A failed license request during `CreativeEngine.init` no longer stops the Node process while the engine assets still load. - Engine/Node Native: `CreativeEngine.init` with an invalid license now rejects with an error that `try`/`catch` can handle. Before, it stopped the Node process. Version 1.82.1 Released: September 21, 2026 -------------------------------------------------- **New Features** **Licensed Codec Packs** - **Engine/Node:** Added support for licensed codec packs downloaded from the licensing dashboard on Linux x86\_64. Packs are automatically detected in `$HOME/.local/share/cesdk-codecs`; set `CESDK_LICENSED_CODEC_PACK` to use a custom installation directory. --- **Bug Fixes** **Engine** - Undo, redo and applying a template no longer crash when the scene holds a page without a parent. Such a page is one that is not appended yet, or a duplicate made with `attachToParent` set to false. Page carousel mode no longer crashes on such a page either. - A video export of a page no longer hangs at the first frame when a block on another page is still loading. A block with an error on another page no longer cancels the export. - A video export of a page now draws only the blocks of that page, as an image export does. A block outside that page, for example on another page at the same place, no longer appears in the video. **Engine (Web + Node)** - A string with a lone UTF-16 surrogate, such as text cut in the middle of an emoji, no longer loses characters or breaks the scene. The engine stores U+FFFD in its place, as `@cesdk/node-native` does on Node.js and Deno. On Web, a scene saved with such a string now loads again. A scene that an older release saved with such a string still fails to load. Version 1.75.2 Released: September 15, 2026 -------------------------------------------------- **Breaking Changes** **Non Breaking Changes** - Engine/Web: Applied critical fixes to tracking and licensing in the Web and Node.js SDKs. Version 1.76.2 Released: September 14, 2026 -------------------------------------------------- **Breaking Changes** **Non Breaking Changes** - Engine/Web: Applied critical fixes to tracking and licensing in the Web and Node.js SDKs. Version 1.82.0 Released: September 10, 2026 -------------------------------------------------- **Breaking Changes** - Engine/Android: `BlockApi.export` takes a new optional `progressCallback` parameter after `options`. Calls that pass `onPreExport` or `uriResolver` positionally must switch to named arguments. - Editor/Web: Removed the `legacyNonResponsivePanelPosition` feature flag. Integrations that set it no longer force the wide layout. - Editor/Web: The video timeline controls bar is now driven by the Component Order APIs under the new `ly.img.video.timeline.controls.bar` UI area (`cesdk.ui.setComponentOrder`, `getComponentOrder`, `insertOrderComponent`, `updateOrderComponent`, `removeOrderComponent`). The built-in controls are registered as components (`ly.img.video.timeline.background`, `.split`, `.playbackInfo`, `.playPause`, `.loop`, `.zoom`, `.toggle`) and custom components can be added via `cesdk.ui.registerComponent`. A new `ly.img.video.timeline.controls.bar` Feature API flag gates the whole bar (parallel to `ly.img.canvas.bar`). **Breaking:** the SDK no longer ships a built-in order for this bar — without configuration the controls bar is empty and not rendered. Set the order explicitly to keep the previous controls, or pin the configuration below 1.82 with `cesdk.setEditorCompatibilityVersion`. The bar's internal DOM also changed from a fixed three-column grid to a flat flex row driven by `ly.img.spacer` components, so custom CSS targeting the old internal group containers no longer applies. To restore the previous controls: ```typescript cesdk.ui.setComponentOrder({ in: 'ly.img.video.timeline.controls.bar' }, [ 'ly.img.video.timeline.background', 'ly.img.video.timeline.split', 'ly.img.spacer', 'ly.img.video.timeline.playbackInfo', 'ly.img.video.timeline.playPause', 'ly.img.video.timeline.loop', 'ly.img.spacer', 'ly.img.video.timeline.zoom', 'ly.img.video.timeline.toggle' ]); ``` See the v1.82 migration guide and the [starterkit-video-editor-ts-web](https://github.com/imgly/starterkit-video-editor-ts-web) / [starterkit-advanced-video-editor-ts-web](https://github.com/imgly/starterkit-advanced-video-editor-ts-web) repositories (and the full starter kit upgrade) for more info. - Editor/Web: The clip ellipsis button on timeline clips can now be hidden through a dedicated Feature API flag, `ly.img.video.timeline.clip.menu`. It is **enabled by default** — `cesdk.feature.disable('ly.img.video.timeline.clip.menu')` hides the button, `cesdk.feature.enable(...)` shows it again. The flag gates only the trigger; the clip context menu order set via `cesdk.ui.setComponentOrder({ in: 'ly.img.video.clip.menu' }, ...)` is unaffected. **Breaking:** integrators that maintain an explicit feature allowlist must add `ly.img.video.timeline.clip.menu` to keep the button visible (see the v1.82 migration guide; the starter kits list it in their `features.ts`). - Engine: A block that has only a preview image is no longer pending. It renders the preview, so an export finishes. Use `setState` to keep a block pending. - Engine: `isCapabilitySupported` now answers for the codecs this build really has. `hevcEncode` is `false` on Linux, Windows and Android, where the engine has no HEVC encoder. It was `true` before. - Engine/Node: Added `videoCodec` to the video export options, with `VideoCodec.H264` and `VideoCodec.HEVC`. It defaults to H.264, so existing exports are unchanged. Check `isCapabilitySupported('hevcEncode')` first: where the platform has no HEVC encoder, the export fails instead of falling back. - Engine/Node: Fixed `enableHEVC` being ignored. It is deprecated; use `videoCodec`. - Engine: Fixed missing picture on HEVC exports with audio. - Engine: Fixed an export that was refused leaving the encoder busy, which failed every later export. - Engine/Web: `VideoMimeType` is `'video/mp4'` only. `'video/quicktime'` was in the type, but the engine has never written a QuickTime file and rejected it at run time. Use `'video/mp4'`. QuickTime stays valid for media you import. - Engine/Swift: Removed `TransitionType.none`. To remove a clip's transition, destroy the block returned by `engine.block.getTransition(_:)` — destroying detaches it automatically. Use `removeTransition(_:)` instead when you want to detach the transition but keep the block for reuse; it does not destroy the detached block. - Renderer: The non-assetless Docker containers now only ship a single asset tree instead of shipping all asset versions in subtrees of `/opt/cesdk-renderer/assets` like before. This reduces image size and matches other platforms. If you need access to other asset versions, you can download them from the documentation pages for self-hosting your own assets for the matching CE.SDK version and bundle them in your own Docker image built on top of the assetless variant. **Non Breaking Changes** - Editor/Android: Add automatic caption generation. The new `ly.img:plugin-auto-captions` package adds a **Generate Automatically** action to the Add Captions sheet that transcribes the video's speech into time-synced, styled captions. Register it with `.then(::AutoCaptionsPlugin) { provider = GatewayTranscriptionProvider(apiKey = "sk_…") }` to use ElevenLabs Scribe through the IMG.LY AI Gateway, or implement `TranscriptionProvider` to plug in any other speech-to-text service. Generation runs in a cancellable state and leaves the scene untouched when cancelled; captions land in a single undo step. Integrators who want to own the whole pipeline can replace `AutoCaptionsPlugin.captionsGeneration` with their own `CaptionsGenerator` and return their own SRT or VTT file — a `provider` stays required either way. - Editor/Android: Add caption editing to the video editor. Register the `captions` dock button to let users create captions manually, import SRT/VTT files, edit caption text and timing on a dedicated timeline lane, apply style presets, and fine-tune a selected caption from the caption inspector (Edit Captions, Style, Split, Format, Fill & Stroke, Text Background, Delete). While editing, an action bar above the keyboard merges, splits, adds, and deletes captions, and steps to the caption above or below; merging, adding, and deleting are also available by swiping a row. Return splits a caption at the cursor — or starts the next one at the end of the text — and Backspace at the start merges into the caption above, or deletes it when empty. Style presets and core styling — font, size, alignment, colors, and background — apply to every caption on the track. Captions are burned into the exported video by the engine. - Editor/Flutter: Added Swift Package Manager support to the `imgly_editor` plugin. Flutter 3.44 and later resolves the plugin via Swift Package Manager by default; CocoaPods keeps working on older Flutter versions. - Camera/Flutter: Added Swift Package Manager support to the `imgly_camera` plugin. Flutter 3.44 and later resolves the plugin via Swift Package Manager by default; CocoaPods keeps working on older Flutter versions. - Editor/Web: Added `builder.Tabs()` to switch between views inside a panel. Only the selected tab builds its content, each tab takes an optional icon, tooltip and `isActive` indicator, and the arrow keys, Home and End move between them. - Editor/Web: The animations panel shows In, Loop and Out as tabs rather than stacked sections, each marked when that group has an animation applied. The inspector's Design/Placeholder switch and the caption panel's Content/Style switch use tabs too. - Editor/iOS: Add an `IMGLYEditor` product to the `IMGLYUI-swift` Swift package. You can now depend on the editor on its own — the product the Starter Kit guides tell you to add — instead of pulling the whole `IMGLYUI` umbrella. `import IMGLYEditor` resolves against it directly. - Editor/Web: Bounded numeric controls in the inspector now have a minus and a plus button inside the input. A press steps the value and stops at the control's limits, holding a button repeats the step, and a whole press becomes one undo step. Typing a value still works. The buttons are not tab stops, because the field's Up and Down arrow keys already step. - Editor/Web: These controls replace their slider with a stepper: letter spacing, line height and paragraph spacing; polygon sides, star points, star inner diameter, line width and corner radius; cutout smoothing; and text background corner radius. - Editor/Web: These controls keep their field and gain the buttons: stroke width, cutout offset, grid width and height, shadow distance and blur, and text background horizontal and vertical padding. - Editor/Web: The font size control gains the same buttons and keeps its preset list. The list now opens on a click on the field, or with `Alt+ArrowDown`, and replaces the dropdown button beside it. - Editor/Web: Added a `showStepper` option to `builder.NumberInput()` that renders the same decrement and increment buttons. - Editor/Web: Added the translation keys `input.stepper.change`, `input.stepper.decrease`, `input.stepper.increase`, `input.stepper.decreaseValue` and `input.stepper.increaseValue`. The keys `property.textBackground.horizontalPadding.description` and `property.textBackground.verticalPadding.description` are gone, because the controls they described are steppers now and name their own buttons. - Engine: Added the `pdfChunkSize` export option, which sets the upper bound in bytes for a single chunk of PDF output. It matters most for a streamed export, where it is the memory the caller holds for one chunk: a larger value lowers the per-chunk overhead and raises that memory, a smaller value does the opposite. Leaving it unset keeps the engine default. A value outside the supported range is clamped into it rather than failing the export. - Engine: Added per-page progress reporting to PDF export on Web, iOS, and Android, mirroring video export progress. See the [Export to PDF](https://img.ly/docs/cesdk/js/export-save-publish/export/to-pdf-95e04b/) guide. - Editor/Web: The export dialog now shows a progress bar instead of a spinner while a multi-page PDF exports. - Editor/React Native: Added opt-in Swift Package Manager support to `@imgly/editor-react-native` for React Native's experimental SPM mode (`npx react-native spm`, React Native 0.87 and later). CocoaPods currently remains the default integration path. - Editor/React Native: Fixed a crash on iOS when an export result contained no artifact, scene, or thumbnail — the result now carries `null` for the missing fields, matching Android. - Camera/React Native: Added opt-in Swift Package Manager support to `@imgly/camera-react-native` for React Native's experimental SPM mode (`npx react-native spm`, React Native 0.87 and later). CocoaPods currently remains the default integration path. - Camera/React Native: Fixed a crash on iOS when `openCamera` received settings that could not be parsed — the call now rejects with error code `E_PARSING` instead. - Editor/Web: Added a `Gap` control to the document inspector that adjusts the spacing between the pages of a horizontally or vertically stacked scene, together with a `Gap Unit` dropdown that chooses whether the value is measured in `Screen Pixels` or in `Design Units`. `Screen Pixels` affects the canvas preview only — it keeps the gap constant on screen at any zoom level, while exports always interpret the gap in design units. Switching the unit never rewrites the number, so the same value is reinterpreted rather than converted. Both controls are shown only while a horizontal or vertical stack layout is active and the stack holds at least two pages — a stack's spacing sits between its children, so there is nothing for it to do on a single page. The value is limited to `10000`; the engine itself sets no upper bound, but a very large gap in `Screen Pixels` stays that size at every zoom level and puts the next page out of reach. Both rows can be hidden with the new `ly.img.scene.layout.spacing` feature flag. - Editor/Web: The scene layout buttons in the document inspector no longer reset the gap between pages. Previously, switching to a stacked layout — or clicking the already-active layout button — overwrote `stack/spacing` with a fixed `35` screen pixels, discarding any gap that had been set through `engine.block.setFloat(stack, 'stack/spacing', …)`. The current gap is now carried forward instead, including across a round trip through the free layout, and `35` is used only when no stack exists to read a gap from. Whether this is *visible* depends on how the scene was created: a scene created through `cesdk.actions.run('scene.create', …)` with a page preset already starts at `35`, so it looked the same before and after, while a scene created without a page preset starts at `48` and previously dropped to `35` on the first layout click. Either way, a gap your integration set through `engine.block.setFloat(stack, 'stack/spacing', …)` is no longer discarded. - Editor/Web: Switching a scene to the free layout now stores the stack gap on the scene in the metadata keys `stackSpacing/spacing` and `stackSpacing/inScreenspace`, so that selecting a stacked layout again restores it. Like the existing `freeLayout/position*` keys written by the same code path, these are visible to integrations through `engine.block.findAllMetadata(scene)` and are saved with the scene. - Engine/iOS: Added two `BlockAPI.export` overloads that deliver the exported PDF incrementally in bounded chunks instead of building the whole document in memory, so large multi-page documents such as photo books and magazines export without exhausting memory. One writes the bytes into a file as they are encoded, the other hands each chunk to a closure. Because the chunks are handed over synchronously, a slow destination throttles the encoder rather than buffering chunks in memory. - Editor/iOS: Added the `exportToFile` configuration helper, which fuses exporting and writing the result to a file into a single streamed pass so the full document is never held in memory. - Editor/Web: Added a `timeline.setHeight` action to control the video timeline's height. Call `cesdk.actions.run('timeline.setHeight', { height: 320 })` to give the timeline a fixed height, `{ height: 'auto' }` to restore the default content-hugging behaviour, or `{ maxHeight: 400 }` to cap how tall the auto-growing timeline may get. - Editor/Web: Added a `timeline/transitionControlVisibility` editor setting controlling the clip transition control on the video timeline. Set `cesdk.engine.editor.setSetting('timeline/transitionControlVisibility', 'always')` to keep the control shown, or `'hover'` (the default) to reveal it on hover/focus. - Editor/Web: Added keyboard shortcuts for moving between editor regions: - `F6` / `Shift+F6` now also cycle through the timeline, the navigation bar, the dock, the canvas bars, and open panels. - `Alt+4` — move focus to the timeline. - `Alt+5` — move focus to the navigation bar. - `Alt+6` — move focus to the dock. - `Alt+7` / `Alt+8` — move focus to the canvas bar above / below the canvas. - Editor/Web: Improved keyboard and screen-reader accessibility of the video timeline and the editor chrome: - Timeline clips are tab stops: `Enter` / `Space` selects a clip (`Shift` adds to the selection), and screen readers announce the clip's name, duration, and selection state. - The playhead is an operable slider: arrow keys step, `Shift+Arrow`, `PageUp` / `PageDown` take larger steps, `Home` / `End` jump to the start and end. Clicking it no longer moves keyboard focus. - The trim inspector, the trim handles, and the timeline resize handle can be operated with the arrow keys. - Popover menus such as the clip context menu navigate with the arrow keys, and the clip context-menu button has an accessible name. - The navigation bar, dock, canvas bars, inspector bar, and panels are exposed as ARIA landmarks. - Panels no longer trap keyboard focus. A panel opened from a control moves focus into it and returns focus to that control or block when it closes. - A collapsed timeline and hidden UI elements (an empty inspector bar, covered stacked panels) are skipped by keyboard navigation. - Focus rings are no longer clipped by scrolling containers and no longer appear after pointer interactions. - Engine/Web, Engine/Node: The default typeface assets now ship as WOFF2 instead of TTF. The font files are about 66% smaller, so editors load fonts faster on slow connections. Scenes that reference the previous TTF files continue to work. - Engine/Web, Engine/Node: A PDF export that uses a WOFF2 font embeds the glyph outlines instead of the font program. This already applied to WOFF and variable fonts, and now also applies to the default typefaces. The rendered output and the text search stay the same. - Editor/Web: The cutout inspector panel now shows the Offset and Smoothing controls again. - Editor/Web: Fixed an issue where the highlighted option in dropdowns could scroll out of view while navigating with the Arrow Up and Arrow Down keys. - Engine: Cancelling a PDF export now stops it. Before, an export that was cancelled kept rendering every remaining page and only the result was dropped. On Web an `abortSignal` stops the export, on iOS the cancellation of the enclosing `Task`, and on Android the cancellation of the coroutine. A cancelled export fails with `ENCODE.EXPORT_CANCELLED`. - Engine: The licensed codec concurrency limit now only applies when video or audio codecs are actually used. Image-only workloads no longer reserve a codec license slot, and a video operation fails with a clear error when all slots are in use. - Engine/Node Native: Engine creation no longer stops the JavaScript event loop while the license server activates an API key. This applies to the native bindings only. - Editor/Flutter: Fixed an issue where effects applied to paused videos were not immediately visible when using TextureView. - Editor/Web: A font size applies to the selected part of a text, whether stepped, typed or picked from the list. - Editor/iOS: A video picked from the photo roll now keeps its own duration instead of being added as a 5 second clip. The duration is read from the video when it is imported, so it also shows on the asset library tile. - Engine: `relocateResource` now moves every reference to a resource, also the references that carry a URL fragment. A variable font keeps its weight after the move. - Engine: A saved `.imgly` archive stays editable after you load it and move its resources. Before, the scene reported a `buffer` URL and could not be saved. - Editor/Web: Fixed an issue in Safari where edge artifacts on asset library cards remained visible on low pixel density displays, even without hovering. - Engine: Saving to a string with a resource callback no longer hangs, and no longer reports the resources of an earlier save. - Engine: Saving a scene that nothing has edited now gives the same bytes every time. Before, the blocks, the selection, the block metadata, the spot colours and the template variables were written in an internal order that moved on every load, so hashing a scene to detect a change, content-addressed storage and `ETag` caching all reported a change that had not happened. The saved content was never affected. - Engine: Thin seams no longer appear on the canvas between opaque blocks that share a straight, axis-aligned edge. - Engine/Swift: Fixed `ExportOptions.webpQuality` being ignored by `exportWithColorMask`. WebP exports with a color mask now use the given quality instead of the default. - Engine/Swift: Deprecated `LicenseError.missing`. An empty license key activates evaluation mode instead of failing, so this error is never thrown. Exhaustive `switch` statements over `LicenseError` keep compiling unchanged. - Editor/Android: Fixed dragging a clip into a gap narrower than the clip on an overlay track moving that clip and its left-hand neighbour to the start of the timeline. The clip now lands right after its neighbour and pushes the following clips later. - Editor/iOS: Fixed dragging a clip into a gap narrower than the clip on an overlay track moving that clip and its left-hand neighbour to the start of the timeline. The clip now lands right after its neighbour and pushes the following clips later. - Engine/Web/Node: `editor.setURIResolver()` and `editor.setURIResolverAsync()` now remove the resolver when you give them `null` or `undefined`. Before, the resolver stayed active. - Engine: Exporting a still image of a block containing a video fill now waits for the frame at the current playback time to be decoded. Previously the export could return the previously decoded frame, so stills taken at different playback times (timeline scrubbing, thumbnail-at-time) could come back identical. - Editor/Web: Fixed an issue where the Animations control and the "Allow to Change Animations" placeholder option were enabled in design-based starterkits. - Engine/Linux: Improved compatibility with H.265 video files in the licensed codec pipeline. - Engine/Swift: Export results no longer copy the whole payload when they cross into Swift. This lowers the peak memory of image, PDF, video, audio and color mask exports by the size of one result. - Engine/Node: Export results no longer copy the whole payload when they cross into JavaScript, which lowers the peak memory of every export by the size of one result. Applies to `@cesdk/node-native`. - Engine: Fixed a video export result becoming invalid when a later export started. Keeping the data of one export while starting the next one now works. - Engine/Node: A PDF export no longer builds the whole document in memory. The engine writes it to a file in the temp directory while the export runs, so the peak no longer grows with the number of pages. Large multi-page documents such as photo books and magazines export without exhausting memory. The result of `export` is unchanged. - Engine/Node: Platform capabilities are now detected while the engine starts. Before this, every capability reported unsupported, so features that ask for one, such as the staged export above, never ran. - Engine/Web: PDF exports via `engine.block.export()` are now written to a temporary file (origin private file system) while the export runs, instead of being assembled in memory, on browsers that support it. Exporting a large document no longer holds the finished file in memory and the returned `Blob` is backed by that file. Its content and type are unchanged. Browsers without support keep the previous behavior. The temporary file backs the returned `Blob`, so it stays on disk after the export and is collected automatically. - Engine/Android, Engine/Swift: PDF exports are now written to a temporary file while the export runs, instead of being assembled in memory. Exporting a large document no longer holds the finished file in memory. The exported bytes are unchanged. The temporary file is removed as soon as the export result is released. - Editor/Web: Softened the light theme's hover fill (`--ubq-interactive-hover`), which held the same colour as the input background. Buttons, asset cards, select options, checkboxes and the timeline clip seam all hover differently now. - Editor/Web: Added the `--ubq-interactive-input-hover` theming token, the hover fill for elements sitting on an input background. - Editor/iOS: Added UI support for transitions, including `SheetTypes.Transition`, `SheetType.transition(style:id:)`, `InspectorBar.Button.transition(...)`, and timeline controls. - Editor/iOS: Added animation and transition previews for a better editing experience. - Editor/Web: `cesdk.setEditorCompatibilityVersion('1.82.0')` pins an editor configuration to the CE.SDK version it was written for, so listed behavior changes from later versions do not apply to it. Call it after `cesdk.resetEditor()`, which clears any previous pin. The CE.SDK editor configurations and starter kits pin it for you; a configuration that does not pin gets the current release's behavior. - Editor/Web: `ly.img.shape.options` now gates only the shape option controls it names — points, inner diameter, sides, corner radius and line width. The Replace Shape and Edit Path rows keep their own flags, `ly.img.replace.shape` and `ly.img.shape.edit`, so enabling one of those is enough to show it, in the inspector panel's Shape section and in the inspector bar's Shape button alike. Previously all three were hidden together. - Engine: An opaque `page/marginFillColor` now covers the bleed content of a rectangular page at every zoom level. A thin line of the content stayed visible at the outer bleed edge before, and it appeared and disappeared as the canvas was zoomed or panned. - Engine: Fixed engine stalling on end-to-end video exports. - Engine: Fixed re-exporting a page on the same engine producing a static clip. - Engine/Web, Engine/Node: The default typeface assets now ship as WOFF2 instead of TTF. The font files are about 66% smaller, so editors load fonts faster on slow connections. The typefaces, their names, and the directory layout do not change. - Engine/Web, Engine/Node: A scene that names a font file from an older asset version still works. The engine reads the current file name from the registered typeface source, and every published asset version keeps serving its own files. A scene that stores a font path resolved against the asset bundle you serve needs a one-time migration. The "To v1.82 (Fonts)" upgrade guide shows how to find and rewrite those paths. - Engine/Web, Engine/Node: A PDF export that uses a WOFF2 font embeds the glyph outlines instead of the font program. This already applied to WOFF and variable fonts, and now also applies to the default typefaces. The rendered output and the text search stay the same. - Renderer: A scene that names a font file from an older asset version now exports. The renderer registers the asset sources of its bundled asset tree, so the engine reads the current file name from them. Before, the export was cancelled with `FILE_FETCH_FAILED`. Version 1.81.1 Released: August 26, 2026 -------------------------------------------------- **Breaking Changes** **Non Breaking Changes** - Engine/Swift: Revert the video export cancellation fix introduced in 1.81.0, which could crash the app when a video export was cancelled. Version 1.81.0 Released: August 24, 2026 -------------------------------------------------- **Breaking Changes** - Engine/Android: Removed `TransitionType.None`. To remove a transition, destroy the transition block returned by `engine.block.getTransition(...)`. **Non Breaking Changes** - Engine/Android, Editor/Android: Added portable CE.SDK Android agent skills for documentation, explanations, and project scaffolding with Kotlin and Jetpack Compose. - Editor/Android: Added UI support for transitions, including the `SheetType.Transition` sheet type, `InspectorBar.Button.rememberTransition`, and buttons in the `Timeline`. - Editor/Android: Added animation and transition previews for a better editing experience. - Engine/Web/Android/iOS: `scene.saveToArchive` accepts a compression option for the scene inside the archive. - Plugins/iOS: Add the `IMGLYPluginAutoCaptions` plugin for automatic caption generation in the video editor. Registering `AutoCaptionsPlugin` adds a primary "Generate Automatically" action to the Add Captions sheet that transcribes the scene's audible content and creates styled, time-synced captions. The built-in `GatewayTranscriptionProvider` runs the ElevenLabs Scribe v2 speech-to-text model through the IMG.LY AI Gateway using an IMG.LY API key; any other speech-to-text service can be integrated by implementing `TranscriptionProvider`. - Editor/iOS: Add `EditorConfiguration.Builder.captionsGeneration(_:)` to back the Add Captions sheet's "Generate Automatically" action with a custom caption generation callback. - Editor/iOS: Add caption editing to the video editor. Register the `Dock.Buttons.captions()` dock button to let users create captions manually, import SRT/VTT files, edit caption text and timing on a dedicated timeline lane, apply style presets, and fine-tune a selected caption from the caption inspector (Edit Captions, Style, Split, Format, Fill & Stroke, Text Background, Delete). While editing, an action bar above the keyboard merges, splits, adds, and deletes captions, and steps to the caption above or below; merging, adding, and deleting are also available by swiping a row. Return splits a caption at the cursor — or starts the next one at the end of the text — and Backspace at the start merges into the caption above, or deletes it when empty. Style presets and core styling — font, size, alignment, colors, and background — apply to every caption on the track. Captions are burned into the exported video by the engine. - Engine/Swift, Editor/iOS: Added portable CE.SDK Swift agent skills for documentation, explanations, and project scaffolding across iOS, macOS, and Mac Catalyst. - Editor/Web: Transitions can now be opened from the inspector bar and the inspector panel. - Engine: Scenes and archives are now compressed with Zstd by default, making saved scenes far smaller and both saving and loading faster. Saved scene strings change shape: they carry a `UBQ2` prefix instead of `UBQ1`. Loading accepts either, so existing scenes keep working. - Editor/Android: Fixed the background removal plugin decoding the source image on the main thread, which blocked the UI and triggered a StrictMode `DiskReadViolation`. - Editor/Android: Fixed the editor reading file modification times on the main thread when loading file-based images, which triggered a StrictMode `DiskReadViolation`. - Camera/Android: Fixed the photo preview reading the captured file's modification time on the main thread, which triggered a StrictMode `DiskReadViolation`. - Engine/Android: HDR videos (HDR10/PQ and HLG) are now tone-mapped to SDR during decoding, fixing severely incorrect colors in preview and export. This uses the HDR-to-SDR tone-mapping request introduced in Android 12, and only takes effect where the device's video decoder supports it — in practice recent Qualcomm/Snapdragon hardware decoders. - Engine/Android: Fixed a StrictMode `LeakedClosableViolation` caused by the internal OkHttp cache when a network fetch returned an error response (e.g. HTTP 404). - Editor/Android: the Resize sheet no longer shows the Crop/Cover/Fit content fill mode picker, honoring `SheetType.Crop.Mode.ResizeAll.hasContentFillMode = false` and matching iOS - Editor/Android: Fixed `shareFile` resolving the file's content uri on the main thread, which triggered a StrictMode `DiskReadViolation` when sharing an exported file. The uri is now resolved on a background thread and any failure is surfaced via the `error` state instead of being thrown. - Engine: Fixed `saveToArchive` leaving remote URLs in the saved scene instead of bundling the referenced bytes. - Engine: Fixed variable-font handling in scene and block archives. - Engine: Fixed a crash in audio waveform thumbnail generation. The crash could happen once the last requested sample was delivered or when the audio block was destroyed from within the chunk callback. - Engine: Scene files no longer store the `basePath` setting. A `basePath` stored by an older version is ignored on load. - Editor/Flutter: Fixed an issue where effects applied to paused videos were not immediately visible when using TextureView. - Engine/Web: Fixed `scene.getMode()` throwing a `TypeError` instead of returning `null` when no scene exists. - Engine: A text or caption style preset no longer replaces the text of a block that already exists. A preset writes its own text only when it makes a new block. - Engine: PDF export with `exportPdfWithHighCompatibility: false` now embeds photos as their original JPEG data if possible, drastically reducing export time and file size of image-heavy documents such as photo books. - Engine: Added the `pdfImageQuality` export option. Values below the default of 1.0 encode rasterized images (e.g. with effects applied) as lossy JPEG instead of lossless. Rasterized content that keeps transparency stays lossless, because JPEG has no alpha channel. - Engine/Swift: Fixed cancelling a video export leaving the device encoding the whole video. `BlockApi.exportVideo` suspended on the engine callback and ignored task cancellation, so dropping the returned stream reported the export as cancelled while the background export engine kept rendering and encoding every remaining frame, holding CPU, GPU and battery until it finished. Cancelling now stops the export and releases the background engine. - Camera/Android: Fixed the photo/video mode toggle ignoring taps in mixed capture mode. The selection indicator briefly moved to the tapped icon and then snapped back without switching the capture mode. - Engine/Linux: Improved compatibility with H.265 video files in the licensed codec pipeline. Version 1.80.0 Released: August 13, 2026 -------------------------------------------------- **Breaking Changes** - Engine/Android: The automatic default video bitrate now uses the shared resolution/framerate formula, typically producing smaller files for common 30/60 fps HD presets. To keep the previous behavior, pass an explicit bitrate matching the old formula, e.g. `ExportVideoOptions(videoBitrate = width * height * frameRate.toInt() / 4)`. - Renderer: The base system for the Renderer Docker container has been upgraded from Ubuntu 24.04 to Ubuntu 26.04 to include upstream security vulnerability fixes that were not backported to Ubuntu 24, if you are building a custom image layered on top of our image you might need to adjust your Dockerfile. - Engine/Web: The default build-in `Space` (play/pause) and `S` (split clip) key bindings were removed from the `@cesdk/engine` built-in shortcut catalog. The `video.playPause` and `selection.split` actions are unchanged and can still be bound via `engine.shortcuts.set()`. **Non Breaking Changes** - Engine: Audio blocks and video fills can now fade in and out. Use `setAudioFadeIn` and `setAudioFadeOut`, or the `playback/fadeIn/*` and `playback/fadeOut/*` block properties. The easing defaults to `Linear` and a duration of 0 (the default) disables the fade. - Editor/iOS: The text on path sheet now uses the same two-step flow as the animations sheet. The sheet opens with the path selection list only, and the adjustment controls (path position, direction, and offset) moved to a detail page that opens by tapping the selected path again. The default detent of the sheet changed from medium to tiny to match the filter, effect, and blur sheets. - Editor/Android: The text on path sheet now uses the same two-step flow as the animations sheet. The sheet opens with the path selection list only, and the adjustment controls (path position, direction, and offset) moved to a detail page that opens by tapping the selected path again. - Engine: Text on a path now selects the text by default. Its selection frame, alignment and snapping follow the visible text bounds instead of the path's bounding box; click the path to switch to path selection, click the text to switch back. Only corner handles show while text is selected, and hovering the other representation previews the frame a click would switch to. - Engine: `getScreenSpaceBoundingBoxXYWH` returns the visible glyph bounds for a selected text-on-path block in text mode; unchanged for unselected blocks and for path selection. - Engine: The clickable area of text on a path is now one continuous band matching the drawn glyphs, fixing flickering hover and clicks landing in the curve's empty interior. - Engine: Uniformly scaling text on a path no longer makes the letters wiggle or slide along the curve. - Engine: Corner-resizing any block with snap-to-grid active no longer lets the anchor corner drift by a sub-pixel amount. - Engine: Scenes and archives now share one `.imgly` file format. The new `load` API opens any scene or archive file — including existing `.scene` and `.zip` files. The previous load methods keep working too. - Editor/Web: A single "Import" option replaces "Import Design" and "Import Archive". Scenes and archives saved from the editor now download as `.imgly` files. - Engine/Android: Fixed a native memory leak that leaked the full payload of every `ByteBuffer` the engine returned to Kotlin. This affected `BlockApi.export`, `exportWithColorMask`, `exportVideo` and `saveToArchive`, `SceneApi.saveToArchive`, `EditorApi.getResourceData` (once per chunk) and the buffer APIs. The leaked memory was native heap, so it counted against the app's memory budget but stayed invisible to the Java heap profiler. Returned buffers are now reclaimed by the garbage collector. - Engine/Android: Fixed a leak where every export left behind a live `HandlerThread`, along with roughly 4.6 MiB of native heap that was only reclaimed once that thread exited. This affected `BlockApi.export`, `exportWithColorMask` and `exportVideo`. Apps that exported repeatedly, such as batch or preview flows, accumulated one thread per export until the process was killed. - Editor/Android: `LibraryContent.Section`s with `addGroupedSubSections` whose asset source reports no groups now fall back to a single flat section instead of rendering an empty section - Editor/Android: categories consisting of a single `LibraryContent.Section` with `addGroupedSubSections` now render their grouped subsections instead of auto-expanding into a flat grid of the section's `expandContent` - Editor/Android: the header count of a `LibraryContent.Section` with `addGroupedSubSections` now shows the total across all groups instead of the count of a single group - Editor/Android: Fixed a crash (`IndexOutOfBoundsException`) that could occur while editing text. - Engine: Text selection and cursor positions are now clamped to the current text. - Editor/Web: Fixed crop mode overwriting a user-configured `page/allowResizeInteraction` setting. The value is now restored to its previous state when leaving crop mode instead of always being forced to `false`. - Engine: Fixed `getDominantColors`. This function no longer counts as an export event. - Editor/Flutter: Fixed an issue where effects applied to paused videos were not immediately visible when using TextureView. - Editor/Web: Fixed the Animations section missing for groups in the advanced video editor. Selecting a group now shows its animation controls in the inspector panel, matching the standard video editor. - Engine/Web: Added the missing `Mod+C` copy and `Mod+X` cut default keyboard shortcuts and registered headless `copy`, `cut`, and `paste` actions; the split shortcut is now `s` instead of `Mod+X`. - Engine: Fixed undo/redo restoring a stale camera position when the restored history snapshot. - Engine: Fixed image blocks that showed the preview image instead of the current image when the block is small on screen. The preview image is now only shown while the current image loads. - Editor/Web: Fixed an issue where the inspector panel was switching to text properties while a page title is being edited. - Editor/iOS: Fixed the export "cancel" confirmation dialog appearing in inconsistent positions during video export. It now anchors consistently to the progress sheet's dismiss button. - Engine: Fixed a hang when disposing the engine while network requests were still in flight on Apple platforms. - Engine: Fixed page thumbnails (for example in the editor's page overview) appearing vertically stretched. - Engine: Fixed PDF export silently returning a corrupted file instead of an error when the device runs out of memory while finalizing the document. - Plugins/Web: Fixed PDF/X-4 output from `@imgly/plugin-print-ready-pdfs-web` failing preflight metadata checks. Document info and XMP metadata now carry identical creation/modification dates, creator, producer, and title; values inherited from the input PDF no longer override them; non-ASCII titles are written correctly; and the XMP metadata stream is no longer compressed. - Engine/Web: Fixed a crash when saving a scene to an archive that references a font which is not currently loaded, for example an unused typeface variant. - Engine: Fixed right-to-left text overflowing the right edge of a fixed text frame for wrapped lines. - Editor/Web: Opening a color picker no longer freezes on scenes with many images. The image colors palette now shows the images on the current page, reuses previous results, and refreshes them after document edits. - Engine: The `videoBitrate` video export option now accepts two named modes in addition to an explicit number: `'System'` (default — Web and iOS defer to the platform encoder; Android and GStreamer use the shared formula) and `'Auto'` (a bounded default derived from the output resolution and framerate, e.g. 5 Mbps at 720p30, 8 Mbps at 1080p30, 40 Mbps at 4K30). On iOS use `VideoBitrate.auto`, on Android `VideoBitrate.Auto`. - Engine/Web: Pass `videoBitrate: 'Auto'` to avoid video exports freezing with an out-of-memory error caused by the browser choosing a near-lossless bitrate (Safari reached ~300 Mbps). - Engine/Android: The automatic default video bitrate now uses the shared resolution/framerate formula, producing smaller default files than before. - Plugins/Web: AI Gateway failures now show a localized, human-readable message instead of the raw HTTP status and JSON response body. Running out of credits, an expired token, a model that is not on your plan, a temporary outage, and an unreachable gateway each get their own message. - Plugins/Web: A request that never reaches the AI Gateway — the browser is offline, the gateway is unreachable, or the response was blocked for missing CORS headers — now asks the user to check their connection instead of reporting a failed generation. It is thrown as a `GatewayError` with `code: 'network_error'`. - Plugins/Web: A generation failure the gateway reports inside an open stream now uses the reason the gateway sent, so a rejected prompt or a provider rate limit no longer claims the AI service is temporarily unavailable. - Plugins/Web: Fixed AI quick actions failing silently. A failed generation stopped the spinner without telling the user anything; it now shows the same error notification as the generation panel. - Plugins/Web: Added `GatewayError` and `isGatewayError` exports to `@imgly/plugin-ai-generation-web`. Gateway failures are thrown as a `GatewayError` carrying `code`, `status`, `operation`, and `requestId`, so an error-handling middleware can branch on the failure reason — for example to show a "Manage credits" action for `insufficient_credits`. - Plugins/Web: Fixed the `duration` option on a provider's `output.notification.error` being ignored. - Editor/Web: Fixed missing German translations for the DPI and page settings labels, which previously fell back to English. - Engine: Fixed a native crash that could occur when audio waveform generation reached the end of the audio file. - Engine: Exporting a rotated block with `allowTextOverhang` no longer crops the result. - Editor/Web: Fixed an issue where the typeface library panel did not populate `queryData.query` when querying asset sources, so custom asset sources implementing search via `queryData.query` received an empty string. The panel no longer adds a `label` filter predicate on top of the query, so each source's own search matching fully decides the results. - Engine: Picking another text curve while the text baseline is open in vector edit mode no longer leaves the previous curve's anchor handles and outline on the canvas. The edit session now re-reads the new baseline path instead of keeping the stale one. - Engine: Text that exceeds the length of its path remains selectable by clicking its visible glyphs. - Engine: Resizing a selected text path with its corner handles now preserves the path's aspect ratio. - Engine: Text on a path whose offset makes it wrap around the end of the curve is now selectable on both sides of the wrap, and its selection frame covers all of its glyphs. - Engine: Exporting a text block that sits on a curve no longer crops the glyphs that reach outside of the curve. The exported area now covers all of the rendered text instead of just the curve. - Editor/iOS: Fixed the video timeline occasionally freezing and losing one of the split halves when splitting a clip on the background track. - Editor/iOS: Fixed the voiceover recording panel sometimes opening with its top edge clipped. - Engine: Fixed undo/redo of a page addition or removal changing the canvas zoom. Version 1.79.0 Released: July 28, 2026 -------------------------------------------------- **Breaking Changes** - Engine/Swift, Editor/iOS, Camera/iOS: Packages for Apple platforms are now built with Xcode 26.4.1 and Swift 6.3.1, which are the new minimum requirements for using them. **Non Breaking Changes** - Editor/Web: Added the following new keyboard shortcuts: - `F6` / `Shift+F6` — cycle focus forward / backward through the main editor regions (canvas, inspector bar, canvas menu). - `Alt+1` / `Alt+2` / `Alt+3` — move focus directly to the canvas, the inspector bar, or the canvas menu. - `Escape` — dismiss the tooltip that is currently shown. - Engine: Added asset source faceting. `findAssets` accepts a `facets` request (property paths `groups`, `tags`, or `meta.`) and returns value distributions with counts over the matched set. Local asset sources compute these automatically; custom sources can return them from their `findAssets` callback. - Engine/Android: Added the structured `filter` and `facets` parameters to asset queries and facet distributions on query results. - Engine/Swift: Added the structured `filter` and `facets` parameters to asset queries and facet distributions on query results. - Editor/Web: The typeface library's language filter now derives its options from typeface `meta.languages` via asset facets, instead of `groups`. - Editor/Web: Added the UI for clip-to-clip transitions. Add one between two adjacent clips on the timeline, choose a type from the library (cross fade, cross blur, wipe, push, slide, and more), tune its settings with a live canvas preview, and apply or remove transitions across a whole track at once. - Engine: Added clip-to-clip transitions — a new API (`createTransition`, `setTransition`, `removeTransition`, `getTransition`, `supportsTransition`), exposed in the Web, Android, iOS, and Node.js bindings, with a catalog of transition types (`none`, `cross-fade`, `cross-blur`, `cross-spin`, `cross-zoom`, `cross-warp`, `push`, `slide`, `stack`, `splice`, `diagonal-splice`, `fade`, `fade-to-white`, `fade-to-black`, `wipe`, `line-wipe`, `clock-wipe`, `color-wipe`, `gradient-fade`, `chop`, `two-stripes`). Transitions overlap adjacent clips with a clamped duration, cross-fade audio automatically, and expose editable properties (duration, direction, color, slices, and a `morph` flag) via generic block setters; when morph is enabled, position, rotation, scale, and shape are interpolated between the outgoing and incoming clip. - Editor/Web: Added keyboard shortcuts that mirror pointer/drag gestures on the canvas and the video timeline, so both can be driven from the keyboard for accessibility. - **Canvas transforms** (selected block): nudge the crop area with the arrow keys, rotate with `Alt`+arrows, and resize with `Mod`+arrows (or `Mod`+`Alt`+arrows to resize from the opposite edge). Hold `Shift` for a larger step. - **Video timeline** (selected clip): move a clip earlier/later with the arrow keys, insert it into a gap while pushing later clips with `Mod`+arrows, move it to the track above/below or to a new track with `Mod`(+`Shift`)+`ArrowUp`/`ArrowDown`, and trim its in/out points with `Alt`(+`Shift`)+arrows. Hold `Shift` for a larger step. - **Playhead**: skim frame-by-frame with `,`/`.`, jump further with `Shift`+`,`/`Shift`+`.`, and jump to the start/end with `Home`/`End`. See the [Keyboard shortcuts](https://img.ly/docs/cesdk/js/user-interface/keyboard-f4c3d1/) guide for the full list. - Engine: Added the `text/useContextualAlternates` and `caption/useContextualAlternates` boolean properties to enable or disable the OpenType contextual alternates (`calt`) feature during text shaping. Contextual alternates remain enabled by default. Disabling them keeps a font's context-dependent glyph substitutions (such as the connected `t` swashes in Caveat) from being applied, so identical characters render with identical glyphs. - Editor/Android: The asset library now refreshes automatically when a source's contents change via `engine.asset.assetSourceContentsChanged(sourceId=_)`. Any open library showing that source re-queries and updates in place. - Editor/Web: Fixed the Bold/Italic and Underline/Strikethrough toggles being unresponsive on caption blocks in the video editor. These controls now apply to the selected caption, matching their behavior for text blocks. The inspector bar's font weight/style dropdown is now also available for captions. - Editor/Flutter: Fixed an issue where effects applied to paused videos were not immediately visible when using TextureView. - Editor/iOS: The "Could not create View for …" error messages shown when the Dock, Canvas Menu, Inspector Bar, Navigation Bar, or an editor component fails to build are now localizable (and ship with German translations), matching the rest of the editor UI. Previously they were hardcoded in English. - Editor/iOS: Fixed the sheet dismiss button rendering a doubled circle under iOS 26 Liquid Glass. - Engine/Node: `@cesdk/node` no longer probes the browser `localStorage` global during initialization on Node.js. On Node 22.4+ the experimental Web Storage global is a getter that `typeof` evaluates, which printed an `ExperimentalWarning` (Node 22.x) or threw `ERR_INVALID_ARG_VALUE` (Node 23+/24) when `--localstorage-file` was not provided. Headless Node has no browser Web Storage, so the engine now short-circuits this feature detection there. Browser detection is unchanged. - Editor/Web: Fixed the "Resize Page" panel rendering completely empty when no page preset sources are configured. The page size inputs are now always shown and only the preset library section is omitted. - Engine: Rendering a block with a broken fill, effect, or frame reference (e.g. from a corrupt scene file) now flags the block with an error state instead of crashing the render loop. - Engine: Loading blocks or templates whose serialization contains references to missing elements now removes those references and flags the affected blocks with an error state, instead of leaving the references pointing at unrelated blocks, which could corrupt rendering. - Engine: Added the block error code `BROKEN_BLOCK_REFERENCE`, reported when a broken block reference is removed on load or encountered during rendering. - Editor: Fixed snapping guides appearing for hidden blocks and pages. - Engine: Fixed a crash when rendering text whose font resource had been evicted under memory pressure, e.g. while generating page thumbnails for the page overview. Text now falls back to the default font while the evicted font reloads and switches back automatically once it is ready. - Editor/Web: Fixed timeline duration formatting to zero-pad single-digit minutes when hours are present (e.g. `2:01:51.7` instead of `2:1:51.7`). - Editor/Web: Fixed the typeface library panel collapsing an expanded typeface's variants when a search was typed just before expanding it. Search mode now activates as you type instead of after the debounced query settles, so the list is no longer torn down under an in-progress interaction. - Engine: Loading a video whose codec is not supported (e.g. AV1 video or Opus audio in an MP4) now fails with a clear, actionable error naming the actual codec fourcc and the supported codecs to re-encode to, instead of a generic "OTI=0" message. The failure is surfaced as a distinct `VIDEO_CODEC_UNSUPPORTED` / `AUDIO_CODEC_UNSUPPORTED` error code so it can be distinguished from a generic decode failure. - Editor/Web: Fixed video clip thumbnails in the timeline sometimes not updating after replacing a video, and sometimes staying stuck on the loading indicator. - Engine: Per-character and per-word text animations that fade each glyph (Pan, Fade, Blur, Zoom, …) now play back smoothly on large text blocks, including curved text - Engine: Underlines and strikethroughs now animate together with the text during per-character and per-word in and out animations, instead of only appearing once the animation finishes - Editor/Web: Fixed published starter kit repositories shipping the editor configuration in a root-level folder outside `src/imgly`. The `src/imgly` folder is now self-contained across all starter kits, so copying it into a project yields a complete, working integration as documented. - Engine: Fixed a crash (`tried to use the Error of an object with a Result`) when a video decoder reported an error, e.g. exporting a scene with an H.264 High 4:4:4 10-bit (`yuv444p10le`) video on the server-side renderer. Such exports now fail with a proper `VIDEO_DECODING_UNSUPPORTED` error. - Engine/Android: Fixed a crash when the text block being edited was destroyed, e.g. when exiting text editing with empty text. - Editor/iOS: Fixed sheet dismiss and close buttons sometimes requiring multiple taps to close on iOS 26. - Editor/Web: Fixed audio continuing to play when selecting another block while previewing a trim in the inspector bar. - Editor/Web: Fixed a crash ("Maximum update depth exceeded") when selecting another block while the trim panel was open in the Advanced editor. - Editor/Android: Fixed timeline trimming setting clip durations slightly short of the dragged length, e.g. 4.9s instead of 5.0s. - Editor/Android: Fixed a crash (`UnsupportedOperationException`) when a design block type that the editor UI does not support yet gets selected, for example a caption in a scene authored with the web editor. Such blocks stay selectable on the canvas, and the canvas menu and inspector bar now stay hidden for them instead of crashing the editor. Version 1.78.0 Released: July 17, 2026 -------------------------------------------------- **Breaking Changes** **Non Breaking Changes** - Editor: Engine error dialogs across Web, iOS, Android, Flutter, and React Native now show customer-facing, localizable copy keyed off the structured engine error `code`, falling back to the engine's English message when no copy is authored — so a dialog never shows a blank or a raw code. You can override this copy per error code and resolve it yourself in custom error handlers. See the [Custom Error Messages guide](https://img.ly/docs/cesdk/js/user-interface/custom-error-messages-2e8555/) for authoring copy and the [Error Catalog](https://img.ly/docs/cesdk/js/concepts/error-catalog-z3djzn/) for the full list of structured error codes. - Editor/iOS: `EngineSettings(baseURL:)` now accepts an optional `URL` and falls back to the default CE.SDK CDN when `nil`, so you can pass an optional base URL directly without branching. - Editor/Web: The color picker for line shapes now supports gradients. - Engine: Movement constraints now keep text on the page by its visible letters, not just its text box, so letters that stick out past the box no longer spill off the page when moving or resizing. On by default; toggle it with the `features/movementConstraintsRespectTextOverhang` setting. - Editor/Web: Added a **Path** control for text blocks to place text on a curve (Circle, Arch, Wave) with adjustable position, direction and offset, plus **Edit Path** for a custom baseline. Gated by the new `ly.img.text.path` feature (with per-control sub-features). - Plugins/Web: The AI generation "Generate" button now stays disabled until every required input is provided. Previously, filling a single required input (e.g. the prompt) enabled it even when another required input (e.g. an image) was still missing, which could trigger a failed generation request. - Engine/Android: Fixed a crash during export teardown when an engine event stream was collected after `Engine.stop()`. - Engine: Fixed a crash (`RuntimeError: unreachable`) in `block.saveToArchive` when a text block referenced a font whose bytes were not yet resident (e.g. an unresolved remote font). - Engine: Fixed the editor freezing when importing large caption/subtitle (SRT/VTT) files or styling large caption tracks. Style changes now spread across a caption track in linear time instead of quadratic. - Engine: Fixed corner-handle resizing of blocks whose width or height is sized as a percent of their parent (for example captions on the video canvas). - Engine: Fixed content-aware resize emitting a degenerate "double-flip" transform (both scale axes negative combined with a multiple-of-2π rotation) for page-filling images. Such images now get a clean, axis-aligned transform, so cropping them after resizing no longer moves the crop frame off the canvas. - Editor/Flutter: Fixed an issue where effects applied to paused videos were not immediately visible when using TextureView. - Editor/iOS: The asset library now refreshes automatically when a source's contents change via `engine.asset.assetSourceContentsChanged(sourceID:)`. Any open library showing that source re-queries and updates in place, matching the web editor. - Editor/iOS: Fixed the sheet title bar and close button overlapping the content of compact effect sheets (Filter, Effect, Blur, Animation) when the iOS 26 Liquid Glass design is enabled. - Editor/Web: Keep the text being edited visible above the on-screen keyboard on mobile web. The canvas reserves the keyboard area and pans the camera to the text cursor. - Engine/Node: `@cesdk/node` now bundles the engine-level font-fallback files (`fonts/`) and emoji font (`emoji/NotoColorEmoji.ttf`) in the npm package, so default font fallback and emoji rendering work out of the box without reaching the IMG.LY CDN. The `@cesdk/node` self-hosting asset bundle (`imgly-assets.zip`) now also includes the `fonts/` and `emoji/` directories; previously they were missing, which broke the documented self-hosting path. - Engine/Web: Fixed video export freezing on Safari when the project contained an uploaded video. Safari treats OPFS read handles as exclusive per file, so the export worker could not read an upload the editor was already reading. OPFS is now disabled on Safari and uploads fall back to in-memory blob URLs. - Engine: Fixed movement constraint capping block resizing too early. The cap now follows the block's axis-aligned bounding box in page space, so resizing — including rotated blocks — can grow to the size the constraint actually permits. - Engine: Fixed a crash when loading a scene or block archive whose fetched data is not a valid zip. - Editor/Web: Fixed the shape options dropdown in the inspector bar not being keyboard accessible. Opening it now moves focus into the panel, keeps focus contained while navigating its controls, restores focus to the trigger on close, and dismisses on Escape. - Editor/Web: Fixed snapping guides ignoring movement constraints when moving or resizing. - Engine: Fixed `setEditMode('Text')` so that `setTextCursorRange` and other text-cursor APIs work synchronously immediately after, without an intermediate engine update. - Engine/Web: Fixed an issue where the on-screen keyboard would not open on iOS when entering text edit mode programmatically inside a user gesture. - Engine: A text block placed on a path now returns to automatic sizing when the path is removed, instead of staying at the fixed size adopted for the curve. - Engine: A text block placed on a path now keeps a stable set of editable points when re-entering path editing, instead of re-subdividing the path each time. - Engine: Fixed a video fill whose source failed to load (for example because of a CORS or network error) being re-fetched on every render frame with no limit. A failed video load now keeps its error state like image fills do; use `forceLoadResources`/`forceLoadAVResource` to explicitly retry it. - Editor/Web: The typeface library now fetches font previews lazily as rows scroll into view and renders typeface names immediately in a fallback font, keeping the font picker responsive on slow networks and low-end devices. The live per-font preview is preserved and arrives progressively. - Engine: Fixed text on curved paths to respect paragraph-level horizontal alignment. - Editor: Fixed caret placement for empty aligned text on curved paths. - Editor: Fixed caret hit testing, pointer selection, and selection highlights for text on curved paths that wrap across the start or end of an open path. - Editor: Fixed overlapping selection highlights on curved text from rendering darker where selection geometry intersects. - Engine/Web: `@cesdk/engine` again publishes its default asset sources (`ly.img.*`) to the CDN, fixing asset resolution failures during initialization for custom-UI integrations that rely on the default `baseURL`. - Engine/Web: `@cesdk/engine` and `@cesdk/cesdk-js` now bundle the font-fallback and emoji files in their npm packages, so text and emoji render without reaching the IMG.LY CDN. - Engine/Node: `@cesdk/node`'s `imgly-assets.zip` now includes the full asset content library (`ly.img.*`), so self-hosting the default asset sources works. Previously it shipped only the engine core, fonts, and emoji. - Engine: Fixed text on a curve ignoring the automatic horizontal text alignment. Right-to-left text with `Auto` alignment now aligns to the end of the path, matching regular text frames. - Engine: Fixed underline and strikethrough lines on text on a curve bridging the gap between the end and the beginning of the text when a path offset wraps the text around the path. - Engine: Fixed the text cursor of right-aligned text on a curve sometimes jumping to the start of the path when placed at the end of the text. - Editor/Web: Fixed the text "Styles" button staying active in Preview for placeholders that do not allow character changes. It is now hidden when the `text/character` scope is disallowed, matching the other style controls. - Editor/Web: Fixed the show/hide toggle in a line's color panel. It now hides and shows the line, for solid colors and gradients alike, instead of doing nothing or dismissing the gradient. - Engine: Fixed a hidden line becoming visible again after the scene was saved and reloaded. - Engine: Fixed a hidden line with a gradient rendering a stray triangle instead of nothing. - Editor/Android: Fixed the resize sheet unexpectedly closing when selecting a page size preset. - Engine: Fixed `onActiveChanged` not being triggered when loading the same scene or applying the same template twice in a row. - Engine/Web: Fixed a crash when saving a scene to an archive that references a font which was never loaded (for example an unused typeface variant). Such resources are now left as external references instead of being bundled. Version 1.77.1 Released: July 9, 2026 -------------------------------------------------- **Breaking Changes** **Non Breaking Changes** - Engine/Web: `@cesdk/engine` again publishes its default asset sources (`ly.img.*`) to the CDN, fixing asset resolution failures during initialization for custom-UI integrations that rely on the default `baseURL`. - Engine/Web: `@cesdk/engine` and `@cesdk/cesdk-js` now bundle the font-fallback and emoji files in their npm packages, so text and emoji render without reaching the IMG.LY CDN. - Engine/Node: `@cesdk/node`'s `imgly-assets.zip` now includes the full asset content library (`ly.img.*`), so self-hosting the default asset sources works. Previously it shipped only the engine core, fonts, and emoji. - Engine: Improved performance when `transparentClickThroughEnabled` is enabled Version 1.77.0 Released: July 2, 2026 -------------------------------------------------- **Breaking Changes** **Node.js Support** - **Engine/Node:** Raised the minimum supported Node.js version to 22. Node.js 20 no longer receives security updates as of May 2026, we strongly recommend updating to a supported version. **Asset Sources & Registration** - **Engine (Swift + Android):** Several built-in asset source IDs were renamed or merged — update any hardcoded IDs: `ly.img.vectorpath` → `ly.img.vector.shape`, `ly.img.colors.defaultPalette` → `ly.img.color.palette`, and `ly.img.filter.lut` + `ly.img.filter.duotone` → `ly.img.filter` (one source for both LUT and duotone). Because `addDefaultAssetSources` / `addDemoAssetSources` still iterate the old IDs, the four renamed/merged IDs are skipped silently against the default asset base URL — shapes, the default palette, and filters go missing until you re-register with the new IDs via `addLocalAssetSourceFromJSON` (Swift) / `addLocalSourceFromJSON` (Android). The default starter kits now also register `ly.img.text`, `ly.img.text.styles`, `ly.img.text.curves`, and `ly.img.text.components`. - **Editor/iOS:** Filter selection now uses a single `ly.img.filter` source covering both LUT and duotone effects, detected at runtime via asset metadata. Shape and sticker group identifiers are simplified (e.g. `"filled"` instead of `"//ly.img.cesdk.vectorpaths/category/filled"`); update any hardcoded group identifiers. - **Editor/Android:** Filter selection now uses a single `ly.img.filter` source covering both LUT and duotone effects, detected at runtime via asset metadata. - **Editor/iOS + Android:** Starter kits now register `ly.img.text` (basic text presets) and `ly.img.caption.presets` (caption styles) alongside the existing default sources. - **Editor/Flutter + React Native:** The default `baseUri` now resolves to the updated asset content. If you self-host, copy the `assets/` directory from `https://cdn.img.ly/packages/imgly/cesdk-//imgly-assets.zip` and point `baseUri` at your hosted location. - **Migration guide:** Migrating to v1.77 ([iOS](https://img.ly/docs/cesdk/ios/to-v1-77-ac6ca9/), [Android](https://img.ly/docs/cesdk/android/to-v1-77-ac6ca9/)) covers the full old → new asset source ID mapping and how to register sources. For Web, the [Migrating to v1.77 guide](https://img.ly/docs/cesdk/js/to-v1-77-e7f3a1/) covers the corresponding text source changes. **Camera & Capture Modes** - **Camera/Android:** Added photo and mixed (photo + video) capture modes. `CameraConfiguration` gains `captureType` (`Photo`/`Video`/`Mixed`), `captureCount` (`Single`/`Multi`), `photoClipDuration`, and `showsPhotoPreview`; results now arrive as `CameraResult.Captures(List)` (with `Capture.Photo(uri, clipDuration)` / `Capture.Video(recording)`) via a new `CaptureMedia` `ActivityResultContract`. `CaptureVideo` / `CaptureVideo.Input` are renamed to `CaptureMedia` / `CaptureMedia.Input` (old names `@Deprecated(level = ERROR)`) and `CameraResult.Record([Recording])` is `@Deprecated(level = ERROR)` — extract recordings with the new `List.videos` extension, and swap the `is CameraResult.Record ->` arm for `is CameraResult.Captures ->` in exhaustive `when`s. - **Camera/iOS:** Added photo and mixed capture modes via `captureType` (`.photo`/`.video`/`.mixed`) and `captureCount` (`.single`/`.multi`); captures arrive as a new `Capture` enum (`.photo(Photo)` / `.video(Recording)`) through `CameraResult.capture([Capture])`, and dual-camera mode now captures both cameras (`Photo.images` carries one or two images). `CameraResult.recording([Recording])` is now `@available(*, unavailable, renamed: "capture")` — extract recordings with the new `[Capture].videos` extension and swap the `.recording` arm for `.capture` in exhaustive switches. (The deprecated `Result<[Recording], CameraError>` callback initializer is unaffected.) - **Camera/ReactNative:** The bridge no longer emits `CameraRecordingResult` — pure-video sessions return a `CameraCaptureResult` with `captures: Capture[]`, and `Photo` changed from `{ uri, duration }` to `{ images: PhotoImage[], duration }`. Replace `result.recordings.forEach(...)` with `result.captures.forEach(...)` switching on each `Capture`'s `photo` / `video` field; replace `photo.uri` with `photo.images[0].uri`. - **Camera/Flutter:** The bridge no longer emits `CameraRecording` — pure-video sessions return a `CameraResult` with a populated `capture: CameraCapture`, and `Photo` changed from `{ uri, duration }` to `{ images: List, duration }` (with a typed `Rect`). Read `result.capture?.captures` and pattern-match each `Capture`'s `photo` / `video` field. - **Editor/Android:** The IMG.LY camera dock now launches in `Mixed/Multi` from a video editor (captured photos become timeline image-fill blocks using each photo's `clipDuration`) and in `Photo/Single` from a non-timeline editor (design, photo, apparel, postcard). The design starter-kit dock button now opens the IMG.LY camera (`Dock.Button.rememberImglyCamera()`) instead of the system camera. - **Editor/iOS:** When opened from a video editor the camera launches in `.mixed/.multi` (captured photos become timeline image-fill blocks whose duration matches `CameraConfiguration.photoClipDuration`, 5 seconds by default; dual-camera photos lay out as a PIP); in non-timeline editors it launches in `.photo/.single`. The design starter-kit dock now uses `Dock.Buttons.imglyCamera()` instead of the system `UIImagePickerController` flow. **Background Removal** - **Editor/iOS:** `BackgroundRemovalPlugin` now takes a `BackgroundRemovalConfiguration` and defaults to the IMG.LY IS-Net backend (`VisionBackgroundRemovalConfiguration` restores the previous Apple Vision behavior). The `Options` struct is removed, and the package ships as four library products so unneeded targets can be excluded. - **Editor/Android:** `ly.img:plugin-background-removal` is now the base package; add a concrete implementation (`ly.img:plugin-background-removal-imgly` or `ly.img:plugin-background-removal-google`). `Dock.Button.rememberBackgroundRemoval` now requires a `config` parameter, and `dockModifier` receives `BackgroundRemovalConfig`. **Error Handling** - **Engine:** Error message wording was standardized across the SDK. If you branch on error *message* substrings (e.g. `error.message.includes(…)`), switch to the stable `error.code` — existing substring matches may no longer match. See the [Error Catalog](https://img.ly/docs/cesdk/js/concepts/error-catalog-z3djzn/) for the full list of structured error codes. - **Engine:** Calling `addAsset`, `removeAsset`, or `applyAssetProperty` on a custom asset source that does not implement the operation now throws an error carrying the matching `BINDING.ASSET_SOURCE_ADD_UNSUPPORTED`, `BINDING.ASSET_SOURCE_REMOVE_UNSUPPORTED`, or `BINDING.ASSET_SOURCE_APPLY_PROPERTIES_UNSUPPORTED` code — previously `addAsset`/`removeAsset` silently did nothing and `applyAssetProperty` never completed. Implement the operation or catch the error if you are probing for support. **Keyboard Shortcuts** - **Editor/Web:** Keyboard shortcuts are now a public, customizable registry via `cesdk.shortcuts`, and the listener binds to the editor container instead of the `document` — shortcuts only fire when focus is inside the editor. Restore page-wide behavior with `cesdk.shortcuts.setRoot(...)`, or disable the layer with `cesdk.shortcuts.setEnabled(false)`. The registry exposes `set`, `get`, `list`, `remove`, `has`, `clear`, `setEnabled`, `addScope`, and `setRoot`; each shortcut is an object with `keys` (a chord like `'Mod+z'` or a sequence array), `run` (an action id or a function), `scope`, and optional `when`, `description`, `category`, and `sequenceTimeout`. See the [Migrating to v1.77](https://img.ly/docs/cesdk/js/to-v1-77-e7f3a1/) guide for details. - **Engine/Web:** The same keyboard-shortcut registry is available on the engine layer at `engine.shortcuts`, so any `@cesdk/engine` integration gets shortcuts without the editor UI (same methods). **Editor Configuration** - **Editor/Android:** Editor configuration composition was fixed so component lambdas that explicitly return `null` override parent components instead of falling back to them. --- **Deprecations** _All items below remain functional this release; migrate before they are removed._ - **Engine (Swift + Android):** The asset-source helper layer — `DefaultAssetSource`, `DemoAssetSource`, `populateAssetSource(...)`, `addDefaultAssetSources(...)`, `addDemoAssetSources(...)` — is deprecated. Register sources directly via `addLocalAssetSourceFromJSON` (Swift) / `addLocalSourceFromJSON` (Android) pointing at each source's `content.json`. - **Engine (Swift + Android):** Asset-source URL constants (`Engine.assetBaseURL` / `Engine.Companion.assetBaseUri`) are deprecated and will be removed in a future version. Build your own `baseURL` from bundled assets — for example `Bundle.main.url(forResource: "IMGLYAssets", withExtension: "bundle")` on iOS. The IMG.LY CDN is for development and evaluation only; self-host for production. - **Editor/Android:** `AppearanceAssetSourceType.LutFilter` and `DuoToneFilter` still resolve but are deprecated — migrate to `AppearanceAssetSourceType.Filter`. - **Editor/iOS:** `TextAssetSource` is deprecated. The default text library now uses the split text sources (`ly.img.text`, `ly.img.text.styles`, `ly.img.text.curves`, `ly.img.text.components`); register and use those instead. - **Editor/Android:** `TextAssetSource` and `AssetSourceType.Text` are deprecated. Use the split text sources (`AssetSourceType.TextPlain`, `TextStyles`, `TextCurves`, `TextComponents`) instead. - **Engine:** The control-gizmo flags `showMoveHandles`, `dynamicMoveHandleVisibility`, `showResizeHandles`, `showScaleHandles`, and `showRotateHandles` are deprecated (still functional) — use the new `controlGizmo/*HandleVisibility` settings instead. - **Plugins/Web:** `convertToPDFX3` is now a deprecated alias of `convertToPDFX`. --- **New Features** **AI Image Generation** - **Editor/Android:** Added the `AIImageGenerationPlugin` plugin that provides image generation features using AI. - **Editor/iOS:** Added AI Image Generation plugin (`IMGLYPluginAIImageGeneration`) **Text on a Path (Curved Text)** - **Engine:** Added text-on-curve support. Six new public API methods (`setTextOnPath`, `getTextOnPath`, `setTextOnPathOffset`, `getTextOnPathOffset`, `setTextOnPathFlipped`, `getTextOnPathFlipped`) let text blocks follow a validated SVG baseline path. Three new properties (`text/pathOffset`, `text/pathFlipped`, `text/pathExternalRef`) control proportional path offset, flipped placement, and the active curve asset reference. The existing vertical alignment (`text/verticalAlignment`) controls the text's vertical orientation relative to the curve: `Top` places the bottom of the glyphs on the curve (text above it), `Center` centers the glyphs on the curve, and `Bottom` places the top of the glyphs on the curve (text below it). - **Engine/Web/Android/iOS:** The new text-on-path API methods are available on all platforms, e.g. `engine.block.setTextOnPath`, `engine.block.getTextOnPath`. - **Engine:** Style presets can now place text on a curve. The baseline path lives in the preset's flat `properties` map like any other key: `text/path` (a virtual property routed through `setTextOnPath`, inheriting its SVG validation and path-bounds sizing; an explicit `null` clears the path) alongside the reflected `text/pathOffset` and `text/pathFlipped` properties. - **Engine:** Added the Circle, Arch, Wave, and Elevate curve presets to the `ly.img.text.curves` asset source, applied like any other style preset. - **Editor/Web:** Text-on-curve presets appear as the **Curved Text** section of the Text library, backed by the `ly.img.text.curves` asset source. - **Editor/Android:** Added a UI for placing text on a path. The new inspector bar button `InspectorBar.Button.rememberTextOnPath(...)` — included in the default inspector bar for text blocks — opens the new sheet `SheetType.TextOnPath(style)` with a grid of preset curves backed by the `ly.img.text.curves` asset source, plus path position, direction, and offset controls. - **Editor/iOS:** Added a UI for placing text on a path. The new inspector bar button `InspectorBar.Buttons.textOnPath(...)` — included in the default inspector bar for text blocks — opens the new sheet `SheetType.textOnPath(style:)` with a grid of preset curves backed by the `ly.img.text.curves` asset source, plus path position, direction, and offset controls. **Text Presets & Library** - **Editor/Web:** Reworked the built-in text presets into reusable **style presets** that apply a complete look (font, color, outline, background, shadow, and animations) in a single step. The default **Text** library (`ly.img.text`) groups them into sections — **Plain Text** (Default / Elegant / Modern Tech themes), **Text Styles** (outline, glow, neon, …), **Text Combinations** (pre-designed text layouts), and **Curved Text** (text-on-path) — backed by the `ly.img.text`, `ly.img.text.styles`, `ly.img.text.components`, and `ly.img.text.curves` asset sources. The `TextAssetSource` and `TextComponentAssetSource` plugins wire all of these into the single `ly.img.text` entry. The text "Styles" inspector button restyles a block from the same library minus Text Combinations (text designs create new blocks and aren't valid restyle targets). - **Editor/Web:** `cesdk.ui.setReplaceAssetLibraryEntries` now accepts `{ entry, excludeSourceIds }` objects alongside plain entry IDs, letting you hide specific asset sources from a replacement panel without affecting how that entry behaves on insert. - **Editor/Web:** Added new caption style presets. The `CaptionPresetsAssetSource` plugin provides them through the `ly.img.caption.presets` asset source and applies them via the engine's declarative style-preset mechanism, so captions and text now share the same one-step styling. - **Editor/Android:** Added `InspectorBar.Button.rememberTextPresets()` — a "Presets" inspector-bar button for text blocks that opens a restyle picker offering Plain Text, Text Styles, and Curved Text presets; tapping one restyles the selected block in place via the engine's style-preset apply path. The button appears once any of the `ly.img.text`, `ly.img.text.styles`, or `ly.img.text.curves` sources is registered. - **Editor/Android:** The default asset library "Text" tab now offers four sections — Plain Text, Text Styles, Text Combinations, and Curved Text — each backed by its own asset source (`ly.img.text`, `ly.img.text.styles`, `ly.img.text.components`, `ly.img.text.curves`). Plain Text drills into its Default, Elegant, and Modern Tech themes. Tapping a preset creates a pre-styled text block. In the Elements tab these appear as a single "Text" group whose preview mixes all of the text sources. Custom asset libraries can compose these sections via `LibraryContent.Section`. - **Editor/Android:** Added `LibraryContent.Section.groupTitleKeyPrefix` — sections expanded from asset groups can derive each group section's title from a localization key (``), falling back to a humanized group name. - **Editor/iOS:** Added `InspectorBar.Buttons.textPresets()` — a "Presets" inspector-bar button for text blocks that opens a restyle picker offering Plain Text, Text Styles, and Curved Text presets; tapping one restyles the selected block in place via the engine's style-preset apply path. The button appears once the `ly.img.text.styles` source is registered. - **Editor/iOS:** The default asset library "Text" tab now offers four sections — Plain Text, Text Styles, Text Combinations, and Curved Text — each backed by its own asset source (`ly.img.text`, `ly.img.text.styles`, `ly.img.text.components`, `ly.img.text.curves`). Plain Text drills into its Default, Elegant, and Modern Tech themes. Tapping a preset creates a pre-styled text block. In the Elements tab these appear as a single "Text" group whose preview mixes all of the text sources. Custom asset libraries can compose these sections via `AssetLibrarySection`. **Typeface Library & Language Groups** - **Editor/Web:** Introduced a new typeface library panel (browse every source, search, filter by language/source) replacing the fonts dropdown. - **Editor/Android + iOS:** Every typeface in the `ly.img.typeface` source now declares the language groups it covers (for example `latin`, `cyrillic`, `greek`, `hebrew`) via the asset `groups` field — query them with `engine.asset.getGroups(sourceId)` (Android) / `getGroups(sourceID:)` (iOS) or narrow font queries with group-filtered `findAssets`. The umbrella version in every source's `content.json` moves to `7.0.0`; no sources are added, renamed, or removed and no source IDs change, so no registration changes are required. If you self-host, copy the `assets/` directory from the platform's `imgly-assets.zip`. - **Editor/Flutter + React Native:** Typefaces in the default asset content now declare the language groups they cover via the asset `groups` field. No source IDs change. - **Engine/Web:** The default asset source now tags every built-in typeface with language groups so the typeface library can filter the fonts by language. **Text Formatting UI** - **Editor/Android + iOS:** Added a text formatting UI that stays anchored to the keyboard while the IME is open. **Text Runs API** - **Engine (Web / Android / Swift):** Added `getTextRuns` returning an ordered list of per-run `TextRunInfo` (color, font weight, font style, font size, text case, typeface, resolved font file URI, text decoration, and kerning): `engine.block.getTextRuns(id, from, to)` (Web), `getTextRuns(block, from, to)` → `List` (Android), and `getTextRuns(_ id:, in subrange:)` → `[TextRunInfo]` (Swift). **Crop — Original Aspect Ratio** - **Editor/iOS + Android:** Added an "Original" crop preset to the crop sheet that reverts a block to the intrinsic aspect ratio of its image or video content. - **Engine (Swift + Android):** Added `canRevertToOriginalRatio` (`BlockAPI.canRevertToOriginalRatio(_:)` / `BlockApi.canRevertToOriginalRatio(block)`) to query whether a block can revert to the intrinsic aspect ratio of its image or video content. **Control Gizmo Handle Visibility** - **Engine:** New `controlGizmo/moveHandleVisibility`, `controlGizmo/resizeHandlesVisibility`, `controlGizmo/scaleHandlesVisibility` and `controlGizmo/rotateHandlesVisibility` settings (`'auto' | 'always' | 'never'`, default `'auto'`). Use `'always'` to keep a handle visible while editing text, so a block can be moved, resized or rotated while typing. (These supersede the older `show*Handles` flags — see Deprecations.) **Actions Registry** - **Engine:** Added `engine.actions`, a registry of named editor commands — undo, redo, delete, duplicate, group, align, crop, text formatting, zoom, pan, and many more. Run one by id (`engine.actions.run('undo')`), change what a built-in does, or add your own. Clicks, double-clicks, wheel zoom, and right-click/long-press run through the same registry, so an override applies consistently across the editor. Available with `@cesdk/engine` and `@cesdk/node`; the register, override, and keyboard-rebinding APIs are not yet exposed on the iOS and Android bindings. **Structured Errors** - **Engine/Web:** Errors thrown by `CreativeEngine` are now `EngineError` instances (extending `Error`) with a stable `code` (e.g. `"SCENE.NOT_VALID"`) plus `category`, `hint`, `args`, `docsUrl`, and `silent`. Existing `try/catch` code that reads `error.message` keeps working — new code can branch on `error.code` instead of matching message strings. A typed `EngineErrorCode` union of all codes is exported from `@cesdk/engine` (and re-exported from `@cesdk/cesdk-js` together with `EngineError`/`isEngineError`) for compile-time-checked branching. `error.code` stays a `string`, so unknown or future codes never break consumers. See the [Migrate to Structured Errors guide](https://img.ly/docs/cesdk/js/to-v1-77-e7f3a1/) for how to move off message-string matching. - **Engine/Swift:** Thrown `NSError`s now carry the structured fields in `userInfo` (`EngineErrorCodeKey`, `EngineErrorCategoryKey`, …); `domain` and `code` are unchanged. The `hint` and docs URL surface through Foundation's standard slots (`localizedRecoverySuggestion` / `helpAnchor`). Wrap an error with `EngineError(error)` to read `code`, `category`, `hint`, `args`, `docsURL`, and `silent`, then branch on `code` instead of `localizedDescription`. Use the `EngineErrorCode` enum to `switch` on codes without bare strings. See the [Migrate to Structured Errors guide](https://img.ly/docs/cesdk/ios/to-v1-77-ac6ca9/) for how to move off message-string matching. - **Engine/Android:** `EngineException` now exposes `code`, `category`, `hint`, `args`, `docsUrl`, and `silent`. Existing code that reads `e.message` keeps working — new code can branch on `e.code` and surface the relevant docs page via `e.docsUrl`. Use the `EngineErrorCode` constants in `ly.img.engine` to branch without bare strings. See the [Migrate to Structured Errors guide](https://img.ly/docs/cesdk/android/to-v1-77-ac6ca9/) for how to move off message-string matching. - **Editor:** Engine error dialogs across Web, iOS, Android, Flutter, and React Native now show customer-facing, localizable copy keyed off the structured engine error `code`, falling back to the engine's English message when no copy is authored — so a dialog never shows a blank or a raw code. You can override this copy per error code and resolve it yourself in custom error handlers. See the [Custom Error Messages guide](https://img.ly/docs/cesdk/js/user-interface/custom-error-messages-2e8555/) for authoring copy and the [Error Catalog](https://img.ly/docs/cesdk/js/concepts/error-catalog-z3djzn/) for the full list of structured error codes. **Node-Native Engine & ESM Build** - **Engine/Node:** New `@cesdk/node-native` package shipping a native N-API addon for macOS (arm64, x64) and Linux x64 (glibc ≥ 2.39). Drop-in replacement for `@cesdk/node` (WASM) with GPU rendering, real video/audio export, and no WebAssembly memory ceiling. Switch the import — `import CreativeEngine from '@cesdk/node-native'` — and the existing code keeps working. Windows, Alpine/musl, Linux arm64, and AWS Lambda are unsupported in this release; those workloads stay on `@cesdk/node`. Licensing requirements are unchanged from `@cesdk/node` — see the package README and for details. Nightly builds publish under the `@dev` dist-tag for early validation. - **Engine/Node:** Ship a real ESM build alongside the existing CJS build. `import` resolves to `./build/index.mjs` and exposes `CreativeEngine` as the default export plus all named exports (`LogLevel`, color helpers, `MimeType`, etc.); `require` continues to return the `CreativeEngine` class with named exports attached as properties. No source code changes are required for existing CJS consumers. **Print & PDF Output** - **Plugins/Web:** Added `convertToPDFX` to `@imgly/plugin-print-ready-pdfs-web`. Supports both PDF/X-3 and PDF/X-4 via `outputStandard`, defaulting to PDF/X-4 so live transparency is preserved and vector text on transparent pages is no longer rasterized. (Supersedes `convertToPDFX3` — see Deprecations.) - **Engine/Renderer:** Added support for underlayer settings, text overhang, and PDF device CMYK export options --- **Improvements & Behavior Changes** **Typefaces & Font Library** - **Editor/Web:** Removed the font style/weight dropdown from the default text controls; weight and style are now set via the typeface library panel and the bold/italic toggles. - **Editor/Web:** The typeface select tooltip now shows the selected typeface name. - **Engine:** `ly.img.document-typefaces` asset source stays in sync with the scene. Entries are removed once no text or caption block references the typeface anymore, and `onAssetSourceUpdated` fires after every mutation. **Text Presets & Library** - **Editor/Web:** The default `ly.img.text` library keeps the source ID it has used since earlier versions, but its content changed from the basic Title / Headline / Paragraph entries to the new Plain Text style presets (per-asset IDs are now group-scoped, e.g. `ly.img.text.default.title`); the `ly.img.text.styles`, `ly.img.text.curves`, and `ly.img.text.components` sources join the same entry. See the [Migrating to v1.77](https://img.ly/docs/cesdk/js/to-v1-77-e7f3a1/) guide for details. - **Editor/Web:** Caption style presets now set the caption's font size and frame, scaled to the page, so applying one sizes the caption consistently and the size scales with the page resolution. **Keyboard Shortcuts** - **Engine:** Keyboard shortcuts are no longer handled inside the engine. If you embed `@cesdk/engine` without the CE.SDK editor UI and relied on the engine reacting to key presses (undo/redo, delete, arrow-key nudge, and so on), handle the key events yourself and dispatch the matching command through `engine.actions`. Integrations that use the prebuilt CE.SDK editor are unaffected — on the web it maps keys to actions for you. **Performance** - **Engine:** Added viewport-aware page culling for multi-page scenes. Only visible pages are processed each frame, dramatically improving performance for photobook-style scenes with 100+ pages. Controlled via `features/viewportCullingEnabled` setting (enabled by default). - **Editor/Android:** Improved pages mode performance for large scenes. Page thumbnails are now rendered sequentially with an in-memory cache, so re-entering pages mode displays thumbnails instantly. --- **Bug Fixes** **Engine** - Fixed a data race in the audio time-stretcher that could crash playback when scrubbing or splitting a video clip at a playback speed other than 1. - Fixed line shapes losing their gradient or image fill and turning solid black. Lines now render gradient, image, and video fills correctly. - Fixed movement constraint clamping for rotated blocks. The constraint now follows the block's axis-aligned bounding box in page space, so rotating a block no longer lets its visible bounds drift past the page edge along its long axis. - Fixed PDF exports with `exportPdfWithDeviceCMYK` losing spot color names. Spot colors now keep their name in the exported PDF, so print shops can match them to the correct ink. - Fixed system font fallback for characters not covered by the assigned typeface on Node and Node-Native. The hosted fallback fonts are now resolved from the IMG.LY CDN when a local `baseURL`/`basePath` is configured (as on Node), instead of from a local path where they are not available — so unsupported characters render the same as in the browser. A remote `baseURL` (e.g. a self-hosted CDN mirror) is still used as-is. - Fixed lines disappearing when combined with another element through a boolean operation. A line now contributes its visible (stroked) footprint to the combined shape, and a result that takes its color from a line now uses the line's color. - Fixed a video fill whose source failed to load (for example because of a CORS or network error) being re-fetched on every render frame with no limit. A failed video load now keeps its error state like image fills do; use `forceLoadResources`/`forceLoadAVResource` to explicitly retry it. **Engine/Web** - Fixed jittery video playback on Firefox. H.264 videos containing B-frames are now decoded in presentation order instead of decode order, eliminating the jumping and twitching artifacts that appeared while a video was playing. **Engine/Node** - Fixed `targetWidth`/`targetHeight` being silently ignored by `exportVideo` in `@cesdk/node-native`. Passing both dimensions now resizes the exported video as documented, matching the WASM binding — no explicit `useTargetSize` flag required. **Engine/Android** - Fixed a potential crash when overlapping engine directory cleanup operations delete stale temporary files. **Editor/Web** - Fixed uneven inspector bar spacing — corrected the doubled flex gap around zero-width spacers and removed the redundant horizontal margin that made the trim bar inset wider than other bars. - Fixed the caption panel input losing focus immediately after clicking "Create Manually", which interrupted typing the first caption. - Fixed an issue causing the shadow inspector to be visible for page blocks. **Editor/iOS** - Fixed a regression where pressing Backspace on an empty list item deleted the whole paragraph in a single keystroke. The first Backspace now clears the bullet/number while keeping the paragraph, and a second Backspace merges it with the previous paragraph (matching Web and Android). Affects both the hardware and on-screen keyboard. - Fixed the Crop sheet's Reset button. It is now correctly disabled when the crop has no modifications, and tapping it clears all crop edits while keeping the block in crop mode. - Fixed undo/redo after a page resize leaving the canvas zoom misaligned. The view now re-fits the page on every history step while the resize sheet is open. - Dashed and dotted strokes no longer flicker while adjusting the stroke width. **Editor/Android** - Dashed and dotted strokes no longer flicker while adjusting the stroke width. **Editor/Flutter** - Fixed an issue where effects applied to paused videos were not immediately visible when using TextureView. Version 1.76.1 Released: June 17, 2026 -------------------------------------------------- **Breaking Changes** **Non Breaking Changes** - Engine/Web, Editor/Web: Fixed a critical issue around the API endpoints used by the licensing mechanism. Version 1.76.0 Released: June 3, 2026 -------------------------------------------------- **Breaking Changes** - Editor/RN: Fixed exported artifact files on Android being named with a `.tmp` extension instead of the format-specific extension (e.g. `.mp4`, `.png`, `.pdf`). `EditorBuilderDefaults.getExportResult` now requires a `mimeType: MimeType` argument; callers that override the export builder must pass the `MimeType` of the exported buffer. - Editor/Flutter: Fixed exported artifact files on Android being named with a `.tmp` extension instead of the format-specific extension (e.g. `.mp4`, `.png`, `.pdf`). `EditorBuilderDefaults.getExportResult` now requires a `mimeType: MimeType` argument; callers that override the export builder must pass the `MimeType` of the exported buffer. **Non Breaking Changes** - Engine: Added `subscribeToHistoryWithKind`, whose callback receives a `HistoryUpdate` distinguishing snapshot changes (`Updated`) from activations via `setActiveHistory` (`Activated`), so consumers can ignore pure preview-mode activations. The existing `subscribeToHistory` is deprecated in favor of the new method. - Engine/Web: Added `engine.editor.onHistoryUpdatedWithKind((kind) => …)`, whose callback receives a `HistoryUpdate` (`'Updated'` or `'Activated'`). `engine.editor.onHistoryUpdated` is deprecated in favor of the new method. - Engine/Swift: Added `EditorAPI.onHistoryUpdatedWithKind` and `onHistoryUpdatedWithKindPublisher`, which emit `HistoryUpdate`. `EditorAPI.onHistoryUpdated` and `onHistoryUpdatedPublisher` are deprecated in favor of the new members. - Engine/Android: Added `EditorApi.onHistoryUpdatedWithKind()`, which returns `Flow`. `EditorApi.onHistoryUpdated()` is deprecated in favor of the new method. - Editor/Android: Added the `BackgroundRemoval` plugin for removing image backgrounds in the editors. - Editor/Android: Added support for multi-clip foreground tracks in the timeline, including split, gap-aware trim and move, and respect for locked clips. - Editor/Android: Long-press a clip on the timeline to drag it within or across tracks, or into a gap to create a new track. - Editor/Android: The video starter kit's Dock and InspectorBar no longer include `Dock.Button.rememberReorder()` / `InspectorBar.Button.rememberReorder()` — long-press drag on the timeline replaces them. The functions remain available for consumers who want to add the buttons back. - Editor/Android: The video starter kit's InspectorBar no longer includes `InspectorBar.Button.rememberMoveAsClip()` / `InspectorBar.Button.rememberMoveAsOverlay()` — drag-and-drop between background and foreground tracks on the timeline replaces them. The functions remain available for consumers who want to add the buttons back. - Engine/Web: Added optional `filter` parameter to `engine.asset.findAssets` for structured property predicates (`{ property, contains?, equals? }`) combined with `and` / `or` / `not` combinators. See [Querying Assets guide](https://img.ly/docs/cesdk/js/concepts/assets-a84fdd/#filtering-by-property) for details. - Engine/Web: Custom asset sources now receive the structured `filter` in their `findAssets` callback alongside the existing `query` / `tags` / `groups` fields. - Engine/Web: Added `block.getTextCharacterInkBoxes(id, from, to)` — returns the tight ink-paint bounding box of each grapheme cluster in `[from, to)`, in global scene coordinates. - Engine/Android: Added `BlockApi.getTextCharacterInkBoxes(block, from, to)` returning `List`. - Engine/iOS: Added `block.getTextCharacterInkBoxes(_:in:)` returning `[CharacterInkBox]`. - Engine: Added `setContentFillHorizontalAlignment`, `getContentFillHorizontalAlignment`, `setContentFillVerticalAlignment`, and `getContentFillVerticalAlignment` to control the alignment of the content fill within a block when using `Contain` or `Cover` fill modes. Useful for templates where the inserted image's aspect ratio is unknown and should pin to a specific edge (e.g. top-left) rather than always centering. - Editor/Web: Added content fill alignment controls in the crop inspector. Can be disabled via `cesdk.feature.enable('ly.img.crop.fillAlignment', false)`. - Editor/iOS: Added support for multi-clip foreground tracks in the timeline, including split, gap-aware trim and move, and respect for locked clips. - Editor/iOS: The default video editor's Dock and InspectorBar no longer ship `Dock.Buttons.reorder()` / `InspectorBar.Buttons.reorder()` — long-press drag on the timeline replaces them. The factories remain available for consumers who want to add the buttons back. - Editor/iOS: Drag clips between background and foreground tracks on the timeline. - Editor/iOS: Long-press a clip on the timeline to drag it within or across tracks, or into a gap to create a new track. Background clips reorder using the same gesture. - Engine: Added paragraph-granular line height API: `setTextLineHeight` and `getTextLineHeight` allow each paragraph in a text block to carry its own line height multiplier, independent of the block-level `text/lineHeight` default. - Engine: Added `scene.setFontSizeUnit()` / `scene.getFontSizeUnit()` to choose how `setTextFontSize`, `getTextFontSizes`, and the font-size float properties (`text/fontSize`, `text/min/maxAutomaticFontSize`, and the matching `caption/*` properties) interpret values on a per-scene basis (`Point` or `Pixel`). The engine continues to store font sizes in points internally; this only affects API-boundary interpretation. - Engine: `scene.create()` gained an overload that accepts `designUnit` and an optional `fontSizeUnit`. When `fontSizeUnit` is omitted it is auto-paired with `designUnit` (`Pixel` → `Pixel`, others → `Point`). - Editor/Web: Added a font-size unit selector to the page resize panel, and the font-size input now displays the scene's unit (`px` or `pt`). The new selector is gated by the `ly.img.scene.fontSizeUnit` feature key (enabled by default; disable via `cesdk.feature.disable('ly.img.scene.fontSizeUnit')`). - Editor/Android: Added a font-size unit selector to the page resize dialog. - Editor/iOS: Added a font-size unit picker to the page resize overlay. - Engine: Added `setTextKerning` and `getTextKernings` API for per-range character kerning offset control. - Engine: Added `text/useKerning`, `text/useContextualLigatures`, and `text/useDiscretionaryLigatures` boolean properties to text and caption blocks, enabling independent control of OpenType kerning (`kern`), contextual ligatures (`clig`), and discretionary ligatures (`dlig`) via `getBool`/`setBool`. - Engine: Text and caption blocks now render `Inner` and `Outer` stroke positions in addition to `Center`, matching shape behavior. The `setStrokePosition` API no longer returns an error for text blocks. - Editor/Web: The stroke position selector is now shown for text and caption blocks in the Inspector. - Engine: Line shapes are now true open-path lines instead of thin rectangles. Stroke caps can now be configured for both line and dash endpoints. - Editor/iOS: Updated the value of the `ly_img_editor_timeline_add_audio_option_music` resource from "Music" / "Musik" to "Audio" / "Audio". - Editor/Android: Fixed the "Add Audio" timeline menu's library option reusing the dock's `ly_img_editor_dock_button_audio` string. It now uses the dedicated `ly_img_editor_timeline_add_audio_option_music` resource. - Editor/Android: Opening the filter sheet, opening the crop sheet, or uploading an asset no longer crashes when the corresponding asset source is not registered. The affected feature degrades gracefully instead. - Editor/Android: Fixed voiceover sheet controls being drawn under the system navigation bar on devices with 3-button navigation. - Engine: Fixed click-through on images with effects or a blur applied. - Engine: Fixed `exportPdfWithDeviceCMYK` deriving the DeviceN alternate color from RGB instead of CMYK when a spot color carried both definitions. - Engine: Routed the evaluation-license banner and the `EventSubscriptionService::initEventCallbacks errorStateChanged` line to stderr instead of stdout, so callers can keep stdout clean for structured output (e.g. piping engine results through `jq`). On emscripten the banner now goes through `emscripten_console_error` (browser DevTools, `console.error`; Node.js `process.stderr`); on native targets it goes through `UBQ_ERRPRINTLN` (FD 2). - Engine: Fixed glyph overhangs (e.g., descenders) being clipped when exporting text with `allowTextOverhang: true`. - Editor/Flutter: Fixed an issue where effects applied to paused videos were not immediately visible when using TextureView. - Editor/Web: Fixed the per-image sub-section labels in the color picker's "More" view, which previously showed the raw translation key (e.g. `libraries.ly.img.colors.panel...`) instead of the image's name. - Camera/iOS: Multiple Dual Camera and reaction clips now share a single track per camera angle instead of creating a new track per recording, both when entering the Video Editor from the camera and when adding recordings to an existing timeline. - Engine/Swift: Fixed fast single-finger gestures on iOS being silently dropped before reaching the engine, causing quick page-carousel swipes and other gestures to occasionally do nothing. - Editor/iOS: Fix corrupted target color icon in the Recolor effect on iOS 26. - Editor/iOS: Fixed a "Tried to get solid color fill value on a block that has no such fill color" error when opening a scene whose named blocks have image, video, or non-linear-gradient fills. - Editor: Fixed multi-selection bounding box and resize behavior when an audio block is selected together with visual blocks. The selection frame now stays around the visual blocks only, and resizing no longer affects audio tracks. - Engine: Improved page-carousel swipe feel. - Editor/Web: Silenced `findDOMNode` deprecation warning emitted by `react-draggable` by passing `nodeRef` to every `Draggable`/`DraggableCore` instance. - Engine: Fixed the corner-rounding slider producing a triangular bevel on shapes with mild bends (e.g. Organic Dot 1/2). Mild junctions now smooth progressively with the slider; sharper corners still round as before. - Editor/Web: Fixed an issue where the slider's optional numeric input was letting users commit values that did not land on the slider's `step` grid. - Engine: Fixed move-handle snap targets being offset from the design block frame for text blocks with a background fill. All four edges (left/right/top/bottom) now consistently snap to the design block frame bounds; background-color padding is no longer factored into the snap geometry or the dragged-segment indicator. - Engine: `setStrokeDashArray` and `setStrokeDashOffset` now reject NaN and infinity inputs with a clear error message, matching the validation already used by the rest of the float-typed stroke setters. - Engine: Custom dash patterns now scale with the shape when resizing from a corner, keeping the dash spacing visually consistent. - Editor/Android: Updated the English translation of `ly_img_editor_sheet_format_text_label_frame_clipping` from "Frame Clipping" to "Clipping". - Editor/iOS: Updated the English translation of `ly_img_editor_sheet_format_text_label_frame_clipping` from "Frame Clipping" to "Clipping". - Editor/Web: Inspector sliders bound to a block property (e.g. brightness, contrast) now reliably update the undo state on slow CPUs. - Editor/Web: Fixed an issue where the `fill` and `stroke` placeholder sections where enabled for stickers blocks. - Engine: Fixed slowdowns and occasional freezes when applying adjustments, filters, or effects to images. - Engine: Fixed an issue where video clip thumbnails not updating after replacing the underlying video in some cases. - Engine: Added a new `playback/showAllBlocks` setting that keeps every element visible on the canvas at once, even ones that would otherwise only appear at certain playback times. Off by default. - Renderer: Fixed `--page ` selecting the wrong page on multi-column/spread layouts. The CLI now selects pages in document order, matching whole-scene PDF export, instead of reordering them by canvas position. - Engine: Fixed an issue where PDF exports with `exportPdfWithDeviceCMYK` enabled could render thin shape outlines far too thick, turning small icons into oversized solid shapes. - Editor/Web: Fixed an issue where the audio track in the video editor timeline could be hidden on initial load until the timeline was collapsed and re-expanded. - Editor/Android: Fixed tapping a placeholder page not opening any replace library. The library now matches the page's fill — images for an image fill, videos for a video fill. - Editor/Android: The inspector bar now shows a Replace button for a page with an image or video fill, opening the matching library (images or videos) to replace the page's fill. - Editor/iOS: Fixed tapping a placeholder page opening the full asset library instead of one matching the page's fill (images for an image fill, videos for a video fill). - Editor/iOS: The inspector bar now shows a Replace button for a page with an image or video fill, opening the matching library (images or videos) to replace the page's fill. Version 1.75.1 Released: May 21, 2026 -------------------------------------------------- **Breaking Changes** **Non Breaking Changes** - Maintenance release. No SDK changes. Version 1.75.0 Released: May 19, 2026 -------------------------------------------------- **Breaking Changes** **Editor/Android** - All `ScopedProperty` component properties in `EditorConfigurationBuilder` now return nullable components. For example, `ScopedProperty>?` is now `ScopedProperty?>?`. **Engine — Text** - Setting block-level `text/horizontalAlignment` (via `setEnum` or `setTextHorizontalAlignment` without a `paragraphIndex`) now clears all paragraph-level horizontal alignment overrides. - Fixed paragraph override retention during text deletion/merge, so list style and paragraph horizontal alignment are preserved correctly. - `getTextParagraphIndices` now expects the `to` parameter to be exclusive. --- **New Features** **APNG Support** - **Engine:** Animated PNG (APNG) files can now be imported. In design scenes they appear as a static image (the first frame); in video scenes they play as a looping animated fill, the same way GIFs do. - **Editor/Web, iOS, Android:** The upload widget accepts `.apng` files. **Text** - **Engine:** Added paragraph-level text horizontal alignment APIs (`setTextHorizontalAlignment`, `getTextHorizontalAlignment`) and `getTextEffectiveHorizontalAlignment`. **Crop & Aspect Ratio** - **Engine:** Added a new `ContentAspectRatio` asset transform preset that snaps a block's frame to the intrinsic aspect ratio of its image or video content at apply time. - **Engine/Web:** Added `block.canRevertToOriginalRatio(block)` which reports whether the "Original" crop preset (`ContentAspectRatio`) can be applied. - **Editor/Web:** Added an "Original" entry to the crop presets palette. Selecting it resizes the block to match its content's natural aspect ratio. **Color & Image Colors** - **Engine:** Added `engine.block.getDominantColors()` to extract the prominent colors of the rendered appearance of a block. - **Editor/Web:** Added an "Image Colors" section to the color library panel that aggregates the dominant colors of every block in the current scene, split into one sub-section per contributing block. Blocks referencing the same underlying image are collapsed to a single sub-section. - **Editor/Web:** Added Feature API keys to independently toggle sub-controls (color picker, gradient editor, opacity slider, swatch library) across every color panel: - `ly.img.fill.color.picker`, `ly.img.fill.color.picker.gradient`, `ly.img.fill.color.picker.opacity`, `ly.img.fill.color.library` - `ly.img.stroke.color.picker`, `ly.img.stroke.color.picker.opacity`, `ly.img.stroke.color.library` - `ly.img.shadow.color.picker`, `ly.img.shadow.color.picker.opacity`, `ly.img.shadow.color.library` - `ly.img.text.background.picker`, `ly.img.text.background.picker.opacity`, `ly.img.text.background.library` **Grid** - **Engine:** Each page can now have its own grid settings. - **Editor/Web:** Grid controls moved to the Page panel as a new "Grid" section. New and duplicated pages inherit the previous / source page's grid so you don't have to set it up each time. The Document panel now only has "Show Rulers". **Movement, Interaction & Vector Paths** - **Engine:** Added `editor.setMovementConstraint`, `editor.getMovementConstraint`, and `editor.removeMovementConstraint` to limit how far blocks can be positioned outside their parent page during user interactions. See Movement Constraints guide for details. - **Engine:** Clicks now pass through fully transparent parts of images and stickers to the element behind them. On by default; disable via `features/transparentClickThroughEnabled = false` to restore the legacy behavior. - **Engine:** Added `shape/vector_path/fillRule` enum property (`EvenOdd` | `NonZero`) so imports from PDF, SVG and other tools that use non-zero winding render correctly. The default stays `EvenOdd`, preserving existing scene rendering. **PDF Output** - **Engine:** Added `fill/overprint` and `stroke/overprint` block properties for controlling the PDF overprint attribute on exported PDFs. **Archival & Block APIs** - **Engine:** Added `archival/bundleOnlyUsedFontVariants` setting. When enabled, `saveSceneToArchive` and `saveBlocksToArchive` bundle only the font variants actually referenced by text blocks instead of every variant of each used typeface, significantly reducing archive size. Defaults to `false` to preserve the ability to switch to other weights/styles after re-loading the archive. - **Engine:** Added `engine.block.findAllUnused` API that returns all blocks that are not attached to any scene. - **Engine:** `forceLoadResources` now accepts an empty block list to load resources for every block currently known to the engine. **Editor Configuration & Assets** - **Editor/Android:** Added `EditorConfiguration.then` and `EditorConfigurationBuilder.parentConfiguration` to support chaining editor configurations and extending existing callbacks or UI components. - **Editor/Web:** Added a customizable `asset.delete` action that is invoked when the user deletes an asset from an asset source via the asset library card. Register a custom implementation with `cesdk.actions.register('asset.delete', ({ sourceId, asset }) => { ... })` to replace the confirmation dialog content, swap in a custom dialog, or change the deletion behavior entirely. The default behavior is unchanged. **Text Rendering** - **Engine:** Added `features/fontLineGapEnabled` setting (default `true`). Set to `false` to restore the pre-1.73 text rendering that ignored the font's `line_gap` metric, for projects whose stored scenes or templates were authored against the older layout. --- **Improvements & Behavior Changes** **Editor** - Enlarged the clickable area of selection corner handles on mouse input so corners are easier to grab near the frame corner. The corner hit area is now symmetric around the frame corner with a reach of 9 px in every direction. **Editor/Web — Video Editor** - In the Video Editor caption start/end time reverts to the previous value when cleared or given an invalid time. - In the Video Editor caption timing inputs can no longer produce overlapping or out-of-order captions. **Editor/Web — Placeholders** - The placeholder "Allow to Resize" toggle on pages now applies only to the current page instead of fanning out to every page in the scene. The i18n key `scope.layer.resize.allPages` was renamed to `scope.layer.resize.page`. - Hide the "Allow to Change Shape" placeholder option for pages, where shape replacement is not exposed by the default editor UI. - Correct the "Allow to Change Shape" placeholder tooltip to describe replacing the shape type instead of editing shape options. **Editor/Web — Image Colors** - Fixed the search bar in the "Image Colors" picker — typing a hex value or image name now filters the swatches. - "Image Colors" no longer shows solid-color fills; only colors picked from images appear in this section. --- **Bug Fixes** **Engine** - Fixed vector path editing where dragging anchor points, adding anchors to segments, and bending segments would not update until the camera moved. **Engine/Swift** - Fixed Dolby Vision videos not working correctly. - Fixed memory leak during video export. **Engine/Android** - Fixed video MediaCodec, MediaExtractor, and Surface resources not being released when a decoder is destroyed, which could exhaust the platform hardware codec limit across long-running sessions. **Engine/Web** - Fixed a glitch where some AI-generated videos briefly showed frames from the start of the clip near the end of playback. **Editor** - Fixed vector path editing segments rendering oversized on monitors with different pixel densities. **Editor/Web** - Fixed an issue where the editor could load with mobile layout on desktop. - Fixed a crash when popover content is hidden via custom CSS. - Fixed an issue where hovering the Replace Shape dropdown item did not display a tooltip. - Fixed slider being unable to reach its default value in Safari and Edge. - Fixed a video timeline issue where height was not re-measured properly when enabling video timeline features after initial render. - Fixed an issue where the advanced video editor starterkit would not show all the timeline tracks in some edge cases. **Editor/iOS** - Fixed "Add Clip" button drifting to the foreground track's trailing edge after removing all background clips. - Fixed a "Could not create View for Canvas Menu / Inspector Bar" error popup that could appear after moving a single clip from the background track to an overlay (and other interactions that destroyed the selection's parent block). **Editor/Flutter** - Fixed an issue where effects applied to paused videos were not immediately visible when using `TextureView`. Version 1.74.2 Released: May 15, 2026 -------------------------------------------------- **Breaking Changes** **Non Breaking Changes** - Editor/iOS: Engine-provided animation asset labels can now be localized through the platform localization system. Apps can override labels per locale by declaring the matching string keys. - Editor/Android: Engine-provided animation asset labels can now be localized through the platform localization system. Apps can override labels per locale by declaring the matching string keys in their `strings.xml` Version 1.74.1 Released: May 7, 2026 -------------------------------------------------- **Breaking Changes** **Non Breaking Changes** - Editor/Web: Fixed dependency declarations and import resolution causing some starterkits to fail on startup. - Camera/iOS: Fixed a crash that could occur when the camera failed to start. Version 1.74.0 Released: May 5, 2026 -------------------------------------------------- **Breaking Changes** - Editor/Web: **BREAKING**: The video editor starter kit now defaults to a simplified timeline. `timeline/trackVisibility` is set to `'active'` so only the selected track is shown in the foreground, and the `ly.img.video.timeline.ruler` feature is disabled so the time scale is hidden. **Non Breaking Changes** - Editor/Web: Add `builder.Spinner()` to render an indeterminate loading spinner in registered panels, with an optional `label` rendered beneath the spinner. - Engine: Improved corner rounding on polygon and vector path shapes to produce smooth bezier arcs at curved segment junctions - Engine: Added `Dynamic` option to `touch/pinchAction` setting. Pinch gestures scale the block at the center point between fingers, or zoom the camera if no block is found. - Engine/Web: Added `exportPdfWithDeviceCMYK` export option. When enabled, direct CMYK colors are written as DeviceCMYK (`k`/`K` operators) and spot colors with CMYK values are written as DeviceN with process CMYK components in exported PDFs. Disabled by default for backward compatibility. - Engine: Added `page/flipDimensionsOn90DegreeCropRotation` setting. When enabled, rotating the crop by 90 degrees automatically swaps the block's width and height, causing the page aspect ratio to rotate with the content. - Editor/Web: Replaced the editor loading indicator with a theme-aware beacon ring that adapts to light and dark surfaces using the host's design tokens. - Editor/Web: Added UI controls to add and delete gradient color stops from the color picker. - Editor/Web: Added UI controls for switching between linear, radial and conical gradient fill types. - Editor/Web: Added a mirror button to reverse gradient stops. - Engine/Editor: Added `page/marqueeSelectOnBodyDrag` setting (default: `false`). When enabled, a click+drag that starts on the page body marquee-selects the blocks inside the page instead of moving the page. The page can still be moved by dragging its title, or by holding Cmd (macOS) / Ctrl (Windows/Linux) while clicking+dragging on the page body, on any block inside the page, or on a page whose body is fully covered by content. In free layout the Cmd/Ctrl+drag translates the page; in horizontal/vertical stack layouts it reorders the page within the stack. - Plugins/Web: Added `embedICCProfile` option to the Print-Ready PDF plugin's `convertToPDFX3`. When set to `false`, the resulting PDF is converted to device CMYK (or RGB, depending on the selected `outputProfile`) without embedding an ICC profile or the PDF/X-3 OutputIntent, enabling integration with downstream prepress pipelines such as ZePrA or PitStop that assign their own ICC profile and apply color normalization. Defaults to `true` for backward compatibility. - Engine/Editor: Added `page/restrictPageSelectionToBorderAndTitle` setting (default: `false`). When enabled, clicking inside a page body no longer selects the page; the page can only be selected by clicking on its border or title. - Engine: Auto-width text blocks now shrink back to fit the remaining text when content is deleted to a single line while the page-edge clamping feature is active. - Engine: Snap guide lines are now finite and bounded to the edges of the involved elements. Element boundaries are shown with a dashed pattern, while connecting lines and gaps between elements are solid. - Engine: Vector anchor handles in vector edit mode now snap to page edges, centers, siblings, grid lines, and to other anchors' horizontal/vertical alignment. - Engine: Added `hasSelectedVectorControlPoint()` and `deleteSelectedVectorControlPoints()` APIs for managing bezier control point handles during vector editing. - Engine: Added `shape/star/cornerRadius` property for rounding star shape corners. - Engine: Improved vector editing: corner radius is now preserved as a live property when converting parametric shapes to vector paths, bend mode no longer overwrites existing control handles, and segment splits produce smooth nodes by default. - Plugins/Web: Fixed background removal failing on GPUs without WebGPU `shader-f16` support by falling back to CPU-based inference. - Editor/Flutter: Fixed an issue where effects applied to paused videos were not immediately visible when using TextureView. - Engine: Fixed `getTypeface()` and `getTypefaces()` returning an error for text blocks without an explicitly set typeface. They now resolve the default font from settings when no typeface has been assigned. - Editor/Web: Fixed an issue where the hex color input did not update when pasting a color value. - Engine/Swift: Dispatch async `onXChanged` stream unsubscribes to the main thread, fixing a race in the engine's subscription map when multiple streams terminate concurrently. - Engine: Thumbnail generation now caps the effective render resolution at 512 px on each dimension. The returned thumbnail still matches the requested output size. - Engine: Fixed the `cesdk-renderer` Linux CLI exporting only the first page when writing a scene to PDF. PDF exports now include every page of the scene by default; pass `--page ` to export a single page. - Engine: Fixed PDF export wrapping spot-colour text in a transparency group. - Engine: Fix underlayer shape being offset by the page margin in PDF export when `page/marginEnabled` is enabled. - Editor/Web: Added 46 new Starter Kits covering video editing, plugins, custom built UIs, customization, assets, templating, creative automation, and extensibility. - Engine: Fixed an issue where text blocks with pending font resources (e.g., system font fallback) would show a gray background overlay in exported images. - Engine: Fixed a rare crash that could occur when moving, resizing, or rotating an element if the selection changed during the gesture. - Editor/Web: Fixed the canvas view jumping to the page center on undo/redo when zoomed in. - Engine: Star shapes now use the smooth corner rounding introduced for polygons and vector paths, so a star's `cornerRadius` looks identical whether or not it is in vector edit mode. - Engine: Entering vector edit mode on a circle or ellipse now mirrors its control handles in both angle and length by default, keeping the shape symmetric while dragging a single handle. - Editor/Web: Updated the design of gradient color stop handles. - Editor/Web: Fixed gradient bar preview to reflect actual stop positions while dragging. - Editor/Web: Replaced the color mode label with a dropdown to switch between RGB and CMYK. - Editor/Web: Hide the Position control in the inspector bar when a page block is selected. Previously a disabled Position button was shown because the `ly.img.position` feature was implicitly kept enabled by its always-true `arrange`, `align`, and `distribute` child predicates; the child predicates now mirror the parent and return `false` for pages. - Engine: Fixed `page/title/color` setting not being applied while editing a page title; the editing text no longer inherits the selection-highlight color from the displayed title. - Plugins/Web: Added `middlewares` to `GatewayProviderConfiguration`, bringing AI gateway providers in line with every other AI provider. Use it to hook logging, rate limiting, custom error handling, or `uploadMiddleware` to re-upload generated assets to your own storage — the recommended fix for the gateway's short-lived presigned URLs. - Engine: Added `ExportOptions.underlayerRenderRatio` and `ExportOptions.underlayerMaxError` to allow tuning the fidelity of the PDF underlayer contour. - Editor/Web: Fixed canvas being greyed out by the ruler overlay on Firefox in advanced mode. - Editor/ReactNative: Fixed `IMGLYEditor.openEditor` and `IMGLYCamera.openCamera` hanging on iOS when the host app already had a view controller presented modally (e.g. `react-native-screens` modal routes, Expo Router modal screens, RN ``, system sheets). The editor is now presented from the topmost view controller, so the returned `Promise` settles correctly in all hosting scenarios. - Editor/Android: Introduced the `addToBackgroundTrack` parameter for `EditorEvent.AddUriToScene` when adding URI assets to the scene. - Editor/Android: Fixed the "Select Group" canvas menu button being rendered as a plain text label instead of the filled tonal chip-style button. Version 1.73.1 Released: April 23, 2026 -------------------------------------------------- **Non Breaking Changes** - Editor/iOS: Engine-provided animation asset labels can now be localized through the platform localization system. Apps can override       labels per locale by declaring the matching string keys.                                                                                   - Editor/Android: Engine-provided animation asset labels can now be localized through the platform localization system. Apps can override   labels per locale by declaring the matching string keys in their `strings.xml` Version 1.73.0 Released: April 20, 2026 -------------------------------------------------- **Breaking Changes** - Editor/Android: **BREAKING**: Introduced Starter Kits - pre-configured editor templates that replace the previous built-in editor composables. The editor now initializes with a blank canvas by default. **Key changes:** - The editor initializes a blank canvas with minimal configuration. Use one of our Starter Kits to get started quickly based on your use case. **Migration**: See the [Starter Kits Migration Guide](https://img.ly/docs/cesdk/android/to-v1-73-ab14fb/) for step-by-step instructions. - Editor/iOS: `OnCreate.default` and `OnCreate.loadScene` no longer load the default and demo asset sources. - Editor/iOS: Removed `SceneMode` dependency from UI logic. Editor behavior is now configured explicitly per solution rather than derived from the scene mode. - Editor/iOS: Added `OnExport.static()` and `OnExport.video()` replacing the removed `OnExport.default`. - Editor/iOS: Removed `AssetLibrarySceneModeReader`, `OnExport.default`, and `OnCreate.loadAssetSources`. - Editor/iOS: Added `photoRollTab` requirement to the `AssetLibrary` protocol. Custom conformances must implement this property. - Engine/Swift: Removed `sceneMode` parameter from `addDemoAssetSources`. The `exclude` parameter now defaults to excluding video and audio sources; pass `exclude: []` to include all. **Non Breaking Changes** - Engine/Android: Bumped compileSdk and targetSdk versions to 36. - Editor/Android: Bumped compileSdk and targetSdk versions to 36. - Engine/Editor: Added `controlGizmo/dynamicMoveHandleVisibility` setting (default: `true`). Set to `false` to keep the move handle always visible regardless of block size. Default behavior is unchanged. - Editor/Web: Improved keyboard accessibility by returning focus to the trigger button when closing a panel - Editor/Web: Add `builder.Select()` support to navigation bar, inspector bar and canvas bar with `searchable` and `searchPlaceholder` options. - Engine: Added SVG export support using the `image/svg+xml` MIME type. Text is exported as vector paths for consistent rendering across environments. Drop shadows, blur, effects, and raster images are rasterized and embedded as images. - Engine: Fixed importing some camera-recorded MP4/3GP videos whose audio track uses AMR sample entries. - Engine: Fixed animation duration slider not allowing the full clip length due to rounding. - Engine: Local asset sources now resolve labels and tags using a fallback chain (requested locale → "en" → first available) instead of returning empty values when the exact locale is not found. - Editor/Web: Fixed the "Match Language Direction" control incorrectly showing RTL mode when LTR text is right-aligned. - Editor/Android: Fixed the "Match Language Direction" control incorrectly showing RTL mode when LTR text is right-aligned. - Editor/iOS: Fixed the "Match Language Direction" control incorrectly showing RTL mode when LTR text is right-aligned. - Engine: Fixed multiline text rendering for fonts with non-standard line gap metrics (e.g., Coiny). The font's line gap is now correctly incorporated into line height calculations, fixing incorrect line spacing and cursor height. - Engine: Fixed document colors missing colors and incorrect active states for text with mixed run colors. - Editor/Web: Fixed document colors not refreshing when changing partial text colors. - Engine: Fixed fade animation jumping when combined with element opacity on groups - Editor/Web: Fixed archive import and `cesdk.utils.loadFile` opening file picker twice on Windows when OPFS is not available - Editor/Flutter: Fixed an issue where effects applied to paused videos were not immediately visible when using TextureView. - Engine: Fixed an issue where pages in free layout mode would jump to align with neighboring pages after flipping their orientation. - Engine: `findAllSettings()` no longer returns internal or legacy settings such as `debug/*` and `features/*`. - Engine/Web: Fixed hover frame remaining visible when moving the mouse from a selected block to the canvas menu. - Engine/Swift: Fixed certain HEVC videos not playing correctly on iOS. - Engine/Swift: Improved export time for videos. - Engine: Fixed console errors when mixing RTL and LTR text in a text block with word wrapping enabled. - Engine: Fixed opacity not being applied correctly to nested groups. - Engine/Node: Fixed null engine reference on dispose, respect forceCPU on Linux, GPU flush on destruction, and JSON validation for scene deserialization. - Editor/Web: Fixed a memory leak where switching fill types (solid/gradient) orphaned the previous fill entity - Editor/Web: Fixed page titles being styleable (font, color, size) during editing. - Engine: Fixed pinch-to-zoom deselecting the selected element, causing canvas jumps from single-touch scroll, and accidentally triggering handle drags during two-finger gestures. - Engine: Reduced jittery behavior when starting a pinch-to-zoom gesture by increasing the single-touch pan distance threshold and adding a time delay before single-touch panning activates. - Engine: Fixed placeholder settings not being adjustable for blocks loaded from older scenes. - Engine: Fixed a bug where clicking on empty areas within a non-rectangular shape's bounding box caused the selection to flicker. - Engine: Fixed system font fallback rendering producing incorrect results in thumbnails. - Engine: Fixed applying a template overwriting the scene layout mode, causing inconsistent state when the previous layout differed from the template's layout. - Engine: Fixed text variables being duplicated when entering text edit mode after applying a text color range that intersected a variable placeholder. Variables are now treated as a single grapheme unit in all text formatting APIs (consistent with inline text editing), so formatting ranges are always snapped to variable boundaries rather than splitting inside them. - Engine: Fixed an issue where `payload.sourceSet` was not applied to video fills when using `defaultApplyAsset` - Engine/Android: Fixed audio playing back at ~2x speed for videos with HE-AAC (SBR) or HE-AACv2 (PS) audio tracks. - Engine: Fixed audio duration being reported as half the actual value for HE-AAC/HE-AACv2 audio. - Editor/Web: Fixed incorrect translations. - Editor/iOS: Added new `Editor` struct providing a unified core editor. - Editor/iOS: Added `OnChanged` callback to be notified when state changes occur in the editor. - Editor/Web: Added 10 new floral stickers to the `StickerAssetSource` plugin, available under the `ly.img.sticker.florals` category. - Editor/Web: Added new `PremiumTemplatesAssetSource` plugin for premium template assets (`ly.img.templates.premium`). - Engine: Fixed a crash when loading scene files saved with engine versions prior to 1.72.0 that contain text blocks. - Engine/Android: Fixed a crash in pan gesture handling during multi-touch interactions. - Editor/Android: Fixed a crash where zooming to a selected block could fail if the block was deleted during the zoom debounce window. - Editor/Android: Fixed a rare crash in the canvas menu when the selected block was deleted. - Editor/Web: Fixed double-click page title renaming not working on direct load. Page title editing is now enabled by default in every editor config. - Engine: Fixed audio waveform thumbnail generation for 24-bit WAV files. - Editor/Web: Fixed shape controls incorrectly appearing for sticker blocks in the inspector. Version 1.72.3 Released: April 14, 2026 -------------------------------------------------- **Breaking Changes** **Non Breaking Changes** - Engine/Android: Fixed a crash in pan gesture handling during multi-touch interactions. - Editor/Android: Fixed a crash caused by stale block IDs in the zoom function when blocks are deleted during debounce delay. - Editor/Android: Fixed a rare crash in the canvas menu when the selected block was deleted. - Engine/Android: Fixed HE-AAC (SBR/PS) audio playback and duration calculation on Android by correctly accounting for Spectral Band Replication doubling the frame length. Version 1.72.2 Released: April 9, 2026 -------------------------------------------------- **Breaking Changes** **Non Breaking Changes** - Engine: Fixed a crash when loading scene files saved with engine versions prior to 1.72.0 that contain text blocks. Version 1.72.1 Released: April 2, 2026 -------------------------------------------------- **Breaking Changes** **Non Breaking Changes** - Editor/Web: Add `builder.Select()` support to navigation bar, inspector bar and canvas bar with `searchable` and `searchPlaceholder` options. - Engine: Local asset sources now resolve labels and tags using a fallback chain (requested locale → "en" → first available) instead of returning empty values when the exact locale is not found. Version 1.72.0 Released: April 2, 2026 -------------------------------------------------- **Breaking Changes** - Engine: **Breaking:** Deprecated scene mode. The engine no longer restricts features based on scene mode. All features (video playback, timeline, audio, export, etc.) work on every scene regardless of mode. See the [v1.72 migration guide](https://img.ly/docs/cesdk/react/to-v1-72-b37fa1/) for details. - Engine/Web: **Breaking:** `scene.getMode()` now returns `null` for scenes created with `scene.create()`. Previously returned `'Design'`. The return type changed from `SceneMode` to `SceneMode | null`. - Engine/Web: Deprecated `scene.getMode()`, `scene.setMode()`, and `scene.createVideo()`. These APIs still work but will be removed in a future version. - Engine/Web: `block.addVideo()`, `block.getBackgroundTrack()`, `block.addImage()`, and `block.getThumbnailAt()` no longer throw errors on Design-mode scenes. - Editor/Web: **Breaking:** Deprecated `cesdk.createDesignScene()`, `cesdk.createVideoScene()`, and the `mode` option on the `scene.create` action. Use `cesdk.actions.run('scene.create')` instead. - Editor/Web: **Breaking:** Browser support checks (`editor.checkBrowserSupport` action) are no longer triggered automatically based on scene mode. Config plugins must call the action explicitly with `{ videoDecode, videoEncode }` parameters. Starter kit configs (video editor, advanced video editor) are already updated. - Editor/Web: **Breaking:** Code that reads `scene/mode` via `engine.block.getEnum(scene, 'scene/mode')` will throw on scenes without a mode. Remove mode checks or set a mode explicitly. - Renderer/CLI: Scenes without a mode now default to image export instead of crashing. - **Migration guide:** [Upgrading to v1.72](https://img.ly/docs/cesdk/react/to-v1-72-b37fa1/) covers scene creation changes, removing mode checks, browser support configuration, TypeScript type updates, cross-platform compatibility, and how to keep using legacy mode if needed. - Editor/iOS: Renamed `InspectorBar.Buttons.editVoiceover()` to `addVoiceoverRecording()` and `InspectorBar.Buttons.ID.editVoiceover` to `.addVoiceoverRecording`. Removed `Image.imgly.editVoiceover`; use `Image.imgly.addVoiceover` instead. Voiceover clips now support duplicate, split, and replace actions in the inspector bar. **Non Breaking Changes** - Engine: Added `.wav` to the supported audio import formats in the file format support documentation. - Editor/Android: Added Voiceover recording to the timeline audio flow with multiple voiceover tracks, recording beyond video end, and waveform/trim handling improvements. - Editor/Web: Added grid and rulers feature with configurable grid spacing, snap-to-grid, grid color customization, and canvas rulers. Controlled via `ly.img.rulers` feature flag — enabled by default in advanced editor and video editor configurations. - Editor/iOS: Voiceover recording now uses a compact floating record sheet with multi-track recording support and lets you add follow-up recordings from selected voiceover clips. Added `SheetStyle.only(isFloating:detent:)` and `PresentationDetent.imgly.micro`. The default style for `SheetType.voiceover()` changed to a floating micro sheet. - Engine: Added `maxPreviewResolution` setting that caps the rendering resolution during preview mode. When set to a value greater than 0, the scene is rendered to a smaller offscreen surface and upscaled, improving performance on high-DPI displays. Does not affect exports or thumbnails. Defaults to -1 (disabled). - Engine: Added `page/title/canEdit` setting to enable renaming pages by double-clicking the page title on the canvas. Pressing Enter confirms the new name. - Editor/Web: When `page/title/canEdit` is enabled, double-clicking the page title opens an inline text editor to rename the page. - Engine: Added `page/reparentBlocksToSceneWhenOutOfPage` setting that allows blocks to be automatically reparented to the scene when dragged outside all pages, and back to a page when dragged over one. - Engine: Added `page/highlightDropTarget` setting that highlights the page under a dragged element as a drop target. Defaults to `false`. - Engine: Added text decoration support with `setTextDecoration`, `getTextDecorations`, `toggleTextDecorationUnderline`, `toggleTextDecorationStrikethrough`, and `toggleTextDecorationOverline` APIs. - Line types: Underline, Strikethrough, Overline (combinable per text run). - Visual styles: Solid, Double, Dotted, Dashed, Wavy. - Underline-specific options: color override (`underlineColor`), thickness multiplier (`underlineThickness`), position offset (`underlineOffset`), and skip-ink (`skipInk`). - Overline and strikethrough always use the text color. - Decoration state is persisted with scene serialization. - Engine/Web: Added `block.setTextDecoration(id, config, from?, to?)`, `block.getTextDecorations(id, from?, to?)`, `block.toggleTextDecorationUnderline(id, from?, to?)`, `block.toggleTextDecorationStrikethrough(id, from?, to?)`, and `block.toggleTextDecorationOverline(id, from?, to?)`. New types `TextDecorationLine`, `TextDecorationStyle`, and `TextDecorationConfig` are exported from `@cesdk/engine`. - Engine/Android: Added `block.setTextDecoration(block, config, from, to)`, `block.getTextDecorations(block, from, to)`, `block.toggleTextDecorationUnderline(block, from, to)`, `block.toggleTextDecorationStrikethrough(block, from, to)`, and `block.toggleTextDecorationOverline(block, from, to)` with `TextDecorationLine`, `TextDecorationStyle`, and `TextDecorationConfig` data class. - Engine/Swift: Added `block.setTextDecoration(id, config:, in:)`, `block.getTextDecorations(id, in:)`, `block.toggleTextDecorationUnderline(id, in:)`, `block.toggleTextDecorationStrikethrough(id, in:)`, and `block.toggleTextDecorationOverline(id, in:)` with `TextDecorationLine` OptionSet, `TextDecorationStyle` enum, and `TextDecorationConfig` struct. - Engine: Add keyboard interaction behaviors for text list editing: automatic list creation on trigger sequences (`* `, `- `, `+ `, `1. `), Tab/Shift+Tab indentation (up to 5 levels), Enter to continue or exit a list, Shift+Enter to add a line break within a list item, and Backspace to decrease indent or remove list structure. - Engine/Android: During text editing Shift+Enter creates a new line instead of a new paragraph. - Engine: Added text list support with ordered and unordered list styles. New APIs: `setTextListStyle`, `getTextListStyle`, `setTextListLevel`, `getTextListLevel`, and `getTextParagraphIndices` allow per-paragraph list formatting with configurable nesting levels. Lists can be nested for a maximum of 5 levels. - Editor/Web: Added UI controls for text list styles in the advanced text inspector and as canvas menu actions. - Editor/Android: Added UI controls for text list styles in the format options sheet. - Editor/iOS: Added UI controls for text list styles in the text format options. - Engine: Added vector path editing mode with vertex add/delete, node selection, segment hover with midpoint handles, and control point manipulation - Engine: LineShape entities are now automatically converted to VectorPath with stroke on deserialization for proper stroke controls and vector editing - Engine: Bypassed SVG round-trip for conic-based shapes (circles/ellipses) to preserve smooth curves during vector edit conversion - Engine: Fixed frame-to-path dimension mismatch for inscribed shapes (polygons, stars) during vector conversion - Engine: Proportional image fill during vector path refit preserves Cover behavior and user's zoom/pan position - Engine/Web: Added vector edit APIs for node manipulation, bend mode, add/delete modes, and mirror mode - Editor/Web: Added vector edit UI with Move/Bend mode toggle, anchor point add/delete, mirror mode dropdown, and keyboard shortcuts (Backspace/Delete) - Editor/Web: Deferred vector path conversion — entering vector edit mode is non-destructive until first modification - Editor/Web: Added corner radius slider for vector_path shapes in shape inspector - Engine: Improved WAV audio import reliability and added support for the `audio/wave` MIME type. - Editor/Android: Fixed image placeholder tapping immediately opening the replace sheet when `dragStartCanSelect` is enabled. - Editor/Web: Fixed arrow key movement not working when more than 3 blocks were selected via Cmd/Ctrl+click - Engine: Fixed bold and italic toggle behavior so that toggling checks whether all runs in the selection are bold/italic. If all are, the style is removed; if any are not, the style is added to all. Previously, the toggle only checked the current editing style rather than the full selection range. - Editor/Web: Fixed bold and italic toggle buttons to show as active only when all characters in the selection are bold/italic, not when any single character is. - Engine: Fixed PDF export producing blank pages when the effective rendering size at the scene's DPI exceeds GPU texture limits. - Editor/Web: Fixed `web/fetchCredentials` setting not being respected on asset thumbnails and audio preview elements. When set to `'include'`, the `crossOrigin` attribute on media HTML elements is now correctly set to `'use-credentials'` instead of always using `'anonymous'`. - Editor/Flutter: Fixed an issue where effects applied to paused videos were not immediately visible when using TextureView. - Engine: Fixed GStreamer video export failures with HE-AAC and HE-AACv2 audio tracks, and resolved infinite loops during backward seeks. - Editor/iOS: Fixed image placeholder tapping immediately opening the replace sheet when `dragStartCanSelect` is enabled. - Editor/Web: Fixed keyboard shortcuts (e.g., Ctrl+B for bold, Ctrl+I for italic) not toggling off due to a stale closure in the shortcut handler. - Engine: Fixed loop animation duration not being clamped when reducing a block's duration. - Engine: Fixed a crash in MP4 demuxing when reading from a streaming resource with a negative offset. - Engine: Fixed a crash when entering text editing mode on text blocks that had `setTextColor` applied while containing template variables. - Engine: Fixed text shaping to automatically merge adjacent text runs with identical style properties, preserving cross-run kerning and ligatures. - Engine: Fixed text cursor placement when clicking in the gap between lines, which previously caused the selection to jump to the end of the text block. - Engine: Fixed incorrect video duration for iOS-trimmed videos where metadata tracks retained the original untrimmed duration. - Editor/Web: Added a Document Settings button to the navigation bar that opens a dedicated panel for page size, layout, and document properties. - Editor/Android: Fixed the "Scale" loop animation not being applied or adjustable. - Engine: Fixed `relocateResource()` not properly invalidating cached resource state after font URI changes, causing fonts to not be re-fetched from the new URL after scene load. Use `relocateResource()` to migrate font URIs (e.g. after a CDN change). Version 1.71.0 Released: March 19, 2026 -------------------------------------------------- **Breaking Changes** - Engine: Added async URI resolving via `setURIResolverAsync`, enabling asynchronous resolution (e.g. token fetching) and proper error reporting. - Engine: **breaking change** `getAbsoluteURI` is now async (callback-based) to support async resolvers. `getAbsoluteURI` must be used asynchronously on all platforms. - Engine/Web: `EditorAPI.getAbsoluteURI` now returns `Promise` and `EditorAPI.setURIResolverAsync` was added. `unstable_getURIResolver` is renamed to `getURIResolver`. - Engine/Swift + Engine/Android: `getAbsoluteURI` is now async (`async`/`suspend`) and async URI resolver APIs were added. - Engine/Swift: Export APIs now apply `onPreLoad` and support a `uriResolver` for configuring the background export worker before loading the exported scene. - Engine/Android: Export APIs support a `uriResolver` for configuring the background export worker before loading the exported scene. **Non Breaking Changes** - Editor/Web: Added component order API support for the video clip context menu. The clip context menu can now be fully customized per clip type (clip, overlay, caption) using `setComponentOrder`, `insertOrderComponent`, `updateOrderComponent`, and `removeOrderComponent` with the `ly.img.video.clip.menu` area. Custom actions can be added via the `ly.img.video.clip.menu.action` component. - Engine: Added `scene/extendedPanningArea` property to control whether the canvas workspace extends far beyond the content bounds. Defaults to `false`. - Editor/Web: Added free layout mode for pages with single-gesture drag, page snapping, auto-positioning of new, pasted, and duplicated pages, and persistent page positions across layout switches. - Editor/Web: Add granular child feature keys for fill, stroke, shadow, shape options, position, group, combine, scene layout, and page clipping, enabling fine-grained control over individual UI sub-controls. - Editor/Web: Fix `feature.enable`/`feature.disable` to propagate to child features via parent keys. - Editor/Web: Rename `ly.img.page.freeLayout` to `ly.img.scene.layout.free` with new parent `ly.img.scene.layout`. - Editor/Web: Add `ly.img.page.clipContent` feature key for clip content toggle. - Editor/Web: Remove duplicate `ly.img.audio.replace` feature key. Use `ly.img.replace.audio` instead. Rename inspector bar component to `ly.img.replace.audio.inspectorBar`. - Editor/Web: Improved position dropdown with grid layout and layer fixing dropdown - Editor/iOS: Added new inspector bar button `InspectorBar.Buttons.animation()` that opens the animations sheet in the video editor. - Editor/iOS: Added support for animations in the video editor. - Engine/Swift: Added `AssetProperty` type and `AssetAPI.applyAssetSourceProperty` for applying property changes to asset sources. - Engine: Added support for non-rectangular page shapes. Pages now support all shape types (ellipse, polygon, star, etc.) via the existing `setShape`/`getShape`/`createShape` APIs. Content clipping, selection outlines, bleed margins, and export all respect the page shape. - Engine: Added `page/marginScale` property for shape-based bleed margins. Set a value greater than 1.0 (e.g., 1.1 for 10% bleed) to scale the page shape outward, creating a uniform bleed area that follows the shape contour. Per-side margins (`page/margin/*`) continue to work for rectangular pages. - Engine: Added `page/allowShapeChange` setting (default: `true`). When set to `false`, `supportsShape` returns `false` for pages, preventing shape changes via the API. Non-page blocks are unaffected. - Engine: Added a new "Scale" loop animation with configurable start/end scale, start delay, hold duration, easing duration, and direction. - Engine: Added `text/useLigatures` property to control font ligature rendering on text blocks. Set to `false` to disable standard and contextual ligatures. Enabled by default. - Editor/Web: Added `timeline/trackVisibility` setting to control which timeline tracks are visible. Set to `'all'` (default) to show every track, or `'active'` to show only the track containing the active block. - Engine: Added variable font support. A single font file can now represent multiple weight and style variants. - Engine/Web: Added `createVariableFontCombinations()` utility to generate all `Font[]` entries for a variable font from its URI and supported axes. - Engine/Android: Fixed an `IndexOutOfBoundsException` in text input during IME composition. - Engine: Improved audio export performance significantly. - Engine: Added support for exporting audio from group blocks. - Engine: Fixed pages with emoji characters in their title being stuck in a loading state. - Editor/Flutter: Fixed an issue where effects applied to paused videos were not immediately visible when using TextureView. - Documentation: Updated all browser guide code examples to replace deprecated v1.69 APIs (`addDefaultAssetSources`, `addDemoAssetSources`) with the new plugin-based asset source approach. - Documentation: Removed obsolete get-started pages and deprecated asset source API references. - Documentation: Replaced deprecated `ly.img.template` asset source ID with `ly.img.templates` across guide examples. - Editor/Web: Migrated smoketest configurations from deprecated `callbacks` config to the actions API and Order API. - Plugins/Web: Updated plugin examples to use the new plugin-based asset sources and Order API instead of deprecated `callbacks` config and `addDefaultAssetSources`. - Editor/Web: Added support for multiple page sizes within one scene. Pages can now have individual dimensions when the `differentPageFormats` feature flag is enabled. The resize panel dynamically adjusts between per-page and all-pages mode based on selection. - Editor/Web: Fixed page jumps and canvas shifts when changing page sizes in free layout mode. - Editor/Android: Fixed the "Scale" loop animation not being applied or adjustable. - Engine: Fixed an issue where exporting pages with emoji in the page title could cause an endless export loop. - Engine: Fixed page positioning in free layout mode when changing aspect ratios via crop presets. Pages now maintain consistent spacing in both horizontal and vertical arrangements. Version 1.70.1 Released: March 13, 2026 -------------------------------------------------- **Breaking Changes** **Non Breaking Changes** - Documentation: Updated all browser guide code examples to replace deprecated v1.69 APIs (`addDefaultAssetSources`, `addDemoAssetSources`) with the new plugin-based asset source approach. - Documentation: Removed obsolete get-started pages and deprecated asset source API references. - Documentation: Replaced deprecated `ly.img.template` asset source ID with `ly.img.templates` across guide examples. - Editor/Web: Migrated smoketest configurations from deprecated `callbacks` config to the actions API and Order API. - Plugins/Web: Updated plugin examples to use the new plugin-based asset sources and Order API instead of deprecated `callbacks` config and `addDefaultAssetSources`. Version 1.70.0 Released: March 9, 2026 -------------------------------------------------- **Breaking Changes** - Engine/Editor: Page title labels no longer have a reserved space above pages but occupy the stack spacing. This allows for consistent spacing independent of page sizes with and without a page label. If a scene is created using `VerticalStack` the page title label can now be pushed into the previous page. The stack should have spacing in screenspace enabled (default) `api.block.setBool(stack, 'stack/spacingInScreenspace', true)` and spacing should be >= 16, e.g., `api.block.setFloat(stack, 'stack/spacing', 48)`. - Editor/Flutter: Removed `sceneBaseUri` and `assetBaseUri` and unified them into a single `baseUri` property. Assets are now loaded from `https://cdn.img.ly/packages/imgly/cesdk-flutter//assets` by default. To migrate, replace `EditorSettings(sceneBaseUri: ..., assetBaseUri: ...)` with `EditorSettings(baseUri: ...)`. - Editor/React Native: Removed `sceneBaseUri` and `assetBaseUri` and unified them into a single `baseUri` property. Assets are now loaded from `https://cdn.img.ly/packages/imgly/cesdk-react-native//assets` by default. To migrate, replace `sceneBaseUri` and `assetBaseUri` with a single `baseUri` in your `EditorSettings`. **Non Breaking Changes** - Editor/Android: Improved timeline thumbnails for still content (images, stickers, shapes) by displaying a single representative thumbnail instead of repeating images. - Editor/Android: Added text content display for text clips in the timeline, showing the actual text alongside the clip label. - Editor/Android: Added pinning behavior for clip labels, thumbnails, and text content - elements now stay visible when clips are scrolled off-screen. - Editor/Android: Added real audio waveform visualization for audio clips in the timeline, replacing the placeholder background. - Editor/Web: Added `colorPicker/colorMode` setting to restrict the color picker to a specific color mode (`'RGB'`, `'CMYK'`, or `'Any'`). When set to `'RGB'` or `'CMYK'`, elements using a different color mode show disabled inputs with a convert button. Newly created pages, blocks added from the asset library, and fill type switches automatically convert colors to match the configured color mode. - Editor/Android: Add minimum and maximum video duration constraints with timeline markers and export validation. - Editor/iOS: Add min/max video duration constraints with timeline indicators and export clamping. - Engine: Added async `editor.getFontMetrics(fontFileUri)` API that returns raw font metrics (ascender, descender, unitsPerEm, lineGap, capHeight, xHeight, underlineOffset, underlineSize, strikeoutOffset, strikeoutSize). See the [Edit Text guide](https://img.ly/docs/cesdk/js/text/edit-c5106b/) for details. - Engine/Swift: Added array overloads to `BlockAPI` export methods (`export`, `exportWithColorMask`, `exportVideo`, `exportVideoPublisher`, `exportAudio`, `exportAudioPublisher`) for memory-efficient batch exports. - Engine/Swift: Added `exportAudioPublisher` methods for Combine-based audio export with progress tracking. - Engine/Android: Added `List` overloads to `BlockApi` export methods (`export`, `exportWithColorMask`, `exportVideo`) for memory-efficient batch exports. - Engine: Added optional ZSTD compression for scene serialization via `CompressionOptions.format` and `CompressionOptions.level` parameters. Compression formats include `None` and `Zstd`, with compression levels `Fastest`, `Default`, and `Best`. - Engine/Web: Added `compression` option to `scene.saveToString()` and `scene.saveToArchive()` methods accepting `{ format: 'None' | 'Zstd', level: 'Fastest' | 'Default' | 'Best' }`. - Engine/Swift: Added `compressionFormat` and `compressionLevel` parameters to `scene.saveToString()` and `scene.saveToArchive()` methods. - Engine/Android: Added `compressionFormat` and `compressionLevel` parameters to `scene.saveToString()` and `scene.saveToArchive()` methods. - Editor/Android: Fixed an `IllegalArgumentException: EditorEventHandler is not initialized yet` crash caused by a swallowed `CancellationException` during engine startup. - Editor/Android: Fixed an `IllegalArgumentException: Activity is not initialized yet` crash when a configuration change occurs while the asset library is open. - Engine/Android: Fixed a crash in rotation gesture handling during multi-touch interactions. - Engine/Android: Fixed video export crash caused by a video decoder restart loop on some devices. - Engine/Web: Fixed occasional crash during archive import. - Engine/Android: Changed default `baseUri` of `addDefaultAssetSources` and `addDemoAssetSources` from legacy CDN paths to `https://cdn.img.ly/packages/imgly/cesdk-android//assets`. - Editor/Android: Changed `EngineConfiguration.defaultBaseUri` from `cesdk-engine` to `cesdk-android` CDN path. - Engine/Swift: Changed `Engine.assetBaseURL` from `https://cdn.img.ly/assets/v4` to `https://cdn.img.ly/packages/imgly/cesdk-swift//assets`. - Engine/Swift: Added `baseURL` parameter to `addDemoAssetSources` to allow customizing the asset source location. - Editor/iOS: Changed the default `baseURL` of `EngineSettings` from `cesdk-engine` to `cesdk-swift` CDN paths, aligning with `Engine.assetBaseURL`. - Camera/iOS: Fixed crashes during camera and microphone permission requests and video recording when using static framework linking with other Swift concurrency libraries (e.g., `expo-image-picker` v16+) in React Native apps using `useFrameworks: "static"`. - Editor/iOS: Fixed crashes during camera and microphone permission requests when using static framework linking with other Swift concurrency libraries (e.g., `expo-image-picker` v16+) in React Native apps using `useFrameworks: "static"`. - Editor/iOS: Fixed crashes when presenting the limited photo library picker on iOS 16 due to a system bug where the completion handler is called multiple times. - Editor/iOS: Fixed a crash when closing the editor with an empty text block selected. - Editor/Flutter: Fixed an issue where effects applied to paused videos were not immediately visible when using TextureView. - Engine: Fixed `getPages` crashing when no scene is loaded. It now returns an empty list instead. - Engine: Fixed page alignment in horizontal stack layouts if page titles are shown. Pages with different heights now align correctly at the top. - Engine: Added support for layouting rotated pages in horizontal and vertical stack layouts. - Engine: Fixed text selection direction being flipped when selecting across character-wrapped (mid-word) line breaks. - Engine: Fixed `scene.createFromImage` failing for URLs containing non-ASCII characters such as non-breaking spaces or other Unicode whitespace. - Engine/Web: Fixed video export getting stuck when the trim offset lands on a B-frame near a GOP boundary. - Editor/Android: Fixed a crash in the canvas menu when a deleted block's selection was passed to a new scope. Version 1.69.0 Released: February 23, 2026 -------------------------------------------------- **Breaking Changes** - Editor/Web: **BREAKING**: Updated asset source IDs to align with v5 naming conventions. The following asset source IDs have been renamed: - `ly.img.captionPresets` → `ly.img.caption.presets` - `ly.img.colors.defaultPalette` → `ly.img.color.palette` - `ly.img.vectorpath` → `ly.img.vector.shape` - `ly.img.textComponents` → `ly.img.text.components` The following asset sources have been merged: - `ly.img.filter.lut` + `ly.img.filter.duotone` → `ly.img.filter` - `ly.img.page.presets` + `ly.img.page.presets.video` → `ly.img.page.presets` - `ly.img.template` + `ly.img.video.template` → `ly.img.templates` (note: plural) **Migration Guide**: If you are using custom asset configurations or referencing these asset source IDs in your code, you will need to update them to use the new IDs. Translation keys in i18n files have also been updated to match the new asset source naming. CDN URLs have been updated from v4/demo-v2 to v5/demo-v3. - Editor/Web: **BREAKING** Removed `config.ui.elements.libraries.insert.entries` configuration option. All default asset libraries (Templates, Uploads, Images, Videos, Audio, Text, Shapes, Stickers) are now automatically available. If you were customizing asset library entries through configuration, use the `cesdk.ui.addAssetLibraryEntry()` and `cesdk.ui.updateAssetLibraryEntry()` APIs after SDK initialization instead. - Editor/Web: **BREAKING** Removed `config.ui.elements.libraries.replace.entries` configuration option. The replace panel continues to work as before, showing relevant asset libraries based on the selected content. If you need to customize which libraries appear in the replace panel, use the `cesdk.ui.setReplaceAssetLibraryEntries()` API after SDK initialization. - Editor/Web: **BREAKING** Removed `config.ui.elements.dock.groups` and `config.ui.elements.dock.defaultGroupId` configuration options. The dock must now be configured programmatically using the `cesdk.ui.setDockOrder()` API after SDK initialization. If you were using the default dock configuration, you'll need to explicitly configure it in your code. - Editor/Web: See our migration guide for step-by-step instructions and code examples. - Editor/Web: **BREAKING**: Introduced Starterkits - pre-configured editor templates that replace the previous built-in editor configuration. The editor now initializes with a blank canvas by default. **Key changes:** - The editor initializes a blank canvas with minimal configuration. Use one of our Starterkits to get started quickly based on your use case. - Asset sources can now be loaded using built-in plugins. See the [Asset Source Plugins guide](https://img.ly/docs/cesdk/js/plugins/asset-sources-a7f3b2/) for details. **Migration**: See the [Starterkits Migration Guide](https://img.ly/docs/cesdk/js/to-v1-69-193354/) for step-by-step instructions. - Editor/Web: **BREAKING**: Removed `ly.img.filter.lut` and `ly.img.filter.duotone` from the Feature API. Use `ly.img.filter` instead, which controls all filter types. - Editor/Web: Moved the placeholder settings panel from the canvas menu into the advanced inspector. The placeholder settings are now accessed via a "Design" / "Placeholder" toggle in the inspector panel when a block is selected, instead of a dedicated canvas action button. The `canvas-action-placeholder-settings` button has been removed. **Non Breaking Changes** - Editor/Web: Deprecated `cesdk.addDefaultAssetSources()` and `cesdk.addDemoAssetSources()` methods. These methods will continue to load v4 assets but will be removed in a future version. **Migration options:** - Use the new [Asset Source Plugins](https://img.ly/docs/cesdk/js/plugins/asset-sources-a7f3b2/) (recommended) - Use `engine.asset.addLocalAssetSourceFromJSONURI()` or `engine.asset.addLocalAssetSourceFromJSONString()` for custom asset sources - Editor/Android: Allow adjusting speed for audio clips (up to 3x). - Editor/Android: Add a clip speed inspector for video clips. - Engine: The `basePath` setting now also controls where the engine loads font fallback files and the emoji font from. Previously, these were always loaded from `https://cdn.img.ly/assets/v4`, making it impossible to fully self-host all CE.SDK assets. When `basePath` is not set, the engine continues to load these assets from the default CDN URL. If self-hosting, set `basePath` via `editor.setSettingString()` to point to your server where you've extracted the `fonts/` and `emoji/` directories from `imgly-assets.zip`. See the [Serve Assets guide](https://img.ly/docs/cesdk/js/serve-assets-b0827c/) for details. - Editor/Web: Added `truncateLabel` option to the Checkbox builder component, allowing long labels to be truncated with an ellipsis. - Editor/iOS: Add Clip Speed inspector sheet with speed and duration controls for video and audio clips (audio max 3x). - Editor/iOS: Improved timeline thumbnails for still content (images, stickers, shapes) by displaying a single representative thumbnail instead of repeating images. - Editor/iOS: Added text content display for text clips in the timeline, showing the actual text alongside the clip label. - Editor/iOS: Added pinning behavior for clip labels, thumbnails, and text content - elements now stay visible when clips are scrolled off-screen. - Editor/iOS: Fixed audio waveform stability during timeline trimming operations. - Engine: Added `Auto` option to `touch/pinchAction` setting. When enabled, pinch gestures will scale the selected element if the center point between the two fingers is inside the element's bounding box, otherwise the camera zooms. Supports rotation during scaling when `touch/rotateAction` is set to `Rotate`. - Editor/Web: Added ability to replace the shape of graphic blocks via a new "Change Shape" option in the shape inspector controls. - Engine: Added support for SVG files containing embedded images. - Editor/Web: The video timeline now automatically expands when foreground tracks are added and collapses when they are removed. Manual height adjustment via drag is supported and users can double-click the resize handle to return to automatic height mode. - Editor/Web: Added unified component order APIs (`setComponentOrder`, `getComponentOrder`, `insertOrderComponent`, `updateOrderComponent`, `removeOrderComponent`) providing a cleaner, type-safe interface for customizing UI component ordering across all areas. The 30 area-specific methods (e.g., `setDockOrder`, `insertInspectorBarOrderComponent`) are now deprecated in favor of the new unified API. - Editor/Web: Improved video compatibility UX on unsupported browsers. Added warning dialogs that automatically appear when users attempt to use video features on browsers lacking required codec support. Added `video.decode.checkSupport` and `video.encode.checkSupport` actions to trigger these dialogs programmatically, and silent utilities `cesdk.utils.supportsVideoDecode()` and `cesdk.utils.supportsVideoEncode()` for detection without UI. Affected platforms include Linux browsers and Firefox, which lack H.264/AAC encoder support. - Plugins/Web: Fixed `uploadMiddleware` URLs being ignored in image quick actions, causing `FILE_FETCH_FAILED` errors during export when using custom storage backends. - Plugins/Web: Image quick actions no longer automatically re-upload generated images. Users who need to persist AI-generated images should configure `uploadMiddleware` to handle storage. This aligns quick action behavior with the panel flow. - Editor/Android: Updated Coil to 2.6.0, fixing a crash in Lazy Lists when pausable composition during prefetch is enabled. - Engine: Fixed a use-after-free in async resource callbacks when loading an archive from an invalid URL. - Engine/Web: Fixed static noise when playing audio files with low sample rates (e.g., 16kHz AAC audio). - Engine: Prevent audio from other pages mixing into export when exporting from a specific page in a multi-page scene. - Engine: Allow export duration to exceed page duration, producing silence after page content ends instead of truncating or repeating audio. - Editor/Web: Fixed dock buttons not showing tooltips when `dock/hideLabels` is enabled. Labels now appear as tooltips when hidden. - Editor/Flutter: Fixed an issue where effects applied to paused videos were not immediately visible when using TextureView. - Engine: Fixed incorrect rotation of grouped page children when flipping via crop changes with `page.moveChildrenWhenCroppingFill` enabled (Photo Editor UI). - Editor/Web: Improved group behavior in video mode - children now preserve their original durations and time offsets when grouped, and groups can no longer be trimmed - Editor/Web: Enabled groups by default in video mode - Engine/Web: Fixed archival in NodeJS environments. - Editor/Web: Removed the old drop layer overlay that displayed "Drag File Here" text with an icon when dragging files onto the canvas. - Engine: Fixed an issue where calling `setTypeface` multiple times would accumulate fonts in the document typefaces instead of replacing them. This caused text blocks to become unusable (displaying 'x' characters) after several archive save/load cycles with font changes. - Editor/Web: Fixed the timeline drop zone indicator moving out of view when scrolling the timeline. - Engine: Fixed an issue where unused document typefaces were incorrectly included in saved archives, causing missing font file references when the archive was loaded. - Engine: Fixed video export getting stuck at 99% when `PendingState` was not properly cleared for video fills after the resource finished loading. - Editor/Web: Added a unified `scene.create` action (`cesdk.actions.run('scene.create', options?)`) that replaces the deprecated `cesdk.createDesignScene()` and `cesdk.createVideoScene()` methods. The new action provides a single entry point for scene creation across all modes with flexible page configuration. **Key features:** - Supports both Design and Video modes via the `mode` option (defaults to `'Design'`). - Pages can be configured with inline dimensions (`{ width, height, unit }`), asset source references (`{ sourceId, assetId }`), or full asset objects. - Multiple pages can be created at once via the `pages` array or via `page` + `pageCount`. - Automatically configures scene DPI (72 for Pixel, 300 for print units) and design units. **Migration:** ```js // Before await cesdk.createDesignScene(); await cesdk.createVideoScene(); // After await cesdk.actions.run('scene.create'); await cesdk.actions.run('scene.create', { mode: 'Video' }); // With page dimensions await cesdk.actions.run('scene.create', { page: { width: 1080, height: 1920, unit: 'Pixel' } }); // With page presets from an asset source await cesdk.actions.run('scene.create', { page: { sourceId: 'ly.img.page.presets', assetId: 'ly.img.page.presets.instagram.story' } }); ``` - Editor/Web: Deprecated `cesdk.createDesignScene()` and `cesdk.createVideoScene()`. Both methods continue to work but log a deprecation warning. Use `cesdk.actions.run('scene.create', ...)` instead. - Editor/Android: Fixed a crash when launching a media picker on devices without an app to handle the intent. - Editor/Android: Fixed an `IllegalStateException` crash that could occur after process restoration when an activity result contract was pending. - Docs: Remove React Native platform flag from guide pages that have no React Native content, preventing empty pages from being rendered - Engine: Fixed `basePath` setting not being serialized. - Editor/Web: Fixed dropdown menu items not filling width and having broken spacing between icons, labels, and keyboard shortcuts. - Engine: Added `clampTextBlockWidthToPageDimensionsDuringEditing` feature flag that wraps auto-sized text at page edges instead of overflowing during editing. Version 1.68.0 Released: February 6, 2026 -------------------------------------------------- **Breaking Changes** - Engine/Swift, Editor/Swift: Packages for Apple platforms are now built with Xcode 26.0.1 and Swift 6.2, which is the new minimum requirement for using them. **Non Breaking Changes** - Engine/Android: Bumped Kotlin to 1.9.10 and Coroutines to 1.7.3. - Engine: Updated entt from v3.13.1 to v3.16. - Engine: Removed unused `black_and_white_color_mixer` and `hsp_selective_adjustments` effects. These effects were never publicly documented or supported. Existing scenes containing these effects will still load correctly, but the effects will no longer be applied. - Engine: Removed the `features/hspSelectiveAdjustmentsEnabled` setting as it is no longer needed. - Editor/Android: Change demo assets' CDN path from https://cdn.img.ly/assets/demo/v2 to https://cdn.img.ly/assets/demo/v3 - Engine/Swift: Change demo assets' CDN path from https://cdn.img.ly/assets/demo/v2 to https://cdn.img.ly/assets/demo/v3 - Editor/Web: Change demo assets' CDN path from https://cdn.img.ly/assets/demo/v2 to https://cdn.img.ly/assets/demo/v3 - Engine: Enhanced the Grow animation with new corner-based direction options (`TopLeft`, `TopRight`, `BottomLeft`, `BottomRight`) and a `scaleFactor` property for controlling the initial/final scale. - Docs: Improved markdown versions of documentation for AI agents. Pages are now served directly as markdown when accessed with `Accept: text/markdown` header or via `.md` URLs. - Engine: Added `setMode` API to change the scene mode between `Design` and `Video` modes. - Plugins/Web: Plugin versions are now aligned with CE.SDK releases, starting from version 1.68.0. This is a versioning change only with no breaking API changes. - Editor/Android: Use custom FileProvider class to avoid manifest merger conflicts. - Editor/Web: Fixed the drop overlay being shown when dragging files onto the canvas even when no upload asset sources are available. - Editor/Flutter: Fixed an issue where effects applied to paused videos were not immediately visible when using TextureView. - Editor/iOS: Fixed editor cleanup being triggered incorrectly when pushing another screen on top of the editor in a navigation stack. The editor now correctly stays alive when covered by another view and only cleans up when truly dismissed (popped or closed). - Engine/iOS: Fixed text selection handles not being hidden when switching from text to transform edit mode on iOS 17+. - Engine: Prevent zoom auto-fit from producing negative or zero zoom levels. - Editor/Web: Added `showIndicator` option to `builder.Dropdown()` to control visibility of the expand indicator icons. - Engine: Fixed vector outline not resizing with shape during transform operations - Engine: Fixed video playback stopping unexpectedly when pressing play before videos finish loading. - Editor/Web: Showcases app now displays iOS/Android demos in an interactive carousel layout on desktop, allowing users to navigate between the emulator and screenshots with smooth animations and intuitive controls. - Plugins/Web: Fixed Runware NanoBanana2Pro API errors when using non-square aspect ratios (16:9, 9:16, 4:3, 3:4). The model requires specific dimension combinations that differ from the generic aspect ratio map. - Plugins/Web: Fixed Runware Seedream 4.0 API errors when using non-square aspect ratios. At 1K resolution only 1:1 is supported; now using 2K dimensions for all aspect ratios. - Plugins/Web: Improved Runware image generation reliability by switching from synchronous requests to async delivery with polling, avoiding timeouts on slower models. - Plugins/Web: Added resolution parameter to Runware NanoBanana2Pro image-to-image generation for automatic aspect ratio detection from reference images. - Editor/Android: Fixed media replacement not working when using camera capture - Engine: Added `Auto` option to horizontal text alignment that automatically aligns text based on the first logical run's script direction (right for RTL scripts, left for LTR scripts). - Engine: Added `block.getTextEffectiveHorizontalAlignment(block)` API to retrieve the resolved alignment when using `Auto` mode. - Editor/Web: Added "Match Language Direction" option to text alignment controls that automatically adjusts alignment based on the text's script direction. - Editor/iOS: Fixed LUT filter not being highlighted as selected on first click when the engine has not yet downloaded the LUT file. - Editor/Android: Fixed LUT filter not being highlighted as selected on first click when the engine has not yet downloaded the LUT file. - Renderer: Fixed buzzy or distorted audio in rendered videos when using open-source codecs on Linux. - Renderer: Fixed a crash during video rendering when source videos contain non-standard frame timing. - Engine: Fixed audio duration calculation for some MP4 files preventing a divide-by-zero crash when the videos are played. - Editor/iOS: Added "Match Language Direction" option to text alignment controls that automatically adjusts alignment based on the text's script direction. - Editor/iOS: Text blocks now use "Auto" alignment by default, automatically matching the text's script direction. - Editor/Android: Added "Match Language Direction" option to text alignment controls that automatically adjusts alignment based on the text's script direction. - Editor/Android: Text blocks now use "Auto" alignment by default, automatically matching the text's script direction. Version 1.67.0 Released: January 22, 2026 -------------------------------------------------- **Breaking Changes** **Non Breaking Changes** - Engine/Swift: Deprecated `addLocalAssetSourceFromJSONString` and `addLocalAssetSourceFromJSONURI` in favor of overloaded `addLocalAssetSourceFromJSON(_:)` methods that accept either `URL` or `String` parameters. - Engine: Added the `block.loadFromURL(url)` API, including Swift (`block.load(from: URL)`) and Kotlin (`block.loadFromURL(url)`) bindings, to make component creation and loading more easy. - Engine/Android: Fixed StrictMode violations. - Editor/iOS: Changed the default Apparel Editor navigation bar layout to place undo, redo, and preview mode buttons in the center (principal placement) instead of the trailing edge. This aligns with the Postcard Editor layout and fixes empty slots appearing in iOS 26's Liquid Glass navigation bar during preview mode. - Editor/Android: Changed the default Apparel Editor navigation bar layout to place undo, redo, and preview mode buttons in the center instead of the end. This aligns with the Postcard Editor layout for cross-platform consistency. - Engine/Swift: Fixed a potential crash due to a race condition during engine shutdown with active network requests. - Editor/Flutter: Fixed an issue where effects applied to paused videos were not immediately visible when using TextureView. - Camera/iOS: Fix Camera cleanup when dismissed programmatically in both SwiftUI and UIKit environments - the Camera view now properly invokes cleanup and onDismiss callback when dismissed via code (e.g., `isPresented = false` in SwiftUI or `dismiss(animated:)` in UIKit) rather than user interaction - Engine: Fixed missing scaling of outline and drop shadow properties while resizing elements. - Engine: Fixed an issue where block events triggered during event callbacks were not being delivered to subscribers. - Editor/RN: Auto-configure Compose Compiler based upon the Kotlin version specified in the Gradle extras. - Camera/RN: Auto-configure Compose Compiler based upon the Kotlin version specified in the Gradle extras. - Engine: Fixed deserialization of scenes exported before the `textEditModeTransformHandlesEnabled` setting was introduced. - Engine: Fixed certain malformed WAV files throwing an error on load. - Engine: Fix video source sets not being updated correctly. - Editor/Flutter: Fixed empty demo asset source sections in the asset library. Demo asset sources are now added by default. - Editor/RN: Fixed empty demo asset source sections in the asset library. Demo asset sources are now added by default. - Editor/Web: Fix zoom control incorrectly showing percentage instead of "Auto" when switching pages - Editor/iOS: Improved editor startup performance by loading font data on demand when the font selection UI is displayed instead of loading all font data at startup. - Editor/Web: Fixed a crash that occurred when clicking Undo after applying the Recolor or Green Screen effects. - Editor/iOS: Fixed filter selection not being displayed correctly in the UI after loading scene archive. - Editor/Android: Fixed filter selection not being displayed correctly in the UI after loading scene archive. - Renderer: Fix blank audio for some AAC-LC streams when decoded by the AV-Licensed codec pack - Editor/Android: Fixed IllegalArgumentException crash in inspector bar FillStroke and TextBackground buttons. - Editor/Android: Fixed scene restoration after process death - Renderer: Significantly reduced memory usage during video exports. - Editor/Android: Restrict system gallery sources to image/video MIME types to avoid surfacing audio files. - Renderer: Improved mp4 video support using open-source codecs. Version 1.66.1 Released: December 19, 2025 -------------------------------------------------- **Breaking Changes** **Non Breaking Changes** - Engine/Android: Fixed crash when archiving scene on Android 12 and below. - Engine: Fixed video export hanging when the audio track of a video starts later than the video. - Engine: Fixed audio delay as set in media-time not being handled during playback and export for videos. Version 1.66.0 Released: December 17, 2025 -------------------------------------------------- **Breaking Changes** - Editor/iOS: Photo Roll now defaults to privacy-friendly photos picker mode (no permissions required). The `PhotoRollAssetSource` is automatically registered. To enable full photo library access, override `loadAssetSources` in your `onCreate` callback and use `PhotoRollAssetSource(engine: engine, mode: .fullLibraryAccess)`. - Editor/iOS: The separate dock buttons `systemPhotoRoll()` and `imglyPhotoRoll()`, and the events `addFromSystemPhotoRoll()` and `addFromIMGLYPhotoRoll` are now deprecated in favor of the unified `photoRoll()` button and `addFromPhotoRoll()` event. **Non Breaking Changes** - Engine/Web: Added support for transparent WebM videos. - Engine: Fixed applying of scene archive assets in asset sources. - Editor/Flutter: Fixed an issue where effects applied to paused videos were not immediately visible when using TextureView. - Editor/Web: Fixed TypeScript compilation error when using `skipLibCheck: false`. - Editor/React-Native: Fixed iOS crash with New Architecture when optional parameters are undefined. - Camera/React-Native: Fixed iOS crash with New Architecture when optional settings are undefined. - Editor/Android: Fix camera crash by checking IMG.LY camera availability before initialization - Editor/Web: All media HTML elements now include a `crossorigin` HTML attribute, making them compatible with strict `Cross-Origin-Embedder-Policy` environments without the need to inject new headers into cross-origin asset sources. - Editor/Android: Fixed a crash when selecting Free crop in PhotoEditor. - Engine: Scene loading APIs now have an additional option to defer their completion callbacks until all resources are loaded - Engine/Android: Fixed ANR in `Engine.start()` during scene recovery. - Engine: Added RTL text support and bidirectional navigation for Text blocks with automatic direction detection. Version 1.65.0 Released: December 5, 2025 -------------------------------------------------- **Breaking Changes** **Non Breaking Changes** - Editor: Improved the visisbility of the page boundaries by adding a slight outline to it, can be changed with setting `pageHighlightColor`. - Editor/Web: Add `isSearchable` field to `AssetLibraryEntry` to indicate if an entry supports searching. The search field in asset library panels is now only shown when at least one currently rendered entry is searchable - Engine: Text blocks are now automatically deleted when exiting text edit mode if they are completely empty and the `lifecycle/destroy` scope permits deletion - Engine: Add `removeUndoStep` API to remove the last history state from the undo stack - Engine: Option+Backspace and Command+Backspace text editing shortcuts. - Engine: Add `getLayout` and `setLayout` APIs to dynamically change scene layouts after scene creation: supports transitions between Free, VerticalStack, HorizontalStack, and DepthStack layouts. When transitioning from stack to Free layout, page visual positions are preserved to maintain the existing layout appearance. - Engine: Added `setTextCursorRange` API to set text cursor position and selection range in text blocks. Supports cursor positioning (`from == to`), range selection (`from < to`), and select-all (`from: -1, to: -1`). The API validates inputs and returns errors for invalid ranges (e.g., `from > to`). If the range exceeds text length, it is automatically clamped to valid bounds. - Engine/Android: Fixed race condition where audio/video decoders could access freed AVContainer memory causing segmentation faults when replacing media with uploaded files. - Editor/Flutter: Improved error messaging when Kotlin Compose compiler plugin is unavailable, providing clearer diagnostics for build configuration issues - Editor/RN: Improved error messaging when Kotlin Compose compiler plugin is unavailable, providing clearer diagnostics for build configuration issues - Engine: Fixed look up of LUT filter effect from an archived scene. - Editor/Flutter: Fixed an issue where effects applied to paused videos were not immediately visible when using TextureView. - Engine: Add undo step support for keyboard-based block nudging. When moving blocks with arrow keys (or Shift+Arrow for faster movement), undo/redo now works correctly. - Engine: Fixed pixelation of image fills when adjustment effects are applied by selectively disabling mipmaps only for effects that manipulate UV coordinates - Engine: Added `allowTextOverhang` flag to `ExportOptions` to optionally include text glyph overhangs during export, preventing clipping of decorative fonts (defaults to false) - Engine: It is now possible to resize and rotate text blocks while editing text by enabling the new `textEditModeTransformHandlesEnabled` feature flag (off by default). - Engine: Scene loading APIs (`loadSceneFromString`, `loadSceneFromURL`, `loadSceneFromArchiveURL`) now defer their completion callbacks until layout is complete - Engine: Fixed `saveToArchive` crashing when scene resources contain template variables (e.g., `{{appearanceId}}`) in their URLs. Template variables are now resolved before archiving. - Engine: Text styling operations (color, font size, bold, italic, typeface, etc.) now apply to the entire text when called in edit mode with no selection. Previously, these operations only affected the cursor position style for future typed characters. - Engine: Scene loading APIs now have an additional option to defer their completion callbacks until all resources are loaded Version 1.64.0 Released: November 21, 2025 -------------------------------------------------- **New platform** Added a new platform for CE.SDK: the CE.SDK Renderer can be used on Linux servers inside a Docker container to render CE.SDK scene and archive files. GPU acceleration and video codecs are supported, allowing for simpler and faster server-side exporting workflows. **Breaking Changes** - Editor/Web: Number inputs and text inputs now require Enter key or blur to confirm changes by default. This prevents accidental changes while typing and provides a more intentional editing experience. - Engine: Video files that only contain unsupported audio tracks are now reported in error state when adding them instead of automatically removing all audio. This prevents exports with missing audio. Happens, for example, for videos with PCM audio. The audio needs to be removed manually to get these files loaded. - Editor/Android: Replaced the `EngineConfiguration.systemGallery` flag with the explicit `SystemGalleryPermission.setMode` opt-in, so projects enable the gallery inside their `onCreate` scope and can update it at runtime. - Editor/Android: Simplified the opt-in flow – `SystemGalleryPermission.setMode` controls the GalleryPermissionManager, and the editor registers the gallery asset sources inline, so no extra engine helpers are required. - Editor/Android: Cleared persisted gallery selections so gallery content is session based, matching the manual opt-in workflow. **Non Breaking Changes** - Editor/Web: Add canvas menu options customization support. The canvas menu "more options" button now supports customization via the builder API, allowing integrators to add, remove, or reorder menu items. Individual action components (flip horizontal, flip vertical, copy, paste) are now available as separate registered components for maximum flexibility. - Editor/iOS: Add support for custom crop sheets with automatic edit mode association through the new optional `associatedEditMode` parameter in `openSheet` event. - Editor/Web: Enhanced `AssetLibraryDockComponent` with optional `onClick`, `selected`, `disabled`, `size`, `variant`, and `colour` properties for greater customization and control over asset library dock buttons - Editor/iOS: Add `OnLoaded.Callback` to execute custom logic when the editor finishes loading - Editor/iOS: Add Force Crop feature via `EditorEvents.ApplyForceCrop` event using `context.eventHandler.send(.applyForceCrop(to:with:mode:))` - Editor/Web: Added 33 granular feature flags for placeholder settings control. Customers can now individually enable/disable placeholder options (opacity, blend mode, arrange, fill, stroke, text, appearance) using hierarchical feature IDs like `ly.img.placeholder.general.opacity` or disable entire sections with `ly.img.placeholder.general`. All features are enabled by default for backward compatibility. - Engine/Web: Add public zoom utility methods (`cesdk.utils.zoom.toLevel()`, `cesdk.utils.zoom.in()`, `cesdk.utils.zoom.out()`) for controlling canvas zoom programmatically - Editor/Web: Refactor internal zoom handling to use centralized actions API instead of facade methods - Editor/Web: Improve zoom behavior consistency across UI components (NavigationBar, Canvas shortcuts, ActionsStore) - Editor/Web: Add automatic page zoom with padding on scene load and page focus operations - Editor/Android: The `license` parameter in `EngineConfiguration` is now nullable. Pass `null` to run the SDK in evaluation mode with a watermark. - Editor/iOS: The `license` parameter in `EngineSettings` is now nullable. Pass `nil` to run the SDK in evaluation mode with a watermark. - Editor/Flutter: The `license` parameter in `EditorSettings` is now nullable. Pass `null` to run the SDK in evaluation mode with a watermark. - Editor/React Native: The `license` parameter in `EditorSettings` is now nullable. Pass `null` to run the SDK in evaluation mode with a watermark. - Camera/Android: The `license` parameter in `EngineConfiguration` is now nullable. Pass `null` to run the SDK in evaluation mode with a watermark. - Camera/iOS: The `license` parameter in `EngineSettings` is now nullable. Pass `nil` to run the SDK in evaluation mode with a watermark. - Camera/Flutter: The `license` parameter in `CameraSettings` is now nullable. Pass `null` to run the SDK in evaluation mode with a watermark. - Camera/React Native: The `license` parameter in `CameraSettings` is now nullable. Pass `null` to run the SDK in evaluation mode with a watermark. - Engine: Introduce Safe Area Insets API to automatically adjust viewport rendering for UI overlays (toolbars, navigation bars, etc.). Configure insets via `editor.setSafeAreaInsets()` to ensure scene content remains visible and properly framed within the effective viewport. All camera operations (zoom, pan, clamp) automatically respect these insets. Defaults to zero insets (no adjustment) - Editor/Web: Added comprehensive speed and duration controls to the inspector for video and audio blocks. Speed can be adjusted from 0.25x to 3x with quick-access presets (0.25x, 0.5x, 1.0x, 2.0x, 3.0x) or custom values. Duration can be set using time format (HH:MM:SS) for precise clip timing. - Editor/Web: Implemented automatic collision detection and track management. When a clip grows due to speed or duration changes and would overlap with adjacent clips, it automatically moves to a newly created track above its current position, preventing unwanted content overwriting. - Engine: Lifted the 3x playback-speed cap for video fills while keeping the existing limit for audio blocks. Videos running faster than 3x are muted automatically until their speed is lowered again, ensuring consistent audio behaviour across platforms. - Editor/Web: Add new loading animation for the editor. - Editor/Android: Fixed crashes and UI state issues when changing scenes at runtime by ensuring all components properly subscribe to active scene changes and reinitialize their state. - Editor/Flutter: Fixed an issue where effects applied to paused videos were not immediately visible when using TextureView. - Editor/iOS: Fixed `NavigationLabel` appearance on iOS 26 when compiled with Xcode 16. - Editor/iOS: Fixed keyboard not dismissing when interacting with pickers in the resize sheet on iOS 18+. - Editor/iOS: Fix potential localization lookup performance issue for large app bundles. - Engine/Web: Added support for VP9 videos with dynamic resolution. - Engine: Improved caption property synchronization performance by batching property changes and processing them in a single pass. - Engine/Android: Fixed race condition where audio/video decoders could access freed AVContainer memory causing segmentation faults when replacing media with uploaded files. - Editor/Android: Improved visual hierarchy of asset library "See All" button by using smaller text style and flexible width layout to accommodate longer translations Version 1.63.1 Released: November 13, 2025 -------------------------------------------------- **Breaking Changes** **Non Breaking Changes** - Updated asset archives with the full asset tree for self-hosting Version 1.63.0 Released: November 7, 2025 -------------------------------------------------- **Breaking Changes** - Editor/Web: Migrated document colors to use engine-native `ly.img.scene.colors` asset source, removing the frontend implementation entirely. The old `ly.img.colors.documentColors` source ID is no longer available. Custom integrations explicitly referencing the old source ID must update configurations to use `ly.img.scene.colors` instead. The migration is automatic for users relying on default configurations. - Editor/iOS: Add support for groups in video editor timeline - Editor/Android: Add support for groups in video editor timeline - Editor/iOS: Removed `DefaultAssetLibrary.textAndTextComponents` property. Use `DefaultAssetLibrary.text` instead, which now includes text components by default. - Editor/iOS: Removed `DefaultAssetLibrary.text(_: SceneMode?)` function. Use the `DefaultAssetLibrary.text` property instead. - Editor/Android: Removed `LibraryContent.TextAndTextComponents` property. Use `LibraryContent.Text` instead, which now includes text components by default. - Editor/Android: Removed `LibraryCategory.TextAndTextComponents` property. Use `LibraryCategory.Text` instead, which now includes text components by default. - Engine: The `createAudioFromVideo` and `createAudiosFromVideo` APIs now have an `AudioFromVideoOptions` parameter consisting of: - `keepTrimSettings` (default: `true`): When enabled, the extracted audio block will have the same duration as the video's effective (trimmed) duration. When disabled, the full audio track is extracted. - `muteOriginalVideo` (default: `false`): When enabled, the original video's audio track is muted after extraction. - Editor/Web: Add new "modern" UI scaling option **Non Breaking Changes** - Engine: Added `isCropAspectRatioLocked()` and `setCropAspectRatioLocked()` APIs to query and control crop aspect ratio locking. When enabled, crop handles maintain the current aspect ratio during resize operations. - Editor/Web: Improved crop panel aspect ratio lock button to control both text inputs and crop handles, with automatic synchronization when selecting crop presets (1:1, Free, etc.). - Editor/iOS: Added `assetSourceIDs` parameter to `SheetType.crop` allowing to specify asset sources for the crop sheet used by `InspectorBar.Buttons.crop` and `Dock.Buttons.crop` actions. - Editor/Web: Add native eye dropper tool for color sampling in color inspector and color preview boxes (Chrome, Edge, Opera) - Engine: Added `findAllMediaURIs` API that retrieves all valid media file URIs (http://, https://, file://) referenced by blocks in a scene - Engine/Web: Licenses are now optional. Without a license, a watermark is shown on exports. Licenses remove the watermark and are required for production use. - Editor/Web: Updated all examples to demonstrate the SDK works without a license. - Engine/Web: Added video support for Safari 26.0 and newer. - Engine: Added editor APIs to enable or disable selection for a block and query its current selection state via `setSelectionEnabled` and `isSelectionEnabled`. - Engine: Fixed possible empty audio samples in video exports if the audio decoder could not provide the decoded audio data in time. - Engine/Android: Fixed empty audio in exported videos for some video files especially on the Samsung Galaxy S24 and S25 devices. - Editor/Android: Fixed a jump of the video preview playback position if the video is paused and set to playing again. - Editor/iOS: Fixed crop rectangle not expanding back to full size after multiple rotations with fixed aspect ratios - Editor/Web: Fixed broken ligatures in ElsieSwashCaps font - Editor/Android: Fixed broken ligatures in ElsieSwashCaps font - Editor/iOS: Fixed broken ligatures in ElsieSwashCaps font - Editor: Improve selection frame handle visibility for text blocks with fixed frame widths by prioritizing right side handle over corner handles when overlapping - Editor/Web: Fixed video playback being stopped by selection changes when using the API to programmatically start playback. A 300ms grace period now allows initialization sequences to complete without interference while preserving the UI behavior of stopping playback when users manually click on clips. - Editor/Web: Add feature flag `ly.img.crop.panel.autoOpen` to control automatic opening of crop panel when entering crop edit mode (defaults to `true` for backward compatibility) - Editor/Web: Importing scenes from archives is now more memory efficient. Blob URLs are now used instead of Data URLs avoiding base64 encoding overhead. - fix(Engine): Fix Document Color showing multiple highlights (default and selected color) after changing text color - Engine/Web: Add `objectURL` return type to `utils.loadFile()` API for efficient blob URL creation without manual conversion. This avoids base64 encoding overhead when loading large archive files. - Editor/iOS: Fixed potential voiceover crashes - Editor/Web: Fix document color selection state not updating properly when selected element changes Version 1.62.1 Released: November 7, 2025 -------------------------------------------------- **Non Breaking Changes** - Engine: Fixed an issue where `export` calls failed with a `Scene contains disallowed schemes…` error. Version 1.62.0 Released: October 22, 2025 -------------------------------------------------- **Breaking Changes** - Editor/Web: Modernized editor theme with refined color palette, unified elevation surfaces, and improved visual hierarchy. - Engine/Android: Fixed crash on calling `AssetApi.fetchAsset`. - Engine/Android: Replaced `AssetSource.fetchAsset(id:)` with `AssetSource.fetchAsset(id:options:)` by adding `FetchAssetOptions` argument. The replaced function `AssetSource.fetchAsset(id:)` won't be called anymore. Asset sources that implemented this old optional method need to be updated. - Engine/iOS: Replaced `AssetSource.fetchAsset(id:)` with `AssetSource.fetchAsset(id:options:)` by adding `FetchAssetOptions` argument. The replaced function `AssetSource.fetchAsset(id:)` won't be called anymore. Asset sources that implemented this old optional method need to be updated. - Editor/Web: Clips added from the asset library will now no longer be automatically added to the background track when the timeline is still empty - Engine: The 'unstable_exportAudio' API was renamed to 'exportAudio' and is now able to export audio from scenes, pages, tracks, audio blocks and blocks with video fills. - Audio can be exported to either 'audio/wav' and 'audio/mp4': - When exporting audio from either an audio block or a block with a video fill, if the underlying resource is not compatible with the requested mime type, the audio is first transcoded. Otherwise, the audio data is returned immediately. - Added the flag 'skipEncoding' to the AudioExportOptions (disabled by default). Enabling it will allow getting the audio data from buffers directly while bypassing encoding (even if it is needed). **Non Breaking Changes** - Editor/Web: Added `cesdk.i18n.listLocales()` method to retrieve available locales with optional wildcard pattern matching. - Editor/Web: Added `cesdk.actions.list()` method to retrieve registered actions with optional wildcard pattern matching. - Editor/Web: Fixed an issue in `cesdk.i18n.getTranslations()` that was causing the method to not return all available locales when no locale was passed as an input. - Editor/Android: Added `Engine.addSystemGalleryAssetSources` to register device gallery sources (all, image, video) and wire them into the default configuration. - Editor/Android: Introduced `SystemGalleryAssetSource` and `SystemGalleryAssetSourceType` to expose MediaStore content, including permission-aware paging and limited-access support on Android 13+. - Editor/Android: Updated the default asset library and timeline flows to surface the system gallery with runtime permission handling and quick add options. - Editor/Android: Documented how to keep the legacy uploads flow by overriding the default `AssetLibrary`/timeline configuration, while keeping `Dock.Button.rememberSystemGallery()` as the default system gallery entry. - Engine/Web: Add optional `clipType` context parameter to `engine.asset.apply()` API for explicit placement control - Engine/Web: Stabilize middleware APIs by renaming `unstable_registerApplyAssetMiddleware` to `registerApplyMiddleware` and `unstable_registerApplyAssetToBlockMiddleware` to `registerApplyToBlockMiddleware` - Editor/Web: Move middleware registration from VideoTimeline component to engine facade for global initialization - Editor/Web: Update middleware to support conditional clip placement based on `clipType` context parameter - Editor/Web: Add `clipType` option to `AssetLibraryPanelPayload` for panel-level placement configuration - Editor/Web: Update `addClip` action to use `clipType: 'overlay'` for correct background track placement - Engine/Web: Deprecate `ui.colorLibraries`, `ui.typefaceLibraries`, `ui.pagePresetsLibraries`, and `ui.cropPresetsLibraries` configuration properties in favor of the new API-driven approach using `cesdk.ui.updateAssetLibraryEntry()`. The deprecated properties will be automatically migrated with console warnings. See migration guide in the deprecation warnings for details. - Engine/Web: Add `@deprecated` JSDoc marker to `ui.pageFormats` configuration property. This property is now deprecated in favor of using `cesdk.ui.updateAssetLibraryEntry('ly.img.pagePresets', { sourceIds: [...] })`. - Engine: Now supports evaluation mode without providing a license - Editor/Web: Remove loading indicator text from editor - Editor/Web: Deprecated `configuration.ui.elements.dock.iconSize` in favor of `cesdk.engine.editor.setSetting('dock/iconSize', 'normal' | 'large')`. - Editor/Web: Deprecated `configuration.ui.elements.dock.hideLabels`in favor of `cesdk.engine.editor.setSetting('dock/hideLabels', boolean)`. - Engine/Swift: Added a parameter `onDisallowedResourceScheme` to `SceneAPI.saveToString` and `BlockAPI.saveToString` to allow the opportunity to persist transient or temporary resources. - Editor/Web: Added rectangle selection for timeline clips by dragging. Click the timeline background to deselect all clips. - Editor/Web: Added middle mouse button drag scrolling for timeline navigation. - Engine/Web: Added `locale` parameter to `cesdk.asset.fetchAsset` to support fetching assets in different locales. The `locale` parameter is optional. - Editor/Web: Fixed an issue on the page resize panel that was causing the input values to not reflect properly. - Editor/Web: Fixed an issue on the page resize panel that was causing wrong updates to the scene values. - Engine: Fixed and issue where fonts for a given typeface were being wrongly evicted, causing archives to not have the necessary fonts files. - Editor/iOS: Fix potential localization lookup performance issue for large app bundles. - Editor/iOS: Fixed asset library navigation reset when using search button in nested navigation screens on iOS 26. - Editor/iOS: Fixed opening the crop sheet via double tap when another sheet is already open. - Editor/iOS: Fixed opening the replace sheet when tapping on placeholders while another sheet is open. - Engine/Web: Added `web/fetchCredentials` setting that accepts `"omit"`, `"same-origin"` (default), or `"include"` to control cookie behavior for cross-origin asset fetches - Editor/Web: Add `currentIds` parameter to `updateAssetLibraryEntry` sourceIds callback for easier extension of existing source IDs without manual `getAssetLibraryEntry` calls - Engine: Fixed `getAVResourceTotalDuration` on a video fill from an imported archive not returning the correct value. Version 1.61.0 Released: October 8, 2025 -------------------------------------------------- **Breaking Changes** - Engine: Added playback speed control for videos, GIFs and audio blocks via `UBQ::setPlaybackSpeed` and `UBQ::getPlaybackSpeed`. For non-looping blocks, durations are recalculated to reflect trim and speed changes. - Engine: _breaking change_ calling `setDuration` adjusts the trim as well for non looping blocks. **Non Breaking Changes** - Editor/Web: Deprecated `ui.elements.panels.settings` configuration option. Use `cesdk.feature.enable('ly.img.settings')` instead. - Editor/Web: Deprecated `ui.elements.panels.inspector` configuration option. Use `cesdk.feature.enable('ly.img.inspector')`, `cesdk.ui.setPanelPosition()`, and `cesdk.ui.setPanelFloating()` instead. - Editor/Web: Deprecated `ui.elements.panels.assetLibrary` configuration option. Use `cesdk.feature.enable('ly.img.assetLibrary')` and `cesdk.ui.setPanelFloating()` instead. - Editor/Web: Deprecated `ui.elements.dock.show` configuration option. Use `cesdk.feature.enable('ly.img.dock')` instead. - Editor/Web: Deprecated `ui.elements.libraries.insert.floating` configuration option. Use `cesdk.ui.setPanelFloating('ly.img.assetLibrary')` instead. - Editor/Web: Deprecated `ui.elements.libraries.replace.floating` configuration option. Use `cesdk.ui.setPanelFloating('ly.img.assetLibrary')` instead. - Editor/Web: Add animation previews - adding or updating an animation will now play a preview of the animation. - Engine/Web: Add support for font size units in `setTextFontSize` and `getTextFontSizes` methods, allowing pixel and point units with automatic conversion - Editor/Web: Add `cesdk.getBaseURL()` API to retrieve the baseURL from configuration - Editor/Web: Migrated all UI components from deprecated `ui.elements.blocks` configuration to Feature API patterns for improved maintainability and reactivity. - Editor/Web: Deprecated `ui.elements.blocks.opacity` configuration option. Use `cesdk.feature.enable('ly.img.opacity')` instead. - Editor/Web: Deprecated `ui.elements.blocks.transform` configuration option. Use `cesdk.feature.enable('ly.img.transform.position')`, `cesdk.feature.enable('ly.img.transform.size')`, `cesdk.feature.enable('ly.img.transform.rotation')`, and `cesdk.feature.enable('ly.img.transform.flip')` instead. - Editor/Web: Deprecated `ui.elements.blocks['//ly.img.ubq/text'].advanced` configuration option. Use `cesdk.feature.enable('ly.img.text.advanced')` instead. - Editor/Web: Deprecated `ui.elements.blocks['//ly.img.ubq/text'].color` configuration option. Use `cesdk.feature.enable('ly.img.fill')` instead. - Editor/Web: Deprecated `ui.elements.blocks.adjustments` configuration option. Use `cesdk.feature.enable('ly.img.adjustment')` instead. - Editor/Web: Deprecated `ui.elements.blocks.filters` configuration option. Use `cesdk.feature.enable('ly.img.filter')` instead. - Editor/Web: Deprecated `ui.elements.blocks.effects` configuration option. Use `cesdk.feature.enable('ly.img.effect')` instead. - Editor/Web: Deprecated `ui.elements.blocks.blur` configuration option. Use `cesdk.feature.enable('ly.img.blur')` instead. - Editor/Web: Deprecated `ui.elements.blocks.crop` configuration option. Use `cesdk.feature.enable('ly.img.crop')` instead. - Editor/Web: Deprecated `ui.elements.blocks['//ly.img.ubq/page'].format` configuration option. Use `cesdk.feature.enable('ly.img.page.resize')` instead. - Editor/Web: Deprecated `ui.elements.blocks['//ly.img.ubq/page'].manage` configuration option. Use `cesdk.feature.enable('ly.img.page.add')`, `cesdk.feature.enable('ly.img.page.move')`, and `cesdk.feature.enable('ly.img.duplicate')` instead. - Engine/Web: Add new stable `getView()` and `setView()` APIs for runtime view mode switching - Engine/Web: Deprecate experimental `unstable_getView()` API in favor of stable `getView()` - Engine/Web: Deprecate `configuration.ui.elements.view` configuration property in favor of `setView()` - Editor/Web: Added wildcard pattern matching support to `cesdk.ui.closePanel()`. - Engine/Android: Fixed a rare crash caused by a null pointer dereference during audio/video decoding. - Editor/Android: Fixed default settings not getting applied on restoration after process death. - Engine/iOS: The audio output device is now lazy initialized, i.e., only initialized when the first audio is played. The new `startAudioOutputDevice` editor API can be used to start the audio device if needed. - Engine/Android: The audio output device is now lazy initialized, i.e., only initialized when the first audio is played. The new `startAudioOutputDevice` editor API can be used to start the audio device if needed. - Editor/Android: Fixed unnecessary energy consumption while the app is paused with an open video scene due to the audio device not properly released. If the `setAppIsPaused` API is called, the audio output device will now be released. It will start again once a block is playing or if the new `startAudioOutputDevice` editor API is called to start it manually. - Engine: Added new editor API to manually start the audio device, which is useful for recording audio or video on iOS: `startAudioOutputDevice`. - Editor/Web: Add Command/Ctrl-click as redundancy for Shift-click to enable multi-selection of blocks. - Engine: fix invalid position when scaling a block with a width or height of zero. - Editor/Web: Placeholder permission labels and tooltips are now context-specific for text, audio, and graphic elements - Editor/Web: Text placeholders show "Allow to Replace Text" with tooltip explaining text content replacement - Editor/Web: Audio placeholders show "Allow to Replace Audio" with tooltip explaining audio track replacement - Editor/Web: Graphic placeholders show "Allow to Replace Fill Content" with tooltip explaining image/video/color replacement - Editor/Web: Added context-specific tooltips to "Act as Placeholder" checkboxes explaining visual appearance and click-to-replace behavior - Editor/Web: Enhanced TypeScript translation types to better support placeholder-specific tooltip translations - Editor/Web: Fixed TextInput component's onRelease callback to use the controlled value prop instead of DOM value on blur - Editor/Web: Fixed an issue that was causing the video timeline to not properly react to state changes - Engine/Web: Fixed an issue where `engine.scene.zoomToBlock` API would incorrectly animate when `animate: false` was passed. - Engine: Undoing and redoing changes no longer affects the playback position. - Editor/Web: Proper dispose of engine resources when using nodejs. - Editor/Web: Fixed an issue where gaps were preserved after dropping an element onto the background track. - Editor/Web: Fix keyboard shortcuts for caption panel time controls not working Version 1.60.0 Released: September 19, 2025 -------------------------------------------------- **Breaking Changes** - Editor/iOS: Renamed `DefaultAssetLibrary.uploadsLabel` to `DefaultAssetLibrary.photoRollLabel` for the new `PhotoRollAssetSource`. - Editor/iOS: Removed `DefaultAssetLibrary.Tab.uploads` and replaced it with `DefaultAssetLibrary.Tab.photoRoll` that uses the new `PhotoRollAssetSource`. Create a custom `AssetLibrary` to revert to the previous behavior based on `Engine.DemoAssetSource.imageUpload/videoUpload`. - Editor/iOS: Deprecated `Dock.Buttons.photoRoll` in favor of `Dock.Buttons.imglyPhotoRoll` that uses the new `PhotoRollAssetSource`. Use `Dock.Buttons.systemPhotoRoll` to use the previous behavior. - Editor/iOS: Deprecated `EditorEvent.addFromPhotoRoll` in favor of `EditorEvent.addFromIMGLYPhotoRoll` that uses the new `PhotoRollAssetSource`. Use `EditorEvent.addFromSystemPhotoRoll` to use the previous behavior. - Editor/iOS: Added `PhotoRollAssetSource` integration with Photo Library, and added it to the default `onCreate` callback. If you use the `DefaultAssetLibrary` with the new `DefaultAssetLibrary.Tab.photoRoll`, the new `Dock.Buttons.imglyPhotoRoll`, or the new `EditorEvent.addFromIMGLYPhotoRoll`, you also need to add it to your `onCreate` callback implementation. - Editor/iOS: Add `NSPhotoLibraryUsageDescription` to your `Info.plist` if you are using the new `PhotoRollAssetSource`, the `DefaultAssetLibrary` with the new `DefaultAssetLibrary.Tab.photoRoll`, the new `Dock.Buttons.imglyPhotoRoll`, or the new `EditorEvent.addFromIMGLYPhotoRoll`. - Editor/iOS: Added a generic constraint to `AssetPreview` for the empty view. - Editor/RN: Fixed Android compatibility issues with Expo 54. - Camera/RN: Fixed Android compatibility issues with Expo 54. **Non Breaking Changes** - Editor/Web: Add support for P3 color space and OKLCH color format to theming API. - Editor/Web: Added `disableTooltips` configuration option to asset library entries, allowing tooltips to be disabled for asset cards when set to `true` - Engine: Add support for Lottie animations on video fills. - Engine/Web: Added MKV (Matroska) video format support with extended codec compatibility including H.264, H.265/HEVC, AAC, MP3 audio codecs in addition to the existing VP8, VP9, AV1, and Opus support. - Editor/Web: Extended the page placeholder settings to support resizing. Similar to changing page size, the placeholder setting will reflect on all pages in the scene. - Editor/Web: Added 'system' theme option that automatically adapts to the user's OS theme preference - Editor/Web: Enhanced theme API to support function-based themes for dynamic theme selection. `cesdk.ui.setTheme()` now accepts 'light', 'dark', 'system', or a function that returns a theme - Editor/Web: Updated `cesdk.ui.getTheme()` to always return the resolved theme value ('light' or 'dark'), evaluating functions and system preferences as needed - Editor/Web: Deprecated `theme` configuration property. Use `cesdk.ui.setTheme()` and `cesdk.ui.getTheme()` methods instead for runtime theme management - Editor/Web: Fixed icon functions to always receive resolved theme values ('light' or 'dark'), never 'system' - Editor/Web: Enhanced scale API to match theme API pattern. `cesdk.ui.setScale()` now accepts 'normal', 'large', or a function that returns a scale based on viewport properties - Editor/Web: Updated `cesdk.ui.getScale()` to always return the resolved scale value ('normal' or 'large'), evaluating functions as needed - Editor/Web: Deprecated `ui.scale` configuration property. Use `cesdk.ui.setScale()` and `cesdk.ui.getScale()` methods instead for runtime scale management - Engine/Web: Refactored Settings interface architecture by moving settings interface to separate Settings.ts file for better code organization and maintainability. - Engine/Web: Consolidated internal setting types into main Settings interface using @internal JSDoc tags for improved API clarity. - Engine/Web: Improved type safety by deriving all setting types directly from the Settings interface, ensuring consistency across the API. - Engine/Web: Added unified `setSetting` and `getSetting` methods that automatically infer types based on the setting key, providing better TypeScript support and a simpler API. - Engine/Web: Added new TypeScript types `SettingsMap`, `SettingKey`, and `SettingValue` for type-safe settings access. - Engine/Web: Simplified deprecated type-specific settings methods (`setSettingBool`, `getSettingBool`, `setSettingInt`, `getSettingInt`, `setSettingFloat`, `getSettingFloat`, `setSettingString`, `getSettingString`, `setSettingColor`, `getSettingColor`, `setSettingEnum`, `getSettingEnum`) to use single function signatures while maintaining backward compatibility. - Engine/Web: Deprecated `SettingsColor` type export. Use the Color type directly instead. - Engine/Web: Updated all internal code to use the new unified settings API. - Engine/Web: Video captions are now enabled by default without requiring explicit feature flag configuration. - Documentation: Replaced C++ internal function references (`createRGBColor`, `createClear`, `createWhite`) with JavaScript object literals. - Documentation: Updated all code examples to use the new unified `setSetting` and `getSetting` API. - Documentation: Fixed license placeholder to use 'YOUR_CESDK_LICENSE_KEY' consistently. - Documentation: Cleaned up complex types in Settings tables to show just type names with parameters in dedicated sections. - Documentation: Added missing sections for `ColorMaskingSettings` and `GlobalScopes` complex types. - Editor/Web: Fix an issue where the navigation bar actions dropdown appeared empty after or broken updating the CE.SDK. - Editor/Web: Add comprehensive tooltips to all placeholder settings options to clarify what each permission allows users to do - Engine/Android: Fixed that the audio stream on a video export could have no proper end-of-stream signal. - Editor/Android: Fixed ClassCastException when opening FillStroke sheet for a block referencing CMYK color(s). - Engine: The `createAudioFromVideo` or `createAudiosFromVideo` APIs now use the correct sample rate and channel configuration from the track being extracted. - Engine/Web: Fixed crash when loading audio with empty chunks. - Engine: Added support of MP4 videos that do not report the duration for audio tracks. - Engine/Android: Fixed an issue where certain videos or audio files that could not be decoded were not always assigned an error state. - Engine: Added a new `split` block API that allows splitting a block into two based on a specified time and additional options: `attachToParent` (to choose if the new block will be attached to the same parent as the original), `createParentTrackIfNeeded` (to choose if the parent should be a track block) and `selectNewBlock` (to choose if the new block will be selected). - Editor/Web: Add new `cesdk.actions` API for centralized actions management with `register()`, `get()`, and `run()` methods to handle export, save, load, and other user interaction actions - Editor/Web: Add new `cesdk.utils` API providing default implementations for common operations including loading dialogs, export operations, file handling, and scene management - Editor/Web: Extend navigation bar order manipulation APIs to accept index-based matching for more flexible component positioning - Editor/Web: Deprecate navigation bar action configuration options (`ui.elements.navigation.action.save`, `ui.elements.navigation.action.export`, `ui.elements.navigation.action.share`, `ui.elements.navigation.action.download`, `ui.elements.navigation.action.load`, `ui.elements.navigation.action.back`, `ui.elements.navigation.action.close`) in favor of the Order API with automatic migration support - Editor/Web: Deprecate individual callback configurations in favor of the new centralized `cesdk.callbacks` API with automatic migration support. The deprecated callbacks and their new API equivalents are: - `callbacks.onBack` → Use Order API with `ly.img.back.navigationBar` component - `callbacks.onClose` → Use Order API with `ly.img.close.navigationBar` component - `callbacks.onSave` → `cesdk.callbacks.register('saveScene', callback)` - `callbacks.onShare` → `cesdk.callbacks.register('shareScene', callback)` - `callbacks.onExport` → `cesdk.callbacks.register('exportDesign', callback)` - `callbacks.onDownload` → `cesdk.callbacks.register('exportScene', callback)` - `callbacks.onLoad` → `cesdk.callbacks.register('importScene', callback)` - `callbacks.onLoadArchive` → `cesdk.callbacks.register('importScene', callback)` with `format: 'archive'` - `callbacks.onUpload` → `cesdk.callbacks.register('uploadFile', callback)` - `callbacks.onUnsupportedBrowser` → `cesdk.callbacks.register('onUnsupportedBrowser', callback)` - Engine/Web: Add `upload.supportedMimeTypes` setting to configure supported file types for upload operations - Editor/Web: Add Angular integration wrapper for Creative Editor SDK, available as `@cesdk/cesdk-js/angular` - Editor/Web: Add `addClip` action to enable customization of clip addition behavior in video timeline. Developers can now override the default behavior by registering their own `addClip` action. - Editor/Web: Deprecate `setBackgroundTrackAssetLibraryEntries()`, `getBackgroundTrackAssetLibraryEntries()` methods and `backgroundTrackLibraryEntries` configuration option in favor of the new `addClip` action approach. - Editor/iOS: Prepared the `NavigationBar` to correctly present items for Apple's new design system on iOS 26. - Editor/iOS: Hide the navigation bar while searching to avoid seeing it underneath through the search's glass background on iOS 26. - Editor/iOS: Fixed truncated "Cancel" button on Voiceover sheet for iOS 26. - Editor/Web: Fix custom locale translations not being applied when using setTranslations() with non-default locales. - Engine: During drag operations, blocks are no longer reparented to hidden pages. - Editor/Web: Fixed text asset labels not being translated properly. - Engine: Archive file size reduced by removing unnecessary font files from it. - Editor/iOS: Fixed audio playback after using system camera to record videos. - Engine/Web: Fix HDR HEVC video support. Version 1.59.2 Released: September 12, 2025 -------------------------------------------------- **Breaking Changes** **Non Breaking Changes** - Editor/Web: Fix custom locale translations not being applied when using setTranslations() with non-default locales. Version 1.59.1 Released: September 8, 2025 -------------------------------------------------- **Breaking Changes** **Non Breaking Changes** - Editor/Web: Fix an issue where the navigation bar actions dropdown appeared empty after or broken updating the CE.SDK. Version 1.59.0 Released: September 2, 2025 -------------------------------------------------- **Breaking Changes** - Editor/Web: Deprecated `locale` configuration option in favor of `cesdk.i18n.setLocale()` API. Set locale after instance creation instead of in config. - Editor/Web: Deprecated `i18n` configuration option in favor of `cesdk.i18n.setTranslations()` API. Set translations after instance creation instead of in config. - Editor/Web: Deprecated `cesdk.setTranslations()` in favor of `cesdk.i18n.setTranslations()`. The old method will be removed in a future version. - Editor/Android: Fixed `touch/pinchAction` value was not being restored correctly after exiting crop mode when it had been custom set. **Non Breaking Changes** - Engine/Web: Added support for async plugin initialization. The `addPlugin` method is now async and the `EnginePlugin.initialize` function can return a Promise. - Editor/Web: Added support for async plugin initialization. The `addPlugin` method is now async and the `EditorPlugin.initialize` function can return a Promise. - Editor/Web: Updated all plugin examples and documentation to use `await` with `addPlugin` calls. - Editor/Web: Enhanced `cesdk.i18n.setTranslations()` with type-safe translation keys - Editor/Web: Added `cesdk.i18n.getTranslations()` method to retrieve current translations for specified locales - Editor/Web: Pass CE.SDK instance through builder context. The `cesdk` parameter in `BuilderRenderFunctionContext` is now required (previously optional). Custom components and panels can now directly access the full CE.SDK API via the `cesdk` parameter. - Engine: In the default implementation for applying an asset to the scene, if the block fill is a raster image, we now ensure that it does not exceed it's maximum size. This prevents images from being scaled beyond their native resolution. - Engine/Web: Added WebM video format support for VP8, VP9, and AV1 video codecs and Opus audio codec (Vorbis is currently not supported). - Editor/Web: Add offical React and Vue wrappers for CE.SDK Web - Editor/Flutter: Fixed error in the photo editor on Android where the image could not be found. - Editor/Web: Added `cesdk.i18n.translate()` method for retrieving translations by key or array of keys - Engine: Fixed `loadFromArchiveURL` loading of scene archives with empty font files. - Engine: Added new APIs to extract audio from videos. `getAudioTrackCountFromVideo` retrieves the number of available audio tracks from a video, `getAudioInfoFromVideo` retrieves information from all the audio tracks in a video (such as language, track name, codec), `createAudioFromVideo` extracts a specific audio track from a video and creates an audio block with it and `createAudiosFromVideo` does the same as `createAudioFromVideo` but for all existing audio tracks in the video. - Editor/iOS: Fixed iOS crash during camera/mic permission prompt due to Swift 6 update. Version 1.58.0 Released: August 19, 2025 -------------------------------------------------- **Breaking Changes** - Engine: The `createFromImage` API now adds a fill directly to the page instead of creating a graphic block with the image fill. To replicate the previous behavior: - Get the page's fill after calling `createFromImage` - Create a graphic block with a rectangular shape - Set the fill of the graphic block to that of the page - Set the graphic block dimensions to match those of the page - Add the graphic block as a child of the page - Replace the page's fill with a solid color fill (white) **Non Breaking Changes** - Engine: Added `addLocalAssetSourceFromJSONURI` method to load asset sources from JSON URIs. Returns the asset source ID of the newly created source. - Engine: The setEditMode API now has an additional optional parameter that allows using another edit mode as a base. - Engine/Web: Added a parameter to `Scene.saveToString` and `Block.saveToString` to allow the opportunity to persist transient or temporary resources. - Engine: Introduced "page/selectWhenNoBlocksSelected" setting that automatically selects the current page when nothing else is currently selected. - Engine: Added support for self-contained scenes and archives by serializing additional scene state components including settings, variables, and spot colors. This ensures that exported scenes maintain their complete configuration when shared or loaded in different environments. - Engine: Added a `overrideEditorConfig` boolean flag to `loadSceneFromString`, `loadSceneFromURL` and `loadSceneFromArchiveURL` which controls whether to override the editor settings from the loaded scene. - Engine: Reject Infinity values in all setters. - Engine: Reject NaN values in `block.scale` and `block.setRotation`. - Engine/Web: Fixed issue when export produced a corrupted file. - Editor/Web: Fix filter library only loading if `ly.img.filter.duotone` and `ly.img.filter.lut` asset sources are being available. - Engine/iOS: Fix crash when typing characters with a diacritic mark. - Engine/Android: Fixed an issue where content with the `text/html` MIME type could not be pasted. - Editor/Web: Fix tooltip and keyboard issues on iOS Safari/WebKit - Editor/iOS: Fix crash when starting VoiceOver after Swift 6 update - Engine: Fix crash when generating thumbnails larger than the platform’s maximum texture size by clamping to the supported limit. - Engine: Added `clampThumbnailTextureSizes` setting to control this clamping behavior (default: `true`). - Editor/Web: Fix an issue where the editor is zoomed in on iOS devices when the input field is focused. - Editor/Web: Fix an issue where the AI plugin quick action button is disabled. Version 1.57.1 Released: August 15, 2025 -------------------------------------------------- **Breaking Changes** **Non Breaking Changes** - Editor/Web: Fix an issue where the AI plugin quick action button is disabled. - Engine: Fix crash when generating thumbnails larger than the platform’s maximum texture size by clamping to the supported limit. - Engine: Added `clampThumbnailTextureSizes` setting to control this clamping behavior (default: `true`). Version 1.57.0 Released: August 6, 2025 -------------------------------------------------- **Breaking Changes** - Engine/Swift: Updated the default value of `Engine.assetBaseURL` for `Engine.addDefaultAssetSources` to `https://cdn.img.ly/assets/v4`. - Editor/iOS: Updated `DefaultAssetLibrary.shapes` and `DefaultAssetLibrary.stickers` with new sections from v4 assets. - Engine/Android: Updated the default value of `baseUri` in `Engine.addDefaultAssetSources` to `https://cdn.img.ly/assets/v4`. - Editor/Android: Updated `LibraryContent.Shapes` and `LibraryContent.Stickers` with new sections from v4 assets. **Non Breaking Changes** - Editor/iOS: Allow Kingfisher 7 and 8 dependency. - Engine: From now on `addAssetToSource` does not allow adding multiple assets with the same ID in case of local asset sources. - Engine/Android: Improved memory usage when saving scene to archive. - Engine/Swift: Improved memory usage when saving scene to archive. - Editor/Web: Fix caption dock button visible after disabling caption feature via feature API - Engine/Swift: Fixed invalid blend mode values and added new blend modes (linearBurn, darkenColor, linearDodge, lightenColor, vividLight, linearLight, pinLight, hardMix, subtract, divide). - Camera/iOS: Close the camera if there is an issue loading the reaction video. - Engine: Fixed that min and max automatic font size were not scaled the same way as the font size. Could lead to auto-sized text being too small or too large after a change in design unit or DPI, e.g., during `applyTemplateFromString` if the current scene has a different design unit or DPI setting. - Engine: Add `asset.addFromJSONString` endpoint to streamline asset source creation. - Editor/Web: Introduced a new `builder.Component` component that allows rendering custom components that were registered using the `cesdk.ui.registerComponent`. - Editor/Web: Order UI APIs now support nested orders, allowing for the customization of nested components within the order. This pattern is currently only supported by `ly.img.actions.navigationBar` component with other components to follow soon. - Editor/Web: Added new order manipulation APIs for all UI areas: - **Dock**: `updateDockOrderComponent`, `removeDockOrderComponent`, `insertDockOrderComponent` - **Inspector Bar**: `updateInspectorBarOrderComponent`, `removeInspectorBarOrderComponent`, `insertInspectorBarOrderComponent` - **Canvas Menu**: `updateCanvasMenuOrderComponent`, `removeCanvasMenuOrderComponent`, `insertCanvasMenuOrderComponent` - **Navigation Bar**: `updateNavigationBarOrderComponent`, `removeNavigationBarOrderComponent`, `insertNavigationBarOrderComponent` - **Canvas Bar**: `updateCanvasBarOrderComponent`, `removeCanvasBarOrderComponent`, `insertCanvasBarOrderComponent` Version 1.56.0 Released: July 24, 2025 -------------------------------------------------- **Breaking Changes** - Editor/Web: Updated the `ly.img.vectorpath` asset library with new shapes. Those can be accessed by calling `cesdk.addDefaultAssetSources()`. - Engine: Added `fetchAsset` method to the `AssetSource` interface, allowing fetching of specific assets by ID. This is a breaking change for custom asset source implementations, which must now implement or handle the new `fetchAsset` method. - Engine: Added `findAssetSourceAssets` to the `UBQ` interface, allowing fetching of specific assets by ID. - Engine/Android: added `fetchAsset` method to the `AssetAPI` interface. AssetSource now includes an optional `fetchAsset` method. - Engine/Swift: added `fetchAsset` method to the `AssetAPI` interface. `AssetSource` protocol now includes an optional `fetchAsset` method. The `getAsset` method is removed. - Engine/Web: added `fetchAsset` method to the `AssetAPI` interface. `AssetSource` protocol now includes an optional `fetchAsset` method. - Editor/Android: Changed localization keys to a common structure prefixed with `ly_img_editor_` for easy customizations and added German translations. - Camera/Android: Changed localization keys to a common structure prefixed with `ly_img_camera_` for easy customizations and added German translations. - Editor/iOS: Changed `AssetLibrarySource`, `AssetLibraryGroup`, `AssetLibraryTab`, `AssetLibraryTabView`, `NavigationLabel`, `SheetType.libraryAdd`, and `.libraryReplace` initializers to accept a `LocalizedStringResource` as title instead of a `String`. - Editor/iOS: Changed localization keys to a common structure prefixed with `ly_img_editor_` for easy customizations and added German translations. - Camera/iOS: Changed localization keys to a common structure prefixed with `ly_img_camera_` for easy customizations and added German translations. - Editor/Web: Introduce a new set of sticker assets that can be added by calling `addDefaultAssetSources` - Editor/Web: Moved the default assets path from `https://cdn.img.ly/assets/v3` to `https://cdn.img.ly/assets/v4` - Editor/Swift: Packages for Apple platforms are now built with Xcode 16.4, which is the new minimum requirement for using them. - Engine/Swift: Packages for Apple platforms are now built with Xcode 16.4, which is the new minimum requirement for using them. **Non Breaking Changes** - Editor/Web: Introduced a new scale slider for captions, allowing users to adjust the size of the captions directly from the preset panel. - Editor/Web: Add feature API ids for crop related inputs - Editor/Android: Added new `onLoaded` callback to `EngineConfiguration` that is invoked when the editor is loaded and ready to be used. It is best to register callbacks, collect flows returned by the engine and apply editor settings in this callback. - Editor/Web: Adding force crop feature via `applyForceCrop` API - Editor/iOS: Added configurable onClose and onError callbacks. - Editor/iOS: Added a default confirmation alert when closing the editor. - Editor/React Native: Fixed unexpected behavior when opening camera inside the editor that caused the editor to close. - Editor/Flutter: Fixed unexpected behavior when opening camera inside the editor that caused the editor to close. - Editor/Web: Adjustments, effects, filters and blurs are now only enabled for images and videos by default. This can be easily changed by using the `cesdk.feature.enable` API. - Editor: When selecting a child with all arrangement scopes disabled, the group’s rotation and resize gizmos now appear instead — allowing to move, resize, and rotate the group directly (provided the group itself has the necessary arrangement scopes). - Editor/Web: The canvas menu will now be hidden by default during playback. If you wish to show it, you can use the feature predicate `ly.img.canvasMenu` to control its visibility. - Engine: Fixed potential crash during export if the device runs out of memory. - Editor/Web: Fixed an issue where the AnimationSubInspector was not positioned correctly. - Engine: Removed crop component from blocks when switching to a non-croppable fill. - Editor/Web: Fixed an issue where certain panels did not respond correctly to API calls. - Editor/RN: Fixed compatibility issues with RN 0.77.0+/Expo 53+ during compilation due to signature mismatch. - Engine/Android: Fixed not released GPU memory on repeated export, which could result in the device running out of memory. - Editor/iOS: Fixed incorrect scope check when determining if a block can be moved. Previously, the "editor/add" scope was checked instead of the correct "layer/move" scope when evaluating whether a block can be moved forward or backward. - Editor/Android: Fixed incorrect scope check when determining if a block can be moved. Previously, the "editor/add" scope was checked instead of the correct "layer/move" scope when evaluating whether a block can be moved forward or backward. - Engine: Enable all scopes for the current user role when loading blocks from serialized resources in defaultApplyAsset. - Engine/iOS: Fixed crashes during text editing. - Engine: fixed an issue where toggling mute while in "Playback" mode would set the edit mode to "Transform". Version 1.55.2 Released: July 18, 2025 -------------------------------------------------- **Breaking Changes** **Non Breaking Changes** - Engine/iOS: Fixed crashes during text editing. Version 1.55.1 Released: July 11, 2025 -------------------------------------------------- **Breaking Changes** **Non Breaking Changes** - Engine/Android: Fix native crash due to incorrect Proguard configuration. Version 1.55.0 Released: July 8, 2025 -------------------------------------------------- **Breaking Changes** - Engine/Android: Fixed `DesignUnit` raw values are not aligned with the C++ enum, resulting in incorrect mapping for `engine.scene.getDesignUnit()` and `engine.scene.setDesignUnit()`. **Non Breaking Changes** - Engine: Added ten new blend modes: Linear Burn, Linear Dodge, Lighten Color, Darken Color, Vivid Light, Linear Light, Pin Light, Hard Mix, Subtract and Divide. - Editor/Web: Updated `FeatureAPI.enable()` to automatically use default guards when no predicate is provided. - Editor/Web: Introduce a new `ly.img.dock` feature key to allow controlling the dock. - Editor/Web: Introduce a new `ly.img.inspectorBar` feature key to allow controlling the inspector bar. - Editor/Web: Introduce a new `ly.img.videoTimeline` feature key to allow controlling the video timeline. - Editor/Web: Introduce a new `ly.img.navigationBar` feature key to allow controlling the navigation bar. - Editor/Web: Introduce a new `ly.img.navigate.undoRedo` feature key to allow controlling the navigation bar undo and redo. - Editor/Web: Introduce a new `ly.img.navigate.zoom` feature key to allow controlling the navigation bar zoom. - Editor/Web: Introduce a new `ly.img.navigate.actions` feature key to allow controlling the navigation bar actions. - Editor: Added improved loading animations - Engine: Added new editor APIs to enable/disable and check the state of a block's highlight: `setHighlightingEnabled` and `hasHighlightingEnabled` - Editor/iOS: Fixed incorrect icon order for content fill mode in the crop sheet. - Engine: Fixed legacy handling in the `loadFromString` API which could cause a legacy scene to be corrupted, e.g., vector paths getting deleted. Only occurs if a legacy scene is a loaded while `loadFromString` is called. - Engine: Trim length and trim offset now have the expected behavior when using GIFs. - Engine: Fixed crash when using compositing keyboards. - Editor/Web: Improved the video playback performance. - Engine: Improved the video playback performance. - Editor/Web: Adding documentation on how to update and manage video caption presets - Engine: Added video captions support, see [documentation](https://img.ly/docs/cesdk/js/edit-video/add-captions-f67565/). Introduced two new block types: caption and captionTrack. Introduced a new API for creating captions from a file: createCaptionsFromURI. - Editor/Web: Added support for video captions in the editor, enabling the creation and management of captions for video projects. This feature includes functionalities for manually adding, editing, and removing captions, as well as importing captions from SRT and VTT files. Additionally, it supports managing various caption style assets. - Editor/Android: Added predefined crop presets to the crop sheet. - Editor/Android: Introduced multiple `SheetType.Crop.Mode` options that enable a combined crop and page resize sheet, supporting both manual adjustments and predefined size presets. Custom modes are configurable to define custom behavior. - Editor/Web: Fix editor crash when OPFS is not available in certain browser environments e.g. Firefox private mode. - Engine: Fixed that events on edit state changes were not being delivered if and only if they were issued within an event callback, e.g., by setting the playing state to false within a callback from another event. - Engine/Swift: Fixed crash when closing the editor while a text block is being edited. - Editor/iOS: Fixed zoom insets being wrong in the crop and resize sheet when resizing the page. - Engine/Swift: Fixed tone-mapping for certain HDR videos. - Editor/Web: Introduce a new `ly.img.canvasBar` feature key to allow controlling the canvas bar. - Editor/Web: Introduce a new `ly.img.canvasMenu` feature key to allow controlling the canvas menu. - Editor/Web: Introduce a new `ly.img.inspector` feature key to allow controlling the advanced inspector. - Engine: Add background gradient for text blocks when the block is in pending state. - Engine: Fix issue where the loading indicator overlay wasn't clipped to the outline of the block in case of rounded corners. - Engine: Allow thumbnail generation during playback to fix issue with voiceover graph not displaying. - Engine: Added automatic switching to transform mode when users modify components during video playback to improve UI reactivity. Version 1.54.1 Released: July 2, 2025 -------------------------------------------------- **Breaking Changes** **Non Breaking Changes** - Editor/iOS: Fixed zoom insets being wrong in the crop and resize sheet when resizing the page. - Engine/Swift: Fixed crash when closing the editor while a text block is being edited. Version 1.54.0 Released: June 26, 2025 -------------------------------------------------- **Breaking Changes** - Editor/Web: Removed the "more" options menu from the inspector bar. - Editor/Web: Removed the `ly.img.options` feature key that was used to enable the "more" options menu in the inspector bar. - Engine/Swift: Fixed `DesignUnit` raw values not being aligned with the C++ enum. - Engine/Swift: Updated default asset sources configuration to include new crop and size preset sources. The sources ly.img.crop.presets and ly.img.page.presets are now part of the default assets served through the CDN. You must update your CDN configuration to include these new sources. **Non Breaking Changes** - Engine: Added new `getTextVisibleLineContent` API to retrieve the text content of the visible lines in text blocks. - Editor/Android: Added "Select Group" button in canvas menu for design blocks that are in a group design block. - Engine: Skia is now used to parse SVG data instead of NanoSVG - Editor/Web: Introduced new feature keys to configure the transform controls via the feature API. - Editor/Web: Introduced the following UX improvements: - Centered the controls in the inspector bar. - Moved the stroke settings into a dropdown in the inspector bar. - Introduced the text style dropdown in the inspector bar. - Introduced the advanced text controls in the inspector bar. - Introduced a new dropdown in the canvas bar that contains the following actions: - Copy - Paste - Flip Horizontally - Flip Vertically - Moved the inspector toggle into the top level inspector. - Camera/Android: Fixed an issue where the permission request flow could break under certain conditions when the same permission was being requested elsewhere in the app. - Engine: The dashed outline of groups are now independent of zoom level. - Engine/Web: Deprecated the old export API signatures in favor of a new improved signatures to follow better API design practices. The following changes were made: - Simplified the `exportVideo`, `export` and `exportWithColorMask` APIs by making all parameters optional except for the page handle - Moved all optional parameters (including `mimeType`) into a single `options` object, which removes the requirement to pass `undefined` or empty objects for unused parameters - Removed enum usage for mime types in favor of string literals to align with the rest of our type definitions - These changes make the APIs more intuitive and easier to use, especially when only specific options need to be configured ```typescript // Before engine.block.export(page, MimeType.Jpeg, { jpegQuality: 0.8, targetWidth: 1080, targetHeight: 1080 }); engine.block.export(page, undefined, { targetWidth: 1080, targetHeight: 1080 }); // After engine.block.export(page, { mimeType: 'image/jpeg', jpegQuality: 0.8, targetWidth: 1080, targetHeight: 1080 }); engine.block.export(page, { targetWidth: 1080, targetHeight: 1080 }); // Before engine.block.exportWithColorMask(page, MimeType.Png, 0.5, 0, 0, { pngCompressionLevel: 6 }); engine.block.exportWithColorMask(page, undefined, 0.5, 0, 0); // After engine.block.exportWithColorMask(page, 0.5, 0, 0, { mimeType: 'image/png', pngCompressionLevel: 6 }); engine.block.exportWithColorMask(page, 0.5, 0, 0); // Before engine.block.exportVideo( page, MimeType.Mp4, ( numberOfRenderedFrames, numberOfEncodedFrames, totalNumberOfFrames: number ) => { console.log( `Rendered ${numberOfRenderedFrames} frames, encoded ${numberOfEncodedFrames} frames out of ${totalNumberOfFrames}` ); }, { targetWidth: 1080, targetHeight: 1080 } ); engine.block.exportVideo(page, undefined, undefined, { targetWidth: 1080, targetHeight: 1080 }); // After engine.block.exportVideo(page, { mimeType: 'video/mp4', onProgress: ( numberOfRenderedFrames, numberOfEncodedFrames, totalNumberOfFrames: number ) => { console.log( `Rendered ${numberOfRenderedFrames} frames, encoded ${numberOfEncodedFrames} frames out of ${totalNumberOfFrames}` ); }, targetWidth: 1080, targetHeight: 1080 }); engine.block.exportVideo(page, { targetWidth: 1080, targetHeight: 1080 }); ``` - Engine/iOS: Fixed export not continuing after app was returned from the background. - Engine: Use magic bytes primarily for determining the MIME type of a file during import. - Editor/iOS: Added a new dock button to open the page resize sheet, supporting both manual adjustments and predefined size presets. - Editor/iOS: Added predefined crop presets to the crop sheet. - Editor/iOS: Changed default of `SheetType.crop.style` to `SheetStyle/only(detent:)`. - Editor/iOS: Fixed OS system photo camera permission handling to prevent black screen. - Editor/iOS: Fixed sheet dismissal behavior to ensure the sheet closes correctly when the event is triggered. Version 1.53.0 Released: June 12, 2025 -------------------------------------------------- **Breaking Changes** **Non Breaking Changes** - Editor/Web: Added new `pagePresetLibraries` configuration that enables defining asset sources with transform presets. In addition,`pagePresetLibraries` configuration replaces `pageFormats`. Finally, format selection is now shown in its own panel instead of the document inspector. - Editor/Web: Added new `cropPresetLibraries` configuration that enables defining asset sources with transform presets. These presets will be shown inside the crop panel. - Engine: The duplicate API now has an additional parameter that allows choosing if the new block will be attached to the same parent as the original (defaults to true). - Editor/iOS: Added new SwiftUI view modifiers: `.imgly.canvasMenuItems` and `.imgly.modifyCanvasMenuItems`, which allow customization of the canvas menu (a list of buttons that appears next to the selected design block). - Editor/iOS: Added and updated custom SF Symbols in the iOS editor. - Engine: new transform presets assets can be applied to graphics blocks and pages with `defaultApplyAssetToBlock`. These presets can set dimensions, enforce an aspect ratio or allow free resizing. - Engine/Android: Fixed `AssetSource` references not being released when the engine is stopped. This allows `AssetSource` instances to be garbage collected. - Engine: Fixed a potential crash in `unstable_enableCameraZoomClamping` if the setting `pageCarouselEnabled` is used. - Engine: Remove `PageDurationSourceTag` from page when using the `createSceneFromVideo` API. This fixes the issue of the timeline duration not updating correctly. - Editor/Android: Fixed the default value of demo asset sources `baseUri`. - Editor/iOS: Added spacing between dock and inspector bar items. - Editor/iOS: Configured dock and inspector bar items to have dynamic width, enforcing a minimum width. - Engine/iOS: Render cursor while text field is not tapped. - Editor/RN: Fix Compose Compiler plugin not getting applied correctly for Kotlin 2.0.0+. - Engine: Enable `setWidth` and `setHeight` on groups. Setting a dimension on a group will modify the other dimension as well according to the aspect ratio of the group. - Editor/Web: Fixed an issue where toggling fonts bold was buggy. You had to click the bold button twice to turn a font family bold after selecting a new font family. - Engine: The property `image/fill/imageFileURI` is now undeprecated. - Engine: Improved HDR color information detection on HEVC videos. - Editor/Web: For registered components, pass payload from order to all components not just Dock & NavigationBar - Editor/Web: Render the text content of a text clip instead of the thumbnail. - Engine/Swift: Fix issue when the audio did not stop when the app went to the background. - Editor/iOS: Fixed potential memory leaks after closing a sheet, e.g., when dismissing the asset library. - Editor/Android: Fixed an issue where internal debug dependencies were unintentionally included in release artifacts. - Editor/Web: Updated video timeline thumbnail display. - Editor/Web: Fix an issue where the `onUnsupportedBrowser` callback was not being triggered when the video editor is opened in an unsupported browser. - Editor/Web: Introduce a new `ly.img.page.resize` feature key to allow controlling the page resize feature in the editor. - Engine: Fixed an issue with the `setTypeface` block API where italic and bold toggling would only work in the second try after switching the typeface. Occurred when switching from a typeface with active bold or italic to one that does not support it and then back. - Editor/Android: Added translation keys for known subfamilies from ly.img.typeface. Version 1.52.0 Released: May 29, 2025 -------------------------------------------------- **Breaking Changes** **Non Breaking Changes** - Editor/Android: Fixed an issue where the crop reset button remained disabled even when it should have been enabled. - Engine/Web: Fixed that asset labels were not passed to a custom `addAsset` function in custom asset sources. - Engine: `supportsBlendMode` returns false for the following block types: Stack, Audio, Metrics, Track, CaptionTrack - Editor/RN: Added proper handling for export errors on Android. - Editor/Flutter: Added proper handling for export errors on Android. - Editor/iOS: Fixed attribution sheet presentation looping when opening the bottom most images. - Engine: Changed the `block.setTextColor` API to also update the fill color if the color is changed on the whole text and not only the text run. This prevents the fill color from being different than expected. - Engine: Changed the `block.setTextFontSize` API to also update the font size property if the font size is changed on the whole text and not only the text run. This prevents the font size property from being different than expected. - Editor/Android: For scenes without a stack, the toggle pages button is no longer visible by default in the DesignEditor. - Editor/Web: Fixed an issue where the upload button on the panel would get squished when an image with small height is uploaded and the size gets very longer when a bigger image is uploaded. - Editor/Web: Export the types `FeaturePredicate` and `FeaturePredicateContext` used by the Feature API - Editor/iOS: For scenes without a stack, the toggle pages button is no longer visible by default in the design editor. - Editor/Web: Fix an issue where the background color inspector is not visible in some cases. Version 1.51.0 Released: May 19, 2025 -------------------------------------------------- **Breaking Changes** - Editor/iOS: Added new SwiftUI view modifiers: `.imgly.navigationBarItems` and `.imgly.modifyNavigationBarItems`, which allow customization of the navigation bar (a list of items shown at the top of the editor). With this change, the button used to dismiss the editor should now always be managed through these new APIs, rather than being injected externally via a regular `.toolbar` modifier. The `BackButtonHiddenKey` preference key, previously used to control the visibility of the back button, has been marked as unavailable in favor of the new `NavigationBar.Buttons.closeEditor` button. - Editor: Add new 'Font Combinations' asset source to our demo assets. It's enabled by default in our static design editors. To disable, exclude `ly.img.textComponents` from `addDemoAssetSources`. Font combinations make use of groups and have limited editing experiences in our video-based editors for now and are therefore disabled there by default. When using these combinations, be aware that the resulting blocks reference font resources in our CDN. These will be replaced with archives in a future release to further decouple resources. - Editor/iOS: Fixed scene mode not being available in `AssetLibrary` by removing `@Environment(\.imglyAssetLibrarySceneMode)` from the public API. Use `AssetLibrarySceneModeReader` instead. **Non Breaking Changes** - Engine/Android: Added new asset API `AssetApi.applyAssetSourceProperty` that applies `AssetProperty` to the `Asset`. - Editor/Android: Added new inspector bar button `InspectorBar.Button.rememberAnimations` that opens the animations sheet in the video editor. - Editor/Android: Added support for animations in the video editor. - Editor/Android: Added new `Background` option to the inspector bar that controls the background of text design blocks. - Engine: Fixed the playback control APIs to check if the given block is valid. - Engine: When setting the `none` animation, and undo set is now added. - Camera/Android: Enable video and preview stabilization if supported. - Editor/Web: Fix an issue where the active card background was not visible on hover. - Engine: When saving block hierarchies to archives, all referenced resources are now added to the archive. - Editor/Web: Fixed an issue where setting the css custom property '--ubq-typography-font_family' did not work when set under '.ubq-public' class - Editor/iOS: Fixed the initial scroll position in the timeline on iOS 18. - Editor/iOS: Fixed scrollbar behavior in the timeline on iOS 18. - Editor/iOS: Fixed the initial scroll position in the voiceover sheet on iOS 18. - Editor/iOS: Fix loading error in the Design Editor for scenes without a stack. - Editor: Allow resizing and moving of elements with mouse or gestures that have a percent unit in x-position, y-position, width, or height. - Editor/Web: Improved the naming of the animation direction values of block animations in the video editor. - Engine: When loading individual blocks while no scene is present, design unit information will now be retained and used when saving those blocks again. - Engine: When loading blocks, design unit conversion is now applied to the entire loaded hierarchy, not just its roots. - Editor/Web: Fix an issue where disabling the text color feature via configuration will also affect the fill of other block types. - Editor/Android: Resolved an issue in the Photo Editor where the inspector bar briefly remained visible and interactive after closing the crop sheet. The inspector bar now hides immediately with the crop sheet. - Editor/iOS: Fixed text alignment options to not depend on `layer/resize` scope. - Editor/iOS: Fixed an issue where scrolling the asset library inadvertently tapped an asset on iOS 18.1+. Version 1.50.2 Released: May 15, 2025 -------------------------------------------------- **Breaking Changes** **Non Breaking Changes** - Camera/Android: Enable video and preview stabilization if supported. Version 1.50.1 Released: May 9, 2025 -------------------------------------------------- **Breaking Changes** **Non Breaking Changes** - Fix(Android): Fix asset property access crash. Version 1.50.0 Released: April 29, 2025 -------------------------------------------------- **Breaking Changes** **Non Breaking Changes** - Editor/RN: Added option to change the `kotlinCompilerExtensionVersion`. - Editor/RN: Added support for Kotlin v2.0.0+. - Engine: Animations are no longer active during crop or text editing to allow more precise editing. - Editor/Flutter: Added option to change the `kotlinCompilerExtensionVersion`. - Editor/Flutter: Added support for Kotlin v2.0.0+. - Engine: Animations are now only applied in design scenes (i.e. if the scene's mode is `Design` and not `Video`). - Engine: forceLoadAVResource no longer sets an error state when a block has an empty URI. Editor/RN: Fixed a crash on Android when exporting scenes containing `content://` Uri(s). The SDK now allows these Uri(s) by default. Updated `EditorResult` documentation to clarify that such Uri(s) may not be reusable and recommend handling them using `EngineConfiguration.onUpload` and `engine.editor.setUriResolver`. - Editor/RN: Fixed thumbnails not being encoded correctly. - Editor/Flutter: Fixed thumbnails not being encoded correctly. - Editor/Flutter: Fixed thumbnail of postcard editor exports would be blank. - Editor/RN: Fixed thumbnail of postcard editor exports would be blank. - Engine: Fixed a crash that could occur when the `useSystemFontFallback` setting was enabled while continuously changing a text block's font. - Engine/Web: Fixed HDR video display. - Editor/Web: Improved selection frame behavior by preventing frame visibility during playback mode - Engine: Fixed stuttering on exported videos. - Engine: Fixed stutters and repeated frames in exported videos. - Camera/iOS: Set `preferredVideoStabilizationMode` as `standard` to improve recording's stabilization. Version 1.49.1 Released: April 21, 2025 -------------------------------------------------- **Breaking Changes** - Editor/Web: Revert breaking `TextArea` height introduced in 1.49.0 **Non Breaking Changes** - Editor/Web: Fixed the editor crashing when being loaded in 32bit browsers. Version 1.49.0 Released: April 16, 2025 -------------------------------------------------- **Breaking Changes** - Engine: All video fill blocks and audio blocks now have playback looping disabled by default. Loading a scene created with the editor version 1.48 and earlier containing looping video fill and audio blocks will disable looping of these blocks and will add a metadata with the key `ly.img.default-looping-disabled` to these blocks. To re-enable looping on blocks intended to loop, use `setLooping`. The metadata can be safely removed. - Engine/Node.js: The minimum required Node.js version is now 20. **Non Breaking Changes** **Features** - Editor/Web: A new Ken Burns animation is available as an In and Out animation. - Editor/iOS: Added a new Inspector Bar Button that opens a sheet for customizing text background color, padding, and corner radius. - Editor/Android: Added an export error dialog for design scenes to handle errors gracefully and prevent crashes during the export process. - Editor: We’ve introduced GIF support in our video editor, GIF files are now added as video clips instead of images when applied to a video scene. - Engine: `defaultApplyAsset` recognizes the key-value pair `"looping"`/`"true"` in asset metadata and sets the `"playback/looping"` property to `true` for audio blocks and video fill blocks. **UI/UX** - Editor/Web: Added separate controls for vertical and horizontal padding in text background settings, providing more precise control over text appearance. - Editor/Web: Tooltips will now appear faster when hovering over the controls in the editor. - Editor/Web: Fixed keyboard navigation issues in the TypefaceSelect component including dropdown not closing on Enter and search field not clearing properly. **Fixes** - Engine: Fixed the crop zoom animation not to distort the fill when the fill mode is `Fit`. - Engine: Fixed potential crash when replacing a GIF. - Editor/Android: Fixed an issue where a gradient color stop would not appear as selected if it had the same value as the other color stop. - Engine: Fixed missing text in exports if the font resources are not immediately loaded. - Editor/Android: Fixed navigation bar overlapping UI elements in the asset library when using button navigation mode. - Editor/Web: Fix an issue where in was not possible in some cases to have fully rounded corners on the text background due to the limitation on the max value of the rounded corners. - Engine: Fixed exiting inline text editing mode to add an undo step without the need to wait for user input on the canvas. - Editor/Web: Fixed an issue where Width and Height for Transform values were not updating correctly Editor/Flutter: Fixed a crash on Android when exporting scenes containing `content://` Uri(s). The SDK now allows these Uri(s) by default. Updated `EditorResult` documentation to clarify that such Uri(s) may not be reusable and recommend handling them using `EngineConfiguration.onUpload` and `engine.editor.setUriResolver`. - Editor/iOS: Ensure presented sheets correctly adopt the application's color scheme on iOS 18, even when overridden. - Editor/Web: Fixed an issue where the video playback performance was poor when editing complex videos. Version 1.48.1 Released: April 11, 2025 -------------------------------------------------- **Breaking Changes** **Non Breaking Changes** - Editor/Web: Fixed color selector labels appearing cut off under some circumstances Version 1.48.0 Released: April 1, 2025 -------------------------------------------------- **Breaking Changes** - Editor/Android: Added a new configuration property `navigationBar` to `EditorConfiguration` that allows customizing the navigation bar (a list of items that appears at the top of the editor). - Editor/Android: Removed `navigationIcon` parameter from `EditorConfiguration`. The `navigationIcon` in the navigation bar should now be customized via `navigationBar` parameter in `EditorConfiguration`. - Editor/Android: `IconTextButton` composable function now also accepts `tint: Color` parameter that controls the tint color of icon/text. - Engine: All video fill blocks and audio blocks now have playback looping disabled by default. Loading a scene created with the editor version 1.48 and earlier containing looping video fill and audio blocks will disable looping of these blocks and will add a metadata with the key `ly.img.default-looping-disabled` to these blocks. To re-enable looping on blocks intended to loop, use `setLooping`. The metadata can be safely removed. **Non Breaking Changes** - Editor/Web: Introduced the new `ly.img.opacity` feature key to control the opacity slider in the editor. - Editor/Web: Introduced the new `ly.img.blendMode` feature key to control the blend mode select in the editor. - Editor/iOS: Fixed an issue where assets would not correctly load when CocoaPods used in React Native apps where built using static frameworks. - Editor/Web: Fixed an issue where Crop, Cover, and Fit dropdown was not creating history snapshots - Editor/Android: Increased vertical inset in VideoEditor during crop mode to 24.dp. - Editor/Web: Fix an issue where, when putting a spacer in front of the inspector bar elements, a separator is suddenly shown at the beginning. - Editor/iOS: Overriding the `.preferredColorScheme` for the editor now also correctly changes the interface style for sheets. - Engine: Fix HDR tone mapping for iOS - Editor/Web: Update the video support error to align with our current supported browsers. - Editor/Web: Fixed an issue with the `showDialog` UI API where a separator was shown in the dialog even when no actions were provided. - Editor/Web: Fixed an issue with the `showDialog` UI API where the `onClose` callback was not always triggered when a dialog was closed. - Engine: Fixed possibly wrong crop for elements that have a `previewFileURI` set with a preview image of a different aspect ratio than the original image. - Editor/Web: Fix an issue where it was not possible to override the volume feature configuration to be shown for pages as well. - Editor/Web: Fixed an issue where popovers and tooltips would sometimes briefly appear in the wrong position. - Editor/Android: Reset trim offset to zero and trim length to new duration when replacing a block. - Editor/iOS: Reset trim length to new duration when replacing a block. - Editor/Web: Fix an issue where if the undo/redo controls are removed from the editor, the undo/redo shortcuts would not work. - Editor/Web: Fix an issue where if the zoom controls are removed from the editor, the zoom shortcuts would not work. - Editor/Web: Fix an issue where the panel API would not response if a panel is opened during initialization. - Editor/Web: Fix an issue where calling `supportsVideo` in a supported browser would return `false`. - Editor/iOS: Improved export performance on iOS with faster processing and reduced UI blocking. - Editor/iOS: Remove “Replace” button when a voiceover is selected. - Editor/iOS: Fix incorrect behavior when another block was previously selected before opening voiceover sheet. - Editor/Android: Reduced update frequency of progress indicator during video export to improve export times. - Editor/Web: Fixed an issue where Card labels had inconsistent top margin on asset library panel - Editor/Web: Fixed an issue where Card height is not consistent - Editor/Android: Fixed an issue where fill and stroke options were incorrectly displayed for a block, even when disabled, due to a missing scope check. **UI/UX Changes** - Editor/Web: Move the opacity and blend mode controls from the more menu into the inspector bar. - Editor/Web: Introduced new canvas actions to control the arrangement of layers. - Editor/Web: Removed the labels from some of the UI controls to make the UI cleaner. Version 1.47.0 Released: March 20, 2025 -------------------------------------------------- **Breaking Changes** **Non Breaking Changes** - Editor/Web: Fix a visual glitch when opening an Asset Library grid view. - Camera/Android: Fixed countdown timer broken layout on increasing system font size. - Engine: Fixed that a block could end up with a distorted image or video fill if `block.fillParent` was used and the resource was not yet loaded, see [documentation](https://img.ly/docs/cesdk/engine/api/block-layout/#fill-a-blocks-parent). - Editor/Web: Fix a bug where double-clicking does not activate Crop Mode or Text Mode in Safari. - Editor: Improved the error icons on failed blocks, e.g., if an image cannot be decoded. - Editor/Web: Fixed an issue where image preview would not work for imported archives. - Engine/Swift: Fixed potential crashes after loading a different scene in the same engine instance. - Engine/Swift: Improved memory footprint when loading large videos. - Engine: Fixed an text layouting issue for text blocks with automatic width and height where words could be clipped-off for some fonts. - Editor/Web: Fixed missing playhead in trim seeker - Engine: Updated the URI handling to no longer send the fragment part to the server. - Engine: Fixed an issue that could prevent scene interactions while video thumbnails are being generated. - Engine: Fixed variable FPS videos not showing the correct frame. - Engine: Fixed video empty edit lists not being handled correctly. - Editor/Web: When video editing is not supported, details about the missing APIs and codecs are logged to the console. - Editor/Web: Introduced a new `checkVideoSupport` method that throws an error with the reason when video editing is not supported. - Editor/Web: Introduced a new `checkVideoExportSupport` method that rejects with the reason when the video export is not supported. - Editor/Web: Added a new `builder.TextArea` option `placeholder` to set the placeholder text for the textarea. - Editor/Web: Allow using suffix as `builder.TextArea` option which renders a suffix element after the `inputLabel`. - Editor/Web: The `@imgly/LoadingSpinner` icon is now animated Version 1.46.1 Released: March 5, 2025 -------------------------------------------------- **Breaking Changes** **Non Breaking Changes** - Editor/Web: Fix a bug where double-clicking does not activate Crop Mode or Text Mode in Safari. Version 1.46.0 Released: March 4, 2025 -------------------------------------------------- **Breaking Changes** - Editor/Android: Video UI now uses the `stickersAndShapes` library instead of the `stickers` library. - Editor/Android: Removed the existing `AssetLibrary` constructor in favor of a new one that ensures composite library categories automatically reflect their constituents. For example, if you specify a custom `videos` `LibraryCategory`, `overlays` and `clips` will now update accordingly without requiring explicit assignment. This behavior is now also reflected in `AssetLibrary.getDefault()`. **Non Breaking Changes** - Editor/Web: Disabled name editing on double click for Document type in inspector panel - Editor/iOS: Added new SwiftUI view modifiers `.imgly.dockItems` and `.imgly.modifyDockItems` that allow customizing the dock (a list of buttons that appears at the bottom of the editor). - Editor/iOS: Added new SwiftUI view modifiers `.imgly.inspectorBarItems` and `.imgly.modifyInspectorBarItems` that allow customizing the inspector bar (a list of buttons that appears at the bottom of the editor when a design block is selected). - Editor/Android: Fixed R8 error due to missing consumer proguard rules. - Engine/Android: Fixed random crashes that could occur when replacing or removing videos. - Engine: To prevent blocks with a wrong aspect-ratio, the `setSourceSet`, `addImageFileURIToSourceSet`, and `addVideoFileURIToSourceSet` APIs now reset the crop of the block the fill is attached to when the source set is initially set or changes. - Engine: Fixed crop changes in scenes with a pixel design unit not to cause non-uniformly stretched fills or shrinking blocks when cropping pages. - Editor/Web: Fixed an issue where uploading the same file multiple times would not work as expected. - Editor/Web: Fixed a bug where effect toggles would appear as disabled before an effect was applied. - Editor/Web: Fixed an issue where text in some error dialogs would overflow in small screens. - Editor/Web: Fixed flashing color palette, when in CMYK-mode the tint was moved from value 0 - Engine: Fixed the minimum frame size for text blocks with automatic width and height for scenes in design unit pixel and inch. The frame could be too large depending on the screen size and amount of text characters. - Editor/Web: Fixed that text variables and spot-colors get properly handled in the video export. - Editor/Android: Fixed that text variables and spot-colors get properly handled in the video export. - Editor/iOS: Fixed that text variables and spot-colors get properly handled in the video export. - Editor/Web: Fix glitching scrollbar in builder library on certain browser zoom settings - Editor/Web: Fix builder API separators not being rendered inside sections - Editor/Web: Fixed an issue where adding an element to a non-empty scene would always place it in the background track if the track was empty. - Engine: Fixed unknown mime-type in `editor.getMimeType` on buffer type URIs for certain types, e.g., font files if the scene was loaded from an archive. - Editor/Web: Fixed an issue where the video timeline did not expand or collapse properly when the editor was rendered with a relative height. Version 1.45.0 Released: February 19, 2025 -------------------------------------------------- **Breaking Changes** **Non Breaking Changes** - Camera/Android: Added video reactions. - Editor/Web: Export missing UI API TypeScript types - Engine: Added new setting `useSystemFontFallback` to enable/disable IMG.LY hosted font fallback for fonts that are missing certain characters. - Engine: Added new setting `fontFallbackUri` to specify custom font fallback for fonts that are missing certain characters. - Engine: Added new setting `forceSystemEmojis` to disable emoji replacement with bundled emoji font. - Editor/iOS: Fix enter/exit group button icons are not shown. - Engine: Improved the URI handling in the engine to allow for placeholders in the custom URI resolver. - Editor/Web: Fixed an issue where copying and pasting multiple elements occasionally resulted in their order being altered. - Engine: Fixed GIFs not loading on image fills - Editor/Web: Fixed a bug where error icons in dialogs occasionally failed to render properly. - Editor/Web: Fixed slider edit button not hiding automatically - Editor/Web: Resolved an issue where selecting a block could occasionally cause the UI to flicker. - Editor/Web: Fixed wrong card aspect ratio when switching the viewport size (desktop/mobile) - Editor/Flutter: Fixed video editor would close and throw an error if the export is cancelled on iOS. - Editor/Flutter: Added video editor for Android. - Engine: when calling the functions `forceLoadAVResource` and `forceLoadResource` on resources that are in an error state will try to load these resource again. - Editor/Web: Pass the correct payload from `openPanel` to the registered panel when opening it. - Editor/Web: Update docs around deprecated `refetchAssetSources` - Editor/Web: Add new property `trailingIcon` to Button builder components to allow for a trailing icon to be added to the button. - Editor/Web: Fixed uploaded image preview in the fill panel when using the `callbacks.onUpload: 'local'` configuration option - Editor/Web: Using correct tooltip content for each color panels enable/disable toggle - Editor/Web: Fixed an issue where dragging and dropping elements on top of each other in the video timeline could cause unexpected behavior. - Editor/Web: Fixed an issue in the video timeline where dropping an element on the same track would not push trailing elements as expected. Version 1.10.6 Released: February 19, 2025 -------------------------------------------------- **Breaking Changes** **Non Breaking Changes** - Engine: improve font fallback configuration - Engine: block export when a block in the scene is in an error state. Version 1.44.0 Released: February 6, 2025 -------------------------------------------------- **Breaking Changes** - Engine/Android: Added a feature flag engine setting `"features/p3WorkingColorSpace"`. When enabled, the editor displays P3 colors correctly and image exports result in 16 bit images in the P3 color space as opposed to the default 8 bit sRGB exports. This setting is only supported on devices that provide support for displaying P3 and working with 16 bit colors and is ignored on other devices. Targa image exports and exports with a color mask continue to produce 8 bit results. - Engine/Android: Added the `EditorApi.supportsP3` API with a boolean return value which can be used to determine whether the current device supports working and exporting in the P3 color space. - Engine/Android: Added the `EditorApi.checkP3Support` API which can be used to determine whether the current device supports working and exporting in the P3 color space with an error description in case P3 is not supported. - Engine/Swift: Renamed the `features/exportP3Images` setting to `features/p3WorkingColorSpace` and adjusted its behavior to be consistent with that on Android. Enabling this setting will cause the editor to now work in the Display P3 color space instead of an extended sRGB color space. - Engine/Swift: Added the `EditorAPI.supportsP3` API with a boolean return value which can be used to determine whether the current device supports working and exporting in the P3 color space. - Engine/Swift: Added the `EditorAPI.checkP3Support` API which can be used to determine whether the current device supports working and exporting in the P3 color space with an error description in case P3 is not supported. **Non Breaking Changes** - Editor/Android: Added a new configuration property `canvasMenu: CanvasMenu` to `EditorConfiguration` that allows customizing the canvas menu (a list of buttons that appears next to a design block when one is selected). - Editor/Web: Keyboard handling for Straighten slider in Crop mode - Engine: Added a new guide on how to run the `CreativeEngine` on Deno. - Editor/Web: Add locale API - Editor/Web: Canvas menu holds proper size when changing to text edit mode - Engine/Web: Fixed randomly failing video exports of scenes that were loaded from an archive. - Editor/Web: Color picker pointer position update upon changing RGB values - Editor/Web: Fixed a bug that occured when rendering 2 Asset Libraries showing the same content at the same time. - Editor/Web: Fix misplaced loading spinner for dock buttons - Engine: The `bringForward` and `sendBackward` APIs have been improved to automatically skip over empty tracks and groups. - Editor/Web: Fonts are auto-highlighted in the font selection dropdown for non-regular typefaces - Engine: When duplicating a block that is within a track, the duplicate is moved up in the hierarchy for regular tracks and the duplicate is inserted within the track immediately after the block for tracks that are marked as page duration defining elements. - Editor/Web: Clips can now be dragged and arranged side by side within each track throughout the entire video timeline - Engine: Fixed an export issue where blocks could be exported without their effects applied if the effects were still pending. Could happen on cloned engine instances. - Engine: Fixed a loading issue in version 1.41 and newer of the `defaultApplyAsset` and `defaultApplyAssetToBlock` asset APIs where, for graphic blocks with a defined source set, all elements of the source set were pre-loaded. - Editor/Web: Improved build quality and size of CDN deployment. Version 1.43.0 Released: January 21, 2025 -------------------------------------------------- **Breaking Changes** - Editor/iOS: Changed type `EditorEvent` from enum to protocol. Short-hand syntax of prior enum cases, e.g., `.shareFile(_ url:)`, is preserved via extensions of the new protocol type. Fully qualified prior enum cases, e.g., `EditorEvent.shareFile(_ url:)`, won't compile anymore and should be changed to the short-hand syntax. All provided event types can now also be accessed through the new `EditorEvents` (plural `s`) namespace, e.g., `EditorEvents.ShareFile` but can only be initialized with the short-hand syntax. **Non Breaking Changes** - Engine: `active` member of `FindAssetResult` is now correctly set - Editor/Web: Added `labelAlignment` to `PanelBuilder` buttons to `left` or `center` align the button label. - Editor/Web: Add version property to the CE.SDK instance - Engine/Web: Add version property to the engine instance - Editor/Web: Document the `payload` option of `openPanel` UI API. - Engine: Improved the `bringToFront`, `sendToBack`, `bringForward`, and `sendBackward` block APIs to handle elements in tracks. - Engine: Added the feature flag `features/removeForegroundTracksOnSceneLoad` that can be used to make loaded scenes compatible with UIs that don't support multiple clips per track. - Engine: Added the `supportsPageDurationSource`, `setPageDurationSource`, `isPageDurationSource`, and `removePageDurationSource` block API to allow setting a duration source block in video scenes, which then automatically defines the overall duration. A call of the `getDuration` block API on a page returns then the duration and offset of the defining element. See [documentation](https://img.ly/docs/cesdk/engine/api/block-video/#time-offset-and-duration) for more details. - Engine: Updated the `getDuration` block API to allow for automatic duration calculations in a video scenes. If no duration source block is set, the method returns automatically the overall duration over all page children. See [documentation](https://img.ly/docs/cesdk/engine/api/block-video/#time-offset-and-duration) for more details. - Editor/Web: Fix crash when loading certain scene files while audio is playing - Camera/iOS: Fixed rect assignments in reaction mode to ensure correct layout output. - Engine: If a custom URI resolver is set, caching of the URIs is removed to fix using outdated URIs and instead always call the custom resolver. - Editor/Web: Fix some inputs not being properly enabled/disabled based on scope configuration - Editor/iOS: Fix an issue where the icon color was not updating correctly to match the text element’s new color. - Editor/Web: Fixed a bug where 'Fix to Front' / 'Fix to Back' did not create an Undo/Redo snapshot. - Editor/Web: Fix Filter Panel being disabled wrong. Version 1.42.0 Released: January 9, 2025 -------------------------------------------------- **Breaking Changes** - Editor/Web: Remove exports of internal types `SettingsBoolInternal` and `SettingsEnumInternal` **Non Breaking Changes** - Editor/Android: Added a new configuration property `inspectorBar: InspectorBar` to `EditorConfiguration` that allows customizing the inspector bar (a list of buttons that appears at the bottom of the editor when a design block is selected). - Editor/Android: Added a new property `decoration` to `EditorComponent` that allows decorating the components. Useful when you want to add custom background, foreground, shadow, paddings etc. - Editor/Android: Added a new property `itemDectoration` to `Dock` that allows applying same decoration to all the items in the dock. Useful when you want to add custom background, foreground, shadow, paddings etc to the items in the dock. - Editor/Android: Deprecated `Dock.ReorderButtonScope` class. - Editor: Improved click detection to better ignore drag events. - Editor/Web: Improved cropping behavior for elements with content fill mode `contain`. - Editor/Web: Remove feature flag and update UI for crop fillmode functionality - Editor/Web: Undo step being added if stroke inputs are being enabled by clicking on them - Engine: Fixed playback of uncompressed videos. - Editor/Web: Fix for WOFF fonts not rendered. - Engine/Web: under a Node.js environment, the heap memory cap is increased from 2GB to 4GB. - Editor/Web: Fixed a bug where the Color Picker would not open. - Editor/Web: Fix slider inputs having unusable dimensions in certain occasions - Editor: Fixed transform edits and crop edits with the size inputs to not change the crop of elements with content fill mode `Fit`. - Engine: Improved the `maintainCrop` option in setWidth/setHeight to also maintain the content fill mode `Fit` and `Cover`. Version 1.41.1 Released: December 16, 2024 -------------------------------------------------- **Breaking Changes** **Non Breaking Changes** - Editor/Web: Add asset library source sort order configuration - Editor: Added a `getTextVisibleLineCount` and `getTextVisibleLineGlobalBoundingBoxXYWH` methods to the `BlockAPI` to get the number of visible lines in a text block and the global bounding box of the visible area of a text line. See [documentation](https://img.ly/docs/cesdk/engine/api/block-text). Version 1.41.0 Released: December 11, 2024 -------------------------------------------------- **Breaking Changes** - Engine: To keep text visually the same size when the DPI setting is changed in scenes with pixel design-unit, the font sizes are now automatically scaled. Before text would appear smaller/larger when the DPI decreases/increases. This should usually be the desired behavior. If the old behavior should be kept, the font sizes can be scaled with `newDPI/previousDPI` when the dpi in pixel scenes is changed. **Non Breaking Changes** - Engine: Added a new boolean engine setting `page/moveChildrenWhenCroppingFill` for keeping the position, rotation and size of children of a page in sync with crop edits to the page's fill. - Editor/Web: Fix correct asset being applied to canvas if confirmation dialog is being configured - Editor/Web: Fix asset library flickering in certain occasions when using custom panels - Editor/Web: Deprecate the `AssetLibraryEntry[]` type in favor of `string[]` for the Panel Builder `Library` entries property - Editor/Web: Fix hover state on canvas getting stuck on certain occasions - Engine: Fixed the `relocateResource` editor API to also update typeface URIs. - Editor/Web: Replace UI font Inter Bold with Inter SemiBold - Engine: fix rendering of pages with a dimension with a fractional pixel. - Editor/Web: Fixed that changing the width or height with the input values in the inspector did not update the crop values correctly and result in wrong aspect-ratio of the image fill. - Engine: Allow to automatically maintain the crop when using the block API `setWidth/Height`. - Engine: Updated the `setWidth` and `setHeigth` block APIs with an optional flag for maintaining the crop. If set, the crop values of, e.g., image fills are automatically updated so that the image is not stretched or squashed, see [documentation](https://img.ly/docs/cesdk/engine/api/block-layout/#size). - Engine: Fixed `fillParent` block API to resize cropped elements without distorting their fill. - Editor/Web: Fix an issue where calling engine APIs inside the asset library entries style callback would not trigger reactivity. Version 1.40.1 Released: December 6, 2024 -------------------------------------------------- **Breaking Changes** **Non Breaking Changes** - Engine/Android: Fix a video encoder crash if export is cancelled Version 1.40.0 Released: November 28, 2024 -------------------------------------------------- **Breaking Changes** - Engine: Updated the `setTypeface` block API to allow change of the typeface also for text runs. This enables to use different typefaces in one text block. Setting a typeface witout specifying a range while text is selected by the user or with the `SetSelectionRange` command now changes the typeface only for the selection. This is usually the desired behavior. To retain the old behavior of changing the typeface of the whole block, specify the range to cover the whole text, i.e., `from = 0, to = textLength`. See [set typeface documentation](https://img.ly/docs/cesdk/engine/api/block-text/#blockapisettypeface) and [text properties documentation](https://img.ly/docs/cesdk/engine/guides/text-properties/#typefaces) for more details. - Engine: Updated the `setTypeface` block API to no longer need a fallback font file URI as parameter. The font fallback will be handled automatically. See [set typeface documentation](https://img.ly/docs/cesdk/engine/api/block-text/#blockapisettypeface) for more details. - Engine: Added the `getTypefaces` block API to allow querying of all typefaces of a text run. It is recommended to switch out `getTypeface` with the new API as `getTypeface` only returns the default typeface, i.e., the property 'text/typeface' set on the text block. See [get typefaces documentation](https://img.ly/docs/cesdk/engine/api/block-text/#blockapigettypefaces), [get typeface documentation](https://img.ly/docs/cesdk/engine/api/block-text/#blockapigettypefaces),and [text properties documentation](https://img.ly/docs/cesdk/engine/guides/text-properties/#typefaces) for more details. - Engine: Updated the `setTypeface` block API to no longer need a fallback font file URI as parameter. The font fallback will be handled automatically. See [block docs](https://img.ly/docs/cesdk/engine/api/block-text/#blockapisettypeface) for more details. **Non Breaking Changes** - Engine/Swift: Added a feature flag engine setting `"features/exportP3Images"`. When enabled, the editor displays P3 colors correctly and image exports result in 16 bit images in the P3 color space as opposed to the default 8 bit sRGB exports. This setting is currently only supported on iOS and is ignored on other platforms. Targa image exports and exports with a color mask continue to produce 8 bit results. - Editor/Web: Builder components like inputs and buttons within the builder panel now support an `suffix` property. This suffix appears on the right side of the component and can be used to add an extra button, icon with a tooltip to provide additional information. - Camera/React-Native: Added `@imgly/camera-react-native` module. - Engine/Android: Added binding `EditorApi.getActiveLicense`. - Editor/Android: Added a new configuration property `dock` of type `Dock` to `EditorConfiguration` that allows customizing the dock (a list of buttons that appears at the bottom of the editor). - Editor/Android: Deprecated `EngineConfiguration` constructor in favor of `EngineConfiguration.Companion.remember` composable function. - Editor/Android: Deprecated `EngineConfiguration.getForDesign` method in favor of `EngineConfiguration.Companion.rememberForDesign` composable function. - Editor/Android: Deprecated `EngineConfiguration.getForPhoto` method in favor of `EngineConfiguration.Companion.rememberForPhoto` composable function. - Editor/Android: Deprecated `EngineConfiguration.getForApparel` method in favor of `EngineConfiguration.Companion.rememberForApparel` composable function. - Editor/Android: Deprecated `EngineConfiguration.getForPostcard` method in favor of `EngineConfiguration.Companion.rememberForPostcard` composable function. - Editor/Android: Deprecated `EngineConfiguration.getForVideo` method in favor of `EngineConfiguration.Companion.rememberForVideo` composable function. - Editor/Android: Deprecated `EditorConfiguration` constructor in favor of `EditorConfiguration.Companion.remember` composable function. - Editor/Android: Deprecated `EditorConfiguration.getDefault` method in favor of `EditorConfiguration.Companion.rememberForDesign`, `EditorConfiguration.Companion.rememberForPhoto`, `EditorConfiguration.Companion.rememberForApparel`, `EditorConfiguration.Companion.rememberForPostcard` and `EditorConfiguration.Companion.rememberForVideo` solution specific composable functions. - Editor/Android: Deprecated `EditorEventHandler.sendCloseEditorEvent(throwable)` in favor of `EditorEventHandler.send(EditorEvent.CloseEditor(throwable))`. - Editor/Android: Deprecated `EditorEventHandler.sendCancelExportEvent(throwable)` in favor of `EditorEventHandler.send(EditorEvent.CancelExport())`. - Editor/Android: Deprecated `IconPack.Libraryelements` in favor of `IconPack.LibraryElements`. - Editor/Android: Deprecated `IconPack.Arrowback` in favor of `IconPack.ArrowBack`. - Editor/Android: Deprecated `IconPack.Imageoutline` in favor of `IconPack.ImageOutline`. - Editor/Android: Deprecated `IconPack.Libraryelementsoutline` in favor of `IconPack.LibraryElementsOutline`. - Editor/Android: Deprecated `IconPack.Playbox` in favor of `IconPack.PlayBox`. - Editor/Android: Deprecated `IconPack.Playboxoutline` in favor of `IconPack.PlayBoxOutline`. - Editor/Android: Deprecated `IconPack.Reorderhorizontally` in favor of `IconPack.ReorderHorizontally`. - Editor/Android: Deprecated `IconPack.Shapesoutline` in favor of `IconPack.ShapesOutline`. - Editor/Android: Deprecated `IconPack.Stickeremoji` in favor of `IconPack.StickerEmoji`. - Editor/Android: Deprecated `IconPack.Stickeremojioutline` in favor of `IconPack.StickerEmojiOutline`. - Editor/Android: Deprecated `IconPack.Textfields` in favor of `IconPack.TextFields`. - Camera/Android: Added long press/release to toggle recording. - Camera/Android: Added `CameraConfiguration` for configurability. - Editor/Web: Removed the automatic percentage conversion for slider inputs in builders when the value is between `-1` and `1`. - Editor/Web: Fix an issue where the action button in the dialog are rendered without a gap between them when using the dialog API. - Editor/Web: Fixed an issue where the effect library thumbnails were not derived from the effect assets correctly. - Editor/Web: Fixed an issue where the blur library thumbnails were not derived from the blur assets correctly. - Editor/iOS: Playback now pauses when app enters background if currently playing. - Engine: fix pre-export memory usage estimate when exporting with option `exportWithMaskColor` is set to `true`. - Editor/Web: UI for setting font size now supports text runs. - Editor/Web: UI for font selection and styling now supports text runs. - Editor/Web: The entire set of IMG.LY icons is now available for use in custom/builder components. See our [updated documentation on how to use them.](https://img.ly/docs/cesdk/ui/customization/api/icons/#built-in-icons) - Editor/Web: Remove old icons, use new spritesheets, to reduce bundle size. - Editor/Web: Fix: 'Video unsupported' warning dialogue shows warning icon. - Editor/Web: Fixed a bug where the custom URI resolver was not called for images and videos shown in the Fill Inspector Panel. - Editor/Web: Fixed a crash when changing the fill of a page to video, and then attempting to trim or crop it. - Editor/Web: Removed deprecated query of property 'fill/image/imageFileURI' in Fill Inspector Panel. Version 1.39.0 Released: November 12, 2024 -------------------------------------------------- **Breaking Changes** **Non Breaking Changes** - Engine/Android: Introduce new `Engine` methods: - `Engine::pause()` for pausing the engine. - `Engine::resume()` for unpausing the engine. - `Engine::isBound()` for checking if the engine is bound. - Camera/Android: Added Camera for Android. - Camera/Android: `Engine.setCameraPreview()` now accepts a new lambda parameter `onFirstFrameAvailable`. It is called when the first frame of the camera preview is available. - Camera/Android: Added an overloaded method for `Engine.setCameraPreview()` that accepts `mirroredState`, a `StateFlow` as a parameter. This allows to update the camera preview orientation dynamically. - Engine/Swift: Added support for text animations on iOS. (`AnimationType.typewriterText`, `AnimationType.blockSwipeText`, `AnimationType.spreadText`, `AnimationType.mergeText`) - Engine/Swift: fixed saving scenes generated by psd-importer - Editor/Web: Changed the order of animations in the library from "In", "Out", Loop" to "In", "Loop", "Out" - Editor/Web: When a text element is set to auto size by double-clicking the resize handles, the automatic font size now gets disabled. - Engine/Android: When creating a scene, it is now possible to choose it's desired layout, see [documentation](https://img.ly/docs/cesdk/engine/api/scene-lifecycle?language=kotlin&platform=android#creating-a-scene). - Engine/Swift: When creating a scene, it is now possible to choose it's desired layout, see [documentation](https://img.ly/docs/cesdk/engine/api/scene-lifecycle?language=swift&platform=macos#creating-a-scene). - Engine: Fixed missing scaling of the font size in text runs when the text properties are scaled. - Editor/iOS: Fixed tiny canvas that could have been appeared after using the search in the asset library or after device orientation changes with an open sheet. - Engine: Fixed a memory leak in the minimp4 library. - Editor/iOS: Fix ClipTrimmingView not updating with undo/redo event. - Engine/Android: Exporting to image a previously archived scene or a scene generated from psd-tool should not result in an error. - Engine/Swift: Exporting to image a previously archived scene or a scene generated from psd-tool should not result in an error. - Editor/Flutter: Fixed scene would be exported as String instead of Uri on Android. - Editor/Web: Added UI to edit the Text Background. - Engine: Updated the `canToggleBold` and `canToggleItalic` block APIs to query the result also for text runs. This enables to use different typefaces in one text block. See [set typeface documentation](https://img.ly/docs/cesdk/engine/api/block-text/#blockapisettypeface) and [text properties documentation](https://img.ly/docs/cesdk/engine/guides/text-properties/#toggleBold) . Version 1.38.0 Released: October 29, 2024 -------------------------------------------------- **Breaking Changes** - Engine: Scopes are no longer enforced by default in the engine. The `checkScopesInAPIs` setting is now deprecated and set to `false` by default. A new setting boolean `debug/enforceScopesInAPIs` replaces it and is also set to `false` by default. **Non Breaking Changes** - Engine: Added the `setTextFontSize` block API to change the font size also for text runs and not only for the whole text block, see [docs](https://img.ly/docs/cesdk/engine/api/block-text/#blockapisettextfontsize)). - Engine: Added the `getTextFontSizes` block API to query the set font sizes on runs, selections, or the whole text, see [docs](https://img.ly/docs/cesdk/engine/api/block-text/#blockapigettextfontstyles)). - Engine: Added the `setTextFontWeight` block API to change the font weight also for text runs and not only for the whole text block, see [docs](https://img.ly/docs/cesdk/engine/api/block-text/#blockapisettextfontweight)). - Engine: Added the `setTextFontStyle` block API to change the font style (normal and italic) directly instead of using `toggleItalicFont`, see [docs](https://img.ly/docs/cesdk/engine/api/block-text/#blockapisettextfontstyle)). - Engine: Added four new text-specific In and Out animations: `typewriter_text`, `block_swipe_text`, `spread_text`, `merge_text`. - Engine: Added `textAnimationWritingStyle` and `textAnimationOverlap` properties to most In and Out animations in order to be able to apply an animation to a text block piece by piece. - Editor/Web: Fixed an issue that prevented audio files from being removed using shortcuts. - Editor/Web: Fix an issue where in some cases, clips added to the background track are automatically trimmed. - Editor/iOS: Canvas menu is now hidden during timeline show/hide animation. - Camera/iOS: Fixed an issue where the "Off" item would incorrectly be displayed in the Reactions menu. - Engine/Swift: Fixed `block.toggleBoldFont()` and `block.toggleItalicFont()` to take the given range into account instead of applying the edit to the whole text. - Editor/Web: Fixed an issue causing video timeline control elements to overlap in smaller viewports. - Editor/Web: Fixed an issue that caused video timeline elements to move unintentionally when clicked. - Engine/Web: Fixed video export on empty scene on Windows 11. - Engine: Added the flag `useExistingShapeInformation` to the `createCutoutFromBlocks` API that allows using the existing vector paths of the provided blocks to create a cutout or to generate new shape information for the cutout. - Editor/iOS: Fixed importing videos from photo roll to use most compatible encoding. - Editor/Web: Fix icon in timeline play/pause button not centered in Chrome/Edge v130+ - Editor/Web: Fix "unknown block" errors when window/tab switching after deleting a block via keyboard shortcut - Editor/Web: Fix editor crash when trying to add a video while trimming another video - Editor/Web: Fixed crash when replacing the videos in the editor via canvas action. Version 1.37.0 Released: October 14, 2024 -------------------------------------------------- **Breaking Changes** **Non Breaking Changes** - Editor/Web: Fixed bug where adding a page to a scene created by `SceneAPI.createFromImage` broke the Editor. - Editor/Web: Controls for adding, moving, or duplicating Pages are removed when editing scenes that use the 'Free' layout. - Editor/Web: Added Feature API key `'ly.img.page.add'`, which controls the 'Add Page' button in the Canvas Bar. - Editor/Web: Feature API for `'ly.img.duplicate'` will now return `false` when a Page is selected and the Scene layout is set to `'Free'` or `'DepthStack'`. - Editor/Web: Copy/Paste using keyboard shortcuts now checks the Feature API for 'ly.img.duplicate'. - Engine/Swift: Added binding for `forceLoadResources`. - Engine/Android: Added binding for `forceLoadResources`. - Editor/Web: Enable page clipping by default - Editor/Web: Adds `findAllPanels` method to `UserInterfaceAPI` to get all panels in the web editor. - Engine/Android: Added 16 KB page sizes support for Android 15 devices - Editor/Web: Add tooltip options for builder components `Button`, `Select` and `Dropdown` - Editor/Web: Add `ButtonGroup` as builder component in the Customization APIs. - Camera/iOS: Added video reactions. - Editor/Web: Add `registerPanel` method to `UserInterfaceAPI` to allow registering custom panels in the editor. - Editor/Web: Show an export progress dialog when exporting a video from the editor. - Editor/Android: Fix "Add Audio" button in Video timeline always opening the default Audio library category. - Editor/Web: Fix wrong sizing of custom icons in the Dock - Editor/Web: Fixed custom icons in navigation and inspector bar not being displayed correctly. - Engine/Web: Exposed missing settings for 'page/allowCropInteraction', 'page/allowResizeInteraction', 'page/restrictResizeInteractionToFixedAspectRatio', 'page/allowRotateInteraction','page/allowMoveInteraction', 'defaultFontFileUri', and 'ruleOfThirdsLineColor'. - Engine/Web: Fixed type for setting 'controlGizmo/blockScaleDownLimit' to be float. - Editor/Web: Fixed a bug causing crop controls to not work properly with undo/redo. - Editor/Web: Fixed an issue where the "shape/change" scope could not be applied to rectangular shapes, images and videos. - Editor: Fixed the parent of a multi-selection to be udpated if the multi-selection is moved to another page. Caused the multi-selection frame to be stuck on the original page. - Editor/Web: Prevent the crop panel from automatically opening when the fill panel is active. - Editor/iOS: Reset trim offset to zero when replacing a block. - Editor/Web: Fixed an issue where some components did not update properly to external changes. - Engine: Fixed `block.setTextCase`, `block.toggleBoldFont`, and `block.toggleItalicFont` to determine the current style correctly and to not cause a potential index out-of-bounds memory access. - Editor/Web: Fix an issue where the clip is not visible in the timeline after clicking on the "Set as Clip" button. - Editor/Web: Fixed a bug where page duration in video editor would not update correctly after undo/redo. - Editor/Web: Fixed a translation issue with the zoom option label for 'Auto'. - Engine: Added the `setTypeface` block API to change the typeface of a text block while retaining the current formatting, e.g., bold or italic, if possible. See [block docs](https://img.ly/docs/cesdk/engine/api/block-text/#blockapisettypeface) and [text properties docs](https://img.ly/docs/cesdk/engine/guides/text-properties/#typefaces) for more details. - Engine: fix ordering of audio vs non-audio blocks. Moving an audio or non-audio block forward or backward shouldn't be hindered by non-audio or audio blocks. - Editor/Web: `enable` in the Feature API now accepts multiple IDs. - Editor/Web: Fix an issue where imported archive video scenes were throwing an error when exporting the video. - Editor/Web: Fixed a bug where the 'Change Animations' scope was shown outside of 'Video' mode. - Editor/Web: Fixed a bug where 'centered' sliders could no longer be adjusted using arrow keys, after setting their value to `0`. - Editor/Web: Fixed a bug where the 'Change Shape' placeholder toggle was shown for stickers. - Editor/Web: Select components show the correct selection state, e.g. in the style selection of a font - Editor/Web: Add local state to `registerComponent` Version 1.36.1 Released: October 4, 2024 -------------------------------------------------- **Breaking Changes** **Non Breaking Changes** - Editor/Android: Fix "Add Audio" button in Video timeline always opening the default Audio library category. - Engine/Web: Exposed missing settings for 'page/allowCropInteraction', 'page/allowResizeInteraction', 'page/restrictResizeInteractionToFixedAspectRatio', 'page/allowRotateInteraction','page/allowMoveInteraction', 'defaultFontFileUri', and 'ruleOfThirdsLineColor'. - Engine/Web: Fixed type for setting 'controlGizmo/blockScaleDownLimit' to be float. Version 1.36.0 Released: September 30, 2024 -------------------------------------------------- **Breaking Changes** **Non Breaking Changes** - Editor: An outline highlight has been added to the outer image boundaries when cropping an image. - Editor/Web: Introduced support for block animations in the video Editor. Users now can add in, out, and loop animations to the clips in the video timeline. - Editor/Android: Added `VideoEditor`. - Engine/Swift: Added resource related bindings: `EditorAPI.getResourceData`, `EditorAPI.relocateResource`, `EditorAPI.findAllTransientResources`. - Engine/Swift: Added asset related bindings: `AssetAPI.onAssetSourceUpdated`, `AssetAPI.assetSourceContentsChanged`. - Editor/Web: Fixed several issues where components of the Advanced UI did not react to Feature API settings correctly. - Editor/Web: Fix an issue where the asset library would not load all items in some cases. - Editor/Web: Fix for the not closing confirmation dialog after an asset got deleted. - Editor/Web: Fix an issue where the fill inspector is shown even when the block does not have a fill - Engine: Fixed a bug in the dot pattern effect that was causing flickering when changing dot size while blur was set to zero. - Editor/Web: Fixed a bug with i18n/localization where nested keys would be resolved in the fallback language (instead of the current language). - Editor/Web: Fixed a bug with translation generation that would generate broken translation files. - Editor/Web: Fixes wrong icon sizes in Select dropdowns. - Engine: All fonts of typefaces that are used in a scene are now embedded in archives. - Engine: Added the editor API `unstable_isInteractionHappening()` to query if a user interaction is happening, which is useful, e.g., to not change the camera during the interaction. - Engine/Web, Editor/Web: Fixed an issue that prevented the keyboard from displaying on mobile devices when entering text edit mode. - Engine: Added option to control export audio and video bitrate via `VideoExportOptions.audioBitrate`, `VideoExportOptions.videoBitrate`. - Editor/Web: Fix: Crashing editor if theme variables used by engine are invalid - Editor/Android: Fix settings/scopes set in `onCreate` getting overriden. - Editor/iOS: Fix crash when a block have a small size - Editor: Fixed the aspect ratio lock for page, [setting](https://img.ly/docs/cesdk/engine/api/editor-settings#pagesettings) `'ubq://page/restrictResizeInteractionToFixedAspectRatio'` (disabled by default), to not exceed inital frame. - Engine: Fixed audio playback for unarchived audio buffers. Version 1.35.1 Released: September 20, 2024 -------------------------------------------------- **Breaking Changes** **Non Breaking Changes** - Engine: Added option to control export audio and video bitrate via `VideoExportOptions.audioBitrate`, `VideoExportOptions.videoBitrate`. Version 1.35.0 Released: September 16, 2024 -------------------------------------------------- **Breaking Changes** - Editor/Web: The `@cesdk/cesdk-js` used to bundle the `@cesdk/engine` project internally. Now, the two packages are separate and the CESDK has the engine package as a dependency. Normally, nothing should change for implementers when updating their `@cesdk/cesdk-js` version, but it is possible that under certain circumstances you might need to adapt your bundler configuration. **Non Breaking Changes** - Editor/Web: Fix bug where `entry.title` was not used in the asset library sections (if no translation was found) - Engine: Fixed content-aware resize to not change the selection or edit mode. - Engine: Introduced new [page setting](https://img.ly/docs/cesdk/engine/api/editor-settings#pagesettings) to restrict the resize interaction to fixed-aspect ratio: `'ubq://page/restrictResizeInteractionToFixedAspectRatio'`, which is disabled by default. - Engine/Android: Added resource related bindings: `EditorApi.getResourceData`, `EditorApi.relocateResource`, `EditorApi.findAllTransientResources`. - Engine/Android: Added asset related bindings: `AssetApi.onAssetSourceUpdated`, `AssetApi.assetSourceContentsChanged`. - Editor/Web: Support uploading TIFF files via the UI - Engine: fix cutout contours of images containing no pure transparency to be the exact rectangular frame of the image. - Editor/Web: Restore functionality to move elements using the arrow keys. - Engine/Web: With this release we are publishing our _Reactor_ API for reactive integrations between the Creative Engine and your app's user interface. - Engine: Added `forceLoadResources` to manually trigger the fetching or loading of resources associated with the given block and its children. - Engine/Web: Added binding for `forceLoadResources`. Version 1.34.0 Released: August 31, 2024 -------------------------------------------------- **Breaking Changes** - Editor/Web, Engine/Web: Configuration options, APIs and types that have been deprecated in Version 1.13 have been removed. The `ConfigTypes` namespace has been removed and the following type definitions in it have been removed without replacement since they are not used anymore: - `ConfigTypes.Scene` - `ConfigTypes.Page` - `ConfigTypes.ColorDefinition` - `Configtypes.ColorPaletteDefinition` - `ConfigTypes.Variables` - `ConfigTypes.VariableDefinition` - `ConfigTypes.Callbacks` - `ConfigTypes.TemplateDefinition` - `ConfigTypes.Preset` - `ConfigTypes.Presets` - `ConfigTypes.AssetSources` Other types in the `ConfigTypes` namespace might still be used and can be imported directly from `@cesdk/engine` or `@cesdk/cesdk-js`: - `ConfigTypes.Color` as `PaletteColor` - Asset source related types - `ConfigTypes.QueryData` as `AssetQueryData` - `ConfigTypes.AssetResult` as `AssetResult` - `ConfigTypes.AssetsQueryResult` as `AssetsQueryResult` - `ConfigTypes.AssetSource` as `AssetSource` when working with the Asset API - `ConfigTypes.HexColorString` as `HexColorString` - `ConfigTypes.PageFormatDefinition` as `PageFormatDefinition` from `@cesdk/cesdk-js` - `ConfigTypes.TypefaceDefinition` as ~~`TypefaceDefinition`~~ (deprecated, use the [Asset API to define custom typefaces](https://img.ly/docs/cesdk/ui/guides/fonts-typefaces/) instead) The following Settings have been removed. For detailed instructions on how to migrate away from them, consult the [*Migrating to v1.13*](https://img.ly/docs/cesdk/introduction/migration_1_13/) guide - `config.scene` - `config.page` - `config.assetSources` - `config.presets.colors` - `config.presets.colorPalettes` - `config.presets.pageFormats` - `config.variables` - `config.callbacks.logger` - `config.initialImageURL` - `config.initalSceneMode` - `config.initialSceneString` - `config.initialSceneURL` - `config.presets.templates`: Since version 1.12 this setting has been deprecated. See the [Adding Templates](https://img.ly/docs/cesdk/ui/guides/custom-template-source/) guide for instructions on how to use the AssetAPI to add templates. - `config.defaultFont`: Since version 1.13 it has been deprecated in the Engine, but not in the Editor. In the Editor **this setting has been ignored** since version 1.26. There is no replacement for this setting. Additionally the following types and APIs have changed and might require adjustments: - The `CreativeEditorSDK.init` method has been removed. Use `CreativeEditorSDK.create` instead - The `CreateConfiguration` type exported from `@cesdk/cesdk-js` has been removed. Use `Configuration` instead. - `CreativeEditorSDK.setVariableDefinitions` has been removed. Use the Variable API instead. - Editor/Android: `onClose` callback now contains an optional `Throwable` parameter in the composable functions of all the solutions. If the value of this parameter is not null, it means that the editor is closed due to an error. The value is propagated from `EditorEventHandler.sendCloseEditorEvent`. Unless custom types are sent to this function, throwable is always going to be either an `EditorException` or `EngineException`. **Non Breaking Changes** - Engine: Fixed content-aware resize to not result in a distorted image if a page with an image fill is resized. - Editor: Added drag selection for easy selection of multiple elements. - Engine/Swift: New functions to load a scene from an archive, and to save and load block to an archive. - Engine/Swift: Add `getState` and `setState` to manually set the state of a block to `.pending`, `.error` or `.ready`. Add `onStateChanged` to be notified of a block's change of state. - Engine/Android: Add `getState` and `setState` to manually set the state of a block to `Pending`, `Error` or `Ready`. Add `onStateChanged` to be notified of a block's change of state. - Editor/iOS: Fixed some videos that played back audio slower than expected. - Engine: Use a more common time scale for the audio track of exported videos. - Editor/Web: Fixed an issue where some built-in Inspector Bar Components did not react immediately to Feature API calls. - Editor/Web: Fix fill panel overlapping other panels - Editor/Web: Preview mode is being exited on applying new template - Editor/Web: Fixed that multi-selecting several pages causes the editor to automatically scroll and wrong pages being selected. - Editor/Web: Fix elements being selected during gesture based scrolling via touch input - Editor/Web: Undo/redo does not change zoom level anymore - Editor/Web: Pasting elements now adds an undo/redo history step - Editor: Introduced new [control gizmo settings](https://img.ly/docs/cesdk/engine/api/editor-settings/#controlgizmosettings) `blockScaleDownLimit` to control how small a block can be resized with the gizmos or with touch gestures. - Editor: Fixed the dimming overlay when editing the crop of an page with an image fill to only dim the part out of the page. - Editor/Web: Select all elements after duplicating multiple elements - Editor: Multi-selection of elements across different pages is disabled to prevent unexpected editing behavior. - Editor: The `clampCameraCommand` skips clamping while the page size or position is being edited with user interaction. This prevents that the camera is changed, while editing the page with drag handles or gestures. - Editor/Web: Fix canvas menu position on multiselection - Engine: Fixed the `onClick` subscription to send notifications for clicks or taps that select elements that were previously not selected. In some cases, these events were not sent. - Engine: Fix a false positive video encoding time out error that can be encountered due to slow resource fetching. Version 1.10.5 Released: August 30, 2024 -------------------------------------------------- **Breaking Changes** ### Non Breaking Changes Version 1.33.0 Released: August 23, 2024 -------------------------------------------------- **Breaking Changes** - Engine: Improved `getCurrentPage()` to prioritize the selected page over the nearest page to the viewport center if the selected page is visible for more than 25%. The previous behavior can be retained by swapping out `getCurrentPage()` with, e.g., `findNearestToViewPortCenterByType(scene, "page").unwrap()[0]`. **Non Breaking Changes** - Editor/Android: Added polygon shape corner radius - Editor/Android: Added rect corner radius - Editor/Web: Update german translations for advance text UI - Editor/iOS: Fixed potential crash when exiting editor from text edit mode. - Editor/iOS: Fixed loading scenes that contained a preselected placeholder were showing an invalid image replace sheet at startup. - Editor: Made the move handle gizmo configurable via `controlGizmo/showMoveHandles` - Editor/Web: UI added for applying rounded corners to rectangle and polygon shapes Version 1.10.4 Released: August 21, 2024 -------------------------------------------------- **Breaking Changes** **Non Breaking Changes** - CESDK: Unsupported filetypes are handled during upload Version 1.32.0 Released: August 6, 2024 -------------------------------------------------- **Breaking Changes** - Editor/Web: The configuration `config.ui.elements.libraries.insert.entries`, `config.ui.elements.dock.groups` and `config.ui.elements.dock.defaultGroupId` is now deprecated in favor of the new Asset Library Entry and Dock APIs. During this deprecation phase `config.ui.elements.libraries.insert.entries` is still called but with a slightly different behavior. Instead of being called repeatedly with the current context (like the selected block), it is now called only once while the editor initializes. Most use-cases should not be affected by this breaking change, but if you rely on this behavior you need to migrate to the use of the Asset Library Entry and Dock APIs and change the dock in a selection subscription. - Editor/Web: The configuration `config.ui.elements.libraries.replace.entries` is now deprecated in favor of the new Asset Library Entry API and `cesdk.ui.setReplaceAssetLibraryEntries`. Until it is removed, `config.ui.elements.libraries.replace.entries` will still be called and migrated to return IDs of entries that should be available via the Asset Library Entry API. If an entry is returned with an ID that is not present in the store, it will be added. If the returned entry differs from the store, a warning will be printed. **Non Breaking Changes** - Engine: Added `fade` properties to the `slide`, `blur` and `crop_zoom` animations. - Engine: Reduced the fade duration of the `pop` animation to half of the total animation duration. - Editor/Web: Introduces `addPlugin` method to add a plugin to the editor - Engine: Introduces `addPlugin` method to add a plugin to the engine - Engine: Added a "Trim" default edit mode. - Engine: The setPlaying API now only changes the current edit mode if it is being called on a page block. - Editor/iOS: Added voiceover. - Editor/iOS: Audio thumbnails now display the correct waveform from the audio. - Editor: Fixed resizing of multiple selected elements in scenes that have pixel as design unit. Pixel snapping is disabled in that case to not resize the individal elements differently. - Engine: Fixed that the enabled option was not being serialized for effects and therefore disabled effects were enabled after loading. - Engine: Fixed that text lines or words could be accidentally clipped off if in a tight frame due to floating point precision limitations. - Editor/Web: Multiple APIs to customize the web editor are now public (see customization documentation for further details): `registerComponent`, `setDockOrder`, `getDockOrder`, `setInspectorBarOrder`, `getInspectorBarOrder`, `setCanvasMenuOrder`, `getCanvasMenuOrder`, `setNavigationBarOrder`, `getNavigationBarOrder`, `setCanvasBarOrder`, `getCanvasBarOrder`, `addAssetLibraryEntry`, `updateAssetLibraryEntry`, `removeAssetLibraryEntry`, `getAssetLibraryEntry`, `findAllAssetLibraryEntries`, `setBackgroundTrackAssetLibraryEntries`, `getBackgroundTrackAssetLibraryEntries`, `setReplaceAssetLibraryEntries` and `addIconSet`. - Editor/iOS: Disabled auto-correct on text blocks to prevent rare crashes Version 1.31.0 Released: July 18, 2024 -------------------------------------------------- **Breaking Changes** - Editor/Web: The minimum required web browser versions have been updated to Firefox 115, Safari 15.6, Chrome 114, Edge 114. - Engine/Web: The minimum required web browser versions have been updated to Firefox 115, Safari 15.6, Chrome 114, Edge 114. - Engine/Swift: Packages for Apple platforms are now built with Xcode 15.4 and Swift 5.10, which is the new minimum requirement for using them. - Editor/Swift: Packages for Apple platforms are now built with Xcode 15.4 and Swift 5.10, which is the new minimum requirement for using them. **Non Breaking Changes** - Engine: Local asset sources and scene asset sources support allow sorting of the result, see [docs](https://img.ly/docs/cesdk/engine/api/assets/)). - Engine: When duplicating a block, the duplicate's name will be unique. (i.e. "block-name (2)", "block-name (3)", etc.) - Engine: Deprecated the `hasFill`, `hasContentFillMode`, `hasShape`, `hasCrop`, `hasOpacity`, `hasBlendMode`, `hasEffects`, `hasBlur`, `hasBackgroundColor`, `hasStroke`, `hasDropShadow`, `hasPlaceholderBehavior`, `hasPlaceholderControls`, `hasDuration`, `hasTimeOffset`, `hasTrim`, `hasPlaybackTime`, `hasPlaybackControl` APIs and replaced them with equivalent APIs with a `supports` prefix instead of `has` for better readability and clarity of functionality. These APIs return whether a specific functionality is generally supported by a given block. - Engine: Deprecated the `hasEffectEnabled` API. All effects can be enabled and disabled. - Engine: Clipping is temporarily disabled when editing crop to give more context to the user. - Editor/Web: Add auto size and layout updates to advance text updates - Editor/iOS: Added advanced text options. - Editor/Android: Advanced text format options are now directly accessible at the first level. - Editor/Android: Added text frame behaviour "Auto Size" to text format options, allowing text frames to automatically adjust their size based on the content. - Editor/Android: Added text format options for font family weight/style, text casing, and paragraph spacing - Editor/Android: Added audio preview in asset library. - Engine: Added `createAnimation` API for creating new animation objects. - Engine: Added `supportsAnimation` API for checking whether a block supports animations. - Engine: Added `setInAnimation`, `setLoopAnimation`, and `setOutAnimation` APIs for assigning animation objects to a design block. - Engine: Added `getInAnimation`, `getLoopAnimation`, and `getOutAnimation` APIs for querying the currently assigned animation objects of a design block. - Engine: Added Slide, Pan, Fade, Blur, Grow, Zoom, Pop, Wipe, Baseline, Crop Zoom and Spin _In_ / _Out_ animations. - Engine: Added Spin, Fade, Blur, Pulsating, Breathing, Jump, Squeeze, Sway _Loop_ animations. - Editor/Web: Introduced a new User Interface API to register and control custom dialogs. - Editor/iOS: Fixed the initial the text cursor position after entering text editing mode. - Editor: Content fill mode 'Contain' is now maintained when changing the frame with the edge handles. Before it was changed to 'Crop'. - Engine: Setting a crop rotation with `setCropRotation` on elements with content fill modes 'Contain' and 'Cover' is now possible. Before, the fill mode was automatically changed to 'Crop'. For fill mode 'Contain', the output changes accordingly, for 'Cover' and 'Crop' it stays the same. - Engine: Setting a crop flip with `flipCropHorizontal` or `flipCropVertical` on elements with content fill mode 'Cover' is now possible. Before, the fill mode was automatically changed to 'Crop'. The output stays the same. - Engine: The property `image/fill/sourceSet` now keeps its sources sorted by width. - Engine: A new function `addImageFileURIToSourceSet` allows adding a new source to a source set property. - Engine: The property `image/fill/imageFileURI` is deprecated. Use `getSourceSet(block, "fill/image/sourceSet", sourceSet)` instead. - Editor/Web: fix an issue where an error is thrown when switching between different video scenes. - Editor/Web: Asset library animates only its opacity and removes the subtle shift animation. Version 1.30.0 Released: July 3, 2024 -------------------------------------------------- **Breaking Changes** **Non Breaking Changes** - Editor/Android: Added `PhotoEditor`. - Editor/iOS: Added corner radius for rect and polygon shapes, images and videos. - Engine: Added an asset source with id 'ly.img.scene.colorss' that automatically provides all used colors in the current scene. - Editor/Web: When setting the `ui.elements.libraries.insert.backgroundTrackLibraryEntries` is set to an empty array, the add clip button will not be shown in the video UI - Editor/iOS: Added audio preview in asset library. - Editor/Web: Fix generated CSS theme tokens popover overflowing on small viewports - Engine: Fixed that changed scopes could get reset on undo/redo - Editor/Web, Engine/Web: Video export in a web worker supports custom URL resolvers now. This requires that the custom resolver does not reference any variables outside of its scope. The resolver function will receive the default resolver as its second argument. Version 1.29.0 Released: June 20, 2024 -------------------------------------------------- **Breaking Changes** - Engine: Always allow camera movement for adopters in existing scenes and make that the default for newly created scenes. If you rely on the `layer/move` scope of the camera block, this version will force that scope to be set to be enabled. - Engine/Android: `BlockApi.export` now returns `ByteBuffer` instead of `ByteArray`. - Engine/Android: `BlockApi.exportWithColorMask` now returns `ByteBuffer` instead of `ByteArray`. - Engine/Android: `BlockApi.exportVideo` now returns `ByteBuffer` instead of `File`. - Engine/Android: `SceneApi.saveToArchive` now returns `ByteBuffer` instead of `ByteArray`. - Engine/Android: `EditorApi.getBufferData` now returns `ByteBuffer` instead of `ByteArray`. - Engine/Android: `EditorApi.setBufferData` now accepts `ByteBuffer` instead of `ByteArray`. **Non Breaking Changes** - Editor: Pages can now optionally be cropped, resized, moved, and rotated with editor handles or gestures if allowed by scope, the scene layout, and the newly introduced [page settings](https://img.ly/docs/cesdk/engine/api/editor-settings#pagesettings). - Engine: Introduced new [page settings](https://img.ly/docs/cesdk/engine/api/editor-settings#pagesettings) to control if pages can be transformed with handles (if allowed by scope and the scene layout): `'ubq://page/allowCropInteraction'`, which is enabled by default and `'ubq://page/allowRotateInteraction'`, , `'ubq://page/allowResizeInteraction'`, and `'ubq://page/allowMoveInteraction'`, which are disabled by default. - Engine: Fixed scale `touch/pinchAction` in crop mode to not require `layer/resize` but `layer/crop` scope. - Editor/Android: `LibraryCategory` now accepts an optional parameter `isHalfExpandedInitially` that configures whether the bottom sheet of assets should be displayed half-expanded or fully expanded initially. Default value is `false`. - Editor/iOS: Added `PhotoEditor`. - Editor/Web: Update icons to updated 24px version - Editor/Web: Improve the titles on the audio clips in the video timeline. - Editor/Android+iOS: Fixed that a touch pinch crop gesture on an image with a non-zero straighten value could lead to an invalid crop. - Editor/Web: Fix an issue where if a video or an audio is replaced with a shorter one, the duration of the clip is not updated. - Engine: New functions to load a scene from an archive, and to save and load block to an archive. - Engine: PDF exports can now make use of the GPU to accelerate image filter processing. - Editor: Fixed a snapping issue on mobile devices where the snapping while changing the size of an element could sometimes be slightly off making it hard to achieve the desired size. - Editor/Web: Fix some icons in timeline and dashboard being rendered too large Version 1.28.0 Released: June 6, 2024 -------------------------------------------------- **Breaking Changes** - Editor/iOS: `AssetLibrary` protocol requires an `elementsTab` property. - Editor/Web, Engine/Web, Editor/Node: Removes default asset sources from the release folder. If you have served our assets with your own server and use the default asset sources, you need to download the default asset source zip (https://cdn.img.ly/assets/v3/IMGLY-Assets.zip) **Non Breaking Changes** - Engine: Added corner rounding to the rectangle and polygon shapes, see `cornerRadius` properties [here](https://img.ly/docs/cesdk/engine/api/block-shape-types/). - Editor/iOS: Fixed `VideoEditor` was uploading images to video upload asset source instead of image upload asset source. - Editor/iOS: Fixed zoomed image in crop mode was accidentally reset when using the straighten slider. - Editor/Web: Fix an issue where the `context.group` passed to the `onUpload` callback doesn't reflect the actual group ID where the file is being uploaded. - Engine/Swift: Fixed potential data race for `applyAsset` and `applyAssetToBlock` closures of `AssetAPI.addLocalSource`. - Editor/Web: Fix a performance issue when page titles are enabled in the video editor. - Engine: Add support for more WAV files. - Engine: Fix a transformation issue with some videos sent via WhatsApp. - Editor/Web: Fix an issue where clicking reset duration in the trim inspector throws an error - Editor/Web: Display a blue overlay in the trim inspector if the clip exceeds the full video duration - Editor/Web: Fixed a bug where panels cannot be fully used on small viewports. Version 1.27.1 Released: May 23, 2024 -------------------------------------------------- **Breaking Changes** **Non Breaking Changes** - Editor/Web: Fix an issue where the `context.group` passed to the `onUpload` callback doesn't reflect the actual group ID where the file is being uploaded. - Editor/Web: Fix a performance issue when page titles are enabled in the video editor. Version 1.26.1 Released: May 22, 2024 -------------------------------------------------- **Breaking Changes** **Non Breaking Changes** - Editor/Web: Fix an issue where the `context.group` passed to the `onUpload` callback doesn't reflect the actual group ID where the file is being uploaded. Version 1.27.0 Released: May 21, 2024 -------------------------------------------------- **Breaking Changes** - Engine/Android: Bump minSdk support from 23 (Android 6) to 24 (Android 7) **Non Breaking Changes** - Engine: Support playback of WAV audio files. - Editor: Fix an issue where the uploaded audio files don't have a thumbnail when using `localUpload` - Editor: Fix missing german translation in our demo audio asset source - Engine: Fixed the issue of text blocks using the fallback font for a moment whenever a new font is selected that is not yet loaded. - Engine: Fixed the previously inverted png compression level in the export options. 0 = no compression, 9 = max compression. - Engine: Fixed the resizeContentAware API to not change the child order of any of the blocks in the scene. - Engine: Process thumbnail rendering in request order and limit processing time per engine update to avoid UI freezes. - Editor/Web: Show milliseconds in the time stamps across our video Editor - Editor/Web: Render the video timeline below the panels as opposed to beside them to prevent layout break on smaller viewports.. Version 1.26.0 Released: May 7, 2024 -------------------------------------------------- **Breaking Changes** - Engine: APIs that perform edits now throw errors if the corresponding scopes are not available (either globally or on the block). In order to disable these checks in all APIs, call `setSettingBool('checkScopesInAPIs', false)`. Otherwise, you must use the `isAllowedByScope` API to check whether all required scopes are available before calling APIs. **Non Breaking Changes** - Editor: Text elements with auto-height or auto-width can now be changed in height and width with the resize handles. The mode will switch to fixed-width. - Editor/Web: Add document colors library to color panel - Engine: Add buffer API: - `EditorAPI.createBuffer` - `EditorAPI.destroyBuffer` - `EditorAPI.setBufferData` - `EditorAPI.getBufferData` - `EditorAPI.setBufferLength` - `EditorAPI.getBufferLength` - Engine: Audio blocks can now play raw audio data from referenced buffers - Editor: Fix an issue where the canvas action menu is shown on the canvas when an audio element is selected - Engine: Fix an issue where audio from videos that were excluded from the export was still included in the export. - Engine: Fix an issue where video thumbnails would not show up after switching graphics contexts. - Editor/Swift: Resolved an issue that made scenes appear small before being adapted to the proper device size. - Editor/Swift: Fix potentially corrupted history that might have erased scene changes done in `onCreate`. - Editor/Swift: Enhanced the video editor timeline with smooth animations for showing or hiding elements. - Editor: Fix an issue where the close button of the trim inspector doesn't work - Editor: Fix an issue where the editor stays in crop-mode after closing the crop inspector - Editor: Improved the design and interaction areas of resize, rotation, move, and crop handles. - Editor/Swift: Add support for `Recolor` and `Green Screen` effects - Engine/Swift: Change default assets' CDN path from `https://cdn.img.ly/assets/v2` to `https://cdn.img.ly/assets/v3` - Engine/Swift: Added `PrivacyInfo.xcprivacy` containing information on the data collected by the SDK. - Engine/Web: Add `getState` and `setState` to manually set the state of a block to `Pending`, `Error` or `Ready`. Add `subscribeToBlockState` to be notified of a block's change of state. - Editor/Web: Fixed moving and resizing of elements to be not in sync with the mouse when more than one page is shown and the zoom level is below 100%. - Editor: Improve the way the seconds and ticks are calculated and displayed on the video timeline - Editor: Increase the zoom range of the video timeline - Editor: Update the initial scale of the clips in the video timeline - Editor: Clips in the video timeline will now adjust to different scaling configurations - Editor: Fix `Add Clip` button is not adjusting to its label length - Editor: Introduce a `Fit View` zoom control into the video timeline that will automatically adjust the zoom level to fit the view when pressed **Fonts** - Engine: Added `BlockAPI.canToggleBoldFont` and `BlockAPI.canToggleItalicFont` that return whether the specified range of a given text block can be toggled between a bold and normal weight or a normal and italic style, based on whether the corresponding font is part of the typeface that is currently used by the text block. - Engine: Added `BlockAPI.toggleBoldFont` to toggle a text block between the normal and bold fonts of its current typeface. - Engine: Added `BlockAPI.toggleItalicFont` to toggle a text block between the non-italic and italic fonts of its current typeface. - Engine: Added `BlockAPI.setFont` to allow the font of a text block to be changed. - Engine: Added `BlockAPI.getTypeface` for querying the typeface that is currently used by a text block. - Engine/Android: Added a new default asset source: `DefaultAssetSource.TYPEFACE`. - Engine/Swift: Added a new default asset source: `DefaultAssetSource.typeface`. - Engine: Changed the FontWeight string `Light` to `light` to be consistent with the other enum cases. - Engine: Moved the definition of font assets from extension packs to asset sources. - Editor: Deprecated the registration of custom fonts via the editor configuration. Create a custom asset source instead and define the `meta.typeface` object of each typeface asset. A typeface consists of a `name` (the font family name) and a list of all fonts that belong to this typeface. - Engine: Replaced extension packs used by the Java bindings with asset sources. You now have to provide JSON strings containing the asset source definitions when initializing the CESDK Java instance. See the updated Java binding example app README for more details. - Engine: The `text/fontFileUri` property is now read-only. In oder to change the font of a text block, the new `setFont` API must be used. - Editor/Android: Class `TextAssetSource` now also requires a new parameter `typeface: Typeface`. - Editor/Swift: Class `TextAssetSource` now also requires a new parameter `typeface: Typeface` or needs to be initialized async. Version 1.25.0 Released: April 23, 2024 -------------------------------------------------- **Breaking Changes** **Non Breaking Changes** - Editor/Android: Add support for `Recolor` and `Green Screen` effects - Editor/Android: Change assets' cdn path from `https://cdn.img.ly/assets/v2` to `https://cdn.img.ly/assets/v3` - Engine: Fixed generating cutouts from flipped blocks not taking flip into account - Engine: Allow alignment of elements within a track. - Editor/Web: Fix asset library card labels all referencing to first item in collection - Camera/Swift: Fixed a flash problem when the app transitions to the background and then returns to the foreground. - Camera/Swift: Fixed a flash problem that occurred when switching the camera mode from dual to single. - Editor/Web: Fix canvas menu layout bugs - Editor/Swift: Adjust UI behavior for reordering elements in Z position. - Editor/Swift: Hide reorder buttons for fixed elements such as audio tracks. - Editor: Fix an issue where the trim inspector stays open after replacing a video - Editor/Swift: Resolved an issue preventing users from trimming the same track after undoing a trim operation. - Editor/Web: Fix ungrouping elements always focusing the first page - Engine: Fixed `SceneAPI.getCurrentPage()` to also return pages that have an image fill. - Editor/Web: Add audio preview player to audio assets - Engine: Fix a PDF export issue where images would have a low resolution or wouldn't be included when using more than one page. - Editor: Pause the video playback when adding a new block from the asset library - Editor: Pause the video playback when editing - Engine: Removed the `role` enum setting and replaced it with dedicated `setRole`/`getRole` commands. Add `subscribeToRoleChange` method to register callbacks that are notified when the role changes. This can be used to configure the engine differently for individual editor roles. - Engine: Fixed colored shapes with transparency not rendered with transparency when exporting to PDF format. - Editor: Fix an issue where the video seeker stays at it's position when zooming and then jumps when interacting Version 1.24.0 Released: April 5, 2024 -------------------------------------------------- **Breaking Changes** - Editor: When adding a video or an image to an empty scene through the asset library, they will now be added as background clip **Non Breaking Changes** - Editor: Updated the icon of the `Set as Background` action in the context menu and changed the label to `Set as Clip` - Editor: Updated the icon of the `Detach from Background` action in the context menu and changed the label to `Set as Overlay` - Editor: Added a new `Mute/Unmute Volume` action for audio and video clips in the context menu - Editor: Added a new `Trim` action for audio and video clips in the context menu - Editor: Fix an issue where the context menu appears at the top corner of the window when scrolling the timeline while the context menu of a clip is open - Editor: Change the label of the add button in the timeline to `Add Clip` - Editor: Make the `Add Clip` button in the video timeline more prominent - Engine: Improved resizing of groups and video tracks when applying content aware resizing. - Editor: Separators are not rendered between every menu item but only between certain "groups" - Engine: Add `EditorAPI.findAllScopes` API to retrieve a list of all available scopes. - Editor: Undoing other image adjustments does not revert previously activated blur in certain situations - Editor: Update the Clips in video timeline to use the `MM:SS` format as a time stamp - Editor: Fix some incorrect color tokens in the video timeline - Editor: Video playback now stops automatically when entering crop mode or text editing. - Editor: To make it more obvious, which handle is interacted with, resize, rotation, move, and crop handles are now highlighted when hovered and dragged and other handles handles are hidden. - Editor: Added the setting `handleFillColor` for changing the fill color of handles, see [editor settings](https://img.ly/docs/cesdk/engine/api/editor-settings/#settings). - Editor/Web: Add Recolor & Greenscreen effects - Editor: Fix an issue where the canvas jumps when trying to replace an image placeholder in adopter mode Version 1.23.0 Released: March 26, 2024 -------------------------------------------------- **Breaking Changes** - Editor: When adding a video or an image to an empty scene through the asset library, they will now be added as background clip - Editor: By default, all panels now open on the left hand side and are fixed - Engine/Swift: Packages for Apple platforms are now built with Xcode 15.1 and Swift 5.9, which is the new minimum requirement for using them. - Editor/Swift: Packages for Apple platforms are now built with Xcode 15.1 and Swift 5.9, which is the new minimum requirement for using them. **Non Breaking Changes** - Engine: Add `BlockAPI.generateAudioThumbnailSequence` API to generate data for drawing audio wave patterns. - Editor: Improved the idle performance. - Editor: Improved resizing, elements can be resized by dragging the edge instead of only the resize handle. - Editor: UI can now show editable color properties in the 'Effects' panel. - Editor: Fixed the selection of elements with touch input not being possible for elements that have another element under it that was selected before. - Editor: Improved double-tap detection on touch devices. - Editor: Fix dropped canvas menu items for entering/selecting a group - Engine/Swift: Fixed cursor and selection interaction during on-canvas text editing in iOS 17 - Engine: `BlockAPI.fillParent` now uses the parent's parent if the parent is a `//ly.img.ubq/track` or `//ly.img.ubq/group`. Version 1.22.0 Released: March 12, 2024 -------------------------------------------------- **Breaking Changes** - Engine: When applying boolean 'intersection' on elements, the order of operation is reversed to have the fill of the bottom-most instead of the top-most element in the result. - Editor: New color design tokens and button active state refactor **Non Breaking Changes** - Editor: The default position of the video timeline scroll is now at the bottom for foreground tracks - Editor: The video timeline will automatically scroll into an element when added to the timeline if it's out of view - Editor: Ungrouping a group keeps its childre selected - Engine: Fixed strokes on sharp edges beeing cut off too early, e.g., on very pointy star shapes. - Engine: Addressed an issue where using the video export web-worker in certain scenarios could lead to CSP issues. - Engine: Fix an issue where elements detached from background were ordered behind the background when using `SceneAPI.createFromVideo`. - Editor: Fix an issue where the time ticks from the video timeline ruler were not showing on initial load Version 1.21.1 Released: February 27, 2024 -------------------------------------------------- **Breaking Changes** **Non Breaking Changes** - Engine: fixed horizontally flipped blocks incorrectly showing up rotated by 180º in thumbnails - Engine: Fixed cases where the export may not wait for all fonts included in a text. - Engine: `resize`, `rotate`, `scale` now handle `//ly.img.ubq/track` blocks. Version 1.21.0 Released: February 22, 2024 -------------------------------------------------- **Breaking Changes** - Engine: Fixed depiction of SVG images with content exceeding the SVG viewport/viewbox. The outside content is now properly clipped. - Engine: Scenes in video mode are now structured differently. Instead of the scene forming a single timeline which plays each page in order, now every page has its own independent timeline. The APIs for querying and adjusting the playback time and for exporting videos have to be called on the page blocks. Audio blocks have to be parented to the page in which they should play, as opposed to being parented to the scene like they were before. - Engine: `BlockAPI.exportVideo` now requires a page block instead of a scene. - Engine: Remove `scene/defaultPageDuration` property. - Editor: Introduce a new and more advanced video timeline. **Non Breaking Changes** - Editor: Asset Library Cards configured with `cardLabelPosition = 'below'` are rendered correctly. - Editor: Additional UI configuration option `cardLabelTruncateLines` on type `AssetLibraryEntryView`. - Editor: Add shadow controls to inspector bar - Editor: Uploading an asset during replacement auto-applies it and auto-closes panel per default - Editor: Library sections are now scrollable - Editor: Added setting `camera/clamping/overshootMode`: 'Center' | 'Reverse' to control the camera clamping behavior for the `ClampCameraPosition`` API. - Engine: Cutout blocks no longer have a blend mode. - Engine: Added an editor API for querying the export size limit on the current device: `getMaxExportSize()`. - Engine: Added export options to generate an underlayer when exporting to a PDF file. - Engine: Fixed a bug that could lead to infinitely delayed exports when trying to export a block hierarchy containing a non-exportable block. - Editor: Fixed sporadic scene loading error introduced in version v1.19.0. - Engine: Ensure block destroyed events are sent to subscribers after `loadScene` to prevent invalid access to deleted elements from the previous scene. - Editor: Fix range inputs (aka slider) not working properly if inline text editing is active - Engine: (Web/video) Fix a leak where we wouldn't free unused video textures. - Engine: `generateVideoThumbnailSequence` now also accepts arbitrary design blocks that are children of pages. - Engine: Deprecated the `getTotalSceneDuration` API. Instead, the `getDuration` API should be called and passed a page block. - Engine: Update the supported Unicode version from 14.0 to 15.1 - Editor: Fixed on-canvas text input composition for Korean text in the Web editor - Editor: Adds an API to add, update and dismiss notifications - Editor: Canvas menu items "Delete" and "Duplicate" have icons only now - Engine/Swift: Fixed `BlockAPI.scale(_:,to:,anchorX:,anchorY:)` would ignore `anchorX` and `anchorY`. - Engine/Android: Added `onPreExport` callback to all `BlockApi.export*` functions. - Engine/Swift: Added `onPreExport` closure to all `BlockAPI.export*` functions. - Engine/Swift: Fixed memory leak for video exports. - Engine/Swift: Fixed URL resolver for video exports. - Engine: Added a `//ly.img.ubq/track` design block whose purpose it is to automatically adjust the time offsets of its children based on their duration so that they play one after another without gaps in the timeline. - Engine: Add `BlockAPI.isVisibleAtCurrentPlaybackTime`. - Editor: A new `ui.elements.libraries.backgroundTrackLibraryEntries` configuration option which allows to configure which library entries should be shown when opening and insert library panel for background clips in video mode. - Engine: Improve audio support for QuickTime video files. Version 1.20.0 Released: January 25, 2024 -------------------------------------------------- **Breaking Changes** - Editor: The distributed file for the CE.SDK (`@cesdk/cesdk-js` package on npm) has changed from the CommonJS to the ECMAScript Module format. This means: - If you've been using the CE.SDK from your own `node_modules` folder in combination with a bundler, nothing should change for you. The bundler will process the module as before. - If you were loading our CDN version directly into your web page, and then accessing the `CreativeEditorSDK` global variable, we instead recommend to either change your script to ECMAScript module, or use the `import()` function to load the `CreativeEditorSDK`: ```html ``` ```html ``` - Engine: Fixed visual glitches in the following effects: "Pixelize", "Radial Pixel", and "Dot Pattern" - Engine: We've added a new feature called `sourceSet` to image fills. This lets you use a group of images, each with different sizes, to draw the image. The engine will pick the best size and load it as needed. You can learn more about this in [the guide](https://img.ly/docs/cesdk/engine/guides/source-sets/). Remember, if you have a `fileImageURI`, the `sourceSet` will take precedence. If your code changes the `imageFileURI`, you need to update it to work with the `sourceSet` as well. - Editor: We've updated our Unsplash and Demo sources. They now come with a full set of images in different sizes. This means that any block you create using an image from these sources will automatically have its `sourceSet` property populated. **Non Breaking Changes** - Engine: Exported TGA images now include an alpha channel. - Editor: Assets from the asset library can now be dragged on the canvas to apply the asset - Editor/Web: Fix potentially corrupted video export. - Editor: Added new settings to configure how the page title is displayed, see [documentation](https://img.ly/docs/cesdk/engine/api/editor-settings?language=javascript&platform=web#pagetitlesettings). - Editor: Adds `setPanelPosition` to the UserInterface API - Editor: Adds `setPanelFloating` to the UserInterface API - Editor: Adds options to `openPanel` to override position and floating settings - Editor: CanvasMenu component border color uses token `--ubq-border-default` and has box shadow added. - Editor/Engine: Using a web worker for video exports - Engine: Added mousewheel support The CreativeEngine canvas now supports mouse wheel events on the canvas to scroll and zoom the scene. The CreativeEngine instance gained a new method, `setWheelEventTarget`, which can be used to reinstall the event listener on another DOM element. This can be useful for situations where custom DOM elments are positioned on top of the canvas. Two engine settings have been added to enable/disable scrolling and zooming: `mouse/enableZoom` and `mouse/enableScroll`, both default to true. - Engine: Removed arbitrary strings for engine settings from the TypeScript definitions. Passing arbitrary strings to methods such as `setSettingBool` or `setSettingString` was never actually supported. The types have been adjusted to reflect that fact. - Editor/Engine: The Typescript types of the `getSetting`/`setSetting` methods in the EditorAPI have been made more strict: - Previously, Typescript allowed arbitrary strings as keys, which would have led to an error at runtime. These have been removed. - Support for prefixing settings keys with `ubq://` will be removed in a future version. The function signatures have been updates to provide a deprecation warning. - A few boolean settings not meant for public use have been removed. - Engine: Add support XAVC videos. - Engine/Editor: Add missing settings to the Typescript type definitions in the EditorAPI. Version 1.19.0 Released: December 13, 2023 -------------------------------------------------- Check our [migration guide](https://img.ly/docs/cesdk/introduction/migration_1_19/) for more details on the changes. **Breaking Changes** - The editor now sets all scopes directly for the selected target block. (Previously, the scope `content/replace` was set for the associated fill block instead.) - Use of the following scopes is being deprecated in favor of new, more granular scopes: - `content/replace` - Use a combination of `fill/change` and `text/edit` instead. - `design/arrange` - Use a combination of `layer/move`, `layer/resize`, `layer/flip`, and `layer/rotate` instead. - `design/arrange/move` - Use `layer/move` instead. - `design/arrange/resize` - Use `layer/resize` instead. - `design/arrange/flip` - Use `layer/flip` instead. - `design/arrange/rotate` - Use `layer/rotate` instead. - `design/style` - Use a combination of `layer/opacity`, `layer/blendMode`, `appearance/adjustments`, `appearance/blur`, `appearance/effect`, `appearance/filter`, `appearance/shadow`, `shape/change`, `stroke/change`, `fill/change`, and `text/character` instead. - Translations have been updated: - Removed the following keys: - `scope.content.replace` - `scope.design.arrange` - `scope.design.style` - Renamed the following keys: - `scope.design.arrange.flip` is now `scope.layer.flip` - `scope.design.arrange.move` is now `scope.layer.move` - `scope.design.arrange.resize` is now `scope.layer.resize` - `scope.design.arrange.rotate` is now `scope.layer.rotate` - Added the following keys: - `component.placeholder.appearance.description` - `component.placeholder.appearance` - `component.placeholder.arrange.description` - `component.placeholder.arrange` - `component.placeholder.disableAll` - `component.placeholder.enableAll` - `component.placeholder.fill.description` - `component.placeholder.fill` - `component.placeholder.general.description` - `component.placeholder.general` - `component.placeholder.shape.description` - `component.placeholder.shape` - `component.placeholder.stroke.description` - `component.placeholder.stroke` - `component.placeholder.text.description` - `component.placeholder.text` - `scope.appearance.adjustments` - `scope.appearance.blur` - `scope.appearance.effect` - `scope.appearance.filter` - `scope.appearance.shadow` - `scope.fill.change` - `scope.layer.blendMode` - `scope.layer.opacity` - `scope.shape.change` - `scope.stroke.change` - `scope.text.character` - `scope.text.edit` - Editor: Switched to using the new Graphic block for images, videos, shapes, etc… for a more unified experience across different design elements - Editor: Introduced a new Content Fill Inspector that allows switching the fill of Graphic blocks between video, image, and color - Editor: All of the Graphic blocks (shapes, images, videos, etc…) now support filters, effects, blurs and adjustments - Editor: UX/UI Improvements for both the Advanced and Default UI, as well as for the canvas actions - Engine: Replaced `image`, `sticker`, `shapes/rect`, `shapes/line`, `shapes/ellipse`, `shapes/polygon`, `shapes/star`, and `vector_path` blocks with a new, more composable `graphic` design block. Old scenes are automatically migrated when they get loaded. For a full list and detailed description of how to adapt to these changes, check out our [documentation](https://img.ly/docs/cesdk/js/to-v1-19-55bcad/) - Engine: Added optional `shapeType`, `fillType` and `kind` keys to our asset definitions. Fill type ids may not be set as the value of the `blockType` property any more. E.g. in order to create a video asset, `blockType` should now be set to `//ly.img.ubq/graphic` and `fillType` should be set to `//ly.img.ubq/fill/video`. - Engine/Web: Introduced new union types: - `DesignBlockTypesShorthand`, `DesignBlockTypesLonghand`, `DesignBlockTypes` for top-level design blocks. - `ShapeTypesShorthand`, `ShapeTypesLonghand`, `ShapeTypes` for shape blocks. - `FillTypesShorthand`, `FillTypesLonghand`, `FillTypes` for fill blocks. - `EffectTypesShorthand`, `EffectTypesLonghand`, `EffectTypes` for effect blocks. - `BlurTypesShorthand`, `BlurTypesLonghand`, `BlurTypes` for blur blocks. - `BlockTypesShorthand`, `BlockTypesLonghand`, `BlockTypes` for all blocks combined. - Engine/Web: The `create` API now expects an ID of type `DesignBlockTypes` instead `DesignBlockType`. - Engine/Web: The `createFill` API now expects an ID of type `FillTypes` instead of `string`. - Engine/Web: The `getType` API now returns an ID of type `BlockTypesLonghand` instead of `DesignBlockType`. - Engine/Web: The `findByType` API now expects an ID of type `BlockTypes` instead of `DesignBlockType`. - Engine/Web: The `createShape` API now expects and ID of type `ShapeTypes` instead of `string`. - Engine/Web: The `createEffect` API now expects and ID of type `EffectTypes` instead of `string`. - Engine/Web: The `createBlur` API now expects and ID of type `BlurTypes` instead of `string`. - Engine/Web: The `DesignBlockType` enum is now removed in favor of introducing a new alternative string-literal types that are more representative of our API signature. **Non Breaking Changes** - UBQ: Add `BlockAPI.isIncludedInExport` and `BlockAPI.setIncludedInExport` to allow blocks to be excluded from the export process without having to rely on the properties API. - UBQ: All Cutouts have the always on top attribute by default. - Engine: Added `createShape`, `hasShape`, `getShape`, `setShape` APIs for changing the shape of a design block. - Engine: Added the `graphic` design block with support for the new shape APIs. - Engine: Added `setKind`, `getKind` and `findByKind` APIs for categorizing different design blocks of the same type with custom string tags. - Engine: Added the `fill/changeType` scope to prevent unwanted fill type changes. - Placeholder Settings now feature more granular options. - Editor: Clickable area of a cutout is a stroke 6 pixels wide centered on its offset path. - Editor/Web: Fixed double clicks for entering crop mode and text edit mode not recognized on mobile browsers. - Editor: DPI input is available for pixel design unit as well - Engine: Add `BlockAPI.isTransformLocked`, `BlockAPI.setTransformLocked`, and the `transformLocked` property. - Engine: Fixed the image edge handles to scale the image around the center opposite handle instead of the corners. - Engine: Prevented crop edits via edge handles if cropping is not allowed for adopters. - Engine: Fixed color fill leak when duplicating `Text` elements resulting in massive scene file sizes. - Engine: When `DoubleClickSelectionMode` is set to `Direct`, hovering/clicking in the empty space within a group highlights/selects that group. - Editor: Fixed performance issue when playing back videos - Engine: Fix video support detection on Chrome for Windows. - Engine: Legal symbols (©, ®, ™) are no longer rendered as their emoji counterpart. - Editor: Pause video playback when selecting an element in the scene. - Engine: Lower memory usage when downscaling images to `maxImageSize`. - Engine: Fix MP4 videos that make use of edts and elst atoms. - Engine: Added mousewheel support The CreativeEngine canvas now supports mouse wheel events on the canvas to scroll and zoom the scene. The CreativeEngine instance gained a new method, `setWheelEventTarget`, which can be used to reinstall the event listener on another DOM element. This can be useful for situations where custom DOM elments are positioned on top of the canvas. Two engine settings have been added to enable/disable scrolling and zooming: `mouse/enableZoom` and `mouse/enableScroll`, both default to true. - Engine: Removed arbitrary strings for engine settings from the TypeScript definitions. Passing arbitrary strings to methods such as `setSettingBool` or `setSettingString` was never actually supported. The types have been adjusted to reflect that fact. - Editor/Engine: The Typescript types of the `getSetting`/`setSetting` methods in the EditorAPI have been made more strict: - Previously, Typescript allowed arbitrary strings as keys, which would have led to an error at runtime. These have been removed. - Support for prefixing settings keys with `ubq://` will be removed in a future version. The function signatures have been updates to provide a deprecation warning. - A few boolean settings not meant for public use have been removed. Version 1.18.1 Released: November 29, 2023 -------------------------------------------------- **Breaking Changes** **Non Breaking Changes** - Editor/Web: Fixed double clicks for entering crop mode and text edit mode not recognized on mobile browsers. - Engine: Fixed the image edge handles to scale the image around the center opposite handle instead of the corners. - Engine: Prevented crop edits via edge handles if cropping is not allowed for adopters. - Engine: When `DoubleClickSelectionMode` is set to `Direct`, hovering/clicking in the empty space within a group highlights/selects that group. - Engine: Lower memory usage when downscaling images to `maxImageSize`. - Engine: Fix video support detection on Chrome for Windows. Version 1.18.0 Released: November 6, 2023 -------------------------------------------------- > :warning: Important Disclaimer: _The features listed under "**Breaking Changes**" were inadvertently included in this release. These changes were originally scheduled for the upcoming `1.19.0` major release. We recommend updating to `1.18.1`, which contains the appropriate version without these changes._ **Breaking Changes** - Engine/Web: Introduced new union types: - `DesignBlockTypesShorthand`, `DesignBlockTypesLonghand`, `DesignBlockTypes` for top-level design blocks. - `ShapeTypesShorthand`, `ShapeTypesLonghand`, `ShapeTypes` for shape blocks. - `FillTypesShorthand`, `FillTypesLonghand`, `FillTypes` for fill blocks. - `EffectTypesShorthand`, `EffectTypesLonghand`, `EffectTypes` for effect blocks. - `BlurTypesShorthand`, `BlurTypesLonghand`, `BlurTypes` for blur blocks. - `BlockTypesShorthand`, `BlockTypesLonghand`, `BlockTypes` for all blocks combined. - Engine/Web: The `create` API now expects an ID of type `DesignBlockTypes` instead `DesignBlockType`. - Engine/Web: The `createFill` API now expects an ID of type `FillTypes` instead of `string`. - Engine/Web: The `getType` API now returns an ID of type `BlockTypesLonghand` instead of `DesignBlockType`. - Engine/Web: The `findByType` API now expects an ID of type `BlockTypes` instead of `DesignBlockType`. - Engine/Web: The `createShape` API now expects and ID of type `ShapeTypes` instead of `string`. - Engine/Web: The `createEffect` API now expects and ID of type `EffectTypes` instead of `string`. - Engine/Web: The `createBlur` API now expects and ID of type `BlurTypes` instead of `string`. - Engine/Web: The `DesignBlockType` enum is now deprecated and will be removed soon in favor of introducing a new alternative string-literal types that are more representative of our API signature. The usage of `DesignBlockType` should still be supported for most use cases until removed. **Non Breaking Changes** - Engine: Add `BlockAPI.fillParent` to quickly resize and reposition a block to match its parent. - Engine: Added `setAlwaysOnBottom` and `isAlwaysOnBottom` APIs. - Editor: Add contrast shadow to regular button variants - Editor: Fix dock audio icon scaling based on icon scale configuration - Editor: Fixed selection of inside strokes on shapes without a fill. - Editor: Fixed text selection to jump to first character when the mouse is placed on space between lines. - Engine: Fixed WOFF font support - Assets: The `ly.img.image` demo source now also defines a `previewUri` for each entry. Due to this, demo images will have a preview image when being added to the canvas. The entries use the existing thumbnail URIs. - Engine: Added `SceneAPI.getCurrentPage` to the current page, i.e., the nearest page to the center of the viewport. - Engine: Added `SceneAPI.findNearestToViewPortCenterByType` and `SceneAPI.findNearestToViewPortCenterByKind` to find the nearest block to the center of the viewport by type or kind. - Engine: Removed `trackActivePage` setting, which is now automatically determined. - Engine: Removed event of active page tag. - Engine: Added an asynchronous `supportsVideoExport` function, which does not only check for the presence of the required audio/video APIs, but also ensures that the export actually works. - Engine: All Cutouts have the always on top attribute by default. - Editor: Clickable area of a cutout is a stroke 6 pixels wide centered on its offset path. - Editor: Fixed performance issue when playing back videos Version 1.10.3 Released: October 26, 2023 -------------------------------------------------- **Breaking Changes** **Non Breaking Changes** - Backport of an emoji handling bugfix Version 1.10.2 Released: October 26, 2023 -------------------------------------------------- **Breaking Changes** **Non Breaking Changes** - Backport of an effect status propagation bugfix Version 1.17.0 Released: October 9, 2023 -------------------------------------------------- **Breaking Changes** - UBQ: Removed deprecated APIs: `setFillType`, `getFillType`, `setFillGradientType`, `getFillGradientType`, `addFillGradientColorStop`, `removeFillGradientColorStop`, `getFillGradientColorStops`, `setFillGradientColorStops`, `setFillGradientControlPoint`, `getFillGradientControlPointX`, `getFillGradientControlPointY`, `setFillGradientRadius`, `getFillGradientRadius`. - UBQ: Removed properties: `fill/gradient/type` and `fill/type`. **Non Breaking Changes** - UBQ: The WebP image format is now supported for import and export. - UBQ: Placeholder lines are now rendered in design space and their size has been adjusted for thumbnails. - UBQ: Fix adjustments rendering on Android Chrome. - UBQ/Swift: Fix malformed frameworks for macOS & Mac Catalyst. - CESDK: Fix canvas menu placement not overflowing other inputs anymore - CESDK: Change inspector bar input grouping from spacing to separators - UBQ: Replace granular color-specific APIs with a more generic approach, that eases interactions with colors. Add `get|setColor`, `get|setSettingColor`, `get|setDropShadowColor`, and `get|setStrokeColor` in favour of the color-space specific endpoints. Deprecate the following APIs: - `BlockAPI.getColorRGBA` -> Use `BlockAPI.getColor` instead - `BlockAPI.setColorRGBA` -> Use `BlockAPI.setColor` instead - `BlockAPI.setColorSpot` -> Use `BlockAPI.setColor` instead - `BlockAPI.getColorSpotName` -> Use `BlockAPI.getColor` instead - `BlockAPI.getColorSpotTint` -> Use `BlockAPI.getColor` instead - `BlockAPI.getBackgroundColorRGBA` -> Use `BlockAPI.getColor` querying the `"backgroundColor/color"` property instead - `BlockAPI.setBackgroundColorRGBA` -> Use `BlockAPI.setColor` modifying the `"backgroundColor/color"` property instead - `BlockAPI.setStrokeColorRGBA` -> Use `BlockAPI.setStrokeColor` instead - `BlockAPI.getStrokeColorRGBA` -> Use `BlockAPI.getStrokeColor` instead - `BlockAPI.setDropShadowColorRGBA` -> Use `BlockAPI.setDropShadowColor` instead - `BlockAPI.getDropShadowColorRGBA` -> Use `BlockAPI.getDropShadowColor` instead - `EditorAPI.setSettingColorRGBA` -> Use `EditorAPI.setSettingColor` instead - `EditorAPI.getSettingColorRGBA` -> Use `EditorAPI.getSettingColor` instead - CE.SDK: Display actual name as title in libraries if a translation is available - CESDK: Fix labels in color library not showing up in other languages - CESDK: Tooltips are not "dangling" anymore on touch devices - UBQ: Fixed the `getEnum` and `setEnum` APIs to work with nested properties. - CESDK: Fix Gradient button in color picker causes the gradient changes to reset back - CESDK: Fix HEX Color input stops reacting to changes when a 3-digit HEX is entered - UBQ/Web: fix H.264 videos that need a large frame re-order window. This issue manifested as videos running into timeout during loading. - CE.SDK: Panels now have consistend positioning of close and back buttons based on their configured position - UBQ: Fixed PDF page order on export when using the headless engine. - CE.SDK: Fix labels for entries in text library not shown after language has been switched in settings panel - UIKIT: Properly remove old theme and scale classes before adding current selected one - UBQ: Fix an issue where on scene load pages other than the first that only contain an image would show up with a loading indicator in their thumbnail. - UBQ: Fixed the initial cursor position when entering text mode via API being not always at the end of the text. - UBQ: Add `PixelStreamFill` and `BlockAPI.setNativePixelBuffer(id, buffer)`. Check [our guide](https://img.ly/docs/cesdk/engine/guides/using-camera/) for an introduction. - CESDK: Selection frame for placeholder elements only rendered purple for Creator roles - CE.SDK and UIKIT: Replace Overpass Mono with Inter Sans Serif for "Input M" design token Version 1.16.1 Released: September 14, 2023 -------------------------------------------------- **Breaking Changes** **Non Breaking Changes** - UBQ/Swift: Fix malformed frameworks for macOS & Mac Catalyst. Version 1.16.0 Released: September 8, 2023 -------------------------------------------------- **Breaking Changes** - UBQ: Replace granular color-specific APIs with a more generic approach, that eases interactions with colors. Add `get|setColor`, `get|setSettingColor`, `get|setDropShadowColor`, and `get|setStrokeColor` in favour of the color-space specific endpoints. Deprecate the following APIs: - `BlockAPI.getColorRGBA` -> Use `BlockAPI.getColor` instead - `BlockAPI.setColorRGBA` -> Use `BlockAPI.setColor` instead - `BlockAPI.setColorSpot` -> Use `BlockAPI.setColor` instead - `BlockAPI.getColorSpotName` -> Use `BlockAPI.getColor` instead - `BlockAPI.getColorSpotTint` -> Use `BlockAPI.getColor` instead - `BlockAPI.getBackgroundColorRGBA` -> Use `BlockAPI.getColor` querying the `"backgroundColor/color"` property instead - `BlockAPI.setBackgroundColorRGBA` -> Use `BlockAPI.setColor` modifying the `"backgroundColor/color"` property instead - `BlockAPI.setStrokeColorRGBA` -> Use `BlockAPI.setStrokeColor` instead - `BlockAPI.getStrokeColorRGBA` -> Use `BlockAPI.getStrokeColor` instead - `BlockAPI.setDropShadowColorRGBA` -> Use `BlockAPI.setDropShadowColor` instead - `BlockAPI.getDropShadowColorRGBA` -> Use `BlockAPI.getDropShadowColor` instead - `EditorAPI.setSettingColorRGBA` -> Use `EditorAPI.setSettingColor` instead - `EditorAPI.getSettingColorRGBA` -> Use `EditorAPI.getSettingColor` instead **Non Breaking Changes** - CESDK: Added unstable clamp camera position and clamp camera zoom APIs. - CESDK: Add `cardLabelPosition` for better easier positioning of the label in a asset library card - CESDK: Add `cardBorder` for enabling a border in a asset library card - UBQ/Android: Add `baseUri` as a parameter with a default value to the `Engine.addDemoAssetSources()` method. - UBQ: Setting the `defaultEmojiFontFileURI` to an empty string will now disable emoji rendering and force text rendering to use the non-emoji font for all glyphs. - CE.SDK: During video export suspend inactivity detection while tab is in the background. - UBQ: Fixed the `replaceText` API when the text contains variables. - CESDK: Add support for loading WASM and DATA from HTTP URLs (`config.core.baseUrl`) - CESDK: Remove purple flashing for placeholders - CESDK: Added multitouch support on the web for CE.SDK and the CreativeEngine. - CESDK: Introduces a new color inspector with support for multiple color palettes. - CESDK: Introduced support for CMYK colorSpace and Spot colors in our color pickers. - CESDK: It's now possible to add color libraries as asset sources. - CESDK: Introduced the new `ui.colorLibraries` configuration option to configure the asset sources for the color inspector. - CESDK: deprecated the `ui.colorPalettes` configuration option in favor of using asset sources. - UBQ/Web: fix H.264 videos that need a large frame re-order window. This issue manifested as videos running into timeout during loading. - CE.SDK: Fix labels for entries in text library not shown after language has been switched in settings panel - CESDK: Fix labels in color library not showing up in other languages Version 1.15.0 Released: September 1, 2023 -------------------------------------------------- **Breaking Changes** - UBQ: Split the permission to crop a block from `content/replace` and `design/style` into a separate scope: `layer/crop`. **Non Breaking Changes** - UBQ: Add `getKind`, `setKind` and `findByKind` block APIs. The "kind" of a block is a custom label that can be assigned to design blocks to give them semantics beyond their immutable type ID. - CESDK: Add `EditorAPI.findAllSettings`, `EditorAPI.getSettingType`, and `EditorAPI.getSettingEnumOptions`. - UBQ: When querying properties, nested properties like `scene/pageDimensions/width` and `page/margin/bottom` are also listed. - UBQ: The export function now fails with an error if a relevant asset fails to load. - UBQ: Fixed an issue where a video scene would start to flicker if the total scene duration was greater than 30s and the playback time would match the total scene duration. - UBQ: Fix orientation of video thumbnails generated by `BlockAPI.generateVideoThumbnailSequence`. - CE.SDK: Improve memory performance on older iOS devices - UBQ: Deprecated the `design/arrange` scope and renamed `design/arrange/move`, `design/arrange/resize`, `design/arrange/rotate` and `design/arrange/flip` to `layer/move`, `layer/resize`, `layer/rotate` and `layer/flip`. - UBQ: Deprecated the `content/replace` scope. For `//ly.img.ubq/text` blocks, it is replaced with the new `text/edit` scope. For other blocks it is replaced with `fill/change`. - UBQ: Deprecated the `design/style` scope and replaced it with the following fine-grained scopes: `text/character`, `stroke/change`, `layer/opacity`, `layer/blendMode`, `layer/visibility`, `layer/clipping`, `appearance/adjustments`, `appearance/filter`, `appearance/effect`, `appearance/blur`, `appearance/shadow` - UBQ: The deprecated scopes are automatically mapped to their new corresponding scopes by the scope APIs for now until they will be removed completely in a future update. - UBQ: Introduce `fill/change`, `stroke/change`, and `shape/change` scopes that control whether the fill, stroke or shape of a block may be edited by a user with an "Adopter" role. - CESDK: User interface API added to open/close panels - CESDK: Add callback as possible value for UI scale configuration - CESDK: Move color inputs from popovers to panels - CESDK: Relayout user interface based on viewport width - CESDK: Hide labels on canvas menu and some topbar inputs if there is no space - UBQ: Fix bug where serializing block from a scene with a certain design unit and deserializing them into a scene with a different design unit, the blocks would be rendered incorrectly. - CESDK: Asset panel uses full height on small viewports and small embeds - CESDK: Fixed highlighting frames occasionaly beeing stuck until mouse move when exiting text mode. - CESDK: Fixed touch-rotate gesture not triggering rotation in all cases. - UBQ: Fallback to video frame dimensions if video track dimensions are 0. - UBQ: Fallback to identity matrix if video transformation matrix is singular. Version 1.14.0 Released: July 21, 2023 -------------------------------------------------- **Breaking Changes** - UBQ/Android: Deprecated Android block API 'isPropertyWriteable' in favor of 'isPropertyWritable' to be consistent with iOS and web bindings. - UBQ/Swift: Moved `BlockAPI.getSpotColorForCutoutType` and `BlockAPI.setSpotColorForCutoutType` to `EditorAPI` - UBQ/Swift: Deprecated Swift scene API `load(fromString string: String, ...)` in favor of `load(from string: String, ...)`. - UBQ/Swift: Deprecated Swift scene API `load(fromURL url: URL,...)` in favor of `load(from url: URL, ...)`. - UBQ/Swift: Deprecated Swift scene API `applyTemplate(fromString string: String, ...)` in favor of `applyTemplate(from string: String, ...)`. - UBQ/Swift: Deprecated Swift scene API `applyTemplate(fromURL url: URL, ...)` in favor of `applyTemplate(from url: URL, ...)`. - UBQ/Swift: Deprecated Swift asset API `removeAsset(fromSource sourceID, ...)` in favor of `removeAsset(from sourceID, ...)`. - UBQ/Swift: Deprecated Swift asset API `addAsset(toSource sourceID, ...)` in favor of `addAsset(to sourceID, ...)`. - UBQ: Deprecated `BlockAPI.getVideoFillThumbnail`, `BlockAPI.getVideoFillThumbnailAtlas`, and `BlockAPI.getPageThumbnailAtlas` in favor of `BlockAPI.getVideoThumbnailSequence`. **Non Breaking Changes** - UBQ: Add `BlockAPI.getVideoWidth` and `BlockAPI.getVideoHeight`. - CESDK: Fix issue with exported PDFs as zips - CESDK: Fix audio trim seeker mispositioning - CESDK: Fix crop area possibly exceeding the content area when editing rotated crops with the edge handles. - UBQ: Introduce `placeholderBehavior/enabled` property, that allows controlling whether a block should behave like a placeholder. For text blocks, the flag triggers selection of the entire text upon first edit. - UBQ: Introduce `block.onClicked` subscription. - CESDK: Add a timeout to the video export to detect and handle an unresponsive `VideoEncoder`. - UBQ: Automatically correct some video rotation matrices with a translation - CESDK: Fix Asset Library upload not working correctly with groups - CESDK: Fix an issue where the selected page was appearing out of focus after undo/redo - CESDK/Swift: Add missing public `GradientColorStop.init` - CESDK: Fix an issue where the Windows 11 video encoder would insert duplicated frames, doubling the duration of the exported video. Version 1.13.1 Released: July 10, 2023 -------------------------------------------------- **Breaking Changes** **Non Breaking Changes** - CESDK/Swift: Add missing public `GradientColorStop.init` Version 1.13.0 Released: July 3, 2023 -------------------------------------------------- **Breaking Changes** - UBQ: An initial undo step is now always added after scene creation. If you previously manually added the initial undo state, this now no longer necessary. - CESDK: Remove configuration options A series of options have been removed from the configuration object that is passed into `CreativeEditorSDK.init` and `CreativeEngine.init`. For a full list and detailed description of how to adapt to these changes, check out our [documentation](https://img.ly/docs/cesdk/introduction/migration_1_13) - UBQ/CESDK: Typescript changes `ConfigTypes` has been removed from the `@cesdk/engine` package. For more information check out our [documentation](https://img.ly/docs/cesdk/introduction/migration_1_13#typescript) **Non Breaking Changes** - CESDK: Added `CreativeEditorSDK.create()` method for better customization of the init process. Also added `createDesignScene()`, `createVideoScene()`, and `createFromImage()` methods to the CE.SDK instance for setting up an initial scene after `create()`. - UBQ: Add `playback/timeOffset` and `playback/duration` properties to the following blocks: `shapes/ellipse`, `image`, `shapes/line`, `shapes/polygon`, `shapes/rect`, `shapes/star`, `sticker`, `vector_path`, `text` - CESDK: Fix empty tooltips on Align controls. - CESDK: Fix issue where using the `@cesdk/cesdk-js` module in certain contexts, such as Next.js or Create React App would render a warning about a failed `require('@emotion/is-valid-prop')`. - UBQ: Fix exported videos not playing in some video players - UBQ: Group children are no longer tied to the groups arrange scopes. For the `arrange/move` scope, a fallback to the group is made in adopter mode, allowing to move the entire group along with the child. This only applies, if the group has the scope, but the child does not. - CESDK: Added path-based selection for precise selection of shapes, vector paths, etc. - UBQ: Fix memory leak in Node environments Version 1.12.2 Released: June 30, 2023 -------------------------------------------------- **Breaking Changes** **Non Breaking Changes** - CESDK: Fix Typescript circular dependency error for config types Version 1.12.1 Released: June 12, 2023 -------------------------------------------------- **Breaking Changes** **Non Breaking Changes** - UBQ: Fix exported videos not playing in some video players Version 1.12.0 Released: June 2, 2023 -------------------------------------------------- **Breaking Changes** - UBQ: Improved the resizing behavior of `sceneAPI.applyTemplateFromString` and `sceneAPI.applyTemplateFromURL`. If the target size is different from the template size, the resulting layout might change to better fit the target size. **Non Breaking Changes** - CESDK: Providing asset sources via `config.assetSources` has been deprecated and will be removed completely in a future version. Please use the AssetAPI to add asset sources instead. - UBQ: Add `BlockAPI.isDistributable`, `BlockAPI.distributeHorizontally`, and `BlockAPI.distributeVertically`. - UBQ: Add `blockAPI.resizeContentAware` to resize blocks and fit their content, the same as`applyTemplate...` does for resizing pages. - CESDK: Providing variable definitions via `config.variables` or `cesdk.setVariableDefinitions` has been deprecated and will be removed completely in a future version. Please use the VariableAPI to configure placeholder variables instead. - CESDK: The `config.defaultFont` key has been moved from the CreativeEngine to the CreativeEditorSDK, since it is not used in the CreativeEngine. - CESDK: The `config.callbacks.log` key has deprecated and will be moved to `config.logger` in the future. The `LogLevel` enum has been deprecated and will replaced with a string union. - CESDK: Fix a bug in sliders of effects 'Radial Pixel' and 'Tilt Shift'. - CESDK: Fix a bug which resulted in the options menu button inside a timeline audio element to overlap the left handle preventing it from being used. - CESDK: Add a paragraph spacing option to the text block. - CESDK: Fix timeline seeker time label overlapping with seeker head. - CESDK: Fix a bug with some sliders not updating on undo/redo. - CESDK: Add clipping controls to advanced text subinspector. - CESDK: Fix a bug with audio clips moving around when zooming the timeline. - UBQ: Fix clipped lines of text to not contribute to the vertical alignment. - CESDK: Add 'Distribute' actions to Default UI and Advanced UI. - CESDK: 'Move & Align' dropdown in Default UI, and 'Move' dropdown in Advanced UI, have been labeled 'Position' to address new functionality. - CESDK: Added translation keys 'action.align.elements', 'action.align.toPage', 'action.position', 'action.distribute', 'action.distribute.horizontally', 'action.distribute.horizontally.description', 'action.distribute.vertically', and 'action.distribute.vertically.description'. - CESDK: Update move/arrange action translations - CESDK: Fix inspector bar change in height if scrollbar is being displayed. - CESDK: Fix sub inspector not having a border based on the panel alignment configuration. - UBQ: Set the text fill color to the color of the last remaining text run before the run is deleted. - UBQ: Add `getTextCursorRange` API for querying the cursor position during text editing. - CESDK: Prevent style inheritance overwriting internal styling - UBQ: Fix cases where changing a text blocks text would cause it to loose its font. Version 1.11.1 Released: May 17, 2023 -------------------------------------------------- **Breaking Changes** **Non Breaking Changes** CESDK: Fix crash when adding text block UBQ: Fix design unit conversion for Cutout blocks UBQ: Fix export for selected Cutout blocks UBQ: Fix text variable handling for range-based APIs Version 1.11.0 Released: May 10, 2023 -------------------------------------------------- See the [announcement post](https://img.ly/blog/creative-editor-sdk-v_1_11_0-release-notes/) for details on features. **Breaking Changes** - UBQ: Made the `timeOffset`, `duration`, and `framerate` parameters of the `BlockAPI#exportVideo` function optional. - UBQ: Renamed `SceneAPI.unstable_getDesignUnit` and `SceneAPI.unstable_setDesignUnit` into `SceneAPI.getDesignUnit` and `SceneAPI.setDesignUnit` - UBQ: `SceneAPI.setDesignUnit` now accepts `"Pixel"`, `"Millimeter"` or `"Inch"` as arguments instead of `"px"`, `"mm"` or `"in"` - UBQ: `SceneAPI.getDesignUnit` now returns `"Pixel"`, `"Millimeter"` or `"Inch"` as values instead of `"px"`, `"mm"` or `"in"` - UBQ/Swift: Renamed first parameter of the `SceneAPI.create` method from `from imageURL: URL` to `fromImage url: URL` to differentiate between the image and the video variant - CESDK: Removal of the `scene` config option. You can set a scene's `dpi` and `pixelScaleFactor` via the BlockApi's `setInt(sceneId, 'scene/dpi', dpi)` and `setInt(sceneId, 'scene/pixelScaleFactor', factor)`. - UBQ/Android: Color which used to represent RGB color has now become a sealed interface and has two implementations: `RGBAColor` and `SpotColor` **Non Breaking Changes** - CESDK: Notifications have been redesigned. They always align to the bottom right edge now and are using updated design tokens to increase their visibility - CESDK: Fix an issue where dragging from the canvas outside the browser window could put the mouse input system into an undefined state - CESDK: Fix inspector headings not being truncated properly if their content is too long to fit the visible space - UBQ: Add `SceneAPI.createFromVideo` method analogous to `SceneAPI.createFromImage` - UBQ: Add `BlockAPI.isAlignable`, `BlockAPI.alignHorizontally`, and `BlockAPI.alignVertically`. - CESDK: Fix bleed margin not updating correctly when switching page format or design unit. - CESDK: `PageFormatDefinition.dpi` and `PageFormatDefinition.bleedMargin` properties have been removed. They were never actually used in the CESDK. - CESDK: Stroke properties are now being controlled via select inputs instead of segmented controls, improving their usability - CESDK: Fix a bug in the 'Edit' canvas action for text blocks. - CESDK: Fix for touch-gestures sometimes triggering accidental selection- CESDK: Stroke properties are now being controlled via select inputs instead of segmented controls, improving their usability - CESDK: Fix a bug in the 'Edit' canvas action for text blocks. - CESDK: Fix for touch-gestures sometimes triggering accidental selection - CESDK: Fix moving groups between pages resulting in groups jumping around. - CESDK: Number inputs now default to two fraction digits for number inputs - UBQ: Merged CompositedText and Text blocks - UBQ: Add TextCase options to the Text block and API - CESDK: Add support for `file:/path` format and special characters in `@cesdk/node` URL handling. - CESDK: Introduce the crop, filters, adjustments, effects, and blur inspector for page blocks. - CESDK: Add Alignment UI to Design & Studio UI - CESDK: Fix various bugs related to undo/redo in the Video Editor. - CESDK: Fix a bug for 'flip' operations not saving undo/redo steps. - CESDK: Fix editor crashing when loading scenes with specific combinations of block indices. - UBQ: Add `text/clipLinesOutsideOfFrame` and `text/hasClippedLines` properties to the Text block. - UBQ: Add automatic font size options (`text/automaticFontSizeEnabled`, `text/minAutomaticFontSize`, `text/maxAutomaticFontSize`) to the Text block. - UBQ: Fix occasions where the scene export failed with an error stating "Block to export has size 0". Version 1.10.1 Released: March 29, 2023 -------------------------------------------------- **Non Breaking Changes** - UBQ/Android: Fix android keyboard not opening on some devices - UBQ: Fix for touch-gestures sometimes triggering accidental selection Version 1.10.0 Released: March 14, 2023 -------------------------------------------------- See the [announcement post](https://img.ly/blog/creative-editor-sdk-v_1_10_0-release-notes/) for details on features. **Breaking Changes** > ⚠️ Starting with `v1.10.0` we no longer ship our default assets within the `assets/extensions` folder. Instead, both engine and UIs now offer convenience `addDefaultAssetSources` endpoints, that selectively register asset sources, that serve our default assets. If you're actively using the example assets we shipped **before** `v1.10.0`, check the [Serving Assets Guide](https://img.ly/docs/cesdk/next/engine/guides/assets-served-from-your-own-servers/) for your target platform. > ⚠️ Image uploads are no longer stored in the scene and will not reappear upon scene load. To offer specific assets in your editor, configure and [add an asset source](https://img.ly/docs/cesdk/engine/guides/integrate-a-custom-asset-source/) containing the desired assets. _Asset Management_ - CESDK: Removed presets configuration for images (`presets.images`). Please use the local asset sources to add single images, e.g. with `AssetAPI#addAssetToSource`. - UBQ: The `applyAsset` callbacks and `defaultApplyAsset` API now return an optional design block id in their callback if they created a new block - UBQ: Removed the required `thumbUri` and `size` properties from `AssetDefinition` and `AssetResult`. They are now stored under the `thumbUri`, `width` and `height` keys in the `meta` property dictionary - UBQ: Values of the `blockType` asset meta property must now be design block type ids (e.g. `//ly.img.ubq/image`) - CESDK: Removed the `AssetElement`, `ImageElement`, `VideoElement` and `AudioElement` types and replaced them with `AssetDefinition` - CESDK: The `onUpload` callback must now return an instance of `AssetDefinition` - UBQ: Renamed default upload source for images (`ly.img.upload`) to `ly.img.image.upload` to match naming of video and audio upload sources. - UBQ: Upload asset sources and library entries for video and audio were added to the default configuration from `addDefaultAssetSources`. If you have added these sources manually (like mentioned in our docs) you can remove it now. _General_ - CESDK: Fix text-alignment `center` and `bottom` not working properly since v1.5.0 for the case when a fixed frame size was used and the text exceeded the frame. This can cause text elements with a fixed frame and `center` or `bottom` text alignment, where the text exceeds the frame, to render differently than before. _APIs & Properties_ - UBQ: Renamed Audio's and VideoFill's specific looping, volume, and muted properties to share a common playback prefix: - `'fill/video/looping'` and `'audio/looping'` are now `'playback/looping'` - `'fill/video/volume'` and `'audio/volume'` are now `'playback/volume'` - `'fill/video/muted'` and `'audio/muted'` are now `'playback/muted'` - UBQ: Deprecated the `camera/clearColor` property and replaced it with a global `clearColor` setting. - UBQ: Deprecated fill color related APIs in favor of a 'Fill' based approach - Deprecated `hasFillColor`, use `hasFill` and query `block.getEnum(id, 'fill/type')` for `Solid` type instead. - Deprecated `get/setFillColorRGBA`, use `setFillSolidColor`instead.. - Deprecated `isFillColorEnabled`, use `isFillEnabled` instead. - Deprecated `setFillType` and `setFillGradientType`, use `createFill`, e.g., with type 'color' and then apply the fill block with `setFill` to the block instead. If the block has a fill, it should be removed with `getFill` and `destroy`. - Deprecated `getFillType` and `getFillGradientType`, query `block.getEnum(id, 'fill/type')` and `block.getEnum(id, 'fill/gradient/type')` instead instead - Deprecated `add/removeFillGradientColorStop` and `get/setFillGradientColorStops`. - Deprecated `get/setFillGradientControlPointX/Y`, use `block.getFloat(fill, keypath)` and `block.setFloat(fill, keypath, value)` with key paths 'fill/gradient/linear/startPointX/Y', 'fill/gradient/radial/centerPointX/Y', and 'fill/gradient/conical/centerPointX/Y' instead. - Deprecated `get/setFillGradientRadius`, use `block.getFloat(fill, 'fill/gradient/radial/radius')` and `block.setFloat(fill, 'fill/gradient/radial/radius', value)` instead." **Non Breaking Changes** - CESDK: Fix issue with asset replacement panel hiding when selecting new audio. - CESDK: Add callback and utility method for checking against unsupported browsers - CESDK: Audio clip is deleted automatically if being out of bounds after page deletion - UBQ: Fix potential out of memory issue when loading lots of scenes with a single engine instance - UBQ: Fix event subscription for common props, i.e., name, exportable, and always-on-top properties. - CESDK: Removed the emoji default font from the bundle and exposed the URI setting (setting `ubq://defaultEmojiFontFileUri`) - CESDK: Fix for text variables not showing when editing text resulting in wrong cursor positions since v1.7.0. - CESDK: Fix audio element clamping and stale timeline scale label value - CESDK: Remove re-uploading of Unsplash images and hotlink them directly into the scene - CESDK: Fix empty page inspector in default UI on certain constraints settings - UBQ: Introduce `PlaceholderControls` which allow controlling the placeholder appearance on each block. Replaces `image/showsPlaceholderButton` and `image/showsPlaceholderOverlay` properties, which are now deprecated. - CESDK: Fix blend mode UI not being reflecting state properly for shapes, text and stickers - CESDK: Add `--ubq-border_radius-xs` token - CESDK: Allow bitmaps to be uploaded - CESDK: Remove official `image/x-tga` support from documentation - UBQ: Add `subscribeToAssetSourceAdded` and `subscribeToAssetSourceRemoved` methods to subscribe to additions to and removals from the list of asset sources - CESDK: Deprecate `canManageAssets` in favor of `canAdd` and `canRemove` in the asset library entries - CESDK: `--ubq-stroke-contrast-3` token has been added - CESDK: Copy/Paste now respects scopes and configuration for page management - UBQ: Introduce `block.getUUID` - CESDK: Fix an issue where the search query was kept across dock entries - CESDK: Add support for `Allow to Replace Content` placeholder option for blocks that have a video Fill Version 1.9.2 Released: January 18, 2023 -------------------------------------------------- **Breaking Changes** **Non Breaking Changes** - CESDK: Added a missing type export for Typescript Version 1.9.1 Released: December 15, 2022 -------------------------------------------------- **Breaking Changes** **Non Breaking Changes** - UBQ: Fix invalid audio sample rate in the header of exported video files. - UBQ: Expose video export API - CESDK: Fix issue where replacing a video didn't work once it was in an error state - CESDK: Optimize page thumbnail generation Version 1.9.0 Released: December 12, 2022 -------------------------------------------------- See the [announcement post](https://img.ly/blog/creative-editor-sdk-v_1_9_0-release-notes/) for details on features. **Breaking Changes** - CESDK: `--ubq-border-outline`, `--ubq-border-divider` and `--ubq-border-contrast` have been renamed to `--ubq-border-default`, `--ubq-stroke-contrast-1` and `--ubq-stroke-contrast-2` - UBQ: Splitted `showsPlaceholderOverlay` into two settings: `showsPlaceholderOverlay` and `showsPlaceholderButton` to control the placeholder overlay and button separately. - CESDK: Remove the second `canvas` argument from `CreativeEngine.init`. Using a custom canvas is strongly discouraged in favor of using our managed canvas instead. If using a custom canvas can't be avoided, it can be provided via `config.canvas`. - CESDK: Setting `touchScrollingEnabled` changed to `touch/singlePointPanning` - CESDK: Setting `touchDragRequiresSelectionEnabled` changed to `touch/dragStartCanSelect` (inverted truth value) - CESDK: Configuration `ui.elements.libraries.replace.entries` determines if a replace button will be shown for any block. If you have customized this configuration for images, you have to make this a function, check the argument for the selected block type, and only return your customization if an image is selected. Otherwise, you will see the replace button for non-image blocks as well. If you haven't customized this configuration you do not have to do anything. See documentation for further information. **Non Breaking Changes** - UBQ: Fix text-editing cursor movement changes via touch not working while auto-completion is active in mobile Chrome - CESDK: Extended the placeholder arrange scopes to support individual control over `move`, `scale`, `rotate` and `flip` - CESDK: Add `meta+.` shortcut to show/hide UI - CESDK: Fix HEX color value differs for color preview input field and HEX input field - CESDK: InspectorBar SubInspector toggle buttons now have same special highlight styling as inside the sidebar Inspector - UBQ: Fix mime type detection not working when saving to an archive - UBQ: Fix text variables containing emojis not rendering the emojis - CESDK: Add video export with audio - UBQ: Fix mime type detection not working when saving to an archive - CESDK: Fix wrong fallback for baseURL if set explicitly to `null` or `undefined` - UBQ: Fix export to only contain elements that are part of the specified hierarchy - UBQ: Add an automatic block layouting when needed in API calls. Can be turned off with the feature flag `implicitUpdatesEnabled`. - UBQ: Add placeholder line rendering to empty image and video fills - CESDK: Change background color of the subinspector - CESDK: change sorting of duplicated elements; on top of existing element, instead of at the very front - CESDK: Fixing shape translations in the asset library - CESDK: Fix problem where mouse handlers were not correctly installed when the custom element or canvas were detached. - UBQ: `SceneAPI.create` now accepts `sceneLayout` as an optional parameter defaulting to `Free` - UBQ: `SceneAPI.createFromImage` now accepts three additional optional parameter: `sceneLayout` defaulting to `Free`, `spacing` defaulting to `0`, and `spacingInScreenSpace` defaulting to `false` - CESDK: improve texture sampling in the Web version when WebGL2 contexts are available - UBQ: Add `isPropertyWritable`/`isPropertyReadable` api methods - UBQ: Add `subscribeToZoomLevel` method to subscribe to changes in the zoom level - UBQ: Removed the fixed export size limit of 4096 px and used the device limit instead. - CESDK: Add `SceneAPI.onZoomLevelChanged` method to subscribe to change in the zoom level - UBQ: Add support for spot colors. Spot colors can be applied to the properties `fill/solid/color`, `stroke/color` and `backgroundColor/color`. - CESDK: Prevent painting past the boundaries of the `` element in certain situations. - UBQ: Introduce `features/highQualityMipmaps` flag to enable improved image sampling - CESDK: Show replace asset library even if asset library is hidden - CESDK: Improve texture sampling in the Web version when WebGL2 contexts are available - UBQ: Add `subscribeToSelectionChange` method to subscribe to changes to the current selection - UBQ: Add `subscribeToHistory` method to subscribe to changes in the undo/redo history - CESDK: Add `BlockAPI.onSelectionChanged` method to subscribe to changes in the current selection - CESDK: Add `EditorAPI.onHistoryUpdated` method to subscribe to changes in the undo/redo history - UBQ: Improve startup time by caching WASM compilation - CESDK: Add video not supported error dialog - UBQ: Add `subscribeToActiveSceneChange` method to subscribe to changes of the active scene - CESDK: Add `SceneAPI.onActiveChanged` method to subscribe to changes of the active scene - CESDK: Introduced settings touch related settings `touch/*` including `pinchCanScale`,`pinchCanZoom` and `turnCanRotate` - CESDK: Made some control Gizmos configurable via `controlGizmo/*`, including `showCropHandles`, `showResizeHandles`, `showScaleHandles` and `showRotateHandles` - UBQ: Improve `BlockAPI.export` to handle exporting of arbitrary blocks - CESDK: Add support for `filters`, `adjustments`, `effects` and `blurs` to all supported elements - UBQ: Transform and crop handles have a wider area of interaction when on mobile - UBQ: When the size of the slected element is too small, rotation and move handles are displayed together at the bottom center of the selection - CESDK: Introduce history management via the `EditorAPI` - CESDK: Introduce `config.initialSceneMode` option - UBQ: Add `scene/defaultPageDuration` property Version 1.8.0 Released: October 21, 2022 -------------------------------------------------- See the [announcement post](https://img.ly/blog/creative-editor-sdk-v_1_8_0-release-notes/) for details on features. **Breaking Changes** - CESDK: I18n keys related to shadows have changed: - 'action.shadow.direction.change' is now 'action.shadow.angle.change' - 'action.shadow.direction.rotate' is now 'action.shadow.angle.rotate' - 'action.shadow.size.change' is now 'action.shadow.distance.change' - 'input.shadow.direction' is now 'input.shadow.angle' - 'input.shadow.direction.description' is now 'input.shadow.angle.description' - 'input.shadow.size' is now 'input.shadow.distance' - 'input.shadow.size.description' is now 'input.shadow.angle.distance' - UBQ: Highlight placeholder button on hover - CESDK: Initializing the engine no longer requires a ``. Instead, the instance will instantiate its own canvas that can then be inserted into the DOM - CESDK: Fix snapping guides aren't cleared on mouse/touch up - CESDK: Fix modals and dialogs not being positioned properly - UBQ: the `design/arrange` scope provides more fine-grained with `design/arrange/move`, `design/arrange/resize`, `design/arrange/rotate`, `design/arrange/scale` and `design/arrange/flip`. It is still possible to read or write all at once using `design/arrange`. - CESDK: Fix i18n issues with multiple CE.SDK instances - CESDK: Fix edge handle snapping on rotated elements **Non Breaking Changes** - CESDK: Fix broken typography on inspector panel welcome text for adopter role - CESDK: Insert and replace panels now have the same default settings - CESDK: Add Image Straighten UI - UBQ: Add drop shadow support to the sticker block - CESDK: Update how the replace button is drawn on small frames - CESDK: Fixed hover highlight outline when changing selection via the API - CESDK: Add content-hashes to the core (WASM) asset filenames. Verify CESDK Version during WASM instantiation - CESDK: Add configuration options to show/hide UI to manage/format pages - CESDK: A multi-selection can be rotated - UBQ: Fixed the selection behavior of rectangle elements with outside or center strokes - CESDK: Add optional `fixedOrientation` flag to page format preset type. - UBQ: Added a high compatibility mode for PDF exports to the export settings and enabled it by default - UBQ: Add `ubq://maxImageSize` to control the engine's memory footprint. The default value is 4096 pixels. Images with a higher resolution get downscaled automatically. - UBQ: Improved memory handling. - CESDK: Fix settings panel CSS theme generator not including all necessary CSS custom properties - CESDK: Fix drag handle snapping accuracy sporadically slightly off - UBQ: Add iOS inline text editing - UBQ: Added `exportWithColorMask` to the API and bindings - UBQ: Fix property modification for `duotone_filter`, `lut_filter`, `adjustments` & `hsp_selective_adjustments` - UBQ: `findAllProperties` now returns correctly prefixed keys for blurs, effects and fills - UBQ: Add flipCropHorizontal and flipCropVertical APIs - UBQ: Fixed page dimensions and font sizes in the PDF export of pixel-unit scenes - UBQ: Fixed issue when adding another block after an selected image in the default UI - UBQ: Expose `cropOverlayColor` setting - UBQ: Add `findAllMetadata` endpoint - UBQ: Fix console error when touch dragging on the web - UBQ: Fix `null` values for `getGroups` callback in AssetSources - UBQ: Add helper functions to determine the support for WASM and Video (`supportsWasm` & `supportsVideo`) - UBQ: Added support for emojis, rendered with `NotoColorEmoji.ttf` - CESDK: Added `touchScrollingEnabled` and `touchDragRequiresSelectionEnabled` settings to configure the touch behavior. - CreativeEngine: Add Node.JS package @cesdk/node - UBQ: Fix crashes during event delivery - UBQ: Fix dragging through UI elements - UBQ: Fix crashes when duplicating fill, effects and blurs Version 1.7.0 Released: August 11, 2022 -------------------------------------------------- See the [announcement post](https://img.ly/blog/creative-editor-sdk-v_1_7_0-release-notes/) for details on features. **Breaking Changes** - CESDK: Change export options provided to the onExport callback - `options['image/jpeg'].quality` -> options.jpegQuality - `options['image/png'].compressionLevel` -> options.pngCompressionLevel - UBQ: Update zoom APIs to be more user-friendly - `editor.getZoomLevel` -> `scene.getZoomLevel` - `editor.setZoomLevel` -> `scene.setZoomLevel` - `get`/`setZoomLevel` is in relation to pixel dimensions instead of design units of the scene, which requires an update of the values if the scene is in design unit inch or millimeter - CESDK: Changed translation keys in the settings panel - UBQ: Replace backgroundColor properties (`backgroundColor/color`, `backgroundColor/enabled`) of the page block with fill properties (`fill/enabled`, `fill/gradient/type`, `fill/solid/color`, `fill/type`). - CESDK: UI (Default or Advanced) is now independent of Role (Creator or Adopter). - Configuration key `ui.elements.view.adopter.style` has been removed. - Configuration key `ui.elements.view.style` is used to configure the view for all roles. - UBQ: Asset Source `findAssets` does not have a 'type' argument anymore. All user-configured asset source have to remove the `type` as well - CESDK: Removed the following configuration entries. It is replaced by configuration of `ui.elements.libraries.insert.entries` and `ui.elements.libraries.replace.entries` - `ui.elements.libraries.upload` has been removed. - `ui.elements.libraries.template` has been removed. - `ui.elements.libraries.image` has been removed. - `ui.elements.libraries.text` has been removed. - `ui.elements.libraries.element` has been removed. - CESDK: Deprecate `libraries.panel.insert` and `libraries.panel.replace` and move their entries to `libraries.insert` and `libraries.replace` - UBQ: Rename drop shadow related function and properties: - `[get/set]DropShadow[X/Y]Offset` -> `[get/set]DropShadowOffset[X/Y]` - `[get/set]DropShadow[X/Y]BlurRadius` -> `[get/set]DropShadowBlurRadius[X/Y]` - `dropShadow/x/offset` -> `dropShadow/offset/x` - `dropShadow/y/offset` -> `dropShadow/offset/y` - `dropShadow/x/blurRadius` -> `dropShadow/blurRadius/x` - `dropShadow/y/blurRadius` -> `dropShadow/blurRadius/y` - UBQ: `hasPlaceholderContent` has been renamed to `showsPlaceholderContent` - CESDK: Changed i18n key `input.document` to `input.canvas` - CESDK: default stroke position is centered rather than outside **Non Breaking Changes** - CESDK: Add option to auto close asset library after insert or replace - UBQ: new API functionality to add and edit a block's drop shadow - CESDK: Update border radius values - UBQ: Add export options to export API - UBQ: Introduce asset API - CESDK: Add Stroke controls to Default UI for Images - UBQ: Add setting to control double-click behavior - UBQ: Add gradient option to page fill - UBQ: Add block metadata API - CESDK: Add labels to Shape Options sliders. - CESDK: Improved UI usability on small screens - CESDK: Fix Unsplash library displaying the same image multiple times - CESDK: Fix filter card labels not readable in dark theme - CESDK: Can rotate and flip groups - CESDK: Fix template library cards displaying templates wrong - CESDK: Add configurable icons for custom libraries - UBQ: Add scopes API - CESDK: Add Shadows controls to Advanced UI - CESDK: Fixed line shape handles not moveable in some conditions - CESDK: Add possibility to pass function to dock group configuration - CESDK: Add stroke to pages. - UBQ: Always clip content to pages on export - CESDK: Add effect & blur APIs. - CESDK: Fix to properly ignore mouse events over UI elements - CESDK: Remove text background color from the UI - CESDK: Fix word wrapping of text for keyboard input in Safari - CESDK: The entry point for the Creative Engine at `@cesdk/cesdk-js/creative-engine.umd.js` has been removed. Use the `@cesdk/engine` package instead. - CESDK: Fix translation issues in the asset library - CESDK: Change default template card backgroundType to `contain` - CESDK: Added support for changing cursors depending on the action performed in the `@cesdk/engine` package. - CESDK: Fix lost keyboard focus after clicking canvas Version 1.6.3 Released: June 13, 2022 -------------------------------------------------- **Non Breaking Changes** - CESDK: Fix replace library behavior during template adoption. Version 1.6.2 Released: May 24, 2022 -------------------------------------------------- **Non Breaking Changes** - CESDK: Fix broken fill color on star, polygon, and vector shapes. Version 1.6.1 Released: May 23, 2022 -------------------------------------------------- **Breaking Changes** - UBQ: Rename fill & background color related properties: - `fill_color/value` -> `fill/solid/color` - `fill_color/enabled` -> `fill/enabled` - `background_color/value` -> `backgroundColor/color` - `background_color/enabled` -> `backgroundColor/enabled` **Non Breaking Changes** - CESDK: Settingspanel library checkboxes working again Version 1.6.0 Released: May 16, 2022 -------------------------------------------------- See the [announcement post](https://img.ly/blog/creative-editor-sdk-v_1_6_0-release-notes/) for details on features. **Breaking Changes** - UBQ: Fix "Cross Cut" effect output differences. - CESDK: Some of the exported types of the @cesdk/cesdk-js package have changed: - The `DesignElementId` type alias has been renamed to `DesignBlockId` - The `PositionMode`, `SizeMode`, and `PropertyType` enums for use with the BlockAPI are gone. Instead you can use literal string values that map 1:1 to the previous enum value names. `PositionMode.Absolute` becomes `"Absolute"`, etc. - CESDK: Add template library - Template configuration now needs to include a label for each template - JNI: Use `long` instead of `int` for IDs because Java does not offer unsigned ints. - CESDK: Deprecate imports of the CreativeEngine module from `@cesdk/cesdk-js/cesdk-engine.umd.js`. To use the CreativeEngine module, import it as its own package from the `@cesdk/engine` npm module. **Non Breaking Changes** - UBQ: Add `findAllPlaceholders` API - CESDK: Fix snapping guides not always covering the entire screen - CESDK: Split cesdk_engine from cesdk_web - UBQ: Add `scale` API for proportional scaling of blocks, groups and hierarchies - CESDK: Add API options `setContentFillMode` and `getContentFillMode` - UBQ: Fix blur bleeding with CPU backend - UBQ: Fix Tiltshift effect alpha handling - CESDK: Improved Stroke options for Shapes and Text - CESDK: Add Gradient Fills. - CESDK: Fix unselectable elements being selectable by keyboard interaction for Adopter. - CESDK: Fix uploaded images being added immediately. - CESDK: Add placeholder options for Pages. - UBQ: Add `applyTemplate` APIs - UBQ: more properties can be set through the set of `set/get` functions which take a single parameter. - CESDK: Update line and stroke width of handles, selection frames, and gizmos. - UBQ: Fix text blocks changing position during design unit changes. Version 1.5.1 Released: May 9, 2022 -------------------------------------------------- **Non Breaking Changes** - CESDK: Added exports for a few enums that had been forgotten in a previous release: - `DesignBlockType`, which was previously called `DesignElementType` is required as an argument to many methods in the BlockAPI) - `MimeType` - `StrokePosition`, `StrokeCornerGeometry`, and `StrokeStyle` Version 1.4.7 Released: May 3, 2022 -------------------------------------------------- **Breaking Changes** - JNI: Use `long` instead of `int` for IDs because Java does not offer unsigned ints. **Non Breaking Changes** - CESDK: Fixed spinners showing on hidden pages, e.g. in single-page mode. - CESDK: Preserve font `externalReference` in textRuns when loading scenes. Version 1.4.6 Released: April 14, 2022 -------------------------------------------------- - Add auto close feature Version 1.5.0 Released: April 4, 2022 -------------------------------------------------- See the [announcement post](https://img.ly/blog/creative-editor-sdk-v_1_5_0-release-notes/) for details on features. - CESDK: Introduce event API and editor API. - UBQ: `export` now always unhides the element that's being exported. - UBQ: Selection and placeholder highlighting for children of hidden elements are disabled. - CESDK: Fix bug when no sources for a type are configured - UBQ: Add `Opacity` component to `CompositedText` - UBQ: Switch to fixed `Stack` spacing during export - UBQ: Limit image render resolution to 4096x4096 - CESDK: Disabled color inputs inside colorselection popover can be enabled via click anywhere inside the popover - CESDK: Introduce grouping of elements. A group can be moved and has its own opacity. - CESDK: Added new vector shapes. - UBQ: Add PDF export - UBQ: Move pending and error state rendering from the frontend into UBQ - CESDK: Update supported browser versions - UBQ: Add options for page clipping and out-of-page dimming - UBQ: Add `showsPlaceholderOverlay` property to `Image` - UBQ: Allow exporting scenes as an archive - CESDK: Allow usage of inline text editing in `cesdk_engine` headless mode - CESDK: Add dock configuration option to show/hide labels and choose between icon sizes - CESDK: 'Replace Asset' library panel now automatically opens for Adopters when selecting a replaceable image, and stays open after selection. Version 1.4.5 Released: April 1, 2022 -------------------------------------------------- **Non Breaking Changes** - Fixes Canvas Actions / Actionbar not correctly updating its position when text box height changes during typing - Fixes `externalReference` not being updated when an image was replaced - Fixes multiple issues in single page mode - Elements created by an adopter are no longer highlighted, which also fixes occasional highlighting of the entire scene - Non-visible elements are no longer selectable via `tab` - Loading spinners no longer show for elements on hidden pages - Fixes wrong pointer offsets for adopters, noticeable in embedded deployments leading to wild element jumps during drag - Fixes empty library for image replacement, if only uploads are in there - Allows disabling the image placeholder overlay via a new `showsPlaceholderOverlay` property - Adds an `activePageCallback` that allows registering for undo/redo induced page change Version 1.4.4 Released: March 9, 2022 -------------------------------------------------- - Fixed mouse offsets during dragging Version 1.4.3 Released: March 7, 2022 -------------------------------------------------- - CESDK: Fix bug when no sources for a type are configured - UBQ: `export` now always unhides the element that's being exported. - UBQ: Selection and placeholder highlighting for children of hidden elements is disabled. Version 1.4.2 Released: February 23, 2022 -------------------------------------------------- - Fixes an error in the public TS type declarations. Version 1.4.1 Released: February 22, 2022 -------------------------------------------------- **Fixes** - Placeholder overlay not getting removed when replacing image as adopter - Missing bindings for `getGlobalXYZ` & `referencesAnyVariables` endpoints - Various guide fixes (broken links, broken buttons & wrong examples) - Delay lookup of legacy vector path blocks **Breaking Changes** - CESDK: Moved property API functions into the block API namespace. `.property.findAll` and `.property.getType` have been renamed to `.block.findAllProperties` and `.block.findPropertyType` resp. Version 1.4.0 Released: February 18, 2022 -------------------------------------------------- See the [announcement post](https://img.ly/blog/ce-sdk-v140-release/) for details on features. **Breaking Changes** - CESDK: Add new elevation color theming token - CESDK: Add design tokens for danger button variant - CESDK: `//ly.img.ubq/adjustableImage` was renamed to `//ly.img.ubq/image` (serialized scenes are automatically converted) - CESDK: Changes made in preview mode are discarded when leaving the mode - CESDK: Shapes may now be resized non aspect-aware via the edge handles - CESDK: `presets.variables` was moved to the top level of the `Configuration` object - CESDK: Renamed configuration key for the view style from classic to advanced and from minimal to default - CESDK: Changed default image fill mode from `none` to `cover` - CESDK: I18n files have been restructured (flat keys). - CESDK: Extended layout functions of the block API for more control - CESDK: Introduce `--ubq-margin-xl` theming api token - CESDK: Introduce `--ubq-interactive-selected` theming api token **Non Breaking Changes** - CESDK: Changes made in 'Preview' mode don't affect the current scene anymore - CreativeEngine: Introduces headless `CreativeEngine` via `cesdk-engine` package and makes the editors underlying engine available via `cesdk.engine` - CESDK: Add manual number input for slider elements via Enter key - CESDK: Add ability to remove variables - UBQ: Store & handle relative paths by resolving them relative to the `ubq://basePath` setting - CESDK: Add "Always on top" toggle for design elements - CESDK: Add ability to remove variables - CESDK: Remove `ubq://waitForAssets` setting - CESDK: `image.uri` was replaced with `image.imageFileURI`. The property now holds a file URI, the previously stored asset ID is now stored in `image.externalReference`. Same applies to `image.lutFilter/uri` and `sticker.uri`. - CESDK: Add block-based `saveToString` & `loadFromString` to block API - CESDK: `VectorPath` blocks now only receive paths & size instead of an asset key. - CESDK: Snapping behaviour extended to multi-selected elements - CESDK: Add `getGlobalBoundingBox…` & `referencesAnyVariables` to block API - CESDK: Replace `image.duotoneFilter/assetUri` with individual colors and introduce `image.duotoneFilter/externalReference` - CESDK: Hide inspector bar inputs without necessary placeholder settings in classic UI Version 1.3.0 Released: January 6, 2022 -------------------------------------------------- See the [announcement post](https://img.ly/blog/ce-sdk-v1-3-0-release-notes/) for details on features. **Breaking Changes** - CESDK: Theming API endpoints for typographic settings has changed **Non Breaking Changes** - CESDK: Fix scrollbar pixel scaling - CESDK: Add `initialImageURL` configuration option - CESDK: Make Editor unloading clean up more resources - CESDK: Add `Page` related configuration options (`title.show` & `title.font`) - CESDK: Add Multi Selection capabilities Version 1.2.1 Released: November 30, 2021 -------------------------------------------------- **Breaking Changes** - CESDK: Deprecated `load` method of `CreativeEditorSDK` in favour of `loadFromString` and `loadFromURL` - CESDK: Rename `config.initialScene` to `config.initialSceneString` **Non Breaking Changes** - CESDK: Fix SVG without height and width attribute not being displayed - CESDK: Add Layout switch to Canvas Inspector - CESDK: Add `initialSceneURL` configuration option - CESDK: Add saner default for constraints in templates Version 1.2.0 Released: November 22, 2021 -------------------------------------------------- **Non Breaking Changes** - CESDK: Replace Storybook with hand-rolled styleguide - UBQ: Add support for `POST` requests, HTTP body & headers - CESDK: Add UI for renaming design elements - CESDK: Replace constraints section with placeholder UI - CESDK: New content library - CESDK: Inspector Panel content is reduced or hidden entirely for Adopter Role. Version 1.1.1 Released: October 29, 2021 -------------------------------------------------- **Non Breaking Changes** - CESDK: Fix vanilla js integration example not working Version 1.1.0 Released: October 28, 2021 -------------------------------------------------- **Breaking Changes** - CESDK: Fix line-breaking of words in text variables only having 1 character per-line for all but the last word - CESDK: Decrease default PNG compression level from 9 to 5. - CESDK: Alter export return from Promise to Promise<{ blobs: Blob[], options: EncodeOptions }>. - CESDK: Shadow DOM UI encapsulation to prevent style bleeding **Non Breaking Changes** - CESDK: Display style of first character in selection when text is selected (instead of always style of the character before the cursor) - UBQ: Fix line resize handles being rendered wrong occasionally - UBQ: Add default Description component to all design blocks - CESDK/UBQ: Expose image encoding parameters for JPEG quality & PNG compression level - CESDK: Enable Doodle, Hands and Emoji sticker packs by default - CESDK: Update CanvasActions misaligned paddings - CESDK: Wire config.assets & config.presets.images - CESDK: Refactor initialization to untangle dependencies - CESDK: Add improved LineRenderer (better angled lines, no disappearing sub-pixel lines) - CESDK: Decrease minimal line-width - CESDK: Introduce RasterizedDesignBlocksRenderer and refactor CESDKImage to use it - CESDK: Add Copy/Paste functionality - CESDK: Add Stack design block - CESDK: Move from manual to automatic page layouting - CESDK: Wire config.presets.typefaces - CESDK: Add design token CSS custom property for disabled opacity value - CESDK: Remove unused design tokens regarding disabled input state - CESDK: Page Dimension Aspect Ratio Lock is now saved in Scene. - CESDK/UBQ: Implement frame flipping for all elements - UBQ: Add basic SVG support to the image element Version 1.0.0 Released: August 18, 2021 -------------------------------------------------- **Breaking Changes** - UBQ: Migrate to flexbox-based layouting * `designElements` are now serialized with `base_props_version` 6 * `block_position` is now a struct with four values: ```json "block_position": { "version": 1, "left": { "version": 1, "unit": 1, "value": 18.0 }, "top": { "version": 1, "unit": 1, "value": 16.5 }, "right": { "version": 1, "unit": 0, "value": 0.0 }, "bottom": { "version": 1, "unit": 0, "value": 0.0 } } ``` * Each value is a `LayoutValue`, where `unit` encodes whether it is an `undefined`, `design unit`, `percent` or `auto` * The example is therefore positioned 18 design units from the left & 16.5 design units from the top, right and bottom are undefined and therefore ignored * `block_dimensions` is now `block_size`: ```json "block_size": { "version": 1, "width": { "version": 1, "unit": 1, "value": 43.08553695678711 }, "height": { "version": 1, "unit": 1, "value": 64.61538696289063 } } ``` * Consists of two `LayoutValue`s encoding this elements size in either absolute design units, percent values relative to its parent or `auto` for auto sizing * The third dimensions, `z-index` & `depth` have moved into their own attributes `block_z_index` & `block_depth` along with `has_block_z_index` & `has_block_depth`. They just consist of `float` values. - CESDK: Made the initialization process more robust when dealing with large scenes. `CESDK::load` is now an async endpoint returning a `Promise` that fulfills when the scene was loaded. - CESDK: Remove styled-components dependency - CESDK: Changed location of *.wasm, *.data, *.js files as well as the fonts and extension packs - CESDK: Added default font configuration (set `defaultFont: '//ly.img.cesdk.fonts/roboto_regular'` for the previous default. This needs the font extension pack installed) - CESDK: If `fontPath` is not specified it defaults to assetPath + 'fonts/' instead of just 'fonts/' - CESDK: Changed package name to @cesdk/cesdk-js - CESDK: Scale the text font proportionally when resizing a text element via its corner handles - CESDK: Create Text elements with auto height mode enabled - CESDK: Change 'Editor' role to 'Adopter' - CESDK: Element scopes are now false by default. Adopters therefore won't be able to interact with any element added by a 'Creator' user, unless the creator has manually enabled the corresponding scopes in the inspector. - CESDK: `CESDK::save` is now asynchronous. - CESDK/UBQ: `CESDKScene` is now part of `UBQ`, but old `//ly.img.cesdk/scene` IDs are mapped to `//ly.img.ubq/scene` block. - CESDK/UBQ: Changes scene `format` to `//ly.img.ubq/scene`, but still allows old format. Saving will create a scene file with the new format. - CESDK: Change token styling system and default themes - CESDK: Remove all old and unused CSS custom properties - CESDK: Add Text element option to hide lines outside of the frame - CESDK: Add Text layouting option for long word per-character line-break option - UBQ: Serializations are now base64 encoded - CESDK: Renamed effects and switched to only showing effects which were registered as an asset - CESDK: replace scene format selector - CESDK: Remove react as peer depedency for `@cesdk/cesdk-js` - CESDK: Changed public API surface - CESDK: draw fallback glyphs in text for codepoints that are not present in the font - CESDK: Removed the `ly.img.cesdk.stickers.shapes` extension pack - UBQ: Cleared default paths of `CESDKVectorPath` & `VectorPath` blocks - CESDK: Move `Molle`, `Codystar` & `Lobster` fonts into `ly.img.cesdk.legacy-fonts` pack **Non Breaking Changes** - CESDK/UBQ: Do not show element handles while dragging - CESDK: Made the initialization process more robust when dealing with large scenes - UBQ: Fix positioning of circular progress bar - CESDK: Add LayerList feature simple implementation with sorting and layer hide - CESDK: Add auto-sized text elements - CESDK: Fix bleed margin popover selected option styling - UIKIT: Add `ListBox` component entirley based on existing `Select` component with only the list and options encapsulated - UBQ: Fix localized punctuation in number inputs - UBQ: Fix number input up/down stepping - UBQ: Fix movement of text input cursor - UBQ: Fix stop propagation of Popover scroll events - CESDK: Use regular cursor when move is not permitted on element - UIKIT: Use `ListBox` inside `LayerList` - CESDK: Don't render text variable select if there are no placeholers - CESDK: Fix ghost image drag in elements library for emoticons - CESDK: Bump to react@17.02 and react-dom@17.0.2 - CESDK: Move 'Add Page' button to the bottom of the canvas - CESDK: Support multiple file upload - UBQ: Add settings registry that allows registration per scheme & corresponding commands - CESDK: Fix active inspector library selection - CESDK: Added transform and text subinspectors - CESDK: Update Library style - CESDK: Move Effect- and Filter-Sliders into collapsible cards - CESDK: Group 'Load', 'Save', 'Export' and 'Download' buttons in navigation - CESDK: Add proper large ui mode - CESDK: Fix margins on Buttons in ButtonGroup / SegmentedGroup - CESDK: Add crop UI controls - UBQ: Add crop commands to control crop from UI - UBQ/CESDK: Add support for copy & paste of design elements - CESDK: Add value labels to image sub inspectors - CESDK: Add theme color CSS configurator to settings panel - CESDK: fix bug where moving page up/down required two clicks - CESDK: Fix Backend useScene hook not initializing properly - CESDK: Add Zoom levels dropdown - CESDK: Fix ListBox active selection state - CESDK: Add template presets - UBQ: Introduce various `xyzEnabled` props on designblocks to control properties without losing their state - CESDK: Add UI for `xyzEnabled` from sub inspector and a separate component - CESDK: Add `data-ubq-theme` and `data-ubq-scale` HTML attributes - CESDK: Add "Allow to select" scope to shape elments - CESDK: Fix for unhelpful error message when measureImage fails du to a large file size - CESDK: Fix number input not valid input to show last valid one - CESDK: `init` returns promise which resolved if the engine is ready - UBQ: Add TextShapeCacheService to substantially increase performance when there's text in a scene - CESDK: Add page move up and down to history - CESDK: Move color change event emit to parent component - CESDK: Build target is now ES2017 (supports async functions and object spreads natively) - CESDK: Add new fonts & styles to `ly.img.cesdk.fonts` - CESDK: Add Outline to active Card item - CESDK: Add asset settings - CESDK: New default values for blur and shape outlines - CESDK: Remvoe listbox overlay scrollbar - CESDK: Add public typings to release folder - CESDK: Disable crop area transform when arrange is disabled from constraints - CESDK: Fix empty snapshot from crop sub inspector - CESDK: Fix and adjust canvas scroll bars styles - CESDK: Fix to allow transform handles on pages