@docx-editor.dev/pro 2.1.0 → 2.1.2
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/chunk-A7NTVTWG.cjs +1 -0
- package/dist/chunk-PWNAGXXX.js +1 -0
- package/dist/{define-custom-node-BTTX66B3.d.cts → define-custom-node-RznSCnPr.d.cts} +11 -0
- package/dist/{define-custom-node-BTTX66B3.d.ts → define-custom-node-RznSCnPr.d.ts} +11 -0
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +1 -1
- package/dist/react/index.cjs +2 -2
- package/dist/react/index.d.cts +38 -10
- package/dist/react/index.d.ts +38 -10
- package/dist/react/index.js +2 -2
- package/package.json +1 -1
- package/dist/chunk-FVI3MGO7.js +0 -1
- package/dist/chunk-MNK6DXJQ.cjs +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
'use strict';var store=require('@docx-editor.dev/core/store'),layout=require('@docx-editor.dev/core/layout');function g(e){}var Oe=64,H=new Set(["__proto__","constructor","prototype"]);function h(e,t,o){let n=new URLSearchParams;for(let[s,d]of Object.entries(o))n.set(s,d);let r=n.toString(),a=r.length>0?`${e}:${t}?${r}`:`${e}:${t}`;return a.length>64?{ok:false,reason:"tag-overflow",length:a.length}:{ok:true,tag:a}}function N(e){if(e.length>64)return null;let t=e.indexOf(":");if(t<=0)return null;let o=e.slice(0,t),n=e.slice(t+1),r=n.indexOf("?"),a=r===-1?n:n.slice(0,r);if(a.length===0)return null;let s=Object.create(null);if(r!==-1)for(let[d,i]of new URLSearchParams(n.slice(r+1))){if(H.has(d))return null;s[d]=i;}return {prefix:o,name:a,attrs:s}}var Ie=262144;function x(e,t){if(t.length===0)return {ok:false,reason:"malformed",issues:["the node carries no payload"]};if(t.length>262144)return {ok:false,reason:"malformed",issues:[`the payload is ${String(t.length)} characters; the cap is ${String(262144)}`]};let o;try{o=JSON.parse(t);}catch(a){return {ok:false,reason:"malformed",issues:[a instanceof Error?a.message:"the payload is not JSON"]}}let n=I(o);if(!e)return {ok:true,value:n};let r=e["~standard"].validate(n);return B(r)?{ok:false,reason:"async",issues:["the schema validates asynchronously, which the read path cannot await"]}:r.issues?{ok:false,reason:"invalid",issues:r.issues.map(q)}:{ok:true,value:r.value}}function R(e){let t;try{t=JSON.stringify(e)??"";}catch(o){return {ok:false,reason:"malformed",issues:[o instanceof Error?o.message:"the value cannot be serialized"]}}return t.length===0?{ok:false,reason:"malformed",issues:["the value serializes to nothing"]}:t.length>262144?{ok:false,reason:"malformed",issues:[`the payload is ${String(t.length)} characters; the cap is ${String(262144)}`]}:{ok:true,value:t}}function B(e){return typeof e.then=="function"}function q(e){let t=(e.path??[]).map(o=>String(typeof o=="object"?o.key:o)).join(".");return t.length>0?`${t}: ${e.message}`:e.message}var Y=new Set(["__proto__","constructor","prototype"]);function I(e){if(Array.isArray(e))return e.map(I);if(e===null||typeof e!="object")return e;let t=Object.create(null);for(let[o,n]of Object.entries(e))Y.has(o)||(t[o]=I(n));return t}function _(e){let t=(e.path??[]).map(o=>{let n=typeof o=="object"?o.key:o;return typeof n=="number"?n:String(n)});return {message:e.message,path:t,pointer:t.join(".")}}function S(e,t){return {ok:false,code:"invalidArgs",reason:e,issues:t}}var b="docxEditor";function v(e){return e.payloadNamespace??`urn:docx-editor.dev:custom-node:${e.tagPrefix}`}function M(e,t,o){let n=0;for(let r of store.customNodePayloadsOf(e,t,o).keys()){let a=/^cx(\d{1,9})$/.exec(r);if(!a)continue;let s=Number(a[1]);s>n&&(n=s);}return `cx${String(n+1)}`}function L(e,t){let o=R(t);if(!o.ok)return {ok:false,reason:`the payload cannot be serialized: ${o.issues.join(", ")}`,issues:[]};if(!e.schema)return {ok:true,data:o.value,value:t};let r=e.schema["~standard"].validate(JSON.parse(o.value));if(Q(r))return {ok:false,reason:`${e.name}'s schema validates asynchronously, which a write cannot await`,issues:[]};if(r.issues){let s=r.issues.map(_);return {ok:false,reason:`the payload does not match ${e.name}'s schema: `+s.map(d=>(d.pointer?`${d.pointer}: `:"")+d.message).join(", "),issues:s}}let a=R(r.value);return a.ok?{ok:true,data:a.value,value:r.value}:{ok:false,reason:`the payload cannot be serialized: ${a.issues.join(", ")}`,issues:[]}}function Q(e){return typeof e.then=="function"}function z(e){return typeof e=="object"&&e!==null&&typeof e.name=="string"&&typeof e.tagPrefix=="string"}var V=/^[A-Za-z0-9_.-]+$/,te=/['"<>&]|[\u0000-\u0008\u000B\u000C\u000E-\u001F\u007F]/;function oe(e){return e.length>0&&!te.test(e)}function Ve(e){if(!V.test(e.name??""))throw new Error(`defineCustomNode: invalid name ${JSON.stringify(e.name)}`);if(!V.test(e.tagPrefix??""))throw new Error(`defineCustomNode: invalid tagPrefix ${JSON.stringify(e.tagPrefix)}`);let t=e.schema;if(t!==void 0&&typeof t?.["~standard"]?.validate!="function")throw new Error(`defineCustomNode: ${JSON.stringify(e.name)} has a schema that does not implement Standard Schema`);if(e.payloadNamespace!==void 0&&!oe(e.payloadNamespace))throw new Error(`defineCustomNode: ${JSON.stringify(e.name)} has a payloadNamespace that cannot be written into an XPath \u2014 no quotes, angle brackets, ampersands or control characters: ${JSON.stringify(e.payloadNamespace)}`);if(e.preserveOnExport!==void 0&&e.preserveOnExport!==true&&e.preserveOnExport!==false&&e.preserveOnExport!=="text")throw new Error(`defineCustomNode: ${JSON.stringify(e.name)} has an unknown preserveOnExport ${JSON.stringify(e.preserveOnExport)}`);return Object.freeze({...e,dataOf:n=>{if(!n||n.data===void 0||n.name!==void 0&&n.name!==e.name)return;if(!e.schema)return n.data;let r=e.schema["~standard"].validate(n.data);if(typeof r.then=="function")return;let a=r;return a.issues?void 0:a.value}})}function ze(e){g(e.licenseKey);let t=new Set;for(let o of e.nodes){let n=`${o.tagPrefix}:${o.name}`;if(t.has(n))throw new Error(`customNodesModule: two definitions claim ${JSON.stringify(n)}`);t.add(n);}return {id:"custom-nodes",customNodes:e.nodes,...e.onDiagnostic?{onCustomNodeDiagnostic:o=>{e.onDiagnostic?.(o);}}:{},customNodePayloadNamespaces:[...new Set(e.nodes.map(v))]}}function ne(e){for(let t of e.children)if(!(t.kind==="textValue"||t.localName!=="sdtPr")){for(let o of t.children)if(!(o.kind==="textValue"||o.localName!=="tag")){for(let n of o.attributes)if(n.localName==="val")return n.value}}}function j(e){if(e.kind==="textValue")return e.value;let t="";for(let o of e.children)t+=j(o);return t}function W(e,t,o={}){if(t.length===0)return [];let n=new Map;for(let s of t){let d=`${s.tagPrefix}:${s.name}`;if(n.has(d))throw new Error(`recognizeCustomNodes: duplicate definition for ${JSON.stringify(d)}`);n.set(d,s);}let r=[],a=(s,d)=>{if(!(s.kind==="textValue"||d>64)){if(s.kind==="contentControl"){let i=ne(s),u=i!==void 0?N(i):null,c=u?n.get(`${u.prefix}:${u.name}`):void 0;if(u&&c&&i!==void 0){let l=j(s),f=re(c,s.id,o.payloads?.get(s.id),store.contentControlPropertiesOf(s).dataBinding!==void 0,o.onDiagnostic),m=c.fromDocx?c.fromDocx({attrs:u.attrs,text:l,...f.present?{data:f.value}:{}}):u.attrs;if(m!==null){r.push({name:c.name,attrs:m,text:l,nodeId:s.id,tag:i,...f.present?{data:f.value}:{}});return}}}for(let i of s.children)a(i,d+1);}};return a(e.root,0),r}function re(e,t,o,n,r){if(!o)return n&&r?.({code:"payload-missing",name:e.name,nodeId:t,issues:["the control binds a store node this document does not hold"]}),{present:false};let a=x(e.schema,o.data);return a.ok?{present:true,value:a.value}:(r?.({code:"payload-invalid",name:e.name,nodeId:t,issues:a.issues}),{present:false})}function K(e,t){let o=store.findNode(e,t);return !o||o.kind!=="paragraph"?[]:store.revisionItemsOf({id:e.id,name:e.name,contentType:e.contentType,root:o})}function ce(e,t,o,n){if(t.length===0)return [];let r=W(e,t,{...o===void 0?{}:{payloads:o},...n===void 0?{}:{onDiagnostic:n}});if(r.length===0)return [];let a=store.locateSites(e),s=[];for(let d of r){let i=t.find(l=>l.name===d.name&&d.tag.startsWith(`${l.tagPrefix}:`));if(!i)continue;let u=i.reviewCard?i.reviewCard({attrs:d.attrs,text:d.text,...d.data===void 0?{}:{data:d.data}}):null;if(i.reviewCard&&u===null)continue;let c=a.get(d.nodeId);s.push({kind:"custom",id:d.nodeId,name:d.name,tag:d.tag,attrs:d.attrs,text:d.text,...d.data===void 0?{}:{data:d.data},carded:i.reviewCard!==void 0&&u!==null,title:u?.title??"",...u?.detail!==void 0?{detail:u.detail}:{},...u?.icon!==void 0?{icon:u.icon}:{},range:c?{partName:e.name,start:{paragraphId:c.paragraphId,offset:c.start},end:{paragraphId:c.paragraphId,offset:c.end}}:null});}return s}function U(e){let t=store.collectReviewItems(e),o=(e.customNodes??[]).filter(z);if(o.length===0)return t;let n=[e.storyPart],r=new Set([e.storyPart.name]);for(let i of e.furnitureParts??[])r.has(i.name)||(r.add(i.name),n.push(i));let a=[],s=new Map;for(let i of n){a.push(...ce(i,o,i.name===e.storyPart.name?e.customNodePayloads:void 0,e.reportCustomNodeDiagnostic));let u=s.size;for(let[c,l]of store.paragraphOrderOfPart(i))s.has(c)||s.set(c,u+l);}return a.length===0?t:[...t,...a].sort((i,u)=>layout.reviewItemPositionRank(i,s)-layout.reviewItemPositionRank(u,s))}function ot(e={}){return g(e.licenseKey),{id:"review",review:{displayModes:["all-markup","proposed","original"],collectReviewItems:U,revisionItemsOfParagraph:K}}}function G(e){return e.surface??null}function E(e,t){if(t==null)return null;let o=L(e,t);return o.ok?{ok:true,serialized:o.data,value:o.value}:{ok:false,reason:o.reason,issues:o.issues}}function D(e,t,o,n,r){let a=v(t),s=e.session.part().name;return {namespaceUri:a,rootLocalName:b,nodeId:r??M(e.session.currentPackage(),s,a),label:n,data:o}}function k(e){let t=e.detail?`${e.reason}: ${e.detail}`:e.reason;return {ok:false,code:me.has(e.reason)?"invalidArgs":"unsupported",reason:t}}var me=new Set(["payload-too-large","unaddressable-payload","store-not-authored","offset-out-of-range","invalid-range","invalid-property-value","splits-surrogate-pair"]);function A(e,t,o){let n,r;if(o!==void 0)try{n=e.text?.(o),r=e.tagAttrs?.(o);}catch(s){return {reason:`${e.name} could not describe this payload: ${s instanceof Error?s.message:String(s)}`}}let a=t.text??n;return a===void 0?{reason:e.text?`${e.name} derives its text from \`data\`, so pass one \u2014 or pass \`text\` directly`:`${e.name} declares no \`text\`, so \`text\` is required`}:t.attrs===void 0&&e.tagAttrs&&r===void 0?{reason:`${e.name} derives its tag attrs from \`data\`, so pass one \u2014 or pass \`attrs\` directly`}:{attrs:t.attrs??r??{},text:a}}function C(e){return e.getEditingMode()==="viewing"?{ok:false,code:"locked",reason:"the document is open for viewing"}:null}function P(e){let t=e.getActiveScope();if(t.kind==="headerFooter")return {kind:"headerFooter",rId:t.rId};if(t.kind==="note"){let o=store.parseNoteScopeId(t.id);if(o)return {kind:"notesPart",noteKind:o.noteKind}}return {kind:"body"}}function T(e,t){let o=G(e),n=t===void 0?"":t.slice(0,t.indexOf("#"));if(!o||n.length===0)return P(e);if(n===o.session.part().name)return {kind:"body"};for(let r of o.session.headerFooterResolutionBySection())for(let a of [r.headers,r.footers])for(let s of a.values())if(s.partName===n)return {kind:"headerFooter",rId:s.rId};for(let r of ["footnote","endnote"])if(o.session.partFor({kind:"notesPart",noteKind:r})?.name===n)return {kind:"notesPart",noteKind:r};return P(e)}function it(e,t,o={}){let n=G(e);if(!n)return {ok:false,code:"notFound",reason:"no document is mounted"};let r=E(t,o.data);if(r&&!r.ok)return S(r.reason,r.issues);let a=A(t,o,r?.value);if("reason"in a)return {ok:false,code:"invalidArgs",reason:a.reason};let s=h(t.tagPrefix,t.name,a.attrs);if(!s.ok)return {ok:false,code:"invalidArgs",reason:`the encoded tag is ${s.length} characters; Word caps w:tag at 64 \u2014 move what does not fit into the payload (\`data\`), or shorten the attrs`};let d=C(e);if(d)return d;let i=o.at??n.state().selection.head,u=o.lock===void 0?"contentLocked":o.lock,c=P(e),l=n.session.insertCustomNode({paragraphId:i.paragraphId,offset:i.offset,tag:s.tag,text:a.text,...o.alias===void 0?{}:{alias:o.alias},...u===false?{}:{lock:u},...r?{payload:D(n,t,r.serialized,a.text)}:{}},c);return l.ok?{ok:true,changed:true,...l.nodeId===void 0?{}:{nodeId:l.nodeId}}:k(l)}function J(e){return e.surface??null}function Ne(e,t){let o=null,n=a=>a.id===t?true:a.kind==="textValue"?false:a.children.some(n),r=(a,s)=>{if(!(o||a.kind==="textValue"||s>64)){if(a.kind==="paragraph"){n(a)&&(o=a);return}for(let d of a.children)r(d,s+1);}};return r(e.root,0),o}function xe(e,t){let o=new Set,n=i=>{if(o.add(i.id),i.kind!=="textValue")for(let u of i.children)n(u);},r=i=>{if(i.id===t)return i;if(i.kind==="textValue")return null;for(let u of i.children){let c=r(u);if(c)return c}return null},a=r(e);if(!a)return null;n(a);let s=Number.MAX_SAFE_INTEGER,d=-1;for(let i of store.segmentsOf(e))o.has(i.runId)&&(i.start<s&&(s=i.start),i.end>d&&(d=i.end));return d<0?null:{start:s,end:d}}function gt(e,t){let o=J(e);if(!o)return {ok:false,code:"notFound",reason:"no document is mounted"};let n=C(e);if(n)return n;let r=o.session.removeCustomNode(t,T(e,t));return r.ok?{ok:true,changed:true}:k(r)}function ht(e,t,o,n={}){let r=J(e);if(!r)return {ok:false,code:"notFound",reason:"no document is mounted"};let a=C(e);if(a)return a;let s=T(e,o),d=r.session.partFor(s)??r.session.part(),i=Ne(d,o),u=i?xe(i,o):null,c=Se(r,o,s);if(!i||!u||!c)return {ok:false,code:"notFound",reason:"no custom node with that id"};let l=`${t.tagPrefix}:${t.name}`;if(c.identity!==null&&c.identity!==l)return {ok:false,code:"invalidArgs",reason:`node ${o} is a ${c.identity}, not a ${l}`};let f=ke(r,o),m=n.data===null?null:n.data===void 0?ve(f):E(t,n.data);if(m&&!m.ok)return S(m.reason,m.issues);let p=A(t,{attrs:n.attrs??(n.data===void 0?c.attrs:void 0),text:n.text??(m===null&&n.data===null?c.text:void 0)},m?.value);if("reason"in p)return {ok:false,code:"invalidArgs",reason:p.reason};let O=h(t.tagPrefix,t.name,p.attrs);if(!O.ok)return {ok:false,code:"invalidArgs",reason:`the encoded tag is ${O.length} characters; Word caps w:tag at 64 \u2014 move what does not fit into the payload (\`data\`), or shorten the attrs`};let $=n.alias??c.alias,w=n.lock??c.lock,y=r.session.insertCustomNode({replaceControlId:o,paragraphId:i.id,offset:u.start,tag:O.tag,text:p.text,...$===void 0?{}:{alias:$},...w===false||w===void 0?{}:{lock:w},...m?{payload:D(r,t,m.serialized,p.text,f?.nodeId)}:{}},s);return y.ok?{ok:true,changed:true,...y.nodeId===void 0?{}:{nodeId:y.nodeId}}:k(y)}function Se(e,t,o){let n=e.session.partFor(o)??e.session.part(),r=store.contentControlsIn(n.root).find(i=>i.node.id===t);if(!r)return null;let a=store.contentControlPropertiesOf(r.node),s=a.tag===void 0?null:N(a.tag),d=a.lock;return {identity:s?`${s.prefix}:${s.name}`:null,attrs:s?.attrs??{},text:store.contentControlTextOf(r.node),alias:a.alias,lock:d==="sdtLocked"||d==="sdtContentLocked"||d==="contentLocked"?d:d==="unlocked"?false:void 0}}function ve(e){if(!e)return null;let t=x(void 0,e.data);return t.ok?{ok:true,serialized:e.data,value:t.value}:{ok:false,reason:`the stored payload is not readable: ${t.issues.join(", ")}`,issues:[]}}function ke(e,t){let o=e.session.part();return store.customNodePayloadsByControl(e.session.currentPackage(),o.name).get(t)}exports.a=Oe;exports.b=h;exports.c=N;exports.d=Ie;exports.e=x;exports.f=R;exports.g=b;exports.h=v;exports.i=L;exports.j=z;exports.k=V;exports.l=Ve;exports.m=ze;exports.n=W;exports.o=ot;exports.p=it;exports.q=gt;exports.r=ht;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import {contentControlsIn,contentControlPropertiesOf,contentControlTextOf,findNode,revisionItemsOf,collectReviewItems,paragraphOrderOfPart,parseNoteScopeId,locateSites,customNodePayloadsOf,customNodePayloadsByControl,segmentsOf}from'@docx-editor.dev/core/store';import {reviewItemPositionRank}from'@docx-editor.dev/core/layout';function g(e){}var Oe=64,H=new Set(["__proto__","constructor","prototype"]);function h(e,t,o){let n=new URLSearchParams;for(let[s,d]of Object.entries(o))n.set(s,d);let r=n.toString(),a=r.length>0?`${e}:${t}?${r}`:`${e}:${t}`;return a.length>64?{ok:false,reason:"tag-overflow",length:a.length}:{ok:true,tag:a}}function N(e){if(e.length>64)return null;let t=e.indexOf(":");if(t<=0)return null;let o=e.slice(0,t),n=e.slice(t+1),r=n.indexOf("?"),a=r===-1?n:n.slice(0,r);if(a.length===0)return null;let s=Object.create(null);if(r!==-1)for(let[d,i]of new URLSearchParams(n.slice(r+1))){if(H.has(d))return null;s[d]=i;}return {prefix:o,name:a,attrs:s}}var Ie=262144;function x(e,t){if(t.length===0)return {ok:false,reason:"malformed",issues:["the node carries no payload"]};if(t.length>262144)return {ok:false,reason:"malformed",issues:[`the payload is ${String(t.length)} characters; the cap is ${String(262144)}`]};let o;try{o=JSON.parse(t);}catch(a){return {ok:false,reason:"malformed",issues:[a instanceof Error?a.message:"the payload is not JSON"]}}let n=I(o);if(!e)return {ok:true,value:n};let r=e["~standard"].validate(n);return B(r)?{ok:false,reason:"async",issues:["the schema validates asynchronously, which the read path cannot await"]}:r.issues?{ok:false,reason:"invalid",issues:r.issues.map(q)}:{ok:true,value:r.value}}function R(e){let t;try{t=JSON.stringify(e)??"";}catch(o){return {ok:false,reason:"malformed",issues:[o instanceof Error?o.message:"the value cannot be serialized"]}}return t.length===0?{ok:false,reason:"malformed",issues:["the value serializes to nothing"]}:t.length>262144?{ok:false,reason:"malformed",issues:[`the payload is ${String(t.length)} characters; the cap is ${String(262144)}`]}:{ok:true,value:t}}function B(e){return typeof e.then=="function"}function q(e){let t=(e.path??[]).map(o=>String(typeof o=="object"?o.key:o)).join(".");return t.length>0?`${t}: ${e.message}`:e.message}var Y=new Set(["__proto__","constructor","prototype"]);function I(e){if(Array.isArray(e))return e.map(I);if(e===null||typeof e!="object")return e;let t=Object.create(null);for(let[o,n]of Object.entries(e))Y.has(o)||(t[o]=I(n));return t}function _(e){let t=(e.path??[]).map(o=>{let n=typeof o=="object"?o.key:o;return typeof n=="number"?n:String(n)});return {message:e.message,path:t,pointer:t.join(".")}}function S(e,t){return {ok:false,code:"invalidArgs",reason:e,issues:t}}var b="docxEditor";function v(e){return e.payloadNamespace??`urn:docx-editor.dev:custom-node:${e.tagPrefix}`}function M(e,t,o){let n=0;for(let r of customNodePayloadsOf(e,t,o).keys()){let a=/^cx(\d{1,9})$/.exec(r);if(!a)continue;let s=Number(a[1]);s>n&&(n=s);}return `cx${String(n+1)}`}function L(e,t){let o=R(t);if(!o.ok)return {ok:false,reason:`the payload cannot be serialized: ${o.issues.join(", ")}`,issues:[]};if(!e.schema)return {ok:true,data:o.value,value:t};let r=e.schema["~standard"].validate(JSON.parse(o.value));if(Q(r))return {ok:false,reason:`${e.name}'s schema validates asynchronously, which a write cannot await`,issues:[]};if(r.issues){let s=r.issues.map(_);return {ok:false,reason:`the payload does not match ${e.name}'s schema: `+s.map(d=>(d.pointer?`${d.pointer}: `:"")+d.message).join(", "),issues:s}}let a=R(r.value);return a.ok?{ok:true,data:a.value,value:r.value}:{ok:false,reason:`the payload cannot be serialized: ${a.issues.join(", ")}`,issues:[]}}function Q(e){return typeof e.then=="function"}function z(e){return typeof e=="object"&&e!==null&&typeof e.name=="string"&&typeof e.tagPrefix=="string"}var V=/^[A-Za-z0-9_.-]+$/,te=/['"<>&]|[\u0000-\u0008\u000B\u000C\u000E-\u001F\u007F]/;function oe(e){return e.length>0&&!te.test(e)}function Ve(e){if(!V.test(e.name??""))throw new Error(`defineCustomNode: invalid name ${JSON.stringify(e.name)}`);if(!V.test(e.tagPrefix??""))throw new Error(`defineCustomNode: invalid tagPrefix ${JSON.stringify(e.tagPrefix)}`);let t=e.schema;if(t!==void 0&&typeof t?.["~standard"]?.validate!="function")throw new Error(`defineCustomNode: ${JSON.stringify(e.name)} has a schema that does not implement Standard Schema`);if(e.payloadNamespace!==void 0&&!oe(e.payloadNamespace))throw new Error(`defineCustomNode: ${JSON.stringify(e.name)} has a payloadNamespace that cannot be written into an XPath \u2014 no quotes, angle brackets, ampersands or control characters: ${JSON.stringify(e.payloadNamespace)}`);if(e.preserveOnExport!==void 0&&e.preserveOnExport!==true&&e.preserveOnExport!==false&&e.preserveOnExport!=="text")throw new Error(`defineCustomNode: ${JSON.stringify(e.name)} has an unknown preserveOnExport ${JSON.stringify(e.preserveOnExport)}`);return Object.freeze({...e,dataOf:n=>{if(!n||n.data===void 0||n.name!==void 0&&n.name!==e.name)return;if(!e.schema)return n.data;let r=e.schema["~standard"].validate(n.data);if(typeof r.then=="function")return;let a=r;return a.issues?void 0:a.value}})}function ze(e){g(e.licenseKey);let t=new Set;for(let o of e.nodes){let n=`${o.tagPrefix}:${o.name}`;if(t.has(n))throw new Error(`customNodesModule: two definitions claim ${JSON.stringify(n)}`);t.add(n);}return {id:"custom-nodes",customNodes:e.nodes,...e.onDiagnostic?{onCustomNodeDiagnostic:o=>{e.onDiagnostic?.(o);}}:{},customNodePayloadNamespaces:[...new Set(e.nodes.map(v))]}}function ne(e){for(let t of e.children)if(!(t.kind==="textValue"||t.localName!=="sdtPr")){for(let o of t.children)if(!(o.kind==="textValue"||o.localName!=="tag")){for(let n of o.attributes)if(n.localName==="val")return n.value}}}function j(e){if(e.kind==="textValue")return e.value;let t="";for(let o of e.children)t+=j(o);return t}function W(e,t,o={}){if(t.length===0)return [];let n=new Map;for(let s of t){let d=`${s.tagPrefix}:${s.name}`;if(n.has(d))throw new Error(`recognizeCustomNodes: duplicate definition for ${JSON.stringify(d)}`);n.set(d,s);}let r=[],a=(s,d)=>{if(!(s.kind==="textValue"||d>64)){if(s.kind==="contentControl"){let i=ne(s),u=i!==void 0?N(i):null,c=u?n.get(`${u.prefix}:${u.name}`):void 0;if(u&&c&&i!==void 0){let l=j(s),f=re(c,s.id,o.payloads?.get(s.id),contentControlPropertiesOf(s).dataBinding!==void 0,o.onDiagnostic),m=c.fromDocx?c.fromDocx({attrs:u.attrs,text:l,...f.present?{data:f.value}:{}}):u.attrs;if(m!==null){r.push({name:c.name,attrs:m,text:l,nodeId:s.id,tag:i,...f.present?{data:f.value}:{}});return}}}for(let i of s.children)a(i,d+1);}};return a(e.root,0),r}function re(e,t,o,n,r){if(!o)return n&&r?.({code:"payload-missing",name:e.name,nodeId:t,issues:["the control binds a store node this document does not hold"]}),{present:false};let a=x(e.schema,o.data);return a.ok?{present:true,value:a.value}:(r?.({code:"payload-invalid",name:e.name,nodeId:t,issues:a.issues}),{present:false})}function K(e,t){let o=findNode(e,t);return !o||o.kind!=="paragraph"?[]:revisionItemsOf({id:e.id,name:e.name,contentType:e.contentType,root:o})}function ce(e,t,o,n){if(t.length===0)return [];let r=W(e,t,{...o===void 0?{}:{payloads:o},...n===void 0?{}:{onDiagnostic:n}});if(r.length===0)return [];let a=locateSites(e),s=[];for(let d of r){let i=t.find(l=>l.name===d.name&&d.tag.startsWith(`${l.tagPrefix}:`));if(!i)continue;let u=i.reviewCard?i.reviewCard({attrs:d.attrs,text:d.text,...d.data===void 0?{}:{data:d.data}}):null;if(i.reviewCard&&u===null)continue;let c=a.get(d.nodeId);s.push({kind:"custom",id:d.nodeId,name:d.name,tag:d.tag,attrs:d.attrs,text:d.text,...d.data===void 0?{}:{data:d.data},carded:i.reviewCard!==void 0&&u!==null,title:u?.title??"",...u?.detail!==void 0?{detail:u.detail}:{},...u?.icon!==void 0?{icon:u.icon}:{},range:c?{partName:e.name,start:{paragraphId:c.paragraphId,offset:c.start},end:{paragraphId:c.paragraphId,offset:c.end}}:null});}return s}function U(e){let t=collectReviewItems(e),o=(e.customNodes??[]).filter(z);if(o.length===0)return t;let n=[e.storyPart],r=new Set([e.storyPart.name]);for(let i of e.furnitureParts??[])r.has(i.name)||(r.add(i.name),n.push(i));let a=[],s=new Map;for(let i of n){a.push(...ce(i,o,i.name===e.storyPart.name?e.customNodePayloads:void 0,e.reportCustomNodeDiagnostic));let u=s.size;for(let[c,l]of paragraphOrderOfPart(i))s.has(c)||s.set(c,u+l);}return a.length===0?t:[...t,...a].sort((i,u)=>reviewItemPositionRank(i,s)-reviewItemPositionRank(u,s))}function ot(e={}){return g(e.licenseKey),{id:"review",review:{displayModes:["all-markup","proposed","original"],collectReviewItems:U,revisionItemsOfParagraph:K}}}function G(e){return e.surface??null}function E(e,t){if(t==null)return null;let o=L(e,t);return o.ok?{ok:true,serialized:o.data,value:o.value}:{ok:false,reason:o.reason,issues:o.issues}}function D(e,t,o,n,r){let a=v(t),s=e.session.part().name;return {namespaceUri:a,rootLocalName:b,nodeId:r??M(e.session.currentPackage(),s,a),label:n,data:o}}function k(e){let t=e.detail?`${e.reason}: ${e.detail}`:e.reason;return {ok:false,code:me.has(e.reason)?"invalidArgs":"unsupported",reason:t}}var me=new Set(["payload-too-large","unaddressable-payload","store-not-authored","offset-out-of-range","invalid-range","invalid-property-value","splits-surrogate-pair"]);function A(e,t,o){let n,r;if(o!==void 0)try{n=e.text?.(o),r=e.tagAttrs?.(o);}catch(s){return {reason:`${e.name} could not describe this payload: ${s instanceof Error?s.message:String(s)}`}}let a=t.text??n;return a===void 0?{reason:e.text?`${e.name} derives its text from \`data\`, so pass one \u2014 or pass \`text\` directly`:`${e.name} declares no \`text\`, so \`text\` is required`}:t.attrs===void 0&&e.tagAttrs&&r===void 0?{reason:`${e.name} derives its tag attrs from \`data\`, so pass one \u2014 or pass \`attrs\` directly`}:{attrs:t.attrs??r??{},text:a}}function C(e){return e.getEditingMode()==="viewing"?{ok:false,code:"locked",reason:"the document is open for viewing"}:null}function P(e){let t=e.getActiveScope();if(t.kind==="headerFooter")return {kind:"headerFooter",rId:t.rId};if(t.kind==="note"){let o=parseNoteScopeId(t.id);if(o)return {kind:"notesPart",noteKind:o.noteKind}}return {kind:"body"}}function T(e,t){let o=G(e),n=t===void 0?"":t.slice(0,t.indexOf("#"));if(!o||n.length===0)return P(e);if(n===o.session.part().name)return {kind:"body"};for(let r of o.session.headerFooterResolutionBySection())for(let a of [r.headers,r.footers])for(let s of a.values())if(s.partName===n)return {kind:"headerFooter",rId:s.rId};for(let r of ["footnote","endnote"])if(o.session.partFor({kind:"notesPart",noteKind:r})?.name===n)return {kind:"notesPart",noteKind:r};return P(e)}function it(e,t,o={}){let n=G(e);if(!n)return {ok:false,code:"notFound",reason:"no document is mounted"};let r=E(t,o.data);if(r&&!r.ok)return S(r.reason,r.issues);let a=A(t,o,r?.value);if("reason"in a)return {ok:false,code:"invalidArgs",reason:a.reason};let s=h(t.tagPrefix,t.name,a.attrs);if(!s.ok)return {ok:false,code:"invalidArgs",reason:`the encoded tag is ${s.length} characters; Word caps w:tag at 64 \u2014 move what does not fit into the payload (\`data\`), or shorten the attrs`};let d=C(e);if(d)return d;let i=o.at??n.state().selection.head,u=o.lock===void 0?"contentLocked":o.lock,c=P(e),l=n.session.insertCustomNode({paragraphId:i.paragraphId,offset:i.offset,tag:s.tag,text:a.text,...o.alias===void 0?{}:{alias:o.alias},...u===false?{}:{lock:u},...r?{payload:D(n,t,r.serialized,a.text)}:{}},c);return l.ok?{ok:true,changed:true,...l.nodeId===void 0?{}:{nodeId:l.nodeId}}:k(l)}function J(e){return e.surface??null}function Ne(e,t){let o=null,n=a=>a.id===t?true:a.kind==="textValue"?false:a.children.some(n),r=(a,s)=>{if(!(o||a.kind==="textValue"||s>64)){if(a.kind==="paragraph"){n(a)&&(o=a);return}for(let d of a.children)r(d,s+1);}};return r(e.root,0),o}function xe(e,t){let o=new Set,n=i=>{if(o.add(i.id),i.kind!=="textValue")for(let u of i.children)n(u);},r=i=>{if(i.id===t)return i;if(i.kind==="textValue")return null;for(let u of i.children){let c=r(u);if(c)return c}return null},a=r(e);if(!a)return null;n(a);let s=Number.MAX_SAFE_INTEGER,d=-1;for(let i of segmentsOf(e))o.has(i.runId)&&(i.start<s&&(s=i.start),i.end>d&&(d=i.end));return d<0?null:{start:s,end:d}}function gt(e,t){let o=J(e);if(!o)return {ok:false,code:"notFound",reason:"no document is mounted"};let n=C(e);if(n)return n;let r=o.session.removeCustomNode(t,T(e,t));return r.ok?{ok:true,changed:true}:k(r)}function ht(e,t,o,n={}){let r=J(e);if(!r)return {ok:false,code:"notFound",reason:"no document is mounted"};let a=C(e);if(a)return a;let s=T(e,o),d=r.session.partFor(s)??r.session.part(),i=Ne(d,o),u=i?xe(i,o):null,c=Se(r,o,s);if(!i||!u||!c)return {ok:false,code:"notFound",reason:"no custom node with that id"};let l=`${t.tagPrefix}:${t.name}`;if(c.identity!==null&&c.identity!==l)return {ok:false,code:"invalidArgs",reason:`node ${o} is a ${c.identity}, not a ${l}`};let f=ke(r,o),m=n.data===null?null:n.data===void 0?ve(f):E(t,n.data);if(m&&!m.ok)return S(m.reason,m.issues);let p=A(t,{attrs:n.attrs??(n.data===void 0?c.attrs:void 0),text:n.text??(m===null&&n.data===null?c.text:void 0)},m?.value);if("reason"in p)return {ok:false,code:"invalidArgs",reason:p.reason};let O=h(t.tagPrefix,t.name,p.attrs);if(!O.ok)return {ok:false,code:"invalidArgs",reason:`the encoded tag is ${O.length} characters; Word caps w:tag at 64 \u2014 move what does not fit into the payload (\`data\`), or shorten the attrs`};let $=n.alias??c.alias,w=n.lock??c.lock,y=r.session.insertCustomNode({replaceControlId:o,paragraphId:i.id,offset:u.start,tag:O.tag,text:p.text,...$===void 0?{}:{alias:$},...w===false||w===void 0?{}:{lock:w},...m?{payload:D(r,t,m.serialized,p.text,f?.nodeId)}:{}},s);return y.ok?{ok:true,changed:true,...y.nodeId===void 0?{}:{nodeId:y.nodeId}}:k(y)}function Se(e,t,o){let n=e.session.partFor(o)??e.session.part(),r=contentControlsIn(n.root).find(i=>i.node.id===t);if(!r)return null;let a=contentControlPropertiesOf(r.node),s=a.tag===void 0?null:N(a.tag),d=a.lock;return {identity:s?`${s.prefix}:${s.name}`:null,attrs:s?.attrs??{},text:contentControlTextOf(r.node),alias:a.alias,lock:d==="sdtLocked"||d==="sdtContentLocked"||d==="contentLocked"?d:d==="unlocked"?false:void 0}}function ve(e){if(!e)return null;let t=x(void 0,e.data);return t.ok?{ok:true,serialized:e.data,value:t.value}:{ok:false,reason:`the stored payload is not readable: ${t.issues.join(", ")}`,issues:[]}}function ke(e,t){let o=e.session.part();return customNodePayloadsByControl(e.session.currentPackage(),o.name).get(t)}export{Oe as a,h as b,N as c,Ie as d,x as e,R as f,b as g,v as h,L as i,z as j,V as k,Ve as l,ze as m,W as n,ot as o,it as p,gt as q,ht as r};
|
|
@@ -299,6 +299,17 @@ interface CustomNodeDefinition<Schema extends StandardSchemaV1 | undefined = any
|
|
|
299
299
|
}) => {
|
|
300
300
|
readonly title: string;
|
|
301
301
|
readonly detail?: string;
|
|
302
|
+
/**
|
|
303
|
+
* Glyph for this node in the COLLAPSED rail, as an SVG path in a `0 -960 960 960`
|
|
304
|
+
* viewBox (a Material Symbol path is exactly this). Without one every marker in the
|
|
305
|
+
* gutter is the generic comment bubble, so a citation, a tracked deletion and a
|
|
306
|
+
* comment are indistinguishable until the pane is opened.
|
|
307
|
+
*
|
|
308
|
+
* HOST-AUTHORED. Unlike `title` and `detail`, this is not derived from `attrs` or
|
|
309
|
+
* `text`: it lands in an SVG `d` attribute, and a path out of a document would be
|
|
310
|
+
* attacker-controlled markup.
|
|
311
|
+
*/
|
|
312
|
+
readonly icon?: string;
|
|
302
313
|
} | null;
|
|
303
314
|
/**
|
|
304
315
|
* The "Edit {label}" row the context menu shows at the top when the
|
|
@@ -299,6 +299,17 @@ interface CustomNodeDefinition<Schema extends StandardSchemaV1 | undefined = any
|
|
|
299
299
|
}) => {
|
|
300
300
|
readonly title: string;
|
|
301
301
|
readonly detail?: string;
|
|
302
|
+
/**
|
|
303
|
+
* Glyph for this node in the COLLAPSED rail, as an SVG path in a `0 -960 960 960`
|
|
304
|
+
* viewBox (a Material Symbol path is exactly this). Without one every marker in the
|
|
305
|
+
* gutter is the generic comment bubble, so a citation, a tracked deletion and a
|
|
306
|
+
* comment are indistinguishable until the pane is opened.
|
|
307
|
+
*
|
|
308
|
+
* HOST-AUTHORED. Unlike `title` and `detail`, this is not derived from `attrs` or
|
|
309
|
+
* `text`: it lands in an SVG `d` attribute, and a path out of a document would be
|
|
310
|
+
* attacker-controlled markup.
|
|
311
|
+
*/
|
|
312
|
+
readonly icon?: string;
|
|
302
313
|
} | null;
|
|
303
314
|
/**
|
|
304
315
|
* The "Edit {label}" row the context menu shows at the top when the
|
package/dist/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
'use strict';var
|
|
1
|
+
'use strict';var chunkA7NTVTWG_cjs=require('./chunk-A7NTVTWG.cjs'),store=require('@docx-editor.dev/core/store');function b(e,o={}){let r=U(e);if(!r)return [];let t=o.nodes??e.getCustomNodeDefinitions().filter(chunkA7NTVTWG_cjs.j);if(t.length===0)return [];let s=r.session.part();return chunkA7NTVTWG_cjs.n(s,t,{payloads:store.customNodePayloadsByControl(r.session.currentPackage(),s.name),onDiagnostic:o.onDiagnostic??(d=>{e.reportCustomNodeDiagnostic(d);})})}function U(e){return e.surface??null}function E(e,o,r={}){if(r.destination==="internal")return {ok:true,bytes:e,unwrapped:0,removed:0};let t=store.readOoxmlPackage(e);if(!t.ok)return {ok:false,reason:`the document could not be read: ${t.reason}`};let s=new Map;for(let i of o)s.set(`${i.tagPrefix}:${i.name}`,i);let d=i=>{let m=chunkA7NTVTWG_cjs.c(i);if(!m)return "keep";let x=s.get(`${m.prefix}:${m.name}`);return x?x.preserveOnExport==="text"?"text":x.preserveOnExport===false?"remove":"keep":"keep"},p=[...new Set(o.filter(i=>i.preserveOnExport!==void 0).filter(i=>i.preserveOnExport!==true).map(chunkA7NTVTWG_cjs.h))],n=t.package,u=0,c=0,g=B(n);for(let i of g){let m=store.withExportedCustomNodes(n,{storyPartName:i,namespaces:[],decide:d});if(!m.ok)return {ok:false,reason:m.reason};n=m.pkg,u+=m.unwrapped,c+=m.removed;}let l=store.withExportedCustomNodes(n,{storyPartName:n.mainDocumentPart,namespaces:p,decide:()=>"keep"});return l.ok?(n=l.pkg,{ok:true,bytes:store.writeOoxmlPackage(n),unwrapped:u,removed:c}):{ok:false,reason:l.reason}}function B(e){let o=[];for(let[r,t]of e.parts)r!==e.mainDocumentPart&&store.storyRootsOf(t).length!==0&&o.push(r);return [e.mainDocumentPart,...o]}async function V(e,o={}){let r=o.nodes??e.getCustomNodeDefinitions().filter(chunkA7NTVTWG_cjs.j),t=await e.save();return E(new Uint8Array(t),r,{...o.destination===void 0?{}:{destination:o.destination}})}function a(e){return e.replace(/[\u0000-\u0008\u000B\u000C\u000E-\u001F]/g,"").replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}function J(e,o,r,t={}){if(!chunkA7NTVTWG_cjs.k.test(e.tagPrefix)||!chunkA7NTVTWG_cjs.k.test(e.name))return {ok:false,code:"invalidArgs",reason:"the definition identity must match defineCustomNode\u2019s charset ([A-Za-z0-9_.-])"};let s=chunkA7NTVTWG_cjs.b(e.tagPrefix,e.name,o);if(!s.ok)return {ok:false,code:"invalidArgs",reason:`the encoded tag is ${s.length} characters; Word caps w:tag at 64 \u2014 shorten the attrs`};let d=t.lock===void 0?"contentLocked":t.lock,p=t.id!==void 0&&Number.isInteger(t.id)&&t.id>0?t.id:store.fnv1a32(`${s.tag}\0${r}`)&2147483647||1,n=t.data===void 0?null:K(e,t,r);if(n&&"reason"in n)return {ok:false,code:"invalidArgs",reason:n.reason};let u=(t.alias!==void 0?`<w:alias w:val="${a(t.alias)}"/>`:"")+`<w:tag w:val="${a(s.tag)}"/><w:id w:val="${p}"/>`+(d===false?"":`<w:lock w:val="${d}"/>`)+(n?`<w:dataBinding w:prefixMappings="${a(n.binding.prefixMappings)}" w:xpath="${a(n.binding.xpath)}" w:storeItemID="${a(n.binding.storeItemId)}"/>`:""),c=`<w:r><w:t xml:space="preserve">${a(r)}</w:t></w:r>`;return {ok:true,xml:`<w:sdt><w:sdtPr>${u}</w:sdtPr><w:sdtContent>${c}</w:sdtContent></w:sdt>`,...n?{store:n.store}:{}}}function K(e,o,r){let t=chunkA7NTVTWG_cjs.i(e,o.data);if(!t.ok)return {reason:t.reason};let s=chunkA7NTVTWG_cjs.h(e),d=o.storeIndex!==void 0&&Number.isInteger(o.storeIndex)&&o.storeIndex>0?o.storeIndex:1,p=o.nodeId??"cx1",n=`/customXml/item${String(d)}.xml`,u=`/customXml/itemProps${String(d)}.xml`,c=store.datastoreItemIdFor(`${s} ${n} ${p}`),g=store.customNodeBinding({partName:n,propsPartName:u,itemId:c,namespaceUri:s},chunkA7NTVTWG_cjs.g,p);if(!g)return {reason:`the payload cannot be addressed by an XPath: check nodeId (${p}) and payloadNamespace`};let l=r===r.trim()?`<label>${a(r)}</label>`:`<label xml:space="preserve">${a(r)}</label>`;return {binding:g,store:{itemPartName:n,itemXml:`<${chunkA7NTVTWG_cjs.g} xmlns="${a(s)}"><node id="${a(p)}">${l}<data>${a(t.data)}</data></node></${chunkA7NTVTWG_cjs.g}>`,propsPartName:u,propsXml:`<ds:datastoreItem ds:itemID="${a(c)}" xmlns:ds="${store.DATASTORE_NAMESPACE_URI}"><ds:schemaRefs><ds:schemaRef ds:uri="${a(s)}"/></ds:schemaRefs></ds:datastoreItem>`,storeItemId:c,relationships:[{from:"/word/document.xml",type:store.CUSTOM_XML_REL,target:`../customXml/item${String(d)}.xml`},{from:n,type:store.CUSTOM_XML_PROPS_REL,target:`itemProps${String(d)}.xml`}],contentTypeOverride:{partName:u,contentType:store.CUSTOM_XML_PROPS_TYPE}}}}Object.defineProperty(exports,"CUSTOM_NODE_STORE_ROOT",{enumerable:true,get:function(){return chunkA7NTVTWG_cjs.g}});Object.defineProperty(exports,"MAX_CUSTOM_NODE_DATA_LENGTH",{enumerable:true,get:function(){return chunkA7NTVTWG_cjs.d}});Object.defineProperty(exports,"MAX_TAG_LENGTH",{enumerable:true,get:function(){return chunkA7NTVTWG_cjs.a}});Object.defineProperty(exports,"customNodeNamespace",{enumerable:true,get:function(){return chunkA7NTVTWG_cjs.h}});Object.defineProperty(exports,"customNodesModule",{enumerable:true,get:function(){return chunkA7NTVTWG_cjs.m}});Object.defineProperty(exports,"decodeCustomNodeTag",{enumerable:true,get:function(){return chunkA7NTVTWG_cjs.c}});Object.defineProperty(exports,"defineCustomNode",{enumerable:true,get:function(){return chunkA7NTVTWG_cjs.l}});Object.defineProperty(exports,"encodeCustomNodeTag",{enumerable:true,get:function(){return chunkA7NTVTWG_cjs.b}});Object.defineProperty(exports,"insertCustomNode",{enumerable:true,get:function(){return chunkA7NTVTWG_cjs.p}});Object.defineProperty(exports,"isCustomNodeDefinition",{enumerable:true,get:function(){return chunkA7NTVTWG_cjs.j}});Object.defineProperty(exports,"parseCustomNodeData",{enumerable:true,get:function(){return chunkA7NTVTWG_cjs.e}});Object.defineProperty(exports,"recognizeCustomNodes",{enumerable:true,get:function(){return chunkA7NTVTWG_cjs.n}});Object.defineProperty(exports,"removeCustomNode",{enumerable:true,get:function(){return chunkA7NTVTWG_cjs.q}});Object.defineProperty(exports,"reviewModule",{enumerable:true,get:function(){return chunkA7NTVTWG_cjs.o}});Object.defineProperty(exports,"serializeCustomNodeData",{enumerable:true,get:function(){return chunkA7NTVTWG_cjs.f}});Object.defineProperty(exports,"updateCustomNode",{enumerable:true,get:function(){return chunkA7NTVTWG_cjs.r}});exports.customNodeXml=J;exports.customNodesOf=b;exports.prepareForExport=E;exports.saveForExport=V;
|
package/dist/index.d.cts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { A as AnyCustomNodeDefinition, C as CustomNodeDiagnostic, R as RecognizedCustomNode, S as StandardSchemaV1, I as InferSchemaInput, a as CustomNodeDefinition } from './define-custom-node-
|
|
2
|
-
export { b as ActivatedCustomNode, c as CustomNode, d as CustomNodeDataRejection, e as CustomNodeDataResult, f as CustomNodePayloadSource, g as CustomNodesModuleOptions, h as InferSchemaOutput, M as MAX_CUSTOM_NODE_DATA_LENGTH, P as ProLicenseOptions, i as RecognizeCustomNodesOptions, j as ReviewModuleOptions, k as StandardSchemaIssue, l as StandardSchemaResult, m as customNodesModule, n as defineCustomNode, o as isCustomNodeDefinition, p as parseCustomNodeData, r as recognizeCustomNodes, q as reviewModule, s as serializeCustomNodeData } from './define-custom-node-
|
|
1
|
+
import { A as AnyCustomNodeDefinition, C as CustomNodeDiagnostic, R as RecognizedCustomNode, S as StandardSchemaV1, I as InferSchemaInput, a as CustomNodeDefinition } from './define-custom-node-RznSCnPr.cjs';
|
|
2
|
+
export { b as ActivatedCustomNode, c as CustomNode, d as CustomNodeDataRejection, e as CustomNodeDataResult, f as CustomNodePayloadSource, g as CustomNodesModuleOptions, h as InferSchemaOutput, M as MAX_CUSTOM_NODE_DATA_LENGTH, P as ProLicenseOptions, i as RecognizeCustomNodesOptions, j as ReviewModuleOptions, k as StandardSchemaIssue, l as StandardSchemaResult, m as customNodesModule, n as defineCustomNode, o as isCustomNodeDefinition, p as parseCustomNodeData, r as recognizeCustomNodes, q as reviewModule, s as serializeCustomNodeData } from './define-custom-node-RznSCnPr.cjs';
|
|
3
3
|
import { Editor, ExecResult } from '@docx-editor.dev/core/contracts/editor';
|
|
4
4
|
import '@docx-editor.dev/core/editor';
|
|
5
5
|
import '@docx-editor.dev/core/store';
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { A as AnyCustomNodeDefinition, C as CustomNodeDiagnostic, R as RecognizedCustomNode, S as StandardSchemaV1, I as InferSchemaInput, a as CustomNodeDefinition } from './define-custom-node-
|
|
2
|
-
export { b as ActivatedCustomNode, c as CustomNode, d as CustomNodeDataRejection, e as CustomNodeDataResult, f as CustomNodePayloadSource, g as CustomNodesModuleOptions, h as InferSchemaOutput, M as MAX_CUSTOM_NODE_DATA_LENGTH, P as ProLicenseOptions, i as RecognizeCustomNodesOptions, j as ReviewModuleOptions, k as StandardSchemaIssue, l as StandardSchemaResult, m as customNodesModule, n as defineCustomNode, o as isCustomNodeDefinition, p as parseCustomNodeData, r as recognizeCustomNodes, q as reviewModule, s as serializeCustomNodeData } from './define-custom-node-
|
|
1
|
+
import { A as AnyCustomNodeDefinition, C as CustomNodeDiagnostic, R as RecognizedCustomNode, S as StandardSchemaV1, I as InferSchemaInput, a as CustomNodeDefinition } from './define-custom-node-RznSCnPr.js';
|
|
2
|
+
export { b as ActivatedCustomNode, c as CustomNode, d as CustomNodeDataRejection, e as CustomNodeDataResult, f as CustomNodePayloadSource, g as CustomNodesModuleOptions, h as InferSchemaOutput, M as MAX_CUSTOM_NODE_DATA_LENGTH, P as ProLicenseOptions, i as RecognizeCustomNodesOptions, j as ReviewModuleOptions, k as StandardSchemaIssue, l as StandardSchemaResult, m as customNodesModule, n as defineCustomNode, o as isCustomNodeDefinition, p as parseCustomNodeData, r as recognizeCustomNodes, q as reviewModule, s as serializeCustomNodeData } from './define-custom-node-RznSCnPr.js';
|
|
3
3
|
import { Editor, ExecResult } from '@docx-editor.dev/core/contracts/editor';
|
|
4
4
|
import '@docx-editor.dev/core/editor';
|
|
5
5
|
import '@docx-editor.dev/core/store';
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import {j,n,h,k,b as b$1,i,g,c}from'./chunk-
|
|
1
|
+
import {j,n,h,k,b as b$1,i,g,c}from'./chunk-PWNAGXXX.js';export{g as CUSTOM_NODE_STORE_ROOT,d as MAX_CUSTOM_NODE_DATA_LENGTH,a as MAX_TAG_LENGTH,h as customNodeNamespace,m as customNodesModule,c as decodeCustomNodeTag,l as defineCustomNode,b as encodeCustomNodeTag,p as insertCustomNode,j as isCustomNodeDefinition,e as parseCustomNodeData,n as recognizeCustomNodes,q as removeCustomNode,o as reviewModule,f as serializeCustomNodeData,r as updateCustomNode}from'./chunk-PWNAGXXX.js';import {customNodePayloadsByControl,readOoxmlPackage,withExportedCustomNodes,writeOoxmlPackage,storyRootsOf,fnv1a32,datastoreItemIdFor,customNodeBinding,CUSTOM_XML_PROPS_TYPE,CUSTOM_XML_REL,CUSTOM_XML_PROPS_REL,DATASTORE_NAMESPACE_URI}from'@docx-editor.dev/core/store';function b(e,o={}){let r=U(e);if(!r)return [];let t=o.nodes??e.getCustomNodeDefinitions().filter(j);if(t.length===0)return [];let s=r.session.part();return n(s,t,{payloads:customNodePayloadsByControl(r.session.currentPackage(),s.name),onDiagnostic:o.onDiagnostic??(d=>{e.reportCustomNodeDiagnostic(d);})})}function U(e){return e.surface??null}function E(e,o,r={}){if(r.destination==="internal")return {ok:true,bytes:e,unwrapped:0,removed:0};let t=readOoxmlPackage(e);if(!t.ok)return {ok:false,reason:`the document could not be read: ${t.reason}`};let s=new Map;for(let i of o)s.set(`${i.tagPrefix}:${i.name}`,i);let d=i=>{let m=c(i);if(!m)return "keep";let x=s.get(`${m.prefix}:${m.name}`);return x?x.preserveOnExport==="text"?"text":x.preserveOnExport===false?"remove":"keep":"keep"},p=[...new Set(o.filter(i=>i.preserveOnExport!==void 0).filter(i=>i.preserveOnExport!==true).map(h))],n=t.package,u=0,c$1=0,g=B(n);for(let i of g){let m=withExportedCustomNodes(n,{storyPartName:i,namespaces:[],decide:d});if(!m.ok)return {ok:false,reason:m.reason};n=m.pkg,u+=m.unwrapped,c$1+=m.removed;}let l=withExportedCustomNodes(n,{storyPartName:n.mainDocumentPart,namespaces:p,decide:()=>"keep"});return l.ok?(n=l.pkg,{ok:true,bytes:writeOoxmlPackage(n),unwrapped:u,removed:c$1}):{ok:false,reason:l.reason}}function B(e){let o=[];for(let[r,t]of e.parts)r!==e.mainDocumentPart&&storyRootsOf(t).length!==0&&o.push(r);return [e.mainDocumentPart,...o]}async function V(e,o={}){let r=o.nodes??e.getCustomNodeDefinitions().filter(j),t=await e.save();return E(new Uint8Array(t),r,{...o.destination===void 0?{}:{destination:o.destination}})}function a(e){return e.replace(/[\u0000-\u0008\u000B\u000C\u000E-\u001F]/g,"").replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}function J(e,o,r,t={}){if(!k.test(e.tagPrefix)||!k.test(e.name))return {ok:false,code:"invalidArgs",reason:"the definition identity must match defineCustomNode\u2019s charset ([A-Za-z0-9_.-])"};let s=b$1(e.tagPrefix,e.name,o);if(!s.ok)return {ok:false,code:"invalidArgs",reason:`the encoded tag is ${s.length} characters; Word caps w:tag at 64 \u2014 shorten the attrs`};let d=t.lock===void 0?"contentLocked":t.lock,p=t.id!==void 0&&Number.isInteger(t.id)&&t.id>0?t.id:fnv1a32(`${s.tag}\0${r}`)&2147483647||1,n=t.data===void 0?null:K(e,t,r);if(n&&"reason"in n)return {ok:false,code:"invalidArgs",reason:n.reason};let u=(t.alias!==void 0?`<w:alias w:val="${a(t.alias)}"/>`:"")+`<w:tag w:val="${a(s.tag)}"/><w:id w:val="${p}"/>`+(d===false?"":`<w:lock w:val="${d}"/>`)+(n?`<w:dataBinding w:prefixMappings="${a(n.binding.prefixMappings)}" w:xpath="${a(n.binding.xpath)}" w:storeItemID="${a(n.binding.storeItemId)}"/>`:""),c=`<w:r><w:t xml:space="preserve">${a(r)}</w:t></w:r>`;return {ok:true,xml:`<w:sdt><w:sdtPr>${u}</w:sdtPr><w:sdtContent>${c}</w:sdtContent></w:sdt>`,...n?{store:n.store}:{}}}function K(e,o,r){let t=i(e,o.data);if(!t.ok)return {reason:t.reason};let s=h(e),d=o.storeIndex!==void 0&&Number.isInteger(o.storeIndex)&&o.storeIndex>0?o.storeIndex:1,p=o.nodeId??"cx1",n=`/customXml/item${String(d)}.xml`,u=`/customXml/itemProps${String(d)}.xml`,c=datastoreItemIdFor(`${s} ${n} ${p}`),g$1=customNodeBinding({partName:n,propsPartName:u,itemId:c,namespaceUri:s},g,p);if(!g$1)return {reason:`the payload cannot be addressed by an XPath: check nodeId (${p}) and payloadNamespace`};let l=r===r.trim()?`<label>${a(r)}</label>`:`<label xml:space="preserve">${a(r)}</label>`;return {binding:g$1,store:{itemPartName:n,itemXml:`<${g} xmlns="${a(s)}"><node id="${a(p)}">${l}<data>${a(t.data)}</data></node></${g}>`,propsPartName:u,propsXml:`<ds:datastoreItem ds:itemID="${a(c)}" xmlns:ds="${DATASTORE_NAMESPACE_URI}"><ds:schemaRefs><ds:schemaRef ds:uri="${a(s)}"/></ds:schemaRefs></ds:datastoreItem>`,storeItemId:c,relationships:[{from:"/word/document.xml",type:CUSTOM_XML_REL,target:`../customXml/item${String(d)}.xml`},{from:n,type:CUSTOM_XML_PROPS_REL,target:`itemProps${String(d)}.xml`}],contentTypeOverride:{partName:u,contentType:CUSTOM_XML_PROPS_TYPE}}}}export{J as customNodeXml,b as customNodesOf,E as prepareForExport,V as saveForExport};
|
package/dist/react/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
'use strict';var chunkMNK6DXJQ_cjs=require('../chunk-MNK6DXJQ.cjs'),react=require('react'),react$1=require('@docx-editor.dev/react'),jsxRuntime=require('react/jsx-runtime'),store=require('@docx-editor.dev/core/store');function me(e){let i=react$1.useDocxEditor();return rt(i,e)}function rt(e,i){let l=react.useCallback(m=>{if(!e)return ()=>{};let b=e.on("change",m),T=e.on("selectionChange",m),N=e.on("error",m);return ()=>{b(),T(),N();}},[e]),r=react.useSyncExternalStore(l,()=>e?`${e.getReviewRevision()}`:"none",()=>"none"),t=react.useMemo(()=>e?e.getReviewItems(i).filter(m=>m.item.kind!=="custom"||m.item.carded):[],[e,r,i]),o=react.useMemo(()=>t.find(m=>m.isActive)?.key??null,[t]),n=react.useCallback(m=>{e?.setActiveReviewItem(m);},[e]),a=react.useCallback(m=>!e||m.kind!=="revision"||m.readOnly?false:e.acceptReviewItem(m.key).ok,[e]),d=react.useCallback(m=>!e||m.kind!=="revision"||m.readOnly?false:e.rejectReviewItem(m.key).ok,[e]),c=react.useCallback(m=>!e||m.kind==="custom"||m.kind==="revision"&&m.readOnly?false:e.deleteReviewItem(m.key).ok,[e]),p=react.useCallback((m,b,T)=>b.trim().length===0||!e?false:e.replyToReviewItem(m.key,b,T).ok,[e]),w=react.useMemo(()=>e?e.getSelectionPlacement()?.anchorY??null:null,[e,r]),R=react.useCallback((m,b)=>m.trim().length===0||!e?false:e.addComment(m,b).ok,[e]),y=react.useMemo(()=>e?e.isReviewPaneOpen():true,[e,r]),u=react.useCallback(m=>{!e||e.isReviewPaneOpen()===m||e.exec({type:"toggleReviewPane"});},[e]);return react.useMemo(()=>({items:t,activeKey:o,setActive:n,accept:a,reject:d,remove:c,reply:p,selectionAnchorY:w,comment:R,paneOpen:y,setPaneOpen:u,ready:e!==null&&!e.snapshot().isLoading&&e.snapshot().parseError===null}),[t,o,n,a,d,c,p,w,R,y,u,e])}function Nt(e,i,l={}){let r=l.gap??8,t=l.scale??1,o=l.defaultHeight??0;return react.useMemo(()=>{let n=new Map,a=Number.NEGATIVE_INFINITY;for(let d of e){let c=d.anchorY===null?Number.isFinite(a)?a:0:Math.max(d.anchorY,a);n.set(d.key,c),a=c+((i.get(d.key)??o)+r)/t;}return n},[e,i,r,t,o])}var It=e=>e.isLoading||e.parseError!==null||e.pageSetup==null,Pe=react.createContext(null),k=react.createContext(null);function Tt(){return react.useContext(k)}var Mt={scale:96/72,top:0,left:null},Dt=16,ve="\0compose",it=600,st=8,St=72,Lt=64,Ot=480,$t=Object.freeze({placement:false});function ke(e,i){return e.kind!=="comment"?false:e.parentId!==void 0?i.has(e.parentId):e.parentRevisionId!==void 0?i.has(e.parentRevisionId):false}function Ae(e){return new Set(e.map(i=>i.id))}function U(e){let i=e.target?.tagName;i==="INPUT"||i==="SELECT"||i==="TEXTAREA"||e.preventDefault();}function $(){let e=react.useContext(Pe);return e||Ht}function B(){let{t:e}=react.useContext(Pe)??{},{t:i}=react$1.useTranslation();return react.useCallback(l=>e?.(l)??i(l),[e,i])}var Ht={t:void 0,cardClassName:void 0,review:{items:[],activeKey:null,setActive:()=>{},accept:()=>false,reject:()=>false,remove:()=>false,reply:()=>false,selectionAnchorY:null,comment:()=>false,paneOpen:true,setPaneOpen:()=>{},ready:false},allItems:[],authorSlots:new Map,byId:new Map,measure:()=>{},beginDraft:()=>{},endDraft:()=>{}},oe=e=>jsxRuntime.jsx("svg",{viewBox:"0 -960 960 960",width:16,height:16,"aria-hidden":"true",focusable:"false",children:jsxRuntime.jsx("path",{d:e,fill:"currentColor"})}),Vt="M440-400h80v-120h120v-80H520v-120h-80v120H320v80h120v120ZM80-80v-720q0-33 23.5-56.5T160-880h640q33 0 56.5 23.5T880-800v480q0 33-23.5 56.5T800-240H240L80-80Zm126-240h594v-480H160v525l46-45Zm-46 0v-480 480Z",Kt="M240-400h480v-80H240v80Zm0-120h480v-80H240v80Zm0-120h480v-80H240v80ZM880-80 720-240H160q-33 0-56.5-23.5T80-320v-480q0-33 23.5-56.5T160-880h640q33 0 56.5 23.5T880-800v720ZM160-320h594l46 45v-525H160v480Zm0 0v-480 480Z",Yt="M382-240 154-468l57-57 171 171 367-367 57 57-424 424Z",Bt="m256-200-56-56 224-224-224-224 56-56 224 224 224-224 56 56-224 224 224 224-56 56-224-224-224 224Z",jt="M280-120q-33 0-56.5-23.5T200-200v-520h-40v-80h200v-40h240v40h200v80h-40v520q0 33-23.5 56.5T680-120H280Zm400-600H280v520h400v-520ZM360-280h80v-360h-80v360Zm160 0h80v-360h-80v360ZM280-720v520-520Z";function Ft({className:e,furniture:i,asChild:l,hidden:r,children:t,t:o,card:n,preset:a=true,stack:d=true,gap:c=8,filter:p,structural:w=false,formatting:R=false}){let y=react$1.useDocxEditor(),u=react$1.useEditorState(It),m=react.useMemo(()=>{let f=[];return w||f.push("structural"),R||f.push("format"),f.length>0?f:void 0},[w,R]),b=react.useMemo(()=>m?{excludeRevisionKinds:m}:void 0,[m]);react.useEffect(()=>(y?.setReviewActivationExclusions(m??null),()=>y?.setReviewActivationExclusions(null)),[y,m]);let T=me($t),N=me(b),E=N.setPaneOpen,{t:C}=react$1.useTranslation(),P=react.useCallback(f=>o?.(f)??C(f),[o,C]),D=react.useRef(null),de=react.useContext(react$1.ReviewRailContext);react.useEffect(()=>de?.register(),[de]);let j=N.paneOpen,I=react.useMemo(()=>p?N.items.filter(f=>p(f)):N.items,[N.items,p]),Ke=react.useMemo(()=>{let f=new Map;for(let v of I)v.author&&!f.has(v.author)&&f.set(v.author,f.size);return f},[I]),Ye=react.useMemo(()=>{let f=new Map;for(let v of I)f.set(v.id,v);return f},[I]),[Be,pt]=react.useState(()=>new Map),ye=react.useCallback((f,v)=>{v<=0||pt(x=>{if(x.get(f)===v)return x;let _=new Map(x);return _.set(f,v),_});},[]),be=react.useRef(new WeakMap),ee=react.useRef(null),je=react.useCallback((f,v)=>{!f||typeof ResizeObserver>"u"||(ye(v,f.offsetHeight),ee.current??(ee.current=new ResizeObserver(x=>{for(let _ of x){let h=be.current.get(_.target);h&&ye(h,_.target.offsetHeight);}})),be.current.get(f)!==v&&(be.current.set(f,v),ee.current.observe(f)));},[ye]);react.useEffect(()=>()=>ee.current?.disconnect(),[]);let[S,wt]=react.useState(Mt);react.useEffect(()=>{let f=D.current;if(!y||!f)return;let v=f.offsetParent,x=v?.querySelector(".docx-paginated-surface")??null,_=()=>{wt(M=>{let H=x&&v?x.getBoundingClientRect():null,O=H&&v?v.getBoundingClientRect():null,V={scale:y.getRenderScale(),top:H&&O&&v?H.top-O.top-v.clientTop+v.scrollTop:0,left:H&&O&&v?H.right-O.left-v.clientLeft+v.scrollLeft+Dt:null};return M.scale===V.scale&&M.top===V.top&&M.left===V.left?M:V});};_();let h=new ResizeObserver(_);return v&&h.observe(v),x&&h.observe(x),()=>h.disconnect()},[y,I,u,r]),react.useEffect(()=>{let f=D.current;if(!y||!f)return;let v=x=>{let _=x.target;if(!(_ instanceof Node)||f.contains(_))return;let h=f.offsetParent;!h||!h.contains(_)||h.querySelector(".docx-paginated-surface")?.contains(_)||y.setActiveReviewItem(null);};return document.addEventListener("mousedown",v,true),()=>document.removeEventListener("mousedown",v,true)},[y,u,r]);let[xe,Rt]=react.useState(null);react.useEffect(()=>{let f=D.current,v=f?.offsetParent;if(!v)return;let x=0,_=()=>{x=0,Rt(O=>{let V=v.scrollTop-it,ue=v.scrollTop+v.clientHeight+it;return O&&O.top===V&&O.bottom===ue?O:{top:V,bottom:ue}});},h=0,M=()=>{x===0&&(x=requestAnimationFrame(_)),f?.setAttribute("data-scrolling",""),window.clearTimeout(h),h=window.setTimeout(()=>f?.removeAttribute("data-scrolling"),150);};_(),v.addEventListener("scroll",M,{passive:true});let H=new ResizeObserver(M);return H.observe(v),()=>{x!==0&&cancelAnimationFrame(x),window.clearTimeout(h),v.removeEventListener("scroll",M),H.disconnect();}},[y,u,r]);let[F,ge]=react.useState(null),Fe=react.useCallback(()=>{y&&(y.surface?.retainSelection(),E(true),ge(y.getSelectionPlacement()?.anchorY??null));},[y,E]),Ze=react.useCallback(()=>{y?.surface?.releaseSelection(),ge(null),y?.focus();},[y]);react.useEffect(()=>{j||F===null||(y?.surface?.releaseSelection(),ge(null));},[j,F,y]);let Ue=F??N.selectionAnchorY,q=react.useMemo(()=>{let f=Ae(I);return I.filter(v=>!ke(v,f))},[I]),qe=react.useMemo(()=>{if(F===null)return q;let f=q.findIndex(x=>x.anchorY!==null&&x.anchorY>F),v={key:ve,anchorY:F};return f===-1?[...q,v]:[...q.slice(0,f),v,...q.slice(f)]},[q,F]),ze=react.useMemo(()=>{let f=new Map(Be);for(let v of q){if(f.has(v.key))continue;let x=v.text.length+(v.kind==="revision"?v.replacedText?.length??0:0),_=Math.min(6,Math.max(1,Math.ceil(x/36)));f.set(v.key,64+_*20);}return f},[Be,q]),{stacked:he,collapsedKeys:Qe}=react.useMemo(()=>{let f=S.scale,v=new Map,x=new Set,_=Number.NEGATIVE_INFINITY;for(let h of qe){let M=h.anchorY===null?Number.isFinite(_)?_:0:Math.max(h.anchorY,_);v.set(h.key,M);let H=h.anchorY===null?0:(M-h.anchorY)*f,O="isActive"in h&&h.isActive,V=H>Ot&&!O&&h.key!==ve;V&&x.add(h.key);let ue=V?Lt:ze.get(h.key)??St;_=M+(ue+c)/f;}return {stacked:v,collapsedKeys:x}},[qe,ze,c,S.scale]),Ne=Ue===null?null:S.top+(he.get(ve)??Ue)*S.scale,Ge=n?.className,yt=react.useMemo(()=>({t:o,cardClassName:Ge,review:{...N,items:I},allItems:T.items,authorSlots:Ke,byId:Ye,measure:je,beginDraft:Fe,endDraft:Ze}),[o,Ge,N,T.items,I,Ke,Ye,je,Fe,Ze]);if(r||u)return null;let We={ref:D,className:`docx-review${e?` ${e}`:""}`,"data-testid":"review-rail","data-count":I.length,"data-open":j?"":void 0,role:"complementary","aria-label":P("review.ariaLabel"),onMouseDown:U,style:S.left===null?void 0:{left:S.left,right:"auto"}},Xe=typeof t=="function"?{}:lt(t),te=(f,v)=>f in Xe?Xe[f]:v,Je=a?jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[te("AddComment",jsxRuntime.jsx(Te,{top:Ne,drafting:F!==null})),!j||F===null||Ne===null?null:te("Draft",jsxRuntime.jsx(Me,{top:Ne})),te("Balloon",jsxRuntime.jsx(De,{}))]}):null,bt=a?j?te("List",jsxRuntime.jsx(fe,{stack:d,positions:he,collapsed:Qe,scale:S.scale,offset:S.top,window:xe,children:t})):te("Markers",jsxRuntime.jsx(Ie,{scale:S.scale,offset:S.top,window:xe})):typeof t=="function"?null:t;return jsxRuntime.jsx(Pe.Provider,{value:yt,children:l&&react.isValidElement(t)?jsxRuntime.jsx(react$1.Slot,{...We,children:react.cloneElement(t,void 0,t.props.children,a?jsxRuntime.jsx(fe,{stack:d,positions:he,collapsed:Qe,scale:S.scale,offset:S.top,window:xe}):null,Je)}):jsxRuntime.jsxs("aside",{...We,children:[j&&i!==void 0?jsxRuntime.jsx("div",{className:"docx-review__furniture","data-testid":"review-furniture",children:i}):null,bt,Je]})})}function fe({stack:e=true,positions:i,collapsed:l,scale:r=1,offset:t=0,window:o=null,children:n,className:a,hidden:d}){let{review:c,measure:p,cardClassName:w}=$();if(d)return null;let R=Ae(c.items),y=c.items.filter(u=>!ke(u,R));return y.length===0?typeof n=="function"?null:jsxRuntime.jsx(Se,{}):jsxRuntime.jsx("div",{className:`docx-review__list${a?` ${a}`:""}`,children:y.map(u=>{let m=e?i?.get(u.key)??u.anchorY:u.anchorY,b=m==null?null:t+m*r;if(b!==null&&o&&(b<o.top||b>o.bottom))return null;let T=b===null?{}:{position:"absolute",top:b};return jsxRuntime.jsx(k.Provider,{value:u,children:jsxRuntime.jsx("div",{className:"docx-review__slot",style:T,...l?.has(u.key)?{"data-collapsed":""}:{},ref:N=>{p(N,u.key);},children:typeof n=="function"?n(u):jsxRuntime.jsx(Le,{...w?{className:w}:{},children:n})})},u.key)})})}fe.docxReviewPart="List";function Ie({scale:e=1,offset:i=0,window:l=null,className:r,hidden:t}){let{review:o}=$(),n=B();if(t)return null;let a=Ae(o.items),d=o.items.filter(c=>!ke(c,a));return jsxRuntime.jsx("div",{className:`docx-review__markers${r?` ${r}`:""}`,children:d.map(c=>{if(c.anchorY===null)return null;let p=i+c.anchorY*e;return l&&(p<l.top||p>l.bottom)?null:jsxRuntime.jsx("button",{type:"button",className:"docx-review__marker","data-testid":"review-marker","data-kind":c.kind==="revision"?c.revisionKind:c.kind,style:{position:"absolute",top:p},title:c.author?`${c.author}: ${c.text}`:c.text,"aria-label":`${n("review.showPane")}: ${c.author?`${c.author}. `:""}${c.text}`,onMouseDown:U,onClick:()=>{o.setPaneOpen(true),o.setActive(c.key);},children:oe(Kt)},c.key)})})}Ie.docxReviewPart="Markers";function Te({top:e,drafting:i=false,className:l,hidden:r,children:t}){let{beginDraft:o}=$(),n=B();if(r||i||e===null)return null;let a={type:"button",className:`docx-review__add${l?` ${l}`:""}`,"data-testid":"review-add-comment",style:{position:"absolute",top:e},"aria-label":n("common.comment"),title:n("common.comment"),onMouseDown:U,onClick:o};return t?jsxRuntime.jsx(react$1.Slot,{...a,children:t}):jsxRuntime.jsx("button",{...a,children:oe(Vt)})}Te.docxReviewPart="AddComment";function Me({top:e,className:i,hidden:l}){let{review:r,endDraft:t,measure:o}=$(),n=B(),[a,d]=react.useState(""),[c,p]=react.useState(false),w=react.useRef(null),R=react.useId();react.useEffect(()=>{w.current?.focus({preventScroll:true});},[]);let y=react.useCallback(()=>{if(a.trim().length===0)return;let u=r.comment(a.trim());p(!u),u&&(d(""),t());},[a,r,t]);return l?null:jsxRuntime.jsx("div",{className:`docx-review__slot${i?` ${i}`:""}`,style:{position:"absolute",top:e},ref:u=>{o(u,ve);},children:jsxRuntime.jsx("div",{className:"docx-review__card","data-testid":"review-draft","data-draft":"",children:jsxRuntime.jsxs("form",{className:"docx-review__reply-box",onSubmit:u=>{u.preventDefault(),y();},children:[jsxRuntime.jsx("label",{className:"docx-editor-sr-only",htmlFor:R,children:n("comments.addComment")}),jsxRuntime.jsx("input",{id:R,ref:w,"data-testid":"review-draft-input",className:"docx-review__input",value:a,placeholder:n("comments.addComment"),...c?{"aria-invalid":true}:{},onChange:u=>{p(false),d(u.target.value);},onKeyDown:u=>{if(u.key==="Escape"){u.preventDefault(),t();return}u.key==="Enter"&&(u.preventDefault(),y());}}),jsxRuntime.jsxs("div",{className:"docx-review__reply-actions",children:[jsxRuntime.jsx("button",{type:"button","data-testid":"review-draft-cancel",className:"docx-review__text-button",onMouseDown:U,onClick:t,children:n("common.cancel")}),jsxRuntime.jsx("button",{type:"submit","data-testid":"review-draft-submit",className:"docx-review__submit",disabled:a.trim().length===0,children:n("common.comment")})]}),c?jsxRuntime.jsx("span",{className:"docx-review__refused",role:"alert",children:n("review.commentRefused")}):null]})})})}Me.docxReviewPart="Draft";function De({className:e,hidden:i}){let{review:l,allItems:r,authorSlots:t}=$(),o=B(),n=react.useRef(null),[a,d]=react.useState(null),c=react.useRef(false);c.current=a!==null,react.useEffect(()=>{let u=n.current,m=u?.closest(".docx-review"),b=m?.closest(".docx-editor__scroll-container")??m?.offsetParent;if(!u||!m||!b)return;let T=(E,C)=>{let P=m.getBoundingClientRect(),D=E.getBoundingClientRect(),de=E.ownerDocument.defaultView?.innerHeight??1/0,j=Number(E.dataset.start),I=Number(E.dataset.end);d({revisionId:E.dataset.revisionId,author:E.dataset.revisionAuthor??"",...E.dataset.revisionDate!==void 0?{date:E.dataset.revisionDate}:{},...E.dataset.revisionKind!==void 0?{kind:E.dataset.revisionKind}:{},structuralSite:C,...E.dataset.paragraphId!==void 0?{paragraphId:E.dataset.paragraphId}:{},...Number.isFinite(j)?{start:j}:{},...Number.isFinite(I)?{end:I}:{},left:D.left-P.left,top:D.top-P.top,bottom:D.bottom-P.top,above:D.bottom+220>de});},N=E=>{let C=E.target;if(!(C instanceof Element)||u.contains(C))return;let P=C.closest("[data-revision-id]");if(P instanceof HTMLElement&&b.contains(P)){let D=P.classList.contains("docx-table-row--revision");if(P.dataset.revisionKind==="format"||D){T(P,D);return}}c.current&&d(null);};return b.addEventListener("pointerdown",N,true),b.addEventListener("mousedown",N,true),()=>{b.removeEventListener("pointerdown",N,true),b.removeEventListener("mousedown",N,true);}},[]);let p=react.useMemo(()=>{if(!a)return null;let u=null,m=false,b=null,T=false,N=null,E=false;for(let C of r)if(!(C.kind!=="revision"||C.item.kind!=="revision")){for(let P of C.item.addresses)if(P.id===a.revisionId){if(P.author===a.author){if(P.date===a.date)return C;u===null?u=C:u!==C&&(m=true);}b===null?b=C:b!==C&&(T=true);}if(a.paragraphId!==void 0&&a.start!==void 0&&a.end!==void 0&&(C.revisionKind==="format"||C.revisionKind==="structural")){for(let P of C.item.ranges)if(P.start.paragraphId===a.paragraphId&&P.start.offset<a.end&&P.end.offset>a.start){N===null?N=C:N!==C&&(E=true);break}}}return u!==null&&!m?u:b!==null&&!T?b:N!==null&&!E?N:null},[r,a]),w=p&&(p.revisionKind==="format"||p.revisionKind==="structural")?p:null,R=react.useRef(false);if(react.useEffect(()=>{if(w){R.current=true;return}R.current&&(R.current=false,d(null));},[w]),i)return null;let y=a?.kind==="format"?"format":"structural";return jsxRuntime.jsx("div",{ref:n,className:`docx-review__balloon-root${e?` ${e}`:""}`,children:a===null?null:jsxRuntime.jsx("div",{className:"docx-review__balloon","data-testid":"review-balloon",style:{left:a.left,top:a.above?a.top-6:a.bottom+6,transform:a.above?"translateY(-100%)":void 0},onMouseDown:U,children:w?jsxRuntime.jsx(k.Provider,{value:w,children:jsxRuntime.jsxs("div",{className:"docx-review__card","data-testid":"review-balloon-card","data-kind":w.revisionKind??"revision",style:{"--doc-review-author":`var(--doc-review-author-${(t.get(w.author)??0)%st})`},onClick:()=>l.setActive(w.key),children:[jsxRuntime.jsxs("div",{className:"docx-review__head",children:[jsxRuntime.jsx(re,{}),jsxRuntime.jsxs("div",{className:"docx-review__meta",children:[jsxRuntime.jsx(ie,{}),jsxRuntime.jsx(ae,{})]}),w.kind==="revision"&&!w.readOnly?jsxRuntime.jsxs("div",{className:"docx-review__actions",children:[jsxRuntime.jsx(pe,{}),jsxRuntime.jsx(we,{})]}):null]}),jsxRuntime.jsx(se,{})]})}):jsxRuntime.jsxs("div",{className:"docx-review__card","data-testid":"review-balloon-card","data-kind":y,children:[jsxRuntime.jsxs("div",{className:"docx-review__head",children:[jsxRuntime.jsx("span",{className:"docx-review__avatar","aria-hidden":"true",children:Zt(a.author)}),jsxRuntime.jsxs("div",{className:"docx-review__meta",children:[jsxRuntime.jsx("span",{className:"docx-review__author",children:a.author||o("comments.unknown")}),a.date?jsxRuntime.jsx(Ut,{raw:a.date}):null]})]}),jsxRuntime.jsx("div",{className:"docx-review__summary",children:jsxRuntime.jsx("span",{className:"docx-review__label","data-kind":y,children:o(dt(y))})})]})})})}De.docxReviewPart="Balloon";function Zt(e){let i=e.trim().split(/\s+/).filter(Boolean);return i.length===0?"?":i.slice(0,2).map(l=>l[0].toUpperCase()).join("")}function Ut({raw:e}){let i=new Date(e);return Number.isNaN(i.getTime())?null:jsxRuntime.jsx("time",{className:"docx-review__time",dateTime:e,children:ct.format(i)})}function Se({className:e,hidden:i,children:l}){let r=B();return i?null:jsxRuntime.jsx("div",{className:`docx-review__empty${e?` ${e}`:""}`,"data-testid":"review-empty",children:l??r("review.empty")})}Se.docxReviewPart="Empty";function Le({className:e,asChild:i,hidden:l,children:r}){let{review:t,authorSlots:o}=$(),n=react.useContext(k),a=react.useId();if(l||!n)return null;let d=o.get(n.author)??0,c={className:`docx-review__card${e?` ${e}`:""}`,"data-testid":"review-card","aria-labelledby":`${a}-author ${a}-summary`,"data-kind":n.kind==="revision"?n.revisionKind??"revision":n.kind,...n.kind==="custom"&&n.item.kind==="custom"?{"data-node-name":n.item.name}:{},...n.isActive?{"data-active":""}:{},...n.kind==="comment"&&n.resolved?{"data-resolved":""}:{},style:{"--doc-review-author":`var(--doc-review-author-${d%st})`},tabIndex:0,role:"button",id:a,onMouseDown:p=>{p.target?.closest("[data-review-selectable]")||p.currentTarget.focus({preventScroll:true});},onClick:()=>t.setActive(n.key),onKeyDown:p=>{p.target===p.currentTarget&&(p.key!=="Enter"&&p.key!==" "||(p.preventDefault(),t.setActive(n.key)));}};return i?jsxRuntime.jsx(react$1.Slot,{...c,children:r}):jsxRuntime.jsx("div",{...c,children:jsxRuntime.jsx(qt,{children:r})})}Le.docxReviewPart="Card";function qt({children:e}){let i=react.useContext(k),l=react.useMemo(()=>lt(e),[e]),r=(o,n)=>o in l?l[o]:n;if(!i)return null;if(i.kind==="custom"&&i.item.kind==="custom"){let o=i.item;return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsxs("div",{className:"docx-review__head",children:[r("Avatar",null),jsxRuntime.jsx("div",{className:"docx-review__meta",children:r("Author",jsxRuntime.jsx("span",{className:"docx-review__author","data-testid":"review-custom-title",children:o.title}))})]}),r("Summary",o.detail?jsxRuntime.jsx("div",{className:"docx-review__summary","data-testid":"review-summary","data-review-selectable":"",children:jsxRuntime.jsx("span",{className:"docx-review__text",children:o.detail})}):null),l.__extra]})}let t=i.kind==="revision"&&!i.readOnly;return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsxs("div",{className:"docx-review__head",children:[r("Avatar",jsxRuntime.jsx(re,{})),jsxRuntime.jsxs("div",{className:"docx-review__meta",children:[r("Author",jsxRuntime.jsx(ie,{})),r("Time",jsxRuntime.jsx(ae,{}))]}),t||i.kind==="comment"?jsxRuntime.jsxs("div",{className:"docx-review__actions",children:[r("Accept",jsxRuntime.jsx(pe,{})),r("Reject",jsxRuntime.jsx(we,{})),r("Delete",jsxRuntime.jsx(Re,{}))]}):null]}),r("Summary",jsxRuntime.jsx(se,{})),r("Replies",jsxRuntime.jsx(Oe,{})),r("Reply",jsxRuntime.jsx($e,{})),l.__extra]})}function lt(e){let i={},l=[],r=t=>{if(Array.isArray(t)){t.forEach(r);return}if(!t||typeof t!="object"||!("type"in t)){t&&l.push(t);return}if(t.type===react.Fragment){r(t.props.children);return}let o=t.type.docxReviewPart;o?i[o]=t:l.push(t);};return r(e),l.length>0&&(i.__extra=l),i}function re({className:e,asChild:i,hidden:l,children:r}){let t=react.useContext(k);if(l||!t||r===void 0&&!t.initials)return null;let o={className:`docx-review__avatar${e?` ${e}`:""}`,"data-testid":"review-avatar","aria-hidden":true};return i?jsxRuntime.jsx(react$1.Slot,{...o,children:r}):jsxRuntime.jsx("span",{...o,children:r??t.initials})}re.docxReviewPart="Avatar";function ie({className:e,asChild:i,hidden:l,children:r}){let t=react.useContext(k),o=B();if(l||!t)return null;let n=t.author||o("comments.unknown"),a={className:`docx-review__author${e?` ${e}`:""}`,"data-testid":"review-author"};return i?jsxRuntime.jsx(react$1.Slot,{...a,children:r}):jsxRuntime.jsx("span",{...a,children:r??n})}ie.docxReviewPart="Author";function ae({className:e,asChild:i,hidden:l,children:r}){let t=react.useContext(k);if(l||!t)return null;let o=t.date;if(!o)return null;let n=new Date(o);if(Number.isNaN(n.getTime()))return null;let a={className:`docx-review__time${e?` ${e}`:""}`,"data-testid":"review-time",dateTime:o};return i?jsxRuntime.jsx(react$1.Slot,{...a,children:r}):jsxRuntime.jsx("time",{...a,children:r??ct.format(n)})}ae.docxReviewPart="Time";var ct=new Intl.DateTimeFormat(void 0,{month:"short",day:"numeric",hour:"numeric",minute:"2-digit"});function se({className:e,asChild:i,hidden:l,children:r}){let t=react.useContext(k),o=B();if(l||!t)return null;let n=t.text,a=t.kind!=="revision"?null:o(dt(t.revisionKind)),d=t.kind==="revision"&&t.revisionKind==="replace",c={className:`docx-review__summary${e?` ${e}`:""}`,"data-testid":"review-summary","data-review-selectable":""};return i?jsxRuntime.jsx(react$1.Slot,{...c,children:r}):jsxRuntime.jsx("div",{...c,children:r??(d?jsxRuntime.jsxs("span",{className:"docx-review__text",children:[o("review.replaced")," ",jsxRuntime.jsxs("span",{className:"docx-review__removed",children:['"',t.replacedText,'"']})," ",o("review.replacedWith")," ",jsxRuntime.jsxs("span",{className:"docx-review__added",children:['"',n,'"']})]}):jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[a?jsxRuntime.jsx("span",{className:"docx-review__label","data-kind":t.kind==="revision"?t.revisionKind:"revision",children:a}):null,n?jsxRuntime.jsx("span",{className:"docx-review__text",children:n}):null]}))})}se.docxReviewPart="Summary";function dt(e){switch(e){case "insert":return "review.inserted";case "delete":return "review.deleted";case "replace":return "review.replaced";case "moveFrom":return "review.movedFrom";case "moveTo":return "review.movedTo";case "format":return "revisions.runPropertiesChanged";case "paragraphMark":return "revisions.paragraphMarkInserted";default:return "review.structural"}}function pe({className:e,asChild:i,hidden:l,children:r,icon:t}){let{review:o}=$(),n=react.useContext(k),a=B();if(l||!n||n.kind!=="revision"||n.readOnly)return null;let d=a("review.accept"),c={type:"button",className:`docx-review__action${e?` ${e}`:""}`,"data-testid":"review-accept","aria-label":d,title:d,onMouseDown:U,onClick:p=>{p.stopPropagation(),o.accept(n);}};return i?jsxRuntime.jsx(react$1.Slot,{...c,children:r}):jsxRuntime.jsx("button",{...c,children:t??r??oe(Yt)})}pe.docxReviewPart="Accept";function we({className:e,asChild:i,hidden:l,children:r,icon:t}){let{review:o}=$(),n=react.useContext(k),a=B();if(l||!n||n.kind!=="revision"||n.readOnly)return null;let d=a("review.reject"),c={type:"button",className:`docx-review__action${e?` ${e}`:""}`,"data-testid":"review-reject","aria-label":d,title:d,onMouseDown:U,onClick:p=>{p.stopPropagation(),o.reject(n);}};return i?jsxRuntime.jsx(react$1.Slot,{...c,children:r}):jsxRuntime.jsx("button",{...c,children:t??r??oe(Bt)})}we.docxReviewPart="Reject";function Re({className:e,asChild:i,hidden:l,children:r,icon:t}){let{review:o}=$(),n=react.useContext(k),{t:a}=react$1.useTranslation();if(l||!n||n.kind==="custom"||n.kind==="revision"&&n.readOnly)return null;let d=n.kind==="comment"?a("review.deleteComment"):a("review.discardChange"),c={type:"button",className:`docx-review__action${e?` ${e}`:""}`,"data-testid":"review-delete","aria-label":d,title:d,onMouseDown:U,onClick:p=>{p.stopPropagation(),o.remove(n);}};return i?jsxRuntime.jsx(react$1.Slot,{...c,children:r}):jsxRuntime.jsx("button",{...c,children:t??r??oe(jt)})}Re.docxReviewPart="Delete";function Oe({className:e,hidden:i}){let{byId:l}=$(),r=react.useContext(k);if(i||!r||r.kind==="custom")return null;let t=r.replyIds.map(o=>l.get(o)).filter(o=>o!==void 0);return t.length===0?null:jsxRuntime.jsx("ol",{className:`docx-review__replies${e?` ${e}`:""}`,children:t.map(o=>jsxRuntime.jsx(k.Provider,{value:o,children:jsxRuntime.jsxs("li",{className:"docx-review__reply","data-testid":"review-reply",children:[jsxRuntime.jsxs("div",{className:"docx-review__head",children:[jsxRuntime.jsx(re,{}),jsxRuntime.jsxs("div",{className:"docx-review__meta",children:[jsxRuntime.jsx(ie,{}),jsxRuntime.jsx(ae,{})]}),jsxRuntime.jsx("div",{className:"docx-review__actions",children:jsxRuntime.jsx(Re,{})})]}),jsxRuntime.jsx(se,{})]})},o.key))})}Oe.docxReviewPart="Replies";function $e({className:e,hidden:i,children:l}){let{review:r}=$(),t=react.useContext(k),o=B(),[n,a]=react.useState(""),[d,c]=react.useState(false),p=react.useId(),w=react.useCallback(()=>{if(!t||n.trim().length===0)return;let R=r.reply(t,n.trim());c(!R),R&&a("");},[t,n,r]);return i||!t||!t.isActive?null:l?jsxRuntime.jsx(jsxRuntime.Fragment,{children:l}):jsxRuntime.jsxs("form",{className:`docx-review__reply-box${e?` ${e}`:""}`,onSubmit:R=>{R.preventDefault(),w();},children:[jsxRuntime.jsx("label",{className:"docx-editor-sr-only",htmlFor:p,children:o("comments.replyPlaceholder")}),jsxRuntime.jsx("input",{id:p,"data-testid":"review-reply-input",className:"docx-review__input",value:n,placeholder:o("comments.replyPlaceholder"),...d?{"aria-invalid":true,"data-refused":""}:{},onChange:R=>{c(false),a(R.target.value);},onClick:R=>R.stopPropagation(),onKeyDown:R=>{R.key==="Enter"&&(R.preventDefault(),w());}}),jsxRuntime.jsxs("div",{className:"docx-review__reply-actions",children:[jsxRuntime.jsx("button",{type:"button","data-testid":"review-reply-cancel",className:"docx-review__text-button",onMouseDown:U,onClick:R=>{R.stopPropagation(),a(""),c(false),r.setActive(null);},children:o("common.cancel")}),jsxRuntime.jsx("button",{type:"submit","data-testid":"review-reply-submit",className:"docx-review__submit",disabled:n.trim().length===0,children:o("review.reply")})]}),d?jsxRuntime.jsx("span",{className:"docx-review__refused",role:"alert","data-testid":"review-reply-refused",children:o("review.replyRefused")}):null]})}$e.docxReviewPart="Reply";var zt=Object.assign(Ft,{List:fe,Empty:Se,Card:Le,Avatar:re,Author:ie,Time:ae,Summary:se,Accept:pe,Reject:we,Delete:Re,Replies:Oe,Reply:$e,Markers:Ie,AddComment:Te,Draft:Me,Balloon:De});function le(e){let i=react$1.useDocxEditor();return react.useMemo(()=>e||(i?.getCustomNodeDefinitions()??[]).filter(chunkMNK6DXJQ_cjs.j),[e,i])}var Xt=".docx-content-control-boundary";function X(e,i){let{node:l,definition:r,controlId:t}=e,o=t?i?.getReviewItems().find(d=>d.kind==="custom"&&d.item.id===t):void 0;if(o&&o.kind==="custom"){let d=o.item;return {...l,attrs:d.attrs,text:d.text,...d.data===void 0?{}:{data:d.data},...t?{nodeId:t}:{}}}let n=t?Jt(i,t,r):void 0,a=r.fromDocx?r.fromDocx({attrs:l.attrs,text:"",...n===void 0?{}:{data:n}}):l.attrs;return a===null?null:{...l,attrs:a,...n===void 0?{}:{data:n},...t?{nodeId:t}:{}}}function Jt(e,i,l){let r=e?.surface;if(!r)return;let t=r.session.part(),o=store.customNodePayloadsByControl(r.session.currentPackage(),t.name).get(i);if(!o)return;let n=chunkMNK6DXJQ_cjs.e(l.schema,o.data);return n.ok?n.value:void 0}function J(e,i){let l=e?.closest?.(Xt),r=l?.closest(".docx-content-control-chrome"),t=r?.getAttribute("data-tag"),o=t?chunkMNK6DXJQ_cjs.c(t):null;if(!l||!o||!t)return null;let n=i.find(a=>a.tagPrefix===o.prefix&&a.name===o.name);return n?{node:{name:o.name,attrs:o.attrs,tag:t,rect:l.getBoundingClientRect()},definition:n,controlId:r?.getAttribute("data-docx-content-control")??null}:null}var He=".docx-content-control-boundary",tn=e=>{if(!chunkMNK6DXJQ_cjs.k.test(e.tagPrefix)||!chunkMNK6DXJQ_cjs.k.test(e.name))return [];let i=`${e.tagPrefix}:${e.name}`;return [`.docx-content-control-chrome[data-tag="${i}"]`,`.docx-content-control-chrome[data-tag^="${i}?"]`]};function nn(e){let{onNodeClick:i,onNodeHover:l}=e,r=react$1.useDocxEditor(),t=le(e.nodes);return react.useEffect(()=>{let o=document.createElement("style"),n=[];for(let a of t){let d=tn(a);if(d.length===0)continue;let c=a.chrome?.color!==void 0&&CSS.supports("color",a.chrome.color)?a.chrome.color:"#2563eb";n.push(`${d.map(p=>`${p} ${He}`).join(", ")} {`," pointer-events: auto !important;"," opacity: 1;"," border: none;",` background: color-mix(in srgb, ${c} 12%, transparent);`," border-radius: 6px;"," cursor: default;","}");}return o.textContent=n.join(`
|
|
2
|
-
`),document.head.append(o),()=>o.remove()},[t]),react.useEffect(()=>{let o=null,n=null,a=w=>
|
|
1
|
+
'use strict';var chunkA7NTVTWG_cjs=require('../chunk-A7NTVTWG.cjs'),react=require('react'),react$1=require('@docx-editor.dev/react'),jsxRuntime=require('react/jsx-runtime'),store=require('@docx-editor.dev/core/store');function me(e){let i=react$1.useDocxEditor();return it(i,e)}function it(e,i){let l=react.useCallback(f=>{if(!e)return ()=>{};let x=e.on("change",f),A=e.on("selectionChange",f),N=e.on("error",f);return ()=>{x(),A(),N();}},[e]),r=react.useSyncExternalStore(l,()=>e?`${e.getReviewRevision()}`:"none",()=>"none"),t=react.useMemo(()=>e?e.getReviewItems(i).filter(f=>f.item.kind!=="custom"||f.item.carded):[],[e,r,i]),o=react.useMemo(()=>t.find(f=>f.isActive)?.key??null,[t]),n=react.useCallback((f,x)=>e?e.setActiveReviewItem(f,x).ok:false,[e]),a=react.useCallback(f=>!e||f.kind!=="revision"||f.readOnly?false:e.acceptReviewItem(f.key).ok,[e]),d=react.useCallback(f=>!e||f.kind!=="revision"||f.readOnly?false:e.rejectReviewItem(f.key).ok,[e]),u=react.useCallback(f=>!e||f.kind==="custom"||f.kind==="revision"&&f.readOnly?false:e.deleteReviewItem(f.key).ok,[e]),c=react.useCallback((f,x,A)=>x.trim().length===0||!e?false:e.replyToReviewItem(f.key,x,A).ok,[e]),w=react.useMemo(()=>e?e.getSelectionPlacement()?.anchorY??null:null,[e,r]),R=react.useCallback((f,x)=>f.trim().length===0||!e?false:e.addComment(f,x).ok,[e]),y=react.useMemo(()=>e?e.isReviewPaneOpen():true,[e,r]),v=react.useCallback(f=>{!e||e.isReviewPaneOpen()===f||e.exec({type:"toggleReviewPane"});},[e]);return react.useMemo(()=>({items:t,activeKey:o,setActive:n,accept:a,reject:d,remove:u,reply:c,selectionAnchorY:w,comment:R,paneOpen:y,setPaneOpen:v,ready:e!==null&&!e.snapshot().isLoading&&e.snapshot().parseError===null}),[t,o,n,a,d,u,c,w,R,y,v,e])}function Mt(e,i,l={}){let r=l.gap??8,t=l.scale??1,o=l.defaultHeight??0;return react.useMemo(()=>{let n=new Map,a=Number.NEGATIVE_INFINITY;for(let d of e){let u=d.anchorY===null?Number.isFinite(a)?a:0:Math.max(d.anchorY,a);n.set(d.key,u),a=u+((i.get(d.key)??o)+r)/t;}return n},[e,i,r,t,o])}var X=e=>jsxRuntime.jsx("svg",{viewBox:"0 -960 960 960",width:16,height:16,"aria-hidden":"true",focusable:"false",children:jsxRuntime.jsx("path",{d:e,fill:"currentColor"})}),lt="M440-400h80v-120h120v-80H520v-120h-80v120H320v80h120v120ZM80-80v-720q0-33 23.5-56.5T160-880h640q33 0 56.5 23.5T880-800v480q0 33-23.5 56.5T800-240H240L80-80Zm126-240h594v-480H160v525l46-45Zm-46 0v-480 480Z",at="M240-400h480v-80H240v80Zm0-120h480v-80H240v80Zm0-120h480v-80H240v80ZM880-80 720-240H160q-33 0-56.5-23.5T80-320v-480q0-33 23.5-56.5T160-880h640q33 0 56.5 23.5T880-800v720ZM160-320h594l46 45v-525H160v480Zm0 0v-480 480Z",ct="M382-240 154-468l57-57 171 171 367-367 57 57-424 424Z",dt="m256-200-56-56 224-224-224-224 56-56 224 224 224-224 56 56-224 224 224 224-56 56-224-224-224 224Z",ut="M280-120q-33 0-56.5-23.5T200-200v-520h-40v-80h200v-40h240v40h200v80h-40v520q0 33-23.5 56.5T680-120H280Zm400-600H280v520h400v-520ZM360-280h80v-360h-80v360Zm160 0h80v-360h-80v360ZM280-720v520-520Z",Dt="M200-200h57l391-391-57-57-391 391v57Zm-80 80v-170l528-527q12-11 26.5-17t30.5-6q16 0 31 6t26 18l55 56q12 11 17.5 26t5.5 30q0 16-5.5 30.5T817-647L290-120H120Zm640-584-56-56 56 56Zm-141 85-28-29 57 57-29-28Z",St="M486-160q-76 0-135-45t-85-123l88-38q14 48 48.5 78t85.5 30q42 0 76-20t34-64q0-18-7-33t-19-27h112q5 14 7.5 28.5T694-341q0 86-61.5 133.5T486-160ZM80-520v-80h800v80H80Zm402-360q66 0 116 30t74 84l-88 38q-11-28-38.5-47T480-794q-42 0-72 19t-30 51q0 15 6 27t18 22H272q-6-13-9-27t-3-30q0-70 55-114t167-44Z",Ot="M360-160q-83 0-141.5-58.5T160-360v-360q0-83 58.5-141.5T360-920q83 0 141.5 58.5T560-720v360q0 83-58.5 141.5T360-160Zm0-80q50 0 85-35t35-85v-360q0-50-35-85t-85-35q-50 0-85 35t-35 85v360q0 50 35 85t85 35Zm300 80q29 0 49.5-20.5T730-230q0-22-12.5-40T684-296l-64-32v-232l100 100q23 23 51.5 35.5T832-412v-80q-17 0-32-6.5T773-517L633-657q-12-12-27.5-17.5T573-680h-13v520h100ZM360-720Z",Lt="M580-360q-25 0-42.5-17.5T520-420v-160q0-25 17.5-42.5T580-640h160q25 0 42.5 17.5T800-580v260q0 66-47 113t-113 47v-80q33 0 56.5-23.5T720-320v-40H580Zm-360 0q-25 0-42.5-17.5T160-420v-160q0-25 17.5-42.5T220-640h160q25 0 42.5 17.5T440-580v260q0 66-47 113t-113 47v-80q33 0 56.5-23.5T360-320v-40H220Z";function mt(e){if(e.kind==="comment")return at;if(e.kind==="custom")return e.item.icon??Lt;switch(e.revisionKind){case "insert":case "moveTo":return Dt;case "delete":case "moveFrom":return St;case "format":return Ot;default:return at}}var Kt=e=>e.isLoading||e.parseError!==null||e.pageSetup==null,Ie=react.createContext(null),I=react.createContext(null);function Yt(){return react.useContext(I)}var Zt={scale:96/72,top:0,left:null},Bt=16,ve="\0compose",ft=600,wt=8,Ft=72,jt=64,Ut=480,zt=Object.freeze({placement:false});function Pe(e,i){return e.kind!=="comment"?false:e.parentId!==void 0?i.has(e.parentId):e.parentRevisionId!==void 0?i.has(e.parentRevisionId):false}function ke(e){return new Set(e.map(i=>i.id))}function j(e){let i=e.target?.tagName;i==="INPUT"||i==="SELECT"||i==="TEXTAREA"||e.preventDefault();}function H(){let e=react.useContext(Ie);return e||Qt}function Y(){let{t:e}=react.useContext(Ie)??{},{t:i}=react$1.useTranslation();return react.useCallback(l=>e?.(l)??i(l),[e,i])}var Qt={t:void 0,cardClassName:void 0,review:{items:[],activeKey:null,setActive:()=>false,accept:()=>false,reject:()=>false,remove:()=>false,reply:()=>false,selectionAnchorY:null,comment:()=>false,paneOpen:true,setPaneOpen:()=>{},ready:false},allItems:[],authorSlots:new Map,byId:new Map,measure:()=>{},beginDraft:()=>{},endDraft:()=>{}};function Gt({className:e,furniture:i,asChild:l,hidden:r,children:t,t:o,card:n,preset:a=true,stack:d=true,gap:u=8,filter:c,structural:w=false,formatting:R=false}){let y=react$1.useDocxEditor(),v=react$1.useEditorState(Kt),f=react.useMemo(()=>{let p=[];return w||p.push("structural"),R||p.push("format"),p.length>0?p:void 0},[w,R]),x=react.useMemo(()=>f?{excludeRevisionKinds:f}:void 0,[f]);react.useEffect(()=>(y?.setReviewActivationExclusions(f??null),()=>y?.setReviewActivationExclusions(null)),[y,f]);let A=me(zt),N=me(x),E=N.setPaneOpen,{t:C}=react$1.useTranslation(),T=react.useCallback(p=>o?.(p)??C(p),[o,C]),D=react.useRef(null),de=react.useContext(react$1.ReviewRailContext);react.useEffect(()=>de?.register(),[de]);let Z=N.paneOpen,k=react.useMemo(()=>c?N.items.filter(p=>c(p)):N.items,[N.items,c]),Ke=react.useMemo(()=>{let p=new Map;for(let m of k)m.author&&!p.has(m.author)&&p.set(m.author,p.size);return p},[k]),Ye=react.useMemo(()=>{let p=new Map;for(let m of k)p.set(m.id,m);return p},[k]),[Ze,_t]=react.useState(()=>new Map),ye=react.useCallback((p,m)=>{m<=0||_t(b=>{if(b.get(p)===m)return b;let _=new Map(b);return _.set(p,m),_});},[]),be=react.useRef(new WeakMap),te=react.useRef(null),Be=react.useCallback((p,m)=>{!p||typeof ResizeObserver>"u"||(ye(m,p.offsetHeight),te.current??(te.current=new ResizeObserver(b=>{for(let _ of b){let g=be.current.get(_.target);g&&ye(g,_.target.offsetHeight);}})),be.current.get(p)!==m&&(be.current.set(p,m),te.current.observe(p)));},[ye]);react.useEffect(()=>()=>te.current?.disconnect(),[]);let[S,Ct]=react.useState(Zt);react.useEffect(()=>{let p=D.current;if(!y||!p)return;let m=p.offsetParent,b=m?.querySelector(".docx-paginated-surface")??null,_=()=>{Ct(M=>{let q=b&&m?b.getBoundingClientRect():null,L=q&&m?m.getBoundingClientRect():null,$={scale:y.getRenderScale(),top:q&&L&&m?q.top-L.top-m.clientTop+m.scrollTop:0,left:q&&L&&m?q.right-L.left-m.clientLeft+m.scrollLeft+Bt:null};return M.scale===$.scale&&M.top===$.top&&M.left===$.left?M:$});};_();let g=new ResizeObserver(_);return m&&g.observe(m),b&&g.observe(b),()=>g.disconnect()},[y,k,v,r]),react.useEffect(()=>{let p=D.current;if(!y||!p)return;let m=b=>{let _=b.target;if(!(_ instanceof Node)||p.contains(_))return;let g=p.offsetParent;!g||!g.contains(_)||g.querySelector(".docx-paginated-surface")?.contains(_)||y.setActiveReviewItem(null);};return document.addEventListener("mousedown",m,true),()=>document.removeEventListener("mousedown",m,true)},[y,v,r]);let[xe,Et]=react.useState(null);react.useEffect(()=>{let p=D.current,m=p?.offsetParent;if(!m)return;let b=0,_=()=>{b=0,Et(L=>{let $=m.scrollTop-ft,ue=m.scrollTop+m.clientHeight+ft;return L&&L.top===$&&L.bottom===ue?L:{top:$,bottom:ue}});},g=0,M=()=>{b===0&&(b=requestAnimationFrame(_)),p?.setAttribute("data-scrolling",""),window.clearTimeout(g),g=window.setTimeout(()=>p?.removeAttribute("data-scrolling"),150);};_(),m.addEventListener("scroll",M,{passive:true});let q=new ResizeObserver(M);return q.observe(m),()=>{b!==0&&cancelAnimationFrame(b),window.clearTimeout(g),m.removeEventListener("scroll",M),q.disconnect();}},[y,v,r]);let[B,he]=react.useState(null),Fe=react.useCallback(()=>{y&&(y.surface?.retainSelection(),E(true),he(y.getSelectionPlacement()?.anchorY??null));},[y,E]),je=react.useCallback(()=>{y?.surface?.releaseSelection(),he(null),y?.focus();},[y]);react.useEffect(()=>{Z||B===null||(y?.surface?.releaseSelection(),he(null));},[Z,B,y]);let Ue=B??N.selectionAnchorY,U=react.useMemo(()=>{let p=ke(k);return k.filter(m=>!Pe(m,p))},[k]),ze=react.useMemo(()=>{if(B===null)return U;let p=U.findIndex(b=>b.anchorY!==null&&b.anchorY>B),m={key:ve,anchorY:B};return p===-1?[...U,m]:[...U.slice(0,p),m,...U.slice(p)]},[U,B]),Qe=react.useMemo(()=>{let p=new Map(Ze);for(let m of U){if(p.has(m.key))continue;let b=m.text.length+(m.kind==="revision"?m.replacedText?.length??0:0),_=Math.min(6,Math.max(1,Math.ceil(b/36)));p.set(m.key,64+_*20);}return p},[Ze,U]),{stacked:ge,collapsedKeys:Ge}=react.useMemo(()=>{let p=S.scale,m=new Map,b=new Set,_=Number.NEGATIVE_INFINITY;for(let g of ze){let M=g.anchorY===null?Number.isFinite(_)?_:0:Math.max(g.anchorY,_);m.set(g.key,M);let q=g.anchorY===null?0:(M-g.anchorY)*p,L="isActive"in g&&g.isActive,$=q>Ut&&!L&&g.key!==ve;$&&b.add(g.key);let ue=$?jt:Qe.get(g.key)??Ft;_=M+(ue+u)/p;}return {stacked:m,collapsedKeys:b}},[ze,Qe,u,S.scale]),Ne=Ue===null?null:S.top+(ge.get(ve)??Ue)*S.scale,We=n?.className,Tt=react.useMemo(()=>({t:o,cardClassName:We,review:{...N,items:k},allItems:A.items,authorSlots:Ke,byId:Ye,measure:Be,beginDraft:Fe,endDraft:je}),[o,We,N,A.items,k,Ke,Ye,Be,Fe,je]);if(r||v)return null;let Xe={ref:D,className:`docx-review${e?` ${e}`:""}`,"data-testid":"review-rail","data-count":k.length,"data-open":Z?"":void 0,role:"complementary","aria-label":T("review.ariaLabel"),onMouseDown:j,style:S.left===null?void 0:{left:S.left,right:"auto"}},Je=typeof t=="function"?{}:Rt(t),ne=(p,m)=>{if(!(p in Je))return m;let b=Je[p];return !react.isValidElement(b)||!react.isValidElement(m)?b:react.cloneElement(b,{...m.props,...b.props})},et=a?jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[ne("AddComment",jsxRuntime.jsx(Me,{top:Ne,drafting:B!==null})),!Z||B===null||Ne===null?null:ne("Draft",jsxRuntime.jsx(De,{top:Ne})),ne("Balloon",jsxRuntime.jsx(Se,{}))]}):null,It=a?Z?ne("List",jsxRuntime.jsx(fe,{stack:d,positions:ge,collapsed:Ge,scale:S.scale,offset:S.top,window:xe,children:t})):ne("Markers",jsxRuntime.jsx(Ae,{scale:S.scale,offset:S.top,window:xe})):typeof t=="function"?null:t;return jsxRuntime.jsx(Ie.Provider,{value:Tt,children:l&&react.isValidElement(t)?jsxRuntime.jsx(react$1.Slot,{...Xe,children:react.cloneElement(t,void 0,t.props.children,a?jsxRuntime.jsx(fe,{stack:d,positions:ge,collapsed:Ge,scale:S.scale,offset:S.top,window:xe}):null,et)}):jsxRuntime.jsxs("aside",{...Xe,children:[Z&&i!==void 0?jsxRuntime.jsx("div",{className:"docx-review__furniture","data-testid":"review-furniture",children:i}):null,It,et]})})}function fe({stack:e=true,positions:i,collapsed:l,scale:r=1,offset:t=0,window:o=null,children:n,className:a,hidden:d}){let{review:u,measure:c,cardClassName:w}=H();if(d)return null;let R=ke(u.items),y=u.items.filter(v=>!Pe(v,R));return y.length===0?typeof n=="function"?null:jsxRuntime.jsx(Oe,{}):jsxRuntime.jsx("div",{className:`docx-review__list${a?` ${a}`:""}`,children:y.map(v=>{let f=e?i?.get(v.key)??v.anchorY:v.anchorY,x=f==null?null:t+f*r;if(x!==null&&o&&(x<o.top||x>o.bottom))return null;let A=x===null?{}:{position:"absolute",top:x};return jsxRuntime.jsx(I.Provider,{value:v,children:jsxRuntime.jsx("div",{className:"docx-review__slot",style:A,...l?.has(v.key)?{"data-collapsed":""}:{},ref:N=>{c(N,v.key);},children:typeof n=="function"?n(v):jsxRuntime.jsx(Le,{...w?{className:w}:{},children:n})})},v.key)})})}fe.docxReviewPart="List";function Ae({scale:e=1,offset:i=0,window:l=null,className:r,hidden:t,icon:o}){let{review:n}=H(),a=Y();if(t)return null;let d=ke(n.items),u=n.items.filter(c=>!Pe(c,d));return jsxRuntime.jsx("div",{className:`docx-review__markers${r?` ${r}`:""}`,children:u.map(c=>{if(c.anchorY===null)return null;let w=i+c.anchorY*e;return l&&(w<l.top||w>l.bottom)?null:jsxRuntime.jsx("button",{type:"button",className:"docx-review__marker","data-testid":"review-marker","data-kind":c.kind==="revision"?c.revisionKind:c.kind,style:{position:"absolute",top:w},title:c.author?`${c.author}: ${c.text}`:c.text,"aria-label":`${a("review.showPane")}: ${c.author?`${c.author}. `:""}${c.text}`,onMouseDown:j,onClick:()=>{n.setPaneOpen(true),n.setActive(c.key);},children:(typeof o=="function"?o(c):o)??X(mt(c))},c.key)})})}Ae.docxReviewPart="Markers";function Me({top:e,drafting:i=false,className:l,hidden:r,children:t}){let{beginDraft:o}=H(),n=Y();if(r||i||e===null)return null;let a={type:"button",className:`docx-review__add${l?` ${l}`:""}`,"data-testid":"review-add-comment",style:{position:"absolute",top:e},"aria-label":n("common.comment"),title:n("common.comment"),onMouseDown:j,onClick:o};return t?jsxRuntime.jsx(react$1.Slot,{...a,children:t}):jsxRuntime.jsx("button",{...a,children:X(lt)})}Me.docxReviewPart="AddComment";function De({top:e,className:i,hidden:l}){let{review:r,endDraft:t,measure:o}=H(),n=Y(),[a,d]=react.useState(""),[u,c]=react.useState(false),w=react.useRef(null),R=react.useId();react.useEffect(()=>{w.current?.focus({preventScroll:true});},[]);let y=react.useCallback(()=>{if(a.trim().length===0)return;let v=r.comment(a.trim());c(!v),v&&(d(""),t());},[a,r,t]);return l?null:jsxRuntime.jsx("div",{className:`docx-review__slot${i?` ${i}`:""}`,style:{position:"absolute",top:e},ref:v=>{o(v,ve);},children:jsxRuntime.jsx("div",{className:"docx-review__card","data-testid":"review-draft","data-draft":"",children:jsxRuntime.jsxs("form",{className:"docx-review__reply-box",onSubmit:v=>{v.preventDefault(),y();},children:[jsxRuntime.jsx("label",{className:"docx-editor-sr-only",htmlFor:R,children:n("comments.addComment")}),jsxRuntime.jsx("input",{id:R,ref:w,"data-testid":"review-draft-input",className:"docx-review__input",value:a,placeholder:n("comments.addComment"),...u?{"aria-invalid":true}:{},onChange:v=>{c(false),d(v.target.value);},onKeyDown:v=>{if(v.key==="Escape"){v.preventDefault(),t();return}v.key==="Enter"&&(v.preventDefault(),y());}}),jsxRuntime.jsxs("div",{className:"docx-review__reply-actions",children:[jsxRuntime.jsx("button",{type:"button","data-testid":"review-draft-cancel",className:"docx-review__text-button",onMouseDown:j,onClick:t,children:n("common.cancel")}),jsxRuntime.jsx("button",{type:"submit","data-testid":"review-draft-submit",className:"docx-review__submit",disabled:a.trim().length===0,children:n("common.comment")})]}),u?jsxRuntime.jsx("span",{className:"docx-review__refused",role:"alert",children:n("review.commentRefused")}):null]})})})}De.docxReviewPart="Draft";function Se({className:e,hidden:i}){let{review:l,allItems:r,authorSlots:t}=H(),o=Y(),n=react.useRef(null),[a,d]=react.useState(null),u=react.useRef(false);u.current=a!==null,react.useEffect(()=>{let v=n.current,f=v?.closest(".docx-review"),x=f?.closest(".docx-editor__scroll-container")??f?.offsetParent;if(!v||!f||!x)return;let A=(E,C)=>{let T=f.getBoundingClientRect(),D=E.getBoundingClientRect(),de=E.ownerDocument.defaultView?.innerHeight??1/0,Z=Number(E.dataset.start),k=Number(E.dataset.end);d({revisionId:E.dataset.revisionId,author:E.dataset.revisionAuthor??"",...E.dataset.revisionDate!==void 0?{date:E.dataset.revisionDate}:{},...E.dataset.revisionKind!==void 0?{kind:E.dataset.revisionKind}:{},structuralSite:C,...E.dataset.paragraphId!==void 0?{paragraphId:E.dataset.paragraphId}:{},...Number.isFinite(Z)?{start:Z}:{},...Number.isFinite(k)?{end:k}:{},left:D.left-T.left,top:D.top-T.top,bottom:D.bottom-T.top,above:D.bottom+220>de});},N=E=>{let C=E.target;if(!(C instanceof Element)||v.contains(C))return;let T=C.closest("[data-revision-id]");if(T instanceof HTMLElement&&x.contains(T)){let D=T.classList.contains("docx-table-row--revision");if(T.dataset.revisionKind==="format"||D){A(T,D);return}}u.current&&d(null);};return x.addEventListener("pointerdown",N,true),x.addEventListener("mousedown",N,true),()=>{x.removeEventListener("pointerdown",N,true),x.removeEventListener("mousedown",N,true);}},[]);let c=react.useMemo(()=>{if(!a)return null;let v=null,f=false,x=null,A=false,N=null,E=false;for(let C of r)if(!(C.kind!=="revision"||C.item.kind!=="revision")){for(let T of C.item.addresses)if(T.id===a.revisionId){if(T.author===a.author){if(T.date===a.date)return C;v===null?v=C:v!==C&&(f=true);}x===null?x=C:x!==C&&(A=true);}if(a.paragraphId!==void 0&&a.start!==void 0&&a.end!==void 0&&(C.revisionKind==="format"||C.revisionKind==="structural")){for(let T of C.item.ranges)if(T.start.paragraphId===a.paragraphId&&T.start.offset<a.end&&T.end.offset>a.start){N===null?N=C:N!==C&&(E=true);break}}}return v!==null&&!f?v:x!==null&&!A?x:N!==null&&!E?N:null},[r,a]),w=c&&(c.revisionKind==="format"||c.revisionKind==="structural")?c:null,R=react.useRef(false);if(react.useEffect(()=>{if(w){R.current=true;return}R.current&&(R.current=false,d(null));},[w]),i)return null;let y=a?.kind==="format"?"format":"structural";return jsxRuntime.jsx("div",{ref:n,className:`docx-review__balloon-root${e?` ${e}`:""}`,children:a===null?null:jsxRuntime.jsx("div",{className:"docx-review__balloon","data-testid":"review-balloon",style:{left:a.left,top:a.above?a.top-6:a.bottom+6,transform:a.above?"translateY(-100%)":void 0},onMouseDown:j,children:w?jsxRuntime.jsx(I.Provider,{value:w,children:jsxRuntime.jsxs("div",{className:"docx-review__card","data-testid":"review-balloon-card","data-kind":w.revisionKind??"revision",style:{"--doc-review-author":`var(--doc-review-author-${(t.get(w.author)??0)%wt})`},onClick:()=>l.setActive(w.key),children:[jsxRuntime.jsxs("div",{className:"docx-review__head",children:[jsxRuntime.jsx(re,{}),jsxRuntime.jsxs("div",{className:"docx-review__meta",children:[jsxRuntime.jsx(ie,{}),jsxRuntime.jsx(ae,{})]}),w.kind==="revision"&&!w.readOnly?jsxRuntime.jsxs("div",{className:"docx-review__actions",children:[jsxRuntime.jsx(pe,{}),jsxRuntime.jsx(we,{})]}):null]}),jsxRuntime.jsx(se,{})]})}):jsxRuntime.jsxs("div",{className:"docx-review__card","data-testid":"review-balloon-card","data-kind":y,children:[jsxRuntime.jsxs("div",{className:"docx-review__head",children:[jsxRuntime.jsx("span",{className:"docx-review__avatar","aria-hidden":"true",children:Wt(a.author)}),jsxRuntime.jsxs("div",{className:"docx-review__meta",children:[jsxRuntime.jsx("span",{className:"docx-review__author",children:a.author||o("comments.unknown")}),a.date?jsxRuntime.jsx(Xt,{raw:a.date}):null]})]}),jsxRuntime.jsx("div",{className:"docx-review__summary",children:jsxRuntime.jsx("span",{className:"docx-review__label","data-kind":y,children:o(bt(y))})})]})})})}Se.docxReviewPart="Balloon";function Wt(e){let i=e.trim().split(/\s+/).filter(Boolean);return i.length===0?"?":i.slice(0,2).map(l=>l[0].toUpperCase()).join("")}function Xt({raw:e}){let i=new Date(e);return Number.isNaN(i.getTime())?null:jsxRuntime.jsx("time",{className:"docx-review__time",dateTime:e,children:yt.format(i)})}function Oe({className:e,hidden:i,children:l}){let r=Y();return i?null:jsxRuntime.jsx("div",{className:`docx-review__empty${e?` ${e}`:""}`,"data-testid":"review-empty",children:l??r("review.empty")})}Oe.docxReviewPart="Empty";function Le({className:e,asChild:i,hidden:l,children:r}){let{review:t,authorSlots:o}=H(),n=react.useContext(I),a=react.useId();if(l||!n)return null;let d=o.get(n.author)??0,u={className:`docx-review__card${e?` ${e}`:""}`,"data-testid":"review-card","aria-labelledby":`${a}-author ${a}-summary`,"data-kind":n.kind==="revision"?n.revisionKind??"revision":n.kind,...n.kind==="custom"&&n.item.kind==="custom"?{"data-node-name":n.item.name}:{},...n.isActive?{"data-active":""}:{},...n.kind==="comment"&&n.resolved?{"data-resolved":""}:{},style:{"--doc-review-author":`var(--doc-review-author-${d%wt})`},tabIndex:0,role:"button",id:a,onMouseDown:c=>{c.target?.closest("[data-review-selectable]")||c.currentTarget.focus({preventScroll:true});},onClick:()=>t.setActive(n.key),onKeyDown:c=>{c.target===c.currentTarget&&(c.key!=="Enter"&&c.key!==" "||(c.preventDefault(),t.setActive(n.key)));}};return i?jsxRuntime.jsx(react$1.Slot,{...u,children:r}):jsxRuntime.jsx("div",{...u,children:jsxRuntime.jsx(Jt,{children:r})})}Le.docxReviewPart="Card";function Jt({children:e}){let i=react.useContext(I),l=react.useMemo(()=>Rt(e),[e]),r=(o,n)=>o in l?l[o]:n;if(!i)return null;if(i.kind==="custom"&&i.item.kind==="custom"){let o=i.item;return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsxs("div",{className:"docx-review__head",children:[r("Avatar",null),jsxRuntime.jsx("div",{className:"docx-review__meta",children:r("Author",jsxRuntime.jsx("span",{className:"docx-review__author","data-testid":"review-custom-title",children:o.title}))})]}),r("Summary",o.detail?jsxRuntime.jsx("div",{className:"docx-review__summary","data-testid":"review-summary","data-review-selectable":"",children:jsxRuntime.jsx("span",{className:"docx-review__text",children:o.detail})}):null),l.__extra]})}let t=i.kind==="revision"&&!i.readOnly;return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsxs("div",{className:"docx-review__head",children:[r("Avatar",jsxRuntime.jsx(re,{})),jsxRuntime.jsxs("div",{className:"docx-review__meta",children:[r("Author",jsxRuntime.jsx(ie,{})),r("Time",jsxRuntime.jsx(ae,{}))]}),t||i.kind==="comment"?jsxRuntime.jsxs("div",{className:"docx-review__actions",children:[r("Accept",jsxRuntime.jsx(pe,{})),r("Reject",jsxRuntime.jsx(we,{})),r("Delete",jsxRuntime.jsx(Re,{}))]}):null]}),r("Summary",jsxRuntime.jsx(se,{})),r("Replies",jsxRuntime.jsx(He,{})),r("Reply",jsxRuntime.jsx(qe,{})),l.__extra]})}function Rt(e){let i={},l=[],r=t=>{if(Array.isArray(t)){t.forEach(r);return}if(!t||typeof t!="object"||!("type"in t)){t&&l.push(t);return}if(t.type===react.Fragment){r(t.props.children);return}let o=t.type.docxReviewPart;o?i[o]=t:l.push(t);};return r(e),l.length>0&&(i.__extra=l),i}function re({className:e,asChild:i,hidden:l,children:r}){let t=react.useContext(I);if(l||!t||r===void 0&&!t.initials)return null;let o={className:`docx-review__avatar${e?` ${e}`:""}`,"data-testid":"review-avatar","aria-hidden":true};return i?jsxRuntime.jsx(react$1.Slot,{...o,children:r}):jsxRuntime.jsx("span",{...o,children:r??t.initials})}re.docxReviewPart="Avatar";function ie({className:e,asChild:i,hidden:l,children:r}){let t=react.useContext(I),o=Y();if(l||!t)return null;let n=t.author||o("comments.unknown"),a={className:`docx-review__author${e?` ${e}`:""}`,"data-testid":"review-author"};return i?jsxRuntime.jsx(react$1.Slot,{...a,children:r}):jsxRuntime.jsx("span",{...a,children:r??n})}ie.docxReviewPart="Author";function ae({className:e,asChild:i,hidden:l,children:r}){let t=react.useContext(I);if(l||!t)return null;let o=t.date;if(!o)return null;let n=new Date(o);if(Number.isNaN(n.getTime()))return null;let a={className:`docx-review__time${e?` ${e}`:""}`,"data-testid":"review-time",dateTime:o};return i?jsxRuntime.jsx(react$1.Slot,{...a,children:r}):jsxRuntime.jsx("time",{...a,children:r??yt.format(n)})}ae.docxReviewPart="Time";var yt=new Intl.DateTimeFormat(void 0,{month:"short",day:"numeric",hour:"numeric",minute:"2-digit"});function se({className:e,asChild:i,hidden:l,children:r}){let t=react.useContext(I),o=Y();if(l||!t)return null;let n=t.text,a=t.kind!=="revision"?null:o(bt(t.revisionKind)),d=t.kind==="revision"&&t.revisionKind==="replace",u={className:`docx-review__summary${e?` ${e}`:""}`,"data-testid":"review-summary","data-review-selectable":""};return i?jsxRuntime.jsx(react$1.Slot,{...u,children:r}):jsxRuntime.jsx("div",{...u,children:r??(d?jsxRuntime.jsxs("span",{className:"docx-review__text",children:[o("review.replaced")," ",jsxRuntime.jsxs("span",{className:"docx-review__removed",children:['"',t.replacedText,'"']})," ",o("review.replacedWith")," ",jsxRuntime.jsxs("span",{className:"docx-review__added",children:['"',n,'"']})]}):jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[a?jsxRuntime.jsx("span",{className:"docx-review__label","data-kind":t.kind==="revision"?t.revisionKind:"revision",children:a}):null,n?jsxRuntime.jsx("span",{className:"docx-review__text",children:n}):null]}))})}se.docxReviewPart="Summary";function bt(e){switch(e){case "insert":return "review.inserted";case "delete":return "review.deleted";case "replace":return "review.replaced";case "moveFrom":return "review.movedFrom";case "moveTo":return "review.movedTo";case "format":return "revisions.runPropertiesChanged";case "paragraphMark":return "revisions.paragraphMarkInserted";default:return "review.structural"}}function pe({className:e,asChild:i,hidden:l,children:r,icon:t}){let{review:o}=H(),n=react.useContext(I),a=Y();if(l||!n||n.kind!=="revision"||n.readOnly)return null;let d=a("review.accept"),u={type:"button",className:`docx-review__action${e?` ${e}`:""}`,"data-testid":"review-accept","aria-label":d,title:d,onMouseDown:j,onClick:c=>{c.stopPropagation(),o.accept(n);}};return i?jsxRuntime.jsx(react$1.Slot,{...u,children:r}):jsxRuntime.jsx("button",{...u,children:t??r??X(ct)})}pe.docxReviewPart="Accept";function we({className:e,asChild:i,hidden:l,children:r,icon:t}){let{review:o}=H(),n=react.useContext(I),a=Y();if(l||!n||n.kind!=="revision"||n.readOnly)return null;let d=a("review.reject"),u={type:"button",className:`docx-review__action${e?` ${e}`:""}`,"data-testid":"review-reject","aria-label":d,title:d,onMouseDown:j,onClick:c=>{c.stopPropagation(),o.reject(n);}};return i?jsxRuntime.jsx(react$1.Slot,{...u,children:r}):jsxRuntime.jsx("button",{...u,children:t??r??X(dt)})}we.docxReviewPart="Reject";function Re({className:e,asChild:i,hidden:l,children:r,icon:t}){let{review:o}=H(),n=react.useContext(I),{t:a}=react$1.useTranslation();if(l||!n||n.kind==="custom"||n.kind==="revision"&&n.readOnly)return null;let d=n.kind==="comment"?a("review.deleteComment"):a("review.discardChange"),u={type:"button",className:`docx-review__action${e?` ${e}`:""}`,"data-testid":"review-delete","aria-label":d,title:d,onMouseDown:j,onClick:c=>{c.stopPropagation(),o.remove(n);}};return i?jsxRuntime.jsx(react$1.Slot,{...u,children:r}):jsxRuntime.jsx("button",{...u,children:t??r??X(ut)})}Re.docxReviewPart="Delete";function He({className:e,hidden:i}){let{byId:l}=H(),r=react.useContext(I);if(i||!r||r.kind==="custom")return null;let t=r.replyIds.map(o=>l.get(o)).filter(o=>o!==void 0);return t.length===0?null:jsxRuntime.jsx("ol",{className:`docx-review__replies${e?` ${e}`:""}`,children:t.map(o=>jsxRuntime.jsx(I.Provider,{value:o,children:jsxRuntime.jsxs("li",{className:"docx-review__reply","data-testid":"review-reply",children:[jsxRuntime.jsxs("div",{className:"docx-review__head",children:[jsxRuntime.jsx(re,{}),jsxRuntime.jsxs("div",{className:"docx-review__meta",children:[jsxRuntime.jsx(ie,{}),jsxRuntime.jsx(ae,{})]}),jsxRuntime.jsx("div",{className:"docx-review__actions",children:jsxRuntime.jsx(Re,{})})]}),jsxRuntime.jsx(se,{})]})},o.key))})}He.docxReviewPart="Replies";function qe({className:e,hidden:i,children:l}){let{review:r}=H(),t=react.useContext(I),o=Y(),[n,a]=react.useState(""),[d,u]=react.useState(false),c=react.useId(),w=react.useCallback(()=>{if(!t||n.trim().length===0)return;let R=r.reply(t,n.trim());u(!R),R&&a("");},[t,n,r]);return i||!t||!t.isActive?null:l?jsxRuntime.jsx(jsxRuntime.Fragment,{children:l}):jsxRuntime.jsxs("form",{className:`docx-review__reply-box${e?` ${e}`:""}`,onSubmit:R=>{R.preventDefault(),w();},children:[jsxRuntime.jsx("label",{className:"docx-editor-sr-only",htmlFor:c,children:o("comments.replyPlaceholder")}),jsxRuntime.jsx("input",{id:c,"data-testid":"review-reply-input",className:"docx-review__input",value:n,placeholder:o("comments.replyPlaceholder"),...d?{"aria-invalid":true,"data-refused":""}:{},onChange:R=>{u(false),a(R.target.value);},onClick:R=>R.stopPropagation(),onKeyDown:R=>{R.key==="Enter"&&(R.preventDefault(),w());}}),jsxRuntime.jsxs("div",{className:"docx-review__reply-actions",children:[jsxRuntime.jsx("button",{type:"button","data-testid":"review-reply-cancel",className:"docx-review__text-button",onMouseDown:j,onClick:R=>{R.stopPropagation(),a(""),u(false),r.setActive(null);},children:o("common.cancel")}),jsxRuntime.jsx("button",{type:"submit","data-testid":"review-reply-submit",className:"docx-review__submit",disabled:n.trim().length===0,children:o("review.reply")})]}),d?jsxRuntime.jsx("span",{className:"docx-review__refused",role:"alert","data-testid":"review-reply-refused",children:o("review.replyRefused")}):null]})}qe.docxReviewPart="Reply";var en=Object.assign(Gt,{List:fe,Empty:Oe,Card:Le,Avatar:re,Author:ie,Time:ae,Summary:se,Accept:pe,Reject:we,Delete:Re,Replies:He,Reply:qe,Markers:Ae,AddComment:Me,Draft:De,Balloon:Se});function le(e){let i=react$1.useDocxEditor();return react.useMemo(()=>e||(i?.getCustomNodeDefinitions()??[]).filter(chunkA7NTVTWG_cjs.j),[e,i])}var rn=".docx-content-control-boundary";function J(e,i){let{node:l,definition:r,controlId:t}=e,o=t?i?.getReviewItems().find(d=>d.kind==="custom"&&d.item.id===t):void 0;if(o&&o.kind==="custom"){let d=o.item;return {...l,attrs:d.attrs,text:d.text,...d.data===void 0?{}:{data:d.data},...t?{nodeId:t}:{}}}let n=t?an(i,t,r):void 0,a=r.fromDocx?r.fromDocx({attrs:l.attrs,text:"",...n===void 0?{}:{data:n}}):l.attrs;return a===null?null:{...l,attrs:a,...n===void 0?{}:{data:n},...t?{nodeId:t}:{}}}function an(e,i,l){let r=e?.surface;if(!r)return;let t=r.session.part(),o=store.customNodePayloadsByControl(r.session.currentPackage(),t.name).get(i);if(!o)return;let n=chunkA7NTVTWG_cjs.e(l.schema,o.data);return n.ok?n.value:void 0}function ee(e,i){let l=e?.closest?.(rn),r=l?.closest(".docx-content-control-chrome"),t=r?.getAttribute("data-tag"),o=t?chunkA7NTVTWG_cjs.c(t):null;if(!l||!o||!t)return null;let n=i.find(a=>a.tagPrefix===o.prefix&&a.name===o.name);return n?{node:{name:o.name,attrs:o.attrs,tag:t,rect:l.getBoundingClientRect()},definition:n,controlId:r?.getAttribute("data-docx-content-control")??null}:null}var $e=".docx-content-control-boundary",ln=e=>{if(!chunkA7NTVTWG_cjs.k.test(e.tagPrefix)||!chunkA7NTVTWG_cjs.k.test(e.name))return [];let i=`${e.tagPrefix}:${e.name}`;return [`.docx-content-control-chrome[data-tag="${i}"]`,`.docx-content-control-chrome[data-tag^="${i}?"]`]};function cn(e){let{onNodeClick:i,onNodeHover:l}=e,r=react$1.useDocxEditor(),t=le(e.nodes);return react.useEffect(()=>{let o=document.createElement("style"),n=[];for(let a of t){let d=ln(a);if(d.length===0)continue;let u=a.chrome?.color!==void 0&&CSS.supports("color",a.chrome.color)?a.chrome.color:"#2563eb";n.push(`${d.map(c=>`${c} ${$e}`).join(", ")} {`," pointer-events: auto !important;"," opacity: 1;"," border: none;",` background: color-mix(in srgb, ${u} 12%, transparent);`," border-radius: 6px;"," cursor: default;","}");}return o.textContent=n.join(`
|
|
2
|
+
`),document.head.append(o),()=>o.remove()},[t]),react.useEffect(()=>{let o=null,n=null,a=w=>ee(document.elementFromPoint(w.clientX,w.clientY),t),d=w=>{let R=w.button===0?a(w):null;o=R?.controlId??null,n=R?.node.tag??null;},u=w=>{let R=o,y=n;if(o=null,n=null,y===null)return;let v=a(w);if(!v||v.node.tag!==y||R!==null&&v.controlId!==R)return;let f=J(v,r);f&&(v.definition.onClick?.(f),i?.(f));},c=w=>{let R=ee(w.target,t);if(!R||w.relatedTarget?.closest?.($e)===w.target.closest($e))return;let v=J(R,r);v&&(R.definition.onHover?.(v),l?.(v));};return document.addEventListener("pointerdown",d,true),document.addEventListener("pointerup",u,true),document.addEventListener("mouseover",c),()=>{document.removeEventListener("pointerdown",d,true),document.removeEventListener("pointerup",u,true),document.removeEventListener("mouseover",c);}},[t,r,i,l]),null}function Nt(e){let{onEditNode:i,onRemoveRefused:l,remove:r=true}=e,t=le(e.nodes),o=react$1.useContextMenuTarget(),n=react$1.useDocxEditor(),{t:a}=react$1.useTranslation(),d=react.useMemo(()=>o?ee(o,t):null,[o,t]),u=react.useMemo(()=>d?J(d,n):null,[d,n]),c=react.useMemo(()=>!d?.definition.reviewCard||!u?null:d.definition.reviewCard({attrs:u.attrs,text:u.text??"",...u.data===void 0?{}:{data:u.data}}),[d,u]);if(!d||!u)return null;let{definition:w}=d,R=w.label??w.name,y=w.onEdit!==void 0||i!==void 0,v=r&&u.nodeId!==void 0&&n!==null;return !c&&!y&&!v?null:jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[c?jsxRuntime.jsxs("div",{className:"docx-contextmenu__custom-info","data-testid":"custom-node-info",children:[jsxRuntime.jsx("span",{className:"docx-contextmenu__custom-title",children:c.title}),c.detail?jsxRuntime.jsx("span",{className:"docx-contextmenu__custom-detail",children:c.detail}):null]}):null,y?jsxRuntime.jsx(react$1.ContextMenuItem,{label:a("contextMenu.editCustomNode",{label:R}),className:"docx-contextmenu__custom-edit",onSelect:()=>{w.onEdit?.(u),i?.(u,w);}}):null,v?jsxRuntime.jsx(react$1.ContextMenuItem,{label:a("contextMenu.removeCustomNode",{label:R}),className:"docx-contextmenu__custom-remove",onSelect:()=>{let f=chunkA7NTVTWG_cjs.q(n,u.nodeId);f.ok||l?.(u,f.reason);}}):null,jsxRuntime.jsx("div",{role:"separator",className:"docx-toolbar__menu-separator"})]})}Nt.docxRowPlacement="start";Object.defineProperty(exports,"reviewModule",{enumerable:true,get:function(){return chunkA7NTVTWG_cjs.o}});exports.CustomNodeChrome=cn;exports.CustomNodeContextMenu=Nt;exports.DocxEditorReview=en;exports.activatedCustomNodeOf=J;exports.resolveCustomNodeActivation=ee;exports.useCustomNodeDefinitions=le;exports.useReview=me;exports.useReviewItem=Yt;exports.useReviewOf=it;exports.useStackedReviewPositions=Mt;
|
package/dist/react/index.d.cts
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import { a as CustomNodeDefinition, b as ActivatedCustomNode, A as AnyCustomNodeDefinition } from '../define-custom-node-
|
|
2
|
-
export { P as ProLicenseOptions, j as ReviewModuleOptions, q as reviewModule } from '../define-custom-node-
|
|
1
|
+
import { a as CustomNodeDefinition, b as ActivatedCustomNode, A as AnyCustomNodeDefinition } from '../define-custom-node-RznSCnPr.cjs';
|
|
2
|
+
export { P as ProLicenseOptions, j as ReviewModuleOptions, q as reviewModule } from '../define-custom-node-RznSCnPr.cjs';
|
|
3
3
|
import * as react from 'react';
|
|
4
4
|
import { ReactNode } from 'react';
|
|
5
5
|
import { ToolbarTranslate } from '@docx-editor.dev/react';
|
|
6
|
-
import { ReviewItemPlacement, ReviewItemQuery, Editor } from '@docx-editor.dev/core/contracts/editor';
|
|
6
|
+
import { ReviewItemPlacement, ReviewActivationOptions, ReviewItemQuery, Editor } from '@docx-editor.dev/core/contracts/editor';
|
|
7
|
+
export { ReviewActivationOptions } from '@docx-editor.dev/core/contracts/editor';
|
|
7
8
|
import '@docx-editor.dev/core/editor';
|
|
8
9
|
import '@docx-editor.dev/core/store';
|
|
9
10
|
|
|
@@ -16,6 +17,7 @@ import '@docx-editor.dev/core/store';
|
|
|
16
17
|
* to be written once per framework.
|
|
17
18
|
*/
|
|
18
19
|
type ReviewItemView = ReviewItemPlacement;
|
|
20
|
+
|
|
19
21
|
/**
|
|
20
22
|
* What {@link useReview} returns: the review rail's data and the four things a card can do.
|
|
21
23
|
*
|
|
@@ -26,8 +28,20 @@ interface UseReviewReturn {
|
|
|
26
28
|
readonly items: readonly ReviewItemView[];
|
|
27
29
|
/** The item the caret is in, or null. */
|
|
28
30
|
readonly activeKey: string | null;
|
|
29
|
-
/**
|
|
30
|
-
|
|
31
|
+
/**
|
|
32
|
+
* Card to document: selects the item's range and scrolls to it.
|
|
33
|
+
*
|
|
34
|
+
* Reports whether it landed, on the same terms as {@link accept}. False for an item whose
|
|
35
|
+
* `activatable` is false — no range to select, or a revision kind this rail excluded — and
|
|
36
|
+
* for a story that will not open. A queue walked with next/previous controls has no other
|
|
37
|
+
* way to tell a step that did nothing from one that worked, and skipping to the next item
|
|
38
|
+
* is only possible if you can find out.
|
|
39
|
+
*
|
|
40
|
+
* `options.reveal` picks where the item lands, or turns the engine's scroll off entirely
|
|
41
|
+
* for a host whose own list already drives it. Default is centred when it has to travel,
|
|
42
|
+
* still when it is already on screen.
|
|
43
|
+
*/
|
|
44
|
+
readonly setActive: (key: string | null, options?: ReviewActivationOptions) => boolean;
|
|
31
45
|
/**
|
|
32
46
|
* Accept a revision. Reports whether it landed.
|
|
33
47
|
*
|
|
@@ -232,11 +246,12 @@ declare namespace ReviewList {
|
|
|
232
246
|
var docxReviewPart: "List";
|
|
233
247
|
}
|
|
234
248
|
/**
|
|
235
|
-
*
|
|
249
|
+
* Props for the collapsed rail's gutter markers. @public
|
|
236
250
|
*
|
|
237
|
-
*
|
|
251
|
+
* `scale`, `offset` and `window` are the rail's own geometry and are supplied for you — an
|
|
252
|
+
* override inherits them, so a host passes only what it wants to change.
|
|
238
253
|
*/
|
|
239
|
-
|
|
254
|
+
interface ReviewMarkersProps {
|
|
240
255
|
scale?: number;
|
|
241
256
|
offset?: number;
|
|
242
257
|
/** Visible band of the scroller; markers outside it are not mounted. */
|
|
@@ -246,7 +261,20 @@ declare function ReviewMarkers({ scale, offset, window: visible, className, hidd
|
|
|
246
261
|
} | null;
|
|
247
262
|
className?: string;
|
|
248
263
|
hidden?: boolean;
|
|
249
|
-
|
|
264
|
+
/**
|
|
265
|
+
* Replace the glyph. A FUNCTION of the item, unlike the action parts' plain node, because
|
|
266
|
+
* one `Markers` draws every marker in the gutter — a single node would put one shape on all
|
|
267
|
+
* of them, which is the thing this part was fixed to stop doing. Return null or undefined
|
|
268
|
+
* for an item to keep its packaged glyph.
|
|
269
|
+
*/
|
|
270
|
+
icon?: ReactNode | ((item: ReviewItemView) => ReactNode);
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* The collapsed rail: one marker per item, at its anchor.
|
|
274
|
+
*
|
|
275
|
+
* @public
|
|
276
|
+
*/
|
|
277
|
+
declare function ReviewMarkers({ scale, offset, window: visible, className, hidden, icon: iconOverride, }: ReviewMarkersProps): react.JSX.Element | null;
|
|
250
278
|
declare namespace ReviewMarkers {
|
|
251
279
|
var docxReviewPart: "Markers";
|
|
252
280
|
}
|
|
@@ -604,4 +632,4 @@ declare function activatedCustomNodeOf(resolved: ResolvedCustomNodeActivation, e
|
|
|
604
632
|
*/
|
|
605
633
|
declare function resolveCustomNodeActivation(target: EventTarget | null, nodes: readonly AnyCustomNodeDefinition[]): ResolvedCustomNodeActivation | null;
|
|
606
634
|
|
|
607
|
-
export { CustomNodeChrome, type CustomNodeChromeProps, CustomNodeContextMenu, type CustomNodeContextMenuProps, DocxEditorReview, type DocxEditorReviewNamespace, type ResolvedCustomNodeActivation, type ReviewActionProps, type ReviewItemView, type ReviewPartProps, type ReviewProps, type UseReviewReturn, activatedCustomNodeOf, resolveCustomNodeActivation, useCustomNodeDefinitions, useReview, useReviewItem, useReviewOf, useStackedReviewPositions };
|
|
635
|
+
export { CustomNodeChrome, type CustomNodeChromeProps, CustomNodeContextMenu, type CustomNodeContextMenuProps, DocxEditorReview, type DocxEditorReviewNamespace, type ResolvedCustomNodeActivation, type ReviewActionProps, type ReviewItemView, type ReviewMarkersProps, type ReviewPartProps, type ReviewProps, type UseReviewReturn, activatedCustomNodeOf, resolveCustomNodeActivation, useCustomNodeDefinitions, useReview, useReviewItem, useReviewOf, useStackedReviewPositions };
|
package/dist/react/index.d.ts
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import { a as CustomNodeDefinition, b as ActivatedCustomNode, A as AnyCustomNodeDefinition } from '../define-custom-node-
|
|
2
|
-
export { P as ProLicenseOptions, j as ReviewModuleOptions, q as reviewModule } from '../define-custom-node-
|
|
1
|
+
import { a as CustomNodeDefinition, b as ActivatedCustomNode, A as AnyCustomNodeDefinition } from '../define-custom-node-RznSCnPr.js';
|
|
2
|
+
export { P as ProLicenseOptions, j as ReviewModuleOptions, q as reviewModule } from '../define-custom-node-RznSCnPr.js';
|
|
3
3
|
import * as react from 'react';
|
|
4
4
|
import { ReactNode } from 'react';
|
|
5
5
|
import { ToolbarTranslate } from '@docx-editor.dev/react';
|
|
6
|
-
import { ReviewItemPlacement, ReviewItemQuery, Editor } from '@docx-editor.dev/core/contracts/editor';
|
|
6
|
+
import { ReviewItemPlacement, ReviewActivationOptions, ReviewItemQuery, Editor } from '@docx-editor.dev/core/contracts/editor';
|
|
7
|
+
export { ReviewActivationOptions } from '@docx-editor.dev/core/contracts/editor';
|
|
7
8
|
import '@docx-editor.dev/core/editor';
|
|
8
9
|
import '@docx-editor.dev/core/store';
|
|
9
10
|
|
|
@@ -16,6 +17,7 @@ import '@docx-editor.dev/core/store';
|
|
|
16
17
|
* to be written once per framework.
|
|
17
18
|
*/
|
|
18
19
|
type ReviewItemView = ReviewItemPlacement;
|
|
20
|
+
|
|
19
21
|
/**
|
|
20
22
|
* What {@link useReview} returns: the review rail's data and the four things a card can do.
|
|
21
23
|
*
|
|
@@ -26,8 +28,20 @@ interface UseReviewReturn {
|
|
|
26
28
|
readonly items: readonly ReviewItemView[];
|
|
27
29
|
/** The item the caret is in, or null. */
|
|
28
30
|
readonly activeKey: string | null;
|
|
29
|
-
/**
|
|
30
|
-
|
|
31
|
+
/**
|
|
32
|
+
* Card to document: selects the item's range and scrolls to it.
|
|
33
|
+
*
|
|
34
|
+
* Reports whether it landed, on the same terms as {@link accept}. False for an item whose
|
|
35
|
+
* `activatable` is false — no range to select, or a revision kind this rail excluded — and
|
|
36
|
+
* for a story that will not open. A queue walked with next/previous controls has no other
|
|
37
|
+
* way to tell a step that did nothing from one that worked, and skipping to the next item
|
|
38
|
+
* is only possible if you can find out.
|
|
39
|
+
*
|
|
40
|
+
* `options.reveal` picks where the item lands, or turns the engine's scroll off entirely
|
|
41
|
+
* for a host whose own list already drives it. Default is centred when it has to travel,
|
|
42
|
+
* still when it is already on screen.
|
|
43
|
+
*/
|
|
44
|
+
readonly setActive: (key: string | null, options?: ReviewActivationOptions) => boolean;
|
|
31
45
|
/**
|
|
32
46
|
* Accept a revision. Reports whether it landed.
|
|
33
47
|
*
|
|
@@ -232,11 +246,12 @@ declare namespace ReviewList {
|
|
|
232
246
|
var docxReviewPart: "List";
|
|
233
247
|
}
|
|
234
248
|
/**
|
|
235
|
-
*
|
|
249
|
+
* Props for the collapsed rail's gutter markers. @public
|
|
236
250
|
*
|
|
237
|
-
*
|
|
251
|
+
* `scale`, `offset` and `window` are the rail's own geometry and are supplied for you — an
|
|
252
|
+
* override inherits them, so a host passes only what it wants to change.
|
|
238
253
|
*/
|
|
239
|
-
|
|
254
|
+
interface ReviewMarkersProps {
|
|
240
255
|
scale?: number;
|
|
241
256
|
offset?: number;
|
|
242
257
|
/** Visible band of the scroller; markers outside it are not mounted. */
|
|
@@ -246,7 +261,20 @@ declare function ReviewMarkers({ scale, offset, window: visible, className, hidd
|
|
|
246
261
|
} | null;
|
|
247
262
|
className?: string;
|
|
248
263
|
hidden?: boolean;
|
|
249
|
-
|
|
264
|
+
/**
|
|
265
|
+
* Replace the glyph. A FUNCTION of the item, unlike the action parts' plain node, because
|
|
266
|
+
* one `Markers` draws every marker in the gutter — a single node would put one shape on all
|
|
267
|
+
* of them, which is the thing this part was fixed to stop doing. Return null or undefined
|
|
268
|
+
* for an item to keep its packaged glyph.
|
|
269
|
+
*/
|
|
270
|
+
icon?: ReactNode | ((item: ReviewItemView) => ReactNode);
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* The collapsed rail: one marker per item, at its anchor.
|
|
274
|
+
*
|
|
275
|
+
* @public
|
|
276
|
+
*/
|
|
277
|
+
declare function ReviewMarkers({ scale, offset, window: visible, className, hidden, icon: iconOverride, }: ReviewMarkersProps): react.JSX.Element | null;
|
|
250
278
|
declare namespace ReviewMarkers {
|
|
251
279
|
var docxReviewPart: "Markers";
|
|
252
280
|
}
|
|
@@ -604,4 +632,4 @@ declare function activatedCustomNodeOf(resolved: ResolvedCustomNodeActivation, e
|
|
|
604
632
|
*/
|
|
605
633
|
declare function resolveCustomNodeActivation(target: EventTarget | null, nodes: readonly AnyCustomNodeDefinition[]): ResolvedCustomNodeActivation | null;
|
|
606
634
|
|
|
607
|
-
export { CustomNodeChrome, type CustomNodeChromeProps, CustomNodeContextMenu, type CustomNodeContextMenuProps, DocxEditorReview, type DocxEditorReviewNamespace, type ResolvedCustomNodeActivation, type ReviewActionProps, type ReviewItemView, type ReviewPartProps, type ReviewProps, type UseReviewReturn, activatedCustomNodeOf, resolveCustomNodeActivation, useCustomNodeDefinitions, useReview, useReviewItem, useReviewOf, useStackedReviewPositions };
|
|
635
|
+
export { CustomNodeChrome, type CustomNodeChromeProps, CustomNodeContextMenu, type CustomNodeContextMenuProps, DocxEditorReview, type DocxEditorReviewNamespace, type ResolvedCustomNodeActivation, type ReviewActionProps, type ReviewItemView, type ReviewMarkersProps, type ReviewPartProps, type ReviewProps, type UseReviewReturn, activatedCustomNodeOf, resolveCustomNodeActivation, useCustomNodeDefinitions, useReview, useReviewItem, useReviewOf, useStackedReviewPositions };
|
package/dist/react/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {j,e,c,q,k as k$1}from'../chunk-FVI3MGO7.js';export{o as reviewModule}from'../chunk-FVI3MGO7.js';import {createContext,useMemo,useEffect,useCallback,useRef,useContext,useState,isValidElement,cloneElement,useId,useSyncExternalStore,Fragment as Fragment$1}from'react';import {useDocxEditor,useEditorState,useTranslation,ReviewRailContext,Slot,useContextMenuTarget,ContextMenuItem}from'@docx-editor.dev/react';import {jsxs,Fragment,jsx}from'react/jsx-runtime';import {customNodePayloadsByControl}from'@docx-editor.dev/core/store';function me(e){let i=useDocxEditor();return rt(i,e)}function rt(e,i){let l=useCallback(m=>{if(!e)return ()=>{};let b=e.on("change",m),T=e.on("selectionChange",m),N=e.on("error",m);return ()=>{b(),T(),N();}},[e]),r=useSyncExternalStore(l,()=>e?`${e.getReviewRevision()}`:"none",()=>"none"),t=useMemo(()=>e?e.getReviewItems(i).filter(m=>m.item.kind!=="custom"||m.item.carded):[],[e,r,i]),o=useMemo(()=>t.find(m=>m.isActive)?.key??null,[t]),n=useCallback(m=>{e?.setActiveReviewItem(m);},[e]),a=useCallback(m=>!e||m.kind!=="revision"||m.readOnly?false:e.acceptReviewItem(m.key).ok,[e]),d=useCallback(m=>!e||m.kind!=="revision"||m.readOnly?false:e.rejectReviewItem(m.key).ok,[e]),c=useCallback(m=>!e||m.kind==="custom"||m.kind==="revision"&&m.readOnly?false:e.deleteReviewItem(m.key).ok,[e]),p=useCallback((m,b,T)=>b.trim().length===0||!e?false:e.replyToReviewItem(m.key,b,T).ok,[e]),w=useMemo(()=>e?e.getSelectionPlacement()?.anchorY??null:null,[e,r]),R=useCallback((m,b)=>m.trim().length===0||!e?false:e.addComment(m,b).ok,[e]),y=useMemo(()=>e?e.isReviewPaneOpen():true,[e,r]),u=useCallback(m=>{!e||e.isReviewPaneOpen()===m||e.exec({type:"toggleReviewPane"});},[e]);return useMemo(()=>({items:t,activeKey:o,setActive:n,accept:a,reject:d,remove:c,reply:p,selectionAnchorY:w,comment:R,paneOpen:y,setPaneOpen:u,ready:e!==null&&!e.snapshot().isLoading&&e.snapshot().parseError===null}),[t,o,n,a,d,c,p,w,R,y,u,e])}function Nt(e,i,l={}){let r=l.gap??8,t=l.scale??1,o=l.defaultHeight??0;return useMemo(()=>{let n=new Map,a=Number.NEGATIVE_INFINITY;for(let d of e){let c=d.anchorY===null?Number.isFinite(a)?a:0:Math.max(d.anchorY,a);n.set(d.key,c),a=c+((i.get(d.key)??o)+r)/t;}return n},[e,i,r,t,o])}var It=e=>e.isLoading||e.parseError!==null||e.pageSetup==null,Pe=createContext(null),k=createContext(null);function Tt(){return useContext(k)}var Mt={scale:96/72,top:0,left:null},Dt=16,ve="\0compose",it=600,st=8,St=72,Lt=64,Ot=480,$t=Object.freeze({placement:false});function ke(e,i){return e.kind!=="comment"?false:e.parentId!==void 0?i.has(e.parentId):e.parentRevisionId!==void 0?i.has(e.parentRevisionId):false}function Ae(e){return new Set(e.map(i=>i.id))}function U(e){let i=e.target?.tagName;i==="INPUT"||i==="SELECT"||i==="TEXTAREA"||e.preventDefault();}function $(){let e=useContext(Pe);return e||Ht}function B(){let{t:e}=useContext(Pe)??{},{t:i}=useTranslation();return useCallback(l=>e?.(l)??i(l),[e,i])}var Ht={t:void 0,cardClassName:void 0,review:{items:[],activeKey:null,setActive:()=>{},accept:()=>false,reject:()=>false,remove:()=>false,reply:()=>false,selectionAnchorY:null,comment:()=>false,paneOpen:true,setPaneOpen:()=>{},ready:false},allItems:[],authorSlots:new Map,byId:new Map,measure:()=>{},beginDraft:()=>{},endDraft:()=>{}},oe=e=>jsx("svg",{viewBox:"0 -960 960 960",width:16,height:16,"aria-hidden":"true",focusable:"false",children:jsx("path",{d:e,fill:"currentColor"})}),Vt="M440-400h80v-120h120v-80H520v-120h-80v120H320v80h120v120ZM80-80v-720q0-33 23.5-56.5T160-880h640q33 0 56.5 23.5T880-800v480q0 33-23.5 56.5T800-240H240L80-80Zm126-240h594v-480H160v525l46-45Zm-46 0v-480 480Z",Kt="M240-400h480v-80H240v80Zm0-120h480v-80H240v80Zm0-120h480v-80H240v80ZM880-80 720-240H160q-33 0-56.5-23.5T80-320v-480q0-33 23.5-56.5T160-880h640q33 0 56.5 23.5T880-800v720ZM160-320h594l46 45v-525H160v480Zm0 0v-480 480Z",Yt="M382-240 154-468l57-57 171 171 367-367 57 57-424 424Z",Bt="m256-200-56-56 224-224-224-224 56-56 224 224 224-224 56 56-224 224 224 224-56 56-224-224-224 224Z",jt="M280-120q-33 0-56.5-23.5T200-200v-520h-40v-80h200v-40h240v40h200v80h-40v520q0 33-23.5 56.5T680-120H280Zm400-600H280v520h400v-520ZM360-280h80v-360h-80v360Zm160 0h80v-360h-80v360ZM280-720v520-520Z";function Ft({className:e,furniture:i,asChild:l,hidden:r,children:t,t:o,card:n,preset:a=true,stack:d=true,gap:c=8,filter:p,structural:w=false,formatting:R=false}){let y=useDocxEditor(),u=useEditorState(It),m=useMemo(()=>{let f=[];return w||f.push("structural"),R||f.push("format"),f.length>0?f:void 0},[w,R]),b=useMemo(()=>m?{excludeRevisionKinds:m}:void 0,[m]);useEffect(()=>(y?.setReviewActivationExclusions(m??null),()=>y?.setReviewActivationExclusions(null)),[y,m]);let T=me($t),N=me(b),E=N.setPaneOpen,{t:C}=useTranslation(),P=useCallback(f=>o?.(f)??C(f),[o,C]),D=useRef(null),de=useContext(ReviewRailContext);useEffect(()=>de?.register(),[de]);let j=N.paneOpen,I=useMemo(()=>p?N.items.filter(f=>p(f)):N.items,[N.items,p]),Ke=useMemo(()=>{let f=new Map;for(let v of I)v.author&&!f.has(v.author)&&f.set(v.author,f.size);return f},[I]),Ye=useMemo(()=>{let f=new Map;for(let v of I)f.set(v.id,v);return f},[I]),[Be,pt]=useState(()=>new Map),ye=useCallback((f,v)=>{v<=0||pt(x=>{if(x.get(f)===v)return x;let _=new Map(x);return _.set(f,v),_});},[]),be=useRef(new WeakMap),ee=useRef(null),je=useCallback((f,v)=>{!f||typeof ResizeObserver>"u"||(ye(v,f.offsetHeight),ee.current??(ee.current=new ResizeObserver(x=>{for(let _ of x){let h=be.current.get(_.target);h&&ye(h,_.target.offsetHeight);}})),be.current.get(f)!==v&&(be.current.set(f,v),ee.current.observe(f)));},[ye]);useEffect(()=>()=>ee.current?.disconnect(),[]);let[S,wt]=useState(Mt);useEffect(()=>{let f=D.current;if(!y||!f)return;let v=f.offsetParent,x=v?.querySelector(".docx-paginated-surface")??null,_=()=>{wt(M=>{let H=x&&v?x.getBoundingClientRect():null,O=H&&v?v.getBoundingClientRect():null,V={scale:y.getRenderScale(),top:H&&O&&v?H.top-O.top-v.clientTop+v.scrollTop:0,left:H&&O&&v?H.right-O.left-v.clientLeft+v.scrollLeft+Dt:null};return M.scale===V.scale&&M.top===V.top&&M.left===V.left?M:V});};_();let h=new ResizeObserver(_);return v&&h.observe(v),x&&h.observe(x),()=>h.disconnect()},[y,I,u,r]),useEffect(()=>{let f=D.current;if(!y||!f)return;let v=x=>{let _=x.target;if(!(_ instanceof Node)||f.contains(_))return;let h=f.offsetParent;!h||!h.contains(_)||h.querySelector(".docx-paginated-surface")?.contains(_)||y.setActiveReviewItem(null);};return document.addEventListener("mousedown",v,true),()=>document.removeEventListener("mousedown",v,true)},[y,u,r]);let[xe,Rt]=useState(null);useEffect(()=>{let f=D.current,v=f?.offsetParent;if(!v)return;let x=0,_=()=>{x=0,Rt(O=>{let V=v.scrollTop-it,ue=v.scrollTop+v.clientHeight+it;return O&&O.top===V&&O.bottom===ue?O:{top:V,bottom:ue}});},h=0,M=()=>{x===0&&(x=requestAnimationFrame(_)),f?.setAttribute("data-scrolling",""),window.clearTimeout(h),h=window.setTimeout(()=>f?.removeAttribute("data-scrolling"),150);};_(),v.addEventListener("scroll",M,{passive:true});let H=new ResizeObserver(M);return H.observe(v),()=>{x!==0&&cancelAnimationFrame(x),window.clearTimeout(h),v.removeEventListener("scroll",M),H.disconnect();}},[y,u,r]);let[F,ge]=useState(null),Fe=useCallback(()=>{y&&(y.surface?.retainSelection(),E(true),ge(y.getSelectionPlacement()?.anchorY??null));},[y,E]),Ze=useCallback(()=>{y?.surface?.releaseSelection(),ge(null),y?.focus();},[y]);useEffect(()=>{j||F===null||(y?.surface?.releaseSelection(),ge(null));},[j,F,y]);let Ue=F??N.selectionAnchorY,q=useMemo(()=>{let f=Ae(I);return I.filter(v=>!ke(v,f))},[I]),qe=useMemo(()=>{if(F===null)return q;let f=q.findIndex(x=>x.anchorY!==null&&x.anchorY>F),v={key:ve,anchorY:F};return f===-1?[...q,v]:[...q.slice(0,f),v,...q.slice(f)]},[q,F]),ze=useMemo(()=>{let f=new Map(Be);for(let v of q){if(f.has(v.key))continue;let x=v.text.length+(v.kind==="revision"?v.replacedText?.length??0:0),_=Math.min(6,Math.max(1,Math.ceil(x/36)));f.set(v.key,64+_*20);}return f},[Be,q]),{stacked:he,collapsedKeys:Qe}=useMemo(()=>{let f=S.scale,v=new Map,x=new Set,_=Number.NEGATIVE_INFINITY;for(let h of qe){let M=h.anchorY===null?Number.isFinite(_)?_:0:Math.max(h.anchorY,_);v.set(h.key,M);let H=h.anchorY===null?0:(M-h.anchorY)*f,O="isActive"in h&&h.isActive,V=H>Ot&&!O&&h.key!==ve;V&&x.add(h.key);let ue=V?Lt:ze.get(h.key)??St;_=M+(ue+c)/f;}return {stacked:v,collapsedKeys:x}},[qe,ze,c,S.scale]),Ne=Ue===null?null:S.top+(he.get(ve)??Ue)*S.scale,Ge=n?.className,yt=useMemo(()=>({t:o,cardClassName:Ge,review:{...N,items:I},allItems:T.items,authorSlots:Ke,byId:Ye,measure:je,beginDraft:Fe,endDraft:Ze}),[o,Ge,N,T.items,I,Ke,Ye,je,Fe,Ze]);if(r||u)return null;let We={ref:D,className:`docx-review${e?` ${e}`:""}`,"data-testid":"review-rail","data-count":I.length,"data-open":j?"":void 0,role:"complementary","aria-label":P("review.ariaLabel"),onMouseDown:U,style:S.left===null?void 0:{left:S.left,right:"auto"}},Xe=typeof t=="function"?{}:lt(t),te=(f,v)=>f in Xe?Xe[f]:v,Je=a?jsxs(Fragment,{children:[te("AddComment",jsx(Te,{top:Ne,drafting:F!==null})),!j||F===null||Ne===null?null:te("Draft",jsx(Me,{top:Ne})),te("Balloon",jsx(De,{}))]}):null,bt=a?j?te("List",jsx(fe,{stack:d,positions:he,collapsed:Qe,scale:S.scale,offset:S.top,window:xe,children:t})):te("Markers",jsx(Ie,{scale:S.scale,offset:S.top,window:xe})):typeof t=="function"?null:t;return jsx(Pe.Provider,{value:yt,children:l&&isValidElement(t)?jsx(Slot,{...We,children:cloneElement(t,void 0,t.props.children,a?jsx(fe,{stack:d,positions:he,collapsed:Qe,scale:S.scale,offset:S.top,window:xe}):null,Je)}):jsxs("aside",{...We,children:[j&&i!==void 0?jsx("div",{className:"docx-review__furniture","data-testid":"review-furniture",children:i}):null,bt,Je]})})}function fe({stack:e=true,positions:i,collapsed:l,scale:r=1,offset:t=0,window:o=null,children:n,className:a,hidden:d}){let{review:c,measure:p,cardClassName:w}=$();if(d)return null;let R=Ae(c.items),y=c.items.filter(u=>!ke(u,R));return y.length===0?typeof n=="function"?null:jsx(Se,{}):jsx("div",{className:`docx-review__list${a?` ${a}`:""}`,children:y.map(u=>{let m=e?i?.get(u.key)??u.anchorY:u.anchorY,b=m==null?null:t+m*r;if(b!==null&&o&&(b<o.top||b>o.bottom))return null;let T=b===null?{}:{position:"absolute",top:b};return jsx(k.Provider,{value:u,children:jsx("div",{className:"docx-review__slot",style:T,...l?.has(u.key)?{"data-collapsed":""}:{},ref:N=>{p(N,u.key);},children:typeof n=="function"?n(u):jsx(Le,{...w?{className:w}:{},children:n})})},u.key)})})}fe.docxReviewPart="List";function Ie({scale:e=1,offset:i=0,window:l=null,className:r,hidden:t}){let{review:o}=$(),n=B();if(t)return null;let a=Ae(o.items),d=o.items.filter(c=>!ke(c,a));return jsx("div",{className:`docx-review__markers${r?` ${r}`:""}`,children:d.map(c=>{if(c.anchorY===null)return null;let p=i+c.anchorY*e;return l&&(p<l.top||p>l.bottom)?null:jsx("button",{type:"button",className:"docx-review__marker","data-testid":"review-marker","data-kind":c.kind==="revision"?c.revisionKind:c.kind,style:{position:"absolute",top:p},title:c.author?`${c.author}: ${c.text}`:c.text,"aria-label":`${n("review.showPane")}: ${c.author?`${c.author}. `:""}${c.text}`,onMouseDown:U,onClick:()=>{o.setPaneOpen(true),o.setActive(c.key);},children:oe(Kt)},c.key)})})}Ie.docxReviewPart="Markers";function Te({top:e,drafting:i=false,className:l,hidden:r,children:t}){let{beginDraft:o}=$(),n=B();if(r||i||e===null)return null;let a={type:"button",className:`docx-review__add${l?` ${l}`:""}`,"data-testid":"review-add-comment",style:{position:"absolute",top:e},"aria-label":n("common.comment"),title:n("common.comment"),onMouseDown:U,onClick:o};return t?jsx(Slot,{...a,children:t}):jsx("button",{...a,children:oe(Vt)})}Te.docxReviewPart="AddComment";function Me({top:e,className:i,hidden:l}){let{review:r,endDraft:t,measure:o}=$(),n=B(),[a,d]=useState(""),[c,p]=useState(false),w=useRef(null),R=useId();useEffect(()=>{w.current?.focus({preventScroll:true});},[]);let y=useCallback(()=>{if(a.trim().length===0)return;let u=r.comment(a.trim());p(!u),u&&(d(""),t());},[a,r,t]);return l?null:jsx("div",{className:`docx-review__slot${i?` ${i}`:""}`,style:{position:"absolute",top:e},ref:u=>{o(u,ve);},children:jsx("div",{className:"docx-review__card","data-testid":"review-draft","data-draft":"",children:jsxs("form",{className:"docx-review__reply-box",onSubmit:u=>{u.preventDefault(),y();},children:[jsx("label",{className:"docx-editor-sr-only",htmlFor:R,children:n("comments.addComment")}),jsx("input",{id:R,ref:w,"data-testid":"review-draft-input",className:"docx-review__input",value:a,placeholder:n("comments.addComment"),...c?{"aria-invalid":true}:{},onChange:u=>{p(false),d(u.target.value);},onKeyDown:u=>{if(u.key==="Escape"){u.preventDefault(),t();return}u.key==="Enter"&&(u.preventDefault(),y());}}),jsxs("div",{className:"docx-review__reply-actions",children:[jsx("button",{type:"button","data-testid":"review-draft-cancel",className:"docx-review__text-button",onMouseDown:U,onClick:t,children:n("common.cancel")}),jsx("button",{type:"submit","data-testid":"review-draft-submit",className:"docx-review__submit",disabled:a.trim().length===0,children:n("common.comment")})]}),c?jsx("span",{className:"docx-review__refused",role:"alert",children:n("review.commentRefused")}):null]})})})}Me.docxReviewPart="Draft";function De({className:e,hidden:i}){let{review:l,allItems:r,authorSlots:t}=$(),o=B(),n=useRef(null),[a,d]=useState(null),c=useRef(false);c.current=a!==null,useEffect(()=>{let u=n.current,m=u?.closest(".docx-review"),b=m?.closest(".docx-editor__scroll-container")??m?.offsetParent;if(!u||!m||!b)return;let T=(E,C)=>{let P=m.getBoundingClientRect(),D=E.getBoundingClientRect(),de=E.ownerDocument.defaultView?.innerHeight??1/0,j=Number(E.dataset.start),I=Number(E.dataset.end);d({revisionId:E.dataset.revisionId,author:E.dataset.revisionAuthor??"",...E.dataset.revisionDate!==void 0?{date:E.dataset.revisionDate}:{},...E.dataset.revisionKind!==void 0?{kind:E.dataset.revisionKind}:{},structuralSite:C,...E.dataset.paragraphId!==void 0?{paragraphId:E.dataset.paragraphId}:{},...Number.isFinite(j)?{start:j}:{},...Number.isFinite(I)?{end:I}:{},left:D.left-P.left,top:D.top-P.top,bottom:D.bottom-P.top,above:D.bottom+220>de});},N=E=>{let C=E.target;if(!(C instanceof Element)||u.contains(C))return;let P=C.closest("[data-revision-id]");if(P instanceof HTMLElement&&b.contains(P)){let D=P.classList.contains("docx-table-row--revision");if(P.dataset.revisionKind==="format"||D){T(P,D);return}}c.current&&d(null);};return b.addEventListener("pointerdown",N,true),b.addEventListener("mousedown",N,true),()=>{b.removeEventListener("pointerdown",N,true),b.removeEventListener("mousedown",N,true);}},[]);let p=useMemo(()=>{if(!a)return null;let u=null,m=false,b=null,T=false,N=null,E=false;for(let C of r)if(!(C.kind!=="revision"||C.item.kind!=="revision")){for(let P of C.item.addresses)if(P.id===a.revisionId){if(P.author===a.author){if(P.date===a.date)return C;u===null?u=C:u!==C&&(m=true);}b===null?b=C:b!==C&&(T=true);}if(a.paragraphId!==void 0&&a.start!==void 0&&a.end!==void 0&&(C.revisionKind==="format"||C.revisionKind==="structural")){for(let P of C.item.ranges)if(P.start.paragraphId===a.paragraphId&&P.start.offset<a.end&&P.end.offset>a.start){N===null?N=C:N!==C&&(E=true);break}}}return u!==null&&!m?u:b!==null&&!T?b:N!==null&&!E?N:null},[r,a]),w=p&&(p.revisionKind==="format"||p.revisionKind==="structural")?p:null,R=useRef(false);if(useEffect(()=>{if(w){R.current=true;return}R.current&&(R.current=false,d(null));},[w]),i)return null;let y=a?.kind==="format"?"format":"structural";return jsx("div",{ref:n,className:`docx-review__balloon-root${e?` ${e}`:""}`,children:a===null?null:jsx("div",{className:"docx-review__balloon","data-testid":"review-balloon",style:{left:a.left,top:a.above?a.top-6:a.bottom+6,transform:a.above?"translateY(-100%)":void 0},onMouseDown:U,children:w?jsx(k.Provider,{value:w,children:jsxs("div",{className:"docx-review__card","data-testid":"review-balloon-card","data-kind":w.revisionKind??"revision",style:{"--doc-review-author":`var(--doc-review-author-${(t.get(w.author)??0)%st})`},onClick:()=>l.setActive(w.key),children:[jsxs("div",{className:"docx-review__head",children:[jsx(re,{}),jsxs("div",{className:"docx-review__meta",children:[jsx(ie,{}),jsx(ae,{})]}),w.kind==="revision"&&!w.readOnly?jsxs("div",{className:"docx-review__actions",children:[jsx(pe,{}),jsx(we,{})]}):null]}),jsx(se,{})]})}):jsxs("div",{className:"docx-review__card","data-testid":"review-balloon-card","data-kind":y,children:[jsxs("div",{className:"docx-review__head",children:[jsx("span",{className:"docx-review__avatar","aria-hidden":"true",children:Zt(a.author)}),jsxs("div",{className:"docx-review__meta",children:[jsx("span",{className:"docx-review__author",children:a.author||o("comments.unknown")}),a.date?jsx(Ut,{raw:a.date}):null]})]}),jsx("div",{className:"docx-review__summary",children:jsx("span",{className:"docx-review__label","data-kind":y,children:o(dt(y))})})]})})})}De.docxReviewPart="Balloon";function Zt(e){let i=e.trim().split(/\s+/).filter(Boolean);return i.length===0?"?":i.slice(0,2).map(l=>l[0].toUpperCase()).join("")}function Ut({raw:e}){let i=new Date(e);return Number.isNaN(i.getTime())?null:jsx("time",{className:"docx-review__time",dateTime:e,children:ct.format(i)})}function Se({className:e,hidden:i,children:l}){let r=B();return i?null:jsx("div",{className:`docx-review__empty${e?` ${e}`:""}`,"data-testid":"review-empty",children:l??r("review.empty")})}Se.docxReviewPart="Empty";function Le({className:e,asChild:i,hidden:l,children:r}){let{review:t,authorSlots:o}=$(),n=useContext(k),a=useId();if(l||!n)return null;let d=o.get(n.author)??0,c={className:`docx-review__card${e?` ${e}`:""}`,"data-testid":"review-card","aria-labelledby":`${a}-author ${a}-summary`,"data-kind":n.kind==="revision"?n.revisionKind??"revision":n.kind,...n.kind==="custom"&&n.item.kind==="custom"?{"data-node-name":n.item.name}:{},...n.isActive?{"data-active":""}:{},...n.kind==="comment"&&n.resolved?{"data-resolved":""}:{},style:{"--doc-review-author":`var(--doc-review-author-${d%st})`},tabIndex:0,role:"button",id:a,onMouseDown:p=>{p.target?.closest("[data-review-selectable]")||p.currentTarget.focus({preventScroll:true});},onClick:()=>t.setActive(n.key),onKeyDown:p=>{p.target===p.currentTarget&&(p.key!=="Enter"&&p.key!==" "||(p.preventDefault(),t.setActive(n.key)));}};return i?jsx(Slot,{...c,children:r}):jsx("div",{...c,children:jsx(qt,{children:r})})}Le.docxReviewPart="Card";function qt({children:e}){let i=useContext(k),l=useMemo(()=>lt(e),[e]),r=(o,n)=>o in l?l[o]:n;if(!i)return null;if(i.kind==="custom"&&i.item.kind==="custom"){let o=i.item;return jsxs(Fragment,{children:[jsxs("div",{className:"docx-review__head",children:[r("Avatar",null),jsx("div",{className:"docx-review__meta",children:r("Author",jsx("span",{className:"docx-review__author","data-testid":"review-custom-title",children:o.title}))})]}),r("Summary",o.detail?jsx("div",{className:"docx-review__summary","data-testid":"review-summary","data-review-selectable":"",children:jsx("span",{className:"docx-review__text",children:o.detail})}):null),l.__extra]})}let t=i.kind==="revision"&&!i.readOnly;return jsxs(Fragment,{children:[jsxs("div",{className:"docx-review__head",children:[r("Avatar",jsx(re,{})),jsxs("div",{className:"docx-review__meta",children:[r("Author",jsx(ie,{})),r("Time",jsx(ae,{}))]}),t||i.kind==="comment"?jsxs("div",{className:"docx-review__actions",children:[r("Accept",jsx(pe,{})),r("Reject",jsx(we,{})),r("Delete",jsx(Re,{}))]}):null]}),r("Summary",jsx(se,{})),r("Replies",jsx(Oe,{})),r("Reply",jsx($e,{})),l.__extra]})}function lt(e){let i={},l=[],r=t=>{if(Array.isArray(t)){t.forEach(r);return}if(!t||typeof t!="object"||!("type"in t)){t&&l.push(t);return}if(t.type===Fragment$1){r(t.props.children);return}let o=t.type.docxReviewPart;o?i[o]=t:l.push(t);};return r(e),l.length>0&&(i.__extra=l),i}function re({className:e,asChild:i,hidden:l,children:r}){let t=useContext(k);if(l||!t||r===void 0&&!t.initials)return null;let o={className:`docx-review__avatar${e?` ${e}`:""}`,"data-testid":"review-avatar","aria-hidden":true};return i?jsx(Slot,{...o,children:r}):jsx("span",{...o,children:r??t.initials})}re.docxReviewPart="Avatar";function ie({className:e,asChild:i,hidden:l,children:r}){let t=useContext(k),o=B();if(l||!t)return null;let n=t.author||o("comments.unknown"),a={className:`docx-review__author${e?` ${e}`:""}`,"data-testid":"review-author"};return i?jsx(Slot,{...a,children:r}):jsx("span",{...a,children:r??n})}ie.docxReviewPart="Author";function ae({className:e,asChild:i,hidden:l,children:r}){let t=useContext(k);if(l||!t)return null;let o=t.date;if(!o)return null;let n=new Date(o);if(Number.isNaN(n.getTime()))return null;let a={className:`docx-review__time${e?` ${e}`:""}`,"data-testid":"review-time",dateTime:o};return i?jsx(Slot,{...a,children:r}):jsx("time",{...a,children:r??ct.format(n)})}ae.docxReviewPart="Time";var ct=new Intl.DateTimeFormat(void 0,{month:"short",day:"numeric",hour:"numeric",minute:"2-digit"});function se({className:e,asChild:i,hidden:l,children:r}){let t=useContext(k),o=B();if(l||!t)return null;let n=t.text,a=t.kind!=="revision"?null:o(dt(t.revisionKind)),d=t.kind==="revision"&&t.revisionKind==="replace",c={className:`docx-review__summary${e?` ${e}`:""}`,"data-testid":"review-summary","data-review-selectable":""};return i?jsx(Slot,{...c,children:r}):jsx("div",{...c,children:r??(d?jsxs("span",{className:"docx-review__text",children:[o("review.replaced")," ",jsxs("span",{className:"docx-review__removed",children:['"',t.replacedText,'"']})," ",o("review.replacedWith")," ",jsxs("span",{className:"docx-review__added",children:['"',n,'"']})]}):jsxs(Fragment,{children:[a?jsx("span",{className:"docx-review__label","data-kind":t.kind==="revision"?t.revisionKind:"revision",children:a}):null,n?jsx("span",{className:"docx-review__text",children:n}):null]}))})}se.docxReviewPart="Summary";function dt(e){switch(e){case "insert":return "review.inserted";case "delete":return "review.deleted";case "replace":return "review.replaced";case "moveFrom":return "review.movedFrom";case "moveTo":return "review.movedTo";case "format":return "revisions.runPropertiesChanged";case "paragraphMark":return "revisions.paragraphMarkInserted";default:return "review.structural"}}function pe({className:e,asChild:i,hidden:l,children:r,icon:t}){let{review:o}=$(),n=useContext(k),a=B();if(l||!n||n.kind!=="revision"||n.readOnly)return null;let d=a("review.accept"),c={type:"button",className:`docx-review__action${e?` ${e}`:""}`,"data-testid":"review-accept","aria-label":d,title:d,onMouseDown:U,onClick:p=>{p.stopPropagation(),o.accept(n);}};return i?jsx(Slot,{...c,children:r}):jsx("button",{...c,children:t??r??oe(Yt)})}pe.docxReviewPart="Accept";function we({className:e,asChild:i,hidden:l,children:r,icon:t}){let{review:o}=$(),n=useContext(k),a=B();if(l||!n||n.kind!=="revision"||n.readOnly)return null;let d=a("review.reject"),c={type:"button",className:`docx-review__action${e?` ${e}`:""}`,"data-testid":"review-reject","aria-label":d,title:d,onMouseDown:U,onClick:p=>{p.stopPropagation(),o.reject(n);}};return i?jsx(Slot,{...c,children:r}):jsx("button",{...c,children:t??r??oe(Bt)})}we.docxReviewPart="Reject";function Re({className:e,asChild:i,hidden:l,children:r,icon:t}){let{review:o}=$(),n=useContext(k),{t:a}=useTranslation();if(l||!n||n.kind==="custom"||n.kind==="revision"&&n.readOnly)return null;let d=n.kind==="comment"?a("review.deleteComment"):a("review.discardChange"),c={type:"button",className:`docx-review__action${e?` ${e}`:""}`,"data-testid":"review-delete","aria-label":d,title:d,onMouseDown:U,onClick:p=>{p.stopPropagation(),o.remove(n);}};return i?jsx(Slot,{...c,children:r}):jsx("button",{...c,children:t??r??oe(jt)})}Re.docxReviewPart="Delete";function Oe({className:e,hidden:i}){let{byId:l}=$(),r=useContext(k);if(i||!r||r.kind==="custom")return null;let t=r.replyIds.map(o=>l.get(o)).filter(o=>o!==void 0);return t.length===0?null:jsx("ol",{className:`docx-review__replies${e?` ${e}`:""}`,children:t.map(o=>jsx(k.Provider,{value:o,children:jsxs("li",{className:"docx-review__reply","data-testid":"review-reply",children:[jsxs("div",{className:"docx-review__head",children:[jsx(re,{}),jsxs("div",{className:"docx-review__meta",children:[jsx(ie,{}),jsx(ae,{})]}),jsx("div",{className:"docx-review__actions",children:jsx(Re,{})})]}),jsx(se,{})]})},o.key))})}Oe.docxReviewPart="Replies";function $e({className:e,hidden:i,children:l}){let{review:r}=$(),t=useContext(k),o=B(),[n,a]=useState(""),[d,c]=useState(false),p=useId(),w=useCallback(()=>{if(!t||n.trim().length===0)return;let R=r.reply(t,n.trim());c(!R),R&&a("");},[t,n,r]);return i||!t||!t.isActive?null:l?jsx(Fragment,{children:l}):jsxs("form",{className:`docx-review__reply-box${e?` ${e}`:""}`,onSubmit:R=>{R.preventDefault(),w();},children:[jsx("label",{className:"docx-editor-sr-only",htmlFor:p,children:o("comments.replyPlaceholder")}),jsx("input",{id:p,"data-testid":"review-reply-input",className:"docx-review__input",value:n,placeholder:o("comments.replyPlaceholder"),...d?{"aria-invalid":true,"data-refused":""}:{},onChange:R=>{c(false),a(R.target.value);},onClick:R=>R.stopPropagation(),onKeyDown:R=>{R.key==="Enter"&&(R.preventDefault(),w());}}),jsxs("div",{className:"docx-review__reply-actions",children:[jsx("button",{type:"button","data-testid":"review-reply-cancel",className:"docx-review__text-button",onMouseDown:U,onClick:R=>{R.stopPropagation(),a(""),c(false),r.setActive(null);},children:o("common.cancel")}),jsx("button",{type:"submit","data-testid":"review-reply-submit",className:"docx-review__submit",disabled:n.trim().length===0,children:o("review.reply")})]}),d?jsx("span",{className:"docx-review__refused",role:"alert","data-testid":"review-reply-refused",children:o("review.replyRefused")}):null]})}$e.docxReviewPart="Reply";var zt=Object.assign(Ft,{List:fe,Empty:Se,Card:Le,Avatar:re,Author:ie,Time:ae,Summary:se,Accept:pe,Reject:we,Delete:Re,Replies:Oe,Reply:$e,Markers:Ie,AddComment:Te,Draft:Me,Balloon:De});function le(e){let i=useDocxEditor();return useMemo(()=>e||(i?.getCustomNodeDefinitions()??[]).filter(j),[e,i])}var Xt=".docx-content-control-boundary";function X(e,i){let{node:l,definition:r,controlId:t}=e,o=t?i?.getReviewItems().find(d=>d.kind==="custom"&&d.item.id===t):void 0;if(o&&o.kind==="custom"){let d=o.item;return {...l,attrs:d.attrs,text:d.text,...d.data===void 0?{}:{data:d.data},...t?{nodeId:t}:{}}}let n=t?Jt(i,t,r):void 0,a=r.fromDocx?r.fromDocx({attrs:l.attrs,text:"",...n===void 0?{}:{data:n}}):l.attrs;return a===null?null:{...l,attrs:a,...n===void 0?{}:{data:n},...t?{nodeId:t}:{}}}function Jt(e$1,i,l){let r=e$1?.surface;if(!r)return;let t=r.session.part(),o=customNodePayloadsByControl(r.session.currentPackage(),t.name).get(i);if(!o)return;let n=e(l.schema,o.data);return n.ok?n.value:void 0}function J(e,i){let l=e?.closest?.(Xt),r=l?.closest(".docx-content-control-chrome"),t=r?.getAttribute("data-tag"),o=t?c(t):null;if(!l||!o||!t)return null;let n=i.find(a=>a.tagPrefix===o.prefix&&a.name===o.name);return n?{node:{name:o.name,attrs:o.attrs,tag:t,rect:l.getBoundingClientRect()},definition:n,controlId:r?.getAttribute("data-docx-content-control")??null}:null}var He=".docx-content-control-boundary",tn=e=>{if(!k$1.test(e.tagPrefix)||!k$1.test(e.name))return [];let i=`${e.tagPrefix}:${e.name}`;return [`.docx-content-control-chrome[data-tag="${i}"]`,`.docx-content-control-chrome[data-tag^="${i}?"]`]};function nn(e){let{onNodeClick:i,onNodeHover:l}=e,r=useDocxEditor(),t=le(e.nodes);return useEffect(()=>{let o=document.createElement("style"),n=[];for(let a of t){let d=tn(a);if(d.length===0)continue;let c=a.chrome?.color!==void 0&&CSS.supports("color",a.chrome.color)?a.chrome.color:"#2563eb";n.push(`${d.map(p=>`${p} ${He}`).join(", ")} {`," pointer-events: auto !important;"," opacity: 1;"," border: none;",` background: color-mix(in srgb, ${c} 12%, transparent);`," border-radius: 6px;"," cursor: default;","}");}return o.textContent=n.join(`
|
|
2
|
-
`),document.head.append(o),()=>o.remove()},[t]),useEffect(()=>{let o=null,n=null,a=w=>
|
|
1
|
+
import {j as j$1,e,c,q,k}from'../chunk-PWNAGXXX.js';export{o as reviewModule}from'../chunk-PWNAGXXX.js';import {createContext,useMemo,useEffect,useCallback,useRef,useContext,useState,isValidElement,cloneElement,useId,useSyncExternalStore,Fragment as Fragment$1}from'react';import {useDocxEditor,useEditorState,useTranslation,ReviewRailContext,Slot,useContextMenuTarget,ContextMenuItem}from'@docx-editor.dev/react';import {jsxs,Fragment,jsx}from'react/jsx-runtime';import {customNodePayloadsByControl}from'@docx-editor.dev/core/store';function me(e){let i=useDocxEditor();return it(i,e)}function it(e,i){let l=useCallback(f=>{if(!e)return ()=>{};let x=e.on("change",f),A=e.on("selectionChange",f),N=e.on("error",f);return ()=>{x(),A(),N();}},[e]),r=useSyncExternalStore(l,()=>e?`${e.getReviewRevision()}`:"none",()=>"none"),t=useMemo(()=>e?e.getReviewItems(i).filter(f=>f.item.kind!=="custom"||f.item.carded):[],[e,r,i]),o=useMemo(()=>t.find(f=>f.isActive)?.key??null,[t]),n=useCallback((f,x)=>e?e.setActiveReviewItem(f,x).ok:false,[e]),a=useCallback(f=>!e||f.kind!=="revision"||f.readOnly?false:e.acceptReviewItem(f.key).ok,[e]),d=useCallback(f=>!e||f.kind!=="revision"||f.readOnly?false:e.rejectReviewItem(f.key).ok,[e]),u=useCallback(f=>!e||f.kind==="custom"||f.kind==="revision"&&f.readOnly?false:e.deleteReviewItem(f.key).ok,[e]),c=useCallback((f,x,A)=>x.trim().length===0||!e?false:e.replyToReviewItem(f.key,x,A).ok,[e]),w=useMemo(()=>e?e.getSelectionPlacement()?.anchorY??null:null,[e,r]),R=useCallback((f,x)=>f.trim().length===0||!e?false:e.addComment(f,x).ok,[e]),y=useMemo(()=>e?e.isReviewPaneOpen():true,[e,r]),v=useCallback(f=>{!e||e.isReviewPaneOpen()===f||e.exec({type:"toggleReviewPane"});},[e]);return useMemo(()=>({items:t,activeKey:o,setActive:n,accept:a,reject:d,remove:u,reply:c,selectionAnchorY:w,comment:R,paneOpen:y,setPaneOpen:v,ready:e!==null&&!e.snapshot().isLoading&&e.snapshot().parseError===null}),[t,o,n,a,d,u,c,w,R,y,v,e])}function Mt(e,i,l={}){let r=l.gap??8,t=l.scale??1,o=l.defaultHeight??0;return useMemo(()=>{let n=new Map,a=Number.NEGATIVE_INFINITY;for(let d of e){let u=d.anchorY===null?Number.isFinite(a)?a:0:Math.max(d.anchorY,a);n.set(d.key,u),a=u+((i.get(d.key)??o)+r)/t;}return n},[e,i,r,t,o])}var X=e=>jsx("svg",{viewBox:"0 -960 960 960",width:16,height:16,"aria-hidden":"true",focusable:"false",children:jsx("path",{d:e,fill:"currentColor"})}),lt="M440-400h80v-120h120v-80H520v-120h-80v120H320v80h120v120ZM80-80v-720q0-33 23.5-56.5T160-880h640q33 0 56.5 23.5T880-800v480q0 33-23.5 56.5T800-240H240L80-80Zm126-240h594v-480H160v525l46-45Zm-46 0v-480 480Z",at="M240-400h480v-80H240v80Zm0-120h480v-80H240v80Zm0-120h480v-80H240v80ZM880-80 720-240H160q-33 0-56.5-23.5T80-320v-480q0-33 23.5-56.5T160-880h640q33 0 56.5 23.5T880-800v720ZM160-320h594l46 45v-525H160v480Zm0 0v-480 480Z",ct="M382-240 154-468l57-57 171 171 367-367 57 57-424 424Z",dt="m256-200-56-56 224-224-224-224 56-56 224 224 224-224 56 56-224 224 224 224-56 56-224-224-224 224Z",ut="M280-120q-33 0-56.5-23.5T200-200v-520h-40v-80h200v-40h240v40h200v80h-40v520q0 33-23.5 56.5T680-120H280Zm400-600H280v520h400v-520ZM360-280h80v-360h-80v360Zm160 0h80v-360h-80v360ZM280-720v520-520Z",Dt="M200-200h57l391-391-57-57-391 391v57Zm-80 80v-170l528-527q12-11 26.5-17t30.5-6q16 0 31 6t26 18l55 56q12 11 17.5 26t5.5 30q0 16-5.5 30.5T817-647L290-120H120Zm640-584-56-56 56 56Zm-141 85-28-29 57 57-29-28Z",St="M486-160q-76 0-135-45t-85-123l88-38q14 48 48.5 78t85.5 30q42 0 76-20t34-64q0-18-7-33t-19-27h112q5 14 7.5 28.5T694-341q0 86-61.5 133.5T486-160ZM80-520v-80h800v80H80Zm402-360q66 0 116 30t74 84l-88 38q-11-28-38.5-47T480-794q-42 0-72 19t-30 51q0 15 6 27t18 22H272q-6-13-9-27t-3-30q0-70 55-114t167-44Z",Ot="M360-160q-83 0-141.5-58.5T160-360v-360q0-83 58.5-141.5T360-920q83 0 141.5 58.5T560-720v360q0 83-58.5 141.5T360-160Zm0-80q50 0 85-35t35-85v-360q0-50-35-85t-85-35q-50 0-85 35t-35 85v360q0 50 35 85t85 35Zm300 80q29 0 49.5-20.5T730-230q0-22-12.5-40T684-296l-64-32v-232l100 100q23 23 51.5 35.5T832-412v-80q-17 0-32-6.5T773-517L633-657q-12-12-27.5-17.5T573-680h-13v520h100ZM360-720Z",Lt="M580-360q-25 0-42.5-17.5T520-420v-160q0-25 17.5-42.5T580-640h160q25 0 42.5 17.5T800-580v260q0 66-47 113t-113 47v-80q33 0 56.5-23.5T720-320v-40H580Zm-360 0q-25 0-42.5-17.5T160-420v-160q0-25 17.5-42.5T220-640h160q25 0 42.5 17.5T440-580v260q0 66-47 113t-113 47v-80q33 0 56.5-23.5T360-320v-40H220Z";function mt(e){if(e.kind==="comment")return at;if(e.kind==="custom")return e.item.icon??Lt;switch(e.revisionKind){case "insert":case "moveTo":return Dt;case "delete":case "moveFrom":return St;case "format":return Ot;default:return at}}var Kt=e=>e.isLoading||e.parseError!==null||e.pageSetup==null,Ie=createContext(null),I=createContext(null);function Yt(){return useContext(I)}var Zt={scale:96/72,top:0,left:null},Bt=16,ve="\0compose",ft=600,wt=8,Ft=72,jt=64,Ut=480,zt=Object.freeze({placement:false});function Pe(e,i){return e.kind!=="comment"?false:e.parentId!==void 0?i.has(e.parentId):e.parentRevisionId!==void 0?i.has(e.parentRevisionId):false}function ke(e){return new Set(e.map(i=>i.id))}function j(e){let i=e.target?.tagName;i==="INPUT"||i==="SELECT"||i==="TEXTAREA"||e.preventDefault();}function H(){let e=useContext(Ie);return e||Qt}function Y(){let{t:e}=useContext(Ie)??{},{t:i}=useTranslation();return useCallback(l=>e?.(l)??i(l),[e,i])}var Qt={t:void 0,cardClassName:void 0,review:{items:[],activeKey:null,setActive:()=>false,accept:()=>false,reject:()=>false,remove:()=>false,reply:()=>false,selectionAnchorY:null,comment:()=>false,paneOpen:true,setPaneOpen:()=>{},ready:false},allItems:[],authorSlots:new Map,byId:new Map,measure:()=>{},beginDraft:()=>{},endDraft:()=>{}};function Gt({className:e,furniture:i,asChild:l,hidden:r,children:t,t:o,card:n,preset:a=true,stack:d=true,gap:u=8,filter:c,structural:w=false,formatting:R=false}){let y=useDocxEditor(),v=useEditorState(Kt),f=useMemo(()=>{let p=[];return w||p.push("structural"),R||p.push("format"),p.length>0?p:void 0},[w,R]),x=useMemo(()=>f?{excludeRevisionKinds:f}:void 0,[f]);useEffect(()=>(y?.setReviewActivationExclusions(f??null),()=>y?.setReviewActivationExclusions(null)),[y,f]);let A=me(zt),N=me(x),E=N.setPaneOpen,{t:C}=useTranslation(),T=useCallback(p=>o?.(p)??C(p),[o,C]),D=useRef(null),de=useContext(ReviewRailContext);useEffect(()=>de?.register(),[de]);let Z=N.paneOpen,k=useMemo(()=>c?N.items.filter(p=>c(p)):N.items,[N.items,c]),Ke=useMemo(()=>{let p=new Map;for(let m of k)m.author&&!p.has(m.author)&&p.set(m.author,p.size);return p},[k]),Ye=useMemo(()=>{let p=new Map;for(let m of k)p.set(m.id,m);return p},[k]),[Ze,_t]=useState(()=>new Map),ye=useCallback((p,m)=>{m<=0||_t(b=>{if(b.get(p)===m)return b;let _=new Map(b);return _.set(p,m),_});},[]),be=useRef(new WeakMap),te=useRef(null),Be=useCallback((p,m)=>{!p||typeof ResizeObserver>"u"||(ye(m,p.offsetHeight),te.current??(te.current=new ResizeObserver(b=>{for(let _ of b){let g=be.current.get(_.target);g&&ye(g,_.target.offsetHeight);}})),be.current.get(p)!==m&&(be.current.set(p,m),te.current.observe(p)));},[ye]);useEffect(()=>()=>te.current?.disconnect(),[]);let[S,Ct]=useState(Zt);useEffect(()=>{let p=D.current;if(!y||!p)return;let m=p.offsetParent,b=m?.querySelector(".docx-paginated-surface")??null,_=()=>{Ct(M=>{let q=b&&m?b.getBoundingClientRect():null,L=q&&m?m.getBoundingClientRect():null,$={scale:y.getRenderScale(),top:q&&L&&m?q.top-L.top-m.clientTop+m.scrollTop:0,left:q&&L&&m?q.right-L.left-m.clientLeft+m.scrollLeft+Bt:null};return M.scale===$.scale&&M.top===$.top&&M.left===$.left?M:$});};_();let g=new ResizeObserver(_);return m&&g.observe(m),b&&g.observe(b),()=>g.disconnect()},[y,k,v,r]),useEffect(()=>{let p=D.current;if(!y||!p)return;let m=b=>{let _=b.target;if(!(_ instanceof Node)||p.contains(_))return;let g=p.offsetParent;!g||!g.contains(_)||g.querySelector(".docx-paginated-surface")?.contains(_)||y.setActiveReviewItem(null);};return document.addEventListener("mousedown",m,true),()=>document.removeEventListener("mousedown",m,true)},[y,v,r]);let[xe,Et]=useState(null);useEffect(()=>{let p=D.current,m=p?.offsetParent;if(!m)return;let b=0,_=()=>{b=0,Et(L=>{let $=m.scrollTop-ft,ue=m.scrollTop+m.clientHeight+ft;return L&&L.top===$&&L.bottom===ue?L:{top:$,bottom:ue}});},g=0,M=()=>{b===0&&(b=requestAnimationFrame(_)),p?.setAttribute("data-scrolling",""),window.clearTimeout(g),g=window.setTimeout(()=>p?.removeAttribute("data-scrolling"),150);};_(),m.addEventListener("scroll",M,{passive:true});let q=new ResizeObserver(M);return q.observe(m),()=>{b!==0&&cancelAnimationFrame(b),window.clearTimeout(g),m.removeEventListener("scroll",M),q.disconnect();}},[y,v,r]);let[B,he]=useState(null),Fe=useCallback(()=>{y&&(y.surface?.retainSelection(),E(true),he(y.getSelectionPlacement()?.anchorY??null));},[y,E]),je=useCallback(()=>{y?.surface?.releaseSelection(),he(null),y?.focus();},[y]);useEffect(()=>{Z||B===null||(y?.surface?.releaseSelection(),he(null));},[Z,B,y]);let Ue=B??N.selectionAnchorY,U=useMemo(()=>{let p=ke(k);return k.filter(m=>!Pe(m,p))},[k]),ze=useMemo(()=>{if(B===null)return U;let p=U.findIndex(b=>b.anchorY!==null&&b.anchorY>B),m={key:ve,anchorY:B};return p===-1?[...U,m]:[...U.slice(0,p),m,...U.slice(p)]},[U,B]),Qe=useMemo(()=>{let p=new Map(Ze);for(let m of U){if(p.has(m.key))continue;let b=m.text.length+(m.kind==="revision"?m.replacedText?.length??0:0),_=Math.min(6,Math.max(1,Math.ceil(b/36)));p.set(m.key,64+_*20);}return p},[Ze,U]),{stacked:ge,collapsedKeys:Ge}=useMemo(()=>{let p=S.scale,m=new Map,b=new Set,_=Number.NEGATIVE_INFINITY;for(let g of ze){let M=g.anchorY===null?Number.isFinite(_)?_:0:Math.max(g.anchorY,_);m.set(g.key,M);let q=g.anchorY===null?0:(M-g.anchorY)*p,L="isActive"in g&&g.isActive,$=q>Ut&&!L&&g.key!==ve;$&&b.add(g.key);let ue=$?jt:Qe.get(g.key)??Ft;_=M+(ue+u)/p;}return {stacked:m,collapsedKeys:b}},[ze,Qe,u,S.scale]),Ne=Ue===null?null:S.top+(ge.get(ve)??Ue)*S.scale,We=n?.className,Tt=useMemo(()=>({t:o,cardClassName:We,review:{...N,items:k},allItems:A.items,authorSlots:Ke,byId:Ye,measure:Be,beginDraft:Fe,endDraft:je}),[o,We,N,A.items,k,Ke,Ye,Be,Fe,je]);if(r||v)return null;let Xe={ref:D,className:`docx-review${e?` ${e}`:""}`,"data-testid":"review-rail","data-count":k.length,"data-open":Z?"":void 0,role:"complementary","aria-label":T("review.ariaLabel"),onMouseDown:j,style:S.left===null?void 0:{left:S.left,right:"auto"}},Je=typeof t=="function"?{}:Rt(t),ne=(p,m)=>{if(!(p in Je))return m;let b=Je[p];return !isValidElement(b)||!isValidElement(m)?b:cloneElement(b,{...m.props,...b.props})},et=a?jsxs(Fragment,{children:[ne("AddComment",jsx(Me,{top:Ne,drafting:B!==null})),!Z||B===null||Ne===null?null:ne("Draft",jsx(De,{top:Ne})),ne("Balloon",jsx(Se,{}))]}):null,It=a?Z?ne("List",jsx(fe,{stack:d,positions:ge,collapsed:Ge,scale:S.scale,offset:S.top,window:xe,children:t})):ne("Markers",jsx(Ae,{scale:S.scale,offset:S.top,window:xe})):typeof t=="function"?null:t;return jsx(Ie.Provider,{value:Tt,children:l&&isValidElement(t)?jsx(Slot,{...Xe,children:cloneElement(t,void 0,t.props.children,a?jsx(fe,{stack:d,positions:ge,collapsed:Ge,scale:S.scale,offset:S.top,window:xe}):null,et)}):jsxs("aside",{...Xe,children:[Z&&i!==void 0?jsx("div",{className:"docx-review__furniture","data-testid":"review-furniture",children:i}):null,It,et]})})}function fe({stack:e=true,positions:i,collapsed:l,scale:r=1,offset:t=0,window:o=null,children:n,className:a,hidden:d}){let{review:u,measure:c,cardClassName:w}=H();if(d)return null;let R=ke(u.items),y=u.items.filter(v=>!Pe(v,R));return y.length===0?typeof n=="function"?null:jsx(Oe,{}):jsx("div",{className:`docx-review__list${a?` ${a}`:""}`,children:y.map(v=>{let f=e?i?.get(v.key)??v.anchorY:v.anchorY,x=f==null?null:t+f*r;if(x!==null&&o&&(x<o.top||x>o.bottom))return null;let A=x===null?{}:{position:"absolute",top:x};return jsx(I.Provider,{value:v,children:jsx("div",{className:"docx-review__slot",style:A,...l?.has(v.key)?{"data-collapsed":""}:{},ref:N=>{c(N,v.key);},children:typeof n=="function"?n(v):jsx(Le,{...w?{className:w}:{},children:n})})},v.key)})})}fe.docxReviewPart="List";function Ae({scale:e=1,offset:i=0,window:l=null,className:r,hidden:t,icon:o}){let{review:n}=H(),a=Y();if(t)return null;let d=ke(n.items),u=n.items.filter(c=>!Pe(c,d));return jsx("div",{className:`docx-review__markers${r?` ${r}`:""}`,children:u.map(c=>{if(c.anchorY===null)return null;let w=i+c.anchorY*e;return l&&(w<l.top||w>l.bottom)?null:jsx("button",{type:"button",className:"docx-review__marker","data-testid":"review-marker","data-kind":c.kind==="revision"?c.revisionKind:c.kind,style:{position:"absolute",top:w},title:c.author?`${c.author}: ${c.text}`:c.text,"aria-label":`${a("review.showPane")}: ${c.author?`${c.author}. `:""}${c.text}`,onMouseDown:j,onClick:()=>{n.setPaneOpen(true),n.setActive(c.key);},children:(typeof o=="function"?o(c):o)??X(mt(c))},c.key)})})}Ae.docxReviewPart="Markers";function Me({top:e,drafting:i=false,className:l,hidden:r,children:t}){let{beginDraft:o}=H(),n=Y();if(r||i||e===null)return null;let a={type:"button",className:`docx-review__add${l?` ${l}`:""}`,"data-testid":"review-add-comment",style:{position:"absolute",top:e},"aria-label":n("common.comment"),title:n("common.comment"),onMouseDown:j,onClick:o};return t?jsx(Slot,{...a,children:t}):jsx("button",{...a,children:X(lt)})}Me.docxReviewPart="AddComment";function De({top:e,className:i,hidden:l}){let{review:r,endDraft:t,measure:o}=H(),n=Y(),[a,d]=useState(""),[u,c]=useState(false),w=useRef(null),R=useId();useEffect(()=>{w.current?.focus({preventScroll:true});},[]);let y=useCallback(()=>{if(a.trim().length===0)return;let v=r.comment(a.trim());c(!v),v&&(d(""),t());},[a,r,t]);return l?null:jsx("div",{className:`docx-review__slot${i?` ${i}`:""}`,style:{position:"absolute",top:e},ref:v=>{o(v,ve);},children:jsx("div",{className:"docx-review__card","data-testid":"review-draft","data-draft":"",children:jsxs("form",{className:"docx-review__reply-box",onSubmit:v=>{v.preventDefault(),y();},children:[jsx("label",{className:"docx-editor-sr-only",htmlFor:R,children:n("comments.addComment")}),jsx("input",{id:R,ref:w,"data-testid":"review-draft-input",className:"docx-review__input",value:a,placeholder:n("comments.addComment"),...u?{"aria-invalid":true}:{},onChange:v=>{c(false),d(v.target.value);},onKeyDown:v=>{if(v.key==="Escape"){v.preventDefault(),t();return}v.key==="Enter"&&(v.preventDefault(),y());}}),jsxs("div",{className:"docx-review__reply-actions",children:[jsx("button",{type:"button","data-testid":"review-draft-cancel",className:"docx-review__text-button",onMouseDown:j,onClick:t,children:n("common.cancel")}),jsx("button",{type:"submit","data-testid":"review-draft-submit",className:"docx-review__submit",disabled:a.trim().length===0,children:n("common.comment")})]}),u?jsx("span",{className:"docx-review__refused",role:"alert",children:n("review.commentRefused")}):null]})})})}De.docxReviewPart="Draft";function Se({className:e,hidden:i}){let{review:l,allItems:r,authorSlots:t}=H(),o=Y(),n=useRef(null),[a,d]=useState(null),u=useRef(false);u.current=a!==null,useEffect(()=>{let v=n.current,f=v?.closest(".docx-review"),x=f?.closest(".docx-editor__scroll-container")??f?.offsetParent;if(!v||!f||!x)return;let A=(E,C)=>{let T=f.getBoundingClientRect(),D=E.getBoundingClientRect(),de=E.ownerDocument.defaultView?.innerHeight??1/0,Z=Number(E.dataset.start),k=Number(E.dataset.end);d({revisionId:E.dataset.revisionId,author:E.dataset.revisionAuthor??"",...E.dataset.revisionDate!==void 0?{date:E.dataset.revisionDate}:{},...E.dataset.revisionKind!==void 0?{kind:E.dataset.revisionKind}:{},structuralSite:C,...E.dataset.paragraphId!==void 0?{paragraphId:E.dataset.paragraphId}:{},...Number.isFinite(Z)?{start:Z}:{},...Number.isFinite(k)?{end:k}:{},left:D.left-T.left,top:D.top-T.top,bottom:D.bottom-T.top,above:D.bottom+220>de});},N=E=>{let C=E.target;if(!(C instanceof Element)||v.contains(C))return;let T=C.closest("[data-revision-id]");if(T instanceof HTMLElement&&x.contains(T)){let D=T.classList.contains("docx-table-row--revision");if(T.dataset.revisionKind==="format"||D){A(T,D);return}}u.current&&d(null);};return x.addEventListener("pointerdown",N,true),x.addEventListener("mousedown",N,true),()=>{x.removeEventListener("pointerdown",N,true),x.removeEventListener("mousedown",N,true);}},[]);let c=useMemo(()=>{if(!a)return null;let v=null,f=false,x=null,A=false,N=null,E=false;for(let C of r)if(!(C.kind!=="revision"||C.item.kind!=="revision")){for(let T of C.item.addresses)if(T.id===a.revisionId){if(T.author===a.author){if(T.date===a.date)return C;v===null?v=C:v!==C&&(f=true);}x===null?x=C:x!==C&&(A=true);}if(a.paragraphId!==void 0&&a.start!==void 0&&a.end!==void 0&&(C.revisionKind==="format"||C.revisionKind==="structural")){for(let T of C.item.ranges)if(T.start.paragraphId===a.paragraphId&&T.start.offset<a.end&&T.end.offset>a.start){N===null?N=C:N!==C&&(E=true);break}}}return v!==null&&!f?v:x!==null&&!A?x:N!==null&&!E?N:null},[r,a]),w=c&&(c.revisionKind==="format"||c.revisionKind==="structural")?c:null,R=useRef(false);if(useEffect(()=>{if(w){R.current=true;return}R.current&&(R.current=false,d(null));},[w]),i)return null;let y=a?.kind==="format"?"format":"structural";return jsx("div",{ref:n,className:`docx-review__balloon-root${e?` ${e}`:""}`,children:a===null?null:jsx("div",{className:"docx-review__balloon","data-testid":"review-balloon",style:{left:a.left,top:a.above?a.top-6:a.bottom+6,transform:a.above?"translateY(-100%)":void 0},onMouseDown:j,children:w?jsx(I.Provider,{value:w,children:jsxs("div",{className:"docx-review__card","data-testid":"review-balloon-card","data-kind":w.revisionKind??"revision",style:{"--doc-review-author":`var(--doc-review-author-${(t.get(w.author)??0)%wt})`},onClick:()=>l.setActive(w.key),children:[jsxs("div",{className:"docx-review__head",children:[jsx(re,{}),jsxs("div",{className:"docx-review__meta",children:[jsx(ie,{}),jsx(ae,{})]}),w.kind==="revision"&&!w.readOnly?jsxs("div",{className:"docx-review__actions",children:[jsx(pe,{}),jsx(we,{})]}):null]}),jsx(se,{})]})}):jsxs("div",{className:"docx-review__card","data-testid":"review-balloon-card","data-kind":y,children:[jsxs("div",{className:"docx-review__head",children:[jsx("span",{className:"docx-review__avatar","aria-hidden":"true",children:Wt(a.author)}),jsxs("div",{className:"docx-review__meta",children:[jsx("span",{className:"docx-review__author",children:a.author||o("comments.unknown")}),a.date?jsx(Xt,{raw:a.date}):null]})]}),jsx("div",{className:"docx-review__summary",children:jsx("span",{className:"docx-review__label","data-kind":y,children:o(bt(y))})})]})})})}Se.docxReviewPart="Balloon";function Wt(e){let i=e.trim().split(/\s+/).filter(Boolean);return i.length===0?"?":i.slice(0,2).map(l=>l[0].toUpperCase()).join("")}function Xt({raw:e}){let i=new Date(e);return Number.isNaN(i.getTime())?null:jsx("time",{className:"docx-review__time",dateTime:e,children:yt.format(i)})}function Oe({className:e,hidden:i,children:l}){let r=Y();return i?null:jsx("div",{className:`docx-review__empty${e?` ${e}`:""}`,"data-testid":"review-empty",children:l??r("review.empty")})}Oe.docxReviewPart="Empty";function Le({className:e,asChild:i,hidden:l,children:r}){let{review:t,authorSlots:o}=H(),n=useContext(I),a=useId();if(l||!n)return null;let d=o.get(n.author)??0,u={className:`docx-review__card${e?` ${e}`:""}`,"data-testid":"review-card","aria-labelledby":`${a}-author ${a}-summary`,"data-kind":n.kind==="revision"?n.revisionKind??"revision":n.kind,...n.kind==="custom"&&n.item.kind==="custom"?{"data-node-name":n.item.name}:{},...n.isActive?{"data-active":""}:{},...n.kind==="comment"&&n.resolved?{"data-resolved":""}:{},style:{"--doc-review-author":`var(--doc-review-author-${d%wt})`},tabIndex:0,role:"button",id:a,onMouseDown:c=>{c.target?.closest("[data-review-selectable]")||c.currentTarget.focus({preventScroll:true});},onClick:()=>t.setActive(n.key),onKeyDown:c=>{c.target===c.currentTarget&&(c.key!=="Enter"&&c.key!==" "||(c.preventDefault(),t.setActive(n.key)));}};return i?jsx(Slot,{...u,children:r}):jsx("div",{...u,children:jsx(Jt,{children:r})})}Le.docxReviewPart="Card";function Jt({children:e}){let i=useContext(I),l=useMemo(()=>Rt(e),[e]),r=(o,n)=>o in l?l[o]:n;if(!i)return null;if(i.kind==="custom"&&i.item.kind==="custom"){let o=i.item;return jsxs(Fragment,{children:[jsxs("div",{className:"docx-review__head",children:[r("Avatar",null),jsx("div",{className:"docx-review__meta",children:r("Author",jsx("span",{className:"docx-review__author","data-testid":"review-custom-title",children:o.title}))})]}),r("Summary",o.detail?jsx("div",{className:"docx-review__summary","data-testid":"review-summary","data-review-selectable":"",children:jsx("span",{className:"docx-review__text",children:o.detail})}):null),l.__extra]})}let t=i.kind==="revision"&&!i.readOnly;return jsxs(Fragment,{children:[jsxs("div",{className:"docx-review__head",children:[r("Avatar",jsx(re,{})),jsxs("div",{className:"docx-review__meta",children:[r("Author",jsx(ie,{})),r("Time",jsx(ae,{}))]}),t||i.kind==="comment"?jsxs("div",{className:"docx-review__actions",children:[r("Accept",jsx(pe,{})),r("Reject",jsx(we,{})),r("Delete",jsx(Re,{}))]}):null]}),r("Summary",jsx(se,{})),r("Replies",jsx(He,{})),r("Reply",jsx(qe,{})),l.__extra]})}function Rt(e){let i={},l=[],r=t=>{if(Array.isArray(t)){t.forEach(r);return}if(!t||typeof t!="object"||!("type"in t)){t&&l.push(t);return}if(t.type===Fragment$1){r(t.props.children);return}let o=t.type.docxReviewPart;o?i[o]=t:l.push(t);};return r(e),l.length>0&&(i.__extra=l),i}function re({className:e,asChild:i,hidden:l,children:r}){let t=useContext(I);if(l||!t||r===void 0&&!t.initials)return null;let o={className:`docx-review__avatar${e?` ${e}`:""}`,"data-testid":"review-avatar","aria-hidden":true};return i?jsx(Slot,{...o,children:r}):jsx("span",{...o,children:r??t.initials})}re.docxReviewPart="Avatar";function ie({className:e,asChild:i,hidden:l,children:r}){let t=useContext(I),o=Y();if(l||!t)return null;let n=t.author||o("comments.unknown"),a={className:`docx-review__author${e?` ${e}`:""}`,"data-testid":"review-author"};return i?jsx(Slot,{...a,children:r}):jsx("span",{...a,children:r??n})}ie.docxReviewPart="Author";function ae({className:e,asChild:i,hidden:l,children:r}){let t=useContext(I);if(l||!t)return null;let o=t.date;if(!o)return null;let n=new Date(o);if(Number.isNaN(n.getTime()))return null;let a={className:`docx-review__time${e?` ${e}`:""}`,"data-testid":"review-time",dateTime:o};return i?jsx(Slot,{...a,children:r}):jsx("time",{...a,children:r??yt.format(n)})}ae.docxReviewPart="Time";var yt=new Intl.DateTimeFormat(void 0,{month:"short",day:"numeric",hour:"numeric",minute:"2-digit"});function se({className:e,asChild:i,hidden:l,children:r}){let t=useContext(I),o=Y();if(l||!t)return null;let n=t.text,a=t.kind!=="revision"?null:o(bt(t.revisionKind)),d=t.kind==="revision"&&t.revisionKind==="replace",u={className:`docx-review__summary${e?` ${e}`:""}`,"data-testid":"review-summary","data-review-selectable":""};return i?jsx(Slot,{...u,children:r}):jsx("div",{...u,children:r??(d?jsxs("span",{className:"docx-review__text",children:[o("review.replaced")," ",jsxs("span",{className:"docx-review__removed",children:['"',t.replacedText,'"']})," ",o("review.replacedWith")," ",jsxs("span",{className:"docx-review__added",children:['"',n,'"']})]}):jsxs(Fragment,{children:[a?jsx("span",{className:"docx-review__label","data-kind":t.kind==="revision"?t.revisionKind:"revision",children:a}):null,n?jsx("span",{className:"docx-review__text",children:n}):null]}))})}se.docxReviewPart="Summary";function bt(e){switch(e){case "insert":return "review.inserted";case "delete":return "review.deleted";case "replace":return "review.replaced";case "moveFrom":return "review.movedFrom";case "moveTo":return "review.movedTo";case "format":return "revisions.runPropertiesChanged";case "paragraphMark":return "revisions.paragraphMarkInserted";default:return "review.structural"}}function pe({className:e,asChild:i,hidden:l,children:r,icon:t}){let{review:o}=H(),n=useContext(I),a=Y();if(l||!n||n.kind!=="revision"||n.readOnly)return null;let d=a("review.accept"),u={type:"button",className:`docx-review__action${e?` ${e}`:""}`,"data-testid":"review-accept","aria-label":d,title:d,onMouseDown:j,onClick:c=>{c.stopPropagation(),o.accept(n);}};return i?jsx(Slot,{...u,children:r}):jsx("button",{...u,children:t??r??X(ct)})}pe.docxReviewPart="Accept";function we({className:e,asChild:i,hidden:l,children:r,icon:t}){let{review:o}=H(),n=useContext(I),a=Y();if(l||!n||n.kind!=="revision"||n.readOnly)return null;let d=a("review.reject"),u={type:"button",className:`docx-review__action${e?` ${e}`:""}`,"data-testid":"review-reject","aria-label":d,title:d,onMouseDown:j,onClick:c=>{c.stopPropagation(),o.reject(n);}};return i?jsx(Slot,{...u,children:r}):jsx("button",{...u,children:t??r??X(dt)})}we.docxReviewPart="Reject";function Re({className:e,asChild:i,hidden:l,children:r,icon:t}){let{review:o}=H(),n=useContext(I),{t:a}=useTranslation();if(l||!n||n.kind==="custom"||n.kind==="revision"&&n.readOnly)return null;let d=n.kind==="comment"?a("review.deleteComment"):a("review.discardChange"),u={type:"button",className:`docx-review__action${e?` ${e}`:""}`,"data-testid":"review-delete","aria-label":d,title:d,onMouseDown:j,onClick:c=>{c.stopPropagation(),o.remove(n);}};return i?jsx(Slot,{...u,children:r}):jsx("button",{...u,children:t??r??X(ut)})}Re.docxReviewPart="Delete";function He({className:e,hidden:i}){let{byId:l}=H(),r=useContext(I);if(i||!r||r.kind==="custom")return null;let t=r.replyIds.map(o=>l.get(o)).filter(o=>o!==void 0);return t.length===0?null:jsx("ol",{className:`docx-review__replies${e?` ${e}`:""}`,children:t.map(o=>jsx(I.Provider,{value:o,children:jsxs("li",{className:"docx-review__reply","data-testid":"review-reply",children:[jsxs("div",{className:"docx-review__head",children:[jsx(re,{}),jsxs("div",{className:"docx-review__meta",children:[jsx(ie,{}),jsx(ae,{})]}),jsx("div",{className:"docx-review__actions",children:jsx(Re,{})})]}),jsx(se,{})]})},o.key))})}He.docxReviewPart="Replies";function qe({className:e,hidden:i,children:l}){let{review:r}=H(),t=useContext(I),o=Y(),[n,a]=useState(""),[d,u]=useState(false),c=useId(),w=useCallback(()=>{if(!t||n.trim().length===0)return;let R=r.reply(t,n.trim());u(!R),R&&a("");},[t,n,r]);return i||!t||!t.isActive?null:l?jsx(Fragment,{children:l}):jsxs("form",{className:`docx-review__reply-box${e?` ${e}`:""}`,onSubmit:R=>{R.preventDefault(),w();},children:[jsx("label",{className:"docx-editor-sr-only",htmlFor:c,children:o("comments.replyPlaceholder")}),jsx("input",{id:c,"data-testid":"review-reply-input",className:"docx-review__input",value:n,placeholder:o("comments.replyPlaceholder"),...d?{"aria-invalid":true,"data-refused":""}:{},onChange:R=>{u(false),a(R.target.value);},onClick:R=>R.stopPropagation(),onKeyDown:R=>{R.key==="Enter"&&(R.preventDefault(),w());}}),jsxs("div",{className:"docx-review__reply-actions",children:[jsx("button",{type:"button","data-testid":"review-reply-cancel",className:"docx-review__text-button",onMouseDown:j,onClick:R=>{R.stopPropagation(),a(""),u(false),r.setActive(null);},children:o("common.cancel")}),jsx("button",{type:"submit","data-testid":"review-reply-submit",className:"docx-review__submit",disabled:n.trim().length===0,children:o("review.reply")})]}),d?jsx("span",{className:"docx-review__refused",role:"alert","data-testid":"review-reply-refused",children:o("review.replyRefused")}):null]})}qe.docxReviewPart="Reply";var en=Object.assign(Gt,{List:fe,Empty:Oe,Card:Le,Avatar:re,Author:ie,Time:ae,Summary:se,Accept:pe,Reject:we,Delete:Re,Replies:He,Reply:qe,Markers:Ae,AddComment:Me,Draft:De,Balloon:Se});function le(e){let i=useDocxEditor();return useMemo(()=>e||(i?.getCustomNodeDefinitions()??[]).filter(j$1),[e,i])}var rn=".docx-content-control-boundary";function J(e,i){let{node:l,definition:r,controlId:t}=e,o=t?i?.getReviewItems().find(d=>d.kind==="custom"&&d.item.id===t):void 0;if(o&&o.kind==="custom"){let d=o.item;return {...l,attrs:d.attrs,text:d.text,...d.data===void 0?{}:{data:d.data},...t?{nodeId:t}:{}}}let n=t?an(i,t,r):void 0,a=r.fromDocx?r.fromDocx({attrs:l.attrs,text:"",...n===void 0?{}:{data:n}}):l.attrs;return a===null?null:{...l,attrs:a,...n===void 0?{}:{data:n},...t?{nodeId:t}:{}}}function an(e$1,i,l){let r=e$1?.surface;if(!r)return;let t=r.session.part(),o=customNodePayloadsByControl(r.session.currentPackage(),t.name).get(i);if(!o)return;let n=e(l.schema,o.data);return n.ok?n.value:void 0}function ee(e,i){let l=e?.closest?.(rn),r=l?.closest(".docx-content-control-chrome"),t=r?.getAttribute("data-tag"),o=t?c(t):null;if(!l||!o||!t)return null;let n=i.find(a=>a.tagPrefix===o.prefix&&a.name===o.name);return n?{node:{name:o.name,attrs:o.attrs,tag:t,rect:l.getBoundingClientRect()},definition:n,controlId:r?.getAttribute("data-docx-content-control")??null}:null}var $e=".docx-content-control-boundary",ln=e=>{if(!k.test(e.tagPrefix)||!k.test(e.name))return [];let i=`${e.tagPrefix}:${e.name}`;return [`.docx-content-control-chrome[data-tag="${i}"]`,`.docx-content-control-chrome[data-tag^="${i}?"]`]};function cn(e){let{onNodeClick:i,onNodeHover:l}=e,r=useDocxEditor(),t=le(e.nodes);return useEffect(()=>{let o=document.createElement("style"),n=[];for(let a of t){let d=ln(a);if(d.length===0)continue;let u=a.chrome?.color!==void 0&&CSS.supports("color",a.chrome.color)?a.chrome.color:"#2563eb";n.push(`${d.map(c=>`${c} ${$e}`).join(", ")} {`," pointer-events: auto !important;"," opacity: 1;"," border: none;",` background: color-mix(in srgb, ${u} 12%, transparent);`," border-radius: 6px;"," cursor: default;","}");}return o.textContent=n.join(`
|
|
2
|
+
`),document.head.append(o),()=>o.remove()},[t]),useEffect(()=>{let o=null,n=null,a=w=>ee(document.elementFromPoint(w.clientX,w.clientY),t),d=w=>{let R=w.button===0?a(w):null;o=R?.controlId??null,n=R?.node.tag??null;},u=w=>{let R=o,y=n;if(o=null,n=null,y===null)return;let v=a(w);if(!v||v.node.tag!==y||R!==null&&v.controlId!==R)return;let f=J(v,r);f&&(v.definition.onClick?.(f),i?.(f));},c=w=>{let R=ee(w.target,t);if(!R||w.relatedTarget?.closest?.($e)===w.target.closest($e))return;let v=J(R,r);v&&(R.definition.onHover?.(v),l?.(v));};return document.addEventListener("pointerdown",d,true),document.addEventListener("pointerup",u,true),document.addEventListener("mouseover",c),()=>{document.removeEventListener("pointerdown",d,true),document.removeEventListener("pointerup",u,true),document.removeEventListener("mouseover",c);}},[t,r,i,l]),null}function Nt(e){let{onEditNode:i,onRemoveRefused:l,remove:r=true}=e,t=le(e.nodes),o=useContextMenuTarget(),n=useDocxEditor(),{t:a}=useTranslation(),d=useMemo(()=>o?ee(o,t):null,[o,t]),u=useMemo(()=>d?J(d,n):null,[d,n]),c=useMemo(()=>!d?.definition.reviewCard||!u?null:d.definition.reviewCard({attrs:u.attrs,text:u.text??"",...u.data===void 0?{}:{data:u.data}}),[d,u]);if(!d||!u)return null;let{definition:w}=d,R=w.label??w.name,y=w.onEdit!==void 0||i!==void 0,v=r&&u.nodeId!==void 0&&n!==null;return !c&&!y&&!v?null:jsxs(Fragment,{children:[c?jsxs("div",{className:"docx-contextmenu__custom-info","data-testid":"custom-node-info",children:[jsx("span",{className:"docx-contextmenu__custom-title",children:c.title}),c.detail?jsx("span",{className:"docx-contextmenu__custom-detail",children:c.detail}):null]}):null,y?jsx(ContextMenuItem,{label:a("contextMenu.editCustomNode",{label:R}),className:"docx-contextmenu__custom-edit",onSelect:()=>{w.onEdit?.(u),i?.(u,w);}}):null,v?jsx(ContextMenuItem,{label:a("contextMenu.removeCustomNode",{label:R}),className:"docx-contextmenu__custom-remove",onSelect:()=>{let f=q(n,u.nodeId);f.ok||l?.(u,f.reason);}}):null,jsx("div",{role:"separator",className:"docx-toolbar__menu-separator"})]})}Nt.docxRowPlacement="start";export{cn as CustomNodeChrome,Nt as CustomNodeContextMenu,en as DocxEditorReview,J as activatedCustomNodeOf,ee as resolveCustomNodeActivation,le as useCustomNodeDefinitions,me as useReview,Yt as useReviewItem,it as useReviewOf,Mt as useStackedReviewPositions};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@docx-editor.dev/pro",
|
|
3
|
-
"version": "2.1.
|
|
3
|
+
"version": "2.1.2",
|
|
4
4
|
"description": "Commercial capabilities for @docx-editor.dev: the review module (comments, tracked changes, markup rendering) and custom inline nodes over content controls.",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"type": "module",
|
package/dist/chunk-FVI3MGO7.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import {contentControlsIn,contentControlPropertiesOf,contentControlTextOf,findNode,revisionItemsOf,collectReviewItems,paragraphOrderOfPart,parseNoteScopeId,locateSites,customNodePayloadsOf,customNodePayloadsByControl,segmentsOf}from'@docx-editor.dev/core/store';import {reviewItemPositionRank}from'@docx-editor.dev/core/layout';function g(e){}var Oe=64,H=new Set(["__proto__","constructor","prototype"]);function h(e,t,o){let n=new URLSearchParams;for(let[s,d]of Object.entries(o))n.set(s,d);let r=n.toString(),a=r.length>0?`${e}:${t}?${r}`:`${e}:${t}`;return a.length>64?{ok:false,reason:"tag-overflow",length:a.length}:{ok:true,tag:a}}function N(e){if(e.length>64)return null;let t=e.indexOf(":");if(t<=0)return null;let o=e.slice(0,t),n=e.slice(t+1),r=n.indexOf("?"),a=r===-1?n:n.slice(0,r);if(a.length===0)return null;let s=Object.create(null);if(r!==-1)for(let[d,i]of new URLSearchParams(n.slice(r+1))){if(H.has(d))return null;s[d]=i;}return {prefix:o,name:a,attrs:s}}var Ie=262144;function x(e,t){if(t.length===0)return {ok:false,reason:"malformed",issues:["the node carries no payload"]};if(t.length>262144)return {ok:false,reason:"malformed",issues:[`the payload is ${String(t.length)} characters; the cap is ${String(262144)}`]};let o;try{o=JSON.parse(t);}catch(a){return {ok:false,reason:"malformed",issues:[a instanceof Error?a.message:"the payload is not JSON"]}}let n=I(o);if(!e)return {ok:true,value:n};let r=e["~standard"].validate(n);return B(r)?{ok:false,reason:"async",issues:["the schema validates asynchronously, which the read path cannot await"]}:r.issues?{ok:false,reason:"invalid",issues:r.issues.map(q)}:{ok:true,value:r.value}}function R(e){let t;try{t=JSON.stringify(e)??"";}catch(o){return {ok:false,reason:"malformed",issues:[o instanceof Error?o.message:"the value cannot be serialized"]}}return t.length===0?{ok:false,reason:"malformed",issues:["the value serializes to nothing"]}:t.length>262144?{ok:false,reason:"malformed",issues:[`the payload is ${String(t.length)} characters; the cap is ${String(262144)}`]}:{ok:true,value:t}}function B(e){return typeof e.then=="function"}function q(e){let t=(e.path??[]).map(o=>String(typeof o=="object"?o.key:o)).join(".");return t.length>0?`${t}: ${e.message}`:e.message}var Y=new Set(["__proto__","constructor","prototype"]);function I(e){if(Array.isArray(e))return e.map(I);if(e===null||typeof e!="object")return e;let t=Object.create(null);for(let[o,n]of Object.entries(e))Y.has(o)||(t[o]=I(n));return t}function _(e){let t=(e.path??[]).map(o=>{let n=typeof o=="object"?o.key:o;return typeof n=="number"?n:String(n)});return {message:e.message,path:t,pointer:t.join(".")}}function S(e,t){return {ok:false,code:"invalidArgs",reason:e,issues:t}}var b="docxEditor";function v(e){return e.payloadNamespace??`urn:docx-editor.dev:custom-node:${e.tagPrefix}`}function M(e,t,o){let n=0;for(let r of customNodePayloadsOf(e,t,o).keys()){let a=/^cx(\d{1,9})$/.exec(r);if(!a)continue;let s=Number(a[1]);s>n&&(n=s);}return `cx${String(n+1)}`}function L(e,t){let o=R(t);if(!o.ok)return {ok:false,reason:`the payload cannot be serialized: ${o.issues.join(", ")}`,issues:[]};if(!e.schema)return {ok:true,data:o.value,value:t};let r=e.schema["~standard"].validate(JSON.parse(o.value));if(Q(r))return {ok:false,reason:`${e.name}'s schema validates asynchronously, which a write cannot await`,issues:[]};if(r.issues){let s=r.issues.map(_);return {ok:false,reason:`the payload does not match ${e.name}'s schema: `+s.map(d=>(d.pointer?`${d.pointer}: `:"")+d.message).join(", "),issues:s}}let a=R(r.value);return a.ok?{ok:true,data:a.value,value:r.value}:{ok:false,reason:`the payload cannot be serialized: ${a.issues.join(", ")}`,issues:[]}}function Q(e){return typeof e.then=="function"}function z(e){return typeof e=="object"&&e!==null&&typeof e.name=="string"&&typeof e.tagPrefix=="string"}var V=/^[A-Za-z0-9_.-]+$/,te=/['"<>&]|[\u0000-\u0008\u000B\u000C\u000E-\u001F\u007F]/;function oe(e){return e.length>0&&!te.test(e)}function Ve(e){if(!V.test(e.name??""))throw new Error(`defineCustomNode: invalid name ${JSON.stringify(e.name)}`);if(!V.test(e.tagPrefix??""))throw new Error(`defineCustomNode: invalid tagPrefix ${JSON.stringify(e.tagPrefix)}`);let t=e.schema;if(t!==void 0&&typeof t?.["~standard"]?.validate!="function")throw new Error(`defineCustomNode: ${JSON.stringify(e.name)} has a schema that does not implement Standard Schema`);if(e.payloadNamespace!==void 0&&!oe(e.payloadNamespace))throw new Error(`defineCustomNode: ${JSON.stringify(e.name)} has a payloadNamespace that cannot be written into an XPath \u2014 no quotes, angle brackets, ampersands or control characters: ${JSON.stringify(e.payloadNamespace)}`);if(e.preserveOnExport!==void 0&&e.preserveOnExport!==true&&e.preserveOnExport!==false&&e.preserveOnExport!=="text")throw new Error(`defineCustomNode: ${JSON.stringify(e.name)} has an unknown preserveOnExport ${JSON.stringify(e.preserveOnExport)}`);return Object.freeze({...e,dataOf:n=>{if(!n||n.data===void 0||n.name!==void 0&&n.name!==e.name)return;if(!e.schema)return n.data;let r=e.schema["~standard"].validate(n.data);if(typeof r.then=="function")return;let a=r;return a.issues?void 0:a.value}})}function ze(e){g(e.licenseKey);let t=new Set;for(let o of e.nodes){let n=`${o.tagPrefix}:${o.name}`;if(t.has(n))throw new Error(`customNodesModule: two definitions claim ${JSON.stringify(n)}`);t.add(n);}return {id:"custom-nodes",customNodes:e.nodes,...e.onDiagnostic?{onCustomNodeDiagnostic:o=>{e.onDiagnostic?.(o);}}:{},customNodePayloadNamespaces:[...new Set(e.nodes.map(v))]}}function ne(e){for(let t of e.children)if(!(t.kind==="textValue"||t.localName!=="sdtPr")){for(let o of t.children)if(!(o.kind==="textValue"||o.localName!=="tag")){for(let n of o.attributes)if(n.localName==="val")return n.value}}}function j(e){if(e.kind==="textValue")return e.value;let t="";for(let o of e.children)t+=j(o);return t}function W(e,t,o={}){if(t.length===0)return [];let n=new Map;for(let s of t){let d=`${s.tagPrefix}:${s.name}`;if(n.has(d))throw new Error(`recognizeCustomNodes: duplicate definition for ${JSON.stringify(d)}`);n.set(d,s);}let r=[],a=(s,d)=>{if(!(s.kind==="textValue"||d>64)){if(s.kind==="contentControl"){let i=ne(s),c=i!==void 0?N(i):null,u=c?n.get(`${c.prefix}:${c.name}`):void 0;if(c&&u&&i!==void 0){let l=j(s),f=re(u,s.id,o.payloads?.get(s.id),contentControlPropertiesOf(s).dataBinding!==void 0,o.onDiagnostic),m=u.fromDocx?u.fromDocx({attrs:c.attrs,text:l,...f.present?{data:f.value}:{}}):c.attrs;if(m!==null){r.push({name:u.name,attrs:m,text:l,nodeId:s.id,tag:i,...f.present?{data:f.value}:{}});return}}}for(let i of s.children)a(i,d+1);}};return a(e.root,0),r}function re(e,t,o,n,r){if(!o)return n&&r?.({code:"payload-missing",name:e.name,nodeId:t,issues:["the control binds a store node this document does not hold"]}),{present:false};let a=x(e.schema,o.data);return a.ok?{present:true,value:a.value}:(r?.({code:"payload-invalid",name:e.name,nodeId:t,issues:a.issues}),{present:false})}function K(e,t){let o=findNode(e,t);return !o||o.kind!=="paragraph"?[]:revisionItemsOf({id:e.id,name:e.name,contentType:e.contentType,root:o})}function ce(e,t,o,n){if(t.length===0)return [];let r=W(e,t,{...o===void 0?{}:{payloads:o},...n===void 0?{}:{onDiagnostic:n}});if(r.length===0)return [];let a=locateSites(e),s=[];for(let d of r){let i=t.find(l=>l.name===d.name&&d.tag.startsWith(`${l.tagPrefix}:`));if(!i)continue;let c=i.reviewCard?i.reviewCard({attrs:d.attrs,text:d.text,...d.data===void 0?{}:{data:d.data}}):null;if(i.reviewCard&&c===null)continue;let u=a.get(d.nodeId);s.push({kind:"custom",id:d.nodeId,name:d.name,tag:d.tag,attrs:d.attrs,text:d.text,...d.data===void 0?{}:{data:d.data},carded:i.reviewCard!==void 0&&c!==null,title:c?.title??"",...c?.detail!==void 0?{detail:c.detail}:{},range:u?{partName:e.name,start:{paragraphId:u.paragraphId,offset:u.start},end:{paragraphId:u.paragraphId,offset:u.end}}:null});}return s}function U(e){let t=collectReviewItems(e),o=(e.customNodes??[]).filter(z);if(o.length===0)return t;let n=[e.storyPart],r=new Set([e.storyPart.name]);for(let i of e.furnitureParts??[])r.has(i.name)||(r.add(i.name),n.push(i));let a=[],s=new Map;for(let i of n){a.push(...ce(i,o,i.name===e.storyPart.name?e.customNodePayloads:void 0,e.reportCustomNodeDiagnostic));let c=s.size;for(let[u,l]of paragraphOrderOfPart(i))s.has(u)||s.set(u,c+l);}return a.length===0?t:[...t,...a].sort((i,c)=>reviewItemPositionRank(i,s)-reviewItemPositionRank(c,s))}function ot(e={}){return g(e.licenseKey),{id:"review",review:{displayModes:["all-markup","proposed","original"],collectReviewItems:U,revisionItemsOfParagraph:K}}}function G(e){return e.surface??null}function E(e,t){if(t==null)return null;let o=L(e,t);return o.ok?{ok:true,serialized:o.data,value:o.value}:{ok:false,reason:o.reason,issues:o.issues}}function D(e,t,o,n,r){let a=v(t),s=e.session.part().name;return {namespaceUri:a,rootLocalName:b,nodeId:r??M(e.session.currentPackage(),s,a),label:n,data:o}}function k(e){let t=e.detail?`${e.reason}: ${e.detail}`:e.reason;return {ok:false,code:me.has(e.reason)?"invalidArgs":"unsupported",reason:t}}var me=new Set(["payload-too-large","unaddressable-payload","store-not-authored","offset-out-of-range","invalid-range","invalid-property-value","splits-surrogate-pair"]);function A(e,t,o){let n,r;if(o!==void 0)try{n=e.text?.(o),r=e.tagAttrs?.(o);}catch(s){return {reason:`${e.name} could not describe this payload: ${s instanceof Error?s.message:String(s)}`}}let a=t.text??n;return a===void 0?{reason:e.text?`${e.name} derives its text from \`data\`, so pass one \u2014 or pass \`text\` directly`:`${e.name} declares no \`text\`, so \`text\` is required`}:t.attrs===void 0&&e.tagAttrs&&r===void 0?{reason:`${e.name} derives its tag attrs from \`data\`, so pass one \u2014 or pass \`attrs\` directly`}:{attrs:t.attrs??r??{},text:a}}function C(e){return e.getEditingMode()==="viewing"?{ok:false,code:"locked",reason:"the document is open for viewing"}:null}function P(e){let t=e.getActiveScope();if(t.kind==="headerFooter")return {kind:"headerFooter",rId:t.rId};if(t.kind==="note"){let o=parseNoteScopeId(t.id);if(o)return {kind:"notesPart",noteKind:o.noteKind}}return {kind:"body"}}function T(e,t){let o=G(e),n=t===void 0?"":t.slice(0,t.indexOf("#"));if(!o||n.length===0)return P(e);if(n===o.session.part().name)return {kind:"body"};for(let r of o.session.headerFooterResolutionBySection())for(let a of [r.headers,r.footers])for(let s of a.values())if(s.partName===n)return {kind:"headerFooter",rId:s.rId};for(let r of ["footnote","endnote"])if(o.session.partFor({kind:"notesPart",noteKind:r})?.name===n)return {kind:"notesPart",noteKind:r};return P(e)}function it(e,t,o={}){let n=G(e);if(!n)return {ok:false,code:"notFound",reason:"no document is mounted"};let r=E(t,o.data);if(r&&!r.ok)return S(r.reason,r.issues);let a=A(t,o,r?.value);if("reason"in a)return {ok:false,code:"invalidArgs",reason:a.reason};let s=h(t.tagPrefix,t.name,a.attrs);if(!s.ok)return {ok:false,code:"invalidArgs",reason:`the encoded tag is ${s.length} characters; Word caps w:tag at 64 \u2014 move what does not fit into the payload (\`data\`), or shorten the attrs`};let d=C(e);if(d)return d;let i=o.at??n.state().selection.head,c=o.lock===void 0?"contentLocked":o.lock,u=P(e),l=n.session.insertCustomNode({paragraphId:i.paragraphId,offset:i.offset,tag:s.tag,text:a.text,...o.alias===void 0?{}:{alias:o.alias},...c===false?{}:{lock:c},...r?{payload:D(n,t,r.serialized,a.text)}:{}},u);return l.ok?{ok:true,changed:true,...l.nodeId===void 0?{}:{nodeId:l.nodeId}}:k(l)}function J(e){return e.surface??null}function Ne(e,t){let o=null,n=a=>a.id===t?true:a.kind==="textValue"?false:a.children.some(n),r=(a,s)=>{if(!(o||a.kind==="textValue"||s>64)){if(a.kind==="paragraph"){n(a)&&(o=a);return}for(let d of a.children)r(d,s+1);}};return r(e.root,0),o}function xe(e,t){let o=new Set,n=i=>{if(o.add(i.id),i.kind!=="textValue")for(let c of i.children)n(c);},r=i=>{if(i.id===t)return i;if(i.kind==="textValue")return null;for(let c of i.children){let u=r(c);if(u)return u}return null},a=r(e);if(!a)return null;n(a);let s=Number.MAX_SAFE_INTEGER,d=-1;for(let i of segmentsOf(e))o.has(i.runId)&&(i.start<s&&(s=i.start),i.end>d&&(d=i.end));return d<0?null:{start:s,end:d}}function gt(e,t){let o=J(e);if(!o)return {ok:false,code:"notFound",reason:"no document is mounted"};let n=C(e);if(n)return n;let r=o.session.removeCustomNode(t,T(e,t));return r.ok?{ok:true,changed:true}:k(r)}function ht(e,t,o,n={}){let r=J(e);if(!r)return {ok:false,code:"notFound",reason:"no document is mounted"};let a=C(e);if(a)return a;let s=T(e,o),d=r.session.partFor(s)??r.session.part(),i=Ne(d,o),c=i?xe(i,o):null,u=Se(r,o,s);if(!i||!c||!u)return {ok:false,code:"notFound",reason:"no custom node with that id"};let l=`${t.tagPrefix}:${t.name}`;if(u.identity!==null&&u.identity!==l)return {ok:false,code:"invalidArgs",reason:`node ${o} is a ${u.identity}, not a ${l}`};let f=ke(r,o),m=n.data===null?null:n.data===void 0?ve(f):E(t,n.data);if(m&&!m.ok)return S(m.reason,m.issues);let p=A(t,{attrs:n.attrs??(n.data===void 0?u.attrs:void 0),text:n.text??(m===null&&n.data===null?u.text:void 0)},m?.value);if("reason"in p)return {ok:false,code:"invalidArgs",reason:p.reason};let O=h(t.tagPrefix,t.name,p.attrs);if(!O.ok)return {ok:false,code:"invalidArgs",reason:`the encoded tag is ${O.length} characters; Word caps w:tag at 64 \u2014 move what does not fit into the payload (\`data\`), or shorten the attrs`};let $=n.alias??u.alias,w=n.lock??u.lock,y=r.session.insertCustomNode({replaceControlId:o,paragraphId:i.id,offset:c.start,tag:O.tag,text:p.text,...$===void 0?{}:{alias:$},...w===false||w===void 0?{}:{lock:w},...m?{payload:D(r,t,m.serialized,p.text,f?.nodeId)}:{}},s);return y.ok?{ok:true,changed:true,...y.nodeId===void 0?{}:{nodeId:y.nodeId}}:k(y)}function Se(e,t,o){let n=e.session.partFor(o)??e.session.part(),r=contentControlsIn(n.root).find(i=>i.node.id===t);if(!r)return null;let a=contentControlPropertiesOf(r.node),s=a.tag===void 0?null:N(a.tag),d=a.lock;return {identity:s?`${s.prefix}:${s.name}`:null,attrs:s?.attrs??{},text:contentControlTextOf(r.node),alias:a.alias,lock:d==="sdtLocked"||d==="sdtContentLocked"||d==="contentLocked"?d:d==="unlocked"?false:void 0}}function ve(e){if(!e)return null;let t=x(void 0,e.data);return t.ok?{ok:true,serialized:e.data,value:t.value}:{ok:false,reason:`the stored payload is not readable: ${t.issues.join(", ")}`,issues:[]}}function ke(e,t){let o=e.session.part();return customNodePayloadsByControl(e.session.currentPackage(),o.name).get(t)}export{Oe as a,h as b,N as c,Ie as d,x as e,R as f,b as g,v as h,L as i,z as j,V as k,Ve as l,ze as m,W as n,ot as o,it as p,gt as q,ht as r};
|
package/dist/chunk-MNK6DXJQ.cjs
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
'use strict';var store=require('@docx-editor.dev/core/store'),layout=require('@docx-editor.dev/core/layout');function g(e){}var Oe=64,H=new Set(["__proto__","constructor","prototype"]);function h(e,t,o){let n=new URLSearchParams;for(let[s,d]of Object.entries(o))n.set(s,d);let r=n.toString(),a=r.length>0?`${e}:${t}?${r}`:`${e}:${t}`;return a.length>64?{ok:false,reason:"tag-overflow",length:a.length}:{ok:true,tag:a}}function N(e){if(e.length>64)return null;let t=e.indexOf(":");if(t<=0)return null;let o=e.slice(0,t),n=e.slice(t+1),r=n.indexOf("?"),a=r===-1?n:n.slice(0,r);if(a.length===0)return null;let s=Object.create(null);if(r!==-1)for(let[d,i]of new URLSearchParams(n.slice(r+1))){if(H.has(d))return null;s[d]=i;}return {prefix:o,name:a,attrs:s}}var Ie=262144;function x(e,t){if(t.length===0)return {ok:false,reason:"malformed",issues:["the node carries no payload"]};if(t.length>262144)return {ok:false,reason:"malformed",issues:[`the payload is ${String(t.length)} characters; the cap is ${String(262144)}`]};let o;try{o=JSON.parse(t);}catch(a){return {ok:false,reason:"malformed",issues:[a instanceof Error?a.message:"the payload is not JSON"]}}let n=I(o);if(!e)return {ok:true,value:n};let r=e["~standard"].validate(n);return B(r)?{ok:false,reason:"async",issues:["the schema validates asynchronously, which the read path cannot await"]}:r.issues?{ok:false,reason:"invalid",issues:r.issues.map(q)}:{ok:true,value:r.value}}function R(e){let t;try{t=JSON.stringify(e)??"";}catch(o){return {ok:false,reason:"malformed",issues:[o instanceof Error?o.message:"the value cannot be serialized"]}}return t.length===0?{ok:false,reason:"malformed",issues:["the value serializes to nothing"]}:t.length>262144?{ok:false,reason:"malformed",issues:[`the payload is ${String(t.length)} characters; the cap is ${String(262144)}`]}:{ok:true,value:t}}function B(e){return typeof e.then=="function"}function q(e){let t=(e.path??[]).map(o=>String(typeof o=="object"?o.key:o)).join(".");return t.length>0?`${t}: ${e.message}`:e.message}var Y=new Set(["__proto__","constructor","prototype"]);function I(e){if(Array.isArray(e))return e.map(I);if(e===null||typeof e!="object")return e;let t=Object.create(null);for(let[o,n]of Object.entries(e))Y.has(o)||(t[o]=I(n));return t}function _(e){let t=(e.path??[]).map(o=>{let n=typeof o=="object"?o.key:o;return typeof n=="number"?n:String(n)});return {message:e.message,path:t,pointer:t.join(".")}}function S(e,t){return {ok:false,code:"invalidArgs",reason:e,issues:t}}var b="docxEditor";function v(e){return e.payloadNamespace??`urn:docx-editor.dev:custom-node:${e.tagPrefix}`}function M(e,t,o){let n=0;for(let r of store.customNodePayloadsOf(e,t,o).keys()){let a=/^cx(\d{1,9})$/.exec(r);if(!a)continue;let s=Number(a[1]);s>n&&(n=s);}return `cx${String(n+1)}`}function L(e,t){let o=R(t);if(!o.ok)return {ok:false,reason:`the payload cannot be serialized: ${o.issues.join(", ")}`,issues:[]};if(!e.schema)return {ok:true,data:o.value,value:t};let r=e.schema["~standard"].validate(JSON.parse(o.value));if(Q(r))return {ok:false,reason:`${e.name}'s schema validates asynchronously, which a write cannot await`,issues:[]};if(r.issues){let s=r.issues.map(_);return {ok:false,reason:`the payload does not match ${e.name}'s schema: `+s.map(d=>(d.pointer?`${d.pointer}: `:"")+d.message).join(", "),issues:s}}let a=R(r.value);return a.ok?{ok:true,data:a.value,value:r.value}:{ok:false,reason:`the payload cannot be serialized: ${a.issues.join(", ")}`,issues:[]}}function Q(e){return typeof e.then=="function"}function z(e){return typeof e=="object"&&e!==null&&typeof e.name=="string"&&typeof e.tagPrefix=="string"}var V=/^[A-Za-z0-9_.-]+$/,te=/['"<>&]|[\u0000-\u0008\u000B\u000C\u000E-\u001F\u007F]/;function oe(e){return e.length>0&&!te.test(e)}function Ve(e){if(!V.test(e.name??""))throw new Error(`defineCustomNode: invalid name ${JSON.stringify(e.name)}`);if(!V.test(e.tagPrefix??""))throw new Error(`defineCustomNode: invalid tagPrefix ${JSON.stringify(e.tagPrefix)}`);let t=e.schema;if(t!==void 0&&typeof t?.["~standard"]?.validate!="function")throw new Error(`defineCustomNode: ${JSON.stringify(e.name)} has a schema that does not implement Standard Schema`);if(e.payloadNamespace!==void 0&&!oe(e.payloadNamespace))throw new Error(`defineCustomNode: ${JSON.stringify(e.name)} has a payloadNamespace that cannot be written into an XPath \u2014 no quotes, angle brackets, ampersands or control characters: ${JSON.stringify(e.payloadNamespace)}`);if(e.preserveOnExport!==void 0&&e.preserveOnExport!==true&&e.preserveOnExport!==false&&e.preserveOnExport!=="text")throw new Error(`defineCustomNode: ${JSON.stringify(e.name)} has an unknown preserveOnExport ${JSON.stringify(e.preserveOnExport)}`);return Object.freeze({...e,dataOf:n=>{if(!n||n.data===void 0||n.name!==void 0&&n.name!==e.name)return;if(!e.schema)return n.data;let r=e.schema["~standard"].validate(n.data);if(typeof r.then=="function")return;let a=r;return a.issues?void 0:a.value}})}function ze(e){g(e.licenseKey);let t=new Set;for(let o of e.nodes){let n=`${o.tagPrefix}:${o.name}`;if(t.has(n))throw new Error(`customNodesModule: two definitions claim ${JSON.stringify(n)}`);t.add(n);}return {id:"custom-nodes",customNodes:e.nodes,...e.onDiagnostic?{onCustomNodeDiagnostic:o=>{e.onDiagnostic?.(o);}}:{},customNodePayloadNamespaces:[...new Set(e.nodes.map(v))]}}function ne(e){for(let t of e.children)if(!(t.kind==="textValue"||t.localName!=="sdtPr")){for(let o of t.children)if(!(o.kind==="textValue"||o.localName!=="tag")){for(let n of o.attributes)if(n.localName==="val")return n.value}}}function j(e){if(e.kind==="textValue")return e.value;let t="";for(let o of e.children)t+=j(o);return t}function W(e,t,o={}){if(t.length===0)return [];let n=new Map;for(let s of t){let d=`${s.tagPrefix}:${s.name}`;if(n.has(d))throw new Error(`recognizeCustomNodes: duplicate definition for ${JSON.stringify(d)}`);n.set(d,s);}let r=[],a=(s,d)=>{if(!(s.kind==="textValue"||d>64)){if(s.kind==="contentControl"){let i=ne(s),c=i!==void 0?N(i):null,u=c?n.get(`${c.prefix}:${c.name}`):void 0;if(c&&u&&i!==void 0){let l=j(s),f=re(u,s.id,o.payloads?.get(s.id),store.contentControlPropertiesOf(s).dataBinding!==void 0,o.onDiagnostic),m=u.fromDocx?u.fromDocx({attrs:c.attrs,text:l,...f.present?{data:f.value}:{}}):c.attrs;if(m!==null){r.push({name:u.name,attrs:m,text:l,nodeId:s.id,tag:i,...f.present?{data:f.value}:{}});return}}}for(let i of s.children)a(i,d+1);}};return a(e.root,0),r}function re(e,t,o,n,r){if(!o)return n&&r?.({code:"payload-missing",name:e.name,nodeId:t,issues:["the control binds a store node this document does not hold"]}),{present:false};let a=x(e.schema,o.data);return a.ok?{present:true,value:a.value}:(r?.({code:"payload-invalid",name:e.name,nodeId:t,issues:a.issues}),{present:false})}function K(e,t){let o=store.findNode(e,t);return !o||o.kind!=="paragraph"?[]:store.revisionItemsOf({id:e.id,name:e.name,contentType:e.contentType,root:o})}function ce(e,t,o,n){if(t.length===0)return [];let r=W(e,t,{...o===void 0?{}:{payloads:o},...n===void 0?{}:{onDiagnostic:n}});if(r.length===0)return [];let a=store.locateSites(e),s=[];for(let d of r){let i=t.find(l=>l.name===d.name&&d.tag.startsWith(`${l.tagPrefix}:`));if(!i)continue;let c=i.reviewCard?i.reviewCard({attrs:d.attrs,text:d.text,...d.data===void 0?{}:{data:d.data}}):null;if(i.reviewCard&&c===null)continue;let u=a.get(d.nodeId);s.push({kind:"custom",id:d.nodeId,name:d.name,tag:d.tag,attrs:d.attrs,text:d.text,...d.data===void 0?{}:{data:d.data},carded:i.reviewCard!==void 0&&c!==null,title:c?.title??"",...c?.detail!==void 0?{detail:c.detail}:{},range:u?{partName:e.name,start:{paragraphId:u.paragraphId,offset:u.start},end:{paragraphId:u.paragraphId,offset:u.end}}:null});}return s}function U(e){let t=store.collectReviewItems(e),o=(e.customNodes??[]).filter(z);if(o.length===0)return t;let n=[e.storyPart],r=new Set([e.storyPart.name]);for(let i of e.furnitureParts??[])r.has(i.name)||(r.add(i.name),n.push(i));let a=[],s=new Map;for(let i of n){a.push(...ce(i,o,i.name===e.storyPart.name?e.customNodePayloads:void 0,e.reportCustomNodeDiagnostic));let c=s.size;for(let[u,l]of store.paragraphOrderOfPart(i))s.has(u)||s.set(u,c+l);}return a.length===0?t:[...t,...a].sort((i,c)=>layout.reviewItemPositionRank(i,s)-layout.reviewItemPositionRank(c,s))}function ot(e={}){return g(e.licenseKey),{id:"review",review:{displayModes:["all-markup","proposed","original"],collectReviewItems:U,revisionItemsOfParagraph:K}}}function G(e){return e.surface??null}function E(e,t){if(t==null)return null;let o=L(e,t);return o.ok?{ok:true,serialized:o.data,value:o.value}:{ok:false,reason:o.reason,issues:o.issues}}function D(e,t,o,n,r){let a=v(t),s=e.session.part().name;return {namespaceUri:a,rootLocalName:b,nodeId:r??M(e.session.currentPackage(),s,a),label:n,data:o}}function k(e){let t=e.detail?`${e.reason}: ${e.detail}`:e.reason;return {ok:false,code:me.has(e.reason)?"invalidArgs":"unsupported",reason:t}}var me=new Set(["payload-too-large","unaddressable-payload","store-not-authored","offset-out-of-range","invalid-range","invalid-property-value","splits-surrogate-pair"]);function A(e,t,o){let n,r;if(o!==void 0)try{n=e.text?.(o),r=e.tagAttrs?.(o);}catch(s){return {reason:`${e.name} could not describe this payload: ${s instanceof Error?s.message:String(s)}`}}let a=t.text??n;return a===void 0?{reason:e.text?`${e.name} derives its text from \`data\`, so pass one \u2014 or pass \`text\` directly`:`${e.name} declares no \`text\`, so \`text\` is required`}:t.attrs===void 0&&e.tagAttrs&&r===void 0?{reason:`${e.name} derives its tag attrs from \`data\`, so pass one \u2014 or pass \`attrs\` directly`}:{attrs:t.attrs??r??{},text:a}}function C(e){return e.getEditingMode()==="viewing"?{ok:false,code:"locked",reason:"the document is open for viewing"}:null}function P(e){let t=e.getActiveScope();if(t.kind==="headerFooter")return {kind:"headerFooter",rId:t.rId};if(t.kind==="note"){let o=store.parseNoteScopeId(t.id);if(o)return {kind:"notesPart",noteKind:o.noteKind}}return {kind:"body"}}function T(e,t){let o=G(e),n=t===void 0?"":t.slice(0,t.indexOf("#"));if(!o||n.length===0)return P(e);if(n===o.session.part().name)return {kind:"body"};for(let r of o.session.headerFooterResolutionBySection())for(let a of [r.headers,r.footers])for(let s of a.values())if(s.partName===n)return {kind:"headerFooter",rId:s.rId};for(let r of ["footnote","endnote"])if(o.session.partFor({kind:"notesPart",noteKind:r})?.name===n)return {kind:"notesPart",noteKind:r};return P(e)}function it(e,t,o={}){let n=G(e);if(!n)return {ok:false,code:"notFound",reason:"no document is mounted"};let r=E(t,o.data);if(r&&!r.ok)return S(r.reason,r.issues);let a=A(t,o,r?.value);if("reason"in a)return {ok:false,code:"invalidArgs",reason:a.reason};let s=h(t.tagPrefix,t.name,a.attrs);if(!s.ok)return {ok:false,code:"invalidArgs",reason:`the encoded tag is ${s.length} characters; Word caps w:tag at 64 \u2014 move what does not fit into the payload (\`data\`), or shorten the attrs`};let d=C(e);if(d)return d;let i=o.at??n.state().selection.head,c=o.lock===void 0?"contentLocked":o.lock,u=P(e),l=n.session.insertCustomNode({paragraphId:i.paragraphId,offset:i.offset,tag:s.tag,text:a.text,...o.alias===void 0?{}:{alias:o.alias},...c===false?{}:{lock:c},...r?{payload:D(n,t,r.serialized,a.text)}:{}},u);return l.ok?{ok:true,changed:true,...l.nodeId===void 0?{}:{nodeId:l.nodeId}}:k(l)}function J(e){return e.surface??null}function Ne(e,t){let o=null,n=a=>a.id===t?true:a.kind==="textValue"?false:a.children.some(n),r=(a,s)=>{if(!(o||a.kind==="textValue"||s>64)){if(a.kind==="paragraph"){n(a)&&(o=a);return}for(let d of a.children)r(d,s+1);}};return r(e.root,0),o}function xe(e,t){let o=new Set,n=i=>{if(o.add(i.id),i.kind!=="textValue")for(let c of i.children)n(c);},r=i=>{if(i.id===t)return i;if(i.kind==="textValue")return null;for(let c of i.children){let u=r(c);if(u)return u}return null},a=r(e);if(!a)return null;n(a);let s=Number.MAX_SAFE_INTEGER,d=-1;for(let i of store.segmentsOf(e))o.has(i.runId)&&(i.start<s&&(s=i.start),i.end>d&&(d=i.end));return d<0?null:{start:s,end:d}}function gt(e,t){let o=J(e);if(!o)return {ok:false,code:"notFound",reason:"no document is mounted"};let n=C(e);if(n)return n;let r=o.session.removeCustomNode(t,T(e,t));return r.ok?{ok:true,changed:true}:k(r)}function ht(e,t,o,n={}){let r=J(e);if(!r)return {ok:false,code:"notFound",reason:"no document is mounted"};let a=C(e);if(a)return a;let s=T(e,o),d=r.session.partFor(s)??r.session.part(),i=Ne(d,o),c=i?xe(i,o):null,u=Se(r,o,s);if(!i||!c||!u)return {ok:false,code:"notFound",reason:"no custom node with that id"};let l=`${t.tagPrefix}:${t.name}`;if(u.identity!==null&&u.identity!==l)return {ok:false,code:"invalidArgs",reason:`node ${o} is a ${u.identity}, not a ${l}`};let f=ke(r,o),m=n.data===null?null:n.data===void 0?ve(f):E(t,n.data);if(m&&!m.ok)return S(m.reason,m.issues);let p=A(t,{attrs:n.attrs??(n.data===void 0?u.attrs:void 0),text:n.text??(m===null&&n.data===null?u.text:void 0)},m?.value);if("reason"in p)return {ok:false,code:"invalidArgs",reason:p.reason};let O=h(t.tagPrefix,t.name,p.attrs);if(!O.ok)return {ok:false,code:"invalidArgs",reason:`the encoded tag is ${O.length} characters; Word caps w:tag at 64 \u2014 move what does not fit into the payload (\`data\`), or shorten the attrs`};let $=n.alias??u.alias,w=n.lock??u.lock,y=r.session.insertCustomNode({replaceControlId:o,paragraphId:i.id,offset:c.start,tag:O.tag,text:p.text,...$===void 0?{}:{alias:$},...w===false||w===void 0?{}:{lock:w},...m?{payload:D(r,t,m.serialized,p.text,f?.nodeId)}:{}},s);return y.ok?{ok:true,changed:true,...y.nodeId===void 0?{}:{nodeId:y.nodeId}}:k(y)}function Se(e,t,o){let n=e.session.partFor(o)??e.session.part(),r=store.contentControlsIn(n.root).find(i=>i.node.id===t);if(!r)return null;let a=store.contentControlPropertiesOf(r.node),s=a.tag===void 0?null:N(a.tag),d=a.lock;return {identity:s?`${s.prefix}:${s.name}`:null,attrs:s?.attrs??{},text:store.contentControlTextOf(r.node),alias:a.alias,lock:d==="sdtLocked"||d==="sdtContentLocked"||d==="contentLocked"?d:d==="unlocked"?false:void 0}}function ve(e){if(!e)return null;let t=x(void 0,e.data);return t.ok?{ok:true,serialized:e.data,value:t.value}:{ok:false,reason:`the stored payload is not readable: ${t.issues.join(", ")}`,issues:[]}}function ke(e,t){let o=e.session.part();return store.customNodePayloadsByControl(e.session.currentPackage(),o.name).get(t)}exports.a=Oe;exports.b=h;exports.c=N;exports.d=Ie;exports.e=x;exports.f=R;exports.g=b;exports.h=v;exports.i=L;exports.j=z;exports.k=V;exports.l=Ve;exports.m=ze;exports.n=W;exports.o=ot;exports.p=it;exports.q=gt;exports.r=ht;
|