@portabletext/editor 1.49.13 → 1.50.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -49,7 +49,100 @@ const getAnchorBlock = (snapshot) => {
49
49
  start,
50
50
  end
51
51
  } : void 0;
52
- }, getSelection = (snapshot) => snapshot.context.selection, getValue = (snapshot) => snapshot.context.value;
52
+ };
53
+ function getListState({
54
+ path
55
+ }) {
56
+ return (snapshot) => {
57
+ const selection = {
58
+ anchor: {
59
+ path,
60
+ offset: 0
61
+ },
62
+ focus: {
63
+ path,
64
+ offset: 0
65
+ }
66
+ }, focusTextBlock = selector_isSelectionExpanded.getFocusTextBlock({
67
+ context: {
68
+ ...snapshot.context,
69
+ selection
70
+ }
71
+ });
72
+ if (!focusTextBlock || focusTextBlock.node.listItem === void 0 || focusTextBlock.node.level === void 0)
73
+ return;
74
+ const previousListItem = getPreviousListItem({
75
+ listItem: focusTextBlock.node.listItem,
76
+ level: focusTextBlock.node.level
77
+ })({
78
+ ...snapshot,
79
+ context: {
80
+ ...snapshot.context,
81
+ selection
82
+ }
83
+ });
84
+ if (!previousListItem)
85
+ return {
86
+ index: 1
87
+ };
88
+ if (previousListItem.node.listItem !== focusTextBlock.node.listItem)
89
+ return {
90
+ index: 1
91
+ };
92
+ if (previousListItem.node.level !== void 0 && previousListItem.node.level < focusTextBlock.node.level)
93
+ return {
94
+ index: 1
95
+ };
96
+ const previousListItemListState = getListState({
97
+ path: previousListItem.path
98
+ })(snapshot);
99
+ return previousListItemListState === void 0 ? {
100
+ index: 1
101
+ } : {
102
+ index: previousListItemListState.index + 1
103
+ };
104
+ };
105
+ }
106
+ function getPreviousListItem({
107
+ listItem,
108
+ level
109
+ }) {
110
+ return (snapshot) => {
111
+ const previousBlock = selector_isSelectionExpanded.getPreviousBlock({
112
+ context: {
113
+ ...snapshot.context
114
+ }
115
+ });
116
+ if (previousBlock && util_sliceBlocks.isTextBlock(snapshot.context, previousBlock.node) && !(previousBlock.node.listItem === void 0 || previousBlock.node.level === void 0) && previousBlock.node.listItem === listItem) {
117
+ if (previousBlock.node.level === level)
118
+ return {
119
+ node: previousBlock.node,
120
+ path: previousBlock.path
121
+ };
122
+ if (!(previousBlock.node.level < level))
123
+ return getPreviousListItem({
124
+ listItem,
125
+ level
126
+ })({
127
+ ...snapshot,
128
+ context: {
129
+ ...snapshot.context,
130
+ selection: {
131
+ anchor: {
132
+ path: previousBlock.path,
133
+ offset: 0
134
+ },
135
+ focus: {
136
+ path: previousBlock.path,
137
+ offset: 0
138
+ }
139
+ }
140
+ }
141
+ });
142
+ }
143
+ };
144
+ }
145
+ const getSelection = (snapshot) => snapshot.context.selection, getValue = (snapshot) => snapshot.context.value;
53
146
  exports.getActiveAnnotations = selector_isSelectingEntireBlocks.getActiveAnnotations;
54
147
  exports.getActiveListItem = selector_isSelectingEntireBlocks.getActiveListItem;
55
148
  exports.getActiveStyle = selector_isSelectingEntireBlocks.getActiveStyle;
@@ -95,6 +188,7 @@ exports.getAnchorChild = getAnchorChild;
95
188
  exports.getAnchorSpan = getAnchorSpan;
96
189
  exports.getAnchorTextBlock = getAnchorTextBlock;
97
190
  exports.getBlockOffsets = getBlockOffsets;
191
+ exports.getListState = getListState;
98
192
  exports.getSelection = getSelection;
99
193
  exports.getValue = getValue;
