@portabletext/editor 1.47.0 → 1.47.2
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.
- package/lib/_chunks-cjs/behavior.core.cjs +7 -7
- package/lib/_chunks-cjs/behavior.core.cjs.map +1 -1
- package/lib/_chunks-cjs/behavior.markdown.cjs.map +1 -1
- package/lib/_chunks-cjs/editor-provider.cjs +379 -326
- package/lib/_chunks-cjs/editor-provider.cjs.map +1 -1
- package/lib/_chunks-cjs/parse-blocks.cjs +4 -4
- package/lib/_chunks-cjs/parse-blocks.cjs.map +1 -1
- package/lib/_chunks-cjs/selector.is-overlapping-selection.cjs.map +1 -1
- package/lib/_chunks-es/behavior.core.js +7 -7
- package/lib/_chunks-es/behavior.core.js.map +1 -1
- package/lib/_chunks-es/behavior.markdown.js.map +1 -1
- package/lib/_chunks-es/editor-provider.js +380 -327
- package/lib/_chunks-es/editor-provider.js.map +1 -1
- package/lib/_chunks-es/parse-blocks.js +4 -4
- package/lib/_chunks-es/parse-blocks.js.map +1 -1
- package/lib/_chunks-es/selector.is-overlapping-selection.js.map +1 -1
- package/lib/behaviors/index.cjs.map +1 -1
- package/lib/behaviors/index.d.cts +70 -28
- package/lib/behaviors/index.d.ts +70 -28
- package/lib/behaviors/index.js.map +1 -1
- package/lib/index.cjs +12 -14
- package/lib/index.cjs.map +1 -1
- package/lib/index.d.cts +61 -3
- package/lib/index.d.ts +61 -3
- package/lib/index.js +12 -14
- package/lib/index.js.map +1 -1
- package/lib/plugins/index.cjs.map +1 -1
- package/lib/plugins/index.d.cts +68 -23
- package/lib/plugins/index.d.ts +68 -23
- package/lib/plugins/index.js.map +1 -1
- package/lib/selectors/index.d.cts +69 -27
- package/lib/selectors/index.d.ts +69 -27
- package/lib/utils/index.d.cts +74 -29
- package/lib/utils/index.d.ts +74 -29
- package/package.json +6 -6
- package/src/behavior-actions/behavior.action.insert.block.ts +1 -1
- package/src/behavior-actions/behavior.action.split.block.ts +1 -1
- package/src/behavior-actions/behavior.guards.ts +1 -1
- package/src/behaviors/behavior.core.decorators.ts +4 -4
- package/src/behaviors/behavior.core.insert-break.ts +4 -4
- package/src/behaviors/behavior.decorator-pair.ts +1 -1
- package/src/behaviors/behavior.links.ts +1 -1
- package/src/behaviors/behavior.markdown.ts +1 -1
- package/src/behaviors/behavior.perform-event.ts +1 -1
- package/src/converters/converter.portable-text.deserialize.test.ts +2 -3
- package/src/converters/converter.text-html.deserialize.test.ts +62 -5
- package/src/converters/converter.text-html.serialize.test.ts +9 -5
- package/src/converters/converter.text-html.ts +66 -64
- package/src/converters/converter.text-plain.test.ts +9 -4
- package/src/converters/converter.text-plain.ts +91 -87
- package/src/converters/converters.core.ts +13 -8
- package/src/editor/Editable.tsx +18 -13
- package/src/editor/PortableTextEditor.tsx +5 -5
- package/src/editor/__tests__/PortableTextEditorTester.tsx +4 -3
- package/src/editor/__tests__/insert-block.test.tsx +10 -10
- package/src/editor/__tests__/self-solving.test.tsx +2 -2
- package/src/editor/components/Synchronizer.tsx +1 -1
- package/src/editor/create-editor.ts +51 -18
- package/src/editor/editor-machine.ts +1 -1
- package/src/editor/{define-schema.ts → editor-schema.ts} +114 -5
- package/src/editor/editor-snapshot.ts +1 -1
- package/src/editor/get-active-decorators.ts +2 -2
- package/src/editor/{create-editor-schema.ts → legacy-schema.ts} +3 -3
- package/src/editor/mutation-machine.ts +1 -1
- package/src/editor/plugins/createWithObjectKeys.ts +6 -9
- package/src/editor/plugins/createWithPatches.ts +12 -11
- package/src/editor/plugins/createWithPortableTextBlockStyle.ts +2 -6
- package/src/editor/plugins/createWithPortableTextMarkModel.ts +15 -12
- package/src/editor/plugins/createWithSchemaTypes.ts +24 -16
- package/src/editor/plugins/createWithUndoRedo.ts +3 -4
- package/src/editor/plugins/createWithUtils.ts +12 -10
- package/src/editor/plugins/with-plugins.ts +5 -15
- package/src/editor/range-decorations-machine.ts +1 -1
- package/src/editor/sync-machine.ts +1 -1
- package/src/index.ts +2 -2
- package/src/internal-utils/__tests__/operationToPatches.test.ts +12 -10
- package/src/internal-utils/__tests__/patchToOperations.test.ts +3 -2
- package/src/internal-utils/__tests__/values.test.ts +3 -2
- package/src/internal-utils/applyPatch.ts +7 -9
- package/src/internal-utils/create-test-snapshot.ts +1 -1
- package/src/internal-utils/drag-selection.test.ts +1 -1
- package/src/internal-utils/operationToPatches.ts +4 -6
- package/src/internal-utils/parse-blocks.test.ts +1 -1
- package/src/internal-utils/parse-blocks.ts +8 -7
- package/src/internal-utils/slate-children-to-blocks.ts +1 -1
- package/src/internal-utils/slate-utils.ts +1 -1
- package/src/internal-utils/validateValue.ts +4 -6
- package/src/internal-utils/values.ts +5 -5
- package/src/plugins/plugin.decorator-shortcut.ts +1 -1
- package/src/plugins/plugin.markdown.test.tsx +1 -1
- package/src/plugins/plugin.markdown.tsx +1 -1
- package/src/selectors/selector.get-selection-text.test.ts +1 -1
- package/src/selectors/selector.get-trimmed-selection.test.ts +1 -1
|
@@ -112,11 +112,11 @@ function parseTextBlock({
|
|
|
112
112
|
}],
|
|
113
113
|
markDefs
|
|
114
114
|
};
|
|
115
|
-
if (typeof parsedBlock.style != "string" || !context.schema.styles.find((style) => style.
|
|
116
|
-
const defaultStyle = context.schema.styles.at(0)?.
|
|
115
|
+
if (typeof parsedBlock.style != "string" || !context.schema.styles.find((style) => style.name === block.style)) {
|
|
116
|
+
const defaultStyle = context.schema.styles.at(0)?.name;
|
|
117
117
|
defaultStyle !== void 0 ? parsedBlock.style = defaultStyle : delete parsedBlock.style;
|
|
118
118
|
}
|
|
119
|
-
return (typeof parsedBlock.listItem != "string" || !context.schema.lists.find((list) => list.
|
|
119
|
+
return (typeof parsedBlock.listItem != "string" || !context.schema.lists.find((list) => list.name === block.listItem)) && delete parsedBlock.listItem, typeof parsedBlock.level != "number" && delete parsedBlock.level, parsedBlock;
|
|
120
120
|
}
|
|
121
121
|
function parseSpan({
|
|
122
122
|
span,
|
|
@@ -130,7 +130,7 @@ function parseSpan({
|
|
|
130
130
|
if (typeof mark != "string")
|
|
131
131
|
return [];
|
|
132
132
|
const markDefKey = markDefKeyMap.get(mark);
|
|
133
|
-
return markDefKey !== void 0 ? [markDefKey] : context.schema.decorators.some((decorator) => decorator.
|
|
133
|
+
return markDefKey !== void 0 ? [markDefKey] : context.schema.decorators.some((decorator) => decorator.name === mark) ? [mark] : [];
|
|
134
134
|
});
|
|
135
135
|
return {
|
|
136
136
|
// Spread the entire span to allow custom properties on it
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse-blocks.js","sources":["../../src/internal-utils/asserters.ts","../../src/internal-utils/parse-blocks.ts"],"sourcesContent":["import type {TypedObject} from '@sanity/types'\n\nexport function isTypedObject(object: unknown): object is TypedObject {\n return isRecord(object) && typeof object._type === 'string'\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && (typeof value === 'object' || typeof value === 'function')\n}\n","import type {\n ObjectSchemaType,\n PortableTextBlock,\n PortableTextObject,\n PortableTextSpan,\n PortableTextTextBlock,\n TypedObject,\n} from '@sanity/types'\nimport type {EditorSchema} from '../editor/define-schema'\nimport type {EditorContext} from '../editor/editor-snapshot'\nimport {isTypedObject} from './asserters'\n\nexport function parseBlocks({\n context,\n blocks,\n options,\n}: {\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n blocks: unknown\n options: {\n refreshKeys: boolean\n }\n}): Array<PortableTextBlock> {\n if (!Array.isArray(blocks)) {\n return []\n }\n\n return blocks.flatMap((block) => {\n const parsedBlock = parseBlock({context, block, options})\n\n return parsedBlock ? [parsedBlock] : []\n })\n}\n\nexport function parseBlock({\n context,\n block,\n options,\n}: {\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n block: unknown\n options: {\n refreshKeys: boolean\n }\n}): PortableTextBlock | undefined {\n return (\n parseTextBlock({block, context, options}) ??\n parseBlockObject({blockObject: block, context, options})\n )\n}\n\nfunction parseBlockObject({\n blockObject,\n context,\n options,\n}: {\n blockObject: unknown\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n options: {refreshKeys: boolean}\n}): PortableTextObject | undefined {\n if (!isTypedObject(blockObject)) {\n return undefined\n }\n\n const schemaType = context.schema.blockObjects.find(\n ({name}) => name === blockObject._type,\n )\n\n if (!schemaType) {\n return undefined\n }\n\n return parseObject({\n object: blockObject,\n context: {\n keyGenerator: context.keyGenerator,\n schemaType,\n },\n options,\n })\n}\n\nexport function isTextBlock(\n schema: EditorSchema,\n block: unknown,\n): block is PortableTextTextBlock {\n return (\n parseTextBlock({\n block,\n context: {schema, keyGenerator: () => ''},\n options: {refreshKeys: false},\n }) !== undefined\n )\n}\n\nfunction parseTextBlock({\n block,\n context,\n options,\n}: {\n block: unknown\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n options: {refreshKeys: boolean}\n}): PortableTextTextBlock | undefined {\n if (!isTypedObject(block)) {\n return undefined\n }\n\n if (block._type !== context.schema.block.name) {\n return undefined\n }\n\n const _key = options.refreshKeys\n ? context.keyGenerator()\n : typeof block._key === 'string'\n ? block._key\n : context.keyGenerator()\n\n const unparsedMarkDefs: Array<unknown> = Array.isArray(block.markDefs)\n ? block.markDefs\n : []\n const markDefKeyMap = new Map<string, string>()\n const markDefs = unparsedMarkDefs.flatMap((markDef) => {\n if (!isTypedObject(markDef)) {\n return []\n }\n\n const schemaType = context.schema.annotations.find(\n ({name}) => name === markDef._type,\n )\n\n if (!schemaType) {\n return []\n }\n\n if (typeof markDef._key !== 'string') {\n // If the `markDef` doesn't have a `_key` then we don't know what spans\n // it belongs to and therefore we have to discard it.\n return []\n }\n\n const parsedAnnotation = parseObject({\n object: markDef,\n context: {\n schemaType,\n keyGenerator: context.keyGenerator,\n },\n options,\n })\n\n if (!parsedAnnotation) {\n return []\n }\n\n markDefKeyMap.set(markDef._key, parsedAnnotation._key)\n\n return [parsedAnnotation]\n })\n\n const unparsedChildren: Array<unknown> = Array.isArray(block.children)\n ? block.children\n : []\n\n const children = unparsedChildren\n .map(\n (child) =>\n parseSpan({span: child, context, markDefKeyMap, options}) ??\n parseInlineObject({inlineObject: child, context, options}),\n )\n .filter((child) => child !== undefined)\n\n const parsedBlock: PortableTextTextBlock = {\n // Spread the entire block to allow custom properties on it\n ...block,\n _key,\n children:\n children.length > 0\n ? children\n : [\n {\n _key: context.keyGenerator(),\n _type: context.schema.span.name,\n text: '',\n marks: [],\n },\n ],\n markDefs,\n }\n\n /**\n * Reset text block .style if it's somehow set to an invalid type\n */\n if (\n typeof parsedBlock.style !== 'string' ||\n !context.schema.styles.find((style) => style.value === block.style)\n ) {\n const defaultStyle = context.schema.styles.at(0)?.value\n\n if (defaultStyle !== undefined) {\n parsedBlock.style = defaultStyle\n } else {\n delete parsedBlock.style\n }\n }\n\n /**\n * Reset text block .listItem if it's somehow set to an invalid type\n */\n if (\n typeof parsedBlock.listItem !== 'string' ||\n !context.schema.lists.find((list) => list.value === block.listItem)\n ) {\n delete parsedBlock.listItem\n }\n\n /**\n * Reset text block .level if it's somehow set to an invalid type\n */\n if (typeof parsedBlock.level !== 'number') {\n delete parsedBlock.level\n }\n\n return parsedBlock\n}\n\nexport function isSpan(\n schema: EditorSchema,\n child: PortableTextSpan | PortableTextObject,\n): child is PortableTextSpan {\n return (\n parseSpan({\n span: child,\n markDefKeyMap: new Map(),\n context: {schema, keyGenerator: () => ''},\n options: {refreshKeys: false},\n }) !== undefined\n )\n}\n\nexport function parseSpan({\n span,\n context,\n markDefKeyMap,\n options,\n}: {\n span: unknown\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n markDefKeyMap: Map<string, string>\n options: {refreshKeys: boolean}\n}): PortableTextSpan | undefined {\n if (!isTypedObject(span)) {\n return undefined\n }\n\n // In reality, the span schema name is always 'span', but we only the check here anyway\n if (span._type !== context.schema.span.name || span._type !== 'span') {\n return undefined\n }\n\n const unparsedMarks: Array<unknown> = Array.isArray(span.marks)\n ? span.marks\n : []\n const marks = unparsedMarks.flatMap((mark) => {\n if (typeof mark !== 'string') {\n return []\n }\n\n const markDefKey = markDefKeyMap.get(mark)\n\n if (markDefKey !== undefined) {\n return [markDefKey]\n }\n\n if (\n context.schema.decorators.some((decorator) => decorator.value === mark)\n ) {\n return [mark]\n }\n\n return []\n })\n\n return {\n // Spread the entire span to allow custom properties on it\n ...span,\n _type: 'span',\n _key: options.refreshKeys\n ? context.keyGenerator()\n : typeof span._key === 'string'\n ? span._key\n : context.keyGenerator(),\n text: typeof span.text === 'string' ? span.text : '',\n marks,\n }\n}\n\nexport function parseInlineObject({\n inlineObject,\n context,\n options,\n}: {\n inlineObject: unknown\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n options: {refreshKeys: boolean}\n}): PortableTextObject | undefined {\n if (!isTypedObject(inlineObject)) {\n return undefined\n }\n\n const schemaType = context.schema.inlineObjects.find(\n ({name}) => name === inlineObject._type,\n )\n\n if (!schemaType) {\n return undefined\n }\n\n return parseObject({\n object: inlineObject,\n context: {\n keyGenerator: context.keyGenerator,\n schemaType,\n },\n options,\n })\n}\n\nexport function parseAnnotation({\n annotation,\n context,\n options,\n}: {\n annotation: TypedObject\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n options: {refreshKeys: boolean}\n}): PortableTextObject | undefined {\n if (!isTypedObject(annotation)) {\n return undefined\n }\n\n const schemaType = context.schema.annotations.find(\n ({name}) => name === annotation._type,\n )\n\n if (!schemaType) {\n return undefined\n }\n\n return parseObject({\n object: annotation,\n context: {\n keyGenerator: context.keyGenerator,\n schemaType,\n },\n options,\n })\n}\n\nfunction parseObject({\n object,\n context,\n options,\n}: {\n object: TypedObject\n context: Pick<EditorContext, 'keyGenerator'> & {schemaType: ObjectSchemaType}\n options: {refreshKeys: boolean}\n}): PortableTextObject {\n // Validates all props on the object and only takes those that match\n // the name of a field\n const values = context.schemaType.fields.reduce<Record<string, unknown>>(\n (fieldValues, field) => {\n const fieldValue = object[field.name]\n\n if (fieldValue !== undefined) {\n fieldValues[field.name] = fieldValue\n }\n\n return fieldValues\n },\n {},\n )\n\n return {\n _type: context.schemaType.name,\n _key: options.refreshKeys\n ? context.keyGenerator()\n : typeof object._key === 'string'\n ? object._key\n : context.keyGenerator(),\n ...values,\n }\n}\n"],"names":["isTypedObject","object","isRecord","_type","value","parseBlocks","context","blocks","options","Array","isArray","flatMap","block","parsedBlock","parseBlock","parseTextBlock","parseBlockObject","blockObject","schemaType","schema","blockObjects","find","name","parseObject","keyGenerator","isTextBlock","refreshKeys","undefined","_key","unparsedMarkDefs","markDefs","markDefKeyMap","Map","markDef","annotations","parsedAnnotation","set","children","map","child","parseSpan","span","parseInlineObject","inlineObject","filter","length","text","marks","style","styles","defaultStyle","at","listItem","lists","list","level","mark","markDefKey","get","decorators","some","decorator","inlineObjects","parseAnnotation","annotation","values","fields","reduce","fieldValues","field","fieldValue"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"parse-blocks.js","sources":["../../src/internal-utils/asserters.ts","../../src/internal-utils/parse-blocks.ts"],"sourcesContent":["import type {TypedObject} from '@sanity/types'\n\nexport function isTypedObject(object: unknown): object is TypedObject {\n return isRecord(object) && typeof object._type === 'string'\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && (typeof value === 'object' || typeof value === 'function')\n}\n","import type {\n PortableTextBlock,\n PortableTextObject,\n PortableTextSpan,\n PortableTextTextBlock,\n TypedObject,\n} from '@sanity/types'\nimport type {EditorSchema} from '../editor/editor-schema'\nimport type {EditorContext} from '../editor/editor-snapshot'\nimport {isTypedObject} from './asserters'\n\nexport function parseBlocks({\n context,\n blocks,\n options,\n}: {\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n blocks: unknown\n options: {\n refreshKeys: boolean\n }\n}): Array<PortableTextBlock> {\n if (!Array.isArray(blocks)) {\n return []\n }\n\n return blocks.flatMap((block) => {\n const parsedBlock = parseBlock({context, block, options})\n\n return parsedBlock ? [parsedBlock] : []\n })\n}\n\nexport function parseBlock({\n context,\n block,\n options,\n}: {\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n block: unknown\n options: {\n refreshKeys: boolean\n }\n}): PortableTextBlock | undefined {\n return (\n parseTextBlock({block, context, options}) ??\n parseBlockObject({blockObject: block, context, options})\n )\n}\n\nfunction parseBlockObject({\n blockObject,\n context,\n options,\n}: {\n blockObject: unknown\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n options: {refreshKeys: boolean}\n}): PortableTextObject | undefined {\n if (!isTypedObject(blockObject)) {\n return undefined\n }\n\n const schemaType = context.schema.blockObjects.find(\n ({name}) => name === blockObject._type,\n )\n\n if (!schemaType) {\n return undefined\n }\n\n return parseObject({\n object: blockObject,\n context: {\n keyGenerator: context.keyGenerator,\n schemaType,\n },\n options,\n })\n}\n\nexport function isTextBlock(\n schema: EditorSchema,\n block: unknown,\n): block is PortableTextTextBlock {\n return (\n parseTextBlock({\n block,\n context: {schema, keyGenerator: () => ''},\n options: {refreshKeys: false},\n }) !== undefined\n )\n}\n\nfunction parseTextBlock({\n block,\n context,\n options,\n}: {\n block: unknown\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n options: {refreshKeys: boolean}\n}): PortableTextTextBlock | undefined {\n if (!isTypedObject(block)) {\n return undefined\n }\n\n if (block._type !== context.schema.block.name) {\n return undefined\n }\n\n const _key = options.refreshKeys\n ? context.keyGenerator()\n : typeof block._key === 'string'\n ? block._key\n : context.keyGenerator()\n\n const unparsedMarkDefs: Array<unknown> = Array.isArray(block.markDefs)\n ? block.markDefs\n : []\n const markDefKeyMap = new Map<string, string>()\n const markDefs = unparsedMarkDefs.flatMap((markDef) => {\n if (!isTypedObject(markDef)) {\n return []\n }\n\n const schemaType = context.schema.annotations.find(\n ({name}) => name === markDef._type,\n )\n\n if (!schemaType) {\n return []\n }\n\n if (typeof markDef._key !== 'string') {\n // If the `markDef` doesn't have a `_key` then we don't know what spans\n // it belongs to and therefore we have to discard it.\n return []\n }\n\n const parsedAnnotation = parseObject({\n object: markDef,\n context: {\n schemaType,\n keyGenerator: context.keyGenerator,\n },\n options,\n })\n\n if (!parsedAnnotation) {\n return []\n }\n\n markDefKeyMap.set(markDef._key, parsedAnnotation._key)\n\n return [parsedAnnotation]\n })\n\n const unparsedChildren: Array<unknown> = Array.isArray(block.children)\n ? block.children\n : []\n\n const children = unparsedChildren\n .map(\n (child) =>\n parseSpan({span: child, context, markDefKeyMap, options}) ??\n parseInlineObject({inlineObject: child, context, options}),\n )\n .filter((child) => child !== undefined)\n\n const parsedBlock: PortableTextTextBlock = {\n // Spread the entire block to allow custom properties on it\n ...block,\n _key,\n children:\n children.length > 0\n ? children\n : [\n {\n _key: context.keyGenerator(),\n _type: context.schema.span.name,\n text: '',\n marks: [],\n },\n ],\n markDefs,\n }\n\n /**\n * Reset text block .style if it's somehow set to an invalid type\n */\n if (\n typeof parsedBlock.style !== 'string' ||\n !context.schema.styles.find((style) => style.name === block.style)\n ) {\n const defaultStyle = context.schema.styles.at(0)?.name\n\n if (defaultStyle !== undefined) {\n parsedBlock.style = defaultStyle\n } else {\n delete parsedBlock.style\n }\n }\n\n /**\n * Reset text block .listItem if it's somehow set to an invalid type\n */\n if (\n typeof parsedBlock.listItem !== 'string' ||\n !context.schema.lists.find((list) => list.name === block.listItem)\n ) {\n delete parsedBlock.listItem\n }\n\n /**\n * Reset text block .level if it's somehow set to an invalid type\n */\n if (typeof parsedBlock.level !== 'number') {\n delete parsedBlock.level\n }\n\n return parsedBlock\n}\n\nexport function isSpan(\n schema: EditorSchema,\n child: PortableTextSpan | PortableTextObject,\n): child is PortableTextSpan {\n return (\n parseSpan({\n span: child,\n markDefKeyMap: new Map(),\n context: {schema, keyGenerator: () => ''},\n options: {refreshKeys: false},\n }) !== undefined\n )\n}\n\nexport function parseSpan({\n span,\n context,\n markDefKeyMap,\n options,\n}: {\n span: unknown\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n markDefKeyMap: Map<string, string>\n options: {refreshKeys: boolean}\n}): PortableTextSpan | undefined {\n if (!isTypedObject(span)) {\n return undefined\n }\n\n // In reality, the span schema name is always 'span', but we only the check here anyway\n if (span._type !== context.schema.span.name || span._type !== 'span') {\n return undefined\n }\n\n const unparsedMarks: Array<unknown> = Array.isArray(span.marks)\n ? span.marks\n : []\n const marks = unparsedMarks.flatMap((mark) => {\n if (typeof mark !== 'string') {\n return []\n }\n\n const markDefKey = markDefKeyMap.get(mark)\n\n if (markDefKey !== undefined) {\n return [markDefKey]\n }\n\n if (\n context.schema.decorators.some((decorator) => decorator.name === mark)\n ) {\n return [mark]\n }\n\n return []\n })\n\n return {\n // Spread the entire span to allow custom properties on it\n ...span,\n _type: 'span',\n _key: options.refreshKeys\n ? context.keyGenerator()\n : typeof span._key === 'string'\n ? span._key\n : context.keyGenerator(),\n text: typeof span.text === 'string' ? span.text : '',\n marks,\n }\n}\n\nexport function parseInlineObject({\n inlineObject,\n context,\n options,\n}: {\n inlineObject: unknown\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n options: {refreshKeys: boolean}\n}): PortableTextObject | undefined {\n if (!isTypedObject(inlineObject)) {\n return undefined\n }\n\n const schemaType = context.schema.inlineObjects.find(\n ({name}) => name === inlineObject._type,\n )\n\n if (!schemaType) {\n return undefined\n }\n\n return parseObject({\n object: inlineObject,\n context: {\n keyGenerator: context.keyGenerator,\n schemaType,\n },\n options,\n })\n}\n\nexport function parseAnnotation({\n annotation,\n context,\n options,\n}: {\n annotation: TypedObject\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n options: {refreshKeys: boolean}\n}): PortableTextObject | undefined {\n if (!isTypedObject(annotation)) {\n return undefined\n }\n\n const schemaType = context.schema.annotations.find(\n ({name}) => name === annotation._type,\n )\n\n if (!schemaType) {\n return undefined\n }\n\n return parseObject({\n object: annotation,\n context: {\n keyGenerator: context.keyGenerator,\n schemaType,\n },\n options,\n })\n}\n\nfunction parseObject({\n object,\n context,\n options,\n}: {\n object: TypedObject\n context: Pick<EditorContext, 'keyGenerator'> & {\n schemaType: EditorSchema['blockObjects'][0]\n }\n options: {refreshKeys: boolean}\n}): PortableTextObject {\n // Validates all props on the object and only takes those that match\n // the name of a field\n const values = context.schemaType.fields.reduce<Record<string, unknown>>(\n (fieldValues, field) => {\n const fieldValue = object[field.name]\n\n if (fieldValue !== undefined) {\n fieldValues[field.name] = fieldValue\n }\n\n return fieldValues\n },\n {},\n )\n\n return {\n _type: context.schemaType.name,\n _key: options.refreshKeys\n ? context.keyGenerator()\n : typeof object._key === 'string'\n ? object._key\n : context.keyGenerator(),\n ...values,\n }\n}\n"],"names":["isTypedObject","object","isRecord","_type","value","parseBlocks","context","blocks","options","Array","isArray","flatMap","block","parsedBlock","parseBlock","parseTextBlock","parseBlockObject","blockObject","schemaType","schema","blockObjects","find","name","parseObject","keyGenerator","isTextBlock","refreshKeys","undefined","_key","unparsedMarkDefs","markDefs","markDefKeyMap","Map","markDef","annotations","parsedAnnotation","set","children","map","child","parseSpan","span","parseInlineObject","inlineObject","filter","length","text","marks","style","styles","defaultStyle","at","listItem","lists","list","level","mark","markDefKey","get","decorators","some","decorator","inlineObjects","parseAnnotation","annotation","values","fields","reduce","fieldValues","field","fieldValue"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"selector.is-overlapping-selection.js","sources":["../../src/selectors/selector.is-selection-collapsed.ts","../../src/behavior-actions/behavior.guards.ts","../../src/selectors/selectors.ts","../../src/selectors/selector.get-selection-end-point.ts","../../src/selectors/selector.get-selection-start-point.ts","../../src/selectors/selector.get-next-inline-object.ts","../../src/selectors/selector.get-previous-inline-object.ts","../../src/selectors/selector.get-selected-slice.ts","../../src/selectors/selector.get-selection-text.ts","../../src/selectors/selector.is-selection-expanded.ts","../../src/selectors/selector.get-caret-word-selection.ts","../../src/selectors/selector.is-at-the-end-of-block.ts","../../src/selectors/selector.is-at-the-start-of-block.ts","../../src/selectors/selector.is-point-after-selection.ts","../../src/selectors/selector.is-point-before-selection.ts","../../src/selectors/selector.is-overlapping-selection.ts"],"sourcesContent":["import type {EditorSelector} from '../editor/editor-selector'\n\n/**\n * @public\n */\nexport const isSelectionCollapsed: EditorSelector<boolean> = (snapshot) => {\n if (!snapshot.context.selection) {\n return false\n }\n\n return (\n JSON.stringify(snapshot.context.selection.anchor.path) ===\n JSON.stringify(snapshot.context.selection.focus.path) &&\n snapshot.context.selection?.anchor.offset ===\n snapshot.context.selection?.focus.offset\n )\n}\n","import {\n isPortableTextListBlock,\n isPortableTextTextBlock,\n type PortableTextListBlock,\n type PortableTextTextBlock,\n} from '@sanity/types'\nimport type {EditorSchema} from '../editor/define-schema'\n\n/**\n * @alpha\n */\nexport type BehaviorGuards = ReturnType<typeof createGuards>\n\nexport function createGuards({schema}: {schema: EditorSchema}) {\n function isListBlock(block: unknown): block is PortableTextListBlock {\n return isPortableTextListBlock(block) && block._type === schema.block.name\n }\n\n function isTextBlock(block: unknown): block is PortableTextTextBlock {\n return isPortableTextTextBlock(block) && block._type === schema.block.name\n }\n\n return {isListBlock, isTextBlock}\n}\n","import {\n isKeySegment,\n isPortableTextSpan,\n isPortableTextTextBlock,\n type KeyedSegment,\n type PortableTextBlock,\n type PortableTextListBlock,\n type PortableTextObject,\n type PortableTextSpan,\n type PortableTextTextBlock,\n} from '@sanity/types'\nimport {createGuards} from '../behavior-actions/behavior.guards'\nimport type {EditorSelector} from '../editor/editor-selector'\n\n/**\n * @public\n */\nexport const getFocusBlock: EditorSelector<\n {node: PortableTextBlock; path: [KeyedSegment]} | undefined\n> = (snapshot) => {\n const key = snapshot.context.selection\n ? isKeySegment(snapshot.context.selection.focus.path[0])\n ? snapshot.context.selection.focus.path[0]._key\n : undefined\n : undefined\n\n const node = key\n ? snapshot.context.value.find((block) => block._key === key)\n : undefined\n\n return node && key ? {node, path: [{_key: key}]} : undefined\n}\n\n/**\n * @public\n */\nexport const getFocusListBlock: EditorSelector<\n {node: PortableTextListBlock; path: [KeyedSegment]} | undefined\n> = (snapshot) => {\n const guards = createGuards(snapshot.context)\n const focusBlock = getFocusBlock(snapshot)\n\n return focusBlock && guards.isListBlock(focusBlock.node)\n ? {node: focusBlock.node, path: focusBlock.path}\n : undefined\n}\n\n/**\n * @public\n */\nexport const getFocusTextBlock: EditorSelector<\n {node: PortableTextTextBlock; path: [KeyedSegment]} | undefined\n> = (snapshot) => {\n const focusBlock = getFocusBlock(snapshot)\n\n return focusBlock && isPortableTextTextBlock(focusBlock.node)\n ? {node: focusBlock.node, path: focusBlock.path}\n : undefined\n}\n\n/**\n * @public\n */\nexport const getFocusBlockObject: EditorSelector<\n {node: PortableTextObject; path: [KeyedSegment]} | undefined\n> = (snapshot) => {\n const focusBlock = getFocusBlock(snapshot)\n\n return focusBlock && !isPortableTextTextBlock(focusBlock.node)\n ? {node: focusBlock.node, path: focusBlock.path}\n : undefined\n}\n\n/**\n * @public\n */\nexport const getFocusChild: EditorSelector<\n | {\n node: PortableTextObject | PortableTextSpan\n path: [KeyedSegment, 'children', KeyedSegment]\n }\n | undefined\n> = (snapshot) => {\n const focusBlock = getFocusTextBlock(snapshot)\n\n if (!focusBlock) {\n return undefined\n }\n\n const key = snapshot.context.selection\n ? isKeySegment(snapshot.context.selection.focus.path[2])\n ? snapshot.context.selection.focus.path[2]._key\n : undefined\n : undefined\n\n const node = key\n ? focusBlock.node.children.find((span) => span._key === key)\n : undefined\n\n return node && key\n ? {node, path: [...focusBlock.path, 'children', {_key: key}]}\n : undefined\n}\n\n/**\n * @public\n */\nexport const getFocusSpan: EditorSelector<\n | {node: PortableTextSpan; path: [KeyedSegment, 'children', KeyedSegment]}\n | undefined\n> = (snapshot) => {\n const focusChild = getFocusChild(snapshot)\n\n return focusChild && isPortableTextSpan(focusChild.node)\n ? {node: focusChild.node, path: focusChild.path}\n : undefined\n}\n\n/**\n * @public\n */\nexport const getFirstBlock: EditorSelector<\n {node: PortableTextBlock; path: [KeyedSegment]} | undefined\n> = (snapshot) => {\n const node = snapshot.context.value[0]\n\n return node ? {node, path: [{_key: node._key}]} : undefined\n}\n\n/**\n * @public\n */\nexport const getLastBlock: EditorSelector<\n {node: PortableTextBlock; path: [KeyedSegment]} | undefined\n> = (snapshot) => {\n const node = snapshot.context.value[snapshot.context.value.length - 1]\n ? snapshot.context.value[snapshot.context.value.length - 1]\n : undefined\n\n return node ? {node, path: [{_key: node._key}]} : undefined\n}\n\n/**\n * @public\n */\nexport const getSelectedBlocks: EditorSelector<\n Array<{node: PortableTextBlock; path: [KeyedSegment]}>\n> = (snapshot) => {\n if (!snapshot.context.selection) {\n return []\n }\n\n const selectedBlocks: Array<{node: PortableTextBlock; path: [KeyedSegment]}> =\n []\n const startKey = snapshot.context.selection.backward\n ? isKeySegment(snapshot.context.selection.focus.path[0])\n ? snapshot.context.selection.focus.path[0]._key\n : undefined\n : isKeySegment(snapshot.context.selection.anchor.path[0])\n ? snapshot.context.selection.anchor.path[0]._key\n : undefined\n const endKey = snapshot.context.selection.backward\n ? isKeySegment(snapshot.context.selection.anchor.path[0])\n ? snapshot.context.selection.anchor.path[0]._key\n : undefined\n : isKeySegment(snapshot.context.selection.focus.path[0])\n ? snapshot.context.selection.focus.path[0]._key\n : undefined\n\n if (!startKey || !endKey) {\n return selectedBlocks\n }\n\n for (const block of snapshot.context.value) {\n if (block._key === startKey) {\n selectedBlocks.push({node: block, path: [{_key: block._key}]})\n\n if (startKey === endKey) {\n break\n }\n continue\n }\n\n if (block._key === endKey) {\n selectedBlocks.push({node: block, path: [{_key: block._key}]})\n break\n }\n\n if (selectedBlocks.length > 0) {\n selectedBlocks.push({node: block, path: [{_key: block._key}]})\n }\n }\n\n return selectedBlocks\n}\n\n/**\n * @public\n */\nexport const getSelectionStartBlock: EditorSelector<\n | {\n node: PortableTextBlock\n path: [KeyedSegment]\n }\n | undefined\n> = (snapshot) => {\n if (!snapshot.context.selection) {\n return undefined\n }\n\n const key = snapshot.context.selection.backward\n ? isKeySegment(snapshot.context.selection.focus.path[0])\n ? snapshot.context.selection.focus.path[0]._key\n : undefined\n : isKeySegment(snapshot.context.selection.anchor.path[0])\n ? snapshot.context.selection.anchor.path[0]._key\n : undefined\n\n const node = key\n ? snapshot.context.value.find((block) => block._key === key)\n : undefined\n\n return node && key ? {node, path: [{_key: key}]} : undefined\n}\n\n/**\n * @public\n */\nexport const getSelectionEndBlock: EditorSelector<\n | {\n node: PortableTextBlock\n path: [KeyedSegment]\n }\n | undefined\n> = (snapshot) => {\n if (!snapshot.context.selection) {\n return undefined\n }\n\n const key = snapshot.context.selection.backward\n ? isKeySegment(snapshot.context.selection.anchor.path[0])\n ? snapshot.context.selection.anchor.path[0]._key\n : undefined\n : isKeySegment(snapshot.context.selection.focus.path[0])\n ? snapshot.context.selection.focus.path[0]._key\n : undefined\n\n const node = key\n ? snapshot.context.value.find((block) => block._key === key)\n : undefined\n\n return node && key ? {node, path: [{_key: key}]} : undefined\n}\n\n/**\n * @public\n */\nexport const getPreviousBlock: EditorSelector<\n {node: PortableTextBlock; path: [KeyedSegment]} | undefined\n> = (snapshot) => {\n let previousBlock: {node: PortableTextBlock; path: [KeyedSegment]} | undefined\n const selectionStartBlock = getSelectionStartBlock(snapshot)\n\n if (!selectionStartBlock) {\n return undefined\n }\n\n let foundSelectionStartBlock = false\n\n for (const block of snapshot.context.value) {\n if (block._key === selectionStartBlock.node._key) {\n foundSelectionStartBlock = true\n break\n }\n\n previousBlock = {node: block, path: [{_key: block._key}]}\n }\n\n if (foundSelectionStartBlock && previousBlock) {\n return previousBlock\n }\n\n return undefined\n}\n\n/**\n * @public\n */\nexport const getNextBlock: EditorSelector<\n {node: PortableTextBlock; path: [KeyedSegment]} | undefined\n> = (snapshot) => {\n let nextBlock: {node: PortableTextBlock; path: [KeyedSegment]} | undefined\n const selectionEndBlock = getSelectionEndBlock(snapshot)\n\n if (!selectionEndBlock) {\n return undefined\n }\n\n let foundSelectionEndBlock = false\n\n for (const block of snapshot.context.value) {\n if (block._key === selectionEndBlock.node._key) {\n foundSelectionEndBlock = true\n continue\n }\n\n if (foundSelectionEndBlock) {\n nextBlock = {node: block, path: [{_key: block._key}]}\n break\n }\n }\n\n if (foundSelectionEndBlock && nextBlock) {\n return nextBlock\n }\n\n return undefined\n}\n","import type {EditorSelectionPoint} from '..'\nimport type {EditorSelector} from '../editor/editor-selector'\n\n/**\n * @public\n */\nexport const getSelectionEndPoint: EditorSelector<\n EditorSelectionPoint | undefined\n> = (snapshot) => {\n if (!snapshot.context.selection) {\n return undefined\n }\n\n return snapshot.context.selection.backward\n ? snapshot.context.selection.anchor\n : snapshot.context.selection.focus\n}\n","import type {EditorSelectionPoint} from '..'\nimport type {EditorSelector} from '../editor/editor-selector'\n\n/**\n * @public\n */\nexport const getSelectionStartPoint: EditorSelector<\n EditorSelectionPoint | undefined\n> = (snapshot) => {\n if (!snapshot.context.selection) {\n return undefined\n }\n\n return snapshot.context.selection.backward\n ? snapshot.context.selection.focus\n : snapshot.context.selection.anchor\n}\n","import {\n isKeySegment,\n type KeyedSegment,\n type PortableTextObject,\n} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport {isSpan} from '../utils'\nimport {getSelectionEndPoint} from './selector.get-selection-end-point'\nimport {getFocusTextBlock} from './selectors'\n\n/**\n * @public\n */\nexport const getNextInlineObject: EditorSelector<\n | {\n node: PortableTextObject\n path: [KeyedSegment, 'children', KeyedSegment]\n }\n | undefined\n> = (snapshot) => {\n const focusTextBlock = getFocusTextBlock(snapshot)\n const selectionEndPoint = getSelectionEndPoint(snapshot)\n const selectionEndPointChildKey =\n selectionEndPoint && isKeySegment(selectionEndPoint.path[2])\n ? selectionEndPoint.path[2]._key\n : undefined\n\n if (!focusTextBlock || !selectionEndPointChildKey) {\n return undefined\n }\n\n let endPointChildFound = false\n let inlineObject:\n | {\n node: PortableTextObject\n path: [KeyedSegment, 'children', KeyedSegment]\n }\n | undefined\n\n for (const child of focusTextBlock.node.children) {\n if (child._key === selectionEndPointChildKey) {\n endPointChildFound = true\n continue\n }\n\n if (!isSpan(snapshot.context, child) && endPointChildFound) {\n inlineObject = {\n node: child,\n path: [...focusTextBlock.path, 'children', {_key: child._key}],\n }\n break\n }\n }\n\n return inlineObject\n}\n","import {\n isKeySegment,\n type KeyedSegment,\n type PortableTextObject,\n} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport {isSpan} from '../utils'\nimport {getSelectionStartPoint} from './selector.get-selection-start-point'\nimport {getFocusTextBlock} from './selectors'\n\n/**\n * @public\n */\nexport const getPreviousInlineObject: EditorSelector<\n | {\n node: PortableTextObject\n path: [KeyedSegment, 'children', KeyedSegment]\n }\n | undefined\n> = (snapshot) => {\n const focusTextBlock = getFocusTextBlock(snapshot)\n const selectionStartPoint = getSelectionStartPoint(snapshot)\n const selectionStartPointChildKey =\n selectionStartPoint && isKeySegment(selectionStartPoint.path[2])\n ? selectionStartPoint.path[2]._key\n : undefined\n\n if (!focusTextBlock || !selectionStartPointChildKey) {\n return undefined\n }\n\n let inlineObject:\n | {\n node: PortableTextObject\n path: [KeyedSegment, 'children', KeyedSegment]\n }\n | undefined\n\n for (const child of focusTextBlock.node.children) {\n if (child._key === selectionStartPointChildKey) {\n break\n }\n\n if (!isSpan(snapshot.context, child)) {\n inlineObject = {\n node: child,\n path: [...focusTextBlock.path, 'children', {_key: child._key}],\n }\n }\n }\n\n return inlineObject\n}\n","import type {PortableTextBlock} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport {sliceBlocks} from '../utils'\n\n/**\n * @public\n */\nexport const getSelectedSlice: EditorSelector<Array<PortableTextBlock>> = (\n snapshot,\n) => {\n return sliceBlocks({\n blocks: snapshot.context.value,\n selection: snapshot.context.selection,\n })\n}\n","import {isPortableTextSpan, isPortableTextTextBlock} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport {getSelectedSlice} from './selector.get-selected-slice'\n\n/**\n * @public\n */\nexport const getSelectionText: EditorSelector<string> = (snapshot) => {\n const selectedSlice = getSelectedSlice(snapshot)\n\n return selectedSlice.reduce((text, block) => {\n if (!isPortableTextTextBlock(block)) {\n return text\n }\n\n return (\n text +\n block.children.reduce((text, child) => {\n if (isPortableTextSpan(child)) {\n return text + child.text\n }\n\n return text\n }, '')\n )\n }, '')\n}\n","import type {EditorSelector} from '../editor/editor-selector'\nimport {isSelectionCollapsed} from './selector.is-selection-collapsed'\n\n/**\n * @public\n */\nexport const isSelectionExpanded: EditorSelector<boolean> = (snapshot) => {\n return !isSelectionCollapsed(snapshot)\n}\n","import type {EditorSelector} from '../editor/editor-selector'\nimport type {BlockOffset} from '../types/block-offset'\nimport type {EditorSelection} from '../types/editor'\nimport {\n blockOffsetToSpanSelectionPoint,\n getBlockEndPoint,\n getBlockStartPoint,\n spanSelectionPointToBlockOffset,\n} from '../utils'\nimport {getNextInlineObject} from './selector.get-next-inline-object'\nimport {getPreviousInlineObject} from './selector.get-previous-inline-object'\nimport {getSelectionStartPoint} from './selector.get-selection-start-point'\nimport {getSelectionText} from './selector.get-selection-text'\nimport {isSelectionCollapsed} from './selector.is-selection-collapsed'\nimport {isSelectionExpanded} from './selector.is-selection-expanded'\nimport {getFocusTextBlock} from './selectors'\n\n/**\n * @public\n * Returns the selection of the of the word the caret is placed in.\n * Note: Only returns a word selection if the current selection is collapsed\n */\nexport const getCaretWordSelection: EditorSelector<EditorSelection> = (\n snapshot,\n) => {\n if (!snapshot.context.selection) {\n return null\n }\n\n if (!isSelectionCollapsed(snapshot)) {\n return null\n }\n\n const focusTextBlock = getFocusTextBlock(snapshot)\n const selectionStartPoint = getSelectionStartPoint(snapshot)\n const selectionStartOffset = selectionStartPoint\n ? spanSelectionPointToBlockOffset({\n value: snapshot.context.value,\n selectionPoint: selectionStartPoint,\n })\n : undefined\n\n if (!focusTextBlock || !selectionStartPoint || !selectionStartOffset) {\n return null\n }\n\n const previousInlineObject = getPreviousInlineObject(snapshot)\n const blockStartPoint = getBlockStartPoint(focusTextBlock)\n const textBefore = getSelectionText({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection: {\n anchor: previousInlineObject\n ? {path: previousInlineObject.path, offset: 0}\n : blockStartPoint,\n focus: selectionStartPoint,\n },\n },\n })\n const textDirectlyBefore = textBefore.split(/\\s+/).at(-1)\n\n const nextInlineObject = getNextInlineObject(snapshot)\n const blockEndPoint = getBlockEndPoint(focusTextBlock)\n const textAfter = getSelectionText({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection: {\n anchor: selectionStartPoint,\n focus: nextInlineObject\n ? {path: nextInlineObject.path, offset: 0}\n : blockEndPoint,\n },\n },\n })\n const textDirectlyAfter = textAfter.split(/\\s+/).at(0)\n\n if (\n (textDirectlyBefore === undefined || textDirectlyBefore === '') &&\n (textDirectlyAfter === undefined || textDirectlyAfter === '')\n ) {\n return null\n }\n\n const caretWordStartOffset: BlockOffset = textDirectlyBefore\n ? {\n ...selectionStartOffset,\n offset: selectionStartOffset.offset - textDirectlyBefore.length,\n }\n : selectionStartOffset\n const caretWordEndOffset: BlockOffset = textDirectlyAfter\n ? {\n ...selectionStartOffset,\n offset: selectionStartOffset.offset + textDirectlyAfter.length,\n }\n : selectionStartOffset\n\n const caretWordStartSelectionPoint = blockOffsetToSpanSelectionPoint({\n value: snapshot.context.value,\n blockOffset: caretWordStartOffset,\n direction: 'backward',\n })\n const caretWordEndSelectionPoint = blockOffsetToSpanSelectionPoint({\n value: snapshot.context.value,\n blockOffset: caretWordEndOffset,\n direction: 'forward',\n })\n\n if (!caretWordStartSelectionPoint || !caretWordEndSelectionPoint) {\n return null\n }\n\n const caretWordSelection = {\n anchor: caretWordStartSelectionPoint,\n focus: caretWordEndSelectionPoint,\n }\n\n return isSelectionExpanded({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection: caretWordSelection,\n },\n })\n ? caretWordSelection\n : null\n}\n","import type {KeyedSegment, PortableTextBlock} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport * as utils from '../utils'\nimport {isSelectionCollapsed} from './selector.is-selection-collapsed'\n\n/**\n * @public\n */\nexport function isAtTheEndOfBlock(block: {\n node: PortableTextBlock\n path: [KeyedSegment]\n}): EditorSelector<boolean> {\n return (snapshot) => {\n if (!snapshot.context.selection || !isSelectionCollapsed(snapshot)) {\n return false\n }\n\n const blockEndPoint = utils.getBlockEndPoint(block)\n\n return utils.isEqualSelectionPoints(\n snapshot.context.selection.focus,\n blockEndPoint,\n )\n }\n}\n","import type {KeyedSegment, PortableTextBlock} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport * as utils from '../utils'\nimport {isSelectionCollapsed} from './selector.is-selection-collapsed'\n\n/**\n * @public\n */\nexport function isAtTheStartOfBlock(block: {\n node: PortableTextBlock\n path: [KeyedSegment]\n}): EditorSelector<boolean> {\n return (snapshot) => {\n if (!snapshot.context.selection || !isSelectionCollapsed(snapshot)) {\n return false\n }\n\n const blockStartPoint = utils.getBlockStartPoint(block)\n\n return utils.isEqualSelectionPoints(\n snapshot.context.selection.focus,\n blockStartPoint,\n )\n }\n}\n","import {isKeySegment, isPortableTextTextBlock} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport type {EditorSelectionPoint} from '../types/editor'\nimport {reverseSelection} from '../utils/util.reverse-selection'\n\n/**\n * @public\n */\nexport function isPointAfterSelection(\n point: EditorSelectionPoint,\n): EditorSelector<boolean> {\n return (snapshot) => {\n if (!snapshot.context.selection) {\n return false\n }\n\n const selection = snapshot.context.selection.backward\n ? reverseSelection(snapshot.context.selection)\n : snapshot.context.selection\n\n const pointBlockKey = isKeySegment(point.path[0])\n ? point.path[0]._key\n : undefined\n const pointChildKey = isKeySegment(point.path[2])\n ? point.path[2]._key\n : undefined\n\n const endBlockKey = isKeySegment(selection.focus.path[0])\n ? selection.focus.path[0]._key\n : undefined\n const endChildKey = isKeySegment(selection.focus.path[2])\n ? selection.focus.path[2]._key\n : undefined\n\n if (!pointBlockKey || !endBlockKey) {\n return false\n }\n\n let after = false\n\n for (const block of snapshot.context.value) {\n if (block._key === endBlockKey) {\n if (block._key !== pointBlockKey) {\n after = true\n break\n }\n\n // Both the point and the selection end in this block\n\n if (!isPortableTextTextBlock(block)) {\n break\n }\n\n if (!pointChildKey || !endChildKey) {\n break\n }\n\n for (const child of block.children) {\n if (child._key === endChildKey) {\n if (child._key !== pointChildKey) {\n after = true\n break\n }\n\n // Both the point and the selection end in this child\n\n after = point.offset > selection.focus.offset\n break\n }\n\n if (child._key === pointChildKey) {\n break\n }\n }\n }\n\n if (block._key === pointBlockKey) {\n break\n }\n }\n\n return after\n }\n}\n","import {isKeySegment, isPortableTextTextBlock} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport type {EditorSelectionPoint} from '../types/editor'\nimport {reverseSelection} from '../utils/util.reverse-selection'\n\n/**\n * @public\n */\nexport function isPointBeforeSelection(\n point: EditorSelectionPoint,\n): EditorSelector<boolean> {\n return (snapshot) => {\n if (!snapshot.context.selection) {\n return false\n }\n\n const selection = snapshot.context.selection.backward\n ? reverseSelection(snapshot.context.selection)\n : snapshot.context.selection\n\n const pointBlockKey = isKeySegment(point.path[0])\n ? point.path[0]._key\n : undefined\n const pointChildKey = isKeySegment(point.path[2])\n ? point.path[2]._key\n : undefined\n\n const startBlockKey = isKeySegment(selection.anchor.path[0])\n ? selection.anchor.path[0]._key\n : undefined\n const startChildKey = isKeySegment(selection.anchor.path[2])\n ? selection.anchor.path[2]._key\n : undefined\n\n if (!pointBlockKey || !startBlockKey) {\n return false\n }\n\n let before = false\n\n for (const block of snapshot.context.value) {\n if (block._key === pointBlockKey) {\n if (block._key !== startBlockKey) {\n before = true\n break\n }\n\n // Both the point and the selection start in this block\n\n if (!isPortableTextTextBlock(block)) {\n break\n }\n\n if (!pointChildKey || !startChildKey) {\n break\n }\n\n for (const child of block.children) {\n if (child._key === pointChildKey) {\n if (child._key !== startChildKey) {\n before = true\n break\n }\n\n // Both the point and the selection start in this child\n\n before = point.offset < selection.anchor.offset\n break\n }\n\n if (child._key === startChildKey) {\n break\n }\n }\n }\n\n if (block._key === startBlockKey) {\n break\n }\n }\n\n return before\n }\n}\n","import type {EditorSelection} from '../types/editor'\nimport {isEqualSelectionPoints} from '../utils'\nimport type {EditorSelector} from './../editor/editor-selector'\nimport {getSelectionEndPoint} from './selector.get-selection-end-point'\nimport {getSelectionStartPoint} from './selector.get-selection-start-point'\nimport {isPointAfterSelection} from './selector.is-point-after-selection'\nimport {isPointBeforeSelection} from './selector.is-point-before-selection'\n\n/**\n * @public\n */\nexport function isOverlappingSelection(\n selection: EditorSelection,\n): EditorSelector<boolean> {\n return (snapshot) => {\n if (!selection || !snapshot.context.selection) {\n return false\n }\n\n const selectionStartPoint = getSelectionStartPoint({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection,\n },\n })\n const selectionEndPoint = getSelectionEndPoint({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection,\n },\n })\n\n const originalSelectionStartPoint = getSelectionStartPoint(snapshot)\n const originalSelectionEndPoint = getSelectionEndPoint(snapshot)\n\n if (\n !selectionStartPoint ||\n !selectionEndPoint ||\n !originalSelectionStartPoint ||\n !originalSelectionEndPoint\n ) {\n return false\n }\n\n const startPointBeforeSelection =\n isPointBeforeSelection(selectionStartPoint)(snapshot)\n const startPointAfterSelection =\n isPointAfterSelection(selectionStartPoint)(snapshot)\n const endPointBeforeSelection =\n isPointBeforeSelection(selectionEndPoint)(snapshot)\n const endPointAfterSelection =\n isPointAfterSelection(selectionEndPoint)(snapshot)\n\n const originalStartPointBeforeStartPoint = isPointBeforeSelection(\n originalSelectionStartPoint,\n )({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection: {\n anchor: selectionStartPoint,\n focus: selectionStartPoint,\n },\n },\n })\n const originalStartPointAfterStartPoint = isPointAfterSelection(\n originalSelectionStartPoint,\n )({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection: {\n anchor: selectionStartPoint,\n focus: selectionStartPoint,\n },\n },\n })\n\n const originalEndPointBeforeEndPoint = isPointBeforeSelection(\n originalSelectionEndPoint,\n )({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection: {\n anchor: selectionEndPoint,\n focus: selectionEndPoint,\n },\n },\n })\n const originalEndPointAfterEndPoint = isPointAfterSelection(\n originalSelectionEndPoint,\n )({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection: {\n anchor: selectionEndPoint,\n focus: selectionEndPoint,\n },\n },\n })\n\n const endPointEqualToOriginalStartPoint = isEqualSelectionPoints(\n selectionEndPoint,\n originalSelectionStartPoint,\n )\n const startPointEqualToOriginalEndPoint = isEqualSelectionPoints(\n selectionStartPoint,\n originalSelectionEndPoint,\n )\n\n if (endPointBeforeSelection && !endPointEqualToOriginalStartPoint) {\n return false\n }\n\n if (startPointAfterSelection && !startPointEqualToOriginalEndPoint) {\n return false\n }\n\n if (\n !originalStartPointBeforeStartPoint &&\n originalStartPointAfterStartPoint &&\n !originalEndPointBeforeEndPoint &&\n originalEndPointAfterEndPoint\n ) {\n return !endPointEqualToOriginalStartPoint\n }\n\n if (\n originalStartPointBeforeStartPoint &&\n !originalStartPointAfterStartPoint &&\n originalEndPointBeforeEndPoint &&\n !originalEndPointAfterEndPoint\n ) {\n return !startPointEqualToOriginalEndPoint\n }\n\n if (\n !startPointAfterSelection ||\n !startPointBeforeSelection ||\n !endPointAfterSelection ||\n !endPointBeforeSelection\n ) {\n return true\n }\n\n return false\n }\n}\n"],"names":["isSelectionCollapsed","snapshot","context","selection","JSON","stringify","anchor","path","focus","offset","createGuards","schema","isListBlock","block","isPortableTextListBlock","_type","name","isTextBlock","isPortableTextTextBlock","getFocusBlock","key","isKeySegment","_key","undefined","node","value","find","getFocusListBlock","guards","focusBlock","getFocusTextBlock","getFocusBlockObject","getFocusChild","children","span","getFocusSpan","focusChild","isPortableTextSpan","getFirstBlock","getLastBlock","length","getSelectedBlocks","selectedBlocks","startKey","backward","endKey","push","getSelectionStartBlock","getSelectionEndBlock","getPreviousBlock","previousBlock","selectionStartBlock","foundSelectionStartBlock","getNextBlock","nextBlock","selectionEndBlock","foundSelectionEndBlock","getSelectionEndPoint","getSelectionStartPoint","getNextInlineObject","focusTextBlock","selectionEndPoint","selectionEndPointChildKey","endPointChildFound","inlineObject","child","isSpan","getPreviousInlineObject","selectionStartPoint","selectionStartPointChildKey","getSelectedSlice","sliceBlocks","blocks","getSelectionText","reduce","text","isSelectionExpanded","getCaretWordSelection","selectionStartOffset","spanSelectionPointToBlockOffset","selectionPoint","previousInlineObject","blockStartPoint","getBlockStartPoint","textDirectlyBefore","split","at","nextInlineObject","blockEndPoint","getBlockEndPoint","textDirectlyAfter","caretWordStartOffset","caretWordEndOffset","caretWordStartSelectionPoint","blockOffsetToSpanSelectionPoint","blockOffset","direction","caretWordEndSelectionPoint","caretWordSelection","isAtTheEndOfBlock","utils","isAtTheStartOfBlock","isPointAfterSelection","point","reverseSelection","pointBlockKey","pointChildKey","endBlockKey","endChildKey","after","isPointBeforeSelection","startBlockKey","startChildKey","before","isOverlappingSelection","originalSelectionStartPoint","originalSelectionEndPoint","startPointBeforeSelection","startPointAfterSelection","endPointBeforeSelection","endPointAfterSelection","originalStartPointBeforeStartPoint","originalStartPointAfterStartPoint","originalEndPointBeforeEndPoint","originalEndPointAfterEndPoint","endPointEqualToOriginalStartPoint","isEqualSelectionPoints","startPointEqualToOriginalEndPoint"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"selector.is-overlapping-selection.js","sources":["../../src/selectors/selector.is-selection-collapsed.ts","../../src/behavior-actions/behavior.guards.ts","../../src/selectors/selectors.ts","../../src/selectors/selector.get-selection-end-point.ts","../../src/selectors/selector.get-selection-start-point.ts","../../src/selectors/selector.get-next-inline-object.ts","../../src/selectors/selector.get-previous-inline-object.ts","../../src/selectors/selector.get-selected-slice.ts","../../src/selectors/selector.get-selection-text.ts","../../src/selectors/selector.is-selection-expanded.ts","../../src/selectors/selector.get-caret-word-selection.ts","../../src/selectors/selector.is-at-the-end-of-block.ts","../../src/selectors/selector.is-at-the-start-of-block.ts","../../src/selectors/selector.is-point-after-selection.ts","../../src/selectors/selector.is-point-before-selection.ts","../../src/selectors/selector.is-overlapping-selection.ts"],"sourcesContent":["import type {EditorSelector} from '../editor/editor-selector'\n\n/**\n * @public\n */\nexport const isSelectionCollapsed: EditorSelector<boolean> = (snapshot) => {\n if (!snapshot.context.selection) {\n return false\n }\n\n return (\n JSON.stringify(snapshot.context.selection.anchor.path) ===\n JSON.stringify(snapshot.context.selection.focus.path) &&\n snapshot.context.selection?.anchor.offset ===\n snapshot.context.selection?.focus.offset\n )\n}\n","import {\n isPortableTextListBlock,\n isPortableTextTextBlock,\n type PortableTextListBlock,\n type PortableTextTextBlock,\n} from '@sanity/types'\nimport type {EditorSchema} from '../editor/editor-schema'\n\n/**\n * @alpha\n */\nexport type BehaviorGuards = ReturnType<typeof createGuards>\n\nexport function createGuards({schema}: {schema: EditorSchema}) {\n function isListBlock(block: unknown): block is PortableTextListBlock {\n return isPortableTextListBlock(block) && block._type === schema.block.name\n }\n\n function isTextBlock(block: unknown): block is PortableTextTextBlock {\n return isPortableTextTextBlock(block) && block._type === schema.block.name\n }\n\n return {isListBlock, isTextBlock}\n}\n","import {\n isKeySegment,\n isPortableTextSpan,\n isPortableTextTextBlock,\n type KeyedSegment,\n type PortableTextBlock,\n type PortableTextListBlock,\n type PortableTextObject,\n type PortableTextSpan,\n type PortableTextTextBlock,\n} from '@sanity/types'\nimport {createGuards} from '../behavior-actions/behavior.guards'\nimport type {EditorSelector} from '../editor/editor-selector'\n\n/**\n * @public\n */\nexport const getFocusBlock: EditorSelector<\n {node: PortableTextBlock; path: [KeyedSegment]} | undefined\n> = (snapshot) => {\n const key = snapshot.context.selection\n ? isKeySegment(snapshot.context.selection.focus.path[0])\n ? snapshot.context.selection.focus.path[0]._key\n : undefined\n : undefined\n\n const node = key\n ? snapshot.context.value.find((block) => block._key === key)\n : undefined\n\n return node && key ? {node, path: [{_key: key}]} : undefined\n}\n\n/**\n * @public\n */\nexport const getFocusListBlock: EditorSelector<\n {node: PortableTextListBlock; path: [KeyedSegment]} | undefined\n> = (snapshot) => {\n const guards = createGuards(snapshot.context)\n const focusBlock = getFocusBlock(snapshot)\n\n return focusBlock && guards.isListBlock(focusBlock.node)\n ? {node: focusBlock.node, path: focusBlock.path}\n : undefined\n}\n\n/**\n * @public\n */\nexport const getFocusTextBlock: EditorSelector<\n {node: PortableTextTextBlock; path: [KeyedSegment]} | undefined\n> = (snapshot) => {\n const focusBlock = getFocusBlock(snapshot)\n\n return focusBlock && isPortableTextTextBlock(focusBlock.node)\n ? {node: focusBlock.node, path: focusBlock.path}\n : undefined\n}\n\n/**\n * @public\n */\nexport const getFocusBlockObject: EditorSelector<\n {node: PortableTextObject; path: [KeyedSegment]} | undefined\n> = (snapshot) => {\n const focusBlock = getFocusBlock(snapshot)\n\n return focusBlock && !isPortableTextTextBlock(focusBlock.node)\n ? {node: focusBlock.node, path: focusBlock.path}\n : undefined\n}\n\n/**\n * @public\n */\nexport const getFocusChild: EditorSelector<\n | {\n node: PortableTextObject | PortableTextSpan\n path: [KeyedSegment, 'children', KeyedSegment]\n }\n | undefined\n> = (snapshot) => {\n const focusBlock = getFocusTextBlock(snapshot)\n\n if (!focusBlock) {\n return undefined\n }\n\n const key = snapshot.context.selection\n ? isKeySegment(snapshot.context.selection.focus.path[2])\n ? snapshot.context.selection.focus.path[2]._key\n : undefined\n : undefined\n\n const node = key\n ? focusBlock.node.children.find((span) => span._key === key)\n : undefined\n\n return node && key\n ? {node, path: [...focusBlock.path, 'children', {_key: key}]}\n : undefined\n}\n\n/**\n * @public\n */\nexport const getFocusSpan: EditorSelector<\n | {node: PortableTextSpan; path: [KeyedSegment, 'children', KeyedSegment]}\n | undefined\n> = (snapshot) => {\n const focusChild = getFocusChild(snapshot)\n\n return focusChild && isPortableTextSpan(focusChild.node)\n ? {node: focusChild.node, path: focusChild.path}\n : undefined\n}\n\n/**\n * @public\n */\nexport const getFirstBlock: EditorSelector<\n {node: PortableTextBlock; path: [KeyedSegment]} | undefined\n> = (snapshot) => {\n const node = snapshot.context.value[0]\n\n return node ? {node, path: [{_key: node._key}]} : undefined\n}\n\n/**\n * @public\n */\nexport const getLastBlock: EditorSelector<\n {node: PortableTextBlock; path: [KeyedSegment]} | undefined\n> = (snapshot) => {\n const node = snapshot.context.value[snapshot.context.value.length - 1]\n ? snapshot.context.value[snapshot.context.value.length - 1]\n : undefined\n\n return node ? {node, path: [{_key: node._key}]} : undefined\n}\n\n/**\n * @public\n */\nexport const getSelectedBlocks: EditorSelector<\n Array<{node: PortableTextBlock; path: [KeyedSegment]}>\n> = (snapshot) => {\n if (!snapshot.context.selection) {\n return []\n }\n\n const selectedBlocks: Array<{node: PortableTextBlock; path: [KeyedSegment]}> =\n []\n const startKey = snapshot.context.selection.backward\n ? isKeySegment(snapshot.context.selection.focus.path[0])\n ? snapshot.context.selection.focus.path[0]._key\n : undefined\n : isKeySegment(snapshot.context.selection.anchor.path[0])\n ? snapshot.context.selection.anchor.path[0]._key\n : undefined\n const endKey = snapshot.context.selection.backward\n ? isKeySegment(snapshot.context.selection.anchor.path[0])\n ? snapshot.context.selection.anchor.path[0]._key\n : undefined\n : isKeySegment(snapshot.context.selection.focus.path[0])\n ? snapshot.context.selection.focus.path[0]._key\n : undefined\n\n if (!startKey || !endKey) {\n return selectedBlocks\n }\n\n for (const block of snapshot.context.value) {\n if (block._key === startKey) {\n selectedBlocks.push({node: block, path: [{_key: block._key}]})\n\n if (startKey === endKey) {\n break\n }\n continue\n }\n\n if (block._key === endKey) {\n selectedBlocks.push({node: block, path: [{_key: block._key}]})\n break\n }\n\n if (selectedBlocks.length > 0) {\n selectedBlocks.push({node: block, path: [{_key: block._key}]})\n }\n }\n\n return selectedBlocks\n}\n\n/**\n * @public\n */\nexport const getSelectionStartBlock: EditorSelector<\n | {\n node: PortableTextBlock\n path: [KeyedSegment]\n }\n | undefined\n> = (snapshot) => {\n if (!snapshot.context.selection) {\n return undefined\n }\n\n const key = snapshot.context.selection.backward\n ? isKeySegment(snapshot.context.selection.focus.path[0])\n ? snapshot.context.selection.focus.path[0]._key\n : undefined\n : isKeySegment(snapshot.context.selection.anchor.path[0])\n ? snapshot.context.selection.anchor.path[0]._key\n : undefined\n\n const node = key\n ? snapshot.context.value.find((block) => block._key === key)\n : undefined\n\n return node && key ? {node, path: [{_key: key}]} : undefined\n}\n\n/**\n * @public\n */\nexport const getSelectionEndBlock: EditorSelector<\n | {\n node: PortableTextBlock\n path: [KeyedSegment]\n }\n | undefined\n> = (snapshot) => {\n if (!snapshot.context.selection) {\n return undefined\n }\n\n const key = snapshot.context.selection.backward\n ? isKeySegment(snapshot.context.selection.anchor.path[0])\n ? snapshot.context.selection.anchor.path[0]._key\n : undefined\n : isKeySegment(snapshot.context.selection.focus.path[0])\n ? snapshot.context.selection.focus.path[0]._key\n : undefined\n\n const node = key\n ? snapshot.context.value.find((block) => block._key === key)\n : undefined\n\n return node && key ? {node, path: [{_key: key}]} : undefined\n}\n\n/**\n * @public\n */\nexport const getPreviousBlock: EditorSelector<\n {node: PortableTextBlock; path: [KeyedSegment]} | undefined\n> = (snapshot) => {\n let previousBlock: {node: PortableTextBlock; path: [KeyedSegment]} | undefined\n const selectionStartBlock = getSelectionStartBlock(snapshot)\n\n if (!selectionStartBlock) {\n return undefined\n }\n\n let foundSelectionStartBlock = false\n\n for (const block of snapshot.context.value) {\n if (block._key === selectionStartBlock.node._key) {\n foundSelectionStartBlock = true\n break\n }\n\n previousBlock = {node: block, path: [{_key: block._key}]}\n }\n\n if (foundSelectionStartBlock && previousBlock) {\n return previousBlock\n }\n\n return undefined\n}\n\n/**\n * @public\n */\nexport const getNextBlock: EditorSelector<\n {node: PortableTextBlock; path: [KeyedSegment]} | undefined\n> = (snapshot) => {\n let nextBlock: {node: PortableTextBlock; path: [KeyedSegment]} | undefined\n const selectionEndBlock = getSelectionEndBlock(snapshot)\n\n if (!selectionEndBlock) {\n return undefined\n }\n\n let foundSelectionEndBlock = false\n\n for (const block of snapshot.context.value) {\n if (block._key === selectionEndBlock.node._key) {\n foundSelectionEndBlock = true\n continue\n }\n\n if (foundSelectionEndBlock) {\n nextBlock = {node: block, path: [{_key: block._key}]}\n break\n }\n }\n\n if (foundSelectionEndBlock && nextBlock) {\n return nextBlock\n }\n\n return undefined\n}\n","import type {EditorSelectionPoint} from '..'\nimport type {EditorSelector} from '../editor/editor-selector'\n\n/**\n * @public\n */\nexport const getSelectionEndPoint: EditorSelector<\n EditorSelectionPoint | undefined\n> = (snapshot) => {\n if (!snapshot.context.selection) {\n return undefined\n }\n\n return snapshot.context.selection.backward\n ? snapshot.context.selection.anchor\n : snapshot.context.selection.focus\n}\n","import type {EditorSelectionPoint} from '..'\nimport type {EditorSelector} from '../editor/editor-selector'\n\n/**\n * @public\n */\nexport const getSelectionStartPoint: EditorSelector<\n EditorSelectionPoint | undefined\n> = (snapshot) => {\n if (!snapshot.context.selection) {\n return undefined\n }\n\n return snapshot.context.selection.backward\n ? snapshot.context.selection.focus\n : snapshot.context.selection.anchor\n}\n","import {\n isKeySegment,\n type KeyedSegment,\n type PortableTextObject,\n} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport {isSpan} from '../utils'\nimport {getSelectionEndPoint} from './selector.get-selection-end-point'\nimport {getFocusTextBlock} from './selectors'\n\n/**\n * @public\n */\nexport const getNextInlineObject: EditorSelector<\n | {\n node: PortableTextObject\n path: [KeyedSegment, 'children', KeyedSegment]\n }\n | undefined\n> = (snapshot) => {\n const focusTextBlock = getFocusTextBlock(snapshot)\n const selectionEndPoint = getSelectionEndPoint(snapshot)\n const selectionEndPointChildKey =\n selectionEndPoint && isKeySegment(selectionEndPoint.path[2])\n ? selectionEndPoint.path[2]._key\n : undefined\n\n if (!focusTextBlock || !selectionEndPointChildKey) {\n return undefined\n }\n\n let endPointChildFound = false\n let inlineObject:\n | {\n node: PortableTextObject\n path: [KeyedSegment, 'children', KeyedSegment]\n }\n | undefined\n\n for (const child of focusTextBlock.node.children) {\n if (child._key === selectionEndPointChildKey) {\n endPointChildFound = true\n continue\n }\n\n if (!isSpan(snapshot.context, child) && endPointChildFound) {\n inlineObject = {\n node: child,\n path: [...focusTextBlock.path, 'children', {_key: child._key}],\n }\n break\n }\n }\n\n return inlineObject\n}\n","import {\n isKeySegment,\n type KeyedSegment,\n type PortableTextObject,\n} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport {isSpan} from '../utils'\nimport {getSelectionStartPoint} from './selector.get-selection-start-point'\nimport {getFocusTextBlock} from './selectors'\n\n/**\n * @public\n */\nexport const getPreviousInlineObject: EditorSelector<\n | {\n node: PortableTextObject\n path: [KeyedSegment, 'children', KeyedSegment]\n }\n | undefined\n> = (snapshot) => {\n const focusTextBlock = getFocusTextBlock(snapshot)\n const selectionStartPoint = getSelectionStartPoint(snapshot)\n const selectionStartPointChildKey =\n selectionStartPoint && isKeySegment(selectionStartPoint.path[2])\n ? selectionStartPoint.path[2]._key\n : undefined\n\n if (!focusTextBlock || !selectionStartPointChildKey) {\n return undefined\n }\n\n let inlineObject:\n | {\n node: PortableTextObject\n path: [KeyedSegment, 'children', KeyedSegment]\n }\n | undefined\n\n for (const child of focusTextBlock.node.children) {\n if (child._key === selectionStartPointChildKey) {\n break\n }\n\n if (!isSpan(snapshot.context, child)) {\n inlineObject = {\n node: child,\n path: [...focusTextBlock.path, 'children', {_key: child._key}],\n }\n }\n }\n\n return inlineObject\n}\n","import type {PortableTextBlock} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport {sliceBlocks} from '../utils'\n\n/**\n * @public\n */\nexport const getSelectedSlice: EditorSelector<Array<PortableTextBlock>> = (\n snapshot,\n) => {\n return sliceBlocks({\n blocks: snapshot.context.value,\n selection: snapshot.context.selection,\n })\n}\n","import {isPortableTextSpan, isPortableTextTextBlock} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport {getSelectedSlice} from './selector.get-selected-slice'\n\n/**\n * @public\n */\nexport const getSelectionText: EditorSelector<string> = (snapshot) => {\n const selectedSlice = getSelectedSlice(snapshot)\n\n return selectedSlice.reduce((text, block) => {\n if (!isPortableTextTextBlock(block)) {\n return text\n }\n\n return (\n text +\n block.children.reduce((text, child) => {\n if (isPortableTextSpan(child)) {\n return text + child.text\n }\n\n return text\n }, '')\n )\n }, '')\n}\n","import type {EditorSelector} from '../editor/editor-selector'\nimport {isSelectionCollapsed} from './selector.is-selection-collapsed'\n\n/**\n * @public\n */\nexport const isSelectionExpanded: EditorSelector<boolean> = (snapshot) => {\n return !isSelectionCollapsed(snapshot)\n}\n","import type {EditorSelector} from '../editor/editor-selector'\nimport type {BlockOffset} from '../types/block-offset'\nimport type {EditorSelection} from '../types/editor'\nimport {\n blockOffsetToSpanSelectionPoint,\n getBlockEndPoint,\n getBlockStartPoint,\n spanSelectionPointToBlockOffset,\n} from '../utils'\nimport {getNextInlineObject} from './selector.get-next-inline-object'\nimport {getPreviousInlineObject} from './selector.get-previous-inline-object'\nimport {getSelectionStartPoint} from './selector.get-selection-start-point'\nimport {getSelectionText} from './selector.get-selection-text'\nimport {isSelectionCollapsed} from './selector.is-selection-collapsed'\nimport {isSelectionExpanded} from './selector.is-selection-expanded'\nimport {getFocusTextBlock} from './selectors'\n\n/**\n * @public\n * Returns the selection of the of the word the caret is placed in.\n * Note: Only returns a word selection if the current selection is collapsed\n */\nexport const getCaretWordSelection: EditorSelector<EditorSelection> = (\n snapshot,\n) => {\n if (!snapshot.context.selection) {\n return null\n }\n\n if (!isSelectionCollapsed(snapshot)) {\n return null\n }\n\n const focusTextBlock = getFocusTextBlock(snapshot)\n const selectionStartPoint = getSelectionStartPoint(snapshot)\n const selectionStartOffset = selectionStartPoint\n ? spanSelectionPointToBlockOffset({\n value: snapshot.context.value,\n selectionPoint: selectionStartPoint,\n })\n : undefined\n\n if (!focusTextBlock || !selectionStartPoint || !selectionStartOffset) {\n return null\n }\n\n const previousInlineObject = getPreviousInlineObject(snapshot)\n const blockStartPoint = getBlockStartPoint(focusTextBlock)\n const textBefore = getSelectionText({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection: {\n anchor: previousInlineObject\n ? {path: previousInlineObject.path, offset: 0}\n : blockStartPoint,\n focus: selectionStartPoint,\n },\n },\n })\n const textDirectlyBefore = textBefore.split(/\\s+/).at(-1)\n\n const nextInlineObject = getNextInlineObject(snapshot)\n const blockEndPoint = getBlockEndPoint(focusTextBlock)\n const textAfter = getSelectionText({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection: {\n anchor: selectionStartPoint,\n focus: nextInlineObject\n ? {path: nextInlineObject.path, offset: 0}\n : blockEndPoint,\n },\n },\n })\n const textDirectlyAfter = textAfter.split(/\\s+/).at(0)\n\n if (\n (textDirectlyBefore === undefined || textDirectlyBefore === '') &&\n (textDirectlyAfter === undefined || textDirectlyAfter === '')\n ) {\n return null\n }\n\n const caretWordStartOffset: BlockOffset = textDirectlyBefore\n ? {\n ...selectionStartOffset,\n offset: selectionStartOffset.offset - textDirectlyBefore.length,\n }\n : selectionStartOffset\n const caretWordEndOffset: BlockOffset = textDirectlyAfter\n ? {\n ...selectionStartOffset,\n offset: selectionStartOffset.offset + textDirectlyAfter.length,\n }\n : selectionStartOffset\n\n const caretWordStartSelectionPoint = blockOffsetToSpanSelectionPoint({\n value: snapshot.context.value,\n blockOffset: caretWordStartOffset,\n direction: 'backward',\n })\n const caretWordEndSelectionPoint = blockOffsetToSpanSelectionPoint({\n value: snapshot.context.value,\n blockOffset: caretWordEndOffset,\n direction: 'forward',\n })\n\n if (!caretWordStartSelectionPoint || !caretWordEndSelectionPoint) {\n return null\n }\n\n const caretWordSelection = {\n anchor: caretWordStartSelectionPoint,\n focus: caretWordEndSelectionPoint,\n }\n\n return isSelectionExpanded({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection: caretWordSelection,\n },\n })\n ? caretWordSelection\n : null\n}\n","import type {KeyedSegment, PortableTextBlock} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport * as utils from '../utils'\nimport {isSelectionCollapsed} from './selector.is-selection-collapsed'\n\n/**\n * @public\n */\nexport function isAtTheEndOfBlock(block: {\n node: PortableTextBlock\n path: [KeyedSegment]\n}): EditorSelector<boolean> {\n return (snapshot) => {\n if (!snapshot.context.selection || !isSelectionCollapsed(snapshot)) {\n return false\n }\n\n const blockEndPoint = utils.getBlockEndPoint(block)\n\n return utils.isEqualSelectionPoints(\n snapshot.context.selection.focus,\n blockEndPoint,\n )\n }\n}\n","import type {KeyedSegment, PortableTextBlock} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport * as utils from '../utils'\nimport {isSelectionCollapsed} from './selector.is-selection-collapsed'\n\n/**\n * @public\n */\nexport function isAtTheStartOfBlock(block: {\n node: PortableTextBlock\n path: [KeyedSegment]\n}): EditorSelector<boolean> {\n return (snapshot) => {\n if (!snapshot.context.selection || !isSelectionCollapsed(snapshot)) {\n return false\n }\n\n const blockStartPoint = utils.getBlockStartPoint(block)\n\n return utils.isEqualSelectionPoints(\n snapshot.context.selection.focus,\n blockStartPoint,\n )\n }\n}\n","import {isKeySegment, isPortableTextTextBlock} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport type {EditorSelectionPoint} from '../types/editor'\nimport {reverseSelection} from '../utils/util.reverse-selection'\n\n/**\n * @public\n */\nexport function isPointAfterSelection(\n point: EditorSelectionPoint,\n): EditorSelector<boolean> {\n return (snapshot) => {\n if (!snapshot.context.selection) {\n return false\n }\n\n const selection = snapshot.context.selection.backward\n ? reverseSelection(snapshot.context.selection)\n : snapshot.context.selection\n\n const pointBlockKey = isKeySegment(point.path[0])\n ? point.path[0]._key\n : undefined\n const pointChildKey = isKeySegment(point.path[2])\n ? point.path[2]._key\n : undefined\n\n const endBlockKey = isKeySegment(selection.focus.path[0])\n ? selection.focus.path[0]._key\n : undefined\n const endChildKey = isKeySegment(selection.focus.path[2])\n ? selection.focus.path[2]._key\n : undefined\n\n if (!pointBlockKey || !endBlockKey) {\n return false\n }\n\n let after = false\n\n for (const block of snapshot.context.value) {\n if (block._key === endBlockKey) {\n if (block._key !== pointBlockKey) {\n after = true\n break\n }\n\n // Both the point and the selection end in this block\n\n if (!isPortableTextTextBlock(block)) {\n break\n }\n\n if (!pointChildKey || !endChildKey) {\n break\n }\n\n for (const child of block.children) {\n if (child._key === endChildKey) {\n if (child._key !== pointChildKey) {\n after = true\n break\n }\n\n // Both the point and the selection end in this child\n\n after = point.offset > selection.focus.offset\n break\n }\n\n if (child._key === pointChildKey) {\n break\n }\n }\n }\n\n if (block._key === pointBlockKey) {\n break\n }\n }\n\n return after\n }\n}\n","import {isKeySegment, isPortableTextTextBlock} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport type {EditorSelectionPoint} from '../types/editor'\nimport {reverseSelection} from '../utils/util.reverse-selection'\n\n/**\n * @public\n */\nexport function isPointBeforeSelection(\n point: EditorSelectionPoint,\n): EditorSelector<boolean> {\n return (snapshot) => {\n if (!snapshot.context.selection) {\n return false\n }\n\n const selection = snapshot.context.selection.backward\n ? reverseSelection(snapshot.context.selection)\n : snapshot.context.selection\n\n const pointBlockKey = isKeySegment(point.path[0])\n ? point.path[0]._key\n : undefined\n const pointChildKey = isKeySegment(point.path[2])\n ? point.path[2]._key\n : undefined\n\n const startBlockKey = isKeySegment(selection.anchor.path[0])\n ? selection.anchor.path[0]._key\n : undefined\n const startChildKey = isKeySegment(selection.anchor.path[2])\n ? selection.anchor.path[2]._key\n : undefined\n\n if (!pointBlockKey || !startBlockKey) {\n return false\n }\n\n let before = false\n\n for (const block of snapshot.context.value) {\n if (block._key === pointBlockKey) {\n if (block._key !== startBlockKey) {\n before = true\n break\n }\n\n // Both the point and the selection start in this block\n\n if (!isPortableTextTextBlock(block)) {\n break\n }\n\n if (!pointChildKey || !startChildKey) {\n break\n }\n\n for (const child of block.children) {\n if (child._key === pointChildKey) {\n if (child._key !== startChildKey) {\n before = true\n break\n }\n\n // Both the point and the selection start in this child\n\n before = point.offset < selection.anchor.offset\n break\n }\n\n if (child._key === startChildKey) {\n break\n }\n }\n }\n\n if (block._key === startBlockKey) {\n break\n }\n }\n\n return before\n }\n}\n","import type {EditorSelection} from '../types/editor'\nimport {isEqualSelectionPoints} from '../utils'\nimport type {EditorSelector} from './../editor/editor-selector'\nimport {getSelectionEndPoint} from './selector.get-selection-end-point'\nimport {getSelectionStartPoint} from './selector.get-selection-start-point'\nimport {isPointAfterSelection} from './selector.is-point-after-selection'\nimport {isPointBeforeSelection} from './selector.is-point-before-selection'\n\n/**\n * @public\n */\nexport function isOverlappingSelection(\n selection: EditorSelection,\n): EditorSelector<boolean> {\n return (snapshot) => {\n if (!selection || !snapshot.context.selection) {\n return false\n }\n\n const selectionStartPoint = getSelectionStartPoint({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection,\n },\n })\n const selectionEndPoint = getSelectionEndPoint({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection,\n },\n })\n\n const originalSelectionStartPoint = getSelectionStartPoint(snapshot)\n const originalSelectionEndPoint = getSelectionEndPoint(snapshot)\n\n if (\n !selectionStartPoint ||\n !selectionEndPoint ||\n !originalSelectionStartPoint ||\n !originalSelectionEndPoint\n ) {\n return false\n }\n\n const startPointBeforeSelection =\n isPointBeforeSelection(selectionStartPoint)(snapshot)\n const startPointAfterSelection =\n isPointAfterSelection(selectionStartPoint)(snapshot)\n const endPointBeforeSelection =\n isPointBeforeSelection(selectionEndPoint)(snapshot)\n const endPointAfterSelection =\n isPointAfterSelection(selectionEndPoint)(snapshot)\n\n const originalStartPointBeforeStartPoint = isPointBeforeSelection(\n originalSelectionStartPoint,\n )({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection: {\n anchor: selectionStartPoint,\n focus: selectionStartPoint,\n },\n },\n })\n const originalStartPointAfterStartPoint = isPointAfterSelection(\n originalSelectionStartPoint,\n )({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection: {\n anchor: selectionStartPoint,\n focus: selectionStartPoint,\n },\n },\n })\n\n const originalEndPointBeforeEndPoint = isPointBeforeSelection(\n originalSelectionEndPoint,\n )({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection: {\n anchor: selectionEndPoint,\n focus: selectionEndPoint,\n },\n },\n })\n const originalEndPointAfterEndPoint = isPointAfterSelection(\n originalSelectionEndPoint,\n )({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection: {\n anchor: selectionEndPoint,\n focus: selectionEndPoint,\n },\n },\n })\n\n const endPointEqualToOriginalStartPoint = isEqualSelectionPoints(\n selectionEndPoint,\n originalSelectionStartPoint,\n )\n const startPointEqualToOriginalEndPoint = isEqualSelectionPoints(\n selectionStartPoint,\n originalSelectionEndPoint,\n )\n\n if (endPointBeforeSelection && !endPointEqualToOriginalStartPoint) {\n return false\n }\n\n if (startPointAfterSelection && !startPointEqualToOriginalEndPoint) {\n return false\n }\n\n if (\n !originalStartPointBeforeStartPoint &&\n originalStartPointAfterStartPoint &&\n !originalEndPointBeforeEndPoint &&\n originalEndPointAfterEndPoint\n ) {\n return !endPointEqualToOriginalStartPoint\n }\n\n if (\n originalStartPointBeforeStartPoint &&\n !originalStartPointAfterStartPoint &&\n originalEndPointBeforeEndPoint &&\n !originalEndPointAfterEndPoint\n ) {\n return !startPointEqualToOriginalEndPoint\n }\n\n if (\n !startPointAfterSelection ||\n !startPointBeforeSelection ||\n !endPointAfterSelection ||\n !endPointBeforeSelection\n ) {\n return true\n }\n\n return false\n }\n}\n"],"names":["isSelectionCollapsed","snapshot","context","selection","JSON","stringify","anchor","path","focus","offset","createGuards","schema","isListBlock","block","isPortableTextListBlock","_type","name","isTextBlock","isPortableTextTextBlock","getFocusBlock","key","isKeySegment","_key","undefined","node","value","find","getFocusListBlock","guards","focusBlock","getFocusTextBlock","getFocusBlockObject","getFocusChild","children","span","getFocusSpan","focusChild","isPortableTextSpan","getFirstBlock","getLastBlock","length","getSelectedBlocks","selectedBlocks","startKey","backward","endKey","push","getSelectionStartBlock","getSelectionEndBlock","getPreviousBlock","previousBlock","selectionStartBlock","foundSelectionStartBlock","getNextBlock","nextBlock","selectionEndBlock","foundSelectionEndBlock","getSelectionEndPoint","getSelectionStartPoint","getNextInlineObject","focusTextBlock","selectionEndPoint","selectionEndPointChildKey","endPointChildFound","inlineObject","child","isSpan","getPreviousInlineObject","selectionStartPoint","selectionStartPointChildKey","getSelectedSlice","sliceBlocks","blocks","getSelectionText","reduce","text","isSelectionExpanded","getCaretWordSelection","selectionStartOffset","spanSelectionPointToBlockOffset","selectionPoint","previousInlineObject","blockStartPoint","getBlockStartPoint","textDirectlyBefore","split","at","nextInlineObject","blockEndPoint","getBlockEndPoint","textDirectlyAfter","caretWordStartOffset","caretWordEndOffset","caretWordStartSelectionPoint","blockOffsetToSpanSelectionPoint","blockOffset","direction","caretWordEndSelectionPoint","caretWordSelection","isAtTheEndOfBlock","utils","isAtTheStartOfBlock","isPointAfterSelection","point","reverseSelection","pointBlockKey","pointChildKey","endBlockKey","endChildKey","after","isPointBeforeSelection","startBlockKey","startChildKey","before","isOverlappingSelection","originalSelectionStartPoint","originalSelectionEndPoint","startPointBeforeSelection","startPointAfterSelection","endPointBeforeSelection","endPointAfterSelection","originalStartPointBeforeStartPoint","originalStartPointAfterStartPoint","originalEndPointBeforeEndPoint","originalEndPointAfterEndPoint","endPointEqualToOriginalStartPoint","isEqualSelectionPoints","startPointEqualToOriginalEndPoint"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../src/behaviors/behavior.code-editor.ts","../../src/behaviors/behavior.emoji-picker.ts","../../src/internal-utils/looks-like-url.ts","../../src/behaviors/behavior.links.ts"],"sourcesContent":["import {isHotkey} from '../internal-utils/is-hotkey'\nimport * as selectors from '../selectors'\nimport {raise} from './behavior.types.action'\nimport {defineBehavior} from './behavior.types.behavior'\n\n/**\n * @beta\n */\nexport type CodeEditorBehaviorsConfig = {\n moveBlockUpShortcut: string\n moveBlockDownShortcut: string\n}\n\n/**\n * @beta\n */\nexport function createCodeEditorBehaviors(config: CodeEditorBehaviorsConfig) {\n return [\n defineBehavior({\n on: 'keyboard.keydown',\n guard: ({snapshot, event}) => {\n const isMoveUpShortcut = isHotkey(\n config.moveBlockUpShortcut,\n event.originEvent,\n )\n const firstBlock = selectors.getFirstBlock(snapshot)\n const selectedBlocks = selectors.getSelectedBlocks(snapshot)\n const blocksAbove =\n firstBlock?.node._key !== selectedBlocks[0]?.node._key\n\n if (!isMoveUpShortcut || !blocksAbove) {\n return false\n }\n\n return {paths: selectedBlocks.map((block) => block.path)}\n },\n actions: [\n (_, {paths}) =>\n paths.map((at) =>\n raise({\n type: 'move.block up',\n at,\n }),\n ),\n ],\n }),\n defineBehavior({\n on: 'keyboard.keydown',\n guard: ({snapshot, event}) => {\n const isMoveDownShortcut = isHotkey(\n config.moveBlockDownShortcut,\n event.originEvent,\n )\n const lastBlock = selectors.getLastBlock(snapshot)\n const selectedBlocks = selectors.getSelectedBlocks(snapshot)\n const blocksBelow =\n lastBlock?.node._key !==\n selectedBlocks[selectedBlocks.length - 1]?.node._key\n\n if (!isMoveDownShortcut || !blocksBelow) {\n return false\n }\n\n return {paths: selectedBlocks.map((block) => block.path).reverse()}\n },\n actions: [\n (_, {paths}) =>\n paths.map((at) =>\n raise({\n type: 'move.block down',\n at,\n }),\n ),\n ],\n }),\n ]\n}\n","import {assertEvent, assign, createActor, setup} from 'xstate'\nimport {isHotkey} from '../internal-utils/is-hotkey'\nimport * as selectors from '../selectors'\nimport {effect, execute, noop} from './behavior.types.action'\nimport {defineBehavior} from './behavior.types.behavior'\n\nconst emojiCharRegEx = /^[a-zA-Z-_0-9]{1}$/\nconst incompleteEmojiRegEx = /:([a-zA-Z-_0-9]+)$/\nconst emojiRegEx = /:([a-zA-Z-_0-9]+):$/\n\n/**\n * @beta\n */\nexport type EmojiPickerBehaviorsConfig<TEmojiMatch> = {\n /**\n * Match emojis by keyword.\n */\n matchEmojis: ({keyword}: {keyword: string}) => Array<TEmojiMatch>\n onMatchesChanged: ({matches}: {matches: Array<TEmojiMatch>}) => void\n onSelectedIndexChanged: ({selectedIndex}: {selectedIndex: number}) => void\n /**\n * Parse an emoji match to a string that will be inserted into the editor.\n */\n parseMatch: ({match}: {match: TEmojiMatch}) => string | undefined\n}\n\n/**\n * @beta\n */\nexport function createEmojiPickerBehaviors<TEmojiMatch>(\n config: EmojiPickerBehaviorsConfig<TEmojiMatch>,\n) {\n const emojiPickerActor = createActor(createEmojiPickerMachine<TEmojiMatch>())\n emojiPickerActor.start()\n emojiPickerActor.subscribe((state) => {\n config.onMatchesChanged({matches: state.context.matches})\n config.onSelectedIndexChanged({selectedIndex: state.context.selectedIndex})\n })\n\n return [\n defineBehavior({\n on: 'insert.text',\n guard: ({snapshot, event}) => {\n if (event.text === ':') {\n return false\n }\n\n const isEmojiChar = emojiCharRegEx.test(event.text)\n\n if (!isEmojiChar) {\n return {emojis: []}\n }\n\n const focusBlock = selectors.getFocusTextBlock(snapshot)\n const textBefore = selectors.getBlockTextBefore(snapshot)\n const emojiKeyword = `${textBefore}${event.text}`.match(\n incompleteEmojiRegEx,\n )?.[1]\n\n if (!focusBlock || emojiKeyword === undefined) {\n return {emojis: []}\n }\n\n const emojis = config.matchEmojis({keyword: emojiKeyword})\n\n return {emojis}\n },\n actions: [\n (_, params) => [\n {\n type: 'effect',\n effect: () => {\n emojiPickerActor.send({\n type: 'emojis found',\n matches: params.emojis,\n })\n },\n },\n ],\n ],\n }),\n defineBehavior({\n on: 'insert.text',\n guard: ({snapshot, event}) => {\n const isColon = event.text === ':'\n\n if (!isColon) {\n return false\n }\n\n const matches = emojiPickerActor.getSnapshot().context.matches\n const selectedIndex =\n emojiPickerActor.getSnapshot().context.selectedIndex\n const emoji = matches[selectedIndex]\n ? config.parseMatch({match: matches[selectedIndex]})\n : undefined\n\n const focusBlock = selectors.getFocusTextBlock(snapshot)\n const textBefore = selectors.getBlockTextBefore(snapshot)\n const emojiKeyword = `${textBefore}:`.match(emojiRegEx)?.[1]\n\n if (!focusBlock || emojiKeyword === undefined) {\n return false\n }\n\n const emojiStringLength = emojiKeyword.length + 2\n\n if (emoji) {\n return {\n focusBlock,\n emoji,\n emojiStringLength,\n textBeforeLength: textBefore.length + 1,\n }\n }\n\n return false\n },\n actions: [\n () => [\n execute({\n type: 'insert.text',\n text: ':',\n }),\n ],\n (_, params) => [\n effect(() => {\n emojiPickerActor.send({type: 'select'})\n }),\n execute({\n type: 'delete.text',\n at: {\n anchor: {\n path: params.focusBlock.path,\n offset: params.textBeforeLength - params.emojiStringLength,\n },\n focus: {\n path: params.focusBlock.path,\n offset: params.textBeforeLength,\n },\n },\n }),\n execute({\n type: 'insert.text',\n text: params.emoji,\n }),\n ],\n ],\n }),\n defineBehavior({\n on: 'keyboard.keydown',\n guard: ({snapshot, event}) => {\n const matches = emojiPickerActor.getSnapshot().context.matches\n\n if (matches.length === 0) {\n return false\n }\n\n const isEscape = isHotkey('Escape', event.originEvent)\n\n if (isEscape) {\n return {action: 'reset' as const}\n }\n\n const isEnter = isHotkey('Enter', event.originEvent)\n const isTab = isHotkey('Tab', event.originEvent)\n\n if (isEnter || isTab) {\n const selectedIndex =\n emojiPickerActor.getSnapshot().context.selectedIndex\n\n const emoji = matches[selectedIndex]\n ? config.parseMatch({match: matches[selectedIndex]})\n : undefined\n\n if (!emoji) {\n return false\n }\n\n const focusBlock = selectors.getFocusTextBlock(snapshot)\n const textBefore = selectors.getBlockTextBefore(snapshot)\n const emojiKeyword = textBefore.match(incompleteEmojiRegEx)?.[1]\n\n if (!focusBlock || emojiKeyword === undefined) {\n return false\n }\n\n const emojiStringLength = emojiKeyword.length + 1\n\n if (emoji) {\n return {\n action: 'select' as const,\n focusBlock,\n emoji,\n emojiStringLength,\n textBeforeLength: textBefore.length,\n }\n }\n\n return false\n }\n\n const isArrowDown = isHotkey('ArrowDown', event.originEvent)\n const isArrowUp = isHotkey('ArrowUp', event.originEvent)\n\n if (isArrowDown && matches.length > 0) {\n return {action: 'navigate down' as const}\n }\n\n if (isArrowUp && matches.length > 0) {\n return {action: 'navigate up' as const}\n }\n\n return false\n },\n actions: [\n (_, params) => {\n if (params.action === 'select') {\n return [\n effect(() => {\n emojiPickerActor.send({type: 'select'})\n }),\n execute({\n type: 'delete.text',\n at: {\n anchor: {\n path: params.focusBlock.path,\n offset: params.textBeforeLength - params.emojiStringLength,\n },\n focus: {\n path: params.focusBlock.path,\n offset: params.textBeforeLength,\n },\n },\n }),\n execute({\n type: 'insert.text',\n text: params.emoji,\n }),\n ]\n }\n\n if (params.action === 'navigate up') {\n return [\n // If we are navigating then we want to hijack the key event and\n // turn it into a noop.\n noop(),\n effect(() => {\n emojiPickerActor.send({type: 'navigate up'})\n }),\n ]\n }\n\n if (params.action === 'navigate down') {\n return [\n // If we are navigating then we want to hijack the key event and\n // turn it into a noop.\n noop(),\n effect(() => {\n emojiPickerActor.send({type: 'navigate down'})\n }),\n ]\n }\n\n return [\n effect(() => {\n emojiPickerActor.send({type: 'reset'})\n }),\n ]\n },\n ],\n }),\n defineBehavior({\n on: 'delete.backward',\n guard: ({snapshot, event}) => {\n if (event.unit !== 'character') {\n return false\n }\n\n const matches = emojiPickerActor.getSnapshot().context.matches\n\n if (matches.length === 0) {\n return false\n }\n\n const focusBlock = selectors.getFocusTextBlock(snapshot)\n const textBefore = selectors.getBlockTextBefore(snapshot)\n const emojiKeyword = textBefore\n .slice(0, textBefore.length - 1)\n .match(incompleteEmojiRegEx)?.[1]\n\n if (!focusBlock || emojiKeyword === undefined) {\n return {emojis: []}\n }\n\n const emojis = config.matchEmojis({keyword: emojiKeyword})\n\n return {emojis}\n },\n actions: [\n (_, params) => [\n {\n type: 'effect',\n effect: () => {\n emojiPickerActor.send({\n type: 'emojis found',\n matches: params.emojis,\n })\n },\n },\n ],\n ],\n }),\n ]\n}\n\nfunction createEmojiPickerMachine<TEmojiSearchResult>() {\n return setup({\n types: {\n context: {} as {\n matches: Array<TEmojiSearchResult>\n selectedIndex: number\n },\n events: {} as\n | {\n type: 'emojis found'\n matches: Array<TEmojiSearchResult>\n }\n | {\n type: 'navigate down' | 'navigate up' | 'select' | 'reset'\n },\n },\n actions: {\n 'assign matches': assign({\n matches: ({event}) => {\n assertEvent(event, 'emojis found')\n return event.matches\n },\n }),\n 'reset matches': assign({\n matches: [],\n }),\n 'reset selected index': assign({\n selectedIndex: 0,\n }),\n 'increment selected index': assign({\n selectedIndex: ({context}) => {\n if (context.selectedIndex === context.matches.length - 1) {\n return 0\n }\n return context.selectedIndex + 1\n },\n }),\n 'decrement selected index': assign({\n selectedIndex: ({context}) => {\n if (context.selectedIndex === 0) {\n return context.matches.length - 1\n }\n return context.selectedIndex - 1\n },\n }),\n },\n guards: {\n 'no matches': ({context}) => context.matches.length === 0,\n },\n }).createMachine({\n id: 'emoji picker',\n context: {\n matches: [],\n selectedIndex: 0,\n },\n initial: 'idle',\n states: {\n 'idle': {\n on: {\n 'emojis found': {\n actions: 'assign matches',\n target: 'showing matches',\n },\n },\n },\n 'showing matches': {\n always: {\n guard: 'no matches',\n target: 'idle',\n },\n exit: ['reset selected index'],\n on: {\n 'emojis found': {\n actions: 'assign matches',\n },\n 'navigate down': {\n actions: 'increment selected index',\n },\n 'navigate up': {\n actions: 'decrement selected index',\n },\n 'reset': {\n target: 'idle',\n actions: ['reset selected index', 'reset matches'],\n },\n 'select': {\n target: 'idle',\n actions: ['reset selected index', 'reset matches'],\n },\n },\n },\n },\n })\n}\n","export function looksLikeUrl(text: string) {\n let looksLikeUrl = false\n try {\n const url = new URL(text)\n\n if (!sensibleProtocols.includes(url.protocol)) {\n return false\n }\n\n looksLikeUrl = true\n } catch {}\n return looksLikeUrl\n}\n\nconst sensibleProtocols = ['http:', 'https:', 'mailto:', 'tel:']\n","import type {EditorSchema} from '../editor/define-schema'\nimport {looksLikeUrl} from '../internal-utils/looks-like-url'\nimport * as selectors from '../selectors'\nimport {execute} from './behavior.types.action'\nimport {defineBehavior} from './behavior.types.behavior'\n\n/**\n * @beta\n */\nexport type LinkBehaviorsConfig = {\n linkAnnotation?: (context: {\n schema: EditorSchema\n url: string\n }) => {name: string; value: {[prop: string]: unknown}} | undefined\n}\n\n/**\n * @beta\n */\nexport function createLinkBehaviors(config: LinkBehaviorsConfig) {\n const pasteLinkOnSelection = defineBehavior({\n on: 'clipboard.paste',\n guard: ({snapshot, event}) => {\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n const text = event.originEvent.dataTransfer.getData('text/plain')\n const url = looksLikeUrl(text) ? text : undefined\n const annotation =\n url !== undefined\n ? config.linkAnnotation?.({url, schema: snapshot.context.schema})\n : undefined\n\n if (annotation && !selectionCollapsed) {\n return {annotation}\n }\n\n return false\n },\n actions: [\n (_, {annotation}) => [\n execute({\n type: 'annotation.add',\n annotation,\n }),\n ],\n ],\n })\n const pasteLinkAtCaret = defineBehavior({\n on: 'clipboard.paste',\n guard: ({snapshot, event}) => {\n const focusSpan = selectors.getFocusSpan(snapshot)\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n\n if (!focusSpan || !selectionCollapsed) {\n return false\n }\n\n const text = event.originEvent.dataTransfer.getData('text/plain')\n const url = looksLikeUrl(text) ? text : undefined\n const annotation =\n url !== undefined\n ? config.linkAnnotation?.({url, schema: snapshot.context.schema})\n : undefined\n\n if (url && annotation && selectionCollapsed) {\n return {focusSpan, annotation, url}\n }\n\n return false\n },\n actions: [\n (_, {annotation, url}) => [\n execute({\n type: 'insert.span',\n text: url,\n annotations: [annotation],\n }),\n ],\n ],\n })\n\n const linkBehaviors = [pasteLinkOnSelection, pasteLinkAtCaret]\n\n return linkBehaviors\n}\n"],"names":["createCodeEditorBehaviors","config","defineBehavior","on","guard","snapshot","event","isMoveUpShortcut","isHotkey","moveBlockUpShortcut","originEvent","firstBlock","selectors","getFirstBlock","selectedBlocks","blocksAbove","node","_key","paths","map","block","path","actions","_","at","raise","type","isMoveDownShortcut","moveBlockDownShortcut","lastBlock","blocksBelow","length","reverse","emojiCharRegEx","incompleteEmojiRegEx","emojiRegEx","createEmojiPickerBehaviors","emojiPickerActor","createActor","createEmojiPickerMachine","start","subscribe","state","onMatchesChanged","matches","context","onSelectedIndexChanged","selectedIndex","text","test","emojis","focusBlock","emojiKeyword","match","undefined","matchEmojis","keyword","params","effect","send","getSnapshot","emoji","parseMatch","textBefore","emojiStringLength","textBeforeLength","execute","anchor","offset","focus","action","isEnter","isTab","isArrowDown","isArrowUp","noop","unit","slice","setup","types","events","assign","assertEvent","guards","no matches","createMachine","id","initial","states","target","always","exit","looksLikeUrl","url","URL","sensibleProtocols","includes","protocol","createLinkBehaviors","pasteLinkOnSelection","selectionCollapsed","dataTransfer","getData","annotation","linkAnnotation","schema","pasteLinkAtCaret","focusSpan","annotations"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../src/behaviors/behavior.code-editor.ts","../../src/behaviors/behavior.emoji-picker.ts","../../src/internal-utils/looks-like-url.ts","../../src/behaviors/behavior.links.ts"],"sourcesContent":["import {isHotkey} from '../internal-utils/is-hotkey'\nimport * as selectors from '../selectors'\nimport {raise} from './behavior.types.action'\nimport {defineBehavior} from './behavior.types.behavior'\n\n/**\n * @beta\n */\nexport type CodeEditorBehaviorsConfig = {\n moveBlockUpShortcut: string\n moveBlockDownShortcut: string\n}\n\n/**\n * @beta\n */\nexport function createCodeEditorBehaviors(config: CodeEditorBehaviorsConfig) {\n return [\n defineBehavior({\n on: 'keyboard.keydown',\n guard: ({snapshot, event}) => {\n const isMoveUpShortcut = isHotkey(\n config.moveBlockUpShortcut,\n event.originEvent,\n )\n const firstBlock = selectors.getFirstBlock(snapshot)\n const selectedBlocks = selectors.getSelectedBlocks(snapshot)\n const blocksAbove =\n firstBlock?.node._key !== selectedBlocks[0]?.node._key\n\n if (!isMoveUpShortcut || !blocksAbove) {\n return false\n }\n\n return {paths: selectedBlocks.map((block) => block.path)}\n },\n actions: [\n (_, {paths}) =>\n paths.map((at) =>\n raise({\n type: 'move.block up',\n at,\n }),\n ),\n ],\n }),\n defineBehavior({\n on: 'keyboard.keydown',\n guard: ({snapshot, event}) => {\n const isMoveDownShortcut = isHotkey(\n config.moveBlockDownShortcut,\n event.originEvent,\n )\n const lastBlock = selectors.getLastBlock(snapshot)\n const selectedBlocks = selectors.getSelectedBlocks(snapshot)\n const blocksBelow =\n lastBlock?.node._key !==\n selectedBlocks[selectedBlocks.length - 1]?.node._key\n\n if (!isMoveDownShortcut || !blocksBelow) {\n return false\n }\n\n return {paths: selectedBlocks.map((block) => block.path).reverse()}\n },\n actions: [\n (_, {paths}) =>\n paths.map((at) =>\n raise({\n type: 'move.block down',\n at,\n }),\n ),\n ],\n }),\n ]\n}\n","import {assertEvent, assign, createActor, setup} from 'xstate'\nimport {isHotkey} from '../internal-utils/is-hotkey'\nimport * as selectors from '../selectors'\nimport {effect, execute, noop} from './behavior.types.action'\nimport {defineBehavior} from './behavior.types.behavior'\n\nconst emojiCharRegEx = /^[a-zA-Z-_0-9]{1}$/\nconst incompleteEmojiRegEx = /:([a-zA-Z-_0-9]+)$/\nconst emojiRegEx = /:([a-zA-Z-_0-9]+):$/\n\n/**\n * @beta\n */\nexport type EmojiPickerBehaviorsConfig<TEmojiMatch> = {\n /**\n * Match emojis by keyword.\n */\n matchEmojis: ({keyword}: {keyword: string}) => Array<TEmojiMatch>\n onMatchesChanged: ({matches}: {matches: Array<TEmojiMatch>}) => void\n onSelectedIndexChanged: ({selectedIndex}: {selectedIndex: number}) => void\n /**\n * Parse an emoji match to a string that will be inserted into the editor.\n */\n parseMatch: ({match}: {match: TEmojiMatch}) => string | undefined\n}\n\n/**\n * @beta\n */\nexport function createEmojiPickerBehaviors<TEmojiMatch>(\n config: EmojiPickerBehaviorsConfig<TEmojiMatch>,\n) {\n const emojiPickerActor = createActor(createEmojiPickerMachine<TEmojiMatch>())\n emojiPickerActor.start()\n emojiPickerActor.subscribe((state) => {\n config.onMatchesChanged({matches: state.context.matches})\n config.onSelectedIndexChanged({selectedIndex: state.context.selectedIndex})\n })\n\n return [\n defineBehavior({\n on: 'insert.text',\n guard: ({snapshot, event}) => {\n if (event.text === ':') {\n return false\n }\n\n const isEmojiChar = emojiCharRegEx.test(event.text)\n\n if (!isEmojiChar) {\n return {emojis: []}\n }\n\n const focusBlock = selectors.getFocusTextBlock(snapshot)\n const textBefore = selectors.getBlockTextBefore(snapshot)\n const emojiKeyword = `${textBefore}${event.text}`.match(\n incompleteEmojiRegEx,\n )?.[1]\n\n if (!focusBlock || emojiKeyword === undefined) {\n return {emojis: []}\n }\n\n const emojis = config.matchEmojis({keyword: emojiKeyword})\n\n return {emojis}\n },\n actions: [\n (_, params) => [\n {\n type: 'effect',\n effect: () => {\n emojiPickerActor.send({\n type: 'emojis found',\n matches: params.emojis,\n })\n },\n },\n ],\n ],\n }),\n defineBehavior({\n on: 'insert.text',\n guard: ({snapshot, event}) => {\n const isColon = event.text === ':'\n\n if (!isColon) {\n return false\n }\n\n const matches = emojiPickerActor.getSnapshot().context.matches\n const selectedIndex =\n emojiPickerActor.getSnapshot().context.selectedIndex\n const emoji = matches[selectedIndex]\n ? config.parseMatch({match: matches[selectedIndex]})\n : undefined\n\n const focusBlock = selectors.getFocusTextBlock(snapshot)\n const textBefore = selectors.getBlockTextBefore(snapshot)\n const emojiKeyword = `${textBefore}:`.match(emojiRegEx)?.[1]\n\n if (!focusBlock || emojiKeyword === undefined) {\n return false\n }\n\n const emojiStringLength = emojiKeyword.length + 2\n\n if (emoji) {\n return {\n focusBlock,\n emoji,\n emojiStringLength,\n textBeforeLength: textBefore.length + 1,\n }\n }\n\n return false\n },\n actions: [\n () => [\n execute({\n type: 'insert.text',\n text: ':',\n }),\n ],\n (_, params) => [\n effect(() => {\n emojiPickerActor.send({type: 'select'})\n }),\n execute({\n type: 'delete.text',\n at: {\n anchor: {\n path: params.focusBlock.path,\n offset: params.textBeforeLength - params.emojiStringLength,\n },\n focus: {\n path: params.focusBlock.path,\n offset: params.textBeforeLength,\n },\n },\n }),\n execute({\n type: 'insert.text',\n text: params.emoji,\n }),\n ],\n ],\n }),\n defineBehavior({\n on: 'keyboard.keydown',\n guard: ({snapshot, event}) => {\n const matches = emojiPickerActor.getSnapshot().context.matches\n\n if (matches.length === 0) {\n return false\n }\n\n const isEscape = isHotkey('Escape', event.originEvent)\n\n if (isEscape) {\n return {action: 'reset' as const}\n }\n\n const isEnter = isHotkey('Enter', event.originEvent)\n const isTab = isHotkey('Tab', event.originEvent)\n\n if (isEnter || isTab) {\n const selectedIndex =\n emojiPickerActor.getSnapshot().context.selectedIndex\n\n const emoji = matches[selectedIndex]\n ? config.parseMatch({match: matches[selectedIndex]})\n : undefined\n\n if (!emoji) {\n return false\n }\n\n const focusBlock = selectors.getFocusTextBlock(snapshot)\n const textBefore = selectors.getBlockTextBefore(snapshot)\n const emojiKeyword = textBefore.match(incompleteEmojiRegEx)?.[1]\n\n if (!focusBlock || emojiKeyword === undefined) {\n return false\n }\n\n const emojiStringLength = emojiKeyword.length + 1\n\n if (emoji) {\n return {\n action: 'select' as const,\n focusBlock,\n emoji,\n emojiStringLength,\n textBeforeLength: textBefore.length,\n }\n }\n\n return false\n }\n\n const isArrowDown = isHotkey('ArrowDown', event.originEvent)\n const isArrowUp = isHotkey('ArrowUp', event.originEvent)\n\n if (isArrowDown && matches.length > 0) {\n return {action: 'navigate down' as const}\n }\n\n if (isArrowUp && matches.length > 0) {\n return {action: 'navigate up' as const}\n }\n\n return false\n },\n actions: [\n (_, params) => {\n if (params.action === 'select') {\n return [\n effect(() => {\n emojiPickerActor.send({type: 'select'})\n }),\n execute({\n type: 'delete.text',\n at: {\n anchor: {\n path: params.focusBlock.path,\n offset: params.textBeforeLength - params.emojiStringLength,\n },\n focus: {\n path: params.focusBlock.path,\n offset: params.textBeforeLength,\n },\n },\n }),\n execute({\n type: 'insert.text',\n text: params.emoji,\n }),\n ]\n }\n\n if (params.action === 'navigate up') {\n return [\n // If we are navigating then we want to hijack the key event and\n // turn it into a noop.\n noop(),\n effect(() => {\n emojiPickerActor.send({type: 'navigate up'})\n }),\n ]\n }\n\n if (params.action === 'navigate down') {\n return [\n // If we are navigating then we want to hijack the key event and\n // turn it into a noop.\n noop(),\n effect(() => {\n emojiPickerActor.send({type: 'navigate down'})\n }),\n ]\n }\n\n return [\n effect(() => {\n emojiPickerActor.send({type: 'reset'})\n }),\n ]\n },\n ],\n }),\n defineBehavior({\n on: 'delete.backward',\n guard: ({snapshot, event}) => {\n if (event.unit !== 'character') {\n return false\n }\n\n const matches = emojiPickerActor.getSnapshot().context.matches\n\n if (matches.length === 0) {\n return false\n }\n\n const focusBlock = selectors.getFocusTextBlock(snapshot)\n const textBefore = selectors.getBlockTextBefore(snapshot)\n const emojiKeyword = textBefore\n .slice(0, textBefore.length - 1)\n .match(incompleteEmojiRegEx)?.[1]\n\n if (!focusBlock || emojiKeyword === undefined) {\n return {emojis: []}\n }\n\n const emojis = config.matchEmojis({keyword: emojiKeyword})\n\n return {emojis}\n },\n actions: [\n (_, params) => [\n {\n type: 'effect',\n effect: () => {\n emojiPickerActor.send({\n type: 'emojis found',\n matches: params.emojis,\n })\n },\n },\n ],\n ],\n }),\n ]\n}\n\nfunction createEmojiPickerMachine<TEmojiSearchResult>() {\n return setup({\n types: {\n context: {} as {\n matches: Array<TEmojiSearchResult>\n selectedIndex: number\n },\n events: {} as\n | {\n type: 'emojis found'\n matches: Array<TEmojiSearchResult>\n }\n | {\n type: 'navigate down' | 'navigate up' | 'select' | 'reset'\n },\n },\n actions: {\n 'assign matches': assign({\n matches: ({event}) => {\n assertEvent(event, 'emojis found')\n return event.matches\n },\n }),\n 'reset matches': assign({\n matches: [],\n }),\n 'reset selected index': assign({\n selectedIndex: 0,\n }),\n 'increment selected index': assign({\n selectedIndex: ({context}) => {\n if (context.selectedIndex === context.matches.length - 1) {\n return 0\n }\n return context.selectedIndex + 1\n },\n }),\n 'decrement selected index': assign({\n selectedIndex: ({context}) => {\n if (context.selectedIndex === 0) {\n return context.matches.length - 1\n }\n return context.selectedIndex - 1\n },\n }),\n },\n guards: {\n 'no matches': ({context}) => context.matches.length === 0,\n },\n }).createMachine({\n id: 'emoji picker',\n context: {\n matches: [],\n selectedIndex: 0,\n },\n initial: 'idle',\n states: {\n 'idle': {\n on: {\n 'emojis found': {\n actions: 'assign matches',\n target: 'showing matches',\n },\n },\n },\n 'showing matches': {\n always: {\n guard: 'no matches',\n target: 'idle',\n },\n exit: ['reset selected index'],\n on: {\n 'emojis found': {\n actions: 'assign matches',\n },\n 'navigate down': {\n actions: 'increment selected index',\n },\n 'navigate up': {\n actions: 'decrement selected index',\n },\n 'reset': {\n target: 'idle',\n actions: ['reset selected index', 'reset matches'],\n },\n 'select': {\n target: 'idle',\n actions: ['reset selected index', 'reset matches'],\n },\n },\n },\n },\n })\n}\n","export function looksLikeUrl(text: string) {\n let looksLikeUrl = false\n try {\n const url = new URL(text)\n\n if (!sensibleProtocols.includes(url.protocol)) {\n return false\n }\n\n looksLikeUrl = true\n } catch {}\n return looksLikeUrl\n}\n\nconst sensibleProtocols = ['http:', 'https:', 'mailto:', 'tel:']\n","import type {EditorSchema} from '../editor/editor-schema'\nimport {looksLikeUrl} from '../internal-utils/looks-like-url'\nimport * as selectors from '../selectors'\nimport {execute} from './behavior.types.action'\nimport {defineBehavior} from './behavior.types.behavior'\n\n/**\n * @beta\n */\nexport type LinkBehaviorsConfig = {\n linkAnnotation?: (context: {\n schema: EditorSchema\n url: string\n }) => {name: string; value: {[prop: string]: unknown}} | undefined\n}\n\n/**\n * @beta\n */\nexport function createLinkBehaviors(config: LinkBehaviorsConfig) {\n const pasteLinkOnSelection = defineBehavior({\n on: 'clipboard.paste',\n guard: ({snapshot, event}) => {\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n const text = event.originEvent.dataTransfer.getData('text/plain')\n const url = looksLikeUrl(text) ? text : undefined\n const annotation =\n url !== undefined\n ? config.linkAnnotation?.({url, schema: snapshot.context.schema})\n : undefined\n\n if (annotation && !selectionCollapsed) {\n return {annotation}\n }\n\n return false\n },\n actions: [\n (_, {annotation}) => [\n execute({\n type: 'annotation.add',\n annotation,\n }),\n ],\n ],\n })\n const pasteLinkAtCaret = defineBehavior({\n on: 'clipboard.paste',\n guard: ({snapshot, event}) => {\n const focusSpan = selectors.getFocusSpan(snapshot)\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n\n if (!focusSpan || !selectionCollapsed) {\n return false\n }\n\n const text = event.originEvent.dataTransfer.getData('text/plain')\n const url = looksLikeUrl(text) ? text : undefined\n const annotation =\n url !== undefined\n ? config.linkAnnotation?.({url, schema: snapshot.context.schema})\n : undefined\n\n if (url && annotation && selectionCollapsed) {\n return {focusSpan, annotation, url}\n }\n\n return false\n },\n actions: [\n (_, {annotation, url}) => [\n execute({\n type: 'insert.span',\n text: url,\n annotations: [annotation],\n }),\n ],\n ],\n })\n\n const linkBehaviors = [pasteLinkOnSelection, pasteLinkAtCaret]\n\n return linkBehaviors\n}\n"],"names":["createCodeEditorBehaviors","config","defineBehavior","on","guard","snapshot","event","isMoveUpShortcut","isHotkey","moveBlockUpShortcut","originEvent","firstBlock","selectors","getFirstBlock","selectedBlocks","blocksAbove","node","_key","paths","map","block","path","actions","_","at","raise","type","isMoveDownShortcut","moveBlockDownShortcut","lastBlock","blocksBelow","length","reverse","emojiCharRegEx","incompleteEmojiRegEx","emojiRegEx","createEmojiPickerBehaviors","emojiPickerActor","createActor","createEmojiPickerMachine","start","subscribe","state","onMatchesChanged","matches","context","onSelectedIndexChanged","selectedIndex","text","test","emojis","focusBlock","emojiKeyword","match","undefined","matchEmojis","keyword","params","effect","send","getSnapshot","emoji","parseMatch","textBefore","emojiStringLength","textBeforeLength","execute","anchor","offset","focus","action","isEnter","isTab","isArrowDown","isArrowUp","noop","unit","slice","setup","types","events","assign","assertEvent","guards","no matches","createMachine","id","initial","states","target","always","exit","looksLikeUrl","url","URL","sensibleProtocols","includes","protocol","createLinkBehaviors","pasteLinkOnSelection","selectionCollapsed","dataTransfer","getData","annotation","linkAnnotation","schema","pasteLinkAtCaret","focusSpan","annotations"],"mappings":";;;AAgBO,SAASA,0BAA0BC,QAAmC;AAC3E,SAAO,CACLC,cAAAA,eAAe;AAAA,IACbC,IAAI;AAAA,IACJC,OAAOA,CAAC;AAAA,MAACC;AAAAA,MAAUC;AAAAA,IAAAA,MAAW;AACtBC,YAAAA,mBAAmBC,uBACvBP,OAAOQ,qBACPH,MAAMI,WACR,GACMC,aAAaC,gCAAUC,cAAcR,QAAQ,GAC7CS,iBAAiBF,gCAAAA,kBAA4BP,QAAQ,GACrDU,cACJJ,YAAYK,KAAKC,SAASH,eAAe,CAAC,GAAGE,KAAKC;AAEpD,aAAI,CAACV,oBAAoB,CAACQ,cACjB,KAGF;AAAA,QAACG,OAAOJ,eAAeK,IAAKC,CAAAA,UAAUA,MAAMC,IAAI;AAAA,MAAC;AAAA,IAC1D;AAAA,IACAC,SAAS,CACP,CAACC,GAAG;AAAA,MAACL;AAAAA,IACHA,MAAAA,MAAMC,IAAKK,CAAAA,OACTC,cAAAA,MAAM;AAAA,MACJC,MAAM;AAAA,MACNF;AAAAA,IAAAA,CACD,CACH,CAAC;AAAA,EAEN,CAAA,GACDtB,cAAAA,eAAe;AAAA,IACbC,IAAI;AAAA,IACJC,OAAOA,CAAC;AAAA,MAACC;AAAAA,MAAUC;AAAAA,IAAAA,MAAW;AACtBqB,YAAAA,qBAAqBnB,cAAAA,SACzBP,OAAO2B,uBACPtB,MAAMI,WACR,GACMmB,YAAYjB,6CAAuBP,QAAQ,GAC3CS,iBAAiBF,kDAA4BP,QAAQ,GACrDyB,cACJD,WAAWb,KAAKC,SAChBH,eAAeA,eAAeiB,SAAS,CAAC,GAAGf,KAAKC;AAElD,aAAI,CAACU,sBAAsB,CAACG,cACnB,KAGF;AAAA,QAACZ,OAAOJ,eAAeK,IAAKC,WAAUA,MAAMC,IAAI,EAAEW,QAAQ;AAAA,MAAC;AAAA,IACpE;AAAA,IACAV,SAAS,CACP,CAACC,GAAG;AAAA,MAACL;AAAAA,IACHA,MAAAA,MAAMC,IAAKK,CAAAA,OACTC,cAAAA,MAAM;AAAA,MACJC,MAAM;AAAA,MACNF;AAAAA,IAAAA,CACD,CACH,CAAC;AAAA,EAAA,CAEN,CAAC;AAEN;ACtEA,MAAMS,iBAAiB,sBACjBC,uBAAuB,sBACvBC,aAAa;AAqBZ,SAASC,2BACdnC,QACA;AACMoC,QAAAA,mBAAmBC,mBAAYC,0BAAuC;AAC5EF,SAAAA,iBAAiBG,MAAM,GACvBH,iBAAiBI,UAAWC,CAAU,UAAA;AACpCzC,WAAO0C,iBAAiB;AAAA,MAACC,SAASF,MAAMG,QAAQD;AAAAA,IAAAA,CAAQ,GACxD3C,OAAO6C,uBAAuB;AAAA,MAACC,eAAeL,MAAMG,QAAQE;AAAAA,IAAAA,CAAc;AAAA,EAAA,CAC3E,GAEM,CACL7C,cAAAA,eAAe;AAAA,IACbC,IAAI;AAAA,IACJC,OAAOA,CAAC;AAAA,MAACC;AAAAA,MAAUC;AAAAA,IAAAA,MAAW;AAC5B,UAAIA,MAAM0C,SAAS;AACV,eAAA;AAKT,UAAI,CAFgBf,eAAegB,KAAK3C,MAAM0C,IAAI;AAGzC,eAAA;AAAA,UAACE,QAAQ,CAAA;AAAA,QAAE;AAGpB,YAAMC,aAAavC,gCAAAA,kBAA4BP,QAAQ,GAEjD+C,eAAe,GADFxC,0CAA6BP,QAAQ,CACtB,GAAGC,MAAM0C,IAAI,GAAGK,MAChDnB,oBACF,IAAI,CAAC;AAED,aAAA,CAACiB,cAAcC,iBAAiBE,SAC3B;AAAA,QAACJ,QAAQ,CAAA;AAAA,MAAA,IAKX;AAAA,QAACA,QAFOjD,OAAOsD,YAAY;AAAA,UAACC,SAASJ;AAAAA,QAAa,CAAA;AAAA,MAE3C;AAAA,IAChB;AAAA,IACA9B,SAAS,CACP,CAACC,GAAGkC,WAAW,CACb;AAAA,MACE/B,MAAM;AAAA,MACNgC,QAAQA,MAAM;AACZrB,yBAAiBsB,KAAK;AAAA,UACpBjC,MAAM;AAAA,UACNkB,SAASa,OAAOP;AAAAA,QAAAA,CACjB;AAAA,MAAA;AAAA,IACH,CACD,CACF;AAAA,EAEJ,CAAA,GACDhD,cAAAA,eAAe;AAAA,IACbC,IAAI;AAAA,IACJC,OAAOA,CAAC;AAAA,MAACC;AAAAA,MAAUC;AAAAA,IAAAA,MAAW;AAGxB,UAFYA,MAAM0C,SAAS;AAGtB,eAAA;AAGT,YAAMJ,UAAUP,iBAAiBuB,YAAAA,EAAcf,QAAQD,SACjDG,gBACJV,iBAAiBuB,YAAY,EAAEf,QAAQE,eACnCc,QAAQjB,QAAQG,aAAa,IAC/B9C,OAAO6D,WAAW;AAAA,QAACT,OAAOT,QAAQG,aAAa;AAAA,MAAA,CAAE,IACjDO,QAEEH,aAAavC,gCAAAA,kBAA4BP,QAAQ,GACjD0D,aAAanD,0CAA6BP,QAAQ,GAClD+C,eAAe,GAAGW,UAAU,IAAIV,MAAMlB,UAAU,IAAI,CAAC;AAEvD,UAAA,CAACgB,cAAcC,iBAAiBE;AAC3B,eAAA;AAGHU,YAAAA,oBAAoBZ,aAAarB,SAAS;AAEhD,aAAI8B,QACK;AAAA,QACLV;AAAAA,QACAU;AAAAA,QACAG;AAAAA,QACAC,kBAAkBF,WAAWhC,SAAS;AAAA,MAAA,IAInC;AAAA,IACT;AAAA,IACAT,SAAS,CACP,MAAM,CACJ4C,sBAAQ;AAAA,MACNxC,MAAM;AAAA,MACNsB,MAAM;AAAA,IACP,CAAA,CAAC,GAEJ,CAACzB,GAAGkC,WAAW,CACbC,qBAAO,MAAM;AACXrB,uBAAiBsB,KAAK;AAAA,QAACjC,MAAM;AAAA,MAAA,CAAS;AAAA,IACvC,CAAA,GACDwC,cAAAA,QAAQ;AAAA,MACNxC,MAAM;AAAA,MACNF,IAAI;AAAA,QACF2C,QAAQ;AAAA,UACN9C,MAAMoC,OAAON,WAAW9B;AAAAA,UACxB+C,QAAQX,OAAOQ,mBAAmBR,OAAOO;AAAAA,QAC3C;AAAA,QACAK,OAAO;AAAA,UACLhD,MAAMoC,OAAON,WAAW9B;AAAAA,UACxB+C,QAAQX,OAAOQ;AAAAA,QAAAA;AAAAA,MACjB;AAAA,IAEH,CAAA,GACDC,cAAAA,QAAQ;AAAA,MACNxC,MAAM;AAAA,MACNsB,MAAMS,OAAOI;AAAAA,IAAAA,CACd,CAAC,CACH;AAAA,EAEJ,CAAA,GACD3D,cAAAA,eAAe;AAAA,IACbC,IAAI;AAAA,IACJC,OAAOA,CAAC;AAAA,MAACC;AAAAA,MAAUC;AAAAA,IAAAA,MAAW;AAC5B,YAAMsC,UAAUP,iBAAiBuB,YAAY,EAAEf,QAAQD;AAEvD,UAAIA,QAAQb,WAAW;AACd,eAAA;AAGQvB,UAAAA,uBAAS,UAAUF,MAAMI,WAAW;AAG5C,eAAA;AAAA,UAAC4D,QAAQ;AAAA,QAAgB;AAG5BC,YAAAA,UAAU/D,cAAAA,SAAS,SAASF,MAAMI,WAAW,GAC7C8D,QAAQhE,cAAAA,SAAS,OAAOF,MAAMI,WAAW;AAE/C,UAAI6D,WAAWC,OAAO;AACdzB,cAAAA,gBACJV,iBAAiBuB,YAAAA,EAAcf,QAAQE,eAEnCc,QAAQjB,QAAQG,aAAa,IAC/B9C,OAAO6D,WAAW;AAAA,UAACT,OAAOT,QAAQG,aAAa;AAAA,QAAE,CAAA,IACjDO;AAEJ,YAAI,CAACO;AACI,iBAAA;AAGT,cAAMV,aAAavC,gCAA4BP,kBAAAA,QAAQ,GACjD0D,aAAanD,uBAA6BP,mBAAAA,QAAQ,GAClD+C,eAAeW,WAAWV,MAAMnB,oBAAoB,IAAI,CAAC;AAE3D,YAAA,CAACiB,cAAcC,iBAAiBE;AAC3B,iBAAA;AAGHU,cAAAA,oBAAoBZ,aAAarB,SAAS;AAEhD,eAAI8B,QACK;AAAA,UACLS,QAAQ;AAAA,UACRnB;AAAAA,UACAU;AAAAA,UACAG;AAAAA,UACAC,kBAAkBF,WAAWhC;AAAAA,QAAAA,IAI1B;AAAA,MAAA;AAGH0C,YAAAA,cAAcjE,cAAAA,SAAS,aAAaF,MAAMI,WAAW,GACrDgE,YAAYlE,cAAAA,SAAS,WAAWF,MAAMI,WAAW;AAEnD+D,aAAAA,eAAe7B,QAAQb,SAAS,IAC3B;AAAA,QAACuC,QAAQ;AAAA,MAGdI,IAAAA,aAAa9B,QAAQb,SAAS,IACzB;AAAA,QAACuC,QAAQ;AAAA,MAAA,IAGX;AAAA,IACT;AAAA,IACAhD,SAAS,CACP,CAACC,GAAGkC,WACEA,OAAOa,WAAW,WACb,CACLZ,cAAAA,OAAO,MAAM;AACXrB,uBAAiBsB,KAAK;AAAA,QAACjC,MAAM;AAAA,MAAA,CAAS;AAAA,IACvC,CAAA,GACDwC,cAAAA,QAAQ;AAAA,MACNxC,MAAM;AAAA,MACNF,IAAI;AAAA,QACF2C,QAAQ;AAAA,UACN9C,MAAMoC,OAAON,WAAW9B;AAAAA,UACxB+C,QAAQX,OAAOQ,mBAAmBR,OAAOO;AAAAA,QAC3C;AAAA,QACAK,OAAO;AAAA,UACLhD,MAAMoC,OAAON,WAAW9B;AAAAA,UACxB+C,QAAQX,OAAOQ;AAAAA,QAAAA;AAAAA,MACjB;AAAA,IAEH,CAAA,GACDC,cAAAA,QAAQ;AAAA,MACNxC,MAAM;AAAA,MACNsB,MAAMS,OAAOI;AAAAA,IACd,CAAA,CAAC,IAIFJ,OAAOa,WAAW,gBACb;AAAA;AAAA;AAAA,MAGLK,mBAAK;AAAA,MACLjB,cAAAA,OAAO,MAAM;AACXrB,yBAAiBsB,KAAK;AAAA,UAACjC,MAAM;AAAA,QAAA,CAAc;AAAA,MAC5C,CAAA;AAAA,IAAA,IAID+B,OAAOa,WAAW,kBACb;AAAA;AAAA;AAAA,MAGLK,mBAAK;AAAA,MACLjB,cAAAA,OAAO,MAAM;AACXrB,yBAAiBsB,KAAK;AAAA,UAACjC,MAAM;AAAA,QAAA,CAAgB;AAAA,MAC9C,CAAA;AAAA,IAAA,IAIE,CACLgC,cAAAA,OAAO,MAAM;AACXrB,uBAAiBsB,KAAK;AAAA,QAACjC,MAAM;AAAA,MAAA,CAAQ;AAAA,IAAA,CACtC,CAAC,CAEL;AAAA,EAEJ,CAAA,GACDxB,cAAAA,eAAe;AAAA,IACbC,IAAI;AAAA,IACJC,OAAOA,CAAC;AAAA,MAACC;AAAAA,MAAUC;AAAAA,IAAAA,MAAW;AACxBA,UAAAA,MAAMsE,SAAS,eAIHvC,iBAAiBuB,cAAcf,QAAQD,QAE3Cb,WAAW;AACd,eAAA;AAGHoB,YAAAA,aAAavC,gCAA4BP,kBAAAA,QAAQ,GACjD0D,aAAanD,0CAA6BP,QAAQ,GAClD+C,eAAeW,WAClBc,MAAM,GAAGd,WAAWhC,SAAS,CAAC,EAC9BsB,MAAMnB,oBAAoB,IAAI,CAAC;AAE9B,aAAA,CAACiB,cAAcC,iBAAiBE,SAC3B;AAAA,QAACJ,QAAQ,CAAA;AAAA,MAAA,IAKX;AAAA,QAACA,QAFOjD,OAAOsD,YAAY;AAAA,UAACC,SAASJ;AAAAA,QAAa,CAAA;AAAA,MAE3C;AAAA,IAChB;AAAA,IACA9B,SAAS,CACP,CAACC,GAAGkC,WAAW,CACb;AAAA,MACE/B,MAAM;AAAA,MACNgC,QAAQA,MAAM;AACZrB,yBAAiBsB,KAAK;AAAA,UACpBjC,MAAM;AAAA,UACNkB,SAASa,OAAOP;AAAAA,QAAAA,CACjB;AAAA,MAAA;AAAA,IACH,CACD,CACF;AAAA,EAAA,CAEJ,CAAC;AAEN;AAEA,SAASX,2BAA+C;AACtD,SAAOuC,aAAM;AAAA,IACXC,OAAO;AAAA,MACLlC,SAAS,CAAC;AAAA,MAIVmC,QAAQ,CAAA;AAAA,IAQV;AAAA,IACA1D,SAAS;AAAA,MACP,kBAAkB2D,OAAAA,OAAO;AAAA,QACvBrC,SAASA,CAAC;AAAA,UAACtC;AAAAA,QACT4E,OAAAA,OAAAA,YAAY5E,OAAO,cAAc,GAC1BA,MAAMsC;AAAAA,MAAAA,CAEhB;AAAA,MACD,iBAAiBqC,OAAAA,OAAO;AAAA,QACtBrC,SAAS,CAAA;AAAA,MAAA,CACV;AAAA,MACD,wBAAwBqC,OAAAA,OAAO;AAAA,QAC7BlC,eAAe;AAAA,MAAA,CAChB;AAAA,MACD,4BAA4BkC,OAAAA,OAAO;AAAA,QACjClC,eAAeA,CAAC;AAAA,UAACF;AAAAA,QAAAA,MACXA,QAAQE,kBAAkBF,QAAQD,QAAQb,SAAS,IAC9C,IAEFc,QAAQE,gBAAgB;AAAA,MAAA,CAElC;AAAA,MACD,4BAA4BkC,OAAAA,OAAO;AAAA,QACjClC,eAAeA,CAAC;AAAA,UAACF;AAAAA,QAAAA,MACXA,QAAQE,kBAAkB,IACrBF,QAAQD,QAAQb,SAAS,IAE3Bc,QAAQE,gBAAgB;AAAA,MAElC,CAAA;AAAA,IACH;AAAA,IACAoC,QAAQ;AAAA,MACN,cAAcC,CAAC;AAAA,QAACvC;AAAAA,MAAAA,MAAaA,QAAQD,QAAQb,WAAW;AAAA,IAAA;AAAA,EAE3D,CAAA,EAAEsD,cAAc;AAAA,IACfC,IAAI;AAAA,IACJzC,SAAS;AAAA,MACPD,SAAS,CAAE;AAAA,MACXG,eAAe;AAAA,IACjB;AAAA,IACAwC,SAAS;AAAA,IACTC,QAAQ;AAAA,MACN,MAAQ;AAAA,QACNrF,IAAI;AAAA,UACF,gBAAgB;AAAA,YACdmB,SAAS;AAAA,YACTmE,QAAQ;AAAA,UAAA;AAAA,QACV;AAAA,MAEJ;AAAA,MACA,mBAAmB;AAAA,QACjBC,QAAQ;AAAA,UACNtF,OAAO;AAAA,UACPqF,QAAQ;AAAA,QACV;AAAA,QACAE,MAAM,CAAC,sBAAsB;AAAA,QAC7BxF,IAAI;AAAA,UACF,gBAAgB;AAAA,YACdmB,SAAS;AAAA,UACX;AAAA,UACA,iBAAiB;AAAA,YACfA,SAAS;AAAA,UACX;AAAA,UACA,eAAe;AAAA,YACbA,SAAS;AAAA,UACX;AAAA,UACA,OAAS;AAAA,YACPmE,QAAQ;AAAA,YACRnE,SAAS,CAAC,wBAAwB,eAAe;AAAA,UACnD;AAAA,UACA,QAAU;AAAA,YACRmE,QAAQ;AAAA,YACRnE,SAAS,CAAC,wBAAwB,eAAe;AAAA,UAAA;AAAA,QACnD;AAAA,MACF;AAAA,IACF;AAAA,EACF,CACD;AACH;ACzZO,SAASsE,aAAa5C,MAAc;AACzC,MAAI4C,gBAAe;AACf,MAAA;AACIC,UAAAA,MAAM,IAAIC,IAAI9C,IAAI;AAExB,QAAI,CAAC+C,kBAAkBC,SAASH,IAAII,QAAQ;AACnC,aAAA;AAGTL,oBAAe;AAAA,EAAA,QACT;AAAA,EAAA;AACDA,SAAAA;AACT;AAEA,MAAMG,oBAAoB,CAAC,SAAS,UAAU,WAAW,MAAM;ACKxD,SAASG,oBAAoBjG,QAA6B;AAC/D,QAAMkG,uBAAuBjG,cAAAA,eAAe;AAAA,IAC1CC,IAAI;AAAA,IACJC,OAAOA,CAAC;AAAA,MAACC;AAAAA,MAAUC;AAAAA,IAAAA,MAAW;AACtB8F,YAAAA,qBAAqBxF,qDAA+BP,QAAQ,GAC5D2C,OAAO1C,MAAMI,YAAY2F,aAAaC,QAAQ,YAAY,GAC1DT,MAAMD,aAAa5C,IAAI,IAAIA,OAAOM,QAClCiD,aACJV,QAAQvC,SACJrD,OAAOuG,iBAAiB;AAAA,QAACX;AAAAA,QAAKY,QAAQpG,SAASwC,QAAQ4D;AAAAA,MAAO,CAAA,IAC9DnD;AAEFiD,aAAAA,cAAc,CAACH,qBACV;AAAA,QAACG;AAAAA,MAAAA,IAGH;AAAA,IACT;AAAA,IACAjF,SAAS,CACP,CAACC,GAAG;AAAA,MAACgF;AAAAA,IAAU,MAAM,CACnBrC,cAAAA,QAAQ;AAAA,MACNxC,MAAM;AAAA,MACN6E;AAAAA,IAAAA,CACD,CAAC,CACH;AAAA,EAAA,CAEJ,GACKG,mBAAmBxG,6BAAe;AAAA,IACtCC,IAAI;AAAA,IACJC,OAAOA,CAAC;AAAA,MAACC;AAAAA,MAAUC;AAAAA,IAAAA,MAAW;AACtBqG,YAAAA,YAAY/F,gCAAAA,aAAuBP,QAAQ,GAC3C+F,qBAAqBxF,qDAA+BP,QAAQ;AAE9D,UAAA,CAACsG,aAAa,CAACP;AACV,eAAA;AAGT,YAAMpD,OAAO1C,MAAMI,YAAY2F,aAAaC,QAAQ,YAAY,GAC1DT,MAAMD,aAAa5C,IAAI,IAAIA,OAAOM,QAClCiD,aACJV,QAAQvC,SACJrD,OAAOuG,iBAAiB;AAAA,QAACX;AAAAA,QAAKY,QAAQpG,SAASwC,QAAQ4D;AAAAA,MAAO,CAAA,IAC9DnD;AAEFuC,aAAAA,OAAOU,cAAcH,qBAChB;AAAA,QAACO;AAAAA,QAAWJ;AAAAA,QAAYV;AAAAA,MAAAA,IAG1B;AAAA,IACT;AAAA,IACAvE,SAAS,CACP,CAACC,GAAG;AAAA,MAACgF;AAAAA,MAAYV;AAAAA,IAAG,MAAM,CACxB3B,cAAAA,QAAQ;AAAA,MACNxC,MAAM;AAAA,MACNsB,MAAM6C;AAAAA,MACNe,aAAa,CAACL,UAAU;AAAA,IAAA,CACzB,CAAC,CACH;AAAA,EAAA,CAEJ;AAEqB,SAAA,CAACJ,sBAAsBO,gBAAgB;AAG/D;;;;;;;;;;;"}
|
|
@@ -1,10 +1,6 @@
|
|
|
1
1
|
import type {Patch} from '@portabletext/patches'
|
|
2
|
+
import {KeyedSegment, PortableTextBlock} from '@sanity/types'
|
|
2
3
|
import type {
|
|
3
|
-
ArraySchemaType,
|
|
4
|
-
BlockDecoratorDefinition,
|
|
5
|
-
BlockListDefinition,
|
|
6
|
-
BlockStyleDefinition,
|
|
7
|
-
ObjectSchemaType,
|
|
8
4
|
Path,
|
|
9
5
|
PortableTextChild,
|
|
10
6
|
PortableTextListBlock,
|
|
@@ -12,7 +8,6 @@ import type {
|
|
|
12
8
|
PortableTextSpan,
|
|
13
9
|
PortableTextTextBlock,
|
|
14
10
|
} from '@sanity/types'
|
|
15
|
-
import {KeyedSegment, PortableTextBlock} from '@sanity/types'
|
|
16
11
|
import type {
|
|
17
12
|
FocusEvent as FocusEvent_2,
|
|
18
13
|
KeyboardEvent as KeyboardEvent_2,
|
|
@@ -42,11 +37,7 @@ import {
|
|
|
42
37
|
Values,
|
|
43
38
|
} from 'xstate'
|
|
44
39
|
import {GuardArgs} from 'xstate/guards'
|
|
45
|
-
import {
|
|
46
|
-
BlockOffset,
|
|
47
|
-
EditorSelection,
|
|
48
|
-
PortableTextMemberSchemaTypes as PortableTextMemberSchemaTypes_2,
|
|
49
|
-
} from '..'
|
|
40
|
+
import {BlockOffset, EditorSelection} from '..'
|
|
50
41
|
import {EventPosition} from '../internal-utils/event-position'
|
|
51
42
|
import {MIMEType} from '../internal-utils/mime-type'
|
|
52
43
|
import {PickFromUnion, StrictExtract} from '../type-utils'
|
|
@@ -239,6 +230,14 @@ declare const abstractBehaviorEventTypes: readonly [
|
|
|
239
230
|
'style.toggle',
|
|
240
231
|
]
|
|
241
232
|
|
|
233
|
+
/**
|
|
234
|
+
* @public
|
|
235
|
+
*/
|
|
236
|
+
declare type BaseDefinition = {
|
|
237
|
+
name: string
|
|
238
|
+
title?: string
|
|
239
|
+
}
|
|
240
|
+
|
|
242
241
|
/**
|
|
243
242
|
* @beta
|
|
244
243
|
*/
|
|
@@ -9860,7 +9859,7 @@ declare const editorMachine: StateMachine<
|
|
|
9860
9859
|
converters: Set<Converter>
|
|
9861
9860
|
keyGenerator: () => string
|
|
9862
9861
|
pendingEvents: never[]
|
|
9863
|
-
schema:
|
|
9862
|
+
schema: EditorSchema
|
|
9864
9863
|
selection: null
|
|
9865
9864
|
initialReadOnly: boolean
|
|
9866
9865
|
maxBlocks: number | undefined
|
|
@@ -13340,7 +13339,65 @@ declare const editorMachine: StateMachine<
|
|
|
13340
13339
|
/**
|
|
13341
13340
|
* @public
|
|
13342
13341
|
*/
|
|
13343
|
-
declare type EditorSchema =
|
|
13342
|
+
declare type EditorSchema = {
|
|
13343
|
+
annotations: ReadonlyArray<
|
|
13344
|
+
BaseDefinition & {
|
|
13345
|
+
fields: ReadonlyArray<{
|
|
13346
|
+
name: string
|
|
13347
|
+
type: string
|
|
13348
|
+
}>
|
|
13349
|
+
}
|
|
13350
|
+
>
|
|
13351
|
+
block: {
|
|
13352
|
+
name: string
|
|
13353
|
+
}
|
|
13354
|
+
blockObjects: ReadonlyArray<
|
|
13355
|
+
BaseDefinition & {
|
|
13356
|
+
fields: ReadonlyArray<{
|
|
13357
|
+
name: string
|
|
13358
|
+
type: string
|
|
13359
|
+
}>
|
|
13360
|
+
}
|
|
13361
|
+
>
|
|
13362
|
+
decorators: ReadonlyArray<
|
|
13363
|
+
BaseDefinition & {
|
|
13364
|
+
/**
|
|
13365
|
+
* @deprecated
|
|
13366
|
+
* Use `name` instead
|
|
13367
|
+
*/
|
|
13368
|
+
value: string
|
|
13369
|
+
}
|
|
13370
|
+
>
|
|
13371
|
+
inlineObjects: ReadonlyArray<
|
|
13372
|
+
BaseDefinition & {
|
|
13373
|
+
fields: ReadonlyArray<{
|
|
13374
|
+
name: string
|
|
13375
|
+
type: string
|
|
13376
|
+
}>
|
|
13377
|
+
}
|
|
13378
|
+
>
|
|
13379
|
+
span: {
|
|
13380
|
+
name: string
|
|
13381
|
+
}
|
|
13382
|
+
styles: ReadonlyArray<
|
|
13383
|
+
BaseDefinition & {
|
|
13384
|
+
/**
|
|
13385
|
+
* @deprecated
|
|
13386
|
+
* Use `name` instead
|
|
13387
|
+
*/
|
|
13388
|
+
value: string
|
|
13389
|
+
}
|
|
13390
|
+
>
|
|
13391
|
+
lists: ReadonlyArray<
|
|
13392
|
+
BaseDefinition & {
|
|
13393
|
+
/**
|
|
13394
|
+
* @deprecated
|
|
13395
|
+
* Use `name` instead
|
|
13396
|
+
*/
|
|
13397
|
+
value: string
|
|
13398
|
+
}
|
|
13399
|
+
>
|
|
13400
|
+
}
|
|
13344
13401
|
|
|
13345
13402
|
/** @public */
|
|
13346
13403
|
declare type EditorSelection_2 = {
|
|
@@ -13634,21 +13691,6 @@ declare type PickFromUnion_2<
|
|
|
13634
13691
|
TPickedTags extends TUnion[TTagKey],
|
|
13635
13692
|
> = TUnion extends Record<TTagKey, TPickedTags> ? TUnion : never
|
|
13636
13693
|
|
|
13637
|
-
/** @beta */
|
|
13638
|
-
declare type PortableTextMemberSchemaTypes = {
|
|
13639
|
-
annotations: (ObjectSchemaType & {
|
|
13640
|
-
i18nTitleKey?: string
|
|
13641
|
-
})[]
|
|
13642
|
-
block: ObjectSchemaType
|
|
13643
|
-
blockObjects: ObjectSchemaType[]
|
|
13644
|
-
decorators: BlockDecoratorDefinition[]
|
|
13645
|
-
inlineObjects: ObjectSchemaType[]
|
|
13646
|
-
portableText: ArraySchemaType<PortableTextBlock>
|
|
13647
|
-
span: ObjectSchemaType
|
|
13648
|
-
styles: BlockStyleDefinition[]
|
|
13649
|
-
lists: BlockListDefinition[]
|
|
13650
|
-
}
|
|
13651
|
-
|
|
13652
13694
|
declare interface PortableTextSlateEditor extends ReactEditor {
|
|
13653
13695
|
_key: 'editor'
|
|
13654
13696
|
_type: 'editor'
|