diff --git a/posts/foreign-buyer-tax-vancouver-toronto/+page.svelte b/posts/foreign-buyer-tax-vancouver-toronto/+page.svelte index 00e1d0f..24ad77d 100644 --- a/posts/foreign-buyer-tax-vancouver-toronto/+page.svelte +++ b/posts/foreign-buyer-tax-vancouver-toronto/+page.svelte @@ -65,7 +65,7 @@
-
+
About the dynamic difference-in-differences models

A standard difference-in-differences model compares one group's change over time to another group's change, before and after a policy, and treats the gap between them as the estimated effect. A dynamic version, also called an event study, estimates that gap separately for each year rather than assuming one constant effect for the whole post-policy period. That makes it possible to see how the effect builds or fades over time, and to check that taxed and untaxed areas were not already trending apart before the tax existed. diff --git a/posts/sidewalk-coverage-toronto/+page.svelte b/posts/sidewalk-coverage-toronto/+page.svelte new file mode 100644 index 0000000..5c5e8cb --- /dev/null +++ b/posts/sidewalk-coverage-toronto/+page.svelte @@ -0,0 +1,68 @@ + + +

+ +

+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. +

+

+ Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. +

+ +
+ + + + + +
+ +

+ Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. +

+

+ Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit. +

+ +
+ +
+ +
+ +

Data sources and processing

+ +

+ This data draws two sources from the City of Toronto: a 2019 baseline of where sidewalks were missing, and two overlapping records of what's been built or planned as of 2026. Each data source is described below, along with how we combined them. +

+ +

+ Overall, the map on this page is meant to show citywide patterns, not to confirm the status of a specific address or segment. If you want to know whether a sidewalk is planned, underway, or completed on your own street, the city's Sidewalk Programs, Policies and By-laws page is where to find further information. +

+ +

+ The Pedestrian Network layer comes from the City of Toronto's Open Data portal, first published in August 2019 by the City. At the time of writing, the portal lists the data as "last refreshed" in February 2026, but that date reflects when the files were last re-exported, not necessarily when the underlying sidewalk geometry was last checked. The dataset's own documentation dates to January 2020, and there's no changelog indicating what, if anything, has been updated since. We thus treat it here as a snapshot of sidewalk coverage circa 2019–2020 rather than a more up-to-date inventory. It's the baseline for the map on this page: each road segment is coded by whether a sidewalk exists on both sides, one side, neither side, or not at all. +

+ +

+ The Sidewalk Construction Program dataset, on the Open Data portal, lists locations currently in the city's active pipeline for new sidewalk installation. 96 locations at the time of writing, with planned start years from 2023 to 2027. Every record in it is marked with an "Active" status, but there is no "completed" status and no changelog, so as of this dataset's last refresh (February 2026) it tells us only what was planned or underway at that time. Some of it may since have been completed. +

+ +

+ As well, each year since 2020, Transportation Services has reported new missing-sidewalk installations to the Infrastructure and Environment Committee. All seven reports are linked from the city's Sidewalk Programs, Policies and By-laws page. +

+ +

+ We then matched the council-report locations against the Sidewalk Construction Program records by street name. 62 matched, and where they did, the "from/to" descriptions lined up almost exactly, confirming the Construction Program dataset is fed by these same annual reports rather than being an independent source. For the remaining 75 locations, which don't (yet, or ever) appear in the Construction Program list, we located them on the ground by matching their street names relative to the City's Centreline (TCL) dataset, then used that location to pull the corresponding geometry. Eleven street names existed in more than one part of the city (e.g. two separate Hillside Drives), so we used each report's stated ward, matched against the City's ward boundaries, to keep only the correct one. This resolved almost all of the locations to the right street and general location. +

