@1agh/maude 1.4.6 → 1.5.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.
Files changed (100) hide show
  1. package/apps/studio/annotations/ai-read.ts +288 -0
  2. package/apps/studio/annotations/ai-write.ts +534 -0
  3. package/apps/studio/annotations/board-io.ts +94 -0
  4. package/apps/studio/annotations/board-text.ts +45 -0
  5. package/apps/studio/annotations/constants.ts +58 -0
  6. package/apps/studio/annotations/elements/_shared.ts +125 -0
  7. package/apps/studio/annotations/elements/arrow.model.ts +196 -0
  8. package/apps/studio/annotations/elements/media.model.ts +79 -0
  9. package/apps/studio/annotations/elements/pen.model.ts +82 -0
  10. package/apps/studio/annotations/elements/section.model.ts +70 -0
  11. package/apps/studio/annotations/elements/shape.model.ts +141 -0
  12. package/apps/studio/annotations/elements/sticky.model.ts +48 -0
  13. package/apps/studio/annotations/elements/text.model.ts +52 -0
  14. package/apps/studio/annotations/fields.ts +347 -0
  15. package/apps/studio/annotations/fractional-index.ts +234 -0
  16. package/apps/studio/annotations/legacy/mini-dom.ts +207 -0
  17. package/apps/studio/annotations/migrate-boot.ts +172 -0
  18. package/apps/studio/annotations/migrate-cli.ts +37 -0
  19. package/apps/studio/annotations/migrate-v1.ts +383 -0
  20. package/apps/studio/annotations/ops-merge.ts +15 -0
  21. package/apps/studio/annotations/ops.ts +499 -0
  22. package/apps/studio/annotations/registry.ts +159 -0
  23. package/apps/studio/annotations/replica.ts +264 -0
  24. package/apps/studio/annotations/scene.ts +235 -0
  25. package/apps/studio/annotations/schema.ts +188 -0
  26. package/apps/studio/annotations/types.ts +77 -0
  27. package/apps/studio/annotations/ui/board.ts +126 -0
  28. package/apps/studio/annotations/ui/containment.ts +118 -0
  29. package/apps/studio/annotations/ui/edit-actions.ts +551 -0
  30. package/apps/studio/annotations/ui/editor-channel.ts +62 -0
  31. package/apps/studio/annotations/ui/element-node.tsx +993 -0
  32. package/apps/studio/annotations/ui/pipeline-context.ts +17 -0
  33. package/apps/studio/annotations/ui/pointer-pipeline.ts +150 -0
  34. package/apps/studio/annotations/ui/render-model.ts +264 -0
  35. package/apps/studio/annotations/ui/scene.tsx +63 -0
  36. package/apps/studio/annotations/ui/text-editor.tsx +420 -0
  37. package/apps/studio/annotations/ui/text-session.ts +140 -0
  38. package/apps/studio/annotations/ui/text-style.ts +111 -0
  39. package/apps/studio/annotations/ui/world.ts +47 -0
  40. package/apps/studio/annotations/v1-adapter.ts +428 -0
  41. package/apps/studio/annotations-align.ts +21 -6
  42. package/apps/studio/annotations-bindings.ts +2 -0
  43. package/apps/studio/annotations-context-toolbar.tsx +9 -13
  44. package/apps/studio/annotations-groups.ts +3 -0
  45. package/apps/studio/annotations-layer.tsx +923 -1925
  46. package/apps/studio/annotations-model.ts +65 -4
  47. package/apps/studio/annotations-sync.ts +4 -47
  48. package/apps/studio/api.ts +249 -69
  49. package/apps/studio/bin/_import-figma.mjs +22 -12
  50. package/apps/studio/bin/annotate.mjs +331 -838
  51. package/apps/studio/bin/annotate.sh +4 -4
  52. package/apps/studio/bin/perf.sh +21 -7
  53. package/apps/studio/bin/read-annotations.mjs +184 -666
  54. package/apps/studio/bin/read-annotations.sh +9 -5
  55. package/apps/studio/canvas-artifacts.ts +9 -0
  56. package/apps/studio/canvas-lib.tsx +13 -1
  57. package/apps/studio/canvas-shell.tsx +6 -0
  58. package/apps/studio/client/app.jsx +98 -35
  59. package/apps/studio/client/hmr.mjs +1 -1
  60. package/apps/studio/client/panels/git-grouping.js +2 -2
  61. package/apps/studio/client/tree-expansion.js +217 -0
  62. package/apps/studio/collab/index.ts +49 -5
  63. package/apps/studio/collab/persistence.ts +31 -10
  64. package/apps/studio/collab/registry.ts +64 -26
  65. package/apps/studio/commands/annotation-ops-command.ts +72 -0
  66. package/apps/studio/cursors-overlay.tsx +158 -4
  67. package/apps/studio/dist/client.bundle.js +850 -850
  68. package/apps/studio/dist/comment-mount.js +2 -2
  69. package/apps/studio/figma/to-strokes.ts +31 -10
  70. package/apps/studio/git/endpoints.ts +1 -1
  71. package/apps/studio/git/service.ts +1 -1
  72. package/apps/studio/git/watch.ts +1 -1
  73. package/apps/studio/http.ts +90 -15
  74. package/apps/studio/server.ts +16 -0
  75. package/apps/studio/sync/accepted-cold-start.ts +12 -4
  76. package/apps/studio/sync/agent.ts +8 -4
  77. package/apps/studio/sync/codec.ts +96 -40
  78. package/apps/studio/sync/file-membership.ts +12 -2
  79. package/apps/studio/sync/file-plane.ts +1 -1
  80. package/apps/studio/sync/index.ts +38 -16
  81. package/apps/studio/sync/journal-client.ts +5 -0
  82. package/apps/studio/sync/limits.ts +7 -2
  83. package/apps/studio/sync/migrate-seed.ts +8 -5
  84. package/apps/studio/sync/projection.ts +7 -2
  85. package/apps/studio/sync/remote-docs.ts +34 -0
  86. package/apps/studio/sync/writer-registry.ts +10 -0
  87. package/apps/studio/text-caret.ts +11 -2
  88. package/apps/studio/tree-state.ts +45 -0
  89. package/apps/studio/undo-stack.ts +2 -2
  90. package/apps/studio/use-annotation-resize.tsx +48 -23
  91. package/apps/studio/use-annotation-selection.tsx +9 -2
  92. package/apps/studio/use-collab.tsx +76 -0
  93. package/apps/studio/whats-new.json +27 -0
  94. package/cli/lib/design-link.mjs +5 -1
  95. package/cli/lib/gitignore-block.mjs +1 -1
  96. package/cli/lib/gitignore-drift.mjs +2 -1
  97. package/package.json +9 -8
  98. package/plugins/design/templates/brief-board.tsx.template +1 -1
  99. package/apps/studio/annotation-edit-base.ts +0 -36
  100. package/apps/studio/commands/annotation-strokes-command.ts +0 -137