100
194
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../../src/selectors/selector.get-anchor-block.ts","../../src/selectors/selector.get-anchor-text-block.ts","../../src/selectors/selector.get-anchor-child.ts","../../src/selectors/selector.get-anchor-span.ts","../../src/selectors/selector.get-block-offsets.ts","../../src/selectors/selector.get-selection.ts","../../src/selectors/selector.get-value.ts"],"sourcesContent":["import type {KeyedSegment, PortableTextBlock} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport {isKeyedSegment} from '../utils'\n\n/**\n * @public\n */\nexport const getAnchorBlock: EditorSelector<\n {node: PortableTextBlock; path: [KeyedSegment]} | undefined\n> = (snapshot) => {\n const key = snapshot.context.selection\n ? isKeyedSegment(snapshot.context.selection.anchor.path[0])\n ? snapshot.context.selection.anchor.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","import type {KeyedSegment, PortableTextTextBlock} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport {isTextBlock} from '../internal-utils/parse-blocks'\nimport {getAnchorBlock} from './selector.get-anchor-block'\n\n/**\n * @public\n */\nexport const getAnchorTextBlock: EditorSelector<\n {node: PortableTextTextBlock; path: [KeyedSegment]} | undefined\n> = (snapshot) => {\n const anchorBlock = getAnchorBlock(snapshot)\n\n return anchorBlock && isTextBlock(snapshot.context, anchorBlock.node)\n ? {node: anchorBlock.node, path: anchorBlock.path}\n : undefined\n}\n","import type {KeyedSegment} from '@portabletext/patches'\nimport type {PortableTextObject, PortableTextSpan} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport {isKeyedSegment} from '../utils'\nimport {getAnchorTextBlock} from './selector.get-anchor-text-block'\n\n/**\n * @public\n */\nexport const getAnchorChild: EditorSelector<\n | {\n node: PortableTextObject | PortableTextSpan\n path: [KeyedSegment, 'children', KeyedSegment]\n }\n | undefined\n> = (snapshot) => {\n const anchorBlock = getAnchorTextBlock(snapshot)\n\n if (!anchorBlock) {\n return undefined\n }\n\n const key = snapshot.context.selection\n ? isKeyedSegment(snapshot.context.selection.anchor.path[2])\n ? snapshot.context.selection.anchor.path[2]._key\n : undefined\n : undefined\n\n const node = key\n ? anchorBlock.node.children.find((span) => span._key === key)\n : undefined\n\n return node && key\n ? {node, path: [...anchorBlock.path, 'children', {_key: key}]}\n : undefined\n}\n","import type {KeyedSegment} from '@portabletext/patches'\nimport {isPortableTextSpan, type PortableTextSpan} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport {getAnchorChild} from './selector.get-anchor-child'\n\n/**\n * @public\n */\nexport const getAnchorSpan: EditorSelector<\n | {node: PortableTextSpan; path: [KeyedSegment, 'children', KeyedSegment]}\n | undefined\n> = (snapshot) => {\n const anchorChild = getAnchorChild(snapshot)\n\n return anchorChild && isPortableTextSpan(anchorChild.node)\n ? {node: anchorChild.node, path: anchorChild.path}\n : undefined\n}\n","import type {EditorSelector} from '../editor/editor-selector'\nimport type {BlockOffset} from '../types/block-offset'\nimport * as utils from '../utils'\nimport {getSelectionEndPoint} from './selector.get-selection-end-point'\nimport {getSelectionStartPoint} from './selector.get-selection-start-point'\n\n/**\n * @public\n */\nexport const getBlockOffsets: EditorSelector<\n {start: BlockOffset; end: BlockOffset} | undefined\n> = (snapshot) => {\n if (!snapshot.context.selection) {\n return undefined\n }\n\n const selectionStartPoint = getSelectionStartPoint(snapshot)\n const selectionEndPoint = getSelectionEndPoint(snapshot)\n\n if (!selectionStartPoint || !selectionEndPoint) {\n return undefined\n }\n\n const start = utils.spanSelectionPointToBlockOffset({\n context: snapshot.context,\n selectionPoint: selectionStartPoint,\n })\n const end = utils.spanSelectionPointToBlockOffset({\n context: snapshot.context,\n selectionPoint: selectionEndPoint,\n })\n\n return start && end ? {start, end} : undefined\n}\n","import type {EditorSelection} from '..'\nimport type {EditorSelector} from '../editor/editor-selector'\n\n/**\n * @public\n */\nexport const getSelection: EditorSelector<EditorSelection> = (snapshot) => {\n return snapshot.context.selection\n}\n","import type {PortableTextBlock} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\n\n/**\n * @public\n */\nexport const getValue: EditorSelector<Array<PortableTextBlock>> = (\n snapshot,\n) => {\n return snapshot.context.value\n}\n"],"names":["getAnchorBlock","snapshot","key","context","selection","isKeyedSegment","anchor","path","_key","undefined","node","value","find","block","getAnchorTextBlock","anchorBlock","isTextBlock","getAnchorChild","children","span","getAnchorSpan","anchorChild","isPortableTextSpan","getBlockOffsets","selectionStartPoint","getSelectionStartPoint","selectionEndPoint","getSelectionEndPoint","start","utils","selectionPoint","end","getSelection","getValue"],"mappings":";;;AAOO,MAAMA,iBAERC,CAAa,aAAA;AAChB,QAAMC,MAAMD,SAASE,QAAQC,aACzBC,iBAAAA,eAAeJ,SAASE,QAAQC,UAAUE,OAAOC,KAAK,CAAC,CAAC,IACtDN,SAASE,QAAQC,UAAUE,OAAOC,KAAK,CAAC,EAAEC,OAE5CC,QAEEC,OAAOR,MACTD,SAASE,QAAQQ,MAAMC,KAAMC,CAAAA,UAAUA,MAAML,SAASN,GAAG,IACzDO;AAEJ,SAAOC,QAAQR,MAAM;AAAA,IAACQ;AAAAA,IAAMH,MAAM,CAAC;AAAA,MAACC,MAAMN;AAAAA,IAAI,CAAA;AAAA,EAAA,IAAKO;AACrD,GCbaK,qBAERb,CAAa,aAAA;AACVc,QAAAA,cAAcf,eAAeC,QAAQ;AAE3C,SAAOc,eAAeC,iBAAAA,YAAYf,SAASE,SAASY,YAAYL,IAAI,IAChE;AAAA,IAACA,MAAMK,YAAYL;AAAAA,IAAMH,MAAMQ,YAAYR;AAAAA,EAAAA,IAC3CE;AACN,GCPaQ,iBAMRhB,CAAa,aAAA;AACVc,QAAAA,cAAcD,mBAAmBb,QAAQ;AAE/C,MAAI,CAACc;AACH;AAGF,QAAMb,MAAMD,SAASE,QAAQC,aACzBC,iBAAAA,eAAeJ,SAASE,QAAQC,UAAUE,OAAOC,KAAK,CAAC,CAAC,IACtDN,SAASE,QAAQC,UAAUE,OAAOC,KAAK,CAAC,EAAEC,OAE5CC,QAEEC,OAAOR,MACTa,YAAYL,KAAKQ,SAASN,KAAMO,CAAAA,SAASA,KAAKX,SAASN,GAAG,IAC1DO;AAEJ,SAAOC,QAAQR,MACX;AAAA,IAACQ;AAAAA,IAAMH,MAAM,CAAC,GAAGQ,YAAYR,MAAM,YAAY;AAAA,MAACC,MAAMN;AAAAA,IAAI,CAAA;AAAA,EAAA,IAC1DO;AACN,GC3BaW,gBAGRnB,CAAa,aAAA;AACVoB,QAAAA,cAAcJ,eAAehB,QAAQ;AAE3C,SAAOoB,eAAeC,MAAAA,mBAAmBD,YAAYX,IAAI,IACrD;AAAA,IAACA,MAAMW,YAAYX;AAAAA,IAAMH,MAAMc,YAAYd;AAAAA,EAAAA,IAC3CE;AACN,GCRac,kBAERtB,CAAa,aAAA;AACZ,MAAA,CAACA,SAASE,QAAQC;AACpB;AAGF,QAAMoB,sBAAsBC,6BAAAA,uBAAuBxB,QAAQ,GACrDyB,oBAAoBC,sDAAqB1B,QAAQ;AAEnD,MAAA,CAACuB,uBAAuB,CAACE;AAC3B;AAGIE,QAAAA,QAAQC,iBAAAA,gCAAsC;AAAA,IAClD1B,SAASF,SAASE;AAAAA,IAClB2B,gBAAgBN;AAAAA,EAAAA,CACjB,GACKO,MAAMF,iDAAsC;AAAA,IAChD1B,SAASF,SAASE;AAAAA,IAClB2B,gBAAgBJ;AAAAA,EAAAA,CACjB;AAED,SAAOE,SAASG,MAAM;AAAA,IAACH;AAAAA,IAAOG;AAAAA,EAAAA,IAAOtB;AACvC,GC3BauB,eAAiD/B,CACrDA,aAAAA,SAASE,QAAQC,WCDb6B,WACXhC,CAEOA,aAAAA,SAASE,QAAQQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.cjs","sources":["../../src/selectors/selector.get-anchor-block.ts","../../src/selectors/selector.get-anchor-text-block.ts","../../src/selectors/selector.get-anchor-child.ts","../../src/selectors/selector.get-anchor-span.ts","../../src/selectors/selector.get-block-offsets.ts","../../src/selectors/selector.get-list-state.ts","../../src/selectors/selector.get-selection.ts","../../src/selectors/selector.get-value.ts"],"sourcesContent":["import type {KeyedSegment, PortableTextBlock} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport {isKeyedSegment} from '../utils'\n\n/**\n * @public\n */\nexport const getAnchorBlock: EditorSelector<\n {node: PortableTextBlock; path: [KeyedSegment]} | undefined\n> = (snapshot) => {\n const key = snapshot.context.selection\n ? isKeyedSegment(snapshot.context.selection.anchor.path[0])\n ? snapshot.context.selection.anchor.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","import type {KeyedSegment, PortableTextTextBlock} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport {isTextBlock} from '../internal-utils/parse-blocks'\nimport {getAnchorBlock} from './selector.get-anchor-block'\n\n/**\n * @public\n */\nexport const getAnchorTextBlock: EditorSelector<\n {node: PortableTextTextBlock; path: [KeyedSegment]} | undefined\n> = (snapshot) => {\n const anchorBlock = getAnchorBlock(snapshot)\n\n return anchorBlock && isTextBlock(snapshot.context, anchorBlock.node)\n ? {node: anchorBlock.node, path: anchorBlock.path}\n : undefined\n}\n","import type {KeyedSegment} from '@portabletext/patches'\nimport type {PortableTextObject, PortableTextSpan} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport {isKeyedSegment} from '../utils'\nimport {getAnchorTextBlock} from './selector.get-anchor-text-block'\n\n/**\n * @public\n */\nexport const getAnchorChild: EditorSelector<\n | {\n node: PortableTextObject | PortableTextSpan\n path: [KeyedSegment, 'children', KeyedSegment]\n }\n | undefined\n> = (snapshot) => {\n const anchorBlock = getAnchorTextBlock(snapshot)\n\n if (!anchorBlock) {\n return undefined\n }\n\n const key = snapshot.context.selection\n ? isKeyedSegment(snapshot.context.selection.anchor.path[2])\n ? snapshot.context.selection.anchor.path[2]._key\n : undefined\n : undefined\n\n const node = key\n ? anchorBlock.node.children.find((span) => span._key === key)\n : undefined\n\n return node && key\n ? {node, path: [...anchorBlock.path, 'children', {_key: key}]}\n : undefined\n}\n","import type {KeyedSegment} from '@portabletext/patches'\nimport {isPortableTextSpan, type PortableTextSpan} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport {getAnchorChild} from './selector.get-anchor-child'\n\n/**\n * @public\n */\nexport const getAnchorSpan: EditorSelector<\n | {node: PortableTextSpan; path: [KeyedSegment, 'children', KeyedSegment]}\n | undefined\n> = (snapshot) => {\n const anchorChild = getAnchorChild(snapshot)\n\n return anchorChild && isPortableTextSpan(anchorChild.node)\n ? {node: anchorChild.node, path: anchorChild.path}\n : undefined\n}\n","import type {EditorSelector} from '../editor/editor-selector'\nimport type {BlockOffset} from '../types/block-offset'\nimport * as utils from '../utils'\nimport {getSelectionEndPoint} from './selector.get-selection-end-point'\nimport {getSelectionStartPoint} from './selector.get-selection-start-point'\n\n/**\n * @public\n */\nexport const getBlockOffsets: EditorSelector<\n {start: BlockOffset; end: BlockOffset} | undefined\n> = (snapshot) => {\n if (!snapshot.context.selection) {\n return undefined\n }\n\n const selectionStartPoint = getSelectionStartPoint(snapshot)\n const selectionEndPoint = getSelectionEndPoint(snapshot)\n\n if (!selectionStartPoint || !selectionEndPoint) {\n return undefined\n }\n\n const start = utils.spanSelectionPointToBlockOffset({\n context: snapshot.context,\n selectionPoint: selectionStartPoint,\n })\n const end = utils.spanSelectionPointToBlockOffset({\n context: snapshot.context,\n selectionPoint: selectionEndPoint,\n })\n\n return start && end ? {start, end} : undefined\n}\n","import type {PortableTextTextBlock} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport {isTextBlock} from '../internal-utils/parse-blocks'\nimport type {BlockPath} from '../types/paths'\nimport {getFocusTextBlock, getPreviousBlock} from './selectors'\n\n/**\n * @beta\n * Represents the List state of a block.\n */\nexport type ListState = {\n index: number\n}\n\n/**\n * @beta\n * Given the `path` of a block, this selector will return the `ListState` of\n * the block.\n */\nexport function getListState({\n path,\n}: {\n path: BlockPath\n}): EditorSelector<ListState | undefined> {\n return (snapshot) => {\n const selection = {\n anchor: {\n path,\n offset: 0,\n },\n focus: {\n path,\n offset: 0,\n },\n }\n\n const focusTextBlock = getFocusTextBlock({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection,\n },\n })\n\n if (!focusTextBlock) {\n return undefined\n }\n\n if (\n focusTextBlock.node.listItem === undefined ||\n focusTextBlock.node.level === undefined\n ) {\n return undefined\n }\n\n const previousListItem = getPreviousListItem({\n listItem: focusTextBlock.node.listItem,\n level: focusTextBlock.node.level,\n })({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection,\n },\n })\n\n if (!previousListItem) {\n return {\n index: 1,\n }\n }\n\n if (previousListItem.node.listItem !== focusTextBlock.node.listItem) {\n return {\n index: 1,\n }\n }\n\n if (\n previousListItem.node.level !== undefined &&\n previousListItem.node.level < focusTextBlock.node.level\n ) {\n return {\n index: 1,\n }\n }\n\n const previousListItemListState = getListState({\n path: previousListItem.path,\n })(snapshot)\n\n if (previousListItemListState === undefined) {\n return {\n index: 1,\n }\n }\n\n return {\n index: previousListItemListState.index + 1,\n }\n }\n}\n\nfunction getPreviousListItem({\n listItem,\n level,\n}: {\n listItem: string\n level: number\n}): EditorSelector<\n | {\n node: PortableTextTextBlock\n path: [{_key: string}]\n }\n | undefined\n> {\n return (snapshot) => {\n const previousBlock = getPreviousBlock({\n ...snapshot,\n context: {\n ...snapshot.context,\n },\n })\n\n if (!previousBlock) {\n return undefined\n }\n\n if (!isTextBlock(snapshot.context, previousBlock.node)) {\n return undefined\n }\n\n if (\n previousBlock.node.listItem === undefined ||\n previousBlock.node.level === undefined\n ) {\n return undefined\n }\n\n if (previousBlock.node.listItem !== listItem) {\n return undefined\n }\n\n if (previousBlock.node.level === level) {\n return {\n node: previousBlock.node,\n path: previousBlock.path,\n }\n }\n\n if (previousBlock.node.level < level) {\n return undefined\n }\n\n return getPreviousListItem({\n listItem,\n level,\n })({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection: {\n anchor: {\n path: previousBlock.path,\n offset: 0,\n },\n focus: {\n path: previousBlock.path,\n offset: 0,\n },\n },\n },\n })\n }\n}\n","import type {EditorSelection} from '..'\nimport type {EditorSelector} from '../editor/editor-selector'\n\n/**\n * @public\n */\nexport const getSelection: EditorSelector<EditorSelection> = (snapshot) => {\n return snapshot.context.selection\n}\n","import type {PortableTextBlock} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\n\n/**\n * @public\n */\nexport const getValue: EditorSelector<Array<PortableTextBlock>> = (\n snapshot,\n) => {\n return snapshot.context.value\n}\n"],"names":["getAnchorBlock","snapshot","key","context","selection","isKeyedSegment","anchor","path","_key","undefined","node","value","find","block","getAnchorTextBlock","anchorBlock","isTextBlock","getAnchorChild","children","span","getAnchorSpan","anchorChild","isPortableTextSpan","getBlockOffsets","selectionStartPoint","getSelectionStartPoint","selectionEndPoint","getSelectionEndPoint","start","utils","selectionPoint","end","getListState","offset","focus","focusTextBlock","getFocusTextBlock","listItem","level","previousListItem","getPreviousListItem","index","previousListItemListState","previousBlock","getPreviousBlock","getSelection","getValue"],"mappings":"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"}
@@ -317,6 +317,12 @@ declare type BlockOffset = {
317
317
  offset: number
318
318
  }
