@trusty-squire/mcp 0.7.4 → 0.7.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.
@@ -29,17 +29,25 @@
29
29
  flex: none; }
30
30
  #dot.ok { background: #3fb950; }
31
31
  #dot.err { background: #f85149; }
32
- /* overflow:hidden + width:100%+min-width:0 are load-bearing for
33
- scaleViewport. noVNC measures the screen DIV via
34
- getBoundingClientRect to decide the scale factor; without
35
- overflow:hidden the canvas it appends as a child grows the
36
- parent to its natural framebuffer size, making the bounding
37
- rect report "no need to scale". min-width:0 prevents a flex
38
- child from staying at its content's intrinsic width. */
32
+ /* noVNC's scaleViewport is unreliable on mobile — its measurement
33
+ races flex layout and we've burned three releases on it. Just
34
+ do the scaling ourselves: width:100% + height:auto on the
35
+ canvas, with the screen DIV flex-centering whatever's inside.
36
+ The browser does aspect-preserving scaling from the canvas's
37
+ intrinsic dimensions (the framebuffer width/height attributes)
38
+ exactly what we want, no JS involved. The !important is
39
+ required because noVNC writes inline `style.width`/`style.height`
40
+ on the canvas; without !important those would beat our rule. */
39
41
  #screen { flex: 1; position: relative; background: #0f1115;
40
42
  min-height: 0; min-width: 0; width: 100%;
41
- overflow: hidden; }
42
- #screen > canvas { max-width: 100%; max-height: 100%; }
43
+ overflow: hidden;
44
+ display: flex; align-items: center; justify-content: center; }
45
+ #screen > canvas {
46
+ display: block !important;
47
+ width: 100% !important;
48
+ height: auto !important;
49
+ max-height: 100% !important;
50
+ }
43
51
  /* Overlay siblings of #screen — `position: fixed` against the
44
52
  viewport, NOT positioned inside #screen. RFB appends a <canvas>
45
53
  child to #screen at connect time, and that canvas can cover any
@@ -120,29 +128,12 @@
120
128
  let rfb;
121
129
  try {
122
130
  rfb = new RFB(screen, wsUrl, { credentials: { password }, shared: true });
123
- // Mobile-friendly geometry. scaleViewport CSS-scales the canvas
124
- // to fit the screen DIV works whether or not the server
125
- // supports remote resize. resizeSession ALSO asks the X server
126
- // to reshape its desktop to the canvas size, which avoids the
127
- // tiny-text problem when the framebuffer is much larger than
128
- // the phone. We turn both on; if remote resize succeeds the
129
- // canvas redraws at native resolution, otherwise scaleViewport
130
- // shrinks the original.
131
- rfb.scaleViewport = true;
132
- rfb.resizeSession = true;
133
-
134
- // Re-apply the scale on any layout change (window resize,
135
- // soft-keyboard pop, orientation flip). noVNC also does this
136
- // internally on `connect`, but on at least one Android+noVNC-1.x
137
- // combo the first scale fires before the flex layout finalizes,
138
- // leaving the canvas at framebuffer-native size until something
139
- // triggers a re-measure. A no-op assignment runs the setter,
140
- // which re-reads the screen DIV's bounding rect and re-scales.
141
- const reapplyScale = () => {
142
- if (rfb) rfb.scaleViewport = true;
143
- };
144
- window.addEventListener("resize", reapplyScale);
145
- window.addEventListener("orientationchange", reapplyScale);
131
+ // Disable BOTH server-side resize and noVNC's CSS scaling. The
132
+ // canvas styling above does aspect-preserving fit-to-width in
133
+ // pure CSS; touching either of these from JS introduces races
134
+ // we can't win on first paint.
135
+ rfb.scaleViewport = false;
136
+ rfb.resizeSession = false;
146
137
  } catch (err) {
147
138
  dot.className = "err";
148
139
  msg.textContent = "Could not start the login window: " + err;
@@ -152,10 +143,6 @@
152
143
  rfb.addEventListener("connect", () => {
153
144
  dot.className = "ok";
154
145
  msg.style.display = "none";
155
- // Re-fire the scale after the canvas has actually been added
156
- // to the DOM by RFB — the property assigned at construction
157
- // time may have run against an empty container.
158
- reapplyScale();
159
146
  });
160
147
  rfb.addEventListener("disconnect", () => {
161
148
  dot.className = "err";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@trusty-squire/mcp",
3
- "version": "0.7.4",
3
+ "version": "0.7.5",
4
4
  "mcpName": "io.github.Trusty-Squire/mcp",
5
5
  "type": "module",
6
6
  "description": "Local MCP server vibe coding agents install. Thin relay to the Trusty Squire API, with the bundled universal signup bot.",