Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions gatsby-config.js
Original file line number Diff line number Diff line change
Expand Up @@ -294,6 +294,10 @@ module.exports = {
title: "ThreadedTextContentModel",
path: "references/document-sandbox/document-apis/classes/ThreadedTextContentModel.md",
},
{
title: "ThreadedTextList",
path: "references/document-sandbox/document-apis/classes/ThreadedTextList.md",
},
{
title: "ThreadedTextNode",
path: "references/document-sandbox/document-apis/classes/ThreadedTextNode.md",
Expand Down Expand Up @@ -472,6 +476,14 @@ module.exports = {
title: "StyleRange",
path: "references/document-sandbox/document-apis/interfaces/StyleRange.md",
},
{
title: "TextContent",
path: "references/document-sandbox/document-apis/interfaces/TextContent.md",
},
{
title: "TextFrameAreaGeometry",
path: "references/document-sandbox/document-apis/interfaces/TextFrameAreaGeometry.md",
},
{
title: "TextRange",
path: "references/document-sandbox/document-apis/interfaces/TextRange.md",
Expand Down
17 changes: 17 additions & 0 deletions src/pages/guides/getting_started/changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,23 @@ contributors:

# Changelog

## 2026-01-26

### Added

We have added new APIs for threaded text handling across multiple frames, as well as new accessors for retrieving a flattened list of all descendant nodes and text content within the page and visual node containers.

- **Experimental** [`Editor.createThreadedText()`](../../references/document-sandbox/document-apis/classes/Editor.md#createthreadedtext) method - Create a [`ThreadedTextNode`](../../references/document-sandbox/document-apis/classes/ThreadedTextNode.md) for threaded text handling across multiple frames.
- **Experimental** [`ThreadedTextList`](../../references/document-sandbox/document-apis/classes/ThreadedTextList.md) class - Represents an ordered list of [`ThreadedTextNode`](../../references/document-sandbox/document-apis/classes/ThreadedTextNode.md) objects, creating a single, continuous text story across multiple frames.
- **Experimental** [`allDescendants`](../../references/document-sandbox/document-apis/classes/PageNode.md#alldescendants) accessor on [`PageNode`](../../references/document-sandbox/document-apis/classes/PageNode.md) and [`VisualNode`](../../references/document-sandbox/document-apis/classes/VisualNode.md) - Returns a flattened, read-only list of all descendant nodes within the container. For text-based nodes, please use the new `allTextContent` accessor instead.
- **Experimental** [`allTextContent`](../../references/document-sandbox/document-apis/classes/PageNode.md#alltextcontent) accessor on [`PageNode`](../../references/document-sandbox/document-apis/classes/PageNode.md) and [`VisualNode`](../../references/document-sandbox/document-apis/classes/VisualNode.md) - Returns a flattened, read-only list of [`TextContent`](../../references/document-sandbox/document-apis/interfaces/TextContent.md) instances from all text-based nodes within the container.
- **Experimental** [`TextContent`](../../references/document-sandbox/document-apis/interfaces/TextContent.md) interface - Represents text content data extracted from text-based nodes.
- **Experimental** [`TextFrameAreaGeometry`](../../references/document-sandbox/document-apis/interfaces/TextFrameAreaGeometry.md) interface - Defines the geometry of a text frame area.

### Updated

- **Experimental** [`ThreadedTextContentModel.frames`](../../references/document-sandbox/document-apis/classes/ThreadedTextContentModel.md#frames) property - Updated to properly support the new threaded text implementation with [`ThreadedTextList`](../../references/document-sandbox/document-apis/classes/ThreadedTextList.md).

## 2026-01-13

### Adobe Express Developer MCP Server Updates
Expand Down
17 changes: 17 additions & 0 deletions src/pages/references/changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,23 @@ contributors:

# Changelog

## 2026-01-26

### Added

We have added new APIs for threaded text handling across multiple frames, as well as new accessors for retrieving a flattened list of all descendant nodes and text content within the page and visual node containers.

- **Experimental** [`Editor.createThreadedText()`](../references/document-sandbox/document-apis/classes/Editor.md#createthreadedtext) method - Create a [`ThreadedTextNode`](../references/document-sandbox/document-apis/classes/ThreadedTextNode.md) for threaded text handling across multiple frames.
- **Experimental** [`ThreadedTextList`](../references/document-sandbox/document-apis/classes/ThreadedTextList.md) class - Represents an ordered list of [`ThreadedTextNode`](../references/document-sandbox/document-apis/classes/ThreadedTextNode.md) objects, creating a single, continuous text story across multiple frames.
- **Experimental** [`allDescendants`](../references/document-sandbox/document-apis/classes/PageNode.md#alldescendants) accessor on [`PageNode`](../references/document-sandbox/document-apis/classes/PageNode.md) and [`VisualNode`](../references/document-sandbox/document-apis/classes/VisualNode.md) - Returns a flattened, read-only list of all descendant nodes within the container. For text-based nodes, please use the new `allTextContent` accessor instead.
- **Experimental** [`allTextContent`](../references/document-sandbox/document-apis/classes/PageNode.md#alltextcontent) accessor on [`PageNode`](../references/document-sandbox/document-apis/classes/PageNode.md) and [`VisualNode`](../references/document-sandbox/document-apis/classes/VisualNode.md) - Returns a flattened, read-only list of [`TextContent`](../references/document-sandbox/document-apis/interfaces/TextContent.md) instances from all text-based nodes within the container.
- **Experimental** [`TextContent`](../references/document-sandbox/document-apis/interfaces/TextContent.md) interface - Represents text content data extracted from text-based nodes.
- **Experimental** [`TextFrameAreaGeometry`](../references/document-sandbox/document-apis/interfaces/TextFrameAreaGeometry.md) interface - Defines the geometry of a text frame area.

### Updated

- **Experimental** [`ThreadedTextContentModel.frames`](../references/document-sandbox/document-apis/classes/ThreadedTextContentModel.md#frames) property - Updated to properly support the new threaded text implementation with [`ThreadedTextList`](../references/document-sandbox/document-apis/classes/ThreadedTextList.md).

## 2026-01-13

### Adobe Express Developer MCP Server Updates
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,53 @@ The children of an Artboard are all subclasses of Node (not just the more minima

---

### allDescendants

• `get` **allDescendants**(): `Readonly`<`Iterable`<[`Node`](Node.md), `any`, `any`\>\>

<InlineAlert slots="text" variant="warning"/>

**IMPORTANT:** This is currently ***experimental only*** and should not be used in any add-ons you will be distributing until it has been declared stable. To use it, you will first need to set the `experimentalApis` flag to `true` in the [`requirements`](../../../manifest/index.md#requirements) section of the `manifest.json`.

Helper to recursively traverse *all* the exposed scenegraph content within the subtree of this node.
Every container node and every leaf node will be visited via a pre-order tree traversal.
Although once called the list of direct descendants is static, changes to further descendants may appear while
iterating depending on when the operation occurs relative to the parent being yielded.
Note that the root node (i.e. what this API was called on) is not visited.

The descendants of an Artboard are all subclasses of Node (not just the more minimal BaseNode or VisualNode).

Warning: Processing text content via this API can be error-prone. Use [VisualNode.allTextContent](VisualNode.md#alltextcontent)

#### Returns

`Readonly`<`Iterable`<[`Node`](Node.md), `any`, `any`\>\>

---

### allTextContent

• `get` **allTextContent**(): `Readonly`<`Iterable`<[`TextContent`](../interfaces/TextContent.md), `any`, `any`\>\>

<InlineAlert slots="text" variant="warning"/>

**IMPORTANT:** This is currently ***experimental only*** and should not be used in any add-ons you will be distributing until it has been declared stable. To use it, you will first need to set the `experimentalApis` flag to `true` in the [`requirements`](../../../manifest/index.md#requirements) section of the `manifest.json`.

Helper to process all text content that is found as part of or within this node. This can be hard to do correctly
via manual tree traversal since multiple [ThreadedTextNode](ThreadedTextNode.md) can share a single [TextContentModel](TextContentModel.md).

This iterator returns a single result per TextContentModel that is at least partially displayed within this node,
even if that content is split across several separate TextNode "frames". If this node is or contains some but not
all of the display frames of an overall TextContentModel, that model is still included as a result.

Note that visibleRanges and visibleText may not be sorted as TextNode "frames" can appear in any order in the scenegraph.

#### Returns

`Readonly`<`Iterable`<[`TextContent`](../interfaces/TextContent.md), `any`, `any`\>\>

---

### boundsLocal

• `get` **boundsLocal**(): `Readonly`<[`Rect`](../interfaces/Rect.md)\>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ Original width of the bitmap in pixels.

**IMPORTANT:** This is currently ***experimental only*** and should not be used in any add-ons you will be distributing until it has been declared stable. To use it, you will first need to set the `experimentalApis` flag to `true` in the [`requirements`](../../../manifest/index.md#requirements) section of the `manifest.json`.

Fetches the bitmap data as a Blob. This will wait for the bitmap to be available if necessary.
Fetches the bitmap data as a Blob. Waits up to 1 minute for the bitmap to be available if necessary.

#### Returns

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,53 @@ The children of a Node are always other Node classes (never the more minimal Bas

---

### allDescendants

• `get` **allDescendants**(): `Readonly`<`Iterable`<[`Node`](Node.md), `any`, `any`\>\>

<InlineAlert slots="text" variant="warning"/>

**IMPORTANT:** This is currently ***experimental only*** and should not be used in any add-ons you will be distributing until it has been declared stable. To use it, you will first need to set the `experimentalApis` flag to `true` in the [`requirements`](../../../manifest/index.md#requirements) section of the `manifest.json`.

Helper to recursively traverse *all* the exposed scenegraph content within the subtree of this node.
Every container node and every leaf node will be visited via a pre-order tree traversal.
Although once called the list of direct descendants is static, changes to further descendants may appear while
iterating depending on when the operation occurs relative to the parent being yielded.
Note that the root node (i.e. what this API was called on) is not visited.

The descendants of a Node are always other Node classes (never the more minimal BaseNode).

Warning: Processing text content via this API can be error-prone. Use [VisualNode.allTextContent](VisualNode.md#alltextcontent)

#### Returns

`Readonly`<`Iterable`<[`Node`](Node.md), `any`, `any`\>\>

---

### allTextContent

• `get` **allTextContent**(): `Readonly`<`Iterable`<[`TextContent`](../interfaces/TextContent.md), `any`, `any`\>\>

<InlineAlert slots="text" variant="warning"/>

**IMPORTANT:** This is currently ***experimental only*** and should not be used in any add-ons you will be distributing until it has been declared stable. To use it, you will first need to set the `experimentalApis` flag to `true` in the [`requirements`](../../../manifest/index.md#requirements) section of the `manifest.json`.

Helper to process all text content that is found as part of or within this node. This can be hard to do correctly
via manual tree traversal since multiple [ThreadedTextNode](ThreadedTextNode.md) can share a single [TextContentModel](TextContentModel.md).

This iterator returns a single result per TextContentModel that is at least partially displayed within this node,
even if that content is split across several separate TextNode "frames". If this node is or contains some but not
all of the display frames of an overall TextContentModel, that model is still included as a result.

Note that visibleRanges and visibleText may not be sorted as TextNode "frames" can appear in any order in the scenegraph.

#### Returns

`Readonly`<`Iterable`<[`TextContent`](../interfaces/TextContent.md), `any`, `any`\>\>

---

### blendMode

• `get` **blendMode**(): [`BlendMode`](../enumerations/BlendMode.md)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -189,6 +189,44 @@ insertion parent. Recommend using `setPositionInParent` over `translation` to se

---

### createThreadedText()

• **createThreadedText**(`parentNode`, `textContent`, `geometry`?): [`ThreadedTextNode`](ThreadedTextNode.md)

<InlineAlert slots="text" variant="warning"/>

**IMPORTANT:** This is currently ***experimental only*** and should not be used in any add-ons you will be distributing until it has been declared stable. To use it, you will first need to set the `experimentalApis` flag to `true` in the [`requirements`](../../../manifest/index.md#requirements) section of the `manifest.json`.

#### Parameters

• **parentNode**: [`ContainerNode`](../interfaces/ContainerNode.md)

The parent node that will contain the threaded text node. This must be a container node (e.g., ArtboardNode, GroupNode) that is attached to the document.

• **textContent**: `string`

The initial text content for the threaded text node.

• **geometry?**: [`TextFrameAreaGeometry`](../interfaces/TextFrameAreaGeometry.md)

The geometry of the threaded text node.

#### Returns

[`ThreadedTextNode`](ThreadedTextNode.md)

A new ThreadedTextNode that is part of a threaded text flow.

#### Throws

if parentNode is not provided or is not a valid container node.

#### Throws

if textContent is empty or invalid.

---

### loadBitmapImage()

• **loadBitmapImage**(`bitmapData`): `Promise`<[`BitmapImage`](BitmapImage.md)\>
Expand Down Expand Up @@ -273,7 +311,7 @@ asynchronous operation such as [loadBitmapImage](Editor.md#loadbitmapimage), any
queueAsyncEdit(). This ensures the edit is properly tracked for saving and undo.

The delay before your edit function is executed is typically just a few milliseconds, so it will appear instantaneous
to users. However, note that queueAsyncEdit() will return _before_ your function has been run.
to users. However, note that queueAsyncEdit() will return *before* your function has been run.
If you need to trigger any code after the edit has been performed, either include this in the lambda you are enqueuing
or await the Promise returned by queueAsyncEdit().

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,53 @@ The children of a Node are always other Node classes (never the more minimal Bas

---

### allDescendants

• `get` **allDescendants**(): `Readonly`<`Iterable`<[`Node`](Node.md), `any`, `any`\>\>

<InlineAlert slots="text" variant="warning"/>

**IMPORTANT:** This is currently ***experimental only*** and should not be used in any add-ons you will be distributing until it has been declared stable. To use it, you will first need to set the `experimentalApis` flag to `true` in the [`requirements`](../../../manifest/index.md#requirements) section of the `manifest.json`.

Helper to recursively traverse *all* the exposed scenegraph content within the subtree of this node.
Every container node and every leaf node will be visited via a pre-order tree traversal.
Although once called the list of direct descendants is static, changes to further descendants may appear while
iterating depending on when the operation occurs relative to the parent being yielded.
Note that the root node (i.e. what this API was called on) is not visited.

The descendants of a Node are always other Node classes (never the more minimal BaseNode).

Warning: Processing text content via this API can be error-prone. Use [VisualNode.allTextContent](VisualNode.md#alltextcontent)

#### Returns

`Readonly`<`Iterable`<[`Node`](Node.md), `any`, `any`\>\>

---

### allTextContent

• `get` **allTextContent**(): `Readonly`<`Iterable`<[`TextContent`](../interfaces/TextContent.md), `any`, `any`\>\>

<InlineAlert slots="text" variant="warning"/>

**IMPORTANT:** This is currently ***experimental only*** and should not be used in any add-ons you will be distributing until it has been declared stable. To use it, you will first need to set the `experimentalApis` flag to `true` in the [`requirements`](../../../manifest/index.md#requirements) section of the `manifest.json`.

Helper to process all text content that is found as part of or within this node. This can be hard to do correctly
via manual tree traversal since multiple [ThreadedTextNode](ThreadedTextNode.md) can share a single [TextContentModel](TextContentModel.md).

This iterator returns a single result per TextContentModel that is at least partially displayed within this node,
even if that content is split across several separate TextNode "frames". If this node is or contains some but not
all of the display frames of an overall TextContentModel, that model is still included as a result.

Note that visibleRanges and visibleText may not be sorted as TextNode "frames" can appear in any order in the scenegraph.

#### Returns

`Readonly`<`Iterable`<[`TextContent`](../interfaces/TextContent.md), `any`, `any`\>\>

---

### blendMode

• `get` **blendMode**(): [`BlendMode`](../enumerations/BlendMode.md)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -221,6 +221,48 @@ insertion parent. Recommend using `setPositionInParent` over `translation` to se

---

### createThreadedText()

• **createThreadedText**(`parentNode`, `textContent`, `geometry`?): [`ThreadedTextNode`](ThreadedTextNode.md)

<InlineAlert slots="text" variant="warning"/>

**IMPORTANT:** This is currently ***experimental only*** and should not be used in any add-ons you will be distributing until it has been declared stable. To use it, you will first need to set the `experimentalApis` flag to `true` in the [`requirements`](../../../manifest/index.md#requirements) section of the `manifest.json`.

#### Parameters

• **parentNode**: [`ContainerNode`](../interfaces/ContainerNode.md)

The parent node that will contain the threaded text node. This must be a container node (e.g., ArtboardNode, GroupNode) that is attached to the document.

• **textContent**: `string`

The initial text content for the threaded text node.

• **geometry?**: [`TextFrameAreaGeometry`](../interfaces/TextFrameAreaGeometry.md)

The geometry of the threaded text node.

#### Returns

[`ThreadedTextNode`](ThreadedTextNode.md)

A new ThreadedTextNode that is part of a threaded text flow.

#### Inherited from

[`Editor`](Editor.md).[`createThreadedText`](Editor.md#createthreadedtext)

#### Throws

if parentNode is not provided or is not a valid container node.

#### Throws

if textContent is empty or invalid.

---

### loadBitmapImage()

• **loadBitmapImage**(`bitmapData`): `Promise`<[`BitmapImage`](BitmapImage.md)\>
Expand Down Expand Up @@ -317,7 +359,7 @@ asynchronous operation such as [loadBitmapImage](Editor.md#loadbitmapimage), any
queueAsyncEdit(). This ensures the edit is properly tracked for saving and undo.

The delay before your edit function is executed is typically just a few milliseconds, so it will appear instantaneous
to users. However, note that queueAsyncEdit() will return _before_ your function has been run.
to users. However, note that queueAsyncEdit() will return *before* your function has been run.
If you need to trigger any code after the edit has been performed, either include this in the lambda you are enqueuing
or await the Promise returned by queueAsyncEdit().

Expand Down
Loading
Loading