From 58a99a0d9e3b2d339df3be3901af8584838183e1 Mon Sep 17 00:00:00 2001 From: Daniel Maksymilian Syrnicki Date: Wed, 26 Aug 2026 14:04:47 +0200 Subject: [PATCH] fix(website): sharper console banners on /logo/ (30 columns, coverage-sampled), no line gaps or phone text inflation Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_01MScAinbyMdeNc7H2BZdnnG --- website/assets/css/main.css | 3 ++- website/data/logo/m.json | 2 +- website/data/logo/r.json | 2 +- website/tools/logo-assets.py | 21 ++++++++++++++------- 4 files changed, 18 insertions(+), 10 deletions(-) diff --git a/website/assets/css/main.css b/website/assets/css/main.css index 3d04992..ca1d234 100644 --- a/website/assets/css/main.css +++ b/website/assets/css/main.css @@ -532,7 +532,8 @@ main.container { .tiles img { width: 6rem; height: 6rem; } .term { margin: 0; padding: 0.9rem 1rem; border-radius: 0.6rem; overflow-x: auto; - background: #100f0c; color: #d8d2c2; font-family: var(--font-mono); font-size: 0.6rem; line-height: 1.3; + background: #100f0c; color: #d8d2c2; font-family: var(--font-mono); font-size: 0.55rem; line-height: 1; + -webkit-text-size-adjust: none; text-size-adjust: none; } .term i, .term b { font-style: normal; font-weight: 400; color: inherit; } .show-cell--m .term i { color: #ff6b56; } .show-cell--m .term b { color: #ff6b56; } diff --git a/website/data/logo/m.json b/website/data/logo/m.json index ea69beb..7efa464 100644 --- a/website/data/logo/m.json +++ b/website/data/logo/m.json @@ -6,7 +6,7 @@ "lockup_s": "", "tab16": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABJklEQVR42sWRvUoDURCFv9msf1hoZyFCGmEjWks2iIkSi9gIIZ2FQWx9BX0Gn0GsrUwjCSmMaB1ICBEsxMJGK8F13bHYmFzWJQQi+HX3zsyZc88VIlyvry7YCf8YZQ9huXfdUeRyEu8s03h4MfvFPFTd1K5FcA4yTzyvIrK/edO6+iVQTa9sWxJUgAmG4wXKztZtu94XqGWT0+JNdUCWGI3H9znfKVS6HzaAeDMlUGNY7hUOc41W05yquc6pwAmQnH2zi8CFFZaCvNHn69dnMTocRYU8gN3buGjUnnN33SeAetpxEdkYDGkG/QkvdBwKKJbxH4Gx5Qj0YLDWcKCSMBzEk220y0A5JoM+FmMy1EE9kyqgrMVlMJKAqpaA2Az+7An/LzA232GMWfyHzvuOAAAAAElFTkSuQmCC", "full16": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABJUlEQVR42sWRz0oCYRTFf3dmkDbSbqCwTQQzPUGkgRriE6TQrnqGwKB1u54jwjbtIxzB0hdIC7fppjb92SQ1t0WMfZlOgUFnd7977uGc8wlj0Mh4yYFK0UaWABDt2ujZ2sXN0yhXzKFawnb7fgVlD0iOcB9BDrKXnUOB8JtAtYTt9vxjYIM4qFSzzc5mJGJF727fr/x4/BGnXE8v735x0Mh4yVeVnmH7NlRr6z7VDsonvEXkYNWvIeSAB03YqXxw9ewADFSKlpFZQ9leb7XPY3zM8hIWgFMHwBI89HN7t9Cp0YJ62ttXZMc4nDfK8AEcAFUS5ndEtlWlgLA4vgtmhgKTkGte583Z6GAIiykR6yBI+0fAyvgOfiGAMjexg7+K8P8CU+Md2cpUHzmzh4cAAAAASUVORK5CYII=", - "banner": " ▄▄██████▄▄\n ▄████████████▄\n ██████▀▀▀▀▀▀████\n ████▀ ████\n █████ ██████████\n █████ █████\n █████ ▄▄▄▄▄█████\n █████ ██████████\n █████ ██████████\n ▀▀▀▀ ▀▀▀▀▀▀▀▀▀", + "banner": " ▄▄▄▄▄▄▄▄\n ▄████████████▄\n ▄██████████████████\n ▄█████████▀▀▀▀▀▀▀████▄\n ▄██████▀ █████▄\n ██████▀ ██████\n ██████ █████████████\n ██████ ▀▀▀▀▀▀▀██████\n ██████ ██████\n ██████ ▄▄▄▄▄▄▄██████\n ██████ █████████████\n ██████ █████████████\n ██████ █████████████\n ██████ █████████████\n", "color": "#c03a28", "ink": "#0d0d0f" } \ No newline at end of file diff --git a/website/data/logo/r.json b/website/data/logo/r.json index fc38af4..44902d5 100644 --- a/website/data/logo/r.json +++ b/website/data/logo/r.json @@ -6,7 +6,7 @@ "lockup_s": "", "tab16": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAQCAYAAADJViUEAAAB4klEQVR42o2TPWhTYRSGn/Pdm7Qd/NnqpoPYqIvVguAP7SwUmlRrhw5qrx1dHF0c7OoiFElTOyhOpjFrJ6uIgihSKKYloiBCwSJ00bTJva9DbtubEKHveM77nPN+Bz4joYUgk3PGLYl+oCfR+gt8FJrLFVbLO0UDmL9xrPuQ3/3cIGuwLrQko8dhQxF6ZXI10CDQK3jR3dOYuPKouuUADqe68gYjwP3tTe9otrA6jngicRBRk6Jvkp4iKxtc3aqlZgDs5dSp84qi94iH2bnK3Z1IxckTgTM3S6veGXwQ3AEGXKToOlCv400nXV7kfgBImjazXD3tHcgWKhe2w8YDoCFj3JnUB1Ydm1v5nYQjz44DmNk9SQt+PZwCGJuv/gK+msg4sBSm7SQoMCPqjW/6zAsZ2qzXZtg7cw3o8umgUtCXNyyIR02EHn9uFr4vtfusFGQWDU5j9raZl1RkGrGkCYSsjKPenKeLghU/jplGOtd0mmdtGwSG0Y8UxqU0gB+P/pmdrZzZjT158g2mSwn4da7wZXC3fzvzGYHr9GbfC7OCUkwWUy4a7eTrCA/n1zYs4nEM54fzaxv7hvcrKwWZReAsUGw5kunI3sew9TZuFPjkA8vAAHCtZaoMQWjY5f8sXv4HrfW+WZX2x04AAAAASUVORK5CYII=", "full16": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAQCAYAAADJViUEAAAChUlEQVR42nWTT4jUZRjHP993fr/ZSSSKoFu4UDC/TQNLErrUVQndSaigw2o0oyRG7KkgFAKxS9TFIpp1W4I6eHCmdutSHcwgoaK10FndFkwIRNSD5u7On9/77TA7y4T1PT087/u8z/f7fd5HDKH58paHnHT3AtuwNg7yhtvgX9LEM7s+uvTXIB8GQaNaftWF3gLWdqMzwrPAVuFZxA9BeqrXC5ca1Wz/oEYAjVq2D/OeCOOVqQtnAOZeeuz+7obuTQhvS14BIHrE8qTFoT31i5/p5MHNG9NOfkVmb+XEwuzg1VMT2QMqcl1SE+j2+XseqWW7vqFd3JQUO/HNiEuBpDWsX6GUwyo2p2X+7uRh7oWZ81cBmtXs2HKpsyNER7CWovL5Rq38+qA4KRaSNbvGLb84Enpj6wbKP2E9mgQFsH9Emoxm5lQ1e6aU9w6s5Ms7giDEMLV7+sLnAq+zilpFjKy7Xam3vk1D3CpZ7UJ6OYT4LvBHVP5Oszr2Af+BZG2Oo83a2Bu5QdG/Wq6EGHaOn2h9//VrWx7uLPcWm7XsKqgN4OhRwbU1XdwLbOvrCSWItNPiEkAnp2Mh9c/bQ/f7nQW/Veqt/QY1atmk7GfTbvurL2rln2Ontx3II5x+rt56X+DmK9nHAGpWx45iPyglhyPdadDmQs6hPPFOrIOI47a+FP4Q/Gck31dwcgTpWuhTZTTSOy+FO2maPr77k4U5uve8BUC3dHjPVOubEP0EaClQ+B14BCCJuCx4GnmiUl84yf9gfPribeBAo1b+zvCp8Y2koLAYo88B9/3706+UjK4rWZloVLNVhlYM61whaDGB/CzSk8Dzw53c35l5o1130ZBvQTz7D8VtHXvXpMGjAAAAAElFTkSuQmCC", - "banner": " ▄▄████████▄▄\n ▄██▀ ██▄▄▄███▄\n▄█▀ ██▀▀▀▀ ▀█▄\n██ ████▀ ██\n██ ▄████▄ ██\n██████████████████\n██ ██████ ██\n██ ██ ██\n██ ██ ██\n██████████████████", + "banner": " ▄▄▄▄▄▄▄▄▄▄▄▄\n ▄▄████▀▀████▀▀████▄▄\n ▄██▀▀ ██ ▀▀██▄\n ██▀ ██████████ ▀██\n ███ ██ ▀██\n ████▄ ███████ ██\n ██▀▀██▄▄ ██ ██\n ██ ▀▀██▄▄██████▄ ██\n ██ ▀██▀▀ ▀▀██ ██\n ███████████ ███████████\n ██ ▀██▄ ▄██▀ ██\n ██ ▄██████████████▄ ██\n ██ ▄▄██▀▀ ▀██▀ ▀▀██▄▄ ██\n ████▀▀ ██ ▀▀████\n ██▀ ██ ▀██\n ██▄▄▄▄▄▄▄▄▄▄████▄▄▄▄▄▄▄▄▄▄██\n ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀", "color": "#af6428", "ink": "#151515" } \ No newline at end of file diff --git a/website/tools/logo-assets.py b/website/tools/logo-assets.py index f9a865e..cc7c8ad 100644 --- a/website/tools/logo-assets.py +++ b/website/tools/logo-assets.py @@ -204,16 +204,23 @@ def tile(k, size, pad=0.18, radius=None): return im -def banner(k): - """Half-block console art from the minimum tier, ~18 columns wide.""" - a = mark_png(k, "min", 20, "#000").split()[3] - cols, rows = a.size +def banner(k, cols=30): + """Half-block console art (~30 columns) from the interface tier. + + Sampled by coverage: the mark is rendered 4x and box-averaged down to + one sample per half-character, then thresholded at 50 %. + """ + _, _, w, h = MARKS[k]["vb"] + rows = round(cols * h / w) + rows += rows % 2 + a = raster(svg(k, "flat", "#000", standalone=True), cols * 4, rows * 4).split()[3] + a = a.resize((cols, rows), Image.BOX) lines = [] - for y in range(0, rows - 1, 2): + for y in range(0, rows, 2): s = "" for x in range(cols): - t = a.getpixel((x, y)) > 110 - b = a.getpixel((x, y + 1)) > 110 + t = a.getpixel((x, y)) > 128 + b = a.getpixel((x, y + 1)) > 128 s += "█" if t and b else "▀" if t else "▄" if b else " " lines.append(s.rstrip()) return "\n".join(lines)