@box/threaded-annotations 4.13.2 → 4.14.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.
Files changed (20) hide show
  1. package/dist/esm/lib/components/v2/message-editor/editor-extensions/create-message-editor-extensions.js +1 -1
  2. package/dist/esm/lib/components/v2/message-editor/editor-extensions/custom-bold-rules.js +1 -0
  3. package/dist/esm/lib/components/v2/message-editor/editor-extensions/custom-bold.js +1 -0
  4. package/dist/esm/lib/components/v2/message-editor/editor-extensions/custom-italic-rules.js +1 -0
  5. package/dist/esm/lib/components/v2/message-editor/editor-extensions/custom-italic.js +1 -0
  6. package/dist/esm/lib/components/v2/message-editor/editor-extensions/custom-underline-rules.js +1 -0
  7. package/dist/esm/lib/components/v2/message-editor/editor-extensions/custom-underline.js +1 -1
  8. package/dist/esm/lib/components/v2/message-editor/editor-extensions/mid-word-rules.js +1 -0
  9. package/dist/esm/lib/components/v2/message-editor/editor-extensions/normalize-block-whitespace.js +1 -0
  10. package/dist/types/lib/components/v2/message-editor/editor-extensions/create-message-editor-extensions.d.ts +0 -6
  11. package/dist/types/lib/components/v2/message-editor/editor-extensions/custom-bold-rules.d.ts +8 -0
  12. package/dist/types/lib/components/v2/message-editor/editor-extensions/custom-bold.d.ts +1 -0
  13. package/dist/types/lib/components/v2/message-editor/editor-extensions/custom-italic-rules.d.ts +4 -0
  14. package/dist/types/lib/components/v2/message-editor/editor-extensions/custom-italic.d.ts +1 -0
  15. package/dist/types/lib/components/v2/message-editor/editor-extensions/custom-underline-rules.d.ts +4 -0
  16. package/dist/types/lib/components/v2/message-editor/editor-extensions/custom-underline.d.ts +2 -2
  17. package/dist/types/lib/components/v2/message-editor/editor-extensions/mid-word-rules.d.ts +19 -0
  18. package/dist/types/lib/components/v2/message-editor/editor-extensions/normalize-block-whitespace.d.ts +7 -0
  19. package/dist/types/lib/v2/test-utils/rich-text-test-cases.d.ts +2 -3
  20. package/package.json +1 -1
