drawboard-microservice 1.0.4 → 1.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (163) hide show
  1. package/{dist → dist-app}/assets/index-DxkNA4rg.js +1 -0
  2. package/dist-app/assets/index-DxkNA4rg.js.map +1 -0
  3. package/package.json +4 -2
  4. package/vite.config.ts +80 -6
  5. /package/{dist → dist-app}/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  6. /package/{dist → dist-app}/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  7. /package/{dist → dist-app}/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  8. /package/{dist → dist-app}/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  9. /package/{dist → dist-app}/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  10. /package/{dist → dist-app}/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  11. /package/{dist → dist-app}/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  12. /package/{dist → dist-app}/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  13. /package/{dist → dist-app}/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  14. /package/{dist → dist-app}/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  15. /package/{dist → dist-app}/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  16. /package/{dist → dist-app}/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  17. /package/{dist → dist-app}/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  18. /package/{dist → dist-app}/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  19. /package/{dist → dist-app}/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  20. /package/{dist → dist-app}/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  21. /package/{dist → dist-app}/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  22. /package/{dist → dist-app}/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  23. /package/{dist → dist-app}/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  24. /package/{dist → dist-app}/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  25. /package/{dist → dist-app}/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  26. /package/{dist → dist-app}/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  27. /package/{dist → dist-app}/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  28. /package/{dist → dist-app}/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  29. /package/{dist → dist-app}/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  30. /package/{dist → dist-app}/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  31. /package/{dist → dist-app}/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  32. /package/{dist → dist-app}/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  33. /package/{dist → dist-app}/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  34. /package/{dist → dist-app}/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  35. /package/{dist → dist-app}/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  36. /package/{dist → dist-app}/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  37. /package/{dist → dist-app}/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  38. /package/{dist → dist-app}/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  39. /package/{dist → dist-app}/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  40. /package/{dist → dist-app}/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  41. /package/{dist → dist-app}/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  42. /package/{dist → dist-app}/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  43. /package/{dist → dist-app}/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  44. /package/{dist → dist-app}/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  45. /package/{dist → dist-app}/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  46. /package/{dist → dist-app}/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  47. /package/{dist → dist-app}/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  48. /package/{dist → dist-app}/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  49. /package/{dist → dist-app}/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  50. /package/{dist → dist-app}/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  51. /package/{dist → dist-app}/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  52. /package/{dist → dist-app}/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  53. /package/{dist → dist-app}/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  54. /package/{dist → dist-app}/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  55. /package/{dist → dist-app}/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  56. /package/{dist → dist-app}/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  57. /package/{dist → dist-app}/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  58. /package/{dist → dist-app}/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  59. /package/{dist → dist-app}/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  60. /package/{dist → dist-app}/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  61. /package/{dist → dist-app}/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  62. /package/{dist → dist-app}/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  63. /package/{dist → dist-app}/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  64. /package/{dist → dist-app}/assets/index-uvzSCXM2.css +0 -0
  65. /package/{dist → dist-app}/icon-align-64-default.png +0 -0
  66. /package/{dist → dist-app}/icon-align-justify-64-active.png +0 -0
  67. /package/{dist → dist-app}/icon-align-justify-64-default 1.png +0 -0
  68. /package/{dist → dist-app}/icon-align-justify-64-default.png +0 -0
  69. /package/{dist → dist-app}/icon-align-justify-64-hover.png +0 -0
  70. /package/{dist → dist-app}/icon-align-left-64-active.png +0 -0
  71. /package/{dist → dist-app}/icon-align-left-64-default 1.png +0 -0
  72. /package/{dist → dist-app}/icon-align-left-64-default.png +0 -0
  73. /package/{dist → dist-app}/icon-align-left-64-hover.png +0 -0
  74. /package/{dist → dist-app}/icon-align-right-64-active.png +0 -0
  75. /package/{dist → dist-app}/icon-align-right-64-default.png +0 -0
  76. /package/{dist → dist-app}/icon-align-right-64-hover.png +0 -0
  77. /package/{dist → dist-app}/icon-bold-64-active.png +0 -0
  78. /package/{dist → dist-app}/icon-bold-64-default 1.png +0 -0
  79. /package/{dist → dist-app}/icon-bold-64-default.png +0 -0
  80. /package/{dist → dist-app}/icon-bold-64-hover.png +0 -0
  81. /package/{dist → dist-app}/icon-broom-64-active.png +0 -0
  82. /package/{dist → dist-app}/icon-broom-64-default.png +0 -0
  83. /package/{dist → dist-app}/icon-broom-64-hover.png +0 -0
  84. /package/{dist → dist-app}/icon-cancel-64-active.png +0 -0
  85. /package/{dist → dist-app}/icon-cancel-64-default.png +0 -0
  86. /package/{dist → dist-app}/icon-cancel-64-hover.png +0 -0
  87. /package/{dist → dist-app}/icon-change-64-active.png +0 -0
  88. /package/{dist → dist-app}/icon-change-64-default.png +0 -0
  89. /package/{dist → dist-app}/icon-change-64-hover.png +0 -0
  90. /package/{dist → dist-app}/icon-circle-64-active.png +0 -0
  91. /package/{dist → dist-app}/icon-circle-64-default.png +0 -0
  92. /package/{dist → dist-app}/icon-circle-64-hover.png +0 -0
  93. /package/{dist → dist-app}/icon-close-64-active.png +0 -0
  94. /package/{dist → dist-app}/icon-close-64-default.png +0 -0
  95. /package/{dist → dist-app}/icon-close-64-hover.png +0 -0
  96. /package/{dist → dist-app}/icon-cursor-64-active.png +0 -0
  97. /package/{dist → dist-app}/icon-cursor-64-default.png +0 -0
  98. /package/{dist → dist-app}/icon-cursor-64-hover.png +0 -0
  99. /package/{dist → dist-app}/icon-delete-trash-64-active.png +0 -0
  100. /package/{dist → dist-app}/icon-delete-trash-64-default.png +0 -0
  101. /package/{dist → dist-app}/icon-delete-trash-64-hover.png +0 -0
  102. /package/{dist → dist-app}/icon-done-64-active.png +0 -0
  103. /package/{dist → dist-app}/icon-done-64-default.png +0 -0
  104. /package/{dist → dist-app}/icon-done-64-hover.png +0 -0
  105. /package/{dist → dist-app}/icon-edit-text-file-64-active.png +0 -0
  106. /package/{dist → dist-app}/icon-edit-text-file-64-default 1.png +0 -0
  107. /package/{dist → dist-app}/icon-edit-text-file-64-default.png +0 -0
  108. /package/{dist → dist-app}/icon-edit-text-file-64-hover.png +0 -0
  109. /package/{dist → dist-app}/icon-eraser-64-active.png +0 -0
  110. /package/{dist → dist-app}/icon-eraser-64-default.png +0 -0
  111. /package/{dist → dist-app}/icon-eraser-64-hover.png +0 -0
  112. /package/{dist → dist-app}/icon-font-style-64-active.png +0 -0
  113. /package/{dist → dist-app}/icon-font-style-64-default.png +0 -0
  114. /package/{dist → dist-app}/icon-font-style-64-hover.png +0 -0
  115. /package/{dist → dist-app}/icon-formula-fx-64-active.png +0 -0
  116. /package/{dist → dist-app}/icon-formula-fx-64-default.png +0 -0
  117. /package/{dist → dist-app}/icon-formula-fx-64-hover.png +0 -0
  118. /package/{dist → dist-app}/icon-highlighter-64-active.png +0 -0
  119. /package/{dist → dist-app}/icon-highlighter-64-default.png +0 -0
  120. /package/{dist → dist-app}/icon-highlighter-64-hover.png +0 -0
  121. /package/{dist → dist-app}/icon-installing-64-active.png +0 -0
  122. /package/{dist → dist-app}/icon-installing-64-default.png +0 -0
  123. /package/{dist → dist-app}/icon-installing-64-hover.png +0 -0
  124. /package/{dist → dist-app}/icon-italic-64-active.png +0 -0
  125. /package/{dist → dist-app}/icon-italic-64-default 1.png +0 -0
  126. /package/{dist → dist-app}/icon-italic-64-default.png +0 -0
  127. /package/{dist → dist-app}/icon-italic-64-hover.png +0 -0
  128. /package/{dist → dist-app}/icon-line-64-active.png +0 -0
  129. /package/{dist → dist-app}/icon-line-64-default.png +0 -0
  130. /package/{dist → dist-app}/icon-line-64-hover.png +0 -0
  131. /package/{dist → dist-app}/icon-pen-64-active.png +0 -0
  132. /package/{dist → dist-app}/icon-pen-64-default.png +0 -0
  133. /package/{dist → dist-app}/icon-pen-64-hover.png +0 -0
  134. /package/{dist → dist-app}/icon-pin-64-active.png +0 -0
  135. /package/{dist → dist-app}/icon-pin-64-default.png +0 -0
  136. /package/{dist → dist-app}/icon-pin-64-hover.png +0 -0
  137. /package/{dist → dist-app}/icon-redo-64-active.png +0 -0
  138. /package/{dist → dist-app}/icon-redo-64-default.png +0 -0
  139. /package/{dist → dist-app}/icon-redo-64-hover.png +0 -0
  140. /package/{dist → dist-app}/icon-return-64-active.png +0 -0
  141. /package/{dist → dist-app}/icon-return-64-default.png +0 -0
  142. /package/{dist → dist-app}/icon-return-64-hover.png +0 -0
  143. /package/{dist → dist-app}/icon-select-active.png +0 -0
  144. /package/{dist → dist-app}/icon-select-default.png +0 -0
  145. /package/{dist → dist-app}/icon-select-hover.png +0 -0
  146. /package/{dist → dist-app}/icon-square-64-active.png +0 -0
  147. /package/{dist → dist-app}/icon-square-64-default.png +0 -0
  148. /package/{dist → dist-app}/icon-square-64-hover.png +0 -0
  149. /package/{dist → dist-app}/icon-strikethrough-64-active.png +0 -0
  150. /package/{dist → dist-app}/icon-strikethrough-64-default 1.png +0 -0
  151. /package/{dist → dist-app}/icon-strikethrough-64-default.png +0 -0
  152. /package/{dist → dist-app}/icon-strikethrough-64-hover.png +0 -0
  153. /package/{dist → dist-app}/icon-text-64-active.png +0 -0
  154. /package/{dist → dist-app}/icon-text-64-default.png +0 -0
  155. /package/{dist → dist-app}/icon-text-64-hover.png +0 -0
  156. /package/{dist → dist-app}/icon-u-turn-to-right-64-active.png +0 -0
  157. /package/{dist → dist-app}/icon-u-turn-to-right-64-default.png +0 -0
  158. /package/{dist → dist-app}/icon-u-turn-to-right-64-hover.png +0 -0
  159. /package/{dist → dist-app}/icon-under-64-active.png +0 -0
  160. /package/{dist → dist-app}/icon-under-64-default 1.png +0 -0
  161. /package/{dist → dist-app}/icon-under-64-default.png +0 -0
  162. /package/{dist → dist-app}/icon-under-64-hover.png +0 -0
  163. /package/{dist → dist-app}/index.html +0 -0
