webtty 1.11.3 → 1.11.5

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,3 +1,4 @@
1
- import{FitAddon as L,init as z,Terminal as B}from"/dist/ghostty-web.js";var m=new RegExp("\x1B\\[(\\d*) q","g");function S(e,t){let s=e.options.cursorStyle,l=e.options.cursorBlink;m.lastIndex=0;let a=m.exec(t);while(a!==null){let o=a[1]===""?0:Number(a[1]);if(!Number.isNaN(o)&&o>=0&&o<=6)e.options.cursorStyle=o===0||o===1||o===2?"block":o===3||o===4?"underline":"bar",e.options.cursorBlink=o===0||o===1||o===3||o===5;a=m.exec(t)}if((e.options.cursorStyle!==s||e.options.cursorBlink!==l)&&e.renderer&&e.wasmTerm)e.renderer.render(e.wasmTerm,!0,e.viewportY)}function v(e,t){if(t&&e.startsWith("\x1B[<32;"))return"\x1B[<35;"+e.slice(6);return e}function E(e,t){return e.startsWith("\x1B[<32;")&&e===t}var M=window.location.pathname.split("/s/")[1]??"main",c=await fetch("/api/config").then((e)=>e.json());document.title=`${M} | webtty`;await z();var n=new B({cols:c.cols,rows:c.rows,cursorStyle:c.cursorStyle,cursorBlink:c.cursorStyleBlink,fontSize:c.fontSize,fontFamily:c.fontFamily,scrollback:Math.ceil(c.scrollback/80),theme:c.theme}),x=new L;n.loadAddon(x);var i=document.getElementById("terminal");if(c.theme?.background)i.style.background=c.theme.background;await n.open(i);function T(){i.style.padding="0",x.fit();let e=i.querySelector("canvas");if(!e)return;let t=Math.max(0,i.clientWidth-e.offsetWidth),s=Math.max(0,i.clientHeight-e.offsetHeight);i.style.paddingLeft=`${Math.floor(t/2)}px`,i.style.paddingRight=`${Math.ceil(t/2)}px`,i.style.paddingTop=`${Math.floor(s/2)}px`,i.style.paddingBottom=`${Math.ceil(s/2)}px`}var p=null;function y(){if(p!==null)return;p=window.requestAnimationFrame(()=>{p=null,T()})}y();new ResizeObserver(()=>y()).observe(i,{box:"border-box"});window.addEventListener("resize",y);document.fonts.ready.then(()=>n.renderer?.remeasureFont());document.addEventListener("visibilitychange",()=>{if(document.visibilityState!=="visible")return;if(n.renderer&&n.wasmTerm)n.renderer.render(n.wasmTerm,!0,n.viewportY)});function C(e){if(e.style.cursor==="text")e.style.cursor="default"}C(i);new MutationObserver((e)=>{for(let t of e)C(t.target)}).observe(i,{attributes:!0,attributeFilter:["style"],subtree:!0});var P=window.location.protocol==="https:"?"wss:":"ws:",r;function D(){let e=`${P}//${window.location.host}/ws/${M}/pty?cols=${n.cols}&rows=${n.rows}`;r=new WebSocket(e);let t="\x1B[2m",s="\x1B[1;33m",l="\x1B[3m",a="\x1B[0m",o=`${t}[${a} ${s}webtty${a} ${t}]${a}`,u=(d)=>`\r
2
- ${o} ${t}${l}${d}${a}\r
3
- `;r.onopen=()=>{r.send(JSON.stringify({type:"resize",cols:n.cols,rows:n.rows}))},r.onmessage=(d)=>{S(n,d.data),n.write(d.data)},r.onclose=(d)=>{if(d.code===4001){n.write(u("Session removed.")),setTimeout(()=>window.close(),500);return}if(d.code===1001){n.write(u("Server stopped.")),setTimeout(()=>window.close(),500);return}n.write(u("Connection lost. Reconnecting in 2s...")),setTimeout(D,2000)},r.onerror=()=>{n.write(u("WebSocket error."))}}D();var g=0,k=0;n.attachCustomWheelEventHandler((e)=>{if(!n.hasMouseTracking())return!1;let t=n.renderer?.getMetrics();if(!t)return!1;let s=e.deltaY<0?-1:1;if(s!==k)g=0,k=s;g+=c.mouseScrollSpeed;let l=Math.trunc(g);if(l===0)return!0;g-=l;let a=e.target.getBoundingClientRect(),o=Math.max(1,Math.floor((e.clientX-a.left)/t.width)+1),u=Math.max(1,Math.floor((e.clientY-a.top)/t.height)+1),R=`\x1B[<${s<0?64:65};${o};${u}M`;if(r&&r.readyState===WebSocket.OPEN)for(let w=0;w<l;w++)r.send(R);return!0});i.addEventListener("keydown",(e)=>{let t=e.key.toLowerCase(),s=new Set([...e.shiftKey?["shift"]:[],...e.ctrlKey?["ctrl"]:[],...e.altKey?["alt"]:[],...e.metaKey?["meta"]:[]]),l=c.keyboardBindings.find((a)=>{if(a.key.toLowerCase()!==t)return!1;let o=new Set((Array.isArray(a.mods)?a.mods:[]).map((u)=>u.toLowerCase()));if(o.size!==s.size)return!1;for(let u of o)if(!s.has(u))return!1;return!0});if(!l)return;if(e.preventDefault(),e.stopPropagation(),l.chars&&r.readyState===WebSocket.OPEN)r.send(l.chars)},{capture:!0});var f=Math.min(32,Math.max(6,c.fontSize));window.addEventListener("keydown",(e)=>{if(!e.ctrlKey&&!e.metaKey)return;let t=e.code==="Equal"||e.code==="NumpadAdd",s=e.code==="Minus"&&!e.shiftKey||e.code==="NumpadSubtract",l=e.code==="Digit0"&&!e.shiftKey||e.code==="Numpad0";if(!t&&!s&&!l)return;if(e.preventDefault(),e.stopPropagation(),t)f=Math.min(32,f+1);else if(s)f=Math.max(6,f-1);else f=Math.min(32,Math.max(6,c.fontSize));n.options.fontSize=f,T()},{capture:!0});var b=!1,h="";i.addEventListener("mousemove",(e)=>{if(b=n.hasMouseTracking()&&e.buttons===0,b)h=""},{capture:!0});n.onData((e)=>{let t=v(e,b);if(t!==e){if(r&&r.readyState===WebSocket.OPEN)r.send(t);return}if(E(e,h))return;if(h=e.startsWith("\x1B[<32;")?e:"",r&&r.readyState===WebSocket.OPEN)r.send(e)});n.onResize(({cols:e,rows:t})=>{if(r&&r.readyState===WebSocket.OPEN)r.send(JSON.stringify({type:"resize",cols:e,rows:t}))});if(c.copyOnSelect)n.onSelectionChange(()=>{let e=n.getSelection();if(!e)return;navigator.clipboard.writeText(e).catch(()=>{})});if(c.rightClickBehavior==="copyPaste")i.addEventListener("contextmenu",(e)=>{let t=n.getSelection();if(!t)return;e.preventDefault(),navigator.clipboard.writeText(t).catch(()=>{}),n.clearSelection()});i.addEventListener("paste",(e)=>{let t=e.clipboardData;if(!t)return;if(t.getData("text/plain"))return;if(e.preventDefault(),e.stopImmediatePropagation(),r&&r.readyState===WebSocket.OPEN)r.send("\x16")},{capture:!0});
1
+ import{FitAddon as W,init as z,Terminal as K}from"/dist/ghostty-web.js";var m=new RegExp("\x1B\\[(\\d*) q","g");function v(e,t){let s=e.options.cursorStyle,l=e.options.cursorBlink;m.lastIndex=0;let c=m.exec(t);while(c!==null){let o=c[1]===""?0:Number(c[1]);if(!Number.isNaN(o)&&o>=0&&o<=6)e.options.cursorStyle=o===0||o===1||o===2?"block":o===3||o===4?"underline":"bar",e.options.cursorBlink=o===0||o===1||o===3||o===5;c=m.exec(t)}if((e.options.cursorStyle!==s||e.options.cursorBlink!==l)&&e.renderer&&e.wasmTerm)e.renderer.render(e.wasmTerm,!0,e.viewportY)}function E(e,t){if(t&&e.startsWith("\x1B[<32;"))return"\x1B[<35;"+e.slice(6);return e}function k(e,t){return e.startsWith("\x1B[<32;")&&e===t}var x=window.location.pathname.split("/s/")[1]??"main",a=await fetch("/api/config").then((e)=>e.json());document.title=`${x} | webtty`;await z();var n=new K({cols:a.cols,rows:a.rows,cursorStyle:a.cursorStyle,cursorBlink:a.cursorStyleBlink,fontSize:a.fontSize,fontFamily:a.fontFamily,scrollback:Math.ceil(a.scrollback/80),theme:a.theme}),T=new W;n.loadAddon(T);var i=document.getElementById("terminal");if(a.theme?.background)i.style.background=a.theme.background;await n.open(i);function C(){i.style.padding="0",T.fit();let e=i.querySelector("canvas");if(!e)return;let t=Math.max(0,i.clientWidth-e.offsetWidth),s=Math.max(0,i.clientHeight-e.offsetHeight);i.style.paddingLeft=`${Math.floor(t/2)}px`,i.style.paddingRight=`${Math.ceil(t/2)}px`,i.style.paddingTop=`${Math.floor(s/2)}px`,i.style.paddingBottom=`${Math.ceil(s/2)}px`}var b=null;function w(){if(b!==null)return;b=window.requestAnimationFrame(()=>{b=null,C()})}w();new ResizeObserver(()=>w()).observe(i,{box:"border-box"});window.addEventListener("resize",w);document.fonts.ready.then(()=>n.renderer?.remeasureFont());document.addEventListener("visibilitychange",()=>{if(document.visibilityState!=="visible")return;if(n.renderer&&n.wasmTerm)n.renderer.render(n.wasmTerm,!0,n.viewportY)});function D(e){if(e.style.cursor==="text")e.style.cursor="default"}D(i);new MutationObserver((e)=>{for(let t of e)D(t.target)}).observe(i,{attributes:!0,attributeFilter:["style"],subtree:!0});var O=window.location.protocol==="https:"?"wss:":"ws:",r;function P(){let e=`${O}//${window.location.host}/ws/${x}/pty?cols=${n.cols}&rows=${n.rows}`;r=new WebSocket(e);let t="\x1B[2m",s="\x1B[1;33m",l="\x1B[3m",c="\x1B[0m",o=`${t}[${c} ${s}webtty${c} ${t}]${c}`,u=(d)=>`\r
2
+ ${o} ${t}${l}${d}${c}\r
3
+ `;r.onopen=()=>{r.send(JSON.stringify({type:"resize",cols:n.cols,rows:n.rows}))},r.onmessage=(d)=>{v(n,d.data),n.write(d.data)},r.onclose=(d)=>{if(d.code===4001){n.write(u("Session removed.")),setTimeout(()=>window.close(),500);return}if(d.code===1001){n.write(u("Server stopped.")),setTimeout(()=>window.close(),500);return}n.write(u("Connection lost. Reconnecting in 2s...")),setTimeout(P,2000)},r.onerror=()=>{n.write(u("WebSocket error."))}}P();var g=0,M=0;n.attachCustomWheelEventHandler((e)=>{if(!n.hasMouseTracking())return!1;let t=n.renderer?.getMetrics();if(!t)return!1;let s=e.deltaY<0?-1:1;if(s!==M)g=0,M=s;g+=a.mouseScrollSpeed;let l=Math.trunc(g);if(l===0)return!0;g-=l;let c=e.target.getBoundingClientRect(),o=Math.max(1,Math.floor((e.clientX-c.left)/t.width)+1),u=Math.max(1,Math.floor((e.clientY-c.top)/t.height)+1),L=`\x1B[<${s<0?64:65};${o};${u}M`;if(r&&r.readyState===WebSocket.OPEN)for(let S=0;S<l;S++)r.send(L);return!0});function R(e){let t=e.key.toLowerCase(),s=new Set([...e.shiftKey?["shift"]:[],...e.ctrlKey?["ctrl"]:[],...e.altKey?["alt"]:[],...e.metaKey?["meta"]:[]]);return a.keyboardBindings.find((l)=>{if(l.key.toLowerCase()!==t)return!1;let c=new Set((Array.isArray(l.mods)?l.mods:[]).map((o)=>o.toLowerCase()));if(c.size!==s.size)return!1;for(let o of c)if(!s.has(o))return!1;return!0})}i.addEventListener("keydown",(e)=>{let t=R(e);if(!t)return;if(e.preventDefault(),e.stopPropagation(),t.chars&&r.readyState===WebSocket.OPEN)r.send(t.chars)},{capture:!0});var f=Math.min(32,Math.max(6,a.fontSize));window.addEventListener("keydown",(e)=>{if(!e.ctrlKey&&!e.metaKey)return;let t=e.code==="Equal"||e.code==="NumpadAdd",s=e.code==="Minus"&&!e.shiftKey||e.code==="NumpadSubtract",l=e.code==="Digit0"&&!e.shiftKey||e.code==="Numpad0";if(!t&&!s&&!l)return;if(e.preventDefault(),e.stopPropagation(),t)f=Math.min(32,f+1);else if(s)f=Math.max(6,f-1);else f=Math.min(32,Math.max(6,a.fontSize));n.options.fontSize=f,C()},{capture:!0});var p=!1,y="";i.addEventListener("mousemove",(e)=>{if(p=n.hasMouseTracking()&&e.buttons===0,p)y=""},{capture:!0});n.onData((e)=>{let t=E(e,p);if(t!==e){if(r&&r.readyState===WebSocket.OPEN)r.send(t);return}if(k(e,y))return;if(y=e.startsWith("\x1B[<32;")?e:"",r&&r.readyState===WebSocket.OPEN)r.send(e)});n.onResize(({cols:e,rows:t})=>{if(r&&r.readyState===WebSocket.OPEN)r.send(JSON.stringify({type:"resize",cols:e,rows:t}))});if(a.copyOnSelect)n.onSelectionChange(()=>{let e=n.getSelection();if(!e)return;navigator.clipboard.writeText(e).catch(()=>{})});if(a.rightClickBehavior==="copyPaste")i.addEventListener("contextmenu",(e)=>{let t=n.getSelection();if(!t)return;e.preventDefault(),navigator.clipboard.writeText(t).catch(()=>{}),n.clearSelection()});function h(){if(r&&r.readyState===WebSocket.OPEN)r.send("\x16")}function B(e){if(!e){h();return}if(!e.includes(`
4
+ `)){if(r&&r.readyState===WebSocket.OPEN)r.send(e);return}if(!n.getMode(2004)){h();return}if(r&&r.readyState===WebSocket.OPEN)r.send(`\x1B[200~${e}\x1B[201~`)}i.addEventListener("keydown",(e)=>{if(!e.ctrlKey||e.metaKey||e.code!=="KeyV")return;if(R(e))return;if(!navigator.clipboard?.readText)return;e.preventDefault(),e.stopImmediatePropagation(),navigator.clipboard.readText().then(B,h)},{capture:!0});i.addEventListener("paste",(e)=>{let t=e.clipboardData;if(!t)return;e.preventDefault(),e.stopImmediatePropagation(),B(t.getData("text/plain"))},{capture:!0});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "webtty",
3
- "version": "1.11.3",
3
+ "version": "1.11.5",
4
4
  "description": "Web TTY for running CLI/TUI applications in a browser tab, across platforms",
5
5
  "license": "MIT",
6
6
  "bin": {