╭ index.html ───────────────────────────────────────────────────╮ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ╰───────────────────────────────────────────────────────────────╯
╭────╮ ╭ clone ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ╮ │http│ ssh │ │ ╰────╯ ╰ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ╯
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="utf-8"> 5 <title>HAXY</title> 6 <style> 7 html { 8 background-color: rgba(0, 50, 70, 1.0); 9 color: rgba(200, 200, 200, 1.0); 10 } 11 12 /* no body margin because it could push content past the viewport and 13 add a window scrollbar */ 14 body { 15 margin: 0; 16 } 17 18 @font-face { 19 font-family: '3270'; 20 src: url('/term.ttf') format('truetype'); 21 } 22 23 .page { 24 font-family: '3270', monospace; 25 font-size: 20px; 26 line-height: 20px; 27 position: relative; 28 } 29 30 #grid { 31 white-space: pre; 32 /* positioning context for the top-level .scroll divs */ 33 position: relative; 34 } 35 36 body:has(#grid .scroll:not([data-scroll-direction="horiz"])) { 37 height: 100vh; 38 overflow: hidden; 39 } 40 41 /* each web-native Scroll widget: a box positioned over its viewport 42 (left/top/width/height and per-axis overflow come inline, the latter 43 from the widget's scroll direction) */ 44 .scroll { 45 position: absolute; 46 /* scrollbars are hidden; panes scroll via wheel/trackpad and via 47 scrollIntoView on keyboard focus, so a visible bar would only 48 cover content. (Firefox / WebKit respectively.) */ 49 scrollbar-width: none; 50 } 51 .scroll::-webkit-scrollbar { 52 display: none; 53 } 54 55 /* render each colored cell-run as an inline-block to prevent 56 horizontal seams between rows of the block art. */ 57 #grid span { 58 display: inline-block; 59 vertical-align: top; 60 } 61 62 /* a double-width rune pinned to its two grid cells so its advance 63 width can't shift the rest of the row. */ 64 #grid .w2 { 65 width: 2ch; 66 overflow: hidden; 67 } 68 69 /* overlay elements share the grid's coordinate system since 70 their parent (.page) is the positioning ancestor and the 71 grid sits at its top-left. */ 72 .page input, 73 .page textarea, 74 .page button { 75 position: absolute; 76 font: inherit; 77 padding: 0; 78 margin: 0; 79 outline: none; 80 box-sizing: border-box; 81 } 82 83 .page input, 84 .page textarea { 85 color: inherit; 86 background: transparent; 87 border: none; 88 } 89 90 /* the TUI border cells own the frame, so the textarea can't be 91 drag-resized past them */ 92 .page textarea { 93 resize: none; 94 overflow-y: auto; 95 } 96 97 /* the TUI cells under the button render the border + label; 98 the overlay button stays transparent so they show through 99 and just owns the click + form-submit behavior. */ 100 .page button { 101 background: transparent; 102 color: transparent; 103 border: none; 104 cursor: pointer; 105 } 106 107 #grid a { 108 color: inherit; 109 text-decoration: none; 110 } 111 112 #grid .clickable { 113 cursor: pointer; 114 } 115 </style> 116 </head> 117 <body> 118 <div class="page"> 119 <div id="grid">{{{ HAXY_HTML }}}</div> 120 <div id="overlay">{{{ HAXY_OVERLAY }}}</div> 121 </div> 122 <script id="page-data" type="application/json">{{{ HAXY_JSON }}}</script> 123 <script src="/script.js"></script> 124 </body> 125 </html> 126