@@ -1 +1 @@
1
- import{CustomMention}from"./custom-mention/custom-mention.js";import{CustomParagraph}from"./custom-paragraph.js";import{CustomUnderline}from"./custom-underline.js";import{DismissBarOnEscape}from"./dismiss-bar-on-escape.js";import{NormalizeEmptyNodeSelection}from"./normalize-empty-node-selection.js";import{StripMentionMarks}from"./strip-mention-marks.js";import Document from"@tiptap/extension-document";import Text from"@tiptap/extension-text";import Bold from"@tiptap/extension-bold";import Italic from"@tiptap/extension-italic";import{BulletList,ListItem,OrderedList}from"@tiptap/extension-list";import{Placeholder,UndoRedo}from"@tiptap/extensions";var createMessageEditorExtensions=({isRichTextEnabled,mentionSuggestion,placeholder})=>{let baseExtensions=[Document,CustomParagraph,Placeholder.configure({placeholder,showOnlyWhenEditable:!1}),Text,CustomMention.configure({suggestion:mentionSuggestion}),NormalizeEmptyNodeSelection];return isRichTextEnabled?[...baseExtensions,UndoRedo,Bold,Italic,CustomUnderline,BulletList.configure({keepMarks:!0}),OrderedList.configure({keepMarks:!0}),ListItem,DismissBarOnEscape,StripMentionMarks]:baseExtensions};export{createMessageEditorExtensions};
1
+ import{CustomBold}from"./custom-bold.js";import{CustomItalic}from"./custom-italic.js";import{CustomMention}from"./custom-mention/custom-mention.js";import{CustomParagraph}from"./custom-paragraph.js";import{CustomUnderline}from"./custom-underline.js";import{DismissBarOnEscape}from"./dismiss-bar-on-escape.js";import{NormalizeBlockWhitespace}from"./normalize-block-whitespace.js";import{NormalizeEmptyNodeSelection}from"./normalize-empty-node-selection.js";import{StripMentionMarks}from"./strip-mention-marks.js";import Document from"@tiptap/extension-document";import Text from"@tiptap/extension-text";import{BulletList,ListItem,OrderedList}from"@tiptap/extension-list";import{Placeholder,UndoRedo}from"@tiptap/extensions";var createMessageEditorExtensions=({isRichTextEnabled,mentionSuggestion,placeholder})=>{let baseExtensions=[Document,CustomParagraph,Placeholder.configure({placeholder,showOnlyWhenEditable:!1}),Text,CustomMention.configure({suggestion:mentionSuggestion}),NormalizeEmptyNodeSelection];return isRichTextEnabled?[...baseExtensions,UndoRedo,CustomBold,CustomItalic,CustomUnderline,BulletList.configure({keepMarks:!0}),OrderedList.configure({keepMarks:!0}),ListItem,DismissBarOnEscape,NormalizeBlockWhitespace,StripMentionMarks]:baseExtensions};export{createMessageEditorExtensions};
@@ -0,0 +1 @@
1
+ import{createMidWordMarkPasteRules,createMidWordMarkRule}from"./mid-word-rules.js";var createBoldInputRules=(bold,italic)=>[createMidWordMarkRule(`***`,[bold,italic]),createMidWordMarkRule(`**`,[bold]),createMidWordMarkRule(`__`,[bold])],createBoldPasteRules=(bold,italic)=>createMidWordMarkPasteRules([{delimiter:`***`,types:[bold,italic]},{delimiter:`**`,types:[bold]},{delimiter:`__`,types:[bold]}]);export{createBoldInputRules,createBoldPasteRules};
@@ -0,0 +1 @@
1
+ import{createBoldInputRules,createBoldPasteRules}from"./custom-bold-rules.js";import Bold from"@tiptap/extension-bold";var CustomBold=Bold.extend({addInputRules(){return createBoldInputRules(this.type,this.type.schema.marks.italic)},addPasteRules(){return createBoldPasteRules(this.type,this.type.schema.marks.italic)}});export{CustomBold};
@@ -0,0 +1 @@
1
+ import{createMidWordMarkPasteRules,createMidWordMarkRule}from"./mid-word-rules.js";var createItalicInputRules=italic=>[createMidWordMarkRule(`*`,[italic]),createMidWordMarkRule(`_`,[italic])],createItalicPasteRules=italic=>createMidWordMarkPasteRules([{delimiter:`*`,types:[italic]},{delimiter:`_`,types:[italic]}]);export{createItalicInputRules,createItalicPasteRules};
@@ -0,0 +1 @@
1
+ import{createItalicInputRules,createItalicPasteRules}from"./custom-italic-rules.js";import Italic from"@tiptap/extension-italic";var CustomItalic=Italic.extend({addInputRules(){return createItalicInputRules(this.type)},addPasteRules(){return createItalicPasteRules(this.type)}});export{CustomItalic};
@@ -0,0 +1 @@
1
+ import{createMidWordMarkPasteRules,createMidWordMarkRule}from"./mid-word-rules.js";var createUnderlinePlusInputRule=underline=>createMidWordMarkRule(`++`,[underline]),createUnderlinePlusPasteRules=underline=>createMidWordMarkPasteRules([{delimiter:`++`,types:[underline]}]);export{createUnderlinePlusInputRule,createUnderlinePlusPasteRules};
@@ -1 +1 @@
1
- import{markInputRule,markPasteRule}from"@tiptap/core";import Underline from"@tiptap/extension-underline";var plusPlusInputRegex=/(?:^|\s)(\+\+(?!\s+\+\+)((?:[^+]+))\+\+(?!\s+\+\+))$/,plusPlusPasteRegex=/(?:^|\s)(\+\+(?!\s+\+\+)((?:[^+]+))\+\+(?!\s+\+\+))/g,CustomUnderline=Underline.extend({addInputRules(){return[markInputRule({find:plusPlusInputRegex,type:this.type})]},addPasteRules(){return[markPasteRule({find:plusPlusPasteRegex,type:this.type})]}});export{CustomUnderline};
1
+ import{createUnderlinePlusInputRule,createUnderlinePlusPasteRules}from"./custom-underline-rules.js";import Underline from"@tiptap/extension-underline";var CustomUnderline=Underline.extend({addInputRules(){return[createUnderlinePlusInputRule(this.type)]},addPasteRules(){return createUnderlinePlusPasteRules(this.type)}});export{CustomUnderline};
@@ -0,0 +1 @@
1
+ import{InputRule,PasteRule}from"@tiptap/core";var matchPair=(text,delimiter,openStart,closeStart)=>{let marker=delimiter[0],delimLen=delimiter.length;if(openStart<0||closeStart<openStart+delimLen||text.slice(openStart,openStart+delimLen)!==delimiter||text.slice(closeStart,closeStart+delimLen)!==delimiter||text[openStart-1]===marker||text[openStart+delimLen]===marker||text[closeStart-1]===marker||text[closeStart+delimLen]===marker)return null;let content=text.slice(openStart+delimLen,closeStart);return!content||content.includes(marker)||/^\s|\s$/.test(content)?null:{index:openStart,replaceWith:content,text:text.slice(openStart,closeStart+delimLen)}},findMark=delimiter=>text=>{if(!text.endsWith(delimiter))return null;let closeStart=text.length-delimiter.length;return matchPair(text,delimiter,text.lastIndexOf(delimiter,closeStart-delimiter.length),closeStart)},applyMarks=(types,match,range,tr)=>{let content=match[match.length-1],fullMatch=match[0];if(!content)return;let textStart=range.from+fullMatch.indexOf(content),textEnd=textStart+content.length;textEnd<range.to&&tr.delete(textEnd,range.to),textStart>range.from&&tr.delete(range.from,textStart);let markEnd=range.from+content.length;types.forEach(type=>{tr.addMark(range.from,markEnd,type.create())}),tr.setStoredMarks([])},createMidWordMarkRule=(delimiter,types)=>new InputRule({find:findMark(delimiter),handler:({match,range,state})=>{applyMarks(types,match,range,state.tr)}}),findPair=(text,rules)=>{for(let end=1;end<=text.length;end+=1){let prefix=text.slice(0,end);for(let rule of rules){let match=findMark(rule.delimiter)(prefix);if(match)return{...match,types:rule.types}}}return null},findAllPairs=(text,rules)=>{let matches=[],from=0;for(;from<text.length;){let pair=findPair(text.slice(from),rules);if(!pair)break;matches.push({...pair,index:pair.index+from}),from+=pair.index+pair.text.length}return matches},createMidWordMarkPasteRules=rules=>[new PasteRule({find:text=>{let pairs=findAllPairs(text,rules);return pairs.length===0?null:pairs.map(pair=>({data:{types:pair.types},index:pair.index,replaceWith:pair.replaceWith,text:pair.text}))},handler:({match,range,state})=>{let types=match.data?.types;types&&applyMarks(types,match,range,state.tr)}})];export{createMidWordMarkPasteRules,createMidWordMarkRule};
@@ -0,0 +1 @@
1
+ import{Extension}from"@tiptap/core";import{Plugin,PluginKey}from"@tiptap/pm/state";var NormalizeBlockWhitespace=Extension.create({name:`normalizeBlockWhitespace`,addProseMirrorPlugins(){return[new Plugin({key:new PluginKey(`normalizeBlockWhitespace`),appendTransaction:(transactions,_oldState,newState)=>{if(!transactions.some(transaction=>transaction.docChanged))return null;let cuts=[],{selection}=newState;if(newState.doc.descendants((node,pos)=>{if(node.type.name===`listItem`){let paragraph=node.firstChild,text=paragraph?.type.name===`paragraph`?paragraph.firstChild:null;if(text?.isText&&!text.marks.length&&text.text?.startsWith(` `)){let textPos=pos+2;cuts.push({from:textPos,to:textPos+1})}}if(node.type.name!==`paragraph`||node.childCount<2)return;let last=node.lastChild,before=node.child(node.childCount-2);if(selection.from>pos&&selection.from<pos+node.nodeSize||before?.type.name!==`mention`||!last?.isText||last.text!==` `)return;let spacePos=pos+1+node.content.size-last.nodeSize;cuts.push({from:spacePos,to:spacePos+last.nodeSize})}),cuts.length===0)return null;let transaction=newState.tr;return cuts.sort((left,right)=>right.from-left.from).forEach(cut=>{transaction=transaction.delete(cut.from,cut.to)}),transaction}})]}});export{NormalizeBlockWhitespace};
@@ -1,12 +1,6 @@
1
1
  import { Extensions } from '@tiptap/core';
