Files
wellnessWheel/build_proposal_docx.py
T

361 lines
17 KiB
Python

#!/usr/bin/env python3
"""Convert the Wheel of Wellness proposal to a polished DOCX."""
from docx import Document
from docx.shared import Pt, Inches, Cm, RGBColor
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'
CREAM = 'FFF8F0'
LIGHT_TEAL = 'E8F5F1'
ALT_ROW = 'F7F7F7'
WHITE = 'FFFFFF'
# ── Helpers ─────────────────────────────────────────────────
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 styled_table(doc, headers, rows, col_widths=None):
"""Create a bordered table with teal header, alternating row shading."""
t = doc.add_table(rows=1 + len(rows), cols=len(headers))
t.alignment = WD_TABLE_ALIGNMENT.CENTER
t.style = 'Table Grid'
# Header
for i, h in enumerate(headers):
cell = t.rows[0].cells[i]
cell.text = ''
p = cell.paragraphs[0]
run = p.add_run(h)
run.bold = True
run.font.size = Pt(10)
run.font.color.rgb = RGBColor(255, 255, 255)
set_cell_shading(cell, TEAL)
# Data rows
for ri, row_data in enumerate(rows):
for ci, val in enumerate(row_data):
cell = t.rows[ri + 1].cells[ci]
cell.text = ''
p = cell.paragraphs[0]
run = p.add_run(str(val))
run.font.size = Pt(10)
run.font.color.rgb = RGBColor(*bytes.fromhex(DARK))
if ri % 2 == 1:
set_cell_shading(cell, ALT_ROW)
# Column widths
if col_widths:
for i, w in enumerate(col_widths):
for row in t.rows:
row.cells[i].width = Cm(w)
doc.add_paragraph() # spacer
return t
def add_heading(doc, text, level=1):
h = doc.add_heading(text, level=level)
for run in h.runs:
run.font.color.rgb = RGBColor(*bytes.fromhex(TEAL))
return h
def add_body(doc, text, bold_prefix=None):
p = doc.add_paragraph()
if bold_prefix:
r = p.add_run(bold_prefix)
r.bold = True
r.font.size = Pt(11)
r.font.color.rgb = RGBColor(*bytes.fromhex(DARK))
r = p.add_run(text)
r.font.size = Pt(11)
r.font.color.rgb = RGBColor(*bytes.fromhex(DARK))
return p
def add_bullet(doc, text, bold_prefix=None):
p = doc.add_paragraph(style='List Bullet')
if bold_prefix:
r = p.add_run(bold_prefix)
r.bold = True
r.font.size = Pt(11)
r.font.color.rgb = RGBColor(*bytes.fromhex(DARK))
r = p.add_run(text)
r.font.size = Pt(11)
r.font.color.rgb = RGBColor(*bytes.fromhex(DARK))
return p
def add_numbered(doc, text, bold_prefix=None):
p = doc.add_paragraph(style='List Number')
if bold_prefix:
r = p.add_run(bold_prefix)
r.bold = True
r.font.size = Pt(11)
r = p.add_run(text)
r.font.size = Pt(11)
r.font.color.rgb = RGBColor(*bytes.fromhex(DARK))
return p
def add_callout(doc, text, prefix=None):
"""Indented italic callout paragraph."""
p = doc.add_paragraph()
pf = p.paragraph_format
pf.left_indent = Cm(1)
if prefix:
r = p.add_run(prefix)
r.bold = True
r.italic = True
r.font.size = Pt(11)
r.font.color.rgb = RGBColor(*bytes.fromhex(CORAL))
r = p.add_run(text)
r.italic = True
r.font.size = Pt(11)
r.font.color.rgb = RGBColor(*bytes.fromhex('555555'))
return p
# ── Document ────────────────────────────────────────────────
doc = Document()
# Page margins
for section in doc.sections:
section.top_margin = Cm(2.54)
section.bottom_margin = Cm(2.54)
section.left_margin = Cm(2.54)
section.right_margin = Cm(2.54)
# ── Title Page ──────────────────────────────────────────────
p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
pf = p.paragraph_format
pf.space_before = Pt(72)
r = p.add_run('Wheel of Wellness\nResource Connector')
r.bold = True
r.font.size = Pt(32)
r.font.color.rgb = RGBColor(*bytes.fromhex(TEAL))
p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
r = p.add_run('A Proposal for HELPipedia / SpecialNeeds.help')
r.font.size = Pt(16)
r.font.color.rgb = RGBColor(*bytes.fromhex(CORAL))
p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
pf = p.paragraph_format
pf.space_before = Pt(36)
for line in [
'Prepared by: Kayla Newkirk, M.S.Ed., MHC-LP',
'Doctoral Candidate, Counselor Education & Supervision',
'Waynesburg University',
'',
'Meeting with: Phil Vetrano, MBA',
'President & Co-founder, HELPipedia',
'',
'Week of June 16, 2026',
]:
r = p.add_run(line + '\n')
r.font.size = Pt(12)
r.font.color.rgb = RGBColor(*bytes.fromhex(DARK))
doc.add_page_break()
# ── Executive Summary ───────────────────────────────────────
add_heading(doc, 'Executive Summary', level=1)
add_body(doc, 'HELPipedia already connects families to resources through SpecialNeeds.help. The next step is making that connection proactive and personalized. Instead of asking families to browse a directory, we meet them where they are with a Wheel of Wellness assessment that identifies their needs across six dimensions and automatically surfaces the most relevant resources.')
add_body(doc, '')
add_body(doc, 'This builds on the existing Family Wheel of Life assessment (ScoreApp) and the Caregiver Wellness Wheel framework developed for the ADA 36th Anniversary Telethon.')
add_callout(doc, ' Approve a pilot project to design, build, and test an interactive Wheel of Wellness assessment tool integrated into the HELPipedia / SpecialNeeds.help ecosystem.', prefix='The ask:')
doc.add_page_break()
# ── Section 1: The Problem ──────────────────────────────────
add_heading(doc, '1. The Problem We Are Solving', level=1)
styled_table(doc,
['Current Experience', 'Proposed Experience'],
[
['Family arrives at SpecialNeeds.help', 'Family arrives at SpecialNeeds.help'],
['Browses categories or searches keywords', 'Takes a 5-minute wellness needs assessment'],
['Must already know what they need', 'Assessment identifies needs they may not have named'],
['Finds resources one at a time', 'Receives a personalized resource map across all relevant dimensions'],
['Leaves with a link', 'Leaves with a plan and a connection'],
],
col_widths=[8.5, 8.5],
)
add_callout(doc, '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.', prefix='The gap: ')
# ── Section 2: What We Are Proposing ────────────────────────
add_heading(doc, '2. What We Are Proposing', level=1)
add_heading(doc, 'The Tool', level=2)
add_body(doc, 'An interactive, web-based Wheel of Wellness Assessment that:')
add_numbered(doc, 'Asks caregivers and individuals with disabilities targeted questions across six wellness dimensions')
add_numbered(doc, 'Scores each dimension to identify strengths and areas of need')
add_numbered(doc, 'Generates a personalized results page that maps their specific needs to resources in the SpecialNeeds.help directory')
add_numbered(doc, 'Optionally connects them to a coach, mentor, or support group')
add_heading(doc, 'The Six Dimensions', level=2)
add_body(doc, 'Adapted from the Myers, Sweeney, and Witmer (1998) Wheel of Wellness model and tailored for the caregiver and disability community:')
styled_table(doc,
['Dimension', 'Core Question', 'Example Resource Connections'],
[
['Physical', 'Are basic health, rest, and movement needs being met?', 'Respite care, medical providers, adaptive recreation, sleep support'],
['Emotional', 'Is there space to name and cope with feelings?', 'Counseling referrals, caregiver support groups, crisis lines'],
['Social', 'Is there a community that understands?', 'Parent mentors, local support networks, community events, peer matching'],
['Practical', 'Are logistics, advocacy, and systems manageable?', 'IEP advocates, legal aid, financial assistance, benefits navigation'],
['Purpose', 'Is there meaning and identity beyond caregiving?', 'Faith communities, disability-affirming organizations, storytelling platforms'],
['Growth', 'Is there room to learn, create, and become?', 'Training, conferences, podcasts, creative programs, continuing education'],
],
col_widths=[3, 5.5, 8.5],
)
add_heading(doc, 'How It Differs from the Existing Family Wheel of Life', level=2)
styled_table(doc,
['Feature', 'Family Wheel of Life (Current)', 'Wheel of Wellness Connector (Proposed)'],
[
['Focus', 'General family balance', 'Caregiver and disability-specific needs'],
['Dimensions', '4 (Health, Home, Connection, Joy)', '6 (Physical, Emotional, Social, Practical, Purpose, Growth)'],
['Output', 'Personalized report with general guidance', 'Personalized resource map linked to SpecialNeeds.help'],
['Action step', 'Self-reflection', 'Direct connection to services, providers, and support'],
['Audience', 'Broad families', 'Caregivers, parents of children with disabilities, individuals with disabilities'],
['Clinical grounding', 'Life coaching framework', 'Counseling wellness model (Myers, Sweeney, & Witmer, 1998)'],
],
col_widths=[3.5, 6, 7.5],
)
add_body(doc, 'The two tools serve different audiences and can coexist. The Wheel of Wellness Connector targets the specific population HELPipedia and SpecialNeeds.help are built to serve.')
doc.add_page_break()
# ── Section 3: Why This Matters ─────────────────────────────
add_heading(doc, '3. Why This Matters for HELPipedia', level=1)
add_heading(doc, 'Strategic Alignment', level=2)
add_bullet(doc, '"Help parents and youth bridge the gap between knowledge and opportunity." The assessment literally bridges that gap by turning knowledge of needs into opportunity for connection.', bold_prefix='Mission: ')
add_bullet(doc, 'A personalized entry point increases engagement, return visits, and directory utilization.', bold_prefix='SpecialNeeds.help adoption: ')
add_bullet(doc, 'Aggregated (anonymous) assessment data reveals what the community needs most, informing content development, partnerships, and fundraising.', bold_prefix='Data and insight: ')
add_bullet(doc, 'No other major disability resource directory offers a clinically grounded, personalized needs assessment with automatic resource matching.', bold_prefix='Differentiator: ')
doc.add_page_break()
# ── Section 4: Resource Requirements ────────────────────────
add_heading(doc, '4. Resource Requirements', level=1)
add_heading(doc, 'What Kayla Provides', level=2)
for item in [
'Clinical expertise in wellness models and counseling frameworks',
'Assessment design, question writing, and scoring methodology',
'Content for results pages (wellness guidance, psychoeducation, resource explanations)',
'User testing coordination with caregiver and disability community',
'Ongoing clinical review as tool evolves',
]:
add_bullet(doc, item)
add_heading(doc, 'What HELPipedia Provides', level=2)
for item in [
'Platform access and technical implementation',
'Integration with SpecialNeeds.help directory',
'Marketing and community outreach (Chris Myers)',
'Analytics and data tracking',
'Board approval and strategic support',
]:
add_bullet(doc, item)
doc.add_page_break()
# ── Section 5: Success Metrics ──────────────────────────────
add_heading(doc, '5. Success Metrics', level=1)
styled_table(doc,
['Metric', 'Target (First 90 Days)'],
[
['Assessment completions', '100+'],
['Completion rate (started vs. finished)', '70%+'],
['Resource link clicks from results page', '50%+ of completions'],
['Return visits to SpecialNeeds.help', '30%+ within 30 days'],
['Qualitative feedback', 'Positive sentiment from 80%+ of feedback respondents'],
['Community sharing', 'Assessment shared by 10+ caregivers to their networks'],
],
col_widths=[8, 9],
)
# ── Section 6: Sample User Journey ──────────────────────────
add_heading(doc, '6. Sample User Journey', level=1)
add_body(doc, 'She is a single mother of a 9-year-old with Down syndrome and a heart condition. She works full-time. She heard about SpecialNeeds.help from a friend.', bold_prefix='Meet Sarah. ')
steps = [
'"Not sure where to start? Take 5 minutes to find the resources that fit your family."',
'She clicks and begins the Wheel of Wellness assessment.',
'She answers 20-25 short questions. Some are about her child. Some are about her.',
]
for i, s in enumerate(steps, 1):
add_numbered(doc, s)
add_body(doc, 'Her results page shows:')
for dim, status, detail in [
('Physical: Needs Attention', '', '(she has not seen her own doctor in 18 months; her child needs a new cardiologist)'),
('Emotional: Moderate', '', '(she has a friend she talks to but no formal support)'),
('Social: Needs Attention', '', '(she moved recently and does not know anyone local)'),
('Practical: Strong', '', '(she has an IEP advocate and understands the system)'),
('Purpose: Moderate', '', '(she used to paint but stopped)'),
('Growth: Needs Attention', '', '(she wants to learn more about transition planning)'),
]:
p = doc.add_paragraph(style='List Bullet')
r = p.add_run(dim)
r.bold = True
r.font.size = Pt(11)
r.font.color.rgb = RGBColor(*bytes.fromhex(DARK))
r = p.add_run(' ' + detail)
r.font.size = Pt(11)
r.font.color.rgb = RGBColor(*bytes.fromhex(DARK))
add_numbered(doc, 'Under each dimension, she sees 2-3 specific resources from SpecialNeeds.help, with one-click links.')
add_numbered(doc, '"Want to talk to someone? Connect with a parent mentor." with a link to HELPipedia\'s community.')
add_numbered(doc, 'Sarah bookmarks her results. She shares the assessment with her sister, who is also a caregiver.')
add_callout(doc, 'Sarah did not have to know what to search for. The right questions led her to the right resources. That is the difference between a directory and a connector.', prefix='What happened: ')
doc.add_page_break()
# ── Section 7: References ───────────────────────────────────
add_heading(doc, '7. Background References', level=1)
refs = [
'Myers, J. E., Sweeney, T. J., & Witmer, J. M. (1998). The Wheel of Wellness: A holistic model for treatment planning. Journal of Counseling & Development, 76(3), 251-263.',
'Newkirk, K. (2026). Nourishing the Caregiver: The Wheel of Wellness for Special Needs Families. Presentation for HELPipedia ADA 36th Anniversary Telethon.',
'HELPipedia Family Wheel of Life Assessment (ScoreApp). Retrieved from https://patrice-l7tf94gf.scoreapp.com/',
'Americans with Disabilities Act of 1990, as amended. 42 U.S.C. 12101 et seq.',
]
for ref in refs:
p = doc.add_paragraph(ref, style='List Bullet')
for run in p.runs:
run.font.size = Pt(10)
# ── Closing ─────────────────────────────────────────────────
doc.add_paragraph()
p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
r = p.add_run('This proposal connects clinical wellness frameworks with practical resource delivery, giving HELPipedia a unique tool that no other disability resource directory currently offers. The infrastructure already exists. The expertise is available. The community needs it.')
r.italic = True
r.font.size = Pt(11)
r.font.color.rgb = RGBColor(*bytes.fromhex('555555'))
p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
pf = p.paragraph_format
pf.space_before = Pt(24)
for line in [
'Prepared by Kayla Newkirk, M.S.Ed., MHC-LP',
'Doctoral Candidate, Counselor Education & Supervision, Waynesburg University',
'kcordone30@gmail.com',
]:
r = p.add_run(line + '\n')
r.font.size = Pt(11)
r.font.color.rgb = RGBColor(*bytes.fromhex(DARK))
# ── Save ────────────────────────────────────────────────────
out = '/home/newkirk/Documents/Career/WheelOfWellnessProposal.docx'
doc.save(out)
print(f'Saved: {out}')