Spaces:
Running
Running
Deploy blipwren to the hub
Browse files- .gitattributes +10 -0
- blipwren/app.js +200 -0
- blipwren/audio/free/combat_hit_heavy.wav +0 -0
- blipwren/audio/free/combat_sword_swing.wav +0 -0
- blipwren/audio/free/explosions_explosion_medium.wav +3 -0
- blipwren/audio/free/jingles_game_over.wav +3 -0
- blipwren/audio/free/jingles_level_up.wav +0 -0
- blipwren/audio/free/magic_sparkle.wav +0 -0
- blipwren/audio/free/movement_jump_small.wav +0 -0
- blipwren/audio/free/pickups_coin.wav +0 -0
- blipwren/audio/free/pickups_power_up.wav +0 -0
- blipwren/audio/free/scifi_laser_shot.wav +0 -0
- blipwren/audio/free/ui_confirm.wav +0 -0
- blipwren/audio/free/ui_error_buzz.wav +0 -0
- blipwren/audio/preview/combat.wav +3 -0
- blipwren/audio/preview/explosions.wav +3 -0
- blipwren/audio/preview/jingles.wav +3 -0
- blipwren/audio/preview/magic.wav +3 -0
- blipwren/audio/preview/movement.wav +3 -0
- blipwren/audio/preview/pickups.wav +3 -0
- blipwren/audio/preview/scifi.wav +3 -0
- blipwren/audio/preview/ui.wav +0 -0
- blipwren/blipwren-sfx-sampler-1.0.0.zip +3 -0
- blipwren/icon-192.png +0 -0
- blipwren/icon-512.png +0 -0
- blipwren/icon.svg +9 -0
- blipwren/index.html +148 -0
- blipwren/manifest.webmanifest +15 -0
- blipwren/og.png +3 -0
- blipwren/robots.txt +3 -0
- blipwren/sitemap.xml +4 -0
- blipwren/sounds.json +1 -0
- blipwren/style.css +76 -0
.gitattributes
CHANGED
|
@@ -371,3 +371,13 @@ brand/cybermax-lens/image-1-shot.png filter=lfs diff=lfs merge=lfs -text
|
|
| 371 |
brand/cybermax-lens/image-2-shot.png filter=lfs diff=lfs merge=lfs -text
|
| 372 |
brand/cybermax-lens/image-3-shot.png filter=lfs diff=lfs merge=lfs -text
|
| 373 |
brand/cybermax-lens/image-4-inside.png filter=lfs diff=lfs merge=lfs -text
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 371 |
brand/cybermax-lens/image-2-shot.png filter=lfs diff=lfs merge=lfs -text
|
| 372 |
brand/cybermax-lens/image-3-shot.png filter=lfs diff=lfs merge=lfs -text
|
| 373 |
brand/cybermax-lens/image-4-inside.png filter=lfs diff=lfs merge=lfs -text
|
| 374 |
+
blipwren/audio/free/explosions_explosion_medium.wav filter=lfs diff=lfs merge=lfs -text
|
| 375 |
+
blipwren/audio/free/jingles_game_over.wav filter=lfs diff=lfs merge=lfs -text
|
| 376 |
+
blipwren/audio/preview/combat.wav filter=lfs diff=lfs merge=lfs -text
|
| 377 |
+
blipwren/audio/preview/explosions.wav filter=lfs diff=lfs merge=lfs -text
|
| 378 |
+
blipwren/audio/preview/jingles.wav filter=lfs diff=lfs merge=lfs -text
|
| 379 |
+
blipwren/audio/preview/magic.wav filter=lfs diff=lfs merge=lfs -text
|
| 380 |
+
blipwren/audio/preview/movement.wav filter=lfs diff=lfs merge=lfs -text
|
| 381 |
+
blipwren/audio/preview/pickups.wav filter=lfs diff=lfs merge=lfs -text
|
| 382 |
+
blipwren/audio/preview/scifi.wav filter=lfs diff=lfs merge=lfs -text
|
| 383 |
+
blipwren/og.png filter=lfs diff=lfs merge=lfs -text
|
blipwren/app.js
ADDED
|
@@ -0,0 +1,200 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
/* Blipwren SFX player: Web Audio, no libraries. © 2026 CyberMax */
|
| 2 |
+
(function () {
|
| 3 |
+
"use strict";
|
| 4 |
+
var CHECKOUT = "https://buy.polar.sh/polar_cl_AUuQ9JEVj98iOYnwpGKLQAqxklIRWpColFOBF1GXPFh"; // Polar checkout link (revenue/packs/polar/blipwren/polar.json)
|
| 5 |
+
var BUNDLE = "https://buy.polar.sh/polar_cl_0VZrsUmgkJkVTDpll5E0TTHLI9eloGE5pmDyS4D9P8L"; // Indie Game Dev Bundle checkout link
|
| 6 |
+
var $ = function (s) { return document.querySelector(s); };
|
| 7 |
+
var ctx = null, gain = null, meta = null, cat = "all", query = "";
|
| 8 |
+
var buffers = {}; // sprite id or "free:<id>" -> AudioBuffer
|
| 9 |
+
var tiles = {}; // sound id -> {el, canvas, s}
|
| 10 |
+
var current = null, playAllToken = 0;
|
| 11 |
+
|
| 12 |
+
function audio() {
|
| 13 |
+
if (!ctx) {
|
| 14 |
+
var AC = window.AudioContext || window.webkitAudioContext;
|
| 15 |
+
ctx = new AC();
|
| 16 |
+
gain = ctx.createGain();
|
| 17 |
+
gain.gain.value = $("#vol").value / 100;
|
| 18 |
+
gain.connect(ctx.destination);
|
| 19 |
+
}
|
| 20 |
+
return ctx;
|
| 21 |
+
}
|
| 22 |
+
|
| 23 |
+
function toast(msg) {
|
| 24 |
+
var t = $("#toast"); t.textContent = msg; t.classList.add("on");
|
| 25 |
+
clearTimeout(toast._t); toast._t = setTimeout(function () { t.classList.remove("on"); }, 3200);
|
| 26 |
+
}
|
| 27 |
+
|
| 28 |
+
function decode(url) {
|
| 29 |
+
return fetch(url).then(function (r) { if (!r.ok) throw new Error(url + " " + r.status); return r.arrayBuffer(); })
|
| 30 |
+
.then(function (ab) {
|
| 31 |
+
return new Promise(function (res, rej) { audio().decodeAudioData(ab, res, rej); });
|
| 32 |
+
});
|
| 33 |
+
}
|
| 34 |
+
|
| 35 |
+
function load(s) { // full quality for free sounds, category sprite for the rest
|
| 36 |
+
var key = s.free ? "free:" + s.id : s.sprite;
|
| 37 |
+
if (buffers[key]) return Promise.resolve(buffers[key]);
|
| 38 |
+
var url = s.free ? "audio/free/" + s.id + ".wav" : "audio/preview/" + s.sprite.toLowerCase() + ".wav";
|
| 39 |
+
buffers[key] = decode(url).then(function (b) { buffers[key] = b; return b; });
|
| 40 |
+
return buffers[key];
|
| 41 |
+
}
|
| 42 |
+
|
| 43 |
+
function play(s) {
|
| 44 |
+
audio();
|
| 45 |
+
if (ctx.state === "suspended") ctx.resume();
|
| 46 |
+
return Promise.resolve(load(s)).then(function (buf) {
|
| 47 |
+
if (current) { try { current.src.stop(); } catch (e) {} current.tile.classList.remove("playing"); }
|
| 48 |
+
var src = ctx.createBufferSource();
|
| 49 |
+
src.buffer = buf;
|
| 50 |
+
if ($("#vary").checked) src.playbackRate.value = 1 + (Math.random() * 0.1 - 0.05);
|
| 51 |
+
src.connect(gain);
|
| 52 |
+
var tile = tiles[s.id].el;
|
| 53 |
+
tile.classList.add("playing");
|
| 54 |
+
var dur = s.free ? buf.duration : s.len;
|
| 55 |
+
if (s.free) src.start(0); else src.start(0, s.at, s.len);
|
| 56 |
+
var me = current = { src: src, tile: tile };
|
| 57 |
+
src.onended = function () { tile.classList.remove("playing"); if (current === me) current = null; };
|
| 58 |
+
return dur / src.playbackRate.value;
|
| 59 |
+
}).catch(function (e) { toast("Couldn't play that sound: " + e.message); return 0; });
|
| 60 |
+
}
|
| 61 |
+
|
| 62 |
+
function drawWave(s) {
|
| 63 |
+
var t = tiles[s.id]; if (!t) return;
|
| 64 |
+
var buf = buffers[s.free ? "free:" + s.id : s.sprite];
|
| 65 |
+
if (!buf || typeof buf.then === "function") return;
|
| 66 |
+
var c = t.canvas, dpr = window.devicePixelRatio || 1;
|
| 67 |
+
var w = c.clientWidth || 180, h = c.clientHeight || 28;
|
| 68 |
+
c.width = Math.round(w * dpr); c.height = Math.round(h * dpr);
|
| 69 |
+
var g = c.getContext("2d"); g.scale(dpr, dpr);
|
| 70 |
+
var data = buf.getChannelData(0), sr = buf.sampleRate;
|
| 71 |
+
var a = s.free ? 0 : Math.floor(s.at * sr), n = s.free ? data.length : Math.floor(s.len * sr);
|
| 72 |
+
var cols = Math.max(20, Math.floor(w / 2)), step = n / cols;
|
| 73 |
+
g.fillStyle = s.free ? "#34d399" : "#FFB020";
|
| 74 |
+
for (var i = 0; i < cols; i++) {
|
| 75 |
+
var peak = 0, from = a + Math.floor(i * step), to = a + Math.floor((i + 1) * step);
|
| 76 |
+
for (var j = from; j < to; j += 4) { var v = Math.abs(data[j] || 0); if (v > peak) peak = v; }
|
| 77 |
+
var bh = Math.max(1, peak * (h - 2));
|
| 78 |
+
g.fillRect(i * 2, (h - bh) / 2, 1.4, bh);
|
| 79 |
+
}
|
| 80 |
+
}
|
| 81 |
+
|
| 82 |
+
function label(c) { return c === "all" ? "All" : meta.categories.filter(function (x) { return x.id === c; })[0].label; }
|
| 83 |
+
|
| 84 |
+
function buildChips() {
|
| 85 |
+
var box = $("#cats"), list = ["all"].concat(meta.categories.map(function (c) { return c.id; }));
|
| 86 |
+
list.forEach(function (c) {
|
| 87 |
+
var b = document.createElement("button");
|
| 88 |
+
b.className = "chip" + (c === cat ? " on" : "");
|
| 89 |
+
b.dataset.cat = c;
|
| 90 |
+
var n = c === "all" ? meta.count : meta.sounds.filter(function (s) { return s.cat === c; }).length;
|
| 91 |
+
b.innerHTML = label(c) + '<span class="n">' + n + "</span>";
|
| 92 |
+
b.addEventListener("click", function () {
|
| 93 |
+
cat = c;
|
| 94 |
+
Array.prototype.forEach.call(box.children, function (x) { x.classList.toggle("on", x.dataset.cat === c); });
|
| 95 |
+
filter();
|
| 96 |
+
});
|
| 97 |
+
box.appendChild(b);
|
| 98 |
+
});
|
| 99 |
+
}
|
| 100 |
+
|
| 101 |
+
function buildGrid() {
|
| 102 |
+
var grid = $("#grid");
|
| 103 |
+
meta.sounds.forEach(function (s) {
|
| 104 |
+
var el = document.createElement("button");
|
| 105 |
+
el.className = "snd"; el.type = "button";
|
| 106 |
+
el.setAttribute("aria-label", "Play " + s.name + (s.free ? " (free)" : ""));
|
| 107 |
+
el.innerHTML = '<span class="nm"></span><span class="ds"></span><span class="dur"></span><canvas aria-hidden="true"></canvas>';
|
| 108 |
+
el.querySelector(".nm").textContent = s.name;
|
| 109 |
+
el.querySelector(".ds").textContent = s.desc;
|
| 110 |
+
el.querySelector(".dur").textContent = s.dur.toFixed(2) + "s";
|
| 111 |
+
if (s.free) {
|
| 112 |
+
var foot = document.createElement("span"); foot.className = "foot";
|
| 113 |
+
var badge = document.createElement("span"); badge.className = "free-badge"; badge.textContent = "FREE";
|
| 114 |
+
foot.appendChild(badge);
|
| 115 |
+
var dl = document.createElement("a"); dl.className = "dl"; dl.href = "audio/free/" + s.id + ".wav";
|
| 116 |
+
dl.download = "blipwren_" + s.id + ".wav"; dl.textContent = "WAV ↓";
|
| 117 |
+
dl.addEventListener("click", function (e) { e.stopPropagation(); });
|
| 118 |
+
foot.appendChild(dl);
|
| 119 |
+
el.appendChild(foot);
|
| 120 |
+
}
|
| 121 |
+
el.addEventListener("click", function () { playAllToken++; play(s); });
|
| 122 |
+
tiles[s.id] = { el: el, canvas: el.querySelector("canvas"), s: s };
|
| 123 |
+
grid.appendChild(el);
|
| 124 |
+
});
|
| 125 |
+
}
|
| 126 |
+
|
| 127 |
+
function shown() {
|
| 128 |
+
return meta.sounds.filter(function (s) {
|
| 129 |
+
return (cat === "all" || s.cat === cat) &&
|
| 130 |
+
(!query || (s.name + " " + s.desc + " " + s.cat).toLowerCase().indexOf(query) >= 0);
|
| 131 |
+
});
|
| 132 |
+
}
|
| 133 |
+
|
| 134 |
+
function filter() {
|
| 135 |
+
var vis = {}; shown().forEach(function (s) { vis[s.id] = 1; });
|
| 136 |
+
Object.keys(tiles).forEach(function (id) { tiles[id].el.hidden = !vis[id]; });
|
| 137 |
+
var n = Object.keys(vis).length;
|
| 138 |
+
$("#status").textContent = n ? n + " sound" + (n === 1 ? "" : "s") + " · tap to play" : "No sounds match “" + query + "”.";
|
| 139 |
+
Object.keys(vis).forEach(function (id) { drawWave(tiles[id].s); });
|
| 140 |
+
}
|
| 141 |
+
|
| 142 |
+
function playAll() {
|
| 143 |
+
var token = ++playAllToken, list = shown(), i = 0;
|
| 144 |
+
function next() {
|
| 145 |
+
if (token !== playAllToken || i >= list.length) return;
|
| 146 |
+
var s = list[i++];
|
| 147 |
+
tiles[s.id].el.scrollIntoView({ block: "nearest", behavior: "smooth" });
|
| 148 |
+
play(s).then(function (d) { setTimeout(next, (d + 0.25) * 1000); });
|
| 149 |
+
}
|
| 150 |
+
next();
|
| 151 |
+
}
|
| 152 |
+
|
| 153 |
+
function preload() { // decode sprites (works while the AudioContext is still suspended) to draw waveforms
|
| 154 |
+
var jobs = meta.categories.map(function (c) { return c.id; });
|
| 155 |
+
meta.sounds.forEach(function (s) { if (s.free) jobs.push(s); });
|
| 156 |
+
var i = 0;
|
| 157 |
+
function step() {
|
| 158 |
+
if (i >= jobs.length) { window.__blipwrenReady = true; return; }
|
| 159 |
+
var j = jobs[i++], s = typeof j === "string" ? meta.sounds.filter(function (x) { return x.sprite === j && !x.free; })[0] : j;
|
| 160 |
+
if (!s) return step();
|
| 161 |
+
Promise.resolve(load(s)).then(function () {
|
| 162 |
+
meta.sounds.forEach(function (x) { if ((x.free ? "free:" + x.id : x.sprite) === (s.free ? "free:" + s.id : s.sprite)) drawWave(x); });
|
| 163 |
+
}).catch(function () {}).then(step);
|
| 164 |
+
}
|
| 165 |
+
step();
|
| 166 |
+
}
|
| 167 |
+
|
| 168 |
+
function tabs() {
|
| 169 |
+
Array.prototype.forEach.call(document.querySelectorAll("#tabs .chip"), function (b) {
|
| 170 |
+
b.addEventListener("click", function () {
|
| 171 |
+
Array.prototype.forEach.call(document.querySelectorAll("#tabs .chip"), function (x) {
|
| 172 |
+
x.classList.toggle("on", x === b); x.setAttribute("aria-selected", x === b ? "true" : "false");
|
| 173 |
+
});
|
| 174 |
+
Array.prototype.forEach.call(document.querySelectorAll("pre[data-pane]"), function (p) { p.hidden = p.dataset.pane !== b.dataset.tab; });
|
| 175 |
+
});
|
| 176 |
+
});
|
| 177 |
+
}
|
| 178 |
+
|
| 179 |
+
function links() {
|
| 180 |
+
var buy = $("#buy");
|
| 181 |
+
if (/^https:\/\//.test(CHECKOUT)) buy.href = CHECKOUT;
|
| 182 |
+
else { buy.textContent = "Coming soon"; buy.removeAttribute("href"); buy.classList.add("ghost"); }
|
| 183 |
+
var bundle = $("#bundle");
|
| 184 |
+
if (/^https:\/\//.test(BUNDLE)) bundle.href = BUNDLE; else bundle.parentNode.hidden = true;
|
| 185 |
+
}
|
| 186 |
+
|
| 187 |
+
$("#vol").addEventListener("input", function () { if (gain) gain.gain.value = this.value / 100; });
|
| 188 |
+
$("#q").addEventListener("input", function () { query = this.value.trim().toLowerCase(); filter(); });
|
| 189 |
+
$("#playall").addEventListener("click", playAll);
|
| 190 |
+
document.addEventListener("keydown", function (e) { if (e.key === "Escape") { playAllToken++; if (current) try { current.src.stop(); } catch (x) {} } });
|
| 191 |
+
tabs(); links();
|
| 192 |
+
if (/[?&]thanks=1/.test(location.search)) setTimeout(function () { toast("Thanks for your order! Your download link is in the Polar receipt email."); }, 800);
|
| 193 |
+
|
| 194 |
+
fetch("sounds.json").then(function (r) { return r.json(); }).then(function (m) {
|
| 195 |
+
meta = m; buildChips(); buildGrid(); filter(); preload();
|
| 196 |
+
var hash = decodeURIComponent((location.hash.match(/^#s=([\w]+)/) || [])[1] || "");
|
| 197 |
+
if (hash && tiles[hash]) tiles[hash].el.scrollIntoView({ block: "center" });
|
| 198 |
+
}).catch(function () { $("#status").textContent = "Couldn't load the sound list. Please reload the page."; });
|
| 199 |
+
window.addEventListener("resize", function () { if (meta) filter(); });
|
| 200 |
+
})();
|
blipwren/audio/free/combat_hit_heavy.wav
ADDED
|
Binary file (30.9 kB). View file
|
|
|
blipwren/audio/free/combat_sword_swing.wav
ADDED
|
Binary file (26.5 kB). View file
|
|
|
blipwren/audio/free/explosions_explosion_medium.wav
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:66fab4c8430ad8fb47b200a90bbf47e06ea68ff8fb730eb9c195e292e7ee46ce
|
| 3 |
+
size 105884
|
blipwren/audio/free/jingles_game_over.wav
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:8b51058d5db78becb9e4b628992d00923356e0c6c5a92619f6fb40ffbd18b286
|
| 3 |
+
size 155244
|
blipwren/audio/free/jingles_level_up.wav
ADDED
|
Binary file (75.4 kB). View file
|
|
|
blipwren/audio/free/magic_sparkle.wav
ADDED
|
Binary file (70.4 kB). View file
|
|
|
blipwren/audio/free/movement_jump_small.wav
ADDED
|
Binary file (17.7 kB). View file
|
|
|
blipwren/audio/free/pickups_coin.wav
ADDED
|
Binary file (35.3 kB). View file
|
|
|
blipwren/audio/free/pickups_power_up.wav
ADDED
|
Binary file (61.8 kB). View file
|
|
|
blipwren/audio/free/scifi_laser_shot.wav
ADDED
|
Binary file (22.1 kB). View file
|
|
|
blipwren/audio/free/ui_confirm.wav
ADDED
|
Binary file (20.8 kB). View file
|
|
|
blipwren/audio/free/ui_error_buzz.wav
ADDED
|
Binary file (26.4 kB). View file
|
|
|
blipwren/audio/preview/combat.wav
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:049478be8b42efe89ec2f8b0bc9271ed5bf6071db1016a2cb5952f3e02124845
|
| 3 |
+
size 148252
|
blipwren/audio/preview/explosions.wav
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:ae63a64136df5bc9dee168e2aac633e7426219ab62aec8e0787b3e689463aed7
|
| 3 |
+
size 393412
|
blipwren/audio/preview/jingles.wav
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:b63cb3053220f86890373d0cabb25425cb3db00320fd85d1c39f27a5478d11c1
|
| 3 |
+
size 355072
|
blipwren/audio/preview/magic.wav
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:560d33d6a634ad969add2b160d5100107a181ba2f1183c249e15393b5a1d4370
|
| 3 |
+
size 395032
|
blipwren/audio/preview/movement.wav
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:186b5f4022efea296d5d67a3cf84847ff34b444f22424b46b01044b25b2d527f
|
| 3 |
+
size 119986
|
blipwren/audio/preview/pickups.wav
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:39fb9b209c8666b654c23dd0058b82a5b2c8e8ff547652f4510d4708d5e1e826
|
| 3 |
+
size 216744
|
blipwren/audio/preview/scifi.wav
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:11de1c3d0c661b46e1d536c24e004535b1f8414e971126f8e26139b52e57a24c
|
| 3 |
+
size 265078
|
blipwren/audio/preview/ui.wav
ADDED
|
Binary file (66.7 kB). View file
|
|
|
blipwren/blipwren-sfx-sampler-1.0.0.zip
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:fb71c954a585fe208f03da5dbe3910471960846ab443ef01ccb9331c3695fbb3
|
| 3 |
+
size 677943
|
blipwren/icon-192.png
ADDED
|
|
blipwren/icon-512.png
ADDED
|
|
blipwren/icon.svg
ADDED
|
|
blipwren/index.html
ADDED
|
@@ -0,0 +1,148 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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>Blipwren SFX: 120 Retro Game Sound Effects (WAV + OGG, Godot & Unity)</title>
|
| 7 |
+
<meta name="description" content="Hear all 120 retro game sound effects in your browser: UI clicks, coins, jumps, hits, explosions, lasers, magic and jingles. WAV + OGG, Godot and Unity ready, royalty-free. 12 free.">
|
| 8 |
+
<meta name="keywords" content="game sound effects, retro sfx pack, 8-bit sound effects, chiptune sfx, game sfx wav ogg, godot sound effects, unity sound effects, royalty free game sounds, ui sound effects, coin sound effect, jump sound effect">
|
| 9 |
+
<meta name="theme-color" content="#11141B">
|
| 10 |
+
<link rel="canonical" href="https://cybermax-tools-cybermax.static.hf.space/blipwren/index.html">
|
| 11 |
+
<link rel="manifest" href="manifest.webmanifest">
|
| 12 |
+
<link rel="icon" href="icon.svg" type="image/svg+xml">
|
| 13 |
+
<link rel="apple-touch-icon" href="icon-192.png">
|
| 14 |
+
<meta property="og:type" content="website">
|
| 15 |
+
<meta property="og:title" content="Blipwren SFX: hear 120 retro game sounds, 12 free">
|
| 16 |
+
<meta property="og:description" content="120 original game sound effects in WAV + OGG with Godot and Unity play-by-name helpers. $6, royalty-free.">
|
| 17 |
+
<meta property="og:url" content="https://cybermax-tools-cybermax.static.hf.space/blipwren/index.html">
|
| 18 |
+
<meta property="og:image" content="https://cybermax-tools-cybermax.static.hf.space/blipwren/og.png">
|
| 19 |
+
<meta name="twitter:card" content="summary_large_image">
|
| 20 |
+
<script type="application/ld+json">
|
| 21 |
+
{"@context":"https://schema.org","@graph":[
|
| 22 |
+
{"@type":"WebApplication","name":"Blipwren SFX Player by CyberMax","url":"https://cybermax-tools-cybermax.static.hf.space/blipwren/index.html","applicationCategory":"MultimediaApplication","operatingSystem":"Any","description":"Listen to all 120 Blipwren retro game sound effects in the browser, search them by name and download 12 free ones.","offers":{"@type":"Offer","price":"0","priceCurrency":"USD"},"publisher":{"@type":"Organization","name":"CyberMax"}},
|
| 23 |
+
{"@type":"Product","name":"Blipwren SFX Vol. 1: 120 Retro Game Sound Effects","description":"120 original synthesised game sounds in 8 categories as 44.1 kHz WAV and OGG, with Godot 4 and Unity folders and play-by-name helper scripts. Royalty-free for commercial games.","brand":{"@type":"Brand","name":"CyberMax"},"image":"https://cybermax-tools-cybermax.static.hf.space/blipwren/og.png","offers":{"@type":"Offer","price":"6.00","priceCurrency":"USD","availability":"https://schema.org/InStock","url":"https://cybermax-tools-cybermax.static.hf.space/blipwren/index.html#pack"}},
|
| 24 |
+
{"@type":"FAQPage","mainEntity":[
|
| 25 |
+
{"@type":"Question","name":"Can I use the sounds in a commercial game?","acceptedAnswer":{"@type":"Answer","text":"Yes. Use them in unlimited personal and commercial games, apps and videos, for yourself or clients, with no attribution. You can't resell or share the sound files themselves as a sound pack."}},
|
| 26 |
+
{"@type":"Question","name":"Where do the sounds come from?","acceptedAnswer":{"@type":"Answer","text":"Every sound is generated by CyberMax's own synthesis code: square, triangle, saw, sine and noise oscillators with pitch sweeps, envelopes and filters. No samples, recordings or third-party libraries are used, so there are no hidden licence chains."}},
|
| 27 |
+
{"@type":"Question","name":"Which formats and engines are supported?","acceptedAnswer":{"@type":"Answer","text":"Every sound comes as a 44.1 kHz 16-bit mono WAV and an Ogg Vorbis file. The pack has a Godot 4 folder with an Autoload helper (Sfx.play(\"pickups_coin\")) and a Unity folder with a C# helper (BlipwrenSfx.Play(\"pickups_coin\")). The files also work in Unreal, GameMaker, Defold, Construct, Phaser, Love2D, Bevy and video editors."}},
|
| 28 |
+
{"@type":"Question","name":"Why not use a free sound pack?","acceptedAnswer":{"@type":"Answer","text":"Many free packs are great. Blipwren is for when you want one consistent set that covers a whole game (UI to jingles), levelled to the same loudness, trimmed and click-free, with engine helpers so you can play any sound by name in one line, and a clear commercial licence."}}]}
|
| 29 |
+
]}
|
| 30 |
+
</script>
|
| 31 |
+
<link rel="stylesheet" href="style.css">
|
| 32 |
+
</head>
|
| 33 |
+
<body>
|
| 34 |
+
<header class="top"><div class="wrap">
|
| 35 |
+
<a class="brand" href="#"><img src="icon.svg" alt="" width="28" height="28"> Blipwren <small>by CyberMax</small></a>
|
| 36 |
+
<a class="btn" href="#pack" id="top-buy">Get all 120 · $6</a>
|
| 37 |
+
</div></header>
|
| 38 |
+
|
| 39 |
+
<main class="wrap">
|
| 40 |
+
<section class="hero">
|
| 41 |
+
<h1>120 retro game sounds. Hear every one before you buy.</h1>
|
| 42 |
+
<p class="lede">UI clicks, coins, jumps, hits, explosions, lasers, magic and jingles, made for indie games. <b>WAV + OGG</b>, <b>Godot and Unity ready</b>, royalty-free. Tap any sound to play it; <b>12 are free</b> to download now.</p>
|
| 43 |
+
<ul class="facts" aria-label="Pack facts">
|
| 44 |
+
<li><b>120</b> sounds in 8 categories</li>
|
| 45 |
+
<li><b>5¢</b> a sound ($6 one-time)</li>
|
| 46 |
+
<li><b>1 line</b> to play one in Godot or Unity</li>
|
| 47 |
+
<li><b>100%</b> synthesised by us, no samples</li>
|
| 48 |
+
</ul>
|
| 49 |
+
</section>
|
| 50 |
+
|
| 51 |
+
<section class="player card" id="player" aria-label="Sound player">
|
| 52 |
+
<div class="toolbar">
|
| 53 |
+
<div class="chips" id="cats" role="group" aria-label="Categories"></div>
|
| 54 |
+
<div class="tools">
|
| 55 |
+
<input type="search" id="q" placeholder="Search sounds (coin, jump, laser…)" aria-label="Search sounds">
|
| 56 |
+
<label class="toggle"><input type="checkbox" id="vary"> Vary pitch ±5%</label>
|
| 57 |
+
<label class="vol">Volume <input type="range" id="vol" min="0" max="100" value="70" aria-label="Volume"></label>
|
| 58 |
+
<button class="btn ghost small" id="playall">▶ Play all shown</button>
|
| 59 |
+
</div>
|
| 60 |
+
</div>
|
| 61 |
+
<div class="grid" id="grid" aria-live="polite"></div>
|
| 62 |
+
<p class="hint" id="status">Loading sounds…</p>
|
| 63 |
+
<p class="hint">Previews of the 108 pack-only sounds stream at preview quality (22 kHz, 8-bit). The pack is 44.1 kHz 16-bit WAV + OGG. <span class="free-badge">FREE</span> sounds play and download at full quality.</p>
|
| 64 |
+
<div class="free-row">
|
| 65 |
+
<a class="btn" id="btn-free" href="blipwren-sfx-sampler-1.0.0.zip" download>Download the 12 free sounds (.zip)</a>
|
| 66 |
+
<span class="hint">WAV + OGG, same licence as the pack: free for commercial games.</span>
|
| 67 |
+
</div>
|
| 68 |
+
</section>
|
| 69 |
+
|
| 70 |
+
<section id="pack" class="pack card">
|
| 71 |
+
<div class="pack-head">
|
| 72 |
+
<div>
|
| 73 |
+
<h2>Blipwren SFX Vol. 1: the full pack</h2>
|
| 74 |
+
<p>All <b>120 sounds</b>, each as a 44.1 kHz 16-bit <b>WAV</b> and an <b>OGG</b>, peak-levelled to −1 dBFS, trimmed and click-free. Folders ready to drop into <b>Godot 4</b> (Autoload helper) and <b>Unity</b> (C# helper), a <b>sounds.csv</b> of every file with its description and length, and a plain-English licence.</p>
|
| 75 |
+
<ul class="inside">
|
| 76 |
+
<li><b>UI & Menus</b> 15: clicks, hover, confirm, cancel, error, toggles, notify, typing</li>
|
| 77 |
+
<li><b>Pickups & Rewards</b> 15: coins, coin shower, gems, key, heart, power-up, 1-up, star</li>
|
| 78 |
+
<li><b>Jumps & Movement</b> 15: hops, double jump, landings, dash, slide, spring, footsteps, splash</li>
|
| 79 |
+
<li><b>Hits & Combat</b> 15: punch, kick, hits, sword swing and clash, block, arrows, hurt, crit</li>
|
| 80 |
+
<li><b>Explosions & Impacts</b> 15: small to huge booms, fuse, rubble, crate, glass, zap, fireworks</li>
|
| 81 |
+
<li><b>Lasers & Sci-Fi</b> 15: lasers, blaster, plasma, charge-up, shields, teleport, warp, robot</li>
|
| 82 |
+
<li><b>Magic & Spells</b> 15: sparkle, heal, fireball, ice, lightning, curse, buffs, portal, summon</li>
|
| 83 |
+
<li><b>Jingles & Game Flow</b> 15: level up, stage clear, victory, game over, start, pause, high score</li>
|
| 84 |
+
</ul>
|
| 85 |
+
</div>
|
| 86 |
+
<div class="price"><div class="big">$6</div><div class="hint">one-time · instant download · 15 MB zip</div>
|
| 87 |
+
<a class="btn buy" id="buy" href="#" rel="noopener">Buy on Polar</a>
|
| 88 |
+
<div class="hint">Secure checkout by Polar (cards, Apple Pay, Google Pay).</div>
|
| 89 |
+
<div class="bundle">Making a whole game? The <a id="bundle" href="#">Indie Game Dev Bundle</a> adds Blipwren to Grindscale, Tintmoor and the Fernscatter Nature Pack.</div>
|
| 90 |
+
</div>
|
| 91 |
+
</div>
|
| 92 |
+
</section>
|
| 93 |
+
|
| 94 |
+
<section class="card code" aria-labelledby="h-code">
|
| 95 |
+
<h2 id="h-code">Play any sound in one line</h2>
|
| 96 |
+
<div class="chips" role="tablist" id="tabs">
|
| 97 |
+
<button class="chip on" role="tab" aria-selected="true" data-tab="godot">Godot 4</button>
|
| 98 |
+
<button class="chip" role="tab" aria-selected="false" data-tab="unity">Unity</button>
|
| 99 |
+
<button class="chip" role="tab" aria-selected="false" data-tab="web">Web (JS)</button>
|
| 100 |
+
</div>
|
| 101 |
+
<pre data-pane="godot"><code># 1. copy blipwren_sfx/ into res://
|
| 102 |
+
# 2. Project Settings → Globals → Autoload: res://blipwren_sfx/blipwren_sfx.gd as "Sfx"
|
| 103 |
+
func _on_coin_collected() -> void:
|
| 104 |
+
Sfx.play("pickups_coin") # by file name
|
| 105 |
+
Sfx.play("movement_footstep_grass", -6.0, 0.08) # -6 dB, random pitch ±8%</code></pre>
|
| 106 |
+
<pre data-pane="unity" hidden><code>// copy Assets/Blipwren into your project's Assets folder
|
| 107 |
+
void OnCoinCollected() {
|
| 108 |
+
BlipwrenSfx.Play("pickups_coin"); // by file name
|
| 109 |
+
BlipwrenSfx.Play("combat_hit_heavy", 0.8f, 0.05f); // volume 0..1, pitch ±5%
|
| 110 |
+
}</code></pre>
|
| 111 |
+
<pre data-pane="web" hidden><code>// any engine or framework that plays audio files
|
| 112 |
+
const coin = new Audio("sfx/OGG/02_Pickups/pickups_coin.ogg");
|
| 113 |
+
coin.play();
|
| 114 |
+
// Phaser: this.load.audio("coin", ["pickups_coin.ogg", "pickups_coin.wav"]);</code></pre>
|
| 115 |
+
<p class="hint">The helpers keep 12 voices, so overlapping sounds never cut each other off. Tested with Godot 4.5 (headless: all 120 sounds found, loaded and played).</p>
|
| 116 |
+
</section>
|
| 117 |
+
|
| 118 |
+
<section class="seo" id="faq">
|
| 119 |
+
<h2>FAQ</h2>
|
| 120 |
+
<h3>Can I use the sounds in a commercial game?</h3>
|
| 121 |
+
<p>Yes. Unlimited personal and commercial games, apps, videos and streams, for yourself or clients, with no attribution needed. Ship them inside your game build however your engine stores audio. You can't resell or share the files themselves as a sound pack, or register them with Content ID.</p>
|
| 122 |
+
<h3>Where do the sounds come from?</h3>
|
| 123 |
+
<p>Our own synthesis code: square, triangle, saw, sine, FM and noise oscillators with pitch sweeps, arpeggios, envelopes, filters, bit-crushing and echo. No samples, recordings or third-party sound libraries, so there is no hidden licence chain to worry about.</p>
|
| 124 |
+
<h3>Why not use a free pack?</h3>
|
| 125 |
+
<p>There are good free packs, and the 12 free Blipwren sounds are yours too. The full pack is for when you want one consistent set that covers a whole game, from menu clicks to the victory jingle: every sound levelled to the same peak, trimmed to start instantly, faded so nothing clicks, named so you can find it, and playable by name in one line of Godot or Unity code.</p>
|
| 126 |
+
<h3>Why not a pack with 1,000+ sounds?</h3>
|
| 127 |
+
<p>Big packs are great for browsing. Blipwren is curated: 15 distinct sounds per category, each one checked for level, clicks and near-duplicates, so you pick in seconds. You can hear all 120 above before paying.</p>
|
| 128 |
+
<h3>What formats, and which engines?</h3>
|
| 129 |
+
<p>WAV (44.1 kHz, 16-bit, mono) and Ogg Vorbis. Godot 4 and Unity get ready folders and helper scripts; the files also work in Unreal, GameMaker, Defold, Construct, Phaser, Love2D, Bevy, MonoGame, RPG Maker (OGG) and any video editor.</p>
|
| 130 |
+
<h3>How do I get the files after buying?</h3>
|
| 131 |
+
<p>Polar emails a receipt with the download link straight away, and the zip is also in your Polar customer portal. It's a one-time purchase with no subscription.</p>
|
| 132 |
+
</section>
|
| 133 |
+
|
| 134 |
+
<aside class="related">
|
| 135 |
+
<h2>More for indie game developers</h2>
|
| 136 |
+
<p><a href="../grindscale/index.html">Grindscale</a>: balance your game economy in a spreadsheet · <a href="../tonebox/index.html">Tintmoor</a>: 60 colour-grading LUTs for Unity, Godot and Unreal · <a href="../groundcover/index.html">Fernscatter</a>: grass and foliage scattering for Godot</p>
|
| 137 |
+
</aside>
|
| 138 |
+
</main>
|
| 139 |
+
|
| 140 |
+
<footer class="more"><div class="wrap">
|
| 141 |
+
<div class="more-title">More from CyberMax</div>
|
| 142 |
+
<div class="more-links"><a href="../index.html">All free tools & games</a><a href="https://apify.com/cybermax">Web data tools on Apify</a><a href="../tonebox/index.html">Tintmoor LUTs</a></div>
|
| 143 |
+
<div class="copy">Sounds and player © 2026 CyberMax. All rights reserved. Not affiliated with the Godot Foundation, Unity Technologies or Epic Games.</div>
|
| 144 |
+
</div></footer>
|
| 145 |
+
<div class="toast" id="toast" role="status"></div>
|
| 146 |
+
<script src="app.js"></script>
|
| 147 |
+
</body>
|
| 148 |
+
</html>
|
blipwren/manifest.webmanifest
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"name": "Blipwren SFX Player by CyberMax",
|
| 3 |
+
"short_name": "Blipwren",
|
| 4 |
+
"description": "Hear 120 retro game sound effects in your browser; 12 are free.",
|
| 5 |
+
"start_url": "index.html",
|
| 6 |
+
"scope": "./",
|
| 7 |
+
"display": "standalone",
|
| 8 |
+
"background_color": "#F6F3EC",
|
| 9 |
+
"theme_color": "#11141B",
|
| 10 |
+
"icons": [
|
| 11 |
+
{"src": "icon-192.png", "sizes": "192x192", "type": "image/png"},
|
| 12 |
+
{"src": "icon-512.png", "sizes": "512x512", "type": "image/png"},
|
| 13 |
+
{"src": "icon.svg", "sizes": "any", "type": "image/svg+xml"}
|
| 14 |
+
]
|
| 15 |
+
}
|
blipwren/og.png
ADDED
|
Git LFS Details
|
blipwren/robots.txt
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
User-agent: *
|
| 2 |
+
Allow: /
|
| 3 |
+
Sitemap: https://cybermax-tools-cybermax.static.hf.space/blipwren/sitemap.xml
|
blipwren/sitemap.xml
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<?xml version="1.0" encoding="UTF-8"?>
|
| 2 |
+
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
| 3 |
+
<url><loc>https://cybermax-tools-cybermax.static.hf.space/blipwren/index.html</loc><lastmod>2026-09-26</lastmod><changefreq>weekly</changefreq></url>
|
| 4 |
+
</urlset>
|
blipwren/sounds.json
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
{"version":"1.0.0","count":120,"free":12,"categories":[{"id":"UI","label":"UI & Menus","sprite":"audio/preview/ui.wav"},{"id":"Pickups","label":"Pickups & Rewards","sprite":"audio/preview/pickups.wav"},{"id":"Movement","label":"Jumps & Movement","sprite":"audio/preview/movement.wav"},{"id":"Combat","label":"Hits & Combat","sprite":"audio/preview/combat.wav"},{"id":"Explosions","label":"Explosions & Impacts","sprite":"audio/preview/explosions.wav"},{"id":"SciFi","label":"Lasers & Sci-Fi","sprite":"audio/preview/scifi.wav"},{"id":"Magic","label":"Magic & Spells","sprite":"audio/preview/magic.wav"},{"id":"Jingles","label":"Jingles & Game Flow","sprite":"audio/preview/jingles.wav"}],"sounds":[{"id":"ui_click_soft","cat":"UI","name":"click soft","desc":"Soft rounded click for buttons","dur":0.08,"free":false,"sprite":"UI","at":0.0,"len":0.08},{"id":"ui_click_hard","cat":"UI","name":"click hard","desc":"Crisp mechanical click","dur":0.06,"free":false,"sprite":"UI","at":0.13,"len":0.06},{"id":"ui_hover_tick","cat":"UI","name":"hover tick","desc":"Tiny tick for hover or focus","dur":0.04,"free":false,"sprite":"UI","at":0.24,"len":0.04},{"id":"ui_select","cat":"UI","name":"select","desc":"Two-note select blip","dur":0.169,"free":false,"sprite":"UI","at":0.3299,"len":0.1686},{"id":"ui_confirm","cat":"UI","name":"confirm","desc":"Bright confirm, rising third","dur":0.236,"free":true,"sprite":"UI","at":0.5485,"len":0.2355},{"id":"ui_cancel","cat":"UI","name":"cancel","desc":"Falling two-note cancel","dur":0.202,"free":false,"sprite":"UI","at":0.834,"len":0.2018},{"id":"ui_back","cat":"UI","name":"back","desc":"Short soft back swipe","dur":0.14,"free":false,"sprite":"UI","at":1.0857,"len":0.14},{"id":"ui_error_buzz","cat":"UI","name":"error buzz","desc":"Low buzz for a wrong input","dur":0.299,"free":true,"sprite":"UI","at":1.2757,"len":0.2986},{"id":"ui_toggle_on","cat":"UI","name":"toggle on","desc":"Switch on, up-flick","dur":0.1,"free":false,"sprite":"UI","at":1.6243,"len":0.1},{"id":"ui_toggle_off","cat":"UI","name":"toggle off","desc":"Switch off, down-flick","dur":0.1,"free":false,"sprite":"UI","at":1.7743,"len":0.1},{"id":"ui_menu_open","cat":"UI","name":"menu open","desc":"Rising whoosh-blip for opening a menu","dur":0.25,"free":false,"sprite":"UI","at":1.9243,"len":0.25},{"id":"ui_menu_close","cat":"UI","name":"menu close","desc":"Falling whoosh-blip for closing a menu","dur":0.22,"free":false,"sprite":"UI","at":2.2242,"len":0.22},{"id":"ui_notify","cat":"UI","name":"notify","desc":"Friendly two-tone notification","dur":0.306,"free":false,"sprite":"UI","at":2.4942,"len":0.3056},{"id":"ui_type_key","cat":"UI","name":"type key","desc":"Typewriter-style text blip","dur":0.04,"free":false,"sprite":"UI","at":2.8498,"len":0.04},{"id":"ui_slider_tick","cat":"UI","name":"slider tick","desc":"Notch tick for sliders and counters","dur":0.035,"free":false,"sprite":"UI","at":2.9397,"len":0.035},{"id":"pickups_coin","cat":"Pickups","name":"coin","desc":"Classic two-note coin","dur":0.4,"free":true,"sprite":"Pickups","at":0.0,"len":0.4},{"id":"pickups_coin_double","cat":"Pickups","name":"coin double","desc":"Two coins in quick succession","dur":0.449,"free":false,"sprite":"Pickups","at":0.45,"len":0.4493},{"id":"pickups_coin_bag","cat":"Pickups","name":"coin bag","desc":"Shower of coins, big payout","dur":0.9,"free":false,"sprite":"Pickups","at":0.9493,"len":0.9},{"id":"pickups_gem","cat":"Pickups","name":"gem","desc":"Glassy gem sparkle","dur":0.6,"free":false,"sprite":"Pickups","at":1.8993,"len":0.6},{"id":"pickups_gem_big","cat":"Pickups","name":"gem big","desc":"Rare gem, longer shimmer","dur":1.19,"free":false,"sprite":"Pickups","at":2.5493,"len":1.19},{"id":"pickups_key","cat":"Pickups","name":"key","desc":"Key pickup, metallic jingle","dur":0.5,"free":false,"sprite":"Pickups","at":3.7893,"len":0.5},{"id":"pickups_heart","cat":"Pickups","name":"heart","desc":"Health pickup, warm rising blip","dur":0.45,"free":false,"sprite":"Pickups","at":4.3392,"len":0.45},{"id":"pickups_ammo","cat":"Pickups","name":"ammo","desc":"Ammo pickup, clack and ping","dur":0.3,"free":false,"sprite":"Pickups","at":4.8392,"len":0.3},{"id":"pickups_power_up","cat":"Pickups","name":"power up","desc":"Rising power-up sweep","dur":0.7,"free":true,"sprite":"Pickups","at":5.1892,"len":0.7},{"id":"pickups_extra_life","cat":"Pickups","name":"extra life","desc":"1-up style jingle","dur":0.565,"free":false,"sprite":"Pickups","at":5.9391,"len":0.5649},{"id":"pickups_star","cat":"Pickups","name":"star","desc":"Invincibility star grab","dur":0.7,"free":false,"sprite":"Pickups","at":6.554,"len":0.7},{"id":"pickups_collect_chime","cat":"Pickups","name":"collect chime","desc":"Soft chime for collectibles","dur":0.8,"free":false,"sprite":"Pickups","at":7.3039,"len":0.8},{"id":"pickups_item_get","cat":"Pickups","name":"item get","desc":"Item acquired, short fanfare","dur":0.524,"free":false,"sprite":"Pickups","at":8.1539,"len":0.5238},{"id":"pickups_fruit_bite","cat":"Pickups","name":"fruit bite","desc":"Crunchy bite for food pickups","dur":0.2,"free":false,"sprite":"Pickups","at":8.7277,"len":0.2},{"id":"pickups_magnet_pull","cat":"Pickups","name":"magnet pull","desc":"Wobbling pull of a magnet power-up","dur":0.8,"free":false,"sprite":"Pickups","at":8.9776,"len":0.8},{"id":"movement_jump_small","cat":"Movement","name":"jump small","desc":"Short hop","dur":0.2,"free":true,"sprite":"Movement","at":0.0,"len":0.2},{"id":"movement_jump_big","cat":"Movement","name":"jump big","desc":"High jump with a long rise","dur":0.4,"free":false,"sprite":"Movement","at":0.25,"len":0.4},{"id":"movement_jump_double","cat":"Movement","name":"jump double","desc":"Mid-air double jump","dur":0.3,"free":false,"sprite":"Movement","at":0.7,"len":0.3},{"id":"movement_land_soft","cat":"Movement","name":"land soft","desc":"Soft landing thump","dur":0.15,"free":false,"sprite":"Movement","at":1.0499,"len":0.15},{"id":"movement_land_heavy","cat":"Movement","name":"land heavy","desc":"Heavy landing with dust","dur":0.45,"free":false,"sprite":"Movement","at":1.2499,"len":0.45},{"id":"movement_dash","cat":"Movement","name":"dash","desc":"Fast air dash","dur":0.25,"free":false,"sprite":"Movement","at":1.7498,"len":0.25},{"id":"movement_slide","cat":"Movement","name":"slide","desc":"Sliding on the ground","dur":0.5,"free":false,"sprite":"Movement","at":2.0498,"len":0.5},{"id":"movement_wall_jump","cat":"Movement","name":"wall jump","desc":"Kick off a wall","dur":0.25,"free":false,"sprite":"Movement","at":2.5998,"len":0.25},{"id":"movement_spring_bounce","cat":"Movement","name":"spring bounce","desc":"Boingy spring","dur":0.6,"free":false,"sprite":"Movement","at":2.8997,"len":0.6},{"id":"movement_climb_step","cat":"Movement","name":"climb step","desc":"Ladder or vine climb step","dur":0.1,"free":false,"sprite":"Movement","at":3.5497,"len":0.1},{"id":"movement_footstep_grass","cat":"Movement","name":"footstep grass","desc":"Footstep on grass","dur":0.14,"free":false,"sprite":"Movement","at":3.6997,"len":0.14},{"id":"movement_footstep_stone","cat":"Movement","name":"footstep stone","desc":"Footstep on stone","dur":0.12,"free":false,"sprite":"Movement","at":3.8897,"len":0.12},{"id":"movement_swim_splash","cat":"Movement","name":"swim splash","desc":"Water splash","dur":0.6,"free":false,"sprite":"Movement","at":4.0596,"len":0.6},{"id":"movement_whoosh_fast","cat":"Movement","name":"whoosh fast","desc":"Fast whoosh past the camera","dur":0.45,"free":false,"sprite":"Movement","at":4.7096,"len":0.45},{"id":"movement_ledge_grab","cat":"Movement","name":"ledge grab","desc":"Grab a ledge","dur":0.18,"free":false,"sprite":"Movement","at":5.2096,"len":0.18},{"id":"combat_punch","cat":"Combat","name":"punch","desc":"Solid punch","dur":0.2,"free":false,"sprite":"Combat","at":0.0,"len":0.2},{"id":"combat_kick","cat":"Combat","name":"kick","desc":"Heavy kick","dur":0.3,"free":false,"sprite":"Combat","at":0.25,"len":0.3},{"id":"combat_hit_light","cat":"Combat","name":"hit light","desc":"Light retro hit","dur":0.15,"free":false,"sprite":"Combat","at":0.6,"len":0.15},{"id":"combat_hit_heavy","cat":"Combat","name":"hit heavy","desc":"Heavy retro hit with crunch","dur":0.35,"free":true,"sprite":"Combat","at":0.7999,"len":0.35},{"id":"combat_sword_swing","cat":"Combat","name":"sword swing","desc":"Blade swing whoosh","dur":0.3,"free":true,"sprite":"Combat","at":1.1999,"len":0.3},{"id":"combat_sword_hit","cat":"Combat","name":"sword hit","desc":"Blade strikes metal","dur":0.7,"free":false,"sprite":"Combat","at":1.5498,"len":0.7},{"id":"combat_block_clang","cat":"Combat","name":"block clang","desc":"Shield block clang","dur":0.6,"free":false,"sprite":"Combat","at":2.2998,"len":0.6},{"id":"combat_arrow_shot","cat":"Combat","name":"arrow shot","desc":"Bow release twang","dur":0.35,"free":false,"sprite":"Combat","at":2.9498,"len":0.35},{"id":"combat_arrow_hit","cat":"Combat","name":"arrow hit","desc":"Arrow thunks into wood","dur":0.3,"free":false,"sprite":"Combat","at":3.3497,"len":0.3},{"id":"combat_hurt_player","cat":"Combat","name":"hurt player","desc":"Player takes damage","dur":0.35,"free":false,"sprite":"Combat","at":3.6997,"len":0.35},{"id":"combat_enemy_hurt","cat":"Combat","name":"enemy hurt","desc":"Enemy hit squeak","dur":0.2,"free":false,"sprite":"Combat","at":4.0996,"len":0.2},{"id":"combat_enemy_die","cat":"Combat","name":"enemy die","desc":"Enemy defeated, falling crunch","dur":0.6,"free":false,"sprite":"Combat","at":4.3496,"len":0.6},{"id":"combat_crit_hit","cat":"Combat","name":"crit hit","desc":"Critical hit, sharp and bright","dur":0.5,"free":false,"sprite":"Combat","at":4.9996,"len":0.5},{"id":"combat_whip_crack","cat":"Combat","name":"whip crack","desc":"Whip crack","dur":0.272,"free":false,"sprite":"Combat","at":5.5496,"len":0.2719},{"id":"combat_shield_break","cat":"Combat","name":"shield break","desc":"Shield shatters","dur":0.8,"free":false,"sprite":"Combat","at":5.8715,"len":0.8},{"id":"explosions_explosion_small","cat":"Explosions","name":"explosion small","desc":"Small retro explosion","dur":0.499,"free":false,"sprite":"Explosions","at":0.0,"len":0.4991},{"id":"explosions_explosion_medium","cat":"Explosions","name":"explosion medium","desc":"Medium explosion","dur":1.2,"free":true,"sprite":"Explosions","at":0.5491,"len":1.2},{"id":"explosions_explosion_big","cat":"Explosions","name":"explosion big","desc":"Big explosion with rumble tail","dur":2.4,"free":false,"sprite":"Explosions","at":1.799,"len":2.4},{"id":"explosions_explosion_distant","cat":"Explosions","name":"explosion distant","desc":"Distant muffled explosion","dur":2.42,"free":false,"sprite":"Explosions","at":4.249,"len":2.4196},{"id":"explosions_bomb_fuse","cat":"Explosions","name":"bomb fuse","desc":"Fizzing bomb fuse","dur":1.2,"free":false,"sprite":"Explosions","at":6.7186,"len":1.2},{"id":"explosions_grenade_bounce","cat":"Explosions","name":"grenade bounce","desc":"Metal grenade bouncing","dur":0.696,"free":false,"sprite":"Explosions","at":7.9686,"len":0.6964},{"id":"explosions_debris_rubble","cat":"Explosions","name":"debris rubble","desc":"Falling rubble","dur":1.2,"free":false,"sprite":"Explosions","at":8.715,"len":1.2},{"id":"explosions_crate_break","cat":"Explosions","name":"crate break","desc":"Wooden crate smash","dur":0.495,"free":false,"sprite":"Explosions","at":9.9649,"len":0.4948},{"id":"explosions_glass_shatter","cat":"Explosions","name":"glass shatter","desc":"Glass shatter","dur":0.837,"free":false,"sprite":"Explosions","at":10.5097,"len":0.8371},{"id":"explosions_rock_crumble","cat":"Explosions","name":"rock crumble","desc":"Rock breaks apart","dur":0.9,"free":false,"sprite":"Explosions","at":11.3968,"len":0.9},{"id":"explosions_thud_impact","cat":"Explosions","name":"thud impact","desc":"Deep body-fall thud","dur":0.4,"free":false,"sprite":"Explosions","at":12.3468,"len":0.4},{"id":"explosions_boom_bass","cat":"Explosions","name":"boom bass","desc":"Cinematic sub boom","dur":2.0,"free":false,"sprite":"Explosions","at":12.7968,"len":2.0},{"id":"explosions_firework_pop","cat":"Explosions","name":"firework pop","desc":"Firework launch and burst","dur":1.6,"free":false,"sprite":"Explosions","at":14.8468,"len":1.6},{"id":"explosions_fire_burst","cat":"Explosions","name":"fire burst","desc":"Flame burst","dur":0.9,"free":false,"sprite":"Explosions","at":16.4967,"len":0.9},{"id":"explosions_electric_zap","cat":"Explosions","name":"electric zap","desc":"Electric zap","dur":0.343,"free":false,"sprite":"Explosions","at":17.4467,"len":0.3431},{"id":"scifi_laser_shot","cat":"SciFi","name":"laser shot","desc":"Classic laser shot","dur":0.25,"free":true,"sprite":"SciFi","at":0.0,"len":0.25},{"id":"scifi_laser_rapid","cat":"SciFi","name":"laser rapid","desc":"Rapid-fire blaster burst","dur":0.296,"free":false,"sprite":"SciFi","at":0.3,"len":0.2956},{"id":"scifi_laser_heavy","cat":"SciFi","name":"laser heavy","desc":"Heavy cannon laser","dur":0.6,"free":false,"sprite":"SciFi","at":0.6456,"len":0.6},{"id":"scifi_blaster","cat":"SciFi","name":"blaster","desc":"Pew blaster with ring","dur":0.439,"free":false,"sprite":"SciFi","at":1.2956,"len":0.439},{"id":"scifi_plasma","cat":"SciFi","name":"plasma","desc":"Plasma bolt","dur":0.5,"free":false,"sprite":"SciFi","at":1.7845,"len":0.5},{"id":"scifi_charge_up","cat":"SciFi","name":"charge up","desc":"Weapon charging up","dur":1.2,"free":false,"sprite":"SciFi","at":2.3345,"len":1.2},{"id":"scifi_charge_release","cat":"SciFi","name":"charge release","desc":"Charged shot release","dur":0.9,"free":false,"sprite":"SciFi","at":3.5845,"len":0.9},{"id":"scifi_ray_gun","cat":"SciFi","name":"ray gun","desc":"Wobbly retro ray gun","dur":0.7,"free":false,"sprite":"SciFi","at":4.5345,"len":0.7},{"id":"scifi_shield_up","cat":"SciFi","name":"shield up","desc":"Energy shield on","dur":0.8,"free":false,"sprite":"SciFi","at":5.2844,"len":0.8},{"id":"scifi_shield_down","cat":"SciFi","name":"shield down","desc":"Energy shield off","dur":0.7,"free":false,"sprite":"SciFi","at":6.1344,"len":0.7},{"id":"scifi_teleport","cat":"SciFi","name":"teleport","desc":"Teleport shimmer","dur":1.047,"free":false,"sprite":"SciFi","at":6.8843,"len":1.0472},{"id":"scifi_warp","cat":"SciFi","name":"warp","desc":"Warp drive jump","dur":1.5,"free":false,"sprite":"SciFi","at":7.9815,"len":1.5},{"id":"scifi_robot_beep","cat":"SciFi","name":"robot beep","desc":"Robot chatter beeps","dur":0.499,"free":false,"sprite":"SciFi","at":9.5315,"len":0.4994},{"id":"scifi_alarm_alert","cat":"SciFi","name":"alarm alert","desc":"Short alert klaxon","dur":0.839,"free":false,"sprite":"SciFi","at":10.0808,"len":0.8389},{"id":"scifi_scanner_sweep","cat":"SciFi","name":"scanner sweep","desc":"Scanner sweep","dur":1.0,"free":false,"sprite":"SciFi","at":10.9697,"len":1.0},{"id":"magic_sparkle","cat":"Magic","name":"sparkle","desc":"Magic sparkle","dur":0.798,"free":true,"sprite":"Magic","at":0.0,"len":0.7981},{"id":"magic_heal","cat":"Magic","name":"heal","desc":"Healing spell, gentle rise","dur":1.37,"free":false,"sprite":"Magic","at":0.8481,"len":1.3704},{"id":"magic_spell_cast","cat":"Magic","name":"spell cast","desc":"Generic spell cast","dur":1.09,"free":false,"sprite":"Magic","at":2.2685,"len":1.0903},{"id":"magic_fireball","cat":"Magic","name":"fireball","desc":"Fireball launch","dur":0.9,"free":false,"sprite":"Magic","at":3.4088,"len":0.9},{"id":"magic_ice_freeze","cat":"Magic","name":"ice freeze","desc":"Ice spell crackle","dur":0.9,"free":false,"sprite":"Magic","at":4.3588,"len":0.9},{"id":"magic_lightning","cat":"Magic","name":"lightning","desc":"Lightning strike","dur":1.6,"free":false,"sprite":"Magic","at":5.3088,"len":1.6},{"id":"magic_curse","cat":"Magic","name":"curse","desc":"Dark curse","dur":1.2,"free":false,"sprite":"Magic","at":6.9587,"len":1.2},{"id":"magic_buff_up","cat":"Magic","name":"buff up","desc":"Stat boost","dur":0.7,"free":false,"sprite":"Magic","at":8.2087,"len":0.7},{"id":"magic_debuff_down","cat":"Magic","name":"debuff down","desc":"Stat drop","dur":0.616,"free":false,"sprite":"Magic","at":8.9586,"len":0.6163},{"id":"magic_portal_open","cat":"Magic","name":"portal open","desc":"Portal opening","dur":1.8,"free":false,"sprite":"Magic","at":9.6249,"len":1.8},{"id":"magic_summon","cat":"Magic","name":"summon","desc":"Summoning","dur":1.919,"free":false,"sprite":"Magic","at":11.4749,"len":1.9195},{"id":"magic_mana_restore","cat":"Magic","name":"mana restore","desc":"Mana refill bubble","dur":0.8,"free":false,"sprite":"Magic","at":13.4444,"len":0.8},{"id":"magic_chime_magic","cat":"Magic","name":"chime magic","desc":"Crystal wind chime","dur":1.369,"free":false,"sprite":"Magic","at":14.2943,"len":1.369},{"id":"magic_levitate","cat":"Magic","name":"levitate","desc":"Floating up","dur":1.2,"free":false,"sprite":"Magic","at":15.7133,"len":1.2},{"id":"magic_dispel","cat":"Magic","name":"dispel","desc":"Magic dispelled, reverse shimmer","dur":0.9,"free":false,"sprite":"Magic","at":16.9633,"len":0.9},{"id":"jingles_level_up","cat":"Jingles","name":"level up","desc":"Level up fanfare","dur":0.854,"free":true,"sprite":"Jingles","at":0.0,"len":0.8544},{"id":"jingles_level_complete","cat":"Jingles","name":"level complete","desc":"Stage clear jingle","dur":1.673,"free":false,"sprite":"Jingles","at":0.9044,"len":1.6728},{"id":"jingles_win_fanfare","cat":"Jingles","name":"win fanfare","desc":"Victory fanfare","dur":1.72,"free":false,"sprite":"Jingles","at":2.6271,"len":1.7196},{"id":"jingles_game_over","cat":"Jingles","name":"game over","desc":"Game over, sad descent","dur":1.76,"free":true,"sprite":"Jingles","at":4.3967,"len":1.7596},{"id":"jingles_lose_life","cat":"Jingles","name":"lose life","desc":"Lose a life","dur":1.0,"free":false,"sprite":"Jingles","at":6.2063,"len":1.0},{"id":"jingles_start_game","cat":"Jingles","name":"start game","desc":"Press start","dur":0.697,"free":false,"sprite":"Jingles","at":7.2563,"len":0.6965},{"id":"jingles_pause","cat":"Jingles","name":"pause","desc":"Pause blip","dur":0.272,"free":false,"sprite":"Jingles","at":8.0028,"len":0.2717},{"id":"jingles_unpause","cat":"Jingles","name":"unpause","desc":"Unpause blip","dur":0.272,"free":false,"sprite":"Jingles","at":8.3245,"len":0.2717},{"id":"jingles_checkpoint","cat":"Jingles","name":"checkpoint","desc":"Checkpoint reached","dur":0.9,"free":false,"sprite":"Jingles","at":8.6462,"len":0.9},{"id":"jingles_countdown_tick","cat":"Jingles","name":"countdown tick","desc":"Countdown tick (3, 2, 1)","dur":0.139,"free":false,"sprite":"Jingles","at":9.5961,"len":0.1392},{"id":"jingles_countdown_go","cat":"Jingles","name":"countdown go","desc":"Countdown GO","dur":0.473,"free":false,"sprite":"Jingles","at":9.7853,"len":0.4729},{"id":"jingles_achievement","cat":"Jingles","name":"achievement","desc":"Achievement unlocked","dur":1.48,"free":false,"sprite":"Jingles","at":10.3082,"len":1.4796},{"id":"jingles_secret_found","cat":"Jingles","name":"secret found","desc":"Secret discovered","dur":0.88,"free":false,"sprite":"Jingles","at":11.8378,"len":0.8797},{"id":"jingles_quest_complete","cat":"Jingles","name":"quest complete","desc":"Quest complete","dur":2.208,"free":false,"sprite":"Jingles","at":12.7675,"len":2.2081},{"id":"jingles_high_score","cat":"Jingles","name":"high score","desc":"New high score","dur":1.026,"free":false,"sprite":"Jingles","at":15.0256,"len":1.0255}]}
|
blipwren/style.css
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
:root{--ink:#11141B;--paper:#F6F3EC;--card:#fff;--line:#e3ded2;--muted:#5b6070;--acc:#FFB020;--acc2:#6C4DF6;--acc2d:#5639d9;--ok:#0f8a5f}
|
| 2 |
+
*{box-sizing:border-box}
|
| 3 |
+
html{-webkit-text-size-adjust:100%}
|
| 4 |
+
body{margin:0;background:var(--paper);color:var(--ink);font:16px/1.55 system-ui,-apple-system,"Segoe UI",Roboto,Inter,sans-serif}
|
| 5 |
+
.wrap{max-width:1120px;margin:0 auto;padding:0 16px}
|
| 6 |
+
a{color:var(--acc2d)}
|
| 7 |
+
h1{font-size:clamp(28px,4.4vw,44px);line-height:1.12;margin:28px 0 10px;letter-spacing:-.02em}
|
| 8 |
+
h2{font-size:22px;margin:0 0 10px}
|
| 9 |
+
h3{font-size:17px;margin:18px 0 4px}
|
| 10 |
+
.top{background:var(--ink);color:#fff;position:sticky;top:0;z-index:5}
|
| 11 |
+
.top .btn{white-space:nowrap}
|
| 12 |
+
.top .wrap{display:flex;align-items:center;justify-content:space-between;height:56px;gap:12px}
|
| 13 |
+
.brand{display:flex;align-items:center;gap:8px;color:#fff;text-decoration:none;font-weight:800;font-size:19px}
|
| 14 |
+
.brand small{font-weight:500;opacity:.7;font-size:13px}
|
| 15 |
+
.btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;background:var(--acc);color:var(--ink);border:0;border-radius:10px;padding:10px 16px;font:inherit;font-weight:700;text-decoration:none;cursor:pointer;min-height:44px}
|
| 16 |
+
.btn:hover{filter:brightness(1.05)}
|
| 17 |
+
.btn.ghost{background:transparent;color:var(--ink);box-shadow:inset 0 0 0 2px var(--ink)}
|
| 18 |
+
.btn.small{padding:6px 12px;min-height:38px;font-size:14px}
|
| 19 |
+
.btn.buy{background:var(--acc2);color:#fff;width:100%;font-size:18px;margin:10px 0 6px}
|
| 20 |
+
.lede{font-size:18px;max-width:820px;color:#2a2f3a}
|
| 21 |
+
.facts{display:flex;flex-wrap:wrap;gap:10px;list-style:none;padding:0;margin:14px 0 18px}
|
| 22 |
+
.facts li{background:#fff;border:1px solid var(--line);border-radius:999px;padding:6px 14px;font-size:14px}
|
| 23 |
+
.card{background:var(--card);border:1px solid var(--line);border-radius:16px;padding:18px;margin:18px 0}
|
| 24 |
+
.player{background:var(--ink);color:#fff;border-color:var(--ink)}
|
| 25 |
+
.player .hint{color:#aeb3c2}
|
| 26 |
+
.toolbar{display:flex;flex-direction:column;gap:12px;margin-bottom:14px}
|
| 27 |
+
.tools{display:flex;flex-wrap:wrap;gap:10px 16px;align-items:center}
|
| 28 |
+
.tools input[type=search]{flex:1 1 240px;min-width:0;background:#1d2130;color:#fff;border:1px solid #333a4f;border-radius:10px;padding:10px 12px;font:inherit;min-height:44px}
|
| 29 |
+
.toggle,.vol{display:flex;align-items:center;gap:8px;font-size:14px;color:#dfe2ea}
|
| 30 |
+
.vol input{width:110px}
|
| 31 |
+
.player .btn.ghost{color:#fff;box-shadow:inset 0 0 0 2px #fff}
|
| 32 |
+
.chips{display:flex;flex-wrap:wrap;gap:8px}
|
| 33 |
+
.chip{background:#fff;color:var(--ink);border:1px solid var(--line);border-radius:999px;padding:6px 12px;font:inherit;font-size:14px;cursor:pointer;min-height:36px}
|
| 34 |
+
.player .chip{background:#1d2130;color:#dfe2ea;border-color:#333a4f}
|
| 35 |
+
.chip.on,.player .chip.on{background:var(--acc);color:var(--ink);border-color:var(--acc);font-weight:700}
|
| 36 |
+
.chip .n{opacity:.65;font-weight:500;margin-left:4px}
|
| 37 |
+
.grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:10px}
|
| 38 |
+
.snd{position:relative;display:flex;flex-direction:column;align-items:stretch;text-align:left;background:#1a1e2b;color:#fff;border:1px solid #2c3246;border-radius:12px;padding:10px 10px 8px;font:inherit;cursor:pointer;min-height:92px;transition:border-color .12s,transform .08s}
|
| 39 |
+
.snd:hover{border-color:var(--acc)}
|
| 40 |
+
.snd:active{transform:scale(.98)}
|
| 41 |
+
.snd.playing{border-color:var(--acc);box-shadow:0 0 0 2px var(--acc) inset}
|
| 42 |
+
.snd .nm{font-weight:700;font-size:15px;padding-right:44px;text-transform:capitalize}
|
| 43 |
+
.snd .ds{font-size:12.5px;color:#aeb3c2;line-height:1.3;margin-top:2px}
|
| 44 |
+
.snd canvas{width:100%;height:28px;margin-top:6px;display:block}
|
| 45 |
+
.snd .dur{position:absolute;top:10px;right:10px;font:12px/1 ui-monospace,Menlo,Consolas,monospace;color:#aeb3c2}
|
| 46 |
+
.free-badge{display:inline-block;background:var(--ok);color:#fff;font-size:11px;font-weight:800;letter-spacing:.04em;border-radius:6px;padding:2px 6px;vertical-align:middle}
|
| 47 |
+
.snd .foot{display:flex;justify-content:space-between;align-items:center;margin-top:6px;gap:8px}
|
| 48 |
+
.snd .dl{font-size:12px;color:#fff;background:#2c3246;border-radius:6px;padding:3px 7px;text-decoration:none}
|
| 49 |
+
.free-row{display:flex;flex-wrap:wrap;align-items:center;gap:10px 14px;margin-top:12px}
|
| 50 |
+
.pack-head{display:grid;grid-template-columns:1fr 280px;gap:24px}
|
| 51 |
+
.inside{padding-left:18px;margin:10px 0 0}
|
| 52 |
+
.inside li{margin:4px 0}
|
| 53 |
+
.price{background:var(--paper);border-radius:14px;padding:16px;text-align:center;align-self:start}
|
| 54 |
+
.price .big{font-size:46px;font-weight:900;line-height:1}
|
| 55 |
+
.bundle{margin-top:10px;font-size:14px;text-align:left;border-top:1px solid var(--line);padding-top:10px}
|
| 56 |
+
.hint{font-size:13.5px;color:var(--muted)}
|
| 57 |
+
.code pre{background:var(--ink);color:#e9ecf3;border-radius:12px;padding:14px;overflow:auto;font:13.5px/1.5 ui-monospace,Menlo,Consolas,monospace;margin:12px 0 6px}
|
| 58 |
+
.seo{max-width:860px}
|
| 59 |
+
.related{margin:26px 0}
|
| 60 |
+
.more{background:var(--ink);color:#cfd3dd;margin-top:30px;padding:22px 0}
|
| 61 |
+
.more a{color:#fff;margin-right:16px}
|
| 62 |
+
.more-title{font-weight:800;color:#fff;margin-bottom:6px}
|
| 63 |
+
.more-links{display:flex;flex-wrap:wrap;gap:6px 0}
|
| 64 |
+
.copy{font-size:12.5px;margin-top:10px;opacity:.75}
|
| 65 |
+
.toast{position:fixed;left:50%;bottom:20px;transform:translateX(-50%);background:var(--ink);color:#fff;padding:10px 16px;border-radius:10px;opacity:0;pointer-events:none;transition:opacity .2s;max-width:90vw}
|
| 66 |
+
.toast.on{opacity:1}
|
| 67 |
+
@media (max-width:760px){
|
| 68 |
+
.pack-head{grid-template-columns:1fr}
|
| 69 |
+
.grid{grid-template-columns:repeat(2,minmax(0,1fr))}
|
| 70 |
+
.snd .ds{display:none}
|
| 71 |
+
.snd{min-height:78px}
|
| 72 |
+
.vol input{width:90px}
|
| 73 |
+
h1{margin-top:20px}
|
| 74 |
+
.brand small{display:none}
|
| 75 |
+
.top .btn{padding:8px 12px;min-height:40px;font-size:15px}
|
| 76 |
+
}
|