webtty 1.11.2 → 1.11.3

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,3 @@
1
- import{FitAddon as z,init as B,Terminal as L}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 E(e,t){if(t&&e.startsWith("\x1B[<32;"))return"\x1B[<35;"+e.slice(6);return e}function v(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 B();var n=new L({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 z;n.loadAddon(x);var i=document.getElementById("terminal");if(c.theme?.background)i.style.background=c.theme.background;await n.open(i);function C(){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,C()})}y();new ResizeObserver(()=>y()).observe(i,{box:"border-box"});window.addEventListener("resize",y);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 P=window.location.protocol==="https:"?"wss:":"ws:",r;function R(){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
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
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(R,2000)},r.onerror=()=>{n.write(u("WebSocket error."))}}R();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),T=`\x1B[<${s<0?64:65};${o};${u}M`;if(r&&r.readyState===WebSocket.OPEN)for(let w=0;w<l;w++)r.send(T);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,C()},{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=E(e,b);if(t!==e){if(r&&r.readyState===WebSocket.OPEN)r.send(t);return}if(v(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});
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});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "webtty",
3
- "version": "1.11.2",
3
+ "version": "1.11.3",
4
4
  "description": "Web TTY for running CLI/TUI applications in a browser tab, across platforms",
5
5
  "license": "MIT",
6
6
  "bin": {