Reference·04

Changelog

Latest: v0.14.0 — Frameless window — caption merged into the app topbar. Every release with features, fixes, and improvements.

v0.14.0

UnreleasedUnreleased

Frameless window — caption merged into the app topbar

The desktop app drops the native Windows frame: the existing topbar now carries the brand + version, a centered project name and min/max/close controls, doubles as the drag region and maximizes on double-click

✦Features(9)

  • Frameless BrowserWindow: the topbar is now the single caption strip — brand + IDE version on the left, centered project name (updated on open/create), window controls flush to the right edge; the whole bar is a drag region and double-click toggles maximize, with the maximize/restore icon synced to the real window state (browser build untouched)
  • Split view: the lowcode workspace and the HMI screen canvas can now live side by side — topbar toggle or Ctrl+\, draggable divider, per-pane keyboard routing (undo/delete/copy go to the pane you last touched); the layout and the divider position persist across sessions
  • Live lowcode debug in Hand mode: the VM dumps its link slots ~25 times a second and the workspace lights up — a Blueprint-style comet pulse travels along a wire whenever the bytecode pushes a signal through it, links carrying a nonzero signal glow steadily in their own palette color while idle wires sink into the dimmed grid, and nodes on the live path get a highlight ring with an orange flash on event firings; value badges sit on every port and clicking any wire pins a probe with a live value and a ~16 s history sparkline
  • VM activity counters: the bytecode runtime now reports per-slot write counts and a change bit packed into the debug dump, so zero-valued writes (an evaluated FALSE branch pushing 0 downstream) and one-tick pulses between dumps are both observable — the overlay can tell "signal is flowing" apart from "value just sits there"
  • Node properties HUD reworked to the .pui popover model: selecting a node now shows only a slim chip anchored to it (type + id) — the full properties panel opens on demand via the chip button or a double-click on the node, and collapses back on × or any outside click; F4 hides/restores the HUD entirely; while collapsed the node properties stay in the sidebar panel
  • Toast deduplication: a repeat of a visible notification now bumps a ×N counter badge on it and extends its lifetime instead of stacking another copy
  • Variable Read / Variable Write nodes grow an optional TRIG input: unlinked they run every tick in the background exactly as before; linked, they fire only on the trigger edge — in the Studio VM the TRIG link slot is edge-detected (covers action/widget fire counters, cyclic timer pulses, CHANGED and watchdog pulses), and generated C emits the same behavior through action/widget handlers, cyclic period checks and pli_state edge detection
  • New Text Format node (Logic & Math): four value inputs V0–V3 feed a pattern — "{0}:{1}" placeholders (with {n:.2} decimals and {n:03} padding) or printf specs (%d, %02d, %.1f, %% escapes) — and the TEXT output drives a label with the rendered string; identical semantics in the sim (new LC_OP_FMTN opcode + lc_fmt_text) and in generated C (lv_label_set_text_fmt)
  • New Has Flag / Has State nodes (UI / HMI → Read): pick a target object and an LVGL flag or state, and the node acts like an IF — TRUE fires while the object has it, FALSE when it doesn't, so branches feed straight into logic, actions and widget props; an optional TRIG input gates the check to trigger edges (unlinked = polled every tick) — the sim polls through new LC_PROP_HAS_FLAG / HAS_STATE bindings, generated C emits lv_obj_has_flag / lv_obj_has_state (live in event handlers, edge-latched for periodic triggers)

↑Improvements(3)

  • Toasts restyled to the IDE design language — token-based surfaces, accent-colored icons per severity, monospace count badge, subtle bump animation on dedupe
  • Welcome screen: the brand/sign-in header is hidden in the desktop build (it duplicates the merged caption); the "What's new" feed keeps a reserved slot inside Recent Projects with its own scroll instead of being squeezed out by a long project history
  • Sim/debug floating panels (CAN bus, variables, DPL player, PHMI debug) and the canvas context menu now live on the shared center layer, so they float over both split panes instead of being trapped inside the screen canvas

✓Bug fixes(6)

  • Fullscreen overlays (welcome, market, hardware/webconfig views, auth/about/telemetry dialogs and other modals) used to slide under the caption strip and leak their headers beneath it — they now start below the topbar so the window controls stay visible and draggable on any screen
  • Toasts rendered underneath the merged caption strip in the frameless window (top: 20px landed inside the 52px bar, and its z-index outranked them) — they now start below the topbar and paint above every overlay
  • The widget floating HUD never appeared in split view: with a .lowcode file current, every click in the .pui pane was treated as workspace mode and the selection was cleared before the HUD could mount — a widget picked in a visible canvas pane now always gets its HUD
  • Recent Projects "What's new" entry could crash the project open when clicked — the project name was read before it was initialized
  • TRIG fed by a Variable Read VALUE wire lost re-triggers, differently in each runtime: the wire carries a level, so the sim edge guard only fired when the read value CHANGED (a re-push of the same value never reached the writer — the second identical trigger silently dropped), and generated C emitted no write at all for that shape — TRIG sourced from a trigger-gated read now inherits the reader's own trigger edge ("the value arrived" = "the read fired"), and the Has Flag/State periodic emit now runs before the variable passes so branch edges materialize in the same VM step the downstream guards sample them
  • Has Flag / Has State evaluated at the wrong moment inside event paths, twice: downstream branch targets (set/clear state, set text, styles, UI mutations) applied unconditionally once the event reached them, so both IF arms fired on every trigger — consumers are now gated on the condition link the check just wrote (the same guard logic_cmp already used); and the periodic level pass re-applied a TRIG-gated branch every frame, so the two arms fought each other (state added and cleared every tick → flicker back) — consumers of an event-evaluated branch now live only inside the event entry in both the sim VM and generated C, and Has * nodes feeding another node's TRIG propagate their live check result (or the edge latch when the source is periodic) as the trigger level; the sim also no longer re-evaluates an action/widget-event-fed check on the next tick — it used to see the state the taken branch had just mutated and flip the branch wires to post-state, so both arms lit up in the debug overlay