Skip to content

Restructured the docs into categories and reskinned every example to a produce theme.#59

Merged
AlexSkrypnyk merged 2 commits into
mainfrom
feature/docs-restructure
Jul 16, 2026
Merged

Restructured the docs into categories and reskinned every example to a produce theme.#59
AlexSkrypnyk merged 2 commits into
mainfrom
feature/docs-restructure

Conversation

@AlexSkrypnyk

@AlexSkrypnyk AlexSkrypnyk commented Jul 16, 2026

Copy link
Copy Markdown
Member

Summary

Restructured the Docusaurus docs: grouped the flat top-level pages into five sidebar categories (Getting started, Guides, Widgets, Appearance & input, About) with every URL unchanged, and rebuilt all 17 widget reference pages with a consistent Options table, Keyboard table, a Headless-behaviour section where the widget enforces bounds or schema fields headlessly, and a four-mode Display-modes grid. Added a multi-widget quick start backed by a new playground/0-quickstart/run.php example, mirrored in index.mdx and installation.mdx, with a generated light/dark screenshot. Linked the dev-docs preview build from the root README and switched the docs navbar and favicon to the SVG logo. Reskinned every demo example - the widget reference pages, the quick start, option-groups, every playground script (scaffolder, nested panels, bordered panels, discovery, theme demos, field styles), and the widget file-picker fixture tree - from software references (Redis, Docker, PHP, MySQL, timezones) to a fruit-and-vegetable theme, cataloged in .claude/demo_content_reference.md and enforced by a new AGENTS.md convention, regenerating every affected SVG screenshot to match.

Changes

  • Navigation & structure: docs/sidebars.js replaces the autogenerated flat list with 5 explicit categories (Getting started, Guides, Widgets, Appearance & input, About); no page moved, so every URL is unchanged; removed the now-redundant docs/content/widgets/_category_.json.
  • Widget reference pages: all 17 pages under docs/content/widgets/ rebuilt with a uniform Options table (Name/Description/Required/Default, methods shown with ()), a Keyboard table, a Headless behaviour section, and the existing four-mode Display-modes grid; option-groups.mdx gained a Builder methods table and a Behaviour section.
  • Quick start: new runnable playground/0-quickstart/run.php (text, select, multi-select, number, confirm on one panel), a matching quickstart job in docs/util/update-assets.php, and a generated light/dark screenshot embedded in index.mdx and installation.mdx.
  • README & logo: added the dev-docs preview link (tui-docs.netlify.app, rebuilt from main ahead of each release) beside the production phptui.dev link; docs/docusaurus.config.js now points the navbar logo and favicon at docs/static/img/logo.svg instead of logo.png.
  • Produce theme: .claude/demo_content_reference.md defines the canonical produce demo content (fruit/vegetable vocabulary, canonical widget values, the quick-start order form, a derived-value chain, and the file-picker fixture layout); AGENTS.md records the no-software-references convention; every doc code example, playground script, the filepicker-tree fixture, and the corresponding generated SVGs are reskinned to produce.

Screenshots

N/A - this is a documentation and playground-scripts change with no runtime application feature; the docs rendering is validated by the Docusaurus production build rather than a browser screenshot.

Known limitation

The widgets montage SVG (docs/assets/widgets-*-animated.svg) is left as its previously committed content: its asciinema recording pipeline anchors on per-widget titles (expect "Text widget", expect "Password widget", ...) that the montage form (playground/3-widgets/widgets.php, form title Widgets) does not render - it shows every widget as a field on one panel, not as separate per-widget screens - a pre-existing break that is independent of this reskin. The montage form's source is reskinned to produce like every other example; only its generated animation could not be regenerated.

Before / After

┌─ BEFORE ─────────────────────────────────────────────────────────────────────┐
│ Sidebar      flat list, autogenerated from the filesystem                    │
│ Widgets      17 pages of running prose, no tables                            │
│ Quick start  a single required text field                                    │
│ Examples     software refs - Redis, Docker, PHP, MySQL, Europe/London        │
│ Logo         docs/static/img/logo.png                                        │
└──────────────────────────────────────────────────────────────────────────────┘
                                    │
                            ▼ restructure + reskin
┌─ AFTER ──────────────────────────────────────────────────────────────────────┐
│ Sidebar      5 explicit categories (Getting started ... About)               │
│ Widgets      17 pages - Options, Keyboard, Headless behaviour, Display modes │
│ Quick start  multi-widget order form + generated screenshot                  │
│ Examples     produce theme - apples, carrots, baskets, harvest dates         │
│ Logo         docs/static/img/logo.svg                                        │
└──────────────────────────────────────────────────────────────────────────────┘

Summary by CodeRabbit

  • New Features
    • Added a quick-start playground runner with schema, interactive, and headless prompt modes.
    • Standardized canonical demo content (fruit-and-vegetable-only) and aligned fixtures to it.
  • Documentation
    • Reorganized documentation navigation with explicit sidebar ordering and expanded widget pages (options, keyboard, headless behavior, display modes).
    • Updated several walkthroughs and sample snippets; refreshed docs preview/branding guidance.
  • Chores
    • Refreshed scripted TUI/SVG assets and demo render fixtures for consistent outputs, including file-picker CSV fixtures.

@coderabbitai

coderabbitai Bot commented Jul 16, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

The PR establishes canonical fruit-and-vegetable demo content, updates documentation and navigation, rewrites playground examples and fixtures, and synchronizes SVG rendering and recorded interaction scripts.

Changes

Documentation and demo-content guidance

