@1agh/maude 1.4.5 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/apps/studio/annotations/ai-read.ts +288 -0
- package/apps/studio/annotations/ai-write.ts +533 -0
- package/apps/studio/annotations/board-io.ts +94 -0
- package/apps/studio/annotations/board-text.ts +45 -0
- package/apps/studio/annotations/constants.ts +58 -0
- package/apps/studio/annotations/elements/_shared.ts +125 -0
- package/apps/studio/annotations/elements/arrow.model.ts +196 -0
- package/apps/studio/annotations/elements/media.model.ts +79 -0
- package/apps/studio/annotations/elements/pen.model.ts +82 -0
- package/apps/studio/annotations/elements/section.model.ts +70 -0
- package/apps/studio/annotations/elements/shape.model.ts +141 -0
- package/apps/studio/annotations/elements/sticky.model.ts +48 -0
- package/apps/studio/annotations/elements/text.model.ts +52 -0
- package/apps/studio/annotations/fields.ts +347 -0
- package/apps/studio/annotations/fractional-index.ts +234 -0
- package/apps/studio/annotations/legacy/mini-dom.ts +207 -0
- package/apps/studio/annotations/migrate-boot.ts +172 -0
- package/apps/studio/annotations/migrate-cli.ts +37 -0
- package/apps/studio/annotations/migrate-v1.ts +383 -0
- package/apps/studio/annotations/ops.ts +474 -0
- package/apps/studio/annotations/registry.ts +159 -0
- package/apps/studio/annotations/replica.ts +264 -0
- package/apps/studio/annotations/scene.ts +235 -0
- package/apps/studio/annotations/schema.ts +188 -0
- package/apps/studio/annotations/types.ts +77 -0
- package/apps/studio/annotations/ui/board.ts +126 -0
- package/apps/studio/annotations/ui/containment.ts +118 -0
- package/apps/studio/annotations/ui/edit-actions.ts +551 -0
- package/apps/studio/annotations/ui/editor-channel.ts +62 -0
- package/apps/studio/annotations/ui/element-node.tsx +993 -0
- package/apps/studio/annotations/ui/pipeline-context.ts +17 -0
- package/apps/studio/annotations/ui/pointer-pipeline.ts +150 -0
- package/apps/studio/annotations/ui/render-model.ts +264 -0
- package/apps/studio/annotations/ui/scene.tsx +63 -0
- package/apps/studio/annotations/ui/text-editor.tsx +420 -0
- package/apps/studio/annotations/ui/text-session.ts +140 -0
- package/apps/studio/annotations/ui/text-style.ts +111 -0
- package/apps/studio/annotations/ui/world.ts +47 -0
- package/apps/studio/annotations/v1-adapter.ts +428 -0
- package/apps/studio/annotations-align.ts +21 -6
- package/apps/studio/annotations-bindings.ts +2 -0
- package/apps/studio/annotations-context-toolbar.tsx +9 -13
- package/apps/studio/annotations-groups.ts +3 -0
- package/apps/studio/annotations-layer.tsx +923 -1925
- package/apps/studio/annotations-model.ts +97 -4
- package/apps/studio/annotations-sync.ts +4 -47
- package/apps/studio/api.ts +262 -68
- package/apps/studio/bin/_import-figma.mjs +22 -12
- package/apps/studio/bin/annotate.mjs +331 -838
- package/apps/studio/bin/annotate.sh +4 -4
- package/apps/studio/bin/perf.sh +21 -7
- package/apps/studio/bin/read-annotations.mjs +184 -666
- package/apps/studio/bin/read-annotations.sh +9 -5
- package/apps/studio/canvas-artifacts.ts +9 -0
- package/apps/studio/canvas-comment-mount.tsx +35 -2
- package/apps/studio/canvas-lib.tsx +18 -1
- package/apps/studio/canvas-shell.tsx +54 -1
- package/apps/studio/client/app.jsx +101 -35
- package/apps/studio/client/comments-overlay.css +10 -0
- package/apps/studio/client/hmr.mjs +1 -1
- package/apps/studio/client/panels/git-grouping.js +2 -2
- package/apps/studio/client/tree-expansion.js +217 -0
- package/apps/studio/collab/index.ts +58 -5
- package/apps/studio/collab/persistence.ts +80 -11
- package/apps/studio/collab/registry.ts +63 -26
- package/apps/studio/commands/annotation-ops-command.ts +72 -0
- package/apps/studio/comment-anchor.ts +116 -0
- package/apps/studio/comments-overlay.tsx +78 -35
- package/apps/studio/context.ts +1 -0
- package/apps/studio/cursors-overlay.tsx +337 -109
- package/apps/studio/dist/client.bundle.js +850 -850
- package/apps/studio/dist/comment-mount.js +2 -2
- package/apps/studio/figma/to-strokes.ts +31 -10
- package/apps/studio/git/endpoints.ts +1 -1
- package/apps/studio/git/service.ts +1 -1
- package/apps/studio/git/watch.ts +1 -1
- package/apps/studio/http.ts +90 -15
- package/apps/studio/server.ts +16 -0
- package/apps/studio/sync/accepted-cold-start.ts +72 -8
- package/apps/studio/sync/agent.ts +36 -6
- package/apps/studio/sync/codec.ts +95 -40
- package/apps/studio/sync/comment-ledger.ts +229 -0
- package/apps/studio/sync/file-membership.ts +12 -2
- package/apps/studio/sync/file-plane.ts +78 -2
- package/apps/studio/sync/index.ts +75 -16
- package/apps/studio/sync/journal-client.ts +5 -0
- package/apps/studio/sync/limits.ts +7 -2
- package/apps/studio/sync/migrate-seed.ts +17 -7
- package/apps/studio/sync/projection.ts +7 -2
- package/apps/studio/sync/remote-docs.ts +34 -0
- package/apps/studio/sync/writer-registry.ts +10 -0
- package/apps/studio/text-caret.ts +11 -2
- package/apps/studio/tree-state.ts +45 -0
- package/apps/studio/undo-stack.ts +2 -2
- package/apps/studio/use-annotation-resize.tsx +48 -23
- package/apps/studio/use-annotation-selection.tsx +9 -2
- package/apps/studio/use-collab.tsx +104 -1
- package/apps/studio/use-selection-set.tsx +4 -0
- package/apps/studio/whats-new.json +63 -0
- package/cli/lib/design-link.mjs +5 -1
- package/cli/lib/gitignore-block.mjs +1 -1
- package/cli/lib/gitignore-drift.mjs +2 -1
- package/package.json +9 -8
- package/plugins/design/templates/brief-board.tsx.template +1 -1
- package/apps/studio/annotation-edit-base.ts +0 -36
- package/apps/studio/commands/annotation-strokes-command.ts +0 -137
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{Component as pQ,createElement as S7,useCallback as C7,useEffect as p,useMemo as uQ,useRef as u,useState as V7}from"react";import{createRoot as mQ}from"react-dom/client";import{useCallback as b,useEffect as R,useMemo as s,useRef as g,useState as h}from"react";function F7(){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 q7(J){if(!J)return"";return(J.getAttribute("class")??"").trim().split(/\s+/).filter((Q)=>Q&&!Q.startsWith("dgn-")&&!Q.startsWith("dc-cv-")).join(" ")}function TJ(J,Q){if(!J)return"";let $=(J.innerText||J.textContent||"").replace(/\s+/g," ").trim();return $.length>Q?`${$.slice(0,Q-1)}…`:$}function bJ(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 B=q7($).split(/\s+/).filter(Boolean).slice(0,2);if(B.length)G+=`.${B.join(".")}`;let K=1,Y=$.previousElementSibling;while(Y)K++,Y=Y.previousElementSibling;G+=`:nth-child(${K})`,Q.unshift(G),$=$.parentElement}return Q.join(" > ")}function p7(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 B=q7($).split(/\s+/).filter(Boolean).slice(0,2);if(B.length&&!Z&&!G)V+=`.${B.join(".")}`;Q.unshift(V),$=$.parentElement}return Q}function xJ(J){return J.replace(/[^a-zA-Z0-9_-]/g,(Q)=>`\\${Q}`)}function u7(J,Q){return Q?`[data-dc-screen="${Q}"] [data-cd-id="${J}"]`:`[data-cd-id="${J}"]`}function m7(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 d7(J,Q,$){if(!Q||!$)return 0;return m7(J,`[data-cd-id="${xJ(Q)}"]`,$)}function P7(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=$(u7(Q.id,Q.artboardId));if(V)return V}if(Q.selector)return $(Q.selector);return null}function yJ(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 i7(J,Q){let $=Q.dom_path,V=(Q.tag||"").toLowerCase();if(!$||$.length===0||!V)return null;let Z=J;if(Q.artboardId){let Y=J.querySelector(`[data-dc-screen="${Q.artboardId}"]`);if(Y)Z=Y}let G=(Q.classes||"").split(/\s+/).filter(Boolean),B=null,K=0;for(let Y of Array.from(Z.querySelectorAll("[data-cd-id]"))){if(Y.tagName.toLowerCase()!==V)continue;let j=yJ(p7(Y),$);if(j===0)continue;let N=q7(Y).split(/\s+/).filter(Boolean),U=G.filter((P)=>N.includes(P)).length,z=j*10+U;if(z>K)K=z,B=Y}return B}var f7=["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"],vJ=/^(style|class|data-cd-id|data-dc-|data-dcid$)/;function CJ(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(f7);for(let z of f7){let P=Q.getPropertyValue(z);if(P)V[z]=P.trim();let X=$.getPropertyValue(z);if(X)Z[z]=X.trim()}let B=/^(margin|padding|border)(-|$)/,K={};for(let z=0;z<Q.length;z++){let P=Q.item(z);if(!P||G.has(P)||B.test(P))continue;let X=Q.getPropertyValue(P);if(X)K[P]=X.trim()}let Y={};for(let z of Array.from(J.attributes)){if(vJ.test(z.name))continue;Y[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")Y[z.name]=z.value}let j=J.parentElement,N=j?window.getComputedStyle(j).display:"",U=j&&(N==="flex"||N==="inline-flex")?window.getComputedStyle(j).flexDirection:"";return{authored:V,computed:Z,customStyles:K,attrs:Y,parentDisplay:N,parentFlexDirection:U}}catch{return{authored:{},computed:{},customStyles:{},attrs:{}}}}function D7(J,Q){let $=J.el,V=$&&$.getBoundingClientRect?$.getBoundingClientRect():null,Z=J.cdId,G=Z?u7(Z,J.artboardId):J.artboardId?`[data-dc-screen="${J.artboardId}"]`:bJ($),B=Z&&typeof document<"u"?m7(document,G,$):0;return{file:Q??F7(),id:Z??void 0,selector:G,artboardId:J.artboardId,index:B,tag:$?.tagName.toLowerCase()??"",classes:q7($),text:TJ($,240),dom_path:p7($),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,Y=$.getAttribute?.("data-photo-asset");if(Y&&K.test(Y))return{photoKind:"artboard-img",photoAsset:Y};let j=$.getAttribute?.("src")||"",N=K.exec(j);return N?{photoKind:"artboard-img",photoAsset:N[0]}:{}})(),...CJ($)}}var G7=null;function a(){if(typeof window>"u")return!1;if(G7===null)try{G7=new URLSearchParams(window.location.search).get("ro")==="1"}catch{G7=!1}return G7}import*as L7 from"lib0/decoding";import*as o from"lib0/encoding";import{createContext as gJ,useCallback as B0,useContext as hJ,useEffect as W0,useMemo as K0,useReducer as z0,useRef as U0,useState as X0}from"react";import{Awareness as Y0,applyAwarenessUpdate as F0,encodeAwarenessUpdate as P0}from"y-protocols/awareness";import{readSyncMessage as L0,writeSyncStep1 as M0,writeUpdate as N0}from"y-protocols/sync";import*as fJ from"yjs";import*as SJ from"yjs";var RJ=new WeakSet;function c7(J){return RJ.add(J),J}var Q0=c7(Object.freeze({maudeOrigin:"shell-edit"})),$0=c7(Object.freeze({maudeOrigin:"sync-agent"}));import{jsx as I0}from"react/jsx-runtime";var pJ=gJ(null);function l7(){return hJ(pJ)}import{createContext as uJ,useCallback as l,useContext as N7,useEffect as mJ,useMemo as dJ,useRef as r7,useState as iJ}from"react";import{jsx as M7,Fragment as rJ}from"react/jsx-runtime";var B7=uJ(null);function r(J){return J.id?`id:${J.id}`:`sel:${J.selector}`}function n7(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 cJ=50;function lJ({children:J,postTarget:Q}){let[$,V]=iJ([]),Z=r7(null),G=r7(null),B=l((P)=>{if(Z.current)clearTimeout(Z.current);G.current=()=>{Z.current=null,G.current=null;let X=Q??(typeof window<"u"?window.parent:null);if(!X)return;let M=P.length===0?null:P.length===1?P[0]??null:P;try{X.postMessage({dgn:"select-set",selection:M},"*")}catch{}},Z.current=setTimeout(()=>G.current?.(),cJ)},[Q]);mJ(()=>()=>{if(Z.current)clearTimeout(Z.current);G.current?.()},[]);let K=l((P)=>{let X=n7(Array.isArray(P)?P:[P]);V(X),B(X)},[B]),Y=l((P)=>{let X=Array.isArray(P)?P:[P];V((M)=>{let O=n7([...M,...X]);return B(O),O})},[B]),j=l((P)=>{let X=r(P);V((M)=>{let O=M.filter((q)=>r(q)!==X);return B(O),O})},[B]),N=l((P)=>{let X=r(P);V((M)=>{let O=M.some((q)=>r(q)===X)?M.filter((q)=>r(q)!==X):[...M,P];return B(O),O})},[B]),U=l(()=>{V([]),B([])},[B]),z=dJ(()=>({selected:$,replace:K,add:Y,remove:j,toggle:N,clear:U}),[$,K,Y,j,N,U]);return M7(B7.Provider,{value:z,children:J})}function a7({children:J}){if(N7(B7))return M7(rJ,{children:J});return M7(lJ,{children:J})}function W7(){let J=N7(B7);if(!J)throw Error("useSelectionSet must be used inside <SelectionSetProvider>");return J}function o7(){return N7(B7)}import{jsx as w,jsxs as x,Fragment as WQ}from"react/jsx-runtime";var nJ="/_client/comments-overlay.css";function aJ(){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=nJ,document.head.appendChild(J)}function oJ(){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 sJ(J){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=i7(document,{artboardId:$,tag:J.tag,classes:J.classes,dom_path:J.dom_path})}return Q}function I7(J){let Q=sJ(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 QJ(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 B=J.y;if(B+Q.h+8>Z){let K=J.y-Q.h;B=K>=8?K:Math.max(8,Z-Q.h-8)}return{x:G,y:B}}function $J(){aJ();let J=o7(),[Q,$]=h([]),[V,Z]=h(null),[G,B]=h(null),K=s(()=>oJ(),[]);R(()=>{if(typeof document>"u")return;let F=document.getElementById("dgn-pin-layer");if(!F)return;let W=F.style.display;return F.style.display="none",()=>{F.style.display=W}},[]);let Y=b((F)=>{if(!J)return;if(!F?.selector){J.clear();return}let W=F.selector.match(/data-cd-id="([^"]+)"/),D=W?W[1]:void 0,A,L;try{let I=document.querySelector(F.selector);if(I)A=I.tagName.toLowerCase(),L=(I.getAttribute("class")??"").split(/\s+/).filter((E)=>E&&!E.startsWith("dgn-")&&!E.startsWith("dc-cv-")).join(" ")}catch{}J.replace({file:K??void 0,id:D,selector:F.selector,tag:A,classes:L,bounds:F.bounds??void 0})},[J,K]),j=g(Q);j.current=Q;let N=l7(),U=VQ();R(()=>{if(!N)return;let F=N.doc.getArray("comments"),W=()=>{$(F.toArray())};if(F.length>0)W();return F.observe(W),()=>{try{F.unobserve(W)}catch{}}},[N]),R(()=>{if(typeof window>"u")return;let F=(W)=>{let D=W.data;if(!D||typeof D!=="object"||!D.dgn)return;if(D.dgn==="comments-set"&&Array.isArray(D.comments))$(D.comments);else if(D.dgn==="comment-focus"){let A=typeof D.id==="string"?D.id:null;Z(A);let L=A?j.current.find((I)=>I.id===A):void 0;Y(L)}};return window.addEventListener("message",F),()=>window.removeEventListener("message",F)},[Y]),R(()=>{if(typeof document>"u")return;let F=(W)=>{let D=W.detail;if(!D?.selection)return;B({selection:D.selection,clientX:typeof D.clientX==="number"?D.clientX:0,clientY:typeof D.clientY==="number"?D.clientY:0})};return document.addEventListener("cm:open-composer",F),()=>document.removeEventListener("cm:open-composer",F)},[]);let z=b(()=>{if(B(null),typeof window>"u")return;try{window.parent.postMessage({dgn:"force-clear"},"*")}catch{}},[]),P=b((F)=>{if(!G)return;let W=G.selection,D={file:W.file,selector:W.selector,index:W.index,dom_path:W.dom_path,tag:W.tag,classes:W.classes,bounds:W.bounds,html_excerpt:W.html,text:F};if(typeof window>"u")return;try{window.parent.postMessage({dgn:"comment-submit",payload:D},"*")}catch{}z()},[G,z]);R(()=>{if(!K)return;let F=!1;return(async()=>{try{let W=await fetch(`/_comments?file=${encodeURIComponent(K)}`);if(!W.ok)return;let D=await W.json();if(F)return;if(Array.isArray(D.comments))$((A)=>A.length===0?D.comments??[]:A)}catch{}})(),()=>{F=!0}},[K]);let X=s(()=>{return Q.slice().sort((W,D)=>W.created.localeCompare(D.created)).filter((W)=>W.status!=="resolved")},[Q]),M=s(()=>{let F=new Map;return Q.slice().sort((D,A)=>D.created.localeCompare(A.created)).forEach((D,A)=>{F.set(D.id,A+1)}),F},[Q]),O=b((F)=>{if(Z(F),Y(Q.find((W)=>W.id===F)),typeof window>"u")return;try{window.parent.postMessage({dgn:"comment-click",id:F},"*")}catch{}},[Q,Y]),q=b((F,W)=>{if(typeof window>"u")return;try{window.parent.postMessage({dgn:"comment-patch",id:F,patch:W},"*")}catch{}},[]),H=b((F)=>{if(typeof window>"u")return;try{window.parent.postMessage({dgn:"comment-delete",id:F},"*")}catch{}Z((W)=>W===F?null:W)},[]),_=b(async(F,W)=>{if(typeof fetch>"u")return!1;try{let D=await fetch(`/_api/comments/${encodeURIComponent(F)}/reply`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({body:W})});if(!D.ok)return!1;let A=await D.json();return $((L)=>L.map((I)=>I.id===A.id?A:I)),!0}catch{return!1}},[]);return x("div",{className:"cm-layer","aria-hidden":!1,children:[X.map((F)=>{let W=M.get(F.id)??0;return w(QQ,{comment:F,sequence:W,focused:V===F.id,onClick:O,onOrphaned:H},F.id)}),G?w($Q,{state:G,onSubmit:P,onCancel:z}):null,(()=>{if(!V)return null;let F=X.find((W)=>W.id===V);if(!F)return null;return w(ZQ,{comment:F,sequence:M.get(F.id)??0,onClose:()=>{Z(null),J?.clear()},onPatch:(W)=>q(F.id,W),onDelete:()=>H(F.id),onReply:(W)=>_(F.id,W),mine:!a()&&!!(U??N?.myName)&&(F.author??"").trim()===(U??N?.myName??"").trim()})})()]})}var j7=null;async function tJ(){if(!j7)j7=(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 j7}function s7(J){return(J.trim().split(/\s+/)[0]??"").replace(/[^\w.-]/g,"").toLowerCase()}function eJ(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 _7({className:J,value:Q,onChange:$,onKeyDown:V,placeholder:Z,rows:G,disabled:B,textareaRef:K,ariaLabel:Y}){let j=g(null),N=b((L)=>{if(j.current=L,K)K.current=L},[K]),[U,z]=h([]),[P,X]=h(null),[M,O]=h(0),q=b(()=>{if(U.length>0)return;tJ().then((L)=>z(L))},[U.length]),H=s(()=>{if(!P)return[];let L=P.query.toLowerCase();return(!L?U:U.filter((E)=>E.name.toLowerCase().includes(L)||E.email.toLowerCase().includes(L))).slice(0,8)},[P,U]),_=b((L)=>{let I=L.selectionStart??L.value.length,E=eJ(L.value,I);X(E),O(0)},[]),F=b((L)=>{$(L.target.value),_(L.target)},[$,_]),W=b((L)=>{if(!P)return;let I=j.current;if(!I)return;let E=`@${s7(L.name)}`,k=`${Q.slice(0,P.start)}${E} ${Q.slice(P.end)}`;$(k),X(null);let T=P.start+E.length+1;requestAnimationFrame(()=>{I.focus(),I.setSelectionRange(T,T)})},[P,Q,$]),D=b((L)=>{if(P&&H.length>0){if(L.key==="ArrowDown"){L.preventDefault(),O((I)=>(I+1)%H.length);return}if(L.key==="ArrowUp"){L.preventDefault(),O((I)=>(I-1+H.length)%H.length);return}if(L.key==="Enter"||L.key==="Tab"){L.preventDefault();let I=H[M]??H[0];if(I)W(I);return}if(L.key==="Escape"){L.preventDefault(),X(null);return}}V?.(L)},[P,H,M,W,V]),A=b((L)=>{_(L.currentTarget)},[_]);return x("div",{style:{position:"relative"},children:[w("textarea",{ref:N,className:J,value:Q,placeholder:Z,rows:G,disabled:B,"aria-label":Y,onChange:F,onKeyDown:D,onFocus:q,onSelect:A,onClick:A}),P&&H.length>0?w("ul",{className:"cm-mention-popup",role:"listbox","aria-label":"Mention suggestions",style:{left:0,top:"100%"},children:H.map((L,I)=>{return x("li",{role:"option","aria-selected":I===M,className:"cm-mention-popup__item",onMouseEnter:()=>O(I),onMouseDown:(k)=>{k.preventDefault(),W(L)},children:[x("span",{className:"cm-mention-popup__name",children:["@",s7(L.name)]}),w("span",{className:"cm-mention-popup__email",children:L.email})]},`${L.name}-${L.email}`)})}):null]})}var JQ=3000;function QQ({comment:J,sequence:Q,focused:$,onClick:V,onOrphaned:Z}){let G=g(null),B=g(null),K=g(null);R(()=>{let N=()=>{B.current=null;let U=G.current;if(!U)return;let z=I7(J);if(z)K.current=null;else{if(K.current==null)K.current=Date.now();else if(Date.now()-K.current>JQ)Z(J.id);if(J.bounds)z={x:J.bounds.x,y:J.bounds.y,w:J.bounds.w,h:J.bounds.h}}if(!z){U.style.display="none",B.current=requestAnimationFrame(N);return}U.style.display="grid";let P=Math.round(z.x+z.w-12),X=Math.round(z.y-12);U.style.left=`${P}px`,U.style.top=`${X}px`,B.current=requestAnimationFrame(N)};return B.current=requestAnimationFrame(N),()=>{if(B.current!=null)cancelAnimationFrame(B.current)}},[J,Z]);let Y=J.author?.trim()||"unknown",j=`Comment ${Q} by ${Y}`;return w("button",{ref:G,type:"button",className:"cm-pin","data-resolved":J.status==="resolved"?"true":"false","data-focused":$?"true":"false","data-comment-pin":J.id,"aria-label":j,"aria-expanded":$,title:J.text.slice(0,200),onClick:(N)=>{N.preventDefault(),N.stopPropagation(),V(J.id)},children:Q})}function $Q({state:J,onSubmit:Q,onCancel:$}){let[V,Z]=h(""),G=g(null),B=g(null),K=g(null);R(()=>{let U=()=>{K.current=null;let z=B.current;if(!z)return;let P=BQ(J),X=QJ(P,{w:z.offsetWidth,h:z.offsetHeight});z.style.left=`${Math.round(X.x)}px`,z.style.top=`${Math.round(X.y)}px`,K.current=requestAnimationFrame(U)};return K.current=requestAnimationFrame(U),()=>{if(K.current!=null)cancelAnimationFrame(K.current)}},[J]),R(()=>{G.current?.focus()},[]);let Y=b(()=>{let U=V.trim();if(!U)return;Q(U)},[V,Q]),j=b((U)=>{if(U.key==="Escape"){U.preventDefault(),$();return}if((U.metaKey||U.ctrlKey)&&U.key==="Enter")U.preventDefault(),Y()},[$,Y]),N=s(()=>{let U=J.selection.selector||"";if(!U)return J.selection.tag||"canvas";let z=U.match(/data-cd-id="([^"]+)"/);if(z)return`cd:${z[1]}`;return U.length>36?`${U.slice(0,33)}…`:U},[J.selection]);return x("div",{ref:B,className:"cm-composer",role:"dialog","aria-label":"New comment",onClick:(U)=>U.stopPropagation(),onPointerDown:(U)=>U.stopPropagation(),children:[x("div",{className:"cm-composer__head",children:[w("span",{children:"New comment"}),w("span",{className:"cm-composer__selector",children:N})]}),w(_7,{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:[w("button",{type:"button",className:"cm-btn",onClick:$,children:"Cancel"}),w("button",{type:"button",className:"cm-btn cm-btn--primary",disabled:!V.trim(),onClick:Y,children:"Save"})]})]})}var t7=null;function VQ(){let[J,Q]=h(null);return R(()=>{if(typeof fetch>"u")return;t7??=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 t7.then((V)=>$&&Q(V)),()=>{$=!1}},[]),J}function ZQ({comment:J,sequence:Q,onClose:$,onPatch:V,onDelete:Z,onReply:G,mine:B=!1}){let K=g(null),Y=g(null),j=g(null),[N,U]=h(""),[z,P]=h(!1),[X,M]=h(null),O=b(()=>{let W=(X??"").trim();if(!W)return;if(W!==J.text)V({text:W});M(null)},[X,J.text,V]);R(()=>{let W=()=>{j.current=null;let D=K.current;if(!D)return;let A=GQ(J),L=QJ(A,{w:D.offsetWidth,h:D.offsetHeight});D.style.left=`${Math.round(L.x)}px`,D.style.top=`${Math.round(L.y)}px`,j.current=requestAnimationFrame(W)};return j.current=requestAnimationFrame(W),()=>{if(j.current!=null)cancelAnimationFrame(j.current)}},[J]),R(()=>{K.current?.focus();let W=J.id;return()=>{document.querySelector(`[data-comment-pin="${W}"]`)?.focus()}},[J.id]),R(()=>{if(typeof document>"u")return;let W=(D)=>{if(D.key!=="Escape")return;let A=K.current;if(!A)return;if(A.contains(D.target)||document.activeElement===A)D.preventDefault(),$()};return document.addEventListener("keydown",W),()=>document.removeEventListener("keydown",W)},[$]);let q=b(async()=>{let W=N.trim();if(!W||z)return;P(!0);let D=await G(W);if(P(!1),D)U(""),Y.current?.focus()},[N,z,G]),H=b((W)=>{if((W.metaKey||W.ctrlKey)&&W.key==="Enter")W.preventDefault(),q()},[q]),_=`cm-thread-head-${J.id}`,F=qQ(J.selector,"");return x("div",{ref:K,className:"cm-thread",role:"dialog","aria-labelledby":_,tabIndex:-1,onClick:(W)=>W.stopPropagation(),onPointerDown:(W)=>W.stopPropagation(),children:[x("div",{className:"cm-thread__head",id:_,children:[x("div",{className:"cm-thread__head-row",children:[w("span",{className:"cm-thread__seq","aria-hidden":"true",children:Q}),w("span",{className:"cm-thread__author",children:J.author?.trim()||"unknown"}),w("span",{className:"cm-thread__time",children:JJ(J.created)}),w("button",{type:"button",className:"cm-thread__close","aria-label":"Close thread",title:"Close · Esc",onClick:$,children:"×"})]}),F?w("code",{className:"cm-thread__selector",children:F}):null]}),X===null?w("div",{className:"cm-thread__body",children:e7(J.text)}):x("div",{className:"cm-thread__reply-form",children:[w(_7,{className:"cm-thread__reply-textarea",value:X,placeholder:"Edit your comment… ⌘↵ to save",onChange:M,onKeyDown:(W)=>{if((W.metaKey||W.ctrlKey)&&W.key==="Enter")W.preventDefault(),O()},rows:3,ariaLabel:"Edit comment"}),x("div",{className:"cm-thread__reply-actions",children:[w("button",{type:"button",className:"cm-btn",onClick:()=>M(null),children:"Cancel"}),w("button",{type:"button",className:"cm-btn cm-btn--primary","data-testid":"comment-edit-save",disabled:!X.trim(),onClick:O,children:"Save"})]})]}),(J.thread??[]).map((W)=>x("div",{className:"cm-thread__reply",children:[x("div",{className:"cm-thread__reply-head",children:[w("span",{className:"cm-thread__reply-author",children:W.author?.trim()||"unknown"}),w("span",{className:"cm-thread__reply-time",children:JJ(W.created)})]}),w("div",{className:"cm-thread__reply-body",children:e7(W.body)})]},W.id)),!a()&&x(WQ,{children:[x("div",{className:"cm-thread__reply-form",children:[w(_7,{textareaRef:Y,className:"cm-thread__reply-textarea",value:N,placeholder:"Reply… ⌘↵ to send · @name to tag",onChange:U,onKeyDown:H,rows:2,ariaLabel:"Reply",disabled:z}),w("div",{className:"cm-thread__reply-actions",children:w("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:[B&&X===null?w("button",{type:"button",className:"cm-btn","data-testid":"comment-edit",onClick:()=>M(J.text),children:"Edit"}):null,J.status==="resolved"?w("button",{type:"button",className:"cm-btn",onClick:()=>V({status:"open"}),children:"↺ Reopen"}):w("button",{type:"button",className:"cm-btn cm-btn--primary",onClick:()=>{V({status:"resolved"}),$()},children:"✓ Resolve"}),w("button",{type:"button",className:"cm-btn cm-btn--danger",onClick:()=>{Z(),$()},children:"Delete"})]})]})]})}function e7(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 w("strong",{"data-mention":"true",children:V},G);return w("span",{children:V},G)})}function JJ(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 qQ(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 GQ(J){let Q=J.selector?I7(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 BQ(J){if(J.clientX||J.clientY)return{x:J.clientX,y:J.clientY+8};if(J.selection.selector){let Q=I7(J.selection);if(Q)return{x:Q.x,y:Q.y+Q.h+8}}return{x:16,y:16}}import{useEffect as KQ}from"react";var zQ=new Set(["pen","highlighter","shape","rect","ellipse","arrow","sticky","text","section","eraser"]);function A7(J){return zQ.has(J)}var t=(J)=>!!(J.metaKey||J.ctrlKey);function e(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(A7(J.activeTool))return{kind:"no-op"};if(J.activeTool==="hand")return{kind:"no-op"};if(J.activeTool==="browse"){if(!t(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:t(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(A7(J.activeTool)&&!t(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(!t(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=t(J);return{kind:"select",mode:!!J.shiftKey?"add":"replace",deep:Q,clientX:J.clientX??0,clientY:J.clientY??0}}return{kind:"no-op"}}function K7(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 J7(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 ZJ(J){if(!J||typeof J.closest!=="function")return!1;let Q=J;return!!Q.closest("[data-dc-screen]")&&!Q.closest(".dc-artboard-body")}function VJ(J,Q,$){return J.kind==="select"&&!$.metaKey&&!$.ctrlKey&&ZJ(Q)}function UQ(J,Q,$){return J==="select"&&!$.metaKey&&!$.ctrlKey&&ZJ(Q)}function qJ(J){let{hostRef:Q,getActiveTool:$,isSpaceHeld:V,callbacks:Z,enabled:G=!0,claimableActions:B}=J;KQ(()=>{if(!G)return;let K=Q.current;if(!K)return;let Y=(q)=>B&&q.kind!=="no-op"&&!B.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 H=Y(e({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(H)},U=(q)=>{if(J7(q.target))return;if(K7(q.target))return;let H=Y(e({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:$()})),_=VJ(H,q.target,q);if(H.kind!=="no-op"){if(q.preventDefault(),!_)q.stopImmediatePropagation()}j(H)},z=(q)=>{if(J7(q.target))return;if(K7(q.target))return;let H=Y(e({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:$()})),_=VJ(H,q.target,q);if(H.kind!=="no-op"){if(q.preventDefault(),!_)q.stopImmediatePropagation();if(H.kind==="select")try{window.focus()}catch{}}},P=(q)=>{if(J7(q.target))return;if(K7(q.target))return;let H=$(),_=q.metaKey||q.ctrlKey,F=H==="comment"?"drop-comment":H==="move"&&q.button===0?"select":(A7(H)||H==="browse")&&_&&q.button===0?"select":q.button===2?"context-menu":null;if(F&&(!B||B.has(F))){let W=UQ(F,q.target,q);if(q.preventDefault(),!W)q.stopImmediatePropagation()}},X=(q)=>{let H=Y(e({type:"contextmenu",clientX:q.clientX,clientY:q.clientY,metaKey:q.metaKey,ctrlKey:q.ctrlKey,shiftKey:q.shiftKey,altKey:q.altKey,activeTool:$()}));if(H.kind==="no-op")return;q.preventDefault(),q.stopImmediatePropagation(),j(H)},M=(q)=>{let H=Y(e({type:"keydown",key:q.key,metaKey:q.metaKey,ctrlKey:q.ctrlKey,shiftKey:q.shiftKey,altKey:q.altKey,isEditable:K7(q.target),activeTool:$()}));if(H.kind==="tool"||H.kind==="escape"||H.kind==="undo"||H.kind==="redo")q.preventDefault();j(H)};K.addEventListener("pointermove",N,{passive:!0}),K.addEventListener("pointerdown",U,{capture:!0}),K.addEventListener("mousedown",z,{capture:!0}),K.addEventListener("click",P,{capture:!0}),K.addEventListener("contextmenu",X,{capture:!0});let O=K.ownerDocument??document;return O.addEventListener("keydown",M,!0),()=>{K.removeEventListener("pointermove",N),K.removeEventListener("pointerdown",U,{capture:!0}),K.removeEventListener("mousedown",z,{capture:!0}),K.removeEventListener("click",P,{capture:!0}),K.removeEventListener("contextmenu",X,{capture:!0}),O.removeEventListener("keydown",M,!0)}},[G,Q,$,V,Z,B])}function O7(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,B=G?.getAttribute("data-dc-screen")??null,K=Z.closest?.(".dc-artboard-body")??null;if(!K){if(G&&B)return{el:G,cdId:null,artboardId:B};return null}if(Z===K){if(G&&B)return{el:G,cdId:null,artboardId:B};return null}if(V.deep){let z=Z.getAttribute?.("data-cd-id")??null;return{el:Z,cdId:z,artboardId:B}}let Y=Z,j=null;while(Y&&Y!==K){if(Y.hasAttribute?.("data-cd-id"))j=Y;Y=Y.parentElement}let N=j??Z,U=N.getAttribute?.("data-cd-id")??null;return{el:N,cdId:U,artboardId:B}}import{useCallback as EQ,useEffect as HJ,useRef as X7}from"react";var XQ=!1;function GJ(){return XQ}import{createContext as jQ,useCallback as $7,useContext as UJ,useEffect as T7,useMemo as WJ,useRef as b7,useState as z7}from"react";function m(J,Q,$,V){return`url("data:image/svg+xml,${encodeURIComponent(J.trim())}") ${Q} ${$}, ${V}`}var E7="width='24' height='24' viewBox='0 0 32 32' xmlns='http://www.w3.org/2000/svg'",w7="#1f1f1f",k7="stroke='#ffffff' stroke-linejoin='round' stroke-linecap='round'";function i(J,Q,$){let V=$?`<g transform='${$}'>`:"";return`<svg ${E7}>${V}<path fill='#ffffff' d='${J}'/><path fill='${w7}' d='${Q}'/>${$?"</g>":""}</svg>`}var BJ="translate(0,32) scale(1,-1)",HQ=m(i("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"),YQ=m(i("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"),FQ=m(i("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"),PQ=m(i("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",BJ),6,18,"crosshair"),DQ=m(i("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",BJ),6,18,"crosshair"),Q7=m(i("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"),LQ=m(i("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"),MQ=m(`<svg ${E7}><path d='M16 4V28M11 4H21M11 28H21' fill='none' ${k7} stroke-width='5'/><path d='M16 4V28M11 4H21M11 28H21' fill='none' stroke='${w7}' stroke-width='2.25' stroke-linecap='round'/></svg>`,12,12,"text"),NQ=m(`<svg ${E7}><path d='M6 5H21L26 10V27H6Z' fill='${w7}' ${k7} stroke-width='2.5'/><path d='M21 5V11H26' fill='none' ${k7} stroke-width='2.25'/></svg>`,5,5,"crosshair"),C=Object.freeze({browse:"default",move:HQ,hand:YQ,comment:FQ,pen:PQ,section:Q7,highlighter:DQ,shape:Q7,rect:Q7,ellipse:Q7,sticky:NQ,arrow:Q7,text:MQ,eraser:LQ});import{jsx as y7,Fragment as kQ}from"react/jsx-runtime";var x7="maude:tool-sync",KJ=Object.freeze({preview:"browse",edit:"move"});function zJ(J){if(J==="browse")return"preview";if(J==="move")return"edit";return null}var _Q=Object.freeze([{id:"browse",label:"Browse",shortcut:"",cursor:C.browse},{id:"move",label:"Select",shortcut:"V",cursor:C.move},{id:"hand",label:"Hand",shortcut:"H",cursor:C.hand},{id:"comment",label:"Comment",shortcut:"C",cursor:C.comment},{id:"pen",label:"Pen",shortcut:"B",cursor:C.pen},{id:"highlighter",label:"Highlighter",shortcut:"I",cursor:C.highlighter},{id:"shape",label:"Shape",shortcut:"R",cursor:C.shape},{id:"sticky",label:"Sticky",shortcut:"N",cursor:C.sticky},{id:"section",label:"Section",shortcut:"⇧S",cursor:C.shape},{id:"arrow",label:"Arrow",shortcut:"A",cursor:C.arrow},{id:"text",label:"Text",shortcut:"T",cursor:C.text},{id:"eraser",label:"Eraser",shortcut:"E",cursor:C.eraser}]),IQ=new Set(["browse","move","hand"]);function AQ(J,Q){return Q?J.filter(($)=>IQ.has($.id)):J}var v7=jQ(null);function OQ({children:J,tools:Q=_Q,initial:$,initialMode:V}){let Z=a(),G=WJ(()=>AQ(Q,Z),[Q,Z]),B=$??(Z?"browse":"move"),K=V??zJ(B)??(Z?"preview":"edit"),[Y,j]=z7(B),[N,U]=z7(K),[z,P]=z7(()=>({tool:null,locked:!1})),X=$7((I)=>{if(!G.some((k)=>k.id===I))return;j(I);let E=zJ(I);if(E)U(E);P((k)=>k.locked&&k.tool===I?k:{tool:null,locked:!1})},[G]),M=$7((I)=>{let E=KJ[I];if(!G.some((k)=>k.id===E))return;U(I),j(E),P((k)=>k.locked&&k.tool===E?k:{tool:null,locked:!1})},[G]),O=$7(()=>{X(KJ[N])},[N,X]),q=$7((I)=>{P((E)=>{if(E.locked&&E.tool===I)return{tool:null,locked:!1};return{tool:I,locked:!0}}),j(I)},[]),H=$7(()=>{P({tool:null,locked:!1})},[]),[_,F]=z7("rounded"),W=b7(Math.random().toString(36).slice(2)),D=b7(Y);D.current=Y;let A=b7(!1);T7(()=>{if(!A.current){A.current=!0;return}if(typeof document>"u")return;document.dispatchEvent(new CustomEvent(x7,{detail:{tool:Y,from:W.current}}))},[Y]),T7(()=>{if(typeof document>"u")return;let I=(E)=>{let k=E.detail;if(!k||k.from===W.current||typeof k.tool!=="string")return;if(k.tool===D.current)return;X(k.tool)};return document.addEventListener(x7,I),()=>document.removeEventListener(x7,I)},[X]),T7(()=>{if(typeof document>"u")return;let I=G.find((T)=>T.id===Y);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(Y==="browse"){if(document.body.style.cursor="",k.textContent="",typeof window<"u"&&window.parent&&window.parent!==window)try{window.parent.postMessage({dgn:"tool-cursor",tool:Y},"*")}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:Y},"*")}catch{}return()=>{document.body.style.cursor=E;let T=document.getElementById("dc-tool-cursor");if(T)T.textContent=""}},[Y,G]);let L=WJ(()=>({tool:Y,setTool:X,tools:G,mode:N,setMode:M,resetTool:O,sticky:z,toggleSticky:q,clearSticky:H,shapeKind:_,setShapeKind:F}),[Y,X,G,N,M,O,z,q,H,_]);return y7(v7.Provider,{value:L,children:J})}function XJ({children:J,initial:Q,initialMode:$}){if(UJ(v7))return y7(kQ,{children:J});return y7(OQ,{initial:Q,initialMode:$,children:J})}function U7(){let J=UJ(v7);if(!J)throw Error("useToolMode must be used inside <ToolProvider>");return J}import{jsx as fQ}from"react/jsx-runtime";var wQ=`
|
|
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 pQ,createElement as S7,useCallback as C7,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 TQ(){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=wQ,document.head.appendChild(J)}var bQ=["nw","n","ne","e","se","s","sw","w"];function xQ(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,H7=1;function yQ(J,Q,$,V,Z,G){let{movesLeft:B,movesRight:K,movesTop:Y,movesBottom:j}=xQ(J),N=Z.center,U=Q.w,z=Q.h;if(K)U=Q.w+(N?2*$:$);else if(B)U=Q.w-(N?2*$:$);if(j)z=Q.h+(N?2*V:V);else if(Y)z=Q.h-(N?2*V:V);if(Z.aspect&&Q.w>0&&Q.h>0){let X=Q.w/Q.h;if((B||K)&&(Y||j)){let O=Math.abs(U-Q.w)/Q.w,q=Math.abs(z-Q.h)/Q.h;if(O>=q)z=U/X;else U=z*X}else if(B||K)z=U/X;else if(Y||j)U=z*X}if(U<H7)U=H7;if(z<H7)z=H7;let P={width:n(U),height:n(z)};if(N){if(G.canMoveLeft&&(B||K))P.left=n(Q.left+(Q.w-U)/2);if(G.canMoveTop&&(Y||j))P.top=n(Q.top+(Q.h-z)/2)}else{if(G.canMoveLeft&&B)P.left=n(Q.left+Q.w-U);if(G.canMoveTop&&Y)P.top=n(Q.top+Q.h-z)}return P}function YJ(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 vQ(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 vQ($.transform)*V}function FJ(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 PJ(J,Q,$,V){return Math.atan2(V-Q,$-J)}function SQ(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 RQ(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 gQ(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 hQ(J,Q){try{window.parent.postMessage({dgn:"resize-request",id:J.cdId,patch:{transform:Q},before:J.before,idIndex:J.idIndex},"*")}catch{}}function DJ(){TQ();let{selected:J}=W7(),{tool:Q}=U7(),$=X7(null),V=X7(null),Z=X7(null),G=X7(null),B=J.length===1?J[0]:null,K=B&&typeof B.id==="string"?B.id:null,Y=B&&!K&&typeof B.artboardId==="string"?B.artboardId:null,j=Q==="move"&&(!!K||!!Y);HJ(()=>{let U=$.current;if(!U)return;let z=()=>{for(let X of Array.from(U.children)){let M=X;M.style.opacity="0",M.style.pointerEvents="none"}};if(!j||!B){z();return}let P=()=>{if(V.current=null,GJ()){z(),V.current=requestAnimationFrame(P);return}let X=P7(document,B);if(!X){z(),V.current=requestAnimationFrame(P);return}let M=X.getBoundingClientRect();if(M.width<=0&&M.height<=0){z(),V.current=requestAnimationFrame(P);return}let O=Y?["e","s","se"]:bQ,q=Y?[]:["rot-nw","rot-ne","rot-sw","rot-se"],H=O.length+q.length+1;while(U.children.length<H)U.appendChild(document.createElement("div"));while(U.children.length>H)U.lastChild&&U.removeChild(U.lastChild);let _=M.left+M.width/2,F=M.top+M.height/2,W=YJ(getComputedStyle(X).transform),D=CQ(X),A=X.offsetWidth*D/2,L=X.offsetHeight*D/2,I={nw:[-A,-L],n:[0,-L],ne:[A,-L],e:[A,0],se:[A,L],s:[0,L],sw:[-A,L],w:[-A,0],"rot-nw":[-A,-L],"rot-ne":[A,-L],"rot-sw":[-A,L],"rot-se":[A,L]},E=[...q,...O];for(let f=0;f<E.length;f++){let y=E[f],v=U.children[f],[d,c]=I[y]??[0,0],[IJ,AJ]=FJ(d,c,W),OJ=_+IJ,kJ=F+AJ,Y7=y.startsWith("rot-"),g7=y==="n"||y==="s",h7=y==="e"||y==="w",EJ=Y7?10:g7?7:h7?3:4,wJ=Y7?10:g7?3:h7?7:4;v.className="dc-el-resize-handle",v.dataset.corner=y,v.style.opacity="1",v.style.pointerEvents="auto",v.style.left=`${Math.round(OJ-EJ)}px`,v.style.top=`${Math.round(kJ-wJ)}px`,v.style.transform=Y7?"":`rotate(${W}deg)`}let k=U.children[E.length],T=Z.current;if(T&&T.el===X&&!T.corner.startsWith("rot-")){let f=T.lastResult?.width??X.offsetWidth,y=T.lastResult?.height??X.offsetHeight,v=`${Math.round(f)} × ${Math.round(y)}`,d=T.lastResult?.left,c=T.lastResult?.top;if(typeof d==="number"||typeof c==="number")v+=` · ${Math.round(d??T.start.left)}, ${Math.round(c??T.start.top)}`;k.className="dc-el-resize-readout",k.textContent=v,k.style.opacity="1",k.style.left=`${Math.round(_)}px`,k.style.top=`${Math.round(F+L)}px`}else k.style.opacity="0";V.current=requestAnimationFrame(P)};return V.current=requestAnimationFrame(P),()=>{if(V.current!=null)cancelAnimationFrame(V.current)}},[j,B,Y]);let N=EQ((U,z)=>{if(U.el.style.width=`${z.width}px`,U.el.style.height=`${z.height}px`,typeof z.left==="number")U.el.style.left=`${z.left}px`;if(typeof z.top==="number")U.el.style.top=`${z.top}px`;U.lastResult=z},[]);return HJ(()=>{let U=$.current;if(!U)return;let z=(q,H)=>{let[_,F]=FJ(H.clientX-q.startClientX,H.clientY-q.startClientY,-q.angle);return yQ(q.corner,q.start,_/q.elZoom,F/q.elZoom,{aspect:!!H.shiftKey,center:!q.artboardId&&!!H.altKey},q.flags)},P=(q)=>{let H=q.target;if(!H?.classList.contains("dc-el-resize-handle"))return;let _=H.dataset.corner;if(!_||!B)return;let F=typeof B.id==="string"?B.id:null,W=!F&&typeof B.artboardId==="string"?B.artboardId:null;if(!F&&!W)return;let D=P7(document,B);if(!D)return;q.preventDefault(),q.stopPropagation();let A=D.getBoundingClientRect(),L=D.offsetWidth?A.width/D.offsetWidth:1,I=getComputedStyle(D),E=!W&&(I.position==="absolute"||I.position==="fixed"),k=W?Number.NaN:Number.parseFloat(D.style.left),T=W?Number.NaN:Number.parseFloat(D.style.top),f=W?0:YJ(I.transform),y=L>0?L:1,v=A.left+A.width/2,d=A.top+A.height/2,c={pointerId:q.pointerId,corner:_,el:D,cdId:F??"",artboardId:W,idIndex:F?d7(document,F,D):0,startClientX:q.clientX,startClientY:q.clientY,elZoom:y,angle:f,cx:v,cy:d,rotStartPointer:PJ(v,d,q.clientX,q.clientY),start:{w:(f?D.offsetWidth:A.width/y)||A.width/y,h:(f?D.offsetHeight:A.height/y)||A.height/y,left:k,top:T},flags:{canMoveLeft:E&&Number.isFinite(k),canMoveTop:E&&Number.isFinite(T)},before:{width:D.style.width||null,height:D.style.height||null,left:D.style.left||null,top:D.style.top||null,transform:D.style.transform||null},lastResult:null,lastTransform:null};Z.current=c;try{H.setPointerCapture(q.pointerId)}catch{}},X=(q)=>{let H=Z.current;if(!H||q.pointerId!==H.pointerId)return;if(q.preventDefault(),H.corner.startsWith("rot-")){let F=`rotate(${SQ(H.angle,H.rotStartPointer,PJ(H.cx,H.cy,q.clientX,q.clientY),!!q.shiftKey)}deg)`;H.el.style.transform=F,H.lastTransform=F;return}N(H,z(H,q))},M=(q)=>{let H=Z.current;if(!H||q.pointerId!==H.pointerId)return;if(Z.current=null,H.corner.startsWith("rot-")){let W=H.lastTransform;if(!W||W===H.before.transform)return;G.current={el:H.el,before:H.before},hQ(H,W);return}let _=H.lastResult??z(H,q);if(!(`${_.width}px`!==H.before.width||`${_.height}px`!==H.before.height||typeof _.left==="number"&&`${_.left}px`!==H.before.left||typeof _.top==="number"&&`${_.top}px`!==H.before.top))return;if(G.current={el:H.el,before:H.before},H.artboardId)gQ(H,_);else RQ(H,_)},O=(q)=>{let H=q.data;if(H?.dgn!=="resize-failed"&&H?.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 U.addEventListener("pointerdown",P),window.addEventListener("pointermove",X),window.addEventListener("pointerup",M),window.addEventListener("pointercancel",M),window.addEventListener("message",O),()=>{U.removeEventListener("pointerdown",P),window.removeEventListener("pointermove",X),window.removeEventListener("pointerup",M),window.removeEventListener("pointercancel",M),window.removeEventListener("message",O)}},[B,N]),fQ("div",{ref:$,"aria-hidden":"true"})}import{jsx as S,jsxs as _J,Fragment as tQ}from"react/jsx-runtime";var dQ=new Set(["drop-comment","tool","escape","hover"]);function Z7(){return typeof document<"u"&&!document.querySelector(".dc-canvas")}function R7(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 iQ(J,Q){let $=R7(J,Q);if(!$)return null;return $.closest("[data-cd-id]")??$}function cQ({children:J,file:Q}){let{tool:$,setTool:V}=U7(),Z=W7(),G=u(null),[B,K]=V7(null),Y=u($);Y.current=$;let j=uQ(()=>()=>Y.current,[]);p(()=>{if($!=="comment")K(null)},[$]);let[N,U]=V7(null),[z,P]=V7(!1);return p(()=>{let X=()=>P(Z7());X();let M=requestAnimationFrame(X),O=setTimeout(X,120);return()=>{cancelAnimationFrame(M),clearTimeout(O)}},[]),p(()=>{if(typeof document>"u")return;let X=(M)=>{if(M.button!==0||!(M.metaKey||M.ctrlKey))return;if(!Z7())return;if(J7(M.target))return;let O=iQ(M.clientX,M.clientY);if(!O)return;M.preventDefault(),M.stopImmediatePropagation();let q=O.getAttribute("data-cd-id"),H=D7({el:O,cdId:q,artboardId:null});if(M.shiftKey)Z.add(H);else Z.replace(H);U(O)};return document.addEventListener("pointerdown",X,!0),()=>document.removeEventListener("pointerdown",X,!0)},[Z]),p(()=>{if(Z.selected.length===0)U(null)},[Z.selected]),p(()=>{let X=G.current;if(X)X.setAttribute("data-active-tool",$);if(typeof document<"u"&&document.body)document.body.setAttribute("data-active-tool",$);return()=>{X?.removeAttribute("data-active-tool")}},[$]),p(()=>{if(typeof window>"u")return;let X=(M)=>{let O=M.data;if(!O||typeof O!=="object"||O.dgn!=="tool-set")return;if(typeof O.tool==="string")V(O.tool)};return window.addEventListener("message",X),()=>window.removeEventListener("message",X)},[V]),qJ({hostRef:G,getActiveTool:j,claimableActions:dQ,callbacks:{onHover:({clientX:X,clientY:M})=>{if(Y.current!=="comment"||!Z7()){K(null);return}let O=R7(X,M);K((q)=>q===O?q:O)},onTool:({tool:X})=>V(X),onEscape:()=>{if(Y.current!=="move")V("move");if(K(null),Z.clear(),typeof window<"u")try{window.parent.postMessage({dgn:"force-clear"},"*")}catch{}},onDropComment:({clientX:X,clientY:M})=>nQ(X,M,Z,Q)}}),_J("div",{"data-mc-host":!0,ref:G,style:{display:"contents"},children:[J,B?S(rQ,{el:B}):null,N?S(lQ,{el:N}):null,z?S(DJ,{}):null,S($J,{})]})}function lQ({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,B=$.current;if(G&&B?.isConnected){let K=B.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 rQ({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,B=$.current;if(G&&B?.isConnected){let K=B.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 nQ(J,Q,$,V){if(typeof document>"u")return;let Z=O7(document,J,Q,{deep:!0});if(!Z)Z=O7(document,J,Q,{deep:!1});if(!Z&&!Z7()&&typeof document.elementsFromPoint==="function"){let B=document.elementsFromPoint(J,Q);for(let K of B){let Y=K.closest?.("[data-cd-id]");if(!Y)continue;if(!Y.closest(".dc-artboard-body"))continue;let j=Y.closest("[data-dc-screen]");Z={el:Y,cdId:Y.getAttribute("data-cd-id"),artboardId:j?.getAttribute("data-dc-screen")??null};break}}if(!Z&&Z7()){let B=R7(J,Q);if(B)Z={el:B,cdId:B.getAttribute("data-cd-id"),artboardId:null}}if(!Z){let B={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:""};LJ(B,J,Q);return}let G=D7(Z,V);$.replace(G),LJ(G,J,Q)}function LJ(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 NJ(J,Q){return S(XJ,{initial:"browse",children:S(a7,{children:S(cQ,{file:Q,children:S(J,{})})})})}function q3(J,Q){let $=mQ(Q.rootEl);if(!Q.commentsEnabled){$.render(S7(J));return}let V=Q.file??F7();$.render(S7(sQ,{initialCanvas:J,file:V}))}var MJ="__maudeCanvasRuntime";function aQ({Canvas:J,file:Q,onOk:$}){return p(()=>{$()},[]),NJ(J,Q)}class jJ extends pQ{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 oQ({message:J}){return S7("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 sQ({initialCanvas:J,file:Q}){let[{canvas:$,attempt:V},Z]=V7({canvas:J,attempt:0}),[G,B]=V7({on:!1}),K=u(null),Y=u($);Y.current=$,p(()=>{let z={remount:(P)=>Z((X)=>({canvas:P,attempt:X.attempt+1})),setHolding:(P,X)=>B(P?{on:!0,message:X}:{on:!1})};return window[MJ]=z,()=>{window[MJ]=void 0}},[]);let j=C7(()=>{if(K.current=Y.current,B((z)=>z.on?{on:!1}:z),V>0&&Q)try{window.parent.postMessage({dgn:"loaded",file:Q},"*")}catch{}},[V,Q]),N=C7(()=>{B({on:!0,message:"render error"})},[]),U=C7(()=>{let z=K.current;return z?NJ(z,Q):null},[Q]);return _J(tQ,{children:[S(jJ,{attempt:V,onError:N,fallback:U,children:S(aQ,{Canvas:$,file:Q,onOk:j},V)}),G.on?S(oQ,{message:G.message}):null]})}export{iQ as pickSpecimenSelectEl,q3 as mountCanvas,Z7 as isBareSpecimen,jJ 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 →
|
|
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[]`
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
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
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
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.
|
|
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.
|
|
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. */
|
package/apps/studio/git/watch.ts
CHANGED
|
@@ -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) ||
|
|
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 {
|
package/apps/studio/http.ts
CHANGED
|
@@ -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
|
-
//
|
|
2404
|
-
// GET ?file=<repo-relative-canvas-path>
|
|
2405
|
-
// PUT body { file, svg }
|
|
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
|
|
2411
|
-
|
|
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': '
|
|
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
|
-
|
|
2434
|
+
board?: unknown;
|
|
2435
|
+
svg?: unknown;
|
|
2425
2436
|
writeId?: unknown;
|
|
2426
2437
|
base?: unknown;
|
|
2427
|
-
}>(req,
|
|
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,
|
|
2440
|
+
return new Response('body must include { file, board }', { status: 400 });
|
|
2430
2441
|
}
|
|
2431
|
-
|
|
2432
|
-
|
|
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
|
-
|
|
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
|
|
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
|