From d256687676c4755806113660689d059a07c56b0e Mon Sep 17 00:00:00 2001 From: Doxa Maps Date: Wed, 30 Sep 2026 04:09:14 +0000 Subject: [PATCH 1/2] plugin-designer skill: reusable by default, pilot before roll-out, one shape per kind of control Three rules for work that spans plugins, in section 3 (Reuse library/ first): - A component that could serve more than one plugin is built once in library/, driven by props, and landed through the build owner, so other plugins adopt it instead of copying it. This replaces "Graduate late". - A new pattern starts on one plugin, built by its owner. A maintainer approves it on the dev server, and only then do the other owners adopt it in their own plugins. - Map controls are round and spaced: MapToolbar's default column of round MapControlButtons, not its grouped square card. Dashboard header-bar buttons are rounded squares with the vertical tabs' radius, var(--vtl-radius, 8px). --- skills/plugin-designer/SKILL.md | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/skills/plugin-designer/SKILL.md b/skills/plugin-designer/SKILL.md index d85b08250..e90b14336 100644 --- a/skills/plugin-designer/SKILL.md +++ b/skills/plugin-designer/SKILL.md @@ -84,8 +84,17 @@ provided instance. Drop the provide and a host can no longer set your plugin's l - **Don't edit `library/` to customise one plugin.** A library change reaches every plugin that imports it, so it needs every consumer rebuilt. On a team with a build owner, hand library changes to that owner rather than landing them yourself. -- **Graduate late.** Move code into `library/` only when a second plugin needs the same thing - and it takes props instead of hard-coded specifics. +- **Reusable by default.** If a component could serve more than one plugin, build it once in + `library/`, driven by props rather than hard-coded to your plugin, and land it through the build owner. + Other plugins then adopt it instead of copying it. +- **A new pattern is piloted, approved, then rolled out.** It starts on one plugin, built by that + plugin's owner, and a maintainer approves it on the dev server (the Plugin Studio). Only then do + the owners of the other plugins it applies to adopt it, each in their own plugin. +- **One shape per kind of control.** Controls on a map are round and spaced apart: put them in + `MapToolbar`, whose default is a spaced column of round `MapControlButton`s (both in + `library/components/map-controls/`), not its grouped square card (`controls="square"`). Buttons in + a dashboard's header bar are rounded squares with the vertical tabs' corner radius + (`var(--vtl-radius, 8px)` in `library/layouts/VerticalTabsLayout.vue`). ## 4. The universal props — every plugin honours these From 3b933aefd40ab3c17ab1f9cecf081c02db604284 Mon Sep 17 00:00:00 2001 From: Doxa Maps Date: Wed, 30 Sep 2026 04:00:56 +0000 Subject: [PATCH 2/2] =?UTF-8?q?Prayer=20Progress:=20round,=20spaced=20cont?= =?UTF-8?q?rols=20again,=20and=20no=20floating=20=E2=93=98=20while=20the?= =?UTF-8?q?=20map=20loads?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The control column goes back to the library's round, spaced buttons at every width; the square grouped card read too compact, on phones most of all. The ⓘ stays the top control. In control mode, MapInfo no longer shows its floating button before the map's control has announced itself. The map draws its column only once it is ready (style and people-group data), so the floating ⓘ appeared for a moment and was then replaced by the control. The wait is bounded at 30 s of time on screen, counted only while the pane is visible and not inert: measured column arrival times run from 7 to 19 s on a local serve, so a shorter wait expired inside a normal load and flashed late. If no control arrives, the floating button shows, so there is still always a way to open the popup. Once a control has announced itself, measurement alone decides, as before. MapInfo's plain + - -