Skip to content

Separated the configuration into form, widget and TUI-runtime layers.#56

Merged
AlexSkrypnyk merged 3 commits into
mainfrom
feature/inline-widgets
Jul 16, 2026
Merged

Separated the configuration into form, widget and TUI-runtime layers.#56
AlexSkrypnyk merged 3 commits into
mainfrom
feature/inline-widgets

Conversation

@AlexSkrypnyk

@AlexSkrypnyk AlexSkrypnyk commented Jul 15, 2026

Copy link
Copy Markdown
Member

Summary

Splits the single Config model - which conflated the questionnaire with global terminal settings - into three clearly separated configuration layers: the form (a specific questionnaire), the widget (an individual field), and the TUI runtime (global settings shared by every form an app runs). Settings that describe the terminal rather than the questionnaire - theme, key bindings, color/unicode forcing, the key-hint footer, screen clearing and the active language - move off the Form builder and onto the Tui facade as fluent setters, so two forms in one app no longer each carry their own copy of the terminal's theme or keymap. The DrevOps\Tui\Config namespace is renamed to DrevOps\Tui\Model.

Changes

  • Namespace - DrevOps\Tui\Config renamed to DrevOps\Tui\Model; Config model renamed to FormDefinition; ConfigException renamed to FormException.
  • Form layer (FormDefinition, built by the Form builder) - carries the questionnaire and its own chrome: title, subject, panels, fixups, envPrefix, banner and the submit/cancel buttons and labels.
  • Widget layer (Field) - unchanged; every per-field option already lived here.
  • TUI runtime - the Tui facade gains fluent setters theme(), keys(), color(), unicode(), footer(), clearOnExit() and translator(), and holds those settings for the whole run. PanelController now receives the resolved theme, keymap, footer and clear-on-exit flags directly.
  • API - Tui::config() becomes Tui::form(); the Form builder loses its TUI setters. The common path new Tui($form) is unchanged.
  • Playground, docs and diagram - the demos, the phptui.dev pages and the architecture diagram all move the TUI-runtime settings onto the facade.

Before / After

BEFORE - one Config, terminal settings tangled with the questionnaire

  Form::create(...)
    ->theme('dark')->keys('vim')->color(...)   ┐ global terminal
    ->footer(...)->clearOnExit(...)->translator(...) │ settings, but
    ->banner(...)->buttons(...)                 │ attached per-form
    ->panel(...)                                ┘
        -> Config { title, panels, theme, keymap, color, translator, ... }

AFTER - three layers

  Widget  Field(...)                     one field's options
            ^
  Form    Form::create(...)              the questionnaire + its chrome
            ->banner(...)->buttons(...)
            ->panel(...)  -> FormDefinition { title, panels, banner, buttons }

  TUI     (new Tui($form))               global runtime, shared by every form
            ->theme('dark')->keys('vim')
            ->color(...)->footer(...)->translator(...)
            ->run()

Summary by CodeRabbit

  • New Features

    • Added an immutable form definition model with support for nested panels and field lookup.
    • Added Tui::form() for accessing the built form definition.
  • Changes

    • Shared runtime settings—theme, key bindings, colors, Unicode, footer, exit behavior, and translation—are now configured on Tui.
    • Form-specific settings such as banners and buttons remain part of the form definition.
    • Updated examples to use named constructor arguments and clarified environment-prefix behavior.
  • Documentation

    • Updated architecture, widget, theme, and configuration guidance to reflect the revised API.

@coderabbitai

coderabbitai Bot commented Jul 15, 2026

Copy link
Copy Markdown

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: 5 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: 95100285-32de-49c4-a711-fd8ef3f20aa3

📥 Commits

Reviewing files that changed from the base of the PR and between 00289dd and 8ab3bd5.

⛔ Files ignored due to path filters (2)
  • docs/architecture/architecture-dark.svg is excluded by !**/*.svg
  • docs/architecture/architecture.svg is excluded by !**/*.svg
