Files
obscura/Cargo.toml
SGavrl 1971380da8 render: scaffold obscura-render crate with taffy layout core
New optional crate obscura-render, the scoped render layer for Obscura.
Phase 1 adds the layout core: a LayoutNode tree plus a viewport is laid
out with taffy (pure Rust) and border-box geometry is returned per node,
mirroring the input tree.

The crate is a workspace member but not yet a dependency of any other
crate, so the default scraping build is unchanged. Geometry-from-DOM,
JS integration, text, paint, and screenshot capture land in later
phases.

Unit tests cover block stacking, flex row layout, and padding.
2026-06-30 16:20:10 +00:00

61 lines
2.0 KiB
TOML

[workspace]
resolver = "2"
members = [
"crates/obscura-dom",
"crates/obscura-net",
"crates/obscura-browser",
"crates/obscura-cdp",
"crates/obscura-js",
"crates/obscura-mcp",
"crates/obscura-render",
"crates/obscura-cli",
"crates/obscura",
]
[workspace.package]
version = "0.1.0"
edition = "2021"
license = "Apache-2.0"
repository = "https://github.com/h4ckf0r0day/obscura"
[workspace.dependencies]
obscura-dom = { path = "crates/obscura-dom" }
obscura-net = { path = "crates/obscura-net" }
obscura-browser = { path = "crates/obscura-browser" }
obscura-cdp = { path = "crates/obscura-cdp" }
obscura-js = { path = "crates/obscura-js" }
obscura-mcp = { path = "crates/obscura-mcp" }
obscura-render = { path = "crates/obscura-render" }
html5ever = "0.29"
markup5ever = "0.14"
selectors = "0.26"
servo_arc = "0.4"
cssparser = "0.34"
# Layout engine for the optional render layer (obscura-render). Pure Rust.
taffy = "0.7"
tokio = { version = "1", features = ["full"] }
tokio-tungstenite = "0.26"
# No "cookies" feature: obscura manages cookies through its own CookieJar
# (obscura-net/src/cookies.rs) and never uses reqwest's cookie store. Pulling
# it in only added the cookie/cookie_store crates, and cookie 0.18.1's blanket
# From impl fails to compile under coherence on some toolchains (issue #295).
reqwest = { version = "0.12", features = ["gzip", "brotli", "deflate", "rustls-tls", "socks"], default-features = false }
serde = { version = "1", features = ["derive"] }
serde_json = "1"
url = "2"
tracing = "0.1"
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
clap = { version = "4", features = ["derive"] }
uuid = { version = "1", features = ["v4"] }
thiserror = "2"
anyhow = "1"
base64 = "0.22"
# Unwinding (the Rust default) is REQUIRED for the anti-panic protocol: ops wrap
# their bodies in std::panic::catch_unwind so a panic degrades to an error return
# instead of unwinding into V8's FFI frame and aborting the process. panic="abort"
# would turn every catchable op panic into a hard crash.
[profile.release]
panic = "unwind"