diff --git a/website/content/_index.md b/website/content/_index.md
index e2c38fea..dd8f08a8 100644
--- a/website/content/_index.md
+++ b/website/content/_index.md
@@ -342,6 +342,7 @@ Proceduralism lets you create sophisticated design elements that are easy to edi
@@ -350,12 +351,12 @@ Proceduralism lets you create sophisticated design elements that are easy to edi
diff --git a/website/content/blog/2024-01-01-looking-back-on-2023-and-what's-next.md b/website/content/blog/2024-01-01-looking-back-on-2023-and-what's-next.md
index f6bbe993..adb11271 100644
--- a/website/content/blog/2024-01-01-looking-back-on-2023-and-what's-next.md
+++ b/website/content/blog/2024-01-01-looking-back-on-2023-and-what's-next.md
@@ -20,6 +20,7 @@ I am grateful to everyone who has placed their faith in my vision for Graphite s
diff --git a/website/content/blog/2024-05-09-graphite-progress-report-q1-2024.md b/website/content/blog/2024-05-09-graphite-progress-report-q1-2024.md
new file mode 100644
index 00000000..9fbf5545
--- /dev/null
+++ b/website/content/blog/2024-05-09-graphite-progress-report-q1-2024.md
@@ -0,0 +1,242 @@
++++
+title = "Graphite progress report (Q1 2024)"
+date = 2024-05-09
+[extra]
+banner = "https://static.graphite.rs/content/blog/2024-05-09-graphite-progress-report-q1-2024.avif"
+banner_png = "https://static.graphite.rs/content/blog/2024-05-09-graphite-progress-report-q1-2024.png"
+author = "Keavon Chambers & Hypercube"
+reddit = "https://www.reddit.com/r/graphite/comments/1coa0if/blog_post_graphite_progress_report_q1_2024/"
+twitter = "https://twitter.com/GraphiteEditor/status/1788698448348266946"
++++
+
+[Graphite](/) is a new 2D vector graphics editor bringing a modern, nondestructive approach to creative workflows with node-based procedural generation. The project is currently three years into development, with a focus on streamlining the creative process for procedural vector artwork. See the [roadmap](/features#roadmap) for a more in-depth summary of the goals for 2024 and beyond.
+
+
+
+Starting in 2024, we are now publishing quarterly reports to summarize the new features and improvements made to Graphite. If you missed the [2023 year in review](../looking-back-on-2023-and-what-s-next), be sure to check it out after this. We anticipate sending our first email newsletter (with more to follow roughly quarterly) in the near future as well, so be sure to [subscribe](/#community) if you haven't already.
+
+Over the first three months of the year, we are delighted to have seen many contributions both from new and recurrent contributors, including substantial interest by students through [Google Summer of Code](/blog/graphite-internships-announcing-participation-in-gsoc-2024/). We would like to send a big thanks to all of the contributors who made this progress happen. If you are interested in getting involved or just following development, see the [contributor guide](/volunteer/guide) and join [our Discord](https://discord.graphite.rs).
+
+All Q1 2024 commits may be [viewed in this list](https://github.com/GraphiteEditor/Graphite/commits/master/?since=2024-01-01&until=2024-03-31) and all noteworthy changes are detailed below. As two of the major new features are the grid and snapping systems, the *Isometric Fountain* artwork shown on this blog post demonstrates what those features can achieve.
+
+
+
+ Isometric Fountain
+
+
+
+ Open this artwork to explore it yourself.
+
+
+
+
+## Additions
+
+- *Copy to Points* node improvements, including randomization of scale and rotation with biasing ([#1540](https://github.com/GraphiteEditor/Graphite/pull/1540), [#1541](https://github.com/GraphiteEditor/Graphite/pull/1541), [commit ed82c5](https://github.com/GraphiteEditor/Graphite/commit/ed82c5f20fccd66a959334dee33351657968cdb6), [#1592](https://github.com/GraphiteEditor/Graphite/pull/1592), [commit 7e5069](https://github.com/GraphiteEditor/Graphite/commit/7e5069f638cfcc3e7af21f32eded67a005490402))
+
+
+
+
+- Improvements to the node graph UI ([#1564](https://github.com/GraphiteEditor/Graphite/pull/1564), [#1568](https://github.com/GraphiteEditor/Graphite/pull/1568))
+
+- Grid overlay for the canvas with customizable rectangular and isometric grid lines ([#1521](https://github.com/GraphiteEditor/Graphite/pull/1521), [commit 5c9d3c](https://github.com/GraphiteEditor/Graphite/commit/5c9d3c5d755e67411c110c0d5fd38d991cb6696c))
+
+
+
+
+
+
+
+
+- New and improved snapping system for aligning shapes with one another and the grid ([#1521](https://github.com/GraphiteEditor/Graphite/pull/1521), [#1567](https://github.com/GraphiteEditor/Graphite/pull/1567), [#1547](https://github.com/GraphiteEditor/Graphite/pull/1547), [#1570](https://github.com/GraphiteEditor/Graphite/pull/1570), [#1574](https://github.com/GraphiteEditor/Graphite/pull/1574))
+
+
+
+
+- *Morph* node for tweening vector shapes ([#1576](https://github.com/GraphiteEditor/Graphite/pull/1576))
+
+
+
+
+- Visualize which nodes are the source of a graph type error ([#1577](https://github.com/GraphiteEditor/Graphite/pull/1577))
+
+
+
+- Improvements to document tilting and resetting tilt ([commit 8eef96](https://github.com/GraphiteEditor/Graphite/commit/8eef96511e575d58a36289f3d0e30eb68098b4e7))
+
+- SVG import ([#1579](https://github.com/GraphiteEditor/Graphite/pull/1579), [#1656](https://github.com/GraphiteEditor/Graphite/pull/1656))
+
+
+
+
+- Re-add Select tool functionality that was lost from a code change last year ([#1583](https://github.com/GraphiteEditor/Graphite/pull/1583))
+
+- *Poisson-Disk Points* node for sampling randomly distributed points in a shape, with Red Dress demo artwork ([#1586](https://github.com/GraphiteEditor/Graphite/pull/1586), [commit 12e16b](https://github.com/GraphiteEditor/Graphite/commit/12e16b9a4efe40fcf779c34f83d3df8b3e3542f3), [#1590](https://github.com/GraphiteEditor/Graphite/pull/1590), [#1596](https://github.com/GraphiteEditor/Graphite/pull/1596))
+
+
+
+
+- Pen tool point-by-point undo while drawing without wiping out the full in-progress shape ([#1587](https://github.com/GraphiteEditor/Graphite/pull/1587), [#1597](https://github.com/GraphiteEditor/Graphite/pull/1597))
+
+
+
+
+- Freehand tool support for extending the endpoints of open paths ([#1594](https://github.com/GraphiteEditor/Graphite/pull/1594), [#1623](https://github.com/GraphiteEditor/Graphite/pull/1623))
+
+
+
+
+- Path tool support for breaking a closed shape into an open path by deleting (not dissolving) a point ([#1593](https://github.com/GraphiteEditor/Graphite/pull/1593))
+
+
+
+
+- Path tool insertion of a point on a path segment by sliding to the desired spot ([#1581](https://github.com/GraphiteEditor/Graphite/pull/1581))
+
+
+
+
+- Box-based drag selection in the node graph ([#1616](https://github.com/GraphiteEditor/Graphite/pull/1616))
+
+
+
+
+- Auto-save the document every 30 seconds ([#1580](https://github.com/GraphiteEditor/Graphite/pull/1580))
+
+- Auto-panning when drawing with each interactive tool when the user's pointer extends past the edge of the viewport ([#1625](https://github.com/GraphiteEditor/Graphite/pull/1625), [#1652](https://github.com/GraphiteEditor/Graphite/pull/1652), [#1682](https://github.com/GraphiteEditor/Graphite/pull/1682), [#1690](https://github.com/GraphiteEditor/Graphite/pull/1690))
+
+
+
+
+- Launch of the Alpha 3 release series in February ([commit f02dd5](https://github.com/GraphiteEditor/Graphite/commit/f02dd5c0f625b25bf3510ba0e9839ca182d930e4))
+
+
+
+- Search functionality by typing in menu lists ([#1499](https://github.com/GraphiteEditor/Graphite/pull/1499))
+
+
+
+
+- Improvements to the dynamic input hints of several tools ([commit 9f8466](https://github.com/GraphiteEditor/Graphite/commit/9f84661facd545bfdfeaa5d37038abeacc00ee08), [#1667](https://github.com/GraphiteEditor/Graphite/pull/1667), [#1670](https://github.com/GraphiteEditor/Graphite/pull/1670))
+
+- *Solidify Stroke* node for converting a stroke into a filled shape ([#1650](https://github.com/GraphiteEditor/Graphite/pull/1650))
+
+- Path tool point selection checkbox for locking an anchor point's handles as colinear ([commit 5bca93](https://github.com/GraphiteEditor/Graphite/commit/5bca931813e456e2f6035844c21e77ee590b7728))
+
+
+
+
+## Fixes
+
+- *Sample Points* node performance issues and bug with open paths ([#1542](https://github.com/GraphiteEditor/Graphite/pull/1542), [commit b3e4ca](https://github.com/GraphiteEditor/Graphite/commit/b3e4caec1aa4d7b702ac36638b968cf165780149), [commit 93aa10](https://github.com/GraphiteEditor/Graphite/commit/93aa10a76f96946314d5c5787418522423a76544), [#1546](https://github.com/GraphiteEditor/Graphite/pull/1546))
+
+- Some numerical node data incompatible with others ([#1543](https://github.com/GraphiteEditor/Graphite/pull/1543), [commit c14c6f](https://github.com/GraphiteEditor/Graphite/commit/c14c6fbe9345be91d04825fe8364e6639430b5e5), [#1618](https://github.com/GraphiteEditor/Graphite/pull/1618))
+
+- Incorrect placement when pasting an image ([commit cd61da](https://github.com/GraphiteEditor/Graphite/commit/cd61daf869780e1302de1a34bca7b79485ca69c3))
+
+- Unable to select upside-down (negative scale) layers ([#1560](https://github.com/GraphiteEditor/Graphite/pull/1560))
+
+- Memory leak in a type inference hashmap ([#1566](https://github.com/GraphiteEditor/Graphite/pull/1566))
+
+- Non-filled shapes are drawn missing the solid color field from their *Fill* node ([#1572](https://github.com/GraphiteEditor/Graphite/pull/1572))
+
+- *Circular Repeat* node crash when it has no input connection ([#1571](https://github.com/GraphiteEditor/Graphite/pull/1571))
+
+- Safari rendering bug that occurs with Graphite's floating menus ([commit b4dccb](https://github.com/GraphiteEditor/Graphite/commit/b4dccb865540e25a6d859e5284a50a36e361d5ee))
+
+- Performance issue affecting Windows users where every render occurred thrice ([commit a7bf6e](https://github.com/GraphiteEditor/Graphite/commit/a7bf6e24599fc3d7dc51699f916ba049758a2081))
+
+- Performance issue with nonfunctional caching of images ([#1595](https://github.com/GraphiteEditor/Graphite/pull/1595))
+
+- Numerous history steps created while dragging an input widget every frame ([#1584](https://github.com/GraphiteEditor/Graphite/pull/1584), [#1598](https://github.com/GraphiteEditor/Graphite/pull/1598))
+
+- Ugly anti-aliasing in overlays from non-alignment with the pixel grid ([#1603](https://github.com/GraphiteEditor/Graphite/pull/1603))
+
+- Dragging nodes in the graph along only one axis causes them to snap back ([#1619](https://github.com/GraphiteEditor/Graphite/pull/1619))
+
+- Path tool point coordinates using the wrong coordinate system ([#1626](https://github.com/GraphiteEditor/Graphite/pull/1626))
+
+- Layer panel grouping causing unintended reordering and loss of names ([#1627](https://github.com/GraphiteEditor/Graphite/pull/1627), [#1645](https://github.com/GraphiteEditor/Graphite/pull/1645), [#1672](https://github.com/GraphiteEditor/Graphite/pull/1672), [#1678](https://github.com/GraphiteEditor/Graphite/pull/1678), [#1637](https://github.com/GraphiteEditor/Graphite/pull/1637))
+
+- Keyboard shortcut modifier keys displayed in the UI with the wrong order ([commit 4405e0](https://github.com/GraphiteEditor/Graphite/commit/4405e01f5595c76ff8c1cdb7e6ebf752ab53943c))
+
+- Polygon tool stars and convex polygons drawn with an undesired tilt ([#1640](https://github.com/GraphiteEditor/Graphite/pull/1640))
+
+- Dropdown menus not navigable with with keyboard arrow keys ([#1630](https://github.com/GraphiteEditor/Graphite/pull/1630), [#1649](https://github.com/GraphiteEditor/Graphite/pull/1649))
+
+- Changes to a tool's options only applying after a subsequent usage ([#1646](https://github.com/GraphiteEditor/Graphite/pull/1646))
+
+- Orphaned child layers left behind when a group is ungrouped or deleted ([#1655](https://github.com/GraphiteEditor/Graphite/pull/1655))
+
+- Some tools lacking a cancelable interaction by right clicking or hitting the Escape key ([#1658](https://github.com/GraphiteEditor/Graphite/pull/1658), [#1664](https://github.com/GraphiteEditor/Graphite/pull/1664), [#1666](https://github.com/GraphiteEditor/Graphite/pull/1666))
+
+- Several related issues related to extraneous undo/redo history steps ([#1660](https://github.com/GraphiteEditor/Graphite/pull/1660), [#1668](https://github.com/GraphiteEditor/Graphite/pull/1668), [#1675](https://github.com/GraphiteEditor/Graphite/pull/1675))
+
+- Node graph not updated when switching tabs to a different document ([#1691](https://github.com/GraphiteEditor/Graphite/pull/1691))
+
+- Artboard deletion causes its child artwork to also get deleted ([#1651](https://github.com/GraphiteEditor/Graphite/pull/1651))
+
+- Path tool's point dragging gets offset when the viewport is panned ([#1693](https://github.com/GraphiteEditor/Graphite/pull/1693))
+
+- Incorrect scale-nudging behavior when multiple layers are selected ([#1699](https://github.com/GraphiteEditor/Graphite/pull/1699))
+
+- Copy-pasted layers not preserving their hidden/visible state ([#1698](https://github.com/GraphiteEditor/Graphite/pull/1698))
+
+- Non-editability of hidden layers that are selected ([#1697](https://github.com/GraphiteEditor/Graphite/pull/1697))
+
+## Internal
+
+- Several large refactors and code cleanups ([#1565](https://github.com/GraphiteEditor/Graphite/pull/1565), [#1582](https://github.com/GraphiteEditor/Graphite/pull/1582), [#1620](https://github.com/GraphiteEditor/Graphite/pull/1620), [#1695](https://github.com/GraphiteEditor/Graphite/pull/1695), [#1708](https://github.com/GraphiteEditor/Graphite/pull/1708))
+
+- Refactor for the vector format to begin being based around a concept of attributes ([#1624](https://github.com/GraphiteEditor/Graphite/pull/1624))
+
+- Preconfigure dev containers for easy containerized development environment setup ([commit 99c199](https://github.com/GraphiteEditor/Graphite/commit/99c199a8f64a3557e21f5dc002fbcfb789c40632), [#1636](https://github.com/GraphiteEditor/Graphite/pull/1636))
diff --git a/website/sass/base.scss b/website/sass/base.scss
index 415d032a..db4ca36f 100644
--- a/website/sass/base.scss
+++ b/website/sass/base.scss
@@ -393,6 +393,13 @@ summary {
p:has(> img) + center:has(> em) {
margin-top: 10px;
}
+
+ p {
+ & ~ img {
+ width: auto;
+ max-width: 100%;
+ }
+ }
}
}
@@ -411,6 +418,28 @@ summary {
font-weight: 500;
}
+.demo-artwork {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ margin-top: 20px;
+
+ img {
+ height: 128px;
+ border: 12px solid var(--color-walnut);
+ vertical-align: top;
+ flex: 0 0 auto;
+ }
+
+ p {
+ display: flex;
+ flex-direction: column;
+ max-width: 300px;
+ margin-left: 40px;
+ text-align: left;
+ }
+}
+
.video-embed {
position: relative;
width: 100%;
diff --git a/website/sass/index.scss b/website/sass/index.scss
index 26c46838..3de54d48 100644
--- a/website/sass/index.scss
+++ b/website/sass/index.scss
@@ -387,24 +387,3 @@
}
// ▙ GET INVOLVED ▟
-.demo-artwork {
- display: flex;
- align-items: center;
- margin-top: 20px;
-
- img {
- width: 128px;
- height: 128px;
- border: 12px solid var(--color-walnut);
- vertical-align: top;
- flex: 0 0 auto;
- }
-
- p {
- display: flex;
- flex-direction: column;
- max-width: 300px;
- margin-left: 40px;
- text-align: left;
- }
-}