You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
New major of the Blade form components. Drop material-admin and Bootstrap 5.3, add Bootstrap 6 and Onu (same Tailwind styles as Onu), reach feature parity with @javaabu/forms, and ship frontend assets through javaabu/manifest.
Built to the next-gen general rules: CI with test and coverage badges, full docs for people and agents, Laravel Boost guideline and skill, Javaabu codestyle, PHP 8.4 / Laravel 12+ (Laravel packages) or TypeScript (JS packages), Dhivehi and RTL, Blade and Inertia React for views, overridable controllers and policies with javaabu/permissions.
All work is on the next-gen branch (created from main, which stays on 1.x). At the end there will be one PR, next-gen → main, left for the user to merge.
Architecture
Same component API as v1.<x-forms::…> names, attributes, model binding (@model/<x-forms::form :model>), old input, error display and generated ids/labels stay as they are. All PHP logic stays in src/Views/Components, and each framework is only a view folder: forms::{framework}.{view}.
Frameworks:bootstrap-6 (targets 6.0.0-alpha.1, e.g. Modal → Dialog, .check/.radio/.switch, .btn-solid.theme-*) and onu. bootstrap-5 and material-admin-26 are removed and noted in docs/upgrading.md. Per-framework settings stay in forms.frameworks.*.
Onu framework: Blade views output the same markup as @javaabu/onu primitives (data-slots and the same Tailwind class strings), so Blade and React pages look identical. The design tokens and theme come from @javaabu/onu/tailwind.css; nothing is copied. Apps add one import, @import "…/vendor/javaabu/forms/resources/css/onu.css", which @sources the Blade views. A sync script plus a CI check keeps the class strings matched to the onu version we target.
Icons: one <x-forms::icon> that renders inline SVG (the lucide names onu uses), so no icon font is required. Each framework can map icons to font classes instead.
JS (resources/js, TypeScript, no jQuery): ports the js-utilities behaviours the components rely on: conditional display (same data-enable-* attributes), date pickers, enhanced selects (ajax, cascades, tags; Tom Select instead of Select2/jQuery), file upload previews, wysiwyg and maps. Strings go through @javaabu/i18n. It is built with Vite into a committed dist/, so apps without a JS build still work.
Assets seam: a component declares what it needs (forms::select, forms::dates, …) through a small Javaabu\Forms\Assets\AssetLoader contract. Until javaabu/manifest's API is on its main, the default implementation renders tags once via @formsScripts/@formsStyles (or pushes them to forms.scripts_stack). Once the API lands, I'll switch the default to manifest's registration and auto-injection.
Everything is on next-gen, with CI green on the full matrix (PHP 8.4/8.5 × Laravel 12/13 × lowest/stable, plus Pint and Assets). PR: #16 (open, not merged). Every next-gen issue is closed except #14 (needs a human).
Built
Frameworks:
onu (the default) uses Onu's markup and classes, generated from @javaabu/onu's own components and checked in CI.
bootstrap-6 targets 6.0.0-alpha.1.
Views shared by both frameworks live in forms::common; custom frameworks register with Frameworks::register().
Assets: TypeScript (no jQuery) replaces js-utilities and loads through javaabu/manifest. Each component declares what it needs. The prebuilt dist/ is committed, and the alias is @javaabu/forms-blade.
Tests: 389 PHPUnit and 151 Vitest tests, including a smoke test that renders every fixture with every framework, plus Dhivehi/Thaana and manifest injection tests.
Docs and Dhivehi: Docusaurus docs, llms.txt, AGENTS.md, the Boost guideline and skill (with a generated attribute reference), and Dhivehi for every string.
Bug fixes: a docs pass found 30 code issues and the real ones are fixed: textarea escaping, binding leaks, radio checking, positional arguments, date formats, no-bulk and more.
Intentionally out of scope
Not ported from js-utilities, because no v2 view uses them:data-select-children, data-toggle-hide, .select2-b-image, and the drag-and-drop sortable. The map selector also stays app-side, as in v1; only the Google Maps loader ships.
No floating labels in Onu: Onu has none, so floating renders a normal label.
TinyMCE isn't bundled: apps host it, and forms.wysiwyg.tinymce_url sets where it loads from.
For the user
Dhivehi review: check the lines listed in docs/advanced-usage/translations-and-rtl.md.
Codecov: set CODECOV_TOKEN (org secret) so the coverage upload and badge work.
Activity
n4ff4h commentedon Nov 4, 2026
Implementation plan (package agent)
All work is on the
next-genbranch (created frommain, which stays on 1.x). At the end there will be one PR,next-gen→main, left for the user to merge.Architecture
<x-forms::…>names, attributes, model binding (@model/<x-forms::form :model>), old input, error display and generated ids/labels stay as they are. All PHP logic stays insrc/Views/Components, and each framework is only a view folder:forms::{framework}.{view}.bootstrap-6(targets6.0.0-alpha.1, e.g. Modal → Dialog,.check/.radio/.switch,.btn-solid.theme-*) andonu.bootstrap-5andmaterial-admin-26are removed and noted indocs/upgrading.md. Per-framework settings stay informs.frameworks.*.@javaabu/onuprimitives (data-slots and the same Tailwind class strings), so Blade and React pages look identical. The design tokens and theme come from@javaabu/onu/tailwind.css; nothing is copied. Apps add one import,@import "…/vendor/javaabu/forms/resources/css/onu.css", which@sources the Blade views. A sync script plus a CI check keeps the class strings matched to the onu version we target.<x-forms::icon>that renders inline SVG (the lucide names onu uses), so no icon font is required. Each framework can map icons to font classes instead.resources/js, TypeScript, no jQuery): ports the js-utilities behaviours the components rely on: conditional display (samedata-enable-*attributes), date pickers, enhanced selects (ajax, cascades, tags; Tom Select instead of Select2/jQuery), file upload previews, wysiwyg and maps. Strings go through@javaabu/i18n. It is built with Vite into a committeddist/, so apps without a JS build still work.forms::select,forms::dates, …) through a smallJavaabu\Forms\Assets\AssetLoadercontract. Until javaabu/manifest's API is on itsmain, the default implementation renders tags once via@formsScripts/@formsStyles(or pushes them toforms.scripts_stack). Once the API lands, I'll switch the default to manifest's registration and auto-injection.Public API sketch
config('forms.framework')selectsonu|bootstrap-6, and any component acceptsframework="…"to override it.Order of work
dev-next-gen→2.x-dev, Pint with Javaabu style, the CI matrix onnext-genand PRs, Codecov, badges@javaabu/formsplusdocs/parity.md(anything new in React's API gets added here)llms.txt, AGENTS.md, upgrading guide; Laravel Boost guideline and skill #12 Boost guideline and skillmainOpen questions / decisions taken (shout if you disagree)
onu, because it's the shared design system for Blade and React.bootstrap-6is opt-in while Bootstrap 6 is still in alpha.data-*attribute API stays the same. Select2's ownselect2-*CSS classes go away.dist/for the package JS and CSS until javaabu/manifest can build package assets for apps.n4ff4h commentedon Nov 4, 2026
Final summary
Everything is on
next-gen, with CI green on the full matrix (PHP 8.4/8.5 × Laravel 12/13 × lowest/stable, plus Pint and Assets). PR: #16 (open, not merged). Everynext-genissue is closed except #14 (needs a human).Built
onu(the default) uses Onu's markup and classes, generated from@javaabu/onu's own components and checked in CI.bootstrap-6targets 6.0.0-alpha.1.forms::common; custom frameworks register withFrameworks::register().@javaabu/formscomponents and attributes exist in Blade, pluserror-summary,pagination,formatted-valueandicon. The matrix (docs/parity.md) is agreed with react-forms in Parity with javaabu/forms v2: defaults, Blade-only attributes and string keys react-forms#18.dist/is committed, and the alias is@javaabu/forms-blade.llms.txt,AGENTS.md, the Boost guideline and skill (with a generated attribute reference), and Dhivehi for every string.no-bulkand more.Intentionally out of scope
data-select-children,data-toggle-hide,.select2-b-image, and the drag-and-drop sortable. The map selector also stays app-side, as in v1; only the Google Maps loader ships.floatingrenders a normal label.forms.wysiwyg.tinymce_urlsets where it loads from.For the user
docs/advanced-usage/translations-and-rtl.md.CODECOV_TOKEN(org secret) so the coverage upload and badge work.composer.jsonfrom the VCS repository to^1.0. Then merge javaabu/forms v2.0: Onu and Bootstrap 6, parity with @javaabu/forms, assets via manifest #16 and tag v2.0.0.@javaabu/i18ncan't be installed from GitHub yet (nopreparescript; I opened Add a prepare script so GitHub installs (github:Javaabu/i18n#main) get dist/ i18n#3, without labels because that repo has nonext-gen/cross-packagelabels). The JS uses a temporary local__()until it's fixed or published.n4ff4h commentedon Nov 4, 2026
Follow-ups done on
next-gen(PR #16 updates itself; CI green on 3cf84cd):javaabu/helpers, and with itjavaabu/settings^1.7, is no longer required. File types ship inSupport\MimeTypes, and helpers is still used when an app has it. A CI guard fails if either package appears in the production dependency tree. Documented indocs/upgrading.md.<x-forms::table no-bulk>renders the table. The bulk form also respects the slot'smethodnow.format_file_size(); a regression test covers it.