Compare commits
10 Commits
6a6c6b2546
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| 37e0fb6508 | |||
| 2cc83d412e | |||
| 593c49065a | |||
| 4234d78975 | |||
| 7d72d2540a | |||
| 2abd6c529c | |||
| 8dbfa41da8 | |||
| 2945f07bd1 | |||
| 446d899121 | |||
| 6640fe7ce6 |
@@ -0,0 +1,4 @@
|
||||
CC BY-NC-SA 4.0
|
||||
|
||||
This work is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International.
|
||||
To view a copy of this license, visit https://creativecommons.org/licenses/by-nc-sa/4.0/
|
||||
@@ -1,3 +1,5 @@
|
||||
# assets
|
||||
# Assets
|
||||
|
||||
Media Assets for fz-stack
|
||||
Media Assets for fz-stack.
|
||||
|
||||

|
||||
|
||||
|
After Width: | Height: | Size: 3.0 MiB |
@@ -0,0 +1,98 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<body style="margin:0; background:#000;">
|
||||
|
||||
<script>
|
||||
async function inlineAndExport() {
|
||||
const parser = new DOMParser();
|
||||
|
||||
// Load background
|
||||
const bgText = await (await fetch("background.svg")).text();
|
||||
const bgDoc = parser.parseFromString(bgText, "image/svg+xml");
|
||||
const svg = bgDoc.documentElement;
|
||||
|
||||
// Find ALL <image> elements
|
||||
const imageEls = svg.querySelectorAll("image[href], image[xlink\\:href]");
|
||||
|
||||
for (const imgEl of imageEls) {
|
||||
const href = imgEl.getAttribute("href") || imgEl.getAttribute("xlink:href");
|
||||
|
||||
// Only inline SVG images (skip PNG/JPG/etc.)
|
||||
if (!href.endsWith(".svg")) continue;
|
||||
|
||||
// Load the referenced SVG
|
||||
const logoText = await (await fetch(href)).text();
|
||||
const logoDoc = parser.parseFromString(logoText, "image/svg+xml");
|
||||
const logoSvg = logoDoc.documentElement;
|
||||
|
||||
// Extract inner content
|
||||
const logoInner = Array.from(logoSvg.childNodes)
|
||||
.filter(n => n.nodeType === 1)
|
||||
.map(n => n.outerHTML)
|
||||
.join("");
|
||||
|
||||
// Read viewBox
|
||||
const vb = logoSvg.getAttribute("viewBox").split(" ").map(Number);
|
||||
const vbWidth = vb[2];
|
||||
const vbHeight = vb[3];
|
||||
|
||||
// Read <image> geometry
|
||||
const x = parseFloat(imgEl.getAttribute("x") || 0);
|
||||
const y = parseFloat(imgEl.getAttribute("y") || 0);
|
||||
const w = parseFloat(imgEl.getAttribute("width"));
|
||||
const h = parseFloat(imgEl.getAttribute("height"));
|
||||
|
||||
// Compute scale
|
||||
const scaleX = w / vbWidth;
|
||||
const scaleY = h / vbHeight;
|
||||
|
||||
// Create <g> wrapper
|
||||
const g = bgDoc.createElementNS("http://www.w3.org/2000/svg", "g");
|
||||
g.setAttribute("transform", `translate(${x},${y}) scale(${scaleX},${scaleY})`);
|
||||
|
||||
// Preserve width/height
|
||||
g.setAttribute("width", imgEl.getAttribute("width"));
|
||||
g.setAttribute("height", imgEl.getAttribute("height"));
|
||||
|
||||
g.innerHTML = logoInner;
|
||||
|
||||
// Replace <image> with <g>
|
||||
imgEl.replaceWith(g);
|
||||
}
|
||||
|
||||
// Serialize final SVG
|
||||
const finalSVG = new XMLSerializer().serializeToString(svg);
|
||||
const svg64 = btoa(unescape(encodeURIComponent(finalSVG)));
|
||||
|
||||
// Render to <img>
|
||||
const img = new Image();
|
||||
img.src = "data:image/svg+xml;base64," + svg64;
|
||||
await img.decode();
|
||||
|
||||
// Export helper
|
||||
function exportPNG(width, height, filename) {
|
||||
const canvas = document.createElement("canvas");
|
||||
canvas.width = width;
|
||||
canvas.height = height;
|
||||
const ctx = canvas.getContext("2d");
|
||||
ctx.drawImage(img, 0, 0, width, height);
|
||||
|
||||
const a = document.createElement("a");
|
||||
a.download = filename;
|
||||
a.href = canvas.toDataURL("image/png");
|
||||
a.click();
|
||||
}
|
||||
|
||||
// Export all sizes
|
||||
exportPNG(1920, 1080, "background-fhd.png");
|
||||
exportPNG(2560, 1440, "background-wqhd.png");
|
||||
exportPNG(3440, 1440, "background-uwqhd.png");
|
||||
exportPNG(3840, 2160, "background-4kuhd.png");
|
||||
}
|
||||
|
||||
inlineAndExport();
|
||||
</script>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
|
After Width: | Height: | Size: 1.0 MiB |
|
After Width: | Height: | Size: 2.0 MiB |
|
After Width: | Height: | Size: 1.5 MiB |
|
After Width: | Height: | Size: 16 KiB |
@@ -0,0 +1,26 @@
|
||||
|
||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣠⣴⣾⣷⣦⣄⡀
|
||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣠⣴⣾⣿⣿⣿⣿⣿⣿⣿⣿⣷⣦⣄⡀
|
||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣠⣴⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣦⣄⡀
|
||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡀⠚⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠗⢀
|
||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣤⣄⡉⠓⠦⣌⡙⠻⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠟⢋⣡⠴⠚⢉⣠⣤⣀
|
||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣤⣶⣿⣿⣿⣿⣿⣷⣦⣄⡉⠓⠦⣌⡙⠻⢿⣿⣿⣿⣿⣿⣿⡿⠟⢋⣡⠴⠚⢉⣠⣴⣾⣿⣿⣿⣿⣿⣶⣤
|
||||
⠀⠀⠀⠀⠀⠀⠀⠀⠐⣦⣄⡉⠛⠿⣿⣿⣿⣿⣿⣿⣿⣷⣦⣄⡉⠓⠦⣌⡙⠻⠟⢋⣡⠴⠚⢉⣠⣴⣾⣿⣿⣿⣿⣿⣿⣿⠿⠛⢉⣠⣴⠂
|
||||
⠀⠀⠀⠀⢀⣠⣴⣆⡈⠻⢿⣿⣷⣦⣄⡉⠛⠿⣿⣿⣿⣿⣿⣿⣿⣷⣦⣄⡉⠃⠘⢉⣠⣴⣾⣿⣿⣿⣿⣿⣿⣿⠿⠛⢉⣠⣴⣾⣿⡿⠟⢁⣰⣦⣄⡀
|
||||
⠀⠀⠐⠾⣿⣿⣿⣿⣿⣷⣦⣌⡙⠻⢿⣿⣷⣦⣄⡉⠛⠿⣿⣿⣿⣿⣿⣿⣿⣷⣾⣿⣿⣿⣿⣿⣿⣿⠿⠛⢉⣠⣴⣾⣿⡿⠟⢋⣡⣴⣾⣿⣿⣿⣿⣿⠷⠂
|
||||
⠀⢸⣷⣦⣄⡉⠛⠿⣿⣿⣿⣿⣿⣷⣦⣌⡙⠻⢿⣿⣷⣦⣄⡉⠛⠿⣿⣿⣿⣿⣿⣿⣿⣿⠿⠛⢉⣠⣴⣾⣿⡿⠟⢋⣡⣴⣾⣿⣿⣿⣿⣿⠿⠛⢉⣠⣴⣾⡇
|
||||
⠀⢸⣿⣿⣿⣿⣷⣦⣄⡉⠛⠿⣿⣿⣿⣿⣿⣷⣦⣌⡙⠻⢿⣿⣷⣦⣄⡉⠛⠿⠿⠛⢉⣠⣴⣾⣿⡿⠟⢋⣡⣴⣾⣿⣿⣿⣿⣿⠿⠛⢉⣠⣴⣾⣿⣿⣿⣿⡇
|
||||
⠀⠀⠉⠛⠿⣿⣿⣿⣿⣿⣷⣦⣄⡉⠛⠿⣿⣿⣿⣿⣿⣷⣦⣌⡙⠻⢿⣿⣷⡆⢰⣾⣿⡿⠟⢋⣡⣴⣾⣿⣿⣿⣿⣿⠿⠛⢉⣠⣴⣾⣿⣿⣿⣿⣿⠿⠛⠉
|
||||
⠀⠀⠀⠀⠀⠀⠉⠛⠿⣿⣿⣿⣿⣿⣷⣦⣄⡉⠛⠿⣿⣿⣿⣿⣿⣷⣦⣌⡙⠃⠘⢋⣡⣴⣾⣿⣿⣿⣿⣿⠿⠛⢉⣠⣴⣾⣿⣿⣿⣿⣿⠿⠛⠉
|
||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠛⠿⣿⣿⣿⣿⣿⣷⣦⣄⡉⠛⠿⣿⣿⣿⣿⣿⣷⣾⣿⣿⣿⣿⣿⠿⠛⢉⣠⣴⣾⣿⣿⣿⣿⣿⠿⠛⠉
|
||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠛⠿⣿⣿⣿⣿⣿⣷⣦⣄⡉⠛⠿⣿⣿⣿⣿⠿⠛⢉⣠⣴⣾⣿⣿⣿⣿⣿⠿⠛⠉
|
||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠛⠿⣿⣿⣿⣿⣿⣷⣦⣄⡉⢉⣠⣴⣾⣿⣿⣿⣿⣿⠿⠛⠉
|
||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠛⠿⣿⣿⣿⣿⡇⢸⣿⣿⣿⣿⠿⠛⠉
|
||||
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠛⠿⡇⢸⠿⠛⠉
|
||||
|
||||
__ _ _
|
||||
/ _|___ ___| |_ __ _ ___| | __
|
||||
| ||_ /____/ __| __/ _` |/ __| |/ /
|
||||
| _/ /_____\__ \ || (_| | (__| <
|
||||
|_|/___| |___/\__\__,_|\___|_|\_\
|
||||
|
||||
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 3.0 KiB |
@@ -0,0 +1,24 @@
|
||||
<svg
|
||||
width="512"
|
||||
height="512"
|
||||
viewBox="0 20 220 180"
|
||||
role="img"
|
||||
aria-labelledby="title desc"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
id="icon">
|
||||
<title id="title">fz-stack logo outline</title>
|
||||
<desc id="desc">
|
||||
Logo for fz-stack showing three flat, stacked geometric layers
|
||||
in Catppuccin Macchiato colors above the text “fz-stack”.
|
||||
Black and white high contrast outline only.
|
||||
</desc>
|
||||
<g id="stack-bottom">
|
||||
<path d="M110,140 L30,100 L30,85 L110,45 L190,85 L190,100 Z L110,125 L30,85 L110,125 L190,85 L110,125" fill="#ffffff" stroke="#000000" stroke-width="2" stroke-linejoin="round" stroke-linecap="round" />
|
||||
</g>
|
||||
<g id="stack-middle">
|
||||
<path d="M110,110 L50,80 L50,70 L110,40 L170,70 170,80 Z L110,100 L50,70 L110,100 L170,70 L110,100" fill="#ffffff" stroke="#000000" stroke-width="2" stroke-linejoin="round" stroke-linecap="round" />
|
||||
</g>
|
||||
<g id="stack-top">
|
||||
<path d="M110,82 L70,62 L70,57 L110,37 L150,57 L150,62 Z L110,77 L70,57 L110,77 L150,57 L110,77" fill="#ffffff" stroke="#000000" stroke-width="2" stroke-linejoin="round" stroke-linecap="round" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 22 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 23 KiB |
|
After Width: | Height: | Size: 14 KiB |
@@ -0,0 +1,2 @@
|
||||
*.woff2
|
||||
*.woff2.b64
|
||||
@@ -0,0 +1,12 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -x
|
||||
|
||||
pyftsubset /usr/share/fonts/inter/InterVariable.ttf \
|
||||
--output-file="InterVariableLogo.woff2" \
|
||||
--flavor=woff2 \
|
||||
--layout-features='*' \
|
||||
--unicodes='U+0066,U+007A,U+002D,U+0073,U+0074,U+0061,U+0063,U+006B'
|
||||
|
||||
|
||||
base64 -w 0 InterVariableLogo.woff2 > InterVariableLogo.woff2.b64
|
||||