Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
58 commits
Select commit Hold shift + click to select a range
3f9030b
Setting up architecture for the new download pages
Stefterv Sep 15, 2025
4f07cab
Add 'What's New' section to macOS download page
Stefterv Sep 15, 2025
74b13c1
Disable parallel sourcing in Gatsby config
Stefterv Sep 16, 2025
2f75926
Re-architecture
Stefterv Sep 16, 2025
a04fb58
Download instructions
Stefterv Sep 16, 2025
3166dec
Add Windows MSI and Zip download instructions
Stefterv Sep 16, 2025
f1071ff
Refactor download page and platform selection UI
Stefterv Sep 16, 2025
8625d74
Update download images for Linux and Windows
Stefterv Sep 16, 2025
24954fa
Further implemented download pages
Stefterv Sep 16, 2025
3892501
Show Previous releases by Major and LTS version
Stefterv Sep 17, 2025
a03d9af
Release indicator
Stefterv Sep 17, 2025
2cc24df
Add analytics tracking to download buttons
Stefterv Sep 17, 2025
63a3426
Add Donorbox donation widget to Donate component
Stefterv Sep 17, 2025
ec30ac7
Improved download layout and switcher UI pass
Stefterv Sep 17, 2025
ac2cae2
Refactor download pages and add architecture FAQ
Stefterv Sep 17, 2025
192cf3a
Further work on the instructions
Stefterv Sep 17, 2025
3d432bf
Further improvement of the instructions
Stefterv Sep 17, 2025
cf33247
Implemented Donate component and add styling for donation options
Stefterv Sep 17, 2025
1d12ab0
Add launch configuration for development server in VSCode
Stefterv Sep 18, 2025
3703f5d
Improve download page UI and release handling
Stefterv Sep 18, 2025
548a573
Update Switcher styles for improved download UI consistency
Stefterv Sep 18, 2025
b5ccc5c
Add all releases page and update download navigation
Stefterv Sep 18, 2025
60f963e
Redesign download pages layout and styles
Stefterv Sep 18, 2025
50cd45b
Add release notes and update release metadata for 4.4.8–4.5.0
Stefterv Jan 14, 2026
48c40c5
Refactor download flow by creating a dedicated DownloadCTA component …
Stefterv Mar 4, 2026
8753a75
Update release notes and JSON files for Processing versions 4.5.1, 4.…
Stefterv Mar 4, 2026
d6ab01c
Refactor download flow and styles: create DownloadCTA component, upda…
Stefterv Mar 9, 2026
a61a663
Refactor download components and styles: enhance Button and DownloadC…
Stefterv Mar 9, 2026
df32bb5
Refactor download and donation components: enhance styles for Button …
Stefterv Mar 9, 2026
f6f27fd
Enhance Navbar component: add donate button with icon and styles, upd…
Stefterv Mar 9, 2026
2564679
Refactor Linux download instructions: remove LinuxSnap component, add…
Stefterv Mar 9, 2026
e838133
Fix version handling in Switcher component: ensure fallback to latest…
Stefterv Mar 9, 2026
31e79ea
Refactor donation and download components: update styles, enhance lay…
Stefterv Mar 9, 2026
3786e0b
Refactor download components: update styles for Donate and Architectu…
Stefterv Mar 11, 2026
4e8fae4
Fix spacing for h3 elements in WhatsNew component: add margin-top for…
Stefterv Mar 11, 2026
7ec6cd0
Enhance platform selection logic: add support for URL parameter overr…
Stefterv Mar 20, 2026
4693e14
Refactor donation and sketch components: integrate Donate component i…
Stefterv Mar 20, 2026
4800339
Add styles for releases page and create install script placeholder
Stefterv Mar 20, 2026
7ee6fcf
Enhance ReleasesPage: add link styling for version tags and improve t…
Stefterv Mar 20, 2026
dd0ad1d
Fix release link generation: update tag URL structure for version com…
Stefterv Mar 20, 2026
031ad78
Refactor download components: streamline asset handling, enhance vers…
Stefterv Mar 24, 2026
b972e1e
Update download instructions to include version information for Linux…
Stefterv Mar 24, 2026
e074669
Refactor download components and enhance user guidance: update styles…
Stefterv Mar 24, 2026
24a7597
Refactor download button variants: implement dynamic class assignment…
Stefterv Mar 24, 2026
ecfa5bb
Refactor donate button styles: change selector to li.donate and enhan…
Stefterv Mar 24, 2026
08681aa
Enhance examples section: update heading and add instructional text f…
Stefterv Mar 24, 2026
9f390dc
Refactor CSS formatting: standardize spacing and improve readability …
Stefterv Mar 24, 2026
7481f6c
Refactor download CTA background: update image source to processing-b…
Stefterv Mar 24, 2026
0af8ac8
Refactor Navbar component: change list items to anchor tags for impro…
Stefterv Mar 24, 2026
eafea5e
Revert "Refactor Navbar component: change list items to anchor tags f…
Stefterv Mar 25, 2026
f752af6
Update Navbar.module.css
Stefterv Mar 25, 2026
a62ef5d
Add inline-flex display to donate subitem for improved layout
Stefterv Mar 26, 2026
6ff81a2
Refactor Navbar into context-based components
Stefterv Mar 27, 2026
1ff9c20
New Navbar
Stefterv Mar 27, 2026
b1895ad
Order fixes
Stefterv Mar 27, 2026
b3d5366
Merge branch 'main' into download-flow-refactor
Stefterv Jun 24, 2026
7491816
Update package-lock.json
Stefterv Jun 24, 2026
2af051d
Added platform picker
Stefterv Jun 24, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Re-architecture
re-organised architecture as the .mdx files where not as useful
  • Loading branch information
