3 Commits

Author SHA1 Message Date
Marcos Paulo 29eb7687e2 chore: release 0.6.2
Release / release (push) Has been cancelled
2026-10-12 21:40:48 -03:00
Marcos Paulo 75fe8e9562 feat(ui): Catppuccin themes
Latte, Frappé, Macchiato and Mocha as Brightness variants (Preferences > Theme,
view.theme command), palettes from craft-ui (masi/craft-libs fork). Tokens::get now
returns the applied tokens instead of guessing light/dark.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-12 20:53:00 -03:00
Marcos Paulo b0d13c4680 chore: debrand ArtCraft and Discord references
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-12 20:53:00 -03:00
29 changed files with 229 additions and 210 deletions
+20
View File
@@ -0,0 +1,20 @@
# Strip upstream (ArtCraft / Discord) branding. Run: ~/.agents/skills/debrand/debrand.pl (--check in CI)
delete docs/brand
# MIT/Apache texts stay verbatim. The copyright holder line stays everywhere (legal requirement).
keep ^(LICENSE-(MIT|APACHE)|\.debrand)$
dropline ^crates/ui-egui/src/i18n/.*\.tsv$ :: \t.*(?:ArtCraft|Discord)
dropline ^ATTRIBUTION\.md$ :: \|\s*`docs/brand/
sub (?s)\nThe ArtCraft name, wordmark and logos in docs/brand/.*?LICENSE-brand\.txt\.\n =>
sub (?s)\s*The ArtCraft name, wordmark, and logos in `docs/brand/`.*?source-code license\. =>
sub \s*The ArtCraft logos in `docs/brand/` are not open source \(`docs/brand/LICENSE-brand\.txt`\)\. =>
sub drawn in ArtCraft, vectorised => drawn by hand, vectorised
sub created\s+in ArtCraft, then => created by hand, then
sub made in ArtCraft \( => drawn by hand (
sub the owner's ArtCraft drawing => the owner's drawing
sub the ArtCraft team and DeckCraft contributors => the DeckCraft contributors
sub ArtCraft, ArtCraftX,\s =>
sub \bArtCraft, =>
sub https://getartcraft\.com/apps/(\w+) => https://github.com/storytold/$1
sub https://discord\.gg/artcraft => https://github.com/storytold/deckcraft/issues
forbid (?i)artcraft(?! Team and the DeckCraft contributors)
forbid (?i)discord
+3
View File
@@ -0,0 +1,3 @@
[submodule "tools/craft-skills"]
path = tools/craft-skills
url = https://git.marcospaulo.dev.br/storytold/craft-skills.git
-4
View File
@@ -50,10 +50,6 @@ Ubuntu-Font-1.0, Bitstream-Vera); Creative Commons (CC0-1.0, CC-BY-4.0, CC-BY-SA
domain; or contributor-original (created by a contributor who licenses it under
`MIT OR Apache-2.0`).
One narrow exception: the ArtCraft name, wordmark and logos in `docs/brand/` are trademarks of the
ArtCraft Team (not open source, terms in `docs/brand/LICENSE-brand.txt`), used only unmodified to
identify the project.
Forbidden: system fonts that are not openly licensed, vendor emoji artwork, stock photos, "free
for personal use" material, screenshots of other people's software, anything whose licence you
cannot prove from its original source.
-5
View File
@@ -12,11 +12,6 @@ deck and UI icons are original work of the DeckCraft contributors (drawn or gene
| Asset | Author | Source | Licence | Used for |
|---|---|---|---|---|
| `docs/brand/artcraft-logo.svg`, `docs/brand/artcraft-logo.png` | ArtCraft Team | ArtCraft brand kit (project owner) | ArtCraft trademark, `docs/brand/LICENSE-brand.txt` (not open source) | README header |
| `docs/brand/artcraft-logo-white.svg`, `docs/brand/artcraft-logo-white.png` | ArtCraft Team | ArtCraft brand kit | ArtCraft trademark, `docs/brand/LICENSE-brand.txt` | README header (dark mode) |
| `docs/brand/artcraft-mark.svg`, `docs/brand/artcraft-mark.png` | ArtCraft Team | ArtCraft brand kit | ArtCraft trademark, `docs/brand/LICENSE-brand.txt` | README footer, About |
| `docs/brand/artcraft-mark-black.svg`, `docs/brand/artcraft-mark-black.png` | ArtCraft Team | ArtCraft brand kit | ArtCraft trademark, `docs/brand/LICENSE-brand.txt` | Mark for light backgrounds |
| `docs/brand/LICENSE-brand.txt` | ArtCraft Team | craftrules `standards/license-files` | — (licence text) | Terms for the ArtCraft marks |
| `assets/app-icon/deckcraft-1024.png`, `assets/app-icon/hicolor/*/apps/ai.storyteller.deckcraft.png` | DeckCraft contributors | rendered by DeckCraft from `assets/app-icon/icon-source.deckcraft` (shapes only) | MIT OR Apache-2.0 | Placeholder app icon (presentation board) until the mascot icon is drawn |
| `packaging/macos/dmg/background.svg` | @XusBadia | DeckCraft macOS DMG window background, original work for this repository (2026-10-08), derived from the DeckCraft app icon `assets/app-icon/deckcraft-1024.png` (referenced via `<image>`, not copied); text is outlined Inter / JetBrains Mono glyph paths | MIT OR Apache-2.0 (`LICENSE-MIT`, `LICENSE-APACHE`) | Finder window of the macOS DMG; `packaging/macos/dmg/generate.py` renders it to `background.tiff` |
| `packaging/macos/dmg/background.tiff` | @XusBadia | Rendered from `packaging/macos/dmg/background.svg` by `packaging/macos/dmg/generate.py` | MIT OR Apache-2.0 (`LICENSE-MIT`, `LICENSE-APACHE`) | 1x + 2x HiDPI TIFF for the macOS DMG window; includes the app icon (see its row) and LittleCMS's built-in sRGB profile ("No copyright, use freely") |
Generated
+38 -28
View File
@@ -814,6 +814,15 @@ dependencies = [
"windows 0.54.0",
]
[[package]]
name = "craft-ui"
version = "0.1.0"
source = "git+https://git.marcospaulo.dev.br/masi/craft-libs?rev=22544b6d619d4f16779b8bdfa3f0b642a86fc065#22544b6d619d4f16779b8bdfa3f0b642a86fc065"
dependencies = [
"egui",
"serde",
]
[[package]]
name = "crc32fast"
version = "1.5.2"
@@ -877,7 +886,7 @@ checksum = "0c87e182de0887fd5361989c677c4e8f5000cd9491d6d563161a8f3a5519fc7f"
[[package]]
name = "deckcraft"
version = "0.6.1"
version = "0.6.2"
dependencies = [
"arboard",
"cpal",
@@ -896,7 +905,7 @@ dependencies = [
[[package]]
name = "deckcraft-anim"
version = "0.6.1"
version = "0.6.2"
dependencies = [
"deckcraft-geom",
"deckcraft-model",
@@ -905,7 +914,7 @@ dependencies = [
[[package]]
name = "deckcraft-av1"
version = "0.6.1"
version = "0.6.2"
dependencies = [
"deckcraft-bitstream",
"rayon",
@@ -914,14 +923,14 @@ dependencies = [
[[package]]
name = "deckcraft-bitstream"
version = "0.6.1"
version = "0.6.2"
dependencies = [
"proptest",
]
[[package]]
name = "deckcraft-cli"
version = "0.6.1"
version = "0.6.2"
dependencies = [
"deckcraft-engine",
"deckcraft-mcp",
@@ -930,14 +939,14 @@ dependencies = [
[[package]]
name = "deckcraft-color"
version = "0.6.1"
version = "0.6.2"
dependencies = [
"serde",
]
[[package]]
name = "deckcraft-engine"
version = "0.6.1"
version = "0.6.2"
dependencies = [
"deckcraft-color",
"deckcraft-fonts",
@@ -959,7 +968,7 @@ dependencies = [
[[package]]
name = "deckcraft-fonts"
version = "0.6.1"
version = "0.6.2"
dependencies = [
"epaint_default_fonts",
"harfrust 0.13.3",
@@ -971,7 +980,7 @@ dependencies = [
[[package]]
name = "deckcraft-format"
version = "0.6.1"
version = "0.6.2"
dependencies = [
"deckcraft-model",
"serde",
@@ -982,7 +991,7 @@ dependencies = [
[[package]]
name = "deckcraft-geom"
version = "0.6.1"
version = "0.6.2"
dependencies = [
"kurbo",
"serde",
@@ -990,7 +999,7 @@ dependencies = [
[[package]]
name = "deckcraft-h264"
version = "0.6.1"
version = "0.6.2"
dependencies = [
"deckcraft-bitstream",
"rayon",
@@ -999,7 +1008,7 @@ dependencies = [
[[package]]
name = "deckcraft-hevc"
version = "0.6.1"
version = "0.6.2"
dependencies = [
"deckcraft-bitstream",
"rayon",
@@ -1008,7 +1017,7 @@ dependencies = [
[[package]]
name = "deckcraft-isobmff"
version = "0.6.1"
version = "0.6.2"
dependencies = [
"deckcraft-bitstream",
"thiserror 2.0.21",
@@ -1016,11 +1025,11 @@ dependencies = [
[[package]]
name = "deckcraft-matroska"
version = "0.6.1"
version = "0.6.2"
[[package]]
name = "deckcraft-mcp"
version = "0.6.1"
version = "0.6.2"
dependencies = [
"deckcraft-engine",
"deckcraft-render",
@@ -1030,7 +1039,7 @@ dependencies = [
[[package]]
name = "deckcraft-media"
version = "0.6.1"
version = "0.6.2"
dependencies = [
"deckcraft-av1",
"deckcraft-h264",
@@ -1048,7 +1057,7 @@ dependencies = [
[[package]]
name = "deckcraft-metafile"
version = "0.6.1"
version = "0.6.2"
dependencies = [
"kurbo",
"thiserror 2.0.21",
@@ -1056,7 +1065,7 @@ dependencies = [
[[package]]
name = "deckcraft-model"
version = "0.6.1"
version = "0.6.2"
dependencies = [
"deckcraft-color",
"deckcraft-geom",
@@ -1067,15 +1076,15 @@ dependencies = [
[[package]]
name = "deckcraft-ogg"
version = "0.6.1"
version = "0.6.2"
[[package]]
name = "deckcraft-opus"
version = "0.6.1"
version = "0.6.2"
[[package]]
name = "deckcraft-pdf"
version = "0.6.1"
version = "0.6.2"
dependencies = [
"deckcraft-fonts",
"deckcraft-model",
@@ -1090,7 +1099,7 @@ dependencies = [
[[package]]
name = "deckcraft-pptx"
version = "0.6.1"
version = "0.6.2"
dependencies = [
"deckcraft-color",
"deckcraft-engine",
@@ -1106,7 +1115,7 @@ dependencies = [
[[package]]
name = "deckcraft-render"
version = "0.6.1"
version = "0.6.2"
dependencies = [
"deckcraft-color",
"deckcraft-fonts",
@@ -1124,7 +1133,7 @@ dependencies = [
[[package]]
name = "deckcraft-text"
version = "0.6.1"
version = "0.6.2"
dependencies = [
"chrono",
"deckcraft-color",
@@ -1138,8 +1147,9 @@ dependencies = [
[[package]]
name = "deckcraft-ui-egui"
version = "0.6.1"
version = "0.6.2"
dependencies = [
"craft-ui",
"deckcraft-anim",
"deckcraft-color",
"deckcraft-engine",
@@ -1160,7 +1170,7 @@ dependencies = [
[[package]]
name = "deckcraft-vp9"
version = "0.6.1"
version = "0.6.2"
dependencies = [
"deckcraft-bitstream",
"rayon",
@@ -1169,7 +1179,7 @@ dependencies = [
[[package]]
name = "deckcraft-web"
version = "0.6.1"
version = "0.6.2"
dependencies = [
"deckcraft-engine",
"deckcraft-ui-egui",
@@ -5665,7 +5675,7 @@ checksum = "9440ea3e5aeabb0ac63af70daf835274065238cdd0cec83418f417eae38bacee"
[[package]]
name = "xtask"
version = "0.6.1"
version = "0.6.2"
dependencies = [
"serde_json",
]
+3 -1
View File
@@ -4,7 +4,7 @@ members = ["crates/*", "apps/*", "xtask"]
default-members = ["crates/*", "apps/deckcraft", "apps/deckcraft-cli"]
[workspace.package]
version = "0.6.1"
version = "0.6.2"
edition = "2024"
license = "MIT OR Apache-2.0"
rust-version = "1.90"
@@ -64,6 +64,8 @@ zip = { version = "3", default-features = false, features = ["deflate"] }
# ui
egui = "0.36"
# Catppuccin palettes (fork of storytold/craft-libs)
craft-ui = { version = "0.1.0", git = "https://git.marcospaulo.dev.br/masi/craft-libs", rev = "22544b6d619d4f16779b8bdfa3f0b642a86fc065", features = ["serde"] }
egui_extras = { version = "0.36", default-features = false }
eframe = { version = "0.36", default-features = false }
egui_kittest = "0.36"
-4
View File
@@ -3,10 +3,6 @@ Copyright (c) 2026 ArtCraft Team and the DeckCraft contributors.
Licensed under the MIT License or the Apache License, Version 2.0, at your option
(LICENSE-MIT, LICENSE-APACHE).
The ArtCraft name, wordmark and logos in docs/brand/ are trademarks of the ArtCraft Team. They are
not open source and are not covered by the license above; their terms are in
docs/brand/LICENSE-brand.txt.
Third-party material
This product bundles third-party material under its own licenses, listed below. The per-file
+9 -67
View File
@@ -1,12 +1,3 @@
<p align="center">
<a href="https://getartcraft.com/">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="docs/brand/artcraft-logo-white.svg">
<img alt="ArtCraft" src="docs/brand/artcraft-logo.svg" width="200">
</picture>
</a>
</p>
<h1 align="center">DeckCraft</h1>
<p align="center">
@@ -27,21 +18,6 @@
<img alt="Platforms" src="https://img.shields.io/badge/platforms-macOS%20·%20Windows%20·%20Linux%20·%20BSD%20·%20Web-555?style=flat-square">
</p>
<p align="center">
<a href="https://discord.gg/artcraft"><img alt="Join the ArtCraft community on Discord" src="https://img.shields.io/badge/Join%20us%20on%20Discord-5865F2?style=for-the-badge&logo=discord&logoColor=white" height="40"></a>
</p>
<p align="center">
<a href="https://getartcraft.com/apps/deckcraft"><b>DeckCraft on getartcraft.com</b></a> ·
<a href="https://getartcraft.com/">ArtCraft</a> ·
<a href="https://getartcraft.com/apps">All Crafting Apps</a>
</p>
> [!NOTE]
> **ArtCraft is a community of artists from all walks of life.** Painters, photographers,
> filmmakers, illustrators, designers, animators, hobbyists, and people who picked up a pencil
> last week. If you make things, you're one of us. **[Come say hi on Discord](https://discord.gg/artcraft).**
<p align="center">
<img alt="DeckCraft editing a slide: ribbon, slide thumbnails with sections, a process diagram on the canvas, notes and status bar" src="docs/images/editor.png" width="900">
</p>
@@ -224,43 +200,19 @@ RISC-V 64 (riscv64): `deckcraft-<ver>-linux-riscv64.tar.gz`, a tarball only (cro
## The Crafting Apps
DeckCraft is one of the **Crafting Apps**: free, open-source creative tools from the
[ArtCraft](https://getartcraft.com/) team, each written from scratch in Rust and each able to
[storytold](https://github.com/storytold) team, each written from scratch in Rust and each able to
stand on its own.
| | App | What it's for | Code | Learn more |
|:-:|---|---|---|---|
| <img src="https://raw.githubusercontent.com/storytold/photocraft/main/assets/app-icon/hicolor/64x64/apps/ai.storyteller.photocraft.png" alt="" width="32" height="32"> | **PhotoCraft** | Image editing: layers, masks, type and real PSD files | [GitHub](https://github.com/storytold/photocraft) | [Website](https://getartcraft.com/apps/photocraft) |
| <img src="https://raw.githubusercontent.com/storytold/vectorcraft/main/assets/app-icon/hicolor/64x64/apps/ai.storyteller.vectorcraft.png" alt="" width="32" height="32"> | **VectorCraft** | Vector illustration | [GitHub](https://github.com/storytold/vectorcraft) | [Website](https://getartcraft.com/apps/vectorcraft) |
| <img src="https://raw.githubusercontent.com/storytold/filmcraft/main/assets/app-icon/hicolor/64x64/apps/ai.storyteller.filmcraft.png" alt="" width="32" height="32"> | **FilmCraft** | Video editing, color and sound | [GitHub](https://github.com/storytold/filmcraft) | [Website](https://getartcraft.com/apps/filmcraft) |
| <img src="https://raw.githubusercontent.com/storytold/lightcraft/main/assets/app-icon/hicolor/64x64/apps/ai.storyteller.lightcraft.png" alt="" width="32" height="32"> | **LightCraft** | Photo library and raw development | [GitHub](https://github.com/storytold/lightcraft) | [Website](https://getartcraft.com/apps/lightcraft) |
| <img src="https://raw.githubusercontent.com/storytold/pdfcraft/main/assets/app-icon/hicolor/64x64/apps/ai.storyteller.pdfcraft.png" alt="" width="32" height="32"> | **PdfCraft** | Reading, organizing and protecting PDFs | [GitHub](https://github.com/storytold/pdfcraft) | [Website](https://getartcraft.com/apps/pdfcraft) |
| <img src="https://raw.githubusercontent.com/storytold/effectcraft/main/assets/app-icon/hicolor/64x64/apps/ai.storyteller.effectcraft.png" alt="" width="32" height="32"> | **EffectCraft** | Motion graphics and visual effects | [GitHub](https://github.com/storytold/effectcraft) | [Website](https://getartcraft.com/apps/effectcraft) |
| <img src="https://raw.githubusercontent.com/storytold/designcraft/main/assets/app-icon/hicolor/64x64/apps/ai.storyteller.designcraft.png" alt="" width="32" height="32"> | **DesignCraft** | Page layout and publishing | [GitHub](https://github.com/storytold/designcraft) | [Website](https://getartcraft.com/apps/designcraft) |
| <img src="https://raw.githubusercontent.com/storytold/deckcraft/main/assets/app-icon/hicolor/64x64/apps/ai.storyteller.deckcraft.png" alt="" width="32" height="32"> | **DeckCraft** | **Presentations and slide shows · you are here** | [GitHub](https://github.com/storytold/deckcraft) | [Website](https://getartcraft.com/apps/deckcraft) |
And [**ArtCraft**](https://getartcraft.com/) itself, our AI image and video studio for artists who want real control.
<br>
<p align="center">
<a href="https://discord.gg/artcraft"><img alt="Join the ArtCraft community on Discord" src="https://img.shields.io/badge/Join%20us%20on%20Discord-5865F2?style=for-the-badge&logo=discord&logoColor=white" height="40"></a>
</p>
<h3 align="center">Come make things with us</h3>
<p align="center">
Our Discord is where artists of every kind hang out: people who paint, shoot, draw, cut film,
set type, and people still figuring out what they like to make. Share what you're working on,
ask for help, tell us what's broken, or tell us what you wish these tools could do.
Whatever your medium and however long you've been at it, you're welcome here.
</p>
<p align="center">
<a href="https://discord.gg/artcraft"><b>discord.gg/artcraft</b></a> ·
<a href="https://getartcraft.com/">getartcraft.com</a> ·
<a href="https://getartcraft.com/apps">The Crafting Apps</a> ·
<a href="https://getartcraft.com/apps/deckcraft">DeckCraft</a>
</p>
| <img src="https://raw.githubusercontent.com/storytold/photocraft/main/assets/app-icon/hicolor/64x64/apps/ai.storyteller.photocraft.png" alt="" width="32" height="32"> | **PhotoCraft** | Image editing: layers, masks, type and real PSD files | [GitHub](https://github.com/storytold/photocraft) | [Website](https://github.com/storytold/$1) |
| <img src="https://raw.githubusercontent.com/storytold/vectorcraft/main/assets/app-icon/hicolor/64x64/apps/ai.storyteller.vectorcraft.png" alt="" width="32" height="32"> | **VectorCraft** | Vector illustration | [GitHub](https://github.com/storytold/vectorcraft) | [Website](https://github.com/storytold/$1) |
| <img src="https://raw.githubusercontent.com/storytold/filmcraft/main/assets/app-icon/hicolor/64x64/apps/ai.storyteller.filmcraft.png" alt="" width="32" height="32"> | **FilmCraft** | Video editing, color and sound | [GitHub](https://github.com/storytold/filmcraft) | [Website](https://github.com/storytold/$1) |
| <img src="https://raw.githubusercontent.com/storytold/lightcraft/main/assets/app-icon/hicolor/64x64/apps/ai.storyteller.lightcraft.png" alt="" width="32" height="32"> | **LightCraft** | Photo library and raw development | [GitHub](https://github.com/storytold/lightcraft) | [Website](https://github.com/storytold/$1) |
| <img src="https://raw.githubusercontent.com/storytold/pdfcraft/main/assets/app-icon/hicolor/64x64/apps/ai.storyteller.pdfcraft.png" alt="" width="32" height="32"> | **PdfCraft** | Reading, organizing and protecting PDFs | [GitHub](https://github.com/storytold/pdfcraft) | [Website](https://github.com/storytold/$1) |
| <img src="https://raw.githubusercontent.com/storytold/effectcraft/main/assets/app-icon/hicolor/64x64/apps/ai.storyteller.effectcraft.png" alt="" width="32" height="32"> | **EffectCraft** | Motion graphics and visual effects | [GitHub](https://github.com/storytold/effectcraft) | [Website](https://github.com/storytold/$1) |
| <img src="https://raw.githubusercontent.com/storytold/designcraft/main/assets/app-icon/hicolor/64x64/apps/ai.storyteller.designcraft.png" alt="" width="32" height="32"> | **DesignCraft** | Page layout and publishing | [GitHub](https://github.com/storytold/designcraft) | [Website](https://github.com/storytold/$1) |
| <img src="https://raw.githubusercontent.com/storytold/deckcraft/main/assets/app-icon/hicolor/64x64/apps/ai.storyteller.deckcraft.png" alt="" width="32" height="32"> | **DeckCraft** | **Presentations and slide shows · you are here** | [GitHub](https://github.com/storytold/deckcraft) | [Website](https://github.com/storytold/deckcraft) |
## License and credits
@@ -273,14 +225,4 @@ with its author, source and license in [ATTRIBUTION.md](ATTRIBUTION.md).
DeckCraft's themes, layouts, shape geometry, icons and sample decks are original work, drawn or
generated in code; no Microsoft artwork, fonts, themes or templates are used.
The ArtCraft name, wordmark and logos in [`docs/brand/`](docs/brand/) are trademarks of the
ArtCraft Team and are not covered by this license. They may be used only unmodified, and only as
part of this repository and DeckCraft, under [`docs/brand/LICENSE-brand.txt`](docs/brand/LICENSE-brand.txt).
Forks and modified versions must remove them.
<sub>Microsoft and PowerPoint are trademarks of the Microsoft group of companies. Adobe, Photoshop, Illustrator, Premiere Pro, Lightroom, Acrobat, After Effects and InDesign are trademarks or registered trademarks of Adobe Inc. in the United States and/or other countries. DeckCraft is an independent, open-source project and is not affiliated with, sponsored by or endorsed by Microsoft Corporation or Adobe Inc.; these names are used only to describe the workflows it is compatible with.</sub>
<p align="center">
<a href="https://getartcraft.com/"><img alt="ArtCraft" src="docs/brand/artcraft-mark.svg" width="28"></a><br>
<sub>Made by the <a href="https://getartcraft.com/">ArtCraft</a> team and community.</sub>
</p>
+2 -2
View File
@@ -71,12 +71,12 @@ fn main() -> ExitCode {
Some("mcp") => report(mcp(rest)),
Some("links") => {
use deckcraft_engine::links::*;
outln!("Discord {DISCORD}\nWebsite {WEBSITE}\nApp page {APP_PAGE}\nGitHub {GITHUB}");
outln!("GitHub {GITHUB}\nIssues {ISSUES}");
ExitCode::SUCCESS
}
_ => {
eprintln!("{USAGE}");
eprintln!("\nCommunity: {} · {}", deckcraft_engine::links::DISCORD, deckcraft_engine::links::APP_PAGE);
eprintln!("\nSource: {}", deckcraft_engine::links::GITHUB);
ExitCode::FAILURE
}
}
+1 -5
View File
@@ -1,8 +1,4 @@
//! Community and project links (shown in Help, About, the CLI and MCP).
//! Project links (shown in Help, About, the CLI and MCP).
pub const DISCORD: &str = "https://discord.gg/artcraft";
pub const WEBSITE: &str = "https://getartcraft.com/";
pub const APPS: &str = "https://getartcraft.com/apps";
pub const APP_PAGE: &str = "https://getartcraft.com/apps/deckcraft";
pub const GITHUB: &str = "https://github.com/storytold/deckcraft";
pub const ISSUES: &str = "https://github.com/storytold/deckcraft/issues";
+2 -4
View File
@@ -135,12 +135,10 @@ impl Server {
Ok(json!({
"protocolVersion": version,
"capabilities": {"tools": {}, "resources": {}},
"serverInfo": {"name": "deckcraft", "title": "DeckCraft", "version": env!("CARGO_PKG_VERSION"), "websiteUrl": deckcraft_engine::links::APP_PAGE},
"serverInfo": {"name": "deckcraft", "title": "DeckCraft", "version": env!("CARGO_PKG_VERSION"), "websiteUrl": deckcraft_engine::links::GITHUB},
"instructions": format!(
"{INSTRUCTIONS} Backend: {}. Community: {} (Discord), {} (app page), {} (source). The `app.links` command returns these links.",
"{INSTRUCTIONS} Backend: {}. Source: {}. The `app.links` command returns these links.",
self.backend.describe(),
deckcraft_engine::links::DISCORD,
deckcraft_engine::links::APP_PAGE,
deckcraft_engine::links::GITHUB
),
}))
+1
View File
@@ -19,6 +19,7 @@ deckcraft-anim = { workspace = true }
deckcraft-engine = { workspace = true }
deckcraft-media = { workspace = true }
egui = { workspace = true }
craft-ui = { workspace = true }
serde = { workspace = true }
serde_json = { workspace = true }
log = { workspace = true }
+8 -11
View File
@@ -716,10 +716,14 @@ fn body(app: &mut SlideApp, ui: &mut Ui, d: &mut Dialog) -> bool {
}
"preferences" => {
ui.label(egui::RichText::new("General").font(theme::bold(13.0)));
let mut dark = app.ui.brightness == theme::Brightness::Dark;
if ui.checkbox(&mut dark, "Dark appearance").changed() {
let _ = app.run("view.dark", json!({"on": dark}));
}
let cur = app.ui.brightness;
egui::ComboBox::from_label("Theme").selected_text(cur.label()).show_ui(ui, |ui| {
for b in theme::Brightness::ALL {
if ui.selectable_label(b == cur, b.label()).clicked() {
let _ = app.run("view.theme", json!({"id": b.id()}));
}
}
});
let mut scale = app.ui.ui_scale;
if ui.add(egui::Slider::new(&mut scale, 0.75..=1.75).text("Interface size")).changed() {
app.ui.ui_scale = scale;
@@ -797,8 +801,6 @@ pub fn about(_app: &mut SlideApp, ui: &mut Ui) {
ui.label("Presentations and slide shows, rebuilt from scratch in pure Rust.");
ui.label("An open-source, clean-room project. Not affiliated with Microsoft.");
ui.add_space(6.0);
ui.hyperlink_to("Join our community on Discord", deckcraft_engine::links::DISCORD);
ui.hyperlink_to("getartcraft.com/apps/deckcraft", deckcraft_engine::links::APP_PAGE);
ui.hyperlink_to("Source on GitHub", deckcraft_engine::links::GITHUB);
ui.add_space(6.0);
ui.label(egui::RichText::new("MIT OR Apache-2.0 · © 2026 ArtCraft Team and the DeckCraft contributors").size(11.0).color(t.text_faint));
@@ -906,11 +908,6 @@ pub fn start_screen(app: &mut SlideApp, ui: &mut Ui) {
});
}
}
ui.add_space(30.0);
ui.horizontal(|ui| {
ui.add_space(40.0);
ui.hyperlink_to("Join the ArtCraft community on Discord", deckcraft_engine::links::DISCORD);
});
});
}
+8 -2
View File
@@ -146,6 +146,7 @@ pub const UI_COMMANDS: &[(&str, &str, Option<&str>, &str)] = &[
("view.tab", "Ribbon Tab", None, "{tab}"),
("view.collapseRibbon", "Collapse the Ribbon", Some("Cmd+F1"), "{}"),
("view.dark", "Dark Mode", None, "{on?: bool}"),
("view.theme", "Theme", None, "{id: light|dark|catppuccinLatte|catppuccinFrappe|catppuccinMacchiato|catppuccinMocha}"),
("view.grayscale", "Grayscale", None, "{on?: bool}"),
("show.start", "Slide Show", Some("F5"), "{from?: index}"),
("show.presenter", "Presenter View", None, "{on?: bool}"),
@@ -325,10 +326,15 @@ impl SlideApp {
}
"view.collapseRibbon" => self.ui.ribbon_collapsed = !self.ui.ribbon_collapsed,
"view.dark" => {
let on = self.flag(p, self.ui.brightness == theme::Brightness::Dark);
let on = self.flag(p, self.ui.brightness.is_dark());
self.ui.brightness = if on { theme::Brightness::Dark } else { theme::Brightness::Light };
self.restyle = true;
}
"view.theme" => {
let id = p.get("id").and_then(Value::as_str).ok_or("missing `id`")?;
self.ui.brightness = theme::Brightness::parse(id).ok_or_else(|| format!("unknown theme `{id}` (use {})", theme::Brightness::id_list()))?;
self.restyle = true;
}
"view.grayscale" => self.ui.grayscale = self.flag(p, self.ui.grayscale),
"show.start" => {
let from = p.get("from").and_then(Value::as_u64).map(|v| v as usize).unwrap_or(0);
@@ -358,7 +364,7 @@ impl SlideApp {
}
"app.links" => {
use deckcraft_engine::links::*;
return Ok(json!({"discord": DISCORD, "website": WEBSITE, "apps": APPS, "appPage": APP_PAGE, "github": GITHUB}));
return Ok(json!({"github": GITHUB, "issues": ISSUES}));
}
_ => return Err(format!("unknown UI command `{id}`")),
}
+3 -3
View File
@@ -90,7 +90,7 @@ pub fn title_bar(app: &mut SlideApp, ui: &mut Ui) {
}
if icon_toggle(
&mut right,
if app.ui.brightness == theme::Brightness::Dark { Icon::Sparkle } else { Icon::Palette },
if app.ui.brightness.is_dark() { Icon::Sparkle } else { Icon::Palette },
"Light/Dark appearance",
true,
false,
@@ -1757,7 +1757,7 @@ fn record(app: &mut SlideApp, ui: &mut Ui) {
});
group(ui, |ui| {
if big_button(ui, Icon::Help, "Learn\nMore", true).clicked() {
app.open_url(deckcraft_engine::links::APP_PAGE);
app.open_url(deckcraft_engine::links::GITHUB);
}
});
}
@@ -1850,7 +1850,7 @@ fn view(app: &mut SlideApp, ui: &mut Ui) {
if big_button_ex(ui, Icon::Grayscale, "Grayscale", true, false, gs).0.clicked() {
app.ui.grayscale = !gs;
}
let dark = app.ui.brightness == theme::Brightness::Dark;
let dark = app.ui.brightness.is_dark();
if big_button_ex(ui, Icon::Palette, "Dark\nMode", true, false, dark).0.clicked() {
let _ = app.run("view.dark", json!({}));
}
+124 -4
View File
@@ -1,5 +1,6 @@
//! Design tokens (light, PowerPoint-like; and dark) and fonts for the UI.
use craft_ui::theme::catppuccin::Flavor;
use egui::{Color32, CornerRadius, FontData, FontDefinitions, FontFamily, Stroke, Visuals};
use serde::{Deserialize, Serialize};
@@ -9,6 +10,67 @@ pub enum Brightness {
#[default]
Light,
Dark,
CatppuccinLatte,
CatppuccinFrappe,
CatppuccinMacchiato,
CatppuccinMocha,
}
impl Brightness {
pub const ALL: [Brightness; 6] = [
Brightness::Light,
Brightness::Dark,
Brightness::CatppuccinLatte,
Brightness::CatppuccinFrappe,
Brightness::CatppuccinMacchiato,
Brightness::CatppuccinMocha,
];
/// The Catppuccin flavour behind this theme, if it is one.
pub fn flavor(self) -> Option<Flavor> {
match self {
Brightness::CatppuccinLatte => Some(Flavor::Latte),
Brightness::CatppuccinFrappe => Some(Flavor::Frappe),
Brightness::CatppuccinMacchiato => Some(Flavor::Macchiato),
Brightness::CatppuccinMocha => Some(Flavor::Mocha),
_ => None,
}
}
pub fn is_dark(self) -> bool {
self == Brightness::Dark || self.flavor().is_some_and(Flavor::is_dark)
}
pub fn label(self) -> &'static str {
match self {
Brightness::Light => "Light",
Brightness::Dark => "Dark",
Brightness::CatppuccinLatte => "Catppuccin Latte",
Brightness::CatppuccinFrappe => "Catppuccin Frappé",
Brightness::CatppuccinMacchiato => "Catppuccin Macchiato",
Brightness::CatppuccinMocha => "Catppuccin Mocha",
}
}
pub fn id(self) -> &'static str {
match self {
Brightness::Light => "light",
Brightness::Dark => "dark",
Brightness::CatppuccinLatte => "catppuccinLatte",
Brightness::CatppuccinFrappe => "catppuccinFrappe",
Brightness::CatppuccinMacchiato => "catppuccinMacchiato",
Brightness::CatppuccinMocha => "catppuccinMocha",
}
}
pub fn parse(s: &str) -> Option<Self> {
Self::ALL.into_iter().find(|b| b.id().eq_ignore_ascii_case(s) || b.label().eq_ignore_ascii_case(s))
}
/// Every id, `|`-separated: for error messages and command docs.
pub fn id_list() -> String {
Self::ALL.map(Brightness::id).join("|")
}
}
/// Every colour the chrome uses.
@@ -102,13 +164,51 @@ impl Tokens {
}
}
pub fn for_brightness(b: Brightness) -> Self {
match b {
Brightness::Light => Self::light(),
Brightness::Dark => Self::dark(),
match (b, b.flavor()) {
(_, Some(f)) => catppuccin(f),
(Brightness::Dark, _) => Self::dark(),
_ => Self::light(),
}
}
/// The tokens last passed to [`apply`] (light or dark before the first call).
pub fn get(ctx: &egui::Context) -> Self {
if ctx.global_style().visuals.dark_mode { Self::dark() } else { Self::light() }
ctx.data(|d| d.get_temp(tokens_id())).unwrap_or_else(|| if ctx.global_style().visuals.dark_mode { Self::dark() } else { Self::light() })
}
}
fn tokens_id() -> egui::Id {
egui::Id::new("deckcraft-tokens")
}
/// A Catppuccin flavour on DeckCraft's chrome (accent Mauve, selection Blue).
fn catppuccin(f: Flavor) -> Tokens {
let p = f.palette();
let dark = f.is_dark();
Tokens {
dark,
chrome: p.mantle,
card: p.base,
card_border: p.surface0,
canvas: p.crust,
text: p.text,
text_dim: p.subtext0,
text_faint: p.overlay0,
border: p.surface1,
separator: p.surface0,
hover: p.surface0,
pressed: p.surface2,
selected: p.surface1,
accent: p.mauve,
accent_text: p.crust,
contextual: p.lavender,
selection: p.blue,
handle_fill: p.base,
handle_stroke: p.blue,
guide: p.pink,
caret: p.text,
text_selection: Color32::from_rgba_unmultiplied(p.blue.r(), p.blue.g(), p.blue.b(), 90),
field_bg: p.mantle,
shadow: Color32::from_black_alpha(if dark { 90 } else { 28 }),
}
}
@@ -142,6 +242,7 @@ pub fn apply(ctx: &egui::Context, t: &Tokens) {
v.window_shadow = egui::epaint::Shadow { offset: [0, 4], blur: 18, spread: 0, color: t.shadow };
v.popup_shadow = egui::epaint::Shadow { offset: [0, 3], blur: 12, spread: 0, color: t.shadow };
ctx.set_visuals(v);
ctx.data_mut(|d| d.insert_temp(tokens_id(), *t));
ctx.global_style_mut(|s| {
s.spacing.item_spacing = egui::vec2(6.0, 4.0);
s.spacing.button_padding = egui::vec2(6.0, 3.0);
@@ -192,3 +293,22 @@ pub fn font(size: f32) -> egui::FontId {
pub fn to_color32(c: deckcraft_color::Rgba) -> Color32 {
Color32::from_rgba_unmultiplied(c.r, c.g, c.b, c.a)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn catppuccin_themes_use_the_flavour_palette() {
for b in Brightness::ALL {
let t = Tokens::for_brightness(b);
assert_eq!(t.dark, b.is_dark(), "{}", b.id());
let Some(f) = b.flavor() else { continue };
let p = f.palette();
assert_eq!((t.card, t.text, t.accent, t.selection), (p.base, p.text, p.mauve, p.blue), "{}", b.id());
assert_eq!(Brightness::parse(b.id()), Some(b));
}
assert_eq!(Brightness::ALL.iter().filter(|b| b.flavor().is_some()).count(), Flavor::ALL.len());
assert!(!Brightness::CatppuccinLatte.is_dark() && Brightness::CatppuccinMocha.is_dark());
}
}
-42
View File
@@ -1,42 +0,0 @@
ArtCraft brand assets: license
The ArtCraft name, wordmark and mark (the "ArtCraft Marks"), including every file in this
directory in every color, size and format, are owned by the ArtCraft Team. They are trademarks
and are NOT open source. They are not covered by DeckCraft's MIT OR Apache-2.0 license, and nothing in
that license, in NOTICE or in any other file of this repository grants any right to them.
Permission
The ArtCraft Team grants a limited, non-exclusive, non-transferable, revocable, royalty-free
permission to use the ArtCraft Marks only:
1. as part of copies of this repository; and
2. within DeckCraft itself, its documentation and its official builds, to identify DeckCraft as made
by the ArtCraft team and community and to link to getartcraft.com and its community.
Conditions
The permission holds only while every one of these is true:
- The marks are used exactly as supplied in this directory. Do not redraw, recolor, crop,
stretch, rotate, animate, outline or add effects to them, extract parts of them, or combine
them with any other name, mark or artwork.
- They are used only in the context of DeckCraft, and only to say that the ArtCraft team makes it.
They must never suggest that the ArtCraft Team made, sponsors, endorses, certifies or supports
any other product, service, fork, modified version, plug-in, organization or person.
- Neither the marks nor the ArtCraft name appear in the name, logo, icon, domain, social media
handle, app-store listing, advertising or marketing of anything other than DeckCraft.
Forks and modified versions
If you distribute or publish a modified version of DeckCraft, or any work derived from it, you must
remove the ArtCraft Marks from it (or replace them with your own) and must not call it ArtCraft or
present it as an ArtCraft product. You may say, in plain text, that your work is based on DeckCraft by
the ArtCraft team. A fork kept only to propose changes back to this repository may keep the marks
unchanged.
Everything else
Any use not expressly permitted here needs prior written permission from the ArtCraft Team
(https://getartcraft.com/). The permission ends automatically for anyone who breaks these terms.
All other rights are reserved.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

-4
View File
@@ -1,4 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="-10 -19.42 136.34 136.34" role="img" aria-label="ArtCraft">
<title>ArtCraft</title>
<path fill="#0b0b0c" d="M104.28,49.49L81.55,0h-31.23l-3.17,4.76L14.75,53.63,0,75.85l21.55,21.55,63.79-36.94,16.99,37.04,14.01-21.74-12.06-26.27ZM32.89,65.66l32.42-48.87,10.91,23.77-43.32,25.09Z"/>
</svg>

Before

Width:  |  Height:  |  Size: 341 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

-4
View File
@@ -1,4 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="-10 -19.42 136.34 136.34" role="img" aria-label="ArtCraft">
<title>ArtCraft</title>
<path fill="#4e7bfb" d="M104.28,49.49L81.55,0h-31.23l-3.17,4.76L14.75,53.63,0,75.85l21.55,21.55,63.79-36.94,16.99,37.04,14.01-21.74-12.06-26.27ZM32.89,65.66l32.42-48.87,10.91,23.77-43.32,25.09Z"/>
</svg>

Before

Width:  |  Height:  |  Size: 341 B

@@ -23,10 +23,10 @@
<launchable type="desktop-id">ai.storyteller.deckcraft.desktop</launchable>
<icon type="stock">ai.storyteller.deckcraft</icon>
<!-- Only url types known to appstream 0.15 (Ubuntu 22.04, where CI validates): no vcs-browser. -->
<url type="homepage">https://getartcraft.com/apps/deckcraft</url>
<url type="homepage">https://github.com/storytold/deckcraft</url>
<url type="bugtracker">https://github.com/storytold/deckcraft/issues</url>
<url type="help">https://github.com/storytold/deckcraft</url>
<url type="contact">https://discord.gg/artcraft</url>
<url type="contact">https://github.com/storytold/deckcraft/issues</url>
<categories>
<category>Office</category>
<category>Presentation</category>
+1 -1
View File
@@ -14,7 +14,7 @@ section: editors
priority: optional
maintainer: ${DECKCRAFT_MAINTAINER}
vendor: Learning Machines LLC
homepage: https://getartcraft.com/apps/deckcraft
homepage: https://github.com/storytold/deckcraft
license: MIT OR Apache-2.0
description: |-
Open-source, native presentation app that works the way PowerPoint users
+3 -3
View File
@@ -28,9 +28,9 @@
<Icon Id="DeckcraftIcon.ico" SourceFile="$(var.IconPath)" />
<Property Id="ARPPRODUCTICON" Value="DeckcraftIcon.ico" />
<Property Id="ARPURLINFOABOUT" Value="https://getartcraft.com/apps/deckcraft" />
<Property Id="ARPURLUPDATEINFO" Value="https://getartcraft.com/apps/deckcraft" />
<Property Id="ARPHELPLINK" Value="https://discord.gg/artcraft" />
<Property Id="ARPURLINFOABOUT" Value="https://github.com/storytold/deckcraft" />
<Property Id="ARPURLUPDATEINFO" Value="https://github.com/storytold/deckcraft" />
<Property Id="ARPHELPLINK" Value="https://github.com/storytold/deckcraft/issues" />
<StandardDirectory Id="ProgramFiles6432Folder">
<Directory Id="INSTALLFOLDER" Name="DeckCraft" />
Submodule tools/craft-skills added at 26c1c201a7