7 Commits

Author SHA1 Message Date
Marcos Paulo b2e42ce0ff chore: release 0.7.2 2026-10-12 21:40:53 -03:00
Marcos Paulo a9a1f2cbcb build: refresh Cargo.lock for the masi/craft-libs fork rev 2026-10-12 21:08:26 -03:00
Marcos Paulo c583d6e6ed build: pin craft-ui to the same masi/craft-libs rev as craft-print 2026-10-12 20:58:36 -03:00
Marcos Paulo 73137d1598 build: use the masi/craft-libs fork
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-12 20:53:17 -03:00
Marcos Paulo fd85683f3d build(windows): set working directory to repo root in package.ps1 2026-10-12 20:53:17 -03:00
Marcos Paulo f524267e0c build(windows): package standalone designcraft-cli zip and auto-detect rc.exe 2026-10-12 20:53:17 -03:00
Marcos Paulo d1b5cfbf1e chore: debrand ArtCraft and Discord references
Remove the Discord buttons, Help menu links, About mark and brand assets;
rewrite docs and packaging URLs. Add .debrand rules and the craft-skills
submodule (debrand skill) to keep upstream syncs clean.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-12 20:53:17 -03:00
40 changed files with 1509 additions and 557 deletions
+18
View File
@@ -0,0 +1,18 @@
# Strip upstream (ArtCraft / Discord) branding. Run: perl tools/craft-skills/skills/debrand/debrand.pl . (--check in CI)
delete docs/brand
# MIT/Apache texts stay verbatim. The copyright holder line stays everywhere (legal requirement).
keep ^(LICENSE-(MIT|APACHE)|\.debrand)$
dropline ^ASSETS\.md$ :: \|\s*`docs/brand/
dropline ^crates/ui-egui/src/i18n(/.*)?\.rs$ :: \s*\("[^"]*(?:ArtCraft|Discord|discord)
sub (?s)\nThe ArtCraft name, wordmark and logos in docs/brand/.*?LICENSE-brand\.txt\.\n =>
sub \s*\(except the ArtCraft trademarks in `docs/brand/`, under `docs/brand/LICENSE-brand\.txt`\) =>
sub drawn in ArtCraft\) => drawn by hand)
sub owner's ArtCraft drawing => owner's drawing
sub by the project owner in ArtCraft, then => by the project owner, then
sub The owner drew the cat in ArtCraft\. => The owner drew the cat by hand.
sub the MIT OR Apache-2\.0 ArtCraft sibling catalogs => the MIT OR Apache-2.0 sibling catalogs
forbid (?i)artcraft(?! Team and the DesignCraft contributors)
forbid (?i)discord
sub \s*The one exception is the ArtCraft brand files in `docs/brand/`: ArtCraft trademarks, not open source, used under `docs/brand/LICENSE-brand\.txt`\. =>
sub https://getartcraft\.com/apps/designcraft => https://github.com/storytold/designcraft
sub https://discord\.gg/artcraft => https://github.com/storytold/designcraft/issues
+3
View File
@@ -0,0 +1,3 @@
[submodule "tools/craft-skills"]
path = tools/craft-skills
url = https://git.marcospaulo.dev.br/storytold/craft-skills.git
+1 -1
View File
@@ -20,7 +20,7 @@ People trust DesignCraft with their layouts; a crash loses their work. **This ou
## Non-negotiables
- **Clean-room.** InDesign is installed on the dev machine and may be *observed* black-box: run it, use its UI with synthetic documents, take screenshots (by window id) stored only under `plan/indesign/screenshots/` (never committed). Never read, disassemble or copy anything inside the InDesign bundle (names/listings only), never copy Adobe icons, artwork, presets or wording beyond feature names, never commit files produced by InDesign. Never copy GPL/AGPL/LGPL code (Scribus, LibreOffice, Ghostscript…).
- **Assets:** no Adobe iconography or images — ever. Every asset is original / OSI / CC0 / redistributable CC (except the ArtCraft trademarks in `docs/brand/`, under `docs/brand/LICENSE-brand.txt`) and has a row in `ASSETS.md` (`cargo xtask assets` enforces it). Prefer art generated in code.
- **Assets:** no Adobe iconography or images — ever. Every asset is original / OSI / CC0 / redistributable CC and has a row in `ASSETS.md` (`cargo xtask assets` enforces it). Prefer art generated in code.
- **Fonts live in [`storytold/craft-fonts`](https://github.com/storytold/craft-fonts)**, never in this repo: don't commit new font files (the Latin UI/document fonts already in `assets/fonts/` stay). It is an optional build input, never a `Cargo.toml` dependency: `CRAFT_FONTS_DIR=/abs/path/to/craft-fonts cargo build` makes `crates/fonts/build.rs` embed its fonts as `designcraft_fonts::CRAFT_FONTS` (Japanese: BIZ UDPGothic for the UI, Mincho first for document text; web builds embed BIZ UDPGothic Regular only). Unset, `CRAFT_FONTS` is empty and the app uses its bundled and system fonts; code and tests must work that way (tests on its glyphs skip). Releases build with it. Standard: [craftrules `standards/fonts.md`](https://github.com/storytold/craftrules/blob/main/standards/fonts.md).
- **Shared test corpora.** Real-file test oracles (Photoshop-authored PSDs, etc.) live in [`storytold/photocraft-corpus`](https://github.com/storytold/photocraft-corpus), explained in [craftrules `standards/test-corpora.md`](https://github.com/storytold/craftrules/blob/main/standards/test-corpora.md). Never commit large binary fixtures to this repo; fetch them pinned by commit and sha256-verified, as PhotoCraft does with `cargo xtask corpus`.
- **Everything is a command.** User-visible behaviour = a command in `crates/engine/src/cmd/*` (id, label, menu path, shortcut, params doc, `enabled`, `run`) + tests. Tools emit commands (Begin/Preview/Commit). UI-only commands live in `crates/ui-egui/src/menus.rs` (`UI_COMMANDS`). The control channel and MCP reach all of them.
+16 -21
View File
@@ -2,7 +2,7 @@
Every non-code asset in this repository (fonts, images, example art, presets) is listed here with its author, source and licence. `cargo xtask assets` (part of `cargo xtask ci`) fails if an asset file is missing from this table.
**Policy (mandatory):** DesignCraft contains **no Adobe iconography, images, artwork, presets, swatch libraries or ICC profiles**. Every asset is original work by DesignCraft contributors or third-party material under an open licence (OSI open source, public domain / CC0, or Creative Commons that allows redistribution). Screenshots of Adobe software are never committed. Font files are not added here: shared fonts live in [storytold/craft-fonts](https://github.com/storytold/craft-fonts), an optional build input (`CRAFT_FONTS_DIR`, see AGENTS.md and craftrules [`standards/fonts.md`](https://github.com/storytold/craftrules/blob/main/standards/fonts.md)). The one exception is the ArtCraft brand files in `docs/brand/`: ArtCraft trademarks, not open source, used under `docs/brand/LICENSE-brand.txt`.
**Policy (mandatory):** DesignCraft contains **no Adobe iconography, images, artwork, presets, swatch libraries or ICC profiles**. Every asset is original work by DesignCraft contributors or third-party material under an open licence (OSI open source, public domain / CC0, or Creative Commons that allows redistribution). Screenshots of Adobe software are never committed. Font files are not added here: shared fonts live in [storytold/craft-fonts](https://github.com/storytold/craft-fonts), an optional build input (`CRAFT_FONTS_DIR`, see AGENTS.md and craftrules [`standards/fonts.md`](https://github.com/storytold/craftrules/blob/main/standards/fonts.md)).
Generated-in-code art is original and has no file to list: the UI icon set (`crates/ui-egui/src/icons.rs`), default swatches, and the sample magazine's imagery (`crates/engine/src/sample.rs`).
@@ -45,25 +45,20 @@ Generated-in-code art is original and has no file to list: the UI icon set (`cra
| `crates/render/tests/golden/inner-shadow.png` | DesignCraft contributors (generated) | rendered by DesignCraft's own renderer (`crates/render/tests/effects.rs`, synthetic shapes and bundled fonts) | MIT OR Apache-2.0 | Golden test image for soft effects |
| `crates/render/tests/golden/outer-glow.png` | DesignCraft contributors (generated) | rendered by DesignCraft's own renderer (`crates/render/tests/effects.rs`, synthetic shapes and bundled fonts) | MIT OR Apache-2.0 | Golden test image for soft effects |
| `assets/app-icon/LICENSE.txt` | (licence text) | this project | — | Licence for the app icon |
| `assets/app-icon/designcraft-1024.png` | DesignCraft project owner (drawn in ArtCraft) | rendered from `assets/app-icon/designcraft.svg` by `packaging/icons.sh` | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | App icon: calico cat in a polka-dot scarf (see `assets/app-icon/README.md`) |
| `assets/app-icon/designcraft-macos-512.png` | DesignCraft project owner (drawn in ArtCraft) | rendered from `assets/app-icon/designcraft.svg` by `packaging/icons.sh` | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | App icon: calico cat in a polka-dot scarf (see `assets/app-icon/README.md`) |
| `assets/app-icon/designcraft-small.svg` | DesignCraft project owner (drawn in ArtCraft) | owner's ArtCraft drawing, vectorised with craftrules `assets/logo-options/_tools/vectorize_tile.py` | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | App icon: calico cat in a polka-dot scarf (see `assets/app-icon/README.md`) |
| `assets/app-icon/designcraft.icns` | DesignCraft project owner (drawn in ArtCraft) | rendered from `assets/app-icon/designcraft.svg` by `packaging/icons.sh` | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | App icon: calico cat in a polka-dot scarf (see `assets/app-icon/README.md`) |
| `assets/app-icon/designcraft.ico` | DesignCraft project owner (drawn in ArtCraft) | rendered from `assets/app-icon/designcraft.svg` by `packaging/icons.sh` | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | App icon: calico cat in a polka-dot scarf (see `assets/app-icon/README.md`) |
| `assets/app-icon/designcraft.svg` | DesignCraft project owner (drawn in ArtCraft) | owner's ArtCraft drawing, vectorised with craftrules `assets/logo-options/_tools/vectorize_tile.py` | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | App icon: calico cat in a polka-dot scarf (see `assets/app-icon/README.md`) |
| `assets/app-icon/hicolor/128x128/apps/ai.storyteller.designcraft.png` | DesignCraft project owner (drawn in ArtCraft) | rendered from `assets/app-icon/designcraft.svg` by `packaging/icons.sh` | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | App icon: calico cat in a polka-dot scarf (see `assets/app-icon/README.md`) |
| `assets/app-icon/hicolor/16x16/apps/ai.storyteller.designcraft.png` | DesignCraft project owner (drawn in ArtCraft) | rendered from `assets/app-icon/designcraft.svg` by `packaging/icons.sh` | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | App icon: calico cat in a polka-dot scarf (see `assets/app-icon/README.md`) |
| `assets/app-icon/hicolor/24x24/apps/ai.storyteller.designcraft.png` | DesignCraft project owner (drawn in ArtCraft) | rendered from `assets/app-icon/designcraft.svg` by `packaging/icons.sh` | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | App icon: calico cat in a polka-dot scarf (see `assets/app-icon/README.md`) |
| `assets/app-icon/hicolor/256x256/apps/ai.storyteller.designcraft.png` | DesignCraft project owner (drawn in ArtCraft) | rendered from `assets/app-icon/designcraft.svg` by `packaging/icons.sh` | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | App icon: calico cat in a polka-dot scarf (see `assets/app-icon/README.md`) |
| `assets/app-icon/hicolor/32x32/apps/ai.storyteller.designcraft.png` | DesignCraft project owner (drawn in ArtCraft) | rendered from `assets/app-icon/designcraft.svg` by `packaging/icons.sh` | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | App icon: calico cat in a polka-dot scarf (see `assets/app-icon/README.md`) |
| `assets/app-icon/hicolor/48x48/apps/ai.storyteller.designcraft.png` | DesignCraft project owner (drawn in ArtCraft) | rendered from `assets/app-icon/designcraft.svg` by `packaging/icons.sh` | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | App icon: calico cat in a polka-dot scarf (see `assets/app-icon/README.md`) |
| `assets/app-icon/hicolor/512x512/apps/ai.storyteller.designcraft.png` | DesignCraft project owner (drawn in ArtCraft) | rendered from `assets/app-icon/designcraft.svg` by `packaging/icons.sh` | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | App icon: calico cat in a polka-dot scarf (see `assets/app-icon/README.md`) |
| `assets/app-icon/hicolor/64x64/apps/ai.storyteller.designcraft.png` | DesignCraft project owner (drawn in ArtCraft) | rendered from `assets/app-icon/designcraft.svg` by `packaging/icons.sh` | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | App icon: calico cat in a polka-dot scarf (see `assets/app-icon/README.md`) |
| `assets/app-icon/hicolor/scalable/apps/ai.storyteller.designcraft.svg` | DesignCraft project owner (drawn in ArtCraft) | owner's ArtCraft drawing, vectorised with craftrules `assets/logo-options/_tools/vectorize_tile.py` | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | App icon: calico cat in a polka-dot scarf (see `assets/app-icon/README.md`) |
| `docs/brand/artcraft-logo.svg`, `docs/brand/artcraft-logo.png` | ArtCraft / Storyteller | ArtCraft brand kit (project owner) | ArtCraft trademark, see docs/brand/LICENSE-brand.txt (not open source) | ArtCraft wordmark (README header) |
| `docs/brand/artcraft-logo-white.svg`, `docs/brand/artcraft-logo-white.png` | ArtCraft / Storyteller | ArtCraft brand kit (project owner) | ArtCraft trademark, see docs/brand/LICENSE-brand.txt (not open source) | Wordmark for dark backgrounds |
| `docs/brand/artcraft-mark.svg`, `docs/brand/artcraft-mark.png` | ArtCraft / Storyteller | ArtCraft brand kit (project owner) | ArtCraft trademark, see docs/brand/LICENSE-brand.txt (not open source) | The mark; its outline is drawn in code by `crates/ui-egui/src/about.rs` (About splash, start screen) |
| `docs/brand/artcraft-mark-black.svg`, `docs/brand/artcraft-mark-black.png` | ArtCraft / Storyteller | ArtCraft brand kit (project owner) | ArtCraft trademark, see docs/brand/LICENSE-brand.txt (not open source) | Mark for light backgrounds |
| `docs/brand/LICENSE-brand.txt` | (licence text) | ArtCraft Team | — | Terms for the ArtCraft Marks in `docs/brand/` |
| `assets/app-icon/designcraft-1024.png` | DesignCraft project owner (drawn by hand) | rendered from `assets/app-icon/designcraft.svg` by `packaging/icons.sh` | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | App icon: calico cat in a polka-dot scarf (see `assets/app-icon/README.md`) |
| `assets/app-icon/designcraft-macos-512.png` | DesignCraft project owner (drawn by hand) | rendered from `assets/app-icon/designcraft.svg` by `packaging/icons.sh` | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | App icon: calico cat in a polka-dot scarf (see `assets/app-icon/README.md`) |
| `assets/app-icon/designcraft-small.svg` | DesignCraft project owner (drawn by hand) | owner's drawing, vectorised with craftrules `assets/logo-options/_tools/vectorize_tile.py` | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | App icon: calico cat in a polka-dot scarf (see `assets/app-icon/README.md`) |
| `assets/app-icon/designcraft.icns` | DesignCraft project owner (drawn by hand) | rendered from `assets/app-icon/designcraft.svg` by `packaging/icons.sh` | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | App icon: calico cat in a polka-dot scarf (see `assets/app-icon/README.md`) |
| `assets/app-icon/designcraft.ico` | DesignCraft project owner (drawn by hand) | rendered from `assets/app-icon/designcraft.svg` by `packaging/icons.sh` | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | App icon: calico cat in a polka-dot scarf (see `assets/app-icon/README.md`) |
| `assets/app-icon/designcraft.svg` | DesignCraft project owner (drawn by hand) | owner's drawing, vectorised with craftrules `assets/logo-options/_tools/vectorize_tile.py` | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | App icon: calico cat in a polka-dot scarf (see `assets/app-icon/README.md`) |
| `assets/app-icon/hicolor/128x128/apps/ai.storyteller.designcraft.png` | DesignCraft project owner (drawn by hand) | rendered from `assets/app-icon/designcraft.svg` by `packaging/icons.sh` | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | App icon: calico cat in a polka-dot scarf (see `assets/app-icon/README.md`) |
| `assets/app-icon/hicolor/16x16/apps/ai.storyteller.designcraft.png` | DesignCraft project owner (drawn by hand) | rendered from `assets/app-icon/designcraft.svg` by `packaging/icons.sh` | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | App icon: calico cat in a polka-dot scarf (see `assets/app-icon/README.md`) |
| `assets/app-icon/hicolor/24x24/apps/ai.storyteller.designcraft.png` | DesignCraft project owner (drawn by hand) | rendered from `assets/app-icon/designcraft.svg` by `packaging/icons.sh` | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | App icon: calico cat in a polka-dot scarf (see `assets/app-icon/README.md`) |
| `assets/app-icon/hicolor/256x256/apps/ai.storyteller.designcraft.png` | DesignCraft project owner (drawn by hand) | rendered from `assets/app-icon/designcraft.svg` by `packaging/icons.sh` | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | App icon: calico cat in a polka-dot scarf (see `assets/app-icon/README.md`) |
| `assets/app-icon/hicolor/32x32/apps/ai.storyteller.designcraft.png` | DesignCraft project owner (drawn by hand) | rendered from `assets/app-icon/designcraft.svg` by `packaging/icons.sh` | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | App icon: calico cat in a polka-dot scarf (see `assets/app-icon/README.md`) |
| `assets/app-icon/hicolor/48x48/apps/ai.storyteller.designcraft.png` | DesignCraft project owner (drawn by hand) | rendered from `assets/app-icon/designcraft.svg` by `packaging/icons.sh` | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | App icon: calico cat in a polka-dot scarf (see `assets/app-icon/README.md`) |
| `assets/app-icon/hicolor/512x512/apps/ai.storyteller.designcraft.png` | DesignCraft project owner (drawn by hand) | rendered from `assets/app-icon/designcraft.svg` by `packaging/icons.sh` | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | App icon: calico cat in a polka-dot scarf (see `assets/app-icon/README.md`) |
| `assets/app-icon/hicolor/64x64/apps/ai.storyteller.designcraft.png` | DesignCraft project owner (drawn by hand) | rendered from `assets/app-icon/designcraft.svg` by `packaging/icons.sh` | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | App icon: calico cat in a polka-dot scarf (see `assets/app-icon/README.md`) |
| `assets/app-icon/hicolor/scalable/apps/ai.storyteller.designcraft.svg` | DesignCraft project owner (drawn by hand) | owner's drawing, vectorised with craftrules `assets/logo-options/_tools/vectorize_tile.py` | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | App icon: calico cat in a polka-dot scarf (see `assets/app-icon/README.md`) |
| `packaging/macos/dmg/background.svg` | @XusBadia | original work for this repository, derived from the DesignCraft app icon (`assets/app-icon/designcraft.svg`, referenced via `<image>`, not copied); text is outlined Inter / JetBrains Mono glyph paths | MIT OR Apache-2.0 (`LICENSE-MIT`, `LICENSE-APACHE`) | DesignCraft macOS DMG window background for the Finder window; `packaging/macos/dmg/generate.py` renders it to `background.tiff` (2026-10-08) |
| `packaging/macos/dmg/background.tiff` | @XusBadia | Rendered from `packaging/macos/dmg/background.svg` by `packaging/macos/dmg/generate.py` | MIT OR Apache-2.0 (`LICENSE-MIT`, `LICENSE-APACHE`) | 1x + 2x HiDPI TIFF for the macOS DMG window; includes the app icon (see its row) and LittleCMS's built-in sRGB profile ("No copyright, use freely") |
+1 -1
View File
@@ -20,7 +20,7 @@ People trust DesignCraft with their layouts; a crash loses their work. **This ou
## Non-negotiables
- **Clean-room.** InDesign is installed on the dev machine and may be *observed* black-box: run it, use its UI with synthetic documents, take screenshots (by window id) stored only under `plan/indesign/screenshots/` (never committed). Never read, disassemble or copy anything inside the InDesign bundle (names/listings only), never copy Adobe icons, artwork, presets or wording beyond feature names, never commit files produced by InDesign. Never copy GPL/AGPL/LGPL code (Scribus, LibreOffice, Ghostscript…).
- **Assets:** no Adobe iconography or images — ever. Every asset is original / OSI / CC0 / redistributable CC (except the ArtCraft trademarks in `docs/brand/`, under `docs/brand/LICENSE-brand.txt`) and has a row in `ASSETS.md` (`cargo xtask assets` enforces it). Prefer art generated in code.
- **Assets:** no Adobe iconography or images — ever. Every asset is original / OSI / CC0 / redistributable CC and has a row in `ASSETS.md` (`cargo xtask assets` enforces it). Prefer art generated in code.
- **Fonts live in [`storytold/craft-fonts`](https://github.com/storytold/craft-fonts)**, never in this repo: don't commit new font files (the Latin UI/document fonts already in `assets/fonts/` stay). It is an optional build input, never a `Cargo.toml` dependency: `CRAFT_FONTS_DIR=/abs/path/to/craft-fonts cargo build` makes `crates/fonts/build.rs` embed its fonts as `designcraft_fonts::CRAFT_FONTS` (Japanese: BIZ UDPGothic for the UI, Mincho first for document text; web builds embed BIZ UDPGothic Regular only). Unset, `CRAFT_FONTS` is empty and the app uses its bundled and system fonts; code and tests must work that way (tests on its glyphs skip). Releases build with it. Standard: [craftrules `standards/fonts.md`](https://github.com/storytold/craftrules/blob/main/standards/fonts.md).
- **Shared test corpora.** Real-file test oracles (Photoshop-authored PSDs, etc.) live in [`storytold/photocraft-corpus`](https://github.com/storytold/photocraft-corpus), explained in [craftrules `standards/test-corpora.md`](https://github.com/storytold/craftrules/blob/main/standards/test-corpora.md). Never commit large binary fixtures to this repo; fetch them pinned by commit and sha256-verified, as PhotoCraft does with `cargo xtask corpus`.
- **Everything is a command.** User-visible behaviour = a command in `crates/engine/src/cmd/*` (id, label, menu path, shortcut, params doc, `enabled`, `run`) + tests. Tools emit commands (Begin/Preview/Commit). UI-only commands live in `crates/ui-egui/src/menus.rs` (`UI_COMMANDS`). The control channel and MCP reach all of them.
Generated
+1398 -48
View File
File diff suppressed because it is too large Load Diff
+3 -3
View File
@@ -4,14 +4,14 @@ members = ["crates/*", "apps/*", "xtask"]
default-members = ["crates/*", "apps/designcraft", "apps/designcraft-cli", "xtask"]
[workspace.package]
version = "0.7.1"
version = "0.7.2"
edition = "2024"
license = "MIT OR Apache-2.0"
rust-version = "1.95"
repository = "https://github.com/storytold/designcraft"
[workspace.dependencies]
craft-print = { git = "https://github.com/storytold/craft-libs", version = "0.1.0", rev = "d991bf6792f8ade99c51358bf3c1d902c8cd96b5" }
craft-print = { git = "https://git.marcospaulo.dev.br/masi/craft-libs", version = "0.1.0", rev = "7fcee66b8eef8eac3c7644fd024e1f1b051f5a3e" }
# internal
designcraft-geom = { path = "crates/geom" }
designcraft-color = { path = "crates/color" }
@@ -69,7 +69,7 @@ zip = { version = "3", default-features = false, features = ["deflate"] }
# ui
# Shared frontend components; keep this dependency above the engine boundary.
craft-ui = { version = "0.1.0", git = "https://github.com/storytold/craft-libs", rev = "5c874d51eeb3de70e735c8ce87a59a7dedd47675", features = ["serde"] }
craft-ui = { version = "0.1.0", git = "https://git.marcospaulo.dev.br/masi/craft-libs", rev = "7fcee66b8eef8eac3c7644fd024e1f1b051f5a3e", features = ["serde"] }
egui = "0.36"
egui_extras = { version = "0.36", default-features = false, features = ["svg"] }
eframe = { version = "0.36", default-features = false }
-4
View File
@@ -3,10 +3,6 @@ Copyright (c) 2026 ArtCraft Team and the DesignCraft contributors.
Licensed under the MIT License or the Apache License, Version 2.0, at your option
(LICENSE-MIT, LICENSE-APACHE).
The ArtCraft name, wordmark and logos in docs/brand/ are trademarks of the ArtCraft Team. They are
not open source and are not covered by the license above; their terms are in
docs/brand/LICENSE-brand.txt.
Third-party material
This product bundles third-party material under its own licenses, listed below. The per-file
+13 -74
View File
@@ -1,13 +1,3 @@
<p align="center">
<a href="https://getartcraft.com/">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="docs/brand/artcraft-logo-white.svg">
<img alt="ArtCraft" src="docs/brand/artcraft-logo.svg" width="200">
</picture>
</a>
</p>
<h1 align="center">DesignCraft</h1>
<p align="center">
@@ -16,8 +6,7 @@
<p align="center">
A fast, open-source, clean-room take on the Adobe InDesign workflow. It runs natively on macOS,
Windows and Linux, and in the browser via WebAssembly.<br>
<i>By the ArtCraft team.</i>
Windows and Linux, and in the browser via WebAssembly.
</p>
<p align="center">
@@ -27,16 +16,6 @@
<img alt="Agent-drivable over MCP" src="https://img.shields.io/badge/agents-MCP-7bb51c?style=flat-square">
</p>
<p align="center">
<a href="https://discord.gg/artcraft"><img alt="Join the ArtCraft community on Discord" src="https://img.shields.io/badge/Join%20us%20on%20Discord-5865F2?style=for-the-badge&logo=discord&logoColor=white" height="40"></a>
</p>
<p align="center">
<a href="https://getartcraft.com/apps/designcraft"><b>DesignCraft on getartcraft.com</b></a> ·
<a href="https://getartcraft.com/">ArtCraft</a> ·
<a href="https://getartcraft.com/apps">All Crafting Apps</a>
</p>
<br>
<p align="center">
@@ -44,10 +23,6 @@
<br><sub><b>Quarterly, Spring Issue</b>: threaded three-column body text, a wrapped pull quote and parent-page folios, all set by DesignCraft's own paragraph composer.</sub>
</p>
> [!NOTE]
> **ArtCraft is a community of artists from all walks of life.** Digital, generative, music,
> games &mdash; if you make things, you're one of us. **[Come say hi on Discord](https://discord.gg/artcraft).**
<p align="center">
<a href="#the-sample-magazine">The sample magazine</a> ·
<a href="#why-designcraft">Why DesignCraft</a> ·
@@ -192,9 +167,7 @@ egui frontend is a separate crate, so the UI can be swapped without touching the
## Downloads
**New to DesignCraft?** Download it from the [DesignCraft page on getartcraft.com](https://getartcraft.com/apps/designcraft). That's the easiest way to install it.
**Want a specific build or format?** On GitHub, the [latest release](https://github.com/storytold/designcraft/releases/latest) has every build listed below, and [all releases](https://github.com/storytold/designcraft/releases) has earlier versions and their notes. `<ver>` in the file names is the version number, and `SHA256SUMS.txt` lists a checksum for every file.
The [latest release](https://github.com/storytold/designcraft/releases/latest) has every build listed below, and [all releases](https://github.com/storytold/designcraft/releases) has earlier versions and their notes. `<ver>` in the file names is the version number, and `SHA256SUMS.txt` lists a checksum for every file.
### Windows
@@ -240,42 +213,20 @@ RISC-V (riscv64): `designcraft-<ver>-linux-riscv64.tar.gz` only, cross-compiled;
## The Crafting Apps
DesignCraft is one of the **Crafting Apps**: free, open-source creative tools from the
[ArtCraft](https://getartcraft.com/) team, each written from scratch in Rust and each able to
[storytold](https://github.com/storytold) team, each written from scratch in Rust and each able to
stand on its own.
| | App | What it's for | Code | Learn more |
|:-:|---|---|---|---|
| <img src="https://raw.githubusercontent.com/storytold/photocraft/main/assets/app-icon/hicolor/64x64/apps/ai.storyteller.photocraft.png" alt="" width="32" height="32"> | **PhotoCraft** | Image editing: layers, masks, type and real PSD files | [GitHub](https://github.com/storytold/photocraft) | [Website](https://getartcraft.com/apps/photocraft) |
| <img src="https://raw.githubusercontent.com/storytold/vectorcraft/main/assets/app-icon/hicolor/64x64/apps/ai.storyteller.vectorcraft.png" alt="" width="32" height="32"> | **VectorCraft** | Vector illustration | [GitHub](https://github.com/storytold/vectorcraft) | [Website](https://getartcraft.com/apps/vectorcraft) |
| <img src="https://raw.githubusercontent.com/storytold/filmcraft/main/assets/app-icon/hicolor/64x64/apps/ai.storyteller.filmcraft.png" alt="" width="32" height="32"> | **FilmCraft** | Video editing, color and sound | [GitHub](https://github.com/storytold/filmcraft) | [Website](https://getartcraft.com/apps/filmcraft) |
| <img src="https://raw.githubusercontent.com/storytold/lightcraft/main/assets/app-icon/hicolor/64x64/apps/ai.storyteller.lightcraft.png" alt="" width="32" height="32"> | **LightCraft** | Photo library and raw development | [GitHub](https://github.com/storytold/lightcraft) | [Website](https://getartcraft.com/apps/lightcraft) |
| <img src="https://raw.githubusercontent.com/storytold/pdfcraft/main/assets/app-icon/hicolor/64x64/apps/ai.storyteller.pdfcraft.png" alt="" width="32" height="32"> | **PdfCraft** | Reading, organizing and protecting PDFs | [GitHub](https://github.com/storytold/pdfcraft) | [Website](https://getartcraft.com/apps/pdfcraft) |
| <img src="https://raw.githubusercontent.com/storytold/effectcraft/main/assets/app-icon/hicolor/64x64/apps/ai.storyteller.effectcraft.png" alt="" width="32" height="32"> | **EffectCraft** | Motion graphics and visual effects | [GitHub](https://github.com/storytold/effectcraft) | [Website](https://getartcraft.com/apps/effectcraft) |
| <img src="https://raw.githubusercontent.com/storytold/designcraft/main/assets/app-icon/hicolor/64x64/apps/ai.storyteller.designcraft.png" alt="" width="32" height="32"> | **DesignCraft** | **Page layout and publishing · you are here** | [GitHub](https://github.com/storytold/designcraft) | [Website](https://getartcraft.com/apps/designcraft) |
| | App | What it's for | Code |
|:-:|---|---|---|
| <img src="https://raw.githubusercontent.com/storytold/photocraft/main/assets/app-icon/hicolor/64x64/apps/ai.storyteller.photocraft.png" alt="" width="32" height="32"> | **PhotoCraft** | Image editing: layers, masks, type and real PSD files | [GitHub](https://github.com/storytold/photocraft) |
| <img src="https://raw.githubusercontent.com/storytold/vectorcraft/main/assets/app-icon/hicolor/64x64/apps/ai.storyteller.vectorcraft.png" alt="" width="32" height="32"> | **VectorCraft** | Vector illustration | [GitHub](https://github.com/storytold/vectorcraft) |
| <img src="https://raw.githubusercontent.com/storytold/filmcraft/main/assets/app-icon/hicolor/64x64/apps/ai.storyteller.filmcraft.png" alt="" width="32" height="32"> | **FilmCraft** | Video editing, color and sound | [GitHub](https://github.com/storytold/filmcraft) |
| <img src="https://raw.githubusercontent.com/storytold/lightcraft/main/assets/app-icon/hicolor/64x64/apps/ai.storyteller.lightcraft.png" alt="" width="32" height="32"> | **LightCraft** | Photo library and raw development | [GitHub](https://github.com/storytold/lightcraft) |
| <img src="https://raw.githubusercontent.com/storytold/pdfcraft/main/assets/app-icon/hicolor/64x64/apps/ai.storyteller.pdfcraft.png" alt="" width="32" height="32"> | **PdfCraft** | Reading, organizing and protecting PDFs | [GitHub](https://github.com/storytold/pdfcraft) |
| <img src="https://raw.githubusercontent.com/storytold/effectcraft/main/assets/app-icon/hicolor/64x64/apps/ai.storyteller.effectcraft.png" alt="" width="32" height="32"> | **EffectCraft** | Motion graphics and visual effects | [GitHub](https://github.com/storytold/effectcraft) |
| <img src="https://raw.githubusercontent.com/storytold/designcraft/main/assets/app-icon/hicolor/64x64/apps/ai.storyteller.designcraft.png" alt="" width="32" height="32"> | **DesignCraft** | **Page layout and publishing · you are here** | [GitHub](https://github.com/storytold/designcraft) |
And [**ArtCraft**](https://getartcraft.com/) itself, our AI image and video studio for artists who want real control.
<br>
<p align="center">
<a href="https://discord.gg/artcraft"><img alt="Join the ArtCraft community on Discord" src="https://img.shields.io/badge/Join%20us%20on%20Discord-5865F2?style=for-the-badge&logo=discord&logoColor=white" height="40"></a>
</p>
<h3 align="center">Come make things with us</h3>
<p align="center">
Our Discord is where artists of every kind hang out: people who paint, shoot, draw, cut film,
set type, and people still figuring out what they like to make. Share what you're working on,
ask for help, tell us what's broken, or tell us what you wish these tools could do.
Whatever your medium and however long you've been at it, you're welcome here.
</p>
<p align="center">
<a href="https://discord.gg/artcraft"><b>discord.gg/artcraft</b></a> ·
<a href="https://getartcraft.com/">getartcraft.com</a> ·
<a href="https://getartcraft.com/apps">The Crafting Apps</a> ·
<a href="https://getartcraft.com/apps/designcraft">DesignCraft</a>
</p>
The Crafting Apps share the same conventions: clean-room and pure Rust, native on macOS, Windows and Linux, in the browser via WebAssembly, and fully drivable by agents.
## License and credits
@@ -288,16 +239,4 @@ with its author, source and license in [ASSETS.md](ASSETS.md).
The bundled fonts, and the craft-fonts fonts embedded by release builds, are under the SIL Open
Font License; all UI icons are drawn in code and are original.
The ArtCraft name, wordmark and logos in [`docs/brand/`](docs/brand/) are trademarks of the
ArtCraft Team and are not covered by this license. They may be used only unmodified, and only as
part of this repository and DesignCraft, under [`docs/brand/LICENSE-brand.txt`](docs/brand/LICENSE-brand.txt).
Forks and modified versions must remove them.
<sub>Adobe, Photoshop, Illustrator, Premiere Pro, Lightroom, Acrobat, After Effects and InDesign are trademarks or registered trademarks of Adobe Inc. in the United States and/or other countries. DesignCraft is an independent, open-source project and is not affiliated with, sponsored by or endorsed by Adobe Inc.; these names are used only to describe the workflows it is compatible with.</sub>
<br>
<p align="center">
<a href="https://getartcraft.com/"><img alt="ArtCraft" src="docs/brand/artcraft-mark.svg" width="28"></a><br>
<sub>Made by the <a href="https://getartcraft.com/">ArtCraft</a> team and community.</sub>
</p>
+3 -8
View File
@@ -13,7 +13,7 @@
//! designcraft-cli perf [--pages N] [--frames N] [--chars N] [--images N] [--runs N] [--strict] # budgets on a synthetic stress document
//! designcraft-cli bench FILE [--runs N] # the same measurements on one document
//! designcraft-cli validate-pdf FILE.pdf # run the built-in PDF/X-4 conformance checks
//! designcraft-cli links # Discord, website, app page and GitHub links
//! designcraft-cli links # GitHub and issue-tracker links
//! designcraft-cli --version # print the version
//! ```
#![deny(clippy::unwrap_used, clippy::expect_used, clippy::panic, clippy::unimplemented, clippy::todo, clippy::unreachable)]
@@ -40,12 +40,7 @@ const USAGE: &str = "usage: designcraft-cli run [--in FILE | --sample] [--cmd ID
/// The links line under the usage block.
fn usage_footer() -> String {
format!(
"\nCommunity: {} · {} · {}",
designcraft_engine::links::DISCORD,
designcraft_engine::links::APP_PAGE,
designcraft_engine::links::GITHUB
)
format!("\nSource: {} · Issues: {}", designcraft_engine::links::GITHUB, designcraft_engine::links::ISSUES)
}
/// stdout went away. A reader that stopped early (a closed pipe) ends the program quietly, as
@@ -88,7 +83,7 @@ fn main() -> ExitCode {
Some("validate-pdf") => report(validate_pdf(args.get(1).map(String::as_str))),
Some("links") => {
use designcraft_engine::links::*;
outln!("Discord {DISCORD}\nWebsite {WEBSITE}\nApp page {APP_PAGE}\nGitHub {GITHUB}\nIssues {ISSUES}");
outln!("GitHub {GITHUB}\nIssues {ISSUES}");
ExitCode::SUCCESS
}
// Asking for help is not an error: it goes to stdout and succeeds. An unknown command
+1 -4
View File
@@ -37,14 +37,12 @@ impl NativeMenu {
let mut counter = 0usize;
// Application menu.
let app_menu = Submenu::new("DesignCraft", true);
// Our own About splash (with the community links) instead of the stock panel.
// Our own About splash instead of the stock panel.
let about = MenuItem::with_id("dc-about", "About DesignCraft", true, None);
let discord = MenuItem::with_id("dc-discord", "Join the ArtCraft Discord…", true, None);
// Not the predefined Quit: it terminates the app at once, past the unsaved-changes prompt.
let quit = MenuItem::with_id("dc-quit", designcraft_ui_egui::i18n::tr(&app.ui.language, "Quit DesignCraft"), true, accel("Cmd+Q"));
let _ = app_menu.append_items(&[
&about,
&discord,
&PredefinedMenuItem::separator(),
&PredefinedMenuItem::services(None),
&PredefinedMenuItem::separator(),
@@ -55,7 +53,6 @@ impl NativeMenu {
&quit,
]);
items.insert("dc-about".into(), ("help.about".into(), serde_json::Value::Null, Handle::Plain(about)));
items.insert("dc-discord".into(), ("help.discord".into(), serde_json::Value::Null, Handle::Plain(discord)));
items.insert("dc-quit".into(), ("app.quit".into(), serde_json::Value::Null, Handle::Plain(quit)));
let _ = menu.append(&app_menu);
for (title, entries) in menus::menu_tree() {
+1 -1
View File
@@ -2,7 +2,7 @@ DesignCraft app icon (designcraft.svg, designcraft-small.svg and every file deri
this directory: designcraft-1024.png, designcraft-macos-512.png, designcraft.icns, designcraft.ico,
hicolor/).
Original artwork made for this project by the project owner in ArtCraft, then vectorised. No
Original artwork made for this project by the project owner, then vectorised. No
third-party material. Licensed like the rest of DesignCraft, under either of
* Apache License, Version 2.0 (https://www.apache.org/licenses/LICENSE-2.0)
+1 -1
View File
@@ -22,7 +22,7 @@ transparent margin.
## Provenance
The owner drew the cat in ArtCraft. The 2880 px drawing, keyed to the three-colour palette, lives
The owner drew the cat by hand. The 2880 px drawing, keyed to the three-colour palette, lives
outside this repo in craftrules at `assets/app-icons/designcraft/source.png`. It was vectorised with
craftrules' `assets/logo-options/_tools/vectorize_tile.py`: `designcraft.svg` is traced at 2048 px and
`designcraft-small.svg` at 1024 px. Design rules: craftrules `standards/icon-design.md`.
+1 -1
View File
@@ -10,7 +10,7 @@ pub fn specs() -> Vec<CommandSpec> {
vec![
cmd!(query "document.inspect", "Inspect Document", [], None, "{} → pages, spreads, items, stories (with overset), styles, swatches, selection", has_doc, inspect),
cmd!(query "app.links", "Community & Project Links", [], None,
"{} → {discord, website, appPage, github, issues} (ArtCraft Discord, website, DesignCraft page and repository)", always, |_, _| Ok(crate::links::all())),
"{} → {github, issues} (DesignCraft repository and issue tracker)", always, |_, _| Ok(crate::links::all())),
cmd!(query "document.list", "List Documents", [], None, "{}", always, |s, _| {
Ok(json!(s.documents().iter().enumerate().map(|(i, d)| json!({"index": i, "title": d.title(), "dirty": d.is_dirty(), "active": Some(i) == s.active_index()})).collect::<Vec<_>>()))
}),
+4 -17
View File
@@ -1,15 +1,9 @@
//! ArtCraft community and project links (Help menu, About, start screen, CLI, MCP).
//! Project links (Help menu, About, CLI, MCP).
use serde_json::{Value, json};
/// The app's slug on getartcraft.com and GitHub.
/// The app's slug on GitHub.
pub const APP: &str = "designcraft";
/// The ArtCraft community Discord.
pub const DISCORD: &str = "https://discord.gg/artcraft";
/// The ArtCraft website.
pub const WEBSITE: &str = "https://getartcraft.com";
/// DesignCraft's page on the ArtCraft website.
pub const APP_PAGE: &str = "https://getartcraft.com/apps/designcraft";
/// DesignCraft's source repository.
pub const GITHUB: &str = "https://github.com/storytold/designcraft";
/// Where to report bugs and request features.
@@ -18,20 +12,14 @@ pub const ISSUES: &str = "https://github.com/storytold/designcraft/issues";
/// All links as JSON (the `app.links` command).
pub fn all() -> Value {
json!({
"discord": DISCORD,
"website": WEBSITE,
"appPage": APP_PAGE,
"github": GITHUB,
"issues": ISSUES,
})
}
/// A link by key (`discord`, `website`, `appPage`, `github`, `issues`).
/// A link by key (`github`, `issues`).
pub fn get(key: &str) -> Option<&'static str> {
Some(match key {
"discord" => DISCORD,
"website" => WEBSITE,
"appPage" => APP_PAGE,
"github" => GITHUB,
"issues" => ISSUES,
_ => return None,
@@ -44,10 +32,9 @@ mod tests {
#[test]
fn links_follow_the_app_slug() {
assert!(APP_PAGE.ends_with(&format!("/apps/{APP}")));
assert!(GITHUB.ends_with(&format!("/storytold/{APP}")));
assert!(ISSUES.starts_with(GITHUB));
for k in ["discord", "website", "appPage", "github", "issues"] {
for k in ["github", "issues"] {
assert!(get(k).is_some_and(|u| u.starts_with("https://")), "{k}");
assert_eq!(all()[k], get(k).unwrap());
}
+4 -5
View File
@@ -134,13 +134,12 @@ impl Server {
Ok(json!({
"protocolVersion": version,
"capabilities": {"tools": {}, "resources": {}},
"serverInfo": {"name": "designcraft", "title": "DesignCraft", "version": env!("CARGO_PKG_VERSION"), "websiteUrl": designcraft_engine::links::APP_PAGE},
"serverInfo": {"name": "designcraft", "title": "DesignCraft", "version": env!("CARGO_PKG_VERSION"), "websiteUrl": designcraft_engine::links::GITHUB},
"instructions": format!(
"{INSTRUCTIONS} Backend: {}. Community: {} (Discord), {} (app page), {} (source). The `app.links` command returns these links.",
"{INSTRUCTIONS} Backend: {}. Source: {}, issues: {}. The `app.links` command returns these links.",
self.backend.describe(),
designcraft_engine::links::DISCORD,
designcraft_engine::links::APP_PAGE,
designcraft_engine::links::GITHUB
designcraft_engine::links::GITHUB,
designcraft_engine::links::ISSUES
),
}))
}
+4 -133
View File
@@ -1,98 +1,16 @@
//! Help › About DesignCraft: tabs About · Contributors · Models. About is the splash with the
//! ArtCraft mark, version, and community links (Discord first and largest), plus the other ArtCraft
//! apps; Contributors and Models are the compiled-in credits (`crate::credits`).
//! version and project links; Contributors and Models are the compiled-in credits (`crate::credits`).
use designcraft_engine::links;
use egui::{Color32, Rect, Sense, Stroke, pos2, vec2};
use egui::{Color32, Sense, vec2};
use serde_json::json;
use crate::DesignApp;
use crate::theme::{Tokens, semibold};
/// ArtCraft brand blue (from `docs/brand/artcraft-mark.svg`).
pub const BRAND: Color32 = Color32::from_rgb(0x4e, 0x7b, 0xfb);
/// Discord's brand colour, used for the "Join our Discord" buttons (colour only; no Discord artwork).
pub const DISCORD: Color32 = Color32::from_rgb(0x58, 0x65, 0xf2);
/// The ArtCraft mark outline (viewBox -10 -19.42 136.34 136.34), from `docs/brand/artcraft-mark.svg`.
const MARK_PATH: &str = "M104.28,49.49L81.55,0h-31.23l-3.17,4.76L14.75,53.63,0,75.85l21.55,21.55,63.79-36.94,16.99,37.04,14.01-21.74-12.06-26.27ZM32.89,65.66l32.42-48.87,10.91,23.77-43.32,25.09Z";
/// The other ArtCraft apps (app-page slug, name, what it is) — same list as the README.
pub const SIBLINGS: &[(&str, &str, &str)] = &[
("photocraft", "PhotoCraft", "image editing"),
("vectorcraft", "VectorCraft", "vector illustration"),
("filmcraft", "FilmCraft", "video editing, color and sound"),
("lightcraft", "LightCraft", "photo library and raw development"),
("pdfcraft", "PdfCraft", "reading, organizing and protecting PDFs"),
("effectcraft", "EffectCraft", "motion graphics and visual effects"),
];
/// The About window's tabs, in `UiState::about_tab` order (`help.about {tab}` names them in lowercase).
pub const ABOUT_TABS: [&str; 3] = ["About", "Contributors", "Models"];
/// Paint the ArtCraft mark into `rect` (square), rasterised once per size and cached.
pub fn paint_mark(ui: &egui::Ui, rect: Rect, color: Color32) {
use designcraft_render::vello_cpu::{self, kurbo, peniko};
let ctx = ui.ctx();
let ppp = ctx.pixels_per_point();
let px = ((rect.width().min(rect.height()) * ppp).round() as u32).clamp(8, 1024);
let key = egui::Id::new(("artcraft_mark", px, color.to_array()));
let tex: Option<egui::TextureHandle> = ctx.data(|d| d.get_temp(key));
let tex = tex.unwrap_or_else(|| {
let mut rc = vello_cpu::RenderContext::new_with(px as u16, px as u16, vello_cpu::RenderSettings { num_threads: 0, ..Default::default() });
let k = px as f64 / 136.34;
rc.set_transform(kurbo::Affine::scale(k) * kurbo::Affine::translate((10.0, 19.42)));
let [r, g, b, a] = color.to_srgba_unmultiplied();
rc.set_paint(peniko::Color::from_rgba8(r, g, b, a));
if let Ok(p) = kurbo::BezPath::from_svg(MARK_PATH) {
rc.fill_path(&p);
}
rc.flush();
let mut pm = vello_cpu::Pixmap::new(px as u16, px as u16);
let mut res = vello_cpu::Resources::new();
rc.render(&mut pm, &mut res);
let ci = egui::ColorImage::from_rgba_premultiplied([px as usize, px as usize], pm.data_as_u8_slice());
let t = ctx.load_texture("artcraft_mark", ci, egui::TextureOptions::LINEAR);
ctx.data_mut(|d| d.insert_temp(key, t.clone()));
t
});
let side = rect.width().min(rect.height());
let r = Rect::from_center_size(rect.center(), vec2(side, side));
ui.painter().image(tex.id(), r, Rect::from_min_max(pos2(0.0, 0.0), pos2(1.0, 1.0)), Color32::WHITE);
}
/// A speech-bubble glyph (drawn in code) for Discord buttons.
pub fn paint_chat_icon(p: &egui::Painter, c: egui::Pos2, s: f32, color: Color32) {
let body = Rect::from_center_size(c - vec2(0.0, s * 0.06), vec2(s, s * 0.72));
p.rect_filled(body, s * 0.24, color);
let tail = vec![
pos2(body.left() + s * 0.22, body.bottom() - 1.0),
pos2(body.left() + s * 0.12, body.bottom() + s * 0.24),
pos2(body.left() + s * 0.44, body.bottom() - 1.0),
];
p.add(egui::Shape::convex_polygon(tail, color, Stroke::NONE));
let eye = s * 0.09;
let bg = if color.r() as u32 + color.g() as u32 + color.b() as u32 > 380 { DISCORD } else { Color32::WHITE };
p.circle_filled(body.center() - vec2(s * 0.18, 0.0), eye, bg);
p.circle_filled(body.center() + vec2(s * 0.18, 0.0), eye, bg);
}
/// The big "Join our Discord" button. Returns true when clicked.
pub fn discord_button(ui: &mut egui::Ui, label: &str, size: egui::Vec2) -> bool {
let (r, resp) = ui.allocate_exact_size(size, Sense::click());
let resp = resp.on_hover_text(links::DISCORD).on_hover_cursor(egui::CursorIcon::PointingHand);
let fill = if resp.hovered() { Color32::from_rgb(0x47, 0x52, 0xc4) } else { DISCORD };
ui.painter().rect_filled(r, size.y / 2.0, fill);
let icon = size.y * 0.5;
let font = semibold((size.y * 0.42).max(11.0));
let galley = crate::rtl::plain(ui.ctx(), label, font, Color32::WHITE);
let total = icon + 8.0 + galley.size().x;
let x0 = r.center().x - total / 2.0;
paint_chat_icon(ui.painter(), pos2(x0 + icon / 2.0, r.center().y), icon, Color32::WHITE);
ui.painter().galley(pos2(x0 + icon + 8.0, r.center().y - galley.size().y / 2.0), galley, Color32::WHITE);
resp.clicked()
}
/// A text link that opens `url`. Returns true when clicked.
fn link(ui: &mut egui::Ui, text: &str, url: &str, color: Color32) -> bool {
let resp = ui.add(egui::Label::new(egui::RichText::new(text).size(13.0).color(color).underline()).sense(Sense::click()));
@@ -137,9 +55,6 @@ pub fn show(app: &mut DesignApp, ctx: &egui::Context) {
}
ui.vertical_centered(|ui| {
ui.add_space(8.0);
let (r, _) = ui.allocate_exact_size(vec2(72.0, 72.0), Sense::hover());
paint_mark(ui, r, BRAND);
ui.add_space(6.0);
ui.label(crate::rtl::widget(
ui,
egui::RichText::new(crate::i18n::tr(&app.ui.language, "DesignCraft")).font(semibold(26.0)).color(t.text_strong),
@@ -157,62 +72,18 @@ pub fn show(app: &mut DesignApp, ctx: &egui::Context) {
.size(13.0)
.color(t.text),
));
ui.label(crate::rtl::widget(
ui,
egui::RichText::new(crate::i18n::tr(&app.ui.language, "Part of the ArtCraft suite of open creative tools."))
.size(12.0)
.color(t.text_dim),
));
ui.add_space(16.0);
if discord_button(ui, "Join the ArtCraft Discord", vec2(300.0, 40.0)) {
open = Some("discord");
}
ui.add_space(4.0);
ui.label(crate::rtl::widget(
ui,
egui::RichText::new(crate::i18n::tr(&app.ui.language, "discord.gg/artcraft — help, feedback and show-and-tell"))
.size(11.0)
.color(t.text_dim),
));
ui.add_space(14.0);
ui.horizontal(|ui| {
// Centre the row of links.
let w = 330.0;
let w = 190.0;
ui.add_space(((ui.available_width() - w) / 2.0).max(0.0));
for (text, key) in
[("DesignCraft page", "appPage"), ("GitHub", "github"), ("getartcraft.com", "website"), ("Report an issue", "issues")]
{
for (text, key) in [("GitHub", "github"), ("Report an issue", "issues")] {
if link(ui, text, links::get(key).unwrap_or_default(), t.accent) {
open = Some(key);
}
ui.add_space(6.0);
}
});
ui.add_space(16.0);
ui.separator();
ui.add_space(6.0);
ui.label(crate::rtl::widget(
ui,
egui::RichText::new(crate::i18n::tr(&app.ui.language, "More ArtCraft apps")).font(semibold(12.0)).color(t.text_strong),
));
ui.add_space(4.0);
ui.horizontal(|ui| {
let pad = ui.spacing().button_padding.x * 2.0 + ui.spacing().item_spacing.x;
let w: f32 = SIBLINGS
.iter()
.map(|(_, n, _)| ui.painter().layout_no_wrap(n.to_string(), egui::FontId::proportional(12.0), Color32::WHITE).size().x + pad)
.sum::<f32>()
- ui.spacing().item_spacing.x;
ui.add_space(((ui.available_width() - w) / 2.0).max(0.0));
for (slug, name, what) in SIBLINGS {
let url = format!("{}/apps/{slug}", links::WEBSITE);
let b =
ui.add(egui::Button::new(egui::RichText::new(*name).size(12.0)).corner_radius(10.0)).on_hover_text(format!("{what} — {url}"));
if b.clicked() {
app.ui.pending_urls.push(url);
}
}
});
ui.add_space(12.0);
ui.label(crate::rtl::widget(
ui,
-51
View File
@@ -123,11 +123,6 @@ pub fn app_bar(app: &mut DesignApp, ui: &mut egui::Ui) {
if icons::button(ui, "share", 22.0, false, crate::i18n::tr(&app.ui.language, "Share")).clicked() {
app.status("Export a PDF, IDML or package to share — no cloud account needed.");
}
ui.add_space(8.0);
// Always one click away: the ArtCraft community Discord.
if crate::about::discord_button(ui, "Discord", vec2(78.0, 22.0)) {
let _ = app.run("help.discord", json!({}));
}
tools_start = ui.min_rect().min.x;
ui.min_rect().width()
});
@@ -684,8 +679,6 @@ pub fn start_screen(app: &mut DesignApp, ui: &mut egui::Ui) {
let _ = app.run("file.newSample", json!({}));
}
});
ui.add_space(20.0);
community_card(app, ui);
ui.add_space(24.0);
ui.label(crate::rtl::widget(
ui,
@@ -718,50 +711,6 @@ pub fn start_screen(app: &mut DesignApp, ui: &mut egui::Ui) {
let _ = Content::Unassigned;
}
/// Start screen: the ArtCraft community (Discord first) and project links.
fn community_card(app: &mut DesignApp, ui: &mut egui::Ui) {
let t = Tokens::get(ui.ctx());
egui::Frame::NONE.fill(t.panel).corner_radius(10.0).inner_margin(egui::Margin::same(14)).show(ui, |ui| {
ui.set_max_width(640.0);
ui.horizontal(|ui| {
let (r, _) = ui.allocate_exact_size(vec2(44.0, 44.0), Sense::hover());
crate::about::paint_mark(ui, r, crate::about::BRAND);
ui.add_space(8.0);
ui.vertical(|ui| {
ui.label(crate::rtl::widget(
ui,
egui::RichText::new(crate::i18n::tr(&app.ui.language, "Join the ArtCraft community")).font(semibold(14.0)).color(t.text_strong),
));
ui.label(crate::rtl::widget(
ui,
egui::RichText::new(crate::i18n::tr(&app.ui.language, "Get help, share your layouts and shape what we build next."))
.size(12.0)
.color(t.text_dim),
));
ui.add_space(4.0);
ui.horizontal(|ui| {
for (text, id) in [("DesignCraft page", "help.appPage"), ("GitHub", "help.github"), ("getartcraft.com", "help.website")] {
let url = designcraft_engine::links::get(&id[5..]).unwrap_or_default();
let l = ui
.add(egui::Label::new(egui::RichText::new(text).size(12.0).color(t.accent).underline()).sense(Sense::click()))
.on_hover_text(url)
.on_hover_cursor(egui::CursorIcon::PointingHand);
if l.clicked() {
let _ = app.run(id, json!({}));
}
ui.add_space(8.0);
}
});
});
ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| {
if crate::about::discord_button(ui, crate::i18n::tr(&app.ui.language, "Join our Discord"), vec2(190.0, 38.0)) {
let _ = app.run("help.discord", json!({}));
}
});
});
});
}
#[cfg(test)]
mod tests {
use egui::{pos2, vec2};
-44
View File
@@ -744,8 +744,6 @@ const TABLE: &[(&str, [&str; 5])] = &[
"Apply Parent to Pages…",
["Apply Parent to Pages…", "Apply Parent to Pages…", "Apply Parent to Pages…", "Apply Parent to Pages…", "将主页应用于页面…"],
),
("ArtCraft App Page…", ["ArtCraft App Page…", "ArtCraft App Page…", "ArtCraft App Page…", "ArtCraft App Page…", "ArtCraft 应用页面…"]),
("ArtCraft Website…", ["ArtCraft Website…", "ArtCraft Website…", "ArtCraft Website…", "ArtCraft Website…", "ArtCraft 网站…"]),
("Attributes", ["Attributes", "Attributes", "Attributes", "Attributes", "属性"]),
("Bevel and Emboss", ["Bevel and Emboss", "Bevel and Emboss", "Bevel and Emboss", "Bevel and Emboss", "斜面和浮雕"]),
("Buttons", ["Buttons", "Buttons", "Buttons", "Buttons", "按钮"]),
@@ -1021,16 +1019,6 @@ const TABLE: &[(&str, [&str; 5])] = &[
("Insert Variable", ["Insert Variable", "Insert Variable", "Insert Variable", "Insert Variable", "插入变量"]),
("Inspect Document", ["Inspect Document", "Inspect Document", "Inspect Document", "Inspect Document", "检查文档"]),
("Interface Color Theme", ["Interface Color Theme", "Interface Color Theme", "Interface Color Theme", "Interface Color Theme", "界面颜色主题"]),
(
"Join the ArtCraft Discord…",
[
"Join the ArtCraft Discord…",
"Join the ArtCraft Discord…",
"Join the ArtCraft Discord…",
"Join the ArtCraft Discord…",
"加入 ArtCraft Discord…",
],
),
("Last Object Below", ["Last Object Below", "Last Object Below", "Last Object Below", "Last Object Below", "下方最后一个对象"]),
("Library Contents", ["Library Contents", "Library Contents", "Library Contents", "Library Contents", "库内容"]),
("Library Items", ["Library Items", "Library Items", "Library Items", "Library Items", "库项目"]),
@@ -1557,20 +1545,9 @@ const TABLE: &[(&str, [&str; 5])] = &[
("Hyphens and Dashes", ["Hyphens and Dashes", "Hyphens and Dashes", "Hyphens and Dashes", "Hyphens and Dashes", "连字符和破折号"]),
("Interactive", ["Interactive", "Interactive", "Interactive", "Interactive", "交互式"]),
("Invert", ["Invert", "Invert", "Invert", "Invert", "反相"]),
(
"Join the ArtCraft community",
[
"Join the ArtCraft community",
"Join the ArtCraft community",
"Join the ArtCraft community",
"Join the ArtCraft community",
"加入 ArtCraft 社区",
],
),
("Keyboard Increments", ["Keyboard Increments", "Keyboard Increments", "Keyboard Increments", "Keyboard Increments", "键盘增量"]),
("Liquid guides", ["Liquid guides", "Liquid guides", "Liquid guides", "Liquid guides", "自适应参考线"]),
("Markers", ["Markers", "Markers", "Markers", "Markers", "标记"]),
("More ArtCraft apps", ["More ArtCraft apps", "More ArtCraft apps", "More ArtCraft apps", "More ArtCraft apps", "更多 ArtCraft 应用"]),
("Nested Line Styles", ["Nested Line Styles", "Nested Line Styles", "Nested Line Styles", "Nested Line Styles", "嵌套行样式"]),
("Nested Styles", ["Nested Styles", "Nested Styles", "Nested Styles", "Nested Styles", "嵌套样式"]),
(
@@ -1689,16 +1666,6 @@ const TABLE: &[(&str, [&str; 5])] = &[
],
),
("Page · PPI", ["Page · PPI", "Page · PPI", "Page · PPI", "Page · PPI", "页面 · PPI"]),
(
"Part of the ArtCraft suite of open creative tools.",
[
"Part of the ArtCraft suite of open creative tools.",
"Part of the ArtCraft suite of open creative tools.",
"Part of the ArtCraft suite of open creative tools.",
"Part of the ArtCraft suite of open creative tools.",
"ArtCraft 开源创意工具套件的一部分。",
],
),
("Pasteboard Options", ["Pasteboard Options", "Pasteboard Options", "Pasteboard Options", "Pasteboard Options", "粘贴板选项"]),
("Paths", ["Paths", "Paths", "Paths", "Paths", "路径"]),
(
@@ -1873,16 +1840,6 @@ const TABLE: &[(&str, [&str; 5])] = &[
"[无] — 在色带上选择一种颜色。",
],
),
(
"discord.gg/artcraft — help, feedback and show-and-tell",
[
"discord.gg/artcraft — help, feedback and show-and-tell",
"discord.gg/artcraft — help, feedback and show-and-tell",
"discord.gg/artcraft — help, feedback and show-and-tell",
"discord.gg/artcraft — help, feedback and show-and-tell",
"discord.gg/artcraft — 帮助、反馈和展示",
],
),
(
"⌥-click clears overrides",
["⌥-click clears overrides", "⌥-click clears overrides", "⌥-click clears overrides", "⌥-click clears overrides", "⌥-单击清除覆盖"],
@@ -2608,7 +2565,6 @@ const TABLE: &[(&str, [&str; 5])] = &[
("H&J Violations", ["H&J Violations", "H&J Violations", "H&J Violations", "H&J Violations", "断字与对齐违规"]),
("Include Bleed", ["Include Bleed", "Include Bleed", "Include Bleed", "Include Bleed", "包含出血"]),
("Include Stroke Weight", ["Include Stroke Weight", "Include Stroke Weight", "Include Stroke Weight", "Include Stroke Weight", "包含描边粗细"]),
("Join our Discord", ["Join our Discord", "Join our Discord", "Join our Discord", "Join our Discord", "加入我们的 Discord 社区"]),
("Keep Violations", ["Keep Violations", "Keep Violations", "Keep Violations", "Keep Violations", "保持选项违规"]),
(
"Overprint [Black] Swatch at 100%",
-8
View File
@@ -157,12 +157,9 @@ pub(super) const TABLE: &[(&str, &str)] = &[
(" Open sample magazine ", " فتح نموذج المجلة "),
("Start a new document", "بدء مستند جديد"),
("No document open", "لا يوجد مستند مفتوح"),
("Join the ArtCraft community", "انضم إلى مجتمع ArtCraft"),
("Get help, share your layouts and shape what we build next.", "احصل على المساعدة وشارك تصميماتك وساهم في تطوير التطبيق."),
("Join our Discord", "انضم إلى Discord"),
("Community", "المجتمع"),
("Join the community", "انضم إلى المجتمع"),
("discord.gg/artcraft — help, feedback and show-and-tell", "discord.gg/artcraft — مساعدة وآراء وعرض الأعمال"),
(" OK ", " موافق "),
("Float panel", "تعويم اللوحة"),
("Dock panel", "إرساء اللوحة"),
@@ -896,7 +893,6 @@ pub(super) const TABLE: &[(&str, &str)] = &[
("Merge into Active Layer", "دمج في الطبقة النشطة"),
("Misspelled word → Correction (one per line):", "كلمة خاطئة ← تصحيح (واحد في كل سطر):"),
("Mobile", "جوال"),
("More ArtCraft apps", "المزيد من تطبيقات ArtCraft"),
("Move Selection Here", "نقل التحديد إلى هنا"),
("Move to Color Group", "نقل إلى مجموعة ألوان"),
("Move to Group", "نقل إلى مجموعة"),
@@ -935,7 +931,6 @@ pub(super) const TABLE: &[(&str, &str)] = &[
("Page Numbering", "ترقيم الصفحات"),
("Page · PPI", "صفحة · PPI"),
("Pages:", "الصفحات:"),
("Part of the ArtCraft suite of open creative tools.", "جزء من مجموعة ArtCraft للأدوات الإبداعية المفتوحة."),
("Pasteboard Options", "خيارات مساحة اللصق"),
("Path", "مسار"),
("Place the insertion point in a table, or create one.", "ضع نقطة الإدراج داخل جدول أو أنشئ جدولًا."),
@@ -1111,8 +1106,6 @@ pub(super) const TABLE: &[(&str, &str)] = &[
("Apply Cell Style", "تطبيق نمط الخلية"),
("Apply Condition", "تطبيق شرط"),
("Apply Parent to Pages…", "تطبيق الصفحة الأصلية على الصفحات…"),
("ArtCraft App Page…", "صفحة تطبيق ArtCraft…"),
("ArtCraft Website…", "موقع ArtCraft…"),
("Attributes", "السمات"),
("Bevel and Emboss", "القطع المشطوف والنقش البارز"),
("Buttons", "أزرار"),
@@ -1214,7 +1207,6 @@ pub(super) const TABLE: &[(&str, &str)] = &[
("Insert Variable", "إدراج متغير"),
("Inspect Document", "فحص المستند"),
("Interface Color Theme", "نسق ألوان الواجهة"),
("Join the ArtCraft Discord…", "الانضمام إلى Discord الخاص بـ ArtCraft…"),
("Last Object Below", "آخر كائن أسفل"),
("Library Contents", "محتويات المكتبة"),
("Library Items", "عناصر المكتبة"),
-8
View File
@@ -414,8 +414,6 @@ pub(super) const TABLE: &[(&str, &str)] = &[
("Apply Color", "Applica colore"),
("Apply Condition", "Applica condizione"),
("Apply Parent to Pages…", "Applica pagina mastro alle pagine…"),
("ArtCraft App Page…", "Pagina dell'app ArtCraft…"),
("ArtCraft Website…", "Sito web di ArtCraft…"),
("Attributes", "Attributi"),
("Bevel and Emboss", "Smusso e rilievo"),
("Buttons", "Pulsanti"),
@@ -542,7 +540,6 @@ pub(super) const TABLE: &[(&str, &str)] = &[
("Insert Variable", "Inserisci variabile"),
("Inspect Document", "Ispeziona documento"),
("Interface Color Theme", "Tema colore dell'interfaccia"),
("Join the ArtCraft Discord…", "Unisciti al Discord di ArtCraft…"),
("Last Object Below", "Ultimo oggetto sotto"),
("Library Contents", "Contenuto libreria"),
("Library Items", "Elementi libreria"),
@@ -847,11 +844,9 @@ pub(super) const TABLE: &[(&str, &str)] = &[
("Hyphens and Dashes", "Trattini e lineette"),
("Interactive", "Interattivo"),
("Invert", "Inverti"),
("Join the ArtCraft community", "Unisciti alla community ArtCraft"),
("Keyboard Increments", "Incrementi da tastiera"),
("Liquid guides", "Guide liquide"),
("Markers", "Indicatori"),
("More ArtCraft apps", "Altre app ArtCraft"),
("Nested Line Styles", "Stili di riga nidificati"),
("Nested Styles", "Stili nidificati"),
("No articles: exports follow page order.", "Nessun articolo: le esportazioni seguono l'ordine delle pagine."),
@@ -886,7 +881,6 @@ pub(super) const TABLE: &[(&str, &str)] = &[
"Impaginazione per la stampa e lo schermo — veloce, aperta e automatizzabile con script.",
),
("Page · PPI", "Pagina · PPI"),
("Part of the ArtCraft suite of open creative tools.", "Parte della suite ArtCraft di strumenti creativi aperti."),
("Pasteboard Options", "Opzioni tavolo di montaggio"),
("Paths", "Tracciati"),
("Place the insertion point in a table, or create one.", "Posiziona il punto di inserimento in una tabella o creane una."),
@@ -938,7 +932,6 @@ pub(super) const TABLE: &[(&str, &str)] = &[
("[No Group]", "[Nessun gruppo]"),
("[None]", "[Nessuno]"),
("[None] — choose a colour on the ramp.", "[Nessuno] — scegli un colore sulla barra dei colori."),
("discord.gg/artcraft — help, feedback and show-and-tell", "discord.gg/artcraft — aiuto, feedback e condivisione dei lavori"),
("⌥-click clears overrides", "⌥-clic cancella le modifiche locali"),
("⚠ out of date", "⚠ non aggiornato"),
("General", "Generale"),
@@ -1339,7 +1332,6 @@ pub(super) const TABLE: &[(&str, &str)] = &[
("H&J Violations", "Violazioni di sillabazione e giustificazione"),
("Include Bleed", "Includi pagina al vivo"),
("Include Stroke Weight", "Includi spessore traccia"),
("Join our Discord", "Unisciti al nostro Discord"),
("Keep Violations", "Violazioni opzioni di mantenimento"),
("Overprint [Black] Swatch at 100%", "Sovrastampa campione [Nero] al 100%"),
("Printer's Marks", "Segni di stampa"),
-11
View File
@@ -416,8 +416,6 @@ pub(super) const TABLE: &[(&str, &str)] = &[
("Apply Color", "カラーを適用"),
("Apply Condition", "条件を適用"),
("Apply Parent to Pages…", "ページに親ページを適用…"),
("ArtCraft App Page…", "ArtCraft アプリページ…"),
("ArtCraft Website…", "ArtCraft ウェブサイト…"),
("Attributes", "属性"),
("Bevel and Emboss", "ベベルとエンボス"),
("Buttons", "ボタン"),
@@ -544,7 +542,6 @@ pub(super) const TABLE: &[(&str, &str)] = &[
("Insert Variable", "変数を挿入"),
("Inspect Document", "ドキュメントを調査"),
("Interface Color Theme", "インターフェイスのカラーテーマ"),
("Join the ArtCraft Discord…", "ArtCraft の Discord に参加…"),
("Last Object Below", "最背面のオブジェクト"),
("Library Contents", "ライブラリの内容"),
("Library Items", "ライブラリの項目"),
@@ -846,11 +843,9 @@ pub(super) const TABLE: &[(&str, &str)] = &[
("Hyphens and Dashes", "ハイフンとダッシュ"),
("Interactive", "インタラクティブ"),
("Invert", "反転"),
("Join the ArtCraft community", "ArtCraft コミュニティに参加"),
("Keyboard Increments", "キーボードの移動量"),
("Liquid guides", "リキッドガイド"),
("Markers", "マーカー"),
("More ArtCraft apps", "他の ArtCraft アプリ"),
("Nested Line Styles", "入れ子行スタイル"),
("Nested Styles", "入れ子スタイル"),
("No articles: exports follow page order.", "アーティクルがありません。ページ順に書き出します。"),
@@ -885,7 +880,6 @@ pub(super) const TABLE: &[(&str, &str)] = &[
"印刷・画面向けの高速なページレイアウトツールです。オープンで、スクリプトにも対応します。",
),
("Page · PPI", "ページ・PPI"),
("Part of the ArtCraft suite of open creative tools.", "オープンな制作ツール群 ArtCraft の一部です。"),
("Pasteboard Options", "ペーストボードのオプション"),
("Paths", "パス"),
("Place the insertion point in a table, or create one.", "表内に挿入位置を置くか、表を作成してください。"),
@@ -937,7 +931,6 @@ pub(super) const TABLE: &[(&str, &str)] = &[
("[No Group]", "[グループなし]"),
("[None]", "[なし]"),
("[None] — choose a colour on the ramp.", "[なし] — カラーバーでカラーを選択してください。"),
("discord.gg/artcraft — help, feedback and show-and-tell", "discord.gg/artcraft — サポート・ご意見・作品紹介"),
("⌥-click clears overrides", "⌥ を押しながらクリックするとオーバーライドを消去します"),
("⚠ out of date", "⚠ 要更新"),
("General", "一般"),
@@ -1335,7 +1328,6 @@ pub(super) const TABLE: &[(&str, &str)] = &[
("H&J Violations", "H&J の制約違反"),
("Include Bleed", "裁ち落としを含める"),
("Include Stroke Weight", "線の太さを含める"),
("Join our Discord", "Discord に参加"),
("Keep Violations", "段落保持の制約違反"),
("Overprint [Black] Swatch at 100%", "100% の「黒」スウォッチをオーバープリント"),
("Printer's Marks", "プリント用マーク"),
@@ -1460,8 +1452,6 @@ pub(super) const TABLE: &[(&str, &str)] = &[
// few field labels.
("Anchored Object Options", "アンカー付きオブジェクトのオプション"),
("Apply Parent to Pages", "ページに親ページを適用"),
("ArtCraft App Page", "ArtCraft アプリページ"),
("ArtCraft Website", "ArtCraft ウェブサイト"),
("Check Spelling", "スペルチェック"),
("Corner Options", "角のオプション"),
("Create Guides", "ガイドを作成"),
@@ -1490,7 +1480,6 @@ pub(super) const TABLE: &[(&str, &str)] = &[
("Insert Cross-Reference", "相互参照を挿入"),
("Insert Math Expression", "数式を挿入"),
("Insert Pages", "ページを挿入"),
("Join the ArtCraft Discord", "ArtCraft の Discord に参加"),
("Load DTD", "DTD を読み込み"),
("Load Swatches", "スウォッチを読み込み"),
("Margins and Columns", "マージン・段組"),
-5
View File
@@ -157,15 +157,12 @@ pub(super) const TABLE: &[(&str, &str)] = &[
(" Open sample magazine ", " Abrir revista de exemplo "),
("Start a new document", "Iniciar um novo documento"),
("No document open", "Nenhum documento aberto"),
("Join the ArtCraft community", "Junte-se à comunidade ArtCraft"),
(
"Get help, share your layouts and shape what we build next.",
"Obtenha ajuda, compartilhe seus layouts e ajude a moldar o que construímos em seguida.",
),
("Join our Discord", "Junte-se ao nosso Discord"),
("Community", "Comunidade"),
("Join the community", "Junte-se à comunidade"),
("discord.gg/artcraft — help, feedback and show-and-tell", "discord.gg/artcraft — ajuda, feedback e demonstrações"),
(" OK ", " OK "),
("Float panel", "Painel flutuante"),
("Dock panel", "Painel encaixado"),
@@ -898,7 +895,6 @@ pub(super) const TABLE: &[(&str, &str)] = &[
("Merge into Active Layer", "Mesclar na camada ativa"),
("Misspelled word → Correction (one per line):", "Palavra incorreta → Correção (uma por linha):"),
("Mobile", "Dispositivo móvel"),
("More ArtCraft apps", "Mais aplicativos ArtCraft"),
("Move Selection Here", "Mover a seleção para cá"),
("Move to Color Group", "Mover para grupo de cores"),
("Move to Group", "Mover para grupo"),
@@ -943,7 +939,6 @@ pub(super) const TABLE: &[(&str, &str)] = &[
("Page Numbering", "Numeração de página"),
("Page · PPI", "Página · PPI"),
("Pages:", "Páginas:"),
("Part of the ArtCraft suite of open creative tools.", "Parte do conjunto ArtCraft de ferramentas criativas abertas."),
("Pasteboard Options", "Opções da área de transferência"),
("Path", "Caminho"),
("Place the insertion point in a table, or create one.", "Coloque o ponto de inserção em uma tabela ou crie uma."),
+1 -9
View File
@@ -1,5 +1,5 @@
//! Ukrainian interface translations; publishing terms are reviewed in context.
//! Common phrases are adapted from the MIT OR Apache-2.0 ArtCraft sibling catalogs
//! Common phrases are adapted from the MIT OR Apache-2.0 sibling catalogs
//! (VectorCraft, PhotoCraft, WordCraft and DeckCraft); see ASSETS.md for pinned sources.
pub(super) const TABLE: &[(&str, &str)] = &[
("File", "Файл"),
@@ -417,8 +417,6 @@ pub(super) const TABLE: &[(&str, &str)] = &[
("Apply Color", "Застосувати колір"),
("Apply Condition", "Застосувати умову"),
("Apply Parent to Pages…", "Застосувати шаблон до сторінок…"),
("ArtCraft App Page…", "Сторінка програми ArtCraft…"),
("ArtCraft Website…", "Вебсайт ArtCraft…"),
("Attributes", "Атрибути"),
("Bevel and Emboss", "Скіс і рельєф"),
("Buttons", "Кнопки"),
@@ -545,7 +543,6 @@ pub(super) const TABLE: &[(&str, &str)] = &[
("Insert Variable", "Вставити змінну"),
("Inspect Document", "Перевірити документ"),
("Interface Color Theme", "Колірна тема інтерфейсу"),
("Join the ArtCraft Discord…", "Приєднатися до Discord ArtCraft…"),
("Last Object Below", "Останній об’єкт нижче"),
("Library Contents", "Вміст бібліотеки"),
("Library Items", "Елементи бібліотеки"),
@@ -847,11 +844,9 @@ pub(super) const TABLE: &[(&str, &str)] = &[
("Hyphens and Dashes", "Дефіси та тире"),
("Interactive", "Інтерактивність"),
("Invert", "Інвертувати"),
("Join the ArtCraft community", "Приєднатися до спільноти ArtCraft"),
("Keyboard Increments", "Кроки переміщення клавішами"),
("Liquid guides", "Напрямні гнучкого макета"),
("Markers", "Маркери"),
("More ArtCraft apps", "Інші програми ArtCraft"),
("Nested Line Styles", "Вкладені стилі рядків"),
("Nested Styles", "Вкладені стилі"),
("No articles: exports follow page order.", "Немає статей: експорт дотримується порядку сторінок."),
@@ -883,7 +878,6 @@ pub(super) const TABLE: &[(&str, &str)] = &[
("Page Numbering", "Нумерація сторінок"),
("Page layout for print and screen — fast, open and scriptable.", "Верстка для друку й екрана — швидка, відкрита, зі сценаріями."),
("Page · PPI", "Сторінка · PPI"),
("Part of the ArtCraft suite of open creative tools.", "Частина набору відкритих творчих інструментів ArtCraft."),
("Pasteboard Options", "Параметри монтажного столу"),
("Paths", "Контури"),
("Place the insertion point in a table, or create one.", "Установіть курсор у таблиці або створіть її."),
@@ -935,7 +929,6 @@ pub(super) const TABLE: &[(&str, &str)] = &[
("[No Group]", "[Без групи]"),
("[None]", "[Немає]"),
("[None] — choose a colour on the ramp.", "[Немає] — виберіть колір на шкалі."),
("discord.gg/artcraft — help, feedback and show-and-tell", "discord.gg/artcraft — допомога, відгуки та обмін роботами"),
("⌥-click clears overrides", "⌥-клацання скидає перевизначення"),
("⚠ out of date", "⚠ застаріле"),
("General", "Загальні"),
@@ -1336,7 +1329,6 @@ pub(super) const TABLE: &[(&str, &str)] = &[
("H&J Violations", "Порушення переносів і вирівнювання"),
("Include Bleed", "Включати виліт"),
("Include Stroke Weight", "Враховувати товщину обведення"),
("Join our Discord", "Приєднуйтесь до нашого Discord"),
("Keep Violations", "Порушення правил утримання рядків"),
("Overprint [Black] Swatch at 100%", "Накладання зразка [Чорний] на 100%"),
("Printer's Marks", "Друкарські позначки"),
+1 -27
View File
@@ -159,12 +159,8 @@ pub const UI_COMMANDS: &[(&str, &str, Option<&str>, &str)] = &[
"{on?: bool, at?: [x, y] (points from the canvas's top-left)} — the Contextual Task Bar stays where it is (or at `at`) instead of following the selection; with neither, toggles",
),
("window.taskBarReset", "Reset Bar Position", None, "{} — the Contextual Task Bar follows the selection again, under it"),
("help.discord", "Join the ArtCraft Discord…", None, "{} — opens https://discord.gg/artcraft in the browser"),
("help.appPage", "DesignCraft Website…", None, "{} — opens https://getartcraft.com/apps/designcraft"),
("help.github", "DesignCraft on GitHub…", None, "{} — opens https://github.com/storytold/designcraft"),
("help.issues", "Report an Issue…", None, "{} — opens the GitHub issue tracker"),
("help.website", "ArtCraft Website…", None, "{} — opens https://getartcraft.com"),
("help.app", "ArtCraft App Page…", None, "{app} — opens https://getartcraft.com/apps/{app} (e.g. photocraft)"),
(
"help.about",
"About DesignCraft",
@@ -701,21 +697,7 @@ pub const MENUS: &[(&str, &[&str])] = &[
"ui:window.brightness",
],
),
(
"Help",
&[
"ui:help.discord",
"-",
"ui:help.appPage",
"ui:help.github",
"ui:help.issues",
"ui:help.website",
"-",
"cmd:file.newSample",
"-",
"ui:help.about",
],
),
("Help", &["ui:help.github", "ui:help.issues", "-", "cmd:file.newSample", "-", "ui:help.about"]),
];
pub fn ui_label(id: &str) -> Option<(&'static str, Option<&'static str>)> {
@@ -1373,14 +1355,6 @@ pub fn run_ui(app: &mut DesignApp, id: &str, p: &Value) -> Option<Result<Value,
app.ui.about = p.get("open").and_then(Value::as_bool).unwrap_or(true);
Ok(json!(app.ui.about))
}
"help.app" => match p.get("app").and_then(Value::as_str) {
Some(slug) if !slug.is_empty() && slug.chars().all(|c| c.is_ascii_alphanumeric() || c == '-') => {
let url = format!("{}/apps/{slug}", designcraft_engine::links::WEBSITE);
app.ui.pending_urls.push(url.clone());
Ok(json!({"url": url}))
}
_ => Err("help.app: give `app` (e.g. \"photocraft\")".into()),
},
h if h.starts_with("help.") && designcraft_engine::links::get(&h[5..]).is_some() => {
let url = designcraft_engine::links::get(&h[5..]).unwrap_or_default().to_string();
app.ui.pending_urls.push(url.clone());
-42
View File
@@ -1,42 +0,0 @@
ArtCraft brand assets: license
The ArtCraft name, wordmark and mark (the "ArtCraft Marks"), including every file in this
directory in every color, size and format, are owned by the ArtCraft Team. They are trademarks
and are NOT open source. They are not covered by DesignCraft's MIT OR Apache-2.0 license, and nothing in
that license, in NOTICE or in any other file of this repository grants any right to them.
Permission
The ArtCraft Team grants a limited, non-exclusive, non-transferable, revocable, royalty-free
permission to use the ArtCraft Marks only:
1. as part of copies of this repository; and
2. within DesignCraft itself, its documentation and its official builds, to identify DesignCraft as made
by the ArtCraft team and community and to link to getartcraft.com and its community.
Conditions
The permission holds only while every one of these is true:
- The marks are used exactly as supplied in this directory. Do not redraw, recolor, crop,
stretch, rotate, animate, outline or add effects to them, extract parts of them, or combine
them with any other name, mark or artwork.
- They are used only in the context of DesignCraft, and only to say that the ArtCraft team makes it.
They must never suggest that the ArtCraft Team made, sponsors, endorses, certifies or supports
any other product, service, fork, modified version, plug-in, organization or person.
- Neither the marks nor the ArtCraft name appear in the name, logo, icon, domain, social media
handle, app-store listing, advertising or marketing of anything other than DesignCraft.
Forks and modified versions
If you distribute or publish a modified version of DesignCraft, or any work derived from it, you must
remove the ArtCraft Marks from it (or replace them with your own) and must not call it ArtCraft or
present it as an ArtCraft product. You may say, in plain text, that your work is based on DesignCraft by
the ArtCraft team. A fork kept only to propose changes back to this repository may keep the marks
unchanged.
Everything else
Any use not expressly permitted here needs prior written permission from the ArtCraft Team
(https://getartcraft.com/). The permission ends automatically for anyone who breaks these terms.
All other rights are reserved.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

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

Before

Width:  |  Height:  |  Size: 341 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

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

Before

Width:  |  Height:  |  Size: 341 B

+1 -1
View File
@@ -119,4 +119,4 @@ key {"key": "Escape"}
## Community links
`app.links` returns the ArtCraft Discord (https://discord.gg/artcraft), the website (https://getartcraft.com), DesignCraft's app page (https://getartcraft.com/apps/designcraft), its GitHub repository (https://github.com/storytold/designcraft) and the issue tracker. In the running app, the UI commands `help.discord`, `help.appPage`, `help.github`, `help.issues`, `help.website`, `help.app {app}` open them in the browser and `help.about {tab?}` shows the About window (tabs `about`, `contributors`, `models`). The server's `serverInfo.websiteUrl` is the app page.
`app.links` returns the GitHub repository (https://github.com/storytold/designcraft) and the issue tracker. In the running app, the UI commands `help.github` and `help.issues` open them in the browser and `help.about {tab?}` shows the About window (tabs `about`, `contributors`, `models`). The server's `serverInfo.websiteUrl` is the GitHub repository.
@@ -18,10 +18,10 @@
<launchable type="desktop-id">ai.storyteller.designcraft.desktop</launchable>
<icon type="stock">ai.storyteller.designcraft</icon>
<!-- Only url types known to appstream 0.15 (Ubuntu 22.04, where CI validates): no vcs-browser. -->
<url type="homepage">https://getartcraft.com/apps/designcraft</url>
<url type="homepage">https://github.com/storytold/designcraft</url>
<url type="bugtracker">https://github.com/storytold/designcraft/issues</url>
<url type="help">https://github.com/storytold/designcraft</url>
<url type="contact">https://discord.gg/artcraft</url>
<url type="contact">https://github.com/storytold/designcraft/issues</url>
<categories>
<category>Graphics</category>
<category>RasterGraphics</category>
+1 -1
View File
@@ -14,7 +14,7 @@ section: graphics
priority: optional
maintainer: ${DESIGNCRAFT_MAINTAINER}
vendor: Learning Machines LLC
homepage: https://getartcraft.com/apps/designcraft
homepage: https://github.com/storytold/designcraft
license: MIT OR Apache-2.0
description: |-
Open-source, native page layout and publishing that works the way InDesign users expect.
+3 -3
View File
@@ -26,9 +26,9 @@
<Icon Id="DesigncraftIcon.ico" SourceFile="$(var.IconPath)" />
<Property Id="ARPPRODUCTICON" Value="DesigncraftIcon.ico" />
<Property Id="ARPURLINFOABOUT" Value="https://getartcraft.com/apps/designcraft" />
<Property Id="ARPURLUPDATEINFO" Value="https://getartcraft.com/apps/designcraft" />
<Property Id="ARPHELPLINK" Value="https://discord.gg/artcraft" />
<Property Id="ARPURLINFOABOUT" Value="https://github.com/storytold/designcraft" />
<Property Id="ARPURLUPDATEINFO" Value="https://github.com/storytold/designcraft" />
<Property Id="ARPHELPLINK" Value="https://github.com/storytold/designcraft/issues" />
<StandardDirectory Id="ProgramFiles6432Folder">
<Directory Id="INSTALLFOLDER" Name="DesignCraft" />
+27 -1
View File
@@ -6,6 +6,7 @@
Produces, in $env:DIST (default: dist/release):
designcraft-<version>-windows-<arch>.msi per-machine installer (WiX v5)
designcraft-<version>-windows-<arch>-portable.zip designcraft.exe + designcraft-cli.exe
designcraft-cli-<version>-windows-<arch>.zip designcraft-cli.exe standalone
The binaries link the C runtime statically (+crt-static), so neither the MSI nor the portable
zip needs the Visual C++ redistributable. Signing is delegated to sign.ps1 (skipped with a
@@ -25,6 +26,7 @@ param(
)
$ErrorActionPreference = 'Stop'
$Root = (Resolve-Path (Join-Path $PSScriptRoot '..\..')).Path
Set-Location $Root
function Invoke-Native([string] $What, [scriptblock] $Block) {
Write-Output "==> $What"
@@ -56,6 +58,17 @@ if (-not $env:DESIGNCRAFT_BUILD_DATE) { $env:DESIGNCRAFT_BUILD_DATE = (Get-Date)
Write-Output "DesignCraft $Version for Windows $Arch ($Target)"
if (-not $SkipBuild) {
# Locate rc.exe if not in PATH
if (-not (Get-Command rc.exe -ErrorAction SilentlyContinue)) {
$kits = Join-Path ${env:ProgramFiles(x86)} 'Windows Kits\10\bin'
$foundRc = Get-ChildItem -Path $kits -Recurse -Filter rc.exe -ErrorAction SilentlyContinue |
Where-Object { $_.FullName -match '\\x64\\rc\.exe$' } |
Sort-Object FullName -Descending | Select-Object -First 1
if ($foundRc) {
$env:PATH = "$($foundRc.DirectoryName);$env:PATH"
}
}
# Static CRT: no VC++ redistributable needed. Scoped to the target so host build scripts and
# proc-macros are unaffected.
$flagVar = 'CARGO_TARGET_' + ($Target.ToUpper() -replace '-', '_') + '_RUSTFLAGS'
@@ -120,6 +133,19 @@ $Zip = Join-Path $Dist "designcraft-$Version-windows-$Arch-portable.zip"
Remove-Item -Force $Zip -ErrorAction SilentlyContinue
Compress-Archive -Path $Portable -DestinationPath $Zip
# ---- cli zip -----------------------------------------------------------------------------------
$CliPortable = Join-Path $TargetDir "windows-package\designcraft-cli-$Version-windows-$Arch"
Remove-Item -Recurse -Force $CliPortable -ErrorAction SilentlyContinue
New-Item -ItemType Directory -Force -Path $CliPortable | Out-Null
Copy-Item (Join-Path $Stage 'designcraft-cli.exe') $CliPortable
foreach ($f in 'README.md', 'LICENSE', 'LICENSE-MIT', 'LICENSE-APACHE') {
$p = Join-Path $Root $f
if (Test-Path $p) { Copy-Item $p $CliPortable }
}
$CliZip = Join-Path $Dist "designcraft-cli-$Version-windows-$Arch.zip"
Remove-Item -Force $CliZip -ErrorAction SilentlyContinue
Compress-Archive -Path $CliPortable -DestinationPath $CliZip
# Smoke-test the CLI when this machine can run it. An ARM64 build made on an x64 runner can't run
# here; .github/workflows/windows-arm64.yml installs and runs it on ARM64 instead.
$HostArch = [System.Runtime.InteropServices.RuntimeInformation]::OSArchitecture.ToString().ToLowerInvariant()
@@ -128,4 +154,4 @@ if ($Arch -ne 'arm64' -or $HostArch -eq 'arm64') {
} else {
Write-Output "skipping designcraft-cli --version: an $Arch build doesn't run on this $HostArch machine"
}
Get-Item $Msi, $Zip | Format-Table Name, Length
Get-Item $Msi, $Zip, $CliZip | Format-Table Name, Length
Submodule tools/craft-skills added at 2c1fed9237