bevy_vista 0.17.1

A visual UI editor plugin for Bevy with inspector-driven editing and .vista.ron serialization.
Documentation

bevy_vista

bevy_vista is a document-driven UI editor and runtime toolkit for Bevy UI. It combines:

  • an editor overlay built with pure Bevy UI
  • inspector-driven widget editing
  • .vista.ron serialization for reusable UI documents
  • runtime APIs for loading, mutating, and spawning saved UI

Latest Version

  • bevy_vista = "0.17.1"
  • compatible with bevy = "0.17"

What's New

Recent additions in the current API surface:

  • clearer core / runtime / editor module split
  • runtime document utilities via WidgetDocUtility
  • runtime asset loading and spawning example
  • cleaner custom inspector driver registration flow
  • slimmer custom inspector driver context API
  • improved public exports and layered preludes

Layered Architecture

bevy_vista is organized into three layers:

  • bevy_vista::core shared widgets, themes, asset/document models, inspector metadata, and built-in drivers
  • bevy_vista::runtime document loading, mutation, spawning, flushing, and live widget access
  • bevy_vista::editor editor overlay, hierarchy, viewport, toolbar, and inspector panels

Plugin entry points:

  • VistaUiCorePlugin
  • VistaUiRuntimePlugin
  • VistaUiEditorPlugin
  • VistaUiPlugin full setup, combining editor and runtime layers

Prelude entry points:

  • bevy_vista::core::prelude::*
  • bevy_vista::runtime::prelude::*
  • bevy_vista::editor::prelude::*
  • bevy_vista::prelude::*

Features

  • editor UI based on pure Bevy UI
  • floating + fullscreen editor modes
  • viewport grid, zoom, pan, and preview workflow
  • save / load .vista.ron UI documents
  • Widget derive + auto-registration for custom widgets
  • ShowInInspector derive for inspector-editable properties
  • custom inspector driver registration
  • runtime document APIs for document-first UI workflows
  • 100+ editor icons

Quick Start

[dependencies]
bevy = "0.17"
bevy_vista = "0.17.1"

Full editor + runtime:

use bevy::prelude::*;
use bevy_vista::prelude::*;

fn main() {
    App::new()
        .add_plugins(DefaultPlugins)
        .add_plugins(VistaUiPlugin)
        .add_systems(Startup, setup)
        .run();
}

fn setup(mut commands: Commands) {
    commands.spawn((Camera2d, IsDefaultUiCamera));
}

Runtime only:

use bevy::prelude::*;
use bevy_vista::runtime::prelude::*;

fn main() {
    App::new()
        .add_plugins(DefaultPlugins)
        .add_plugins(VistaUiRuntimePlugin)
        .run();
}

Runtime Document Workflow

The runtime layer keeps a document as the source of truth, then spawns one or more live instances from it.

Typical flow:

  1. load_path
  2. mutate document data with with_widget_mut / with_style_mut
  3. spawn
  4. later flush after document-side changes
  5. or mutate live widgets directly with with_live_widget_mut

Main API:

  • WidgetDocUtility
  • WidgetDocId
  • WidgetDocInstanceId
  • WidgetDocLiveRef<T>
  • WidgetDocLiveMut<T>

See:

Custom Inspector Drivers

Built-in field rendering is string-driver based, so external code can replace or extend inspector rendering without modifying internal editor modules.

Typical customization flow:

  1. implement InspectorDriver
  2. register it with app.register_inspector_driver(...)
  3. bind a Rust type to that driver through InspectorEditorRegistry

This now works with the streamlined runtime driver API instead of requiring editor-private internals.

See:

ShowInInspector Options

#[derive(ShowInInspector)] currently supports these field-level #[property(...)] options:

  • label = "Text" custom display label in the inspector
  • hidden omit the field from the inspector
  • min = 0.0 numeric minimum used by runtime editing controls
  • header = "Layout" start a grouped foldout section and implicitly close the previous open section
  • default_open = false only valid together with header = "..."
  • end_header closes the current header section explicitly

Example:

#[derive(ShowInInspector)]
struct DemoProps {
    #[property(header = "Layout", default_open = true, label = "Width", min = 0.0)]
    width: f32,

    #[property(label = "Visible", end_header)]
    visible: bool,
}

If a later field starts another header = "..." section, the previous section is closed automatically even without end_header.

See the detailed guide in docs/USAGE.md for a fuller breakdown.

Examples

  • cargo run --example quick_vista_editor
  • cargo run --example quick_full_editor
  • cargo run --example runtime_load_asset
  • cargo run --example custom_inspector_driver
  • cargo run --example layout_widgets
  • cargo run --example text_field_showcase
  • cargo run --example editor_icons_gallery

Documentation

Screenshots

Full editor layout

example: quick_full_editor.rs

full_editor

Editor Icons

example: editor_icons_gallery.rs

editor_icons