Skip to content

Commit 03741b4

Browse files
committed
Update website and add student project info
1 parent 6df1ce2 commit 03741b4

File tree

13 files changed

+234
-109
lines changed

13 files changed

+234
-109
lines changed

website/content/_index.md

Lines changed: 28 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,8 @@ js = ["image-interaction.js", "video-embed.js"]
4646

4747
<h1 class="balance-text">Redefining state&#8209;of&#8209;the&#8209;art graphics editing</h1>
4848

49-
<p class="balance-text"><strong>Graphite</strong> is an in-development raster and vector graphics package that's free and open source. It is powered by a node graph compositing engine that fuses layers with nodes, providing a fully nondestructive editing experience.</p>
49+
<p class="balance-text"><strong>Graphite</strong> is an in-development raster and vector graphics package that's free and open source. It is powered by a node graph compositing engine that fuses layers with nodes, bringing a procedural approach to your design workflow.</p>
50+
<!-- <p class="balance-text"><strong>Graphite</strong> is an in-development raster and vector graphics package that's free and open source. It is powered by a node graph compositing engine that fuses layers with nodes, providing a fully nondestructive editing experience.</p> -->
5051

5152
</section>
5253
<!-- ▙ TAGLINE ▟ -->
@@ -66,18 +67,21 @@ js = ["image-interaction.js", "video-embed.js"]
6667
<!-- ▛ SCREENSHOTS ▜ -->
6768
<section id="screenshots" class="carousel window-size-1" data-carousel data-carousel-jostle-hint>
6869
<div class="carousel-slide">
69-
<img src="https://static.graphite.rs/content/index/gui-demo-valley-of-spires__4.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Graphite UI image #1" data-carousel-image />
70-
<img src="https://static.graphite.rs/content/index/gui-demo-procedural-string-lights.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Graphite UI image #2" data-carousel-image />
71-
<img src="https://static.graphite.rs/content/index/gui-mockup-nodes__5.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Graphite UI image #3" data-carousel-image />
72-
<img src="https://static.graphite.rs/content/index/gui-mockup-viewport__5.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Graphite UI image #4" data-carousel-image />
70+
<img src="https://static.graphite.rs/content/index/gui-demo-red-dress.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Graphite UI image #1" data-carousel-image />
71+
<img src="https://static.graphite.rs/content/index/gui-demo-valley-of-spires__4.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Graphite UI image #2" data-carousel-image />
72+
<img src="https://static.graphite.rs/content/index/gui-demo-procedural-string-lights.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Graphite UI image #3" data-carousel-image />
73+
<img src="https://static.graphite.rs/content/index/gui-mockup-nodes__5.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Graphite UI image #4" data-carousel-image />
74+
<img src="https://static.graphite.rs/content/index/gui-mockup-viewport__5.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Graphite UI image #5" data-carousel-image />
7375
</div>
7476
<div class="carousel-slide torn left">
77+
<img src="https://static.graphite.rs/content/index/gui-demo-red-dress.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="" data-carousel-image />
7578
<img src="https://static.graphite.rs/content/index/gui-demo-valley-of-spires__4.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="" data-carousel-image />
7679
<img src="https://static.graphite.rs/content/index/gui-demo-procedural-string-lights.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="" data-carousel-image />
7780
<img src="https://static.graphite.rs/content/index/gui-mockup-nodes__5.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="" data-carousel-image />
7881
<img src="https://static.graphite.rs/content/index/gui-mockup-viewport__5.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="" data-carousel-image />
7982
</div>
8083
<div class="carousel-slide torn right">
84+
<img src="https://static.graphite.rs/content/index/gui-demo-red-dress.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="" data-carousel-image />
8185
<img src="https://static.graphite.rs/content/index/gui-demo-valley-of-spires__4.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="" data-carousel-image />
8286
<img src="https://static.graphite.rs/content/index/gui-demo-procedural-string-lights.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="" data-carousel-image />
8387
<img src="https://static.graphite.rs/content/index/gui-mockup-nodes__5.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="" data-carousel-image />
@@ -95,6 +99,7 @@ js = ["image-interaction.js", "video-embed.js"]
9599
<button class="dot" data-carousel-dot></button>
96100
<button class="dot" data-carousel-dot></button>
97101
<button class="dot" data-carousel-dot></button>
102+
<button class="dot" data-carousel-dot></button>
98103
<button class="direction next" data-carousel-next>
99104
<svg width="40" height="40" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg">
100105
<path d="M20,0C8.95,0,0,8.95,0,20c0,11.05,8.95,20,20,20c11.05,0,20-8.95,20-20C40,8.95,31.05,0,20,0z M20,38c-9.93,0-18-8.07-18-18S10.07,2,20,2s18,8.07,18,18S29.93,38,20,38z" />
@@ -104,10 +109,13 @@ js = ["image-interaction.js", "video-embed.js"]
104109
</div>
105110
<div class="screenshot-description">
106111
<p class="active" data-carousel-description>
107-
<em>Valley of Spires</em> — Vector art made with the Pen and Gradient tools. <a href="https://editor.graphite.rs/#demo/valley-of-spires">Open this artwork</a> to explore it yourself.
112+
<a href="https://editor.graphite.rs/#demo/red-dress"><em>Red Dress</em></a> — Illustration made with the help of procedurally generating hundreds of circles in the node graph.
113+
</p>
114+
<p data-carousel-description>
115+
<a href="https://editor.graphite.rs/#demo/valley-of-spires"><em>Valley of Spires</em></a> — Vector art made with the Pen and Gradient tools without needing to touch the node graph.
108116
</p>
109117
<p data-carousel-description>
110-
<em>Procedural String Lights</em> — Partly made in the node graph (pictured) to auto-place light bulbs along the wire. <a href="https://editor.graphite.rs/#demo/procedural-string-lights">Open this artwork</a> to explore it yourself.
118+
<a href="https://editor.graphite.rs/#demo/procedural-string-lights"><em>Procedural String Lights</em></a>Drawing of a tree adorned by reusable, auto-placed light bulbs along the wire path made using this node graph.
111119
</p>
112120
<p data-carousel-description>
113121
Design mockup for the work-in-progress raster editing pipeline. Some of these raster-specific nodes are not implemented yet, but will be soon!
@@ -161,11 +169,11 @@ Graphite is a lightweight vector graphics editor that runs offline in your brows
161169
<div class="informational-group features">
162170
<div class="informational">
163171
<img class="atlas" style="--atlas-index: 4" src="https://static.graphite.rs/icons/icon-atlas-features.png" alt="" />
164-
<span>Looks and feels like traditional <span style="text-decoration: underline dotted; text-decoration-color: #16323f77;" title="&quot;what you see is what you get&quot;">WYSIWYG</span> design apps</span>
172+
<span>All-in-one creative tools for animation, art, and design</span>
165173
</div>
166174
<div class="informational">
167175
<img class="atlas" style="--atlas-index: 5" src="https://static.graphite.rs/icons/icon-atlas-features.png" alt="" />
168-
<span>Clean, intuitive interface built by designers, for designers</span>
176+
<span>Clean, familiar interface built by designers, for designers</span>
169177
</div>
170178
<div class="informational">
171179
<img class="atlas" style="--atlas-index: 6" src="https://static.graphite.rs/icons/icon-atlas-features.png" alt="" />
@@ -299,19 +307,19 @@ You'll receive your first newsletter email with the next major Graphite news.
299307
<!-- ▙ COMMUNITY ▟ -->
300308
<!-- -->
301309
<!-- ▛ JUMP RIGHT IN ▜ -->
302-
<section id="jump-right-in">
303-
<div class="section">
310+
<!-- <section id="jump-right-in">
311+
<div class="section"> -->
304312

