Files
FamReynaBrain/exports/build_emi_latin_america_slides.py
T
2026-09-22 23:00:26 -04:00

141 lines
8.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
from reportlab.pdfgen import canvas
from reportlab.lib.colors import HexColor, Color
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
from reportlab.lib.utils import simpleSplit
from pathlib import Path
OUT = Path('/Users/adolforeyna/brain/exports/emi_latin_america_vision_slides_2026-09-22.pdf')
W,H = 960,540
BG=HexColor('#F7F3EA'); INK=HexColor('#172A25'); GREEN=HexColor('#1F5946'); MINT=HexColor('#CDE1D1'); GOLD=HexColor('#D7A850'); RUST=HexColor('#B9684C'); MUTED=HexColor('#62736A'); WHITE=HexColor('#FFFFFF'); PALE=HexColor('#EAE4D6')
pdfmetrics.registerFont(TTFont('Georgia','/System/Library/Fonts/Supplemental/Georgia.ttf'))
pdfmetrics.registerFont(TTFont('Arial','/System/Library/Fonts/Supplemental/Arial.ttf'))
pdfmetrics.registerFont(TTFont('ArialB','/System/Library/Fonts/Supplemental/Arial Bold.ttf'))
c=canvas.Canvas(str(OUT), pagesize=(W,H), pageCompression=1)
c.setTitle('EMI | A Vision and Mission for Latin America')
c.setAuthor('EMI — based on Vision_for_Latin_America_final.docx')
def base(n, dark=False):
c.setFillColor(INK if dark else BG); c.rect(0,0,W,H,fill=1,stroke=0)
c.setFillColor(GOLD); c.setFont('ArialB',10); c.drawString(48,26,'EMI / LATIN AMERICA')
c.setFillColor(Color(1,1,1,.50) if dark else MUTED); c.setFont('Arial',9); c.drawRightString(W-48,26,f'VISION • MISSION / {n:02d}')
def txt(s,x,y,size=16,font='Arial',color=INK):
c.setFillColor(color); c.setFont(font,size); c.drawString(x,y,s)
def para(s,x,y,width,size=15,leading=22,font='Arial',color=INK):
c.setFillColor(color); c.setFont(font,size)
for line in simpleSplit(s,font,size,width): c.drawString(x,y,line); y-=leading
return y
def pill(s,x,y,fill=MINT,color=GREEN):
c.setFont('ArialB',10); w=pdfmetrics.stringWidth(s,'ArialB',10)+24
c.setFillColor(fill); c.roundRect(x,y-6,w,24,12,fill=1,stroke=0)
txt(s,x+12,y+1,10,'ArialB',color)
def line(x1,y1,x2,y2,col=GOLD,width=2):
c.setStrokeColor(col); c.setLineWidth(width); c.line(x1,y1,x2,y2)
def circ(x,y,r,col): c.setFillColor(col); c.circle(x,y,r,fill=1,stroke=0)
# 1 Cover
base(1,True)
c.setFillColor(GOLD); c.rect(0,0,12,H,fill=1,stroke=0)
pill('A SHARED REGIONAL CALL',58,452,fill=HexColor('#315346'),color=HexColor('#F2D69A'))
txt('A vision & mission',58,365,43,'Georgia',WHITE)
txt('for Latin America',58,311,43,'Georgia',WHITE)
para('One spiritual family, moving together to establish lasting expressions of the Kingdom of God.',60,250,470,19,29,'Arial',HexColor('#DDE6DF'))
line(60,144,400,144,GOLD,3)
txt('“Go and make disciples of all nations.”',60,112,17,'Georgia',HexColor('#F2D69A'))
txt('MATTHEW 28:18–20',60,83,10,'ArialB',HexColor('#DDE6DF'))
# abstract regional sunrise / connected people
for i,(x,y,r) in enumerate([(660,300,76),(780,354,52),(826,236,66),(690,186,42),(746,275,18)]): circ(x,y,r,[GREEN,HexColor('#2E7556'),RUST,GOLD,MINT][i])
for a,b in [((660,300),(780,354)),((660,300),(826,236)),((660,300),(690,186)),((780,354),(826,236)),((690,186),(826,236))]: line(*a,*b,HexColor('#D5BC85'),1.5)
c.showPage()
# 2 north star
base(2)
pill('THE NORTH STAR',52,465)
txt('The vision is bigger than a visit.',52,396,31,'Georgia')
para('Rooted in Jesus’ commission, the regional vision is to see God’s Kingdom and family established among every ethnos—every nation, people, and people group.',55,343,720,17,25,'Arial',MUTED)
# focal diagram
circ(480,188,92,GREEN); txt('KINGDOM',430,197,16,'ArialB',WHITE); txt('& FAMILY',427,173,16,'ArialB',WHITE)
for x,y,l in [(200,213,'NATIONS'),(760,213,'DISCIPLES'),(325,92,'BAPTIZE'),(635,92,'TEACH & OBEY')]:
circ(x,y,42,MINT); c.setFillColor(GREEN); c.setFont('ArialB',10); c.drawCentredString(x,y-4,l)
line(480,188,x,y,GOLD,1.5)
txt('Not merely building churches: making disciples who learn to live Jesus’ way.',196,47,13,'Georgia',INK)
c.showPage()
# 3 mission
base(3)
pill('THE MISSION',52,465)
txt('How the family carries the vision',52,403,30,'Georgia')
para('A cohesive regional company works deliberately together so that the Kingdom takes root—and continues to grow.',55,359,780,16,23,'Arial',MUTED)
# central circle & six branches
cx,cy=480,203
circ(cx,cy,64,GREEN); c.setFillColor(WHITE); c.setFont('ArialB',12); c.drawCentredString(cx,cy+5,'ONE'); c.drawCentredString(cx,cy-13,'FAMILY')
cards=[(183,277,'PRAYER','Shared spiritual life'),(480,278,'RELATIONSHIPS','Presence & trust'),(777,277,'DISCIPLESHIP','New believers & leaders'),(183,119,'PRACTICAL SERVICE','Medicine, business, education'),(480,79,'CROSS-POLLINATION','People, ideas & resources'),(777,119,'LASTING WORKS','Local roots & continuity')]
for x,y,h,b in cards:
line(cx,cy,x,y,GOLD,1.4); circ(x,y,5,RUST)
txt(h,x-110,y+21,11,'ArialB',GREEN); txt(b,x-110,y+3,11,'Arial',MUTED)
c.showPage()
# 4 family and generations
base(4,True)
pill('A CORPORATE FAMILY',55,465,fill=HexColor('#315346'),color=HexColor('#F2D69A'))
txt('From “my ministry”',55,386,32,'Georgia',WHITE)
txt('to “our family”',55,344,32,'Georgia',WHITE)
para('The mandate is shared. Each person has an assignment; each region has responsibility. We do not wait for someone else to carry what we can faithfully do together.',58,293,395,16,23,'Arial',HexColor('#DDE6DF'))
# generational bridge
line(565,220,846,220,GOLD,3)
for x,label,sub,col in [(590,'MATURE','Coach • affirm',GREEN),(705,'TOGETHER','Share the work',RUST),(825,'EMERGING','Learn • lead',HexColor('#4F8066'))]:
circ(x,220,39,col); c.setFillColor(WHITE); c.setFont('ArialB',10); c.drawCentredString(x,224,label)
c.setFillColor(HexColor('#DDE6DF')); c.setFont('Arial',10); c.drawCentredString(x,165,sub)
txt('Transition begins before it is urgent.',555,110,18,'Georgia',HexColor('#F2D69A'))
para('Wisdom is passed on while experienced leaders can still coach and emerging leaders can grow into their place.',555,79,330,12,17,'Arial',HexColor('#DDE6DF'))
c.showPage()
# 5 establish not visit
base(5)
pill('THE OUTCOME',52,465)
txt('Don’t only visit. Establish.',52,404,32,'Georgia')
para('Evangelism opens the door. The mission is to build relationships and works that remain after the first visit.',55,358,760,16,23,'Arial',MUTED)
# left-to-right progression
steps=[('GO','Show up with purpose'),('CONNECT','Build trust & family'),('DISCIPLE','Form people & leaders'),('ESTABLISH','Root a lasting work'),('MULTIPLY','Equip others to carry it')]
xs=[112,293,474,655,836]
for i,((head,desc),x) in enumerate(zip(steps,xs)):
col=GREEN if i in (0,3) else (RUST if i==4 else HexColor('#46745D'))
circ(x,219,53,col); c.setFillColor(WHITE); c.setFont('ArialB',12); c.drawCentredString(x,215,head)
if i<4: line(x+56,219,xs[i+1]-56,219,GOLD,2); circ((x+xs[i+1])/2,219,4,GOLD)
c.setFillColor(MUTED); c.setFont('Arial',11)
for j,l in enumerate(simpleSplit(desc,'Arial',11,130)): c.drawCentredString(x,143-j*15,l)
# foundation
c.setFillColor(PALE); c.roundRect(89,78,782,25,12,fill=1,stroke=0)
c.setFillColor(GREEN); c.setFont('ArialB',10); c.drawCentredString(480,87,'RELATIONSHIPS • LOCAL LEADERS • SUSTAINABLE ROOTS • REGIONAL OWNERSHIP')
c.showPage()
# 6 priorities
base(6)
pill('START WITH THE NEXT FAITHFUL STEPS',52,465)
txt('A regional agenda',52,404,32,'Georgia')
items=[('01','ALIGN','One shared understanding of the vision'),('02','CONNECT','Strengthen relationships across the region'),('03','PRAY','Establish a shared rhythm of prayer'),('04','SHARE','Cross-pollinate strategies, gifts & resources'),('05','STRENGTHEN','Encourage existing open doors, including Chile'),('06','FOCUS','Choose a few clear priorities; build steadily')]
for i,(num,head,body) in enumerate(items):
col=i%2; row=i//2; x=57+col*438; y=319-row*96
c.setFillColor(WHITE); c.roundRect(x,y-53,400,72,13,fill=1,stroke=0)
c.setFillColor(GOLD); c.setFont('Georgia',20); c.drawString(x+17,y-10,num)
txt(head,x+65,y-3,12,'ArialB',GREEN)
txt(body,x+65,y-26,12,'Arial',MUTED)
c.showPage()
# 7 gathering
base(7,True)
pill('THE LONGER HORIZON',55,465,fill=HexColor('#315346'),color=HexColor('#F2D69A'))
txt('A gathering that becomes',55,392,31,'Georgia',WHITE)
txt('a regional family in motion.',55,351,31,'Georgia',WHITE)
para('The Latin American Family Gathering is not just an event. It can become a catalyst for shared life and ongoing collaboration.',58,301,680,16,23,'Arial',HexColor('#DDE6DF'))
labels=['VISION','RELATIONSHIP','LEADERSHIP','PRAYER','COLLABORATION','OUTREACH','NEXT GENERATION']
for i,s in enumerate(labels):
x=58+(i%4)*218; y=209-(i//4)*61
pill(s,x,y,fill=HexColor('#315346') if i%2==0 else HexColor('#3E6757'),color=HexColor('#F5EAD1'))
line(58,86,874,86,GOLD,2)
txt('One family. Shared responsibility. Lasting Kingdom work.',58,55,17,'Georgia',HexColor('#F2D69A'))
txt('Based on the EMI “Vision for Latin America” source document.',58,38,9,'Arial',HexColor('#DDE6DF'))
c.showPage()
c.save()
print(f'Wrote {OUT} ({OUT.stat().st_size} bytes; 7 slides)')