📒 Files selected for processing (139)
  • README.md
  • docs/architecture/README.md
  • docs/architecture/architecture.puml
  • docs/content/architecture.mdx
  • docs/content/configuration.mdx
  • docs/content/display-modes.mdx
  • docs/content/field-behaviour.mdx
  • docs/content/headless-collection.mdx
  • docs/content/index.mdx
  • docs/content/installation.mdx
  • docs/content/key-bindings.mdx
  • docs/content/panels.mdx
  • docs/content/themes.mdx
  • docs/content/translations.mdx
  • docs/content/widgets/calendar.mdx
  • playground/10-builtin-themes/run.php
  • playground/10-field-styles/run.php
  • playground/2-custom-theme/OceanTheme.php
  • playground/2-custom-theme/run.php
  • playground/3-widgets/widget-calendar.php
  • playground/3-widgets/widget-confirm.php
  • playground/3-widgets/widget-filepicker.php
  • playground/3-widgets/widget-multifilepicker.php
  • playground/3-widgets/widget-multisearch.php
  • playground/3-widgets/widget-multiselect-groups.php
  • playground/3-widgets/widget-multiselect.php
  • playground/3-widgets/widget-number.php
  • playground/3-widgets/widget-password-reveal.php
  • playground/3-widgets/widget-password.php
  • playground/3-widgets/widget-pause.php
  • playground/3-widgets/widget-reorder.php
  • playground/3-widgets/widget-search.php
  • playground/3-widgets/widget-select-groups.php
  • playground/3-widgets/widget-select.php
  • playground/3-widgets/widget-suggest.php
  • playground/3-widgets/widget-text.php
  • playground/3-widgets/widget-textarea.php
  • playground/3-widgets/widget-toggle.php
  • playground/3-widgets/widgets.php
  • playground/4-nested-panels/run.php
  • playground/6-theme-detect/run.php
  • playground/7-theme-options/run.php
  • playground/8-key-bindings/run.php
  • playground/9-bordered-panels/run.php
  • playground/README.md
  • src/Answers/Answer.php
  • src/Answers/Answers.php
  • src/Answers/SummaryFormatter.php
  • src/Builder/FieldBuilder.php
  • src/Builder/Form.php
  • src/Builder/PanelBuilder.php
  • src/Config/ConfigException.php
  • src/Derive/Derive.php
  • src/Engine/Engine.php
  • src/Input/DefaultKeyMap.php
  • src/Input/KeyMap.php
  • src/Input/KeyMapManager.php
  • src/Input/Scope.php
  • src/Input/VimKeyMap.php
  • src/Model/DateBounds.php
  • src/Model/Field.php
  • src/Model/FieldType.php
  • src/Model/FilePickerMode.php
  • src/Model/Fixup.php
  • src/Model/FormDefinition.php
  • src/Model/FormException.php
  • src/Model/NumberBounds.php
  • src/Model/Option.php
  • src/Model/OptionKind.php
  • src/Model/Panel.php
  • src/Model/RenderMode.php
  • src/Model/Weekday.php
  • src/Render/Navigator.php
  • src/Render/PanelController.php
  • src/Resolver/InputResolver.php
  • src/Schema/AgentHelp.php
  • src/Schema/SchemaGenerator.php
  • src/Schema/SchemaValidator.php
  • src/Testing/TuiTester.php
  • src/Theme/DefaultTheme.php
  • src/Theme/ThemeManager.php
  • src/Tui.php
  • src/Widget/CalendarWidget.php
  • src/Widget/Capability/FilterCapableTrait.php
  • src/Widget/Capability/MultiSelectionCapableTrait.php
  • src/Widget/Capability/OptionsCapableInterface.php
  • src/Widget/Capability/OptionsCapableTrait.php
  • src/Widget/Capability/SearchCapableTrait.php
  • src/Widget/Capability/SelectionCapableTrait.php
  • src/Widget/ConfirmWidget.php
  • src/Widget/FilePickerWidget.php
  • src/Widget/Matcher.php
  • src/Widget/MultiSearchWidget.php
  • src/Widget/MultiSelectWidget.php
  • src/Widget/NumberWidget.php
  • src/Widget/PasswordWidget.php
  • src/Widget/PauseWidget.php
  • src/Widget/ReorderWidget.php
  • src/Widget/SearchWidget.php
  • src/Widget/SelectWidget.php
  • src/Widget/TextWidget.php
  • src/Widget/TextareaWidget.php
  • src/Widget/ToggleWidget.php
  • src/Widget/WidgetFactory.php
  • tests/phpunit/Traits/MixedOptionsTrait.php
  • tests/phpunit/Unit/Answers/AnswersTest.php
  • tests/phpunit/Unit/Answers/SummaryFormatterTest.php
  • tests/phpunit/Unit/Builder/FormTest.php
  • tests/phpunit/Unit/Derive/DeriveTest.php
  • tests/phpunit/Unit/Engine/EngineAnswersTest.php
  • tests/phpunit/Unit/Engine/EngineConditionalTest.php
  • tests/phpunit/Unit/Engine/EngineDeclaredBehaviourTest.php
  • tests/phpunit/Unit/Engine/EngineDeriveTest.php
  • tests/phpunit/Unit/Engine/EngineNonInteractiveTest.php
  • tests/phpunit/Unit/Engine/EngineTest.php
  • tests/phpunit/Unit/Input/KeyMapTest.php
  • tests/phpunit/Unit/Model/BuiltModelTest.php
  • tests/phpunit/Unit/Model/DateBoundsTest.php
  • tests/phpunit/Unit/Model/FormDefinitionTest.php
  • tests/phpunit/Unit/Model/NumberBoundsTest.php
  • tests/phpunit/Unit/Model/OptionTest.php
  • tests/phpunit/Unit/Model/WeekdayTest.php
  • tests/phpunit/Unit/Render/NavigatorTest.php
  • tests/phpunit/Unit/Render/PanelControllerTest.php
  • tests/phpunit/Unit/Resolver/InputResolverTest.php
  • tests/phpunit/Unit/Schema/AgentHelpTest.php
  • tests/phpunit/Unit/Schema/SchemaGeneratorTest.php
  • tests/phpunit/Unit/Schema/SchemaValidatorTest.php
  • tests/phpunit/Unit/Testing/AllWidgetsFormTest.php
  • tests/phpunit/Unit/Theme/ThemeOptionsTest.php
  • tests/phpunit/Unit/Theme/ThemeRenderTest.php
  • tests/phpunit/Unit/Translation/TranslationRenderTest.php
  • tests/phpunit/Unit/TuiTest.php
  • tests/phpunit/Unit/Widget/CalendarWidgetTest.php
  • tests/phpunit/Unit/Widget/FilePickerWidgetTest.php
  • tests/phpunit/Unit/Widget/MatcherTest.php
  • tests/phpunit/Unit/Widget/NumberWidgetTest.php
  • tests/phpunit/Unit/Widget/SelectWidgetTest.php
  • tests/phpunit/Unit/Widget/WidgetFactoryTest.php
📝 Walkthrough

Walkthrough

The pull request replaces the Config model with immutable FormDefinition and Model-layer types, moves shared runtime settings to Tui, updates dependent components and tests, and revises documentation and playground examples for the new APIs.

Changes

Form model and runtime migration

