diff --git a/gen_images.py b/gen_images.py deleted file mode 100644 index e88f9a5..0000000 --- a/gen_images.py +++ /dev/null @@ -1,135 +0,0 @@ -#!/usr/bin/env python3 -"""Generate PNPL landing page images using Gemini 3 Pro Image (Nano Banana Pro).""" - -import time, base64 -from pathlib import Path -from google import genai -from google.genai import types - -API_KEY = "AIzaSyCHnesXLjPw-UgeZaQotut66bgjFdvy12E" -MODEL = "gemini-3-pro-image-preview" -OUT_DIR = Path(r"C:\Users\uldvs\Downloads\PNPL Photography") -OUT_DIR.mkdir(parents=True, exist_ok=True) - -client = genai.Client(api_key=API_KEY) - -IMAGES = [ - # ── Main page ── - ("01-main-dashboard-hero", "16:9", - "Editorial product photography of a MacBook Pro on a minimal white desk showing a charity analytics dashboard with blue bar charts and a pipeline table. Clean desk with only a coffee cup and a single pen. Soft diffused daylight from the left. Shot on Sony A7III, 50mm f/2.8, shallow depth of field on the screen edges. Muted tones, magazine editorial style. Landscape orientation 16:9 aspect ratio."), - - ("02-main-charity-manager-card", "16:9", - "Candid documentary photograph of a British-Bangladeshi woman in her 40s wearing a dark navy hijab and tailored blazer, standing at the edge of a charity gala dinner in a London hotel ballroom. She holds a tablet at her side, looking across the room. Round tables with white cloths and warm tungsten pendant lights behind her, out of focus. Shot on Leica Q2, 28mm, f/1.7, available light only, natural film grain. Skin tones warm, background amber bokeh. No eye contact with camera. Landscape orientation 16:9 aspect ratio."), - - ("03-main-fundraiser-card", "16:9", - "Street photography of a young British-Somali man in his mid-20s wearing a grey crewneck sweatshirt, walking on a London residential street and looking down at his phone screen. Overcast daylight, Victorian terraced houses soft in the background. He is mid-stride, natural posture, not posing. Shot on Fujifilm X100V, 23mm, f/2, ISO 400, slight grain. Desaturated cool tones, editorial documentary feel. Landscape orientation 16:9 aspect ratio."), - - ("04-main-volunteer-card", "16:9", - "Candid indoor photograph of a young British-Pakistani woman in her early 20s wearing a plain volunteer lanyard on a black cord, leaning across a round banquet table pointing at a small printed card on the table. Warm overhead chandelier lighting in a mosque community hall, patterned carpet floor. Other seated guests softly blurred. Shot on Canon R6, 35mm f/1.4, shallow depth of field, warm amber tones. Natural, mid-conversation moment. Landscape orientation 16:9 aspect ratio."), - - ("05-main-org-card", "16:9", - "Documentary photograph of four people seated around a plain rectangular table in a small community centre meeting room. Mixed British ethnicities, business casual clothing. One person gestures at printed papers on the table, others listening. Overhead fluorescent strip lights mixed with grey window daylight. Institutional beige walls, a whiteboard partially visible behind. Shot on Nikon Z6, 28mm f/2.8, natural exposure, slightly flat lighting. No one looking at camera, mid-discussion. Landscape orientation 16:9 aspect ratio."), - - ("06-main-pledge-form", "1:1", - "Close-up over-the-shoulder photograph of a person holding an iPhone in their right hand at a dinner table. Screen shows a clean white mobile form with toggle switches and a green button, content not readable. A glass of water and folded linen napkin on the dark tablecloth beside the hand. Warm tungsten ambient light. Face not visible, only shoulder, arm, and hand in frame. Shot on 85mm f/1.8, tight crop, shallow depth of field on the screen. Natural skin tones, no flash. Square 1:1 aspect ratio."), - - ("07-main-schedule-step", "1:1", - "Overhead 45-degree photograph of a woman's hands holding a smartphone at a kitchen table. Soft morning window light from the left casting a gentle shadow. A ceramic mug of tea and a small plate with toast crumbs slightly out of focus behind the phone. The phone screen is bright white with blue accent elements, not readable. Domestic setting, wooden table surface. Shot on 50mm f/2.0, natural light only, warm muted tones. Quiet, everyday moment. Square 1:1 aspect ratio."), - - # ── Charities page ── - ("08-charities-hero", "1:1", - "Documentary portrait of a British-Bangladeshi man in his 50s wearing a white embroidered kufi cap, silver-framed reading glasses, and a pressed light blue shirt. He is seated at a side table during a mosque fundraising event, looking at an open laptop screen. Behind him, blurred rows of seated attendees in a large hall with green and gold decorations. Warm interior lighting, patterned Islamic geometric carpet visible on the floor. Shot on 56mm f/1.2, available light, rich warm tones, film grain. Candid, absorbed in his work. Square 1:1 aspect ratio."), - - ("09-charities-amount-selection", "1:1", - "Flat lay photograph of a hand holding an iPhone face-up on a dark navy tablecloth. The thumb hovers just above the bright screen. Visible beside the phone: silver cutlery, the edge of a white dinner plate, a printed menu card, and a glass of still water. Shot from directly above, 35mm, f/4, tungsten warm lighting from overhead chandeliers. The screen shows large numbers and a blue button, not readable. Charity dinner table setting, elegant but modest. Square 1:1 aspect ratio."), - - ("10-charities-whatsapp", "16:9", - "Candid photograph of a woman's hand holding a phone on her lap while sitting on a grey fabric sofa at home. The phone screen shows green WhatsApp message bubbles, text not readable. She wears a loose cardigan sleeve and a simple watch. A cushion and part of a wooden bookshelf with books visible softly in the background. Afternoon window daylight, warm golden hour tones. Shot on 50mm f/1.8, eye-level, shallow depth of field. Domestic, relaxed, real. Landscape orientation 16:9 aspect ratio."), - - # ── Fundraisers page ── - ("11-fundraisers-hero", "1:1", - "Street photography of a young British-Arab woman in her late 20s wearing a patterned burgundy hijab and a denim jacket, standing on a London high street and holding her phone screen towards a friend. The friend is partially visible and out of focus on the right edge of frame. Overcast flat daylight, shop fronts with awnings blurred behind. She is mid-laugh, natural expression. Shot on 85mm f/1.4, compressed background bokeh, desaturated cool tones with warm skin. Unstaged genuine interaction. Square 1:1 aspect ratio."), - - ("12-fundraisers-redirect", "1:1", - "Close-up of two hands holding a phone in a cafe. The screen shows a green-themed webpage with a large rounded button, generic and not readable. A marble cafe table surface with a flat white coffee in a ceramic cup and a torn croissant on a small plate beside the phone. Natural soft window light from the right. Shot on 50mm f/2.0, shallow depth of field focused on the phone screen. Warm cafe tones, European coffee shop atmosphere. No face visible. Square 1:1 aspect ratio."), - - ("13-fundraisers-dashboard", "16:9", - "Editorial product photography of a laptop screen showing a minimal analytics dashboard with a horizontal funnel chart in shades of blue, grey number cards across the top, and a simple data table below. The laptop sits on a clean white desk. Beside it, a small potted succulent and a closed notebook. Soft even studio lighting, no harsh shadows. Shot on 50mm f/4, sharp focus on screen, edges of laptop slightly soft. Clean, SaaS product marketing style. Landscape orientation 16:9 aspect ratio."), - - # ── Volunteers page ── - ("14-volunteers-hero", "1:1", - "Candid photograph of a young British-Pakistani man in his early 20s standing behind a round banquet table at a charity dinner. He wears a plain navy polo shirt and a clear plastic lanyard with a printed name badge. In the sharp foreground, a small clear acrylic A-frame stand with a QR code printed on white card sits on the white tablecloth. The volunteer is smiling at someone off-camera to the left. Background shows other round tables and warm pendant lighting, all soft and blurred. Shot on 35mm f/1.4 from table height, warm amber tones, available light. Energetic, genuine. Square 1:1 aspect ratio."), - - ("15-volunteers-phone-stats", "1:1", - "Dynamic low-angle photograph of a volunteer's torso and hand holding a phone at waist height. A black lanyard with a badge hangs from their neck, visible at the top of frame. The phone screen is bright showing a large number and a progress bar in blue, not readable. Behind and above, blurred figures walking through an event hall with overhead spotlights creating flare. Shot on 24mm f/2.0, slightly tilted angle, motion blur on background figures, available light. Raw, energetic, in-the-moment. Square 1:1 aspect ratio."), - - ("16-volunteers-leaderboard", "16:9", - "Editorial product photography of a phone screen showing a ranked list with numbered rows, small circular avatar placeholders, names, and bar charts beside each row. The phone lies flat on a dark surface. A lanyard and a paper name badge sit beside it. Soft directional studio light from the top left. Shot on macro lens, f/4, sharp focus on the screen, surroundings slightly dark. Clean, focused, app showcase. Landscape orientation 16:9 aspect ratio."), - - # ── Organisations page ── - ("17-orgs-hero-boardroom", "1:1", - "Documentary photograph of three people in a modest charity office meeting room around a rectangular table. A Black British woman in her 40s in a navy blazer is pointing at a laptop screen. A South Asian man in his 30s in a grey suit leans in to look. A white British man in his 50s in a rolled-sleeve shirt sits across, arms folded, listening. Papers and printed spreadsheets on the table. Grey carpet, a window with vertical blinds letting in flat daylight. Overhead fluorescent lighting. Shot on 28mm f/2.8, documentary wide angle, no one looking at camera, mid-discussion. Slightly cool tones, institutional setting. Square 1:1 aspect ratio."), - - ("18-orgs-pipeline", "1:1", - "Editorial product photography of a laptop screen showing a Kanban-style board with three columns of cards in white, each card showing a name, a currency amount, and a coloured status dot. The laptop is a MacBook on a plain wooden desk. A pair of reading glasses and a printed agenda document sit beside it. Soft even natural light from a window. Shot on 50mm f/3.5, focused on the screen, desk edges slightly out of focus. Neutral professional tones. Square 1:1 aspect ratio."), - - ("19-orgs-instalment-schedule", "16:9", - "Editorial product photography of a laptop screen showing a timeline or calendar view with monthly markers and progress bars in blue and grey. The laptop sits on a white conference table. Two chairs partially visible on either side, slightly blurred. A glass of water and a pen on the table. Clean fluorescent overhead lighting, even exposure. Shot on 35mm f/4, sharp focus on screen. Corporate clean, minimal, informational. Landscape orientation 16:9 aspect ratio."), - - ("20-orgs-laptop-desk", "1:1", - "Documentary photograph of a laptop open on a cluttered but real charity office desk. The screen shows a table with rows of data, not readable. A hand rests on the trackpad, wearing a simple watch. On the desk: a white ceramic mug with a tea bag tag hanging over the edge, a stack of manila folders, a small framed family photo, a desk lamp switched on. Mixed warm desk lamp light and cool daylight from a window on the right. Shot on 35mm f/2.0, focused on the laptop and hand, background slightly soft. Warm, lived-in, working moment. Square 1:1 aspect ratio."), -] - -def generate_image(filename, aspect, prompt): - out_path = OUT_DIR / f"{filename}.jpg" - if out_path.exists(): - print(f" SKIP (exists): {filename}") - return True - - print(f" Generating: {filename} ({aspect})...") - - try: - response = client.models.generate_content( - model=MODEL, - contents=prompt, - config=types.GenerateContentConfig( - response_modalities=["IMAGE", "TEXT"], - ), - ) - - for part in response.candidates[0].content.parts: - if part.inline_data: - img_bytes = part.inline_data.data - with open(out_path, "wb") as f: - f.write(img_bytes) - size_kb = len(img_bytes) / 1024 - print(f" DONE: {filename} ({size_kb:.0f} KB)") - return True - - print(f" FAIL: {filename} - no image in response") - return False - - except Exception as e: - print(f" ERROR: {filename} - {e}") - return False - - -if __name__ == "__main__": - print(f"Model: {MODEL} (Nano Banana Pro)") - print(f"Output: {OUT_DIR}") - print(f"Images: {len(IMAGES)}") - print() - - ok = 0 - fail = 0 - for i, (fn, asp, pr) in enumerate(IMAGES, 1): - print(f"[{i}/{len(IMAGES)}]") - if generate_image(fn, asp, pr): - ok += 1 - else: - fail += 1 - if i < len(IMAGES): - time.sleep(5) - - print(f"\nDone: {ok} generated, {fail} failed") - print(f"Files in: {OUT_DIR}") diff --git a/pledge-now-pay-later/src/app/(auth)/login/page.tsx b/pledge-now-pay-later/src/app/(auth)/login/page.tsx index bb89d74..c93c674 100644 --- a/pledge-now-pay-later/src/app/(auth)/login/page.tsx +++ b/pledge-now-pay-later/src/app/(auth)/login/page.tsx @@ -33,58 +33,56 @@ function LoginForm() { } } - // Auto-login as demo if ?demo=1 // eslint-disable-next-line react-hooks/exhaustive-deps useEffect(() => { if (isDemo) doLogin(undefined, "demo@pnpl.app", "demo1234") }, []) return ( -
Loading demo...
+Loading demo...
Sign in to your charity dashboard
Sign in to your charity dashboard
+
Don't have an account?{" "} - Get Started Free + Get Started Free
> )} @@ -132,7 +130,7 @@ function LoginForm() { export default function LoginPage() { return ( -Setting up your charity...
+Setting up your charity...
Free. 30 seconds. No card.
Free. 30 seconds. No card.
- Already have an account? Sign in +
+ Already have an account? Sign in
{count}
{fmt(amount)}
diff --git a/pledge-now-pay-later/src/app/dashboard/events/[id]/page.tsx b/pledge-now-pay-later/src/app/dashboard/events/[id]/page.tsx index 77ba007..8b7f7ee 100644 --- a/pledge-now-pay-later/src/app/dashboard/events/[id]/page.tsx +++ b/pledge-now-pay-later/src/app/dashboard/events/[id]/page.tsx @@ -141,7 +141,7 @@ export default function CampaignLinksPage() {💷 Claim 25p for every £1 donated by a UK taxpayer
@@ -101,7 +101,7 @@ export default function ExportsPage() {Returns pending reminders with donor contact info for external email/SMS.
💡 Connect to Zapier or n8n to send automatic reminder emails and SMS
diff --git a/pledge-now-pay-later/src/app/dashboard/layout.tsx b/pledge-now-pay-later/src/app/dashboard/layout.tsx index 6c23344..41283a6 100644 --- a/pledge-now-pay-later/src/app/dashboard/layout.tsx +++ b/pledge-now-pay-later/src/app/dashboard/layout.tsx @@ -24,31 +24,31 @@ export default function DashboardLayout({ children }: { children: React.ReactNod const user = session?.user as any return ( -