305-
# Jump right in
313+
<!-- # Jump right in -->
306314

307-
**Get started with Graphite by following along to a hands-on quickstart tutorial.**
315+
<!-- **Get started with Graphite by following along to a hands-on quickstart tutorial.** -->
308316

309-
<div class="video-embed aspect-16x9">
317+
<!-- <div class="video-embed aspect-16x9">
310318
<img data-video-embed="7gjUhl_3X10" src="https://static.graphite.rs/content/index/tutorial-1-youtube.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Graphite Tutorial 1 - Hands-On Quickstart" />
311-
</div>
319+
</div> -->
312320

313-
</div>
314-
</section>
321+
<!-- </div>
322+
</section> -->
315323
<!-- ▙ JUMP RIGHT IN ▟ -->
316324
<!-- -->
317325
<!-- ▛ PROCEDURALISM ▜ -->
@@ -358,7 +366,7 @@ Proceduralism lets you create sophisticated design elements that are easy to edi
358366
<section id="proceduralism-features">
359367
<div class="section">
360368

361-
Graphite's procedural, data-driven approach to graphic design affords unique capabilities (while in alpha, these remain a work in progress):
369+
Graphite's procedural, data-driven approach to graphic design affords unique capabilities *(while in alpha, these remain a work in progress)*:
362370

