app icon: unicorn (owner's ArtCraft drawing), Dock/taskbar/launcher wiring, palette docs
- assets/app-icon/: master and light SVGs, 1024 px PNG, .icns (Apple grid), .ico (16-256), hicolor 16-512 + scalable, LICENSE.txt, README with palette (#e0368f / #efe9dc / #0b0b0c), tile geometry and provenance; attribution sidecars + ATTRIBUTION.md rows. - packaging/icons.sh regenerates everything with resvg, iconutil and the new `cargo xtask ico`. - Runtime icon via ViewportBuilder::with_icon (padded variant on macOS) and Wayland app ID ai.storyteller.effectcraft; packaging/linux/ai.storyteller.effectcraft.desktop. - apps/effectcraft/build.rs embeds the .ico and VERSIONINFO into effectcraft.exe (winresource, Windows targets only; a missing resource compiler is a warning). - Web favicon.svg is now the unicorn icon. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
No files matched your search
@@ -16,7 +16,22 @@ iconography, images or other Adobe assets; open licences only; every asset attri
|
||||
| `assets/fonts/Inter-Italic.ttf` | The Inter Project Authors | https://github.com/rsms/inter | OFL-1.1 (`assets/fonts/OFL-Inter.txt`) |
|
||||
| `assets/fonts/NotoSerif-Regular.ttf` | The Noto Project Authors | https://github.com/notofonts/latin-greek-cyrillic | OFL-1.1 (`assets/fonts/OFL-NotoSerif.txt`) |
|
||||
| `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, the code-drawn EffectCraft mark (split rounded square, keyframe diamond) as SVG | MIT OR Apache-2.0 |
|
||||
| `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`) |
|
||||
| `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`) |
|
||||
| `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 |
|
||||
|
||||
@@ -1137,6 +1137,7 @@ dependencies = [
|
||||
"rfd",
|
||||
"serde_json",
|
||||
"winit",
|
||||
"winresource",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -4687,10 +4688,12 @@ version = "1.1.6+spec-1.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "920602543f0911ab71da12c50d59701da54c196d1a2bf5cb4b75667f137a406a"
|
||||
dependencies = [
|
||||
"indexmap",
|
||||
"serde_core",
|
||||
"serde_spanned",
|
||||
"toml_datetime",
|
||||
"toml_parser",
|
||||
"toml_writer",
|
||||
"winnow",
|
||||
]
|
||||
|
||||
@@ -4724,6 +4727,12 @@ dependencies = [
|
||||
"winnow",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "toml_writer"
|
||||
version = "1.1.2+spec-1.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7d56353a2a665ad0f41a421187180aab746c8c325620617ad883a99a1cbe66d2"
|
||||
|
||||
[[package]]
|
||||
name = "tracing"
|
||||
version = "0.1.44"
|
||||
@@ -5763,6 +5772,16 @@ dependencies = [
|
||||
"memchr",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "winresource"
|
||||
version = "0.1.31"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0986a8b1d586b7d3e4fe3d9ea39fb451ae22869dcea4aa109d287a374d866087"
|
||||
dependencies = [
|
||||
"toml",
|
||||
"version_check",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wit-bindgen"
|
||||
version = "0.57.1"
|
||||
|
||||
@@ -7,6 +7,10 @@
|
||||
</a>
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<img alt="EffectCraft app icon: an engraved unicorn on EffectCraft pink (#e0368f)" src="assets/app-icon/effectcraft-1024.png" width="128">
|
||||
</p>
|
||||
|
||||
<h1 align="center">EffectCraft</h1>
|
||||
|
||||
<p align="center">
|
||||
|
||||
@@ -1,8 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64">
|
||||
<!-- EffectCraft mark (original work): the header logo of crates/ui-egui/src/header.rs as SVG:
|
||||
a navy rounded square split blue/violet with a white keyframe diamond. -->
|
||||
<rect x="0" y="0" width="64" height="64" rx="12" fill="#1d2b5e"/>
|
||||
<path d="M14 4 H32 V60 H14 A10 10 0 0 1 4 50 V14 A10 10 0 0 1 14 4 Z" fill="#2d8ceb"/>
|
||||
<path d="M32 4 H50 A10 10 0 0 1 60 14 V50 A10 10 0 0 1 50 60 H32 Z" fill="#8e6bff"/>
|
||||
<path d="M32 15.4 L48.6 32 L32 48.6 L15.4 32 Z" fill="#ffffff"/>
|
||||
</svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><defs><clipPath id="t"><rect width="512" height="512" rx="112"/></clipPath></defs><g clip-path="url(#t)"><rect width="512" height="512" fill="#e0368f"/><path fill="#efe9dc" fill-rule="evenodd" d="M103 505C71 503 41 485 23 458L20 453 21 451C22 448 25 444 27 444C28 444 29 444 30 443C31 442 33 442 35 441C38 441 39 440 41 438L43 436 43 430C43 425 43 424 42 422C41 421 41 420 41 416C41 411 41 410 40 408C40 408 39 406 38 404C38 401 38 401 34 398C31 396 28 390 27 386L27 383 24 383C19 382 17 380 14 374C10 365 17 354 26 356C30 358 30 358 30 350C30 343 31 340 34 337C35 335 35 335 32 333C29 331 29 331 25 326C23 323 22 321 22 312C22 308 21 303 21 301C21 296 21 294 23 290C23 289 25 286 25 284C28 279 36 272 43 268C48 266 49 266 52 263C55 260 55 259 56 255C56 253 56 253 55 251C54 250 53 247 53 244C52 241 52 240 50 238C44 233 51 215 61 208C61 208 62 207 62 206C62 204 63 203 63 202C64 201 65 199 66 197C66 195 68 192 68 190C69 189 70 187 70 186C71 181 84 169 89 168C89 168 91 168 92 168C93 167 95 167 97 167C99 168 107 165 107 164C107 164 107 162 105 161C101 158 102 151 107 146C110 143 110 143 109 140C109 137 110 134 112 131C113 130 114 129 114 129C114 128 127 116 129 115C130 115 133 114 135 112C140 109 141 109 144 108C146 108 148 107 149 107C155 103 172 100 180 102C182 103 188 102 189 100C191 99 190 98 188 97C184 94 184 90 187 87C188 85 190 85 190 86C191 86 192 86 193 85C199 79 206 78 214 81C217 83 220 84 221 84C223 85 227 87 229 89C234 95 239 95 243 91C245 88 245 82 243 80C239 77 232 80 233 83C234 86 234 86 233 86C232 86 231 82 231 80C230 71 252 74 255 84C255 85 256 85 258 87C262 88 262 88 263 86C264 84 270 78 273 77C274 76 276 74 276 74C277 72 282 68 282 68C283 67 287 65 289 62C290 62 291 61 292 61C292 61 294 60 295 59C296 58 298 56 300 56C301 55 303 53 305 52C307 50 309 48 310 48L312 46 313 48C314 49 314 49 314 52C313 54 314 55 314 56C315 57 315 59 315 60C315 61 315 62 315 62C316 62 316 64 316 65C316 66 316 68 317 69C319 74 320 86 318 99C316 112 316 112 321 107C323 105 325 103 326 103C326 103 327 102 328 101C329 100 334 98 336 98C336 98 338 97 339 96C340 95 342 94 342 94C343 94 345 93 346 92C350 91 350 94 349 109C349 115 349 117 346 122C344 128 346 127 354 120C357 117 361 113 362 113C363 112 365 111 366 109C367 108 369 107 370 106C371 106 372 105 373 104C374 103 377 101 379 101C380 101 382 99 383 98C385 96 387 95 389 94C391 93 392 92 393 91C394 89 396 88 397 87C398 87 400 85 401 84C403 83 405 81 407 80C409 79 411 78 412 77C413 75 415 73 420 70C421 70 422 68 423 67C425 65 427 64 429 63C431 62 434 61 435 60C437 57 453 46 455 45C455 45 457 44 459 43C461 41 463 40 464 40L465 40 465 44C465 46 465 47 465 48C464 49 464 50 463 50C460 58 458 62 457 63C456 63 455 65 455 66C454 67 453 69 451 71C449 73 447 76 446 77C445 78 444 80 443 80C443 80 442 82 441 83C440 85 439 86 438 87C436 88 435 89 434 90C434 92 432 93 431 94C431 95 429 97 428 99C426 101 421 106 418 107C416 108 415 109 414 111C413 114 410 117 407 119C405 119 404 120 403 123C401 127 395 133 393 134C391 135 390 136 390 138C389 140 387 144 387 144C386 144 385 145 384 146C382 148 380 148 379 148C377 149 376 150 376 152C376 153 375 155 374 156C372 159 373 159 376 159C385 159 391 177 386 188C384 191 378 196 376 197C374 198 373 198 374 201C376 206 382 208 384 205C385 203 386 203 386 205C386 207 384 209 383 210C381 211 381 211 379 212C378 213 378 213 376 213C375 212 374 212 374 212C373 212 373 213 374 217C375 220 374 223 371 226C369 229 369 228 374 234C376 237 379 240 379 241C380 242 381 244 382 245C383 246 384 249 385 251C386 253 388 255 389 256C389 257 390 259 390 259C390 260 390 261 391 262C391 262 392 264 393 266C394 268 395 270 396 270C397 271 398 272 398 273C398 274 399 276 400 277C401 278 403 281 404 282C405 284 407 287 409 288C410 290 411 292 411 293C411 294 412 295 413 295C413 296 414 297 414 298C415 299 416 301 417 302C418 304 419 305 419 305C419 305 421 308 424 311C429 316 432 320 433 323C433 324 434 326 435 327C435 327 436 329 436 331C436 332 437 334 437 335C438 337 440 346 440 349C439 351 440 354 440 356C440 362 438 367 434 371C431 375 430 376 429 381C426 389 421 395 416 396C414 396 413 396 412 398C408 403 396 405 390 401C386 398 382 399 378 403C377 404 376 405 376 405C375 405 374 405 374 406C372 409 361 410 357 408C351 406 346 399 344 391C343 388 343 387 341 384C339 383 338 381 338 381C338 381 337 380 336 379C333 378 328 373 326 369L324 366 321 366C318 366 318 366 315 364C314 362 313 361 312 361C311 361 306 359 305 358C304 357 301 356 299 354C291 350 288 348 286 343C284 340 284 340 281 339C276 338 275 338 273 336C272 334 271 334 269 334C267 334 264 334 262 333C260 332 258 332 257 332C257 333 258 341 259 343C260 344 261 345 261 347C261 348 262 350 262 350C263 351 264 353 264 353C264 354 266 356 267 358C269 359 271 361 271 362C271 363 274 366 278 368C278 369 280 370 281 372C281 373 282 374 283 375C286 377 290 382 291 383C291 384 293 386 295 388C297 390 299 392 300 393C301 395 305 399 308 401C312 403 319 409 32Line truncated
|
||||
|
Before Width: | Height: | Size: 558 B After Width: | Height: | Size: 343 KiB |
@@ -1,9 +1,8 @@
|
||||
asset: favicon.svg
|
||||
title: EffectCraft web app icon (favicon)
|
||||
author: EffectCraft contributors
|
||||
author: EffectCraft contributors (drawing by the project owner in ArtCraft)
|
||||
source: original work
|
||||
license: MIT OR Apache-2.0
|
||||
added: 2026-10-01 by EffectCraft contributors (Claude agent, M15 web app)
|
||||
notes: Hand-written SVG of the code-drawn EffectCraft mark (`paint_logo` in
|
||||
crates/ui-egui/src/header.rs): a navy rounded square split into blue and violet halves
|
||||
with a white keyframe diamond, from basic shapes. Not derived from any other product's icon.
|
||||
license-file: assets/app-icon/LICENSE.txt
|
||||
added: 2026-10-02 by EffectCraft contributors (Claude agent, app icon)
|
||||
notes: Copy of assets/app-icon/effectcraft-small.svg (the lighter vector trace of the app icon). Replaces the earlier code-drawn split-square mark.
|
||||
@@ -19,6 +19,10 @@ serde_json = { workspace = true }
|
||||
rfd = { workspace = true }
|
||||
cpal = { workspace = true }
|
||||
|
||||
[build-dependencies]
|
||||
# Icon + VERSIONINFO for effectcraft.exe; build.rs only uses it when targeting Windows.
|
||||
winresource = "0.1"
|
||||
|
||||
[target.'cfg(target_os = "macos")'.dependencies]
|
||||
# Same winit as eframe: macOS event-loop options (no app activation when driven by an agent).
|
||||
winit = { version = "0.30", default-features = false }
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
//! Windows only: embed the app icon and version info (VERSIONINFO) into `effectcraft.exe`.
|
||||
//!
|
||||
//! On every other target this does nothing. A missing resource compiler is a warning, so a
|
||||
//! cross-compile from macOS or Linux still links, unless `EFFECTCRAFT_REQUIRE_WINRES=1` turns it
|
||||
//! into an error (for release builds).
|
||||
|
||||
fn main() {
|
||||
println!("cargo:rerun-if-changed=build.rs");
|
||||
println!("cargo:rerun-if-changed=../../assets/app-icon/effectcraft.ico");
|
||||
println!("cargo:rerun-if-env-changed=EFFECTCRAFT_REQUIRE_WINRES");
|
||||
if std::env::var("CARGO_CFG_TARGET_OS").as_deref() != Ok("windows") {
|
||||
return;
|
||||
}
|
||||
let mut res = winresource::WindowsResource::new();
|
||||
res.set_icon("../../assets/app-icon/effectcraft.ico")
|
||||
.set("ProductName", "EffectCraft")
|
||||
.set("FileDescription", "EffectCraft motion graphics and visual effects")
|
||||
.set("LegalCopyright", "Copyright (c) 2026 The EffectCraft contributors. MIT OR Apache-2.0.")
|
||||
.set("OriginalFilename", "effectcraft.exe")
|
||||
.set("InternalName", "effectcraft");
|
||||
if let Err(e) = res.compile() {
|
||||
if std::env::var_os("EFFECTCRAFT_REQUIRE_WINRES").is_some() {
|
||||
panic!("embedding Windows resources failed: {e}");
|
||||
}
|
||||
println!("cargo:warning=effectcraft.exe built without icon/version resources: {e}");
|
||||
}
|
||||
}
|
||||
@@ -11,6 +11,16 @@ mod control_server;
|
||||
use effectcraft_ui_egui::EffectcraftApp;
|
||||
use serde_json::json;
|
||||
|
||||
/// The app icon for the window, taskbar and Dock (assets/app-icon, regenerated by
|
||||
/// `packaging/icons.sh`). macOS gets the padded variant so it sits on Apple's icon grid in the Dock.
|
||||
fn app_icon() -> egui::IconData {
|
||||
#[cfg(target_os = "macos")]
|
||||
let png: &[u8] = include_bytes!("../../../assets/app-icon/effectcraft-macos-512.png");
|
||||
#[cfg(not(target_os = "macos"))]
|
||||
let png: &[u8] = include_bytes!("../../../assets/app-icon/hicolor/256x256/apps/ai.storyteller.effectcraft.png");
|
||||
eframe::icon_data::from_png_bytes(png).unwrap_or_default()
|
||||
}
|
||||
|
||||
fn main() -> eframe::Result {
|
||||
let mut control_port: Option<u16> = std::env::var("EFFECTCRAFT_CONTROL_PORT").ok().and_then(|p| p.parse().ok());
|
||||
let mut files = Vec::new();
|
||||
@@ -37,7 +47,10 @@ fn main() -> eframe::Result {
|
||||
.with_min_inner_size([960.0, 600.0])
|
||||
.with_drag_and_drop(true)
|
||||
// Started for an agent (`--control`): open without taking the user's keyboard focus.
|
||||
.with_active(control_port.is_none()),
|
||||
.with_active(control_port.is_none())
|
||||
.with_icon(app_icon())
|
||||
// Wayland matches the window to `ai.storyteller.effectcraft.desktop` by this ID.
|
||||
.with_app_id("ai.storyteller.effectcraft"),
|
||||
event_loop_builder: agent_event_loop(control_port.is_some()),
|
||||
..Default::default()
|
||||
};
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
EffectCraft app icon (effectcraft.svg, effectcraft-small.svg and every file derived from them in
|
||||
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
|
||||
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)
|
||||
* MIT license (https://opensource.org/licenses/MIT)
|
||||
|
||||
at your option.
|
||||
|
||||
Regenerate the derived files with packaging/icons.sh.
|
||||
@@ -0,0 +1,42 @@
|
||||
# EffectCraft app icon
|
||||
|
||||
**Creature:** a unicorn, as an engraved head-and-shoulders bust looking out of the tile.
|
||||
|
||||
**Style:** an ink engraving portrait in the Crafting Apps' owl-template framing (the FilmCraft owl):
|
||||
full-bleed colour field, tight head-and-shoulders crop, the body running off the bottom and right edges.
|
||||
|
||||
**Tile:** 512 × 512 viewBox, rounded square `rx=112`, clipped; no border or roundel.
|
||||
|
||||
**Palette** (exactly three colours):
|
||||
|
||||
| Colour | Hex | Used for |
|
||||
|---|---|---|
|
||||
| App colour (EffectCraft pink) | `#e0368f` | the full-bleed field |
|
||||
| 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
|
||||
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).
|
||||
|
||||
## Files
|
||||
|
||||
| File | What |
|
||||
|---|---|
|
||||
| `effectcraft.svg` | master vector, traced at 2048 px (canonical) |
|
||||
| `effectcraft-small.svg` | lighter vector (~350 KB), traced at 1024 px; also the web favicon |
|
||||
| `effectcraft-1024.png` | 1024 px render |
|
||||
| `effectcraft-macos-512.png` | runtime Dock icon on macOS, on Apple's 824/1024 grid |
|
||||
| `effectcraft.icns` | macOS icon (Apple grid) |
|
||||
| `effectcraft.ico` | Windows icon, 16–256 px; embedded in `effectcraft.exe` by `apps/effectcraft/build.rs` |
|
||||
| `hicolor/<n>x<n>/apps/ai.storyteller.effectcraft.png` | Linux icon theme, 16–512 px; the 256 px one is the runtime icon on Windows and Linux |
|
||||
| `hicolor/scalable/apps/ai.storyteller.effectcraft.svg` | Linux scalable icon |
|
||||
|
||||
App ID: `ai.storyteller.effectcraft` (Wayland app ID, `packaging/linux/ai.storyteller.effectcraft.desktop`).
|
||||
|
||||
## Regenerate
|
||||
|
||||
Copy a new `icon-master.svg` / `icon.svg` from craftrules `assets/app-icons/effectcraft/` over
|
||||
`effectcraft.svg` / `effectcraft-small.svg`, then run `packaging/icons.sh` (needs `resvg`; `iconutil`
|
||||
on macOS for the `.icns`). Copy `effectcraft-small.svg` to `apps/effectcraft-web/web/favicon.svg` too.
|
||||
|
After Width: | Height: | Size: 347 KiB |
@@ -0,0 +1,8 @@
|
||||
asset: effectcraft-1024.png
|
||||
title: EffectCraft app icon, 1024 px
|
||||
author: EffectCraft contributors (drawing by the project owner in ArtCraft)
|
||||
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: Rendered from effectcraft.svg with resvg by packaging/icons.sh.
|
||||
|
After Width: | Height: | Size: 114 KiB |
@@ -0,0 +1,8 @@
|
||||
asset: effectcraft-macos-512.png
|
||||
title: EffectCraft runtime Dock icon (macOS)
|
||||
author: EffectCraft contributors (drawing by the project owner in ArtCraft)
|
||||
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: Rendered from effectcraft.svg on Apple's 824/1024 icon grid with resvg by packaging/icons.sh; embedded by apps/effectcraft/src/main.rs.
|
||||
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><defs><clipPath id="t"><rect width="512" height="512" rx="112"/></clipPath></defs><g clip-path="url(#t)"><rect width="512" height="512" fill="#e0368f"/><path fill="#efe9dc" fill-rule="evenodd" d="M103 505C71 503 41 485 23 458L20 453 21 451C22 448 25 444 27 444C28 444 29 444 30 443C31 442 33 442 35 441C38 441 39 440 41 438L43 436 43 430C43 425 43 424 42 422C41 421 41 420 41 416C41 411 41 410 40 408C40 408 39 406 38 404C38 401 38 401 34 398C31 396 28 390 27 386L27 383 24 383C19 382 17 380 14 374C10 365 17 354 26 356C30 358 30 358 30 350C30 343 31 340 34 337C35 335 35 335 32 333C29 331 29 331 25 326C23 323 22 321 22 312C22 308 21 303 21 301C21 296 21 294 23 290C23 289 25 286 25 284C28 279 36 272 43 268C48 266 49 266 52 263C55 260 55 259 56 255C56 253 56 253 55 251C54 250 53 247 53 244C52 241 52 240 50 238C44 233 51 215 61 208C61 208 62 207 62 206C62 204 63 203 63 202C64 201 65 199 66 197C66 195 68 192 68 190C69 189 70 187 70 186C71 181 84 169 89 168C89 168 91 168 92 168C93 167 95 167 97 167C99 168 107 165 107 164C107 164 107 162 105 161C101 158 102 151 107 146C110 143 110 143 109 140C109 137 110 134 112 131C113 130 114 129 114 129C114 128 127 116 129 115C130 115 133 114 135 112C140 109 141 109 144 108C146 108 148 107 149 107C155 103 172 100 180 102C182 103 188 102 189 100C191 99 190 98 188 97C184 94 184 90 187 87C188 85 190 85 190 86C191 86 192 86 193 85C199 79 206 78 214 81C217 83 220 84 221 84C223 85 227 87 229 89C234 95 239 95 243 91C245 88 245 82 243 80C239 77 232 80 233 83C234 86 234 86 233 86C232 86 231 82 231 80C230 71 252 74 255 84C255 85 256 85 258 87C262 88 262 88 263 86C264 84 270 78 273 77C274 76 276 74 276 74C277 72 282 68 282 68C283 67 287 65 289 62C290 62 291 61 292 61C292 61 294 60 295 59C296 58 298 56 300 56C301 55 303 53 305 52C307 50 309 48 310 48L312 46 313 48C314 49 314 49 314 52C313 54 314 55 314 56C315 57 315 59 315 60C315 61 315 62 315 62C316 62 316 64 316 65C316 66 316 68 317 69C319 74 320 86 318 99C316 112 316 112 321 107C323 105 325 103 326 103C326 103 327 102 328 101C329 100 334 98 336 98C336 98 338 97 339 96C340 95 342 94 342 94C343 94 345 93 346 92C350 91 350 94 349 109C349 115 349 117 346 122C344 128 346 127 354 120C357 117 361 113 362 113C363 112 365 111 366 109C367 108 369 107 370 106C371 106 372 105 373 104C374 103 377 101 379 101C380 101 382 99 383 98C385 96 387 95 389 94C391 93 392 92 393 91C394 89 396 88 397 87C398 87 400 85 401 84C403 83 405 81 407 80C409 79 411 78 412 77C413 75 415 73 420 70C421 70 422 68 423 67C425 65 427 64 429 63C431 62 434 61 435 60C437 57 453 46 455 45C455 45 457 44 459 43C461 41 463 40 464 40L465 40 465 44C465 46 465 47 465 48C464 49 464 50 463 50C460 58 458 62 457 63C456 63 455 65 455 66C454 67 453 69 451 71C449 73 447 76 446 77C445 78 444 80 443 80C443 80 442 82 441 83C440 85 439 86 438 87C436 88 435 89 434 90C434 92 432 93 431 94C431 95 429 97 428 99C426 101 421 106 418 107C416 108 415 109 414 111C413 114 410 117 407 119C405 119 404 120 403 123C401 127 395 133 393 134C391 135 390 136 390 138C389 140 387 144 387 144C386 144 385 145 384 146C382 148 380 148 379 148C377 149 376 150 376 152C376 153 375 155 374 156C372 159 373 159 376 159C385 159 391 177 386 188C384 191 378 196 376 197C374 198 373 198 374 201C376 206 382 208 384 205C385 203 386 203 386 205C386 207 384 209 383 210C381 211 381 211 379 212C378 213 378 213 376 213C375 212 374 212 374 212C373 212 373 213 374 217C375 220 374 223 371 226C369 229 369 228 374 234C376 237 379 240 379 241C380 242 381 244 382 245C383 246 384 249 385 251C386 253 388 255 389 256C389 257 390 259 390 259C390 260 390 261 391 262C391 262 392 264 393 266C394 268 395 270 396 270C397 271 398 272 398 273C398 274 399 276 400 277C401 278 403 281 404 282C405 284 407 287 409 288C410 290 411 292 411 293C411 294 412 295 413 295C413 296 414 297 414 298C415 299 416 301 417 302C418 304 419 305 419 305C419 305 421 308 424 311C429 316 432 320 433 323C433 324 434 326 435 327C435 327 436 329 436 331C436 332 437 334 437 335C438 337 440 346 440 349C439 351 440 354 440 356C440 362 438 367 434 371C431 375 430 376 429 381C426 389 421 395 416 396C414 396 413 396 412 398C408 403 396 405 390 401C386 398 382 399 378 403C377 404 376 405 376 405C375 405 374 405 374 406C372 409 361 410 357 408C351 406 346 399 344 391C343 388 343 387 341 384C339 383 338 381 338 381C338 381 337 380 336 379C333 378 328 373 326 369L324 366 321 366C318 366 318 366 315 364C314 362 313 361 312 361C311 361 306 359 305 358C304 357 301 356 299 354C291 350 288 348 286 343C284 340 284 340 281 339C276 338 275 338 273 336C272 334 271 334 269 334C267 334 264 334 262 333C260 332 258 332 257 332C257 333 258 341 259 343C260 344 261 345 261 347C261 348 262 350 262 350C263 351 264 353 264 353C264 354 266 356 267 358C269 359 271 361 271 362C271 363 274 366 278 368C278 369 280 370 281 372C281 373 282 374 283 375C286 377 290 382 291 383C291 384 293 386 295 388C297 390 299 392 300 393C301 395 305 399 308 401C312 403 319 409 32Line truncated
|
||||
|
After Width: | Height: | Size: 343 KiB |
@@ -0,0 +1,8 @@
|
||||
asset: effectcraft-small.svg
|
||||
title: EffectCraft app icon, light vector
|
||||
author: EffectCraft contributors (drawing by the project owner in ArtCraft)
|
||||
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 same drawing vectorised at 1024 px with craftrules vectorize_tile.py, about 350 KB, for places where size matters.
|
||||
@@ -0,0 +1,8 @@
|
||||
asset: effectcraft.icns
|
||||
title: EffectCraft macOS app icon
|
||||
author: EffectCraft contributors (drawing by the project owner in ArtCraft)
|
||||
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: Rendered from effectcraft.svg on Apple's 824/1024 icon grid with resvg and iconutil by packaging/icons.sh.
|
||||
|
After Width: | Height: | Size: 89 KiB |
@@ -0,0 +1,8 @@
|
||||
asset: effectcraft.ico
|
||||
title: EffectCraft Windows app icon
|
||||
author: EffectCraft contributors (drawing by the project owner in ArtCraft)
|
||||
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: Rendered from effectcraft.svg (16-256 px) with resvg and packed by cargo xtask ico (packaging/icons.sh).
|
||||
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><defs><clipPath id="t"><rect width="512" height="512" rx="112"/></clipPath></defs><g clip-path="url(#t)"><rect width="512" height="512" fill="#e0368f"/><path fill="#efe9dc" fill-rule="evenodd" d="M101.8 505.4C71.2 502.3 43.3 486.2 25.6 461.1C23.1 457.6 20.2 452.9 20.3 452.4C20.3 450.6 21.5 448.2 23 447C23.6 446.6 24 446.1 24 445.9C24 445.2 25.4 444.3 27.2 443.9C28.1 443.7 29.7 443.2 30.5 442.8C31.4 442.4 33.5 441.7 35.1 441.2C38.2 440.4 39.4 439.8 41.3 438C42.9 436.6 43.3 435.6 43.5 431.9C43.8 427.4 43.5 425.4 42.1 422.2L41.3 420.3 41.3 415.6C41.3 410.6 41.3 410.3 40 408.4C39.1 406.9 38.2 404.4 38.2 403.1C38.3 401.5 36.9 400 34.4 398.6C32.1 397.4 31.1 396.2 29.4 392.7C27.7 389.1 27 387.1 27 385.2C27 383.5 26.5 383.1 24.1 382.8C20.2 382.2 18 380.9 16.6 378.2C16.1 377.2 15.3 375.9 14.9 375.3C13 372.9 12.5 365.9 14 362.7C14.5 361.4 17 358.3 18.1 357.6C18.9 357 22.4 356 23.6 356C24 356 24.8 356.2 25.4 356.4C26.6 356.8 29.9 357.2 30.1 356.8C30.2 356.7 30 355.8 29.8 354.9C29.2 352.3 29.3 346.3 30 343.6C30.7 340.9 32.1 338.5 33.7 337C35.1 335.8 35.1 335.8 34.7 335.1C34.4 334.8 33.8 334.3 33.2 334C30.3 332.5 27.9 330.4 26.3 327.9C25.7 326.9 24.8 325.7 24.4 325.2C23.8 324.6 23.5 323.9 23.3 322.8C23.1 322 22.8 320.8 22.6 320C22.2 318.6 21.9 313.1 22 307.5C22 305.4 21.9 304.9 21.5 304C20.9 303 20.9 302.6 20.9 298.8C20.9 294.2 21.3 292.7 23 289.8C23.4 289.1 24 287.7 24.4 286.6C26 281.7 30.8 275.9 36.1 272.4C39.3 270.3 42.1 268.8 44.3 267.9C47.9 266.4 50.1 264.9 52.4 262.4C54.9 259.8 55.4 258.9 56 255.6C56.5 252.8 56.4 252.2 55.2 250.8C54 249.4 53.5 248.1 52.7 243.8C52.3 241.6 52 239.8 52 239.7C52 239.6 51.4 239.1 50.6 238.6C48.9 237.5 48.5 236.5 48.2 232.9C47.8 227.8 48.2 225.1 50.1 221.4C52.1 217.3 53.6 215.4 59.1 209.9C61.9 207.1 62 207 62 205.9C62 204.7 62.8 202.8 64.2 200.8C64.8 200.1 65.2 199.2 65.2 198.9C65.2 197.7 66.3 194.6 67.8 191.6C68.7 189.8 69.7 187.4 70.1 186.2C70.7 184.1 71.1 183.5 74 179.6C74.4 179 75.3 178 76 177.5C76.7 176.9 77.6 176.1 77.9 175.6C78.7 174.3 81.9 171.2 82.4 171.2C82.5 171.3 83.2 170.9 83.9 170.4C85.7 169.2 86.7 168.8 88.5 168.5C89.4 168.3 90.4 168.1 90.8 167.9C91.9 167.3 94.8 166.9 96 167.3C97.7 167.7 99.9 167.4 102.1 166.4C103.2 165.9 104.2 165.5 104.4 165.5C104.9 165.5 106.3 164.8 106.9 164.2C107.7 163.5 107.6 162.8 106.8 162.4C105.6 161.8 103.7 159.9 103.3 159.1C102.9 158.1 102.9 154.6 103.3 152.7C103.8 149.9 106 146.2 108.1 144.8C109.6 143.7 109.9 142.9 109.5 140.8C108.8 137.2 109.5 134.8 112.1 131.6C112.9 130.7 113.8 129.4 114.1 128.8C114.4 128.1 115.4 127 117 125.7C119.6 123.4 121.3 121.6 122.9 119.5C124.2 117.7 126.5 116.1 128.2 115.6C130.7 114.9 134.7 112.6 138 110C139 109.2 142.2 108.2 145 107.9C147.4 107.6 147.8 107.5 149 106.7C149.8 106.2 151.7 105.4 153.5 104.8C155.2 104.2 157.6 103.4 158.8 103C159.9 102.6 161.5 102.2 162.2 102.1C163 102 165 101.7 166.7 101.5C170.2 100.9 176.8 101.1 179.4 101.8C181.6 102.5 182.4 102.5 183.5 102.1C184.1 101.9 185 101.8 185.4 101.8C186.1 101.7 188.2 101.1 189.5 100.4C190.9 99.7 190.1 97.7 188.1 96.7C185.9 95.6 184.7 93.7 184.7 91.5C184.6 87.9 188.3 83.8 190.1 85.5C191.1 86.5 192.9 85.9 193.8 84.2C194.2 83.5 194.6 83.1 195.5 82.7C197.8 81.7 199.2 81 200.7 79.9L202.3 78.9 205.5 79C209.1 79 209 79 213.9 81.4C215.7 82.3 217.3 83 217.5 83C217.6 83 218.1 83.2 218.6 83.4C219 83.6 220.2 84 221.2 84.3C223.9 85.1 226.3 86.5 228.8 89C232 92.1 235.2 94.1 237 94.1C239.6 94.1 242.7 91.9 244 89.1C245.2 86.7 244.9 81.9 243.4 80.3C241.7 78.4 237 78.2 234.9 79.9C232.8 81.7 232.6 82.7 233.7 84.8C234.3 86.1 234.3 86.8 233.5 86.7C232.9 86.7 231.8 85.4 231.5 84.2C231.3 83.6 231.1 82.8 231 82.5C229.2 77.3 231.6 75.1 239.1 75C243.8 74.9 245.6 75.2 247.9 76.5C252 78.8 253.6 80.4 254.9 83.8C255.5 85.5 256.2 86.2 257 86.2C257.4 86.2 259.6 87.2 261.1 88C261.8 88.4 261.9 88.3 262.6 86.8C263.3 85.3 264.4 83.9 266.5 81.8C267.2 81 268.3 79.8 268.8 79.2C269.4 78.5 270.2 77.8 270.9 77.5C271.6 77.2 272.5 76.7 272.9 76.3C273.4 76 274.1 75.6 274.5 75.5C274.9 75.4 275.5 74.7 276.4 73.4C277.1 72.3 278 71.2 278.5 70.9C278.9 70.6 279.7 69.8 280.3 69.1C281.1 68.3 282 67.6 283 67.2C284 66.7 284.7 66.1 285.4 65.3C285.9 64.7 286.7 64 287.2 63.8C287.7 63.6 288.6 62.9 289.2 62.2C289.9 61.5 290.7 61 291.1 60.9C292.7 60.5 293.4 60.1 295.2 58.5C296.1 57.6 297.4 56.6 297.9 56.4C298.4 56.2 299.1 55.8 299.4 55.7C301 54.7 301.7 54.3 302.8 53.4C303.4 52.9 304.1 52.5 304.2 52.5C304.3 52.5 305.2 51.7 306.3 50.7C308.4 48.6 311 46.7 311.7 46.7C311.9 46.7 312.5 47.2 313 47.8L313.8 48.9 313.6 51.9C313.5 54.9 313.5 55 314.2 56C314.8 57 314.8 57.4 314.9 59.4C314.9 61.3 314.9 61.7 315.5 62.4C316 63 316 63.4 316 65.1C315.9 67 316 67.3 316.9 69C318.3 72.1 319.5 81.2 319 86C318.8 87.4 318.8 88.9 318.9 89.3C319 89.7 318.9 90.8 318.8 91.8C316.8 104.8 316.2 109.7 316.6 110.2C317 110.8 317.9 110.5 318.6 109.6C319 109 319.9 108 320.7 107.2C321.5 106.5 322.5 105.4 323 104.8C323.6 104.1 324.3 103.5 325.3 103.2C326.3 102.8 327.3 102.1 328.4 101C329.2 100Line truncated
|
||||
|
After Width: | Height: | Size: 682 KiB |
@@ -0,0 +1,8 @@
|
||||
asset: effectcraft.svg
|
||||
title: EffectCraft app icon, master vector
|
||||
author: EffectCraft contributors (drawing by the project owner in ArtCraft)
|
||||
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.
|
||||
|
After Width: | Height: | Size: 17 KiB |
@@ -0,0 +1,8 @@
|
||||
asset: ai.storyteller.effectcraft.png
|
||||
title: EffectCraft app icon, Linux hicolor 128x128
|
||||
author: EffectCraft contributors (drawing by the project owner in ArtCraft)
|
||||
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: Rendered from effectcraft.svg with resvg by packaging/icons.sh.
|
||||
|
After Width: | Height: | Size: 733 B |
@@ -0,0 +1,8 @@
|
||||
asset: ai.storyteller.effectcraft.png
|
||||
title: EffectCraft app icon, Linux hicolor 16x16
|
||||
author: EffectCraft contributors (drawing by the project owner in ArtCraft)
|
||||
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: Rendered from effectcraft.svg with resvg by packaging/icons.sh.
|
||||
|
After Width: | Height: | Size: 1.2 KiB |
@@ -0,0 +1,8 @@
|
||||
asset: ai.storyteller.effectcraft.png
|
||||
title: EffectCraft app icon, Linux hicolor 24x24
|
||||
author: EffectCraft contributors (drawing by the project owner in ArtCraft)
|
||||
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: Rendered from effectcraft.svg with resvg by packaging/icons.sh.
|
||||
|
After Width: | Height: | Size: 56 KiB |
@@ -0,0 +1,8 @@
|
||||
asset: ai.storyteller.effectcraft.png
|
||||
title: EffectCraft app icon, Linux hicolor 256x256
|
||||
author: EffectCraft contributors (drawing by the project owner in ArtCraft)
|
||||
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: Rendered from effectcraft.svg with resvg by packaging/icons.sh. Also the runtime window/taskbar icon on Windows and Linux.
|
||||
|
After Width: | Height: | Size: 1.8 KiB |
@@ -0,0 +1,8 @@
|
||||
asset: ai.storyteller.effectcraft.png
|
||||
title: EffectCraft app icon, Linux hicolor 32x32
|
||||
author: EffectCraft contributors (drawing by the project owner in ArtCraft)
|
||||
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: Rendered from effectcraft.svg with resvg by packaging/icons.sh.
|
||||
|
After Width: | Height: | Size: 3.5 KiB |
@@ -0,0 +1,8 @@
|
||||
asset: ai.storyteller.effectcraft.png
|
||||
title: EffectCraft app icon, Linux hicolor 48x48
|
||||
author: EffectCraft contributors (drawing by the project owner in ArtCraft)
|
||||
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: Rendered from effectcraft.svg with resvg by packaging/icons.sh.
|
||||
|
After Width: | Height: | Size: 147 KiB |
@@ -0,0 +1,8 @@
|
||||
asset: ai.storyteller.effectcraft.png
|
||||
title: EffectCraft app icon, Linux hicolor 512x512
|
||||
author: EffectCraft contributors (drawing by the project owner in ArtCraft)
|
||||
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: Rendered from effectcraft.svg with resvg by packaging/icons.sh.
|
||||
|
After Width: | Height: | Size: 5.4 KiB |
@@ -0,0 +1,8 @@
|
||||
asset: ai.storyteller.effectcraft.png
|
||||
title: EffectCraft app icon, Linux hicolor 64x64
|
||||
author: EffectCraft contributors (drawing by the project owner in ArtCraft)
|
||||
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: Rendered from effectcraft.svg with resvg by packaging/icons.sh.
|
||||
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><defs><clipPath id="t"><rect width="512" height="512" rx="112"/></clipPath></defs><g clip-path="url(#t)"><rect width="512" height="512" fill="#e0368f"/><path fill="#efe9dc" fill-rule="evenodd" d="M103 505C71 503 41 485 23 458L20 453 21 451C22 448 25 444 27 444C28 444 29 444 30 443C31 442 33 442 35 441C38 441 39 440 41 438L43 436 43 430C43 425 43 424 42 422C41 421 41 420 41 416C41 411 41 410 40 408C40 408 39 406 38 404C38 401 38 401 34 398C31 396 28 390 27 386L27 383 24 383C19 382 17 380 14 374C10 365 17 354 26 356C30 358 30 358 30 350C30 343 31 340 34 337C35 335 35 335 32 333C29 331 29 331 25 326C23 323 22 321 22 312C22 308 21 303 21 301C21 296 21 294 23 290C23 289 25 286 25 284C28 279 36 272 43 268C48 266 49 266 52 263C55 260 55 259 56 255C56 253 56 253 55 251C54 250 53 247 53 244C52 241 52 240 50 238C44 233 51 215 61 208C61 208 62 207 62 206C62 204 63 203 63 202C64 201 65 199 66 197C66 195 68 192 68 190C69 189 70 187 70 186C71 181 84 169 89 168C89 168 91 168 92 168C93 167 95 167 97 167C99 168 107 165 107 164C107 164 107 162 105 161C101 158 102 151 107 146C110 143 110 143 109 140C109 137 110 134 112 131C113 130 114 129 114 129C114 128 127 116 129 115C130 115 133 114 135 112C140 109 141 109 144 108C146 108 148 107 149 107C155 103 172 100 180 102C182 103 188 102 189 100C191 99 190 98 188 97C184 94 184 90 187 87C188 85 190 85 190 86C191 86 192 86 193 85C199 79 206 78 214 81C217 83 220 84 221 84C223 85 227 87 229 89C234 95 239 95 243 91C245 88 245 82 243 80C239 77 232 80 233 83C234 86 234 86 233 86C232 86 231 82 231 80C230 71 252 74 255 84C255 85 256 85 258 87C262 88 262 88 263 86C264 84 270 78 273 77C274 76 276 74 276 74C277 72 282 68 282 68C283 67 287 65 289 62C290 62 291 61 292 61C292 61 294 60 295 59C296 58 298 56 300 56C301 55 303 53 305 52C307 50 309 48 310 48L312 46 313 48C314 49 314 49 314 52C313 54 314 55 314 56C315 57 315 59 315 60C315 61 315 62 315 62C316 62 316 64 316 65C316 66 316 68 317 69C319 74 320 86 318 99C316 112 316 112 321 107C323 105 325 103 326 103C326 103 327 102 328 101C329 100 334 98 336 98C336 98 338 97 339 96C340 95 342 94 342 94C343 94 345 93 346 92C350 91 350 94 349 109C349 115 349 117 346 122C344 128 346 127 354 120C357 117 361 113 362 113C363 112 365 111 366 109C367 108 369 107 370 106C371 106 372 105 373 104C374 103 377 101 379 101C380 101 382 99 383 98C385 96 387 95 389 94C391 93 392 92 393 91C394 89 396 88 397 87C398 87 400 85 401 84C403 83 405 81 407 80C409 79 411 78 412 77C413 75 415 73 420 70C421 70 422 68 423 67C425 65 427 64 429 63C431 62 434 61 435 60C437 57 453 46 455 45C455 45 457 44 459 43C461 41 463 40 464 40L465 40 465 44C465 46 465 47 465 48C464 49 464 50 463 50C460 58 458 62 457 63C456 63 455 65 455 66C454 67 453 69 451 71C449 73 447 76 446 77C445 78 444 80 443 80C443 80 442 82 441 83C440 85 439 86 438 87C436 88 435 89 434 90C434 92 432 93 431 94C431 95 429 97 428 99C426 101 421 106 418 107C416 108 415 109 414 111C413 114 410 117 407 119C405 119 404 120 403 123C401 127 395 133 393 134C391 135 390 136 390 138C389 140 387 144 387 144C386 144 385 145 384 146C382 148 380 148 379 148C377 149 376 150 376 152C376 153 375 155 374 156C372 159 373 159 376 159C385 159 391 177 386 188C384 191 378 196 376 197C374 198 373 198 374 201C376 206 382 208 384 205C385 203 386 203 386 205C386 207 384 209 383 210C381 211 381 211 379 212C378 213 378 213 376 213C375 212 374 212 374 212C373 212 373 213 374 217C375 220 374 223 371 226C369 229 369 228 374 234C376 237 379 240 379 241C380 242 381 244 382 245C383 246 384 249 385 251C386 253 388 255 389 256C389 257 390 259 390 259C390 260 390 261 391 262C391 262 392 264 393 266C394 268 395 270 396 270C397 271 398 272 398 273C398 274 399 276 400 277C401 278 403 281 404 282C405 284 407 287 409 288C410 290 411 292 411 293C411 294 412 295 413 295C413 296 414 297 414 298C415 299 416 301 417 302C418 304 419 305 419 305C419 305 421 308 424 311C429 316 432 320 433 323C433 324 434 326 435 327C435 327 436 329 436 331C436 332 437 334 437 335C438 337 440 346 440 349C439 351 440 354 440 356C440 362 438 367 434 371C431 375 430 376 429 381C426 389 421 395 416 396C414 396 413 396 412 398C408 403 396 405 390 401C386 398 382 399 378 403C377 404 376 405 376 405C375 405 374 405 374 406C372 409 361 410 357 408C351 406 346 399 344 391C343 388 343 387 341 384C339 383 338 381 338 381C338 381 337 380 336 379C333 378 328 373 326 369L324 366 321 366C318 366 318 366 315 364C314 362 313 361 312 361C311 361 306 359 305 358C304 357 301 356 299 354C291 350 288 348 286 343C284 340 284 340 281 339C276 338 275 338 273 336C272 334 271 334 269 334C267 334 264 334 262 333C260 332 258 332 257 332C257 333 258 341 259 343C260 344 261 345 261 347C261 348 262 350 262 350C263 351 264 353 264 353C264 354 266 356 267 358C269 359 271 361 271 362C271 363 274 366 278 368C278 369 280 370 281 372C281 373 282 374 283 375C286 377 290 382 291 383C291 384 293 386 295 388C297 390 299 392 300 393C301 395 305 399 308 401C312 403 319 409 32Line truncated
|
||||
|
After Width: | Height: | Size: 343 KiB |
@@ -0,0 +1,8 @@
|
||||
asset: ai.storyteller.effectcraft.svg
|
||||
title: EffectCraft app icon, Linux hicolor scalable
|
||||
author: EffectCraft contributors (drawing by the project owner in ArtCraft)
|
||||
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: Copy of effectcraft-small.svg, written by packaging/icons.sh.
|
||||
@@ -0,0 +1,62 @@
|
||||
#!/usr/bin/env bash
|
||||
# Regenerate every app icon file from assets/app-icon/effectcraft.svg (the canonical vector).
|
||||
#
|
||||
# Needs: resvg (brew install resvg / cargo install resvg). On macOS, iconutil also writes the
|
||||
# .icns. The outputs are committed, so builds and packaging never need these tools.
|
||||
#
|
||||
# packaging/icons.sh
|
||||
#
|
||||
# effectcraft.svg and effectcraft-small.svg (the lighter 1024 px trace) come from craftrules
|
||||
# (assets/app-icons/effectcraft/, which also keeps the source drawing) and are copied in by hand.
|
||||
set -euo pipefail
|
||||
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
||||
DIR="$ROOT/assets/app-icon"
|
||||
SVG="$DIR/effectcraft.svg"
|
||||
ID="ai.storyteller.effectcraft"
|
||||
TMP="$(mktemp -d)"
|
||||
trap 'rm -rf "$TMP"' EXIT
|
||||
|
||||
command -v resvg >/dev/null || { echo "error: resvg not found (brew install resvg)" >&2; exit 1; }
|
||||
|
||||
render() { resvg -w "$2" -h "$2" "$1" "$3" </dev/null; }
|
||||
|
||||
# The tile fills its 512 viewBox edge to edge, which suits Windows and Linux. macOS icons keep
|
||||
# Apple's grid instead: an 824 px body centred on a 1024 canvas with a transparent margin.
|
||||
MAC="$TMP/mac.svg"
|
||||
sed -e 's|<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">|<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024"><g transform="translate(100 100) scale(1.609375)">|' \
|
||||
-e 's|</svg>[[:space:]]*$|</g></svg>|' "$SVG" >"$MAC"
|
||||
grep -q 'viewBox="0 0 1024 1024"' "$MAC" || { echo "error: unexpected <svg> header in $SVG" >&2; exit 1; }
|
||||
|
||||
render "$SVG" 1024 "$DIR/effectcraft-1024.png"
|
||||
# Runtime window/Dock icon on macOS (apps/effectcraft/src/main.rs embeds it).
|
||||
render "$MAC" 512 "$DIR/effectcraft-macos-512.png"
|
||||
|
||||
# Linux hicolor theme (the 256 px one is also the runtime icon on Windows and Linux).
|
||||
for s in 16 24 32 48 64 128 256 512; do
|
||||
mkdir -p "$DIR/hicolor/${s}x${s}/apps"
|
||||
render "$SVG" "$s" "$DIR/hicolor/${s}x${s}/apps/$ID.png"
|
||||
done
|
||||
mkdir -p "$DIR/hicolor/scalable/apps"
|
||||
cp "$DIR/effectcraft-small.svg" "$DIR/hicolor/scalable/apps/$ID.svg"
|
||||
|
||||
# Windows .ico.
|
||||
ICO_PNGS=()
|
||||
for s in 16 20 24 32 40 48 64 128 256; do
|
||||
render "$SVG" "$s" "$TMP/ico-$s.png"
|
||||
ICO_PNGS+=("$TMP/ico-$s.png")
|
||||
done
|
||||
(cd "$ROOT" && cargo run -q -p xtask -- ico "$DIR/effectcraft.ico" "${ICO_PNGS[@]}")
|
||||
|
||||
# macOS .icns.
|
||||
if command -v iconutil >/dev/null; then
|
||||
SET="$TMP/effectcraft.iconset"
|
||||
mkdir -p "$SET"
|
||||
for s in 16 32 128 256 512; do
|
||||
render "$MAC" "$s" "$SET/icon_${s}x${s}.png"
|
||||
render "$MAC" $((s * 2)) "$SET/icon_${s}x${s}@2x.png"
|
||||
done
|
||||
iconutil -c icns -o "$DIR/effectcraft.icns" "$SET"
|
||||
else
|
||||
echo "warning: iconutil not found (macOS only); effectcraft.icns not regenerated" >&2
|
||||
fi
|
||||
echo "icons written to $DIR"
|
||||
@@ -0,0 +1,13 @@
|
||||
[Desktop Entry]
|
||||
Type=Application
|
||||
Name=EffectCraft
|
||||
GenericName=Motion Graphics Editor
|
||||
Comment=Motion graphics and visual effects compositor
|
||||
Exec=effectcraft %F
|
||||
TryExec=effectcraft
|
||||
Icon=ai.storyteller.effectcraft
|
||||
Terminal=false
|
||||
StartupNotify=true
|
||||
StartupWMClass=ai.storyteller.effectcraft
|
||||
Categories=AudioVideo;Video;Graphics;2DGraphics;
|
||||
Keywords=motion;graphics;animation;compositor;effects;keyframe;vfx;
|
||||
@@ -0,0 +1,104 @@
|
||||
//! `cargo xtask ico <out.ico> <in.png>…`: pack PNG images into a Windows `.ico`.
|
||||
//!
|
||||
//! Vista and later read PNG-compressed icon entries, so each PNG is stored as is. The size comes
|
||||
//! from the PNG's IHDR chunk; 256 px is written as 0, per the ICO format.
|
||||
|
||||
use std::path::Path;
|
||||
|
||||
/// Width and height from a PNG's IHDR chunk.
|
||||
pub fn png_size(png: &[u8]) -> Result<(u32, u32), String> {
|
||||
const SIG: &[u8] = b"\x89PNG\r\n\x1a\n";
|
||||
if png.len() < 24 || &png[..8] != SIG || &png[12..16] != b"IHDR" {
|
||||
return Err("not a PNG file".into());
|
||||
}
|
||||
let w = u32::from_be_bytes([png[16], png[17], png[18], png[19]]);
|
||||
let h = u32::from_be_bytes([png[20], png[21], png[22], png[23]]);
|
||||
Ok((w, h))
|
||||
}
|
||||
|
||||
/// An ICO file holding `pngs`, which must be square and at most 256 px.
|
||||
pub fn pack(pngs: &[Vec<u8>]) -> Result<Vec<u8>, String> {
|
||||
if pngs.is_empty() || pngs.len() > u16::MAX as usize {
|
||||
return Err("need at least one PNG".into());
|
||||
}
|
||||
let mut out = Vec::new();
|
||||
out.extend_from_slice(&0u16.to_le_bytes()); // reserved
|
||||
out.extend_from_slice(&1u16.to_le_bytes()); // type: icon
|
||||
out.extend_from_slice(&(pngs.len() as u16).to_le_bytes());
|
||||
let mut offset = 6 + 16 * pngs.len();
|
||||
for png in pngs {
|
||||
let (w, h) = png_size(png)?;
|
||||
if w != h || w == 0 || w > 256 {
|
||||
return Err(format!("icon images must be square and at most 256 px, got {w}x{h}"));
|
||||
}
|
||||
let dim = if w == 256 { 0 } else { w as u8 };
|
||||
out.extend_from_slice(&[dim, dim, 0, 0]); // width, height, palette size, reserved
|
||||
out.extend_from_slice(&1u16.to_le_bytes()); // colour planes
|
||||
out.extend_from_slice(&32u16.to_le_bytes()); // bits per pixel
|
||||
out.extend_from_slice(&(png.len() as u32).to_le_bytes());
|
||||
out.extend_from_slice(&(offset as u32).to_le_bytes());
|
||||
offset += png.len();
|
||||
}
|
||||
for png in pngs {
|
||||
out.extend_from_slice(png);
|
||||
}
|
||||
Ok(out)
|
||||
}
|
||||
|
||||
pub fn run(args: &[&str]) -> Result<(), String> {
|
||||
let [out, inputs @ ..] = args else {
|
||||
return Err("usage: cargo xtask ico <out.ico> <in.png>…".into());
|
||||
};
|
||||
let pngs = inputs.iter().map(|p| std::fs::read(p).map_err(|e| format!("read {p}: {e}"))).collect::<Result<Vec<_>, _>>()?;
|
||||
let ico = pack(&pngs)?;
|
||||
std::fs::write(Path::new(out), &ico).map_err(|e| format!("write {out}: {e}"))?;
|
||||
println!("{out}: {} images, {} bytes", pngs.len(), ico.len());
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
fn fake_png(size: u32) -> Vec<u8> {
|
||||
let mut v = b"\x89PNG\r\n\x1a\n\0\0\0\x0dIHDR".to_vec();
|
||||
v.extend_from_slice(&size.to_be_bytes());
|
||||
v.extend_from_slice(&size.to_be_bytes());
|
||||
v.extend_from_slice(&[8, 6, 0, 0, 0, 1, 2, 3, 4]);
|
||||
v
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn packs_directory_and_payloads() {
|
||||
let a = fake_png(16);
|
||||
let b = fake_png(256);
|
||||
let ico = pack(&[a.clone(), b.clone()]).unwrap();
|
||||
assert_eq!(&ico[..6], &[0, 0, 1, 0, 2, 0]);
|
||||
// Entry 0: 16 px at offset 6 + 32.
|
||||
assert_eq!(&ico[6..8], &[16, 16]);
|
||||
assert_eq!(u32::from_le_bytes(ico[14..18].try_into().unwrap()), a.len() as u32);
|
||||
assert_eq!(u32::from_le_bytes(ico[18..22].try_into().unwrap()), 38);
|
||||
// Entry 1: 256 px stored as 0, right after the first payload.
|
||||
assert_eq!(&ico[22..24], &[0, 0]);
|
||||
assert_eq!(u32::from_le_bytes(ico[34..38].try_into().unwrap()), 38 + a.len() as u32);
|
||||
assert_eq!(&ico[38..38 + a.len()], &a[..]);
|
||||
assert_eq!(&ico[38 + a.len()..], &b[..]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn rejects_bad_input() {
|
||||
assert!(pack(&[]).is_err());
|
||||
assert!(pack(&[fake_png(512)]).is_err());
|
||||
assert!(pack(&[b"GIF89a".to_vec()]).is_err());
|
||||
assert_eq!(png_size(&fake_png(48)).unwrap(), (48, 48));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn committed_icon_is_valid() {
|
||||
let path = crate::root().join("assets/app-icon/effectcraft.ico");
|
||||
let Ok(ico) = std::fs::read(&path) else { return };
|
||||
assert_eq!(&ico[..4], &[0, 0, 1, 0]);
|
||||
let n = u16::from_le_bytes([ico[4], ico[5]]) as usize;
|
||||
assert!(n >= 4, "expected several sizes in {}", path.display());
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
//! Workspace automation: `cargo xtask <layers|assets|wasm|web|ci>`.
|
||||
//! Workspace automation: `cargo xtask <layers|assets|wasm|web|ico|ci>`.
|
||||
//!
|
||||
//! - `layers`: enforces the dependency layering of `docs/architecture.md` §1 (downward-only edges,
|
||||
//! listed same-layer edges, no UI/OS crates below L5).
|
||||
@@ -8,8 +8,11 @@
|
||||
//! `<target>/web/dist` with `wasm-bindgen` (docs/web.md); `--serve` serves it on localhost.
|
||||
//! - `assets`: every asset file (image, icon, font, LUT, audio, video…) has a complete
|
||||
//! `<file>.attribution` sidecar and an entry in `ATTRIBUTION.md` (AGENTS.md §1).
|
||||
//! - `ico <out.ico> <in.png>…`: pack PNGs into a Windows `.ico` (used by `packaging/icons.sh`).
|
||||
//! - `ci`: fmt check, clippy -D warnings, tests, layers, assets, wasm.
|
||||
|
||||
mod ico;
|
||||
|
||||
use std::process::{Command, ExitCode};
|
||||
|
||||
use serde_json::Value;
|
||||
@@ -357,7 +360,11 @@ fn main() -> ExitCode {
|
||||
"assets" => assets(),
|
||||
"ci" => ci(),
|
||||
"web" => web(&std::env::args().skip(2).collect::<Vec<_>>()),
|
||||
_ => Err("usage: cargo xtask <layers|assets|wasm|web [--dev] [--serve PORT]|ci>".into()),
|
||||
"ico" => {
|
||||
let rest: Vec<String> = std::env::args().skip(2).collect();
|
||||
ico::run(&rest.iter().map(String::as_str).collect::<Vec<_>>())
|
||||
}
|
||||
_ => Err("usage: cargo xtask <layers|assets|wasm|web [--dev] [--serve PORT]|ico OUT.ico IN.png…|ci>".into()),
|
||||
};
|
||||
match r {
|
||||
Ok(()) => ExitCode::SUCCESS,
|
||||
@@ -367,3 +374,8 @@ fn main() -> ExitCode {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// The workspace root (the parent of `xtask/`).
|
||||
pub fn root() -> std::path::PathBuf {
|
||||
std::path::Path::new(env!("CARGO_MANIFEST_DIR")).parent().expect("xtask has a parent dir").to_path_buf()
|
||||
}
|
||||