@@ -304,3 +304,4 @@ l0,-`+(a+144)+`c-2,-159.3,-10,-310.7,-24,-454c-53.3,-528,-210,-949.7,
304
304
  `).length||1,U=Math.max(H*C*1.2,50);z.height=U}else if(_.type==="latex"){const C=zc(_.latex||"",D);z.width=C.width,z.height=C.height;const H=lr(_.latex||"",D);z.latexRendered=H}}if(_.type==="latex"&&p==="stroke"){const D=lr(_.latex||"",_.fontSize||i);z.latexRendered=D}return z}return _});t(E),a(E)}},[s,t,a,i]),h=bt.useCallback((g,p)=>{if(!g)return;const b=s.find(z=>z.id===g);if(!b||b.type!=="text")return;let E;const _=b.textDecoration||"none";switch(p){case"bold":const z=b.fontWeight==="bold"?"normal":"bold";o(g,"fontWeight",z);break;case"italic":const D=b.fontStyle==="italic"?"normal":"italic";o(g,"fontStyle",D);break;case"underline":_.includes("underline")?_==="underline"?E="none":_==="underline line-through"?E="line-through":(E=_.replace("underline","").trim(),E===""&&(E="none")):_==="none"?E="underline":_==="line-through"?E="underline line-through":E=(_+" underline").trim(),o(g,"textDecoration",E);break;case"strikethrough":_.includes("line-through")?_==="line-through"?E="none":_==="underline line-through"?E="underline":(E=_.replace("line-through","").trim(),E===""&&(E="none")):_==="none"?E="line-through":_==="underline"?E="underline line-through":E=(_+" line-through").trim(),o(g,"textDecoration",E);break}},[s,o]),d=bt.useCallback((g,p,b)=>{if(!g)return;const E=s.find(_=>_.id===g);if(E&&(E.type==="text"||E.type==="latex")){const _=E.fontSize||i,z=b?2:1,D=p==="up"?_+z:Math.max(1,_-z);o(g,"fontSize",D)}},[s,i,o]);return{updateSelectedTextProperty:o,toggleTextStyle:h,changeFontSizeWithStep:d}},hb=(s,t,a)=>({insertLatexSymbol:bt.useCallback(o=>{if(s.current&&t){const h=s.current,d=h.selectionStart,g=h.selectionEnd;let p=d,b=o;if(o.includes("\\frac{}{}")){const C=o.indexOf("{")+1;p=d+C}else if(o.includes("\\sqrt[]{}")){const C=o.indexOf("{",o.indexOf("[]")+2)+1;p=d+C}else if(o.includes("\\sqrt{}")){const C=o.indexOf("{")+1;p=d+C}else if(o.includes("^{}")){const C=o.indexOf("^{}")+2;p=d+C}else if(o.includes("_{}")){const C=o.indexOf("_{}")+2;p=d+C}else if(o.includes("\\sum_{}^{}")){const C=o.indexOf("_{}")+2;p=d+C}else if(o.includes("\\int_{}^{}")){const C=o.indexOf("_{}")+2;p=d+C}else if(o.includes("\\lim_{}")){const C=o.indexOf("{")+1;p=d+C}else if(o.includes("\\left( \\right)")){const C=o.indexOf("\\left(")+6;p=d+C,b="\\left( \\right)"}else if(o.includes("\\left[ \\right]")){const C=o.indexOf("\\left[")+6;p=d+C,b="\\left[ \\right]"}else if(o.includes("\\left\\{ \\right\\}")){const C=o.indexOf("\\left\\{")+7;p=d+C,b="\\left\\{ \\right\\}"}else if(o.includes("\\left| \\right|")){const C=o.indexOf("\\left|")+6;p=d+C,b="\\left| \\right|"}const E=h.value,_=E.substring(0,d),z=E.substring(g),D=_+b+z;a(D),setTimeout(()=>{if(s.current){const C=d+p;s.current.focus(),s.current.setSelectionRange(C,C)}},0)}},[s,t,a])}),Vd=s=>{if(s.length===0)return{x:0,y:0,width:0,height:0};let t=s[0],a=s[0],i=s[1],o=s[1];for(let h=0;h<s.length;h+=2){const d=s[h],g=s[h+1];d<t&&(t=d),d>a&&(a=d),g<i&&(i=g),g>o&&(o=g)}return{x:t,y:i,width:a-t,height:o-i}},fb=(s,t,a)=>{const i=[];for(let o=0;o<s.length;o+=2){const h=s[o],d=s[o+1],g=t.width!==0?(h-t.x)/t.width:0,p=t.height!==0?(d-t.y)/t.height:0;i.push(a.x+g*a.width),i.push(a.y+p*a.height)}return i},A6=(s,t,a)=>{const i=s.x-t.x,o=s.y-t.y,h=a.x-t.x,d=a.y-t.y,g=i*h+o*d,p=h*h+d*d;let b=-1;p!==0&&(b=g/p);let E,_;b<0?(E=t.x,_=t.y):b>1?(E=a.x,_=a.y):(E=t.x+b*h,_=t.y+b*d);const z=s.x-E,D=s.y-_;return Math.sqrt(z*z+D*D)},Td=(s,t)=>{if(s.type==="path"||s.type==="highlighter"){if(!s.points||s.points.length<4)return!1;for(let a=0;a<s.points.length-2;a+=2){const i=s.points[a],o=s.points[a+1],h=s.points[a+2],d=s.points[a+3];if(A6(t,{x:i,y:o},{x:h,y:d})<10)return!0}return!1}if(s.type==="rectangle"||s.type==="text"||s.type==="latex"){const a=Math.min(s.x,s.x+s.width),i=Math.min(s.y,s.y+s.height),o=Math.abs(s.width),h=Math.abs(s.height);return t.x>=a&&t.x<=a+o&&t.y>=i&&t.y<=i+h}if(s.type==="ellipse"){const a=s.x+s.width/2,i=s.y+s.height/2,o=Math.abs(s.width)/2,h=Math.abs(s.height)/2,d=t.x-a,g=t.y-i;return d*d/(o*o)+g*g/(h*h)<=1}if(s.type==="line"&&s.points){const[a,i,o,h]=s.points;return A6(t,{x:a,y:i},{x:o,y:h})<10}return!1},db=(s,t)=>{const a=s.width>=0?s.x:s.x+s.width,i=s.height>=0?s.y:s.y+s.height,o=Math.abs(s.width),h=Math.abs(s.height),d=t.width>=0?t.x:t.x+t.width,g=t.height>=0?t.y:t.y+t.height,p=Math.abs(t.width),b=Math.abs(t.height);return d>=a&&g>=i&&d+p<=a+o&&g+b<=i+h},mb=(s,t,a,i,o,h,d,g,p,b,E,_,z,D,C,H,U,B)=>{const[X,k]=bt.useState(!1),[j,nt]=bt.useState({x:0,y:0}),[ut,st]=bt.useState({x:0,y:0}),[ot,St]=bt.useState([]),[Zt,qt]=bt.useState(new Set),[Nt,$t]=bt.useState(null),Vt=bt.useCallback((mt,Lt,xt,G)=>{const Bt=xt>=0?mt:mt+xt,wt=G>=0?Lt:Lt+G,Mt=Math.abs(xt),Xt=Math.abs(G),It=Math.max(0,Math.min(Bt,6e3-Mt)),Pt=Math.max(0,Math.min(wt,2500-Xt));let ze=It,re=Pt,me=xt,Je=G;return xt<0&&(ze=It-Mt),G<0&&(re=Pt-Xt),{x:ze,y:re,width:me,height:Je}},[]),Et=bt.useCallback(mt=>{const Lt=mt.target.getStage(),xt=Lt.getPointerPosition(),G=Lt.container(),I=xt.x/C+G.scrollLeft/C,gt=xt.y/C+G.scrollTop/C,Bt={x:I,y:gt};if(!(Bt.x<0||Bt.x>6e3||Bt.y<0||Bt.y>2500)){if(mt.target.attrs.name&&mt.target.attrs.name.startsWith("anchor-")){const wt=mt.target.attrs.shapeId,Mt=s.find(Xt=>Xt.id===wt);if(Mt&&i==="select"){const Xt=mt.target.attrs.name.replace("anchor-","");let It=Mt.points,Pt={x:Mt.x,y:Mt.y,width:Mt.width,height:Mt.height};(Mt.type==="path"||Mt.type==="line"||Mt.type==="highlighter")&&Mt.points&&(It=[...Mt.points],Pt=Vd(Mt.points)),z({isTransforming:!0,shapeId:wt,startWidth:Mt.width,startHeight:Mt.height,startX:Mt.x,startY:Mt.y,startMouseX:Bt.x,startMouseY:Bt.y,anchor:Xt,originalPoints:It,originalBbox:Pt,startFontSize:Mt.fontSize||d})}return}if(mt.target===Lt){if(i==="select"&&(E(null),t(s.map(wt=>({...wt,isSelected:!1,isEditing:!1})))),i==="ocr-selection"){B(),U(null),_({isDrawing:!0,startX:I,startY:gt,currentShape:{id:`ocr_${Date.now()}`,type:"rectangle",x:I,y:gt,width:0,height:0,stroke:"#007bff",strokeWidth:2,dash:[5,5],opacity:1}});return}if(i==="text"||i==="latex"){const wt=i==="latex";let Mt=wt?"E = mc^2":"Text";const Xt=d;let It;if(wt){const ze=zc(Mt,Xt);It={id:`${wt?"latex":"text"}_${Date.now()}`,type:wt?"latex":"text",x:I,y:gt,width:ze.width,height:ze.height,stroke:o,strokeWidth:1,text:wt?"":"Text",latex:wt?Mt:void 0,latexRendered:wt?lr(Mt,Xt):void 0,fontSize:Xt,fontFamily:g,textAlign:p,fontWeight:"normal",fontStyle:"normal",textDecoration:"none",isSelected:!0,isEditing:!1,isLatex:wt,scaleX:1,scaleY:1,rotation:0}}else{const ze=Xt,re=Mt.split(`