Layer / File(s) Summary
Model and builder contracts
src/Model/*, src/Builder/*
Introduces FormDefinition and FormException, migrates model types, and removes runtime configuration methods from Form.
Runtime orchestration
src/Tui.php, src/Engine/*, src/Render/*, src/Answers/*
Rewires TUI execution, answer creation, navigation, rendering, and fixups around FormDefinition and facade-owned runtime state.
Schema, widgets, and input types
src/Schema/*, src/Input/*, src/Widget/*, src/Theme/*
Updates consumers and type contracts to use Model-layer classes and form-based schema/help generation.
Tests and examples
tests/phpunit/*, playground/*, docs/*, README.md
Migrates tests, documentation, and playground configuration to Tui facade methods and named constructor arguments.

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

Possibly related PRs

  • drevops/tui#4: Both modify theme resolution in src/Tui.php.
  • drevops/tui#42: Both update Tui and PanelController integration with the testing harness.
  • drevops/tui#48: Both change translator ownership between Form and Tui.

Suggested labels: A2

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.
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.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately summarizes the core refactor: splitting configuration concerns across form, widget, and TUI runtime layers.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feature/inline-widgets

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

@github-actions

This comment has been minimized.

@codecov

codecov Bot commented Jul 15, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 98.64865% with 1 line in your changes missing coverage. Please review.
✅ Project coverage is 97.48%. Comparing base (b8a046d) to head (8ab3bd5).
⚠️ Report is 2 commits behind head on main.

Files with missing lines Patch % Lines
src/Model/NumberBounds.php 0.00% 1 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main      #56      +/-   ##
==========================================
- Coverage   97.48%   97.48%   -0.01%     
==========================================
  Files          97       97              
  Lines        2863     2858       -5     
==========================================
- Hits         2791     2786       -5     
  Misses         72       72              

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

@github-actions

github-actions Bot commented Jul 15, 2026

Copy link
Copy Markdown

@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: 3

🤖 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 `@docs/content/index.mdx`:
- Line 55: Update the Quick Start documentation around the Tui constructor
example to replace the stale config() accessor reference with form() and
appearance(), reflecting the current API while preserving the surrounding
guidance.

In `@src/Derive/Derive.php`:
- Line 32: Replace the double-quoted string literals with single-quoted literals
at src/Derive/Derive.php lines 32-32 for the sprintf format string,
tests/phpunit/Unit/Engine/EngineNonInteractiveTest.php lines 55-55 for the JSON
fixture, and tests/phpunit/Unit/Schema/SchemaGeneratorTest.php lines 173-187 for
the JSON assertion fragments; preserve their existing contents and behavior.

In `@src/Testing/TuiTester.php`:
- Around line 90-100: Update the constructor’s $appearance PHPDoc to state that
NULL uses the builder’s own appearance when $form is a Form, and a default
Appearance when $form is already a FormDefinition. Leave the constructor
implementation unchanged.
🪄 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: 7a9697d9-0704-4b43-9c31-07e3c7de92cb

📥 Commits

Reviewing files that changed from the base of the PR and between e35d255 and 49fef06.

⛔ Files ignored due to path filters (2)
  • docs/architecture/architecture-dark.svg is excluded by !**/*.svg
  • docs/architecture/architecture.svg is excluded by !**/*.svg
📒 Files selected for processing (109)
  • README.md
  • docs/architecture/README.md
  • docs/architecture/architecture.puml
  • docs/content/architecture.mdx
  • docs/content/field-behaviour.mdx
  • docs/content/headless-collection.mdx
  • docs/content/index.mdx
  • docs/content/installation.mdx
  • docs/content/key-bindings.mdx
  • docs/content/widgets/calendar.mdx
  • playground/2-custom-theme/OceanTheme.php
  • playground/4-nested-panels/run.php
  • playground/8-key-bindings/run.php
  • src/Answers/Answer.php
  • src/Answers/Answers.php
  • src/Answers/SummaryFormatter.php
  • src/Builder/FieldBuilder.php
  • src/Builder/Form.php
  • src/Builder/PanelBuilder.php
  • src/Config/ConfigException.php
  • src/Derive/Derive.php
  • src/Engine/Engine.php
  • src/Input/DefaultKeyMap.php
  • src/Input/KeyMap.php
  • src/Input/KeyMapManager.php
  • src/Input/Scope.php
  • src/Input/VimKeyMap.php
  • src/Model/Appearance.php
  • src/Model/DateBounds.php
  • src/Model/Field.php
  • src/Model/FieldType.php
  • src/Model/FilePickerMode.php
  • src/Model/Fixup.php
  • src/Model/FormDefinition.php
  • src/Model/FormException.php
  • src/Model/NumberBounds.php
  • src/Model/Option.php
  • src/Model/OptionKind.php
  • src/Model/Panel.php
  • src/Model/RenderMode.php
  • src/Model/Weekday.php
  • src/Render/Navigator.php
  • src/Render/PanelController.php
  • src/Resolver/InputResolver.php
  • src/Schema/AgentHelp.php
  • src/Schema/SchemaGenerator.php
  • src/Schema/SchemaValidator.php
  • src/Testing/TuiTester.php
  • src/Theme/DefaultTheme.php
  • src/Theme/ThemeManager.php
  • src/Tui.php
  • src/Widget/CalendarWidget.php
  • src/Widget/Capability/FilterCapableTrait.php
  • src/Widget/Capability/MultiSelectionCapableTrait.php
  • src/Widget/Capability/OptionsCapableInterface.php
  • src/Widget/Capability/OptionsCapableTrait.php
  • src/Widget/Capability/SearchCapableTrait.php
  • src/Widget/Capability/SelectionCapableTrait.php
  • src/Widget/ConfirmWidget.php
  • src/Widget/FilePickerWidget.php
  • src/Widget/Matcher.php
  • src/Widget/MultiSearchWidget.php
  • src/Widget/MultiSelectWidget.php
  • src/Widget/NumberWidget.php
  • src/Widget/PasswordWidget.php
  • src/Widget/PauseWidget.php
  • src/Widget/ReorderWidget.php
  • src/Widget/SearchWidget.php
  • src/Widget/SelectWidget.php
  • src/Widget/TextWidget.php
  • src/Widget/TextareaWidget.php
  • src/Widget/ToggleWidget.php
  • src/Widget/WidgetFactory.php
  • tests/phpunit/Traits/MixedOptionsTrait.php
  • tests/phpunit/Unit/Answers/AnswersTest.php
  • tests/phpunit/Unit/Answers/SummaryFormatterTest.php
  • tests/phpunit/Unit/Builder/FormTest.php
  • tests/phpunit/Unit/Derive/DeriveTest.php
  • tests/phpunit/Unit/Engine/EngineAnswersTest.php
  • tests/phpunit/Unit/Engine/EngineConditionalTest.php
  • tests/phpunit/Unit/Engine/EngineDeclaredBehaviourTest.php
  • tests/phpunit/Unit/Engine/EngineDeriveTest.php
  • tests/phpunit/Unit/Engine/EngineNonInteractiveTest.php
  • tests/phpunit/Unit/Engine/EngineTest.php
  • tests/phpunit/Unit/Input/KeyMapTest.php
  • tests/phpunit/Unit/Model/AppearanceTest.php
  • tests/phpunit/Unit/Model/BuiltModelTest.php
  • tests/phpunit/Unit/Model/DateBoundsTest.php
  • tests/phpunit/Unit/Model/FormDefinitionTest.php
  • tests/phpunit/Unit/Model/NumberBoundsTest.php
  • tests/phpunit/Unit/Model/OptionTest.php
  • tests/phpunit/Unit/Model/WeekdayTest.php
  • tests/phpunit/Unit/Render/NavigatorTest.php
  • tests/phpunit/Unit/Render/PanelControllerTest.php
  • tests/phpunit/Unit/Resolver/InputResolverTest.php
  • tests/phpunit/Unit/Schema/AgentHelpTest.php
  • tests/phpunit/Unit/Schema/SchemaGeneratorTest.php
  • tests/phpunit/Unit/Schema/SchemaValidatorTest.php
  • tests/phpunit/Unit/Testing/AllWidgetsFormTest.php
  • tests/phpunit/Unit/Theme/ThemeOptionsTest.php
  • tests/phpunit/Unit/Theme/ThemeRenderTest.php
  • tests/phpunit/Unit/Translation/TranslationRenderTest.php
  • tests/phpunit/Unit/TuiTest.php
  • tests/phpunit/Unit/Widget/CalendarWidgetTest.php
  • tests/phpunit/Unit/Widget/FilePickerWidgetTest.php
  • tests/phpunit/Unit/Widget/MatcherTest.php
  • tests/phpunit/Unit/Widget/NumberWidgetTest.php
  • tests/phpunit/Unit/Widget/SelectWidgetTest.php
  • tests/phpunit/Unit/Widget/WidgetFactoryTest.php
💤 Files with no reviewable changes (1)
  • src/Config/ConfigException.php

Comment thread docs/content/index.mdx
Comment thread src/Derive/Derive.php
Comment thread src/Testing/TuiTester.php Outdated
@AlexSkrypnyk
AlexSkrypnyk force-pushed the feature/inline-widgets branch from 49fef06 to 00289dd Compare July 16, 2026 02:07
@AlexSkrypnyk AlexSkrypnyk changed the title Split the 'Config' model into 'FormDefinition' and 'Appearance' and renamed its namespace to 'Model'. Separated the configuration into form, widget and TUI-runtime layers. Jul 16, 2026

@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: 6

Caution

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

⚠️ Outside diff range comments (4)
docs/content/themes.mdx (1)

22-26: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Describe auto as display-mode detection, not named-theme selection.

'' and 'auto' resolve to the default theme; terminal probing determines its light/dark mode. ThemeManager only registers default, so the documented ->theme('dark') and ->theme('light') calls fail unless consumers register those aliases. Update this paragraph and the surrounding examples accordingly.

🤖 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 `@docs/content/themes.mdx` around lines 22 - 26, Update the themes
documentation paragraph and surrounding examples to describe empty and 'auto'
values as resolving to the registered 'default' theme, with terminal probing
determining its light/dark display mode. Remove claims that explicit
->theme('dark') or ->theme('light') are built-in opt-outs, and clarify those
names require consumer-registered aliases.
playground/2-custom-theme/run.php (1)

32-33: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Update the stale theme-ownership comments.

The code correctly moves OceanTheme::class to Tui, but the file header and the require comment still say the form names the theme. Update those comments so this example consistently documents the new API.

Proposed wording
- * Custom theme example: the form names a theme class; run it via the facade.
+ * Custom theme example: the Tui facade names a theme class and runs the form.

-// The require makes the class loadable; the form names it directly, so no
+// The require makes the class loadable; the facade names it directly, so no

Also applies to: 45-46

🤖 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 `@playground/2-custom-theme/run.php` around lines 32 - 33, Update the stale
comments in the file header and around the require statement to state that
OceanTheme is owned or provided by Tui, matching the existing OceanTheme::class
move. Leave the Form::create usage and other code unchanged.
playground/README.md (2)

136-148: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Align the custom-theme example with the facade API.

This new section correctly documents Tui::theme(...), but the earlier 2-custom-theme entry still says OceanTheme.php is named directly on the form. Update that entry so the README does not give contradictory instructions.

🤖 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 `@playground/README.md` around lines 136 - 148, Update the earlier
2-custom-theme README entry to show configuring the theme through the Tui
facade’s theme(...) API instead of naming OceanTheme.php directly on the form,
keeping the example consistent with the “How the TUI picks a theme” section.

164-166: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Correct the key-map validation timing.

Tui::keys() calls KeyMapManager::create() immediately, so invalid bindings throw when ->keys(...) is invoked—not when the form is built. The current wording can mislead users about where to catch configuration errors.

🤖 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 `@playground/README.md` around lines 164 - 166, Update the key-map validation
wording in the README to state that invalid or conflicting bindings are detected
when Tui::keys() invokes KeyMapManager::create(), at the ->keys(...) call,
rather than when the form is built or during a session.
🤖 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 `@docs/content/configuration.mdx`:
- Around line 42-50: Update the configuration documentation around the Tui
facade description to replace the claim that its runtime settings are shared by
every form with wording that scopes them to the current Tui run. Preserve the
listed options and their existing behavior descriptions.

In `@docs/content/headless-collection.mdx`:
- Around line 19-21: Update the `new Tui` constructor example in the `envPrefix`
documentation to use the current form variable, such as `$form` or
`$formDefinition`, instead of the undefined `$config`; keep the surrounding
prefix behavior explanation unchanged.

In `@docs/content/themes.mdx`:
- Around line 43-46: Update the custom-theme PHP snippet around the Tui theme
call so it is self-contained and copyable: use the namespace where OceanTheme is
declared and import or fully qualify Tui within the snippet. Keep the existing
theme assignment behavior unchanged.

In `@src/Builder/Form.php`:
- Around line 187-197: Complete the FormDefinition/Appearance split: in
src/Builder/Form.php lines 187-197, remove banner and button presentation state
from FormDefinition and provide it through Appearance; in
src/Testing/TuiTester.php lines 89-97, accept and forward an optional
Appearance. Move chrome-default assertions from
src/tests/phpunit/Unit/Model/BuiltModelTest.php lines 93-103 into
Appearance-focused tests, and update docs/architecture/architecture.puml lines
16-17 plus docs/content/architecture.mdx lines 30 and 41-43 to define Appearance
as the presentation/runtime model with its Tui ownership and dependencies.

In `@src/Schema/AgentHelp.php`:
- Around line 23-24: Update the `@param` documentation for the FormDefinition
parameter in AgentHelp to describe it as “The form definition to describe”
instead of referring to it as configuration.

In `@src/Tui.php`:
- Around line 120-122: Update the execution entry points run(), collect(), and
controller() to activate this facade’s translator via
Translator::setShared($this->translator) at the start of each operation,
including when the value is NULL. Remove reliance on constructor-time or
configuration-time shared state so every operation restores the owning Tui
instance’s translator before proceeding.

---

Outside diff comments:
In `@docs/content/themes.mdx`:
- Around line 22-26: Update the themes documentation paragraph and surrounding
examples to describe empty and 'auto' values as resolving to the registered
'default' theme, with terminal probing determining its light/dark display mode.
Remove claims that explicit ->theme('dark') or ->theme('light') are built-in
opt-outs, and clarify those names require consumer-registered aliases.

In `@playground/2-custom-theme/run.php`:
- Around line 32-33: Update the stale comments in the file header and around the
require statement to state that OceanTheme is owned or provided by Tui, matching
the existing OceanTheme::class move. Leave the Form::create usage and other code
unchanged.

In `@playground/README.md`:
- Around line 136-148: Update the earlier 2-custom-theme README entry to show
configuring the theme through the Tui facade’s theme(...) API instead of naming
OceanTheme.php directly on the form, keeping the example consistent with the
“How the TUI picks a theme” section.
- Around line 164-166: Update the key-map validation wording in the README to
state that invalid or conflicting bindings are detected when Tui::keys() invokes
KeyMapManager::create(), at the ->keys(...) call, rather than when the form is
built or during a session.
🪄 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: ba00bfff-08e3-4204-ba91-2be91b26ee82

📥 Commits

Reviewing files that changed from the base of the PR and between 49fef06 and 00289dd.

⛔ Files ignored due to path filters (2)
  • docs/architecture/architecture-dark.svg is excluded by !**/*.svg
  • docs/architecture/architecture.svg is excluded by !**/*.svg
📒 Files selected for processing (138)
  • README.md
  • docs/architecture/README.md
  • docs/architecture/architecture.puml
  • docs/content/architecture.mdx
  • docs/content/configuration.mdx
  • docs/content/display-modes.mdx
  • docs/content/field-behaviour.mdx
  • docs/content/headless-collection.mdx
  • docs/content/index.mdx
  • docs/content/installation.mdx
  • docs/content/key-bindings.mdx
  • docs/content/panels.mdx
  • docs/content/themes.mdx
  • docs/content/translations.mdx
  • docs/content/widgets/calendar.mdx
  • playground/10-field-styles/run.php
  • playground/2-custom-theme/OceanTheme.php
  • playground/2-custom-theme/run.php
  • playground/3-widgets/widget-calendar.php
  • playground/3-widgets/widget-confirm.php
  • playground/3-widgets/widget-filepicker.php
  • playground/3-widgets/widget-multifilepicker.php
  • playground/3-widgets/widget-multisearch.php
  • playground/3-widgets/widget-multiselect-groups.php
  • playground/3-widgets/widget-multiselect.php
  • playground/3-widgets/widget-number.php
  • playground/3-widgets/widget-password-reveal.php
  • playground/3-widgets/widget-password.php
  • playground/3-widgets/widget-pause.php
  • playground/3-widgets/widget-reorder.php
  • playground/3-widgets/widget-search.php
  • playground/3-widgets/widget-select-groups.php
  • playground/3-widgets/widget-select.php
  • playground/3-widgets/widget-suggest.php
  • playground/3-widgets/widget-text.php
  • playground/3-widgets/widget-textarea.php
  • playground/3-widgets/widget-toggle.php
  • playground/3-widgets/widgets.php
  • playground/4-nested-panels/run.php
  • playground/6-theme-detect/run.php
  • playground/7-theme-options/run.php
  • playground/8-key-bindings/run.php
  • playground/9-bordered-panels/run.php
  • playground/README.md
  • src/Answers/Answer.php
  • src/Answers/Answers.php
  • src/Answers/SummaryFormatter.php
  • src/Builder/FieldBuilder.php
  • src/Builder/Form.php
  • src/Builder/PanelBuilder.php
  • src/Config/ConfigException.php
  • src/Derive/Derive.php
  • src/Engine/Engine.php
  • src/Input/DefaultKeyMap.php
  • src/Input/KeyMap.php
  • src/Input/KeyMapManager.php
  • src/Input/Scope.php
  • src/Input/VimKeyMap.php
  • src/Model/DateBounds.php
  • src/Model/Field.php
  • src/Model/FieldType.php
  • src/Model/FilePickerMode.php
  • src/Model/Fixup.php
  • src/Model/FormDefinition.php
  • src/Model/FormException.php
  • src/Model/NumberBounds.php
  • src/Model/Option.php
  • src/Model/OptionKind.php
  • src/Model/Panel.php
  • src/Model/RenderMode.php
  • src/Model/Weekday.php
  • src/Render/Navigator.php
  • src/Render/PanelController.php
  • src/Resolver/InputResolver.php
  • src/Schema/AgentHelp.php
  • src/Schema/SchemaGenerator.php
  • src/Schema/SchemaValidator.php
  • src/Testing/TuiTester.php
  • src/Theme/DefaultTheme.php
  • src/Theme/ThemeManager.php
  • src/Tui.php
  • src/Widget/CalendarWidget.php
  • src/Widget/Capability/FilterCapableTrait.php
  • src/Widget/Capability/MultiSelectionCapableTrait.php
  • src/Widget/Capability/OptionsCapableInterface.php
  • src/Widget/Capability/OptionsCapableTrait.php
  • src/Widget/Capability/SearchCapableTrait.php
  • src/Widget/Capability/SelectionCapableTrait.php
  • src/Widget/ConfirmWidget.php
  • src/Widget/FilePickerWidget.php
  • src/Widget/Matcher.php
  • src/Widget/MultiSearchWidget.php
  • src/Widget/MultiSelectWidget.php
  • src/Widget/NumberWidget.php
  • src/Widget/PasswordWidget.php
  • src/Widget/PauseWidget.php
  • src/Widget/ReorderWidget.php
  • src/Widget/SearchWidget.php
  • src/Widget/SelectWidget.php
  • src/Widget/TextWidget.php
  • src/Widget/TextareaWidget.php
  • src/Widget/ToggleWidget.php
  • src/Widget/WidgetFactory.php
  • tests/phpunit/Traits/MixedOptionsTrait.php
  • tests/phpunit/Unit/Answers/AnswersTest.php
  • tests/phpunit/Unit/Answers/SummaryFormatterTest.php
  • tests/phpunit/Unit/Builder/FormTest.php
  • tests/phpunit/Unit/Derive/DeriveTest.php
  • tests/phpunit/Unit/Engine/EngineAnswersTest.php
  • tests/phpunit/Unit/Engine/EngineConditionalTest.php
  • tests/phpunit/Unit/Engine/EngineDeclaredBehaviourTest.php
  • tests/phpunit/Unit/Engine/EngineDeriveTest.php
  • tests/phpunit/Unit/Engine/EngineNonInteractiveTest.php
  • tests/phpunit/Unit/Engine/EngineTest.php
  • tests/phpunit/Unit/Input/KeyMapTest.php
  • tests/phpunit/Unit/Model/BuiltModelTest.php
  • tests/phpunit/Unit/Model/DateBoundsTest.php
  • tests/phpunit/Unit/Model/FormDefinitionTest.php
  • tests/phpunit/Unit/Model/NumberBoundsTest.php
  • tests/phpunit/Unit/Model/OptionTest.php
  • tests/phpunit/Unit/Model/WeekdayTest.php
  • tests/phpunit/Unit/Render/NavigatorTest.php
  • tests/phpunit/Unit/Render/PanelControllerTest.php
  • tests/phpunit/Unit/Resolver/InputResolverTest.php
  • tests/phpunit/Unit/Schema/AgentHelpTest.php
  • tests/phpunit/Unit/Schema/SchemaGeneratorTest.php
  • tests/phpunit/Unit/Schema/SchemaValidatorTest.php
  • tests/phpunit/Unit/Testing/AllWidgetsFormTest.php
  • tests/phpunit/Unit/Theme/ThemeOptionsTest.php
  • tests/phpunit/Unit/Theme/ThemeRenderTest.php
  • tests/phpunit/Unit/Translation/TranslationRenderTest.php
  • tests/phpunit/Unit/TuiTest.php
  • tests/phpunit/Unit/Widget/CalendarWidgetTest.php
  • tests/phpunit/Unit/Widget/FilePickerWidgetTest.php
  • tests/phpunit/Unit/Widget/MatcherTest.php
  • tests/phpunit/Unit/Widget/NumberWidgetTest.php
  • tests/phpunit/Unit/Widget/SelectWidgetTest.php
  • tests/phpunit/Unit/Widget/WidgetFactoryTest.php
💤 Files with no reviewable changes (1)
  • src/Config/ConfigException.php

Comment thread docs/content/configuration.mdx
Comment thread docs/content/headless-collection.mdx
Comment thread docs/content/themes.mdx Outdated
Comment thread src/Builder/Form.php
Comment on lines +187 to 197
$form = new FormDefinition(
$this->title,
$this->subject,
$panels,
$this->fixups,
$this->theme,
$this->envPrefix,
$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,
$this->translator,
);

@coderabbitai coderabbitai Bot Jul 16, 2026

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🎯 Functional Correctness | 🟠 Major | 🏗️ Heavy lift

Complete the declared FormDefinition / Appearance split.

FormDefinition still receives banner and button presentation state, while the tester and architecture docs expose no Appearance contract. This leaves the PR’s advertised API split unimplemented.

  • src/Builder/Form.php#L187-L197: move banner/button presentation state out of FormDefinition into Appearance.
  • src/Testing/TuiTester.php#L89-L97: accept and forward an optional Appearance so tests can configure the facade contract.
  • tests/phpunit/Unit/Model/BuiltModelTest.php#L93-L103: move chrome-default assertions to Appearance tests.
  • docs/architecture/architecture.puml#L16-L17: add Appearance and its Tui ownership/dependencies.
  • docs/content/architecture.mdx#L30-L30,41-L43: describe Appearance as the presentation/runtime model.
📍 Affects 5 files
  • src/Builder/Form.php#L187-L197 (this comment)
  • src/Testing/TuiTester.php#L89-L97
  • tests/phpunit/Unit/Model/BuiltModelTest.php#L93-L103
  • docs/architecture/architecture.puml#L16-L17
  • docs/content/architecture.mdx#L30-L30
🤖 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 187 - 197, Complete the
FormDefinition/Appearance split: in src/Builder/Form.php lines 187-197, remove
banner and button presentation state from FormDefinition and provide it through
Appearance; in src/Testing/TuiTester.php lines 89-97, accept and forward an
optional Appearance. Move chrome-default assertions from
src/tests/phpunit/Unit/Model/BuiltModelTest.php lines 93-103 into
Appearance-focused tests, and update docs/architecture/architecture.puml lines
16-17 plus docs/content/architecture.mdx lines 30 and 41-43 to define Appearance
as the presentation/runtime model with its Tui ownership and dependencies.

Source: Coding guidelines

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

This describes the earlier two-layer design; the PR has since moved to a three-layer split, so there is no Appearance model to complete.

The three layers are: the widget layer (Field), the form layer (FormDefinition, which owns the questionnaire and its own chrome - the start banner and the submit/cancel buttons), and the global TUI runtime. The runtime is configured with fluent setters on the Tui facade (theme(), keys(), color(), unicode(), footer(), clearOnExit(), translator()) rather than a separate model object.

Banner and buttons are intentionally form chrome, not terminal-runtime settings, so they belong on FormDefinition; TuiTester no longer takes an Appearance; and the architecture diagram/docs describe the facade-owned runtime rather than an Appearance model. So there is no split left to finish - this is the intended shape.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

@AlexSkrypnyk Thanks for the clarification — that makes sense. Withdrawing this comment since it was based on the earlier two-layer design described in the PR objectives, which has since evolved into the three-layer split you describe.


✏️ Learnings added
Learnt from: AlexSkrypnyk
Repo: drevops/tui PR: 56
File: src/Builder/Form.php:187-197
Timestamp: 2026-07-16T02:36:55.928Z
Learning: In the `drevops/tui` PHP repository, the architecture is a three-layer split, not a `FormDefinition`/`Appearance` two-model split: (1) the widget layer (`DrevOps\Tui\Model\Field`), (2) the form layer (`DrevOps\Tui\Model\FormDefinition`, which owns the questionnaire plus its own chrome — start banner via `banner` and submit/cancel buttons via `buttons`/`submitLabel`/`cancelLabel`), and (3) the global TUI runtime, which is configured via fluent setters directly on the `DrevOps\Tui\Tui` facade (`theme()`, `keys()`, `color()`, `unicode()`, `footer()`, `clearOnExit()`, `translator()`) rather than through a separate `Appearance` model class. Banner and buttons are intentionally form chrome (on `FormDefinition`), not terminal-runtime settings. There is no `Appearance` model to introduce; `TuiTester` does not accept one.

Note: Learnings are effective only in the context of similar code segments. To apply general coding guidelines, please configure review instructions. You can manage existing learnings in the app.

Comment thread src/Schema/AgentHelp.php Outdated
Comment thread src/Tui.php Outdated
…and renamed the 'Config' namespace to 'Model'.
@AlexSkrypnyk
AlexSkrypnyk force-pushed the feature/inline-widgets branch from 00289dd to 63e6b4f Compare July 16, 2026 02:23
@github-actions

This comment has been minimized.

@github-actions

Copy link
Copy Markdown
Code Coverage Report:
  2026-07-16 02:44:19

 Summary:
  Classes: 83.51% (81/97)
  Methods: 95.65% (682/713)
  Lines:   97.48% (2786/2858)

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\Provenance
  Methods: 100.00% ( 1/ 1)   Lines: 100.00% (  7/  7)
DrevOps\Tui\Answers\SummaryFormatter
  Methods: 100.00% ( 4/ 4)   Lines: 100.00% ( 24/ 24)
DrevOps\Tui\Builder\FieldBuilder
  Methods: 100.00% (38/38)   Lines: 100.00% (135/135)
DrevOps\Tui\Builder\Form
  Methods:  90.91% (10/11)   Lines:  98.18% ( 54/ 55)
DrevOps\Tui\Builder\PanelBuilder
  Methods: 100.00% (21/21)   Lines: 100.00% ( 33/ 33)
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\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% (15/15)   Lines: 100.00% (103/103)
DrevOps\Tui\Handler\HandlerRegistry
  Methods:  85.71% ( 6/ 7)   Lines:  95.45% ( 21/ 22)
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% ( 38/ 38)
DrevOps\Tui\Input\Hint
  Methods: 100.00% ( 1/ 1)   Lines: 100.00% (  2/  2)
DrevOps\Tui\Input\Key
  Methods:  87.50% ( 7/ 8)   Lines:  63.64% (  7/ 11)
DrevOps\Tui\Input\KeyMap
  Methods: 100.00% (11/11)   Lines: 100.00% ( 61/ 61)
DrevOps\Tui\Input\KeyMapManager
  Methods: 100.00% ( 2/ 2)   Lines: 100.00% (  8/  8)
DrevOps\Tui\Input\KeyParser
  Methods:  85.71% ( 6/ 7)   Lines:  98.94% ( 93/ 94)
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% ( 12/ 12)
DrevOps\Tui\Model\DateBounds
  Methods: 100.00% ( 6/ 6)   Lines: 100.00% ( 28/ 28)
DrevOps\Tui\Model\Field
  Methods:  77.78% ( 7/ 9)   Lines:  87.69% ( 57/ 65)
DrevOps\Tui\Model\FieldType
  Methods:  50.00% ( 3/ 6)   Lines:  26.32% ( 10/ 38)
DrevOps\Tui\Model\FormDefinition
  Methods: 100.00% ( 4/ 4)   Lines: 100.00% ( 12/ 12)
DrevOps\Tui\Model\NumberBounds
  Methods:  83.33% ( 5/ 6)   Lines:  95.24% ( 20/ 21)
DrevOps\Tui\Model\Option
  Methods: 100.00% ( 3/ 3)   Lines: 100.00% (  9/  9)
DrevOps\Tui\Model\Panel
  Methods: 100.00% ( 2/ 2)   Lines: 100.00% (  2/  2)
DrevOps\Tui\Model\Weekday
  Methods: 100.00% ( 4/ 4)   Lines: 100.00% ( 15/ 15)
DrevOps\Tui\Render\Ansi
  Methods: 100.00% ( 5/ 5)   Lines: 100.00% ( 13/ 13)
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% (25/25)   Lines: 100.00% (151/151)
DrevOps\Tui\Render\Scroller
  Methods: 100.00% ( 5/ 5)   Lines: 100.00% ( 15/ 15)
DrevOps\Tui\Render\Terminal
  Methods:  92.86% (13/14)   Lines:  95.74% ( 45/ 47)
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% ( 29/ 29)
DrevOps\Tui\Schema\AgentHelp
  Methods: 100.00% ( 4/ 4)   Lines: 100.00% ( 31/ 31)
DrevOps\Tui\Schema\SchemaGenerator
  Methods: 100.00% ( 3/ 3)   Lines: 100.00% ( 33/ 33)
DrevOps\Tui\Schema\SchemaValidator
  Methods: 100.00% ( 7/ 7)   Lines: 100.00% ( 32/ 32)
DrevOps\Tui\Testing\ArrayKeyStream
  Methods: 100.00% ( 3/ 3)   Lines: 100.00% ( 12/ 12)
DrevOps\Tui\Testing\BufferedTerminal
  Methods: 100.00% ( 6/ 6)   Lines: 100.00% ( 11/ 11)
DrevOps\Tui\Testing\KeyEncoder
  Methods: 100.00% ( 1/ 1)   Lines: 100.00% ( 21/ 21)
DrevOps\Tui\Testing\TuiTester
  Methods: 100.00% (11/11)   Lines: 100.00% ( 26/ 26)
DrevOps\Tui\Testing\WidgetRunner
  Methods: 100.00% ( 1/ 1)   Lines: 100.00% (  5/  5)
DrevOps\Tui\Theme\DefaultTheme
  Methods:  95.89% (70/73)   Lines:  96.68% (262/271)
DrevOps\Tui\Theme\DosTheme
  Methods:  72.73% ( 8/11)   Lines:  76.92% ( 10/ 13)
DrevOps\Tui\Theme\EmberTheme
  Methods:  66.67% ( 6/ 9)   Lines:  66.67% (  6/  9)
DrevOps\Tui\Theme\FrostTheme
  Methods:  66.67% ( 6/ 9)   Lines:  66.67% (  6/  9)
DrevOps\Tui\Theme\MidnightTheme
  Methods:  66.67% ( 6/ 9)   Lines:  66.67% (  6/  9)
DrevOps\Tui\Theme\MonoTheme
  Methods:  66.67% ( 6/ 9)   Lines:  66.67% (  6/  9)
DrevOps\Tui\Theme\Sgr
  Methods: 100.00% ( 1/ 1)   Lines: 100.00% (  1/  1)
DrevOps\Tui\Theme\ThemeManager
  Methods: 100.00% ( 2/ 2)   Lines: 100.00% (  8/  8)
DrevOps\Tui\Translation\Translator
  Methods: 100.00% (11/11)   Lines: 100.00% ( 45/ 45)
DrevOps\Tui\Tui
  Methods: 100.00% (21/21)   Lines: 100.00% ( 58/ 58)
DrevOps\Tui\Widget\AbstractWidget
  Methods: 100.00% (17/17)   Lines: 100.00% ( 43/ 43)
DrevOps\Tui\Widget\CalendarWidget
  Methods: 100.00% (13/13)   Lines: 100.00% ( 54/ 54)
DrevOps\Tui\Widget\Capability\CompletionCapableTrait
  Methods: 100.00% ( 3/ 3)   Lines: 100.00% ( 14/ 14)
DrevOps\Tui\Widget\Capability\FilterCapableTrait
  Methods: 100.00% ( 4/ 4)   Lines: 100.00% ( 15/ 15)
DrevOps\Tui\Widget\Capability\MultiSelectionCapableTrait
  Methods: 100.00% (10/10)   Lines: 100.00% ( 63/ 63)
DrevOps\Tui\Widget\Capability\OptionsCapableTrait
  Methods: 100.00% ( 9/ 9)   Lines: 100.00% ( 34/ 34)
DrevOps\Tui\Widget\Capability\PagingCapableTrait
  Methods: 100.00% ( 4/ 4)   Lines: 100.00% ( 16/ 16)
DrevOps\Tui\Widget\Capability\SearchCapableTrait
  Methods: 100.00% ( 3/ 3)   Lines: 100.00% (  3/  3)
DrevOps\Tui\Widget\Capability\SelectionCapableTrait
  Methods: 100.00% ( 6/ 6)   Lines: 100.00% ( 19/ 19)
DrevOps\Tui\Widget\Capability\TextEditCapableTrait
  Methods: 100.00% ( 9/ 9)   Lines: 100.00% ( 34/ 34)
DrevOps\Tui\Widget\ConfirmWidget
  Methods: 100.00% ( 7/ 7)   Lines: 100.00% ( 23/ 23)
DrevOps\Tui\Widget\FilePickerWidget
  Methods: 100.00% (31/31)   Lines: 100.00% (181/181)
DrevOps\Tui\Widget\MatchResult
  Methods: 100.00% ( 1/ 1)   Lines: 100.00% (  1/  1)
DrevOps\Tui\Widget\MatchTier
  Methods: 100.00% ( 1/ 1)   Lines: 100.00% (  6/  6)
DrevOps\Tui\Widget\Matcher
  Methods: 100.00% ( 9/ 9)   Lines: 100.00% ( 73/ 73)
DrevOps\Tui\Widget\MultiSearchWidget
  Methods: 100.00% ( 2/ 2)   Lines: 100.00% (  4/  4)
DrevOps\Tui\Widget\MultiSelectWidget
  Methods: 100.00% ( 4/ 4)   Lines: 100.00% (  7/  7)
DrevOps\Tui\Widget\NumberWidget
  Methods: 100.00% ( 9/ 9)   Lines: 100.00% ( 38/ 38)
DrevOps\Tui\Widget\PasswordDisplay
  Methods: 100.00% ( 1/ 1)   Lines: 100.00% (  5/  5)
DrevOps\Tui\Widget\PasswordWidget
  Methods: 100.00% ( 9/ 9)   Lines: 100.00% ( 47/ 47)
DrevOps\Tui\Widget\PauseWidget
  Methods: 100.00% ( 5/ 5)   Lines: 100.00% ( 11/ 11)
DrevOps\Tui\Widget\ReorderWidget
  Methods: 100.00% (10/10)   Lines: 100.00% ( 55/ 55)
DrevOps\Tui\Widget\SearchWidget
  Methods: 100.00% ( 4/ 4)   Lines: 100.00% ( 14/ 14)
DrevOps\Tui\Widget\SelectWidget
  Methods: 100.00% ( 4/ 4)   Lines: 100.00% (  6/  6)
DrevOps\Tui\Widget\SuggestWidget
  Methods: 100.00% (12/12)   Lines: 100.00% ( 46/ 46)
DrevOps\Tui\Widget\TextWidget
  Methods: 100.00% ( 5/ 5)   Lines: 100.00% ( 18/ 18)
DrevOps\Tui\Widget\TextareaWidget
  Methods: 100.00% ( 8/ 8)   Lines: 100.00% ( 51/ 51)
DrevOps\Tui\Widget\ToggleWidget
  Methods: 100.00% ( 8/ 8)   Lines: 100.00% ( 32/ 32)
DrevOps\Tui\Widget\WidgetFactory
  Methods: 100.00% ( 5/ 5)   Lines: 100.00% ( 35/ 35)

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