network = {const W =1160, H =1160, cx = W /2, cy = H /2, R =380;const dotR = R -14, subR = R *0.62, themeR = R *0.28;const themeColors =newMap([ ["Partnerships","#57068c"], ["Topics","#8e5bc2"], ["Methods","#37474f"], ["Disciplines","#6f8f9c"] ]);const typeLabels = {article:"Journal article",wip:"Work in progress",chapter:"Book or chapter",presentation:"Conference presentation" };// Build categories and attach each work to the subtopics it is tagged withconst subs = taxonomy.map(d => ({ theme: d.theme,name: d.subtopic,label: d.label|| d.subtopic,members: [] }));const subByName =newMap(subs.map(s => [s.name, s]));const papers = items.map((d, i) => ({...d,id: i,tagList: d.tags.split(";").map(t => t.trim()).filter(Boolean),dots: [] }));for (const p of papers) {for (const t of p.tagList) {const s = subByName.get(t);if (s) s.members.push(p);elseconsole.warn(`Unknown tag "${t}" on: ${p.title}`); } }// Lay subtopics around the circle; each gets room for its dots and its label (in pixels),// then everything is scaled to fit the circumferenceconst dotPx =14, labelCharPx =8.6, gapSubPx =16, gapThemePx =60; subs.forEach(s => s.px=Math.max((s.members.length+1) * dotPx, s.label.length* labelCharPx +12));const gapAfter = subs.map((s, i) => subs[(i +1) % subs.length].theme!== s.theme? gapThemePx : gapSubPx);const scale = (2*Math.PI* R) / (d3.sum(subs, s => s.px) + d3.sum(gapAfter));const toAng = px => (px * scale) / R;let a =toAng(gapAfter[gapAfter.length-1] /2); subs.forEach((s, i) => { s.a0= a; s.a1= a +toAng(s.px); s.mid= (s.a0+ s.a1) /2;const step =toAng(dotPx);const start = s.mid- (step * (s.members.length-1)) /2; s.members.forEach((p, j) => p.dots.push({ paper: p,sub: s,angle: start + j * step })); a = s.a1+toAng(gapAfter[i]); });const themes =Array.from(d3.group(subs, s => s.theme), ([name, ss]) => ({ name,subs: ss,a0: d3.min(ss, s => s.a0),a1: d3.max(ss, s => s.a1),color: themeColors.get(name) ||"#57068c" })); themes.forEach(t => t.mid= (t.a0+ t.a1) /2);const themeByName =newMap(themes.map(t => [t.name, t])); subs.forEach(s => {const t = themeByName.get(s.theme);const k = t.subs.indexOf(s); s.color= d3.interpolateRgb(t.color,"#ffffff")(k %2?0.38:0); });const pt = (ang, r) => [cx + r *Math.sin(ang), cy - r *Math.cos(ang)];const dots = papers.flatMap(p => p.dots);// One curve for every pair of subtopics a work belongs to, bundled through its themesconst line = d3.line().curve(d3.curveBundle.beta(0.85));const links = [];for (const p of papers) {for (let i =0; i < p.dots.length; i++) {for (let j = i +1; j < p.dots.length; j++) {const A = p.dots[i], B = p.dots[j];const tA = themeByName.get(A.sub.theme), tB = themeByName.get(B.sub.theme);const pts = [pt(A.angle, dotR -6),pt(A.sub.mid, subR),pt(tA.mid, themeR)];if (tA !== tB) pts.push(pt(tB.mid, themeR)); pts.push(pt(B.sub.mid, subR),pt(B.angle, dotR -6)); links.push({ paper: p,d:line(pts),color: tA.color }); } } }// Layout: info panel beside the diagramconstroot=html`<div class="network-wrap"></div>`;const panel =html`<div class="network-panel"></div>`;root.append(panel);const svg = d3.select(root).append("svg").attr("viewBox",`0 0 ${W}${H}`).attr("class","network-svg").attr("role","img").attr("aria-label","Diagram connecting my publications and presentations to the partnerships, topics, methods, and disciplines they draw on");const linkSel = svg.append("g").attr("fill","none").selectAll("path").data(links).join("path").attr("d", d => d.d).attr("stroke","currentColor").attr("stroke-opacity",0.09).attr("stroke-width",1); svg.append("g").selectAll("path").data(subs).join("path").attr("transform",`translate(${cx},${cy})`).attr("d", s => d3.arc().innerRadius(R).outerRadius(R +9).startAngle(s.a0).endAngle(s.a1).cornerRadius(2)()).attr("fill", s => s.color).style("cursor","pointer").on("mouseenter", (e, s) =>highlightSub(s)).on("mouseleave", reset);// Subtopic labels follow the arc; flipped on the bottom half so they read uprightconst defs = svg.append("defs");const arcPath = (r, a0, a1, flip) => {const [x0, y0] =pt(flip ? a1 : a0, r), [x1, y1] =pt(flip ? a0 : a1, r);const large =Math.abs(a1 - a0) >Math.PI?1:0;return`M${x0},${y0} A${r},${r} 0 ${large}${flip ?0:1}${x1},${y1}`; }; subs.forEach((s, i) => {const flip = s.mid>Math.PI/2&& s.mid< (3*Math.PI) /2; s.labelId=`net-sub-${i}`; defs.append("path").attr("id", s.labelId).attr("d",arcPath(flip ? R +30: R +18, s.a0-0.4, s.a1+0.4, flip)); }); svg.append("g").selectAll("text").data(subs).join("text").attr("class","network-sub-label").append("textPath").attr("href", s =>`#${s.labelId}`).attr("startOffset","50%").attr("text-anchor","middle").text(s => s.label); svg.append("g").selectAll("text").data(themes).join("text").attr("class","network-theme-label").attr("x", t =>pt(t.mid, R +70)[0]).attr("y", t =>pt(t.mid, R +70)[1]).attr("text-anchor", t =>Math.sin(t.mid) >0.2?"start":Math.sin(t.mid) <-0.2?"end":"middle").attr("dominant-baseline","middle").attr("fill", t => t.color).text(t => t.name);const dotSel = svg.append("g").selectAll("circle").data(dots).join("circle").attr("cx", d =>pt(d.angle, dotR)[0]).attr("cy", d =>pt(d.angle, dotR)[1]).attr("r",5).style("fill", d => d.paper.type==="presentation"?"var(--bs-body-bg, #fff)": d.sub.color).attr("fill-opacity", d => d.paper.type==="presentation"?1:0.55).attr("stroke", d => d.sub.color).attr("stroke-width", d => d.paper.type==="presentation"?1.6:0).style("cursor", d => d.paper.link?"pointer":"default").on("mouseenter", (e, d) =>highlightPaper(d.paper)).on("mouseleave", reset).on("click", (e, d) => { if (d.paper.link) window.open(d.paper.link,"_blank","noopener"); });// Info panel contentconst defaultPanel = () => { panel.innerHTML=""; panel.append(html`<div class="network-kicker">Explore my work</div> <p class="network-help">Each dot is one of my papers or presentations, placed under every partnership, topic, method, and discipline it draws on. Hover over a dot to see how a single project connects across them, or over an arc to see all the work in that area.</p> <p class="network-legend"><span class="dot filled"></span> Paper or chapter <span class="dot hollow"></span> Presentation</p>`); };const showPaper = p => { panel.innerHTML="";const tagsByTheme = themes.map(t => ({ t,tags: p.tagList.filter(x => subByName.get(x)?.theme=== t.name) })).filter(g => g.tags.length); panel.append(html`<div class="network-kicker">${typeLabels[p.type] ||""}</div> <div class="network-title">${p.title}</div> <div class="network-meta">${p.authors}${p.year?` (${p.year})`:""} · <em>${p.venue}</em></div> <div class="network-tags">${tagsByTheme.map(g =>html`<div><span style="color:${g.t.color}">${g.t.name}:</span> ${g.tags.join(", ")}</div>`)}</div>${p.link?html`<div class="network-link">Click the dot to open it →</div>`:""}`); };const showSub = s => { panel.innerHTML=""; panel.append(html`<div class="network-kicker" style="color:${themeByName.get(s.theme).color}">${s.theme}</div> <div class="network-title">${s.name}</div> <div class="network-meta">${s.members.length}${s.members.length===1?"work":"works"}</div> <ul class="network-list">${s.members.map(p =>html`<li>${p.title}</li>`)}</ul>`); };functionsetActive(isActive) { linkSel.attr("stroke", d =>isActive(d.paper) ? d.color:"currentColor").attr("stroke-opacity", d =>isActive(d.paper) ?0.75:0.04).attr("stroke-width", d =>isActive(d.paper) ?1.8:1); dotSel.attr("fill-opacity", d => d.paper.type==="presentation"?1:isActive(d.paper) ?1:0.25).attr("stroke-opacity", d =>isActive(d.paper) ?1:0.3).attr("r", d =>isActive(d.paper) ?6.5:5); linkSel.filter(d =>isActive(d.paper)).raise(); }functionhighlightPaper(p) { setActive(q => q === p);showPaper(p); }functionhighlightSub(s) { constset=newSet(s.members);setActive(q =>set.has(q));showSub(s); }functionreset() { linkSel.attr("stroke","currentColor").attr("stroke-opacity",0.09).attr("stroke-width",1); dotSel.attr("fill-opacity", d => d.paper.type==="presentation"?1:0.55).attr("stroke-opacity",1).attr("r",5);defaultPanel(); }defaultPanel();returnroot;}
Peer-Reviewed Publications
Bartoli, B., Morris-Perez, P., & Hughes, D. (2026). The Choice-in-Context Model: An interdisciplinary theory of decision-making in school choice contexts. AERA Open, 12. [DOI]
Aviles, A. I., Abenavoli, R., Bartoli, B., Siegel, J., Kitrosser, J., Dominguez, A., Young, J., Kim, J., Rockey, K., Barahal, H., Wallack, J., Cappella, E., & Morris-Perez, P. (2026). Bringing arts integration to universal pre-K: Variation in impact of New York City’s Create. Early Childhood Research Quarterly, 78, 45–58. [DOI]
Abenavoli, R., Siegel, J., Aviles, A. I., Kitrosser, J., Dominguez, A., Bartoli, B., Young, J., Kim, J., Davis, R., Wallack, J., Cappella, E., & Morris-Perez, P. (2026). Strengthening school readiness for all: Impacts of New York City’s Pre-K for All professional learning on teacher practice and children’s school readiness. Prevention Science, 1–15. [DOI]
Kumar, A., Wolf, S., Bartoli, B., Bala, J., Varma, V., & Zanutto, E. (2026). Supporting early learning: An audio-video program for low-literate parents of young children in urban India. International Journal of Educational Research, 137. [DOI]
Jeong, J., Bartoli, B., & McCann, J. (2024). Development and validation of a measure for father involvement during early childhood in a resource-limited context. BMC Public Health, 24, 2970. [DOI]
Kumar, A., Bartoli, B., Lichand, G., & Wolf, S. (2023). Sociodemographic predictors of depression and anxiety symptomatology among parents in rural Côte d’Ivoire. Journal of Affective Disorders, 338, 1–9. [DOI]
Bartoli, B., Joshi, C., & Wolf, S. (2022). Parental engagement in Ghanaian pre-primary schools: A mixed methods approach. International Journal of Educational Research, 112. [DOI]
Works in Progress
Bartoli, B. Catching families before they slip through the cracks: Using early warning systems to increase preschool enrollment.
Bartoli, B., & King, J. R. Sleep tight, act right? The effect of clock time policy on student behavior outcomes.
Bartoli, B., Chang, J., & King, J. R. Post-pandemic (dis)enrollment in New York City’s choice-based school system.
Morris-Perez, P., Connors, M., & Bartoli, B. The concentric circles were never Bronfenbrenner’s: A story of mistaken attribution with profound consequences. Submitted.
Bartoli, B., Aviles, A. I., Blecker, A., Abenavoli, R., Kohan, A., Song, Y., Cappella, E., Morris-Perez, P., et al. Changing teacher practices in pre-K: Qualitative insights from New York City’s Create.
Bartoli, B., Aviles, A. I., Abenavoli, R., Mascorro-Santibañez, M., Cappella, E., Morris-Perez, P., et al. Integrating the arts at scale: A qualitative study of implementation strategies and children’s skill development in New York City’s universal pre-K.
Ganimian, A. J., Page, L. C., Childs, J., Mesalles, V., & Bartoli, B. Pervasive, predictable, and (partly) preventable: Student absenteeism in a middle-income country.
Book Chapters and Edited Volumes
Vegas, E., Bartoli, B., Giesso, S., & Rosich, V. (Eds.). Beyond Oil: Education for Growth, Inclusion, and Human Flourishing in Venezuela. Harvard Graduate School of Education. Under review at Oxford University Press.
Jaramillo Samper, M., & Bartoli, B. Venezuela’s future begins in early childhood. In E. Vegas, B. Bartoli, S. Giesso, & V. Rosich (Eds.), Beyond Oil. Under review at Oxford University Press.
Morris-Perez, P., Connors, M., & Bartoli, B. Bronfenbrenner’s legacy: Harnessing the beautiful complexity of humanity. In P. A. Fisher & J. Lombardi (Eds.), The Cambridge Handbook of the New Ecology of Early Childhood. Forthcoming.
Names of mentored students in italics.
Conference Presentations
Bartoli, B. presenting work with King, J. R. “Sleep tight, act right? The effect of clock time policy on student behavior outcomes.” APPAM Annual Meeting, Seattle, WA, November 2025; AEFP Annual Meeting, Chicago, IL, March 2026.
Bartoli, B. presenting work with Jeong, J., & McCann, J. “The development and validation of a measure for father involvement during early childhood in a resource-limited context.” SRCD Biennial Meeting, Minneapolis, MN, May 2025.
Bartoli, B. “Does choice architecture matter in universal ECE systems? Linking application system design, information, and family behavior.” APPAM Annual Meeting, November 2024.
Bartoli, B. “Embedding AI into New York City Public Schools’ family supports: A pilot program.” Poster, SREE Annual Meeting, Baltimore, MD, September 2024.
Bartoli, B., & Siegel, J., presenting work with Abenavoli, R., Aviles, A., Cappella, E., & Morris-Perez, P. “Professional development post-pandemic: What makes an impact on school readiness in Pre-K for All?” SREE Annual Meeting, Baltimore, MD, September 2024.
Bartoli, B. “The illusion of choice: The role of constraints and privilege in Pre-K for All.” AERA Annual Meeting, Philadelphia, PA, April 2024.
Bartoli, B. “Navigating school choice processes in a universal pre-K system.” APPAM Annual Meeting, Atlanta, GA, November 2023.
Bartoli, B. presenting work with Joshi, C., & Wolf, S. “Defining parental engagement and quality expectations in Ghanaian pre-primary schools.” CIES Annual Meeting (virtual), April 2021.
Invited Presentations
Early Childhood Panel Moderator. Beyond Oil: Education for Growth, Inclusion and Human Flourishing in Venezuela. Harvard Graduate School of Education, May 2026.
Non-Profit Work Panel Moderator. Life after the PhD Conference. New York University, May 2025.