# Overview
During your development, it's important to be able to debug your code and troubleshoot any issues that may arise. Fortunately, most modern browsers come with built-in developer tools that can help you do just that.
## Introduction
Check out this short video below on how to test and debug your add-on to help you get started more quickly, then read on for more details.
## Browser Developer Tools
Some of the key debugging features available in the browser developer tools include:
- **Console** - The console allows you to log messages and errors from your code, as well as execute JavaScript code and interact with the page or add-on.
- **Debugger** - The debugger allows you to set breakpoints in your code and step through it line by line, so you can see exactly what's happening at each stage of execution.
- **Network Monitor** - The network monitor allows you to monitor the network requests made by your add-on, so you can see how it's interacting with other resources and services.
- **Profiler** - The profiler allows you to analyze the performance of your add-on and identify areas where it may be slow or inefficient.
### Debugging Steps
To get started with debugging your add-on:
Access the developer tools by right-clicking on the browser window where Adobe Express is running, and selecting **Inspect Element** or **Inspect** from the context menu.

Make sure you right click outside of the document area or you will not see the context menu pop-up. A good place to right-click is in the header of your add-on, where the title is. But if you're debugging because your add-on isn't running due to an issue, then you can right-click in the top frame of Adobe Express.
Next, navigate to the **Sources** tab, and from there you can locate and select the JavaScript file that contains the code you want to debug. You can locate it in the filesystem list or by using the **Search** tab. If the Search tab isn't displayed, clicking the 3 vertical dots will reveal it as shown below:

Once you've selected your file, you can set breakpoints by clicking on the line number where you want the breakpoint to be set. This will pause the execution of your code at that breakpoint, allowing you to inspect variables and step through your code one line at a time.
By leveraging these tools, you will develop a deeper understanding of how your add-on is working, be able to identify and fix bugs more quickly, and benefit from a high-performing add-on.
### Console
When logging messages in your code, use the appropriate severity level that best describes the message. For example, an **Info** message might be used to provide general information about the application's state, while a **Warning** message might be used to alert developers about potential issues that could cause problems with the add-on. Similarly, an **Error** message might be used to indicate that an unexpected error has occurred, and a **Verbose** message might be used to see more descriptive information about the internal workings of the processing occurring in your add-on.
Use the `console.*` methods as shown below to represent the severity level you would like to see for debugging:
```bash
console.log('Info level)
console.warn('Warning level')
console.error('Error level)
console.debug(Verbose level)
```
You can specifically filter which levels you want to view in the developer tools with the **Custom levels** drop-down as well to help you find your specific messages more quickly:

To make it easier to filter and identify relevant messages in the console, it's also a good practice to include an obvious identifier as a prefix. This identifier could be a unique string or tag that is specific to your add-on, making it easier to distinguish your messages from other messages in the console. For example: `console.log([MyAddOn] - Initialization complete);`. Then you can filter on `MyAddOn` in the devtools and easily see what is relevant to your add-on.
Using appropriate severity levels and including identifiers in your console messages can greatly help improve the efficiency and effectiveness of your debugging, making it easier to identify and resolve issues.
### Printing JSON Data
Another helpful console method is `.dir()`, which displays a JSON representation of an object. For example, running `console.dir(document.head)` would generate the following output:

## Add-on SDK Developer Tools
The **Add-on Development** tools panel provides useful logging details and action buttons to allow for refreshing and clearing the data associated with your add-on, which are also useful for debugging and troubleshooting your add-on.

### Status messages
The **Add-on Development** panel also provides useful information via status messages like below to indicate when and where an error is occurring to help you target specific issues in your add-on. For instance, if an invalid value is found in the manifest, you will see something like the following:

### Refreshing and clearing data
The **Refresh** and **Clear data** buttons in the add-on developer tools can also be helpful when you want to manually force refresh your code (or when you update the manifest), or clear data you no longer want to persist. For instance, in the case of the ToDo list sample add-on (aka: `use-client-storage`), if you had added some items previously they will still be displayed when you open it again unless you actually clear the data. See the demo workflow video at the bottom of the boilerplate section for an example of this in action.

To make use of the add-on SDK's [ClientStorage API](../../references/addonsdk/instance-clientStorage.md) and store data in an underlying IndexedDB store, explore the ToDo list sample. You can view this store in the browser developer tools by navigating to the **Application** tab. Look for the IndexedDB store associated with your add-on ID to locate it. Here's an example:

See [the Client Storage API](../../references/addonsdk/instance-clientStorage.md) for more details about storing and persisting data with your add-ons.
# Overview
This section provides a set of guides to help you in the debugging stage of your add-on.
## Introduction
During your development, it's important to be able to debug your code and troubleshoot any issues that may arise. Fortunately, most modern browsers come with built-in developer tools that can help you do just that.
Check out this short video below on how to test and debug your add-on to help you get started more quickly, then read through the rest of the guides provided in this section for more details.
# Known Issues & Limitations
## Supported Browsers
## Sandboxed iFrame Caveats
# Debugging with Visual Studio Code
If you are a Visual Studio Code user, you can easily debug your add-on by following the steps in this guide.
## Steps
1. Begin by locating the existing `launch.json` file in the `.vscode` folder in the root of your project. This file will exist if you have created your add-on with the add-on CLI. Double check to ensure the URL points to `https://new.express.adobe.com/new/`.
**NOTE:** If it's a sample add-on that you downloaded, you may need to create one first with the **create a launch.json file**.

Then copy in the JSON configuration included below (or copy one in from an add-on you previously generated).
```json
{
"version": "0.1.0",
"configurations": [
{
"type": "chrome",
"request": "launch",
"name": "Debug(Chrome) Add-On",
"webRoot": "${workspaceFolder}",
/**
* For add-ons which donot specify the mappings automatically,
* user will be required to secify the mappings under pathMapping property.
*/
"pathMapping": {
"index.html": "${workspaceFolder}/src/index.html"
},
/**
* This will be the link of the document where the add-on is hosted
* or the url of the new document where you want to load the add-on
*/
"url": "https://new.express.adobe.com/new/"
},
{
"type": "msedge",
"request": "launch",
"name": "Debug(MS Edge) Add-On",
"webRoot": "${workspaceFolder}",
/**
* For add-ons which donot specify the mappings automatically,
* user will be required to secify the mappings under pathMapping property.
*/
"pathMapping": {
"index.html": "${workspaceFolder}/src/index.html"
},
/**
* This will be the link of the document where the add-on is hosted
* or the url of the new document where you want to load the add-on
*/
"url": "https://new.express.adobe.com/new/"
}
]
}
```
2. Start your add-on from your terminal as normal with `npm run start`.
3. Back in VS Code, click the **Run and Debug** option from the left panel and then select the profile related to where you want to debug (note that Chrome is the first one and selected by default but you can modify your configuration in the `launch.json` to your liking).


4. Once you have your selection set from above, simply hit the green play button outlined below to start debugging.

5. A new browser window will open for your debugging session directly to the Express URL you configured above. Connect to your add-on as you normally would in Express.
6. You can now set breakpoints as desired, and you will see the code execution stop with the line highlighted. You can also check the **DEBUG CONSOLE** window to see any console output directly in VS Code.

7. Note the toolbar added to the top of your screen in VS Code when you're in debug mode which allows you to step through your code after it's been stopped on a breakpoint.