363371
<div class="informational-group features four-wide">
364372
<div class="informational">
@@ -372,7 +380,7 @@ Graphite's procedural, data-driven approach to graphic design affords unique cap
372380
<div class="informational">
373381
<!-- <img class="atlas" style="--atlas-index: 10" src="https://static.graphite.rs/icons/icon-atlas-features.png" alt="" /> -->
374382
<img class="atlas" style="--atlas-index: 2" src="https://static.graphite.rs/icons/icon-atlas-features.png" alt="" />
375-
<span class="balance-text">Integrated generative AI models and graphics algorithms</span>
383+
<span class="balance-text">Versatile modularity of node-based generative AI models</span>
376384
</div>
377385
<div class="informational">
378386
<img class="atlas" style="--atlas-index: 11" src="https://static.graphite.rs/icons/icon-atlas-features.png" alt="" />
@@ -431,7 +439,7 @@ Graphite is built by a small, dedicated crew of volunteers in need of resources
431439
<section id="vector-art">
432440
<div class="section">
433441

434-
# Art takes shape
442+
# Taking shape
435443

436444
**All you've come to expect from a professional vector graphics editor. Now readily accessible in your browser.**
437445

website/content/features.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ css = ["features.css"]
1010

1111
# Graphite features
1212

13-
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 non-destructive editing workflow which is a unique feature among vector editing software.
13+
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.
1414

1515
</div>
1616
</section>

website/content/volunteer/guide/codebase-overview/_index.md

Lines changed: 2 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -12,64 +12,6 @@ js = ["video-embed.js"]
1212
<img data-video-embed="vUzIeg8frh4" src="https://static.graphite.rs/content/volunteer/guide/workshop-intro-to-coding-for-graphite-youtube.avif" onerror="this.onerror = null; this.src = this.src.replace('.avif', '.png')" alt="Workshop: Intro to Coding for Graphite" />
1313
</div>
1414

15-
The Graphite editor is built as a web app powered by Svelte in the frontend and Rust in the backend which is compiled to WebAssembly (wasm) and run in the browser.
15+
The Graphite editor is built as a web app powered by Svelte and TypeScript in the frontend and Rust in the backend which is compiled to WebAssembly and run in the browser. The editor makes calls into Graphene, the node graph engine which manages and renders the documents.
1616