305
305
  `).length||1,me=Math.max(re*ze*1.2,50);It={id:`${wt?"latex":"text"}_${Date.now()}`,type:wt?"latex":"text",x:I,y:gt,width:200,height:me,stroke:o,strokeWidth:1,text:Mt,latex:void 0,latexRendered:void 0,fontSize:Xt,fontFamily:g,textAlign:p,fontWeight:"normal",fontStyle:"normal",textDecoration:"none",isSelected:!0,isEditing:!1,isLatex:wt,scaleX:1,scaleY:1,rotation:0}}if(wt){const ze=Vt(It.x,It.y,It.width,It.height);It.x=ze.x,It.y=ze.y,It.width=ze.width,It.height=ze.height}const Pt=[...s,It];t(Pt),a(Pt),setTimeout(()=>{D(It.id)},10)}else if(i==="eraser"){$t([...s]);const wt=new Set;if(s.forEach(Mt=>{Td(Mt,Bt)&&wt.add(Mt.id)}),wt.size>0){const Mt=s.filter(Xt=>!wt.has(Xt.id));t(Mt)}qt(wt),_({isDrawing:!0,startX:I,startY:gt,currentShape:{id:`eraser_${Date.now()}`,type:"path",x:I,y:gt,width:0,height:0,stroke:"#000000",strokeWidth:h,opacity:1,points:[I,gt]}})}else if(!["select","text","latex"].includes(i)){const wt=i==="pencil"?"path":i==="highlighter"?"highlighter":i;_({isDrawing:!0,startX:I,startY:gt,currentShape:{id:`${i}_${Date.now()}`,type:wt,x:I,y:gt,width:0,height:0,stroke:o,strokeWidth:h,opacity:i==="highlighter"?.5:1,points:i==="pencil"||i==="highlighter"?[I,gt]:void 0}})}return}if(i==="select"&&mt.target.attrs.id){const wt=mt.target.attrs.id,Mt=s.find(Xt=>Xt.id===wt);if(Mt){if(E(wt),(Mt.type==="text"||Mt.type==="latex")&&mt.evt.detail===2){D(wt);return}k(!0),nt({x:Bt.x,y:Bt.y}),st({x:Mt.x,y:Mt.y}),(Mt.type==="path"||Mt.type==="line"||Mt.type==="highlighter")&&Mt.points&&St([...Mt.points]),t(s.map(Xt=>({...Xt,isSelected:Xt.id===wt,isEditing:!1})))}return}if(!["select","text","latex"].includes(i))if(i==="eraser"){$t([...s]);const wt=new Set;if(s.forEach(Mt=>{Td(Mt,Bt)&&wt.add(Mt.id)}),wt.size>0){const Mt=s.filter(Xt=>!wt.has(Xt.id));t(Mt)}qt(wt),_({isDrawing:!0,startX:I,startY:gt,currentShape:{id:`eraser_${Date.now()}`,type:"path",x:I,y:gt,width:0,height:0,stroke:"#000000",strokeWidth:h,opacity:1,points:[I,gt]}})}else{const wt=i==="pencil"?"path":i==="highlighter"?"highlighter":i;_({isDrawing:!0,startX:I,startY:gt,currentShape:{id:`${i}_${Date.now()}`,type:wt,x:I,y:gt,width:0,height:0,stroke:o,strokeWidth:h,opacity:i==="highlighter"?.5:1,points:i==="pencil"||i==="highlighter"?[I,gt]:void 0}})}}},[s,t,i,o,h,d,g,p,b,E,_,z,D,C,H,U,Vt,B]),K=bt.useCallback((mt,Lt,xt,G)=>{const I=mt.target.getStage(),gt=I.getPointerPosition(),Bt=I.container(),wt=gt.x/C+Bt.scrollLeft/C,Mt=gt.y/C+Bt.scrollTop/C,Xt={x:wt,y:Mt};if(Lt.isDrawing&&Lt.currentShape){const{startX:It,startY:Pt,currentShape:ze}=Lt;if(i==="ocr-selection"){let re=Xt.x-It,me=Xt.y-Pt;if(G){const Ie=Math.max(Math.abs(re),Math.abs(me));re=Math.sign(re)*Ie,me=Math.sign(me)*Ie}let Je=It,De=Pt,ra=re,sa=me;re<0&&(Je=It+re,ra=Math.abs(re)),me<0&&(De=Pt+me,sa=Math.abs(me));let be={...ze,x:Je,y:De,width:ra,height:sa};_(Ie=>({...Ie,currentShape:be}))}else if(i==="pencil"||i==="eraser"||i==="highlighter"){const re={...ze,points:[...ze.points||[],Xt.x,Xt.y]};if(_(me=>({...me,currentShape:re})),i==="eraser"){const me=s.filter(Je=>Td(Je,Xt));if(me.length>0){const Je=new Set(Zt);me.forEach(ra=>{Je.add(ra.id)});const De=s.filter(ra=>!Je.has(ra.id));t(De),qt(Je)}}}else if(i==="line"){const re={...ze,points:[It,Pt,Xt.x,Xt.y]};_(me=>({...me,currentShape:re}))}else if(i==="rectangle"||i==="ellipse"){let re=Xt.x-It,me=Xt.y-Pt;if(G){const Ie=Math.max(Math.abs(re),Math.abs(me));re=Math.sign(re)*Ie,me=Math.sign(me)*Ie}let Je=It,De=Pt,ra=re,sa=me;re<0&&(Je=It+re,ra=Math.abs(re)),me<0&&(De=Pt+me,sa=Math.abs(me));let be={...ze,x:Je,y:De,width:ra,height:sa};_(Ie=>({...Ie,currentShape:be}))}}else if(xt.isTransforming&&xt.shapeId){const{startWidth:It,startHeight:Pt,startX:ze,startY:re,startMouseX:me,startMouseY:Je,anchor:De,originalPoints:ra,originalBbox:sa,startFontSize:be}=xt;if(!De)return;const Ie=Xt.x-me,u0=Xt.y-Je;let o0=It,w0=Pt,X0=ze,Ue=re;switch(De){case"top-left":o0=It-Ie,w0=Pt-u0,X0=ze+Ie,Ue=re+u0;break;case"top-right":o0=It+Ie,w0=Pt-u0,Ue=re+u0;break;case"bottom-left":o0=It-Ie,w0=Pt+u0,X0=ze+Ie;break;case"bottom-right":o0=It+Ie,w0=Pt+u0;break}let ea=X0,en=Ue,Ua=o0,xa=w0;if(Ua<0&&(ea=ea+Ua,Ua=Math.abs(Ua)),xa<0&&(en=en+xa,xa=Math.abs(xa)),G){const La=Math.max(Math.abs(Ua),Math.abs(xa));switch(Ua=Math.sign(Ua)*La,xa=Math.sign(xa)*La,De){case"top-left":ea=X0+(o0-Ua),en=Ue+(w0-xa);break;case"top-right":en=Ue+(w0-xa);break;case"bottom-left":ea=X0+(o0-Ua);break}}const p0=Vt(ea,en,Ua,xa);ea=p0.x,en=p0.y,Ua=p0.width,xa=p0.height;const qa=s.map(La=>{if(La.id===xt.shapeId)if((La.type==="path"||La.type==="line"||La.type==="highlighter")&&ra&&sa){const es=fb(ra,sa,{x:ea,y:en,width:Ua,height:xa});return{...La,width:Ua,height:xa,x:ea,y:en,points:es}}else return{...La,width:Ua,height:xa,x:ea,y:en};return La});t(qa)}else if(X&&b){s.find(re=>re.id===b);const It=Xt.x-j.x,Pt=Xt.y-j.y,ze=s.map(re=>{if(re.id===b){const me=ut.x+It,Je=ut.y+Pt,De=Vt(me,Je,re.width,re.height);if((re.type==="path"||re.type==="line"||re.type==="highlighter")&&re.points&&ot.length>0){const ra={x:De.x-ut.x,y:De.y-ut.y},sa=ot.map((be,Ie)=>Ie%2===0?be+ra.x:be+ra.y);return{...re,x:De.x,y:De.y,points:sa}}else return{...re,x:De.x,y:De.y}}return re});t(ze)}},[s,t,i,X,b,j,ut,ot,Zt,qt,_,C,Vt]),vt=bt.useCallback(()=>{X&&(k(!1),St([]),a(s))},[X,s,a]);return{isDragging:X,setIsDragging:k,dragStart:j,setDragStart:nt,selectedShapeStart:ut,setSelectedShapeStart:st,originalPointsOnDragStart:ot,setOriginalPointsOnDragStart:St,erasedShapes:Zt,setErasedShapes:qt,eraserHistoryStart:Nt,setEraserHistoryStart:$t,constrainToCanvas:Vt,handleMouseDown:Et,handleMouseMove:K,handleMouseUp:vt}},gb=()=>{const[s,t]=bt.useState({isDrawing:!1,startX:0,startY:0,currentShape:null}),[a,i]=bt.useState({isTransforming:!1,shapeId:null,startWidth:0,startHeight:0,startX:0,startY:0,startMouseX:0,startMouseY:0,anchor:null,originalPoints:[],originalBbox:{x:0,y:0,width:0,height:0}});return{drawingState:s,setDrawingState:t,transformState:a,setTransformState:i,resetDrawingState:()=>{t({isDrawing:!1,startX:0,startY:0,currentShape:null})},resetTransformState:()=>{i({isTransforming:!1,shapeId:null,startWidth:0,startHeight:0,startX:0,startY:0,startMouseX:0,startMouseY:0,anchor:null,originalPoints:[],originalBbox:{x:0,y:0,width:0,height:0}})}}},pb=(s,t,a,i,o,h,d,g,p,b,E,_)=>{const z=bt.useCallback(C=>{if(C.key==="Shift"&&t(!0),C.key==="Delete"&&a&&o(a),(C.ctrlKey||C.metaKey)&&C.key==="z"&&(C.preventDefault(),h()),C.key==="Escape"&&i&&d(),C.key==="Enter"&&i&&C.ctrlKey&&d(),!i&&(C.key==="ArrowUp"||C.key==="ArrowDown")&&a){C.preventDefault();const H=C.key==="ArrowUp"?"up":"down";g(a,H,C.shiftKey)}if(C.ctrlKey||C.metaKey){switch(C.key){case"=":case"+":C.preventDefault(),E&&E();break;case"-":C.preventDefault(),_&&_();break}if(a){const H=b.find(U=>U.id===a);if(H&&H.type==="text")switch(C.key){case"b":C.preventDefault(),p(a,"bold");break;case"i":C.preventDefault(),p(a,"italic");break;case"u":C.preventDefault(),p(a,"underline");break}}}},[s,a,i,b,t,o,h,d,g,p,E,_]),D=bt.useCallback(C=>{C.key==="Shift"&&t(!1)},[t]);bt.useEffect(()=>(window.addEventListener("keydown",z),window.addEventListener("keyup",D),()=>{window.removeEventListener("keydown",z),window.removeEventListener("keyup",D)}),[z,D])},vb="ws://localhost:8000",yb=(s,t,a=crypto.randomUUID())=>{const i=bt.useRef(null),o=bt.useRef(t),h=bt.useRef(null),d=bt.useRef(0),g=bt.useRef(s),p=bt.useRef(a),b=5,E=1500,[_,z]=bt.useState(!1);bt.useEffect(()=>{g.current=s},[s]),bt.useEffect(()=>{p.current=a},[a]),bt.useEffect(()=>{o.current=t},[t]);const D=bt.useCallback(()=>{if(i.current?.readyState===WebSocket.OPEN){console.log("[WS] Already connected, skipping");return}i.current&&(i.current.close(),i.current=null);const k=new WebSocket(`${vb}/ws/canvas/${g.current}/`);i.current=k,k.onopen=()=>{console.log("[WS] Connected to board:",g.current),z(!0),d.current=0,k.send(JSON.stringify({type:"init",userId:p.current}))},k.onmessage=j=>{try{const nt=JSON.parse(j.data);if(nt.userId===p.current)return;switch(nt.type){case"init":nt.data&&o.current(nt.data);break;case"update":case"shapes":case"undo":nt.data&&o.current(nt.data);break;case"clear":o.current({shapes:[],config:{},history:[]});break;default:console.warn("[WS] Unknown message type:",nt.type)}}catch(nt){console.error("[WS] Message parse error:",nt)}},k.onerror=j=>{console.error("[WS] Connection error:",j)},k.onclose=j=>{console.log("[WS] Disconnected, code:",j.code,"reason:",j.reason),z(!1),i.current=null,j.code!==1e3&&(d.current<b?(d.current+=1,console.log(`[WS] Reconnecting in ${E*d.current}ms (attempt ${d.current})`),h.current=window.setTimeout(()=>{D()},E*d.current)):console.error("[WS] Max reconnection attempts reached"))}},[]),C=bt.useCallback(()=>{h.current&&(clearTimeout(h.current),h.current=null),i.current&&(i.current.close(1e3,"Client disconnect"),i.current=null,z(!1))},[]),H=bt.useCallback(k=>{i.current?.readyState===WebSocket.OPEN?i.current.send(JSON.stringify({...k,userId:p.current})):console.warn("[WS] Cannot send message - connection not open")},[]),U=bt.useCallback(k=>{H({type:"update",data:{shapes:k}})},[H]),B=bt.useCallback(()=>{H({type:"clear"})},[H]),X=bt.useCallback(()=>{H({type:"undo"})},[H]);return bt.useEffect(()=>(console.log("[WS] Setting up connection for board:",s),D(),()=>{console.log("[WS] Cleaning up connection for board:",s),C()}),[s]),bt.useMemo(()=>({sendShapesUpdate:U,sendClear:B,sendUndo:X,isConnected:_}),[U,B,X,_])},bb="http://localhost:8000",S5=async(s,t,a)=>{try{const i=`${bb}/api/canvas/${s}/${t}/`,o=await fetch(i,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a||{})});if(!o.ok)throw new Error(`HTTP error! status: ${o.status}`);return await o.json()}catch(i){return console.error("API Error:",i),{success:!1,message:i instanceof Error?i.message:"Unknown error"}}},Sb=async s=>S5(s,"clear"),xb=async s=>S5(s,"undo"),Tb=async(s,t)=>S5(s,"update",t),Eb=(s,t)=>{const a=parseInt(s.slice(1,3),16),i=parseInt(s.slice(3,5),16),o=parseInt(s.slice(5,7),16);return`rgba(${a}, ${i}, ${o}, ${t})`};class _b{baseURL="https://statservice.example.com";moduleToken=null;rateLimitCache=new Map;RATE_LIMIT_WINDOW=3600*1e3;MAX_REQUESTS=12;constructor(){this.loadToken()}loadToken(){const t=localStorage.getItem("moduleToken");t&&(this.moduleToken=t)}saveToken(t){this.moduleToken=t,localStorage.setItem("moduleToken",t)}async createModule(t){try{const a=await fetch(`${this.baseURL}/api/stats/module/create`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({moduleName:t})});if(!a.ok)throw new Error(`Failed to create module: ${a.statusText}`);const i=await a.json();return this.saveToken(i.token),i}catch(a){throw console.error("Error creating module:",a),a}}checkRateLimit(){const t=Date.now(),a=this.moduleToken||"anonymous",i=this.rateLimitCache.get(a);return i?t>i.resetTime?(this.rateLimitCache.set(a,{count:1,resetTime:t+this.RATE_LIMIT_WINDOW}),!0):i.count>=this.MAX_REQUESTS?!1:(i.count++,!0):(this.rateLimitCache.set(a,{count:1,resetTime:t+this.RATE_LIMIT_WINDOW}),!0)}async sendMetrics(t){if(!this.moduleToken)throw new Error("Module token not set. Please create module first.");if(!this.checkRateLimit())throw new Error("Rate limit exceeded. Please try again later.");try{const a=await fetch(`${this.baseURL}/api/stats/module/metrics`,{method:"PUT",headers:{"X-Module-Token":this.moduleToken,"Content-Type":"application/json"},body:JSON.stringify(t)});if(a.status===429){const i=a.headers.get("Retry-After");throw new Error(`Rate limit exceeded. Retry after ${i} seconds`)}if(!a.ok)throw new Error(`Failed to send metrics: ${a.statusText}`);return await a.json()}catch(a){throw console.error("Error sending metrics:",a),a}}async getMetrics(){if(!this.moduleToken)throw new Error("Module token not set");try{const t=await fetch(`${this.baseURL}/api/stats/module/metrics`,{method:"GET",headers:{"X-Module-Token":this.moduleToken}});if(t.status===404)return null;if(!t.ok)throw new Error(`Failed to get metrics: ${t.statusText}`);return await t.json()}catch(t){throw console.error("Error getting metrics:",t),t}}}const z6=new _b,Mb=()=>{const[s,t]=bt.useState(null),[a,i]=bt.useState(""),[o,h]=bt.useState(null),[d,g]=bt.useState(!1),[p,b]=bt.useState(null),[E,_]=bt.useState(!1),[z,D]=bt.useState({}),[C]=bt.useState(Date.now()),[H]=bt.useState(!1);bt.useEffect(()=>{const W=$7(Z=>{console.log("Widget initialized via getInfo:",Z),t(Z),i(String(Z.board.id)),h(Z.widgetId),Z.config&&ut(Z.config),g(!0),Z.widgetId>0&&U(Z)});return()=>{W()}},[]);const U=bt.useCallback(async W=>{try{const Z=`DrawingWidget-${W.widgetId}-${W.board.id}`,jt=await z6.createModule(Z);console.log("Stats module created:",jt),_(!0)}catch(Z){console.error("Failed to create stats module:",Z)}},[]);bt.useEffect(()=>{const W=()=>{const Oe=window.innerWidth-30-30,Xe=window.innerHeight-0-30,ca=Math.min(Oe/1920,Xe/1080)*.95*2;document.documentElement.style.setProperty("--scale",ca.toString())};return W(),window.addEventListener("resize",W),()=>window.removeEventListener("resize",W)},[]);const[B,X]=bt.useState("select"),[k,j]=bt.useState([]),[nt,ut]=bt.useState({}),[st,ot]=bt.useState([]),[St,Zt]=bt.useState(null),[qt,Nt]=bt.useState("#000000"),[$t,Vt]=bt.useState(5),[Et]=bt.useState(20),[K]=bt.useState("Arial"),[vt]=bt.useState("left"),[mt,Lt]=bt.useState(!1),[xt,G]=bt.useState(1),{drawingState:I,setDrawingState:gt,transformState:Bt,setTransformState:wt,resetDrawingState:Mt,resetTransformState:Xt}=gb(),It=bt.useCallback(W=>{j(W.shapes),ut(W.config||{}),ot(W.history||[])},[]),{sendShapesUpdate:Pt,sendClear:ze,sendUndo:re}=yb(a,It,crypto.randomUUID()),me=bt.useCallback(()=>{const W=Date.now(),Z=Math.floor((W-C)/1e3);return{shapesCount:k.length,toolsUsage:{...z},lastUpdated:new Date().toISOString(),sessionDuration:Z,boardId:a,widgetId:o}},[k.length,z,C,a,o]),Je=bt.useCallback(()=>({shapes:k.map(W=>({id:W.id,type:W.type,x:W.x,y:W.y,width:W.width,height:W.height,stroke:W.stroke,strokeWidth:W.strokeWidth,...W.type==="text"&&{text:W.text},...W.type==="latex"&&{latex:W.latex}})),config:{...nt,strokeColor:qt,strokeWidth:$t,fontSize:Et,fontFamily:K,textAlign:vt,scale:xt,lastModifiedBy:"drawing-app"},lastModified:new Date().toISOString(),version:"1.0.0"}),[k,nt,qt,$t,Et,K,vt,xt]),De=bt.useCallback(async()=>{if(!s||!s.widgetId||s.widgetId<=0){console.log("Standalone mode, skipping widget config update");return}try{const W=Je(),Z=await fetch(`http://85.234.22.160:1111/api/widget/${s.widgetId}`,{method:"PATCH",headers:{"Content-Type":"application/json",Authorization:`Bearer ${ra()}`},body:JSON.stringify(W)});Z.ok||console.warn("Failed to update widget config:",Z.statusText)}catch(W){console.error("Error updating widget config:",W)}},[s,Je]),ra=()=>localStorage.getItem("authToken")||"";bt.useEffect(()=>{if(!E||!s||s.widgetId<=0)return;const W=setInterval(async()=>{try{const Z=me();await z6.sendMetrics(Z)}catch(Z){console.error("Failed to send metrics:",Z)}},3e4);return()=>clearInterval(W)},[E,s,me]);const sa=bt.useCallback(async W=>{if(s&&s.widgetId>0)try{await Tb(a,{shapes:W,config:nt,history:st}),Pt(W),De()}catch(Z){console.error("Failed to send canvas data to backend:",Z)}},[a,nt,st,Pt,s,De]),{saveToHistory:be,handleUndo:Ie,handleRedo:u0}=ov(k,sa),o0=bt.useCallback(W=>{D(Z=>({...Z,[W]:(Z[W]||0)+1}))},[]);bt.useEffect(()=>{B&&B!=="select"&&o0(B)},[B,o0]),bt.useEffect(()=>{if(B!=="ocr-selection"){b(null);const W=k.filter(Z=>!Z.id.startsWith("ocr_border_"));W.length!==k.length&&(j(W),be(W))}},[B,k,be]);const w0=async()=>{const W=Ie();W&&(j(W),s&&s.widgetId>0&&(await xb(a),re(),De()))},X0=()=>{const W=u0();W&&j(W)},{editingTextId:Ue,tempText:ea,latexPreview:en,setTempText:Ua,setEditingTextId:xa,startTextEditing:p0,finishTextEditing:qa,updateTextInRealTime:La}=ob(k,j,be,Et),{toggleTextStyle:Fl,changeFontSizeWithStep:es}=cb(k,j,be,Et),fl=bt.useRef(null),{insertLatexSymbol:U0}=hb(fl,Ue,La);bt.useCallback(()=>{const W=k.filter(Z=>!Z.id.startsWith("ocr_border_"));W.length!==k.length&&(j(W),be(W))},[k,j,be]);const t0=mb(I,k,j,be,B,qt,$t,Et,K,vt,St,Zt,gt,wt,p0,xt,p,b),[j0,as]=bt.useState(!1),[Nc,so]=bt.useState("fraction"),[ns,Ei]=bt.useState(!1),[Wl,dl]=bt.useState(!1),[Il,_i]=bt.useState(!0),[Mi,gn]=bt.useState(!1),[Ai,Pl]=bt.useState({x:0,y:0}),ls=bt.useCallback(async()=>{if(!p||!an.current){console.error("No OCR selection or stage reference");return}try{const W=an.current,Z=k.filter(xe=>!xe.id.startsWith("ocr_border_")),jt=Z.length!==k.length;jt&&(j(Z),await new Promise(xe=>setTimeout(xe,50)));const Qt=document.createElement("canvas"),ae=Qt.getContext("2d");if(!ae){console.error("Failed to get canvas context"),jt&&j(k);return}Qt.width=p.width*xt,Qt.height=p.height*xt,ae.fillStyle="white",ae.fillRect(0,0,Qt.width,Qt.height);const Ee=W.toDataURL({x:p.x*xt,y:p.y*xt,width:p.width*xt,height:p.height*xt}),Se=new Image;Se.src=Ee,await new Promise((xe,ha)=>{Se.onload=xe,Se.onerror=ha}),ae.drawImage(Se,0,0);const Oe=Qt.toDataURL("image/png",1),ca=await(await fetch("http://localhost:8000/api/ocr/latex/",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({image_data:Oe})})).json();if(ca.success&&ca.latex){const xe=Z.filter(a0=>{const $n={x:a0.x,y:a0.y,width:a0.width,height:a0.height};return!db(p,$n)});let ha=ca.latex.trim();ha.startsWith("$")&&ha.endsWith("$")&&(ha=ha.slice(1,-1)),ha.startsWith("$$")&&ha.endsWith("$$")&&(ha=ha.slice(2,-2)),ha=ha.trim();const e0=zc(ha,Et),nn={id:`latex_${Date.now()}`,type:"latex",x:p.x,y:p.y,width:e0.width,height:e0.height,stroke:qt,strokeWidth:1,latex:ha,latexRendered:lr(ha,Et),fontSize:Et,fontFamily:"KaTeX_Main",textAlign:"left",fontWeight:"normal",fontStyle:"normal",textDecoration:"none",isSelected:!1,isEditing:!1,isLatex:!0,scaleX:1,scaleY:1,rotation:0},Fe=[...xe,nn];j(Fe),be(Fe),b(null),X("select"),sa(Fe),console.log("OCR успешно распознано:",ca)}else jt&&j(k),console.error("OCR распознавание не удалось:",ca.error),alert("Не удалось распознать формулу. Попробуйте снова.")}catch(W){k.filter(jt=>jt.id.startsWith("ocr_border_")).length>0&&j(k),console.error("Ошибка при OCR распознавании:",W),alert("Ошибка при отправке изображения на сервер.")}},[p,k,Et,qt,xt,be,sa]),zi=bt.useCallback(()=>{Ue&&qa(),b(null),X("ocr-selection")},[Ue,qa]);bt.useEffect(()=>{if(!Mi)return;const W=jt=>{jt.preventDefault();const Qt=jt.clientX-Ai.x,ae=jt.clientY-Ai.y,Ee=hr.current;Ee&&(Ee.scrollLeft-=Qt,Ee.scrollTop-=ae,Pl({x:jt.clientX,y:jt.clientY}))},Z=()=>{gn(!1)};return document.addEventListener("mousemove",W),document.addEventListener("mouseup",Z),()=>{document.removeEventListener("mousemove",W),document.removeEventListener("mouseup",Z)}},[Mi,Ai]);const ml=bt.useCallback(()=>{G(Z=>Math.min(Z*1.2,1.2))},[]),Ci=bt.useCallback(()=>{const W=Math.pow(1.2,-10);G(Z=>Math.max(Z/1.2,W))},[]),gl=bt.useCallback(W=>{(W.ctrlKey||W.metaKey)&&(W.preventDefault(),W.deltaY<0?ml():Ci())},[ml,Ci]);bt.useEffect(()=>{const W=an.current;W&&(W.scale({x:xt,y:xt}),W.batchDraw())},[xt]),bt.useEffect(()=>{const W=an.current?.container();if(W)return W.addEventListener("wheel",gl,{passive:!1}),()=>{W.removeEventListener("wheel",gl)}},[gl]);const $l=W=>{const Z=k.filter(jt=>jt.id!==W);j(Z),be(Z),St===W&&Zt(null),Ue===W&&(xa(null),Ua(""))};pb(mt,Lt,St,Ue,$l,w0,qa,es,Fl,k,ml,Ci);const is=async()=>{j([]),Zt(null),xa(null),Ua(""),b(null),be([]),s&&s.widgetId>0&&(await Sb(a),ze(),De())},pl=W=>{U0(W.latex),as(!1)},wn=(W,Z)=>{if(!St)return;const jt=k.map(Qt=>{if(Qt.id===St&&(Qt.type==="text"||Qt.type==="latex")){const ae={...Qt,[W]:Z};if(W==="stroke"&&(ae.stroke=Z,Qt.type==="latex"&&Qt.latex)){const Ee=Qt.fontSize||Et;ae.latexRendered=lr(Qt.latex,Ee)}if(W==="fontFamily"&&Qt.type==="text"&&(ae.fontFamily=Z),W==="textAlign"&&(ae.textAlign=Z),W==="fontSize"){const Ee=parseInt(Z)||20;if(ae.fontSize=Ee,Qt.type==="text"){const Se=Ee,Oe=(Qt.text||"").split(`
