141 lines
8.8 KiB
Python
141 lines
8.8 KiB
Python
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)')
|