Skip to content

Inertia Bookings Showcase

capell-app/theme-inertia-bookings is the first full Inertia theme slice. It shows how a premium booking-business theme can render Capell marketing pages through Inertia and link into the real Bookings appointment request flow.

The theme is for service businesses, clinics, consultants, classes, and appointment-led sites. It does not add theme-owned booking models, migrations, or admin resources.

PackageRole
capell-app/bookingsBooking services, staff, locations, availability, exceptions, and appointment request submission.
capell-app/inertiaShared Inertia renderer and package route bridge.
capell-app/inertia-vue-adapter or capell-app/inertia-react-adapterClient adapter selected by CAPELL_INERTIA_ADAPTER.
capell-app/theme-inertia-bookingsTheme manifest, runtime definition, demo install, and Bookings renderer binding.
capell-app/theme-inertia-bookings-vueVue components for Capell/Page and Capell/Bookings/Request.
capell-app/theme-inertia-bookings-reactReact components for the same server component contract.

The extension documentation entry point lives in Packages and extensions.

Install the booking theme with the runtime, selected adapter, matching theme component pack, and Bookings package:

Terminal window
composer require capell-app/bookings capell-app/inertia capell-app/inertia-vue-adapter capell-app/theme-inertia-bookings capell-app/theme-inertia-bookings-vue
php artisan capell:package-cache:clear
php artisan capell:package-cache
php artisan capell:extension-install capell-app/bookings --dry-run
php artisan capell:extension-install capell-app/bookings
php artisan capell:extension-install capell-app/inertia
php artisan capell:extension-install capell-app/inertia-vue-adapter
php artisan capell:extension-install capell-app/theme-inertia-bookings
php artisan capell:extension-install capell-app/theme-inertia-bookings-vue

For React, make these substitutions in the Vue commands, then set CAPELL_INERTIA_ADAPTER=react in .env:

Vue packageReact package
capell-app/inertia-vue-adaptercapell-app/inertia-react-adapter
capell-app/theme-inertia-bookings-vuecapell-app/theme-inertia-bookings-react

After the packages are enabled, activate the theme key inertia-bookings through the Theme Library or the install flow. Installing the packages makes the runtime available; selecting the theme is what makes public page requests resolve through FrontendRuntime::Inertia.

The theme definition uses FrontendRuntime::Inertia. When the theme is active, Capell resolves the page through the normal frontend route, builds the public page payload through the API package Actions, and renders Capell/Page through the selected adapter.

Marketing page content stays portable:

  • CMS fields store semantic copy and public data;
  • Layout Builder widgets carry public widget data;
  • theme and adapter packages own the presentation components;
  • authoring/admin concerns stay out of public props and rendered output.

The public /bookings flow uses the existing Bookings package, not mock slots:

SurfaceImplementation
Booking optionsBuildPublicBookingRequestOptionsAction
Available slotsBuildAvailableBookingSlotsAction
Public request propsBuildPublicBookingRequestPropsAction
Renderer contractPublicBookingRequestRenderer
Inertia rendererInertiaPublicBookingRequestRenderer
SubmissionCreateAppointmentRequestAction

The theme binds PublicBookingRequestRenderer to the Inertia renderer. The default Bookings package renderer remains Blade, so existing installs keep their current public form unless the Inertia theme is active.

BuildPublicBookingRequestPropsAction can return slots as an Inertia optional prop. The request page can load the service/staff/location form first, then request only slots through an Inertia partial reload when the visitor changes filters or timezone.

Slot generation respects:

  • active services;
  • staff and location filters;
  • availability windows;
  • availability exceptions;
  • requested timezone;
  • configured public slot interval;
  • service duration and capacity rules.

Use Capell lazy widget and fragment endpoints for visitor-triggered panels on marketing pages. Use Inertia optional props for the booking request page’s expensive slot data.

Booking request pages handle visitor intent and should not be cached as static marketing HTML. Keep these response rules:

  • Cache-Control includes private and no-store;
  • X-Robots-Tag: noindex, nofollow;
  • validation redirects must preserve normal Laravel form behavior;
  • successful submissions must still go through CreateAppointmentRequestAction.

Payments, customer portal, cancellation, and rescheduling are outside this first Inertia slice.

The showcase demo installer seeds portable content and real booking fixtures:

  • CMS pages and Layout Builder widgets;
  • booking services;
  • staff members;
  • locations;
  • recurring availability windows;
  • one blocked exception.

The demo content should not store theme utility classes or designed markup in editable database fields. Presentation belongs in the theme and adapter components.