tipowerup/ti-theme-toolkit
Shared PHP and frontend infrastructure for TastyIgniter themes: extend one service provider to inherit color palettes, form widgets, Livewire auth/contact/newsletter components, dark mode, and a curated field schema.
What it actually is. Not a general-purpose library — it is the extracted, shared backbone of one vendor's TastyIgniter theme portfolio. The value proposition is real but narrow: collapse "new theme from scratch" into ~50 lines of PHP plus a Tailwind/Vite config. If your roadmap contains one TastyIgniter theme, this package is overhead. If it contains three or more, the abstraction pays for itself in the field schema, color derivation, and auth Livewire components alone.
Architecture fit. The design is sound where it counts: AbstractThemeServiceProvider is the single integration seam, and everything else (views, translations, Livewire, Blade components, routes, view-composer payload, error views, asset publishing) hangs off template methods a child theme overrides. ThemePayloadResolver → ColorHelper → buildBrandStyle() → CSS custom properties → Tailwind utilities is a clean server-rendered theming model that avoids a build step per color change, which is the correct trade for an admin-editable storefront. The Livewire-in-toolkit pattern (shared business logic, theme-owned Blade views, last-writer-wins override) is a well-chosen inversion — themes customize presentation without forking auth flows.
Integration feasibility. Low-to-moderate. The PHP side is a composer require plus one class; the friction sits in the JS toolchain, where the package demands Node 18+, Vite, Tailwind, Alpine, and an asset publish step (igniter:theme-vendor-publish) that must run on activation and in CI. That is a build-infrastructure dependency, not just a code dependency — it changes your deployment pipeline, not only your composer.json.
Material technical risks.
tailwind-preset.js and resources/src/css/tokens.css. Changelog 0.3.0 explicitly removed both ("Removed: tailwind-preset.js… resources/src/css/tokens.css — superseded by theme.css"). The stated requirements (Tailwind 3.0+, Vite 5.0+) also contradict a v4/@tailwindcss/vite reality. A developer following the README verbatim will produce a broken build. Any adoption must treat source and changelogs as the spec, not the README.0.x means every minor is a potential migration. Pin exact versions; budget upgrade work.view.paths, asset publishing, menu-item listeners, container bindings, Livewire registration. 0.6.2's fix for registerStorefrontErrorViews() unshifting onto config('view.paths') unconditionally — meaning the last-booted toolkit theme won the 404/500 resolution — is exactly the failure class you inherit. The bug was found and fixed quickly, which is reassuring, but the pattern recurs across 0.4–0.6.registerStaticPageResolverPatch() corrects a ti-ext-pages bug and is marked TODO: remove once #21 is merged. This is a silent-conflict risk on TI upgrades and a permanent item on your dependency-review checklist.Key questions to answer before committing.
package.json and vite-preset.js, not the README..d.ts companions (no build step) are a genuine differentiator versus hand-rolling this in-house.0.x churn, or do we need to vendor a pinned snapshot?Stack fit. Narrow and deep: PHP 8.2+, TastyIgniter 4.0+, Livewire 3, Node 18+, Alpine 3. It is not a general Laravel package and should never be evaluated as one — it presumes TI's theme customizer, themes.data column, and igniter:* artisan commands exist. Confirm your TI version and your Livewire major against the toolkit's constraints before any design work; a Livewire 4 migration anywhere in your plan invalidates it.
Recommended posture: treat as an internal platform dependency, not a community package. Concretely:
"tipowerup/ti-theme-toolkit": "0.6.2"), per the package's own guidance.path repository) so you control the upgrade clock. The MIT license makes this frictionless, and the JS side already supports file: protocol for monorepo work.Migration path for an existing theme. Do not do a big-bang port. Sequence:
npm install && npm run build and igniter:theme-vendor-publish --force produce working assets on your CI image. This is the single highest-value de-risking step and will surface the Tailwind v4 documentation gap immediately.AbstractThemeServiceProvider + BaseSchema + ColorHelper, leave the theme's own Livewire components in place. This isolates the schema/color abstraction from the Livewire auto-loader.registerStorefrontErrorViews, registerAutoVendorPublish, static-page resolver patch) last, and explicitly test each: trigger a 404 with two toolkit themes installed, activate a theme and verify assets publish, and check static-page menu items resolve to the correct page.Compatibility sequencing. Upgrades to TastyIgniter, Livewire, Tailwind, or Vite each become a three-way coordination problem: core → toolkit → every theme. Establish a rule now: upgrade the toolkit first in a branch, run one theme against it, then the rest. Keep the upstream static-page patch on the watch list so you can drop it the moment tastyigniter/ti-ext-pages#21 merges.
Maintenance burden is the dominant cost, and it is front-loaded. The package itself is small and readable; the maintenance burden is the interface contract — field schema keys, CSS variable names, Livewire component paths, build presets. Those are the things that break, and they break in minor versions. Budget an owner (even part-time) and a per-upgrade checklist: build passes → colors render light and dark → auth forms submit → error pages render → static assets present after activation.
Support model. There is none external. Zero stars and zero dependents means no Stack Overflow answers, no issue-tracker history to mine, and no third-party blog posts. Docs are genuinely comprehensive (docs/service-provider.md, fields-schema.md, color-system.md, form-widgets/banner-manager.md, dark-mode.md, tailwind-preset.md, vite-preset.md, migration guide) — unusually good for a package this young — but the README drift proves they are not continuously verified. Your support plan is "read the source," which is feasible here because the codebase is compact.
Scaling characteristics. Runtime cost is trivial: one theme-data read plus palette derivation per request, CSS variables on <html>, static assets. The scaling risk is operational, not throughput — it's portfolio scaling. Every additional toolkit theme adds another consumer of a global-state-mutating package, and the 0.6.2 error-view bug is the template: two themes, one shared view.paths array, last boot wins. Verify whether ThemePayloadResolver caches the resolved payload; if not, add a request-scoped cache before traffic justifies it.
Failure modes to instrument.
registerAutoVendorPublish() wraps the artisan call in try/catch and logs a warning. A missing favicon or fallback logo will surface as a cosmetic bug weeks later. Alert on the log line.ThemeManager::getActiveThemeCode() matches, but confirm this holds with your exact install and multi-theme setup.localStorage + html.dark toggle is client-side by nature; expect FOUC unless you inline an early blocking script. Test on first paint, not just after hydration.ti-ext-pages#21 merges, the in-tree resolver becomes a redundant listener. Remove promptly.phpNamespace() deriving itself from the child SP is convenient and opaque; override it explicitly in every theme so a future refactor doesn't silently break class resolution.Ramp-up. A competent Laravel/PHP developer reaches productive in roughly a day on the PHP side — one base class, one schema merge, one resolver. The real ramp-up cost is the frontend toolchain: Tailwind v4 @import model, @tailwindcss/vite, CSS-variable-driven color tokens, and Alpine store conventions. Estimate 2–3 days to full velocity for someone who has not touched this stack, and expect the README to actively mislead them until it's corrected. Write an internal "start here" doc that supersedes the README quickstart, and link the changelogs from it.
Verdict. A well-factored, clearly-authored portfolio accelerator with a real but bounded niche. Adopt it if you are committed to TastyIgniter 4 for multiple themes and can own a fork; avoid it for a single theme, for any team unwilling to pin exact versions, or where the frontend toolchain is already settled against Tailwind v4. The score of 15.5 and zero dependents reflect immaturity and lack of external validation, not poor engineering — the changelog discipline, typed .d.ts companions, and upstream-bug patch all signal a maintainer who cares. The correct TPM move is not "adopt the package" but "adopt the pattern," with the package as the reference implementation and your pinned fork as the artifact you actually depend on.
How can I help you explore Laravel packages today?