diff --git a/.debrand b/.debrand new file mode 100644 index 00000000..f3b4212c --- /dev/null +++ b/.debrand @@ -0,0 +1,24 @@ +# Strip upstream (ArtCraft / Discord) branding. Run: perl tools/craft-skills/skills/debrand/debrand.pl . (--check in CI) +delete docs/brand +# MIT/Apache texts stay verbatim. The copyright holder line stays everywhere (legal requirement). +keep ^(LICENSE-(MIT|APACHE)|\.debrand)$ +dropline ^ATTRIBUTION\.md$ :: \|\s*`docs/brand/ +sub (?s)\nThe ArtCraft name, wordmark and logos in docs/brand/.*?LICENSE-brand\.txt\.\n => +sub drawn in ArtCraft, vectorised => drawn by hand, vectorised +sub drawing by the project owner in ArtCraft\) => drawing by the project owner) +sub made for this project by the project owner in ArtCraft, then => made for this project by the project owner by hand, then +sub the project owner drew it in ArtCraft => the project owner drew it by hand +sub owner's ArtCraft unicorn drawing => owner's unicorn drawing +sub The owner's ArtCraft drawing => The owner's drawing +sub https://getartcraft\.com/apps/effectcraft => https://github.com/storytold/effectcraft +sub https://discord\.gg/artcraft => https://github.com/storytold/effectcraft/issues +sub https://getartcraft\.com => https://example.com +sub \[Discord\]\(https://github\.com/storytold/effectcraft/issues\) and in\nGitHub issues => GitHub issues +sub Come tell us what matters most to you on \[Discord\]\(https://github\.com/storytold/effectcraft/issues\)\. => Tell us what matters most to you in [GitHub issues](https://github.com/storytold/effectcraft/issues). +sub links \(Help menu, Discord, Settings\) => links (Help menu, Settings) +sub the Discord and other links do nothing => the links do nothing +sub \(6 October, on Discord\) => (6 October) +sub the Tools bar and About dialog carry the ArtCraft mark => the Tools bar and About dialog carry the app mark +forbid (?i)artcraft(?! Team and the EffectCraft contributors) +forbid (?i)discord +sub ffmpeg export, Discord presence, => ffmpeg export, diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000..47fd3c68 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "tools/craft-skills"] + path = tools/craft-skills + url = https://git.marcospaulo.dev.br/storytold/craft-skills.git diff --git a/AGENTS.md b/AGENTS.md index aad29c94..68f4c083 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -76,12 +76,6 @@ reproduce an image (for example, point lists traced from someone else's icon). `crates/engine/src/demo.rs`, generators in `crates/effects`) are original work under the project licence and are listed in `ATTRIBUTION.md`. 7. **When in doubt, leave it out** and draw or generate it yourself. -8. **The one exception: first-party ArtCraft brand marks.** The ArtCraft name and logos in `docs/brand/` - are trademarks of the ArtCraft Team, not open source, usable only unmodified and only in the context of - EffectCraft under `docs/brand/LICENSE-brand.txt` (forks and modified versions must remove them). They still - need a sidecar and an `ATTRIBUTION.md` row (licence `LicenseRef-ArtCraft-Trademark`). No other - non-open asset is allowed, and this exception never covers third-party marks (Adobe, Discord, GitHub - and other logos stay out; draw a generic icon instead). ## 2. Clean-room code diff --git a/ATTRIBUTION.md b/ATTRIBUTION.md index ac20cd7c..c615460a 100644 --- a/ATTRIBUTION.md +++ b/ATTRIBUTION.md @@ -18,21 +18,21 @@ iconography, images or other Adobe assets; open licences only; every asset attri | `assets/fonts/JetBrainsMono-Regular.ttf` | The JetBrains Mono Project Authors | https://github.com/JetBrains/JetBrainsMono | OFL-1.1 (`assets/fonts/OFL-JetBrainsMono.txt`) | | `apps/effectcraft-web/web/favicon.svg` | EffectCraft contributors | Original work: web app icon, a copy of `assets/app-icon/effectcraft-small.svg` (the unicorn app icon) | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | | `packaging/macos/dmg/background.svg` | @XusBadia | Original work: macOS DMG Finder window background, derived from the EffectCraft app icon (`assets/app-icon/effectcraft.svg`); rendered to a TIFF by `packaging/macos/package.sh` at package time | MIT OR Apache-2.0 (`LICENSE-MIT`, `LICENSE-APACHE`) | -| `assets/app-icon/effectcraft-1024.png` | EffectCraft contributors | Original work: effectCraft app icon, 1024 px (owner's ArtCraft unicorn drawing, vectorised) | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | -| `assets/app-icon/effectcraft-macos-512.png` | EffectCraft contributors | Original work: effectCraft runtime Dock icon (macOS) (owner's ArtCraft unicorn drawing, vectorised) | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | -| `assets/app-icon/effectcraft-small.svg` | EffectCraft contributors | Original work: effectCraft app icon, light vector (owner's ArtCraft unicorn drawing, vectorised) | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | -| `assets/app-icon/effectcraft.icns` | EffectCraft contributors | Original work: effectCraft macOS app icon (owner's ArtCraft unicorn drawing, vectorised) | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | -| `assets/app-icon/effectcraft.ico` | EffectCraft contributors | Original work: effectCraft Windows app icon (owner's ArtCraft unicorn drawing, vectorised) | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | -| `assets/app-icon/effectcraft.svg` | EffectCraft contributors | Original work: effectCraft app icon, master vector (owner's ArtCraft unicorn drawing, vectorised) | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | -| `assets/app-icon/hicolor/128x128/apps/ai.storyteller.effectcraft.png` | EffectCraft contributors | Original work: effectCraft app icon, Linux hicolor 128x128 (owner's ArtCraft unicorn drawing, vectorised) | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | -| `assets/app-icon/hicolor/16x16/apps/ai.storyteller.effectcraft.png` | EffectCraft contributors | Original work: effectCraft app icon, Linux hicolor 16x16 (owner's ArtCraft unicorn drawing, vectorised) | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | -| `assets/app-icon/hicolor/24x24/apps/ai.storyteller.effectcraft.png` | EffectCraft contributors | Original work: effectCraft app icon, Linux hicolor 24x24 (owner's ArtCraft unicorn drawing, vectorised) | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | -| `assets/app-icon/hicolor/256x256/apps/ai.storyteller.effectcraft.png` | EffectCraft contributors | Original work: effectCraft app icon, Linux hicolor 256x256 (owner's ArtCraft unicorn drawing, vectorised) | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | -| `assets/app-icon/hicolor/32x32/apps/ai.storyteller.effectcraft.png` | EffectCraft contributors | Original work: effectCraft app icon, Linux hicolor 32x32 (owner's ArtCraft unicorn drawing, vectorised) | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | -| `assets/app-icon/hicolor/48x48/apps/ai.storyteller.effectcraft.png` | EffectCraft contributors | Original work: effectCraft app icon, Linux hicolor 48x48 (owner's ArtCraft unicorn drawing, vectorised) | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | -| `assets/app-icon/hicolor/512x512/apps/ai.storyteller.effectcraft.png` | EffectCraft contributors | Original work: effectCraft app icon, Linux hicolor 512x512 (owner's ArtCraft unicorn drawing, vectorised) | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | -| `assets/app-icon/hicolor/64x64/apps/ai.storyteller.effectcraft.png` | EffectCraft contributors | Original work: effectCraft app icon, Linux hicolor 64x64 (owner's ArtCraft unicorn drawing, vectorised) | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | -| `assets/app-icon/hicolor/scalable/apps/ai.storyteller.effectcraft.svg` | EffectCraft contributors | Original work: effectCraft app icon, Linux hicolor scalable (owner's ArtCraft unicorn drawing, vectorised) | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | +| `assets/app-icon/effectcraft-1024.png` | EffectCraft contributors | Original work: effectCraft app icon, 1024 px (owner's unicorn drawing, vectorised) | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | +| `assets/app-icon/effectcraft-macos-512.png` | EffectCraft contributors | Original work: effectCraft runtime Dock icon (macOS) (owner's unicorn drawing, vectorised) | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | +| `assets/app-icon/effectcraft-small.svg` | EffectCraft contributors | Original work: effectCraft app icon, light vector (owner's unicorn drawing, vectorised) | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | +| `assets/app-icon/effectcraft.icns` | EffectCraft contributors | Original work: effectCraft macOS app icon (owner's unicorn drawing, vectorised) | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | +| `assets/app-icon/effectcraft.ico` | EffectCraft contributors | Original work: effectCraft Windows app icon (owner's unicorn drawing, vectorised) | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | +| `assets/app-icon/effectcraft.svg` | EffectCraft contributors | Original work: effectCraft app icon, master vector (owner's unicorn drawing, vectorised) | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | +| `assets/app-icon/hicolor/128x128/apps/ai.storyteller.effectcraft.png` | EffectCraft contributors | Original work: effectCraft app icon, Linux hicolor 128x128 (owner's unicorn drawing, vectorised) | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | +| `assets/app-icon/hicolor/16x16/apps/ai.storyteller.effectcraft.png` | EffectCraft contributors | Original work: effectCraft app icon, Linux hicolor 16x16 (owner's unicorn drawing, vectorised) | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | +| `assets/app-icon/hicolor/24x24/apps/ai.storyteller.effectcraft.png` | EffectCraft contributors | Original work: effectCraft app icon, Linux hicolor 24x24 (owner's unicorn drawing, vectorised) | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | +| `assets/app-icon/hicolor/256x256/apps/ai.storyteller.effectcraft.png` | EffectCraft contributors | Original work: effectCraft app icon, Linux hicolor 256x256 (owner's unicorn drawing, vectorised) | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | +| `assets/app-icon/hicolor/32x32/apps/ai.storyteller.effectcraft.png` | EffectCraft contributors | Original work: effectCraft app icon, Linux hicolor 32x32 (owner's unicorn drawing, vectorised) | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | +| `assets/app-icon/hicolor/48x48/apps/ai.storyteller.effectcraft.png` | EffectCraft contributors | Original work: effectCraft app icon, Linux hicolor 48x48 (owner's unicorn drawing, vectorised) | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | +| `assets/app-icon/hicolor/512x512/apps/ai.storyteller.effectcraft.png` | EffectCraft contributors | Original work: effectCraft app icon, Linux hicolor 512x512 (owner's unicorn drawing, vectorised) | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | +| `assets/app-icon/hicolor/64x64/apps/ai.storyteller.effectcraft.png` | EffectCraft contributors | Original work: effectCraft app icon, Linux hicolor 64x64 (owner's unicorn drawing, vectorised) | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | +| `assets/app-icon/hicolor/scalable/apps/ai.storyteller.effectcraft.svg` | EffectCraft contributors | Original work: effectCraft app icon, Linux hicolor scalable (owner's unicorn drawing, vectorised) | MIT OR Apache-2.0 (`assets/app-icon/LICENSE.txt`) | | `crates/lottie/tests/fixtures/bouncing-ball.json` | EffectCraft contributors | Original work: hand-written Lottie test fixture (bouncing ball, eased position keys) | MIT OR Apache-2.0 | | `crates/lottie/tests/fixtures/shapes-gradient.json` | EffectCraft contributors | Original work: hand-written Lottie test fixture (star, rectangle, gradient fill, dashed stroke, trim paths) | MIT OR Apache-2.0 | | `crates/lottie/tests/fixtures/precomp-matte-text.json` | EffectCraft contributors | Original work: hand-written Lottie test fixture (precomp, track matte, parented text) | MIT OR Apache-2.0 | @@ -103,22 +103,4 @@ configuration from these Apache-2.0 projects: - `crates/segment/src/mobilesam.rs` follows the MobileSAM, TinyViT and Segment Anything architectures and their Apache-2.0 reference code. -## First-party brand marks - -The ArtCraft name, wordmark and logos are trademarks of the ArtCraft Team. They are not open source and are not -covered by the project licence; they may be used only unmodified and only as part of this repository and EffectCraft, -under [`docs/brand/LICENSE-brand.txt`](docs/brand/LICENSE-brand.txt). Forks and modified versions must remove them -(AGENTS.md §1.8). - -| File | Author | Source | Licence | -|---|---|---|---| -| `docs/brand/artcraft-logo-white.png` | ArtCraft Team | Original work: first-party ArtCraft brand mark (ArtCraft wordmark, light ink for dark backgrounds) | ArtCraft brand terms, not open source (`docs/brand/LICENSE-brand.txt`) | -| `docs/brand/artcraft-logo-white.svg` | ArtCraft Team | Original work: first-party ArtCraft brand mark (ArtCraft wordmark, light ink for dark backgrounds) | ArtCraft brand terms, not open source (`docs/brand/LICENSE-brand.txt`) | -| `docs/brand/artcraft-logo.png` | ArtCraft Team | Original work: first-party ArtCraft brand mark (ArtCraft wordmark (symbol + "ARTCRAFT"), dark ink for light backgrounds) | ArtCraft brand terms, not open source (`docs/brand/LICENSE-brand.txt`) | -| `docs/brand/artcraft-logo.svg` | ArtCraft Team | Original work: first-party ArtCraft brand mark (ArtCraft wordmark (symbol + "ARTCRAFT"), dark ink for light backgrounds) | ArtCraft brand terms, not open source (`docs/brand/LICENSE-brand.txt`) | -| `docs/brand/artcraft-mark-black.png` | ArtCraft Team | Original work: first-party ArtCraft brand mark (ArtCraft symbol ("A" mark), black) | ArtCraft brand terms, not open source (`docs/brand/LICENSE-brand.txt`) | -| `docs/brand/artcraft-mark-black.svg` | ArtCraft Team | Original work: first-party ArtCraft brand mark (ArtCraft symbol ("A" mark), black) | ArtCraft brand terms, not open source (`docs/brand/LICENSE-brand.txt`) | -| `docs/brand/artcraft-mark.png` | ArtCraft Team | Original work: first-party ArtCraft brand mark (ArtCraft symbol ("A" mark), blue) | ArtCraft brand terms, not open source (`docs/brand/LICENSE-brand.txt`) | -| `docs/brand/artcraft-mark.svg` | ArtCraft Team | Original work: first-party ArtCraft brand mark (ArtCraft symbol ("A" mark), blue) | ArtCraft brand terms, not open source (`docs/brand/LICENSE-brand.txt`) | - - Appearance theme previews, drawn procedurally from original shapes: `crates/ui-egui/src/panels/settings.rs` (original work, MIT OR Apache-2.0). diff --git a/CLAUDE.md b/CLAUDE.md index a7c47fe3..02eff3b4 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -19,7 +19,7 @@ EffectCraft is a clean-room, open-source, pure-Rust motion graphics and visual e - **Property tree:** everything animatable is a `Property` in the layer's `PropGroup` tree, addressed by paths (`transform/position`, `effects/#1/blurriness`, `@uid`). - **Everything is a command** (`crates/engine`): id, label, menu path, shortcut, params, enabled(), run(). UI, CLI, control channel and MCP dispatch by id. - **Everything is agent-drivable:** every interactive widget registers an automation id; UI state is serde. -- **Community links** (Help menu, About, header Discord button): https://discord.gg/artcraft, https://getartcraft.com, https://getartcraft.com/apps/effectcraft, https://github.com/storytold/effectcraft. +- **Project links** (Help menu, About): https://github.com/storytold/effectcraft. - **Quality gates** before every commit: `cargo xtask ci` (fmt, clippy -D warnings, tests, layers, assets, wasm). - **Commits:** one task id per commit (`M6.3: trim paths`). Only green states. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index dfa28c9f..f0fccada 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -42,5 +42,4 @@ cargo xtask ci # what every commit must pass ## Talk to us -Questions, ideas and bug reports are welcome on [Discord](https://discord.gg/artcraft) and in -GitHub issues. +Questions, ideas and bug reports are welcome on GitHub issues. diff --git a/NOTICE b/NOTICE index 65ce4c42..e7fd1983 100644 --- a/NOTICE +++ b/NOTICE @@ -3,10 +3,6 @@ Copyright (c) 2026 ArtCraft Team and the EffectCraft 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 diff --git a/README.md b/README.md index 914a4090..ab6c0ca4 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,3 @@ -

