react-docxodus-viewer 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/react-docxodus-viewer.cjs.js +1 -1
- package/dist/react-docxodus-viewer.cjs.js.map +1 -1
- package/dist/react-docxodus-viewer.css +1 -1
- package/dist/react-docxodus-viewer.es.js +534 -204
- package/dist/react-docxodus-viewer.es.js.map +1 -1
- package/dist/types/DocumentViewer.d.ts +1 -1
- package/dist/types/DocumentViewer.d.ts.map +1 -1
- package/dist/types/DocumentViewer.test.d.ts +2 -0
- package/dist/types/DocumentViewer.test.d.ts.map +1 -0
- package/dist/types/components/RevisionPanel.d.ts +7 -0
- package/dist/types/components/RevisionPanel.d.ts.map +1 -0
- package/dist/types/components/RevisionPanel.test.d.ts +2 -0
- package/dist/types/components/RevisionPanel.test.d.ts.map +1 -0
- package/dist/types/index.d.ts +4 -2
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/test/setup.d.ts +2 -0
- package/dist/types/test/setup.d.ts.map +1 -0
- package/dist/types/types/index.d.ts +15 -1
- package/dist/types/types/index.d.ts.map +1 -1
- package/package.json +13 -5
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),a=require("react"),J=require("docxodus/react"),d=require("docxodus"),K={paginationScale:.8,showPageNumbers:!0,renderFootnotesAndEndnotes:!0,renderHeadersAndFooters:!0,commentMode:"disabled",annotationMode:"disabled",renderTrackedChanges:!1,showDeletedContent:!0,renderMoveOperations:!0,pageTitle:"Document",cssPrefix:"docx-",fabricateClasses:!0,additionalCss:"",commentCssClassPrefix:"comment-",annotationCssClassPrefix:"annot-"},be="/wasm/";function je(l){switch(l){case"endnote":return d.CommentRenderMode.EndnoteStyle;case"inline":return d.CommentRenderMode.Inline;case"margin":return d.CommentRenderMode.Margin;default:return d.CommentRenderMode.Disabled}}function fe(l){switch(l){case"above":return d.AnnotationLabelMode.Above;case"inline":return d.AnnotationLabelMode.Inline;case"tooltip":return d.AnnotationLabelMode.Tooltip;case"none":return d.AnnotationLabelMode.None;default:return}}function Ce({file:l,html:i,onFileChange:E,onConversionStart:D,onConversionComplete:F,onError:L,onPageChange:M,settings:v,defaultSettings:I,onSettingsChange:O,className:Q,style:Y,toolbar:R="top",showSettingsButton:ee=!0,placeholder:ne="Open a DOCX file to view",wasmBasePath:se=be}){const S=a.useMemo(()=>({...K,...I}),[I]),[te,q]=a.useState(null),[ae,j]=a.useState(null),[V,oe]=a.useState(S),h=l!==void 0?l:te,u=i!==void 0?i:ae,s=a.useMemo(()=>v?{...S,...v}:V,[v,S,V]),{isReady:x,isLoading:p,error:f,convertToHtml:_}=J.useDocxodus(se),[m,U]=a.useState(!1),[Z,C]=a.useState(null),[$,G]=a.useState(""),[c,P]=a.useState(1),[r,w]=a.useState(0),[ie,N]=a.useState(!1),A=a.useRef(null),z=a.useCallback(()=>({commentRenderMode:je(s.commentMode),pageTitle:s.pageTitle,cssPrefix:s.cssPrefix,fabricateClasses:s.fabricateClasses,additionalCss:s.additionalCss||void 0,commentCssClassPrefix:s.commentCssClassPrefix,paginationMode:d.PaginationMode.Paginated,paginationScale:s.paginationScale,renderAnnotations:s.annotationMode!=="disabled",annotationLabelMode:fe(s.annotationMode),annotationCssClassPrefix:s.annotationCssClassPrefix,renderFootnotesAndEndnotes:s.renderFootnotesAndEndnotes,renderHeadersAndFooters:s.renderHeadersAndFooters,renderTrackedChanges:s.renderTrackedChanges,showDeletedContent:s.showDeletedContent,renderMoveOperations:s.renderMoveOperations}),[s]),b=a.useCallback(async n=>{if(x){U(!0),C(null),D?.(),await new Promise(t=>requestAnimationFrame(()=>requestAnimationFrame(t)));try{const t=await _(n,z());i===void 0&&j(t),F?.(t)}catch(t){const g=t instanceof Error?t:new Error(String(t));C(g),L?.(g)}finally{U(!1)}}},[x,_,z,i,D,F,L]);a.useEffect(()=>{x&&h&&!u&&!m&&i===void 0&&b(h)},[x,h,u,m,b,i]);const re=async n=>{const t=n.target.files?.[0];t&&(G(t.name),C(null),P(1),w(0),l===void 0&&(q(t),j(null)),E?.(t),x&&i===void 0&&await b(t))},ce=a.useCallback(async()=>{h&&(i===void 0&&j(null),await b(h))},[h,b,i]),de=()=>{l===void 0&&q(null),i===void 0&&j(null),C(null),G(""),P(1),w(0),E?.(null);const n=document.getElementById("rdv-file-input");n&&(n.value="")},o=a.useCallback(n=>{const t={...s,...n};v===void 0&&oe(t),O?.(t)},[s,v,O]),le=()=>o({paginationScale:Math.min(s.paginationScale+.1,2)}),he=()=>o({paginationScale:Math.max(s.paginationScale-.1,.3)}),ge=n=>o({paginationScale:Math.max(.3,Math.min(2,n))}),y=n=>{const t=A.current;if(!t||n<1||n>r)return;const g=t.querySelector(`[data-page-number="${n}"]`);g&&g.scrollIntoView({behavior:"smooth",block:"start"})},ue=()=>c>1&&y(c-1),me=()=>c<r&&y(c+1),ve=n=>{P(n),M?.(n,r)};a.useEffect(()=>{const n=A.current;if(!n)return;const t=g=>{const H=g.target.closest('a[href^="#"]');if(!H)return;const T=H.getAttribute("href");if(!T||!T.startsWith("#"))return;g.preventDefault();const X=T.substring(1),k=n.querySelector(`[id="${X}"], [name="${X}"]`);k&&(k.scrollIntoView({behavior:"smooth",block:"center"}),k.classList.add("rdv-footnote-highlight"),setTimeout(()=>k.classList.remove("rdv-footnote-highlight"),2e3))};return n.addEventListener("click",t),()=>n.removeEventListener("click",t)},[u]),a.useEffect(()=>{r>0&&M?.(c,r)},[r,c,M]);const B=m||p,xe=()=>e.jsx("div",{className:"rdv-settings-overlay",onClick:()=>N(!1),children:e.jsxs("div",{className:"rdv-settings-modal",onClick:n=>n.stopPropagation(),children:[e.jsxs("div",{className:"rdv-settings-header",children:[e.jsx("h3",{children:"Viewer Settings"}),e.jsx("button",{className:"rdv-settings-close",onClick:()=>N(!1),children:"×"})]}),e.jsxs("div",{className:"rdv-settings-body",children:[e.jsxs("div",{className:"rdv-settings-section",children:[e.jsx("h4",{children:"Display Options"}),e.jsxs("label",{className:"rdv-settings-checkbox",children:[e.jsx("input",{type:"checkbox",checked:s.renderFootnotesAndEndnotes,onChange:n=>o({renderFootnotesAndEndnotes:n.target.checked})}),e.jsx("span",{children:"Show footnotes and endnotes"})]}),e.jsxs("label",{className:"rdv-settings-checkbox",children:[e.jsx("input",{type:"checkbox",checked:s.renderHeadersAndFooters,onChange:n=>o({renderHeadersAndFooters:n.target.checked})}),e.jsx("span",{children:"Show headers and footers"})]}),e.jsxs("label",{className:"rdv-settings-checkbox",children:[e.jsx("input",{type:"checkbox",checked:s.showPageNumbers,onChange:n=>o({showPageNumbers:n.target.checked})}),e.jsx("span",{children:"Show page numbers"})]})]}),e.jsxs("div",{className:"rdv-settings-section",children:[e.jsx("h4",{children:"Comment Rendering"}),e.jsx("div",{className:"rdv-settings-radio-group",children:["disabled","endnote","inline","margin"].map(n=>e.jsxs("label",{className:"rdv-settings-radio",children:[e.jsx("input",{type:"radio",name:"commentMode",checked:s.commentMode===n,onChange:()=>o({commentMode:n})}),e.jsxs("span",{children:[n.charAt(0).toUpperCase()+n.slice(1),n==="endnote"?"s":""]})]},n))})]}),e.jsxs("div",{className:"rdv-settings-section",children:[e.jsx("h4",{children:"Annotation Rendering"}),e.jsx("div",{className:"rdv-settings-radio-group",children:["disabled","above","inline","tooltip","none"].map(n=>e.jsxs("label",{className:"rdv-settings-radio",children:[e.jsx("input",{type:"radio",name:"annotationMode",checked:s.annotationMode===n,onChange:()=>o({annotationMode:n})}),e.jsx("span",{children:n==="none"?"Highlight Only":n.charAt(0).toUpperCase()+n.slice(1)})]},n))})]}),e.jsxs("div",{className:"rdv-settings-section",children:[e.jsx("h4",{children:"Tracked Changes"}),e.jsxs("label",{className:"rdv-settings-checkbox",children:[e.jsx("input",{type:"checkbox",checked:s.renderTrackedChanges,onChange:n=>o({renderTrackedChanges:n.target.checked})}),e.jsx("span",{children:"Show tracked changes"})]}),s.renderTrackedChanges&&e.jsxs("div",{className:"rdv-settings-subsection",children:[e.jsxs("label",{className:"rdv-settings-checkbox",children:[e.jsx("input",{type:"checkbox",checked:s.showDeletedContent,onChange:n=>o({showDeletedContent:n.target.checked})}),e.jsx("span",{children:"Show deleted content"})]}),e.jsxs("label",{className:"rdv-settings-checkbox",children:[e.jsx("input",{type:"checkbox",checked:s.renderMoveOperations,onChange:n=>o({renderMoveOperations:n.target.checked})}),e.jsx("span",{children:"Distinguish move operations"})]})]})]})]}),e.jsx("div",{className:"rdv-settings-footer",children:e.jsx("button",{className:"rdv-settings-apply",onClick:()=>{ce(),N(!1)},children:"Apply & Close"})})]})}),W=()=>e.jsxs("div",{className:"rdv-toolbar",children:[e.jsxs("div",{className:"rdv-toolbar-left",children:[e.jsx("label",{htmlFor:"rdv-file-input",className:"rdv-toolbar-file-btn",children:$||"Open Document"}),e.jsx("input",{id:"rdv-file-input",type:"file",accept:".docx",onChange:re,disabled:B,className:"rdv-file-input"}),$&&e.jsx("button",{className:"rdv-toolbar-btn rdv-toolbar-clear",onClick:de,disabled:B,children:"×"})]}),e.jsx("div",{className:"rdv-toolbar-center",children:u&&r>0&&e.jsxs(e.Fragment,{children:[e.jsx("button",{className:"rdv-toolbar-btn",onClick:ue,disabled:c<=1,title:"Previous Page",children:"◀"}),e.jsxs("div",{className:"rdv-page-input-group",children:[e.jsx("input",{type:"number",className:"rdv-page-input",value:c,min:1,max:r,onChange:n=>{const t=parseInt(n.target.value);isNaN(t)||y(t)}}),e.jsxs("span",{className:"rdv-page-total",children:["/ ",r]})]}),e.jsx("button",{className:"rdv-toolbar-btn",onClick:me,disabled:c>=r,title:"Next Page",children:"▶"}),e.jsx("div",{className:"rdv-toolbar-separator"}),e.jsx("button",{className:"rdv-toolbar-btn",onClick:he,disabled:s.paginationScale<=.3,title:"Zoom Out",children:"−"}),e.jsxs("select",{className:"rdv-zoom-select",value:s.paginationScale,onChange:n=>ge(parseFloat(n.target.value)),children:[e.jsx("option",{value:"0.5",children:"50%"}),e.jsx("option",{value:"0.75",children:"75%"}),e.jsx("option",{value:"0.8",children:"80%"}),e.jsx("option",{value:"0.9",children:"90%"}),e.jsx("option",{value:"1",children:"100%"}),e.jsx("option",{value:"1.25",children:"125%"}),e.jsx("option",{value:"1.5",children:"150%"}),e.jsx("option",{value:"2",children:"200%"})]}),e.jsx("button",{className:"rdv-toolbar-btn",onClick:le,disabled:s.paginationScale>=2,title:"Zoom In",children:"+"})]})}),e.jsx("div",{className:"rdv-toolbar-right",children:ee&&e.jsx("button",{className:"rdv-toolbar-btn rdv-toolbar-settings",onClick:()=>N(!0),title:"Settings",children:"⚙"})})]}),pe=["rdv-viewer",Q].filter(Boolean).join(" ");return e.jsxs("div",{className:pe,style:Y,children:[R==="top"&&e.jsx(W,{}),e.jsxs("div",{className:"rdv-content",children:[f&&e.jsx("div",{className:"rdv-message rdv-message--error",children:e.jsxs("p",{children:["Failed to initialize: ",f.message]})}),!f&&(p||m)&&e.jsxs("div",{className:"rdv-message",children:[e.jsx("div",{className:"rdv-spinner"}),e.jsx("p",{children:p&&h?"Loading engine & preparing document...":p?"Loading document engine...":"Processing document..."})]}),!p&&!f&&!u&&!m&&!h&&e.jsxs("div",{className:"rdv-message",children:[e.jsx("div",{className:"rdv-message__icon",children:"📄"}),e.jsx("p",{children:ne})]}),Z&&!m&&e.jsx("div",{className:"rdv-message rdv-message--error",children:e.jsxs("p",{children:["Error: ",Z.message]})}),u&&!m&&e.jsx("div",{ref:A,className:"rdv-pages",children:e.jsx(J.PaginatedDocument,{html:u,scale:s.paginationScale,showPageNumbers:s.showPageNumbers,pageGap:20,backgroundColor:"#525659",className:"rdv-paginated-document",onPaginationComplete:n=>{w(n.totalPages)},onPageVisible:ve})})]}),R==="bottom"&&e.jsx(W,{}),ie&&e.jsx(xe,{})]})}exports.DEFAULT_SETTINGS=K;exports.DocumentViewer=Ce;
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),I=require("react"),ue=require("docxodus/react"),C=require("docxodus");var ge=typeof document<"u"?document.currentScript:null;function H(){return`${Date.now()}-${Math.random().toString(36).slice(2,11)}`}async function z(s){if(s instanceof Uint8Array)return s;const l=await s.arrayBuffer();return new Uint8Array(l)}function Qe(){if(typeof document<"u"){const s=document.querySelectorAll('script[src*="docxodus"]');if(s.length>0){const l=s[0].src;return l.substring(0,l.lastIndexOf("/")+1)+"wasm/"}}return"/wasm/"}async function De(s){const l=s?.wasmBasePath??Qe(),p=new URL("data:text/javascript;base64,Ly8gc3JjL2RvY3hvZHVzLndvcmtlci50cwp2YXIgd2FzbUV4cG9ydHMgPSBudWxsOwp2YXIgaW5pdFByb21pc2UgPSBudWxsOwphc3luYyBmdW5jdGlvbiBpbml0aWFsaXplV2FzbShiYXNlUGF0aCkgewogIGlmICh3YXNtRXhwb3J0cykgewogICAgcmV0dXJuOwogIH0KICBpZiAoaW5pdFByb21pc2UpIHsKICAgIHJldHVybiBpbml0UHJvbWlzZTsKICB9CiAgaW5pdFByb21pc2UgPSAoYXN5bmMgKCkgPT4gewogICAgdHJ5IHsKICAgICAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBiYXNlUGF0aC5lbmRzV2l0aCgiLyIpID8gYmFzZVBhdGggOiBiYXNlUGF0aCArICIvIjsKICAgICAgY29uc3QgZG90bmV0TW9kdWxlID0gYXdhaXQgaW1wb3J0KAogICAgICAgIC8qIHdlYnBhY2tJZ25vcmU6IHRydWUgKi8KICAgICAgICBgJHtub3JtYWxpemVkUGF0aH1fZnJhbWV3b3JrL2RvdG5ldC5qc2AKICAgICAgKTsKICAgICAgY29uc3QgeyBnZXRBc3NlbWJseUV4cG9ydHMsIGdldENvbmZpZyB9ID0gYXdhaXQgZG90bmV0TW9kdWxlLmRvdG5ldC53aXRoRGlhZ25vc3RpY1RyYWNpbmcoZmFsc2UpLmNyZWF0ZSgpOwogICAgICBjb25zdCBjb25maWcgPSBnZXRDb25maWcoKTsKICAgICAgY29uc3QgZXhwb3J0cyA9IGF3YWl0IGdldEFzc2VtYmx5RXhwb3J0cyhjb25maWcubWFpbkFzc2VtYmx5TmFtZSk7CiAgICAgIHdhc21FeHBvcnRzID0gewogICAgICAgIERvY3VtZW50Q29udmVydGVyOiBleHBvcnRzLkRvY3hvZHVzV2FzbS5Eb2N1bWVudENvbnZlcnRlciwKICAgICAgICBEb2N1bWVudENvbXBhcmVyOiBleHBvcnRzLkRvY3hvZHVzV2FzbS5Eb2N1bWVudENvbXBhcmVyCiAgICAgIH07CiAgICB9IGNhdGNoIChlcnJvcikgewogICAgICBpbml0UHJvbWlzZSA9IG51bGw7CiAgICAgIHRocm93IGVycm9yOwogICAgfQogIH0pKCk7CiAgcmV0dXJuIGluaXRQcm9taXNlOwp9CmZ1bmN0aW9uIGVuc3VyZUluaXRpYWxpemVkKCkgewogIGlmICghd2FzbUV4cG9ydHMpIHsKICAgIHRocm93IG5ldyBFcnJvcigiV29ya2VyIG5vdCBpbml0aWFsaXplZC4gQ2FsbCBpbml0IGZpcnN0LiIpOwogIH0KICByZXR1cm4gd2FzbUV4cG9ydHM7Cn0KZnVuY3Rpb24gaXNFcnJvclJlc3BvbnNlKHJlc3VsdCkgewogIHJldHVybiByZXN1bHQuc3RhcnRzV2l0aCgieyIpICYmIHJlc3VsdC5pbmNsdWRlcygnIkVycm9yIicpOwp9CmZ1bmN0aW9uIHBhcnNlRXJyb3IocmVzdWx0KSB7CiAgdHJ5IHsKICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UocmVzdWx0KTsKICAgIHJldHVybiB7IGVycm9yOiBwYXJzZWQuRXJyb3IgfHwgcGFyc2VkLmVycm9yIHx8ICJVbmtub3duIGVycm9yIiB9OwogIH0gY2F0Y2ggewogICAgcmV0dXJuIHsgZXJyb3I6IHJlc3VsdCB9OwogIH0KfQpmdW5jdGlvbiBoYW5kbGVDb252ZXJ0KHJlcXVlc3QpIHsKICBjb25zdCBleHBvcnRzID0gZW5zdXJlSW5pdGlhbGl6ZWQoKTsKICBjb25zdCBvcHRpb25zID0gcmVxdWVzdC5vcHRpb25zOwogIHRyeSB7CiAgICBsZXQgcmVzdWx0OwogICAgY29uc3QgbmVlZHNDb21wbGV0ZU1ldGhvZCA9IG9wdGlvbnM/LnJlbmRlckZvb3Rub3Rlc0FuZEVuZG5vdGVzICE9PSB2b2lkIDAgfHwgb3B0aW9ucz8ucmVuZGVySGVhZGVyc0FuZEZvb3RlcnMgIT09IHZvaWQgMCB8fCBvcHRpb25zPy5yZW5kZXJUcmFja2VkQ2hhbmdlcyAhPT0gdm9pZCAwIHx8IG9wdGlvbnM/LnNob3dEZWxldGVkQ29udGVudCAhPT0gdm9pZCAwIHx8IG9wdGlvbnM/LnJlbmRlck1vdmVPcGVyYXRpb25zICE9PSB2b2lkIDA7CiAgICBpZiAobmVlZHNDb21wbGV0ZU1ldGhvZCB8fCBvcHRpb25zPy5yZW5kZXJBbm5vdGF0aW9ucykgewogICAgICByZXN1bHQgPSBleHBvcnRzLkRvY3VtZW50Q29udmVydGVyLkNvbnZlcnREb2N4VG9IdG1sQ29tcGxldGUoCiAgICAgICAgcmVxdWVzdC5kb2N1bWVudEJ5dGVzLAogICAgICAgIG9wdGlvbnM/LnBhZ2VUaXRsZSA/PyAiRG9jdW1lbnQiLAogICAgICAgIG9wdGlvbnM/LmNzc1ByZWZpeCA/PyAiZG9jeC0iLAogICAgICAgIG9wdGlvbnM/LmZhYnJpY2F0ZUNsYXNzZXMgPz8gdHJ1ZSwKICAgICAgICBvcHRpb25zPy5hZGRpdGlvbmFsQ3NzID8/ICIiLAogICAgICAgIG9wdGlvbnM/LmNvbW1lbnRSZW5kZXJNb2RlID8/IC0xLAogICAgICAgIG9wdGlvbnM/LmNvbW1lbnRDc3NDbGFzc1ByZWZpeCA/PyAiY29tbWVudC0iLAogICAgICAgIG9wdGlvbnM/LnBhZ2luYXRpb25Nb2RlID8/IDAsCiAgICAgICAgb3B0aW9ucz8ucGFnaW5hdGlvblNjYWxlID8/IDEsCiAgICAgICAgb3B0aW9ucz8ucGFnaW5hdGlvbkNzc0NsYXNzUHJlZml4ID8/ICJwYWdlLSIsCiAgICAgICAgb3B0aW9ucz8ucmVuZGVyQW5ub3RhdGlvbnMgPz8gZmFsc2UsCiAgICAgICAgb3B0aW9ucz8uYW5ub3RhdGlvbkxhYmVsTW9kZSA/PyAwLAogICAgICAgIG9wdGlvbnM/LmFubm90YXRpb25Dc3NDbGFzc1ByZWZpeCA/PyAiYW5ub3QtIiwKICAgICAgICBvcHRpb25zPy5yZW5kZXJGb290bm90ZXNBbmRFbmRub3RlcyA/PyBmYWxzZSwKICAgICAgICBvcHRpb25zPy5yZW5kZXJIZWFkZXJzQW5kRm9vdGVycyA/PyBmYWxzZSwKICAgICAgICBvcHRpb25zPy5yZW5kZXJUcmFja2VkQ2hhbmdlcyA/PyBmYWxzZSwKICAgICAgICBvcHRpb25zPy5zaG93RGVsZXRlZENvbnRlbnQgPz8gdHJ1ZSwKICAgICAgICBvcHRpb25zPy5yZW5kZXJNb3ZlT3BlcmF0aW9ucyA/PyB0cnVlCiAgICAgICk7CiAgICB9IGVsc2UgaWYgKG9wdGlvbnM/LnBhZ2luYXRpb25Nb2RlICE9PSB2b2lkIDAgJiYgb3B0aW9ucy5wYWdpbmF0aW9uTW9kZSAhPT0gMCkgewogICAgICByZXN1bHQgPSBleHBvcnRzLkRvY3VtZW50Q29udmVydGVyLkNvbnZlcnREb2N4VG9IdG1sV2l0aFBhZ2luYXRpb24oCiAgICAgICAgcmVxdWVzdC5kb2N1bWVudEJ5dGVzLAogICAgICAgIG9wdGlvbnMucGFnZVRpdGxlID8/ICJEb2N1bWVudCIsCiAgICAgICAgb3B0aW9ucy5jc3NQcmVmaXggPz8gImRvY3gtIiwKICAgICAgICBvcHRpb25zLmZhYnJpY2F0ZUNsYXNzZXMgPz8gdHJ1ZSwKICAgICAgICBvcHRpb25zLmFkZGl0aW9uYWxDc3MgPz8gIiIsCiAgICAgICAgb3B0aW9ucy5jb21tZW50UmVuZGVyTW9kZSA/PyAtMSwKICAgICAgICBvcHRpb25zLmNvbW1lbnRDc3NDbGFzc1ByZWZpeCA/PyAiY29tbWVudC0iLAogICAgICAgIG9wdGlvbnMucGFnaW5hdGlvbk1vZGUsCiAgICAgICAgb3B0aW9ucy5wYWdpbmF0aW9uU2NhbGUgPz8gMSwKICAgICAgICBvcHRpb25zLnBhZ2luYXRpb25Dc3NDbGFzc1ByZWZpeCA/PyAicGFnZS0iCiAgICAgICk7CiAgICB9IGVsc2UgaWYgKG9wdGlvbnMpIHsKICAgICAgcmVzdWx0ID0gZXhwb3J0cy5Eb2N1bWVudENvbnZlcnRlci5Db252ZXJ0RG9jeFRvSHRtbFdpdGhPcHRpb25zKAogICAgICAgIHJlcXVlc3QuZG9jdW1lbnRCeXRlcywKICAgICAgICBvcHRpb25zLnBhZ2VUaXRsZSA/PyAiRG9jdW1lbnQiLAogICAgICAgIG9wdGlvbnMuY3NzUHJlZml4ID8/ICJkb2N4LSIsCiAgICAgICAgb3B0aW9ucy5mYWJyaWNhdGVDbGFzc2VzID8/IHRydWUsCiAgICAgICAgb3B0aW9ucy5hZGRpdGlvbmFsQ3NzID8/ICIiLAogICAgICAgIG9wdGlvbnMuY29tbWVudFJlbmRlck1vZGUgPz8gLTEsCiAgICAgICAgb3B0aW9ucy5jb21tZW50Q3NzQ2xhc3NQcmVmaXggPz8gImNvbW1lbnQtIgogICAgICApOwogICAgfSBlbHNlIHsKICAgICAgcmVzdWx0ID0gZXhwb3J0cy5Eb2N1bWVudENvbnZlcnRlci5Db252ZXJ0RG9jeFRvSHRtbCgKICAgICAgICByZXF1ZXN0LmRvY3VtZW50Qnl0ZXMKICAgICAgKTsKICAgIH0KICAgIGlmIChpc0Vycm9yUmVzcG9uc2UocmVzdWx0KSkgewogICAgICByZXR1cm4gcGFyc2VFcnJvcihyZXN1bHQpOwogICAgfQogICAgcmV0dXJuIHsgaHRtbDogcmVzdWx0IH07CiAgfSBjYXRjaCAoZXJyb3IpIHsKICAgIHJldHVybiB7IGVycm9yOiBTdHJpbmcoZXJyb3IpIH07CiAgfQp9CmZ1bmN0aW9uIGhhbmRsZUNvbXBhcmUocmVxdWVzdCkgewogIGNvbnN0IGV4cG9ydHMgPSBlbnN1cmVJbml0aWFsaXplZCgpOwogIGNvbnN0IG9wdGlvbnMgPSByZXF1ZXN0Lm9wdGlvbnM7CiAgdHJ5IHsKICAgIGxldCByZXN1bHQ7CiAgICBpZiAob3B0aW9ucz8uZGV0YWlsVGhyZXNob2xkICE9PSB2b2lkIDAgfHwgb3B0aW9ucz8uY2FzZUluc2Vuc2l0aXZlKSB7CiAgICAgIHJlc3VsdCA9IGV4cG9ydHMuRG9jdW1lbnRDb21wYXJlci5Db21wYXJlRG9jdW1lbnRzV2l0aE9wdGlvbnMoCiAgICAgICAgcmVxdWVzdC5vcmlnaW5hbEJ5dGVzLAogICAgICAgIHJlcXVlc3QubW9kaWZpZWRCeXRlcywKICAgICAgICBvcHRpb25zPy5hdXRob3JOYW1lID8/ICJEb2N4b2R1cyIsCiAgICAgICAgb3B0aW9ucz8uZGV0YWlsVGhyZXNob2xkID8/IDAuMTUsCiAgICAgICAgb3B0aW9ucz8uY2FzZUluc2Vuc2l0aXZlID8/IGZhbHNlCiAgICAgICk7CiAgICB9IGVsc2UgewogICAgICByZXN1bHQgPSBleHBvcnRzLkRvY3VtZW50Q29tcGFyZXIuQ29tcGFyZURvY3VtZW50cygKICAgICAgICByZXF1ZXN0Lm9yaWdpbmFsQnl0ZXMsCiAgICAgICAgcmVxdWVzdC5tb2RpZmllZEJ5dGVzLAogICAgICAgIG9wdGlvbnM/LmF1dGhvck5hbWUgPz8gIkRvY3hvZHVzIgogICAgICApOwogICAgfQogICAgaWYgKHJlc3VsdC5sZW5ndGggPT09IDApIHsKICAgICAgcmV0dXJuIHsgZXJyb3I6ICJDb21wYXJpc29uIHJldHVybmVkIGVtcHR5IHJlc3VsdCIgfTsKICAgIH0KICAgIHJldHVybiB7IGRvY3VtZW50Qnl0ZXM6IHJlc3VsdCB9OwogIH0gY2F0Y2ggKGVycm9yKSB7CiAgICByZXR1cm4geyBlcnJvcjogU3RyaW5nKGVycm9yKSB9OwogIH0KfQpmdW5jdGlvbiBoYW5kbGVDb21wYXJlVG9IdG1sKHJlcXVlc3QpIHsKICBjb25zdCBleHBvcnRzID0gZW5zdXJlSW5pdGlhbGl6ZWQoKTsKICBjb25zdCBvcHRpb25zID0gcmVxdWVzdC5vcHRpb25zOwogIHRyeSB7CiAgICBjb25zdCByZW5kZXJUcmFja2VkQ2hhbmdlcyA9IG9wdGlvbnM/LnJlbmRlclRyYWNrZWRDaGFuZ2VzID8/IHRydWU7CiAgICBjb25zdCByZXN1bHQgPSBleHBvcnRzLkRvY3VtZW50Q29tcGFyZXIuQ29tcGFyZURvY3VtZW50c1RvSHRtbFdpdGhPcHRpb25zKAogICAgICByZXF1ZXN0Lm9yaWdpbmFsQnl0ZXMsCiAgICAgIHJlcXVlc3QubW9kaWZpZWRCeXRlcywKICAgICAgb3B0aW9ucz8uYXV0aG9yTmFtZSA/PyAiRG9jeG9kdXMiLAogICAgICByZW5kZXJUcmFja2VkQ2hhbmdlcwogICAgKTsKICAgIGlmIChpc0Vycm9yUmVzcG9uc2UocmVzdWx0KSkgewogICAgICByZXR1cm4gcGFyc2VFcnJvcihyZXN1bHQpOwogICAgfQogICAgcmV0dXJuIHsgaHRtbDogcmVzdWx0IH07CiAgfSBjYXRjaCAoZXJyb3IpIHsKICAgIHJldHVybiB7IGVycm9yOiBTdHJpbmcoZXJyb3IpIH07CiAgfQp9CmZ1bmN0aW9uIGhhbmRsZUdldFJldmlzaW9ucyhyZXF1ZXN0KSB7CiAgY29uc3QgZXhwb3J0cyA9IGVuc3VyZUluaXRpYWxpemVkKCk7CiAgY29uc3Qgb3B0aW9ucyA9IHJlcXVlc3Qub3B0aW9uczsKICB0cnkgewogICAgY29uc3QgZGV0ZWN0TW92ZXMgPSBvcHRpb25zPy5kZXRlY3RNb3ZlcyA/PyB0cnVlOwogICAgY29uc3QgbW92ZVNpbWlsYXJpdHlUaHJlc2hvbGQgPSBvcHRpb25zPy5tb3ZlU2ltaWxhcml0eVRocmVzaG9sZCA/PyAwLjg7CiAgICBjb25zdCBtb3ZlTWluaW11bVdvcmRDb3VudCA9IG9wdGlvbnM/Lm1vdmVNaW5pbXVtV29yZENvdW50ID8/IDM7CiAgICBjb25zdCBjYXNlSW5zZW5zaXRpdmUgPSBvcHRpb25zPy5jYXNlSW5zZW5zaXRpdmUgPz8gZmFsc2U7CiAgICBjb25zdCByZXN1bHQgPSBleHBvcnRzLkRvY3VtZW50Q29tcGFyZXIuR2V0UmV2aXNpb25zSnNvbldpdGhPcHRpb25zKAogICAgICByZXF1ZXN0LmRvY3VtZW50Qnl0ZXMsCiAgICAgIGRldGVjdE1vdmVzLAogICAgICBtb3ZlU2ltaWxhcml0eVRocmVzaG9sZCwKICAgICAgbW92ZU1pbmltdW1Xb3JkQ291bnQsCiAgICAgIGNhc2VJbnNlbnNpdGl2ZQogICAgKTsKICAgIGlmIChpc0Vycm9yUmVzcG9uc2UocmVzdWx0KSkgewogICAgICByZXR1cm4gcGFyc2VFcnJvcihyZXN1bHQpOwogICAgfQogICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShyZXN1bHQpOwogICAgY29uc3QgcmV2aXNpb25zID0gKHBhcnNlZC5SZXZpc2lvbnMgfHwgcGFyc2VkLnJldmlzaW9ucyB8fCBbXSkubWFwKAogICAgICAocikgPT4gKHsKICAgICAgICBhdXRob3I6IHIuQXV0aG9yIHx8IHIuYXV0aG9yLAogICAgICAgIGRhdGU6IHIuRGF0ZSB8fCByLmRhdGUsCiAgICAgICAgcmV2aXNpb25UeXBlOiByLlJldmlzaW9uVHlwZSB8fCByLnJldmlzaW9uVHlwZSwKICAgICAgICB0ZXh0OiByLlRleHQgfHwgci50ZXh0LAogICAgICAgIG1vdmVHcm91cElkOiByLk1vdmVHcm91cElkID8/IHIubW92ZUdyb3VwSWQsCiAgICAgICAgaXNNb3ZlU291cmNlOiByLklzTW92ZVNvdXJjZSA/PyByLmlzTW92ZVNvdXJjZSwKICAgICAgICBmb3JtYXRDaGFuZ2U6IHIuRm9ybWF0Q2hhbmdlIHx8IHIuZm9ybWF0Q2hhbmdlID8gewogICAgICAgICAgb2xkUHJvcGVydGllczogci5Gb3JtYXRDaGFuZ2U/Lk9sZFByb3BlcnRpZXMgfHwgci5mb3JtYXRDaGFuZ2U/Lm9sZFByb3BlcnRpZXMsCiAgICAgICAgICBuZXdQcm9wZXJ0aWVzOiByLkZvcm1hdENoYW5nZT8uTmV3UHJvcGVydGllcyB8fCByLmZvcm1hdENoYW5nZT8ubmV3UHJvcGVydGllcywKICAgICAgICAgIGNoYW5nZWRQcm9wZXJ0eU5hbWVzOiByLkZvcm1hdENoYW5nZT8uQ2hhbmdlZFByb3BlcnR5TmFtZXMgfHwgci5mb3JtYXRDaGFuZ2U/LmNoYW5nZWRQcm9wZXJ0eU5hbWVzCiAgICAgICAgfSA6IHZvaWQgMAogICAgICB9KQogICAgKTsKICAgIHJldHVybiB7IHJldmlzaW9ucyB9OwogIH0gY2F0Y2ggKGVycm9yKSB7CiAgICByZXR1cm4geyBlcnJvcjogU3RyaW5nKGVycm9yKSB9OwogIH0KfQpmdW5jdGlvbiBoYW5kbGVHZXREb2N1bWVudE1ldGFkYXRhKHJlcXVlc3QpIHsKICBjb25zdCBleHBvcnRzID0gZW5zdXJlSW5pdGlhbGl6ZWQoKTsKICB0cnkgewogICAgY29uc3QgcmVzdWx0ID0gZXhwb3J0cy5Eb2N1bWVudENvbnZlcnRlci5HZXREb2N1bWVudE1ldGFkYXRhKAogICAgICByZXF1ZXN0LmRvY3VtZW50Qnl0ZXMKICAgICk7CiAgICBpZiAoaXNFcnJvclJlc3BvbnNlKHJlc3VsdCkpIHsKICAgICAgcmV0dXJuIHBhcnNlRXJyb3IocmVzdWx0KTsKICAgIH0KICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UocmVzdWx0KTsKICAgIGNvbnN0IGNvbnZlcnRTZWN0aW9uID0gKHMpID0+ICh7CiAgICAgIHNlY3Rpb25JbmRleDogcy5TZWN0aW9uSW5kZXggPz8gcy5zZWN0aW9uSW5kZXgsCiAgICAgIHBhZ2VXaWR0aFB0OiBzLlBhZ2VXaWR0aFB0ID8/IHMucGFnZVdpZHRoUHQsCiAgICAgIHBhZ2VIZWlnaHRQdDogcy5QYWdlSGVpZ2h0UHQgPz8gcy5wYWdlSGVpZ2h0UHQsCiAgICAgIG1hcmdpblRvcFB0OiBzLk1hcmdpblRvcFB0ID8/IHMubWFyZ2luVG9wUHQsCiAgICAgIG1hcmdpblJpZ2h0UHQ6IHMuTWFyZ2luUmlnaHRQdCA/PyBzLm1hcmdpblJpZ2h0UHQsCiAgICAgIG1hcmdpbkJvdHRvbVB0OiBzLk1hcmdpbkJvdHRvbVB0ID8/IHMubWFyZ2luQm90dG9tUHQsCiAgICAgIG1hcmdpbkxlZnRQdDogcy5NYXJnaW5MZWZ0UHQgPz8gcy5tYXJnaW5MZWZ0UHQsCiAgICAgIGNvbnRlbnRXaWR0aFB0OiBzLkNvbnRlbnRXaWR0aFB0ID8/IHMuY29udGVudFdpZHRoUHQsCiAgICAgIGNvbnRlbnRIZWlnaHRQdDogcy5Db250ZW50SGVpZ2h0UHQgPz8gcy5jb250ZW50SGVpZ2h0UHQsCiAgICAgIGhlYWRlclB0OiBzLkhlYWRlclB0ID8/IHMuaGVhZGVyUHQsCiAgICAgIGZvb3RlclB0OiBzLkZvb3RlclB0ID8/IHMuZm9vdGVyUHQsCiAgICAgIHBhcmFncmFwaENvdW50OiBzLlBhcmFncmFwaENvdW50ID8/IHMucGFyYWdyYXBoQ291bnQsCiAgICAgIHRhYmxlQ291bnQ6IHMuVGFibGVDb3VudCA/PyBzLnRhYmxlQ291bnQsCiAgICAgIGhhc0hlYWRlcjogcy5IYXNIZWFkZXIgPz8gcy5oYXNIZWFkZXIsCiAgICAgIGhhc0Zvb3Rlcjogcy5IYXNGb290ZXIgPz8gcy5oYXNGb290ZXIsCiAgICAgIGhhc0ZpcnN0UGFnZUhlYWRlcjogcy5IYXNGaXJzdFBhZ2VIZWFkZXIgPz8gcy5oYXNGaXJzdFBhZ2VIZWFkZXIsCiAgICAgIGhhc0ZpcnN0UGFnZUZvb3Rlcjogcy5IYXNGaXJzdFBhZ2VGb290ZXIgPz8gcy5oYXNGaXJzdFBhZ2VGb290ZXIsCiAgICAgIGhhc0V2ZW5QYWdlSGVhZGVyOiBzLkhhc0V2ZW5QYWdlSGVhZGVyID8/IHMuaGFzRXZlblBhZ2VIZWFkZXIsCiAgICAgIGhhc0V2ZW5QYWdlRm9vdGVyOiBzLkhhc0V2ZW5QYWdlRm9vdGVyID8/IHMuaGFzRXZlblBhZ2VGb290ZXIsCiAgICAgIHN0YXJ0UGFyYWdyYXBoSW5kZXg6IHMuU3RhcnRQYXJhZ3JhcGhJbmRleCA/PyBzLnN0YXJ0UGFyYWdyYXBoSW5kZXgsCiAgICAgIGVuZFBhcmFncmFwaEluZGV4OiBzLkVuZFBhcmFncmFwaEluZGV4ID8/IHMuZW5kUGFyYWdyYXBoSW5kZXgsCiAgICAgIHN0YXJ0VGFibGVJbmRleDogcy5TdGFydFRhYmxlSW5kZXggPz8gcy5zdGFydFRhYmxlSW5kZXgsCiAgICAgIGVuZFRhYmxlSW5kZXg6IHMuRW5kVGFibGVJbmRleCA/PyBzLmVuZFRhYmxlSW5kZXgKICAgIH0pOwogICAgY29uc3QgbWV0YWRhdGEgPSB7CiAgICAgIHNlY3Rpb25zOiAocGFyc2VkLlNlY3Rpb25zIHx8IHBhcnNlZC5zZWN0aW9ucyB8fCBbXSkubWFwKGNvbnZlcnRTZWN0aW9uKSwKICAgICAgdG90YWxQYXJhZ3JhcGhzOiBwYXJzZWQuVG90YWxQYXJhZ3JhcGhzID8/IHBhcnNlZC50b3RhbFBhcmFncmFwaHMsCiAgICAgIHRvdGFsVGFibGVzOiBwYXJzZWQuVG90YWxUYWJsZXMgPz8gcGFyc2VkLnRvdGFsVGFibGVzLAogICAgICBoYXNGb290bm90ZXM6IHBhcnNlZC5IYXNGb290bm90ZXMgPz8gcGFyc2VkLmhhc0Zvb3Rub3RlcywKICAgICAgaGFzRW5kbm90ZXM6IHBhcnNlZC5IYXNFbmRub3RlcyA/PyBwYXJzZWQuaGFzRW5kbm90ZXMsCiAgICAgIGhhc1RyYWNrZWRDaGFuZ2VzOiBwYXJzZWQuSGFzVHJhY2tlZENoYW5nZXMgPz8gcGFyc2VkLmhhc1RyYWNrZWRDaGFuZ2VzLAogICAgICBoYXNDb21tZW50czogcGFyc2VkLkhhc0NvbW1lbnRzID8/IHBhcnNlZC5oYXNDb21tZW50cywKICAgICAgZXN0aW1hdGVkUGFnZUNvdW50OiBwYXJzZWQuRXN0aW1hdGVkUGFnZUNvdW50ID8/IHBhcnNlZC5lc3RpbWF0ZWRQYWdlQ291bnQKICAgIH07CiAgICByZXR1cm4geyBtZXRhZGF0YSB9OwogIH0gY2F0Y2ggKGVycm9yKSB7CiAgICByZXR1cm4geyBlcnJvcjogU3RyaW5nKGVycm9yKSB9OwogIH0KfQpmdW5jdGlvbiBoYW5kbGVHZXRWZXJzaW9uKCkgewogIGNvbnN0IGV4cG9ydHMgPSBlbnN1cmVJbml0aWFsaXplZCgpOwogIHRyeSB7CiAgICBjb25zdCByZXN1bHQgPSBleHBvcnRzLkRvY3VtZW50Q29udmVydGVyLkdldFZlcnNpb24oKTsKICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UocmVzdWx0KTsKICAgIHJldHVybiB7CiAgICAgIHZlcnNpb246IHsKICAgICAgICBsaWJyYXJ5OiBwYXJzZWQuTGlicmFyeSB8fCBwYXJzZWQubGlicmFyeSwKICAgICAgICBkb3RuZXRWZXJzaW9uOiBwYXJzZWQuRG90bmV0VmVyc2lvbiB8fCBwYXJzZWQuZG90bmV0VmVyc2lvbiwKICAgICAgICBwbGF0Zm9ybTogcGFyc2VkLlBsYXRmb3JtIHx8IHBhcnNlZC5wbGF0Zm9ybQogICAgICB9CiAgICB9OwogIH0gY2F0Y2ggKGVycm9yKSB7CiAgICByZXR1cm4geyBlcnJvcjogU3RyaW5nKGVycm9yKSB9OwogIH0KfQpzZWxmLm9ubWVzc2FnZSA9IGFzeW5jIChldmVudCkgPT4gewogIGNvbnN0IHJlcXVlc3QgPSBldmVudC5kYXRhOwogIHRyeSB7CiAgICBsZXQgcmVzcG9uc2U7CiAgICBzd2l0Y2ggKHJlcXVlc3QudHlwZSkgewogICAgICBjYXNlICJpbml0IjogewogICAgICAgIGNvbnN0IGluaXRSZXF1ZXN0ID0gcmVxdWVzdDsKICAgICAgICB0cnkgewogICAgICAgICAgYXdhaXQgaW5pdGlhbGl6ZVdhc20oaW5pdFJlcXVlc3Qud2FzbUJhc2VQYXRoKTsKICAgICAgICAgIHJlc3BvbnNlID0gewogICAgICAgICAgICBpZDogcmVxdWVzdC5pZCwKICAgICAgICAgICAgdHlwZTogImluaXQiLAogICAgICAgICAgICBzdWNjZXNzOiB0cnVlCiAgICAgICAgICB9OwogICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICByZXNwb25zZSA9IHsKICAgICAgICAgICAgaWQ6IHJlcXVlc3QuaWQsCiAgICAgICAgICAgIHR5cGU6ICJpbml0IiwKICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsCiAgICAgICAgICAgIGVycm9yOiBTdHJpbmcoZXJyb3IpCiAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgfQogICAgICBjYXNlICJjb252ZXJ0RG9jeFRvSHRtbCI6IHsKICAgICAgICBjb25zdCBjb252ZXJ0UmVxdWVzdCA9IHJlcXVlc3Q7CiAgICAgICAgY29uc3QgcmVzdWx0ID0gaGFuZGxlQ29udmVydChjb252ZXJ0UmVxdWVzdCk7CiAgICAgICAgcmVzcG9uc2UgPSB7CiAgICAgICAgICBpZDogcmVxdWVzdC5pZCwKICAgICAgICAgIHR5cGU6ICJjb252ZXJ0RG9jeFRvSHRtbCIsCiAgICAgICAgICBzdWNjZXNzOiAhcmVzdWx0LmVycm9yLAogICAgICAgICAgaHRtbDogcmVzdWx0Lmh0bWwsCiAgICAgICAgICBlcnJvcjogcmVzdWx0LmVycm9yCiAgICAgICAgfTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBjYXNlICJjb21wYXJlRG9jdW1lbnRzIjogewogICAgICAgIGNvbnN0IGNvbXBhcmVSZXF1ZXN0ID0gcmVxdWVzdDsKICAgICAgICBjb25zdCByZXN1bHQgPSBoYW5kbGVDb21wYXJlKGNvbXBhcmVSZXF1ZXN0KTsKICAgICAgICByZXNwb25zZSA9IHsKICAgICAgICAgIGlkOiByZXF1ZXN0LmlkLAogICAgICAgICAgdHlwZTogImNvbXBhcmVEb2N1bWVudHMiLAogICAgICAgICAgc3VjY2VzczogIXJlc3VsdC5lcnJvciwKICAgICAgICAgIGRvY3VtZW50Qnl0ZXM6IHJlc3VsdC5kb2N1bWVudEJ5dGVzLAogICAgICAgICAgZXJyb3I6IHJlc3VsdC5lcnJvcgogICAgICAgIH07CiAgICAgICAgaWYgKHJlc3VsdC5kb2N1bWVudEJ5dGVzKSB7CiAgICAgICAgICBzZWxmLnBvc3RNZXNzYWdlKHJlc3BvbnNlLCB7IHRyYW5zZmVyOiBbcmVzdWx0LmRvY3VtZW50Qnl0ZXMuYnVmZmVyXSB9KTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgY2FzZSAiY29tcGFyZURvY3VtZW50c1RvSHRtbCI6IHsKICAgICAgICBjb25zdCBjb21wYXJlVG9IdG1sUmVxdWVzdCA9IHJlcXVlc3Q7CiAgICAgICAgY29uc3QgcmVzdWx0ID0gaGFuZGxlQ29tcGFyZVRvSHRtbChjb21wYXJlVG9IdG1sUmVxdWVzdCk7CiAgICAgICAgcmVzcG9uc2UgPSB7CiAgICAgICAgICBpZDogcmVxdWVzdC5pZCwKICAgICAgICAgIHR5cGU6ICJjb21wYXJlRG9jdW1lbnRzVG9IdG1sIiwKICAgICAgICAgIHN1Y2Nlc3M6ICFyZXN1bHQuZXJyb3IsCiAgICAgICAgICBodG1sOiByZXN1bHQuaHRtbCwKICAgICAgICAgIGVycm9yOiByZXN1bHQuZXJyb3IKICAgICAgICB9OwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGNhc2UgImdldFJldmlzaW9ucyI6IHsKICAgICAgICBjb25zdCBnZXRSZXZpc2lvbnNSZXF1ZXN0ID0gcmVxdWVzdDsKICAgICAgICBjb25zdCByZXN1bHQgPSBoYW5kbGVHZXRSZXZpc2lvbnMoZ2V0UmV2aXNpb25zUmVxdWVzdCk7CiAgICAgICAgcmVzcG9uc2UgPSB7CiAgICAgICAgICBpZDogcmVxdWVzdC5pZCwKICAgICAgICAgIHR5cGU6ICJnZXRSZXZpc2lvbnMiLAogICAgICAgICAgc3VjY2VzczogIXJlc3VsdC5lcnJvciwKICAgICAgICAgIHJldmlzaW9uczogcmVzdWx0LnJldmlzaW9ucywKICAgICAgICAgIGVycm9yOiByZXN1bHQuZXJyb3IKICAgICAgICB9OwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGNhc2UgImdldERvY3VtZW50TWV0YWRhdGEiOiB7CiAgICAgICAgY29uc3QgZ2V0TWV0YWRhdGFSZXF1ZXN0ID0gcmVxdWVzdDsKICAgICAgICBjb25zdCByZXN1bHQgPSBoYW5kbGVHZXREb2N1bWVudE1ldGFkYXRhKGdldE1ldGFkYXRhUmVxdWVzdCk7CiAgICAgICAgcmVzcG9uc2UgPSB7CiAgICAgICAgICBpZDogcmVxdWVzdC5pZCwKICAgICAgICAgIHR5cGU6ICJnZXREb2N1bWVudE1ldGFkYXRhIiwKICAgICAgICAgIHN1Y2Nlc3M6ICFyZXN1bHQuZXJyb3IsCiAgICAgICAgICBtZXRhZGF0YTogcmVzdWx0Lm1ldGFkYXRhLAogICAgICAgICAgZXJyb3I6IHJlc3VsdC5lcnJvcgogICAgICAgIH07CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgY2FzZSAiZ2V0VmVyc2lvbiI6IHsKICAgICAgICBjb25zdCByZXN1bHQgPSBoYW5kbGVHZXRWZXJzaW9uKCk7CiAgICAgICAgcmVzcG9uc2UgPSB7CiAgICAgICAgICBpZDogcmVxdWVzdC5pZCwKICAgICAgICAgIHR5cGU6ICJnZXRWZXJzaW9uIiwKICAgICAgICAgIHN1Y2Nlc3M6ICFyZXN1bHQuZXJyb3IsCiAgICAgICAgICB2ZXJzaW9uOiByZXN1bHQudmVyc2lvbiwKICAgICAgICAgIGVycm9yOiByZXN1bHQuZXJyb3IKICAgICAgICB9OwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGRlZmF1bHQ6IHsKICAgICAgICBjb25zdCB1bmtub3duUmVxdWVzdCA9IHJlcXVlc3Q7CiAgICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7CiAgICAgICAgICBpZDogdW5rbm93blJlcXVlc3QuaWQsCiAgICAgICAgICB0eXBlOiB1bmtub3duUmVxdWVzdC50eXBlLAogICAgICAgICAgc3VjY2VzczogZmFsc2UsCiAgICAgICAgICBlcnJvcjogYFVua25vd24gcmVxdWVzdCB0eXBlOiAke3Vua25vd25SZXF1ZXN0LnR5cGV9YAogICAgICAgIH0pOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfQogICAgc2VsZi5wb3N0TWVzc2FnZShyZXNwb25zZSk7CiAgfSBjYXRjaCAoZXJyb3IpIHsKICAgIHNlbGYucG9zdE1lc3NhZ2UoewogICAgICBpZDogcmVxdWVzdC5pZCwKICAgICAgdHlwZTogcmVxdWVzdC50eXBlLAogICAgICBzdWNjZXNzOiBmYWxzZSwKICAgICAgZXJyb3I6IFN0cmluZyhlcnJvcikKICAgIH0pOwogIH0KfTsKc2VsZi5wb3N0TWVzc2FnZSh7IHR5cGU6ICJyZWFkeSIgfSk7Cg==",typeof document>"u"?require("url").pathToFileURL(__filename).href:ge&&ge.tagName.toUpperCase()==="SCRIPT"&&ge.src||new URL("react-docxodus-viewer.cjs.js",document.baseURI).href).href,b=new Worker(p,{type:"module"}),A=new Map;let h=!0;b.onmessage=n=>{const i=n.data;if(i.type==="ready")return;const a=A.get(i.id);a&&(A.delete(i.id),i.success?a.resolve(i):a.reject(new Error(i.error||"Unknown error")))},b.onerror=n=>{for(const i of A.values())i.reject(new Error(`Worker error: ${n.message}`));A.clear(),h=!1};function o(n,i){return new Promise((a,d)=>{if(!h){d(new Error("Worker has been terminated"));return}A.set(n.id,{resolve:a,reject:d}),i&&i.length>0?b.postMessage(n,i):b.postMessage(n)})}const X=await o({id:H(),type:"init",wasmBasePath:l});if(!X.success)throw b.terminate(),new Error(`Failed to initialize worker: ${X.error}`);return{async convertDocxToHtml(n,i){const a=await z(n);return(await o({id:H(),type:"convertDocxToHtml",documentBytes:a,options:i},[a.buffer])).html},async compareDocuments(n,i,a){const d=await z(n),r=await z(i);return(await o({id:H(),type:"compareDocuments",originalBytes:d,modifiedBytes:r,options:a},[d.buffer,r.buffer])).documentBytes},async compareDocumentsToHtml(n,i,a){const d=await z(n),r=await z(i);return(await o({id:H(),type:"compareDocumentsToHtml",originalBytes:d,modifiedBytes:r,options:a},[d.buffer,r.buffer])).html},async getRevisions(n,i){const a=await z(n);return(await o({id:H(),type:"getRevisions",documentBytes:a,options:i},[a.buffer])).revisions},async getDocumentMetadata(n){const i=await z(n);return(await o({id:H(),type:"getDocumentMetadata",documentBytes:i},[i.buffer])).metadata},async getVersion(){return(await o({id:H(),type:"getVersion"})).version},terminate(){h=!1,b.terminate();for(const n of A.values())n.reject(new Error("Worker terminated"));A.clear()},isActive(){return h}}}function Ze(){return typeof Worker<"u"}const he={paginationScale:.8,showPageNumbers:!0,renderFootnotesAndEndnotes:!0,renderHeadersAndFooters:!0,commentMode:"disabled",annotationMode:"disabled",renderTrackedChanges:!1,showDeletedContent:!0,renderMoveOperations:!0,pageTitle:"Document",cssPrefix:"docx-",fabricateClasses:!0,additionalCss:"",commentCssClassPrefix:"comment-",annotationCssClassPrefix:"annot-"};function Ue(s){return C.isInsertion(s)?"Inserted":C.isDeletion(s)?"Deleted":C.isMove(s)?s.isMoveSource?"Moved from":"Moved to":C.isFormatChange(s)?"Formatted":String(s.revisionType)}function Pe(s){return C.isInsertion(s)?"rdv-revision--insertion":C.isDeletion(s)?"rdv-revision--deletion":C.isMove(s)?"rdv-revision--move":C.isFormatChange(s)?"rdv-revision--format":""}function Me(s){try{return new Date(s).toLocaleDateString(void 0,{year:"numeric",month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}catch{return s}}function Le(s,l=100){return s.length<=l?s:s.substring(0,l)+"..."}function Oe({revisions:s}){const[l,p]=I.useState("all"),[b,A]=I.useState(new Set),h=I.useMemo(()=>l==="all"?s:s.filter(n=>{switch(l){case"insertions":return C.isInsertion(n);case"deletions":return C.isDeletion(n);case"moves":return C.isMove(n);case"formatting":return C.isFormatChange(n);default:return!0}}),[s,l]),o=I.useMemo(()=>({total:s.length,insertions:s.filter(C.isInsertion).length,deletions:s.filter(C.isDeletion).length,moves:s.filter(C.isMove).length,formatting:s.filter(C.isFormatChange).length}),[s]),X=n=>{A(i=>{const a=new Set(i);return a.has(n)?a.delete(n):a.add(n),a})};return s.length===0?e.jsx("div",{className:"rdv-revision-panel",children:e.jsxs("div",{className:"rdv-revision-empty",children:[e.jsx("div",{className:"rdv-revision-empty__icon",children:"📝"}),e.jsx("p",{children:"No tracked changes found in this document."})]})}):e.jsxs("div",{className:"rdv-revision-panel",children:[e.jsxs("div",{className:"rdv-revision-header",children:[e.jsxs("div",{className:"rdv-revision-stats",children:[e.jsxs("span",{className:"rdv-revision-stat rdv-revision-stat--total",children:[o.total," changes"]}),o.insertions>0&&e.jsxs("span",{className:"rdv-revision-stat rdv-revision-stat--insertion",children:["+",o.insertions]}),o.deletions>0&&e.jsxs("span",{className:"rdv-revision-stat rdv-revision-stat--deletion",children:["−",o.deletions]}),o.moves>0&&e.jsxs("span",{className:"rdv-revision-stat rdv-revision-stat--move",children:["↔",o.moves]}),o.formatting>0&&e.jsxs("span",{className:"rdv-revision-stat rdv-revision-stat--format",children:["✎",o.formatting]})]}),e.jsxs("select",{className:"rdv-revision-filter",value:l,onChange:n=>p(n.target.value),children:[e.jsx("option",{value:"all",children:"All Changes"}),e.jsxs("option",{value:"insertions",children:["Insertions (",o.insertions,")"]}),e.jsxs("option",{value:"deletions",children:["Deletions (",o.deletions,")"]}),e.jsxs("option",{value:"moves",children:["Moves (",o.moves,")"]}),e.jsxs("option",{value:"formatting",children:["Formatting (",o.formatting,")"]})]})]}),e.jsx("div",{className:"rdv-revision-list",children:h.map((n,i)=>{const a=b.has(i),d=n.text.length>100;return e.jsxs("div",{className:`rdv-revision-item ${Pe(n)}`,children:[e.jsxs("div",{className:"rdv-revision-item__header",children:[e.jsx("span",{className:"rdv-revision-type",children:Ue(n)}),e.jsx("span",{className:"rdv-revision-author",children:n.author}),e.jsx("span",{className:"rdv-revision-date",children:Me(n.date)})]}),e.jsxs("div",{className:"rdv-revision-item__content",children:[e.jsx("span",{className:"rdv-revision-text",children:a?n.text:Le(n.text)}),d&&e.jsx("button",{className:"rdv-revision-expand",onClick:()=>X(i),children:a?"Show less":"Show more"})]}),C.isFormatChange(n)&&n.formatChange&&e.jsxs("div",{className:"rdv-revision-item__format-details",children:[n.formatChange.oldProperties&&Object.entries(n.formatChange.oldProperties).map(([r,V])=>e.jsxs("span",{children:[r,": ",V," → "]},`old-${r}`)),n.formatChange.newProperties&&Object.entries(n.formatChange.newProperties).map(([r,V])=>e.jsxs("span",{children:[r,": ",V]},`new-${r}`))]})]},i)})})]})}function Te(s){switch(s){case"endnote":return C.CommentRenderMode.EndnoteStyle;case"inline":return C.CommentRenderMode.Inline;case"margin":return C.CommentRenderMode.Margin;default:return C.CommentRenderMode.Disabled}}function Ee(s){switch(s){case"above":return C.AnnotationLabelMode.Above;case"inline":return C.AnnotationLabelMode.Inline;case"tooltip":return C.AnnotationLabelMode.Tooltip;case"none":return C.AnnotationLabelMode.None;default:return}}function _e({file:s,html:l,onFileChange:p,onConversionStart:b,onConversionComplete:A,onError:h,onPageChange:o,onRevisionsExtracted:X,settings:n,defaultSettings:i,onSettingsChange:a,className:d,style:r,toolbar:V="top",showSettingsButton:ve=!0,showRevisionsTab:J=!0,placeholder:Ve="Open a DOCX file to view",wasmBasePath:P,useWorker:u=!1}){const M=I.useMemo(()=>({...he,...i}),[i]),[ye,ne]=I.useState(null),[We,k]=I.useState(null),[se,Ge]=I.useState(M),y=s!==void 0?s:ye,W=l!==void 0?l:We,t=I.useMemo(()=>n?{...M,...n}:se,[n,M,se]),R=ue.useDocxodus(P),[w,ce]=I.useState(null),[Be,te]=I.useState(!1),[pe,L]=I.useState(!1),[Xe,Ie]=I.useState(null),f=I.useRef(null);I.useEffect(()=>{if(!u||!Ze())return;let g=!1;return L(!0),Ie(null),De({wasmBasePath:P}).then(c=>{g?c.terminate():(f.current=c,ce(c),te(!0),L(!1))}).catch(c=>{g||(Ie(c instanceof Error?c:new Error(String(c))),L(!1))}),()=>{g=!0,f.current&&(f.current.terminate(),f.current=null,ce(null),te(!1))}},[u,P]);const N=u?Be:R.isReady,F=u?pe:R.isLoading,j=u?Xe:R.error,[G,ie]=I.useState(!1),[Ce,S]=I.useState(null),[ae,le]=I.useState(""),[v,O]=I.useState(1),[Z,T]=I.useState(0),[Re,K]=I.useState(!1),[x,Q]=I.useState("document"),[E,D]=I.useState([]),[Ne,oe]=I.useState(!1),_=I.useRef(null),$=I.useCallback(()=>({commentRenderMode:Te(t.commentMode),pageTitle:t.pageTitle,cssPrefix:t.cssPrefix,fabricateClasses:t.fabricateClasses,additionalCss:t.additionalCss||void 0,commentCssClassPrefix:t.commentCssClassPrefix,paginationMode:C.PaginationMode.Paginated,paginationScale:t.paginationScale,renderAnnotations:t.annotationMode!=="disabled",annotationLabelMode:Ee(t.annotationMode),annotationCssClassPrefix:t.annotationCssClassPrefix,renderFootnotesAndEndnotes:t.renderFootnotesAndEndnotes,renderHeadersAndFooters:t.renderHeadersAndFooters,renderTrackedChanges:t.renderTrackedChanges,showDeletedContent:t.showDeletedContent,renderMoveOperations:t.renderMoveOperations}),[t]),de=I.useCallback(async g=>{if(!(!N||!J)){oe(!0);try{const c=u&&w?await w.getRevisions(g):await R.getRevisions(g);D(c),X?.(c)}catch{D([])}finally{oe(!1)}}},[N,u,w,R,J,X]),Y=I.useCallback(async g=>{if(N){ie(!0),S(null),D([]),Q("document"),b?.(),u||await new Promise(c=>requestAnimationFrame(()=>requestAnimationFrame(c)));try{const c=u&&w?await w.convertDocxToHtml(g,$()):await R.convertToHtml(g,$());l===void 0&&k(c),A?.(c),de(g)}catch(c){const B=c instanceof Error?c:new Error(String(c));S(B),h?.(B)}finally{ie(!1)}}},[N,u,w,R,$,l,b,A,h,de]);I.useEffect(()=>{N&&y&&!W&&!G&&l===void 0&&Y(y)},[N,y,W,G,Y,l]);const He=async g=>{const c=g.target.files?.[0];c&&(le(c.name),S(null),O(1),T(0),s===void 0&&(ne(c),k(null)),p?.(c),N&&l===void 0&&await Y(c))},ze=I.useCallback(async()=>{y&&(l===void 0&&k(null),await Y(y))},[y,Y,l]),we=()=>{s===void 0&&ne(null),l===void 0&&k(null),S(null),le(""),O(1),T(0),D([]),Q("document"),p?.(null);const g=document.getElementById("rdv-file-input");g&&(g.value="")},m=I.useCallback(g=>{const c={...t,...g};n===void 0&&Ge(c),a?.(c)},[t,n,a]),Fe=()=>m({paginationScale:Math.min(t.paginationScale+.1,2)}),xe=()=>m({paginationScale:Math.max(t.paginationScale-.1,.3)}),Ye=g=>m({paginationScale:Math.max(.3,Math.min(2,g))}),q=g=>{const c=_.current;if(!c||g<1||g>Z)return;const B=c.querySelector(`[data-page-number="${g}"]`);B&&B.scrollIntoView({behavior:"smooth",block:"start"})},Je=()=>v>1&&q(v-1),ke=()=>v<Z&&q(v+1),fe=g=>{O(g),o?.(g,Z)};I.useEffect(()=>{const g=_.current;if(!g)return;const c=B=>{const be=B.target.closest('a[href^="#"]');if(!be)return;const ee=be.getAttribute("href");if(!ee||!ee.startsWith("#"))return;B.preventDefault();const me=ee.substring(1),U=g.querySelector(`[id="${me}"], [name="${me}"]`);U&&(U.scrollIntoView({behavior:"smooth",block:"center"}),U.classList.add("rdv-footnote-highlight"),setTimeout(()=>U.classList.remove("rdv-footnote-highlight"),2e3))};return g.addEventListener("click",c),()=>g.removeEventListener("click",c)},[W]),I.useEffect(()=>{Z>0&&o?.(v,Z)},[Z,v,o]);const re=G||F,je=()=>e.jsx("div",{className:"rdv-settings-overlay",onClick:()=>K(!1),children:e.jsxs("div",{className:"rdv-settings-modal",onClick:g=>g.stopPropagation(),children:[e.jsxs("div",{className:"rdv-settings-header",children:[e.jsx("h3",{children:"Viewer Settings"}),e.jsx("button",{className:"rdv-settings-close",onClick:()=>K(!1),children:"×"})]}),e.jsxs("div",{className:"rdv-settings-body",children:[e.jsxs("div",{className:"rdv-settings-section",children:[e.jsx("h4",{children:"Display Options"}),e.jsxs("label",{className:"rdv-settings-checkbox",children:[e.jsx("input",{type:"checkbox",checked:t.renderFootnotesAndEndnotes,onChange:g=>m({renderFootnotesAndEndnotes:g.target.checked})}),e.jsx("span",{children:"Show footnotes and endnotes"})]}),e.jsxs("label",{className:"rdv-settings-checkbox",children:[e.jsx("input",{type:"checkbox",checked:t.renderHeadersAndFooters,onChange:g=>m({renderHeadersAndFooters:g.target.checked})}),e.jsx("span",{children:"Show headers and footers"})]}),e.jsxs("label",{className:"rdv-settings-checkbox",children:[e.jsx("input",{type:"checkbox",checked:t.showPageNumbers,onChange:g=>m({showPageNumbers:g.target.checked})}),e.jsx("span",{children:"Show page numbers"})]})]}),e.jsxs("div",{className:"rdv-settings-section",children:[e.jsx("h4",{children:"Comment Rendering"}),e.jsx("div",{className:"rdv-settings-radio-group",children:["disabled","endnote","inline","margin"].map(g=>e.jsxs("label",{className:"rdv-settings-radio",children:[e.jsx("input",{type:"radio",name:"commentMode",checked:t.commentMode===g,onChange:()=>m({commentMode:g})}),e.jsxs("span",{children:[g.charAt(0).toUpperCase()+g.slice(1),g==="endnote"?"s":""]})]},g))})]}),e.jsxs("div",{className:"rdv-settings-section",children:[e.jsx("h4",{children:"Annotation Rendering"}),e.jsx("div",{className:"rdv-settings-radio-group",children:["disabled","above","inline","tooltip","none"].map(g=>e.jsxs("label",{className:"rdv-settings-radio",children:[e.jsx("input",{type:"radio",name:"annotationMode",checked:t.annotationMode===g,onChange:()=>m({annotationMode:g})}),e.jsx("span",{children:g==="none"?"Highlight Only":g.charAt(0).toUpperCase()+g.slice(1)})]},g))})]}),e.jsxs("div",{className:"rdv-settings-section",children:[e.jsx("h4",{children:"Tracked Changes"}),e.jsxs("label",{className:"rdv-settings-checkbox",children:[e.jsx("input",{type:"checkbox",checked:t.renderTrackedChanges,onChange:g=>m({renderTrackedChanges:g.target.checked})}),e.jsx("span",{children:"Show tracked changes"})]}),t.renderTrackedChanges&&e.jsxs("div",{className:"rdv-settings-subsection",children:[e.jsxs("label",{className:"rdv-settings-checkbox",children:[e.jsx("input",{type:"checkbox",checked:t.showDeletedContent,onChange:g=>m({showDeletedContent:g.target.checked})}),e.jsx("span",{children:"Show deleted content"})]}),e.jsxs("label",{className:"rdv-settings-checkbox",children:[e.jsx("input",{type:"checkbox",checked:t.renderMoveOperations,onChange:g=>m({renderMoveOperations:g.target.checked})}),e.jsx("span",{children:"Distinguish move operations"})]})]})]})]}),e.jsx("div",{className:"rdv-settings-footer",children:e.jsx("button",{className:"rdv-settings-apply",onClick:()=>{ze(),K(!1)},children:"Apply & Close"})})]})}),Se=E.length>0,Ae=()=>e.jsxs("div",{className:"rdv-toolbar",children:[e.jsxs("div",{className:"rdv-toolbar-left",children:[e.jsx("label",{htmlFor:"rdv-file-input",className:"rdv-toolbar-file-btn",children:ae||"Open Document"}),e.jsx("input",{id:"rdv-file-input",type:"file",accept:".docx",onChange:He,disabled:re,className:"rdv-file-input"}),ae&&e.jsx("button",{className:"rdv-toolbar-btn rdv-toolbar-clear",onClick:we,disabled:re,children:"×"}),J&&Se&&e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"rdv-toolbar-separator"}),e.jsxs("div",{className:"rdv-view-tabs",children:[e.jsx("button",{className:`rdv-view-tab ${x==="document"?"rdv-view-tab--active":""}`,onClick:()=>Q("document"),title:"View Document",children:"Document"}),e.jsxs("button",{className:`rdv-view-tab ${x==="revisions"?"rdv-view-tab--active":""}`,onClick:()=>Q("revisions"),title:"View Tracked Changes",children:["Changes (",E.length,")"]})]})]}),J&&Ne&&e.jsx("span",{className:"rdv-extracting-indicator",title:"Extracting tracked changes...",children:"..."})]}),e.jsx("div",{className:"rdv-toolbar-center",children:W&&Z>0&&x==="document"&&e.jsxs(e.Fragment,{children:[e.jsx("button",{className:"rdv-toolbar-btn",onClick:Je,disabled:v<=1,title:"Previous Page",children:"◀"}),e.jsxs("div",{className:"rdv-page-input-group",children:[e.jsx("input",{type:"number",className:"rdv-page-input",value:v,min:1,max:Z,onChange:g=>{const c=parseInt(g.target.value);isNaN(c)||q(c)}}),e.jsxs("span",{className:"rdv-page-total",children:["/ ",Z]})]}),e.jsx("button",{className:"rdv-toolbar-btn",onClick:ke,disabled:v>=Z,title:"Next Page",children:"▶"}),e.jsx("div",{className:"rdv-toolbar-separator"}),e.jsx("button",{className:"rdv-toolbar-btn",onClick:xe,disabled:t.paginationScale<=.3,title:"Zoom Out",children:"−"}),e.jsxs("select",{className:"rdv-zoom-select",value:t.paginationScale,onChange:g=>Ye(parseFloat(g.target.value)),children:[e.jsx("option",{value:"0.5",children:"50%"}),e.jsx("option",{value:"0.75",children:"75%"}),e.jsx("option",{value:"0.8",children:"80%"}),e.jsx("option",{value:"0.9",children:"90%"}),e.jsx("option",{value:"1",children:"100%"}),e.jsx("option",{value:"1.25",children:"125%"}),e.jsx("option",{value:"1.5",children:"150%"}),e.jsx("option",{value:"2",children:"200%"})]}),e.jsx("button",{className:"rdv-toolbar-btn",onClick:Fe,disabled:t.paginationScale>=2,title:"Zoom In",children:"+"})]})}),e.jsx("div",{className:"rdv-toolbar-right",children:ve&&e.jsx("button",{className:"rdv-toolbar-btn rdv-toolbar-settings",onClick:()=>K(!0),title:"Settings",children:"⚙"})})]}),Ke=["rdv-viewer",d].filter(Boolean).join(" ");return e.jsxs("div",{className:Ke,style:r,children:[V==="top"&&e.jsx(Ae,{}),e.jsxs("div",{className:"rdv-content",children:[j&&e.jsx("div",{className:"rdv-message rdv-message--error",children:e.jsxs("p",{children:["Failed to initialize: ",j.message]})}),!j&&(F||G)&&e.jsxs("div",{className:"rdv-message",children:[e.jsx("div",{className:"rdv-spinner"}),e.jsx("p",{children:F&&y?"Loading engine & preparing document...":F?"Loading document engine...":"Processing document..."})]}),!F&&!j&&!W&&!G&&!y&&e.jsxs("div",{className:"rdv-message",children:[e.jsx("div",{className:"rdv-message__icon",children:"📄"}),e.jsx("p",{children:Ve})]}),Ce&&!G&&e.jsx("div",{className:"rdv-message rdv-message--error",children:e.jsxs("p",{children:["Error: ",Ce.message]})}),W&&!G&&x==="document"&&e.jsx("div",{ref:_,className:"rdv-pages",children:e.jsx(ue.PaginatedDocument,{html:W,scale:t.paginationScale,showPageNumbers:t.showPageNumbers,pageGap:20,backgroundColor:"#525659",className:"rdv-paginated-document",onPaginationComplete:g=>{T(g.totalPages)},onPageVisible:fe})}),W&&!G&&x==="revisions"&&e.jsx(Oe,{revisions:E})]}),V==="bottom"&&e.jsx(Ae,{}),Re&&e.jsx(je,{})]})}Object.defineProperty(exports,"RevisionType",{enumerable:!0,get:()=>C.RevisionType});Object.defineProperty(exports,"isDeletion",{enumerable:!0,get:()=>C.isDeletion});Object.defineProperty(exports,"isFormatChange",{enumerable:!0,get:()=>C.isFormatChange});Object.defineProperty(exports,"isInsertion",{enumerable:!0,get:()=>C.isInsertion});Object.defineProperty(exports,"isMove",{enumerable:!0,get:()=>C.isMove});exports.DEFAULT_SETTINGS=he;exports.DocumentViewer=_e;exports.isWorkerSupported=Ze;
|
|
2
2
|
//# sourceMappingURL=react-docxodus-viewer.cjs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react-docxodus-viewer.cjs.js","sources":["../src/types/index.ts","../src/DocumentViewer.tsx"],"sourcesContent":["/**\n * react-docxodus-viewer types\n */\n\nexport type CommentMode = 'disabled' | 'endnote' | 'inline' | 'margin';\nexport type AnnotationMode = 'disabled' | 'above' | 'inline' | 'tooltip' | 'none';\n\nexport interface ViewerSettings {\n /** Zoom scale (0.3 - 2.0) */\n paginationScale: number;\n /** Show page numbers on pages */\n showPageNumbers: boolean;\n /** Render footnotes and endnotes */\n renderFootnotesAndEndnotes: boolean;\n /** Render headers and footers */\n renderHeadersAndFooters: boolean;\n /** Comment rendering mode */\n commentMode: CommentMode;\n /** Annotation rendering mode */\n annotationMode: AnnotationMode;\n /** Show tracked changes */\n renderTrackedChanges: boolean;\n /** Show deleted content in tracked changes */\n showDeletedContent: boolean;\n /** Distinguish move operations in tracked changes */\n renderMoveOperations: boolean;\n /** Page title for converted HTML */\n pageTitle: string;\n /** CSS class prefix for generated elements */\n cssPrefix: string;\n /** Generate CSS classes for styling */\n fabricateClasses: boolean;\n /** Additional CSS to inject */\n additionalCss: string;\n /** CSS class prefix for comments */\n commentCssClassPrefix: string;\n /** CSS class prefix for annotations */\n annotationCssClassPrefix: string;\n}\n\nexport interface DocumentViewerProps {\n /** File to display (controlled mode) */\n file?: File | null;\n /** Pre-converted HTML content (skip conversion) */\n html?: string | null;\n\n /** Callback when file changes */\n onFileChange?: (file: File | null) => void;\n /** Callback when conversion starts */\n onConversionStart?: () => void;\n /** Callback when conversion completes successfully */\n onConversionComplete?: (html: string) => void;\n /** Callback when an error occurs */\n onError?: (error: Error) => void;\n /** Callback when visible page changes */\n onPageChange?: (page: number, total: number) => void;\n\n /** Initial/controlled viewer settings */\n settings?: Partial<ViewerSettings>;\n /** Default settings (used for uncontrolled mode) */\n defaultSettings?: Partial<ViewerSettings>;\n /** Callback when settings change */\n onSettingsChange?: (settings: ViewerSettings) => void;\n\n /** Additional CSS class for the root element */\n className?: string;\n /** Inline styles for the root element */\n style?: React.CSSProperties;\n /** Toolbar position */\n toolbar?: 'top' | 'bottom' | 'none';\n /** Show settings button in toolbar */\n showSettingsButton?: boolean;\n /** Placeholder text when no document is loaded */\n placeholder?: string;\n\n /** Base path for WASM files */\n wasmBasePath?: string;\n}\n\nexport const DEFAULT_SETTINGS: ViewerSettings = {\n paginationScale: 0.8,\n showPageNumbers: true,\n renderFootnotesAndEndnotes: true,\n renderHeadersAndFooters: true,\n commentMode: 'disabled',\n annotationMode: 'disabled',\n renderTrackedChanges: false,\n showDeletedContent: true,\n renderMoveOperations: true,\n pageTitle: 'Document',\n cssPrefix: 'docx-',\n fabricateClasses: true,\n additionalCss: '',\n commentCssClassPrefix: 'comment-',\n annotationCssClassPrefix: 'annot-',\n};\n","import { useState, useCallback, useRef, useEffect, useMemo } from 'react';\nimport { useDocxodus, PaginatedDocument } from 'docxodus/react';\nimport { CommentRenderMode, PaginationMode, AnnotationLabelMode } from 'docxodus';\nimport type { PaginationResult } from 'docxodus/react';\nimport type {\n DocumentViewerProps,\n ViewerSettings,\n CommentMode,\n AnnotationMode,\n} from './types';\nimport { DEFAULT_SETTINGS } from './types';\n\n// Default WASM path - consumers should override this\nconst DEFAULT_WASM_PATH = '/wasm/';\n\nfunction getCommentRenderMode(mode: CommentMode): CommentRenderMode {\n switch (mode) {\n case 'endnote': return CommentRenderMode.EndnoteStyle;\n case 'inline': return CommentRenderMode.Inline;\n case 'margin': return CommentRenderMode.Margin;\n default: return CommentRenderMode.Disabled;\n }\n}\n\nfunction getAnnotationLabelMode(mode: AnnotationMode): AnnotationLabelMode | undefined {\n switch (mode) {\n case 'above': return AnnotationLabelMode.Above;\n case 'inline': return AnnotationLabelMode.Inline;\n case 'tooltip': return AnnotationLabelMode.Tooltip;\n case 'none': return AnnotationLabelMode.None;\n default: return undefined;\n }\n}\n\nexport function DocumentViewer({\n file: controlledFile,\n html: controlledHtml,\n onFileChange,\n onConversionStart,\n onConversionComplete,\n onError,\n onPageChange,\n settings: controlledSettings,\n defaultSettings,\n onSettingsChange,\n className,\n style,\n toolbar = 'top',\n showSettingsButton = true,\n placeholder = 'Open a DOCX file to view',\n wasmBasePath = DEFAULT_WASM_PATH,\n}: DocumentViewerProps) {\n // Merge default settings\n const mergedDefaults = useMemo(\n () => ({ ...DEFAULT_SETTINGS, ...defaultSettings }),\n [defaultSettings]\n );\n\n // Internal state (uncontrolled mode)\n const [internalFile, setInternalFile] = useState<File | null>(null);\n const [internalHtml, setInternalHtml] = useState<string | null>(null);\n const [internalSettings, setInternalSettings] = useState<ViewerSettings>(mergedDefaults);\n\n // Determine which values to use (controlled vs uncontrolled)\n const file = controlledFile !== undefined ? controlledFile : internalFile;\n const html = controlledHtml !== undefined ? controlledHtml : internalHtml;\n const settings = useMemo(\n () => controlledSettings\n ? { ...mergedDefaults, ...controlledSettings }\n : internalSettings,\n [controlledSettings, mergedDefaults, internalSettings]\n );\n\n // Docxodus hook\n const { isReady, isLoading, error: initError, convertToHtml } = useDocxodus(wasmBasePath);\n\n // Local UI state\n const [isConverting, setIsConverting] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [fileName, setFileName] = useState<string>('');\n const [currentPage, setCurrentPage] = useState(1);\n const [totalPages, setTotalPages] = useState(0);\n const [showSettings, setShowSettings] = useState(false);\n\n const paginatedContainerRef = useRef<HTMLDivElement>(null);\n\n // Build conversion options from settings\n const getConvertOptions = useCallback(() => ({\n commentRenderMode: getCommentRenderMode(settings.commentMode),\n pageTitle: settings.pageTitle,\n cssPrefix: settings.cssPrefix,\n fabricateClasses: settings.fabricateClasses,\n additionalCss: settings.additionalCss || undefined,\n commentCssClassPrefix: settings.commentCssClassPrefix,\n paginationMode: PaginationMode.Paginated,\n paginationScale: settings.paginationScale,\n renderAnnotations: settings.annotationMode !== 'disabled',\n annotationLabelMode: getAnnotationLabelMode(settings.annotationMode),\n annotationCssClassPrefix: settings.annotationCssClassPrefix,\n renderFootnotesAndEndnotes: settings.renderFootnotesAndEndnotes,\n renderHeadersAndFooters: settings.renderHeadersAndFooters,\n renderTrackedChanges: settings.renderTrackedChanges,\n showDeletedContent: settings.showDeletedContent,\n renderMoveOperations: settings.renderMoveOperations,\n }), [settings]);\n\n // Convert file to HTML\n const convert = useCallback(async (fileToConvert: File) => {\n if (!isReady) return;\n\n setIsConverting(true);\n setError(null);\n onConversionStart?.();\n\n // Allow React to render loading state before heavy WASM work\n await new Promise(resolve => requestAnimationFrame(() => requestAnimationFrame(resolve)));\n\n try {\n const result = await convertToHtml(fileToConvert, getConvertOptions());\n\n if (controlledHtml === undefined) {\n setInternalHtml(result);\n }\n onConversionComplete?.(result);\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n onError?.(error);\n } finally {\n setIsConverting(false);\n }\n }, [isReady, convertToHtml, getConvertOptions, controlledHtml, onConversionStart, onConversionComplete, onError]);\n\n // Auto-convert when WASM ready and file available\n useEffect(() => {\n if (isReady && file && !html && !isConverting && controlledHtml === undefined) {\n convert(file);\n }\n }, [isReady, file, html, isConverting, convert, controlledHtml]);\n\n // Handle file input change\n const handleFileChange = async (e: React.ChangeEvent<HTMLInputElement>) => {\n const selectedFile = e.target.files?.[0];\n if (selectedFile) {\n setFileName(selectedFile.name);\n setError(null);\n setCurrentPage(1);\n setTotalPages(0);\n\n if (controlledFile === undefined) {\n setInternalFile(selectedFile);\n setInternalHtml(null);\n }\n onFileChange?.(selectedFile);\n\n if (isReady && controlledHtml === undefined) {\n await convert(selectedFile);\n }\n }\n };\n\n // Reconvert with current settings\n const reconvert = useCallback(async () => {\n if (file) {\n if (controlledHtml === undefined) {\n setInternalHtml(null);\n }\n await convert(file);\n }\n }, [file, convert, controlledHtml]);\n\n // Clear document\n const handleClear = () => {\n if (controlledFile === undefined) {\n setInternalFile(null);\n }\n if (controlledHtml === undefined) {\n setInternalHtml(null);\n }\n setError(null);\n setFileName('');\n setCurrentPage(1);\n setTotalPages(0);\n onFileChange?.(null);\n\n const input = document.getElementById('rdv-file-input') as HTMLInputElement;\n if (input) input.value = '';\n };\n\n // Update settings\n const updateSettings = useCallback((updates: Partial<ViewerSettings>) => {\n const newSettings = { ...settings, ...updates };\n if (controlledSettings === undefined) {\n setInternalSettings(newSettings);\n }\n onSettingsChange?.(newSettings);\n }, [settings, controlledSettings, onSettingsChange]);\n\n // Zoom controls\n const handleZoomIn = () => updateSettings({\n paginationScale: Math.min(settings.paginationScale + 0.1, 2.0)\n });\n const handleZoomOut = () => updateSettings({\n paginationScale: Math.max(settings.paginationScale - 0.1, 0.3)\n });\n const handleZoomChange = (value: number) => updateSettings({\n paginationScale: Math.max(0.3, Math.min(2.0, value))\n });\n\n // Page navigation\n const goToPage = (pageNum: number) => {\n const container = paginatedContainerRef.current;\n if (!container || pageNum < 1 || pageNum > totalPages) return;\n const pageElement = container.querySelector(`[data-page-number=\"${pageNum}\"]`);\n if (pageElement) {\n pageElement.scrollIntoView({ behavior: 'smooth', block: 'start' });\n }\n };\n\n const goToPreviousPage = () => currentPage > 1 && goToPage(currentPage - 1);\n const goToNextPage = () => currentPage < totalPages && goToPage(currentPage + 1);\n\n // Handle page visibility changes\n const handlePageVisible = (pageNumber: number) => {\n setCurrentPage(pageNumber);\n onPageChange?.(pageNumber, totalPages);\n };\n\n // Handle footnote/anchor clicks\n useEffect(() => {\n const container = paginatedContainerRef.current;\n if (!container) return;\n\n const handleAnchorClick = (e: MouseEvent) => {\n const target = e.target as HTMLElement;\n const anchor = target.closest('a[href^=\"#\"]') as HTMLAnchorElement | null;\n if (!anchor) return;\n\n const href = anchor.getAttribute('href');\n if (!href || !href.startsWith('#')) return;\n\n e.preventDefault();\n const targetId = href.substring(1);\n const targetElement = container.querySelector(`[id=\"${targetId}\"], [name=\"${targetId}\"]`);\n\n if (targetElement) {\n targetElement.scrollIntoView({ behavior: 'smooth', block: 'center' });\n targetElement.classList.add('rdv-footnote-highlight');\n setTimeout(() => targetElement.classList.remove('rdv-footnote-highlight'), 2000);\n }\n };\n\n container.addEventListener('click', handleAnchorClick);\n return () => container.removeEventListener('click', handleAnchorClick);\n }, [html]);\n\n // Notify parent of page changes when totalPages updates\n useEffect(() => {\n if (totalPages > 0) {\n onPageChange?.(currentPage, totalPages);\n }\n }, [totalPages, currentPage, onPageChange]);\n\n const isProcessing = isConverting || isLoading;\n\n // Settings Modal\n const SettingsModal = () => (\n <div className=\"rdv-settings-overlay\" onClick={() => setShowSettings(false)}>\n <div className=\"rdv-settings-modal\" onClick={(e) => e.stopPropagation()}>\n <div className=\"rdv-settings-header\">\n <h3>Viewer Settings</h3>\n <button className=\"rdv-settings-close\" onClick={() => setShowSettings(false)}>×</button>\n </div>\n <div className=\"rdv-settings-body\">\n <div className=\"rdv-settings-section\">\n <h4>Display Options</h4>\n <label className=\"rdv-settings-checkbox\">\n <input\n type=\"checkbox\"\n checked={settings.renderFootnotesAndEndnotes}\n onChange={(e) => updateSettings({ renderFootnotesAndEndnotes: e.target.checked })}\n />\n <span>Show footnotes and endnotes</span>\n </label>\n <label className=\"rdv-settings-checkbox\">\n <input\n type=\"checkbox\"\n checked={settings.renderHeadersAndFooters}\n onChange={(e) => updateSettings({ renderHeadersAndFooters: e.target.checked })}\n />\n <span>Show headers and footers</span>\n </label>\n <label className=\"rdv-settings-checkbox\">\n <input\n type=\"checkbox\"\n checked={settings.showPageNumbers}\n onChange={(e) => updateSettings({ showPageNumbers: e.target.checked })}\n />\n <span>Show page numbers</span>\n </label>\n </div>\n\n <div className=\"rdv-settings-section\">\n <h4>Comment Rendering</h4>\n <div className=\"rdv-settings-radio-group\">\n {(['disabled', 'endnote', 'inline', 'margin'] as CommentMode[]).map((mode) => (\n <label key={mode} className=\"rdv-settings-radio\">\n <input\n type=\"radio\"\n name=\"commentMode\"\n checked={settings.commentMode === mode}\n onChange={() => updateSettings({ commentMode: mode })}\n />\n <span>{mode.charAt(0).toUpperCase() + mode.slice(1)}{mode === 'endnote' ? 's' : ''}</span>\n </label>\n ))}\n </div>\n </div>\n\n <div className=\"rdv-settings-section\">\n <h4>Annotation Rendering</h4>\n <div className=\"rdv-settings-radio-group\">\n {(['disabled', 'above', 'inline', 'tooltip', 'none'] as AnnotationMode[]).map((mode) => (\n <label key={mode} className=\"rdv-settings-radio\">\n <input\n type=\"radio\"\n name=\"annotationMode\"\n checked={settings.annotationMode === mode}\n onChange={() => updateSettings({ annotationMode: mode })}\n />\n <span>{mode === 'none' ? 'Highlight Only' : mode.charAt(0).toUpperCase() + mode.slice(1)}</span>\n </label>\n ))}\n </div>\n </div>\n\n <div className=\"rdv-settings-section\">\n <h4>Tracked Changes</h4>\n <label className=\"rdv-settings-checkbox\">\n <input\n type=\"checkbox\"\n checked={settings.renderTrackedChanges}\n onChange={(e) => updateSettings({ renderTrackedChanges: e.target.checked })}\n />\n <span>Show tracked changes</span>\n </label>\n {settings.renderTrackedChanges && (\n <div className=\"rdv-settings-subsection\">\n <label className=\"rdv-settings-checkbox\">\n <input\n type=\"checkbox\"\n checked={settings.showDeletedContent}\n onChange={(e) => updateSettings({ showDeletedContent: e.target.checked })}\n />\n <span>Show deleted content</span>\n </label>\n <label className=\"rdv-settings-checkbox\">\n <input\n type=\"checkbox\"\n checked={settings.renderMoveOperations}\n onChange={(e) => updateSettings({ renderMoveOperations: e.target.checked })}\n />\n <span>Distinguish move operations</span>\n </label>\n </div>\n )}\n </div>\n </div>\n <div className=\"rdv-settings-footer\">\n <button className=\"rdv-settings-apply\" onClick={() => { reconvert(); setShowSettings(false); }}>\n Apply & Close\n </button>\n </div>\n </div>\n </div>\n );\n\n // Toolbar component\n const Toolbar = () => (\n <div className=\"rdv-toolbar\">\n <div className=\"rdv-toolbar-left\">\n <label htmlFor=\"rdv-file-input\" className=\"rdv-toolbar-file-btn\">\n {fileName || 'Open Document'}\n </label>\n <input\n id=\"rdv-file-input\"\n type=\"file\"\n accept=\".docx\"\n onChange={handleFileChange}\n disabled={isProcessing}\n className=\"rdv-file-input\"\n />\n {fileName && (\n <button className=\"rdv-toolbar-btn rdv-toolbar-clear\" onClick={handleClear} disabled={isProcessing}>\n ×\n </button>\n )}\n </div>\n\n <div className=\"rdv-toolbar-center\">\n {html && totalPages > 0 && (\n <>\n <button\n className=\"rdv-toolbar-btn\"\n onClick={goToPreviousPage}\n disabled={currentPage <= 1}\n title=\"Previous Page\"\n >\n ◀\n </button>\n <div className=\"rdv-page-input-group\">\n <input\n type=\"number\"\n className=\"rdv-page-input\"\n value={currentPage}\n min={1}\n max={totalPages}\n onChange={(e) => {\n const page = parseInt(e.target.value);\n if (!isNaN(page)) goToPage(page);\n }}\n />\n <span className=\"rdv-page-total\">/ {totalPages}</span>\n </div>\n <button\n className=\"rdv-toolbar-btn\"\n onClick={goToNextPage}\n disabled={currentPage >= totalPages}\n title=\"Next Page\"\n >\n ▶\n </button>\n\n <div className=\"rdv-toolbar-separator\" />\n\n <button\n className=\"rdv-toolbar-btn\"\n onClick={handleZoomOut}\n disabled={settings.paginationScale <= 0.3}\n title=\"Zoom Out\"\n >\n −\n </button>\n <select\n className=\"rdv-zoom-select\"\n value={settings.paginationScale}\n onChange={(e) => handleZoomChange(parseFloat(e.target.value))}\n >\n <option value=\"0.5\">50%</option>\n <option value=\"0.75\">75%</option>\n <option value=\"0.8\">80%</option>\n <option value=\"0.9\">90%</option>\n <option value=\"1\">100%</option>\n <option value=\"1.25\">125%</option>\n <option value=\"1.5\">150%</option>\n <option value=\"2\">200%</option>\n </select>\n <button\n className=\"rdv-toolbar-btn\"\n onClick={handleZoomIn}\n disabled={settings.paginationScale >= 2.0}\n title=\"Zoom In\"\n >\n +\n </button>\n </>\n )}\n </div>\n\n <div className=\"rdv-toolbar-right\">\n {showSettingsButton && (\n <button\n className=\"rdv-toolbar-btn rdv-toolbar-settings\"\n onClick={() => setShowSettings(true)}\n title=\"Settings\"\n >\n ⚙\n </button>\n )}\n </div>\n </div>\n );\n\n const rootClassName = ['rdv-viewer', className].filter(Boolean).join(' ');\n\n return (\n <div className={rootClassName} style={style}>\n {toolbar === 'top' && <Toolbar />}\n\n <div className=\"rdv-content\">\n {initError && (\n <div className=\"rdv-message rdv-message--error\">\n <p>Failed to initialize: {initError.message}</p>\n </div>\n )}\n\n {!initError && (isLoading || isConverting) && (\n <div className=\"rdv-message\">\n <div className=\"rdv-spinner\"></div>\n <p>\n {isLoading && file\n ? 'Loading engine & preparing document...'\n : isLoading\n ? 'Loading document engine...'\n : 'Processing document...'}\n </p>\n </div>\n )}\n\n {!isLoading && !initError && !html && !isConverting && !file && (\n <div className=\"rdv-message\">\n <div className=\"rdv-message__icon\">📄</div>\n <p>{placeholder}</p>\n </div>\n )}\n\n {error && !isConverting && (\n <div className=\"rdv-message rdv-message--error\">\n <p>Error: {error.message}</p>\n </div>\n )}\n\n {html && !isConverting && (\n <div ref={paginatedContainerRef} className=\"rdv-pages\">\n <PaginatedDocument\n html={html}\n scale={settings.paginationScale}\n showPageNumbers={settings.showPageNumbers}\n pageGap={20}\n backgroundColor=\"#525659\"\n className=\"rdv-paginated-document\"\n onPaginationComplete={(result: PaginationResult) => {\n setTotalPages(result.totalPages);\n }}\n onPageVisible={handlePageVisible}\n />\n </div>\n )}\n </div>\n\n {toolbar === 'bottom' && <Toolbar />}\n\n {showSettings && <SettingsModal />}\n </div>\n );\n}\n"],"names":["DEFAULT_SETTINGS","DEFAULT_WASM_PATH","getCommentRenderMode","mode","CommentRenderMode","getAnnotationLabelMode","AnnotationLabelMode","DocumentViewer","controlledFile","controlledHtml","onFileChange","onConversionStart","onConversionComplete","onError","onPageChange","controlledSettings","defaultSettings","onSettingsChange","className","style","toolbar","showSettingsButton","placeholder","wasmBasePath","mergedDefaults","useMemo","internalFile","setInternalFile","useState","internalHtml","setInternalHtml","internalSettings","setInternalSettings","file","html","settings","isReady","isLoading","initError","convertToHtml","useDocxodus","isConverting","setIsConverting","error","setError","fileName","setFileName","currentPage","setCurrentPage","totalPages","setTotalPages","showSettings","setShowSettings","paginatedContainerRef","useRef","getConvertOptions","useCallback","PaginationMode","convert","fileToConvert","resolve","result","err","useEffect","handleFileChange","e","selectedFile","reconvert","handleClear","input","updateSettings","updates","newSettings","handleZoomIn","handleZoomOut","handleZoomChange","value","goToPage","pageNum","container","pageElement","goToPreviousPage","goToNextPage","handlePageVisible","pageNumber","handleAnchorClick","anchor","href","targetId","targetElement","isProcessing","SettingsModal","jsx","jsxs","Toolbar","Fragment","page","rootClassName","PaginatedDocument"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"react-docxodus-viewer.cjs.js","sources":["../node_modules/docxodus/dist/worker-proxy.js","../src/types/index.ts","../src/components/RevisionPanel.tsx","../src/DocumentViewer.tsx"],"sourcesContent":["/**\n * Worker Proxy - Main thread interface for the Docxodus Web Worker\n *\n * This module provides a Promise-based API that mirrors the main API but\n * executes all WASM operations in a Web Worker, keeping the main thread free.\n *\n * @example\n * ```typescript\n * import { createWorkerDocxodus } from 'docxodus/worker';\n *\n * // Create worker instance\n * const docxodus = await createWorkerDocxodus();\n *\n * // Use the same API as the main module, but non-blocking!\n * const html = await docxodus.convertDocxToHtml(docxFile);\n *\n * // Clean up when done\n * docxodus.terminate();\n * ```\n */\n/**\n * Generate a unique request ID.\n */\nfunction generateId() {\n return `${Date.now()}-${Math.random().toString(36).slice(2, 11)}`;\n}\n/**\n * Convert a File or Uint8Array to Uint8Array.\n */\nasync function toBytes(document) {\n if (document instanceof Uint8Array) {\n return document;\n }\n const buffer = await document.arrayBuffer();\n return new Uint8Array(buffer);\n}\n/**\n * Derive the WASM base path from the current module URL.\n */\nfunction deriveWasmBasePath() {\n // Try to get the base path from the current script URL\n if (typeof document !== \"undefined\") {\n // Browser: look for docxodus script tag or use current location\n const scripts = document.querySelectorAll('script[src*=\"docxodus\"]');\n if (scripts.length > 0) {\n const src = scripts[0].src;\n const base = src.substring(0, src.lastIndexOf(\"/\") + 1);\n return base + \"wasm/\";\n }\n }\n // Default fallback\n return \"/wasm/\";\n}\n/**\n * Create a worker-based Docxodus instance.\n *\n * This function spawns a Web Worker that loads the WASM runtime independently.\n * All operations are executed in the worker, keeping the main thread responsive.\n *\n * @param options - Configuration options\n * @returns A Promise that resolves to a WorkerDocxodus instance\n *\n * @example\n * ```typescript\n * // Basic usage\n * const docxodus = await createWorkerDocxodus();\n * const html = await docxodus.convertDocxToHtml(docxFile);\n *\n * // With custom WASM path\n * const docxodus = await createWorkerDocxodus({\n * wasmBasePath: '/assets/wasm/'\n * });\n * ```\n */\nexport async function createWorkerDocxodus(options) {\n // Determine WASM base path\n const wasmBasePath = options?.wasmBasePath ?? deriveWasmBasePath();\n // Determine worker script path\n // The worker bundle should be in the same directory as this module\n let workerUrl;\n // Try to create worker from bundled script or blob\n // For now, we'll use a blob URL to inline the worker path\n const workerScriptPath = new URL(\"./docxodus.worker.js\", import.meta.url)\n .href;\n // Create the worker\n const worker = new Worker(workerScriptPath, { type: \"module\" });\n // Track pending requests\n const pendingRequests = new Map();\n // Track if worker is active\n let isWorkerActive = true;\n // Handle worker messages\n worker.onmessage = (event) => {\n const response = event.data;\n // Handle ready signal\n if (response.type === \"ready\") {\n return;\n }\n // Handle normal responses\n const pending = pendingRequests.get(response.id);\n if (pending) {\n pendingRequests.delete(response.id);\n if (response.success) {\n pending.resolve(response);\n }\n else {\n pending.reject(new Error(response.error || \"Unknown error\"));\n }\n }\n };\n // Handle worker errors\n worker.onerror = (error) => {\n // Reject all pending requests\n for (const pending of pendingRequests.values()) {\n pending.reject(new Error(`Worker error: ${error.message}`));\n }\n pendingRequests.clear();\n isWorkerActive = false;\n };\n /**\n * Send a request to the worker and wait for response.\n */\n function sendRequest(request, transfer) {\n return new Promise((resolve, reject) => {\n if (!isWorkerActive) {\n reject(new Error(\"Worker has been terminated\"));\n return;\n }\n pendingRequests.set(request.id, { resolve, reject });\n if (transfer && transfer.length > 0) {\n worker.postMessage(request, transfer);\n }\n else {\n worker.postMessage(request);\n }\n });\n }\n // Initialize the worker\n const initResponse = await sendRequest({\n id: generateId(),\n type: \"init\",\n wasmBasePath,\n });\n if (!initResponse.success) {\n worker.terminate();\n throw new Error(`Failed to initialize worker: ${initResponse.error}`);\n }\n // Return the WorkerDocxodus instance\n return {\n async convertDocxToHtml(document, options) {\n const bytes = await toBytes(document);\n const response = await sendRequest({\n id: generateId(),\n type: \"convertDocxToHtml\",\n documentBytes: bytes,\n options,\n }, [bytes.buffer]);\n return response.html;\n },\n async compareDocuments(original, modified, options) {\n const originalBytes = await toBytes(original);\n const modifiedBytes = await toBytes(modified);\n const response = await sendRequest({\n id: generateId(),\n type: \"compareDocuments\",\n originalBytes,\n modifiedBytes,\n options,\n }, [originalBytes.buffer, modifiedBytes.buffer]);\n return response.documentBytes;\n },\n async compareDocumentsToHtml(original, modified, options) {\n const originalBytes = await toBytes(original);\n const modifiedBytes = await toBytes(modified);\n const response = await sendRequest({\n id: generateId(),\n type: \"compareDocumentsToHtml\",\n originalBytes,\n modifiedBytes,\n options,\n }, [originalBytes.buffer, modifiedBytes.buffer]);\n return response.html;\n },\n async getRevisions(document, options) {\n const bytes = await toBytes(document);\n const response = await sendRequest({\n id: generateId(),\n type: \"getRevisions\",\n documentBytes: bytes,\n options,\n }, [bytes.buffer]);\n return response.revisions;\n },\n async getDocumentMetadata(document) {\n const bytes = await toBytes(document);\n const response = await sendRequest({\n id: generateId(),\n type: \"getDocumentMetadata\",\n documentBytes: bytes,\n }, [bytes.buffer]);\n return response.metadata;\n },\n async getVersion() {\n const response = await sendRequest({\n id: generateId(),\n type: \"getVersion\",\n });\n return response.version;\n },\n terminate() {\n isWorkerActive = false;\n worker.terminate();\n // Reject any pending requests\n for (const pending of pendingRequests.values()) {\n pending.reject(new Error(\"Worker terminated\"));\n }\n pendingRequests.clear();\n },\n isActive() {\n return isWorkerActive;\n },\n };\n}\n/**\n * Check if Web Workers are supported in the current environment.\n */\nexport function isWorkerSupported() {\n return typeof Worker !== \"undefined\";\n}\n//# sourceMappingURL=worker-proxy.js.map","/**\n * react-docxodus-viewer types\n */\n\nexport type CommentMode = 'disabled' | 'endnote' | 'inline' | 'margin';\nexport type AnnotationMode = 'disabled' | 'above' | 'inline' | 'tooltip' | 'none';\nexport type ViewMode = 'document' | 'revisions';\n\nexport interface ViewerSettings {\n /** Zoom scale (0.3 - 2.0) */\n paginationScale: number;\n /** Show page numbers on pages */\n showPageNumbers: boolean;\n /** Render footnotes and endnotes */\n renderFootnotesAndEndnotes: boolean;\n /** Render headers and footers */\n renderHeadersAndFooters: boolean;\n /** Comment rendering mode */\n commentMode: CommentMode;\n /** Annotation rendering mode */\n annotationMode: AnnotationMode;\n /** Show tracked changes */\n renderTrackedChanges: boolean;\n /** Show deleted content in tracked changes */\n showDeletedContent: boolean;\n /** Distinguish move operations in tracked changes */\n renderMoveOperations: boolean;\n /** Page title for converted HTML */\n pageTitle: string;\n /** CSS class prefix for generated elements */\n cssPrefix: string;\n /** Generate CSS classes for styling */\n fabricateClasses: boolean;\n /** Additional CSS to inject */\n additionalCss: string;\n /** CSS class prefix for comments */\n commentCssClassPrefix: string;\n /** CSS class prefix for annotations */\n annotationCssClassPrefix: string;\n}\n\nexport interface DocumentViewerProps {\n /** File to display (controlled mode) */\n file?: File | null;\n /** Pre-converted HTML content (skip conversion) */\n html?: string | null;\n\n /** Callback when file changes */\n onFileChange?: (file: File | null) => void;\n /** Callback when conversion starts */\n onConversionStart?: () => void;\n /** Callback when conversion completes successfully */\n onConversionComplete?: (html: string) => void;\n /** Callback when an error occurs */\n onError?: (error: Error) => void;\n /** Callback when visible page changes */\n onPageChange?: (page: number, total: number) => void;\n /** Callback when revisions are extracted from document */\n onRevisionsExtracted?: (revisions: import('docxodus').Revision[]) => void;\n\n /** Initial/controlled viewer settings */\n settings?: Partial<ViewerSettings>;\n /** Default settings (used for uncontrolled mode) */\n defaultSettings?: Partial<ViewerSettings>;\n /** Callback when settings change */\n onSettingsChange?: (settings: ViewerSettings) => void;\n\n /** Additional CSS class for the root element */\n className?: string;\n /** Inline styles for the root element */\n style?: React.CSSProperties;\n /** Toolbar position */\n toolbar?: 'top' | 'bottom' | 'none';\n /** Show settings button in toolbar */\n showSettingsButton?: boolean;\n /** Show revisions tab when document has tracked changes */\n showRevisionsTab?: boolean;\n /** Placeholder text when no document is loaded */\n placeholder?: string;\n\n /**\n * Base path for WASM files.\n * Leave undefined for auto-detection (recommended for most setups).\n * Only specify if hosting WASM files at a custom location.\n */\n wasmBasePath?: string;\n /**\n * Use Web Worker for document conversion (keeps UI responsive).\n * Recommended for large documents. Default: false\n */\n useWorker?: boolean;\n}\n\nexport const DEFAULT_SETTINGS: ViewerSettings = {\n paginationScale: 0.8,\n showPageNumbers: true,\n renderFootnotesAndEndnotes: true,\n renderHeadersAndFooters: true,\n commentMode: 'disabled',\n annotationMode: 'disabled',\n renderTrackedChanges: false,\n showDeletedContent: true,\n renderMoveOperations: true,\n pageTitle: 'Document',\n cssPrefix: 'docx-',\n fabricateClasses: true,\n additionalCss: '',\n commentCssClassPrefix: 'comment-',\n annotationCssClassPrefix: 'annot-',\n};\n","import { useState, useMemo } from 'react';\nimport type { Revision } from 'docxodus/react';\nimport { isInsertion, isDeletion, isMove, isFormatChange } from 'docxodus';\n\ninterface RevisionPanelProps {\n revisions: Revision[];\n}\n\ntype FilterType = 'all' | 'insertions' | 'deletions' | 'moves' | 'formatting';\n\nfunction getRevisionTypeLabel(revision: Revision): string {\n if (isInsertion(revision)) return 'Inserted';\n if (isDeletion(revision)) return 'Deleted';\n if (isMove(revision)) return revision.isMoveSource ? 'Moved from' : 'Moved to';\n if (isFormatChange(revision)) return 'Formatted';\n return String(revision.revisionType);\n}\n\nfunction getRevisionTypeClass(revision: Revision): string {\n if (isInsertion(revision)) return 'rdv-revision--insertion';\n if (isDeletion(revision)) return 'rdv-revision--deletion';\n if (isMove(revision)) return 'rdv-revision--move';\n if (isFormatChange(revision)) return 'rdv-revision--format';\n return '';\n}\n\nfunction formatDate(isoDate: string): string {\n try {\n const date = new Date(isoDate);\n return date.toLocaleDateString(undefined, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n });\n } catch {\n return isoDate;\n }\n}\n\nfunction truncateText(text: string, maxLength: number = 100): string {\n if (text.length <= maxLength) return text;\n return text.substring(0, maxLength) + '...';\n}\n\nexport function RevisionPanel({ revisions }: RevisionPanelProps) {\n const [filter, setFilter] = useState<FilterType>('all');\n const [expandedIds, setExpandedIds] = useState<Set<number>>(new Set());\n\n const filteredRevisions = useMemo(() => {\n if (filter === 'all') return revisions;\n return revisions.filter((rev) => {\n switch (filter) {\n case 'insertions': return isInsertion(rev);\n case 'deletions': return isDeletion(rev);\n case 'moves': return isMove(rev);\n case 'formatting': return isFormatChange(rev);\n default: return true;\n }\n });\n }, [revisions, filter]);\n\n const stats = useMemo(() => ({\n total: revisions.length,\n insertions: revisions.filter(isInsertion).length,\n deletions: revisions.filter(isDeletion).length,\n moves: revisions.filter(isMove).length,\n formatting: revisions.filter(isFormatChange).length,\n }), [revisions]);\n\n const toggleExpanded = (index: number) => {\n setExpandedIds((prev) => {\n const next = new Set(prev);\n if (next.has(index)) {\n next.delete(index);\n } else {\n next.add(index);\n }\n return next;\n });\n };\n\n if (revisions.length === 0) {\n return (\n <div className=\"rdv-revision-panel\">\n <div className=\"rdv-revision-empty\">\n <div className=\"rdv-revision-empty__icon\">📝</div>\n <p>No tracked changes found in this document.</p>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"rdv-revision-panel\">\n <div className=\"rdv-revision-header\">\n <div className=\"rdv-revision-stats\">\n <span className=\"rdv-revision-stat rdv-revision-stat--total\">\n {stats.total} changes\n </span>\n {stats.insertions > 0 && (\n <span className=\"rdv-revision-stat rdv-revision-stat--insertion\">\n +{stats.insertions}\n </span>\n )}\n {stats.deletions > 0 && (\n <span className=\"rdv-revision-stat rdv-revision-stat--deletion\">\n −{stats.deletions}\n </span>\n )}\n {stats.moves > 0 && (\n <span className=\"rdv-revision-stat rdv-revision-stat--move\">\n ↔{stats.moves}\n </span>\n )}\n {stats.formatting > 0 && (\n <span className=\"rdv-revision-stat rdv-revision-stat--format\">\n ✎{stats.formatting}\n </span>\n )}\n </div>\n <select\n className=\"rdv-revision-filter\"\n value={filter}\n onChange={(e) => setFilter(e.target.value as FilterType)}\n >\n <option value=\"all\">All Changes</option>\n <option value=\"insertions\">Insertions ({stats.insertions})</option>\n <option value=\"deletions\">Deletions ({stats.deletions})</option>\n <option value=\"moves\">Moves ({stats.moves})</option>\n <option value=\"formatting\">Formatting ({stats.formatting})</option>\n </select>\n </div>\n\n <div className=\"rdv-revision-list\">\n {filteredRevisions.map((revision, index) => {\n const isExpanded = expandedIds.has(index);\n const needsTruncation = revision.text.length > 100;\n\n return (\n <div\n key={index}\n className={`rdv-revision-item ${getRevisionTypeClass(revision)}`}\n >\n <div className=\"rdv-revision-item__header\">\n <span className=\"rdv-revision-type\">\n {getRevisionTypeLabel(revision)}\n </span>\n <span className=\"rdv-revision-author\">{revision.author}</span>\n <span className=\"rdv-revision-date\">{formatDate(revision.date)}</span>\n </div>\n <div className=\"rdv-revision-item__content\">\n <span className=\"rdv-revision-text\">\n {isExpanded ? revision.text : truncateText(revision.text)}\n </span>\n {needsTruncation && (\n <button\n className=\"rdv-revision-expand\"\n onClick={() => toggleExpanded(index)}\n >\n {isExpanded ? 'Show less' : 'Show more'}\n </button>\n )}\n </div>\n {isFormatChange(revision) && revision.formatChange && (\n <div className=\"rdv-revision-item__format-details\">\n {revision.formatChange.oldProperties && Object.entries(revision.formatChange.oldProperties).map(([key, value]) => (\n <span key={`old-${key}`}>{key}: {value} → </span>\n ))}\n {revision.formatChange.newProperties && Object.entries(revision.formatChange.newProperties).map(([key, value]) => (\n <span key={`new-${key}`}>{key}: {value}</span>\n ))}\n </div>\n )}\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n","import { useState, useCallback, useRef, useEffect, useMemo } from 'react';\nimport { useDocxodus, PaginatedDocument } from 'docxodus/react';\nimport type { PaginationResult, Revision } from 'docxodus/react';\nimport { CommentRenderMode, PaginationMode, AnnotationLabelMode } from 'docxodus';\nimport { createWorkerDocxodus, isWorkerSupported } from 'docxodus/worker';\nimport type { WorkerDocxodus } from 'docxodus/worker';\nimport type {\n DocumentViewerProps,\n ViewerSettings,\n CommentMode,\n AnnotationMode,\n ViewMode,\n} from './types';\nimport { DEFAULT_SETTINGS } from './types';\nimport { RevisionPanel } from './components/RevisionPanel';\n\nfunction getCommentRenderMode(mode: CommentMode): CommentRenderMode {\n switch (mode) {\n case 'endnote': return CommentRenderMode.EndnoteStyle;\n case 'inline': return CommentRenderMode.Inline;\n case 'margin': return CommentRenderMode.Margin;\n default: return CommentRenderMode.Disabled;\n }\n}\n\nfunction getAnnotationLabelMode(mode: AnnotationMode): AnnotationLabelMode | undefined {\n switch (mode) {\n case 'above': return AnnotationLabelMode.Above;\n case 'inline': return AnnotationLabelMode.Inline;\n case 'tooltip': return AnnotationLabelMode.Tooltip;\n case 'none': return AnnotationLabelMode.None;\n default: return undefined;\n }\n}\n\nexport function DocumentViewer({\n file: controlledFile,\n html: controlledHtml,\n onFileChange,\n onConversionStart,\n onConversionComplete,\n onError,\n onPageChange,\n onRevisionsExtracted,\n settings: controlledSettings,\n defaultSettings,\n onSettingsChange,\n className,\n style,\n toolbar = 'top',\n showSettingsButton = true,\n showRevisionsTab = true,\n placeholder = 'Open a DOCX file to view',\n wasmBasePath,\n useWorker = false,\n}: DocumentViewerProps) {\n // Merge default settings\n const mergedDefaults = useMemo(\n () => ({ ...DEFAULT_SETTINGS, ...defaultSettings }),\n [defaultSettings]\n );\n\n // Internal state (uncontrolled mode)\n const [internalFile, setInternalFile] = useState<File | null>(null);\n const [internalHtml, setInternalHtml] = useState<string | null>(null);\n const [internalSettings, setInternalSettings] = useState<ViewerSettings>(mergedDefaults);\n\n // Determine which values to use (controlled vs uncontrolled)\n const file = controlledFile !== undefined ? controlledFile : internalFile;\n const html = controlledHtml !== undefined ? controlledHtml : internalHtml;\n const settings = useMemo(\n () => controlledSettings\n ? { ...mergedDefaults, ...controlledSettings }\n : internalSettings,\n [controlledSettings, mergedDefaults, internalSettings]\n );\n\n // Docxodus hook (used when not in worker mode)\n const hookResult = useDocxodus(wasmBasePath);\n\n // Worker instance state (used when useWorker=true)\n const [worker, setWorker] = useState<WorkerDocxodus | null>(null);\n const [workerReady, setWorkerReady] = useState(false);\n const [workerLoading, setWorkerLoading] = useState(false);\n const [workerError, setWorkerError] = useState<Error | null>(null);\n\n // Create/destroy worker based on useWorker prop\n const workerRef = useRef<WorkerDocxodus | null>(null);\n\n useEffect(() => {\n if (!useWorker || !isWorkerSupported()) {\n return;\n }\n\n let cancelled = false;\n setWorkerLoading(true);\n setWorkerError(null);\n\n createWorkerDocxodus({ wasmBasePath })\n .then((workerInstance) => {\n if (!cancelled) {\n workerRef.current = workerInstance;\n setWorker(workerInstance);\n setWorkerReady(true);\n setWorkerLoading(false);\n } else {\n workerInstance.terminate();\n }\n })\n .catch((err) => {\n if (!cancelled) {\n setWorkerError(err instanceof Error ? err : new Error(String(err)));\n setWorkerLoading(false);\n }\n });\n\n return () => {\n cancelled = true;\n if (workerRef.current) {\n workerRef.current.terminate();\n workerRef.current = null;\n setWorker(null);\n setWorkerReady(false);\n }\n };\n }, [useWorker, wasmBasePath]);\n\n // Unified ready/loading/error state\n const isReady = useWorker ? workerReady : hookResult.isReady;\n const isLoading = useWorker ? workerLoading : hookResult.isLoading;\n const initError = useWorker ? workerError : hookResult.error;\n\n // Local UI state\n const [isConverting, setIsConverting] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [fileName, setFileName] = useState<string>('');\n const [currentPage, setCurrentPage] = useState(1);\n const [totalPages, setTotalPages] = useState(0);\n const [showSettings, setShowSettings] = useState(false);\n const [viewMode, setViewMode] = useState<ViewMode>('document');\n const [revisions, setRevisions] = useState<Revision[]>([]);\n const [isExtractingRevisions, setIsExtractingRevisions] = useState(false);\n\n const paginatedContainerRef = useRef<HTMLDivElement>(null);\n\n // Build conversion options from settings\n const getConvertOptions = useCallback(() => ({\n commentRenderMode: getCommentRenderMode(settings.commentMode),\n pageTitle: settings.pageTitle,\n cssPrefix: settings.cssPrefix,\n fabricateClasses: settings.fabricateClasses,\n additionalCss: settings.additionalCss || undefined,\n commentCssClassPrefix: settings.commentCssClassPrefix,\n paginationMode: PaginationMode.Paginated,\n paginationScale: settings.paginationScale,\n renderAnnotations: settings.annotationMode !== 'disabled',\n annotationLabelMode: getAnnotationLabelMode(settings.annotationMode),\n annotationCssClassPrefix: settings.annotationCssClassPrefix,\n renderFootnotesAndEndnotes: settings.renderFootnotesAndEndnotes,\n renderHeadersAndFooters: settings.renderHeadersAndFooters,\n renderTrackedChanges: settings.renderTrackedChanges,\n showDeletedContent: settings.showDeletedContent,\n renderMoveOperations: settings.renderMoveOperations,\n }), [settings]);\n\n // Extract revisions from document\n const extractRevisions = useCallback(async (fileToExtract: File) => {\n if (!isReady || !showRevisionsTab) return;\n\n setIsExtractingRevisions(true);\n try {\n const extractedRevisions = useWorker && worker\n ? await worker.getRevisions(fileToExtract)\n : await hookResult.getRevisions(fileToExtract);\n setRevisions(extractedRevisions);\n onRevisionsExtracted?.(extractedRevisions);\n } catch {\n // Revision extraction is non-critical, silently fail\n setRevisions([]);\n } finally {\n setIsExtractingRevisions(false);\n }\n }, [isReady, useWorker, worker, hookResult, showRevisionsTab, onRevisionsExtracted]);\n\n // Convert file to HTML\n const convert = useCallback(async (fileToConvert: File) => {\n if (!isReady) return;\n\n setIsConverting(true);\n setError(null);\n setRevisions([]);\n setViewMode('document');\n onConversionStart?.();\n\n // Allow React to render loading state before heavy WASM work (only needed for non-worker mode)\n if (!useWorker) {\n await new Promise(resolve => requestAnimationFrame(() => requestAnimationFrame(resolve)));\n }\n\n try {\n const result = useWorker && worker\n ? await worker.convertDocxToHtml(fileToConvert, getConvertOptions())\n : await hookResult.convertToHtml(fileToConvert, getConvertOptions());\n\n if (controlledHtml === undefined) {\n setInternalHtml(result);\n }\n onConversionComplete?.(result);\n\n // Extract revisions in background after conversion\n extractRevisions(fileToConvert);\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n onError?.(error);\n } finally {\n setIsConverting(false);\n }\n }, [isReady, useWorker, worker, hookResult, getConvertOptions, controlledHtml, onConversionStart, onConversionComplete, onError, extractRevisions]);\n\n // Auto-convert when WASM ready and file available\n useEffect(() => {\n if (isReady && file && !html && !isConverting && controlledHtml === undefined) {\n convert(file);\n }\n }, [isReady, file, html, isConverting, convert, controlledHtml]);\n\n // Handle file input change\n const handleFileChange = async (e: React.ChangeEvent<HTMLInputElement>) => {\n const selectedFile = e.target.files?.[0];\n if (selectedFile) {\n setFileName(selectedFile.name);\n setError(null);\n setCurrentPage(1);\n setTotalPages(0);\n\n if (controlledFile === undefined) {\n setInternalFile(selectedFile);\n setInternalHtml(null);\n }\n onFileChange?.(selectedFile);\n\n if (isReady && controlledHtml === undefined) {\n await convert(selectedFile);\n }\n }\n };\n\n // Reconvert with current settings\n const reconvert = useCallback(async () => {\n if (file) {\n if (controlledHtml === undefined) {\n setInternalHtml(null);\n }\n await convert(file);\n }\n }, [file, convert, controlledHtml]);\n\n // Clear document\n const handleClear = () => {\n if (controlledFile === undefined) {\n setInternalFile(null);\n }\n if (controlledHtml === undefined) {\n setInternalHtml(null);\n }\n setError(null);\n setFileName('');\n setCurrentPage(1);\n setTotalPages(0);\n setRevisions([]);\n setViewMode('document');\n onFileChange?.(null);\n\n const input = document.getElementById('rdv-file-input') as HTMLInputElement;\n if (input) input.value = '';\n };\n\n // Update settings\n const updateSettings = useCallback((updates: Partial<ViewerSettings>) => {\n const newSettings = { ...settings, ...updates };\n if (controlledSettings === undefined) {\n setInternalSettings(newSettings);\n }\n onSettingsChange?.(newSettings);\n }, [settings, controlledSettings, onSettingsChange]);\n\n // Zoom controls\n const handleZoomIn = () => updateSettings({\n paginationScale: Math.min(settings.paginationScale + 0.1, 2.0)\n });\n const handleZoomOut = () => updateSettings({\n paginationScale: Math.max(settings.paginationScale - 0.1, 0.3)\n });\n const handleZoomChange = (value: number) => updateSettings({\n paginationScale: Math.max(0.3, Math.min(2.0, value))\n });\n\n // Page navigation\n const goToPage = (pageNum: number) => {\n const container = paginatedContainerRef.current;\n if (!container || pageNum < 1 || pageNum > totalPages) return;\n const pageElement = container.querySelector(`[data-page-number=\"${pageNum}\"]`);\n if (pageElement) {\n pageElement.scrollIntoView({ behavior: 'smooth', block: 'start' });\n }\n };\n\n const goToPreviousPage = () => currentPage > 1 && goToPage(currentPage - 1);\n const goToNextPage = () => currentPage < totalPages && goToPage(currentPage + 1);\n\n // Handle page visibility changes\n const handlePageVisible = (pageNumber: number) => {\n setCurrentPage(pageNumber);\n onPageChange?.(pageNumber, totalPages);\n };\n\n // Handle footnote/anchor clicks\n useEffect(() => {\n const container = paginatedContainerRef.current;\n if (!container) return;\n\n const handleAnchorClick = (e: MouseEvent) => {\n const target = e.target as HTMLElement;\n const anchor = target.closest('a[href^=\"#\"]') as HTMLAnchorElement | null;\n if (!anchor) return;\n\n const href = anchor.getAttribute('href');\n if (!href || !href.startsWith('#')) return;\n\n e.preventDefault();\n const targetId = href.substring(1);\n const targetElement = container.querySelector(`[id=\"${targetId}\"], [name=\"${targetId}\"]`);\n\n if (targetElement) {\n targetElement.scrollIntoView({ behavior: 'smooth', block: 'center' });\n targetElement.classList.add('rdv-footnote-highlight');\n setTimeout(() => targetElement.classList.remove('rdv-footnote-highlight'), 2000);\n }\n };\n\n container.addEventListener('click', handleAnchorClick);\n return () => container.removeEventListener('click', handleAnchorClick);\n }, [html]);\n\n // Notify parent of page changes when totalPages updates\n useEffect(() => {\n if (totalPages > 0) {\n onPageChange?.(currentPage, totalPages);\n }\n }, [totalPages, currentPage, onPageChange]);\n\n const isProcessing = isConverting || isLoading;\n\n // Settings Modal\n const SettingsModal = () => (\n <div className=\"rdv-settings-overlay\" onClick={() => setShowSettings(false)}>\n <div className=\"rdv-settings-modal\" onClick={(e) => e.stopPropagation()}>\n <div className=\"rdv-settings-header\">\n <h3>Viewer Settings</h3>\n <button className=\"rdv-settings-close\" onClick={() => setShowSettings(false)}>×</button>\n </div>\n <div className=\"rdv-settings-body\">\n <div className=\"rdv-settings-section\">\n <h4>Display Options</h4>\n <label className=\"rdv-settings-checkbox\">\n <input\n type=\"checkbox\"\n checked={settings.renderFootnotesAndEndnotes}\n onChange={(e) => updateSettings({ renderFootnotesAndEndnotes: e.target.checked })}\n />\n <span>Show footnotes and endnotes</span>\n </label>\n <label className=\"rdv-settings-checkbox\">\n <input\n type=\"checkbox\"\n checked={settings.renderHeadersAndFooters}\n onChange={(e) => updateSettings({ renderHeadersAndFooters: e.target.checked })}\n />\n <span>Show headers and footers</span>\n </label>\n <label className=\"rdv-settings-checkbox\">\n <input\n type=\"checkbox\"\n checked={settings.showPageNumbers}\n onChange={(e) => updateSettings({ showPageNumbers: e.target.checked })}\n />\n <span>Show page numbers</span>\n </label>\n </div>\n\n <div className=\"rdv-settings-section\">\n <h4>Comment Rendering</h4>\n <div className=\"rdv-settings-radio-group\">\n {(['disabled', 'endnote', 'inline', 'margin'] as CommentMode[]).map((mode) => (\n <label key={mode} className=\"rdv-settings-radio\">\n <input\n type=\"radio\"\n name=\"commentMode\"\n checked={settings.commentMode === mode}\n onChange={() => updateSettings({ commentMode: mode })}\n />\n <span>{mode.charAt(0).toUpperCase() + mode.slice(1)}{mode === 'endnote' ? 's' : ''}</span>\n </label>\n ))}\n </div>\n </div>\n\n <div className=\"rdv-settings-section\">\n <h4>Annotation Rendering</h4>\n <div className=\"rdv-settings-radio-group\">\n {(['disabled', 'above', 'inline', 'tooltip', 'none'] as AnnotationMode[]).map((mode) => (\n <label key={mode} className=\"rdv-settings-radio\">\n <input\n type=\"radio\"\n name=\"annotationMode\"\n checked={settings.annotationMode === mode}\n onChange={() => updateSettings({ annotationMode: mode })}\n />\n <span>{mode === 'none' ? 'Highlight Only' : mode.charAt(0).toUpperCase() + mode.slice(1)}</span>\n </label>\n ))}\n </div>\n </div>\n\n <div className=\"rdv-settings-section\">\n <h4>Tracked Changes</h4>\n <label className=\"rdv-settings-checkbox\">\n <input\n type=\"checkbox\"\n checked={settings.renderTrackedChanges}\n onChange={(e) => updateSettings({ renderTrackedChanges: e.target.checked })}\n />\n <span>Show tracked changes</span>\n </label>\n {settings.renderTrackedChanges && (\n <div className=\"rdv-settings-subsection\">\n <label className=\"rdv-settings-checkbox\">\n <input\n type=\"checkbox\"\n checked={settings.showDeletedContent}\n onChange={(e) => updateSettings({ showDeletedContent: e.target.checked })}\n />\n <span>Show deleted content</span>\n </label>\n <label className=\"rdv-settings-checkbox\">\n <input\n type=\"checkbox\"\n checked={settings.renderMoveOperations}\n onChange={(e) => updateSettings({ renderMoveOperations: e.target.checked })}\n />\n <span>Distinguish move operations</span>\n </label>\n </div>\n )}\n </div>\n </div>\n <div className=\"rdv-settings-footer\">\n <button className=\"rdv-settings-apply\" onClick={() => { reconvert(); setShowSettings(false); }}>\n Apply & Close\n </button>\n </div>\n </div>\n </div>\n );\n\n const hasRevisions = revisions.length > 0;\n\n // Toolbar component\n const Toolbar = () => (\n <div className=\"rdv-toolbar\">\n <div className=\"rdv-toolbar-left\">\n <label htmlFor=\"rdv-file-input\" className=\"rdv-toolbar-file-btn\">\n {fileName || 'Open Document'}\n </label>\n <input\n id=\"rdv-file-input\"\n type=\"file\"\n accept=\".docx\"\n onChange={handleFileChange}\n disabled={isProcessing}\n className=\"rdv-file-input\"\n />\n {fileName && (\n <button className=\"rdv-toolbar-btn rdv-toolbar-clear\" onClick={handleClear} disabled={isProcessing}>\n ×\n </button>\n )}\n {showRevisionsTab && hasRevisions && (\n <>\n <div className=\"rdv-toolbar-separator\" />\n <div className=\"rdv-view-tabs\">\n <button\n className={`rdv-view-tab ${viewMode === 'document' ? 'rdv-view-tab--active' : ''}`}\n onClick={() => setViewMode('document')}\n title=\"View Document\"\n >\n Document\n </button>\n <button\n className={`rdv-view-tab ${viewMode === 'revisions' ? 'rdv-view-tab--active' : ''}`}\n onClick={() => setViewMode('revisions')}\n title=\"View Tracked Changes\"\n >\n Changes ({revisions.length})\n </button>\n </div>\n </>\n )}\n {showRevisionsTab && isExtractingRevisions && (\n <span className=\"rdv-extracting-indicator\" title=\"Extracting tracked changes...\">\n ...\n </span>\n )}\n </div>\n\n <div className=\"rdv-toolbar-center\">\n {html && totalPages > 0 && viewMode === 'document' && (\n <>\n <button\n className=\"rdv-toolbar-btn\"\n onClick={goToPreviousPage}\n disabled={currentPage <= 1}\n title=\"Previous Page\"\n >\n ◀\n </button>\n <div className=\"rdv-page-input-group\">\n <input\n type=\"number\"\n className=\"rdv-page-input\"\n value={currentPage}\n min={1}\n max={totalPages}\n onChange={(e) => {\n const page = parseInt(e.target.value);\n if (!isNaN(page)) goToPage(page);\n }}\n />\n <span className=\"rdv-page-total\">/ {totalPages}</span>\n </div>\n <button\n className=\"rdv-toolbar-btn\"\n onClick={goToNextPage}\n disabled={currentPage >= totalPages}\n title=\"Next Page\"\n >\n ▶\n </button>\n\n <div className=\"rdv-toolbar-separator\" />\n\n <button\n className=\"rdv-toolbar-btn\"\n onClick={handleZoomOut}\n disabled={settings.paginationScale <= 0.3}\n title=\"Zoom Out\"\n >\n −\n </button>\n <select\n className=\"rdv-zoom-select\"\n value={settings.paginationScale}\n onChange={(e) => handleZoomChange(parseFloat(e.target.value))}\n >\n <option value=\"0.5\">50%</option>\n <option value=\"0.75\">75%</option>\n <option value=\"0.8\">80%</option>\n <option value=\"0.9\">90%</option>\n <option value=\"1\">100%</option>\n <option value=\"1.25\">125%</option>\n <option value=\"1.5\">150%</option>\n <option value=\"2\">200%</option>\n </select>\n <button\n className=\"rdv-toolbar-btn\"\n onClick={handleZoomIn}\n disabled={settings.paginationScale >= 2.0}\n title=\"Zoom In\"\n >\n +\n </button>\n </>\n )}\n </div>\n\n <div className=\"rdv-toolbar-right\">\n {showSettingsButton && (\n <button\n className=\"rdv-toolbar-btn rdv-toolbar-settings\"\n onClick={() => setShowSettings(true)}\n title=\"Settings\"\n >\n ⚙\n </button>\n )}\n </div>\n </div>\n );\n\n const rootClassName = ['rdv-viewer', className].filter(Boolean).join(' ');\n\n return (\n <div className={rootClassName} style={style}>\n {toolbar === 'top' && <Toolbar />}\n\n <div className=\"rdv-content\">\n {initError && (\n <div className=\"rdv-message rdv-message--error\">\n <p>Failed to initialize: {initError.message}</p>\n </div>\n )}\n\n {!initError && (isLoading || isConverting) && (\n <div className=\"rdv-message\">\n <div className=\"rdv-spinner\"></div>\n <p>\n {isLoading && file\n ? 'Loading engine & preparing document...'\n : isLoading\n ? 'Loading document engine...'\n : 'Processing document...'}\n </p>\n </div>\n )}\n\n {!isLoading && !initError && !html && !isConverting && !file && (\n <div className=\"rdv-message\">\n <div className=\"rdv-message__icon\">📄</div>\n <p>{placeholder}</p>\n </div>\n )}\n\n {error && !isConverting && (\n <div className=\"rdv-message rdv-message--error\">\n <p>Error: {error.message}</p>\n </div>\n )}\n\n {html && !isConverting && viewMode === 'document' && (\n <div ref={paginatedContainerRef} className=\"rdv-pages\">\n <PaginatedDocument\n html={html}\n scale={settings.paginationScale}\n showPageNumbers={settings.showPageNumbers}\n pageGap={20}\n backgroundColor=\"#525659\"\n className=\"rdv-paginated-document\"\n onPaginationComplete={(result: PaginationResult) => {\n setTotalPages(result.totalPages);\n }}\n onPageVisible={handlePageVisible}\n />\n </div>\n )}\n\n {html && !isConverting && viewMode === 'revisions' && (\n <RevisionPanel revisions={revisions} />\n )}\n </div>\n\n {toolbar === 'bottom' && <Toolbar />}\n\n {showSettings && <SettingsModal />}\n </div>\n );\n}\n"],"names":["generateId","toBytes","document","buffer","deriveWasmBasePath","scripts","src","createWorkerDocxodus","options","wasmBasePath","workerScriptPath","_documentCurrentScript","worker","pendingRequests","isWorkerActive","event","response","pending","error","sendRequest","request","transfer","resolve","reject","initResponse","bytes","original","modified","originalBytes","modifiedBytes","isWorkerSupported","DEFAULT_SETTINGS","getRevisionTypeLabel","revision","isInsertion","isDeletion","isMove","isFormatChange","getRevisionTypeClass","formatDate","isoDate","truncateText","text","maxLength","RevisionPanel","revisions","filter","setFilter","useState","expandedIds","setExpandedIds","filteredRevisions","useMemo","rev","stats","toggleExpanded","index","prev","next","jsxs","jsx","e","isExpanded","needsTruncation","key","value","getCommentRenderMode","mode","CommentRenderMode","getAnnotationLabelMode","AnnotationLabelMode","DocumentViewer","controlledFile","controlledHtml","onFileChange","onConversionStart","onConversionComplete","onError","onPageChange","onRevisionsExtracted","controlledSettings","defaultSettings","onSettingsChange","className","style","toolbar","showSettingsButton","showRevisionsTab","placeholder","useWorker","mergedDefaults","internalFile","setInternalFile","internalHtml","setInternalHtml","internalSettings","setInternalSettings","file","html","settings","hookResult","useDocxodus","setWorker","workerReady","setWorkerReady","workerLoading","setWorkerLoading","workerError","setWorkerError","workerRef","useRef","useEffect","cancelled","workerInstance","err","isReady","isLoading","initError","isConverting","setIsConverting","setError","fileName","setFileName","currentPage","setCurrentPage","totalPages","setTotalPages","showSettings","setShowSettings","viewMode","setViewMode","setRevisions","isExtractingRevisions","setIsExtractingRevisions","paginatedContainerRef","getConvertOptions","useCallback","PaginationMode","extractRevisions","fileToExtract","extractedRevisions","convert","fileToConvert","result","handleFileChange","selectedFile","reconvert","handleClear","input","updateSettings","updates","newSettings","handleZoomIn","handleZoomOut","handleZoomChange","goToPage","pageNum","container","pageElement","goToPreviousPage","goToNextPage","handlePageVisible","pageNumber","handleAnchorClick","anchor","href","targetId","targetElement","isProcessing","SettingsModal","hasRevisions","Toolbar","Fragment","page","rootClassName","PaginatedDocument"],"mappings":"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","x_google_ignoreList":[0]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
.rdv-viewer{--rdv-border-radius: 8px;--rdv-background: #525659;--rdv-min-height: 500px;--rdv-shadow: 0 4px 20px rgba(0, 0, 0, .15);--rdv-toolbar-bg: #323639;--rdv-toolbar-border: #1a1a1a;--rdv-toolbar-height: auto;--rdv-toolbar-padding: .5rem 1rem;--rdv-btn-bg: #474c50;--rdv-btn-bg-hover: #5a6066;--rdv-btn-color: #d4d4d4;--rdv-btn-radius: 4px;--rdv-btn-disabled-opacity: .4;--rdv-input-bg: #474c50;--rdv-input-color: #d4d4d4;--rdv-input-muted: #9ca3af;--rdv-separator-color: #555;--rdv-message-color: #9ca3af;--rdv-error-color: #ef4444;--rdv-highlight-color: #fef08a;--rdv-modal-overlay: rgba(0, 0, 0, .6);--rdv-modal-bg: white;--rdv-modal-radius: 12px;--rdv-modal-shadow: 0 20px 60px rgba(0, 0, 0, .3);--rdv-modal-border: #e5e7eb;--rdv-modal-title-color: #1f2937;--rdv-modal-text-color: #4b5563;--rdv-modal-muted-color: #6b7280;--rdv-modal-section-bg: #f3f4f6;--rdv-modal-section-bg-hover: #e5e7eb;--rdv-modal-advanced-bg: #f9fafb;--rdv-modal-input-border: #d1d5db;--rdv-modal-input-focus: #3b82f6;--rdv-modal-btn-bg: #3b82f6;--rdv-modal-btn-bg-hover: #2563eb}.rdv-viewer{display:flex;flex-direction:column;height:100%;min-height:var(--rdv-min-height);border-radius:var(--rdv-border-radius);overflow:hidden;background:var(--rdv-background);box-shadow:var(--rdv-shadow)}.rdv-toolbar{display:flex;align-items:center;justify-content:space-between;padding:var(--rdv-toolbar-padding);background:var(--rdv-toolbar-bg);border-bottom:1px solid var(--rdv-toolbar-border);flex-shrink:0}.rdv-toolbar-left,.rdv-toolbar-center,.rdv-toolbar-right{display:flex;align-items:center;gap:.5rem}.rdv-toolbar-center{flex:1;justify-content:center}.rdv-toolbar-file-btn{background:var(--rdv-btn-bg);color:var(--rdv-btn-color);padding:.5rem 1rem;border-radius:var(--rdv-btn-radius);cursor:pointer;font-size:.85rem;transition:background .2s;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:200px;border:none}.rdv-toolbar-file-btn:hover{background:var(--rdv-btn-bg-hover)}.rdv-toolbar-btn{background:var(--rdv-btn-bg);border:none;color:var(--rdv-btn-color);padding:.4rem .7rem;border-radius:var(--rdv-btn-radius);cursor:pointer;font-size:.9rem;font-weight:700;min-width:32px;transition:background .2s}.rdv-toolbar-btn:hover:not(:disabled){background:var(--rdv-btn-bg-hover)}.rdv-toolbar-btn:disabled{opacity:var(--rdv-btn-disabled-opacity);cursor:not-allowed}.rdv-toolbar-clear{padding:.4rem .6rem;font-size:1rem}.rdv-toolbar-settings{font-size:1.1rem}.rdv-page-input-group{display:flex;align-items:center;gap:.25rem;background:var(--rdv-input-bg);border-radius:var(--rdv-btn-radius);padding:0 .5rem}.rdv-page-input{width:50px;background:transparent;border:none;color:var(--rdv-input-color);text-align:center;font-size:.9rem;padding:.4rem 0;-moz-appearance:textfield}.rdv-page-input::-webkit-outer-spin-button,.rdv-page-input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.rdv-page-input:focus{outline:none}.rdv-page-total{color:var(--rdv-input-muted);font-size:.9rem}.rdv-toolbar-separator{width:1px;height:24px;background:var(--rdv-separator-color);margin:0 .5rem}.rdv-zoom-select{background:var(--rdv-btn-bg);border:none;color:var(--rdv-btn-color);padding:.4rem .5rem;border-radius:var(--rdv-btn-radius);font-size:.9rem;cursor:pointer}.rdv-zoom-select:focus{outline:none}.rdv-file-input{display:none}.rdv-content{flex:1;overflow:hidden;display:flex;flex-direction:column}.rdv-pages{flex:1;overflow:auto}.rdv-paginated-document{min-height:100%}.rdv-message{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;min-height:300px;color:var(--rdv-message-color);text-align:center;padding:2rem}.rdv-message--error{color:var(--rdv-error-color)}.rdv-message__icon{font-size:4rem;margin-bottom:1rem;opacity:.5}.rdv-message p{margin:.5rem 0;font-size:1rem}.rdv-spinner{width:40px;height:40px;border:4px solid rgba(255,255,255,.2);border-top-color:var(--rdv-btn-color);border-radius:50%;animation:rdv-spin 1s linear infinite}@keyframes rdv-spin{to{transform:rotate(360deg)}}.rdv-footnote-highlight{animation:rdv-highlight-pulse 2s ease-out}@keyframes rdv-highlight-pulse{0%{background-color:var(--rdv-highlight-color);box-shadow:0 0 10px var(--rdv-highlight-color)}to{background-color:transparent;box-shadow:none}}.rdv-settings-overlay{position:fixed;inset:0;background:var(--rdv-modal-overlay);display:flex;align-items:center;justify-content:center;z-index:1000;padding:1rem}.rdv-settings-modal{background:var(--rdv-modal-bg);border-radius:var(--rdv-modal-radius);width:100%;max-width:500px;max-height:80vh;display:flex;flex-direction:column;box-shadow:var(--rdv-modal-shadow)}.rdv-settings-header{display:flex;align-items:center;justify-content:space-between;padding:1rem 1.5rem;border-bottom:1px solid var(--rdv-modal-border)}.rdv-settings-header h3{margin:0;font-size:1.25rem;color:var(--rdv-modal-title-color)}.rdv-settings-close{background:none;border:none;font-size:1.5rem;color:var(--rdv-modal-muted-color);cursor:pointer;padding:0;line-height:1}.rdv-settings-close:hover{color:var(--rdv-modal-title-color)}.rdv-settings-body{flex:1;overflow-y:auto;padding:1rem 1.5rem}.rdv-settings-section{margin-bottom:1.5rem}.rdv-settings-section:last-child{margin-bottom:0}.rdv-settings-section h4{margin:0 0 .75rem;font-size:.9rem;font-weight:600;color:#374151;text-transform:uppercase;letter-spacing:.5px}.rdv-settings-checkbox{display:flex;align-items:center;gap:.75rem;padding:.5rem 0;cursor:pointer}.rdv-settings-checkbox input{width:18px;height:18px;cursor:pointer}.rdv-settings-checkbox span{color:var(--rdv-modal-text-color);font-size:.95rem}.rdv-settings-radio-group{display:flex;flex-wrap:wrap;gap:.5rem}.rdv-settings-radio{display:flex;align-items:center;gap:.5rem;padding:.5rem .75rem;background:var(--rdv-modal-section-bg);border-radius:6px;cursor:pointer;transition:background .2s}.rdv-settings-radio:hover{background:var(--rdv-modal-section-bg-hover)}.rdv-settings-radio input{cursor:pointer}.rdv-settings-radio span{font-size:.9rem;color:var(--rdv-modal-text-color)}.rdv-settings-subsection{margin-left:1.5rem;padding-left:1rem;border-left:2px solid var(--rdv-modal-border)}.rdv-settings-toggle-advanced{background:none;border:none;color:var(--rdv-modal-muted-color);font-size:.9rem;cursor:pointer;padding:.5rem 0;display:flex;align-items:center;gap:.5rem}.rdv-settings-toggle-advanced:hover{color:#374151}.rdv-settings-advanced{margin-top:1rem;padding:1rem;background:var(--rdv-modal-advanced-bg);border-radius:8px}.rdv-settings-field{margin-bottom:1rem}.rdv-settings-field:last-child{margin-bottom:0}.rdv-settings-field label{display:block;font-size:.85rem;color:var(--rdv-modal-muted-color);margin-bottom:.25rem}.rdv-settings-field input,.rdv-settings-field textarea{width:100%;padding:.5rem;border:1px solid var(--rdv-modal-input-border);border-radius:6px;font-size:.9rem}.rdv-settings-field input:focus,.rdv-settings-field textarea:focus{outline:none;border-color:var(--rdv-modal-input-focus);box-shadow:0 0 0 2px #3b82f633}.rdv-settings-footer{padding:1rem 1.5rem;border-top:1px solid var(--rdv-modal-border);display:flex;justify-content:flex-end}.rdv-settings-apply{background:var(--rdv-modal-btn-bg);color:#fff;border:none;padding:.75rem 1.5rem;border-radius:6px;font-size:.95rem;font-weight:500;cursor:pointer;transition:background .2s}.rdv-settings-apply:hover{background:var(--rdv-modal-btn-bg-hover)}@media(max-width:768px){.rdv-toolbar{flex-wrap:wrap;gap:.5rem}.rdv-toolbar-center{order:3;flex-basis:100%;justify-content:flex-start}}
|
|
1
|
+
.rdv-viewer{--rdv-border-radius: 8px;--rdv-background: #525659;--rdv-min-height: 500px;--rdv-shadow: 0 4px 20px rgba(0, 0, 0, .15);--rdv-toolbar-bg: #323639;--rdv-toolbar-border: #1a1a1a;--rdv-toolbar-height: auto;--rdv-toolbar-padding: .5rem 1rem;--rdv-btn-bg: #474c50;--rdv-btn-bg-hover: #5a6066;--rdv-btn-color: #d4d4d4;--rdv-btn-radius: 4px;--rdv-btn-disabled-opacity: .4;--rdv-input-bg: #474c50;--rdv-input-color: #d4d4d4;--rdv-input-muted: #9ca3af;--rdv-separator-color: #555;--rdv-message-color: #9ca3af;--rdv-error-color: #ef4444;--rdv-highlight-color: #fef08a;--rdv-modal-overlay: rgba(0, 0, 0, .6);--rdv-modal-bg: white;--rdv-modal-radius: 12px;--rdv-modal-shadow: 0 20px 60px rgba(0, 0, 0, .3);--rdv-modal-border: #e5e7eb;--rdv-modal-title-color: #1f2937;--rdv-modal-text-color: #4b5563;--rdv-modal-muted-color: #6b7280;--rdv-modal-section-bg: #f3f4f6;--rdv-modal-section-bg-hover: #e5e7eb;--rdv-modal-advanced-bg: #f9fafb;--rdv-modal-input-border: #d1d5db;--rdv-modal-input-focus: #3b82f6;--rdv-modal-btn-bg: #3b82f6;--rdv-modal-btn-bg-hover: #2563eb}.rdv-viewer{display:flex;flex-direction:column;height:100%;min-height:var(--rdv-min-height);border-radius:var(--rdv-border-radius);overflow:hidden;background:var(--rdv-background);box-shadow:var(--rdv-shadow)}.rdv-toolbar{display:flex;align-items:center;justify-content:space-between;padding:var(--rdv-toolbar-padding);background:var(--rdv-toolbar-bg);border-bottom:1px solid var(--rdv-toolbar-border);flex-shrink:0}.rdv-toolbar-left,.rdv-toolbar-center,.rdv-toolbar-right{display:flex;align-items:center;gap:.5rem}.rdv-toolbar-center{flex:1;justify-content:center}.rdv-toolbar-file-btn{background:var(--rdv-btn-bg);color:var(--rdv-btn-color);padding:.5rem 1rem;border-radius:var(--rdv-btn-radius);cursor:pointer;font-size:.85rem;transition:background .2s;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:200px;border:none}.rdv-toolbar-file-btn:hover{background:var(--rdv-btn-bg-hover)}.rdv-toolbar-btn{background:var(--rdv-btn-bg);border:none;color:var(--rdv-btn-color);padding:.4rem .7rem;border-radius:var(--rdv-btn-radius);cursor:pointer;font-size:.9rem;font-weight:700;min-width:32px;transition:background .2s}.rdv-toolbar-btn:hover:not(:disabled){background:var(--rdv-btn-bg-hover)}.rdv-toolbar-btn:disabled{opacity:var(--rdv-btn-disabled-opacity);cursor:not-allowed}.rdv-toolbar-clear{padding:.4rem .6rem;font-size:1rem}.rdv-toolbar-settings{font-size:1.1rem}.rdv-page-input-group{display:flex;align-items:center;gap:.25rem;background:var(--rdv-input-bg);border-radius:var(--rdv-btn-radius);padding:0 .5rem}.rdv-page-input{width:50px;background:transparent;border:none;color:var(--rdv-input-color);text-align:center;font-size:.9rem;padding:.4rem 0;-moz-appearance:textfield}.rdv-page-input::-webkit-outer-spin-button,.rdv-page-input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.rdv-page-input:focus{outline:none}.rdv-page-total{color:var(--rdv-input-muted);font-size:.9rem}.rdv-toolbar-separator{width:1px;height:24px;background:var(--rdv-separator-color);margin:0 .5rem}.rdv-zoom-select{background:var(--rdv-btn-bg);border:none;color:var(--rdv-btn-color);padding:.4rem .5rem;border-radius:var(--rdv-btn-radius);font-size:.9rem;cursor:pointer}.rdv-zoom-select:focus{outline:none}.rdv-file-input{display:none}.rdv-content{flex:1;overflow:hidden;display:flex;flex-direction:column}.rdv-pages{flex:1;overflow:auto}.rdv-paginated-document{min-height:100%}.rdv-message{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;min-height:300px;color:var(--rdv-message-color);text-align:center;padding:2rem}.rdv-message--error{color:var(--rdv-error-color)}.rdv-message__icon{font-size:4rem;margin-bottom:1rem;opacity:.5}.rdv-message p{margin:.5rem 0;font-size:1rem}.rdv-spinner{width:40px;height:40px;border:4px solid rgba(255,255,255,.2);border-top-color:var(--rdv-btn-color);border-radius:50%;animation:rdv-spin 1s linear infinite}@keyframes rdv-spin{to{transform:rotate(360deg)}}.rdv-footnote-highlight{animation:rdv-highlight-pulse 2s ease-out}@keyframes rdv-highlight-pulse{0%{background-color:var(--rdv-highlight-color);box-shadow:0 0 10px var(--rdv-highlight-color)}to{background-color:transparent;box-shadow:none}}.rdv-settings-overlay{position:fixed;inset:0;background:var(--rdv-modal-overlay);display:flex;align-items:center;justify-content:center;z-index:1000;padding:1rem}.rdv-settings-modal{background:var(--rdv-modal-bg);border-radius:var(--rdv-modal-radius);width:100%;max-width:500px;max-height:80vh;display:flex;flex-direction:column;box-shadow:var(--rdv-modal-shadow)}.rdv-settings-header{display:flex;align-items:center;justify-content:space-between;padding:1rem 1.5rem;border-bottom:1px solid var(--rdv-modal-border)}.rdv-settings-header h3{margin:0;font-size:1.25rem;color:var(--rdv-modal-title-color)}.rdv-settings-close{background:none;border:none;font-size:1.5rem;color:var(--rdv-modal-muted-color);cursor:pointer;padding:0;line-height:1}.rdv-settings-close:hover{color:var(--rdv-modal-title-color)}.rdv-settings-body{flex:1;overflow-y:auto;padding:1rem 1.5rem}.rdv-settings-section{margin-bottom:1.5rem}.rdv-settings-section:last-child{margin-bottom:0}.rdv-settings-section h4{margin:0 0 .75rem;font-size:.9rem;font-weight:600;color:#374151;text-transform:uppercase;letter-spacing:.5px}.rdv-settings-checkbox{display:flex;align-items:center;gap:.75rem;padding:.5rem 0;cursor:pointer}.rdv-settings-checkbox input{width:18px;height:18px;cursor:pointer}.rdv-settings-checkbox span{color:var(--rdv-modal-text-color);font-size:.95rem}.rdv-settings-radio-group{display:flex;flex-wrap:wrap;gap:.5rem}.rdv-settings-radio{display:flex;align-items:center;gap:.5rem;padding:.5rem .75rem;background:var(--rdv-modal-section-bg);border-radius:6px;cursor:pointer;transition:background .2s}.rdv-settings-radio:hover{background:var(--rdv-modal-section-bg-hover)}.rdv-settings-radio input{cursor:pointer}.rdv-settings-radio span{font-size:.9rem;color:var(--rdv-modal-text-color)}.rdv-settings-subsection{margin-left:1.5rem;padding-left:1rem;border-left:2px solid var(--rdv-modal-border)}.rdv-settings-toggle-advanced{background:none;border:none;color:var(--rdv-modal-muted-color);font-size:.9rem;cursor:pointer;padding:.5rem 0;display:flex;align-items:center;gap:.5rem}.rdv-settings-toggle-advanced:hover{color:#374151}.rdv-settings-advanced{margin-top:1rem;padding:1rem;background:var(--rdv-modal-advanced-bg);border-radius:8px}.rdv-settings-field{margin-bottom:1rem}.rdv-settings-field:last-child{margin-bottom:0}.rdv-settings-field label{display:block;font-size:.85rem;color:var(--rdv-modal-muted-color);margin-bottom:.25rem}.rdv-settings-field input,.rdv-settings-field textarea{width:100%;padding:.5rem;border:1px solid var(--rdv-modal-input-border);border-radius:6px;font-size:.9rem}.rdv-settings-field input:focus,.rdv-settings-field textarea:focus{outline:none;border-color:var(--rdv-modal-input-focus);box-shadow:0 0 0 2px #3b82f633}.rdv-settings-footer{padding:1rem 1.5rem;border-top:1px solid var(--rdv-modal-border);display:flex;justify-content:flex-end}.rdv-settings-apply{background:var(--rdv-modal-btn-bg);color:#fff;border:none;padding:.75rem 1.5rem;border-radius:6px;font-size:.95rem;font-weight:500;cursor:pointer;transition:background .2s}.rdv-settings-apply:hover{background:var(--rdv-modal-btn-bg-hover)}.rdv-view-tabs{display:flex;gap:2px;background:#0003;border-radius:var(--rdv-btn-radius);padding:2px}.rdv-view-tab{background:transparent;border:none;color:var(--rdv-btn-color);padding:.35rem .75rem;border-radius:calc(var(--rdv-btn-radius) - 2px);cursor:pointer;font-size:.8rem;font-weight:500;transition:background .2s,color .2s;white-space:nowrap}.rdv-view-tab:hover{background:#ffffff1a}.rdv-view-tab--active{background:var(--rdv-btn-bg);color:var(--rdv-btn-color)}.rdv-view-tab--active:hover{background:var(--rdv-btn-bg-hover)}.rdv-extracting-indicator{color:var(--rdv-input-muted);font-size:.8rem;animation:rdv-pulse 1.5s ease-in-out infinite}@keyframes rdv-pulse{0%,to{opacity:.4}50%{opacity:1}}.rdv-revision-panel{display:flex;flex-direction:column;height:100%;background:var(--rdv-background)}.rdv-revision-header{display:flex;align-items:center;justify-content:space-between;gap:1rem;padding:.75rem 1rem;background:var(--rdv-toolbar-bg);border-bottom:1px solid var(--rdv-toolbar-border);flex-shrink:0}.rdv-revision-stats{display:flex;align-items:center;gap:.75rem;flex-wrap:wrap}.rdv-revision-stat{font-size:.8rem;font-weight:500;padding:.2rem .5rem;border-radius:4px}.rdv-revision-stat--total{color:var(--rdv-btn-color);background:#ffffff1a}.rdv-revision-stat--insertion{color:#22c55e;background:#22c55e26}.rdv-revision-stat--deletion{color:#ef4444;background:#ef444426}.rdv-revision-stat--move{color:#3b82f6;background:#3b82f626}.rdv-revision-stat--format{color:#a855f7;background:#a855f726}.rdv-revision-filter{background:var(--rdv-btn-bg);border:none;color:var(--rdv-btn-color);padding:.4rem .75rem;border-radius:var(--rdv-btn-radius);font-size:.85rem;cursor:pointer}.rdv-revision-filter:focus{outline:none}.rdv-revision-list{flex:1;overflow-y:auto;padding:.75rem;display:flex;flex-direction:column;gap:.5rem}.rdv-revision-item{background:#f8fafc;border-radius:8px;padding:.75rem;border-left:3px solid #94a3b8}.rdv-revision-item.rdv-revision--insertion{border-left-color:#22c55e;background:linear-gradient(to right,#22c55e14,#f8fafc 50%)}.rdv-revision-item.rdv-revision--deletion{border-left-color:#ef4444;background:linear-gradient(to right,#ef444414,#f8fafc 50%)}.rdv-revision-item.rdv-revision--move{border-left-color:#3b82f6;background:linear-gradient(to right,#3b82f614,#f8fafc 50%)}.rdv-revision-item.rdv-revision--format{border-left-color:#a855f7;background:linear-gradient(to right,#a855f714,#f8fafc 50%)}.rdv-revision-item__header{display:flex;align-items:center;gap:.75rem;margin-bottom:.5rem;flex-wrap:wrap}.rdv-revision-type{font-size:.75rem;font-weight:600;text-transform:uppercase;letter-spacing:.3px;padding:.15rem .5rem;border-radius:4px;background:#0000000f;color:#475569}.rdv-revision--insertion .rdv-revision-type{background:#22c55e26;color:#15803d}.rdv-revision--deletion .rdv-revision-type{background:#ef444426;color:#dc2626}.rdv-revision--move .rdv-revision-type{background:#3b82f626;color:#2563eb}.rdv-revision--format .rdv-revision-type{background:#a855f726;color:#9333ea}.rdv-revision-author{font-size:.85rem;font-weight:500;color:#334155}.rdv-revision-date{font-size:.75rem;color:#64748b;margin-left:auto}.rdv-revision-item__content{display:flex;flex-direction:column;gap:.25rem}.rdv-revision-text{font-size:.9rem;color:#1e293b;line-height:1.5;word-break:break-word}.rdv-revision--deletion .rdv-revision-text{text-decoration:line-through;color:#94a3b8}.rdv-revision-expand{background:none;border:none;color:#3b82f6;font-size:.8rem;cursor:pointer;padding:0;margin-top:.25rem;align-self:flex-start}.rdv-revision-expand:hover{text-decoration:underline}.rdv-revision-item__format-details{display:flex;flex-wrap:wrap;gap:.5rem;margin-top:.5rem;padding-top:.5rem;border-top:1px dashed #e2e8f0}.rdv-revision-item__format-details span{font-size:.75rem;color:#64748b;background:#f1f5f9;padding:.15rem .5rem;border-radius:4px}.rdv-revision-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;min-height:300px;color:var(--rdv-message-color);text-align:center;padding:2rem}.rdv-revision-empty__icon{font-size:4rem;margin-bottom:1rem;opacity:.5}.rdv-revision-empty p{margin:.5rem 0;font-size:1rem;color:#64748b}@media(max-width:768px){.rdv-toolbar{flex-wrap:wrap;gap:.5rem}.rdv-toolbar-center{order:3;flex-basis:100%;justify-content:flex-start}.rdv-revision-header{flex-direction:column;align-items:flex-start}.rdv-revision-filter{width:100%}}
|