diff --git a/editor/src/messages/dialog/simple_dialogs/about_graphite_dialog.rs b/editor/src/messages/dialog/simple_dialogs/about_graphite_dialog.rs index 861c7d32..13c52dbc 100644 --- a/editor/src/messages/dialog/simple_dialogs/about_graphite_dialog.rs +++ b/editor/src/messages/dialog/simple_dialogs/about_graphite_dialog.rs @@ -20,8 +20,9 @@ impl DialogLayoutHolder for AboutGraphiteDialog { fn layout_column_2(&self) -> Layout { let links = [ - ("Website", "Website", "https://graphite.rs"), + ("Heart", "Donate", "https://graphite.rs/donate/"), ("Volunteer", "Volunteer", "https://graphite.rs/volunteer/"), + ("GraphiteLogo", "Website", "https://graphite.rs"), ("Credits", "Credits", "https://github.com/GraphiteEditor/Graphite/graphs/contributors"), ]; let mut widgets = links diff --git a/editor/src/messages/portfolio/menu_bar/menu_bar_message_handler.rs b/editor/src/messages/portfolio/menu_bar/menu_bar_message_handler.rs index cabb4663..5139b755 100644 --- a/editor/src/messages/portfolio/menu_bar/menu_bar_message_handler.rs +++ b/editor/src/messages/portfolio/menu_bar/menu_bar_message_handler.rs @@ -585,18 +585,29 @@ impl LayoutHolder for MenuBarMessageHandler { action: MenuBarEntry::create_action(|_| DialogMessage::RequestAboutGraphiteDialog.into()), ..MenuBarEntry::default() }], - vec![MenuBarEntry { - label: "User Manual".into(), - icon: Some("UserManual".into()), - action: MenuBarEntry::create_action(|_| { - FrontendMessage::TriggerVisitLink { - url: "https://graphite.rs/learn/".into(), - } - .into() - }), - ..MenuBarEntry::default() - }], vec![ + MenuBarEntry { + label: "Donate to Graphite".into(), + icon: Some("Heart".into()), + action: MenuBarEntry::create_action(|_| { + FrontendMessage::TriggerVisitLink { + url: "https://graphite.rs/donate/".into(), + } + .into() + }), + ..MenuBarEntry::default() + }, + MenuBarEntry { + label: "User Manual".into(), + icon: Some("UserManual".into()), + action: MenuBarEntry::create_action(|_| { + FrontendMessage::TriggerVisitLink { + url: "https://graphite.rs/learn/".into(), + } + .into() + }), + ..MenuBarEntry::default() + }, MenuBarEntry { label: "Report a Bug".into(), icon: Some("Bug".into()), diff --git a/frontend/assets/icon-16px-solid/heart.svg b/frontend/assets/icon-16px-solid/heart.svg new file mode 100644 index 00000000..dd859a60 --- /dev/null +++ b/frontend/assets/icon-16px-solid/heart.svg @@ -0,0 +1,3 @@ + + + diff --git a/frontend/src/components/window/workspace/Panel.svelte b/frontend/src/components/window/workspace/Panel.svelte index b4b43cb8..e4938cad 100644 --- a/frontend/src/components/window/workspace/Panel.svelte +++ b/frontend/src/components/window/workspace/Panel.svelte @@ -172,6 +172,11 @@ editor.handle.demoArtworkDialog()} /> + + + editor.handle.visitUrl("https://graphite.rs/donate/")} /> + + diff --git a/frontend/src/utility-functions/icons.ts b/frontend/src/utility-functions/icons.ts index ba0592cc..28541b12 100644 --- a/frontend/src/utility-functions/icons.ts +++ b/frontend/src/utility-functions/icons.ts @@ -137,6 +137,7 @@ import GraphiteLogo from "@graphite-frontend/assets/icon-16px-solid/graphite-log import HandleVisibilityAll from "@graphite-frontend/assets/icon-16px-solid/handle-visibility-all.svg"; import HandleVisibilityFrontier from "@graphite-frontend/assets/icon-16px-solid/handle-visibility-frontier.svg"; import HandleVisibilitySelected from "@graphite-frontend/assets/icon-16px-solid/handle-visibility-selected.svg"; +import Heart from "@graphite-frontend/assets/icon-16px-solid/heart.svg"; import HistoryRedo from "@graphite-frontend/assets/icon-16px-solid/history-redo.svg"; import HistoryUndo from "@graphite-frontend/assets/icon-16px-solid/history-undo.svg"; import IconsGrid from "@graphite-frontend/assets/icon-16px-solid/icons-grid.svg"; @@ -257,6 +258,7 @@ const SOLID_16PX = { HandleVisibilityAll: { svg: HandleVisibilityAll, size: 16 }, HandleVisibilityFrontier: { svg: HandleVisibilityFrontier, size: 16 }, HandleVisibilitySelected: { svg: HandleVisibilitySelected, size: 16 }, + Heart: { svg: Heart, size: 16 }, HistoryRedo: { svg: HistoryRedo, size: 16 }, HistoryUndo: { svg: HistoryUndo, size: 16 }, IconsGrid: { svg: IconsGrid, size: 16 }, diff --git a/frontend/wasm/src/editor_api.rs b/frontend/wasm/src/editor_api.rs index 7a3f0e7e..489e2518 100644 --- a/frontend/wasm/src/editor_api.rs +++ b/frontend/wasm/src/editor_api.rs @@ -490,6 +490,13 @@ impl EditorHandle { Ok(()) } + /// Visit the given URL + #[wasm_bindgen(js_name = visitUrl)] + pub fn visit_url(&self, url: String) { + let message = FrontendMessage::TriggerVisitLink { url }; + self.dispatch(message); + } + /// Paste layers from a serialized json representation #[wasm_bindgen(js_name = pasteSerializedData)] pub fn paste_serialized_data(&self, data: String) { diff --git a/website/content/donate.md b/website/content/donate.md index d4e17bec..dc53b5f4 100644 --- a/website/content/donate.md +++ b/website/content/donate.md @@ -8,11 +8,9 @@ css = ["/page/donate.css", "/component/feature-box.css"]
-# Support Graphite +# Funding creativity, not corporations -**Safeguard the sustainable, independent future of quality open source creative software.** - -Graphite is 100% built and funded by the community. Your contributions directly help us level up the scope and speed of the project's development. Resources are put towards infrastructure, legal costs, swag to keep contributors happy and motivated, and outreach like exhibiting at conventions and traveling to conferences to foster industry relationships. Hiring full-time developers is the big next step as support grows. +**Own your tools. Own your art.** Invest in the sustainable, independent future of high-quality creative software that's free, and always will be.

@@ -23,11 +21,13 @@ Graphite is 100% built and funded by the community. Your contributions directly Donate: without an account -Be done in just a few clicks +Start to finish in several seconds

+Graphite is 100% built and funded by the community. Your contributions directly help us level up the scope and speed of the project's development. Resources are put towards infrastructure, operational costs, swag to keep contributors happy and motivated, and outreach like exhibiting at conventions and traveling to conferences to foster industry relationships. Hiring full-time developers is the next crucial milestone. +
diff --git a/website/content/features.md b/website/content/features.md index ce47532e..2c8372a1 100644 --- a/website/content/features.md +++ b/website/content/features.md @@ -10,9 +10,9 @@ css = ["/page/features.css", "/component/feature-box.css", "/component/feature-i # Graphite features -The current alpha version of Graphite is a tool for vector art and graphic design. It also supports a limited, experimental raster editing toolset. All this is built around a central node graph that stores layer data and provides a basic—but continually improving—procedural design and nondestructive editing workflow which is a unique feature among vector editing software. +The current alpha version of Graphite is a tool for vector art and graphic design. It also supports a limited, experimental raster editing toolset. This tooling is built around a procedural graphics engine, letting artists build complex graphics and animations in its visual scripting language. -Throughout 2025, stay tuned for major performance improvements, a multiplatform desktop app with native rendering speed, and the beginnings of a full suite of raster editing tools. +In 2025, stay tuned for performance improvements, native multiplatform desktop apps, and the beginnings of a full raster editing tool suite. diff --git a/website/content/volunteer/_index.md b/website/content/volunteer/_index.md index 6d92fcac..766db78f 100644 --- a/website/content/volunteer/_index.md +++ b/website/content/volunteer/_index.md @@ -8,7 +8,7 @@ css = ["/page/volunteer.css", "/component/feature-box.css"]
-# Volunteer +# Get involved **Graphite is 100% built by volunteers.** Get involved in the effort to bring great, free creative software to the world. diff --git a/website/sass/base.scss b/website/sass/base.scss index defaee08..ac1a927d 100644 --- a/website/sass/base.scss +++ b/website/sass/base.scss @@ -148,6 +148,24 @@ body > .page { font-size: 0; } + .heart.heart { + // The same color is also used below in the SVG after the `%23` (URL-encoded `#`) + color: #cc304f; + + &::after { + content: ""; + background-image: url('data:image/svg+xml;utf8,\ + \ + '); + display: inline-block; + width: 0.75em; + height: 0.75em; + margin-left: 0.25em; + margin-bottom: -0.1em; + vertical-align: baseline; + } + } + @media screen and (max-width: 1200px) { gap: 30px; --height: 50px; diff --git a/website/templates/base.html b/website/templates/base.html index 50bdde0a..7a49bfe6 100644 --- a/website/templates/base.html +++ b/website/templates/base.html @@ -107,7 +107,7 @@ About Blog Volunteer - Donate + Donate Launch