- - - - ArtCraft - - -

- -

EffectCraft

@@ -26,26 +16,12 @@ License: MIT OR Apache-2.0

-

- Join the ArtCraft community on Discord -

- -

- EffectCraft on getartcraft.com · - ArtCraft · - All Crafting Apps -

-

EffectCraft's main window: the animated demo composition in the Composition panel, the Project panel, a Timeline with text, shape and solid layers, and the Properties panel showing the selected text layer's transform, font and paragraph settings

-> [!NOTE] -> **ArtCraft is a community of artists from all walks of life.** Digital, generative, music, -> games — if you make things, you're one of us. **[Come say hi on Discord](https://discord.gg/artcraft).** -

What it is · Animate · @@ -254,7 +230,7 @@ send us right now. ## Downloads -**New to EffectCraft?** Download it from the [EffectCraft page on getartcraft.com](https://getartcraft.com/apps/effectcraft). That's the easiest way to install it. +**New to EffectCraft?** Download it from the [latest release](https://github.com/storytold/effectcraft/releases/latest). That's the easiest way to install it. **Want a specific build or format?** On GitHub, the [latest release](https://github.com/storytold/effectcraft/releases/latest) has every build listed below, and [all releases](https://github.com/storytold/effectcraft/releases) has earlier versions and their notes. `` in the file names is the version number, and `SHA256SUMS.txt` lists a checksum for every file. @@ -317,43 +293,18 @@ File ▸ Import fallback instead. ## The Crafting Apps -EffectCraft 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 +EffectCraft is one of the **Crafting Apps**: free, open-source creative tools, each written from scratch in Rust and each able to stand on its own. -| | App | What it's for | Code | Learn more | -|:-:|---|---|---|---| -| | **PhotoCraft** | Image editing: layers, masks, type and real PSD files | [GitHub](https://github.com/storytold/photocraft) | [Website](https://getartcraft.com/apps/photocraft) | -| | **VectorCraft** | Vector illustration | [GitHub](https://github.com/storytold/vectorcraft) | [Website](https://getartcraft.com/apps/vectorcraft) | -| | **FilmCraft** | Video editing, color and sound | [GitHub](https://github.com/storytold/filmcraft) | [Website](https://getartcraft.com/apps/filmcraft) | -| | **LightCraft** | Photo library and raw development | [GitHub](https://github.com/storytold/lightcraft) | [Website](https://getartcraft.com/apps/lightcraft) | -| | **PdfCraft** | Reading, organizing and protecting PDFs | [GitHub](https://github.com/storytold/pdfcraft) | [Website](https://getartcraft.com/apps/pdfcraft) | -| | **EffectCraft** | **Motion graphics and visual effects · you are here** | [GitHub](https://github.com/storytold/effectcraft) | [Website](https://getartcraft.com/apps/effectcraft) | -| | **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. - -
- -

- Join the ArtCraft community on Discord -

- -

Come make things with us

- -

- 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. -

- -

- discord.gg/artcraft · - getartcraft.com · - The Crafting Apps · - EffectCraft -

+| | App | What it's for | Code | +|:-:|---|---|---| +| | **PhotoCraft** | Image editing: layers, masks, type and real PSD files | [GitHub](https://github.com/storytold/photocraft) | +| | **VectorCraft** | Vector illustration | [GitHub](https://github.com/storytold/vectorcraft) | +| | **FilmCraft** | Video editing, color and sound | [GitHub](https://github.com/storytold/filmcraft) | +| | **LightCraft** | Photo library and raw development | [GitHub](https://github.com/storytold/lightcraft) | +| | **PdfCraft** | Reading, organizing and protecting PDFs | [GitHub](https://github.com/storytold/pdfcraft) | +| | **EffectCraft** | **Motion graphics and visual effects · you are here** | [GitHub](https://github.com/storytold/effectcraft) | +| | **DesignCraft** | Page layout and publishing | [GitHub](https://github.com/storytold/designcraft) | ## License and credits @@ -363,18 +314,8 @@ Copyright (c) 2026 ArtCraft Team and the EffectCraft contributors. Required noti Bundled fonts, icons, images and other assets keep their own open licenses; each one is listed with its author, source and license in [ATTRIBUTION.md](ATTRIBUTION.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 EffectCraft, under [`docs/brand/LICENSE-brand.txt`](docs/brand/LICENSE-brand.txt). -Forks and modified versions must remove them. - 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. EffectCraft 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. -

- ArtCraft
- Made by the ArtCraft team and community. -