Layer / File(s) Summary
Canonical demo content guidance
.claude/demo_content_reference.md, AGENTS.md, README.md
Adds canonical example data rules, authoring guidance, and a documentation preview reference.
Core guides and form examples
docs/content/index.mdx, docs/content/installation.mdx, docs/content/configuration.mdx, docs/content/discovery.mdx, docs/content/field-behaviour.mdx, docs/content/architecture.mdx, docs/content/panels.mdx
Updates quick-start, form configuration, discovery, behavior, architecture, and panel examples.
Structured widget references
docs/content/widgets/*.mdx
Reorganizes widget pages with usage examples, option tables, keyboard references, headless behavior, and display-mode descriptions.
Documentation site organization
docs/docusaurus.config.js, docs/sidebars.js, docs/util/make-light-svgs.php
Switches branding assets, defines explicit sidebar categories, and adds quick-start light SVG generation.
Playground scenario data
playground/0-*, playground/1-*, playground/3-*, playground/4-*, playground/5-*, playground/7-*, playground/9-*, playground/10-*
Updates forms, widget values, discovery fixtures, file-picker fixtures, and scenario labels to produce-themed examples.
SVG rendering and recorded interactions
docs/util/render-widget-svgs.php, docs/util/update-assets.php
Synchronizes widget specifications, scripted interactions, verification anchors, and quick-start asset jobs with the revised examples.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Possibly related PRs

  • drevops/tui#41: Rewrites reorder widget documentation and related SVG defaults.
  • drevops/tui#43: Also updates bordered-panel demos and documentation.
  • drevops/tui#52: Shares the SVG-generation and deterministic widget-interaction pipeline.
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately summarizes the main changes: sidebar restructuring and the repo-wide produce-theme reskin.
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.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feature/docs-restructure

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

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

🤖 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 @.claude/demo_content_reference.md:
- Around line 24-25: Keep the canonical demo vocabulary consistent by either
adding Melon to the Fruits list in demo_content_reference.md or changing the
password default at the referenced value to an existing fruit. Ensure the chosen
value remains consistent across the documentation, scripts, and screenshots.

In `@docs/content/panels.mdx`:
- Line 49: Update the calendar example using the harvest_on field to set its
default value to the canonical date 2026-07-15, while preserving the existing
standalone configuration and label.

In `@docs/content/widgets/text.mdx`:
- Around line 25-27: Update the text widget example around the complete callback
to avoid unguarded access to $answers['fruit']: either include the preceding
fruit field in the documented snippet or return an empty candidate list when
fruit is absent, while preserving the existing Gala candidate when it is
available.

In `@docs/util/render-widget-svgs.php`:
- Line 98: Update the default string in the textarea configuration within
Form::create to use a single-quoted multiline literal, preserving the existing
text and newline while following the project’s quoting convention.

In `@playground/0-minimal/run.php`:
- Line 11: Complete the fruit-and-vegetable reskin across all listed sites: in
playground/0-minimal/run.php:11-11, replace the Ada name with canonical
produce-themed demo data; in playground/1-scaffolder/run.php:45-45, rename the
build panel id to a produce-oriented identifier such as contents; in
playground/4-nested-panels/run.php:40-40, replace stack with a delivery-oriented
id; in playground/4-nested-panels/run.php:57-57, rename tuning to packaging; and
in playground/5-discovery/run.php:38-38, rename project to box. Remove any
remaining software or technology references from these PHP demo examples.
- Around line 28-31: Replace the closed string-literal option sets with backed
enums, preserving their existing string values and labels. Apply this to fruit
choices in playground/0-minimal/run.php lines 28-31 and
playground/0-quickstart/run.php lines 32-42; derive transforms and size,
contents, and delivery choices in playground/1-scaffolder/run.php lines 37-43
and 48-72; grade and extras in playground/10-builtin-themes/run.php lines 48-58;
ripeness states and select/search/toggle choices in
playground/3-widgets/widget-toggle.php lines 32-34 and
playground/3-widgets/widgets.php lines 39-76; delivery, add-ons, packaging, and
condition values in playground/4-nested-panels/run.php lines 34-61; and season
and basket choices in playground/5-discovery/run.php lines 42-46. Pass each
enum’s value only at builder configuration boundaries.

In `@playground/1-scaffolder/run.php`:
- Line 32: Replace the double-quoted description string in the scaffolder chain
around $p with a single-quoted string, preserving the embedded double quotes. In
playground/3-widgets/widgets.php lines 37-37, convert the affected multiline
string to a nowdoc or concatenate single-quoted lines with an interpreted
newline, as appropriate.
- Around line 73-74: Update the comment above the confirm field created by
confirm() to describe it as a confirmation rather than a yes/no toggle, keeping
the implementation unchanged.

In `@playground/10-builtin-themes/run.php`:
- Line 53: Update the builder call in the extras field from multiselect() to the
declared camelCase method multiSelect(), preserving its existing arguments and
configuration.

In `@playground/3-widgets/filepicker-tree/README.md`:
- Around line 3-5: Remove technology references from the demo prose: in
playground/3-widgets/filepicker-tree/README.md lines 3-5, describe produce price
lists and pantry stock without mentioning file-picker, *.csv, or pantry.yaml; in
playground/3-widgets/widget-filepicker.php line 9, replace “CSV” with
produce-focused wording while keeping the executable extension filter unchanged.

In `@playground/3-widgets/widget-textarea.php`:
- Line 34: Update the default string expression in the textarea call to use
single-quote syntax while preserving the embedded newline behavior, and leave
the externalEditor configuration 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: d95ec14d-40f4-47b7-872d-ef136efcdbc5

📥 Commits

Reviewing files that changed from the base of the PR and between 5e692c9 and 60a2e38.

⛔ Files ignored due to path filters (291)
  • docs/assets/bordered-panels-dark-animated.svg is excluded by !**/*.svg
  • docs/assets/bordered-panels-light-animated.svg is excluded by !**/*.svg
  • docs/assets/borderless-panels-dark-animated.svg is excluded by !**/*.svg
  • docs/assets/borderless-panels-light-animated.svg is excluded by !**/*.svg
  • docs/assets/discovery-dark-static.svg is excluded by !**/*.svg
  • docs/assets/discovery-light-static.svg is excluded by !**/*.svg
  • docs/assets/nested-panels-dark-animated.svg is excluded by !**/*.svg
  • docs/assets/nested-panels-light-animated.svg is excluded by !**/*.svg
  • docs/assets/quickstart-dark-static.svg is excluded by !**/*.svg
  • docs/assets/quickstart-light-static.svg is excluded by !**/*.svg
  • docs/assets/scaffolder-dark-animated-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/scaffolder-dark-animated-ascii.svg is excluded by !**/*.svg
  • docs/assets/scaffolder-dark-animated-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/scaffolder-dark-animated.svg is excluded by !**/*.svg
  • docs/assets/scaffolder-light-animated-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/scaffolder-light-animated-ascii.svg is excluded by !**/*.svg
  • docs/assets/scaffolder-light-animated-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/scaffolder-light-animated.svg is excluded by !**/*.svg
  • docs/assets/theme-dos.svg is excluded by !**/*.svg
  • docs/assets/theme-ember-light.svg is excluded by !**/*.svg
  • docs/assets/theme-ember.svg is excluded by !**/*.svg
  • docs/assets/theme-frost-light.svg is excluded by !**/*.svg
  • docs/assets/theme-frost.svg is excluded by !**/*.svg
  • docs/assets/theme-midnight-light.svg is excluded by !**/*.svg
  • docs/assets/theme-midnight.svg is excluded by !**/*.svg
  • docs/assets/theme-mono-light.svg is excluded by !**/*.svg
  • docs/assets/theme-mono.svg is excluded by !**/*.svg
  • docs/assets/widget-calendar-dark-animated-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-calendar-dark-animated-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-calendar-dark-animated-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-calendar-dark-animated.svg is excluded by !**/*.svg
  • docs/assets/widget-calendar-dark-static-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-calendar-dark-static-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-calendar-dark-static-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-calendar-dark-static.svg is excluded by !**/*.svg
  • docs/assets/widget-calendar-light-animated-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-calendar-light-animated-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-calendar-light-animated-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-calendar-light-animated.svg is excluded by !**/*.svg
  • docs/assets/widget-calendar-light-static-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-calendar-light-static-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-calendar-light-static-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-calendar-light-static.svg is excluded by !**/*.svg
  • docs/assets/widget-confirm-dark-animated-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-confirm-dark-animated-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-confirm-dark-animated-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-confirm-dark-animated.svg is excluded by !**/*.svg
  • docs/assets/widget-confirm-dark-static-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-confirm-dark-static-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-confirm-dark-static-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-confirm-dark-static.svg is excluded by !**/*.svg
  • docs/assets/widget-confirm-light-animated-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-confirm-light-animated-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-confirm-light-animated-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-confirm-light-animated.svg is excluded by !**/*.svg
  • docs/assets/widget-confirm-light-static-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-confirm-light-static-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-confirm-light-static-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-confirm-light-static.svg is excluded by !**/*.svg
  • docs/assets/widget-filepicker-dark-animated-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-filepicker-dark-animated-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-filepicker-dark-animated-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-filepicker-dark-animated.svg is excluded by !**/*.svg
  • docs/assets/widget-filepicker-dark-static-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-filepicker-dark-static-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-filepicker-dark-static-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-filepicker-dark-static.svg is excluded by !**/*.svg
  • docs/assets/widget-filepicker-light-animated-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-filepicker-light-animated-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-filepicker-light-animated-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-filepicker-light-animated.svg is excluded by !**/*.svg
  • docs/assets/widget-filepicker-light-static-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-filepicker-light-static-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-filepicker-light-static-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-filepicker-light-static.svg is excluded by !**/*.svg
  • docs/assets/widget-multifilepicker-dark-animated-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-multifilepicker-dark-animated-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-multifilepicker-dark-animated-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-multifilepicker-dark-animated.svg is excluded by !**/*.svg
  • docs/assets/widget-multifilepicker-dark-static-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-multifilepicker-dark-static-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-multifilepicker-dark-static-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-multifilepicker-dark-static.svg is excluded by !**/*.svg
  • docs/assets/widget-multifilepicker-light-animated-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-multifilepicker-light-animated-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-multifilepicker-light-animated-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-multifilepicker-light-animated.svg is excluded by !**/*.svg
  • docs/assets/widget-multifilepicker-light-static-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-multifilepicker-light-static-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-multifilepicker-light-static-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-multifilepicker-light-static.svg is excluded by !**/*.svg
  • docs/assets/widget-multisearch-dark-animated-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-multisearch-dark-animated-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-multisearch-dark-animated-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-multisearch-dark-animated.svg is excluded by !**/*.svg
  • docs/assets/widget-multisearch-dark-static-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-multisearch-dark-static-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-multisearch-dark-static-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-multisearch-dark-static.svg is excluded by !**/*.svg
  • docs/assets/widget-multisearch-light-animated-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-multisearch-light-animated-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-multisearch-light-animated-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-multisearch-light-animated.svg is excluded by !**/*.svg
  • docs/assets/widget-multisearch-light-static-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-multisearch-light-static-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-multisearch-light-static-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-multisearch-light-static.svg is excluded by !**/*.svg
  • docs/assets/widget-multiselect-dark-animated-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-multiselect-dark-animated-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-multiselect-dark-animated-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-multiselect-dark-animated.svg is excluded by !**/*.svg
  • docs/assets/widget-multiselect-dark-static-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-multiselect-dark-static-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-multiselect-dark-static-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-multiselect-dark-static.svg is excluded by !**/*.svg
  • docs/assets/widget-multiselect-groups-dark-static-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-multiselect-groups-dark-static-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-multiselect-groups-dark-static-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-multiselect-groups-dark-static.svg is excluded by !**/*.svg
  • docs/assets/widget-multiselect-groups-light-static-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-multiselect-groups-light-static-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-multiselect-groups-light-static-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-multiselect-groups-light-static.svg is excluded by !**/*.svg
  • docs/assets/widget-multiselect-light-animated-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-multiselect-light-animated-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-multiselect-light-animated-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-multiselect-light-animated.svg is excluded by !**/*.svg
  • docs/assets/widget-multiselect-light-static-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-multiselect-light-static-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-multiselect-light-static-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-multiselect-light-static.svg is excluded by !**/*.svg
  • docs/assets/widget-number-dark-animated-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-number-dark-animated-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-number-dark-animated-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-number-dark-animated.svg is excluded by !**/*.svg
  • docs/assets/widget-number-dark-static-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-number-dark-static-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-number-dark-static-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-number-dark-static.svg is excluded by !**/*.svg
  • docs/assets/widget-number-light-animated-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-number-light-animated-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-number-light-animated-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-number-light-animated.svg is excluded by !**/*.svg
  • docs/assets/widget-number-light-static-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-number-light-static-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-number-light-static-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-number-light-static.svg is excluded by !**/*.svg
  • docs/assets/widget-password-dark-animated-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-password-dark-animated-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-password-dark-animated-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-password-dark-animated.svg is excluded by !**/*.svg
  • docs/assets/widget-password-dark-static-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-password-dark-static-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-password-dark-static-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-password-dark-static.svg is excluded by !**/*.svg
  • docs/assets/widget-password-light-animated-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-password-light-animated-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-password-light-animated-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-password-light-animated.svg is excluded by !**/*.svg
  • docs/assets/widget-password-light-static-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-password-light-static-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-password-light-static-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-password-light-static.svg is excluded by !**/*.svg
  • docs/assets/widget-password-reveal-dark-static.svg is excluded by !**/*.svg
  • docs/assets/widget-password-reveal-light-static.svg is excluded by !**/*.svg
  • docs/assets/widget-reorder-dark-animated-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-reorder-dark-animated-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-reorder-dark-animated-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-reorder-dark-animated.svg is excluded by !**/*.svg
  • docs/assets/widget-reorder-dark-static-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-reorder-dark-static-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-reorder-dark-static-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-reorder-dark-static.svg is excluded by !**/*.svg
  • docs/assets/widget-reorder-light-animated-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-reorder-light-animated-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-reorder-light-animated-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-reorder-light-animated.svg is excluded by !**/*.svg
  • docs/assets/widget-reorder-light-static-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-reorder-light-static-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-reorder-light-static-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-reorder-light-static.svg is excluded by !**/*.svg
  • docs/assets/widget-search-dark-animated-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-search-dark-animated-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-search-dark-animated-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-search-dark-animated.svg is excluded by !**/*.svg
  • docs/assets/widget-search-dark-static-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-search-dark-static-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-search-dark-static-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-search-dark-static.svg is excluded by !**/*.svg
  • docs/assets/widget-search-light-animated-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-search-light-animated-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-search-light-animated-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-search-light-animated.svg is excluded by !**/*.svg
  • docs/assets/widget-search-light-static-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-search-light-static-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-search-light-static-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-search-light-static.svg is excluded by !**/*.svg
  • docs/assets/widget-select-dark-animated-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-select-dark-animated-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-select-dark-animated-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-select-dark-animated.svg is excluded by !**/*.svg
  • docs/assets/widget-select-dark-static-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-select-dark-static-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-select-dark-static-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-select-dark-static.svg is excluded by !**/*.svg
  • docs/assets/widget-select-groups-dark-static-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-select-groups-dark-static-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-select-groups-dark-static-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-select-groups-dark-static.svg is excluded by !**/*.svg
  • docs/assets/widget-select-groups-light-static-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-select-groups-light-static-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-select-groups-light-static-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-select-groups-light-static.svg is excluded by !**/*.svg
  • docs/assets/widget-select-light-animated-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-select-light-animated-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-select-light-animated-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-select-light-animated.svg is excluded by !**/*.svg
  • docs/assets/widget-select-light-static-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-select-light-static-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-select-light-static-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-select-light-static.svg is excluded by !**/*.svg
  • docs/assets/widget-suggest-dark-animated-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-suggest-dark-animated-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-suggest-dark-animated-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-suggest-dark-animated.svg is excluded by !**/*.svg
  • docs/assets/widget-suggest-dark-static-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-suggest-dark-static-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-suggest-dark-static-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-suggest-dark-static.svg is excluded by !**/*.svg
  • docs/assets/widget-suggest-light-animated-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-suggest-light-animated-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-suggest-light-animated-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-suggest-light-animated.svg is excluded by !**/*.svg
  • docs/assets/widget-suggest-light-static-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-suggest-light-static-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-suggest-light-static-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-suggest-light-static.svg is excluded by !**/*.svg
  • docs/assets/widget-text-dark-animated-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-text-dark-animated-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-text-dark-animated-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-text-dark-animated.svg is excluded by !**/*.svg
  • docs/assets/widget-text-dark-static-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-text-dark-static-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-text-dark-static-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-text-dark-static.svg is excluded by !**/*.svg
  • docs/assets/widget-text-light-animated-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-text-light-animated-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-text-light-animated-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-text-light-animated.svg is excluded by !**/*.svg
  • docs/assets/widget-text-light-static-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-text-light-static-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-text-light-static-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-text-light-static.svg is excluded by !**/*.svg
  • docs/assets/widget-textarea-dark-animated-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-textarea-dark-animated-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-textarea-dark-animated-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-textarea-dark-animated.svg is excluded by !**/*.svg
  • docs/assets/widget-textarea-dark-static-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-textarea-dark-static-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-textarea-dark-static-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-textarea-dark-static.svg is excluded by !**/*.svg
  • docs/assets/widget-textarea-light-animated-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-textarea-light-animated-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-textarea-light-animated-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-textarea-light-animated.svg is excluded by !**/*.svg
  • docs/assets/widget-textarea-light-static-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-textarea-light-static-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-textarea-light-static-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-textarea-light-static.svg is excluded by !**/*.svg
  • docs/assets/widget-toggle-dark-animated-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-toggle-dark-animated-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-toggle-dark-animated-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-toggle-dark-animated.svg is excluded by !**/*.svg
  • docs/assets/widget-toggle-dark-static-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-toggle-dark-static-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-toggle-dark-static-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-toggle-dark-static.svg is excluded by !**/*.svg
  • docs/assets/widget-toggle-light-animated-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-toggle-light-animated-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-toggle-light-animated-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-toggle-light-animated.svg is excluded by !**/*.svg
  • docs/assets/widget-toggle-light-static-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-toggle-light-static-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-toggle-light-static-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-toggle-light-static.svg is excluded by !**/*.svg
  • docs/static/img/logo.svg is excluded by !**/*.svg
  • playground/3-widgets/filepicker-tree/baskets/apples.csv is excluded by !**/*.csv
  • playground/3-widgets/filepicker-tree/baskets/pears.csv is excluded by !**/*.csv
  • playground/3-widgets/filepicker-tree/deliveries/monday.log is excluded by !**/*.log
  • playground/3-widgets/filepicker-tree/harvest.csv is excluded by !**/*.csv
  • playground/5-discovery/sample/harvest.csv is excluded by !**/*.csv
