From 1f2e267f32e2a22996c8ff8a4bca450e5ddbca66 Mon Sep 17 00:00:00 2001
From: Brandon Thomas
Date: Fri, 2 Oct 2026 09:53:34 -0400
Subject: [PATCH] app icon: lion (owner's ArtCraft drawing),
Dock/taskbar/launcher wiring, palette docs
Co-Authored-By: Claude Opus 5.5
---
ATTRIBUTION.md | 16 +-
ATTRIBUTION.toml | 154 ++++++++++++++++++
Cargo.lock | 11 ++
README.md | 4 +
apps/printcraft/Cargo.toml | 4 +
apps/printcraft/build.rs | 28 ++++
apps/printcraft/src/main.rs | 23 ++-
assets/app-icon/LICENSE.txt | 12 ++
assets/app-icon/README.md | 48 ++++++
.../apps/ai.storyteller.printcraft.png | Bin 0 -> 17218 bytes
.../16x16/apps/ai.storyteller.printcraft.png | Bin 0 -> 695 bytes
.../24x24/apps/ai.storyteller.printcraft.png | Bin 0 -> 1254 bytes
.../apps/ai.storyteller.printcraft.png | Bin 0 -> 52732 bytes
.../32x32/apps/ai.storyteller.printcraft.png | Bin 0 -> 1919 bytes
.../48x48/apps/ai.storyteller.printcraft.png | Bin 0 -> 3617 bytes
.../apps/ai.storyteller.printcraft.png | Bin 0 -> 144396 bytes
.../64x64/apps/ai.storyteller.printcraft.png | Bin 0 -> 5478 bytes
.../apps/ai.storyteller.printcraft.svg | 1 +
assets/app-icon/printcraft-1024.png | Bin 0 -> 271438 bytes
assets/app-icon/printcraft-small.svg | 1 +
assets/app-icon/printcraft.icns | Bin 0 -> 681360 bytes
assets/app-icon/printcraft.ico | Bin 0 -> 86694 bytes
assets/app-icon/printcraft.svg | 1 +
packaging/icons.sh | 74 +++++++++
.../linux/ai.storyteller.printcraft.desktop | 14 ++
25 files changed, 388 insertions(+), 3 deletions(-)
create mode 100644 apps/printcraft/build.rs
create mode 100644 assets/app-icon/LICENSE.txt
create mode 100644 assets/app-icon/README.md
create mode 100644 assets/app-icon/hicolor/128x128/apps/ai.storyteller.printcraft.png
create mode 100644 assets/app-icon/hicolor/16x16/apps/ai.storyteller.printcraft.png
create mode 100644 assets/app-icon/hicolor/24x24/apps/ai.storyteller.printcraft.png
create mode 100644 assets/app-icon/hicolor/256x256/apps/ai.storyteller.printcraft.png
create mode 100644 assets/app-icon/hicolor/32x32/apps/ai.storyteller.printcraft.png
create mode 100644 assets/app-icon/hicolor/48x48/apps/ai.storyteller.printcraft.png
create mode 100644 assets/app-icon/hicolor/512x512/apps/ai.storyteller.printcraft.png
create mode 100644 assets/app-icon/hicolor/64x64/apps/ai.storyteller.printcraft.png
create mode 100644 assets/app-icon/hicolor/scalable/apps/ai.storyteller.printcraft.svg
create mode 100644 assets/app-icon/printcraft-1024.png
create mode 100644 assets/app-icon/printcraft-small.svg
create mode 100644 assets/app-icon/printcraft.icns
create mode 100644 assets/app-icon/printcraft.ico
create mode 100644 assets/app-icon/printcraft.svg
create mode 100755 packaging/icons.sh
create mode 100644 packaging/linux/ai.storyteller.printcraft.desktop
diff --git a/ATTRIBUTION.md b/ATTRIBUTION.md
index 2159c8b7..6b3a38a7 100644
--- a/ATTRIBUTION.md
+++ b/ATTRIBUTION.md
@@ -4,7 +4,7 @@
Every asset PrintCraft includes, bundles or uses to build its published material, with its author, source and licence. The policy is in [AGENTS.md](AGENTS.md) ยง1. The machine-readable list, with SHA-256 hashes, is [ATTRIBUTION.toml](ATTRIBUTION.toml). Licence texts are kept beside the assets and summarised in [NOTICE](NOTICE).
-## In this repository (223)
+## In this repository (237)
| Asset | Title | Author | Licence | Source | Used for |
|---|---|---|---|---|---|
@@ -206,6 +206,20 @@ Every asset PrintCraft includes, bundles or uses to build its published material
| `docs/brand/artcraft-mark-black.svg` | ArtCraft brand: artcraft-mark-black | Storyteller | LicenseRef-Storyteller-Trademark | Storyteller brand assets (provided by the project owner, 2026-10-01; identical copies in storytold/photocraft) | ArtCraft branding next to the community links (About dialog, Help menu, home screen) and in docs. Not open source; forks must remove it. |
| `docs/brand/artcraft-mark.png` | ArtCraft brand: artcraft-mark | Storyteller | LicenseRef-Storyteller-Trademark | Storyteller brand assets (provided by the project owner, 2026-10-01; identical copies in storytold/photocraft) | ArtCraft branding next to the community links (About dialog, Help menu, home screen) and in docs. Not open source; forks must remove it. |
| `docs/brand/artcraft-mark.svg` | ArtCraft brand: artcraft-mark | Storyteller | LicenseRef-Storyteller-Trademark | Storyteller brand assets (provided by the project owner, 2026-10-01; identical copies in storytold/photocraft) | ArtCraft branding next to the community links (About dialog, Help menu, home screen) and in docs. Not open source; forks must remove it. |
+| `assets/app-icon/printcraft.svg` | PrintCraft app icon (master vector) | PrintCraft contributors (drawn by the project owner in ArtCraft; vectorised with craftrules vectorize_tile.py) | MIT OR Apache-2.0 | Contributor-original (see assets/app-icon/README.md) | Master artwork; every other app-icon file is rendered from it (packaging/icons.sh) |
+| `assets/app-icon/printcraft-small.svg` | PrintCraft app icon (light vector) | PrintCraft contributors (drawn by the project owner in ArtCraft; vectorised with craftrules vectorize_tile.py) | MIT OR Apache-2.0 | Contributor-original (see assets/app-icon/README.md) | README header and assets/app-icon/README.md |
+| `assets/app-icon/printcraft-1024.png` | PrintCraft app icon, 1024 px on Apple's icon grid | PrintCraft contributors (drawn by the project owner in ArtCraft; vectorised with craftrules vectorize_tile.py) | MIT OR Apache-2.0 | Contributor-original (see assets/app-icon/README.md) | Runtime window/Dock icon on macOS (apps/printcraft/src/main.rs) |
+| `assets/app-icon/printcraft.icns` | PrintCraft app icon (macOS .icns) | PrintCraft contributors (drawn by the project owner in ArtCraft; vectorised with craftrules vectorize_tile.py) | MIT OR Apache-2.0 | Contributor-original (see assets/app-icon/README.md) | macOS app bundle icon |
+| `assets/app-icon/printcraft.ico` | PrintCraft app icon (Windows .ico, 16-256 px) | PrintCraft contributors (drawn by the project owner in ArtCraft; vectorised with craftrules vectorize_tile.py) | MIT OR Apache-2.0 | Contributor-original (see assets/app-icon/README.md) | Embedded in printcraft.exe by apps/printcraft/build.rs (Explorer, taskbar, Start menu, Alt-Tab) |
+| `assets/app-icon/hicolor/16x16/apps/ai.storyteller.printcraft.png` | PrintCraft app icon, 16 px | PrintCraft contributors (drawn by the project owner in ArtCraft; vectorised with craftrules vectorize_tile.py) | MIT OR Apache-2.0 | Contributor-original (see assets/app-icon/README.md) | Linux hicolor theme icon (packaging/linux/ai.storyteller.printcraft.desktop) |
+| `assets/app-icon/hicolor/24x24/apps/ai.storyteller.printcraft.png` | PrintCraft app icon, 24 px | PrintCraft contributors (drawn by the project owner in ArtCraft; vectorised with craftrules vectorize_tile.py) | MIT OR Apache-2.0 | Contributor-original (see assets/app-icon/README.md) | Linux hicolor theme icon (packaging/linux/ai.storyteller.printcraft.desktop) |
+| `assets/app-icon/hicolor/32x32/apps/ai.storyteller.printcraft.png` | PrintCraft app icon, 32 px | PrintCraft contributors (drawn by the project owner in ArtCraft; vectorised with craftrules vectorize_tile.py) | MIT OR Apache-2.0 | Contributor-original (see assets/app-icon/README.md) | Linux hicolor theme icon (packaging/linux/ai.storyteller.printcraft.desktop) |
+| `assets/app-icon/hicolor/48x48/apps/ai.storyteller.printcraft.png` | PrintCraft app icon, 48 px | PrintCraft contributors (drawn by the project owner in ArtCraft; vectorised with craftrules vectorize_tile.py) | MIT OR Apache-2.0 | Contributor-original (see assets/app-icon/README.md) | Linux hicolor theme icon (packaging/linux/ai.storyteller.printcraft.desktop) |
+| `assets/app-icon/hicolor/64x64/apps/ai.storyteller.printcraft.png` | PrintCraft app icon, 64 px | PrintCraft contributors (drawn by the project owner in ArtCraft; vectorised with craftrules vectorize_tile.py) | MIT OR Apache-2.0 | Contributor-original (see assets/app-icon/README.md) | Linux hicolor theme icon (packaging/linux/ai.storyteller.printcraft.desktop) |
+| `assets/app-icon/hicolor/128x128/apps/ai.storyteller.printcraft.png` | PrintCraft app icon, 128 px | PrintCraft contributors (drawn by the project owner in ArtCraft; vectorised with craftrules vectorize_tile.py) | MIT OR Apache-2.0 | Contributor-original (see assets/app-icon/README.md) | Linux hicolor theme icon (packaging/linux/ai.storyteller.printcraft.desktop) |
+| `assets/app-icon/hicolor/256x256/apps/ai.storyteller.printcraft.png` | PrintCraft app icon, 256 px | PrintCraft contributors (drawn by the project owner in ArtCraft; vectorised with craftrules vectorize_tile.py) | MIT OR Apache-2.0 | Contributor-original (see assets/app-icon/README.md) | Linux hicolor theme icon (packaging/linux/ai.storyteller.printcraft.desktop); runtime window icon on Windows and Linux (apps/printcraft/src/main.rs) |
+| `assets/app-icon/hicolor/512x512/apps/ai.storyteller.printcraft.png` | PrintCraft app icon, 512 px | PrintCraft contributors (drawn by the project owner in ArtCraft; vectorised with craftrules vectorize_tile.py) | MIT OR Apache-2.0 | Contributor-original (see assets/app-icon/README.md) | Linux hicolor theme icon (packaging/linux/ai.storyteller.printcraft.desktop) |
+| `assets/app-icon/hicolor/scalable/apps/ai.storyteller.printcraft.svg` | PrintCraft app icon (Linux scalable) | PrintCraft contributors (drawn by the project owner in ArtCraft; vectorised with craftrules vectorize_tile.py) | MIT OR Apache-2.0 | Contributor-original (see assets/app-icon/README.md) | Linux hicolor theme icon (packaging/linux/ai.storyteller.printcraft.desktop) |
| `docs/images/printcraft-bookmarks.png` | PrintCraft screenshot: Bookmarks | PrintCraft contributors (generated by `cargo xtask screenshots`) | MIT OR Apache-2.0 | this repository | README: navigation. Shows only PrintCraft UI, Lucide icons and the showcase PDF built from the [[fetched]] OFL fonts |
| `docs/images/printcraft-dark.png` | PrintCraft screenshot: Dark theme | PrintCraft contributors (generated by `cargo xtask screenshots`) | MIT OR Apache-2.0 | this repository | README: themes. Shows only PrintCraft UI, Lucide icons and the showcase PDF built from the [[fetched]] OFL fonts |
| `docs/images/printcraft-find.png` | PrintCraft screenshot: Find text | PrintCraft contributors (generated by `cargo xtask screenshots`) | MIT OR Apache-2.0 | this repository | README: search. Shows only PrintCraft UI, Lucide icons and the showcase PDF built from the [[fetched]] OFL fonts |
diff --git a/ATTRIBUTION.toml b/ATTRIBUTION.toml
index eda26046..fd107792 100644
--- a/ATTRIBUTION.toml
+++ b/ATTRIBUTION.toml
@@ -2520,6 +2520,160 @@ kind = "logo"
usage = "ArtCraft branding next to the community links (About dialog, Help menu, home screen) and in docs. Not open source; forks must remove it."
sha256 = "f87af81b6fa411da8820eed2bfdcc54c0ee9cd453b4e868c64f56c69db142d0e"
+[[asset]]
+path = "assets/app-icon/printcraft.svg"
+title = "PrintCraft app icon (master vector)"
+author = "PrintCraft contributors (drawn by the project owner in ArtCraft; vectorised with craftrules vectorize_tile.py)"
+source = "Contributor-original (see assets/app-icon/README.md)"
+licence = "MIT OR Apache-2.0"
+licence_file = "assets/app-icon/LICENSE.txt"
+kind = "icon"
+usage = "Master artwork; every other app-icon file is rendered from it (packaging/icons.sh)"
+sha256 = "52b384a10a2a7fdd3145d9822972cfd568ef0cb7312549bd4399addd89d45a6d"
+
+[[asset]]
+path = "assets/app-icon/printcraft-small.svg"
+title = "PrintCraft app icon (light vector)"
+author = "PrintCraft contributors (drawn by the project owner in ArtCraft; vectorised with craftrules vectorize_tile.py)"
+source = "Contributor-original (see assets/app-icon/README.md)"
+licence = "MIT OR Apache-2.0"
+licence_file = "assets/app-icon/LICENSE.txt"
+kind = "icon"
+usage = "README header and assets/app-icon/README.md"
+sha256 = "b036304c11ef5dcad36636d06ca0bf331b51e47650d25d3c916a0e1eabf544c7"
+
+[[asset]]
+path = "assets/app-icon/printcraft-1024.png"
+title = "PrintCraft app icon, 1024 px on Apple's icon grid"
+author = "PrintCraft contributors (drawn by the project owner in ArtCraft; vectorised with craftrules vectorize_tile.py)"
+source = "Contributor-original (see assets/app-icon/README.md)"
+licence = "MIT OR Apache-2.0"
+licence_file = "assets/app-icon/LICENSE.txt"
+kind = "icon"
+usage = "Runtime window/Dock icon on macOS (apps/printcraft/src/main.rs)"
+sha256 = "da577d3f21fbcf5c739067787a9e683be2b064d76813b5d5fec9074a7a106538"
+
+[[asset]]
+path = "assets/app-icon/printcraft.icns"
+title = "PrintCraft app icon (macOS .icns)"
+author = "PrintCraft contributors (drawn by the project owner in ArtCraft; vectorised with craftrules vectorize_tile.py)"
+source = "Contributor-original (see assets/app-icon/README.md)"
+licence = "MIT OR Apache-2.0"
+licence_file = "assets/app-icon/LICENSE.txt"
+kind = "icon"
+usage = "macOS app bundle icon"
+sha256 = "2425148222873de241d267aba667a8b234ecdd0149f2ca8bb6e79443b743b1e8"
+
+[[asset]]
+path = "assets/app-icon/printcraft.ico"
+title = "PrintCraft app icon (Windows .ico, 16-256 px)"
+author = "PrintCraft contributors (drawn by the project owner in ArtCraft; vectorised with craftrules vectorize_tile.py)"
+source = "Contributor-original (see assets/app-icon/README.md)"
+licence = "MIT OR Apache-2.0"
+licence_file = "assets/app-icon/LICENSE.txt"
+kind = "icon"
+usage = "Embedded in printcraft.exe by apps/printcraft/build.rs (Explorer, taskbar, Start menu, Alt-Tab)"
+sha256 = "56daaaae9ae5389794909570885809adf5e1d9183bef2d9669ed2f9bba3ed6f5"
+
+[[asset]]
+path = "assets/app-icon/hicolor/16x16/apps/ai.storyteller.printcraft.png"
+title = "PrintCraft app icon, 16 px"
+author = "PrintCraft contributors (drawn by the project owner in ArtCraft; vectorised with craftrules vectorize_tile.py)"
+source = "Contributor-original (see assets/app-icon/README.md)"
+licence = "MIT OR Apache-2.0"
+licence_file = "assets/app-icon/LICENSE.txt"
+kind = "icon"
+usage = "Linux hicolor theme icon (packaging/linux/ai.storyteller.printcraft.desktop)"
+sha256 = "9b77095cbe75dcba6b74a1fdcd4064812850efaf7a12edebefc9ded5eabb49da"
+
+[[asset]]
+path = "assets/app-icon/hicolor/24x24/apps/ai.storyteller.printcraft.png"
+title = "PrintCraft app icon, 24 px"
+author = "PrintCraft contributors (drawn by the project owner in ArtCraft; vectorised with craftrules vectorize_tile.py)"
+source = "Contributor-original (see assets/app-icon/README.md)"
+licence = "MIT OR Apache-2.0"
+licence_file = "assets/app-icon/LICENSE.txt"
+kind = "icon"
+usage = "Linux hicolor theme icon (packaging/linux/ai.storyteller.printcraft.desktop)"
+sha256 = "a4cd466687f6c5cb59eef3fc564bdba1c8f0d9e324754eeebab82f18823efae7"
+
+[[asset]]
+path = "assets/app-icon/hicolor/32x32/apps/ai.storyteller.printcraft.png"
+title = "PrintCraft app icon, 32 px"
+author = "PrintCraft contributors (drawn by the project owner in ArtCraft; vectorised with craftrules vectorize_tile.py)"
+source = "Contributor-original (see assets/app-icon/README.md)"
+licence = "MIT OR Apache-2.0"
+licence_file = "assets/app-icon/LICENSE.txt"
+kind = "icon"
+usage = "Linux hicolor theme icon (packaging/linux/ai.storyteller.printcraft.desktop)"
+sha256 = "e22279013a5ed5c02571e1e4e9bc4cef9aa0847fcb733a285b2916fabd16bf78"
+
+[[asset]]
+path = "assets/app-icon/hicolor/48x48/apps/ai.storyteller.printcraft.png"
+title = "PrintCraft app icon, 48 px"
+author = "PrintCraft contributors (drawn by the project owner in ArtCraft; vectorised with craftrules vectorize_tile.py)"
+source = "Contributor-original (see assets/app-icon/README.md)"
+licence = "MIT OR Apache-2.0"
+licence_file = "assets/app-icon/LICENSE.txt"
+kind = "icon"
+usage = "Linux hicolor theme icon (packaging/linux/ai.storyteller.printcraft.desktop)"
+sha256 = "55daf2d5575f6c4e4c4975c9f1c74231178f1801963a8b19f68dfa9bc50cb22f"
+
+[[asset]]
+path = "assets/app-icon/hicolor/64x64/apps/ai.storyteller.printcraft.png"
+title = "PrintCraft app icon, 64 px"
+author = "PrintCraft contributors (drawn by the project owner in ArtCraft; vectorised with craftrules vectorize_tile.py)"
+source = "Contributor-original (see assets/app-icon/README.md)"
+licence = "MIT OR Apache-2.0"
+licence_file = "assets/app-icon/LICENSE.txt"
+kind = "icon"
+usage = "Linux hicolor theme icon (packaging/linux/ai.storyteller.printcraft.desktop)"
+sha256 = "2975c200f341e247b5fa18f568fb27d390e3fa01e9b2ad37acb48d0e1cc8a124"
+
+[[asset]]
+path = "assets/app-icon/hicolor/128x128/apps/ai.storyteller.printcraft.png"
+title = "PrintCraft app icon, 128 px"
+author = "PrintCraft contributors (drawn by the project owner in ArtCraft; vectorised with craftrules vectorize_tile.py)"
+source = "Contributor-original (see assets/app-icon/README.md)"
+licence = "MIT OR Apache-2.0"
+licence_file = "assets/app-icon/LICENSE.txt"
+kind = "icon"
+usage = "Linux hicolor theme icon (packaging/linux/ai.storyteller.printcraft.desktop)"
+sha256 = "6ef927ca252b40bc9b5d8843d84137334362f8aa1acbb1bf8c15a02affd25b2b"
+
+[[asset]]
+path = "assets/app-icon/hicolor/256x256/apps/ai.storyteller.printcraft.png"
+title = "PrintCraft app icon, 256 px"
+author = "PrintCraft contributors (drawn by the project owner in ArtCraft; vectorised with craftrules vectorize_tile.py)"
+source = "Contributor-original (see assets/app-icon/README.md)"
+licence = "MIT OR Apache-2.0"
+licence_file = "assets/app-icon/LICENSE.txt"
+kind = "icon"
+usage = "Linux hicolor theme icon (packaging/linux/ai.storyteller.printcraft.desktop); runtime window icon on Windows and Linux (apps/printcraft/src/main.rs)"
+sha256 = "cde7ee8c5ee38f9fc40a429fd9e6d99a035bcd321701fce331bb13bac126614d"
+
+[[asset]]
+path = "assets/app-icon/hicolor/512x512/apps/ai.storyteller.printcraft.png"
+title = "PrintCraft app icon, 512 px"
+author = "PrintCraft contributors (drawn by the project owner in ArtCraft; vectorised with craftrules vectorize_tile.py)"
+source = "Contributor-original (see assets/app-icon/README.md)"
+licence = "MIT OR Apache-2.0"
+licence_file = "assets/app-icon/LICENSE.txt"
+kind = "icon"
+usage = "Linux hicolor theme icon (packaging/linux/ai.storyteller.printcraft.desktop)"
+sha256 = "5ede733e93b96f4eb8d94299232cf2f9605fa19b0d913f95fe9828c316a2d066"
+
+[[asset]]
+path = "assets/app-icon/hicolor/scalable/apps/ai.storyteller.printcraft.svg"
+title = "PrintCraft app icon (Linux scalable)"
+author = "PrintCraft contributors (drawn by the project owner in ArtCraft; vectorised with craftrules vectorize_tile.py)"
+source = "Contributor-original (see assets/app-icon/README.md)"
+licence = "MIT OR Apache-2.0"
+licence_file = "assets/app-icon/LICENSE.txt"
+kind = "icon"
+usage = "Linux hicolor theme icon (packaging/linux/ai.storyteller.printcraft.desktop)"
+sha256 = "52b384a10a2a7fdd3145d9822972cfd568ef0cb7312549bd4399addd89d45a6d"
+
[[asset]]
path = "docs/images/printcraft-bookmarks.png"
title = "PrintCraft screenshot: Bookmarks"
diff --git a/Cargo.lock b/Cargo.lock
index 1d6d2d12..8f939d71 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -3342,6 +3342,7 @@ dependencies = [
"egui",
"printcraft-ui-egui",
"serde_json",
+ "winresource",
]
[[package]]
@@ -5729,6 +5730,16 @@ dependencies = [
"memchr",
]
+[[package]]
+name = "winresource"
+version = "0.1.31"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0986a8b1d586b7d3e4fe3d9ea39fb451ae22869dcea4aa109d287a374d866087"
+dependencies = [
+ "toml",
+ "version_check",
+]
+
[[package]]
name = "wit-bindgen"
version = "0.57.1"
diff --git a/README.md b/README.md
index cd85eeb5..05e50bc1 100644
--- a/README.md
+++ b/README.md
@@ -7,6 +7,10 @@
+
+
+
+
PrintCraft
diff --git a/apps/printcraft/Cargo.toml b/apps/printcraft/Cargo.toml
index 8716b0a9..bbb31a76 100644
--- a/apps/printcraft/Cargo.toml
+++ b/apps/printcraft/Cargo.toml
@@ -13,3 +13,7 @@ printcraft-ui-egui = { workspace = true }
eframe = { workspace = true, features = ["default_fonts", "wgpu", "accesskit", "wayland", "x11", "persistence", "links"] }
egui = { workspace = true }
serde_json = { workspace = true }
+
+[build-dependencies]
+# Icon + VERSIONINFO for printcraft.exe; build.rs only uses it when targeting Windows.
+winresource = "0.1"
diff --git a/apps/printcraft/build.rs b/apps/printcraft/build.rs
new file mode 100644
index 00000000..638ee1de
--- /dev/null
+++ b/apps/printcraft/build.rs
@@ -0,0 +1,28 @@
+//! Windows only: embed the app icon and version info (VERSIONINFO) into `printcraft.exe`, so it
+//! shows in Explorer, the taskbar, the Start menu and Alt-Tab.
+//!
+//! On every other target this does nothing. A missing resource compiler is a warning, so a
+//! cross-compile from macOS or Linux still links, unless `PRINTCRAFT_REQUIRE_WINRES=1` turns it
+//! into an error (for release builds).
+
+fn main() {
+ println!("cargo:rerun-if-changed=build.rs");
+ println!("cargo:rerun-if-changed=../../assets/app-icon/printcraft.ico");
+ println!("cargo:rerun-if-env-changed=PRINTCRAFT_REQUIRE_WINRES");
+ if std::env::var("CARGO_CFG_TARGET_OS").as_deref() != Ok("windows") {
+ return;
+ }
+ let mut res = winresource::WindowsResource::new();
+ res.set_icon("../../assets/app-icon/printcraft.ico")
+ .set("ProductName", "PrintCraft")
+ .set("FileDescription", "PrintCraft PDF workbench")
+ .set("LegalCopyright", "Copyright (c) the PrintCraft contributors. MIT OR Apache-2.0.")
+ .set("OriginalFilename", "printcraft.exe")
+ .set("InternalName", "printcraft");
+ if let Err(e) = res.compile() {
+ if std::env::var_os("PRINTCRAFT_REQUIRE_WINRES").is_some() {
+ panic!("embedding Windows resources failed: {e}");
+ }
+ println!("cargo:warning=printcraft.exe built without icon/version resources: {e}");
+ }
+}
diff --git a/apps/printcraft/src/main.rs b/apps/printcraft/src/main.rs
index 29816242..6000d46e 100644
--- a/apps/printcraft/src/main.rs
+++ b/apps/printcraft/src/main.rs
@@ -13,6 +13,16 @@
use printcraft_ui_egui::PrintCraftApp;
+/// Freedesktop app id: the `.desktop` file name and the hicolor icon name.
+const APP_ID: &str = "ai.storyteller.printcraft";
+
+/// The app icon (assets/app-icon/README.md). macOS gets the version on Apple's icon grid, with a
+/// transparent margin; Windows and Linux get the full-bleed tile.
+#[cfg(target_os = "macos")]
+const APP_ICON_PNG: &[u8] = include_bytes!("../../../assets/app-icon/printcraft-1024.png");
+#[cfg(not(target_os = "macos"))]
+const APP_ICON_PNG: &[u8] = include_bytes!("../../../assets/app-icon/hicolor/256x256/apps/ai.storyteller.printcraft.png");
+
fn main() -> eframe::Result {
let mut files = Vec::new();
let mut options: Vec<(String, String)> = Vec::new();
@@ -37,11 +47,20 @@ fn main() -> eframe::Result {
.with_title("PrintCraft")
.with_inner_size([1440.0, 920.0])
.with_min_inner_size([820.0, 520.0])
- .with_drag_and_drop(true);
+ .with_drag_and_drop(true)
+ // Wayland app id: matches packaging/linux/ai.storyteller.printcraft.desktop.
+ .with_app_id(APP_ID);
+ // Dock, taskbar, Alt-Tab and launcher icon when running unbundled.
+ match eframe::icon_data::from_png_bytes(APP_ICON_PNG) {
+ Ok(icon) => viewport = viewport.with_icon(icon),
+ Err(e) => eprintln!("printcraft: app icon: {e}"),
+ }
if integrated {
viewport = viewport.with_fullsize_content_view(true).with_titlebar_shown(false).with_title_shown(false);
}
- let native = eframe::NativeOptions { viewport, ..Default::default() };
+ // eframe would otherwise derive the settings folder from the app id: keep it under "PrintCraft".
+ let persistence_path = eframe::storage_dir("PrintCraft").map(|d| d.join("app.ron"));
+ let native = eframe::NativeOptions { viewport, persistence_path, ..Default::default() };
eframe::run_native(
"PrintCraft",
native,
diff --git a/assets/app-icon/LICENSE.txt b/assets/app-icon/LICENSE.txt
new file mode 100644
index 00000000..d472892a
--- /dev/null
+++ b/assets/app-icon/LICENSE.txt
@@ -0,0 +1,12 @@
+PrintCraft app icon (printcraft.svg, printcraft-small.svg and every file derived from them in this
+directory: printcraft-1024.png, printcraft.icns, printcraft.ico, hicolor/).
+
+Original artwork made for this project by the project owner, drawn in ArtCraft and vectorised for
+PrintCraft (no third-party material). Licensed like the rest of PrintCraft, under either of
+
+ * Apache License, Version 2.0 (https://www.apache.org/licenses/LICENSE-2.0)
+ * MIT license (https://opensource.org/licenses/MIT)
+
+at your option.
+
+Regenerate the derived files with packaging/icons.sh.
diff --git a/assets/app-icon/README.md b/assets/app-icon/README.md
new file mode 100644
index 00000000..208effe0
--- /dev/null
+++ b/assets/app-icon/README.md
@@ -0,0 +1,48 @@
+# PrintCraft app icon
+
+
+
+**Creature:** a lion, in a frontal head-and-shoulders portrait, mane running off the bottom of the tile.
+
+**Style:** an engraving (woodcut-weight line work) portrait in the Crafting Apps "owl template" framing:
+a full-bleed colour field, no frame or roundel, the animal looking at the viewer and filling the tile.
+
+**Palette:** exactly three colours.
+
+| Colour | Hex | Used for |
+|---|---|---|
+| Ink | `#0b0b0c` | line work and the figure's contour |
+| Paper | `#efe9dc` | the figure (the lion's silhouette) |
+| PrintCraft green (app colour) | `#12a58a` | the full-bleed field |
+
+**Tile:** `viewBox="0 0 512 512"`, a rounded square with `rx=112` that clips everything. Windows and Linux
+icons use the full-bleed tile. macOS icons put it on Apple's grid (an 824 px body centred on a transparent
+1024 px canvas).
+
+**Provenance:** the project owner's original drawing, made in ArtCraft (2880 px, keyed to the palette), then
+vectorised with craftrules `assets/logo-options/_tools/vectorize_tile.py` (potrace; no filtering or
+warping). The source drawing is kept in craftrules at `assets/app-icons/printcraft/source.png`, not here.
+Licence: [LICENSE.txt](LICENSE.txt) (`MIT OR Apache-2.0`, like the repo).
+
+## Files
+
+| File | What it is |
+|---|---|
+| `printcraft.svg` | the master vector (traced at 2048 px); every PNG, `.ico` and `.icns` is rendered from it |
+| `printcraft-small.svg` | a lighter vector (traced at 1024 px) for places where size matters, such as this README |
+| `printcraft-1024.png` | 1024 px on Apple's grid; also the runtime Dock icon on macOS |
+| `printcraft.icns` | macOS icon (16โ1024 px) |
+| `printcraft.ico` | Windows icon (16โ256 px), embedded in `printcraft.exe` by `apps/printcraft/build.rs` |
+| `hicolor/x/apps/ai.storyteller.printcraft.png` | Linux hicolor theme, 16โ512 px; the 256 px one is the runtime icon on Windows and Linux |
+| `hicolor/scalable/apps/ai.storyteller.printcraft.svg` | Linux scalable icon (copy of the master) |
+
+Where it shows: `apps/printcraft/src/main.rs` sets the window icon (Dock, taskbar, Alt-Tab, launcher) and the
+Wayland app id `ai.storyteller.printcraft`; `packaging/linux/ai.storyteller.printcraft.desktop` names the
+hicolor icon.
+
+## Regenerate
+
+```sh
+packaging/icons.sh # needs resvg and python3; iconutil (macOS) for the .icns
+cargo xtask assets # then update the sha256 values in ATTRIBUTION.toml and run with --write
+```
diff --git a/assets/app-icon/hicolor/128x128/apps/ai.storyteller.printcraft.png b/assets/app-icon/hicolor/128x128/apps/ai.storyteller.printcraft.png
new file mode 100644
index 0000000000000000000000000000000000000000..20f4ca43931b8ff4ce7a77a5dd05f6406c91d071
GIT binary patch
literal 17218
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
V0;2NYMEn2%002ovPDHLkV1h9`Ut9nH
literal 0
HcmV?d00001
diff --git a/assets/app-icon/hicolor/16x16/apps/ai.storyteller.printcraft.png b/assets/app-icon/hicolor/16x16/apps/ai.storyteller.printcraft.png
new file mode 100644
index 0000000000000000000000000000000000000000..be76e69b86a0c0dc58a67e5b9c7f507dbeca88a8
GIT binary patch
literal 695
zcmV;o0!aOdP)Bx~UM+B2p`AL?P7pL0!3X;i4{FxKRSG{2+ECE{d+A
zXq1+Miz?X9!d8i(rfIC8H6+G1HN1X-YD_`;wV7u6kj3_q{jg+;i@I^coqY)Or)=Iv-mq@aU{cqEE#szz){=3rheBCM&e5u?{s
z9Coy`{nVQ&SeZoyqxapCWZ#z-3kZehIXD)Jb1+4Qkv20mv?l8W45T9pfudkngN9c*
z%BsWaYPwuhtUXap;$|>BVUADXX4(;0)Z%8NBYWBAuCMP^t%A820gQ&
zt|hSP4KNqWjiJgEL^Q_~$SbL#9*{L{y{eYrZ}|KAUUJFa8@KsNgj88pK}0+MzP8jXHD6%|G%@K|sohgre|ep-QmN*3QA1Y`IyXifkGko%>&m@^{eHX;&i
zmxmw%>2O6yg?{i(%!
d!Hd^M{sGo^CPZPYwqO7N002ovPDHLkV1i%@NS^=z
literal 0
HcmV?d00001
diff --git a/assets/app-icon/hicolor/24x24/apps/ai.storyteller.printcraft.png b/assets/app-icon/hicolor/24x24/apps/ai.storyteller.printcraft.png
new file mode 100644
index 0000000000000000000000000000000000000000..a00f8f9501fd43f2b1f4676c125ce3792d932a19
GIT binary patch
literal 1254
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