Skip to content
Brok UI

Loading…

No results

Image with Text

Open source

Image-and-text content sections — a 50/50 row, a text-over-image band and an editorial overlapping card.

Preview

resources/views/blocks/image-text-overlap.blade.php Blade
@props([
    'eyebrow' => 'Our craft',
    'heading' => 'Designed in the open, owned by you',
    'body' => null,
    'cta' => 'Read the story',
    'ctaHref' => '#',
    'image' => null,
])

@php
    $body ??= 'Every surface starts as a hand-tuned editorial layout, then becomes plain Blade you copy into your own project. The image and the words share one frame — layered, deliberate, and entirely yours to reshape.';
@endphp

<x-ui.section data-slot="image-text-03" space="xl" {{ $attributes }}>
    <x-ui.container gutter="sm">
        <div class="relative lg:grid lg:grid-cols-12 lg:items-center">
            {{-- Large image panel --}}
            <div class="lg:col-span-8">
                <div class="relative aspect-[16/10] overflow-hidden rounded-lg bg-muted shadow-sm">
                    @if ($image)
                        <img
                            src="{{ $image }}"
                            alt="{{ __($heading) }}"
                            class="size-full object-cover"
                            loading="lazy"
                            decoding="async"
                        />
                    @else
                        <div class="flex size-full items-center justify-center text-muted-foreground" aria-hidden="true">
                            <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" class="size-16">
                                <rect x="3" y="3" width="18" height="18" rx="2" />
                                <circle cx="9" cy="9" r="2" />
                                <path d="m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21" />
                            </svg>
                        </div>
                    @endif
                </div>
            </div>

            {{-- Overlapping copy card --}}
            <div class="mt-6 lg:col-span-5 lg:col-start-8 lg:mt-0 lg:-ms-16">
                <x-ui.card class="relative z-10 border-border bg-card p-8 shadow-lg sm:p-10">
                    @if ($eyebrow)
                        <x-ui.badge variant="secondary" class="mb-6">{{ __($eyebrow) }}</x-ui.badge>
                    @endif

                    <h2 class="text-balance text-2xl font-bold tracking-tight sm:text-3xl">
                        {{ __($heading) }}
                    </h2>

                    <p class="mt-4 text-pretty text-base leading-relaxed text-muted-foreground">
                        {{ __($body) }}
                    </p>

                    @if ($cta)
                        <x-ui.button :href="$ctaHref" class="mt-8">
                            {{ __($cta) }}
                            <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="size-4 rtl:-scale-x-100" aria-hidden="true">
                                <path d="M5 12h14M13 5l7 7-7 7" />
                            </svg>
                        </x-ui.button>
                    @endif
                </x-ui.card>
            </div>
        </div>
    </x-ui.container>
</x-ui.section>

Installation

terminal
php artisan ui:add blocks/image-text-overlap

Installs these dependencies automatically:

Registry contract

Install confidence

php artisan ui:add blocks/image-text-overlap writes only the generated targets below. The CLI validates each file hash before writing and prompts before replacing local changes unless --force is used.

Version
1.0.4
License
open
Stability
stable
Contract
v1
Foundation
≥ 1.0.0
Type Generated target
blade resources/views/blocks/image-text-overlap.blade.php

Registry dependencies

badge button card container section

Package dependencies

composer: jml/brok:^0.2

Use with AI

A brief for your coding agent: what the block is, the install command, how to render it, its props and the rules. Copy it, or open a prompt about this block in an assistant.

image-text-overlap.md
# Brok UI block: Image Text 03 (`image-text-overlap`)

An editorial image-with-text section where a copy card overlaps the inline-start edge of a large rounded image panel for a layered, magazine feel. The lifted card carries an eyebrow badge, heading, body copy, and a primary CTA; on desktop it crosses onto the image, and on mobile it stacks cleanly below — distinct from a plain 50/50 row.

Brok UI is a Laravel Blade registry. `ui:add` copies this block into the app as plain Blade the app owns; it composes installed `<brok:*>` primitives and semantic design tokens.

## Install

```bash
php artisan ui:add blocks/image-text-overlap
```

## Render it

```blade
<x-blocks.image-text-overlap />
```

## Props

- `eyebrow` (string, default `Our craft`) — Small label shown above the heading inside a badge.
- `heading` (string, default `Designed in the open, owned by you`) — Primary section heading.
- `body` (mixed|null, default `null`) — Supporting paragraph under the heading; falls back to sample copy when null.
- `cta` (string, default `Read the story`) — Button label; falsy hides the CTA.
- `cta-href` (string, default `#`) — Button destination.
- `image` (mixed|null, default `null`) — Optional image URL for the panel; shows a placeholder icon when null.

## Use when

- Use it for an editorial, magazine-style section where a copy card visually overlaps the inline-start edge of a large rounded image panel for a layered feel.
- Reach for it when the story needs a single CTA and no checklist, distinct from a plain side-by-side 50/50 row.