📒 Files selected for processing (73)
  • .claude/demo_content_reference.md
  • AGENTS.md
  • README.md
  • docs/content/architecture.mdx
  • docs/content/configuration.mdx
  • docs/content/discovery.mdx
  • docs/content/field-behaviour.mdx
  • docs/content/index.mdx
  • docs/content/installation.mdx
  • docs/content/panels.mdx
  • docs/content/widgets/_category_.json
  • docs/content/widgets/calendar.mdx
  • docs/content/widgets/confirm.mdx
  • docs/content/widgets/filepicker.mdx
  • docs/content/widgets/multifilepicker.mdx
  • docs/content/widgets/multisearch.mdx
  • docs/content/widgets/multiselect.mdx
  • docs/content/widgets/number.mdx
  • docs/content/widgets/option-groups.mdx
  • docs/content/widgets/password.mdx
  • docs/content/widgets/pause.mdx
  • docs/content/widgets/reorder.mdx
  • docs/content/widgets/search.mdx
  • docs/content/widgets/select.mdx
  • docs/content/widgets/suggest.mdx
  • docs/content/widgets/text.mdx
  • docs/content/widgets/textarea.mdx
  • docs/content/widgets/toggle.mdx
  • docs/docusaurus.config.js
  • docs/sidebars.js
  • docs/util/make-light-svgs.php
  • docs/util/render-widget-svgs.php
  • docs/util/update-assets.php
  • playground/0-minimal/run.php
  • playground/0-quickstart/run.php
  • playground/1-scaffolder/run.php
  • playground/10-builtin-themes/run.php
  • playground/10-field-styles/run.php
  • playground/3-widgets/filepicker-tree/README.md
  • playground/3-widgets/filepicker-tree/composer.json
  • playground/3-widgets/filepicker-tree/config/app.yml
  • playground/3-widgets/filepicker-tree/config/services.yml
  • playground/3-widgets/filepicker-tree/pantry.yaml
  • playground/3-widgets/filepicker-tree/src/Kernel.php
  • playground/3-widgets/show.php
  • playground/3-widgets/widget-filepicker.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-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/5-discovery/run.php
  • playground/5-discovery/sample/.env
  • playground/5-discovery/sample/baskets/apples/.gitkeep
  • playground/5-discovery/sample/baskets/pears/.gitkeep
  • playground/5-discovery/sample/box.json
  • playground/5-discovery/sample/composer.json
  • playground/5-discovery/sample/docker-compose.yml
  • playground/5-discovery/sample/modules/alpha/.gitkeep
  • playground/5-discovery/sample/modules/beta/.gitkeep
  • playground/7-theme-options/run.php
  • playground/9-bordered-panels/run.php
