Content & marketing
Simple Header code
Copy the implementation or inspect every file that belongs to this component unit.
resources/views/components/ui/simple-header/basic.blade.php
@props([
'eyebrow' => null,
'title' => null,
'description' => null,
'as' => 'h2',
])
@php
/*
| Basic landing header. The plainest option: a centred, single-column hero
| on a solid surface with no decoration. A dependable default for product
| pages that want the copy to carry the section.
*/
@endphp
<section
{{ $attributes->merge(['class' => 'simple-basic-field relative flex min-h-[80vh] items-center bg-white text-gray-900 dark:bg-gray-950 dark:text-white']) }}
>
<div class="mx-auto w-full max-w-3xl px-6 py-24 text-center sm:px-8">
@if ($eyebrow)
<p class="text-sm font-semibold uppercase tracking-[0.18em] text-brand-600 dark:text-brand-400">{{ $eyebrow }}</p>
@endif
@if ($title)
<{{ $as }} class="mt-5 text-4xl font-semibold tracking-tight text-balance sm:text-5xl lg:text-6xl">{{ $title }}</{{ $as }}>
@endif
@if ($description)
<p class="mx-auto mt-6 max-w-2xl text-lg leading-8 text-gray-600 text-pretty dark:text-gray-400">{{ $description }}</p>
@endif
@isset($actions)
<div class="mt-9 flex flex-col items-center justify-center gap-3 sm:flex-row">{{ $actions }}</div>
@endisset
</div>
</section>
resources/views/components/ui/simple-header/bold.blade.php
@props([
'eyebrow' => null,
'title' => null,
'description' => null,
'as' => 'h2',
])
@php
/*
| Bold landing header. High-impact: a deep brand field, oversized tight
| display type and a solid colour block accent. Built for launch pages that
| want the headline to dominate the viewport.
*/
@endphp
<section
{{ $attributes->merge(['class' => 'simple-bold-field relative isolate flex min-h-[92vh] items-center overflow-hidden bg-brand-950 text-white']) }}
>
<div class="pointer-events-none absolute -left-24 top-0 -z-10 h-full w-[60vw] -skew-x-12 bg-brand-900/60" aria-hidden="true"></div>
<div class="pointer-events-none absolute -right-32 bottom-[-6rem] -z-10 h-[32rem] w-[32rem] rounded-full bg-accent-500/25 blur-3xl" aria-hidden="true"></div>
<div class="mx-auto w-full max-w-6xl px-6 py-24 sm:px-8 lg:px-10">
@if ($eyebrow)
<p class="flex items-center gap-3 text-sm font-bold uppercase tracking-[0.2em] text-accent-300">
<span class="h-3 w-3 bg-accent-400" aria-hidden="true"></span>
{{ $eyebrow }}
</p>
@endif
@if ($title)
<{{ $as }} class="mt-6 max-w-4xl text-5xl font-bold leading-[0.95] tracking-tighter text-balance sm:text-7xl lg:text-8xl">{{ $title }}</{{ $as }}>
@endif
@if ($description)
<p class="mt-7 max-w-2xl text-lg leading-8 text-brand-100/80 text-pretty sm:text-xl">{{ $description }}</p>
@endif
@isset($actions)
<div class="mt-10 flex flex-col gap-3 sm:flex-row">{{ $actions }}</div>
@endisset
</div>
</section>
resources/views/components/ui/simple-header/clean.blade.php
@props([
'eyebrow' => null,
'title' => null,
'description' => null,
'as' => 'h2',
])
@php
/*
| Clean landing header. Airy and editorial: a narrow centred column framed
| by hairline rules, a dotted eyebrow and a muted palette with plenty of
| whitespace. Restrained typography does the work.
*/
@endphp
<section
{{ $attributes->merge(['class' => 'simple-clean-field relative flex min-h-[84vh] items-center bg-white text-gray-900 dark:bg-gray-950 dark:text-white']) }}
>
<div class="mx-auto w-full max-w-3xl px-6 py-28 text-center sm:px-8">
<div class="border-y border-gray-200 py-14 dark:border-gray-800">
@if ($eyebrow)
<p class="flex items-center justify-center gap-2 text-xs font-medium uppercase tracking-[0.28em] text-gray-500 dark:text-gray-400">
<span class="h-1.5 w-1.5 rounded-full bg-brand-500" aria-hidden="true"></span>
{{ $eyebrow }}
</p>
@endif
@if ($title)
<{{ $as }} class="mt-6 text-4xl font-medium leading-tight tracking-tight text-balance sm:text-5xl">{{ $title }}</{{ $as }}>
@endif
@if ($description)
<p class="mx-auto mt-6 max-w-xl text-lg leading-8 text-gray-500 text-pretty dark:text-gray-400">{{ $description }}</p>
@endif
@isset($actions)
<div class="mt-10 flex flex-col items-center justify-center gap-3 sm:flex-row">{{ $actions }}</div>
@endisset
</div>
</div>
</section>
resources/views/components/ui/simple-header/marginalia.blade.php
@props([
'eyebrow' => null,
'title' => null,
'description' => null,
'as' => 'h2',
])
@php
/*
| Marginalia landing header. Set like the opening page of an annotated
| manuscript: a ruled margin column carries small numbered notes while the
| main text block opens with an oversized drop cap. The description carries
| superscript markers that correspond to the notes. Entirely typographic —
| rules, counters and one initial letter, no imagery or decoration blur.
*/
$notes = [
['1', 'Set close to the fold so the opening line is never missed.'],
['2', 'Margin notes carry secondary detail without crowding the measure.'],
['3', 'The rule under the folio doubles as a reading anchor.'],
];
$initial = $description ? mb_substr($description, 0, 1) : null;
$rest = $description ? mb_substr($description, 1) : null;
@endphp
<section
{{ $attributes->merge(['class' => 'simple-marginalia-field relative flex min-h-[86vh] items-center bg-gray-50 text-gray-900 dark:bg-gray-950 dark:text-white']) }}
>
<div class="mx-auto w-full max-w-6xl px-6 py-24 sm:px-8 lg:px-10">
{{-- Folio line: running head and page mark, ruled off like a book page. --}}
<div class="flex items-baseline justify-between border-b-2 border-gray-900 pb-3 dark:border-white">
<p class="text-xs font-semibold uppercase tracking-[0.3em]">{{ $eyebrow ?? 'folio' }}</p>
<p class="font-mono text-xs tabular-nums text-gray-500 dark:text-gray-400">fol. 01 r</p>
</div>
<div class="mt-12 grid gap-10 lg:grid-cols-[11rem_1fr] lg:gap-16">
{{-- Margin column: numbered notes hanging in the gutter. --}}
<aside class="order-last space-y-6 border-t border-gray-300 pt-6 dark:border-gray-700 lg:order-first lg:border-r lg:border-t-0 lg:pr-6 lg:pt-1" aria-label="Margin notes">
@foreach ($notes as [$number, $note])
<p class="text-xs leading-5 text-gray-500 dark:text-gray-400">
<sup class="mr-1 font-mono font-semibold text-brand-600 dark:text-brand-400">{{ $number }}</sup>{{ $note }}
</p>
@endforeach
</aside>
<div class="max-w-2xl">
@if ($title)
<{{ $as }} class="text-4xl font-semibold leading-[1.08] tracking-tight text-balance sm:text-5xl">{{ $title }}<sup class="ml-2 align-super font-mono text-base font-semibold text-brand-600 dark:text-brand-400" aria-hidden="true">1</sup></{{ $as }}>
@endif
@if ($description)
<p class="mt-8 text-lg leading-8 text-gray-600 text-pretty dark:text-gray-300">
<span class="float-left mr-3 mt-1 border-2 border-gray-900 px-3 py-1 text-5xl font-bold leading-none text-gray-900 dark:border-white dark:text-white" aria-hidden="true">{{ $initial }}</span><span class="sr-only">{{ $initial }}</span>{{ $rest }}<sup class="ml-1 font-mono text-xs font-semibold text-brand-600 dark:text-brand-400" aria-hidden="true">2</sup>
</p>
@endif
@isset($actions)
<div class="mt-10 flex flex-col gap-3 clear-left sm:flex-row">{{ $actions }}</div>
@endisset
<p class="mt-12 border-t border-gray-300 pt-3 font-mono text-xs text-gray-400 dark:border-gray-700 dark:text-gray-500">
<sup class="mr-1 font-semibold text-brand-600 dark:text-brand-400" aria-hidden="true">3</sup>set in a single measure — no imagery, no ornament
</p>
</div>
</div>
</div>
</section>
resources/views/components/ui/simple-header/modern.blade.php
@props([
'eyebrow' => null,
'title' => null,
'description' => null,
'as' => 'h2',
])
@php
/*
| Modern landing header. A split two-column hero: copy on the left, a soft
| brand-gradient panel on the right, lifted by a single radial glow.
| Contemporary without leaning on imagery.
*/
@endphp
<section
{{ $attributes->merge(['class' => 'simple-modern-field relative isolate flex min-h-[88vh] items-center overflow-hidden bg-white text-gray-900 dark:bg-gray-950 dark:text-white']) }}
>
<div class="pointer-events-none absolute -top-32 right-0 -z-10 h-[28rem] w-[28rem] rounded-full bg-brand-500/20 blur-3xl dark:bg-brand-500/15" aria-hidden="true"></div>
<div class="mx-auto grid w-full max-w-7xl items-center gap-12 px-6 py-24 sm:px-8 lg:grid-cols-2 lg:gap-16 lg:px-10">
<div>
@if ($eyebrow)
<span class="inline-flex items-center gap-2 rounded-full border border-brand-200 bg-brand-50 px-3 py-1 text-xs font-semibold uppercase tracking-[0.14em] text-brand-700 dark:border-brand-800 dark:bg-brand-950/50 dark:text-brand-300">{{ $eyebrow }}</span>
@endif
@if ($title)
<{{ $as }} class="mt-6 text-4xl font-semibold tracking-tight text-balance sm:text-5xl lg:text-6xl">{{ $title }}</{{ $as }}>
@endif
@if ($description)
<p class="mt-6 max-w-xl text-lg leading-8 text-gray-600 text-pretty dark:text-gray-400">{{ $description }}</p>
@endif
@isset($actions)
<div class="mt-9 flex flex-col gap-3 sm:flex-row">{{ $actions }}</div>
@endisset
</div>
<div class="relative">
<div class="relative overflow-hidden rounded-3xl bg-gradient-to-br from-brand-500 via-brand-600 to-accent-600 p-px shadow-2xl shadow-brand-600/20">
<div class="rounded-[calc(1.5rem-1px)] bg-white/85 p-8 backdrop-blur dark:bg-gray-950/85">
<div class="flex items-center gap-2" aria-hidden="true">
<span class="h-2.5 w-2.5 rounded-full bg-red-400"></span>
<span class="h-2.5 w-2.5 rounded-full bg-amber-400"></span>
<span class="h-2.5 w-2.5 rounded-full bg-green-400"></span>
</div>
<div class="mt-6 space-y-3" aria-hidden="true">
<div class="h-3 w-3/4 rounded-full bg-gray-200 dark:bg-gray-800"></div>
<div class="h-3 w-full rounded-full bg-gray-200 dark:bg-gray-800"></div>
<div class="h-3 w-5/6 rounded-full bg-gray-200 dark:bg-gray-800"></div>
</div>
<div class="mt-6 grid grid-cols-3 gap-3" aria-hidden="true">
<div class="h-16 rounded-xl bg-brand-100 dark:bg-brand-950/60"></div>
<div class="h-16 rounded-xl bg-accent-100 dark:bg-accent-950/60"></div>
<div class="h-16 rounded-xl bg-gray-100 dark:bg-gray-800"></div>
</div>
</div>
</div>
</div>
</div>
</section>
resources/views/components/ui/simple-header/plain-depth.blade.php
@props([
'eyebrow' => null,
'title' => null,
'description' => null,
'as' => 'h2',
])
@php
/*
| Plain depth landing header. An image-free take on the layered pointer
| treatment: a matte field, measured planes and floating panels that move
| at separate speeds to keep the section feeling dimensional.
*/
$panels = [
[
'class' => 'left-6 top-20',
'title' => 'Foreground layer',
'copy' => 'Moves ahead of the field',
'x' => 76,
'y' => 46,
'rotate' => 5,
'surface' => 'bg-white/85 dark:bg-white/[0.09]',
],
[
'class' => 'right-8 top-28',
'title' => 'Far plane',
'copy' => 'Slides with a softer offset',
'x' => -38,
'y' => -24,
'rotate' => -4,
'surface' => 'bg-gray-50/85 dark:bg-gray-900/70',
],
[
'class' => 'left-16 bottom-28',
'title' => 'Near plane',
'copy' => 'Pulls wide for depth',
'x' => 104,
'y' => -62,
'rotate' => -8,
'surface' => 'bg-brand-50/90 dark:bg-brand-950/45',
],
[
'class' => 'right-12 bottom-24',
'title' => 'Depth panel',
'copy' => 'Opposite drift adds separation',
'x' => -112,
'y' => -72,
'rotate' => 8,
'surface' => 'bg-white/80 dark:bg-gray-900/80',
],
[
'class' => 'left-1/2 top-1/2 -translate-x-1/2',
'title' => 'Mid layer',
'copy' => 'Keeps the center subtly active',
'x' => 50,
'y' => -44,
'rotate' => 4,
'surface' => 'bg-accent-50/85 dark:bg-white/[0.08]',
],
];
@endphp
<section
x-data="{
px: 0,
py: 0,
reduced: window.matchMedia('(prefers-reduced-motion: reduce)').matches,
move($event) {
if (this.reduced) {
return;
}
const rect = $el.getBoundingClientRect();
this.px = (($event.clientX - rect.left) / rect.width) - 0.5;
this.py = (($event.clientY - rect.top) / rect.height) - 0.5;
},
reset() {
this.px = 0;
this.py = 0;
},
}"
@mousemove="move($event)"
@mouseleave="reset()"
{{ $attributes->merge(['class' => 'simple-plain-depth-field relative isolate flex min-h-[92vh] items-center overflow-hidden bg-gray-100 text-gray-950 dark:bg-gray-950 dark:text-white']) }}
>
<div class="absolute inset-0 -z-20 bg-gray-100 dark:bg-gray-950" aria-hidden="true"></div>
@foreach ($panels as $panel)
<div
class="pointer-events-none absolute {{ $panel['class'] }} hidden min-w-44 rounded-xl border border-gray-950/10 {{ $panel['surface'] }} px-5 py-4 text-sm text-gray-950 shadow-sm backdrop-blur will-change-transform dark:border-white/15 dark:text-white md:block"
:style="reduced ? '' : 'transform: translate3d(' + (px * {{ $panel['x'] }}) + 'px, ' + (py * {{ $panel['y'] }}) + 'px, 0) rotate(' + (px * {{ $panel['rotate'] }}) + 'deg);'"
aria-hidden="true"
>
<p class="font-semibold">{{ $panel['title'] }}</p>
<p class="mt-1 text-gray-600 dark:text-white/65">{{ $panel['copy'] }}</p>
</div>
@endforeach
<div class="mx-auto flex w-full max-w-7xl items-center px-6 py-24 sm:px-8 lg:px-10">
<div
class="max-w-3xl will-change-transform motion-reduce:transform-none"
:style="reduced ? '' : `transform: perspective(900px) rotateX(${py * -8}deg) rotateY(${px * 10}deg) translate3d(${px * 24}px, ${py * 18}px, 0);`"
>
@if ($eyebrow)
<x-ui.badge variant="outline" icon="stack" class="bg-white/70 text-gray-800 ring-1 ring-gray-950/5 backdrop-blur dark:bg-white/[0.08] dark:text-white dark:ring-white/10">
{{ $eyebrow }}
</x-ui.badge>
@endif
@if ($title)
<{{ $as }} class="mt-5 text-4xl font-semibold text-balance sm:text-5xl lg:text-6xl">{{ $title }}</{{ $as }}>
@endif
@if ($description)
<p class="mt-5 max-w-2xl text-base leading-7 text-gray-600 text-pretty dark:text-gray-300 sm:text-lg">{{ $description }}</p>
@endif
@isset($actions)
<div class="mt-8 flex flex-col gap-3 sm:flex-row">{{ $actions }}</div>
@endisset
<div class="mt-10 grid gap-3 sm:grid-cols-2 md:hidden" aria-hidden="true">
@foreach (array_slice($panels, 0, 4) as $panel)
<div class="rounded-xl border border-gray-950/10 {{ $panel['surface'] }} p-4 shadow-sm backdrop-blur dark:border-white/15">
<p class="text-sm font-semibold">{{ $panel['title'] }}</p>
<p class="mt-1 text-sm text-gray-600 dark:text-white/65">{{ $panel['copy'] }}</p>
</div>
@endforeach
</div>
</div>
</div>
</section>
resources/views/components/ui/simple-header/poster.blade.php
@props([
'eyebrow' => null,
'title' => null,
'description' => null,
'as' => 'h2',
])
@php
/*
| Poster landing header. A hard vertical split: one solid field carries the
| headline, the other holds the supporting copy. Classic poster composition
| without pins, paper tones, rotated credits or uppercase shouting — just
| two colours, one seam and measured type.
*/
@endphp
<section
{{ $attributes->merge(['class' => 'simple-poster-field relative isolate grid min-h-[92vh] overflow-hidden bg-white text-gray-950 lg:grid-cols-2 dark:bg-gray-950 dark:text-white']) }}
>
<div class="flex flex-col justify-end bg-gray-950 px-8 py-16 text-white sm:px-12 lg:px-14 lg:py-20 dark:bg-white dark:text-gray-950">
@if ($eyebrow)
<p class="font-mono text-xs uppercase tracking-[0.24em] text-white/60 dark:text-gray-950/55">{{ $eyebrow }}</p>
@endif
@if ($title)
<{{ $as }} class="mt-6 max-w-lg text-4xl font-semibold leading-[1.02] tracking-tight text-balance sm:text-5xl lg:text-6xl">{{ $title }}</{{ $as }}>
@endif
</div>
<div class="flex flex-col justify-end border-t border-gray-950 px-8 py-16 sm:px-12 lg:border-t-0 lg:border-s lg:px-14 lg:py-20 dark:border-gray-700">
@if ($description)
<p class="max-w-md text-lg leading-8 text-gray-600 text-pretty dark:text-gray-400">{{ $description }}</p>
@endif
@isset($actions)
<div class="mt-10 flex flex-col gap-3 sm:flex-row">{{ $actions }}</div>
@endisset
</div>
</section>
resources/views/components/ui/simple-header/simple.blade.php
@props([
'eyebrow' => null,
'title' => null,
'description' => null,
'as' => 'h2',
])
@php
/*
| Simple landing header. Left-aligned, single column on a soft neutral
| surface, with a short accent rule above the eyebrow. A touch more
| structured than the basic variant while staying calm and unadorned.
*/
@endphp
<section
{{ $attributes->merge(['class' => 'simple-simple-field relative flex min-h-[80vh] items-center bg-gray-50 text-gray-900 dark:bg-gray-900 dark:text-white']) }}
>
<div class="mx-auto w-full max-w-5xl px-6 py-24 sm:px-8">
<span class="block h-1 w-12 rounded-full bg-brand-600 dark:bg-brand-400" aria-hidden="true"></span>
@if ($eyebrow)
<p class="mt-6 text-sm font-semibold uppercase tracking-[0.18em] text-gray-500 dark:text-gray-400">{{ $eyebrow }}</p>
@endif
@if ($title)
<{{ $as }} class="mt-4 max-w-3xl text-4xl font-semibold tracking-tight text-balance sm:text-5xl lg:text-6xl">{{ $title }}</{{ $as }}>
@endif
@if ($description)
<p class="mt-6 max-w-2xl text-lg leading-8 text-gray-600 text-pretty dark:text-gray-400">{{ $description }}</p>
@endif
@isset($actions)
<div class="mt-9 flex flex-col gap-3 sm:flex-row">{{ $actions }}</div>
@endisset
</div>
</section>
resources/views/components/ui/simple-header/split.blade.php
@props([
'eyebrow' => null,
'title' => null,
'description' => null,
'as' => 'h2',
])
@php
/*
| Split landing header. The viewport divides into two solid fields at an
| exact vertical seam and the headline runs straight across it, swapping
| ink colour mid-stroke. The swap is two clipped copies of the same text —
| no images, no blend modes, no JavaScript. Below the headline a single
| bridge panel spans the seam so the actions sit on one honest surface.
| On small screens the seam collapses to a single dark field.
|
| Deliberately monochrome (gray/white only): the runtime theme switcher
| overrides brand/accent background utilities with high-specificity rules,
| which would defeat the responsive colour swap this section depends on.
*/
@endphp
<section
{{ $attributes->merge(['class' => 'simple-split-field relative isolate flex min-h-[88vh] items-center overflow-hidden bg-gray-950 text-white md:bg-white md:text-gray-950 dark:md:bg-gray-950 dark:md:text-white']) }}
>
{{-- Right half: the opposing field. Inverts in dark mode so the seam keeps its contrast. --}}
<div class="absolute inset-y-0 right-0 -z-10 hidden w-1/2 bg-gray-950 dark:bg-white md:block" aria-hidden="true"></div>
{{-- Seam ticks: short fold marks where the two fields meet. --}}
<div class="absolute left-1/2 top-10 hidden h-8 w-px -translate-x-1/2 bg-gray-950/25 dark:bg-white/30 md:block" aria-hidden="true"></div>
<div class="absolute bottom-10 left-1/2 hidden h-8 w-px -translate-x-1/2 bg-white/35 dark:bg-gray-950/30 md:block" aria-hidden="true"></div>
<div class="mx-auto w-full max-w-5xl px-6 py-24 text-center sm:px-8">
<div class="relative">
{{-- Left ink: clipped to the light half from md up, full-width on small screens. --}}
<div class="md:[clip-path:inset(0_50%_0_0)]">
@if ($eyebrow)
<p class="text-xs font-semibold uppercase tracking-[0.3em]">{{ $eyebrow }}</p>
@endif
@if ($title)
<{{ $as }} class="mt-6 text-4xl font-semibold tracking-tight text-balance sm:text-5xl lg:text-6xl">{{ $title }}</{{ $as }}>
@endif
</div>
{{-- Right ink: the same text clipped to the dark half. Presentational duplicate. --}}
<div class="absolute inset-0 hidden text-white dark:text-gray-950 md:block md:[clip-path:inset(0_0_0_50%)]" aria-hidden="true">
@if ($eyebrow)
<p class="text-xs font-semibold uppercase tracking-[0.3em]">{{ $eyebrow }}</p>
@endif
@if ($title)
<p class="mt-6 text-4xl font-semibold tracking-tight text-balance sm:text-5xl lg:text-6xl">{{ $title }}</p>
@endif
</div>
</div>
@if ($description || isset($actions))
{{-- Bridge panel: one solid surface deliberately laid across the seam. --}}
<div class="mx-auto mt-12 max-w-xl rounded-2xl bg-white/95 p-6 text-left shadow-xl shadow-gray-950/10 ring-1 ring-gray-950/10 backdrop-blur dark:bg-gray-900/95 dark:shadow-black/30 dark:ring-white/10 sm:p-8">
@if ($description)
<p class="text-base leading-7 text-gray-600 text-pretty dark:text-gray-300">{{ $description }}</p>
@endif
@isset($actions)
<div class="mt-6 flex flex-col gap-3 sm:flex-row">{{ $actions }}</div>
@endisset
</div>
@endif
</div>
</section>