v0.99.93
Added
- XML
<if>/<else>structural conditionals — layouts can build one branch, another, or nothing based on a subject or expression, reactively rebuilding when it changes; only the matching branch is created. Rounds out conditional support alongside<repeat>and${…}. - Integer expressions in
${…}— XML${…}composition can evaluate integer arithmetic and take numeric component params as operands, not just compose indexed subject names. - 2D toolpath preview on the print detail view — devices that render a 2D toolpath (rather than a 3D model) show that preview on the file detail view instead of the flat thumbnail.
- Filament color routing follows the effective tool match (Snapmaker U1) — on toolchangers, the gcode preview, spool swatches, and preflight checks color by each tool's effective filament match rather than assuming T0, and
SET_PRINT_EXTRUDER_MAPis driven from that same match.
Fixed
- Power-loss recovery on AFC-modded Snapmaker U1 — the U1 resume offer now also reaches U1s running the AFC filament-system mod.
- Filament mis-routing on empty or incompatible lanes — a tool is never matched to an empty lane (which had shown a stale color), the material-blind lane fallback no longer grabs incompatible filament, and lane data is keyed by tool on toolchangers (ingesting foreign keys and migrating stale
laneNentries). - AD5X IFS material and color on insert (#1065) — physically inserting filament refreshes material and color for auto-tracked lanes.
- Kobra S1 ACE detection (#1107) — the Kobra S1 mainline-Python firmware fork's
ace_instance_Nobjects are detected. - Render-thread crash on ARM64 (#1102) — a missing memory barrier in the software-render→main handoff could free a layer buffer still in use; the handoff is now barriered, and the subject-bound
<repeat>observer lifetime is tied to its instance to close a related use-after-free. - Recycled panel layout (#1109) — print-status cards and the active-spool row re-apply their layout and visibility when a recycled widget instance is reused, instead of showing a stale layout.
- Decorative taps reach the button (#1101) — taps on decorative children of a card or row route to the handler root instead of being swallowed.
- Blocking-op g-code queueing (#1108) — benign discretionary commands are queued during blocking operations rather than rejected.
- Jog precision and toasts (#1104) — jog axes are gated on an AxisMove epsilon and never emit scientific notation, a populated NOT_READY message beats the generic fallback, and duplicate RPC and gcode-stream toasts dedupe on Klipper's raw wording.
- Keyboard dismiss keeps the overlay open — tapping the backdrop to dismiss the on-screen keyboard no longer also closes the overlay behind it.
- 2D backdrop blur crash guard — abort-modal GPU blur initialization is deferred with a crash-loop guard.
Changed
- Pre-print toggles hidden without HelixPrint — pre-print toggles that require the HelixPrint plugin are hidden when the plugin isn't installed.