The data-visualization portfolio of Eric Summers → https://ericsummers.io
A static site (no build step) that frames interactive data stories and Tableau Public vizzes in a warm editorial "gallery" shell. Hosted on GitHub Pages with a custom domain.
vizyourdata-portfolio/
├─ index.html home / gallery (renders cards from the catalog)
├─ 404.html on-brand not-found
├─ CNAME ericsummers.io (custom domain for Pages)
├─ .nojekyll serve files as-is (skip Jekyll)
├─ assets/
│ ├─ css/site.css the design system (the gallery shell)
│ ├─ js/vizzes.js ⭐ the catalog: the ONE place you edit to publish work
│ ├─ js/site.js renders the gallery cards
│ └─ img/ favicon.svg, og.svg
├─ embed/index.html shared viewer for any Tableau Public single-sheet viz
├─ lab/index.html ⚗ the Lab: wires up any workbook + auto-builds its controls
│ (engine lives in assets/js/lab.js)
└─ three-days-in-the-desert/ a full custom data story (its own page)
└─ index.html
Open assets/js/vizzes.js and add one object to the array. Two kinds:
{
slug: "superstore-pulse",
kind: "tableau",
type: "Tableau Public",
title: "Superstore Pulse",
sub: "A single-sheet look at profit by region and category.",
tableauUrl: "https://public.tableau.com/views/YourWorkbook/YourSheet",
tags: ["Tableau", "Retail"],
date: "Jul 2026",
accent: "#1F77B4" // pulled into the card + viewer
}The card links to /embed/?v=superstore-pulse, which frames the live viz (Embedding API v3)
with a back-to-gallery bar. Drop a thumbnail in assets/img/ and add
art:{ type:"img", src:"assets/img/superstore.png" } for a custom card image; otherwise a
branded placeholder tile is drawn.
Tip: the
tableauUrlis the/views/Workbook/Sheetform (open the published viz, copy the URL, strip any?:embed=...query string). Single-sheet works best in the framed viewer.
- Drop the page at
your-slug/index.html(it becomeshttps://ericsummers.io/your-slug/). - Add a
.vyd-homeback-link (copy the snippet fromthree-days-in-the-desert/index.html). - Add the catalog entry:
{
slug: "your-slug",
kind: "story",
type: "Data story",
title: "…",
sub: "…",
href: "/your-slug/",
tags: ["Scrollytelling"],
date: "…",
accent: "#…"
}The first entry with feature: true renders as the wide hero card.
A template zone for building custom-UI embeds. Open /lab/?src=<tableau-public-url>
(or paste a URL into the patch-bay input). The page embeds the workbook with the Tableau
toolbar hidden, then introspects it through the Embedding API v3 and generates web
controls that correspond to what it finds:
- Sheets — published sheets become tab chips (
activateSheetAsync) - Filters — categorical filters render as chips (≤ 8 values) or a checkbox well
(
getDomainAsync→applyFilterAsync); quantitative/date range filters become min–max inputs (applyRangeFilterAsync) - Parameters — list params become chips/selects, range params become sliders,
booleans become toggles (
changeParameterValueAsync) - Actions — undo / redo / reset / refresh / export, rebuilt as on-brand buttons
- the event tape at the bottom narrates every API event (
filterchanged,parameterchanged,markselectionchanged, …) as it happens
Use it as the starting point for any piece that needs a hand-rolled UI around a
Tableau viz: copy lab/index.html + assets/js/lab.js into a new story folder and
replace the auto-generated panel with bespoke controls.
It's static, but the gallery + embed use JS, so serve over http (not file://):
python -m http.server 8080 # then open http://localhost:8080
# or: npx serve .- Create a GitHub repo and push this folder (default branch
main). - Settings → Pages → Source: Deploy from a branch →
main// (root). - The
CNAMEfile sets the custom domain to ericsummers.io automatically. - At your DNS provider, point the apex
ericsummers.ioat GitHub Pages:Arecords →185.199.108.153,185.199.109.153,185.199.110.153,185.199.111.153- (and optionally
AAAA→2606:50c0:8000::153…8003::153) CNAMEforwww→<your-username>.github.io
- Back in Settings → Pages, tick Enforce HTTPS once the cert is issued.
- Type: Fraunces (display/body) · DM Mono (labels) · Anton (numerals).
- Palette: warm paper + ink, terracotta accent. Each viz carries its own
accentso the shell stays quiet and the work pops. - Replace
assets/img/og.svgwith a 1200×630 PNG for the richest social previews (some platforms don't render SVG cards).