- Auto Height Text -- This new "auto height" text node type will adjust (grow/shrink) its height so that it always fits the content inside. Content changes, style changes and area width changes will make the area text height resize accordingly. A new text layoutBox API will return the type of text node and the text frame width and/or height contraints if applicable. This API should be used instead of the text areaBox API going forward.
- Multiple Flows -- Designers can now author multiple prototype or interaction flows in a single document. For any document that includes multiple flow support the
HomeArtboard API will return the most upper left artboard and isHomeArtBoard will only return
true
for the most upper left artboard.
- Scrollable Groups -- Plugins will see a new ScrollableGroup node type and can read the scroll direction(s) and viewport size. Plugins cannot yet create a ScrollableGroup or modify its viewport, however.
-
Content Aware Stacks -- Some plugin actions, such as changing a node's position or its Responsive Resize constraints, may be ignored or behave unexpectedly when the node's parent is a Group with Stack layout enabled. Plugins cannot yet create, read, or modify Stack layout settings on a Group.
-
MouseEvent
clientX
/clientY
andoffsetX
/offsetY
values are incorrect (and always have been) -- these values will probably change in the next XD release, so do not rely on them.
- Read & modify Responsive Resize constraints
- Set metadata readable by other plugins
- Check if two nodes share the same raster image asset
The common plugin runtime has been upgraded to UXP 3.4.4, bringing a range of new features and bug fixes:
New features:
HTMLElement.innerText
property- Custom text field styling using
appearance: none
HTMLElement.scrollTo()
method- SVG
<polygon>
and<polyline>
- Get version of the UXP runtime & version of your own plugin via
require("uxp").versions.uxp
/.versions.plugin
- Limited support for CustomElementRegistry (using
is
but not using custom HTML tags; Web Components APIs such asattachShadow()
remain unsupported) HTMLImageElement.complete
flag
Bug fixes:
- Fixed a crash when drag operations started
- The data transfer is initiated properly at the start of the
dragend
event - Fixed the resolution of image URLs to plugin:, plugin-data, plugin-temp for UWP
- Fixed a bug where context menus didn’t stay open
- Fixed improper word breaking in certain edge cases
- Improved stack trace length limitations
ImageFill.toString()
has changed: it no longer includes the full path of the originally imported file, and adds image dimensions to aid in debugging console logs.
- MouseEvent
clientX
/clientY
andoffsetX
/offsetY
values are incorrect (and always have been) -- these values will change in a near-future XD release, so do not rely on them.
- The "Adobe I/O Console" has been renamed "Adobe Developer Console," with a new link: https://console.adobe.io/projects
- Preview how your listing will look in XD before submitting it for review.
- Publish updates at a specific time of your choosing by opting out of instant publishing when your plugin submission is approved.
XD 28 is a minor update for plugin developers:
SceneNode.BLEND_MODE_*
constants for use with theSceneNode.blendMode
property (which was introduced in XD 27).- Quickly look up a scenenode by its GUID with
scenegraph.getNodeByGUID()
. - Easily check if a scenenode is currently in scope for editing with
isInEditContext()
.
- XD 28 introduces two new types of interaction actions: audio-file playback, and "scroll to" actions. Interactions using these features are not visible to plugins yet (speech playback interactions are exposed though). See the interactions API documentation for a complete list of which interaction types are & aren't exposed to plugins at this time.
Read more about XD 28 new features for end users on the Adobe blog.
XD 27 is a minor update for plugin developers, with one new added API:
- Get and set
SceneNode.blendMode
Read more about XD 27 new features for end users on the Adobe blog.
UXP now supports the HTML5 Drag & Drop specification for some specific use cases:
- Drag & drop within your plugin's UI
- On the drag source in your UI, set the
draggable
attribute and define adragstart
event handler that stores whatever data you want viadataTransfer.setData()
. - On the drop target in your UI, defined
dragenter
,dragover
, anddrop
event handlers that react appropriately.
- On the drag source in your UI, set the
- Drag from plugin panel UI into XD document
- Only bitmap images, SVG content, or text can be dropped into the document.
- Provide the mimetype
text/uri-list
and populate it only with local file paths (seeFile.nativePath
) and/ordata:
image URIs. - This will behave exactly the same as if the user had dropped files onto XD -- dropping an image onto a shape will use it as a mask, dropping multiline text onto a Repeat Grid text node will populate each grid cell with each line from the text content, etc.
- It is not yet supported to drag content onto your plugin from an outside source (e.g. dropping files on your plugin UI, or dragging images from another app into your plugin UI).
For more, see this sample plugin code.
You can now use the Chrome DevTools UI (CDT) to debug your JS code -- and to a limited extent, inspect your UI DOM structure. Read the updated debugging tutorial for details.
What works:
- Set breakpoints, pause & stop through code, inspect the values of variables
- View objects and run code in the Console view
- View and edit the "HTML" DOM structure of your plugin's UXP UI
Important caveats:
- XD may be unstable while debugging a plugin. Don't debug when you have important XD documents open.
- If you leave CDT on the Elements view, XD will crash the next time you open it. If this happens, keep CDT open after XD crashes and switch to a different tab. Then close CDT, restart XD, and begin debugging again.
- Debugging on Windows requires some extra steps run with admin rights -- see tutorial for details.
- Many features in the Elements tab do not work. You can view DOM structure, and view limited CSS information but not edit CSS rules. The "Select an element" button does nothing.
- Error messages are often missing from the Console view. Use the Plugins > Development > Developer Console view in XD to be sure you are not missing any important information.
- Other DevTools features such as the Network or Profiling tabs are not supported and may behave erratically if you attempt to use them.
- XD will be partially frozen while paused on a JS breakpoint. Don't try to interact with XD while paused.
- You may see a blank white panel to the left of the DevTools UI. Ignore this, as it does nothing.
- Polygon scenenodes can now take on a star shape - see
Polygon.starRatio
XD 25 is a minor bug-fix release with no new features for end users. But it adds two small improvements for plugins:
- New
application.activeDocument
API providing information about the document. - Fixed bug where
scenegraph.root.guid
did not return a valid guid; it now returns the same value asapplication.activeDocument.guid
.
Read more about XD's biggest release of the year here.
-
Live Co-editing beta
- Plugin edit operations (
editDocument()
or menu commands) are still fully atomic. Outside those blocks, edits from a remote user can come in at any time, just like edits from the local user could. Edits made by remote users will trigger a plugin panel'supdate()
method, just the same as edits made by the local user. - If a plugin edit conflicts with a remote user's edit that started slightly sooner, the plugin edit will get cleanly reverted (in favor of the other user's edit) after the plugin operation has fully completed.
- Remote updates are paused in a known-good document state while a plugin edit is in progress (including the lifespan of any modal dialogs), so the scenegraph state won't change while your code is in the middle of processing it. Similarly, updates made by the plugin are sent atomically to remote users once the entire plugin edit operation has finished.
- Plugin edit operations (
-
Component states & interactions
- For each Component instance, only the currently active state is visible in the scenegraph hierarchy. Content in other, non-visible states is not accessible to plugins yet.
- Hover and state-change interactions are not exposed to plugins yet, but will be in the future. If your plugin is reading interactions/prototyping data, be sure to always have a default case if your code encounters unexpected types.
- Reminder: a single scenenode can return multiple interactions from
node.triggeredInteractions
. This was possible before in some cases, but is allowed in more cases now (for example, one node can have a click/tap trigger, a drag trigger, and a hover trigger).
-
New Plugin Manager UI
- Users can rate plugins on a 5-star rating scale.
- Users can sort by popularity or rating, filter by category, and easily share deep links to a specific plugin.
- Each plugin listing now displays one or more screenshots (see "New plugin listing process" below for how to add these).
- If you have a plugin in development and an installed plugin with the same id, Plugin Manager now shows both for clarity. You can still only enable one of them at a time, though.
-
Sharing enhancements
- The
cloud.getSharedArtifacts()
API may now return an arbitrary number of shared links, and there may be more than one link of the same type (e.g. multiple specs links). - The distinction between link types has blurred a bit: links that are
ArtifactType.SPECS
may also include access to an interactive prototype view, just like links of typeArtifactType.PROTOTYPE
.
- The
- Fixed issue where
shell.openExternal()
was allowing plugins to launch non-Web URL protocols in a way that only worked on Mac. Full cross-platform support for doing this will be added in the future. - CSS / DOM event improvements in UXP plugin UI -- including support for text input color, img
srcset
, and online/offline events. Read more. - Fixed text descender clipping in plugin UI on Mac.
- Plugin panels now include the plugin's icons in the panel header, next to your plugin's name.
- Live Co-editing is still a beta feature. Performance and reliability will not be comparable to other aspects of XD yet.
- Plugins that edit a large number of objects at once may not work reliably when using Live Co-editing.
- If the user makes multiple consecutive edits using a plugin, some of the edits may get erroneously reverted when using Live Co-editing.
- Plugin dialog boxes that a user leaves open for a long time may not work correctly when using Live Co-editing.
- Users may be unable to undo edits made by a plugin when using Live Co-editing.
- Hover and state-transition interactions are not returned to plugins yet when requesting the list of interactions on a scenenode or the entire document.
Information shown in the plugin listing has moved out of manifest.json
and is instead provided online when you submit a plugin to the listing.
- Submitting a plugin also now requires at least one screenshot image.
- Icons seen in the Plugin Manager list must be provided online during submission, but icons seen in the Plugins side panel must still be part of the plugin package folder.
- As of XD 23, the Plugin Manager UI ignores description, author, links, etc. in
manifest.json
. Submitting to the public listing is now the only way to display this info in Plugin Manager. See updated manifest documentation. - As of September 24, submitting a new or updated plugin to the public listing requires supplying all these details via the developer submission portal online. See How to submit to Plugin Manager.
- Clarified that
editDocument()
does not support themergeId
option for UI events that are not "high frequency." - Can
preventDefault()
on Esc or Enter in text fields to prevent the default action of sending focus back to the canvas. - Fixed bug with setting opacity of BooleanGroup nodes.
- Plugin Manager UI shows plugins that were disabled because they're incompatible with the current version of XD, with tooltip explaining why.
- Several fixes to UI layout & CSS handling -- details here.
After a stabilization period, plugins using panel UI are now published in the Plugin Manager listing!
- Fixed bugs related to
editDocument()
usage (also fixed in XD 21.1.12). - PUT/POST requests on Windows were including an unwanted
Transfer-Encoding
header, which interfered with uploading data to services like Amazon S3 (e.g. giving you errors related toContent-Length
). - Plugins can now copy text to the clipboard in response to a panel UI DOM event without needing to call
editDocument()
.
XD 21 adds major updates: the ability to show panel UI, and the much-improved UXP 3 CSS & layout engine.
Danger
The new layout engine likely constitutes a breaking change for any plugin with UI -- read below for details.
Also note that this release has an issue where transactions being wrapped by editDocument
is not enforced. This will be fixed in an upcoming patch version, so you will want to continue wrapping scenegraph changes from panels in editDocument
so that your plugin isn't broken when we release the fix.
- Plugins can now display UI persistently in a side panel. More information:
- A new default stylesheet is provided for plugin UI that renders inside a plugin. This means that UI that renders in one manner in a modal dialog may not render in the same exact manner in a panel.
In order to gain access to most of these features, your plugin must opt-in to the UXP 3.1 layout engine by changing the minVersion
in your manifest.json
:
"host": {
"minVersion": "21.0"
}
NOTE: Without this change, your plugin will run in backwards-compatibility mode.
- Layout engine
- Inline layout -- You now have the ability to write code like
<p>This is <a href="...">a link</a></p>
and have the link render inline with the rest of the text - Layout now defaults to inline (no longer flexbox) -- This may break existing plugin UI code: now
span
elements will render withinline
,button
s will render asinline-block
, etc. overflow
defaults tovisible
(no longerhidden
), per the web specification -- This may break existing plugin UI code.object-fit
-- to control the size of imagesz-index
- Improvements to
position
, including correctabsolute
semantics.- WARNING: Technically
position: fixed
is supported. However, you should not use it in your plugin panels because there are some bugs that will be fixed in a future update that will break if your plugin usesposition: fixed
.
- WARNING: Technically
- Inline layout -- You now have the ability to write code like
- SVG UI elements
- New UI controls
- Radio buttons --
<input type="radio" />
- Progress bars & spinners --
<progress>
- Radio buttons --
- CSS improvements
linear-gradient()
outline
- More units! -- UXP now understands
rem
,em
,px
,pt
,vh
,vw
,cm
,in
, etc. NOTE: UXP will now start ignoring values (other than0
) that don't specify any units, which can break older plugin UI code. - CSS Variables -- easily apply themes and other layout to your plugin.
- More pseudo-selectors --
:lang
and:focus
calc()
-- For example,width: calc(100% - 9px)
. Note that you can mix units, just like you can on the web.- Inheritance -- The CSS parser now understands
initial
,unset
, andinherit
. You can also use!important
to override styles (although you should use this as a last resort). - Default styles are now easier to override as the specificity in the default stylesheet has been reduced.
- Keyboard focus -- Setting
tab-index
to0
will now cause any element to be focusable. You can not yet control the tab order.
See the Known Issues page for a comprehensive list of existing known issues.
-
"Launchpad" UI and menu structure changes -- XD 20 introduces a new, easier way for users to run plugins -- the "launchpad" sidebar menu:
This panel lists all installed plugins, with quick access to all the same commands as the Plugins menu. In addition, XD now arranges plugin menu items more cleanly:
- Multiple menu items are automatically grouped together into a submenu named after the plugin. There's no longer any need to manually specify submenus.
- If your plugin only has a single menu item, it'll still be available directly at the top level of the Plugins menu.
- However, top level menu items always use the name of the plugin. If your plugin's single menu item had a different label specified, it will be ignored.
- Text scenenode super/subscript -- Work with Text nodes and style assets using the new textScript feature.
No new known issues. See the Known Issues page for a comprehensive list of existing known issues.
- Read prototyping interactions -- Read-only access to the interactivity settings in the document (e.g. the blue "wires" seen in XD's prototyping UI).
- New Polygon node type
-
Components & Design Systems -- Symbols are now called Components in XD's UI, and they support resizing and complex overrides. One important consequence of this is that sometimes only a subset of your plugin's changes will be applied to the scenegraph. When the user is editing the "master" copy of the Component, each individual scenegraph change (e.g. changing a single property on a single node) is automatically synced to other instances of the Component only if a given instance doesn't already have an override of the same property (or a related property). As a result, your plugin's intended changes may only be partially (non-atomically) applied in some Component instances: if your plugin command makes, say, 5 changes to the scenegraph, in some instances only, say, 3 of those changes will actually be applied.
In many cases, this partial application of your plugin's changes will feel natural to users as an expected consequence of the overrides they have authored. However, you can also choose to mitigate potential confusion by warning users or disabling some editing features while the user is editing a Component "master" by checking
isMaster
onselection.editContext
and its parent chain. There is currently no way to force all changes made by your plugin command to be applied atomically (i.e. all or nothing).
- Additional Text scenenode styles -- Work with Text nodes and style assets using the new strikethrough and text transform features.
- Plugin listing: View popular & Editor's Choice plugins -- Use the dropdown at the top of the plugin listing to view the top 10 most popular plugins or the latest featured plugins selected by our review team.
No new known issues. See the Known Issues page for a comprehensive list of existing known issues.
- Text field controls:
<input type="password">
<input type="search">
-- displays search icon<input type="number">
-- restricted to numeric characters, and Up/Down arrow keys automatically change the value
- CSS improvements:
- Inline
style
attributes now work when used withinnerHTML
and friends. - Pseudo-class
:focus
- Pseudo-class
:lang()
- Inline
- Send
FormData
with XHR -- This provides an easy way to post data to an endpoint expectingmultipart/form-data
. (But uploading binary files with Blob is not supported yet -- use ArrayBuffer). - requestAnimationFrame() for UI -- Complimenting the earlier addition of
setTimeout()
APIs, this new global API makes it easier to use certain UI libraries such as "react-virtualized" with fewer polyfills. These APIs do not allow plugins to control animations in the XD document -- plugins can still only modify the document as part of an atomic operation while the UI is blocked. But this API does allow for simple animations in your plugin's dialog UI (e.g. a progress indicator).
develop
folder location change (Mac only) -- The "Adobe XD CC" folder was renamed to just "Adobe XD." The contents of thedevelop
folder will automatically be moved to the new location the first time you launch XD 18.- Checkboxes with React -- Checkboxes now correctly trigger
change
events in React. The previously recommended workaround (usingref
to manually assign an event handler) will now cause yourchange
handler to get invoked twice. - Advance warning: In the near future XD's scenegraph will add at least one new subclass of
GraphicNode
(i.e. a new leaf node shape type). Always be sure to have a default case for unknown scenenode types/classes when traversing the scenegraph.
- UI control / DOM API fixes:
- It is now possible to set a checkbox to
checked
by using<input type="checkbox" checked/>
. <option>
tags do now supportselected
attributes, but do not supportdisabled
attributes.- Accepting text in Japanese IME by presing Enter no longer triggers the default button in a dialog.
- Fixed an issue where sometimes the image size is 0 in a plugin.
- Corrected spacing of text using
lineHeight
property. - Fixed handling
selected
attribute ofoption
to set default option. parentNode
ondocument
now returnsnull
instead ofundefined
- Fixed
forEach
forNodeList
. - Node
previousSibling
andnextSibling
when not set should returnnull
and notundefined
. - Fixed for
DOMTokenList
item
andcontains
method bugs. - Fix checkbox issues when using a label.
- It is now possible to set a checkbox to
- Network API fixes:
XMLHttpRequest
throws error with request status 500 forNSURLConnection
error codes.
- File API fixes:
- Misleading error message when
getEntry()
fails. - Corrected the behavior of
types
argument ingetFileForSaving
API.
- Misleading error message when
- Plugin listing displays new fields -- The
summary
,languages
, andwebsite
fields that were recently added to the manifest are now displayed in the Discover/Manage Plugins UI.
No new known issues. See the Known Issues page for a comprehensive list of existing known issues.
- Select & edit across groups: Users can now select multiple items that are in different containers at the same time. This has several effects on plugins:
- Do not assume all selected items have the same parent node. Previously, this was already true in certain special cases -- for example, users could select items that are the immediate children of several different artboards. Now, it can happen in far more cases, so plugins must take extra care to avoid any assumptions about node parents.
- Wider "edit scope" surrounding the selection. Previously, plugins could edit the selected nodes and all their siblings (with a slightly broader scope as a special case in the "root edit context"). Now, plugins can edit any nodes in the subtree of the common ancestor of all the selected nodes, if those nodes are connected to the common ancestor through a parent chain consisting entirely of plain Groups (or Artboards). See the edit context documentation for details and examples.
- _Plugins still cannot edit globally across the entire document at once, even though in very simple testing it may appear that this works. Non-Group containers act as blockades that the edit scope cannot cross - if the selection is outside such a container, you cannot edit inside it; and if the selection is inside such a container, you cannot edit outside it.
- Additional manifest fields required for publishing: As of March 5, submitting a new or updated plugin for the in-app plugins listing requires providing new
summary
,author
, andlanguages
fields, as well as several additional icon sizes. See manifest documentation.
No breaking changes.
No other API changes.
- Plugin update notifications: Users see an in-app notification when any installed plugins have a newer version available in the plugins listing.
No new known issues. See the Known Issues page for a comprehensive list of existing known issues.
- setTimeout() & friends:
setTimeout()
,setInterval()
,setImmediate()
, and the correspondingclear*()
methods are now available as global APIs. These APIs do not allow plugins to control animations in the XD document -- plugins can still only modify the document as part of an atomic operation while the UI is blocked. But timeout APIs do allow for simple animations in your plugin's dialog UI (e.g. a progress indicator), "debouncing" user input, etc. – and they help support web frameworks like React with fewer polyfills needed.
No breaking changes.
No other API changes.
No new known issues. See the Known Issues page for a comprehensive list of existing known issues.
- Assets panel colors & text styles: Get/add/remove any colors, gradients, and text styles saved in the Assets panel.
- Deep link to plugin listings: Link from web sites, social media, etc. directly to your plugin listing in XD's UI so users can easily install the plugin.
No breaking changes.
No other API changes.
- Disable plugins: Temporarily disable a plugin without uninstalling it or erasing its data. Choose Plugins > Manage Plugins, then click the "..." menu for a specific plugin and choose Disable. A disabled plugin does not appear anywhere in the XD UI other than the Manage Plugins view, and none of its code is loaded or run.
- Force stop: If a plugin operation is blocking XD for more than one second with no UI shown, the user sees a spinner with the option to force-stop the plugin. This does not stop the plugin's code from running, but it reverts any partially-completed changes to the document and revokes the plugin from being the foreground operation (unblocking the XD UI and blocking the plugin from making document changes until it's invoked again by the user). If the plugin does eventually reawaken and try to continue running code from earlier, any attempts to modify the document will throw an error.
- New: Plugins can modify the Assets panel contents while running in the background. Do not rely on this - in a future release, it will be blocked.
See the Known Issues page for a comprehensive list of existing known issues.
- Document & node metadata: Store plugin-specific info on individual scenegraph nodes or in the document in general.
- Viewport: Pan and zoom the view of the document, and get information about the current viewport bounds.
- Text: Get/set paragraph spacing; create/modify area text; more easily work with uniform-styled text via convenience getter/setter APIs for character attributes.
- Published links: Get latest links for prototypes & design specs that have been shared from the current document.
- Plugins can only write to the clipboard or modify the selection while actively running a menu command (same as the rules for making scenegraph changes).
- For convenience, the arguments passed to plugin commands are now also available as
scenegraph.selection
andscenegraph.root
. - Exporting renditions to a folder created by your plugin now works reliably on Windows if the folder name contains spaces or other special characters.
Rectangle.cornerRadii
now returns correct values if the corners are not all the same radius.
- "Discover Plugins" listing improvements:
- Sort by plugin name, in addition to the default of sorting by release date.
- Searching the plugin listing now searches the description field in addition to just the plugin title.
- Safe mode: To temporarily disable all plugins for troubleshooting purposes, launch XD while holding down Shift. Re-launching XD will re-enable all plugins.
- Uninstalling a plugin now clears its data/settings folder. Users are now prompted to confirm before uninstalling.
No new known issues. See the Known Issues page for a comprehensive list of existing known issues.
First release of Adobe XD featuring a public API for in-app plugins!