jacksleight/blade-snip

There is no license information available for the latest version (0.3.0) of this package.

Fund package maintenance!
jacksleight

0.3.0 2024-03-28 16:51 UTC

This package is auto-updated.

Last update: 2024-11-03 09:41:31 UTC


README

Packagist version License

Blade Snip

Blade Snip allows you to use parts of a blade template multiple times. Basically partials, but inline:

<div class="products">
    @snip('product', ['image' => null])
        <div class="product">
            @if ($image)
                <img src="{{ $image }}">
            @endif
            <h1>Lorem Ipsum Dolor</h1>
            <p{{ number_format($price ?? rand(10, 100)) }}</p>
            <button>Add to Basket</button>
        </div>
    @endsnip
    @stick('product')
    @stick('product', ['image' => 'cheese.jpg'])
    @stick('product', ['image' => 'potato.jpg', 'price' => 120])
    {{-- or --}}
    @spread('product', 3)
</div>
@snip('content')
    <x-figure caption="Lorem ipsum dolor sit amet">
        <img src="photo.jpg">
    </x-figure>
@endsnip
@if ($link)
    <a href="{{ $link }}">@stick('content')</a>
@else
    @stick('content')
@endif
@snip('complex_thing')
    ...
@endsnip
<div class="mobile">
    <h2>{{ $name }}</div>
    <p>{{ $location }}</div>
    <div>@stick('complex_thing')</div>    
</div>
<table class="desktop">
    <tr>
        <th>{{ $name }}</td>
        <td>{{ $location }}</td>
        <td>@stick('complex_thing')</td>
    </tr>
</table>

Why?

I created this to use when prototyping page layouts. It's useful to have reusable blocks, but I don’t want to jump between multiple files, or don’t know exactly how those files should be structured yet.

This was primarily intended as a development tool, it’s usually best to break things down into actual partials or components once you’re done prototyping. That being said, there are other potential use cases.

Installation

Run the following command from your project root:

composer require jacksleight/blade-snip

Usage

Check the examples above.

Directives accept the following arguments:

  • @snip(string $name, ?array $defaults = [])@endsnip
    • Defines a new snip
  • @stick(string $name, ?array $data = [])
    • Includes a snip
  • @spread(string $name, int $count || array $datas)
    • Includes a snip multiple times
    • Also adds an $index variable to each iteration

Under the hood the @snip and @endsnip directives just wrap that code in a closure, then @stick and @spread call it. As they're closures they have their own variable scope, but variables defined in the template are included. Names can only contain alpha-numeric characters and underscores.