diff --git a/ATTRIBUTION.md b/ATTRIBUTION.md index ff2038e5..d1f2515d 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 (201) +## In this repository (205) | Asset | Title | Author | Licence | Source | Used for | |---|---|---|---|---|---| @@ -43,6 +43,7 @@ Every asset PrintCraft includes, bundles or uses to build its published material | `assets/icons/clock.svg` | Lucide icon "clock" | Lucide Contributors (portions Cole Bemis, Feather) | ISC | https://github.com/lucide-icons/lucide (npm lucide-static 1.49.0, icons/clock.svg) | UI icon, embedded via crates/ui-egui/src/icon_data.rs | | `assets/icons/cloud-upload.svg` | Lucide icon "cloud-upload" | Lucide Contributors (portions Cole Bemis, Feather) | ISC | https://github.com/lucide-icons/lucide (npm lucide-static 1.49.0, icons/cloud-upload.svg) | UI icon, embedded via crates/ui-egui/src/icon_data.rs | | `assets/icons/cloud.svg` | Lucide icon "cloud" | Lucide Contributors (portions Cole Bemis, Feather) | ISC | https://github.com/lucide-icons/lucide (npm lucide-static 1.49.0, icons/cloud.svg) | UI icon, embedded via crates/ui-egui/src/icon_data.rs | +| `assets/icons/code-xml.svg` | Lucide icon "code-xml" | Lucide Contributors (portions Cole Bemis, Feather) | ISC | https://github.com/lucide-icons/lucide (npm lucide-static 1.49.0, icons/code-xml.svg) | UI icon, embedded via crates/ui-egui/src/icon_data.rs | | `assets/icons/columns-2.svg` | Lucide icon "columns-2" | Lucide Contributors (portions Cole Bemis, Feather) | ISC | https://github.com/lucide-icons/lucide (npm lucide-static 1.49.0, icons/columns-2.svg) | UI icon, embedded via crates/ui-egui/src/icon_data.rs | | `assets/icons/compass.svg` | Lucide icon "compass" | Lucide Contributors (portions Cole Bemis, Feather) | ISC | https://github.com/lucide-icons/lucide (npm lucide-static 1.49.0, icons/compass.svg) | UI icon, embedded via crates/ui-egui/src/icon_data.rs | | `assets/icons/contrast.svg` | Lucide icon "contrast" | Lucide Contributors (portions Cole Bemis, Feather) | ISC | https://github.com/lucide-icons/lucide (npm lucide-static 1.49.0, icons/contrast.svg) | UI icon, embedded via crates/ui-egui/src/icon_data.rs | @@ -53,6 +54,7 @@ Every asset PrintCraft includes, bundles or uses to build its published material | `assets/icons/ellipsis-vertical.svg` | Lucide icon "ellipsis-vertical" | Lucide Contributors (portions Cole Bemis, Feather) | ISC | https://github.com/lucide-icons/lucide (npm lucide-static 1.49.0, icons/ellipsis-vertical.svg) | UI icon, embedded via crates/ui-egui/src/icon_data.rs | | `assets/icons/ellipsis.svg` | Lucide icon "ellipsis" | Lucide Contributors (portions Cole Bemis, Feather) | ISC | https://github.com/lucide-icons/lucide (npm lucide-static 1.49.0, icons/ellipsis.svg) | UI icon, embedded via crates/ui-egui/src/icon_data.rs | | `assets/icons/eraser.svg` | Lucide icon "eraser" | Lucide Contributors (portions Cole Bemis, Feather) | ISC | https://github.com/lucide-icons/lucide (npm lucide-static 1.49.0, icons/eraser.svg) | UI icon, embedded via crates/ui-egui/src/icon_data.rs | +| `assets/icons/external-link.svg` | Lucide icon "external-link" | Lucide Contributors (portions Cole Bemis, Feather) | ISC | https://github.com/lucide-icons/lucide (npm lucide-static 1.49.0, icons/external-link.svg) | UI icon, embedded via crates/ui-egui/src/icon_data.rs | | `assets/icons/eye-off.svg` | Lucide icon "eye-off" | Lucide Contributors (portions Cole Bemis, Feather) | ISC | https://github.com/lucide-icons/lucide (npm lucide-static 1.49.0, icons/eye-off.svg) | UI icon, embedded via crates/ui-egui/src/icon_data.rs | | `assets/icons/eye.svg` | Lucide icon "eye" | Lucide Contributors (portions Cole Bemis, Feather) | ISC | https://github.com/lucide-icons/lucide (npm lucide-static 1.49.0, icons/eye.svg) | UI icon, embedded via crates/ui-egui/src/icon_data.rs | | `assets/icons/file-check.svg` | Lucide icon "file-check" | Lucide Contributors (portions Cole Bemis, Feather) | ISC | https://github.com/lucide-icons/lucide (npm lucide-static 1.49.0, icons/file-check.svg) | UI icon, embedded via crates/ui-egui/src/icon_data.rs | @@ -77,6 +79,7 @@ Every asset PrintCraft includes, bundles or uses to build its published material | `assets/icons/folder.svg` | Lucide icon "folder" | Lucide Contributors (portions Cole Bemis, Feather) | ISC | https://github.com/lucide-icons/lucide (npm lucide-static 1.49.0, icons/folder.svg) | UI icon, embedded via crates/ui-egui/src/icon_data.rs | | `assets/icons/gauge.svg` | Lucide icon "gauge" | Lucide Contributors (portions Cole Bemis, Feather) | ISC | https://github.com/lucide-icons/lucide (npm lucide-static 1.49.0, icons/gauge.svg) | UI icon, embedded via crates/ui-egui/src/icon_data.rs | | `assets/icons/git-compare.svg` | Lucide icon "git-compare" | Lucide Contributors (portions Cole Bemis, Feather) | ISC | https://github.com/lucide-icons/lucide (npm lucide-static 1.49.0, icons/git-compare.svg) | UI icon, embedded via crates/ui-egui/src/icon_data.rs | +| `assets/icons/globe.svg` | Lucide icon "globe" | Lucide Contributors (portions Cole Bemis, Feather) | ISC | https://github.com/lucide-icons/lucide (npm lucide-static 1.49.0, icons/globe.svg) | UI icon, embedded via crates/ui-egui/src/icon_data.rs | | `assets/icons/grid-3x3.svg` | Lucide icon "grid-3x3" | Lucide Contributors (portions Cole Bemis, Feather) | ISC | https://github.com/lucide-icons/lucide (npm lucide-static 1.49.0, icons/grid-3x3.svg) | UI icon, embedded via crates/ui-egui/src/icon_data.rs | | `assets/icons/hand.svg` | Lucide icon "hand" | Lucide Contributors (portions Cole Bemis, Feather) | ISC | https://github.com/lucide-icons/lucide (npm lucide-static 1.49.0, icons/hand.svg) | UI icon, embedded via crates/ui-egui/src/icon_data.rs | | `assets/icons/hash.svg` | Lucide icon "hash" | Lucide Contributors (portions Cole Bemis, Feather) | ISC | https://github.com/lucide-icons/lucide (npm lucide-static 1.49.0, icons/hash.svg) | UI icon, embedded via crates/ui-egui/src/icon_data.rs | @@ -103,6 +106,7 @@ Every asset PrintCraft includes, bundles or uses to build its published material | `assets/icons/message-circle-reply.svg` | Lucide icon "message-circle-reply" | Lucide Contributors (portions Cole Bemis, Feather) | ISC | https://github.com/lucide-icons/lucide (npm lucide-static 1.49.0, icons/message-circle-reply.svg) | UI icon, embedded via crates/ui-egui/src/icon_data.rs | | `assets/icons/message-square-text.svg` | Lucide icon "message-square-text" | Lucide Contributors (portions Cole Bemis, Feather) | ISC | https://github.com/lucide-icons/lucide (npm lucide-static 1.49.0, icons/message-square-text.svg) | UI icon, embedded via crates/ui-egui/src/icon_data.rs | | `assets/icons/message-square.svg` | Lucide icon "message-square" | Lucide Contributors (portions Cole Bemis, Feather) | ISC | https://github.com/lucide-icons/lucide (npm lucide-static 1.49.0, icons/message-square.svg) | UI icon, embedded via crates/ui-egui/src/icon_data.rs | +| `assets/icons/messages-square.svg` | Lucide icon "messages-square" | Lucide Contributors (portions Cole Bemis, Feather) | ISC | https://github.com/lucide-icons/lucide (npm lucide-static 1.49.0, icons/messages-square.svg) | UI icon, embedded via crates/ui-egui/src/icon_data.rs | | `assets/icons/mic.svg` | Lucide icon "mic" | Lucide Contributors (portions Cole Bemis, Feather) | ISC | https://github.com/lucide-icons/lucide (npm lucide-static 1.49.0, icons/mic.svg) | UI icon, embedded via crates/ui-egui/src/icon_data.rs | | `assets/icons/minimize.svg` | Lucide icon "minimize" | Lucide Contributors (portions Cole Bemis, Feather) | ISC | https://github.com/lucide-icons/lucide (npm lucide-static 1.49.0, icons/minimize.svg) | UI icon, embedded via crates/ui-egui/src/icon_data.rs | | `assets/icons/minus.svg` | Lucide icon "minus" | Lucide Contributors (portions Cole Bemis, Feather) | ISC | https://github.com/lucide-icons/lucide (npm lucide-static 1.49.0, icons/minus.svg) | UI icon, embedded via crates/ui-egui/src/icon_data.rs | @@ -188,6 +192,14 @@ Every asset PrintCraft includes, bundles or uses to build its published material | `vendor/hayro-interpret/assets/FoxitSymbol.pfb` | FoxitSymbol (standard-14 substitute font) | Foxit Software Inc. / PDFium Authors | BSD-3-Clause | https://pdfium.googlesource.com/pdfium (via hayro-interpret 0.7.0 assets/) | Renders non-embedded standard-14 fonts (vendored hayro-interpret) | | `vendor/hayro-interpret/assets/CGATS001Compat-v2-micro.icc` | CGATS001Compat v2 micro ICC profile | Clinton Ingram (saucecontrol/Compact-ICC-Profiles) | CC0-1.0 | https://github.com/saucecontrol/Compact-ICC-Profiles | Default CMYK colour conversion (vendored hayro-interpret) | | `vendor/hayro-interpret/assets/LAB.icc` | Lab abstract ICC profile | The Hayro Authors (generated with LittleCMS 2) | MIT OR Apache-2.0 | https://github.com/LaurenzV/hayro (hayro-interpret 0.7.0 assets/) | Lab colour space conversion (vendored hayro-interpret) | +| `docs/brand/artcraft-logo-white.png` | ArtCraft brand: artcraft-logo-white | 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-logo-white.svg` | ArtCraft brand: artcraft-logo-white | 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-logo.png` | ArtCraft brand: artcraft-logo | 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-logo.svg` | ArtCraft brand: artcraft-logo | 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-black.png` | 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-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. | | `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 | @@ -198,17 +210,9 @@ Every asset PrintCraft includes, bundles or uses to build its published material | `docs/images/printcraft-properties.png` | PrintCraft screenshot: Document properties | PrintCraft contributors (generated by `cargo xtask screenshots`) | MIT OR Apache-2.0 | this repository | README: metadata. Shows only PrintCraft UI, Lucide icons and the showcase PDF built from the [[fetched]] OFL fonts | | `docs/images/printcraft-scripts.png` | PrintCraft screenshot: Scripts of the world | PrintCraft contributors (generated by `cargo xtask screenshots`) | MIT OR Apache-2.0 | this repository | README: rendering. Shows only PrintCraft UI, Lucide icons and the showcase PDF built from the [[fetched]] OFL fonts | | `docs/images/printcraft-split.png` | PrintCraft screenshot: Split dialog | PrintCraft contributors (generated by `cargo xtask screenshots`) | MIT OR Apache-2.0 | this repository | README: split. Shows only PrintCraft UI, Lucide icons and the showcase PDF built from the [[fetched]] OFL fonts | -| `docs/images/printcraft-tools.png` | PrintCraft screenshot: All tools | PrintCraft contributors (generated by `cargo xtask screenshots`) | MIT OR Apache-2.0 | this repository | README: tool catalogue. Shows only PrintCraft UI, Lucide icons and the showcase PDF built from the [[fetched]] OFL fonts | +| `docs/images/printcraft-tools.png` | PrintCraft screenshot: All tools | PrintCraft contributors (generated by `cargo xtask screenshots`) | MIT OR Apache-2.0 | this repository | README: tool catalogue. Shows PrintCraft UI, Lucide icons, the showcase PDF built from the [[fetched]] OFL fonts, and the ArtCraft mark (Storyteller trademark from docs/brand/, not covered by this licence) | | `docs/images/printcraft-twoup.png` | PrintCraft screenshot: Two-up reading | PrintCraft contributors (generated by `cargo xtask screenshots`) | MIT OR Apache-2.0 | this repository | README: layouts. Shows only PrintCraft UI, Lucide icons and the showcase PDF built from the [[fetched]] OFL fonts | | `docs/images/printcraft-viewer.png` | PrintCraft screenshot: Viewer with comments | PrintCraft contributors (generated by `cargo xtask screenshots`) | MIT OR Apache-2.0 | this repository | README hero. Shows only PrintCraft UI, Lucide icons and the showcase PDF built from the [[fetched]] OFL fonts | -| `docs/brand/artcraft-logo-white.png` | ArtCraft brand: artcraft-logo-white | 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-logo-white.svg` | ArtCraft brand: artcraft-logo-white | 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-logo.png` | ArtCraft brand: artcraft-logo | 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-logo.svg` | ArtCraft brand: artcraft-logo | 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-black.png` | 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-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. | ## Compiled in through dependencies (6) diff --git a/ATTRIBUTION.toml b/ATTRIBUTION.toml index 5538d68f..d094a85e 100644 --- a/ATTRIBUTION.toml +++ b/ATTRIBUTION.toml @@ -393,6 +393,17 @@ kind = "icon" usage = "UI icon, embedded via crates/ui-egui/src/icon_data.rs" sha256 = "8f19866847075907fdc862e13354d5c81da2f7ba23c9df354514789f6db4c855" +[[asset]] +path = "assets/icons/code-xml.svg" +title = "Lucide icon \"code-xml\"" +author = "Lucide Contributors (portions Cole Bemis, Feather)" +source = "https://github.com/lucide-icons/lucide (npm lucide-static 1.49.0, icons/code-xml.svg)" +licence = "ISC" +licence_file = "assets/icons/LICENSE-lucide.txt" +kind = "icon" +usage = "UI icon, embedded via crates/ui-egui/src/icon_data.rs" +sha256 = "9f3b21989a68d727da9a152e08483fa55f9048d476d3a4c94e94b8b88d25c2a8" + [[asset]] path = "assets/icons/columns-2.svg" title = "Lucide icon \"columns-2\"" @@ -503,6 +514,17 @@ kind = "icon" usage = "UI icon, embedded via crates/ui-egui/src/icon_data.rs" sha256 = "838d4355dd49340523c38a22a2d23f1aca72ef42f8eba79f6a0c84bf6e27b929" +[[asset]] +path = "assets/icons/external-link.svg" +title = "Lucide icon \"external-link\"" +author = "Lucide Contributors (portions Cole Bemis, Feather)" +source = "https://github.com/lucide-icons/lucide (npm lucide-static 1.49.0, icons/external-link.svg)" +licence = "ISC" +licence_file = "assets/icons/LICENSE-lucide.txt" +kind = "icon" +usage = "UI icon, embedded via crates/ui-egui/src/icon_data.rs" +sha256 = "65f9dfdd9cbaf6209ce987a2b55f53752fd3ff9dacb821b7b39077f9c4dda211" + [[asset]] path = "assets/icons/eye-off.svg" title = "Lucide icon \"eye-off\"" @@ -767,6 +789,17 @@ kind = "icon" usage = "UI icon, embedded via crates/ui-egui/src/icon_data.rs" sha256 = "2cafe78609903c93e1d7c3f9ebfcbcf855b86e9c8b223ef15b4d56d8b52c3809" +[[asset]] +path = "assets/icons/globe.svg" +title = "Lucide icon \"globe\"" +author = "Lucide Contributors (portions Cole Bemis, Feather)" +source = "https://github.com/lucide-icons/lucide (npm lucide-static 1.49.0, icons/globe.svg)" +licence = "ISC" +licence_file = "assets/icons/LICENSE-lucide.txt" +kind = "icon" +usage = "UI icon, embedded via crates/ui-egui/src/icon_data.rs" +sha256 = "af069c0f6a5d3f9c9eb2ce61d2601ab02976400d85f9d941e8c6c08d8b2ec910" + [[asset]] path = "assets/icons/grid-3x3.svg" title = "Lucide icon \"grid-3x3\"" @@ -1053,6 +1086,17 @@ kind = "icon" usage = "UI icon, embedded via crates/ui-egui/src/icon_data.rs" sha256 = "5812a3be783fdcd73efd2b6026e03131e4b8c6649e7d52aa2dc7bf2e2023a59d" +[[asset]] +path = "assets/icons/messages-square.svg" +title = "Lucide icon \"messages-square\"" +author = "Lucide Contributors (portions Cole Bemis, Feather)" +source = "https://github.com/lucide-icons/lucide (npm lucide-static 1.49.0, icons/messages-square.svg)" +licence = "ISC" +licence_file = "assets/icons/LICENSE-lucide.txt" +kind = "icon" +usage = "UI icon, embedded via crates/ui-egui/src/icon_data.rs" +sha256 = "eaad0af0779c6ef7816f2468017b3a1aa58338486dc85aa1ba6b276a6b1454b0" + [[asset]] path = "assets/icons/mic.svg" title = "Lucide icon \"mic\"" @@ -2322,149 +2366,6 @@ kind = "font" usage = "Showcase PDF (cargo xtask demo-pdf)" sha256 = "acd98e64795781b2058f07b18475e0ecee2a0fe2b42a49e2f9e37d0d6bf66ce6" -[[asset]] -path = "docs/images/printcraft-bookmarks.png" -title = "PrintCraft screenshot: Bookmarks" -author = "PrintCraft contributors (generated by `cargo xtask screenshots`)" -source = "this repository" -licence = "MIT OR Apache-2.0" -licence_file = "LICENSE-MIT" -kind = "image" -usage = "README: navigation. Shows only PrintCraft UI, Lucide icons and the showcase PDF built from the [[fetched]] OFL fonts" -sha256 = "3acd5f89182a81b4808436a130d789eeb619ae1ab70d5b8112f0abf68e951555" - -[[asset]] -path = "docs/images/printcraft-dark.png" -title = "PrintCraft screenshot: Dark theme" -author = "PrintCraft contributors (generated by `cargo xtask screenshots`)" -source = "this repository" -licence = "MIT OR Apache-2.0" -licence_file = "LICENSE-MIT" -kind = "image" -usage = "README: themes. Shows only PrintCraft UI, Lucide icons and the showcase PDF built from the [[fetched]] OFL fonts" -sha256 = "4d7c91c1e935ba7ecb7146e128dfc791e17609ec8c053c9e4ca9962ef2c4511f" - -[[asset]] -path = "docs/images/printcraft-find.png" -title = "PrintCraft screenshot: Find text" -author = "PrintCraft contributors (generated by `cargo xtask screenshots`)" -source = "this repository" -licence = "MIT OR Apache-2.0" -licence_file = "LICENSE-MIT" -kind = "image" -usage = "README: search. Shows only PrintCraft UI, Lucide icons and the showcase PDF built from the [[fetched]] OFL fonts" -sha256 = "54282c0ed7be857161f5f7c4142380a832e3eeeb080aec6ccbe5e2efc2c0cb62" - -[[asset]] -path = "docs/images/printcraft-forms.png" -title = "PrintCraft screenshot: Interactive form" -author = "PrintCraft contributors (generated by `cargo xtask screenshots`)" -source = "this repository" -licence = "MIT OR Apache-2.0" -licence_file = "LICENSE-MIT" -kind = "image" -usage = "README: forms. Shows only PrintCraft UI, Lucide icons and the showcase PDF built from the [[fetched]] OFL fonts" -sha256 = "6dcfc0fadaf66a0873984d9b924287be03ecac3b436203fdfce387ab4d5712d3" - -[[asset]] -path = "docs/images/printcraft-layers.png" -title = "PrintCraft screenshot: Layers" -author = "PrintCraft contributors (generated by `cargo xtask screenshots`)" -source = "this repository" -licence = "MIT OR Apache-2.0" -licence_file = "LICENSE-MIT" -kind = "image" -usage = "README: layers. Shows only PrintCraft UI, Lucide icons and the showcase PDF built from the [[fetched]] OFL fonts" -sha256 = "b3587cb6fe878540c41c7fb2819dde1c91b5fe261ee263fbfcc1e306900eeb55" - -[[asset]] -path = "docs/images/printcraft-organize.png" -title = "PrintCraft screenshot: Organize pages" -author = "PrintCraft contributors (generated by `cargo xtask screenshots`)" -source = "this repository" -licence = "MIT OR Apache-2.0" -licence_file = "LICENSE-MIT" -kind = "image" -usage = "README: organize. Shows only PrintCraft UI, Lucide icons and the showcase PDF built from the [[fetched]] OFL fonts" -sha256 = "97a6ed1fc1b053ce4618947665c8092dd8ceffe63ad99983a92672acc0c1dbb1" - -[[asset]] -path = "docs/images/printcraft-palette.png" -title = "PrintCraft screenshot: Command palette" -author = "PrintCraft contributors (generated by `cargo xtask screenshots`)" -source = "this repository" -licence = "MIT OR Apache-2.0" -licence_file = "LICENSE-MIT" -kind = "image" -usage = "README: tools. Shows only PrintCraft UI, Lucide icons and the showcase PDF built from the [[fetched]] OFL fonts" -sha256 = "87be686134c92370f786f110883f38fddb85586c2ccb663db5b64cd693395eb8" - -[[asset]] -path = "docs/images/printcraft-properties.png" -title = "PrintCraft screenshot: Document properties" -author = "PrintCraft contributors (generated by `cargo xtask screenshots`)" -source = "this repository" -licence = "MIT OR Apache-2.0" -licence_file = "LICENSE-MIT" -kind = "image" -usage = "README: metadata. Shows only PrintCraft UI, Lucide icons and the showcase PDF built from the [[fetched]] OFL fonts" -sha256 = "aa2dcccc2f162ec56e5bb04e461e1f2f821df2a4cd2e2472ee43b2f49165959f" - -[[asset]] -path = "docs/images/printcraft-scripts.png" -title = "PrintCraft screenshot: Scripts of the world" -author = "PrintCraft contributors (generated by `cargo xtask screenshots`)" -source = "this repository" -licence = "MIT OR Apache-2.0" -licence_file = "LICENSE-MIT" -kind = "image" -usage = "README: rendering. Shows only PrintCraft UI, Lucide icons and the showcase PDF built from the [[fetched]] OFL fonts" -sha256 = "a1355dbf0542c8fa7aa3a1108b34ae9a4e4b838b7f6264e493a2fa98ed5fdce9" - -[[asset]] -path = "docs/images/printcraft-split.png" -title = "PrintCraft screenshot: Split dialog" -author = "PrintCraft contributors (generated by `cargo xtask screenshots`)" -source = "this repository" -licence = "MIT OR Apache-2.0" -licence_file = "LICENSE-MIT" -kind = "image" -usage = "README: split. Shows only PrintCraft UI, Lucide icons and the showcase PDF built from the [[fetched]] OFL fonts" -sha256 = "1ae6c0d7c00ebab73913d676ddfe522f76a2313a110b54c2c21c3231c6cb0359" - -[[asset]] -path = "docs/images/printcraft-tools.png" -title = "PrintCraft screenshot: All tools" -author = "PrintCraft contributors (generated by `cargo xtask screenshots`)" -source = "this repository" -licence = "MIT OR Apache-2.0" -licence_file = "LICENSE-MIT" -kind = "image" -usage = "README: tool catalogue. Shows only PrintCraft UI, Lucide icons and the showcase PDF built from the [[fetched]] OFL fonts" -sha256 = "fbbbfb988e426da209ab8db5dacbdf1ca15371b0f02ea64b036385535af3da39" - -[[asset]] -path = "docs/images/printcraft-twoup.png" -title = "PrintCraft screenshot: Two-up reading" -author = "PrintCraft contributors (generated by `cargo xtask screenshots`)" -source = "this repository" -licence = "MIT OR Apache-2.0" -licence_file = "LICENSE-MIT" -kind = "image" -usage = "README: layouts. Shows only PrintCraft UI, Lucide icons and the showcase PDF built from the [[fetched]] OFL fonts" -sha256 = "5c8fa02c7b1c4d548a0a062ae9c984ba857386998bd8426bc685df4c218748eb" - -[[asset]] -path = "docs/images/printcraft-viewer.png" -title = "PrintCraft screenshot: Viewer with comments" -author = "PrintCraft contributors (generated by `cargo xtask screenshots`)" -source = "this repository" -licence = "MIT OR Apache-2.0" -licence_file = "LICENSE-MIT" -kind = "image" -usage = "README hero. Shows only PrintCraft UI, Lucide icons and the showcase PDF built from the [[fetched]] OFL fonts" -sha256 = "13c0032d140a0b8db98352055864cff65aade8b212efc9ed1166d69512ab755a" - [[asset]] path = "docs/brand/artcraft-logo-white.png" title = "ArtCraft brand: artcraft-logo-white" @@ -2552,3 +2453,146 @@ licence_file = "docs/brand/LICENSE-brand.txt" 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 = "docs/images/printcraft-bookmarks.png" +title = "PrintCraft screenshot: Bookmarks" +author = "PrintCraft contributors (generated by `cargo xtask screenshots`)" +source = "this repository" +licence = "MIT OR Apache-2.0" +licence_file = "LICENSE-MIT" +kind = "image" +usage = "README: navigation. Shows only PrintCraft UI, Lucide icons and the showcase PDF built from the [[fetched]] OFL fonts" +sha256 = "6daf2dceda8737da0c5f9e7895e5c4cc24cc845938ffca478713c2230573240d" + +[[asset]] +path = "docs/images/printcraft-dark.png" +title = "PrintCraft screenshot: Dark theme" +author = "PrintCraft contributors (generated by `cargo xtask screenshots`)" +source = "this repository" +licence = "MIT OR Apache-2.0" +licence_file = "LICENSE-MIT" +kind = "image" +usage = "README: themes. Shows only PrintCraft UI, Lucide icons and the showcase PDF built from the [[fetched]] OFL fonts" +sha256 = "18fbd4931b2a8d01a88aef0d5d0837e3cdc12aa35f8529bedbb4a930565d47e5" + +[[asset]] +path = "docs/images/printcraft-find.png" +title = "PrintCraft screenshot: Find text" +author = "PrintCraft contributors (generated by `cargo xtask screenshots`)" +source = "this repository" +licence = "MIT OR Apache-2.0" +licence_file = "LICENSE-MIT" +kind = "image" +usage = "README: search. Shows only PrintCraft UI, Lucide icons and the showcase PDF built from the [[fetched]] OFL fonts" +sha256 = "b52771502be4c03e2dabf107c77d5183fad7f39655146d59761dda855c2d4b52" + +[[asset]] +path = "docs/images/printcraft-forms.png" +title = "PrintCraft screenshot: Interactive form" +author = "PrintCraft contributors (generated by `cargo xtask screenshots`)" +source = "this repository" +licence = "MIT OR Apache-2.0" +licence_file = "LICENSE-MIT" +kind = "image" +usage = "README: forms. Shows only PrintCraft UI, Lucide icons and the showcase PDF built from the [[fetched]] OFL fonts" +sha256 = "f8eb7705056d32e9c8e4d3b8b197c3e500faae08672e4622d6327d2799b536e7" + +[[asset]] +path = "docs/images/printcraft-layers.png" +title = "PrintCraft screenshot: Layers" +author = "PrintCraft contributors (generated by `cargo xtask screenshots`)" +source = "this repository" +licence = "MIT OR Apache-2.0" +licence_file = "LICENSE-MIT" +kind = "image" +usage = "README: layers. Shows only PrintCraft UI, Lucide icons and the showcase PDF built from the [[fetched]] OFL fonts" +sha256 = "20ff9e1c6ecc74d000a7514b82fe9e39f82c8ef5e7c1a52e9060c5ca349020d6" + +[[asset]] +path = "docs/images/printcraft-organize.png" +title = "PrintCraft screenshot: Organize pages" +author = "PrintCraft contributors (generated by `cargo xtask screenshots`)" +source = "this repository" +licence = "MIT OR Apache-2.0" +licence_file = "LICENSE-MIT" +kind = "image" +usage = "README: organize. Shows only PrintCraft UI, Lucide icons and the showcase PDF built from the [[fetched]] OFL fonts" +sha256 = "0a309ba73bcfccbe0106824b55fc347cc0b32293d1db68149d5eccec9c087ba1" + +[[asset]] +path = "docs/images/printcraft-palette.png" +title = "PrintCraft screenshot: Command palette" +author = "PrintCraft contributors (generated by `cargo xtask screenshots`)" +source = "this repository" +licence = "MIT OR Apache-2.0" +licence_file = "LICENSE-MIT" +kind = "image" +usage = "README: tools. Shows only PrintCraft UI, Lucide icons and the showcase PDF built from the [[fetched]] OFL fonts" +sha256 = "74867793e506c03255459e838eef0b08e485c13b7ea8a6b8de3ec16870067eda" + +[[asset]] +path = "docs/images/printcraft-properties.png" +title = "PrintCraft screenshot: Document properties" +author = "PrintCraft contributors (generated by `cargo xtask screenshots`)" +source = "this repository" +licence = "MIT OR Apache-2.0" +licence_file = "LICENSE-MIT" +kind = "image" +usage = "README: metadata. Shows only PrintCraft UI, Lucide icons and the showcase PDF built from the [[fetched]] OFL fonts" +sha256 = "86f293543b299fa1665db999a68978138f8d61a4082d7c5b5025498e188da459" + +[[asset]] +path = "docs/images/printcraft-scripts.png" +title = "PrintCraft screenshot: Scripts of the world" +author = "PrintCraft contributors (generated by `cargo xtask screenshots`)" +source = "this repository" +licence = "MIT OR Apache-2.0" +licence_file = "LICENSE-MIT" +kind = "image" +usage = "README: rendering. Shows only PrintCraft UI, Lucide icons and the showcase PDF built from the [[fetched]] OFL fonts" +sha256 = "0dde8ed5a14dee7396379963adff517bd249c7dd0fe494c389b612e643584b15" + +[[asset]] +path = "docs/images/printcraft-split.png" +title = "PrintCraft screenshot: Split dialog" +author = "PrintCraft contributors (generated by `cargo xtask screenshots`)" +source = "this repository" +licence = "MIT OR Apache-2.0" +licence_file = "LICENSE-MIT" +kind = "image" +usage = "README: split. Shows only PrintCraft UI, Lucide icons and the showcase PDF built from the [[fetched]] OFL fonts" +sha256 = "bf31e13b563ead564af968c5fae8d1c07b91ee38867d0cf1aae9e0582efc2fe5" + +[[asset]] +path = "docs/images/printcraft-tools.png" +title = "PrintCraft screenshot: All tools" +author = "PrintCraft contributors (generated by `cargo xtask screenshots`)" +source = "this repository" +licence = "MIT OR Apache-2.0" +licence_file = "LICENSE-MIT" +kind = "image" +usage = "README: tool catalogue. Shows PrintCraft UI, Lucide icons, the showcase PDF built from the [[fetched]] OFL fonts, and the ArtCraft mark (Storyteller trademark from docs/brand/, not covered by this licence)" +sha256 = "61731a921902e285d40826d401f1ef25624dabb8c8ac1f8f0c09c1292a17ee1a" + +[[asset]] +path = "docs/images/printcraft-twoup.png" +title = "PrintCraft screenshot: Two-up reading" +author = "PrintCraft contributors (generated by `cargo xtask screenshots`)" +source = "this repository" +licence = "MIT OR Apache-2.0" +licence_file = "LICENSE-MIT" +kind = "image" +usage = "README: layouts. Shows only PrintCraft UI, Lucide icons and the showcase PDF built from the [[fetched]] OFL fonts" +sha256 = "a72ed1b84c827e3aa1dd3282d857b4742f02d8ff23fc39b62115c840ebad14b4" + +[[asset]] +path = "docs/images/printcraft-viewer.png" +title = "PrintCraft screenshot: Viewer with comments" +author = "PrintCraft contributors (generated by `cargo xtask screenshots`)" +source = "this repository" +licence = "MIT OR Apache-2.0" +licence_file = "LICENSE-MIT" +kind = "image" +usage = "README hero. Shows only PrintCraft UI, Lucide icons and the showcase PDF built from the [[fetched]] OFL fonts" +sha256 = "ecd261028d8837f7f7c013dd796d81ca7e89643bcfcbad3ab9fbfbe87ded04e3" diff --git a/Cargo.lock b/Cargo.lock index c65a3782..03fe8d7d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -925,6 +925,17 @@ dependencies = [ "objc2 0.6.4", ] +[[package]] +name = "displaydoc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6232dd377dcc64799954cbd3a9bb882e9cdc1308ccd87b1c098f1fb2eaf82a8" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.6", +] + [[package]] name = "dlib" version = "0.5.3" @@ -1074,6 +1085,7 @@ dependencies = [ "serde", "smithay-clipboard", "web-time", + "webbrowser", "winit", ] @@ -1403,6 +1415,15 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + [[package]] name = "futures-core" version = "0.3.34" @@ -1812,6 +1833,110 @@ dependencies = [ "cc", ] +[[package]] +name = "icu_collections" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa68d21081c4a05d5a901a1c62add574c77048b6a1c67be3b50ce0b60d4ca513" +dependencies = [ + "displaydoc", + "potential_utf", + "utf8_iter", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d56e28588da92eee5c3201a6eff33fabdd49b62269c8938d4ff050ce4d900deb" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12f9cf5f235641ed274641dd81c3f28d870e276763d0797aeeab72317b1c646f" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1563da1ed3e0b3bf3d74c9b85917ac9c56464d2f57242270c09c9e752f8021a0" + +[[package]] +name = "icu_properties" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e7ca276ad3145661a65914e6daf131ca5120cd3dcee8f8f3214b8875184a148" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e590f038c1464a96894fd6d10127e90a8be4509f56ff7ecef851b15cee0b7caa" + +[[package]] +name = "icu_provider" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d27bbb9d3abbefac45d55f647c9de1d44aafcd1186eb91879afef17c396c3e73" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + [[package]] name = "image" version = "0.25.10" @@ -2048,6 +2173,12 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" +[[package]] +name = "litemap" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47d9d19d1d6efa0109d2f65ff4c85cddd50bd572e5a00127ab10987290bcefae" + [[package]] name = "litrs" version = "1.0.0" @@ -2861,6 +2992,15 @@ dependencies = [ "portable-atomic", ] +[[package]] +name = "potential_utf" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d83eb9bc6d8e5cf568e7a1101d60ee05e81ed50ea106026f3d18deeb046d7661" +dependencies = [ + "zerovec", +] + [[package]] name = "ppv-lite86" version = "0.2.21" @@ -3870,6 +4010,16 @@ dependencies = [ "strict-num", ] +[[package]] +name = "tinystr" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1e27c91459209c2986af3dcf603a5a74a4368754ce37414f59acc971167f643" +dependencies = [ + "displaydoc", + "zerovec", +] + [[package]] name = "tinyvec" version = "1.13.3" @@ -4051,6 +4201,18 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" +[[package]] +name = "url" +version = "2.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", +] + [[package]] name = "usvg" version = "0.45.1" @@ -4073,6 +4235,12 @@ dependencies = [ "xmlwriter", ] +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + [[package]] name = "uuid" version = "1.26.1" @@ -4403,6 +4571,22 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "webbrowser" +version = "1.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62c35be770821a214dbc362fc26908c853e776c0004294d0b10b8a6bad582f94" +dependencies = [ + "jni", + "log", + "ndk-context", + "objc2 0.6.4", + "objc2-app-kit 0.3.2", + "objc2-foundation 0.3.2", + "url", + "web-sys", +] + [[package]] name = "weezl" version = "0.1.12" @@ -4948,6 +5132,12 @@ version = "0.57.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" +[[package]] +name = "writeable" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ad82d2a33cdc9674dc7465672f271e096168fcdbe0f799d9e6db8c5892679dc" + [[package]] name = "x11-dl" version = "2.21.0" @@ -5200,6 +5390,39 @@ dependencies = [ "synstructure", ] +[[package]] +name = "zerotrie" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ea269c3bd32f0a32c321907a2ae912ba6f4649bb0fc764a15627e99a7095a3f" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb0464e17806c1d976d5cba29399c7f08e516e279e2ba493f63123b5fca67dd8" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34df6fc39dbd26ddc9c10e6a2984476e13acce22e64e4487636ef494369225da" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.6", +] + [[package]] name = "zlib-rs" version = "0.6.8" diff --git a/README.md b/README.md index d2d4b7bc..29d5a87b 100644 --- a/README.md +++ b/README.md @@ -63,6 +63,16 @@ --- +## Community + +PrintCraft is part of [ArtCraft](https://getartcraft.com). Come say hello, get help and follow development: + +- **Discord: [discord.gg/artcraft](https://discord.gg/artcraft)**. This is the fastest way to get help and share feedback. The app has a Discord button in its title bar. +- **Web page:** [getartcraft.com/apps/printcraft](https://getartcraft.com/apps/printcraft) +- **Source:** [github.com/storytold/printcraft](https://github.com/storytold/printcraft) + +The ArtCraft name and logos in `docs/brand/` belong to Storyteller and are not open source (see `docs/brand/LICENSE-brand.txt`). Forks must remove them. + ## Highlights diff --git a/apps/printcraft-cli/src/main.rs b/apps/printcraft-cli/src/main.rs index e4b6ac64..45309fd5 100644 --- a/apps/printcraft-cli/src/main.rs +++ b/apps/printcraft-cli/src/main.rs @@ -57,9 +57,12 @@ fn main() -> ExitCode { Some("mcp") => mcp(&args[1..]), Some("--version") => { println!("printcraft-cli {}", env!("CARGO_PKG_VERSION")); + println!("Discord: {} (help and feedback)", printcraft_engine::links::DISCORD); + println!("Web: {}", printcraft_engine::links::APP_PAGE); + println!("Source: {}", printcraft_engine::links::GITHUB); Ok(()) } - _ => Err("usage: printcraft-cli … (see source header for options)" + _ => Err("usage: printcraft-cli … (see source header for options)\nhelp and feedback: https://discord.gg/artcraft" .into()), }; match result { diff --git a/apps/printcraft/Cargo.toml b/apps/printcraft/Cargo.toml index 5e9762aa..8716b0a9 100644 --- a/apps/printcraft/Cargo.toml +++ b/apps/printcraft/Cargo.toml @@ -10,6 +10,6 @@ workspace = true [dependencies] printcraft-ui-egui = { workspace = true } -eframe = { workspace = true, features = ["default_fonts", "wgpu", "accesskit", "wayland", "x11", "persistence"] } +eframe = { workspace = true, features = ["default_fonts", "wgpu", "accesskit", "wayland", "x11", "persistence", "links"] } egui = { workspace = true } serde_json = { workspace = true } diff --git a/assets/icons/code-xml.svg b/assets/icons/code-xml.svg new file mode 100644 index 00000000..64f036ab --- /dev/null +++ b/assets/icons/code-xml.svg @@ -0,0 +1,17 @@ + + + + + + diff --git a/assets/icons/external-link.svg b/assets/icons/external-link.svg new file mode 100644 index 00000000..3797f06c --- /dev/null +++ b/assets/icons/external-link.svg @@ -0,0 +1,17 @@ + + + + + + diff --git a/assets/icons/globe.svg b/assets/icons/globe.svg new file mode 100644 index 00000000..e6124c58 --- /dev/null +++ b/assets/icons/globe.svg @@ -0,0 +1,17 @@ + + + + + + diff --git a/assets/icons/messages-square.svg b/assets/icons/messages-square.svg new file mode 100644 index 00000000..70ffd0c4 --- /dev/null +++ b/assets/icons/messages-square.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/crates/automation/src/mcp.rs b/crates/automation/src/mcp.rs index 7d7ca87b..86f9b2cc 100644 --- a/crates/automation/src/mcp.rs +++ b/crates/automation/src/mcp.rs @@ -89,7 +89,7 @@ impl McpServer { Ok(json!({ "protocolVersion": version, "capabilities": { "tools": { "listChanged": false } }, - "serverInfo": { "name": "printcraft", "title": "PrintCraft", "version": env!("CARGO_PKG_VERSION") }, + "serverInfo": { "name": "printcraft", "title": "PrintCraft", "version": env!("CARGO_PKG_VERSION"), "websiteUrl": printcraft_engine::links::APP_PAGE }, "instructions": INSTRUCTIONS, })) } diff --git a/crates/engine/src/commands.rs b/crates/engine/src/commands.rs index 7d223a7d..9c3821ff 100644 --- a/crates/engine/src/commands.rs +++ b/crates/engine/src/commands.rs @@ -156,6 +156,10 @@ pub const COMMANDS: &[CommandSpec] = &[ c("page.split", "Split document…", PAGES, None, Assembly, "scissors"), c("page.number", "Number pages…", PAGES, None, Assembly, "hash"), c("help.shortcuts", "Keyboard shortcuts", HELP, None, Nothing, "circle-help"), + c("help.discord", "Join the ArtCraft Discord", HELP, None, Nothing, "messages-square"), + c("help.app_page", "PrintCraft web page", HELP, None, Nothing, "globe"), + c("help.github", "PrintCraft on GitHub", HELP, None, Nothing, "code-xml"), + c("help.website", "ArtCraft website", HELP, None, Nothing, "external-link"), c("help.about", "About PrintCraft", HELP, None, Nothing, "info"), ]; diff --git a/crates/engine/src/lib.rs b/crates/engine/src/lib.rs index da5f73b9..45799aff 100644 --- a/crates/engine/src/lib.rs +++ b/crates/engine/src/lib.rs @@ -12,6 +12,7 @@ pub mod catalog; pub mod commands; +pub mod links; pub use printcraft_organize::{SplitBy, split_ranges}; diff --git a/crates/engine/src/links.rs b/crates/engine/src/links.rs new file mode 100644 index 00000000..fd474d05 --- /dev/null +++ b/crates/engine/src/links.rs @@ -0,0 +1,45 @@ +//! Where PrintCraft and the ArtCraft community live on the web. One table, so the Help menu, the +//! About dialog, the home screen, the CLI and the README agree. + +/// The app's name in ArtCraft URLs (`getartcraft.com/apps/{APP}`, `github.com/storytold/{APP}`). +pub const APP: &str = "printcraft"; + +pub const DISCORD: &str = "https://discord.gg/artcraft"; +pub const WEBSITE: &str = "https://getartcraft.com"; +pub const APP_PAGE: &str = "https://getartcraft.com/apps/printcraft"; +pub const GITHUB: &str = "https://github.com/storytold/printcraft"; + +/// A link and the registry command that opens it. +#[derive(Clone, Copy, Debug)] +pub struct Link { + pub command: &'static str, + pub label: &'static str, + pub url: &'static str, + /// Lucide icon name. + pub icon: &'static str, +} + +/// In the order they are shown. Discord comes first: it is where people get help fastest. +pub const LINKS: &[Link] = &[ + Link { command: "help.discord", label: "Join the ArtCraft Discord", url: DISCORD, icon: "messages-square" }, + Link { command: "help.app_page", label: "PrintCraft web page", url: APP_PAGE, icon: "globe" }, + Link { command: "help.github", label: "PrintCraft on GitHub", url: GITHUB, icon: "code-xml" }, + Link { command: "help.website", label: "ArtCraft website", url: WEBSITE, icon: "external-link" }, +]; + +pub fn for_command(id: &str) -> Option<&'static Link> { + LINKS.iter().find(|l| l.command == id) +} + +#[cfg(test)] +mod tests { + #[test] + fn urls_follow_the_artcraft_scheme() { + assert_eq!(super::APP_PAGE, format!("{}/apps/{}", super::WEBSITE, super::APP)); + assert_eq!(super::GITHUB, format!("https://github.com/storytold/{}", super::APP)); + for l in super::LINKS { + assert!(l.url.starts_with("https://"), "{}", l.url); + assert!(crate::commands::command(l.command).is_some(), "{} is a registered command", l.command); + } + } +} diff --git a/crates/ui-egui/Cargo.toml b/crates/ui-egui/Cargo.toml index fc3ddc6b..fd3804d0 100644 --- a/crates/ui-egui/Cargo.toml +++ b/crates/ui-egui/Cargo.toml @@ -13,7 +13,7 @@ printcraft-engine = { workspace = true } printcraft-render = { workspace = true } egui = { workspace = true } egui_extras = { workspace = true } -eframe = { workspace = true, features = ["default_fonts", "wgpu", "accesskit", "persistence"] } +eframe = { workspace = true, features = ["default_fonts", "wgpu", "accesskit", "persistence", "links"] } serde = { workspace = true } serde_json = { workspace = true } log = { workspace = true } diff --git a/crates/ui-egui/src/chrome.rs b/crates/ui-egui/src/chrome.rs index 147fd051..574bc7b7 100644 --- a/crates/ui-egui/src/chrome.rs +++ b/crates/ui-egui/src/chrome.rs @@ -54,6 +54,10 @@ pub fn tab_strip(app: &mut PrintCraftApp, ui: &mut egui::Ui) { if icons::button(ui, "circle-help", 28.0, false, "Keyboard shortcuts").clicked() { app.dialog = Some(Dialog::Shortcuts); } + // One click to the community, from anywhere in the app. + if widgets::ghost_button(ui, "messages-square", "Discord").on_hover_text(printcraft_engine::links::DISCORD).clicked() { + app.execute("help.discord"); + } }); }); }); diff --git a/crates/ui-egui/src/commands.rs b/crates/ui-egui/src/commands.rs index f5c9da30..867c7da1 100644 --- a/crates/ui-egui/src/commands.rs +++ b/crates/ui-egui/src/commands.rs @@ -57,6 +57,10 @@ impl PrintCraftApp { } self.dialog = Some(Dialog::NumberPages); } + link if printcraft_engine::links::for_command(link).is_some() => { + let url = printcraft_engine::links::for_command(link).expect("checked").url; + self.open_url(url); + } "bookmark.add" => self.bookmark_action(crate::panels::BmAction::New), "edit.undo" => self.undo(), "edit.redo" => self.redo(), diff --git a/crates/ui-egui/src/dialogs.rs b/crates/ui-egui/src/dialogs.rs index c60eb6fc..59a9f27a 100644 --- a/crates/ui-egui/src/dialogs.rs +++ b/crates/ui-egui/src/dialogs.rs @@ -29,6 +29,7 @@ pub fn show(app: &mut PrintCraftApp, ctx: &egui::Context) { let mut recover: Option = None; let mut number_now: Option = None; let mut apply_number = false; + let mut link_command: Option<&'static str> = None; let t = Tokens::get(ctx); let mut close = false; let mut next = dialog; @@ -317,8 +318,13 @@ pub fn show(app: &mut PrintCraftApp, ctx: &egui::Context) { }); } Dialog::About => { - ui.label(egui::RichText::new("PrintCraft").font(theme::semibold(20.0))); - ui.label(format!("Version {}", env!("CARGO_PKG_VERSION"))); + ui.horizontal(|ui| { + widgets::artcraft_mark(ui, 40.0); + ui.vertical(|ui| { + ui.label(egui::RichText::new("PrintCraft").font(theme::semibold(20.0))); + ui.label(format!("Version {}", env!("CARGO_PKG_VERSION"))); + }); + }); ui.add_space(6.0); ui.label("A clean-room, open-source PDF application written in Rust. MIT OR Apache-2.0."); ui.label( @@ -326,6 +332,15 @@ pub fn show(app: &mut PrintCraftApp, ctx: &egui::Context) { .color(t.text_muted) .small(), ); + ui.add_space(12.0); + ui.horizontal(|ui| { + ui.label(egui::RichText::new("Part of").color(t.text_muted)); + widgets::artcraft_logo(ui, 16.0); + }); + ui.add_space(6.0); + if let Some(cmd) = widgets::community_links(ui) { + link_command = Some(cmd); + } } } ui.add_space(12.0); @@ -377,6 +392,9 @@ pub fn show(app: &mut PrintCraftApp, ctx: &egui::Context) { app.discard_recovered(&keys); } } + if let Some(cmd) = link_command { + app.execute(cmd); + } if apply_number && let Some(edit) = number_now { app.apply_edit(edit); } diff --git a/crates/ui-egui/src/home.rs b/crates/ui-egui/src/home.rs index 5e5aa6ad..1335e198 100644 --- a/crates/ui-egui/src/home.rs +++ b/crates/ui-egui/src/home.rs @@ -16,6 +16,26 @@ pub fn show(app: &mut PrintCraftApp, ui: &mut egui::Ui) { ui.label( egui::RichText::new("An open-source PDF workbench — local, private, and scriptable.").color(t.text_muted).font(theme::regular(14.0)), ); + ui.add_space(14.0); + egui::Frame::NONE + .fill(t.card) + .stroke(Stroke::new(1.0, t.border)) + .corner_radius(CornerRadius::same(12)) + .inner_margin(egui::Margin::same(14)) + .show(ui, |ui| { + ui.set_width(ui.available_width()); + ui.horizontal(|ui| { + widgets::artcraft_mark(ui, 28.0); + ui.vertical(|ui| { + ui.label(egui::RichText::new("Join the ArtCraft community").font(theme::semibold(15.0))); + ui.label(egui::RichText::new("Get help, share feedback and follow development on Discord.").color(t.text_muted)); + }); + }); + ui.add_space(8.0); + if let Some(cmd) = widgets::community_links(ui) { + app.execute(cmd); + } + }); ui.add_space(22.0); egui::Frame::NONE diff --git a/crates/ui-egui/src/icon_data.rs b/crates/ui-egui/src/icon_data.rs index 83923b82..2e94ee17 100644 --- a/crates/ui-egui/src/icon_data.rs +++ b/crates/ui-egui/src/icon_data.rs @@ -37,6 +37,7 @@ pub static ICONS: &[(&str, &[u8])] = &[ ("clock", include_bytes!("../../../assets/icons/clock.svg")), ("cloud-upload", include_bytes!("../../../assets/icons/cloud-upload.svg")), ("cloud", include_bytes!("../../../assets/icons/cloud.svg")), + ("code-xml", include_bytes!("../../../assets/icons/code-xml.svg")), ("columns-2", include_bytes!("../../../assets/icons/columns-2.svg")), ("compass", include_bytes!("../../../assets/icons/compass.svg")), ("contrast", include_bytes!("../../../assets/icons/contrast.svg")), @@ -47,6 +48,7 @@ pub static ICONS: &[(&str, &[u8])] = &[ ("ellipsis-vertical", include_bytes!("../../../assets/icons/ellipsis-vertical.svg")), ("ellipsis", include_bytes!("../../../assets/icons/ellipsis.svg")), ("eraser", include_bytes!("../../../assets/icons/eraser.svg")), + ("external-link", include_bytes!("../../../assets/icons/external-link.svg")), ("eye-off", include_bytes!("../../../assets/icons/eye-off.svg")), ("eye", include_bytes!("../../../assets/icons/eye.svg")), ("file-check", include_bytes!("../../../assets/icons/file-check.svg")), @@ -71,6 +73,7 @@ pub static ICONS: &[(&str, &[u8])] = &[ ("folder", include_bytes!("../../../assets/icons/folder.svg")), ("gauge", include_bytes!("../../../assets/icons/gauge.svg")), ("git-compare", include_bytes!("../../../assets/icons/git-compare.svg")), + ("globe", include_bytes!("../../../assets/icons/globe.svg")), ("grid-3x3", include_bytes!("../../../assets/icons/grid-3x3.svg")), ("hand", include_bytes!("../../../assets/icons/hand.svg")), ("hash", include_bytes!("../../../assets/icons/hash.svg")), @@ -97,6 +100,7 @@ pub static ICONS: &[(&str, &[u8])] = &[ ("message-circle-reply", include_bytes!("../../../assets/icons/message-circle-reply.svg")), ("message-square-text", include_bytes!("../../../assets/icons/message-square-text.svg")), ("message-square", include_bytes!("../../../assets/icons/message-square.svg")), + ("messages-square", include_bytes!("../../../assets/icons/messages-square.svg")), ("mic", include_bytes!("../../../assets/icons/mic.svg")), ("minimize", include_bytes!("../../../assets/icons/minimize.svg")), ("minus", include_bytes!("../../../assets/icons/minus.svg")), diff --git a/crates/ui-egui/src/lib.rs b/crates/ui-egui/src/lib.rs index daa595f2..96e7b951 100644 --- a/crates/ui-egui/src/lib.rs +++ b/crates/ui-egui/src/lib.rs @@ -157,6 +157,8 @@ pub struct PrintCraftApp { pub bookmark_rename: Option<(Vec, String)>, /// Number pages dialog settings (1-based pages). pub number_draft: NumberDraft, + /// The last web link the app asked the system to open (tests and automation). + pub last_opened_url: Option, } /// Settings for the Number pages dialog. @@ -215,6 +217,7 @@ impl PrintCraftApp { fonts_ready: false, control: None, bookmark_rename: None, + last_opened_url: None, number_draft: NumberDraft { from: 1, to: 1, style: printcraft_engine::LabelStyle::Decimal, prefix: String::new(), start: 1 }, } } @@ -400,6 +403,14 @@ impl PrintCraftApp { client } + /// Open a web link in the system browser (a new tab on the web). + pub fn open_url(&mut self, url: &str) { + if let Some(ctx) = &self.ctx { + ctx.open_url(egui::OpenUrl::new_tab(url)); + } + self.last_opened_url = Some(url.to_string()); + } + pub fn notify(&mut self, msg: impl Into) { self.toast = Some((msg.into(), 0.0)); } diff --git a/crates/ui-egui/src/widgets.rs b/crates/ui-egui/src/widgets.rs index acc29f30..9121a18b 100644 --- a/crates/ui-egui/src/widgets.rs +++ b/crates/ui-egui/src/widgets.rs @@ -106,3 +106,57 @@ pub fn toast(app: &mut PrintCraftApp, ctx: &egui::Context) { }); ctx.request_repaint_after(std::time::Duration::from_millis(100)); } + +/// The ArtCraft wordmark (Storyteller's brand, docs/brand/; not open source), sized to `height`. +pub fn artcraft_logo(ui: &mut egui::Ui, height: f32) -> Response { + let dark = ui.visuals().dark_mode; + let (uri, bytes): (&str, &'static [u8]) = if dark { + ("bytes://artcraft-logo-white.svg", include_bytes!("../../../docs/brand/artcraft-logo-white.svg")) + } else { + ("bytes://artcraft-logo.svg", include_bytes!("../../../docs/brand/artcraft-logo.svg")) + }; + ui.add(egui::Image::from_bytes(uri, bytes).max_height(height).alt_text("ArtCraft")) +} + +/// The ArtCraft mark (brand blue, works on light and dark), `size` points square. +pub fn artcraft_mark(ui: &mut egui::Ui, size: f32) -> Response { + ui.add( + egui::Image::from_bytes("bytes://artcraft-mark.svg", include_bytes!("../../../docs/brand/artcraft-mark.svg")) + .fit_to_exact_size(vec2(size, size)) + .alt_text("ArtCraft"), + ) +} + +/// Buttons for every community link (`printcraft_engine::links`), Discord first and prominent. +/// Returns the registry command of the one clicked. +pub fn community_links(ui: &mut egui::Ui) -> Option<&'static str> { + let mut clicked = None; + ui.horizontal_wrapped(|ui| { + ui.spacing_mut().item_spacing = vec2(8.0, 8.0); + for (i, l) in printcraft_engine::links::LINKS.iter().enumerate() { + let resp = if i == 0 { icon_pill(ui, l.icon, "Join our Discord", true) } else { icon_pill(ui, l.icon, l.label, false) }; + if resp.on_hover_text(l.url).clicked() { + clicked = Some(l.command); + } + } + }); + clicked +} + +/// A pill button with an icon (primary = filled accent). +pub fn icon_pill(ui: &mut egui::Ui, icon: &str, label: &str, primary: bool) -> Response { + let t = Tokens::get(ui.ctx()); + let font = theme::medium(12.5); + let w = ui.fonts_mut(|f| f.layout_no_wrap(label.to_owned(), font.clone(), t.text).size().x); + let (rect, resp) = ui.allocate_exact_size(vec2(w + 46.0, 30.0), Sense::click()); + resp.widget_info(|| egui::WidgetInfo::labeled(egui::WidgetType::Button, ui.is_enabled(), label)); + let (fill, stroke, text) = if primary { + (if resp.hovered() { t.accent_text } else { t.accent }, Stroke::NONE, Color32::WHITE) + } else { + (if resp.hovered() { t.hover } else { t.card }, Stroke::new(1.2, t.text_muted), t.text) + }; + ui.painter().rect(rect, CornerRadius::same(15), fill, stroke, egui::StrokeKind::Inside); + crate::icons::paint(ui, Rect::from_min_size(rect.min + vec2(12.0, 7.0), vec2(16.0, 16.0)), icon, 15.0, text); + ui.painter().text(rect.left_center() + vec2(34.0, 0.0), Align2::LEFT_CENTER, label, font, text); + resp +} diff --git a/crates/ui-egui/tests/links.rs b/crates/ui-egui/tests/links.rs new file mode 100644 index 00000000..6f6c149e --- /dev/null +++ b/crates/ui-egui/tests/links.rs @@ -0,0 +1,66 @@ +//! Community links: the Discord button is one click away everywhere; Help menu, About dialog and +//! home screen open the ArtCraft and PrintCraft pages. + +use egui_kittest::Harness; +use egui_kittest::kittest::Queryable; +use printcraft_engine::links; +use printcraft_ui_egui::{Dialog, PrintCraftApp}; + +fn harness(setup: impl FnOnce(&mut PrintCraftApp) + 'static) -> Harness<'static, PrintCraftApp> { + let mut h = Harness::builder().with_size(egui::vec2(1400.0, 900.0)).build_eframe(move |_cc| { + let mut app = PrintCraftApp::new(); + setup(&mut app); + app + }); + h.run_steps(4); + h +} + +#[test] +fn discord_button_in_the_top_bar_opens_discord() { + let mut h = harness(|_| {}); + h.get_by_label("Discord").click(); + h.run_steps(2); + assert_eq!(h.state().last_opened_url.as_deref(), Some(links::DISCORD)); + assert_eq!(links::DISCORD, "https://discord.gg/artcraft"); +} + +#[test] +fn home_screen_links() { + for (label, url) in [ + ("Join our Discord", links::DISCORD), + ("PrintCraft web page", "https://getartcraft.com/apps/printcraft"), + ("PrintCraft on GitHub", "https://github.com/storytold/printcraft"), + ("ArtCraft website", "https://getartcraft.com"), + ] { + let mut h = harness(|_| {}); + h.get_by_label("Join the ArtCraft community"); + h.get_by_label(label).click(); + h.run_steps(2); + assert_eq!(h.state().last_opened_url.as_deref(), Some(url), "{label}"); + } +} + +#[test] +fn about_dialog_shows_the_brand_and_links() { + let pdf = b"%PDF-1.7\n1 0 obj << /Type /Catalog /Pages 2 0 R >> endobj\n2 0 obj << /Type /Pages /Kids [3 0 R] /Count 1 >> endobj\n3 0 obj << /Type /Page /Parent 2 0 R /MediaBox [0 0 200 200] >> endobj\ntrailer << /Root 1 0 R >>\n%%EOF"; + // With a document open, so the home screen's own links are not on screen. + let mut h = harness(move |app| { + app.open_bytes("one.pdf", None, pdf.to_vec()).unwrap(); + app.dialog = Some(Dialog::About); + }); + assert!(h.query_all_by_label("ArtCraft").count() >= 2, "the mark and the wordmark (alt text)"); + h.get_by_label("Join our Discord").click(); + h.run_steps(2); + assert_eq!(h.state().last_opened_url.as_deref(), Some(links::DISCORD)); +} + +#[test] +fn help_commands_open_each_link() { + for l in links::LINKS { + let mut h = harness(|_| {}); + assert!(h.state_mut().execute(l.command), "{}", l.command); + assert_eq!(h.state().last_opened_url.as_deref(), Some(l.url)); + assert_eq!(printcraft_engine::commands::command(l.command).unwrap().menu, Some("Help")); + } +} diff --git a/docs/images/printcraft-bookmarks.png b/docs/images/printcraft-bookmarks.png index d2a97b46..b61461d2 100644 Binary files a/docs/images/printcraft-bookmarks.png and b/docs/images/printcraft-bookmarks.png differ diff --git a/docs/images/printcraft-dark.png b/docs/images/printcraft-dark.png index 639a279f..ffd738ec 100644 Binary files a/docs/images/printcraft-dark.png and b/docs/images/printcraft-dark.png differ diff --git a/docs/images/printcraft-find.png b/docs/images/printcraft-find.png index 60f0f01b..292400f3 100644 Binary files a/docs/images/printcraft-find.png and b/docs/images/printcraft-find.png differ diff --git a/docs/images/printcraft-forms.png b/docs/images/printcraft-forms.png index 7e8c5ff2..759535a9 100644 Binary files a/docs/images/printcraft-forms.png and b/docs/images/printcraft-forms.png differ diff --git a/docs/images/printcraft-layers.png b/docs/images/printcraft-layers.png index 94235112..7bc78ca0 100644 Binary files a/docs/images/printcraft-layers.png and b/docs/images/printcraft-layers.png differ diff --git a/docs/images/printcraft-organize.png b/docs/images/printcraft-organize.png index 5b6abf22..9f3ad97f 100644 Binary files a/docs/images/printcraft-organize.png and b/docs/images/printcraft-organize.png differ diff --git a/docs/images/printcraft-palette.png b/docs/images/printcraft-palette.png index a8062040..c7ced4f3 100644 Binary files a/docs/images/printcraft-palette.png and b/docs/images/printcraft-palette.png differ diff --git a/docs/images/printcraft-properties.png b/docs/images/printcraft-properties.png index 8cfd13d8..7c3e339a 100644 Binary files a/docs/images/printcraft-properties.png and b/docs/images/printcraft-properties.png differ diff --git a/docs/images/printcraft-scripts.png b/docs/images/printcraft-scripts.png index c560977d..c028c49a 100644 Binary files a/docs/images/printcraft-scripts.png and b/docs/images/printcraft-scripts.png differ diff --git a/docs/images/printcraft-split.png b/docs/images/printcraft-split.png index ce0e851c..517d88a1 100644 Binary files a/docs/images/printcraft-split.png and b/docs/images/printcraft-split.png differ diff --git a/docs/images/printcraft-tools.png b/docs/images/printcraft-tools.png index 3c788f73..0283e916 100644 Binary files a/docs/images/printcraft-tools.png and b/docs/images/printcraft-tools.png differ diff --git a/docs/images/printcraft-twoup.png b/docs/images/printcraft-twoup.png index a8fdc5c2..a64d41b3 100644 Binary files a/docs/images/printcraft-twoup.png and b/docs/images/printcraft-twoup.png differ diff --git a/docs/images/printcraft-viewer.png b/docs/images/printcraft-viewer.png index e69e4da0..d63207d3 100644 Binary files a/docs/images/printcraft-viewer.png and b/docs/images/printcraft-viewer.png differ diff --git a/xtask/src/screenshots.rs b/xtask/src/screenshots.rs index bf5d90b1..d19aadbb 100644 --- a/xtask/src/screenshots.rs +++ b/xtask/src/screenshots.rs @@ -107,10 +107,19 @@ fn update_attribution(root: &Path) -> Result<()> { images.sort(); for file in images.iter().filter(|f| f.ends_with(".png")) { let stem = file.trim_end_matches(".png"); - let (title, usage) = SCENES.iter().find(|(n, ..)| *n == stem).map(|(_, t, u, _)| (*t, *u)).unwrap_or(("PrintCraft screenshot", "README")); + let scene = SCENES.iter().find(|(n, ..)| *n == stem); + let (title, usage) = scene.map(|(_, t, u, _)| (*t, *u)).unwrap_or(("PrintCraft screenshot", "README")); + // The home screen shows the ArtCraft mark: say so (it is a Storyteller trademark, not open + // source; AGENTS.md §1.2), so the screenshot's licence is not read as covering it. + let shows_home = scene.is_some_and(|(.., args)| args.windows(2).any(|w| w[0] == "--home" && w[1] == "on")); + let contents = if shows_home { + "Shows PrintCraft UI, Lucide icons, the showcase PDF built from the [[fetched]] OFL fonts, and the ArtCraft mark (Storyteller trademark from docs/brand/, not covered by this licence)" + } else { + "Shows only PrintCraft UI, Lucide icons and the showcase PDF built from the [[fetched]] OFL fonts" + }; let bytes = std::fs::read(root.join("docs/images").join(file))?; out.push_str(&format!( - "\n[[asset]]\npath = \"docs/images/{file}\"\ntitle = \"PrintCraft screenshot: {title}\"\nauthor = \"PrintCraft contributors (generated by `cargo xtask screenshots`)\"\nsource = \"this repository\"\nlicence = \"MIT OR Apache-2.0\"\nlicence_file = \"LICENSE-MIT\"\nkind = \"image\"\nusage = \"{usage}. Shows only PrintCraft UI, Lucide icons and the showcase PDF built from the [[fetched]] OFL fonts\"\nsha256 = \"{}\"\n", + "\n[[asset]]\npath = \"docs/images/{file}\"\ntitle = \"PrintCraft screenshot: {title}\"\nauthor = \"PrintCraft contributors (generated by `cargo xtask screenshots`)\"\nsource = \"this repository\"\nlicence = \"MIT OR Apache-2.0\"\nlicence_file = \"LICENSE-MIT\"\nkind = \"image\"\nusage = \"{usage}. {contents}\"\nsha256 = \"{}\"\n", crate::assets::sha256_hex(&bytes) )); }