mirror of
https://github.com/storytold/designcraft.git
synced 2026-10-14 19:27:07 -04:00
Extend interface language selection with Chinese and Arabic translations across menus, dialogs, panels, tooltips, and common application controls. Keep English fallback for untranslated strings, return borrowed translation text, and validate translation key uniqueness and language switching. Bundle redistributable Noto CJK and Arabic fonts with OFL license files and ASSETS.md attribution so native and WASM builds have portable glyph coverage. Register Arabic regular and semibold families while retaining existing font fallbacks for proportional and monospace controls. Render Arabic labels using Unicode bidirectional runs and contextual shaping. Wrap logical text at grapheme boundaries before ordering each visual line, mirror neutral punctuation, preserve logical source text for accessibility, and handle truncation, empty lines, and mixed Latin text and numbers. Keep ASCII labels on the normal rendering path. Disable selection on shaped RTL labels because egui's default label cursor mapping assumes LTR text. Adapt welcome controls, menu ordering, popup alignment, and new-document rows for RTL layout. Bound popup geometry and avoid unsupported RTL grid behavior; keep numeric inputs LTR. Isolate user-provided document names from Latin application and zoom metadata. Interface language changes leave document binding, paragraph direction, editable text, and engine state unchanged. Add regressions for contextual Arabic joining, bidirectional punctuation, mixed document names, logical wrapping, truncation, language switching, and finite widget geometry. Update the roadmap with localization coverage. Apply equivalent chunk-iteration and PDF Option/borrow simplifications needed by the current Rust toolchain's strict Clippy checks. Validation: - cargo xtask ci: fmt, Clippy, native tests, assets, and layers passed; native tests total 517 passed and 2 ignored. - UI regression suite: 26 passed. - Headless UI screenshots verified Arabic welcome/new-document creation, menus, mixed-script document names, and switching back to Chinese/English. - Default WASM gate is blocked by this host's missing precompiled wasm32 standard library. All 15 WASM crates pass using the installed Rust sources: RUSTC_BOOTSTRAP=1 CARGO_UNSTABLE_BUILD_STD=std,panic_abort target/debug/xtask wasm.
93 lines
2.8 KiB
TOML
93 lines
2.8 KiB
TOML
[workspace]
|
||
resolver = "3"
|
||
members = ["crates/*", "apps/*", "xtask"]
|
||
default-members = ["crates/*", "apps/designcraft", "apps/designcraft-cli", "xtask"]
|
||
|
||
[workspace.package]
|
||
version = "0.2.1"
|
||
edition = "2024"
|
||
license = "MIT OR Apache-2.0"
|
||
rust-version = "1.90"
|
||
repository = "https://github.com/storytold/designcraft"
|
||
|
||
[workspace.dependencies]
|
||
# internal
|
||
designcraft-geom = { path = "crates/geom" }
|
||
designcraft-color = { path = "crates/color" }
|
||
designcraft-doc = { path = "crates/doc" }
|
||
designcraft-fonts = { path = "crates/fonts" }
|
||
designcraft-compose = { path = "crates/compose" }
|
||
designcraft-images = { path = "crates/images" }
|
||
designcraft-render = { path = "crates/render" }
|
||
designcraft-pdf = { path = "crates/pdf" }
|
||
designcraft-idml = { path = "crates/idml" }
|
||
designcraft-epub = { path = "crates/epub" }
|
||
designcraft-textimport = { path = "crates/textimport" }
|
||
designcraft-format = { path = "crates/format" }
|
||
designcraft-tools = { path = "crates/tools" }
|
||
designcraft-engine = { path = "crates/engine" }
|
||
designcraft-ui-egui = { path = "crates/ui-egui" }
|
||
designcraft-mcp = { path = "crates/mcp" }
|
||
designcraft-testkit = { path = "crates/testkit" }
|
||
|
||
# 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"
|
||
rayon = "1"
|
||
unicode-bidi = "0.3"
|
||
unicode-bidi-mirroring = "0.4"
|
||
unicode-segmentation = "1"
|
||
regex = { version = "1", default-features = false, features = ["std", "unicode", "perf"] }
|
||
|
||
# text / rendering / formats
|
||
skrifa = "0.47"
|
||
harfrust = "0.13"
|
||
vello_cpu = "0.2"
|
||
vello_common = { version = "0.2", default-features = false }
|
||
image = { version = "0.25", default-features = false, features = ["png", "jpeg", "webp", "gif", "tiff", "bmp"] }
|
||
# SVG (same usvg as krilla-svg) and Photoshop composites.
|
||
resvg = { version = "0.47", default-features = false, features = ["text"] }
|
||
krilla-svg = "0.8"
|
||
psd = "0.3"
|
||
# Boolean operations on Bézier paths (Pathfinder).
|
||
flo_curves = "0.8"
|
||
# QR codes (Object › Generate QR Code); MIT.
|
||
qrcodegen = "1.8"
|
||
krilla = { version = "0.8", features = ["pdf"] }
|
||
hayro = "0.7"
|
||
quick-xml = "0.38"
|
||
zip = { version = "3", default-features = false, features = ["deflate"] }
|
||
|
||
# ui
|
||
egui = "0.36"
|
||
egui_extras = { version = "0.36", default-features = false, features = ["svg"] }
|
||
eframe = { version = "0.36", default-features = false }
|
||
egui_kittest = "0.36"
|
||
rfd = "0.17"
|
||
arboard = { version = "3.6", default-features = false }
|
||
|
||
[workspace.lints.rust]
|
||
unsafe_code = "forbid"
|
||
|
||
[workspace.lints.clippy]
|
||
dbg_macro = "warn"
|
||
todo = "warn"
|
||
too_many_arguments = "allow"
|
||
type_complexity = "allow"
|
||
|
||
[profile.dev.package."*"]
|
||
opt-level = 2
|
||
|
||
[profile.dev]
|
||
opt-level = 1
|
||
|
||
[profile.release]
|
||
opt-level = 3
|
||
lto = "thin"
|
||
codegen-units = 16
|
||
debug = 0
|