iris-ai 05e6ced31d Hold a request in the arena its nodes are allocated in
A size request was a second expression shape beside the one the layout
pass already has. `SizeRequest` held `Sum`/`Min`/`Max` over `Arc` pairs;
`RequestArena` held the same three operators as `Node { op, a, b }` in a
`Vec`, with the same fold over `independent_order` written a second time,
and `import` walked the first rebuilding it as the second.

There is one node type now. An expression is the pass's nodes in an arena
of its own that lasts as long as the rule holding it, and `import` grafts
those nodes into the pass's arena, resolving fractions as they land. The
fold is `Nodes::combine`, which both the builder and the importer call.

So the `Arc` goes, and no refcount replaces it: nothing shares a request
and nothing outside widget code holds one. A plain length stays inline,
so `size_of::<SizeRule>()` is 40 either way and only an actual expression
allocates. A node's operand is a number within its own arena, and
`RequestedLen` -- the only form that leaves one -- is that plus the epoch
saying which pass numbered it, so the epoch is now checked once where a
handle comes back in rather than at every level of the walk it starts.

`SizeRule::at_least`/`at_most` were the only clones of a request in the
framework, and both read a rule out, moved one end of its bound, and
wrote it back into the slot it came from. `Widgets::edit_bound` does it
where it sits, so nothing copies an expression to cap it.

`SizeRequest` grew a `Display`, since the shrinker prints one and a
derived `Debug` of an arena is not something a tree can be rebuilt from:
`min(30 px;1 leftover;, 2 leftover;)<0.5 rel;`.

Measured, medians of three release runs under `perf stat -e
instructions:u`, each set within 0.005% of its median: bounds_cost
MODE=cap FRAMES=2000 is 5.665B against 5.743B (-1.34%), and
revision_cost resize ROWS=40 FRAMES=500 is 4.855B against 4.893B
(-0.79%).

Format, workspace clippy under -D warnings with and without
layout-diagnostics, 206 ordinary and 210 diagnostic tests, the cold dump
byte-identical to 2ac0843 across all 34,986 boxes, 400 depth-5 trees in
64.24s, 1,000 depth-6 in 160.35s, 2,000 depth-4 in 298.82s, and 400
depth-5 trees in each of the three deferred-request corpora in 205.42s.
2026-09-20 21:07:19 -04:00
2025-11-17 16:08:29 -05:00
2026-01-29 16:39:19 -05:00
2026-09-13 00:24:29 -04:00

iris

My experimental attempt at a rust ui library (also my first ui library).

It's currently designed around using retained data structures (widgets), rather than diffing generated trees from data like xilem or iced. This is an experiment and I'm not sure if it's a good idea or not.

Examples are in examples, eg. cargo run --example tabs.

Goals, in general order:

  1. does what I want it to (text, images, video, animations)
  2. very easy to use ignoring ergonomic ref counting
  3. reasonably fast / efficient (a lot faster than electron, save battery life, try to beat iced and xilem)

dev details

not targeting web rn cause wanna use actual nice gpu features & entire point of this is to make desktop apps / not need a web browser

general ideas trynna use rn / experiment with:

  • retained mode
  • specifically designed around wgpu so there's no translation
  • postfix functions for most things to prevent unreadable indentation (going very well)
  • events can be done directly where you draw the widgets
  • almost no macros in user code & actual LSP typechecking (variadic generics if you can hear me please save us)
  • relative anchor + absolute offset coord system (+ "rest" / leftover during widget layout)
  • single threaded ui & pass context around to make non async usage straightforward (pretty unsure about this)
  • widgets store outside of the actual rendering so they can be moved around and swapped easily (unsure about this but seems to work good for now)

under heavy initial development so not gonna try to explain status, maybe check TODO for that; sizable chance it gets a rewrite once I know everything I need and what seems to work best

it's called iris because it's the structure around what you actually want to display and colorful

S
Description
No description provided
Readme
4.8 MiB
0 Stars 1 Watchers 0 Forks
Languages
Rust 96.3%
Shell 2.1%
WGSL 1.6%