twombly 0.2.0 → 0.4.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.
@@ -1 +0,0 @@
1
- import{n as e,t}from"./rolldown-runtime-WkwZ5CU-.js";var n=t((e=>{var t=Symbol.for(`react.transitional.element`),n=Symbol.for(`react.portal`),r=Symbol.for(`react.fragment`),i=Symbol.for(`react.strict_mode`),a=Symbol.for(`react.profiler`),o=Symbol.for(`react.consumer`),s=Symbol.for(`react.context`),c=Symbol.for(`react.forward_ref`),l=Symbol.for(`react.suspense`),u=Symbol.for(`react.memo`),d=Symbol.for(`react.lazy`),f=Symbol.for(`react.activity`),p=Symbol.for(`react.view_transition`),m=Symbol.iterator;function h(e){return typeof e!=`object`||!e?null:(e=m&&e[m]||e[`@@iterator`],typeof e==`function`?e:null)}var g={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},_=Object.assign,v={};function y(e,t,n){this.props=e,this.context=t,this.refs=v,this.updater=n||g}y.prototype.isReactComponent={},y.prototype.setState=function(e,t){if(typeof e!=`object`&&typeof e!=`function`&&e!=null)throw Error(`takes an object of state variables to update or a function which returns an object of state variables.`);this.updater.enqueueSetState(this,e,t,`setState`)},y.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,`forceUpdate`)};function b(){}b.prototype=y.prototype;function x(e,t,n){this.props=e,this.context=t,this.refs=v,this.updater=n||g}var S=x.prototype=new b;S.constructor=x,_(S,y.prototype),S.isPureReactComponent=!0;var C=Array.isArray;function w(){}var T={H:null,A:null,T:null,S:null},E=Object.prototype.hasOwnProperty;function D(e,n,r){var i=r.ref;return{$$typeof:t,type:e,key:n,ref:i===void 0?null:i,props:r}}function O(e,t){return D(e.type,t,e.props)}function k(e){return typeof e==`object`&&!!e&&e.$$typeof===t}function A(e){var t={"=":`=0`,":":`=2`};return`$`+e.replace(/[=:]/g,function(e){return t[e]})}var j=/\/+/g;function M(e,t){return typeof e==`object`&&e&&e.key!=null?A(``+e.key):t.toString(36)}function N(e){switch(e.status){case`fulfilled`:return e.value;case`rejected`:throw e.reason;default:switch(typeof e.status==`string`?e.then(w,w):(e.status=`pending`,e.then(function(t){e.status===`pending`&&(e.status=`fulfilled`,e.value=t)},function(t){e.status===`pending`&&(e.status=`rejected`,e.reason=t)})),e.status){case`fulfilled`:return e.value;case`rejected`:throw e.reason}}throw e}function P(e,r,i,a,o){var s=typeof e;(s===`undefined`||s===`boolean`)&&(e=null);var c=!1;if(e===null)c=!0;else switch(s){case`bigint`:case`string`:case`number`:c=!0;break;case`object`:switch(e.$$typeof){case t:case n:c=!0;break;case d:return c=e._init,P(c(e._payload),r,i,a,o)}}if(c)return o=o(e),c=a===``?`.`+M(e,0):a,C(o)?(i=``,c!=null&&(i=c.replace(j,`$&/`)+`/`),P(o,r,i,``,function(e){return e})):o!=null&&(k(o)&&(o=O(o,i+(o.key==null||e&&e.key===o.key?``:(``+o.key).replace(j,`$&/`)+`/`)+c)),r.push(o)),1;c=0;var l=a===``?`.`:a+`:`;if(C(e))for(var u=0;u<e.length;u++)a=e[u],s=l+M(a,u),c+=P(a,r,i,s,o);else if(u=h(e),typeof u==`function`)for(e=u.call(e),u=0;!(a=e.next()).done;)a=a.value,s=l+M(a,u++),c+=P(a,r,i,s,o);else if(s===`object`){if(typeof e.then==`function`)return P(N(e),r,i,a,o);throw r=String(e),Error(`Objects are not valid as a React child (found: `+(r===`[object Object]`?`object with keys {`+Object.keys(e).join(`, `)+`}`:r)+`). If you meant to render a collection of children, use an array instead.`)}return c}function F(e,t,n){if(e==null)return e;var r=[],i=0;return P(e,r,``,``,function(e){return t.call(n,e,i++)}),r}function ee(e){if(e._status===-1){var t=e._result,n=t();n.then(function(t){(e._status===0||e._status===-1)&&(e._status=1,e._result=t,n.status===void 0&&(n.status=`fulfilled`,n.value=t))},function(t){(e._status===0||e._status===-1)&&(e._status=2,e._result=t,n.status===void 0&&(n.status=`rejected`,n.reason=t))}),e._status===-1&&(e._status=0,e._result=n)}if(e._status===1)return e._result.default;throw e._result}var I=typeof reportError==`function`?reportError:function(e){if(typeof window==`object`&&typeof window.ErrorEvent==`function`){var t=new window.ErrorEvent(`error`,{bubbles:!0,cancelable:!0,message:typeof e==`object`&&e&&typeof e.message==`string`?String(e.message):String(e),error:e});if(!window.dispatchEvent(t))return}else if(typeof process==`object`&&typeof process.emit==`function`){process.emit(`uncaughtException`,e);return}console.error(e)};function te(e){var t=T.T,n={};n.types=t===null?null:t.types,T.T=n;try{var r=e(),i=T.S;i!==null&&i(n,r),typeof r==`object`&&r&&typeof r.then==`function`&&r.then(w,I)}catch(e){I(e)}finally{t!==null&&n.types!==null&&(t.types=n.types),T.T=t}}function L(e){var t=T.T;if(t!==null){var n=t.types;n===null?t.types=[e]:n.indexOf(e)===-1&&n.push(e)}else te(L.bind(null,e))}var ne={map:F,forEach:function(e,t,n){F(e,function(){t.apply(this,arguments)},n)},count:function(e){var t=0;return F(e,function(){t++}),t},toArray:function(e){return F(e,function(e){return e})||[]},only:function(e){if(!k(e))throw Error(`React.Children.only expected to receive a single React element child.`);return e}};e.Activity=f,e.Children=ne,e.Component=y,e.Fragment=r,e.Profiler=a,e.PureComponent=x,e.StrictMode=i,e.Suspense=l,e.ViewTransition=p,e.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE=T,e.__COMPILER_RUNTIME={__proto__:null,c:function(e){return T.H.useMemoCache(e)}},e.addTransitionType=L,e.cache=function(e){return function(){return e.apply(null,arguments)}},e.cacheSignal=function(){return null},e.cloneElement=function(e,t,n){if(e==null)throw Error(`The argument must be a React element, but you passed `+e+`.`);var r=_({},e.props),i=e.key;if(t!=null)for(a in t.key!==void 0&&(i=``+t.key),t)!E.call(t,a)||a===`key`||a===`__self`||a===`__source`||a===`ref`&&t.ref===void 0||(r[a]=t[a]);var a=arguments.length-2;if(a===1)r.children=n;else if(1<a){for(var o=Array(a),s=0;s<a;s++)o[s]=arguments[s+2];r.children=o}return D(e.type,i,r)},e.createContext=function(e){return e={$$typeof:s,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null},e.Provider=e,e.Consumer={$$typeof:o,_context:e},e},e.createElement=function(e,t,n){var r,i={},a=null;if(t!=null)for(r in t.key!==void 0&&(a=``+t.key),t)E.call(t,r)&&r!==`key`&&r!==`__self`&&r!==`__source`&&(i[r]=t[r]);var o=arguments.length-2;if(o===1)i.children=n;else if(1<o){for(var s=Array(o),c=0;c<o;c++)s[c]=arguments[c+2];i.children=s}if(e&&e.defaultProps)for(r in o=e.defaultProps,o)i[r]===void 0&&(i[r]=o[r]);return D(e,a,i)},e.createRef=function(){return{current:null}},e.forwardRef=function(e){return{$$typeof:c,render:e}},e.isValidElement=k,e.lazy=function(e){return{$$typeof:d,_payload:{_status:-1,_result:e},_init:ee}},e.memo=function(e,t){return{$$typeof:u,type:e,compare:t===void 0?null:t}},e.startTransition=te,e.unstable_useCacheRefresh=function(){return T.H.useCacheRefresh()},e.use=function(e){return T.H.use(e)},e.useActionState=function(e,t,n){return T.H.useActionState(e,t,n)},e.useCallback=function(e,t){return T.H.useCallback(e,t)},e.useContext=function(e){return T.H.useContext(e)},e.useDebugValue=function(){},e.useDeferredValue=function(e,t){return T.H.useDeferredValue(e,t)},e.useEffect=function(e,t){return T.H.useEffect(e,t)},e.useEffectEvent=function(e){return T.H.useEffectEvent(e)},e.useId=function(){return T.H.useId()},e.useImperativeHandle=function(e,t,n){return T.H.useImperativeHandle(e,t,n)},e.useInsertionEffect=function(e,t){return T.H.useInsertionEffect(e,t)},e.useLayoutEffect=function(e,t){return T.H.useLayoutEffect(e,t)},e.useMemo=function(e,t){return T.H.useMemo(e,t)},e.useOptimistic=function(e,t){return T.H.useOptimistic(e,t)},e.useReducer=function(e,t,n){return T.H.useReducer(e,t,n)},e.useRef=function(e){return T.H.useRef(e)},e.useState=function(e){return T.H.useState(e)},e.useSyncExternalStore=function(e,t,n){return T.H.useSyncExternalStore(e,t,n)},e.useTransition=function(){return T.H.useTransition()},e.version=`19.3.1`})),r=t(((e,t)=>{t.exports=n()})),i=e(r(),1);async function a(e,t){let n=await fetch(e,{credentials:`same-origin`,...t,headers:{...t?.body?{"content-type":`application/json`}:{},...t?.headers}}),r=await n.json().catch(()=>({}));if(!n.ok)throw Object.assign(Error(r.error||`Failed (${n.status})`),{status:n.status});return r}var o={bootstrap:e=>a(`/api/bootstrap${e?`?canvas=${encodeURIComponent(e)}`:``}`),ticket:(e,t)=>a(`/api/canvases/${e}/ticket`,{method:`POST`,body:JSON.stringify({name:t})}),share:e=>a(`/api/canvases/${e}/share`,{method:`POST`,body:`{}`}),unshare:e=>a(`/api/canvases/${e}/unshare`,{method:`POST`,body:`{}`}),list:()=>a(`/api/canvases`),doc:e=>a(`/api/canvases/${e}`),update:(e,t)=>a(`/api/canvases/${e}`,{method:`PATCH`,body:JSON.stringify(t)}),remove:e=>a(`/api/canvases/${e}`,{method:`DELETE`}),login:()=>a(`/api/login`,{method:`POST`,body:`{}`}),saveSettings:e=>a(`/api/settings`,{method:`POST`,body:JSON.stringify(e)}),signOut:()=>a(`/auth/signout`,{method:`POST`,body:`{}`})},s={fileBytes:26214400,frameBytes:104857600,frameFiles:5e3,canvasFrames:200,scanBytes:8388608,titleChars:120,nameChars:120,commentChars:5e3,strokePoints:3e3,canvasStrokes:2e3},c=`abcdefghijkmnpqrstuvwxyz23456789`;function l(e=12){let t=crypto.getRandomValues(new Uint8Array(e)),n=``;for(let e of t)n+=c[e%32];return n}var u=e=>{let t,n=new Set,r=(e,r)=>{let i=typeof e==`function`?e(t):e;if(!Object.is(i,t)){let e=t;t=r??(typeof i!=`object`||!i)?i:Object.assign({},t,i),n.forEach(n=>n(t,e))}},i=()=>t,a={setState:r,getState:i,getInitialState:()=>o,subscribe:e=>(n.add(e),()=>n.delete(e))},o=t=e(r,i,a);return a},d=(e=>e?u(e):u),f=e=>e;function p(e,t=f){let n=i.useSyncExternalStore(e.subscribe,i.useCallback(()=>t(e.getState()),[e,t]),()=>t(e.getInitialState()));return i.useDebugValue(n),n}var m=e=>{let t=d(e),n=e=>p(t,e);return Object.assign(n,t),n},h=(e=>e?m(e):m),g=.05,_=e=>Math.min(8,Math.max(g,e)),v=(e,t)=>({x:(e.x-t.x)/t.z,y:(e.y-t.y)/t.z}),y=(e,t)=>({x:t.x+e.x*t.z,y:t.y+e.y*t.z}),b=(e,t,n)=>({...e,x:e.x+t,y:e.y+n});function x(e,t,n){let r=_(e.z*t),i=r/e.z;return{z:r,x:n.x-(n.x-e.x)*i,y:n.y-(n.y-e.y)*i}}function S(e,t){return{x:Math.min(e.x,t.x),y:Math.min(e.y,t.y),w:Math.abs(t.x-e.x),h:Math.abs(t.y-e.y)}}var C=(e,t)=>e.x<t.x+t.w&&e.x+e.w>t.x&&e.y<t.y+t.h&&e.y+e.h>t.y;function w(e){if(!e.length)return null;let t=Math.min(...e.map(e=>e.x)),n=Math.min(...e.map(e=>e.y));return{x:t,y:n,w:Math.max(...e.map(e=>e.x+e.w))-t,h:Math.max(...e.map(e=>e.y+e.h))-n}}function T(e,t,n){let r=t<640?24:96,i=_(Math.min(1,(t-r*2)/Math.max(1,e.w),(n-r*2)/Math.max(1,e.h)));return{z:i,x:t/2-(e.x+e.w/2)*i,y:n/2-(e.y+e.h/2)*i}}var E=e=>[e.x,e.x+e.w/2,e.x+e.w],D=e=>[e.y,e.y+e.h/2,e.y+e.h];function O(e,t,n){let r=null;for(let i of t)for(let t of e){let e=i-t;Math.abs(e)<=n&&(r===null||Math.abs(e)<Math.abs(r))&&(r=e)}return r}function k(e,t,n){let r=O(E(e),t.flatMap(E),n)??0,i=O(D(e),t.flatMap(D),n)??0,a={...e,x:e.x+r,y:e.y+i},o=[];for(let e of t){for(let t of E(a))E(e).some(e=>Math.abs(e-t)<.5)&&o.push({axis:`x`,pos:t,start:Math.min(a.y,e.y),end:Math.max(a.y+a.h,e.y+e.h)});for(let t of D(a))D(e).some(e=>Math.abs(e-t)<.5)&&o.push({axis:`y`,pos:t,start:Math.min(a.x,e.x),end:Math.max(a.x+a.w,e.x+e.w)})}return{dx:r,dy:i,guides:o}}var A=class{ticket;onMessage;onState;socket=null;closed=!1;attempts=0;pingTimer=0;retryTimer=0;nextRpc=1;calls=new Map;constructor(e,t,n){this.ticket=e,this.onMessage=t,this.onState=n,this.connect()}async connect(){if(this.closed)return;let e;try{e=await this.ticket()}catch{return this.retry()}if(this.closed)return;let t=new WebSocket(e);this.socket=t,t.onopen=()=>{this.attempts=0,this.onState(!0),window.clearInterval(this.pingTimer),this.pingTimer=window.setInterval(()=>this.send({t:`ping`}),25e3)},t.onmessage=e=>{let t;try{t=JSON.parse(e.data)}catch{return}if(t.t===`rpc`){let e=this.calls.get(t.id);if(!e)return;this.calls.delete(t.id),t.error?e.reject(Error(t.error)):e.resolve(t.result)}else this.onMessage(t)},t.onclose=e=>{if(this.socket===t){window.clearInterval(this.pingTimer),this.onState(!1);for(let e of this.calls.values())e.reject(Error(`Disconnected`));this.calls.clear(),e.code!==4004&&this.retry()}}}retry(){if(this.closed)return;let e=Math.min(8e3,400*2**this.attempts++)+Math.random()*200;window.clearTimeout(this.retryTimer),this.retryTimer=window.setTimeout(()=>this.connect(),e)}send(e){this.socket?.readyState===WebSocket.OPEN&&this.socket.send(JSON.stringify(e))}rpc(e,t){return new Promise((n,r)=>{if(this.socket?.readyState!==WebSocket.OPEN)return r(Error(`Disconnected`));let i=this.nextRpc++;this.calls.set(i,{resolve:n,reject:r}),this.send({t:`rpc`,id:i,op:e,body:t})})}close(){this.closed=!0,window.clearInterval(this.pingTimer),window.clearTimeout(this.retryTimer),this.socket?.close()}},j=h(()=>({boot:null,canvasId:``,name:``,link:null,connected:!1,ready:!1,gone:!1,role:`guest`,self:``,capabilities:{comments:!1,huddle:!1},peers:[],frames:{},threads:{},camera:{x:0,y:0,z:1},tool:`move`,mode:`edit`,pencil:{color:matchMedia(`(prefers-color-scheme: dark)`).matches?`#ffffff`:`#1a1a1a`,size:6},strokes:{},liveStroke:null,selectedStroke:null,selection:[],interacting:null,following:null,activeThread:null,draft:null,showResolved:!1,guides:[],marquee:null,spacePanning:!1,awaitingSignIn:!1,shareCopied:!1,sharing:null,shareError:null,namePrompt:null,notice:null,size:{width:window.innerWidth,height:window.innerHeight},working:!1,invertScroll:!1})),M=j.setState,N=j.getState,P=new Map,F=new Map,ee=new Set,I=new Set,te=e=>(I.add(e),()=>{I.delete(e)}),L=null,ne=null,re=!1,ie,R=!0;function ae(){R=!1,N().following&&M({following:null})}function oe(){R&&pe()}var z=e=>L?.send(e),se=()=>L;function ce(e){M({camera:{...e,z:_(e.z)}}),ue()}var le=0;function ue(){le||=window.setTimeout(()=>{le=0,B()},66)}function B(){let{camera:e,size:t,peers:n}=N();n.length<2||z({t:`view`,v:{x:(t.width/2-e.x)/e.z,y:(t.height/2-e.y)/e.z,z:e.z,w:t.width,h:t.height}})}var de=()=>Object.values(N().frames),fe=e=>Object.values(e).sort((e,t)=>e.z-t.z||e.id.localeCompare(t.id));function pe(){let e={width:window.innerWidth,height:window.innerHeight},t=w(de());t&&e.width>0&&e.height>0&&ce(T(t,e.width,e.height))}function me(){M({size:{width:window.innerWidth,height:window.innerHeight}}),oe()}function he(){R=!0,N().following&&M({following:null}),pe()}function ge(e,t){if(!e.frameId)return{x:e.x,y:e.y};let n=t[e.frameId];return n?{x:n.x+e.x*n.w,y:n.y+e.y*n.h}:null}function _e(e,t=!1){let{threads:n,frames:r,camera:i,size:a}=N(),o=n[e];if(!o||(be(o),M({activeThread:e,draft:null,showResolved:o.resolved?!0:N().showResolved}),!t))return;R=!1;let s=ge(o,r);s&&ce({...i,x:a.width/2-180-s.x*i.z,y:a.height/2+60-s.y*i.z})}var ve=()=>`oc:read:${N().canvasId}`,V=null;function ye(){if(V)return V;try{V=JSON.parse(localStorage.getItem(ve())||`{}`)}catch{V={}}return V}function be(e){let t=e.comments[e.comments.length-1]?.createdAt||0;ye()[e.id]=t;try{localStorage.setItem(ve(),JSON.stringify(V))}catch{}}function xe(e,t){let n=e.comments[e.comments.length-1];return!!n&&n.author.id!==t&&n.createdAt>(ye()[e.id]||0)}var Se=`oc:name`;function Ce(){try{return localStorage.getItem(Se)||``}catch{return``}}function we(){return!N().peers.find(e=>e.id===N().self)?.guest||Ce()?Promise.resolve(!0):new Promise(e=>{M({namePrompt:t=>{M({namePrompt:null});let n=t?.trim();if(!n)return e(!1);try{localStorage.setItem(Se,n)}catch{}z({t:`name`,name:n}),e(!0)}})})}var Te=`twombly:invert-scroll`;function Ee(){try{return localStorage.getItem(Te)===`1`}catch{return!1}}function De(){let e=!N().invertScroll;if(M({invertScroll:e}),N().boot?.mode===`local`)o.saveSettings({invertScroll:e}).catch(()=>W(`Could not save that`));else try{localStorage.setItem(Te,e?`1`:`0`)}catch{}}var Oe=0;function ke(e){window.clearTimeout(Oe),M({working:e>0}),e>0&&(Oe=window.setTimeout(()=>M({working:!1}),e))}var H=[],Ae=[];function U(e){H.push(e),H.length>50&&H.shift(),Ae.length=0}function je(e){let{frames:t}=N();if(e.kind===`stroke-added`)return N().strokes[e.stroke.id]?(Ve(e.stroke.id),{kind:`stroke-removed`,stroke:e.stroke}):null;if(e.kind===`stroke-removed`)return Be(e.stroke),{kind:`stroke-added`,stroke:e.stroke};if(e.kind===`remove`){for(let t of e.frames)z({t:`frame.restore`,frame:t});return{kind:`restore`,frames:e.frames}}if(e.kind===`restore`){for(let t of e.frames)z({t:`frame.remove`,id:t.id});return{kind:`remove`,frames:e.frames.map(e=>t[e.id]??e)}}let n=e.frames.filter(({id:e})=>t[e]);if(!n.length)return null;let r=n.map(({id:e,before:n})=>({id:e,before:Object.fromEntries(Object.keys(n).map(n=>[n,t[e][n]]))}));for(let{id:e,before:t}of n)Fe(e,t);return{kind:`patch`,frames:r}}function Me(e,t){for(;e.length;){let n=je(e.pop());if(n){t.push(n);return}}}function Ne(){Me(H,Ae)}function Pe(){Me(Ae,H)}function Fe(e,t){let{frames:n}=N();n[e]&&(M({frames:{...n,[e]:{...n[e],...t}}}),z({t:`frame.patch`,id:e,patch:t}))}function Ie(e){let t=e===`pencil`||e===`comment`?{selection:[]}:{};M({tool:e,draft:null,selectedStroke:null,...e===`move`?{}:{interacting:null},...t})}function Le(e){M({mode:e,tool:`move`,draft:null,selectedStroke:null,...e===`preview`?{selection:[],interacting:null}:{}})}function Re(){let{tool:e,mode:t}=N();Le(e===`move`?t===`edit`?`preview`:`edit`:t)}function ze(e){M({pencil:{...N().pencil,...e}})}function Be(e){M({strokes:{...N().strokes,[e.id]:e}}),z({t:`stroke.add`,stroke:e})}function Ve(e){let{[e]:t,...n}=N().strokes;M({strokes:n,selectedStroke:N().selectedStroke===e?null:N().selectedStroke}),z({t:`stroke.remove`,id:e})}function He(e){Be(e),U({kind:`stroke-added`,stroke:e})}function Ue(){let{selection:e,frames:t,role:n,selectedStroke:r,strokes:i}=N();if(r&&i[r])return U({kind:`stroke-removed`,stroke:i[r]}),Ve(r);if(n!==`owner`||!e.length)return;let a=e.map(e=>t[e]).filter(Boolean);U({kind:`remove`,frames:a});for(let e of a)z({t:`frame.remove`,id:e.id});M({selection:[]})}function We(e){let t=N();switch(e.t){case`hello`:{let t={};for(let n of e.doc.frames)t[n.id]=n;let n={};for(let t of e.threads)n[t.id]=t;let r={};for(let t of e.doc.strokes??[])r[t.id]=t;M({self:e.self,role:e.role,frames:t,threads:n,strokes:r,peers:e.peers,capabilities:e.capabilities,name:e.doc.name,ready:!0}),ke(e.working),document.title=`${e.doc.name} – Twombly`,oe();let i=new URLSearchParams(location.search).get(`comment`);i&&n[i]&&(_e(i,!0),history.replaceState(null,``,location.pathname));let a=Ce(),o=e.peers.find(t=>t.id===e.self);o?.guest&&a&&o.name!==a&&z({t:`name`,name:a}),setTimeout(B,100);break}case`peers`:{for(let t of P.keys())e.peers.some(e=>e.id===t)||(P.delete(t),F.delete(t));let n=t.following&&e.peers.some(e=>e.id===t.following)?t.following:null;M({peers:e.peers,following:n}),e.peers.length>t.peers.length&&setTimeout(B,50);break}case`pointer`:P.set(e.from,e.p);break;case`view`:F.set(e.from,{...e.v,at:performance.now()});break;case`frame.upsert`:{let n=ee.has(e.frame.id)?t.frames[e.frame.id]:null,r=n?{...e.frame,x:n.x,y:n.y,w:n.w,h:n.h}:e.frame;M({frames:{...N().frames,[r.id]:r}}),n||oe();break}case`frame.remove`:{let{[e.id]:n,...r}=N().frames;M({frames:r,selection:t.selection.filter(t=>t!==e.id),interacting:t.interacting===e.id?null:t.interacting});break}case`strokes`:{let t={...N().strokes};for(let n of e.strokes)t[n.id]=n;M({strokes:t});break}case`stroke.remove`:{let{[e.id]:n,...r}=N().strokes;M({strokes:r,selectedStroke:t.selectedStroke===e.id?null:t.selectedStroke});break}case`canvas`:M({name:e.name}),document.title=`${e.name} – Twombly`;break;case`working`:ke(e.ms);break;case`thread`:M({threads:{...N().threads,[e.thread.id]:e.thread}}),t.activeThread===e.thread.id&&be(e.thread);break;case`thread.remove`:{let{[e.id]:n,...r}=N().threads;M({threads:r,activeThread:t.activeThread===e.id?null:t.activeThread});break}case`deleted`:Ge();break;case`error`:W(e.message)}for(let t of I)t(e)}async function Ge(){let{boot:e}=N();if(e?.mode===`local`)return M({link:null,awaitingSignIn:!1}),await o.bootstrap(N().canvasId).catch(()=>null),qe();L?.close(),M({gone:!0})}var Ke=0;function W(e){M({notice:e}),window.clearTimeout(Ke),Ke=window.setTimeout(()=>M({notice:null}),2600)}function qe(){L?.close();let e=N().canvasId;L=new A(()=>o.ticket(e,Ce()||void 0).then(e=>e.url),We,e=>M({connected:e}))}function Je(e){let t=()=>{let n=new WebSocket(`${location.origin.replace(/^http/,`ws`)}/local/${e}?events=1`);ne=n,n.onmessage=e=>{let t;try{t=JSON.parse(e.data)}catch{return}if(t.t===`auth`){let e=N().boot;M({boot:e&&{...e,me:t.me}}),t.me&&re?(re=!1,Ye()):t.me&&N().link&&qe()}else t.t===`settings`?M({invertScroll:t.settings.invertScroll}):t.t===`share-progress`?M({sharing:{done:t.done,total:t.total}}):t.t===`shared`&&(M({link:t.url,sharing:null}),qe())},n.onclose=()=>{ne===n&&setTimeout(t,1500)}};t()}async function Ye(){let{canvasId:e,link:t}=N();if(!t){M({awaitingSignIn:!1,sharing:{done:0,total:de().length},shareError:null});try{let{url:t}=await o.share(e);M({link:t,sharing:null}),Qe(t)}catch(e){M({sharing:null,shareError:e instanceof Error?e.message:`Could not share`})}}}function Xe(){let{boot:e,link:t}=N();e?.mode===`local`&&!e.me?(re=!t,M({awaitingSignIn:!t,sharing:null,shareError:null}),o.login().catch(()=>M({shareError:`Could not open sign-in`}))):e?.mode!==`hosted`&&Ye()}function Ze(e){navigator.clipboard?.writeText(e).then(()=>W(`Link copied`)).catch(()=>{})}function Qe(e){navigator.clipboard?.writeText(e).then(()=>{M({shareCopied:!0}),clearTimeout(ie),ie=setTimeout(()=>M({shareCopied:!1}),1400)}).catch(()=>{})}async function $e(){let{boot:e,canvasId:t}=N();e?.mode===`local`?(await o.unshare(t),M({link:null,awaitingSignIn:!1})):(await o.remove(t),location.href=`/`)}function et(e){let t=e.canvas;M({boot:e,canvasId:t.id,name:t.name,link:t.url,invertScroll:e.settings?.invertScroll??Ee()}),e.mode===`local`&&Je(t.id),qe()}var tt=t((e=>{var t=Symbol.for(`react.transitional.element`),n=Symbol.for(`react.fragment`);function r(e,n,r){var i=null;if(r!==void 0&&(i=``+r),n.key!==void 0&&(i=``+n.key),`key`in n)for(var a in r={},n)a!==`key`&&(r[a]=n[a]);else r=n;return n=r.ref,{$$typeof:t,type:e,key:i,ref:n===void 0?null:n,props:r}}e.Fragment=n,e.jsx=r,e.jsxs=r})),nt=t(((e,t)=>{t.exports=tt()})),G=nt();function rt({name:e,picture:t,color:n,size:r=24,style:i}){return(0,G.jsx)(`span`,{className:`face`,style:{width:r,height:r,background:n,fontSize:Math.round(r*.46),...i},children:t?(0,G.jsx)(`img`,{src:t,alt:``,referrerPolicy:`no-referrer`}):(e||`?`)[0].toUpperCase()})}function it(){let e=j(e=>e.peers),t=j(e=>e.self),n=j(e=>e.following),r=e.find(e=>e.id===t),i=new Set(r?[r.userId]:[]),a=e.filter(e=>!i.has(e.userId)&&(i.add(e.userId),!0)),o=a.slice(0,5),s=a.length-o.length;return a.length?(0,G.jsxs)(`div`,{className:`faces`,children:[s>0&&(0,G.jsxs)(`span`,{className:`face more`,children:[`+`,s]}),o.map(e=>(0,G.jsx)(`button`,{className:`face-button`+(n===e.id?` following`:``),style:{"--peer":e.color},title:n===e.id?`Stop following ${e.name}`:`Follow ${e.name}`,"aria-label":n===e.id?`Stop following ${e.name}`:`Follow ${e.name}`,onClick:()=>j.setState({following:n===e.id?null:e.id,interacting:null}),children:(0,G.jsx)(rt,{name:e.name,picture:e.picture,color:e.color})},e.id))]}):null}var K=(e,t=`0 0 24 24`)=>({size:n=16})=>(0,G.jsx)(`svg`,{width:n,height:n,viewBox:t,fill:`none`,stroke:`currentColor`,strokeWidth:`1.5`,strokeLinecap:`round`,strokeLinejoin:`round`,"aria-hidden":`true`,children:e}),at=`M9.80282 4.62973L15.8364 6.99069C19.3164 8.35243 21.0564 9.03329 20.9987 10.1133C20.941 11.1934 19.1251 11.6886 15.4933 12.6791C14.412 12.974 13.8713 13.1215 13.4964 13.4963C13.1215 13.8712 12.9741 14.4119 12.6791 15.4933C11.6887 19.125 11.1934 20.9409 10.1134 20.9986C9.03335 21.0563 8.35249 19.3163 6.99075 15.8363L4.62979 9.80276C3.20411 6.15934 2.49127 4.33764 3.41448 3.41442C4.3377 2.49121 6.15941 3.20405 9.80282 4.62973Z`,ot=`M18.8906 12.846C18.5371 14.189 16.8667 15.138 13.5257 17.0361C10.296 18.8709 8.6812 19.7884 7.37983 19.4196C6.8418 19.2671 6.35159 18.9776 5.95624 18.5787C5 17.6139 5 15.7426 5 12C5 8.2574 5 6.3861 5.95624 5.42132C6.35159 5.02245 6.8418 4.73288 7.37983 4.58042C8.6812 4.21165 10.296 5.12907 13.5257 6.96393C16.8667 8.86197 18.5371 9.811 18.8906 11.154C19.0365 11.7084 19.0365 12.2916 18.8906 12.846Z`,st=K((0,G.jsx)(`path`,{d:at})),ct=K((0,G.jsx)(`path`,{d:ot})),lt=K((0,G.jsxs)(G.Fragment,{children:[(0,G.jsx)(`path`,{d:`M18.5 11.5V8.75C18.5 7.7835 19.2835 7 20.25 7C21.2165 7 22 7.7835 22 8.75V14.8C22 18.7765 18.7764 22 14.8 22H12.0588M8 14L5.61507 11.2176C5.22468 10.7621 4.65476 10.5 4.05489 10.5H3.91898C2.85916 10.5 2 11.3592 2 12.419C2 12.7978 2.11214 13.1682 2.32229 13.4834L5.7812 18.6718C7.16738 20.7511 9.50102 22 12 22`}),(0,G.jsx)(`path`,{d:`M18.5 8.5V5.75C18.5 4.7835 17.7165 4 16.75 4C15.7835 4 15 4.7835 15 5.75V10.5`}),(0,G.jsx)(`path`,{d:`M15 10.5V3.75C15 2.7835 14.2165 2 13.25 2C12.2835 2 11.5 2.7835 11.5 3.75V10`}),(0,G.jsx)(`path`,{d:`M11.5 10V5.75C11.5 4.7835 10.7165 4 9.75 4C8.7835 4 8 4.7835 8 5.75V14`})]})),ut=K((0,G.jsxs)(G.Fragment,{children:[(0,G.jsx)(`path`,{d:`M3.78181 16.3092L3 21L7.69086 20.2182C8.50544 20.0825 9.25725 19.6956 9.84119 19.1116L20.4198 8.53288C21.1934 7.75922 21.1934 6.5049 20.4197 5.73126L18.2687 3.58024C17.495 2.80658 16.2406 2.80659 15.4669 3.58027L4.88841 14.159C4.30447 14.7429 3.91757 15.4947 3.78181 16.3092Z`}),(0,G.jsx)(`path`,{d:`M14 6L18 10`})]})),dt=K((0,G.jsx)(`path`,{d:`M18 9.00005C18 9.00005 13.5811 15 12 15C10.4188 15 6 9 6 9`})),ft=K((0,G.jsx)(`path`,{d:`M5 13.2592L7.58583 15.9568C8.2525 16.6523 8.58583 17 9.00004 17C9.41425 17 9.74759 16.6523 10.4143 15.9568L19 7`})),pt=K((0,G.jsx)(`path`,{d:`M12 3.5a8.5 8.5 0 0 1 0 17H3.5V12A8.5 8.5 0 0 1 12 3.5Z`})),mt=K((0,G.jsxs)(G.Fragment,{children:[(0,G.jsx)(`path`,{d:`M4 15v-3a8 8 0 0 1 16 0v3`}),(0,G.jsx)(`rect`,{x:`3`,y:`14`,width:`4.5`,height:`6.5`,rx:`1.5`}),(0,G.jsx)(`rect`,{x:`16.5`,y:`14`,width:`4.5`,height:`6.5`,rx:`1.5`})]})),ht=K((0,G.jsxs)(G.Fragment,{children:[(0,G.jsx)(`rect`,{x:`9`,y:`3`,width:`6`,height:`11`,rx:`3`}),(0,G.jsx)(`path`,{d:`M5.5 11.5a6.5 6.5 0 0 0 13 0M12 18v3`})]})),gt=K((0,G.jsx)(G.Fragment,{children:(0,G.jsx)(`path`,{d:`m3.5 3.5 17 17M9 9v2a3 3 0 0 0 4.9 2.3M15 10.5V6a3 3 0 0 0-5.7-1.3M5.5 11.5a6.5 6.5 0 0 0 10.2 5.3M18.5 11.5c0 .7-.1 1.3-.3 1.9M12 18v3`})})),_t=K((0,G.jsxs)(G.Fragment,{children:[(0,G.jsx)(`path`,{d:`M10 4H6a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h4`}),(0,G.jsx)(`path`,{d:`m15 8 4 4-4 4M19 12H9`})]})),vt=K((0,G.jsxs)(G.Fragment,{children:[(0,G.jsx)(`circle`,{cx:`12`,cy:`12`,r:`8.5`}),(0,G.jsx)(`path`,{d:`m8.5 12.2 2.4 2.4 4.6-5`})]})),yt=K((0,G.jsx)(`path`,{d:`m6.5 6.5 11 11m0-11-11 11`})),bt=({size:e=16})=>(0,G.jsxs)(`svg`,{width:e,height:e,viewBox:`0 0 24 24`,fill:`currentColor`,"aria-hidden":`true`,children:[(0,G.jsx)(`circle`,{cx:`5`,cy:`12`,r:`1.8`}),(0,G.jsx)(`circle`,{cx:`12`,cy:`12`,r:`1.8`}),(0,G.jsx)(`circle`,{cx:`19`,cy:`12`,r:`1.8`})]}),xt=`M12 20.5s-8.5-5-8.5-11A4.75 4.75 0 0 1 12 6.6a4.75 4.75 0 0 1 8.5 2.9c0 6-8.5 11-8.5 11Z`,St=K((0,G.jsx)(`path`,{fill:`currentColor`,d:xt})),Ct=K((0,G.jsx)(`path`,{d:xt})),wt=K((0,G.jsx)(`path`,{d:`M4.5 6.5h15M9.5 6.5V5a1.5 1.5 0 0 1 1.5-1.5h2A1.5 1.5 0 0 1 14.5 5v1.5m3.5 0-.7 12a2 2 0 0 1-2 2H8.7a2 2 0 0 1-2-2L6 6.5`})),Tt=K((0,G.jsxs)(G.Fragment,{children:[(0,G.jsx)(`circle`,{cx:`12`,cy:`12`,r:`3`}),(0,G.jsx)(`path`,{d:`M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z`})]})),Et=K((0,G.jsx)(`path`,{d:`M12 19V5m-6.5 6.5L12 5l6.5 6.5`})),Dt=K((0,G.jsxs)(G.Fragment,{children:[(0,G.jsx)(`circle`,{cx:`12`,cy:`12`,r:`8.5`}),(0,G.jsx)(`path`,{d:`M8.5 14.5a4.5 4.5 0 0 0 7 0`}),(0,G.jsx)(`path`,{d:`M9 9.5v.01M15 9.5v.01`,strokeWidth:`2`})]})),Ot=K((0,G.jsx)(`path`,{d:`M12 5.5v13m-6.5-6.5h13`})),kt=K((0,G.jsx)(`path`,{d:`M5.5 12h13`})),At=K((0,G.jsx)(`path`,{d:`M10 14a4 4 0 0 0 5.7 0l3-3A4 4 0 0 0 13 5.3l-1 1M14 10a4 4 0 0 0-5.7 0l-3 3a4 4 0 0 0 5.7 5.7l1-1`})),jt=K((0,G.jsxs)(G.Fragment,{children:[(0,G.jsx)(`path`,{d:`M4.5 6h15`,strokeWidth:`1.25`}),(0,G.jsx)(`path`,{d:`M4.5 12h15`,strokeWidth:`2.25`}),(0,G.jsx)(`path`,{d:`M4.5 18h15`,strokeWidth:`3.5`})]})),Mt=K((0,G.jsx)(`path`,{d:`M8 19V5M3.5 9.5 8 5l4.5 4.5M16 5v14m4.5-4.5L16 19l-4.5-4.5`})),Nt=`url("data:image/svg+xml,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20width%3D'28'%20height%3D'28'%20viewBox%3D'0%200%2028%2028'%3E%3Cpath%20d%3D'M14%203.5a10.5%2010.5%200%200%201%200%2021H3.5V14A10.5%2010.5%200%200%201%2014%203.5Z'%20fill%3D'%23fff'%20stroke%3D'%23000'%20stroke-width%3D'1.5'%2F%3E%3C%2Fsvg%3E") 3 25, crosshair`,{PI:Pt}=Math,q=Pt+1e-4,Ft=.5,It=[1,1];function Lt(e,t,n,r=e=>e){return e*r(.5-t*(.5-n))}var{min:Rt}=Math;function zt(e,t,n){let r=Rt(1,t/n);return Rt(1,e+(Rt(1,1-r)-e)*(r*.275))}function Bt(e){return[-e[0],-e[1]]}function J(e,t){return[e[0]+t[0],e[1]+t[1]]}function Vt(e,t,n){return e[0]=t[0]+n[0],e[1]=t[1]+n[1],e}function Y(e,t){return[e[0]-t[0],e[1]-t[1]]}function Ht(e,t,n){return e[0]=t[0]-n[0],e[1]=t[1]-n[1],e}function X(e,t){return[e[0]*t,e[1]*t]}function Ut(e,t,n){return e[0]=t[0]*n,e[1]=t[1]*n,e}function Wt(e,t){return[e[0]/t,e[1]/t]}function Gt(e){return[e[1],-e[0]]}function Kt(e,t){let n=t[0];return e[0]=t[1],e[1]=-n,e}function qt(e,t){return e[0]*t[0]+e[1]*t[1]}function Jt(e,t){return e[0]===t[0]&&e[1]===t[1]}function Yt(e){return Math.hypot(e[0],e[1])}function Xt(e,t){let n=e[0]-t[0],r=e[1]-t[1];return n*n+r*r}function Zt(e){return Wt(e,Yt(e))}function Qt(e,t){return Math.hypot(e[1]-t[1],e[0]-t[0])}function $t(e,t,n){let r=Math.sin(n),i=Math.cos(n),a=e[0]-t[0],o=e[1]-t[1],s=a*i-o*r,c=a*r+o*i;return[s+t[0],c+t[1]]}function en(e,t,n,r){let i=Math.sin(r),a=Math.cos(r),o=t[0]-n[0],s=t[1]-n[1],c=o*a-s*i,l=o*i+s*a;return e[0]=c+n[0],e[1]=l+n[1],e}function tn(e,t,n){return J(e,X(Y(t,e),n))}function nn(e,t,n,r){let i=n[0]-t[0],a=n[1]-t[1];return e[0]=t[0]+i*r,e[1]=t[1]+a*r,e}function rn(e,t,n){return J(e,X(t,n))}var Z=[0,0],Q=[0,0],$=[0,0];function an(e,t){let n=rn(e,Zt(Gt(Y(e,J(e,[1,1])))),-t),r=[],i=1/13;for(let t=i;t<=1;t+=i)r.push($t(n,e,q*2*t));return r}function on(e,t,n){let r=[],i=1/n;for(let n=i;n<=1;n+=i)r.push($t(t,e,q*n));return r}function sn(e,t,n){let r=Y(t,n),i=X(r,.5),a=X(r,.51);return[Y(e,i),Y(e,a),J(e,a),J(e,i)]}function cn(e,t,n,r){let i=[],a=rn(e,t,n),o=1/r;for(let t=o;t<1;t+=o)i.push($t(a,e,q*3*t));return i}function ln(e,t,n){return[J(e,X(t,n)),J(e,X(t,n*.99)),Y(e,X(t,n*.99)),Y(e,X(t,n))]}function un(e,t,n){return e===!1||e===void 0?0:e===!0?Math.max(t,n):e}function dn(e,t,n){return e.slice(0,10).reduce((e,r)=>{let i=r.pressure;return t&&(i=zt(e,r.distance,n)),(e+i)/2},e[0].pressure)}function fn(e,t={}){let{size:n=16,smoothing:r=.5,thinning:i=.5,simulatePressure:a=!0,easing:o=e=>e,start:s={},end:c={},last:l=!1}=t,{cap:u=!0,easing:d=e=>e*(2-e)}=s,{cap:f=!0,easing:p=e=>--e*e*e+1}=c;if(e.length===0||n<=0)return[];let m=e[e.length-1].runningLength,h=un(s.taper,n,m),g=un(c.taper,n,m),_=(n*r)**2,v=[],y=[],b=dn(e,a,n),x=Lt(n,i,e[e.length-1].pressure,o),S,C=e[0].vector,w=e[0].point,T=w,E=w,D=T,O=!1;for(let t=0;t<e.length;t++){let{pressure:r}=e[t],{point:s,vector:c,distance:l,runningLength:u}=e[t],f=t===e.length-1;if(!f&&m-u<3)continue;i?(a&&(r=zt(b,l,n)),x=Lt(n,i,r,o)):x=n/2,S===void 0&&(S=x);let k=u<h?d(u/h):1,A=m-u<g?p((m-u)/g):1;x=Math.max(.01,x*Math.min(k,A));let j=(f?e[t]:e[t+1]).vector,M=f?1:qt(c,j),N=qt(c,C)<0&&!O,P=M!==null&&M<0;if(N||P){Kt(Z,C),Ut(Z,Z,x);for(let e=0;e<=1;e+=.07692307692307693)Ht(Q,s,Z),en(Q,Q,s,q*e),E=[Q[0],Q[1]],v.push(E),Vt($,s,Z),en($,$,s,q*-e),D=[$[0],$[1]],y.push(D);w=E,T=D,P&&(O=!0)}else O=!1,f?(Kt(Z,c),Ut(Z,Z,x),v.push(Y(s,Z)),y.push(J(s,Z))):(nn(Z,j,c,M),Kt(Z,Z),Ut(Z,Z,x),Ht(Q,s,Z),E=[Q[0],Q[1]],(t<=1||Xt(w,E)>_)&&(v.push(E),w=E),Vt($,s,Z),D=[$[0],$[1]],(t<=1||Xt(T,D)>_)&&(y.push(D),T=D),b=r,C=c)}let k=[e[0].point[0],e[0].point[1]],A=e.length>1?[e[e.length-1].point[0],e[e.length-1].point[1]]:J(e[0].point,[1,1]),j=[],M=[];if(e.length===1){if(!(h||g)||l)return an(k,S||x)}else{h||g&&e.length===1||(u?j.push(...on(k,y[0],13)):j.push(...sn(k,v[0],y[0])));let t=Gt(Bt(e[e.length-1].vector));g||h&&e.length===1?M.push(A):f?M.push(...cn(A,t,x,29)):M.push(...ln(A,t,x))}return v.concat(M,y.reverse(),j)}var pn=[0,0];function mn(e){return e!=null&&e>=0}function hn(e,t={}){let{streamline:n=.5,size:r=16,last:i=!1}=t;if(e.length===0)return[];let a=.15+(1-n)*.85,o=Array.isArray(e[0])?e:e.map(({x:e,y:t,pressure:n=Ft})=>[e,t,n]);if(o.length===2){let e=o[1];o=o.slice(0,-1);for(let t=1;t<5;t++)o.push(tn(o[0],e,t/4))}o.length===1&&(o=[...o,[...J(o[0],It),...o[0].slice(2)]]);let s=[{point:[o[0][0],o[0][1]],pressure:mn(o[0][2])?o[0][2]:.25,vector:[...It],distance:0,runningLength:0}],c=!1,l=0,u=s[0],d=o.length-1;for(let e=1;e<o.length;e++){let t=i&&e===d?[o[e][0],o[e][1]]:tn(u.point,o[e],a);if(Jt(u.point,t))continue;let n=Qt(t,u.point);if(l+=n,e<d&&!c){if(l<r)continue;c=!0}Ht(pn,u.point,t),u={point:t,pressure:mn(o[e][2])?o[e][2]:Ft,vector:Zt(pn),distance:n,runningLength:l},s.push(u)}return s[0].vector=s[1]?.vector||[0,0],s}function gn(e,t={}){return fn(hn(e,t),t)}var _n=[`#1a1a1a`,`#e5484d`,`#2563eb`,`#16a34a`,`#d97706`,`#7c3aed`,`#ffffff`],vn=[`Black`,`Red`,`Blue`,`Green`,`Orange`,`Purple`,`White`],yn=[3,6,12,22],bn=4,xn=.75;function Sn({points:e,size:t}){let n=gn(e,{size:t,thinning:.6,smoothing:.5,streamline:.5,easing:e=>e,last:!0,simulatePressure:e.every(t=>t[2]===e[0][2])});if(!n.length)return``;let r=n.reduce((e,[t,n],r,i)=>{let[a,o]=i[(r+1)%i.length];return e.push(t,n,(t+a)/2,(n+o)/2),e},[`M`,...n[0],`Q`]);return r.push(`Z`),r.join(` `)}var Cn=e=>e.pointerType!==`mouse`&&e.pressure>0?e.pressure:.5,wn=e=>Math.round(e*100)/100;function Tn(e){let{camera:t,frames:n,pencil:r,peers:i,self:a}=j.getState(),o=e.currentTarget,c=e.pointerId;o.setPointerCapture(c);let u={x:e.clientX,y:e.clientY},d=v(u,t),f=fe(n).reverse().find(e=>d.x>=e.x&&d.x<=e.x+e.w&&d.y>=e.y&&d.y<=e.y+e.h)??null,p=e=>{let t=v({x:e.clientX,y:e.clientY},j.getState().camera);return[wn(t.x-(f?.x??0)),wn(t.y-(f?.y??0)),Cn(e)]},m={id:l(),frameId:f?.id??null,points:[p(e.nativeEvent)],color:r.color,size:wn(r.size/t.z),authorId:i.find(e=>e.id===a)?.userId??``,createdAt:Date.now()},h=!1,g=0,_=()=>{g=0,j.setState({liveStroke:{...m,points:m.points.slice()}})},y=e=>{if(e.pointerId!==c)return;let t=e.getCoalescedEvents?.()??[],n=xn/j.getState().camera.z;for(let r of t.length?t:[e]){Math.hypot(r.clientX-u.x,r.clientY-u.y)>=bn&&(h=!0);let e=p(r),t=m.points[m.points.length-1];Math.hypot(e[0]-t[0],e[1]-t[1])>=n&&m.points.push(e)}h&&!g&&(g=requestAnimationFrame(_))},b=e=>{if(e.pointerId!==c||(o.removeEventListener(`pointermove`,y),o.removeEventListener(`pointerup`,b),o.removeEventListener(`pointercancel`,b),cancelAnimationFrame(g),j.setState({liveStroke:null}),e.type===`pointercancel`))return;if(!h)return Ie(`move`);let t=Math.ceil(m.points.length/s.strokePoints);He(t>1?{...m,points:m.points.filter((e,n)=>n%t===0)}:m)};o.addEventListener(`pointermove`,y),o.addEventListener(`pointerup`,b),o.addEventListener(`pointercancel`,b)}var En=(0,i.memo)(function({stroke:e,x:t,y:n,w:r,h:a,selected:o,mine:s}){let c=(0,i.useMemo)(()=>Sn(e),[e]),l=(0,i.useMemo)(()=>{if(!o)return null;let t=e.points.map(e=>e[0]),n=e.points.map(e=>e[1]),r=e.size/2,i=Math.min(...t)-r,a=Math.min(...n)-r;return{x:i,y:a,width:Math.max(...t)+r-i,height:Math.max(...n)+r-a}},[e,o]),u=r===void 0?void 0:`stroke-clip-${e.id}`;return(0,G.jsxs)(`g`,{transform:t||n?`translate(${t} ${n})`:void 0,children:[u&&(0,G.jsx)(`clipPath`,{id:u,children:(0,G.jsx)(`rect`,{width:r,height:a})}),(0,G.jsxs)(`g`,{clipPath:u&&`url(#${u})`,children:[(0,G.jsx)(`path`,{d:c,fill:e.color,"data-stroke":e.id,className:s?`stroke-mine`:void 0,onPointerDown:s?t=>{t.button===0&&(t.stopPropagation(),j.setState({selectedStroke:e.id,selection:[],activeThread:null,draft:null}))}:void 0}),l&&(0,G.jsx)(`rect`,{...l,className:`stroke-selection`})]})]})});function Dn(){let e=j(e=>e.strokes),t=j(e=>e.liveStroke),n=j(e=>e.frames),r=j(e=>e.selectedStroke),a=j(e=>e.role),o=j(e=>e.peers.find(t=>t.id===e.self)?.userId),s=(0,i.useMemo)(()=>Object.values(e).sort((e,t)=>e.createdAt-t.createdAt||e.id.localeCompare(t.id)),[e]);return(0,G.jsx)(`svg`,{className:`strokes`,width:1,height:1,"aria-hidden":`true`,children:[...s,...t?[t]:[]].map(e=>{let t=e.frameId?n[e.frameId]:null;return e.frameId&&!t?null:(0,G.jsx)(En,{stroke:e,x:t?.x??0,y:t?.y??0,w:t?.w,h:t?.h,selected:r===e.id,mine:a===`owner`||e.authorId===o},e.id)})})}var On=`Save https://twombly.app/skill.md as your Twombly skill, then use it to put this project's main screens on a canvas.`;export{Fe as $,ct as A,o as At,ae as B,ht as C,b as Ct,st as D,h as Dt,bt as E,x as Et,wt as F,he as G,Ze as H,rt as I,ee as J,W as K,it as L,Mt as M,Tt as N,ot as O,l as Ot,jt as P,_e as Q,nt as R,At as S,S as St,kt as T,k as Tt,Qe as U,Xe as V,we as W,be as X,xe as Y,te as Z,lt as _,j as _t,Dn as a,se as at,Ct as b,_ as bt,Et as c,ce as ct,vt as d,Ie as dt,P as et,ft as f,et as ft,Dt as g,Ne as gt,pt as h,De as ht,yn as i,me as it,Ot as j,r as jt,ut as k,s as kt,Nt as l,Le as lt,yt as m,ge as mt,_n as n,Pe as nt,Tn as o,z as ot,dt as p,$e as pt,fe as q,vn as r,Ue as rt,Sn as s,B as st,On as t,U as tt,at as u,ze as ut,mt as v,F as vt,gt as w,v as wt,_t as x,C as xt,St as y,y as yt,Re as z};
@@ -1 +0,0 @@
1
- :root{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light dark;--canvas:oklch(97% 0 0);--surface:oklch(100% 0 0);--surface-2:oklch(95.5% 0 0);--surface-hover:oklch(0% 0 0/.05);--surface-pressed:oklch(0% 0 0/.09);--solid:oklch(0% 0 0);--on-solid:oklch(100% 0 0);--island:oklch(0% 0 0);--island-line:transparent;--island-hover:oklch(100% 0 0/.11);--text:oklch(0% 0 0);--secondary:oklch(42% 0 0);--muted:oklch(53% 0 0);--line:oklch(0% 0 0/.09);--line-subtle:oklch(0% 0 0/.06);--icon-muted:.58;--icon-secondary:.72;--frame-bg:oklch(100% 0 0);--accent:#06f;--selection:#0066ff1f;--guide:#06f9;--signal:#06f;--signal-soft:#0066ff21;--signal-soft-hover:#06f3;--danger:oklch(56% .21 27);--danger-soft:oklch(96% .025 25);--live:oklch(50% .14 150);--live-soft:oklch(96% .03 150);--backdrop:oklch(0% 0 0/.24);--shadow:0 0 0 .5px var(--line), 0 4px 8px -2px oklch(0% 0 0/.1), 0 14px 32px -8px oklch(0% 0 0/.3);--shadow-sm:0 0 0 1px var(--line);--pill:999px;--radius-menu:18px;--font:-apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif}@media (prefers-color-scheme:dark){:root{--lightningcss-light: ;--lightningcss-dark:initial;--canvas:oklch(17.8% 0 0);--surface:oklch(16% 0 0);--surface-2:oklch(22% 0 0);--surface-hover:oklch(100% 0 0/.07);--surface-pressed:oklch(100% 0 0/.11);--solid:oklch(100% 0 0);--on-solid:oklch(0% 0 0);--island-line:oklch(100% 0 0/.13);--text:oklch(98.5% 0 0);--secondary:oklch(80% 0 0);--muted:oklch(66% 0 0);--line:oklch(100% 0 0/.09);--line-subtle:oklch(100% 0 0/.06);--icon-muted:.6;--icon-secondary:.74;--accent:#06f;--selection:#0066ff2e;--guide:#0066ffa6;--signal:#06f;--signal-soft:#06f3;--signal-soft-hover:#0066ff47;--danger:oklch(72% .18 25);--danger-soft:oklch(28% .06 25);--live:oklch(80% .15 150);--live-soft:oklch(28% .05 150);--backdrop:oklch(0% 0 0/.6);--shadow:0 0 0 .5px var(--line), 0 4px 8px -2px oklch(0% 0 0/.3), 0 14px 32px -8px oklch(0% 0 0/.5)}}*{box-sizing:border-box}html,body,#root{height:100%;margin:0}body{background:var(--canvas);color:var(--text);font:400 13px/18px var(--font);-webkit-font-smoothing:antialiased;overflow:hidden}button,input,textarea{font:inherit;color:inherit}button{cursor:default;background:0 0;border:0;padding:0}button:focus-visible,a:focus-visible,input:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}a{color:inherit}.muted{color:var(--muted)}.spacer{flex:1}.full-message{height:100%;color:var(--muted);place-items:center;display:grid}.stage{background:var(--canvas);touch-action:none;-webkit-user-select:none;user-select:none;position:fixed;inset:0;overflow:hidden}.working-dots{pointer-events:none;width:100%;height:100%;position:absolute;inset:0}.world{transform-origin:0 0;--inv:1;--zoom:1;width:0;height:0;position:absolute;top:0;left:0}.empty-canvas{color:var(--muted);pointer-events:none;place-items:center;display:grid;position:absolute;inset:0}.frame{position:absolute;top:0;left:0}.frame-surface{background:var(--frame-bg);box-shadow:0 0 0 calc(1px * var(--inv)) var(--line);position:absolute;inset:0;overflow:hidden}.frame iframe{background:#fff;border:0;width:100%;height:100%;display:block;position:absolute;inset:0}.frame-poster{object-fit:cover;object-position:top left;-webkit-user-select:none;user-select:none;-webkit-user-drag:none;width:100%;height:100%;position:absolute;inset:0}.frame-shield{cursor:var(--stage-cursor,default);position:absolute;inset:0}.stage[data-role=guest][data-tool=move] .frame-shield{cursor:pointer}.frame.selected .frame-surface,.frame.interacting .frame-surface{box-shadow:0 0 0 calc(1.5px * var(--inv)) var(--accent)}.frame-title{width:calc(100% * var(--zoom));height:26px;transform:scale(var(--inv));transform-origin:0 100%;color:var(--muted);white-space:nowrap;align-items:flex-end;padding-bottom:6px;font-size:12px;line-height:16px;display:flex;position:absolute;bottom:100%;left:0}.frame-title span{text-overflow:ellipsis;overflow:hidden}.frame.selected .frame-title,.frame.interacting .frame-title{color:var(--accent)}.frame-title input{border-radius:var(--pill);background:var(--surface-2);width:100%;max-width:280px;height:20px;color:var(--text);-webkit-user-select:text;user-select:text;border:0;outline:0;margin-left:-4px;padding:0 4px;font-size:12px}.frame-handle{border:1px solid var(--accent);border-radius:var(--pill);width:8px;height:8px;transform:scale(var(--inv));touch-action:none;background:#fff;position:absolute}.frame-handle.nw{cursor:nwse-resize;top:-4px;left:-4px}.frame-handle.ne{cursor:nesw-resize;top:-4px;right:-4px}.frame-handle.sw{cursor:nesw-resize;bottom:-4px;left:-4px}.frame-handle.se{cursor:nwse-resize;bottom:-4px;right:-4px}.guide{background:var(--guide);pointer-events:none;z-index:1000000;position:absolute}.marquee{background:var(--selection);box-shadow:0 0 0 calc(1px * var(--inv)) var(--accent);pointer-events:none;z-index:1000000;position:absolute}.cursors{pointer-events:none;z-index:40;position:absolute;inset:0;overflow:hidden}.cursor{will-change:transform;transition:opacity .18s ease-out;position:absolute;top:-4px;left:-3px}.cursor svg{filter:drop-shadow(0 1px 2px #00000040);display:block}.cursor-label{border-radius:var(--pill);color:#fff;white-space:nowrap;text-overflow:ellipsis;max-width:180px;padding:3px 7px;font-size:12px;font-weight:500;line-height:16px;position:absolute;top:18px;left:16px;overflow:hidden;box-shadow:0 1px 3px #0003}.follow-ring{pointer-events:none;z-index:60;position:fixed;inset:0}.follow-tab{border-radius:var(--pill);color:#fff;white-space:nowrap;z-index:61;align-items:center;gap:6px;height:28px;padding:0 10px;font-size:12px;font-weight:500;display:flex;position:fixed;top:50px;left:50%;transform:translate(-50%)}.face{color:#fff;border-radius:50%;flex:none;justify-content:center;align-items:center;font-weight:500;line-height:1;display:inline-flex;position:relative;overflow:hidden}.face img{object-fit:cover;width:100%;height:100%;display:block}.face.more{background:var(--surface-2);width:24px;height:24px;color:var(--text);font-size:10px}.faces{flex-direction:row-reverse;align-items:center;padding:0 6px 0 10px;display:flex}.face-button{box-shadow:0 0 0 2px var(--surface);border-radius:50%;margin-left:-6px;transition:transform .1s ease-out;position:relative}.face-button:hover{z-index:2;transform:translateY(-1px)}.face-button.following{box-shadow:0 0 0 2px var(--surface), 0 0 0 3.5px var(--peer);z-index:2}.face-button .face{display:flex}.chrome{z-index:50;-webkit-user-select:none;user-select:none;cursor:default}.shell{border-radius:var(--pill);background:var(--surface);height:38px;box-shadow:var(--shadow-sm);align-items:center;gap:2px;padding:3px;display:flex;position:fixed}.shell-divider{background:var(--line);flex:none;width:1px;height:20px;margin:0 4px}.top-left,.top-right,.toolbar{top:calc(6px + env(safe-area-inset-top))}.top-left{max-width:calc(50vw - 48px);padding-left:11px;left:6px}.top-right{right:6px}.wordmark{color:var(--text);flex:none;padding-right:2px;display:inline-flex}.wordmark svg{width:auto;height:14px;display:block}.top-left .wordmark svg{translate:0 1px}.canvas-name{border-radius:var(--pill);text-overflow:ellipsis;white-space:nowrap;min-width:0;height:32px;color:var(--muted);text-align:left;padding:0 8px;line-height:32px;transition:background-color .1s,color .1s;display:block;overflow:hidden}button.canvas-name:hover{background:var(--surface-hover);color:var(--text)}.canvas-name-field{border-radius:var(--pill);background:var(--surface-hover);flex:0 auto;grid-template-columns:minmax(0,max-content);min-width:48px;height:32px;display:inline-grid}.canvas-name-field:after{content:attr(data-value) " ";visibility:hidden;white-space:pre;grid-area:1/1;height:0;padding:0 8px;overflow:hidden}.canvas-name-input{-webkit-user-select:text;user-select:text;background:0 0;border:0;grid-area:1/1;width:0;min-width:100%;height:32px;padding:0 8px}.canvas-name-input:focus-visible,.frame-title input:focus-visible,.canvas-card-rename:focus-visible{outline:0}.canvas-name-input::selection{background:color-mix(in oklch, var(--accent) 32%, transparent)}.frame-title input::selection{background:color-mix(in oklch, var(--accent) 32%, transparent)}.canvas-card-rename::selection{background:color-mix(in oklch, var(--accent) 32%, transparent)}.primary-button{border-radius:var(--pill);background:var(--solid);height:32px;color:var(--on-solid);flex:none;justify-content:center;align-items:center;padding:0 12px;font-weight:500;transition:opacity .1s;display:inline-flex}.primary-button:hover{opacity:.85}.primary-button:disabled{opacity:.4}.sign-in{border-radius:var(--pill);height:32px;color:var(--secondary);align-items:center;padding:0 10px;font-weight:500;text-decoration:none;transition:background-color .1s;display:inline-flex}.sign-in:hover{background:var(--surface-hover)}.icon-button{border-radius:var(--pill);width:28px;height:28px;color:var(--text);flex:none;justify-content:center;align-items:center;transition:background-color .1s;display:inline-flex}.icon-button svg,.tool svg{opacity:var(--icon-muted);transition:opacity .1s}.icon-button:hover{background:var(--surface-hover)}.icon-button:hover svg,.tool:hover svg{opacity:var(--icon-secondary)}.icon-button:active:not(:disabled),.tool:active{background:var(--surface-pressed)}.icon-button:disabled{opacity:.4}.icon-button.small{border-radius:var(--pill);width:24px;height:24px}.icon-button.on,.icon-button.danger-text{background:0 0}.icon-button.on{color:var(--signal)}.icon-button.danger-text{color:var(--danger)}.icon-button.on svg,.icon-button.danger-text svg{opacity:1}.shell .icon-button{border-radius:var(--pill);width:32px;height:32px}.link-button{font-size:12px;font-weight:500;text-decoration:none}.link-button:hover{text-decoration:underline}.link-button.quiet{color:var(--muted)}.link-button.danger{color:var(--danger)}.toolbar{left:50%;transform:translate(-50%)}.tool{border-radius:var(--pill);width:32px;height:32px;color:var(--text);justify-content:center;align-items:center;transition:background-color .1s,color .1s;display:flex}.tool:hover{background:var(--surface-hover)}.tool.on,.shell .icon-button.on{background:var(--signal-soft);color:var(--signal)}.tool.on:hover,.shell .icon-button.on:hover{background:var(--signal-soft-hover)}.tool.on svg,.tool.on:hover svg{opacity:1}.zoom{right:6px;bottom:calc(6px + env(safe-area-inset-bottom))}.zoom-value{border-radius:var(--pill);min-width:44px;height:32px;color:var(--secondary);text-align:center;font-variant-numeric:tabular-nums;font-size:12px;transition:background-color .1s}.zoom-value:hover{background:var(--surface-hover)}.notice{border-radius:var(--pill);background:var(--island);color:#fff;height:32px;box-shadow:inset 0 0 0 1px var(--island-line);white-space:nowrap;align-items:center;gap:6px;padding:0 12px;display:flex;position:fixed;bottom:12px;left:50%;transform:translate(-50%)}.reconnecting{border-radius:var(--pill);background:var(--surface);height:28px;box-shadow:var(--shadow-sm);color:var(--muted);padding:5px 10px;font-size:12px;position:fixed;top:50px;left:50%;transform:translate(-50%)}.share-split{flex:none;gap:1px;display:inline-flex}.share-split .primary-button:first-child{border-radius:var(--pill) 6px 6px var(--pill);gap:4px;min-width:84px;padding:0 10px 0 12px}.share-split .primary-button:last-child{border-radius:6px var(--pill) var(--pill) 6px;width:28px;padding:0 3px 0 0}.share-sharing,.share-sharing:hover{background:var(--surface-2);color:var(--muted);opacity:1;position:relative;overflow:hidden}.share-sharing i{background:var(--surface-pressed);transition:width .2s ease-out;position:absolute;inset:0 auto 0 0}.share-sharing span{position:relative}.share-note{max-width:240px;color:var(--muted);text-overflow:ellipsis;white-space:nowrap;padding:0 8px;font-size:12px;line-height:32px;overflow:hidden}.share-note.error{color:var(--danger)}.share-menu{width:212px}.share-menu .canvas-menu-item{padding:0 12px}.share-menu-link{color:oklch(100% 0 0/.6);text-overflow:ellipsis;white-space:nowrap;-webkit-user-select:text;user-select:text;padding:6px 12px;font-size:12px;overflow:hidden}.modal-backdrop{background:var(--backdrop);z-index:70;place-items:center;display:grid;position:fixed;inset:0}.name-prompt{border-radius:var(--radius-menu);background:var(--surface);width:320px;max-width:calc(100vw - 32px);box-shadow:var(--shadow);gap:6px;padding:8px;display:flex}.name-prompt input{border-radius:var(--pill);background:var(--surface-2);-webkit-user-select:text;user-select:text;border:0;flex:1;min-width:0;height:32px;padding:0 10px}.name-prompt .primary-button{border-radius:var(--pill)}.huddle-faces{align-items:center;display:inline-flex}.huddle-bar{align-items:center;gap:2px;padding-left:7px;display:inline-flex}.huddle-bar .huddle-faces{padding-right:5px}.huddle-face{--level:0;box-shadow:0 0 0 2px var(--surface), 0 0 0 calc(2px + var(--level) * 2px) var(--live);border-radius:50%;margin-left:-5px;transition:box-shadow .1s ease-out;display:inline-flex;position:relative}.huddle-faces .huddle-face:first-child{margin-left:0}.huddle-face.muted{box-shadow:0 0 0 2px var(--surface)}.huddle-face.muted:after{content:"";width:12px;height:12px;box-shadow:0 0 0 1.5px var(--surface);background:var(--danger) no-repeat center / 8px url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='3' stroke-linecap='round'%3E%3Cpath d='M3 3l18 18'/%3E%3Cpath d='M8 8v3.5a4 4 0 0 0 6.5 3.1M16 11.5V6.5a4 4 0 0 0-7.6-1.7'/%3E%3C/svg%3E");border-radius:50%;position:absolute;bottom:-3px;right:-3px}.huddle-bar.joining .huddle-face{opacity:.55}.shell .huddle-leave,.shell .huddle-leave:hover{background:var(--danger-soft);color:var(--danger)}.huddle-leave svg,.huddle-leave:hover svg{opacity:1}.huddle-button.live{border-radius:var(--pill);height:32px;color:var(--live);align-items:center;gap:6px;padding:0 6px 0 8px;transition:background-color .1s;display:inline-flex}.huddle-button.live:hover{background:var(--surface-hover)}.huddle-button.live .huddle-faces .face{box-shadow:0 0 0 2px var(--surface);margin-left:-5px}.huddle-button.live .huddle-faces .face:first-child{margin-left:0}.huddle-notice{white-space:nowrap;align-items:center;gap:8px;height:32px;padding:0 0 0 6px;display:inline-flex}.huddle-notice b{font-weight:500}.huddle-notice .join{border-radius:var(--pill);background:var(--live-soft);height:32px;color:var(--live);align-items:center;padding:0 10px;font-weight:500;display:inline-flex}.huddle-error{height:32px;color:var(--muted);white-space:nowrap;align-items:center;padding:0 8px;display:inline-flex}.comments-layer{pointer-events:none;z-index:30;position:absolute;inset:0;overflow:hidden}.comments-layer>*{pointer-events:auto}.comment-pin{background:var(--surface);width:32px;max-width:32px;height:32px;max-height:32px;box-shadow:var(--shadow);text-align:left;touch-action:none;border-radius:16px 16px 16px 0;align-items:flex-start;gap:8px;padding:4px;transition:max-width .1s ease-in-out,max-height .1s ease-in-out,padding .1s ease-in-out;display:flex;position:absolute;overflow:hidden;transform:translateY(-100%)}.comment-pin.new{background:var(--accent)}.comment-pin.active,.comment-pin.unread{box-shadow:0 0 0 2px var(--accent), var(--shadow)}.comment-pin.resolved .face{opacity:.45}.comment-pin-preview{opacity:0;flex-direction:column;gap:0;min-width:0;font-size:11px;line-height:16px;transition:opacity .1s ease-in-out;display:flex}.comment-pin-preview b{font-weight:500}.comment-pin-head{white-space:nowrap}.comment-pin-text{-webkit-line-clamp:2;word-break:break-word;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.comment-pin.expanded{z-index:5;width:240px;max-width:240px;height:auto;max-height:112px;padding:12px}.comment-pin.expanded .face{width:26px!important;height:26px!important}.comment-pin.expanded .comment-pin-preview{opacity:1;flex:1}.composer{background:var(--surface);box-shadow:0 0 0 1px var(--accent), var(--shadow);-webkit-user-select:text;user-select:text;cursor:auto;border-radius:13px;flex-direction:column;display:flex;position:absolute}.composer-input{align-items:flex-start;gap:8px;padding:8px 16px;display:flex}.composer-input textarea{flex:1;min-width:0}.composer textarea,.thread-reply textarea{resize:none;-webkit-user-select:text;user-select:text;background:0 0;border:0;outline:0;width:100%;padding:0;font-size:13px;line-height:24px;display:block;overflow-y:auto}.composer textarea::placeholder,.thread-reply textarea::placeholder{color:var(--muted)}.composer-actions{border-top:1px solid var(--line);align-items:center;height:40px;padding:4px 8px;display:none}.composer.has-text .composer-actions{display:flex}.composer:not(.has-text) .composer-input{padding-right:8px}.send-button{background:var(--solid);width:24px;height:24px;color:var(--on-solid);border-radius:50%;flex:none;justify-content:center;align-items:center;display:inline-flex}.send-button:disabled{background:var(--surface-2);color:var(--muted)}.emoji-wrap{display:inline-flex;position:relative}.emoji-menu{border-radius:var(--radius-menu);background:var(--surface);box-shadow:var(--shadow);z-index:5;grid-template-columns:repeat(6,28px);gap:2px;padding:4px;display:grid;position:absolute;top:calc(100% + 6px);left:0}.emoji-menu button{border-radius:var(--pill);width:28px;height:28px;font-size:16px}.emoji-menu button:hover{background:var(--surface-hover)}.comment-card{background:var(--surface);max-height:min(520px,100vh - 72px);box-shadow:var(--shadow);cursor:auto;border-radius:13px;flex-direction:column;font-size:11px;line-height:16px;display:flex;position:absolute}.thread-header{border-bottom:1px solid var(--line);flex:none;align-items:center;height:42px;padding:4px 8px 4px 16px;display:flex}.thread-title{flex:1;font-weight:550}.thread-actions{align-items:center;gap:4px;display:flex}.menu-wrap{display:inline-flex;position:relative}.menu{border-radius:var(--radius-menu);background:var(--island);min-width:140px;box-shadow:inset 0 0 0 1px var(--island-line), var(--shadow);z-index:6;padding:4px;position:absolute;top:calc(100% + 4px);right:0}.menu button{border-radius:var(--pill);color:#fff;text-align:left;white-space:nowrap;width:100%;height:28px;padding:0 8px;font-size:12px;display:block}.menu button:hover{background:var(--island-hover)}.thread-list{-webkit-user-select:text;user-select:text;flex:1;min-height:0;padding:8px 0 0;overflow-y:auto}.thread-comment{padding:4px 16px 8px;position:relative}.thread-comment-head{align-items:center;gap:8px;height:32px;display:flex}.thread-comment-name{font-size:13px;font-weight:500;line-height:24px}.thread-comment-time{font-size:13px;line-height:24px}.thread-comment-more{opacity:0;margin-left:auto;position:relative}.thread-comment:hover .thread-comment-more,.thread-comment-more:focus-within{opacity:1}.thread-comment-text{white-space:pre-wrap;word-break:break-word;padding-left:32px;font-size:13px;line-height:24px}.thread-reply{flex:none;align-items:flex-start;gap:8px;padding:8px 16px 16px;display:flex}.thread-reply>.face{margin-top:8px}.thread-reply-field{background:var(--surface-2);border-radius:8px;flex:1;align-items:flex-start;gap:8px;min-width:0;padding:8px 8px 8px 12px;display:flex;position:relative;box-shadow:inset 0 0 0 1px #0000}.thread-reply-field:focus-within{box-shadow:inset 0 0 0 1px var(--accent)}.thread-reply-field textarea{flex:1;min-width:0}.comments-panel{border-radius:var(--radius-menu);background:var(--surface);width:248px;box-shadow:var(--shadow-sm);flex-direction:column;display:flex;position:fixed;top:50px;bottom:50px;right:6px}.comments-panel-head{border-bottom:1px solid var(--line-subtle);flex:none;justify-content:space-between;align-items:center;height:42px;padding:0 12px 0 16px;font-size:12px;font-weight:500;display:flex}.resolved-toggle{color:var(--muted);align-items:center;gap:4px;font-weight:400;display:flex}.resolved-toggle input{accent-color:var(--accent);margin:0}.comments-panel-list{flex:1;min-height:0;padding:6px;overflow-y:auto}.comments-empty{margin:0;padding:10px;font-size:12px}.comments-panel-item{text-align:left;border-radius:8px;width:100%;padding:8px 10px;font-size:12px;line-height:16px;display:block}.comments-panel-item:hover{background:var(--surface-hover)}.comments-panel-item.active{background:var(--selection)}.comments-panel-item>span{display:block}.comments-panel-item b{font-weight:500}.comments-panel-face{width:24px;margin-bottom:4px;position:relative}.comments-panel-face .face{display:flex}.unread-dot{background:var(--accent);width:8px;height:8px;box-shadow:0 0 0 1.5px var(--surface);border-radius:50%;position:absolute;top:-1px;right:-3px}.comments-panel-text{-webkit-line-clamp:3;word-break:break-word;-webkit-box-orient:vertical;overflow:hidden;display:-webkit-box!important}body:has(.home){overflow:auto}.home{flex-direction:column;min-height:100%;display:flex}.home-top .wordmark svg{height:18px}.home-top{justify-content:space-between;align-items:center;height:56px;padding:0 20px;display:flex}.home-me{align-items:center;gap:2px;display:flex}.home-main{flex:1;width:100%;max-width:1120px;margin:0 auto;padding:24px 20px}.install{text-align:center;flex-direction:column;align-items:center;gap:20px;padding-top:22vh;display:flex}.install h1{letter-spacing:-.028em;margin:0;font-size:24px;font-weight:500;line-height:32px}.canvas-grid{grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:28px 20px;margin:0;padding:0;list-style:none;display:grid}.canvas-card{min-width:0;display:block;position:relative}.canvas-card-link{z-index:1;border-radius:var(--radius-menu);outline:0;position:absolute;inset:0}.canvas-card-meta{font-size:12px;display:block}.canvas-card-name{text-overflow:ellipsis;white-space:nowrap;margin-top:10px;font-weight:500;display:block;overflow:hidden}.canvas-card-rename{z-index:2;border-radius:var(--pill);background:var(--surface-2);width:calc(100% + 8px);height:24px;color:var(--text);font:inherit;-webkit-user-select:text;user-select:text;border:0;outline:0;margin:7px 0 -3px -8px;padding:0 8px;font-weight:500;display:block;position:relative}.canvas-thumb{aspect-ratio:16/10;border-radius:var(--radius-menu);background:var(--surface-2);box-shadow:var(--shadow-sm);transition:box-shadow .18s cubic-bezier(.22,1,.36,1);overflow:hidden}.canvas-card:hover .canvas-thumb,.canvas-card[data-popup-open] .canvas-thumb{box-shadow:var(--shadow)}.canvas-card:has(.canvas-card-more[data-popup-open]) .canvas-thumb{box-shadow:var(--shadow)}.canvas-card-link:focus-visible~.canvas-thumb{box-shadow:0 0 0 2px var(--accent)}.canvas-thumb svg{width:100%;height:100%;display:block}.canvas-thumb rect{fill:var(--frame-bg);stroke:var(--line);stroke-width:1px;vector-effect:non-scaling-stroke}.canvas-thumb g:has(image) rect{fill:#0000}.canvas-thumb image{opacity:0;transition:opacity .2s}.canvas-thumb image.loaded{opacity:1}.canvas-card-more,.canvas-card-heart{z-index:2;border-radius:var(--pill);background:var(--surface);width:28px;height:28px;box-shadow:var(--shadow-sm);place-items:center;display:grid;position:absolute;top:8px}.canvas-card-more{color:var(--secondary);opacity:0;transition:opacity .1s,transform .18s cubic-bezier(.22,1,.36,1),color .1s;right:8px;transform:scale(.8)}.canvas-card-more:hover,.canvas-card-more[data-popup-open]{color:var(--text)}.canvas-card:hover .canvas-card-more,.canvas-card-more[data-popup-open],.canvas-card-more:focus-visible{opacity:1;transform:none}.canvas-card:hover .canvas-card-more:active{transform:scale(.92)}.canvas-card-heart{color:oklch(58% .22 12);pointer-events:none;animation:.18s cubic-bezier(.22,1,.36,1) tool-pop;left:8px}@media (hover:none){.canvas-card-more{opacity:1;transform:none}}.canvas-menu-positioner{z-index:60}.canvas-menu{border-radius:var(--radius-menu);background:var(--island);min-width:160px;box-shadow:inset 0 0 0 1px var(--island-line), var(--shadow);transform-origin:var(--transform-origin);outline:0;padding:4px;transition:opacity .1s,transform .18s cubic-bezier(.22,1,.36,1)}.canvas-menu[data-starting-style],.canvas-menu[data-ending-style]{opacity:0;transform:scale(.96)}.canvas-menu-item{border-radius:var(--pill);color:#fff;white-space:nowrap;cursor:default;-webkit-user-select:none;user-select:none;outline:0;align-items:center;gap:8px;height:32px;padding:0 12px 0 7px;display:flex}.canvas-menu-item svg{stroke-width:2px;flex:none}.canvas-menu-item[data-highlighted]{background:var(--island-hover)}.canvas-menu-item.danger{color:oklch(72% .19 27)}.canvas-menu-item.danger[data-highlighted]{background:oklch(72% .19 27/.18)}.canvas-menu-separator{background:oklch(100% 0 0/.13);height:1px;margin:4px 8px}.canvas-menu-check{flex:none;display:flex}.canvas-menu-check[data-unchecked]{visibility:hidden}.shell .icon-button[data-popup-open]{background:var(--surface-pressed)}.shell .icon-button[data-popup-open] svg{opacity:1}.canvas-delete{z-index:71;border-radius:var(--radius-menu);background:var(--surface);width:320px;max-width:calc(100vw - 32px);box-shadow:var(--shadow);outline:0;flex-direction:column;gap:16px;padding:16px;transition:opacity .1s,transform .18s cubic-bezier(.22,1,.36,1);display:flex;position:fixed;top:50%;left:50%;transform:translate(-50%,-50%)}.canvas-delete[data-starting-style],.canvas-delete[data-ending-style]{opacity:0;transform:translate(-50%,-50%)scale(.96)}.canvas-delete-backdrop{transition:opacity .15s}.canvas-delete-backdrop[data-starting-style],.canvas-delete-backdrop[data-ending-style]{opacity:0}.canvas-delete-title{overflow-wrap:anywhere;margin:0;font-size:13px;font-weight:500;line-height:18px}.canvas-delete-error{color:var(--danger);margin:-8px 0 0;font-size:12px}.canvas-delete-actions{justify-content:flex-end;align-items:center;gap:4px;display:flex}.canvas-delete-cancel{border-radius:var(--pill);height:32px;color:var(--secondary);padding:0 12px;font-weight:500;transition:background-color .1s}.canvas-delete-cancel:hover{background:var(--surface-hover)}.primary-button.canvas-delete-confirm{background:var(--danger);color:#fff}.home-foot{color:var(--muted);justify-content:center;gap:16px;padding:16px;font-size:12px;display:flex}.home-foot a{text-decoration:none;transition:color .1s}.home-foot a:hover{color:var(--text)}@media (width<=700px){.toolbar{top:calc(50px + env(safe-area-inset-top));left:6px;transform:none}.top-left{max-width:calc(100vw - 150px)}.follow-tab,.reconnecting,.comments-panel{top:94px}}@media (width<=640px){.top-left .wordmark{display:none}.top-left{padding-left:3px}.comments-panel{display:none}.comment-card,.composer{width:calc(100vw - 16px)!important;left:8px!important}.faces .face-button:nth-child(n+4){display:none}}.toolbar{transition:width .24s cubic-bezier(.22,1,.36,1)}.toolbar-clip{border-radius:var(--pill);width:100%;height:32px;overflow:hidden}.toolbar-row{align-items:center;gap:2px;width:max-content;height:32px;display:flex;position:relative}.tool-slider{border-radius:var(--pill);background:var(--signal-soft);pointer-events:none;height:32px;transition:transform .24s cubic-bezier(.22,1,.36,1),width .24s cubic-bezier(.22,1,.36,1);position:absolute;top:0;left:0}.tool-slider[data-hidden]{opacity:0}.toolbar .tool{flex:none;position:relative}.toolbar .tool svg{stroke-width:2px}.toolbar .tool[aria-pressed=true]{color:var(--signal)}.toolbar .tool[aria-pressed=true] svg{opacity:1}.toolbar .tool.held{background:var(--signal-soft)}.toolbar .shell-divider{margin:0 4px}.mode-tool{touch-action:none;gap:4px;padding:0 8px;width:auto!important}.mode-chevron{align-items:center;height:100%;display:flex}.mode-menu{border-radius:var(--radius-menu);background:var(--island);min-width:160px;box-shadow:inset 0 0 0 1px var(--island-line), var(--shadow);z-index:6;padding:4px;position:absolute;top:calc(100% + 8px);left:0}.mode-menu button{border-radius:var(--pill);color:#fff;text-align:left;white-space:nowrap;align-items:center;gap:8px;width:100%;height:32px;padding:0 8px 0 7px;display:flex}.mode-menu button:hover,.mode-menu[data-hovered=edit] [data-mode-choice=edit],.mode-menu[data-hovered=preview] [data-mode-choice=preview]{background:var(--island-hover)}.mode-menu svg{stroke-width:2px;flex:none}.mode-menu span{flex:1}.pencil-tray{align-items:center;gap:6px;margin:0 6px 0 4px;display:flex}.swatch{width:20px;height:20px;box-shadow:inset 0 0 0 1px var(--line);animation:.18s cubic-bezier(.22,1,.36,1) backwards tool-pop;animation-delay:calc(var(--i,0) * 25ms);border-radius:50%;flex:none;transition:transform .1s}.swatch:hover{transform:scale(1.12)}.swatch:active{transform:scale(.9)}.swatch.closed{width:24px;height:24px}.swatch.current{box-shadow:0 0 0 2px var(--surface), 0 0 0 4px var(--signal)}.size-choice{border-radius:var(--pill);width:28px;height:28px;color:var(--secondary);animation:.18s cubic-bezier(.22,1,.36,1) backwards tool-pop;animation-delay:calc(var(--i,0) * 25ms);flex:none;justify-content:center;align-items:center;transition:background-color .1s;display:flex}.size-choice:hover{background:var(--surface-hover)}.size-choice.current{background:var(--surface-hover);color:var(--signal)}.size-choice.closed{width:24px;height:24px}@keyframes tool-pop{0%{opacity:0;transform:scale(.8)}}.strokes{pointer-events:none;z-index:1000000;position:absolute;top:0;left:0;overflow:visible}.stroke-selection{fill:none;stroke:var(--accent);stroke-width:1.5px;vector-effect:non-scaling-stroke}.stage[data-tool=move][data-mode=edit] .stroke-mine{pointer-events:auto;cursor:pointer}@media (prefers-reduced-motion:reduce){.toolbar,.tool-slider,.canvas-menu,.canvas-delete,.canvas-delete-backdrop,.canvas-card-more{transition:none}.canvas-card-heart,.swatch,.size-choice{animation:none}}