mirror of
https://github.com/Shineii86/MiruroAPI.git
synced 2026-10-22 10:15:10 +00:00
v1.3.0: Full landing page upgrade + feature parity with AniKotoAPI
- Full index.html rewrite with AniKotoAPI-style features: * Canvas particle effects (cyan particles) * Scroll-reveal animations (IntersectionObserver) * Animated stat counters (count up on scroll) * Infinite scrolling marquee (8 feature badges) * Live interactive API console (5 presets: Search, Trending, Episodes, Info, Health) * Sidebar endpoint explorer (16 endpoints, multi-language tabs: cURL/JS/Python) * 4 interactive playground cards (Search, Info, Episodes, Trending) * Custom scrollbar, JetBrains Mono font * 4-column grid footer with API/Resources/Legal * Fixed header with scroll-aware glass blur * Ambient orb gradient animations * CTA section with gradient overlay - Added public/404.html (glitch animation error page) - Added public/manifest.json (PWA, theme: #38bdf8) - Added public/robots.txt (Allow /, Disallow /api) - Added public/sitemap.xml (4 URLs) - Added public/tos.html (13 sections) - Added public/privacy.html (8 sections) - Added .env.example, CONTRIBUTING.md, LICENSE, render.yaml, test.js - Added docs/ (5 files: index, endpoints, streaming, examples, architecture) - Updated server.js: clean URL routes (/tos, /privacy), 404.html fallback - Updated package.json: devDependencies nodemon, repository, dev script - All branding: AniKotoAPI → MiruroAPI, cyan color scheme (#38bdf8)
This commit is contained in:
@@ -70,13 +70,29 @@ app.use((req, res, next) => {
|
||||
|
||||
app.use(express.static(path.join(__dirname, "public"), { redirect: false }));
|
||||
|
||||
// ══════════════════════════════════════════════════════════════
|
||||
// CLEAN URL ROUTES
|
||||
// ══════════════════════════════════════════════════════════════
|
||||
|
||||
// ---- FEATURE: Clean URL routes (no .html extension) ----
|
||||
const fs = require("fs");
|
||||
const publicDir = path.join(__dirname, "public");
|
||||
|
||||
app.get("/tos", (req, res) => {
|
||||
res.sendFile(path.join(publicDir, "tos.html"));
|
||||
});
|
||||
|
||||
app.get("/privacy", (req, res) => {
|
||||
res.sendFile(path.join(publicDir, "privacy.html"));
|
||||
});
|
||||
|
||||
// ══════════════════════════════════════════════════════════════
|
||||
// SWAGGER UI DOCS
|
||||
// ══════════════════════════════════════════════════════════════
|
||||
|
||||
// ---- FEATURE: Interactive Swagger UI documentation at /docs ----
|
||||
app.get("/docs", (req, res) => {
|
||||
res.sendFile(path.join(__dirname, "public", "docs.html"));
|
||||
res.sendFile(path.join(publicDir, "docs.html"));
|
||||
});
|
||||
|
||||
// ══════════════════════════════════════════════════════════════
|
||||
@@ -163,7 +179,11 @@ app.use((req, res) => {
|
||||
message: "Endpoint not found",
|
||||
});
|
||||
}
|
||||
res.sendFile(path.join(__dirname, "public", "index.html"));
|
||||
const notFoundPath = path.join(publicDir, "404.html");
|
||||
if (fs.existsSync(notFoundPath)) {
|
||||
return res.status(404).sendFile(notFoundPath);
|
||||
}
|
||||
res.sendFile(path.join(publicDir, "index.html"));
|
||||
});
|
||||
|
||||
// ══════════════════════════════════════════════════════════════
|
||||
|
||||
Reference in New Issue
Block a user