summaryrefslogtreecommitdiffstats
path: root/layouts/shortcodes/img.html
blob: fbf96c077f91b6ec2e715454e82a599fee69517f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
{{/*
    Taken from https://www.brycewray.com/posts/2022/06/responsive-optimized-images-hugo/
*/}}

{{- $respSizes := .Site.Params.imageSizes -}}
{{- $src := .Get "src" -}}
{{- $source := resources.Get $src -}}
{{- $alt := .Get "alt" -}}
{{- $divClass := .Get "divClass" -}}
{{/*
    The styling in $imgClass, below, makes
    an image fill the container horizontally
    and adjust its height automatically
    for that, and then fade in for the LQIP effect.
    Feel free to adjust your CSS/SCSS as desired.
*/}}
{{- $imgClass := "animate-fade" -}}
{{- $dataSzes := "(min-width: 1024px) 100vw, 50vw" -}}
{{/*
    Now we'll create the 20-pixel-wide LQIP
    and turn it into Base64-encoded data, which
    is better for performance and caching.
*/}}
{{- $LQIP_img := $source.Resize "20x jpg" -}}
{{- $LQIP_b64 := $LQIP_img.Content | base64Encode -}}
{{/*
    $CFPstyle is for use in styling
    the div's background, as you'll see shortly.
*/}}
{{- $CFPstyle := printf "%s%s%s%v%s" "background: url(data:image/jpeg;base64," $LQIP_b64 "); background-size: cover; background-repeat: no-repeat; width: " $source.Width "px;" -}}
{{/*
    Then, we create a 640-pixel-wide JPG
    of the image. This will serve as the
    "fallback" image for that tiny percentage
    of browsers that don't understand the
    HTML `picture` tag.
*/}}
{{- $actualImg := $source.Resize "640x jpg" -}}
<div class="picture{{with $divClass}} {{.}}{{end}}" style="{{ $CFPstyle | safeCSS }}">
{{/*
    Now we'll build the `picture` which modern
    browsers use to decide which image, and
    which format thereof, to show. Remember to
    put `webp` first, since the browser will use
    the first format it **can** use, and WebP files
    usually are smaller. After WebP, the fallback
    is the universally safe JPG format.
*/}}
    <a href="{{ $source.RelPermalink }}">
        <picture>
            <source
                type="image/webp"
                srcset="
                {{- with $respSizes -}}
                    {{- range $i, $e := $respSizes -}}
                        {{- if ge $source.Width . -}}
                            {{- if $i }}, {{ end -}}{{- ($source.Resize (printf "%vx%v" $e " webp") ).RelPermalink }} {{ . }}w
                        {{- end -}}
                    {{- end -}}
                {{- end -}}"
                sizes="{{ $dataSzes }}"
            />
            <source
                type="image/jpeg"
                srcset="
                {{- with $respSizes -}}
                    {{- range $i, $e := . -}}
                        {{- if ge $source.Width . -}}
                            {{- if $i }}, {{ end -}}{{- ($source.Resize (printf "%vx%v" . " jpg") ).RelPermalink }} {{ . }}w
                        {{- end -}}
                    {{- end -}}
                {{- end -}}"
                sizes="{{ $dataSzes }}"
            />
            <img class="{{ $imgClass }}"
                src="{{ $actualImg.RelPermalink }}"
                width="{{ $source.Width }}"
                height="{{ $source.Height }}"
                alt="{{ $alt }}"
                loading="lazy"
            />
        </picture>
    </a>
</div>