# Overview
This set of best practices are important to keep in mind as you develop your add-on since they can ultimately make or break the user experience with your add-on.
## Best Practices
- Design responsively and remember the width and height of your add-on panel will vary by device.
- If the user needs to drill down into multiple panels, ensure you provide a way for them to navigate back.
- If the user will be logging in to a 3rd party service, ensure you provide a way for them to log out through your add-on UI.
- It's best to use a vertical layout for your UI components, with full-width buttons and components and vertical scrolling for overflow.
- If your add-on contains a gallery of images, a grid layout can work well.
- Use the header to help provide context in cases where your add-on requires a multi-step workflow, and to help with navigation.
- Use a footer if your add-on requires vertical scrolling for a primary CTA to be shown if needed.
- If you're using a search, use placeholder text to guide users in what they can search for, and display the search results directly below the search field.
- Use loading and progress indicators to provide visual feedback while things are in process.
- Ensure your add-on is able to adapt seamlessly to appearance changes like if the theme changes from light to dark. Only the light theme will be supported at GA but you should still code your add-ons to adapt for when new support is added. **Note:** See the **SWC** sample for a reference on handling theme changes.
- Always build with accessibility in mind. For instance, consider tab order and color, dark mode etc. Adobe Spectrum CSS provides design guidelines for ensuring accessibility in [the design system base docs](https://spectrum.adobe.com/), but it's also automatically built in to the Spectrum Web Components and React Spectrum implementations.
- Light mode is currently the only theme available, but dark mode will be supported in the future, so be sure to consider how your UI will look in dark mode as well.
# Using Fonts in Add-ons
## Adobe Fonts
The following Adobe Express fonts are injected into the add-on and can be used automatically.
```css
{
family: "adobe-clean",
source: "url('https://use.typekit.net/af/c0160f/00000000000000007735dac8/30/l?primer=f592e0a4b9356877842506ce344308576437e4f677d7c9b78ca2162e6cad991a&fvd=n4&v=3') format('woff2'), url('https://use.typekit.net/af/c0160f/00000000000000007735dac8/30/d?primer=f592e0a4b9356877842506ce344308576437e4f677d7c9b78ca2162e6cad991a&fvd=n4&v=3') format('woff'), url('https://use.typekit.net/af/c0160f/00000000000000007735dac8/30/a?primer=f592e0a4b9356877842506ce344308576437e4f677d7c9b78ca2162e6cad991a&fvd=n4&v=3') format('opentype')",
weight: "400",
style: "normal",
display: "auto"
},
{
family: "adobe-clean",
source: "url('https://use.typekit.net/af/95bf80/00000000000000007735dacd/30/l?primer=f592e0a4b9356877842506ce344308576437e4f677d7c9b78ca2162e6cad991a&fvd=i4&v=3') format('woff2'), url('https://use.typekit.net/af/95bf80/00000000000000007735dacd/30/d?primer=f592e0a4b9356877842506ce344308576437e4f677d7c9b78ca2162e6cad991a&fvd=i4&v=3') format('woff'), url('https://use.typekit.net/af/95bf80/00000000000000007735dacd/30/a?primer=f592e0a4b9356877842506ce344308576437e4f677d7c9b78ca2162e6cad991a&fvd=i4&v=3') format('opentype')",
weight: "400",
style: "italic",
display: "auto"
},
{
family: "adobe-clean",
source: "url('https://use.typekit.net/af/5c07ba/00000000000000007735dad8/30/l?primer=f592e0a4b9356877842506ce344308576437e4f677d7c9b78ca2162e6cad991a&fvd=n7&v=3') format('woff2'), url('https://use.typekit.net/af/5c07ba/00000000000000007735dad8/30/d?primer=f592e0a4b9356877842506ce344308576437e4f677d7c9b78ca2162e6cad991a&fvd=n7&v=3') format('woff'), url('https://use.typekit.net/af/5c07ba/00000000000000007735dad8/30/a?primer=f592e0a4b9356877842506ce344308576437e4f677d7c9b78ca2162e6cad991a&fvd=n7&v=3') format('opentype')",
weight: "700",
style: "normal",
display: "auto"
},
{
family: "adobe-clean",
source: "url('https://use.typekit.net/af/2dda0a/00000000000000007735dad4/30/l?primer=f592e0a4b9356877842506ce344308576437e4f677d7c9b78ca2162e6cad991a&fvd=n8&v=3') format('woff2'), url('https://use.typekit.net/af/2dda0a/00000000000000007735dad4/30/d?primer=f592e0a4b9356877842506ce344308576437e4f677d7c9b78ca2162e6cad991a&fvd=n8&v=3') format('woff'), url('https://use.typekit.net/af/2dda0a/00000000000000007735dad4/30/a?primer=f592e0a4b9356877842506ce344308576437e4f677d7c9b78ca2162e6cad991a&fvd=n8&v=3') format('opentype')",
weight: "800",
style: "normal",
display: "auto"
},
{
family: "adobe-clean",
source: "url('https://use.typekit.net/af/bc79c1/00000000000000007735dad9/30/l?primer=f592e0a4b9356877842506ce344308576437e4f677d7c9b78ca2162e6cad991a&fvd=n9&v=3') format('woff2'), url('https://use.typekit.net/af/bc79c1/00000000000000007735dad9/30/d?primer=f592e0a4b9356877842506ce344308576437e4f677d7c9b78ca2162e6cad991a&fvd=n9&v=3') format('woff'), url('https://use.typekit.net/af/bc79c1/00000000000000007735dad9/30/a?primer=f592e0a4b9356877842506ce344308576437e4f677d7c9b78ca2162e6cad991a&fvd=n9&v=3') format('opentype')",
weight: "900",
style: "normal",
display: "auto"
}
```
In the near future, all of the Adobe Express fonts will be injected for use, however, at the moment these specific fonts are being injected for you to access in your add-on without having to bundle them.
## Importing Fonts from a URL
You can use a font with a URL by either linking to it via an import rule, via the <link> tag, or `font-face`.
### Import with the <import> tag:
```html
```
or
### Import with the <link> tag:
```html
```
# Implementation Guide
This section will help you implement the concepts and best practices outlined in the UX Guidelines.
## Spectrum Design System
Leveraging Spectrum in your add-on allows you to take advantage of all of the built-in benefits it provides while saving front-end development time. There are a few different implementations of Spectrum that are outlined in the sections below for reference, and in order of preferred use.
Check out our [code samples](../../samples.md) for examples of how to use the libraries described here. Refer to the **export-sample** and **Pix** sample for a reference on using **Spectrum Web Components**, and the **Dropbox** and **import-images-using-oauth** for specific examples using **React Spectrum**.
### Spectrum Express Theme
If you want your add-on UI to match the [Express look-and-feel](https://spectrum.adobe.com/page/theming/#Resources-for-Spectrum-for-Adobe-Express), you can find Express-themed components available within the [Spectrum CSS](https://github.com/adobe/spectrum-css), [Spectrum Web Components](https://opensource.adobe.com/spectrum-web-components/tools/theme/) and [React Spectrum](https://www.npmjs.com/package/@react-spectrum/theme-express) libraries. Each of the sections below has more details on how to use the theme with the different libraries.
### Icons
Check out the variety of icons available for use in your add-ons from [Spectrum here](https://spectrum.adobe.com/page/icons/) as well. Additionally, there's a set of icons specificlly for the Express theme in an alpha stage currently available. To use those, install the package with `npm i @spectrum-icons/express` and then import the ones you want to use.
## Spectrum Web Components
The [Spectrum Web Components](https://opensource.adobe.com/spectrum-web-components/) project is an implementation of Spectrum with a set of pre-built UI components that can be easily customized and integrated into your application. These components are designed to work seamlessly together and provide a consistent user experience across different devices and platforms. ***We highly recommend Spectrum Web Components as the preferred approach for building the UI of your add-ons***, since it offers a comprehensive set of components and built-in benefits that make it easy to create consistent, accessible, and responsive user interfaces. Some additional benefits include:
- Framework agnostic
- Lightweight and performant
- Standards based
### Spectrum Web Components with React
[**swc-react**](https://opensource.adobe.com/spectrum-web-components/using-swc-react/) is a collection of React wrapper components for the Spectrum Web Components (SWC) library, allowing you to use SWC in your React applications with ease. Currently, `swc-react` supports 62 components. To install `swc-react`, simply replace the scope name `@spectrum-web-components` with `@swc-react` in the package naming convention in your `package.json` (ie: `"@swc-react/button"` instead of `"@spectrum-web-components/button"`). The sub-package name remains identical to the original SWC component and will be automatically installed along with the **swc-react** component. Then, you can import and use it in your `.jsx` like shown in the example below:
```js
import { Button } from "@swc-react/button";
```
Check out the [swc-react-theme-sampler code sample](../../samples.md#swc-react-theme-sampler) for a specific example of how to use it with various components in your add-on, as well as [the official documentation](https://opensource.adobe.com/spectrum-web-components/using-swc-react/) for more details on **swc-react**.
We recommend choosing [**swc-react**](https://opensource.adobe.com/spectrum-web-components/using-swc-react/) over [React Spectrum](#react-spectrum) in your add-ons based on React because it currently offers a more comprehensive set of components and built-in benefits.
### Spectrum Web Components with Express Theme
Below are the steps for using the Express theme with your Spectrum Web Components UI:
- Install the `spectrum-web-components` packages you would like to use. The `theme` package is one you will always want to install, but the others are included for illustration. See the [Spectrum Web Components site](https://opensource.adobe.com/spectrum-web-components/getting-started/) for all of the components available.
```bash
npm install @spectrum-web-components/theme
npm install @spectrum-web-components/field-label
npm install @spectrum-web-components/textfield
npm install @spectrum-web-components/button
```
- Next, start adding your imports. All add-ons should have this base set of imports, which provide support for Spectrum typography and the base Spectrum theme component, the Express themes, including colors (lightest, light, dark, and darkest) and scale options (medium, large).
```js
import '@spectrum-web-components/styles/typography.css';
import '@spectrum-web-components/theme/sp-theme.js';
import '@spectrum-web-components/theme/express/theme-darkest.js';
import '@spectrum-web-components/theme/express/theme-dark.js';
import '@spectrum-web-components/theme/express/theme-light.js';
import '@spectrum-web-components/theme/express/theme-lightest.js';
import '@spectrum-web-components/theme/express/scale-medium.js';
import '@spectrum-web-components/theme/express/scale-large.js';
```
- Then import the specific components you want to use in your code, such as:
```js
import '@spectrum-web-components/button/sp-button.js';
import '@spectrum-web-components/field-label/sp-field-label.js';
import '@spectrum-web-components/textfield/sp-textfield.js';
```
**Note:** The `import '@spectrum-web-components/theme/src/express/themes.js';` includes all of the definitions for the Express theme, but you can also only include the specific parts you need. For instance, if you only want to support the light theme and the medium scale, you could specifically include those with: `import '@spectrum-web-components/theme/express/theme-light.js'; import '@spectrum-web-components/theme/express/scale-medium.js';` For more details on themes and all of the color and scale options, see [this link](https://opensource.adobe.com/spectrum-web-components/tools/theme/).
- Use a `webpack.config.js` for bundling the Spectrum Web Components and your JavaScript into a bundle. If you used the basic javascript template for your add-on, you can copy it in from a sample add-on, such as the SWC one in the contributed samples folder. Also be sure to include the webpack specific dependencies and script options in your `package.json`, which you can also copy from a sample like SWC. If you find that some files aren't being moved to `dist` after you build, you'll want to edit the file (line 31,32) to add more file types to copy.
- Now you can use the `scale`, `color` and `theme` selections you desire with the `` component. Within those tags is where you should place all of your content that you want styled with those settings. For example:
```html
/* Everything you want styled with those settings */
/* goes within the tag */
Enter your full name in the field belowSubmit
```
#### Default vs Express Theme
The screenshots below are from a Spectrum Web Components sample app showing some an example of how the components differ between the themes to illustrate some differences for reference.
#### Default Theme sample:

#### Express Theme sample:

Check out the [code samples](../../samples.md) in the contributed folder for **SWC** and **Pix** for examples of using Spectrum Web Components with plain JavaScript and React accordingly.
## React Spectrum
[React Spectrum](https://react-spectrum.adobe.com/react-spectrum/index.html) is a project that implements the Adobe's Spectrum design language into React UI components.
React Spectrum is composed of three parts:
- **react-spectrum**: a component library implementing the Adobe Spectrum design system
- **react-aria**: a library of React hooks implementing the patterns defined in the ARIA practices spec, including mouse, touch, and keyboard behavior, accessibility, and internationalization support
- **react-stately**: a library of React hooks implementing cross platform (e.g. web/native) state management for components that need it.
We recommend using [**swc-react**](https://opensource.adobe.com/spectrum-web-components/using-swc-react/) over [React Spectrum](#react-spectrum) in your add-ons based on React, because it currently offers a more comprehensive set of components which provide built-in benefits as detailed above in the [Spectrum Web Components section](#spectrum-web-components), and is more actively supported.
### React Spectrum with Express Theme
[The React Spectrum Express theme](https://www.npmjs.com/package/@react-spectrum/theme-express) is still in an alpha stage currently, but can be used with the following steps:
1. Install it in your project with:
`npm install @react-spectrum/theme-express`
2. Install the Express themed icons:
`npm install @spectrum-icons/express`
3. Import the theme and icons into your code to use them. For example, notice the following code snippet which imports and sets the Express `theme`, light `colorScheme` option and medium `scale` option on the `` object. It also illustrates how to use the Express version of the `Delete` icon.
```js
import { theme as expressTheme } from '@react-spectrum/theme-express';
import Delete from '@spectrum-icons/express/Delete';
const App = ({ addOnUISdk }) => {
return (
)
}
```
#### React Spectrum Theme Examples
Below is an example of some components from React Spectrum with the two themes. Please note, since the [React Spectrum with Express theme project](https://www.npmjs.com/package/@react-spectrum/theme-express) is still in an alpha state, there will be components that haven't been completely ported over yet.
##### Default theme sample:

##### Express theme sample:

The [React Spectrum Express theme](https://www.npmjs.com/package/@react-spectrum/theme-express) is still in an alpha state, but you can use [Spectrum Web Components](https://opensource.adobe.com/spectrum-web-components/tools/theme/) with React as well. See the **Pix** code sample in the provided samples for an example of how to mix Spectrum Web Components with React. Specifically, you should note that there are some intricacies when using this combination of Spectrum Web Components and React in terms of event handling, but they can be handled by using a component that wraps the Spectrum Web Components for providing the event handling instead. In the **Pix** sample, take a look at the wrapper component called `WC.jsx` for a reference of how to do this.
#### CAUTION: Using React Spectrum with a Slider Component
If you're using a slider component with React Spectrum, you may notice behavior where if the user moves their mouse out of the panel and releases the mouse pointer, the slider still thinks the mouse pointer is down when the mouse is moved back inside the panel. You can fix this with the following steps:
1. Wrap your slider(s) with another element. A <div> works fine.
2. Add a ref that points to this div so you can refer to it later.
3. Add two event handlers:
- `onPointerDownCapture` will call `sliderContainer.current.setPointerCapture(evt.nativeEvent.pointerId)`
- `onPointerUp` will call `sliderContainer.current.releasePointerCapture(evt.nativeEvent.pointerId)`
**Example Snippet**
```js
import React, {useRef} from "react";
import { theme as expressTheme } from '@react-spectrum/theme-express';
import {Slider, Provider} from '@adobe/react-spectrum'
const App = ({ addOnUISdk }) => {
const sliderContainer = useRef();
const startDrag = (evt) => {
sliderContainer.current.setPointerCapture(evt.nativeEvent.pointerId);
}
const stopDrag = (evt) => {
sliderContainer.current.releasePointerCapture(evt.nativeEvent.pointerId);
}
return <>
>
};
export default App;
```
## Spectrum CSS
[Spectrum CSS](https://opensource.adobe.com/spectrum-css/) is an open-source implementation of Spectrum and includes components and resources to make applications more cohesive. Spectrum CSS is designed to be used in partnership with [Spectrum’s detailed usage guidelines](https://spectrum.adobe.com/).
You should only rely on using the base [Spectrum CSS](https://opensource.adobe.com/spectrum-css/) library for simple applications that need basic things like typography, checkboxes, text fields, etc. Otherwise you should try using one of the other implementations provided like [Spectrum Web Components](https://opensource.adobe.com/spectrum-web-components/) and [React Spectrum](https://react-spectrum.adobe.com/react-spectrum/index.html) since they include interactivity, event handling etc built-in over what's possible with pure CSS. The best place to start with each of these libraries is to go to the **Getting Started** page in the top of the docs for each.
## Tips
Use the existing Adobe Express UI as an example of the types of patterns and behaviors to use in your own add-on design. For instance, you could take a closer look at the other panels and how the UI is implemented in them to help guide you, such as the Media, Theme and Text panels shown below, which are already part of Express.
#### Media Panel

#### Theme Panel

#### Text Panel

**Color Picker Component Tip:**
If you're using the native browser color picker, it looks slightly different in every browser and doesn't fit the Express theme by default. You can make this control look more like Spectrum with CSS as [illustrated in this codepen](https://codepen.io/kerrishotts/pen/QWZazJP) for reference, or borrow the code used in [this guide](../tutorials/grids-addon.md#coding-the-grids-add-on).
## Using Fonts
The following `adobe-clean` fonts and weights are injected into the add-on and can be used automatically.
```css
{
family: "adobe-clean",
source: "url('https://use.typekit.net/af/c0160f/00000000000000007735dac8/30/l?primer=f592e0a4b9356877842506ce344308576437e4f677d7c9b78ca2162e6cad991a&fvd=n4&v=3') format('woff2'), url('https://use.typekit.net/af/c0160f/00000000000000007735dac8/30/d?primer=f592e0a4b9356877842506ce344308576437e4f677d7c9b78ca2162e6cad991a&fvd=n4&v=3') format('woff'), url('https://use.typekit.net/af/c0160f/00000000000000007735dac8/30/a?primer=f592e0a4b9356877842506ce344308576437e4f677d7c9b78ca2162e6cad991a&fvd=n4&v=3') format('opentype')",
weight: "400",
style: "normal",
display: "auto"
},
{
family: "adobe-clean",
source: "url('https://use.typekit.net/af/95bf80/00000000000000007735dacd/30/l?primer=f592e0a4b9356877842506ce344308576437e4f677d7c9b78ca2162e6cad991a&fvd=i4&v=3') format('woff2'), url('https://use.typekit.net/af/95bf80/00000000000000007735dacd/30/d?primer=f592e0a4b9356877842506ce344308576437e4f677d7c9b78ca2162e6cad991a&fvd=i4&v=3') format('woff'), url('https://use.typekit.net/af/95bf80/00000000000000007735dacd/30/a?primer=f592e0a4b9356877842506ce344308576437e4f677d7c9b78ca2162e6cad991a&fvd=i4&v=3') format('opentype')",
weight: "400",
style: "italic",
display: "auto"
},
{
family: "adobe-clean",
source: "url('https://use.typekit.net/af/5c07ba/00000000000000007735dad8/30/l?primer=f592e0a4b9356877842506ce344308576437e4f677d7c9b78ca2162e6cad991a&fvd=n7&v=3') format('woff2'), url('https://use.typekit.net/af/5c07ba/00000000000000007735dad8/30/d?primer=f592e0a4b9356877842506ce344308576437e4f677d7c9b78ca2162e6cad991a&fvd=n7&v=3') format('woff'), url('https://use.typekit.net/af/5c07ba/00000000000000007735dad8/30/a?primer=f592e0a4b9356877842506ce344308576437e4f677d7c9b78ca2162e6cad991a&fvd=n7&v=3') format('opentype')",
weight: "700",
style: "normal",
display: "auto"
},
{
family: "adobe-clean",
source: "url('https://use.typekit.net/af/2dda0a/00000000000000007735dad4/30/l?primer=f592e0a4b9356877842506ce344308576437e4f677d7c9b78ca2162e6cad991a&fvd=n8&v=3') format('woff2'), url('https://use.typekit.net/af/2dda0a/00000000000000007735dad4/30/d?primer=f592e0a4b9356877842506ce344308576437e4f677d7c9b78ca2162e6cad991a&fvd=n8&v=3') format('woff'), url('https://use.typekit.net/af/2dda0a/00000000000000007735dad4/30/a?primer=f592e0a4b9356877842506ce344308576437e4f677d7c9b78ca2162e6cad991a&fvd=n8&v=3') format('opentype')",
weight: "800",
style: "normal",
display: "auto"
},
{
family: "adobe-clean",
source: "url('https://use.typekit.net/af/bc79c1/00000000000000007735dad9/30/l?primer=f592e0a4b9356877842506ce344308576437e4f677d7c9b78ca2162e6cad991a&fvd=n9&v=3') format('woff2'), url('https://use.typekit.net/af/bc79c1/00000000000000007735dad9/30/d?primer=f592e0a4b9356877842506ce344308576437e4f677d7c9b78ca2162e6cad991a&fvd=n9&v=3') format('woff'), url('https://use.typekit.net/af/bc79c1/00000000000000007735dad9/30/a?primer=f592e0a4b9356877842506ce344308576437e4f677d7c9b78ca2162e6cad991a&fvd=n9&v=3') format('opentype')",
weight: "900",
style: "normal",
display: "auto"
}
```
### Importing custom fonts
You can use a custom font with a URL by either linking to it via the `@import` rule, the <link> tag, or the `@font-face` rule.
#### Via the `@import` rule:
```css
```
#### Via the `` tag:
```html
```
#### Via the `@font-face` rule
Specify a name for the font and where it can be found, then use it on the desired HTML tag with the specified name. For example:
```css
@font-face {
font-family: "MyWebFont";
src: url("https://mdn.github.io/css-examples/web-fonts/VeraSeBd.ttf");
}
body {
font-family: "MyWebFont", serif;
}
```
Using custom fonts can be great for design, but it’s important to also understand that it can can cause a performance hit because the font must be downloaded before it’s displayed. Note that the `@font-face` `src:` supports a `local` attribute as well which will try to load the font from the users local system first, which can help mitigate the performance hit. See [this link](https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face) for full details.
## Useful Resources
- [Figma plugin](https://www.figma.com/community/file/1211274196563394418/Adobe-Spectrum-Design-System) that provides Spectrum UI elements.
---
hideBreadcrumbNav: true
---
# Design Overview
The design of your add-on is just as important to the success of your add-on as the features it provides.
## Introduction
This set of design guides is provided to help lead you through the design process of your add-on and includes useful guidelines, tips, and resources. First, we encourage you to watch this short video about designing your add-on interface, then read on for more details.
---
keywords:
- Adobe Express
- Express Add-on
- Extend
- Extensibility
- User Interface
- User Experience
- UI
- UX
- Guidelines
- Branding
title: Branding Guidelines
description: This document provides an overview of the UX guidelines to follow when designing your Adobe Express add-on.
contributors:
- https://github.com/undavide
---
# Branding Guidelines
When creating your add-on, a distinct and consistent brand identity is your ticket to a lasting impression.
This section focuses on key aspects of branding, like Icon and Publisher Logo design, as well as best practices for incorporating promotional images (screenshots or illustrations) for the Adobe Express add-on Marketplace.
Please refer to the [Developer Brand Guidelines](https://developer.adobe.com/express/embed-sdk/docs/assets/34359598a6bd85d69f1f09839ec43e12/Adobe_Express_Partner_Program_brand_guide.pdf) for comprehensive details on integrating Adobe branding, including when and how to use Adobe logos, product names, and terms.
## Add-on Icon
The add-on's icon should be original, suitable for different devices and browsers, and not violate the [Developer Brand Guidelines](https://developer.adobe.com/express/embed-sdk/docs/assets/34359598a6bd85d69f1f09839ec43e12/Adobe_Express_Partner_Program_brand_guide.pdf). Please request a written license agreement from Adobe if you wish to use any Adobe logo, product icon, or image in your preview and feature graphics, product icons, or website.
Three sizes are required for the add-on's icon: **36x36**, **64x64**, and **144x144** pixels as PNG or JPG files.

## Publisher Logo
The publisher's logo is only required the first time you [submit for distribution](/guides/distribute/public-dist.md#2-prepare-your-assets), in case you've never created a publisher profile before. It should be a square, **250x250** pixels PNG or JPG file.

## Imagery
When creating a [public listing](../../distribute/public-dist.md) for the Adobe Express add-on Marketplace, you can provide promotional images, such as screenshots and illustrations. At least one is required.

### Screenshots and illustrations
Any image used in your listing must comply with the [Developer Brand Guidelines](https://developer.adobe.com/express/embed-sdk/docs/assets/34359598a6bd85d69f1f09839ec43e12/Adobe_Express_Partner_Program_brand_guide.pdf). They should accurately depict the add-on's functionality and features and not contain any misleading information or inappropriate content. The recommended image size is **1360x800** pixels, as PNG or JPG.

---
keywords:
- Adobe Express
- Express Add-on
- Extend
- Extensibility
- User Interface
- User Experience
- UI
- UX
- Guidelines
- Branding
title: Changelog
description: UX Guidelines Changelog.
contributors:
- https://github.com/undavide
---
## Changelog
### 8 October 2024
- Created a new web version of the Adobe Express add-on UX Guidelines.
- Integrated the existing content from the Adobe XD document into the new structure. The old version is [available here](https://xd.adobe.com/view/urn:aaid:sc:US:fd638450-1af8-49c3-ad29-0e76c2a2136f/) as a reference.
### 28 August 2023
- Last update to the Adobe XD document version of the Adobe Express add-ons UX Guidelines.
---
keywords:
- Adobe Express
- Express Add-on
- Extend
- Extensibility
- User Interface
- User Experience
- UI
- UX
- Guidelines
- Design Principles
title: Design Principles
description: This document provides an overview of the UX guidelines to follow when designing your Adobe Express add-on.
contributors:
- https://github.com/undavide
---
# Design Principles
When you're designing add-ons for Adobe Express, it's important to start with the principles that guide all of Adobe's products. They will be your roadmap, ensuring that what you create is not only visually appealing but also consistent, accessible, and user-friendly. Think of them as your toolkit for building something that looks great, works well, and fits seamlessly into the application.
## Consistency: creating a cohesive experience
You should design your add-ons to feel like a natural extension of the platform, conforming to Adobe Express's visual language: the Spectrum Design System. This coherence isn't just about visual elements but extends to interaction patterns and behaviours. Keeping everything aligned creates a smoother experience where users can easily navigate and understand your add-on, achieving their goals effortlessly.
## Accessibility: designing for inclusion
All add-ons you develop should be accessible to everyone, regardless of their abilities or circumstances. This includes considering elements like contrast and text size, as well as accommodating a broad spectrum of digital skills. An accessible design adapts to the user, offering clear and intuitive interactions, removing barriers, and making sure that every user can fully engage with it.
## Usability: prioritizing ease of use
Your add-on should be as easy to operate as it is powerful. Design it with users in mind so they can navigate it effortlessly, where each feature is clearly accessible and straightforward. Eliminate unnecessary steps and ensure that every interaction feels natural. Always provide feedback so users know what to expect and how to achieve their goals. The more intuitive the experience, the more likely they are to engage and rely on it over again.
## Aesthetics: balancing form and function
The aesthetic appeal of your add-on plays a significant role in the overall user experience: a pleasing design attracts more users and enhances their interaction with it. When the design is functional and visually charming, it creates an enjoyable experience and complements usability. Keeping the aesthetics aligned with Adobe's brand identity will reinforce the connection to the platform and tighten the overall user experience.
## Bringing it all together
By embracing these design principles, you'll build add-ons that integrate smoothly with Adobe Express and provide real value to users. Each concept works in harmony with the others; keep these guidelines in mind as you develop, and you'll create tools that are both effective and a pleasure to use. In the following pages, you'll find detailed recommendations, requirements, and best practices to help you apply these principles to your projects.
---
keywords:
- Adobe Express
- Express Add-on
- Extend
- Extensibility
- User Interface
- User Experience
- UI
- UX
- Guidelines
- Feedback
- Messaging
title: Feedback & Messaging
description: This document provides an overview of the UX guidelines to follow when designing your Adobe Express add-on.
contributors:
- https://github.com/undavide
---
# Feedback & Messaging
Feedback and messaging are essential UX components. Your add-ons should always provide users with information about the state of the system, the results of their actions, and any errors that may have occurred.
Unclear feedback and mishandled errors can lead to confusion and, crucially, are a cause of [rejection](../../../guides/distribute/rejections.md#error-handling) when submitting add-ons to the Adobe Express Marketplace. On the other hand, well-designed feedback can help users understand what is happening and what they need to do next.
## Loading Indicators
Loading indicators are particularly important when the system is processing a request that may take some time to complete; for instance, when fetching data from a server or authenticating a user. They show that the system is working and users should wait for the process to finish.
### Progress Circles
[Progress circles](https://spectrum.adobe.com/page/progress-circle/) show the progression of a system operation such as downloading, uploading, processing, etc. in a visual way.

They can represent determinate or indeterminate progress: either the percentage of the operation that has been completed or spin indefinitely until completion.

### Ghost Loading
When a group of cards are loading, they follow the [ghost loading convention](https://spectrum.adobe.com/page/cards/#Ghost-loading).

There are 5 phases for ghost loading:
1. Card group (including metadata) ghost loads.
2. If metadata for all cards is loaded before all preview images are loaded, the metadata is displayed for all cards as soon as the last piece of metadata loads. Previews continue to ghost-load.
3. If all preview images load within a certain period (usually measured in seconds, which you need to specify depending on the use case), they are shown as soon as the last preview loads.
4. If all previews have not finished loading at the end of the x period, the loaded previews are shown, and the pending previews each receive an individual progress circle. The group is no longer in a ghost-loading state.
5. If the preview load times out, an error is shown along with a mechanism to retry loading.
## In-line Alerts
[In-line alerts](https://opensource.adobe.com/spectrum-css/inlinealert.html) display a non-modal message associated with objects in a view. These are often used in form validation, providing a place to aggregate feedback related to multiple fields.

## Toasts
[Toasts](https://spectrum.adobe.com/page/toast/) display brief, temporary notifications. They’re meant to be noticed without disrupting a user’s experience or requiring an action to be taken.

They come in multiple kinds, each with a different purpose:

## Full-panel Messaging
When the feedback is more complex or requires more space, a full-panel message can be used.

Please mind the padding between the graphics, text and other UI elements to ensure a clear and organized layout.

---
keywords:
- Adobe Express
- Express Add-on
- Extend
- Extensibility
- User Interface
- User Experience
- UI
- UX
- Guidelines
hideBreadcrumbNav: true
title: Add-on UX Guidelines
description: This document provides an overview of the UX guidelines to follow when designing your Adobe Express add-on.
contributors:
- https://github.com/undavide
---
# UX Guidelines for Adobe Express Add-ons
A successful add-on provides a seamless and intuitive User Experience (UX) that blends harmoniously with Adobe Express.

These Guidelines are your roadmap to creating add-ons that align with Adobe's design principles and visual language, ensuring a consistent and enjoyable experience. Following them will help you build tools that resonate with users and feel like a natural extension of the application.
## Intended audience
This document is intended for developers, designers, and product teams involved in creating Adobe Express add-ons. Whether you're crafting your first add-on or improving an existing one, these guidelines offer valuable insights and best practices to help you align with Adobe's UX standards.
## How to navigate this document
To get the most out of the UX Guidelines, start by familiarizing yourself with the [Design Principles](design_principles.md) section. They provide the foundation for all design decisions and will help you understand the core values that should drive your work.
Next, the [Theming](theming.md) section shows you how to implement the Spectrum for Adobe Express theme, along with customization options and examples. [Visual Elements](./visual_elements.md) is a detailed list of structural and functional components that make up the Adobe Express visual language. It covers everything from typography to grids, navigation, and a variety of UI elements alongside with implementation examples.
[Feedback & Messaging](feedback_and_messaging.md) provides best practices for communicating feedback or alert errors to users.
Explore the [Branding Guidelines](branding_guidelines.md) to ensure your add-on is legally & visually aligned with Adobe Express. They cover key aspects of branding, as well as best practices for incorporating promotional images for the Adobe Express add-on Marketplace.
Finally, look at the [Resources & References](./resources_and_references.md) for videos and further reading. Refer to the [Changelog](./changelog.md) to stay up-to-date with the latest features and improvements to these guidelines: they are a living document we encourage you to consult regularly, both as a reference and a source of inspiration.
---
keywords:
- Adobe Express
- Express Add-on
- Extend
- Extensibility
- User Interface
- User Experience
- UI
- UX
- Guidelines
- Mobile
title: Mobile UX
description: This document provides an overview of the UX guidelines to follow when designing your Adobe Express add-on.
contributors:
- https://github.com/undavide
---
# Mobile UX
Designing add-ons that can be used when Adobe Express runs on mobile devices requires some attention. Although the same general principles so far outlined still apply, component sizing, layout, and typography should be tweaked to ensure the proper user experience on smaller screens.
The following sections outline the key differences and best practices for optimizing your add-ons for mobile devices.

## Basic Structure
Mobile interfaces feature a streamlined layout, with two primary content areas controlled by Adobe: the title bar and the footer. The add-on's content is displayed in the body area; considering the smaller screen size, you should optimize the design for readability and ease of interaction.

## Default panel height vs. full panel height
By default, the panel covers around half of the screen's vertical space, with a height of 375px. This layout balances the add-on interface and the document view, ensuring both are easily accessible.
When the user swipes up the handlebar, which is always visible, the panel expands upward until the entire 699px height available is covered. This full-height view is ideal for displaying detailed content or additional options.

## Typography
Typography on mobile requires adjustments from desktop standards to ensure readability; the font size is generally smaller, and the weight is lighter.
For **headings**, we recommended a font-size in the 15-19px range, and not exceeding 20px. The font-weight should be 400-500, typically the latter. On desktop, headings are in the 14-22px range (rarely, up to 34px) and weights of 600-700 are common.

On mobile, **body** is in the same 15-19px range, with a font-weight of 300.

## Foundational components
While mobile and desktop share many common components, sizing and placement are crucial distinctions. Mobile interfaces should avoid using extra-large (XL) component instances, which can overwhelm the screen. Instead, opt for Medium (M) or Large (L) sizes, more suitable for mobile displays.

### Buttons
On mobile, buttons that convey singular, primary actions should be styled using the Medium size and Primary variant. Center them horizontally and align them to the bottom—remember to account for the footer area controlled by Adobe.

### Button Groups
Button groups should extend across the available width of the UI, minus a 40px margin (16px on each side, with an 8px gap between buttons). This layout ensures that buttons are easily tappable and well-spaced on smaller screens.

---
keywords:
- Adobe Express
- Express Add-on
- Extend
- Extensibility
- User Interface
- User Experience
- UI
- UX
- Guidelines
- Resources
- References
title: Resources and References
description: This document provides an overview of the UX guidelines to follow when designing your Adobe Express add-on.
contributors:
- https://github.com/undavide
---
# Resources and References
To inform and inspire your design process, we've compiled a list of resources and references to help you create engaging, consistent and functional user experiences for your Adobe Express add-ons.
## Video Tutorials
Design tips for creating Adobe Express add-ons, by Steph Corrales (Sr. Experience Designer, Adobe Developer Experience).
Adobe Express add-on's with Spectrum Web Components [workshop](../../tutorials/spectrum-workshop/index.md), by Holly Schinsky (Sr. Developer Relations Engineer, Adobe Developer Experience).
## Further Reading
- [Adobe Spectrum](https://spectrum.adobe.com/): Adobe's design system.
- [Spectrum Web Components](https://opensource.adobe.com/spectrum-web-components/): Web components implementation of Spectrum.
- [Adobe Spectrum 2](https://s2.spectrum.adobe.com/): the next major version of Spectrum, currently in preview.
---
keywords:
- Adobe Express
- Express Add-on
- Extend
- Extensibility
- User Interface
- User Experience
- UI
- UX
- Guidelines
- Theming
title: Theming
description: This document provides an overview of the UX guidelines to follow when designing your Adobe Express add-on.
contributors:
- https://github.com/undavide
---
# Theming
Adobe Express is based on Spectrum, Adobe's design system, which provides a set of guidelines and components for creating consistent and visually engaging user interfaces.
While Spectrum is the main reference throughout this guide, the Adobe Design team has released a preview of the next major version, [Spectrum 2](https://s2.spectrum.adobe.com/): a completely rebuilt user experience that is more modern, friendly, accessible, and enjoyable to use.
## Spectrum for Adobe Express Theme
The Spectrum design system supports theming, allowing you to customize features like icon sets, font weight and size, and accent colors to suit your brand or use case better. We recommend using the provided [Adobe Express Theme](https://spectrum.adobe.com/page/theming/#Available-themes), specifically designed to accommodate the needs of a mainstream, creative consumer audience. It features a friendlier visual tone, bolder typography, softer rounding on elements, and indigo as the accent color. See the Spectrum for Adobe Express theme in action below on the right, compared to the default on the left:

## Customization Guidelines
When customizing your add-on's theme, you're free to incorporate brand-specific elements, such as color schemes and logos tailored to your identity. It is essential that the overall experience remains consistent with the Spectrum for Adobe Express styling guidelines, though. They ensure a cohesive user experience across all add-ons, maintaining a professional and polished appearance while allowing room for personalization.
If you’re developing a custom component, it must adhere to the Spectrum Express style standards, too, in order to ensure visual harmony and usability within the Adobe Express ecosystem. For detailed guidance on these requirements, please refer to [these guidelines](https://opensource.adobe.com/spectrum-web-components/tools/theme/#usage).
---
keywords:
- Adobe Express
- Express Add-on
- Extend
- Extensibility
- User Interface
- User Experience
- UI
- UX
- Guidelines
- Visual Elements
title: Visual Elements
description: This document provides an overview of the UX guidelines to follow when designing your Adobe Express add-on.
contributors:
- https://github.com/undavide
---
import '/src/styles.css'
# Visual Elements
You can use Color, Typography and Layout to establish hierarchy in your designs.
Adobe Express implements the "Spectrum for Adobe Express theme", which has been designed specifically for it. You’ll notice a friendlier visual tone, with bolder typography, softer rounding on elements, and indigo serving as the accent color.
## Color
The colors available in the Spectrum for Adobe Express light theme are designed to provide users with clear visual context and establish a hierarchy of actions within the UI. These colors help guide users through their workflow, ensuring that key actions stand out while maintaining a cohesive and accessible design.
When applying color, follow the specific styling recommendations at the component level to ensure consistency. Avoid overusing the accent color: it's meant to highlight primary actions, not dominate the entire interface. Additionally, adhere to the contrast ratio guidelines to maintain readability and accessibility for all users.
For more details on best practices, please refer to this [Color system guide](https://spectrum.adobe.com/page/color-system/#Colors).
## Typography
Spectrum is based on the Adobe Clean and Adobe Clean Han typefaces. The former is used for Latin characters, while the latter is for Simplified Chinese, Traditional Chinese, Japanese, and Korean ones.
### Headings
Headings in Spectrum for Adobe Express use bolder typography. The default weight is 700 (Adobe Clean Black, Sans Serif), with a size ranging from M to XXS.

### Body Text
The available sizes for body text in Spectrum for Adobe Express span from XS to XXL, while the weight is usually around 400-500.

### Usage
Here's an example of how you can implement the Adobe Clean typeface in your add-on; please note the recommended spacing between text and other user interface elements.

## Layout & Structure
A well-structured layout sets the stage for a great design.
Adobe Express is built on a clean and consistent structure designed for clarity and usability: add-ons should follow the same rules and blend in.
### Basic Structure
Add-ons on Desktop are assigned a specific width of **320px** and a **100%** height to ensure uniformity within the Adobe Express user interface and its modules. The layout is divided into the following parts:
- The title bar with the add-on's icon—controlled by Adobe.
- The body holding the add-on's content.
- Optionally, a footer with Call to Action (CTA) buttons.

### Padding
Padding plays a crucial role in maintaining visual harmony and readability. You should consistently apply the following padding scheme:
- **24px** on the body to create a balanced spacing around the content. An additional padding of the same amount is applied at the footer's bottom.
- **16px** between internal elements to ensure they are appropriately spaced.
This padding structure ensures that content is well-separated and easy to interact with.

### Responsive Grid and Core Container Styles
Adobe Express add-ons rely on a [responsive grid system](https://spectrum.adobe.com/page/responsive-grid/). Core container styles define a few key media sizes:
- **272x128px** for banners.
- **128x128px** tops for standard media.
- **80x80px** for smaller media items.
Remember to apply the standard gap of 16px between grid elements for consistency.

### Panel Structure and core content actions
Panel structure in Adobe Express add-ons is designed to support core content actions, such as searching, sorting, and filtering. These actions are typically placed at the top of the panel for easy access, between the title and main body.

### Structural Grids and Foundational Patterns
Structural grids in Adobe Express add-ons are designed to accommodate various content types, from simple lists to more visually complex media grids. Three of the container variants are as follows:
- **Media Grid:** A straightforward grid for displaying media items.
- **Media Grid with Labels:** Enhances the basic grid by adding labels beneath each item, ensuring clarity.
- **Media Grid with Cards:** Adds a card-like structure on each media item.
Please note the specific paddings on each of these grid types.

## Panel Actions
Panel Actions are interactive elements that allow users to search, sort, filter, and manage content within your add-on.
### Actions Overview
Commonly found at the top of the add-on panel, Panel Actions include:
- **Search**: allows users to quickly find specific content.
- **Filter**: enables users to narrow down visible content based on criteria.
- **Sort**: organizes content by relevance, date, or other metrics.
- **Add Folder**: gives users the ability to create new folders within the add-on.
- **Tabs**: lets users navigate between different sections or views.
These actions enable users to "drill into" specific sections, for example dynamically refining a list of thumbnails that follows.

### Best Practices
Panel Actions, when available, should be arranged at the top of the add-on's content area. This ensures that users can easily access them and that they are always visible even when the grid below scrolls.
### Examples
Here are some examples of common panel organizations and hierarchies for Adobe Express add-ons.

## Components
Spectrum includes a number of widgets that allow you to build rich UIs for your add-ons. Foundational components should use the Spectrum for Adobe Express theme whenever possible.
This is a [Spectrum theme](https://spectrum.adobe.com/page/theming/) specifically designed for the Adobe Express product suite to accommodate the needs of a mainstream, creative consumer audience. It features a friendlier visual tone, bolder typography, softer rounding on elements, and indigo as the accent color. See the Spectrum for Adobe Express theme in action below on the right, compared to the default on the left:

### Buttons
[Buttons](https://spectrum.adobe.com/page/button/#Usage-guidelines) allow users to perform an action or navigate to a different part of the add-on. They have multiple styles to fit various needs and are ideal for calling attention when a user needs to take action to move forward in the workflow.

Please mind the padding when using CTA buttons in the add-on's footer.
### Button Groups
A [Button Group](https://spectrum.adobe.com/page/button-group/) is a collection of buttons that perform related actions. See the [Usage Guidelines](https://spectrum.adobe.com/page/button-group/#Usage-guidelines) for more information on their correct use.

### Secondary Variant Buttons
The [Secondary Variant Button](https://spectrum.adobe.com/page/button/#Usage-guidelines) is for low emphasis. It’s paired with other button types to surface less prominent actions, and should never be the only button in a group.

Spectrum buttons support several variants (Accent, Primary, Secondary, Negative, Icon) to fit different use cases; refer to the [Spectrum reference](https://spectrum.adobe.com/page/button/#Options) to see all available options and when to use them.
## Form Elements
Form elements are essential for collecting user input and enabling interactions within your add-on. They include a variety of components such as text fields, search fields, pickers, and more.
### Text Fields
[Text fields](https://spectrum.adobe.com/page/text-field/) allow users to input custom text entries with a keyboard. Various options can be shown with the field to communicate their requirements.

It's recommended to let text fields span the entire add-on's width—minus the container's padding—when possible, for a more consistent look.
### Search Fields
A [Search Field](https://spectrum.adobe.com/page/search-field/) is used for searching and filtering content. As mentioned in the [Layout & Structure](#layout--structure) section, the search field should be placed at the top of the panel, between the title and the main body.

### Pickers
[Pickers](https://spectrum.adobe.com/page/picker/) (sometimes known as "dropdowns" or "selects") allow users to choose from a list of options in a limited space. The list of options can change based on the context.

Like all the components covered so far, it's best for pickers to take advantage of the add-on's full width.
### Color Pickers
Color pickers are a special type of picker that allows users to select a color.

The Spectrum component used as a Color Picker is the [Swatch](https://spectrum.adobe.com/page/swatch/), which shows a small sample of a fill—such as a color, gradient, texture, or material—that is intended to be applied to an object.
The Swatch itself doesn't embed any color picker functionality, but it can be used in conjunction with a native `` hidden element to trigger the browser's color picker. You can find an example with sample code in [this tutorial](/guides/tutorials/grids-addon.md#coding-the-grids-add-on).
## Navigation
Navigation is a key component of any user interface. It helps users understand where they are, where they can go, and how to get there. Spectrum provides a few components that we recommend to help you build a clear and consistent navigation system for your add-on.
### Tabs
Tabs organize content into multiple sections and allow users to navigate between them; the content under the set of tabs should be related and form a coherent unit. Please always include a label for accessibility.

### Accordions
The [Accordion](https://opensource.adobe.com/spectrum-web-components/components/accordion/) element contains a list of items that can be expanded or collapsed to reveal additional content or information associated with each item. There can be zero expanded items, exactly one expanded item or more than one item expanded at a time, depending on the configuration. This list of items is defined by child elements that are targeted to the default slot of their parent.

# Cross-origin isolation handling
How to ensure your add-ons work properly with the cross-origin isolation headers enforced by Adobe Express.
## Overview
Adobe Express will soon be enforcing cross-origin isolation on the associated domains (i.e., “new.express.adobe.com”) for Chromium-based browsers (including Chrome, Microsoft Edge, Opera, and others). This *may* impact your add-on due to stricter rules enforced by the browser.
We expect the enforcement of cross-origin isolation headers to begin around the end of 2024, and we will update you the moment we have a more specific date. In the meantime, you’ll want to ensure that any add-ons you’ve developed or are developing now work in this new environment.
Specifically, Adobe Express will be setting the following response headers:
- `Cross-Origin-Embedder-Policy: credentialless`
- `Cross-Origin-Opener-Policy: same-origin`
- `Cross-Origin-Resource-Policy: same-site`
This change is being done to support Adobe Express’ use of certain browser capabilities requiring cross-origin isolation.
## Impact
This change may impact your add-on’s access to external resources, especially if it relies on iframes to display content or support payment flows. It could also impact `fetch` or image requests from external sources. In these cases, users may see missing content or be presented with silent failures if your add-on can’t load a remote resource. Since this results in a poor experience, developers must ensure that their add-ons work in the above environment.
Please note that this change affects *all* add-ons, even those not published in the add-on marketplace (i.e., private and internally distributed add-ons).
Currently, this change *only impacts* Chromium-based browsers (e.g., Chrome, Edge, Opera, etc.). Firefox and Safari browsers are currently exempt. If you've developed a an add-on with mobile support, this would apply to add-ons running on Android devices as well.
## Types of failures
Some failures will be more evident than others, but all will negatively impact the user experience of your add-on.
- If a nested iframe fails to load, Chrome displays a very obvious error message inside the iframe indicating that the domain "refused to connect".
- If an image fails to load, you may notice missing images in your add-on’s user interface. You should also see failures in the Network section of the browser’s developer tools.
- If a network call fails due to JavaScript code, you should see warning and error messages in the browser’s developer tools.
## Testing your add-on
Until Adobe Express enables these headers by default, you must configure your local development environment to simulate these changes.
### Apply local header overrides
The developer tools in Chromium-based browsers on the desktop allow you to specify header overrides. Using this, you can simulate the headers that Adobe Express will enable to test whether your add-on has any problems in this environment.
Mobile add-ons
You cannot test this on mobile devices. You should test your add-on on a desktop web browser powered by Chromium. Any issues you run into would also appear on mobile devices, and any fixes you apply would also apply to mobile users.
To enable this environment yourself, perform the following steps:
1. Open the developer tools:
Launch your Chromium-based browser (e.g., Chrome, Edge, Opera).
Open the developer tools by pressing `F12` or `Ctrl+Shift+I` (Windows/Linux) or `Cmd+Option+I` (Mac).
2. Navigate to the **Network** tab:
In the developer tools, click on the **Network** tab, and then navigate to [Adobe Express](https://new.express.adobe.com) in the browser. Your network panel should fill up with a lot of network traffic, like this:

3. Apply header overrides:
To apply an override, right click on the entry for **new.express.adobe.com** and select **Override headers**.

**IMPORTANT:** Assuming you haven’t done this before, the developer tools will ask you to pick a folder on your local file system where these overrides are stored. The alert is easy to miss, since it doesn’t present as a dialog box, but rather a message near the top of your developer tool window.

4. Select a local folder:
Click **Select folder** to choose where you want to store the overrides. This will open your browser’s file picker. You’ll likely want to create a new folder for this step. You can put this anywhere you’d like. For example, in the following image we've selected the **Downloads** folder.

5. Allow access, if prompted:
Depending on your operating system and the folder's location, the developer tools may need to request additional permissions to access it. If so, the message will again appear near the top of the developer tool window.

Click **Allow**. This may prompt an operating system level permissions prompt. In that case, be sure to allow that as well:

6. Navigate to the **Sources** tab:
Once any required permissions have been granted, navigate to the **Sources** tab in the developer tools:

7. Open the **Overrides** menu:
Next, click the **`>>`** icon and select the **Overrides** menu option:

Expand the entry you see there completely. You should see something like the following:

8. Add an override rule:
To add an override rule, click the **Add override rule** option:

9. Enter the header names and values to override:
Click on `header-name-1` and start entering the name of the first header -- in this case, `Cross-Origin-Embedder-Policy`.

Press TAB or click into the field that says `header value` and update it to the appropriate value -– in this case, `credentialless`. Once done, click the **+** icon to add the next header.

10. Finalize header overrides:
You’ll want to add headers until your overrides look like the following:

11. Reload and test:
At this point, you can reload Adobe Express and test your add-on. Be sure to watch the network panel for errors that your add-on might encounter.
### What to test in your add-on
You should test flows in your add-on that involve the following:
- **Purchase flows:** In particular, if you’re using an iframe to handle the purchase experience, you should also test an international purchase to ensure that any additional verification flows your payment provider requires also work. *Note: You're probably not impacted if you handle purchases in a new tab.*
- **Flows that load external domains in iframes:** For example, you may be using an iframe to generate a preview for the user or using an iframe to embed a video player.
- **Flows that display images and other content:** For example, if you’ve built an add-on that allows the user to add stickers and the stickers are served from your domain or another third party, you should verify that the images appear in the add-on’s user interface correctly. (If the content is bundled with your add-on, you should already be covered.)
- **Flows that add content to the user’s document:** Make sure that users can successfully add images or other assets to the document if your add-on provides this functionality. This should only apply to assets loaded from your domain or an external domain. Generated assets or assets bundled with your add-on should not have any issues.
If your add-on doesn’t access external content, make network calls, or use iframes to display content or payment flows, you should not be affected by this change.
## Disabling overrides
When you’re done testing, you’ll likely want to disable any header overrides in your browser’s developer tools. You can disable the overrides by unchecking **Enable Local Overrides** or by removing the header override directly.

## Addressing issues found in your add-on
Applying fixes to your add-on is generally straightforward, but it depends on the issue you’re seeing.
### Fixing assets that fail to load
If the asset is in an `` tag, you’ll want to set the `crossorigin` attribute. You can also set the `crossOrigin` property when using JavaScript. For examples, see the [MDN web documentation](https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement/crossOrigin).
### Fixing iframes or network calls that fail to load
You’ll need to set the following headers on the endpoint you’re trying to load. If loading an iframe, you’ll likely need to ensure these headers apply to all assets that can be loaded by the iframe.
- `Cross-Origin-Embedder-Policy: credentialless`
- `Cross-Origin-Resource-Policy: cross-origin`
If the endpoint is managed by a third party, you may have more difficulty in addressing the issue. Some things you can do:
- Check if the third party provider provides a mechanism to specify header overrides.
- Ask if the third party provider can set headers for you via their existing support channels.
- Create a proxy that you control to act as an intermediary. This has security and privacy implications since you need to ensure that the proxy is secure, doesn’t mix up or serve incorrect data, and doesn’t preserve user information for any longer than necessary to complete the transaction.
## [Review process impact](https://developer.adobe.com/express/add-ons/docs/guides/distribute/guidelines/general/)
All new add-ons published to the marketplace will be reviewed with these headers in place. If the reviewer finds a problem with your submission related to cross-origin isolation that impacts the usability of your add-on, the reviewer will reject your add-on. You can then use the above to address the issues before submitting again.
# Add-on iframe Context
Important details about the context of your add-on; permissions, security, CORS and more.
## iframe Sandbox
Your add-on is essentially a website running in a [sandboxed](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe#sandbox) iframe. As a result, the content of your add-on runs in a low-privileged environment, has a subset of capabilities, and has an extra set of restrictions by default. It's important to understand how this may affect the add-on you're building, as well as how to learn to mitigate any problems you may run into along the way.
### Restrictions
The following set of restrictions are enabled when the `sandbox` attribute is applied to the `