Snapshot: full project state
This commit is contained in:
28
templates/auth.html
Normal file
28
templates/auth.html
Normal file
@@ -0,0 +1,28 @@
|
||||
{% extends "base.html" %}
|
||||
{% block title %}{{ "Sign up" if mode == "signup" else "Sign in" }} — Supernova{% endblock %}
|
||||
{% block content %}
|
||||
<div class="auth-card">
|
||||
<div class="card">
|
||||
<h3 style="font-size:1.4rem">{{ "Create your account" if mode == "signup" else "Welcome back" }}</h3>
|
||||
<div class="meta">Pay in Bitcoin. Boost any platform.</div>
|
||||
<form method="POST" style="margin-top:20px">
|
||||
<div class="field">
|
||||
<label>Email</label>
|
||||
<input type="email" name="email" required placeholder="you@example.com">
|
||||
</div>
|
||||
<div class="field">
|
||||
<label>Password</label>
|
||||
<input type="password" name="password" required minlength="8" placeholder="••••••••">
|
||||
</div>
|
||||
<button class="btn" type="submit" style="width:100%">{{ "Sign up" if mode == "signup" else "Sign in" }}</button>
|
||||
</form>
|
||||
<div class="meta center mt-2">
|
||||
{% if mode == "signup" %}
|
||||
Already have an account? <a href="{{ url_for('login') }}" style="color:var(--nebula-b)">Sign in</a>
|
||||
{% else %}
|
||||
New here? <a href="{{ url_for('signup') }}" style="color:var(--nebula-b)">Create account</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
97
templates/base.html
Normal file
97
templates/base.html
Normal file
@@ -0,0 +1,97 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>{% block title %}Supernova — Buy Instagram, TikTok & YouTube Followers Cheap | Bitcoin SMM Panel{% endblock %}</title>
|
||||
<meta name="description" content="{% block description %}Buy cheap Instagram, TikTok, YouTube, Facebook & X followers, likes and views from $0.02 per 1k. Pay with Bitcoin, instant automated delivery, 361 services across 18+ platforms.{% endblock %}">
|
||||
<meta name="keywords" content="buy instagram followers, buy tiktok followers, buy youtube views, buy followers cheap, smm panel, social media marketing panel, buy likes, buy views, buy facebook followers, buy x twitter followers, bitcoin smm panel">
|
||||
<meta name="robots" content="index, follow">
|
||||
<link rel="canonical" href="https://supernova.thetempleofdoom.com/">
|
||||
|
||||
<!-- Open Graph -->
|
||||
<meta property="og:type" content="website">
|
||||
<meta property="og:site_name" content="Supernova">
|
||||
<meta property="og:title" content="Supernova — Buy Instagram, TikTok & YouTube Followers Cheap | Bitcoin SMM Panel">
|
||||
<meta property="og:description" content="Buy cheap followers, likes and views for Instagram, TikTok, YouTube, Facebook & X. Pay with Bitcoin. Instant automated delivery. 361 services, 18+ platforms.">
|
||||
<meta property="og:url" content="https://supernova.thetempleofdoom.com/">
|
||||
<meta property="og:image" content="https://supernova.thetempleofdoom.com/static/og.png">
|
||||
|
||||
<!-- Twitter -->
|
||||
<meta name="twitter:card" content="summary_large_image">
|
||||
<meta name="twitter:title" content="Supernova — Buy Instagram, TikTok & YouTube Followers Cheap">
|
||||
<meta name="twitter:description" content="Buy cheap followers, likes & views. Pay with Bitcoin. Instant automated delivery across 18+ platforms.">
|
||||
<meta name="twitter:image" content="https://supernova.thetempleofdoom.com/static/og.png">
|
||||
|
||||
<!-- JSON-LD -->
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "Organization",
|
||||
"name": "Supernova",
|
||||
"url": "https://supernova.thetempleofdoom.com/",
|
||||
"description": "Bitcoin-powered social media growth panel. Buy Instagram, TikTok, YouTube, Facebook and X followers, likes and views.",
|
||||
"logo": "https://supernova.thetempleofdoom.com/static/og.png"
|
||||
}
|
||||
</script>
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "WebSite",
|
||||
"name": "Supernova",
|
||||
"url": "https://supernova.thetempleofdoom.com/",
|
||||
"potentialAction": {
|
||||
"@type": "SearchAction",
|
||||
"target": "https://supernova.thetempleofdoom.com/services?q={search_term_string}",
|
||||
"query-input": "required name=search_term_string"
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}?v=3">
|
||||
<link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='.9em' font-size='90'>🌌</text></svg>">
|
||||
|
||||
<!-- Umami analytics -->
|
||||
<script async src="https://analytics.thetempleofdoom.com/script.js" data-website-id="953c15df-ba4c-453a-a7c6-465fa9e3f202"></script>
|
||||
</head>
|
||||
<body>
|
||||
<canvas id="starfield"></canvas>
|
||||
<div class="nebula"></div>
|
||||
|
||||
<nav class="top">
|
||||
<div class="inner">
|
||||
<a class="brand" href="{{ url_for('index') }}"><span class="orb"></span>Supernova</a>
|
||||
<div class="navlinks">
|
||||
<a href="{{ url_for('services') }}">Services</a>
|
||||
{% if user %}
|
||||
<a href="{{ url_for('dashboard') }}">Dashboard</a>
|
||||
<a href="{{ url_for('orders') }}">Orders</a>
|
||||
<span class="balance-pill">₿ ${{ "%.2f"|format(user["balance"]) }}</span>
|
||||
<a class="btn sm" href="{{ url_for('deposit') }}">+ Add funds</a>
|
||||
<a href="{{ url_for('logout') }}">Log out</a>
|
||||
{% else %}
|
||||
<a href="{{ url_for('login') }}">Sign in</a>
|
||||
<a class="btn sm" href="{{ url_for('signup') }}">Get started</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<main class="wrap">
|
||||
{% with msgs = get_flashed_messages(with_categories=true) %}
|
||||
{% for cat, m in msgs %}
|
||||
<div class="flash {{ cat }}">{{ m }}</div>
|
||||
{% endfor %}
|
||||
{% endwith %}
|
||||
{% block content %}{% endblock %}
|
||||
</main>
|
||||
|
||||
<footer class="site">
|
||||
<div class="wrap">
|
||||
Powered by Supernova · <a href="https://buymeacoffee.com/r26xrthzttg" target="_blank" rel="noopener">☕ Support this project</a>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
<script src="{{ url_for('static', filename='app.js') }}?v=3"></script>
|
||||
</body>
|
||||
</html>
|
||||
72
templates/bg-demo.html
Normal file
72
templates/bg-demo.html
Normal file
@@ -0,0 +1,72 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>Cosmic Backgrounds — theme gallery</title>
|
||||
<style>
|
||||
* { box-sizing: border-box; }
|
||||
body { margin: 0; min-height: 100vh; font-family: -apple-system, "Segoe UI", Roboto, sans-serif; color: #e8eaf6; background: #050510; }
|
||||
.overlay {
|
||||
position: relative; z-index: 2;
|
||||
max-width: 900px; margin: 0 auto; padding: 60px 24px;
|
||||
}
|
||||
h1 { font-size: 2rem; margin: 0 0 6px; }
|
||||
.sub { color: #9aa0c0; margin: 0 0 28px; }
|
||||
.picker { display: flex; flex-wrap: wrap; gap: 10px; margin-bottom: 40px; }
|
||||
.picker a {
|
||||
text-decoration: none; color: #cfc4ff; font-weight: 600; font-size: 0.92rem;
|
||||
padding: 10px 18px; border-radius: 999px;
|
||||
border: 1px solid rgba(130,110,255,0.3);
|
||||
background: rgba(20,18,48,0.55);
|
||||
transition: all .2s ease;
|
||||
}
|
||||
.picker a.active, .picker a:hover {
|
||||
background: linear-gradient(135deg, #7b2ff7, #2b6cff);
|
||||
color: #fff; border-color: transparent;
|
||||
box-shadow: 0 4px 20px rgba(123,47,247,0.4);
|
||||
}
|
||||
.card {
|
||||
background: rgba(20,18,48,0.6);
|
||||
border: 1px solid rgba(130,110,255,0.2);
|
||||
border-radius: 18px; padding: 28px;
|
||||
backdrop-filter: blur(8px);
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
.card h2 { margin: 0 0 10px; font-size: 1.2rem; }
|
||||
.card p { color: #9aa0c0; line-height: 1.7; margin: 0; }
|
||||
code {
|
||||
display: block; margin-top: 40px; padding: 14px 18px;
|
||||
background: rgba(10,10,30,0.7); border: 1px solid rgba(130,110,255,0.2);
|
||||
border-radius: 10px; font-size: 0.85rem; color: #7cffb0;
|
||||
overflow-x: auto; white-space: nowrap;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<script src="{{ url_for('static', filename='cosmic-bg.js') }}" data-theme="{{ theme }}"></script>
|
||||
|
||||
<div class="overlay">
|
||||
<h1>✨ Cosmic Backgrounds</h1>
|
||||
<p class="sub">Current theme: <strong>{{ theme }}</strong> — click any to preview. Drop into any site with one script tag.</p>
|
||||
|
||||
<div class="picker">
|
||||
{% for t in themes %}
|
||||
<a href="{{ url_for('bg_demo') }}?theme={{ t }}" class="{{ 'active' if t == theme else '' }}">{{ t }}</a>
|
||||
{% endfor %}
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<h2>This is how your content sits over it</h2>
|
||||
<p>The background is a fixed, pointer-events-none canvas layered behind everything — your existing site, nav, cards and text all render on top unchanged. Every theme is slow + smooth, and pauses automatically when the tab is in the background (zero wasted CPU).</p>
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<h2>Add it to any site</h2>
|
||||
<p>One line in the <code><head></code> — swap <code>data-theme</code> to taste:</p>
|
||||
</div>
|
||||
|
||||
<code><script src="https://supernova.thetempleofdoom.com/static/cosmic-bg.js" data-theme="{{ theme }}"></script></code>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
43
templates/dashboard.html
Normal file
43
templates/dashboard.html
Normal file
@@ -0,0 +1,43 @@
|
||||
{% extends "base.html" %}
|
||||
{% block title %}Dashboard — Supernova{% endblock %}
|
||||
{% block content %}
|
||||
<div class="section-title" style="margin-top:36px">Your command deck</div>
|
||||
<div class="stats">
|
||||
<div class="stat"><div class="n">₿ ${{ "%.2f"|format(user.balance) }}</div><div class="l">balance</div></div>
|
||||
<div class="stat"><div class="n">{{ orders|length }}</div><div class="l">recent orders</div></div>
|
||||
<div class="stat"><div class="n">⚡</div><div class="l">auto-fulfilled</div></div>
|
||||
</div>
|
||||
|
||||
<div class="platform-grid">
|
||||
<div class="card">
|
||||
<h3>Add funds</h3>
|
||||
<div class="meta">Deposit Bitcoin — credited instantly on confirmation.</div>
|
||||
<div class="row"><a class="btn sm" href="{{ url_for('deposit') }}">Deposit ₿</a></div>
|
||||
</div>
|
||||
<div class="card">
|
||||
<h3>New boost</h3>
|
||||
<div class="meta">Browse the catalog and launch a campaign.</div>
|
||||
<div class="row"><a class="btn sm" href="{{ url_for('services') }}">Explore →</a></div>
|
||||
</div>
|
||||
<div class="card">
|
||||
<h3>Order history</h3>
|
||||
<div class="meta">Track every boost and its status.</div>
|
||||
<div class="row"><a class="btn sm ghost" href="{{ url_for('orders') }}">View all</a></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="section-title">Live delivery</div>
|
||||
<div class="card" style="padding:22px">
|
||||
<div id="ticker"><div class="muted center">Loading your boosts…</div></div>
|
||||
</div>
|
||||
|
||||
{% if deposits %}
|
||||
<div class="section-title">Recent deposits</div>
|
||||
<table class="list">
|
||||
<tr><th>Amount</th><th>Status</th></tr>
|
||||
{% for d in deposits %}
|
||||
<tr><td>${{ "%.2f"|format(d.amount) }}</td><td><span class="badge {{ d.status }}">{{ d.status }}</span></td></tr>
|
||||
{% endfor %}
|
||||
</table>
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
18
templates/deposit.html
Normal file
18
templates/deposit.html
Normal file
@@ -0,0 +1,18 @@
|
||||
{% extends "base.html" %}
|
||||
{% block title %}Deposit — Supernova{% endblock %}
|
||||
{% block content %}
|
||||
<div class="auth-card">
|
||||
<div class="card">
|
||||
<h3 style="font-size:1.4rem">Add Bitcoin funds</h3>
|
||||
<div class="meta">Current balance: <strong style="color:#7cffb0">${{ "%.2f"|format(user.balance) }}</strong>. Deposits credit automatically once the BTC confirms.</div>
|
||||
<form method="POST" style="margin-top:20px">
|
||||
<div class="field">
|
||||
<label>Amount (USD)</label>
|
||||
<input type="number" name="amount" step="0.01" min="0.50" required placeholder="25.00">
|
||||
</div>
|
||||
<button class="btn" type="submit" style="width:100%">⚡ Generate ₿ invoice</button>
|
||||
</form>
|
||||
<div class="meta center mt-2">You'll be redirected to a Bitcoin checkout page.</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
69
templates/index.html
Normal file
69
templates/index.html
Normal file
@@ -0,0 +1,69 @@
|
||||
{% extends "base.html" %}
|
||||
{% block title %}Supernova — Buy Instagram, TikTok & YouTube Followers Cheap | Bitcoin SMM Panel{% endblock %}
|
||||
{% block content %}
|
||||
<div class="hero">
|
||||
<h1>Grow your reach<br>across the galaxy</h1>
|
||||
<p class="sub">Followers, likes and views for every platform — paid in Bitcoin, delivered to your handle. Pick your world, choose your boost, watch it rise.</p>
|
||||
<div class="cta">
|
||||
<a class="btn" href="{{ url_for('services') }}">🌌 Explore services</a>
|
||||
{% if not user %}<a class="btn ghost" href="{{ url_for('signup') }}">Create account</a>{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="stats">
|
||||
<div class="stat"><div class="n">361</div><div class="l">services</div></div>
|
||||
<div class="stat"><div class="n">18+</div><div class="l">platforms</div></div>
|
||||
<div class="stat"><div class="n">₿</div><div class="l">Bitcoin payments</div></div>
|
||||
<div class="stat"><div class="n">100%</div><div class="l">automated</div></div>
|
||||
</div>
|
||||
|
||||
<div class="section-title">Spin the galaxy — choose your world</div>
|
||||
<div class="orbit-wrap">
|
||||
<div class="orbit-sun">🌌</div>
|
||||
<div class="orbit-ring" id="orbit">
|
||||
{% for name, icon in [("Instagram","📸"),("TikTok","🎵"),("YouTube","▶️"),("X / Twitter","🐦"),("Facebook","👥"),("Spotify","🎧"),("Telegram","✈️"),("Snapchat","👻")] %}
|
||||
<a class="planet-orb" href="{{ url_for('services') }}" data-i="{{ loop.index0 }}" data-name="{{ name }}">
|
||||
<span class="po-emoji">{{ icon }}</span>
|
||||
<span class="po-name">{{ name }}</span>
|
||||
</a>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
<div class="center muted" style="margin-top:10px">← drag to spin · click a planet to explore →</div>
|
||||
|
||||
<section class="seo-block">
|
||||
<h2>Buy followers, likes & views for every social platform</h2>
|
||||
<p>Supernova is a <strong>Bitcoin-powered social media marketing panel</strong> — the fastest way to grow your presence on <a href="{{ url_for('services') }}">Instagram</a>, TikTok, YouTube, Facebook, X (Twitter), Spotify, Telegram and more. With <strong>361 services</strong> starting from just <strong>$0.02 per 1,000</strong>, you can buy exactly the engagement you need and watch it land automatically.</p>
|
||||
|
||||
<h3>Instagram</h3>
|
||||
<p>Buy Instagram followers, likes, views, reel views and comments. From lifetime likes to real low-drop followers and country-targeted growth — boost your profile and look established overnight.</p>
|
||||
|
||||
<h3>TikTok</h3>
|
||||
<p>Buy TikTok followers, likes, views, shares and saves. Kickstart the algorithm and push your videos into the For You feed with fast, drip-fed delivery.</p>
|
||||
|
||||
<h3>YouTube</h3>
|
||||
<p>Buy YouTube views, subscribers, likes and watch-time. Grow your channel's authority and signal relevance to YouTube's recommendation engine.</p>
|
||||
|
||||
<h3>X (Twitter) & Facebook</h3>
|
||||
<p>Buy X followers, retweets, likes and impressions — plus Facebook page likes, followers, comments and live-stream viewers.</p>
|
||||
|
||||
<h3>Why Supernova</h3>
|
||||
<ul>
|
||||
<li><strong>Pay with Bitcoin</strong> — private, no KYC, instant credit.</li>
|
||||
<li><strong>Fully automated</strong> — order and delivery starts in minutes.</li>
|
||||
<li><strong>Cheap & scalable</strong> — from a few hundred to millions of units.</li>
|
||||
<li><strong>Refill & drip-feed</strong> — services with lifetime refill and gradual delivery.</li>
|
||||
</ul>
|
||||
<p class="cta-line"><a class="btn" href="{{ url_for('services') }}">Browse all 361 services →</a></p>
|
||||
</section>
|
||||
|
||||
<style>
|
||||
.seo-block { margin-top: 64px; padding: 8px 0 24px; }
|
||||
.seo-block h2 { font-size: 1.6rem; font-weight: 800; }
|
||||
.seo-block h3 { font-size: 1.15rem; margin-top: 26px; }
|
||||
.seo-block p { color: var(--muted); line-height: 1.7; }
|
||||
.seo-block a { color: var(--nebula-b); }
|
||||
.seo-block ul { color: var(--muted); line-height: 1.8; }
|
||||
.seo-block .cta-line { margin-top: 28px; }
|
||||
</style>
|
||||
{% endblock %}
|
||||
29
templates/order.html
Normal file
29
templates/order.html
Normal file
@@ -0,0 +1,29 @@
|
||||
{% extends "base.html" %}
|
||||
{% block title %}Order {{ s.name }} — Supernova{% endblock %}
|
||||
{% block content %}
|
||||
<div class="auth-card" style="max-width:560px">
|
||||
<div class="card">
|
||||
<h3 style="font-size:1.4rem;margin-bottom:6px">{{ s.name }}</h3>
|
||||
<div class="meta">Category: {{ s.category }} · rate ${{ "%.2f"|format(s.rate|float) }}/1k · min {{ s.min }} · max {{ "{:,}".format(s.max) }}</div>
|
||||
|
||||
<form method="POST" action="{{ url_for('order', service_id=s.service) }}">
|
||||
<div class="field" style="margin-top:22px">
|
||||
<label>Target link / username</label>
|
||||
<input type="text" name="link" placeholder="https://instagram.com/yourhandle" required>
|
||||
</div>
|
||||
|
||||
<div class="slider-wrap">
|
||||
<label>Quantity</label>
|
||||
<div class="live-price" id="live-price">$0.00</div>
|
||||
<input type="range" id="qty" name="quantity" data-service="{{ s.service }}"
|
||||
min="{{ s.min }}" max="{{ [s.max, 50000]|min }}" step="{{ [1, s.min//10]|max }}">
|
||||
<div class="meta center" style="margin-top:10px"><span id="qty-val">{{ s.min }}</span> units</div>
|
||||
</div>
|
||||
|
||||
<button class="btn launch" type="submit" style="width:100%;margin-top:14px"><span class="rocket">🚀</span> Launch boost</button>
|
||||
</form>
|
||||
|
||||
<div class="meta center mt-2">Charged from your balance. {% if s.refill %}♻️ Auto-refill included.{% endif %}</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
25
templates/orders.html
Normal file
25
templates/orders.html
Normal file
@@ -0,0 +1,25 @@
|
||||
{% extends "base.html" %}
|
||||
{% block title %}Orders — Supernova{% endblock %}
|
||||
{% block content %}
|
||||
<div id="launch-banner">🚀 Boost launched — delivery starting!</div>
|
||||
<div class="section-title" style="margin-top:36px">Your boosts</div>
|
||||
{% if orders %}
|
||||
<table class="list">
|
||||
<tr><th>Service</th><th>Link</th><th>Qty</th><th>Cost</th><th>Status</th></tr>
|
||||
{% for o in orders %}
|
||||
<tr>
|
||||
<td>{{ o.service_name }}</td>
|
||||
<td class="muted" style="max-width:220px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap">{{ o.link }}</td>
|
||||
<td>{{ "{:,}".format(o.quantity) }}</td>
|
||||
<td>${{ "%.2f"|format(o.cost) }}</td>
|
||||
<td><span class="badge {{ o.status }}">{{ o.status }}</span></td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</table>
|
||||
{% else %}
|
||||
<div class="card center" style="padding:40px">
|
||||
<div style="font-size:2rem">🪐</div>
|
||||
<div class="muted mt-2">No orders yet. <a href="{{ url_for('services') }}" style="color:var(--nebula-b)">Launch your first boost →</a></div>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
57
templates/services.html
Normal file
57
templates/services.html
Normal file
@@ -0,0 +1,57 @@
|
||||
{% extends "base.html" %}
|
||||
{% block title %}Services — Supernova{% endblock %}
|
||||
{% block content %}
|
||||
<div class="hero" style="padding:48px 0 24px">
|
||||
<h1 style="font-size:2.4rem">Services</h1>
|
||||
<p class="sub">Search the catalog. Every boost is fulfilled automatically.</p>
|
||||
<div class="field" style="max-width:520px;margin:0 auto">
|
||||
<input id="search" type="text" placeholder="Search — e.g. Instagram likes, TikTok views…" autocomplete="off">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="catalog">
|
||||
{% for cat, items in cats.items() %}
|
||||
<section class="cat-block" data-cat="{{ cat|lower }}">
|
||||
<h2 class="section-title">{{ cat }} <span class="muted" style="font-size:0.9rem">({{ items|length }})</span></h2>
|
||||
<div class="platform-grid">
|
||||
{% for s in items %}
|
||||
<div class="card" data-name="{{ s.name|lower }}">
|
||||
<h3>{{ s.name }}</h3>
|
||||
<div class="meta">min {{ s.min }} · max {{ "{:,}".format(s.max) }}</div>
|
||||
<div class="price">${{ "%.2f"|format(s.rate|float) }} <span class="muted" style="font-size:0.8rem">/ 1k</span></div>
|
||||
<div class="row">
|
||||
<span class="meta">{% if s.refill %}♻️ refill{% endif %}{% if s.dripfeed %} 💧 dripfeed{% endif %}{% if not s.refill and not s.dripfeed %}·{% endif %}</span>
|
||||
<a class="btn sm" href="{{ url_for('order', service_id=s.service) }}">Boost →</a>
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</section>
|
||||
{% endfor %}
|
||||
</div>
|
||||
|
||||
<div id="no-results" class="center muted" style="display:none;padding:40px 0">No services match your search.</div>
|
||||
|
||||
<script>
|
||||
(function () {
|
||||
const search = document.getElementById('search');
|
||||
const cards = document.querySelectorAll('.card[data-name]');
|
||||
const blocks = document.querySelectorAll('.cat-block');
|
||||
const noRes = document.getElementById('no-results');
|
||||
search.addEventListener('input', () => {
|
||||
const q = search.value.trim().toLowerCase();
|
||||
let any = false;
|
||||
cards.forEach(c => {
|
||||
const hit = !q || c.dataset.name.includes(q);
|
||||
c.style.display = hit ? '' : 'none';
|
||||
if (hit) any = true;
|
||||
});
|
||||
blocks.forEach(b => {
|
||||
const has = Array.from(b.querySelectorAll('.card[data-name]')).some(c => c.style.display !== 'none');
|
||||
b.style.display = has ? '' : 'none';
|
||||
});
|
||||
noRes.style.display = any ? 'none' : '';
|
||||
});
|
||||
})();
|
||||
</script>
|
||||
{% endblock %}
|
||||
Reference in New Issue
Block a user