💤 Files with no reviewable changes (9)
  • playground/5-discovery/sample/modules/beta/.gitkeep
  • playground/5-discovery/sample/modules/alpha/.gitkeep
  • playground/3-widgets/filepicker-tree/config/services.yml
  • playground/5-discovery/sample/composer.json
  • docs/content/widgets/category.json
  • playground/3-widgets/filepicker-tree/composer.json
  • playground/3-widgets/filepicker-tree/src/Kernel.php
  • playground/3-widgets/filepicker-tree/config/app.yml
  • playground/5-discovery/sample/docker-compose.yml

Comment thread .claude/demo_content_reference.md Outdated
Comment thread docs/content/panels.mdx Outdated
Comment thread docs/content/widgets/text.mdx Outdated
Comment thread docs/util/render-widget-svgs.php Outdated
Comment thread playground/0-minimal/run.php Outdated
Comment thread playground/1-scaffolder/run.php
Comment thread playground/1-scaffolder/run.php Outdated
Comment thread playground/10-builtin-themes/run.php Outdated
Comment thread playground/3-widgets/filepicker-tree/README.md
Comment thread playground/3-widgets/widget-textarea.php Outdated
…a produce theme.

Grouped the top-level pages into sidebar categories; rebuilt every widget page with an options table, keyboard and display-mode sections; added a multi-widget quick start (playground/0-quickstart) with a generated screenshot; linked the dev-docs preview from the README; switched the docs navbar and favicon to the SVG logo. Reskinned every demo example - widget pages, quick start, option-groups, all playground scripts, the scaffolder/nested/bordered panel demos, discovery and its sample fixture, and the built-in-theme and field-style demos - from software references to a fruit-and-vegetable theme catalogued in .claude/demo_content_reference.md and enforced by an AGENTS.md convention, regenerating the affected screenshots.
@AlexSkrypnyk
AlexSkrypnyk force-pushed the feature/docs-restructure branch from 60a2e38 to b988360 Compare July 16, 2026 04:48
@github-actions

