import fs from 'node:fs'; import path from 'node:path'; import { fileURLToPath } from 'node:url'; import opentype from 'opentype.js'; import sharp from 'sharp'; const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..'); const outputDirectory = path.join(root, 'static', 'brand'); const fontDirectory = path.join( root, 'node_modules', '@fontsource', 'barlow', 'files', ); const heavy = opentype.parse( fs.readFileSync(path.join(fontDirectory, 'barlow-latin-900-normal.woff')) .buffer, ); const medium = opentype.parse( fs.readFileSync(path.join(fontDirectory, 'barlow-latin-700-normal.woff')) .buffer, ); fs.mkdirSync(outputDirectory, { recursive: true }); const colors = { background: '#0a0c0d', surface: '#111415', border: '#303536', grid: '#2a3031', orange: '#f6a821', white: '#ecebe5', }; function trackedPath(font, value, x, baseline, size, tracking = 0) { let cursor = x; let data = ''; for (const character of value) { const glyph = font.charToGlyph(character); data += glyph.getPath(cursor, baseline, size).toPathData(2); cursor += (glyph.advanceWidth * size) / font.unitsPerEm + tracking; } return { data, width: cursor - x - tracking }; } function emblem(x, y, size) { const scale = size / 100; return ` `; } async function writePng(svg, filename, width, height) { await sharp(Buffer.from(svg)) .resize(width, height, { fit: 'fill' }) .png({ compressionLevel: 9, adaptiveFiltering: true }) .toFile(path.join(outputDirectory, filename)); } const transparentLogo = ` ${emblem(72, 72, 880)} `; const serverIcon = ` ${emblem(132, 132, 760)} `; const shd = trackedPath(heavy, 'SHD', 0, 0, 190, -3); const build = trackedPath(heavy, '.build', 0, 0, 190, -2); const descriptor = trackedPath(medium, 'RESURGENCE DATA & TOOLS', 0, 0, 43, 7); const wordmarkWidth = shd.width + build.width; const lockupX = 600; const wordmarkBaseline = 590; const banner = ` ${emblem(188, 314, 330)} `; const inviteSplash = ` ${emblem(-92, 224, 620)} ${emblem(1465, 326, 410)} `; await writePng(transparentLogo, 'shd-core-segments.png', 1024, 1024); await writePng(serverIcon, 'shd-build-discord-icon.png', 1024, 1024); await writePng(banner, 'shd-build-discord-banner-1920x1080.png', 1920, 1080); await writePng( inviteSplash, 'shd-build-discord-invite-background-1920x1080.png', 1920, 1080, ); await sharp( path.join(outputDirectory, 'shd-build-discord-banner-1920x1080.png'), ) .resize(960, 540) .png({ compressionLevel: 9, adaptiveFiltering: true }) .toFile(path.join(outputDirectory, 'shd-build-discord-banner-960x540.png')); console.log(`Rendered brand assets to ${outputDirectory}`);