+ + + +
+ +
\ No newline at end of file diff --git a/posts/sidewalk-coverage-toronto/charts.js b/posts/sidewalk-coverage-toronto/charts.js new file mode 100644 index 0000000..762d0d8 --- /dev/null +++ b/posts/sidewalk-coverage-toronto/charts.js @@ -0,0 +1,26 @@ +import { resolveDownloads } from '$lib/downloads.js'; + +const dataUrls = import.meta.glob('./data/*', { eager: true, query: '?url', import: 'default' }); +const pngUrls = import.meta.glob('./published/*/*.png', { + eager: true, + query: '?url', + import: 'default' +}); +const embedMeta = import.meta.glob('./published/*/embed.json', { + eager: true, + import: 'default' +}); + +const charts = { + 'sidewalk-coverage-map': { + authors: ['Jeff Allen'], + title: 'Mapping sidewalk coverage in Toronto', + subtitle: '71% of streets have sidewalks on both sides; 13% have no sidewalks at all', + source: 'City of Toronto: Pedestrian Network Data (2019) and Sidewalk Construction Program and annual council reports (2020-2026)', + alt: "Map of every street in Toronto, colored by sidewalk coverage: blue for sidewalks on both sides, yellow for one side only, and red for no sidewalk. Blue dominates downtown and older neighbourhoods; red and yellow cluster in the inner suburbs, especially parts of Etobicoke, North York, and Scarborough. A few black lines mark streets with a new or planned sidewalk installation since 2020.", + widths: [1440, 1080], + graphicVerb: 'created' + } +}; + +export default resolveDownloads(charts, { dataUrls, pngUrls, embedMeta }); diff --git a/posts/sidewalk-coverage-toronto/charts/sidewalk-coverage-map.svelte b/posts/sidewalk-coverage-toronto/charts/sidewalk-coverage-map.svelte new file mode 100644 index 0000000..7b34362 --- /dev/null +++ b/posts/sidewalk-coverage-toronto/charts/sidewalk-coverage-map.svelte @@ -0,0 +1,139 @@ + + +
+ + + + +
+
Toronto streets
+ {#each legendGroups as group, i} +
+
{group.title}
+ {#each group.items as item} +
+ + {item.label} +
+ {/each} +
+ {/each} +
+
+ + diff --git a/posts/sidewalk-coverage-toronto/images/toronto-sidewalks-qgis-for-web-labels.png b/posts/sidewalk-coverage-toronto/images/toronto-sidewalks-qgis-for-web-labels.png new file mode 100644 index 0000000..8455c4b Binary files /dev/null and b/posts/sidewalk-coverage-toronto/images/toronto-sidewalks-qgis-for-web-labels.png differ diff --git a/posts/sidewalk-coverage-toronto/meta.json b/posts/sidewalk-coverage-toronto/meta.json new file mode 100644 index 0000000..20f2018 --- /dev/null +++ b/posts/sidewalk-coverage-toronto/meta.json @@ -0,0 +1,12 @@ +{ + "title": "Mapping sidewalk coverage in Toronto", + "type": "post", + "summary": "71% of streets have sidewalks on both sides; 13% have no sidewalks at all.", + "authors": ["Kosta Diochnos", "Jeff Allen"], + "published": "2026-10-15", + "license": "CC-BY-4.0", + "protected": true, + "geography": ["Toronto"], + "tags": ["urban","active travel","walking", "accessibility"], + "documents": [] +} diff --git a/src/lib/ChartFrame.svelte b/src/lib/ChartFrame.svelte index 1dd5b49..3818aca 100644 --- a/src/lib/ChartFrame.svelte +++ b/src/lib/ChartFrame.svelte @@ -14,6 +14,10 @@ // same override pattern as meta.graphicVerb ?? 'created' below. const chartLicense = $derived(meta.license ?? license); + // meta.authors (set per-chart in charts.js) overrides the post-level author + // list, for posts where not every listed author worked on every chart. + const chartAuthors = $derived(meta.authors ?? authors); + // Derived from the current route's slug so a folder rename (which changes the // slug) updates these links everywhere automatically, with nothing hardcoded. @@ -199,8 +203,8 @@ {#if meta.note}

Note: {meta.note}

{/if} - {#if authors && authors.length > 0} -

Graphic {meta.graphicVerb ?? 'created'} by {formatAuthorList(authors)}

+ {#if chartAuthors && chartAuthors.length > 0} +

Graphic {meta.graphicVerb ?? 'created'} by {formatAuthorList(chartAuthors)}

{/if}
diff --git a/src/lib/styles.css b/src/lib/styles.css index 25201fa..6deb694 100644 --- a/src/lib/styles.css +++ b/src/lib/styles.css @@ -260,11 +260,33 @@ li { margin-bottom: 12px; } -.details-block p { +.data-methods h2 { + font-size: 22px; + margin-top: 24px; + margin-bottom: 12px; + padding-bottom: 8px; + border-bottom: solid 1px var(--brandYellow); +} + +.data-methods h2:first-child { + margin-top: 0; +} + +.data-methods h3 { + font-size: 18px; + margin-top: 20px; +} + +.data-methods h4 { + font-size: 16px; +} + +.data-methods p, +.data-methods li { font-size: 16px; line-height: 24px; } -.details-block p:last-child { +.data-methods p:last-child { padding-bottom: 0; }