@portabletext/editor 7.5.2 → 7.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2,7 +2,7 @@ import * as _portabletext_schema6 from "@portabletext/schema";
2
2
  import { AnnotationDefinition, AnnotationSchemaType, AnnotationSchemaType as AnnotationSchemaType$1, BaseDefinition, BlockObjectDefinition, BlockObjectSchemaType, BlockObjectSchemaType as BlockObjectSchemaType$1, DecoratorDefinition, DecoratorSchemaType, DecoratorSchemaType as DecoratorSchemaType$1, FieldDefinition, FieldDefinition as FieldDefinition$1, InlineObjectDefinition, InlineObjectSchemaType, InlineObjectSchemaType as InlineObjectSchemaType$1, ListDefinition, ListSchemaType, ListSchemaType as ListSchemaType$1, OfDefinition, PortableTextBlock, PortableTextBlock as PortableTextBlock$1, PortableTextChild, PortableTextChild as PortableTextChild$1, PortableTextObject, PortableTextObject as PortableTextObject$1, PortableTextSpan, PortableTextSpan as PortableTextSpan$1, PortableTextTextBlock, PortableTextTextBlock as PortableTextTextBlock$1, Schema, SchemaDefinition, SchemaDefinition as SchemaDefinition$1, StyleDefinition, StyleSchemaType, StyleSchemaType as StyleSchemaType$1, TypedObject, defineSchema } from "@portabletext/schema";
3
3
  import * as xstate31 from "xstate";
4
4
  import { ActorRef, ActorRefFrom, EventObject, Snapshot } from "xstate";
5
- import * as react4 from "react";
5
+ import * as react6 from "react";
6
6
  import React$1, { BaseSyntheticEvent, ClipboardEvent as ClipboardEvent$1, FocusEvent, JSX, PropsWithChildren, ReactElement, RefObject, TextareaHTMLAttributes } from "react";
7
7
  import { Patch, Patch as Patch$1 } from "@portabletext/patches";
8
8
  type MIMEType = `${string}/${string}`;