## Avoid when

- Avoid it when the layout should be a plain, non-overlapping 50/50 row with a flippable image side; use image-text-row instead.

## Rules

- Render the installed block with `<x-blocks.image-text-overlap />` and pass data through its props; edit the copied file only for structural changes.
- Keep the semantic design tokens (`bg-background`, `text-muted-foreground`); never swap in raw colour utilities.
- Keep the `data-slot` attributes and the logical (start/end) spacing so the markup still mirrors under `dir="rtl"`.

## Links

- Docs: https://brokui.dev/blocks/image-text-overlap
- Registry JSON (files, props, contract): https://brokui.dev/r/open/blocks/image-text-overlap.json

Working in Claude Code, Cursor or Codex? Give the agent the whole registry through the MCP server or the Brok UI skill.

Guidance

Use when

  • Use it for an editorial, magazine-style section where a copy card visually overlaps the inline-start edge of a large rounded image panel for a layered feel.
  • Reach for it when the story needs a single CTA and no checklist, distinct from a plain side-by-side 50/50 row.

Avoid when

  • Avoid it when the layout should be a plain, non-overlapping 50/50 row with a flippable image side; use image-text-row instead.

Anti-patterns

  • Do not replace semantic props with conflicting utility classes.
  • Do not remove labels, focus styles, or state attributes.
Anatomy
large rounded image panel overlapping copy card eyebrow badge heading body paragraph CTA button with trailing arrow

Usage

Render the block as a component, passing data where useful:

resources/views/welcome.blade.php Blade
<x-blocks.image-text-overlap />

Built from primitives

Composes <brok:*> Semantic tokens Re-themeable RTL-ready

This block composes installed <brok:*> primitives and semantic design tokens only — it does not reimplement any primitive. Re-theme it (light, dark, admin, customer) by editing CSS variables; flip the preview to RTL to confirm it mirrors.

Source

The exact, editable file ui:add writes into your app. The preview above renders this same source — there are no preview-only blocks.

resources/views/blocks/image-text-overlap.blade.php Blade
@props([
    'eyebrow' => 'Our craft',
    'heading' => 'Designed in the open, owned by you',
    'body' => null,
    'cta' => 'Read the story',
    'ctaHref' => '#',
    'image' => null,
])

@php
    $body ??= 'Every surface starts as a hand-tuned editorial layout, then becomes plain Blade you copy into your own project. The image and the words share one frame — layered, deliberate, and entirely yours to reshape.';
@endphp

<x-ui.section data-slot="image-text-03" space="xl" {{ $attributes }}>
    <x-ui.container gutter="sm">
        <div class="relative lg:grid lg:grid-cols-12 lg:items-center">
            {{-- Large image panel --}}
            <div class="lg:col-span-8">
                <div class="relative aspect-[16/10] overflow-hidden rounded-lg bg-muted shadow-sm">
                    @if ($image)
                        <img
                            src="{{ $image }}"
                            alt="{{ __($heading) }}"
                            class="size-full object-cover"
                            loading="lazy"
                            decoding="async"
                        />
                    @else
                        <div class="flex size-full items-center justify-center text-muted-foreground" aria-hidden="true">
                            <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" class="size-16">
                                <rect x="3" y="3" width="18" height="18" rx="2" />
                                <circle cx="9" cy="9" r="2" />
                                <path d="m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21" />
                            </svg>
                        </div>
                    @endif
                </div>
            </div>

            {{-- Overlapping copy card --}}
            <div class="mt-6 lg:col-span-5 lg:col-start-8 lg:mt-0 lg:-ms-16">
                <x-ui.card class="relative z-10 border-border bg-card p-8 shadow-lg sm:p-10">
                    @if ($eyebrow)
                        <x-ui.badge variant="secondary" class="mb-6">{{ __($eyebrow) }}</x-ui.badge>
                    @endif

                    <h2 class="text-balance text-2xl font-bold tracking-tight sm:text-3xl">
                        {{ __($heading) }}
                    </h2>

                    <p class="mt-4 text-pretty text-base leading-relaxed text-muted-foreground">
                        {{ __($body) }}
                    </p>

                    @if ($cta)
                        <x-ui.button :href="$ctaHref" class="mt-8">
                            {{ __($cta) }}
                            <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="size-4 rtl:-scale-x-100" aria-hidden="true">
                                <path d="M5 12h14M13 5l7 7-7 7" />
                            </svg>
                        </x-ui.button>
                    @endif
                </x-ui.card>
            </div>
        </div>
    </x-ui.container>
</x-ui.section>

Ownership & lifecycle

Owner, release state, review evidence and adoption for this item.
Owner
Platform UI (@JoshJML)
Current version
1.0.4
Status
Stable
License
open
Deprecation
Not deprecated
Contract
v1
Foundation
≥ 1.0.0