{{-- ═════════════════════════════ LANDING STUDIO ═════════════════════════════ Full-bleed customizer for the public landing. Its own route, its own shell (layouts/studio), one panel with two faces (browse sections / edit one). The canvas is the REAL public route in an iframe (?preview=1), never a re-implementation, so it cannot drift. Keystrokes reach it through same-origin postMessage; structural edits (add / remove / reorder / hide) reload the frame, because a text patch cannot add a DOM node. Clicking a block inside the frame opens its fields here — the frame reports the block's DOM id, which is already the section anchor. --}} @php $noFill = 'autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" data-1p-ignore data-lpignore="true"'; $current = $sections[$block] ?? $sections['hero']; $bodyOrder = $this->bodyOrder(); $iconCircle = 'display:inline-grid;place-items:center;width:28px;height:28px;border-radius:8px;background:var(--color-primary-soft);color:var(--color-primary-700);flex:none;'; $devices = [ 'desktop' => ['monitor', __('Desktop')], 'tablet' => ['tablet', __('Tablet')], 'mobile' => ['smartphone', __('Mobile')], ]; @endphp
{{-- ─────────────────────────── Toolbar ─────────────────────────── --}}
{{-- Plain link on purpose: wire:navigate swaps but leaves alone, and the console shell hangs its theme/sidebar Alpine state there — arriving over navigate lands in a broken layout. --}} {{ __('Back to admin') }}

{{ __('Landing Studio') }}

@if ($hasDraft) {{ __('Unpublished draft') }} @endif {{-- Device width: changes the frame's width and scales it down when the canvas is narrower than the device (see the Alpine component). --}}
@foreach ($devices as $key => $meta) @endforeach
{{-- Under ~900px the split becomes one-surface-at-a-time; this picks it. --}}
{{ __('Templates') }} {{ __('View landing') }}
{{-- ══════════════ THE PANEL — one column, two faces ══════════════ --}} {{-- ══════════════════════ THE CANVAS ══════════════════════ wire:ignore because the server has no opinion about it: the frame is driven entirely by postMessage and Alpine's width maths. Without it, every keystroke would morph the iframe and a re-created iframe reloads. --}}
@script @endscript