@@ -1,4 +1,4 @@
1
- import{Component as aQ,createElement as h7,useCallback as R7,useEffect as p,useMemo as sQ,useRef as u,useState as Z7}from"react";import{createRoot as tQ}from"react-dom/client";var RJ=/^[A-Za-z0-9_-]{1,64}$/;function o(J){return typeof J==="string"&&RJ.test(J)}function m7(J){if(!J||typeof J!=="object")return!1;let{x:Q,y:$}=J;return typeof Q==="number"&&typeof $==="number"&&Number.isFinite(Q)&&Number.isFinite($)&&Math.abs(Q)<=1e7&&Math.abs($)<=1e7}function d7(){if(typeof window>"u"||typeof document>"u")return null;let J=window.__maudeViewport?.()??null;if(!J||!(J.zoom>0))return null;let Q=document.querySelector(".dc-canvas");if(!Q)return null;let $=Q.getBoundingClientRect();return{vp:J,left:$.left,top:$.top}}function c7(J,Q){let $=d7();if(!$)return null;let{vp:V}=$;return{x:(J-$.left-V.x)/V.zoom,y:(Q-$.top-V.y)/V.zoom}}function i7(J){let Q=d7();if(!Q)return null;let{vp:$}=Q;return{x:Q.left+$.x+J.x*$.zoom,y:Q.top+$.y+J.y*$.zoom}}function G7(J){if(typeof document>"u"||!o(J))return null;return document.querySelector(`[data-id="${J}"][data-tool]`)}function l7(J,Q){if(typeof document>"u")return null;let $=null;for(let V of Array.from(document.querySelectorAll("[data-id][data-tool]"))){if(V.getAttribute("data-tool")==="section")continue;let Z=V.getAttribute("data-id");if(!o(Z))continue;let G=V.getBoundingClientRect();if(G.width<=0&&G.height<=0)continue;if(J<G.left||J>G.right||Q<G.top||Q>G.bottom)continue;let W=Math.max(1,G.width)*Math.max(1,G.height);if(!$||W<=$.area)$={id:Z,area:W}}return $?.id??null}import{useCallback as b,useEffect as R,useMemo as t,useRef as g,useState as h}from"react";function L7(){if(typeof window>"u")return;try{let J=window.location.pathname;if(J==="/_canvas-shell.html"||J==="/_canvas-shell"){let Q=new URLSearchParams(window.location.search),$=Q.get("canvas")??"",V=(Q.get("designRel")??".design").replace(/^\/+|\/+$/g,"");return $?`${V}/${$}`:void 0}return decodeURIComponent(J).replace(/^\//,"")}catch{return}}function B7(J){if(!J)return"";return(J.getAttribute("class")??"").trim().split(/\s+/).filter((Q)=>Q&&!Q.startsWith("dgn-")&&!Q.startsWith("dc-cv-")).join(" ")}function gJ(J,Q){if(!J)return"";let $=(J.innerText||J.textContent||"").replace(/\s+/g," ").trim();return $.length>Q?`${$.slice(0,Q-1)}…`:$}function hJ(J){if(!J)return"";let Q=[],$=J;while($&&$.nodeType===1&&Q.length<8){let V=$.getAttribute?.("data-dc-element");if(V){Q.unshift(`[data-dc-element="${V}"]`);break}let Z=$.getAttribute?.("data-dc-screen");if(Z){Q.unshift(`[data-dc-screen="${Z}"]`);break}let G=$.nodeName.toLowerCase();if($.id){G=`#${$.id}`,Q.unshift(G);break}let W=B7($).split(/\s+/).filter(Boolean).slice(0,2);if(W.length)G+=`.${W.join(".")}`;let K=1,H=$.previousElementSibling;while(H)K++,H=H.previousElementSibling;G+=`:nth-child(${K})`,Q.unshift(G),$=$.parentElement}return Q.join(" > ")}function n7(J){let Q=[],$=J;while($&&$.nodeType===1&&Q.length<8){let V=$.nodeName.toLowerCase(),Z=$.getAttribute?.("data-dc-element"),G=$.getAttribute?.("data-dc-screen");if(Z)V+=`[data-dc-element="${Z}"]`;else if(G)V+=`[data-dc-screen="${G}"]`;else if($.id)V+=`#${$.id}`;let W=B7($).split(/\s+/).filter(Boolean).slice(0,2);if(W.length&&!Z&&!G)V+=`.${W.join(".")}`;Q.unshift(V),$=$.parentElement}return Q}function fJ(J){return J.replace(/[^a-zA-Z0-9_-]/g,(Q)=>`\\${Q}`)}function o7(J,Q){return Q?`[data-dc-screen="${Q}"] [data-cd-id="${J}"]`:`[data-cd-id="${J}"]`}function a7(J,Q,$){if(!$)return 0;try{let V=J.querySelectorAll(Q);for(let Z=0;Z<V.length;Z++)if(V[Z]===$)return Z}catch{}return 0}function s7(J,Q,$){if(!Q||!$)return 0;return a7(J,`[data-cd-id="${fJ(Q)}"]`,$)}function D7(J,Q){let $=(V)=>{try{let Z=J.querySelectorAll(V);if(!Z.length)return null;let G=Q.index&&Q.index>0&&Q.index<Z.length?Q.index:0;return Z[G]??Z[0]}catch{return null}};if(Q.id){let V=$(o7(Q.id,Q.artboardId));if(V)return V}if(Q.selector)return $(Q.selector);return null}function pJ(J,Q){let $=0,V=Math.min(J.length,Q.length);for(let Z=1;Z<=V;Z++){if(J[J.length-Z]!==Q[Q.length-Z])break;$++}return $}function t7(J,Q){let $=Q.dom_path,V=(Q.tag||"").toLowerCase();if(!$||$.length===0||!V)return null;let Z=J;if(Q.artboardId){let H=J.querySelector(`[data-dc-screen="${Q.artboardId}"]`);if(H)Z=H}let G=(Q.classes||"").split(/\s+/).filter(Boolean),W=null,K=0;for(let H of Array.from(Z.querySelectorAll("[data-cd-id]"))){if(H.tagName.toLowerCase()!==V)continue;let j=pJ(n7(H),$);if(j===0)continue;let N=B7(H).split(/\s+/).filter(Boolean),X=G.filter((Y)=>N.includes(Y)).length,z=j*10+X;if(z>K)K=z,W=H}return W}var r7=["display","flex-direction","flex-wrap","align-items","justify-content","gap","flex","flex-grow","flex-shrink","flex-basis","align-self","font-family","color","font-size","font-weight","line-height","letter-spacing","text-align","margin","margin-top","margin-right","margin-bottom","margin-left","padding","padding-top","padding-right","padding-bottom","padding-left","width","height","min-width","min-height","max-width","max-height","background-color","border-radius","border-top-left-radius","border-top-right-radius","border-bottom-left-radius","border-bottom-right-radius","border-width","border-style","border-color","box-shadow","opacity","position","top","right","bottom","left","z-index","transform","transform-origin","font-style","text-transform","text-decoration","white-space","overflow","object-fit","aspect-ratio","object-position"],uJ=/^(style|class|data-cd-id|data-dc-|data-dcid$)/;function mJ(J){if(!J||typeof window>"u"||!window.getComputedStyle)return{authored:{},computed:{},customStyles:{},attrs:{}};try{let Q=J.style,$=window.getComputedStyle(J),V={},Z={},G=new Set(r7);for(let z of r7){let Y=Q.getPropertyValue(z);if(Y)V[z]=Y.trim();let U=$.getPropertyValue(z);if(U)Z[z]=U.trim()}let W=/^(margin|padding|border)(-|$)/,K={};for(let z=0;z<Q.length;z++){let Y=Q.item(z);if(!Y||G.has(Y)||W.test(Y))continue;let U=Q.getPropertyValue(Y);if(U)K[Y]=U.trim()}let H={};for(let z of Array.from(J.attributes)){if(uJ.test(z.name))continue;H[z.name]=z.value}if(J.hasAttribute("data-dc-screen")){for(let z of Array.from(J.attributes))if(z.name.startsWith("data-dc-")&&z.name!=="data-dcid")H[z.name]=z.value}let j=J.parentElement,N=j?window.getComputedStyle(j).display:"",X=j&&(N==="flex"||N==="inline-flex")?window.getComputedStyle(j).flexDirection:"";return{authored:V,computed:Z,customStyles:K,attrs:H,parentDisplay:N,parentFlexDirection:X}}catch{return{authored:{},computed:{},customStyles:{},attrs:{}}}}function M7(J,Q){let $=J.el,V=$&&$.getBoundingClientRect?$.getBoundingClientRect():null,Z=J.cdId,G=Z?o7(Z,J.artboardId):J.artboardId?`[data-dc-screen="${J.artboardId}"]`:hJ($),W=Z&&typeof document<"u"?a7(document,G,$):0;return{file:Q??L7(),id:Z??void 0,selector:G,artboardId:J.artboardId,index:W,tag:$?.tagName.toLowerCase()??"",classes:B7($),text:gJ($,240),dom_path:n7($),bounds:V?{x:Math.round(V.left),y:Math.round(V.top),w:Math.round(V.width),h:Math.round(V.height)}:null,worldW:$ instanceof HTMLElement?Math.round($.offsetWidth):void 0,worldH:$ instanceof HTMLElement?Math.round($.offsetHeight):void 0,html:$?($.outerHTML??"").slice(0,4000):"",...(()=>{if($?.tagName?.toLowerCase()!=="img")return{};let K=/assets\/[0-9a-f]{8}\.[a-z0-9]+/i,H=$.getAttribute?.("data-photo-asset");if(H&&K.test(H))return{photoKind:"artboard-img",photoAsset:H};let j=$.getAttribute?.("src")||"",N=K.exec(j);return N?{photoKind:"artboard-img",photoAsset:N[0]}:{}})(),...mJ($)}}var W7=null;function a(){if(typeof window>"u")return!1;if(W7===null)try{W7=new URLSearchParams(window.location.search).get("ro")==="1"}catch{W7=!1}return W7}import*as j7 from"lib0/decoding";import*as s from"lib0/encoding";import{createContext as iJ,useCallback as D0,useContext as lJ,useEffect as M0,useMemo as j0,useReducer as N0,useRef as _0,useState as A0}from"react";import{Awareness as O0,applyAwarenessUpdate as k0,encodeAwarenessUpdate as E0}from"y-protocols/awareness";import{readSyncMessage as w0,writeSyncStep1 as b0,writeUpdate as x0}from"y-protocols/sync";import*as rJ from"yjs";import*as dJ from"yjs";var cJ=new WeakSet;function e7(J){return cJ.add(J),J}var H0=e7(Object.freeze({maudeOrigin:"shell-edit"})),X0=e7(Object.freeze({maudeOrigin:"sync-agent"}));import{jsx as v0}from"react/jsx-runtime";var nJ=iJ(null);function JJ(){return lJ(nJ)}import{createContext as oJ,useCallback as l,useContext as _7,useEffect as aJ,useMemo as sJ,useRef as QJ,useState as tJ}from"react";import{jsx as N7,Fragment as QQ}from"react/jsx-runtime";var K7=oJ(null);function r(J){return J.id?`id:${J.id}`:`sel:${J.selector}`}function $J(J){let Q=[],$=new Set;for(let V of J){let Z=r(V);if($.has(Z))continue;$.add(Z),Q.push(V)}return Q}var eJ=50;function JQ({children:J,postTarget:Q}){let[$,V]=tJ([]),Z=QJ(null),G=QJ(null),W=l((Y)=>{if(Z.current)clearTimeout(Z.current);G.current=()=>{Z.current=null,G.current=null;let U=Q??(typeof window<"u"?window.parent:null);if(!U)return;let D=Y.length===0?null:Y.length===1?Y[0]??null:Y;try{U.postMessage({dgn:"select-set",selection:D},"*")}catch{}},Z.current=setTimeout(()=>G.current?.(),eJ)},[Q]);aJ(()=>()=>{if(Z.current)clearTimeout(Z.current);G.current?.()},[]);let K=l((Y)=>{let U=$J(Array.isArray(Y)?Y:[Y]);V(U),W(U)},[W]),H=l((Y)=>{let U=Array.isArray(Y)?Y:[Y];V((D)=>{let A=$J([...D,...U]);return W(A),A})},[W]),j=l((Y)=>{let U=r(Y);V((D)=>{let A=D.filter((q)=>r(q)!==U);return W(A),A})},[W]),N=l((Y)=>{let U=r(Y);V((D)=>{let A=D.some((q)=>r(q)===U)?D.filter((q)=>r(q)!==U):[...D,Y];return W(A),A})},[W]),X=l(()=>{V([]),W([])},[W]),z=sJ(()=>({selected:$,replace:K,add:H,remove:j,toggle:N,clear:X}),[$,K,H,j,N,X]);return N7(K7.Provider,{value:z,children:J})}function VJ({children:J}){if(_7(K7))return N7(QQ,{children:J});return N7(JQ,{children:J})}function z7(){let J=_7(K7);if(!J)throw Error("useSelectionSet must be used inside <SelectionSetProvider>");return J}function ZJ(){return _7(K7)}import{jsx as T,jsxs as x,Fragment as DQ}from"react/jsx-runtime";var $Q="/_client/comments-overlay.css";function VQ(){if(typeof document>"u")return;if(document.getElementById("cm-overlay-css"))return;let J=document.createElement("link");J.id="cm-overlay-css",J.rel="stylesheet",J.href=$Q,document.head.appendChild(J)}function ZQ(){if(typeof window>"u")return null;try{let J=window.location.pathname;if(J==="/_canvas-shell.html"||J==="/_canvas-shell"){let Q=new URLSearchParams(window.location.search),$=Q.get("canvas")??"",V=(Q.get("designRel")??".design").replace(/^\/+|\/+$/g,"");return $?`${V}/${$}`:null}return decodeURIComponent(J).replace(/^\//,"")}catch{return null}}function qQ(J){if(o(J.annotationId))return G7(J.annotationId);if(!J.selector)return null;let Q=null;try{let $=document.querySelectorAll(J.selector),V=J.index&&J.index>0&&J.index<$.length?J.index:0;Q=$[V]??$[0]??null}catch{Q=null}if(Q&&J.tag&&Q.tagName.toLowerCase()!==J.tag.toLowerCase())Q=null;if(!Q&&J.dom_path?.length){let $=J.selector.match(/data-dc-screen="([^"]+)"/)?.[1];Q=t7(document,{artboardId:$,tag:J.tag,classes:J.classes,dom_path:J.dom_path})}return Q}function O7(J){let Q=qQ(J);if(!Q?.isConnected)return null;let $=Q.getBoundingClientRect();if($.width===0&&$.height===0)return null;return{x:$.left,y:$.top,w:$.width,h:$.height}}function KJ(J,Q){let V=typeof window<"u"?window.innerWidth:J.x+Q.w,Z=typeof window<"u"?window.innerHeight:J.y+Q.h,G=J.x;if(G+Q.w+8>V){let K=J.x-Q.w;G=K>=8?K:Math.max(8,V-Q.w-8)}let W=J.y;if(W+Q.h+8>Z){let K=J.y-Q.h;W=K>=8?K:Math.max(8,Z-Q.h-8)}return{x:G,y:W}}function zJ(){VQ();let J=ZJ(),[Q,$]=h([]),[V,Z]=h(null),[G,W]=h(null),K=t(()=>ZQ(),[]);R(()=>{if(typeof document>"u")return;let P=document.getElementById("dgn-pin-layer");if(!P)return;let B=P.style.display;return P.style.display="none",()=>{P.style.display=B}},[]);let H=b((P)=>{if(!J)return;if(!P?.selector){J.clear();return}let B=P.selector.match(/data-cd-id="([^"]+)"/),L=B?B[1]:void 0,O,M;try{let I=document.querySelector(P.selector);if(I)O=I.tagName.toLowerCase(),M=(I.getAttribute("class")??"").split(/\s+/).filter((E)=>E&&!E.startsWith("dgn-")&&!E.startsWith("dc-cv-")).join(" ")}catch{}J.replace({file:K??void 0,id:L,selector:P.selector,tag:O,classes:M,bounds:P.bounds??void 0})},[J,K]),j=g(Q);j.current=Q;let N=JJ(),X=XQ();R(()=>{if(!N)return;let P=N.doc.getArray("comments"),B=()=>{$(P.toArray())};if(P.length>0)B();return P.observe(B),()=>{try{P.unobserve(B)}catch{}}},[N]),R(()=>{if(typeof window>"u")return;let P=(B)=>{let L=B.data;if(!L||typeof L!=="object"||!L.dgn)return;if(L.dgn==="comments-set"&&Array.isArray(L.comments))$(L.comments);else if(L.dgn==="comment-focus"){let O=typeof L.id==="string"?L.id:null;Z(O);let M=O?j.current.find((I)=>I.id===O):void 0;H(M)}};return window.addEventListener("message",P),()=>window.removeEventListener("message",P)},[H]),R(()=>{if(typeof document>"u")return;let P=(B)=>{let L=B.detail;if(!L?.selection)return;W({selection:L.selection,clientX:typeof L.clientX==="number"?L.clientX:0,clientY:typeof L.clientY==="number"?L.clientY:0})};return document.addEventListener("cm:open-composer",P),()=>document.removeEventListener("cm:open-composer",P)},[]);let z=b(()=>{if(W(null),typeof window>"u")return;try{window.parent.postMessage({dgn:"force-clear"},"*")}catch{}},[]),Y=b((P)=>{if(!G)return;let B=G.selection,L={file:B.file,selector:B.selector,index:B.index,dom_path:B.dom_path,tag:B.tag,classes:B.classes,bounds:B.bounds,html_excerpt:B.html,...B.annotationId?{annotationId:B.annotationId}:{},...B.world?{world:B.world}:{},text:P};if(typeof window>"u")return;try{window.parent.postMessage({dgn:"comment-submit",payload:L},"*")}catch{}z()},[G,z]);R(()=>{if(!K)return;let P=!1;return(async()=>{try{let B=await fetch(`/_comments?file=${encodeURIComponent(K)}`);if(!B.ok)return;let L=await B.json();if(P)return;if(Array.isArray(L.comments))$((O)=>O.length===0?L.comments??[]:O)}catch{}})(),()=>{P=!0}},[K]);let U=t(()=>{return Q.slice().sort((B,L)=>B.created.localeCompare(L.created)).filter((B)=>B.status!=="resolved")},[Q]),D=t(()=>{let P=new Map;return Q.slice().sort((L,O)=>L.created.localeCompare(O.created)).forEach((L,O)=>{P.set(L.id,O+1)}),P},[Q]),A=b((P)=>{if(Z(P),H(Q.find((B)=>B.id===P)),typeof window>"u")return;try{window.parent.postMessage({dgn:"comment-click",id:P},"*")}catch{}},[Q,H]),q=b((P,B)=>{if(typeof window>"u")return;try{window.parent.postMessage({dgn:"comment-patch",id:P,patch:B},"*")}catch{}},[]),F=b((P)=>{if(typeof window>"u")return;try{window.parent.postMessage({dgn:"comment-delete",id:P},"*")}catch{}Z((B)=>B===P?null:B)},[]),_=b(async(P,B)=>{if(typeof fetch>"u")return!1;try{let L=await fetch(`/_api/comments/${encodeURIComponent(P)}/reply`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({body:B})});if(!L.ok)return!1;let O=await L.json();return $((M)=>M.map((I)=>I.id===O.id?O:I)),!0}catch{return!1}},[]);return x("div",{className:"cm-layer","aria-hidden":!1,children:[U.map((P)=>{let B=D.get(P.id)??0;return T(UQ,{comment:P,sequence:B,focused:V===P.id,onClick:A},P.id)}),G?T(HQ,{state:G,onSubmit:Y,onCancel:z}):null,(()=>{if(!V)return null;let P=U.find((B)=>B.id===V);if(!P)return null;return T(FQ,{comment:P,sequence:D.get(P.id)??0,onClose:()=>{Z(null),J?.clear()},onPatch:(B)=>q(P.id,B),onDelete:()=>F(P.id),onReply:(B)=>_(P.id,B),mine:!a()&&!!(X??N?.myName)&&(P.author??"").trim()===(X??N?.myName??"").trim()})})()]})}var A7=null;async function GQ(){if(!A7)A7=(async()=>{try{let J=await fetch("/_api/git-committers");if(!J.ok)return[];let Q=await J.json();return Array.isArray(Q.committers)?Q.committers:[]}catch{return[]}})();return A7}function qJ(J){return(J.trim().split(/\s+/)[0]??"").replace(/[^\w.-]/g,"").toLowerCase()}function BQ(J,Q){if(Q<=0||Q>J.length)return null;let $=Q-1;while($>=0){let V=J[$]??"";if(V==="@"){let Z=$>0?J[$-1]:"";if($===0||/\s/.test(Z??"")){let G=J.slice($+1,Q);return{start:$,end:Q,query:G}}return null}if(!/[\w.-]/.test(V))return null;$-=1}return null}function I7({className:J,value:Q,onChange:$,onKeyDown:V,placeholder:Z,rows:G,disabled:W,textareaRef:K,ariaLabel:H}){let j=g(null),N=b((M)=>{if(j.current=M,K)K.current=M},[K]),[X,z]=h([]),[Y,U]=h(null),[D,A]=h(0),q=b(()=>{if(X.length>0)return;GQ().then((M)=>z(M))},[X.length]),F=t(()=>{if(!Y)return[];let M=Y.query.toLowerCase();return(!M?X:X.filter((E)=>E.name.toLowerCase().includes(M)||E.email.toLowerCase().includes(M))).slice(0,8)},[Y,X]),_=b((M)=>{let I=M.selectionStart??M.value.length,E=BQ(M.value,I);U(E),A(0)},[]),P=b((M)=>{$(M.target.value),_(M.target)},[$,_]),B=b((M)=>{if(!Y)return;let I=j.current;if(!I)return;let E=`@${qJ(M.name)}`,k=`${Q.slice(0,Y.start)}${E} ${Q.slice(Y.end)}`;$(k),U(null);let w=Y.start+E.length+1;requestAnimationFrame(()=>{I.focus(),I.setSelectionRange(w,w)})},[Y,Q,$]),L=b((M)=>{if(Y&&F.length>0){if(M.key==="ArrowDown"){M.preventDefault(),A((I)=>(I+1)%F.length);return}if(M.key==="ArrowUp"){M.preventDefault(),A((I)=>(I-1+F.length)%F.length);return}if(M.key==="Enter"||M.key==="Tab"){M.preventDefault();let I=F[D]??F[0];if(I)B(I);return}if(M.key==="Escape"){M.preventDefault(),U(null);return}}V?.(M)},[Y,F,D,B,V]),O=b((M)=>{_(M.currentTarget)},[_]);return x("div",{style:{position:"relative"},children:[T("textarea",{ref:N,className:J,value:Q,placeholder:Z,rows:G,disabled:W,"aria-label":H,onChange:P,onKeyDown:L,onFocus:q,onSelect:O,onClick:O}),Y&&F.length>0?T("ul",{className:"cm-mention-popup",role:"listbox","aria-label":"Mention suggestions",style:{left:0,top:"100%"},children:F.map((M,I)=>{return x("li",{role:"option","aria-selected":I===D,className:"cm-mention-popup__item",onMouseEnter:()=>A(I),onMouseDown:(k)=>{k.preventDefault(),B(M)},children:[x("span",{className:"cm-mention-popup__name",children:["@",qJ(M.name)]}),T("span",{className:"cm-mention-popup__email",children:M.email})]},`${M.name}-${M.email}`)})}):null]})}var WQ=3000;function KQ(J){return{x:J.x-12,y:J.y-12,w:24,h:24}}function zQ(J){let Q=!!J.selector||o(J.annotationId);if(Q){let Z=O7(J);if(Z)return{pos:Z,missing:!1}}let $=m7(J.world)?i7(J.world):null;return{pos:$?KQ($):J.bounds??null,missing:Q}}function UQ({comment:J,sequence:Q,focused:$,onClick:V}){let Z=g(null),G=g(null),W=g(null),[K,H]=h(!1),j=g(!1);R(()=>{let z=()=>{G.current=null;let Y=Z.current;if(!Y)return;let{pos:U,missing:D}=zQ(J),A=!1;if(D){if(W.current==null)W.current=Date.now();A=Date.now()-W.current>WQ}else W.current=null;if(A!==j.current)j.current=A,H(A);if(!U){Y.style.display="none",G.current=requestAnimationFrame(z);return}Y.style.display="grid";let q=Math.round(U.x+U.w-12),F=Math.round(U.y-12);Y.style.left=`${q}px`,Y.style.top=`${F}px`,G.current=requestAnimationFrame(z)};return G.current=requestAnimationFrame(z),()=>{if(G.current!=null)cancelAnimationFrame(G.current)}},[J]);let N=J.author?.trim()||"unknown",X=`Comment ${Q} by ${N}${K?" (detached: its target is gone)":""}`;return T("button",{ref:Z,type:"button",className:"cm-pin","data-resolved":J.status==="resolved"?"true":"false","data-focused":$?"true":"false","data-detached":K?"true":"false","data-comment-pin":J.id,"aria-label":X,"aria-expanded":$,title:J.text.slice(0,200),onClick:(z)=>{z.preventDefault(),z.stopPropagation(),V(J.id)},children:Q})}function HQ({state:J,onSubmit:Q,onCancel:$}){let[V,Z]=h(""),G=g(null),W=g(null),K=g(null);R(()=>{let X=()=>{K.current=null;let z=W.current;if(!z)return;let Y=LQ(J),U=KJ(Y,{w:z.offsetWidth,h:z.offsetHeight});z.style.left=`${Math.round(U.x)}px`,z.style.top=`${Math.round(U.y)}px`,K.current=requestAnimationFrame(X)};return K.current=requestAnimationFrame(X),()=>{if(K.current!=null)cancelAnimationFrame(K.current)}},[J]),R(()=>{G.current?.focus()},[]);let H=b(()=>{let X=V.trim();if(!X)return;Q(X)},[V,Q]),j=b((X)=>{if(X.key==="Escape"){X.preventDefault(),$();return}if((X.metaKey||X.ctrlKey)&&X.key==="Enter")X.preventDefault(),H()},[$,H]),N=t(()=>{let X=J.selection.selector||"";if(!X)return J.selection.tag||(J.selection.annotationId?"annotation":"canvas");let z=X.match(/data-cd-id="([^"]+)"/);if(z)return`cd:${z[1]}`;return X.length>36?`${X.slice(0,33)}…`:X},[J.selection]);return x("div",{ref:W,className:"cm-composer",role:"dialog","aria-label":"New comment",onClick:(X)=>X.stopPropagation(),onPointerDown:(X)=>X.stopPropagation(),children:[x("div",{className:"cm-composer__head",children:[T("span",{children:"New comment"}),T("span",{className:"cm-composer__selector",children:N})]}),T(I7,{textareaRef:G,className:"cm-composer__textarea",value:V,placeholder:"Type a comment. ⌘↵ to save · Esc to cancel · @name to tag",onChange:Z,onKeyDown:j,rows:3,ariaLabel:"Comment body"}),x("div",{className:"cm-composer__actions",children:[T("button",{type:"button",className:"cm-btn",onClick:$,children:"Cancel"}),T("button",{type:"button",className:"cm-btn cm-btn--primary",disabled:!V.trim(),onClick:H,children:"Save"})]})]})}var GJ=null;function XQ(){let[J,Q]=h(null);return R(()=>{if(typeof fetch>"u")return;GJ??=fetch("/_api/git-user").then((V)=>V.ok?V.json():null).then((V)=>typeof V?.name==="string"&&V.name.trim()?V.name.trim():null).catch(()=>null);let $=!0;return GJ.then((V)=>$&&Q(V)),()=>{$=!1}},[]),J}function FQ({comment:J,sequence:Q,onClose:$,onPatch:V,onDelete:Z,onReply:G,mine:W=!1}){let K=g(null),H=g(null),j=g(null),[N,X]=h(""),[z,Y]=h(!1),[U,D]=h(null),A=b(()=>{let B=(U??"").trim();if(!B)return;if(B!==J.text)V({text:B});D(null)},[U,J.text,V]);R(()=>{let B=()=>{j.current=null;let L=K.current;if(!L)return;let O=PQ(J),M=KJ(O,{w:L.offsetWidth,h:L.offsetHeight});L.style.left=`${Math.round(M.x)}px`,L.style.top=`${Math.round(M.y)}px`,j.current=requestAnimationFrame(B)};return j.current=requestAnimationFrame(B),()=>{if(j.current!=null)cancelAnimationFrame(j.current)}},[J]),R(()=>{K.current?.focus();let B=J.id;return()=>{document.querySelector(`[data-comment-pin="${B}"]`)?.focus()}},[J.id]),R(()=>{if(typeof document>"u")return;let B=(L)=>{if(L.key!=="Escape")return;let O=K.current;if(!O)return;if(O.contains(L.target)||document.activeElement===O)L.preventDefault(),$()};return document.addEventListener("keydown",B),()=>document.removeEventListener("keydown",B)},[$]);let q=b(async()=>{let B=N.trim();if(!B||z)return;Y(!0);let L=await G(B);if(Y(!1),L)X(""),H.current?.focus()},[N,z,G]),F=b((B)=>{if((B.metaKey||B.ctrlKey)&&B.key==="Enter")B.preventDefault(),q()},[q]),_=`cm-thread-head-${J.id}`,P=YQ(J.selector,"");return x("div",{ref:K,className:"cm-thread",role:"dialog","aria-labelledby":_,tabIndex:-1,onClick:(B)=>B.stopPropagation(),onPointerDown:(B)=>B.stopPropagation(),children:[x("div",{className:"cm-thread__head",id:_,children:[x("div",{className:"cm-thread__head-row",children:[T("span",{className:"cm-thread__seq","aria-hidden":"true",children:Q}),T("span",{className:"cm-thread__author",children:J.author?.trim()||"unknown"}),T("span",{className:"cm-thread__time",children:WJ(J.created)}),T("button",{type:"button",className:"cm-thread__close","aria-label":"Close thread",title:"Close · Esc",onClick:$,children:"×"})]}),P?T("code",{className:"cm-thread__selector",children:P}):null]}),U===null?T("div",{className:"cm-thread__body",children:BJ(J.text)}):x("div",{className:"cm-thread__reply-form",children:[T(I7,{className:"cm-thread__reply-textarea",value:U,placeholder:"Edit your comment… ⌘↵ to save",onChange:D,onKeyDown:(B)=>{if((B.metaKey||B.ctrlKey)&&B.key==="Enter")B.preventDefault(),A()},rows:3,ariaLabel:"Edit comment"}),x("div",{className:"cm-thread__reply-actions",children:[T("button",{type:"button",className:"cm-btn",onClick:()=>D(null),children:"Cancel"}),T("button",{type:"button",className:"cm-btn cm-btn--primary","data-testid":"comment-edit-save",disabled:!U.trim(),onClick:A,children:"Save"})]})]}),(J.thread??[]).map((B)=>x("div",{className:"cm-thread__reply",children:[x("div",{className:"cm-thread__reply-head",children:[T("span",{className:"cm-thread__reply-author",children:B.author?.trim()||"unknown"}),T("span",{className:"cm-thread__reply-time",children:WJ(B.created)})]}),T("div",{className:"cm-thread__reply-body",children:BJ(B.body)})]},B.id)),!a()&&x(DQ,{children:[x("div",{className:"cm-thread__reply-form",children:[T(I7,{textareaRef:H,className:"cm-thread__reply-textarea",value:N,placeholder:"Reply… ⌘↵ to send · @name to tag",onChange:X,onKeyDown:F,rows:2,ariaLabel:"Reply",disabled:z}),T("div",{className:"cm-thread__reply-actions",children:T("button",{type:"button",className:"cm-btn cm-btn--primary",disabled:!N.trim()||z,onClick:()=>void q(),children:"Send"})})]}),x("div",{className:"cm-thread__actions",children:[W&&U===null?T("button",{type:"button",className:"cm-btn","data-testid":"comment-edit",onClick:()=>D(J.text),children:"Edit"}):null,J.status==="resolved"?T("button",{type:"button",className:"cm-btn",onClick:()=>V({status:"open"}),children:"↺ Reopen"}):T("button",{type:"button",className:"cm-btn cm-btn--primary",onClick:()=>{V({status:"resolved"}),$()},children:"✓ Resolve"}),T("button",{type:"button",className:"cm-btn cm-btn--danger",onClick:()=>{Z(),$()},children:"Delete"})]})]})]})}function BJ(J){if(!J)return null;let Q=/(@[\w][\w.-]*)/g;return J.split(Q).map((V,Z)=>{let G=`${Z}:${V}`;if(Z%2===1)return T("strong",{"data-mention":"true",children:V},G);return T("span",{children:V},G)})}function WJ(J){if(!J)return"";let Q=Date.parse(J);if(!Number.isFinite(Q))return"";let $=Math.round((Date.now()-Q)/1000);if($<60)return`${Math.max($,0)}s ago`;if($<3600)return`${Math.round($/60)}m ago`;if($<86400)return`${Math.round($/3600)}h ago`;return`${Math.round($/86400)}d ago`}function YQ(J,Q){if(!J)return Q;let $=J.match(/data-cd-id="([^"]+)"/);if($)return`cd:${$[1]}`;return J.length>36?`${J.slice(0,33)}…`:J}function PQ(J){let Q=J.selector?O7(J):null;if(Q)return{x:Q.x+Q.w-12,y:Q.y+16};if(J.bounds)return{x:J.bounds.x+J.bounds.w-12,y:J.bounds.y+16};return{x:16,y:16}}function LQ(J){if(J.clientX||J.clientY)return{x:J.clientX,y:J.clientY+8};if(J.selection.selector){let Q=O7(J.selection);if(Q)return{x:Q.x,y:Q.y+Q.h+8}}return{x:16,y:16}}import{useEffect as MQ}from"react";var jQ=new Set(["pen","highlighter","shape","rect","ellipse","arrow","sticky","text","section","eraser"]);function k7(J){return jQ.has(J)}var e=(J)=>!!(J.metaKey||J.ctrlKey);function J7(J){if(J.type==="keydown"){if(J.isEditable)return{kind:"no-op"};if(J.metaKey||J.ctrlKey||J.altKey){if(J.key==="Escape")return{kind:"escape"};let $=(J.key||"").toLowerCase();if(!J.altKey&&(J.metaKey||J.ctrlKey)){if($==="z"&&J.shiftKey)return{kind:"redo"};if($==="z")return{kind:"undo"};if($==="y"&&!J.shiftKey)return{kind:"redo"}}return{kind:"no-op"}}let Q=(J.key||"").toLowerCase();if(Q==="v")return{kind:"tool",tool:"move"};if(Q==="h")return{kind:"tool",tool:"hand"};if(Q==="c")return{kind:"tool",tool:"comment"};if(Q==="b")return{kind:"tool",tool:"pen"};if(Q==="i")return{kind:"tool",tool:"highlighter"};if(Q==="r"||Q==="o")return{kind:"tool",tool:"shape"};if(Q==="a")return{kind:"tool",tool:"arrow"};if(Q==="n")return{kind:"tool",tool:"sticky"};if(Q==="t")return{kind:"tool",tool:"text"};if(Q==="s"&&J.shiftKey)return{kind:"tool",tool:"section"};if(Q==="e")return{kind:"tool",tool:"eraser"};if(J.key==="Escape")return{kind:"escape"};return{kind:"no-op"}}if(J.type==="contextmenu")return{kind:"context-menu",clientX:J.clientX??0,clientY:J.clientY??0};if(J.type==="pointermove"){if(k7(J.activeTool))return{kind:"no-op"};if(J.activeTool==="hand")return{kind:"no-op"};if(J.activeTool==="browse"){if(!e(J))return{kind:"no-op"};return{kind:"hover",deep:!0,clientX:J.clientX??0,clientY:J.clientY??0}}if(J.activeTool==="comment")return{kind:"hover",deep:!0,clientX:J.clientX??0,clientY:J.clientY??0};return{kind:"hover",deep:e(J),clientX:J.clientX??0,clientY:J.clientY??0}}if(J.type==="pointerdown"){if(J.button===2)return{kind:"context-menu",clientX:J.clientX??0,clientY:J.clientY??0};if(J.button===1||J.spaceHeld)return{kind:"no-op"};if(J.button!==0)return{kind:"no-op"};if(k7(J.activeTool)&&!e(J))return{kind:"no-op"};if(J.activeTool==="comment")return{kind:"drop-comment",clientX:J.clientX??0,clientY:J.clientY??0};if(J.activeTool==="hand")return{kind:"no-op"};if(J.activeTool==="browse"){if(!e(J))return{kind:"no-op"};return{kind:"select",mode:J.shiftKey?"add":"replace",deep:!0,clientX:J.clientX??0,clientY:J.clientY??0}}let Q=e(J);return{kind:"select",mode:!!J.shiftKey?"add":"replace",deep:Q,clientX:J.clientX??0,clientY:J.clientY??0}}return{kind:"no-op"}}function U7(J){if(!J||!J.tagName)return!1;let Q=J,$=Q.tagName;if($==="INPUT"||$==="TEXTAREA"||$==="SELECT")return!0;if(Q.isContentEditable)return!0;let V=Q.getAttribute?.("contenteditable");if(V==="true"||V==="plaintext-only"||V==="")return!0;return!1}function Q7(J){if(!J||!J.closest)return!1;let Q=J;if(Q.closest(".dc-world"))return!1;return!!Q.closest(".cm-composer, .cm-thread, .cm-mention-popup, .cm-pin, [data-mediaref-player], .dc-tool-palette, .dc-zoom-tb, .dc-mm, .dc-context-menu")}function HJ(J){if(!J||typeof J.closest!=="function")return!1;let Q=J;return!!Q.closest("[data-dc-screen]")&&!Q.closest(".dc-artboard-body")}function UJ(J,Q,$){return J.kind==="select"&&!$.metaKey&&!$.ctrlKey&&HJ(Q)}function NQ(J,Q,$){return J==="select"&&!$.metaKey&&!$.ctrlKey&&HJ(Q)}function XJ(J){let{hostRef:Q,getActiveTool:$,isSpaceHeld:V,callbacks:Z,enabled:G=!0,claimableActions:W}=J;MQ(()=>{if(!G)return;let K=Q.current;if(!K)return;let H=(q)=>W&&q.kind!=="no-op"&&!W.has(q.kind)?{kind:"no-op"}:q,j=(q)=>{switch(q.kind){case"hover":Z.onHover?.(q);break;case"select":Z.onSelect?.(q);break;case"drop-comment":Z.onDropComment?.(q);break;case"context-menu":Z.onContextMenu?.(q);break;case"tool":Z.onTool?.(q);break;case"escape":Z.onEscape?.();break;case"undo":Z.onUndo?.();break;case"redo":Z.onRedo?.();break;case"no-op":break}},N=(q)=>{let F=H(J7({type:"pointermove",button:q.button,metaKey:q.metaKey,ctrlKey:q.ctrlKey,shiftKey:q.shiftKey,altKey:q.altKey,clientX:q.clientX,clientY:q.clientY,spaceHeld:V?.()??!1,activeTool:$()}));j(F)},X=(q)=>{if(Q7(q.target))return;if(U7(q.target))return;let F=H(J7({type:"pointerdown",button:q.button,metaKey:q.metaKey,ctrlKey:q.ctrlKey,shiftKey:q.shiftKey,altKey:q.altKey,clientX:q.clientX,clientY:q.clientY,spaceHeld:V?.()??!1,activeTool:$()})),_=UJ(F,q.target,q);if(F.kind!=="no-op"){if(q.preventDefault(),!_)q.stopImmediatePropagation()}j(F)},z=(q)=>{if(Q7(q.target))return;if(U7(q.target))return;let F=H(J7({type:"pointerdown",button:q.button,metaKey:q.metaKey,ctrlKey:q.ctrlKey,shiftKey:q.shiftKey,altKey:q.altKey,clientX:q.clientX,clientY:q.clientY,spaceHeld:V?.()??!1,activeTool:$()})),_=UJ(F,q.target,q);if(F.kind!=="no-op"){if(q.preventDefault(),!_)q.stopImmediatePropagation();if(F.kind==="select")try{window.focus()}catch{}}},Y=(q)=>{if(Q7(q.target))return;if(U7(q.target))return;let F=$(),_=q.metaKey||q.ctrlKey,P=F==="comment"?"drop-comment":F==="move"&&q.button===0?"select":(k7(F)||F==="browse")&&_&&q.button===0?"select":q.button===2?"context-menu":null;if(P&&(!W||W.has(P))){let B=NQ(P,q.target,q);if(q.preventDefault(),!B)q.stopImmediatePropagation()}},U=(q)=>{let F=H(J7({type:"contextmenu",clientX:q.clientX,clientY:q.clientY,metaKey:q.metaKey,ctrlKey:q.ctrlKey,shiftKey:q.shiftKey,altKey:q.altKey,activeTool:$()}));if(F.kind==="no-op")return;q.preventDefault(),q.stopImmediatePropagation(),j(F)},D=(q)=>{let F=H(J7({type:"keydown",key:q.key,metaKey:q.metaKey,ctrlKey:q.ctrlKey,shiftKey:q.shiftKey,altKey:q.altKey,isEditable:U7(q.target),activeTool:$()}));if(F.kind==="tool"||F.kind==="escape"||F.kind==="undo"||F.kind==="redo")q.preventDefault();j(F)};K.addEventListener("pointermove",N,{passive:!0}),K.addEventListener("pointerdown",X,{capture:!0}),K.addEventListener("mousedown",z,{capture:!0}),K.addEventListener("click",Y,{capture:!0}),K.addEventListener("contextmenu",U,{capture:!0});let A=K.ownerDocument??document;return A.addEventListener("keydown",D,!0),()=>{K.removeEventListener("pointermove",N),K.removeEventListener("pointerdown",X,{capture:!0}),K.removeEventListener("mousedown",z,{capture:!0}),K.removeEventListener("click",Y,{capture:!0}),K.removeEventListener("contextmenu",U,{capture:!0}),A.removeEventListener("keydown",D,!0)}},[G,Q,$,V,Z,W])}function E7(J,Q,$,V){let Z=J.elementFromPoint(Q,$);if(!Z)return null;if(Z.closest?.(".dc-mm, .dc-zoom-tb, .dc-tool-palette, .dc-context-menu, .dc-cv-group-bbox"))return null;let G=Z.closest?.("[data-dc-screen]")??null,W=G?.getAttribute("data-dc-screen")??null,K=Z.closest?.(".dc-artboard-body")??null;if(!K){if(G&&W)return{el:G,cdId:null,artboardId:W};return null}if(Z===K){if(G&&W)return{el:G,cdId:null,artboardId:W};return null}if(V.deep){let z=Z.getAttribute?.("data-cd-id")??null;return{el:Z,cdId:z,artboardId:W}}let H=Z,j=null;while(H&&H!==K){if(H.hasAttribute?.("data-cd-id"))j=H;H=H.parentElement}let N=j??Z,X=N.getAttribute?.("data-cd-id")??null;return{el:N,cdId:X,artboardId:W}}import{useCallback as gQ,useEffect as NJ,useRef as F7}from"react";var _Q=!1;function FJ(){return _Q}import{createContext as xQ,useCallback as V7,useContext as MJ,useEffect as x7,useMemo as PJ,useRef as y7,useState as H7}from"react";function m(J,Q,$,V){return`url("data:image/svg+xml,${encodeURIComponent(J.trim())}") ${Q} ${$}, ${V}`}var w7="width='24' height='24' viewBox='0 0 32 32' xmlns='http://www.w3.org/2000/svg'",b7="#1f1f1f",T7="stroke='#ffffff' stroke-linejoin='round' stroke-linecap='round'";function c(J,Q,$){let V=$?`<g transform='${$}'>`:"";return`<svg ${w7}>${V}<path fill='#ffffff' d='${J}'/><path fill='${b7}' d='${Q}'/>${$?"</g>":""}</svg>`}var YJ="translate(0,32) scale(1,-1)",AQ=m(c("M10.25 8.25 L10.05 8.65 10 9 10 23.1 10.05 23.4 10.25 23.75 10.8 24 11.45 23.85 11.6 23.7 11.75 23.45 14.65 19.8 14.85 19.65 14.95 19.5 15.4 19.2 15.95 19.1 21.05 19.1 21.2 19.1 21.35 19.05 21.65 18.9 21.9 18.6 22 18.3 22 17.9 21.9 17.65 21.75 17.35 21.65 17.3 21.55 17.15 11.5 8.25 11.25 8.05 10.95 8 10.6 8.05 10.25 8.25 M9.15 6.6 L9.7 6.25 10 6.15 10.95 6 11.9 6.15 13 6.9 22.9 15.65 23 15.8 23.2 15.95 23.75 16.75 24 17.9 24 18.3 23.9 18.95 23.8 19.25 23.6 19.7 23.1 20.35 22.75 20.6 22.1 20.9 22.05 20.95 22 20.95 21.2 21.1 21.05 21.1 16.2 21.1 16.1 21.25 16.05 21.25 13.4 24.6 13.05 25.15 12.9 25.3 12.55 25.55 Q11.6 26.15 10.55 26 L10.5 26 Q9.65 25.85 9 25.3 L8.45 24.65 8.4 24.5 8.15 24.05 8 23.1 8 9 Q8 8.45 8.15 8.05 L8.25 7.75 8.45 7.35 9.15 6.6","M10.25 8.25 L10.6 8.05 10.95 8 11.25 8.05 11.5 8.25 21.55 17.15 21.65 17.3 21.75 17.35 21.9 17.65 22 17.9 22 18.3 21.9 18.6 21.65 18.9 21.35 19.05 21.2 19.1 21.05 19.1 15.95 19.1 15.4 19.2 14.95 19.5 14.85 19.65 14.65 19.8 11.75 23.45 11.6 23.7 11.45 23.85 10.8 24 10.25 23.75 10.05 23.4 10 23.1 10 9 10.05 8.65 10.25 8.25"),8,5,"default"),IQ=m(c("M28.55 17.8 Q29.4 20.3 28.75 22.8 L28.7 23 28.15 24.55 28.05 24.75 Q26.4 28.2 22.75 29.4 L22.45 29.5 18 29.9 17.75 29.85 Q15.8 29.25 13.8 28.1 L13.45 27.95 Q12 27.05 10.35 26.8 L10.25 26.75 7.9 26.7 7.8 26.7 Q6.1 26.9 4.8 25.8 L4.75 25.8 4.65 25.7 4.6 25.65 Q3.25 24.5 3.05 22.85 L3 22.75 Q2.8 20.95 4 19.5 5.05 18.15 6.75 17.95 L8.4 17.9 7.5 15.55 7.3 15.2 7.2 15 5 10.95 Q3.9 9.15 4.3 7.75 L4.4 7.5 Q4.75 6.15 6.45 5.2 9 3.65 11 5 11.05 4.1 11.5 3.45 12.15 2.1 14.2 1.6 L14.35 1.6 Q18.05 0.6 19.6 4.4 L19.65 4.55 Q20.75 3.65 22.7 3.75 L22.75 3.75 Q26.75 4 27 8.15 L27 8.25 27 8.35 27 8.45 Q26.9 10.75 27.1 12.6 27.15 14.65 28.2 16.75 L28.55 17.8 M26.65 18.4 L26.1 16.8 26.1 16.85 Q24.8 13.7 25 8.35 L25 8.25 Q24.85 5.9 22.6 5.75 20.7 5.65 20.4 7.35 L20.1 7.95 19.5 8.2 18.85 8.05 18.45 7.5 17.75 5.15 Q16.85 2.95 14.7 3.55 L14.65 3.55 Q12.55 4.05 13.15 6.15 L13.85 8.75 13.75 9.45 13.25 9.95 12.55 9.95 12 9.55 10.9 7.7 Q9.5 5.7 7.45 6.9 6.5 7.45 6.25 8.15 6.1 8.9 6.7 9.85 9.2 13.9 10.8 18.65 L10.8 19.3 10.4 19.8 9.75 19.95 Q8.35 19.8 6.95 19.95 6.1 20.05 5.55 20.75 4.9 21.55 5 22.55 5.15 23.55 6 24.2 L6.05 24.25 Q6.75 24.85 7.65 24.7 L7.7 24.7 10.65 24.8 Q12.7 25.15 14.45 26.2 L14.5 26.2 Q16.4 27.35 18.3 27.9 L22.05 27.5 22.1 27.5 Q24.95 26.55 26.25 23.85 L26.8 22.3 Q27.3 20.35 26.65 18.4","M26.65 18.4 Q27.3 20.35 26.8 22.3 L26.25 23.85 Q24.95 26.55 22.1 27.5 L22.05 27.5 18.3 27.9 Q16.4 27.35 14.5 26.2 L14.45 26.2 Q12.7 25.15 10.65 24.8 L7.7 24.7 7.65 24.7 Q6.75 24.85 6.05 24.25 L6 24.2 Q5.15 23.55 5 22.55 4.9 21.55 5.55 20.75 6.1 20.05 6.95 19.95 8.35 19.8 9.75 19.95 L10.4 19.8 10.8 19.3 10.8 18.65 Q9.2 13.9 6.7 9.85 6.1 8.9 6.25 8.15 6.5 7.45 7.45 6.9 9.5 5.7 10.9 7.7 L12 9.55 12.55 9.95 13.25 9.95 13.75 9.45 13.85 8.75 13.15 6.15 Q12.55 4.05 14.65 3.55 L14.7 3.55 Q16.85 2.95 17.75 5.15 L18.45 7.5 18.85 8.05 19.5 8.2 20.1 7.95 20.4 7.35 Q20.7 5.65 22.6 5.75 24.85 5.9 25 8.25 L25 8.35 Q24.8 13.7 26.1 16.85 L26.1 16.8 26.65 18.4"),12,12,"grab"),OQ=m(c("M28 14 Q28 9.85 24.45 6.9 20.95 4 16 4 11.05 4 7.5 6.9 L7.45 7 Q4 9.9 4 14 4 18.15 7.55 21.05 L7.5 21.05 Q9.2 22.45 11.2 23.2 L15.3 27.3 16 27.6 16.7 27.3 20.85 23.2 Q22.7 22.45 24.3 21.15 L24.45 21.05 Q28 18.15 28 14 M25.75 5.35 Q30.05 8.95 30 14 30.05 19.05 25.75 22.6 L25.4 22.85 Q23.8 24.1 22 24.9 L18.1 28.75 18.15 28.75 Q17.2 29.6 16 29.6 14.8 29.6 13.85 28.75 L13.9 28.75 10 24.9 6.6 22.85 6.25 22.6 Q1.95 19.05 2 14 1.95 8.95 6.25 5.35 10.3 2 16 2 21.7 2 25.75 5.35","M28 14 Q28 18.15 24.45 21.05 L24.3 21.15 Q22.7 22.45 20.85 23.2 L16.7 27.3 16 27.6 15.3 27.3 11.2 23.2 Q9.2 22.45 7.5 21.05 L7.55 21.05 Q4 18.15 4 14 4 9.9 7.45 7 L7.5 6.9 Q11.05 4 16 4 20.95 4 24.45 6.9 28 9.85 28 14"),12,21,"crosshair"),kQ=m(c("M4 13.1 L4 6 Q4 5.15 4.6 4.6 5.15 4 6 4 L13.1 4 Q13.95 4 14.55 4.6 L28.65 18.75 Q29.8 19.9 29.75 21.45 L29.75 21.6 29.75 21.7 Q29.75 23.2 28.7 24.35 L24.45 28.65 24.35 28.75 Q23.15 29.85 21.65 29.8 L21.55 29.8 21.4 29.8 Q20.2 29.8 19.25 29.15 L18 29.35 Q16.6 29.4 15.25 28 L15.2 27.95 8.2 20.95 Q7.6 20.35 7.6 19.55 7.6 18.7 8.2 18.1 L4.6 14.5 Q4 13.9 4 13.1 M19.5 26.65 L20.1 27.25 Q20.7 27.85 21.5 27.8 22.35 27.85 23 27.25 L27.25 22.95 Q27.8 22.35 27.75 21.55 27.8 20.75 27.2 20.15 L13.1 6 6 6 6 13.1 12.35 19.45 9.6 19.5 16.65 26.55 Q18.05 28.05 19.5 26.65 M8.05 12.3 L8 8 12.25 8.05 13.8 9.6 9.6 13.85 8.05 12.3 M15.25 11.05 L23 18.8 18.8 23.05 11.05 15.3 15.25 11.05","M15.25 11.05 L11.05 15.3 18.8 23.05 23 18.8 15.25 11.05 M12.35 19.45 L6 13.1 6 6 13.1 6 27.2 20.15 Q27.8 20.75 27.75 21.55 27.8 22.35 27.25 22.95 L23 27.25 Q22.35 27.85 21.5 27.8 20.7 27.85 20.1 27.25 L19.5 26.65 12.35 19.45 M8.05 12.3 L9.6 13.85 13.8 9.6 12.25 8.05 8 8 8.05 12.3",YJ),6,18,"crosshair"),EQ=m(c("M5.15 10.85 Q4 9.65 4 8.1 L4 7.95 4 7.85 Q3.95 6.2 5.1 5.15 6.25 4 7.85 4 L7.95 4 8.1 4 Q9.65 4 10.85 5.15 L11 5.3 14.3 5.25 Q15.15 5.25 15.75 5.85 L29.9 20 Q31 21.15 31 22.75 L31 22.85 31 23 Q31.05 24.5 29.9 25.7 L29.55 25.95 25.65 29.9 25.65 29.95 Q24.45 31.1 22.75 31.1 21.2 31.15 20 29.95 L5.85 15.8 Q5.25 15.2 5.25 14.35 L5.25 10.95 5.15 10.85 M19.95 24.2 L18.55 22.8 22.8 18.55 24.2 19.95 19.95 24.2 M28.45 21.4 L14.3 7.25 10.15 7.3 9.4 6.55 Q8.8 5.95 7.95 6 7.1 5.95 6.5 6.55 5.95 7.1 6 7.95 5.95 8.8 6.55 9.4 L7.25 10.1 7.25 14.35 21.4 28.5 Q22 29.1 22.75 29.1 23.6 29.1 24.2 28.5 L28.45 24.25 Q29.05 23.65 29 22.85 29.05 22 28.45 21.4 M9.25 13.5 L9.25 9.3 13.5 9.25 14.3 10.05 10.05 14.3 9.25 13.5 M17.15 21.4 L11.5 15.75 15.75 11.5 21.4 17.15 17.15 21.4","M17.15 21.4 L21.4 17.15 15.75 11.5 11.5 15.75 17.15 21.4 M28.45 21.4 Q29.05 22 29 22.85 29.05 23.65 28.45 24.25 L24.2 28.5 Q23.6 29.1 22.75 29.1 22 29.1 21.4 28.5 L7.25 14.35 7.25 10.1 6.55 9.4 Q5.95 8.8 6 7.95 5.95 7.1 6.5 6.55 7.1 5.95 7.95 6 8.8 5.95 9.4 6.55 L10.15 7.3 14.3 7.25 28.45 21.4 M19.95 24.2 L24.2 19.95 22.8 18.55 18.55 22.8 19.95 24.2 M9.25 13.5 L10.05 14.3 14.3 10.05 13.5 9.25 9.25 9.3 9.25 13.5",YJ),6,18,"crosshair"),$7=m(c("M17 2 Q18.2 2 19.15 2.9 20 3.8 20 5 L20 12 27 12 Q28.2 12 29.15 12.9 30 13.8 30 15 L30 17 Q30 18.2 29.15 19.15 28.2 20 27 20 L20 20 20 27 Q20 28.2 19.15 29.15 18.2 30 17 30 L15 30 Q13.8 30 12.9 29.15 12 28.2 12 27 L12 20 5 20 Q3.8 20 2.9 19.15 2 18.2 2 17 L2 15 Q2 13.8 2.9 12.9 3.8 12 5 12 L12 12 12 5 Q12 3.8 12.9 2.9 13.8 2 15 2 L17 2 M14 27 L14.3 27.7 Q14.6 28 15 28 L17 28 17.7 27.7 18 27 18 18.05 18.05 18 27 18 Q27.4 18 27.7 17.7 L28 17 28 15 27.7 14.3 Q27.4 14 27 14 L18 14 18 5 17.7 4.3 17 4 15 4 Q14.6 4 14.3 4.3 14 4.6 14 5 L14 14 5 14 Q4.6 14 4.3 14.3 4 14.6 4 15 L4 17 Q4 17.4 4.3 17.7 4.6 18 5 18 L14 18 14 27","M14 27 L14 18 5 18 Q4.6 18 4.3 17.7 4 17.4 4 17 L4 15 Q4 14.6 4.3 14.3 4.6 14 5 14 L14 14 14 5 Q14 4.6 14.3 4.3 14.6 4 15 4 L17 4 17.7 4.3 18 5 18 14 27 14 Q27.4 14 27.7 14.3 L28 15 28 17 27.7 17.7 Q27.4 18 27 18 L18.05 18 18 18.05 18 27 17.7 27.7 17 28 15 28 Q14.6 28 14.3 27.7 L14 27"),12,12,"crosshair"),TQ=m(c("M3.9 11.35 Q2.3 12.5 3.7 13.9 L16.4 26.65 Q17.85 28.05 19.45 26.9 L27.65 21.15 Q29.3 20 27.85 18.6 L15.15 5.85 Q13.75 4.45 12.1 5.6 L3.9 11.35 M1.05 12.4 Q1 10.95 2.75 9.75 L10.95 4 10.95 3.95 Q14 1.85 16.6 4.45 L29.3 17.2 Q30.8 18.65 30.55 20.1 30.55 21.55 28.8 22.8 L20.6 28.55 20.65 28.55 Q17.7 30.65 15 28.1 L15 28.05 2.3 15.3 2.3 15.35 Q0.8 13.85 1.05 12.4 M13.5 7 L19.85 13.35 11.65 19.15 5.3 12.75 13.5 7","M13.5 7 L5.3 12.75 11.65 19.15 19.85 13.35 13.5 7 M3.9 11.35 L12.1 5.6 Q13.75 4.45 15.15 5.85 L27.85 18.6 Q29.3 20 27.65 21.15 L19.45 26.9 Q17.85 28.05 16.4 26.65 L3.7 13.9 Q2.3 12.5 3.9 11.35"),6,14,"cell"),wQ=m(`<svg ${w7}><path d='M16 4V28M11 4H21M11 28H21' fill='none' ${T7} stroke-width='5'/><path d='M16 4V28M11 4H21M11 28H21' fill='none' stroke='${b7}' stroke-width='2.25' stroke-linecap='round'/></svg>`,12,12,"text"),bQ=m(`<svg ${w7}><path d='M6 5H21L26 10V27H6Z' fill='${b7}' ${T7} stroke-width='2.5'/><path d='M21 5V11H26' fill='none' ${T7} stroke-width='2.25'/></svg>`,5,5,"crosshair"),v=Object.freeze({browse:"default",move:AQ,hand:IQ,comment:OQ,pen:kQ,section:$7,highlighter:EQ,shape:$7,rect:$7,ellipse:$7,sticky:bQ,arrow:$7,text:wQ,eraser:TQ});import{jsx as v7,Fragment as RQ}from"react/jsx-runtime";var C7="maude:tool-sync",LJ=Object.freeze({preview:"browse",edit:"move"});function DJ(J){if(J==="browse")return"preview";if(J==="move")return"edit";return null}var yQ=Object.freeze([{id:"browse",label:"Browse",shortcut:"",cursor:v.browse},{id:"move",label:"Select",shortcut:"V",cursor:v.move},{id:"hand",label:"Hand",shortcut:"H",cursor:v.hand},{id:"comment",label:"Comment",shortcut:"C",cursor:v.comment},{id:"pen",label:"Pen",shortcut:"B",cursor:v.pen},{id:"highlighter",label:"Highlighter",shortcut:"I",cursor:v.highlighter},{id:"shape",label:"Shape",shortcut:"R",cursor:v.shape},{id:"sticky",label:"Sticky",shortcut:"N",cursor:v.sticky},{id:"section",label:"Section",shortcut:"⇧S",cursor:v.shape},{id:"arrow",label:"Arrow",shortcut:"A",cursor:v.arrow},{id:"text",label:"Text",shortcut:"T",cursor:v.text},{id:"eraser",label:"Eraser",shortcut:"E",cursor:v.eraser}]),CQ=new Set(["browse","move","hand"]);function vQ(J,Q){return Q?J.filter(($)=>CQ.has($.id)):J}var S7=xQ(null);function SQ({children:J,tools:Q=yQ,initial:$,initialMode:V}){let Z=a(),G=PJ(()=>vQ(Q,Z),[Q,Z]),W=$??(Z?"browse":"move"),K=V??DJ(W)??(Z?"preview":"edit"),[H,j]=H7(W),[N,X]=H7(K),[z,Y]=H7(()=>({tool:null,locked:!1})),U=V7((I)=>{if(!G.some((k)=>k.id===I))return;j(I);let E=DJ(I);if(E)X(E);Y((k)=>k.locked&&k.tool===I?k:{tool:null,locked:!1})},[G]),D=V7((I)=>{let E=LJ[I];if(!G.some((k)=>k.id===E))return;X(I),j(E),Y((k)=>k.locked&&k.tool===E?k:{tool:null,locked:!1})},[G]),A=V7(()=>{U(LJ[N])},[N,U]),q=V7((I)=>{Y((E)=>{if(E.locked&&E.tool===I)return{tool:null,locked:!1};return{tool:I,locked:!0}}),j(I)},[]),F=V7(()=>{Y({tool:null,locked:!1})},[]),[_,P]=H7("rounded"),B=y7(Math.random().toString(36).slice(2)),L=y7(H);L.current=H;let O=y7(!1);x7(()=>{if(!O.current){O.current=!0;return}if(typeof document>"u")return;document.dispatchEvent(new CustomEvent(C7,{detail:{tool:H,from:B.current}}))},[H]),x7(()=>{if(typeof document>"u")return;let I=(E)=>{let k=E.detail;if(!k||k.from===B.current||typeof k.tool!=="string")return;if(k.tool===L.current)return;U(k.tool)};return document.addEventListener(C7,I),()=>document.removeEventListener(C7,I)},[U]),x7(()=>{if(typeof document>"u")return;let I=G.find((w)=>w.id===H);if(!I)return;let E=document.body.style.cursor,k=document.getElementById("dc-tool-cursor");if(!k)k=document.createElement("style"),k.id="dc-tool-cursor",document.head.appendChild(k);if(H==="browse"){if(document.body.style.cursor="",k.textContent="",typeof window<"u"&&window.parent&&window.parent!==window)try{window.parent.postMessage({dgn:"tool-cursor",tool:H},"*")}catch{}return()=>{document.body.style.cursor=E}}if(document.body.style.cursor=I.cursor,k.textContent=`* { cursor: ${I.cursor} !important; }`,typeof window<"u"&&window.parent&&window.parent!==window)try{window.parent.postMessage({dgn:"tool-cursor",tool:H},"*")}catch{}return()=>{document.body.style.cursor=E;let w=document.getElementById("dc-tool-cursor");if(w)w.textContent=""}},[H,G]);let M=PJ(()=>({tool:H,setTool:U,tools:G,mode:N,setMode:D,resetTool:A,sticky:z,toggleSticky:q,clearSticky:F,shapeKind:_,setShapeKind:P}),[H,U,G,N,D,A,z,q,F,_]);return v7(S7.Provider,{value:M,children:J})}function jJ({children:J,initial:Q,initialMode:$}){if(MJ(S7))return v7(RQ,{children:J});return v7(SQ,{initial:Q,initialMode:$,children:J})}function X7(){let J=MJ(S7);if(!J)throw Error("useToolMode must be used inside <ToolProvider>");return J}import{jsx as oQ}from"react/jsx-runtime";var hQ=`
1
+ import{Component as aQ,createElement as h7,useCallback as R7,useEffect as p,useMemo as sQ,useRef as u,useState as Z7}from"react";import{createRoot as tQ}from"react-dom/client";var RJ=/^[A-Za-z0-9_-]{1,64}$/;function o(J){return typeof J==="string"&&RJ.test(J)}function m7(J){if(!J||typeof J!=="object")return!1;let{x:Q,y:$}=J;return typeof Q==="number"&&typeof $==="number"&&Number.isFinite(Q)&&Number.isFinite($)&&Math.abs(Q)<=1e7&&Math.abs($)<=1e7}function d7(){if(typeof window>"u"||typeof document>"u")return null;let J=window.__maudeViewport?.()??null;if(!J||!(J.zoom>0))return null;let Q=document.querySelector(".dc-canvas");if(!Q)return null;let $=Q.getBoundingClientRect();return{vp:J,left:$.left,top:$.top}}function c7(J,Q){let $=d7();if(!$)return null;let{vp:V}=$;return{x:(J-$.left-V.x)/V.zoom,y:(Q-$.top-V.y)/V.zoom}}function i7(J){let Q=d7();if(!Q)return null;let{vp:$}=Q;return{x:Q.left+$.x+J.x*$.zoom,y:Q.top+$.y+J.y*$.zoom}}function B7(J){if(typeof document>"u"||!o(J))return null;return document.querySelector(`[data-id="${J}"][data-tool]`)}function l7(J,Q){if(typeof document>"u")return null;let $=null;for(let V of Array.from(document.querySelectorAll("[data-id][data-tool]"))){if(V.getAttribute("data-tool")==="section")continue;let Z=V.getAttribute("data-id");if(!o(Z))continue;let B=V.getBoundingClientRect();if(B.width<=0&&B.height<=0)continue;if(J<B.left||J>B.right||Q<B.top||Q>B.bottom)continue;let W=Math.max(1,B.width)*Math.max(1,B.height);if(!$||W<=$.area)$={id:Z,area:W}}return $?.id??null}import{useCallback as b,useEffect as R,useMemo as t,useRef as g,useState as h}from"react";function L7(){if(typeof window>"u")return;try{let J=window.location.pathname;if(J==="/_canvas-shell.html"||J==="/_canvas-shell"){let Q=new URLSearchParams(window.location.search),$=Q.get("canvas")??"",V=(Q.get("designRel")??".design").replace(/^\/+|\/+$/g,"");return $?`${V}/${$}`:void 0}return decodeURIComponent(J).replace(/^\//,"")}catch{return}}function G7(J){if(!J)return"";return(J.getAttribute("class")??"").trim().split(/\s+/).filter((Q)=>Q&&!Q.startsWith("dgn-")&&!Q.startsWith("dc-cv-")).join(" ")}function gJ(J,Q){if(!J)return"";let $=(J.innerText||J.textContent||"").replace(/\s+/g," ").trim();return $.length>Q?`${$.slice(0,Q-1)}…`:$}function hJ(J){if(!J)return"";let Q=[],$=J;while($&&$.nodeType===1&&Q.length<8){let V=$.getAttribute?.("data-dc-element");if(V){Q.unshift(`[data-dc-element="${V}"]`);break}let Z=$.getAttribute?.("data-dc-screen");if(Z){Q.unshift(`[data-dc-screen="${Z}"]`);break}let B=$.nodeName.toLowerCase();if($.id){B=`#${$.id}`,Q.unshift(B);break}let W=G7($).split(/\s+/).filter(Boolean).slice(0,2);if(W.length)B+=`.${W.join(".")}`;let K=1,H=$.previousElementSibling;while(H)K++,H=H.previousElementSibling;B+=`:nth-child(${K})`,Q.unshift(B),$=$.parentElement}return Q.join(" > ")}function n7(J){let Q=[],$=J;while($&&$.nodeType===1&&Q.length<8){let V=$.nodeName.toLowerCase(),Z=$.getAttribute?.("data-dc-element"),B=$.getAttribute?.("data-dc-screen");if(Z)V+=`[data-dc-element="${Z}"]`;else if(B)V+=`[data-dc-screen="${B}"]`;else if($.id)V+=`#${$.id}`;let W=G7($).split(/\s+/).filter(Boolean).slice(0,2);if(W.length&&!Z&&!B)V+=`.${W.join(".")}`;Q.unshift(V),$=$.parentElement}return Q}function fJ(J){return J.replace(/[^a-zA-Z0-9_-]/g,(Q)=>`\\${Q}`)}function o7(J,Q){return Q?`[data-dc-screen="${Q}"] [data-cd-id="${J}"]`:`[data-cd-id="${J}"]`}function a7(J,Q,$){if(!$)return 0;try{let V=J.querySelectorAll(Q);for(let Z=0;Z<V.length;Z++)if(V[Z]===$)return Z}catch{}return 0}function s7(J,Q,$){if(!Q||!$)return 0;return a7(J,`[data-cd-id="${fJ(Q)}"]`,$)}function D7(J,Q){let $=(V)=>{try{let Z=J.querySelectorAll(V);if(!Z.length)return null;let B=Q.index&&Q.index>0&&Q.index<Z.length?Q.index:0;return Z[B]??Z[0]}catch{return null}};if(Q.id){let V=$(o7(Q.id,Q.artboardId));if(V)return V}if(Q.selector)return $(Q.selector);return null}function pJ(J,Q){let $=0,V=Math.min(J.length,Q.length);for(let Z=1;Z<=V;Z++){if(J[J.length-Z]!==Q[Q.length-Z])break;$++}return $}function t7(J,Q){let $=Q.dom_path,V=(Q.tag||"").toLowerCase();if(!$||$.length===0||!V)return null;let Z=J;if(Q.artboardId){let H=J.querySelector(`[data-dc-screen="${Q.artboardId}"]`);if(H)Z=H}let B=(Q.classes||"").split(/\s+/).filter(Boolean),W=null,K=0;for(let H of Array.from(Z.querySelectorAll("[data-cd-id]"))){if(H.tagName.toLowerCase()!==V)continue;let j=pJ(n7(H),$);if(j===0)continue;let N=G7(H).split(/\s+/).filter(Boolean),X=B.filter((Y)=>N.includes(Y)).length,z=j*10+X;if(z>K)K=z,W=H}return W}var r7=["display","flex-direction","flex-wrap","align-items","justify-content","gap","flex","flex-grow","flex-shrink","flex-basis","align-self","font-family","color","font-size","font-weight","line-height","letter-spacing","text-align","margin","margin-top","margin-right","margin-bottom","margin-left","padding","padding-top","padding-right","padding-bottom","padding-left","width","height","min-width","min-height","max-width","max-height","background-color","border-radius","border-top-left-radius","border-top-right-radius","border-bottom-left-radius","border-bottom-right-radius","border-width","border-style","border-color","box-shadow","opacity","position","top","right","bottom","left","z-index","transform","transform-origin","font-style","text-transform","text-decoration","white-space","overflow","object-fit","aspect-ratio","object-position"],uJ=/^(style|class|data-cd-id|data-dc-|data-dcid$)/;function mJ(J){if(!J||typeof window>"u"||!window.getComputedStyle)return{authored:{},computed:{},customStyles:{},attrs:{}};try{let Q=J.style,$=window.getComputedStyle(J),V={},Z={},B=new Set(r7);for(let z of r7){let Y=Q.getPropertyValue(z);if(Y)V[z]=Y.trim();let U=$.getPropertyValue(z);if(U)Z[z]=U.trim()}let W=/^(margin|padding|border)(-|$)/,K={};for(let z=0;z<Q.length;z++){let Y=Q.item(z);if(!Y||B.has(Y)||W.test(Y))continue;let U=Q.getPropertyValue(Y);if(U)K[Y]=U.trim()}let H={};for(let z of Array.from(J.attributes)){if(uJ.test(z.name))continue;H[z.name]=z.value}if(J.hasAttribute("data-dc-screen")){for(let z of Array.from(J.attributes))if(z.name.startsWith("data-dc-")&&z.name!=="data-dcid")H[z.name]=z.value}let j=J.parentElement,N=j?window.getComputedStyle(j).display:"",X=j&&(N==="flex"||N==="inline-flex")?window.getComputedStyle(j).flexDirection:"";return{authored:V,computed:Z,customStyles:K,attrs:H,parentDisplay:N,parentFlexDirection:X}}catch{return{authored:{},computed:{},customStyles:{},attrs:{}}}}function M7(J,Q){let $=J.el,V=$&&$.getBoundingClientRect?$.getBoundingClientRect():null,Z=J.cdId,B=Z?o7(Z,J.artboardId):J.artboardId?`[data-dc-screen="${J.artboardId}"]`:hJ($),W=Z&&typeof document<"u"?a7(document,B,$):0;return{file:Q??L7(),id:Z??void 0,selector:B,artboardId:J.artboardId,index:W,tag:$?.tagName.toLowerCase()??"",classes:G7($),text:gJ($,240),dom_path:n7($),bounds:V?{x:Math.round(V.left),y:Math.round(V.top),w:Math.round(V.width),h:Math.round(V.height)}:null,worldW:$ instanceof HTMLElement?Math.round($.offsetWidth):void 0,worldH:$ instanceof HTMLElement?Math.round($.offsetHeight):void 0,html:$?($.outerHTML??"").slice(0,4000):"",...(()=>{if($?.tagName?.toLowerCase()!=="img")return{};let K=/assets\/[0-9a-f]{8}\.[a-z0-9]+/i,H=$.getAttribute?.("data-photo-asset");if(H&&K.test(H))return{photoKind:"artboard-img",photoAsset:H};let j=$.getAttribute?.("src")||"",N=K.exec(j);return N?{photoKind:"artboard-img",photoAsset:N[0]}:{}})(),...mJ($)}}var W7=null;function a(){if(typeof window>"u")return!1;if(W7===null)try{W7=new URLSearchParams(window.location.search).get("ro")==="1"}catch{W7=!1}return W7}import*as j7 from"lib0/decoding";import*as s from"lib0/encoding";import{createContext as iJ,useCallback as D0,useContext as lJ,useEffect as M0,useMemo as j0,useReducer as N0,useRef as _0,useState as A0}from"react";import{Awareness as O0,applyAwarenessUpdate as k0,encodeAwarenessUpdate as E0}from"y-protocols/awareness";import{readSyncMessage as w0,writeSyncStep1 as b0,writeUpdate as x0}from"y-protocols/sync";import*as rJ from"yjs";import*as dJ from"yjs";var cJ=new WeakSet;function e7(J){return cJ.add(J),J}var H0=e7(Object.freeze({maudeOrigin:"shell-edit"})),X0=e7(Object.freeze({maudeOrigin:"sync-agent"}));import{jsx as v0}from"react/jsx-runtime";var nJ=iJ(null);function JJ(){return lJ(nJ)}import{createContext as oJ,useCallback as l,useContext as _7,useEffect as aJ,useMemo as sJ,useRef as QJ,useState as tJ}from"react";import{jsx as N7,Fragment as QQ}from"react/jsx-runtime";var K7=oJ(null);function r(J){return J.id?`id:${J.id}`:`sel:${J.selector}`}function $J(J){let Q=[],$=new Set;for(let V of J){let Z=r(V);if($.has(Z))continue;$.add(Z),Q.push(V)}return Q}var eJ=50;function JQ({children:J,postTarget:Q}){let[$,V]=tJ([]),Z=QJ(null),B=QJ(null),W=l((Y)=>{if(Z.current)clearTimeout(Z.current);B.current=()=>{Z.current=null,B.current=null;let U=Q??(typeof window<"u"?window.parent:null);if(!U)return;let D=Y.length===0?null:Y.length===1?Y[0]??null:Y;try{U.postMessage({dgn:"select-set",selection:D},"*")}catch{}},Z.current=setTimeout(()=>B.current?.(),eJ)},[Q]);aJ(()=>()=>{if(Z.current)clearTimeout(Z.current);B.current?.()},[]);let K=l((Y)=>{let U=$J(Array.isArray(Y)?Y:[Y]);V(U),W(U)},[W]),H=l((Y)=>{let U=Array.isArray(Y)?Y:[Y];V((D)=>{let A=$J([...D,...U]);return W(A),A})},[W]),j=l((Y)=>{let U=r(Y);V((D)=>{let A=D.filter((q)=>r(q)!==U);return W(A),A})},[W]),N=l((Y)=>{let U=r(Y);V((D)=>{let A=D.some((q)=>r(q)===U)?D.filter((q)=>r(q)!==U):[...D,Y];return W(A),A})},[W]),X=l(()=>{V([]),W([])},[W]),z=sJ(()=>({selected:$,replace:K,add:H,remove:j,toggle:N,clear:X}),[$,K,H,j,N,X]);return N7(K7.Provider,{value:z,children:J})}function VJ({children:J}){if(_7(K7))return N7(QQ,{children:J});return N7(JQ,{children:J})}function z7(){let J=_7(K7);if(!J)throw Error("useSelectionSet must be used inside <SelectionSetProvider>");return J}function ZJ(){return _7(K7)}import{jsx as T,jsxs as x,Fragment as DQ}from"react/jsx-runtime";var $Q="/_client/comments-overlay.css";function VQ(){if(typeof document>"u")return;if(document.getElementById("cm-overlay-css"))return;let J=document.createElement("link");J.id="cm-overlay-css",J.rel="stylesheet",J.href=$Q,document.head.appendChild(J)}function ZQ(){if(typeof window>"u")return null;try{let J=window.location.pathname;if(J==="/_canvas-shell.html"||J==="/_canvas-shell"){let Q=new URLSearchParams(window.location.search),$=Q.get("canvas")??"",V=(Q.get("designRel")??".design").replace(/^\/+|\/+$/g,"");return $?`${V}/${$}`:null}return decodeURIComponent(J).replace(/^\//,"")}catch{return null}}function qQ(J){if(o(J.annotationId))return B7(J.annotationId);if(!J.selector)return null;let Q=null;try{let $=document.querySelectorAll(J.selector),V=J.index&&J.index>0&&J.index<$.length?J.index:0;Q=$[V]??$[0]??null}catch{Q=null}if(Q&&J.tag&&Q.tagName.toLowerCase()!==J.tag.toLowerCase())Q=null;if(!Q&&J.dom_path?.length){let $=J.selector.match(/data-dc-screen="([^"]+)"/)?.[1];Q=t7(document,{artboardId:$,tag:J.tag,classes:J.classes,dom_path:J.dom_path})}return Q}function O7(J){let Q=qQ(J);if(!Q?.isConnected)return null;let $=Q.getBoundingClientRect();if($.width===0&&$.height===0)return null;return{x:$.left,y:$.top,w:$.width,h:$.height}}function KJ(J,Q){let V=typeof window<"u"?window.innerWidth:J.x+Q.w,Z=typeof window<"u"?window.innerHeight:J.y+Q.h,B=J.x;if(B+Q.w+8>V){let K=J.x-Q.w;B=K>=8?K:Math.max(8,V-Q.w-8)}let W=J.y;if(W+Q.h+8>Z){let K=J.y-Q.h;W=K>=8?K:Math.max(8,Z-Q.h-8)}return{x:B,y:W}}function zJ(){VQ();let J=ZJ(),[Q,$]=h([]),[V,Z]=h(null),[B,W]=h(null),K=t(()=>ZQ(),[]);R(()=>{if(typeof document>"u")return;let P=document.getElementById("dgn-pin-layer");if(!P)return;let G=P.style.display;return P.style.display="none",()=>{P.style.display=G}},[]);let H=b((P)=>{if(!J)return;if(!P?.selector){J.clear();return}let G=P.selector.match(/data-cd-id="([^"]+)"/),L=G?G[1]:void 0,O,M;try{let I=document.querySelector(P.selector);if(I)O=I.tagName.toLowerCase(),M=(I.getAttribute("class")??"").split(/\s+/).filter((E)=>E&&!E.startsWith("dgn-")&&!E.startsWith("dc-cv-")).join(" ")}catch{}J.replace({file:K??void 0,id:L,selector:P.selector,tag:O,classes:M,bounds:P.bounds??void 0})},[J,K]),j=g(Q);j.current=Q;let N=JJ(),X=XQ();R(()=>{if(!N)return;let P=N.doc.getArray("comments"),G=()=>{$(P.toArray())};if(P.length>0)G();return P.observe(G),()=>{try{P.unobserve(G)}catch{}}},[N]),R(()=>{if(typeof window>"u")return;let P=(G)=>{let L=G.data;if(!L||typeof L!=="object"||!L.dgn)return;if(L.dgn==="comments-set"&&Array.isArray(L.comments))$(L.comments);else if(L.dgn==="comment-focus"){let O=typeof L.id==="string"?L.id:null;Z(O);let M=O?j.current.find((I)=>I.id===O):void 0;H(M)}};return window.addEventListener("message",P),()=>window.removeEventListener("message",P)},[H]),R(()=>{if(typeof document>"u")return;let P=(G)=>{let L=G.detail;if(!L?.selection)return;W({selection:L.selection,clientX:typeof L.clientX==="number"?L.clientX:0,clientY:typeof L.clientY==="number"?L.clientY:0})};return document.addEventListener("cm:open-composer",P),()=>document.removeEventListener("cm:open-composer",P)},[]);let z=b(()=>{if(W(null),typeof window>"u")return;try{window.parent.postMessage({dgn:"force-clear"},"*")}catch{}},[]),Y=b((P)=>{if(!B)return;let G=B.selection,L={file:G.file,selector:G.selector,index:G.index,dom_path:G.dom_path,tag:G.tag,classes:G.classes,bounds:G.bounds,html_excerpt:G.html,...G.annotationId?{annotationId:G.annotationId}:{},...G.world?{world:G.world}:{},text:P};if(typeof window>"u")return;try{window.parent.postMessage({dgn:"comment-submit",payload:L},"*")}catch{}z()},[B,z]);R(()=>{if(!K)return;let P=!1;return(async()=>{try{let G=await fetch(`/_comments?file=${encodeURIComponent(K)}`);if(!G.ok)return;let L=await G.json();if(P)return;if(Array.isArray(L.comments))$((O)=>O.length===0?L.comments??[]:O)}catch{}})(),()=>{P=!0}},[K]);let U=t(()=>{return Q.slice().sort((G,L)=>G.created.localeCompare(L.created)).filter((G)=>G.status!=="resolved")},[Q]),D=t(()=>{let P=new Map;return Q.slice().sort((L,O)=>L.created.localeCompare(O.created)).forEach((L,O)=>{P.set(L.id,O+1)}),P},[Q]),A=b((P)=>{if(Z(P),H(Q.find((G)=>G.id===P)),typeof window>"u")return;try{window.parent.postMessage({dgn:"comment-click",id:P},"*")}catch{}},[Q,H]),q=b((P,G)=>{if(typeof window>"u")return;try{window.parent.postMessage({dgn:"comment-patch",id:P,patch:G},"*")}catch{}},[]),F=b((P)=>{if(typeof window>"u")return;try{window.parent.postMessage({dgn:"comment-delete",id:P},"*")}catch{}Z((G)=>G===P?null:G)},[]),_=b(async(P,G)=>{if(typeof fetch>"u")return!1;try{let L=await fetch(`/_api/comments/${encodeURIComponent(P)}/reply`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({body:G})});if(!L.ok)return!1;let O=await L.json();return $((M)=>M.map((I)=>I.id===O.id?O:I)),!0}catch{return!1}},[]);return x("div",{className:"cm-layer","aria-hidden":!1,children:[U.map((P)=>{let G=D.get(P.id)??0;return T(UQ,{comment:P,sequence:G,focused:V===P.id,onClick:A},P.id)}),B?T(HQ,{state:B,onSubmit:Y,onCancel:z}):null,(()=>{if(!V)return null;let P=U.find((G)=>G.id===V);if(!P)return null;return T(FQ,{comment:P,sequence:D.get(P.id)??0,onClose:()=>{Z(null),J?.clear()},onPatch:(G)=>q(P.id,G),onDelete:()=>F(P.id),onReply:(G)=>_(P.id,G),mine:!a()&&!!(X??N?.myName)&&(P.author??"").trim()===(X??N?.myName??"").trim()})})()]})}var A7=null;async function BQ(){if(!A7)A7=(async()=>{try{let J=await fetch("/_api/git-committers");if(!J.ok)return[];let Q=await J.json();return Array.isArray(Q.committers)?Q.committers:[]}catch{return[]}})();return A7}function qJ(J){return(J.trim().split(/\s+/)[0]??"").replace(/[^\w.-]/g,"").toLowerCase()}function GQ(J,Q){if(Q<=0||Q>J.length)return null;let $=Q-1;while($>=0){let V=J[$]??"";if(V==="@"){let Z=$>0?J[$-1]:"";if($===0||/\s/.test(Z??"")){let B=J.slice($+1,Q);return{start:$,end:Q,query:B}}return null}if(!/[\w.-]/.test(V))return null;$-=1}return null}function I7({className:J,value:Q,onChange:$,onKeyDown:V,placeholder:Z,rows:B,disabled:W,textareaRef:K,ariaLabel:H}){let j=g(null),N=b((M)=>{if(j.current=M,K)K.current=M},[K]),[X,z]=h([]),[Y,U]=h(null),[D,A]=h(0),q=b(()=>{if(X.length>0)return;BQ().then((M)=>z(M))},[X.length]),F=t(()=>{if(!Y)return[];let M=Y.query.toLowerCase();return(!M?X:X.filter((E)=>E.name.toLowerCase().includes(M)||E.email.toLowerCase().includes(M))).slice(0,8)},[Y,X]),_=b((M)=>{let I=M.selectionStart??M.value.length,E=GQ(M.value,I);U(E),A(0)},[]),P=b((M)=>{$(M.target.value),_(M.target)},[$,_]),G=b((M)=>{if(!Y)return;let I=j.current;if(!I)return;let E=`@${qJ(M.name)}`,k=`${Q.slice(0,Y.start)}${E} ${Q.slice(Y.end)}`;$(k),U(null);let w=Y.start+E.length+1;requestAnimationFrame(()=>{I.focus(),I.setSelectionRange(w,w)})},[Y,Q,$]),L=b((M)=>{if(Y&&F.length>0){if(M.key==="ArrowDown"){M.preventDefault(),A((I)=>(I+1)%F.length);return}if(M.key==="ArrowUp"){M.preventDefault(),A((I)=>(I-1+F.length)%F.length);return}if(M.key==="Enter"||M.key==="Tab"){M.preventDefault();let I=F[D]??F[0];if(I)G(I);return}if(M.key==="Escape"){M.preventDefault(),U(null);return}}V?.(M)},[Y,F,D,G,V]),O=b((M)=>{_(M.currentTarget)},[_]);return x("div",{style:{position:"relative"},children:[T("textarea",{ref:N,className:J,value:Q,placeholder:Z,rows:B,disabled:W,"aria-label":H,onChange:P,onKeyDown:L,onFocus:q,onSelect:O,onClick:O}),Y&&F.length>0?T("ul",{className:"cm-mention-popup",role:"listbox","aria-label":"Mention suggestions",style:{left:0,top:"100%"},children:F.map((M,I)=>{return x("li",{role:"option","aria-selected":I===D,className:"cm-mention-popup__item",onMouseEnter:()=>A(I),onMouseDown:(k)=>{k.preventDefault(),G(M)},children:[x("span",{className:"cm-mention-popup__name",children:["@",qJ(M.name)]}),T("span",{className:"cm-mention-popup__email",children:M.email})]},`${M.name}-${M.email}`)})}):null]})}var WQ=3000;function KQ(J){return{x:J.x-12,y:J.y-12,w:24,h:24}}function zQ(J){let Q=!!J.selector||o(J.annotationId);if(Q){let Z=O7(J);if(Z)return{pos:Z,missing:!1}}let $=m7(J.world)?i7(J.world):null;return{pos:$?KQ($):J.bounds??null,missing:Q}}function UQ({comment:J,sequence:Q,focused:$,onClick:V}){let Z=g(null),B=g(null),W=g(null),[K,H]=h(!1),j=g(!1);R(()=>{let z=()=>{B.current=null;let Y=Z.current;if(!Y)return;let{pos:U,missing:D}=zQ(J),A=!1;if(D){if(W.current==null)W.current=Date.now();A=Date.now()-W.current>WQ}else W.current=null;if(A!==j.current)j.current=A,H(A);if(!U){Y.style.display="none",B.current=requestAnimationFrame(z);return}Y.style.display="grid";let q=Math.round(U.x+U.w-12),F=Math.round(U.y-12);Y.style.left=`${q}px`,Y.style.top=`${F}px`,B.current=requestAnimationFrame(z)};return B.current=requestAnimationFrame(z),()=>{if(B.current!=null)cancelAnimationFrame(B.current)}},[J]);let N=J.author?.trim()||"unknown",X=`Comment ${Q} by ${N}${K?" (detached: its target is gone)":""}`;return T("button",{ref:Z,type:"button",className:"cm-pin","data-resolved":J.status==="resolved"?"true":"false","data-focused":$?"true":"false","data-detached":K?"true":"false","data-comment-pin":J.id,"aria-label":X,"aria-expanded":$,title:J.text.slice(0,200),onClick:(z)=>{z.preventDefault(),z.stopPropagation(),V(J.id)},children:Q})}function HQ({state:J,onSubmit:Q,onCancel:$}){let[V,Z]=h(""),B=g(null),W=g(null),K=g(null);R(()=>{let X=()=>{K.current=null;let z=W.current;if(!z)return;let Y=LQ(J),U=KJ(Y,{w:z.offsetWidth,h:z.offsetHeight});z.style.left=`${Math.round(U.x)}px`,z.style.top=`${Math.round(U.y)}px`,K.current=requestAnimationFrame(X)};return K.current=requestAnimationFrame(X),()=>{if(K.current!=null)cancelAnimationFrame(K.current)}},[J]),R(()=>{B.current?.focus()},[]);let H=b(()=>{let X=V.trim();if(!X)return;Q(X)},[V,Q]),j=b((X)=>{if(X.key==="Escape"){X.preventDefault(),$();return}if((X.metaKey||X.ctrlKey)&&X.key==="Enter")X.preventDefault(),H()},[$,H]),N=t(()=>{let X=J.selection.selector||"";if(!X)return J.selection.tag||(J.selection.annotationId?"annotation":"canvas");let z=X.match(/data-cd-id="([^"]+)"/);if(z)return`cd:${z[1]}`;return X.length>36?`${X.slice(0,33)}…`:X},[J.selection]);return x("div",{ref:W,className:"cm-composer",role:"dialog","aria-label":"New comment",onClick:(X)=>X.stopPropagation(),onPointerDown:(X)=>X.stopPropagation(),children:[x("div",{className:"cm-composer__head",children:[T("span",{children:"New comment"}),T("span",{className:"cm-composer__selector",children:N})]}),T(I7,{textareaRef:B,className:"cm-composer__textarea",value:V,placeholder:"Type a comment. ⌘↵ to save · Esc to cancel · @name to tag",onChange:Z,onKeyDown:j,rows:3,ariaLabel:"Comment body"}),x("div",{className:"cm-composer__actions",children:[T("button",{type:"button",className:"cm-btn",onClick:$,children:"Cancel"}),T("button",{type:"button",className:"cm-btn cm-btn--primary",disabled:!V.trim(),onClick:H,children:"Save"})]})]})}var BJ=null;function XQ(){let[J,Q]=h(null);return R(()=>{if(typeof fetch>"u")return;BJ??=fetch("/_api/git-user").then((V)=>V.ok?V.json():null).then((V)=>typeof V?.name==="string"&&V.name.trim()?V.name.trim():null).catch(()=>null);let $=!0;return BJ.then((V)=>$&&Q(V)),()=>{$=!1}},[]),J}function FQ({comment:J,sequence:Q,onClose:$,onPatch:V,onDelete:Z,onReply:B,mine:W=!1}){let K=g(null),H=g(null),j=g(null),[N,X]=h(""),[z,Y]=h(!1),[U,D]=h(null),A=b(()=>{let G=(U??"").trim();if(!G)return;if(G!==J.text)V({text:G});D(null)},[U,J.text,V]);R(()=>{let G=()=>{j.current=null;let L=K.current;if(!L)return;let O=PQ(J),M=KJ(O,{w:L.offsetWidth,h:L.offsetHeight});L.style.left=`${Math.round(M.x)}px`,L.style.top=`${Math.round(M.y)}px`,j.current=requestAnimationFrame(G)};return j.current=requestAnimationFrame(G),()=>{if(j.current!=null)cancelAnimationFrame(j.current)}},[J]),R(()=>{K.current?.focus();let G=J.id;return()=>{document.querySelector(`[data-comment-pin="${G}"]`)?.focus()}},[J.id]),R(()=>{if(typeof document>"u")return;let G=(L)=>{if(L.key!=="Escape")return;let O=K.current;if(!O)return;if(O.contains(L.target)||document.activeElement===O)L.preventDefault(),$()};return document.addEventListener("keydown",G),()=>document.removeEventListener("keydown",G)},[$]);let q=b(async()=>{let G=N.trim();if(!G||z)return;Y(!0);let L=await B(G);if(Y(!1),L)X(""),H.current?.focus()},[N,z,B]),F=b((G)=>{if((G.metaKey||G.ctrlKey)&&G.key==="Enter")G.preventDefault(),q()},[q]),_=`cm-thread-head-${J.id}`,P=YQ(J.selector,"");return x("div",{ref:K,className:"cm-thread",role:"dialog","aria-labelledby":_,tabIndex:-1,onClick:(G)=>G.stopPropagation(),onPointerDown:(G)=>G.stopPropagation(),children:[x("div",{className:"cm-thread__head",id:_,children:[x("div",{className:"cm-thread__head-row",children:[T("span",{className:"cm-thread__seq","aria-hidden":"true",children:Q}),T("span",{className:"cm-thread__author",children:J.author?.trim()||"unknown"}),T("span",{className:"cm-thread__time",children:WJ(J.created)}),T("button",{type:"button",className:"cm-thread__close","aria-label":"Close thread",title:"Close · Esc",onClick:$,children:"×"})]}),P?T("code",{className:"cm-thread__selector",children:P}):null]}),U===null?T("div",{className:"cm-thread__body",children:GJ(J.text)}):x("div",{className:"cm-thread__reply-form",children:[T(I7,{className:"cm-thread__reply-textarea",value:U,placeholder:"Edit your comment… ⌘↵ to save",onChange:D,onKeyDown:(G)=>{if((G.metaKey||G.ctrlKey)&&G.key==="Enter")G.preventDefault(),A()},rows:3,ariaLabel:"Edit comment"}),x("div",{className:"cm-thread__reply-actions",children:[T("button",{type:"button",className:"cm-btn",onClick:()=>D(null),children:"Cancel"}),T("button",{type:"button",className:"cm-btn cm-btn--primary","data-testid":"comment-edit-save",disabled:!U.trim(),onClick:A,children:"Save"})]})]}),(J.thread??[]).map((G)=>x("div",{className:"cm-thread__reply",children:[x("div",{className:"cm-thread__reply-head",children:[T("span",{className:"cm-thread__reply-author",children:G.author?.trim()||"unknown"}),T("span",{className:"cm-thread__reply-time",children:WJ(G.created)})]}),T("div",{className:"cm-thread__reply-body",children:GJ(G.body)})]},G.id)),!a()&&x(DQ,{children:[x("div",{className:"cm-thread__reply-form",children:[T(I7,{textareaRef:H,className:"cm-thread__reply-textarea",value:N,placeholder:"Reply… ⌘↵ to send · @name to tag",onChange:X,onKeyDown:F,rows:2,ariaLabel:"Reply",disabled:z}),T("div",{className:"cm-thread__reply-actions",children:T("button",{type:"button",className:"cm-btn cm-btn--primary",disabled:!N.trim()||z,onClick:()=>void q(),children:"Send"})})]}),x("div",{className:"cm-thread__actions",children:[W&&U===null?T("button",{type:"button",className:"cm-btn","data-testid":"comment-edit",onClick:()=>D(J.text),children:"Edit"}):null,J.status==="resolved"?T("button",{type:"button",className:"cm-btn",onClick:()=>V({status:"open"}),children:"↺ Reopen"}):T("button",{type:"button",className:"cm-btn cm-btn--primary",onClick:()=>{V({status:"resolved"}),$()},children:"✓ Resolve"}),T("button",{type:"button",className:"cm-btn cm-btn--danger",onClick:()=>{Z(),$()},children:"Delete"})]})]})]})}function GJ(J){if(!J)return null;let Q=/(@[\w][\w.-]*)/g;return J.split(Q).map((V,Z)=>{let B=`${Z}:${V}`;if(Z%2===1)return T("strong",{"data-mention":"true",children:V},B);return T("span",{children:V},B)})}function WJ(J){if(!J)return"";let Q=Date.parse(J);if(!Number.isFinite(Q))return"";let $=Math.round((Date.now()-Q)/1000);if($<60)return`${Math.max($,0)}s ago`;if($<3600)return`${Math.round($/60)}m ago`;if($<86400)return`${Math.round($/3600)}h ago`;return`${Math.round($/86400)}d ago`}function YQ(J,Q){if(!J)return Q;let $=J.match(/data-cd-id="([^"]+)"/);if($)return`cd:${$[1]}`;return J.length>36?`${J.slice(0,33)}…`:J}function PQ(J){let Q=J.selector?O7(J):null;if(Q)return{x:Q.x+Q.w-12,y:Q.y+16};if(J.bounds)return{x:J.bounds.x+J.bounds.w-12,y:J.bounds.y+16};return{x:16,y:16}}function LQ(J){if(J.clientX||J.clientY)return{x:J.clientX,y:J.clientY+8};if(J.selection.selector){let Q=O7(J.selection);if(Q)return{x:Q.x,y:Q.y+Q.h+8}}return{x:16,y:16}}import{useEffect as MQ}from"react";var jQ=new Set(["pen","highlighter","shape","rect","ellipse","arrow","sticky","text","section","eraser"]);function k7(J){return jQ.has(J)}var e=(J)=>!!(J.metaKey||J.ctrlKey);function J7(J){if(J.type==="keydown"){if(J.isEditable)return{kind:"no-op"};if(J.metaKey||J.ctrlKey||J.altKey){if(J.key==="Escape")return{kind:"escape"};let $=(J.key||"").toLowerCase();if(!J.altKey&&(J.metaKey||J.ctrlKey)){if($==="z"&&J.shiftKey)return{kind:"redo"};if($==="z")return{kind:"undo"};if($==="y"&&!J.shiftKey)return{kind:"redo"}}return{kind:"no-op"}}let Q=(J.key||"").toLowerCase();if(Q==="v")return{kind:"tool",tool:"move"};if(Q==="h")return{kind:"tool",tool:"hand"};if(Q==="c")return{kind:"tool",tool:"comment"};if(Q==="b")return{kind:"tool",tool:"pen"};if(Q==="i")return{kind:"tool",tool:"highlighter"};if(Q==="r"||Q==="o")return{kind:"tool",tool:"shape"};if(Q==="a")return{kind:"tool",tool:"arrow"};if(Q==="n")return{kind:"tool",tool:"sticky"};if(Q==="t")return{kind:"tool",tool:"text"};if(Q==="s"&&J.shiftKey)return{kind:"tool",tool:"section"};if(Q==="e")return{kind:"tool",tool:"eraser"};if(J.key==="Escape")return{kind:"escape"};return{kind:"no-op"}}if(J.type==="contextmenu")return{kind:"context-menu",clientX:J.clientX??0,clientY:J.clientY??0};if(J.type==="pointermove"){if(k7(J.activeTool))return{kind:"no-op"};if(J.activeTool==="hand")return{kind:"no-op"};if(J.activeTool==="browse"){if(!e(J))return{kind:"no-op"};return{kind:"hover",deep:!0,clientX:J.clientX??0,clientY:J.clientY??0}}if(J.activeTool==="comment")return{kind:"hover",deep:!0,clientX:J.clientX??0,clientY:J.clientY??0};return{kind:"hover",deep:e(J),clientX:J.clientX??0,clientY:J.clientY??0}}if(J.type==="pointerdown"){if(J.button===2)return{kind:"context-menu",clientX:J.clientX??0,clientY:J.clientY??0};if(J.button===1||J.spaceHeld)return{kind:"no-op"};if(J.button!==0)return{kind:"no-op"};if(k7(J.activeTool)&&!e(J))return{kind:"no-op"};if(J.activeTool==="comment")return{kind:"drop-comment",clientX:J.clientX??0,clientY:J.clientY??0};if(J.activeTool==="hand")return{kind:"no-op"};if(J.activeTool==="browse"){if(!e(J))return{kind:"no-op"};return{kind:"select",mode:J.shiftKey?"add":"replace",deep:!0,clientX:J.clientX??0,clientY:J.clientY??0}}let Q=e(J);return{kind:"select",mode:!!J.shiftKey?"add":"replace",deep:Q,clientX:J.clientX??0,clientY:J.clientY??0}}return{kind:"no-op"}}function U7(J){if(!J||!J.tagName)return!1;let Q=J,$=Q.tagName;if($==="INPUT"||$==="TEXTAREA"||$==="SELECT")return!0;if(Q.isContentEditable)return!0;let V=Q.getAttribute?.("contenteditable");if(V==="true"||V==="plaintext-only"||V==="")return!0;return!1}function Q7(J){if(!J||!J.closest)return!1;let Q=J;if(Q.closest(".dc-world"))return!1;return!!Q.closest(".cm-composer, .cm-thread, .cm-mention-popup, .cm-pin, [data-mediaref-player], .dc-tool-palette, .dc-zoom-tb, .dc-mm, .dc-context-menu")}function HJ(J){if(!J||typeof J.closest!=="function")return!1;let Q=J;return!!Q.closest("[data-dc-screen]")&&!Q.closest(".dc-artboard-body")}function UJ(J,Q,$){return J.kind==="select"&&!$.metaKey&&!$.ctrlKey&&HJ(Q)}function NQ(J,Q,$){return J==="select"&&!$.metaKey&&!$.ctrlKey&&HJ(Q)}function XJ(J){let{hostRef:Q,getActiveTool:$,isSpaceHeld:V,callbacks:Z,enabled:B=!0,claimableActions:W}=J;MQ(()=>{if(!B)return;let K=Q.current;if(!K)return;let H=(q)=>W&&q.kind!=="no-op"&&!W.has(q.kind)?{kind:"no-op"}:q,j=(q)=>{switch(q.kind){case"hover":Z.onHover?.(q);break;case"select":Z.onSelect?.(q);break;case"drop-comment":Z.onDropComment?.(q);break;case"context-menu":Z.onContextMenu?.(q);break;case"tool":Z.onTool?.(q);break;case"escape":Z.onEscape?.();break;case"undo":Z.onUndo?.();break;case"redo":Z.onRedo?.();break;case"no-op":break}},N=(q)=>{let F=H(J7({type:"pointermove",button:q.button,metaKey:q.metaKey,ctrlKey:q.ctrlKey,shiftKey:q.shiftKey,altKey:q.altKey,clientX:q.clientX,clientY:q.clientY,spaceHeld:V?.()??!1,activeTool:$()}));j(F)},X=(q)=>{if(Q7(q.target))return;if(U7(q.target))return;let F=H(J7({type:"pointerdown",button:q.button,metaKey:q.metaKey,ctrlKey:q.ctrlKey,shiftKey:q.shiftKey,altKey:q.altKey,clientX:q.clientX,clientY:q.clientY,spaceHeld:V?.()??!1,activeTool:$()})),_=UJ(F,q.target,q);if(F.kind!=="no-op"){if(q.preventDefault(),!_)q.stopImmediatePropagation()}j(F)},z=(q)=>{if(Q7(q.target))return;if(U7(q.target))return;let F=H(J7({type:"pointerdown",button:q.button,metaKey:q.metaKey,ctrlKey:q.ctrlKey,shiftKey:q.shiftKey,altKey:q.altKey,clientX:q.clientX,clientY:q.clientY,spaceHeld:V?.()??!1,activeTool:$()})),_=UJ(F,q.target,q);if(F.kind!=="no-op"){if(q.preventDefault(),!_)q.stopImmediatePropagation();if(F.kind==="select")try{window.focus()}catch{}}},Y=(q)=>{if(Q7(q.target))return;if(U7(q.target))return;let F=$(),_=q.metaKey||q.ctrlKey,P=F==="comment"?"drop-comment":F==="move"&&q.button===0?"select":(k7(F)||F==="browse")&&_&&q.button===0?"select":q.button===2?"context-menu":null;if(P&&(!W||W.has(P))){let G=NQ(P,q.target,q);if(q.preventDefault(),!G)q.stopImmediatePropagation()}},U=(q)=>{let F=H(J7({type:"contextmenu",clientX:q.clientX,clientY:q.clientY,metaKey:q.metaKey,ctrlKey:q.ctrlKey,shiftKey:q.shiftKey,altKey:q.altKey,activeTool:$()}));if(F.kind==="no-op")return;q.preventDefault(),q.stopImmediatePropagation(),j(F)},D=(q)=>{let F=H(J7({type:"keydown",key:q.key,metaKey:q.metaKey,ctrlKey:q.ctrlKey,shiftKey:q.shiftKey,altKey:q.altKey,isEditable:U7(q.target),activeTool:$()}));if(F.kind==="tool"||F.kind==="escape"||F.kind==="undo"||F.kind==="redo")q.preventDefault();j(F)};K.addEventListener("pointermove",N,{passive:!0}),K.addEventListener("pointerdown",X,{capture:!0}),K.addEventListener("mousedown",z,{capture:!0}),K.addEventListener("click",Y,{capture:!0}),K.addEventListener("contextmenu",U,{capture:!0});let A=K.ownerDocument??document;return A.addEventListener("keydown",D,!0),()=>{K.removeEventListener("pointermove",N),K.removeEventListener("pointerdown",X,{capture:!0}),K.removeEventListener("mousedown",z,{capture:!0}),K.removeEventListener("click",Y,{capture:!0}),K.removeEventListener("contextmenu",U,{capture:!0}),A.removeEventListener("keydown",D,!0)}},[B,Q,$,V,Z,W])}function E7(J,Q,$,V){let Z=J.elementFromPoint(Q,$);if(!Z)return null;if(Z.closest?.(".dc-mm, .dc-zoom-tb, .dc-tool-palette, .dc-context-menu, .dc-cv-group-bbox"))return null;let B=Z.closest?.("[data-dc-screen]")??null,W=B?.getAttribute("data-dc-screen")??null,K=Z.closest?.(".dc-artboard-body")??null;if(!K){if(B&&W)return{el:B,cdId:null,artboardId:W};return null}if(Z===K){if(B&&W)return{el:B,cdId:null,artboardId:W};return null}if(V.deep){let z=Z.getAttribute?.("data-cd-id")??null;return{el:Z,cdId:z,artboardId:W}}let H=Z,j=null;while(H&&H!==K){if(H.hasAttribute?.("data-cd-id"))j=H;H=H.parentElement}let N=j??Z,X=N.getAttribute?.("data-cd-id")??null;return{el:N,cdId:X,artboardId:W}}import{useCallback as gQ,useEffect as NJ,useRef as F7}from"react";var _Q=!1;function FJ(){return _Q}import{createContext as xQ,useCallback as V7,useContext as MJ,useEffect as x7,useMemo as PJ,useRef as y7,useState as H7}from"react";function m(J,Q,$,V){return`url("data:image/svg+xml,${encodeURIComponent(J.trim())}") ${Q} ${$}, ${V}`}var w7="width='24' height='24' viewBox='0 0 32 32' xmlns='http://www.w3.org/2000/svg'",b7="#1f1f1f",T7="stroke='#ffffff' stroke-linejoin='round' stroke-linecap='round'";function c(J,Q,$){let V=$?`<g transform='${$}'>`:"";return`<svg ${w7}>${V}<path fill='#ffffff' d='${J}'/><path fill='${b7}' d='${Q}'/>${$?"</g>":""}</svg>`}var YJ="translate(0,32) scale(1,-1)",AQ=m(c("M10.25 8.25 L10.05 8.65 10 9 10 23.1 10.05 23.4 10.25 23.75 10.8 24 11.45 23.85 11.6 23.7 11.75 23.45 14.65 19.8 14.85 19.65 14.95 19.5 15.4 19.2 15.95 19.1 21.05 19.1 21.2 19.1 21.35 19.05 21.65 18.9 21.9 18.6 22 18.3 22 17.9 21.9 17.65 21.75 17.35 21.65 17.3 21.55 17.15 11.5 8.25 11.25 8.05 10.95 8 10.6 8.05 10.25 8.25 M9.15 6.6 L9.7 6.25 10 6.15 10.95 6 11.9 6.15 13 6.9 22.9 15.65 23 15.8 23.2 15.95 23.75 16.75 24 17.9 24 18.3 23.9 18.95 23.8 19.25 23.6 19.7 23.1 20.35 22.75 20.6 22.1 20.9 22.05 20.95 22 20.95 21.2 21.1 21.05 21.1 16.2 21.1 16.1 21.25 16.05 21.25 13.4 24.6 13.05 25.15 12.9 25.3 12.55 25.55 Q11.6 26.15 10.55 26 L10.5 26 Q9.65 25.85 9 25.3 L8.45 24.65 8.4 24.5 8.15 24.05 8 23.1 8 9 Q8 8.45 8.15 8.05 L8.25 7.75 8.45 7.35 9.15 6.6","M10.25 8.25 L10.6 8.05 10.95 8 11.25 8.05 11.5 8.25 21.55 17.15 21.65 17.3 21.75 17.35 21.9 17.65 22 17.9 22 18.3 21.9 18.6 21.65 18.9 21.35 19.05 21.2 19.1 21.05 19.1 15.95 19.1 15.4 19.2 14.95 19.5 14.85 19.65 14.65 19.8 11.75 23.45 11.6 23.7 11.45 23.85 10.8 24 10.25 23.75 10.05 23.4 10 23.1 10 9 10.05 8.65 10.25 8.25"),8,5,"default"),IQ=m(c("M28.55 17.8 Q29.4 20.3 28.75 22.8 L28.7 23 28.15 24.55 28.05 24.75 Q26.4 28.2 22.75 29.4 L22.45 29.5 18 29.9 17.75 29.85 Q15.8 29.25 13.8 28.1 L13.45 27.95 Q12 27.05 10.35 26.8 L10.25 26.75 7.9 26.7 7.8 26.7 Q6.1 26.9 4.8 25.8 L4.75 25.8 4.65 25.7 4.6 25.65 Q3.25 24.5 3.05 22.85 L3 22.75 Q2.8 20.95 4 19.5 5.05 18.15 6.75 17.95 L8.4 17.9 7.5 15.55 7.3 15.2 7.2 15 5 10.95 Q3.9 9.15 4.3 7.75 L4.4 7.5 Q4.75 6.15 6.45 5.2 9 3.65 11 5 11.05 4.1 11.5 3.45 12.15 2.1 14.2 1.6 L14.35 1.6 Q18.05 0.6 19.6 4.4 L19.65 4.55 Q20.75 3.65 22.7 3.75 L22.75 3.75 Q26.75 4 27 8.15 L27 8.25 27 8.35 27 8.45 Q26.9 10.75 27.1 12.6 27.15 14.65 28.2 16.75 L28.55 17.8 M26.65 18.4 L26.1 16.8 26.1 16.85 Q24.8 13.7 25 8.35 L25 8.25 Q24.85 5.9 22.6 5.75 20.7 5.65 20.4 7.35 L20.1 7.95 19.5 8.2 18.85 8.05 18.45 7.5 17.75 5.15 Q16.85 2.95 14.7 3.55 L14.65 3.55 Q12.55 4.05 13.15 6.15 L13.85 8.75 13.75 9.45 13.25 9.95 12.55 9.95 12 9.55 10.9 7.7 Q9.5 5.7 7.45 6.9 6.5 7.45 6.25 8.15 6.1 8.9 6.7 9.85 9.2 13.9 10.8 18.65 L10.8 19.3 10.4 19.8 9.75 19.95 Q8.35 19.8 6.95 19.95 6.1 20.05 5.55 20.75 4.9 21.55 5 22.55 5.15 23.55 6 24.2 L6.05 24.25 Q6.75 24.85 7.65 24.7 L7.7 24.7 10.65 24.8 Q12.7 25.15 14.45 26.2 L14.5 26.2 Q16.4 27.35 18.3 27.9 L22.05 27.5 22.1 27.5 Q24.95 26.55 26.25 23.85 L26.8 22.3 Q27.3 20.35 26.65 18.4","M26.65 18.4 Q27.3 20.35 26.8 22.3 L26.25 23.85 Q24.95 26.55 22.1 27.5 L22.05 27.5 18.3 27.9 Q16.4 27.35 14.5 26.2 L14.45 26.2 Q12.7 25.15 10.65 24.8 L7.7 24.7 7.65 24.7 Q6.75 24.85 6.05 24.25 L6 24.2 Q5.15 23.55 5 22.55 4.9 21.55 5.55 20.75 6.1 20.05 6.95 19.95 8.35 19.8 9.75 19.95 L10.4 19.8 10.8 19.3 10.8 18.65 Q9.2 13.9 6.7 9.85 6.1 8.9 6.25 8.15 6.5 7.45 7.45 6.9 9.5 5.7 10.9 7.7 L12 9.55 12.55 9.95 13.25 9.95 13.75 9.45 13.85 8.75 13.15 6.15 Q12.55 4.05 14.65 3.55 L14.7 3.55 Q16.85 2.95 17.75 5.15 L18.45 7.5 18.85 8.05 19.5 8.2 20.1 7.95 20.4 7.35 Q20.7 5.65 22.6 5.75 24.85 5.9 25 8.25 L25 8.35 Q24.8 13.7 26.1 16.85 L26.1 16.8 26.65 18.4"),12,12,"grab"),OQ=m(c("M28 14 Q28 9.85 24.45 6.9 20.95 4 16 4 11.05 4 7.5 6.9 L7.45 7 Q4 9.9 4 14 4 18.15 7.55 21.05 L7.5 21.05 Q9.2 22.45 11.2 23.2 L15.3 27.3 16 27.6 16.7 27.3 20.85 23.2 Q22.7 22.45 24.3 21.15 L24.45 21.05 Q28 18.15 28 14 M25.75 5.35 Q30.05 8.95 30 14 30.05 19.05 25.75 22.6 L25.4 22.85 Q23.8 24.1 22 24.9 L18.1 28.75 18.15 28.75 Q17.2 29.6 16 29.6 14.8 29.6 13.85 28.75 L13.9 28.75 10 24.9 6.6 22.85 6.25 22.6 Q1.95 19.05 2 14 1.95 8.95 6.25 5.35 10.3 2 16 2 21.7 2 25.75 5.35","M28 14 Q28 18.15 24.45 21.05 L24.3 21.15 Q22.7 22.45 20.85 23.2 L16.7 27.3 16 27.6 15.3 27.3 11.2 23.2 Q9.2 22.45 7.5 21.05 L7.55 21.05 Q4 18.15 4 14 4 9.9 7.45 7 L7.5 6.9 Q11.05 4 16 4 20.95 4 24.45 6.9 28 9.85 28 14"),12,21,"crosshair"),kQ=m(c("M4 13.1 L4 6 Q4 5.15 4.6 4.6 5.15 4 6 4 L13.1 4 Q13.95 4 14.55 4.6 L28.65 18.75 Q29.8 19.9 29.75 21.45 L29.75 21.6 29.75 21.7 Q29.75 23.2 28.7 24.35 L24.45 28.65 24.35 28.75 Q23.15 29.85 21.65 29.8 L21.55 29.8 21.4 29.8 Q20.2 29.8 19.25 29.15 L18 29.35 Q16.6 29.4 15.25 28 L15.2 27.95 8.2 20.95 Q7.6 20.35 7.6 19.55 7.6 18.7 8.2 18.1 L4.6 14.5 Q4 13.9 4 13.1 M19.5 26.65 L20.1 27.25 Q20.7 27.85 21.5 27.8 22.35 27.85 23 27.25 L27.25 22.95 Q27.8 22.35 27.75 21.55 27.8 20.75 27.2 20.15 L13.1 6 6 6 6 13.1 12.35 19.45 9.6 19.5 16.65 26.55 Q18.05 28.05 19.5 26.65 M8.05 12.3 L8 8 12.25 8.05 13.8 9.6 9.6 13.85 8.05 12.3 M15.25 11.05 L23 18.8 18.8 23.05 11.05 15.3 15.25 11.05","M15.25 11.05 L11.05 15.3 18.8 23.05 23 18.8 15.25 11.05 M12.35 19.45 L6 13.1 6 6 13.1 6 27.2 20.15 Q27.8 20.75 27.75 21.55 27.8 22.35 27.25 22.95 L23 27.25 Q22.35 27.85 21.5 27.8 20.7 27.85 20.1 27.25 L19.5 26.65 12.35 19.45 M8.05 12.3 L9.6 13.85 13.8 9.6 12.25 8.05 8 8 8.05 12.3",YJ),6,18,"crosshair"),EQ=m(c("M5.15 10.85 Q4 9.65 4 8.1 L4 7.95 4 7.85 Q3.95 6.2 5.1 5.15 6.25 4 7.85 4 L7.95 4 8.1 4 Q9.65 4 10.85 5.15 L11 5.3 14.3 5.25 Q15.15 5.25 15.75 5.85 L29.9 20 Q31 21.15 31 22.75 L31 22.85 31 23 Q31.05 24.5 29.9 25.7 L29.55 25.95 25.65 29.9 25.65 29.95 Q24.45 31.1 22.75 31.1 21.2 31.15 20 29.95 L5.85 15.8 Q5.25 15.2 5.25 14.35 L5.25 10.95 5.15 10.85 M19.95 24.2 L18.55 22.8 22.8 18.55 24.2 19.95 19.95 24.2 M28.45 21.4 L14.3 7.25 10.15 7.3 9.4 6.55 Q8.8 5.95 7.95 6 7.1 5.95 6.5 6.55 5.95 7.1 6 7.95 5.95 8.8 6.55 9.4 L7.25 10.1 7.25 14.35 21.4 28.5 Q22 29.1 22.75 29.1 23.6 29.1 24.2 28.5 L28.45 24.25 Q29.05 23.65 29 22.85 29.05 22 28.45 21.4 M9.25 13.5 L9.25 9.3 13.5 9.25 14.3 10.05 10.05 14.3 9.25 13.5 M17.15 21.4 L11.5 15.75 15.75 11.5 21.4 17.15 17.15 21.4","M17.15 21.4 L21.4 17.15 15.75 11.5 11.5 15.75 17.15 21.4 M28.45 21.4 Q29.05 22 29 22.85 29.05 23.65 28.45 24.25 L24.2 28.5 Q23.6 29.1 22.75 29.1 22 29.1 21.4 28.5 L7.25 14.35 7.25 10.1 6.55 9.4 Q5.95 8.8 6 7.95 5.95 7.1 6.5 6.55 7.1 5.95 7.95 6 8.8 5.95 9.4 6.55 L10.15 7.3 14.3 7.25 28.45 21.4 M19.95 24.2 L24.2 19.95 22.8 18.55 18.55 22.8 19.95 24.2 M9.25 13.5 L10.05 14.3 14.3 10.05 13.5 9.25 9.25 9.3 9.25 13.5",YJ),6,18,"crosshair"),$7=m(c("M17 2 Q18.2 2 19.15 2.9 20 3.8 20 5 L20 12 27 12 Q28.2 12 29.15 12.9 30 13.8 30 15 L30 17 Q30 18.2 29.15 19.15 28.2 20 27 20 L20 20 20 27 Q20 28.2 19.15 29.15 18.2 30 17 30 L15 30 Q13.8 30 12.9 29.15 12 28.2 12 27 L12 20 5 20 Q3.8 20 2.9 19.15 2 18.2 2 17 L2 15 Q2 13.8 2.9 12.9 3.8 12 5 12 L12 12 12 5 Q12 3.8 12.9 2.9 13.8 2 15 2 L17 2 M14 27 L14.3 27.7 Q14.6 28 15 28 L17 28 17.7 27.7 18 27 18 18.05 18.05 18 27 18 Q27.4 18 27.7 17.7 L28 17 28 15 27.7 14.3 Q27.4 14 27 14 L18 14 18 5 17.7 4.3 17 4 15 4 Q14.6 4 14.3 4.3 14 4.6 14 5 L14 14 5 14 Q4.6 14 4.3 14.3 4 14.6 4 15 L4 17 Q4 17.4 4.3 17.7 4.6 18 5 18 L14 18 14 27","M14 27 L14 18 5 18 Q4.6 18 4.3 17.7 4 17.4 4 17 L4 15 Q4 14.6 4.3 14.3 4.6 14 5 14 L14 14 14 5 Q14 4.6 14.3 4.3 14.6 4 15 4 L17 4 17.7 4.3 18 5 18 14 27 14 Q27.4 14 27.7 14.3 L28 15 28 17 27.7 17.7 Q27.4 18 27 18 L18.05 18 18 18.05 18 27 17.7 27.7 17 28 15 28 Q14.6 28 14.3 27.7 L14 27"),12,12,"crosshair"),TQ=m(c("M3.9 11.35 Q2.3 12.5 3.7 13.9 L16.4 26.65 Q17.85 28.05 19.45 26.9 L27.65 21.15 Q29.3 20 27.85 18.6 L15.15 5.85 Q13.75 4.45 12.1 5.6 L3.9 11.35 M1.05 12.4 Q1 10.95 2.75 9.75 L10.95 4 10.95 3.95 Q14 1.85 16.6 4.45 L29.3 17.2 Q30.8 18.65 30.55 20.1 30.55 21.55 28.8 22.8 L20.6 28.55 20.65 28.55 Q17.7 30.65 15 28.1 L15 28.05 2.3 15.3 2.3 15.35 Q0.8 13.85 1.05 12.4 M13.5 7 L19.85 13.35 11.65 19.15 5.3 12.75 13.5 7","M13.5 7 L5.3 12.75 11.65 19.15 19.85 13.35 13.5 7 M3.9 11.35 L12.1 5.6 Q13.75 4.45 15.15 5.85 L27.85 18.6 Q29.3 20 27.65 21.15 L19.45 26.9 Q17.85 28.05 16.4 26.65 L3.7 13.9 Q2.3 12.5 3.9 11.35"),6,14,"cell"),wQ=m(`<svg ${w7}><path d='M16 4V28M11 4H21M11 28H21' fill='none' ${T7} stroke-width='5'/><path d='M16 4V28M11 4H21M11 28H21' fill='none' stroke='${b7}' stroke-width='2.25' stroke-linecap='round'/></svg>`,12,12,"text"),bQ=m(`<svg ${w7}><path d='M6 5H21L26 10V27H6Z' fill='${b7}' ${T7} stroke-width='2.5'/><path d='M21 5V11H26' fill='none' ${T7} stroke-width='2.25'/></svg>`,5,5,"crosshair"),v=Object.freeze({browse:"default",move:AQ,hand:IQ,comment:OQ,pen:kQ,section:$7,highlighter:EQ,shape:$7,rect:$7,ellipse:$7,sticky:bQ,arrow:$7,text:wQ,eraser:TQ});import{jsx as v7,Fragment as RQ}from"react/jsx-runtime";var C7="maude:tool-sync",LJ=Object.freeze({preview:"browse",edit:"move"});function DJ(J){if(J==="browse")return"preview";if(J==="move")return"edit";return null}var yQ=Object.freeze([{id:"browse",label:"Browse",shortcut:"",cursor:v.browse},{id:"move",label:"Select",shortcut:"V",cursor:v.move},{id:"hand",label:"Hand",shortcut:"H",cursor:v.hand},{id:"comment",label:"Comment",shortcut:"C",cursor:v.comment},{id:"pen",label:"Pen",shortcut:"B",cursor:v.pen},{id:"highlighter",label:"Highlighter",shortcut:"I",cursor:v.highlighter},{id:"shape",label:"Shape",shortcut:"R",cursor:v.shape},{id:"sticky",label:"Sticky",shortcut:"N",cursor:v.sticky},{id:"section",label:"Section",shortcut:"⇧S",cursor:v.shape},{id:"arrow",label:"Arrow",shortcut:"A",cursor:v.arrow},{id:"text",label:"Text",shortcut:"T",cursor:v.text},{id:"eraser",label:"Eraser",shortcut:"E",cursor:v.eraser}]),CQ=new Set(["browse","move","hand"]);function vQ(J,Q){return Q?J.filter(($)=>CQ.has($.id)):J}var S7=xQ(null);function SQ({children:J,tools:Q=yQ,initial:$,initialMode:V}){let Z=a(),B=PJ(()=>vQ(Q,Z),[Q,Z]),W=$??(Z?"browse":"move"),K=V??DJ(W)??(Z?"preview":"edit"),[H,j]=H7(W),[N,X]=H7(K),[z,Y]=H7(()=>({tool:null,locked:!1})),U=V7((I)=>{if(!B.some((k)=>k.id===I))return;j(I);let E=DJ(I);if(E)X(E);Y((k)=>k.locked&&k.tool===I?k:{tool:null,locked:!1})},[B]),D=V7((I)=>{let E=LJ[I];if(!B.some((k)=>k.id===E))return;X(I),j(E),Y((k)=>k.locked&&k.tool===E?k:{tool:null,locked:!1})},[B]),A=V7(()=>{U(LJ[N])},[N,U]),q=V7((I)=>{Y((E)=>{if(E.locked&&E.tool===I)return{tool:null,locked:!1};return{tool:I,locked:!0}}),j(I)},[]),F=V7(()=>{Y({tool:null,locked:!1})},[]),[_,P]=H7("rounded"),G=y7(Math.random().toString(36).slice(2)),L=y7(H);L.current=H;let O=y7(!1);x7(()=>{if(!O.current){O.current=!0;return}if(typeof document>"u")return;document.dispatchEvent(new CustomEvent(C7,{detail:{tool:H,from:G.current}}))},[H]),x7(()=>{if(typeof document>"u")return;let I=(E)=>{let k=E.detail;if(!k||k.from===G.current||typeof k.tool!=="string")return;if(k.tool===L.current)return;U(k.tool)};return document.addEventListener(C7,I),()=>document.removeEventListener(C7,I)},[U]),x7(()=>{if(typeof document>"u")return;let I=B.find((w)=>w.id===H);if(!I)return;let E=document.body.style.cursor,k=document.getElementById("dc-tool-cursor");if(!k)k=document.createElement("style"),k.id="dc-tool-cursor",document.head.appendChild(k);if(H==="browse"){if(document.body.style.cursor="",k.textContent="",typeof window<"u"&&window.parent&&window.parent!==window)try{window.parent.postMessage({dgn:"tool-cursor",tool:H},"*")}catch{}return()=>{document.body.style.cursor=E}}if(document.body.style.cursor=I.cursor,k.textContent=`* { cursor: ${I.cursor} !important; }`,typeof window<"u"&&window.parent&&window.parent!==window)try{window.parent.postMessage({dgn:"tool-cursor",tool:H},"*")}catch{}return()=>{document.body.style.cursor=E;let w=document.getElementById("dc-tool-cursor");if(w)w.textContent=""}},[H,B]);let M=PJ(()=>({tool:H,setTool:U,tools:B,mode:N,setMode:D,resetTool:A,sticky:z,toggleSticky:q,clearSticky:F,shapeKind:_,setShapeKind:P}),[H,U,B,N,D,A,z,q,F,_]);return v7(S7.Provider,{value:M,children:J})}function jJ({children:J,initial:Q,initialMode:$}){if(MJ(S7))return v7(RQ,{children:J});return v7(SQ,{initial:Q,initialMode:$,children:J})}function X7(){let J=MJ(S7);if(!J)throw Error("useToolMode must be used inside <ToolProvider>");return J}import{jsx as oQ}from"react/jsx-runtime";var hQ=`
2
2
  .dc-el-resize-handle {
3
3
  position: fixed;
4
4
  width: 8px;
@@ -56,4 +56,4 @@ import{Component as aQ,createElement as h7,useCallback as R7,useEffect as p,useM
56
56
  @media (prefers-reduced-motion: reduce) {
57
57
  .dc-el-resize-handle, .dc-el-resize-readout { transition-duration: 1ms; }
58
58
  }
59
- `.trim();function fQ(){if(typeof document>"u")return;if(document.getElementById("dc-el-resize-css"))return;let J=document.createElement("style");J.id="dc-el-resize-css",J.textContent=hQ,document.head.appendChild(J)}var pQ=["nw","n","ne","e","se","s","sw","w"];function uQ(J){return{movesLeft:J==="nw"||J==="w"||J==="sw",movesRight:J==="ne"||J==="e"||J==="se",movesTop:J==="nw"||J==="n"||J==="ne",movesBottom:J==="sw"||J==="s"||J==="se"}}var n=(J)=>Math.round(J*100)/100,Y7=1;function mQ(J,Q,$,V,Z,G){let{movesLeft:W,movesRight:K,movesTop:H,movesBottom:j}=uQ(J),N=Z.center,X=Q.w,z=Q.h;if(K)X=Q.w+(N?2*$:$);else if(W)X=Q.w-(N?2*$:$);if(j)z=Q.h+(N?2*V:V);else if(H)z=Q.h-(N?2*V:V);if(Z.aspect&&Q.w>0&&Q.h>0){let U=Q.w/Q.h;if((W||K)&&(H||j)){let A=Math.abs(X-Q.w)/Q.w,q=Math.abs(z-Q.h)/Q.h;if(A>=q)z=X/U;else X=z*U}else if(W||K)z=X/U;else if(H||j)X=z*U}if(X<Y7)X=Y7;if(z<Y7)z=Y7;let Y={width:n(X),height:n(z)};if(N){if(G.canMoveLeft&&(W||K))Y.left=n(Q.left+(Q.w-X)/2);if(G.canMoveTop&&(H||j))Y.top=n(Q.top+(Q.h-z)/2)}else{if(G.canMoveLeft&&W)Y.left=n(Q.left+Q.w-X);if(G.canMoveTop&&H)Y.top=n(Q.top+Q.h-z)}return Y}function _J(J){if(!J||J==="none")return 0;let Q=/matrix\(([^)]+)\)/.exec(J);if(!Q)return 0;let $=Q[1].split(",").map(Number),V=$[0]??1,Z=$[1]??0;return Math.round(Math.atan2(Z,V)*(180/Math.PI)*100)/100}function dQ(J){if(!J||J==="none")return 1;let Q=/matrix\(([^)]+)\)/.exec(J);if(!Q)return 1;let $=Q[1].split(",").map(Number),V=$[0]??1,Z=$[1]??0,G=Math.hypot(V,Z);return G>0?G:1}function cQ(J){let Q=J.closest(".dc-world");if(!Q)return 1;let $=getComputedStyle(Q),V=Number.parseFloat($.zoom||"1")||1;return dQ($.transform)*V}function AJ(J,Q,$){let V=$*Math.PI/180,Z=Math.cos(V),G=Math.sin(V);return[J*Z-Q*G,J*G+Q*Z]}function IJ(J,Q,$,V){return Math.atan2(V-Q,$-J)}function iQ(J,Q,$,V){let Z=J+($-Q)*(180/Math.PI);while(Z>180)Z-=360;while(Z<=-180)Z+=360;if(V)Z=Math.round(Z/15)*15;return Math.round(Z*100)/100}function lQ(J,Q){let $={width:`${Q.width}px`,height:`${Q.height}px`};if(typeof Q.left==="number")$.left=`${Q.left}px`;if(typeof Q.top==="number")$.top=`${Q.top}px`;try{window.parent.postMessage({dgn:"resize-request",id:J.cdId,patch:$,before:J.before,idIndex:J.idIndex},"*")}catch{}}function rQ(J,Q){if(!J.artboardId)return;try{window.parent.postMessage({dgn:"resize-artboard-request",artboardId:J.artboardId,width:Q.width,height:Q.height},"*")}catch{}}function nQ(J,Q){try{window.parent.postMessage({dgn:"resize-request",id:J.cdId,patch:{transform:Q},before:J.before,idIndex:J.idIndex},"*")}catch{}}function OJ(){fQ();let{selected:J}=z7(),{tool:Q}=X7(),$=F7(null),V=F7(null),Z=F7(null),G=F7(null),W=J.length===1?J[0]:null,K=W&&typeof W.id==="string"?W.id:null,H=W&&!K&&typeof W.artboardId==="string"?W.artboardId:null,j=Q==="move"&&(!!K||!!H);NJ(()=>{let X=$.current;if(!X)return;let z=()=>{for(let U of Array.from(X.children)){let D=U;D.style.opacity="0",D.style.pointerEvents="none"}};if(!j||!W){z();return}let Y=()=>{if(V.current=null,FJ()){z(),V.current=requestAnimationFrame(Y);return}let U=D7(document,W);if(!U){z(),V.current=requestAnimationFrame(Y);return}let D=U.getBoundingClientRect();if(D.width<=0&&D.height<=0){z(),V.current=requestAnimationFrame(Y);return}let A=H?["e","s","se"]:pQ,q=H?[]:["rot-nw","rot-ne","rot-sw","rot-se"],F=A.length+q.length+1;while(X.children.length<F)X.appendChild(document.createElement("div"));while(X.children.length>F)X.lastChild&&X.removeChild(X.lastChild);let _=D.left+D.width/2,P=D.top+D.height/2,B=_J(getComputedStyle(U).transform),L=cQ(U),O=U.offsetWidth*L/2,M=U.offsetHeight*L/2,I={nw:[-O,-M],n:[0,-M],ne:[O,-M],e:[O,0],se:[O,M],s:[0,M],sw:[-O,M],w:[-O,0],"rot-nw":[-O,-M],"rot-ne":[O,-M],"rot-sw":[-O,M],"rot-se":[O,M]},E=[...q,...A];for(let f=0;f<E.length;f++){let y=E[f],C=X.children[f],[d,i]=I[y]??[0,0],[bJ,xJ]=AJ(d,i,B),yJ=_+bJ,CJ=P+xJ,P7=y.startsWith("rot-"),p7=y==="n"||y==="s",u7=y==="e"||y==="w",vJ=P7?10:p7?7:u7?3:4,SJ=P7?10:p7?3:u7?7:4;C.className="dc-el-resize-handle",C.dataset.corner=y,C.style.opacity="1",C.style.pointerEvents="auto",C.style.left=`${Math.round(yJ-vJ)}px`,C.style.top=`${Math.round(CJ-SJ)}px`,C.style.transform=P7?"":`rotate(${B}deg)`}let k=X.children[E.length],w=Z.current;if(w&&w.el===U&&!w.corner.startsWith("rot-")){let f=w.lastResult?.width??U.offsetWidth,y=w.lastResult?.height??U.offsetHeight,C=`${Math.round(f)} × ${Math.round(y)}`,d=w.lastResult?.left,i=w.lastResult?.top;if(typeof d==="number"||typeof i==="number")C+=` · ${Math.round(d??w.start.left)}, ${Math.round(i??w.start.top)}`;k.className="dc-el-resize-readout",k.textContent=C,k.style.opacity="1",k.style.left=`${Math.round(_)}px`,k.style.top=`${Math.round(P+M)}px`}else k.style.opacity="0";V.current=requestAnimationFrame(Y)};return V.current=requestAnimationFrame(Y),()=>{if(V.current!=null)cancelAnimationFrame(V.current)}},[j,W,H]);let N=gQ((X,z)=>{if(X.el.style.width=`${z.width}px`,X.el.style.height=`${z.height}px`,typeof z.left==="number")X.el.style.left=`${z.left}px`;if(typeof z.top==="number")X.el.style.top=`${z.top}px`;X.lastResult=z},[]);return NJ(()=>{let X=$.current;if(!X)return;let z=(q,F)=>{let[_,P]=AJ(F.clientX-q.startClientX,F.clientY-q.startClientY,-q.angle);return mQ(q.corner,q.start,_/q.elZoom,P/q.elZoom,{aspect:!!F.shiftKey,center:!q.artboardId&&!!F.altKey},q.flags)},Y=(q)=>{let F=q.target;if(!F?.classList.contains("dc-el-resize-handle"))return;let _=F.dataset.corner;if(!_||!W)return;let P=typeof W.id==="string"?W.id:null,B=!P&&typeof W.artboardId==="string"?W.artboardId:null;if(!P&&!B)return;let L=D7(document,W);if(!L)return;q.preventDefault(),q.stopPropagation();let O=L.getBoundingClientRect(),M=L.offsetWidth?O.width/L.offsetWidth:1,I=getComputedStyle(L),E=!B&&(I.position==="absolute"||I.position==="fixed"),k=B?Number.NaN:Number.parseFloat(L.style.left),w=B?Number.NaN:Number.parseFloat(L.style.top),f=B?0:_J(I.transform),y=M>0?M:1,C=O.left+O.width/2,d=O.top+O.height/2,i={pointerId:q.pointerId,corner:_,el:L,cdId:P??"",artboardId:B,idIndex:P?s7(document,P,L):0,startClientX:q.clientX,startClientY:q.clientY,elZoom:y,angle:f,cx:C,cy:d,rotStartPointer:IJ(C,d,q.clientX,q.clientY),start:{w:(f?L.offsetWidth:O.width/y)||O.width/y,h:(f?L.offsetHeight:O.height/y)||O.height/y,left:k,top:w},flags:{canMoveLeft:E&&Number.isFinite(k),canMoveTop:E&&Number.isFinite(w)},before:{width:L.style.width||null,height:L.style.height||null,left:L.style.left||null,top:L.style.top||null,transform:L.style.transform||null},lastResult:null,lastTransform:null};Z.current=i;try{F.setPointerCapture(q.pointerId)}catch{}},U=(q)=>{let F=Z.current;if(!F||q.pointerId!==F.pointerId)return;if(q.preventDefault(),F.corner.startsWith("rot-")){let P=`rotate(${iQ(F.angle,F.rotStartPointer,IJ(F.cx,F.cy,q.clientX,q.clientY),!!q.shiftKey)}deg)`;F.el.style.transform=P,F.lastTransform=P;return}N(F,z(F,q))},D=(q)=>{let F=Z.current;if(!F||q.pointerId!==F.pointerId)return;if(Z.current=null,F.corner.startsWith("rot-")){let B=F.lastTransform;if(!B||B===F.before.transform)return;G.current={el:F.el,before:F.before},nQ(F,B);return}let _=F.lastResult??z(F,q);if(!(`${_.width}px`!==F.before.width||`${_.height}px`!==F.before.height||typeof _.left==="number"&&`${_.left}px`!==F.before.left||typeof _.top==="number"&&`${_.top}px`!==F.before.top))return;if(G.current={el:F.el,before:F.before},F.artboardId)rQ(F,_);else lQ(F,_)},A=(q)=>{let F=q.data;if(F?.dgn!=="resize-failed"&&F?.dgn!=="resize-artboard-failed")return;if(q.source!==window.parent)return;let _=G.current;if(!_)return;if(_.el.style.width=_.before.width??"",_.el.style.height=_.before.height??"",_.before.left!==null||_.el.style.left)_.el.style.left=_.before.left??"";if(_.before.top!==null||_.el.style.top)_.el.style.top=_.before.top??"";if(_.before.transform!==null||_.el.style.transform)_.el.style.transform=_.before.transform??"";G.current=null};return X.addEventListener("pointerdown",Y),window.addEventListener("pointermove",U),window.addEventListener("pointerup",D),window.addEventListener("pointercancel",D),window.addEventListener("message",A),()=>{X.removeEventListener("pointerdown",Y),window.removeEventListener("pointermove",U),window.removeEventListener("pointerup",D),window.removeEventListener("pointercancel",D),window.removeEventListener("message",A)}},[W,N]),oQ("div",{ref:$,"aria-hidden":"true"})}import{jsx as S,jsxs as wJ,Fragment as W0}from"react/jsx-runtime";var eQ=new Set(["drop-comment","tool","escape","hover"]);function q7(){return typeof document<"u"&&!document.querySelector(".dc-canvas")}function f7(J,Q){if(typeof document>"u")return null;let $=document.elementFromPoint(J,Q);if(!$)return null;if($.closest(".cm-composer, .cm-thread, .cm-mention-popup, .cm-pin, [data-mc-hover-halo], [data-mc-selection-halo], .dc-el-resize-handle"))return null;let V=$.tagName;if(V==="HTML"||V==="BODY")return null;return $}function J0(J,Q){let $=f7(J,Q);if(!$)return null;return $.closest("[data-cd-id]")??$}function Q0({children:J,file:Q}){let{tool:$,setTool:V}=X7(),Z=z7(),G=u(null),[W,K]=Z7(null),H=u($);H.current=$;let j=sQ(()=>()=>H.current,[]);p(()=>{if($!=="comment")K(null)},[$]);let[N,X]=Z7(null),[z,Y]=Z7(!1);return p(()=>{let U=()=>Y(q7());U();let D=requestAnimationFrame(U),A=setTimeout(U,120);return()=>{cancelAnimationFrame(D),clearTimeout(A)}},[]),p(()=>{if(typeof document>"u")return;let U=(D)=>{if(D.button!==0||!(D.metaKey||D.ctrlKey))return;if(!q7())return;if(Q7(D.target))return;let A=J0(D.clientX,D.clientY);if(!A)return;D.preventDefault(),D.stopImmediatePropagation();let q=A.getAttribute("data-cd-id"),F=M7({el:A,cdId:q,artboardId:null});if(D.shiftKey)Z.add(F);else Z.replace(F);X(A)};return document.addEventListener("pointerdown",U,!0),()=>document.removeEventListener("pointerdown",U,!0)},[Z]),p(()=>{if(Z.selected.length===0)X(null)},[Z.selected]),p(()=>{let U=G.current;if(U)U.setAttribute("data-active-tool",$);if(typeof document<"u"&&document.body)document.body.setAttribute("data-active-tool",$);return()=>{U?.removeAttribute("data-active-tool")}},[$]),p(()=>{if(typeof window>"u")return;let U=(D)=>{let A=D.data;if(!A||typeof A!=="object"||A.dgn!=="tool-set")return;if(typeof A.tool==="string")V(A.tool)};return window.addEventListener("message",U),()=>window.removeEventListener("message",U)},[V]),XJ({hostRef:G,getActiveTool:j,claimableActions:eQ,callbacks:{onHover:({clientX:U,clientY:D})=>{if(H.current!=="comment"||!q7()){K(null);return}let A=f7(U,D);K((q)=>q===A?q:A)},onTool:({tool:U})=>V(U),onEscape:()=>{if(H.current!=="move")V("move");if(K(null),Z.clear(),typeof window<"u")try{window.parent.postMessage({dgn:"force-clear"},"*")}catch{}},onDropComment:({clientX:U,clientY:D})=>Z0(U,D,Z,Q)}}),wJ("div",{"data-mc-host":!0,ref:G,style:{display:"contents"},children:[J,W?S(V0,{el:W}):null,N?S($0,{el:N}):null,z?S(OJ,{}):null,S(zJ,{})]})}function $0({el:J}){let Q=u(null),$=u(J);$.current=J;let V=u(null);return p(()=>{let Z=()=>{V.current=null;let G=Q.current,W=$.current;if(G&&W?.isConnected){let K=W.getBoundingClientRect();if(K.width===0&&K.height===0)G.style.display="none";else G.style.display="block",G.style.left=`${Math.round(K.left)}px`,G.style.top=`${Math.round(K.top)}px`,G.style.width=`${Math.round(K.width)}px`,G.style.height=`${Math.round(K.height)}px`}else if(G)G.style.display="none";V.current=requestAnimationFrame(Z)};return V.current=requestAnimationFrame(Z),()=>{if(V.current!=null)cancelAnimationFrame(V.current)}},[]),S("div",{ref:Q,"aria-hidden":"true","data-mc-selection-halo":"",style:{position:"fixed",display:"none",pointerEvents:"none",zIndex:2147483645,border:"1.5px solid var(--maude-hud-accent, oklch(0.680 0.180 268))",borderRadius:"3px",boxSizing:"border-box"}})}function V0({el:J}){let Q=u(null),$=u(J);$.current=J;let V=u(null);return p(()=>{let Z=()=>{V.current=null;let G=Q.current,W=$.current;if(G&&W?.isConnected){let K=W.getBoundingClientRect();if(K.width===0&&K.height===0)G.style.display="none";else G.style.display="block",G.style.left=`${Math.round(K.left)}px`,G.style.top=`${Math.round(K.top)}px`,G.style.width=`${Math.round(K.width)}px`,G.style.height=`${Math.round(K.height)}px`}else if(G)G.style.display="none";V.current=requestAnimationFrame(Z)};return V.current=requestAnimationFrame(Z),()=>{if(V.current!=null)cancelAnimationFrame(V.current)}},[]),S("div",{ref:Q,"aria-hidden":"true","data-mc-hover-halo":"",style:{position:"fixed",display:"none",pointerEvents:"none",zIndex:2147483646,border:"2px solid var(--maude-hud-accent, #d63b1f)",borderRadius:"3px",boxSizing:"border-box"}})}function Z0(J,Q,$,V){if(typeof document>"u")return;let Z=c7(J,Q)??void 0,G=l7(J,Q);if(G){let H=G7(G),j=H?.getBoundingClientRect(),N={file:V,id:void 0,selector:"",artboardId:null,tag:H?.getAttribute("data-tool")??"annotation",classes:"",text:"",dom_path:[],bounds:j?{x:j.left,y:j.top,w:j.width,h:j.height}:{x:J-12,y:Q-12,w:24,h:24},html:"",annotationId:G,...Z?{world:Z}:{}};g7(N,J,Q);return}let W=E7(document,J,Q,{deep:!0});if(!W)W=E7(document,J,Q,{deep:!1});if(!W&&!q7()&&typeof document.elementsFromPoint==="function"){let H=document.elementsFromPoint(J,Q);for(let j of H){let N=j.closest?.("[data-cd-id]");if(!N)continue;if(!N.closest(".dc-artboard-body"))continue;let X=N.closest("[data-dc-screen]");W={el:N,cdId:N.getAttribute("data-cd-id"),artboardId:X?.getAttribute("data-dc-screen")??null};break}}if(!W&&q7()){let H=f7(J,Q);if(H)W={el:H,cdId:H.getAttribute("data-cd-id"),artboardId:null}}if(!W){let H={file:V,id:void 0,selector:"",artboardId:null,tag:"",classes:"",text:"",dom_path:[],bounds:{x:J-12,y:Q-12,w:24,h:24},html:"",...Z?{world:Z}:{}};g7(H,J,Q);return}let K=M7(W,V);$.replace(K),g7(K,J,Q)}function g7(J,Q,$){if(typeof document<"u")try{document.dispatchEvent(new CustomEvent("cm:open-composer",{detail:{selection:J,clientX:Q,clientY:$}}))}catch{}if(typeof window<"u")try{window.parent.postMessage({dgn:"comment-compose",selection:J},"*")}catch{}}function EJ(J,Q){return S(jJ,{initial:"browse",children:S(VJ,{children:S(Q0,{file:Q,children:S(J,{})})})})}function D3(J,Q){let $=tQ(Q.rootEl);if(!Q.commentsEnabled){$.render(h7(J));return}let V=Q.file??L7();$.render(h7(B0,{initialCanvas:J,file:V}))}var kJ="__maudeCanvasRuntime";function q0({Canvas:J,file:Q,onOk:$}){return p(()=>{$()},[]),EJ(J,Q)}class TJ extends aQ{state={hasError:!1};static getDerivedStateFromError(){return{hasError:!0}}componentDidCatch(){this.props.onError()}componentDidUpdate(J){if(J.attempt!==this.props.attempt&&this.state.hasError)this.setState({hasError:!1})}render(){if(this.state.hasError)return this.props.fallback();return this.props.children}}function G0({message:J}){return h7("div",{className:"dc-hmr-holding",role:"status","aria-live":"polite",title:J?`Holding last working render — ${J}`:"Holding last working render"},"⏸ build error — držím poslední funkční verzi")}function B0({initialCanvas:J,file:Q}){let[{canvas:$,attempt:V},Z]=Z7({canvas:J,attempt:0}),[G,W]=Z7({on:!1}),K=u(null),H=u($);H.current=$,p(()=>{let z={remount:(Y)=>Z((U)=>({canvas:Y,attempt:U.attempt+1})),setHolding:(Y,U)=>W(Y?{on:!0,message:U}:{on:!1})};return window[kJ]=z,()=>{window[kJ]=void 0}},[]);let j=R7(()=>{if(K.current=H.current,W((z)=>z.on?{on:!1}:z),V>0&&Q)try{window.parent.postMessage({dgn:"loaded",file:Q},"*")}catch{}},[V,Q]),N=R7(()=>{W({on:!0,message:"render error"})},[]),X=R7(()=>{let z=K.current;return z?EJ(z,Q):null},[Q]);return wJ(W0,{children:[S(TJ,{attempt:V,onError:N,fallback:X,children:S(q0,{Canvas:$,file:Q,onOk:j},V)}),G.on?S(G0,{message:G.message}):null]})}export{J0 as pickSpecimenSelectEl,D3 as mountCanvas,q7 as isBareSpecimen,TJ as CanvasErrorBoundary};
59
+ `.trim();function fQ(){if(typeof document>"u")return;if(document.getElementById("dc-el-resize-css"))return;let J=document.createElement("style");J.id="dc-el-resize-css",J.textContent=hQ,document.head.appendChild(J)}var pQ=["nw","n","ne","e","se","s","sw","w"];function uQ(J){return{movesLeft:J==="nw"||J==="w"||J==="sw",movesRight:J==="ne"||J==="e"||J==="se",movesTop:J==="nw"||J==="n"||J==="ne",movesBottom:J==="sw"||J==="s"||J==="se"}}var n=(J)=>Math.round(J*100)/100,Y7=1;function mQ(J,Q,$,V,Z,B){let{movesLeft:W,movesRight:K,movesTop:H,movesBottom:j}=uQ(J),N=Z.center,X=Q.w,z=Q.h;if(K)X=Q.w+(N?2*$:$);else if(W)X=Q.w-(N?2*$:$);if(j)z=Q.h+(N?2*V:V);else if(H)z=Q.h-(N?2*V:V);if(Z.aspect&&Q.w>0&&Q.h>0){let U=Q.w/Q.h;if((W||K)&&(H||j)){let A=Math.abs(X-Q.w)/Q.w,q=Math.abs(z-Q.h)/Q.h;if(A>=q)z=X/U;else X=z*U}else if(W||K)z=X/U;else if(H||j)X=z*U}if(X<Y7)X=Y7;if(z<Y7)z=Y7;let Y={width:n(X),height:n(z)};if(N){if(B.canMoveLeft&&(W||K))Y.left=n(Q.left+(Q.w-X)/2);if(B.canMoveTop&&(H||j))Y.top=n(Q.top+(Q.h-z)/2)}else{if(B.canMoveLeft&&W)Y.left=n(Q.left+Q.w-X);if(B.canMoveTop&&H)Y.top=n(Q.top+Q.h-z)}return Y}function _J(J){if(!J||J==="none")return 0;let Q=/matrix\(([^)]+)\)/.exec(J);if(!Q)return 0;let $=Q[1].split(",").map(Number),V=$[0]??1,Z=$[1]??0;return Math.round(Math.atan2(Z,V)*(180/Math.PI)*100)/100}function dQ(J){if(!J||J==="none")return 1;let Q=/matrix\(([^)]+)\)/.exec(J);if(!Q)return 1;let $=Q[1].split(",").map(Number),V=$[0]??1,Z=$[1]??0,B=Math.hypot(V,Z);return B>0?B:1}function cQ(J){let Q=J.closest(".dc-world");if(!Q)return 1;let $=getComputedStyle(Q),V=Number.parseFloat($.zoom||"1")||1;return dQ($.transform)*V}function AJ(J,Q,$){let V=$*Math.PI/180,Z=Math.cos(V),B=Math.sin(V);return[J*Z-Q*B,J*B+Q*Z]}function IJ(J,Q,$,V){return Math.atan2(V-Q,$-J)}function iQ(J,Q,$,V){let Z=J+($-Q)*(180/Math.PI);while(Z>180)Z-=360;while(Z<=-180)Z+=360;if(V)Z=Math.round(Z/15)*15;return Math.round(Z*100)/100}function lQ(J,Q){let $={width:`${Q.width}px`,height:`${Q.height}px`};if(typeof Q.left==="number")$.left=`${Q.left}px`;if(typeof Q.top==="number")$.top=`${Q.top}px`;try{window.parent.postMessage({dgn:"resize-request",id:J.cdId,patch:$,before:J.before,idIndex:J.idIndex},"*")}catch{}}function rQ(J,Q){if(!J.artboardId)return;try{window.parent.postMessage({dgn:"resize-artboard-request",artboardId:J.artboardId,width:Q.width,height:Q.height},"*")}catch{}}function nQ(J,Q){try{window.parent.postMessage({dgn:"resize-request",id:J.cdId,patch:{transform:Q},before:J.before,idIndex:J.idIndex},"*")}catch{}}function OJ(){fQ();let{selected:J}=z7(),{tool:Q}=X7(),$=F7(null),V=F7(null),Z=F7(null),B=F7(null),W=J.length===1?J[0]:null,K=W&&typeof W.id==="string"?W.id:null,H=W&&!K&&typeof W.artboardId==="string"?W.artboardId:null,j=Q==="move"&&(!!K||!!H);NJ(()=>{let X=$.current;if(!X)return;let z=()=>{for(let U of Array.from(X.children)){let D=U;D.style.opacity="0",D.style.pointerEvents="none"}};if(!j||!W){z();return}let Y=()=>{if(V.current=null,FJ()){z(),V.current=requestAnimationFrame(Y);return}let U=D7(document,W);if(!U){z(),V.current=requestAnimationFrame(Y);return}let D=U.getBoundingClientRect();if(D.width<=0&&D.height<=0){z(),V.current=requestAnimationFrame(Y);return}let A=H?["e","s","se"]:pQ,q=H?[]:["rot-nw","rot-ne","rot-sw","rot-se"],F=A.length+q.length+1;while(X.children.length<F)X.appendChild(document.createElement("div"));while(X.children.length>F)X.lastChild&&X.removeChild(X.lastChild);let _=D.left+D.width/2,P=D.top+D.height/2,G=_J(getComputedStyle(U).transform),L=cQ(U),O=U.offsetWidth*L/2,M=U.offsetHeight*L/2,I={nw:[-O,-M],n:[0,-M],ne:[O,-M],e:[O,0],se:[O,M],s:[0,M],sw:[-O,M],w:[-O,0],"rot-nw":[-O,-M],"rot-ne":[O,-M],"rot-sw":[-O,M],"rot-se":[O,M]},E=[...q,...A];for(let f=0;f<E.length;f++){let y=E[f],C=X.children[f],[d,i]=I[y]??[0,0],[bJ,xJ]=AJ(d,i,G),yJ=_+bJ,CJ=P+xJ,P7=y.startsWith("rot-"),p7=y==="n"||y==="s",u7=y==="e"||y==="w",vJ=P7?10:p7?7:u7?3:4,SJ=P7?10:p7?3:u7?7:4;C.className="dc-el-resize-handle",C.dataset.corner=y,C.style.opacity="1",C.style.pointerEvents="auto",C.style.left=`${Math.round(yJ-vJ)}px`,C.style.top=`${Math.round(CJ-SJ)}px`,C.style.transform=P7?"":`rotate(${G}deg)`}let k=X.children[E.length],w=Z.current;if(w&&w.el===U&&!w.corner.startsWith("rot-")){let f=w.lastResult?.width??U.offsetWidth,y=w.lastResult?.height??U.offsetHeight,C=`${Math.round(f)} × ${Math.round(y)}`,d=w.lastResult?.left,i=w.lastResult?.top;if(typeof d==="number"||typeof i==="number")C+=` · ${Math.round(d??w.start.left)}, ${Math.round(i??w.start.top)}`;k.className="dc-el-resize-readout",k.textContent=C,k.style.opacity="1",k.style.left=`${Math.round(_)}px`,k.style.top=`${Math.round(P+M)}px`}else k.style.opacity="0";V.current=requestAnimationFrame(Y)};return V.current=requestAnimationFrame(Y),()=>{if(V.current!=null)cancelAnimationFrame(V.current)}},[j,W,H]);let N=gQ((X,z)=>{if(X.el.style.width=`${z.width}px`,X.el.style.height=`${z.height}px`,typeof z.left==="number")X.el.style.left=`${z.left}px`;if(typeof z.top==="number")X.el.style.top=`${z.top}px`;X.lastResult=z},[]);return NJ(()=>{let X=$.current;if(!X)return;let z=(q,F)=>{let[_,P]=AJ(F.clientX-q.startClientX,F.clientY-q.startClientY,-q.angle);return mQ(q.corner,q.start,_/q.elZoom,P/q.elZoom,{aspect:!!F.shiftKey,center:!q.artboardId&&!!F.altKey},q.flags)},Y=(q)=>{let F=q.target;if(!F?.classList.contains("dc-el-resize-handle"))return;let _=F.dataset.corner;if(!_||!W)return;let P=typeof W.id==="string"?W.id:null,G=!P&&typeof W.artboardId==="string"?W.artboardId:null;if(!P&&!G)return;let L=D7(document,W);if(!L)return;q.preventDefault(),q.stopPropagation();let O=L.getBoundingClientRect(),M=L.offsetWidth?O.width/L.offsetWidth:1,I=getComputedStyle(L),E=!G&&(I.position==="absolute"||I.position==="fixed"),k=G?Number.NaN:Number.parseFloat(L.style.left),w=G?Number.NaN:Number.parseFloat(L.style.top),f=G?0:_J(I.transform),y=M>0?M:1,C=O.left+O.width/2,d=O.top+O.height/2,i={pointerId:q.pointerId,corner:_,el:L,cdId:P??"",artboardId:G,idIndex:P?s7(document,P,L):0,startClientX:q.clientX,startClientY:q.clientY,elZoom:y,angle:f,cx:C,cy:d,rotStartPointer:IJ(C,d,q.clientX,q.clientY),start:{w:(f?L.offsetWidth:O.width/y)||O.width/y,h:(f?L.offsetHeight:O.height/y)||O.height/y,left:k,top:w},flags:{canMoveLeft:E&&Number.isFinite(k),canMoveTop:E&&Number.isFinite(w)},before:{width:L.style.width||null,height:L.style.height||null,left:L.style.left||null,top:L.style.top||null,transform:L.style.transform||null},lastResult:null,lastTransform:null};Z.current=i;try{F.setPointerCapture(q.pointerId)}catch{}},U=(q)=>{let F=Z.current;if(!F||q.pointerId!==F.pointerId)return;if(q.preventDefault(),F.corner.startsWith("rot-")){let P=`rotate(${iQ(F.angle,F.rotStartPointer,IJ(F.cx,F.cy,q.clientX,q.clientY),!!q.shiftKey)}deg)`;F.el.style.transform=P,F.lastTransform=P;return}N(F,z(F,q))},D=(q)=>{let F=Z.current;if(!F||q.pointerId!==F.pointerId)return;if(Z.current=null,F.corner.startsWith("rot-")){let G=F.lastTransform;if(!G||G===F.before.transform)return;B.current={el:F.el,before:F.before},nQ(F,G);return}let _=F.lastResult??z(F,q);if(!(`${_.width}px`!==F.before.width||`${_.height}px`!==F.before.height||typeof _.left==="number"&&`${_.left}px`!==F.before.left||typeof _.top==="number"&&`${_.top}px`!==F.before.top))return;if(B.current={el:F.el,before:F.before},F.artboardId)rQ(F,_);else lQ(F,_)},A=(q)=>{let F=q.data;if(F?.dgn!=="resize-failed"&&F?.dgn!=="resize-artboard-failed")return;if(q.source!==window.parent)return;let _=B.current;if(!_)return;if(_.el.style.width=_.before.width??"",_.el.style.height=_.before.height??"",_.before.left!==null||_.el.style.left)_.el.style.left=_.before.left??"";if(_.before.top!==null||_.el.style.top)_.el.style.top=_.before.top??"";if(_.before.transform!==null||_.el.style.transform)_.el.style.transform=_.before.transform??"";B.current=null};return X.addEventListener("pointerdown",Y),window.addEventListener("pointermove",U),window.addEventListener("pointerup",D),window.addEventListener("pointercancel",D),window.addEventListener("message",A),()=>{X.removeEventListener("pointerdown",Y),window.removeEventListener("pointermove",U),window.removeEventListener("pointerup",D),window.removeEventListener("pointercancel",D),window.removeEventListener("message",A)}},[W,N]),oQ("div",{ref:$,"aria-hidden":"true"})}import{jsx as S,jsxs as wJ,Fragment as W0}from"react/jsx-runtime";var eQ=new Set(["drop-comment","tool","escape","hover"]);function q7(){return typeof document<"u"&&!document.querySelector(".dc-canvas")}function f7(J,Q){if(typeof document>"u")return null;let $=document.elementFromPoint(J,Q);if(!$)return null;if($.closest(".cm-composer, .cm-thread, .cm-mention-popup, .cm-pin, [data-mc-hover-halo], [data-mc-selection-halo], .dc-el-resize-handle"))return null;let V=$.tagName;if(V==="HTML"||V==="BODY")return null;return $}function J0(J,Q){let $=f7(J,Q);if(!$)return null;return $.closest("[data-cd-id]")??$}function Q0({children:J,file:Q}){let{tool:$,setTool:V}=X7(),Z=z7(),B=u(null),[W,K]=Z7(null),H=u($);H.current=$;let j=sQ(()=>()=>H.current,[]);p(()=>{if($!=="comment")K(null)},[$]);let[N,X]=Z7(null),[z,Y]=Z7(!1);return p(()=>{let U=()=>Y(q7());U();let D=requestAnimationFrame(U),A=setTimeout(U,120);return()=>{cancelAnimationFrame(D),clearTimeout(A)}},[]),p(()=>{if(typeof document>"u")return;let U=(D)=>{if(D.button!==0||!(D.metaKey||D.ctrlKey))return;if(!q7())return;if(Q7(D.target))return;let A=J0(D.clientX,D.clientY);if(!A)return;D.preventDefault(),D.stopImmediatePropagation();let q=A.getAttribute("data-cd-id"),F=M7({el:A,cdId:q,artboardId:null});if(D.shiftKey)Z.add(F);else Z.replace(F);X(A)};return document.addEventListener("pointerdown",U,!0),()=>document.removeEventListener("pointerdown",U,!0)},[Z]),p(()=>{if(Z.selected.length===0)X(null)},[Z.selected]),p(()=>{let U=B.current;if(U)U.setAttribute("data-active-tool",$);if(typeof document<"u"&&document.body)document.body.setAttribute("data-active-tool",$);return()=>{U?.removeAttribute("data-active-tool")}},[$]),p(()=>{if(typeof window>"u")return;let U=(D)=>{let A=D.data;if(!A||typeof A!=="object"||A.dgn!=="tool-set")return;if(typeof A.tool==="string")V(A.tool)};return window.addEventListener("message",U),()=>window.removeEventListener("message",U)},[V]),XJ({hostRef:B,getActiveTool:j,claimableActions:eQ,callbacks:{onHover:({clientX:U,clientY:D})=>{if(H.current!=="comment"||!q7()){K(null);return}let A=f7(U,D);K((q)=>q===A?q:A)},onTool:({tool:U})=>V(U),onEscape:()=>{if(H.current!=="move")V("move");if(K(null),Z.clear(),typeof window<"u")try{window.parent.postMessage({dgn:"force-clear"},"*")}catch{}},onDropComment:({clientX:U,clientY:D})=>Z0(U,D,Z,Q)}}),wJ("div",{"data-mc-host":!0,ref:B,style:{display:"contents"},children:[J,W?S(V0,{el:W}):null,N?S($0,{el:N}):null,z?S(OJ,{}):null,S(zJ,{})]})}function $0({el:J}){let Q=u(null),$=u(J);$.current=J;let V=u(null);return p(()=>{let Z=()=>{V.current=null;let B=Q.current,W=$.current;if(B&&W?.isConnected){let K=W.getBoundingClientRect();if(K.width===0&&K.height===0)B.style.display="none";else B.style.display="block",B.style.left=`${Math.round(K.left)}px`,B.style.top=`${Math.round(K.top)}px`,B.style.width=`${Math.round(K.width)}px`,B.style.height=`${Math.round(K.height)}px`}else if(B)B.style.display="none";V.current=requestAnimationFrame(Z)};return V.current=requestAnimationFrame(Z),()=>{if(V.current!=null)cancelAnimationFrame(V.current)}},[]),S("div",{ref:Q,"aria-hidden":"true","data-mc-selection-halo":"",style:{position:"fixed",display:"none",pointerEvents:"none",zIndex:2147483645,border:"1.5px solid var(--maude-hud-accent, oklch(0.680 0.180 268))",borderRadius:"3px",boxSizing:"border-box"}})}function V0({el:J}){let Q=u(null),$=u(J);$.current=J;let V=u(null);return p(()=>{let Z=()=>{V.current=null;let B=Q.current,W=$.current;if(B&&W?.isConnected){let K=W.getBoundingClientRect();if(K.width===0&&K.height===0)B.style.display="none";else B.style.display="block",B.style.left=`${Math.round(K.left)}px`,B.style.top=`${Math.round(K.top)}px`,B.style.width=`${Math.round(K.width)}px`,B.style.height=`${Math.round(K.height)}px`}else if(B)B.style.display="none";V.current=requestAnimationFrame(Z)};return V.current=requestAnimationFrame(Z),()=>{if(V.current!=null)cancelAnimationFrame(V.current)}},[]),S("div",{ref:Q,"aria-hidden":"true","data-mc-hover-halo":"",style:{position:"fixed",display:"none",pointerEvents:"none",zIndex:2147483646,border:"2px solid var(--maude-hud-accent, #d63b1f)",borderRadius:"3px",boxSizing:"border-box"}})}function Z0(J,Q,$,V){if(typeof document>"u")return;let Z=c7(J,Q)??void 0,B=l7(J,Q);if(B){let H=B7(B),j=H?.getBoundingClientRect(),N={file:V,id:void 0,selector:"",artboardId:null,tag:H?.getAttribute("data-tool")??"annotation",classes:"",text:"",dom_path:[],bounds:j?{x:j.left,y:j.top,w:j.width,h:j.height}:{x:J-12,y:Q-12,w:24,h:24},html:"",annotationId:B,...Z?{world:Z}:{}};g7(N,J,Q);return}let W=E7(document,J,Q,{deep:!0});if(!W)W=E7(document,J,Q,{deep:!1});if(!W&&!q7()&&typeof document.elementsFromPoint==="function"){let H=document.elementsFromPoint(J,Q);for(let j of H){let N=j.closest?.("[data-cd-id]");if(!N)continue;if(!N.closest(".dc-artboard-body"))continue;let X=N.closest("[data-dc-screen]");W={el:N,cdId:N.getAttribute("data-cd-id"),artboardId:X?.getAttribute("data-dc-screen")??null};break}}if(!W&&q7()){let H=f7(J,Q);if(H)W={el:H,cdId:H.getAttribute("data-cd-id"),artboardId:null}}if(!W){let H={file:V,id:void 0,selector:"",artboardId:null,tag:"",classes:"",text:"",dom_path:[],bounds:{x:J-12,y:Q-12,w:24,h:24},html:"",...Z?{world:Z}:{}};g7(H,J,Q);return}let K=M7(W,V);$.replace(K),g7(K,J,Q)}function g7(J,Q,$){if(typeof document<"u")try{document.dispatchEvent(new CustomEvent("cm:open-composer",{detail:{selection:J,clientX:Q,clientY:$}}))}catch{}if(typeof window<"u")try{window.parent.postMessage({dgn:"comment-compose",selection:J},"*")}catch{}}function EJ(J,Q){return S(jJ,{initial:"browse",children:S(VJ,{children:S(Q0,{file:Q,children:S(J,{})})})})}function D3(J,Q){let $=tQ(Q.rootEl);if(!Q.commentsEnabled){$.render(h7(J));return}let V=Q.file??L7();$.render(h7(G0,{initialCanvas:J,file:V}))}var kJ="__maudeCanvasRuntime";function q0({Canvas:J,file:Q,onOk:$}){return p(()=>{$()},[]),EJ(J,Q)}class TJ extends aQ{state={hasError:!1};static getDerivedStateFromError(){return{hasError:!0}}componentDidCatch(){this.props.onError()}componentDidUpdate(J){if(J.attempt!==this.props.attempt&&this.state.hasError)this.setState({hasError:!1})}render(){if(this.state.hasError)return this.props.fallback();return this.props.children}}function B0({message:J}){return h7("div",{className:"dc-hmr-holding",role:"status","aria-live":"polite",title:J?`Holding last working render — ${J}`:"Holding last working render"},"⏸ build error — držím poslední funkční verzi")}function G0({initialCanvas:J,file:Q}){let[{canvas:$,attempt:V},Z]=Z7({canvas:J,attempt:0}),[B,W]=Z7({on:!1}),K=u(null),H=u($);H.current=$,p(()=>{let z={remount:(Y)=>Z((U)=>({canvas:Y,attempt:U.attempt+1})),setHolding:(Y,U)=>W(Y?{on:!0,message:U}:{on:!1})};return window[kJ]=z,()=>{window[kJ]=void 0}},[]);let j=R7(()=>{if(K.current=H.current,W((z)=>z.on?{on:!1}:z),V>0&&Q)try{window.parent.postMessage({dgn:"loaded",file:Q},"*")}catch{}},[V,Q]),N=R7(()=>{W({on:!0,message:"render error"})},[]),X=R7(()=>{let z=K.current;return z?EJ(z,Q):null},[Q]);return wJ(W0,{children:[S(TJ,{attempt:V,onError:N,fallback:X,children:S(q0,{Canvas:$,file:Q,onOk:j},V)}),B.on?S(B0,{message:B.message}):null]})}export{J0 as pickSpecimenSelectEl,D3 as mountCanvas,q7 as isBareSpecimen,TJ as CanvasErrorBoundary};
@@ -1,19 +1,21 @@
1
1
  /**
2
- * @file figma/to-strokes.ts — FigJam board → the whiteboard Stroke model.
2
+ * @file figma/to-strokes.ts — FigJam board → whiteboard elements.
3
3
  * @scope apps/studio/figma/to-strokes.ts
4
4
  * @purpose The flagship mapping: a FigJam document (normalized by
5
- * `types.ts`) becomes `Stroke[]` that `strokesToSvg` serializes into
6
- * `<slug>.annotations.svg`. Maude's whiteboard vocabulary is a close
7
- * match for FigJam's primitives, and this is the piece no competitor
8
- * ships.
5
+ * `types.ts`) becomes `Stroke[]` (`toStrokes`), and those become
6
+ * the v2 board ELEMENTS (`toBoardElements`, DDR-242) the importer
7
+ * writes to `<slug>.annotations.json`. Maude's whiteboard vocabulary
8
+ * is a close match for FigJam's primitives, and this is the piece no
9
+ * competitor ships.
9
10
  *
10
- * @invariant IMPORT THE CANONICAL MODEL, NEVER HAND-WRITE SVG. Same discipline
11
- * as `annotate.mjs`: every stroke goes through the real `Stroke`
12
- * types and the real serializer, so this translator can never emit
13
- * a shape the canvas wouldn't accept.
11
+ * @invariant IMPORT THE CANONICAL MODEL, NEVER HAND-WRITE A BOARD. Strokes are
12
+ * the real `Stroke` types; elements come out of the same pure
13
+ * transform the v1→v2 migration uses and are validated field by
14
+ * field by the element registry, so this translator can never emit
15
+ * an element the canvas wouldn't accept.
14
16
  *
15
17
  * @invariant THE OUTPUT IS A VERSIONED, PEER-SYNCED, AGENT-READ ARTIFACT.
16
- * `*.annotations.svg` is VERSIONED (DDR-115), commits and syncs
18
+ * `*.annotations.json` is VERSIONED (DDR-115), commits and syncs
17
19
  * (DDR-054), and `maude design read-annotations` parses it into JSON
18
20
  * EXPRESSLY to put in a model's context. DDR-216 D1 calls this the
19
21
  * sharpest consumption sink in the feature. So every string here
@@ -25,6 +27,9 @@
25
27
  * (`_import-figma.mjs`) owns writes and asset downloads.
26
28
  */
27
29
 
30
+ import { v1ToV2 } from '../annotations/migrate-v1.ts';
31
+ import type { Dropped } from '../annotations/schema.ts';
32
+ import type { AnnotationElement } from '../annotations/types.ts';
28
33
  import {
29
34
  type ArrowBind,
30
35
  type ArrowStroke,
@@ -749,3 +754,19 @@ export function toStrokes(doc: NormalizedDocument, opts: ToStrokesOptions = {}):
749
754
 
750
755
  return { strokes, report, pendingImages, origin };
751
756
  }
757
+
758
+ /**
759
+ * DDR-242 — translated strokes → v2 board ELEMENTS. The pure `v1ToV2`
760
+ * transform (the one every migration path uses): shape labels become embedded
761
+ * labels, section membership becomes explicit `parent` ids with relative
762
+ * coordinates, bound connectors keep only their hosts. Every element is then
763
+ * validated by the element registry — no SVG serializer, no SVG sanitizer, no
764
+ * round trip. Anything that can't be carried over is listed in `dropped`.
765
+ */
766
+ export function toBoardElements(strokes: readonly Stroke[]): {
767
+ elements: AnnotationElement[];
768
+ dropped: Dropped[];
769
+ } {
770
+ const r = v1ToV2(strokes);
771
+ return { elements: r.elements, dropped: r.report };
772
+ }
@@ -397,7 +397,7 @@ function draftPublishedNoPr(
397
397
  }
398
398
 
399
399
  /** DDR-112 — expand each selected path to include any DIRTY same-directory,
400
- * same-stem sidecar (`<stem>.meta.json`, `<stem>.annotations.svg`, …). The `.`
400
+ * same-stem sidecar (`<stem>.meta.json`, `<stem>.annotations.json`, …). The `.`
401
401
  * delimiter prevents `ui/Pricing` from grabbing `ui/Pricing v3.*`. */
402
402
  export function expandSidecars(selected: string[], dirty: string[]): string[] {
403
403
  const out = new Set(selected);
@@ -260,7 +260,7 @@ function underPrefix(filepath: string, prefix: string): boolean {
260
260
  *
261
261
  * DDR-115 divergence — the rule used to claim BOTH comments and annotations
262
262
  * were versionable. It now splits:
263
- * - `*.annotations.svg` → VERSIONED (durable visual markup, no other
263
+ * - `*.annotations.json` (v1: `.svg`) → VERSIONED (durable visual markup, no other
264
264
  * transport) → NOT hidden here.
265
265
  * - `_comments/` → hub-sync-only (DDR-102 CRDT) → HIDDEN, so it never
266
266
  * double-transports through git. */
@@ -30,7 +30,7 @@ function isVersionable(rel: string): boolean {
30
30
  const p = rel.replace(/\\/g, '/');
31
31
  if (p.includes('/_comments/') || p.startsWith('_comments/')) return true;
32
32
  if (p.includes('/_annotations/') || p.startsWith('_annotations/')) return true;
33
- return /\.(tsx|css|meta\.json|svg)$/.test(p) || p.endsWith('.annotations.svg');
33
+ return /\.(tsx|css|meta\.json|svg)$/.test(p) || /\.annotations\.(?:svg|json)$/.test(p);
34
34
  }
35
35
 
36
36
  export function createGitWatch(ctx: Context): GitWatch {
@@ -1,4 +1,8 @@
1
+ import { MAX_ELEMENTS } from './annotations/constants.ts';
2
+ import { parseOps as parseAnnotationOps } from './annotations/ops.ts';
3
+ import { serializeBoard } from './annotations/schema.ts';
1
4
  import { validAnnotationWriteId } from './annotations-sync.ts';
5
+ import { MAX_ANNOTATIONS_BYTES } from './sync/limits.ts';
2
6
  // HTTP layer for Bun.serve.
3
7
  //
4
8
  // Designed for extension — Phase 3.6 adds /ui/:slug + /_bun_hmr by appending to
@@ -117,6 +121,7 @@ import { isHubReadOnly } from './sync/hubs-config.ts';
117
121
  import { isFirstAnchorMode, readSyncSettings, writeSyncSettings } from './sync/settings.ts';
118
122
  import { listTrash, pruneTrash, restoreFromTrash } from './sync/trash.ts';
119
123
  import { signInToWorkspace, workspaceDisclosure } from './sync/workspace-signin.ts';
124
+ import { normalizeTreeState } from './tree-state.ts';
120
125
  import { readUiPrefs, type UiPrefs, writeUiPrefs } from './ui-prefs.ts';
121
126
  import { loadWhatsNew, resolveMaudeVersion } from './whats-new.ts';
122
127
  import { isWorkspaceMode, resolveRenderLane } from './workspace-mode.ts';
@@ -400,6 +405,7 @@ export const READ_ONLY_ALLOWED_WRITES = new Set([
400
405
  '/_canvas-state', // per-user camera / view state (DDR-115: never versioned)
401
406
  '/_api/canvas-meta', // viewport lane only — the layout lane is refused in-handler
402
407
  '/_api/ui-prefs', // per-user UI preferences
408
+ '/_api/tree-state', // per-user Files-panel disclosure (issue #124)
403
409
  '/_api/timeline-media', // per-user runtime media cache (scrub read path)
404
410
  '/_api/export', // "look, comment and download" — the cell allows /api/export too
405
411
  '/_api/export-jobs',
@@ -2400,36 +2406,42 @@ export function createHttp(
2400
2406
  },
2401
2407
 
2402
2408
  '/_api/annotations': async (req: Request) => {
2403
- // Phase 5 — `<designRoot>/<slug>.annotations.svg` read / overwrite.
2404
- // GET ?file=<repo-relative-canvas-path> → SVG text (empty if absent)
2405
- // PUT body { file, svg } → 204 on write, 4xx otherwise
2409
+ // DDR-242 — `<designRoot>/<slug>.annotations.json` read / whole-board write.
2410
+ // GET ?file=<repo-relative-canvas-path> → canonical board JSON (empty board if absent)
2411
+ // PUT body { file, board | svg, writeId?, base? } → 204 on write, 4xx otherwise
2412
+ // `board` is board JSON; `svg` (a v1 tab still open across an upgrade)
2413
+ // is converted through the v1→v2 migration. The canvas's own edits go
2414
+ // through /_api/annotations/ops, never a whole-board write.
2406
2415
  const url = new URL(req.url);
2407
2416
  if (req.method === 'GET') {
2408
2417
  const file = url.searchParams.get('file');
2409
2418
  if (!file) return new Response('file query param required', { status: 400 });
2410
- const svg = await api.loadAnnotations(file);
2411
- return new Response(svg ?? '', {
2419
+ const read = await api.readBoard(file);
2420
+ // An existing-but-unreadable board is NOT served as empty (review H2).
2421
+ if (!read.ok) return new Response(read.error, { status: 409 });
2422
+ const board = read.text ?? serializeBoard([]);
2423
+ return new Response(board, {
2412
2424
  status: 200,
2413
2425
  headers: {
2414
- 'Content-Type': 'image/svg+xml; charset=utf-8',
2426
+ 'Content-Type': 'application/json; charset=utf-8',
2415
2427
  'Cache-Control': 'no-store',
2416
2428
  },
2417
2429
  });
2418
2430
  }
2419
2431
  if (req.method === 'PUT' || req.method === 'POST') {
2420
- // `base` (optional) is the SVG this edit was derived from — the hub
2421
- // merges a concurrent peer's strokes from it (accepted revisions).
2422
2432
  const body = await readJson<{
2423
2433
  file?: string;
2424
- svg?: string;
2434
+ board?: unknown;
2435
+ svg?: unknown;
2425
2436
  writeId?: unknown;
2426
2437
  base?: unknown;
2427
- }>(req, 2 * 1024 * 1024 + 2048);
2438
+ }>(req, MAX_ANNOTATIONS_BYTES * 2 + 2048);
2428
2439
  if (!body || typeof body.file !== 'string' || !body.file) {
2429
- return new Response('body must include { file, svg }', { status: 400 });
2440
+ return new Response('body must include { file, board }', { status: 400 });
2430
2441
  }
2431
- if (typeof body.svg !== 'string') {
2432
- return new Response('body.svg must be a string', { status: 400 });
2442
+ const text = typeof body.board === 'string' ? body.board : body.svg;
2443
+ if (typeof text !== 'string') {
2444
+ return new Response('body.board must be a string', { status: 400 });
2433
2445
  }
2434
2446
  if (body.writeId !== undefined && !validAnnotationWriteId(body.writeId)) {
2435
2447
  return new Response('invalid annotation writeId', { status: 400 });
@@ -2439,7 +2451,7 @@ export function createHttp(
2439
2451
  }
2440
2452
  const ok = await api.saveAnnotations(
2441
2453
  body.file,
2442
- body.svg,
2454
+ text,
2443
2455
  body.writeId as string | undefined,
2444
2456
  body.base as string | undefined
2445
2457
  );
@@ -2449,6 +2461,38 @@ export function createHttp(
2449
2461
  return new Response('Method not allowed', { status: 405 });
2450
2462
  },
2451
2463
 
2464
+ '/_api/annotations/ops': async (req: Request) => {
2465
+ // DDR-242 §4 — the canvas write path: an op batch applied under the one
2466
+ // merge rule. Canvas-origin reachable (inert collab data, DDR-054) — every
2467
+ // op is validated element-by-element and the board stays capped.
2468
+ // POST body { file, actionId, ops: Op[] } → 200 { ok, changed, rejected[] }
2469
+ if (req.method !== 'POST') return new Response('Method not allowed', { status: 405 });
2470
+ const body = await readJson<{ file?: unknown; actionId?: unknown; ops?: unknown }>(
2471
+ req,
2472
+ MAX_ANNOTATIONS_BYTES + 2048
2473
+ );
2474
+ if (!body || typeof body.file !== 'string' || !body.file) {
2475
+ return new Response('body must include { file, actionId, ops }', { status: 400 });
2476
+ }
2477
+ if (body.actionId !== undefined && !validAnnotationWriteId(body.actionId)) {
2478
+ return new Response('invalid actionId', { status: 400 });
2479
+ }
2480
+ if (!Array.isArray(body.ops))
2481
+ return new Response('body.ops must be an array', { status: 400 });
2482
+ // Bounded to what a whole board can need (select-all + delete on a full
2483
+ // board) and REFUSED past it — never truncated, which would half-apply a
2484
+ // gesture. Batch cost is linear in the ops (ops.ts indexes).
2485
+ if (body.ops.length > MAX_ELEMENTS) {
2486
+ return new Response('too many ops in one batch', { status: 413 });
2487
+ }
2488
+ const { ops } = parseAnnotationOps(body.ops, MAX_ELEMENTS);
2489
+ const r = await api.applyAnnotationOps(body.file, ops, body.actionId as string | undefined);
2490
+ return Response.json(r, {
2491
+ status: r.ok ? 200 : r.unreadable ? 409 : 413,
2492
+ headers: { 'Cache-Control': 'no-store' },
2493
+ });
2494
+ },
2495
+
2452
2496
  '/_api/canvas': async (req: Request) => {
2453
2497
  // Phase 22 — create + soft-delete a canvas from the browser file tree.
2454
2498
  // POST body { name, kind?: "brief-board", group? } → 201 { file, rel, slug }
@@ -5197,6 +5241,36 @@ export function createHttp(
5197
5241
  }
5198
5242
  },
5199
5243
 
5244
+ // Issue #124 — the Files panel's remembered folder/section disclosure, per
5245
+ // project (and per member in a cell, via api.ts's sessionDir). GET returns
5246
+ // the stored state (empty ⇒ everything closed); POST replaces it. MAIN-ORIGIN
5247
+ // ONLY, same gates as /_api/ui-prefs — never reachable from a canvas.
5248
+ '/_api/tree-state': async (req: Request) => {
5249
+ if (!isTrustedRequestHost(req))
5250
+ return new Response('local request required (DNS-rebinding guard)', { status: 403 });
5251
+ if (req.method === 'GET') {
5252
+ return Response.json(await api.loadTreeState(), {
5253
+ headers: { 'Cache-Control': 'no-store' },
5254
+ });
5255
+ }
5256
+ if (req.method !== 'POST') return new Response('Method not allowed', { status: 405 });
5257
+ if (!sameOriginWrite(req))
5258
+ return new Response('cross-origin write rejected', { status: 403 });
5259
+ const body = await readJson<Record<string, unknown>>(req, 256 * 1024);
5260
+ if (!body || typeof body !== 'object' || Array.isArray(body))
5261
+ return new Response('body must be a JSON object', { status: 400 });
5262
+ try {
5263
+ return Response.json(await api.saveTreeState(normalizeTreeState(body)), {
5264
+ headers: { 'Cache-Control': 'no-store' },
5265
+ });
5266
+ } catch (err) {
5267
+ // Log the cause here; the body stays generic — an fs error message
5268
+ // carries the server's absolute path, and in a cell a viewer reads it.
5269
+ console.error('[tree-state] write failed:', err instanceof Error ? err.message : err);
5270
+ return new Response('tree-state write failed', { status: 500 });
5271
+ }
5272
+ },
5273
+
5200
5274
  // feature-ai-media-generation (Task 2.5, DDR-164) — reuse-before-you-pay for
5201
5275
  // AUDIO. GET searches the project's OWN generated audio (intent sidecars) and,
5202
5276
  // when ElevenLabs is configured, the user's re-downloadable History (free —
@@ -5849,7 +5923,8 @@ export function createHttp(
5849
5923
  const CANVAS_SAFE_API = new Set([
5850
5924
  '/_api/git-user', // presence display name
5851
5925
  '/_api/canvas-meta', // layout/viewport sidecar (GET + PATCH)
5852
- '/_api/annotations', // annotation SVG (GET + PUT) — drives the collab bridge
5926
+ '/_api/annotations', // annotation board (GET + whole-board PUT) — drives the collab bridge
5927
+ '/_api/annotations/ops', // DDR-242 annotation op batches (POST). MIRROR in server.ts routes.
5853
5928
  '/_api/asset', // Phase 23 — capped binary image upload (sniff+category cap+sha8 name+no-SVG)
5854
5929
  '/_api/photo-edit', // feature-photo-editor — PhotoEdit sidecar GET/PUT (cap-stack gated). MIRROR in server.ts routes.
5855
5930
  '/_api/git-committers', // @mention autocomplete