PageSourceSearch

https://snich.ai/assets/BoardCanvas-a0a056b9.js

js snich.ai collected 2026-10-05 15:08:34 UTC 18,230 bytes, 1 lines download raw bytes

1import{R as yt,j as v,r as i}from"./vendor-react-72e4a099.js";import{M as gt,H as Ct,J as X,Q as St,Y as Rt,U as At,V as W,K as It}from"./index-ed822c94.js";/* empty css              */import{c as Dt}from"./Toast-43ee7788.js";import{S as Tt,s as Mt,a as it}from"./Meeting2View-7d6b8faa.js";import"./index-0d91409a.js";import"./with-selector-2f77e664.js";import"./createLucideIcon-581cd729.js";import"./eye-5711d0dd.js";import"./x-b9f3d093.js";import"./circle-check-63b159d4.js";import"./circle-alert-67975319.js";import"./useMeetingLive-256d89a3.js";import"./Display-48adcc24.js";import"./buildLifecycle-a44b0e05.js";import"./StudioRealtime-3ad3f1c0.js";import"./mic-off-05523af3.js";import"./video-off-a445220e.js";import"./mic-098d6d5b.js";import"./MeetingTiles-0e7ec670.js";import"./ProgramGraphicsLayer-e1e0e604.js";import"./index-d9998155.js";import"./guestAccess-28c96151.js";import"./chevron-left-39dc0897.js";import"./chevron-right-b4336544.js";import"./refresh-cw-98362cea.js";import"./globe-e09c7f1b.js";import"./lock-73755c1f.js";import"./mouse-pointer-2-a64daac3.js";import"./external-link-63c5a0ce.js";import"./film-0ba9e353.js";import"./sparkles-e0558c3e.js";import"./pause-2cb080c5.js";import"./play-3580deb4.js";import"./ellipsis-vertical-09d18e39.js";import"./video-a08888e9.js";import"./check-083433f7.js";import"./slotWidgets-57ef49ea.js";import"./trash-2-7a739e24.js";import"./crown-fdf36aa5.js";import"./volume-2-a1e941cc.js";import"./user-2d8f405f.js";import"./users-a990a1e8.js";import"./chromaKey-9ef66bf0.js";import"./deviceDetection-9fe14a8f.js";import"./roomAccess-6d61bdfc.js";import"./audioQuality-b8c9f17c.js";import"./snichDenoiseRuntime-273d9ce6.js";import"./pin-70ee9bd9.js";import"./ellipsis-bbf71637.js";import"./Controls-5a18fd37.js";import"./chevron-down-888c3b30.js";import"./copy-34f4069e.js";import"./api-d8a57490.js";import"./format-5039f022.js";import"./captions-4aebb0bb.js";import"./layout-grid-63073c93.js";import"./log-out-e38723a8.js";import"./log-in-3920688d.js";import"./minus-d93c9c9c.js";import"./RoomFeaturesUi-d9f0cc70.js";import"./people-57c2fe27.js";import"./rotate-ccw-738260f2.js";import"./user-plus-d862ebc6.js";import"./minimize-2-7f4bb98d.js";import"./volume-x-8aea9e1c.js";import"./Studio-12de6b79.js";import"./Lobby-cd4ae718.js";import"./BackgroundModal-371a8f77.js";import"./mediaPrefs-a1582108.js";/* empty css              */import"./image-aefc8036.js";import"./upload-34ad8b6a.js";import"./chevron-up-f536cc4c.js";import"./square-abcd1e2a.js";import"./smartphone-d9ded3c9.js";import"./headphones-a3105568.js";import"./EntryChrome-3815c94b.js";import"./radio-dc3b7f8c.js";import"./arrow-right-eda8f931.js";import"./shield-check-111738a3.js";import"./file-text-e7c68864.js";import"./file-play-96922e92.js";import"./pen-line-729408c9.js";import"./plus-39793e81.js";import"./logo-snich-dialogue-bd9a9926.js";import"./LayoutEditorModal-5c2cbcf2.js";import"./pencil-c32e7d9a.js";import"./monitor-ac1ab9e6.js";import"./arrow-up-955249b3.js";import"./arrow-down-5480e148.js";import"./maximize-edcb58d4.js";import"./circle-119050f3.js";import"./share-2-50cd044b.js";import"./loader-circle-f10bdd75.js";import"./layers-e08031b9.js";import"./type-c9e8ec6d.js";import"./timer-dd0230bd.js";import"./clock-e6794ea5.js";import"./send-ef7332d3.js";import"./plug-1e9df63e.js";import"./triangle-alert-cdc85d96.js";import"./download-3e69fd6b.js";import"./thumbs-up-f55ea202.js";import"./paperclip-3819f2af.js";import"./music-0f60f4f1.js";import"./message-square-87bea34a.js";import"./sticky-note-012253c0.js";import"./mediaSettingsStore-1783edcc.js";import"./camera-8e9c5806.js";import"./sliders-horizontal-41aa44a5.js";import"./MicCheckModal-3c0b1b56.js";import"./micDiagnostics-fa65b80f.js";import"./search-01fb0df0.js";import"./user-minus-edd1ae61.js";import"./repeat-a9c26444.js";import"./grip-vertical-b48ba28a.js";import"./languages-9836601a.js";import"./zap-a08e50de.js";import"./shield-b21f8aed.js";import"./WaitingRoom-fe3d8748.js";import"./EventPreview-a5c61118.js";import"./eventDuration-e09aabf0.js";import"./circle-x-d5c7be80.js";import"./mail-c07c6c62.js";import"./calendar-days-6829c81b.js";import"./EndedScreen-b2678b64.js";import"./publicApi-16230aa9.js";import"./star-f57b9032.js";import"./list-13d531b4.js";import"./arrow-left-6a250fbc.js";import"./pin-off-03798f51.js";import"./usePollsControl-16f8b1fc.js";import"./arrow-up-right-d4798a03.js";import"./heart-469df115.js";
1import"./presentation-e2109ecf.js";import"./file-image-4dd0cad4.js";import"./reply-796fd39d.js";import"./bell-521a1a83.js";import"./sun-a2f106f6.js";import"./wand-sparkles-9c558bbc.js";import"./building-2-4f0d39c1.js";import"./list-checks-f8235a5c.js";import"./moon-d002ab0c.js";import"./square-play-af60d053.js";import"./chart-column-b727cf56.js";import"./list-ordered-28cc4cb1.js";import"./quote-d8d1ab36.js";import"./link-2-36909ef8.js";import"./user-x-facc2ce7.js";import"./ViewerPoll-f209eb79.js";import"./hourglass-26ebe251.js";import"./user-round-31d3de96.js";const jt=80,Ft="#FBFAF7",lt=8e3,st=1e4,ct=["#0A72C6","#8E4FE8","#E07A1F","#1E9E54","#D1344A","#0F8C8C","#B5651D","#5B6CFF"];function J(a){let r=0;for(let m=0;m<a.length;m+=1)r=r*31+a.charCodeAt(m)|0;return ct[Math.abs(r)%ct.length]}class Lt{constructor(){this.listeners=new Set,this.frame=0,this.version=0,this.subscribe=r=>(this.listeners.add(r),()=>{this.listeners.delete(r)}),this.snapshot=()=>this.version}emit(){this.frame||(this.frame=window.requestAnimationFrame(()=>{this.frame=0,this.version+=1,this.listeners.forEach(r=>r())}))}}const Nt=a=>(a||"Участник").trim().split(/\s+/)[0]||"Участник";function Ut({api:a,pulse:r,peers:m}){i.useSyncExternalStore(r.subscribe,r.snapshot);const[l,h]=i.useState({scrollX:0,scrollY:0,zoom:1});i.useEffect(()=>{if(!a)return;const f=a.getAppState();return h({scrollX:f.scrollX,scrollY:f.scrollY,zoom:f.zoom.value}),a.onScrollChange((U,P,s)=>h({scrollX:U,scrollY:P,zoom:s.value}))},[a]);const T=Date.now(),M=Array.from(m.current.values()).filter(f=>f.visible&&f.x!=null&&f.y!=null&&T-f.seenAt<lt);return M.length?v.jsx("div",{className:"m2-bcursors","aria-hidden":"true",children:M.map(f=>v.jsxs("span",{className:Dt("m2-bcursor",f.drewAt>T-1500&&"is-drawing"),style:{transform:`translate(${Math.round(((f.x||0)+l.scrollX)*l.zoom)}px, ${Math.round(((f.y||0)+l.scrollY)*l.zoom)}px)`,"--c":f.color},children:[v.jsx("svg",{viewBox:"0 0 16 20",width:"16",height:"20",children:v.jsx("path",{d:"M1.5 1.5 L1.5 16.5 L5.6 12.6 L8.4 18.6 L11 17.4 L8.3 11.6 L14 11.6 Z"})}),v.jsx("b",{children:Nt(f.name)})]},f.peerId))}):null}const Pt={select:"selection",marker:"freedraw",text:"text",shape:"rectangle",arrow:"arrow",image:"image"};function zt(a){switch(a){case"selection":case"hand":case"lasso":return"select";case"freedraw":return"marker";case"text":return"text";case"rectangle":case"ellipse":case"diamond":return"shape";case"arrow":case"line":return"arrow";case"image":return"image";default:return null}}function at(a,r){const m=new Map;return a.forEach(l=>m.set(l.id,l)),r.forEach(l=>{if(!l||typeof l.id!="string")return;const h=m.get(l.id);(!h||l.version>h.version||l.version===h.version&&l.versionNonce<h.versionNonce)&&m.set(l.id,l)}),Array.from(m.values()).sort((l,h)=>(l.index||"")<(h.index||"")?-1:(l.index||"")>(h.index||"")?1:0)}class Yt extends yt.Component{constructor(r){super(r),this.timer=null,this.recover=()=>{this.timer&&clearTimeout(this.timer),this.timer=null,this.setState({failed:!1}),this.props.onRecover()},this.state={failed:!1}}static getDerivedStateFromError(){return{failed:!0}}componentDidCatch(r){console.error("[meeting2 board] Excalidraw crashed, recovering",r),this.timer=setTimeout(()=>this.recover(),2e3)}componentWillUnmount(){this.timer&&clearTimeout(this.timer)}render(){return this.state.failed?v.jsxs("div",{className:"m2-bcanvas-fail",role:"status",children:[v.jsx("span",{children:"Доска перезагружается…"}),v.jsx("button",{type:"button",className:"m2-btn is-sm is-quiet",onClick:this.recover,children:"Перезагрузить сейчас"})]}):this.props.children}}const _t=a=>({x:a.x+a.width/2,y:a.y+a.height/2}),ut=(a,r)=>a.x>=r.x&&a.x<=r.x+r.width&&a.y>=r.y&&a.y<=r.y+r.height;function Fn({roomId:a,socket:r,readOnly:m,tool:l,onToolChange:h,onReady:T,onStatus:M,insets:f,onPresence:U,pointerRate:P=15}){const[s,Q]=i.useState(null),[mt,pt]=i.useState(0),q=i.useRef(null),j=i.useRef(new Map),F=i.useRef(new Set),E=i.useRef(null),A=i.useRef(null),z=i.useRef(!0),L=i.useRef(0),V=i.useRef({zoom:1,save:"saved",title:null}),I=i.useRef(l);
1I.current=l;const S=i.useRef({onToolChange:h,onStatus:M,onReady:T,onPresence:U});S.current={onToolChange:h,onStatus:M,onReady:T,onPresence:U};const y=i.useRef(new Map),N=i.useMemo(()=>new Lt,[]),Z=i.useRef(0),Y=i.useRef(m);Y.current=m;const G=i.useRef(f);G.current=f;const d=i.useCallback(e=>{const t={...V.current,...e},c=V.current;t.zoom===c.zoom&&t.save===c.save&&t.title===c.title||(V.current=t,S.current.onStatus(t))},[]),ft=()=>{var e,t;return((e=q.current)==null?void 0:e.querySelector(".excalidraw-container"))||((t=q.current)==null?void 0:t.querySelector(".excalidraw"))||null},_=i.useCallback(()=>{if(!s)return;const e=s.getSceneElements();if(!e.length)return;const t=G.current||{top:0,right:0,bottom:0,left:0};s.scrollToContent(e,{fitToContent:!0,animate:!1,maxZoom:1,viewportZoomFactor:.94,canvasOffsets:t})},[s]),B=i.useCallback(e=>{var u;const t=e.find(o=>{var n;return!o.isDeleted&&o.type==="text"&&((n=o.customData)==null?void 0:n.m2)==="title"});return((u=t==null?void 0:t.text)==null?void 0:u.trim())||null},[]),tt=i.useRef(()=>{}),D=i.useCallback(e=>{if(!e)return;const t=Array.isArray(e.elements)?e.elements:[],c=e.files&&typeof e.files=="object"?e.files:{};if(!s){const n=A.current||{elements:[],files:{}};A.current={elements:at(n.elements,t),files:{...n.files,...c}};return}const u=Object.values(c).filter(Boolean);if(u.length&&(u.forEach(n=>{n.id&&F.current.add(n.id)}),s.addFiles(u)),!t.length)return;t.forEach(n=>{n!=null&&n.id&&j.current.set(n.id,Number(n.version)||0)});const o=s.getSceneElementsIncludingDeleted();try{const n=gt(t,null),p=Ct(o,n,s.getAppState());s.updateScene({elements:p,captureUpdate:X.NEVER})}catch(n){console.warn("[meeting2 board] reconcile failed, fallback merge",n);try{s.updateScene({elements:at(o,t),captureUpdate:X.NEVER})}catch(p){console.error("[meeting2 board] scene update failed, resync",p),tt.current();return}}d({title:B(s.getSceneElementsIncludingDeleted())}),z.current&&(z.current=!1,window.requestAnimationFrame(()=>_()))},[s,_,d,B]);i.useEffect(()=>{if(!s||!A.current)return;const e=A.current;A.current=null,D(e)},[s,D]);const et=i.useCallback(()=>{j.current.clear(),F.current.clear(),A.current=null,z.current=!0,E.current&&clearTimeout(E.current),E.current=null,Q(null),pt(e=>e+1)},[]);tt.current=et;const $=i.useCallback(e=>{if(!r)return;if(!r.connected){d({save:"offline"});return}L.current+=1,d({save:"saving"});let t=!1;const c=()=>{t||(t=!0,L.current=Math.max(0,L.current-1),L.current||d({save:r.connected?"saved":"offline"}))},u=window.setTimeout(c,8e3);r.emit("whiteboard:update",{roomId:a,patch:e},()=>{window.clearTimeout(u),c()})},[r,a,d]),rt=i.useCallback(()=>{if(E.current=null,!s||m)return;const e=s.getFiles()||{},t={};Object.entries(e).forEach(([o,n])=>{F.current.has(o)||(F.current.add(o),t[o]=n)}),Object.keys(t).length&&$({type:"excalidraw-files",files:t});const c=s.getSceneElementsIncludingDeleted(),u=c.filter(o=>{const n=j.current.get(o.id);return n===void 0||(Number(o.version)||0)>n});u.length&&(u.forEach(o=>j.current.set(o.id,Number(o.version)||0)),$({type:"excalidraw-elements",elements:u}),Z.current=Date.now()),d({title:B(c)})},[s,m,$,d,B]),dt=i.useCallback((e,t)=>{const c=zt(t.activeTool.type);c&&c!==I.current&&!(I.current==="sticky"&&c==="select")&&(I.current=c,S.current.onToolChange(c)),!E.current&&(E.current=setTimeout(rt,jt))},[rt]);i.useEffect(()=>()=>{E.current&&clearTimeout(E.current)},[]),i.useEffect(()=>{if(!r)return;const e=n=>D(n==null?void 0:n.excalidraw),t=n=>{const p=n==null?void 0:n.patch;if(p){if(n!=null&&n.by){const w=Date.now(),b=y.current.get(n.by);y.current.set(n.by,b?{...b,canEdit:!0,drewAt:w}:{peerId:n.by,userId:null,name:null,color:J(n.by),x:null,y:null,canEdit:!0,seenAt:0,drewAt:w,visible:!1})}p.type==="excalidraw-elements"?D({elements:p.elements}):p.type==="excalidraw-files"&&D({files:p.files})}},c=()=>{j.current.clear(),F.current.clear(),z.current=!0,s==null||s.updateScene({elements:[],captureUpdate:X.NEVER}),d({title:null})},u=()=>{d({save:L.current?"saving":"saved"}),r.emit("whiteboard:join",{roomId:a})},o=()=>d({save:"offline"});return r.emit("whiteboard:join",{roomId:a}),r.on("whiteboard:state",e),r.on("whiteboard:update",t),r.on("whiteboard:cleared",c),r.on("connect",u),r.on("disconnect",o),r.connected||d({save:"offline"}),()=>{r.off("whiteboard:state",e),r.off("whiteboard:update",t),r.off("whiteboard:cleared",c),r.off("connect",u),r.off("disconnect",o)}},[r,a,s,D,d]),i.useEffect(()=>{if(!r)return;const e=t=>{if(!(t!=null&&t.peerId))return;const c=Date.now(),u=y.current.get(t.peerId),o=t.userId||t.peerId,n=u||{peerId:t.peerId,userId:null,name:null,color:J(o),x:null,y:null,canEdit:!1,seenAt:0,drewAt:0,visible:!1};t.gone?y.current.set(t.peerId,{...n,visible:!1}):y.current.set(t.peerId,{...n,userId:t.userId??n.userId,name:t.name||n.name,color:t.color||J(o),x:typeof t.x=="number"?t.x:n.x,y:typeof t.y=="number"?t.y:n.y,canEdit:!!t.canEdit,seenAt:c,drewAt:t.down?c:n.drewAt,visible:!0}),N.emit()};return r.on("whiteboard:pointer",e),()=>{r.off("whiteboard:pointer",e)}},[r,N]),i.useEffect(()=>{let e="",t=!1;const c=()=>{var C,R;const o=Date.now(),n=[];let p=!1;y.current.forEach((x,Et)=>{const ot=Math.max(x.seenAt,x.drewAt);if(o-ot>6e4){y.current.delete(Et);return}x.visible&&o-x.seenAt<lt&&(p=!0),x.canEdit&&o-ot<st&&n.push({peerId:x.peerId,userId:x.userId,name:x.name,color:x.color})}),(p!==t||p)&&N.emit(),t=p;const w=!Y.current&&o-Z.current<st,b=`${w?1:0}|${n.map(x=>x.peerId).sort().join(",")}`;b!==e&&(e=b,(R=(C=S.current).onPresence)==null||R.call(C,{peers:n,self:w}))};c();const u=window.setInterval(c,1e3);return()=>window.clearInterval(u)},[N]);const O=i.useRef(0),g=i.useRef(null),K=i.useRef(null),H=i.useCallback(()=>{g.current=null;const e=K.current;K.current=null,!(!e||!(r!=null&&r.connected))&&(O.current=Date.now(),r.volatile.emit("whiteboard:pointer",{roomId:a,x:Math.round(e.x*10)/10,y:Math.round(e.y*10)/10,down:e.down}))},[r,a]),ht=i.useCallback(e=>{if(Y.current||!r)return;const t=Date.now();Z.current=t,K.current={x:e.pointer.x,y:e.pointer.y,down:e.button==="down"};const c=1e3/Math.max(1,Math.min(15,P));if(g.current)return;const u=Math.max(0,c-(t-O.current));u?g.current=setTimeout(H,u):H()},[r,P,H]),wt=i.useCallback(()=>{g.current&&clearTimeout(g.current),g.current=null,K.current=null,!(Y.current||!(r
1!=null&&r.connected)||!O.current)&&(O.current=0,r.volatile.emit("whiteboard:pointer",{roomId:a,gone:!0}))},[r,a]);i.useEffect(()=>()=>{g.current&&clearTimeout(g.current)},[]),i.useEffect(()=>{if(s)return d({zoom:s.getAppState().zoom.value}),s.onScrollChange((e,t,c)=>d({zoom:c.value}))},[s,d]);const k=i.useCallback(e=>{const t=ft();t&&t.dispatchEvent(new KeyboardEvent("keydown",{bubbles:!0,cancelable:!0,...e}))},[]),vt=i.useCallback(e=>{var b;if(!s||m||I.current!=="sticky"||e.button!==0||!(e.target instanceof HTMLCanvasElement))return;const t=s.getAppState();if(t.editingTextElement)return;e.preventDefault(),e.stopPropagation();const c=St({clientX:e.clientX,clientY:e.clientY},t),o=[...s.getSceneElements()].reverse().find(C=>{var R;return((R=C.customData)==null?void 0:R.m2)==="column"&&ut(c,C)}),n=typeof((b=o==null?void 0:o.customData)==null?void 0:b.sticky)=="string"?o.customData.sticky:Tt[0],p=Mt(c.x-it.w/2,c.y-it.h/2,n,"",{sans:W.Nunito,hand:W.Excalifont},(Math.random()-.5)*.05),[w]=Rt([p]);w&&(s.updateScene({elements:[...s.getSceneElementsIncludingDeleted(),w],appState:{selectedElementIds:{[w.id]:!0}},captureUpdate:X.IMMEDIATELY}),window.requestAnimationFrame(()=>k({key:"Enter",code:"Enter"})))},[s,m,k]),nt=i.useMemo(()=>s?{setTool:e=>{m||(I.current=e,s.setActiveTool({type:e==="sticky"?"selection":Pt[e]}),S.current.onToolChange(e))},undo:()=>k({key:"z",code:"KeyZ",ctrlKey:!0,metaKey:!0}),exportPng:async e=>{const t=s.getSceneElements();if(!t.length)return!1;const c=await At({elements:t,appState:{...s.getAppState(),exportBackground:!0,viewBackgroundColor:Ft},files:s.getFiles(),mimeType:"image/png",exportPadding:32}),u=URL.createObjectURL(c),o=document.createElement("a");return o.href=u,o.download=`${e.replace(/[\\/:*?"<>|]+/g," ").trim()||"Доска"}.png`,document.body.appendChild(o),o.click(),o.remove(),window.setTimeout(()=>URL.revokeObjectURL(u),4e3),!0},snapshot:()=>({elements:s.getSceneElements().filter(e=>e.type!=="image")}),taskTexts:()=>{const e=s.getSceneElements(),t=new Map(e.map(o=>[o.id,o])),c=e.filter(o=>{var n,p;return((n=o.customData)==null?void 0:n.m2)==="column"&&((p=o.customData)==null?void 0:p.tasks)});if(!c.length)return[];const u=[];return e.forEach(o=>{var w,b,C;if(o.type!=="text"||!((w=o.text)!=null&&w.trim())||(b=o.customData)!=null&&b.m2&&o.customData.m2!=="sticky")return;const n=o.containerId?t.get(o.containerId):null;if(n&&((C=n.customData)!=null&&C.m2)&&n.customData.m2!=="sticky")return;const p=_t(n||o);c.some(R=>ut(p,R))&&u.push(o.text.trim().replace(/\s+/g," ").slice(0,200))}),u},fit:_}:null,[s,_,k,m]);i.useEffect(()=>(S.current.onReady(nt),()=>S.current.onReady(null)),[nt]);const bt=i.useMemo(()=>({appState:{viewBackgroundColor:"transparent",currentItemStrokeColor:"#141619",currentItemRoughness:0,currentItemFontFamily:W.Nunito}}),[]),xt=i.useMemo(()=>({canvasActions:{changeViewBackgroundColor:!1,clearCanvas:!1,export:!1,loadScene:!1,saveAsImage:!1,saveToActiveFile:!1,toggleTheme:!1},tools:{image:!0}}),[]);return v.jsxs("div",{ref:q,className:"m2-bcanvas","data-tool":l,"data-readonly":m?"1":void 0,onPointerDownCapture:vt,onPointerLeave:wt,children:[v.jsx(Yt,{onRecover:et,children:v.jsx(It,{excalidrawAPI:e=>Q(e),onChange:dt,onPointerUpdate:ht,viewModeEnabled:m,langCode:"ru-RU",UIOptions:xt,initialData:bt})},mt),v.jsx(Ut,{api:s,pulse:N,peers:y})]})}export{Fn as BoardCanvas,J as cursorColor};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.