Compare commits
7 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 06eb6b0e1b | |||
| b4622eb9c0 | |||
| 4b015d1d77 | |||
| 2970b4b1af | |||
| a29739acc7 | |||
| 64949c7829 | |||
| 5c9239f511 |
@@ -0,0 +1,25 @@
|
||||
# Strip upstream (ArtCraft / Discord) branding. Run: 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 ^crates/ui-egui/src/i18n/.*\.tsv$ :: \t(?!Part of ArtCraft\. ).*(?:ArtCraft|Discord|getartcraft)
|
||||
dropline ^ASSETS\.md$ :: \|\s*`docs/brand/
|
||||
sub (?<=\t)(?:(?:(?:Teil von|Součást|Parte de|Parte di|Часть|Частина|Part of) |Fait partie d’|Część |Một phần của )ArtCraft\. |Az ArtCraft része\. |ArtCraft의 일부입니다\. |ArtCraft (?:の一員。|的一部分。))(?=MIT) =>
|
||||
sub (?s)\nThe ArtCraft name, wordmark and logos in docs/brand/.*?LICENSE-brand\.txt\.\n =>
|
||||
sub \s*The ArtCraft logos in `docs/brand/` are trademarks, not open source, under `docs/brand/LICENSE-brand\.txt`: never modify them or use them outside VectorCraft\. =>
|
||||
sub \bArtCraft, =>
|
||||
sub (?s) The one exception is the ArtCraft name, wordmark and logos in `docs/brand/`:.*?LICENSE-brand\.txt\)\. =>
|
||||
sub Original artwork drawn in ArtCraft for VectorCraft => Original artwork drawn by hand for VectorCraft
|
||||
sub Project owner \(ArtCraft team\) => Project owner
|
||||
sub drawn in ArtCraft and vectorised => drawn by hand and vectorised
|
||||
sub the owner's original ArtCraft drawing => the owner's original drawing
|
||||
sub Discord button and Help → Discord link => Chat icon
|
||||
sub \(Discord feedback(?=[,)]) => (user feedback
|
||||
sub Discord feedback: => User feedback:
|
||||
sub \(Discord feedback\) => (user feedback)
|
||||
sub Discord feedback => user feedback
|
||||
sub The Discord report => The user report
|
||||
sub https://getartcraft\.com/apps/vectorcraft => https://github.com/storytold/vectorcraft
|
||||
sub https://discord\.gg/artcraft => https://github.com/storytold/vectorcraft/issues
|
||||
forbid (?i)artcraft(?! Team and the VectorCraft contributors)
|
||||
forbid (?i)discord
|
||||
@@ -0,0 +1,3 @@
|
||||
[submodule "tools/craft-skills"]
|
||||
path = tools/craft-skills
|
||||
url = https://git.marcospaulo.dev.br/storytold/craft-skills.git
|
||||
@@ -29,7 +29,7 @@ Formerly **DrawCraft** (renamed 2026-10-01): old `.drawcraft` files and `"format
|
||||
- **Every asset file must have a row in [`ASSETS.md`](ASSETS.md)** (path, author, source URL, licence, notes). Put licence texts next to the assets (e.g. `assets/fonts/OFL-*.txt`) and summarize them in `NOTICE`.
|
||||
- `cargo xtask assets` (run by `cargo xtask ci`) fails on any unattributed asset.
|
||||
- **Fonts live in [storytold/craft-fonts](https://github.com/storytold/craft-fonts), never in this repo** (rules: craftrules [`standards/fonts.md`](https://github.com/storytold/craftrules/blob/main/standards/fonts.md)). Never commit a font file here; add new fonts to craft-fonts. The app uses it only through the optional `CRAFT_FONTS_DIR` build option (`CRAFT_FONTS_DIR="$PWD/../craft-fonts" cargo xtask ci`; use an absolute path), read by `crates/text/build.rs` into `vectorcraft_text::CRAFT_FONTS`; never add it to a `Cargo.toml`. Everything must build, test and run with `CRAFT_FONTS` empty, and tests of its glyphs skip when it is. Details: `docs/development.md` › Fonts.
|
||||
- Code and original assets are MIT OR Apache-2.0 (`LICENSE-MIT`, `LICENSE-APACHE`, `NOTICE`). The ArtCraft logos in `docs/brand/` are trademarks, not open source, under `docs/brand/LICENSE-brand.txt`: never modify them or use them outside VectorCraft.
|
||||
- Code and original assets are MIT OR Apache-2.0 (`LICENSE-MIT`, `LICENSE-APACHE`, `NOTICE`).
|
||||
- Prefer art generated in code for defaults (swatches, brushes, symbols, patterns, cursors). If the provenance of an asset is unclear, don't add it.
|
||||
- Reference screenshots of Illustrator stay local under the gitignored `plan/` and are never committed, published or used as assets.
|
||||
- **Never crash: no panics in shipped code.** A crash loses the user's unsaved work. Files, pasted data, MCP and control messages, and command params are all untrusted input.
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
Every non-code asset in this repository (icons, images, fonts, example art, colour profiles, 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):** VectorCraft contains **no Adobe iconography, images, artwork, presets, swatch/brush/symbol/pattern libraries or ICC profiles**. Every asset is either original work by VectorCraft contributors, or third-party material under an open licence (OSI open source, public domain / CC0, or Creative Commons that allows redistribution), and it is attributed below. Screenshots of Adobe software are never committed. The one exception is the ArtCraft name, wordmark and logos in `docs/brand/`: ArtCraft trademarks, not open source, usable only under [`docs/brand/LICENSE-brand.txt`](docs/brand/LICENSE-brand.txt).
|
||||
**Policy (mandatory):** VectorCraft contains **no Adobe iconography, images, artwork, presets, swatch/brush/symbol/pattern libraries or ICC profiles**. Every asset is either original work by VectorCraft contributors, or third-party material under an open licence (OSI open source, public domain / CC0, or Creative Commons that allows redistribution), and it is attributed below. Screenshots of Adobe software are never committed.
|
||||
|
||||
Generated-in-code art is original and has no file to list. This covers the default swatches, brushes, symbols, patterns, graphic styles, image-trace presets and the vector tool cursors (`crates/ui-egui/src/cursors.rs`).
|
||||
|
||||
@@ -12,31 +12,23 @@ Generated-in-code art is original and has no file to list. This covers the defau
|
||||
|
||||
| Asset | Author | Source | Licence | Notes |
|
||||
|---|---|---|---|---|
|
||||
| `docs/brand/artcraft-logo-white.png` | ArtCraft team (project owner) | https://getartcraft.com/ | ArtCraft trademark, see docs/brand/LICENSE-brand.txt (not open source) | Used in README only; not shipped in the app |
|
||||
| `docs/brand/artcraft-logo-white.svg` | ArtCraft team (project owner) | https://getartcraft.com/ | ArtCraft trademark, see docs/brand/LICENSE-brand.txt (not open source) | Used in README only; not shipped in the app |
|
||||
| `docs/brand/artcraft-logo.png` | ArtCraft team (project owner) | https://getartcraft.com/ | ArtCraft trademark, see docs/brand/LICENSE-brand.txt (not open source) | Used in README only; not shipped in the app |
|
||||
| `docs/brand/artcraft-logo.svg` | ArtCraft team (project owner) | https://getartcraft.com/ | ArtCraft trademark, see docs/brand/LICENSE-brand.txt (not open source) | Used in README only; not shipped in the app |
|
||||
| `docs/brand/artcraft-mark-black.png` | ArtCraft team (project owner) | https://getartcraft.com/ | ArtCraft trademark, see docs/brand/LICENSE-brand.txt (not open source) | Used in README only; not shipped in the app |
|
||||
| `docs/brand/artcraft-mark-black.svg` | ArtCraft team (project owner) | https://getartcraft.com/ | ArtCraft trademark, see docs/brand/LICENSE-brand.txt (not open source) | Used in README only; not shipped in the app |
|
||||
| `docs/brand/artcraft-mark.png` | ArtCraft team (project owner) | https://getartcraft.com/ | ArtCraft trademark, see docs/brand/LICENSE-brand.txt (not open source) | Used in README only; not shipped in the app |
|
||||
| `docs/brand/artcraft-mark.svg` | ArtCraft team (project owner) | https://getartcraft.com/ | ArtCraft trademark, see docs/brand/LICENSE-brand.txt (not open source) | Used in README only; not shipped in the app |
|
||||
| `assets/app-icon/LICENSE.txt` | (licence/readme text) | VectorCraft | MIT OR Apache-2.0 | |
|
||||
| `assets/app-icon/README.md` | (licence/readme text) | VectorCraft | MIT OR Apache-2.0 | |
|
||||
| `assets/app-icon/hicolor/128x128/apps/ai.storyteller.vectorcraft.png` | Project owner (ArtCraft team) | Original artwork drawn in ArtCraft for VectorCraft, vectorised and rendered by `packaging/icons.sh` | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | App icon (engraved dragon) |
|
||||
| `assets/app-icon/hicolor/16x16/apps/ai.storyteller.vectorcraft.png` | Project owner (ArtCraft team) | Original artwork drawn in ArtCraft for VectorCraft, vectorised and rendered by `packaging/icons.sh` | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | App icon (engraved dragon) |
|
||||
| `assets/app-icon/hicolor/24x24/apps/ai.storyteller.vectorcraft.png` | Project owner (ArtCraft team) | Original artwork drawn in ArtCraft for VectorCraft, vectorised and rendered by `packaging/icons.sh` | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | App icon (engraved dragon) |
|
||||
| `assets/app-icon/hicolor/256x256/apps/ai.storyteller.vectorcraft.png` | Project owner (ArtCraft team) | Original artwork drawn in ArtCraft for VectorCraft, vectorised and rendered by `packaging/icons.sh` | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | App icon (engraved dragon) |
|
||||
| `assets/app-icon/hicolor/32x32/apps/ai.storyteller.vectorcraft.png` | Project owner (ArtCraft team) | Original artwork drawn in ArtCraft for VectorCraft, vectorised and rendered by `packaging/icons.sh` | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | App icon (engraved dragon) |
|
||||
| `assets/app-icon/hicolor/48x48/apps/ai.storyteller.vectorcraft.png` | Project owner (ArtCraft team) | Original artwork drawn in ArtCraft for VectorCraft, vectorised and rendered by `packaging/icons.sh` | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | App icon (engraved dragon) |
|
||||
| `assets/app-icon/hicolor/512x512/apps/ai.storyteller.vectorcraft.png` | Project owner (ArtCraft team) | Original artwork drawn in ArtCraft for VectorCraft, vectorised and rendered by `packaging/icons.sh` | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | App icon (engraved dragon) |
|
||||
| `assets/app-icon/hicolor/64x64/apps/ai.storyteller.vectorcraft.png` | Project owner (ArtCraft team) | Original artwork drawn in ArtCraft for VectorCraft, vectorised and rendered by `packaging/icons.sh` | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | App icon (engraved dragon) |
|
||||
| `assets/app-icon/hicolor/scalable/apps/ai.storyteller.vectorcraft.svg` | Project owner (ArtCraft team) | Original artwork drawn in ArtCraft for VectorCraft, vectorised and rendered by `packaging/icons.sh` | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | App icon (engraved dragon) |
|
||||
| `assets/app-icon/vectorcraft-1024.png` | Project owner (ArtCraft team) | Original artwork drawn in ArtCraft for VectorCraft, vectorised and rendered by `packaging/icons.sh` | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | App icon (engraved dragon) |
|
||||
| `assets/app-icon/vectorcraft-macos-512.png` | Project owner (ArtCraft team) | Original artwork drawn in ArtCraft for VectorCraft, vectorised and rendered by `packaging/icons.sh` | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | App icon (engraved dragon) |
|
||||
| `assets/app-icon/vectorcraft-small.svg` | Project owner (ArtCraft team) | Original artwork drawn in ArtCraft for VectorCraft, vectorised and rendered by `packaging/icons.sh` | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | App icon (engraved dragon) |
|
||||
| `assets/app-icon/vectorcraft.icns` | Project owner (ArtCraft team) | Original artwork drawn in ArtCraft for VectorCraft, vectorised and rendered by `packaging/icons.sh` | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | App icon (engraved dragon) |
|
||||
| `assets/app-icon/vectorcraft.ico` | Project owner (ArtCraft team) | Original artwork drawn in ArtCraft for VectorCraft, vectorised and rendered by `packaging/icons.sh` | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | App icon (engraved dragon) |
|
||||
| `assets/app-icon/vectorcraft.svg` | Project owner (ArtCraft team) | Original artwork drawn in ArtCraft for VectorCraft, vectorised and rendered by `packaging/icons.sh` | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | App icon (engraved dragon) |
|
||||
| `assets/app-icon/hicolor/128x128/apps/ai.storyteller.vectorcraft.png` | Project owner | Original artwork drawn by hand for VectorCraft, vectorised and rendered by `packaging/icons.sh` | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | App icon (engraved dragon) |
|
||||
| `assets/app-icon/hicolor/16x16/apps/ai.storyteller.vectorcraft.png` | Project owner | Original artwork drawn by hand for VectorCraft, vectorised and rendered by `packaging/icons.sh` | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | App icon (engraved dragon) |
|
||||
| `assets/app-icon/hicolor/24x24/apps/ai.storyteller.vectorcraft.png` | Project owner | Original artwork drawn by hand for VectorCraft, vectorised and rendered by `packaging/icons.sh` | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | App icon (engraved dragon) |
|
||||
| `assets/app-icon/hicolor/256x256/apps/ai.storyteller.vectorcraft.png` | Project owner | Original artwork drawn by hand for VectorCraft, vectorised and rendered by `packaging/icons.sh` | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | App icon (engraved dragon) |
|
||||
| `assets/app-icon/hicolor/32x32/apps/ai.storyteller.vectorcraft.png` | Project owner | Original artwork drawn by hand for VectorCraft, vectorised and rendered by `packaging/icons.sh` | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | App icon (engraved dragon) |
|
||||
| `assets/app-icon/hicolor/48x48/apps/ai.storyteller.vectorcraft.png` | Project owner | Original artwork drawn by hand for VectorCraft, vectorised and rendered by `packaging/icons.sh` | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | App icon (engraved dragon) |
|
||||
| `assets/app-icon/hicolor/512x512/apps/ai.storyteller.vectorcraft.png` | Project owner | Original artwork drawn by hand for VectorCraft, vectorised and rendered by `packaging/icons.sh` | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | App icon (engraved dragon) |
|
||||
| `assets/app-icon/hicolor/64x64/apps/ai.storyteller.vectorcraft.png` | Project owner | Original artwork drawn by hand for VectorCraft, vectorised and rendered by `packaging/icons.sh` | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | App icon (engraved dragon) |
|
||||
| `assets/app-icon/hicolor/scalable/apps/ai.storyteller.vectorcraft.svg` | Project owner | Original artwork drawn by hand for VectorCraft, vectorised and rendered by `packaging/icons.sh` | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | App icon (engraved dragon) |
|
||||
| `assets/app-icon/vectorcraft-1024.png` | Project owner | Original artwork drawn by hand for VectorCraft, vectorised and rendered by `packaging/icons.sh` | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | App icon (engraved dragon) |
|
||||
| `assets/app-icon/vectorcraft-macos-512.png` | Project owner | Original artwork drawn by hand for VectorCraft, vectorised and rendered by `packaging/icons.sh` | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | App icon (engraved dragon) |
|
||||
| `assets/app-icon/vectorcraft-small.svg` | Project owner | Original artwork drawn by hand for VectorCraft, vectorised and rendered by `packaging/icons.sh` | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | App icon (engraved dragon) |
|
||||
| `assets/app-icon/vectorcraft.icns` | Project owner | Original artwork drawn by hand for VectorCraft, vectorised and rendered by `packaging/icons.sh` | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | App icon (engraved dragon) |
|
||||
| `assets/app-icon/vectorcraft.ico` | Project owner | Original artwork drawn by hand for VectorCraft, vectorised and rendered by `packaging/icons.sh` | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | App icon (engraved dragon) |
|
||||
| `assets/app-icon/vectorcraft.svg` | Project owner | Original artwork drawn by hand for VectorCraft, vectorised and rendered by `packaging/icons.sh` | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | App icon (engraved dragon) |
|
||||
| `packaging/macos/dmg/background.svg` | Xus Badia (contributed in #493) | Original artwork for VectorCraft's DMG window; links the app icon `assets/app-icon/vectorcraft-small.svg` | MIT OR Apache-2.0 (licensed by the contributor under the project licence) | DMG background source. Text in Inter and JetBrains Mono (OFL-1.1, `assets/fonts`), not embedded; paper grain generated by an SVG `feTurbulence` filter |
|
||||
| `packaging/macos/dmg/background.tiff` | Xus Badia (contributed in #493) | Rendered from `packaging/macos/dmg/background.svg` by `packaging/macos/dmg/generate.py` | MIT OR Apache-2.0 | 1x + 2x DMG background; includes the app icon (see its rows), text rendered from OFL-1.1 fonts and LittleCMS's built-in sRGB profile ("No copyright, use freely") |
|
||||
| `packaging/macos/dmg/DS_Store` | Xus Badia (layout, #493) | Written by `packaging/macos/dmg/generate.py` | MIT OR Apache-2.0 | Finder view settings for the DMG (window, icon size and positions, background alias); no machine data |
|
||||
@@ -255,7 +247,7 @@ Generated-in-code art is original and has no file to list. This covers the defau
|
||||
| `assets/icons/external-link.svg` | Lucide Icons and Contributors | https://lucide.dev (lucide-static v1.49.0; header kept in file) | ISC; derived from Feather, also MIT (`assets/icons/LICENSE-lucide.txt`) | Help → app page link |
|
||||
| `assets/icons/git-branch.svg` | Lucide Icons and Contributors | https://lucide.dev (lucide-static v1.49.0; header kept in file) | ISC (`assets/icons/LICENSE-lucide.txt`) | Help → GitHub link |
|
||||
| `assets/icons/globe.svg` | Lucide Icons and Contributors | https://lucide.dev (lucide-static v1.49.0; header kept in file) | ISC (`assets/icons/LICENSE-lucide.txt`) | Help → website link |
|
||||
| `assets/icons/message-circle.svg` | Lucide Icons and Contributors | https://lucide.dev (lucide-static v1.49.0; header kept in file) | ISC (`assets/icons/LICENSE-lucide.txt`) | Discord button and Help → Discord link |
|
||||
| `assets/icons/message-circle.svg` | Lucide Icons and Contributors | https://lucide.dev (lucide-static v1.49.0; header kept in file) | ISC (`assets/icons/LICENSE-lucide.txt`) | Chat icon |
|
||||
| `assets/icons/lock-open.svg` | Lucide Icons and Contributors | https://lucide.dev (lucide-static v1.49.0; header kept in file) | ISC (`assets/icons/LICENSE-lucide.txt`) | |
|
||||
| `assets/icons/lock.svg` | Lucide Icons and Contributors | https://lucide.dev (lucide-static v1.49.0; header kept in file) | ISC; derived from Feather, also MIT (`assets/icons/LICENSE-lucide.txt`) | |
|
||||
| `assets/icons/map.svg` | Lucide Icons and Contributors | https://lucide.dev (lucide-static v1.49.0; header kept in file) | ISC (`assets/icons/LICENSE-lucide.txt`) | |
|
||||
|
||||
@@ -29,7 +29,7 @@ Formerly **DrawCraft** (renamed 2026-10-01): old `.drawcraft` files and `"format
|
||||
- **Every asset file must have a row in [`ASSETS.md`](ASSETS.md)** (path, author, source URL, licence, notes). Put licence texts next to the assets (e.g. `assets/fonts/OFL-*.txt`) and summarize them in `NOTICE`.
|
||||
- `cargo xtask assets` (run by `cargo xtask ci`) fails on any unattributed asset.
|
||||
- **Fonts live in [storytold/craft-fonts](https://github.com/storytold/craft-fonts), never in this repo** (rules: craftrules [`standards/fonts.md`](https://github.com/storytold/craftrules/blob/main/standards/fonts.md)). Never commit a font file here; add new fonts to craft-fonts. The app uses it only through the optional `CRAFT_FONTS_DIR` build option (`CRAFT_FONTS_DIR="$PWD/../craft-fonts" cargo xtask ci`; use an absolute path), read by `crates/text/build.rs` into `vectorcraft_text::CRAFT_FONTS`; never add it to a `Cargo.toml`. Everything must build, test and run with `CRAFT_FONTS` empty, and tests of its glyphs skip when it is. Details: `docs/development.md` › Fonts.
|
||||
- Code and original assets are MIT OR Apache-2.0 (`LICENSE-MIT`, `LICENSE-APACHE`, `NOTICE`). The ArtCraft logos in `docs/brand/` are trademarks, not open source, under `docs/brand/LICENSE-brand.txt`: never modify them or use them outside VectorCraft.
|
||||
- Code and original assets are MIT OR Apache-2.0 (`LICENSE-MIT`, `LICENSE-APACHE`, `NOTICE`).
|
||||
- Prefer art generated in code for defaults (swatches, brushes, symbols, patterns, cursors). If the provenance of an asset is unclear, don't add it.
|
||||
- Reference screenshots of Illustrator stay local under the gitignored `plan/` and are never committed, published or used as assets.
|
||||
- **Never crash: no panics in shipped code.** A crash loses the user's unsaved work. Files, pasted data, MCP and control messages, and command params are all untrusted input.
|
||||
|
||||
@@ -4,15 +4,15 @@ members = ["crates/*", "apps/*", "xtask"]
|
||||
default-members = ["crates/*", "apps/vectorcraft", "apps/vectorcraft-cli", "xtask"]
|
||||
|
||||
[workspace.package]
|
||||
version = "0.10.0"
|
||||
version = "0.10.1"
|
||||
edition = "2024"
|
||||
license = "MIT OR Apache-2.0"
|
||||
rust-version = "1.95"
|
||||
repository = "https://github.com/storytold/vectorcraft"
|
||||
|
||||
[workspace.dependencies]
|
||||
craft-print = { git = "https://github.com/storytold/craft-libs", rev = "d991bf6792f8ade99c51358bf3c1d902c8cd96b5" }
|
||||
craft-ui = { git = "https://github.com/storytold/craft-libs", rev = "5c874d51eeb3de70e735c8ce87a59a7dedd47675", features = ["serde"] }
|
||||
craft-print = { git = "https://git.marcospaulo.dev.br/masi/craft-libs", rev = "7fcee66b8eef8eac3c7644fd024e1f1b051f5a3e" }
|
||||
craft-ui = { git = "https://git.marcospaulo.dev.br/masi/craft-libs", rev = "7fcee66b8eef8eac3c7644fd024e1f1b051f5a3e", features = ["serde"] }
|
||||
# internal
|
||||
vectorcraft-geom = { path = "crates/geom" }
|
||||
vectorcraft-color = { path = "crates/color" }
|
||||
|
||||
@@ -3,10 +3,6 @@ Copyright (c) 2026 ArtCraft Team and the VectorCraft contributors.
|
||||
Licensed under the MIT License or the Apache License, Version 2.0, at your option
|
||||
(LICENSE-MIT, LICENSE-APACHE).
|
||||
|
||||
The ArtCraft name, wordmark and logos in docs/brand/ are trademarks of the ArtCraft Team. They are
|
||||
not open source and are not covered by the license above; their terms are in
|
||||
docs/brand/LICENSE-brand.txt.
|
||||
|
||||
Third-party material
|
||||
|
||||
This product bundles third-party material under its own licenses, listed below. The per-file
|
||||
|
||||
@@ -1,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">VectorCraft</h1>
|
||||
|
||||
<p align="center">
|
||||
@@ -16,7 +6,7 @@
|
||||
|
||||
<p align="center">
|
||||
A fast, open-source, clean-room take on the Adobe Illustrator workflow. It runs natively on
|
||||
macOS, Windows, Linux and FreeBSD, and in the browser via WebAssembly. Built by the ArtCraft team.
|
||||
macOS, Windows, Linux and FreeBSD, and in the browser via WebAssembly.
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
@@ -27,16 +17,6 @@
|
||||
<img alt="License: MIT OR Apache-2.0" src="https://img.shields.io/badge/license-MIT%20OR%20Apache--2.0-555555">
|
||||
</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/vectorcraft"><b>VectorCraft 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 +24,6 @@
|
||||
<br><sub><b>Neon Drive</b>: a Pathfinder-cut sun, live Outer Glow on the type and grid, and clipping masks · <code>examples/neon-drive.vectorcraft</code></sub>
|
||||
</p>
|
||||
|
||||
> [!NOTE]
|
||||
> **ArtCraft is a community of artists from all walks of life.** Digital, generative, music,
|
||||
> games — if you make things, you're one of us. **[Come say hi on Discord](https://discord.gg/artcraft).**
|
||||
|
||||
<p align="center">
|
||||
<a href="#a-look-around">A look around</a> ·
|
||||
<a href="#made-in-vectorcraft">Made in VectorCraft</a> ·
|
||||
@@ -249,9 +225,7 @@ signed and published. Every bundled asset is listed with its licence in [`ASSETS
|
||||
|
||||
## Downloads
|
||||
|
||||
**New to VectorCraft?** Download it from the [VectorCraft page on getartcraft.com](https://getartcraft.com/apps/vectorcraft). That's the easiest way to install it.
|
||||
|
||||
**Want a specific build or format?** On GitHub, the [latest release](https://github.com/storytold/vectorcraft/releases/latest) has every build listed below, and [all releases](https://github.com/storytold/vectorcraft/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.
|
||||
On GitHub, the [latest release](https://github.com/storytold/vectorcraft/releases/latest) has every build listed below, and [all releases](https://github.com/storytold/vectorcraft/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
|
||||
|
||||
@@ -295,42 +269,19 @@ Installers and executables are code-signed.
|
||||
## The Crafting Apps
|
||||
|
||||
VectorCraft 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 · you are here** | [GitHub](https://github.com/storytold/vectorcraft) | [Website](https://getartcraft.com/apps/vectorcraft) |
|
||||
| <img src="https://raw.githubusercontent.com/storytold/filmcraft/main/assets/app-icon/hicolor/64x64/apps/ai.storyteller.filmcraft.png" alt="" width="32" height="32"> | **FilmCraft** | Video editing, color and sound | [GitHub](https://github.com/storytold/filmcraft) | [Website](https://getartcraft.com/apps/filmcraft) |
|
||||
| <img src="https://raw.githubusercontent.com/storytold/lightcraft/main/assets/app-icon/hicolor/64x64/apps/ai.storyteller.lightcraft.png" alt="" width="32" height="32"> | **LightCraft** | Photo library and raw development | [GitHub](https://github.com/storytold/lightcraft) | [Website](https://getartcraft.com/apps/lightcraft) |
|
||||
| <img src="https://raw.githubusercontent.com/storytold/pdfcraft/main/assets/app-icon/hicolor/64x64/apps/ai.storyteller.pdfcraft.png" alt="" width="32" height="32"> | **PdfCraft** | Reading, organizing and protecting PDFs | [GitHub](https://github.com/storytold/pdfcraft) | [Website](https://getartcraft.com/apps/pdfcraft) |
|
||||
| <img src="https://raw.githubusercontent.com/storytold/effectcraft/main/assets/app-icon/hicolor/64x64/apps/ai.storyteller.effectcraft.png" alt="" width="32" height="32"> | **EffectCraft** | Motion graphics and visual effects | [GitHub](https://github.com/storytold/effectcraft) | [Website](https://getartcraft.com/apps/effectcraft) |
|
||||
| <img src="https://raw.githubusercontent.com/storytold/designcraft/main/assets/app-icon/hicolor/64x64/apps/ai.storyteller.designcraft.png" alt="" width="32" height="32"> | **DesignCraft** | Page layout and publishing | [GitHub](https://github.com/storytold/designcraft) | [Website](https://getartcraft.com/apps/designcraft) |
|
||||
| | 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 · you are here** | [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 | [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/vectorcraft">VectorCraft</a>
|
||||
</p>
|
||||
|
||||
## Star history
|
||||
|
||||
@@ -349,14 +300,4 @@ Simplified Chinese and Arabic faces; SIL Open Font License 1.1).
|
||||
The app icon (an engraved dragon on VectorCraft red, `#e8573f`) is the owner's original artwork; its
|
||||
palette and files are in [`assets/app-icon/`](assets/app-icon/README.md).
|
||||
|
||||
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 VectorCraft, 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. VectorCraft 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>
|
||||
|
||||
<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>
|
||||
|
||||
@@ -512,7 +512,7 @@ fn services(parent: Parent, ui: egui::Context) -> Services {
|
||||
// owner that never answers holds a read for up to 4 s. Windows only asks which formats the
|
||||
// clipboard holds and macOS asks the pasteboard server, so they check in line.
|
||||
clipboard_probe: cfg!(target_os = "linux").then(|| Box::new(clipboard::system_clipboard) as ClipboardProbeFactory),
|
||||
// Help → Discord / website / GitHub, the Discord button, About and Home links.
|
||||
// Help → GitHub, About and Home links.
|
||||
open_url: Some(Box::new(|url: &str| {
|
||||
let _ = webbrowser::open(url);
|
||||
})),
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
VectorCraft app icon (vectorcraft.svg, vectorcraft-small.svg and every file derived from them in this
|
||||
directory: vectorcraft-1024.png, vectorcraft-macos-512.png, vectorcraft.icns, vectorcraft.ico, hicolor/).
|
||||
|
||||
Original artwork made for this project by the project owner, drawn in ArtCraft and vectorised for
|
||||
Original artwork made for this project by the project owner, drawn by hand and vectorised for
|
||||
VectorCraft (no third-party material). Licensed like the rest of VectorCraft, under either of
|
||||
|
||||
* Apache License, Version 2.0 (https://www.apache.org/licenses/LICENSE-2.0)
|
||||
|
||||
@@ -16,7 +16,7 @@ head-and-shoulders portrait on a full-bleed field, no frame or roundel, with the
|
||||
**Tile:** `viewBox="0 0 512 512"`, a rounded square with `rx=112`, clipped. The macOS files add Apple's
|
||||
transparent margin (tile = 824/1024 of the canvas); Windows and Linux use the tile edge to edge.
|
||||
|
||||
**Provenance:** the owner's original ArtCraft drawing (2880 px, keyed to the palette), vectorised with
|
||||
**Provenance:** the owner's original drawing (2880 px, keyed to the palette), vectorised with
|
||||
craftrules `assets/logo-options/_tools/vectorize_tile.py`. The drawing is kept in craftrules at
|
||||
`craftrules/assets/app-icons/vectorcraft/source.png`, not here. `vectorcraft.svg` is the canonical
|
||||
artwork. Licence: see `LICENSE.txt`.
|
||||
|
||||
@@ -1,19 +1,11 @@
|
||||
//! Help → community and project links (the ArtCraft Discord, website, this app's page and its
|
||||
//! GitHub repository). The commands return the URL; the frontend opens it.
|
||||
//! Help → project links (this app's GitHub repository). The commands return the URL; the frontend opens it.
|
||||
|
||||
use serde_json::{Value, json};
|
||||
|
||||
use super::*;
|
||||
|
||||
/// The app's id on getartcraft.com and GitHub.
|
||||
/// The app's id on GitHub.
|
||||
pub const APP_ID: &str = "vectorcraft";
|
||||
pub const DISCORD_URL: &str = "https://discord.gg/artcraft";
|
||||
pub const WEBSITE_URL: &str = "https://getartcraft.com";
|
||||
|
||||
/// This app's page on the website.
|
||||
pub fn app_page_url() -> String {
|
||||
format!("{WEBSITE_URL}/apps/{APP_ID}")
|
||||
}
|
||||
|
||||
/// This app's source repository.
|
||||
pub fn github_url() -> String {
|
||||
@@ -22,12 +14,9 @@ pub fn github_url() -> String {
|
||||
|
||||
pub fn specs() -> Vec<CommandSpec> {
|
||||
vec![
|
||||
cmd!(query "help.discord", "Join Our Discord", ["Help"], None, "{} → {url} the ArtCraft community Discord", always, |_, _| url(DISCORD_URL.into())),
|
||||
cmd!(query "help.website", "ArtCraft Website", ["Help"], None, "{} → {url}", always, |_, _| url(WEBSITE_URL.into())),
|
||||
cmd!(query "help.appPage", "VectorCraft on getartcraft.com", ["Help"], None, "{} → {url} this app's page", always, |_, _| url(app_page_url())),
|
||||
cmd!(query "help.github", "VectorCraft on GitHub", ["Help"], None, "{} → {url} source code, issues and releases", always, |_, _| url(github_url())),
|
||||
cmd!(query "help.links", "Links", [], None, "{} → {discord, website, appPage, github}", always, |_, _| {
|
||||
Ok(json!({ "discord": DISCORD_URL, "website": WEBSITE_URL, "appPage": app_page_url(), "github": github_url() }))
|
||||
cmd!(query "help.links", "Links", [], None, "{} → {github}", always, |_, _| {
|
||||
Ok(json!({ "github": github_url() }))
|
||||
}),
|
||||
]
|
||||
}
|
||||
@@ -43,9 +32,7 @@ mod tests {
|
||||
#[test]
|
||||
fn links() {
|
||||
let mut s = Session::new();
|
||||
assert_eq!(s.execute("help.discord", &json!({})).unwrap()["url"], "https://discord.gg/artcraft");
|
||||
assert_eq!(s.execute("help.appPage", &json!({})).unwrap()["url"], "https://getartcraft.com/apps/vectorcraft");
|
||||
assert_eq!(s.execute("help.github", &json!({})).unwrap()["url"], "https://github.com/storytold/vectorcraft");
|
||||
assert_eq!(s.execute("help.links", &json!({})).unwrap()["website"], "https://getartcraft.com");
|
||||
assert_eq!(s.execute("help.links", &json!({})).unwrap()["github"], "https://github.com/storytold/vectorcraft");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -81,6 +81,18 @@ pub const UNITS: &[(&str, &str)] = &[
|
||||
("yards", "Yards"),
|
||||
("feet", "Feet"),
|
||||
];
|
||||
/// User Interface › Brightness (`uiBrightness`): the UI's themes. `vectorcraft_ui_egui::theme::Brightness`
|
||||
/// draws them; a test there keeps the two lists equal.
|
||||
pub const UI_THEMES: &[(&str, &str)] = &[
|
||||
("dark", "Dark"),
|
||||
("mediumDark", "Medium Dark"),
|
||||
("mediumLight", "Medium Light"),
|
||||
("light", "Light"),
|
||||
("catppuccinLatte", "Catppuccin Latte"),
|
||||
("catppuccinFrappe", "Catppuccin Frappé"),
|
||||
("catppuccinMacchiato", "Catppuccin Macchiato"),
|
||||
("catppuccinMocha", "Catppuccin Mocha"),
|
||||
];
|
||||
const LINE_STYLE: &[(&str, &str)] = &[("lines", "Lines"), ("dots", "Dots")];
|
||||
/// Performance › Graphics Processor (`gpuPreference`), read by the desktop app at startup. The
|
||||
/// values are WebGPU's power preferences plus `automatic`; 0.5.0's default, `powerSaving`, reads as
|
||||
@@ -258,13 +270,7 @@ pub const PREF_SPECS: &[PrefSpec] = &[
|
||||
p!("scratchPrimary", "Performance & Storage", "Scratch Disks", "Primary", text),
|
||||
p!("scratchSecondary", "Performance & Storage", "Scratch Disks", "Secondary", text),
|
||||
// User Interface
|
||||
p!(
|
||||
"uiBrightness",
|
||||
"User Interface",
|
||||
"",
|
||||
"Brightness",
|
||||
choice(&[("dark", "Dark"), ("mediumDark", "Medium Dark"), ("mediumLight", "Medium Light"), ("light", "Light")])
|
||||
),
|
||||
p!("uiBrightness", "User Interface", "", "Brightness", choice(UI_THEMES)),
|
||||
p!(
|
||||
"canvasColor",
|
||||
"User Interface",
|
||||
|
||||
@@ -941,7 +941,7 @@ fn segment_picks_and_deliberate_anchor_picks_delete_different_components() {
|
||||
|
||||
#[test]
|
||||
fn pen_with_alt_moves_one_handle_and_converts_anchors() {
|
||||
// Discord feedback: Alt held with the Pen moves a direction handle on its own (and works as
|
||||
// User feedback: Alt held with the Pen moves a direction handle on its own (and works as
|
||||
// the Anchor Point tool on a selected path's anchors), while a path is being drawn too.
|
||||
let alt = Mods { alt: true, ..Mods::default() };
|
||||
let v = view();
|
||||
|
||||
@@ -289,7 +289,7 @@ fn reshape_area_is_a_registered_command() {
|
||||
assert!(session().commands().iter().any(|c| c.id == "text.reshapeArea" && c.enabled));
|
||||
}
|
||||
|
||||
/// The Discord report: type in a frame dragged with the Type tool, then the Selection tool. Its
|
||||
/// The user report: type in a frame dragged with the Type tool, then the Selection tool. Its
|
||||
/// bounding box resizes the type area (the text reflows at its size), it doesn't scale the type.
|
||||
#[test]
|
||||
fn type_in_a_dragged_frame_resizes_with_the_selection_tool() {
|
||||
|
||||
@@ -19,7 +19,7 @@ const MARK: f32 = 18.0;
|
||||
/// Height of the workspace switcher.
|
||||
const WIDGET_H: f32 = 22.0;
|
||||
|
||||
/// The application bar: brand mark, Home, menus, then Discord, search and the workspace switcher
|
||||
/// The application bar: brand mark, Home, menus, then search and the workspace switcher
|
||||
/// at the right. With [`VectorcraftApp::custom_titlebar`] it is also the window's title bar
|
||||
/// ([`titlebar`]): the caption buttons take the right end and the rest of the bar drags the window.
|
||||
/// With the system title bar (Windows and Linux, `system_title_bar`) the OS draws its own icon and
|
||||
@@ -49,7 +49,7 @@ pub fn app_bar(app: &mut VectorcraftApp, ui: &mut Ui) {
|
||||
// With the macOS menu bar the menus are at the top of the screen instead.
|
||||
let menus_end = if app.services.native_menu.is_some() { ui.cursor().min.x } else { menus::menu_bar(app, ui) };
|
||||
// The right-side group fills the space after the menus from the right; when it runs
|
||||
// short, Discord goes first (it is also under Help), then the search icon (the palette
|
||||
// short, the search icon goes first (the palette
|
||||
// stays under its shortcut), then the workspace switcher narrows.
|
||||
let full = ui.max_rect();
|
||||
let right_edge = if custom { full.right() - titlebar::WIDTH - 10.0 } else { full.right() };
|
||||
@@ -65,7 +65,6 @@ pub fn app_bar(app: &mut VectorcraftApp, ui: &mut Ui) {
|
||||
let icon = 28.0;
|
||||
let search = room >= 64.0 + 8.0 + gap + icon;
|
||||
let ws_w = ws_w.min(room - 8.0 - gap - if search { icon } else { 0.0 }).max(64.0);
|
||||
let discord = search && room >= ws_w + 8.0 + gap + icon + 10.0 + gap + crate::community::discord_width(ui, false);
|
||||
let mut rui = ui.new_child(egui::UiBuilder::new().max_rect(right).layout(egui::Layout::right_to_left(egui::Align::Center)));
|
||||
let ui = &mut rui;
|
||||
// Workspace switcher: shows the current workspace, opens Window → Workspace.
|
||||
@@ -87,10 +86,6 @@ pub fn app_bar(app: &mut VectorcraftApp, ui: &mut Ui) {
|
||||
app.ui.palette_query.clear();
|
||||
}
|
||||
}
|
||||
if discord {
|
||||
ui.add_space(10.0);
|
||||
crate::community::discord_button(app, ui, false);
|
||||
}
|
||||
if app.services.native_menu.is_some() {
|
||||
let title = ui.painter().layout_no_wrap("VectorCraft".into(), egui::FontId::proportional(13.5), t.text);
|
||||
let title_rect = egui::Rect::from_center_size(full.center(), title.size());
|
||||
|
||||
@@ -1,45 +1,10 @@
|
||||
//! Community and project links: the Discord button (header, About, Home) and the link list.
|
||||
//! Icons are Lucide's (ISC); Discord's own logo is a trademark, so the button uses a chat icon
|
||||
//! on Discord's colour with the word "Discord".
|
||||
//! Project links (About, Home). Icons are Lucide's (ISC).
|
||||
|
||||
use egui::{Color32, CornerRadius, Sense, Ui, vec2};
|
||||
use egui::Ui;
|
||||
|
||||
use crate::theme::{self, Tokens};
|
||||
use crate::theme::Tokens;
|
||||
use crate::{VectorcraftApp, icons};
|
||||
|
||||
/// Discord's brand colour (a colour, not a logo).
|
||||
const DISCORD: Color32 = Color32::from_rgb(0x58, 0x65, 0xF2);
|
||||
|
||||
/// The Discord button's label, height and width.
|
||||
fn discord_layout(ui: &Ui, large: bool) -> (std::sync::Arc<egui::Galley>, f32, f32) {
|
||||
let (h, font, label) = if large { (36.0, theme::semibold(14.0), tl!("Join our Discord")) } else { (24.0, theme::semibold(12.0), "Discord") };
|
||||
let galley = ui.painter().layout_no_wrap(label.to_string(), font, Color32::WHITE);
|
||||
let w = galley.size().x + h * 0.55 + h * 0.9;
|
||||
(galley, h, w)
|
||||
}
|
||||
|
||||
/// The Discord button's width (the app bar drops it when space runs out).
|
||||
pub fn discord_width(ui: &Ui, large: bool) -> f32 {
|
||||
discord_layout(ui, large).2
|
||||
}
|
||||
|
||||
/// A Discord pill button: compact for the header, large for About / Home.
|
||||
pub fn discord_button(app: &mut VectorcraftApp, ui: &mut Ui, large: bool) -> egui::Response {
|
||||
let (galley, h, w) = discord_layout(ui, large);
|
||||
let icon = h * 0.55;
|
||||
let (r, resp) = ui.allocate_exact_size(vec2(w, h), Sense::click());
|
||||
let fill = if resp.hovered() { DISCORD.gamma_multiply(0.85) } else { DISCORD };
|
||||
ui.painter().rect_filled(r, CornerRadius::same((h / 2.0) as u8), fill);
|
||||
let ir = egui::Rect::from_center_size(r.left_center() + vec2(h * 0.35 + icon / 2.0, 0.0), vec2(icon, icon));
|
||||
icons::paint(ui, "message-circle", ir, Color32::WHITE);
|
||||
ui.painter().galley(egui::pos2(ir.right() + h * 0.2, r.center().y - galley.size().y / 2.0), galley, Color32::WHITE);
|
||||
let resp = resp.on_hover_text(tl!("Join the ArtCraft community on Discord (discord.gg/artcraft)"));
|
||||
if resp.clicked() {
|
||||
app.open_link("help.discord");
|
||||
}
|
||||
resp
|
||||
}
|
||||
|
||||
/// One link row: icon, label, opens the command's URL.
|
||||
fn link(app: &mut VectorcraftApp, ui: &mut Ui, icon: &str, label: &str, cmd: &str, url: &str) {
|
||||
let t = Tokens::get(ui.ctx());
|
||||
@@ -52,20 +17,17 @@ fn link(app: &mut VectorcraftApp, ui: &mut Ui, icon: &str, label: &str, cmd: &st
|
||||
});
|
||||
}
|
||||
|
||||
/// The Discord button and the website / app page / GitHub links.
|
||||
/// The GitHub link.
|
||||
pub fn links(app: &mut VectorcraftApp, ui: &mut Ui) {
|
||||
discord_button(app, ui, true);
|
||||
ui.add_space(8.0);
|
||||
let l = app.session.execute("help.links", &serde_json::json!({})).unwrap_or_default();
|
||||
let s = |k: &str| l[k].as_str().unwrap_or("").to_string();
|
||||
link(app, ui, "globe", tl!("ArtCraft website"), "help.website", &s("website"));
|
||||
link(app, ui, "external-link", tl!("VectorCraft on getartcraft.com"), "help.appPage", &s("appPage"));
|
||||
link(app, ui, "git-branch", tl!("Source code on GitHub"), "help.github", &s("github"));
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
use crate::theme;
|
||||
|
||||
#[test]
|
||||
fn link_clicks_open_the_right_urls() {
|
||||
@@ -74,22 +36,12 @@ mod tests {
|
||||
let o = opened.clone();
|
||||
let services = crate::Services { open_url: Some(Box::new(move |u: &str| o.lock().unwrap().push(u.to_string()))), ..Default::default() };
|
||||
let mut app = VectorcraftApp::new(vectorcraft_engine::Session::new(), services);
|
||||
for id in ["help.discord", "help.website", "help.appPage", "help.github"] {
|
||||
crate::menus::invoke(&mut app, id, serde_json::json!({}));
|
||||
}
|
||||
assert_eq!(
|
||||
*opened.lock().unwrap(),
|
||||
[
|
||||
"https://discord.gg/artcraft",
|
||||
"https://getartcraft.com",
|
||||
"https://getartcraft.com/apps/vectorcraft",
|
||||
"https://github.com/storytold/vectorcraft"
|
||||
]
|
||||
);
|
||||
crate::menus::invoke(&mut app, "help.github", serde_json::json!({}));
|
||||
assert_eq!(*opened.lock().unwrap(), ["https://github.com/storytold/vectorcraft"]);
|
||||
// The control channel / MCP path returns the URL without opening a browser.
|
||||
let v = app.run("help.discord", serde_json::json!({})).unwrap();
|
||||
assert_eq!(v["url"], "https://discord.gg/artcraft");
|
||||
assert_eq!(opened.lock().unwrap().len(), 4);
|
||||
let v = app.run("help.github", serde_json::json!({})).unwrap();
|
||||
assert_eq!(v["url"], "https://github.com/storytold/vectorcraft");
|
||||
assert_eq!(opened.lock().unwrap().len(), 1);
|
||||
let ctx = egui::Context::default();
|
||||
theme::install_fonts(&ctx);
|
||||
let mut out = ctx.run_ui(egui::RawInput::default(), |ui| links(&mut app, ui));
|
||||
|
||||
@@ -63,10 +63,8 @@ fn about_tab(app: &mut VectorcraftApp, ui: &mut egui::Ui) {
|
||||
crate::community::links(app, ui);
|
||||
ui.add_space(12.0);
|
||||
ui.label(
|
||||
egui::RichText::new(tl!(
|
||||
"Part of ArtCraft. MIT OR Apache-2.0. Fonts: Source Sans 3, Inter, JetBrains Mono (OFL). Icons: Lucide (ISC) + VectorCraft."
|
||||
))
|
||||
.size(11.0),
|
||||
egui::RichText::new(tl!("MIT OR Apache-2.0. Fonts: Source Sans 3, Inter, JetBrains Mono (OFL). Icons: Lucide (ISC) + VectorCraft."))
|
||||
.size(11.0),
|
||||
);
|
||||
// The GPU the window renders with, for bug reports (Preferences › Performance picks it).
|
||||
if let Some(adapter) = &app.graphics_adapter {
|
||||
|
||||
@@ -26,7 +26,6 @@
|
||||
About VectorCraft O aplikaci VectorCraft
|
||||
Align to Path Zarovnat k cestě
|
||||
Cut Path at Selected Anchor Points Rozdělit cestu ve vybraných kotevních bodech
|
||||
Join Our Discord Připojit se k našemu Discordu
|
||||
Language Jazyk
|
||||
UI Brightness Jas rozhraní
|
||||
Dark Tmavý
|
||||
@@ -616,8 +615,6 @@
|
||||
Save Swatch Library… Uložit knihovnu vzorníku…
|
||||
Symbol Libraries Knihovny symbolů
|
||||
Help Nápověda
|
||||
ArtCraft Website Web ArtCraft
|
||||
VectorCraft on getartcraft.com VectorCraft na getartcraft.com
|
||||
VectorCraft on GitHub VectorCraft na GitHubu
|
||||
Search Commands… Hledat příkazy…
|
||||
VectorCraft Help… Nápověda VectorCraft…
|
||||
@@ -1786,8 +1783,8 @@ lighting Light Světlo
|
||||
|
||||
# Dialogs
|
||||
Graphics: {adapter} Grafika: {adapter}
|
||||
Part of ArtCraft. MIT OR Apache-2.0. Fonts: Source Sans 3, Inter, JetBrains Mono (OFL). Icons: Lucide (ISC) + VectorCraft. Součást ArtCraft. MIT OR Apache-2.0. Písma: Source Sans 3, Inter, JetBrains Mono (OFL). Ikony: Lucide (ISC) + VectorCraft.
|
||||
Part of ArtCraft. MIT OR Apache-2.0. Fonts: Source Sans 3, Inter, JetBrains Mono, Noto Sans SC (OFL). Icons: Lucide (ISC) + VectorCraft. Součást ArtCraft. MIT OR Apache-2.0. Písma: Source Sans 3, Inter, JetBrains Mono, Noto Sans SC (OFL). Ikony: Lucide (ISC) + VectorCraft.
|
||||
MIT OR Apache-2.0. Fonts: Source Sans 3, Inter, JetBrains Mono (OFL). Icons: Lucide (ISC) + VectorCraft. MIT OR Apache-2.0. Písma: Source Sans 3, Inter, JetBrains Mono (OFL). Ikony: Lucide (ISC) + VectorCraft.
|
||||
MIT OR Apache-2.0. Fonts: Source Sans 3, Inter, JetBrains Mono, Noto Sans SC (OFL). Icons: Lucide (ISC) + VectorCraft. MIT OR Apache-2.0. Písma: Source Sans 3, Inter, JetBrains Mono, Noto Sans SC (OFL). Ikony: Lucide (ISC) + VectorCraft.
|
||||
Version {version} — open-source vector illustration in pure Rust. Verze {version} — open-source vektorová ilustrace v čistém Rustu.
|
||||
Align to Page Zarovnat ke stránce
|
||||
Smooth Color Plynulá barva
|
||||
@@ -3416,10 +3413,6 @@ effect Regular Pravidelný
|
||||
Recent Files Nedávné soubory
|
||||
Vector illustration — fast, open, scriptable. Vektorová ilustrace — rychlá, otevřená, skriptovatelná.
|
||||
Welcome to VectorCraft Vítejte ve VectorCraftu
|
||||
ArtCraft website Web ArtCraft
|
||||
Discord Discord
|
||||
Join our Discord Připojit se k našemu Discordu
|
||||
Join the ArtCraft community on Discord (discord.gg/artcraft) Připojte se ke komunitě ArtCraft na Discordu (discord.gg/artcraft)
|
||||
Source code on GitHub Zdrojový kód na GitHubu
|
||||
All Tools Všechny nástroje
|
||||
Draw Kresba
|
||||
@@ -3838,7 +3831,7 @@ effect Regular Pravidelný
|
||||
@msg bad trailer chybný trailer
|
||||
@msg balance must be between 0 and 100 vyvážení musí být mezi 0 a 100
|
||||
@msg batch step {_1} (`{id}`) failed: {e} krok dávky {_1} (`{id}`) selhal: {e}
|
||||
@msg brightness must be dark|mediumDark|mediumLight|light jas musí být dark|mediumDark|mediumLight|light
|
||||
@msg brightness must be {_1} jas musí být {_1}
|
||||
@msg can't encode the document: {0} dokument nelze zakódovat: {0}
|
||||
@msg can't parse shortcut `{c}` klávesovou zkratku `{c}` nelze analyzovat
|
||||
@msg can't parse shortcut `{s}` for `{k}` klávesovou zkratku `{s}` pro `{k}` nelze analyzovat
|
||||
@@ -4685,3 +4678,8 @@ mark-style Japanese Japonské
|
||||
@msg unknown parameter `{key}`; the command takes: {keys} neznámý parametr `{key}`; příkaz přijímá: {keys}
|
||||
Load EPS into Clipboard Načíst EPS do schránky
|
||||
@msg an image of {w} × {h} pixels is too large to draw obraz o velikosti {w} × {h} obrazových bodů je příliš velký na vykreslení
|
||||
Theme Motiv
|
||||
Catppuccin Latte Catppuccin Latte
|
||||
Catppuccin Frappé Catppuccin Frappé
|
||||
Catppuccin Macchiato Catppuccin Macchiato
|
||||
Catppuccin Mocha Catppuccin Mocha
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -210,8 +210,6 @@
|
||||
Artboard {number} Zeichenfläche {number}
|
||||
Artboard: Zeichenfläche:
|
||||
Artboards Zeichenflächen
|
||||
ArtCraft Website ArtCraft-Website
|
||||
ArtCraft website ArtCraft-Website
|
||||
Artwork Colors Farben der Grafik
|
||||
As Multiple Assets Als mehrere Assets
|
||||
As Single Asset Als einzelnes Asset
|
||||
@@ -673,7 +671,6 @@
|
||||
Discard Recovered Documents Wiederhergestellte Dokumente verwerfen
|
||||
Discard White Overprint in Output Weißes Überdrucken in der Ausgabe verwerfen
|
||||
Discarded {} recovered document(s) {} wiederhergestellte(s) Dokument(e) verworfen
|
||||
Discord Discord
|
||||
Discretionary Hyphen Bedingter Trennstrich
|
||||
Discretionary Ligatures Bedingte Ligaturen
|
||||
Display All Blacks Accurately Alle Schwarztöne genau anzeigen
|
||||
@@ -1295,9 +1292,6 @@
|
||||
Italian Italienisch
|
||||
Japanese Japanisch
|
||||
Join Zusammenfügen
|
||||
Join Our Discord Unserem Discord beitreten
|
||||
Join our Discord Unserem Discord beitreten
|
||||
Join the ArtCraft community on Discord (discord.gg/artcraft) Treten Sie der ArtCraft-Community auf Discord bei (discord.gg/artcraft)
|
||||
Join the lines of each paragraph Die Zeilen jedes Absatzes verbinden
|
||||
Join Tool Zusammenfügen-Werkzeug
|
||||
Justification… Abstände…
|
||||
@@ -1859,7 +1853,7 @@
|
||||
Paragraph Style Options Absatzformatoptionen
|
||||
Paragraph Styles Absatzformate
|
||||
Paragraph Symbol Absatzmarke
|
||||
Part of ArtCraft. MIT OR Apache-2.0. Fonts: Source Sans 3, Inter, JetBrains Mono (OFL). Icons: Lucide (ISC) + VectorCraft. Teil von ArtCraft. MIT OR Apache-2.0. Schriften: Source Sans 3, Inter, JetBrains Mono (OFL). Symbole: Lucide (ISC) + VectorCraft.
|
||||
MIT OR Apache-2.0. Fonts: Source Sans 3, Inter, JetBrains Mono (OFL). Icons: Lucide (ISC) + VectorCraft. MIT OR Apache-2.0. Schriften: Source Sans 3, Inter, JetBrains Mono (OFL). Symbole: Lucide (ISC) + VectorCraft.
|
||||
Password Kennwort
|
||||
Paste Einfügen
|
||||
Paste in Back Dahinter einfügen
|
||||
@@ -3038,7 +3032,6 @@ effect Points Punkte
|
||||
Vector illustration — fast, open, scriptable. Vektorillustration – schnell, offen, skriptfähig.
|
||||
VectorCraft didn't quit normally last time. These documents had unsaved changes: VectorCraft wurde beim letzten Mal nicht normal beendet. Diese Dokumente hatten ungespeicherte Änderungen:
|
||||
VectorCraft Help… VectorCraft-Hilfe…
|
||||
VectorCraft on getartcraft.com VectorCraft auf getartcraft.com
|
||||
VectorCraft on GitHub VectorCraft auf GitHub
|
||||
Vectors Vektoren
|
||||
Version {version} — open-source vector illustration in pure Rust. Version {version} – Open-Source-Vektorillustration in reinem Rust.
|
||||
@@ -3439,7 +3432,7 @@ theme Appearance Erscheinungsbild
|
||||
@msg bad trailer fehlerhafter Trailer
|
||||
@msg balance must be between 0 and 100 balance muss zwischen 0 und 100 liegen
|
||||
@msg batch step {_1} (`{id}`) failed: {e} Stapelschritt {_1} (`{id}`) ist fehlgeschlagen: {e}
|
||||
@msg brightness must be dark|mediumDark|mediumLight|light brightness muss dark|mediumDark|mediumLight|light sein
|
||||
@msg brightness must be {_1} brightness muss {_1} sein
|
||||
@msg can't encode the document: {0} das Dokument kann nicht kodiert werden: {0}
|
||||
@msg can't parse shortcut `{c}` Tastaturbefehl `{c}` kann nicht ausgewertet werden
|
||||
@msg can't parse shortcut `{s}` for `{k}` Tastaturbefehl `{s}` für `{k}` kann nicht ausgewertet werden
|
||||
@@ -4208,3 +4201,8 @@ theme Appearance Erscheinungsbild
|
||||
@msg unknown parameter `{key}`; the command takes: {keys} unbekannter Parameter `{key}`; der Befehl akzeptiert: {keys}
|
||||
Load EPS into Clipboard EPS in die Zwischenablage laden
|
||||
@msg an image of {w} × {h} pixels is too large to draw ein Bild mit {w} × {h} Pixeln ist zu groß, um gezeichnet zu werden
|
||||
Theme Thema
|
||||
Catppuccin Latte Catppuccin Latte
|
||||
Catppuccin Frappé Catppuccin Frappé
|
||||
Catppuccin Macchiato Catppuccin Macchiato
|
||||
Catppuccin Mocha Catppuccin Mocha
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -228,8 +228,6 @@
|
||||
Artboard {number} Mesa de trabajo {number}
|
||||
Artboard: Mesa de trabajo:
|
||||
Artboards Mesas de trabajo
|
||||
ArtCraft Website Sitio web de ArtCraft
|
||||
ArtCraft website Sitio web de ArtCraft
|
||||
Artwork Colors Colores de la ilustración
|
||||
As Multiple Assets Como varios recursos
|
||||
As Single Asset Como un solo recurso
|
||||
@@ -687,7 +685,6 @@
|
||||
Discard Recovered Documents Descartar documentos recuperados
|
||||
Discard White Overprint in Output Descartar sobreimpresión de blanco en la salida
|
||||
Discarded {} recovered document(s) Se descartaron {} documento(s) recuperado(s)
|
||||
Discord Discord
|
||||
Discretionary Hyphen Guion discrecional
|
||||
Discretionary Ligatures Ligaduras discrecionales
|
||||
Display All Blacks Accurately Mostrar todos los negros con precisión
|
||||
@@ -1313,9 +1310,6 @@
|
||||
Italian Italiano
|
||||
Japanese Japonés
|
||||
Join Unir
|
||||
Join Our Discord Únete a nuestro Discord
|
||||
Join our Discord Únete a nuestro Discord
|
||||
Join the ArtCraft community on Discord (discord.gg/artcraft) Únete a la comunidad de ArtCraft en Discord (discord.gg/artcraft)
|
||||
Join the lines of each paragraph Unir las líneas de cada párrafo
|
||||
Join Tool Herramienta Unir
|
||||
Justification… Justificación…
|
||||
@@ -1910,7 +1904,7 @@
|
||||
Paragraph Style Options Opciones de estilo de párrafo
|
||||
Paragraph Styles Estilos de párrafo
|
||||
Paragraph Symbol Símbolo de párrafo
|
||||
Part of ArtCraft. MIT OR Apache-2.0. Fonts: Source Sans 3, Inter, JetBrains Mono (OFL). Icons: Lucide (ISC) + VectorCraft. Parte de ArtCraft. MIT OR Apache-2.0. Fuentes: Source Sans 3, Inter, JetBrains Mono (OFL). Iconos: Lucide (ISC) + VectorCraft.
|
||||
MIT OR Apache-2.0. Fonts: Source Sans 3, Inter, JetBrains Mono (OFL). Icons: Lucide (ISC) + VectorCraft. MIT OR Apache-2.0. Fuentes: Source Sans 3, Inter, JetBrains Mono (OFL). Iconos: Lucide (ISC) + VectorCraft.
|
||||
Password Contraseña
|
||||
Paste Pegar
|
||||
Paste in Back Pegar detrás
|
||||
@@ -3138,7 +3132,6 @@
|
||||
Vector illustration — fast, open, scriptable. Ilustración vectorial: rápida, abierta y programable.
|
||||
VectorCraft didn't quit normally last time. These documents had unsaved changes: VectorCraft no se cerró correctamente la última vez. Estos documentos tenían cambios sin guardar:
|
||||
VectorCraft Help… Ayuda de VectorCraft…
|
||||
VectorCraft on getartcraft.com VectorCraft en getartcraft.com
|
||||
VectorCraft on GitHub VectorCraft en GitHub
|
||||
Vectors Vectores
|
||||
Version {version} — open-source vector illustration in pure Rust. Versión {version}: ilustración vectorial de código abierto en Rust puro.
|
||||
@@ -3539,7 +3532,7 @@ axis Both Ambos
|
||||
@msg bad trailer trailer no válido
|
||||
@msg balance must be between 0 and 100 el equilibrio debe estar entre 0 y 100
|
||||
@msg batch step {_1} (`{id}`) failed: {e} falló el paso {_1} del lote (`{id}`): {e}
|
||||
@msg brightness must be dark|mediumDark|mediumLight|light el brillo debe ser dark|mediumDark|mediumLight|light
|
||||
@msg brightness must be {_1} el brillo debe ser {_1}
|
||||
@msg can't encode the document: {0} no se puede codificar el documento: {0}
|
||||
@msg can't parse shortcut `{c}` no se puede interpretar el atajo `{c}`
|
||||
@msg can't parse shortcut `{s}` for `{k}` no se puede interpretar el atajo `{s}` de `{k}`
|
||||
@@ -4625,3 +4618,8 @@ mark-style Japanese Japonesas
|
||||
@msg unknown parameter `{key}`; the command takes: {keys} parámetro desconocido `{key}`; el comando acepta: {keys}
|
||||
Load EPS into Clipboard Cargar EPS en el portapapeles
|
||||
@msg an image of {w} × {h} pixels is too large to draw una imagen de {w} × {h} píxeles es demasiado grande para dibujarse
|
||||
Theme Tema
|
||||
Catppuccin Latte Catppuccin Latte
|
||||
Catppuccin Frappé Catppuccin Frappé
|
||||
Catppuccin Macchiato Catppuccin Macchiato
|
||||
Catppuccin Mocha Catppuccin Mocha
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -229,8 +229,6 @@
|
||||
Artboard {number} Plan de travail {number}
|
||||
Artboard: Plan de travail :
|
||||
Artboards Plans de travail
|
||||
ArtCraft Website Site web d’ArtCraft
|
||||
ArtCraft website Site web d’ArtCraft
|
||||
Artwork Colors Couleurs de l’illustration
|
||||
As Multiple Assets En plusieurs ressources
|
||||
As Single Asset En une seule ressource
|
||||
@@ -689,7 +687,6 @@
|
||||
Discard Recovered Documents Ignorer les documents récupérés
|
||||
Discard White Overprint in Output Ignorer la surimpression du blanc en sortie
|
||||
Discarded {} recovered document(s) {} document(s) récupéré(s) ignoré(s)
|
||||
Discord Discord
|
||||
Discretionary Hyphen Tiret conditionnel
|
||||
Discretionary Ligatures Ligatures conditionnelles
|
||||
Display All Blacks Accurately Afficher tous les noirs avec précision
|
||||
@@ -1312,9 +1309,6 @@
|
||||
Italian Italien
|
||||
Japanese Japonais
|
||||
Join Joindre
|
||||
Join Our Discord Rejoignez notre Discord
|
||||
Join our Discord Rejoignez notre Discord
|
||||
Join the ArtCraft community on Discord (discord.gg/artcraft) Rejoignez la communauté ArtCraft sur Discord (discord.gg/artcraft)
|
||||
Join the lines of each paragraph Joindre les lignes de chaque paragraphe
|
||||
Join Tool Outil Jonction
|
||||
Justification… Justification…
|
||||
@@ -1907,7 +1901,7 @@
|
||||
Paragraph Style Options Options de style de paragraphe
|
||||
Paragraph Styles Styles de paragraphe
|
||||
Paragraph Symbol Symbole de paragraphe
|
||||
Part of ArtCraft. MIT OR Apache-2.0. Fonts: Source Sans 3, Inter, JetBrains Mono (OFL). Icons: Lucide (ISC) + VectorCraft. Fait partie d’ArtCraft. MIT OR Apache-2.0. Polices : Source Sans 3, Inter, JetBrains Mono (OFL). Icônes : Lucide (ISC) + VectorCraft.
|
||||
MIT OR Apache-2.0. Fonts: Source Sans 3, Inter, JetBrains Mono (OFL). Icons: Lucide (ISC) + VectorCraft. MIT OR Apache-2.0. Polices : Source Sans 3, Inter, JetBrains Mono (OFL). Icônes : Lucide (ISC) + VectorCraft.
|
||||
Password Mot de passe
|
||||
Paste Coller
|
||||
Paste in Back Coller derrière
|
||||
@@ -3135,7 +3129,6 @@
|
||||
Vector illustration — fast, open, scriptable. Illustration vectorielle — rapide, ouverte, scriptable.
|
||||
VectorCraft didn't quit normally last time. These documents had unsaved changes: VectorCraft ne s’est pas fermé normalement la dernière fois. Ces documents comportaient des modifications non enregistrées :
|
||||
VectorCraft Help… Aide de VectorCraft…
|
||||
VectorCraft on getartcraft.com VectorCraft sur getartcraft.com
|
||||
VectorCraft on GitHub VectorCraft sur GitHub
|
||||
Vectors Vecteurs
|
||||
Version {version} — open-source vector illustration in pure Rust. Version {version} — illustration vectorielle open source en pur Rust.
|
||||
@@ -3536,7 +3529,7 @@ axis Both Les deux
|
||||
@msg bad trailer trailer non valide
|
||||
@msg balance must be between 0 and 100 l’équilibre doit être compris entre 0 et 100
|
||||
@msg batch step {_1} (`{id}`) failed: {e} l’étape {_1} du lot (`{id}`) a échoué : {e}
|
||||
@msg brightness must be dark|mediumDark|mediumLight|light la luminosité doit valoir dark|mediumDark|mediumLight|light
|
||||
@msg brightness must be {_1} la luminosité doit valoir {_1}
|
||||
@msg can't encode the document: {0} impossible d’encoder le document : {0}
|
||||
@msg can't parse shortcut `{c}` impossible d’interpréter le raccourci `{c}`
|
||||
@msg can't parse shortcut `{s}` for `{k}` impossible d’interpréter le raccourci `{s}` pour `{k}`
|
||||
@@ -4472,7 +4465,7 @@ lighting Light Lumière
|
||||
PDF/X-4:2010 PDF/X-4:2010
|
||||
PRs PR
|
||||
Page Cover 1640×624 Couverture de page 1640×624
|
||||
Part of ArtCraft. MIT OR Apache-2.0. Fonts: Source Sans 3, Inter, JetBrains Mono, Noto Sans SC (OFL). Icons: Lucide (ISC) + VectorCraft. Fait partie d’ArtCraft. MIT OR Apache-2.0. Polices : Source Sans 3, Inter, JetBrains Mono, Noto Sans SC (OFL). Icônes : Lucide (ISC) + VectorCraft.
|
||||
MIT OR Apache-2.0. Fonts: Source Sans 3, Inter, JetBrains Mono, Noto Sans SC (OFL). Icons: Lucide (ISC) + VectorCraft. MIT OR Apache-2.0. Polices : Source Sans 3, Inter, JetBrains Mono, Noto Sans SC (OFL). Icônes : Lucide (ISC) + VectorCraft.
|
||||
Pattern Swatches Nuances de motif
|
||||
Pen Plume
|
||||
Pentagram Pentagramme
|
||||
@@ -4684,3 +4677,8 @@ mark-style Japanese Japonais
|
||||
theme Appearance Apparence
|
||||
Load EPS into Clipboard Charger un EPS dans le presse-papiers
|
||||
@msg an image of {w} × {h} pixels is too large to draw une image de {w} × {h} pixels est trop grande pour être dessinée
|
||||
Theme Thème
|
||||
Catppuccin Latte Catppuccin Latte
|
||||
Catppuccin Frappé Catppuccin Frappé
|
||||
Catppuccin Macchiato Catppuccin Macchiato
|
||||
Catppuccin Mocha Catppuccin Mocha
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -335,8 +335,6 @@
|
||||
Artboard: Rajztábla:
|
||||
Artboards Rajztáblák
|
||||
Artboards: {n} Rajztáblák: {n}
|
||||
ArtCraft Website Az ArtCraft webhelye
|
||||
ArtCraft website Az ArtCraft webhelye
|
||||
Artwork Colors Grafika színei
|
||||
As Multiple Assets Több elemként
|
||||
As Single Asset Egy elemként
|
||||
@@ -928,7 +926,6 @@
|
||||
Discard Recovered Documents Helyreállított dokumentumok elvetése
|
||||
Discard White Overprint in Output Fehér felülnyomás elvetése a kimenetben
|
||||
Discarded {} recovered document(s) Elvetett helyreállított dokumentumok: {}
|
||||
Discord Discord
|
||||
Discretionary Hyphen Feltételes elválasztójel
|
||||
Discretionary Ligatures Választható ligatúrák
|
||||
Display All Blacks Accurately Minden fekete pontos megjelenítése
|
||||
@@ -1695,9 +1692,6 @@
|
||||
Its graphics, colors and text styles are deleted from this machine. A grafikái, színei és szövegstílusai törlődnek erről a gépről.
|
||||
Japanese Japán
|
||||
Join Összekapcsolás
|
||||
Join Our Discord Csatlakozz a Discordunkhoz
|
||||
Join our Discord Csatlakozz a Discordunkhoz
|
||||
Join the ArtCraft community on Discord (discord.gg/artcraft) Csatlakozz az ArtCraft-közösséghez a Discordon (discord.gg/artcraft)
|
||||
Join the lines of each paragraph Bekezdések sorainak összefűzése
|
||||
Join Tool Összekapcsolás
|
||||
Joins Csatlakozások
|
||||
@@ -2368,8 +2362,6 @@
|
||||
Paragraph Style Options Bekezdésstílus beállításai
|
||||
Paragraph Styles Bekezdésstílusok
|
||||
Paragraph Symbol Bekezdésjel
|
||||
Part of ArtCraft. MIT OR Apache-2.0. Fonts: Source Sans 3, Inter, JetBrains Mono (OFL). Icons: Lucide (ISC) + VectorCraft. Az ArtCraft része. MIT OR Apache-2.0. Betűtípusok: Source Sans 3, Inter, JetBrains Mono (OFL). Ikonok: Lucide (ISC) + VectorCraft.
|
||||
Part of ArtCraft. MIT OR Apache-2.0. Fonts: Source Sans 3, Inter, JetBrains Mono, Noto Sans SC (OFL). Icons: Lucide (ISC) + VectorCraft. Az ArtCraft része. MIT OR Apache-2.0. Betűtípusok: Source Sans 3, Inter, JetBrains Mono, Noto Sans SC (OFL). Ikonok: Lucide (ISC) + VectorCraft.
|
||||
Password Jelszó
|
||||
Paste Beillesztés
|
||||
Paste in Back Beillesztés mögé
|
||||
@@ -3780,7 +3772,6 @@
|
||||
VectorCraft documents: one locked object, updated when the file changes. VectorCraft-dokumentumok: egyetlen zárolt objektum, amely a fájl változásakor frissül.
|
||||
VectorCraft Generic CMYK (SWOP-like) VectorCraft általános CMYK (SWOP-szerű)
|
||||
VectorCraft Help… VectorCraft súgó…
|
||||
VectorCraft on getartcraft.com A VectorCraft a getartcraft.com oldalon
|
||||
VectorCraft on GitHub A VectorCraft a GitHubon
|
||||
VectorCraft Swatches (.vcswatches) VectorCraft-színminták (.vcswatches)
|
||||
Vectors Vektorok
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -228,8 +228,6 @@
|
||||
Artboard {number} Tavola da disegno {number}
|
||||
Artboard: Tavola da disegno:
|
||||
Artboards Tavole da disegno
|
||||
ArtCraft Website Sito web di ArtCraft
|
||||
ArtCraft website Sito web di ArtCraft
|
||||
Artwork Colors Colori della grafica
|
||||
As Multiple Assets Come più risorse
|
||||
As Single Asset Come risorsa unica
|
||||
@@ -687,7 +685,6 @@
|
||||
Discard Recovered Documents Scarta documenti recuperati
|
||||
Discard White Overprint in Output Scarta sovrastampa del bianco nell'output
|
||||
Discarded {} recovered document(s) Documenti recuperati scartati: {}
|
||||
Discord Discord
|
||||
Discretionary Hyphen Trattino facoltativo
|
||||
Discretionary Ligatures Legature facoltative
|
||||
Display All Blacks Accurately Visualizza tutti i neri con precisione
|
||||
@@ -1313,9 +1310,6 @@
|
||||
Italian Italiano
|
||||
Japanese Giapponese
|
||||
Join Unisci
|
||||
Join Our Discord Unisciti al nostro Discord
|
||||
Join our Discord Unisciti al nostro Discord
|
||||
Join the ArtCraft community on Discord (discord.gg/artcraft) Unisciti alla comunità di ArtCraft su Discord (discord.gg/artcraft)
|
||||
Join the lines of each paragraph Unisci le righe di ogni paragrafo
|
||||
Join Tool Strumento Unisci
|
||||
Justification… Giustificazione…
|
||||
@@ -1910,7 +1904,7 @@
|
||||
Paragraph Style Options Opzioni stile paragrafo
|
||||
Paragraph Styles Stili paragrafo
|
||||
Paragraph Symbol Segno di paragrafo
|
||||
Part of ArtCraft. MIT OR Apache-2.0. Fonts: Source Sans 3, Inter, JetBrains Mono (OFL). Icons: Lucide (ISC) + VectorCraft. Parte di ArtCraft. MIT OR Apache-2.0. Font: Source Sans 3, Inter, JetBrains Mono (OFL). Icone: Lucide (ISC) + VectorCraft.
|
||||
MIT OR Apache-2.0. Fonts: Source Sans 3, Inter, JetBrains Mono (OFL). Icons: Lucide (ISC) + VectorCraft. MIT OR Apache-2.0. Font: Source Sans 3, Inter, JetBrains Mono (OFL). Icone: Lucide (ISC) + VectorCraft.
|
||||
Password Password
|
||||
Paste Incolla
|
||||
Paste in Back Incolla dietro
|
||||
@@ -3138,7 +3132,6 @@
|
||||
Vector illustration — fast, open, scriptable. Illustrazione vettoriale — veloce, aperta, programmabile.
|
||||
VectorCraft didn't quit normally last time. These documents had unsaved changes: VectorCraft non si è chiuso correttamente l'ultima volta. Questi documenti avevano modifiche non salvate:
|
||||
VectorCraft Help… Aiuto di VectorCraft…
|
||||
VectorCraft on getartcraft.com VectorCraft su getartcraft.com
|
||||
VectorCraft on GitHub VectorCraft su GitHub
|
||||
Vectors Vettori
|
||||
Version {version} — open-source vector illustration in pure Rust. Versione {version} — illustrazione vettoriale open source in puro Rust.
|
||||
@@ -3539,7 +3532,7 @@ axis Both Entrambi
|
||||
@msg bad trailer trailer non valido
|
||||
@msg balance must be between 0 and 100 il bilanciamento deve essere compreso tra 0 e 100
|
||||
@msg batch step {_1} (`{id}`) failed: {e} il passaggio {_1} del batch (`{id}`) non è riuscito: {e}
|
||||
@msg brightness must be dark|mediumDark|mediumLight|light la luminosità deve essere dark|mediumDark|mediumLight|light
|
||||
@msg brightness must be {_1} la luminosità deve essere {_1}
|
||||
@msg can't encode the document: {0} impossibile codificare il documento: {0}
|
||||
@msg can't parse shortcut `{c}` impossibile interpretare la scelta rapida `{c}`
|
||||
@msg can't parse shortcut `{s}` for `{k}` impossibile interpretare la scelta rapida `{s}` per `{k}`
|
||||
@@ -4253,3 +4246,8 @@ lighting Light Luce
|
||||
@msg unknown parameter `{key}`; the command takes: {keys} parametro sconosciuto `{key}`; il comando accetta: {keys}
|
||||
Load EPS into Clipboard Carica EPS negli appunti
|
||||
@msg an image of {w} × {h} pixels is too large to draw un'immagine di {w} × {h} pixel è troppo grande per essere disegnata
|
||||
Theme Tema
|
||||
Catppuccin Latte Catppuccin Latte
|
||||
Catppuccin Frappé Catppuccin Frappé
|
||||
Catppuccin Macchiato Catppuccin Macchiato
|
||||
Catppuccin Mocha Catppuccin Mocha
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -45,7 +45,6 @@
|
||||
Favorites お気に入り
|
||||
Flip 反転
|
||||
Japanese 日本語
|
||||
Join Our Discord Discord に参加
|
||||
Line-end Punctuation Half Width 行末約物半角
|
||||
Mojikumi Set 文字組み
|
||||
Kinsoku Set 禁則処理
|
||||
@@ -644,8 +643,6 @@
|
||||
Save Swatch Library… スウォッチライブラリを保存…
|
||||
Symbol Libraries シンボルライブラリ
|
||||
Help ヘルプ
|
||||
ArtCraft Website ArtCraft の Web サイト
|
||||
VectorCraft on getartcraft.com getartcraft.com の VectorCraft
|
||||
VectorCraft on GitHub GitHub の VectorCraft
|
||||
Search Commands… コマンドを検索…
|
||||
VectorCraft Help… VectorCraft ヘルプ…
|
||||
@@ -852,7 +849,6 @@
|
||||
Arrange: Bring to Front 重ね順: 最前面へ
|
||||
Arrowheads: 矢印:
|
||||
Art using a deleted global swatch keeps its colour. 削除したグローバルスウォッチを使っているアートは、そのカラーを保持します。
|
||||
ArtCraft website ArtCraft の Web サイト
|
||||
Artboard Options アートボードオプション
|
||||
Artboard Options: edit with the Artboard tool アートボードオプション: アートボードツールで編集
|
||||
Artboard Options… アートボードオプション…
|
||||
@@ -1528,8 +1524,6 @@
|
||||
Isolate Group グループを分離
|
||||
Italian イタリア語
|
||||
Join Tool 結合ツール
|
||||
Join our Discord Discord に参加
|
||||
Join the ArtCraft community on Discord (discord.gg/artcraft) Discord で ArtCraft コミュニティに参加 (discord.gg/artcraft)
|
||||
Join the lines of each paragraph 段落内の行を連結
|
||||
Justification… 文字組み…
|
||||
Keep Formatting 書式を保持
|
||||
@@ -2941,7 +2935,6 @@
|
||||
Delete these {n} graphic styles? これら {n} 個のグラフィックスタイルを削除しますか?
|
||||
Delete this {n} graphic style? この {n} 個のグラフィックスタイルを削除しますか?
|
||||
Discarded {} recovered document(s) 復元したドキュメント {} 個を破棄しました
|
||||
Discord Discord
|
||||
Do Not Move 移動しない
|
||||
Document Swatches ドキュメントのスウォッチ
|
||||
Document profile ドキュメントプロファイル
|
||||
@@ -3094,7 +3087,7 @@
|
||||
Packaged {n} file(s){note} {n} 個のファイルをパッケージしました{note}
|
||||
Page information ページ情報
|
||||
Paragraph Style 段落スタイル
|
||||
Part of ArtCraft. MIT OR Apache-2.0. Fonts: Source Sans 3, Inter, JetBrains Mono (OFL). Icons: Lucide (ISC) + VectorCraft. ArtCraft の一員。MIT OR Apache-2.0。フォント:Source Sans 3、Inter、JetBrains Mono (OFL)。アイコン:Lucide (ISC) + VectorCraft。
|
||||
MIT OR Apache-2.0. Fonts: Source Sans 3, Inter, JetBrains Mono (OFL). Icons: Lucide (ISC) + VectorCraft. MIT OR Apache-2.0。フォント:Source Sans 3、Inter、JetBrains Mono (OFL)。アイコン:Lucide (ISC) + VectorCraft。
|
||||
Perspective grid presets 遠近グリッドプリセット
|
||||
Phone 390×844 スマートフォン 390×844
|
||||
Place onto a new locked, dimmed template layer below the current layer 現在のレイヤーの下に、ロックされ淡色表示の新規テンプレートレイヤーとして配置
|
||||
@@ -3881,7 +3874,7 @@ theme Appearance 外観
|
||||
@msg No saved views (View → New View…) 保存した表示はありません (表示 → 新規表示…)
|
||||
@msg `command` must be a command whose menu item opens a dialog (see ui.menuDialog) `command` には、メニュー項目がダイアログを開くコマンドを指定してください (ui.menuDialog を参照)
|
||||
@msg `{key}` must be true or false `{key}` には true または false を指定してください
|
||||
@msg brightness must be dark|mediumDark|mediumLight|light brightness には dark|mediumDark|mediumLight|light のいずれかを指定してください
|
||||
@msg brightness must be {_1} brightness には {_1} のいずれかを指定してください
|
||||
@msg index must be a number or first, previous, next or last index には数値、または first、previous、next、last のいずれかを指定してください
|
||||
@msg index must be a number or first, previous, next or last, not `{other}` index には数値、または first、previous、next、last のいずれかを指定してください (`{other}` は指定できません)
|
||||
@msg lang must be one of {_1} lang には {_1} のいずれかを指定してください
|
||||
@@ -4247,3 +4240,8 @@ lighting Light ライト
|
||||
@msg unknown parameter `{key}`; the command takes: {keys} `{key}` は不明なパラメーターです。このコマンドで使えるパラメーター: {keys}
|
||||
Load EPS into Clipboard EPS をクリップボードに読み込む
|
||||
@msg an image of {w} × {h} pixels is too large to draw {w} × {h} ピクセルの画像は大きすぎて描画できません
|
||||
Theme テーマ
|
||||
Catppuccin Latte Catppuccin Latte
|
||||
Catppuccin Frappé Catppuccin Frappé
|
||||
Catppuccin Macchiato Catppuccin Macchiato
|
||||
Catppuccin Mocha Catppuccin Mocha
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -41,7 +41,6 @@
|
||||
Favorites 즐겨찾기
|
||||
Flip 뒤집기
|
||||
Japanese 일본어
|
||||
Join Our Discord Discord 참여하기
|
||||
Line-end Punctuation Half Width 줄 끝 문장 부호 반각
|
||||
Mojikumi Set 모지쿠미 세트
|
||||
Kinsoku Set 긴소쿠 세트
|
||||
@@ -642,8 +641,6 @@
|
||||
Save Swatch Library… 견본 라이브러리 저장…
|
||||
Symbol Libraries 심볼 라이브러리
|
||||
Help 도움말
|
||||
ArtCraft Website ArtCraft 웹사이트
|
||||
VectorCraft on getartcraft.com getartcraft.com의 VectorCraft
|
||||
VectorCraft on GitHub GitHub의 VectorCraft
|
||||
Search Commands… 명령 검색…
|
||||
VectorCraft Help… VectorCraft 도움말…
|
||||
@@ -847,7 +844,6 @@
|
||||
Arrange: Bring to Front 배열: 맨 앞으로 가져오기
|
||||
Arrowheads: 화살촉:
|
||||
Art using a deleted global swatch keeps its colour. 삭제된 글로벌 견본을 사용한 아트워크는 색상을 유지합니다.
|
||||
ArtCraft website ArtCraft 웹사이트
|
||||
Artboard Options 아트보드 옵션
|
||||
Artboard Options: edit with the Artboard tool 아트보드 옵션: 아트보드 도구로 편집
|
||||
Artboard Options… 아트보드 옵션…
|
||||
@@ -1523,8 +1519,6 @@
|
||||
Isolate Group 그룹 격리
|
||||
Italian 이탈리아어
|
||||
Join Tool 결합 도구
|
||||
Join our Discord Discord 참여하기
|
||||
Join the ArtCraft community on Discord (discord.gg/artcraft) Discord에서 ArtCraft 커뮤니티에 참여하세요 (discord.gg/artcraft)
|
||||
Join the lines of each paragraph 각 단락의 줄 결합
|
||||
Justification… 양끝 맞춤…
|
||||
Keep Formatting 서식 유지
|
||||
@@ -2934,7 +2928,6 @@
|
||||
Delete these {n} graphic styles? 그래픽 스타일 {n}개를 삭제하시겠습니까?
|
||||
Delete this {n} graphic style? 그래픽 스타일 {n}개를 삭제하시겠습니까?
|
||||
Discarded {} recovered document(s) 복구된 문서 {}개를 삭제했습니다
|
||||
Discord Discord
|
||||
Do Not Move 이동 안 함
|
||||
Document Swatches 문서 견본
|
||||
Document profile 문서 프로파일
|
||||
@@ -3087,7 +3080,6 @@
|
||||
Packaged {n} file(s){note} 파일 {n}개를 패키지했습니다{note}
|
||||
Page information 페이지 정보
|
||||
Paragraph Style 단락 스타일
|
||||
Part of ArtCraft. MIT OR Apache-2.0. Fonts: Source Sans 3, Inter, JetBrains Mono (OFL). Icons: Lucide (ISC) + VectorCraft. ArtCraft의 일부입니다. MIT OR Apache-2.0. 글꼴: Source Sans 3, Inter, JetBrains Mono (OFL). 아이콘: Lucide (ISC) + VectorCraft.
|
||||
Perspective grid presets 원근 격자 프리셋
|
||||
Phone 390×844 휴대폰 390×844
|
||||
Place onto a new locked, dimmed template layer below the current layer 현재 레이어 아래의 잠기고 흐리게 처리된 새 템플릿 레이어에 배치
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -30,7 +30,6 @@
|
||||
About VectorCraft O programie VectorCraft
|
||||
Align to Path Wyrównaj do ścieżki
|
||||
Cut Path at Selected Anchor Points Rozetnij ścieżkę w zaznaczonych punktach kontrolnych
|
||||
Join Our Discord Dołącz do naszego Discorda
|
||||
Language Język
|
||||
UI Brightness Jasność interfejsu
|
||||
Dark Ciemny
|
||||
@@ -601,8 +600,6 @@
|
||||
Save Swatch Library… Zapisz bibliotekę próbek…
|
||||
Symbol Libraries Biblioteki symboli
|
||||
Help Pomoc
|
||||
ArtCraft Website Strona ArtCraft
|
||||
VectorCraft on getartcraft.com VectorCraft w getartcraft.com
|
||||
VectorCraft on GitHub VectorCraft w serwisie GitHub
|
||||
Search Commands… Szukaj poleceń…
|
||||
VectorCraft Help… Pomoc VectorCraft…
|
||||
@@ -1733,7 +1730,6 @@ lighting Light Światło
|
||||
Select All Bound Objects Zaznacz wszystkie powiązane obiekty
|
||||
Multiple objects Wiele obiektów
|
||||
Graphics: {adapter} Grafika: {adapter}
|
||||
Part of ArtCraft. MIT OR Apache-2.0. Fonts: Source Sans 3, Inter, JetBrains Mono (OFL). Icons: Lucide (ISC) + VectorCraft. Część ArtCraft. MIT LUB Apache-2.0. Czcionki: Source Sans 3, Inter, JetBrains Mono (OFL). Ikony: Lucide (ISC) + VectorCraft.
|
||||
Version {version} — open-source vector illustration in pure Rust. Wersja {version} — otwartoźródłowa grafika wektorowa w czystym Ruście.
|
||||
Align to Page Wyrównaj do strony
|
||||
Smooth Color Gładki kolor
|
||||
@@ -3299,10 +3295,6 @@ effect Regular Normalny
|
||||
Recent Files Ostatnie pliki
|
||||
Vector illustration — fast, open, scriptable. Ilustracja wektorowa — szybka, otwarta, skryptowalna.
|
||||
Welcome to VectorCraft Witamy w VectorCraft
|
||||
ArtCraft website Strona ArtCraft
|
||||
Discord Discord
|
||||
Join our Discord Dołącz do naszego Discorda
|
||||
Join the ArtCraft community on Discord (discord.gg/artcraft) Dołącz do społeczności ArtCraft na Discordzie (discord.gg/artcraft)
|
||||
Source code on GitHub Kod źródłowy w serwisie GitHub
|
||||
All Tools Wszystkie narzędzia
|
||||
Draw Rysuj
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -16,7 +16,7 @@
|
||||
# in the infinitive, menus as nouns); no proprietary localisation resource, string table or product
|
||||
Glowing Edges… Bordas brilhantes…
|
||||
# UI was consulted or copied; add entries the same way. Product and technology names (VectorCraft,
|
||||
# ArtCraft, SVG, OpenType, CMYK, Lab ...) stay in Latin letters; the trailing "…" of dialog
|
||||
# SVG, OpenType, CMYK, Lab ...) stay in Latin letters; the trailing "…" of dialog
|
||||
# commands is kept.
|
||||
#
|
||||
# Coverage: every `tl!` literal and menu string of the shell (tested:
|
||||
@@ -225,8 +225,6 @@
|
||||
Arrange: Bring to Front Organizar: Trazer para Frente
|
||||
Arrowheads: Pontas de Seta:
|
||||
Art using a deleted global swatch keeps its colour. A arte que usa uma amostra global excluída mantém sua cor.
|
||||
ArtCraft Website Site do ArtCraft
|
||||
ArtCraft website Site do ArtCraft
|
||||
Artboard Options Opções de Mesa de Trabalho
|
||||
Artboard Options: edit with the Artboard tool Opções de Mesa de Trabalho: edite com a ferramenta Mesa de Trabalho
|
||||
Artboard Options… Opções de Mesa de Trabalho…
|
||||
@@ -1126,10 +1124,7 @@
|
||||
Isolate Selected Group Isolar Grupo Selecionado
|
||||
Italian Italiano
|
||||
Join Unir
|
||||
Join Our Discord Junte-se ao nosso Discord
|
||||
Join Tool Ferramenta Unir
|
||||
Join our Discord Junte-se ao nosso Discord
|
||||
Join the ArtCraft community on Discord (discord.gg/artcraft) Junte-se à comunidade do ArtCraft no Discord (discord.gg/artcraft)
|
||||
Join the lines of each paragraph Junte as linhas de cada parágrafo
|
||||
Justification… Justificação…
|
||||
Keep Formatting Manter Formatação
|
||||
@@ -2560,7 +2555,6 @@
|
||||
VectorCraft Help… Ajuda do VectorCraft…
|
||||
VectorCraft didn't quit normally last time. These documents had unsaved changes: O VectorCraft não fechou normalmente da última vez. Estes documentos tinham alterações não salvas:
|
||||
VectorCraft on GitHub VectorCraft no GitHub
|
||||
VectorCraft on getartcraft.com VectorCraft em getartcraft.com
|
||||
Vectors Vetores
|
||||
Version {version} — open-source vector illustration in pure Rust. Versão {version} — ilustração vetorial de código aberto em Rust puro.
|
||||
Version: Versão:
|
||||
@@ -3194,7 +3188,7 @@ axis Both Ambos
|
||||
@msg bad trailer trailer inválido
|
||||
@msg balance must be between 0 and 100 o equilíbrio deve estar entre 0 e 100
|
||||
@msg batch step {_1} (`{id}`) failed: {e} a etapa {_1} do lote (`{id}`) falhou: {e}
|
||||
@msg brightness must be dark|mediumDark|mediumLight|light brightness deve ser dark|mediumDark|mediumLight|light
|
||||
@msg brightness must be {_1} brightness deve ser {_1}
|
||||
@msg can't encode the document: {0} não foi possível codificar o documento: {0}
|
||||
@msg can't parse shortcut `{c}` não foi possível interpretar o atalho `{c}`
|
||||
@msg can't parse shortcut `{s}` for `{k}` não foi possível interpretar o atalho `{s}` de `{k}`
|
||||
@@ -3693,3 +3687,8 @@ axis Both Ambos
|
||||
@msg unknown parameter `{key}`; the command takes no parameters parâmetro desconhecido `{key}`; o comando não tem parâmetros
|
||||
@msg unknown parameter `{key}`; the command takes: {keys} parâmetro desconhecido `{key}`; o comando aceita: {keys}
|
||||
Load EPS into Clipboard Carregar EPS na Área de Transferência
|
||||
Theme Tema
|
||||
Catppuccin Latte Catppuccin Latte
|
||||
Catppuccin Frappé Catppuccin Frappé
|
||||
Catppuccin Macchiato Catppuccin Macchiato
|
||||
Catppuccin Mocha Catppuccin Mocha
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 6 and column 47.
|
@@ -226,8 +226,6 @@
|
||||
Artboard {number} Монтажная область {number}
|
||||
Artboard: Монтажная область:
|
||||
Artboards Монтажные области
|
||||
ArtCraft Website Веб-сайт ArtCraft
|
||||
ArtCraft website Веб-сайт ArtCraft
|
||||
Artwork Colors Цвета рисунка
|
||||
As Multiple Assets Как несколько ресурсов
|
||||
As Single Asset Как один ресурс
|
||||
@@ -685,7 +683,6 @@
|
||||
Discard Recovered Documents Отменить восстановленные документы
|
||||
Discard White Overprint in Output Отменить наложение белого при выводе
|
||||
Discarded {} recovered document(s) Отменено восстановленных документов: {}
|
||||
Discord Discord
|
||||
Discretionary Hyphen Мягкий перенос
|
||||
Discretionary Ligatures Дискреционные лигатуры
|
||||
Display All Blacks Accurately Отображать все чёрные точно
|
||||
@@ -1311,9 +1308,6 @@
|
||||
Italian Итальянский
|
||||
Japanese Японский
|
||||
Join Соединить
|
||||
Join Our Discord Присоединяйтесь к нашему Discord
|
||||
Join our Discord Присоединяйтесь к нашему Discord
|
||||
Join the ArtCraft community on Discord (discord.gg/artcraft) Присоединяйтесь к сообществу ArtCraft в Discord (discord.gg/artcraft)
|
||||
Join the lines of each paragraph Соединять строки каждого абзаца
|
||||
Join Tool Инструмент «Соединение»
|
||||
Justification… Выключка…
|
||||
@@ -1906,7 +1900,7 @@
|
||||
Paragraph Style Options Параметры стиля абзаца
|
||||
Paragraph Styles Стили абзацев
|
||||
Paragraph Symbol Символ абзаца
|
||||
Part of ArtCraft. MIT OR Apache-2.0. Fonts: Source Sans 3, Inter, JetBrains Mono (OFL). Icons: Lucide (ISC) + VectorCraft. Часть ArtCraft. MIT OR Apache-2.0. Шрифты: Source Sans 3, Inter, JetBrains Mono (OFL). Значки: Lucide (ISC) + VectorCraft.
|
||||
MIT OR Apache-2.0. Fonts: Source Sans 3, Inter, JetBrains Mono (OFL). Icons: Lucide (ISC) + VectorCraft. MIT OR Apache-2.0. Шрифты: Source Sans 3, Inter, JetBrains Mono (OFL). Значки: Lucide (ISC) + VectorCraft.
|
||||
Password Пароль
|
||||
Paste Вставить
|
||||
Paste in Back Вставить позади
|
||||
@@ -3134,7 +3128,6 @@
|
||||
Vector illustration — fast, open, scriptable. Векторная иллюстрация — быстрая, открытая, программируемая.
|
||||
VectorCraft didn't quit normally last time. These documents had unsaved changes: VectorCraft не завершился нормально в прошлый раз. В этих документах были несохранённые изменения:
|
||||
VectorCraft Help… Справка VectorCraft…
|
||||
VectorCraft on getartcraft.com VectorCraft на getartcraft.com
|
||||
VectorCraft on GitHub VectorCraft на GitHub
|
||||
Vectors Векторы
|
||||
Version {version} — open-source vector illustration in pure Rust. Версия {version} — векторная иллюстрация с открытым исходным кодом на чистом Rust.
|
||||
@@ -3535,7 +3528,7 @@ axis Both Оба
|
||||
@msg bad trailer недопустимый трейлер
|
||||
@msg balance must be between 0 and 100 баланс должен быть от 0 до 100
|
||||
@msg batch step {_1} (`{id}`) failed: {e} шаг пакета {_1} (`{id}`) не выполнен: {e}
|
||||
@msg brightness must be dark|mediumDark|mediumLight|light яркость должна быть dark|mediumDark|mediumLight|light
|
||||
@msg brightness must be {_1} яркость должна быть {_1}
|
||||
@msg can't encode the document: {0} не удалось закодировать документ: {0}
|
||||
@msg can't parse shortcut `{c}` не удалось разобрать сочетание `{c}`
|
||||
@msg can't parse shortcut `{s}` for `{k}` не удалось разобрать сочетание `{s}` для `{k}`
|
||||
@@ -4249,3 +4242,8 @@ lighting Light Свет
|
||||
@msg unknown parameter `{key}`; the command takes: {keys} неизвестный параметр `{key}`; команда принимает: {keys}
|
||||
Load EPS into Clipboard Загрузить EPS в буфер обмена
|
||||
@msg an image of {w} × {h} pixels is too large to draw изображение размером {w} × {h} пикселей слишком велико для отрисовки
|
||||
Theme Тема
|
||||
Catppuccin Latte Catppuccin Latte
|
||||
Catppuccin Frappé Catppuccin Frappé
|
||||
Catppuccin Macchiato Catppuccin Macchiato
|
||||
Catppuccin Mocha Catppuccin Mocha
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -222,8 +222,6 @@
|
||||
Artboard {number} Монтажна область {number}
|
||||
Artboard: Монтажна область:
|
||||
Artboards Монтажні області
|
||||
ArtCraft Website Веб-сайт ArtCraft
|
||||
ArtCraft website Веб-сайт ArtCraft
|
||||
Artwork Colors Кольори малюнка
|
||||
As Multiple Assets Як кілька ресурсів
|
||||
As Single Asset Як один ресурс
|
||||
@@ -681,7 +679,6 @@
|
||||
Discard Recovered Documents Відкинути відновлені документи
|
||||
Discard White Overprint in Output Скасувати накладення білого під час виведення
|
||||
Discarded {} recovered document(s) Скасовано відновлених документів: {}
|
||||
Discord Discord
|
||||
Discretionary Hyphen М’яке перенесення
|
||||
Discretionary Ligatures Дискреційні лігатури
|
||||
Display All Blacks Accurately Відображати всі чорні точно
|
||||
@@ -1307,9 +1304,6 @@
|
||||
Italian Італійська
|
||||
Japanese Японська
|
||||
Join З’єднати
|
||||
Join Our Discord Приєднуйтесь до нашого Discord
|
||||
Join our Discord Приєднуйтесь до нашого Discord
|
||||
Join the ArtCraft community on Discord (discord.gg/artcraft) Приєднуйтесь до спільноти ArtCraft Discord (discord.gg/artcraft)
|
||||
Join the lines of each paragraph Поєднувати рядки кожного абзацу
|
||||
Join Tool Інструмент «З’єднання»
|
||||
Justification… Вирівнювання за шириною…
|
||||
@@ -1902,7 +1896,7 @@
|
||||
Paragraph Style Options Параметри стилю абзацу
|
||||
Paragraph Styles Стилі абзаців
|
||||
Paragraph Symbol Символ абзацу
|
||||
Part of ArtCraft. MIT OR Apache-2.0. Fonts: Source Sans 3, Inter, JetBrains Mono (OFL). Icons: Lucide (ISC) + VectorCraft. Частина ArtCraft. MIT OR Apache-2.0. Шрифти: Source Sans 3, Inter, JetBrains Mono (OFL). Значки: Lucide (ISC) + VectorCraft.
|
||||
MIT OR Apache-2.0. Fonts: Source Sans 3, Inter, JetBrains Mono (OFL). Icons: Lucide (ISC) + VectorCraft. MIT OR Apache-2.0. Шрифти: Source Sans 3, Inter, JetBrains Mono (OFL). Значки: Lucide (ISC) + VectorCraft.
|
||||
Password Пароль
|
||||
Paste Вставити
|
||||
Paste in Back Вставити позаду
|
||||
@@ -3131,7 +3125,6 @@ effect Points Точки
|
||||
Vector illustration — fast, open, scriptable. Векторне малювання — швидке, відкрите, кероване сценаріями.
|
||||
VectorCraft didn't quit normally last time. These documents had unsaved changes: VectorCraft не завершився нормально минулого разу. У цих документах були незбережені зміни:
|
||||
VectorCraft Help… Довідка VectorCraft…
|
||||
VectorCraft on getartcraft.com VectorCraft на getartcraft.com
|
||||
VectorCraft on GitHub VectorCraft на GitHub
|
||||
Vectors Вектори
|
||||
Version {version} — open-source vector illustration in pure Rust. Версія {version} — векторне малювання з відкритим кодом, написане на Rust.
|
||||
@@ -3523,7 +3516,7 @@ axis Both Обидві
|
||||
@msg bad trailer неприпустимий трейлер
|
||||
@msg balance must be between 0 and 100 баланс має бути від 0 до 100
|
||||
@msg batch step {_1} (`{id}`) failed: {e} крок пакету {_1} (`{id}`) не виконано: {e}
|
||||
@msg brightness must be dark|mediumDark|mediumLight|light яскравість має бути dark|mediumDark|mediumLight|light
|
||||
@msg brightness must be {_1} яскравість має бути {_1}
|
||||
@msg can't encode the document: {0} не вдалося закодувати документ: {0}
|
||||
@msg can't parse shortcut `{c}` не вдалося розібрати поєднання `{c}`
|
||||
@msg can't parse shortcut `{s}` for `{k}` не вдалося розібрати поєднання `{s}` для `{k}`
|
||||
@@ -4233,3 +4226,8 @@ lighting Light Світло
|
||||
@msg unknown parameter `{key}`; the command takes: {keys} невідомий параметр `{key}`; команда приймає: {keys}
|
||||
Load EPS into Clipboard Завантажити EPS у буфер обміну
|
||||
@msg an image of {w} × {h} pixels is too large to draw зображення розміром {w} × {h} пікселів завелике для відображення
|
||||
Theme Тема
|
||||
Catppuccin Latte Catppuccin Latte
|
||||
Catppuccin Frappé Catppuccin Frappé
|
||||
Catppuccin Macchiato Catppuccin Macchiato
|
||||
Catppuccin Mocha Catppuccin Mocha
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 657 and column 40.
|
@@ -264,8 +264,6 @@
|
||||
Artboard: Bảng vẽ:
|
||||
Artboards Các bảng vẽ
|
||||
Artboards: {n} Bảng vẽ: {n}
|
||||
ArtCraft Website Trang web ArtCraft
|
||||
ArtCraft website Trang web ArtCraft
|
||||
Artistic Nghệ thuật
|
||||
Artwork Colors Màu sắc tác phẩm
|
||||
As Multiple Assets Thành nhiều asset
|
||||
@@ -821,7 +819,6 @@
|
||||
Discard Recovered Documents Loại bỏ tài liệu đã phục hồi
|
||||
Discard White Overprint in Output Loại bỏ in chồng màu trắng khi xuất
|
||||
Discarded {} recovered document(s) Đã loại bỏ {} tài liệu đã phục hồi
|
||||
Discord Discord
|
||||
Discretionary Hyphen Gạch nối tùy chọn
|
||||
Discretionary Ligatures Chữ ghép tùy chọn
|
||||
Display All Blacks Accurately Hiển thị tất cả màu đen chính xác
|
||||
@@ -1523,9 +1520,6 @@
|
||||
Its graphics, colors and text styles are deleted from this machine. Đồ họa, màu sắc và kiểu văn bản của nó sẽ bị xóa khỏi máy này.
|
||||
Japanese Tiếng Nhật
|
||||
Join Nối
|
||||
Join Our Discord Tham gia Discord
|
||||
Join our Discord Tham gia Discord của chúng tôi
|
||||
Join the ArtCraft community on Discord (discord.gg/artcraft) Tham gia cộng đồng ArtCraft trên Discord (discord.gg/artcraft)
|
||||
Join the lines of each paragraph Nối các dòng trong mỗi đoạn văn
|
||||
Join Tool Công cụ Nối
|
||||
Joins Kiểu nối
|
||||
@@ -2161,7 +2155,6 @@
|
||||
Paragraph Style Options Tùy chọn kiểu đoạn văn
|
||||
Paragraph Styles Kiểu đoạn văn
|
||||
Paragraph Symbol Ký hiệu đoạn văn
|
||||
Part of ArtCraft. MIT OR Apache-2.0. Fonts: Source Sans 3, Inter, JetBrains Mono (OFL). Icons: Lucide (ISC) + VectorCraft. Một phần của ArtCraft. MIT OR Apache-2.0. Phông chữ: Source Sans 3, Inter, JetBrains Mono (OFL). Biểu tượng: Lucide (ISC) + VectorCraft.
|
||||
Password Mật khẩu
|
||||
Paste Dán
|
||||
Paste Design Dán thiết kế
|
||||
@@ -3447,7 +3440,6 @@
|
||||
VectorCraft didn't quit normally last time. These documents had unsaved changes: VectorCraft không thoát bình thường lần trước. Các tài liệu này có thay đổi chưa lưu:
|
||||
VectorCraft documents: one locked object, updated when the file changes. Tài liệu VectorCraft: một đối tượng bị khóa, cập nhật khi tệp thay đổi.
|
||||
VectorCraft Help… Trợ giúp VectorCraft…
|
||||
VectorCraft on getartcraft.com VectorCraft trên getartcraft.com
|
||||
VectorCraft on GitHub VectorCraft trên GitHub
|
||||
Vectors Vector
|
||||
Version Phiên bản
|
||||
|
||||
|
@@ -186,8 +186,6 @@
|
||||
Artboard {number} 画板 {number}
|
||||
Artboard: 画板:
|
||||
Artboards 画板
|
||||
ArtCraft Website ArtCraft 网站
|
||||
ArtCraft website ArtCraft 网站
|
||||
Artwork Colors 图稿颜色
|
||||
As Multiple Assets 作为多个资源
|
||||
As Single Asset 作为单一资源
|
||||
@@ -642,7 +640,6 @@
|
||||
Discard Recovered Documents 丢弃已恢复的文档
|
||||
Discard White Overprint in Output 输出时放弃白色叠印
|
||||
Discarded {} recovered document(s) 已放弃 {} 份恢复的文档
|
||||
Discord Discord
|
||||
Discretionary Hyphen 选择性连字号
|
||||
Discretionary Ligatures 任意连字
|
||||
Display All Blacks Accurately 准确显示所有黑色
|
||||
@@ -1257,9 +1254,6 @@
|
||||
Isolate Group 隔离编组
|
||||
Italian 意大利语
|
||||
Join 连接
|
||||
Join Our Discord 加入 Discord
|
||||
Join our Discord 加入我们的 Discord
|
||||
Join the ArtCraft community on Discord (discord.gg/artcraft) 在 Discord 加入 ArtCraft 社区 (discord.gg/artcraft)
|
||||
Join the lines of each paragraph 合并每个段落的行
|
||||
Join Tool 连接工具
|
||||
Justification… 对齐设置…
|
||||
@@ -1835,7 +1829,7 @@
|
||||
Paragraph Style Options 段落样式选项
|
||||
Paragraph Styles 段落样式
|
||||
Paragraph Symbol 段落符号
|
||||
Part of ArtCraft. MIT OR Apache-2.0. Fonts: Source Sans 3, Inter, JetBrains Mono (OFL). Icons: Lucide (ISC) + VectorCraft. ArtCraft 的一部分。MIT OR Apache-2.0。字体:Source Sans 3、Inter、JetBrains Mono (OFL)。图标:Lucide (ISC) + VectorCraft。
|
||||
MIT OR Apache-2.0. Fonts: Source Sans 3, Inter, JetBrains Mono (OFL). Icons: Lucide (ISC) + VectorCraft. MIT OR Apache-2.0。字体:Source Sans 3、Inter、JetBrains Mono (OFL)。图标:Lucide (ISC) + VectorCraft。
|
||||
Password 口令
|
||||
Paste 粘贴
|
||||
Paste in Back 贴在后面
|
||||
@@ -3031,7 +3025,6 @@
|
||||
VectorCraft VectorCraft
|
||||
VectorCraft didn't quit normally last time. These documents had unsaved changes: VectorCraft 上次未正常退出。以下文档有未存储的更改:
|
||||
VectorCraft Help… VectorCraft 说明…
|
||||
VectorCraft on getartcraft.com getartcraft.com 上的 VectorCraft
|
||||
VectorCraft on GitHub GitHub 上的 VectorCraft
|
||||
Vectors 矢量
|
||||
Version {version} — open-source vector illustration in pure Rust. 版本 {version} — 以纯 Rust 打造的开放原始码矢量插画软件。
|
||||
@@ -3277,7 +3270,7 @@
|
||||
X: X:
|
||||
Y: Y:
|
||||
Text Displayed in Cell 单元格中显示的文本
|
||||
Part of ArtCraft. MIT OR Apache-2.0. Fonts: Source Sans 3, Inter, JetBrains Mono, Noto Sans SC (OFL). Icons: Lucide (ISC) + VectorCraft. ArtCraft 的一部分。MIT 或 Apache-2.0 许可。字体:Source Sans 3、Inter、JetBrains Mono、Noto Sans SC (OFL)。图标:Lucide (ISC)+ VectorCraft。
|
||||
MIT OR Apache-2.0. Fonts: Source Sans 3, Inter, JetBrains Mono, Noto Sans SC (OFL). Icons: Lucide (ISC) + VectorCraft. MIT 或 Apache-2.0 许可。字体:Source Sans 3、Inter、JetBrains Mono、Noto Sans SC (OFL)。图标:Lucide (ISC)+ VectorCraft。
|
||||
RGB RGB
|
||||
Pattern Swatches 图案色板
|
||||
Default Graphic Style 默认图形样式
|
||||
@@ -3844,3 +3837,8 @@ lighting Light 光源
|
||||
@msg unknown parameter `{key}`; the command takes: {keys} 未知参数 `{key}`;该命令接受:{keys}
|
||||
Load EPS into Clipboard 将 EPS 载入剪贴板
|
||||
@msg an image of {w} × {h} pixels is too large to draw {w} × {h} 像素的图像过大,无法绘制
|
||||
Theme 主题
|
||||
Catppuccin Latte Catppuccin Latte
|
||||
Catppuccin Frappé Catppuccin Frappé
|
||||
Catppuccin Macchiato Catppuccin Macchiato
|
||||
Catppuccin Mocha Catppuccin Mocha
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 73.
|
@@ -12,7 +12,7 @@
|
||||
# Clean-room: every entry was written from the plain meaning of the English label using the
|
||||
# vector-drawing vocabulary in everyday use in Taiwan (錨點, 路徑, 筆畫, 填色, 工作區域, 路徑管理員 ...).
|
||||
# No proprietary localisation resource, string table or product UI was consulted or copied; add
|
||||
# entries the same way. Product and technology names (VectorCraft, ArtCraft, SVG, OpenType, CMYK,
|
||||
# entries the same way. Product and technology names (VectorCraft, SVG, OpenType, CMYK,
|
||||
# Lab ...) and paper sizes (Letter, Tabloid) stay in Latin letters; the trailing "…" of dialog
|
||||
# commands is kept. Full-width punctuation (,。:) inside sentences; half-width parentheses and
|
||||
# the " · " separators as in the English. Terms shared with PhotoCraft use the same words as its
|
||||
@@ -197,8 +197,6 @@
|
||||
Artboard {number} 工作區域 {number}
|
||||
Artboard: 工作區域:
|
||||
Artboards 工作區域
|
||||
ArtCraft Website ArtCraft 網站
|
||||
ArtCraft website ArtCraft 網站
|
||||
Artwork Colors 圖稿顏色
|
||||
As Multiple Assets 作為多個資產
|
||||
As Single Asset 作為單一資產
|
||||
@@ -660,7 +658,6 @@
|
||||
Discard Recovered Documents 捨棄已復原的文件
|
||||
Discard White Overprint in Output 輸出時捨棄白色疊印
|
||||
Discarded {} recovered document(s) 已捨棄 {} 份復原的文件
|
||||
Discord Discord
|
||||
Discretionary Hyphen 選擇性連字號
|
||||
Discretionary Ligatures 任意連字
|
||||
Display All Blacks Accurately 精確顯示所有黑色
|
||||
@@ -1288,9 +1285,6 @@
|
||||
Italian 義大利文
|
||||
Japanese 日文
|
||||
Join 連接
|
||||
Join Our Discord 加入我們的 Discord
|
||||
Join our Discord 加入我們的 Discord
|
||||
Join the ArtCraft community on Discord (discord.gg/artcraft) 加入 Discord 上的 ArtCraft 社群 (discord.gg/artcraft)
|
||||
Join the lines of each paragraph 合併每個段落的各行
|
||||
Join Tool 連接工具
|
||||
Justification… 對齊設定…
|
||||
@@ -1887,7 +1881,7 @@
|
||||
Paragraph Style Options 段落樣式選項
|
||||
Paragraph Styles 段落樣式
|
||||
Paragraph Symbol 段落符號
|
||||
Part of ArtCraft. MIT OR Apache-2.0. Fonts: Source Sans 3, Inter, JetBrains Mono (OFL). Icons: Lucide (ISC) + VectorCraft. ArtCraft 的一部分。MIT OR Apache-2.0。字體:Source Sans 3、Inter、JetBrains Mono (OFL)。圖示:Lucide (ISC) + VectorCraft。
|
||||
MIT OR Apache-2.0. Fonts: Source Sans 3, Inter, JetBrains Mono (OFL). Icons: Lucide (ISC) + VectorCraft. MIT OR Apache-2.0。字體:Source Sans 3、Inter、JetBrains Mono (OFL)。圖示:Lucide (ISC) + VectorCraft。
|
||||
Password 密碼
|
||||
Paste 貼上
|
||||
Paste in Back 貼至後方
|
||||
@@ -3124,7 +3118,6 @@
|
||||
VectorCraft VectorCraft
|
||||
VectorCraft didn't quit normally last time. These documents had unsaved changes: VectorCraft 上次未正常結束。下列文件有未儲存的變更:
|
||||
VectorCraft Help… VectorCraft 說明…
|
||||
VectorCraft on getartcraft.com getartcraft.com 上的 VectorCraft
|
||||
VectorCraft on GitHub GitHub 上的 VectorCraft
|
||||
Vectors 向量
|
||||
Version {version} — open-source vector illustration in pure Rust. 版本 {version} — 以純 Rust 打造的開放原始碼向量插畫軟體。
|
||||
@@ -3625,3 +3618,8 @@ lighting Light 光源
|
||||
@msg unknown parameter `{key}`; the command takes: {keys} 未知的參數 `{key}`;此指令接受:{keys}
|
||||
Load EPS into Clipboard 將 EPS 載入剪貼簿
|
||||
@msg an image of {w} × {h} pixels is too large to draw {w} × {h} 像素的影像過大,無法繪製
|
||||
Theme 主題
|
||||
Catppuccin Latte Catppuccin Latte
|
||||
Catppuccin Frappé Catppuccin Frappé
|
||||
Catppuccin Macchiato Catppuccin Macchiato
|
||||
Catppuccin Mocha Catppuccin Mocha
|
||||
|
||||
|
Can't render this file because it contains an unexpected character in line 6 and column 47.
|
@@ -686,7 +686,7 @@ impl VectorcraftApp {
|
||||
r
|
||||
}
|
||||
|
||||
/// Open a link in the browser (Help → Discord, website, GitHub…).
|
||||
/// Open a link in the browser (Help → GitHub…).
|
||||
pub fn open_url(&mut self, url: &str) {
|
||||
match self.services.open_url.as_mut() {
|
||||
Some(open) => open(url),
|
||||
|
||||
@@ -34,6 +34,18 @@ fn c(label: &'static str, id: &'static str) -> Item {
|
||||
fn cp(label: &'static str, id: &'static str, p: Value) -> Item {
|
||||
Item::Cmd(label, id, p)
|
||||
}
|
||||
/// Window → Theme: the UI brightness levels, then the Catppuccin flavours.
|
||||
pub fn theme_items() -> Vec<Item> {
|
||||
let mut out = Vec::new();
|
||||
let mut flavours = false;
|
||||
for b in Brightness::ALL {
|
||||
if b.flavor().is_some() && !std::mem::replace(&mut flavours, true) {
|
||||
out.push(Item::Sep);
|
||||
}
|
||||
out.push(cp(b.label(), "window.brightness", json!({"brightness": b.id()})));
|
||||
}
|
||||
out
|
||||
}
|
||||
fn todo(label: &'static str) -> Item {
|
||||
Item::Todo(label, "")
|
||||
}
|
||||
@@ -322,7 +334,12 @@ pub const UI_COMMANDS: &[(&str, &str, &str, &str)] = &[
|
||||
"",
|
||||
"{collapsed?: bool} collapse the dock's Properties | Layers | Libraries group to icons (true), expand it (false) or toggle (omitted), as the double arrow at the top of the dock does; returns the new state",
|
||||
),
|
||||
("window.brightness", "UI Brightness", "", "{brightness: dark|mediumDark|mediumLight|light}"),
|
||||
(
|
||||
"window.brightness",
|
||||
"UI Brightness",
|
||||
"",
|
||||
"{brightness: dark|mediumDark|mediumLight|light|catppuccinLatte|catppuccinFrappe|catppuccinMacchiato|catppuccinMocha}",
|
||||
),
|
||||
("window.workspace", "Workspace", "", "{name} switch workspace (Essentials, Essentials Classic, Painting, …)"),
|
||||
("window.workspace.reset", "Reset Essentials", "", "{} reset the current workspace"),
|
||||
("window.workspace.new", "New Workspace…", "", "{name?} save the current layout"),
|
||||
@@ -1230,7 +1247,7 @@ pub fn run_ui_command(app: &mut VectorcraftApp, id: &str, p: &Value) -> Option<R
|
||||
app.canvas.key = None;
|
||||
Ok(json!(b.id()))
|
||||
}
|
||||
None => Err("brightness must be dark|mediumDark|mediumLight|light".into()),
|
||||
None => Err(format!("brightness must be {}", Brightness::id_list())),
|
||||
},
|
||||
"window.newWindow" => Err("multiple windows land with M11.5".into()),
|
||||
"tool.select" => match s("tool") {
|
||||
@@ -2033,13 +2050,13 @@ pub fn menu_tree_named(english_names: bool) -> Vec<(&'static str, Vec<Item>)> {
|
||||
let panel = |label: &'static str, id: &'static str| cp(label, "window.panel", json!({ "panel": id }));
|
||||
vec![
|
||||
(
|
||||
// The application menu: About and Discord only. The in-window bar never shows it (File
|
||||
// The application menu: About only. The in-window bar never shows it (File
|
||||
// is first there, as in Illustrator); on macOS `native_menu::mac_layout` composes the
|
||||
// App menu from this entry and the other menus (About from Help, Settings from Edit,
|
||||
// Quit from File, Language and Appearance synthesized). It stays first: `from_tree`
|
||||
// gives the first menu the App role.
|
||||
"VectorCraft",
|
||||
vec![c("About VectorCraft", "help.about"), c("Join Our Discord", "help.discord")],
|
||||
vec![c("About VectorCraft", "help.about")],
|
||||
),
|
||||
(
|
||||
"File",
|
||||
@@ -2604,6 +2621,7 @@ pub fn menu_tree_named(english_names: bool) -> Vec<(&'static str, Vec<Item>)> {
|
||||
c("New Window", "window.newWindow"),
|
||||
sub("Arrange", vec![todo("Cascade"), todo("Tile"), todo("Float in Window"), todo("Consolidate All Windows")]),
|
||||
sub("Workspace", crate::workspaces::menu_items()),
|
||||
sub("Theme", theme_items()),
|
||||
Sep,
|
||||
c("Control", "window.control"),
|
||||
c("Contextual Task Bar", "window.taskBar"),
|
||||
@@ -2666,9 +2684,6 @@ pub fn menu_tree_named(english_names: bool) -> Vec<(&'static str, Vec<Item>)> {
|
||||
(
|
||||
"Help",
|
||||
vec![
|
||||
c("Join Our Discord", "help.discord"),
|
||||
c("ArtCraft Website", "help.website"),
|
||||
c("VectorCraft on getartcraft.com", "help.appPage"),
|
||||
c("VectorCraft on GitHub", "help.github"),
|
||||
Sep,
|
||||
c("Search Commands…", "help.commandPalette"),
|
||||
@@ -3228,7 +3243,7 @@ pub fn invoke(app: &mut VectorcraftApp, id: &str, p: Value) {
|
||||
return;
|
||||
}
|
||||
// Help links: the command returns the URL; a menu click opens it (agents just get the URL).
|
||||
if matches!(id, "help.discord" | "help.website" | "help.appPage" | "help.github") {
|
||||
if matches!(id, "help.github") {
|
||||
app.open_link(id);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
//! `app.quit`, so documents with unsaved changes are asked about. Language and Appearance have
|
||||
//! no in-window menu (as in PhotoCraft) and are synthesized here; Quit is File › Exit in the
|
||||
//! window and reads as Quit in the App menu. These leave the other menus (Edit › Preferences…,
|
||||
//! Help › About), and Join Our Discord stays under Help only;
|
||||
//! Help › About);
|
||||
//! - **Window** gets Minimize ⌃⌘M, Zoom and Bring All to Front, and **Help** the system's search
|
||||
//! field;
|
||||
//! - a system key already bound to a command keeps the command's: the system item goes without.
|
||||
@@ -325,7 +325,7 @@ pub fn mac_layout(app: &VectorcraftApp, bar: &MenuBar, lang: Lang) -> Layout {
|
||||
// them, else synthesized here (the in-window bar has neither).
|
||||
let language = take_submenu(&mut bar, "app.language").or_else(|| Some(language_node(app, lang)));
|
||||
let appearance = take_submenu(&mut bar, "window.brightness").or_else(|| Some(appearance_node(app, lang)));
|
||||
// Its other items (Join Our Discord) stay where the in-window bar also has them: Help.
|
||||
// It has no other items.
|
||||
bar.menus.retain(|m| m.role != MenuRole::App);
|
||||
|
||||
let mut app = Vec::new();
|
||||
@@ -371,8 +371,14 @@ fn language_node(app: &VectorcraftApp, lang: Lang) -> Node {
|
||||
|
||||
/// Appearance in the app menu (the UI-brightness theme, as Mac apps call it).
|
||||
fn appearance_node(app: &VectorcraftApp, lang: Lang) -> Node {
|
||||
let children =
|
||||
Brightness::ALL.iter().map(|b| Node::Item(native_item(app, b.label(), "window.brightness", json!({"brightness": b.id()})))).collect();
|
||||
let mut children = Vec::new();
|
||||
let mut flavours = false;
|
||||
for b in Brightness::ALL {
|
||||
if b.flavor().is_some() && !std::mem::replace(&mut flavours, true) {
|
||||
children.push(Node::Separator);
|
||||
}
|
||||
children.push(Node::Item(native_item(app, b.label(), "window.brightness", json!({"brightness": b.id()}))));
|
||||
}
|
||||
Node::Submenu { label: tr_ctx(lang, "theme", "Appearance").into(), children }
|
||||
}
|
||||
|
||||
|
||||
@@ -41,7 +41,7 @@ fn weights_and_dashes_show_in_the_stroke_unit_everywhere() {
|
||||
}
|
||||
|
||||
/// The Properties panel's Stroke row is the Control bar's: the Stroke link opens the Stroke panel
|
||||
/// as a popover and the weight spinner lists the presets (Discord feedback).
|
||||
/// as a popover and the weight spinner lists the presets (user feedback).
|
||||
#[test]
|
||||
fn the_properties_stroke_link_and_weight_presets() {
|
||||
let ctx = egui::Context::default();
|
||||
|
||||
@@ -144,15 +144,16 @@ fn language_and_appearance_are_in_the_app_menu() {
|
||||
}
|
||||
}
|
||||
let appearance: Vec<(&'static str, Option<bool>)> = items(submenu(app_menu, "Appearance")).iter().map(|it| (it.source, it.checked)).collect();
|
||||
assert_eq!(appearance.len(), crate::theme::Brightness::ALL.len());
|
||||
assert_eq!(appearance.len(), crate::theme::Brightness::ALL.len(), "every theme, with a separator before the Catppuccin ones");
|
||||
assert_eq!(appearance.iter().map(|(s, _)| *s).collect::<Vec<_>>(), crate::theme::Brightness::ALL.map(|b| b.label()));
|
||||
assert_eq!(appearance.iter().filter(|(_, c)| *c == Some(true)).count(), 1, "{appearance:?}");
|
||||
assert!(appearance.iter().all(|(_, c)| c.is_some()));
|
||||
assert_eq!(crate::i18n::tr_ctx(Lang::from_code("ja").unwrap(), "theme", "Appearance"), "外観", "the theme, not the Appearance panel");
|
||||
}
|
||||
|
||||
/// Everything the in-window bar lists is in the Mac menu bar, once: what moved to the app menu
|
||||
/// (About, Settings, Quit, Language, UI Brightness) leaves its other places, and Join Our Discord
|
||||
/// stays under Help.
|
||||
/// (About, Settings, Quit, Language, UI Brightness) leaves its other places, and
|
||||
/// the GitHub link stays under Help.
|
||||
#[test]
|
||||
fn every_in_window_item_is_in_the_mac_menu_bar_once() {
|
||||
let app = app(true);
|
||||
@@ -188,7 +189,7 @@ fn every_in_window_item_is_in_the_mac_menu_bar_once() {
|
||||
assert!(a.contains_key(key) || system.contains(&key.0.as_str()) || synthesized.contains(&key.0.as_str()), "{key:?} isn't an in-window item");
|
||||
}
|
||||
let help = ids(menu(&mac, "Help"));
|
||||
assert!(help.contains(&"help.discord".to_string()) && !help.contains(&"help.about".to_string()), "{help:?}");
|
||||
assert!(help.contains(&"help.github".to_string()) && !help.contains(&"help.about".to_string()), "{help:?}");
|
||||
let edit = ids(menu(&mac, "Edit"));
|
||||
assert!(!edit.contains(&"edit.preferences".to_string()) && edit.contains(&"edit.keyboardShortcuts".to_string()), "{edit:?}");
|
||||
assert!(ids(menu(&mac, "Window")).contains(&"[Workspace]".to_string()));
|
||||
|
||||
@@ -128,7 +128,7 @@ fn a_popover_tile_click_sets_the_fill() {
|
||||
}
|
||||
|
||||
/// The Properties panel has the Control bar's Fill and Stroke chips and stroke weight, with
|
||||
/// nothing selected too, where they set up the next object drawn (Discord feedback).
|
||||
/// nothing selected too, where they set up the next object drawn (user feedback).
|
||||
#[test]
|
||||
fn the_properties_panel_has_the_control_bars_fill_and_stroke() {
|
||||
let mut app = app();
|
||||
@@ -196,7 +196,7 @@ fn the_shortcut_table_maps_f6_to_color() {
|
||||
assert_eq!(color.shortcut, "F6");
|
||||
}
|
||||
|
||||
/// Illustrator's other Window menu panel keys (Discord feedback: Shift+F7 for Align), the dock's
|
||||
/// Illustrator's other Window menu panel keys (User feedback: Shift+F7 for Align), the dock's
|
||||
/// Layers tab (F7) among them; the menu shows them and the Keyboard Shortcuts editor lists every
|
||||
/// panel, so they can be changed.
|
||||
#[test]
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
//! Design tokens (Illustrator's four UI brightness levels), fonts and egui style.
|
||||
//! Design tokens (Illustrator's four UI brightness levels plus the Catppuccin flavours), fonts and egui style.
|
||||
|
||||
use std::sync::Arc;
|
||||
|
||||
use craft_ui::theme::catppuccin::Flavor;
|
||||
use egui::{Color32, CornerRadius, FontData, FontDefinitions, FontFamily, FontId, Stroke, TextStyle, Visuals};
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
@@ -12,16 +13,45 @@ pub enum Brightness {
|
||||
MediumDark,
|
||||
MediumLight,
|
||||
Light,
|
||||
CatppuccinLatte,
|
||||
CatppuccinFrappe,
|
||||
CatppuccinMacchiato,
|
||||
CatppuccinMocha,
|
||||
}
|
||||
|
||||
impl Brightness {
|
||||
pub const ALL: [Brightness; 4] = [Brightness::Dark, Brightness::MediumDark, Brightness::MediumLight, Brightness::Light];
|
||||
pub const ALL: [Brightness; 8] = [
|
||||
Brightness::Dark,
|
||||
Brightness::MediumDark,
|
||||
Brightness::MediumLight,
|
||||
Brightness::Light,
|
||||
Brightness::CatppuccinLatte,
|
||||
Brightness::CatppuccinFrappe,
|
||||
Brightness::CatppuccinMacchiato,
|
||||
Brightness::CatppuccinMocha,
|
||||
];
|
||||
|
||||
/// The Catppuccin flavour behind this theme, if it is one.
|
||||
pub fn flavor(self) -> Option<Flavor> {
|
||||
match self {
|
||||
Brightness::CatppuccinLatte => Some(Flavor::Latte),
|
||||
Brightness::CatppuccinFrappe => Some(Flavor::Frappe),
|
||||
Brightness::CatppuccinMacchiato => Some(Flavor::Macchiato),
|
||||
Brightness::CatppuccinMocha => Some(Flavor::Mocha),
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn label(self) -> &'static str {
|
||||
match self {
|
||||
Brightness::Dark => "Dark",
|
||||
Brightness::MediumDark => "Medium Dark",
|
||||
Brightness::MediumLight => "Medium Light",
|
||||
Brightness::Light => "Light",
|
||||
Brightness::CatppuccinLatte => "Catppuccin Latte",
|
||||
Brightness::CatppuccinFrappe => "Catppuccin Frappé",
|
||||
Brightness::CatppuccinMacchiato => "Catppuccin Macchiato",
|
||||
Brightness::CatppuccinMocha => "Catppuccin Mocha",
|
||||
}
|
||||
}
|
||||
pub fn id(self) -> &'static str {
|
||||
@@ -30,11 +60,19 @@ impl Brightness {
|
||||
Brightness::MediumDark => "mediumDark",
|
||||
Brightness::MediumLight => "mediumLight",
|
||||
Brightness::Light => "light",
|
||||
Brightness::CatppuccinLatte => "catppuccinLatte",
|
||||
Brightness::CatppuccinFrappe => "catppuccinFrappe",
|
||||
Brightness::CatppuccinMacchiato => "catppuccinMacchiato",
|
||||
Brightness::CatppuccinMocha => "catppuccinMocha",
|
||||
}
|
||||
}
|
||||
pub fn parse(s: &str) -> Option<Self> {
|
||||
Self::ALL.into_iter().find(|b| b.id().eq_ignore_ascii_case(s) || b.label().eq_ignore_ascii_case(s))
|
||||
}
|
||||
/// Every id, `|`-separated: for error messages and command docs.
|
||||
pub fn id_list() -> String {
|
||||
Self::ALL.map(Brightness::id).join("|")
|
||||
}
|
||||
}
|
||||
|
||||
/// All colours and metrics the UI uses. Never hard-code a colour in a widget.
|
||||
@@ -141,8 +179,15 @@ impl Tokens {
|
||||
axis_y: hex(0x45af63),
|
||||
axis_z: hex(0x378ef0),
|
||||
};
|
||||
if let Some(f) = b.flavor() {
|
||||
return catppuccin(base, f);
|
||||
}
|
||||
match b {
|
||||
Brightness::Dark => base,
|
||||
Brightness::Dark
|
||||
| Brightness::CatppuccinLatte
|
||||
| Brightness::CatppuccinFrappe
|
||||
| Brightness::CatppuccinMacchiato
|
||||
| Brightness::CatppuccinMocha => base,
|
||||
// Measured from Illustrator 2026 (plan/illustrator/10-observed-ui.md §1).
|
||||
Brightness::MediumDark => Tokens {
|
||||
app_bar: hex(0x535353),
|
||||
@@ -237,6 +282,54 @@ pub fn strong_selected_text(ui: &mut egui::Ui) {
|
||||
ui.visuals_mut().selection.stroke.color = Tokens::get(ui.ctx()).text_strong;
|
||||
}
|
||||
|
||||
/// A Catppuccin flavour on VectorCraft's panel layout (accent Mauve, selection Blue), over `base`'s metrics.
|
||||
fn catppuccin(base: Tokens, f: Flavor) -> Tokens {
|
||||
let p = f.palette();
|
||||
let dark = f.is_dark();
|
||||
Tokens {
|
||||
dark,
|
||||
app_bar: p.mantle,
|
||||
panel: p.base,
|
||||
panel_darker: p.mantle,
|
||||
input: if dark { p.crust } else { p.base },
|
||||
input_border: p.surface1,
|
||||
border: if dark { p.crust } else { p.surface1 },
|
||||
divider: p.surface0,
|
||||
text: p.text,
|
||||
text_dim: p.subtext0,
|
||||
text_disabled: p.overlay0,
|
||||
icon: p.subtext1,
|
||||
hover: p.surface0,
|
||||
tool_active: p.surface1,
|
||||
accent: p.mauve,
|
||||
accent_strong: p.mauve,
|
||||
row_selected: p.surface1,
|
||||
pasteboard: p.crust,
|
||||
ruler: p.mantle,
|
||||
ruler_tick: p.overlay1,
|
||||
smart_guide: p.pink,
|
||||
guide: p.sky,
|
||||
measure_bg: Color32::from_rgba_unmultiplied(p.surface1.r(), p.surface1.g(), p.surface1.b(), 235),
|
||||
button: p.surface0,
|
||||
text_strong: p.text,
|
||||
tab_strip: p.mantle,
|
||||
button_border: p.surface2,
|
||||
selection: p.blue,
|
||||
anchor_selected: p.blue,
|
||||
flyout_active: p.sapphire,
|
||||
caption_close: p.red,
|
||||
caption_close_text: p.crust,
|
||||
highlight: p.red,
|
||||
bleed: p.red,
|
||||
error: p.red,
|
||||
warning: p.yellow,
|
||||
axis_x: p.red,
|
||||
axis_y: p.green,
|
||||
axis_z: p.blue,
|
||||
..base
|
||||
}
|
||||
}
|
||||
|
||||
pub const FONT_UI: &str = "ui";
|
||||
pub const FONT_UI_SEMIBOLD: &str = "ui-semibold";
|
||||
pub const FONT_MONO: &str = "mono";
|
||||
@@ -350,4 +443,35 @@ mod tests {
|
||||
}
|
||||
assert!(!Tokens::for_brightness(Brightness::Light).dark);
|
||||
}
|
||||
|
||||
/// The Preferences dropdown (engine) and the menus (shell) list the same themes, and the
|
||||
/// `window.brightness` docs and error name every id.
|
||||
#[test]
|
||||
fn theme_lists_agree() {
|
||||
let engine: Vec<_> = vectorcraft_engine::cmd::prefscmds::UI_THEMES.to_vec();
|
||||
let shell: Vec<_> = Brightness::ALL.iter().map(|b| (b.id(), b.label())).collect();
|
||||
assert_eq!(engine, shell);
|
||||
let doc = crate::menus::UI_COMMANDS.iter().find(|c| c.0 == "window.brightness").unwrap().3;
|
||||
for b in Brightness::ALL {
|
||||
assert!(doc.contains(b.id()), "{} missing from the window.brightness docs", b.id());
|
||||
}
|
||||
assert_eq!(Brightness::id_list().split('|').count(), Brightness::ALL.len());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn catppuccin_themes_use_the_flavour_palette() {
|
||||
for b in Brightness::ALL {
|
||||
let t = Tokens::for_brightness(b);
|
||||
match b.flavor() {
|
||||
Some(f) => {
|
||||
assert_eq!(t.dark, f.is_dark(), "{}", b.id());
|
||||
assert_eq!((t.panel, t.text, t.accent), (f.palette().base, f.palette().text, f.palette().mauve), "{}", b.id());
|
||||
}
|
||||
None => assert!(b.id().eq_ignore_ascii_case(b.label().replace(' ', "").as_str()), "{}", b.id()),
|
||||
}
|
||||
}
|
||||
assert_eq!(Brightness::ALL.iter().filter(|b| b.flavor().is_some()).count(), Flavor::ALL.len());
|
||||
assert!(!Tokens::for_brightness(Brightness::CatppuccinLatte).dark);
|
||||
assert!(Tokens::for_brightness(Brightness::CatppuccinMocha).dark);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -273,10 +273,9 @@ mod tests {
|
||||
assert!(!a.shrink(0.5).intersects(b.shrink(0.5)), "{a:?} overlaps {b:?} at {width}");
|
||||
}
|
||||
}
|
||||
// Wide windows show the whole group; narrow ones drop Discord, then the search icon.
|
||||
// Wide windows show the whole group; narrow ones drop the search icon.
|
||||
let texts: Vec<String> = texts(&out).into_iter().map(|(t, _)| t).collect();
|
||||
let has = |s: &str| texts.iter().any(|t| t == s);
|
||||
assert_eq!(has("Discord"), width > 1000.0, "{width}: {texts:?}");
|
||||
// Search is an icon only (as in PhotoCraft): its label lives in the tooltip.
|
||||
assert!(!has("Search commands and tools"), "{width}: {texts:?}");
|
||||
}
|
||||
|
||||
@@ -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 VectorCraft'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 VectorCraft itself, its documentation and its official builds, to identify VectorCraft 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 VectorCraft, 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 VectorCraft.
|
||||
|
||||
Forks and modified versions
|
||||
|
||||
If you distribute or publish a modified version of VectorCraft, 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 VectorCraft by
|
||||
the ArtCraft team. A fork kept only to propose changes back to this repository may keep the marks
|
||||
unchanged.
|
||||
|
||||
Everything else
|
||||
|
||||
Any use not expressly permitted here needs prior written permission from the ArtCraft Team
|
||||
(https://getartcraft.com/). The permission ends automatically for anyone who breaks these terms.
|
||||
All other rights are reserved.
|
||||
|
Before Width: | Height: | Size: 31 KiB |
|
Before Width: | Height: | Size: 5.3 KiB |
|
Before Width: | Height: | Size: 31 KiB |
|
Before Width: | Height: | Size: 5.3 KiB |
|
Before Width: | Height: | Size: 26 KiB |
@@ -1,4 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="-10 -19.42 136.34 136.34" role="img" aria-label="ArtCraft">
|
||||
<title>ArtCraft</title>
|
||||
<path fill="#0b0b0c" d="M104.28,49.49L81.55,0h-31.23l-3.17,4.76L14.75,53.63,0,75.85l21.55,21.55,63.79-36.94,16.99,37.04,14.01-21.74-12.06-26.27ZM32.89,65.66l32.42-48.87,10.91,23.77-43.32,25.09Z"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 341 B |
|
Before Width: | Height: | Size: 24 KiB |
@@ -1,4 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="-10 -19.42 136.34 136.34" role="img" aria-label="ArtCraft">
|
||||
<title>ArtCraft</title>
|
||||
<path fill="#4e7bfb" d="M104.28,49.49L81.55,0h-31.23l-3.17,4.76L14.75,53.63,0,75.85l21.55,21.55,63.79-36.94,16.99,37.04,14.01-21.74-12.06-26.27ZM32.89,65.66l32.42-48.87,10.91,23.77-43.32,25.09Z"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 341 B |
@@ -495,7 +495,7 @@ Moved from the ROADMAP's "Shipped so far" on 2026-10-10. Update it when a featur
|
||||
- SVG/SVGZ in and out with SVG Options, Preserve Editing, symbols, filters, rich text and physical units (SVG type under a transform or `viewBox` scale opens at the size it draws at, the scale moved into its size, leading, baseline shift and strokes, a stretch, skew or rotation kept as its transform: #396; a top-level group with a clip path, such as a clipped Inkscape layer, opens as a layer with a clipping mask, its name kept: #420; hidden objects written hidden on Save and `convert`, and `data-*` attributes kept as the objects' own data: #522; top-level groups open as layers named from `data-name`, else the id, also when one more group (a transform on all the art, a `<switch>`) wraps them, hidden ones hidden, and a file whose art sits loose under a root `<svg>` with an id (or `data-name`), as one-layer exports write it, opens with its one layer named from it; nested groups stay groups, except the sublayers VectorCraft writes, marked `data-vc-layer`, and Inkscape sublayers, which open as sublayers in their layer's colour: #372); PDF and PDF-compatible `.ai` in and out (layers, with hidden ones kept hidden with their art and nested ones as sublayers, on pages of up to 64 million operators, art whose layer can't be told going to a hidden, non-printing layer rather than showing or printing: #419; strokes kept live, a fill and a stroke of one outline as one object; a type object's stroke written as each glyph's outline stroked back on the type, so it stays one editable object; lines wrapped in a frame (each wrapped line ending in a space, one left edge, leading and font) back as one area type object, left aligned or justified with its paragraph spacing, where laying it out breaks the lines where the file does; glyphs set apart by gaps wider than a space (a barcode's digit groups) keeping their places; layers stacked as the pages mark them even when one first paints on a later page, art ending a layer's marked content or a clip closing in a later layer kept in its own layer, and layers with no art kept empty: #508; art reaching past a plain PDF's page clipped to its crop box, as PDF viewers show it, each such object in a clip group of its own (a PDF-compatible `.ai` opens whole: #675); a `.ai` on its trim boxes with the bleed boxes round them as the document's bleed, as Crop To › Trim opens a PDF (#1266); masks, editable text with type set along a curve coming back as type on a path, each artboard's art on its own page only, an `.ai`'s white page under its layers left out rather than coming in as art, spot colours, presets, security, marks and bleed, ICC output intents, raster effects, subset fonts, PDF/X, PDF layers, overprint, page thumbnails, fast web view, PDF 1.3). CMYK images keep their ink amounts from PDF import (and from placed CMYK TIFFs) to PDF export: a CMYK JPEG passes through unchanged, others stay CMYK (DeviceCMYK, or ICC-based CMYK in PDF/X-3/X-4) unless the Output settings convert them; the canvas shows them through the working CMYK profile (#320). Overprint is kept from PDF import (opened, the PDF part of an `.ai`, placed) to PDF export: the graphics state's `/OP` and `/op` become the overprint of fills, strokes and type, so a spot colour over a process colour still overprints; a page whose overprint can't be read for certain knocks out with a note, as does `/OPM 0` being read as nonzero overprint (#1388; hand-written fixtures, `pdf/src/tests_import_overprint.rs`). A masked CMYK image (`/SMask`, `/Mask` or a colour key) keeps its inks too, its alpha coming in as a greyscale opacity mask.
|
||||
A PDF saved with Illustrator's editing data opens through it as a PDF-compatible `.ai` does, with its layers and groups and with art reaching past its page unclipped; such a PDF holds the data in `AIPDFPrivateData` streams (part of #868). A shape a PDF or `.ai` paints with a gradient (a clip path round a shading) opens as one path filled with the gradient, not a clip group round a rectangle, so Shape Builder, Live Paint and Pathfinder work on its outline (#1304).
|
||||
Placed (linked) files in a `.ai`'s editing data come in as linked images in their place, each showing the low-resolution preview the file keeps of it until its file is found or relinked in the Links panel (a file found next to the document or at its path is read as the document opens). A file with them no longer falls back to its PDF part, so its guides, sublayers and hidden objects open (#1264; `crates/eps/src/import/ai/tests.rs`, `crates/engine/src/tests_links.rs`). In a file opened that way, a gradient with stops in the middle runs its whole ramp across its shape and a gradient object no longer passes its fill to the next path (#1390); text objects with an appearance keep their own text and frame, type of hidden layers stays hidden, and type on later artboards lands on its text objects (#1391); area type whose frame is too short for a line of the fallback font shows its first line, the frame made taller with a warning in the open result (#1392).
|
||||
- EPS and DXF in and out, EMF/WMF in and out; PNG (with PNG-8), JPEG, WebP, GIF, TIFF, BMP, Targa and layered PSD export; grayscale TIFFs with an alpha channel or other extra channels place, relink and open, the alpha as the image's transparency (#1466 in part; CCITT Group 3 and planar files with extra channels are not read); PSD and PSB files open and place, linked or embedded, as their merged image in every colour mode and depth (#918). EPS import runs a PostScript Level 3 interpreter written from the PostScript Language Reference: resource categories and `resourceforall`, local and global VM (`currentglobal`/`setglobal`/`gcheck`), `clipsave`/`cliprestore`, subarrays and substrings that share storage, the standard dictionaries in `systemdict`, `dictstack`, `internaldict`, executable filters and strings, `load` by any key, `//name` immediate names, `token`, `execform`, user paths, `cshow`, `rootfont`, `cachestatus`, colour rendering and halftone queries, file `status` and data read with `flushfile`, and `pdfmark` marks dropped (Discord feedback, #466, #469, #474). Masked images (`ImageType 3` in its three interleavings) and reusable streams are read, and an image's several data sources are read in turn, as the reference defines (procedures that read one file get their own rows: such images came in banded, #498). `restore` puts dictionaries back as they were at the `save`, so programs that count their saves in a dictionary read to their end (part of #505). Tiling patterns come in as pattern swatches, uncoloured ones too; Type 3 fonts' glyphs as their outlines, spaced by `ashow`/`widthshow`/`xshow`/`kshow`; mesh and function-based shadings (types 1, 4–7) as gradient meshes; sampled functions (type 0) and Flate/LZW predictors are read. It is tested with programs written from the specification in the ways common generators use these features; Inkscape/cairo EPS files open as vectors. When a file's PostScript still can't be read, it opens as its TIFF preview, its Windows metafile preview (as vectors) or its EPSI preview, and the warning (in the status bar, `document.open`/`app.open`/MCP `open_file` replies and `vectorcraft-cli info`) names the error, the operator that raised it and the procedures it ran in. Legacy PostScript `.ai` files (Illustrator 3–8, written with the prolog that defines their operators) keep their groups and nested groups (`u` … `U`), between and inside clipping groups; EPS and EMF/WMF import nest clips (and groups) at most 128 deep, so a hostile file can't exhaust the stack. DXF TEXT justified Fit or Aligned spans its two points (stretched, or scaled as a whole). PDF export writes type as real, searchable text in embedded subset fonts by default, as Illustrator's PDF presets do (Convert Text to Outlines is an option; printer's marks stay shapes), so text-heavy PDFs stay small (#733). DXF export writes each fill as its outlines followed by its hatch, so laser and cutter software, which skips hatches, gets filled art and type too (#546).
|
||||
- EPS and DXF in and out, EMF/WMF in and out; PNG (with PNG-8), JPEG, WebP, GIF, TIFF, BMP, Targa and layered PSD export; grayscale TIFFs with an alpha channel or other extra channels place, relink and open, the alpha as the image's transparency (#1466 in part; CCITT Group 3 and planar files with extra channels are not read); PSD and PSB files open and place, linked or embedded, as their merged image in every colour mode and depth (#918). EPS import runs a PostScript Level 3 interpreter written from the PostScript Language Reference: resource categories and `resourceforall`, local and global VM (`currentglobal`/`setglobal`/`gcheck`), `clipsave`/`cliprestore`, subarrays and substrings that share storage, the standard dictionaries in `systemdict`, `dictstack`, `internaldict`, executable filters and strings, `load` by any key, `//name` immediate names, `token`, `execform`, user paths, `cshow`, `rootfont`, `cachestatus`, colour rendering and halftone queries, file `status` and data read with `flushfile`, and `pdfmark` marks dropped (user feedback, #466, #469, #474). Masked images (`ImageType 3` in its three interleavings) and reusable streams are read, and an image's several data sources are read in turn, as the reference defines (procedures that read one file get their own rows: such images came in banded, #498). `restore` puts dictionaries back as they were at the `save`, so programs that count their saves in a dictionary read to their end (part of #505). Tiling patterns come in as pattern swatches, uncoloured ones too; Type 3 fonts' glyphs as their outlines, spaced by `ashow`/`widthshow`/`xshow`/`kshow`; mesh and function-based shadings (types 1, 4–7) as gradient meshes; sampled functions (type 0) and Flate/LZW predictors are read. It is tested with programs written from the specification in the ways common generators use these features; Inkscape/cairo EPS files open as vectors. When a file's PostScript still can't be read, it opens as its TIFF preview, its Windows metafile preview (as vectors) or its EPSI preview, and the warning (in the status bar, `document.open`/`app.open`/MCP `open_file` replies and `vectorcraft-cli info`) names the error, the operator that raised it and the procedures it ran in. Legacy PostScript `.ai` files (Illustrator 3–8, written with the prolog that defines their operators) keep their groups and nested groups (`u` … `U`), between and inside clipping groups; EPS and EMF/WMF import nest clips (and groups) at most 128 deep, so a hostile file can't exhaust the stack. DXF TEXT justified Fit or Aligned spans its two points (stretched, or scaled as a whole). PDF export writes type as real, searchable text in embedded subset fonts by default, as Illustrator's PDF presets do (Convert Text to Outlines is an option; printer's marks stay shapes), so text-heavy PDFs stay small (#733). DXF export writes each fill as its outlines followed by its hatch, so laser and cutter software, which skips hatches, gets filled art and type too (#546).
|
||||
- DXF control-point SPLINE import honors its closed flag (#1299 follow-up after #1320 fixed export), including rational curves; open curves whose endpoints meet stay open. Own-fixture regressions cover controls/knots, fit-point fallback and all export versions (`crates/cad/src/import/tests.rs`, `crates/cad/src/tests.rs`); native save/read checked; CIRCLE/ARC fitting, CNC preset and VCarve QA remain pending.
|
||||
- Affinity documents in (AF.1–AF.4): `.af` (Affinity 3) and `.afdesign`/`.afphoto`/`.afpub` (Affinity 1 and 2, container versions 8–12) open and place as editable art: layers and sublayers, groups (pass-through or isolated), artboards (with their names and backgrounds) and Publisher pages side by side, curves with live corners, parametric shapes (rectangles with corner radii, ellipses, polygons, stars, pies, triangles, trapezoids), compound shapes, solid/linear/elliptical gradient fills and strokes (weight, dashes, alignment, scale-with-object), clipping by nesting, vector and pixel masks, artistic and frame text with fonts, sizes, tracking, leading and alignment, placed images (their original JPEG/PNG) and pixel layers (8/16-bit RGB, CMYK), opacity, visibility, locking and blend modes, at the document's resolution in points. Effects, adjustments, brushes and pressure profiles, transparency gradients, master pages, symbol instances (imported as their cached picture), special shapes (cloud, heart, cog…, imported as ellipses) and Affinity-only blend modes are named in the import warning. A file whose native data can't be read opens as its embedded preview with the reason, and that preview can't be placed. Save never writes back over the Affinity file and there is no Affinity export. AF.4 adds Affinity 3 artboard recognition and actual-outline clipping, source-backed JPEG/PNG raster tiles, Unicode text-run recovery, stored fallback/exact installed fonts, OpenType feature flags and compound-geometry limits. 51 public CC0/MIT/Apache-2.0 files (33 current `.af`), pinned and sha256-verified (`cargo xtask corpus --affinity`), test native retention and every-board native/SVG/PDF/PSD output for current files; selected files compare their saved thumbnails. No Affinity reopen or independent paired PSD oracle was available; [source audit and complex-font gaps](affinity-validation.md); [scope, provenance and limits](../crates/affinity/README.md).
|
||||
- Placed documents: File › Place of a `.vectorcraft` file links to it by default (`file.place`'s `link`): one locked object showing an artboard of the document (or its art's bounds), read the way placing it without Link reads it, its symbols, patterns and images kept apart from the document's; without Link (or from bytes, not a file) it is an editable copy as before. It stays vectors in every output (SVG, PDF, EPS, EMF, DXF), and so do placed documents inside it, read from their own files up to 8 levels deep (documents that place each other stop there). On screen they draw from bitmaps cached per file and zoom step, shared by every copy and made in the background (a placeholder until ready), so a sheet of them redraws in about a millisecond; exports and prints draw them exactly. Like linked images, a save keeps only a preview of each (JPEG when opaque) unless Include Linked Files; output, and zooming past the preview, read the file again, falling back to the preview with a warning when it is gone or changed. Saves for older versions write them as plain art. Links check, update, relink, Update Links on open, Link Info (the artboard's size), Placement Options, Break Link (also Embed, Object › Expand: the editable copy placing without Link gives, its resources joining the document), Edit Original (the document in a new tab) and the Links panel cover them; saving a document updates the open documents that place it. The native format (v4) keeps data of 8 KB or more after the JSON instead of base64 in it.
|
||||
|
||||
@@ -20,10 +20,10 @@
|
||||
<launchable type="desktop-id">ai.storyteller.vectorcraft.desktop</launchable>
|
||||
<icon type="stock">ai.storyteller.vectorcraft</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/vectorcraft</url>
|
||||
<url type="homepage">https://github.com/storytold/vectorcraft</url>
|
||||
<url type="bugtracker">https://github.com/storytold/vectorcraft/issues</url>
|
||||
<url type="help">https://github.com/storytold/vectorcraft</url>
|
||||
<url type="contact">https://discord.gg/artcraft</url>
|
||||
<url type="contact">https://github.com/storytold/vectorcraft/issues</url>
|
||||
<categories>
|
||||
<category>Graphics</category>
|
||||
<category>2DGraphics</category>
|
||||
|
||||
@@ -14,7 +14,7 @@ section: graphics
|
||||
priority: optional
|
||||
maintainer: ${VECTORCRAFT_MAINTAINER}
|
||||
vendor: Learning Machines LLC
|
||||
homepage: https://getartcraft.com/apps/vectorcraft
|
||||
homepage: https://github.com/storytold/vectorcraft
|
||||
license: MIT OR Apache-2.0
|
||||
description: |-
|
||||
Open-source, native vector illustration app.
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
Produces, in $env:DIST (default: dist/release):
|
||||
vectorcraft-<version>-windows-<arch>.msi per-machine installer (WiX v5)
|
||||
vectorcraft-<version>-windows-<arch>-portable.zip vectorcraft.exe + vectorcraft-cli.exe
|
||||
vectorcraft-cli-<version>-windows-<arch>.zip vectorcraft-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
|
||||
@@ -26,6 +27,7 @@ param(
|
||||
)
|
||||
$ErrorActionPreference = 'Stop'
|
||||
$Root = (Resolve-Path (Join-Path $PSScriptRoot '..\..')).Path
|
||||
Set-Location $Root
|
||||
|
||||
function Invoke-Native([string] $What, [scriptblock] $Block) {
|
||||
Write-Output "==> $What"
|
||||
@@ -57,6 +59,17 @@ if (-not $env:VECTORCRAFT_BUILD_DATE) { $env:VECTORCRAFT_BUILD_DATE = (Get-Date)
|
||||
Write-Output "VectorCraft $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'
|
||||
@@ -161,6 +174,19 @@ $Zip = Join-Path $Dist "vectorcraft-$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\vectorcraft-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 'vectorcraft-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 "vectorcraft-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()
|
||||
@@ -169,4 +195,4 @@ if ($Arch -ne 'arm64' -or $HostArch -eq 'arm64') {
|
||||
} else {
|
||||
Write-Output "skipping vectorcraft-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
|
||||
|
||||
@@ -33,9 +33,9 @@
|
||||
|
||||
<Icon Id="VectorcraftIcon.ico" SourceFile="$(var.IconPath)" />
|
||||
<Property Id="ARPPRODUCTICON" Value="VectorcraftIcon.ico" />
|
||||
<Property Id="ARPURLINFOABOUT" Value="https://getartcraft.com/apps/vectorcraft" />
|
||||
<Property Id="ARPURLUPDATEINFO" Value="https://getartcraft.com/apps/vectorcraft" />
|
||||
<Property Id="ARPHELPLINK" Value="https://discord.gg/artcraft" />
|
||||
<Property Id="ARPURLINFOABOUT" Value="https://github.com/storytold/vectorcraft" />
|
||||
<Property Id="ARPURLUPDATEINFO" Value="https://github.com/storytold/vectorcraft" />
|
||||
<Property Id="ARPHELPLINK" Value="https://github.com/storytold/vectorcraft/issues" />
|
||||
|
||||
<StandardDirectory Id="ProgramFiles6432Folder">
|
||||
<Directory Id="INSTALLFOLDER" Name="VectorCraft" />
|
||||
|
||||