@wordpress/editor
Version:
Enhanced block editor for WordPress posts.
8 lines (7 loc) • 5.05 kB
Source Map (JSON)
{
"version": 3,
"sources": ["../../../src/components/collab-sidebar/board-store.js"],
"sourcesContent": ["import { getNoteMarkerSelector, getSelectionRect } from './utils';\n\nexport function createBoardStore() {\n\tconst listeners = new Set();\n\tconst blockRefs = new Map();\n\tconst floatingRefs = new Map();\n\tconst idByElement = new WeakMap();\n\tconst heights = {};\n\tlet snapshot = {};\n\n\tfunction emit() {\n\t\tsnapshot = { ...heights };\n\t\tfor ( const listener of listeners ) {\n\t\t\tlistener();\n\t\t}\n\t}\n\n\tconst observer = new window.ResizeObserver( ( entries ) => {\n\t\tlet changed = false;\n\t\tfor ( const entry of entries ) {\n\t\t\tconst id = idByElement.get( entry.target );\n\t\t\tconst newHeight = entry.borderBoxSize[ 0 ].blockSize;\n\t\t\tif ( heights[ id ] !== newHeight ) {\n\t\t\t\theights[ id ] = newHeight;\n\t\t\t\tchanged = true;\n\t\t\t}\n\t\t}\n\t\tif ( changed ) {\n\t\t\temit();\n\t\t}\n\t} );\n\n\treturn {\n\t\tsubscribe( listener ) {\n\t\t\tlisteners.add( listener );\n\t\t\treturn () => {\n\t\t\t\tlisteners.delete( listener );\n\t\t\t\tif ( listeners.size === 0 ) {\n\t\t\t\t\tobserver.disconnect();\n\t\t\t\t}\n\t\t\t};\n\t\t},\n\n\t\tgetSnapshot() {\n\t\t\treturn snapshot;\n\t\t},\n\n\t\tregisterThread( id, blockEl, floatingEl ) {\n\t\t\tblockRefs.set( id, blockEl );\n\t\t\tconst prev = floatingRefs.get( id );\n\t\t\tif ( prev && prev !== floatingEl ) {\n\t\t\t\tobserver.unobserve( prev );\n\t\t\t\tidByElement.delete( prev );\n\t\t\t}\n\t\t\tif ( floatingEl ) {\n\t\t\t\tfloatingRefs.set( id, floatingEl );\n\t\t\t\tidByElement.set( floatingEl, id );\n\t\t\t\tobserver.observe( floatingEl );\n\t\t\t}\n\t\t\temit();\n\t\t},\n\n\t\tunregisterThread( id ) {\n\t\t\tblockRefs.delete( id );\n\t\t\tconst prev = floatingRefs.get( id );\n\t\t\tif ( prev ) {\n\t\t\t\tobserver.unobserve( prev );\n\t\t\t\tidByElement.delete( prev );\n\t\t\t\tfloatingRefs.delete( id );\n\t\t\t}\n\t\t\tdelete heights[ id ];\n\t\t},\n\n\t\tgetAnchorRects() {\n\t\t\t// Batch all rect reads before any writes to avoid layout thrashing.\n\t\t\treturn Object.fromEntries(\n\t\t\t\tArray.from( blockRefs ).flatMap( ( [ id, el ] ) => {\n\t\t\t\t\tif ( ! el ) {\n\t\t\t\t\t\treturn [];\n\t\t\t\t\t}\n\t\t\t\t\t// A pending new note has no in-content marker yet, so\n\t\t\t\t\t// anchor its form to the text selection it will attach\n\t\t\t\t\t// to; without a selection it stays on the block.\n\t\t\t\t\tif ( id === 'new' ) {\n\t\t\t\t\t\tconst rect =\n\t\t\t\t\t\t\tgetSelectionRect( el ) ??\n\t\t\t\t\t\t\tel.getBoundingClientRect();\n\t\t\t\t\t\treturn [ [ id, rect ] ];\n\t\t\t\t\t}\n\t\t\t\t\t// An inline note anchors to its in-content marker so the\n\t\t\t\t\t// thread aligns with the noted text rather than the block.\n\t\t\t\t\t// Resolved at read time because rich-text re-renders\n\t\t\t\t\t// replace the marker element. A marker split into several\n\t\t\t\t\t// runs (crossing overlaps) resolves to its first run.\n\t\t\t\t\tconst anchor =\n\t\t\t\t\t\tel.querySelector( getNoteMarkerSelector( id ) ) ?? el;\n\t\t\t\t\treturn [ [ id, anchor.getBoundingClientRect() ] ];\n\t\t\t\t} )\n\t\t\t);\n\t\t},\n\n\t\tgetFirstBlockElement() {\n\t\t\treturn blockRefs.values().next().value ?? null;\n\t\t},\n\t};\n}\n"],
"mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAwD;AAEjD,SAAS,mBAAmB;AAClC,QAAM,YAAY,oBAAI,IAAI;AAC1B,QAAM,YAAY,oBAAI,IAAI;AAC1B,QAAM,eAAe,oBAAI,IAAI;AAC7B,QAAM,cAAc,oBAAI,QAAQ;AAChC,QAAM,UAAU,CAAC;AACjB,MAAI,WAAW,CAAC;AAEhB,WAAS,OAAO;AACf,eAAW,EAAE,GAAG,QAAQ;AACxB,eAAY,YAAY,WAAY;AACnC,eAAS;AAAA,IACV;AAAA,EACD;AAEA,QAAM,WAAW,IAAI,OAAO,eAAgB,CAAE,YAAa;AAC1D,QAAI,UAAU;AACd,eAAY,SAAS,SAAU;AAC9B,YAAM,KAAK,YAAY,IAAK,MAAM,MAAO;AACzC,YAAM,YAAY,MAAM,cAAe,CAAE,EAAE;AAC3C,UAAK,QAAS,EAAG,MAAM,WAAY;AAClC,gBAAS,EAAG,IAAI;AAChB,kBAAU;AAAA,MACX;AAAA,IACD;AACA,QAAK,SAAU;AACd,WAAK;AAAA,IACN;AAAA,EACD,CAAE;AAEF,SAAO;AAAA,IACN,UAAW,UAAW;AACrB,gBAAU,IAAK,QAAS;AACxB,aAAO,MAAM;AACZ,kBAAU,OAAQ,QAAS;AAC3B,YAAK,UAAU,SAAS,GAAI;AAC3B,mBAAS,WAAW;AAAA,QACrB;AAAA,MACD;AAAA,IACD;AAAA,IAEA,cAAc;AACb,aAAO;AAAA,IACR;AAAA,IAEA,eAAgB,IAAI,SAAS,YAAa;AACzC,gBAAU,IAAK,IAAI,OAAQ;AAC3B,YAAM,OAAO,aAAa,IAAK,EAAG;AAClC,UAAK,QAAQ,SAAS,YAAa;AAClC,iBAAS,UAAW,IAAK;AACzB,oBAAY,OAAQ,IAAK;AAAA,MAC1B;AACA,UAAK,YAAa;AACjB,qBAAa,IAAK,IAAI,UAAW;AACjC,oBAAY,IAAK,YAAY,EAAG;AAChC,iBAAS,QAAS,UAAW;AAAA,MAC9B;AACA,WAAK;AAAA,IACN;AAAA,IAEA,iBAAkB,IAAK;AACtB,gBAAU,OAAQ,EAAG;AACrB,YAAM,OAAO,aAAa,IAAK,EAAG;AAClC,UAAK,MAAO;AACX,iBAAS,UAAW,IAAK;AACzB,oBAAY,OAAQ,IAAK;AACzB,qBAAa,OAAQ,EAAG;AAAA,MACzB;AACA,aAAO,QAAS,EAAG;AAAA,IACpB;AAAA,IAEA,iBAAiB;AAEhB,aAAO,OAAO;AAAA,QACb,MAAM,KAAM,SAAU,EAAE,QAAS,CAAE,CAAE,IAAI,EAAG,MAAO;AAClD,cAAK,CAAE,IAAK;AACX,mBAAO,CAAC;AAAA,UACT;AAIA,cAAK,OAAO,OAAQ;AACnB,kBAAM,WACL,+BAAkB,EAAG,KACrB,GAAG,sBAAsB;AAC1B,mBAAO,CAAE,CAAE,IAAI,IAAK,CAAE;AAAA,UACvB;AAMA,gBAAM,SACL,GAAG,kBAAe,oCAAuB,EAAG,CAAE,KAAK;AACpD,iBAAO,CAAE,CAAE,IAAI,OAAO,sBAAsB,CAAE,CAAE;AAAA,QACjD,CAAE;AAAA,MACH;AAAA,IACD;AAAA,IAEA,uBAAuB;AACtB,aAAO,UAAU,OAAO,EAAE,KAAK,EAAE,SAAS;AAAA,IAC3C;AAAA,EACD;AACD;",
"names": []
}