- Rewrite §Scope from v0.1.0 to v0.2.0: lists multi-active +
layout-slots as supported; restages deferred items per phase.
- Replace "active" with "open"/"focused" in API prose for
unregister + update + render (no scalar `active` exists in
v0.2.0).
- Add cross-ref under panel.open noting the v0.2.0 behavioral
change (open does not auto-close other panels).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Migrate the internal model from single-active scalar to multi-active
open_order array + per-id window records. register accepts opts.layout
(11 named slots: center, left, right, top, bottom, the four corners,
left-half, right-half — plus a custom function(sw,sh)->{x,y,w,h} hook
for HP-bars and bespoke positioning). open/close/is_open accept an
optional id argument for per-id semantics; the no-arg forms preserve
the v0.1.1 contract (close() removes the focused last-opened, is_open()
returns true if any panel is open).
Input dispatch iterates open_order in reverse so the topmost panel gets
the first crack at a click; misses fall through to lower windows.
is_pausing now checks every open window for pause_on_open=true, not
just the focused one.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Previously trigger_action_name + trigger_widget_id were module-local
scalars, so the second bind_default_trigger call overwrote the first
(and reused the action name 'panel_toggle' so lib-core.input's binding
was also clobbered). Switched to a triggers array; each binding gets
a unique input action 'panel_toggle_<widget_id>' so multiple widgets
can be toggled by their own keys independently.