This comment has been minimized.

@github-actions

github-actions Bot commented Jul 16, 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: 6

♻️ Duplicate comments (2)
playground/0-minimal/run.php (2)

11-11: 📐 Maintainability & Code Quality | 🟡 Minor

Replace the stale non-produce usage value.

Line 11 still uses {"name":"Ada"}. Use the canonical produce-themed example, such as {"name":"Weekly Box","fruit":"apple"}, so the copy-paste command matches the reskinned form.

As per PR objectives, playground examples are being standardized on fruit-and-vegetable demo content.

🤖 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/0-minimal/run.php` at line 11, Update the usage example in the
run.php documentation comment to use the canonical produce-themed prompts value,
including both “name” set to “Weekly Box” and “fruit” set to “apple”.

28-31: 📐 Maintainability & Code Quality | 🟠 Major

Represent these closed option sets with enums.

The changed examples model finite values with duplicated raw strings. Define backed or pure enums for each set, type values carrying those sets with the enum, and use scalar values only at the rendering/serialization boundary.

  • playground/0-minimal/run.php#L28-L31: use a fruit enum for the default and options.
  • playground/0-quickstart/run.php#L32-L42: use fruit and vegetable enums.
  • playground/10-builtin-themes/run.php#L47-L57: use grade and extras enums.
  • playground/3-widgets/widget-select-groups.php#L32-L35: use an enum for selectable fruit values.
  • playground/3-widgets/widget-select-groups.php#L37-L37: use the same enum for the disabled rhubarb value.
  • playground/3-widgets/widget-select.php#L30-L33: use a fruit enum for the default and options.
  • playground/3-widgets/widget-suggest.php#L30-L35: use a fruit enum for suggestion values.
  • playground/7-theme-options/run.php#L38-L46: use box-size and extras enums.

As per coding guidelines, closed sets must use backed or pure enums instead of string literals.

🤖 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/0-minimal/run.php` around lines 28 - 31, Replace duplicated string
literals for closed option sets with enums and use enum cases throughout the
examples, converting to scalar values only at rendering or serialization
boundaries. Apply this to playground/0-minimal/run.php lines 28-31 for fruit;
playground/0-quickstart/run.php lines 32-42 for fruit and vegetables;
playground/10-builtin-themes/run.php lines 47-57 for grades and extras;
playground/3-widgets/widget-select-groups.php lines 32-35 and 37-37 using the
same fruit enum, including disabled rhubarb;
playground/3-widgets/widget-select.php lines 30-33 for fruit;
playground/3-widgets/widget-suggest.php lines 30-35 for fruit; and
playground/7-theme-options/run.php lines 38-46 for box sizes and extras.

Source: Coding guidelines

🤖 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 74-75: Update the conditional example using the heat_level and
warning_label fields so every field referenced by its Condition instances is
declared in the form; either introduce the missing tags field before these
checks or replace tags with an existing declared field while preserving the
intended spicy and vegetable conditions.

In `@docs/content/widgets/multisearch.mdx`:
- Around line 19-29: Replace the PHP/API snippets with non-technical examples
using only the canonical fruit-and-vegetable demo theme. Update the examples in
docs/content/widgets/multisearch.mdx lines 19-29,
docs/content/widgets/multiselect.mdx lines 18-27,
docs/content/widgets/number.mdx lines 17-23, and
docs/content/widgets/option-groups.mdx lines 17-26; remove all references to
software, technologies, services, tools, products, or brands while preserving
each example’s demonstrated widget behavior.

In `@docs/content/widgets/number.mdx`:
- Around line 34-36: Update the number widget documentation near the description
of `min()` and `max()` so it also states that declaring `step()` enables Up/Down
adjustment. Clarify that `step()` alone does not impose clamping, which applies
only when a range is configured.

In `@docs/content/widgets/password.mdx`:
- Around line 19-22: Update the password example around the $p->password call to
use the canonical fruit-and-vegetable field name and label from
.claude/demo_content_reference.md instead of `code` and `Order code`, while
preserving the revealable and confirmation modifiers.

In `@playground/3-widgets/show.php`:
- Around line 53-91: Replace repeated produce-related string literals with the
shared backed enum cases and values across playground/3-widgets/show.php lines
53-91, playground/10-field-styles/run.php lines 44-47,
playground/9-bordered-panels/run.php lines 38-55, and
docs/util/render-widget-svgs.php lines 108-144. Use enum cases for selection,
toggle, delivery-method, and bag-size options and defaults; in
render-widget-svgs.php, pass enum values while retaining the raw widget stem
keys.
- Line 51: Update the TextareaWidget argument in the widget configuration to use
a single-quoted multiline string literal, preserving the existing text and
newline while avoiding double quotes.

---

Duplicate comments:
In `@playground/0-minimal/run.php`:
- Line 11: Update the usage example in the run.php documentation comment to use
the canonical produce-themed prompts value, including both “name” set to “Weekly
Box” and “fruit” set to “apple”.
- Around line 28-31: Replace duplicated string literals for closed option sets
with enums and use enum cases throughout the examples, converting to scalar
values only at rendering or serialization boundaries. Apply this to
playground/0-minimal/run.php lines 28-31 for fruit;
playground/0-quickstart/run.php lines 32-42 for fruit and vegetables;
playground/10-builtin-themes/run.php lines 47-57 for grades and extras;
playground/3-widgets/widget-select-groups.php lines 32-35 and 37-37 using the
same fruit enum, including disabled rhubarb;
playground/3-widgets/widget-select.php lines 30-33 for fruit;
playground/3-widgets/widget-suggest.php lines 30-35 for fruit; and
playground/7-theme-options/run.php lines 38-46 for box sizes and extras.
🪄 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: 565cab46-6e70-477f-a388-36c88e01f062

