Plan step 36. The paginators put md-state-layer, md-focus-ring and md-touch-target on their live steps, where the rest of the actions and communication group (button, FAB, menu item, snackbar, alert) writes no class list and carries those declarations keyed on its own hooks, as the plan's data-md-* rule and the brief's "text classes, nothing else" ask. pagination.css now draws them on a link or button step, the layer hidden while Livewire disables previous and next; the views render no class at all, which the render tests pin. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Qwx5USif3wFFmxtHg5U1g9
74 lines
4.3 KiB
PHP
74 lines
4.3 KiB
PHP
{{-- Livewire's paginator, drawn in M3. The package puts this in front of Livewire's own
|
||
`livewire::tailwind` (config `livewire-material.pagination`), whose gray and blue classes do
|
||
not exist in an M3 theme. The file keeps Livewire's view name; nothing in it is Tailwind — the
|
||
drawing is resources/css/components/pagination.css.
|
||
|
||
The wiring is Livewire's, unchanged: `previousPage`, `nextPage` and `gotoPage` with the page
|
||
name, and the scroll back to the top of whatever `scrollTo` names. A page number is drawn as a
|
||
40px state layer and catches presses over M3's 48px target; the current one is the selected
|
||
state, secondary-container, never the action colour — it is where you are, not what to do next.
|
||
Below `medium` (600px) the numbers give way to "Page 2 of 7". --}}
|
||
|
||
@php
|
||
if (! isset($scrollTo)) {
|
||
$scrollTo = 'body';
|
||
}
|
||
|
||
$scrollIntoViewJsSnippet = ($scrollTo !== false)
|
||
? <<<JS
|
||
(\$el.closest('{$scrollTo}') || document.querySelector('{$scrollTo}')).scrollIntoView()
|
||
JS
|
||
: '';
|
||
@endphp
|
||
|
||
<div>
|
||
@if ($paginator->hasPages())
|
||
<nav role="navigation" aria-label="{{ __('Pagination Navigation') }}" data-md-pagination>
|
||
<p data-md-pagination-summary>
|
||
<span data-md-pagination-compact>{{ __('Page :page of :pages', ['page' => $paginator->currentPage(), 'pages' => $paginator->lastPage()]) }}</span>
|
||
<span data-md-pagination-range>{{ __(':first–:last of :total', ['first' => $paginator->firstItem(), 'last' => $paginator->lastItem(), 'total' => $paginator->total()]) }}</span>
|
||
</p>
|
||
|
||
<div data-md-pagination-steps>
|
||
@if ($paginator->onFirstPage())
|
||
<span data-md-pagination-step aria-disabled="true" aria-label="{{ __('Previous') }}">
|
||
<x-livewire-material::icon name="chevron_left" mirror-rtl />
|
||
</span>
|
||
@else
|
||
<button type="button" wire:click="previousPage('{{ $paginator->getPageName() }}')" x-on:click="{{ $scrollIntoViewJsSnippet }}" wire:loading.attr="disabled" dusk="previousPage{{ $paginator->getPageName() == 'page' ? '' : '.'.$paginator->getPageName() }}" data-md-pagination-step aria-label="{{ __('Previous') }}">
|
||
<x-livewire-material::icon name="chevron_left" mirror-rtl />
|
||
</button>
|
||
@endif
|
||
|
||
@foreach ($elements as $element)
|
||
@if (is_string($element))
|
||
<span data-md-pagination-step data-md-pagination-page aria-disabled="true">{{ $element }}</span>
|
||
@endif
|
||
|
||
@if (is_array($element))
|
||
@foreach ($element as $page => $url)
|
||
<span wire:key="paginator-{{ $paginator->getPageName() }}-page{{ $page }}" data-md-pagination-page>
|
||
@if ($page == $paginator->currentPage())
|
||
<span aria-current="page" data-md-pagination-step>{{ $page }}</span>
|
||
@else
|
||
<button type="button" wire:click="gotoPage({{ $page }}, '{{ $paginator->getPageName() }}')" x-on:click="{{ $scrollIntoViewJsSnippet }}" data-md-pagination-step aria-label="{{ __('Go to page :page', ['page' => $page]) }}">{{ $page }}</button>
|
||
@endif
|
||
</span>
|
||
@endforeach
|
||
@endif
|
||
@endforeach
|
||
|
||
@if ($paginator->hasMorePages())
|
||
<button type="button" wire:click="nextPage('{{ $paginator->getPageName() }}')" x-on:click="{{ $scrollIntoViewJsSnippet }}" wire:loading.attr="disabled" dusk="nextPage{{ $paginator->getPageName() == 'page' ? '' : '.'.$paginator->getPageName() }}" data-md-pagination-step aria-label="{{ __('Next') }}">
|
||
<x-livewire-material::icon name="chevron_right" mirror-rtl />
|
||
</button>
|
||
@else
|
||
<span data-md-pagination-step aria-disabled="true" aria-label="{{ __('Next') }}">
|
||
<x-livewire-material::icon name="chevron_right" mirror-rtl />
|
||
</span>
|
||
@endif
|
||
</div>
|
||
</nav>
|
||
@endif
|
||
</div>
|