iuna

iuna - experimental devnet protocol
git clone https://iuna.jhx.app/git/iuna.git
Log | Files | Refs | README | LICENSE

index.html (3481B)


      1 <!doctype html>
      2 <html lang="en">
      3 <head>
      4   <meta charset="utf-8">
      5   <meta name="viewport" content="width=device-width, initial-scale=1">
      6   <title>iuna</title>
      7   <style>
      8     :root {
      9       color-scheme: dark;
     10       font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
     11       background: #101214;
     12       color: #f4f0e8;
     13     }
     14 
     15     html {
     16       width: 100%;
     17       height: 100%;
     18       overflow: hidden;
     19     }
     20 
     21     body {
     22       width: 100%;
     23       height: 100%;
     24       min-height: 100%;
     25       margin: 0;
     26       display: grid;
     27       place-items: center;
     28       overflow: hidden;
     29       background:
     30         radial-gradient(circle at 50% 20%, rgba(219, 182, 109, 0.14), transparent 34rem),
     31         linear-gradient(180deg, #151719 0%, #0d0f10 100%);
     32     }
     33 
     34     main {
     35       width: min(26rem, calc(100vw - 3rem));
     36       text-align: center;
     37     }
     38 
     39     .mark {
     40       width: 4.25rem;
     41       height: 4.25rem;
     42       margin: 0 auto 1.5rem;
     43       border-radius: 1.25rem;
     44       display: grid;
     45       place-items: center;
     46       background: linear-gradient(145deg, #dcb16a, #f4e5bd 48%, #8a5c2f);
     47       color: #151719;
     48       font-size: 2rem;
     49       font-weight: 800;
     50       box-shadow: 0 1.5rem 3rem rgba(0, 0, 0, 0.28);
     51     }
     52 
     53     .mark svg {
     54       width: 2.65rem;
     55       height: 2.65rem;
     56     }
     57 
     58     .mark-loop {
     59       fill: none;
     60       stroke: currentColor;
     61       stroke-width: 4.2;
     62       stroke-linecap: round;
     63       stroke-linejoin: round;
     64     }
     65 
     66     .mark-dot {
     67       fill: currentColor;
     68     }
     69 
     70     h1 {
     71       margin: 0;
     72       font-size: 1.5rem;
     73       font-weight: 750;
     74       letter-spacing: 0;
     75     }
     76 
     77     p {
     78       margin: 0.75rem 0 0;
     79       color: rgba(244, 240, 232, 0.72);
     80       line-height: 1.55;
     81     }
     82 
     83     .status {
     84       margin-top: 1.5rem;
     85       font-size: 0.86rem;
     86       color: rgba(244, 240, 232, 0.58);
     87     }
     88 
     89     button {
     90       margin-top: 1.25rem;
     91       border: 1px solid rgba(244, 240, 232, 0.2);
     92       border-radius: 0.5rem;
     93       padding: 0.72rem 0.95rem;
     94       background: rgba(244, 240, 232, 0.08);
     95       color: #f4f0e8;
     96       font: inherit;
     97       cursor: pointer;
     98     }
     99 
    100     button:hover {
    101       background: rgba(244, 240, 232, 0.13);
    102     }
    103   </style>
    104 </head>
    105 <body>
    106   <main>
    107     <div class="mark" aria-hidden="true">
    108       <svg viewBox="0 0 32 32" focusable="false">
    109         <circle class="mark-dot" cx="9.4" cy="7.6" r="2.8"></circle>
    110         <path class="mark-loop" d="M9.4 13v7.1c0 3.7 2.9 6.4 6.6 6.4s6.6-2.7 6.6-6.4V13"></path>
    111       </svg>
    112     </div>
    113     <h1>Starting iuna</h1>
    114     <p>The local node is starting. The management UI opens here when it is ready.</p>
    115     <div id="status" class="status">Waiting for http://127.0.0.1:18661</div>
    116     <button id="open" type="button">Open Management UI</button>
    117   </main>
    118   <script>
    119     const managementUrl = "http://127.0.0.1:18661/";
    120     const statusEl = document.getElementById("status");
    121     const openButton = document.getElementById("open");
    122     let attempts = 0;
    123 
    124     async function waitForNode() {
    125       attempts += 1;
    126       try {
    127         await fetch(managementUrl, { method: "GET", mode: "no-cors", cache: "no-store" });
    128         window.location.replace(managementUrl);
    129       } catch (error) {
    130         statusEl.textContent = `Waiting for ${managementUrl} (${attempts})`;
    131         window.setTimeout(waitForNode, 700);
    132       }
    133     }
    134 
    135     openButton.addEventListener("click", () => {
    136       window.location.href = managementUrl;
    137     });
    138 
    139     waitForNode();
    140   </script>
    141 </body>
    142 </html>