319
319
 
320
+ declare type BlockPath = [
321
+ {
322
+ _key: string
323
+ },
324
+ ]
325
+
320
326
  declare type BlockWithOptionalKey =
321
327
  | TextBlockWithOptionalKey
322
328
  | ObjectBlockWithOptionalKey
@@ -2630,6 +2636,17 @@ export declare const getLastBlock: EditorSelector<
2630
2636
  | undefined
2631
2637
  >
2632
2638
 
2639
+ /**
2640
+ * @beta
2641
+ * Given the `path` of a block, this selector will return the `ListState` of
2642
+ * the block.
2643
+ */
2644
+ export declare function getListState({
2645
+ path,
2646
+ }: {
2647
+ path: BlockPath
2648
+ }): EditorSelector<ListState | undefined>
2649
+
2633
2650
  /**
2634
2651
  * @public
2635
2652
  */
@@ -2897,6 +2914,14 @@ declare type KeyboardBehaviorEvent =
2897
2914
  >
2898
2915
  }
2899
2916
 
2917
+ /**
2918
+ * @beta
2919
+ * Represents the List state of a block.
2920
+ */
2921
+ declare type ListState = {
2922
+ index: number
2923
+ }
2924
+
2900
2925
  declare type MIMEType = `${string}/${string}`