Stefterv committed Mar 23, 2026
commit 2f759268f1cf863e4627dd18a37b2384854347d5
5 changes: 5 additions & 0 deletions content/download/platforms/linux.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"title": "Linux",
"userAgent": "X11",
"sort": 2
}
5 changes: 5 additions & 0 deletions content/download/platforms/macos.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"title": "macOS",
"userAgent": "Mac",
"sort": 1
}
4 changes: 4 additions & 0 deletions content/download/platforms/raspberry-pi.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"title": "Raspberry Pi",
"sort": 3
}
5 changes: 5 additions & 0 deletions content/download/platforms/windows.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"title": "Windows",
"userAgent": "Windows",
"sort": 0
}
10 changes: 0 additions & 10 deletions content/pages/download/linux.mdx

This file was deleted.

28 changes: 0 additions & 28 deletions content/pages/download/macos.mdx

This file was deleted.

9 changes: 0 additions & 9 deletions content/pages/download/raspi.mdx

This file was deleted.

10 changes: 0 additions & 10 deletions content/pages/download/windows.mdx

This file was deleted.

32 changes: 20 additions & 12 deletions gatsby-node.js
Original file line number Diff line number Diff line change
Expand Up @@ -361,23 +361,31 @@ async function createPlatformDownloadPages(actions, graphql) {
const { createPage } = actions;

const platformQuery = await graphql(
`query{
allMdx(filter: { frontmatter: { slug: { glob: "*" } } }) {
nodes {
frontmatter {
slug
platform
`query FindPlatforms {
allFile(
filter: {sourceInstanceName: {eq: "download"}, relativeDirectory: {eq: "platforms"}}
) {
edges {
node {
name
childJson {
title
userAgent
sort
}
}
}
body
}
}
}`
}`
);

if (platformQuery.errors) {
throw platformQuery.errors;
}
const platforms = platformQuery.data.allMdx.nodes;
const platforms = platformQuery.data.allFile.edges.map(e => {
const { childJson, ...rest } = e.node;
return { ...childJson, ...rest };
});

