Skip to content

transport UI updates - #362

Open
x37v wants to merge 5 commits into
developfrom
feature/transport-seek
Open

x37v wants to merge 5 commits into
developfrom
feature/transport-seek

Conversation

@x37v

@x37v x37v commented Sep 14, 2026

Copy link
Copy Markdown
Collaborator
  • Added a simple transport location indication and rewind
  • Added link sync toggle
  • Added time signature UI

Add a time signature control (numerator NumberInput, denominator Select) and a
Link sync toggle to the transport modal, and rework the layout the new controls
had crowded.

The denominator is a Select over 1/2/4/8/16/32 rather than a free numeric
input, so the power-of-two rule is structural instead of an error message. The
numerator is clamped before send, matching the BPM pattern.

linksync needed no runner change -- transport/linksync was already exposed,
config-backed and bridged to jtl; nothing in the panel consumed it.

Layout: the modal now goes full screen on mobile, which is what every other
modal here already does and which the previous flex-wrap did not survive.
Switched to the compound Modal API so the position readout can sit in the
header. That readout is right-justified with a fixed-width beat field and
tabular figures, which anchors the colon a fixed distance from the right edge
so it stays put as the bar count grows. Both switches carry a label beside the
control instead of on/off text inside the track -- "Off" on two adjacent
switches said nothing about which was which, the track resized between states,
and a real <label> gives each switch an accessible name.

bar_beat is typed [number, number] throughout; the bridge was casting a two-arg
message to [number]. initTransport is annotated so its payload is contextually
typed rather than re-widening on the next field added.

Boolean fields in the INIT reducer case used `value || default`, which discards
a legitimate false -- turning Sync off and reloading brought it back on. They
now check for undefined.
Both rely on OSCQuery nodes that only a recent runner has, and the time
signature additionally needs a jack_transport_link new enough to act on it. A
device that updates the panel alone would otherwise show a control that silently
does nothing and a readout stuck at 0:0 -- or, with a new runner and an old jtl,
a time signature the device never applied, since that node is BI and ossia
echoes our own writes back locally.

Gate both on capability, using the node-presence test the bridge already applies
to jack/info/is_active:

  barBeatAvailable:        bar_beat node exists
  timeSignatureAvailable:  time_sig node exists && time_sig_available !== False

!== False rather than === True on purpose: a runner exposing time_sig but no
availability node predates the gate and always supported the feature. The
availability value is also handled live, so the control appears when jtl proves
itself rather than waiting for a reload.
@x37v
x37v requested a review from fde31 September 14, 2026 19:58
@changeset-bot

changeset-bot Bot commented Sep 14, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: c0e7306

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 2 packages
Name Type
@rnbo-runner-panel/client Patch
@rnbo-runner-panel/server Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

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