@@ -1177,7 +1177,7 @@ type PortableTextEditableProps = Omit<TextareaHTMLAttributes<HTMLDivElement>, 'o
1177
1177
  * ```
1178
1178
  * @group Components
1179
1179
  */
1180
- declare const PortableTextEditable: react4.ForwardRefExoticComponent<Omit<PortableTextEditableProps, "ref"> & react4.RefAttributes<Omit<HTMLDivElement, "as" | "onPaste" | "onBeforeInput">>>;
1180
+ declare const PortableTextEditable: react6.ForwardRefExoticComponent<Omit<PortableTextEditableProps, "ref"> & react6.RefAttributes<Omit<HTMLDivElement, "as" | "onPaste" | "onBeforeInput">>>;
1181
1181
  /** @beta */
1182
1182
  interface EditableAPIDeleteOptions {
1183
1183
  mode?: 'blocks' | 'children' | 'selected';
@@ -2451,7 +2451,7 @@ declare const editorMachine: xstate31.StateMachine<{
2451
2451
  initialValue?: Array<PortableTextBlock>;
2452
2452
  }, xstate31.NonReducibleUnknown, InternalPatchEvent | MutationEvent | PatchesEvent | {
2453
2453
  type: "blurred";
2454
- event: react4.FocusEvent<HTMLDivElement, Element>;
2454
+ event: react6.FocusEvent<HTMLDivElement, Element>;
2455
2455
  } | {
2456
2456
  type: "done loading";
2457
2457
  } | {
@@ -2463,7 +2463,7 @@ declare const editorMachine: xstate31.StateMachine<{
2463
2463
  data: unknown;
2464
2464
  } | {
2465
2465
  type: "focused";
2466
- event: react4.FocusEvent<HTMLDivElement, Element>;
2466
+ event: react6.FocusEvent<HTMLDivElement, Element>;
2467
2467
  } | {
2468
2468
  type: "invalid value";
2469
2469
  resolution: InvalidValueResolution | null;
@@ -11,13 +11,40 @@ function isTypedObject(object) {
11
11
  function isRecord(value) {
12
12
  return !!value && (typeof value == "object" || typeof value == "function");
13
13
  }
14
+ function getContainerChildren(containers, node, parent) {
15
+ const resolved = resolveNodeContainer(containers, parent, node);
16
+ if (!resolved)
17
+ return;
18
+ const fieldValue = node[resolved.field.name];
19
+ if (Array.isArray(fieldValue))
20
+ return {
21
+ children: fieldValue,
22
+ container: resolved
23
+ };
24
+ }
25
+ function resolveNodeContainer(containers, parent, node) {
26
+ if (parent?.of) {
27
+ for (const entry of parent.of)
28
+ if (entry.type === node._type)
29
+ return "field" in entry ? entry : void 0;
30
+ }
31
+ return containers.get(node._type);
32
+ }
14
33
  function getChildren(snapshot, path) {
15
34
  let currentChildren = snapshot.context.value, currentFieldName = "value", currentPath = [], isRoot = !0, currentParent;
16
35
  for (const segment of path) {
17
36
  if (typeof segment == "string")
18
37
  continue;
19
38
  let node;
20
- if (isKeyedSegment(segment) ? node = currentChildren.find((child) => child._key === segment._key) : typeof segment == "number" && (node = currentChildren.at(segment)), !node)
39
+ if (isKeyedSegment(segment)) {
40
+ const candidatePath = isRoot ? [{
41
+ _key: segment._key
42
+ }] : [...currentPath, currentFieldName, {
43
+ _key: segment._key
44
+ }], index = snapshot.blockIndexMap.get(serializePath(candidatePath));
45
+ node = index !== void 0 && currentChildren[index]?._key === segment._key ? currentChildren[index] : currentChildren.find((child) => child._key === segment._key);
46
+ } else typeof segment == "number" && (node = currentChildren.at(segment));
47
+ if (!node)
21
48
  return [];
22
49
  currentPath = isRoot ? [{
23
50
  _key: node._key
@@ -45,16 +72,14 @@ function getNodeChildren(context, node, parent) {
45
72
  fieldName: "children",
46
73
  parent: void 0
47
74
  };
48
- if (isTypedObject(node) && node._type !== context.schema.block.name && node._type !== context.schema.span.name) {
49
- const resolved = resolveNodeContainer(context.containers, parent, node);
50
- if (!resolved)
51
- return;
52
- const fieldValue = node[resolved.field.name];
53
- return Array.isArray(fieldValue) ? {
54
- children: fieldValue,
55
- fieldName: resolved.field.name,
56
- parent: resolved
57
- } : void 0;
75
+ if (isTypedObject(node)) {
76
+ const result = getContainerChildren(context.containers, node, parent);
77
+ if (result)
78
+ return {
79
+ children: result.children,
80
+ fieldName: result.container.field.name,
81
+ parent: result.container
82
+ };
58
83
  }
59
84
  if ("value" in node && Array.isArray(node.value) && !("_key" in node) && !("_type" in node))
60
85
  return {
@@ -63,14 +88,6 @@ function getNodeChildren(context, node, parent) {
63
88
  parent: void 0
64
89
  };
65
90
  }
66
- function resolveNodeContainer(containers, parent, node) {
67
- if (parent?.of) {
68
- for (const entry of parent.of)
69
- if (entry.type === node._type)
70
- return "field" in entry ? entry : void 0;
71
- }
72
- return containers.get(node._type);
73
- }
74
91
  function getNode(snapshot, path) {
75
92
  if (path.length === 0)
76
93
  return;
@@ -153,6 +170,7 @@ function getParent(snapshot, path, options) {
153
170
  }
154
171
  export {
155
172
  getChildren,
173
+ getContainerChildren,
156
174
  getNode,
157
175
  getNodeChildren,
158
176
  getParent,
@@ -1 +1 @@
1
- {"version":3,"file":"get-parent.js","sources":["../../src/utils/util.is-keyed-segment.ts","../../src/paths/serialize-path.ts","../../src/utils/asserters.ts","../../src/traversal/get-children.ts","../../src/traversal/get-node.ts","../../src/engine/path/parent-path.ts","../../src/traversal/get-parent.ts"],"sourcesContent":["import type {KeyedSegment} from '../types/paths'\n\n/**\n * @public\n */\nexport function isKeyedSegment(segment: unknown): segment is KeyedSegment {\n return typeof segment === 'object' && segment !== null && '_key' in segment\n}\n","import type {Path} from '../types/paths'\nimport {isKeyedSegment} from '../utils/util.is-keyed-segment'\n\n/**\n * Serialize a keyed path to a string using Sanity's bracket notation.\n *\n * - `[{_key: 'k0'}]` -> `[_key==\"k0\"]`\n * - `[{_key: 'k0'}, 'children', {_key: 's0'}]` -> `[_key==\"k0\"].children[_key==\"s0\"]`\n * - `[{_key: 't0'}, 'rows', {_key: 'r0'}, 'cells', {_key: 'c0'}, 'content', {_key: 'b0'}, 'children', {_key: 's0'}]` -> `[_key==\"t0\"].rows[_key==\"r0\"].cells[_key==\"c0\"].content[_key==\"b0\"].children[_key==\"s0\"]`\n */\nexport function serializePath(path: Path): string {\n return path.reduce<string>((result, segment, index) => {\n if (isKeyedSegment(segment)) {\n return `${result}[_key==\"${segment._key}\"]`\n }\n\n const separator = index === 0 ? '' : '.'\n return `${result}${separator}${segment}`\n }, '')\n}\n","import type {TypedObject} from '@portabletext/schema'\n\nexport function isTypedObject(object: unknown): object is TypedObject {\n return isRecord(object) && typeof object['_type'] === 'string'\n}\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && (typeof value === 'object' || typeof value === 'function')\n}\n","import {isTextBlock} from '@portabletext/schema'\nimport type {EditorSchema} from '../editor/editor-schema'\nimport type {Node} from '../engine/interfaces/node'\nimport type {Path} from '../engine/interfaces/path'\nimport type {\n Containers,\n RegisteredContainer,\n} from '../schema/resolve-containers'\nimport {isTypedObject} from '../utils/asserters'\nimport {isKeyedSegment} from '../utils/util.is-keyed-segment'\nimport type {TraversalSnapshot} from './traversal-snapshot'\n\n/**\n * Get the children of a node at a given path.\n *\n * @beta\n */\nexport function getChildren(\n snapshot: TraversalSnapshot,\n path: Path,\n): Array<{node: Node; path: Path}> {\n let currentChildren: Array<Node> = snapshot.context.value\n let currentFieldName = 'value'\n let currentPath: Path = []\n let isRoot = true\n let currentParent: RegisteredContainer | undefined\n\n for (const segment of path) {\n if (typeof segment === 'string') {\n continue\n }\n\n let node: Node | undefined\n if (isKeyedSegment(segment)) {\n node = currentChildren.find((child) => child._key === segment._key)\n } else if (typeof segment === 'number') {\n node = currentChildren.at(segment)\n }\n\n if (!node) {\n return []\n }\n\n currentPath = isRoot\n ? [{_key: node._key}]\n : [...currentPath, currentFieldName, {_key: node._key}]\n isRoot = false\n\n const next = getNodeChildren(snapshot.context, node, currentParent)\n\n if (!next) {\n return []\n }\n\n currentChildren = next.children\n currentFieldName = next.fieldName\n currentParent = next.parent\n }\n\n return currentChildren.map((child) => ({\n node: child,\n path: isRoot\n ? [{_key: child._key}]\n : [...currentPath, currentFieldName, {_key: child._key}],\n }))\n}\n\n/**\n * Resolve a node's editable child array.\n *\n * When `parent` is provided and its `of` declares a positional entry\n * matching `node._type`, that positional entry's `field` is used.\n * Otherwise the top-level `containers.get(node._type)` provides the\n * fallback.\n *\n * The returned `parent` is the resolved container entry for `node`\n * itself (used by the caller to thread further descent).\n *\n */\nexport function getNodeChildren(\n context: {\n schema: EditorSchema\n containers: Containers\n },\n node: Node | {value: Array<Node>},\n parent?: RegisteredContainer,\n):\n | {\n children: Array<Node>\n fieldName: string\n parent: RegisteredContainer | undefined\n }\n | undefined {\n // Text blocks store children in .children\n if (isTextBlock(context, node)) {\n return {\n children: node.children,\n fieldName: 'children',\n parent: undefined,\n }\n }\n\n if (\n isTypedObject(node) &&\n node._type !== context.schema.block.name &&\n node._type !== context.schema.span.name\n ) {\n const resolved = resolveNodeContainer(context.containers, parent, node)\n\n if (!resolved) {\n return undefined\n }\n\n const fieldValue = (node as Record<string, unknown>)[resolved.field.name]\n\n if (!Array.isArray(fieldValue)) {\n return undefined\n }\n\n return {\n children: fieldValue as Array<Node>,\n fieldName: resolved.field.name,\n parent: resolved,\n }\n }\n\n // Root context: has .value array but no _key or _type\n if (\n 'value' in node &&\n Array.isArray(node['value']) &&\n !('_key' in node) &&\n !('_type' in node)\n ) {\n return {\n children: node['value'] as Array<Node>,\n fieldName: 'value',\n parent: undefined,\n }\n }\n\n return undefined\n}\n\n/**\n * Pick the positional override from `parent.of` if present; fall back\n * to the top-level entry. Returns only `RegisteredContainer` entries\n * since leaves do not have editable children.\n */\nfunction resolveNodeContainer(\n containers: Containers,\n parent: RegisteredContainer | undefined,\n node: Node,\n): RegisteredContainer | undefined {\n if (parent?.of) {\n for (const entry of parent.of) {\n if (entry.type === node._type) {\n // Only return container entries; leaves have no editable children.\n if ('field' in entry) {\n return entry\n }\n return undefined\n }\n }\n }\n return containers.get(node._type)\n}\n","import type {Node} from '../engine/interfaces/node'\nimport type {Path} from '../engine/interfaces/path'\nimport {serializePath} from '../paths/serialize-path'\nimport type {RegisteredContainer} from '../schema/resolve-containers'\nimport {isKeyedSegment} from '../utils/util.is-keyed-segment'\nimport {getNodeChildren} from './get-children'\nimport type {TraversalSnapshot} from './traversal-snapshot'\n\n/**\n * Get the node at a given path.\n *\n * The path can be either keyed (KeyedSegment + field name strings) or\n * indexed (numbers). Keyed segments are resolved by matching `_key`,\n * field name strings are skipped (they're structural), and numbers\n * are resolved by index.\n *\n * The returned path is always fully keyed, even if the input path\n * contained numeric indices.\n *\n * @beta\n */\nexport function getNode(\n snapshot: TraversalSnapshot,\n path: Path,\n): {node: Node; path: Path} | undefined {\n if (path.length === 0) {\n return undefined\n }\n\n const {context, blockIndexMap} = snapshot\n let currentChildren: Array<Node> = context.value\n let node: Node | undefined\n let currentParent: RegisteredContainer | undefined\n const resolvedPath: Path = []\n\n for (let i = 0; i < path.length; i++) {\n const segment = path[i]\n\n if (typeof segment === 'string') {\n resolvedPath.push(segment)\n continue\n }\n\n if (isKeyedSegment(segment)) {\n resolvedPath.push(segment)\n const index = blockIndexMap.get(serializePath(resolvedPath))\n if (\n index !== undefined &&\n currentChildren[index]?._key === segment._key\n ) {\n node = currentChildren[index]\n } else {\n // The map can miss (unkeyed transient nodes, e.g. `{_type:'table'}`\n // inserted by a remote patch before normalize mints a key) or\n // disagree with the traversed value (snapshots that pair the live\n // map with a pre-apply value, e.g. `textPatch`). Fall back to a\n // linear scan in both cases.\n node = currentChildren.find((child) => child._key === segment._key)\n if (node && node._key !== undefined) {\n resolvedPath[resolvedPath.length - 1] = {_key: node._key}\n }\n }\n } else if (typeof segment === 'number') {\n node = currentChildren.at(segment)\n if (node) {\n resolvedPath.push({_key: node._key})\n }\n } else {\n return undefined\n }\n\n if (!node) {\n return undefined\n }\n\n let hasMoreSegments = false\n for (let j = i + 1; j < path.length; j++) {\n const s = path[j]\n if (isKeyedSegment(s) || typeof s === 'number') {\n hasMoreSegments = true\n break\n }\n }\n\n if (hasMoreSegments) {\n const next = getNodeChildren(context, node, currentParent)\n\n if (!next) {\n return undefined\n }\n\n currentChildren = next.children\n currentParent = next.parent\n }\n }\n\n if (!node) {\n return undefined\n }\n\n return {node, path: resolvedPath}\n}\n","import {isKeyedSegment} from '../../utils/util.is-keyed-segment'\nimport type {Path} from '../interfaces/path'\n\n/**\n * Get the parent path of a path.\n *\n * Drops the last node segment (keyed or numeric) and the preceding field\n * name string.\n *\n * [{_key:'b1'}, 'children', {_key:'s1'}] → [{_key:'b1'}]\n * [{_key:'b1'}, 'children', 0] → [{_key:'b1'}]\n * [{_key:'b1'}] → []\n */\nexport function parentPath(path: Path): Path {\n if (path.length === 0) {\n throw new Error(`Cannot get the parent path of the root path [${path}].`)\n }\n\n let lastNodeIndex = -1\n for (let i = path.length - 1; i >= 0; i--) {\n if (isKeyedSegment(path[i]) || typeof path[i] === 'number') {\n lastNodeIndex = i\n break\n }\n }\n\n if (lastNodeIndex === -1) {\n return []\n }\n\n const result = path.slice(0, lastNodeIndex)\n\n if (result.length > 0 && typeof result[result.length - 1] === 'string') {\n return result.slice(0, -1)\n }\n\n return result\n}\n","import type {PortableTextBlock} from '@portabletext/schema'\nimport type {Path} from '../engine/interfaces/path'\nimport {parentPath} from '../engine/path/parent-path'\nimport {getNode} from './get-node'\nimport type {TraversalSnapshot} from './traversal-snapshot'\n\n/**\n * Get the parent of a node at a given path.\n *\n * A parent has children, so it is always a `PortableTextBlock` (text block\n * or object node).\n *\n * When `match` is provided and the parent does not satisfy it, returns\n * `undefined`.\n *\n * @beta\n */\nexport function getParent<TMatch extends PortableTextBlock>(\n snapshot: TraversalSnapshot,\n path: Path,\n options: {\n match: (node: PortableTextBlock, path: Path) => node is TMatch\n },\n): {node: TMatch; path: Path} | undefined\n/**\n * @beta\n */\nexport function getParent(\n snapshot: TraversalSnapshot,\n path: Path,\n options?: {\n match?: (node: PortableTextBlock, path: Path) => boolean\n },\n): {node: PortableTextBlock; path: Path} | undefined\nexport function getParent(\n snapshot: TraversalSnapshot,\n path: Path,\n options?: {\n match?: (node: PortableTextBlock, path: Path) => boolean\n },\n): {node: PortableTextBlock; path: Path} | undefined {\n if (path.length === 0) {\n return undefined\n }\n\n const parent = parentPath(path)\n\n if (parent.length === 0) {\n return undefined\n }\n\n const entry = getNode(snapshot, parent)\n\n if (!entry) {\n return undefined\n }\n\n const result = {node: entry.node as PortableTextBlock, path: entry.path}\n\n if (options?.match && !options.match(result.node, result.path)) {\n return undefined\n }\n\n return result\n}\n"],"names":["isKeyedSegment","segment","serializePath","path","reduce","result","index","_key","isTypedObject","object","isRecord","value","getChildren","snapshot","currentChildren","context","currentFieldName","currentPath","isRoot","currentParent","node","find","child","at","next","getNodeChildren","children","fieldName","parent","map","isTextBlock","undefined","_type","schema","block","name","span","resolved","resolveNodeContainer","containers","fieldValue","field","Array","isArray","of","entry","type","get","getNode","length","blockIndexMap","resolvedPath","i","push","hasMoreSegments","j","s","parentPath","Error","lastNodeIndex","slice","getParent","options","match"],"mappings":"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"}
1
+ {"version":3,"file":"get-parent.js","sources":["../../src/utils/util.is-keyed-segment.ts","../../src/paths/serialize-path.ts","../../src/utils/asserters.ts","../../src/traversal/get-container-children.ts","../../src/traversal/get-children.ts","../../src/traversal/get-node.ts","../../src/engine/path/parent-path.ts","../../src/traversal/get-parent.ts"],"sourcesContent":["import type {KeyedSegment} from '../types/paths'\n\n/**\n * @public\n */\nexport function isKeyedSegment(segment: unknown): segment is KeyedSegment {\n return typeof segment === 'object' && segment !== null && '_key' in segment\n}\n","import type {Path} from '../types/paths'\nimport {isKeyedSegment} from '../utils/util.is-keyed-segment'\n\n/**\n * Serialize a keyed path to a string using Sanity's bracket notation.\n *\n * - `[{_key: 'k0'}]` -> `[_key==\"k0\"]`\n * - `[{_key: 'k0'}, 'children', {_key: 's0'}]` -> `[_key==\"k0\"].children[_key==\"s0\"]`\n * - `[{_key: 't0'}, 'rows', {_key: 'r0'}, 'cells', {_key: 'c0'}, 'content', {_key: 'b0'}, 'children', {_key: 's0'}]` -> `[_key==\"t0\"].rows[_key==\"r0\"].cells[_key==\"c0\"].content[_key==\"b0\"].children[_key==\"s0\"]`\n */\nexport function serializePath(path: Path): string {\n return path.reduce<string>((result, segment, index) => {\n if (isKeyedSegment(segment)) {\n return `${result}[_key==\"${segment._key}\"]`\n }\n\n const separator = index === 0 ? '' : '.'\n return `${result}${separator}${segment}`\n }, '')\n}\n","import type {TypedObject} from '@portabletext/schema'\n\nexport function isTypedObject(object: unknown): object is TypedObject {\n return isRecord(object) && typeof object['_type'] === 'string'\n}\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && (typeof value === 'object' || typeof value === 'function')\n}\n","import type {Node} from '../engine/interfaces/node'\nimport type {\n Containers,\n RegisteredContainer,\n} from '../schema/resolve-containers'\n\n/**\n * Resolve a container node's editable child array.\n *\n * Returns `{children, container}` for a node registered as a container:\n * `children` is the node's editable child array, and `container` is the\n * node's own container registration. Read `container.field.name` for the\n * path segment that reaches `children`, and thread `container` back in as\n * `parent` when descending into them.\n *\n * Returns `undefined` for anything that is not a container: text blocks,\n * spans, leaves, and unregistered objects. It is node-based and resolves\n * in one step with no path re-walk, so recursive descent over containers\n * is linear in nesting depth. The caller seeds the document root from\n * `context.value` itself.\n *\n * @beta\n */\nexport function getContainerChildren(\n containers: Containers,\n node: Node,\n parent?: RegisteredContainer,\n):\n | {\n children: Array<Node>\n container: RegisteredContainer\n }\n | undefined {\n const resolved = resolveNodeContainer(containers, parent, node)\n\n if (!resolved) {\n return undefined\n }\n\n const fieldValue = (node as Record<string, unknown>)[resolved.field.name]\n\n if (!Array.isArray(fieldValue)) {\n return undefined\n }\n\n return {\n children: fieldValue as Array<Node>,\n container: resolved,\n }\n}\n\n/**\n * Pick the positional override from `parent.of` if present; fall back\n * to the top-level entry. Returns only `RegisteredContainer` entries\n * since leaves do not have editable children.\n */\nfunction resolveNodeContainer(\n containers: Containers,\n parent: RegisteredContainer | undefined,\n node: Node,\n): RegisteredContainer | undefined {\n if (parent?.of) {\n for (const entry of parent.of) {\n if (entry.type === node._type) {\n // Only return container entries; leaves have no editable children.\n if ('field' in entry) {\n return entry\n }\n return undefined\n }\n }\n }\n return containers.get(node._type)\n}\n","import {isTextBlock} from '@portabletext/schema'\nimport type {EditorSchema} from '../editor/editor-schema'\nimport type {Node} from '../engine/interfaces/node'\nimport type {Path} from '../engine/interfaces/path'\nimport {serializePath} from '../paths/serialize-path'\nimport type {\n Containers,\n RegisteredContainer,\n} from '../schema/resolve-containers'\nimport {isTypedObject} from '../utils/asserters'\nimport {isKeyedSegment} from '../utils/util.is-keyed-segment'\nimport {getContainerChildren} from './get-container-children'\nimport type {TraversalSnapshot} from './traversal-snapshot'\n\n/**\n * Get the children of a node at a given path.\n *\n * @beta\n */\nexport function getChildren(\n snapshot: TraversalSnapshot,\n path: Path,\n): Array<{node: Node; path: Path}> {\n let currentChildren: Array<Node> = snapshot.context.value\n let currentFieldName = 'value'\n let currentPath: Path = []\n let isRoot = true\n let currentParent: RegisteredContainer | undefined\n\n for (const segment of path) {\n if (typeof segment === 'string') {\n continue\n }\n\n let node: Node | undefined\n if (isKeyedSegment(segment)) {\n // Resolve via `blockIndexMap` (O(1)) and fall back to a linear scan on a\n // miss or when the snapshot's map disagrees with the value, mirroring\n // `getNode`. The candidate path is this segment's full keyed path.\n const candidatePath: Path = isRoot\n ? [{_key: segment._key}]\n : [...currentPath, currentFieldName, {_key: segment._key}]\n const index = snapshot.blockIndexMap.get(serializePath(candidatePath))\n node =\n index !== undefined && currentChildren[index]?._key === segment._key\n ? currentChildren[index]\n : currentChildren.find((child) => child._key === segment._key)\n } else if (typeof segment === 'number') {\n node = currentChildren.at(segment)\n }\n\n if (!node) {\n return []\n }\n\n currentPath = isRoot\n ? [{_key: node._key}]\n : [...currentPath, currentFieldName, {_key: node._key}]\n isRoot = false\n\n const next = getNodeChildren(snapshot.context, node, currentParent)\n\n if (!next) {\n return []\n }\n\n currentChildren = next.children\n currentFieldName = next.fieldName\n currentParent = next.parent\n }\n\n return currentChildren.map((child) => ({\n node: child,\n path: isRoot\n ? [{_key: child._key}]\n : [...currentPath, currentFieldName, {_key: child._key}],\n }))\n}\n\n/**\n * Resolve a node's editable child array.\n *\n * When `parent` is provided and its `of` declares a positional entry\n * matching `node._type`, that positional entry's `field` is used.\n * Otherwise the top-level `containers.get(node._type)` provides the\n * fallback.\n *\n * The returned `parent` is the resolved container entry for `node`\n * itself (used by the caller to thread further descent).\n *\n * Internal descent kernel shared by the positional traversal utilities\n * (`getChildren`, `getNode`, `getNodes`, `getAncestors`); it folds the\n * text-block, container, and root-document cases. Public consumers that\n * only need to descend containers use {@link getContainerChildren}.\n */\nexport function getNodeChildren(\n context: {\n schema: EditorSchema\n containers: Containers\n },\n node: Node | {value: Array<Node>},\n parent?: RegisteredContainer,\n):\n | {\n children: Array<Node>\n fieldName: string\n parent: RegisteredContainer | undefined\n }\n | undefined {\n // Text blocks store children in .children\n if (isTextBlock(context, node)) {\n return {\n children: node.children,\n fieldName: 'children',\n parent: undefined,\n }\n }\n\n if (isTypedObject(node)) {\n const result = getContainerChildren(context.containers, node, parent)\n\n if (result) {\n return {\n children: result.children,\n fieldName: result.container.field.name,\n parent: result.container,\n }\n }\n }\n\n // Root context: has .value array but no _key or _type\n if (\n 'value' in node &&\n Array.isArray(node['value']) &&\n !('_key' in node) &&\n !('_type' in node)\n ) {\n return {\n children: node['value'] as Array<Node>,\n fieldName: 'value',\n parent: undefined,\n }\n }\n\n return undefined\n}\n","import type {Node} from '../engine/interfaces/node'\nimport type {Path} from '../engine/interfaces/path'\nimport {serializePath} from '../paths/serialize-path'\nimport type {RegisteredContainer} from '../schema/resolve-containers'\nimport {isKeyedSegment} from '../utils/util.is-keyed-segment'\nimport {getNodeChildren} from './get-children'\nimport type {TraversalSnapshot} from './traversal-snapshot'\n\n/**\n * Get the node at a given path.\n *\n * The path can be either keyed (KeyedSegment + field name strings) or\n * indexed (numbers). Keyed segments are resolved by matching `_key`,\n * field name strings are skipped (they're structural), and numbers\n * are resolved by index.\n *\n * The returned path is always fully keyed, even if the input path\n * contained numeric indices.\n *\n * @beta\n */\nexport function getNode(\n snapshot: TraversalSnapshot,\n path: Path,\n): {node: Node; path: Path} | undefined {\n if (path.length === 0) {\n return undefined\n }\n\n const {context, blockIndexMap} = snapshot\n let currentChildren: Array<Node> = context.value\n let node: Node | undefined\n let currentParent: RegisteredContainer | undefined\n const resolvedPath: Path = []\n\n for (let i = 0; i < path.length; i++) {\n const segment = path[i]\n\n if (typeof segment === 'string') {\n resolvedPath.push(segment)\n continue\n }\n\n if (isKeyedSegment(segment)) {\n resolvedPath.push(segment)\n const index = blockIndexMap.get(serializePath(resolvedPath))\n if (\n index !== undefined &&\n currentChildren[index]?._key === segment._key\n ) {\n node = currentChildren[index]\n } else {\n // The map can miss (unkeyed transient nodes, e.g. `{_type:'table'}`\n // inserted by a remote patch before normalize mints a key) or\n // disagree with the traversed value (snapshots that pair the live\n // map with a pre-apply value, e.g. `textPatch`). Fall back to a\n // linear scan in both cases.\n node = currentChildren.find((child) => child._key === segment._key)\n if (node && node._key !== undefined) {\n resolvedPath[resolvedPath.length - 1] = {_key: node._key}\n }\n }\n } else if (typeof segment === 'number') {\n node = currentChildren.at(segment)\n if (node) {\n resolvedPath.push({_key: node._key})\n }\n } else {\n return undefined\n }\n\n if (!node) {\n return undefined\n }\n\n let hasMoreSegments = false\n for (let j = i + 1; j < path.length; j++) {\n const s = path[j]\n if (isKeyedSegment(s) || typeof s === 'number') {\n hasMoreSegments = true\n break\n }\n }\n\n if (hasMoreSegments) {\n const next = getNodeChildren(context, node, currentParent)\n\n if (!next) {\n return undefined\n }\n\n currentChildren = next.children\n currentParent = next.parent\n }\n }\n\n if (!node) {\n return undefined\n }\n\n return {node, path: resolvedPath}\n}\n","import {isKeyedSegment} from '../../utils/util.is-keyed-segment'\nimport type {Path} from '../interfaces/path'\n\n/**\n * Get the parent path of a path.\n *\n * Drops the last node segment (keyed or numeric) and the preceding field\n * name string.\n *\n * [{_key:'b1'}, 'children', {_key:'s1'}] → [{_key:'b1'}]\n * [{_key:'b1'}, 'children', 0] → [{_key:'b1'}]\n * [{_key:'b1'}] → []\n */\nexport function parentPath(path: Path): Path {\n if (path.length === 0) {\n throw new Error(`Cannot get the parent path of the root path [${path}].`)\n }\n\n let lastNodeIndex = -1\n for (let i = path.length - 1; i >= 0; i--) {\n if (isKeyedSegment(path[i]) || typeof path[i] === 'number') {\n lastNodeIndex = i\n break\n }\n }\n\n if (lastNodeIndex === -1) {\n return []\n }\n\n const result = path.slice(0, lastNodeIndex)\n\n if (result.length > 0 && typeof result[result.length - 1] === 'string') {\n return result.slice(0, -1)\n }\n\n return result\n}\n","import type {PortableTextBlock} from '@portabletext/schema'\nimport type {Path} from '../engine/interfaces/path'\nimport {parentPath} from '../engine/path/parent-path'\nimport {getNode} from './get-node'\nimport type {TraversalSnapshot} from './traversal-snapshot'\n\n/**\n * Get the parent of a node at a given path.\n *\n * A parent has children, so it is always a `PortableTextBlock` (text block\n * or object node).\n *\n * When `match` is provided and the parent does not satisfy it, returns\n * `undefined`.\n *\n * @beta\n */\nexport function getParent<TMatch extends PortableTextBlock>(\n snapshot: TraversalSnapshot,\n path: Path,\n options: {\n match: (node: PortableTextBlock, path: Path) => node is TMatch\n },\n): {node: TMatch; path: Path} | undefined\n/**\n * @beta\n */\nexport function getParent(\n snapshot: TraversalSnapshot,\n path: Path,\n options?: {\n match?: (node: PortableTextBlock, path: Path) => boolean\n },\n): {node: PortableTextBlock; path: Path} | undefined\nexport function getParent(\n snapshot: TraversalSnapshot,\n path: Path,\n options?: {\n match?: (node: PortableTextBlock, path: Path) => boolean\n },\n): {node: PortableTextBlock; path: Path} | undefined {\n if (path.length === 0) {\n return undefined\n }\n\n const parent = parentPath(path)\n\n if (parent.length === 0) {\n return undefined\n }\n\n const entry = getNode(snapshot, parent)\n\n if (!entry) {\n return undefined\n }\n\n const result = {node: entry.node as PortableTextBlock, path: entry.path}\n\n if (options?.match && !options.match(result.node, result.path)) {\n return undefined\n }\n\n return result\n}\n"],"names":["isKeyedSegment","segment","serializePath","path","reduce","result","index","_key","isTypedObject","object","isRecord","value","getContainerChildren","containers","node","parent","resolved","resolveNodeContainer","fieldValue","field","name","Array","isArray","children","container","of","entry","type","_type","get","getChildren","snapshot","currentChildren","context","currentFieldName","currentPath","isRoot","currentParent","candidatePath","blockIndexMap","undefined","find","child","at","next","getNodeChildren","fieldName","map","isTextBlock","getNode","length","resolvedPath","i","push","hasMoreSegments","j","s","parentPath","Error","lastNodeIndex","slice","getParent","options","match"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { It as Containers, Nt as TraversalSnapshot, Pt as Node, lt as EditorSelection, pn as Path, ut as EditorSelectionPoint } from "../_chunks-dts/behavior.types.action.js";
1
+ import { It as Containers, Nt as TraversalSnapshot, Pt as Node, Rt as RegisteredContainer, lt as EditorSelection, pn as Path, ut as EditorSelectionPoint } from "../_chunks-dts/behavior.types.action.js";
2
2
  import { PortableTextBlock, PortableTextObject, PortableTextSpan, PortableTextTextBlock, Schema } from "@portabletext/schema";
3
3
  /**
4
4
  * Find an ancestor of the node at a given path that matches a predicate.
@@ -80,6 +80,27 @@ declare function getChildren(snapshot: TraversalSnapshot, path: Path): Array<{
80
80
  node: Node;
81
81
  path: Path;
82
82
  }>;
83
+ /**
84
+ * Resolve a container node's editable child array.
85
+ *
86
+ * Returns `{children, container}` for a node registered as a container:
87
+ * `children` is the node's editable child array, and `container` is the
88
+ * node's own container registration. Read `container.field.name` for the
89
+ * path segment that reaches `children`, and thread `container` back in as
90
+ * `parent` when descending into them.
91
+ *
92
+ * Returns `undefined` for anything that is not a container: text blocks,
93
+ * spans, leaves, and unregistered objects. It is node-based and resolves
94
+ * in one step with no path re-walk, so recursive descent over containers
95
+ * is linear in nesting depth. The caller seeds the document root from
96
+ * `context.value` itself.
97
+ *
98
+ * @beta
99
+ */
100
+ declare function getContainerChildren(containers: Containers, node: Node, parent?: RegisteredContainer): {
101
+ children: Array<Node>;
102
+ container: RegisteredContainer;
103
+ } | undefined;
83
104
  /**
84
105
  * Walk up from a path to find the nearest enclosing block.
85
106
  *
@@ -346,5 +367,5 @@ declare function isLeafObject(snapshot: TraversalSnapshot, node: unknown, path:
346
367
  * @beta
347
368
  */
348
369
  declare function isObject(snapshot: TraversalSnapshot, node: unknown): node is PortableTextObject;
349
- export { comparePoints, getAncestor, getAncestors, getBlock, getChildren, getEnclosingBlock, getFirstChild, getLastChild, getLeaf, getNode, getParent, getPathSubSchema, getSibling, getSpan, getText, getTextBlock, getUnionSchema, hasNode, isBlock, isInline, isLeafObject, isObject, pathContains, rangeIntersects };
370
+ export { comparePoints, getAncestor, getAncestors, getBlock, getChildren, getContainerChildren, getEnclosingBlock, getFirstChild, getLastChild, getLeaf, getNode, getParent, getPathSubSchema, getSibling, getSpan, getText, getTextBlock, getUnionSchema, hasNode, isBlock, isInline, isLeafObject, isObject, pathContains, rangeIntersects };
350
371
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/traversal/get-ancestor.ts","../../src/traversal/get-ancestors.ts","../../src/traversal/is-block.ts","../../src/traversal/get-children.ts","../../src/traversal/get-enclosing-block.ts","../../src/traversal/get-first-child.ts","../../src/traversal/get-last-child.ts","../../src/traversal/get-leaf.ts","../../src/traversal/get-node.ts","../../src/traversal/get-parent.ts","../../src/traversal/get-path-sub-schema.ts","../../src/traversal/get-sibling.ts","../../src/traversal/compare-points.ts","../../src/traversal/path-contains.ts","../../src/traversal/range-intersects.ts","../../src/traversal/get-span.ts","../../src/traversal/get-text.ts","../../src/traversal/get-text-block.ts","../../src/traversal/get-union-schema.ts","../../src/traversal/has-node.ts","../../src/traversal/is-inline.ts","../../src/traversal/is-leaf-object.ts","../../src/traversal/is-object.ts"],"sourcesContent":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/traversal/get-ancestor.ts","../../src/traversal/get-ancestors.ts","../../src/traversal/is-block.ts","../../src/traversal/get-children.ts","../../src/traversal/get-container-children.ts","../../src/traversal/get-enclosing-block.ts","../../src/traversal/get-first-child.ts","../../src/traversal/get-last-child.ts","../../src/traversal/get-leaf.ts","../../src/traversal/get-node.ts","../../src/traversal/get-parent.ts","../../src/traversal/get-path-sub-schema.ts","../../src/traversal/get-sibling.ts","../../src/traversal/compare-points.ts","../../src/traversal/path-contains.ts","../../src/traversal/range-intersects.ts","../../src/traversal/get-span.ts","../../src/traversal/get-text.ts","../../src/traversal/get-text-block.ts","../../src/traversal/get-union-schema.ts","../../src/traversal/has-node.ts","../../src/traversal/is-inline.ts","../../src/traversal/is-leaf-object.ts","../../src/traversal/is-object.ts"],"sourcesContent":[],"mappings":";;AAgBA;;;;;;;;;;AAWA;AACY,iBAZI,WAYJ,CAAA,eAZ+B,iBAY/B,CAAA,CAAA,QAAA,EAXA,iBAWA,EAAA,IAAA,EAVJ,IAUI,EAAA,OAAA,EAAA;EACJ,KAAA,EAAA,CAAA,IAAA,EATU,iBASV,EAAA,IAAA,EATmC,IASnC,EAAA,GAAA,IAAA,IAToD,MASpD;EAEU,IAAA,CAAA,EAAA,QAAA,GAAA,SAAA;CAAyB,CAAA,EAAA;EAGjC,IAAA,EAXA,MAWA;EAAyB,IAAA,EAXX,IAWW;CAAI,GAAA,SAAA;;ACTvC;;AAEQ,iBDAQ,WAAA,CCAR,QAAA,EDCI,iBCDJ,EAAA,IAAA,EDEA,ICFA,EAAA,OAAA,EAAA;EACQ,KAAA,EAAA,CAAA,IAAA,EDGE,iBCHF,EAAA,IAAA,EDG2B,ICH3B,EAAA,GAAA,OAAA;EAAyB,IAAA,CAAA,EAAA,QAAA,GAAA,SAAA;CAAtC,CAAA,EAAA;EAAK,IAAA,EDME,iBCNF;QDM2B;AEhBnC,CAAA,GAAgB,SAAA;AFFhB;;;;;;;;;;AAWA;;;;;;AAOmC,iBCTnB,YAAA,CDSmB,QAAA,ECRvB,iBDQuB,EAAA,IAAA,ECP3B,IDO2B,CAAA,ECNhC,KDMgC,CAAA;EAAI,IAAA,ECNvB,iBDMuB;QCNE;AAHzC,CAAA,CAAA;ADTA;;;;;;;;;;AAWgB,iBETA,OAAA,CFSW,QAAA,EETO,iBFSP,EAAA,IAAA,EETgC,IFShC,CAAA,EAAA,OAAA;;;;;;;;;ACFX,iBCWA,QAAA,CDXY,QAAA,ECYhB,iBDZgB,EAAA,IAAA,ECapB,IDboB,CAAA,EAAA;EAChB,IAAA,ECaF,iBDbE;EACJ,IAAA,ECY2B,IDZ3B;CACQ,GAAA,SAAA;;;;;;ADLN,iBGJM,WAAA,CHIN,QAAA,EGHE,iBHGF,EAAA,IAAA,EGFF,IHEE,CAAA,EGDP,KHCO,CAAA;EAAc,IAAA,EGDR,IHCQ;EAAI,IAAA,EGDA,IHCA;AAI5B,CAAA,CAAA;;AAXA;;;;;;;;;;AAWA;;;;;;AAOmC,iBIXnB,oBAAA,CJWmB,UAAA,EIVrB,UJUqB,EAAA,IAAA,EIT3B,IJS2B,EAAA,MAAA,CAAA,EIRxB,mBJQwB,CAAA,EAAA;EAAI,QAAA,EILvB,KJKuB,CILjB,IJKiB,CAAA;aIJtB;AHLjB,CAAA,GAAgB,SAAA;ADThB;;;;;;;;;;AAWA;;;;;;;;iBKHgB,iCAAiC,6BACrC,yBACJ;EJDQ,KAAA,EAAA,CAAA,IAAA,EIGE,iBJHU,EAAA,IAAA,EIGe,IJHf,EAAA,GAAA,IAAA,IIGgC,MJHhC;EAChB,IAAA,CAAA,EAAA,QAAA,GAAA,SAAA;CACJ,CAAA,EAAA;EACQ,IAAA,EIGN,MJHM;EAAyB,IAAA,EIGjB,IJHiB;CAAtC,GAAA,SAAA;;;ACVH;AAkBgB,iBGDA,iBAAA,CHCQ,QAAA,EGAZ,iBHAY,EAAA,IAAA,EGChB,IHDgB,EAAA,OAGd,CAHc,EAAA;EACZ,KAAA,CAAA,EAAA,CAAA,IAAA,EGEO,iBHFP,EAAA,IAAA,EGEgC,IHFhC,EAAA,GAAA,OAAA;EACJ,IAAA,CAAA,EAAA,QAAA,GAAA,SAAA;CACE,CAAA,EAAA;EAAyB,IAAA,EGGzB,iBHHyB;EAAI,IAAA,EGGJ,IHHI;;AFvBvC;;;;;AAI2C,iBMV3B,aAAA,CNU2B,QAAA,EMT/B,iBNS+B,EAAA,IAAA,EMRnC,INQmC,CAAA,EAAA;EAAiB,IAAA,EMPlD,INOkD;EAGlD,IAAA,EMVY,INUZ;CAAc,GAAA,SAAA;AAPxB;;;;;AAI2C,iBOV3B,YAAA,CPU2B,QAAA,EOT/B,iBPS+B,EAAA,IAAA,EORnC,IPQmC,CAAA,EAAA;EAAiB,IAAA,EOPlD,IPOkD;EAGlD,IAAA,EOVY,IPUZ;CAAc,GAAA,SAAA;AAPxB;;;;;;;AAOU,iBQVM,OAAA,CRUN,QAAA,EQTE,iBRSF,EAAA,IAAA,EQRF,IRQE,EAAA,OAAA,EAAA;EAAc,IAAA,EAAA,OAAA,GAAA,KAAA;CAAI,CAAA,EAAA;EAIZ,IAAA,EQVN,IRUM;EACJ,IAAA,EQXU,IRWV;CACJ,GAAA,SAAA;AAbR;;;;;;;;;;AAWA;;;AAIkB,iBSVF,OAAA,CTUE,QAAA,ESTN,iBTSM,EAAA,IAAA,ESRV,ITQU,CAAA,EAAA;EAAyB,IAAA,ESPjC,ITOiC;EAGjC,IAAA,ESVY,ITUZ;CAAyB,GAAA,SAAA;AAlBnC;;;;;;;;;;AAWA;AACY,iBUXI,SVWJ,CAAA,eUX6B,iBVW7B,CAAA,CAAA,QAAA,EUVA,iBVUA,EAAA,IAAA,EUTJ,IVSI,EAAA,OAAA,EAAA;EACJ,KAAA,EAAA,CAAA,IAAA,EURU,iBVQV,EAAA,IAAA,EURmC,IVQnC,EAAA,GAAA,IAAA,IURoD,MVQpD;CAEU,CAAA,EAAA;EAAyB,IAAA,EURjC,MVQiC;EAGjC,IAAA,EUXc,IVWd;CAAyB,GAAA,SAAA;;;ACTnC;AACY,iBSCI,SAAA,CTDJ,QAAA,ESEA,iBTFA,EAAA,IAAA,ESGJ,ITHI,EAAA,OAEI,CAFJ,EAAA;EACJ,KAAA,CAAA,EAAA,CAAA,IAAA,ESIW,iBTJX,EAAA,IAAA,ESIoC,ITJpC,EAAA,GAAA,OAAA;CACQ,CAAA,EAAA;EAAyB,IAAA,ESK/B,iBTL+B;EAAtC,IAAA,ESKgC,ITLhC;CAAK,GAAA,SAAA;ADZR;;;;;;;;;;AAWgB,iBWZA,gBAAA,CXYW,QAAA,EWXf,iBXWe,EAAA,IAAA,EWVnB,IXUmB,CAAA,EWTxB,MXSwB;AAX3B;;;;;;;;;;AAWA;AACY,iBYTI,UZSJ,CAAA,eYT8B,IZS9B,CAAA,CAAA,QAAA,EYRA,iBZQA,EAAA,IAAA,EYPJ,IZOI,EAAA,OAAA,EAAA;EACJ,SAAA,EAAA,MAAA,GAAA,UAAA;EAEU,KAAA,EAAA,CAAA,IAAA,EYPA,IZOA,EAAA,IAAA,EYPY,IZOZ,EAAA,GAAA,IAAA,IYP6B,MZO7B;CAAyB,CAAA,EAAA;EAGjC,IAAA,EYRA,MZQA;EAAyB,IAAA,EYRX,IZQW;CAAI,GAAA,SAAA;;ACTvC;;AAEQ,iBWGQ,UAAA,CXHR,QAAA,EWII,iBXJJ,EAAA,IAAA,EWKA,IXLA,EAAA,OAAA,EAAA;EACQ,SAAA,EAAA,MAAA,GAAA,UAAA;EAAyB,KAAA,CAAA,EAAA,CAAA,IAAA,EWOtB,IXPsB,EAAA,IAAA,EWOV,IXPU,EAAA,GAAA,OAAA;CAAtC,CAAA,EAAA;EAAK,IAAA,EWSE,IXTF;QWSc;AVnBtB,CAAA,GAAgB,SAAA;;AFFhB;;;;;;;;;;AAWA;AACY,iBaZI,aAAA,CbYJ,QAAA,EaXA,iBbWA,EAAA,MAAA,EaVF,oBbUE,EAAA,MAAA,EaTF,oBbSE,CAAA,EAAA,CAAA,CAAA,GAAA,CAAA,GAAA,CAAA;;;AAZZ;;;;AAIkB,iBcXF,YAAA,CdWE,QAAA,EcXqB,IdWrB,EAAA,UAAA,EcXuC,IdWvC,CAAA,EAAA,OAAA;AAJlB;;;;;;;;;;AAWA;;;;;;;;iBeEgB,eAAA,WACJ,0BACH,yBACC,OAAO,uBAAuB;AfhBxC;;;;;AAI2C,iBgBV3B,OAAA,ChBU2B,QAAA,EgBT/B,iBhBS+B,EAAA,IAAA,EgBRnC,IhBQmC,CAAA,EAAA;EAAiB,IAAA,EgBPlD,gBhBOkD;EAGlD,IAAA,EgBVwB,IhBUxB;CAAc,GAAA,SAAA;;AAPxB;;;;AAIkB,iBiBTF,OAAA,CjBSE,QAAA,EiBRN,iBjBQM,EAAA,IAAA,EiBPV,IjBOU,CAAA,EAAA,MAAA,GAAA,SAAA;AAJlB;;;;;AAI2C,iBkBV3B,YAAA,ClBU2B,QAAA,EkBT/B,iBlBS+B,EAAA,IAAA,EkBRnC,IlBQmC,CAAA,EAAA;EAAiB,IAAA,EkBPlD,qBlBOkD;EAGlD,IAAA,EkBV6B,IlBU7B;CAAc,GAAA,SAAA;;AAPxB;;;;;;;;;;AAWA;;;;;;;;;ACFA;;;;AAGyC,iBkBDzB,cAAA,ClBCyB,MAAA,EkBDF,MlBCE,EAAA,UAAA,EkBDkB,UlBClB,CAAA,EkBD+B,MlBC/B;;ADZzC;;;;AAIkB,iBoBXF,OAAA,CpBWE,QAAA,EoBXgB,iBpBWhB,EAAA,IAAA,EoBXyC,IpBWzC,CAAA,EAAA,OAAA;;AAJlB;;;;;;;AAOU,iBqBXM,QAAA,CrBWN,QAAA,EqBXyB,iBrBWzB,EAAA,IAAA,EqBXkD,IrBWlD,CAAA,EAAA,OAAA;AAPV;;;;;;;;AAOwB,iBsBTR,YAAA,CtBSQ,QAAA,EsBRZ,iBtBQY,EAAA,IAAA,EAAA,OAAA,EAAA,IAAA,EsBNhB,ItBMgB,CAAA,EAAA,IAAA,IsBLb,kBtBKa;;AAPxB;;;;AAIkB,iBuBXF,QAAA,CvBWE,QAAA,EuBVN,iBvBUM,EAAA,IAAA,EAAA,OAAA,CAAA,EAAA,IAAA,IuBRP,kBvBQO"}
@@ -1,7 +1,7 @@
1
1
  import { getAncestor, getFirstChild, getLeaf, getSpan, getText, getTextBlock, getUnionSchema, isLeafObject, pathContains, rangeIntersects } from "../_chunks-es/get-first-child.js";
