Add a drag handle to each criterion and profile row, backed by a
pointer-based composable that works with mouse and touch. Reordering
criteria changes the chart spoke order; reordering profiles changes
draw/legend order. Scores are keyed by id, so they follow their row.
The app has no backend, so a share link embeds the whole radar as
base64url in the query string. Opening /share?d=... validates and
imports a fresh copy into the recipient's radars, then opens it.
Labels rendered as single-line SVG text and clipped at the canvas edge
(and in the PNG export). Word-wrap each label to the room available on
its side, stacking lines away from the chart.
A Radar gains an optional Concept — a short subtitle naming the product
and its typical performances, rendered under the title and wrapping to a
balanced second line when long. Old radars default to an empty Concept
on load.
Vue casts an absent boolean prop to false, so withChrome was always
false and the v-if="withChrome !== false" guards hid the title and
legend everywhere — including the PNG export. Default withChrome to
true via withDefaults so the legend renders.
Extend the built-in 'light' theme via DaisyUI 5's @plugin theme block.
All btn-primary / text-primary / selected-state utilities now use the
brand color across the app.