nowo-tech/ui-kit-bundle
nowo-tech/ui-kit-bundle packages a reusable UI component library for Symfony/PHP apps, bundling Twig templates, styles, and frontend assets so teams can build consistent, maintainable interfaces faster with a shared design system. It centralizes common UI elements and reduces duplicated markup.
composer require nowo-tech/ui-kit-bundle, then confirm the bundle is registered in config/bundles.php (Flex auto-registers Symfony bundles; if you're on a legacy or non-Flex app, add it manually). The package targets PHP ≥ 8.1 and Symfony 6/7/8 — check those constraints against your host app before pulling it in.src/Resources/public. Install them with your normal pipeline (bin/console assets:install --symlink for the asset component, or the importmap/Encore equivalent documented in the README). Never edit the files in src/Resources/public — they're generated by the bundle's own asset build.bootstrap5, tailwind, foundation, custom, …). Set it to whatever your admin already uses before you write any markup. This is the single most consequential config choice: it determines the utility classes the macros emit.nowo-ui-* CSS layer (the semantic contract you can restyle),Import macros per template, don't globalize. Import the specific macro file you need at the top of each template and alias it. Per-file imports keep the dependency visible and avoid a global TwigExtension you'd have to unwind later.
Treat nowo-ui-* as the stable API, framework utilities as the volatile layer. Write your own app partials using the semantic classes (nowo-ui-*) and let the helper translate. If you switch from Bootstrap 5 to Tailwind in two years, your markup survives; if you hardcode d-flex/mt-3 everywhere, it doesn't.
Compose, don't fork. The intended pattern is: shared admin layout → table/listing partial → pagination macro + modal macro + tabs macro. Pass plain arrays or DTOs into the macros. If a macro's markup doesn't fit, override the template via Symfony's bundle-override convention or extend the class map — not by copying macro bodies into your app.
Use custom mode as the integration seam for a design system. When your host app has its own tokens/utility naming, map the helper to it rather than fighting Bootstrap-flavoured output. Keep that map in one config file so a rebrand is a diff, not a hunt.
Keep modals and tabs progressively enhanced. Preserve the ids, data-* hooks, and ARIA attributes the bundle's frontend expects. If you swap content in via Turbo/HTMX, re-run the bundle's initializer after the DOM swap instead of assuming it re-binds.
Stay consistent across Nowo bundles. The stated purpose is a canonical kit for Nowo Symfony bundles and host apps. If you maintain several, consume the macros from every bundle rather than re-implementing a table in each — that's where the package pays for itself.
Test at the render boundary. A small Twig render test asserting that a macro emits the expected nowo-ui-* classes (and the right framework utility for the configured mode) catches most upgrade breakage cheaply. Match the bundle's existing test style rather than introducing a new framework.
One framework mode per application. The helper is app-global. Multi-tenant or multi-brand setups should run separate kernels/apps, not try to flip the mode per request.
assets:install copies; after a bundle upgrade, re-run it (or use --symlink) and clear cache. Check the installed copy under public/bundles/… before debugging templates.bootstrap5 mode produces plausible-looking but inert classes.{% import %} fails, confirm the bundle is in bundles.php and run bin/console cache:clear before you go reading macro source.src/Resources/public or the bundled templates in place. Both are regenerated/overwritten. Extension points, in preference order: config (class map / framework mode) → Symfony template override → upstream PR.id. Render one modal per record with an id suffix, or one shared modal whose content you hydrate.nowo-ui-* hooks?UPGRADING/CHANGELOG before minor bumps. For a young, low-adoption bundle, backward-compatibility promises are best verified by reading the diff, not assumed.How can I help you explore Laravel packages today?