From 48fa508540cb41cc95ee54685de8101ee1ff838a Mon Sep 17 00:00:00 2001 From: lucasdpt Date: Sun, 14 Jun 2026 13:55:20 +0200 Subject: [PATCH] =?UTF-8?q?feat:=20logo/ic=C3=B4ne=20custom=20(monogramme?= =?UTF-8?q?=20OF=20voxel)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Badge sombre + "OF" en blocs biseautés (thème vert). electron-builder dérive l'ICO Windows et les PNG Linux depuis build/icon.png. Généré par scripts/gen-logo.mjs (SVG sans dépendance ; --png via resvg). Co-Authored-By: Claude Opus 4.8 --- build/icon.png | Bin 0 -> 31993 bytes build/icon.svg | 12 +++++ scripts/gen-logo.mjs | 105 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 117 insertions(+) create mode 100644 build/icon.png create mode 100644 build/icon.svg create mode 100644 scripts/gen-logo.mjs diff --git a/build/icon.png b/build/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..cbf1ea5296d8a286f198c6a8255deb2090ff9cda GIT binary patch literal 31993 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 literal 0 HcmV?d00001 diff --git a/build/icon.svg b/build/icon.svg new file mode 100644 index 0000000..6fc8876 --- /dev/null +++ b/build/icon.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/scripts/gen-logo.mjs b/scripts/gen-logo.mjs new file mode 100644 index 0000000..6e12363 --- /dev/null +++ b/scripts/gen-logo.mjs @@ -0,0 +1,105 @@ +#!/usr/bin/env node +/** + * Génère le logo/icône du launcher : monogramme "OF" en style voxel (blocs + * biseautés façon Minecraft) sur un badge sombre arrondi, accent vert du thème. + * + * node scripts/gen-logo.mjs -> build/icon.svg + * node scripts/gen-logo.mjs --png -> + build/icon.png (1024px) via @resvg/resvg-js + * + * electron-builder dérive ensuite l'ICO Windows et les PNG Linux depuis + * build/icon.png (directories.buildResources = build). + */ +import { writeFile } from 'node:fs/promises' +import { join } from 'node:path' + +const SIZE = 512 +const OUT = join(process.cwd(), 'build') + +// Palette (cohérente avec src/renderer/src/index.css). +const C = { + bgTop: '#1b2330', + bgBottom: '#0d1014', + border: '#2b3444', + base: '#3fb950', // vert accent + light: '#74e08a', // arête haut/gauche (lumière) + dark: '#218a3b' // arête bas/droite (ombre) +} + +// Matrices pixel des lettres (1 = bloc plein). +const O = ['01110', '10001', '10001', '10001', '10001', '10001', '01110'] +const F = ['1111', '1000', '1000', '1110', '1000', '1000', '1000'] + +const ROWS = 7 +const GAP_COLS = 1 +const COLS = O[0].length + GAP_COLS + F[0].length // 5 + 1 + 4 = 10 + +const cell = 40 // pas de la grille +const blockGap = 6 // espace entre blocs (effet grille pixel) +const bs = cell - blockGap // taille d'un bloc +const bevel = Math.round(bs * 0.18) // épaisseur du biseau + +const gridW = COLS * cell +const gridH = ROWS * cell +const x0 = (SIZE - gridW) / 2 +const y0 = (SIZE - gridH) / 2 + +/** Un bloc voxel : base + arêtes claires (haut/gauche) et sombres (bas/droite). */ +function block(col, row) { + const x = x0 + col * cell + blockGap / 2 + const y = y0 + row * cell + blockGap / 2 + const t = bevel + return [ + ``, + ``, + ``, + ``, + `` + ].join('') +} + +/** Rend une matrice à un décalage de colonnes donné. */ +function letter(matrix, colOffset) { + const out = [] + matrix.forEach((line, r) => { + ;[...line].forEach((px, c) => { + if (px === '1') out.push(block(colOffset + c, r)) + }) + }) + return out.join('') +} + +const blocks = letter(O, 0) + letter(F, O[0].length + GAP_COLS) + +const radius = 112 +const svg = ` + + + + + + + + +${blocks} + + +` + +async function main() { + await writeFile(join(OUT, 'icon.svg'), svg) + console.log('✓ build/icon.svg') + + if (process.argv.includes('--png')) { + const { Resvg } = await import('@resvg/resvg-js') + const png = new Resvg(svg, { fitTo: { mode: 'width', value: 1024 } }) + .render() + .asPng() + await writeFile(join(OUT, 'icon.png'), png) + console.log('✓ build/icon.png (1024px)') + } +} + +main().catch((e) => { + console.error(e.message) + process.exit(1) +})