Skip to content

Polish five rough edges across designer, settings and custom nodes - #190

Merged
Sev7eNup merged 2 commits into
mainfrom
fix/ui-polish-batch
Aug 12, 2026
Merged

Polish five rough edges across designer, settings and custom nodes#190
Sev7eNup merged 2 commits into
mainfrom
fix/ui-polish-batch

Conversation

@Sev7eNup

Copy link
Copy Markdown
Owner

Five small, independent usability fixes reported from daily use. All frontend, no backend change.

1. Designer node size defaults to L instead of S

nodeScaleIndex moves from 1 (sm) to 3 (lg). The persisted store bumps to version: 2 with a migration that only lifts profiles still sitting on the old default — a size picked from the stepper survives the change.

2. System info tab moves to the far right

It is the only read-only tab in Settings → System, so it now sits after every tab that actually edits configuration. Nothing indexes into TABS; Integrations stays first and remains the default section, so all four 'integrations' fallbacks and their tests are untouched.

3. Every hardening switch in Security now has a description

Seven toggles plus the two previously unexplained list/text fields. Each hint says what the switch does, what happens when it is off, and where the boundary really is. The wording was checked against PathGuard, SqlActivity, StartProgramActivity, WebhooksController and SecurityHardeningWarnings — not against the docs — so e.g. the AllowedRoots hint states that the check runs on the NodePilot host and target-side ACLs stay authoritative for WinRM.

Picked up on the way: the Remote pointer note at the bottom was inline German JSX and rendered German inside the English UI. It now goes through the i18n catalogue via <Trans>.

4. Support-log window starts ~30% taller

Table view 540 → 702 px (~30 rows instead of ~22), plain-text tail 640 → 832 px. Both localStorage keys move to .v2 — that suffix exists for exactly this, and without the bump a browser that already stored a height would never see the new default.

5. Custom-node dialog no longer breaks in the light skins

It was the only page dialog using the shared .input-field class. That style is recessed and needs a raised surface to sink into, which ModalShell only provides in the dark skins (html.dark … .np-modal-panel). On light-grey it painted a flat beige #eae4dc box on a white panel and went lighter than the panel on focus, losing its outline exactly while in use. It now uses the outline chain every other admin dialog uses, which works in every skin — focus:ring-blue-500 is remapped onto --np-accent-ring for non-blue skins.

Two real bugs fell out of that switch:

  • .input-field is unlayered CSS and therefore beats every Tailwind utility from @layer utilities. Its width:100% silently killed the w-28/w-32/text-xs on the ParamEditor rows, so every parameter row wrapped onto a line of its own.
  • The icon-picker trigger is a <button> that carried .input-field, so width:100% squashed it in its auto grid column.

src/nodepilot-ui/CLAUDE.md now describes the two field tiers (recessed .input-field on raised surfaces vs. the outline chain in page dialogs) instead of mandating .input-field everywhere, including why a width must never be baked into a shared field constant.

Verification

  • tsc --noEmit clean
  • npm run lint — 0 errors, 13 warnings, identical to the pre-change baseline (verified via git stash)
  • npm run test:run — 197 files, 2551 tests green, including new tests for the store migration, the security hints, the log-window height/key bump and the dialog field style
  • Playwright: admin-settings 76.1 (now pins the tab order), custom-activities, diagnostics — 14 tests green
  • de/en key parity in the sec block verified (41/41)

Deliberately out of scope

Trigger:Database:RequireConnectionRef has no UI surface at all — no DTO in SecurityHardeningSettingsDto, no SettingsSchema entry. Giving it one means a DTO, a controller section, a card, a CLI command and an MCP tool. That is a feature, not a description-text fix.

Five small, independent usability fixes reported from daily use:

- Designer node size now defaults to L instead of S. The persisted store
  bumps to version 2 and only lifts profiles still sitting on the old
  default, so a size picked from the stepper survives the change.
- Settings > System moves the read-only System info tab to the far right,
  after every tab that actually edits configuration. Integrations stays
  first and remains the default section, so the deep links are untouched.
- Settings > System > Security: every hardening switch now explains what
  it does, what happens when it is off, and where the boundary really is.
  Wording checked against PathGuard, SqlActivity, StartProgramActivity,
  WebhooksController and SecurityHardeningWarnings rather than the docs.
  The Remote pointer note was inline German and rendered German inside the
  English UI; it now goes through the i18n catalogue.
- The support-log window starts ~30% taller in both view modes (table
  540 -> 702, plain text 640 -> 832). Their localStorage keys move to .v2,
  otherwise a browser that already stored a height never sees the new
  default.

The custom-node dialog gets its own note: it was the only page dialog using
the shared .input-field class. That style is recessed and needs a raised
surface to sink into, which ModalShell only provides in the dark skins. On
light-grey it painted a flat beige box on a white panel and went lighter
than the panel on focus, losing its outline exactly while in use. It now
uses the outline chain every other admin dialog uses.

Two real bugs fell out of that switch. .input-field is unlayered CSS and
therefore beats every Tailwind utility from @layer utilities, so its
width:100% silently killed the w-28/w-32/text-xs on the parameter rows -
each row wrapped onto a line of its own - and squashed the icon-picker
button in its auto grid column.

nodepilot-ui/CLAUDE.md now describes the two field tiers instead of
mandating .input-field everywhere, including why width must never be baked
into a shared field constant.
Raising the node-size default to L moved the canvas geometry the hermetic
suite was written against: fitView turns a larger node footprint into a
different pan/zoom for the same seeded positions, and ai-assistant's step-b
slid under the bottom-right minimap, which then swallowed its click - the
exact hazard e2e/README.md already warns about.

installDefaultMocks now pins nodeScaleIndex: 1 next to the existing
designerTheme: 'classic' pin, for the same reason: both are geometry knobs,
and letting either float means a presentation tweak reshuffles the canvas
coordinates of unrelated specs. The scale itself stays covered by the unit
tests (designStore, CanvasSettings).

The seeds carry version: 2 to match the store's persist version. At version
1 the new migration would read the pinned sm as "still on the old default"
and lift it straight back to lg, silently undoing the pin.

seedExpertMode and seedAtelier replace the whole nodepilot-design key, so
both re-assert the pin. toolbar-layout's two seeds are left alone: they
deliberately exercise v1-profile hydration and assert toolbar state, not
canvas geometry.
@Sev7eNup
Sev7eNup merged commit d30076c into main Aug 12, 2026
8 checks passed
@Sev7eNup
Sev7eNup deleted the fix/ui-polish-batch branch August 12, 2026 20:37
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.

1 participant