- ## Star history [![Star History Chart](https://api.star-history.com/svg?repos=storytold/effectcraft&type=Date&legend=top-left)](https://www.star-history.com/?repos=storytold%2Feffectcraft&type=date&legend=top-left) diff --git a/ROADMAP.md b/ROADMAP.md index 72240b5b..2778f0f2 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -113,7 +113,7 @@ Ranked; detail in [docs/roadmap.md](docs/roadmap.md) and [docs/gaps.md](docs/gap | 5 | Performance: benchmarks at 1080p / 4K, real-time cached playback, hardware video (G5) | 50–100 | | 6 | Localization depth: effect names, all panels, French / German / Korean (G9) | 60–110 | -Come tell us what matters most to you on [Discord](https://discord.gg/artcraft). +Tell us what matters most to you in [GitHub issues](https://github.com/storytold/effectcraft/issues). ## Progress log diff --git a/apps/effectcraft-web/web/favicon.svg.attribution b/apps/effectcraft-web/web/favicon.svg.attribution index e723699a..a64b5125 100644 --- a/apps/effectcraft-web/web/favicon.svg.attribution +++ b/apps/effectcraft-web/web/favicon.svg.attribution @@ -1,6 +1,6 @@ asset: favicon.svg title: EffectCraft web app icon (favicon) -author: EffectCraft contributors (drawing by the project owner in ArtCraft) +author: EffectCraft contributors (drawing by the project owner) source: original work license: MIT OR Apache-2.0 license-file: assets/app-icon/LICENSE.txt diff --git a/apps/effectcraft/Cargo.toml b/apps/effectcraft/Cargo.toml index 5ad6c80d..cf0c644d 100644 --- a/apps/effectcraft/Cargo.toml +++ b/apps/effectcraft/Cargo.toml @@ -14,7 +14,7 @@ effectcraft-engine = { workspace = true } effectcraft-host = { workspace = true } effectcraft-ui-egui = { workspace = true } egui = { workspace = true } -# `links`: links (Help menu, Discord, Settings) open in the system browser. +# `links`: links (Help menu, Settings) open in the system browser. eframe = { workspace = true, features = ["default_fonts", "wgpu", "accesskit", "links", "wayland", "x11"] } serde = { workspace = true } serde_json = { workspace = true } diff --git a/assets/app-icon/LICENSE.txt b/assets/app-icon/LICENSE.txt index 5fdd611e..f35687be 100644 --- a/assets/app-icon/LICENSE.txt +++ b/assets/app-icon/LICENSE.txt @@ -2,7 +2,7 @@ EffectCraft app icon (effectcraft.svg, effectcraft-small.svg and every file deri this directory: effectcraft-1024.png, effectcraft-macos-512.png, effectcraft.icns, effectcraft.ico, hicolor/), and the web favicon apps/effectcraft-web/web/favicon.svg. -Original artwork made for this project by the project owner in ArtCraft, then vectorised (no +Original artwork made for this project by the project owner by hand, then vectorised (no third-party material). Licensed like the rest of EffectCraft, under either of * Apache License, Version 2.0 (https://www.apache.org/licenses/LICENSE-2.0) diff --git a/assets/app-icon/README.md b/assets/app-icon/README.md index 814ad601..75c3cc52 100644 --- a/assets/app-icon/README.md +++ b/assets/app-icon/README.md @@ -15,7 +15,7 @@ full-bleed colour field, tight head-and-shoulders crop, the body running off the | Paper | `#efe9dc` | the figure | | Ink | `#0b0b0c` | line work and contour | -**Provenance:** the project owner drew it in ArtCraft (a 2880 px engraving-style image, kept in +**Provenance:** the project owner drew it by hand (a 2880 px engraving-style image, kept in craftrules at `assets/app-icons/effectcraft/source.png`). It was vectorised with craftrules `assets/logo-options/_tools/vectorize_tile.py`, which keys out the field and traces the ink with potrace. Licence: see [LICENSE.txt](LICENSE.txt) (MIT OR Apache-2.0, like the repo). diff --git a/assets/app-icon/effectcraft-1024.png.attribution b/assets/app-icon/effectcraft-1024.png.attribution index 1793aa51..18b9f5ab 100644 --- a/assets/app-icon/effectcraft-1024.png.attribution +++ b/assets/app-icon/effectcraft-1024.png.attribution @@ -1,6 +1,6 @@ asset: effectcraft-1024.png title: EffectCraft app icon, 1024 px -author: EffectCraft contributors (drawing by the project owner in ArtCraft) +author: EffectCraft contributors (drawing by the project owner) source: original work license: MIT OR Apache-2.0 license-file: assets/app-icon/LICENSE.txt diff --git a/assets/app-icon/effectcraft-macos-512.png.attribution b/assets/app-icon/effectcraft-macos-512.png.attribution index 7bfafd11..697f2d4d 100644 --- a/assets/app-icon/effectcraft-macos-512.png.attribution +++ b/assets/app-icon/effectcraft-macos-512.png.attribution @@ -1,6 +1,6 @@ asset: effectcraft-macos-512.png title: EffectCraft runtime Dock icon (macOS) -author: EffectCraft contributors (drawing by the project owner in ArtCraft) +author: EffectCraft contributors (drawing by the project owner) source: original work license: MIT OR Apache-2.0 license-file: assets/app-icon/LICENSE.txt diff --git a/assets/app-icon/effectcraft-small.svg.attribution b/assets/app-icon/effectcraft-small.svg.attribution index 6dbaab16..f14b398a 100644 --- a/assets/app-icon/effectcraft-small.svg.attribution +++ b/assets/app-icon/effectcraft-small.svg.attribution @@ -1,6 +1,6 @@ asset: effectcraft-small.svg title: EffectCraft app icon, light vector -author: EffectCraft contributors (drawing by the project owner in ArtCraft) +author: EffectCraft contributors (drawing by the project owner) source: original work license: MIT OR Apache-2.0 license-file: assets/app-icon/LICENSE.txt diff --git a/assets/app-icon/effectcraft.icns.attribution b/assets/app-icon/effectcraft.icns.attribution index d338c26f..9ba83ff8 100644 --- a/assets/app-icon/effectcraft.icns.attribution +++ b/assets/app-icon/effectcraft.icns.attribution @@ -1,6 +1,6 @@ asset: effectcraft.icns title: EffectCraft macOS app icon -author: EffectCraft contributors (drawing by the project owner in ArtCraft) +author: EffectCraft contributors (drawing by the project owner) source: original work license: MIT OR Apache-2.0 license-file: assets/app-icon/LICENSE.txt diff --git a/assets/app-icon/effectcraft.ico.attribution b/assets/app-icon/effectcraft.ico.attribution index 25a7faa1..2f5029e3 100644 --- a/assets/app-icon/effectcraft.ico.attribution +++ b/assets/app-icon/effectcraft.ico.attribution @@ -1,6 +1,6 @@ asset: effectcraft.ico title: EffectCraft Windows app icon -author: EffectCraft contributors (drawing by the project owner in ArtCraft) +author: EffectCraft contributors (drawing by the project owner) source: original work license: MIT OR Apache-2.0 license-file: assets/app-icon/LICENSE.txt diff --git a/assets/app-icon/effectcraft.svg.attribution b/assets/app-icon/effectcraft.svg.attribution index 21960623..8704feab 100644 --- a/assets/app-icon/effectcraft.svg.attribution +++ b/assets/app-icon/effectcraft.svg.attribution @@ -1,8 +1,8 @@ asset: effectcraft.svg title: EffectCraft app icon, master vector -author: EffectCraft contributors (drawing by the project owner in ArtCraft) +author: EffectCraft contributors (drawing by the project owner) source: original work license: MIT OR Apache-2.0 license-file: assets/app-icon/LICENSE.txt added: 2026-10-02 by EffectCraft contributors (Claude agent, app icon) -notes: The owner's ArtCraft drawing of an engraved unicorn bust, vectorised at 2048 px with craftrules assets/logo-options/_tools/vectorize_tile.py (potrace; three colours). Canonical artwork; the other icon files derive from it. +notes: The owner's drawing of an engraved unicorn bust, vectorised at 2048 px with craftrules assets/logo-options/_tools/vectorize_tile.py (potrace; three colours). Canonical artwork; the other icon files derive from it. diff --git a/assets/app-icon/hicolor/128x128/apps/ai.storyteller.effectcraft.png.attribution b/assets/app-icon/hicolor/128x128/apps/ai.storyteller.effectcraft.png.attribution index 36847426..736b0718 100644 --- a/assets/app-icon/hicolor/128x128/apps/ai.storyteller.effectcraft.png.attribution +++ b/assets/app-icon/hicolor/128x128/apps/ai.storyteller.effectcraft.png.attribution @@ -1,6 +1,6 @@ asset: ai.storyteller.effectcraft.png title: EffectCraft app icon, Linux hicolor 128x128 -author: EffectCraft contributors (drawing by the project owner in ArtCraft) +author: EffectCraft contributors (drawing by the project owner) source: original work license: MIT OR Apache-2.0 license-file: assets/app-icon/LICENSE.txt diff --git a/assets/app-icon/hicolor/16x16/apps/ai.storyteller.effectcraft.png.attribution b/assets/app-icon/hicolor/16x16/apps/ai.storyteller.effectcraft.png.attribution index 943f87c1..cc162730 100644 --- a/assets/app-icon/hicolor/16x16/apps/ai.storyteller.effectcraft.png.attribution +++ b/assets/app-icon/hicolor/16x16/apps/ai.storyteller.effectcraft.png.attribution @@ -1,6 +1,6 @@ asset: ai.storyteller.effectcraft.png title: EffectCraft app icon, Linux hicolor 16x16 -author: EffectCraft contributors (drawing by the project owner in ArtCraft) +author: EffectCraft contributors (drawing by the project owner) source: original work license: MIT OR Apache-2.0 license-file: assets/app-icon/LICENSE.txt diff --git a/assets/app-icon/hicolor/24x24/apps/ai.storyteller.effectcraft.png.attribution b/assets/app-icon/hicolor/24x24/apps/ai.storyteller.effectcraft.png.attribution index 10347ea9..90877622 100644 --- a/assets/app-icon/hicolor/24x24/apps/ai.storyteller.effectcraft.png.attribution +++ b/assets/app-icon/hicolor/24x24/apps/ai.storyteller.effectcraft.png.attribution @@ -1,6 +1,6 @@ asset: ai.storyteller.effectcraft.png title: EffectCraft app icon, Linux hicolor 24x24 -author: EffectCraft contributors (drawing by the project owner in ArtCraft) +author: EffectCraft contributors (drawing by the project owner) source: original work license: MIT OR Apache-2.0 license-file: assets/app-icon/LICENSE.txt diff --git a/assets/app-icon/hicolor/256x256/apps/ai.storyteller.effectcraft.png.attribution b/assets/app-icon/hicolor/256x256/apps/ai.storyteller.effectcraft.png.attribution index 86dd6d76..ebf73d9f 100644 --- a/assets/app-icon/hicolor/256x256/apps/ai.storyteller.effectcraft.png.attribution +++ b/assets/app-icon/hicolor/256x256/apps/ai.storyteller.effectcraft.png.attribution @@ -1,6 +1,6 @@ asset: ai.storyteller.effectcraft.png title: EffectCraft app icon, Linux hicolor 256x256 -author: EffectCraft contributors (drawing by the project owner in ArtCraft) +author: EffectCraft contributors (drawing by the project owner) source: original work license: MIT OR Apache-2.0 license-file: assets/app-icon/LICENSE.txt diff --git a/assets/app-icon/hicolor/32x32/apps/ai.storyteller.effectcraft.png.attribution b/assets/app-icon/hicolor/32x32/apps/ai.storyteller.effectcraft.png.attribution index 06f910e8..a411657d 100644 --- a/assets/app-icon/hicolor/32x32/apps/ai.storyteller.effectcraft.png.attribution +++ b/assets/app-icon/hicolor/32x32/apps/ai.storyteller.effectcraft.png.attribution @@ -1,6 +1,6 @@ asset: ai.storyteller.effectcraft.png title: EffectCraft app icon, Linux hicolor 32x32 -author: EffectCraft contributors (drawing by the project owner in ArtCraft) +author: EffectCraft contributors (drawing by the project owner) source: original work license: MIT OR Apache-2.0 license-file: assets/app-icon/LICENSE.txt diff --git a/assets/app-icon/hicolor/48x48/apps/ai.storyteller.effectcraft.png.attribution b/assets/app-icon/hicolor/48x48/apps/ai.storyteller.effectcraft.png.attribution index 46fbd4d4..703a6ad6 100644 --- a/assets/app-icon/hicolor/48x48/apps/ai.storyteller.effectcraft.png.attribution +++ b/assets/app-icon/hicolor/48x48/apps/ai.storyteller.effectcraft.png.attribution @@ -1,6 +1,6 @@ asset: ai.storyteller.effectcraft.png title: EffectCraft app icon, Linux hicolor 48x48 -author: EffectCraft contributors (drawing by the project owner in ArtCraft) +author: EffectCraft contributors (drawing by the project owner) source: original work license: MIT OR Apache-2.0 license-file: assets/app-icon/LICENSE.txt diff --git a/assets/app-icon/hicolor/512x512/apps/ai.storyteller.effectcraft.png.attribution b/assets/app-icon/hicolor/512x512/apps/ai.storyteller.effectcraft.png.attribution index a08d1411..08a5b32f 100644 --- a/assets/app-icon/hicolor/512x512/apps/ai.storyteller.effectcraft.png.attribution +++ b/assets/app-icon/hicolor/512x512/apps/ai.storyteller.effectcraft.png.attribution @@ -1,6 +1,6 @@ asset: ai.storyteller.effectcraft.png title: EffectCraft app icon, Linux hicolor 512x512 -author: EffectCraft contributors (drawing by the project owner in ArtCraft) +author: EffectCraft contributors (drawing by the project owner) source: original work license: MIT OR Apache-2.0 license-file: assets/app-icon/LICENSE.txt diff --git a/assets/app-icon/hicolor/64x64/apps/ai.storyteller.effectcraft.png.attribution b/assets/app-icon/hicolor/64x64/apps/ai.storyteller.effectcraft.png.attribution index fcfe963c..7c3e6f2b 100644 --- a/assets/app-icon/hicolor/64x64/apps/ai.storyteller.effectcraft.png.attribution +++ b/assets/app-icon/hicolor/64x64/apps/ai.storyteller.effectcraft.png.attribution @@ -1,6 +1,6 @@ asset: ai.storyteller.effectcraft.png title: EffectCraft app icon, Linux hicolor 64x64 -author: EffectCraft contributors (drawing by the project owner in ArtCraft) +author: EffectCraft contributors (drawing by the project owner) source: original work license: MIT OR Apache-2.0 license-file: assets/app-icon/LICENSE.txt diff --git a/assets/app-icon/hicolor/scalable/apps/ai.storyteller.effectcraft.svg.attribution b/assets/app-icon/hicolor/scalable/apps/ai.storyteller.effectcraft.svg.attribution index 562c3506..acc0aaa0 100644 --- a/assets/app-icon/hicolor/scalable/apps/ai.storyteller.effectcraft.svg.attribution +++ b/assets/app-icon/hicolor/scalable/apps/ai.storyteller.effectcraft.svg.attribution @@ -1,6 +1,6 @@ asset: ai.storyteller.effectcraft.svg title: EffectCraft app icon, Linux hicolor scalable -author: EffectCraft contributors (drawing by the project owner in ArtCraft) +author: EffectCraft contributors (drawing by the project owner) source: original work license: MIT OR Apache-2.0 license-file: assets/app-icon/LICENSE.txt diff --git a/crates/engine/src/commands/help.rs b/crates/engine/src/commands/help.rs index c6f315f3..bc60a6a0 100644 --- a/crates/engine/src/commands/help.rs +++ b/crates/engine/src/commands/help.rs @@ -1,4 +1,4 @@ -//! Help menu: community and project links (the frontend opens `Event::OpenUrl`). +//! Help menu: project links (the frontend opens `Event::OpenUrl`). use serde_json::{Value, json}; @@ -11,11 +11,6 @@ fn open(s: &mut Session, url: String) -> Result { Ok(json!({"url": url})) } -fn sibling(s: &mut Session, p: &Value) -> Result { - let slug = str_p(p, "app").unwrap_or("photocraft").to_ascii_lowercase(); - if str_p(p, "kind") == Some("github") { open(s, links::github_of(&slug)) } else { open(s, links::page_of(&slug)) } -} - /// Help ▸ EffectCraft Help / Scripting Help / Expression Reference / Effect Reference. fn docs(s: &mut Session, p: &Value) -> Result { let page = match str_p(p, "page").unwrap_or("help") { @@ -31,25 +26,13 @@ fn docs(s: &mut Session, p: &Value) -> Result { pub fn specs() -> Vec { vec![ cmd!("help.docs", "EffectCraft Help...", [], Some("F1"), "{page?: help|scripting|expressions|effects|agents}", always, docs), - cmd!("help.discord", "Join the ArtCraft Discord...", ["Help"], None, "{}", always, |s, _| open(s, links::DISCORD.into())), - cmd!("help.website", "ArtCraft Website", ["Help"], None, "{}", always, |s, _| open(s, links::WEBSITE.into())), - cmd!("help.appPage", "EffectCraft Home Page", ["Help"], None, "{}", always, |s, _| open(s, links::APP_PAGE.into())), cmd!("help.github", "EffectCraft on GitHub", ["Help"], None, "{}", always, |s, _| open(s, links::GITHUB.into())), - cmd!("help.onlineTutorials", "Online Tutorials...", ["Help"], None, "{}", always, |s, _| open(s, links::APP_PAGE.into())), + cmd!("help.onlineTutorials", "Online Tutorials...", ["Help"], None, "{}", always, |s, _| open(s, links::GITHUB.into())), cmd!("help.inAppTutorials", "In-App Tutorials...", ["Help"], None, "{} → the Home screen's Learn tab", always, |s, p| super::frontend( s, "help.inAppTutorials", p )), cmd!("help.reportIssue", "Provide Feedback...", ["Help"], None, "{}", always, |s, _| open(s, links::ISSUES.into())), - cmd!( - "help.sibling", - "Other ArtCraft Apps", - [], - None, - "{app: photocraft|vectorcraft|filmcraft|lightcraft|pdfcraft|designcraft, kind?: page|github}", - always, - sibling - ), ] } diff --git a/crates/engine/src/links.rs b/crates/engine/src/links.rs index 0a0ad482..047e87bb 100644 --- a/crates/engine/src/links.rs +++ b/crates/engine/src/links.rs @@ -1,27 +1,6 @@ -//! Community and project links (shown in Help ▸, the About dialog, the start screen and the -//! header's Discord button). +//! Project links (shown in Help ▸, the About dialog and the start screen). pub const APP_NAME: &str = "EffectCraft"; pub const APP_SLUG: &str = "effectcraft"; -pub const DISCORD: &str = "https://discord.gg/artcraft"; -pub const WEBSITE: &str = "https://getartcraft.com"; -pub const APP_PAGE: &str = "https://getartcraft.com/apps/effectcraft"; pub const GITHUB: &str = "https://github.com/storytold/effectcraft"; pub const ISSUES: &str = "https://github.com/storytold/effectcraft/issues"; - -/// Sibling apps of the ArtCraft family: (name, what it is, GitHub repo, app page). -pub const SIBLINGS: &[(&str, &str)] = &[ - ("PhotoCraft", "photocraft"), - ("VectorCraft", "vectorcraft"), - ("FilmCraft", "filmcraft"), - ("LightCraft", "lightcraft"), - ("PdfCraft", "pdfcraft"), - ("DesignCraft", "designcraft"), -]; - -pub fn github_of(slug: &str) -> String { - format!("https://github.com/storytold/{slug}") -} -pub fn page_of(slug: &str) -> String { - format!("https://getartcraft.com/apps/{slug}") -} diff --git a/crates/engine/src/menus.rs b/crates/engine/src/menus.rs index bd1cffb0..5c439888 100644 --- a/crates/engine/src/menus.rs +++ b/crates/engine/src/menus.rs @@ -1230,11 +1230,8 @@ Help Enable Logging | help.enableLogging Reveal Logging File | help.revealLogFile --- - Join the ArtCraft Discord... | help.discord Provide Feedback... | help.reportIssue --- - ArtCraft Website | help.website - EffectCraft Home Page | help.appPage EffectCraft on GitHub | help.github Open Demo Project | file.openDemoProject [!mac] --- diff --git a/crates/engine/src/tests.rs b/crates/engine/src/tests.rs index 72133c5d..73200fc4 100644 --- a/crates/engine/src/tests.rs +++ b/crates/engine/src/tests.rs @@ -379,9 +379,8 @@ fn save_and_open_roundtrip() { #[test] fn help_links_emit_urls() { let mut s = Session::default(); - let r = s.execute("help.discord", json!({})).unwrap(); - assert_eq!(r["url"], "https://discord.gg/artcraft"); - assert!(s.drain_events().iter().any(|e| matches!(e, crate::Event::OpenUrl(u) if u.contains("discord")))); + s.execute("help.github", json!({})).unwrap(); + assert!(s.drain_events().iter().any(|e| matches!(e, crate::Event::OpenUrl(u) if u.contains("github")))); assert_eq!(s.execute("help.github", json!({})).unwrap()["url"], "https://github.com/storytold/effectcraft"); } diff --git a/crates/engine/src/tests_m137.rs b/crates/engine/src/tests_m137.rs index 13abe9c6..05aef5bd 100644 --- a/crates/engine/src/tests_m137.rs +++ b/crates/engine/src/tests_m137.rs @@ -74,7 +74,7 @@ fn help_tutorials() { s.execute("help.onlineTutorials", json!({})).unwrap(); s.execute("help.inAppTutorials", json!({})).unwrap(); let ev = s.drain_events(); - assert!(ev.iter().any(|e| matches!(e, Event::OpenUrl(u) if u == crate::links::APP_PAGE))); + assert!(ev.iter().any(|e| matches!(e, Event::OpenUrl(u) if u == crate::links::GITHUB))); assert!(ev.iter().any(|e| matches!(e, Event::Frontend { command, .. } if command == "help.inAppTutorials"))); } diff --git a/crates/engine/src/tests_markers.rs b/crates/engine/src/tests_markers.rs index 6673241d..98541e96 100644 --- a/crates/engine/src/tests_markers.rs +++ b/crates/engine/src/tests_markers.rs @@ -13,7 +13,7 @@ fn comp_marker_dialog_fields_and_undo() { let r = s .execute( "markers.set", - json!({"index": 0, "time": 1.51, "duration": 0.5, "comment": "Intro", "chapter": "One", "url": "https://getartcraft.com", "frameTarget": "_blank", + json!({"index": 0, "time": 1.51, "duration": 0.5, "comment": "Intro", "chapter": "One", "url": "https://example.com", "frameTarget": "_blank", "cuePoint": {"name": "cue", "navigation": true, "params": [["k", "v"]]}, "protected": true, "label": "Aqua"}), ) .unwrap(); @@ -25,7 +25,7 @@ fn comp_marker_dialog_fields_and_undo() { assert!((m["duration"].as_f64().unwrap() - 0.5).abs() < 1e-9); assert_eq!(m["comment"], "Intro"); assert_eq!(m["chapter"], "One"); - assert_eq!(m["url"], "https://getartcraft.com"); + assert_eq!(m["url"], "https://example.com"); assert_eq!(m["frameTarget"], "_blank"); assert_eq!(m["cuePoint"]["name"], "cue"); assert_eq!(m["cuePoint"]["navigation"], true); diff --git a/crates/ui-egui/src/header.rs b/crates/ui-egui/src/header.rs index fb381cfd..b989b3db 100644 --- a/crates/ui-egui/src/header.rs +++ b/crates/ui-egui/src/header.rs @@ -1,11 +1,11 @@ -//! The Tools bar: home, the tool slots, tool options, snapping, workspaces and the community -//! buttons (Discord is always one click away). +//! The Tools bar: home, the tool slots, tool options, snapping, workspaces and the project +//! buttons. use crate::i18n::{tr, tr_args}; use egui::{Align2, Color32, Rect, Sense, Stroke, StrokeKind, pos2, vec2}; use serde_json::json; -use crate::icons::{self, Icon}; +use crate::icons::Icon; use crate::state::Tool; use crate::theme::Tokens; use crate::widgets; @@ -182,32 +182,15 @@ pub fn show(app: &mut EffectcraftApp, ui: &mut egui::Ui, rect: Rect) { let label = p.text(pos2(snap.max.x + 4.0, cy), Align2::LEFT_CENTER, tr("Snapping"), Tokens::ui(12.0), t.text_dim); snapping_options(app, ui, Rect::from_min_size(pos2(label.max.x + 2.0, cy - 9.0), vec2(18.0, 18.0))); - // Right side: community buttons, workspaces. + // Right side: project buttons, workspaces. let mut rx = rect.max.x - 10.0; - // The pill fits its label (icon, gap, text) with even padding: it was a fixed 104 px with the - // text at its left, which left a wide gap on the right (#581). - let label = p.layout_no_wrap(tr("Discord").to_string(), Tokens::semibold(12.0), Color32::WHITE); - let discord = Rect::from_min_max(pos2(rx - (10.0 + 14.0 + 6.0 + label.size().x + 12.0), cy - 13.0), pos2(rx, cy + 13.0)); - let dresp = ui.interact(discord, egui::Id::new("hdr-discord"), Sense::click()); - let dc = Color32::from_rgb(0x58, 0x65, 0xf2); - p.rect_filled(discord, 13.0, if dresp.hovered() { dc.gamma_multiply(1.2) } else { dc }); - icons::paint(&p, Rect::from_center_size(pos2(discord.min.x + 17.0, cy), vec2(14.0, 14.0)), Icon::Chat, Color32::WHITE); - p.galley(pos2(discord.min.x + 30.0, cy - label.size().y / 2.0), label, Color32::WHITE); - app.auto.add("header.discord", discord, "Join the ArtCraft Discord"); - if dresp.on_hover_text(tr("Join the ArtCraft community on Discord")).clicked() { - let _ = app.session.execute("help.discord", json!({})); - } - rx = discord.min.x - 6.0; - for (id, icon, tip, cmd) in - [("hdr-github", Icon::Code, "EffectCraft on GitHub", "help.github"), ("hdr-web", Icon::Globe, "EffectCraft on getartcraft.com", "help.appPage")] - { - let r = Rect::from_min_max(pos2(rx - 26.0, cy - 13.0), pos2(rx, cy + 13.0)); - if widgets::icon_button(ui, r, icon, false, &t, egui::Id::new(id)).on_hover_text(tip).clicked() { - let _ = app.session.execute(cmd, json!({})); - } - app.auto.add(&format!("header.{}", &id[4..]), r, tip); - rx = r.min.x - 4.0; + let tip = "EffectCraft on GitHub"; + let r = Rect::from_min_max(pos2(rx - 26.0, cy - 13.0), pos2(rx, cy + 13.0)); + if widgets::icon_button(ui, r, Icon::Code, false, &t, egui::Id::new("hdr-github")).on_hover_text(tip).clicked() { + let _ = app.session.execute("help.github", json!({})); } + app.auto.add("header.github", r, tip); + rx = r.min.x - 4.0; // Appearance: Sync with System, Light, Dark (a monitor, sun or moon), one click to the next. let (icon, mode) = match app.session.prefs.appearance.appearance_mode.as_str() { "auto" => (Icon::Monitor, tr("Sync with System")), @@ -654,20 +637,19 @@ fn ws_menu(app: &mut EffectcraftApp, ui: &mut egui::Ui) { } } -/// The ArtCraft mark as supplied in `docs/brand` (the README's and getartcraft.com's logo; used -/// unmodified, see `docs/brand/LICENSE-brand.txt`). -static ARTCRAFT_MARK: &[u8] = include_bytes!("../../../docs/brand/artcraft-mark.png"); +/// The EffectCraft app icon (`assets/app-icon`). +static APP_MARK: &[u8] = include_bytes!("../../../assets/app-icon/hicolor/128x128/apps/ai.storyteller.effectcraft.png"); -/// The ArtCraft mark in `r` (decoded once into a mipmapped texture, so it stays crisp from the +/// The app mark in `r` (decoded once into a mipmapped texture, so it stays crisp from the /// 24 px Tools bar to the About dialog). Nothing is drawn if it can't be decoded. pub fn paint_logo(p: &egui::Painter, r: Rect) { let ctx = p.ctx(); - let id = egui::Id::new("artcraft-mark"); + let id = egui::Id::new("app-mark"); let tex = ctx.data(|d| d.get_temp::>(id)).unwrap_or_else(|| { - let tex = image::load_from_memory_with_format(ARTCRAFT_MARK, image::ImageFormat::Png).ok().map(|img| { + let tex = image::load_from_memory_with_format(APP_MARK, image::ImageFormat::Png).ok().map(|img| { let img = img.to_rgba8(); let ci = egui::ColorImage::from_rgba_unmultiplied([img.width() as usize, img.height() as usize], img.as_raw()); - ctx.load_texture("artcraft-mark", ci, egui::TextureOptions::LINEAR.with_mipmap_mode(Some(egui::TextureFilter::Linear))) + ctx.load_texture("app-mark", ci, egui::TextureOptions::LINEAR.with_mipmap_mode(Some(egui::TextureFilter::Linear))) }); ctx.data_mut(|d| d.insert_temp(id, tex.clone())); tex diff --git a/crates/ui-egui/src/i18n.rs b/crates/ui-egui/src/i18n.rs index 4e814ea2..f874903d 100644 --- a/crates/ui-egui/src/i18n.rs +++ b/crates/ui-egui/src/i18n.rs @@ -875,10 +875,7 @@ const SIMPLIFIED_CHINESE: &[(&str, &str, &str)] = &[ ("help.systemReport", "System Compatibility Report...", "系统兼容性报告..."), ("help.enableLogging", "Enable Logging", "启用日志记录"), ("help.revealLogFile", "Reveal Logging File", "显示日志记录文件"), - ("help.discord", "Join the ArtCraft Discord...", "加入 ArtCraft 的 Discord 社区..."), ("help.reportIssue", "Provide Feedback...", "提供反馈..."), - ("help.website", "ArtCraft Website", "ArtCraft 网站"), - ("help.appPage", "EffectCraft Home Page", "EffectCraft 主页"), ("help.github", "EffectCraft on GitHub", "GitHub 上的 EffectCraft"), ("file.openDemoProject", "Open Demo Project", "打开示例项目"), ]; @@ -1505,10 +1502,7 @@ const TRADITIONAL_CHINESE: &[(&str, &str, &str)] = &[ ("help.systemReport", "System Compatibility Report...", "系統相容性報告..."), ("help.enableLogging", "Enable Logging", "啟用日誌記錄"), ("help.revealLogFile", "Reveal Logging File", "顯示日誌檔案"), - ("help.discord", "Join the ArtCraft Discord...", "加入 ArtCraft 的 Discord 社群..."), ("help.reportIssue", "Provide Feedback...", "提供意見..."), - ("help.website", "ArtCraft Website", "ArtCraft 網站"), - ("help.appPage", "EffectCraft Home Page", "EffectCraft 首頁"), ("help.github", "EffectCraft on GitHub", "GitHub 上的 EffectCraft"), ("file.openDemoProject", "Open Demo Project", "開啟範例專案"), ]; @@ -2132,10 +2126,7 @@ const JAPANESE: &[(&str, &str, &str)] = &[ ("help.systemReport", "System Compatibility Report...", "システム互換性レポート..."), ("help.enableLogging", "Enable Logging", "ログ記録を有効化"), ("help.revealLogFile", "Reveal Logging File", "ログファイルを表示"), - ("help.discord", "Join the ArtCraft Discord...", "ArtCraft Discordに参加..."), ("help.reportIssue", "Provide Feedback...", "フィードバックを送信..."), - ("help.website", "ArtCraft Website", "ArtCraftウェブサイト"), - ("help.appPage", "EffectCraft Home Page", "EffectCraftホームページ"), ("help.github", "EffectCraft on GitHub", "GitHubのEffectCraft"), ("file.openDemoProject", "Open Demo Project", "デモプロジェクトを開く"), ]; @@ -2762,10 +2753,7 @@ const UKRAINIAN: &[(&str, &str, &str)] = &[ ("help.systemReport", "System Compatibility Report...", "Звіт про сумісність системи..."), ("help.enableLogging", "Enable Logging", "Увімкнути журналювання"), ("help.revealLogFile", "Reveal Logging File", "Показати файл журналу"), - ("help.discord", "Join the ArtCraft Discord...", "Приєднатися до Discord ArtCraft..."), ("help.reportIssue", "Provide Feedback...", "Надіслати відгук..."), - ("help.website", "ArtCraft Website", "Вебсайт ArtCraft"), - ("help.appPage", "EffectCraft Home Page", "Домашня сторінка EffectCraft"), ("help.github", "EffectCraft on GitHub", "EffectCraft на GitHub"), ("file.openDemoProject", "Open Demo Project", "Відкрити демонстраційний проєкт"), ]; @@ -3393,10 +3381,7 @@ const SPANISH: &[(&str, &str, &str)] = &[ ("help.systemReport", "System Compatibility Report...", "Informe de compatibilidad del sistema..."), ("help.enableLogging", "Enable Logging", "Habilitar registro"), ("help.revealLogFile", "Reveal Logging File", "Mostrar archivo de registro"), - ("help.discord", "Join the ArtCraft Discord...", "Unirse al Discord de ArtCraft..."), ("help.reportIssue", "Provide Feedback...", "Enviar comentarios..."), - ("help.website", "ArtCraft Website", "Sitio web de ArtCraft"), - ("help.appPage", "EffectCraft Home Page", "Página de inicio de EffectCraft"), ("help.github", "EffectCraft on GitHub", "EffectCraft en GitHub"), ("file.openDemoProject", "Open Demo Project", "Abrir proyecto de demostración"), ]; @@ -4022,10 +4007,7 @@ const PORTUGUESE: &[(&str, &str, &str)] = &[ ("help.systemReport", "System Compatibility Report...", "Relatório de compatibilidade do sistema..."), ("help.enableLogging", "Enable Logging", "Ativar registro em log"), ("help.revealLogFile", "Reveal Logging File", "Revelar arquivo de log"), - ("help.discord", "Join the ArtCraft Discord...", "Entrar no Discord do ArtCraft..."), ("help.reportIssue", "Provide Feedback...", "Enviar comentários..."), - ("help.website", "ArtCraft Website", "Site do ArtCraft"), - ("help.appPage", "EffectCraft Home Page", "Página inicial do EffectCraft"), ("help.github", "EffectCraft on GitHub", "EffectCraft no GitHub"), ("file.openDemoProject", "Open Demo Project", "Abrir projeto de demonstração"), ]; diff --git a/crates/ui-egui/src/i18n/ui.rs b/crates/ui-egui/src/i18n/ui.rs index f31d0951..2821f134 100644 --- a/crates/ui-egui/src/i18n/ui.rs +++ b/crates/ui-egui/src/i18n/ui.rs @@ -95,8 +95,8 @@ const JAPANESE: &[(&str, &str)] = &[ ("360 View Orientation", "360度ビューの方向"), ("3:2 Pulldown: {}", "3:2プルダウン:{}"), ( - "A clean-room, open-source compositor for motion graphics and visual effects: native on macOS, Windows and Linux, and in the browser. Part of the ArtCraft family of creative apps.", - "モーショングラフィックスとビジュアルエフェクト向けの、クリーンルーム方式で開発されたオープンソースのコンポジットソフトウェアです。macOS、Windows、Linuxでネイティブに動作し、ブラウザーでも使えます。ArtCraftクリエイティブアプリファミリーの一員です。", + "A clean-room, open-source compositor for motion graphics and visual effects: native on macOS, Windows and Linux, and in the browser.", + "モーショングラフィックスとビジュアルエフェクト向けの、クリーンルーム方式で開発されたオープンソースのコンポジットソフトウェアです。macOS、Windows、Linuxでネイティブに動作し、ブラウザーでも使えます。", ), ("About EffectCraft", "EffectCraftについて"), ("About...", "情報..."), @@ -195,7 +195,6 @@ const JAPANESE: &[(&str, &str)] = &[ ("Delete selected project items", "選択したプロジェクト項目を削除"), ("Delete this template", "このテンプレートを削除"), ("Depth of Field", "被写界深度"), - ("Discord", "Discord"), ("Distribute Layers:", "レイヤーの分布:"), ("Don't Recover", "復元しない"), ("Don't Save", "保存しない"), @@ -267,7 +266,6 @@ const JAPANESE: &[(&str, &str)] = &[ ("Install from File…", "ファイルからインストール…"), ("Intensity", "強度"), ("Inverted", "反転"), - ("Join the ArtCraft community on Discord", "DiscordでArtCraftコミュニティに参加"), ("Key: {}", "キー:{}"), ("LEARN", "学習"), ("Label", "ラベル"), @@ -304,7 +302,6 @@ const JAPANESE: &[(&str, &str)] = &[ ("Models folder: {}", "モデルフォルダー:{}"), ("Modifiers:", "修飾キー:"), ("More", "その他"), - ("More ArtCraft apps", "ほかのArtCraftアプリ"), ("More tutorials", "ほかのチュートリアル"), ("Motion Blur", "モーションブラー"), ("Motion Blur: {}", "モーションブラー:{}"), @@ -538,8 +535,8 @@ const SIMPLIFIED_CHINESE: &[(&str, &str)] = &[ ("360 View Orientation", "360 视图方向"), ("3:2 Pulldown: {}", "3:2 折叠:{}"), ( - "A clean-room, open-source compositor for motion graphics and visual effects: native on macOS, Windows and Linux, and in the browser. Part of the ArtCraft family of creative apps.", - "一款从零编写、开源的动态图形与视觉效果合成软件:原生支持 macOS、Windows 和 Linux,也可在浏览器中运行。属于 ArtCraft 创意应用家族。", + "A clean-room, open-source compositor for motion graphics and visual effects: native on macOS, Windows and Linux, and in the browser.", + "一款从零编写、开源的动态图形与视觉效果合成软件:原生支持 macOS、Windows 和 Linux,也可在浏览器中运行。", ), ("About EffectCraft", "关于 EffectCraft"), ("About...", "关于..."), @@ -639,7 +636,6 @@ const SIMPLIFIED_CHINESE: &[(&str, &str)] = &[ ("Delete selected project items", "删除所选的项目项"), ("Delete this template", "删除此模板"), ("Depth of Field", "景深"), - ("Discord", "Discord"), ("Distribute Layers:", "分布图层:"), ("Don't Recover", "不恢复"), ("Don't Save", "不保存"), @@ -712,7 +708,6 @@ const SIMPLIFIED_CHINESE: &[(&str, &str)] = &[ ("Install from File…", "从文件安装…"), ("Intensity", "强度"), ("Inverted", "反转"), - ("Join the ArtCraft community on Discord", "加入 ArtCraft 的 Discord 社区"), ("Key: {}", "按键:{}"), ("LEARN", "学习"), ("Label", "标签"), @@ -751,7 +746,6 @@ const SIMPLIFIED_CHINESE: &[(&str, &str)] = &[ ("Models folder: {}", "模型文件夹:{}"), ("Modifiers:", "修饰键:"), ("More", "更多"), - ("More ArtCraft apps", "更多 ArtCraft 应用"), ("More tutorials", "更多教程"), ("Motion Blur", "运动模糊"), ("Motion Blur: {}", "运动模糊:{}"), @@ -1016,7 +1010,6 @@ const SIMPLIFIED_CHINESE: &[(&str, &str)] = &[ ("Import PDF / Illustrator File", "导入 PDF / Illustrator 文件"), ("Import Photoshop File", "导入 Photoshop 文件"), ("Interpret Unlabeled Alpha As", "将未标记的 Alpha 解释为"), - ("Join the ArtCraft Discord", "加入 ArtCraft Discord"), ("Mercury GPU Acceleration ({})", "Mercury GPU 加速({})"), ("Mercury Software Only", "仅 Mercury 软件"), ("OCIO (built-in ACES config)", "OCIO(内置 ACES 配置)"), @@ -1033,7 +1026,6 @@ const SIMPLIFIED_CHINESE: &[(&str, &str)] = &[ ("New Project", "新建项目"), ("Open Project…", "打开项目…"), ("Templates", "模板"), - ("EffectCraft home page", "EffectCraft 主页"), ("EffectCraft on GitHub", "GitHub 上的 EffectCraft"), ("Motion graphics and visual effects · version {}", "动态图形和视觉效果 · 版本 {}"), ("New Composition", "新建合成"), @@ -1073,8 +1065,8 @@ const TRADITIONAL_CHINESE: &[(&str, &str)] = &[ ("360 View Orientation", "360 檢視方向"), ("3:2 Pulldown: {}", "3:2 摺疊:{}"), ( - "A clean-room, open-source compositor for motion graphics and visual effects: native on macOS, Windows and Linux, and in the browser. Part of the ArtCraft family of creative apps.", - "一款從零編寫、開源的動態圖形與視覺效果合成軟件:原生支援 macOS、Windows 和 Linux,也可在瀏覽器中執行。屬於 ArtCraft 創意應用家族。", + "A clean-room, open-source compositor for motion graphics and visual effects: native on macOS, Windows and Linux, and in the browser.", + "一款從零編寫、開源的動態圖形與視覺效果合成軟件:原生支援 macOS、Windows 和 Linux,也可在瀏覽器中執行。", ), ("About EffectCraft", "關於 EffectCraft"), ("About...", "關於..."), @@ -1174,7 +1166,6 @@ const TRADITIONAL_CHINESE: &[(&str, &str)] = &[ ("Delete selected project items", "刪除所選的專案項"), ("Delete this template", "刪除此範本"), ("Depth of Field", "景深"), - ("Discord", "Discord"), ("Distribute Layers:", "分佈圖層:"), ("Don't Recover", "不恢復"), ("Don't Save", "不儲存"), @@ -1247,7 +1238,6 @@ const TRADITIONAL_CHINESE: &[(&str, &str)] = &[ ("Install from File…", "從文件安裝…"), ("Intensity", "強度"), ("Inverted", "反轉"), - ("Join the ArtCraft community on Discord", "加入 ArtCraft 的 Discord 社區"), ("Key: {}", "按鍵:{}"), ("LEARN", "學習"), ("Label", "標籤"), @@ -1286,7 +1276,6 @@ const TRADITIONAL_CHINESE: &[(&str, &str)] = &[ ("Models folder: {}", "模型資料夾:{}"), ("Modifiers:", "修飾鍵:"), ("More", "更多"), - ("More ArtCraft apps", "更多 ArtCraft 應用"), ("More tutorials", "更多教學"), ("Motion Blur", "運動模糊"), ("Motion Blur: {}", "動態模糊:{}"), @@ -1546,7 +1535,6 @@ const TRADITIONAL_CHINESE: &[(&str, &str)] = &[ ("Import PDF / Illustrator File", "Import PDF / Illustrator File"), ("Import Photoshop File", "Import Photoshop File"), ("Interpret Unlabeled Alpha As", "Interpret Unlabeled Alpha As"), - ("Join the ArtCraft Discord", "加入 ArtCraft Discord"), ("Mercury GPU Acceleration ({})", "Mercury GPU Acceleration ({})"), ("Mercury Software Only", "Mercury Software Only"), ("OCIO (built-in ACES config)", "OCIO (built-in ACES config)"), @@ -1563,7 +1551,6 @@ const TRADITIONAL_CHINESE: &[(&str, &str)] = &[ ("New Project", "新增專案"), ("Open Project…", "開啟專案…"), ("Templates", "範本"), - ("EffectCraft home page", "EffectCraft 首頁"), ("EffectCraft on GitHub", "GitHub 上的 EffectCraft"), ("Motion graphics and visual effects · version {}", "動態圖形與視覺效果 · 版本 {}"), ("New Composition", "新增合成"), @@ -1605,8 +1592,8 @@ const UKRAINIAN: &[(&str, &str)] = &[ ("360 View Orientation", "Орієнтація огляду 360°"), ("3:2 Pulldown: {}", "Перетворення кадрів 3:2: {}"), ( - "A clean-room, open-source compositor for motion graphics and visual effects: native on macOS, Windows and Linux, and in the browser. Part of the ArtCraft family of creative apps.", - "Незалежно розроблена програма з відкритим кодом для компонування анімованої графіки та візуальних ефектів: працює на macOS, Windows і Linux, а також у браузері. Належить до родини творчих програм ArtCraft.", + "A clean-room, open-source compositor for motion graphics and visual effects: native on macOS, Windows and Linux, and in the browser.", + "Незалежно розроблена програма з відкритим кодом для компонування анімованої графіки та візуальних ефектів: працює на macOS, Windows і Linux, а також у браузері.", ), ("About EffectCraft", "Про EffectCraft"), ("About...", "Про програму..."), @@ -1712,7 +1699,6 @@ const UKRAINIAN: &[(&str, &str)] = &[ ("Delete selected project items", "Видалити виділені елементи проєкту"), ("Delete this template", "Видалити цей шаблон"), ("Depth of Field", "Глибина різкості"), - ("Discord", "Discord"), ("Distribute Layers:", "Розподілити шари:"), ("Don't Recover", "Не відновлювати"), ("Don't Save", "Не зберігати"), @@ -1785,7 +1771,6 @@ const UKRAINIAN: &[(&str, &str)] = &[ ("Install from File…", "Встановити з файлу…"), ("Intensity", "Інтенсивність"), ("Inverted", "Інвертовано"), - ("Join the ArtCraft community on Discord", "Приєднайтеся до спільноти ArtCraft у Discord"), ("Key: {}", "Клавіша: {}"), ("LEARN", "НАВЧАННЯ"), ("Label", "Мітка"), @@ -1824,7 +1809,6 @@ const UKRAINIAN: &[(&str, &str)] = &[ ("Models folder: {}", "Тека моделей: {}"), ("Modifiers:", "Модифікатори:"), ("More", "Більше"), - ("More ArtCraft apps", "Інші програми ArtCraft"), ("More tutorials", "Інші уроки"), ("Motion Blur", "Розмиття руху"), ("Motion Blur: {}", "Розмиття руху: {}"), diff --git a/crates/ui-egui/src/panels/dialogs.rs b/crates/ui-egui/src/panels/dialogs.rs index e95a667e..e279b886 100644 --- a/crates/ui-egui/src/panels/dialogs.rs +++ b/crates/ui-egui/src/panels/dialogs.rs @@ -295,39 +295,17 @@ fn about_main(app: &mut EffectcraftApp, ui: &mut egui::Ui, t: &Tokens, cmd: &mut t.text_dim, ); ui.add_space(12.0); - ui.label(tr("A clean-room, open-source compositor for motion graphics and visual effects: native on macOS, Windows and Linux, and in the browser. Part of the ArtCraft family of creative apps.")); + ui.label(tr("A clean-room, open-source compositor for motion graphics and visual effects: native on macOS, Windows and Linux, and in the browser.")); ui.add_space(14.0); - let links: [(Icon, &str, &str, &'static str); 4] = [ - (Icon::Chat, "Join the ArtCraft Discord", effectcraft_engine::links::DISCORD, "help.discord"), - (Icon::Globe, "ArtCraft website", effectcraft_engine::links::WEBSITE, "help.website"), - (Icon::Sparkle, "EffectCraft home page", effectcraft_engine::links::APP_PAGE, "help.appPage"), - (Icon::Code, "Source code on GitHub", effectcraft_engine::links::GITHUB, "help.github"), - ]; + let links: [(Icon, &str, &str, &'static str); 1] = [(Icon::Code, "Source code on GitHub", effectcraft_engine::links::GITHUB, "help.github")]; for (icon, label, url, c) in links { let (r, resp) = ui.allocate_exact_size(vec2(ui.available_width(), 30.0), Sense::click()); let p = ui.painter(); - let discord = c == "help.discord"; - p.rect_filled( - r, - 6.0, - if discord { - Color32::from_rgb(0x58, 0x65, 0xf2) - } else if resp.hovered() { - t.hover - } else { - t.field_bg - }, - ); - let foreground = if discord { Color32::WHITE } else { t.text }; + p.rect_filled(r, 6.0, if resp.hovered() { t.hover } else { t.field_bg }); + let foreground = t.text; icons::paint(p, Rect::from_center_size(pos2(r.min.x + 18.0, r.center().y), vec2(15.0, 15.0)), icon, foreground); p.text(pos2(r.min.x + 36.0, r.center().y), Align2::LEFT_CENTER, tr(label), Tokens::medium(12.5), foreground); - p.text( - pos2(r.max.x - 12.0, r.center().y), - Align2::RIGHT_CENTER, - url, - Tokens::ui(11.0), - if discord { Color32::from_white_alpha(200) } else { t.text_dim }, - ); + p.text(pos2(r.max.x - 12.0, r.center().y), Align2::RIGHT_CENTER, url, Tokens::ui(11.0), t.text_dim); app.auto.add(&format!("about.{c}"), r, label); if resp.clicked() { *cmd = Some(c); diff --git a/crates/ui-egui/src/panels/home.rs b/crates/ui-egui/src/panels/home.rs index 46bbb44f..d6944bc3 100644 --- a/crates/ui-egui/src/panels/home.rs +++ b/crates/ui-egui/src/panels/home.rs @@ -1,6 +1,6 @@ //! The Home screen, laid out like After Effects' (shown over the whole workspace at launch, from //! the Tools bar's Home button and by the Learn workspace). A left rail holds New Project / Open -//! Project, the Home / Templates / Learn pages and, at its foot, the ArtCraft community links. +//! Project, the Home / Templates / Learn pages and, at its foot, the project links. //! The Home page welcomes you with quick-start tiles (New Composition, the demo project, Import, //! New from Template) over the recent projects (File ▸ Open Recent, from Settings): a filterable //! table with thumbnails and Name / Opened / Size / Kind columns. Templates is the New from @@ -270,16 +270,9 @@ fn rail_ui(app: &mut EffectcraftApp, ui: &mut egui::Ui, p: &egui::Painter, rail: } y += 38.0; } - // Community links at the foot (below the pages when the window is short). - let links = [ - (Icon::Chat, "Join the ArtCraft Discord", "help.discord"), - (Icon::Globe, "getartcraft.com", "help.website"), - (Icon::Globe, "EffectCraft home page", "help.appPage"), - (Icon::Code, "EffectCraft on GitHub", "help.github"), - ]; - let sib = effectcraft_engine::links::SIBLINGS; - let sib_rows = sib.len().div_ceil(2) as f32; - let foot_h = 22.0 + links.len() as f32 * 30.0 + 22.0 + sib_rows * 26.0; + // Project link at the foot (below the pages when the window is short). + let links = [(Icon::Code, "EffectCraft on GitHub", "help.github")]; + let foot_h = 22.0 + links.len() as f32 * 30.0; let mut cy = (rail.max.y - 16.0 - foot_h).max(y + 16.0); p.line_segment([pos2(x0, cy - 10.0), pos2(x0 + w, cy - 10.0)], Stroke::new(1.0, t.separator)); p.text(pos2(x0, cy + 6.0), Align2::LEFT_CENTER, tr("Community"), Tokens::semibold(12.0), t.text_dim); @@ -287,34 +280,17 @@ fn rail_ui(app: &mut EffectcraftApp, ui: &mut egui::Ui, p: &egui::Painter, rail: for (icon, label, cmd) in links { let r = Rect::from_min_size(pos2(x0, cy), vec2(w, 26.0)); let resp = ui.interact(r, egui::Id::new(("home-link", cmd)), Sense::click()); - let discord = cmd == "help.discord"; - if discord { - p.rect_filled(r, 13.0, Color32::from_rgb(0x58, 0x65, 0xf2)); - } else if resp.hovered() { + if resp.hovered() { p.rect_filled(r, 13.0, t.hover); } - let col = if discord { Color32::WHITE } else { t.text }; - icons::paint(p, Rect::from_center_size(pos2(r.min.x + 16.0, r.center().y), vec2(13.0, 13.0)), icon, col); - p.text(pos2(r.min.x + 30.0, r.center().y), Align2::LEFT_CENTER, tr(label), Tokens::medium(12.0), col); + icons::paint(p, Rect::from_center_size(pos2(r.min.x + 16.0, r.center().y), vec2(13.0, 13.0)), icon, t.text); + p.text(pos2(r.min.x + 30.0, r.center().y), Align2::LEFT_CENTER, tr(label), Tokens::medium(12.0), t.text); app.auto.add(&format!("home.{cmd}"), r, label); if resp.clicked() { let _ = app.session.execute(cmd, json!({})); } cy += 30.0; } - p.text(pos2(x0, cy + 8.0), Align2::LEFT_CENTER, tr("More ArtCraft apps"), Tokens::ui(11.0), t.text_faint); - cy += 20.0; - let sw = (w - 6.0) / 2.0; - for (i, (name, slug)) in sib.iter().enumerate() { - let r = Rect::from_min_size(pos2(x0 + (i % 2) as f32 * (sw + 6.0), cy + (i / 2) as f32 * 26.0), vec2(sw, 22.0)); - let resp = ui.interact(r, egui::Id::new(("sib", *slug)), Sense::click()); - p.rect_filled(r, 11.0, if resp.hovered() { t.hover } else { t.field_bg }); - p.text(r.center(), Align2::CENTER_CENTER, *name, Tokens::ui(11.0), t.text); - app.auto.add(&format!("home.sibling.{slug}"), r, name); - if resp.clicked() { - let _ = app.session.execute("help.sibling", json!({"app": slug})); - } - } } /// The Home page: the welcome, quick-start tiles and the recent projects table. @@ -569,7 +545,6 @@ mod tests { "home.file.open", "home.app.newComp", "home.file.openDemoProject", - "home.help.discord", "home.help.github", "home.recent.0", "home.filter", diff --git a/crates/ui-egui/src/panels/markers_ui.rs b/crates/ui-egui/src/panels/markers_ui.rs index edf46f4e..ae8ccf2f 100644 --- a/crates/ui-egui/src/panels/markers_ui.rs +++ b/crates/ui-egui/src/panels/markers_ui.rs @@ -486,7 +486,7 @@ mod tests { assert_eq!(effectcraft_engine::color::Label::ALL[d.label].name(), "Blue"); d.duration = 0.5; d.chapter = "Ch".into(); - d.url = "https://getartcraft.com".into(); + d.url = "https://example.com".into(); d.frame_target = "_self".into(); d.protected = true; d.cue = false; diff --git a/crates/ui-egui/src/panels/settings.rs b/crates/ui-egui/src/panels/settings.rs index f7a45feb..dae4d54e 100644 --- a/crates/ui-egui/src/panels/settings.rs +++ b/crates/ui-egui/src/panels/settings.rs @@ -225,7 +225,7 @@ fn theme_preview(ui: &mut egui::Ui, kind: ThemeKind, width: f32) { painter.rect_filled(rect, 3.0, p.app_bg); let bar = Rect::from_min_size(rect.min, vec2(rect.width(), 13.0)); painter.rect_filled(bar, 0.0, p.header_bg); - // The brand mark, the tools (the Selection tool is active) and the Discord pill. + // The brand mark, the tools (the Selection tool is active). painter.rect_filled(Rect::from_min_size(bar.min + vec2(4.0, 3.0), vec2(7.0, 7.0)), 2.0, p.accent); for i in 0..7 { let c = if i == 0 { p.accent } else { p.icon }; diff --git a/crates/ui-egui/tests/ui_panels.rs b/crates/ui-egui/tests/ui_panels.rs index e3fee868..f072ea06 100644 --- a/crates/ui-egui/tests/ui_panels.rs +++ b/crates/ui-egui/tests/ui_panels.rs @@ -37,17 +37,6 @@ fn click(h: &mut Harness<'_, EffectcraftApp>, id: &str) { h.run_steps(2); } -/// #581: the header's Discord pill fits its label with even padding (it was a fixed 104 px with -/// the text at its left). -#[test] -fn discord_pill_fits_its_label() { - let h = harness(); - let e = h.state().auto.find("header.discord").expect("the Discord pill").clone(); - let text = h.ctx.fonts_mut(|f| f.layout_no_wrap("Discord".into(), effectcraft_ui_egui::theme::Tokens::semibold(12.0), egui::Color32::WHITE).size().x); - // Padding 10, the 14 px icon, a 6 px gap, the text, padding 12. - assert!((e.rect[2] - (text + 42.0)).abs() < 0.5, "{} for a {text} px label", e.rect[2]); -} - #[test] fn window_menu_opens_the_new_panels() { let mut h = harness(); diff --git a/docs/brand/LICENSE-brand.txt b/docs/brand/LICENSE-brand.txt deleted file mode 100644 index bebdd7b2..00000000 --- a/docs/brand/LICENSE-brand.txt +++ /dev/null @@ -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 EffectCraft'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 EffectCraft itself, its documentation and its official builds, to identify EffectCraft 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 EffectCraft, 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 EffectCraft. - -Forks and modified versions - -If you distribute or publish a modified version of EffectCraft, 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 EffectCraft 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. diff --git a/docs/brand/artcraft-logo-white.png b/docs/brand/artcraft-logo-white.png deleted file mode 100644 index 8cfb31d9..00000000 Binary files a/docs/brand/artcraft-logo-white.png and /dev/null differ diff --git a/docs/brand/artcraft-logo-white.png.attribution b/docs/brand/artcraft-logo-white.png.attribution deleted file mode 100644 index 16be873a..00000000 --- a/docs/brand/artcraft-logo-white.png.attribution +++ /dev/null @@ -1,8 +0,0 @@ -asset: artcraft-logo-white.png -title: ArtCraft wordmark, light ink for dark backgrounds -author: ArtCraft Team -source: original work (first-party ArtCraft brand asset supplied by the ArtCraft Team) -license: LicenseRef-ArtCraft-Trademark — ArtCraft name, wordmark and logos are trademarks of the ArtCraft Team, not open source and not covered by EffectCraft's MIT OR Apache-2.0 license; usable only unmodified and only in the context of EffectCraft, under docs/brand/LICENSE-brand.txt. -license-file: docs/brand/LICENSE-brand.txt -added: 2026-10-01 by Claude (agent) for Brandon Thomas -notes: First-party ArtCraft brand mark owned by the ArtCraft Team, kept in docs/brand for the README and brand use: the one exception to the open-licence rule (AGENTS.md §1.8). Forks and modified versions must remove it (docs/brand/LICENSE-brand.txt). diff --git a/docs/brand/artcraft-logo-white.svg b/docs/brand/artcraft-logo-white.svg deleted file mode 100644 index 4af80f75..00000000 --- a/docs/brand/artcraft-logo-white.svg +++ /dev/null @@ -1,7 +0,0 @@ - - ArtCraft - - - - - diff --git a/docs/brand/artcraft-logo-white.svg.attribution b/docs/brand/artcraft-logo-white.svg.attribution deleted file mode 100644 index 973ff5ed..00000000 --- a/docs/brand/artcraft-logo-white.svg.attribution +++ /dev/null @@ -1,8 +0,0 @@ -asset: artcraft-logo-white.svg -title: ArtCraft wordmark, light ink for dark backgrounds -author: ArtCraft Team -source: original work (first-party ArtCraft brand asset supplied by the ArtCraft Team) -license: LicenseRef-ArtCraft-Trademark — ArtCraft name, wordmark and logos are trademarks of the ArtCraft Team, not open source and not covered by EffectCraft's MIT OR Apache-2.0 license; usable only unmodified and only in the context of EffectCraft, under docs/brand/LICENSE-brand.txt. -license-file: docs/brand/LICENSE-brand.txt -added: 2026-10-01 by Claude (agent) for Brandon Thomas -notes: First-party ArtCraft brand mark owned by the ArtCraft Team, kept in docs/brand for the README and brand use: the one exception to the open-licence rule (AGENTS.md §1.8). Forks and modified versions must remove it (docs/brand/LICENSE-brand.txt). diff --git a/docs/brand/artcraft-logo.png b/docs/brand/artcraft-logo.png deleted file mode 100644 index a4d1544c..00000000 Binary files a/docs/brand/artcraft-logo.png and /dev/null differ diff --git a/docs/brand/artcraft-logo.png.attribution b/docs/brand/artcraft-logo.png.attribution deleted file mode 100644 index 4ebbd06f..00000000 --- a/docs/brand/artcraft-logo.png.attribution +++ /dev/null @@ -1,8 +0,0 @@ -asset: artcraft-logo.png -title: ArtCraft wordmark (symbol + "ARTCRAFT"), dark ink for light backgrounds -author: ArtCraft Team -source: original work (first-party ArtCraft brand asset supplied by the ArtCraft Team) -license: LicenseRef-ArtCraft-Trademark — ArtCraft name, wordmark and logos are trademarks of the ArtCraft Team, not open source and not covered by EffectCraft's MIT OR Apache-2.0 license; usable only unmodified and only in the context of EffectCraft, under docs/brand/LICENSE-brand.txt. -license-file: docs/brand/LICENSE-brand.txt -added: 2026-10-01 by Claude (agent) for Brandon Thomas -notes: First-party ArtCraft brand mark owned by the ArtCraft Team, kept in docs/brand for the README and brand use: the one exception to the open-licence rule (AGENTS.md §1.8). Forks and modified versions must remove it (docs/brand/LICENSE-brand.txt). diff --git a/docs/brand/artcraft-logo.svg b/docs/brand/artcraft-logo.svg deleted file mode 100644 index d63f3eae..00000000 --- a/docs/brand/artcraft-logo.svg +++ /dev/null @@ -1,7 +0,0 @@ - - ArtCraft - - - - - diff --git a/docs/brand/artcraft-logo.svg.attribution b/docs/brand/artcraft-logo.svg.attribution deleted file mode 100644 index 0f888226..00000000 --- a/docs/brand/artcraft-logo.svg.attribution +++ /dev/null @@ -1,8 +0,0 @@ -asset: artcraft-logo.svg -title: ArtCraft wordmark (symbol + "ARTCRAFT"), dark ink for light backgrounds -author: ArtCraft Team -source: original work (first-party ArtCraft brand asset supplied by the ArtCraft Team) -license: LicenseRef-ArtCraft-Trademark — ArtCraft name, wordmark and logos are trademarks of the ArtCraft Team, not open source and not covered by EffectCraft's MIT OR Apache-2.0 license; usable only unmodified and only in the context of EffectCraft, under docs/brand/LICENSE-brand.txt. -license-file: docs/brand/LICENSE-brand.txt -added: 2026-10-01 by Claude (agent) for Brandon Thomas -notes: First-party ArtCraft brand mark owned by the ArtCraft Team, kept in docs/brand for the README and brand use: the one exception to the open-licence rule (AGENTS.md §1.8). Forks and modified versions must remove it (docs/brand/LICENSE-brand.txt). diff --git a/docs/brand/artcraft-mark-black.png b/docs/brand/artcraft-mark-black.png deleted file mode 100644 index 27664bc1..00000000 Binary files a/docs/brand/artcraft-mark-black.png and /dev/null differ diff --git a/docs/brand/artcraft-mark-black.png.attribution b/docs/brand/artcraft-mark-black.png.attribution deleted file mode 100644 index 2cac9a9e..00000000 --- a/docs/brand/artcraft-mark-black.png.attribution +++ /dev/null @@ -1,8 +0,0 @@ -asset: artcraft-mark-black.png -title: ArtCraft symbol ("A" mark), black -author: ArtCraft Team -source: original work (first-party ArtCraft brand asset supplied by the ArtCraft Team) -license: LicenseRef-ArtCraft-Trademark — ArtCraft name, wordmark and logos are trademarks of the ArtCraft Team, not open source and not covered by EffectCraft's MIT OR Apache-2.0 license; usable only unmodified and only in the context of EffectCraft, under docs/brand/LICENSE-brand.txt. -license-file: docs/brand/LICENSE-brand.txt -added: 2026-10-01 by Claude (agent) for Brandon Thomas -notes: First-party ArtCraft brand mark owned by the ArtCraft Team, kept in docs/brand for the README and brand use: the one exception to the open-licence rule (AGENTS.md §1.8). Forks and modified versions must remove it (docs/brand/LICENSE-brand.txt). diff --git a/docs/brand/artcraft-mark-black.svg b/docs/brand/artcraft-mark-black.svg deleted file mode 100644 index 63943537..00000000 --- a/docs/brand/artcraft-mark-black.svg +++ /dev/null @@ -1,4 +0,0 @@ - - ArtCraft - - diff --git a/docs/brand/artcraft-mark-black.svg.attribution b/docs/brand/artcraft-mark-black.svg.attribution deleted file mode 100644 index 5c162073..00000000 --- a/docs/brand/artcraft-mark-black.svg.attribution +++ /dev/null @@ -1,8 +0,0 @@ -asset: artcraft-mark-black.svg -title: ArtCraft symbol ("A" mark), black -author: ArtCraft Team -source: original work (first-party ArtCraft brand asset supplied by the ArtCraft Team) -license: LicenseRef-ArtCraft-Trademark — ArtCraft name, wordmark and logos are trademarks of the ArtCraft Team, not open source and not covered by EffectCraft's MIT OR Apache-2.0 license; usable only unmodified and only in the context of EffectCraft, under docs/brand/LICENSE-brand.txt. -license-file: docs/brand/LICENSE-brand.txt -added: 2026-10-01 by Claude (agent) for Brandon Thomas -notes: First-party ArtCraft brand mark owned by the ArtCraft Team, kept in docs/brand for the README and brand use: the one exception to the open-licence rule (AGENTS.md §1.8). Forks and modified versions must remove it (docs/brand/LICENSE-brand.txt). diff --git a/docs/brand/artcraft-mark.png b/docs/brand/artcraft-mark.png deleted file mode 100644 index dbb3dc08..00000000 Binary files a/docs/brand/artcraft-mark.png and /dev/null differ diff --git a/docs/brand/artcraft-mark.png.attribution b/docs/brand/artcraft-mark.png.attribution deleted file mode 100644 index f68029fc..00000000 --- a/docs/brand/artcraft-mark.png.attribution +++ /dev/null @@ -1,8 +0,0 @@ -asset: artcraft-mark.png -title: ArtCraft symbol ("A" mark), blue -author: ArtCraft Team -source: original work (first-party ArtCraft brand asset supplied by the ArtCraft Team) -license: LicenseRef-ArtCraft-Trademark — ArtCraft name, wordmark and logos are trademarks of the ArtCraft Team, not open source and not covered by EffectCraft's MIT OR Apache-2.0 license; usable only unmodified and only in the context of EffectCraft, under docs/brand/LICENSE-brand.txt. -license-file: docs/brand/LICENSE-brand.txt -added: 2026-10-01 by Claude (agent) for Brandon Thomas -notes: First-party ArtCraft brand mark owned by the ArtCraft Team, kept in docs/brand for the README and brand use: the one exception to the open-licence rule (AGENTS.md §1.8). Forks and modified versions must remove it (docs/brand/LICENSE-brand.txt). diff --git a/docs/brand/artcraft-mark.svg b/docs/brand/artcraft-mark.svg deleted file mode 100644 index 72e191f8..00000000 --- a/docs/brand/artcraft-mark.svg +++ /dev/null @@ -1,4 +0,0 @@ - - ArtCraft - - diff --git a/docs/brand/artcraft-mark.svg.attribution b/docs/brand/artcraft-mark.svg.attribution deleted file mode 100644 index 2beb3263..00000000 --- a/docs/brand/artcraft-mark.svg.attribution +++ /dev/null @@ -1,8 +0,0 @@ -asset: artcraft-mark.svg -title: ArtCraft symbol ("A" mark), blue -author: ArtCraft Team -source: original work (first-party ArtCraft brand asset supplied by the ArtCraft Team) -license: LicenseRef-ArtCraft-Trademark — ArtCraft name, wordmark and logos are trademarks of the ArtCraft Team, not open source and not covered by EffectCraft's MIT OR Apache-2.0 license; usable only unmodified and only in the context of EffectCraft, under docs/brand/LICENSE-brand.txt. -license-file: docs/brand/LICENSE-brand.txt -added: 2026-10-01 by Claude (agent) for Brandon Thomas -notes: First-party ArtCraft brand mark owned by the ArtCraft Team, kept in docs/brand for the README and brand use: the one exception to the open-licence rule (AGENTS.md §1.8). Forks and modified versions must remove it (docs/brand/LICENSE-brand.txt). diff --git a/docs/gaps.md b/docs/gaps.md index e621ee87..6d329702 100644 --- a/docs/gaps.md +++ b/docs/gaps.md @@ -211,7 +211,7 @@ The most important missing piece: it turns every other estimate here into a meas Kept from the 5 October assessment's "Real-user experience" row, as evidence of what users hit and what was fixed: -Issues #41–#47 (all from the Linux AppImage 0.1.1, 5 October): panning the viewer snaps back, panels can't be resized or rearranged, drag-and-drop and double-click import don't work, layer rename gets stuck, the Layer Settings arrow does nothing, the Project panel clips, the Wayland window icon is generic. Issues #63–#68 (macOS, 5 October): scaling a layer by its handles goes wrong and can stick at 0, two 3D compasses, the viewer lags while a layer is dragged (a frame renders in 20 ms but showed after ≈ 100 ms, behind RAM preview prefetch), the Discord and other links do nothing, Delete doesn't delete in the Project panel, hidden layers can be selected in the viewer. All but the last two were fixed or confirmed fixed with a test on 5–6 October (those two have community PRs); file drops still can't work on Wayland (winit has no support). The panning, rename and arrow bugs had been fixed in v0.2.0 already; nobody had told the reporter. A Windows user (6 October, on Discord) found the font menus listed only the three bundled fonts: installed fonts were read only when a project asked for one, on every platform. Fixed with a regression test on 6 October; the menus now list every installed family and its own styles, and agents get `text.fonts` / `list_fonts`. Seven reports of 6 October (Linux .deb and Windows): Project items and files couldn't be dropped on the viewer (#85), nor effects on a layer there (#88); drops in the Timeline ignored where they landed (#89); an angle's revolutions couldn't be edited (#93); toggling Audio, Lock or Shy threw away the RAM preview and playback with audio skipped frames (#103); running out of video memory panicked every frame thread and left frames stuck (#106); choosing a Render Settings template in the Render Queue did nothing (#117: any popup menu moved up to fit the window closed on the press). All seven were fixed with regression tests on 7 October. Reports of 7 October (Linux, macOS, Windows): the app opened the demo project on every launch, so a new comp landed in it (#204); a comp wider than the GPU's texture limit (11000 × 2200) at Full resolution stopped the window drawing (#201); an Intel HD Graphics 5500 couldn't start the app (#198: most likely the window's device asked for limits that GPU doesn't have, and the failure was silent); Audio Spectrum / Waveform stood still in the viewer (#209) and preview sound waited for the whole work area to cache (#208); a layer couldn't be deselected from the time graph, a shape layer's Fill and Stroke showed only with a shape tool and a drawn shape had no stroke to change, Alt+Shift+P didn't reveal Position (#205); a mask selected in the Timeline wasn't selected in the viewer, Mask Feather had no link and took negative values, the Project panel had no selection box (#203); shape layers had no Add menu for Trim Paths and the other operations, and Classic 3D comps hid Geometry Options (#206); dragging Puppet pins re-rendered the layer under the Puppet at every move (#212). All were fixed with regression tests the same day (#219–#222); the #198 fix couldn't be checked on that GPU. Reports of 8 October (browser, Windows, macOS): an empty project at 1280 × 800 with device pixel ratio 2 crashed on its first frame, because the Project panel's scroll bar clamped its thumb to a track shorter than the thumb (#231, any short panel on every platform); Media Browser ▸ Add Files… dropped a file it couldn't read without a word (#226); after the page's WebGPU device was lost, the browser editor froze on its last frame while edits went on (#225); a press in the viewer always took the topmost layer, so a selected layer behind others couldn't be dragged (#230); the language didn't follow the system's (#229); and a list of missing After Effects behaviour (#227): drawing into, copying, pasting and duplicating shape contents, Tool Creates Shape / Mask and Fill / Stroke Options, Turbulent Displace, Wave Warp and Bulge pinning all but a shape layer's bottom-right quadrant, a Spacebar hold that previewed instead of being the Hand tool, the Effect menu in Effect Controls, dropping items on New Composition and dragging over layer switches. All were fixed with regression tests the same day (#235, #237–#241); multi-monitor support and the Project panel's empty-area menu (community PR #210) remain from #227, and effect points on shape and text layers still sit half a comp off. A list of tweaks from an Intel iMac (#290): the layer bar didn't show where extended footage runs past its source, and Enable Time Remapping then ended at the extended out point; footage items had no Interpret Footage in their menu and the work area bar no menu; Label menus named the labels without their colours; the arrow keys didn't nudge layers; a straight motion path had no Bezier handles; Delete on Time Remap deleted the layer; a mask being drawn with the Pen blacked out its layer until it was closed; a double-click on a mask point didn't select the whole mask. All were fixed with regression tests the same day; the rest of #290 had been fixed already (#221, #238, #255) or came with community PRs #210 (the Timeline's empty-area menu) and #213 (tool flyouts on a long press). A report of 9 October (#397): CC Particle World ignored the comp camera and looked flat. It now sees its particles through an active camera layer, as After Effects does, and through its own Extras ▸ Effect Camera (Distance, Rotation X / Y / Z, FOV, added) otherwise; the layer cache also missed camera and light moves for the effects that read them (Card Dance, Shatter, Card Wipe, Caustics). Fixed with regression tests the same day. Most checking happens on macOS. Localisation covers the menus in Japanese, Simplified and Traditional Chinese, and Ukrainian, and since 9 October the cataloged panels, dialogs and tooltips too (Simplified and Traditional Chinese, and Ukrainian; the Japanese rows of the panel catalog are still open); no accessibility work +Issues #41–#47 (all from the Linux AppImage 0.1.1, 5 October): panning the viewer snaps back, panels can't be resized or rearranged, drag-and-drop and double-click import don't work, layer rename gets stuck, the Layer Settings arrow does nothing, the Project panel clips, the Wayland window icon is generic. Issues #63–#68 (macOS, 5 October): scaling a layer by its handles goes wrong and can stick at 0, two 3D compasses, the viewer lags while a layer is dragged (a frame renders in 20 ms but showed after ≈ 100 ms, behind RAM preview prefetch), the links do nothing, Delete doesn't delete in the Project panel, hidden layers can be selected in the viewer. All but the last two were fixed or confirmed fixed with a test on 5–6 October (those two have community PRs); file drops still can't work on Wayland (winit has no support). The panning, rename and arrow bugs had been fixed in v0.2.0 already; nobody had told the reporter. A Windows user (6 October) found the font menus listed only the three bundled fonts: installed fonts were read only when a project asked for one, on every platform. Fixed with a regression test on 6 October; the menus now list every installed family and its own styles, and agents get `text.fonts` / `list_fonts`. Seven reports of 6 October (Linux .deb and Windows): Project items and files couldn't be dropped on the viewer (#85), nor effects on a layer there (#88); drops in the Timeline ignored where they landed (#89); an angle's revolutions couldn't be edited (#93); toggling Audio, Lock or Shy threw away the RAM preview and playback with audio skipped frames (#103); running out of video memory panicked every frame thread and left frames stuck (#106); choosing a Render Settings template in the Render Queue did nothing (#117: any popup menu moved up to fit the window closed on the press). All seven were fixed with regression tests on 7 October. Reports of 7 October (Linux, macOS, Windows): the app opened the demo project on every launch, so a new comp landed in it (#204); a comp wider than the GPU's texture limit (11000 × 2200) at Full resolution stopped the window drawing (#201); an Intel HD Graphics 5500 couldn't start the app (#198: most likely the window's device asked for limits that GPU doesn't have, and the failure was silent); Audio Spectrum / Waveform stood still in the viewer (#209) and preview sound waited for the whole work area to cache (#208); a layer couldn't be deselected from the time graph, a shape layer's Fill and Stroke showed only with a shape tool and a drawn shape had no stroke to change, Alt+Shift+P didn't reveal Position (#205); a mask selected in the Timeline wasn't selected in the viewer, Mask Feather had no link and took negative values, the Project panel had no selection box (#203); shape layers had no Add menu for Trim Paths and the other operations, and Classic 3D comps hid Geometry Options (#206); dragging Puppet pins re-rendered the layer under the Puppet at every move (#212). All were fixed with regression tests the same day (#219–#222); the #198 fix couldn't be checked on that GPU. Reports of 8 October (browser, Windows, macOS): an empty project at 1280 × 800 with device pixel ratio 2 crashed on its first frame, because the Project panel's scroll bar clamped its thumb to a track shorter than the thumb (#231, any short panel on every platform); Media Browser ▸ Add Files… dropped a file it couldn't read without a word (#226); after the page's WebGPU device was lost, the browser editor froze on its last frame while edits went on (#225); a press in the viewer always took the topmost layer, so a selected layer behind others couldn't be dragged (#230); the language didn't follow the system's (#229); and a list of missing After Effects behaviour (#227): drawing into, copying, pasting and duplicating shape contents, Tool Creates Shape / Mask and Fill / Stroke Options, Turbulent Displace, Wave Warp and Bulge pinning all but a shape layer's bottom-right quadrant, a Spacebar hold that previewed instead of being the Hand tool, the Effect menu in Effect Controls, dropping items on New Composition and dragging over layer switches. All were fixed with regression tests the same day (#235, #237–#241); multi-monitor support and the Project panel's empty-area menu (community PR #210) remain from #227, and effect points on shape and text layers still sit half a comp off. A list of tweaks from an Intel iMac (#290): the layer bar didn't show where extended footage runs past its source, and Enable Time Remapping then ended at the extended out point; footage items had no Interpret Footage in their menu and the work area bar no menu; Label menus named the labels without their colours; the arrow keys didn't nudge layers; a straight motion path had no Bezier handles; Delete on Time Remap deleted the layer; a mask being drawn with the Pen blacked out its layer until it was closed; a double-click on a mask point didn't select the whole mask. All were fixed with regression tests the same day; the rest of #290 had been fixed already (#221, #238, #255) or came with community PRs #210 (the Timeline's empty-area menu) and #213 (tool flyouts on a long press). A report of 9 October (#397): CC Particle World ignored the comp camera and looked flat. It now sees its particles through an active camera layer, as After Effects does, and through its own Extras ▸ Effect Camera (Distance, Rotation X / Y / Z, FOV, added) otherwise; the layer cache also missed camera and light moves for the effects that read them (Card Dance, Shatter, Card Wipe, Caustics). Fixed with regression tests the same day. Most checking happens on macOS. Localisation covers the menus in Japanese, Simplified and Traditional Chinese, and Ukrainian, and since 9 October the cataloged panels, dialogs and tooltips too (Simplified and Traditional Chinese, and Ukrainian; the Japanese rows of the panel catalog are still open); no accessibility work ### G3. Stability and a green main diff --git a/docs/target-app-parity.md b/docs/target-app-parity.md index 20b00dae..46cdb003 100644 --- a/docs/target-app-parity.md +++ b/docs/target-app-parity.md @@ -252,7 +252,7 @@ agent-generated maintainer replies: list of Mac issues, so people are trying it on real work. - **Open issues (136):** ≈ 95 are core-path bugs (masks, keyframes, timeline, preview, audio, text, render, crashes; this includes 15 community `fix(...)` proposals), ≈ 40 are feature - requests or niche (plug-in hosting, OpenFX, ffmpeg export, Discord presence, Store listing, + requests or niche (plug-in hosting, OpenFX, ffmpeg export, Store listing, rigging tools). Mostly core-path bugs, which matches the discounts above. ## Out of scope by design @@ -828,7 +828,7 @@ meanwhile. Footage, solids, proxies and the project settings are hashed by value states are kept, so a long drag doesn't hold on to every intermediate state. The disk cache's content key now also covers proxies and Use Proxy. -Since (M13.30–M13.31): the Tools bar and About dialog carry the ArtCraft mark. The +Since (M13.30–M13.31): the Tools bar and About dialog carry the app mark. The Home screen is laid out like After Effects' and covers the whole workspace. A left rail holds New Project / Open Project, the Home, Templates and Learn pages and, at its foot, the community links. The Home page has a "Welcome to EffectCraft" heading, quick-start tiles (New Composition, diff --git a/packaging/linux/ai.storyteller.effectcraft.metainfo.xml.in b/packaging/linux/ai.storyteller.effectcraft.metainfo.xml.in index d8377c4c..fbdb1a5a 100644 --- a/packaging/linux/ai.storyteller.effectcraft.metainfo.xml.in +++ b/packaging/linux/ai.storyteller.effectcraft.metainfo.xml.in @@ -20,10 +20,10 @@ ai.storyteller.effectcraft.desktop ai.storyteller.effectcraft - https://getartcraft.com/apps/effectcraft + https://github.com/storytold/effectcraft https://github.com/storytold/effectcraft/issues https://github.com/storytold/effectcraft - https://discord.gg/artcraft + https://github.com/storytold/effectcraft/issues Graphics RasterGraphics diff --git a/packaging/linux/nfpm.yaml b/packaging/linux/nfpm.yaml index 76d41450..9efeacfe 100644 --- a/packaging/linux/nfpm.yaml +++ b/packaging/linux/nfpm.yaml @@ -14,7 +14,7 @@ section: graphics priority: optional maintainer: ${EFFECTCRAFT_MAINTAINER} vendor: Learning Machines LLC -homepage: https://getartcraft.com/apps/effectcraft +homepage: https://github.com/storytold/effectcraft license: MIT OR Apache-2.0 description: |- Open-source motion graphics and visual effects compositor. diff --git a/packaging/windows/effectcraft.wxs b/packaging/windows/effectcraft.wxs index 00b0c5d6..ba820733 100644 --- a/packaging/windows/effectcraft.wxs +++ b/packaging/windows/effectcraft.wxs @@ -27,9 +27,9 @@ - - - + + +