diff options
Diffstat (limited to 'dist/index.html')
| -rw-r--r-- | dist/index.html | 724 |
1 files changed, 658 insertions, 66 deletions
diff --git a/dist/index.html b/dist/index.html index 6fcdb0b..8e7c542 100644 --- a/dist/index.html +++ b/dist/index.html @@ -15,6 +15,10 @@ href="https://fonts.googleapis.com/css2?family=Noto+Serif+SC:wght@400;600;700&family=JetBrains+Mono:wght@400;600&display=swap" rel="stylesheet" /> + <link + rel="stylesheet" + href="../docs/scripts/highlight/github-dark.min.css" + /> <style> *, *::before, @@ -26,6 +30,17 @@ html { scroll-behavior: smooth; + scroll-snap-type: y mandatory; + } + + .hero, + .section { + scroll-snap-align: start; + scroll-snap-stop: always; + min-height: 100vh; + display: flex; + flex-direction: column; + justify-content: center; } body { @@ -54,6 +69,11 @@ } nav { + position: fixed; + top: 0; + left: 0; + right: 0; + z-index: 100; display: flex; align-items: center; justify-content: space-between; @@ -116,10 +136,57 @@ .hero { padding: 5rem 1.5rem 3rem; text-align: center; + position: relative; + } + + .hero h1, + .hero .subtitle { + position: relative; + z-index: 1; + } + + /* Tiled grid background (field grid) */ + .hero::after { + content: ""; + position: absolute; + inset: 0; + background-image: + linear-gradient( + to right, + rgba(212, 168, 75, 0.03) 1px, + transparent 1px + ), + linear-gradient( + to bottom, + rgba(212, 168, 75, 0.03) 1px, + transparent 1px + ), + linear-gradient( + to right, + rgba(212, 168, 75, 0.015) 1px, + transparent 1px + ), + linear-gradient( + to bottom, + rgba(212, 168, 75, 0.015) 1px, + transparent 1px + ); + background-size: + 40px 40px, + 40px 40px, + 20px 20px, + 20px 20px; + background-position: + calc(50% - 540px + 20px) 0, + calc(50% - 540px) 0, + calc(50% - 540px + 10px) 0, + calc(50% - 540px + 10px) 0; + pointer-events: none; + z-index: 0; } .hero h1 { - font-size: 2.75rem; + font-size: 5.5rem; font-weight: 700; color: #e8ddd0; margin-bottom: 0.75rem; @@ -130,6 +197,83 @@ color: #9a8a7a; max-width: 640px; margin: 0 auto 2.5rem; + line-height: 1.8; + text-align: left; + } + + .hero .subtitle .star { + color: #c43931; + margin-right: 0.5rem; + } + + .hero .subtitle b { + color: #e8ddd0; + font-weight: 700; + } + + .hero .subtitle code { + font-family: "JetBrains Mono", "Noto Serif SC", monospace; + font-size: 0.9em; + color: #d4a84b; + background: rgba(212, 168, 75, 0.08); + padding: 0.1rem 0.35rem; + border-radius: 2px; + } + + /* Hero command carousel terminal */ + .hero-term { + width: 520px; + max-width: 100%; + margin: 0 auto; + background: #0f0b08; + border: 1px solid #3a2e24; + border-radius: 2.5px; + padding: 0.65rem 1.1rem; + box-shadow: 0 10px 40px rgba(0, 0, 0, 0.4); + text-align: left; + font-family: "JetBrains Mono", "Noto Serif SC", monospace; + font-size: 0.95rem; + line-height: 1.6; + white-space: nowrap; + overflow: hidden; + position: relative; + z-index: 1; + } + + .hero-term pre { + margin: 0; + padding: 0; + background: transparent; + } + + .hero-term code { + font-family: "JetBrains Mono", "Noto Serif SC", monospace; + background: transparent !important; + padding: 0 !important; + } + + .term-prompt { + color: #6a5a4a; + } + + .term-cmd { + color: #7ec699; + } + + .term-cursor { + display: inline-block; + width: 0.6em; + height: 1.15em; + background: #d0d0d0; + vertical-align: text-bottom; + margin-left: 1px; + animation: termBlink 1s steps(1) infinite; + } + + @keyframes termBlink { + 50% { + opacity: 0; + } } .download-row { @@ -177,15 +321,34 @@ } .download-card .file-name { + display: flex; + align-items: center; + justify-content: space-between; + gap: 0.5rem; + width: 100%; + padding: 0.55rem 0.9rem; + background: rgba(212, 168, 75, 0.1); + border: 1px solid rgba(212, 168, 75, 0.45); + border-radius: 2px; + color: #d4a84b; font-family: "JetBrains Mono", monospace; font-size: 0.78rem; - color: #d4a84b; - text-decoration: underline; - transition: color 0.2s; + text-decoration: none; + transition: + background 0.2s, + color 0.2s, + border-color 0.2s; } .download-card .file-name:hover { - color: #e8c46a; + background: #d4a84b; + color: #1a1410; + border-color: #d4a84b; + } + + .download-card .file-name .btn-arrow { + flex-shrink: 0; + font-size: 0.9rem; } .download-card .checksum { @@ -216,7 +379,7 @@ } .section.alt { - background: #241c16; + background-color: #241c16; } .section h2 { @@ -236,12 +399,123 @@ color: #c43931; } + .section h3 { + font-size: 1.25rem; + font-weight: 700; + color: #e8ddd0; + margin: 0 0 0.75rem; + } + + .section h3::before { + content: "✦"; + color: #c43931; + margin-right: 0.5rem; + } + + .section h3:not(:first-of-type) { + margin-top: 2rem; + } + .section p { color: #9a8a7a; margin-bottom: 1.25rem; max-width: 720px; } + /* Dashed lines along the container edges, excluding hero */ + body > section:not(.hero) { + position: relative; + background-image: + linear-gradient( + to right, + rgba(212, 168, 75, 0.03) 1px, + transparent 1px + ), + linear-gradient( + to bottom, + rgba(212, 168, 75, 0.03) 1px, + transparent 1px + ), + linear-gradient( + to right, + rgba(212, 168, 75, 0.015) 1px, + transparent 1px + ), + linear-gradient( + to bottom, + rgba(212, 168, 75, 0.015) 1px, + transparent 1px + ); + background-size: + 40px 40px, + 40px 40px, + 20px 20px, + 20px 20px; + background-position: + calc(50% - 540px + 20px) 0, + calc(50% - 540px) 0, + calc(50% - 540px + 10px) 0, + calc(50% - 540px + 10px) 0; + } + + body > section:not(.hero)::before, + body > section:not(.hero)::after { + content: ""; + position: absolute; + top: 0; + bottom: 0; + width: 1px; + background: repeating-linear-gradient( + to bottom, + rgba(212, 168, 75, 0.25) 0, + rgba(212, 168, 75, 0.25) 4px, + transparent 4px, + transparent 9px + ); + pointer-events: none; + z-index: 49; + } + + body > section:not(.hero)::before { + left: max(0px, calc(50% - 540px)); + } + + body > section:not(.hero)::after { + right: max(0px, calc(50% - 540px)); + } + + /* Diamond markers at line intersections */ + .line-diamond { + position: absolute; + top: -4px; + width: 8px; + height: 8px; + background: rgba(212, 168, 75, 0.25); + transform: rotate(45deg); + pointer-events: none; + z-index: 50; + } + + .line-diamond.left { + left: calc(max(0px, calc(50% - 540px)) - 4px); + } + + .line-diamond.right { + right: calc(max(0px, calc(50% - 540px)) - 4px); + } + + /* Horizontal dashed dividers between pages */ + body > section + section, + body > footer { + border-top: 1px solid rgba(212, 168, 75, 0.25); + border-image: repeating-linear-gradient( + to right, + rgba(212, 168, 75, 0.25) 0 4px, + transparent 4px 9px + ) + 1; + } + .code-block { background: #1a1410; border: 1px solid #3a2e24; @@ -249,12 +523,29 @@ padding: 1.5rem 1.5rem 1.5rem; overflow-x: auto; box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4); + margin-bottom: 1.5rem; } .code-block pre { margin: 0; padding: 0; background: transparent; + position: relative; + } + + .code-line-highlight { + position: absolute; + left: 0; + right: 0; + height: 28px; + background: rgba(255, 255, 255, 0.1); + border-left: 2px solid rgba(255, 255, 255, 0.45); + pointer-events: none; + opacity: 0; + transition: + opacity 0.15s ease, + top 0.08s ease; + z-index: 3; } .code-block code { @@ -263,38 +554,83 @@ font-size: 0.85rem; line-height: 1.65; color: #c0b0a0; + background: transparent !important; + padding: 0 !important; } .code-block code .cm { color: #6a5a4a; } - .cmd-grid { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); - gap: 1rem; - margin-top: 1rem; + /* Shell simulator for help output */ + .shell-term { + background: #0f0b08; + border: 1px solid #3a2e24; + border-radius: 2.5px; + padding: 1.5rem 1.75rem; + box-shadow: 0 10px 40px rgba(0, 0, 0, 0.4); + overflow-x: auto; + overflow-y: auto; + max-width: 960px; + max-height: 480px; + margin: 0 auto; + scrollbar-width: none; + -ms-overflow-style: none; } - .cmd-card { - background: #1a1410; - border: 1px solid #3a2e24; - border-radius: 2px; - padding: 1.25rem 1.25rem; + .shell-term::-webkit-scrollbar { + display: none; } - .cmd-card code { - display: inline-block; - font-family: "JetBrains Mono", monospace; - font-size: 0.85rem; - color: #d4a84b; - margin-bottom: 0.4rem; + .shell-term pre { + margin: 0; + padding: 0; + background: transparent; + position: relative; } - .cmd-card p { + .shell-term code { + font-family: "JetBrains Mono", "Noto Serif SC", monospace; font-size: 0.85rem; - color: #9a8a7a; - margin-bottom: 0; + line-height: 1.7; + color: #c0b0a0; + white-space: pre; + display: block; + background: transparent !important; + padding: 0 !important; + } + + .shell-term b { + font-weight: 700; + color: #e8ddd0; + } + + .shell-term i { + font-style: italic; + } + + .shell-term u { + text-decoration: underline; + } + + .shell-term .t-cyan { + color: #79c0ff; + } + + .shell-term .t-green { + color: #7ee787; + } + + .shell-term .t-heading { + background: #e8ddd0; + color: #1a1410; + font-weight: 700; + padding: 0 0.25rem; + } + + .shell-term .t-quote { + background: #6a5a4a; + color: #6a5a4a; } footer { @@ -314,6 +650,15 @@ } @media (max-width: 768px) { + html { + scroll-snap-type: none; + } + + .hero, + .section { + min-height: auto; + } + nav { padding: 0.8rem 1rem; } @@ -330,6 +675,59 @@ min-width: 100%; } } + + /* Cursor glow dot */ + .cursor-dot { + position: fixed; + pointer-events: none; + border-radius: 50%; + width: 400px; + height: 400px; + background: radial-gradient( + circle, + rgba(212, 168, 75, 0.06) 0%, + rgba(212, 168, 75, 0.02) 45%, + transparent 70% + ); + transform: translate(-50%, -50%); + z-index: 10000; + opacity: 0; + transition: + opacity 0.3s ease, + left 0.12s ease-out, + top 0.12s ease-out; + } + + /* Ink drop effect */ + .ink-drop { + position: fixed; + pointer-events: none; + border-radius: 50%; + background: radial-gradient( + circle, + rgba(212, 168, 75, 0.15) 0%, + rgba(196, 57, 49, 0.06) 50%, + transparent 100% + ); + width: 0; + height: 0; + transform: translate(-50%, -50%); + animation: inkSpread 0.9s ease-out forwards; + z-index: 9999; + } + + @keyframes inkSpread { + 0% { + width: 0; + height: 0; + opacity: 1; + } + 100% { + width: 500px; + height: 500px; + opacity: 0; + } + } </style> </head> @@ -362,41 +760,23 @@ <section class="hero"> <h1>Mingling CLI</h1> <p class="subtitle"> - The command-line companion for scaffolding, managing, and - updating Mingling projects. Install it once, then let - <code>mling update</code> keep it fresh. + <span class="star">✦</span> <b>Scaffold</b> — generate projects + with <code>proj-init</code><br /> + <span class="star">✦</span> <b>Manage</b> — install, enable, and + inspect packages<br /> + <span class="star">✦</span> <b>Update</b> — <code>mling</code> + keeps itself fresh </p> + <div class="hero-term"> + <pre><code class="no-highlight term-hero"></code></pre> + </div> </section> <section class="section alt"> <div class="container"> <h2>How to use</h2> - <p>Some commands you will use every day:</p> - <div class="cmd-grid"> - <div class="cmd-card"> - <code>mling proj-init 0.4@basic</code> - <p>Initialize a project</p> - </div> - <div class="cmd-card"> - <code>mling install</code> - <p>Install the project to the Mingling package list</p> - </div> - <div class="cmd-card"> - <code>mling pkg-enable your-cli@0.1.0</code> - <p>Enable the specified package</p> - </div> - <div class="cmd-card"> - <code>mling lint</code> - <p>Mingling Linter</p> - </div> - <div class="cmd-card"> - <code>mling -h</code> - <p>Show help messages</p> - </div> - <div class="cmd-card"> - <code>mling update</code> - <p>Update mling to the latest version</p> - </div> + <div class="shell-term"> + <pre><code class="no-highlight" id="shell-help"></code></pre> </div> </div> </section> @@ -424,7 +804,7 @@ </svg> <span class="os-name">Linux</span> <a class="file-name" href="./mling-linux.tar.gz" - >mling-linux.tar.gz</a + >DOWNLOAD<span class="btn-arrow">↓</span></a > <span class="checksum" ><a href="./mling-linux.tar.gz.sha256" @@ -445,7 +825,7 @@ </svg> <span class="os-name">Windows</span> <a class="file-name" href="./mling-win.tar.gz" - >mling-win.tar.gz</a + >DOWNLOAD<span class="btn-arrow">↓</span></a > <span class="checksum" ><a href="./mling-win.tar.gz.sha256" @@ -466,7 +846,7 @@ </svg> <span class="os-name">macOS</span> <a class="file-name" href="./mling-mac.tar.gz" - >mling-mac.tar.gz</a + >DOWNLOAD<span class="btn-arrow">↓</span></a > <span class="checksum" ><a href="./mling-mac.tar.gz.sha256" @@ -490,14 +870,14 @@ <section class="section alt"> <div class="container"> - <h2>Install</h2> + <h3>Install</h3> <p> Extract the package and load the bundled environment script — it adds <code>bin/</code> to <code>PATH</code> and enables shell completion. </p> <div class="code-block"> - <pre><code><span class="cm"># Linux / macOS (zsh, bash, fish)</span> + <pre><code class="language-bash"><span class="cm"># Linux / macOS (zsh, bash, fish)</span> tar -xzf mling-linux.tar.gz source load_mling.sh @@ -505,19 +885,14 @@ source load_mling.sh tar -xzf mling-win.tar.gz .\load_mling.ps1</code></pre> </div> - </div> - </section> - - <section class="section"> - <div class="container"> - <h2>Update</h2> + <h3>Update</h3> <p> <code>mling</code> can update itself. It downloads from this page by default, verifies the sha256 checksum, and applies the new version on your next invocation. </p> <div class="code-block"> - <pre><code><span class="cm"># Update to the latest build</span> + <pre><code class="language-bash"><span class="cm"># Update to the latest build</span> mling update <span class="cm"># Point it at a custom mirror if needed</span> @@ -535,5 +910,222 @@ mling update</code></pre> · <a href="../docs/doc.html">Docs</a> </footer> + + <script src="../docs/scripts/display-parse.js"></script> + <script src="../docs/scripts/highlight/highlight.min.js"></script> + <script src="../docs/scripts/highlight/bash.min.js"></script> + <script> + hljs.highlightAll(); + </script> + + <script> + // Load and render help.txt with the same coloring logic as display.rs + (function () { + var el = document.getElementById("shell-help"); + if (!el) return; + fetch("../mingling_cli/help/help.txt") + .then(function (r) { + if (!r.ok) throw new Error("HTTP " + r.status); + return r.text(); + }) + .then(function (text) { + el.innerHTML = window.MlingDisplay.parse(text); + }) + .catch(function (err) { + el.textContent = + "Failed to load help.txt: " + err.message; + }); + })(); + </script> + + <script> + // Highlight the hovered line in code blocks + (function () { + function attachLineHighlight(container) { + var pre = + container.tagName === "PRE" + ? container + : container.querySelector("pre"); + var code = pre.querySelector("code"); + var hl = document.createElement("div"); + hl.className = "code-line-highlight"; + pre.appendChild(hl); + + var lineHeight = parseFloat( + getComputedStyle(code).lineHeight, + ); + var padTop = + parseFloat(getComputedStyle(code).paddingTop) || 0; + + pre.addEventListener("mousemove", function (e) { + var rect = pre.getBoundingClientRect(); + var y = e.clientY - rect.top; + var index = Math.floor((y - padTop) / lineHeight); + var lineCount = code.innerText.split("\n").length; + if (index < 0) index = 0; + if (index >= lineCount) index = lineCount - 1; + hl.style.top = padTop + index * lineHeight + "px"; + hl.style.height = lineHeight + "px"; + hl.style.opacity = "1"; + }); + + pre.addEventListener("mouseleave", function () { + hl.style.opacity = "0"; + }); + } + + document + .querySelectorAll(".code-block, .shell-term") + .forEach(attachLineHighlight); + })(); + </script> + + <script> + // Hero command carousel typewriter + (function () { + var code = document.querySelector(".term-hero"); + if (!code) return; + + var commands = [ + "mling metadata", + "mling lint", + "mling ra-lint", + "mling proj-init 0.4.0@basic", + "mling class-add subcommand calc", + "mling install", + "mling pkg-enable your-cli@0.1.0", + "mling pkg-show", + "mling cfg update-url <URL>", + "mling update", + "mling -h", + ]; + var idx = 0; + var cursor = document.createElement("span"); + cursor.className = "term-cursor"; + code.appendChild(cursor); + + function clear() { + while (code.firstChild && code.firstChild !== cursor) { + code.removeChild(code.firstChild); + } + } + + function typeText(text, cls, speed, done) { + var i = 0; + (function step() { + if (cls) { + var span = document.createElement("span"); + span.className = cls; + span.textContent = text[i]; + code.insertBefore(span, cursor); + } else { + cursor.insertAdjacentText("beforebegin", text[i]); + } + i++; + if (i < text.length) { + setTimeout(step, speed); + } else { + done(); + } + })(); + } + + function play() { + var cmd = commands[idx]; + idx = (idx + 1) % commands.length; + clear(); + typeText("~# ", "term-prompt", 60, function () { + typeText(cmd, "term-cmd", 55, function () { + setTimeout(play, 2500); + }); + }); + } + + setTimeout(play, 800); + })(); + </script> + + <script> + // Insert diamond decorations at line intersections + (function () { + document + .querySelectorAll("body > section + section, body > footer") + .forEach(function (el) { + var left = document.createElement("span"); + left.className = "line-diamond left"; + var right = document.createElement("span"); + right.className = "line-diamond right"; + el.appendChild(left); + el.appendChild(right); + }); + })(); + </script> + + <script> + // Persistent glow dot following the mouse + var cursorDot = document.createElement("div"); + cursorDot.className = "cursor-dot"; + document.body.appendChild(cursorDot); + + document.addEventListener("mousemove", function (e) { + cursorDot.style.left = e.clientX + "px"; + cursorDot.style.top = e.clientY + "px"; + if (cursorDot.style.opacity !== "1") { + cursorDot.style.opacity = "1"; + } + }); + + // Ink drop ripple on click + document.addEventListener("click", function (e) { + var drop = document.createElement("div"); + drop.className = "ink-drop"; + drop.style.left = e.clientX + "px"; + drop.style.top = e.clientY + "px"; + document.body.appendChild(drop); + setTimeout(function () { + drop.remove(); + }, 1000); + }); + </script> + + <script> + // Disable full-page snap after the last section so the footer is reachable + (function () { + var html = document.documentElement; + var sections = document.querySelectorAll( + "body > section.hero, body > section.section", + ); + if (!sections.length) return; + var last = sections[sections.length - 1]; + var lastTop = last.offsetTop; + var disabled = false; + + window.addEventListener( + "wheel", + function (e) { + if ( + e.deltaY > 0 && + window.scrollY >= lastTop - 5 && + !disabled + ) { + html.style.scrollSnapType = "none"; + disabled = true; + } + }, + { passive: true }, + ); + + window.addEventListener( + "scroll", + function () { + if (disabled && window.scrollY < lastTop) { + html.style.scrollSnapType = ""; + disabled = false; + } + }, + { passive: true }, + ); + })(); + </script> </body> </html> |
