artisanpack-ui/ecommerce-storefront-livewire
ArtisanPack UI Ecommerce Storefront Livewire provides ready-to-use Livewire components for Laravel storefronts, including product listings, cart, checkout, and responsive UI. Integrate with your ecommerce backend to ship a polished shopping experience faster. Built for Laravel and Tailwind CSS.
The storefront is a Livewire satellite of the ArtisanPack UI ecommerce engine — it owns no tables, so treat the engine as a hard prerequisite rather than an optional companion.
1.1, Laravel 12 or 13, Livewire 3.6+ or 4, PHP 8.3+ with ext-intl enabled. Engine migrations, product types, and a payment gateway should already be in place — the storefront renders whatever the engine services return.composer require artisanpack-ui/ecommerce-storefront-livewire. Note the conflicts (artisanpack-ui/visual-editor below 1.8) and the security constraint (^1.0.3|^2.0) if you already depend on those.php artisan ecommerce-storefront:install. This is the single most important step: it publishes the config, prints the Tailwind @source lines and the layout include you must paste into your app, checks that your host app has login and register routes, and warns if no payment gateway is configured. Treat every line it prints as required setup, not a suggestion.config/storefront.php first, before touching views. The knobs you will reach for daily are the route prefixes, routes_enabled, the layout the page controller wraps screens in, account.middleware, account.claim_requires_verified_email, and storefront.rtl_locales.Route-first or component-first, decide per surface. The package ships full routes (configurable prefixes, killable via routes_enabled) where a page controller wraps each screen in your layout. Every screen is also a mountable Livewire component, so a common pattern is: keep the storefront routes for catalog, cart, and checkout, but disable or ignore them for account screens and mount the account components inside your existing dashboard. The standalone layout is fine for a weekend prototype; replace it with your app layout before launch so navigation, flash messages, and CSP nonces behave consistently.
Wire Tailwind before styling anything. The install command prints @source lines — those tell Tailwind 4 to scan the package's Blade views. Skip them and you get a storefront with no classes emitted and a very confusing debugging session.
Payments go through the driver registry, not through your views. Register a driver for Stripe Payment Element (3DS handled), or use the generic redirect driver for hosted pages. If you write your own gateway, implement the engine's RendersClientPayment contract and it plugs in with zero storefront changes. Card data never enters Livewire state by design — keep your integration in the browser-side Element flow and let the server only see tokens.
Checkout is composed, not forked. Pick wizard or single-page via config, then extend by registering satellite steps. A satellite step declares a server-side complete callable; unreachable steps are ignored server-side but every step is re-checked immediately before the order is placed. Write complete to be idempotent — it can be called on the "place order" pass after already succeeding on a webhook pass.
// Satellite step registration, conceptually:
// - declare the step + a server-side complete() callable
// - complete() must be safe to invoke more than once
// - the step's own validation is re-run before order placement
Bind CreatesCustomerAccounts when you need account creation to match your domain rules. The default never takes over an existing customer record for an unverified email; if your app already has a customers table with different semantics, swap the action rather than patching around it.
Extend through filters and actions, not view overrides. There are hooks for catalog filters and sorts, product sections, cart sections, checkout steps, and header actions, plus registries for purchase forms and payment drivers. Overriding a published Blade view is the last resort — it breaks on every minor release. Do use view publishing for the four editable templates the visual editor exposes (product, category, cart, checkout) and for your own layout.
Compose host pages from Blade components. x-artisanpack-ec-* covers price, price range, money, stock status, rating summary/input, address and address form, product card, gallery, swatches, quantity, category grid, search box, skeleton, empty state, account shell, and field. The field component is the one to standardize on for any custom form you build — it links a control's error and hint to the input, which is how you stay consistent with the package's error-summary behavior.
Add account navigation through AccountMenuRegistry rather than editing the account shell. This is how other satellites surface links, and it keeps your additions visible in every theme.
SEO: let the package own the storefront pages. Titles, descriptions, canonicals, Open Graph, and Product/BreadcrumbList JSON-LD are emitted for you; cart, checkout, account, and search are noindex. If artisanpack-ui/seo is installed, its schema collector prints the structured data instead — don't hand-roll a second set of tags or you'll ship duplicates.
Testing pattern: mirror the package's own Pest 4 + Playwright setup. For unit-level work, fake the engine services and the payment driver; for checkout flows, drive the real browser, because the one-time action token, the Element iframe, and focus management in the drawer are not meaningfully testable from Livewire component tests alone. Run an axe check on any screen you customize — the package does this on every screen, so a failure is almost always your override.
app.url is load-bearing. Order-view links and guest order lookup URLs are built from it. A wrong APP_URL in staging produces signed links pointing at production, and the failure looks like a broken signature, not a config error. Set it per environment.Cache-Control: no-store, private. If you front the storefront with full-page cache or a CDN rule that ignores origin headers, you will serve one shopper's cart to another. Exclude those paths explicitly and don't rely on the header alone.account.middleware groups re-run on Livewire updates. That is what makes them trustworthy for authorization, but it also means anything expensive or redirect-happy in those groups fires on every Livewire round trip. Keep guards cheap and avoid middleware that assumes a full page request.account.claim_requires_verified_email is the switch. If you turn it off, decide what an unverified claim means for order history visibility before you ship it.SearchProvider. Facets and header live suggestions route through it — if the provider isn't bound or is swapped, the header combobox degrades and facet counts go quiet.artisanpack-ui/livewire-ui-components markup are documented. Read that list before committing to a compliance statement, and re-test at 320px width — the "no sideways scroll / no hidden tab stops" guarantees are the easiest to break with a custom section.storefront.rtl_locales if it is right-to-left, or layout direction won't flip.SatelliteRegistry. If you conditionally disable it, expect account menu entries and visual-editor blocks to vanish too — that's intentional, not a bug.--allow-empty (the storefront registers no contract implementations), and a tag needs a signed report matching the provider's VERSION and a CHANGELOG section. Keep VERSION and CHANGELOG in sync or your own tags silently produce no release.How can I help you explore Laravel packages today?