diff --git a/tpl/tplimpl/embedded/templates/shortcodes/vimeo.html b/tpl/tplimpl/embedded/templates/shortcodes/vimeo.html
index b3fc781a394..d1ec746bbc8 100644
--- a/tpl/tplimpl/embedded/templates/shortcodes/vimeo.html
+++ b/tpl/tplimpl/embedded/templates/shortcodes/vimeo.html
@@ -1,14 +1,52 @@
-{{- $pc := site.Config.Privacy.Vimeo -}}
-{{- if not $pc.Disable -}}
-{{- if $pc.Simple -}}
-{{ template "_internal/shortcodes/vimeo_simple.html" . }}
-{{- else -}}
-{{ if .IsNamedParams }}
-
-
{{ else }}
-
-
-
-{{ end }}
-{{- end -}}
-{{- end -}}
+{{- /*
+Renders an embedded Vimeo video.
+
+Accepts named or positional arguments. If positional, order is id, class,
+title, then loading.
+
+@param {string} [class] The class attribute of the wrapping div element. When specified, removes the style attributes from the iframe element and its wrapping div element.
+@param {string} [id] The video id. Optional if the id is provided as first positional argument.
+@param {string} [loading=eager] The loading attribute of the iframe element.
+@param {string} [title=Vimeo video] The title attribute of the iframe element.
+
+@returns {template.HTML}
+
+@example {{< vimeo 55073825 >}}
+@example {{< vimeo id=55073825 class="foo bar" loading=lazy title="My Video" >}}
+*/}}
+{{- $pc := site.Config.Privacy.Vimeo }}
+{{- if not $pc.Disable }}
+ {{- if $pc.Simple }}
+ {{- template "_internal/shortcodes/vimeo_simple.html" . }}
+ {{- else }}
+ {{- $id := or (.Get "id") (.Get 0) "" }}
+ {{- $class := or (.Get "class") (.Get 1) "" }}
+ {{- $title := or (.Get "title") (.Get 2) "Vimeo video" }}
+ {{- $loading := or (.Get "loading") (.Get 3) "eager" }}
+ {{- $dnt := cond $pc.EnableDNT 1 0 }}
+
+ {{- $divStyle := "position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;" }}
+ {{- $iframeStyle := "position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" }}
+
+ {{- with $id }}
+ {{- $src := printf "https://player.vimeo.com/video/%v?dnt=%v" . $dnt }}
+
+
+
+ {{- else }}
+ {{- errorf "The %q shortcode requires a video id, either as the first positional argument or an argument named id. See %s" .Name .Position }}
+ {{- end }}
+ {{- end }}
+{{- end }}
diff --git a/tpl/tplimpl/shortcodes_integration_test.go b/tpl/tplimpl/shortcodes_integration_test.go
index d669bb33374..dd3cab88f51 100644
--- a/tpl/tplimpl/shortcodes_integration_test.go
+++ b/tpl/tplimpl/shortcodes_integration_test.go
@@ -478,12 +478,12 @@ Content: {{ .Content }}
// Regular mode
b := hugolib.Test(t, files)
- b.AssertFileContent("public/index.html", "d5b2a079cc37d0ed")
+ b.AssertFileContent("public/index.html", "d1f592d2256ac3ff")
// Simple mode
files = strings.ReplaceAll(files, "privacy.vimeo.simple = false", "privacy.vimeo.simple = true")
b = hugolib.Test(t, files)
- b.AssertFileContent("public/index.html", "73b8767ce8bdf694")
+ b.AssertFileContent("public/index.html", "c5bf16d87e2a370b")
// Simple mode with non-existent id
files = strings.ReplaceAll(files, "{{< vimeo 55073825 >}}", "{{< vimeo __id_does_not_exist__ >}}")