From f4fe46f63073502ac1719f4f95da7fb857355b85 Mon Sep 17 00:00:00 2001 From: Madeline Sparkles Date: Thu, 5 Nov 2026 10:43:46 +0100 Subject: [PATCH 1/6] yeet demo and yakui-app crate --- crates/demo/.gitignore | 2 - crates/demo/Cargo.toml | 26 --- crates/demo/README.md | 13 -- crates/demo/index.css | 9 -- crates/demo/index.html | 6 - crates/demo/src/main.rs | 87 ---------- crates/yakui-app/Cargo.toml | 20 --- crates/yakui-app/README.md | 6 - crates/yakui-app/src/lib.rs | 224 -------------------------- crates/yakui-app/src/multisampling.rs | 71 -------- 10 files changed, 464 deletions(-) delete mode 100644 crates/demo/.gitignore delete mode 100644 crates/demo/Cargo.toml delete mode 100644 crates/demo/README.md delete mode 100644 crates/demo/index.css delete mode 100644 crates/demo/index.html delete mode 100644 crates/demo/src/main.rs delete mode 100644 crates/yakui-app/Cargo.toml delete mode 100644 crates/yakui-app/README.md delete mode 100644 crates/yakui-app/src/lib.rs delete mode 100644 crates/yakui-app/src/multisampling.rs diff --git a/crates/demo/.gitignore b/crates/demo/.gitignore deleted file mode 100644 index a98e6395..00000000 --- a/crates/demo/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -# Trunk build output -/dist \ No newline at end of file diff --git a/crates/demo/Cargo.toml b/crates/demo/Cargo.toml deleted file mode 100644 index f737e6a9..00000000 --- a/crates/demo/Cargo.toml +++ /dev/null @@ -1,26 +0,0 @@ -[package] -name = "demo" -version = "0.1.0" -edition = "2024" -publish = false - -[dependencies] -yakui = { path = "../yakui" } -yakui-wgpu = { path = "../yakui-wgpu" } -yakui-winit = { path = "../yakui-winit" } -yakui-app = { path = "../yakui-app" } - -env_logger.workspace = true -log.workspace = true -pollster.workspace = true - -wgpu = { workspace = true, features = ["webgl"] } - -winit.workspace = true - -[target.'cfg(target_arch = "wasm32")'.dependencies] -console_log = "1.0.0" -console_error_panic_hook = "0.1.7" -wasm-bindgen = "0.2.118" -wasm-bindgen-futures = "0.4.68" -web-sys = "0.3.95" diff --git a/crates/demo/README.md b/crates/demo/README.md deleted file mode 100644 index d98693a3..00000000 --- a/crates/demo/README.md +++ /dev/null @@ -1,13 +0,0 @@ -# Demo -This is a standalone yakui demo app that can run on any platform. - -You can run it on desktop platforms with: -```rust -cargo r -``` - -You can run this demo on the web with [Trunk](https://github.com/thedodd/trunk): - -```bash -trunk serve -``` \ No newline at end of file diff --git a/crates/demo/index.css b/crates/demo/index.css deleted file mode 100644 index 4a0bc134..00000000 --- a/crates/demo/index.css +++ /dev/null @@ -1,9 +0,0 @@ -* { - margin: 0; - padding: 0; -} - -canvas { - width: 100%; - height: 100%; -} \ No newline at end of file diff --git a/crates/demo/index.html b/crates/demo/index.html deleted file mode 100644 index e14f7389..00000000 --- a/crates/demo/index.html +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/crates/demo/src/main.rs b/crates/demo/src/main.rs deleted file mode 100644 index f0315056..00000000 --- a/crates/demo/src/main.rs +++ /dev/null @@ -1,87 +0,0 @@ -use winit::{ - event::{Event, StartCause, WindowEvent}, - event_loop::{ControlFlow, EventLoop}, - window::Window, -}; -use yakui::{CrossAxisAlignment, Yakui, button, row, widgets::List}; -use yakui_app::Graphics; - -fn app() { - row(|| { - button("Not stretched"); - let mut col = List::column(); - col.cross_axis_alignment = CrossAxisAlignment::Stretch; - col.show(|| { - button("Button 1"); - button("Button 2"); - button("Button 3"); - }); - }); -} - -async fn run(event_loop: EventLoop<()>, window: Window) { - let mut yak = Yakui::new(); - let mut graphics = Graphics::new(&window, 4).await; - - event_loop.set_control_flow(ControlFlow::Poll); - #[allow(deprecated)] // winit!! :shake fist: - event_loop - .run(move |event, event_loop| match event { - Event::AboutToWait => { - window.request_redraw(); - } - - Event::NewEvents(cause) => { - graphics.is_init = cause == StartCause::Init; - } - - Event::WindowEvent { - event: WindowEvent::RedrawRequested, - .. - } => { - yak.start(); - app(); - yak.finish(); - - graphics.paint(&mut yak, wgpu::Color::BLACK); - } - - Event::WindowEvent { event, .. } => { - graphics.handle_window_event(&mut yak, &event, event_loop, &window); - } - _ => (), - }) - .unwrap(); -} - -fn main() { - let event_loop = EventLoop::new().unwrap(); - #[allow(deprecated)] - let window = event_loop - .create_window(winit::window::Window::default_attributes()) - .unwrap(); - - #[cfg(not(target_arch = "wasm32"))] - { - env_logger::init(); - pollster::block_on(run(event_loop, window)); - } - - #[cfg(target_arch = "wasm32")] - { - use winit::platform::web::WindowExtWebSys; - - std::panic::set_hook(Box::new(console_error_panic_hook::hook)); - console_log::init().expect("could not initialize logger"); - // On wasm, append the canvas to the document body - web_sys::window() - .and_then(|win| win.document()) - .and_then(|doc| doc.body()) - .and_then(|body| { - body.append_child(&web_sys::Element::from(window.canvas().unwrap())) - .ok() - }) - .expect("couldn't append canvas to document body"); - wasm_bindgen_futures::spawn_local(run(event_loop, window)); - } -} diff --git a/crates/yakui-app/Cargo.toml b/crates/yakui-app/Cargo.toml deleted file mode 100644 index 5baf9779..00000000 --- a/crates/yakui-app/Cargo.toml +++ /dev/null @@ -1,20 +0,0 @@ -[package] -name = "yakui-app" -description = "Wrapper crate for yakui, a UI library for games" -version = "0.3.0" -license = "MIT OR Apache-2.0" -repository = "https://github.com/SecondHalfGames/yakui" -edition = "2024" - -[features] - -[dependencies] -yakui = { path = "../yakui", version = "0.3.0" } -yakui-winit = { path = "../yakui-winit", version = "0.3.0" } -yakui-wgpu = { path = "../yakui-wgpu", version = "0.3.0" } - -wgpu.workspace = true - -winit = { workspace = true, features = ["rwh_06"] } - -profiling.workspace = true diff --git a/crates/yakui-app/README.md b/crates/yakui-app/README.md deleted file mode 100644 index 8e155a3e..00000000 --- a/crates/yakui-app/README.md +++ /dev/null @@ -1,6 +0,0 @@ -`yakui_app` is an easy way to get started with [yakui](https://github.com/SecondHalfGames/yakui), a declarative UI library for games. - -You might also be interested in: -* [`yakui`] -* [`yakui_widgets`] -* [`yakui_core`] \ No newline at end of file diff --git a/crates/yakui-app/src/lib.rs b/crates/yakui-app/src/lib.rs deleted file mode 100644 index 0c901617..00000000 --- a/crates/yakui-app/src/lib.rs +++ /dev/null @@ -1,224 +0,0 @@ -#![doc = include_str!("../README.md")] - -mod multisampling; - -use wgpu::CurrentSurfaceTexture; -use winit::{dpi::PhysicalSize, event::WindowEvent, event_loop::ActiveEventLoop, window::Window}; - -use multisampling::Multisampling; - -/// A helper for setting up rendering with winit and wgpu -pub struct Graphics { - pub device: wgpu::Device, - pub queue: wgpu::Queue, - - format: wgpu::TextureFormat, - surface: wgpu::Surface<'static>, - surface_config: wgpu::SurfaceConfiguration, - size: PhysicalSize, - sample_count: u32, - multisampling: Multisampling, - - window: yakui_winit::YakuiWinit, - pub renderer: yakui_wgpu::YakuiWgpu, - buffers: yakui_wgpu::Buffers, - /// Tracks whether winit is still initializing - pub is_init: bool, -} - -impl Graphics { - pub async fn new(window: &Window, sample_count: u32) -> Self { - let mut size = window.inner_size(); - - // FIXME: On web, we're receiving (0, 0) as the initial size of the - // window, which makes wgpu upset. If we hit that case, let's just make - // up a size and let it get fixed later. - if size == PhysicalSize::new(0, 0) { - size = PhysicalSize::new(800, 600); - } - - let instance = wgpu::Instance::default(); - let surface = unsafe { - instance.create_surface_unsafe( - wgpu::SurfaceTargetUnsafe::from_display_and_window(&window, &window) - .expect("Could not create wgpu surface from window"), - ) - } - .expect("Could not create wgpu surface"); - - let adapter = instance - .request_adapter(&wgpu::RequestAdapterOptions { - power_preference: wgpu::PowerPreference::default(), - compatible_surface: Some(&surface), - force_fallback_adapter: false, - apply_limit_buckets: false, - }) - .await - .unwrap(); - - let (device, queue) = adapter - .request_device(&wgpu::DeviceDescriptor { - // WebGL doesn't support all of wgpu's features, so if - // we're building for the web we'll have to disable some. - required_limits: if cfg!(target_arch = "wasm32") { - wgpu::Limits::downlevel_webgl2_defaults().using_resolution(adapter.limits()) - } else { - wgpu::Limits::default() - }, - ..Default::default() - }) - .await - .unwrap(); - - let capabilities = surface.get_capabilities(&adapter); - let format = capabilities.formats[0]; - let surface_config = wgpu::SurfaceConfiguration { - alpha_mode: wgpu::CompositeAlphaMode::Auto, - usage: wgpu::TextureUsages::RENDER_ATTACHMENT, - format, - view_formats: Vec::new(), - width: size.width, - height: size.height, - present_mode: wgpu::PresentMode::Fifo, - desired_maximum_frame_latency: 2, - color_space: wgpu::SurfaceColorSpace::Auto, - }; - surface.configure(&device, &surface_config); - - // yakui_wgpu takes paint output from yakui and renders it for us using - // wgpu. - let renderer = yakui_wgpu::YakuiWgpu::new(device.clone(), queue.clone()); - let buffers = renderer.buffers(); - - // yakui_winit processes winit events and applies them to our yakui - // state. - let window = yakui_winit::YakuiWinit::new(window); - - Self { - device, - queue, - - format, - surface, - surface_config, - size, - sample_count, - multisampling: Multisampling::new(), - - renderer, - buffers, - window, - is_init: true, - } - } - - pub fn renderer_mut(&mut self) -> &mut yakui_wgpu::YakuiWgpu { - &mut self.renderer - } - - pub fn window_mut(&mut self) -> &mut yakui_winit::YakuiWinit { - &mut self.window - } - - pub fn surface_format(&self) -> wgpu::TextureFormat { - self.surface_config.format - } - - pub fn resize(&mut self, new_size: PhysicalSize) { - if new_size.width > 0 && new_size.height > 0 && new_size != self.size { - self.size = new_size; - self.surface_config.width = new_size.width; - self.surface_config.height = new_size.height; - self.surface.configure(&self.device, &self.surface_config); - } - } - - #[profiling::function] - pub fn paint(&mut self, yak: &mut yakui::Yakui, bg: wgpu::Color) { - let output = match self.surface.get_current_texture() { - CurrentSurfaceTexture::Success(output) | CurrentSurfaceTexture::Suboptimal(output) => { - output - } - _ => return, - }; - - let view = output - .texture - .create_view(&wgpu::TextureViewDescriptor::default()); - - let surface = self.multisampling.surface_info( - &self.device, - &view, - self.size, - self.format, - self.sample_count, - ); - - let mut encoder = self - .device - .create_command_encoder(&wgpu::CommandEncoderDescriptor { - label: Some("Render Encoder"), - }); - - { - let _render_pass = encoder.begin_render_pass(&wgpu::RenderPassDescriptor { - label: Some("Render Pass"), - color_attachments: &[Some(wgpu::RenderPassColorAttachment { - view: surface.color_attachment, - depth_slice: None, - resolve_target: surface.resolve_target, - ops: wgpu::Operations { - load: wgpu::LoadOp::Clear(bg), - store: wgpu::StoreOp::Store, - }, - })], - ..Default::default() - }); - } - - let clear = encoder.finish(); - - let paint_yak = self.renderer.paint(yak, &mut self.buffers, surface); - - self.queue.submit([clear, paint_yak]); - self.queue.present(output); - } - - pub fn handle_window_event( - &mut self, - yak: &mut yakui::Yakui, - event: &WindowEvent, - event_loop: &ActiveEventLoop, - window: &Window, - ) -> bool { - // yakui_winit will return whether it handled an event. This means that - // yakui believes it should handle that event exclusively, like if a - // button in the UI was clicked. - if self.window.handle_window_event(yak, event, window) { - return true; - } - - match event { - WindowEvent::CloseRequested => { - event_loop.exit(); - } - - WindowEvent::Resized(size) => { - // Ignore any resize events that happen during Winit's - // initialization in order to avoid racing the wgpu swapchain - // and causing issues. - // - // https://github.com/rust-windowing/winit/issues/2094 - if self.is_init { - return false; - } - - self.resize(*size); - } - - _ => (), - } - - false - } -} diff --git a/crates/yakui-app/src/multisampling.rs b/crates/yakui-app/src/multisampling.rs deleted file mode 100644 index d05f0004..00000000 --- a/crates/yakui-app/src/multisampling.rs +++ /dev/null @@ -1,71 +0,0 @@ -use winit::dpi::PhysicalSize; -use yakui_wgpu::SurfaceInfo; - -pub(crate) struct Multisampling { - sample_count: u32, - format: wgpu::TextureFormat, - size: PhysicalSize, - ms_view: Option, -} - -impl Multisampling { - pub fn new() -> Self { - Self { - sample_count: 0, - format: wgpu::TextureFormat::Rgba8UnormSrgb, - size: PhysicalSize::new(0, 0), - ms_view: None, - } - } - - pub fn surface_info<'a>( - &'a mut self, - device: &wgpu::Device, - view: &'a wgpu::TextureView, - size: PhysicalSize, - format: wgpu::TextureFormat, - sample_count: u32, - ) -> SurfaceInfo<'a> { - if size != self.size || format != self.format || sample_count != self.sample_count { - self.size = size; - self.format = format; - self.sample_count = sample_count; - self.ms_view = None; - } - - if sample_count == 1 { - return SurfaceInfo { - format, - sample_count, - color_attachment: view, - resolve_target: None, - }; - } - - let ms_view = self.ms_view.get_or_insert_with(|| { - let texture = device.create_texture(&wgpu::TextureDescriptor { - label: Some("Multisampled Target"), - size: wgpu::Extent3d { - width: size.width, - height: size.height, - depth_or_array_layers: 1, - }, - sample_count, - dimension: wgpu::TextureDimension::D2, - format, - usage: wgpu::TextureUsages::RENDER_ATTACHMENT, - mip_level_count: 1, - view_formats: &[], - }); - - texture.create_view(&Default::default()) - }); - - SurfaceInfo { - format, - sample_count, - color_attachment: ms_view, - resolve_target: Some(view), - } - } -} From bc6155928f3a03fdec574c840254e7ef75766e3a Mon Sep 17 00:00:00 2001 From: Madeline Sparkles Date: Fri, 6 Nov 2026 19:11:25 +0100 Subject: [PATCH 2/6] switch to anymap3 so web doesn't panic --- crates/yakui-core/Cargo.toml | 2 +- crates/yakui-core/src/dom/mod.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/yakui-core/Cargo.toml b/crates/yakui-core/Cargo.toml index 3dc8a689..82e2fdbd 100644 --- a/crates/yakui-core/Cargo.toml +++ b/crates/yakui-core/Cargo.toml @@ -9,7 +9,7 @@ edition = "2024" [features] [dependencies] -anymap = "0.12.1" +anymap3 = "1.1.0" bitflags = "2.11.1" fast-srgb8 = "1.0.0" keyboard-types = { version = "0.8.3", default-features = false } diff --git a/crates/yakui-core/src/dom/mod.rs b/crates/yakui-core/src/dom/mod.rs index 75c972b7..fd29e297 100644 --- a/crates/yakui-core/src/dom/mod.rs +++ b/crates/yakui-core/src/dom/mod.rs @@ -13,7 +13,7 @@ use std::mem::replace; use std::panic::Location; use std::rc::Rc; -use anymap::AnyMap; +use anymap3::AnyMap; use thunderdome::Arena; use crate::id::WidgetId; From 619b279c8208b85b8053dd3d184f4e9cde4b53ae Mon Sep 17 00:00:00 2001 From: Madeline Sparkles Date: Fri, 6 Nov 2026 19:11:06 +0100 Subject: [PATCH 3/6] make bootstrap work with web --- crates/bootstrap/Cargo.toml | 22 +++++++++++++++++----- crates/bootstrap/src/common.rs | 20 ++++++++++++++------ crates/bootstrap/src/lib.rs | 5 +++++ crates/bootstrap/src/with_winit.rs | 18 ++++++++++++++++++ 4 files changed, 54 insertions(+), 11 deletions(-) diff --git a/crates/bootstrap/Cargo.toml b/crates/bootstrap/Cargo.toml index 24dfaa30..e62bd249 100644 --- a/crates/bootstrap/Cargo.toml +++ b/crates/bootstrap/Cargo.toml @@ -11,7 +11,6 @@ profile = ["profiling/profile-with-tracy", "tracy-client"] yakui = { path = "../yakui" } yakui-wgpu = { path = "../yakui-wgpu" } yakui-winit = { path = "../yakui-winit" } -yakui-sdl3 = { path = "../yakui-sdl3" } env_logger.workspace = true log.workspace = true @@ -21,11 +20,24 @@ anyhow.workspace = true wgpu.workspace = true -sdl3 = { workspace = true, features = [ - "build-from-source", - "raw-window-handle", -] } winit = { workspace = true, default-features = true } profiling.workspace = true tracy-client = { workspace = true, optional = true } + +[target.'cfg(target_arch = "wasm32")'.dependencies] +wgpu = { workspace = true, features = ["webgl"] } +console_log = "1.0.0" +console_error_panic_hook = "0.1.7" +wasm-bindgen = "0.2.118" +wasm-bindgen-futures = "0.4.68" +web-sys = "0.3.95" +web-time = "1.1.0" + +[target.'cfg(not(target_arch = "wasm32"))'.dependencies] +yakui-sdl3 = { path = "../yakui-sdl3" } + +sdl3 = { workspace = true, features = [ + "build-from-source", + "raw-window-handle", +] } diff --git a/crates/bootstrap/src/common.rs b/crates/bootstrap/src/common.rs index a69ec921..8a8841d8 100644 --- a/crates/bootstrap/src/common.rs +++ b/crates/bootstrap/src/common.rs @@ -70,12 +70,20 @@ pub fn load_texture(bytes: &[u8], filter: TextureFilter) -> Texture { /// Initialize our logging, adjusting the default log levels of some of our /// noisier dependencies. pub fn init_logging() { - env_logger::builder() - .filter_module("wgpu_hal::auxil::dxgi", log::LevelFilter::Off) - .filter_module("wgpu_core", log::LevelFilter::Warn) - .filter_module("wgpu_hal", log::LevelFilter::Warn) - .filter_level(log::LevelFilter::Info) - .init(); + #[cfg(not(target_arch = "wasm32"))] + { + env_logger::builder() + .filter_module("wgpu_hal::auxil::dxgi", log::LevelFilter::Off) + .filter_module("wgpu_core", log::LevelFilter::Warn) + .filter_module("wgpu_hal", log::LevelFilter::Warn) + .filter_level(log::LevelFilter::Info) + .init(); + } + #[cfg(target_arch = "wasm32")] + { + std::panic::set_hook(Box::new(console_error_panic_hook::hook)); + console_log::init().expect("could not initialize logger"); + } } /// Enables the user to override the scaling of the demo app by setting an diff --git a/crates/bootstrap/src/lib.rs b/crates/bootstrap/src/lib.rs index 17ad9de0..d81cfcec 100644 --- a/crates/bootstrap/src/lib.rs +++ b/crates/bootstrap/src/lib.rs @@ -2,6 +2,7 @@ mod common; mod custom_texture; mod graphics; mod multisampling; +#[cfg(not(target_arch = "wasm32"))] mod with_sdl3; mod with_winit; @@ -76,7 +77,11 @@ fn run(body: impl ExampleBody) { } BootstrapBackend::Sdl3 => { + #[cfg(not(target_arch = "wasm32"))] crate::with_sdl3::run(yak, state, title, body); + + #[cfg(target_arch = "wasm32")] + panic!("SDL3 backend is not supported on wasm target!") } } } diff --git a/crates/bootstrap/src/with_winit.rs b/crates/bootstrap/src/with_winit.rs index 970a6e1a..afd1777d 100644 --- a/crates/bootstrap/src/with_winit.rs +++ b/crates/bootstrap/src/with_winit.rs @@ -1,4 +1,7 @@ +#[cfg(not(target_arch = "wasm32"))] use std::time::Instant; +#[cfg(target_arch = "wasm32")] +use web_time::Instant; use winit::{ application::ApplicationHandler, @@ -56,6 +59,21 @@ impl ApplicationHandler for App { let window = event_loop.create_window(self.attributes.clone()).unwrap(); window.set_ime_allowed(true); + #[cfg(target_arch = "wasm32")] + { + use winit::platform::web::WindowExtWebSys; + + // On wasm, append the canvas to the document body + web_sys::window() + .and_then(|win| win.document()) + .and_then(|doc| doc.body()) + .and_then(|body| { + body.append_child(&web_sys::Element::from(window.canvas().unwrap())) + .ok() + }) + .expect("couldn't append canvas to document body"); + } + let size = window.inner_size(); let size = UVec2::new(size.width, size.height); let sample_count = get_sample_count(); From 8d43ed2b660f12a0d5c510af9e41a6b4480ad53b Mon Sep 17 00:00:00 2001 From: Madeline Sparkles Date: Fri, 6 Nov 2026 19:18:50 +0100 Subject: [PATCH 4/6] configure trunk --- .gitignore | 5 ++++- Trunk.json | 5 +++++ crates/yakui/index.css | 9 +++++++++ crates/yakui/index.html | 6 ++++++ 4 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 Trunk.json create mode 100644 crates/yakui/index.css create mode 100644 crates/yakui/index.html diff --git a/.gitignore b/.gitignore index 6dfd1f0c..f6302f38 100644 --- a/.gitignore +++ b/.gitignore @@ -5,4 +5,7 @@ **/*.snap.new ## IDE specific files -/vscode \ No newline at end of file +/vscode + +# Trunk build output +/dist \ No newline at end of file diff --git a/Trunk.json b/Trunk.json new file mode 100644 index 00000000..3485ea04 --- /dev/null +++ b/Trunk.json @@ -0,0 +1,5 @@ +{ + "build": { + "target": "./crates/yakui/index.html" + } +} diff --git a/crates/yakui/index.css b/crates/yakui/index.css new file mode 100644 index 00000000..99007136 --- /dev/null +++ b/crates/yakui/index.css @@ -0,0 +1,9 @@ +* { + margin: 0; + padding: 0; +} + +canvas { + width: 100%; + height: 100%; +} diff --git a/crates/yakui/index.html b/crates/yakui/index.html new file mode 100644 index 00000000..61bff878 --- /dev/null +++ b/crates/yakui/index.html @@ -0,0 +1,6 @@ + + + + + + From 97fbac73a3d6e99b915c89b42731675e506cafe8 Mon Sep 17 00:00:00 2001 From: Madeline Sparkles Date: Fri, 6 Nov 2026 18:21:43 +0100 Subject: [PATCH 5/6] yeet yakui-app from READMEs --- README.md | 7 ------- crates/yakui-core/README.md | 3 +-- crates/yakui-widgets/README.md | 3 +-- crates/yakui/README.md | 3 +-- 4 files changed, 3 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index dfa58905..3acaff8d 100644 --- a/README.md +++ b/README.md @@ -203,13 +203,6 @@ The `yakui-vulkan` crate is a yakui renderer that uses Vulkan via [ash] [`yakui-vulkan`]: https://crates.io/crates/yakui-vulkan [ash]: https://crates.io/crates/ash -### [`yakui-app`] -The `yakui-app` crate is a wrapper around `yakui-winit` and `yakui-wgpu` intended to make getting started with yakui easier. - -If you are writing your own integration for yakui, this crate is a good learning resource to reference. - -[`yakui-app`]: https://crates.io/crates/yakui-app - ## Games Using yakui There are a handful of games already using yakui for their UI. Here are a couple: diff --git a/crates/yakui-core/README.md b/crates/yakui-core/README.md index fbf0bf23..8f6e251f 100644 --- a/crates/yakui-core/README.md +++ b/crates/yakui-core/README.md @@ -4,5 +4,4 @@ This entire crate is also re-exported from the [`yakui`](https://docs.rs/yakui) You might also be interested in: * [`yakui`](https://docs.rs/yakui) -* [`yakui_widgets`](https://docs.rs/yakui-widgets) -* [`yakui_app`](https://docs.rs/yakui-app) \ No newline at end of file +* [`yakui_widgets`](https://docs.rs/yakui-widgets) \ No newline at end of file diff --git a/crates/yakui-widgets/README.md b/crates/yakui-widgets/README.md index a59969df..e1b9d179 100644 --- a/crates/yakui-widgets/README.md +++ b/crates/yakui-widgets/README.md @@ -4,5 +4,4 @@ Most of this crate is also re-exported from the [`yakui`](https://docs.rs/yakui) You might also be interested in: * [`yakui`](https://docs.rs/yakui) -* [`yakui_core`] -* [`yakui_app`](https://docs.rs/yakui-app) \ No newline at end of file +* [`yakui_core`] \ No newline at end of file diff --git a/crates/yakui/README.md b/crates/yakui/README.md index f1871141..47e1d838 100644 --- a/crates/yakui/README.md +++ b/crates/yakui/README.md @@ -4,5 +4,4 @@ Everything in this crate is exported from [`yakui_core`] and [`yakui_widgets`]. You might also be interested in: * [`yakui_widgets`] -* [`yakui_core`] -* [`yakui_app`](https://docs.rs/yakui-app) \ No newline at end of file +* [`yakui_core`] \ No newline at end of file From 7ffee6fbfa89350cd26436c2077318d4b785e097 Mon Sep 17 00:00:00 2001 From: Madeline Sparkles Date: Fri, 6 Nov 2026 19:17:44 +0100 Subject: [PATCH 6/6] add trunk to README --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 3acaff8d..84b3ad3a 100644 --- a/README.md +++ b/README.md @@ -95,6 +95,8 @@ Example setup code for yakui is available in [`crates/bootstrap`](crates/bootstr You can run examples with `cargo run --example `. Check out [`crates/yakui/examples`](crates/yakui/examples) to get a list of available examples. +You can also run examples on the web with [Trunk](https://github.com/trunk-rs/trunk): `trunk serve --example `. + Many of the examples look like this: ```rust