KatieHunt

← Back to Projects
Case Study

Teaching Portfolio — Multi-Format Artifact Viewer

I designed and built a public-facing teaching portfolio that showcases Jupyter notebooks, PowerPoint presentations, PDFs, and curriculum documents in a single, unified, browser-based interface — no downloads, no app switching, no account required. The core design challenge was presenting four fundamentally different file formats under one coherent reading experience, accessible to any visitor regardless of device or installed software.

The site is live at khunt247.github.io/Teaching-Portfolio and demonstrates both my teaching depth (Python, data science, physical education, professional development) and my front-end capability (GSAP animations, multi-format rendering, WCAG accessibility, and responsive layout — all in vanilla HTML/CSS/JS).

Role Designer, Developer & Content Author
Audience Hiring teams, administrators, collaborators
Stack HTML5 · CSS3 · Vanilla JS · GSAP · pptxjs
Output Live · GitHub Pages · WCAG-compliant
Teaching Portfolio — Hero section with mission statement and role tags

Homepage hero — mission statement, role tags, and entry point to the artifact collection.

What was shipped

Deliverables

Multi-Format Viewer

Browser-native rendering for four artifact types — Jupyter notebooks (via nbviewer integration), PowerPoint files (via pptxjs), PDFs (native embed), and HTML/curriculum documents — eliminating the need for any download or external app.

Filterable Portfolio Section

Interactive category filters (Python, Data Science, Physical Education, Learning Methodology, Professional Development) with animated project grid — letting visitors zero in on the subject area relevant to them.

Accessibility Layer

WCAG-compliant implementation: semantic HTML structure, ARIA labels, keyboard-navigable interactions, focus management in modals, and color contrast ratios validated across the full page.

Motion & Interaction

GSAP scroll-triggered entrance animations for section reveals; email modal with one-click copy; hover states and focus rings consistent with WCAG 2.4.11; responsive layout from full desktop to stacked single-column mobile.

📓
Jupyter Notebooks
Rendered via nbviewer — code, outputs, markdown preserved
📊
PowerPoint
Parsed and displayed via pptxjs — no Office required
📄
PDF
Native browser embed — scrollable, zoomable
📋
Curriculum Docs
HTML/structured documents rendered inline
How I worked

Design Process

01 Define requirements Identify what a reviewer needs: scan subject areas fast, open any artifact without friction, verify credentials, and contact easily.
02 Map IA Hero → About → Portfolio (filterable) → Skills → Contact. Five sections, one scroll — no routing complexity.
03 Solve format rendering Research and prototype rendering solutions for each format: nbviewer for notebooks, pptxjs for slides, PDF embed for documents.
04 Build & style Implement layout, GSAP animation, filter logic, and modal interactions in vanilla HTML/CSS/JS — no build step required.
05 Accessibility pass WCAG audit: semantic structure, ARIA labels, keyboard navigation, focus trapping in modals, contrast ratio checks.
06 Deploy & validate GitHub Pages deployment; cross-browser and mobile validation; check all artifact formats render correctly in production.
Starting point

Foundation & Constraints

The brief was practical: a single URL that shows the full range of teaching work — from Python data science notebooks to physical education curriculum — without forcing any reviewer to download files or have specific software installed. The audience is often non-technical (administrators, hiring committees) opening the link on whatever device they have.

Fixed constraints: Static hosting only (GitHub Pages — no server-side rendering). No accounts, no backend, no build pipeline — the entire site must run as pure HTML/CSS/JS. Accessibility non-negotiable.

Variable: Which artifacts to feature, how deep the category structure should go, and how much motion to include before it harms accessibility on prefers-reduced-motion contexts.

Portfolio section — teaching artifacts with category filters

Portfolio section with category filter active — the core browsing experience for reviewers.

Visual direction

Look & Feel: Calm & Credible

Brand intent: The site should feel professional and unhurried — a reviewer opening this should immediately feel they're looking at a serious practitioner's work, not a student project. That means clean typography, generous whitespace, and motion that enhances rather than competes with the content.

Chosen direction: "Scaffolded clarity"

A warm, neutral base palette with a single accent color. GSAP scroll animations reveal sections progressively — framing each area as a separate reading beat. Cards use consistent structure (category badge, title, description, format tag) so the eye learns the pattern once and reads the rest instantly.

About section — brief intro with quote card
About section

Brief, human introduction with a quote card — establishes teaching philosophy before the artifacts. Keeps tone personal and direct, not a résumé recitation.

Feature cards — Inclusive Accessibility, Data-Driven Design, Scalable Systems
Principle cards

Three core principles (Inclusive Accessibility, Data-Driven Design, Scalable Systems) positioned before the portfolio grid — frames how I teach before showing what I taught.

Feature drilled end-to-end

Mini Case Study: The Multi-Format Viewer

The hardest problem in this project wasn't layout or animation — it was making four completely different file formats open legibly in a browser, without requiring the visitor to do anything beyond clicking.

