| 0 | 1 <!doctype html> | 
|  | 2 <head> | 
|  | 3     <meta charset="utf-8"> | 
| 5 | 4     <meta name="viewport" content="width=device-width, initial-scale=1.0"> | 
| 0 | 5     <title>QR Code Generator</title> | 
|  | 6 | 
|  | 7     <style type="text/css"> | 
|  | 8         * { | 
|  | 9             box-sizing: border-box; | 
|  | 10         } | 
|  | 11 | 
|  | 12         html { | 
|  | 13             height: 100%; | 
|  | 14             margin: 0; | 
|  | 15             padding: 0; | 
| 7 | 16             font-family: Arial, sans-serif; | 
| 0 | 17             font-size: 12px; | 
|  | 18         } | 
|  | 19 | 
|  | 20         body { | 
|  | 21             margin: 0; | 
| 14 | 22             padding: 8px; | 
| 0 | 23             height: 100%; | 
|  | 24         } | 
|  | 25 | 
|  | 26         .inputbox { | 
|  | 27             width: 100%; | 
| 14 | 28             margin-bottom: 8px; | 
| 0 | 29             resize: vertical; | 
| 7 | 30             font-family: Courier New, monospace; | 
| 5 | 31             /* prevent ios zoom */ | 
|  | 32             font-size: 16px; | 
| 0 | 33         } | 
|  | 34 | 
|  | 35         .page { | 
|  | 36             width: 100%; | 
| 7 | 37             min-height: 100%; | 
| 0 | 38             max-width: 600px; | 
|  | 39             margin: 0 auto; | 
| 14 | 40             display: grid; | 
|  | 41             grid-template-rows: 1fr auto; | 
|  | 42             gap: 8px; | 
| 0 | 43         } | 
|  | 44 | 
| 14 | 45         .page__footer { | 
|  | 46             border-top: 1px solid #333; | 
|  | 47             padding-top: 8px; | 
| 0 | 48         } | 
|  | 49 | 
| 1 | 50         .outputbox { | 
| 14 | 51             max-width: 256px; | 
| 1 | 52         } | 
|  | 53 | 
| 11 | 54         .outputbox > canvas { | 
| 16 | 55             max-width: 100%; | 
| 11 | 56         } | 
|  | 57 | 
| 10 | 58         .outputbox > img { | 
|  | 59             max-width: 100%; | 
|  | 60         } | 
|  | 61 | 
| 0 | 62         .title { | 
|  | 63             font-size: 16px; | 
|  | 64         } | 
|  | 65     </style> | 
|  | 66 </head> | 
|  | 67 <body> | 
|  | 68     <div class="page"> | 
|  | 69         <div class="page__main"> | 
|  | 70             <h1>QR Code Generator</h1> | 
|  | 71 | 
|  | 72             <p> | 
| 2 | 73                 Type something and get its QR code (almost) immediately. | 
| 0 | 74             </p> | 
|  | 75 | 
|  | 76             <textarea class="inputbox js-qr-input" rows="4" autofocus></textarea> | 
|  | 77 | 
| 1 | 78             <div class="outputbox js-qr-output"></div> | 
| 0 | 79         </div> | 
|  | 80 | 
| 14 | 81         <div class="page__footer"> | 
| 15 | 82             <a href="https://hg.nanaya.net/qr-html/">Source</a> | 
| 0 | 83         </div> | 
|  | 84     </div> | 
|  | 85 | 
|  | 86     <script src="qrcode.min.js"></script> | 
|  | 87 | 
|  | 88     <script> | 
| 9 | 89         var inputDom = document.querySelector(".js-qr-input") | 
|  | 90         var outputDom = document.querySelector(".js-qr-output") | 
| 14 | 91         var qr = new QRCode(outputDom, { correctLevel: QRCode.CorrectLevel.L, width: 256, height: 256 }) | 
| 0 | 92 | 
| 4 | 93         var runTimeout = null | 
|  | 94 | 
| 3 | 95         var refreshCode = function() { | 
|  | 96             var text = inputDom.value | 
| 0 | 97 | 
| 14 | 98             if (text === "") { | 
| 16 | 99                 outputDom.style.opacity = 0; | 
| 14 | 100             } else { | 
| 16 | 101                 outputDom.style.opacity = ''; | 
| 2 | 102                 qr.makeCode(text) | 
| 0 | 103             } | 
| 2 | 104         } | 
|  | 105 | 
| 14 | 106         inputDom.addEventListener('input', refreshCode) | 
| 3 | 107         refreshCode() | 
| 0 | 108     </script> | 
|  | 109 </body> |