// TODO: Move to reuseable function
const versionsQuery = await graphql(
Expand Down Expand Up @@ -411,15 +419,15 @@ async function createPlatformDownloadPages(actions, graphql) {

platforms.forEach((platform) => {
createPage({
path: `/download/${platform.frontmatter.slug}`,
path: `/download/${platform.name}`,
component: platformTemplate,
context: {
platform
}
});
versions.forEach(version => {
createPage({
path: `/download/${platform.frontmatter.slug}/${version[1]}`,
path: `/download/${platform.name}/${version[1]}`,
component: platformTemplate,
context: {
platform,
Expand Down
8 changes: 7 additions & 1 deletion src/components/Donate.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
import classNames from "classnames"
import React from "react"
import * as grid from 'styles/grid.module.css';

export default function Donate() {
return <div>Donate</div>
return (
<div style={{ flexBasis: 'var(--col4)', minHeight: 400, background: "#eee" }} className={classNames(grid.col)}>
Donate
</div>
)
}
4 changes: 2 additions & 2 deletions src/components/download/Download.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import React from "react";
import { useVersion } from "./Version";
import { useVersionOrLatest } from "./Version";
import Button from "components/Button";
import { usePlatform } from "./Platform";

export default function DownloadButton({ version: versionOverride, platform: platformOverride, arch = "x64", children }) {
let version = useVersion();
let version = useVersionOrLatest();
if (versionOverride) {
version = versionOverride;
}
Expand Down
28 changes: 27 additions & 1 deletion src/components/download/Platform.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,34 @@
import { graphql, useStaticQuery } from 'gatsby';
import React from 'react';


export const PlatformContext = React.createContext();

export const PlatformProvider = PlatformContext.Provider;

export const usePlatform = () => React.useContext(PlatformContext);
export const usePlatform = () => React.useContext(PlatformContext);

export function usePlatforms() {
return useStaticQuery(
graphql`
query FindPlatforms {
allFile(filter: {sourceInstanceName: {eq: "download"}, relativeDirectory: {eq: "platforms"}}) {
edges {
node {
name
childJson {
title
userAgent
sort
}
}
}
}
}
`)
.allFile.edges.map(e => {
const { childJson, ...rest } = e.node;
return { ...childJson, ...rest };
})
.sort((a, b) => (a.sort || 0) - (b.sort || 0));
}
6 changes: 4 additions & 2 deletions src/components/download/PreviousReleases.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ import { graphql, useStaticQuery } from "gatsby"
import React from "react"
import * as semver from "semver";
import { usePlatform } from "./Platform";
import classNames from "classnames";
import * as grid from 'styles/grid.module.css';



Expand Down Expand Up @@ -41,15 +43,15 @@ export default function PreviousReleases() {


return (
<details>
<details style={{ flexBasis: 'var(--col8)' }} className={classNames(grid.col)}>
<summary>Looking for older versions?</summary>
{versions.map((v, i) => (
<details key={i}>
<summary>Version {v[0].split('.')[0]} (latest {v[0]})</summary>
<ul>
{v.map((ver, j) => (
<li key={j}>
<a href={`/download/${platform.frontmatter.slug}/${ver}`}>Processing {ver}</a>
<a href={`/download/${platform.name}/${ver}`}>Processing {ver}</a>
</li>)
)}
</ul>
Expand Down
37 changes: 11 additions & 26 deletions src/components/download/Selector.js
Original file line number Diff line number Diff line change
@@ -1,49 +1,34 @@
import React, { useEffect, useState } from "react"

import { useStaticQuery } from "gatsby"
import { graphql } from "gatsby"
import Button from "components/Button";
import { usePlatforms } from "./Platform";


export default function Selector() {
const data = useStaticQuery(graphql`
query{
allMdx(filter: {frontmatter: {platform: {glob: "*"}}}) {
nodes {
frontmatter {
platform
slug
userAgent
}
}
}
}
`);

const [selected, setSelected] = useState(data.allMdx.nodes.find(node => node.frontmatter.platform === "Windows"));
const platforms = usePlatforms();
const [selected, setSelected] = useState(platforms.find(node => node.name === "windows"));
useEffect(() => {
const { userAgent } = navigator;
for (let node of data.allMdx.nodes) {
if (userAgent.search(node.frontmatter.userAgent) === -1) continue
for (let node of platforms) {
if (userAgent.search(node.userAgent) === -1) continue
setSelected(node);
break;
}
}, [data])
const rest = data.allMdx.nodes.filter(node => node !== selected);
}, [platforms])
const rest = platforms.filter(node => node !== selected);

return (
<div>
<details>
<pre>
{JSON.stringify(data, null, 2)}
{JSON.stringify(platforms, null, 2)}
</pre>
</details>
<Button href={`/download/${selected.frontmatter.slug}`}>Download for {selected.frontmatter.platform}</Button>
<Button href={`/download/${selected.name}`}>Download for {selected.title}</Button>
<div>Also available for</div>
<div>
{rest.map(node => (
<div key={node.frontmatter.platform}>
<Button secondary href={`/download/${node.frontmatter.slug}`}>Download for {node.frontmatter.platform}</Button>
<div key={node.name}>
<Button secondary href={`/download/${node.name}`}>Download for {node.title}</Button>
</div>
))}
</div>
Expand Down
20 changes: 20 additions & 0 deletions src/components/download/Switcher.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import React from "react"
import { usePlatform, usePlatforms } from "./Platform";
import classNames from "classnames";
import * as grid from 'styles/grid.module.css';

export default function Switcher() {
const platforms = usePlatforms();
const current = usePlatform();

return (

<ul style={{ flexBasis: 'var(--col8)', flexDirection: "row", display: "flex", gap: 20 }} className={classNames(grid.col)}>
{platforms.map(node => (
<li key={node.name}>
<a href={`/download/${node.name}`}>{node.title}</a>
</li>
))}
</ul>
)
}
35 changes: 34 additions & 1 deletion src/components/download/Version.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,40 @@
import { graphql, useStaticQuery } from 'gatsby';
import React from 'react';
import * as semver from 'semver';

export const VersionContext = React.createContext('1.0.0');

export const VersionProvider = VersionContext.Provider;

export const useVersion = () => React.useContext(VersionContext);
export const useVersion = () => React.useContext(VersionContext);

export function useVersionOrLatest() {
const versions = useStaticQuery(graphql`
query {
allFile(filter: {sourceInstanceName: {eq: "download"}, relativeDirectory: {eq: "releases"}}) {
edges {
node {
childJson {
name
isPrerelease
tagName
}
}
}
}
}`);

const version = useVersion();
if (version) {
return version
}

const releases = versions.allFile.edges
.map(e => e.node.childJson.tagName.replace(/^processing-(\d+-)?/, ''))
.map(e => [semver.coerce(e, { includePrerelease: true }), e])
.reverse()
.sort((a, b) => semver.compare(b[0], a[0]))
;

return releases[0][1];
}
Loading