@payloadcms/richtext-lexical 3.0.0-beta.65 → 3.0.0-beta.66
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/exports/client/Field-6VQ73D3D.js +2 -0
- package/dist/exports/client/Field-6VQ73D3D.js.map +7 -0
- package/dist/exports/client/RelationshipComponent-FFJCVTWM.js +2 -0
- package/dist/exports/client/RelationshipComponent-FFJCVTWM.js.map +7 -0
- package/dist/exports/client/bundled.css +1 -1
- package/dist/exports/client/chunk-EBB2CEB6.js +2 -0
- package/dist/exports/client/chunk-EBB2CEB6.js.map +7 -0
- package/dist/exports/client/{chunk-LGMNC5KQ.js → chunk-HO42U3IJ.js} +2 -2
- package/dist/exports/client/chunk-JELGBZLY.js +2 -0
- package/dist/exports/client/chunk-JELGBZLY.js.map +7 -0
- package/dist/exports/client/component-TYPMHBL7.js +2 -0
- package/dist/exports/client/component-TYPMHBL7.js.map +7 -0
- package/dist/exports/client/componentInline-FQNXWTOE.js +2 -0
- package/dist/exports/client/componentInline-FQNXWTOE.js.map +7 -0
- package/dist/exports/client/index.js +7 -7
- package/dist/exports/client/index.js.map +4 -4
- package/dist/features/blocks/component/BlockContent.d.ts +3 -2
- package/dist/features/blocks/component/BlockContent.d.ts.map +1 -1
- package/dist/features/blocks/component/BlockContent.js +5 -2
- package/dist/features/blocks/component/BlockContent.js.map +1 -1
- package/dist/features/blocks/component/index.d.ts +0 -4
- package/dist/features/blocks/component/index.d.ts.map +1 -1
- package/dist/features/blocks/component/index.js +6 -2
- package/dist/features/blocks/component/index.js.map +1 -1
- package/dist/features/blocks/componentInline/index.d.ts +10 -0
- package/dist/features/blocks/componentInline/index.d.ts.map +1 -0
- package/dist/features/blocks/componentInline/index.js +133 -0
- package/dist/features/blocks/componentInline/index.js.map +1 -0
- package/dist/features/blocks/feature.client.d.ts +6 -1
- package/dist/features/blocks/feature.client.d.ts.map +1 -1
- package/dist/features/blocks/feature.client.js +70 -8
- package/dist/features/blocks/feature.client.js.map +1 -1
- package/dist/features/blocks/feature.server.d.ts +2 -1
- package/dist/features/blocks/feature.server.d.ts.map +1 -1
- package/dist/features/blocks/feature.server.js +99 -34
- package/dist/features/blocks/feature.server.js.map +1 -1
- package/dist/features/blocks/graphQLPopulationPromise.d.ts +3 -2
- package/dist/features/blocks/graphQLPopulationPromise.d.ts.map +1 -1
- package/dist/features/blocks/graphQLPopulationPromise.js +2 -2
- package/dist/features/blocks/graphQLPopulationPromise.js.map +1 -1
- package/dist/features/blocks/i18n.d.ts.map +1 -1
- package/dist/features/blocks/i18n.js +192 -0
- package/dist/features/blocks/i18n.js.map +1 -1
- package/dist/features/blocks/nodes/BlocksNode.d.ts.map +1 -1
- package/dist/features/blocks/nodes/BlocksNode.js +0 -1
- package/dist/features/blocks/nodes/BlocksNode.js.map +1 -1
- package/dist/features/blocks/nodes/InlineBlocksNode.d.ts +39 -0
- package/dist/features/blocks/nodes/InlineBlocksNode.d.ts.map +1 -0
- package/dist/features/blocks/nodes/InlineBlocksNode.js +93 -0
- package/dist/features/blocks/nodes/InlineBlocksNode.js.map +1 -0
- package/dist/features/blocks/plugin/commands.d.ts +5 -0
- package/dist/features/blocks/plugin/commands.d.ts.map +1 -1
- package/dist/features/blocks/plugin/commands.js +2 -0
- package/dist/features/blocks/plugin/commands.js.map +1 -1
- package/dist/features/blocks/plugin/index.d.ts.map +1 -1
- package/dist/features/blocks/plugin/index.js +76 -7
- package/dist/features/blocks/plugin/index.js.map +1 -1
- package/dist/features/blocks/validate.d.ts +3 -2
- package/dist/features/blocks/validate.d.ts.map +1 -1
- package/dist/features/blocks/validate.js +2 -2
- package/dist/features/blocks/validate.js.map +1 -1
- package/dist/features/relationship/nodes/components/RelationshipComponent.d.ts +0 -1
- package/dist/features/relationship/nodes/components/RelationshipComponent.d.ts.map +1 -1
- package/dist/features/relationship/nodes/components/RelationshipComponent.js +2 -3
- package/dist/features/relationship/nodes/components/RelationshipComponent.js.map +1 -1
- package/dist/field/index.js +8 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/lexical/LexicalProvider.js +2 -2
- package/dist/lexical/LexicalProvider.js.map +1 -1
- package/dist/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/LexicalMenu.d.ts +4 -4
- package/dist/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/LexicalMenu.d.ts.map +1 -1
- package/dist/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/LexicalMenu.js.map +1 -1
- package/dist/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/index.d.ts +0 -1
- package/dist/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/index.d.ts.map +1 -1
- package/dist/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/index.js +1 -20
- package/dist/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/index.js.map +1 -1
- package/dist/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/types.d.ts +2 -2
- package/dist/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/types.d.ts.map +1 -1
- package/dist/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/types.js.map +1 -1
- package/dist/lexical/plugins/SlashMenu/index.d.ts.map +1 -1
- package/dist/lexical/plugins/SlashMenu/index.js +43 -41
- package/dist/lexical/plugins/SlashMenu/index.js.map +1 -1
- package/dist/lexical/plugins/handles/DraggableBlockPlugin/index.js +1 -1
- package/dist/lexical/plugins/handles/DraggableBlockPlugin/index.js.map +1 -1
- package/dist/lexical/ui/icons/InlineBlocks/index.d.ts +3 -0
- package/dist/lexical/ui/icons/InlineBlocks/index.d.ts.map +1 -0
- package/dist/lexical/ui/icons/InlineBlocks/index.js +20 -0
- package/dist/lexical/ui/icons/InlineBlocks/index.js.map +1 -0
- package/package.json +9 -9
- package/dist/exports/client/Field-5KHQLTCU.js +0 -2
- package/dist/exports/client/Field-5KHQLTCU.js.map +0 -7
- package/dist/exports/client/RelationshipComponent-EJB6LBDR.js +0 -2
- package/dist/exports/client/RelationshipComponent-EJB6LBDR.js.map +0 -7
- package/dist/exports/client/chunk-SVDDFJRT.js +0 -2
- package/dist/exports/client/chunk-SVDDFJRT.js.map +0 -7
- package/dist/exports/client/component-Z5R2PHH3.js +0 -2
- package/dist/exports/client/component-Z5R2PHH3.js.map +0 -7
- package/dist/features/blocks/drawer/index.d.ts +0 -9
- package/dist/features/blocks/drawer/index.d.ts.map +0 -1
- package/dist/features/blocks/drawer/index.js +0 -78
- package/dist/features/blocks/drawer/index.js.map +0 -1
- /package/dist/exports/client/{chunk-LGMNC5KQ.js.map → chunk-HO42U3IJ.js.map} +0 -0
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
function Me({editorConfig:r}){return r.features.nodes.map(e=>"node"in e?e.node:e)}import{useLexicalComposerContext as se}from"@lexical/react/LexicalComposerContext.js";import{mergeRegister as ce}from"@lexical/utils";import{$getSelection as O,$isRangeSelection as C,$isTextNode as ae,COMMAND_PRIORITY_LOW as ue,createCommand as me}from"lexical";import{useCallback as B,useEffect as F,useState as de}from"react";import*as _ from"react";import{useLexicalComposerContext as A}from"@lexical/react/LexicalComposerContext.js";import{mergeRegister as L}from"@lexical/utils";import{$getSelection as X,$isRangeSelection as V,COMMAND_PRIORITY_LOW as y,KEY_ARROW_DOWN_COMMAND as U,KEY_ARROW_UP_COMMAND as j,KEY_ENTER_COMMAND as z,KEY_ESCAPE_COMMAND as q,KEY_TAB_COMMAND as G,createCommand as Q}from"lexical";import{useCallback as E,useEffect as T,useLayoutEffect as J,useMemo as Z,useRef as ee,useState as te}from"react";var ne="slash-menu-popup",v=r=>{let e=document.getElementById("slash-menu");if(!e)return;let t=e.getBoundingClientRect();t.top+t.height>window.innerHeight&&e.scrollIntoView({block:"center"}),t.top<0&&e.scrollIntoView({block:"center"}),r.scrollIntoView({block:"nearest"})};function oe(r,e,t){let n=t;for(let o=n;o<=e.length;o++)r.substring(r.length-o)===e.substring(0,o)&&(n=o);return n}function ie(r){let e=X();if(!V(e)||!e.isCollapsed())return null;let t=e.anchor;if(t.type!=="text")return null;let n=t.getNode();if(!n.isSimpleText())return null;let o=t.offset,l=n.getTextContent().slice(0,o),a=r.replaceableString.length,d=oe(l,r.matchingString,a),s=o-d;if(s<0)return null;let i;return s===0?[i]=n.splitText(o):[,i]=n.splitText(s,o),i}function re(r,e){let t=getComputedStyle(r),n=t.position==="absolute",o=e?/(auto|scroll|hidden)/:/(auto|scroll)/;if(t.position==="fixed")return document.body;for(let l=r;l=l.parentElement;)if(t=getComputedStyle(l),!(n&&t.position==="static")&&o.test(t.overflow+t.overflowY+t.overflowX))return l;return document.body}function N(r,e){let t=r.getBoundingClientRect(),n=e.getBoundingClientRect();return t.top>n.top&&t.top<n.bottom}function le(r,e,t,n){let[o]=A();T(()=>{if(e!=null&&r!=null){let l=o.getRootElement(),a=l!=null?re(l,!1):document.body,d=!1,s=N(e,a),i=function(){d||(window.requestAnimationFrame(function(){t(),d=!1}),d=!0);let f=N(e,a);f!==s&&(s=f,n?.(f))},m=new ResizeObserver(t);return window.addEventListener("resize",t),document.addEventListener("scroll",i,{capture:!0,passive:!0}),m.observe(e),()=>{m.unobserve(e),window.removeEventListener("resize",t),document.removeEventListener("scroll",i,!0)}}},[e,o,n,t,r])}var P=Q("SCROLL_TYPEAHEAD_OPTION_INTO_VIEW_COMMAND");function D({anchorElementRef:r,close:e,editor:t,groups:n,menuRenderFn:o,onSelectItem:l,resolution:a,shouldSplitNodeWithQuery:d=!1}){let[s,i]=te(null),m=a.match&&a.match.matchingString||"",f=E(c=>{let u=t.getRootElement();u!==null&&(u.setAttribute("aria-activedescendant",`${ne}__item-${c.key}`),i(c.key))},[t]),S=E(()=>{if(n!==null&&m!=null){let c=n.flatMap(u=>u.items);if(c.length){let u=c[0];f(u)}}},[n,f,m]);T(()=>{S()},[m,S]);let R=E(c=>{t.update(()=>{let u=a.match!=null&&d?ie(a.match):null;l(c,u,e,a.match?a.match.matchingString:"")})},[t,d,a.match,l,e]);T(()=>()=>{let c=t.getRootElement();c!==null&&c.removeAttribute("aria-activedescendant")},[t]),J(()=>{n===null?i(null):s===null&&S()},[n,s,f,S]),T(()=>L(t.registerCommand(P,({item:c})=>c.ref&&c.ref.current!=null?(v(c.ref.current),!0):!1,y)),[t,f]),T(()=>L(t.registerCommand(U,c=>{let u=c;if(n!==null&&n.length&&s!==null){let g=n.flatMap(p=>p.items),h=g.findIndex(p=>p.key===s),b=h!==g.length-1?h+1:0,M=g[b];f(M),M.ref!=null&&M.ref.current&&t.dispatchCommand(P,{index:b,item:M}),u.preventDefault(),u.stopImmediatePropagation()}return!0},y),t.registerCommand(j,c=>{let u=c;if(n!==null&&n.length&&s!==null){let g=n.flatMap(p=>p.items),h=g.findIndex(p=>p.key===s),b=h!==0?h-1:g.length-1,M=g[b];f(M),M.ref!=null&&M.ref.current&&v(M.ref.current),u.preventDefault(),u.stopImmediatePropagation()}return!0},y),t.registerCommand(q,c=>{let u=c;return u.preventDefault(),u.stopImmediatePropagation(),e(),!0},y),t.registerCommand(G,c=>{let u=c;if(n===null||s===null)return!1;let h=n.flatMap(b=>b.items).find(b=>b.key===s);return h?(u.preventDefault(),u.stopImmediatePropagation(),R(h),!0):!1},y),t.registerCommand(z,c=>{if(n===null||s===null)return!1;let g=n.flatMap(h=>h.items).find(h=>h.key===s);return g?(c!==null&&(c.preventDefault(),c.stopImmediatePropagation()),R(g),!0):!1},y)),[R,e,t,n,s,f]);let x=Z(()=>({groups:n,selectItemAndCleanUp:R,selectedItemKey:s,setSelectedItemKey:i}),[R,s,n]);return o(r,x,a.match?a.match.matchingString:"")}function H(r,e,t,n){let[o]=A(),l=ee(document.createElement("div")),a=E(()=>{let s=o.getRootElement(),i=l.current,m=32,f=i.firstChild;if(s!==null&&e!==null){let{height:S,width:R}=e.getRect(),{left:x,top:c}=e.getRect(),u=c;if(c-=r.getBoundingClientRect().top+window.scrollY,x-=r.getBoundingClientRect().left+window.scrollX,i.style.left=`${x+window.scrollX}px`,i.style.height=`${S}px`,i.style.width=`${R}px`,f!==null){let g=f.getBoundingClientRect(),h=g.height,b=g.width,M=s.getBoundingClientRect();x+b>M.right&&(i.style.left=`${M.right-b+window.scrollX}px`);let p=u+h+m>window.innerHeight,w=u<0;p&&!w?i.style.top=`${c+m-h+window.scrollY-(S+24)}px`:i.style.top=`${c+window.scrollY+m}px`}i.isConnected||(n!=null&&(i.className=n),i.setAttribute("aria-label","Slash menu"),i.setAttribute("id","slash-menu"),i.setAttribute("role","listbox"),i.style.display="block",i.style.position="absolute",r.append(i)),l.current=i,s.setAttribute("aria-controls","slash-menu")}},[o,e,n,r]);T(()=>{let s=o.getRootElement();if(e!==null)return a(),()=>{s!==null&&s.removeAttribute("aria-controls");let i=l.current;i!==null&&i.isConnected&&i.remove()}},[o,a,e]);let d=E(s=>{e!==null&&(s||t(null))},[e,t]);return le(e,l.current,a,d),l}import{jsx as pe}from"react/jsx-runtime";var Le=`\\.,\\+\\*\\?\\$\\@\\|#{}\\(\\)\\^\\-\\[\\]\\\\/!%'"~=<>_:;`;function fe(r){let e=r.anchor;if(e.type!=="text")return null;let t=e.getNode();if(!t.isSimpleText())return null;let n=e.offset;return t.getTextContent().slice(0,n)}function K(r,e,t){let n=t.getSelection();if(n===null||!n.isCollapsed)return!1;let o=n.anchorNode,l=r,a=n.anchorOffset;if(o==null||a==null)return!1;try{e.setStart(o,l),e.setEnd(o,a>1?a:1)}catch{return!1}return!0}function he(r){let e=null;return r.getEditorState().read(()=>{let t=O();C(t)&&(e=fe(t))}),e}function Y(r,e){return e!==0?!1:r.getEditorState().read(()=>{let t=O();if(C(t)){let l=t.anchor.getNode().getPreviousSibling();return ae(l)&&l.isTextEntity()}return!1})}function W(r){_.startTransition?_.startTransition(r):r()}var ge=me("ENABLE_SLASH_MENU_COMMAND");function ve({anchorClassName:r,anchorElem:e,groups:t,menuRenderFn:n,onClose:o,onOpen:l,onQueryChange:a,onSelectItem:d,triggerFn:s}){let[i]=se(),[m,f]=de(null),S=H(e,m,f,r),R=B(()=>{f(null),o!=null&&m!==null&&o()},[o,m]),x=B(c=>{f(c),l!=null&&m===null&&l(c)},[l,m]);return F(()=>ce(i.registerCommand(ge,({node:c})=>(i.getEditorState().read(()=>{let u={leadOffset:0,matchingString:"",replaceableString:""};if(!Y(i,u.leadOffset)&&c!==null){let g=i._window??window,h=g.document.createRange();K(u.leadOffset,h,g)!==null&&W(()=>x({getRect:()=>h.getBoundingClientRect(),match:u}));return}}),!0),ue)),[i,x]),F(()=>{let c=()=>{i.getEditorState().read(()=>{let g=i._window??window,h=g.document.createRange(),b=O(),M=he(i);if(!C(b)||!b.isCollapsed()||M===null||h===null){R();return}let p=s({editor:i,query:M});if(a(p?p.matchingString:null),p!==null&&!Y(i,p.leadOffset)&&K(p.leadOffset,h,g)!==null){W(()=>x({getRect:()=>h.getBoundingClientRect(),match:p}));return}R()})},u=i.registerUpdateListener(c);return()=>{u()}},[i,s,a,m,R,x]),m===null||i===null?null:pe(D,{anchorElementRef:S,close:R,editor:i,groups:t,menuRenderFn:n,onSelectItem:d,resolution:m,shouldSplitNodeWithQuery:!0})}function Ae(r){return r instanceof HTMLElement}var I=class{_x;_y;constructor(e,t){this._x=e,this._y=t}calcDeltaXTo({x:e}){return this.x-e}calcDeltaYTo({y:e}){return this.y-e}calcDistanceTo(e){return Math.sqrt(Math.pow(this.calcDeltaXTo(e),2)+Math.pow(this.calcDeltaYTo(e),2))}calcHorizontalDistanceTo(e){return Math.abs(this.calcDeltaXTo(e))}calcVerticalDistance(e){return Math.abs(this.calcDeltaYTo(e))}equals({x:e,y:t}){return this.x===e&&this.y===t}get x(){return this._x}get y(){return this._y}};function $(r){return r instanceof I}var k=class r{_bottom;_left;_right;_top;constructor(e,t,n,o){let[l,a]=t<=o?[t,o]:[o,t],[d,s]=e<=n?[e,n]:[n,e];this._top=l,this._right=s,this._left=d,this._bottom=a}static fromDOM(e){let{height:t,left:n,top:o,width:l}=e.getBoundingClientRect();return r.fromLWTH(n,l,o,t)}static fromDOMRect(e){let{height:t,left:n,top:o,width:l}=e;return r.fromLWTH(n,l,o,t)}static fromLTRB(e,t,n,o){return new r(e,t,n,o)}static fromLWTH(e,t,n,o){return new r(e,n,e+t,n+o)}static fromPoints(e,t){let{x:n,y:o}=e,{x:l,y:a}=t;return r.fromLTRB(n,o,l,a)}contains(e){if($(e)){let{x:a,y:d}=e,s=d<this._top,i=d>this._bottom,m=a<this._left,f=a>this._right;return{reason:{isOnBottomSide:i,isOnLeftSide:m,isOnRightSide:f,isOnTopSide:s},result:!s&&!i&&!m&&!f}}let{bottom:t,left:n,right:o,top:l}=e;return l>=this._top&&l<=this._bottom&&t>=this._top&&t<=this._bottom&&n>=this._left&&n<=this._right&&o>=this._left&&o<=this._right}distanceFromPoint(e){let t=this.contains(e);if(t.result)return{distance:0,isOnBottomSide:t.reason.isOnBottomSide,isOnLeftSide:t.reason.isOnLeftSide,isOnRightSide:t.reason.isOnRightSide,isOnTopSide:t.reason.isOnTopSide};let n=0,o=0;return e.x<this._left?n=this._left-e.x:e.x>this._right&&(n=e.x-this._right),e.y<this._top?o=this._top-e.y:e.y>this._bottom&&(o=e.y-this._bottom),{distance:Math.sqrt(n*n+o*o),isOnBottomSide:e.y>this._bottom,isOnLeftSide:e.x<this._left,isOnRightSide:e.x>this._right,isOnTopSide:e.y<this._top}}equals({bottom:e,left:t,right:n,top:o}){return o===this._top&&e===this._bottom&&t===this._left&&n===this._right}generateNewRect({bottom:e=this.bottom,left:t=this.left,right:n=this.right,top:o=this.top}){return new r(t,o,n,e)}intersectsWith(e){let{height:t,left:n,top:o,width:l}=e,{height:a,left:d,top:s,width:i}=this,m=n+l>=d+i?n+l:d+i,f=o+t>=s+a?o+t:s+a,S=n<=d?n:d,R=o<=s?o:s;return m-S<=l+i&&f-R<=t+a}get bottom(){return this._bottom}get height(){return Math.abs(this._bottom-this._top)}get left(){return this._left}get right(){return this._right}get top(){return this._top}get width(){return Math.abs(this._left-this._right)}};export{Me as a,Le as b,ge as c,ve as d,Ae as e,I as f,$ as g,k as h};
|
|
2
|
+
//# sourceMappingURL=chunk-EBB2CEB6.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/lexical/nodes/index.ts", "../../../src/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/index.tsx", "../../../src/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/LexicalMenu.tsx", "../../../src/lexical/utils/guard.ts", "../../../src/lexical/utils/point.ts", "../../../src/lexical/utils/rect.ts"],
|
|
4
|
+
"sourcesContent": ["import type { Klass, LexicalNode, LexicalNodeReplacement } from 'lexical'\n\nimport type { SanitizedClientEditorConfig, SanitizedServerEditorConfig } from '../config/types.js'\n\nexport function getEnabledNodes({\n editorConfig,\n}: {\n editorConfig: SanitizedClientEditorConfig | SanitizedServerEditorConfig\n}): Array<Klass<LexicalNode> | LexicalNodeReplacement> {\n return editorConfig.features.nodes.map((node) => {\n if ('node' in node) {\n return node.node\n }\n return node\n })\n}\n", "'use client'\nimport type {\n LexicalCommand,\n LexicalEditor,\n ParagraphNode,\n RangeSelection,\n TextNode,\n} from 'lexical'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { mergeRegister } from '@lexical/utils'\nimport {\n $getSelection,\n $isRangeSelection,\n $isTextNode,\n COMMAND_PRIORITY_LOW,\n createCommand,\n} from 'lexical'\nimport { type JSX, useCallback, useEffect, useState } from 'react'\nimport * as React from 'react'\n\nimport type { MenuTextMatch, TriggerFn } from '../useMenuTriggerMatch.js'\nimport type { MenuRenderFn, MenuResolution } from './LexicalMenu.js'\nimport type { SlashMenuGroupInternal, SlashMenuItem } from './types.js'\n\nimport { LexicalMenu, useMenuAnchorRef } from './LexicalMenu.js'\n\nexport const PUNCTUATION = '\\\\.,\\\\+\\\\*\\\\?\\\\$\\\\@\\\\|#{}\\\\(\\\\)\\\\^\\\\-\\\\[\\\\]\\\\\\\\/!%\\'\"~=<>_:;'\n\nfunction getTextUpToAnchor(selection: RangeSelection): null | string {\n const anchor = selection.anchor\n if (anchor.type !== 'text') {\n return null\n }\n const anchorNode = anchor.getNode()\n if (!anchorNode.isSimpleText()) {\n return null\n }\n const anchorOffset = anchor.offset\n return anchorNode.getTextContent().slice(0, anchorOffset)\n}\n\nfunction tryToPositionRange(leadOffset: number, range: Range, editorWindow: Window): boolean {\n const domSelection = editorWindow.getSelection()\n if (domSelection === null || !domSelection.isCollapsed) {\n return false\n }\n const anchorNode = domSelection.anchorNode\n const startOffset = leadOffset\n const endOffset = domSelection.anchorOffset\n\n if (anchorNode == null || endOffset == null) {\n return false\n }\n\n try {\n range.setStart(anchorNode, startOffset)\n // if endOffset is 0, positioning the range for when you click the plus button to open the slash menu will fial\n range.setEnd(anchorNode, endOffset > 1 ? endOffset : 1)\n } catch (error) {\n return false\n }\n\n return true\n}\n\nfunction getQueryTextForSearch(editor: LexicalEditor): null | string {\n let text = null\n editor.getEditorState().read(() => {\n const selection = $getSelection()\n if (!$isRangeSelection(selection)) {\n return\n }\n text = getTextUpToAnchor(selection)\n })\n return text\n}\n\nfunction isSelectionOnEntityBoundary(editor: LexicalEditor, offset: number): boolean {\n if (offset !== 0) {\n return false\n }\n return editor.getEditorState().read(() => {\n const selection = $getSelection()\n if ($isRangeSelection(selection)) {\n const anchor = selection.anchor\n const anchorNode = anchor.getNode()\n const prevSibling = anchorNode.getPreviousSibling()\n return $isTextNode(prevSibling) && prevSibling.isTextEntity()\n }\n return false\n })\n}\n\nfunction startTransition(callback: () => void) {\n if (React.startTransition) {\n React.startTransition(callback)\n } else {\n callback()\n }\n}\n\nexport { useDynamicPositioning } from './LexicalMenu.js'\n\nexport type TypeaheadMenuPluginProps = {\n anchorClassName?: string\n anchorElem: HTMLElement\n groups: Array<SlashMenuGroupInternal>\n menuRenderFn: MenuRenderFn\n onClose?: () => void\n onOpen?: (resolution: MenuResolution) => void\n onQueryChange: (matchingString: null | string) => void\n onSelectItem: (\n item: SlashMenuItem,\n textNodeContainingQuery: TextNode | null,\n closeMenu: () => void,\n matchingString: string,\n ) => void\n triggerFn: TriggerFn\n}\n\nexport const ENABLE_SLASH_MENU_COMMAND: LexicalCommand<{\n node: ParagraphNode\n}> = createCommand('ENABLE_SLASH_MENU_COMMAND')\n\nexport function LexicalTypeaheadMenuPlugin({\n anchorClassName,\n anchorElem,\n groups,\n menuRenderFn,\n onClose,\n onOpen,\n onQueryChange,\n onSelectItem,\n triggerFn,\n}: TypeaheadMenuPluginProps): JSX.Element | null {\n const [editor] = useLexicalComposerContext()\n const [resolution, setResolution] = useState<MenuResolution | null>(null)\n const anchorElementRef = useMenuAnchorRef(anchorElem, resolution, setResolution, anchorClassName)\n\n const closeTypeahead = useCallback(() => {\n setResolution(null)\n if (onClose != null && resolution !== null) {\n onClose()\n }\n }, [onClose, resolution])\n\n const openTypeahead = useCallback(\n (res: MenuResolution) => {\n setResolution(res)\n if (onOpen != null && resolution === null) {\n onOpen(res)\n }\n },\n [onOpen, resolution],\n )\n\n // This is mainly used for the AddBlockHandlePlugin, so that the slash menu can be opened from there\n useEffect(() => {\n return mergeRegister(\n editor.registerCommand(\n ENABLE_SLASH_MENU_COMMAND,\n ({ node }) => {\n editor.getEditorState().read(() => {\n const match: MenuTextMatch = {\n leadOffset: 0,\n matchingString: '',\n replaceableString: '',\n }\n if (!isSelectionOnEntityBoundary(editor, match.leadOffset)) {\n if (node !== null) {\n const editorWindow = editor._window ?? window\n const range = editorWindow.document.createRange()\n\n const isRangePositioned = tryToPositionRange(match.leadOffset, range, editorWindow)\n if (isRangePositioned !== null) {\n startTransition(() =>\n openTypeahead({\n getRect: () => {\n return range.getBoundingClientRect()\n },\n match,\n }),\n )\n }\n\n return\n }\n }\n })\n\n return true\n },\n COMMAND_PRIORITY_LOW,\n ),\n )\n }, [editor, openTypeahead])\n\n useEffect(() => {\n const updateListener = () => {\n editor.getEditorState().read(() => {\n const editorWindow = editor._window ?? window\n const range = editorWindow.document.createRange()\n const selection = $getSelection()\n const text = getQueryTextForSearch(editor)\n\n if (\n !$isRangeSelection(selection) ||\n !selection.isCollapsed() ||\n text === null ||\n range === null\n ) {\n closeTypeahead()\n return\n }\n\n const match = triggerFn({ editor, query: text })\n onQueryChange(match ? match.matchingString : null)\n\n if (match !== null && !isSelectionOnEntityBoundary(editor, match.leadOffset)) {\n const isRangePositioned = tryToPositionRange(match.leadOffset, range, editorWindow)\n if (isRangePositioned !== null) {\n startTransition(() =>\n openTypeahead({\n getRect: () => {\n return range.getBoundingClientRect()\n },\n match,\n }),\n )\n return\n }\n }\n closeTypeahead()\n })\n }\n\n const removeUpdateListener = editor.registerUpdateListener(updateListener)\n\n return () => {\n removeUpdateListener()\n }\n }, [editor, triggerFn, onQueryChange, resolution, closeTypeahead, openTypeahead])\n\n return resolution === null || editor === null ? null : (\n <LexicalMenu\n anchorElementRef={anchorElementRef}\n close={closeTypeahead}\n editor={editor}\n groups={groups}\n menuRenderFn={menuRenderFn}\n onSelectItem={onSelectItem}\n resolution={resolution}\n shouldSplitNodeWithQuery\n />\n )\n}\n\nexport type { MenuRenderFn, MenuResolution, MenuTextMatch, TriggerFn }\n", "'use client'\nimport type { LexicalCommand, LexicalEditor, TextNode } from 'lexical'\nimport type { JSX, ReactPortal, RefObject } from 'react'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { mergeRegister } from '@lexical/utils'\nimport {\n $getSelection,\n $isRangeSelection,\n COMMAND_PRIORITY_LOW,\n KEY_ARROW_DOWN_COMMAND,\n KEY_ARROW_UP_COMMAND,\n KEY_ENTER_COMMAND,\n KEY_ESCAPE_COMMAND,\n KEY_TAB_COMMAND,\n createCommand,\n} from 'lexical'\nimport { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react'\n\nimport type { MenuTextMatch } from '../useMenuTriggerMatch.js'\nimport type { SlashMenuGroupInternal, SlashMenuItem, SlashMenuItemInternal } from './types.js'\n\nexport type MenuResolution = {\n getRect: () => DOMRect\n match?: MenuTextMatch\n}\n\nconst baseClass = 'slash-menu-popup'\n\nexport type MenuRenderFn = (\n anchorElementRef: RefObject<HTMLElement | null>,\n itemProps: {\n groups: Array<SlashMenuGroupInternal>\n selectItemAndCleanUp: (selectedItem: SlashMenuItem) => void\n selectedItemKey: null | string\n setSelectedItemKey: (itemKey: string) => void\n },\n matchingString: null | string,\n) => JSX.Element | ReactPortal | null\n\nconst scrollIntoViewIfNeeded = (target: HTMLElement) => {\n const typeaheadContainerNode = document.getElementById('slash-menu')\n if (!typeaheadContainerNode) return\n\n const typeaheadRect = typeaheadContainerNode.getBoundingClientRect()\n\n if (typeaheadRect.top + typeaheadRect.height > window.innerHeight) {\n typeaheadContainerNode.scrollIntoView({\n block: 'center',\n })\n }\n\n if (typeaheadRect.top < 0) {\n typeaheadContainerNode.scrollIntoView({\n block: 'center',\n })\n }\n\n target.scrollIntoView({ block: 'nearest' })\n}\n\n/**\n * Walk backwards along user input and forward through entity title to try\n * and replace more of the user's text with entity.\n */\nfunction getFullMatchOffset(documentText: string, entryText: string, offset: number) {\n let triggerOffset = offset\n for (let i = triggerOffset; i <= entryText.length; i++) {\n if (documentText.substring(documentText.length - i) === entryText.substring(0, i)) {\n triggerOffset = i\n }\n }\n return triggerOffset\n}\n\n/**\n * Split Lexical TextNode and return a new TextNode only containing matched text.\n * Common use cases include: removing the node, replacing with a new node.\n */\nfunction $splitNodeContainingQuery(match: MenuTextMatch): TextNode | null {\n const selection = $getSelection()\n if (!$isRangeSelection(selection) || !selection.isCollapsed()) {\n return null\n }\n const anchor = selection.anchor\n if (anchor.type !== 'text') {\n return null\n }\n const anchorNode = anchor.getNode()\n if (!anchorNode.isSimpleText()) {\n return null\n }\n const selectionOffset = anchor.offset\n const textContent = anchorNode.getTextContent().slice(0, selectionOffset)\n const characterOffset = match.replaceableString.length\n const queryOffset = getFullMatchOffset(textContent, match.matchingString, characterOffset)\n const startOffset = selectionOffset - queryOffset\n if (startOffset < 0) {\n return null\n }\n let newNode\n if (startOffset === 0) {\n ;[newNode] = anchorNode.splitText(selectionOffset)\n } else {\n ;[, newNode] = anchorNode.splitText(startOffset, selectionOffset)\n }\n\n return newNode\n}\n\n// Got from https://stackoverflow.com/a/42543908/2013580\nexport function getScrollParent(\n element: HTMLElement,\n includeHidden: boolean,\n): HTMLBodyElement | HTMLElement {\n let style = getComputedStyle(element)\n const excludeStaticParent = style.position === 'absolute'\n const overflowRegex = includeHidden ? /(auto|scroll|hidden)/ : /(auto|scroll)/\n if (style.position === 'fixed') {\n return document.body\n }\n for (let parent: HTMLElement | null = element; (parent = parent.parentElement); ) {\n style = getComputedStyle(parent)\n if (excludeStaticParent && style.position === 'static') {\n continue\n }\n if (overflowRegex.test(style.overflow + style.overflowY + style.overflowX)) {\n return parent\n }\n }\n return document.body\n}\n\nfunction isTriggerVisibleInNearestScrollContainer(\n targetElement: HTMLElement,\n containerElement: HTMLElement,\n): boolean {\n const tRect = targetElement.getBoundingClientRect()\n const cRect = containerElement.getBoundingClientRect()\n return tRect.top > cRect.top && tRect.top < cRect.bottom\n}\n\n// Reposition the menu on scroll, window resize, and element resize.\nexport function useDynamicPositioning(\n resolution: MenuResolution | null,\n targetElement: HTMLElement | null,\n onReposition: () => void,\n onVisibilityChange?: (isInView: boolean) => void,\n) {\n const [editor] = useLexicalComposerContext()\n useEffect(() => {\n if (targetElement != null && resolution != null) {\n const rootElement = editor.getRootElement()\n const rootScrollParent =\n rootElement != null ? getScrollParent(rootElement, false) : document.body\n let ticking = false\n let previousIsInView = isTriggerVisibleInNearestScrollContainer(\n targetElement,\n rootScrollParent,\n )\n const handleScroll = function () {\n if (!ticking) {\n window.requestAnimationFrame(function () {\n onReposition()\n ticking = false\n })\n ticking = true\n }\n const isInView = isTriggerVisibleInNearestScrollContainer(targetElement, rootScrollParent)\n if (isInView !== previousIsInView) {\n previousIsInView = isInView\n if (onVisibilityChange != null) {\n onVisibilityChange(isInView)\n }\n }\n }\n const resizeObserver = new ResizeObserver(onReposition)\n window.addEventListener('resize', onReposition)\n document.addEventListener('scroll', handleScroll, {\n capture: true,\n passive: true,\n })\n resizeObserver.observe(targetElement)\n return () => {\n resizeObserver.unobserve(targetElement)\n window.removeEventListener('resize', onReposition)\n document.removeEventListener('scroll', handleScroll, true)\n }\n }\n }, [targetElement, editor, onVisibilityChange, onReposition, resolution])\n}\n\nexport const SCROLL_TYPEAHEAD_OPTION_INTO_VIEW_COMMAND: LexicalCommand<{\n index: number\n item: SlashMenuItemInternal\n}> = createCommand('SCROLL_TYPEAHEAD_OPTION_INTO_VIEW_COMMAND')\n\nexport function LexicalMenu({\n anchorElementRef,\n close,\n editor,\n // groups filtering is already handled in SlashMenu/index.tsx. Thus, groups always contains the matching items.\n groups,\n menuRenderFn,\n onSelectItem,\n resolution,\n shouldSplitNodeWithQuery = false,\n}: {\n anchorElementRef: RefObject<HTMLElement>\n close: () => void\n editor: LexicalEditor\n groups: Array<SlashMenuGroupInternal>\n menuRenderFn: MenuRenderFn\n onSelectItem: (\n item: SlashMenuItem,\n textNodeContainingQuery: TextNode | null,\n closeMenu: () => void,\n matchingString: string,\n ) => void\n resolution: MenuResolution\n shouldSplitNodeWithQuery?: boolean\n}): JSX.Element | null {\n const [selectedItemKey, setSelectedItemKey] = useState<null | string>(null)\n\n const matchingString = (resolution.match && resolution.match.matchingString) || ''\n\n const updateSelectedItem = useCallback(\n (item: SlashMenuItem) => {\n const rootElem = editor.getRootElement()\n if (rootElem !== null) {\n rootElem.setAttribute('aria-activedescendant', `${baseClass}__item-${item.key}`)\n setSelectedItemKey(item.key)\n }\n },\n [editor],\n )\n\n const setSelectedItemKeyToFirstMatchingItem = useCallback(() => {\n // set selected item to the first of the matching ones\n if (groups !== null && matchingString != null) {\n // groups filtering is already handled in SlashMenu/index.tsx. Thus, groups always contains the matching items.\n const allItems = groups.flatMap((group) => group.items)\n\n if (allItems.length) {\n const firstMatchingItem = allItems[0]\n updateSelectedItem(firstMatchingItem)\n }\n }\n }, [groups, updateSelectedItem, matchingString])\n\n useEffect(() => {\n setSelectedItemKeyToFirstMatchingItem()\n }, [matchingString, setSelectedItemKeyToFirstMatchingItem])\n\n const selectItemAndCleanUp = useCallback(\n (selectedItem: SlashMenuItem) => {\n editor.update(() => {\n const textNodeContainingQuery =\n resolution.match != null && shouldSplitNodeWithQuery\n ? $splitNodeContainingQuery(resolution.match)\n : null\n\n onSelectItem(\n selectedItem,\n textNodeContainingQuery,\n close,\n resolution.match ? resolution.match.matchingString : '',\n )\n })\n },\n [editor, shouldSplitNodeWithQuery, resolution.match, onSelectItem, close],\n )\n\n useEffect(() => {\n return () => {\n const rootElem = editor.getRootElement()\n if (rootElem !== null) {\n rootElem.removeAttribute('aria-activedescendant')\n }\n }\n }, [editor])\n\n useLayoutEffect(() => {\n if (groups === null) {\n setSelectedItemKey(null)\n } else if (selectedItemKey === null) {\n setSelectedItemKeyToFirstMatchingItem()\n }\n }, [groups, selectedItemKey, updateSelectedItem, setSelectedItemKeyToFirstMatchingItem])\n\n useEffect(() => {\n return mergeRegister(\n editor.registerCommand(\n SCROLL_TYPEAHEAD_OPTION_INTO_VIEW_COMMAND,\n ({ item }) => {\n if (item.ref && item.ref.current != null) {\n scrollIntoViewIfNeeded(item.ref.current)\n return true\n }\n\n return false\n },\n COMMAND_PRIORITY_LOW,\n ),\n )\n }, [editor, updateSelectedItem])\n\n useEffect(() => {\n return mergeRegister(\n editor.registerCommand<KeyboardEvent>(\n KEY_ARROW_DOWN_COMMAND,\n (payload) => {\n const event = payload\n if (groups !== null && groups.length && selectedItemKey !== null) {\n const allItems = groups.flatMap((group) => group.items)\n const selectedIndex = allItems.findIndex((item) => item.key === selectedItemKey)\n\n const newSelectedIndex = selectedIndex !== allItems.length - 1 ? selectedIndex + 1 : 0\n\n const newSelectedItem = allItems[newSelectedIndex]\n\n updateSelectedItem(newSelectedItem)\n if (newSelectedItem.ref != null && newSelectedItem.ref.current) {\n editor.dispatchCommand(SCROLL_TYPEAHEAD_OPTION_INTO_VIEW_COMMAND, {\n index: newSelectedIndex,\n item: newSelectedItem,\n })\n }\n event.preventDefault()\n event.stopImmediatePropagation()\n }\n return true\n },\n COMMAND_PRIORITY_LOW,\n ),\n editor.registerCommand<KeyboardEvent>(\n KEY_ARROW_UP_COMMAND,\n (payload) => {\n const event = payload\n if (groups !== null && groups.length && selectedItemKey !== null) {\n const allItems = groups.flatMap((group) => group.items)\n const selectedIndex = allItems.findIndex((item) => item.key === selectedItemKey)\n\n const newSelectedIndex = selectedIndex !== 0 ? selectedIndex - 1 : allItems.length - 1\n\n const newSelectedItem = allItems[newSelectedIndex]\n\n updateSelectedItem(newSelectedItem)\n if (newSelectedItem.ref != null && newSelectedItem.ref.current) {\n scrollIntoViewIfNeeded(newSelectedItem.ref.current)\n }\n event.preventDefault()\n event.stopImmediatePropagation()\n }\n return true\n },\n COMMAND_PRIORITY_LOW,\n ),\n editor.registerCommand<KeyboardEvent>(\n KEY_ESCAPE_COMMAND,\n (payload) => {\n const event = payload\n event.preventDefault()\n event.stopImmediatePropagation()\n close()\n return true\n },\n COMMAND_PRIORITY_LOW,\n ),\n editor.registerCommand<KeyboardEvent>(\n KEY_TAB_COMMAND,\n (payload) => {\n const event = payload\n\n if (groups === null || selectedItemKey === null) {\n return false\n }\n const allItems = groups.flatMap((group) => group.items)\n const selectedItem = allItems.find((item) => item.key === selectedItemKey)\n if (!selectedItem) {\n return false\n }\n\n event.preventDefault()\n event.stopImmediatePropagation()\n selectItemAndCleanUp(selectedItem)\n return true\n },\n COMMAND_PRIORITY_LOW,\n ),\n editor.registerCommand(\n KEY_ENTER_COMMAND,\n (event: KeyboardEvent | null) => {\n if (groups === null || selectedItemKey === null) {\n return false\n }\n const allItems = groups.flatMap((group) => group.items)\n const selectedItem = allItems.find((item) => item.key === selectedItemKey)\n if (!selectedItem) {\n return false\n }\n\n if (event !== null) {\n event.preventDefault()\n event.stopImmediatePropagation()\n }\n selectItemAndCleanUp(selectedItem)\n return true\n },\n COMMAND_PRIORITY_LOW,\n ),\n )\n }, [selectItemAndCleanUp, close, editor, groups, selectedItemKey, updateSelectedItem])\n\n const listItemProps = useMemo(\n () => ({\n groups,\n selectItemAndCleanUp,\n selectedItemKey,\n setSelectedItemKey,\n }),\n [selectItemAndCleanUp, selectedItemKey, groups],\n )\n\n return menuRenderFn(\n anchorElementRef,\n listItemProps,\n resolution.match ? resolution.match.matchingString : '',\n )\n}\n\nexport function useMenuAnchorRef(\n anchorElem: HTMLElement,\n resolution: MenuResolution | null,\n setResolution: (r: MenuResolution | null) => void,\n className?: string,\n): RefObject<HTMLElement> {\n const [editor] = useLexicalComposerContext()\n const anchorElementRef = useRef<HTMLElement>(document.createElement('div'))\n const positionMenu = useCallback(() => {\n const rootElement = editor.getRootElement()\n const containerDiv = anchorElementRef.current\n\n const VERTICAL_OFFSET = 32\n\n const menuEle = containerDiv.firstChild as Element\n if (rootElement !== null && resolution !== null) {\n const { height, width } = resolution.getRect()\n let { left, top } = resolution.getRect()\n\n const rawTop = top\n top -= anchorElem.getBoundingClientRect().top + window.scrollY\n left -= anchorElem.getBoundingClientRect().left + window.scrollX\n containerDiv.style.left = `${left + window.scrollX}px`\n containerDiv.style.height = `${height}px`\n containerDiv.style.width = `${width}px`\n if (menuEle !== null) {\n const menuRect = menuEle.getBoundingClientRect()\n const menuHeight = menuRect.height\n const menuWidth = menuRect.width\n\n const rootElementRect = rootElement.getBoundingClientRect()\n\n if (left + menuWidth > rootElementRect.right) {\n containerDiv.style.left = `${rootElementRect.right - menuWidth + window.scrollX}px`\n }\n\n const wouldGoOffBottomOfScreen = rawTop + menuHeight + VERTICAL_OFFSET > window.innerHeight\n //const wouldGoOffBottomOfContainer = top + menuHeight > rootElementRect.bottom\n const wouldGoOffTopOfScreen = rawTop < 0\n\n // Position slash menu above the cursor instead of below (default) if it would otherwise go off the bottom of the screen.\n if (wouldGoOffBottomOfScreen && !wouldGoOffTopOfScreen) {\n const margin = 24\n containerDiv.style.top = `${\n top + VERTICAL_OFFSET - menuHeight + window.scrollY - (height + margin)\n }px`\n } else {\n containerDiv.style.top = `${top + window.scrollY + VERTICAL_OFFSET}px`\n }\n }\n\n if (!containerDiv.isConnected) {\n if (className != null) {\n containerDiv.className = className\n }\n containerDiv.setAttribute('aria-label', 'Slash menu')\n containerDiv.setAttribute('id', 'slash-menu')\n containerDiv.setAttribute('role', 'listbox')\n containerDiv.style.display = 'block'\n containerDiv.style.position = 'absolute'\n anchorElem.append(containerDiv)\n }\n anchorElementRef.current = containerDiv\n rootElement.setAttribute('aria-controls', 'slash-menu')\n }\n }, [editor, resolution, className, anchorElem])\n\n useEffect(() => {\n const rootElement = editor.getRootElement()\n if (resolution !== null) {\n positionMenu()\n return () => {\n if (rootElement !== null) {\n rootElement.removeAttribute('aria-controls')\n }\n\n const containerDiv = anchorElementRef.current\n if (containerDiv !== null && containerDiv.isConnected) {\n containerDiv.remove()\n }\n }\n }\n }, [editor, positionMenu, resolution])\n\n const onVisibilityChange = useCallback(\n (isInView: boolean) => {\n if (resolution !== null) {\n if (!isInView) {\n setResolution(null)\n }\n }\n },\n [resolution, setResolution],\n )\n\n useDynamicPositioning(resolution, anchorElementRef.current, positionMenu, onVisibilityChange)\n\n return anchorElementRef\n}\n", "export function isHTMLElement(x: unknown): x is HTMLElement {\n return x instanceof HTMLElement\n}\n", "export class Point {\n private readonly _x: number\n\n private readonly _y: number\n\n constructor(x: number, y: number) {\n this._x = x\n this._y = y\n }\n\n public calcDeltaXTo({ x }: Point): number {\n return this.x - x\n }\n\n public calcDeltaYTo({ y }: Point): number {\n return this.y - y\n }\n\n public calcDistanceTo(point: Point): number {\n return Math.sqrt(Math.pow(this.calcDeltaXTo(point), 2) + Math.pow(this.calcDeltaYTo(point), 2))\n }\n\n public calcHorizontalDistanceTo(point: Point): number {\n return Math.abs(this.calcDeltaXTo(point))\n }\n\n public calcVerticalDistance(point: Point): number {\n return Math.abs(this.calcDeltaYTo(point))\n }\n\n public equals({ x, y }: Point): boolean {\n return this.x === x && this.y === y\n }\n\n get x(): number {\n return this._x\n }\n\n get y(): number {\n return this._y\n }\n}\n\nexport function isPoint(x: unknown): x is Point {\n return x instanceof Point\n}\n", "import { type Point, isPoint } from './point.js'\n\ninterface ContainsPointReturn {\n reason: {\n isOnBottomSide: boolean\n isOnLeftSide: boolean\n isOnRightSide: boolean\n isOnTopSide: boolean\n }\n result: boolean\n}\n\nexport class Rect {\n private readonly _bottom: number\n\n private readonly _left: number\n\n private readonly _right: number\n\n private readonly _top: number\n\n constructor(left: number, top: number, right: number, bottom: number) {\n const [physicTop, physicBottom] = top <= bottom ? [top, bottom] : [bottom, top]\n\n const [physicLeft, physicRight] = left <= right ? [left, right] : [right, left]\n\n this._top = physicTop\n this._right = physicRight\n this._left = physicLeft\n this._bottom = physicBottom\n }\n\n static fromDOM(dom: HTMLElement): Rect {\n const { height, left, top, width } = dom.getBoundingClientRect()\n return Rect.fromLWTH(left, width, top, height)\n }\n\n static fromDOMRect(domRect: DOMRect): Rect {\n const { height, left, top, width } = domRect\n return Rect.fromLWTH(left, width, top, height)\n }\n\n static fromLTRB(left: number, top: number, right: number, bottom: number): Rect {\n return new Rect(left, top, right, bottom)\n }\n\n static fromLWTH(left: number, width: number, top: number, height: number): Rect {\n return new Rect(left, top, left + width, top + height)\n }\n\n static fromPoints(startPoint: Point, endPoint: Point): Rect {\n const { x: left, y: top } = startPoint\n const { x: right, y: bottom } = endPoint\n return Rect.fromLTRB(left, top, right, bottom)\n }\n\n public contains({ x, y }: Point): ContainsPointReturn\n\n public contains({ bottom, left, right, top }: Rect): boolean\n\n public contains(target: Point | Rect): ContainsPointReturn | boolean {\n if (isPoint(target)) {\n const { x, y } = target\n\n const isOnTopSide = y < this._top\n const isOnBottomSide = y > this._bottom\n const isOnLeftSide = x < this._left\n const isOnRightSide = x > this._right\n\n const result = !isOnTopSide && !isOnBottomSide && !isOnLeftSide && !isOnRightSide\n\n return {\n reason: {\n isOnBottomSide,\n isOnLeftSide,\n isOnRightSide,\n isOnTopSide,\n },\n result,\n }\n }\n const { bottom, left, right, top } = target\n\n return (\n top >= this._top &&\n top <= this._bottom &&\n bottom >= this._top &&\n bottom <= this._bottom &&\n left >= this._left &&\n left <= this._right &&\n right >= this._left &&\n right <= this._right\n )\n }\n\n public distanceFromPoint(point: Point): {\n distance: number\n isOnBottomSide: boolean\n isOnLeftSide: boolean\n isOnRightSide: boolean\n isOnTopSide: boolean\n } {\n const containsResult = this.contains(point)\n if (containsResult.result) {\n return {\n distance: 0,\n isOnBottomSide: containsResult.reason.isOnBottomSide,\n isOnLeftSide: containsResult.reason.isOnLeftSide,\n isOnRightSide: containsResult.reason.isOnRightSide,\n isOnTopSide: containsResult.reason.isOnTopSide,\n }\n }\n\n let dx = 0 // Horizontal distance to the closest edge\n let dy = 0 // Vertical distance to the closest edge\n\n // If the point is to the left of the rectangle\n if (point.x < this._left) {\n dx = this._left - point.x\n }\n // If the point is to the right of the rectangle\n else if (point.x > this._right) {\n dx = point.x - this._right\n }\n\n // If the point is above the rectangle\n if (point.y < this._top) {\n dy = this._top - point.y\n }\n // If the point is below the rectangle\n else if (point.y > this._bottom) {\n dy = point.y - this._bottom\n }\n\n // Use the Pythagorean theorem to calculate the distance\n return {\n distance: Math.sqrt(dx * dx + dy * dy),\n isOnBottomSide: point.y > this._bottom,\n isOnLeftSide: point.x < this._left,\n isOnRightSide: point.x > this._right,\n isOnTopSide: point.y < this._top,\n }\n }\n\n public equals({ bottom, left, right, top }: Rect): boolean {\n return (\n top === this._top && bottom === this._bottom && left === this._left && right === this._right\n )\n }\n\n public generateNewRect({\n bottom = this.bottom,\n left = this.left,\n right = this.right,\n top = this.top,\n }): Rect {\n return new Rect(left, top, right, bottom)\n }\n\n public intersectsWith(rect: Rect): boolean {\n const { height: h1, left: x1, top: y1, width: w1 } = rect\n const { height: h2, left: x2, top: y2, width: w2 } = this\n const maxX = x1 + w1 >= x2 + w2 ? x1 + w1 : x2 + w2\n const maxY = y1 + h1 >= y2 + h2 ? y1 + h1 : y2 + h2\n const minX = x1 <= x2 ? x1 : x2\n const minY = y1 <= y2 ? y1 : y2\n return maxX - minX <= w1 + w2 && maxY - minY <= h1 + h2\n }\n\n get bottom(): number {\n return this._bottom\n }\n\n get height(): number {\n return Math.abs(this._bottom - this._top)\n }\n\n get left(): number {\n return this._left\n }\n\n get right(): number {\n return this._right\n }\n\n get top(): number {\n return this._top\n }\n\n get width(): number {\n return Math.abs(this._left - this._right)\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["getEnabledNodes", "editorConfig", "node", "useLexicalComposerContext", "mergeRegister", "$getSelection", "$isRangeSelection", "$isTextNode", "COMMAND_PRIORITY_LOW", "createCommand", "useCallback", "useEffect", "useState", "React", "useLexicalComposerContext", "mergeRegister", "$getSelection", "$isRangeSelection", "COMMAND_PRIORITY_LOW", "KEY_ARROW_DOWN_COMMAND", "KEY_ARROW_UP_COMMAND", "KEY_ENTER_COMMAND", "KEY_ESCAPE_COMMAND", "KEY_TAB_COMMAND", "createCommand", "useCallback", "useEffect", "useLayoutEffect", "useMemo", "useRef", "useState", "baseClass", "scrollIntoViewIfNeeded", "target", "typeaheadContainerNode", "typeaheadRect", "getFullMatchOffset", "documentText", "entryText", "offset", "triggerOffset", "i", "$splitNodeContainingQuery", "match", "selection", "anchor", "anchorNode", "selectionOffset", "textContent", "characterOffset", "queryOffset", "startOffset", "newNode", "getScrollParent", "element", "includeHidden", "style", "excludeStaticParent", "overflowRegex", "parent", "isTriggerVisibleInNearestScrollContainer", "targetElement", "containerElement", "tRect", "cRect", "useDynamicPositioning", "resolution", "onReposition", "onVisibilityChange", "editor", "rootElement", "rootScrollParent", "ticking", "previousIsInView", "handleScroll", "isInView", "resizeObserver", "SCROLL_TYPEAHEAD_OPTION_INTO_VIEW_COMMAND", "LexicalMenu", "anchorElementRef", "close", "groups", "menuRenderFn", "onSelectItem", "shouldSplitNodeWithQuery", "selectedItemKey", "setSelectedItemKey", "matchingString", "updateSelectedItem", "item", "rootElem", "setSelectedItemKeyToFirstMatchingItem", "allItems", "group", "firstMatchingItem", "selectItemAndCleanUp", "selectedItem", "textNodeContainingQuery", "payload", "event", "selectedIndex", "newSelectedIndex", "newSelectedItem", "listItemProps", "useMenuAnchorRef", "anchorElem", "setResolution", "className", "positionMenu", "containerDiv", "VERTICAL_OFFSET", "menuEle", "height", "width", "left", "top", "rawTop", "menuRect", "menuHeight", "menuWidth", "rootElementRect", "wouldGoOffBottomOfScreen", "wouldGoOffTopOfScreen", "jsx", "PUNCTUATION", "getTextUpToAnchor", "selection", "anchor", "anchorNode", "anchorOffset", "tryToPositionRange", "leadOffset", "range", "editorWindow", "domSelection", "startOffset", "endOffset", "getQueryTextForSearch", "editor", "text", "$getSelection", "$isRangeSelection", "isSelectionOnEntityBoundary", "offset", "prevSibling", "$isTextNode", "startTransition", "callback", "ENABLE_SLASH_MENU_COMMAND", "createCommand", "LexicalTypeaheadMenuPlugin", "anchorClassName", "anchorElem", "groups", "menuRenderFn", "onClose", "onOpen", "onQueryChange", "onSelectItem", "triggerFn", "useLexicalComposerContext", "resolution", "setResolution", "useState", "anchorElementRef", "useMenuAnchorRef", "closeTypeahead", "useCallback", "openTypeahead", "res", "useEffect", "mergeRegister", "node", "match", "COMMAND_PRIORITY_LOW", "updateListener", "removeUpdateListener", "LexicalMenu", "isHTMLElement", "x", "Point", "x", "y", "point", "isPoint", "Rect", "_Rect", "left", "top", "right", "bottom", "physicTop", "physicBottom", "physicLeft", "physicRight", "dom", "height", "width", "domRect", "startPoint", "endPoint", "target", "isPoint", "x", "y", "isOnTopSide", "isOnBottomSide", "isOnLeftSide", "isOnRightSide", "point", "containsResult", "dx", "dy", "rect", "h1", "x1", "y1", "w1", "h2", "x2", "y2", "w2", "maxX", "maxY", "minX", "minY"]
|
|
7
|
+
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{createCommand as l}from"lexical";var h=l("INSERT_RELATIONSHIP_WITH_DRAWER_COMMAND");import{DecoratorBlockNode as s}from"@lexical/react/LexicalDecoratorBlockNode.js";import*as n from"react";import{jsx as c}from"react/jsx-runtime";var p=n.lazy(()=>import("./RelationshipComponent-
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
import{createCommand as l}from"lexical";var h=l("INSERT_RELATIONSHIP_WITH_DRAWER_COMMAND");import{DecoratorBlockNode as s}from"@lexical/react/LexicalDecoratorBlockNode.js";import*as n from"react";import{jsx as c}from"react/jsx-runtime";var p=n.lazy(()=>import("./RelationshipComponent-FFJCVTWM.js").then(a=>({default:a.RelationshipComponent})));function d(a){let t=a.getAttribute("data-lexical-relationship-id"),e=a.getAttribute("data-lexical-relationship-relationTo");return t!=null&&e!=null?{node:r({relationTo:e,value:t})}:null}var o=class a extends s{__data;constructor({data:t,format:e,key:i}){super(e,i),this.__data=t}static clone(t){return new a({data:t.__data,format:t.__format,key:t.__key})}static getType(){return"relationship"}static importDOM(){return{div:t=>!t.hasAttribute("data-lexical-relationship-relationTo")||!t.hasAttribute("data-lexical-relationship-id")?null:{conversion:d,priority:2}}}static importJSON(t){t.version===1&&t?.value?.id&&(t.value=t.value.id);let e={relationTo:t.relationTo,value:t.value},i=r(e);return i.setFormat(t.format),i}static isInline(){return!1}decorate(t,e){return c(p,{className:e.theme.relationship??"LexicalEditorTheme__relationship",data:this.__data,format:this.__format,nodeKey:this.getKey()})}exportDOM(){let t=document.createElement("div");t.setAttribute("data-lexical-relationship-id",String(this.__data?.value)),t.setAttribute("data-lexical-relationship-relationTo",this.__data?.relationTo);let e=document.createTextNode(this.getTextContent());return t.append(e),{element:t}}exportJSON(){return{...super.exportJSON(),...this.getData(),type:"relationship",version:2}}getData(){return this.getLatest().__data}getTextContent(){return`${this.__data?.relationTo} relation to ${this.__data?.value}`}setData(t){let e=this.getWritable();e.__data=t}};function r(a){return new o({data:a})}function x(a){return a instanceof o}export{h as a,o as b,r as c,x as d};
|
|
2
|
+
//# sourceMappingURL=chunk-HO42U3IJ.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{createCommand as o}from"lexical";var I=o("INSERT_BLOCK_COMMAND"),m=o("INSERT_INLINE_BLOCK_COMMAND"),k=o("OPEN_INLINE_BLOCK_DRAWER_COMMAND");import r from"bson-objectid";import{DecoratorNode as d}from"lexical";import c from"react";import{jsx as p}from"react/jsx-runtime";var s=c.lazy(()=>import("./componentInline-FQNXWTOE.js").then(t=>({default:t.InlineBlockComponent}))),i=class t extends d{__fields;constructor({fields:e,key:n}){super(n),this.__fields=e}static clone(e){return new t({fields:e.__fields,key:e.__key})}static getType(){return"inlineBlock"}static importDOM(){return{}}static importJSON(e){return a(e.fields)}static isInline(){return!1}canIndent(){return!0}createDOM(){let e=document.createElement("span");return e.classList.add("inline-block-container"),e}decorate(e,n){return p(s,{formData:this.getFields(),nodeKey:this.getKey()})}exportDOM(){let e=document.createElement("span");e.classList.add("inline-block-container");let n=document.createTextNode(this.getTextContent());return e.append(n),{element:e}}exportJSON(){return{type:"inlineBlock",fields:this.getFields(),version:1}}getFields(){return this.getLatest().__fields}getTextContent(){return"Block Field"}isInline(){return!0}setFields(e){let n=JSON.parse(JSON.stringify(e)),l=this.getWritable();l.__fields=n}updateDOM(){return!1}};function a(t){return new i({fields:{...t,id:t?.id||new r.default().toHexString()}})}function O(t){return t instanceof i}export{I as a,m as b,k as c,i as d,a as e,O as f};
|
|
2
|
+
//# sourceMappingURL=chunk-JELGBZLY.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/features/blocks/plugin/commands.ts", "../../../src/features/blocks/nodes/InlineBlocksNode.tsx"],
|
|
4
|
+
"sourcesContent": ["import type { LexicalCommand } from 'lexical'\n\nimport { createCommand } from 'lexical'\n\nimport type { InsertBlockPayload } from './index.js'\n\nexport const INSERT_BLOCK_COMMAND: LexicalCommand<InsertBlockPayload> =\n createCommand('INSERT_BLOCK_COMMAND')\n\nexport const INSERT_INLINE_BLOCK_COMMAND: LexicalCommand<Partial<InsertBlockPayload>> =\n createCommand('INSERT_INLINE_BLOCK_COMMAND')\n\nexport const OPEN_INLINE_BLOCK_DRAWER_COMMAND: LexicalCommand<{\n fields: Partial<InsertBlockPayload>\n nodeKey?: string\n}> = createCommand('OPEN_INLINE_BLOCK_DRAWER_COMMAND')\n", "import type {\n DOMConversionMap,\n DOMExportOutput,\n EditorConfig,\n LexicalEditor,\n LexicalNode,\n NodeKey,\n SerializedLexicalNode,\n Spread,\n} from 'lexical'\n\nimport ObjectID from 'bson-objectid'\nimport { DecoratorNode } from 'lexical'\nimport React, { type JSX } from 'react'\n\nexport type InlineBlockFields = {\n /** Block form data */\n [key: string]: any\n //blockName: string\n blockType: string\n id: string\n}\n\nconst InlineBlockComponent = React.lazy(() =>\n import('../componentInline/index.js').then((module) => ({\n default: module.InlineBlockComponent,\n })),\n)\n\nexport type SerializedInlineBlockNode = Spread<\n {\n children?: never // required so that our typed editor state doesn't automatically add children\n fields: InlineBlockFields\n type: 'inlineBlock'\n },\n SerializedLexicalNode\n>\n\nexport class InlineBlockNode extends DecoratorNode<React.ReactElement> {\n __fields: InlineBlockFields\n\n constructor({ fields, key }: { fields: InlineBlockFields; key?: NodeKey }) {\n super(key)\n this.__fields = fields\n }\n\n static clone(node: InlineBlockNode): InlineBlockNode {\n return new InlineBlockNode({\n fields: node.__fields,\n key: node.__key,\n })\n }\n\n static getType(): string {\n return 'inlineBlock'\n }\n\n static importDOM(): DOMConversionMap<HTMLDivElement> | null {\n return {}\n }\n\n static importJSON(serializedNode: SerializedInlineBlockNode): InlineBlockNode {\n const node = $createInlineBlockNode(serializedNode.fields)\n return node\n }\n\n static isInline(): false {\n return false\n }\n canIndent() {\n return true\n }\n\n createDOM() {\n const element = document.createElement('span')\n element.classList.add('inline-block-container')\n\n return element\n }\n\n decorate(editor: LexicalEditor, config: EditorConfig): JSX.Element {\n return <InlineBlockComponent formData={this.getFields()} nodeKey={this.getKey()} />\n }\n\n exportDOM(): DOMExportOutput {\n const element = document.createElement('span')\n element.classList.add('inline-block-container')\n\n const text = document.createTextNode(this.getTextContent())\n element.append(text)\n return { element }\n }\n\n exportJSON(): SerializedInlineBlockNode {\n return {\n type: 'inlineBlock',\n fields: this.getFields(),\n version: 1,\n }\n }\n\n getFields(): InlineBlockFields {\n return this.getLatest().__fields\n }\n\n getTextContent(): string {\n return `Block Field`\n }\n\n isInline() {\n return true\n }\n\n setFields(fields: InlineBlockFields): void {\n const fieldsCopy = JSON.parse(JSON.stringify(fields)) as InlineBlockFields\n\n const writable = this.getWritable()\n writable.__fields = fieldsCopy\n }\n\n updateDOM(): boolean {\n return false\n }\n}\n\nexport function $createInlineBlockNode(fields: Exclude<InlineBlockFields, 'id'>): InlineBlockNode {\n return new InlineBlockNode({\n fields: {\n ...fields,\n id: fields?.id || new ObjectID.default().toHexString(),\n },\n })\n}\n\nexport function $isInlineBlockNode(\n node: InlineBlockNode | LexicalNode | null | undefined,\n): node is InlineBlockNode {\n return node instanceof InlineBlockNode\n}\n"],
|
|
5
|
+
"mappings": "AAEA,OAAS,iBAAAA,MAAqB,UAIvB,IAAMC,EACXD,EAAc,sBAAsB,EAEzBE,EACXF,EAAc,6BAA6B,EAEhCG,EAGRH,EAAc,kCAAkC,ECJrD,OAAOI,MAAc,gBACrB,OAAS,iBAAAC,MAAqB,UAC9B,OAAOC,MAAyB,QAoErB,cAAAC,MAAA,oBA1DX,IAAMC,EAAuBF,EAAM,KAAK,IACtC,OAAO,+BAA6B,EAAE,KAAMG,IAAY,CACtD,QAASA,EAAO,oBAClB,EAAE,CACJ,EAWaC,EAAN,MAAMC,UAAwBN,CAAkC,CACrE,SAEA,YAAY,CAAE,OAAAO,EAAQ,IAAAC,CAAI,EAAiD,CACzE,MAAMA,CAAG,EACT,KAAK,SAAWD,CAClB,CAEA,OAAO,MAAME,EAAwC,CACnD,OAAO,IAAIH,EAAgB,CACzB,OAAQG,EAAK,SACb,IAAKA,EAAK,KACZ,CAAC,CACH,CAEA,OAAO,SAAkB,CACvB,MAAO,aACT,CAEA,OAAO,WAAqD,CAC1D,MAAO,CAAC,CACV,CAEA,OAAO,WAAWC,EAA4D,CAE5E,OADaC,EAAuBD,EAAe,MAAM,CAE3D,CAEA,OAAO,UAAkB,CACvB,MAAO,EACT,CACA,WAAY,CACV,MAAO,EACT,CAEA,WAAY,CACV,IAAME,EAAU,SAAS,cAAc,MAAM,EAC7C,OAAAA,EAAQ,UAAU,IAAI,wBAAwB,EAEvCA,CACT,CAEA,SAASC,EAAuBC,EAAmC,CACjE,OAAOZ,EAACC,EAAA,CAAqB,SAAU,KAAK,UAAU,EAAG,QAAS,KAAK,OAAO,EAAG,CACnF,CAEA,WAA6B,CAC3B,IAAMS,EAAU,SAAS,cAAc,MAAM,EAC7CA,EAAQ,UAAU,IAAI,wBAAwB,EAE9C,IAAMG,EAAO,SAAS,eAAe,KAAK,eAAe,CAAC,EAC1D,OAAAH,EAAQ,OAAOG,CAAI,EACZ,CAAE,QAAAH,CAAQ,CACnB,CAEA,YAAwC,CACtC,MAAO,CACL,KAAM,cACN,OAAQ,KAAK,UAAU,EACvB,QAAS,CACX,CACF,CAEA,WAA+B,CAC7B,OAAO,KAAK,UAAU,EAAE,QAC1B,CAEA,gBAAyB,CACvB,MAAO,aACT,CAEA,UAAW,CACT,MAAO,EACT,CAEA,UAAUL,EAAiC,CACzC,IAAMS,EAAa,KAAK,MAAM,KAAK,UAAUT,CAAM,CAAC,EAE9CU,EAAW,KAAK,YAAY,EAClCA,EAAS,SAAWD,CACtB,CAEA,WAAqB,CACnB,MAAO,EACT,CACF,EAEO,SAASL,EAAuBJ,EAA2D,CAChG,OAAO,IAAIF,EAAgB,CACzB,OAAQ,CACN,GAAGE,EACH,GAAIA,GAAQ,IAAM,IAAIR,EAAS,QAAQ,EAAE,YAAY,CACvD,CACF,CAAC,CACH,CAEO,SAASmB,EACdT,EACyB,CACzB,OAAOA,aAAgBJ,CACzB",
|
|
6
|
+
"names": ["createCommand", "INSERT_BLOCK_COMMAND", "INSERT_INLINE_BLOCK_COMMAND", "OPEN_INLINE_BLOCK_DRAWER_COMMAND", "ObjectID", "DecoratorNode", "React", "jsx", "InlineBlockComponent", "module", "InlineBlockNode", "_InlineBlockNode", "fields", "key", "node", "serializedNode", "$createInlineBlockNode", "element", "editor", "config", "text", "fieldsCopy", "writable", "$isInlineBlockNode"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use client";import{b as D}from"./chunk-QZIAQPM7.js";import{Collapsible as te,Form as ae,Pill as le,SectionTitle as re,ShimmerEffect as ie,useConfig as se,useDocumentInfo as ne,useFieldProps as ce,useFormSubmitted as de,useTranslation as me}from"@payloadcms/ui";import{useCallback as pe,useEffect as fe,useMemo as ue,useState as ye}from"react";import{getTranslation as he}from"@payloadcms/translations";import{getFormState as K}from"@payloadcms/ui/shared";import{v4 as be}from"uuid";import{useLexicalComposerContext as W}from"@lexical/react/LexicalComposerContext.js";import{getTranslation as z}from"@payloadcms/translations";import{Button as H,Collapsible as q,ErrorPill as G,Pill as J,RenderFields as Q,SectionTitle as X,useDocumentInfo as Y,useFormSubmitted as Z,useTranslation as ee}from"@payloadcms/ui";import{dequal as oe}from"dequal/lite";import{$getNodeByKey as O}from"lexical";import w,{useCallback as A}from"react";import{useAllFormFields as U}from"@payloadcms/ui";import{reduceFieldsToValues as I}from"payload/shared";import{useEffect as j}from"react";function E({fields:s}){for(let e in s){let a=s[e];Array.isArray(a.rows)&&"value"in a&&(a.disableFormData=!0)}return s}var M=s=>{let{onChange:e}=s,[a]=U(),o=E({fields:a}),f=I(o,!0);return j(()=>{e&&e({fullFieldsWithValues:o,newFormData:f})},[f,e,o]),null};import{jsx as u,jsxs as L}from"react/jsx-runtime";var V=s=>{let{baseClass:e,field:a,formData:o,formSchema:f,nodeKey:n,reducedBlock:{LabelComponent:g,labels:B},schemaPath:T}=s,{i18n:C}=ee(),[c]=W(),{getDocPreferences:v,setDocFieldPreferences:_}=Y(),[x,d]=w.useState(()=>{let l=!1;return v().then(m=>{let t=m?.fields[a.name]?.collapsed;t&&t.includes(o.id)&&(l=!0,d(!0))}),l}),i=Z(),[h,S]=w.useState(0),k=i&&h>0,R=[`${e}__row`,k?`${e}__row--has-errors`:`${e}__row--no-errors`].filter(Boolean).join(" "),N=A(({fullFieldsWithValues:l,newFormData:m})=>{m={...m,id:o.id,blockType:o.blockType};function P(t){for(let r in t){let b=t[r];Array.isArray(b)&&!b?.length?delete t[r]:b&&typeof b=="object"?P(b):b==null&&delete t[r]}}if(P(m),P(o),oe(o,m)||setTimeout(()=>{c.update(()=>{let t=O(n);t&&t.setFields(m)})},0),i){let t=0;for(let r of Object.values(l))r?.valid===!1&&t++;S(t)}},[c,n,i,o]),$=A(l=>{v().then(m=>{let t=m?.fields[a.name]?.collapsed,r=t&&t?.length?t:[];l?r.includes(o.id)||r.push(o.id):r.includes(o.id)&&r.splice(r.indexOf(o.id),1),_(a.name,{collapsed:r,hello:"hi"})})},[v,a.name,_,o.id]),F=A(()=>{c.update(()=>{O(n).remove()})},[c,n]);return L(w.Fragment,{children:[u(q,{className:R,collapsibleStyle:k?"error":"default",header:g?u(g,{blockKind:"lexicalBlock",formData:o}):L("div",{className:`${e}__block-header`,children:[L("div",{children:[u(J,{className:`${e}__block-pill ${e}__block-pill-${o?.blockType}`,pillStyle:"white",children:typeof B.singular=="string"?z(B.singular,C):"[Singular Label]"}),u(X,{path:"blockName",readOnly:a?.readOnly}),k&&u(G,{count:h,i18n:C,withMessage:!0})]}),c.isEditable()&&u(H,{buttonStyle:"icon-label",className:`${e}__removeButton`,disabled:a?.readOnly,icon:"x",onClick:l=>{l.preventDefault(),F()},round:!0,tooltip:"Remove Block"})]}),isCollapsed:x,onToggle:l=>{$(l),d(l)},children:u(Q,{className:`${e}__fields`,fieldMap:Array.isArray(f)?f:[],forceRender:!0,margins:"small",path:"",readOnly:!1,schemaPath:T})},0),u(M,{onChange:N})]})};import{jsx as p,jsxs as Ce}from"react/jsx-runtime";var y="lexical-block",Ie=s=>{let{formData:e,nodeKey:a}=s,o=se(),f=de(),{id:n}=ne(),{path:g,schemaPath:B}=ce(),{editorConfig:T,field:C}=D(),[c,v]=ye(!1),{field:{richTextComponentMap:_}}=D(),x=`lexical_internal_feature.blocks.fields.${e?.blockType}`,d=`${B}.lexical_internal_feature.blocks.${e?.blockType}`,i=T?.resolvedFeatureMap?.get("blocks")?.sanitizedClientFeatureProps?.reducedBlocks?.find(F=>F.slug===e?.blockType),h=_.get(x);fe(()=>{e&&(async()=>{let l=await K({apiRoute:o.routes.api,body:{id:n,data:e,operation:"update",schemaPath:d},serverURL:o.serverURL});l&&v({...l,blockName:{initialValue:"",passesCondition:!0,valid:!0,value:e.blockName}})})()},[o.routes.api,o.serverURL,d,n]);let S=pe(async({formState:F})=>({...await K({apiRoute:o.routes.api,body:{id:n,formState:F,operation:"update",schemaPath:d},serverURL:o.serverURL}),blockName:{initialValue:"",passesCondition:!0,valid:!0,value:e.blockName}}),[o.routes.api,o.serverURL,d,n,e.blockName]),{i18n:k}=me(),R=[`${y}__row`,`${y}__row--no-errors`].filter(Boolean).join(" "),N=i?.LabelComponent,$=ue(()=>i&&c!==!1?p(ae,{beforeSubmit:[S],fields:h,initialState:c,onChange:[S],submitted:f,uuid:be(),children:p(V,{baseClass:y,field:C,formData:e,formSchema:Array.isArray(h)?h:[],nodeKey:a,path:`${g}.lexical_internal_feature.blocks.${e.blockType}`,reducedBlock:i,schemaPath:d})}):p(te,{className:R,collapsibleStyle:"default",header:N?p(N,{blockKind:"lexicalBlock",formData:e}):p("div",{className:`${y}__block-header`,children:Ce("div",{children:[p(le,{className:`${y}__block-pill ${y}__block-pill-${e?.blockType}`,pillStyle:"white",children:i&&typeof i.labels.singular=="string"?he(i.labels.singular,k):"[Singular Label]"}),p(re,{path:"blockName",readOnly:C?.readOnly})]})}),children:p(ie,{height:"35vh"})},0),[R,h,C,a,k,f,c,i,S,d,g]);return p("div",{className:y+" "+y+"-"+e.blockType,children:$})};export{Ie as BlockComponent};
|
|
2
|
+
//# sourceMappingURL=component-TYPMHBL7.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/features/blocks/component/index.tsx", "../../../src/features/blocks/component/BlockContent.tsx", "../../../src/features/blocks/component/FormSavePlugin.tsx", "../../../src/features/blocks/component/removeEmptyArrayValues.ts"],
|
|
4
|
+
"sourcesContent": ["'use client'\n\nimport type { FormProps } from '@payloadcms/ui'\n\nimport {\n Collapsible,\n Form,\n Pill,\n SectionTitle,\n ShimmerEffect,\n useConfig,\n useDocumentInfo,\n useFieldProps,\n useFormSubmitted,\n useTranslation,\n} from '@payloadcms/ui'\nimport React, { useCallback, useEffect, useMemo, useState } from 'react'\n\nimport { type BlockFields } from '../nodes/BlocksNode.js'\nconst baseClass = 'lexical-block'\nimport type { FormState } from 'payload'\n\nimport { getTranslation } from '@payloadcms/translations'\nimport { getFormState } from '@payloadcms/ui/shared'\nimport { v4 as uuid } from 'uuid'\n\nimport type { ClientComponentProps } from '../../typesClient.js'\nimport type { BlocksFeatureClientProps, ClientBlock } from '../feature.client.js'\n\nimport { useEditorConfigContext } from '../../../lexical/config/client/EditorConfigProvider.js'\nimport { BlockContent } from './BlockContent.js'\ntype Props = {\n children?: React.ReactNode\n formData: BlockFields\n nodeKey?: string\n}\n\nexport const BlockComponent: React.FC<Props> = (props) => {\n const { formData, nodeKey } = props\n const config = useConfig()\n const submitted = useFormSubmitted()\n const { id } = useDocumentInfo()\n const { path, schemaPath } = useFieldProps()\n const { editorConfig, field: parentLexicalRichTextField } = useEditorConfigContext()\n\n const [initialState, setInitialState] = useState<FormState | false>(false)\n const {\n field: { richTextComponentMap },\n } = useEditorConfigContext()\n\n const componentMapRenderedFieldsPath = `lexical_internal_feature.blocks.fields.${formData?.blockType}`\n const schemaFieldsPath = `${schemaPath}.lexical_internal_feature.blocks.${formData?.blockType}`\n\n const reducedBlock: ClientBlock = (\n editorConfig?.resolvedFeatureMap?.get('blocks')\n ?.sanitizedClientFeatureProps as ClientComponentProps<BlocksFeatureClientProps>\n )?.reducedBlocks?.find((block) => block.slug === formData?.blockType)\n\n const fieldMap = richTextComponentMap.get(componentMapRenderedFieldsPath)\n // Field Schema\n useEffect(() => {\n const awaitInitialState = async () => {\n const state = await getFormState({\n apiRoute: config.routes.api,\n body: {\n id,\n data: formData,\n operation: 'update',\n schemaPath: schemaFieldsPath,\n },\n serverURL: config.serverURL,\n }) // Form State\n\n if (state) {\n setInitialState({\n ...state,\n blockName: {\n initialValue: '',\n passesCondition: true,\n valid: true,\n value: formData.blockName,\n },\n })\n }\n }\n\n if (formData) {\n void awaitInitialState()\n }\n }, [config.routes.api, config.serverURL, schemaFieldsPath, id])\n\n const onChange: FormProps['onChange'][0] = useCallback(\n async ({ formState: prevFormState }) => {\n const formState = await getFormState({\n apiRoute: config.routes.api,\n body: {\n id,\n formState: prevFormState,\n operation: 'update',\n schemaPath: schemaFieldsPath,\n },\n serverURL: config.serverURL,\n })\n\n return {\n ...formState,\n blockName: {\n initialValue: '',\n passesCondition: true,\n valid: true,\n value: formData.blockName,\n },\n }\n },\n\n [config.routes.api, config.serverURL, schemaFieldsPath, id, formData.blockName],\n )\n const { i18n } = useTranslation()\n\n const classNames = [`${baseClass}__row`, `${baseClass}__row--no-errors`].filter(Boolean).join(' ')\n\n const LabelComponent = reducedBlock?.LabelComponent\n\n // Memoized Form JSX\n const formContent = useMemo(() => {\n return reducedBlock && initialState !== false ? (\n <Form\n beforeSubmit={[onChange]}\n // @ts-expect-error TODO: Fix this\n fields={fieldMap}\n initialState={initialState}\n onChange={[onChange]}\n submitted={submitted}\n uuid={uuid()}\n >\n <BlockContent\n baseClass={baseClass}\n field={parentLexicalRichTextField}\n formData={formData}\n formSchema={Array.isArray(fieldMap) ? fieldMap : []}\n nodeKey={nodeKey}\n path={`${path}.lexical_internal_feature.blocks.${formData.blockType}`}\n reducedBlock={reducedBlock}\n schemaPath={schemaFieldsPath}\n />\n </Form>\n ) : (\n <Collapsible\n className={classNames}\n collapsibleStyle=\"default\"\n header={\n LabelComponent ? (\n <LabelComponent blockKind={'lexicalBlock'} formData={formData} />\n ) : (\n <div className={`${baseClass}__block-header`}>\n <div>\n <Pill\n className={`${baseClass}__block-pill ${baseClass}__block-pill-${formData?.blockType}`}\n pillStyle=\"white\"\n >\n {reducedBlock && typeof reducedBlock.labels.singular === 'string'\n ? getTranslation(reducedBlock.labels.singular, i18n)\n : '[Singular Label]'}\n </Pill>\n <SectionTitle path=\"blockName\" readOnly={parentLexicalRichTextField?.readOnly} />\n </div>\n </div>\n )\n }\n key={0}\n >\n <ShimmerEffect height=\"35vh\" />\n </Collapsible>\n )\n }, [\n classNames,\n fieldMap,\n parentLexicalRichTextField,\n nodeKey,\n i18n,\n submitted,\n initialState,\n reducedBlock,\n onChange,\n schemaFieldsPath,\n path,\n ]) // Adding formData to the dependencies here might break it\n return <div className={baseClass + ' ' + baseClass + '-' + formData.blockType}>{formContent}</div>\n}\n", "import type { FormFieldBase } from '@payloadcms/ui'\nimport type { FieldMap } from '@payloadcms/ui/utilities/buildComponentMap'\nimport type { CollapsedPreferences, Data, FormState } from 'payload'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { getTranslation } from '@payloadcms/translations'\nimport {\n Button,\n Collapsible,\n ErrorPill,\n Pill,\n RenderFields,\n SectionTitle,\n useDocumentInfo,\n useFormSubmitted,\n useTranslation,\n} from '@payloadcms/ui'\nimport { dequal } from 'dequal/lite' // lite: no need for Map and Set support\nimport { $getNodeByKey } from 'lexical'\nimport React, { useCallback } from 'react'\n\nimport type { SanitizedClientEditorConfig } from '../../../lexical/config/types.js'\nimport type { ClientBlock } from '../feature.client.js'\nimport type { BlockFields, BlockNode } from '../nodes/BlocksNode.js'\n\nimport { FormSavePlugin } from './FormSavePlugin.js'\n\ntype Props = {\n baseClass: string\n field: {\n editorConfig: SanitizedClientEditorConfig // With rendered features n stuff\n name: string\n richTextComponentMap: Map<string, React.ReactNode>\n } & FormFieldBase\n formData: BlockFields\n formSchema: FieldMap\n nodeKey: string\n path: string\n reducedBlock: ClientBlock\n schemaPath: string\n}\n\n/**\n * The actual content of the Block. This should be INSIDE a Form component,\n * scoped to the block. All format operations in here are thus scoped to the block's form, and\n * not the whole document.\n */\nexport const BlockContent: React.FC<Props> = (props) => {\n const {\n baseClass,\n field,\n formData,\n formSchema,\n nodeKey,\n reducedBlock: { LabelComponent, labels },\n schemaPath,\n } = props\n\n const { i18n } = useTranslation()\n const [editor] = useLexicalComposerContext()\n // Used for saving collapsed to preferences (and gettin' it from there again)\n // Remember, these preferences are scoped to the whole document, not just this form. This\n // is important to consider for the data path used in setDocFieldPreferences\n const { getDocPreferences, setDocFieldPreferences } = useDocumentInfo()\n\n const [isCollapsed, setIsCollapsed] = React.useState<boolean>(() => {\n let initialState = false\n\n void getDocPreferences().then((currentDocPreferences) => {\n const currentFieldPreferences = currentDocPreferences?.fields[field.name]\n\n const collapsedArray = currentFieldPreferences?.collapsed\n\n if (collapsedArray && collapsedArray.includes(formData.id)) {\n initialState = true\n setIsCollapsed(true)\n }\n })\n return initialState\n })\n\n const hasSubmitted = useFormSubmitted()\n\n const [errorCount, setErrorCount] = React.useState(0)\n\n const fieldHasErrors = hasSubmitted && errorCount > 0\n\n const classNames = [\n `${baseClass}__row`,\n fieldHasErrors ? `${baseClass}__row--has-errors` : `${baseClass}__row--no-errors`,\n ]\n .filter(Boolean)\n .join(' ')\n\n const onFormChange = useCallback(\n ({\n fullFieldsWithValues,\n newFormData,\n }: {\n fullFieldsWithValues: FormState\n newFormData: Data\n }) => {\n newFormData = {\n ...newFormData,\n id: formData.id,\n blockType: formData.blockType,\n }\n\n // Recursively remove all undefined values from even being present in formData, as they will\n // cause isDeepEqual to return false if, for example, formData has a key that fields.data\n // does not have, even if it's undefined.\n // Currently, this happens if a block has another sub-blocks field. Inside formData, that sub-blocks field has an undefined blockName property.\n // Inside of fields.data however, that sub-blocks blockName property does not exist at all.\n function removeUndefinedAndNullAndEmptyArraysRecursively(obj: object) {\n for (const key in obj) {\n const value = obj[key]\n if (Array.isArray(value) && !value?.length) {\n delete obj[key]\n } else if (value && typeof value === 'object') {\n removeUndefinedAndNullAndEmptyArraysRecursively(value)\n } else if (value === undefined || value === null) {\n delete obj[key]\n }\n }\n }\n removeUndefinedAndNullAndEmptyArraysRecursively(newFormData)\n\n removeUndefinedAndNullAndEmptyArraysRecursively(formData)\n\n // Only update if the data has actually changed. Otherwise, we may be triggering an unnecessary value change,\n // which would trigger the \"Leave without saving\" dialog unnecessarily\n if (!dequal(formData, newFormData)) {\n // Running this in the next tick in the meantime fixes this issue: https://github.com/payloadcms/payload/issues/4108\n // I don't know why. When this is called immediately, it might focus out of a nested lexical editor field if an update is made there.\n // My hypothesis is that the nested editor might not have fully finished its update cycle yet. By updating in the next tick, we\n // ensure that the nested editor has finished its update cycle before we update the block node.\n setTimeout(() => {\n editor.update(() => {\n const node: BlockNode = $getNodeByKey(nodeKey)\n if (node) {\n node.setFields(newFormData as BlockFields)\n }\n })\n }, 0)\n }\n\n // update error count\n if (hasSubmitted) {\n let rowErrorCount = 0\n for (const formField of Object.values(fullFieldsWithValues)) {\n if (formField?.valid === false) {\n rowErrorCount++\n }\n }\n setErrorCount(rowErrorCount)\n }\n },\n [editor, nodeKey, hasSubmitted, formData],\n )\n\n const onCollapsedChange = useCallback(\n (changedCollapsed: boolean) => {\n void getDocPreferences().then((currentDocPreferences) => {\n const currentFieldPreferences = currentDocPreferences?.fields[field.name]\n\n const collapsedArray = currentFieldPreferences?.collapsed\n\n const newCollapsed: CollapsedPreferences =\n collapsedArray && collapsedArray?.length ? collapsedArray : []\n\n if (changedCollapsed) {\n if (!newCollapsed.includes(formData.id)) {\n newCollapsed.push(formData.id)\n }\n } else {\n if (newCollapsed.includes(formData.id)) {\n newCollapsed.splice(newCollapsed.indexOf(formData.id), 1)\n }\n }\n\n setDocFieldPreferences(field.name, {\n collapsed: newCollapsed,\n hello: 'hi',\n })\n })\n },\n [getDocPreferences, field.name, setDocFieldPreferences, formData.id],\n )\n\n const removeBlock = useCallback(() => {\n editor.update(() => {\n $getNodeByKey(nodeKey).remove()\n })\n }, [editor, nodeKey])\n\n return (\n <React.Fragment>\n <Collapsible\n className={classNames}\n collapsibleStyle={fieldHasErrors ? 'error' : 'default'}\n header={\n LabelComponent ? (\n <LabelComponent blockKind={'lexicalBlock'} formData={formData} />\n ) : (\n <div className={`${baseClass}__block-header`}>\n <div>\n <Pill\n className={`${baseClass}__block-pill ${baseClass}__block-pill-${formData?.blockType}`}\n pillStyle=\"white\"\n >\n {typeof labels.singular === 'string'\n ? getTranslation(labels.singular, i18n)\n : '[Singular Label]'}\n </Pill>\n <SectionTitle path=\"blockName\" readOnly={field?.readOnly} />\n {fieldHasErrors && <ErrorPill count={errorCount} i18n={i18n} withMessage />}\n </div>\n {editor.isEditable() && (\n <Button\n buttonStyle=\"icon-label\"\n className={`${baseClass}__removeButton`}\n disabled={field?.readOnly}\n icon=\"x\"\n onClick={(e) => {\n e.preventDefault()\n removeBlock()\n }}\n round\n tooltip=\"Remove Block\"\n />\n )}\n </div>\n )\n }\n isCollapsed={isCollapsed}\n key={0}\n onToggle={(incomingCollapsedState) => {\n onCollapsedChange(incomingCollapsedState)\n setIsCollapsed(incomingCollapsedState)\n }}\n >\n <RenderFields\n className={`${baseClass}__fields`}\n fieldMap={Array.isArray(formSchema) ? formSchema : []}\n forceRender\n margins=\"small\"\n path=\"\" // Leaving path empty makes it so field values are not prefixed / scoped by the entire schemaPath. e.g. we can access \"myField\" instead of \"someLexicalField.feature.blocks.someArrayB\" // TODO: Could there be any implications leaving path different than schemaPath?\n readOnly={false}\n schemaPath={schemaPath} // Having the correct schemaPath here allows sub-fields (like array > addRow) to run correct form-state calls and retrieve their needed form state from the server\n />\n </Collapsible>\n\n <FormSavePlugin onChange={onFormChange} />\n </React.Fragment>\n )\n}\n", "import type { Data, FormState } from 'payload'\nimport type React from 'react'\n\nimport { useAllFormFields } from '@payloadcms/ui'\nimport { reduceFieldsToValues } from 'payload/shared'\nimport { useEffect } from 'react'\n\nimport { removeEmptyArrayValues } from './removeEmptyArrayValues.js'\n\ntype Props = {\n onChange?: ({\n fullFieldsWithValues,\n newFormData,\n }: {\n fullFieldsWithValues: FormState\n newFormData: Data\n }) => void\n}\n\nexport const FormSavePlugin: React.FC<Props> = (props) => {\n const { onChange } = props\n\n const [_fields] = useAllFormFields()\n\n const fields = removeEmptyArrayValues({ fields: _fields })\n\n // Pass in fields, and indicate if you'd like to \"unflatten\" field data.\n // The result below will reflect the data stored in the form at the given time\n const newFormData = reduceFieldsToValues(fields, true)\n\n useEffect(() => {\n if (onChange) {\n onChange({ fullFieldsWithValues: fields, newFormData })\n }\n }, [newFormData, onChange, fields])\n\n return null\n}\n", "import type { FormState } from 'payload'\n\n/**\n * By default, if an array field is empty, it will be included in the form state with a value of 0.\n * We do not need this behavior here, By setting `disableFormData` to true, we can prevent the field from being included in the form state\n * like that.\n * @param fields form state\n */\nexport function removeEmptyArrayValues({ fields }: { fields: FormState }): FormState {\n for (const key in fields) {\n const field = fields[key]\n if (Array.isArray(field.rows) && 'value' in field) {\n field.disableFormData = true\n }\n }\n return fields\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["Collapsible", "Form", "Pill", "SectionTitle", "ShimmerEffect", "useConfig", "useDocumentInfo", "useFieldProps", "useFormSubmitted", "useTranslation", "useCallback", "useEffect", "useMemo", "useState", "getTranslation", "getFormState", "uuid", "useLexicalComposerContext", "getTranslation", "Button", "Collapsible", "ErrorPill", "Pill", "RenderFields", "SectionTitle", "useDocumentInfo", "useFormSubmitted", "useTranslation", "dequal", "$getNodeByKey", "React", "useCallback", "useAllFormFields", "reduceFieldsToValues", "useEffect", "removeEmptyArrayValues", "fields", "key", "field", "FormSavePlugin", "props", "onChange", "_fields", "useAllFormFields", "fields", "removeEmptyArrayValues", "newFormData", "reduceFieldsToValues", "useEffect", "jsx", "jsxs", "BlockContent", "props", "baseClass", "field", "formData", "formSchema", "nodeKey", "LabelComponent", "labels", "schemaPath", "i18n", "useTranslation", "editor", "useLexicalComposerContext", "getDocPreferences", "setDocFieldPreferences", "useDocumentInfo", "isCollapsed", "setIsCollapsed", "React", "initialState", "currentDocPreferences", "collapsedArray", "hasSubmitted", "useFormSubmitted", "errorCount", "setErrorCount", "fieldHasErrors", "classNames", "onFormChange", "useCallback", "fullFieldsWithValues", "newFormData", "removeUndefinedAndNullAndEmptyArraysRecursively", "obj", "key", "value", "dequal", "node", "$getNodeByKey", "rowErrorCount", "formField", "onCollapsedChange", "changedCollapsed", "newCollapsed", "removeBlock", "Collapsible", "Pill", "getTranslation", "SectionTitle", "ErrorPill", "Button", "e", "incomingCollapsedState", "RenderFields", "FormSavePlugin", "jsx", "jsxs", "baseClass", "BlockComponent", "props", "formData", "nodeKey", "config", "useConfig", "submitted", "useFormSubmitted", "id", "useDocumentInfo", "path", "schemaPath", "useFieldProps", "editorConfig", "parentLexicalRichTextField", "useEditorConfigContext", "initialState", "setInitialState", "useState", "richTextComponentMap", "componentMapRenderedFieldsPath", "schemaFieldsPath", "reducedBlock", "block", "fieldMap", "useEffect", "state", "getFormState", "onChange", "useCallback", "prevFormState", "i18n", "useTranslation", "classNames", "LabelComponent", "formContent", "useMemo", "Form", "uuid", "BlockContent", "Collapsible", "Pill", "getTranslation", "SectionTitle", "ShimmerEffect"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use client";import{c as N,f as E}from"./chunk-JELGBZLY.js";import{b as y}from"./chunk-QZIAQPM7.js";import{useCallback as p,useEffect as P,useRef as R}from"react";import{useLexicalComposerContext as S}from"@lexical/react/LexicalComposerContext";import{useLexicalNodeSelection as $}from"@lexical/react/useLexicalNodeSelection";import{mergeRegister as x}from"@lexical/utils";import{getTranslation as _}from"@payloadcms/translations";import{Button as D,useTranslation as A}from"@payloadcms/ui";import{$getNodeByKey as M,$getSelection as F,$isNodeSelection as T,CLICK_COMMAND as j,COMMAND_PRIORITY_LOW as f,KEY_BACKSPACE_COMMAND as z,KEY_DELETE_COMMAND as Y}from"lexical";import{jsx as c,jsxs as I}from"react/jsx-runtime";var i="inline-block",Z=K=>{let{formData:r,nodeKey:o}=K,[e]=S(),{i18n:C,t:k}=A(),{editorConfig:O,field:b}=y(),m=R(null),[t,a,d]=$(o),s=O?.resolvedFeatureMap?.get("blocks")?.sanitizedClientFeatureProps?.reducedInlineBlocks?.find(l=>l.slug===r?.blockType),L=p(()=>{e.update(()=>{M(o).remove()})},[e,o]),u=p(l=>{if(t&&T(F())){l.preventDefault();let n=M(o);if(E(n))return n.remove(),!0}return!1},[t,o]),B=p(l=>{let n=l;return n.target===m.current||m.current?.contains(n.target)?(n.shiftKey?a(!t):t||(d(),a(!0)),!0):!1},[t,a,d]);P(()=>x(e.registerCommand(j,B,f),e.registerCommand(Y,u,f),e.registerCommand(z,u,f)),[d,e,t,o,u,a,B]);let g=s?.LabelComponent,v=s.labels.singular?_(s.labels.singular,C):s.slug;return I("div",{className:[i,i+"-"+r.blockType,t&&`${i}--selected`].filter(Boolean).join(" "),ref:m,children:[g?c(g,{blockKind:"lexicalInlineBlock",formData:r}):c("div",{children:_(s.labels.singular,C)}),e.isEditable()&&I("div",{className:`${i}__actions`,children:[c(D,{buttonStyle:"icon-label",className:`${i}__editButton`,disabled:b?.readOnly,el:"div",icon:"edit",onClick:()=>{e.dispatchCommand(N,{fields:r,nodeKey:o})},round:!0,size:"small",tooltip:k("lexical:blocks:inlineBlocks:edit",{label:v})}),c(D,{buttonStyle:"icon-label",className:`${i}__removeButton`,disabled:b?.readOnly,icon:"x",onClick:l=>{l.preventDefault(),L()},round:!0,size:"small",tooltip:k("lexical:blocks:inlineBlocks:remove",{label:v})})]})]})};export{Z as InlineBlockComponent};
|
|
2
|
+
//# sourceMappingURL=componentInline-FQNXWTOE.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/features/blocks/componentInline/index.tsx"],
|
|
4
|
+
"sourcesContent": ["'use client'\n\nimport React, { useCallback, useEffect, useRef } from 'react'\nconst baseClass = 'inline-block'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'\nimport { useLexicalNodeSelection } from '@lexical/react/useLexicalNodeSelection'\nimport { mergeRegister } from '@lexical/utils'\nimport { getTranslation } from '@payloadcms/translations'\nimport { Button, useTranslation } from '@payloadcms/ui'\nimport {\n $getNodeByKey,\n $getSelection,\n $isNodeSelection,\n CLICK_COMMAND,\n COMMAND_PRIORITY_LOW,\n KEY_BACKSPACE_COMMAND,\n KEY_DELETE_COMMAND,\n} from 'lexical'\n\nimport type { ClientComponentProps } from '../../typesClient.js'\nimport type { BlocksFeatureClientProps, ClientBlock } from '../feature.client.js'\nimport type { InlineBlockFields } from '../nodes/InlineBlocksNode.js'\n\nimport { useEditorConfigContext } from '../../../lexical/config/client/EditorConfigProvider.js'\nimport { $isInlineBlockNode } from '../nodes/InlineBlocksNode.js'\nimport { OPEN_INLINE_BLOCK_DRAWER_COMMAND } from '../plugin/commands.js'\ntype Props = {\n readonly formData: InlineBlockFields\n readonly nodeKey?: string\n}\n\nexport const InlineBlockComponent: React.FC<Props> = (props) => {\n const { formData, nodeKey } = props\n const [editor] = useLexicalComposerContext()\n const { i18n, t } = useTranslation<object, string>()\n const { editorConfig, field } = useEditorConfigContext()\n const inlineBlockElemElemRef = useRef<HTMLDivElement | null>(null)\n const [isSelected, setSelected, clearSelection] = useLexicalNodeSelection(nodeKey)\n\n const reducedBlock: ClientBlock = (\n editorConfig?.resolvedFeatureMap?.get('blocks')\n ?.sanitizedClientFeatureProps as ClientComponentProps<BlocksFeatureClientProps>\n )?.reducedInlineBlocks?.find((block) => block.slug === formData?.blockType)\n\n const removeInlineBlock = useCallback(() => {\n editor.update(() => {\n $getNodeByKey(nodeKey).remove()\n })\n }, [editor, nodeKey])\n\n const $onDelete = useCallback(\n (event: KeyboardEvent) => {\n if (isSelected && $isNodeSelection($getSelection())) {\n event.preventDefault()\n const node = $getNodeByKey(nodeKey)\n if ($isInlineBlockNode(node)) {\n node.remove()\n return true\n }\n }\n return false\n },\n [isSelected, nodeKey],\n )\n const onClick = useCallback(\n (payload: MouseEvent) => {\n const event = payload\n // Check if inlineBlockElemElemRef.target or anything WITHIN inlineBlockElemElemRef.target was clicked\n if (\n event.target === inlineBlockElemElemRef.current ||\n inlineBlockElemElemRef.current?.contains(event.target as Node)\n ) {\n if (event.shiftKey) {\n setSelected(!isSelected)\n } else {\n if (!isSelected) {\n clearSelection()\n setSelected(true)\n }\n }\n return true\n }\n\n return false\n },\n [isSelected, setSelected, clearSelection],\n )\n\n useEffect(() => {\n return mergeRegister(\n editor.registerCommand<MouseEvent>(CLICK_COMMAND, onClick, COMMAND_PRIORITY_LOW),\n\n editor.registerCommand(KEY_DELETE_COMMAND, $onDelete, COMMAND_PRIORITY_LOW),\n editor.registerCommand(KEY_BACKSPACE_COMMAND, $onDelete, COMMAND_PRIORITY_LOW),\n )\n }, [clearSelection, editor, isSelected, nodeKey, $onDelete, setSelected, onClick])\n\n const LabelComponent = reducedBlock?.LabelComponent\n\n const blockDisplayName = reducedBlock.labels.singular\n ? getTranslation(reducedBlock.labels.singular, i18n)\n : reducedBlock.slug\n\n return (\n <div\n className={[\n baseClass,\n baseClass + '-' + formData.blockType,\n isSelected && `${baseClass}--selected`,\n ]\n .filter(Boolean)\n .join(' ')}\n ref={inlineBlockElemElemRef}\n >\n {LabelComponent ? (\n <LabelComponent blockKind={'lexicalInlineBlock'} formData={formData} />\n ) : (\n <div>{getTranslation(reducedBlock.labels.singular, i18n)}</div>\n )}\n {editor.isEditable() && (\n <div className={`${baseClass}__actions`}>\n <Button\n buttonStyle=\"icon-label\"\n className={`${baseClass}__editButton`}\n disabled={field?.readOnly}\n el=\"div\"\n icon=\"edit\"\n onClick={() => {\n editor.dispatchCommand(OPEN_INLINE_BLOCK_DRAWER_COMMAND, {\n fields: formData,\n nodeKey,\n })\n }}\n round\n size=\"small\"\n tooltip={t('lexical:blocks:inlineBlocks:edit', { label: blockDisplayName })}\n />\n <Button\n buttonStyle=\"icon-label\"\n className={`${baseClass}__removeButton`}\n disabled={field?.readOnly}\n icon=\"x\"\n onClick={(e) => {\n e.preventDefault()\n removeInlineBlock()\n }}\n round\n size=\"small\"\n tooltip={t('lexical:blocks:inlineBlocks:remove', { label: blockDisplayName })}\n />\n </div>\n )}\n </div>\n )\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["useCallback", "useEffect", "useRef", "useLexicalComposerContext", "useLexicalNodeSelection", "mergeRegister", "getTranslation", "Button", "useTranslation", "$getNodeByKey", "$getSelection", "$isNodeSelection", "CLICK_COMMAND", "COMMAND_PRIORITY_LOW", "KEY_BACKSPACE_COMMAND", "KEY_DELETE_COMMAND", "jsx", "jsxs", "baseClass", "InlineBlockComponent", "props", "formData", "nodeKey", "editor", "useLexicalComposerContext", "i18n", "t", "useTranslation", "editorConfig", "field", "useEditorConfigContext", "inlineBlockElemElemRef", "useRef", "isSelected", "setSelected", "clearSelection", "useLexicalNodeSelection", "reducedBlock", "block", "removeInlineBlock", "useCallback", "$getNodeByKey", "$onDelete", "event", "$isNodeSelection", "$getSelection", "node", "$isInlineBlockNode", "onClick", "payload", "useEffect", "mergeRegister", "CLICK_COMMAND", "COMMAND_PRIORITY_LOW", "KEY_DELETE_COMMAND", "KEY_BACKSPACE_COMMAND", "LabelComponent", "blockDisplayName", "getTranslation", "Button", "OPEN_INLINE_BLOCK_DRAWER_COMMAND", "e"]
|
|
7
|
+
}
|