2
2
  import { SuggestionOptions } from '@tiptap/suggestion';
3
3
  export interface CreateMessageEditorExtensionsOptions {
4
- /**
5
- * When true, adds UndoRedo plus the rich text mark and list extensions
6
- * (bold, italic, underline, bullet/ordered lists), enabling their keyboard
7
- * shortcuts and input rules. When false the editor supports plain text and
8
- * mentions only.
9
- */
10
4
  isRichTextEnabled: boolean;
11
5
  mentionSuggestion: Omit<SuggestionOptions, 'editor'>;
12
6
  placeholder: string;
@@ -0,0 +1,8 @@
1
+ import { InputRule, PasteRule } from '@tiptap/core';
2
+ import { MarkType } from '@tiptap/pm/model';
3
+ /**
4
+ * `***` is bold plus italic, so it lives here. Each rule rejects a longer run,
5
+ * so registration order does not matter.
6
+ */
7
+ export declare const createBoldInputRules: (bold: MarkType, italic: MarkType) => InputRule[];
8
+ export declare const createBoldPasteRules: (bold: MarkType, italic: MarkType) => PasteRule[];
@@ -0,0 +1 @@
1
+ export declare const CustomBold: import('@tiptap/core').Mark<import('@tiptap/extension-bold').BoldOptions, any>;
@@ -0,0 +1,4 @@
1
+ import { InputRule, PasteRule } from '@tiptap/core';
2
+ import { MarkType } from '@tiptap/pm/model';
3
+ export declare const createItalicInputRules: (italic: MarkType) => InputRule[];
4
+ export declare const createItalicPasteRules: (italic: MarkType) => PasteRule[];
@@ -0,0 +1 @@
1
+ export declare const CustomItalic: import('@tiptap/core').Mark<import('@tiptap/extension-italic').ItalicOptions, any>;
@@ -0,0 +1,4 @@
1
+ import { InputRule, PasteRule } from '@tiptap/core';
2
+ import { MarkType } from '@tiptap/pm/model';
3
+ export declare const createUnderlinePlusInputRule: (underline: MarkType) => InputRule;
4
+ export declare const createUnderlinePlusPasteRules: (underline: MarkType) => PasteRule[];
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Stock Underline has Cmd+U but no `++` input/paste rules.
3
- * Wire format and markdown-it parse already use `++text++`.
2
+ * Stock Underline is the Cmd+U shortcut. `++text++` is the input and paste
3
+ * rule because the wire format and markdown-it already parse that delimiter.
4
4
  */
5
5
  export declare const CustomUnderline: import('@tiptap/core').Mark<import('@tiptap/extension-underline').UnderlineOptions, any>;
@@ -0,0 +1,19 @@
1
+ import { InputRule, PasteRule } from '@tiptap/core';
2
+ import { MarkType } from '@tiptap/pm/model';
3
+ /**
4
+ * Like Tiptap `markInputRule`, but one rule can apply several marks (`***`).
5
+ * Stock also bails when another mark in the range excludes this type. Omitted:
6
+ * bold, italic, and underline only self-exclude, and Tiptap ignores self.
7
+ * Restore if a new mark excludes them.
8
+ */
9
+ export declare const createMidWordMarkRule: (delimiter: string, types: MarkType[]) => InputRule;
10
+ export type PasteMark = {
11
+ delimiter: string;
12
+ types: MarkType[];
13
+ };
14
+ /**
15
+ * Every non-overlapping pair this plugin owns. Later plugins still see the
16
+ * stripped text (`++***mix***++`: bold strips `***`, underline then strips `++`
17
+ * without replacing the already-marked inner run).
18
+ */
19
+ export declare const createMidWordMarkPasteRules: (rules: PasteMark[]) => PasteRule[];
@@ -0,0 +1,7 @@
1
+ import { Extension } from '@tiptap/core';
2
+ /**
3
+ * Parser drops two spaces the editor otherwise keeps:
4
+ * the space a mention inserts when the next thing is a new block, and one
5
+ * leading space in a list item (marker padding, `- a` → `- a`).
6
+ */
7
+ export declare const NormalizeBlockWhitespace: Extension<any, any>;
@@ -5,8 +5,8 @@ import { DocumentNode, InlineNode, ListItemNode, TextMark, TextNode } from '../t
5
5
  * `plaintext` is the rich-text-disabled client. Strip clones copy
6
6
  * `STRIP_CONTRACT_CASES` by row name; do not import across repos.
7
7
  */
8
- type RichTextGroup = 'paragraphs' | 'isolatedToolbar' | 'isolatedTyped' | 'isolatedPasted' | 'midWord' | 'midSentence' | 'mentionThenMark' | 'mentionThenBlock' | 'siblingLists' | 'nestedLists';
9
- type RichTextCase = {
8
+ export type RichTextGroup = 'paragraphs' | 'isolatedToolbar' | 'isolatedTyped' | 'isolatedPasted' | 'siblingMarks' | 'midWord' | 'midSentence' | 'mentionThenMark' | 'mentionThenBlock' | 'siblingLists' | 'nestedLists';
9
+ export type RichTextCase = {
10
10
  group: RichTextGroup;
11
11
  name: string;
12
12
  wire: string;
@@ -58,4 +58,3 @@ export declare const STRIP_CONTRACT_CASES: {
58
58
  strip: string;
59
59
  wire: string;
60
60
  }[];
61
- export type { RichTextCase, RichTextGroup };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@box/threaded-annotations",
3
- "version": "4.13.2",
3
+ "version": "4.14.0",
4
4
  "license": "SEE LICENSE IN LICENSE",
5
5
  "dependencies": {
6
6
  "@floating-ui/dom": "^1.6.0",