17-
The Editor's frontend web code lives in `/frontend/src` and the backend Rust code lives in `/editor`. The web-based frontend is intended to be semi-temporary and eventually replaceable with a pure-Rust GUI frontend. Therefore, all backend code should be unaware of JavaScript or web concepts and all Editor application logic should be written in Rust not JS.
18-
19-
## Frontend/backend communication
20-
21-
Frontend (JS) -> backend (Rust/wasm) communication is achieved through a thin Rust translation layer in `/frontend/wasm/src/editor_api.rs` which wraps the Editor backend's complex Rust data type API and provides the JS with a simpler API of callable functions. These wrapper functions are compiled by wasm-bindgen into autogenerated JS functions that serve as an entry point into the wasm.
22-
23-
Backend (Rust) -> frontend (JS) communication happens by sending a queue of messages to the frontend message dispatcher. After the JS calls any wrapper API function to get into backend (Rust) code execution, the Editor's business logic runs and queues up `FrontendMessage`s (defined in `/editor/src/messages/frontend/frontend_message.rs`) which get mapped from Rust to JS-friendly data types in `/frontend/src/wasm-communication/messages.ts`. Various JS code subscribes to these messages by calling `subscribeJsMessage(MessageName, (messageData) => { /* callback code */ });`.
24-
25-
## The Editor backend and Legacy Document modules
26-
27-
The Graphite editor backend handles all the day-to-day logic and responsibilities of a user-facing interactive application. Some duties include: user input, GUI state management, viewport tool behavior, layer management and selection, and handling of multiple document tabs.
28-
29-
The actual document (the artwork data and layers included in a saved `.graphite` file) is part of another core module located in `/document-legacy`. The (soon-to-be-replaced) Legacy Document codebase manages a user's document. Once it is replaced, the new Document module (that will be located in `/document`) will store a document's node graph and change history. While it's OK for the Editor to read data from—or make immutable function calls upon—the user's document controlled by the Legacy Document module, it should never be directly mutated. Instead, messages (called Operations) should be sent to the document to request changes occur. The Legacy Document code is designed to be used by the Editor or by third-party Rust or C/C++ code directly so a careful separation of concerns between the Editor and Legacy Document modules should be considered.
30-
31-
## The message bus
32-
33-
Every part of the Graphite stack works based on the concept of message passing. Messages are pushed to the front or back of a queue and each one is processed by the module's dispatcher in the order encountered. Only the dispatcher owns a mutable reference to update its module's state.
34-
35-
### Additional technical details
36-
37-
A message is an enum variant of a certain message sub-type like `FrontendMessage`, `ToolMessage`, `PortfolioMessage`, or `DocumentMessage`. Two example messages:
38-
```rs
39-
// Carries no data
40-
DocumentMessage::DeleteSelectedLayers
41-
42-
// Carries a layer path and a string as data
43-
DocumentMessage::DeleteLayer {
44-
id: NodeId,
45-
}
46-
```
47-
48-
Message sub-types hierarchically wrap other message sub-types; for example, `DocumentMessage` is wrapped by `PortfolioMessage` via:
49-
```rs
50-
// Carries the child message as data
51-
PortfolioMessage::Document(DocumentMessage)
52-
```
53-
and `EllipseMessage` is wrapped by `ToolMessage` via:
54-
```rs
55-
// Carries the child message as data
56-
ToolMessage::Ellipse(EllipseMessage)
57-
```
58-
Every message sub-type is wrapped by the top-level `Message`, so the previous example is actually:
59-
```rs
60-
Message::Tool(ToolMessage::Ellipse(EllipseMessage))
61-
```
62-
63-
Because this is cumbersome, we have a proc macro `#[child]` that automatically implements the `From` trait on message sub-types and lets you write:
64-
```rs
65-
DocumentMessage::DeleteSelectedLayers.into()
66-
```
67-
instead of:
68-
```rs
69-
Message(PortfolioMessage::Document(DocumentMessage::DeleteSelectedLayers))
70-
```
71-
72-
And when pushing a message to the queue, we have the `add` and `add_front` functions which call `.into()` for you. Therefore it's as simple as writing:
73-
```rs
74-
responses.add(DocumentMessage::DeleteSelectedLayers.into());
75-
```
17+
The Editor's frontend web code lives in `/frontend/src`. The backend Rust code is located in `/editor`. Graphene is found in `/node-graph`.

0 commit comments

Comments
 (0)