306
306
  `).length||1,Xe=Math.max(Oe*Se*1.2,50);ae.height=Xe}else if(Qt.type==="latex"&&Qt.latex){const Se=zc(Qt.latex,Ee);ae.width=Se.width,ae.height=Se.height,ae.latexRendered=lr(Qt.latex,Ee)}}return ae}return Qt});j(jt),be(jt)},ka=()=>{const W=[...k];if(I.currentShape&&B!=="eraser"){const Z=I.currentShape;if(Z.type==="rectangle"||Z.type==="ellipse"){const jt=Z.x||0,Qt=Z.y||0,ae=Z.width||0,Ee=Z.height||0,Se={...Z,x:Math.min(jt,jt+ae),y:Math.min(Qt,Qt+Ee),width:Math.abs(ae),height:Math.abs(Ee)};W.push(Se)}else((Z.type==="path"||Z.type==="highlighter")&&Z.points&&Z.points.length>0||Z.type==="line"&&Z.points)&&W.push(Z)}return p&&W.push({id:"ocr-selection",type:"rectangle",x:p.x,y:p.y,width:p.width,height:p.height,stroke:"#007bff",strokeWidth:2,dash:[5,5],fill:"transparent",opacity:1}),W.map(Z=>{const jt=Z.opacity!==void 0?Z.opacity:1,Qt=Eb(Z.stroke,jt),ae={key:Z.id,id:Z.id,stroke:Z.type==="text"||Z.type==="latex"?void 0:Qt,strokeWidth:Z.type==="text"||Z.type==="latex"?void 0:Z.strokeWidth,fill:Z.type==="text"||Z.type==="latex"?Z.stroke:Z.fill};switch(Z.type){case"rectangle":const Ee=Z.width>=0?Z.x:Z.x+Z.width,Se=Z.height>=0?Z.y:Z.y+Z.height;return At.jsx(A2,{...ae,x:Ee,y:Se,width:Math.abs(Z.width),height:Math.abs(Z.height),dash:Z.dash});case"ellipse":const Oe=Z.x+Z.width/2,Xe=Z.y+Z.height/2,ca=Math.abs(Z.width)/2,xe=Math.abs(Z.height)/2;return At.jsx(Jp,{...ae,x:Oe,y:Xe,radiusX:ca,radiusY:xe});case"line":return At.jsx(rd,{...ae,points:Z.points||[]});case"path":return At.jsx(rd,{...ae,points:Z.points||[],tension:0,lineCap:"round",lineJoin:"round"});case"highlighter":return At.jsx(rd,{...ae,points:Z.points||[],tension:0,lineCap:"round",lineJoin:"round",opacity:.5});case"text":if(Z.isEditing)return null;const ha=Z.width>=0?Z.x:Z.x+Z.width,e0=Z.height>=0?Z.y:Z.y+Z.height,nn=Math.abs(Z.width),Fe=Math.abs(Z.height),a0=Z.fontWeight||"normal",$n=Z.fontStyle||"normal",tl=Z.textDecoration||"none",ti=`${a0==="bold"?"bold":""} ${$n==="italic"?"italic":""}`.trim();return At.jsx(Fp,{...ae,x:ha,y:e0,width:nn,height:Fe,text:Z.text||"",fontSize:Z.fontSize||Et,fontFamily:Z.fontFamily||K,align:Z.textAlign||vt,verticalAlign:"top",wrap:"word",fontStyle:ti,textDecoration:tl,onDblClick:()=>p0(Z.id)});case"latex":if(Z.isEditing)return null;const y0=Z.width>=0?Z.x:Z.x+Z.width,fa=Z.height>=0?Z.y:Z.y+Z.height,rs=Math.abs(Z.width),b0=Math.abs(Z.height);return At.jsx(A2,{id:Z.id,x:y0,y:fa,width:rs,height:b0,fill:"transparent",stroke:"transparent",strokeWidth:0,onDblClick:()=>p0(Z.id)},Z.id);default:return null}})},v0=()=>{const W=an.current;if(!W)return null;const Z=W.container();return k.filter(jt=>jt.type==="latex"&&!jt.isEditing).map(jt=>{const Qt=jt.width>=0?jt.x:jt.x+jt.width,ae=jt.height>=0?jt.y:jt.y+jt.height,Ee=Math.abs(jt.width),Se=Math.abs(jt.height),Oe=Math.max(Ee*xt,50),Xe=Math.max(Se*xt,50);return At.jsx("div",{className:"latex-shape-overlay",style:{position:"absolute",left:`${Qt*xt-Z.scrollLeft}px`,top:`${ae*xt-Z.scrollTop}px`,width:`${Oe}px`,height:`${Xe}px`,pointerEvents:"none",zIndex:10},children:At.jsx("div",{dangerouslySetInnerHTML:{__html:jt.latexRendered||lr(jt.latex||"",(jt.fontSize||Et)*xt)},className:"latex-rendered-content",style:{fontSize:`${(jt.fontSize||Et)*xt}px`,color:jt.stroke||qt}})},jt.id)})},vl=()=>{if(!St||B!=="select"||I.isDrawing)return null;const W=k.find(Fe=>Fe.id===St);if(!W||(W.type==="path"||W.type==="highlighter")&&(!W.points||W.points.length===0))return null;let Z={...W};if((W.type==="path"||W.type==="line"||W.type==="highlighter")&&W.points&&W.points.length>0){const Fe=Vd(W.points);Z={...W,x:Fe.x,y:Fe.y,width:Fe.width,height:Fe.height}}const jt=Math.min(Z.x,Z.x+Z.width),Qt=Math.min(Z.y,Z.y+Z.height),ae=Math.abs(Z.width),Ee=Math.abs(Z.height),Se=5,Oe=10,Xe=Oe/2,ca=jt-Se,xe=Qt-Se,ha=ae+Se*2,e0=Ee+Se*2,nn=[{name:"anchor-top-left",x:jt,y:Qt},{name:"anchor-top-right",x:jt+ae,y:Qt},{name:"anchor-bottom-left",x:jt,y:Qt+Ee},{name:"anchor-bottom-right",x:jt+ae,y:Qt+Ee}];return At.jsxs(At.Fragment,{children:[At.jsx(A2,{name:"selection-rect",x:ca,y:xe,width:ha,height:e0,stroke:"#007bff",strokeWidth:1,dash:[5,5],listening:!1}),nn.map(Fe=>At.jsx(A2,{name:Fe.name,shapeId:Z.id,x:Fe.x-Xe,y:Fe.y-Xe,width:Oe,height:Oe,fill:"#ffffff",stroke:"#007bff",strokeWidth:2},Fe.name))]})},Dn=()=>{if(!Ue)return null;const W=k.find(nn=>nn.id===Ue);if(!W||W.type!=="text"&&W.type!=="latex")return null;const Z=an.current;if(!Z)return null;const jt=Z.container().getBoundingClientRect(),Qt=W.width>=0?W.x:W.x+W.width,ae=W.height>=0?W.y:W.y+W.height,Ee=Qt*xt+jt.left,Se=ae*xt+jt.top,Oe=Math.max(Math.abs(W.width)*xt,100),Xe=Math.max(Math.abs(W.height)*xt,40),ca=W.fontWeight||"normal",xe=W.fontStyle||"normal",ha=W.textDecoration||"none",e0={position:"fixed",left:`${Ee}px`,top:`${Se}px`,width:`${Oe}px`,height:`${Xe}px`,fontSize:`${W.fontSize||Et}px`,fontFamily:W.type==="latex"?"KaTeX_Main, Times New Roman, serif":W.fontFamily||K,textAlign:W.textAlign||vt,color:W.stroke||qt,backgroundColor:"rgba(255, 255, 255, 0.9)",border:W.type==="latex"?"2px solid #4CAF50":"1px dashed #007bff",outline:"none",resize:"both",overflow:"auto",padding:"4px",zIndex:1e3,lineHeight:"1.2",whiteSpace:"pre-wrap",wordWrap:"break-word",fontWeight:ca==="bold"?"bold":"normal",fontStyle:xe==="italic"?"italic":"normal",textDecoration:ha,backdropFilter:"blur(2px)"};return W.type==="latex"?At.jsx(lv,{shape:W,tempText:ea,textAreaRef:fl,updateTextInRealTime:La,finishTextEditing:qa,x:Ee,y:Se,width:Oe,textareaStyle:e0,latexSymbols:rv,latexCategories:sv,handleLatexSymbolClick:pl,renderLatexToHtml:lr,showLatexPreview:Il,showLatexMenu:j0,selectedLatexCategory:Nc,latexPreview:en,fontSize:Et,strokeColor:qt,setShowLatexMenu:as,setShowLatexPreview:_i,setSelectedLatexCategory:so}):At.jsx(iv,{textAreaRef:fl,tempText:ea,updateTextInRealTime:La,finishTextEditing:qa,textareaStyle:e0})},yl=()=>{if(B!=="select"||!St||Ue)return null;const W=St,Z=k.find(ti=>ti.id===W);if(!Z||Z.type!=="text"&&Z.type!=="latex")return null;const jt=an.current;if(!jt)return null;const Qt=jt.container(),ae=Z.width>=0?Z.x:Z.x+Z.width,Ee=Z.height>=0?Z.y:Z.y+Z.height,Se=Math.abs(Z.height),Oe=Math.abs(Z.width),Xe=ae*xt-Qt.scrollLeft,ca=Ee*xt-Qt.scrollTop,e0=Z.type==="latex"?152:416,Fe=ca+Se*xt+20;let $n=Xe+Oe*xt/2-e0/2;if(Z.type==="latex")return At.jsx(nv,{selectedShape:Z,selectedId:W,startTextEditing:p0,updateSelectedTextProperty:wn,fontSize:Z.fontSize||Et,strokeColor:Z.stroke||qt,left:$n,top:Fe,panelWidth:e0});const tl=W;return At.jsx(av,{selectedShape:Z,selectedId:tl,isBold:Z.fontWeight==="bold",isItalic:Z.fontStyle==="italic",isUnderline:Z.textDecoration?.includes("underline")||!1,isStrikethrough:Z.textDecoration?.includes("line-through")||!1,currentAlign:Z.textAlign||vt,showTextFormatDropdown:ns,showTextAlignDropdown:Wl,setShowTextFormatDropdown:Ei,setShowTextAlignDropdown:dl,updateSelectedTextProperty:wn,startTextEditing:p0,toggleBold:()=>Fl(tl,"bold"),toggleItalic:()=>Fl(tl,"italic"),toggleUnderline:()=>Fl(tl,"underline"),toggleStrikethrough:()=>Fl(tl,"strikethrough"),fontFamily:Z.fontFamily||K,fontSize:Z.fontSize||Et,strokeColor:Z.stroke||qt,availableFonts:uv,left:$n,top:Fe,panelWidth:e0})},an=bt.useRef(null),hr=bt.useRef(null),Nn=W=>{if(W.evt.button===1){W.evt.preventDefault(),gn(!0),Pl({x:W.evt.clientX,y:W.evt.clientY});return}B!=="select"&&H(!0),t0.handleMouseDown(W)},bl=W=>{Mi||t0.handleMouseMove(W,I,Bt,mt)},Sl=()=>{if(Mi&&gn(!1),I.isDrawing&&I.currentShape){const W={...I.currentShape};if(B==="eraser"){t0.erasedShapes.size>0&&t0.eraserHistoryStart&&be(k),t0.setErasedShapes(new Set),t0.setEraserHistoryStart(null),Mt();return}if(B==="ocr-selection"){const{x:Z=0,y:jt=0,width:Qt=0,height:ae=0}=I.currentShape,Ee=Qt>=0?Z:Z+Qt,Se=ae>=0?jt:jt+ae,Oe=Math.abs(Qt),Xe=Math.abs(ae);b({x:Ee,y:Se,width:Oe,height:Xe});const ca={id:`ocr_border_${Date.now()}`,type:"rectangle",x:Ee,y:Se,width:Oe,height:Xe,stroke:"#007bff",strokeWidth:2,dash:[5,5],fill:"transparent",opacity:1},xe=[...k,ca];j(xe),be(xe),Mt();return}if((B==="pencil"||B==="highlighter")&&W.points&&W.points.length>=4){const Z=Vd(W.points);W.x=Z.x,W.y=Z.y,W.width=Z.width,W.height=Z.height;const jt=[...k,W];j(jt),be(jt)}else if(B==="line"&&W.points&&W.points.length===4){const Z=W.points[0],jt=W.points[1],Qt=W.points[2],ae=W.points[3],Ee=Math.min(Z,Qt),Se=Math.min(jt,ae),Oe=Math.max(Z,Qt),Xe=Math.max(jt,ae);W.x=Ee,W.y=Se,W.width=Oe-Ee,W.height=Xe-Se;const ca=[...k,W];j(ca),be(ca)}else if((B==="rectangle"||B==="ellipse")&&I.currentShape.width!==0&&I.currentShape.height!==0){const Z=t0.constrainToCanvas(W.x,W.y,W.width,W.height);W.x=Z.x,W.y=Z.y,W.width=Z.width,W.height=Z.height;const jt=[...k,W];j(jt),be(jt)}Mt(),s&&s.widgetId>0&&De()}Bt.isTransforming&&(be(k),Xt()),t0.isDragging&&(t0.setIsDragging(!1),t0.setOriginalPointsOnDragStart([]),be(k)),H(!1)};return d?At.jsxs("div",{className:"drawing-app-container",children:[At.jsx("h1",{className:"top-header",children:"Paint"}),At.jsx("div",{className:"drawing-toolbar-container",children:At.jsxs("div",{className:"drawing-toolbar",children:[At.jsx(Ip,{finishTextEditing:()=>qa(!0),tool:B,setTool:X,strokeColor:qt,setStrokeColor:Nt,editingTextId:Ue}),At.jsx(Pp,{tool:B,strokeWidth:$t,setStrokeWidth:Vt}),At.jsx($p,{handleUndo:w0,handleRedo:X0,handleClearCanvas:is,finishTextEditing:qa,setTool:X,editingTextId:Ue||"",tool:B}),At.jsx(tv,{finishTextEditing:qa,setTool:X,tool:B,editingTextId:Ue||"",handleDeleteShape:$l,selectedId:St||""}),At.jsx(ev,{onOcrSelect:zi,onOcrRecognize:ls,tool:B,ocrSelection:p,editingTextId:Ue,finishTextEditing:qa})]})}),At.jsxs("div",{className:"canvas-container",ref:hr,style:{cursor:Mi?"grabbing":"default"},children:[At.jsx(Wp,{ref:an,width:6e3*xt,height:2500*xt,onMouseDown:Nn,onMouseMove:bl,onMouseUp:Sl,onMouseLeave:()=>gn(!1),onTouchStart:Nn,onTouchMove:bl,onTouchEnd:Sl,children:At.jsxs(Zp,{children:[ka(),vl()]})}),Dn(),v0(),yl()]}),At.jsxs("div",{className:"zoom-buttons",children:[At.jsx("button",{className:"zoom-button zoom-plus",onClick:ml}),At.jsx("button",{className:"zoom-button zoom-minus",onClick:Ci})]})]}):At.jsx("div",{className:"drawing-app-container",children:"Loading..."})};window.getInfo=P7;const Ab=I7.createRoot(document.getElementById("root"));Ab.render(At.jsx(z0.StrictMode,{children:At.jsx(Mb,{})}));
307
+ //# sourceMappingURL=index-DxkNA4rg.js.map