Compare commits

..

1 commit

Author SHA1 Message Date
9f367cb9b2 begin working on animation support 2025-03-12 16:38:23 +01:00
32 changed files with 148 additions and 323 deletions

View file

@ -8,7 +8,7 @@ trigger:
- main - main
steps: steps:
- name: docker-default - name: docker
image: plugins/docker image: plugins/docker
settings: settings:
registry: git.riksolo.com registry: git.riksolo.com
@ -19,29 +19,3 @@ steps:
- ${DRONE_COMMIT} - ${DRONE_COMMIT}
password: password:
from_secret: dockertoken from_secret: dockertoken
- name: docker-rblicht
image: plugins/docker
settings:
registry: git.riksolo.com
username: riksolo
repo: git.riksolo.com/${DRONE_REPO,,}
build_args:
- SITE=rblicht
tags:
- latest-rblicht
- ${DRONE_COMMIT}-rblicht
password:
from_secret: dockertoken
- name: trigger docker-compose release
image: plugins/downstream
settings:
server: https://drone.riksolo.com
token:
from_secret: drone_token
repositories:
- RikSolo/docker-compose
depends_on:
- docker-default
- docker-rblicht

View file

@ -1,9 +1,6 @@
FROM node:22 FROM node:22
WORKDIR /usr/src/app WORKDIR /usr/src/app
ARG SITE=default
ENV SITE=$SITE
COPY package*.json ./ COPY package*.json ./
RUN npm install RUN npm install
ADD . . ADD . .

View file

@ -1,8 +0,0 @@
export default function () {
return {
title: "Rik Berkelder",
url: process.env.site == "rblicht" ? "https://rblicht.nl" : "https://riksolo.com",
author: "Rik Berkelder",
site: process.env.SITE || 'default'
};
}

View file