Requirements

  • Open any artifact in the browser — no download prompt, no "open with" dialog.
  • Preserve the native reading experience of each format: code in notebooks, slides in presentations, pages in PDFs.
  • Keep the same modal shell across all formats so the UI stays predictable.
  • Remain keyboard-navigable and focusable within the overlay per WCAG 2.1 AA.

First Exploration — Problems Found

  • PowerPoint: Native browser has no PPT support. First attempt (Office Online embed) required Microsoft account. Rejected: auth friction defeats the no-account constraint.
  • Jupyter Notebooks: Raw .ipynb files render as JSON in the browser. Direct iframe to GitHub fails on CORS. Solution: nbviewer URL pattern as iframe src.
  • PDF: Embedded <iframe> or <embed> works natively but has inconsistent mobile behavior. Added fallback link for mobile browsers that block PDF embeds.
  • Modal focus trap: Early version allowed Tab to escape the overlay into the background page — a WCAG 2.1 failure (SC 2.1.2).

Iteration — What Changed

  • PowerPoint → pptxjs: Replaced the Office Online approach with pptxjs, which parses .pptx client-side and renders slides as DOM elements — no server, no auth, fully offline-capable.
  • Focus trap implementation: Added a JavaScript focus-trap loop inside the modal that cycles Tab through all focusable elements within the overlay and blocks escape to the background.
  • PDF fallback: Added a "Download PDF" link that appears below the embed on narrow viewports where iframe rendering is suppressed.
  • GSAP + prefers-reduced-motion: All scroll animations wrapped in a media query check — users with reduced motion get instant, non-animated section reveals instead.

Accessibility Implementation

⌨️
Keyboard nav Full Tab order through all interactive elements; focus trap in modals; Esc closes overlay
🏷️
ARIA labels Descriptive aria-label on icon-only buttons; role="dialog" and aria-modal on overlays
🎨
Contrast All text/background pairs validated at 4.5:1 minimum (WCAG AA); focus rings visible at 3:1 against adjacent colors
Reduced motion GSAP animations disabled via prefers-reduced-motion: reduce media query — instant reveals replace scroll animations

Design Decisions Table

Challenge First attempt Problem Solution shipped
PowerPoint rendering Office Online embed iframe Required Microsoft account — breaks no-auth constraint pptxjs client-side parser — renders slides as DOM, no server
Jupyter notebooks Direct GitHub file iframe CORS blocks raw GitHub file iframes nbviewer URL pattern as iframe src — renders notebooks publicly
PDF mobile fallback iframe embed only iOS Safari suppresses PDF iframes on narrow viewport Fallback download link rendered below embed on mobile breakpoints
Modal focus management Standard modal open/close Tab escaped overlay into background — WCAG SC 2.1.2 failure JavaScript focus-trap loop cycles Tab within overlay only
Scroll animation + accessibility GSAP animations always active Animated scrolling harmful for vestibular disorders All GSAP animations gated by prefers-reduced-motion media query
Category filtering Page reload per filter Full reload disorienting; lost scroll position Client-side JS filter — hides/shows cards instantly without navigation
All sections

Site Gallery

Full page coverage — from hero to footer. Subject areas include Python, Data Science, Physical Education, Learning Methodology, and Professional Development.

Component library

Design System

Every section follows the same structural pattern: entrance animation (or instant reveal), consistent card anatomy, and shared interactive behaviors (hover, focus, click). This lets the design scale to any number of artifacts without creating new patterns.

Atoms
Category badge Format tag (PDF, PPT, notebook) Focus ring Icon button Section label Divider
Molecules
Artifact card (badge + title + description + tag) Filter chip row Skill item Principle card Quote block
Organisms / Templates
Artifact viewer modal (shared shell, format-specific content) Portfolio grid (filterable) Skills grid (two-column) Hero section Email modal

Reuse principle: The artifact viewer modal is the only complex component. Every format (notebook, PPT, PDF, curriculum) loads into the same modal shell — only the inner rendering strategy changes. Adding a new format means adding one render branch, not a new component.

Result

Outcome

A live, accessible, zero-dependency teaching portfolio that presents diverse educational materials in one unified browser experience. The site demonstrates both teaching breadth (five subject areas, multiple artifact types) and front-end capability (multi-format rendering, GSAP animation, WCAG compliance, vanilla JavaScript architecture).

Because it runs as a pure static site on GitHub Pages, there are no hosting costs, no maintenance overhead, and no dependencies to update — it will remain accessible and functional indefinitely.

What I'd do next
  • Search across artifacts — full-text search through titles and descriptions for visitors who know what they're looking for.
  • Print-optimized view — a clean, paginated print stylesheet for reviewers who want a paper copy.
  • Automated a11y testing — axe-core or Lighthouse CI in the GitHub Actions pipeline to catch regressions when content is updated.
  • More artifact types — video recordings of live lessons, student work samples (anonymized), and rubric documents.