Here are two ways to turn this exact information into a color-coded PDF calendar:
Method 1: Export Directly from Safari on iPhone (No Coding Needed)
 * Open Safari on your iPhone and visit htmlrunner.com (or any free online HTML viewer).
 * Copy the HTML block below and paste it into the viewer editor.
 * Tap Share (the box with an upward arrow) at the bottom of Safari.
 * Select Print.
 * On the print preview screen, pinch outwards with two fingers on the page image to expand it into a full-screen PDF view.
 * Tap the Share button at the top right to save the generated color-coded PDF directly to your Files app or send it via email.
Method 2: Generate PDF via Python (reportlab)
If you want to generate a crisp, vector-formatted PDF file automatically, run this Python script using reportlab:
from reportlab.lib import colors
from reportlab.lib.pagesizes import letter
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle, HRFlowable

def generate_calendar_pdf(filename="Happy_Keys_2026_2027_Calendar.pdf"):
    doc = SimpleDocTemplate(
        filename,
        pagesize=letter,
        rightMargin=36,
        leftMargin=36,
        topMargin=36,
        bottomMargin=36
    )
    story = []

    # Colors
    primary = colors.HexColor("#2C3E50")
    accent = colors.HexColor("#2980B9")
    highlight_bg = colors.HexColor("#EDF2F7")

    # Styles
    styles = getSampleStyleSheet()
    title_style = ParagraphStyle('TitleStyle', parent=styles['Heading1'], fontName='Helvetica-Bold', fontSize=20, textColor=primary, spaceAfter=4)
    subtitle_style = ParagraphStyle('SubTitleStyle', fontName='Helvetica-Bold', fontSize=13, textColor=accent, spaceAfter=6)
    body_style = ParagraphStyle('BodyStyle', fontName='Helvetica', fontSize=10, textColor=colors.HexColor("#333333"), leading=14)
    h2_style = ParagraphStyle('H2Style', fontName='Helvetica-Bold', fontSize=12, textColor=primary, spaceBefore=12, spaceAfter=6)
    badge_style = ParagraphStyle('BadgeStyle', fontName='Helvetica-Bold', fontSize=9, textColor=primary)

    # Title & Subtitle
    story.append(Paragraph("Happy Keys Piano School", title_style))
    story.append(Paragraph("2026–2027 Studio Calendar & Tuition Schedule", subtitle_style))
    story.append(Paragraph("<b>Term:</b> September 14, 2026 – June 18, 2027 &nbsp;|&nbsp; <b>Structure:</b> 34 Guaranteed Lessons (10 Equal Monthly Installments)", body_style))
    story.append(HRFlowable(width="100%", thickness=1.5, color=accent, spaceBefore=8, spaceAfter=12))

    # Key Closures Section
    story.append(Paragraph("Key Studio Closures & Flex Weeks", h2_style))
    
    closures_data = [
        [Paragraph("<b>Yom Kippur:</b> Mon, Sep 21, 2026", body_style), Paragraph("<b>Columbus Day:</b> Mon, Oct 12, 2026", body_style)],
        [Paragraph("<b>Veterans Day:</b> Wed, Nov 11, 2026", body_style), Paragraph("<b>Flex Week 1 (Thanksgiving):</b> Nov 23–27, 2026", body_style)],
        [Paragraph("<b>Winter Recess:</b> Dec 23, 2026 – Jan 1, 2027", body_style), Paragraph("<b>MLK Jr. Day:</b> Mon, Jan 18, 2027", body_style)],
        [Paragraph("<b>Flex Week 2 (Mid-Winter):</b> Feb 15–19, 2027", body_style), Paragraph("<b>Spring Recess / Good Friday:</b> Mar 26 – Apr 2, 2027", body_style)],
        [Paragraph("<b>Flex Week 3:</b> Apr 19–23, 2027", body_style), Paragraph("<b>Memorial Day:</b> Mon, May 31, 2027", body_style)],
        [Paragraph("<b>Final Week & Showcases:</b> Jun 14–18, 2027", body_style), Paragraph("", body_style)]
    ]
    
    closure_table = Table(closures_data, colWidths=[270, 270])
    closure_table.setStyle(TableStyle([
        ('BACKGROUND', (0,0), (-1,-1), highlight_bg),
        ('PADDING', (0,0), (-1,-1), 5),
        ('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
        ('BOTTOMPADDING', (0,0), (-1,-1), 6),
    ]))
    story.append(closure_table)
    story.append(Spacer(1, 10))

    # Monthly Breakdown Section
    story.append(Paragraph("Monthly Schedule Breakdown", h2_style))

    months = [
        ("September 2026", "First day of studio is Sep 14. No lessons Sep 21 (Yom Kippur).", "Lessons: Mon (2) | Tue (3) | Wed (3) | Thu (3) | Fri (3)"),
        ("October 2026", "No lessons Oct 12 (Columbus Day).", "Lessons: Mon (3) | Tue (4) | Wed (4) | Thu (5) | Fri (5)"),
        ("November 2026", "No lessons Nov 11 (Veterans Day). Flex Week 1: Nov 23–27 (no regular lessons).", "Lessons: Mon (3) | Tue (3) | Wed (3) | Thu (3) | Fri (3)"),
        ("December 2026", "Winter Recess: Dec 23 – Jan 1 (no lessons).", "Lessons: Mon (3) | Tue (3) | Wed (3) | Thu (3) | Fri (3)"),
        ("January 2027", "Lessons resume Jan 4. No lessons Jan 18 (MLK Jr. Day).", "Lessons: Mon (3) | Tue (4) | Wed (4) | Thu (4) | Fri (4)"),
        ("February 2027", "Flex/Make-up Week 2: Feb 15–19 (no regular lessons).", "Lessons: Mon (3) | Tue (3) | Wed (3) | Thu (3) | Fri (3)"),
        ("March 2027", "Spring Recess begins Mar 26–31 (no lessons Good Friday, Mar 26).", "Lessons: Mon (4) | Tue (5) | Wed (5) | Thu (4) | Fri (3)"),
        ("April 2027", "Spring Recess continues Apr 1–2. Flex Week 3: Apr 19–23 (no regular lessons).", "Lessons: Mon (3) | Tue (3) | Wed (3) | Thu (4) | Fri (4)"),
        ("May 2027", "No lessons May 31 (Memorial Day).", "Lessons: Mon (4) | Tue (4) | Wed (4) | Thu (4) | Fri (4)"),
        ("June 2027", "Final lesson week & showcases: Jun 14–18. Last studio day is Jun 18.", "Lessons: Mon (2) | Tue (2) | Wed (2) | Thu (2) | Fri (2)"),
    ]

    for month_title, notes, count in months:
        card_content = [
            [Paragraph(f"<b><font color='#2980B9'>{month_title}</font></b>", body_style)],
            [Paragraph(notes, body_style)],
            [Paragraph(f"<b><font color='#2C3E50'>{count}</font></b>", badge_style)]
        ]
        card_table = Table(card_content, colWidths=[540])
        card_table.setStyle(TableStyle([
            ('BACKGROUND', (0,0), (-1,-1), colors.white),
            ('BOX', (0,0), (-1,-1), 1, colors.HexColor("#E2E8F0")),
            ('PADDING', (0,0), (-1,-1), 6),
            ('BACKGROUND', (0,2), (0,2), highlight_bg),
        ]))
        story.append(card_table)
        story.append(Spacer(1, 4))

    # Tally Table
    story.append(Spacer(1, 6))
    story.append(Paragraph("Final Lesson Tally", h2_style))
    tally_data = [
        ["Day of Week", "Total Guaranteed Lessons"],
        ["Mondays", "34"],
        ["Tuesdays", "34"],
        ["Wednesdays", "34"],
        ["Thursdays", "34"],
        ["Fridays", "34"],
        ["Annual Guarantee", "34 Lessons Delivered / Day"]
    ]
    tally_table = Table(tally_data, colWidths=[270, 270])
    tally_table.setStyle(TableStyle([
        ('BACKGROUND', (0,0), (-1,0), primary),
        ('TEXTCOLOR', (0,0), (-1,0), colors.white),
        ('FONTNAME', (0,0), (-1,0), 'Helvetica-Bold'),
        ('ALIGN', (0,0), (-1,-1), 'CENTER'),
        ('GRID', (0,0), (-1,-1), 1, colors.HexColor("#E2E8F0")),
        ('BACKGROUND', (0,-1), (-1,-1), highlight_bg),
        ('FONTNAME', (0,-1), (-1,-1), 'Helvetica-Bold'),
        ('PADDING', (0,0), (-1,-1), 5),
    ]))
    story.append(tally_table)

    doc.build(story)

generate_calendar_pdf()

Complete Color-Coded HTML Source Code (For Printing or Web Viewing)
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>2026–2027 Studio Calendar - Happy Keys Piano School</title>
  <style>
    :root {
      --primary-color: #2c3e50;
      --accent-color: #2980b9;
      --bg-color: #f8f9fa;
      --card-bg: #ffffff;
      --text-color: #333333;
      --border-color: #e2e8f0;
      --highlight-bg: #edf2f7;
    }

    body {
      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
      line-height: 1.5;
      color: var(--text-color);
      background-color: var(--bg-color);
      margin: 0;
      padding: 20px;
    }

    .calendar-container {
      max-width: 750px;
      margin: 0 auto;
      background: var(--card-bg);
      padding: 30px;
      border-radius: 12px;
      box-shadow: 0 4px 6px rgba(0, 0, 0, 0.05);
      border: 1px solid var(--border-color);
    }

    header {
      border-bottom: 3px solid var(--accent-color);
      padding-bottom: 12px;
      margin-bottom: 20px;
    }

    h1 {
      margin: 0 0 4px 0;
      color: var(--primary-color);
      font-size: 22px;
    }

    .subtitle {
      font-weight: bold;
      color: var(--accent-color);
      font-size: 15px;
      margin-bottom: 8px;
    }

    .program-info {
      font-size: 13px;
      color: #555555;
      margin: 0;
    }

    h2 {
      color: var(--primary-color);
      font-size: 16px;
      margin-top: 25px;
      margin-bottom: 12px;
      border-bottom: 2px solid var(--highlight-bg);
      padding-bottom: 4px;
    }

    .closure-grid {
      display: grid;
      grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
      gap: 8px;
    }

    .closure-item {
      background: var(--highlight-bg);
      padding: 8px 12px;
      border-radius: 6px;
      font-size: 13px;
    }

    .closure-item strong {
      color: var(--primary-color);
    }

    .month-card {
      border: 1px solid var(--border-color);
      border-radius: 8px;
      padding: 12px 16px;
      margin-bottom: 12px;
      background-color: #ffffff;
    }

    .month-header {
      font-weight: bold;
      color: var(--accent-color);
      font-size: 15px;
      margin-bottom: 4px;
    }

    .month-text {
      font-size: 13px;
      color: #4a5568;
      margin-bottom: 8px;
    }

    .lesson-badge {
      display: inline-block;
      font-size: 12px;
      background-color: var(--highlight-bg);
      padding: 4px 10px;
      border-radius: 12px;
      font-weight: 600;
      color: var(--primary-color);
    }

    table {
      width: 100%;
      border-collapse: collapse;
      margin-top: 10px;
      font-size: 13px;
    }

    th, td {
      padding: 8px 12px;
      text-align: center;
      border: 1px solid var(--border-color);
    }

    th {
      background-color: var(--primary-color);
      color: white;
      font-weight: 600;
    }

    .total-row {
      font-weight: bold;
      background-color: var(--highlight-bg);
      color: var(--primary-color);
    }
  </style>
</head>
<body>

<div class="calendar-container">

  <header>
    <h1>Happy Keys Piano School</h1>
    <div class="subtitle">2026–2027 Studio Calendar & Tuition Schedule</div>
    <p class="program-info">
      <strong>Term:</strong> September 14, 2026 – June 18, 2027 &nbsp;|&nbsp; 
      <strong>Structure:</strong> 34 Guaranteed Lessons (10 Equal Monthly Installments)
    </p>
  </header>

  <section>
    <h2>Key Studio Closures & Flex Weeks</h2>
    <div class="closure-grid">
      <div class="closure-item"><strong>Yom Kippur:</strong> Mon, Sep 21, 2026</div>
      <div class="closure-item"><strong>Columbus Day:</strong> Mon, Oct 12, 2026</div>
      <div class="closure-item"><strong>Veterans Day:</strong> Wed, Nov 11, 2026</div>
      <div class="closure-item"><strong>Flex Week 1 (Thanksgiving):</strong> Nov 23–27, 2026</div>
      <div class="closure-item"><strong>Winter Recess:</strong> Dec 23, 2026 – Jan 1, 2027</div>
      <div class="closure-item"><strong>MLK Jr. Day:</strong> Mon, Jan 18, 2027</div>
      <div class="closure-item"><strong>Flex Week 2 (Mid-Winter):</strong> Feb 15–19, 2027</div>
      <div class="closure-item"><strong>Spring Recess / Good Friday:</strong> Mar 26 – Apr 2, 2027</div>
      <div class="closure-item"><strong>Flex Week 3:</strong> Apr 19–23, 2027</div>
      <div class="closure-item"><strong>Memorial Day:</strong> Mon, May 31, 2027</div>
      <div class="closure-item" style="grid-column: 1 / -1;"><strong>Final Week & Showcases:</strong> Jun 14–18, 2027</div>
    </div>
  </section>

  <section>
    <h2>Monthly Schedule Breakdown</h2>

    <div class="month-card">
      <div class="month-header">September 2026</div>
      <div class="month-text">First day of studio is September 14. No lessons on September 21 (Yom Kippur).</div>
      <div class="lesson-badge">Lessons: Mon (2), Tue (3), Wed (3), Thu (3), Fri (3)</div>
    </div>

    <div class="month-card">
      <div class="month-header">October 2026</div>
      <div class="month-text">No lessons on October 12 (Columbus Day).</div>
      <div class="lesson-badge">Lessons: Mon (3), Tue (4), Wed (4), Thu (5), Fri (5)</div>
    </div>

    <div class="month-card">
      <div class="month-header">November 2026</div>
      <div class="month-text">No lessons on November 11 (Veterans Day). Flex/Make-up Week 1 takes place November 23–27 (no regular lessons).</div>
      <div class="lesson-badge">Lessons: Mon (3), Tue (3), Wed (3), Thu (3), Fri (3)</div>
    </div>

    <div class="month-card">
      <div class="month-header">December 2026</div>
      <div class="month-text">Winter Recess takes place December 23 – January 1 (no lessons).</div>
      <div class="lesson-badge">Lessons: Mon (3), Tue (3), Wed (3), Thu (3), Fri (3)</div>
    </div>

    <div class="month-card">
      <div class="month-header">January 2027</div>
      <div class="month-text">Lessons resume on January 4. No lessons on January 18 (MLK Jr. Day).</div>
      <div class="lesson-badge">Lessons: Mon (3), Tue (4), Wed (4), Thu (4), Fri (4)</div>
    </div>

    <div class="month-card">
      <div class="month-header">February 2027</div>
      <div class="month-text">Flex/Make-up Week 2 takes place February 15–19 (no regular lessons).</div>
      <div class="lesson-badge">Lessons: Mon (3), Tue (3), Wed (3), Thu (3), Fri (3)</div>
    </div>

    <div class="month-card">
      <div class="month-header">March 2027</div>
      <div class="month-text">Spring Recess begins March 26–31 (no lessons on Good Friday, March 26).</div>
      <div class="lesson-badge">Lessons: Mon (4), Tue (5), Wed (5), Thu (4), Fri (3)</div>
    </div>

    <div class="month-card">
      <div class="month-header">April 2027</div>
      <div class="month-text">Spring Recess continues April 1–2 (no lessons). Flex/Make-up Week 3 takes place April 19–23 (no regular lessons).</div>
      <div class="lesson-badge">Lessons: Mon (3), Tue (3), Wed (3), Thu (4), Fri (4)</div>
    </div>

    <div class="month-card">
      <div class="month-header">May 2027</div>
      <div class="month-text">No lessons on May 31 (Memorial Day).</div>
      <div class="lesson-badge">Lessons: Mon (4), Tue (4), Wed (4), Thu (4), Fri (4)</div>
    </div>

    <div class="month-card">
      <div class="month-header">June 2027</div>
      <div class="month-text">Final lesson week and end-of-year showcases take place June 14–18. The last day of the studio year is June 18.</div>
      <div class="lesson-badge">Lessons: Mon (2), Tue (2), Wed (2), Thu (2), Fri (2)</div>
    </div>
  </section>

  <section>
    <h2>Final Lesson Tally</h2>
    <table>
      <thead>
        <tr>
          <th style="text-align: left; padding-left: 12px;">Day of Week</th>
          <th>Total Guaranteed Lessons</th>
        </tr>
      </thead>
      <tbody>
        <tr><td style="text-align: left; padding-left: 12px;">Mondays</td><td>34</td></tr>
        <tr><td style="text-align: left; padding-left: 12px;">Tuesdays</td><td>34</td></tr>
        <tr><td style="text-align: left; padding-left: 12px;">Wednesdays</td><td>34</td></tr>
        <tr><td style="text-align: left; padding-left: 12px;">Thursdays</td><td>34</td></tr>
        <tr><td style="text-align: left; padding-left: 12px;">Fridays</td><td>34</td></tr>
        <tr class="total-row">
          <td style="text-align: left; padding-left: 12px;">Annual Guarantee</td>
          <td>34 Lessons Delivered / Scheduled Day</td>
        </tr>
      </tbody>
    </table>
  </section>

</div>

</body>
</html>