2901
2926
 
2902
2927
  declare type MouseBehaviorEvent = {
@@ -317,6 +317,12 @@ declare type BlockOffset = {
317
317
  offset: number
318
318
  }
319
319
 
320
+ declare type BlockPath = [
321
+ {
322
+ _key: string
323
+ },
324
+ ]
325
+
320
326
  declare type BlockWithOptionalKey =
321
327
  | TextBlockWithOptionalKey
322
328
  | ObjectBlockWithOptionalKey
@@ -2630,6 +2636,17 @@ export declare const getLastBlock: EditorSelector<
2630
2636
  | undefined
2631
2637
  >
2632
2638
 
2639
+ /**
2640
+ * @beta
2641
+ * Given the `path` of a block, this selector will return the `ListState` of
2642
+ * the block.
2643
+ */
2644
+ export declare function getListState({
2645
+ path,
2646
+ }: {
2647
+ path: BlockPath
2648
+ }): EditorSelector<ListState | undefined>
2649
+
2633
2650
  /**
2634
2651
  * @public
2635
2652
  */
@@ -2897,6 +2914,14 @@ declare type KeyboardBehaviorEvent =
2897
2914
  >
2898
2915
  }
2899
2916
 
2917
+ /**
2918
+ * @beta
2919
+ * Represents the List state of a block.
2920
+ */
2921
+ declare type ListState = {
2922
+ index: number
2923
+ }
2924
+
2900
2925
  declare type MIMEType = `${string}/${string}`
2901
2926
 
