UNPKG

4bnode

Version:

4bnode is a CLI-powered backend development platform with a built-in visual dashboard to generate, manage, and test Node.js/Express APIs faster.

293 lines (261 loc) 8.97 kB
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>4bnode App</title> <style> * { margin: 0; padding: 0; box-sizing: border-box; } @font-face { font-family: "Noto Sans"; src: url("/_dev/assets/fonts/NotoSans-Light.woff2") format("woff2"); font-weight: 300; font-style: normal; font-display: swap; } @font-face { font-family: "Noto Sans"; src: url("/_dev/assets/fonts/NotoSans-Regular.woff2") format("woff2"); font-weight: 400; font-style: normal; font-display: swap; } @font-face { font-family: "Noto Sans"; src: url("/_dev/assets/fonts/NotoSans-Medium.woff2") format("woff2"); font-weight: 500; font-style: normal; font-display: swap; } @font-face { font-family: "Noto Sans"; src: url("/_dev/assets/fonts/NotoSans-SemiBold.woff2") format("woff2"); font-weight: 600; font-style: normal; font-display: swap; } @font-face { font-family: "Noto Sans"; src: url("/_dev/assets/fonts/NotoSans-Bold.woff2") format("woff2"); font-weight: 700; font-style: normal; font-display: swap; } body { font-family: "Noto Sans", -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; background: #0a0b10; color: #e2e8f0; min-height: 100vh; display: flex; align-items: center; justify-content: center; overflow: hidden; } .scene { position: fixed; inset: 0; z-index: 0; } /* Animated grid floor */ .grid { position: absolute; bottom: 0; left: 50%; transform: translateX(-50%) perspective(600px) rotateX(55deg); width: 200%; height: 70vh; background-image: linear-gradient(rgba(0,114,255,0.08) 1px, transparent 1px), linear-gradient(90deg, rgba(0,114,255,0.08) 1px, transparent 1px); background-size: 60px 60px; animation: gridScroll 12s linear infinite; mask-image: linear-gradient(to top, rgba(0,0,0,0.4) 0%, transparent 80%); -webkit-mask-image: linear-gradient(to top, rgba(0,0,0,0.4) 0%, transparent 80%); } @keyframes gridScroll { 0% { background-position: 0 0; } 100% { background-position: 0 60px; } } /* Floating orbs */ .orb { position: absolute; border-radius: 50%; filter: blur(80px); opacity: 0.35; animation: float 8s ease-in-out infinite; } .orb-1 { width: 400px; height: 400px; background: radial-gradient(circle, #0072ff, transparent 70%); top: 10%; left: 15%; animation-delay: 0s; } .orb-2 { width: 350px; height: 350px; background: radial-gradient(circle, #7b2ff7, transparent 70%); top: 30%; right: 10%; animation-delay: -3s; animation-duration: 10s; } .orb-3 { width: 300px; height: 300px; background: radial-gradient(circle, #00c6ff, transparent 70%); bottom: 15%; left: 40%; animation-delay: -5s; animation-duration: 12s; } @keyframes float { 0%, 100% { transform: translate(0, 0) scale(1); } 33% { transform: translate(30px, -20px) scale(1.05); } 66% { transform: translate(-20px, 15px) scale(0.95); } } /* Content */ .container { position: relative; z-index: 1; text-align: center; padding: 40px; animation: fadeUp 1s ease-out; } @keyframes fadeUp { from { opacity: 0; transform: translateY(30px); } to { opacity: 1; transform: translateY(0); } } /* Animated node SVG */ .node-graphic { width: 120px; height: 120px; margin: 0 auto 32px; } .node-ring { fill: none; stroke: url(#ringGrad); stroke-width: 1.5; stroke-dasharray: 8 6; transform-origin: 60px 60px; animation: spin 20s linear infinite; } .node-ring-2 { animation: spin 15s linear infinite reverse; stroke-dasharray: 12 8; } .node-ring-3 { animation: spin 25s linear infinite; stroke-dasharray: 4 10; } @keyframes spin { to { transform: rotate(360deg); } } .node-dot { fill: #0072ff; animation: pulse 2s ease-in-out infinite; } .node-dot:nth-child(2) { animation-delay: 0.3s; fill: #7b2ff7; } .node-dot:nth-child(3) { animation-delay: 0.6s; fill: #00c6ff; } .node-dot:nth-child(4) { animation-delay: 0.9s; fill: #0072ff; } .node-dot:nth-child(5) { animation-delay: 1.2s; fill: #7b2ff7; } .node-dot:nth-child(6) { animation-delay: 1.5s; fill: #00c6ff; } @keyframes pulse { 0%, 100% { opacity: 0.5; r: 3; } 50% { opacity: 1; r: 5; } } .node-line { stroke: url(#lineGrad); stroke-width: 0.8; opacity: 0.4; } .node-center { fill: url(#centerGrad); filter: drop-shadow(0 0 8px rgba(0,114,255,0.4)); } h1 { font-size: 36px; font-weight: 800; letter-spacing: -0.5px; margin-bottom: 12px; background: linear-gradient(135deg, #ffffff 0%, #94a3b8 100%); -webkit-background-clip: text; -webkit-text-fill-color: transparent; } .tagline { font-size: 15px; color: #64748b; font-weight: 400; letter-spacing: 0.3px; margin-bottom: 32px; } .status { display: inline-flex; align-items: center; gap: 8px; padding: 8px 20px; border-radius: 100px; background: rgba(16, 185, 129, 0.08); border: 1px solid rgba(16, 185, 129, 0.2); font-size: 13px; color: #10b981; font-weight: 500; animation: fadeUp 1s ease-out 0.3s both; } .status-dot { width: 8px; height: 8px; border-radius: 50%; background: #10b981; animation: blink 2s ease-in-out infinite; box-shadow: 0 0 8px rgba(16, 185, 129, 0.5); } @keyframes blink { 0%, 100% { opacity: 1; } 50% { opacity: 0.4; } } .powered { position: fixed; bottom: 28px; left: 0; right: 0; text-align: center; font-size: 12px; color: #334155; letter-spacing: 0.3px; animation: fadeUp 1s ease-out 0.6s both; } .powered a { text-decoration: none; } .powered span { font-weight: 600; background: linear-gradient(135deg, #00c6ff, #7b2ff7); -webkit-background-clip: text; -webkit-text-fill-color: transparent; transition: opacity 0.2s; } .powered a:hover span { opacity: 0.75; } </style> </head> <body> <div class="scene"> <div class="orb orb-1"></div> <div class="orb orb-2"></div> <div class="orb orb-3"></div> <div class="grid"></div> </div> <div class="container"> <svg class="node-graphic" viewBox="0 0 120 120"> <defs> <linearGradient id="ringGrad" x1="0%" y1="0%" x2="100%" y2="100%"> <stop offset="0%" stop-color="#0072ff" /> <stop offset="100%" stop-color="#7b2ff7" /> </linearGradient> <linearGradient id="lineGrad" x1="0%" y1="0%" x2="100%" y2="100%"> <stop offset="0%" stop-color="#0072ff" stop-opacity="0.6" /> <stop offset="100%" stop-color="#7b2ff7" stop-opacity="0.2" /> </linearGradient> <radialGradient id="centerGrad" cx="50%" cy="50%" r="50%"> <stop offset="0%" stop-color="#0072ff" /> <stop offset="100%" stop-color="#7b2ff7" /> </radialGradient> </defs> <!-- Connection lines --> <line class="node-line" x1="60" y1="60" x2="60" y2="14" /> <line class="node-line" x1="60" y1="60" x2="100" y2="37" /> <line class="node-line" x1="60" y1="60" x2="100" y2="83" /> <line class="node-line" x1="60" y1="60" x2="60" y2="106" /> <line class="node-line" x1="60" y1="60" x2="20" y2="83" /> <line class="node-line" x1="60" y1="60" x2="20" y2="37" /> <!-- Rotating rings --> <circle class="node-ring" cx="60" cy="60" r="50" /> <circle class="node-ring node-ring-2" cx="60" cy="60" r="38" /> <circle class="node-ring node-ring-3" cx="60" cy="60" r="26" /> <!-- Orbiting dots --> <circle class="node-dot" cx="60" cy="14" r="4" /> <circle class="node-dot" cx="100" cy="37" r="4" /> <circle class="node-dot" cx="100" cy="83" r="4" /> <circle class="node-dot" cx="60" cy="106" r="4" /> <circle class="node-dot" cx="20" cy="83" r="4" /> <circle class="node-dot" cx="20" cy="37" r="4" /> <!-- Center node --> <circle class="node-center" cx="60" cy="60" r="8" /> </svg> <h1>Your app is running</h1> <p class="tagline">Server is live and ready to accept requests</p> <div class="status"> <span class="status-dot"></span> All systems operational </div> </div> <div class="powered">Powered by <a href="https://www.npmjs.com/package/4bnode" target="_blank" rel="noopener noreferrer"><span>4bnode</span></a></div> </body> </html>