visuellverstehen/statamic-sourcestack

A Statamic utility to only include css/js sources once.
1,489 1
Install
composer require visuellverstehen/statamic-sourcestack
Latest Version:v1.0.1
PHP:^8.0
License:MIT
Last Updated:Oct 30, 2024
Links: GitHub  ·  Packagist
Maintainer: visuellverstehen

SourceStack

A Statamic utility to only include css/js sources once. This can be useful when you want to include dedicated files for specific partials/sets that would otherwise be included multiple times within a template.

Assume a basic Statamic blueprint with a replicator field pagebuilder that stacks sets in a template:

<!-- page-template.antlers.html -->

{{ pagebuilder }}
    {{ partial:if_exists src="sets/{type}" }}
{{ /pagebuilder }}

Further assume that there is an 'image' and a 'gallery' set, which both require dedicated javascript source files:

<!-- sets/image.antlers.html -->

<img src"…" class="lightbox">

{{ once }}
    {{ push:scripts }}
        {{ vite src="resources/js/lightbox.js" }}
    {{ /push:scripts }}
{{ /once }}
<!-- sets/gallery.antlers.html -->

<ul class="gallery">
    …
</ul>

{{ once }}
    {{ push:scripts }}
        {{ vite src="resources/js/lightbox.js|resources/js/slider.js" }}
    {{ /push:scripts }}
{{ /once }}

By using the once tag we try make sure to only include every source once. The scripts stack is rendered in the layout.

However, if you add both an image and a gallery in a page, the lightbox.js script file will be added twice. The stack has no way to determine if a file was already added or not.

This is where SourceStack comes in.

How to Install

Run the following command from your project root:

composer require visuellverstehen/statamic-sourcestack

How to Use

Let's modify the Statamic setup described above. Instead of using the scripts stack for our js source, we use the sourcestack tag included in this package:

<!-- sets/image.antlers.html -->

<img src"…" class="lightbox">

{{ sourcestack src="resources/js/lightbox.js" }}

The tag collects all the sources throughout the template, making sure to add every source only once. Eventually, the sourcestack:render tag renders all collected sources as a vite source tag.

<!-- layout.antlers.html -->
<!-- … -->

<body>
    <main>
        {{ template_content }}
    </main>
    
    {{ sourcestack:render }}
</body>

You can also use the tag alias srcstk. Sources can be added with the src, source or file parameter. Output can be generated with render or vite.

{{ srcstk src="lightbox.js" }}
{{ srcstk:vite }}

Like in a vite tag you can add multiple sources at once. Files must be separated by either a comma (,) or a pipe (|):

{{ srcstk src="lightbox.js|gallery.js" }}

Dedicated stacks

If you need multiple stacks for different sources, you can define dedicated stacks in the config file:

'stacks' => [
    'css' => [
        'base_dir' => 'resources/css/',
        'extension' => 'css',
    ]
],

For each stack you can optionally define a base directory and a file extension. Assuming the example above, the tag would be used like this:

{{ sourcestack:css src="gallery" }}
{{ sourcestack:render stack="css" }}

Please note that stacks can't be called render or any other strings that resolve to public function names of the Sourcestack tag class.

Caveats

The way SourceStack is currently built requires the output to be called after all sources have been collected. You can however use Statamics section and yield logic to move e. g. a stack with css files to the <head> element:

<head>
    <!-- … -->
    
    {{ yield:css-sources }}
</head>
<body>
    <!-- … -->
    
    {{ section:css-sources }}
        {{ sourcestack:render stack="css" }}
    {{ /section:css-sources }}
</body>

Configuration

In addition to dedicated stacks (see above), you can configure the default base directory to be used for all regular source file paths in config/sourcestack.php.

More about us

License

The MIT license (MIT). Please take a look at the license file for more information.

Related Packages

visuellverstehen/statamic-classify

A useful helper to add CSS classes to all HTML tags generated by the bard editor...

125,334 20
larakit/lk-staticfiles

[Larakit] Библиотека для Laravel для управления статикой (сборка в один файл, сж...

1,772 0
tooleks/laravel-asset-version

The Laravel Assets Versioning Package

47,133 7
fisharebest/laravel-assets

Asset management for Laravel

8,129 20
stolz/assets

An ultra-simple-to-use assets management library

549,905 287

Version History

Version Released PHP License
v1.0.1 ^8.0 MIT
v1.0.0 ^8.0 MIT