Skip to content

Upgrade to WGPU v29 + AnyRender 0.10 (+ font embolden)#428

Merged
nicoburns merged 5 commits into
DioxusLabs:mainfrom
nicoburns:vello-29-font-embolden
May 15, 2026
Merged

Upgrade to WGPU v29 + AnyRender 0.10 (+ font embolden)#428
nicoburns merged 5 commits into
DioxusLabs:mainfrom
nicoburns:vello-29-font-embolden

Conversation

@nicoburns
Copy link
Copy Markdown
Member

No description provided.

@nicoburns nicoburns force-pushed the vello-29-font-embolden branch 2 times, most recently from 1d18d0b to d5e749c Compare May 11, 2026 00:10
@tonybierman
Copy link
Copy Markdown
Contributor

@nicoburns want me to fix the wasm build?

@nicoburns nicoburns force-pushed the vello-29-font-embolden branch from d5e749c to 6b5d62f Compare May 11, 2026 00:13
@tonybierman
Copy link
Copy Markdown
Contributor

tonybierman commented May 11, 2026

@nicoburns The Build wasm examples failure is caused by a duplicate anyrender in the dependency graph. examples/wasm_hello and examples/wasm_7guis declare their own [workspace], so they don't inherit the root's git overrides. Their crates.io anyrender and the git anyrender pulled in via blitz-shell are treated as two separate crates, breaking the trait bounds.

The immediate fix is a [patch.crates-io] block in each example, but that has to be manually synced every time a workspace-level dep changes — as this PR demonstrates.

A cleaner structural fix: add the wasm examples to the root workspace as non-default members.

# root Cargo.toml
[workspace]
members = [
    # ... existing members ...
    "examples/wasm_hello",
    "examples/wasm_7guis",
]
default-members = [
    # ... existing default members, excluding the wasm examples ...
]

With this, the examples inherit [workspace.dependencies] and [patch.crates-io] automatically. Native cargo build / cargo check respect default-members and skip them; the dedicated wasm CI job already targets wasm32-unknown-unknown explicitly so nothing changes there. The standalone [workspace] declarations in the example Cargo.toml files would be removed.

@nicoburns
Copy link
Copy Markdown
Member Author

@tonybierman I think it's just that I didn't upgrade to matching anyrender versions there. Was there a reason why the wasm examples aren't in the workspace? Or could we look at moving them into the workspace (where they'd pick up the workspace versions by default)?

@tonybierman
Copy link
Copy Markdown
Contributor

@nicoburns I can add the wasm examples to the root workspace as non-default members. See my detailed comment above.

@nicoburns
Copy link
Copy Markdown
Member Author

Non-default members makes sense for wasm examples I think

