# pi-utils-settings: v0.20.0

release · 2026-08-22 · #pi-utils-settings · v0.20.0

### Minor Changes

- 05bdf78: `SectionedSettings`' `contentHeight` is now a true flex layout instead of pad-only: the item list window shrinks to make room for the selected item's description, which is wrapped in full (never truncated, no ellipsis) and bottom-anchored just above the hint line, while blank padding between the list and the description keeps the content at exactly the configured number of lines. This replaces the rejected `fixedDescriptionLines` truncation approach, which has been removed. `SettingsDetailEditor` gains a matching `contentHeight` option: in list mode the field window shrinks for the bottom-anchored, fully wrapped description, and its other modes (text editing, choice selector, empty state) pad to the fixed height so the panel never changes size. `registerSettingsCommand` accepts a new `contentHeight` option (default 20) wired to the settings body, replacing its previously hardcoded layout values. When `contentHeight` is unset, both components render exactly as before.
- 7e0ec5f: Add a `contentHeight` option to `SectionedSettings`: the rendered body is held at exactly the given number of lines, so the panel height stays stable across tabs and cursor moves (same goal as the Wizard's `minContentHeight` option). `registerSettingsCommand` passes a `contentHeight` of 20 by default, so the settings panel no longer jumps in height when switching tabs. See the flex-content-height-layout changeset for the layout details.
- 7e60ea4: Unframed submenu components: `FuzzySelector`, `FuzzyMultiSelector`, `ArrayEditor`, and `PathArrayEditor` no longer wrap their output in a bordered `Panel` — they render a plain styled title line followed by the body at full width, so they sit cleanly inside the `registerSettingsCommand` panel's own border instead of drawing a nested box. The internal `renderSettingsPanel` helper was removed (no replacement API; the old bordered layout has no supported opt-in). Each component now implements `getShortcuts(): string | undefined` (the `SettingsSubmenuComponent` contract), returning the shortcuts for its current internal mode (list vs add/edit input for the array editors, search vs no-matches for `FuzzySelector`), and accepts a `hideHint` option (default `false`) that suppresses its own shortcut footer when a host panel renders the single controls line — pass `hideHint: ctx.hideHint` from the submenu factory. For `FuzzyMultiSelector`, which already had a public `showHints` option (default `true`), `hideHint` takes precedence and wins over `showHints` when both are set.
- 5d259ea: Unified shortcut line: the settings panel from `registerSettingsCommand` now renders exactly one controls line at any time, always below the separator. Submenu components can implement `getShortcuts(): string | undefined` (new `SettingsSubmenuComponent` contract) to expose the shortcuts they currently respond to; while a submenu is open, the panel's controls line shows those instead of the default `Enter/Space change · Ctrl+S save · Esc close` (falling back to the default when the submenu exposes none). `SectionedSettings` gains `getActiveSubmenuShortcuts()` and forwards its `hideHint` option through the submenu factory context (`SettingsSubmenuContext.hideHint`). `SettingsDetailEditor` implements `getShortcuts()` per mode (list / text editing / enum choice / confirm / empty state, delegating to nested submenus) and accepts a new `hideHint` option that suppresses its own hint footer lines while keeping the fixed `contentHeight` layout — pass `hideHint: ctx.hideHint` when hosting it from `registerSettingsCommand`. Esc semantics stay accurate (with a submenu open, Esc backs out of the submenu), and Ctrl+S still saves from any depth.

- [GitHub release](https://github.com/aliou/pi-utils-settings/releases/tag/v0.20.0)
- [npm](https://www.npmjs.com/package/@aliou/pi-utils-settings/v/0.20.0)
