Community links: Discord button in the title bar, ArtCraft community card on Home, About dialog with ArtCraft mark/wordmark and links, Help menu commands (help.discord/app_page/github/website), CLI --version and MCP websiteUrl, README Community section; 4 Lucide icons (attributed); regenerated screenshots with honest brand attribution
Co-Authored-By: Claude Opus 5.5 <[email protected]>
No files matched your search
@@ -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)
|
||||
|
||||
|
||||
@@ -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"
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
<table>
|
||||
|
||||
@@ -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 <info|render|text|edit|combine|extract|split|check|tools|run|mcp|ui> … (see source header for options)"
|
||||
_ => Err("usage: printcraft-cli <info|render|text|edit|combine|extract|split|check|tools|run|mcp|ui> … (see source header for options)\nhelp and feedback: https://discord.gg/artcraft"
|
||||
.into()),
|
||||
};
|
||||
match result {
|
||||
|
||||
@@ -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 }
|
||||
@@ -0,0 +1,17 @@
|
||||
<!-- @license lucide-static v1.49.0 - ISC -->
|
||||
<svg
|
||||
class="lucide lucide-code-xml"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path d="m18 16 4-4-4-4" />
|
||||
<path d="m6 8-4 4 4 4" />
|
||||
<path d="m14.5 4-5 16" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 373 B |
@@ -0,0 +1,17 @@
|
||||
<!-- @license lucide-static v1.49.0 - ISC -->
|
||||
<svg
|
||||
class="lucide lucide-external-link"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path d="M15 3h6v6" />
|
||||
<path d="M10 14 21 3" />
|
||||
<path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 416 B |
@@ -0,0 +1,17 @@
|
||||
<!-- @license lucide-static v1.49.0 - ISC -->
|
||||
<svg
|
||||
class="lucide lucide-globe"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<circle cx="12" cy="12" r="10" />
|
||||
<path d="M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20" />
|
||||
<path d="M2 12h20" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 407 B |
@@ -0,0 +1,16 @@
|
||||
<!-- @license lucide-static v1.49.0 - ISC -->
|
||||
<svg
|
||||
class="lucide lucide-messages-square"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path d="M16 10a2 2 0 0 1-2 2H6.828a2 2 0 0 0-1.414.586l-2.202 2.202A.71.71 0 0 1 2 14.286V4a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2z" />
|
||||
<path d="M20 9a2 2 0 0 1 2 2v10.286a.71.71 0 0 1-1.212.502l-2.202-2.202A2 2 0 0 0 17.172 19H10a2 2 0 0 1-2-2v-1" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 543 B |
@@ -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,
|
||||
}))
|
||||
}
|
||||
|
||||
@@ -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"),
|
||||
];
|
||||
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
|
||||
pub mod catalog;
|
||||
pub mod commands;
|
||||
pub mod links;
|
||||
|
||||
pub use printcraft_organize::{SplitBy, split_ranges};
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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 }
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -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(),
|
||||
|
||||
@@ -29,6 +29,7 @@ pub fn show(app: &mut PrintCraftApp, ctx: &egui::Context) {
|
||||
let mut recover: Option<bool> = None;
|
||||
let mut number_now: Option<Edit> = 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);
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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")),
|
||||
|
||||
@@ -157,6 +157,8 @@ pub struct PrintCraftApp {
|
||||
pub bookmark_rename: Option<(Vec<usize>, 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<String>,
|
||||
}
|
||||
|
||||
/// 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<String>) {
|
||||
self.toast = Some((msg.into(), 0.0));
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
@@ -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"));
|
||||
}
|
||||
}
|
||||
|
Before Width: | Height: | Size: 502 KiB After Width: | Height: | Size: 505 KiB |
|
Before Width: | Height: | Size: 689 KiB After Width: | Height: | Size: 692 KiB |
|
Before Width: | Height: | Size: 410 KiB After Width: | Height: | Size: 459 KiB |
|
Before Width: | Height: | Size: 431 KiB After Width: | Height: | Size: 434 KiB |
|
Before Width: | Height: | Size: 429 KiB After Width: | Height: | Size: 432 KiB |
|
Before Width: | Height: | Size: 540 KiB After Width: | Height: | Size: 543 KiB |
|
Before Width: | Height: | Size: 518 KiB After Width: | Height: | Size: 524 KiB |
|
Before Width: | Height: | Size: 563 KiB After Width: | Height: | Size: 565 KiB |
|
Before Width: | Height: | Size: 452 KiB After Width: | Height: | Size: 455 KiB |
|
Before Width: | Height: | Size: 465 KiB After Width: | Height: | Size: 468 KiB |
|
Before Width: | Height: | Size: 307 KiB After Width: | Height: | Size: 361 KiB |
|
Before Width: | Height: | Size: 817 KiB After Width: | Height: | Size: 820 KiB |
|
Before Width: | Height: | Size: 688 KiB After Width: | Height: | Size: 691 KiB |
@@ -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)
|
||||
));
|
||||
}
|
||||
|
||||