Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 1d51b9c7ab | |||
| c5dbd9819b |
@@ -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
|
||||
@@ -0,0 +1,3 @@
|
||||
[submodule "tools/craft-skills"]
|
||||
path = tools/craft-skills
|
||||
url = https://git.marcospaulo.dev.br/storytold/craft-skills.git
|
||||
@@ -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.
|
||||
|
||||
@@ -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") |
|
||||
|
||||
@@ -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"
|
||||
@@ -1130,6 +1139,7 @@ dependencies = [
|
||||
name = "deckcraft-ui-egui"
|
||||
version = "0.5.0"
|
||||
dependencies = [
|
||||
"craft-ui",
|
||||
"deckcraft-anim",
|
||||
"deckcraft-color",
|
||||
"deckcraft-engine",
|
||||
|
||||
@@ -63,6 +63,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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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,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";
|
||||
|
||||
@@ -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
|
||||
),
|
||||
}))
|
||||
|
||||
@@ -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 }
|
||||
|
||||
@@ -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);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -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}`")),
|
||||
}
|
||||
|
||||
@@ -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!({}));
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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.
|
||||
|
Before Width: | Height: | Size: 31 KiB |
|
Before Width: | Height: | Size: 5.3 KiB |
|
Before Width: | Height: | Size: 31 KiB |
|
Before Width: | Height: | Size: 5.3 KiB |
|
Before Width: | Height: | Size: 26 KiB |
@@ -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 |
|
Before Width: | Height: | Size: 24 KiB |
@@ -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>
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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" />
|
||||
|
||||