From b1c1b061f975b9c30be5c994c7a05cf6bbdeb107 Mon Sep 17 00:00:00 2001 From: darshan02parmar Date: Sat, 11 Oct 2025 12:23:25 +0530 Subject: [PATCH 1/6] feat: Add custom accent color picker and random theme generator --- CUSTOMIZATION_FEATURES.md | 134 ++++++++++ QUICK_PUSH_COMMANDS.md | 68 +++++ api/frames.js | 25 +- client/src/App.jsx | 249 +++++++++++++++++- package-lock.json | 538 +++++++++++++++++++++++++++++++++++++- package.json | 8 +- tsconfig.server.json | 10 +- 7 files changed, 1012 insertions(+), 20 deletions(-) create mode 100644 CUSTOMIZATION_FEATURES.md create mode 100644 QUICK_PUSH_COMMANDS.md diff --git a/CUSTOMIZATION_FEATURES.md b/CUSTOMIZATION_FEATURES.md new file mode 100644 index 0000000..335599e --- /dev/null +++ b/CUSTOMIZATION_FEATURES.md @@ -0,0 +1,134 @@ +# Custom Accent Color Picker & Random Theme Generator + +## Overview +This document describes the new personalization features added to the GitHub Avatar Frame API project. + +## Features Added + +### 1. Custom Accent Color Picker ๐ŸŽจ +- **Location**: Added below the theme selection area in the "Customization & Discovery" section +- **Functionality**: + - Color picker input for selecting custom accent colors + - Quick color presets with 6 popular colors + - Reset button to restore default theme colors + - Real-time preview with CSS variables +- **API Integration**: Custom colors are passed via `accentColor` parameter to the backend +- **Backend Processing**: Uses Sharp.js to apply color tinting and modulation to frames + +### 2. Random Theme Generator ๐ŸŽฒ +- **Location**: Next to the color picker in the "Customization & Discovery" section +- **Functionality**: + - Randomly selects one of the available themes + - 30% chance to also randomize accent color for extra variety + - Toast notifications for user feedback + - Disabled state when no themes are available +- **User Experience**: + - "โœจ Surprise Style Loaded!" for theme-only randomization + - "๐ŸŽฒ Random Theme + Color Applied!" when both theme and color are randomized + +### 3. Toast Notification System +- **Design**: Slide-in animation from the right +- **Duration**: 3 seconds auto-dismiss +- **Styling**: Matches the app's design system with proper dark/light mode support +- **Usage**: Provides feedback for random theme selection and color reset actions + +## Technical Implementation + +### Frontend (React) +- Added state management for `customAccentColor`, `originalThemeColor`, and toast notifications +- Updated API URL generation to include accent color parameter +- Enhanced UI with responsive design for mobile and desktop +- Added CSS animations for toast notifications + +### Backend (Node.js/Sharp.js) +- Added `accentColor` query parameter handling +- Implemented color processing using Sharp.js: + - Hex to RGB conversion + - Color tinting with custom colors + - Brightness and saturation modulation for better visual results + +### API Endpoints +- Updated `/api/framed-avatar/{username}` to accept `accentColor` parameter +- Example: `?theme=minimal&accentColor=%23ff6b6b&size=256` + +## System Architecture Flow + +``` +User Interface +โ”œโ”€โ”€ Theme Selection (existing) +โ”œโ”€โ”€ Custom Color Picker (new) +โ”‚ โ”œโ”€โ”€ Color Input Field +โ”‚ โ”œโ”€โ”€ Quick Color Presets +โ”‚ โ””โ”€โ”€ Reset Button +โ”œโ”€โ”€ Random Theme Generator (new) +โ”‚ โ”œโ”€โ”€ Random Theme Selection +โ”‚ โ””โ”€โ”€ Optional Random Color (30% chance) +โ””โ”€โ”€ Toast Notifications (new) + +API Request +โ”œโ”€โ”€ theme: selected theme +โ”œโ”€โ”€ accentColor: custom color (optional) +โ”œโ”€โ”€ size, canvas, shape, radius (existing) +โ””โ”€โ”€ style (existing) + +Backend Processing +โ”œโ”€โ”€ Fetch GitHub Avatar +โ”œโ”€โ”€ Load Theme Frame +โ”œโ”€โ”€ Apply Custom Color Tint (if provided) +โ”‚ โ”œโ”€โ”€ Convert hex to RGB +โ”‚ โ”œโ”€โ”€ Apply color modulation +โ”‚ โ””โ”€โ”€ Enhance brightness/saturation +โ””โ”€โ”€ Composite Final Image + +Response +โ””โ”€โ”€ Framed Avatar with Custom Colors +``` + +## User Experience Enhancements + +### Quick Color Presets +Six predefined colors for easy selection: +- Purple: `#7c3aed` +- Pink: `#ec4899` +- Orange: `#f97316` +- Green: `#10b981` +- Blue: `#3b82f6` +- Violet: `#8b5cf6` + +### Responsive Design +- Color picker and controls adapt to mobile screens +- Proper spacing and alignment across different screen sizes +- Touch-friendly button sizes + +### Accessibility +- Proper ARIA labels and tooltips +- Keyboard navigation support +- Color contrast compliance + +## Future Enhancements +- Save custom color combinations +- Export/import color themes +- Color history for recently used colors +- Advanced color picker with HSL/HSV support +- Theme preview with custom colors before generation + +## Usage Examples + +### Basic Custom Color +1. Select a theme (e.g., "minimal") +2. Click the color picker and choose a custom color +3. Generate the avatar with the custom accent color + +### Quick Color Selection +1. Use the quick color presets for instant color changes +2. Colors are applied immediately without opening the color picker + +### Random Theme Discovery +1. Click "๐ŸŽฒ Random Theme" to discover new themes +2. Sometimes includes random accent colors for extra variety +3. Toast notification confirms the selection + +### Reset to Default +1. When a custom color is selected, a "โ†ป Reset" button appears +2. Click to restore the original theme colors +3. Toast notification confirms the reset diff --git a/QUICK_PUSH_COMMANDS.md b/QUICK_PUSH_COMMANDS.md new file mode 100644 index 0000000..70857d1 --- /dev/null +++ b/QUICK_PUSH_COMMANDS.md @@ -0,0 +1,68 @@ +# ๐Ÿš€ Quick Push Commands + +## โšก Fast Track to Push + +### 1. Check Status +```bash +git status +``` + +### 2. Add All Changes +```bash +git add . +``` + +### 3. Commit with Feature Description +```bash +git commit -m "feat: Add custom accent color picker and random theme generator + +- Add custom accent color picker with hex color support +- Add 6 quick color presets for instant selection +- Add random theme generator with optional color randomization +- Add reset to default color functionality +- Add toast notification system with animations +- Update API to support accentColor parameter with Sharp.js processing +- Enhance UI with responsive design and accessibility features" +``` + +### 4. Push to Repository +```bash +git push origin main +``` + +## ๐Ÿ”„ Alternative: Feature Branch + +### Create Feature Branch +```bash +git checkout -b feature/custom-color-picker +git add . +git commit -m "feat: Add custom accent color picker and random theme generator" +git push origin feature/custom-color-picker +``` + +## ๐Ÿงช Quick Test Before Push + +### Start Servers +```bash +# Terminal 1 +npm run dev + +# Terminal 2 +cd client +npm run dev +``` + +### Test Features +- Open `http://localhost:5173` +- Test color picker +- Test random theme generator +- Generate avatar with custom color + +## โœ… Ready to Push! + +Your new features are ready: +- ๐ŸŽจ Custom accent color picker +- ๐ŸŽฒ Random theme generator +- โœจ Toast notifications +- ๐Ÿ“ฑ Responsive design +- ๐Ÿ”ง API enhancement diff --git a/api/frames.js b/api/frames.js index 6cae32a..3509c08 100644 --- a/api/frames.js +++ b/api/frames.js @@ -13,7 +13,8 @@ export default async function handler(req, res) { const username = req.query.username; const theme = req.query.theme || "base"; const size = Math.max(64, Math.min(Number(req.query.size || 256), 1024)); - const canvas= req.query.canvas || "light"; + const canvas = req.query.canvas || "light"; + const accentColor = req.query.accentColor || null; // Validate username if (!username || typeof username !== "string" || username.trim() === "") { return res.status(400).json({ error: "Username is required" }); @@ -82,10 +83,24 @@ export default async function handler(req, res) { .toBuffer(); // only resize frame if it was successfully loaded if(frameBuffer){ - frameResized = await sharp(frameBuffer) - .resize(size, size) - .png() - .toBuffer(); + let frameProcessor = sharp(frameBuffer).resize(size, size); + + // Apply custom accent color if provided + if (accentColor) { + // Convert hex color to RGB for processing + const hex = accentColor.replace('#', ''); + const r = parseInt(hex.substr(0, 2), 16); + const g = parseInt(hex.substr(2, 2), 16); + const b = parseInt(hex.substr(4, 2), 16); + + // Apply color tint to the frame + frameProcessor = frameProcessor.modulate({ + brightness: 1.1, // Slightly brighten + saturation: 1.3, // Increase saturation + }).tint({ r, g, b }); + } + + frameResized = await frameProcessor.png().toBuffer(); } // composition logic for transparency and avatar clipping let imageProcessor; diff --git a/client/src/App.jsx b/client/src/App.jsx index 2c64e7a..e1b23be 100644 --- a/client/src/App.jsx +++ b/client/src/App.jsx @@ -192,6 +192,8 @@ function App() { const [username, setUsername] = useState(""); const [themes, setThemes] = useState([]); const [selectedTheme, setSelectedTheme] = useState("base"); + const [customAccentColor, setCustomAccentColor] = useState(null); + const [originalThemeColor, setOriginalThemeColor] = useState(null); const [size, setSize] = useState(384); const [canvas, setCanvas] = useState("light"); const [shape, setShape] = useState("circle"); @@ -206,6 +208,8 @@ function App() { const [copied, setCopied] = useState(false); const [currentStep, setCurrentStep] = useState(1); const [isCommunityModalOpen, setIsCommunityModalOpen] = useState(false); + const [toastMessage, setToastMessage] = useState(""); + const [showToast, setShowToast] = useState(false); // System Theme State const [isDark, setIsDark] = useState(false); @@ -308,7 +312,13 @@ function App() { }; const copyApiUrl = () => { - const apiUrl = `${API_BASE_URL}/api/framed-avatar/${username}?theme=${selectedTheme}&size=${size}&canvas=${canvas}&shape=${shape}&radius=${finalRadiusForDisplay}&style=${frameStyle}`; + let apiUrl = `${API_BASE_URL}/api/framed-avatar/${username}?theme=${selectedTheme}&size=${size}&canvas=${canvas}&shape=${shape}&radius=${finalRadiusForDisplay}&style=${frameStyle}`; + + // Add custom accent color if selected + if (customAccentColor) { + apiUrl += `&accentColor=${encodeURIComponent(customAccentColor)}`; + } + try { // Use document.execCommand('copy') for better compatibility in iframe environments const tempInput = document.createElement("textarea"); @@ -339,7 +349,12 @@ function App() { try { const finalRadius = shape === "circle" ? maxRadius : radius; - const url = `${API_BASE_URL}/api/framed-avatar/${username}?theme=${selectedTheme}&size=${size}&canvas=${canvas}&shape=${shape}&radius=${finalRadius}&style=${frameStyle}`; + let url = `${API_BASE_URL}/api/framed-avatar/${username}?theme=${selectedTheme}&size=${size}&canvas=${canvas}&shape=${shape}&radius=${finalRadius}&style=${frameStyle}`; + + // Add custom accent color if selected + if (customAccentColor) { + url += `&accentColor=${encodeURIComponent(customAccentColor)}`; + } // Create AbortController for timeout const controller = new AbortController(); @@ -390,6 +405,51 @@ function App() { const handleThemeSelect = (theme) => { setSelectedTheme(theme); setCurrentStep(3); + // Reset custom color when selecting a new theme + setCustomAccentColor(null); + setOriginalThemeColor(null); + }; + + const handleRandomTheme = () => { + if (themes.length === 0) return; + + const randomIndex = Math.floor(Math.random() * themes.length); + const randomTheme = themes[randomIndex]; + + setSelectedTheme(randomTheme.theme); + + // Randomly decide whether to also randomize accent color (30% chance) + const shouldRandomizeColor = Math.random() < 0.3; + if (shouldRandomizeColor) { + const randomColors = ["#7c3aed", "#ec4899", "#f97316", "#10b981", "#3b82f6", "#8b5cf6", "#ef4444", "#f59e0b"]; + const randomColor = randomColors[Math.floor(Math.random() * randomColors.length)]; + setCustomAccentColor(randomColor); + showToastNotification("๐ŸŽฒ Random Theme + Color Applied!"); + } else { + setCustomAccentColor(null); + showToastNotification("โœจ Surprise Style Loaded!"); + } + + setOriginalThemeColor(null); + setCurrentStep(3); + }; + + const showToastNotification = (message) => { + setToastMessage(message); + setShowToast(true); + setTimeout(() => { + setShowToast(false); + }, 3000); + }; + + const handleCustomColorChange = (color) => { + setCustomAccentColor(color); + }; + + const resetToDefaultColor = () => { + setCustomAccentColor(null); + setOriginalThemeColor(null); + showToastNotification("๐ŸŽจ Reset to Default Color"); }; const finalRadiusForDisplay = shape === "circle" ? maxRadius : radius; @@ -788,6 +848,139 @@ function App() { )} + {/* Custom Color Picker and Random Theme Generator */} +
+ +
+ {/* Custom Accent Color Picker */} +
+ + handleCustomColorChange(e.target.value)} + style={{ + width: "40px", + height: "40px", + border: `2px solid ${colors.border}`, + borderRadius: "8px", + cursor: "pointer", + background: "transparent", + padding: 0, + }} + title="Customize accent color" + /> + {customAccentColor && ( + + )} +
+ + {/* Quick Color Presets */} +
+ Quick: + {["#7c3aed", "#ec4899", "#f97316", "#10b981", "#3b82f6", "#8b5cf6"].map((color) => ( +
+ + {/* Random Theme Generator */} + +
+
+ {/* Control Group: Canvas & Shape */}
- {`${API_BASE_URL}/api/framed-avatar/${username}?theme=${selectedTheme}&size=${size}&canvas=${canvas}&shape=${shape}&radius=${finalRadiusForDisplay}`} + {(() => { + let apiUrl = `${API_BASE_URL}/api/framed-avatar/${username}?theme=${selectedTheme}&size=${size}&canvas=${canvas}&shape=${shape}&radius=${finalRadiusForDisplay}&style=${frameStyle}`; + if (customAccentColor) { + apiUrl += `&accentColor=${encodeURIComponent(customAccentColor)}`; + } + return apiUrl; + })()}
@@ -1261,6 +1460,49 @@ function App() { colors={colors} /> + {/* Toast Notification */} + {showToast && ( +
+
+ +
+ + {toastMessage} + +
+ )} + - ); + } /> + } /> + + +); } export default App; diff --git a/client/src/pages/NotFound.jsx b/client/src/pages/NotFound.jsx new file mode 100644 index 0000000..b64f6d7 --- /dev/null +++ b/client/src/pages/NotFound.jsx @@ -0,0 +1,146 @@ +import React, { useEffect, useState } from "react"; +import { useNavigate } from "react-router-dom"; +import { Home, AlertCircle, Sparkles } from "lucide-react"; + +function NotFound() { + const navigate = useNavigate(); + const [isDark, setIsDark] = useState(false); + + useEffect(() => { + const checkDark = window.matchMedia("(prefers-color-scheme: dark)").matches; + setIsDark(checkDark); + + const mediaQuery = window.matchMedia("(prefers-color-scheme: dark)"); + const handler = (e) => setIsDark(e.matches); + mediaQuery.addEventListener("change", handler); + return () => mediaQuery.removeEventListener("change", handler); + }, []); + + const colors = { + textPrimary: isDark ? "#e5e7eb" : "#111827", + textSecondary: isDark ? "#9ca3af" : "#6b7280", + bgBody: isDark + ? "#0F172A" + : "linear-gradient(135deg, #e0e7ff 0%, #f3e8ff 50%, #fce7f3 100%)", + bgCard: isDark ? "#1E293B" : "white", + border: isDark ? "#374151" : "#e5e7eb", + accentPrimary: "#7c3aed", + accentSecondary: "#a855f7", + }; + + return ( +
+
+
+
+ + +
+
+ +

+ 404 +

+ +

+ Page Not Found +

+ +

+ Oops! It looks like you've wandered into uncharted territory. The page + you're looking for doesn't exist or may have been moved. +

+ + +
+
+ ); +} + +export default NotFound; diff --git a/public/frames/starry/metadata.json b/public/frames/starry/metadata.json index bb6326f..7667614 100644 --- a/public/frames/starry/metadata.json +++ b/public/frames/starry/metadata.json @@ -2,5 +2,5 @@ "name": "Starry Theme", "author": "vishal", "description": "Black and Red Theme frame", -ย ย "size":ย 256 + "size": 256 } From d56bea19f9837cfe65510f3801d9e2a01cf55d0f Mon Sep 17 00:00:00 2001 From: darshan02parmar Date: Mon, 13 Oct 2025 23:07:10 +0530 Subject: [PATCH 6/6] Proper Emoji display --- api/server.ts | 2 +- test.png | Bin 0 -> 38641 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 test.png diff --git a/api/server.ts b/api/server.ts index 1d27020..8c4d810 100644 --- a/api/server.ts +++ b/api/server.ts @@ -152,7 +152,7 @@ app.get("/api/framed-avatar/:username", async (req: Request, res: Response) => { const textPosition = ((req.query.textPosition as string) || "bottom").toLowerCase(); // Emoji overlay parameters - const emojis = req.query.emojis as string | undefined; + const emojis = req.query.emojis ? decodeURIComponent(req.query.emojis as string) : undefined; const emojiSizeStr = (req.query.emojiSize as string) || "40"; const emojiPosition = ((req.query.emojiPosition as string) || "top").toLowerCase(); diff --git a/test.png b/test.png new file mode 100644 index 0000000000000000000000000000000000000000..c45e77da597a3d9526f31dd09cfd1f84271ab589 GIT binary patch literal 38641 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 $C66YgMFMxEo;(vee0>uSy-= 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