2902
2927
  declare type MouseBehaviorEvent = {
@@ -2,8 +2,8 @@ import { getSelectionEndPoint } from "../_chunks-es/selector.is-selecting-entire
2
2
  import { getActiveAnnotations, getActiveListItem, getActiveStyle, getCaretWordSelection, getFocusInlineObject, getNextInlineObject, getSelectedSpans, getSelectedTextBlocks, getTrimmedSelection, isActiveAnnotation, isActiveDecorator, isActiveListItem, isActiveStyle, isAtTheEndOfBlock, isAtTheStartOfBlock, isOverlappingSelection, isPointAfterSelection, isPointBeforeSelection, isSelectingEntireBlocks } from "../_chunks-es/selector.is-selecting-entire-blocks.js";
3
3
  import { isKeyedSegment, isTextBlock, spanSelectionPointToBlockOffset } from "../_chunks-es/util.slice-blocks.js";
4
4
  import { isPortableTextSpan } from "@sanity/types";
5
- import { getSelectionStartPoint } from "../_chunks-es/selector.is-selection-expanded.js";
6
- import { getFirstBlock, getFocusBlock, getFocusBlockObject, getFocusChild, getFocusListBlock, getFocusSpan, getFocusTextBlock, getLastBlock, getNextBlock, getPreviousBlock, getPreviousInlineObject, getSelectedBlocks, getSelectedSlice, getSelectionEndBlock, getSelectionStartBlock, getSelectionText, isSelectionCollapsed, isSelectionExpanded } from "../_chunks-es/selector.is-selection-expanded.js";
5
+ import { getSelectionStartPoint, getFocusTextBlock, getPreviousBlock } from "../_chunks-es/selector.is-selection-expanded.js";
6
+ import { getFirstBlock, getFocusBlock, getFocusBlockObject, getFocusChild, getFocusListBlock, getFocusSpan, getLastBlock, getNextBlock, getPreviousInlineObject, getSelectedBlocks, getSelectedSlice, getSelectionEndBlock, getSelectionStartBlock, getSelectionText, isSelectionCollapsed, isSelectionExpanded } from "../_chunks-es/selector.is-selection-expanded.js";
7
7
  import { getBlockTextBefore } from "../_chunks-es/selector.get-text-before.js";
8
8
  const getAnchorBlock = (snapshot) => {
9
9
  const key = snapshot.context.selection && isKeyedSegment(snapshot.context.selection.anchor.path[0]) ? snapshot.context.selection.anchor.path[0]._key : void 0, node = key ? snapshot.context.value.find((block) => block._key === key) : void 0;
@@ -53,7 +53,100 @@ const getAnchorBlock = (snapshot) => {
53
53
  start,
54
54
  end
55
55
  } : void 0;
56
- }, getSelection = (snapshot) => snapshot.context.selection, getValue = (snapshot) => snapshot.context.value;
56
+ };
57
+ function getListState({
58
+ path
59
+ }) {
60
+ return (snapshot) => {
61
+ const selection = {
62
+ anchor: {
63
+ path,
64
+ offset: 0
65
+ },
66
+ focus: {
67
+ path,
68
+ offset: 0
69
+ }
70
+ }, focusTextBlock = getFocusTextBlock({
71
+ context: {
72
+ ...snapshot.context,
73
+ selection
74
+ }
75
+ });
76
+ if (!focusTextBlock || focusTextBlock.node.listItem === void 0 || focusTextBlock.node.level === void 0)
77
+ return;
78
+ const previousListItem = getPreviousListItem({
79
+ listItem: focusTextBlock.node.listItem,
80
+ level: focusTextBlock.node.level
81
+ })({
82
+ ...snapshot,
83
+ context: {
84
+ ...snapshot.context,
85
+ selection
86
+ }
87
+ });
88
+ if (!previousListItem)
89
+ return {
90
+ index: 1
91
+ };
92
+ if (previousListItem.node.listItem !== focusTextBlock.node.listItem)
93
+ return {
94
+ index: 1
95
+ };
96
+ if (previousListItem.node.level !== void 0 && previousListItem.node.level < focusTextBlock.node.level)
97
+ return {
98
+ index: 1
99
+ };
100
+ const previousListItemListState = getListState({
101
+ path: previousListItem.path
102
+ })(snapshot);
103
+ return previousListItemListState === void 0 ? {
104
+ index: 1
105
+ } : {
106
+ index: previousListItemListState.index + 1
107
+ };
108
+ };
109
+ }
110
+ function getPreviousListItem({
111
+ listItem,
112
+ level
113
+ }) {
114
+ return (snapshot) => {
115
+ const previousBlock = getPreviousBlock({
116
+ context: {
117
+ ...snapshot.context
118
+ }
119
+ });
120
+ if (previousBlock && isTextBlock(snapshot.context, previousBlock.node) && !(previousBlock.node.listItem === void 0 || previousBlock.node.level === void 0) && previousBlock.node.listItem === listItem) {
121
+ if (previousBlock.node.level === level)
122
+ return {
123
+ node: previousBlock.node,
124
+ path: previousBlock.path
125
+ };
126
+ if (!(previousBlock.node.level < level))
127
+ return getPreviousListItem({
128
+ listItem,
129
+ level
130
+ })({
131
+ ...snapshot,
132
+ context: {
133
+ ...snapshot.context,
134
+ selection: {
135
+ anchor: {
136
+ path: previousBlock.path,
137
+ offset: 0
138
+ },
139
+ focus: {
140
+ path: previousBlock.path,
141
+ offset: 0
142
+ }
143
+ }
144
+ }
145
+ });
146
+ }
147
+ };
148
+ }
149
+ const getSelection = (snapshot) => snapshot.context.selection, getValue = (snapshot) => snapshot.context.value;
57
150
  export {
58
151
  getActiveAnnotations,
59
152
  getActiveListItem,
@@ -74,6 +167,7 @@ export {
74
167
  getFocusSpan,
75
168
  getFocusTextBlock,
76
169
  getLastBlock,
170
+ getListState,
77
171
  getNextBlock,
78
172
  getNextInlineObject,
79
173
  getPreviousBlock,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/selectors/selector.get-anchor-block.ts","../../src/selectors/selector.get-anchor-text-block.ts","../../src/selectors/selector.get-anchor-child.ts","../../src/selectors/selector.get-anchor-span.ts","../../src/selectors/selector.get-block-offsets.ts","../../src/selectors/selector.get-selection.ts","../../src/selectors/selector.get-value.ts"],"sourcesContent":["import type {KeyedSegment, PortableTextBlock} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport {isKeyedSegment} from '../utils'\n\n/**\n * @public\n */\nexport const getAnchorBlock: EditorSelector<\n {node: PortableTextBlock; path: [KeyedSegment]} | undefined\n> = (snapshot) => {\n const key = snapshot.context.selection\n ? isKeyedSegment(snapshot.context.selection.anchor.path[0])\n ? snapshot.context.selection.anchor.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","import type {KeyedSegment, PortableTextTextBlock} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport {isTextBlock} from '../internal-utils/parse-blocks'\nimport {getAnchorBlock} from './selector.get-anchor-block'\n\n/**\n * @public\n */\nexport const getAnchorTextBlock: EditorSelector<\n {node: PortableTextTextBlock; path: [KeyedSegment]} | undefined\n> = (snapshot) => {\n const anchorBlock = getAnchorBlock(snapshot)\n\n return anchorBlock && isTextBlock(snapshot.context, anchorBlock.node)\n ? {node: anchorBlock.node, path: anchorBlock.path}\n : undefined\n}\n","import type {KeyedSegment} from '@portabletext/patches'\nimport type {PortableTextObject, PortableTextSpan} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport {isKeyedSegment} from '../utils'\nimport {getAnchorTextBlock} from './selector.get-anchor-text-block'\n\n/**\n * @public\n */\nexport const getAnchorChild: EditorSelector<\n | {\n node: PortableTextObject | PortableTextSpan\n path: [KeyedSegment, 'children', KeyedSegment]\n }\n | undefined\n> = (snapshot) => {\n const anchorBlock = getAnchorTextBlock(snapshot)\n\n if (!anchorBlock) {\n return undefined\n }\n\n const key = snapshot.context.selection\n ? isKeyedSegment(snapshot.context.selection.anchor.path[2])\n ? snapshot.context.selection.anchor.path[2]._key\n : undefined\n : undefined\n\n const node = key\n ? anchorBlock.node.children.find((span) => span._key === key)\n : undefined\n\n return node && key\n ? {node, path: [...anchorBlock.path, 'children', {_key: key}]}\n : undefined\n}\n","import type {KeyedSegment} from '@portabletext/patches'\nimport {isPortableTextSpan, type PortableTextSpan} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport {getAnchorChild} from './selector.get-anchor-child'\n\n/**\n * @public\n */\nexport const getAnchorSpan: EditorSelector<\n | {node: PortableTextSpan; path: [KeyedSegment, 'children', KeyedSegment]}\n | undefined\n> = (snapshot) => {\n const anchorChild = getAnchorChild(snapshot)\n\n return anchorChild && isPortableTextSpan(anchorChild.node)\n ? {node: anchorChild.node, path: anchorChild.path}\n : undefined\n}\n","import type {EditorSelector} from '../editor/editor-selector'\nimport type {BlockOffset} from '../types/block-offset'\nimport * as utils from '../utils'\nimport {getSelectionEndPoint} from './selector.get-selection-end-point'\nimport {getSelectionStartPoint} from './selector.get-selection-start-point'\n\n/**\n * @public\n */\nexport const getBlockOffsets: EditorSelector<\n {start: BlockOffset; end: BlockOffset} | undefined\n> = (snapshot) => {\n if (!snapshot.context.selection) {\n return undefined\n }\n\n const selectionStartPoint = getSelectionStartPoint(snapshot)\n const selectionEndPoint = getSelectionEndPoint(snapshot)\n\n if (!selectionStartPoint || !selectionEndPoint) {\n return undefined\n }\n\n const start = utils.spanSelectionPointToBlockOffset({\n context: snapshot.context,\n selectionPoint: selectionStartPoint,\n })\n const end = utils.spanSelectionPointToBlockOffset({\n context: snapshot.context,\n selectionPoint: selectionEndPoint,\n })\n\n return start && end ? {start, end} : undefined\n}\n","import type {EditorSelection} from '..'\nimport type {EditorSelector} from '../editor/editor-selector'\n\n/**\n * @public\n */\nexport const getSelection: EditorSelector<EditorSelection> = (snapshot) => {\n return snapshot.context.selection\n}\n","import type {PortableTextBlock} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\n\n/**\n * @public\n */\nexport const getValue: EditorSelector<Array<PortableTextBlock>> = (\n snapshot,\n) => {\n return snapshot.context.value\n}\n"],"names":["getAnchorBlock","snapshot","key","context","selection","isKeyedSegment","anchor","path","_key","undefined","node","value","find","block","getAnchorTextBlock","anchorBlock","isTextBlock","getAnchorChild","children","span","getAnchorSpan","anchorChild","isPortableTextSpan","getBlockOffsets","selectionStartPoint","getSelectionStartPoint","selectionEndPoint","getSelectionEndPoint","start","utils","selectionPoint","end","getSelection","getValue"],"mappings":";;;;;;;AAOO,MAAMA,iBAERC,CAAa,aAAA;AAChB,QAAMC,MAAMD,SAASE,QAAQC,aACzBC,eAAeJ,SAASE,QAAQC,UAAUE,OAAOC,KAAK,CAAC,CAAC,IACtDN,SAASE,QAAQC,UAAUE,OAAOC,KAAK,CAAC,EAAEC,OAE5CC,QAEEC,OAAOR,MACTD,SAASE,QAAQQ,MAAMC,KAAMC,CAAAA,UAAUA,MAAML,SAASN,GAAG,IACzDO;AAEJ,SAAOC,QAAQR,MAAM;AAAA,IAACQ;AAAAA,IAAMH,MAAM,CAAC;AAAA,MAACC,MAAMN;AAAAA,IAAI,CAAA;AAAA,EAAA,IAAKO;AACrD,GCbaK,qBAERb,CAAa,aAAA;AACVc,QAAAA,cAAcf,eAAeC,QAAQ;AAE3C,SAAOc,eAAeC,YAAYf,SAASE,SAASY,YAAYL,IAAI,IAChE;AAAA,IAACA,MAAMK,YAAYL;AAAAA,IAAMH,MAAMQ,YAAYR;AAAAA,EAAAA,IAC3CE;AACN,GCPaQ,iBAMRhB,CAAa,aAAA;AACVc,QAAAA,cAAcD,mBAAmBb,QAAQ;AAE/C,MAAI,CAACc;AACH;AAGF,QAAMb,MAAMD,SAASE,QAAQC,aACzBC,eAAeJ,SAASE,QAAQC,UAAUE,OAAOC,KAAK,CAAC,CAAC,IACtDN,SAASE,QAAQC,UAAUE,OAAOC,KAAK,CAAC,EAAEC,OAE5CC,QAEEC,OAAOR,MACTa,YAAYL,KAAKQ,SAASN,KAAMO,CAAAA,SAASA,KAAKX,SAASN,GAAG,IAC1DO;AAEJ,SAAOC,QAAQR,MACX;AAAA,IAACQ;AAAAA,IAAMH,MAAM,CAAC,GAAGQ,YAAYR,MAAM,YAAY;AAAA,MAACC,MAAMN;AAAAA,IAAI,CAAA;AAAA,EAAA,IAC1DO;AACN,GC3BaW,gBAGRnB,CAAa,aAAA;AACVoB,QAAAA,cAAcJ,eAAehB,QAAQ;AAE3C,SAAOoB,eAAeC,mBAAmBD,YAAYX,IAAI,IACrD;AAAA,IAACA,MAAMW,YAAYX;AAAAA,IAAMH,MAAMc,YAAYd;AAAAA,EAAAA,IAC3CE;AACN,GCRac,kBAERtB,CAAa,aAAA;AACZ,MAAA,CAACA,SAASE,QAAQC;AACpB;AAGF,QAAMoB,sBAAsBC,uBAAuBxB,QAAQ,GACrDyB,oBAAoBC,qBAAqB1B,QAAQ;AAEnD,MAAA,CAACuB,uBAAuB,CAACE;AAC3B;AAGIE,QAAAA,QAAQC,gCAAsC;AAAA,IAClD1B,SAASF,SAASE;AAAAA,IAClB2B,gBAAgBN;AAAAA,EAAAA,CACjB,GACKO,MAAMF,gCAAsC;AAAA,IAChD1B,SAASF,SAASE;AAAAA,IAClB2B,gBAAgBJ;AAAAA,EAAAA,CACjB;AAED,SAAOE,SAASG,MAAM;AAAA,IAACH;AAAAA,IAAOG;AAAAA,EAAAA,IAAOtB;AACvC,GC3BauB,eAAiD/B,CACrDA,aAAAA,SAASE,QAAQC,WCDb6B,WACXhC,CAEOA,aAAAA,SAASE,QAAQQ;"}
1
+ {"version":3,"file":"index.js","sources":["../../src/selectors/selector.get-anchor-block.ts","../../src/selectors/selector.get-anchor-text-block.ts","../../src/selectors/selector.get-anchor-child.ts","../../src/selectors/selector.get-anchor-span.ts","../../src/selectors/selector.get-block-offsets.ts","../../src/selectors/selector.get-list-state.ts","../../src/selectors/selector.get-selection.ts","../../src/selectors/selector.get-value.ts"],"sourcesContent":["import type {KeyedSegment, PortableTextBlock} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport {isKeyedSegment} from '../utils'\n\n/**\n * @public\n */\nexport const getAnchorBlock: EditorSelector<\n {node: PortableTextBlock; path: [KeyedSegment]} | undefined\n> = (snapshot) => {\n const key = snapshot.context.selection\n ? isKeyedSegment(snapshot.context.selection.anchor.path[0])\n ? snapshot.context.selection.anchor.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","import type {KeyedSegment, PortableTextTextBlock} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport {isTextBlock} from '../internal-utils/parse-blocks'\nimport {getAnchorBlock} from './selector.get-anchor-block'\n\n/**\n * @public\n */\nexport const getAnchorTextBlock: EditorSelector<\n {node: PortableTextTextBlock; path: [KeyedSegment]} | undefined\n> = (snapshot) => {\n const anchorBlock = getAnchorBlock(snapshot)\n\n return anchorBlock && isTextBlock(snapshot.context, anchorBlock.node)\n ? {node: anchorBlock.node, path: anchorBlock.path}\n : undefined\n}\n","import type {KeyedSegment} from '@portabletext/patches'\nimport type {PortableTextObject, PortableTextSpan} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport {isKeyedSegment} from '../utils'\nimport {getAnchorTextBlock} from './selector.get-anchor-text-block'\n\n/**\n * @public\n */\nexport const getAnchorChild: EditorSelector<\n | {\n node: PortableTextObject | PortableTextSpan\n path: [KeyedSegment, 'children', KeyedSegment]\n }\n | undefined\n> = (snapshot) => {\n const anchorBlock = getAnchorTextBlock(snapshot)\n\n if (!anchorBlock) {\n return undefined\n }\n\n const key = snapshot.context.selection\n ? isKeyedSegment(snapshot.context.selection.anchor.path[2])\n ? snapshot.context.selection.anchor.path[2]._key\n : undefined\n : undefined\n\n const node = key\n ? anchorBlock.node.children.find((span) => span._key === key)\n : undefined\n\n return node && key\n ? {node, path: [...anchorBlock.path, 'children', {_key: key}]}\n : undefined\n}\n","import type {KeyedSegment} from '@portabletext/patches'\nimport {isPortableTextSpan, type PortableTextSpan} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport {getAnchorChild} from './selector.get-anchor-child'\n\n/**\n * @public\n */\nexport const getAnchorSpan: EditorSelector<\n | {node: PortableTextSpan; path: [KeyedSegment, 'children', KeyedSegment]}\n | undefined\n> = (snapshot) => {\n const anchorChild = getAnchorChild(snapshot)\n\n return anchorChild && isPortableTextSpan(anchorChild.node)\n ? {node: anchorChild.node, path: anchorChild.path}\n : undefined\n}\n","import type {EditorSelector} from '../editor/editor-selector'\nimport type {BlockOffset} from '../types/block-offset'\nimport * as utils from '../utils'\nimport {getSelectionEndPoint} from './selector.get-selection-end-point'\nimport {getSelectionStartPoint} from './selector.get-selection-start-point'\n\n/**\n * @public\n */\nexport const getBlockOffsets: EditorSelector<\n {start: BlockOffset; end: BlockOffset} | undefined\n> = (snapshot) => {\n if (!snapshot.context.selection) {\n return undefined\n }\n\n const selectionStartPoint = getSelectionStartPoint(snapshot)\n const selectionEndPoint = getSelectionEndPoint(snapshot)\n\n if (!selectionStartPoint || !selectionEndPoint) {\n return undefined\n }\n\n const start = utils.spanSelectionPointToBlockOffset({\n context: snapshot.context,\n selectionPoint: selectionStartPoint,\n })\n const end = utils.spanSelectionPointToBlockOffset({\n context: snapshot.context,\n selectionPoint: selectionEndPoint,\n })\n\n return start && end ? {start, end} : undefined\n}\n","import type {PortableTextTextBlock} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport {isTextBlock} from '../internal-utils/parse-blocks'\nimport type {BlockPath} from '../types/paths'\nimport {getFocusTextBlock, getPreviousBlock} from './selectors'\n\n/**\n * @beta\n * Represents the List state of a block.\n */\nexport type ListState = {\n index: number\n}\n\n/**\n * @beta\n * Given the `path` of a block, this selector will return the `ListState` of\n * the block.\n */\nexport function getListState({\n path,\n}: {\n path: BlockPath\n}): EditorSelector<ListState | undefined> {\n return (snapshot) => {\n const selection = {\n anchor: {\n path,\n offset: 0,\n },\n focus: {\n path,\n offset: 0,\n },\n }\n\n const focusTextBlock = getFocusTextBlock({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection,\n },\n })\n\n if (!focusTextBlock) {\n return undefined\n }\n\n if (\n focusTextBlock.node.listItem === undefined ||\n focusTextBlock.node.level === undefined\n ) {\n return undefined\n }\n\n const previousListItem = getPreviousListItem({\n listItem: focusTextBlock.node.listItem,\n level: focusTextBlock.node.level,\n })({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection,\n },\n })\n\n if (!previousListItem) {\n return {\n index: 1,\n }\n }\n\n if (previousListItem.node.listItem !== focusTextBlock.node.listItem) {\n return {\n index: 1,\n }\n }\n\n if (\n previousListItem.node.level !== undefined &&\n previousListItem.node.level < focusTextBlock.node.level\n ) {\n return {\n index: 1,\n }\n }\n\n const previousListItemListState = getListState({\n path: previousListItem.path,\n })(snapshot)\n\n if (previousListItemListState === undefined) {\n return {\n index: 1,\n }\n }\n\n return {\n index: previousListItemListState.index + 1,\n }\n }\n}\n\nfunction getPreviousListItem({\n listItem,\n level,\n}: {\n listItem: string\n level: number\n}): EditorSelector<\n | {\n node: PortableTextTextBlock\n path: [{_key: string}]\n }\n | undefined\n> {\n return (snapshot) => {\n const previousBlock = getPreviousBlock({\n ...snapshot,\n context: {\n ...snapshot.context,\n },\n })\n\n if (!previousBlock) {\n return undefined\n }\n\n if (!isTextBlock(snapshot.context, previousBlock.node)) {\n return undefined\n }\n\n if (\n previousBlock.node.listItem === undefined ||\n previousBlock.node.level === undefined\n ) {\n return undefined\n }\n\n if (previousBlock.node.listItem !== listItem) {\n return undefined\n }\n\n if (previousBlock.node.level === level) {\n return {\n node: previousBlock.node,\n path: previousBlock.path,\n }\n }\n\n if (previousBlock.node.level < level) {\n return undefined\n }\n\n return getPreviousListItem({\n listItem,\n level,\n })({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection: {\n anchor: {\n path: previousBlock.path,\n offset: 0,\n },\n focus: {\n path: previousBlock.path,\n offset: 0,\n },\n },\n },\n })\n }\n}\n","import type {EditorSelection} from '..'\nimport type {EditorSelector} from '../editor/editor-selector'\n\n/**\n * @public\n */\nexport const getSelection: EditorSelector<EditorSelection> = (snapshot) => {\n return snapshot.context.selection\n}\n","import type {PortableTextBlock} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\n\n/**\n * @public\n */\nexport const getValue: EditorSelector<Array<PortableTextBlock>> = (\n snapshot,\n) => {\n return snapshot.context.value\n}\n"],"names":["getAnchorBlock","snapshot","key","context","selection","isKeyedSegment","anchor","path","_key","undefined","node","value","find","block","getAnchorTextBlock","anchorBlock","isTextBlock","getAnchorChild","children","span","getAnchorSpan","anchorChild","isPortableTextSpan","getBlockOffsets","selectionStartPoint","getSelectionStartPoint","selectionEndPoint","getSelectionEndPoint","start","utils","selectionPoint","end","getListState","offset","focus","focusTextBlock","getFocusTextBlock","listItem","level","previousListItem","getPreviousListItem","index","previousListItemListState","previousBlock","getPreviousBlock","getSelection","getValue"],"mappings":";;;;;;;AAOO,MAAMA,iBAERC,CAAa,aAAA;AAChB,QAAMC,MAAMD,SAASE,QAAQC,aACzBC,eAAeJ,SAASE,QAAQC,UAAUE,OAAOC,KAAK,CAAC,CAAC,IACtDN,SAASE,QAAQC,UAAUE,OAAOC,KAAK,CAAC,EAAEC,OAE5CC,QAEEC,OAAOR,MACTD,SAASE,QAAQQ,MAAMC,KAAMC,CAAAA,UAAUA,MAAML,SAASN,GAAG,IACzDO;AAEJ,SAAOC,QAAQR,MAAM;AAAA,IAACQ;AAAAA,IAAMH,MAAM,CAAC;AAAA,MAACC,MAAMN;AAAAA,IAAI,CAAA;AAAA,EAAA,IAAKO;AACrD,GCbaK,qBAERb,CAAa,aAAA;AACVc,QAAAA,cAAcf,eAAeC,QAAQ;AAE3C,SAAOc,eAAeC,YAAYf,SAASE,SAASY,YAAYL,IAAI,IAChE;AAAA,IAACA,MAAMK,YAAYL;AAAAA,IAAMH,MAAMQ,YAAYR;AAAAA,EAAAA,IAC3CE;AACN,GCPaQ,iBAMRhB,CAAa,aAAA;AACVc,QAAAA,cAAcD,mBAAmBb,QAAQ;AAE/C,MAAI,CAACc;AACH;AAGF,QAAMb,MAAMD,SAASE,QAAQC,aACzBC,eAAeJ,SAASE,QAAQC,UAAUE,OAAOC,KAAK,CAAC,CAAC,IACtDN,SAASE,QAAQC,UAAUE,OAAOC,KAAK,CAAC,EAAEC,OAE5CC,QAEEC,OAAOR,MACTa,YAAYL,KAAKQ,SAASN,KAAMO,CAAAA,SAASA,KAAKX,SAASN,GAAG,IAC1DO;AAEJ,SAAOC,QAAQR,MACX;AAAA,IAACQ;AAAAA,IAAMH,MAAM,CAAC,GAAGQ,YAAYR,MAAM,YAAY;AAAA,MAACC,MAAMN;AAAAA,IAAI,CAAA;AAAA,EAAA,IAC1DO;AACN,GC3BaW,gBAGRnB,CAAa,aAAA;AACVoB,QAAAA,cAAcJ,eAAehB,QAAQ;AAE3C,SAAOoB,eAAeC,mBAAmBD,YAAYX,IAAI,IACrD;AAAA,IAACA,MAAMW,YAAYX;AAAAA,IAAMH,MAAMc,YAAYd;AAAAA,EAAAA,IAC3CE;AACN,GCRac,kBAERtB,CAAa,aAAA;AACZ,MAAA,CAACA,SAASE,QAAQC;AACpB;AAGF,QAAMoB,sBAAsBC,uBAAuBxB,QAAQ,GACrDyB,oBAAoBC,qBAAqB1B,QAAQ;AAEnD,MAAA,CAACuB,uBAAuB,CAACE;AAC3B;AAGIE,QAAAA,QAAQC,gCAAsC;AAAA,IAClD1B,SAASF,SAASE;AAAAA,IAClB2B,gBAAgBN;AAAAA,EAAAA,CACjB,GACKO,MAAMF,gCAAsC;AAAA,IAChD1B,SAASF,SAASE;AAAAA,IAClB2B,gBAAgBJ;AAAAA,EAAAA,CACjB;AAED,SAAOE,SAASG,MAAM;AAAA,IAACH;AAAAA,IAAOG;AAAAA,EAAAA,IAAOtB;AACvC;ACdO,SAASuB,aAAa;AAAA,EAC3BzB;AAGF,GAA0C;AACxC,SAAQN,CAAa,aAAA;AACnB,UAAMG,YAAY;AAAA,MAChBE,QAAQ;AAAA,QACNC;AAAAA,QACA0B,QAAQ;AAAA,MACV;AAAA,MACAC,OAAO;AAAA,QACL3B;AAAAA,QACA0B,QAAQ;AAAA,MAAA;AAAA,IACV,GAGIE,iBAAiBC,kBAAkB;AAAA,MAEvCjC,SAAS;AAAA,QACP,GAAGF,SAASE;AAAAA,QACZC;AAAAA,MAAAA;AAAAA,IACF,CACD;AAEG,QAAA,CAAC+B,kBAKHA,eAAezB,KAAK2B,aAAa5B,UACjC0B,eAAezB,KAAK4B,UAAU7B;AAE9B;AAGF,UAAM8B,mBAAmBC,oBAAoB;AAAA,MAC3CH,UAAUF,eAAezB,KAAK2B;AAAAA,MAC9BC,OAAOH,eAAezB,KAAK4B;AAAAA,IAAAA,CAC5B,EAAE;AAAA,MACD,GAAGrC;AAAAA,MACHE,SAAS;AAAA,QACP,GAAGF,SAASE;AAAAA,QACZC;AAAAA,MAAAA;AAAAA,IACF,CACD;AAED,QAAI,CAACmC;AACI,aAAA;AAAA,QACLE,OAAO;AAAA,MACT;AAGF,QAAIF,iBAAiB7B,KAAK2B,aAAaF,eAAezB,KAAK2B;AAClD,aAAA;AAAA,QACLI,OAAO;AAAA,MACT;AAIAF,QAAAA,iBAAiB7B,KAAK4B,UAAU7B,UAChC8B,iBAAiB7B,KAAK4B,QAAQH,eAAezB,KAAK4B;AAE3C,aAAA;AAAA,QACLG,OAAO;AAAA,MACT;AAGF,UAAMC,4BAA4BV,aAAa;AAAA,MAC7CzB,MAAMgC,iBAAiBhC;AAAAA,IACxB,CAAA,EAAEN,QAAQ;AAEX,WAAIyC,8BAA8BjC,SACzB;AAAA,MACLgC,OAAO;AAAA,IAAA,IAIJ;AAAA,MACLA,OAAOC,0BAA0BD,QAAQ;AAAA,IAC3C;AAAA,EACF;AACF;AAEA,SAASD,oBAAoB;AAAA,EAC3BH;AAAAA,EACAC;AAIF,GAME;AACA,SAAQrC,CAAa,aAAA;AACnB,UAAM0C,gBAAgBC,iBAAiB;AAAA,MAErCzC,SAAS;AAAA,QACP,GAAGF,SAASE;AAAAA,MAAAA;AAAAA,IACd,CACD;AAED,QAAKwC,iBAIA3B,YAAYf,SAASE,SAASwC,cAAcjC,IAAI,KAKnDiC,EAAcjC,cAAAA,KAAK2B,aAAa5B,UAChCkC,cAAcjC,KAAK4B,UAAU7B,WAK3BkC,cAAcjC,KAAK2B,aAAaA,UAIpC;AAAIM,UAAAA,cAAcjC,KAAK4B,UAAUA;AACxB,eAAA;AAAA,UACL5B,MAAMiC,cAAcjC;AAAAA,UACpBH,MAAMoC,cAAcpC;AAAAA,QACtB;AAGEoC,UAAAA,EAAAA,cAAcjC,KAAK4B,QAAQA;AAI/B,eAAOE,oBAAoB;AAAA,UACzBH;AAAAA,UACAC;AAAAA,QAAAA,CACD,EAAE;AAAA,UACD,GAAGrC;AAAAA,UACHE,SAAS;AAAA,YACP,GAAGF,SAASE;AAAAA,YACZC,WAAW;AAAA,cACTE,QAAQ;AAAA,gBACNC,MAAMoC,cAAcpC;AAAAA,gBACpB0B,QAAQ;AAAA,cACV;AAAA,cACAC,OAAO;AAAA,gBACL3B,MAAMoC,cAAcpC;AAAAA,gBACpB0B,QAAQ;AAAA,cAAA;AAAA,YACV;AAAA,UACF;AAAA,QACF,CACD;AAAA,IAAA;AAAA,EACH;AACF;ACxKaY,MAAAA,eAAiD5C,CACrDA,aAAAA,SAASE,QAAQC,WCDb0C,WACX7C,CAEOA,aAAAA,SAASE,QAAQQ;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@portabletext/editor",
3
- "version": "1.49.13",
3
+ "version": "1.50.0",
4
4
  "description": "Portable Text Editor made in React",
5
5
  "keywords": [
6
6
  "sanity",
@@ -57,6 +57,7 @@ describe('initialization', () => {
57
57
  data-block-name="myTestBlockType"
58
58
  data-block-type="text"
59
59
  data-slate-node="element"
60
+ data-style="normal"
60
61
  >
61
62
  <div>
62
63
  <span
@@ -122,6 +122,21 @@ export function RenderTextBlock(props: {
122
122
  data-block-key={props.textBlock._key}
123
123
  data-block-name={props.textBlock._type}
124
124
  data-block-type="text"
125
+ {...(props.textBlock.listItem !== undefined
126
+ ? {
127
+ 'data-list-item': props.textBlock.listItem,
128
+ }
129
+ : {})}
130
+ {...(props.textBlock.level !== undefined
131
+ ? {
132
+ 'data-level': props.textBlock.level,
133
+ }
134
+ : {})}
135
+ {...(props.textBlock.style !== undefined
136
+ ? {
137
+ 'data-style': props.textBlock.style,
138
+ }
139
+ : {})}
125
140
  >
126
141
  {dragPositionBlock === 'start' ? <DropIndicator /> : null}
127
142
  <div ref={blockRef}>
@@ -8,6 +8,7 @@ export {getAnchorTextBlock} from './selector.get-anchor-text-block'
8
8
  export {getBlockOffsets} from './selector.get-block-offsets'
9
9
  export {getCaretWordSelection} from './selector.get-caret-word-selection'
10
10
  export {getFocusInlineObject} from './selector.get-focus-inline-object'
11
+ export {getListState} from './selector.get-list-state'
11
12
  export {getNextInlineObject} from './selector.get-next-inline-object'
12
13
  export {getPreviousInlineObject} from './selector.get-previous-inline-object'
13
14
  export {getSelectedSlice} from './selector.get-selected-slice'