With the Modal Component, Splade has built-in support for modals and slideover. This component allows you to load any route into a modal. Besides loading the content asynchronously, it also supports pre-loaded content.
First, let's take a look at loading a route into a modal. To prepare a view to use it inside a modal, you have to wrap the content in a <x-splade-modal>
component. Nothing changes when requesting the view outside of the modal. Everything will work as it used to. For example, here's a page to create a new user. This page is a regular, full-page view that extends the base layout.
@extends('layout')
@section('content')
<h1>Create new user</h1>
<x-splade-form>
<input v-model="form.name" placeholder="Name" />
<button type="submit">Create</button>
</x-splade-form>
@endsection
Now wrap the content:
@extends('layout')
@section('content')
<x-splade-modal>
<h1>Create new user</h1>
<x-splade-form>
<input v-model="form.name" placeholder="Name" />
<button type="submit">Create</button>
</x-splade-form>
</x-splade-modal>
@endsection
And that's it! Now when you want to load this route into a view, use the modal
attribute on the Link
component:
<Link modal href="/users/create">Create new user</Link>
To load the page into a slideover, replace the modal
attribute with the slideover
attribute. You don't have to change your view.
<Link slideover href="/users/create">Create new user</Link>
You can control the size of the modal with the max-width
attribute. Valid values are sm
, md
, lg
, xl
, 2xl
, 3xl
, 4xl
, 5xl
, 6xl
and 7xl
. The default is 2xl
for a modal and md
for a slideover.
<x-splade-modal max-width="lg">
By default, the modal is vertically centered. However, you may customize this with the position
attribute, which you can set to either top
, center
, or bottom
:
<x-splade-modal position="top">
The slideover opens on the right side by default, but you may change that as well with the position
attribute:
<x-splade-modal position="left">
By default, the modal closes when the user presses the escape key or clicks outside of the modal. However, you may disable this with the close-explicitly
attribute:
<x-splade-modal close-explicitly>
Suppose you want this to be the default behavior. In that case, you may call the defaultModalCloseExplicitly
method on the Splade
facade, for example, in the AppServiceProvider
class:
Splade::defaultModalCloseExplicitly();
The modal and slideover have a close button, which you can disable with the close-button
attribute.
<x-splade-modal :close-button="false">
You can manually close the modal or slideover with the modal.close()
or modal.setIsOpen()
methods. Under the hood, it uses HeadlessUI's dialog component.
<x-splade-modal>
<button type="button" @click="modal.close">Cancel</button>
<button type="button" @click="modal.setIsOpen(false)">Cancel</button>
</x-splade-modal>
Instead of loading the content asynchronously, you may also pass the content along with the page. You may do this by passing a name
attribute to the component and use the name along with a #
prefix in the Link
component:
<h1>Tickets & Tour Dates</h1>
<Link href="#refund-info">
Show Refund Information
</Link>
<x-splade-modal name="refund-info">
<p>...</p>
</x-splade-modal>
To use a slideover, you must put the attribute on the x-splade-component
instead of the Link
component. The max-width
attribute works with pre-loaded content as well.
<h1>Tickets & Tour Dates</h1>
<Link href="#refund-info">
Show Refund Information
</Link>
<x-splade-modal name="refund-info" slideover max-width="lg">
<p>...</p>
</x-splade-modal>
Additionally, it's possible to immediately show the modal on page load with the opened
attribute:
<x-splade-modal opened>
<pre>secret-token</pre>
</x-splade-modal>