📥 Commits

Reviewing files that changed from the base of the PR and between 60a2e38 and b988360.

⛔ Files ignored due to path filters (291)
  • docs/assets/bordered-panels-dark-animated.svg is excluded by !**/*.svg
  • docs/assets/bordered-panels-light-animated.svg is excluded by !**/*.svg
  • docs/assets/borderless-panels-dark-animated.svg is excluded by !**/*.svg
  • docs/assets/borderless-panels-light-animated.svg is excluded by !**/*.svg
  • docs/assets/discovery-dark-static.svg is excluded by !**/*.svg
  • docs/assets/discovery-light-static.svg is excluded by !**/*.svg
  • docs/assets/nested-panels-dark-animated.svg is excluded by !**/*.svg
  • docs/assets/nested-panels-light-animated.svg is excluded by !**/*.svg
  • docs/assets/quickstart-dark-static.svg is excluded by !**/*.svg
  • docs/assets/quickstart-light-static.svg is excluded by !**/*.svg
  • docs/assets/scaffolder-dark-animated-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/scaffolder-dark-animated-ascii.svg is excluded by !**/*.svg
  • docs/assets/scaffolder-dark-animated-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/scaffolder-dark-animated.svg is excluded by !**/*.svg
  • docs/assets/scaffolder-light-animated-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/scaffolder-light-animated-ascii.svg is excluded by !**/*.svg
  • docs/assets/scaffolder-light-animated-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/scaffolder-light-animated.svg is excluded by !**/*.svg
  • docs/assets/theme-dos.svg is excluded by !**/*.svg
  • docs/assets/theme-ember-light.svg is excluded by !**/*.svg
  • docs/assets/theme-ember.svg is excluded by !**/*.svg
  • docs/assets/theme-frost-light.svg is excluded by !**/*.svg
  • docs/assets/theme-frost.svg is excluded by !**/*.svg
  • docs/assets/theme-midnight-light.svg is excluded by !**/*.svg
  • docs/assets/theme-midnight.svg is excluded by !**/*.svg
  • docs/assets/theme-mono-light.svg is excluded by !**/*.svg
  • docs/assets/theme-mono.svg is excluded by !**/*.svg
  • docs/assets/widget-calendar-dark-animated-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-calendar-dark-animated-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-calendar-dark-animated-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-calendar-dark-animated.svg is excluded by !**/*.svg
  • docs/assets/widget-calendar-dark-static-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-calendar-dark-static-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-calendar-dark-static-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-calendar-dark-static.svg is excluded by !**/*.svg
  • docs/assets/widget-calendar-light-animated-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-calendar-light-animated-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-calendar-light-animated-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-calendar-light-animated.svg is excluded by !**/*.svg
  • docs/assets/widget-calendar-light-static-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-calendar-light-static-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-calendar-light-static-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-calendar-light-static.svg is excluded by !**/*.svg
  • docs/assets/widget-confirm-dark-animated-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-confirm-dark-animated-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-confirm-dark-animated-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-confirm-dark-animated.svg is excluded by !**/*.svg
  • docs/assets/widget-confirm-dark-static-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-confirm-dark-static-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-confirm-dark-static-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-confirm-dark-static.svg is excluded by !**/*.svg
  • docs/assets/widget-confirm-light-animated-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-confirm-light-animated-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-confirm-light-animated-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-confirm-light-animated.svg is excluded by !**/*.svg
  • docs/assets/widget-confirm-light-static-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-confirm-light-static-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-confirm-light-static-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-confirm-light-static.svg is excluded by !**/*.svg
  • docs/assets/widget-filepicker-dark-animated-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-filepicker-dark-animated-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-filepicker-dark-animated-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-filepicker-dark-animated.svg is excluded by !**/*.svg
  • docs/assets/widget-filepicker-dark-static-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-filepicker-dark-static-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-filepicker-dark-static-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-filepicker-dark-static.svg is excluded by !**/*.svg
  • docs/assets/widget-filepicker-light-animated-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-filepicker-light-animated-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-filepicker-light-animated-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-filepicker-light-animated.svg is excluded by !**/*.svg
  • docs/assets/widget-filepicker-light-static-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-filepicker-light-static-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-filepicker-light-static-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-filepicker-light-static.svg is excluded by !**/*.svg
  • docs/assets/widget-multifilepicker-dark-animated-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-multifilepicker-dark-animated-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-multifilepicker-dark-animated-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-multifilepicker-dark-animated.svg is excluded by !**/*.svg
  • docs/assets/widget-multifilepicker-dark-static-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-multifilepicker-dark-static-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-multifilepicker-dark-static-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-multifilepicker-dark-static.svg is excluded by !**/*.svg
  • docs/assets/widget-multifilepicker-light-animated-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-multifilepicker-light-animated-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-multifilepicker-light-animated-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-multifilepicker-light-animated.svg is excluded by !**/*.svg
  • docs/assets/widget-multifilepicker-light-static-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-multifilepicker-light-static-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-multifilepicker-light-static-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-multifilepicker-light-static.svg is excluded by !**/*.svg
  • docs/assets/widget-multisearch-dark-animated-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-multisearch-dark-animated-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-multisearch-dark-animated-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-multisearch-dark-animated.svg is excluded by !**/*.svg
  • docs/assets/widget-multisearch-dark-static-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-multisearch-dark-static-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-multisearch-dark-static-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-multisearch-dark-static.svg is excluded by !**/*.svg
  • docs/assets/widget-multisearch-light-animated-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-multisearch-light-animated-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-multisearch-light-animated-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-multisearch-light-animated.svg is excluded by !**/*.svg
  • docs/assets/widget-multisearch-light-static-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-multisearch-light-static-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-multisearch-light-static-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-multisearch-light-static.svg is excluded by !**/*.svg
  • docs/assets/widget-multiselect-dark-animated-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-multiselect-dark-animated-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-multiselect-dark-animated-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-multiselect-dark-animated.svg is excluded by !**/*.svg
  • docs/assets/widget-multiselect-dark-static-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-multiselect-dark-static-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-multiselect-dark-static-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-multiselect-dark-static.svg is excluded by !**/*.svg
  • docs/assets/widget-multiselect-groups-dark-static-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-multiselect-groups-dark-static-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-multiselect-groups-dark-static-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-multiselect-groups-dark-static.svg is excluded by !**/*.svg
  • docs/assets/widget-multiselect-groups-light-static-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-multiselect-groups-light-static-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-multiselect-groups-light-static-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-multiselect-groups-light-static.svg is excluded by !**/*.svg
  • docs/assets/widget-multiselect-light-animated-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-multiselect-light-animated-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-multiselect-light-animated-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-multiselect-light-animated.svg is excluded by !**/*.svg
  • docs/assets/widget-multiselect-light-static-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-multiselect-light-static-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-multiselect-light-static-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-multiselect-light-static.svg is excluded by !**/*.svg
  • docs/assets/widget-number-dark-animated-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-number-dark-animated-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-number-dark-animated-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-number-dark-animated.svg is excluded by !**/*.svg
  • docs/assets/widget-number-dark-static-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-number-dark-static-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-number-dark-static-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-number-dark-static.svg is excluded by !**/*.svg
  • docs/assets/widget-number-light-animated-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-number-light-animated-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-number-light-animated-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-number-light-animated.svg is excluded by !**/*.svg
  • docs/assets/widget-number-light-static-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-number-light-static-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-number-light-static-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-number-light-static.svg is excluded by !**/*.svg
  • docs/assets/widget-password-dark-animated-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-password-dark-animated-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-password-dark-animated-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-password-dark-animated.svg is excluded by !**/*.svg
  • docs/assets/widget-password-dark-static-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-password-dark-static-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-password-dark-static-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-password-dark-static.svg is excluded by !**/*.svg
  • docs/assets/widget-password-light-animated-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-password-light-animated-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-password-light-animated-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-password-light-animated.svg is excluded by !**/*.svg
  • docs/assets/widget-password-light-static-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-password-light-static-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-password-light-static-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-password-light-static.svg is excluded by !**/*.svg
  • docs/assets/widget-password-reveal-dark-static.svg is excluded by !**/*.svg
  • docs/assets/widget-password-reveal-light-static.svg is excluded by !**/*.svg
  • docs/assets/widget-reorder-dark-animated-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-reorder-dark-animated-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-reorder-dark-animated-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-reorder-dark-animated.svg is excluded by !**/*.svg
  • docs/assets/widget-reorder-dark-static-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-reorder-dark-static-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-reorder-dark-static-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-reorder-dark-static.svg is excluded by !**/*.svg
  • docs/assets/widget-reorder-light-animated-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-reorder-light-animated-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-reorder-light-animated-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-reorder-light-animated.svg is excluded by !**/*.svg
  • docs/assets/widget-reorder-light-static-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-reorder-light-static-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-reorder-light-static-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-reorder-light-static.svg is excluded by !**/*.svg
  • docs/assets/widget-search-dark-animated-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-search-dark-animated-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-search-dark-animated-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-search-dark-animated.svg is excluded by !**/*.svg
  • docs/assets/widget-search-dark-static-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-search-dark-static-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-search-dark-static-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-search-dark-static.svg is excluded by !**/*.svg
  • docs/assets/widget-search-light-animated-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-search-light-animated-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-search-light-animated-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-search-light-animated.svg is excluded by !**/*.svg
  • docs/assets/widget-search-light-static-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-search-light-static-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-search-light-static-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-search-light-static.svg is excluded by !**/*.svg
  • docs/assets/widget-select-dark-animated-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-select-dark-animated-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-select-dark-animated-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-select-dark-animated.svg is excluded by !**/*.svg
  • docs/assets/widget-select-dark-static-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-select-dark-static-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-select-dark-static-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-select-dark-static.svg is excluded by !**/*.svg
  • docs/assets/widget-select-groups-dark-static-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-select-groups-dark-static-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-select-groups-dark-static-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-select-groups-dark-static.svg is excluded by !**/*.svg
  • docs/assets/widget-select-groups-light-static-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-select-groups-light-static-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-select-groups-light-static-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-select-groups-light-static.svg is excluded by !**/*.svg
  • docs/assets/widget-select-light-animated-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-select-light-animated-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-select-light-animated-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-select-light-animated.svg is excluded by !**/*.svg
  • docs/assets/widget-select-light-static-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-select-light-static-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-select-light-static-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-select-light-static.svg is excluded by !**/*.svg
  • docs/assets/widget-suggest-dark-animated-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-suggest-dark-animated-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-suggest-dark-animated-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-suggest-dark-animated.svg is excluded by !**/*.svg
  • docs/assets/widget-suggest-dark-static-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-suggest-dark-static-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-suggest-dark-static-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-suggest-dark-static.svg is excluded by !**/*.svg
  • docs/assets/widget-suggest-light-animated-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-suggest-light-animated-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-suggest-light-animated-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-suggest-light-animated.svg is excluded by !**/*.svg
  • docs/assets/widget-suggest-light-static-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-suggest-light-static-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-suggest-light-static-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-suggest-light-static.svg is excluded by !**/*.svg
  • docs/assets/widget-text-dark-animated-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-text-dark-animated-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-text-dark-animated-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-text-dark-animated.svg is excluded by !**/*.svg
  • docs/assets/widget-text-dark-static-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-text-dark-static-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-text-dark-static-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-text-dark-static.svg is excluded by !**/*.svg
  • docs/assets/widget-text-light-animated-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-text-light-animated-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-text-light-animated-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-text-light-animated.svg is excluded by !**/*.svg
  • docs/assets/widget-text-light-static-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-text-light-static-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-text-light-static-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-text-light-static.svg is excluded by !**/*.svg
  • docs/assets/widget-textarea-dark-animated-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-textarea-dark-animated-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-textarea-dark-animated-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-textarea-dark-animated.svg is excluded by !**/*.svg
  • docs/assets/widget-textarea-dark-static-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-textarea-dark-static-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-textarea-dark-static-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-textarea-dark-static.svg is excluded by !**/*.svg
  • docs/assets/widget-textarea-light-animated-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-textarea-light-animated-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-textarea-light-animated-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-textarea-light-animated.svg is excluded by !**/*.svg
  • docs/assets/widget-textarea-light-static-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-textarea-light-static-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-textarea-light-static-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-textarea-light-static.svg is excluded by !**/*.svg
  • docs/assets/widget-toggle-dark-animated-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-toggle-dark-animated-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-toggle-dark-animated-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-toggle-dark-animated.svg is excluded by !**/*.svg
  • docs/assets/widget-toggle-dark-static-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-toggle-dark-static-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-toggle-dark-static-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-toggle-dark-static.svg is excluded by !**/*.svg
  • docs/assets/widget-toggle-light-animated-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-toggle-light-animated-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-toggle-light-animated-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-toggle-light-animated.svg is excluded by !**/*.svg
  • docs/assets/widget-toggle-light-static-ascii-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-toggle-light-static-ascii.svg is excluded by !**/*.svg
  • docs/assets/widget-toggle-light-static-no-ansi.svg is excluded by !**/*.svg
  • docs/assets/widget-toggle-light-static.svg is excluded by !**/*.svg
  • docs/static/img/logo.svg is excluded by !**/*.svg
  • playground/3-widgets/filepicker-tree/baskets/apples.csv is excluded by !**/*.csv
  • playground/3-widgets/filepicker-tree/baskets/pears.csv is excluded by !**/*.csv
  • playground/3-widgets/filepicker-tree/deliveries/monday.log is excluded by !**/*.log
  • playground/3-widgets/filepicker-tree/harvest.csv is excluded by !**/*.csv
  • playground/5-discovery/sample/harvest.csv is excluded by !**/*.csv
📒 Files selected for processing (73)
  • .claude/demo_content_reference.md
  • AGENTS.md
  • README.md
  • docs/content/architecture.mdx
  • docs/content/configuration.mdx
  • docs/content/discovery.mdx
  • docs/content/field-behaviour.mdx
  • docs/content/index.mdx
  • docs/content/installation.mdx
  • docs/content/panels.mdx
  • docs/content/widgets/_category_.json
  • docs/content/widgets/calendar.mdx
  • docs/content/widgets/confirm.mdx
  • docs/content/widgets/filepicker.mdx
  • docs/content/widgets/multifilepicker.mdx
  • docs/content/widgets/multisearch.mdx
  • docs/content/widgets/multiselect.mdx
  • docs/content/widgets/number.mdx
  • docs/content/widgets/option-groups.mdx
  • docs/content/widgets/password.mdx
  • docs/content/widgets/pause.mdx
  • docs/content/widgets/reorder.mdx
  • docs/content/widgets/search.mdx
  • docs/content/widgets/select.mdx
  • docs/content/widgets/suggest.mdx
  • docs/content/widgets/text.mdx
  • docs/content/widgets/textarea.mdx
  • docs/content/widgets/toggle.mdx
  • docs/docusaurus.config.js
  • docs/sidebars.js
  • docs/util/make-light-svgs.php
  • docs/util/render-widget-svgs.php
  • docs/util/update-assets.php
  • playground/0-minimal/run.php
  • playground/0-quickstart/run.php
  • playground/1-scaffolder/run.php
  • playground/10-builtin-themes/run.php
  • playground/10-field-styles/run.php
  • playground/3-widgets/filepicker-tree/README.md
  • playground/3-widgets/filepicker-tree/composer.json
  • playground/3-widgets/filepicker-tree/config/app.yml
  • playground/3-widgets/filepicker-tree/config/services.yml
  • playground/3-widgets/filepicker-tree/pantry.yaml
  • playground/3-widgets/filepicker-tree/src/Kernel.php
  • playground/3-widgets/show.php
  • playground/3-widgets/widget-filepicker.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-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/5-discovery/run.php
  • playground/5-discovery/sample/.env
  • playground/5-discovery/sample/baskets/apples/.gitkeep
  • playground/5-discovery/sample/baskets/pears/.gitkeep
  • playground/5-discovery/sample/box.json
  • playground/5-discovery/sample/composer.json
  • playground/5-discovery/sample/docker-compose.yml
  • playground/5-discovery/sample/modules/alpha/.gitkeep
  • playground/5-discovery/sample/modules/beta/.gitkeep
  • playground/7-theme-options/run.php
  • playground/9-bordered-panels/run.php
💤 Files with no reviewable changes (9)
  • docs/content/widgets/category.json
  • playground/3-widgets/filepicker-tree/config/services.yml
  • playground/5-discovery/sample/modules/alpha/.gitkeep
  • playground/5-discovery/sample/modules/beta/.gitkeep
  • playground/3-widgets/filepicker-tree/src/Kernel.php
  • playground/3-widgets/filepicker-tree/config/app.yml
  • playground/5-discovery/sample/composer.json
  • playground/5-discovery/sample/docker-compose.yml
  • playground/3-widgets/filepicker-tree/composer.json

Comment thread docs/content/configuration.mdx Outdated
Comment thread docs/content/widgets/multisearch.mdx
Comment thread docs/content/widgets/number.mdx Outdated
Comment thread docs/content/widgets/password.mdx
Comment thread playground/3-widgets/show.php Outdated
Comment thread playground/3-widgets/show.php
…ess.

Renamed leftover panel ids to produce identifiers, replaced non-produce prompt data, guarded a completion example against an unanswered field, pointed the conditional-fields example at declared fields, set the canonical calendar default, added 'Melon' to the vocabulary to match the password default, noted that 'step()' also enables Up/Down adjustment, corrected 'multiSelect()' casing, and unified the textarea default to a single-quoted expression.
@github-actions

Copy link
Copy Markdown
Code Coverage Report:
  2026-07-16 05:12:04

 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)

@codecov

codecov Bot commented Jul 16, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 97.48%. Comparing base (5e692c9) to head (b440f2e).
✅ All tests successful. No failed tests found.

Additional details and impacted files
@@           Coverage Diff           @@
##             main      #59   +/-   ##
=======================================
  Coverage   97.48%   97.48%           
=======================================
  Files          97       97           
  Lines        2858     2858           
=======================================
  Hits         2786     2786           
  Misses         72       72           

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

@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.

Caution

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

⚠️ Outside diff range comments (1)
docs/content/widgets/text.mdx (1)

18-23: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Do not declare item twice in the same example.

The code block creates two fields with the same identifier. Combine the default and completion configuration into one builder call, or clearly separate the snippets as alternatives.

Proposed fix
 $p->text('item', 'Item')
-  ->default('Pear'); // Initial value.
-
-// Inline ghost-text autocomplete over a static candidate list:
-$p->text('item', 'Item')
+  ->default('Pear')
   ->complete(['Pear', 'Peach', 'Plum']);
🤖 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/widgets/text.mdx` around lines 18 - 23, Update the example
containing the text builder so the identifier item is declared only once:
combine the default('Pear') and complete(['Pear', 'Peach', 'Plum'])
configuration in a single $p->text('item', 'Item') chain, or clearly mark the
two declarations as separate alternatives.
🤖 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.

Outside diff comments:
In `@docs/content/widgets/text.mdx`:
- Around line 18-23: Update the example containing the text builder so the
identifier item is declared only once: combine the default('Pear') and
complete(['Pear', 'Peach', 'Plum']) configuration in a single $p->text('item',
'Item') chain, or clearly mark the two declarations as separate alternatives.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: e2fa78f4-c720-41c8-a876-08d2e0296716

📥 Commits

Reviewing files that changed from the base of the PR and between b988360 and b440f2e.

📒 Files selected for processing (14)
  • .claude/demo_content_reference.md
  • docs/content/configuration.mdx
  • docs/content/panels.mdx
  • docs/content/widgets/number.mdx
  • docs/content/widgets/text.mdx
  • docs/util/render-widget-svgs.php
  • playground/0-minimal/run.php
  • playground/1-scaffolder/run.php
  • playground/10-builtin-themes/run.php
  • playground/3-widgets/show.php
  • playground/3-widgets/widget-textarea.php
  • playground/3-widgets/widgets.php
  • playground/4-nested-panels/run.php
  • playground/5-discovery/run.php

@AlexSkrypnyk
AlexSkrypnyk merged commit 8e365ff into main Jul 16, 2026
10 checks passed
@AlexSkrypnyk
AlexSkrypnyk deleted the feature/docs-restructure branch July 16, 2026 06:05
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