@box/threaded-annotations 4.12.0 → 4.13.1

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.
@@ -1 +1 @@
1
- import '../styles/text-message2.css';var text_message_module_default={textMessage:`_textMessage_qsyra_29`,contentWrapper:`_contentWrapper_qsyra_38`,threadedIndicator:`_threadedIndicator_qsyra_43`,threadedIndicatorHidden:`_threadedIndicatorHidden_qsyra_59`,messageContent:`_messageContent_qsyra_62`,inlineEditSlot:`_inlineEditSlot_qsyra_100`,annotationBadgeWrapper:`_annotationBadgeWrapper_qsyra_103`,messageFooter:`_messageFooter_qsyra_111`,readableTimeWrapper:`_readableTimeWrapper_qsyra_117`,replyButton:`_replyButton_qsyra_121`,seeMoreButton:`_seeMoreButton_qsyra_136`,richTextList:`_richTextList_qsyra_140`};export{text_message_module_default as t};
1
+ import '../styles/text-message2.css';var text_message_module_default={textMessage:`_textMessage_1wvil_29`,contentWrapper:`_contentWrapper_1wvil_38`,threadedIndicator:`_threadedIndicator_1wvil_43`,threadedIndicatorHidden:`_threadedIndicatorHidden_1wvil_59`,messageContent:`_messageContent_1wvil_62`,richTextList:`_richTextList_1wvil_103`,inlineEditSlot:`_inlineEditSlot_1wvil_107`,annotationBadgeWrapper:`_annotationBadgeWrapper_1wvil_110`,messageFooter:`_messageFooter_1wvil_118`,readableTimeWrapper:`_readableTimeWrapper_1wvil_124`,replyButton:`_replyButton_1wvil_128`,seeMoreButton:`_seeMoreButton_1wvil_143`};export{text_message_module_default as t};
@@ -1 +1 @@
1
- import{THREADED_ANNOTATIONS_PORTAL}from"../../../v2/constants.js";import{useMentionContext}from"../../mention-component/mention-context.js";import{getSubmitShortcutAriaKeyShortcuts,isSubmitShortcut}from"../../../utils/is-submit-shortcut.js";import{createSuggestionOptions}from"./editor-extensions/custom-mention/custom-mention-suggestions.js";import{MENTION_PLUGIN_KEY,normalizeMentionPastedText,normalizeMentionTextInput}from"./editor-extensions/custom-mention/mention-trigger-normalization.js";import{useMentionState}from"./editor-extensions/custom-mention/useMentionState.js";import{createMessageEditorExtensions}from"./editor-extensions/create-message-editor-extensions.js";import{useCharacterLimit}from"./hooks/useCharacterLimit.js";import{useEditorContainerState}from"./hooks/useEditorContainerState.js";import{useMentionAnchorStyle}from"./hooks/useMentionAnchorStyle.js";import{useMentionUserSelection}from"./hooks/useMentionUserSelection.js";import{MessageEditorProvider,useMessageEditorContext}from"./message-editor-context.js";import messages from"./messages.js";import{t as message_editor_module_default}from"../../../../../chunks/message-editor2.module.js";import{CharacterLimitCounter}from"./subcomponents/character-limit-counter.js";import{EditButtons}from"./subcomponents/edit-buttons.js";import{ErrorMessage}from"./subcomponents/error-message.js";import{t as MessageEditorBubbleMenu}from"../../../../../chunks/message-editor-bubble-menu.js";import{PostButton}from"./subcomponents/post-button.js";import{t as TimestampToggle}from"../../../../../chunks/timestamp-toggle.js";import{MessageEditorVariant}from"./message-editor.types.js";import{VisuallyHidden}from"@box/blueprint-web";import clsx from"clsx";import{useCallback,useEffect,useMemo,useRef}from"react";import{useIntl}from"react-intl";import{Fragment,jsx,jsxs}from"react/jsx-runtime";import{EditorContent,useEditor,useEditorState}from"@tiptap/react";import{UserSelectorHeadless}from"@box/user-selector";var IS_APPLE_DEVICE=typeof navigator<`u`&&/Mac|iP(hone|ad|od)/.test(navigator.platform),MESSAGE_EDITOR_FOCUS_CONTROL_SELECTOR=`button, a, input, textarea, label, [role="toolbar"], [role="checkbox"], [tabindex="0"]`,getShortcutFormat=event=>{if(!(IS_APPLE_DEVICE?event.metaKey:event.ctrlKey))return null;if(event.shiftKey)return event.code===`Digit8`?`bulletList`:event.code===`Digit7`?`orderedList`:null;switch(event.key.toLowerCase()){case`b`:return`bold`;case`i`:return`italic`;case`u`:return`underline`;default:return null}},MessageEditorContent=props=>{let{autoFocus=!0,disableComponent=!1,initialContent,isFirstAnnotation=!1,isReply=!1,isRichTextEnabled=!1,maxCharacterCount,onChange,onFormatToggle,userSelectorProps,videoTimestamp}=props,userSelectorRef=useRef(null),editorContainerRef=useRef(null),editorViewportRef=useRef(null),editorRef=useRef(null),editorInstanceRef=useRef(null),postButtonRef=useRef(null),onFormatToggleRef=useRef(onFormatToggle);onFormatToggleRef.current=onFormatToggle;let onChangeRef=useRef(onChange);onChangeRef.current=onChange;let intl=useIntl(),{errorMessage,isLoading}=useMessageEditorContext(),{close:closeMentionDropdown,isActive,query,command,clientRect,suggestionCallbacks}=useMentionState(userSelectorRef),{closeAllPopovers}=useMentionContext(),placeholderText=intl.formatMessage(isReply?messages.placeholderReply:messages.placeholderAddComment),isEditVariant=props.variant===MessageEditorVariant.EDIT_MESSAGE,editor=useEditor({extensions:createMessageEditorExtensions({isRichTextEnabled,mentionSuggestion:createSuggestionOptions(MENTION_PLUGIN_KEY,`@`,suggestionCallbacks),placeholder:placeholderText}),autofocus:autoFocus,content:initialContent,editorProps:{attributes:{"aria-keyshortcuts":getSubmitShortcutAriaKeyShortcuts(),class:message_editor_module_default.editor},handleKeyDown:(view,event)=>{if(event.key===`Enter`&&event.shiftKey&&!event.isComposing)return editorInstanceRef.current?.commands.splitBlock()??!1;if(!isEditVariant&&isSubmitShortcut(event)){let postButton=postButtonRef.current;return!postButton||postButton.disabled?!1:(postButton.click(),!0)}if(isRichTextEnabled){let format=getShortcutFormat(event),editorInstance=editorInstanceRef.current;if(format&&editorInstance?.isEditable){let wasActive=editorInstance.isActive(format);queueMicrotask(()=>{if(editorInstance.isDestroyed)return;let isFormatActive=editorInstance.isActive(format);isFormatActive!==wasActive&&onFormatToggleRef.current?.(format,isFormatActive)})}}return!1},handleTextInput:normalizeMentionTextInput,transformPastedText:normalizeMentionPastedText},onCreate:({editor:editorInstance})=>{editorInstanceRef.current=editorInstance,editorRef.current=editorInstance.view.dom,autoFocus&&editorInstance.commands.focus(`end`)},onUpdate:({editor:editorInstance})=>{onChangeRef.current?.(editorInstance.isEmpty?null:editorInstance.getJSON()),closeAllPopovers?.()}},[placeholderText,isRichTextEnabled,isEditVariant]),{onUserSelected}=useMentionUserSelection(useMemo(()=>command&&editor&&!editor.isDestroyed?{command,editor}:null,[command,editor])),{exceedsSingleLine,hasScroll,isAtBottom}=useEditorContainerState(editorContainerRef,editor),{isInView:isMentionInView,style:mentionAnchorStyle}=useMentionAnchorStyle(clientRect,isActive,editorContainerRef),characterLimitState=useCharacterLimit(editor,maxCharacterCount),isEditorEmpty=useEditorState({editor,selector:()=>({isEmpty:!editor||!editor.schema||editor.isEmpty})})?.isEmpty??!0,shouldApplyEditorFullWidth=isEditVariant||!isFirstAnnotation||isFirstAnnotation&&exceedsSingleLine,disableEditor=disableComponent||isLoading,isCharacterLimitExceeded=(characterLimitState?.excess??0)>0,isPostDisabled=isEditorEmpty||disableEditor||isCharacterLimitExceeded,showCharacterLimitCounter=characterLimitState&&characterLimitState.excess>0&&shouldApplyEditorFullWidth;useEffect(()=>{editor&&editor.setEditable(!disableEditor)},[editor,disableEditor]),useEffect(()=>{if(!isCharacterLimitExceeded||!editorContainerRef.current||!initialContent)return;let innerFrameId=0,outerFrameId=requestAnimationFrame(()=>{innerFrameId=requestAnimationFrame(()=>{editorContainerRef.current?.scrollTo({top:editorContainerRef.current.scrollHeight})})});return()=>{cancelAnimationFrame(outerFrameId),cancelAnimationFrame(innerFrameId)}},[isCharacterLimitExceeded]),useEffect(()=>{!editor||initialContent===void 0||queueMicrotask(()=>{editor.isDestroyed||(editor.chain().setMeta(`addToHistory`,!1).setContent(initialContent??``,{emitUpdate:!1}).run(),onChangeRef.current?.(editor.isEmpty?null:editor.getJSON()),autoFocus&&editor.commands.focus(`end`))})},[initialContent]),useEffect(()=>{if(!isActive)return;let portalSelector=`[${Object.keys(THREADED_ANNOTATIONS_PORTAL)[0]}]`,isInsideEditorOrPortal=target=>{if(editorContainerRef.current?.contains(target))return!0;let portals=document.querySelectorAll(portalSelector);for(let portal of portals)if(portal.contains(target))return!0;return!1},handleClose=e=>{let target=e.target;!target||isInsideEditorOrPortal(target)||closeMentionDropdown()},frameId=requestAnimationFrame(()=>{document.addEventListener(`mousedown`,handleClose),document.addEventListener(`focusin`,handleClose)});return()=>{cancelAnimationFrame(frameId),document.removeEventListener(`mousedown`,handleClose),document.removeEventListener(`focusin`,handleClose)}},[closeMentionDropdown,isActive]);let handleFormatToggle=useCallback((format,isFormatActive)=>onFormatToggleRef.current?.(format,isFormatActive),[]),handleMessageEditorMouseDown=useCallback(event=>{if(disableEditor||!editor||editor.isDestroyed)return;let{target}=event;target instanceof Element&&(editorContainerRef.current?.contains(target)||editor.view.dom.contains(target)||target.closest(MESSAGE_EDITOR_FOCUS_CONTROL_SELECTOR)||editor.isFocused||editor.commands.focus(`end`))},[disableEditor,editor]),anchorElement=jsx(`div`,{className:message_editor_module_default.anchorElement,style:mentionAnchorStyle});return jsx(`div`,{"data-no-expand":!0,className:message_editor_module_default.messageEditorWrapper,children:jsxs(`div`,{className:clsx(message_editor_module_default.messageEditor,{[message_editor_module_default.editorHasScroll]:hasScroll,[message_editor_module_default.editorEditMode]:isEditVariant,[message_editor_module_default.editorError]:errorMessage||isCharacterLimitExceeded,[message_editor_module_default.editorFirstAnnotation]:!isEditVariant&&isFirstAnnotation,[message_editor_module_default.editorCharacterLimitExceeded]:isCharacterLimitExceeded}),onMouseDown:handleMessageEditorMouseDown,children:[jsxs(`div`,{ref:editorViewportRef,className:clsx(message_editor_module_default.editorViewport,{[message_editor_module_default.editorFullWidth]:shouldApplyEditorFullWidth}),children:[isRichTextEnabled&&jsx(MessageEditorBubbleMenu,{editor,menuAnchorRef:editorViewportRef,onFormatToggle:handleFormatToggle}),jsxs(`div`,{ref:editorContainerRef,className:message_editor_module_default.editorContainer,"aria-label":intl.formatMessage(messages.scrollContainerAriaLabel),children:[jsx(EditorContent,{"aria-label":intl.formatMessage(messages.editorContentAriaLabel),editor}),jsx(UserSelectorHeadless,{ref:userSelectorRef,inputElementRef:editorRef,onSelectedUserChange:onUserSelected,open:isActive,rootElement:anchorElement,value:query,...userSelectorProps,popoverContentContainerProps:{...userSelectorProps.popoverContentContainerProps,...THREADED_ANNOTATIONS_PORTAL,avoidCollisions:isMentionInView,className:clsx(message_editor_module_default.mentionListPopover,!isMentionInView&&message_editor_module_default.mentionListPopoverHidden,userSelectorProps.popoverContentContainerProps?.className)}})]}),hasScroll&&jsx(`div`,{className:clsx(message_editor_module_default.editorFade,{[message_editor_module_default.editorFadeHidden]:isAtBottom}),"aria-hidden":`true`})]}),jsx(`div`,{className:clsx(message_editor_module_default.actionsWrapper,{[message_editor_module_default.withTimestampToggle]:!!videoTimestamp}),children:jsxs(`div`,{className:clsx(message_editor_module_default.actionsWrapperInner,{[message_editor_module_default.scrolledToBottom]:isAtBottom,[message_editor_module_default.characterLimitExceeded]:isCharacterLimitExceeded}),children:[errorMessage&&jsx(ErrorMessage,{errorMessage}),characterLimitState&&characterLimitState.excess>0&&!shouldApplyEditorFullWidth&&jsx(VisuallyHidden,{role:`alert`,children:intl.formatMessage(messages.characterLimitExceeded,{excess:characterLimitState.excess})}),videoTimestamp&&jsx(TimestampToggle,{className:message_editor_module_default.timestampToggle,disabled:disableEditor,formattedTimestamp:videoTimestamp.formattedTimestamp,isPressed:videoTimestamp.isPressed,onChange:videoTimestamp.onPressedChange}),isEditVariant?jsxs(`div`,{className:message_editor_module_default.editActionsColumn,children:[showCharacterLimitCounter&&jsx(CharacterLimitCounter,{count:characterLimitState.count,excess:characterLimitState.excess,maxCount:characterLimitState.maxCount}),jsx(`div`,{className:message_editor_module_default.editActionsRow,children:jsx(EditButtons,{disabled:isPostDisabled,getEditorJsonContent:()=>editor?.getJSON(),onCancel:props.onEditCancel,onEditSuccess:props.onEditSuccess,onSave:props.onSave,onSaveError:props.onSaveError})})]}):jsxs(Fragment,{children:[showCharacterLimitCounter&&jsx(CharacterLimitCounter,{count:characterLimitState.count,excess:characterLimitState.excess,maxCount:characterLimitState.maxCount}),jsx(PostButton,{buttonRef:postButtonRef,cleanEditor:()=>editor?.chain().setMeta(`addToHistory`,!1).setContent(``,{emitUpdate:!1}).run(),disabled:isPostDisabled,getEditorJsonContent:()=>editor?.getJSON(),onPost:props.onPost,onPostError:props.onPostError,onPostSuccess:props.onPostSuccess})]})]})})]})})},MessageEditor=props=>jsx(MessageEditorProvider,{children:jsx(MessageEditorContent,{...props})});export{MessageEditor,MessageEditorVariant};
1
+ import{THREADED_ANNOTATIONS_PORTAL}from"../../../v2/constants.js";import{THREADED_ANNOTATIONS_RESIN_TARGETS}from"../../../v2/resin-targets.js";import{useMentionContext}from"../../mention-component/mention-context.js";import{getSubmitShortcutAriaKeyShortcuts,isSubmitShortcut}from"../../../utils/is-submit-shortcut.js";import{createSuggestionOptions}from"./editor-extensions/custom-mention/custom-mention-suggestions.js";import{MENTION_PLUGIN_KEY,normalizeMentionPastedText,normalizeMentionTextInput}from"./editor-extensions/custom-mention/mention-trigger-normalization.js";import{useMentionState}from"./editor-extensions/custom-mention/useMentionState.js";import{createMessageEditorExtensions}from"./editor-extensions/create-message-editor-extensions.js";import{useCharacterLimit}from"./hooks/useCharacterLimit.js";import{useEditorContainerState}from"./hooks/useEditorContainerState.js";import{useMentionAnchorStyle}from"./hooks/useMentionAnchorStyle.js";import{useMentionUserSelection}from"./hooks/useMentionUserSelection.js";import{MessageEditorProvider,useMessageEditorContext}from"./message-editor-context.js";import messages from"./messages.js";import{t as message_editor_module_default}from"../../../../../chunks/message-editor2.module.js";import{CharacterLimitCounter}from"./subcomponents/character-limit-counter.js";import{EditButtons}from"./subcomponents/edit-buttons.js";import{ErrorMessage}from"./subcomponents/error-message.js";import{t as MessageEditorBubbleMenu}from"../../../../../chunks/message-editor-bubble-menu.js";import{PostButton}from"./subcomponents/post-button.js";import{t as TimestampToggle}from"../../../../../chunks/timestamp-toggle.js";import{MessageEditorVariant}from"./message-editor.types.js";import{VisuallyHidden}from"@box/blueprint-web";import clsx from"clsx";import{useCallback,useEffect,useMemo,useRef}from"react";import{useIntl}from"react-intl";import{Fragment,jsx,jsxs}from"react/jsx-runtime";import{EditorContent,useEditor,useEditorState}from"@tiptap/react";import{UserSelectorHeadless}from"@box/user-selector";var IS_APPLE_DEVICE=typeof navigator<`u`&&/Mac|iP(hone|ad|od)/.test(navigator.platform),MESSAGE_EDITOR_FOCUS_CONTROL_SELECTOR=`button, a, input, textarea, label, [role="toolbar"], [role="checkbox"], [tabindex="0"]`,getShortcutFormat=event=>{if(!(IS_APPLE_DEVICE?event.metaKey:event.ctrlKey))return null;if(event.shiftKey)return event.code===`Digit8`?`bulletList`:event.code===`Digit7`?`orderedList`:null;switch(event.key.toLowerCase()){case`b`:return`bold`;case`i`:return`italic`;case`u`:return`underline`;default:return null}},MessageEditorContent=props=>{let{autoFocus=!0,disableComponent=!1,initialContent,isFirstAnnotation=!1,isReply=!1,isRichTextEnabled=!1,maxCharacterCount,onChange,onFormatToggle,userSelectorProps,videoTimestamp}=props,userSelectorRef=useRef(null),editorContainerRef=useRef(null),editorViewportRef=useRef(null),editorRef=useRef(null),editorInstanceRef=useRef(null),postButtonRef=useRef(null),onFormatToggleRef=useRef(onFormatToggle);onFormatToggleRef.current=onFormatToggle;let onChangeRef=useRef(onChange);onChangeRef.current=onChange;let intl=useIntl(),{errorMessage,isLoading}=useMessageEditorContext(),{close:closeMentionDropdown,isActive,query,command,clientRect,suggestionCallbacks}=useMentionState(userSelectorRef),{closeAllPopovers}=useMentionContext(),placeholderText=intl.formatMessage(isReply?messages.placeholderReply:messages.placeholderAddComment),isEditVariant=props.variant===MessageEditorVariant.EDIT_MESSAGE,editor=useEditor({extensions:createMessageEditorExtensions({isRichTextEnabled,mentionSuggestion:createSuggestionOptions(MENTION_PLUGIN_KEY,`@`,suggestionCallbacks),placeholder:placeholderText}),autofocus:autoFocus,content:initialContent,editorProps:{attributes:{"aria-keyshortcuts":getSubmitShortcutAriaKeyShortcuts(),class:message_editor_module_default.editor,"data-resin-target":THREADED_ANNOTATIONS_RESIN_TARGETS.COMMENT_EDITOR},handleKeyDown:(view,event)=>{if(event.key===`Enter`&&event.shiftKey&&!event.isComposing)return editorInstanceRef.current?.commands.splitBlock()??!1;if(!isEditVariant&&isSubmitShortcut(event)){let postButton=postButtonRef.current;return!postButton||postButton.disabled?!1:(postButton.click(),!0)}if(isRichTextEnabled){let format=getShortcutFormat(event),editorInstance=editorInstanceRef.current;if(format&&editorInstance?.isEditable){let wasActive=editorInstance.isActive(format);queueMicrotask(()=>{if(editorInstance.isDestroyed)return;let isFormatActive=editorInstance.isActive(format);isFormatActive!==wasActive&&onFormatToggleRef.current?.(format,isFormatActive)})}}return!1},handleTextInput:normalizeMentionTextInput,transformPastedText:normalizeMentionPastedText},onCreate:({editor:editorInstance})=>{editorInstanceRef.current=editorInstance,editorRef.current=editorInstance.view.dom,autoFocus&&editorInstance.commands.focus(`end`)},onUpdate:({editor:editorInstance})=>{onChangeRef.current?.(editorInstance.isEmpty?null:editorInstance.getJSON()),closeAllPopovers?.()}},[placeholderText,isRichTextEnabled,isEditVariant]),{onUserSelected}=useMentionUserSelection(useMemo(()=>command&&editor&&!editor.isDestroyed?{command,editor}:null,[command,editor])),{exceedsSingleLine,hasScroll,isAtBottom}=useEditorContainerState(editorContainerRef,editor),{isInView:isMentionInView,style:mentionAnchorStyle}=useMentionAnchorStyle(clientRect,isActive,editorContainerRef),characterLimitState=useCharacterLimit(editor,maxCharacterCount),isEditorEmpty=useEditorState({editor,selector:()=>({isEmpty:!editor||!editor.schema||editor.isEmpty})})?.isEmpty??!0,shouldApplyEditorFullWidth=isEditVariant||!isFirstAnnotation||isFirstAnnotation&&exceedsSingleLine,disableEditor=disableComponent||isLoading,isCharacterLimitExceeded=(characterLimitState?.excess??0)>0,isPostDisabled=isEditorEmpty||disableEditor||isCharacterLimitExceeded,showCharacterLimitCounter=characterLimitState&&characterLimitState.excess>0&&shouldApplyEditorFullWidth;useEffect(()=>{editor&&editor.setEditable(!disableEditor)},[editor,disableEditor]),useEffect(()=>{if(!isCharacterLimitExceeded||!editorContainerRef.current||!initialContent)return;let innerFrameId=0,outerFrameId=requestAnimationFrame(()=>{innerFrameId=requestAnimationFrame(()=>{editorContainerRef.current?.scrollTo({top:editorContainerRef.current.scrollHeight})})});return()=>{cancelAnimationFrame(outerFrameId),cancelAnimationFrame(innerFrameId)}},[isCharacterLimitExceeded]),useEffect(()=>{!editor||initialContent===void 0||queueMicrotask(()=>{editor.isDestroyed||(editor.chain().setMeta(`addToHistory`,!1).setContent(initialContent??``,{emitUpdate:!1}).run(),onChangeRef.current?.(editor.isEmpty?null:editor.getJSON()),autoFocus&&editor.commands.focus(`end`))})},[initialContent]),useEffect(()=>{if(!isActive)return;let portalSelector=`[${Object.keys(THREADED_ANNOTATIONS_PORTAL)[0]}]`,isInsideEditorOrPortal=target=>{if(editorContainerRef.current?.contains(target))return!0;let portals=document.querySelectorAll(portalSelector);for(let portal of portals)if(portal.contains(target))return!0;return!1},handleClose=e=>{let target=e.target;!target||isInsideEditorOrPortal(target)||closeMentionDropdown()},frameId=requestAnimationFrame(()=>{document.addEventListener(`mousedown`,handleClose),document.addEventListener(`focusin`,handleClose)});return()=>{cancelAnimationFrame(frameId),document.removeEventListener(`mousedown`,handleClose),document.removeEventListener(`focusin`,handleClose)}},[closeMentionDropdown,isActive]);let handleFormatToggle=useCallback((format,isFormatActive)=>onFormatToggleRef.current?.(format,isFormatActive),[]),handleMessageEditorMouseDown=useCallback(event=>{if(disableEditor||!editor||editor.isDestroyed)return;let{target}=event;target instanceof Element&&(editorContainerRef.current?.contains(target)||editor.view.dom.contains(target)||target.closest(MESSAGE_EDITOR_FOCUS_CONTROL_SELECTOR)||editor.isFocused||editor.commands.focus(`end`))},[disableEditor,editor]),anchorElement=jsx(`div`,{className:message_editor_module_default.anchorElement,style:mentionAnchorStyle});return jsx(`div`,{"data-no-expand":!0,className:message_editor_module_default.messageEditorWrapper,children:jsxs(`div`,{className:clsx(message_editor_module_default.messageEditor,{[message_editor_module_default.editorHasScroll]:hasScroll,[message_editor_module_default.editorEditMode]:isEditVariant,[message_editor_module_default.editorError]:errorMessage||isCharacterLimitExceeded,[message_editor_module_default.editorFirstAnnotation]:!isEditVariant&&isFirstAnnotation,[message_editor_module_default.editorCharacterLimitExceeded]:isCharacterLimitExceeded}),onMouseDown:handleMessageEditorMouseDown,children:[jsxs(`div`,{ref:editorViewportRef,className:clsx(message_editor_module_default.editorViewport,{[message_editor_module_default.editorFullWidth]:shouldApplyEditorFullWidth}),children:[isRichTextEnabled&&jsx(MessageEditorBubbleMenu,{editor,menuAnchorRef:editorViewportRef,onFormatToggle:handleFormatToggle}),jsxs(`div`,{ref:editorContainerRef,className:message_editor_module_default.editorContainer,"aria-label":intl.formatMessage(messages.scrollContainerAriaLabel),children:[jsx(EditorContent,{"aria-label":intl.formatMessage(messages.editorContentAriaLabel),editor}),jsx(UserSelectorHeadless,{ref:userSelectorRef,inputElementRef:editorRef,onSelectedUserChange:onUserSelected,open:isActive,rootElement:anchorElement,value:query,...userSelectorProps,popoverContentContainerProps:{...userSelectorProps.popoverContentContainerProps,...THREADED_ANNOTATIONS_PORTAL,avoidCollisions:isMentionInView,className:clsx(message_editor_module_default.mentionListPopover,!isMentionInView&&message_editor_module_default.mentionListPopoverHidden,userSelectorProps.popoverContentContainerProps?.className)}})]}),hasScroll&&jsx(`div`,{className:clsx(message_editor_module_default.editorFade,{[message_editor_module_default.editorFadeHidden]:isAtBottom}),"aria-hidden":`true`})]}),jsx(`div`,{className:clsx(message_editor_module_default.actionsWrapper,{[message_editor_module_default.withTimestampToggle]:!!videoTimestamp}),children:jsxs(`div`,{className:clsx(message_editor_module_default.actionsWrapperInner,{[message_editor_module_default.scrolledToBottom]:isAtBottom,[message_editor_module_default.characterLimitExceeded]:isCharacterLimitExceeded}),children:[errorMessage&&jsx(ErrorMessage,{errorMessage}),characterLimitState&&characterLimitState.excess>0&&!shouldApplyEditorFullWidth&&jsx(VisuallyHidden,{role:`alert`,children:intl.formatMessage(messages.characterLimitExceeded,{excess:characterLimitState.excess})}),videoTimestamp&&jsx(TimestampToggle,{className:message_editor_module_default.timestampToggle,disabled:disableEditor,formattedTimestamp:videoTimestamp.formattedTimestamp,isPressed:videoTimestamp.isPressed,onChange:videoTimestamp.onPressedChange}),isEditVariant?jsxs(`div`,{className:message_editor_module_default.editActionsColumn,children:[showCharacterLimitCounter&&jsx(CharacterLimitCounter,{count:characterLimitState.count,excess:characterLimitState.excess,maxCount:characterLimitState.maxCount}),jsx(`div`,{className:message_editor_module_default.editActionsRow,children:jsx(EditButtons,{disabled:isPostDisabled,getEditorJsonContent:()=>editor?.getJSON(),onCancel:props.onEditCancel,onEditSuccess:props.onEditSuccess,onSave:props.onSave,onSaveError:props.onSaveError})})]}):jsxs(Fragment,{children:[showCharacterLimitCounter&&jsx(CharacterLimitCounter,{count:characterLimitState.count,excess:characterLimitState.excess,maxCount:characterLimitState.maxCount}),jsx(PostButton,{buttonRef:postButtonRef,cleanEditor:()=>editor?.chain().setMeta(`addToHistory`,!1).setContent(``,{emitUpdate:!1}).run(),disabled:isPostDisabled,getEditorJsonContent:()=>editor?.getJSON(),onPost:props.onPost,onPostError:props.onPostError,onPostSuccess:props.onPostSuccess})]})]})})]})})},MessageEditor=props=>jsx(MessageEditorProvider,{children:jsx(MessageEditorContent,{...props})});export{MessageEditor,MessageEditorVariant};
@@ -1 +1 @@
1
- var THREADED_ANNOTATIONS_RESIN_FEATURE=`activityfeedv2`,THREADED_ANNOTATIONS_RESIN_COMPONENTS={ANNOTATION_MENU:`activityfeedannotation`,COMMENT_CARD:`activityfeedcommentcard`,COMMENT_MENU:`activityfeedcomment`},THREADED_ANNOTATIONS_RESIN_TARGETS={ANNOTATION_COPY_LINK:`activityfeed-annotation-copylink`,ANNOTATION_DELETE:`activityfeed-annotation-delete`,ANNOTATION_EDIT:`activityfeed-annotation-edit`,ANNOTATION_MENU:`activityfeed-annotation-options`,ANNOTATION_RESOLVE:`activityfeed-annotation-resolve`,ANNOTATION_UNRESOLVE:`activityfeed-annotation-unresolve`,COMMENT_COPY_LINK:`activityfeed-comment-copylink`,COMMENT_DELETE:`activityfeed-comment-delete`,COMMENT_EDIT:`activityfeed-comment-edit`,COMMENT_MENU:`activityfeed-comment-options`,COMMENT_POST:`activityfeed-comment-post`,COMMENT_REPLY:`activityfeed-comment-reply`,COMMENT_RESOLVE:`activityfeed-comment-resolve`,COMMENT_UNRESOLVE:`activityfeed-comment-unresolve`,DELETE_CANCEL:`activityfeed-delete-cancel`,DELETE_CONFIRM:`activityfeed-delete-confirm`,MENTION:`activityfeed-mentionlink`,PROFILE:`activityfeed-profilelink`};export{THREADED_ANNOTATIONS_RESIN_COMPONENTS,THREADED_ANNOTATIONS_RESIN_FEATURE,THREADED_ANNOTATIONS_RESIN_TARGETS};
1
+ var THREADED_ANNOTATIONS_RESIN_FEATURE=`activityfeedv2`,THREADED_ANNOTATIONS_RESIN_COMPONENTS={ANNOTATION_MENU:`activityfeedannotation`,COMMENT_CARD:`activityfeedcommentcard`,COMMENT_MENU:`activityfeedcomment`},THREADED_ANNOTATIONS_RESIN_TARGETS={ANNOTATION_COPY_LINK:`activityfeed-annotation-copylink`,ANNOTATION_DELETE:`activityfeed-annotation-delete`,ANNOTATION_EDIT:`activityfeed-annotation-edit`,ANNOTATION_MENU:`activityfeed-annotation-options`,ANNOTATION_RESOLVE:`activityfeed-annotation-resolve`,ANNOTATION_UNRESOLVE:`activityfeed-annotation-unresolve`,COMMENT_COPY_LINK:`activityfeed-comment-copylink`,COMMENT_DELETE:`activityfeed-comment-delete`,COMMENT_EDIT:`activityfeed-comment-edit`,COMMENT_EDITOR:`activityfeed-comment-editor`,COMMENT_MENU:`activityfeed-comment-options`,COMMENT_POST:`activityfeed-comment-post`,COMMENT_REPLY:`activityfeed-comment-reply`,COMMENT_RESOLVE:`activityfeed-comment-resolve`,COMMENT_UNRESOLVE:`activityfeed-comment-unresolve`,DELETE_CANCEL:`activityfeed-delete-cancel`,DELETE_CONFIRM:`activityfeed-delete-confirm`,MENTION:`activityfeed-mentionlink`,PROFILE:`activityfeed-profilelink`};export{THREADED_ANNOTATIONS_RESIN_COMPONENTS,THREADED_ANNOTATIONS_RESIN_FEATURE,THREADED_ANNOTATIONS_RESIN_TARGETS};
@@ -1,2 +1,2 @@
1
- import{underlineMarkdownItPlugin}from"./underline-markdown-it-plugin.js";import{v4}from"uuid";import MarkdownIt from"markdown-it";var MARKDOWN_IT_DISABLE=[`autolink`,`backticks`,`blockquote`,`code`,`fence`,`heading`,`hr`,`html_block`,`html_inline`,`image`,`lheading`,`link`,`reference`],UAA_MENTION_RE=/^@\[([^:\]]+):([^\]]+)\]/,tokenizeUaaMention=(state,silent)=>{if(state.src.charCodeAt(state.pos)!==64)return!1;let match=UAA_MENTION_RE.exec(state.src.slice(state.pos));if(!match)return!1;if(!silent){let token=state.push(`mention`,`mention`,0);token.content=match[0],token.meta={userId:match[1],userName:match[2]}}return state.pos+=match[0].length,!0},tokenizer=(()=>{let tokenizer=new MarkdownIt(`commonmark`,{html:!1,linkify:!1,breaks:!1});return MARKDOWN_IT_DISABLE.forEach(rule=>{tokenizer.disable(rule)}),tokenizer.inline.ruler.before(`escape`,`uaa_mention`,tokenizeUaaMention),tokenizer.use(underlineMarkdownItPlugin),tokenizer})(),createEmptyDoc=()=>({type:`doc`,content:[]}),createMention=(userId,userName)=>({attrs:{authorId:userId,mentionId:v4(),mentionedUserId:userId,mentionedUserName:userName},type:`mention`}),marksFromStack=stack=>stack.length>0?stack.map(type=>({type})):void 0,OPEN_MARK={em_open:`italic`,strong_open:`bold`,underline_open:`underline`},CLOSE_MARK={em_close:`italic`,strong_close:`bold`,underline_close:`underline`},parseInline=tokens=>{if(!tokens?.length)return;let content=[],markStack=[],pushText=text=>{text&&content.push({type:`text`,text,marks:marksFromStack(markStack)})};return tokens.forEach(token=>{if(token.type===`mention`){let meta=token.meta;meta&&content.push(createMention(meta.userId,meta.userName));return}if(token.type===`text`){pushText(token.content);return}if(token.type===`softbreak`||token.type===`hardbreak`){pushText(`
1
+ import{splitListsOnBlankLinePlugin}from"./split-lists-on-blank-line-plugin.js";import{underlineMarkdownItPlugin}from"./underline-markdown-it-plugin.js";import{v4}from"uuid";import MarkdownIt from"markdown-it";var MARKDOWN_IT_DISABLE=[`autolink`,`backticks`,`blockquote`,`code`,`fence`,`heading`,`hr`,`html_block`,`html_inline`,`image`,`lheading`,`link`,`reference`],UAA_MENTION_RE=/^@\[([^:\]]+):([^\]]+)\]/,tokenizeUaaMention=(state,silent)=>{if(state.src.charCodeAt(state.pos)!==64)return!1;let match=UAA_MENTION_RE.exec(state.src.slice(state.pos));if(!match)return!1;if(!silent){let token=state.push(`mention`,`mention`,0);token.content=match[0],token.meta={userId:match[1],userName:match[2]}}return state.pos+=match[0].length,!0},tokenizer=(()=>{let tokenizer=new MarkdownIt(`commonmark`,{html:!1,linkify:!1,breaks:!1});return MARKDOWN_IT_DISABLE.forEach(rule=>{tokenizer.disable(rule)}),tokenizer.inline.ruler.before(`escape`,`uaa_mention`,tokenizeUaaMention),tokenizer.use(underlineMarkdownItPlugin),tokenizer.use(splitListsOnBlankLinePlugin),tokenizer})(),createEmptyDoc=()=>({type:`doc`,content:[]}),createMention=(userId,userName)=>({attrs:{authorId:userId,mentionId:v4(),mentionedUserId:userId,mentionedUserName:userName},type:`mention`}),marksFromStack=stack=>stack.length>0?stack.map(type=>({type})):void 0,OPEN_MARK={em_open:`italic`,strong_open:`bold`,underline_open:`underline`},CLOSE_MARK={em_close:`italic`,strong_close:`bold`,underline_close:`underline`},parseInline=tokens=>{if(!tokens?.length)return;let content=[],markStack=[],pushText=text=>{text&&content.push({type:`text`,text,marks:marksFromStack(markStack)})};return tokens.forEach(token=>{if(token.type===`mention`){let meta=token.meta;meta&&content.push(createMention(meta.userId,meta.userName));return}if(token.type===`text`){pushText(token.content);return}if(token.type===`softbreak`||token.type===`hardbreak`){pushText(`
2
2
  `);return}let openMark=OPEN_MARK[token.type];if(openMark){markStack.push(openMark);return}let closeMark=CLOSE_MARK[token.type];if(closeMark){let index=markStack.lastIndexOf(closeMark);index>=0&&markStack.splice(index,1)}}),content.length>0?content:void 0},parseListItem=(tokens,openIndex)=>{let content=[],index=openIndex+1;for(;index<tokens.length&&tokens[index].type!==`list_item_close`;){let token=tokens[index];if(token.type===`paragraph_open`){let{paragraph,closeIndex}=parseParagraph(tokens,index);content.push(paragraph),index=closeIndex+1}else if(token.type===`bullet_list_open`||token.type===`ordered_list_open`){let{list,closeIndex}=parseList(tokens,index);content.push(list),index=closeIndex+1}else index+=1}return{closeIndex:index,item:{type:`listItem`,content:content.length>0?content:void 0}}},parseList=(tokens,openIndex)=>{let open=tokens[openIndex],isOrdered=open.type===`ordered_list_open`,closeType=isOrdered?`ordered_list_close`:`bullet_list_close`,items=[],index=openIndex+1;for(;index<tokens.length&&tokens[index].type!==closeType;)if(tokens[index].type===`list_item_open`){let parsed=parseListItem(tokens,index);items.push(parsed.item),index=parsed.closeIndex+1}else index+=1;if(!isOrdered)return{closeIndex:index,list:{type:`bulletList`,content:items}};let startRaw=open.attrGet(`start`),start=startRaw==null?void 0:Number(startRaw);return{closeIndex:index,list:Number.isFinite(start)&&start!==1?{type:`orderedList`,content:items,attrs:{start}}:{type:`orderedList`,content:items}}},parseParagraph=(tokens,openIndex)=>{let index=openIndex+1,inline;for(;index<tokens.length&&tokens[index].type!==`paragraph_close`;)tokens[index].type===`inline`&&(inline=tokens[index]),index+=1;return{closeIndex:index,paragraph:{type:`paragraph`,content:parseInline(inline?.children)}}},parseBlocks=tokens=>{let blocks=[],index=0;for(;index<tokens.length;){let token=tokens[index];if(token.type===`paragraph_open`){let{paragraph,closeIndex}=parseParagraph(tokens,index);blocks.push(paragraph),index=closeIndex+1}else if(token.type===`bullet_list_open`||token.type===`ordered_list_open`){let{list,closeIndex}=parseList(tokens,index);blocks.push(list),index=closeIndex+1}else index+=1}return blocks},parseMessageMarkdown=markdown=>markdown?{type:`doc`,content:parseBlocks(tokenizer.parse(markdown,{}))}:createEmptyDoc();export{parseMessageMarkdown};
@@ -1,4 +1,3 @@
1
- import{isListNode}from"./document-node-guards.js";var MARK_WRAP_ORDER=[`italic`,`bold`,`underline`],MARK_WRAPPER={bold:text=>`**${text}**`,italic:text=>`_${text}_`,underline:text=>`++${text}++`},ESCAPE_RE=/([\\*_[\]+\-@])/g,escapeText=text=>text.replace(ESCAPE_RE,`\\$1`),escapeOrderedListMarker=text=>text.replace(/(^|\n)(\d{1,9})([.)])(\s)/g,`$1$2\\$3$4`),wrapMarks=(text,marks)=>{let types=new Set((marks??[]).map(mark=>mark.type));if(types.size===0)return text;let[,leadingWhitespace,content,trailingWhitespace]=text.match(/^(\s*)([\s\S]*?)(\s*)$/)??[``,``,text,``];if(!content)return text;let wrapped=content;return MARK_WRAP_ORDER.forEach(type=>{types.has(type)&&(wrapped=MARK_WRAPPER[type](wrapped))}),`${leadingWhitespace}${wrapped}${trailingWhitespace}`},serializeMention=node=>`@[${node.attrs.mentionedUserId}:${node.attrs.mentionedUserName}]`,serializeText=node=>wrapMarks(escapeText(node.text),node.marks),serializeInline=nodes=>(nodes??[]).map(node=>node.type===`mention`?serializeMention(node):serializeText(node)).join(``),serializeParagraph=paragraph=>escapeOrderedListMarker(serializeInline(paragraph.content)),serializeListItem=(item,indent,marker)=>{let content=item.content??[],lines=[],usedMarker=!1,continuationIndent=`${indent}${` `.repeat(marker.length)}`;return content.forEach(child=>{if(child.type===`paragraph`){let inline=serializeParagraph(child);usedMarker?(lines.push(``),lines.push(`${continuationIndent}${inline}`)):(lines.push(`${indent}${marker}${inline}`),usedMarker=!0);return}isListNode(child)&&(usedMarker||=(lines.push(`${indent}${marker}`.trimEnd()),!0),lines.push(...serializeList(child,continuationIndent)))}),usedMarker||lines.push(`${indent}${marker}`.trimEnd()),lines},serializeList=(list,indent)=>{if(list.type===`bulletList`)return(list.content??[]).flatMap(item=>serializeListItem(item,indent,`- `));let start=typeof list.attrs?.start==`number`?list.attrs.start:1;return(list.content??[]).flatMap((item,index)=>serializeListItem(item,indent,`${start+index}. `))},serializeBlock=block=>block.type===`paragraph`?serializeParagraph(block):isListNode(block)?serializeList(block,``).join(`
2
- `):``,serializeMessageToMarkdown=doc=>doc?.content?.length?doc.content.map(serializeBlock).filter(block=>block.length>0).join(`
3
-
4
- `):``;export{serializeMessageToMarkdown};
1
+ import{isKnownBlockNode,isListNode}from"./document-node-guards.js";var isWordChar=char=>char!==void 0&&/\w/.test(char),isWhitespaceChar=char=>char===void 0||/\s/.test(char),isPunctuationChar=char=>char!==void 0&&!isWordChar(char)&&!/\s/.test(char),canFormUnderlineSpan=(text,start,end)=>{let lastChar=start>0?text[start-1]:void 0,nextChar=end<text.length?text[end]:void 0,isLastWhiteSpace=isWhitespaceChar(lastChar),isNextWhiteSpace=isWhitespaceChar(nextChar),isLastPunctChar=isPunctuationChar(lastChar),isNextPunctChar=isPunctuationChar(nextChar),leftFlanking=!isNextWhiteSpace&&(!isNextPunctChar||isLastWhiteSpace||isLastPunctChar),rightFlanking=!isLastWhiteSpace&&(!isLastPunctChar||isNextWhiteSpace||isNextPunctChar),isIncrementRun=isWordChar(lastChar)&&isWhitespaceChar(nextChar);return(leftFlanking||rightFlanking)&&!isIncrementRun},escapeText=text=>{let result=``,index=0;for(;index<text.length;){let char=text[index];if(char===`\\`||char===`*`)result+=`\\${char}`,index+=1;else if(char===`_`){let isMidWord=isWordChar(text[index-1])&&isWordChar(text[index+1]);result+=isMidWord?char:`\\${char}`,index+=1}else if(char===`@`&&text[index+1]===`[`)result+=`\\@`,index+=1;else if(char===`+`){let end=index;for(;end<text.length&&text[end]===`+`;)end+=1;let run=text.slice(index,end);result+=run.length>=2&&canFormUnderlineSpan(text,index,end)?run.replace(/\+/g,`\\+`):run,index=end}else result+=char,index+=1}return result},escapeStartOfLine=text=>text.replace(/(^|\n)([ \t]*)(\d{1,9})([.)])(\s|$)/g,`$1$2$3\\$4$5`).replace(/(^|\n)([ \t]*)([-+])(\s|$)/g,`$1$2\\$3$4`),wrapMarks=(text,marks)=>{let types=new Set((marks??[]).map(mark=>mark.type));if(types.size===0)return text;let[,leadingWhitespace,content,trailingWhitespace]=text.match(/^(\s*)([\s\S]*?)(\s*)$/)??[``,``,text,``];if(!content)return text;let stars=`*`.repeat(+!!types.has(`italic`)+(types.has(`bold`)?2:0)),wrapped=stars?`${stars}${content}${stars}`:content;return types.has(`underline`)?`++${leadingWhitespace}${wrapped}${trailingWhitespace}++`:`${leadingWhitespace}${wrapped}${trailingWhitespace}`},serializeMention=node=>`@[${node.attrs.mentionedUserId}:${node.attrs.mentionedUserName}]`,serializeText=node=>wrapMarks(escapeText(node.text),node.marks),serializeInline=nodes=>(nodes??[]).map(node=>node.type===`mention`?serializeMention(node):serializeText(node)).join(``),serializeParagraph=paragraph=>escapeStartOfLine(serializeInline(paragraph.content)),leadingWhitespaceLength=text=>text.match(/^[ \t]*/)?.[0].length??0,serializeListItem=(item,indent,marker)=>{let content=item.content??[],lines=[],usedMarker=!1,firstParagraph=content.find(child=>child.type===`paragraph`),leadingWs=leadingWhitespaceLength(firstParagraph?serializeParagraph(firstParagraph):``),continuationIndent=`${indent}${` `.repeat(marker.length+leadingWs)}`;return content.forEach(child=>{if(child.type===`paragraph`){let inline=serializeParagraph(child);usedMarker?(lines.push(``),lines.push(`${continuationIndent}${inline}`)):(lines.push(`${indent}${marker}${inline}`),usedMarker=!0);return}isListNode(child)&&(usedMarker||=(lines.push(`${indent}${marker}`.trimEnd()),!0),lines.push(...serializeList(child,continuationIndent)))}),usedMarker||lines.push(`${indent}${marker}`.trimEnd()),lines},serializeList=(list,indent)=>{if(list.type===`bulletList`)return(list.content??[]).flatMap(item=>serializeListItem(item,indent,`- `));let start=typeof list.attrs?.start==`number`?list.attrs.start:1;return(list.content??[]).flatMap((item,index)=>serializeListItem(item,indent,`${start+index}. `))},serializeBlock=block=>block.type===`paragraph`?serializeParagraph(block):isListNode(block)?serializeList(block,``).join(`
2
+ `):``,joinSerializedBlocks=parts=>{let result=``,pendingEmpties=0;return parts.forEach(part=>{if(part.length===0){pendingEmpties+=1;return}result.length>0&&(result+=`
3
+ `.repeat(2+pendingEmpties)),result+=part,pendingEmpties=0}),result},serializeMessageToMarkdown=doc=>doc?.content?.length?joinSerializedBlocks(doc.content.filter(isKnownBlockNode).map(serializeBlock)):``;export{serializeMessageToMarkdown};
@@ -0,0 +1,2 @@
1
+ var isListOpen=type=>type===`bullet_list_open`||type===`ordered_list_open`,extraEmptyParagraphsBefore=(lines,startLine)=>{if(typeof startLine!=`number`||startLine<=0)return 0;let blanks=0;for(let line=startLine-1;line>=0&&lines[line].trim()===``;--line)blanks+=1;return Math.max(0,blanks-1)},createEmptyParagraphTokens=state=>{let open=new state.Token(`paragraph_open`,`p`,1);open.block=!0;let inline=new state.Token(`inline`,``,0);inline.content=``,inline.children=[];let close=new state.Token(`paragraph_close`,`p`,-1);return close.block=!0,[open,inline,close]},isTopLevelBlockClose=token=>token.level===0&&token.nesting===-1&&(token.type===`paragraph_close`||token.type===`bullet_list_close`||token.type===`ordered_list_close`),isTopLevelBlockOpen=token=>token.level===0&&token.nesting===1&&(token.type===`paragraph_open`||isListOpen(token.type)),restoreEmptyParagraphs=state=>{let lines=state.src.split(`
2
+ `),{tokens}=state,inserts=[];for(let index=0;index<tokens.length-1;index+=1)if(isTopLevelBlockClose(tokens[index])&&isTopLevelBlockOpen(tokens[index+1])){let count=extraEmptyParagraphsBefore(lines,tokens[index+1].map?.[0]);count>0&&inserts.push({count,index:index+1})}for(let offset=inserts.length-1;offset>=0;--offset){let{count,index}=inserts[offset],emptyParagraphs=Array.from({length:count},()=>createEmptyParagraphTokens(state)).flat();tokens.splice(index,0,...emptyParagraphs)}},splitListsOnBlankLinePlugin=md=>{md.core.ruler.after(`block`,`restore_empty_paragraphs`,restoreEmptyParagraphs)};export{splitListsOnBlankLinePlugin};
@@ -1 +1 @@
1
- var PLUS_CHAR_CODE=43,tokenize=(state,silent)=>{if(silent)return!1;let start=state.pos;if(state.src.charCodeAt(start)!==PLUS_CHAR_CODE)return!1;let scanned=state.scanDelims(start,!0),len=scanned.length;if(len<2)return!1;let ch=String.fromCharCode(PLUS_CHAR_CODE);if(len%2){let token=state.push(`text`,``,0);token.content=ch,--len}for(let i=0;i<len;i+=2){let token=state.push(`text`,``,0);token.content=`++`,(scanned.can_open||scanned.can_close)&&state.delimiters.push({close:scanned.can_close,end:-1,length:0,marker:PLUS_CHAR_CODE,open:scanned.can_open,token:state.tokens.length-1})}return state.pos+=scanned.length,!0},postProcess=(state,delimiters)=>{delimiters.forEach(startDelim=>{if(startDelim.marker!==PLUS_CHAR_CODE||startDelim.end===-1)return;let endDelim=delimiters[startDelim.end],tokenOpen=state.tokens[startDelim.token];tokenOpen.type=`underline_open`,tokenOpen.tag=`underline`,tokenOpen.nesting=1,tokenOpen.markup=`++`,tokenOpen.content=``;let tokenClose=state.tokens[endDelim.token];tokenClose.type=`underline_close`,tokenClose.tag=`underline`,tokenClose.nesting=-1,tokenClose.markup=`++`,tokenClose.content=``})},underlineMarkdownItPlugin=md=>{md.inline.ruler.before(`emphasis`,`underline`,tokenize),md.inline.ruler2.after(`emphasis`,`underline`,state=>(postProcess(state,state.delimiters),state.tokens_meta.forEach(meta=>{meta?.delimiters&&postProcess(state,meta.delimiters)}),!0))};export{underlineMarkdownItPlugin};
1
+ var PLUS_CHAR_CODE=43,ASTERISK_CHAR_CODE=42,UNDERSCORE_CHAR_CODE=95,SPACE_CHAR_CODE=32,isOwnEmphasisDelimiter=charCode=>charCode===ASTERISK_CHAR_CODE||charCode===UNDERSCORE_CHAR_CODE,scanTransparentDelims=(state,start,length)=>{let{isMdAsciiPunct,isPunctChar,isWhiteSpace}=state.md.utils,before=start-1;for(;before>=0&&isOwnEmphasisDelimiter(state.src.charCodeAt(before));)--before;let after=start+length;for(;after<state.posMax&&isOwnEmphasisDelimiter(state.src.charCodeAt(after));)after+=1;let lastChar=before>=0?state.src.charCodeAt(before):SPACE_CHAR_CODE,nextChar=after<state.posMax?state.src.charCodeAt(after):SPACE_CHAR_CODE,isLastPunctChar=isMdAsciiPunct(lastChar)||isPunctChar(String.fromCharCode(lastChar)),isNextPunctChar=isMdAsciiPunct(nextChar)||isPunctChar(String.fromCharCode(nextChar)),isLastWhiteSpace=isWhiteSpace(lastChar),isNextWhiteSpace=isWhiteSpace(nextChar),leftFlanking=!0,rightFlanking=!0;return(isNextWhiteSpace||isNextPunctChar&&!(isLastWhiteSpace||isLastPunctChar))&&(leftFlanking=!1),(isLastWhiteSpace||isLastPunctChar&&!(isNextWhiteSpace||isNextPunctChar))&&(rightFlanking=!1),{canClose:rightFlanking||isLastWhiteSpace,canOpen:leftFlanking||isNextWhiteSpace}},lastTextCharCode=token=>{if(!(token?.type!==`text`||token.content.length===0))return token.content.charCodeAt(token.content.length-1)},firstTextCharCode=token=>{if(!(token?.type!==`text`||token.content.length===0))return token.content.charCodeAt(0)},isWordLikeChar=(state,charCode)=>{let{isMdAsciiPunct,isPunctChar,isWhiteSpace}=state.md.utils;return!isWhiteSpace(charCode)&&!isMdAsciiPunct(charCode)&&!isPunctChar(String.fromCharCode(charCode))},isIncrementPair=(state,startDelim,endDelim)=>{let beforeOpen=lastTextCharCode(state.tokens[startDelim.token-1]),afterOpen=firstTextCharCode(state.tokens[startDelim.token+1]),beforeClose=lastTextCharCode(state.tokens[endDelim.token-1]);return beforeOpen===void 0||afterOpen===void 0||beforeClose===void 0?!1:isWordLikeChar(state,beforeOpen)&&state.md.utils.isWhiteSpace(afterOpen)&&isWordLikeChar(state,beforeClose)},tokenize=(state,silent)=>{if(silent)return!1;let start=state.pos;if(state.src.charCodeAt(start)!==PLUS_CHAR_CODE)return!1;let scanned=state.scanDelims(start,!0),len=scanned.length;if(len<2)return!1;let{canClose,canOpen}=scanTransparentDelims(state,start,scanned.length),ch=String.fromCharCode(PLUS_CHAR_CODE);if(len%2){let token=state.push(`text`,``,0);token.content=ch,--len}for(let i=0;i<len;i+=2){let token=state.push(`text`,``,0);token.content=`++`,(canOpen||canClose)&&state.delimiters.push({close:canClose,end:-1,length:0,marker:PLUS_CHAR_CODE,open:canOpen,token:state.tokens.length-1})}return state.pos+=scanned.length,!0},postProcess=(state,delimiters)=>{let loneMarkers=[];for(delimiters.forEach(startDelim=>{if(startDelim.marker!==PLUS_CHAR_CODE||startDelim.end===-1)return;let endDelim=delimiters[startDelim.end];if(isIncrementPair(state,startDelim,endDelim))return;let tokenOpen=state.tokens[startDelim.token];tokenOpen.type=`underline_open`,tokenOpen.tag=`underline`,tokenOpen.nesting=1,tokenOpen.markup=`++`,tokenOpen.content=``;let tokenClose=state.tokens[endDelim.token];tokenClose.type=`underline_close`,tokenClose.tag=`underline`,tokenClose.nesting=-1,tokenClose.markup=`++`,tokenClose.content=``;let beforeClose=state.tokens[endDelim.token-1];beforeClose?.type===`text`&&beforeClose.content===`+`&&loneMarkers.push(endDelim.token-1)});loneMarkers.length>0;){let markerIndex=loneMarkers.pop(),target=markerIndex+1;for(;target<state.tokens.length&&state.tokens[target].type===`underline_close`;)target+=1;if(--target,markerIndex!==target){let token=state.tokens[target];state.tokens[target]=state.tokens[markerIndex],state.tokens[markerIndex]=token}}},underlineMarkdownItPlugin=md=>{md.inline.ruler.before(`emphasis`,`underline`,tokenize),md.inline.ruler2.before(`emphasis`,`underline`,state=>(postProcess(state,state.delimiters),state.tokens_meta.forEach(meta=>{meta?.delimiters&&postProcess(state,meta.delimiters)}),!0))};export{underlineMarkdownItPlugin};
@@ -1 +1 @@
1
- ._textMessage_qsyra_29{flex-direction:column;flex:1;width:100%;height:100%;display:flex;position:relative;overflow:visible}._textMessage_qsyra_29 ._contentWrapper_qsyra_38{gap:var(--space-2);margin-top:.125rem;display:flex}._textMessage_qsyra_29 ._contentWrapper_qsyra_38 ._threadedIndicator_qsyra_43{width:var(--space-7);flex-shrink:0;position:relative}._textMessage_qsyra_29 ._contentWrapper_qsyra_38 ._threadedIndicator_qsyra_43:after{content:"";left:50%;top:var(--space-05);bottom:var(--space-05);width:var(--border-2);background-color:var(--border-divider-border);border-radius:var(--radius-1);position:absolute;transform:translate(-50%)}._textMessage_qsyra_29 ._contentWrapper_qsyra_38 ._threadedIndicatorHidden_qsyra_59:after{visibility:hidden}._textMessage_qsyra_29 ._contentWrapper_qsyra_38 ._messageContent_qsyra_62{overflow-wrap:break-word;row-gap:var(--bp-space-010);flex-direction:column;flex:1;min-width:0;display:flex}._textMessage_qsyra_29 ._contentWrapper_qsyra_38 ._messageContent_qsyra_62 strong{font-weight:var(--bp-font-weight-bold);font-style:inherit}._textMessage_qsyra_29 ._contentWrapper_qsyra_38 ._messageContent_qsyra_62 em{font-style:italic;font-weight:inherit}._textMessage_qsyra_29 ._contentWrapper_qsyra_38 ._messageContent_qsyra_62 ul,._textMessage_qsyra_29 ._contentWrapper_qsyra_38 ._messageContent_qsyra_62 ol{margin:0;padding-inline-start:var(--bp-space-060)}._textMessage_qsyra_29 ._contentWrapper_qsyra_38 ._messageContent_qsyra_62 ul,._textMessage_qsyra_29 ._contentWrapper_qsyra_38 ._messageContent_qsyra_62 ul>li{list-style-type:disc}._textMessage_qsyra_29 ._contentWrapper_qsyra_38 ._messageContent_qsyra_62 ol,._textMessage_qsyra_29 ._contentWrapper_qsyra_38 ._messageContent_qsyra_62 ol>li{list-style-type:decimal}._textMessage_qsyra_29 ._contentWrapper_qsyra_38 ._messageContent_qsyra_62 ul ul,._textMessage_qsyra_29 ._contentWrapper_qsyra_38 ._messageContent_qsyra_62 ul ol,._textMessage_qsyra_29 ._contentWrapper_qsyra_38 ._messageContent_qsyra_62 ol ul,._textMessage_qsyra_29 ._contentWrapper_qsyra_38 ._messageContent_qsyra_62 ol ol{margin-block-start:var(--bp-space-005)}._textMessage_qsyra_29 ._contentWrapper_qsyra_38 ._messageContent_qsyra_62 li p{margin:0}._textMessage_qsyra_29 ._contentWrapper_qsyra_38 ._messageContent_qsyra_62 ._inlineEditSlot_qsyra_100{margin-top:var(--space-2)}._textMessage_qsyra_29 ._contentWrapper_qsyra_38 ._messageContent_qsyra_62 ._annotationBadgeWrapper_qsyra_103{flex-direction:column;align-items:flex-start;min-width:0;max-width:100%;display:flex;overflow:hidden}._textMessage_qsyra_29 ._contentWrapper_qsyra_38 ._messageFooter_qsyra_111{align-items:center;gap:var(--space-1);flex-direction:row;display:flex}._textMessage_qsyra_29 ._contentWrapper_qsyra_38 ._messageFooter_qsyra_111 ._readableTimeWrapper_qsyra_117{cursor:auto}._replyButton_qsyra_121{padding-top:var(--space-05);padding-bottom:var(--space-05);opacity:0;transition:opacity .1s}[data-message-wrapper]:hover ._replyButton_qsyra_121,[data-message-wrapper]:focus-within ._replyButton_qsyra_121{opacity:1}@media (pointer:coarse),(hover:none){._replyButton_qsyra_121{opacity:1}}._seeMoreButton_qsyra_136{margin-inline-start:var(--bp-space-010)}._richTextList_qsyra_140 li{margin:0;padding:0}._richTextList_qsyra_140 li+li{margin-block-start:var(--bp-space-005)}
1
+ ._textMessage_1wvil_29{flex-direction:column;flex:1;width:100%;height:100%;display:flex;position:relative;overflow:visible}._textMessage_1wvil_29 ._contentWrapper_1wvil_38{gap:var(--space-2);margin-top:.125rem;display:flex}._textMessage_1wvil_29 ._contentWrapper_1wvil_38 ._threadedIndicator_1wvil_43{width:var(--space-7);flex-shrink:0;position:relative}._textMessage_1wvil_29 ._contentWrapper_1wvil_38 ._threadedIndicator_1wvil_43:after{content:"";left:50%;top:var(--space-05);bottom:var(--space-05);width:var(--border-2);background-color:var(--border-divider-border);border-radius:var(--radius-1);position:absolute;transform:translate(-50%)}._textMessage_1wvil_29 ._contentWrapper_1wvil_38 ._threadedIndicatorHidden_1wvil_59:after{visibility:hidden}._textMessage_1wvil_29 ._contentWrapper_1wvil_38 ._messageContent_1wvil_62{overflow-wrap:break-word;row-gap:var(--bp-space-010);flex-direction:column;flex:1;min-width:0;display:flex}._textMessage_1wvil_29 ._contentWrapper_1wvil_38 ._messageContent_1wvil_62 strong{font-weight:var(--bp-font-weight-bold);font-style:inherit}._textMessage_1wvil_29 ._contentWrapper_1wvil_38 ._messageContent_1wvil_62 em{font-style:italic;font-weight:inherit}._textMessage_1wvil_29 ._contentWrapper_1wvil_38 ._messageContent_1wvil_62 ul,._textMessage_1wvil_29 ._contentWrapper_1wvil_38 ._messageContent_1wvil_62 ol{margin:0;padding-inline-start:var(--bp-space-060)}._textMessage_1wvil_29 ._contentWrapper_1wvil_38 ._messageContent_1wvil_62 ul,._textMessage_1wvil_29 ._contentWrapper_1wvil_38 ._messageContent_1wvil_62 ul>li{list-style-type:disc}._textMessage_1wvil_29 ._contentWrapper_1wvil_38 ._messageContent_1wvil_62 ol,._textMessage_1wvil_29 ._contentWrapper_1wvil_38 ._messageContent_1wvil_62 ol>li{list-style-type:decimal}._textMessage_1wvil_29 ._contentWrapper_1wvil_38 ._messageContent_1wvil_62 ul ul,._textMessage_1wvil_29 ._contentWrapper_1wvil_38 ._messageContent_1wvil_62 ul ol,._textMessage_1wvil_29 ._contentWrapper_1wvil_38 ._messageContent_1wvil_62 ol ul,._textMessage_1wvil_29 ._contentWrapper_1wvil_38 ._messageContent_1wvil_62 ol ol{margin-block-start:var(--bp-space-005)}._textMessage_1wvil_29 ._contentWrapper_1wvil_38 ._messageContent_1wvil_62 li p{margin:0}._textMessage_1wvil_29 ._contentWrapper_1wvil_38 ._messageContent_1wvil_62 [data-message-body]{white-space:break-spaces}._textMessage_1wvil_29 ._contentWrapper_1wvil_38 ._messageContent_1wvil_62 [data-message-body]>ol._richTextList_1wvil_103+ol._richTextList_1wvil_103,._textMessage_1wvil_29 ._contentWrapper_1wvil_38 ._messageContent_1wvil_62 [data-message-body]>ul._richTextList_1wvil_103+ul._richTextList_1wvil_103{margin-block-start:var(--bp-space-050)}._textMessage_1wvil_29 ._contentWrapper_1wvil_38 ._messageContent_1wvil_62 ._inlineEditSlot_1wvil_107{margin-top:var(--space-2)}._textMessage_1wvil_29 ._contentWrapper_1wvil_38 ._messageContent_1wvil_62 ._annotationBadgeWrapper_1wvil_110{flex-direction:column;align-items:flex-start;min-width:0;max-width:100%;display:flex;overflow:hidden}._textMessage_1wvil_29 ._contentWrapper_1wvil_38 ._messageFooter_1wvil_118{align-items:center;gap:var(--space-1);flex-direction:row;display:flex}._textMessage_1wvil_29 ._contentWrapper_1wvil_38 ._messageFooter_1wvil_118 ._readableTimeWrapper_1wvil_124{cursor:auto}._replyButton_1wvil_128{padding-top:var(--space-05);padding-bottom:var(--space-05);opacity:0;transition:opacity .1s}[data-message-wrapper]:hover ._replyButton_1wvil_128,[data-message-wrapper]:focus-within ._replyButton_1wvil_128{opacity:1}@media (pointer:coarse),(hover:none){._replyButton_1wvil_128{opacity:1}}._seeMoreButton_1wvil_143{margin-inline-start:var(--bp-space-010)}._richTextList_1wvil_103 li{margin:0;padding:0}._richTextList_1wvil_103 li+li{margin-block-start:var(--bp-space-005)}
@@ -14,6 +14,7 @@ export declare const THREADED_ANNOTATIONS_RESIN_TARGETS: {
14
14
  readonly COMMENT_COPY_LINK: "activityfeed-comment-copylink";
15
15
  readonly COMMENT_DELETE: "activityfeed-comment-delete";
16
16
  readonly COMMENT_EDIT: "activityfeed-comment-edit";
17
+ readonly COMMENT_EDITOR: "activityfeed-comment-editor";
17
18
  readonly COMMENT_MENU: "activityfeed-comment-options";
18
19
  readonly COMMENT_POST: "activityfeed-comment-post";
19
20
  readonly COMMENT_REPLY: "activityfeed-comment-reply";
@@ -2,10 +2,10 @@ import { JSONContent } from '@tiptap/core';
2
2
  import { CollaborationPopoverProps } from '@box/collaboration-popover';
3
3
  import { MentionContextData } from '../../components/mention-component/mention-context';
4
4
  import { ThreadedAnnotationsProps } from '../threaded-annotations';
5
- import { AnnotationBadgeTargetType } from '../types/annotation-badge-types';
6
- import { TextMessageType } from '../types';
5
+ import { AnnotationBadgeTargetType, TextMessageType } from '../types';
7
6
  export declare const defaultUserSelectorProps: Omit<import('@box/user-selector').HeadlessUserSelectorProps, "open" | "value" | "rootElement" | "onSelectedUserChange" | "inputElementRef">;
8
- export declare const DefaultThreadedAnnotations: (props: ThreadedAnnotationsProps) => import("react/jsx-runtime").JSX.Element;
7
+ export declare const MOCK_HIGHLIGHT_TARGET: AnnotationBadgeTargetType;
8
+ export declare const RICH_TEXT_INITIAL_MESSAGES: TextMessageType[];
9
9
  interface InteractiveModuleBaseProps {
10
10
  initialMessages?: TextMessageType[];
11
11
  defaultExpanded?: boolean;
@@ -16,6 +16,7 @@ interface InteractiveModuleBaseProps {
16
16
  maxCharacterCount?: number;
17
17
  onCopyLink?: (id: string) => void;
18
18
  onEditSpy?: (id: string, content: JSONContent | null) => void;
19
+ onFormatToggle?: ThreadedAnnotationsProps['onFormatToggle'];
19
20
  onPostSpy?: (content: JSONContent | null) => void;
20
21
  }
21
22
  type InteractiveModuleProps = (InteractiveModuleBaseProps & {
@@ -2,6 +2,7 @@ export * from './button-utils';
2
2
  export * from './default-user-selector-props';
3
3
  export * from './interaction-utils';
4
4
  export * from './rich-text-initial-content';
5
+ export * from './rich-text-test-cases';
5
6
  export * from './test-selectors';
6
7
  export * from './text-utils';
7
8
  export * from './verify-mention-elements';
@@ -0,0 +1,61 @@
1
+ import { DocumentNode, InlineNode, ListItemNode, TextMark, TextNode } from '../types';
2
+ /**
3
+ * Shared rich-text fixtures. Optional `doc` (author), `parsed` (reader;
4
+ * defaults to `doc`), `normalized` (`serialize(parsed)`; defaults to `wire`).
5
+ * `plaintext` is the rich-text-disabled client. Strip clones copy
6
+ * `STRIP_CONTRACT_CASES` by row name; do not import across repos.
7
+ */
8
+ type RichTextGroup = 'paragraphs' | 'isolatedToolbar' | 'isolatedTyped' | 'isolatedPasted' | 'midWord' | 'midSentence' | 'mentionThenMark' | 'mentionThenBlock' | 'siblingLists' | 'nestedLists';
9
+ type RichTextCase = {
10
+ group: RichTextGroup;
11
+ name: string;
12
+ wire: string;
13
+ doc?: DocumentNode;
14
+ parsed?: DocumentNode;
15
+ normalized?: string;
16
+ plaintext: string;
17
+ /** Typed/pasted source when it differs from `wire`. */
18
+ input?: string;
19
+ /** Why strip may differ from `plaintext`. */
20
+ stripDivergence?: {
21
+ reason: string;
22
+ strip: string;
23
+ };
24
+ };
25
+ export declare const documentNode: (...content: DocumentNode["content"]) => DocumentNode;
26
+ export declare const paragraphNode: (...content: InlineNode[]) => {
27
+ type: "paragraph";
28
+ content: InlineNode[];
29
+ };
30
+ export declare const textNode: (text: string, ...marks: TextMark["type"][]) => TextNode;
31
+ export declare const mentionNode: (mentionedUserId: string, mentionedUserName: string) => InlineNode;
32
+ export declare const listItemNode: (...content: NonNullable<ListItemNode["content"]>) => ListItemNode;
33
+ export declare const unorderedListNode: (...content: ListItemNode[]) => {
34
+ type: "bulletList";
35
+ content: ListItemNode[];
36
+ };
37
+ export declare const orderedListNode: (start: number, ...content: ListItemNode[]) => {
38
+ content: ListItemNode[];
39
+ attrs?: {
40
+ start: number;
41
+ };
42
+ type: "orderedList";
43
+ };
44
+ export declare const RICH_TEXT_CASES: RichTextCase[];
45
+ export declare const expectedParse: (richTextCase: RichTextCase) => DocumentNode;
46
+ /**
47
+ * `RICH_TEXT_CASES` reader docs in order. Shared by editor and text-message render table.
48
+ * Blank paragraph between rows so adjacent same-type lists stay split.
49
+ */
50
+ export declare const RICH_TEXT_RENDER_DOCUMENT: DocumentNode;
51
+ export declare const expectedNormalized: (richTextCase: RichTextCase) => string;
52
+ export declare const CASES_BY_GROUP: Record<string, RichTextCase[]>;
53
+ export declare const CASES_WITH_DOC: (RichTextCase & {
54
+ doc: DocumentNode;
55
+ })[];
56
+ export declare const STRIP_CONTRACT_CASES: {
57
+ name: string;
58
+ strip: string;
59
+ wire: string;
60
+ }[];
61
+ export type { RichTextCase, RichTextGroup };
@@ -1,6 +1,2 @@
1
1
  import { DocumentNode } from '../types';
2
- /**
3
- * Parses a v1 rich-text wire string into a v2 DocumentNode.
4
- * Always returns a valid `doc` — empty string / null → `{ type: 'doc', content: [] }`.
5
- */
6
2
  export declare const parseMessageMarkdown: (markdown: string | null | undefined) => DocumentNode;
@@ -1,9 +1,3 @@
1
1
  import { DocumentNode } from '../types';
2
- /**
3
- * Serializes a v2 DocumentNode to a rich-text markdown string:
4
- * `**bold**`, `_italic_`, `++underline++`, `-` / `1.` lists, `@[id:name]` mentions.
5
- *
6
- * Empty / null documents return `''`. Hosts still use `serializeMentionMarkup`
7
- * for the plain tagged path.
8
- */
2
+ /** Rich-text wire. Empty/null → `''`. Plain tagged path is `serializeMentionMarkup`. */
9
3
  export declare const serializeMessageToMarkdown: (doc: DocumentNode | null | undefined) => string;
@@ -0,0 +1,2 @@
1
+ import { MarkdownIt } from 'markdown-it';
2
+ export declare const splitListsOnBlankLinePlugin: (md: MarkdownIt) => void;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@box/threaded-annotations",
3
- "version": "4.12.0",
3
+ "version": "4.13.1",
4
4
  "license": "SEE LICENSE IN LICENSE",
5
5
  "dependencies": {
6
6
  "@floating-ui/dom": "^1.6.0",