2
2
  import { comparePoints, getAncestors, getBlock, getEnclosingBlock, getPathSubSchema, getSibling, hasNode, isBlock, isInline, isObject } from "../_chunks-es/get-path-sub-schema.js";
3
3
  import { getChildren } from "../_chunks-es/get-parent.js";
4
- import { getNode, getParent } from "../_chunks-es/get-parent.js";
4
+ import { getContainerChildren, getNode, getParent } from "../_chunks-es/get-parent.js";
5
5
  function getLastChild(snapshot, path) {
6
6
  return getChildren(snapshot, path).at(-1);
7
7
  }
@@ -11,6 +11,7 @@ export {
11
11
  getAncestors,
12
12
  getBlock,
13
13
  getChildren,
14
+ getContainerChildren,
14
15
  getEnclosingBlock,
15
16
  getFirstChild,
16
17
  getLastChild,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@portabletext/editor",
3
- "version": "7.5.2",
3
+ "version": "7.6.0",
4
4
  "description": "Portable Text Editor made in React",
5
5
  "keywords": [
6
6
  "sanity",
@@ -47,7 +47,7 @@
47
47
  "@xstate/react": "^6.1.0",
48
48
  "debug": "^4.4.3",
49
49
  "scroll-into-view-if-needed": "^3.1.0",
50
- "xstate": "^5.32.0",
50
+ "xstate": "^5.32.1",
51
51
  "@portabletext/html": "^1.0.2",
52
52
  "@portabletext/keyboard-shortcuts": "^2.1.2",
53
53
  "@portabletext/markdown": "^1.4.0",