diff --git a/README.md b/README.md
index 9a104206..87d71149 100644
--- a/README.md
+++ b/README.md
@@ -638,6 +638,90 @@ Parameters:
It has the other parameters of the `paige/figure` shortcode.
+### Vimeo
+
+The `paige/vimeo` shortcode provides a responsive Vimeo video.
+
+```
+{{< paige/vimeo
+ autopause=true
+ autoplay=false
+ background=false
+ byline=true
+ color="00adef"
+ controls=true
+ description="My description"
+ dnt=false
+ fullscreen=true
+ keyboard=true
+ loop=false
+ muted=false
+ pip=false
+ playsinline=true
+ portrait=true
+ quality="auto"
+ speed=false
+ texttrack=false
+ time="1m2s"
+ title=true
+ transparent=true
+ video="644036051"
+>}}
+```
+
+Inner content: None.
+
+Parameters:
+
+
+ autopause
+ - Optional. Boolean. Enable playing more than one Vimeo video on the same page. Default is
true
.
+ autoplay
+ - Optional. Boolean. Autoplay the video. Default is
false
.
+ background
+ - Optional. Boolean. Autoplay the video. Hide the controls. Loop the video. Mute the video. Default is
false
.
+ byline
+ - Optional. Boolean. Show the author. Default is configured per video.
+ color
+ - Optional. String. Hex code. Control color. Default is
00adef
.
+ controls
+ - Optional. Boolean. Show the controls. Default is
true
.
+ description
+ - Optional. String. Plain text. Screen reader content. Default is
Vimeo video
.
+ dnt
+ - Optional. Boolean. Do not track session data. Default is
false
.
+ fullscreen
+ - Optional. Boolean. Enable full screen. Default is
true
.
+ keyboard
+ - Optional. Boolean. Enable keyboard input. Default is
true
.
+ loop
+ - Optional. Boolean. Loop the video. Default is
false
.
+ muted
+ - Optional. Boolean. Mute the video. Default is
false
.
+ pip
+ - Optional. Boolean. Show the picture-in-picture control. Default is
false
.
+ playsinline
+ - Optional. Boolean. Play inline instead of full screen on mobile devices. Default is
true
.
+ portrait
+ - Optional. Boolean. Show the author's profile image. Default is configured per video.
+ quality
+ - Optional. String. The resolution. Must be
auto
, 240p
, 360p
, 540p
, 720p
, 1080p
, 2k
, or 4k
. Default is auto
.
+ speed
+ - Optional. Boolean. Show the speed controls. Default is
false
.
+ texttrack
+ - Optional. String. Language code and optionally a locale code (e.g.
en
, en-US
). Use the corresponding subtitles. Default is false
.
+ time
+ - Optional. String. Duration (e.g.
0m
, 1m2s
). Start time. Default is 0m
.
+ title
+ - Optional. Boolean. Show the title. Default is configured per video.
+ transparent
+ - Optional. Boolean. Use a transparent background instead of a black one. Default is
true
.
+ video
+ - Optional. Position 0. String. Video ID.
+
+
+See [Vimeo documentation](https://vimeo.zendesk.com/hc/en-us/articles/360001494447-Player-parameters-overview) for more detail.
+
### YouTube
The `paige/youtube` shortcode provides a responsive YouTube video.
diff --git a/exampleSite/content/blog/vimeo-shortcode.md b/exampleSite/content/blog/vimeo-shortcode.md
new file mode 100644
index 00000000..97cfcc6c
--- /dev/null
+++ b/exampleSite/content/blog/vimeo-shortcode.md
@@ -0,0 +1,87 @@
+---
+categories: [paige]
+date: 2023-01-22
+description: Demonstration of the Paige Vimeo shortcode.
+tags: [shortcodes, videos]
+title: Vimeo Shortcode
+---
+
+Code:
+
+```go-text-template
+{{* paige/vimeo "644036051" */>}}
+```
+
+Result:
+
+{{< paige/vimeo "644036051" >}}
+
+---
+
+Code:
+
+```go-text-template
+{{* paige/vimeo video="644036051" */>}}
+```
+
+Result:
+
+{{< paige/vimeo video="644036051" >}}
+
+---
+
+Code:
+
+```go-text-template
+{{* paige/vimeo
+ autopause=true
+ autoplay=false
+ background=false
+ byline=true
+ color="00adef"
+ controls=true
+ description="My description"
+ dnt=false
+ fullscreen=true
+ keyboard=true
+ loop=false
+ muted=false
+ pip=false
+ playsinline=true
+ portrait=true
+ quality="auto"
+ speed=false
+ texttrack=false
+ time="1m2s"
+ title=true
+ transparent=true
+ video="644036051"
+*/>}}
+```
+
+Result:
+
+{{< paige/vimeo
+ autopause=true
+ autoplay=false
+ background=false
+ byline=true
+ color="00adef"
+ controls=true
+ description="My description"
+ dnt=false
+ fullscreen=true
+ keyboard=true
+ loop=false
+ muted=false
+ pip=false
+ playsinline=true
+ portrait=true
+ quality="auto"
+ speed=false
+ texttrack=false
+ time="1m2s"
+ title=true
+ transparent=true
+ video="644036051"
+>}}
diff --git a/layouts/shortcodes/paige/vimeo.html b/layouts/shortcodes/paige/vimeo.html
new file mode 100644
index 00000000..71ff2b04
--- /dev/null
+++ b/layouts/shortcodes/paige/vimeo.html
@@ -0,0 +1,106 @@
+{{ $autopause := .Get "autopause" | default true }}
+{{ $autoplay := .Get "autoplay" }}
+{{ $background := .Get "background" }}
+{{ $byline := .Get "byline" | default true }}
+{{ $color := .Get "color" }}
+{{ $controls := .Get "controls" | default true }}
+{{ $description := .Get "title" | default "Vimeo video" }}
+{{ $dnt := .Get "dnt" | default .Page.Site.Config.Privacy.Vimeo.EnableDNT }}
+{{ $fullscreen := .Get "fullscreen" | default true }}
+{{ $keyboard := .Get "keyboard" | default true }}
+{{ $loop := .Get "loop" }}
+{{ $muted := .Get "muted" }}
+{{ $pip := .Get "pip" }}
+{{ $playsinline := .Get "playsinline" | default true }}
+{{ $portrait := .Get "portrait" }}
+{{ $quality := .Get "quality" }}
+{{ $speed := .Get "speed" }}
+{{ $time := .Get "time" }}
+{{ $texttrack := .Get "texttrack" }}
+{{ $title := .Get "title" }}
+{{ $transparent := .Get "transparent" | default true }}
+{{ $video := .Get 0 | default (.Get "video") }}
+
+{{ $params := slice }}
+
+{{ if not $autopause }}
+ {{ $params = $params | append "autopause=0" }}
+{{ end }}
+
+{{ if $autoplay }}
+ {{ $params = $params | append "autoplay=1" }}
+{{ end }}
+
+{{ if $background }}
+ {{ $params = $params | append "background=1" }}
+{{ end }}
+
+{{ if and (ne $byline nil) (ne $byline "") }}
+ {{ $params = $params | append (printf "portrait=%v" (cond $byline 1 0)) }}
+{{ end }}
+
+{{ with $color }}
+ {{ $params = $params | append (printf "color=%v" .) }}
+{{ end }}
+
+{{ if not $controls }}
+ {{ $params = $params | append "controls=0" }}
+{{ end }}
+
+{{ if $dnt }}
+ {{ $params = $params | append "dnt=1" }}
+{{ end }}
+
+{{ if not $keyboard }}
+ {{ $params = $params | append "keyboard=0" }}
+{{ end }}
+
+{{ if $loop }}
+ {{ $params = $params | append "loop=1" }}
+{{ end }}
+
+{{ if $muted }}
+ {{ $params = $params | append "muted=1" }}
+{{ end }}
+
+{{ if $pip }}
+ {{ $params = $params | append "pip=1" }}
+{{ end }}
+
+{{ if not $playsinline }}
+ {{ $params = $params | append "playsinline=0" }}
+{{ end }}
+
+{{ if and (ne $portrait nil) (ne $portrait "") }}
+ {{ $params = $params | append (printf "portrait=%v" (cond $portrait 1 0)) }}
+{{ end }}
+
+{{ with $quality }}
+ {{ $params = $params | append (printf "quality=%v" .) }}
+{{ end }}
+
+{{ if $speed }}
+ {{ $params = $params | append "speed=1" }}
+{{ end }}
+
+{{ with $texttrack }}
+ {{ $params = $params | append (printf "texttrack=%v" .) }}
+{{ end }}
+
+{{ with $time }}
+ {{ $params = $params | append (printf "#t=%v" .) }}
+{{ end }}
+
+{{ if and (ne $title nil) (ne $title "") }}
+ {{ $params = $params | append (printf "title=%v" (cond $title 1 0)) }}
+{{ end }}
+
+{{ if not $transparent }}
+ {{ $params = $params | append "transparent=0" }}
+{{ end }}
+
+{{ $params = delimit ($params | sort | uniq) "&" }}
+
+
+
+