Skip to content

[#12] Added a contextual key-binding help footer and '?' overlay.#33

Open
AlexSkrypnyk wants to merge 4 commits into
mainfrom
feature/12-help-footer
Open

[#12] Added a contextual key-binding help footer and '?' overlay.#33
AlexSkrypnyk wants to merge 4 commits into
mainfrom
feature/12-help-footer

Conversation

@AlexSkrypnyk

@AlexSkrypnyk AlexSkrypnyk commented Jul 10, 2026

Copy link
Copy Markdown
Member

Closes #12

Summary

The TUI's key hints were fixed and partial: the hub only ever showed move/select/back, some widgets rendered their own hint line while others left the editor chrome to show a generic accept/cancel, and there was no way to discover a widget's less-obvious bindings. This adds a contextual key-binding help footer that shows exactly the keys valid in the current context (the panel hub or the focused widget editor), driven by a new typed Hint value object that every widget contributes via a hints() method. A ? key opens a form-scoped help overlay listing the hub and every widget type the form uses. The footer is theme-driven (Unicode + ASCII, respects remapped keys) and can be turned off with ->footer(FALSE).

Changes

  • Added the Hint value object (src/Input/Hint.php) pairing a label with the Action(s) whose live keys illustrate it, plus new Action::Help, Action::Increment and Action::Decrement cases; DefaultKeyMap binds ? to Help in the navigation scope and the up/down arrows to Increment/Decrement in the Number field scope, overriding base movement there.
  • Replaced WidgetInterface::rendersHint(): bool with hints(): list<Hint>; every widget now contributes its own ordered hint list, spreading the shared accept/cancel tail from AbstractWidget::hints(), instead of a subset self-rendering and a subset deferring to a generic accept/cancel. NumberWidget steps through the remappable Increment/Decrement actions rather than hard-coded arrow keys, and gained its own keyScope() so the field-scoped bindings apply.
  • Theme: DefaultTheme::renderStatusLine() was replaced by renderHints() (renders any list of Hint fragments against a scope's live bindings, dropping fragments whose actions are unbound), plus a new renderHelp() overlay renderer; renderEditor() now takes the widget's hint list instead of a rendersHint boolean. Added the HelpSection render DTO (src/Render/HelpSection.php) pairing a titled context with its bindings and hints.
  • PanelController renders one contextual footer per frame (hub hints or the focused widget's hints), handles ? as a new help-overlay state that any key dismisses, and builds the overlay's sections (navigation plus each field type the current form uses, deduplicated in first-seen order). The footer and overlay are both gated on the new Config::footer flag.
  • Added Form::footer(bool $show) and the corresponding Config::footer property (default TRUE) so the footer can be turned off form-wide.
  • Adopted the new contract in the existing FilePickerWidget (its single/multiple-mode hints now come from hints()) and the custom-theme playground example (OceanTheme overrides renderHints() in place of the folded-in renderStatusLine()).
  • Updated tests for every per-context hint list (ConfirmWidget, FilePickerWidget, MultiSelectWidget, NumberWidget, PasswordWidget, SearchWidget, SelectWidget, SuggestWidget, TextWidget, TextareaWidget, ToggleWidget, MultiSearchWidget), the hub footer, the help overlay open/close/list behaviour, and the footer(FALSE) toggle; documented the footer and overlay in the README navigation section.

Before / After

BEFORE                                          AFTER
+-------------------------------+       +-------------------------------+
| Hub panel                     |       | Hub panel                     |
|  > Name                       |       |  > Name                       |
|    Email                      |       |    Email                      |
|-------------------------------|       |-------------------------------|
| up/down move . enter select . |       | up/down move . enter select . |
| esc back                      |       | esc back . q quit . ? help    |
+-------------------------------+       +-------------------------------+
  (fixed, partial: no quit/help)          (complete, contextual)

+-------------------------------+       +-------------------------------+
| MultiSelect editor            |       | MultiSelect editor            |
|  [x] Apple                    |       |  [x] Apple                    |
|  [ ] Banana                   |       |  [ ] Banana                   |
| space select . up/down move . |       |-------------------------------|
| left/right none/all . enter   |       | space select . up/down move . |
| accept . esc cancel           |       | left/right none/all . enter   |
| (self-rendered inside view()) |       | accept . esc cancel           |
+-------------------------------+       | (rendered by editor chrome    |
                                        |  from widget->hints())        |
                                        +-------------------------------+

+-------------------------------+       +-------------------------------+
| Password editor (revealable)  |       | Password editor (revealable)  |
|  ****                         |       |  ****                         |
| (no hint line at all -        |       |-------------------------------|
|  reveal key undiscoverable)   |       | enter accept . tab reveal .   |
+-------------------------------+       | esc cancel                    |
                                        +-------------------------------+

           (no ? overlay exists)         +-------------------------------+
                                         | Keyboard help                 |
                                         |                               |
                                         | Navigation                    |
                                         | up/down move . enter select . |
                                         | esc back . q quit . ? help    |
                                         |                               |
                                         | Text                          |
                                         | enter accept . esc cancel     |
                                         |                               |
                                         | Confirm                       |
                                         | y/n yes/no . tab toggle . ... |
                                         |                               |
                                         | ? close                       |
                                         +-------------------------------+
                                         (new: lists hub + every widget
                                          type the form uses)

Summary by CodeRabbit

  • New Features

    • Added contextual key-hint footers that reflect the current focus and available actions.
    • Added a ? help overlay showing navigation and field-specific shortcuts.
    • Added an option to disable footers globally with ->footer(FALSE).
    • Help and hints follow active themes and remapped keys, with ASCII fallback support.
  • Documentation

    • Updated usage documentation to describe contextual footers, help overlays, theming, key remapping, and disabling the footer.

@coderabbitai

coderabbitai Bot commented Jul 10, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

You’ve reached a temporary PR review limit under our Fair Usage Limits Policy.

Your recent review volume is higher than typical usage, so adaptive limits are currently applied.

Next review available in: 46 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: fef961ae-98cb-4635-9ecd-68068d00604b

📥 Commits

Reviewing files that changed from the base of the PR and between f51fe76 and d6b0f1f.

📒 Files selected for processing (1)
  • src/Render/PanelController.php
📝 Walkthrough

Walkthrough

Adds structured widget key hints, contextual footer rendering, a ? help overlay, themed ASCII fallback, and a footer(FALSE) configuration option. Widget, theme, controller, documentation, and PHPUnit coverage are updated accordingly.

Changes

Contextual help system

Layer / File(s) Summary
Hint contracts and footer configuration
src/Input/*, src/Render/HelpSection.php, src/Widget/WidgetInterface.php, src/Builder/Form.php, src/Config/Config.php
Introduces Hint and HelpSection, adds the Help action and ? binding, replaces rendersHint() with hints(), and adds configurable footer visibility.
Widget hint providers
src/Widget/*, tests/phpunit/Unit/Widget/*
Widgets now expose ordered action hints, including mode-specific, bounded-number, password, picker, selection, textarea, and toggle hints; tests assert labels and actions.
Themed hint and help rendering
src/Theme/DefaultTheme.php, playground/2-custom-theme/OceanTheme.php, tests/phpunit/Unit/Theme/*
Replaces fixed status-line rendering with structured renderHints(), updates editor hint inputs, and renders help sections with a close hint.
Panel footer and overlay flow
src/Render/PanelController.php, tests/phpunit/Unit/Render/PanelControllerTest.php
Builds contextual hub and widget hints, opens and dismisses the help overlay, and suppresses footer output when disabled.
Documentation
README.md
Documents contextual footer behavior, the ? overlay, theme/key-map handling, ASCII fallback, and footer(FALSE).

Estimated code review effort: 4 (Complex) | ~45 minutes

Possibly related issues

Possibly related PRs

  • drevops/tui#21 — Shares the theme-rendering API changes used by the new hint and editor rendering flow.
  • drevops/tui#23 — Overlaps with the MultiSelectWidget and themed hint rendering paths replaced by structured Hint objects.
  • drevops/tui#26 — Shares the TextareaWidget external-editor hint integration points.
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 42.99% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the main change: adding a contextual key-binding help footer and a '?' help overlay.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feature/12-help-footer

Comment @coderabbitai help to get the list of available commands.

@AlexSkrypnyk AlexSkrypnyk added A2 Board worker 2 AUTOMERGE Worker auto-merges this PR once it is ready for review labels Jul 10, 2026
@github-actions

This comment has been minimized.

@codecov

codecov Bot commented Jul 10, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 99.52%. Comparing base (8cd42c8) to head (d6b0f1f).
✅ All tests successful. No failed tests found.

Additional details and impacted files
@@           Coverage Diff           @@
##             main      #33   +/-   ##
=======================================
  Coverage   99.51%   99.52%           
=======================================
  Files          70       72    +2     
  Lines        2082     2106   +24     
=======================================
+ Hits         2072     2096   +24     
  Misses         10       10           

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

Each widget contributes its own hint fragments through a typed 'Hint' list, replacing the 'rendersHint()' split and the hand-rolled per-widget hint strings. A single footer renders from the active context - the panel hub or the focused widget - and 'NumberWidget' now steps through remappable 'Increment'/'Decrement' actions so its hints are binding-driven too. A '?' key opens a form-scoped help overlay, and '->footer(FALSE)' turns the footer off.
Each widget's hints() spreads the base accept/cancel fragments from 'AbstractWidget::hints()' rather than repeating them, so the shared tail lives in one place. The rendered footers are unchanged.
'FilePickerWidget' now contributes a 'hints()' list (single vs multiple mode) instead of the removed 'rendersHint()', and the custom-theme example overrides 'renderHints()' in place of the folded-in 'renderStatusLine()'.
@AlexSkrypnyk AlexSkrypnyk force-pushed the feature/12-help-footer branch from a777d77 to f51fe76 Compare July 10, 2026 22:59
@github-actions

This comment has been minimized.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/Builder/Form.php (1)

332-349: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Consider named arguments for the growing Config constructor call.

The positional call now spans 16 arguments, several of matching types ($color/$unicode both ?bool, $submitLabel/$cancelLabel both string), making transposition errors easy to introduce silently as more fields are appended (this PR adds the 16th). Named arguments would make each value self-documenting and immune to reordering mistakes.

♻️ Proposed refactor using named arguments
     $config = new Config(
-      $this->title,
-      $this->subject,
-      $panels,
-      $this->fixups,
-      $this->theme,
-      $this->banner,
-      $this->buttons,
-      $this->submitLabel,
-      $this->cancelLabel,
-      $this->clearOnExit,
-      $this->color,
-      $this->unicode,
-      $this->envPrefix,
-      $this->themeOptions,
-      KeyMapManager::create($this->keymap, $this->keymapOverrides),
-      $this->footer,
+      title: $this->title,
+      subject: $this->subject,
+      panels: $panels,
+      fixups: $this->fixups,
+      theme: $this->theme,
+      banner: $this->banner,
+      buttons: $this->buttons,
+      submitLabel: $this->submitLabel,
+      cancelLabel: $this->cancelLabel,
+      clearOnExit: $this->clearOnExit,
+      color: $this->color,
+      unicode: $this->unicode,
+      envPrefix: $this->envPrefix,
+      themeOptions: $this->themeOptions,
+      keymap: KeyMapManager::create($this->keymap, $this->keymapOverrides),
+      footer: $this->footer,
     );
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/Builder/Form.php` around lines 332 - 349, Replace the positional Config
construction in the Form builder with named arguments matching each Config
constructor parameter, including title, subject, panels, fixups, theme, banner,
buttons, labels, flags, color, environment prefix, theme options, keymap
manager, and footer. Preserve the existing values while making the mapping
explicit and safe to reorder.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/Render/PanelController.php`:
- Around line 489-499: Replace the `$seen` associative array keyed by
`$field->type->value` in `helpSections()` with a list of enum cases, checking
duplicates via strict `in_array($field->type, $seen, TRUE)` and appending unseen
types directly. Keep `->value` out of this internal deduplication path.

---

Outside diff comments:
In `@src/Builder/Form.php`:
- Around line 332-349: Replace the positional Config construction in the Form
builder with named arguments matching each Config constructor parameter,
including title, subject, panels, fixups, theme, banner, buttons, labels, flags,
color, environment prefix, theme options, keymap manager, and footer. Preserve
the existing values while making the mapping explicit and safe to reorder.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: acba9099-0223-4276-9afe-7113ae1dd01c

📥 Commits

Reviewing files that changed from the base of the PR and between 8cd42c8 and f51fe76.

📒 Files selected for processing (42)
  • README.md
  • playground/2-custom-theme/OceanTheme.php
  • src/Builder/Form.php
  • src/Config/Config.php
  • src/Input/Action.php
  • src/Input/DefaultKeyMap.php
  • src/Input/Hint.php
  • src/Render/HelpSection.php
  • src/Render/PanelController.php
  • src/Theme/DefaultTheme.php
  • src/Widget/AbstractWidget.php
  • src/Widget/ConfirmWidget.php
  • src/Widget/FilePickerWidget.php
  • src/Widget/MultiSelectWidget.php
  • src/Widget/NumberWidget.php
  • src/Widget/PasswordWidget.php
  • src/Widget/PauseWidget.php
  • src/Widget/SearchWidget.php
  • src/Widget/SelectWidget.php
  • src/Widget/SuggestWidget.php
  • src/Widget/TextareaWidget.php
  • src/Widget/ToggleWidget.php
  • src/Widget/WidgetInterface.php
  • tests/phpunit/Unit/Builder/FormTest.php
  • tests/phpunit/Unit/Input/KeyMapTest.php
  • tests/phpunit/Unit/Render/PanelControllerTest.php
  • tests/phpunit/Unit/Theme/ThemeOptionsTest.php
  • tests/phpunit/Unit/Theme/ThemeRenderTest.php
  • tests/phpunit/Unit/Widget/ConfirmWidgetTest.php
  • tests/phpunit/Unit/Widget/FilePickerWidgetTest.php
  • tests/phpunit/Unit/Widget/MultiSearchWidgetTest.php
  • tests/phpunit/Unit/Widget/MultiSelectWidgetTest.php
  • tests/phpunit/Unit/Widget/NumberWidgetTest.php
  • tests/phpunit/Unit/Widget/PasswordWidgetTest.php
  • tests/phpunit/Unit/Widget/PauseWidgetTest.php
  • tests/phpunit/Unit/Widget/SearchWidgetTest.php
  • tests/phpunit/Unit/Widget/SelectWidgetTest.php
  • tests/phpunit/Unit/Widget/SuggestWidgetTest.php
  • tests/phpunit/Unit/Widget/TextWidgetTest.php
  • tests/phpunit/Unit/Widget/TextareaWidgetTest.php
  • tests/phpunit/Unit/Widget/ToggleWidgetTest.php
  • tests/phpunit/Unit/Widget/WidgetFactoryTest.php

Comment thread src/Render/PanelController.php
@github-actions

Copy link
Copy Markdown
Code Coverage Report:
  2026-07-10 23:14:16

 Summary:
  Classes: 93.06% (67/72)
  Methods: 98.21% (494/503)
  Lines:   99.53% (2096/2106)

DrevOps\Tui\Answers\Answer
  Methods: 100.00% ( 1/ 1)   Lines: 100.00% (  1/  1)
DrevOps\Tui\Answers\Answers
  Methods: 100.00% ( 9/ 9)   Lines: 100.00% ( 20/ 20)
DrevOps\Tui\Answers\SummaryFormatter
  Methods: 100.00% ( 3/ 3)   Lines: 100.00% ( 20/ 20)
DrevOps\Tui\Builder\FieldBuilder
  Methods: 100.00% (29/29)   Lines: 100.00% ( 96/ 96)
DrevOps\Tui\Builder\Form
  Methods:  93.75% (15/16)   Lines:  98.51% ( 66/ 67)
DrevOps\Tui\Builder\PanelBuilder
  Methods: 100.00% (19/19)   Lines: 100.00% ( 31/ 31)
DrevOps\Tui\Condition\CompositeCondition
  Methods: 100.00% ( 4/ 4)   Lines: 100.00% ( 19/ 19)
DrevOps\Tui\Condition\Condition
  Methods: 100.00% (10/10)   Lines: 100.00% ( 38/ 38)
DrevOps\Tui\Config\Config
  Methods: 100.00% ( 5/ 5)   Lines: 100.00% ( 17/ 17)
DrevOps\Tui\Config\Field
  Methods: 100.00% ( 5/ 5)   Lines: 100.00% ( 30/ 30)
DrevOps\Tui\Config\FieldType
  Methods: 100.00% ( 2/ 2)   Lines: 100.00% (  2/  2)
DrevOps\Tui\Config\NumberBounds
  Methods: 100.00% ( 6/ 6)   Lines: 100.00% ( 20/ 20)
DrevOps\Tui\Config\Option
  Methods: 100.00% ( 3/ 3)   Lines: 100.00% (  9/  9)
DrevOps\Tui\Config\Panel
  Methods: 100.00% ( 1/ 1)   Lines: 100.00% (  1/  1)
DrevOps\Tui\Derive\Derive
  Methods: 100.00% ( 4/ 4)   Lines: 100.00% ( 14/ 14)
DrevOps\Tui\Derive\Deriver
  Methods: 100.00% ( 1/ 1)   Lines: 100.00% ( 13/ 13)
DrevOps\Tui\Derive\Transform
  Methods: 100.00% ( 3/ 3)   Lines: 100.00% (  7/  7)
DrevOps\Tui\Discovery\AbstractDiscover
  Methods: 100.00% ( 1/ 1)   Lines: 100.00% (  1/  1)
DrevOps\Tui\Discovery\Dotenv
  Methods: 100.00% ( 3/ 3)   Lines: 100.00% ( 19/ 19)
DrevOps\Tui\Discovery\JsonValue
  Methods: 100.00% ( 4/ 4)   Lines: 100.00% ( 16/ 16)
DrevOps\Tui\Discovery\PathExists
  Methods: 100.00% ( 3/ 3)   Lines: 100.00% (  3/  3)
DrevOps\Tui\Discovery\Scan
  Methods: 100.00% ( 3/ 3)   Lines: 100.00% ( 20/ 20)
DrevOps\Tui\Engine\Engine
  Methods: 100.00% (12/12)   Lines: 100.00% ( 95/ 95)
DrevOps\Tui\Handler\HandlerRegistry
  Methods:  85.71% ( 6/ 7)   Lines:  95.45% ( 21/ 22)
DrevOps\Tui\Input\ArrayKeyStream
  Methods: 100.00% ( 3/ 3)   Lines: 100.00% ( 12/ 12)
DrevOps\Tui\Input\Binding
  Methods: 100.00% ( 1/ 1)   Lines: 100.00% (  1/  1)
DrevOps\Tui\Input\DefaultKeyMap
  Methods: 100.00% ( 1/ 1)   Lines: 100.00% ( 36/ 36)
DrevOps\Tui\Input\Hint
  Methods: 100.00% ( 1/ 1)   Lines: 100.00% (  1/  1)
DrevOps\Tui\Input\Key
  Methods: 100.00% ( 7/ 7)   Lines: 100.00% (  7/  7)
DrevOps\Tui\Input\KeyMap
  Methods: 100.00% (12/12)   Lines: 100.00% ( 65/ 65)
DrevOps\Tui\Input\KeyMapManager
  Methods: 100.00% ( 2/ 2)   Lines: 100.00% (  8/  8)
DrevOps\Tui\Input\KeyParser
  Methods: 100.00% ( 6/ 6)   Lines: 100.00% ( 68/ 68)
DrevOps\Tui\Input\Scope
  Methods: 100.00% ( 7/ 7)   Lines: 100.00% ( 11/ 11)
DrevOps\Tui\Input\ScopedKeyMap
  Methods: 100.00% ( 4/ 4)   Lines: 100.00% (  4/  4)
DrevOps\Tui\Input\VimKeyMap
  Methods: 100.00% ( 1/ 1)   Lines: 100.00% (  8/  8)
DrevOps\Tui\Render\Ansi
  Methods: 100.00% ( 4/ 4)   Lines: 100.00% (  5/  5)
DrevOps\Tui\Render\Box
  Methods: 100.00% ( 3/ 3)   Lines: 100.00% ( 15/ 15)
DrevOps\Tui\Render\ExternalEditor
  Methods: 100.00% ( 6/ 6)   Lines: 100.00% ( 27/ 27)
DrevOps\Tui\Render\HelpSection
  Methods: 100.00% ( 1/ 1)   Lines: 100.00% (  1/  1)
DrevOps\Tui\Render\Navigator
  Methods: 100.00% ( 6/ 6)   Lines: 100.00% ( 15/ 15)
DrevOps\Tui\Render\PanelController
  Methods: 100.00% (20/20)   Lines: 100.00% (122/122)
DrevOps\Tui\Render\Scroller
  Methods: 100.00% ( 4/ 4)   Lines: 100.00% ( 12/ 12)
DrevOps\Tui\Render\Terminal
  Methods: 100.00% (12/12)   Lines: 100.00% ( 35/ 35)
DrevOps\Tui\Render\TerminalControl
  Methods: 100.00% ( 9/ 9)   Lines: 100.00% (  9/  9)
DrevOps\Tui\Render\Viewport
  Methods: 100.00% ( 1/ 1)   Lines: 100.00% (  1/  1)
DrevOps\Tui\Resolver\InputResolver
  Methods: 100.00% ( 6/ 6)   Lines: 100.00% ( 27/ 27)
DrevOps\Tui\Schema\AgentHelp
  Methods: 100.00% ( 3/ 3)   Lines: 100.00% ( 25/ 25)
DrevOps\Tui\Schema\SchemaGenerator
  Methods: 100.00% ( 3/ 3)   Lines: 100.00% ( 30/ 30)
DrevOps\Tui\Schema\SchemaValidator
  Methods: 100.00% ( 8/ 8)   Lines: 100.00% ( 37/ 37)
DrevOps\Tui\Theme\DefaultTheme
  Methods:  92.54% (62/67)   Lines:  97.36% (221/227)
DrevOps\Tui\Theme\ThemeManager
  Methods: 100.00% ( 2/ 2)   Lines: 100.00% (  8/  8)
DrevOps\Tui\Tui
  Methods: 100.00% (12/12)   Lines: 100.00% ( 26/ 26)
DrevOps\Tui\Widget\AbstractWidget
  Methods: 100.00% (13/13)   Lines: 100.00% ( 24/ 24)
DrevOps\Tui\Widget\ChoiceListTrait
  Methods: 100.00% ( 7/ 7)   Lines: 100.00% ( 21/ 21)
DrevOps\Tui\Widget\ConfirmWidget
  Methods: 100.00% ( 6/ 6)   Lines: 100.00% ( 23/ 23)
DrevOps\Tui\Widget\FilePickerWidget
  Methods: 100.00% (29/29)   Lines: 100.00% (183/183)
DrevOps\Tui\Widget\MultiSearchWidget
  Methods: 100.00% ( 1/ 1)   Lines: 100.00% (  1/  1)
DrevOps\Tui\Widget\MultiSelectWidget
  Methods: 100.00% (10/10)   Lines: 100.00% ( 82/ 82)
DrevOps\Tui\Widget\NumberWidget
  Methods: 100.00% ( 8/ 8)   Lines: 100.00% ( 30/ 30)
DrevOps\Tui\Widget\PasswordDisplay
  Methods: 100.00% ( 1/ 1)   Lines: 100.00% (  5/  5)
DrevOps\Tui\Widget\PasswordWidget
  Methods: 100.00% ( 8/ 8)   Lines: 100.00% ( 40/ 40)
DrevOps\Tui\Widget\PauseWidget
  Methods: 100.00% ( 5/ 5)   Lines: 100.00% ( 11/ 11)
DrevOps\Tui\Widget\SearchWidget
  Methods: 100.00% ( 7/ 7)   Lines: 100.00% ( 47/ 47)
DrevOps\Tui\Widget\SelectWidget
  Methods: 100.00% ( 6/ 6)   Lines: 100.00% ( 30/ 30)
DrevOps\Tui\Widget\SuggestWidget
  Methods: 100.00% ( 6/ 6)   Lines: 100.00% ( 39/ 39)
DrevOps\Tui\Widget\TextWidget
  Methods: 100.00% ( 7/ 7)   Lines: 100.00% ( 31/ 31)
DrevOps\Tui\Widget\TextareaWidget
  Methods: 100.00% ( 8/ 8)   Lines: 100.00% ( 46/ 46)
DrevOps\Tui\Widget\ToggleWidget
  Methods: 100.00% ( 8/ 8)   Lines: 100.00% ( 32/ 32)
DrevOps\Tui\Widget\WidgetFactory
  Methods: 100.00% ( 4/ 4)   Lines: 100.00% ( 30/ 30)
DrevOps\Tui\Widget\WidgetRunner
  Methods: 100.00% ( 1/ 1)   Lines: 100.00% (  5/  5)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

A2 Board worker 2 AUTOMERGE Worker auto-merges this PR once it is ready for review

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add a contextual key-binding help footer

1 participant