mirror of
https://github.com/storytold/figcraft.git
synced 2026-10-27 11:56:50 -06:00
.fig files open through file.open, file.import, drag and drop, the dialogs, the CLI and MCP. A generic reader written from the public format description decodes the zip, the deflate/zstd chunks and the kiwi schema and message, then maps nodes by field name onto the REST importer: layer tree, geometry, paints with styles resolved, strokes, effects, text runs, vectors as outlines, auto layout including grid, constraints, components, sets, instances expanded from their main with overrides, styles, variables with modes and bindings, prototyping and image fills. Unsupported layers come back as warnings. Fuzzed; tested on fixtures generated in code. New dependency: ruzstd (pure-Rust zstd decoder).
114 lines
3.8 KiB
TOML
114 lines
3.8 KiB
TOML
[workspace]
|
||
resolver = "3"
|
||
members = ["crates/*", "apps/*", "xtask"]
|
||
# The plugin SDK and examples build for wasm32 in a workspace of their own (`cargo xtask plugins`).
|
||
exclude = ["plugins"]
|
||
# default-members = ["crates/*", "apps/figcraft", "apps/figcraft-cli", "xtask"]
|
||
|
||
[workspace.package]
|
||
version = "0.3.1"
|
||
edition = "2024"
|
||
license = "MIT OR Apache-2.0"
|
||
rust-version = "1.95"
|
||
repository = "https://github.com/storytold/figcraft"
|
||
|
||
[workspace.dependencies]
|
||
# internal
|
||
figcraft-geom = { path = "crates/geom" }
|
||
figcraft-color = { path = "crates/color" }
|
||
figcraft-doc = { path = "crates/doc" }
|
||
figcraft-layout = { path = "crates/layout" }
|
||
figcraft-text = { path = "crates/text" }
|
||
figcraft-pathops = { path = "crates/pathops" }
|
||
figcraft-render = { path = "crates/render" }
|
||
figcraft-svg = { path = "crates/svg" }
|
||
figcraft-pdf = { path = "crates/pdf" }
|
||
figcraft-format = { path = "crates/format" }
|
||
figcraft-tools = { path = "crates/tools" }
|
||
figcraft-collab = { path = "crates/collab" }
|
||
figcraft-engine = { path = "crates/engine" }
|
||
figcraft-ui-egui = { path = "crates/ui-egui" }
|
||
figcraft-mcp = { path = "crates/mcp" }
|
||
figcraft-collab-net = { path = "crates/collab-net" }
|
||
figcraft-plugin = { path = "crates/plugin" }
|
||
|
||
# foundation
|
||
kurbo = { version = "0.13", features = ["serde"] }
|
||
thiserror = "2"
|
||
serde = { version = "1", features = ["derive", "rc"] }
|
||
serde_json = { version = "1", features = ["float_roundtrip"] }
|
||
log = "0.4"
|
||
proptest = "1"
|
||
imbl = { version = "7", features = ["serde"] }
|
||
postcard = { version = "1", default-features = false, features = ["alloc"] }
|
||
|
||
# rendering / formats
|
||
tiny-skia = "0.12"
|
||
image = { version = "0.25", default-features = false, features = ["png", "jpeg", "webp", "gif", "bmp", "tiff"] }
|
||
usvg = "0.48"
|
||
krilla = "0.8"
|
||
skrifa = "0.47"
|
||
harfrust = "0.13"
|
||
unicode-bidi = "0.3"
|
||
linesweeper = "0.4"
|
||
zip = { version = "2", default-features = false, features = ["deflate"] }
|
||
# `.fig` import: raw deflate chunks (already built for zip) and zstd chunks (pure Rust, MIT, wasm-safe).
|
||
flate2 = { version = "1", default-features = false, features = ["rust_backend"] }
|
||
ruzstd = { version = "0.9", default-features = false, features = ["std"] }
|
||
sha2 = "0.10"
|
||
base64 = "0.22"
|
||
crc32fast = "1"
|
||
|
||
# plugins: a pure-Rust, metered WebAssembly interpreter (no JIT; also runs in the web build). The
|
||
# portable dispatch loop: tail-call dispatch relies on an LLVM optimisation that unoptimised and
|
||
# debug builds may not do, and then a long-running plugin overflows the native stack.
|
||
wasmi = { version = "2", default-features = false, features = ["std", "stable", "validate", "portable-dispatch"] }
|
||
wat = "1.261"
|
||
|
||
# ui
|
||
egui = "0.36"
|
||
egui_extras = { version = "0.36", default-features = false }
|
||
eframe = { version = "0.36", default-features = false }
|
||
rfd = "0.17"
|
||
arboard = { version = "3.6", default-features = false }
|
||
webbrowser = "1"
|
||
|
||
[workspace.lints.rust]
|
||
unsafe_code = "forbid"
|
||
|
||
[workspace.lints.clippy]
|
||
dbg_macro = "warn"
|
||
# Style lints from newer toolchains that fight index-heavy pixel code.
|
||
needless_range_loop = "allow"
|
||
chunks_exact_to_as_chunks = "allow"
|
||
# FigCraft never crashes: shipped code returns `Result`/`Option` instead of panicking (see
|
||
# AGENTS.md › Never crash). Tests may unwrap (clippy.toml).
|
||
unwrap_used = "deny"
|
||
expect_used = "deny"
|
||
panic = "deny"
|
||
todo = "deny"
|
||
unimplemented = "deny"
|
||
unreachable = "deny"
|
||
|
||
[profile.dev.package."*"]
|
||
opt-level = 2
|
||
|
||
[profile.dev]
|
||
opt-level = 1
|
||
|
||
[profile.release]
|
||
lto = "thin"
|
||
codegen-units = 4
|
||
|
||
# The browser build only (apps/figcraft-web/index.html: data-cargo-profile). Optimised for size:
|
||
# packaging/web/package.sh fails a .wasm over 24 MiB (Cloudflare's per-file cap is 25 MiB).
|
||
# wasm32-unknown-unknown always aborts on panic, so panic = "abort" changes nothing there.
|
||
[profile.web-release]
|
||
inherits = "release"
|
||
opt-level = "s"
|
||
lto = "fat"
|
||
codegen-units = 1
|
||
debug = false
|
||
strip = true
|
||
panic = "abort"
|