feat: replace favicon with ROFL laughing emoji 🤣

- Updated icon.svg to use 🤣 emoji
- Added generate-favicon.mjs script for PNG generation
- Added canvas dependency for favicon generation

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Jeff Emmett 2025-12-25 23:17:43 -05:00
parent 73988e6378
commit 7a01ea37c2
4 changed files with 741 additions and 780 deletions

29
generate-favicon.mjs Normal file
View File

@ -0,0 +1,29 @@
import { createCanvas } from 'canvas';
import fs from 'fs';
// Generate emoji favicon PNGs
const sizes = [
{ name: 'icon-light-32x32.png', size: 32 },
{ name: 'icon-dark-32x32.png', size: 32 },
{ name: 'apple-icon.png', size: 180 },
];
for (const { name, size } of sizes) {
const canvas = createCanvas(size, size);
const ctx = canvas.getContext('2d');
// Transparent background
ctx.clearRect(0, 0, size, size);
// Draw emoji
const fontSize = size * 0.85;
ctx.font = `${fontSize}px "Segoe UI Emoji", "Apple Color Emoji", "Noto Color Emoji", sans-serif`;
ctx.textAlign = 'center';
ctx.textBaseline = 'middle';
ctx.fillText('🤣', size / 2, size / 2 + size * 0.05);
// Save
const buffer = canvas.toBuffer('image/png');
fs.writeFileSync(`public/${name}`, buffer);
console.log(`Generated ${name}`);
}

View File

@ -46,7 +46,7 @@
"embla-carousel-react": "8.5.1",
"input-otp": "1.4.1",
"lucide-react": "^0.454.0",
"next": "16.0.3",
"next": "16.0.10",
"next-themes": "^0.4.6",
"react": "19.2.0",
"react-day-picker": "9.8.0",

File diff suppressed because it is too large Load Diff

View File

@ -1,26 +1,3 @@
<svg width="180" height="180" viewBox="0 0 180 180" fill="none" xmlns="http://www.w3.org/2000/svg">
<style>
@media (prefers-color-scheme: light) {
.background { fill: black; }
.foreground { fill: white; }
}
@media (prefers-color-scheme: dark) {
.background { fill: white; }
.foreground { fill: black; }
}
</style>
<g clip-path="url(#clip0_7960_43945)">
<rect class="background" width="180" height="180" rx="37" />
<g style="transform: scale(95%); transform-origin: center">
<path class="foreground"
d="M101.141 53H136.632C151.023 53 162.689 64.6662 162.689 79.0573V112.904H148.112V79.0573C148.112 78.7105 148.098 78.3662 148.072 78.0251L112.581 112.898C112.701 112.902 112.821 112.904 112.941 112.904H148.112V126.672H112.941C98.5504 126.672 86.5638 114.891 86.5638 100.5V66.7434H101.141V100.5C101.141 101.15 101.191 101.792 101.289 102.422L137.56 66.7816C137.255 66.7563 136.945 66.7434 136.632 66.7434H101.141V53Z" />
<path class="foreground"
d="M65.2926 124.136L14 66.7372H34.6355L64.7495 100.436V66.7372H80.1365V118.47C80.1365 126.278 70.4953 129.958 65.2926 124.136Z" />
</g>
</g>
<defs>
<clipPath id="clip0_7960_43945">
<rect width="180" height="180" fill="white" />
</clipPath>
</defs>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
<text y="0.9em" font-size="90">🤣</text>
</svg>

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 115 B