termites 1.0.18 → 1.0.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/package.json +1 -1
  2. package/server.js +30 -9
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "termites",
3
- "version": "1.0.18",
3
+ "version": "1.0.20",
4
4
  "description": "Web terminal with server-client architecture for remote shell access",
5
5
  "main": "index.js",
6
6
  "scripts": {
package/server.js CHANGED
@@ -717,10 +717,10 @@ class TermitesServer {
717
717
  <button data-mod="ctrl" class="mod-btn">Ctrl</button>
718
718
  <button data-mod="alt" class="mod-btn">Alt</button>
719
719
  <div class="sep"></div>
720
- <button data-key="ArrowUp">↑</button>
721
- <button data-key="ArrowDown">↓</button>
722
720
  <button data-key="ArrowLeft">←</button>
723
721
  <button data-key="ArrowRight">→</button>
722
+ <button data-key="ArrowUp">↑</button>
723
+ <button data-key="ArrowDown">↓</button>
724
724
  <div class="sep"></div>
725
725
  <button data-seq="/">/</button>
726
726
  <button data-seq="\\x03">^C</button>
@@ -1037,17 +1037,23 @@ class TermitesServer {
1037
1037
  btn.addEventListener('click', handler);
1038
1038
  });
1039
1039
 
1040
- // Copy button - copy selection or last line
1041
- document.getElementById('copy-btn').addEventListener('click', async () => {
1040
+ // Copy button - copy selection
1041
+ const copyBtn = document.getElementById('copy-btn');
1042
+ const handleCopy = async (e) => {
1043
+ e.preventDefault();
1042
1044
  const selection = term.getSelection();
1043
1045
  if (selection) {
1044
1046
  await navigator.clipboard.writeText(selection);
1045
1047
  term.clearSelection();
1046
1048
  }
1047
- });
1049
+ };
1050
+ copyBtn.addEventListener('touchstart', handleCopy, { passive: false });
1051
+ copyBtn.addEventListener('click', handleCopy);
1048
1052
 
1049
1053
  // Paste button
1050
- document.getElementById('paste-btn').addEventListener('click', async () => {
1054
+ const pasteBtn = document.getElementById('paste-btn');
1055
+ const handlePaste = async (e) => {
1056
+ e.preventDefault();
1051
1057
  try {
1052
1058
  const text = await navigator.clipboard.readText();
1053
1059
  if (text && ws?.readyState === WebSocket.OPEN && selectedClientId) {
@@ -1057,14 +1063,18 @@ class TermitesServer {
1057
1063
  console.error('Paste failed:', e);
1058
1064
  }
1059
1065
  term.focus();
1060
- });
1066
+ };
1067
+ pasteBtn.addEventListener('touchstart', handlePaste, { passive: false });
1068
+ pasteBtn.addEventListener('click', handlePaste);
1061
1069
 
1062
1070
  // Select mode button - enables touch selection
1063
1071
  let selectMode = false;
1064
1072
  const selectBtn = document.getElementById('select-btn');
1065
1073
  const termContainer = document.getElementById('terminal-container');
1066
1074
 
1067
- selectBtn.addEventListener('click', () => {
1075
+ const toggleSelectMode = (e) => {
1076
+ e.preventDefault();
1077
+ e.stopPropagation();
1068
1078
  selectMode = !selectMode;
1069
1079
  selectBtn.classList.toggle('active', selectMode);
1070
1080
  termContainer.style.touchAction = selectMode ? 'none' : '';
@@ -1076,7 +1086,9 @@ class TermitesServer {
1076
1086
  termContainer.classList.remove('select-mode');
1077
1087
  term.clearSelection();
1078
1088
  }
1079
- });
1089
+ };
1090
+ selectBtn.addEventListener('touchstart', toggleSelectMode, { passive: false });
1091
+ selectBtn.addEventListener('click', toggleSelectMode);
1080
1092
 
1081
1093
  // Handle touch selection
1082
1094
  let touchStartPos = null;
@@ -1236,6 +1248,15 @@ class TermitesServer {
1236
1248
  }
1237
1249
  // Initial adjustment
1238
1250
  handleViewportResize();
1251
+ // Resize when window gains focus (switching from mobile to desktop)
1252
+ window.addEventListener('focus', () => {
1253
+ setTimeout(handleViewportResize, 100);
1254
+ });
1255
+ document.addEventListener('visibilitychange', () => {
1256
+ if (!document.hidden) {
1257
+ setTimeout(handleViewportResize, 100);
1258
+ }
1259
+ });
1239
1260
  connect();
1240
1261
  applyTheme(currentTheme);
1241
1262
  }