BlueVue: Grow the package into a BlueOS extension kit - #2
Merged
Conversation
The pieces every extension reaches for and had to borrow from a UI framework until now. A button with no colour of its own is a secondary action and reads as a barely-there fill, the filled one is what the panel is asking for, and out of reach either becomes the same flat grey chip; an icon is a square box rather than a glyph, so a row of them lines up; and the tooltip opens in the top layer, where a panel clipping its own overflow cannot cut it off.
The controls each carried their own hover panel, absolutely positioned inside a row that clips what overflows it and stacked against the page with a z-index of its own. One component now owns all of them, and the top layer places it, so a hint at the edge of a panel is no longer cut off by it.
The gallery is the front page, every component live on the surface it was drawn for, and each card opens a page saying what the component is, when to reach for it and what it takes, with a snippet to paste. One view renders every page from a catalogue entry, so documenting a new component is a demo and a data entry rather than a page of its own. Routing is by hash and the site is deployed to Pages on every push to master, since a project page has no rewrite rule to make a deep link resolve.
A dialog is now a panel with a header, a body and a footer, and the prompt and loading overlays are two arrangements of it rather than two copies of the same native modal handling. Two more arrangements come with it: a confirmation for anything that cannot be taken back, and a job report for work with stages to it, whose log follows its own tail unless the reader has scrolled up to read something.
Three ways of telling the reader something, which every extension writes for itself today. Notices are raised from wherever they happen and rendered by one bar at the root, where a failure waits to be dismissed and a repeat counts up instead of stacking; the blocking wait is one piece of state, so two operations cannot each raise their own; and the banner, built for the SITL manager, comes along with the group that lays a row of them out.
An extension now starts as one component: BlueApp paints BlueOS's backdrop, centres a card on it and mounts the notice bar and the blocking wait, so a page raises either from anywhere without wiring them. Under it are the pieces that card is filled with, a section for a subject and a stat for a fact, plus the theme call that repaints the tokens in an extension's own colours and the two file helpers every configuration page ends up writing.
The controls an extension reaches for once it is past a few fields: a checkbox and a radio group for the choices a switch and a button track cannot phrase, a textarea for what does not fit on one line, tabs for a view with several pages, a table that orders itself, a chip for a state worth naming, and a zone that takes a file by drop or by picker. Each of them is a page in the docs beside the ones already there.
An extension is served from BlueOS's own origin, so blueOsService wraps a service by name and a relative path finds it, with a host override for the one case that has no vehicle behind it, a page being developed. Over that sit the two things a page wants: what the vehicle calls itself, and a setting kept on the vehicle rather than in whichever browser happened to open the extension.
The readme now opens on what an extension gets, points at the gallery for the live version of each component, and lists everything the package exports under the part of the page it belongs to.
The package is now a kit rather than a set of controls: a page shell, the dialogs and notices, the rest of the form vocabulary, and the calls that reach BlueOS. Nothing that was in 0.1.1 was taken away or renamed.
npx @bluerobotics/bluevue <name> copies a Vite frontend already wired to the kit, a FastAPI backend that answers /register_service with relative paths, a Dockerfile carrying the labels BlueOS installs from, and a GitHub workflow that builds the image. The generated page is a BlueApp, so notices and waits work from the first line.
BlueApp takes the primary the vehicle is painted in unless the page asks it not to, so an extension sits in the same palette as the rest of BlueOS. Dark and pirate mode come along as flags, for anything an extension only shows when the vehicle itself would. Each field stays at its default when that particular call fails, so a page opened off the vehicle still renders.
ArturoManzoli
force-pushed
the
extension-kit
branch
from
August 14, 2026 11:49
9d56ba8 to
c8e9e2f
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
BlueApppaints the backdrop, centres a card and mounts the notice bar and the blocking wait, so a page raises either from anywhere without wiring them.BlueButton,BlueIcon,BlueTooltip,BlueSpinner,BlueProgressBar.BlueDialog, and addsBlueConfirmDialogandBlueStepsDialogbeside the prompt and loading ones, which now build on it too.BlueCheckbox,BlueRadioGroup,BlueTextarea,BlueTabs,BlueTable,BlueChip,BlueFileDrop,BlueWindRose.blueOsServicewraps a service by name,useBlueOsreads the vehicle's name, version, primary colour, dark and pirate mode, anduseBlueOsSettingkeeps a value on the vehicle rather than in whichever browser opened the extension.BlueApptakes the vehicle's primary colour unless the page asks it not to.npx @bluerobotics/bluevue <name>copies a Vite frontend already wired to the kit, a FastAPI backend that answers/register_servicewith relative paths, a Dockerfile carrying the labels BlueOS installs from, and a GitHub workflow that builds the image.