9 Commits

Author SHA1 Message Date
Marcos Paulo 1ec29e6a6f chore: release 0.8.3 2026-10-12 21:41:53 -03:00
Marcos Paulo 59a92886b8 build: refresh Cargo.lock for the masi/craft-libs fork rev 2026-10-12 21:14:02 -03:00
Marcos Paulo ae55cf7094 build: refresh Cargo.lock for the masi/craft-libs fork rev 2026-10-12 21:09:05 -03:00
Marcos Paulo cf6473dcd9 build: pin craft-ui to the same masi/craft-libs rev as craft-print 2026-10-12 21:09:05 -03:00
Marcos Paulo 122d60fb10 fix(debrand): restore .debrand rules mangled by a sync run; point craft-print at the fork 2026-10-12 21:09:05 -03:00
Marcos Paulo 60879d8776 build: use the masi/craft-libs fork; take the Catppuccin palette from craft-ui
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-12 21:09:05 -03:00
Marcos Paulo d41f9bc63d build(windows): package standalone photocraft-cli zip and auto-detect rc.exe 2026-10-12 21:09:05 -03:00
Marcos Paulo ac9e15a079 feat(ui): Catppuccin Latte, Frappé, Macchiato and Mocha themes
Four new themes on the Studio layout (Window > Theme, Preferences, ui.set),
wired through the engine's Theme/DarkTheme/LightTheme preferences. Palette
is the MIT-licensed Catppuccin one (LICENSE-catppuccin.txt, ATTRIBUTION.md).
Menu and preference labels translated for every complete-menu language.
.debrand now exempts itself from its own check.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-12 21:09:05 -03:00
Marcos Paulo eb7321b0e4 chore: debrand ArtCraft and Discord references
Remove the Discord button, Help menu links and brand assets; rewrite docs,
packaging URLs and catalogs. Add .debrand rules and the craft-skills
submodule (debrand skill) to keep upstream syncs clean. Drop duplicate
Czech catalog rows that failed bundled_catalogs_are_consistent.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-12 21:09:05 -03:00
62 changed files with 1679 additions and 498 deletions
+21
View File
@@ -0,0 +1,21 @@
# Strip upstream (ArtCraft / Discord) branding. Run: ~/.agents/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.*(?:ArtCraft|Discord)
dropline ^ATTRIBUTION\.md$ :: \|\s*`docs/brand/
sub (?s)\nThe ArtCraft name, wordmark and logos in docs/brand/.*?LICENSE-brand\.txt\.\n =>
sub (?s)\s*The ArtCraft name, wordmark, and logos in `docs/brand/`.*?source-code license\. =>
sub \s*The ArtCraft logos in `docs/brand/` are not open source \(`docs/brand/LICENSE-brand\.txt`\)\. =>
sub drawn in ArtCraft, vectorised => drawn by hand, vectorised
sub created\s+in ArtCraft, then => created by hand, then
sub made in ArtCraft \( => drawn by hand (
sub the owner's ArtCraft drawing => the owner's drawing
sub the ArtCraft team and PhotoCraft contributors => the PhotoCraft contributors
sub ArtCraft, ArtCraftX,\s =>
sub \bArtCraft, =>
sub https://getartcraft\.com/apps/photocraft => https://github.com/storytold/photocraft
sub https://discord\.gg/artcraft => https://github.com/storytold/photocraft/issues
forbid (?i)artcraft(?! Team and the PhotoCraft contributors)
forbid (?i)discord
sub Discord \(Help › Discord\), then the theme toggle => the theme toggle
+3
View File
@@ -0,0 +1,3 @@
[submodule "tools/craft-skills"]
path = tools/craft-skills
url = https://git.marcospaulo.dev.br/storytold/craft-skills.git
+2 -2
View File
@@ -1,6 +1,6 @@
# AGENTS.md: guide for AI agents and contributors
PhotoCraft is an open-source, native, Photoshop-comparable image editor written in **Rust only** (no JavaScript or TypeScript). **No Tauri, Electron or webview shells:** the desktop app is native egui/eframe on wgpu, and the web build is the same Rust compiled to WebAssembly (trunk + wasm-bindgen). Never add Tauri (or any webview/JS UI framework) as a dependency, build step or packaging target. The product name is always written **PhotoCraft** (`{Function}Craft` in PascalCase, like its siblings ArtCraft, ArtCraftX, DesignCraft, VectorCraft, EffectCraft, FilmCraft, LightCraft, PdfCraft) in user-facing text: UI, window titles, About, installers, release names, docs prose. Machine names stay lowercase: crates (`photocraft-*`), binaries, file names, ids (`ai.storyteller.photocraft`). Standards and learnings shared across the crafting apps live in `../craftrules` (read its `README.md`; the repository is not public — outside contributors should ask a maintainer for the standards relevant to their change). Contribute reusable learnings there; shared Rust components live in [storytold/craft-libs](https://github.com/storytold/craft-libs) and are pinned by immutable git revision. UI libraries stay at L6. The goal is 1:1 Photoshop parity (same menus, shortcuts, behaviour and file fidelity) with better performance, and every feature drivable by agents. Read this file first, then `docs/`.
PhotoCraft is an open-source, native, Photoshop-comparable image editor written in **Rust only** (no JavaScript or TypeScript). **No Tauri, Electron or webview shells:** the desktop app is native egui/eframe on wgpu, and the web build is the same Rust compiled to WebAssembly (trunk + wasm-bindgen). Never add Tauri (or any webview/JS UI framework) as a dependency, build step or packaging target. The product name is always written **PhotoCraft** (`{Function}Craft` in PascalCase, like its siblings DesignCraft, VectorCraft, EffectCraft, FilmCraft, LightCraft, PdfCraft) in user-facing text: UI, window titles, About, installers, release names, docs prose. Machine names stay lowercase: crates (`photocraft-*`), binaries, file names, ids (`ai.storyteller.photocraft`). Standards and learnings shared across the crafting apps live in `../craftrules` (read its `README.md`; the repository is not public — outside contributors should ask a maintainer for the standards relevant to their change). Contribute reusable learnings there; shared Rust components live in [storytold/craft-libs](https://github.com/storytold/craft-libs) and are pinned by immutable git revision. UI libraries stay at L6. The goal is 1:1 Photoshop parity (same menus, shortcuts, behaviour and file fidelity) with better performance, and every feature drivable by agents. Read this file first, then `docs/`.
## 1. Orientation (5 minutes)
@@ -61,7 +61,7 @@ People trust PhotoCraft with their work, and a crash loses it. A malformed file,
1. **Everything is a command.** New user-visible behaviour = a command in the engine (`crates/engine/src/*_cmds.rs`, registered in `commands.rs`) with id, label, menu path, shortcut, params doc, `enabled` and `run`, plus tests. The UI, CLI, control channel and MCP all dispatch commands by id. Use the **exact id from `crates/ui-egui/src/menu_catalog.rs`** and the menu item goes live automatically. Only pure view/window state (zoom, panels, screen mode) belongs to the shell (`menus.rs` `UI_COMMANDS`).
2. **No format or colour assumptions.** Bit depth (8/16/32f) and colour model (RGB/Gray/CMYK/Lab…) are runtime data. Never introduce a `u8`-only pixel path in public APIs. Never assume sRGB: colour conversions go through `photocraft-cms` (`Transform`, `transform::cached`). Test at several depths.
3. **Clean-room.** We studied Photoshop and other proprietary editors for *behaviour and look only*. Never copy their code, shaders, profiles or assets. Implement from public specs (Adobe PSD spec, ICC, ISO 32000 blend modes, papers) and observation. Third-party assets must be permissively licensed, keep their license file next to them, and get a row in `ATTRIBUTION.md` (path, title, author, source, license) in the same change; so do original assets. The ArtCraft logos in `docs/brand/` are not open source (`docs/brand/LICENSE-brand.txt`). **Never commit font files:** fonts live in [storytold/craft-fonts](https://github.com/storytold/craft-fonts) (rules: `../craftrules/standards/fonts.md`). PhotoCraft uses it through the optional build input `CRAFT_FONTS_DIR=<craft-fonts checkout>` (read by `crates/text/build.rs`, exposed as `photocraft_text::CRAFT_FONTS`; empty without it, and everything must still work). Build with it: `CRAFT_FONTS_DIR="$PWD/../craft-fonts" cargo build`; details in `docs/development.md` › Fonts.
3. **Clean-room.** We studied Photoshop and other proprietary editors for *behaviour and look only*. Never copy their code, shaders, profiles or assets. Implement from public specs (Adobe PSD spec, ICC, ISO 32000 blend modes, papers) and observation. Third-party assets must be permissively licensed, keep their license file next to them, and get a row in `ATTRIBUTION.md` (path, title, author, source, license) in the same change; so do original assets. **Never commit font files:** fonts live in [storytold/craft-fonts](https://github.com/storytold/craft-fonts) (rules: `../craftrules/standards/fonts.md`). PhotoCraft uses it through the optional build input `CRAFT_FONTS_DIR=<craft-fonts checkout>` (read by `crates/text/build.rs`, exposed as `photocraft_text::CRAFT_FONTS`; empty without it, and everything must still work). Build with it: `CRAFT_FONTS_DIR="$PWD/../craft-fonts" cargo build`; details in `docs/development.md` › Fonts.
4. **Tests are the gate.** Every change comes with tests. Format crates use round-trip, synthetic-generator, oracle and fuzz tests. Keep the PSD corpus results and the parity floor (`crates/ui-egui/src/parity.rs`) from regressing.
5. **The UI is thin and data-driven.** UI state lives in `ui-egui/src/state.rs` (serde), so the control channel can read and drive it. Colours and radii come from `theme::Tokens`, never hard-coded.
6. **Verify UI changes visually.** Render offscreen with `cargo run -p photocraft-ui-egui --example snapshot` (no window, no focus stealing), or launch with `--control` and take `ui.screenshot`. Look at the PNG. Demo images must be public-domain art, never personal photos. When fetching assets, never put a person's name, email or other personal details in requests (User-Agent, headers, URLs); use a generic `Photocraft-dev` User-Agent.
+2 -2
View File
@@ -47,9 +47,10 @@ next to them.
| `assets/icons/lasso-magnetic.svg` | Magnetic Lasso tool glyph, adapted from "Magnetic Lasso Tool" (redrawn on the 24 px toolbar grid) | Lil' Seal (Noun Project); adapted by PhotoCraft contributors | <https://thenounproject.com/icon/magnetic-lasso-tool-177513/> | CC BY 3.0, [`assets/icons/LICENSE-noun-magnetic-lasso.txt`](assets/icons/LICENSE-noun-magnetic-lasso.txt) |
| `assets/dict/en_US-scowl-50.txt.gz` | English word list for Check Spelling (SCOWL 2020.12.07, size 50, en_US; 72,403 words) | Kevin Atkinson and the SCOWL contributors | <http://wordlist.aspell.net/> | SCOWL license (permissive, keep the notice), [`assets/dict/LICENSE-SCOWL.txt`](assets/dict/LICENSE-SCOWL.txt), which also has the build recipe |
| `crates/cms/profiles/photocraft-coated-cmyk.icc` | PhotoCraft Coated CMYK (synthetic) ICC profile | PhotoCraft contributors (generated by `photocraft-cms`, `src/synth.rs`) | Original work, see [`crates/cms/README.md`](crates/cms/README.md) | CC0-1.0 |
| `assets/app-icon/` (all files) | PhotoCraft app icon (nine-tailed kitsune) | The project owner (drawn in ArtCraft, vectorised) | Original work, see [`assets/app-icon/README.md`](assets/app-icon/README.md) | MIT OR Apache-2.0, [`assets/app-icon/LICENSE.txt`](assets/app-icon/LICENSE.txt) |
| `assets/app-icon/` (all files) | PhotoCraft app icon (nine-tailed kitsune) | The project owner (drawn by hand, vectorised) | Original work, see [`assets/app-icon/README.md`](assets/app-icon/README.md) | MIT OR Apache-2.0, [`assets/app-icon/LICENSE.txt`](assets/app-icon/LICENSE.txt) |
| `packaging/macos/dmg/` (all files) | PhotoCraft DMG window background and layout | @XusBadia, from the PhotoCraft app icon | Original work, see [`packaging/macos/dmg/README.md`](packaging/macos/dmg/README.md) | MIT OR Apache-2.0, like the code |
| `crates/ui-egui/src/theme.rs` (Solarized Dark palette) | Solarized colour scheme used by the Solarized Dark theme | Ethan Schoonover | <https://ethanschoonover.com/solarized/> | MIT, [`LICENSE-solarized.txt`](crates/ui-egui/src/LICENSE-solarized.txt) |
| `crates/ui-egui/src/theme_catppuccin.rs` (Catppuccin palettes) | Catppuccin Latte, Frappé, Macchiato and Mocha colours used by the Catppuccin themes | Catppuccin | <https://catppuccin.com/palette> | MIT, [`LICENSE-catppuccin.txt`](crates/ui-egui/src/LICENSE-catppuccin.txt) |
| `crates/ui-egui/src/theme.rs` (Breeze Light and Breeze Dark themes) | The Breeze Light and Breeze Dark themes are original colour values on PhotoCraft's Studio layout, chosen to look close to KDE Plasma's Breeze (cool blue-greys, blue accent, 5 px frame radius) so the app blends into a Plasma desktop. None of Breeze's colour values, files or code are copied; the values are a few levels away from its schemes and tuned for text contrast | PhotoCraft contributors | Inspired by the look of KDE Breeze, <https://invent.kde.org/plasma/breeze> (its colour schemes are LGPL-2.0-or-later) | Original work |
### Optional build input: craft-fonts (not files in this repo)
@@ -73,7 +74,6 @@ The other built-in ICC profiles and the generated LUT looks are produced by code
| Path | Title | Author | Source | License |
|---|---|---|---|---|
| `docs/brand/` (all files) | ArtCraft name, wordmark and mark | ArtCraft Team | getartcraft.com | Not open source; trademarks of the ArtCraft Team, [`docs/brand/LICENSE-brand.txt`](docs/brand/LICENSE-brand.txt) |
| `docs/images/photocraft-*.jpg` | PhotoCraft screenshots | PhotoCraft contributors (UI) | Rendered offscreen with the `snapshot` example | MIT OR Apache-2.0 (UI); the artwork in each is public domain, listed below |
| `docs/images/preferences-apply-*.png` | Preferences before and after adding Apply (no artwork) | PhotoCraft contributors | PhotoCraft control-channel capture and offscreen `snapshot` example | MIT OR Apache-2.0 |
Generated
+1252 -128
View File
File diff suppressed because it is too large Load Diff
+3 -3
View File
@@ -4,13 +4,13 @@ members = ["crates/*", "apps/*", "xtask"]
default-members = ["crates/*", "apps/photocraft", "apps/photocraft-cli", "xtask"]
[workspace.package]
version = "0.8.2"
version = "0.8.3"
edition = "2024"
license = "MIT OR Apache-2.0"
rust-version = "1.95"
[workspace.dependencies]
craft-ui = { git = "https://github.com/storytold/craft-libs", rev = "5c874d51eeb3de70e735c8ce87a59a7dedd47675", features = ["serde"] }
craft-ui = { git = "https://git.marcospaulo.dev.br/masi/craft-libs", rev = "7fcee66b8eef8eac3c7644fd024e1f1b051f5a3e", features = ["serde"] }
# internal
photocraft-geom = { path = "crates/geom" }
photocraft-color = { path = "crates/color" }
@@ -38,7 +38,7 @@ photocraft-testkit = { path = "crates/testkit" }
photocraft-tablet = { path = "crates/tablet" }
# external
craft-print = { git = "https://github.com/storytold/craft-libs", rev = "d991bf6792f8ade99c51358bf3c1d902c8cd96b5" }
craft-print = { git = "https://git.marcospaulo.dev.br/masi/craft-libs", rev = "7fcee66b8eef8eac3c7644fd024e1f1b051f5a3e" }
thiserror = "2"
serde = { version = "1", features = ["derive", "rc"] }
serde_json = "1"
-4
View File
@@ -3,10 +3,6 @@ Copyright (c) 2026 ArtCraft Team and the PhotoCraft 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
+12 -70
View File
@@ -1,12 +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">PhotoCraft</h1>
<p align="center">
@@ -22,16 +13,6 @@
<img alt="Status: early alpha" src="https://img.shields.io/badge/status-early%20alpha-d69e2e?style=flat-square">
</p>
<p align="center">
<a href="https://discord.gg/artcraft"><img alt="Join the ArtCraft community on Discord" src="https://img.shields.io/badge/Join%20us%20on%20Discord-5865F2?style=for-the-badge&logo=discord&logoColor=white" height="40"></a>
</p>
<p align="center">
<a href="https://getartcraft.com/apps/photocraft"><b>PhotoCraft 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">
@@ -41,10 +22,6 @@
<i>The Great Wave off Kanagawa</i>, Katsushika Hokusai, c. 1831</sub>
</p>
> [!NOTE]
> **ArtCraft is a community of artists from all walks of life.** Digital, generative, music,
> games &mdash; if you make things, you're one of us. **[Come say hi on Discord](https://discord.gg/artcraft).**
<p align="center">
<a href="#features">Features</a> ·
<a href="#everything-in-the-box">Everything in the box</a> ·
@@ -53,8 +30,7 @@
<a href="#under-the-hood">Under the hood</a> ·
<a href="#get-started">Get started</a> ·
<a href="#downloads">Downloads</a> ·
<a href="#the-crafting-apps">Crafting Apps</a> ·
<a href="https://discord.gg/artcraft">Discord</a>
<a href="#the-crafting-apps">Crafting Apps</a>
</p>
<br>
@@ -298,7 +274,7 @@ photocraft
Maintainers: [`docs/releasing.md`](docs/releasing.md) explains how releases are built, signed and published.
> [!IMPORTANT]
> **Status:** PhotoCraft is in early alpha, and we want to be straight about where it stands: much of Photoshop's feature surface exists in some form, but **it is not yet a Photoshop replacement for daily professional work**. The biggest gaps are AI/generative features, 15 missing tools, depth in typography and pro workflows, and plug-in compatibility. Every Photoshop menu item is wired to a command ([`docs/parity-checklist.md`](docs/parity-checklist.md)), but that measures wiring, not behaviour. The honest, dimension-by-dimension picture and where we're going next are in the [roadmap](ROADMAP.md) and [parity assessment](docs/target-app-parity.md). Expect rough edges, and please file issues (include your OS, document size, layer count and a screenshot). You can also tell us what broke on [Discord](https://discord.gg/artcraft).
> **Status:** PhotoCraft is in early alpha, and we want to be straight about where it stands: much of Photoshop's feature surface exists in some form, but **it is not yet a Photoshop replacement for daily professional work**. The biggest gaps are AI/generative features, 15 missing tools, depth in typography and pro workflows, and plug-in compatibility. Every Photoshop menu item is wired to a command ([`docs/parity-checklist.md`](docs/parity-checklist.md)), but that measures wiring, not behaviour. The honest, dimension-by-dimension picture and where we're going next are in the [roadmap](ROADMAP.md) and [parity assessment](docs/target-app-parity.md). Expect rough edges, and please file issues (include your OS, document size, layer count and a screenshot). You can also tell us what broke on [GitHub](https://github.com/storytold/photocraft/issues).
## Documentation
@@ -319,8 +295,6 @@ sha256-verified. Fetch them with `cargo xtask corpus --all` and run the tests wi
## Downloads
**New to PhotoCraft?** Download it from the [PhotoCraft page on getartcraft.com](https://getartcraft.com/apps/photocraft). That's the easiest way to install it.
**Want a specific build or format?** On GitHub, the [latest release](https://github.com/storytold/photocraft/releases/latest) has every build listed below, and [all releases](https://github.com/storytold/photocraft/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
@@ -367,45 +341,23 @@ RISC-V (riscv64): `photocraft-<ver>-linux-riscv64.tar.gz` only, built against Ub
## The Crafting Apps
PhotoCraft 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 · you are here** | [GitHub](https://github.com/storytold/photocraft) | [Website](https://getartcraft.com/apps/photocraft) |
| <img src="https://raw.githubusercontent.com/storytold/vectorcraft/main/assets/app-icon/hicolor/64x64/apps/ai.storyteller.vectorcraft.png" alt="" width="32" height="32"> | **VectorCraft** | Vector illustration | [GitHub](https://github.com/storytold/vectorcraft) | [Website](https://getartcraft.com/apps/vectorcraft) |
| <img src="https://raw.githubusercontent.com/storytold/filmcraft/main/assets/app-icon/hicolor/64x64/apps/ai.storyteller.filmcraft.png" alt="" width="32" height="32"> | **FilmCraft** | Video editing, color and sound | [GitHub](https://github.com/storytold/filmcraft) | [Website](https://getartcraft.com/apps/filmcraft) |
| <img src="https://raw.githubusercontent.com/storytold/lightcraft/main/assets/app-icon/hicolor/64x64/apps/ai.storyteller.lightcraft.png" alt="" width="32" height="32"> | **LightCraft** | Photo library and raw development | [GitHub](https://github.com/storytold/lightcraft) | [Website](https://getartcraft.com/apps/lightcraft) |
| <img src="https://raw.githubusercontent.com/storytold/pdfcraft/main/assets/app-icon/hicolor/64x64/apps/ai.storyteller.pdfcraft.png" alt="" width="32" height="32"> | **PdfCraft** | Reading, organizing and protecting PDFs | [GitHub](https://github.com/storytold/pdfcraft) | [Website](https://getartcraft.com/apps/pdfcraft) |
| <img src="https://raw.githubusercontent.com/storytold/effectcraft/main/assets/app-icon/hicolor/64x64/apps/ai.storyteller.effectcraft.png" alt="" width="32" height="32"> | **EffectCraft** | Motion graphics and visual effects | [GitHub](https://github.com/storytold/effectcraft) | [Website](https://getartcraft.com/apps/effectcraft) |
| <img src="https://raw.githubusercontent.com/storytold/designcraft/main/assets/app-icon/hicolor/64x64/apps/ai.storyteller.designcraft.png" alt="" width="32" height="32"> | **DesignCraft** | Page layout and publishing | [GitHub](https://github.com/storytold/designcraft) | [Website](https://getartcraft.com/apps/designcraft) |
And [**ArtCraft**](https://getartcraft.com/) itself, our AI image and video studio for artists who want real control.
| | 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 · you are here** | [GitHub](https://github.com/storytold/photocraft) |
| <img src="https://raw.githubusercontent.com/storytold/vectorcraft/main/assets/app-icon/hicolor/64x64/apps/ai.storyteller.vectorcraft.png" alt="" width="32" height="32"> | **VectorCraft** | Vector illustration | [GitHub](https://github.com/storytold/vectorcraft) |
| <img src="https://raw.githubusercontent.com/storytold/filmcraft/main/assets/app-icon/hicolor/64x64/apps/ai.storyteller.filmcraft.png" alt="" width="32" height="32"> | **FilmCraft** | Video editing, color and sound | [GitHub](https://github.com/storytold/filmcraft) |
| <img src="https://raw.githubusercontent.com/storytold/lightcraft/main/assets/app-icon/hicolor/64x64/apps/ai.storyteller.lightcraft.png" alt="" width="32" height="32"> | **LightCraft** | Photo library and raw development | [GitHub](https://github.com/storytold/lightcraft) |
| <img src="https://raw.githubusercontent.com/storytold/pdfcraft/main/assets/app-icon/hicolor/64x64/apps/ai.storyteller.pdfcraft.png" alt="" width="32" height="32"> | **PdfCraft** | Reading, organizing and protecting PDFs | [GitHub](https://github.com/storytold/pdfcraft) |
| <img src="https://raw.githubusercontent.com/storytold/effectcraft/main/assets/app-icon/hicolor/64x64/apps/ai.storyteller.effectcraft.png" alt="" width="32" height="32"> | **EffectCraft** | Motion graphics and visual effects | [GitHub](https://github.com/storytold/effectcraft) |
| <img src="https://raw.githubusercontent.com/storytold/designcraft/main/assets/app-icon/hicolor/64x64/apps/ai.storyteller.designcraft.png" alt="" width="32" height="32"> | **DesignCraft** | Page layout and publishing | [GitHub](https://github.com/storytold/designcraft) |
The Crafting Apps share the same conventions: clean-room and pure Rust, native on macOS, Windows and Linux, in the browser via WebAssembly, and fully drivable by agents.
<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/photocraft">PhotoCraft</a>
</p>
---
## License and credits
@@ -418,18 +370,8 @@ with its author, source and license in [ATTRIBUTION.md](ATTRIBUTION.md).
Every artwork shown is in the public domain (Wikimedia Commons, NASA, U.S. National Archives); sources are listed in [`docs/images/SOURCES.md`](docs/images/SOURCES.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 PhotoCraft, 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. PhotoCraft 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>
## Star history
[![Star History Chart](https://api.star-history.com/svg?repos=storytold/photocraft&type=Date&legend=top-left)](https://www.star-history.com/?repos=storytold%2Fphotocraft&type=date&legend=top-left)
+1 -2
View File
@@ -1,8 +1,7 @@
PhotoCraft app icon (photocraft.svg, photocraft-small.svg and every file derived from them in
this directory: photocraft-1024.png, photocraft.icns, photocraft.ico, hicolor/).
Original artwork made for this project by the project owner: an engraving-style drawing created
in ArtCraft, then vectorised. No third-party material. Licensed like the rest of PhotoCraft,
Original artwork made for this project by the project owner: an engraving-style drawing created by hand, then vectorised. No third-party material. Licensed like the rest of PhotoCraft,
under either of
* Apache License, Version 2.0 (https://www.apache.org/licenses/LICENSE-2.0)
+1 -1
View File
@@ -22,7 +22,7 @@ each side so the figure reads at 16–48 px.
## Provenance
The owner's original drawing, made in ArtCraft (2880 px, engraving style, keyed to the palette),
The owner's original drawing, drawn by hand (2880 px, engraving style, keyed to the palette),
vectorised with craftrules `assets/logo-options/_tools/vectorize_tile.py`. The source PNG stays in
craftrules at `assets/app-icons/photocraft/source.png`. License: see `LICENSE.txt`.
+1 -1
View File
@@ -1,6 +1,6 @@
# Credits
PhotoCraft is created and maintained by the ArtCraft team and PhotoCraft contributors. Project ownership, copyright, and licensing remain as stated in the repository's `README.md`, `NOTICE`, and license files. Every merged contribution is credited in the repository history and release notes.
PhotoCraft is created and maintained by the PhotoCraft contributors. Project ownership, copyright, and licensing remain as stated in the repository's `README.md`, `NOTICE`, and license files. Every merged contribution is credited in the repository history and release notes.
## Documentation
+1 -1
View File
@@ -7,6 +7,6 @@ PhotoCraft source is dual-licensed under MIT or Apache-2.0 at the user's option.
- [`NOTICE`](https://github.com/storytold/photocraft/blob/main/NOTICE)
- [`ATTRIBUTION.md`](https://github.com/storytold/photocraft/blob/main/ATTRIBUTION.md)
Bundled third-party assets retain their own licenses and attribution requirements. The ArtCraft name, wordmark, and logos in `docs/brand/` are subject to [`docs/brand/LICENSE-brand.txt`](https://github.com/storytold/photocraft/blob/main/docs/brand/LICENSE-brand.txt) and are not covered by the source-code license.
Bundled third-party assets retain their own licenses and attribution requirements.
This page summarizes repository locations and does not alter any ownership or license term.
+1 -1
View File
@@ -309,7 +309,7 @@ pub struct UiSetParams {
/// Fields for the control method `ui.set`: tool, panels, dock, dockTabs, dockWidth, colorPanel
/// ({background: bool} picks which swatch the Color panel edits), maskTarget,
/// vectorMaskTarget, selectionMode, zoom, center, rotation (view angle in degrees), fit, theme (pro, proMedium, studio,
/// studioLight, classic, solarizedDark, adwaita, adwaitaDark, breezeLight, breezeDark), brushSection, brushTab,
/// studioLight, classic, solarizedDark, adwaita, adwaitaDark, breezeLight, breezeDark, catppuccinLatte, catppuccinFrappe, catppuccinMacchiato, catppuccinMocha), brushSection, brushTab,
/// brushesView, brushPicker ([x, y] opens the Brush Preset picker there, null closes it),
/// brushPickerName, brushPickerStroke, brushPickerTip (the picker card's parts, at least one
/// on), brushPickerScale (the picker footer's card-scale slider, 0.15 to 2, 1 the standard),
+31 -5
View File
@@ -55,10 +55,10 @@ choice!(TypeUnit { Points = "points", Pixels = "pixels", Millimeters = "mm" } de
choice!(PointSize { PostScript = "postScript", Traditional = "traditional" } default PostScript);
choice!(Interpolation { BicubicAutomatic = "bicubicAutomatic", Nearest = "nearestNeighbor", Bilinear = "bilinear", Bicubic = "bicubic", BicubicSmoother = "bicubicSmoother", BicubicSharper = "bicubicSharper", PreserveDetails = "preserveDetails" } default BicubicAutomatic);
choice!(ColorPicker { Adobe = "adobe", System = "system" } default Adobe);
choice!(Theme { Pro = "pro", ProMedium = "proMedium", ProLightGray = "proLightGray", ProLight = "proLight", Studio = "studio", StudioLight = "studioLight", Classic = "classic", SolarizedDark = "solarizedDark", Adwaita = "adwaita", AdwaitaDark = "adwaitaDark", BreezeLight = "breezeLight", BreezeDark = "breezeDark" } default ProMedium);
choice!(Theme { Pro = "pro", ProMedium = "proMedium", ProLightGray = "proLightGray", ProLight = "proLight", Studio = "studio", StudioLight = "studioLight", Classic = "classic", SolarizedDark = "solarizedDark", Adwaita = "adwaita", AdwaitaDark = "adwaitaDark", BreezeLight = "breezeLight", BreezeDark = "breezeDark", CatppuccinLatte = "catppuccinLatte", CatppuccinFrappe = "catppuccinFrappe", CatppuccinMacchiato = "catppuccinMacchiato", CatppuccinMocha = "catppuccinMocha" } default ProMedium);
choice!(AppearanceMode { Auto = "auto", Dark = "dark", Light = "light" } default Dark);
choice!(DarkTheme { Pro = "pro", ProMedium = "proMedium", Studio = "studio", SolarizedDark = "solarizedDark", AdwaitaDark = "adwaitaDark", BreezeDark = "breezeDark" } default ProMedium);
choice!(LightTheme { StudioLight = "studioLight", ProLightGray = "proLightGray", ProLight = "proLight", Classic = "classic", Adwaita = "adwaita", BreezeLight = "breezeLight" } default StudioLight);
choice!(DarkTheme { Pro = "pro", ProMedium = "proMedium", Studio = "studio", SolarizedDark = "solarizedDark", AdwaitaDark = "adwaitaDark", BreezeDark = "breezeDark", CatppuccinFrappe = "catppuccinFrappe", CatppuccinMacchiato = "catppuccinMacchiato", CatppuccinMocha = "catppuccinMocha" } default ProMedium);
choice!(LightTheme { StudioLight = "studioLight", ProLightGray = "proLightGray", ProLight = "proLight", Classic = "classic", Adwaita = "adwaita", BreezeLight = "breezeLight", CatppuccinLatte = "catppuccinLatte" } default StudioLight);
choice!(CanvasColor { Default = "default", Black = "black", DarkGray = "darkGray", MediumGray = "mediumGray", LightGray = "lightGray", Custom = "custom" } default Default);
choice!(CanvasBorder { DropShadow = "dropShadow", Line = "line", None = "none" } default DropShadow);
choice!(UiScale { Auto = "auto", P75 = "75", P80 = "80", P85 = "85", P90 = "90", P95 = "95", P100 = "100", P125 = "125", P150 = "150", P175 = "175", P200 = "200", P250 = "250", P300 = "300" } default Auto);
@@ -1542,8 +1542,18 @@ impl Session {
&& let Some(theme) = interface.get("theme").and_then(Value::as_str).and_then(Theme::parse)
{
let (mode, slot) = match theme {
Theme::Pro | Theme::ProMedium | Theme::Studio | Theme::SolarizedDark | Theme::AdwaitaDark | Theme::BreezeDark => ("dark", "darkTheme"),
Theme::StudioLight | Theme::ProLightGray | Theme::ProLight | Theme::Classic | Theme::Adwaita | Theme::BreezeLight => ("light", "lightTheme"),
Theme::Pro
| Theme::ProMedium
| Theme::Studio
| Theme::SolarizedDark
| Theme::AdwaitaDark
| Theme::BreezeDark
| Theme::CatppuccinFrappe
| Theme::CatppuccinMacchiato
| Theme::CatppuccinMocha => ("dark", "darkTheme"),
Theme::StudioLight | Theme::ProLightGray | Theme::ProLight | Theme::Classic | Theme::Adwaita | Theme::BreezeLight | Theme::CatppuccinLatte => {
("light", "lightTheme")
}
};
interface.insert("appearanceMode".into(), json!(mode));
interface.insert(slot.into(), json!(theme.name()));
@@ -1666,6 +1676,22 @@ impl Session {
next.interface.light_theme = LightTheme::BreezeLight;
next.interface.appearance_mode = AppearanceMode::Light;
}
Theme::CatppuccinLatte => {
next.interface.light_theme = LightTheme::CatppuccinLatte;
next.interface.appearance_mode = AppearanceMode::Light;
}
Theme::CatppuccinFrappe => {
next.interface.dark_theme = DarkTheme::CatppuccinFrappe;
next.interface.appearance_mode = AppearanceMode::Dark;
}
Theme::CatppuccinMacchiato => {
next.interface.dark_theme = DarkTheme::CatppuccinMacchiato;
next.interface.appearance_mode = AppearanceMode::Dark;
}
Theme::CatppuccinMocha => {
next.interface.dark_theme = DarkTheme::CatppuccinMocha;
next.interface.appearance_mode = AppearanceMode::Dark;
}
}
}
self.prefs.edit(|p| *p = next);
+28
View File
@@ -0,0 +1,28 @@
Catppuccin
https://catppuccin.com/palette
https://github.com/catppuccin/catppuccin
The Catppuccin Latte, Frappé, Macchiato and Mocha themes' colour palettes in `theme_catppuccin.rs`
are the Catppuccin project's palettes, used under the MIT License below.
MIT License
Copyright (c) 2021 Catppuccin
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
-2
View File
@@ -2443,8 +2443,6 @@ fn start_screen(app: &mut PhotocraftApp, ui: &mut egui::Ui) {
home_recent(app, ui, &recent);
}
ui.add_space(26.0);
crate::links::discord_button(app, ui, 190.0);
ui.add_space(10.0);
crate::links::link_row(app, ui);
});
});
-2
View File
@@ -438,8 +438,6 @@ fn about_tab_body(app: &mut PhotocraftApp, ui: &mut egui::Ui, tab: &str) {
ui.label(crate::i18n::fmt(tl!("Version {version}"), &[("version", &photocraft_engine::build_info::long_version())]));
ui.add_space(12.0);
ui.vertical_centered(|ui| {
crate::links::discord_button(app, ui, 220.0);
ui.add_space(8.0);
crate::links::link_row(app, ui);
});
ui.add_space(10.0);
+9 -7
View File
@@ -16,7 +16,7 @@
# particular not the Czech localisation of Adobe Photoshop. Add entries the same way.
# Conventions: menus are nouns (Soubor, Úpravy, Obraz ...), commands are infinitives (Otevřít…,
# Uložit jako…), sentence case as in the English source. Product and technology names
# (PhotoCraft, ArtCraft, OpenType, CMYK, Lab ...) stay in Latin letters; the trailing "…" of
# (PhotoCraft, OpenType, CMYK, Lab ...) stay in Latin letters; the trailing "…" of
# dialog commands is kept.
# Guide layout dialog
@@ -729,6 +729,14 @@
Classic Theme Klasický motiv
Solarized dark Solarized tmavý
Solarized Dark Theme Tmavý motiv Solarized
Catppuccin Latte Theme Motiv Catppuccin Latte
Catppuccin latte Catppuccin Latte
Catppuccin Frappé Theme Motiv Catppuccin Frappé
Catppuccin frappe Catppuccin Frappé
Catppuccin Macchiato Theme Motiv Catppuccin Macchiato
Catppuccin macchiato Catppuccin Macchiato
Catppuccin Mocha Theme Motiv Catppuccin Mocha
Catppuccin mocha Catppuccin Mocha
Breeze dark Breeze tmavý
Breeze Dark Theme Tmavý motiv Breeze
Breeze light Breeze světlý
@@ -765,8 +773,6 @@
About PhotoCraft O aplikaci PhotoCraft
PhotoCraft Website Web PhotoCraft
PhotoCraft on GitHub PhotoCraft na GitHubu
ArtCraft Website Web ArtCraft
Join the ArtCraft Discord… Připojit se k Discordu ArtCraft…
Report an Issue… Nahlásit problém…
WIA Support… Podpora WIA…
Apply Použít
@@ -1047,7 +1053,6 @@
Diffusion Difuze
Discard the embedded profile (don't color manage) Zahodit vložený profil (bez správy barev)
Discontiguous Nesouvislé
Discord Discord
Dismiss Zavřít
Display P3 Display P3
Display Text Zobrazený text
@@ -1179,7 +1184,6 @@
Invert All Invertovat vše
Invert has no settings. Invertovat nemá žádná nastavení.
Italic Kurzíva
Join us on Discord Přidejte se k nám na Discordu
Justify all Do bloku vše
Justify last centered Do bloku, poslední řádek na střed
Justify last left Do bloku, poslední řádek vlevo
@@ -1588,7 +1592,6 @@
Apple Watch 45mm Apple Watch 45 mm
Aqua Akvamarínové
Art & Illustration Umění a ilustrace
ArtCraft ArtCraft
Background Eraser Tool Nástroj guma pozadí
Bevel & Emboss Úkos a reliéf
Blend Mode Režim prolnutí
@@ -3636,7 +3639,6 @@ navigator Zoom Zvětšení
on zapnuto
off vypnuto
This adjustment ({key}) is kept as imported and can't be edited yet. Tato úprava ({key}) se uchovává v importované podobě a zatím ji nelze měnit.
Join the ArtCraft Discord ({url}) Přidejte se na Discord ArtCraft ({url})
{index} of {total} {index} z {total}
@plural {n} step|{n} steps {n} krok|{n} kroky|{n} kroků
{shortcut} assigned. Zkratka {shortcut} přiřazena.
Can't render this file because it contains an unexpected character in line 6 and column 47.
+9 -6
View File
@@ -12,7 +12,7 @@
# Clean-room: every entry was written from the plain meaning of the English label using ordinary
# German image-editing vocabulary (Ebene, Maske, Auswahl, Weichzeichnen ...). No proprietary
# localisation resource, string table or product UI was consulted or copied; add entries the same
# way. Product and technology names (PhotoCraft, ArtCraft, OpenType, CMYK, Lab ...) stay in Latin
# way. Product and technology names (PhotoCraft, OpenType, CMYK, Lab ...) stay in Latin
# letters; the trailing "…" of dialog commands is kept. Plural rule: one|other (n != 1 -> other).
# Guide layout dialog
@@ -715,6 +715,14 @@
Classic Theme Klassisches Design
Solarized dark Solarized dunkel
Solarized Dark Theme Solarized-Design (Dunkel)
Catppuccin Latte Theme Catppuccin-Design Latte
Catppuccin latte Catppuccin Latte
Catppuccin Frappé Theme Catppuccin-Design Frappé
Catppuccin frappe Catppuccin Frappé
Catppuccin Macchiato Theme Catppuccin-Design Macchiato
Catppuccin macchiato Catppuccin Macchiato
Catppuccin Mocha Theme Catppuccin-Design Mocha
Catppuccin mocha Catppuccin Mocha
Breeze dark Breeze dunkel
Breeze Dark Theme Breeze-Design (Dunkel)
Breeze light Breeze hell
@@ -751,8 +759,6 @@
About PhotoCraft Über PhotoCraft
PhotoCraft Website PhotoCraft-Website
PhotoCraft on GitHub PhotoCraft auf GitHub
ArtCraft Website ArtCraft-Website
Join the ArtCraft Discord… ArtCraft-Discord beitreten…
Report an Issue… Problem melden…
WIA Support… WIA-Unterstützung…
Apply Anwenden
@@ -1027,7 +1033,6 @@
Diffusion Diffusion
Discard the embedded profile (don't color manage) Eingebettetes Profil verwerfen (keine Farbverwaltung)
Discontiguous Nicht benachbart
Discord Discord
Dismiss Ausblenden
Display P3 Display P3
Display Text Text anzeigen
@@ -1159,7 +1164,6 @@
Invert All Alle invertieren
Invert has no settings. Invertieren hat keine Einstellungen.
Italic Kursiv
Join us on Discord Tritt unserem Discord bei
Justify all Alles im Blocksatz
Justify last centered Letzte Zeile zentriert
Justify last left Letzte Zeile links
@@ -1564,7 +1568,6 @@
Apple Watch 45mm Apple Watch 45 mm
Aqua Aqua
Art & Illustration Kunst & Illustration
ArtCraft ArtCraft
Background Eraser Tool Hintergrund-Radiergummi-Werkzeug
Bevel & Emboss Abgeflachte Kante & Relief
Blend Mode Fusionsmodus
Can't render this file because it contains an unexpected character in line 6 and column 47.
+8 -6
View File
@@ -1211,7 +1211,6 @@
Custom Pixel Aspect Ratio Προσαρμοσμένη αναλογία εικονοστοιχείων
32-bit Preview Options Επιλογές προεπισκόπησης 32 bit
New Guide Νέος οδηγός
Join the ArtCraft Discord Συμμετοχή στο Discord του ArtCraft
Report an Issue Αναφορά προβλήματος
Load Files into Stack Φόρτωση αρχείων σε στοίβα
Statistics Στατιστικά
@@ -2017,7 +2016,6 @@
Arc Τόξο
Arch Καμάρα
Art & Illustration Τέχνη και εικονογράφηση
ArtCraft Website Ιστότοπος ArtCraft
Artboard Background Color Χρώμα φόντου πίνακα σχεδίασης
Artboard Guides Οδηγοί πίνακα σχεδίασης
Artboard from Group Πίνακας σχεδίασης από ομάδα
@@ -2117,6 +2115,14 @@
Classic Theme Κλασικό θέμα
Solarized dark Solarized σκούρο
Solarized Dark Theme Σκούρο θέμα Solarized
Catppuccin Latte Theme Θέμα Catppuccin Latte
Catppuccin latte Catppuccin Latte
Catppuccin Frappé Theme Θέμα Catppuccin Frappé
Catppuccin frappe Catppuccin Frappé
Catppuccin Macchiato Theme Θέμα Catppuccin Macchiato
Catppuccin macchiato Catppuccin Macchiato
Catppuccin Mocha Theme Θέμα Catppuccin Mocha
Catppuccin mocha Catppuccin Mocha
Breeze dark Breeze σκούρο
Breeze Dark Theme Σκούρο θέμα Breeze
Breeze light Breeze φωτεινό
@@ -2513,8 +2519,6 @@
Iris Blur… Θόλωση ίριδας…
Italic Πλάγια
Jag Οδοντωτό
Join the ArtCraft Discord… Συμμετοχή στο Discord του ArtCraft…
Join us on Discord Ελάτε στην κοινότητά μας στο Discord
Jpeg quality Ποιότητα JPEG
Justification Πλήρης στοίχιση
Justify Πλήρης στοίχιση
@@ -3354,7 +3358,6 @@ cameraRaw Yellow Κίτρινο
Add to Swatches Προσθήκη στα δείγματα χρωμάτων
Alt Alt
Anamorphic 2:1 (2) Αναμορφικό 2:1 (2)
ArtCraft ArtCraft
Blend If: Ανάμειξη υπό όρους:
Channels: Κανάλια:
Click a red pupil to neutralize it Κάντε κλικ σε μια κόκκινη κόρη για να την εξουδετερώσετε
@@ -3369,7 +3372,6 @@ cameraRaw Yellow Κίτρινο
D1/DV PAL Widescreen (1.46) D1/DV PAL ευρεία οθόνη (1.46)
DVCPRO HD 1080/HDV 1080 (1.5) DVCPRO HD 1080/HDV 1080 (1.5)
Darken Amount Ποσότητα σκουρέματος
Discord Discord
Display P3 Display P3
Edit › Paste Επεξεργασία › Επικόλληση
Edits that change the whole document, such as a layer's blend mode, opacity or visibility, redraw all of it. Οι αλλαγές που επηρεάζουν όλο το έγγραφο, όπως η λειτουργία ανάμειξης, η αδιαφάνεια ή η ορατότητα ενός επιπέδου, το επανασχεδιάζουν ολόκληρο.
Can't render this file because it contains an unexpected character in line 1000 and column 18.
+9 -6
View File
@@ -9,7 +9,7 @@
# Clean-room: every entry was written from the plain meaning of the English label using ordinary
# Spanish computing vocabulary (capa, pincel, selección, lienzo ...). No proprietary localisation
# resource, string table or product UI was consulted or copied; add entries the same way.
# Product and technology names (PhotoCraft, ArtCraft, OpenType, CMYK, Lab ...) stay in Latin
# Product and technology names (PhotoCraft, OpenType, CMYK, Lab ...) stay in Latin
# letters; the trailing "…" of dialog commands is kept.
# Guide layout dialog
@@ -722,6 +722,14 @@
Classic Theme Tema Clásico
Solarized dark Solarized oscuro
Solarized Dark Theme Tema Solarized oscuro
Catppuccin Latte Theme Tema Catppuccin Latte
Catppuccin latte Catppuccin Latte
Catppuccin Frappé Theme Tema Catppuccin Frappé
Catppuccin frappe Catppuccin Frappé
Catppuccin Macchiato Theme Tema Catppuccin Macchiato
Catppuccin macchiato Catppuccin Macchiato
Catppuccin Mocha Theme Tema Catppuccin Mocha
Catppuccin mocha Catppuccin Mocha
Breeze dark Breeze oscuro
Breeze Dark Theme Tema Breeze oscuro
Breeze light Breeze claro
@@ -758,8 +766,6 @@
About PhotoCraft Acerca de PhotoCraft
PhotoCraft Website Sitio web de PhotoCraft
PhotoCraft on GitHub PhotoCraft en GitHub
ArtCraft Website Sitio web de ArtCraft
Join the ArtCraft Discord… Únase al Discord de ArtCraft…
Report an Issue… Informar de un problema…
WIA Support… Compatibilidad con WIA…
Apply Aplicar
@@ -1033,7 +1039,6 @@
Diffusion Difusión
Discard the embedded profile (don't color manage) Descartar el perfil incrustado (no gestionar el color)
Discontiguous No contiguo
Discord Discord
Dismiss Descartar
Display P3 Display P3
Display Text Texto de visualización
@@ -1165,7 +1170,6 @@
Invert All Invertir todo
Invert has no settings. Invertir no tiene ajustes.
Italic Cursiva
Join us on Discord Únase a nuestro Discord
Justify all Justificar todo
Justify last centered Justificar última centrada
Justify last left Justificar última a la izquierda
@@ -1572,7 +1576,6 @@
Apple Watch 45mm Apple Watch 45mm
Aqua Aqua
Art & Illustration Arte e ilustración
ArtCraft ArtCraft
Background Eraser Tool Herramienta Borrador de fondos
Bevel & Emboss Bisel y relieve
Blend Mode Modo de fusión
Can't render this file because it contains an unexpected character in line 4 and column 47.
+9 -6
View File
@@ -16,7 +16,7 @@
# Conventions: menus are nouns (Fichier, Édition, Image ...), commands are infinitives (Ouvrir…,
# Enregistrer sous…), sentence case. French typography: a no-break space (U+00A0) before
# « : ; ? ! » and "%", and inside guillemets « … ». Product and technology names (PhotoCraft,
# ArtCraft, OpenType, Lab ...) stay as they are; RGB/CMYK read RVB/CMJN; the trailing "…" of
# OpenType, Lab ...) stay as they are; RGB/CMYK read RVB/CMJN; the trailing "…" of
# dialog commands is kept.
# Guide layout dialog
@@ -712,6 +712,14 @@
Classic Theme Thème Classique
Solarized dark Solarized sombre
Solarized Dark Theme Thème Solarized sombre
Catppuccin Latte Theme Thème Catppuccin Latte
Catppuccin latte Catppuccin Latte
Catppuccin Frappé Theme Thème Catppuccin Frappé
Catppuccin frappe Catppuccin Frappé
Catppuccin Macchiato Theme Thème Catppuccin Macchiato
Catppuccin macchiato Catppuccin Macchiato
Catppuccin Mocha Theme Thème Catppuccin Mocha
Catppuccin mocha Catppuccin Mocha
Breeze dark Breeze sombre
Breeze Dark Theme Thème Breeze sombre
Breeze light Breeze clair
@@ -748,8 +756,6 @@
About PhotoCraft À propos de PhotoCraft
PhotoCraft Website Site web de PhotoCraft
PhotoCraft on GitHub PhotoCraft sur GitHub
ArtCraft Website Site web d'ArtCraft
Join the ArtCraft Discord… Rejoindre le Discord d'ArtCraft…
Report an Issue… Signaler un problème…
WIA Support… Prise en charge de WIA…
Apply Appliquer
@@ -1021,7 +1027,6 @@
Diffusion Diffusion
Discard the embedded profile (don't color manage) Ignorer le profil incorporé (sans gestion des couleurs)
Discontiguous Non contigu
Discord Discord
Dismiss Fermer
Display P3 Display P3
Display Text Texte affiché
@@ -1147,7 +1152,6 @@
Invert All Tout inverser
Invert has no settings. Inverser n'a aucun réglage.
Italic Italique
Join us on Discord Rejoignez-nous sur Discord
Justify all Justifier tout
Justify last centered Justifier, dernière ligne centrée
Justify last left Justifier, dernière ligne à gauche
@@ -1550,7 +1554,6 @@
Apple Watch 45mm Apple Watch 45 mm
Aqua Aqua
Art & Illustration Art et illustration
ArtCraft ArtCraft
Background Eraser Tool Outil Gomme d'arrière-plan
Bevel & Emboss Biseau et relief
Blend Mode Mode de fusion
Can't render this file because it contains an unexpected character in line 6 and column 47.
+1 -8
View File
@@ -12,7 +12,7 @@
# Clean-room: every entry was written from the plain meaning of the English label using ordinary
# Hungarian image-editing vocabulary (réteg, maszk, kijelölés ...). No proprietary localisation
# resource, string table or product UI was consulted or copied; add entries the same way.
# Product and technology names (PhotoCraft, ArtCraft, OpenType, CMYK, Lab ...) stay in Latin
# Product and technology names (PhotoCraft, OpenType, CMYK, Lab ...) stay in Latin
# letters; the trailing "…" of dialog commands is kept. Plural rule: a count is followed by the
# singular noun in Hungarian, so every @plural entry has a single form.
@@ -431,7 +431,6 @@
Artboard Guides Rajztábla-segédvonalak
Artboards to Files Rajztáblák fájlokba
Artboards to PDF Rajztáblák PDF-be
ArtCraft Website ArtCraft-weboldal
Average Átlag
Background From Layer Háttér a rétegből
Bitmap… Bittérkép…
@@ -585,8 +584,6 @@
Internet Standard RGB Internetes szabványos RGB
Inverse Megfordítás
Iris Blur… Íriszelmosás…
Join the ArtCraft Discord Csatlakozás az ArtCraft Discordhoz
Join the ArtCraft Discord… Csatlakozás az ArtCraft Discordhoz…
Language Nyelv
Language Options Nyelvi beállítások
Large Nagy
@@ -1732,7 +1729,6 @@ layerLabel Magenta Bíbor
Delete Tool Preset Eszköz-előbeállítás törlése
Delete tool preset Eszköz-előbeállítás törlése
Delete Workspace Munkaterület törlése
Discord Discord
Doc: {w} × {h} px Dok.: {w} × {h} px
Drag a box or click four corners · drag the corners onto the edges of a skewed shape · {commit} commits · Esc cancels Húzz egy keretet, vagy kattints a négy sarokra · húzd a sarkokat a ferde alakzat éleire · {commit}: véglegesítés · Esc: megszakítás
Drag a crop box · drag inside to move · edges resize ({ratio} ratio, {centre} centre) · Space moves while drawing · arrows nudge · X swaps orientation · {commit} commits · Esc cancels Húzz egy körbevágási keretet · belül húzva mozgatod · az élekkel átméretezed ({ratio}: arány, {centre}: középről) · Space: mozgatás rajzolás közben · nyilak: léptetés · X: tájolás cseréje · {commit}: véglegesítés · Esc: megszakítás
@@ -1787,7 +1783,6 @@ layerLabel Magenta Bíbor
Intersect with Metszet ezzel
Intersect with selection ({key}) Metszet a kijelöléssel ({key})
Invalid panel layout; restored the default dock Érvénytelen panelelrendezés; az alapértelmezett dokkolás visszaállítva
Join the ArtCraft Discord ({url}) Csatlakozz az ArtCraft Discord-szerveréhez ({url})
Keyboard Shortcuts Billentyűparancsok
Kind Fajta
Lasso Lasszó
@@ -3013,7 +3008,6 @@ cameraRaw Yellow Sárga
Arch Boltív
Area Terület
Artboard Tool Rajztábla
ArtCraft ArtCraft
Ask Rákérdezés
Aspect Ratio Oldalarány
Assign Profile Profil hozzárendelése
@@ -3269,7 +3263,6 @@ cameraRaw Yellow Sárga
Interval Intervallum
Invalid {mode} profile Érvénytelen profil ({mode})
Its layers don't fit the GPU memory budget. Raising Memory usage in Preferences › Performance raises the budget, up to a quarter of this computer's memory. A dokumentum rétegei nem férnek el a GPU memóriakeretében. Ha a Beállítások › Teljesítmény alatt növeled a memóriahasználatot, a keret is nő, legfeljebb a számítógép memóriájának negyedéig.
Join us on Discord Csatlakozz hozzánk a Discordon
Keep Using CPU Marad a CPU
Kernel Szűrőmag
Keyboard Billentyűzet
Can't render this file because it contains an unexpected character in line 6 and column 47.
+9 -6
View File
@@ -9,7 +9,7 @@
# Clean-room: every entry was written from the plain meaning of the English label using ordinary
# Indonesian computing vocabulary (layer, kuas, seleksi, kanvas ...). No proprietary localisation
# resource, string table or product UI was consulted or copied; add entries the same way.
# Product and technology names (PhotoCraft, ArtCraft, OpenType, CMYK, Lab ...) stay in Latin
# Product and technology names (PhotoCraft, OpenType, CMYK, Lab ...) stay in Latin
# letters; the trailing "…" of dialog commands is kept.
# Guide layout dialog
@@ -705,6 +705,14 @@
Classic Theme Tema Klasik
Solarized dark Solarized gelap
Solarized Dark Theme Tema Solarized Gelap
Catppuccin Latte Theme Tema Catppuccin Latte
Catppuccin latte Catppuccin Latte
Catppuccin Frappé Theme Tema Catppuccin Frappé
Catppuccin frappe Catppuccin Frappé
Catppuccin Macchiato Theme Tema Catppuccin Macchiato
Catppuccin macchiato Catppuccin Macchiato
Catppuccin Mocha Theme Tema Catppuccin Mocha
Catppuccin mocha Catppuccin Mocha
Breeze dark Breeze gelap
Breeze Dark Theme Tema Breeze Gelap
Breeze light Breeze terang
@@ -741,8 +749,6 @@
About PhotoCraft Tentang PhotoCraft
PhotoCraft Website Situs Web PhotoCraft
PhotoCraft on GitHub PhotoCraft di GitHub
ArtCraft Website Situs Web ArtCraft
Join the ArtCraft Discord… Gabung ke Discord ArtCraft…
Report an Issue… Laporkan Masalah…
WIA Support… Dukungan WIA…
Apply Terapkan
@@ -1015,7 +1021,6 @@
Diffusion Difusi
Discard the embedded profile (don't color manage) Buang profil tertanam (tanpa manajemen warna)
Discontiguous Tidak Berdekatan
Discord Discord
Dismiss Tutup
Display P3 Display P3
Display Text Teks Tampilan
@@ -1141,7 +1146,6 @@
Invert All Balikkan Semua
Invert has no settings. Invert tidak punya pengaturan.
Italic Miring
Join us on Discord Gabung bareng kami di Discord
Justify all Rata penuh semua
Justify last centered Rata penuh, baris terakhir di tengah
Justify last left Rata penuh, baris terakhir di kiri
@@ -1544,7 +1548,6 @@
Apple Watch 45mm Apple Watch 45mm
Aqua Aqua
Art & Illustration Seni & Ilustrasi
ArtCraft ArtCraft
Background Eraser Tool Alat Background Eraser
Bevel & Emboss Bevel & Emboss
Blend Mode Mode Blend
Can't render this file because it contains an unexpected character in line 4 and column 47.
+9 -8
View File
@@ -9,7 +9,7 @@
# Clean-room: every entry was written from the plain meaning of the English label using ordinary
# Italian computing vocabulary (livello, pennello, selezione, quadro ...). No proprietary localisation
# resource, string table or product UI was consulted or copied; add entries the same way.
# Product and technology names (PhotoCraft, ArtCraft, OpenType, CMYK, Lab ...) stay in Latin
# Product and technology names (PhotoCraft, OpenType, CMYK, Lab ...) stay in Latin
# letters; the trailing … of dialog commands is kept.
# Guide layout dialog
@@ -720,6 +720,14 @@
Classic Theme Tema classico
Solarized dark Solarized scuro
Solarized Dark Theme Tema Solarized scuro
Catppuccin Latte Theme Tema Catppuccin Latte
Catppuccin latte Catppuccin Latte
Catppuccin Frappé Theme Tema Catppuccin Frappé
Catppuccin frappe Catppuccin Frappé
Catppuccin Macchiato Theme Tema Catppuccin Macchiato
Catppuccin macchiato Catppuccin Macchiato
Catppuccin Mocha Theme Tema Catppuccin Mocha
Catppuccin mocha Catppuccin Mocha
Breeze dark Breeze scuro
Breeze Dark Theme Tema Breeze scuro
Breeze light Breeze chiaro
@@ -756,8 +764,6 @@
About PhotoCraft Informazioni su PhotoCraft
PhotoCraft Website Sito web PhotoCraft
PhotoCraft on GitHub PhotoCraft su GitHub
ArtCraft Website Sito web ArtCraft
Join the ArtCraft Discord… Unisciti al Discord di ArtCraft…
Report an Issue… Segnala un problema…
WIA Support… Supporto WIA…
Apply Applica
@@ -1034,7 +1040,6 @@
Diffusion Diffusione
Discard the embedded profile (don't color manage) Scarta profilo incorporato (non gestire colore)
Discontiguous Non contiguo
Discord Discord
Dismiss Chiudi
Display P3 Display P3
Display Text Mostra testo
@@ -1164,7 +1169,6 @@
Invert All Inverti tutto
Invert has no settings. Inverti non ha impostazioni.
Italic Corsivo
Join us on Discord Unisciti al nostro Discord
Justify all Giustifica tutto
Justify last centered Giustifica ultimo centrato
Justify last left Giustifica ultimo a sinistra
@@ -1571,7 +1575,6 @@
Apple Watch 45mm Apple Watch 45mm
Aqua Acqua
Art & Illustration Arte e illustrazione
ArtCraft ArtCraft
Background Eraser Tool Strumento Gomma per sfondo
Bevel & Emboss Smusso e rilievo
Blend Mode Metodo di fusione
@@ -3455,7 +3458,6 @@ layerLabel No Color Nessun colore
Custom Pixel Aspect Ratio Proporzioni pixel personalizzate
32-bit Preview Options Opzioni anteprima 32 bit
New Guide Nuova guida
Join the ArtCraft Discord Unisciti al Discord di ArtCraft
Report an Issue Segnala un problema
Load Files into Stack Carica file in pila
Statistics Statistiche
@@ -4009,7 +4011,6 @@ navigator Zoom Zoom
on attivo
off disattivo
This adjustment ({key}) is kept as imported and can't be edited yet. Questa regolazione ({key}) resta come è stata importata e non si può ancora modificare.
Join the ArtCraft Discord ({url}) Unisciti al Discord di ArtCraft ({url})
{index} of {total} {index} di {total}
{shortcut} assigned. {shortcut} assegnata.
{shortcut} is already in use by {commands} and will be removed from it when you click OK. {shortcut} è già usata da {commands} e verrà rimossa quando fai clic su OK.
Can't render this file because it contains an unexpected character in line 2595 and column 53.
+9 -7
View File
@@ -12,7 +12,7 @@
# Clean-room: every entry was written from the plain meaning of the English label using ordinary
# Japanese computing vocabulary (レイヤー, ぼかし, 選択範囲 ...). No proprietary localisation
# resource, string table or product UI was consulted or copied; add entries the same way.
# Product and technology names (PhotoCraft, ArtCraft, OpenType, CMYK, Lab ...) stay in Latin
# Product and technology names (PhotoCraft, OpenType, CMYK, Lab ...) stay in Latin
# letters; the trailing "…" of dialog commands is kept.
# Guide layout dialog
@@ -722,6 +722,14 @@
Classic Theme クラシックテーマ
Solarized dark Solarized ダーク
Solarized Dark Theme Solarized ダークテーマ
Catppuccin Latte Theme Catppuccin Latte テーマ
Catppuccin latte Catppuccin Latte
Catppuccin Frappé Theme Catppuccin Frappé テーマ
Catppuccin frappe Catppuccin Frappé
Catppuccin Macchiato Theme Catppuccin Macchiato テーマ
Catppuccin macchiato Catppuccin Macchiato
Catppuccin Mocha Theme Catppuccin Mocha テーマ
Catppuccin mocha Catppuccin Mocha
Breeze dark Breeze ダーク
Breeze Dark Theme Breeze ダークテーマ
Breeze light Breeze ライト
@@ -758,8 +766,6 @@
About PhotoCraft PhotoCraft について
PhotoCraft Website PhotoCraft の Web サイト
PhotoCraft on GitHub GitHub 上の PhotoCraft
ArtCraft Website ArtCraft の Web サイト
Join the ArtCraft Discord… ArtCraft の Discord に参加…
Report an Issue… 問題を報告…
WIA Support… WIA サポート…
Apply 適用
@@ -1034,7 +1040,6 @@
Diffusion 拡散
Discard the embedded profile (don't color manage) 埋め込みプロファイルを破棄 (カラーマネジメントしない)
Discontiguous 不連続
Discord Discord
Dismiss 閉じる
Display P3 Display P3
Display Text 表示テキスト
@@ -1166,7 +1171,6 @@
Invert All すべて反転
Invert has no settings. 階調の反転には設定がありません。
Italic イタリック
Join us on Discord Discord に参加
Justify all 均等配置 (最終行も)
Justify last centered 最終行中央揃えの両端揃え
Justify last left 最終行左揃えの両端揃え
@@ -1571,7 +1575,6 @@
Apple Watch 45mm Apple Watch 45mm
Aqua アクア
Art & Illustration アート・イラスト
ArtCraft ArtCraft
Background Eraser Tool 背景消しゴムツール
Bevel & Emboss ベベルとエンボス
Blend Mode 描画モード
@@ -3293,7 +3296,6 @@ fontWeight Italic 斜体
Install Plug-in プラグインをインストール
Intersect with 共通部分
Intersect with selection (⇧⌥) 選択範囲との共通部分 (⇧⌥)
Join the ArtCraft Discord ArtCraft の Discord に参加
Keep proportions 縦横比を固定
Keep view in sync ビューを同期
Keeps the current texture when switching presets. プリセットを切り替えても現在のテクスチャを維持します。
Can't render this file because it contains an unexpected character in line 6 and column 47.
+8 -6
View File
@@ -696,6 +696,14 @@
Classic Theme 클래식 테마
Solarized dark Solarized 어두움
Solarized Dark Theme Solarized 어두운 테마
Catppuccin Latte Theme Catppuccin Latte 테마
Catppuccin latte Catppuccin Latte
Catppuccin Frappé Theme Catppuccin Frappé 테마
Catppuccin frappe Catppuccin Frappé
Catppuccin Macchiato Theme Catppuccin Macchiato 테마
Catppuccin macchiato Catppuccin Macchiato
Catppuccin Mocha Theme Catppuccin Mocha 테마
Catppuccin mocha Catppuccin Mocha
Breeze dark Breeze 어두움
Breeze Dark Theme Breeze 어두운 테마
Breeze light Breeze 밝게
@@ -732,8 +740,6 @@
About PhotoCraft PhotoCraft 정보
PhotoCraft Website PhotoCraft 웹사이트
PhotoCraft on GitHub GitHub의 PhotoCraft
ArtCraft Website ArtCraft 웹사이트
Join the ArtCraft Discord… ArtCraft Discord 참여…
Report an Issue… 문제 신고…
WIA Support… WIA 지원…
Apply 적용
@@ -1009,7 +1015,6 @@
Diffusion 확산
Discard the embedded profile (don't color manage) 포함된 프로파일 버리기(색상 관리 안 함)
Discontiguous 비인접
Discord Discord
Dismiss 닫기
Display P3 Display P3
Display Text 표시 텍스트
@@ -1135,7 +1140,6 @@
Invert All 모두 반전
Invert has no settings. 반전에는 설정이 없습니다.
Italic 기울임꼴
Join us on Discord Discord 참여
Justify all 모든 줄 양쪽 정렬
Justify last centered 마지막 줄 가운데 정렬
Justify last left 마지막 줄 왼쪽 정렬
@@ -1540,7 +1544,6 @@
Apple Watch 45mm Apple Watch 45mm
Aqua 청록
Art & Illustration 아트 및 일러스트레이션
ArtCraft ArtCraft
Background Eraser Tool 배경 지우개 도구
Bevel & Emboss 경사와 엠보스
Blend Mode 혼합 모드
@@ -2617,7 +2620,6 @@ cameraRaw Color 색상
Custom Pixel Aspect Ratio 사용자 정의 픽셀 종횡비
32-bit Preview Options 32비트 미리 보기 옵션
New Guide 새 안내선
Join the ArtCraft Discord ArtCraft Discord 참여
Report an Issue 문제 신고
WIA Support WIA 지원
Load Files into Stack 파일을 스택으로 불러오기
1 # Korean (ko) catalog. UTF-8: context<TAB>English source<TAB>translation.
696
697
698
699
700
701
702
703
704
705
706
707
708
709
740
741
742
743
744
745
1015
1016
1017
1018
1019
1020
1140
1141
1142
1143
1144
1145
1544
1545
1546
1547
1548
1549
2620
2621
2622
2623
2624
2625
+9 -7
View File
@@ -4,7 +4,7 @@
# Clean-room: every entry was written from the plain meaning of the English label using ordinary
# Dutch computing vocabulary (laag, selectie, masker, aanpassingslaag, penseel, verloop ...). No
# proprietary localisation resource, string table or product UI was consulted or copied; add
# entries the same way. Product and technology names (PhotoCraft, ArtCraft, OpenType, CMYK, Lab ...)
# entries the same way. Product and technology names (PhotoCraft, OpenType, CMYK, Lab ...)
# stay as they are; the trailing "…" of dialog commands is kept. UI text addresses the user
# informally ("je") and uses sentence case.
@@ -701,6 +701,14 @@
Classic Theme Klassiek thema
Solarized dark Solarized donker
Solarized Dark Theme Solarized-thema donker
Catppuccin Latte Theme Catppuccin-thema Latte
Catppuccin latte Catppuccin Latte
Catppuccin Frappé Theme Catppuccin-thema Frappé
Catppuccin frappe Catppuccin Frappé
Catppuccin Macchiato Theme Catppuccin-thema Macchiato
Catppuccin macchiato Catppuccin Macchiato
Catppuccin Mocha Theme Catppuccin-thema Mocha
Catppuccin mocha Catppuccin Mocha
Breeze dark Breeze donker
Breeze Dark Theme Breeze-thema donker
Breeze light Breeze licht
@@ -741,8 +749,6 @@
About PhotoCraft Over PhotoCraft
PhotoCraft Website Website van PhotoCraft
PhotoCraft on GitHub PhotoCraft op GitHub
ArtCraft Website Website van ArtCraft
Join the ArtCraft Discord… Deelnemen aan de ArtCraft-Discord…
Report an Issue… Probleem melden…
WIA Support… WIA-ondersteuning…
Apply Toepassen
@@ -1016,7 +1022,6 @@
Diffusion Diffusie
Discard the embedded profile (don't color manage) Het ingesloten profiel negeren (geen kleurbeheer)
Discontiguous Niet-aaneengesloten
Discord Discord
Dismiss Sluiten
Display P3 Display P3
Display Text Tekst tonen
@@ -1148,7 +1153,6 @@
Invert All Alles omkeren
Invert has no settings. Omkeren heeft geen instellingen.
Italic Cursief
Join us on Discord Doe mee op Discord
Justify all Alles uitvullen
Justify last centered Uitvullen, laatste regel gecentreerd
Justify last left Uitvullen, laatste regel links
@@ -1549,7 +1553,6 @@
Apple Watch 45mm Apple Watch 45 mm
Aqua Aqua
Art & Illustration Kunst en illustratie
ArtCraft ArtCraft
Background Eraser Tool Achtergrondgumgereedschap
Bevel & Emboss Schuine kant en reliëf
Blend Mode Overvloeimodus
@@ -2981,7 +2984,6 @@ cameraRaw Color Kleur
Custom Pixel Aspect Ratio Aangepaste pixelverhouding
32-bit Preview Options Voorvertoningsopties 32-bit
New Guide Nieuwe hulplijn
Join the ArtCraft Discord Deelnemen aan de ArtCraft-Discord
Report an Issue Probleem melden
Load Files into Stack Bestanden in stapel laden
Statistics Statistieken
Can't render this file because it contains an unexpected character in line 8 and column 34.
+9 -7
View File
@@ -13,7 +13,7 @@
# Clean-room: every entry was written from the plain meaning of the English label using ordinary
# Polish image-editing vocabulary (warstwa, maska, zaznaczenie, pędzel, rozmycie, krycie ...). No
# proprietary localisation resource, string table or product UI was consulted or copied; add
# entries the same way. Product and technology names (PhotoCraft, ArtCraft, OpenType, CMYK, Lab ...)
# entries the same way. Product and technology names (PhotoCraft, OpenType, CMYK, Lab ...)
# stay in Latin letters; the trailing "…" of dialog commands is kept.
# Conventions: menus are nouns (Plik, Edycja, Obraz ...), commands are infinitives (Otwórz…,
# Zapisz jako…), sentence case as in the English source. Quotes: „…”.
@@ -721,6 +721,14 @@
Classic Theme Motyw klasyczny
Solarized dark Solarized ciemny
Solarized Dark Theme Ciemny motyw Solarized
Catppuccin Latte Theme Motyw Catppuccin Latte
Catppuccin latte Catppuccin Latte
Catppuccin Frappé Theme Motyw Catppuccin Frappé
Catppuccin frappe Catppuccin Frappé
Catppuccin Macchiato Theme Motyw Catppuccin Macchiato
Catppuccin macchiato Catppuccin Macchiato
Catppuccin Mocha Theme Motyw Catppuccin Mocha
Catppuccin mocha Catppuccin Mocha
Breeze dark Breeze ciemny
Breeze Dark Theme Ciemny motyw Breeze
Breeze light Breeze jasny
@@ -757,8 +765,6 @@
About PhotoCraft O programie PhotoCraft
PhotoCraft Website Strona internetowa PhotoCraft
PhotoCraft on GitHub PhotoCraft na GitHubie
ArtCraft Website Strona internetowa ArtCraft
Join the ArtCraft Discord… Dołącz do Discorda ArtCraft…
Report an Issue… Zgłoś problem…
WIA Support… Obsługa WIA…
Apply Zastosuj
@@ -1034,7 +1040,6 @@
Diffusion Dyfuzja
Discard the embedded profile (don't color manage) Odrzuć osadzony profil (bez zarządzania kolorami)
Discontiguous Niesąsiadujące
Discord Discord
Dismiss Zamknij
Display P3 Display P3
Display Text Tekst wyświetlany
@@ -1162,7 +1167,6 @@
Invert All Odwróć wszystko
Invert has no settings. Odwracanie nie ma ustawień.
Italic Kursywa
Join us on Discord Dołącz do nas na Discordzie
Justify all Wyjustuj wszystko
Justify last centered Wyjustuj, ostatni wiersz wyśrodkowany
Justify last left Wyjustuj, ostatni wiersz do lewej
@@ -1565,7 +1569,6 @@
Apple Watch 45mm Apple Watch 45 mm
Aqua Błękit morski
Art & Illustration Sztuka i ilustracja
ArtCraft ArtCraft
Background Eraser Tool Narzędzie Gumka tła
Bevel & Emboss Ukos i płaskorzeźba
Blend Mode Tryb mieszania
@@ -3097,7 +3100,6 @@ cameraRaw Roughness Chropowatość
Custom Pixel Aspect Ratio Niestandardowe proporcje pikseli
32-bit Preview Options Opcje podglądu 32-bitowego
New Guide Nowa prowadnica
Join the ArtCraft Discord Dołącz do Discorda ArtCraft
Report an Issue Zgłoś problem
WIA Support Obsługa WIA
Load Files into Stack Wczytaj pliki do stosu
Can't render this file because it contains an unexpected character in line 6 and column 47.
+9 -7
View File
@@ -12,7 +12,7 @@
# Clean-room: every entry was written from the plain meaning of the English label using ordinary
# Brazilian Portuguese computing vocabulary (camada, desfoque, seleção, demarcador ...). No
# proprietary localisation resource, string table or product UI was consulted or copied; add
# entries the same way. Product and technology names (PhotoCraft, ArtCraft, OpenType, CMYK, Lab ...)
# entries the same way. Product and technology names (PhotoCraft, OpenType, CMYK, Lab ...)
# stay as they are; the trailing "…" of dialog commands is kept.
# Guide layout dialog
@@ -707,6 +707,14 @@
Classic Theme Tema clássico
Solarized dark Solarized escuro
Solarized Dark Theme Tema Solarized Escuro
Catppuccin Latte Theme Tema Catppuccin Latte
Catppuccin latte Catppuccin Latte
Catppuccin Frappé Theme Tema Catppuccin Frappé
Catppuccin frappe Catppuccin Frappé
Catppuccin Macchiato Theme Tema Catppuccin Macchiato
Catppuccin macchiato Catppuccin Macchiato
Catppuccin Mocha Theme Tema Catppuccin Mocha
Catppuccin mocha Catppuccin Mocha
Breeze dark Breeze escuro
Breeze Dark Theme Tema Breeze Escuro
Breeze light Breeze claro
@@ -743,8 +751,6 @@
About PhotoCraft Sobre o PhotoCraft
PhotoCraft Website Site do PhotoCraft
PhotoCraft on GitHub PhotoCraft no GitHub
ArtCraft Website Site do ArtCraft
Join the ArtCraft Discord… Participe do Discord do ArtCraft…
Report an Issue… Relatar um problema…
WIA Support… Suporte a WIA…
Apply Aplicar
@@ -1018,7 +1024,6 @@
Diffusion Difusão
Discard the embedded profile (don't color manage) Descartar o perfil incorporado (não gerenciar cores)
Discontiguous Não contíguo
Discord Discord
Dismiss Dispensar
Display P3 Display P3
Display Text Texto de exibição
@@ -1144,7 +1149,6 @@
Invert All Inverter tudo
Invert has no settings. Inverter não tem configurações.
Italic Itálico
Join us on Discord Participe do nosso Discord
Justify all Justificar tudo
Justify last centered Justificar com a última linha centralizada
Justify last left Justificar com a última linha à esquerda
@@ -1546,7 +1550,6 @@
Apple Watch 45mm Apple Watch 45mm
Aqua Aqua
Art & Illustration Arte e ilustração
ArtCraft ArtCraft
Background Eraser Tool Ferramenta Borracha de plano de fundo
Bevel & Emboss Chanfro e entalhe
Blend Mode Modo de mesclagem
@@ -3399,7 +3402,6 @@ layerLabel No Color Sem cor
Custom Pixel Aspect Ratio Proporção de pixel personalizada
32-bit Preview Options Opções de visualização de 32 bits
New Guide Nova guia
Join the ArtCraft Discord Entrar no Discord do ArtCraft
Report an Issue Relatar um problema
Load Files into Stack Carregar arquivos em pilha
Statistics Estatísticas
Can't render this file because it contains an unexpected character in line 6 and column 47.
+9 -6
View File
@@ -13,7 +13,7 @@
# graphics-editor vocabulary (Слой, Каналы, Маска, Выделение, Кривые ...), matching Photoshop's
# Russian menu tradition where it is unambiguous. No proprietary localisation resource was
# consulted or copied; entries are added the same way.
# Product and technology names (PhotoCraft, ArtCraft, OpenType, CMYK, Lab ...) stay in Latin
# Product and technology names (PhotoCraft, OpenType, CMYK, Lab ...) stay in Latin
# letters; the trailing "…" of dialog commands is kept; the colon of a label ("Width:") becomes
# the Russian typographic equivalent, with the space the source carries.
@@ -509,8 +509,6 @@
PhotoCraft Website Сайт PhotoCraft
PhotoCraft on GitHub PhotoCraft на GitHub
Report an Issue… Сообщить о проблеме…
ArtCraft Website Сайт ArtCraft
Join the ArtCraft Discord… Discord сообщества ArtCraft…
System Info… Информация о системе…
# Tools and options bar
@@ -1424,6 +1422,14 @@
Classic Theme Классическая тема
Solarized dark Solarized тёмная
Solarized Dark Theme Тёмная тема Solarized
Catppuccin Latte Theme Тема Catppuccin Latte
Catppuccin latte Catppuccin Latte
Catppuccin Frappé Theme Тема Catppuccin Frappé
Catppuccin frappe Catppuccin Frappé
Catppuccin Macchiato Theme Тема Catppuccin Macchiato
Catppuccin macchiato Catppuccin Macchiato
Catppuccin Mocha Theme Тема Catppuccin Mocha
Catppuccin mocha Catppuccin Mocha
Breeze dark Breeze тёмная
Breeze Dark Theme Тёмная тема Breeze
Breeze light Breeze светлая
@@ -1632,9 +1638,7 @@
Preserve Transparency Сохранить прозрачность
Reverse Обратить
Align with layer По слою
Join us on Discord Мы в Discord
PhotoCraft website Сайт PhotoCraft
ArtCraft ArtCraft
GitHub GitHub
No character style Нет стиля символов
No author Нет автора
@@ -2043,7 +2047,6 @@
Delete tool preset Удалить набор инструментов
Depth Jitter Колебание глубины
Discontiguous Несмежные пикселы
Discord Discord
Display P3 Display P3
Display Text Показывать текст
Divide… Деление…
Can't render this file because it contains an unexpected character in line 6 and column 47.
+1 -7
View File
@@ -4,7 +4,7 @@
# Clean-room: every entry was written from the plain meaning of the English label using ordinary
# Turkish computing vocabulary (katman, seçim, maske, ayar katmanı, fırça, degrade ...). No
# proprietary localisation resource, string table or product UI was consulted or copied; add
# entries the same way. Product and technology names (PhotoCraft, ArtCraft, OpenType, CMYK, Lab ...)
# entries the same way. Product and technology names (PhotoCraft, OpenType, CMYK, Lab ...)
# stay as they are; the trailing "…" of dialog commands is kept.
#
Rows Satırlar
@@ -736,8 +736,6 @@
About PhotoCraft PhotoCraft Hakkında
PhotoCraft Website PhotoCraft Web Sitesi
PhotoCraft on GitHub GitHub'da PhotoCraft
ArtCraft Website ArtCraft Web Sitesi
Join the ArtCraft Discord… ArtCraft Discord'una katılın…
Report an Issue… Bir Sorun Bildirin…
WIA Support… WIA Desteği…
Apply Uygula
@@ -1008,7 +1006,6 @@
Diffusion Difüzyon
Discard the embedded profile (don't color manage) Gömülü profili atın (renk yönetimi yapmayın)
Discontiguous bitişik değil
Discord Discord
Dismiss Reddet
Display P3 Display P3
Display Text Metni Görüntüle
@@ -1140,7 +1137,6 @@
Invert All Tümünü Ters Çevir
Invert has no settings. Tersine çevirmenin hiçbir ayarı yoktur.
Italic italik
Join us on Discord Discord'da bize katılın
Justify all Hepsini gerekçelendir
Justify last centered Son ortayı iki yana yasla
Justify last left Son sola yasla
@@ -1541,7 +1537,6 @@
Apple Watch 45mm Apple Watch 45mm
Aqua Su
Art & Illustration Sanat ve İllüstrasyon
ArtCraft ArtCraft
Background Eraser Tool Arka Plan Silgisi Aracı
Bevel & Emboss Eğim Ver ve Kabart
Blend Mode Karışım Modu
@@ -2969,7 +2964,6 @@ cameraRaw Color Renk
Custom Pixel Aspect Ratio Özel Piksel En Boy Oranı
32-bit Preview Options 32 bit Önizleme Seçenekleri
New Guide Yeni Kılavuz
Join the ArtCraft Discord ArtCraft Discord'una katılın
Report an Issue Sorun Bildir
Load Files into Stack Dosyaları Yığına Yükle
Statistics İstatistikler
Can't render this file because it contains an unexpected character in line 8 and column 34.
+8 -6
View File
@@ -487,8 +487,6 @@
PhotoCraft Website Вебсайт PhotoCraft
PhotoCraft on GitHub PhotoCraft на GitHub
Report an Issue… Повідомити про проблему…
ArtCraft Website Вебсайт ArtCraft
Join the ArtCraft Discord… Приєднатися до Discord ArtCraft…
System Info… Інформація про систему…
# Tools and options bar
@@ -1403,6 +1401,14 @@
Classic Theme Класична тема
Solarized dark Solarized темна
Solarized Dark Theme Темна тема Solarized
Catppuccin Latte Theme Тема Catppuccin Latte
Catppuccin latte Catppuccin Latte
Catppuccin Frappé Theme Тема Catppuccin Frappé
Catppuccin frappe Catppuccin Frappé
Catppuccin Macchiato Theme Тема Catppuccin Macchiato
Catppuccin macchiato Catppuccin Macchiato
Catppuccin Mocha Theme Тема Catppuccin Mocha
Catppuccin mocha Catppuccin Mocha
Breeze dark Breeze темна
Breeze Dark Theme Темна тема Breeze
Breeze light Breeze світла
@@ -1613,9 +1619,7 @@
Preserve Transparency Зберігати прозорість
Reverse Зворотний
Align with layer Вирівняти за шаром
Join us on Discord Приєднуйтеся до нас у Discord
PhotoCraft website Вебсайт PhotoCraft
ArtCraft ArtCraft
GitHub GitHub
No character style Без стилю символів
No author Автор відсутній
@@ -2029,7 +2033,6 @@
Delete tool preset Видалити набір інструмента
Depth Jitter Коливання глибини
Discontiguous Несуміжні
Discord Discord
Display P3 Display P3
Display Text Показувати текст
Divide… Розділити…
@@ -3274,7 +3277,6 @@ cameraRaw Masking Маскування
Custom Pixel Aspect Ratio Довільне співвідношення сторін пікселя
32-bit Preview Options Параметри 32-бітного перегляду
New Guide Нова напрямна
Join the ArtCraft Discord Приєднатися до Discord ArtCraft
Report an Issue Повідомити про проблему
WIA Support Підтримка WIA
Load Files into Stack Завантажити файли у стос
Can't render this file because it contains an unexpected character in line 1355 and column 18.
+1 -6
View File
@@ -15,7 +15,7 @@
# Clean-room: every entry was written from the plain meaning of the English label using ordinary
# Vietnamese computing and image-editing vocabulary. No proprietary localisation resource, string
# table or product UI was consulted or copied; add entries the same way. Product and technology
# names (PhotoCraft, ArtCraft, OpenType, RGB, CMYK, Lab, PSD, PNG, JPEG, WebP, OpenEXR, AVIF …)
# names (PhotoCraft, OpenType, RGB, CMYK, Lab, PSD, PNG, JPEG, WebP, OpenEXR, AVIF …)
# stay as they are; the trailing "…" of dialog commands is kept. Plural rule: one form
# (`plural_none` in i18n/mod.rs).
@@ -626,7 +626,6 @@
6-up 6 cửa sổ
About PhotoCraft Giới thiệu PhotoCraft
Actions Thao tác
ArtCraft Website Trang web ArtCraft
Brush Settings Thiết lập cọ
Brushes Cọ
Cascade Xếp tầng
@@ -646,7 +645,6 @@
Histogram Histogram
History Lịch sử
Info Thông tin
Join the ArtCraft Discord… Tham gia Discord ArtCraft…
Layer Comps Tổ hợp lớp
Lock Workspace Khóa không gian làm việc
Match All Đồng bộ tất cả
@@ -1920,7 +1918,6 @@ colorRange Invert Đảo ngược
# Visual QA finalization
New document… Tài liệu mới…
Join us on Discord Tham gia Discord
PhotoCraft website Trang web PhotoCraft
Anchor: Neo:
Canvas extension color: Màu mở rộng canvas:
@@ -2275,7 +2272,6 @@ layers Fill: Độ tô:
Add Thêm
Appearance Giao diện
shape Appearance Diện mạo
ArtCraft ArtCraft
Bottom Dưới
Capture Ghi lại
Change Thay
@@ -2284,7 +2280,6 @@ shape Appearance Diện mạo
current hiện tại
Cycle Orientation Đổi hướng khung
Difference Hiệu
Discord Discord
Display P3 Display P3
GitHub GitHub
Gray Gamma 2.2 Gray Gamma 2.2
Can't render this file because it contains an unexpected character in line 6 and column 47.
+8 -5
View File
@@ -724,6 +724,14 @@
Classic Theme 经典主题
Solarized dark Solarized 深色
Solarized Dark Theme Solarized 深色主题
Catppuccin Latte Theme Catppuccin Latte 主题
Catppuccin latte Catppuccin Latte
Catppuccin Frappé Theme Catppuccin Frappé 主题
Catppuccin frappe Catppuccin Frappé
Catppuccin Macchiato Theme Catppuccin Macchiato 主题
Catppuccin macchiato Catppuccin Macchiato
Catppuccin Mocha Theme Catppuccin Mocha 主题
Catppuccin mocha Catppuccin Mocha
Breeze dark Breeze 深色
Breeze Dark Theme Breeze 深色主题
Breeze light Breeze 浅色
@@ -760,8 +768,6 @@
About PhotoCraft 关于 PhotoCraft
PhotoCraft Website PhotoCraft 网站
PhotoCraft on GitHub PhotoCraft 的 GitHub 页面
ArtCraft Website ArtCraft 网站
Join the ArtCraft Discord… 加入 ArtCraft 的 Discord 社区…
Report an Issue… 报告问题…
WIA Support… WIA 支持…
Apply 应用
@@ -1035,7 +1041,6 @@
Diffusion 扩散
Discard the embedded profile (don't color manage) 丢弃嵌入的配置文件(不进行色彩管理)
Discontiguous 不连续
Discord Discord
Dismiss 关闭
Display P3 Display P3
Display Text 显示文字
@@ -1169,7 +1174,6 @@
Invert All 全部反相
Invert has no settings. 反相没有可调整的设置。
Italic 斜体
Join us on Discord 加入我们的 Discord 社区
Justify all 全部两端对齐
Justify last centered 两端对齐,末行居中
Justify last left 两端对齐,末行左对齐
@@ -1583,7 +1587,6 @@
Apple Watch 45mm Apple Watch 45mm
Aqua 水绿色
Art & Illustration 艺术与插画
ArtCraft ArtCraft
Background Eraser Tool 背景橡皮擦工具
Bevel & Emboss 斜面和浮雕
Blend Mode 混合模式
1 # Simplified Chinese (zh-hans) catalog. UTF-8, TAB-separated columns:
724
725
726
727
728
729
730
731
732
733
734
735
736
737
768
769
770
771
772
773
1041
1042
1043
1044
1045
1046
1174
1175
1176
1177
1178
1179
1587
1588
1589
1590
1591
1592
+9 -6
View File
@@ -14,7 +14,7 @@
# Clean-room: every entry was written from the plain meaning of the English label using the
# image-editing 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 (PhotoCraft, ArtCraft, OpenType, CMYK, Lab ...)
# entries the same way. Product and technology names (PhotoCraft, OpenType, CMYK, Lab ...)
# and paper sizes (Legal, 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.
@@ -729,6 +729,14 @@
Classic Theme 經典主題
Solarized dark Solarized 深色
Solarized Dark Theme Solarized 深色主題
Catppuccin Latte Theme Catppuccin Latte 主題
Catppuccin latte Catppuccin Latte
Catppuccin Frappé Theme Catppuccin Frappé 主題
Catppuccin frappe Catppuccin Frappé
Catppuccin Macchiato Theme Catppuccin Macchiato 主題
Catppuccin macchiato Catppuccin Macchiato
Catppuccin Mocha Theme Catppuccin Mocha 主題
Catppuccin mocha Catppuccin Mocha
Breeze dark Breeze 深色
Breeze Dark Theme Breeze 深色主題
Breeze light Breeze 淺色
@@ -765,8 +773,6 @@
About PhotoCraft 關於 PhotoCraft
PhotoCraft Website PhotoCraft 網站
PhotoCraft on GitHub GitHub 上的 PhotoCraft
ArtCraft Website ArtCraft 網站
Join the ArtCraft Discord… 加入 ArtCraft Discord…
Report an Issue… 回報問題…
WIA Support… WIA 支援…
Apply 套用
@@ -1038,7 +1044,6 @@
Diffusion 擴散
Discard the embedded profile (don't color manage) 捨棄嵌入的描述檔 (不進行色彩管理)
Discontiguous 不連續
Discord Discord
Dismiss 關閉
Display P3 Display P3
Display Text 顯示文字
@@ -1170,7 +1175,6 @@
Invert All 全部反轉
Invert has no settings. 負片效果沒有設定。
Italic 斜體
Join us on Discord 加入我們的 Discord
Justify all 全部齊行
Justify last centered 最後一行置中齊行
Justify last left 最後一行靠左齊行
@@ -1577,7 +1581,6 @@
Apple Watch 45mm Apple Watch 45mm
Aqua 水藍色
Art & Illustration 藝術與插畫
ArtCraft ArtCraft
Background Eraser Tool 背景橡皮擦工具
Bevel & Emboss 斜角和浮雕
Blend Mode 混合模式
Can't render this file because it contains an unexpected character in line 6 and column 47.
+1
View File
@@ -187,6 +187,7 @@ mod tab_strip;
pub mod targa_options_ui;
pub mod text_field_menu;
pub mod theme;
mod theme_catppuccin;
pub mod tiff_options_ui;
mod timeline_ui;
mod titlebar;
+16 -41
View File
@@ -1,20 +1,14 @@
//! Community and project links: the Help menu, the About dialog, the start screen and the title
//! bar all open these. URLs follow the crafting-app pattern (`getartcraft.com/apps/<app>`,
//! `github.com/storytold/<app>`).
//! Project links: the Help menu, the About dialog and the start screen open these.
use serde_json::{Value, json};
use crate::PhotocraftApp;
pub const DISCORD: &str = "https://discord.gg/artcraft";
pub const ARTCRAFT_WEBSITE: &str = "https://getartcraft.com";
pub const APP_PAGE: &str = "https://getartcraft.com/apps/photocraft";
pub const GITHUB: &str = "https://github.com/storytold/photocraft";
pub const ISSUES: &str = "https://github.com/storytold/photocraft/issues";
/// Help-menu link commands: (id, url). Labels live in `menus::UI_COMMANDS`.
pub const COMMANDS: &[(&str, &str)] =
&[("help.discord", DISCORD), ("help.website", APP_PAGE), ("help.artcraftWebsite", ARTCRAFT_WEBSITE), ("help.github", GITHUB), ("help.reportIssue", ISSUES)];
pub const COMMANDS: &[(&str, &str)] = &[("help.github", GITHUB), ("help.reportIssue", ISSUES)];
pub fn url_for(id: &str) -> Option<&'static str> {
COMMANDS.iter().find(|c| c.0 == id).map(|c| c.1)
@@ -32,32 +26,18 @@ pub fn open(app: &mut PhotocraftApp, ctx: &egui::Context, url: &str) -> Value {
json!({"url": url})
}
/// The prominent "Join us on Discord" button.
pub fn discord_button(app: &mut PhotocraftApp, ui: &mut egui::Ui, min_width: f32) -> egui::Response {
let r = crate::widgets::primary_button(ui, tl!("Join us on Discord"), min_width).on_hover_text(DISCORD);
if r.clicked() {
open(app, ui.ctx(), DISCORD);
}
r
}
/// "PhotoCraft website · GitHub · ArtCraft" as links, centred. Clicks route through [`open`] (the
/// platform browser service) rather than `ui.hyperlink_to`, which uses the unreliable `ctx.open_url`.
/// "GitHub" as a link, centred. Clicks route through [`open`] (the platform browser service)
/// rather than `ui.hyperlink_to`, which uses the unreliable `ctx.open_url`.
pub fn link_row(app: &mut PhotocraftApp, ui: &mut egui::Ui) {
let t = crate::theme::Tokens::get(ui.ctx());
let links = [(tl!("PhotoCraft website"), APP_PAGE), (tl!("GitHub"), GITHUB), (tl!("ArtCraft"), ARTCRAFT_WEBSITE)];
let links = [(tl!("GitHub"), GITHUB)];
let font = egui::FontId::proportional(12.5);
let sep = " · ";
let width: f32 = links.iter().map(|(l, _)| ui.painter().layout_no_wrap((*l).into(), font.clone(), t.text).size().x).sum::<f32>()
+ 2.0 * ui.painter().layout_no_wrap(sep.into(), font.clone(), t.text).size().x;
let width: f32 = links.iter().map(|(l, _)| ui.painter().layout_no_wrap((*l).into(), font.clone(), t.text).size().x).sum::<f32>();
let mut clicked: Option<&str> = None;
ui.horizontal(|ui| {
ui.spacing_mut().item_spacing.x = 0.0;
ui.add_space(((ui.available_width() - width) / 2.0).max(0.0));
for (i, (label, url)) in links.iter().enumerate() {
if i > 0 {
ui.label(egui::RichText::new(sep).font(font.clone()).color(t.text_faint));
}
for (label, url) in &links {
if ui.link(egui::RichText::new(*label).font(font.clone()).color(t.accent)).on_hover_text(*url).clicked() {
clicked = Some(url);
}
@@ -74,7 +54,7 @@ mod tests {
#[test]
fn links_open_through_the_platform_service() {
// Issue #14: links (Help menu, Discord button, start-page links) must open in the browser.
// Issue #14: links (Help menu, start-page links) must open in the browser.
// They route through the `open_url` service rather than the unreliable `ctx.open_url`.
use std::sync::{Arc, Mutex};
let opened: Arc<Mutex<Vec<String>>> = Arc::new(Mutex::new(Vec::new()));
@@ -93,16 +73,16 @@ mod tests {
crate::menus::invoke(&mut app, &ctx, id, json!({})).unwrap();
assert_eq!(opened.lock().unwrap().last().map(String::as_str), Some(*url), "{id}");
}
// The direct open() helper (Discord button / start-page links) also uses it.
open(&mut app, &ctx, DISCORD);
assert_eq!(opened.lock().unwrap().last().map(String::as_str), Some(DISCORD));
// The direct open() helper (start-page links) also uses it.
open(&mut app, &ctx, GITHUB);
assert_eq!(opened.lock().unwrap().last().map(String::as_str), Some(GITHUB));
}
#[test]
fn help_menu_lists_links_then_separator_then_system_info_and_about() {
let app = PhotocraftApp::new(photocraft_engine::Session::new(), Default::default());
let help: Vec<String> = crate::menus::menu_items(&app).into_iter().filter(|i| i.path == ["Help"]).map(|i| i.id).collect();
assert_eq!(help, ["help.discord", "help.website", "help.artcraftWebsite", "help.github", "help.reportIssue", "---", "help.systemInfo", "help.about"]);
assert_eq!(help, ["help.github", "help.reportIssue", "---", "help.systemInfo", "help.about"]);
for (id, _) in COMMANDS {
assert!(crate::menus::is_live(id) && crate::menus::is_enabled(&app, id), "{id}");
}
@@ -112,14 +92,9 @@ mod tests {
fn link_commands_open_their_urls() {
let mut app = PhotocraftApp::new(photocraft_engine::Session::new(), Default::default());
let ctx = egui::Context::default();
for (id, url) in [
("help.discord", "https://discord.gg/artcraft"),
("help.website", "https://getartcraft.com/apps/photocraft"),
("help.github", "https://github.com/storytold/photocraft"),
] {
let r = crate::menus::invoke(&mut app, &ctx, id, serde_json::json!({})).unwrap();
assert_eq!(r["url"], url);
assert_eq!(app.ui.status, format!("Opened {url}"));
}
let (id, url) = ("help.github", "https://github.com/storytold/photocraft");
let r = crate::menus::invoke(&mut app, &ctx, id, serde_json::json!({})).unwrap();
assert_eq!(r["url"], url);
assert_eq!(app.ui.status, format!("Opened {url}"));
}
}
+10 -5
View File
@@ -89,11 +89,12 @@ pub const UI_COMMANDS: &[(&str, &str, &[&str], Option<&str>)] = &[
("window.theme.adwaitaDark", "Adwaita Dark Theme", &["Window", "Theme"], None),
("window.theme.breezeLight", "Breeze Light Theme", &["Window", "Theme"], None),
("window.theme.breezeDark", "Breeze Dark Theme", &["Window", "Theme"], None),
("window.theme.catppuccinLatte", "Catppuccin Latte Theme", &["Window", "Theme"], None),
("window.theme.catppuccinFrappe", "Catppuccin Frappé Theme", &["Window", "Theme"], None),
("window.theme.catppuccinMacchiato", "Catppuccin Macchiato Theme", &["Window", "Theme"], None),
("window.theme.catppuccinMocha", "Catppuccin Mocha Theme", &["Window", "Theme"], None),
("window.theme.system", "Sync with system", &["Window", "Theme"], None),
("edit.search", "Search…", &["Edit"], Some("Cmd+F")),
("help.discord", "Join the ArtCraft Discord…", &["Help"], None),
("help.website", "PhotoCraft Website", &["Help"], None),
("help.artcraftWebsite", "ArtCraft Website", &["Help"], None),
("help.github", "PhotoCraft on GitHub", &["Help"], None),
("help.reportIssue", "Report an Issue…", &["Help"], None),
("help.systemInfo", "System Info…", &["Help"], None),
@@ -183,7 +184,7 @@ pub(crate) fn invoke_unguarded(app: &mut PhotocraftApp, ctx: &egui::Context, id:
if let Some(result) = crate::panel_docking::command(app, id, &params) {
return result;
}
// Help › Discord, website, GitHub, Report an Issue.
// Help › GitHub, Report an Issue.
if let Some(url) = crate::links::url_for(id) {
return Ok(crate::links::open(app, ctx, url));
}
@@ -370,7 +371,11 @@ pub(crate) fn invoke_unguarded(app: &mut PhotocraftApp, ctx: &egui::Context, id:
| "window.theme.adwaita"
| "window.theme.adwaitaDark"
| "window.theme.breezeLight"
| "window.theme.breezeDark" => {
| "window.theme.breezeDark"
| "window.theme.catppuccinLatte"
| "window.theme.catppuccinFrappe"
| "window.theme.catppuccinMacchiato"
| "window.theme.catppuccinMocha" => {
let k = crate::theme::ThemeKind::from_name(&id["window.theme.".len()..]).unwrap_or_default();
app.set_theme(ctx, k);
Ok(Value::Null)
+2 -24
View File
@@ -589,9 +589,8 @@ pub fn title_bar(app: &mut PhotocraftApp, ui: &mut egui::Ui) {
("Pixel Art".to_string(), tl!("Pixel Art")),
("Motion".to_string(), tl!("Motion")),
];
// A narrow bar drops what is also in a menu, Discord first (below), then
// the theme toggle (Preferences), then search (Edit › Search), and narrows
// the switcher (Window › Workspace) before anything runs over.
// A narrow bar drops what is also in a menu: the theme toggle (Preferences), then search
// (Edit › Search), and narrows the switcher (Window › Workspace) before anything runs over.
let room = ui.available_width();
let icons_shown: u8 = if room >= WORKSPACE_MIN + 2.0 * ICON_SLOT {
2
@@ -623,25 +622,6 @@ pub fn title_bar(app: &mut PhotocraftApp, ui: &mut egui::Ui) {
}
button.context_menu(|ui| crate::prefs_ui::appearance_context_menu(app, ui));
}
// The community Discord, one click away while the bar has room for it
// (narrow windows drop it first; it is also Help › Discord).
if ui.available_width() >= DISCORD_ROOM {
let discord = egui::Button::image_and_text(
icons::image("message-square", 14.0, t.text_dim),
egui::RichText::new(tl!("Discord")).color(t.text_dim).size(12.0),
)
.frame(false);
if ui
.add(discord)
.on_hover_text({
let template = "Join the ArtCraft Discord ({url})";
crate::i18n::fmt(tl!(template), &[("url", crate::links::DISCORD)])
})
.clicked()
{
crate::links::open(app, ui.ctx(), crate::links::DISCORD);
}
}
if rtl { ui.min_rect().right() } else { ui.min_rect().left() }
};
free = if rtl { (controls_end, menus_end) } else { (menus_end, controls_end) };
@@ -698,8 +678,6 @@ pub fn sync_window_title(app: &mut PhotocraftApp, ctx: &egui::Context) {
/// Minimum space kept between the window title and the menus or controls beside it.
const TITLE_GAP: f32 = 16.0;
/// Free room the title bar needs after its other controls to show the Discord button.
const DISCORD_ROOM: f32 = 120.0;
/// The workspace switcher's narrowest width, and one 28 pt title-bar icon with its spacing.
const WORKSPACE_MIN: f32 = 90.0;
const ICON_SLOT: f32 = 34.0;
+8
View File
@@ -97,6 +97,7 @@ fn selected_theme(interface: &prefs::Interface, system: Option<egui::Theme>) ->
LightTheme::Classic => ThemeKind::Classic,
LightTheme::Adwaita => ThemeKind::Adwaita,
LightTheme::BreezeLight => ThemeKind::BreezeLight,
LightTheme::CatppuccinLatte => ThemeKind::CatppuccinLatte,
}
} else {
match interface.dark_theme {
@@ -106,6 +107,9 @@ fn selected_theme(interface: &prefs::Interface, system: Option<egui::Theme>) ->
DarkTheme::SolarizedDark => ThemeKind::SolarizedDark,
DarkTheme::AdwaitaDark => ThemeKind::AdwaitaDark,
DarkTheme::BreezeDark => ThemeKind::BreezeDark,
DarkTheme::CatppuccinFrappe => ThemeKind::CatppuccinFrappe,
DarkTheme::CatppuccinMacchiato => ThemeKind::CatppuccinMacchiato,
DarkTheme::CatppuccinMocha => ThemeKind::CatppuccinMocha,
}
}
}
@@ -133,6 +137,7 @@ const LIGHT_THEME_OPTIONS: &[(&str, ThemeKind)] = &[
("classic", ThemeKind::Classic),
("adwaita", ThemeKind::Adwaita),
("breezeLight", ThemeKind::BreezeLight),
("catppuccinLatte", ThemeKind::CatppuccinLatte),
];
const DARK_THEME_OPTIONS: &[(&str, ThemeKind)] = &[
("proMedium", ThemeKind::ProMedium),
@@ -141,6 +146,9 @@ const DARK_THEME_OPTIONS: &[(&str, ThemeKind)] = &[
("solarizedDark", ThemeKind::SolarizedDark),
("adwaitaDark", ThemeKind::AdwaitaDark),
("breezeDark", ThemeKind::BreezeDark),
("catppuccinFrappe", ThemeKind::CatppuccinFrappe),
("catppuccinMacchiato", ThemeKind::CatppuccinMacchiato),
("catppuccinMocha", ThemeKind::CatppuccinMocha),
];
fn favorite_theme_groups(favorites: &[SavedTheme]) -> (Vec<ThemeKind>, Vec<ThemeKind>) {
+37 -2
View File
@@ -48,10 +48,18 @@ pub enum ThemeKind {
BreezeLight,
/// An adaptation of KDE Plasma's Breeze Dark look.
BreezeDark,
/// Catppuccin Latte (light).
CatppuccinLatte,
/// Catppuccin Frappé (dark).
CatppuccinFrappe,
/// Catppuccin Macchiato (dark).
CatppuccinMacchiato,
/// Catppuccin Mocha (dark).
CatppuccinMocha,
}
impl ThemeKind {
pub const ALL: [ThemeKind; 12] = [
pub const ALL: [ThemeKind; 16] = [
ThemeKind::Pro,
ThemeKind::ProMedium,
ThemeKind::ProLightGray,
@@ -64,6 +72,10 @@ impl ThemeKind {
ThemeKind::AdwaitaDark,
ThemeKind::BreezeLight,
ThemeKind::BreezeDark,
ThemeKind::CatppuccinLatte,
ThemeKind::CatppuccinFrappe,
ThemeKind::CatppuccinMacchiato,
ThemeKind::CatppuccinMocha,
];
pub fn label(self) -> &'static str {
match self {
@@ -79,6 +91,10 @@ impl ThemeKind {
ThemeKind::SolarizedDark => "Solarized Dark",
ThemeKind::BreezeLight => "Breeze Light",
ThemeKind::BreezeDark => "Breeze Dark",
ThemeKind::CatppuccinLatte => "Catppuccin Latte",
ThemeKind::CatppuccinFrappe => "Catppuccin Frappé",
ThemeKind::CatppuccinMacchiato => "Catppuccin Macchiato",
ThemeKind::CatppuccinMocha => "Catppuccin Mocha",
}
}
/// The canonical name: `ui.set {theme}` accepts it and the Window › Theme commands are
@@ -97,6 +113,10 @@ impl ThemeKind {
ThemeKind::SolarizedDark => "solarizedDark",
ThemeKind::BreezeLight => "breezeLight",
ThemeKind::BreezeDark => "breezeDark",
ThemeKind::CatppuccinLatte => "catppuccinLatte",
ThemeKind::CatppuccinFrappe => "catppuccinFrappe",
ThemeKind::CatppuccinMacchiato => "catppuccinMacchiato",
ThemeKind::CatppuccinMocha => "catppuccinMocha",
}
}
/// Photoshop-grammar layout (tab strips, flat panels): the four Pro brightness levels.
@@ -121,6 +141,10 @@ impl ThemeKind {
"solarizeddark" | "solarized" => Some(ThemeKind::SolarizedDark),
"breezelight" | "breeze" | "kde" | "kdelight" | "plasma" | "plasmalight" => Some(ThemeKind::BreezeLight),
"breezedark" | "kdedark" | "plasmadark" => Some(ThemeKind::BreezeDark),
"catppuccinlatte" | "latte" => Some(ThemeKind::CatppuccinLatte),
"catppuccinfrappe" | "catppuccinfrappé" | "frappe" | "frappé" => Some(ThemeKind::CatppuccinFrappe),
"catppuccinmacchiato" | "macchiato" => Some(ThemeKind::CatppuccinMacchiato),
"catppuccinmocha" | "catppuccin" | "mocha" => Some(ThemeKind::CatppuccinMocha),
_ => None,
}
}
@@ -645,6 +669,9 @@ impl Tokens {
caption_close_text: Color32::from_rgb(253, 246, 227),
scrim: Color32::from_black_alpha(110),
},
ThemeKind::CatppuccinLatte | ThemeKind::CatppuccinFrappe | ThemeKind::CatppuccinMacchiato | ThemeKind::CatppuccinMocha => {
crate::theme_catppuccin::tokens(kind)
}
}
}
@@ -714,7 +741,15 @@ impl Tokens {
pub fn dark(&self) -> bool {
matches!(
self.kind,
ThemeKind::Studio | ThemeKind::Pro | ThemeKind::ProMedium | ThemeKind::SolarizedDark | ThemeKind::AdwaitaDark | ThemeKind::BreezeDark
ThemeKind::Studio
| ThemeKind::Pro
| ThemeKind::ProMedium
| ThemeKind::SolarizedDark
| ThemeKind::AdwaitaDark
| ThemeKind::BreezeDark
| ThemeKind::CatppuccinFrappe
| ThemeKind::CatppuccinMacchiato
| ThemeKind::CatppuccinMocha
)
}
}
+65
View File
@@ -0,0 +1,65 @@
//! Catppuccin Latte, Frappé, Macchiato and Mocha on the Studio layout. Palette: the Catppuccin
//! project's colours (https://catppuccin.com/palette, MIT; see LICENSE-catppuccin.txt), accent Mauve.
use craft_ui::theme::catppuccin::Flavor;
use egui::Color32;
use crate::theme::{ThemeKind, Tokens};
fn soft(c: Color32, alpha: u8) -> Color32 {
Color32::from_rgba_unmultiplied(c.r(), c.g(), c.b(), alpha)
}
/// Tokens for a Catppuccin kind. Any other kind falls back to Mocha (never reached: `for_kind` only routes these four here).
pub(crate) fn tokens(kind: ThemeKind) -> Tokens {
let f = match kind {
ThemeKind::CatppuccinLatte => Flavor::Latte,
ThemeKind::CatppuccinFrappe => Flavor::Frappe,
ThemeKind::CatppuccinMacchiato => Flavor::Macchiato,
_ => Flavor::Mocha,
};
let (p, light) = (f.palette(), !f.is_dark());
// Dark flavours step up from the darkest surface; Latte steps down from the lightest.
let (canvas, chrome, dock, hover, pressed) =
if light { (p.crust, p.base, p.mantle, p.crust, p.surface0) } else { (p.base, p.mantle, p.crust, p.surface0, p.surface1) };
Tokens {
kind,
chrome,
canvas,
canvas_dot: p.surface0,
dock,
card: chrome,
card_border: if light { p.surface0 } else { p.crust },
field: dock,
field_border: p.surface1,
hover,
pressed,
text: p.text,
text_dim: p.subtext0,
text_faint: p.overlay1,
icon: p.subtext1,
accent: p.mauve,
accent_soft: soft(p.mauve, if light { 40 } else { 46 }),
accent_border: soft(p.mauve, if light { 130 } else { 120 }),
accent_text: if light { p.mauve } else { p.text },
separator: if light { p.surface0 } else { p.crust },
shadow: Color32::from_black_alpha(if light { 45 } else { 150 }),
primary_bg: p.mauve,
primary_text: if light { p.base } else { p.crust },
danger: p.red,
warning: p.yellow,
radius_sm: 6.0,
radius: 8.0,
radius_lg: 12.0,
bevel: false,
pro: false,
round_chips: true,
tab_strip: Color32::TRANSPARENT,
row_selected: Color32::TRANSPARENT,
histogram_bg: if light { Color32::from_gray(40) } else { p.base },
histogram_level: if light { 240 } else { 225 },
caption_close: p.red,
caption_close_text: if light { p.base } else { p.crust },
scrim: Color32::from_black_alpha(110),
}
}
+1 -4
View File
@@ -298,7 +298,7 @@ mod tests {
for width in [760.0, 1100.0, 1440.0] {
let mut w = Win::new(width);
w.frame(vec![]);
let out = w.frame(vec![]);
w.frame(vec![]);
let [min, max, close] = CAPTIONS.map(|c| w.caption(c));
assert_eq!((close.right(), close.top()), (width, 0.0), "Close sits in the window's corner at {width}");
// The bar's bottom point is the panel's separator line, which the buttons leave visible.
@@ -309,9 +309,6 @@ mod tests {
for a in &widgets {
assert!(a.right() <= min.left(), "{a:?} runs into the caption buttons at {width}");
}
// Wide windows show the whole group; the narrowest drops Discord (also Help › Discord).
let has_discord = texts(&out).iter().any(|(t, _)| t == "Discord");
assert_eq!(has_discord, width > 1000.0, "Discord at {width}");
}
}
-42
View File
@@ -1,42 +0,0 @@
ArtCraft brand assets: license
The ArtCraft name, wordmark and mark (the "ArtCraft Marks"), including every file in this
directory in every color, size and format, are owned by the ArtCraft Team. They are trademarks
and are NOT open source. They are not covered by PhotoCraft'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 PhotoCraft itself, its documentation and its official builds, to identify PhotoCraft 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 PhotoCraft, 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 PhotoCraft.
Forks and modified versions
If you distribute or publish a modified version of PhotoCraft, 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 PhotoCraft by
the ArtCraft team. A fork kept only to propose changes back to this repository may keep the marks
unchanged.
Everything else
Any use not expressly permitted here needs prior written permission from the ArtCraft Team
(https://getartcraft.com/). The permission ends automatically for anyone who breaks these terms.
All other rights are reserved.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

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

Before

Width:  |  Height:  |  Size: 341 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

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

Before

Width:  |  Height:  |  Size: 341 B

+1 -1
View File
@@ -1,7 +1,7 @@
# Contributing
- **Language:** Rust only. No JavaScript or TypeScript. On the web, `wasm-bindgen` generates a small loader; never hand-write JS.
- **Licence:** contributions are MIT OR Apache-2.0 (`LICENSE-MIT`, `LICENSE-APACHE`, `NOTICE`). The ArtCraft logos in `docs/brand/` are not open source (`docs/brand/LICENSE-brand.txt`).
- **Licence:** contributions are MIT OR Apache-2.0 (`LICENSE-MIT`, `LICENSE-APACHE`, `NOTICE`).
- **Clean-room:** do not copy code, shaders, icons, ICC profiles or other assets from proprietary software (such as Photoshop). Match behaviour and look by observation and public specs. Only use assets with permissive licences, keep their license next to the asset (e.g. `assets/fonts/OFL-*.txt`, `assets/icons/LICENSE-lucide.txt`), and list every asset in `ATTRIBUTION.md`. **Fonts** live in [storytold/craft-fonts](https://github.com/storytold/craft-fonts), never in this repo: add new fonts there, and build with them through the optional `CRAFT_FONTS_DIR` build input (`docs/development.md` › Fonts; rules in `../craftrules/standards/fonts.md`, a sibling checkout — `storytold/craftrules` is not public, so ask a maintainer for the rules relevant to your change).
- **Never crash:** non-test code must not panic: no `unwrap`/`expect`/`panic!`/`unreachable!`/`todo!`/`unimplemented!` and no `unsafe`. Errors go through `Result` and `?`, input-derived indices and sizes are checked, and every crash fix ships with a regression test. See *Never crash* in `AGENTS.md`.
- **Commands, not handlers:** new features are engine commands with tests, and the UI calls them (checklist below).
+1 -1
View File
@@ -36,7 +36,7 @@ language manually there.
Keep English source keys, contexts, command IDs, placeholders and escapes intact.
Retain the trailing `…` on commands that open a dialog. Missing translations use
the framework's English fallback. User-supplied names and document data are not
translated. Product names and technology names such as PhotoCraft, ArtCraft,
translated. Product names and technology names such as PhotoCraft,
OpenType, RGB, CMYK and Lab retain their spelling. Status messages, errors and
automation output remain English as described in [UI design](ui-design.md#localisation);
complete catalog coverage does not claim those strings are translated.
+1 -1
View File
@@ -323,7 +323,7 @@ The keychain is deleted at the end of the job.
## Icons
`assets/app-icon/photocraft.svg` is the canonical icon: the owner's ArtCraft drawing of a
`assets/app-icon/photocraft.svg` is the canonical icon: the owner's drawing of a
nine-tailed kitsune, vectorised (MIT OR Apache-2.0, see `LICENSE.txt` there; palette and
geometry in `README.md`). `packaging/icons.sh` regenerates the 1024 px PNG, the `.icns`, the `.ico` (packed by
`cargo xtask ico`) and the hicolor PNGs from it. It needs `resvg`, plus `iconutil` on macOS.
+1 -1
View File
@@ -95,7 +95,7 @@ The app's top bar (`panels::title_bar`) starts with the brand mark (the app icon
- **Windows and Linux:** the window has no OS decorations, so there is one bar, not two stacked. The top bar is the title bar (`titlebar.rs`): Minimize, Maximize/Restore and Close (red on hover, `caption_close` tokens) sit flush in the window's top-right corner, the free gap between the menus and the controls drags the window and a double-click there maximizes it, and invisible 5 pt edges (12 pt corners) resize it. Close runs File › Exit, so unsaved documents are asked about first.
- **macOS:** the traffic lights sit over the integrated title strip (`integrated_titlebar`).
- **Narrow windows** drop controls that are also in a menu before anything overlaps: Discord (Help › Discord), then the theme toggle, then search (Edit › Search), then the workspace switcher narrows (Window › Workspace).
- **Narrow windows** drop controls that are also in a menu before anything overlaps: the theme toggle, then search (Edit › Search), then the workspace switcher narrows (Window › Workspace).
## Compact tool controls
@@ -26,10 +26,10 @@
<launchable type="desktop-id">ai.storyteller.photocraft.desktop</launchable>
<icon type="stock">ai.storyteller.photocraft</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/photocraft</url>
<url type="homepage">https://github.com/storytold/photocraft</url>
<url type="bugtracker">https://github.com/storytold/photocraft/issues</url>
<url type="help">https://github.com/storytold/photocraft</url>
<url type="contact">https://discord.gg/artcraft</url>
<url type="contact">https://github.com/storytold/photocraft/issues</url>
<categories>
<category>Graphics</category>
<category>RasterGraphics</category>
+1 -1
View File
@@ -14,7 +14,7 @@ section: graphics
priority: optional
maintainer: ${PHOTOCRAFT_MAINTAINER}
vendor: Learning Machines LLC
homepage: https://getartcraft.com/apps/photocraft
homepage: https://github.com/storytold/photocraft
license: MIT OR Apache-2.0
description: |-
Open-source, native image editor with familiar, professional tools.
+26 -1
View File
@@ -6,6 +6,7 @@
Produces, in $env:DIST (default: dist/release):
photocraft-<version>-windows-<arch>.msi per-machine installer (WiX v5)
photocraft-<version>-windows-<arch>-portable.zip photocraft.exe + photocraft-cli.exe + portable.txt
photocraft-cli-<version>-windows-<arch>.zip photocraft-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
@@ -57,6 +58,17 @@ if (-not $env:PHOTOCRAFT_BUILD_DATE) { $env:PHOTOCRAFT_BUILD_DATE = (Get-Date).T
Write-Output "PhotoCraft $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'
@@ -170,6 +182,19 @@ $Zip = Join-Path $Dist "photocraft-$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\photocraft-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 'photocraft-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 "photocraft-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()
@@ -178,4 +203,4 @@ if ($Arch -ne 'arm64' -or $HostArch -eq 'arm64') {
} else {
Write-Output "skipping photocraft-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
+3 -3
View File
@@ -35,9 +35,9 @@
.exe need an .exe icon identifier (ICE50), even when the source is an ICO. -->
<Icon Id="PhotocraftIcon.exe" SourceFile="$(var.IconPath)" />
<Property Id="ARPPRODUCTICON" Value="PhotocraftIcon.exe" />
<Property Id="ARPURLINFOABOUT" Value="https://getartcraft.com/apps/photocraft" />
<Property Id="ARPURLUPDATEINFO" Value="https://getartcraft.com/apps/photocraft" />
<Property Id="ARPHELPLINK" Value="https://discord.gg/artcraft" />
<Property Id="ARPURLINFOABOUT" Value="https://github.com/storytold/photocraft" />
<Property Id="ARPURLUPDATEINFO" Value="https://github.com/storytold/photocraft" />
<Property Id="ARPHELPLINK" Value="https://github.com/storytold/photocraft/issues" />
<StandardDirectory Id="ProgramFiles6432Folder">
<Directory Id="INSTALLFOLDER" Name="PhotoCraft" />
Submodule tools/craft-skills added at 75d3184e73