Fraser commited on
Commit
deb38a3
·
1 Parent(s): d60484d
Files changed (1) hide show
  1. src/lib/services/picletExport.ts +34 -24
src/lib/services/picletExport.ts CHANGED
@@ -10,9 +10,9 @@ export async function generateShareableImage(piclet: PicletInstance): Promise<Bl
10
  const ctx = canvas.getContext('2d');
11
  if (!ctx) throw new Error('Could not create canvas context');
12
 
13
- // Set canvas size - narrower width to match content, tighter height
14
- const canvasWidth = 700;
15
- const canvasHeight = 700; // Square format, tighter
16
  canvas.width = canvasWidth;
17
  canvas.height = canvasHeight;
18
 
@@ -35,37 +35,47 @@ export async function generateShareableImage(piclet: PicletInstance): Promise<Bl
35
 
36
  // Load piclet image first
37
  const picletImg = await loadImage(piclet.imageData || piclet.imageUrl);
38
- const picletSize = 512;
39
- const picletX = (canvasWidth - picletSize) / 2;
40
- const picletY = 120; // Position piclet closer to top, leaving room for name
41
 
42
  // Load and draw grass platform positioned under the piclet
43
  const grassImg = await loadImage('/assets/grass.PNG');
44
- const platformSize = 1024; // Slightly larger than piclet
45
  const platformX = (canvasWidth - platformSize) / 2;
46
- const platformY = picletY + 512;
47
  ctx.drawImage(grassImg, platformX, platformY, platformSize, platformSize);
48
 
49
  // Draw piclet on top of platform
50
  ctx.drawImage(picletImg, picletX, picletY, picletSize, picletSize);
51
 
52
- // Add piclet name with video game font
53
- ctx.fillStyle = 'white';
54
- ctx.strokeStyle = '#1e3a8a'; // Dark blue outline
55
- ctx.lineWidth = 8;
56
- // Try to use a more gaming-style font, fallback to Impact
57
- ctx.font = 'bold 64px "Press Start 2P", "Courier New", Impact, monospace';
 
 
 
 
58
  ctx.textAlign = 'center';
59
- ctx.shadowColor = 'rgba(0, 0, 0, 0.8)';
60
- ctx.shadowBlur = 10;
61
- ctx.shadowOffsetX = 4;
62
- ctx.shadowOffsetY = 4;
63
 
64
- const nameText = piclet.nickname || piclet.typeId;
 
 
 
 
 
 
 
 
 
65
 
66
- // Draw name with outline and shadow
67
- ctx.strokeText(nameText, canvasWidth / 2, 80);
68
- ctx.fillText(nameText, canvasWidth / 2, 80);
69
 
70
  // Reset shadow
71
  ctx.shadowColor = 'transparent';
@@ -75,9 +85,9 @@ export async function generateShareableImage(piclet: PicletInstance): Promise<Bl
75
 
76
  // Load and draw translucent watermark
77
  const logoImg = await loadImage('/assets/snap_logo.png');
78
- const logoSize = 120;
79
  ctx.globalAlpha = 0.3; // More translucent
80
- ctx.drawImage(logoImg, canvasWidth - logoSize - 20, canvasHeight - logoSize - 20, logoSize, logoSize);
81
  ctx.globalAlpha = 1.0;
82
 
83
  // Get the image as blob
 
10
  const ctx = canvas.getContext('2d');
11
  if (!ctx) throw new Error('Could not create canvas context');
12
 
13
+ // Set canvas size - full piclet size plus padding for name
14
+ const canvasWidth = 1024;
15
+ const canvasHeight = 1200; // Extra height for name
16
  canvas.width = canvasWidth;
17
  canvas.height = canvasHeight;
18
 
 
35
 
36
  // Load piclet image first
37
  const picletImg = await loadImage(piclet.imageData || piclet.imageUrl);
38
+ const picletSize = 1024; // Full size!
39
+ const picletX = 0;
40
+ const picletY = 150; // Leave room for name at top
41
 
42
  // Load and draw grass platform positioned under the piclet
43
  const grassImg = await loadImage('/assets/grass.PNG');
44
+ const platformSize = 1200; // Larger than piclet for proper positioning
45
  const platformX = (canvasWidth - platformSize) / 2;
46
+ const platformY = picletY + picletSize - 300; // Platform under piclet
47
  ctx.drawImage(grassImg, platformX, platformY, platformSize, platformSize);
48
 
49
  // Draw piclet on top of platform
50
  ctx.drawImage(picletImg, picletX, picletY, picletSize, picletSize);
51
 
52
+ // Add sleek modern text styling
53
+ const nameText = piclet.nickname || piclet.typeId;
54
+
55
+ // Create gradient for text
56
+ const gradient = ctx.createLinearGradient(0, 50, 0, 120);
57
+ gradient.addColorStop(0, '#ffffff');
58
+ gradient.addColorStop(1, '#e0e0e0');
59
+
60
+ // Modern sleek font with gradient and subtle shadow
61
+ ctx.font = 'bold 72px -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Arial, sans-serif';
62
  ctx.textAlign = 'center';
63
+ ctx.textBaseline = 'middle';
 
 
 
64
 
65
+ // Subtle shadow for depth
66
+ ctx.shadowColor = 'rgba(0, 0, 0, 0.3)';
67
+ ctx.shadowBlur = 15;
68
+ ctx.shadowOffsetX = 0;
69
+ ctx.shadowOffsetY = 3;
70
+
71
+ // Dark outline for contrast
72
+ ctx.strokeStyle = '#2c3e50';
73
+ ctx.lineWidth = 4;
74
+ ctx.strokeText(nameText.toUpperCase(), canvasWidth / 2, 80);
75
 
76
+ // Fill with gradient
77
+ ctx.fillStyle = gradient;
78
+ ctx.fillText(nameText.toUpperCase(), canvasWidth / 2, 80);
79
 
80
  // Reset shadow
81
  ctx.shadowColor = 'transparent';
 
85
 
86
  // Load and draw translucent watermark
87
  const logoImg = await loadImage('/assets/snap_logo.png');
88
+ const logoSize = 150;
89
  ctx.globalAlpha = 0.3; // More translucent
90
+ ctx.drawImage(logoImg, canvasWidth - logoSize - 30, canvasHeight - logoSize - 30, logoSize, logoSize);
91
  ctx.globalAlpha = 1.0;
92
 
93
  // Get the image as blob