166 lines
7.5 KiB
Python
166 lines
7.5 KiB
Python
#!/usr/bin/env python3
|
|
"""One-pager: Wheel of Wellness proposal for HELPipedia."""
|
|
|
|
from docx import Document
|
|
from docx.shared import Pt, Inches, Cm, RGBColor, Emu
|
|
from docx.enum.text import WD_ALIGN_PARAGRAPH
|
|
from docx.enum.table import WD_TABLE_ALIGNMENT
|
|
from docx.oxml.ns import qn
|
|
from docx.oxml import OxmlElement
|
|
|
|
# ── Colors ──────────────────────────────────────────────────
|
|
TEAL = '2E7D6F'
|
|
CORAL = 'E8835C'
|
|
DARK = '2D3436'
|
|
LIGHT_TEAL = 'E8F5F1'
|
|
ALT_ROW = 'F2F2F2'
|
|
WHITE = 'FFFFFF'
|
|
|
|
def set_cell_shading(cell, color):
|
|
shading = OxmlElement('w:shd')
|
|
shading.set(qn('w:fill'), color)
|
|
shading.set(qn('w:val'), 'clear')
|
|
cell._tc.get_or_add_tcPr().append(shading)
|
|
|
|
def set_cell_margins(cell, top=40, bottom=40, left=80, right=80):
|
|
tc = cell._tc
|
|
tcPr = tc.get_or_add_tcPr()
|
|
tcMar = OxmlElement('w:tcMar')
|
|
for side, val in [('top', top), ('bottom', bottom), ('left', left), ('right', right)]:
|
|
el = OxmlElement(f'w:{side}')
|
|
el.set(qn('w:w'), str(val))
|
|
el.set(qn('w:type'), 'dxa')
|
|
tcMar.append(el)
|
|
tcPr.append(tcMar)
|
|
|
|
def add_run(p, text, size=9, bold=False, color=DARK, italic=False):
|
|
r = p.add_run(text)
|
|
r.font.size = Pt(size)
|
|
r.font.color.rgb = RGBColor(*bytes.fromhex(color))
|
|
r.bold = bold
|
|
r.italic = italic
|
|
return r
|
|
|
|
# ── Document ────────────────────────────────────────────────
|
|
doc = Document()
|
|
|
|
# Tight margins for one-pager
|
|
for section in doc.sections:
|
|
section.top_margin = Cm(1.5)
|
|
section.bottom_margin = Cm(1.2)
|
|
section.left_margin = Cm(1.8)
|
|
section.right_margin = Cm(1.8)
|
|
|
|
# ── HEADER BAR (using a single-cell table with shading) ─────
|
|
header_table = doc.add_table(rows=1, cols=1)
|
|
header_table.alignment = WD_TABLE_ALIGNMENT.CENTER
|
|
cell = header_table.rows[0].cells[0]
|
|
set_cell_shading(cell, TEAL)
|
|
set_cell_margins(cell, top=100, bottom=100, left=150, right=150)
|
|
p = cell.paragraphs[0]
|
|
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
|
|
add_run(p, 'Wheel of Wellness Resource Connector', size=18, bold=True, color=WHITE)
|
|
p2 = cell.add_paragraph()
|
|
p2.alignment = WD_ALIGN_PARAGRAPH.CENTER
|
|
add_run(p2, 'A Proposal for HELPipedia / SpecialNeeds.help | Kayla Newkirk, M.S.Ed., MHC-LP | Week of June 16, 2026', size=9, color=WHITE)
|
|
|
|
# Remove table borders
|
|
tbl = header_table._tbl
|
|
tblPr = tbl.tblPr if tbl.tblPr is not None else OxmlElement('w:tblPr')
|
|
borders = OxmlElement('w:tblBorders')
|
|
for edge in ('top', 'left', 'bottom', 'right', 'insideH', 'insideV'):
|
|
el = OxmlElement(f'w:{edge}')
|
|
el.set(qn('w:val'), 'none')
|
|
el.set(qn('w:sz'), '0')
|
|
el.set(qn('w:space'), '0')
|
|
el.set(qn('w:color'), 'auto')
|
|
borders.append(el)
|
|
tblPr.append(borders)
|
|
|
|
doc.add_paragraph() # small spacer
|
|
|
|
# ── THE PROBLEM ─────────────────────────────────────────────
|
|
p = doc.add_paragraph()
|
|
add_run(p, 'THE PROBLEM ', size=10, bold=True, color=CORAL)
|
|
add_run(p, 'Families navigating disability and caregiving often do not know what they need until someone asks the right questions. A directory is powerful when you know what to search for. An assessment tool is powerful when you do not.', size=9)
|
|
|
|
# ── THE SOLUTION ────────────────────────────────────────────
|
|
p = doc.add_paragraph()
|
|
add_run(p, 'THE SOLUTION ', size=10, bold=True, color=CORAL)
|
|
add_run(p, 'An interactive, web-based Wheel of Wellness Assessment that asks caregivers and individuals with disabilities targeted questions across six wellness dimensions, scores each area, and automatically maps their needs to resources in the SpecialNeeds.help directory. Users arrive unsure of what they need. They leave with a personalized resource plan.', size=9)
|
|
|
|
# ── THE SIX DIMENSIONS TABLE ────────────────────────────────
|
|
p = doc.add_paragraph()
|
|
add_run(p, 'THE SIX DIMENSIONS', size=10, bold=True, color=TEAL)
|
|
|
|
dims = [
|
|
['Physical', 'Rest, movement, nutrition, medical care', 'Respite care, medical providers, adaptive recreation'],
|
|
['Emotional', 'Naming feelings, coping, support', 'Counseling referrals, caregiver support groups, crisis lines'],
|
|
['Social', 'Connection, understanding, community', 'Parent mentors, local support networks, peer matching'],
|
|
['Practical', 'Finances, advocacy, schedules, systems', 'IEP advocates, legal aid, benefits navigation'],
|
|
['Purpose', 'Meaning, identity, values, hope', 'Faith communities, disability-affirming organizations'],
|
|
['Growth', 'Learning, creativity, becoming', 'Training, conferences, podcasts, creative programs'],
|
|
]
|
|
|
|
t = doc.add_table(rows=1 + len(dims), cols=3)
|
|
t.alignment = WD_TABLE_ALIGNMENT.CENTER
|
|
t.style = 'Table Grid'
|
|
|
|
# Header
|
|
for i, h in enumerate(['Dimension', 'Focus', 'Resource Connections']):
|
|
cell = t.rows[0].cells[i]
|
|
cell.text = ''
|
|
p = cell.paragraphs[0]
|
|
add_run(p, h, size=8, bold=True, color=WHITE)
|
|
set_cell_shading(cell, TEAL)
|
|
set_cell_margins(cell, top=30, bottom=30, left=60, right=60)
|
|
|
|
# Data
|
|
for ri, row_data in enumerate(dims):
|
|
for ci, val in enumerate(row_data):
|
|
cell = t.rows[ri + 1].cells[ci]
|
|
cell.text = ''
|
|
p = cell.paragraphs[0]
|
|
add_run(p, val, size=8, bold=(ci == 0), color=DARK)
|
|
set_cell_margins(cell, top=20, bottom=20, left=60, right=60)
|
|
if ri % 2 == 1:
|
|
set_cell_shading(cell, ALT_ROW)
|
|
|
|
# Set column widths
|
|
for row in t.rows:
|
|
row.cells[0].width = Cm(2.5)
|
|
row.cells[1].width = Cm(6)
|
|
row.cells[2].width = Cm(8)
|
|
|
|
doc.add_paragraph()
|
|
|
|
# ── WHY IT MATTERS ──────────────────────────────────────────
|
|
p = doc.add_paragraph()
|
|
add_run(p, 'WHY IT MATTERS', size=10, bold=True, color=TEAL)
|
|
|
|
bullets = [
|
|
('Mission alignment: ', 'Bridges the gap between knowledge and opportunity'),
|
|
('Differentiator: ', 'No other disability directory offers a clinically grounded needs assessment'),
|
|
('Engagement: ', 'Personalized entry point increases return visits and directory use'),
|
|
('Data insight: ', 'Anonymous aggregate data reveals community needs for content and fundraising'),
|
|
('Scalable: ', 'Works for any new resource area added to SpecialNeeds.help'),
|
|
('Measurable: ', 'Completion rates, click-through, referrals all trackable'),
|
|
]
|
|
for bold_part, rest in bullets:
|
|
p = doc.add_paragraph()
|
|
p.paragraph_format.space_before = Pt(1)
|
|
p.paragraph_format.space_after = Pt(1)
|
|
add_run(p, bold_part, size=8, bold=True, color=DARK)
|
|
add_run(p, rest, size=8)
|
|
|
|
# ── Footer ──────────────────────────────────────────────────
|
|
p = doc.add_paragraph()
|
|
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
|
|
p.paragraph_format.space_before = Pt(6)
|
|
add_run(p, 'Kayla Newkirk, M.S.Ed., MHC-LP | Doctoral Candidate, Counselor Education & Supervision, Waynesburg University | kcordone30@gmail.com', size=7, color='888888')
|
|
|
|
# ── Save ────────────────────────────────────────────────────
|
|
out = '/home/newkirk/Documents/Career/WheelOfWellnessOnePager.docx'
|
|
doc.save(out)
|
|
print(f'Saved: {out}')
|