dioxus-mind-elixir 0.1.0

A Rust-native Dioxus mind map component with CSS-variable styling
Documentation
# dioxus-mind-elixir

Rust + Dioxus 脑图组件,基于 [Mind Elixir Core](https://github.com/ssshooter/mind-elixir-core) 的数据与交互设计,以 Rust 惯用方式重写。

`0.1.0` 首版发布候选,Rust 1.85+ / Dioxus 0.7.10。包含纯文本脑图、插件、共享大纲、XMind 和 Web 图片/静态 HTML 导出。当前正在完成 crates.io 发布准备,尚未上传。

**平台边界:** Web 已通过 Chromium 自动化;macOS Desktop 已做运行检查。Desktop 实时图片/HTML 捕获返回明确的平台错误;真实 OS 输入法候选确认、Safari 与 Windows/Linux Desktop 运行仍待验证。此版本不承诺 Mind Elixir 全功能兼容。

当前可运行:四方向布局、严格 JSON、节点增删改/复制/批量移动、折叠、快照撤销/重做、共享状态、纯文本多行编辑、视口平移/缩放/居中、主题与可继承 CSS 变量。另含大纲、节点拖放、多选/框选、菜单、结构快捷键与导出。

## 运行核心试验台

需要 Rust 1.85+、Dioxus CLI 0.7.10;macOS Desktop 需要 Xcode Command Line Tools。首次 Web 构建会由 dx 安装所需构建工具。

```sh
rustup target add wasm32-unknown-unknown
cargo install dioxus-cli --version 0.7.10 --locked
cd test-apps/core
# Web
dx serve --platform web
# 或 Desktop;分别运行,不要同时启用两个 renderer
dx serve --platform desktop
```

也可从仓库根目录执行 `cargo run -p mind-elixir-core-tests --features desktop`。Desktop 推荐使用 dx,以生成完整应用包。示例样式通过 `include_str!` 随 Rust 编译,无需 npm 或复制 assets。

第一阶段只读示例继续保留在 `examples/basic`。核心自动化独立运行:

```sh
cargo test -p mind-elixir-core-tests --locked
scripts/test-core-e2e # 需先启动匹配 Chrome 的 chromedriver
```

详见 [核心测试说明](test-apps/core/README.md) 和 [Rust 浏览器回归](e2e/core/README.md)。

## 最小接入

正式上传 crates.io 后可通过以下配置接入;发布前可用本地 path 验证。renderer 由宿主选择:

```toml
[dependencies]
dioxus-mind-elixir = { version = "0.1.0", features = ["web"] }
dioxus = { version = "0.7.10", default-features = false, features = ["web", "launch"] }
```

```rust
use dioxus::prelude::*;
use dioxus_mind_elixir::{EditableMindMap, MindMapData, Node, use_mind_map};

fn app() -> Element {
    let handle = use_mind_map(MindMapData::new(
        Node::new("root", "想法").with_children(vec![Node::new("rust", "Rust")])
    ));
    match handle {
        Ok(handle) => rsx! { EditableMindMap { handle, class: "my-map" } },
        Err(error) => rsx! { p { role: "alert", "{error}" } },
    }
}
```

库不默认启用 renderer、日志或开发工具。Web 宿主在关闭 Dioxus 默认特性时,可以启用本库 `web` feature,补齐 Dioxus 0.7.10 history 对 `web-sys/Location` 的要求,并启用实际 CSS 捕获:

```toml
dioxus-mind-elixir = { version = "0.1.0", features = ["web"] }
```

只使用核心 Web 视图时,也可像本仓库 basic 示例一样单独启用 `web-sys/Location`。Desktop 宿主启用 Dioxus 的 `desktop` feature,不启用本库 `web` feature。

| 能力 | Web(`web` feature) | Desktop |
| --- | --- | --- |
| 四方向脑图、共享大纲、操作/历史、插件 | Chromium 已验证 | macOS 已做运行检查 |
| JSON、文本、XMind、宿主保存接口 | 支持 | 支持 |
| 实际 CSS/字体的 SVG、PNG、JPEG、WebP、静态 HTML 捕获 | 支持;受字体/CORS、资源、浏览器编码器限制 | 暂不支持,返回平台错误 |
| 导出 HTML 继续编辑 | 静态查看,不含编辑器 | 静态查看,不含编辑器 |

完整行为差异、字段兼容和未验证项见 [第三阶段记录](docs/第三阶段.md)。

## 样式定制

变量可放在组件、父容器或外部样式表上,库不在根节点重置变量:

```css
.my-map {
  --dme-root-background: #67518c;
  --dme-node-radius: 6px;
  --dme-font-size: 18px;
  --dme-gap-x: 64px;
  --dme-link-color: #b5a0d0;
}
```

完整清单见 [CSS 变量](docs/CSS变量.md)。Dioxus resize 事件触发重新测量;组件的 `measurement_revision` 提供显式重测入口。组件原生支持视口缩放;仅做外部位置/transform 动画时需显式重测。

## 检查

```sh
cargo fmt --all -- --check
cargo clippy -p dioxus-mind-elixir --all-targets --locked -- -D warnings
cargo test -p dioxus-mind-elixir --locked
cargo test -p mind-elixir-core-tests --locked
cargo doc -p dioxus-mind-elixir --no-deps --locked
cargo check -p mind-elixir-basic --features web --target wasm32-unknown-unknown --locked
cargo check -p mind-elixir-basic --features desktop --locked
```

core 和 plugins 均有独立可运行的测试应用和浏览器回归包。组件测试代码和浏览器客户端用 Rust 编写,启动脚本仅负责进程编排。

## 设计与许可

- [首版发布准备记录]docs/发布准备.md
- [变更日志]CHANGELOG.md
- [第三阶段实现、官方插件版本、平台与验证边界]docs/第三阶段.md
- [独立插件应用]test-apps/plugins/README.md / [插件浏览器回归]e2e/plugins/README.md
- [实施计划]docs/实施计划.md
- [第二阶段记录、兼容范围与待验收项]docs/第二阶段.md
- [第一阶段记录]docs/第一阶段.md
- [来源与行为映射]docs/上游映射.md
- MIT:[本项目许可]LICENSE、[上游许可]LICENSE-MIND-ELIXIR、[来源声明]NOTICE.md

项目不维护手写 TS/JS 功能代码;Dioxus/WebView/WASM 工具链仍有自己的运行支持和生成绑定。

## 运行插件试验台

```sh
cargo test -p mind-elixir-plugin-tests --locked
cd test-apps/plugins
dx serve --platform web --port 8089
# Desktop 单独运行:dx serve --platform desktop
```

`use_plugins(handle, Plugin::builtins())` 安装能力并保留返回的 guard;`Toolbar`、`EditableMindMap`、`Outline` 使用同一个 handle。导出为 `plugins::export::ExportFile`,宿主可使用 `save_with` 替换保存接口。Web 实时捕获需依赖启用 `web` feature,Desktop 不启用此 feature。