@ -1,36 +0,0 @@
---
slug: ma3-tip-conditional-recipes
title: "MA3 Tip: Customizing Shows On The Fly Using Conditional Recipes"
date: 2025-09-11
modified: 2025-09-11
description: Easily adapting GrandMA3 showfiles to different situations by bulk-toggling Recipe lines based on tags.
---
Touring with a super detailed, highly programmed light show is great, until you find yourself having to adapt to more limited venues than anticipated.
I found myself facing this problem earlier this year. A band I've been working with had mostly been doing big one-off festival shows, and not a huge amount per year. With those circumstances, it wasn't a big problem for me to manually go over the showfile for every show and fixing things that didn't really work with each festival rig.
Until they booked a two week club tour through Europe, and while it was a big step for the band, the variety of venues ranged from tiny 100-capacity music places to the mainstage of a festival with 40,000 sold tickets.
Spending a couple of hours per show doing previz would be possible, but I kept making more or less the same substitutions, which left me wondering if I could lighten that workload.
## The easy option, and the engineering perspective
The first thought was to just build a second "minimal" showfile, for very small rigs. This would be a lot easier to scale up, but it would mean having two base files to keep up to date and program new tracks into. I absolutely hate doing repetitive work though, so keeping two separate showfiles up to date sounds like a pain.
DRY (don't repeat yourself) is one of the first things hammered into you when you're learning computer programming. If you notice you're writing the same code multiple times, it means you can probably simplify something, or extract it into a reusable bit of code, so that when you change some part of it, it updates anywhere. A great example of DRY in lighting programming would be using presets in your show, instead of hardcoding values into every cue. So I started thinking if I could come up with a more elegant solution for my situation.
## The elegant solution
The entire show has been programmed using recipes, and when I was thinking this problem through, tags were recently added into the MA3 software. I noticed that a Tag field was also added to the recipe lines I started wondering if I could bulk edit recipe lines that have a tag. And as basically any question about doing things in MA using commands, the answer was "of course!"
I ended up with the following syntax:
`
Set Sequence 1 Thru Cue 1 Thru Part Thru.Thru Property "enabled" 0 if #[Tag 'No Sides']
`
This disables any recipe line in any cue in any sequence as long as it has a certain tag. change the 0 for a 1 and it enables it. So I created a few tags ("No Sides", "No Floor Spots", "No Floor Washes", and so on), then went through the show, adding additional programming for these situations. Then I just had to create a couple of simple macros to toggle the recipe lines on and off, and I was left with an on-the-fly configurable showfile to adapt to wildly differing show scenarios.
## Takeaways and other uses
Being able to mix and match multiple options also lets me make sure to still maximize what I'm doing with the parts of a rig that are there. Had I chosen to go with a "minimal" showfile, using it when I don't have washes on the floor would also mean losing any cool stuff I was doing with the side lights, or having to manually program it back.
This technique has saved me several hours per gig, most of which wouldn't have been paid either.
This trick can be very useful when you're not touring too. I've also started using the `If Tag` technique in my busking showfile. For example for enabling/disabling certain groups in my LOS-inspired system.

View file

@ -1,5 +1,5 @@
const conf = { const conf = {
tags: "blogpost", tags: "blogposts",
layout: "blogpost.njk", layout: "blogpost.njk",
eleventyComputed: { eleventyComputed: {
permalink(data) { permalink(data) {

View file

@ -1,11 +0,0 @@
<ul>
<li><a href="https://www.sowulo.nl">Sowulo</a> - Lighting design & international touring since 2023</li>
<li><a href="https://aitum.tv">Aitum</a> - React & Electron development + MIDI and OSC integration</li>
<li><a href="https://twitch.tv/mrgregles">MrGregles</a> - Fully remote, real-time live show lighting control</li>
<li>RN7 - Custom digital signage with radio playout data integration</li>
<li>Doornroosje / TivoliVredenburg / Luxor Live / Musis Sacrum - House LD / System Technician</li>
<li>ShowLine / Hoevenaars / Ecolicht - Lighting Operator / System Technician</li>
<li>DG Producties / Theater Terra / Ellen ten Damme - Theatre Touring</li>
<li>Deyval - Last-minute work for a wide range of customers</li>
<small><a href="/portfolio">See More -></a></small>
</ul>

View file

@ -1,31 +0,0 @@
{% macro navItem(title, url, hyphen=true, target='_self') %}
<span>
<a href="{{url}}" target="{{target}}">{{title}}</a>
{% if hyphen %} - {% endif %}
</span>
{% endmacro %}
<div class="container">
<div class="nav">
<a class="d-inline-block main-logo" href="/">
<img src="/img/RB-w.png" alt="RB logo" eleventy:widths="100" />
Rik Berkelder
</a>
<div class="nav-links">
<div class="d-inline-block">
{{navItem("Home", "/")}}
{%if site.site != "rblicht" %}
{{navItem("Blog", "/blog")}}
{%endif%}
{{navItem("Portfolio", "/portfolio", false)}}
</div>
<div class="d-inline-block">
<span> | </span>
{% if site.site != "rblicht" %}
{{navItem("Mastodon", "https://dook.business/@RikSolo")}}
{% endif %}
{{navItem("Instagram", "https://instagram.com/RikBerkelder", false)}}
</div>
</div>
</div>
</div>

View file

@ -1,21 +0,0 @@
<div class="flex">
<div class="col-half">
<b>Lighting & AV</b>
<ul>
<li>GrandMA2/3, Avolites, Hog4, Obsidian Onyx</li>
<li>Capture, Vectorworks</li>
<li>RDM, dmXLAN, Luminex, Mikrotik</li>
<li>ATEM, Resolume, VMix, OBS</li>
<li>Timecode, Remote Production, System Integration</li>
</ul>
</div>
<div class="col-half">
<b>Software & IT</b>
<ul>
<li>Typescript, Rust, C++</li>
<li>React (Native), Angular, NodeJS, Electron, Embedded</li>
<li>Git, Docker, Gitlab CI, GitHub Actions, DroneCI</li>
<li>Network Management, Cisco, Mikrotik, Netgear</li>
</ul>
</div>
</div>

View file

@ -1,57 +0,0 @@
<!doctype html>
<html>
<head>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inconsolata:wght@400;700&display=swap" rel="stylesheet">
<link rel="stylesheet" type="text/css" href="/style.css" />
<link href="https://unpkg.com/prism-themes@1.9.0/themes/prism-nord.css" rel="stylesheet" />
<link rel="stylesheet" href="https://unpkg.com/simplelightbox@2.14.3/dist/simple-lightbox.min.css" />
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="robots" content="index, follow" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="language" content="English" />
<meta name="google-site-verification" content="x17arJy33V33DYnmMYybZciXngFd8R8xn1UZRdp7qxo" />
<link rel="canonical" href="{{site.url}}{{page.url | url}}" />
{%if tags.includes("blogpost")%}
<meta property="og:type" content="article" />
{%if description %}
<meta property="description" content="{{description}}" />
<meta property="og:description" content="{{description}}" />
{% endif %}
<meta property="og:title" content="{{title}}" />
<meta property="og:url" content="{{site.url}}{{page.url | url}}" />
<meta property="og:sitename" content="{{site.title}}" />
<meta property="og:image" content="{{site.url}}/img/RB-w.png" />
{%endif%}
<title>{% if title %}{{title}} | {% endif %}{{site.title}}</title>
</head>
<body>
{{content | safe}}
<script src="//instant.page/5.2.0" type="module"
integrity="sha384-jnZyxPjiipYXnSU0ygqeac2q7CVYMbh84q0uHVRRxEtvFPiQYbXWUorga2aqZJ0z"></script>
<script data-goatcounter="https://goatcounter.riksolo.com/count" async
src="//goatcounter.riksolo.com/count.js"></script>
<script src="//unpkg.com/simplelightbox@2.14.3/dist/simple-lightbox.min.js"></script>
<script>
new SimpleLightbox('.gallery a', {
widthRatio: 0.9,
heightRatio: 0.95,
captionSelector: '.gallery-caption',
captionType: 'text',
});
</script>
</body>
</html>

View file

@ -1,7 +1,82 @@
--- {% macro navItem(title, url, hyphen=true, target='_self') %}
layout: 'base-nonav.njk' <span>
--- <a href="{{url}}" target="{{target}}">{{title}}</a>
{% if hyphen %} - {% endif %}
</span>
{% endmacro %}
{%include "navbar.njk"%} <!doctype html>
<html>
<head>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inconsolata:wght@400;700&display=swap" rel="stylesheet">
<link rel="stylesheet" type="text/css" href="/style.css" />
<link href="https://unpkg.com/prism-themes@1.9.0/themes/prism-nord.css" rel="stylesheet" />
<link rel="stylesheet" href="https://unpkg.com/simplelightbox@2.14.3/dist/simple-lightbox.min.css" />
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="robots" content="index, follow" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="language" content="English" />
<meta name="google-site-verification" content="x17arJy33V33DYnmMYybZciXngFd8R8xn1UZRdp7qxo" />
<link rel="canonical" href="{{site.url}}{{page.url | url}}" />
{%if tags.includes("blogpost")%}
<meta property="og:type" content="article" />
{%if description %}
<meta property="description" content="{{description}}" />
<meta property="og:description" content="{{description}}" />
{% endif %}
<meta property="og:title" content="{{title}}" />
<meta property="og:url" content="{{site.url}}{{page.url | url}}" />
<meta property="og:sitename" content="{{site.title}}" />
<meta property="og:image" content="{{site.url}}/img/RB-w.png" />
{%endif%}
<title>{% if title %}{{title}} | {% endif %}{{site.title}}</title>
</head>
<body>
<div class="container">
<div class="nav">
<a class="d-inline-block main-logo" href="/">
<img src="/img/RB-w.png" alt="RB logo" eleventy:widths="100" />
Rik Berkelder
</a>
<div class="nav-links">
<div class="d-inline-block">
{{navItem("Home", "/")}}
{{navItem("Blog", "/blog")}}
{{navItem("Portfolio", "/portfolio", false)}}
</div>
<div class="d-inline-block">
<span> | </span>
{{navItem("Mastodon", "https://dook.business/@RikSolo")}}
{{navItem("Instagram", "https://instagram.com/RikBerkelder", false)}}
</div>
</div>
</div>
</div>
{{content | safe}} {{content | safe}}
<script src="//instant.page/5.2.0" type="module"
integrity="sha384-jnZyxPjiipYXnSU0ygqeac2q7CVYMbh84q0uHVRRxEtvFPiQYbXWUorga2aqZJ0z"></script>
<script data-goatcounter="https://goatcounter.riksolo.com/count" async
src="//goatcounter.riksolo.com/count.js"></script>
<script src="//unpkg.com/simplelightbox@2.14.3/dist/simple-lightbox.min.js"></script>
<script>
new SimpleLightbox('.gallery a', {
widthRatio: 0.9,
heightRatio: 0.95,
captionSelector: '.gallery-caption',
captionType: 'text',
});
</script>
</body>
</html>

View file

@ -14,7 +14,7 @@ layout: base.njk
<div class="portfolio-detail-images gallery"> <div class="portfolio-detail-images gallery">
{% for image in data.images %} {% for image in data.images %}
<a href="{% imageUrl image.url %}"> <a href="{% imageUrl image.url %}">
<img src="{{image.url}}" alt="" loading="lazy" /> <img src="{{image.url}}" alt="" loading="lazy" width="600" />
{% if image.caption %} {% if image.caption %}
<div class="gallery-caption"> <div class="gallery-caption">
{{image.caption}} {{image.caption}}

View file

@ -4,7 +4,7 @@ permalink: "/blog/"
--- ---
<h1>Blog</h1> <h1>Blog</h1>
{% for post in collections.blogpost | reverse %} {% for post in collections.blogposts | reverse %}
<div> <div>
{{post.data.date | dateLocale}} - <a href="{{ post.data.permalink | safe }}">{{post.data.title}}</a> {{post.data.date | dateLocale}} - <a href="{{ post.data.permalink | safe }}">{{post.data.title}}</a>
</div> </div>

View file

@ -1,43 +0,0 @@
---
title: CV
permalink: "/cv/"
layout: 'base-nonav.njk'
draft: true
---
<div class="container">
<h1>Rik Berkelder</h1>
Lighting Designer/Technician | Software Engineer | Nerd
<h2>About</h2>
<p>
I am a freelance lighting designer, technician, and systems specialist with a focus on touring productions and live
performance. Since 2018, I have worked freelance, initially alongside a career in IT and software engineering and
full time since 2022, bringing together technical precision, creative design, and a strong respect for the craft and
crew.
</p>
<p>
I have designed lighting for touring shows that require both creative adaptability and practical problem solving on
the road. As a house and systems technician in a variety of venues, I regularly support international acts and
crews, adapting to varied
setups and workflows. My theatre and festival touring experience has also strengthened my ability to communicate
clearly with local teams and deliver consistent, high quality results in dynamic environments.
</p>
<p>
A perfectionist by nature, I value preparation, attention to detail, and reliability while staying flexible and
collaborative to meet the demands of live production. My background in IT and network management supports
increasingly complex lighting and control systems, ensuring stable and efficient operation across all types of
venues.
</p>
<h2>Skills</h2>
{%include "skills.njk" %}
<h2>Highlighted work</h2>
{%include "highlights.njk" %}
<h2>Contact</h2>
rik@rblicht.nl / +31 6 37 27 17 91
</div>

View file

@ -6,37 +6,45 @@ permalink: "/"
<h1>Rik Berkelder</h1> <h1>Rik Berkelder</h1>
Lighting Designer | Software Engineer | Nerd Lighting Designer | Software Engineer | Nerd
{%if site.site == "rblicht" %}
<h2>About</h2>
<p>
I am a freelance stage lighting technician, lighting designer, and lighting systems technician with a passion for the
intersection of technical precision and creative expression. My journey in lighting began in primary school, driven by
a fascination with how light shapes space and mood. Since 2018, Ive been freelancing alongside a career in software
engineering and IT, transitioning to full-time freelance work in 2022.
</p>
<p>
A perfectionist by nature, I value preparation, attention to detail, and reliability while staying flexible and
collaborative to meet the demands of live production. I strive bring professionalism, technical expertise, and a deep
commitment to elevating every production I work on, blending methodical planning with a love for creative
problem-solving and thinking on my feet when necessary.
</p>
{%endif%}
<h2>Skills</h2> <h2>Skills</h2>
{%include "skills.njk" %} <div class="flex">
<div class="col-half">
<b>Lighting & AV</b>
<ul>
<li>GrandMA2/3, Avolites, Hog4, Obsidian Onyx</li>
<li>Capture, Vectorworks</li>
<li>ATEM, Resolume, VMix, OBS</li>
<li>Timecode, Remote Production, System Integration</li>
</ul>
</div>
<div class="col-half">
<b>Software</b>
<ul>
<li>Typescript, GraphQL</li>
<li>React (Native), Angular, NodeJS, Electron</li>
<li>Git, Docker, Gitlab CI, GitHub Actions, DroneCI</li>
<li>Sass/SCSS, Tailwind, Bootstrap</li>
</ul>
</div>
</div>
<h2>Highlighted Projects/Clients</h2> <h2>Highlighted Projects/Clients</h2>
{%include "highlights.njk" %} <ul>
<li><a href="https://www.sowulo.nl">Sowulo</a> - Lighting design & touring since 2023</li>
<li><a href="https://aitum.tv">Aitum</a> - React & Electron development</li>
<li><a href="https://twitch.tv/mrgregles">MrGregles</a> - Fully remote, real-time live show lighting control</li>
<li><a href="https://rn7.nl">RN7</a> - Custom digital signage with radio playout data integration</li>
<li>Doornroosje / TivoliVredenburg / Luxor Live - House LD</li>
<small><a href="/portfolio">See More -></a></small>
</ul>
<h2>Contact</h2> <h2>Contact</h2>
{% if site.site != "rblicht" %}mail@riksolo.com / {% endif %}rik@rblicht.nl mail@riksolo.com / rik@rblicht.nl
<h3>Find me elsewhere</h3> <h3>Find me elsewhere</h3>
<ul> <ul>
{% if site.site != "rblicht" %}
<li><a href="https://dook.business/@RikSolo">Mastodon</a> <small>(dook.business)</small></li> <li><a href="https://dook.business/@RikSolo">Mastodon</a> <small>(dook.business)</small></li>
{%endif%}
<li><a href="https://instagram.com/RikBerkelder">Instagram</a></li> <li><a href="https://instagram.com/RikBerkelder">Instagram</a></li>
<li><a href="https://github.com/rikberkelder">GitHub</a></li> <li><a href="https://github.com/rikberkelder">GitHub</a></li>
<li><a href="https://git.riksolo.com">Gitea</a></li> <li><a href="https://git.riksolo.com">Gitea</a></li>

Binary file not shown.

View file

@ -1,6 +0,0 @@
---
order: 4
title: DG Theater
description: "National theatre tours with Cirque en Afrique: Kalabante (2024) and African Mama's: The Great Five (2025). Bringing the show's designs to life in varying conditions, and making sure all of the technical lighting aspects of the show are maintained properly and function perfectly every performance."
timeframe: 2024 - now
---

Binary file not shown.

Binary file not shown.

BIN
content/portfolio/doornroosje/1.jpg (Stored with Git LFS)

Binary file not shown.

BIN
content/portfolio/doornroosje/2.jpg (Stored with Git LFS)

Binary file not shown.

BIN
content/portfolio/doornroosje/3.jpg (Stored with Git LFS)

Binary file not shown.

BIN
content/portfolio/doornroosje/4.jpg (Stored with Git LFS)

Binary file not shown.

View file

@ -1,6 +0,0 @@
---
order: 5
title: Doornroosje
description: Making sure visiting technicians have a smooth experience at the iconic Nijmegen venue, and providing fitting lighting on the fly for any act not travelling with their own lighting designer and a variety of dance events.
timeframe: 2024 - now
---

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 MiB

View file

@ -1,7 +1,7 @@
--- ---
order: 2 order: 2
title: Luxor Live title: Luxor Live
description: Delivering dynamic, on-the-spot lighting for visiting acts without their own lighting designer, and ensuring the house system is in perfect shape for visiting technicians. description: Delivering dynamic, on-the-spot lighting for visiting acts without their own lighting designer, and ensuring a smooth experience with the house rig for visiting technicians.
timeframe: 2022 - now timeframe: 2022 - now
--- ---

View file

@ -17,7 +17,8 @@ const conf = {
const images = await Promise.all(files.map(async (image) => { const images = await Promise.all(files.map(async (image) => {
const imagePath = path.resolve(dir + '/' + image); const imagePath = path.resolve(dir + '/' + image);
const exif = await exifr.parse(imagePath, { pick: ['XPComment', 'DateTimeOriginal'] }); //const exif = await exifr.parse(imagePath, { pick: ['XPComment', 'DateTimeOriginal'] });
const exif = {};
return { return {
url: data.page.url + image, url: data.page.url + image,

View file

@ -1,22 +1,19 @@
--- ---
order: 1 order: 1
title: Sowulo title: Sowulo
description: Designing a theatrical, atmospheric and detailed show while and bringing it to a variety venues and festivals of varying sizes with very short on-site preparation times. Highlights include Hellfest, Motocultor, Castlefest and a 2025 EU Headline Tour description: Designing a theatrical, atmospheric and detailed show while and bringing it to a variety venues and festivals of varying sizes with very short on-site preparation times.
timeframe: 2023 - now timeframe: 2023 - now
--- ---
## Notable shows ## Notable shows
- Echos & Merveilles (mainstage) 2025
- Doornroosje, Nijmegen
- 5-show nightliner tour 2025
- P60, Amstelveen
- Motocultor 2024
- Sint Stevenskerk Nijmegen
- Opera Leśna (support Heilung)
- Wave Gothik Treffen 2024
- Echos & Merveilles 2024
- Trolls & Legends 2024
- TivoliVredenburg (Pandora)
- Menuo Juodoragis (mainstage) 2023
- Midgardsblot (mainstage) 2023
- Castlefest (mainstage) 2023 - Castlefest (mainstage) 2023
- Midgardsblot (mainstage) 2023
- Menuo Juodoragis (mainstage) 2023
- TivoliVredenburg (Pandora)
- Trolls & Legends 2024
- Echos & Merveilles 2024
- Wave Gothik Treffen 2024
- Opera Leśna (support Heilung)
- Sint Stevenskerk Nijmegen
- Motocultor 2024
- P60 amstelveen

View file

@ -1,6 +1,6 @@
--- ---
order: 3 order: 3
title: TivoliVredenburg title: TivoliVredenburg
description: Creative and fitting lighting for a wide variety of productions. From sales to classical to jazz to metal, across 5 stages in the venue. As well as making sure the house systems function and adapt perfectly to visiting tours and complex international productions, including regular maintenance and show-specific adaptations. description: Creative and fitting lighting for a wide variety of productions. From sales to classical to jazz to metal, across 5 stages in the venue.
timeframe: 2023 - now timeframe: 2023 - now
--- ---

View file

@ -87,9 +87,11 @@ body {
flex-wrap: wrap !important; flex-wrap: wrap !important;
} }
picture { picture,
img {
display: block; display: block;
height: 15rem; height: 15rem !important;
max-width: 33.33%;
flex-grow: 1; flex-grow: 1;
img { img {

View file

@ -31,7 +31,13 @@ export default async function (eleventyConfig) {
//Images //Images
eleventyConfig.addPlugin(eleventyImageTransformPlugin, { eleventyConfig.addPlugin(eleventyImageTransformPlugin, {
widths: ["700"] widths: ["700"],
formats: ["jpeg", "webp", "gif"],
useCache: true,
sharpOptions: {
animated: true,
limitInputPixels: false
}
}); });
eleventyConfig.addShortcode("figure", (url, alt, caption, width) => { eleventyConfig.addShortcode("figure", (url, alt, caption, width) => {
return ` return `
@ -45,10 +51,15 @@ export default async function (eleventyConfig) {
eleventyConfig.addShortcode("imageUrl", async (image, width) => { eleventyConfig.addShortcode("imageUrl", async (image, width) => {
const img = await Image(`./content${image}`, { const img = await Image(`./content${image}`, {
outputDir: 'dist/img/', outputDir: 'dist/img/',
useCache: true useCache: true,
sharpOptions: {
animated: true,
limitInputPixels: false
}
}); });
return img.jpeg[0].url; const files = img.jpeg ?? img.webp;
return files[0].url;
}); });
//Markdown //Markdown