@nicoburns nicoburns force-pushed the vello-29-font-embolden branch 12 times, most recently from 4a1cd11 to daf731e Compare May 15, 2026 16:10
@nicoburns nicoburns changed the title Upgrade to WGPU v29 + Vello with font embolden Upgrade to WGPU v29 + AnyRender 0.10 (+ font embolden) May 15, 2026
@nicoburns nicoburns marked this pull request as ready for review May 15, 2026 16:27
@nicoburns nicoburns force-pushed the vello-29-font-embolden branch from 65fb152 to cb5daf6 Compare May 15, 2026 16:31
@nicoburns nicoburns merged commit 2261682 into DioxusLabs:main May 15, 2026
16 checks passed
@nicoburns nicoburns deleted the vello-29-font-embolden branch May 15, 2026 16:42
nixpt added a commit to nixpt/bliss-engine that referenced this pull request May 18, 2026
* fix: check for visibility changes for damage (DioxusLabs#343)

* Port Mustang, Scripting, and Forms; Add branding and docs

* Use shared `SourceCache` for thread-local fontique `Collection`s

* Fix stale node references after node removal

When nodes are removed:
- Clear hover_node_id if it was set to the node being remove
- Clear active_node_id if it was set to the node being removed
- Remove snapshots for removed nodes to prevent stale snapshot panics

Co-Authored-By: Nico Burns <nico@nicoburns.com>

* Set restyle hint when updating style attribute

Fixes DioxusLabs#345

* Upgrade to Parley with icu4x + core-text font enumeration

* Enable multithreading in Stylo

* Use if-let in process_preorder

* Run stylo gc

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Add mimalloc feature to browser app

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Upgrade to Stylo 0.12

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Fix min-content size of text inputs

* Don't make new windows visible until after AccessKit has initialized (DioxusLabs#350)

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Fix google image

* Upgrade comrak to 0.50

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Upgrade Skrifa to 0.37

* cargo update

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Implement CSS `caret-color` property

Signed-off-by: Nico Burns <nico@nicoburns.com>

* chore: move from print to tracing (DioxusLabs#356)

* Fix unused_variable warnings with tracing feature disabled

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Add support text-indent (bump Parley)

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Move text_indent computation down to right before it's use to avoid (DioxusLabs#360)

wasted work when the early exit fires. (Also keeps the variable
definition next to its usage)

Use GenericTextIdent::zero() instead of manually constructing the
default so verbosely

Changed unwrap_or to unwrap_or_else to avoid eagerly constructing the
default value on every call

* Feature/errors in browser UI (DioxusLabs#361)

* Move text_indent computation down to right before it's use to avoid
wasted work when the early exit fires. (Also keeps the variable
definition next to its usage)

Use GenericTextIdent::zero() instead of manually constructing the
default so verbosely

Changed unwrap_or to unwrap_or_else to avoid eagerly constructing the
default value on every call

* Show errors in the UI

I opened a page, has mistyped the url and wondered why nothing happened,
until I checked the logs.

Admittedly this is not nice, but it's something and a base for
discussion.

* PR feedback

* Implement the view-source menu-item from DioxusLabs#363 (DioxusLabs#364)

* Implement the view-source menu-item from DioxusLabs#363

This allows to, well, view the source code of the current document.

Trade-Off: We store the entire source as a Signal<String> ... an
alternative would be to refetch it.

* PR feedback

* BrowserUI: tweak menu styling

* Add word-spacing. (DioxusLabs#367)

Co-authored-by: Austin M. Reppert <austinmreppert@protonmail.com>

* Feature/capture screenshot (DioxusLabs#365)

* Implement the view-source menu-item from DioxusLabs#363

This allows to, well, view the source code of the current document.

Trade-Off: We store the entire source as a Signal<String> ... an
alternative would be to refetch it.

* Implement the "capture screenshot" menu-item from DioxusLabs#363

* PR feedback

* Make rfd optional and only enable it on desktop platforms (hopefully...
just winged that, have no ios/android experience)

* Use async file dialog (fixes crash on macos)

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Make rfd dependency optional

Signed-off-by: Nico Burns <nico@nicoburns.com>

---------

Signed-off-by: Nico Burns <nico@nicoburns.com>
Co-authored-by: Nico Burns <nico@nicoburns.com>

* BrowserUI: Split screenshot functionality into separate module

* BrowserUI: Fix styles when building with dx

dx's style preprocessing seems to choke on the commented out code.

* BrowserUI: tweak mobile styling

* cargo fmt

* Draw borders with the same color in single bezpath. (DioxusLabs#366)

* Draw adjacent borders with the same color in single bezpath.

* Avoid unnecessary deref.

* Avoid duplicate draw.

* Handle wraparound case.

* Handle non-adjacent edges touching.

---------

Co-authored-by: Austin M. Reppert <austinmreppert@protonmail.com>

* BrowserUI: fix build with screenshot feature disabled

* Track critical resources (prevent Flash Of Unstyled Content)

* Remove duplicate paint call

* Bump parley

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Add support for the `direction` property.

This implements support for block-level boxes.
Implementation: DioxusLabs/taffy#906

* Implement naive text-transform (uppercase and lowercase)

* Update MainActivity.kt (DioxusLabs#378)

* WASM compile fixes (DioxusLabs#379)

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Support `scale`, `rotate`, and `translate` properties (DioxusLabs#380)

* Support individual scale,rotate,translate properties

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Revert to resolving transform during paint

---------

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Bump Taffy (&LayoutInput cache key)

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Log perf in "just browser" command

* Upgrade Stylo to 0.13

* Upgrade Stylo to 0.14

* Fix tests post Stylo 0.14 upgrade

* Upgrade AnyRender 0.8 (WGPU v28) (+bump MSRV to 1.92) (DioxusLabs#382)

Signed-off-by: Nico Burns <nico@nicoburns.com>

* BrowserUI: AnyRender Scene capture (DioxusLabs#369)

* BrowserUI: Implement AnyRender Scene capture

* Use .scene extension when recording scenes

Signed-off-by: Nico Burns <nico@nicoburns.com>

---------

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Bump parley

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Bump Parley (0.8.0 + floats)

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Remove outdated allow(dead_code)

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Filter out comments when constructing layout tree (fixes DioxusLabs#387)

Co-Authored-By: Tristan Phease <tristan.phease@gmail.com>

* Implement Apple Standard Keybindings (DioxusLabs#388)

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Use Taffy v0.10.0 from crates.io

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Upgrade Stylo to v0.15.0

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Upgrade Parley (macoOS CJK fix)

* Fix get_client_bounding_rect method. Previously it was returning the width in place of the height

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Upgrade Stylo v0.16.0

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Bump Parley (float PR fixes)

* Fix backspace deleting two characters on macos

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Disable zip for WPT archive

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Add BaseDocument::set_media_type for paged/print use cases (DioxusLabs#390)

* Allow configuring the CSS media type on BaseDocument

Previously `make_device` hardcoded `MediaType::screen()`, so `@media print`
rules were never applied — which blocks PDF / print-styled rendering on top
of Blitz. Add `DocumentConfig::media_type`, store the resolved `MediaType`
on `BaseDocument`, and expose `media_type()` / `set_media_type()` so callers
can switch media types at runtime (rebuilding the stylist device).

* Take MediaType by value in make_device

Every caller now has a concrete MediaType to pass (resolved from
DocumentConfig during construction, or read from self.media_type
afterwards), so wrapping it in Option just added noise and a hidden
default-to-screen path that the non-construction callers would never
intentionally hit.

* Bump Taffy to v0.10.1

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Trigger WPT results update

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Make trigger job depend on wpt job

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Fix clippy lints (rust 1.95)

Signed-off-by: Nico Burns <nico@nicoburns.com>

* CI: fix small typo to trigger CI

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Publish WPT results to Github Pages

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Set permissions for deploying to Github Pages

Signed-off-by: Nico Burns <nico@nicoburns.com>

* CI: Calculate WPT score summary

Signed-off-by: Nico Burns <nico@nicoburns.com>

* CI: Diff WPT with main

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Only upload to Github Pages on the main branch

Signed-off-by: Nico Burns <nico@nicoburns.com>

* feat(table): support rowspan attribute on td/th (DioxusLabs#395)

* examples: add rowspan minimal reproduction fixture

Demonstrates the current broken behavior where <td rowspan=2>
is rendered as span=1, causing cells in row 3 to overlap or shift
unexpectedly.

* feat(table): support rowspan attribute on td/th

The `<td rowspan=N>` / `<th rowspan=N>` attribute was ignored because
`grid_row.end` was hardcoded to `span(1)`. This caused cells in later
rows to overlap with or shift around rowspan cells from earlier rows.

Fix:

- Parse `rowspan` on cell nodes, clamped to [1, 65534] per HTML Standard.
- Apply it to `grid_row` span.
- Switch `grid_column.start` to `auto` so that cells use Taffy's grid
  auto-placement for column positioning.
- Set `grid_auto_flow: RowDense` on the table root.

The `dense` auto-flow is required because the default (sparse) flow
holds a per-item secondary-axis cursor across rows in
`place_definite_secondary_axis_item`. With sparse flow, a cell in row N+1
would start its column search after wherever the previous cell ended,
rather than restarting from the first track of its own row. That makes
it impossible to backfill columns left empty by rowspan cells from
earlier rows. The `dense` branch resets the search to the first track
for every item and so naturally skips columns occupied by rowspan cells
(it still honors each cell's explicit grid_row so inter-row order is
preserved).

rowspan=0 is currently clamped to 1 rather than interpreted as "span to
end of row group" as the HTML Living Standard specifies. Browser
behavior for rowspan=0 is inconsistent and this PR focuses on the
common case; deferring the spec-exact behavior as a follow-up.

* CI: fix WPT deploy branch

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Cargo update

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Upgrade html/xml/markup5ever to v0.39

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Bump comrak to v0.52

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Upgrade reqwest to 0.13

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Upgrade pixels_window_renderer

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Upgrade to wuff 0.2.4

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Upgrade accesskit_macos and accesskit_unix

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Fix clippy

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Use parley v0.9.0

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Remove direct rendering dependencies (handled by AnyRender)

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Reorder deps: move Parley next to Taffy

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Remove fastrand dependency

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Upgrade rustc-hash to 2.1.2

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Upgrade png to 0.18

* Remove C-based WOFF decoding. Rename `woff-rust` feature to just `woff`

The `wuff` crate has proved itself to be reliable, so there is no need
to maintain the C-based WOFF decoding anymore.

* Upgrade pixels_window_renderer

Signed-off-by: Nico Burns <nico@nicoburns.com>

* CI: Set rustflags on ios

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Port Config::with_window_attributes from dioxus-native 0.7.x

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Make dioxus-cli-config a non-optional dependency of dioxus-native

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Upgrade dioxus-native and dioxus-native-dom to Edition 2024

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Cargo fmt (Edition 2024)

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Simplify dioxus-native prelude code

* Bump version to 0.3.0-alpha.1

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Use exact (=) version constraint for internal alpha dependencies

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Implement CSS counter-style symbols() support (DioxusLabs#396)

Implements the CSS symbols() function for custom counter styles.
Previously fell back to • for all custom counter-style definitions.
Now properly cycles through the defined symbols based on
the list item index, per CSS counter-styles spec.

Fixes TODO in layout/list.rs

* CI: Only run archive job trigger on main branch

Signed-off-by: Nico Burns <nico@nicoburns.com>

* perf: only clip box-shadow layer when element has opacity (DioxusLabs#397)

Previously, a clip layer was always created when an element had an outset
box-shadow, even if the element was fully opaque (opacity == 1.0).

Now we only create the clip/layer when opacity < 1.0, avoiding
unnecessary layer creation for the common case of fully opaque elements.

* refactor: use extract_if instead of retain (DioxusLabs#399)

* fix: implement case-sensitive attribute selectors (DioxusLabs#401)

Add support for CSS [attr="value" i] case-insensitive attribute selectors.
Uses Cow<str> to avoid allocations in the common case (case-sensitive),
only allocating when lowercase conversion is needed.

* Add package opt-level overrides for "tiny" profile

* Make content_type option is Blitz net types

Signed-off-by: Nico Burns <nico@nicoburns.com>

* feat(browser): add opt-in FPS counter overlay (DioxusLabs#402)

* feat: add FPS counter overlay to browser UI

Adds an opt-in HUD-style overlay (top-right) that shows current FPS
and frame time, gated behind a `--show-fps` CLI flag. Frame timing is
measured via a dioxus_native CustomPaintSource whose `render` method
is invoked once per real paint, giving a true wall-clock measurement
of the redraw cadence.

Addresses the "FPS counter" item in DioxusLabs#363.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* style: apply rustfmt to browser main.rs

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* refactor: move FPS toggle to menu, remove --show-fps CLI flag

- Remove ShowFps context and --show-fps command-line argument
- Add "Toggle FPS" menu item below "Toggle DevTools"
- Lower FPS overlay z-index (50) below dropdown menu (100)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix: gate FPS overlay behind vello feature flag

use_wgpu is only available with the vello rendering backend, so
fps_overlay, the show_fps signal, and the Toggle FPS menu item are
all gated behind #[cfg(feature = "vello")].

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* style: apply rustfmt to browser crate

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>

* feat(browser): tabs (multiple embedded documents) (DioxusLabs#406)

* Functional tabs

* feat(browser): polish tabs — title cache, reactive window title, disabled nav buttons

- Per-tab title Signal populated after parse; tab strip shows live titles, falls back to URL.
- Window title bound reactively to active tab's title (Step 5 of DioxusLabs#363 plan).
- Back/forward IconButtons gain a disabled prop; render dim and click is a no-op when there's no history in that direction.
- Tabs widened, rounded upper corners, seamless join with urlbar.
- active_tab() returns Tab directly instead of a 5-tuple (clears clippy type_complexity).
- Drop apps/browser/TABS-PLAN.md (planning doc, no longer needed in-tree).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* refactor(browser): split app() into TabStrip/Toolbar components, fix stale-request bug

- Extract TabStrip and Toolbar as sub-components to reduce app() from ~425 to ~60 lines
- Fix inverted stale-request guard in load_document (was printing but never returning)
- Deduplicate DocumentConfig construction into make_doc_config() helper
- Replace println! with tracing::{info,warn,error,debug}; add tracing as direct dep
- Fix is_focussed → is_focused spelling
- Replace core::mem::drop() → drop() (two sites)
- Fix window_title to call tab_title_or_url() instead of duplicating logic
- Remove dead History::refresh method
- Extract HOME_URL_STR constant; merge std use-tree imports

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* feat(browser): add custom start page with centered Blitz logo

New tabs and the home button now open about:newtab, a local start page
that displays the Blitz logo centered on a light background. The logo
is embedded as a base64 data URI so no network request is needed.
DocumentLoader intercepts about:newtab synchronously before spawning
a fetch task.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* feat(browser): add status bar with hover-link URL and loading indicator

StatusBar component polls the sub-document's hover node at 100ms
intervals (same pattern as FpsOverlay), walks the layout_parent chain
to find the nearest <a> ancestor, and resolves relative hrefs against
the current page URL. Displays loading URL during fetches; hidden when
idle and not hovering a link. Fixed-positioned bottom-left, pointer-
events: none so it never blocks clicks.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix(browser): avoid RefCell panic in StatusBar polling task

The polling task wakes up during Dioxus event processing, which holds
a mutable borrow on the outer BaseDocument. Replace handle.doc() with
handle.try_doc() so that if the RefCell is already borrowed, the poll
cycle is silently skipped rather than panicking.

Add NodeHandle::try_doc() to dioxus-native-dom for this purpose.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix(browser): reset DocumentLoaderStatus to Idle after fetch completes

The async load task never wrote Idle back when done, so the status bar
kept showing "Loading…" indefinitely. One write after the match covers
both the success and error paths; the stale-request early-return is
unaffected.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* feat(browser): add Clear Cache menu item; nudge FPS overlay down

- blitz-net: store CACacheManager in Provider, expose async clear_cache()
- browser: Clear Cache menu item calls it via use_context (cache feature-gated)
- browser.css: fps-overlay top 48px → 80px to clear the urlbar

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* refactor(browser): idiomatic cleanup of main.rs

- Rename `Ordering as Ao` alias to plain `Ordering`
- Pre-compute `has_back`/`has_forward` once per Toolbar render instead of calling `active_tab()` twice
- Extract `hovered_href` free fn to replace 50-line labeled-block nest in StatusBar polling loop
- Replace `str::from_utf8(&bytes).unwrap()` with `String::from_utf8_lossy` to avoid panic on non-UTF-8 responses
- Use `saturating_sub(1)` in `close_tab` to guard against underflow
- Fix clippy `redundant_closure` in `use_signal(|| String::new())`
- Run rustfmt

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* Correctly unload subdocuments when their node is removed from the DOM

* refactor(browser): split main.rs into focused modules

Move History, Tab, DocumentLoader, TabStrip, Toolbar, and StatusBar
into their own files. Expose a public HistoryNav delegation trait to
bridge the private trait generated by #[store] across module boundaries.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* Avoid triggering Dioxus change detection if hover_url hasn't changed

* Fix tab navigation and incremental layout panic

Navigation now works in all tabs, not just the rightmost one, by
subscribing the load effect to every tab's current URL signal.

Fixes a panic ("invalid key") in resolve_layout_children_recursive
when incremental layout is enabled: anonymous blocks and pseudo-elements
can be removed from the slab between render passes, leaving stale IDs
in cached layout_children. Guard the recursive function entry against
stale keys and filter them from the cached children list before use.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* feat(browser): compress tabs to fit and add hover tooltip

Tabs now shrink equally as more are opened (flex: 1 1 0, min-width: 0)
so the + button is never pushed off screen. A CSS tooltip shows the
full tab title on hover for tabs that are too narrow to read.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix(browser): prevent tab switch from triggering page reload

Move the load-on-history-change effect into a per-tab TabView component
so it only subscribes to that one tab's history URL. Switching tabs no
longer fires any load effect since active_tab_id is not a reactive
dependency of TabView's use_effect.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* perf(resolve): avoid Vec allocation when iterating stale layout children

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
Co-authored-by: Nico Burns <nico@nicoburns.com>

* Reduce default tab width and border-radius

* Implement merged titlebar on macOS

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Close menu when triggering the open in external browser menu item

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Allow clicking a `<button>` element to submit a form

* stores everywhere (DioxusLabs#409)

Co-authored-by: Evan Almloff <evanalmloff@gmail.com>

* feat(browser): Dioxus Tabs (DioxusLabs#412)

Replace inline about:newtab HTML with a Dioxus-rendered AboutPage
component, and extract URL/nav helpers from toolbar.rs into a new
nav module. Settings, History, and Bookmarks are wired through the
menu to Dioxus tabs and currently open a stub placeholder.

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>

* feat(browser): browser history and tab favicons (DioxusLabs#413)

* feat(browser): browser history and tab favicons

Adds a browsing history page (about:history) with per-entry favicons and elapsed-time labels, favicon display in the tab strip, and ICO decoder support. Favicon probing and sniffing live in a new favicon.rs module; history data and dedup logic are in browser_history.rs.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* feat(browser): BrowsingHistory store, decoder-based favicon probe, clippy cleanup

- Replace Signal<VecDeque<HistoryEntry>> with Store<BrowsingHistory>;
  record_visit/clear become Store extension methods. The free function
  is kept private so it can be unit-tested without a Dioxus runtime.
- Favicon probe decodes via image+usvg instead of magic-byte sniffing,
  so truncated payloads are correctly rejected. Drop the `ico` cargo
  feature in favor of always-on image/ico.
- Add BaseDocument::favicon_url() so the browser app reads the icon
  link through the document API.
- .tab-content: min-height: 0 to let the flex child shrink.
- apps/browser is clean under -W unwrap_used/expect_used/panic/
  indexing_slicing/arithmetic_side_effects/redundant_clone: saturating
  arithmetic for indices, wrapping_add for the reload generation
  counter, get/get_mut for bounded indexing, let-else for Event
  downcasts, scoped #[allow] with reason comments where an invariant
  makes the operation safe. capture_anyrender_scene logs and returns
  on error instead of unwrapping.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* Revert drive-by lint changes

Signed-off-by: Nico Burns <nico@nicoburns.com>

---------

Signed-off-by: Nico Burns <nico@nicoburns.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: Nico Burns <nico@nicoburns.com>

* perf(browser): move favicon probe off the page-load critical path (DioxusLabs#414)

* perf(browser): move favicon probe off the page-load critical path

The favicon resolver was awaited inside DocumentLoader::load_document,
so every navigation blocked on a network round-trip plus a full image
decode of the icon before the new document could be swapped in. The
decode also ran on the async executor thread.

Split favicon resolution into a synchronous candidate-URL computation
and an async probe. The loader returns immediately with the candidate;
the tab spawns the probe in the background and writes tab.favicon_url
when it resolves (gated on the tab still being on the same page, so a
stale probe can't stomp a newer navigation). History entries created
with favicon=None get patched in place via a new BrowsingHistory::
set_favicon(id, url), keyed by the entry id record_visit now returns.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* style(browser): rustfmt

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>

* Browser UI: use pointer cursor less

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Differentiate between cursor:default and cursor:auto

* feat(browser): urlbar autocomplete and on-disk history (DioxusLabs#415)

* feat(browser): urlbar autocomplete and on-disk history

Adds urlbar autocomplete (history matches + a "Search with DuckDuckGo" row, keyboard-driven) backed by a new sqlite history store that hydrates the in-memory BrowsingHistory on startup.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* refactor(browser): extract browser-persistence crate; fuzzy urlbar suggestions

- Move HistoryStore into a new workspace crate apps/browser/persistence,
  managed via rusqlite_migration. Introduce HistoryService that owns the
  in-memory Store and on-disk HistoryStore together so callers no longer
  write to both sides.
- Replace urlbar substring matching with nucleo fuzzy ranking; add a
  Literal "what Enter would do" row; drop hover-to-select.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* style(browser-persistence): rustfmt import order

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* Pre-select the first suggestion

---------

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
Co-authored-by: Nico Burns <nico@nicoburns.com>

* Add CI task to publish browser app (DioxusLabs#417)

* Fixup artifact names

* Use git dep for dioxus cli

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Publish: Install more deps on linux

* Set webview_install_mode to skip + set windows icon_path

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Add artefact paths for linux

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Fixup webview_install_mode

* Only use git CLI on linux

* Use windows path syntax for windows icon path

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Fixup artefact paths

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Use CLI that canonicalizes windows icon path

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Use backslash for windows icon path

* Try new cli version

* Upload artifacts for windows bundle

* Actually use an arm runner for windows arm builds

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Fix windows arm artifact paths

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Use american spelling of artifact

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Use v0.7.3 of CLI

* Enable verbose logging

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Enable trace logs

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Use bin cli on all platforms

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Use Rust 1.92

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Use git CLI on macOS (signing/notarization fixes)

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Sign and Notarize macOS bundle

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Fix bundle path for new bundler

* Set APPLE_API_KEY not APPLE_API_KEY_ID variable

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Run CI task on push to main

Signed-off-by: Nico Burns <nico@nicoburns.com>

---------

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Bump action versions

* cargo update

* CI: disable fail-fast for browser publish task

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Use new CLI bundling on linux/windows (DioxusLabs#419)

* Enable browser CI for pull requests

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Use dioxus cli 0.7.7 on windows/linux

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Use whole dir for artifacts on windows/linux

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Add nice job names

* Upload single file artifacts

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Fix macos x86_64 dmg location

Signed-off-by: Nico Burns <nico@nicoburns.com>

---------

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Don't run Publish Browser workflow on PRs

Signed-off-by: Nico Burns <nico@nicoburns.com>

* fix windows icon (DioxusLabs#420)

* perf(browser): move urlbar fuzzy matching to nucleo worker (DioxusLabs#416)

* perf(browser): move urlbar fuzzy matching to nucleo worker

Replace the synchronous nucleo-matcher rescore with a tokio worker that
drives the higher-level `nucleo` crate, so each keystroke no longer
rescans the entire history on the UI thread. The toolbar pushes queries
into the worker via a channel and reads results from a Signal; history
entries are pushed in via a use_effect so the matcher restarts when
history changes.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* Fix merge conflict

---------

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
Co-authored-by: Nico Burns <nico@nicoburns.com>

* Use GET rather than POST for synthesized duckduckgo queries.

(so they don't all show up in the history with the same URL)

* Use native-tls rather than rustls (fixes Android)

* Use pointerdown rather than mousedown for suggestions (works on mobile)

* Upgrade Stylo to v0.17

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Initial `user-select:none` implementation (DioxusLabs#411)

* Implement `user-select:none`.

This implementation only prevents starting a selection in the node, and
does not prevent selecting pseudo-elements with `user-select: auto`.

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Don't use text cursor for text with `user-select:none`

---------

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Use Blitz logo with text on start page

* Remove unused BLITZ_LOGO asset

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Add Browser UI build for Android (DioxusLabs#423)

* Add Browser UI build for Android

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Run Publish Browser on PR

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Only use Signed Builds environment for main branch builds

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Only write private key file on main branch

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Only delete prviate key file on main branch

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Pass --android and fix artifact path

* Run Android build on x86 host (arm runner doesn't include the Android SDK)

Signed-off-by: Nico Burns <nico@nicoburns.com>

---------

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Rename published apk (DioxusLabs#424)

* Rename apk

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Remove android from name

Signed-off-by: Nico Burns <nico@nicoburns.com>

---------

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Enable vendored openssl by default on Android

* CI: sign Android Builds

* Browser UI: Add max-width to new tab page search input

* Fix crash from mouse leaving viewport meaning mousedown_node_id doesn't exist even though mousebutton is down

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Upgrade to dioxus v0.7.8. Use prebuilt v0.7.8 CLI for builds on all platforms

Signed-off-by: Nico Burns <nico@nicoburns.com>

* cargo update

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Don't run publish browser workflow on PRs

Signed-off-by: Nico Burns <nico@nicoburns.com>

* New Custom Widget API (DioxusLabs#425)

Replaces the CustomPaintSource API with a new Custom Widget API based based on the Widget trait. See custom_widget and wgpu_texture examples for details.

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Fix Dioxus Native sub documents (Custom Widget PR broke setting sub documents)

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Fix blitz-shell compile with custom-widget feature disabled

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Add wasm32 support (async renderer resume) (DioxusLabs#426)

* Add WASM support

Signed-off-by: Nico Burns <nico@nicoburns.com>

* wasm_7guis: fix Update/Delete buttons appearing disabled when selection exists

Blitz does not invalidate :disabled pseudo-class styling when the
disabled attribute changes reactively. Drive the disabled visual state
via a .btn-off class instead, matching the class-toggle pattern already
used for .list-item.selected. The disabled attribute is kept for
semantics; hover suppression is updated to exclude .btn-off buttons.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* Upgrade to latest AnyRender `main`

---------

Signed-off-by: Nico Burns <nico@nicoburns.com>
Co-authored-by: Nico Burns <nico@nicoburns.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>

* Upgrade to published AnyRender 0.9

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Implement event handling for custom widgets

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Standardize wasm examples: unify seven_guis/todomvc, add HOWTO_WASM.md (DioxusLabs#429)

Fix examples CI build.

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>

* WASM canvas resize: skip with_surface_size on wasm (alt to DioxusLabs#431) (DioxusLabs#432)

Alternative implementation of Nico's hypothesis on DioxusLabs#431. Instead of
stripping the inline `canvas.style.width/height` that winit-web writes,
drop the `.with_surface_size(...)` call on wasm entirely so the styles
never get set in the first place. Host CSS controls the canvas box.

Three pieces in one branch:
- Examples (seven_guis, todomvc, wasm_hello) no longer call
  `.with_surface_size(...)` on wasm; the seven_guis and todomvc
  `index.html` files get `canvas { width: 100%; height: 100% }` so the
  canvas fills the viewport once winit isn't pinning it.
- `View::init` falls back to reading the canvas's CSS layout box
  (`offset_width × offset_height × devicePixelRatio`) when winit-web's
  initial `surface_size()` is 0×0 — without this, wgpu fails with a
  swapchain-size-0 error before the first ResizeObserver fires.
- Same wgpu `surface.configure` debounce as DioxusLabs#431, with a coalesce guard
  so a continuous browser-window drag schedules one timer instead of
  one per `SurfaceResized`.

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>

* Add font face override (DioxusLabs#433)

* blitz-dom: honour @font-face descriptors in FontInfoOverride

Propagate font-family / font-weight / font-style from the @font-face
descriptors all the way through the NetProvider handler to
Collection::register_fonts, instead of dropping them and forcing parley
to read the family name from the TTF's name table.

* blitz-dom: unit tests for stylo_to_fontique_style mapping

Cover the four interesting branches of the stylo -> fontique font-style
translator added in the prior commit:

- StyloFontStyle::Italic -> FontStyle::Italic
- Oblique(0deg, 0deg)    -> FontStyle::Normal (CSS `normal` round-trip)
- Oblique(14deg, 14deg)  -> FontStyle::Oblique(Some(14.0))
- Oblique(10deg, 20deg)  -> FontStyle::Oblique(Some(10.0))

The Oblique(0, 0) -> Normal mapping is the subtle case stylo's parser
emits for bare CSS `normal`; pinning it stops a future refactor from
silently regressing upright font matching.

* blitz-dom: regression-pin @font-face descriptor honouring

Drive load_resource directly with a Resource::Font carrying
FontFaceOverrides { family_name: Some(\"AliasedFamily\"), .. } and assert
that fontique's Collection ends up with a family registered under the
CSS-declared alias rather than the TTF's internal `name` table entry.

We bypass HTML parsing here because blitz-html (which owns the parser
that drives fetch_font_face) is a downstream crate and would create a
circular dependency. The descriptor parsing path is already covered by
the stylo_to_fontique_style unit tests in net.rs; this test pins the
load-side of the pipeline so a future refactor of load_resource can't
silently drop the override again.

---------

Co-authored-by: Henrique Anzoategui <hanzoategui@kigo.io>

* Make dioxus_native::launch_cfg work on WASM (DioxusLabs#434)

Adds `font_ctx: Option<FontContext>` to `Config` with a `with_font_ctx`
builder, threads it through to `DocumentConfig`, and seeds WASM defaults
(`with_append(true)` + initial surface size) so a single `launch_cfg`
call replaces the ~70-line hand-rolled wasm entry point in each example.

- New `blitz_dom::build_font_ctx` helper for constructing a FontContext
  from bundled font bytes, re-exported from `dioxus-native`.
- New `panic-hook` and `woff` features on `dioxus-native`, default-on.
- `blitz-dom`'s default FontContext no longer requests system fonts on
  wasm32 (browsers don't expose them).
- Gates the tokio-backed `blitz_net::Provider` setup behind
  `not(target_arch = "wasm32")`.
- Simplifies `examples/todomvc/src/wasm.rs` and the `wasm_entry` module
  in `examples/seven_guis/src/lib.rs`.

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>

* Add StyleThreading::Sequential opt-out for concurrent document resolves (DioxusLabs#437)

* Add StyleThreading::Sequential opt-out for concurrent document resolves

Stylo runs traversal on a process-wide rayon pool shared between all
Documents. Its per-worker SHARING_CACHE_KEY thread-local is mutably
borrowed for the entire traversal, so two concurrent resolves that
share a pool worker panic with "already mutably borrowed".

Add a per-document `StyleThreading` enum on DocumentConfig. The new
`Sequential` variant bypasses the global pool at the traverse_dom
call site (packages/blitz-dom/src/stylo.rs), making it safe to
resolve from many user threads concurrently. The default remains
`Parallel`; existing single-document callers are unaffected.

Note: a `set_pref!("layout.threads", ...)` approach won't work
because the pref is read once when STYLE_THREAD_POOL is first
forced. Gating at the traverse_dom call site makes the choice
truly per-document.

This is a Blitz-side mitigation; the underlying Stylo race is
unchanged.

Refs DioxusLabs#430

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* Fix apps/browser DocumentConfig literals after style_threading addition

Two struct literals in apps/browser exhaustively listed every
DocumentConfig field, so adding `style_threading` broke the compile
with E0063. Appending `..Default::default()` resolves it and makes
both sites robust to future field additions.

Refs DioxusLabs#430

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>

* Fix intermittent image loads on rate-limited CDNs (DioxusLabs#435) (DioxusLabs#439)

* Fix intermittent image loads on rate-limited CDNs

- blitz-net: per-host concurrency cap (6), 429/503 retry with Retry-After
  + exponential backoff, updated User-Agent per Wikimedia policy, and a
  HttpStatus error variant for non-2xx responses
- blitz-dom: ImageHandler::parse now reports underlying decode/SVG errors
  instead of a generic "Could not parse image"; load_resource warns on
  failure and cleans up pending_images so retries can succeed
- apps/browser: optional CLI URL argument for opening a page directly,
  blitz-paint?/tracing pass-through

Fixes DioxusLabs#435.

* blitz-net: drop 429/503 retry loop

Other browsers surface rate-limit errors instead of auto-retrying, and
the in-loop tokio::time::sleep was keeping fetch tasks alive past
window close, hanging the process on shutdown. The per-host concurrency
cap and HttpStatus error variant stay; refresh now drives retries.

Also drop a few stale/redundant comments in the same file.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* blitz-dom: abort in-flight fetches on navigation + share image cache

Threads `DocumentConfig::abort_signal` through every sub-resource Request
blitz-dom issues (stylesheets, @import, @font-face, <img>, background
images), so a single AbortController cancels everything tied to a
document. The browser installs a fresh controller per load and aborts
the previous one on reload, navigate, and drop — fixing the
refresh-pounding case where prior loads kept fetching after the user
moved on.

Adds `DocumentConfig::image_cache` (SharedImageCache =
Arc<Mutex<HashMap<String, ImageData>>>) so decoded images persist
across BaseDocument lifetimes. The browser supplies one cache per
tab, so a refresh reuses already-decoded images instead of re-fetching
and tripping rate-limited CDNs.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* blitz-dom: drop SharedImageCache, rely on http_cache_reqwest

Reverts the shared in-memory decoded-image cache from 3193e26
following reviewer feedback. Storing decoded RGBA8 pixels keyed by URL
with no eviction policy across a tab's lifetime is unbounded memory
growth — and the wrong layer for this problem. blitz-net already has a
disk-based HTTP cache via `http_cache_reqwest`, which is the correct
place to short-circuit network fetches on refresh.

Keeps the abort-on-navigate/reload wiring from 3193e26; that change
is independent and addresses a separate class of refresh-pounding
behavior (cancelling stale fetches rather than caching their results).
Adds a docstring on `BaseDocument::build_request` explaining why both
it and the free `net::stamped_request` exist (borrow-checker split).

If `http_cache_reqwest` isn't catching Wikimedia thumbnails on
refresh, that's the layer to investigate.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>

* blitz-net: restore Firefox UA to fix DuckDuckGo redirect links (DioxusLabs#440)

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>

* CI: fix macos

Signed-off-by: Nico Burns <nico@nicoburns.com>

* CI: fix macOS Intel

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Add architecture mermaid diagram

Signed-off-by: Nico Burns <nico@nicoburns.com>

* More CI fixes

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Upgrade to WGPU v29 + AnyRender 0.10 (+ font embolden) (DioxusLabs#428)

* Upgrade to WGPU v29 + Vello with font embolden

* Use AnyRender that marks override textures as dirty

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Implement custom wgpu textures for Vello Hybrid

* Upgrade to released version of vellos

* Use AnyRender 0.10 from crates.io

Signed-off-by: Nico Burns <nico@nicoburns.com>

---------

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Use taffy with experimental cache fix

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Bump direct skrifa dependency to 0.42.1

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Feature flag font-embolden

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Upgrade anyrender (patch out embolden offsetting)

* Upgrade anyrender_skia to 0.8.0 (skia-safe 0.97.0)

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Don't hint emboldened text

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Browser UI: make anyrender dep non-optional

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Make vello_hybrid the default renderer

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Enable font embolden by default on apple platforms

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Bump Taffy (version number only)

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Bump taffy version again

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Move wasm_hello example into the main workspace

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Bump version to 0.3.0-alpha.3

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Remove profile from wasm_hello example

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Fix typo: WANRING -> WARNING

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Introduce precendence chain for renderers

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Require blitz-dom/custom-widget in dioxus-native-dom

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Reduce MSRV to 1.89

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Bump version to 0.3.0-alpha.4

Signed-off-by: Nico Burns <nico@nicoburns.com>

* Enable FPS meter for all renderers

Signed-off-by: Nico Burns <nico@nicoburns.com>

---------

Signed-off-by: Nico Burns <nico@nicoburns.com>
Co-authored-by: koko <72217393+kokoISnoTarget@users.noreply.github.com>
Co-authored-by: Nico Burns <nico@nicoburns.com>
Co-authored-by: Joe Leaver <joe@joeleaver.com>
Co-authored-by: Tom <97800396+mogambro@users.noreply.github.com>
Co-authored-by: Austin M. Reppert <austinmreppert@gmail.com>
Co-authored-by: Austin M. Reppert <austinmreppert@protonmail.com>
Co-authored-by: niminypiminy <141541168+niminypiminy@users.noreply.github.com>
Co-authored-by: Tristan Phease <tristan.phease@gmail.com>
Co-authored-by: mitsuru <hayasaka.mitsuru@gmail.com>
Co-authored-by: lainon1 <271530700+lainon1@users.noreply.github.com>
Co-authored-by: Tony Bierman <tonybierman@gmail.com>
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
Co-authored-by: Evan Almloff <evanalmloff@gmail.com>
Co-authored-by: Klemen <klemensustar1@gmail.com>
Co-authored-by: Henrique Anzoategui <hanzoategui@augeomarketing.com>
Co-authored-by: Henrique Anzoategui <hanzoategui@kigo.io>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants