aboutsummaryrefslogtreecommitdiff
path: root/site/layouts
diff options
context:
space:
mode:
authorBobby <[email protected]>2024-08-16 20:47:33 -0400
committerGitHub <[email protected]>2024-08-16 20:47:33 -0400
commit6b28433d9cfde435be8ec2bd6cf91e6324d08865 (patch)
tree8343c27b8b95ff5639233e81cf157f92e5688466 /site/layouts
parentd53094ec16ba385faae2973ddee648698b32ab24 (diff)
parent048f56f51460df75e92a2f7b472e1c56baeb68f7 (diff)
downloadbootstrap-main.tar.xz
bootstrap-main.zip
Merge branch 'twbs:main' into mainHEADmain
Diffstat (limited to 'site/layouts')
-rw-r--r--site/layouts/_default/_markup/render-heading.html7
-rw-r--r--site/layouts/_default/_markup/render-image.html8
-rw-r--r--site/layouts/_default/baseof.html3
-rw-r--r--site/layouts/_default/docs.html48
-rw-r--r--site/layouts/_default/examples.html99
-rw-r--r--site/layouts/_default/home.html10
-rw-r--r--site/layouts/_default/single.html42
-rw-r--r--site/layouts/partials/analytics.html8
-rw-r--r--site/layouts/partials/callout-danger-async-methods.md5
-rw-r--r--site/layouts/partials/callout-info-npm-starter.md1
-rw-r--r--site/layouts/partials/callout-warning-color-assistive-technologies.md3
-rw-r--r--site/layouts/partials/callout-warning-input-support.md3
-rw-r--r--site/layouts/partials/callouts/danger-async-methods.md1
-rw-r--r--site/layouts/partials/callouts/info-mediaqueries-breakpoints.md (renamed from site/layouts/partials/callout-info-mediaqueries-breakpoints.md)0
-rw-r--r--site/layouts/partials/callouts/info-npm-starter.md1
-rw-r--r--site/layouts/partials/callouts/info-prefersreducedmotion.md (renamed from site/layouts/partials/callout-info-prefersreducedmotion.md)0
-rw-r--r--site/layouts/partials/callouts/info-sanitizer.md (renamed from site/layouts/partials/callout-info-sanitizer.md)0
-rw-r--r--site/layouts/partials/callouts/warning-color-assistive-technologies.md1
-rw-r--r--site/layouts/partials/callouts/warning-data-bs-title-vs-title.md1
-rw-r--r--site/layouts/partials/callouts/warning-input-support.md1
-rw-r--r--site/layouts/partials/docs-navbar.html137
-rw-r--r--site/layouts/partials/docs-sidebar.html38
-rw-r--r--site/layouts/partials/docs-subnav.html14
-rw-r--r--site/layouts/partials/docs-versions.html56
-rw-r--r--site/layouts/partials/examples/bs-themes.html17
-rw-r--r--site/layouts/partials/examples/icons.html15
-rw-r--r--site/layouts/partials/examples/main.html63
-rw-r--r--site/layouts/partials/favicons.html5
-rw-r--r--site/layouts/partials/footer.html32
-rw-r--r--site/layouts/partials/guide-footer.md3
-rw-r--r--site/layouts/partials/header.html11
-rw-r--r--site/layouts/partials/home/components-utilities.html88
-rw-r--r--site/layouts/partials/home/css-variables.html48
-rw-r--r--site/layouts/partials/home/customize.html59
-rw-r--r--site/layouts/partials/home/get-started.html58
-rw-r--r--site/layouts/partials/home/icons.html23
-rw-r--r--site/layouts/partials/home/masthead-followup.html87
-rw-r--r--site/layouts/partials/home/masthead.html54
-rw-r--r--site/layouts/partials/home/plugins.html66
-rw-r--r--site/layouts/partials/home/themes.html23
-rw-r--r--site/layouts/partials/icons.html84
-rw-r--r--site/layouts/partials/icons/bootstrap-logo-solid.svg1
-rw-r--r--site/layouts/partials/icons/bootstrap.svg1
-rw-r--r--site/layouts/partials/icons/circle-square.svg2
-rw-r--r--site/layouts/partials/icons/cloud-fill.svg3
-rw-r--r--site/layouts/partials/icons/code.svg3
-rw-r--r--site/layouts/partials/icons/collapse.svg4
-rw-r--r--site/layouts/partials/icons/droplet-fill.svg2
-rw-r--r--site/layouts/partials/icons/expand.svg4
-rw-r--r--site/layouts/partials/icons/homepage-hero.svg1
-rw-r--r--site/layouts/partials/icons/list.svg3
-rw-r--r--site/layouts/partials/icons/menu.svg1
-rw-r--r--site/layouts/partials/icons/slack.svg1
-rw-r--r--site/layouts/partials/js-data-attributes.md5
-rw-r--r--site/layouts/partials/responsive-img.html22
-rw-r--r--site/layouts/partials/scripts.html46
-rw-r--r--site/layouts/partials/social.html32
-rw-r--r--site/layouts/partials/stylesheet.html21
-rw-r--r--site/layouts/partials/theme-toggler.html34
-rw-r--r--site/layouts/robots.txt3
-rw-r--r--site/layouts/shortcodes/added-in.html5
-rw-r--r--site/layouts/shortcodes/bs-table.html3
-rw-r--r--site/layouts/shortcodes/callout-deprecated-dark-variants.html9
-rw-r--r--site/layouts/shortcodes/deprecated-in.html5
-rw-r--r--site/layouts/shortcodes/docsref.html3
-rw-r--r--site/layouts/shortcodes/example.html47
-rw-r--r--site/layouts/shortcodes/js-dismiss.html4
-rw-r--r--site/layouts/shortcodes/js-docs.html70
-rw-r--r--site/layouts/shortcodes/placeholder.html23
-rw-r--r--site/layouts/shortcodes/scss-docs.html43
-rw-r--r--site/layouts/sitemap.xml12
71 files changed, 1247 insertions, 389 deletions
diff --git a/site/layouts/_default/_markup/render-heading.html b/site/layouts/_default/_markup/render-heading.html
new file mode 100644
index 000000000..d115f85dc
--- /dev/null
+++ b/site/layouts/_default/_markup/render-heading.html
@@ -0,0 +1,7 @@
+{{- $id := .Anchor | safeURL -}}
+{{- $text := .Text | safeHTML -}}
+<h{{ .Level }} id="{{ $id }}">{{ $text }}
+{{- if and (ge .Level .Page.Site.Params.anchors.min) (le .Level .Page.Site.Params.anchors.max) }}{{" " -}}
+<a class="anchor-link" href="#{{ $id }}" aria-label="Link to this section: {{ $text }}"></a>
+{{- end -}}
+</h{{ .Level }}>
diff --git a/site/layouts/_default/_markup/render-image.html b/site/layouts/_default/_markup/render-image.html
new file mode 100644
index 000000000..fd089f7be
--- /dev/null
+++ b/site/layouts/_default/_markup/render-image.html
@@ -0,0 +1,8 @@
+{{- $originalSrc := .Destination | safeURL -}}
+{{- $localImgPath := path.Join "/site/static/docs" site.Params.docs_version $originalSrc -}}
+{{- /* This shouldn't be needed but we have a weird folder structure with version included... */ -}}
+{{- $src := urls.JoinPath "/docs" site.Params.docs_version $originalSrc -}}
+{{- $config := imageConfig $localImgPath -}}
+{{- $classes := "d-block img-fluid" -}}
+
+<img src="{{ $src }}" class="{{ $classes }}" alt="{{ .Text }}" width="{{ $config.Width }}" height="{{ $config.Height }}" loading="lazy">
diff --git a/site/layouts/_default/baseof.html b/site/layouts/_default/baseof.html
index 713ab2864..0714faf3a 100644
--- a/site/layouts/_default/baseof.html
+++ b/site/layouts/_default/baseof.html
@@ -1,10 +1,11 @@
<!doctype html>
-<html lang="en">
+<html lang="en" data-bs-theme="auto">
<head>
{{ partial "header" . }}
</head>
{{ block "body_override" . }}<body>{{ end }}
{{ partial "skippy" . }}
+ {{ partial "icons" . }}
{{ partial "docs-navbar" . }}
diff --git a/site/layouts/_default/docs.html b/site/layouts/_default/docs.html
index dd063c5dc..3f9463bdd 100644
--- a/site/layouts/_default/docs.html
+++ b/site/layouts/_default/docs.html
@@ -1,29 +1,52 @@
+{{ define "body_override" }}<body{{ if (eq .Page.Params.toc true) }} data-bs-spy="scroll" data-bs-target="#TableOfContents"{{ end }}>{{ end }}
{{ define "main" }}
- {{ partial "docs-subnav" . }}
-
- <div class="container-xxl my-md-4 bd-layout">
+ <div class="container-xxl bd-gutter mt-3 my-md-4 bd-layout">
<aside class="bd-sidebar">
- {{ partial "docs-sidebar" . }}
+ <div class="offcanvas-lg offcanvas-start" tabindex="-1" id="bdSidebar" aria-labelledby="bdSidebarOffcanvasLabel">
+ <div class="offcanvas-header border-bottom">
+ <h5 class="offcanvas-title" id="bdSidebarOffcanvasLabel">Browse docs</h5>
+ <button type="button" class="btn-close" data-bs-dismiss="offcanvas" aria-label="Close" data-bs-target="#bdSidebar"></button>
+ </div>
+
+ <div class="offcanvas-body">
+ {{ partial "docs-sidebar" . }}
+ </div>
+ </div>
</aside>
<main class="bd-main order-1">
- <div class="bd-intro ps-lg-4">
+ <div class="bd-intro pt-2 ps-lg-2">
<div class="d-md-flex flex-md-row-reverse align-items-center justify-content-between">
- <a class="btn btn-sm btn-bd-light mb-2 mb-md-0" href="{{ .Site.Params.repo }}/blob/main/site/content/{{ .Page.File.Path | replaceRE `\\` "/" }}" title="View and edit this file on GitHub" target="_blank" rel="noopener">View on GitHub</a>
- <h1 class="bd-title" id="content">{{ .Title | markdownify }}</h1>
+ <div class="mb-3 mb-md-0 d-flex text-nowrap">
+ {{- /* This is needed because we want to show the badge if show_badge isn't present or is set to false */ -}}
+ {{- if (or (and (.Page.Params.added) (not (isset .Page.Params.added "show_badge"))) (and (.Page.Params.added) (isset .Page.Params.added "show_badge") (not (eq .Page.Params.added.show_badge false)))) -}}
+ <small class="d-inline-flex px-2 py-1 fw-semibold text-success-emphasis bg-success-subtle border border-success-subtle rounded-2 me-2">Added in v{{ .Page.Params.added.version }}</small>
+ {{- end -}}
+ <a class="btn btn-sm btn-bd-light rounded-2" href="{{ .Site.Params.repo }}/blob/v{{ .Site.Params.current_version }}/site/content/{{ .Page.File.Path | replaceRE `\\` "/" }}" title="View and edit this file on GitHub" target="_blank" rel="noopener">
+ View on GitHub
+ </a>
+ </div>
+ <h1 class="bd-title mb-0" id="content">{{ .Title | markdownify }}</h1>
</div>
<p class="bd-lead">{{ .Page.Params.Description | markdownify }}</p>
{{ partial "ads" . }}
</div>
{{ if (eq .Page.Params.toc true) }}
- <div class="bd-toc mt-4 mb-5 my-md-0 ps-xl-3 mb-lg-5 text-muted">
- <strong class="d-block h6 my-2 pb-2 border-bottom">On this page</strong>
- {{ .TableOfContents }}
+ <div class="bd-toc mt-3 mb-5 my-lg-0 mb-lg-5 px-sm-1 text-body-secondary">
+ <button class="btn btn-link p-md-0 mb-2 mb-md-0 text-decoration-none bd-toc-toggle d-md-none" type="button" data-bs-toggle="collapse" data-bs-target="#tocContents" aria-expanded="false" aria-controls="tocContents">
+ On this page
+ <svg class="bi d-md-none ms-2" aria-hidden="true"><use xlink:href="#chevron-expand"></use></svg>
+ </button>
+ <strong class="d-none d-md-block h6 my-2 ms-3">On this page</strong>
+ <hr class="d-none d-md-block my-2 ms-3">
+ <div class="collapse bd-toc-collapse" id="tocContents">
+ {{ .TableOfContents }}
+ </div>
</div>
{{ end }}
- <div class="bd-content ps-lg-4">
+ <div class="bd-content ps-lg-2">
{{ if .Page.Params.sections }}
<div class="row g-3">
{{ range .Page.Params.sections }}
@@ -44,6 +67,7 @@
{{ end }}
{{ define "footer" }}
{{ range .Page.Params.extra_js -}}
- <script{{ with .async }} async{{ end }} src="{{ .src }}"></script>
+ <script{{ with .async }} async{{ end }}{{ with .defer }} defer{{ end }} src="{{ .src }}"></script>
{{- end -}}
+ <div class="position-fixed" aria-hidden="true"><input type="text" tabindex="-1"></div>
{{ end }}
diff --git a/site/layouts/_default/examples.html b/site/layouts/_default/examples.html
index 948c3756f..1c31c5aea 100644
--- a/site/layouts/_default/examples.html
+++ b/site/layouts/_default/examples.html
@@ -1,5 +1,5 @@
<!doctype html>
-<html {{ if eq .Page.Params.direction "rtl" }}lang="ar" dir="rtl"{{ else }}lang="en"{{ end }}{{ with .Page.Params.html_class }} class="{{ . }}"{{ end }}>
+<html {{ if eq .Page.Params.direction "rtl" }}lang="ar" dir="rtl"{{ else }}lang="en"{{ end }}{{ with .Page.Params.html_class }} class="{{ . }}"{{ end }} data-bs-theme="auto">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
@@ -14,6 +14,9 @@
<meta name="robots" content="{{ . }}">
{{- end }}
+ {{- $colorModeJS := urls.JoinPath "/docs" $.Site.Params.docs_version "assets/js/color-modes.js" -}}
+ <script src="{{ $colorModeJS }}"></script>
+
{{ partial "stylesheet" . }}
{{ partial "favicons" . }}
@@ -31,26 +34,98 @@
font-size: 3.5rem;
}
}
+
+ .b-example-divider {
+ width: 100%;
+ height: 3rem;
+ background-color: rgba(0, 0, 0, .1);
+ border: solid rgba(0, 0, 0, .15);
+ border-width: 1px 0;
+ box-shadow: inset 0 .5em 1.5em rgba(0, 0, 0, .1), inset 0 .125em .5em rgba(0, 0, 0, .15);
+ }
+
+ .b-example-vr {
+ flex-shrink: 0;
+ width: 1.5rem;
+ height: 100vh;
+ }
+
+ .bi {
+ vertical-align: -.125em;
+ fill: currentColor;
+ }
+
+ .nav-scroller {
+ position: relative;
+ z-index: 2;
+ height: 2.75rem;
+ overflow-y: hidden;
+ }
+
+ .nav-scroller .nav {
+ display: flex;
+ flex-wrap: nowrap;
+ padding-bottom: 1rem;
+ margin-top: -1px;
+ overflow-x: auto;
+ text-align: center;
+ white-space: nowrap;
+ -webkit-overflow-scrolling: touch;
+ }
+
+ .btn-bd-primary {
+ --bd-violet-bg: #712cf9;
+ --bd-violet-rgb: 112.520718, 44.062154, 249.437846;
+
+ --bs-btn-font-weight: 600;
+ --bs-btn-color: var(--bs-white);
+ --bs-btn-bg: var(--bd-violet-bg);
+ --bs-btn-border-color: var(--bd-violet-bg);
+ --bs-btn-hover-color: var(--bs-white);
+ --bs-btn-hover-bg: #6528e0;
+ --bs-btn-hover-border-color: #6528e0;
+ --bs-btn-focus-shadow-rgb: var(--bd-violet-rgb);
+ --bs-btn-active-color: var(--bs-btn-hover-color);
+ --bs-btn-active-bg: #5a23c8;
+ --bs-btn-active-border-color: #5a23c8;
+ }
+
+ .bd-mode-toggle {
+ z-index: 1500;
+ }
+
+ .bd-mode-toggle .bi {
+ width: 1em;
+ height: 1em;
+ }
+
+ .bd-mode-toggle .dropdown-menu .active .bi {
+ display: block !important;
+ }
</style>
- {{ range .Page.Params.extra_css }}
+ {{ range .Page.Params.extra_css -}}
{{ "<!-- Custom styles for this template -->" | safeHTML }}
<link href="{{ . }}" rel="stylesheet">
{{- end }}
</head>
<body{{ with .Page.Params.body_class }} class="{{ . }}"{{ end }}>
- {{ .Content }}
+ {{ partial "examples/icons" . }}
- {{ if ne .Page.Params.include_js false -}}
- {{- if eq hugo.Environment "production" -}}
- <script src="/docs/{{ .Site.Params.docs_version }}/dist/js/bootstrap.bundle.min.js" {{ printf "integrity=%q" .Site.Params.cdn.js_bundle_hash | safeHTMLAttr }} crossorigin="anonymous"></script>
- {{- else -}}
- <script src="/docs/{{ .Site.Params.docs_version }}/dist/js/bootstrap.bundle.js"></script>
- {{- end }}
+ <div class="dropdown position-fixed bottom-0 end-0 mb-3 me-3 bd-mode-toggle">
+ {{ partial "theme-toggler" . }}
+ </div>
- {{ range .Page.Params.extra_js -}}
- <script{{ with .async }} async{{ end }} src="{{ .src }}"{{ with .integrity }} {{ printf "integrity=%q" . | safeHTMLAttr }} crossorigin="anonymous"{{ end }}></script>
- {{- end -}}
+ {{ .Content }}
+
+ {{- if hugo.IsProduction -}}
+ <script defer src="/docs/{{ .Site.Params.docs_version }}/dist/js/bootstrap.bundle.min.js" {{ printf "integrity=%q" .Site.Params.cdn.js_bundle_hash | safeHTMLAttr }}></script>
+ {{- else -}}
+ <script defer src="/docs/{{ .Site.Params.docs_version }}/dist/js/bootstrap.bundle.js"></script>
{{- end }}
+
+ {{ range .Page.Params.extra_js -}}
+ <script{{ with .async }} async{{ end }}{{ with .defer }} defer{{ end }} src="{{ .src }}"{{ with .integrity }} {{ printf "integrity=%q" . | safeHTMLAttr }} crossorigin="anonymous"{{ end }}></script>
+ {{- end -}}
</body>
</html>
diff --git a/site/layouts/_default/home.html b/site/layouts/_default/home.html
index 28bcf0c64..878e77474 100644
--- a/site/layouts/_default/home.html
+++ b/site/layouts/_default/home.html
@@ -1,7 +1,15 @@
{{ define "main" }}
<main>
{{ partial "home/masthead" . }}
- {{ partial "home/masthead-followup" . }}
+ <div class="container-xxl bd-gutter masthead-followup">
+ {{ partial "home/get-started" . }}
+ {{ partial "home/customize" . }}
+ {{ partial "home/css-variables" . }}
+ {{ partial "home/components-utilities" . }}
+ {{ partial "home/plugins" . }}
+ {{ partial "home/icons" . }}
+ {{ partial "home/themes" . }}
+ </div>
</main>
{{ .Content }}
diff --git a/site/layouts/_default/single.html b/site/layouts/_default/single.html
index 8ba99c718..d0d5e6b5d 100644
--- a/site/layouts/_default/single.html
+++ b/site/layouts/_default/single.html
@@ -1,16 +1,21 @@
{{ define "main" }}
<header class="py-5 border-bottom">
- <div class="container pt-md-1 pb-md-4">
+ <div class="container-xxl bd-gutter pt-md-1 pb-md-4">
<div class="row">
<div class="col-xl-8">
<h1 class="bd-title mt-0">{{ .Title | markdownify }}</h1>
<p class="bd-lead">{{ .Page.Params.Description | markdownify }}</p>
- {{ if eq .Title "Examples" }}
- <div class="d-flex flex-column flex-sm-row">
- <a href="{{ .Site.Params.download.dist_examples }}" class="btn btn-lg btn-bd-primary" onclick="ga('send', 'event', 'Examples', 'Hero', 'Download Examples');">Download examples</a>
- <a href="{{ .Site.Params.download.source }}" class="btn btn-lg btn-outline-secondary mt-3 mt-sm-0 ms-sm-3" onclick="ga('send', 'event', 'Examples', 'Hero', 'Download');">Download source code</a>
+ {{ if eq .Title "Examples" -}}
+ <div class="d-flex flex-column flex-md-row gap-3">
+ <a href="{{ .Site.Params.download.dist_examples }}" class="btn btn-lg bd-btn-lg btn-bd-primary d-flex align-items-center justify-content-center fw-semibold">
+ <svg class="bi me-2" aria-hidden="true"><use xlink:href="#box-seam"></use></svg>
+ Download examples
+ </a>
+ <a href="{{ .Site.Params.download.source }}" class="btn btn-lg bd-btn-lg btn-outline-secondary">
+ Download source code
+ </a>
</div>
- {{ end }}
+ {{- end }}
</div>
<div class="col-xl-4 d-lg-flex justify-content-xl-end">
{{ partial "ads" . }}
@@ -20,28 +25,13 @@
</header>
<main class="bd-content order-1 py-5" id="content">
- <div class="container">
+ <div class="container-xxl bd-gutter">
{{ .Content }}
- {{ if eq .Title "Examples" }}
- <hr class="my-5">
- <div class="container">
- <div class="text-center">
- <div class="masthead-followup-icon d-inline-block mb-2 text-white bg-danger">
- {{ partial "icons/droplet-fill.svg" (dict "width" "32" "height" "32") }}
- </div>
- <h2 class="display-6 fw-normal">Go further with Bootstrap Themes</h2>
- <p class="col-md-10 col-lg-8 mx-auto lead">
- Need something more than these examples? Take Bootstrap to the next level with premium themes from the <a href="{{ .Site.Params.themes }}">official Bootstrap Themes marketplace</a>. They’re built as their own extended frameworks, rich with new components and plugins, documentation, and powerful build tools.
- </p>
- <a href="{{ .Site.Params.themes }}" class="btn btn-lg btn-outline-primary mb-3">Browse themes</a>
- </div>
- <img class="d-block img-fluid mt-3 mx-auto" srcset="/docs/{{ .Site.Params.docs_version }}/assets/img/bootstrap-themes-collage.png,
- /docs/{{ .Site.Params.docs_version }}/assets/img/[email protected] 2x"
- src="/docs/{{ .Site.Params.docs_version }}/assets/img/bootstrap-themes-collage.png"
- alt="Bootstrap Themes" width="1150" height="320" loading="lazy">
- </div>
- {{ end }}
+ {{ if eq .Title "Examples" -}}
+ {{ partial "examples/main" . }}
+ {{ partial "examples/bs-themes" . }}
+ {{- end }}
</div>
</main>
{{ end }}
diff --git a/site/layouts/partials/analytics.html b/site/layouts/partials/analytics.html
index ded6e7244..7bc14907b 100644
--- a/site/layouts/partials/analytics.html
+++ b/site/layouts/partials/analytics.html
@@ -1,7 +1 @@
-<script>
- window.ga=window.ga||function(){(ga.q=ga.q||[]).push(arguments)};ga.l=+new Date;
- ga('create', 'UA-146052-10', 'getbootstrap.com');
- ga('set', 'anonymizeIp', true);
- ga('send', 'pageview');
-</script>
-<script async src="https://www.google-analytics.com/analytics.js"></script>
+<script defer src="https://cdn.usefathom.com/script.js" data-site="{{ .Site.Params.analytics.fathom_site }}"></script>
diff --git a/site/layouts/partials/callout-danger-async-methods.md b/site/layouts/partials/callout-danger-async-methods.md
deleted file mode 100644
index c8afdc2df..000000000
--- a/site/layouts/partials/callout-danger-async-methods.md
+++ /dev/null
@@ -1,5 +0,0 @@
-#### Asynchronous methods and transitions
-
-All API methods are **asynchronous** and start a **transition**. They return to the caller as soon as the transition is started but **before it ends**. In addition, a method call on a **transitioning component will be ignored**.
-
-[See our JavaScript documentation for more information](/docs/{{ .Site.Params.docs_version }}/getting-started/javascript/#asynchronous-functions-and-transitions).
diff --git a/site/layouts/partials/callout-info-npm-starter.md b/site/layouts/partials/callout-info-npm-starter.md
deleted file mode 100644
index bbd3897b5..000000000
--- a/site/layouts/partials/callout-info-npm-starter.md
+++ /dev/null
@@ -1 +0,0 @@
-**Get started with Bootstrap via npm with our starter project!** Head to the [twbs/bootstrap-npm-starter](https://github.com/twbs/bootstrap-npm-starter) template repository to see how to build and customize Bootstrap in your own npm project. Includes Sass compiler, Autoprefixer, Stylelint, PurgeCSS, and Bootstrap Icons.
diff --git a/site/layouts/partials/callout-warning-color-assistive-technologies.md b/site/layouts/partials/callout-warning-color-assistive-technologies.md
deleted file mode 100644
index 35683281d..000000000
--- a/site/layouts/partials/callout-warning-color-assistive-technologies.md
+++ /dev/null
@@ -1,3 +0,0 @@
-##### Conveying meaning to assistive technologies
-
-Using color to add meaning only provides a visual indication, which will not be conveyed to users of assistive technologies – such as screen readers. Ensure that information denoted by the color is either obvious from the content itself (e.g. the visible text), or is included through alternative means, such as additional text hidden with the `.visually-hidden` class.
diff --git a/site/layouts/partials/callout-warning-input-support.md b/site/layouts/partials/callout-warning-input-support.md
deleted file mode 100644
index 7b0c8b412..000000000
--- a/site/layouts/partials/callout-warning-input-support.md
+++ /dev/null
@@ -1,3 +0,0 @@
-##### Date & color input support
-
-Keep in mind date inputs are [not fully supported](https://caniuse.com/input-datetime) by all browsers, namely Safari.
diff --git a/site/layouts/partials/callouts/danger-async-methods.md b/site/layouts/partials/callouts/danger-async-methods.md
new file mode 100644
index 000000000..f067502d3
--- /dev/null
+++ b/site/layouts/partials/callouts/danger-async-methods.md
@@ -0,0 +1 @@
+**All API methods are asynchronous and start a transition.** They return to the caller as soon as the transition is started, but before it ends. In addition, a method call on a transitioning component will be ignored. [Learn more in our JavaScript docs.](/docs/{{ .Site.Params.docs_version }}/getting-started/javascript/#asynchronous-functions-and-transitions)
diff --git a/site/layouts/partials/callout-info-mediaqueries-breakpoints.md b/site/layouts/partials/callouts/info-mediaqueries-breakpoints.md
index 2eea77138..2eea77138 100644
--- a/site/layouts/partials/callout-info-mediaqueries-breakpoints.md
+++ b/site/layouts/partials/callouts/info-mediaqueries-breakpoints.md
diff --git a/site/layouts/partials/callouts/info-npm-starter.md b/site/layouts/partials/callouts/info-npm-starter.md
new file mode 100644
index 000000000..cc4a50e68
--- /dev/null
+++ b/site/layouts/partials/callouts/info-npm-starter.md
@@ -0,0 +1 @@
+**Get started with Bootstrap via npm with our starter project!** Head to the [Sass & JS example](https://github.com/twbs/examples/tree/main/sass-js) template repository to see how to build and customize Bootstrap in your own npm project. Includes Sass compiler, Autoprefixer, Stylelint, PurgeCSS, and Bootstrap Icons.
diff --git a/site/layouts/partials/callout-info-prefersreducedmotion.md b/site/layouts/partials/callouts/info-prefersreducedmotion.md
index d258fbe48..d258fbe48 100644
--- a/site/layouts/partials/callout-info-prefersreducedmotion.md
+++ b/site/layouts/partials/callouts/info-prefersreducedmotion.md
diff --git a/site/layouts/partials/callout-info-sanitizer.md b/site/layouts/partials/callouts/info-sanitizer.md
index ee0eda48e..ee0eda48e 100644
--- a/site/layouts/partials/callout-info-sanitizer.md
+++ b/site/layouts/partials/callouts/info-sanitizer.md
diff --git a/site/layouts/partials/callouts/warning-color-assistive-technologies.md b/site/layouts/partials/callouts/warning-color-assistive-technologies.md
new file mode 100644
index 000000000..075bf3609
--- /dev/null
+++ b/site/layouts/partials/callouts/warning-color-assistive-technologies.md
@@ -0,0 +1 @@
+**Accessibility tip:** Using color to add meaning only provides a visual indication, which will not be conveyed to users of assistive technologies like screen readers. Please ensure the meaning is obvious from the content itself (e.g., the visible text with a [*sufficient* color contrast](/docs/{{ .Site.Params.docs_version }}/getting-started/accessibility/#color-contrast)) or is included through alternative means, such as additional text hidden with the `.visually-hidden` class.
diff --git a/site/layouts/partials/callouts/warning-data-bs-title-vs-title.md b/site/layouts/partials/callouts/warning-data-bs-title-vs-title.md
new file mode 100644
index 000000000..e932f22ad
--- /dev/null
+++ b/site/layouts/partials/callouts/warning-data-bs-title-vs-title.md
@@ -0,0 +1 @@
+Feel free to use either `title` or `data-bs-title` in your HTML. When `title` is used, Popper will replace it automatically with `data-bs-title` when the element is rendered.
diff --git a/site/layouts/partials/callouts/warning-input-support.md b/site/layouts/partials/callouts/warning-input-support.md
new file mode 100644
index 000000000..f9d9c0abd
--- /dev/null
+++ b/site/layouts/partials/callouts/warning-input-support.md
@@ -0,0 +1 @@
+Some date inputs types are [not fully supported](https://caniuse.com/input-datetime) by the latest versions of Safari and Firefox.
diff --git a/site/layouts/partials/docs-navbar.html b/site/layouts/partials/docs-navbar.html
index e120c9c74..3576ef4a4 100644
--- a/site/layouts/partials/docs-navbar.html
+++ b/site/layouts/partials/docs-navbar.html
@@ -1,65 +1,92 @@
-<header class="navbar navbar-expand-md navbar-dark bd-navbar">
- <nav class="container-xxl flex-wrap flex-md-nowrap" aria-label="Main navigation">
- <a class="navbar-brand p-0 me-2" href="/" aria-label="Bootstrap">
+<header class="navbar navbar-expand-lg bd-navbar sticky-top">
+ <nav class="container-xxl bd-gutter flex-wrap flex-lg-nowrap" aria-label="Main navigation">
+ {{- if eq .Layout "docs" }}
+ <div class="bd-navbar-toggle">
+ <button class="navbar-toggler p-2" type="button" data-bs-toggle="offcanvas" data-bs-target="#bdSidebar" aria-controls="bdSidebar" aria-label="Toggle docs navigation">
+ {{ partial "icons/hamburger.svg" (dict "class" "bi" "width" "24" "height" "24") }}
+ <span class="d-none fs-6 pe-1">Browse</span>
+ </button>
+ </div>
+ {{- else }}
+ <div class="d-lg-none" style="width: 4.25rem;"></div>
+ {{- end }}
+
+ <a class="navbar-brand p-0 me-0 me-lg-2" href="/" aria-label="Bootstrap">
{{ partial "icons/bootstrap-white-fill.svg" (dict "class" "d-block my-1" "width" "40" "height" "32") }}
</a>
- <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#bdNavbar" aria-controls="bdNavbar" aria-expanded="false" aria-label="Toggle navigation">
- {{ partial "icons/hamburger.svg" (dict "class" "bi" "width" "32" "height" "32") }}
- </button>
+ <div class="d-flex">
+ <div class="bd-search" id="docsearch" data-bd-docs-version="{{ .Site.Params.docs_version }}"></div>
+
+ <button class="navbar-toggler d-flex d-lg-none order-3 p-2" type="button" data-bs-toggle="offcanvas" data-bs-target="#bdNavbar" aria-controls="bdNavbar" aria-label="Toggle navigation">
+ <svg class="bi" aria-hidden="true"><use xlink:href="#three-dots"></use></svg>
+ </button>
+ </div>
+
+ <div class="offcanvas-lg offcanvas-end flex-grow-1" tabindex="-1" id="bdNavbar" aria-labelledby="bdNavbarOffcanvasLabel">
+ <div class="offcanvas-header px-4 pb-0">
+ <h5 class="offcanvas-title text-white" id="bdNavbarOffcanvasLabel">Bootstrap</h5>
+ <button type="button" class="btn-close btn-close-white" data-bs-dismiss="offcanvas" aria-label="Close" data-bs-target="#bdNavbar"></button>
+ </div>
+
+ <div class="offcanvas-body p-4 pt-0 p-lg-0">
+ <hr class="d-lg-none text-white-50">
+ <ul class="navbar-nav flex-row flex-wrap bd-navbar-nav">
+ <li class="nav-item col-6 col-lg-auto">
+ <a class="nav-link py-2 px-0 px-lg-2{{ if eq .Page.Layout "docs" }} active" aria-current="true{{ end }}" href="/docs/{{ .Site.Params.docs_version }}/getting-started/introduction/">Docs</a>
+ </li>
+ <li class="nav-item col-6 col-lg-auto">
+ <a class="nav-link py-2 px-0 px-lg-2{{ if eq .Page.Title "Examples" }} active" aria-current="true{{ end }}" href="/docs/{{ .Site.Params.docs_version }}/examples/">Examples</a>
+ </li>
+ <li class="nav-item col-6 col-lg-auto">
+ <a class="nav-link py-2 px-0 px-lg-2" href="{{ .Site.Params.icons }}" target="_blank" rel="noopener">Icons</a>
+ </li>
+ <li class="nav-item col-6 col-lg-auto">
+ <a class="nav-link py-2 px-0 px-lg-2" href="{{ .Site.Params.themes }}" target="_blank" rel="noopener">Themes</a>
+ </li>
+ <li class="nav-item col-6 col-lg-auto">
+ <a class="nav-link py-2 px-0 px-lg-2" href="{{ .Site.Params.blog }}" target="_blank" rel="noopener">Blog</a>
+ </li>
+ </ul>
+
+ <hr class="d-lg-none text-white-50">
- <div class="collapse navbar-collapse" id="bdNavbar">
- <ul class="navbar-nav flex-row flex-wrap bd-navbar-nav pt-2 py-md-0">
- <li class="nav-item col-6 col-md-auto">
- <a class="nav-link p-2{{ if .IsHome }} active" aria-current="page{{ end }}" href="/" onclick="ga('send', 'event', 'Navbar', 'Community links', 'Bootstrap');">Home</a>
- </li>
- <li class="nav-item col-6 col-md-auto">
- <a class="nav-link p-2{{ if eq .Page.Layout "docs" }} active" aria-current="true{{ end }}" href="/docs/{{ .Site.Params.docs_version }}/getting-started/introduction/" onclick="ga('send', 'event', 'Navbar', 'Community links', 'Docs');">Docs</a>
- </li>
- <li class="nav-item col-6 col-md-auto">
- <a class="nav-link p-2{{ if eq .Page.Title "Examples" }} active" aria-current="true{{ end }}" href="/docs/{{ .Site.Params.docs_version }}/examples/" onclick="ga('send', 'event', 'Navbar', 'Community links', 'Examples');">Examples</a>
- </li>
- <li class="nav-item col-6 col-md-auto">
- <a class="nav-link p-2" href="{{ .Site.Params.icons }}" onclick="ga('send', 'event', 'Navbar', 'Community links', 'Icons');" target="_blank" rel="noopener">Icons</a>
- </li>
- <li class="nav-item col-6 col-md-auto">
- <a class="nav-link p-2" href="{{ .Site.Params.themes }}" onclick="ga('send', 'event', 'Navbar', 'Community links', 'Themes');" target="_blank" rel="noopener">Themes</a>
- </li>
- <li class="nav-item col-6 col-md-auto">
- <a class="nav-link p-2" href="{{ .Site.Params.blog }}" onclick="ga('send', 'event', 'Navbar', 'Community links', 'Blog');" target="_blank" rel="noopener">Blog</a>
- </li>
- </ul>
+ <ul class="navbar-nav flex-row flex-wrap ms-md-auto">
+ <li class="nav-item col-6 col-lg-auto">
+ <a class="nav-link py-2 px-0 px-lg-2" href="{{ .Site.Params.github_org }}" target="_blank" rel="noopener">
+ {{ partial "icons/github.svg" (dict "class" "navbar-nav-svg" "width" "16" "height" "16") }}
+ <small class="d-lg-none ms-2">GitHub</small>
+ </a>
+ </li>
+ <li class="nav-item col-6 col-lg-auto">
+ <a class="nav-link py-2 px-0 px-lg-2" href="https://twitter.com/{{ .Site.Params.twitter }}" target="_blank" rel="noopener">
+ {{ partial "icons/twitter.svg" (dict "class" "navbar-nav-svg" "width" "16" "height" "16") }}
+ <small class="d-lg-none ms-2">Twitter</small>
+ </a>
+ </li>
+ <li class="nav-item col-6 col-lg-auto">
+ <a class="nav-link py-2 px-0 px-lg-2" href="{{ .Site.Params.opencollective }}" target="_blank" rel="noopener">
+ {{ partial "icons/opencollective.svg" (dict "class" "navbar-nav-svg" "width" "16" "height" "16") }}
+ <small class="d-lg-none ms-2">Open Collective</small>
+ </a>
+ </li>
+ <li class="nav-item py-2 py-lg-1 col-12 col-lg-auto">
+ <div class="vr d-none d-lg-flex h-100 mx-lg-2 text-white"></div>
+ <hr class="d-lg-none my-2 text-white-50">
+ </li>
- <hr class="d-md-none text-white-50">
+ {{ partial "docs-versions" . }}
- <ul class="navbar-nav flex-row flex-wrap ms-md-auto">
- <li class="nav-item col-6 col-md-auto">
- <a class="nav-link p-2" href="{{ .Site.Params.github_org }}" target="_blank" rel="noopener">
- {{ partial "icons/github.svg" (dict "class" "navbar-nav-svg d-inline-block align-text-top" "width" "36" "height" "36") }}
- <small class="d-md-none ms-2">GitHub</small>
- </a>
- </li>
- <li class="nav-item col-6 col-md-auto">
- <a class="nav-link p-2" href="https://twitter.com/{{ .Site.Params.twitter }}" target="_blank" rel="noopener">
- {{ partial "icons/twitter.svg" (dict "class" "navbar-nav-svg d-inline-block align-text-top" "width" "36" "height" "36") }}
- <small class="d-md-none ms-2">Twitter</small>
- </a>
- </li>
- <li class="nav-item col-6 col-md-auto">
- <a class="nav-link p-2" href="{{ .Site.Params.slack }}" target="_blank" rel="noopener">
- {{ partial "icons/slack.svg" (dict "class" "navbar-nav-svg d-inline-block align-text-top" "width" "36" "height" "36") }}
- <small class="d-md-none ms-2">Slack</small>
- </a>
- </li>
- <li class="nav-item col-6 col-md-auto">
- <a class="nav-link p-2" href="{{ .Site.Params.opencollective }}" target="_blank" rel="noopener">
- {{ partial "icons/opencollective.svg" (dict "class" "navbar-nav-svg d-inline-block align-text-top" "width" "36" "height" "36") }}
- <small class="d-md-none ms-2">Open Collective</small>
- </a>
- </li>
- </ul>
+ <li class="nav-item py-2 py-lg-1 col-12 col-lg-auto">
+ <div class="vr d-none d-lg-flex h-100 mx-lg-2 text-white"></div>
+ <hr class="d-lg-none my-2 text-white-50">
+ </li>
- <a class="btn btn-bd-download d-lg-inline-block my-2 my-md-0 ms-md-3" href="/docs/{{ .Site.Params.docs_version }}/getting-started/download/">Download</a>
+ <li class="nav-item dropdown">
+ {{ partial "theme-toggler" . }}
+ </li>
+ </ul>
+ </div>
</div>
</nav>
</header>
diff --git a/site/layouts/partials/docs-sidebar.html b/site/layouts/partials/docs-sidebar.html
index eec268ceb..51e7bac4f 100644
--- a/site/layouts/partials/docs-sidebar.html
+++ b/site/layouts/partials/docs-sidebar.html
@@ -1,8 +1,8 @@
-<nav class="collapse bd-links" id="bd-docs-nav" aria-label="Docs navigation">
+<nav class="bd-links w-100" id="bd-docs-nav" aria-label="Docs navigation">
{{- $url := split .Permalink "/" -}}
{{- $page_slug := index $url (sub (len $url) 2) -}}
- <ul class="list-unstyled mb-0 py-3 pt-md-1">
+ <ul class="bd-links-nav list-unstyled mb-0 pb-3 pb-md-2 pe-lg-2">
{{- range $group := .Site.Data.sidebar -}}
{{- $link := $group.title -}}
{{- $link_slug := $link | urlize -}}
@@ -16,26 +16,28 @@
{{- $is_active_group := eq $.Page.Params.group $group_slug -}}
{{- if $group.pages }}
- <li class="mb-1">
- <button class="btn d-inline-flex align-items-center rounded{{ if not $is_active_group }} collapsed{{ end }}" data-bs-toggle="collapse" data-bs-target="#{{ $group_slug }}-collapse" aria-expanded="{{ $is_active_group }}"{{ if $is_active_group }} aria-current="true"{{ end }}>
+ <li class="bd-links-group py-2">
+ <strong class="bd-links-heading d-flex w-100 align-items-center fw-semibold">
+ {{- if $group.icon }}
+ <svg class="bi me-2"{{- if $group.icon_color }} style="color: var(--bs-{{ $group.icon_color }});"{{- end }} aria-hidden="true"><use xlink:href="#{{ $group.icon }}"></use></svg>
+ {{- end }}
{{ $group.title }}
- </button>
+ </strong>
- <div class="collapse{{ if $is_active_group }} show{{ end }}" id="{{ $group_slug }}-collapse">
- <ul class="list-unstyled fw-normal pb-1 small">
- {{- range $doc := $group.pages -}}
- {{- $doc_slug := $doc.title | urlize -}}
- {{- $is_active := and $is_active_group (eq $page_slug $doc_slug) -}}
- {{- $href := printf "/docs/%s/%s/%s/" $.Site.Params.docs_version $group_slug $doc_slug }}
- <li><a href="{{ $href }}" class="d-inline-flex align-items-center rounded{{ if $is_active }} active{{ end }}"{{ if $is_active }} aria-current="page"{{ end }}>{{ $doc.title }}</a></li>
- {{- end }}
- </ul>
- </div>
+ <ul class="list-unstyled fw-normal pb-2 small">
+ {{- range $doc := $group.pages -}}
+ {{- $doc_slug := $doc.title | urlize -}}
+ {{- $is_active := and $is_active_group (eq $page_slug $doc_slug) -}}
+ {{- $href := urls.JoinPath "/docs" $.Site.Params.docs_version $group_slug $doc_slug "/" }}
+ <li><a href="{{ $href }}" class="bd-links-link d-inline-block rounded{{ if $is_active }} active{{ end }}"{{ if $is_active }} aria-current="page"{{ end }}>{{ $doc.title }}</a></li>
+ {{- end }}
+ </ul>
</li>
{{- else }}
- <li class="my-3 mx-4 border-top"></li>
- <li>
- <a href="/docs/{{ $.Site.Params.docs_version }}/{{ $group_slug }}/" class="d-inline-flex align-items-center rounded{{ if $is_active_group }} active{{ end }}"{{ if $is_active_group }} aria-current="page"{{ end }}>
+ <li class="bd-links-span-all mt-1 mb-3 mx-4 border-top"></li>
+ <li class="bd-links-span-all">
+ {{- $href := urls.JoinPath "/docs" $.Site.Params.docs_version $group_slug "/" }}
+ <a href="{{ $href }}" class="bd-links-link d-inline-block rounded small{{ if $is_active_group }} active{{ end }}"{{ if $is_active_group }} aria-current="page"{{ end }}>
{{ $group.title }}
</a>
</li>
diff --git a/site/layouts/partials/docs-subnav.html b/site/layouts/partials/docs-subnav.html
deleted file mode 100644
index 9f2faf3e2..000000000
--- a/site/layouts/partials/docs-subnav.html
+++ /dev/null
@@ -1,14 +0,0 @@
-<nav class="bd-subnavbar py-2" aria-label="Secondary navigation">
- <div class="container-xxl d-flex align-items-md-center">
- <form class="bd-search position-relative me-auto">
- <input type="search" class="form-control" id="search-input" placeholder="Search docs..." aria-label="Search docs for..." autocomplete="off" data-bd-docs-version="{{ .Site.Params.docs_version }}">
- </form>
-
- {{ partial "docs-versions" . }}
-
- <button class="btn bd-sidebar-toggle d-md-none py-0 px-1 ms-3 order-3 collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#bd-docs-nav" aria-controls="bd-docs-nav" aria-expanded="false" aria-label="Toggle docs navigation">
- {{ partial "icons/expand.svg" (dict "class" "bi bi-expand" "width" "24" "height" "24") }}
- {{ partial "icons/collapse.svg" (dict "class" "bi bi-collapse" "width" "24" "height" "24") }}
- </button>
- </div>
-</nav>
diff --git a/site/layouts/partials/docs-versions.html b/site/layouts/partials/docs-versions.html
index a38a81823..c465d02e9 100644
--- a/site/layouts/partials/docs-versions.html
+++ b/site/layouts/partials/docs-versions.html
@@ -1,14 +1,58 @@
-<div class="dropdown ms-3">
- <button class="btn btn-bd-light dropdown-toggle" id="bd-versions" data-bs-toggle="dropdown" aria-expanded="false" data-bs-display="static">
- <span class="d-none d-lg-inline">Bootstrap</span> v{{ .Site.Params.docs_version }}
+{{- $url := split .Permalink "/" -}}
+{{- $page_version := index $url (sub (len $url) 4) -}}
+{{- $group_slug := index $url (sub (len $url) 3) -}}
+{{- $page_slug := index $url (sub (len $url) 2) -}}
+
+{{- $versions_link := "" -}}
+{{- if and (eq .Layout "docs") (eq $page_version .Site.Params.docs_version) -}}
+ {{- $versions_link = urls.JoinPath $group_slug $page_slug "/" -}}
+{{- else if (eq .Layout "single") -}}
+ {{- $versions_link = urls.JoinPath $page_slug "/" -}}
+{{- end -}}
+
+{{- $added_in_51 := eq (string .Page.Params.added.version) "5.1" -}}
+{{- $added_in_52 := eq (string .Page.Params.added.version) "5.2" -}}
+{{- $added_in_53 := eq (string .Page.Params.added.version) "5.3" -}}
+
+<li class="nav-item dropdown">
+ <button type="button" class="btn btn-link nav-link py-2 px-0 px-lg-2 dropdown-toggle" data-bs-toggle="dropdown" aria-expanded="false" data-bs-display="static">
+ <span class="d-lg-none" aria-hidden="true">Bootstrap</span><span class="visually-hidden">Bootstrap&nbsp;</span> v{{ .Site.Params.docs_version }} <span class="visually-hidden">(switch to other versions)</span>
</button>
- <ul class="dropdown-menu dropdown-menu-end" aria-labelledby="bd-versions">
- <li><a class="dropdown-item current" aria-current="true" href="/docs/{{ .Site.Params.docs_version }}/">Latest ({{ .Site.Params.docs_version }}.x)</a></li>
+ <ul class="dropdown-menu dropdown-menu-end">
+ <li><h6 class="dropdown-header">v5 releases</h6></li>
+ <li>
+ <a class="dropdown-item d-flex align-items-center justify-content-between active" aria-current="true" href="{{ if .IsHome }}/{{ else }}/docs/{{ .Site.Params.docs_version }}/{{ $versions_link }}{{ end }}">
+ Latest ({{ .Site.Params.docs_version }}.x)
+ <svg class="bi"><use xlink:href="#check2"></use></svg>
+ </a>
+ </li>
+ <li>
+ {{- if ($added_in_53) }}
+ <div class="dropdown-item disabled">v5.2.3</div>
+ {{- else }}
+ <a class="dropdown-item" href="https://getbootstrap.com/docs/5.2/{{ $versions_link }}">v5.2.3</a>
+ {{- end }}
+ </li>
+ <li>
+ {{- if (or $added_in_52 $added_in_53) }}
+ <div class="dropdown-item disabled">v5.1.3</div>
+ {{- else }}
+ <a class="dropdown-item" href="https://getbootstrap.com/docs/5.1/{{ $versions_link }}">v5.1.3</a>
+ {{- end }}
+ </li>
+ <li>
+ {{- if (or $added_in_51 $added_in_52 $added_in_53) }}
+ <div class="dropdown-item disabled">v5.0.2</div>
+ {{- else }}
+ <a class="dropdown-item" href="https://getbootstrap.com/docs/5.0/{{ $versions_link }}">v5.0.2</a>
+ {{- end }}
+ </li>
<li><hr class="dropdown-divider"></li>
+ <li><h6 class="dropdown-header">Previous releases</h6></li>
<li><a class="dropdown-item" href="https://getbootstrap.com/docs/4.6/">v4.6.x</a></li>
<li><a class="dropdown-item" href="https://getbootstrap.com/docs/3.4/">v3.4.1</a></li>
<li><a class="dropdown-item" href="https://getbootstrap.com/2.3.2/">v2.3.2</a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" href="/docs/versions/">All versions</a></li>
</ul>
-</div>
+</li>
diff --git a/site/layouts/partials/examples/bs-themes.html b/site/layouts/partials/examples/bs-themes.html
new file mode 100644
index 000000000..b426d0723
--- /dev/null
+++ b/site/layouts/partials/examples/bs-themes.html
@@ -0,0 +1,17 @@
+<hr class="my-5">
+<div class="container">
+ <div class="text-center">
+ <div class="masthead-followup-icon d-inline-block mb-2 text-bg-danger">
+ {{ partial "icons/droplet-fill.svg" (dict "width" "32" "height" "32") }}
+ </div>
+ <h2 class="display-6 fw-normal">Go further with Bootstrap Themes</h2>
+ <p class="col-md-10 col-lg-8 mx-auto lead">
+ Need something more than these examples? Take Bootstrap to the next level with premium themes from the <a href="{{ .Site.Params.themes }}">official Bootstrap Themes marketplace</a>. They’re built as their own extended frameworks, rich with new components and plugins, documentation, and powerful build tools.
+ </p>
+ <a href="{{ .Site.Params.themes }}" class="btn btn-lg btn-outline-primary mb-3">Browse themes</a>
+ </div>
+ {{ partial "responsive-img" (dict "context" .
+ "imgPath" "/assets/img/bootstrap-themes-collage.png"
+ "alt" "Bootstrap Themes"
+ "classes" "d-block mt-3") }}
+</div>
diff --git a/site/layouts/partials/examples/icons.html b/site/layouts/partials/examples/icons.html
new file mode 100644
index 000000000..aab3d56f7
--- /dev/null
+++ b/site/layouts/partials/examples/icons.html
@@ -0,0 +1,15 @@
+<svg xmlns="http://www.w3.org/2000/svg" class="d-none">
+ <symbol id="check2" viewBox="0 0 16 16">
+ <path d="M13.854 3.646a.5.5 0 0 1 0 .708l-7 7a.5.5 0 0 1-.708 0l-3.5-3.5a.5.5 0 1 1 .708-.708L6.5 10.293l6.646-6.647a.5.5 0 0 1 .708 0z"/>
+ </symbol>
+ <symbol id="circle-half" viewBox="0 0 16 16">
+ <path d="M8 15A7 7 0 1 0 8 1v14zm0 1A8 8 0 1 1 8 0a8 8 0 0 1 0 16z"/>
+ </symbol>
+ <symbol id="moon-stars-fill" viewBox="0 0 16 16">
+ <path d="M6 .278a.768.768 0 0 1 .08.858 7.208 7.208 0 0 0-.878 3.46c0 4.021 3.278 7.277 7.318 7.277.527 0 1.04-.055 1.533-.16a.787.787 0 0 1 .81.316.733.733 0 0 1-.031.893A8.349 8.349 0 0 1 8.344 16C3.734 16 0 12.286 0 7.71 0 4.266 2.114 1.312 5.124.06A.752.752 0 0 1 6 .278z"/>
+ <path d="M10.794 3.148a.217.217 0 0 1 .412 0l.387 1.162c.173.518.579.924 1.097 1.097l1.162.387a.217.217 0 0 1 0 .412l-1.162.387a1.734 1.734 0 0 0-1.097 1.097l-.387 1.162a.217.217 0 0 1-.412 0l-.387-1.162A1.734 1.734 0 0 0 9.31 6.593l-1.162-.387a.217.217 0 0 1 0-.412l1.162-.387a1.734 1.734 0 0 0 1.097-1.097l.387-1.162zM13.863.099a.145.145 0 0 1 .274 0l.258.774c.115.346.386.617.732.732l.774.258a.145.145 0 0 1 0 .274l-.774.258a1.156 1.156 0 0 0-.732.732l-.258.774a.145.145 0 0 1-.274 0l-.258-.774a1.156 1.156 0 0 0-.732-.732l-.774-.258a.145.145 0 0 1 0-.274l.774-.258c.346-.115.617-.386.732-.732L13.863.1z"/>
+ </symbol>
+ <symbol id="sun-fill" viewBox="0 0 16 16">
+ <path d="M8 12a4 4 0 1 0 0-8 4 4 0 0 0 0 8zM8 0a.5.5 0 0 1 .5.5v2a.5.5 0 0 1-1 0v-2A.5.5 0 0 1 8 0zm0 13a.5.5 0 0 1 .5.5v2a.5.5 0 0 1-1 0v-2A.5.5 0 0 1 8 13zm8-5a.5.5 0 0 1-.5.5h-2a.5.5 0 0 1 0-1h2a.5.5 0 0 1 .5.5zM3 8a.5.5 0 0 1-.5.5h-2a.5.5 0 0 1 0-1h2A.5.5 0 0 1 3 8zm10.657-5.657a.5.5 0 0 1 0 .707l-1.414 1.415a.5.5 0 1 1-.707-.708l1.414-1.414a.5.5 0 0 1 .707 0zm-9.193 9.193a.5.5 0 0 1 0 .707L3.05 13.657a.5.5 0 0 1-.707-.707l1.414-1.414a.5.5 0 0 1 .707 0zm9.193 2.121a.5.5 0 0 1-.707 0l-1.414-1.414a.5.5 0 0 1 .707-.707l1.414 1.414a.5.5 0 0 1 0 .707zM4.464 4.465a.5.5 0 0 1-.707 0L2.343 3.05a.5.5 0 1 1 .707-.707l1.414 1.414a.5.5 0 0 1 0 .708z"/>
+ </symbol>
+</svg>
diff --git a/site/layouts/partials/examples/main.html b/site/layouts/partials/examples/main.html
new file mode 100644
index 000000000..3dbb640a7
--- /dev/null
+++ b/site/layouts/partials/examples/main.html
@@ -0,0 +1,63 @@
+{{ range $entry := $.Site.Data.examples -}}
+<div class="bd-content">
+ <h2 id="{{ $entry.category | urlize }}">{{ $entry.category }}</h2>
+ <p>{{ $entry.description }}</p>
+ {{ if eq $entry.category "RTL" -}}
+ <div class="bd-callout bd-callout-warning small">
+ <p>
+ <strong>RTL is still experimental</strong> and will evolve with feedback. Spotted something or have an improvement to suggest?
+ </p>
+ <p><a href="{{ urls.JoinPath $.Site.Params.repo "issues/new/choose" }}">Please open an issue.</a></p>
+ </div>
+ {{ end -}}
+ {{ range $i, $example := $entry.examples -}}
+ {{- $len := len $entry.examples -}}
+ {{ if (eq $i 0) }}<div class="row">{{ end }}
+ {{ if $entry.external -}}
+ <div class="col-md-6 col-lg-4 mb-3 d-flex gap-3">
+ <svg class="bi fs-5 flex-shrink-0 mt-1" aria-hidden="true"><use xlink:href="#box-seam"></use></svg>
+ <div>
+ <h3 class="h5 mb-1">
+ <a class="d-block link-offset-1" href="{{ urls.JoinPath $.Site.Params.github_org $example.url }}" target="_blank" rel="noopener">
+ {{ $example.name }}
+ </a>
+ </h3>
+ <p class="text-body-secondary">{{ $example.description }}</p>
+ <p>
+ {{- $indexPath := default "index.html" $example.indexPath -}}
+ {{- $stackBlitzUrl := printf "%s%s%s" (urls.JoinPath "https://stackblitz.com/github/twbs" $example.url) "?file=" ($indexPath | urlquery) }}
+ <a class="icon-link small link-secondary link-offset-1" href="{{ $stackBlitzUrl }}" target="_blank" rel="noopener">
+ <svg class="bi flex-shrink-0" aria-hidden="true"><use xlink:href="#lightning-charge-fill"></use></svg>
+ Edit in StackBlitz
+ </a>
+ </p>
+ </div>
+ </div>
+ {{ else -}}
+ <div class="col-sm-6 col-md-3 mb-3">
+ {{- $exampleNameUrlized := $example.name | urlize -}}
+ {{- $exampleUrl := urls.JoinPath "/docs" $.Site.Params.docs_version "/examples" $exampleNameUrlized "/" }}
+ <a class="d-block link-offset-1" href="{{ $exampleUrl }}"{{ if in $example.name "RTL" }} hreflang="ar"{{ end }}>
+ {{ $imageBasePath := urls.JoinPath "/docs" $.Site.Params.docs_version "assets/img/examples" -}}
+ {{- $imgPath := urls.JoinPath $imageBasePath (printf "%s.png" $exampleNameUrlized) -}}
+ {{- $imgPath2x := urls.JoinPath $imageBasePath (printf "%[email protected]" $exampleNameUrlized) -}}
+ {{- with (imageConfig (path.Join "/site/static" $imgPath)) -}}
+ <img class="img-thumbnail mb-3"
+ srcset="{{ $imgPath }}, {{ $imgPath2x }} 2x"
+ src="{{ $imgPath }}"
+ alt=""
+ width="{{ .Width }}"
+ height="{{ .Height }}"
+ loading="lazy">
+ {{- end }}
+ <h3 class="h5 mb-1">
+ {{ $example.name }}
+ </h3>
+ </a>
+ <p class="text-body-secondary">{{ $example.description }}</p>
+ </div>
+ {{- end }}
+ {{ if (eq (add $i 1) $len) }}</div>{{ end -}}
+ {{ end -}}
+</div>
+{{ end -}}
diff --git a/site/layouts/partials/favicons.html b/site/layouts/partials/favicons.html
index 50f6a5bbb..9233ff624 100644
--- a/site/layouts/partials/favicons.html
+++ b/site/layouts/partials/favicons.html
@@ -1,8 +1,7 @@
-{{ "<!-- Favicons -->" | safeHTML }}
<link rel="apple-touch-icon" href="/docs/{{ .Site.Params.docs_version }}/assets/img/favicons/apple-touch-icon.png" sizes="180x180">
<link rel="icon" href="/docs/{{ .Site.Params.docs_version }}/assets/img/favicons/favicon-32x32.png" sizes="32x32" type="image/png">
<link rel="icon" href="/docs/{{ .Site.Params.docs_version }}/assets/img/favicons/favicon-16x16.png" sizes="16x16" type="image/png">
<link rel="manifest" href="/docs/{{ .Site.Params.docs_version }}/assets/img/favicons/manifest.json">
-<link rel="mask-icon" href="/docs/{{ .Site.Params.docs_version }}/assets/img/favicons/safari-pinned-tab.svg" color="#7952b3">
+<link rel="mask-icon" href="/docs/{{ .Site.Params.docs_version }}/assets/img/favicons/safari-pinned-tab.svg" color="#712cf9">
<link rel="icon" href="/docs/{{ .Site.Params.docs_version }}/assets/img/favicons/favicon.ico">
-<meta name="theme-color" content="#7952b3">
+<meta name="theme-color" content="#712cf9">
diff --git a/site/layouts/partials/footer.html b/site/layouts/partials/footer.html
index e3d0f13e4..562489e50 100644
--- a/site/layouts/partials/footer.html
+++ b/site/layouts/partials/footer.html
@@ -1,12 +1,12 @@
-<footer class="bd-footer py-5 mt-5 bg-light">
- <div class="container py-5">
+<footer class="bd-footer py-4 py-md-5 mt-5 bg-body-tertiary">
+ <div class="container py-4 py-md-5 px-4 px-md-3 text-body-secondary">
<div class="row">
<div class="col-lg-3 mb-3">
- <a class="d-inline-flex align-items-center mb-2 link-dark text-decoration-none" href="/" aria-label="Bootstrap">
+ <a class="d-inline-flex align-items-center mb-2 text-body-emphasis text-decoration-none" href="/" aria-label="Bootstrap">
{{ partial "icons/bootstrap-white-fill.svg" (dict "class" "d-block me-2" "width" "40" "height" "32") }}
<span class="fs-5">Bootstrap</span>
</a>
- <ul class="list-unstyled small text-muted">
+ <ul class="list-unstyled small">
<li class="mb-2">Designed and built with all the love in the world by the <a href="/docs/{{ .Site.Params.docs_version }}/about/team/">Bootstrap team</a> with the help of <a href="{{ .Site.Params.repo }}/graphs/contributors">our contributors</a>.</li>
<li class="mb-2">Code licensed <a href="{{ .Site.Params.repo }}/blob/main/LICENSE" target="_blank" rel="license noopener">MIT</a>, docs <a href="https://creativecommons.org/licenses/by/3.0/" target="_blank" rel="license noopener">CC BY 3.0</a>.</li>
<li class="mb-2">Currently v{{ .Site.Params.current_version }}.</li>
@@ -18,8 +18,10 @@
<li class="mb-2"><a href="/">Home</a></li>
<li class="mb-2"><a href="/docs/{{ .Site.Params.docs_version }}/">Docs</a></li>
<li class="mb-2"><a href="/docs/{{ .Site.Params.docs_version }}/examples/">Examples</a></li>
+ <li class="mb-2"><a href="{{ .Site.Params.icons }}">Icons</a></li>
<li class="mb-2"><a href="{{ .Site.Params.themes }}">Themes</a></li>
<li class="mb-2"><a href="{{ .Site.Params.blog }}">Blog</a></li>
+ <li class="mb-2"><a href="{{ .Site.Params.swag }}" target="_blank" rel="noopener">Swag Store</a></li>
</ul>
</div>
<div class="col-6 col-lg-2 mb-3">
@@ -29,27 +31,27 @@
<li class="mb-2"><a href="/docs/{{ .Site.Params.docs_version }}/examples/starter-template/">Starter template</a></li>
<li class="mb-2"><a href="/docs/{{ .Site.Params.docs_version }}/getting-started/webpack/">Webpack</a></li>
<li class="mb-2"><a href="/docs/{{ .Site.Params.docs_version }}/getting-started/parcel/">Parcel</a></li>
+ <li class="mb-2"><a href="/docs/{{ .Site.Params.docs_version }}/getting-started/vite/">Vite</a></li>
</ul>
</div>
<div class="col-6 col-lg-2 mb-3">
<h5>Projects</h5>
<ul class="list-unstyled">
- <li class="mb-2"><a href="{{ .Site.Params.github_org }}/bootstrap">Bootstrap 5</a></li>
- <li class="mb-2"><a href="{{ .Site.Params.github_org }}/bootstrap/tree/v4-dev">Bootstrap 4</a></li>
- <li class="mb-2"><a href="{{ .Site.Params.github_org }}/icons">Icons</a></li>
- <li class="mb-2"><a href="{{ .Site.Params.github_org }}/rfs">RFS</a></li>
- <li class="mb-2"><a href="{{ .Site.Params.github_org }}/bootstrap-npm-starter">npm starter</a></li>
+ <li class="mb-2"><a href="{{ .Site.Params.github_org }}/bootstrap" target="_blank" rel="noopener">Bootstrap 5</a></li>
+ <li class="mb-2"><a href="{{ .Site.Params.github_org }}/bootstrap/tree/v4-dev" target="_blank" rel="noopener">Bootstrap 4</a></li>
+ <li class="mb-2"><a href="{{ .Site.Params.github_org }}/icons" target="_blank" rel="noopener">Icons</a></li>
+ <li class="mb-2"><a href="{{ .Site.Params.github_org }}/rfs" target="_blank" rel="noopener">RFS</a></li>
+ <li class="mb-2"><a href="{{ .Site.Params.github_org }}/examples" target="_blank" rel="noopener">Examples repo</a></li>
</ul>
</div>
<div class="col-6 col-lg-2 mb-3">
<h5>Community</h5>
<ul class="list-unstyled">
- <li class="mb-2"><a href="{{ .Site.Params.github_org }}/bootstrap/issues">Issues</a></li>
- <li class="mb-2"><a href="{{ .Site.Params.github_org }}/bootstrap/discussions">Discussions</a></li>
- <li class="mb-2"><a href="https://github.com/sponsors/twbs">Corporate sponsors</a></li>
- <li class="mb-2"><a href="{{ .Site.Params.opencollective }}">Open Collective</a></li>
- <li class="mb-2"><a href="{{ .Site.Params.slack }}">Slack</a></li>
- <li class="mb-2"><a href="https://stackoverflow.com/questions/tagged/bootstrap-5">Stack Overflow</a></li>
+ <li class="mb-2"><a href="{{ .Site.Params.github_org }}/bootstrap/issues" target="_blank" rel="noopener">Issues</a></li>
+ <li class="mb-2"><a href="{{ .Site.Params.github_org }}/bootstrap/discussions" target="_blank" rel="noopener">Discussions</a></li>
+ <li class="mb-2"><a href="https://github.com/sponsors/twbs" target="_blank" rel="noopener">Corporate sponsors</a></li>
+ <li class="mb-2"><a href="{{ .Site.Params.opencollective }}" target="_blank" rel="noopener">Open Collective</a></li>
+ <li class="mb-2"><a href="https://stackoverflow.com/questions/tagged/bootstrap-5" target="_blank" rel="noopener">Stack Overflow</a></li>
</ul>
</div>
</div>
diff --git a/site/layouts/partials/guide-footer.md b/site/layouts/partials/guide-footer.md
new file mode 100644
index 000000000..22d4c14b8
--- /dev/null
+++ b/site/layouts/partials/guide-footer.md
@@ -0,0 +1,3 @@
+<hr class="my-5">
+
+_See something wrong or out of date here? Please [open an issue on GitHub]({{ .Site.Params.repo }}/issues/new/choose). Need help troubleshooting? [Search or start a discussion]({{ .Site.Params.repo }}/discussions) on GitHub._
diff --git a/site/layouts/partials/header.html b/site/layouts/partials/header.html
index 2d2eb29d9..66bdf2fb1 100644
--- a/site/layouts/partials/header.html
+++ b/site/layouts/partials/header.html
@@ -7,14 +7,21 @@
<meta name="docsearch:language" content="en">
<meta name="docsearch:version" content="{{ .Site.Params.docs_version }}">
-<title>{{ if .IsHome }}{{ .Site.Title | markdownify }} · {{ .Site.Params.description | markdownify }}{{ else }}{{ .Title | markdownify }} · {{ .Site.Title | markdownify }} v{{ .Site.Params.docs_version }}{{ end }}</title>
-
<link rel="canonical" href="{{ .Permalink }}">
+{{ if (ne .Page.Layout "examples") -}}
+<link rel="preconnect" href="https://{{ .Site.Params.algolia.appId | lower }}-dsn.algolia.net" crossorigin>
+{{- end }}
+
+<title>{{ if .IsHome }}{{ .Site.Title | markdownify }} · {{ .Site.Params.subtitle | markdownify }}{{ else }}{{ .Title | markdownify }} · {{ .Site.Title | markdownify }} v{{ .Site.Params.docs_version }}{{ end }}</title>
+
{{ with .Params.robots -}}
<meta name="robots" content="{{ . }}">
{{- end }}
+{{- $colorModeJS := urls.JoinPath "/docs" $.Site.Params.docs_version "assets/js/color-modes.js" -}}
+<script src="{{ $colorModeJS }}"></script>
+
{{ partial "stylesheet" . }}
{{ partial "favicons" . }}
{{ partial "social" . }}
diff --git a/site/layouts/partials/home/components-utilities.html b/site/layouts/partials/home/components-utilities.html
new file mode 100644
index 000000000..e18b403de
--- /dev/null
+++ b/site/layouts/partials/home/components-utilities.html
@@ -0,0 +1,88 @@
+<section class="pb-md-5 mb-5">
+ <div class="col-lg-8 mb-5">
+ <div class="masthead-followup-icon d-inline-block mb-3 me-2" style="--bg-rgb: var(--bs-danger-rgb);">
+ <svg class="bi fs-1" aria-hidden="true"><use xlink:href="#menu-button-wide-fill"></use></svg>
+ </div>
+ <svg class="bi me-2 fs-2 text-body-secondary" aria-hidden="true"><use xlink:href="#plus"></use></svg>
+ <div class="masthead-followup-icon d-inline-block mb-3" style="--bg-rgb: var(--bs-info-rgb);">
+ <svg class="bi fs-1" aria-hidden="true"><use xlink:href="#braces-asterisk"></use></svg>
+ </div>
+ <h2 class="display-5 mb-3 fw-semibold lh-sm">Components, meet the Utility&nbsp;API</h2>
+ <p class="lead fw-normal">
+ New in Bootstrap 5, our utilities are now generated by our <a href="/docs/{{ .Site.Params.docs_version }}/utilities/api/">Utility API</a>. We built it as a feature-packed Sass map that can be quickly and easily customized. It's never been easier to add, remove, or modify any utility classes. Make utilities responsive, add pseudo-class variants, and give them custom names.
+ </p>
+ </div>
+ <div class="row gx-md-5">
+ <div class="col-lg-6">
+ <h3 class="fw-semibold">Quickly customize components</h3>
+ <p>Apply any of our included utility classes to our components to customize their appearance, like the navigation example below. There are hundreds of classes available—from <a href="/docs/{{ .Site.Params.docs_version }}/utilities/position/">positioning</a> and <a href="/docs/{{ .Site.Params.docs_version }}/utilities/sizing/">sizing</a> to <a href="/docs/{{ .Site.Params.docs_version }}/utilities/colors/">colors</a> and <a href="/docs/{{ .Site.Params.docs_version }}/utilities/shadows/">effects</a>. Mix them with CSS variable overrides for even more control.</p>
+ <div class="p-4 border rounded-3 mb-4">
+ <ul class="nav nav-pills mb-4" id="pillNav" role="tablist">
+ <li class="nav-item" role="presentation">
+ <button class="nav-link active" id="home-tab" data-bs-toggle="tab" type="button" role="tab" aria-selected="true">Home</button>
+ </li>
+ <li class="nav-item" role="presentation">
+ <button class="nav-link" id="profile-tab" data-bs-toggle="tab" type="button" role="tab" aria-selected="false">Profile</button>
+ </li>
+ <li class="nav-item" role="presentation">
+ <button class="nav-link" id="contact-tab" data-bs-toggle="tab" type="button" role="tab" aria-selected="false">Contact</button>
+ </li>
+ </ul>
+ <ul class="nav nav-pills nav-fill gap-2 p-1 small bg-primary rounded-5 shadow-sm" id="pillNav2" role="tablist" style="--bs-nav-link-color: rgba(255, 255, 255, .75); --bs-nav-link-hover-color: #fff; --bs-nav-pills-link-active-color: var(--bs-primary); --bs-nav-pills-link-active-bg: var(--bs-white);">
+ <li class="nav-item" role="presentation">
+ <button class="nav-link active rounded-5" id="home-tab2" data-bs-toggle="tab" type="button" role="tab" aria-selected="true">Home</button>
+ </li>
+ <li class="nav-item" role="presentation">
+ <button class="nav-link rounded-5" id="profile-tab2" data-bs-toggle="tab" type="button" role="tab" aria-selected="false">Profile</button>
+ </li>
+ <li class="nav-item" role="presentation">
+ <button class="nav-link rounded-5" id="contact-tab2" data-bs-toggle="tab" type="button" role="tab" aria-selected="false">Contact</button>
+ </li>
+ </ul>
+ </div>
+{{ highlight (printf `<ul class="nav nav-pills nav-fill gap-2 p-1 small bg-primary rounded-5 shadow-sm" id="pillNav2" role="tablist" style="--bs-nav-link-color: var(--bs-white); --bs-nav-pills-link-active-color: var(--bs-primary); --bs-nav-pills-link-active-bg: var(--bs-white);">
+ <li class="nav-item" role="presentation">
+ <button class="nav-link active rounded-5" id="home-tab2" data-bs-toggle="tab" type="button" role="tab" aria-selected="true">Home</button>
+ </li>
+ <li class="nav-item" role="presentation">
+ <button class="nav-link rounded-5" id="profile-tab2" data-bs-toggle="tab" type="button" role="tab" aria-selected="false">Profile</button>
+ </li>
+ <li class="nav-item" role="presentation">
+ <button class="nav-link rounded-5" id="contact-tab2" data-bs-toggle="tab" type="button" role="tab" aria-selected="false">Contact</button>
+ </li>
+</ul>
+`) "html" "" }}
+ <p class="d-flex justify-content-start mb-md-0">
+ <a href="/docs/{{ .Site.Params.docs_version }}/examples/#snippets" class="icon-link icon-link-hover fw-semibold">
+ Explore customized components
+ <svg class="bi" aria-hidden="true"><use xlink:href="#arrow-right"></use></svg>
+ </a>
+ </p>
+ </div>
+ <div class="col-lg-6">
+ <h3 class="fw-semibold">Create and extend utilities</h3>
+ <p>Use Bootstrap's utility API to modify any of our included utilities or create your own custom utilities for any project. Import Bootstrap first, then use Sass map functions to modify, add, or remove utilities.</p>
+{{ highlight (printf `@import "bootstrap/scss/bootstrap";
+
+$utilities: map-merge(
+ $utilities,
+ (
+ "cursor": (
+ property: cursor,
+ class: cursor,
+ responsive: true,
+ values: auto pointer grab,
+ )
+ )
+);
+`) "scss" "" }}
+
+ <p class="d-flex justify-content-start mb-md-0">
+ <a href="/docs/{{ .Site.Params.docs_version }}/utilities/api/" class="icon-link icon-link-hover fw-semibold mb-3">
+ Explore the utility API
+ <svg class="bi" aria-hidden="true"><use xlink:href="#arrow-right"></use></svg>
+ </a>
+ </p>
+ </div>
+ </div>
+</section>
diff --git a/site/layouts/partials/home/css-variables.html b/site/layouts/partials/home/css-variables.html
new file mode 100644
index 000000000..750db3409
--- /dev/null
+++ b/site/layouts/partials/home/css-variables.html
@@ -0,0 +1,48 @@
+<section class="row g-md-5 pb-md-5 mb-5 align-items-center">
+ <div class="col-lg-8 mb-5">
+ <div class="masthead-followup-icon d-inline-block mb-3" style="--bg-rgb: var(--bd-pink-rgb);">
+ <svg class="bi fs-1" aria-hidden="true"><use xlink:href="#braces"></use></svg>
+ </div>
+ <h2 class="display-5 mb-3 fw-semibold lh-sm">Build and extend in real-time with CSS&nbsp;variables</h2>
+ <p class="lead fw-normal">
+ Bootstrap 5 is evolving with each release to better utilize CSS variables for global theme styles, individual components, and even utilities. We provide dozens of variables for colors, font styles, and more at a <code>:root</code> level for use anywhere. On components and utilities, CSS variables are scoped to the relevant class and can easily be modified.
+ </p>
+ <p class="d-flex align-items-start flex-column lead fw-normal mb-0">
+ <a href="/docs/{{ .Site.Params.docs_version }}/customize/css-variables/" class="icon-link icon-link-hover fw-semibold mb-3">
+ Learn more about CSS variables
+ <svg class="bi" aria-hidden="true"><use xlink:href="#arrow-right"></use></svg>
+ </a>
+ </p>
+ </div>
+ <div class="row gx-md-5">
+ <div class="col-lg-6 mb-3">
+ <h3 class="fw-semibold">Using CSS variables</h3>
+ <p>Use any of our <a href="/docs/{{ .Site.Params.docs_version }}/customize/css-variables/#root-variables">global <code>:root</code> variables</a> to write new styles. CSS variables use the <code>var(--bs-variableName)</code> syntax and can be inherited by children elements.</p>
+ {{ highlight (printf `.component {
+ color: var(--bs-gray-800);
+ background-color: var(--bs-gray-100);
+ border: 1px solid var(--bs-gray-200);
+ border-radius: .25rem;
+}
+
+.component-header {
+ color: var(--bs-purple);
+}`) "scss" "" }}
+ </div>
+ <div class="col-lg-6 mb-3">
+ <h3 class="fw-semibold">Customizing via CSS variables</h3>
+ <p>Override global, component, or utility class variables to customize Bootstrap just how you like. No need to redeclare each rule, just a new variable value.</p>
+ {{ highlight (printf `body {
+ --bs-body-font-family: var(--bs-font-monospace);
+ --bs-body-line-height: 1.4;
+ --bs-body-bg: var(--bs-gray-100);
+}
+
+.table {
+ --bs-table-color: var(--bs-gray-600);
+ --bs-table-bg: var(--bs-gray-100);
+ --bs-table-border-color: transparent;
+}`) "scss" "" }}
+ </div>
+ </div>
+</section>
diff --git a/site/layouts/partials/home/customize.html b/site/layouts/partials/home/customize.html
new file mode 100644
index 000000000..98edf5633
--- /dev/null
+++ b/site/layouts/partials/home/customize.html
@@ -0,0 +1,59 @@
+<section class="col-lg-7 mb-5">
+ <div class="masthead-followup-icon d-inline-block mb-3" style="--bg-rgb: var(--bs-primary-rgb);">
+ <svg class="bi fs-1" aria-hidden="true"><use xlink:href="#palette2"></use></svg>
+ </div>
+ <h2 class="display-5 mb-3 fw-semibold lh-sm">Customize everything with&nbsp;Sass</h2>
+ <p class="lead fw-normal">
+ Bootstrap utilizes Sass for a modular and customizable architecture. Import only the components you need, enable global options like gradients and shadows, and write your own CSS with our variables, maps, functions, and mixins.
+ </p>
+ <p class="d-flex justify-content-start lead fw-normal">
+ <a href="/docs/{{ .Site.Params.docs_version }}/customize/overview/" class="icon-link icon-link-hover fw-semibold">
+ Learn more about customizing
+ <svg class="bi" aria-hidden="true"><use xlink:href="#arrow-right"></use></svg>
+ </a>
+ </p>
+</section>
+
+<section class="row g-md-5 mb-5 pb-md-5">
+ <div class="col-lg-6">
+ <h3>Include all of Bootstrap’s Sass</h3>
+ <p>Import one stylesheet and you're off to the races with every feature of our CSS.</p>
+ {{ highlight (printf `// Variable overrides first
+$primary: #900;
+$enable-shadows: true;
+$prefix: "mo-";
+
+// Then import Bootstrap
+@import "../node_modules/bootstrap/scss/bootstrap";
+`) "scss" "" }}
+ <p>Learn more about our <a href="/docs/{{ .Site.Params.docs_version }}/customize/options/">global Sass options</a>.</p>
+ </div>
+ <div class="col-lg-6">
+ <h3>Include what you need</h3>
+ <p>The easiest way to customize Bootstrap—include only the CSS you need.</p>
+{{ highlight (printf `// Functions first
+@import "../node_modules/bootstrap/scss/functions";
+
+// Variable overrides second
+$primary: #900;
+$enable-shadows: true;
+$prefix: "mo-";
+
+// Required Bootstrap imports
+@import "../node_modules/bootstrap/scss/variables";
+@import "../node_modules/bootstrap/scss/variables-dark";
+@import "../node_modules/bootstrap/scss/maps";
+@import "../node_modules/bootstrap/scss/mixins";
+@import "../node_modules/bootstrap/scss/root";
+
+// Optional components
+@import "../node_modules/bootstrap/scss/utilities";
+@import "../node_modules/bootstrap/scss/reboot";
+@import "../node_modules/bootstrap/scss/containers";
+@import "../node_modules/bootstrap/scss/grid";
+@import "../node_modules/bootstrap/scss/helpers";
+@import "../node_modules/bootstrap/scss/utilities/api";
+`) "scss" "" }}
+ <p>Learn more about <a href="/docs/{{ .Site.Params.docs_version }}/customize/sass/">using Bootstrap with Sass</a>.</p>
+ </div>
+</section>
diff --git a/site/layouts/partials/home/get-started.html b/site/layouts/partials/home/get-started.html
new file mode 100644
index 000000000..394ba1b4b
--- /dev/null
+++ b/site/layouts/partials/home/get-started.html
@@ -0,0 +1,58 @@
+<div class="col-lg-7 mx-auto pb-3 mb-3 mb-md-5 text-md-center">
+ <div class="masthead-followup-icon d-inline-block mb-3" style="--bg-rgb: var(--bd-violet-rgb);">
+ <svg class="bi fs-1" aria-hidden="true"><use xlink:href="#code"></use></svg>
+ </div>
+ <h2 class="display-5 mb-3 fw-semibold lh-sm">Get started any way you&nbsp;want</h2>
+ <p class="lead fw-normal">
+ Jump right into building with Bootstrap—use the CDN, install it via package manager, or download the source code.
+ </p>
+ <p class="d-flex justify-content-md-start justify-content-md-center lead fw-normal">
+ <a href="/docs/{{ .Site.Params.docs_version }}/getting-started/download/" class="icon-link icon-link-hover fw-semibold ps-md-4">
+ Read installation docs
+ <svg class="bi" aria-hidden="true"><use xlink:href="#arrow-right"></use></svg>
+ </a>
+ </p>
+</div>
+
+<section class="row g-3 g-md-5 mb-5 pb-5 justify-content-center">
+ <div class="col-lg-6 py-lg-4 pe-lg-5">
+ <svg class="bi mb-2 fs-2 text-body-secondary" aria-hidden="true"><use xlink:href="#box-seam"></use></svg>
+ <h3 class="fw-semibold">Install via package manager</h3>
+ <p class="pe-lg-5">
+ Install Bootstrap’s source Sass and JavaScript files via npm, RubyGems, Composer, or Meteor. Package managed installs don’t include documentation or our full build scripts. You can also <a href="https://github.com/twbs/examples/">use any demo from our Examples repo</a> to quickly jumpstart Bootstrap projects.
+ </p>
+ {{ highlight (printf ("npm install bootstrap@%s") .Site.Params.current_version) "sh" "" }}
+ {{ highlight (printf ("gem install bootstrap -v %s") .Site.Params.current_ruby_version) "sh" "" }}
+ <p>
+ <a href="/docs/{{ .Site.Params.docs_version }}/getting-started/download/">Read our installation docs</a> for more info and additional package managers.
+ </p>
+ </div>
+ <div class="col-lg-6 py-lg-4 ps-lg-5 border-lg-start">
+ <svg class="bi mb-2 fs-2 text-body-secondary" aria-hidden="true"><use xlink:href="#globe2"></use></svg>
+ <h3 class="fw-semibold">Include via CDN</h3>
+ <p class="pe-lg-5">
+ When you only need to include Bootstrap’s compiled CSS or JS, you can use <a href="https://www.jsdelivr.com/package/npm/bootstrap">jsDelivr</a>. See it in action with our simple <a href="/docs/{{ .Site.Params.docs_version }}/getting-started/introduction/#quick-start">quick start</a>, or <a href="/docs/{{ .Site.Params.docs_version }}/examples/">browse the examples</a> to jumpstart your next project. You can also choose to include Popper and our JS <a href="/docs/{{ .Site.Params.docs_version }}/getting-started/introduction/#separate">separately</a>.
+ </p>
+ {{ highlight (printf (`<link href="%s" rel="stylesheet" integrity=%q crossorigin="anonymous">`) .Site.Params.cdn.css (.Site.Params.cdn.css_hash | safeHTMLAttr)) "html" "" }}
+ {{ highlight (printf (`<script src="%s" integrity=%q crossorigin="anonymous"></script>`) .Site.Params.cdn.js_bundle (.Site.Params.cdn.js_bundle_hash | safeHTMLAttr)) "html" "" }}
+ </div>
+
+ <div class="col-md-8 mx-auto text-center">
+ <h4 class="fw-semibold">Read our getting started guides</h4>
+ <p>Get a jump on including Bootstrap's source files in a new project with our official guides.</p>
+ <div class="d-flex flex-wrap align-items-center justify-content-center gap-4 mt-4">
+ <a class="d-flex flex-column align-items-center text-decoration-none animate-img" href="/docs/{{ .Site.Params.docs_version }}/getting-started/webpack/">
+ <img class="d-block mb-2" src="/docs/{{ .Site.Params.docs_version }}/assets/img/webpack.svg" alt="" width="72" height="72" loading="lazy">
+ <span class="text-body-secondary">Webpack</span>
+ </a>
+ <a class="d-flex flex-column align-items-center text-decoration-none animate-img" href="/docs/{{ .Site.Params.docs_version }}/getting-started/parcel/">
+ <img class="d-block mb-2" src="/docs/{{ .Site.Params.docs_version }}/assets/img/parcel.png" alt="" width="72" height="72" loading="lazy">
+ <span class="text-body-secondary">Parcel</span>
+ </a>
+ <a class="d-flex flex-column align-items-center text-decoration-none animate-img" href="/docs/{{ .Site.Params.docs_version }}/getting-started/vite/">
+ <img class="d-block mb-2" src="/docs/{{ .Site.Params.docs_version }}/assets/img/vite.svg" alt="" width="72" height="72" loading="lazy">
+ <span class="text-body-secondary">Vite</span>
+ </a>
+ </div>
+ </div>
+</section>
diff --git a/site/layouts/partials/home/icons.html b/site/layouts/partials/home/icons.html
new file mode 100644
index 000000000..c510d9472
--- /dev/null
+++ b/site/layouts/partials/home/icons.html
@@ -0,0 +1,23 @@
+<section class="row g-3 g-md-5 pb-md-5 mb-5 align-items-center">
+ <div class="col-lg-6">
+ <div class="masthead-followup-icon d-inline-block mb-3" style="--bg-rgb: var(--bd-teal-rgb);">
+ {{ partial "icons/circle-square.svg" (dict "width" "32" "height" "32") }}
+ </div>
+ <h2 class="display-5 mb-3 fw-semibold lh-sm">Personalize it with Bootstrap&nbsp;Icons</h2>
+ <p class="lead fw-normal">
+ <a href="{{ .Site.Params.icons }}">Bootstrap Icons</a> is an open source SVG icon library featuring over 1,800 glyphs, with more added every release. They're designed to work in any project, whether you use Bootstrap itself or not. Use them as SVGs or icon fonts—both options give you vector scaling and easy customization via CSS.
+ </p>
+ <p class="d-flex justify-content-start lead fw-normal mb-md-0">
+ <a href="{{ .Site.Params.icons }}" class="icon-link icon-link-hover fw-semibold">
+ Get Bootstrap Icons
+ <svg class="bi" aria-hidden="true"><use xlink:href="#arrow-right"></use></svg>
+ </a>
+ </p>
+ </div>
+ <div class="col-lg-6">
+ {{ partial "responsive-img" (dict "context" .
+ "imgPath" "/assets/img/bootstrap-icons.png"
+ "alt" "Bootstrap Icons"
+ "classes" "d-block mt-3") }}
+ </div>
+</section>
diff --git a/site/layouts/partials/home/masthead-followup.html b/site/layouts/partials/home/masthead-followup.html
deleted file mode 100644
index e6cfb4724..000000000
--- a/site/layouts/partials/home/masthead-followup.html
+++ /dev/null
@@ -1,87 +0,0 @@
-<div class="container masthead-followup px-4 px-md-3">
- <section class="row mb-5 pb-md-4 align-items-center">
- <div class="col-md-5">
- <div class="masthead-followup-icon d-inline-block mb-2 text-white bg-success">
- {{ partial "icons/code.svg" (dict "width" "32" "height" "32") }}
- </div>
- <h2 class="display-5 fw-normal">Installation</h2>
- <p class="lead fw-normal">
- Install Bootstrap’s source Sass and JavaScript files via npm, Composer, or Meteor.
- </p>
- <p>Package managed installs don’t include documentation or our full build scripts. You can also <a href="https://github.com/twbs/bootstrap-npm-starter">use our npm template repo</a> to quickly generate a Bootstrap project via npm.</p>
- <a class="btn btn-lg btn-outline-primary mb-3" href="/docs/{{ .Site.Params.docs_version }}/getting-started/download/">Read installation docs</a>
- </div>
- <div class="col-md-7 ps-md-5">
- {{ highlight "npm install bootstrap" "sh" "" }}
- {{ highlight (printf ("gem install bootstrap -v %s") .Site.Params.current_ruby_version) "sh" "" }}
- </div>
- </section>
-
- <section class="row mb-5 pb-md-4 align-items-center">
- <div class="col-md-5">
- <div class="masthead-followup-icon d-inline-block mb-2 text-white bg-primary">
- {{ partial "icons/cloud-fill.svg" (dict "width" "32" "height" "32") }}
- </div>
- <h2 class="display-5 fw-normal">jsDelivr</h2>
- <p class="lead fw-normal">
- When you only need to include Bootstrap’s compiled CSS or JS, you can use <a href="https://www.jsdelivr.com/">jsDelivr</a>.
- </p>
- <p>
- See it in action with our simple <a href="/docs/{{ .Site.Params.docs_version }}/getting-started/introduction/#starter-template">starter template</a>, or <a href="/docs/{{ .Site.Params.docs_version }}/examples/">browse the examples</a> to jumpstart your next project. You can also choose to include Popper and our JS <a href="/docs/{{ .Site.Params.docs_version }}/getting-started/introduction/#separate">separately</a>.
- </p>
- <a class="btn btn-lg btn-outline-primary mb-3" href="/docs/{{ .Site.Params.docs_version }}/getting-started/introduction/">Explore the docs</a>
- </div>
- <div class="col-md-7 ps-md-5">
- {{ highlight (printf (`<!-- CSS only -->
-<link href="%s" rel="stylesheet" integrity=%q crossorigin="anonymous">
-`) .Site.Params.cdn.css (.Site.Params.cdn.css_hash | safeHTMLAttr)) "html" "" }}
- {{ highlight (printf (`<!-- JavaScript Bundle with Popper -->
-<script src="%s" integrity=%q crossorigin="anonymous"></script>
-`) .Site.Params.cdn.js_bundle (.Site.Params.cdn.js_bundle_hash | safeHTMLAttr)) "html" "" }}
- </div>
- </section>
-
- <section class="row mb-5 pb-md-4 align-items-center">
- <div class="col-md-5">
- <div class="masthead-followup-icon d-inline-block mb-2 text-white bd-bg-purple-bright">
- {{ partial "icons/circle-square.svg" (dict "width" "32" "height" "32") }}
- </div>
- <h2 class="display-5 fw-normal">Bootstrap Icons</h2>
- <p class="lead fw-normal">
- For the first time ever, Bootstrap has its own open source SVG icon library, designed to work best with our components and documentation.
- </p>
- <p>
- Bootstrap Icons are designed to work best with Bootstrap components, but they’ll work in any project. They’re SVGs, so they scale quickly and easily, can be implemented in several ways, and can be styled with CSS.
- </p>
- <a href="{{ .Site.Params.icons }}" class="btn btn-lg btn-outline-primary mb-3">Get Bootstrap Icons</a>
- </div>
- <div class="col-md-7 ps-md-5">
- <img class="img-fluid mt-3 mx-auto" srcset="/docs/{{ .Site.Params.docs_version }}/assets/img/bootstrap-icons.png,
- /docs/{{ .Site.Params.docs_version }}/assets/img/[email protected] 2x"
- src="/docs/{{ .Site.Params.docs_version }}/assets/img/bootstrap-icons.png"
- alt="Bootstrap Icons" width="700" height="425" loading="lazy">
- </div>
- </section>
-
- <section class="row mb-5 pb-md-4 align-items-center">
- <div class="col-md-5">
- <div class="masthead-followup-icon d-inline-block mb-2 text-white bg-danger">
- {{ partial "icons/droplet-fill.svg" (dict "width" "32" "height" "32") }}
- </div>
- <h2 class="display-5 fw-normal">Official Themes</h2>
- <p class="lead fw-normal">
- Take Bootstrap to the next level with premium themes from the <a href="{{ .Site.Params.themes }}">official Bootstrap Themes marketplace</a>.
- </p>
- <p>
- Themes are built on Bootstrap as their own extended frameworks, rich with new components and plugins, documentation, and powerful build tools.
- </p>
- <a href="{{ .Site.Params.themes }}" class="btn btn-lg btn-outline-primary mb-3">Browse themes</a>
- </div>
- <div class="col-md-7 ps-md-5">
- <img class="img-fluid mt-3 mx-auto" srcset="/docs/{{ .Site.Params.docs_version }}/assets/img/bootstrap-themes.png,
- /docs/{{ .Site.Params.docs_version }}/assets/img/[email protected] 2x"
- src="/docs/{{ .Site.Params.docs_version }}/assets/img/bootstrap-themes.png"
- alt="Bootstrap Themes" width="700" height="500" loading="lazy">
- </div>
- </section>
-</div>
diff --git a/site/layouts/partials/home/masthead.html b/site/layouts/partials/home/masthead.html
index e5661d9b3..c16841d81 100644
--- a/site/layouts/partials/home/masthead.html
+++ b/site/layouts/partials/home/masthead.html
@@ -1,28 +1,38 @@
<div class="bd-masthead mb-3" id="content">
- <div class="container px-4 px-md-3">
- <div class="row align-items-lg-center">
- <div class="col-8 mx-auto col-md-4 order-md-2 col-lg-5">
- {{ partial "icons/homepage-hero.svg" (dict "class" "img-fluid mb-3 mb-md-0" "width" "600" "height" "533") }}
- </div>
- <div class="col-md-8 order-md-1 col-lg-7 text-center text-md-start">
- <h1 class="mb-3">Build fast, responsive sites with Bootstrap</h1>
- <p class="lead mb-4">
- Quickly design and customize responsive mobile-first sites with Bootstrap, the world’s most popular front-end open source toolkit, featuring Sass variables and mixins, responsive grid system, extensive prebuilt components, and powerful JavaScript plugins.
- </p>
-
- <div class="d-flex flex-column flex-md-row">
- <a href="/docs/{{ .Site.Params.docs_version }}/getting-started/introduction/" class="btn btn-lg btn-bd-primary mb-3 me-md-3" onclick="ga('send', 'event', 'Jumbotron actions', 'Get started', 'Get started');">Get started</a>
- <a href="/docs/{{ .Site.Params.docs_version }}/getting-started/download/" class="btn btn-lg btn-outline-secondary mb-3" onclick="ga('send', 'event', 'Jumbotron actions', 'Download', 'Download {{ .Site.Params.current_version }}');">Download</a>
+ <div class="container-xxl bd-gutter">
+ <div class="col-md-8 mx-auto text-center">
+ <a class="d-flex flex-column flex-lg-row justify-content-center align-items-center mb-4 text-dark lh-sm text-decoration-none" href="https://www.herodevs.com/support/nes-bootstrap?utm_source=Bootstrap_site&utm_medium=Banner&utm_campaign=v3and4_eol" rel="noopener" target="_blank">
+ <span class="d-sm-inline-flex align-items-center gap-1 py-2 px-3 me-2 mb-2 mb-lg-0 rounded-5 masthead-notice">
+ Get Security Updates for Bootstrap 3 &amp; 4
+ <svg class="bi" style="width: 20px; height: 20px;" aria-hidden="true"><use xlink:href="#arrow-right-short"></use></svg>
+ </span>
+ </a>
+ {{ partial "responsive-img" (dict "context" .
+ "imgPath" "/assets/brand/bootstrap-logo-shadow.png"
+ "alt" "Bootstrap"
+ "classes" "d-none d-sm-block mb-3"
+ "lazyload" false) }}
+ <h1 class="mb-3 fw-semibold lh-1">Build fast, responsive sites with&nbsp;Bootstrap</h1>
+ <p class="lead mb-4">
+ Powerful, extensible, and feature-packed frontend toolkit. Build and customize with Sass, utilize prebuilt grid system and components, and bring projects to life with powerful JavaScript plugins.
+ </p>
+ <div class="d-flex flex-column flex-lg-row align-items-md-stretch justify-content-md-center gap-3 mb-4">
+ <div class="d-inline-block v-align-middle fs-5">
+ {{ highlight (printf ("npm i bootstrap@%s") .Site.Params.current_version) "sh" "" }}
</div>
- <p class="text-muted mb-0">
- Currently <strong>v{{ .Site.Params.current_version }}</strong>
- <span class="px-1">&middot;</span>
- <a href="https://getbootstrap.com/docs/4.6/getting-started/introduction/" class="link-secondary">v4.6.x docs</a>
- <span class="px-1">&middot;</span>
- <a href="/docs/versions/" class="link-secondary">All releases</a>
- </p>
+ <a href="/docs/{{ .Site.Params.docs_version }}/getting-started/introduction/" class="btn btn-lg bd-btn-lg btn-bd-primary d-flex align-items-center justify-content-center fw-semibold">
+ <svg class="bi me-2" aria-hidden="true"><use xlink:href="#book-half"></use></svg>
+ Read the docs
+ </a>
</div>
+ <p class="text-body-secondary mb-0">
+ Currently <strong>v{{ .Site.Params.current_version }}</strong>
+ <span class="px-1">&middot;</span>
+ <a href="/docs/{{ .Site.Params.docs_version }}/getting-started/download/" class="link-secondary">Download</a>
+ <span class="px-1">&middot;</span>
+ <a href="/docs/versions/" class="link-secondary text-nowrap">All releases</a>
+ </p>
+ {{ partial "ads" . }}
</div>
- {{ partial "ads" . }}
</div>
</div>
diff --git a/site/layouts/partials/home/plugins.html b/site/layouts/partials/home/plugins.html
new file mode 100644
index 000000000..d352ce8fe
--- /dev/null
+++ b/site/layouts/partials/home/plugins.html
@@ -0,0 +1,66 @@
+<section class="pb-md-5 mb-5">
+ <div class="col-lg-8 mb-5">
+ <div class="masthead-followup-icon d-inline-block mb-3" style="--bg-rgb: var(--bs-warning-rgb);">
+ <svg class="bi fs-1" aria-hidden="true"><use xlink:href="#plugin"></use></svg>
+ </div>
+ <h2 class="display-5 mb-3 fw-semibold lh-sm">Powerful JavaScript plugins without&nbsp;jQuery</h2>
+ <p class="lead fw-normal">
+ Add toggleable hidden elements, modals and offcanvas menus, popovers and tooltips, and so much more—all without jQuery. Bootstrap's JavaScript is HTML-first, meaning most plugins are added with <code>data</code> attributes in your HTML. Need more control? Include individual plugins programmatically.
+ </p>
+ <p class="d-flex justify-content-start lead fw-normal mb-md-0">
+ <a href="/docs/{{ .Site.Params.docs_version }}/getting-started/javascript/" class="icon-link icon-link-hover fw-semibold">
+ Learn more about Bootstrap JavaScript
+ <svg class="bi" aria-hidden="true"><use xlink:href="#arrow-right"></use></svg>
+ </a>
+ </p>
+ </div>
+ <div class="row gx-md-5">
+ <div class="col-lg-6 mb-3">
+ <h3 class="fw-semibold">Data attribute API</h3>
+ <p>Why write more JavaScript when you can write HTML? Nearly all of Bootstrap's JavaScript plugins feature a first-class data API, allowing you to use JavaScript just by adding <code>data</code> attributes.</p>
+ <div class="p-4 mb-3 border rounded-3">
+ <div class="dropdown">
+ <button class="btn btn-primary dropdown-toggle" type="button" data-bs-toggle="dropdown" aria-expanded="false">
+ Dropdown
+ </button>
+ <ul class="dropdown-menu">
+ <li><button class="dropdown-item" type="button">Dropdown item</button></li>
+ <li><button class="dropdown-item" type="button">Dropdown item</button></li>
+ <li><button class="dropdown-item" type="button">Dropdown item</button></li>
+ </ul>
+ </div>
+ </div>
+
+ {{ highlight (printf `<div class="dropdown">
+ <button class="btn btn-primary dropdown-toggle" type="button" data-bs-toggle="dropdown" aria-expanded="false">
+ Dropdown
+ </button>
+ <ul class="dropdown-menu">
+ <li><button class="dropdown-item" type="button">Dropdown item</button></li>
+ <li><button class="dropdown-item" type="button">Dropdown item</button></li>
+ <li><button class="dropdown-item" type="button">Dropdown item</button></li>
+ </ul>
+</div>
+`) "html" "" }}
+ <p>Learn more about <a href="/docs/{{ .Site.Params.docs_version }}/getting-started/javascript/#using-bootstrap-as-a-module">our JavaScript as modules</a> and <a href="/docs/{{ .Site.Params.docs_version }}/getting-started/javascript/#programmatic-api">using the programmatic API</a>.</p>
+ </div>
+ <div class="col-lg-6 mb-3">
+ <h3 class="fw-semibold">Comprehensive set of plugins</h3>
+ <p>Bootstrap features a dozen plugins that you can drop into any project. Drop them in all at once, or choose just the ones you need.</p>
+ <hr class="my-4">
+ <div class="row g-3">
+ {{- range $plugin := .Site.Data.plugins -}}
+ {{- /* TODO we should use urls.JoinPath here too, but the links include `#` which gets escaped */ -}}
+ {{- $href := printf "/docs/%s/%s" $.Site.Params.docs_version $plugin.link }}
+ <div class="col-sm-6 mb-2">
+ <a class="d-block pe-lg-4 text-decoration-none lh-sm" href="{{ $href }}">
+ <h4 class="mb-0 fs-5 fw-semibold">{{ $plugin.name }}</h4>
+ <small class="text-body-secondary">{{ $plugin.description }}</small>
+ </a>
+ </div>
+ {{- end }}
+ </div>
+ </div>
+ </div>
+
+</section>
diff --git a/site/layouts/partials/home/themes.html b/site/layouts/partials/home/themes.html
new file mode 100644
index 000000000..f5549151f
--- /dev/null
+++ b/site/layouts/partials/home/themes.html
@@ -0,0 +1,23 @@
+<section class="row g-3 g-md-5 pb-md-5 mb-5 align-items-center">
+ <div class="col-lg-6">
+ <div class="masthead-followup-icon d-inline-block mb-3" style="--bg-rgb: var(--bd-violet-rgb);">
+ {{ partial "icons/droplet-fill.svg" (dict "width" "32" "height" "32") }}
+ </div>
+ <h2 class="display-5 mb-3 fw-semibold lh-sm">Make it yours with official Bootstrap Themes</h2>
+ <p class="lead fw-normal">
+ Take Bootstrap to the next level with premium themes from the <a href="{{ .Site.Params.themes }}">official Bootstrap Themes marketplace</a>. Themes are built on Bootstrap as their own extended frameworks, rich with new components and plugins, documentation, and powerful build tools.
+ </p>
+ <p class="d-flex justify-content-start lead fw-normal mb-md-0">
+ <a href="{{ .Site.Params.themes }}" class="icon-link icon-link-hover fw-semibold">
+ Browse Bootstrap Themes
+ <svg class="bi" aria-hidden="true"><use xlink:href="#arrow-right"></use></svg>
+ </a>
+ </p>
+ </div>
+ <div class="col-lg-6">
+ {{ partial "responsive-img" (dict "context" .
+ "imgPath" "/assets/img/bootstrap-themes.png"
+ "alt" "Bootstrap Themes"
+ "classes" "d-block mt-3") }}
+ </div>
+</section>
diff --git a/site/layouts/partials/icons.html b/site/layouts/partials/icons.html
new file mode 100644
index 000000000..7eff3282f
--- /dev/null
+++ b/site/layouts/partials/icons.html
@@ -0,0 +1,84 @@
+<svg xmlns="http://www.w3.org/2000/svg" class="d-none">
+ <symbol id="arrow-right" viewBox="0 0 16 16">
+ <path fill-rule="evenodd" d="M1 8a.5.5 0 0 1 .5-.5h11.793l-3.147-3.146a.5.5 0 0 1 .708-.708l4 4a.5.5 0 0 1 0 .708l-4 4a.5.5 0 0 1-.708-.708L13.293 8.5H1.5A.5.5 0 0 1 1 8z"/>
+ </symbol>
+ <symbol id="arrow-right-short" viewBox="0 0 16 16">
+ <path fill-rule="evenodd" d="M4 8a.5.5 0 0 1 .5-.5h5.793L8.146 5.354a.5.5 0 1 1 .708-.708l3 3a.5.5 0 0 1 0 .708l-3 3a.5.5 0 0 1-.708-.708L10.293 8.5H4.5A.5.5 0 0 1 4 8"/>
+ </symbol>
+ <symbol id="book-half" viewBox="0 0 16 16">
+ <path d="M8.5 2.687c.654-.689 1.782-.886 3.112-.752 1.234.124 2.503.523 3.388.893v9.923c-.918-.35-2.107-.692-3.287-.81-1.094-.111-2.278-.039-3.213.492V2.687zM8 1.783C7.015.936 5.587.81 4.287.94c-1.514.153-3.042.672-3.994 1.105A.5.5 0 0 0 0 2.5v11a.5.5 0 0 0 .707.455c.882-.4 2.303-.881 3.68-1.02 1.409-.142 2.59.087 3.223.877a.5.5 0 0 0 .78 0c.633-.79 1.814-1.019 3.222-.877 1.378.139 2.8.62 3.681 1.02A.5.5 0 0 0 16 13.5v-11a.5.5 0 0 0-.293-.455c-.952-.433-2.48-.952-3.994-1.105C10.413.809 8.985.936 8 1.783z"/>
+ </symbol>
+ <symbol id="box-seam" viewBox="0 0 16 16">
+ <path d="M8.186 1.113a.5.5 0 0 0-.372 0L1.846 3.5l2.404.961L10.404 2l-2.218-.887zm3.564 1.426L5.596 5 8 5.961 14.154 3.5l-2.404-.961zm3.25 1.7-6.5 2.6v7.922l6.5-2.6V4.24zM7.5 14.762V6.838L1 4.239v7.923l6.5 2.6zM7.443.184a1.5 1.5 0 0 1 1.114 0l7.129 2.852A.5.5 0 0 1 16 3.5v8.662a1 1 0 0 1-.629.928l-7.185 2.874a.5.5 0 0 1-.372 0L.63 13.09a1 1 0 0 1-.63-.928V3.5a.5.5 0 0 1 .314-.464L7.443.184z"/>
+ </symbol>
+ <symbol id="braces" viewBox="0 0 16 16">
+ <path d="M2.114 8.063V7.9c1.005-.102 1.497-.615 1.497-1.6V4.503c0-1.094.39-1.538 1.354-1.538h.273V2h-.376C3.25 2 2.49 2.759 2.49 4.352v1.524c0 1.094-.376 1.456-1.49 1.456v1.299c1.114 0 1.49.362 1.49 1.456v1.524c0 1.593.759 2.352 2.372 2.352h.376v-.964h-.273c-.964 0-1.354-.444-1.354-1.538V9.663c0-.984-.492-1.497-1.497-1.6zM13.886 7.9v.163c-1.005.103-1.497.616-1.497 1.6v1.798c0 1.094-.39 1.538-1.354 1.538h-.273v.964h.376c1.613 0 2.372-.759 2.372-2.352v-1.524c0-1.094.376-1.456 1.49-1.456V7.332c-1.114 0-1.49-.362-1.49-1.456V4.352C13.51 2.759 12.75 2 11.138 2h-.376v.964h.273c.964 0 1.354.444 1.354 1.538V6.3c0 .984.492 1.497 1.497 1.6z"/>
+ </symbol>
+ <symbol id="braces-asterisk" viewBox="0 0 16 16">
+ <path fill-rule="evenodd" d="M1.114 8.063V7.9c1.005-.102 1.497-.615 1.497-1.6V4.503c0-1.094.39-1.538 1.354-1.538h.273V2h-.376C2.25 2 1.49 2.759 1.49 4.352v1.524c0 1.094-.376 1.456-1.49 1.456v1.299c1.114 0 1.49.362 1.49 1.456v1.524c0 1.593.759 2.352 2.372 2.352h.376v-.964h-.273c-.964 0-1.354-.444-1.354-1.538V9.663c0-.984-.492-1.497-1.497-1.6ZM14.886 7.9v.164c-1.005.103-1.497.616-1.497 1.6v1.798c0 1.094-.39 1.538-1.354 1.538h-.273v.964h.376c1.613 0 2.372-.759 2.372-2.352v-1.524c0-1.094.376-1.456 1.49-1.456v-1.3c-1.114 0-1.49-.362-1.49-1.456V4.352C14.51 2.759 13.75 2 12.138 2h-.376v.964h.273c.964 0 1.354.444 1.354 1.538V6.3c0 .984.492 1.497 1.497 1.6ZM7.5 11.5V9.207l-1.621 1.621-.707-.707L6.792 8.5H4.5v-1h2.293L5.172 5.879l.707-.707L7.5 6.792V4.5h1v2.293l1.621-1.621.707.707L9.208 7.5H11.5v1H9.207l1.621 1.621-.707.707L8.5 9.208V11.5h-1Z"/>
+ </symbol>
+ <symbol id="check2" viewBox="0 0 16 16">
+ <path d="M13.854 3.646a.5.5 0 0 1 0 .708l-7 7a.5.5 0 0 1-.708 0l-3.5-3.5a.5.5 0 1 1 .708-.708L6.5 10.293l6.646-6.647a.5.5 0 0 1 .708 0z"/>
+ </symbol>
+ <symbol id="chevron-expand" viewBox="0 0 16 16">
+ <path fill-rule="evenodd" d="M3.646 9.146a.5.5 0 0 1 .708 0L8 12.793l3.646-3.647a.5.5 0 0 1 .708.708l-4 4a.5.5 0 0 1-.708 0l-4-4a.5.5 0 0 1 0-.708zm0-2.292a.5.5 0 0 0 .708 0L8 3.207l3.646 3.647a.5.5 0 0 0 .708-.708l-4-4a.5.5 0 0 0-.708 0l-4 4a.5.5 0 0 0 0 .708z"/>
+ </symbol>
+ <symbol id="circle-half" viewBox="0 0 16 16">
+ <path d="M8 15A7 7 0 1 0 8 1v14zm0 1A8 8 0 1 1 8 0a8 8 0 0 1 0 16z"/>
+ </symbol>
+ <symbol id="clipboard" viewBox="0 0 16 16">
+ <path d="M4 1.5H3a2 2 0 0 0-2 2V14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V3.5a2 2 0 0 0-2-2h-1v1h1a1 1 0 0 1 1 1V14a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V3.5a1 1 0 0 1 1-1h1v-1z"/>
+ <path d="M9.5 1a.5.5 0 0 1 .5.5v1a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5v-1a.5.5 0 0 1 .5-.5h3zm-3-1A1.5 1.5 0 0 0 5 1.5v1A1.5 1.5 0 0 0 6.5 4h3A1.5 1.5 0 0 0 11 2.5v-1A1.5 1.5 0 0 0 9.5 0h-3z"/>
+ </symbol>
+ <symbol id="code" viewBox="0 0 16 16">
+ <path d="M5.854 4.854a.5.5 0 1 0-.708-.708l-3.5 3.5a.5.5 0 0 0 0 .708l3.5 3.5a.5.5 0 0 0 .708-.708L2.707 8l3.147-3.146zm4.292 0a.5.5 0 0 1 .708-.708l3.5 3.5a.5.5 0 0 1 0 .708l-3.5 3.5a.5.5 0 0 1-.708-.708L13.293 8l-3.147-3.146z"/>
+ </symbol>
+ <symbol id="file-earmark-richtext" viewBox="0 0 16 16">
+ <path d="M14 4.5V14a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V2a2 2 0 0 1 2-2h5.5L14 4.5zm-3 0A1.5 1.5 0 0 1 9.5 3V1H4a1 1 0 0 0-1 1v12a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1V4.5h-2z"/>
+ <path d="M4.5 12.5A.5.5 0 0 1 5 12h3a.5.5 0 0 1 0 1H5a.5.5 0 0 1-.5-.5zm0-2A.5.5 0 0 1 5 10h6a.5.5 0 0 1 0 1H5a.5.5 0 0 1-.5-.5zm1.639-3.708 1.33.886 1.854-1.855a.25.25 0 0 1 .289-.047l1.888.974V8.5a.5.5 0 0 1-.5.5H5a.5.5 0 0 1-.5-.5V8s1.54-1.274 1.639-1.208zM6.25 6a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5z"/>
+ </symbol>
+ <symbol id="globe2" viewBox="0 0 16 16">
+ <path d="M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8zm7.5-6.923c-.67.204-1.335.82-1.887 1.855-.143.268-.276.56-.395.872.705.157 1.472.257 2.282.287V1.077zM4.249 3.539c.142-.384.304-.744.481-1.078a6.7 6.7 0 0 1 .597-.933A7.01 7.01 0 0 0 3.051 3.05c.362.184.763.349 1.198.49zM3.509 7.5c.036-1.07.188-2.087.436-3.008a9.124 9.124 0 0 1-1.565-.667A6.964 6.964 0 0 0 1.018 7.5h2.49zm1.4-2.741a12.344 12.344 0 0 0-.4 2.741H7.5V5.091c-.91-.03-1.783-.145-2.591-.332zM8.5 5.09V7.5h2.99a12.342 12.342 0 0 0-.399-2.741c-.808.187-1.681.301-2.591.332zM4.51 8.5c.035.987.176 1.914.399 2.741A13.612 13.612 0 0 1 7.5 10.91V8.5H4.51zm3.99 0v2.409c.91.03 1.783.145 2.591.332.223-.827.364-1.754.4-2.741H8.5zm-3.282 3.696c.12.312.252.604.395.872.552 1.035 1.218 1.65 1.887 1.855V11.91c-.81.03-1.577.13-2.282.287zm.11 2.276a6.696 6.696 0 0 1-.598-.933 8.853 8.853 0 0 1-.481-1.079 8.38 8.38 0 0 0-1.198.49 7.01 7.01 0 0 0 2.276 1.522zm-1.383-2.964A13.36 13.36 0 0 1 3.508 8.5h-2.49a6.963 6.963 0 0 0 1.362 3.675c.47-.258.995-.482 1.565-.667zm6.728 2.964a7.009 7.009 0 0 0 2.275-1.521 8.376 8.376 0 0 0-1.197-.49 8.853 8.853 0 0 1-.481 1.078 6.688 6.688 0 0 1-.597.933zM8.5 11.909v3.014c.67-.204 1.335-.82 1.887-1.855.143-.268.276-.56.395-.872A12.63 12.63 0 0 0 8.5 11.91zm3.555-.401c.57.185 1.095.409 1.565.667A6.963 6.963 0 0 0 14.982 8.5h-2.49a13.36 13.36 0 0 1-.437 3.008zM14.982 7.5a6.963 6.963 0 0 0-1.362-3.675c-.47.258-.995.482-1.565.667.248.92.4 1.938.437 3.008h2.49zM11.27 2.461c.177.334.339.694.482 1.078a8.368 8.368 0 0 0 1.196-.49 7.01 7.01 0 0 0-2.275-1.52c.218.283.418.597.597.932zm-.488 1.343a7.765 7.765 0 0 0-.395-.872C9.835 1.897 9.17 1.282 8.5 1.077V4.09c.81-.03 1.577-.13 2.282-.287z"/>
+ </symbol>
+ <symbol id="grid-fill" viewBox="0 0 16 16">
+ <path d="M1 2.5A1.5 1.5 0 0 1 2.5 1h3A1.5 1.5 0 0 1 7 2.5v3A1.5 1.5 0 0 1 5.5 7h-3A1.5 1.5 0 0 1 1 5.5v-3zm8 0A1.5 1.5 0 0 1 10.5 1h3A1.5 1.5 0 0 1 15 2.5v3A1.5 1.5 0 0 1 13.5 7h-3A1.5 1.5 0 0 1 9 5.5v-3zm-8 8A1.5 1.5 0 0 1 2.5 9h3A1.5 1.5 0 0 1 7 10.5v3A1.5 1.5 0 0 1 5.5 15h-3A1.5 1.5 0 0 1 1 13.5v-3zm8 0A1.5 1.5 0 0 1 10.5 9h3a1.5 1.5 0 0 1 1.5 1.5v3a1.5 1.5 0 0 1-1.5 1.5h-3A1.5 1.5 0 0 1 9 13.5v-3z"/>
+ </symbol>
+ <symbol id="lightning-charge-fill" viewBox="0 0 16 16">
+ <path d="M11.251.068a.5.5 0 0 1 .227.58L9.677 6.5H13a.5.5 0 0 1 .364.843l-8 8.5a.5.5 0 0 1-.842-.49L6.323 9.5H3a.5.5 0 0 1-.364-.843l8-8.5a.5.5 0 0 1 .615-.09z"/>
+ </symbol>
+ <symbol id="list" viewBox="0 0 16 16">
+ <path fill-rule="evenodd" d="M2.5 12a.5.5 0 0 1 .5-.5h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm0-4a.5.5 0 0 1 .5-.5h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm0-4a.5.5 0 0 1 .5-.5h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5z"/>
+ </symbol>
+ <symbol id="magic" viewBox="0 0 16 16">
+ <path d="M9.5 2.672a.5.5 0 1 0 1 0V.843a.5.5 0 0 0-1 0v1.829Zm4.5.035A.5.5 0 0 0 13.293 2L12 3.293a.5.5 0 1 0 .707.707L14 2.707ZM7.293 4A.5.5 0 1 0 8 3.293L6.707 2A.5.5 0 0 0 6 2.707L7.293 4Zm-.621 2.5a.5.5 0 1 0 0-1H4.843a.5.5 0 1 0 0 1h1.829Zm8.485 0a.5.5 0 1 0 0-1h-1.829a.5.5 0 0 0 0 1h1.829ZM13.293 10A.5.5 0 1 0 14 9.293L12.707 8a.5.5 0 1 0-.707.707L13.293 10ZM9.5 11.157a.5.5 0 0 0 1 0V9.328a.5.5 0 0 0-1 0v1.829Zm1.854-5.097a.5.5 0 0 0 0-.706l-.708-.708a.5.5 0 0 0-.707 0L8.646 5.94a.5.5 0 0 0 0 .707l.708.708a.5.5 0 0 0 .707 0l1.293-1.293Zm-3 3a.5.5 0 0 0 0-.706l-.708-.708a.5.5 0 0 0-.707 0L.646 13.94a.5.5 0 0 0 0 .707l.708.708a.5.5 0 0 0 .707 0L8.354 9.06Z"/>
+ </symbol>
+ <symbol id="menu-button-wide-fill" viewBox="0 0 16 16">
+ <path d="M1.5 0A1.5 1.5 0 0 0 0 1.5v2A1.5 1.5 0 0 0 1.5 5h13A1.5 1.5 0 0 0 16 3.5v-2A1.5 1.5 0 0 0 14.5 0h-13zm1 2h3a.5.5 0 0 1 0 1h-3a.5.5 0 0 1 0-1zm9.927.427A.25.25 0 0 1 12.604 2h.792a.25.25 0 0 1 .177.427l-.396.396a.25.25 0 0 1-.354 0l-.396-.396zM0 8a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v5a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2V8zm1 3v2a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-2H1zm14-1V8a1 1 0 0 0-1-1H2a1 1 0 0 0-1 1v2h14zM2 8.5a.5.5 0 0 1 .5-.5h9a.5.5 0 0 1 0 1h-9a.5.5 0 0 1-.5-.5zm0 4a.5.5 0 0 1 .5-.5h6a.5.5 0 0 1 0 1h-6a.5.5 0 0 1-.5-.5z"/>
+ </symbol>
+ <symbol id="moon-stars-fill" viewBox="0 0 16 16">
+ <path d="M6 .278a.768.768 0 0 1 .08.858 7.208 7.208 0 0 0-.878 3.46c0 4.021 3.278 7.277 7.318 7.277.527 0 1.04-.055 1.533-.16a.787.787 0 0 1 .81.316.733.733 0 0 1-.031.893A8.349 8.349 0 0 1 8.344 16C3.734 16 0 12.286 0 7.71 0 4.266 2.114 1.312 5.124.06A.752.752 0 0 1 6 .278z"/>
+ <path d="M10.794 3.148a.217.217 0 0 1 .412 0l.387 1.162c.173.518.579.924 1.097 1.097l1.162.387a.217.217 0 0 1 0 .412l-1.162.387a1.734 1.734 0 0 0-1.097 1.097l-.387 1.162a.217.217 0 0 1-.412 0l-.387-1.162A1.734 1.734 0 0 0 9.31 6.593l-1.162-.387a.217.217 0 0 1 0-.412l1.162-.387a1.734 1.734 0 0 0 1.097-1.097l.387-1.162zM13.863.099a.145.145 0 0 1 .274 0l.258.774c.115.346.386.617.732.732l.774.258a.145.145 0 0 1 0 .274l-.774.258a1.156 1.156 0 0 0-.732.732l-.258.774a.145.145 0 0 1-.274 0l-.258-.774a1.156 1.156 0 0 0-.732-.732l-.774-.258a.145.145 0 0 1 0-.274l.774-.258c.346-.115.617-.386.732-.732L13.863.1z"/>
+ </symbol>
+ <symbol id="palette2" viewBox="0 0 16 16">
+ <path d="M0 .5A.5.5 0 0 1 .5 0h5a.5.5 0 0 1 .5.5v5.277l4.147-4.131a.5.5 0 0 1 .707 0l3.535 3.536a.5.5 0 0 1 0 .708L10.261 10H15.5a.5.5 0 0 1 .5.5v5a.5.5 0 0 1-.5.5H3a2.99 2.99 0 0 1-2.121-.879A2.99 2.99 0 0 1 0 13.044m6-.21 7.328-7.3-2.829-2.828L6 7.188v5.647zM4.5 13a1.5 1.5 0 1 0-3 0 1.5 1.5 0 0 0 3 0zM15 15v-4H9.258l-4.015 4H15zM0 .5v12.495V.5z"/>
+ <path d="M0 12.995V13a3.07 3.07 0 0 0 0-.005z"/>
+ </symbol>
+ <symbol id="plugin" viewBox="0 0 16 16">
+ <path fill-rule="evenodd" d="M1 8a7 7 0 1 1 2.898 5.673c-.167-.121-.216-.406-.002-.62l1.8-1.8a3.5 3.5 0 0 0 4.572-.328l1.414-1.415a.5.5 0 0 0 0-.707l-.707-.707 1.559-1.563a.5.5 0 1 0-.708-.706l-1.559 1.562-1.414-1.414 1.56-1.562a.5.5 0 1 0-.707-.706l-1.56 1.56-.707-.706a.5.5 0 0 0-.707 0L5.318 5.975a3.5 3.5 0 0 0-.328 4.571l-1.8 1.8c-.58.58-.62 1.6.121 2.137A8 8 0 1 0 0 8a.5.5 0 0 0 1 0Z"/>
+ </symbol>
+ <symbol id="plus" viewBox="0 0 16 16">
+ <path d="M8 4a.5.5 0 0 1 .5.5v3h3a.5.5 0 0 1 0 1h-3v3a.5.5 0 0 1-1 0v-3h-3a.5.5 0 0 1 0-1h3v-3A.5.5 0 0 1 8 4z"/>
+ </symbol>
+ <symbol id="sun-fill" viewBox="0 0 16 16">
+ <path d="M8 12a4 4 0 1 0 0-8 4 4 0 0 0 0 8zM8 0a.5.5 0 0 1 .5.5v2a.5.5 0 0 1-1 0v-2A.5.5 0 0 1 8 0zm0 13a.5.5 0 0 1 .5.5v2a.5.5 0 0 1-1 0v-2A.5.5 0 0 1 8 13zm8-5a.5.5 0 0 1-.5.5h-2a.5.5 0 0 1 0-1h2a.5.5 0 0 1 .5.5zM3 8a.5.5 0 0 1-.5.5h-2a.5.5 0 0 1 0-1h2A.5.5 0 0 1 3 8zm10.657-5.657a.5.5 0 0 1 0 .707l-1.414 1.415a.5.5 0 1 1-.707-.708l1.414-1.414a.5.5 0 0 1 .707 0zm-9.193 9.193a.5.5 0 0 1 0 .707L3.05 13.657a.5.5 0 0 1-.707-.707l1.414-1.414a.5.5 0 0 1 .707 0zm9.193 2.121a.5.5 0 0 1-.707 0l-1.414-1.414a.5.5 0 0 1 .707-.707l1.414 1.414a.5.5 0 0 1 0 .707zM4.464 4.465a.5.5 0 0 1-.707 0L2.343 3.05a.5.5 0 1 1 .707-.707l1.414 1.414a.5.5 0 0 1 0 .708z"/>
+ </symbol>
+ <symbol id="three-dots" viewBox="0 0 16 16">
+ <path d="M3 9.5a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3zm5 0a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3zm5 0a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3z"/>
+ </symbol>
+ <symbol id="tools" viewBox="0 0 16 16">
+ <path d="M1 0 0 1l2.2 3.081a1 1 0 0 0 .815.419h.07a1 1 0 0 1 .708.293l2.675 2.675-2.617 2.654A3.003 3.003 0 0 0 0 13a3 3 0 1 0 5.878-.851l2.654-2.617.968.968-.305.914a1 1 0 0 0 .242 1.023l3.356 3.356a1 1 0 0 0 1.414 0l1.586-1.586a1 1 0 0 0 0-1.414l-3.356-3.356a1 1 0 0 0-1.023-.242L10.5 9.5l-.96-.96 2.68-2.643A3.005 3.005 0 0 0 16 3c0-.269-.035-.53-.102-.777l-2.14 2.141L12 4l-.364-1.757L13.777.102a3 3 0 0 0-3.675 3.68L7.462 6.46 4.793 3.793a1 1 0 0 1-.293-.707v-.071a1 1 0 0 0-.419-.814L1 0zm9.646 10.646a.5.5 0 0 1 .708 0l3 3a.5.5 0 0 1-.708.708l-3-3a.5.5 0 0 1 0-.708zM3 11l.471.242.529.026.287.445.445.287.026.529L5 13l-.242.471-.026.529-.445.287-.287.445-.529.026L3 15l-.471-.242L2 14.732l-.287-.445L1.268 14l-.026-.529L1 13l.242-.471.026-.529.445-.287.287-.445.529-.026L3 11z"/>
+ </symbol>
+ <symbol id="ui-radios" viewBox="0 0 16 16">
+ <path d="M7 2.5a.5.5 0 0 1 .5-.5h7a.5.5 0 0 1 .5.5v1a.5.5 0 0 1-.5.5h-7a.5.5 0 0 1-.5-.5v-1zM0 12a3 3 0 1 1 6 0 3 3 0 0 1-6 0zm7-1.5a.5.5 0 0 1 .5-.5h7a.5.5 0 0 1 .5.5v1a.5.5 0 0 1-.5.5h-7a.5.5 0 0 1-.5-.5v-1zm0-5a.5.5 0 0 1 .5-.5h5a.5.5 0 0 1 0 1h-5a.5.5 0 0 1-.5-.5zm0 8a.5.5 0 0 1 .5-.5h5a.5.5 0 0 1 0 1h-5a.5.5 0 0 1-.5-.5zM3 1a3 3 0 1 0 0 6 3 3 0 0 0 0-6zm0 4.5a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3z"/>
+ </symbol>
+</svg>
diff --git a/site/layouts/partials/icons/bootstrap-logo-solid.svg b/site/layouts/partials/icons/bootstrap-logo-solid.svg
deleted file mode 100644
index 59bed369b..000000000
--- a/site/layouts/partials/icons/bootstrap-logo-solid.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg"{{ with .width }} width="{{ . }}"{{ end }}{{ with .height }} height="{{ . }}"{{ end }}{{ with .class }} class="{{ . }}"{{ end }} viewBox="0 0 64 64" role="img"><title>{{ with .title }}{{ . }}{{ else }}Bootstrap{{ end }}</title><path fill="currentColor" fill-rule="evenodd" d="M16 0h32c8.837 0 16 7.163 16 16v32c0 8.837-7.163 16-16 16H16C7.163 64 0 56.837 0 48V16C0 7.163 7.163 0 16 0zm18.14 49c7.22 0 11.555-3.633 11.555-9.586 0-4.406-3.047-7.664-7.617-8.133v-.398c3.328-.563 5.93-3.727 5.93-7.266 0-5.203-3.82-8.437-10.172-8.437H20.242V49h13.899zm-8.648-29.367h7.125c3.89 0 6.164 1.828 6.164 4.945 0 3.211-2.414 4.922-7.054 4.922h-6.235v-9.867zm0 24.914V33.648h7.29c4.945 0 7.546 1.852 7.546 5.391 0 3.586-2.508 5.508-7.242 5.508h-7.594z"/></svg>
diff --git a/site/layouts/partials/icons/bootstrap.svg b/site/layouts/partials/icons/bootstrap.svg
deleted file mode 100644
index 1b57d335e..000000000
--- a/site/layouts/partials/icons/bootstrap.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg"{{ with .width }} width="{{ . }}"{{ end }}{{ with .height }} height="{{ . }}"{{ end }}{{ with .class }} class="{{ . }}"{{ end }} viewBox="0 0 612 612" role="img"><title>{{ with .title }}{{ . }}{{ else }}Bootstrap{{ end }}</title><path fill="currentColor" d="M510 8a94.3 94.3 0 0 1 94 94v408a94.3 94.3 0 0 1-94 94H102a94.3 94.3 0 0 1-94-94V102a94.3 94.3 0 0 1 94-94h408m0-8H102C45.9 0 0 45.9 0 102v408c0 56.1 45.9 102 102 102h408c56.1 0 102-45.9 102-102V102C612 45.9 566.1 0 510 0z"/><path fill="currentColor" d="M196.77 471.5V154.43h124.15c54.27 0 91 31.64 91 79.1 0 33-24.17 63.72-54.71 69.21v1.76c43.07 5.49 70.75 35.82 70.75 78 0 55.81-40 89-107.45 89zm39.55-180.4h63.28c46.8 0 72.29-18.68 72.29-53 0-31.42-21.53-48.78-60-48.78h-75.57zm78.22 145.46c47.68 0 72.73-19.34 72.73-56s-25.93-55.37-76.46-55.37h-74.49v111.4z"/></svg> \ No newline at end of file
diff --git a/site/layouts/partials/icons/circle-square.svg b/site/layouts/partials/icons/circle-square.svg
index edd05754d..443cdabed 100644
--- a/site/layouts/partials/icons/circle-square.svg
+++ b/site/layouts/partials/icons/circle-square.svg
@@ -1,4 +1,4 @@
-<svg xmlns="http://www.w3.org/2000/svg"{{ with .width }} width="{{ . }}"{{ end }}{{ with .height }} height="{{ . }}"{{ end }}{{ with .class }} class="{{ . }}"{{ end }} fill="currentColor" focusable="false" viewBox="0 0 16 16">
+<svg xmlns="http://www.w3.org/2000/svg"{{ with .width }} width="{{ . }}"{{ end }}{{ with .height }} height="{{ . }}"{{ end }}{{ with .class }} class="{{ . }}"{{ end }} fill="currentColor" viewBox="0 0 16 16" aria-hidden="true">
<path d="M0 6a6 6 0 1112 0A6 6 0 010 6z"/>
<path d="M12.93 5h1.57a.5.5 0 01.5.5v9a.5.5 0 01-.5.5h-9a.5.5 0 01-.5-.5v-1.57a6.953 6.953 0 01-1-.22v1.79A1.5 1.5 0 005.5 16h9a1.5 1.5 0 001.5-1.5v-9A1.5 1.5 0 0014.5 4h-1.79c.097.324.17.658.22 1z"/>
</svg>
diff --git a/site/layouts/partials/icons/cloud-fill.svg b/site/layouts/partials/icons/cloud-fill.svg
deleted file mode 100644
index 4ca9276eb..000000000
--- a/site/layouts/partials/icons/cloud-fill.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg"{{ with .width }} width="{{ . }}"{{ end }}{{ with .height }} height="{{ . }}"{{ end }}{{ with .class }} class="{{ . }}"{{ end }} fill="currentColor" focusable="false" viewBox="0 0 16 16">
- <path fill-rule="evenodd" d="M3.5 13a3.5 3.5 0 11.59-6.95 5.002 5.002 0 119.804 1.98A2.5 2.5 0 0113.5 13h-10z" clip-rule="evenodd"/>
-</svg>
diff --git a/site/layouts/partials/icons/code.svg b/site/layouts/partials/icons/code.svg
deleted file mode 100644
index 73156851a..000000000
--- a/site/layouts/partials/icons/code.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg"{{ with .width }} width="{{ . }}"{{ end }}{{ with .height }} height="{{ . }}"{{ end }}{{ with .class }} class="{{ . }}"{{ end }} fill="currentColor" focusable="false" viewBox="0 0 16 16">
- <path fill-rule="evenodd" d="M5.854 4.146a.5.5 0 010 .708L2.707 8l3.147 3.146a.5.5 0 01-.708.708l-3.5-3.5a.5.5 0 010-.708l3.5-3.5a.5.5 0 01.708 0zm4.292 0a.5.5 0 000 .708L13.293 8l-3.147 3.146a.5.5 0 00.708.708l3.5-3.5a.5.5 0 000-.708l-3.5-3.5a.5.5 0 00-.708 0z" clip-rule="evenodd"/>
-</svg>
diff --git a/site/layouts/partials/icons/collapse.svg b/site/layouts/partials/icons/collapse.svg
deleted file mode 100644
index ede702d68..000000000
--- a/site/layouts/partials/icons/collapse.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg"{{ with .width }} width="{{ . }}"{{ end }}{{ with .height }} height="{{ . }}"{{ end }}{{ with .class }} class="{{ . }}"{{ end }} fill="currentColor" viewBox="0 0 16 16">
- <title>{{ with .title }}{{ . }}{{ else }}Collapse{{ end }}</title>
- <path fill-rule="evenodd" d="M1 8a.5.5 0 0 1 .5-.5h13a.5.5 0 0 1 0 1h-13A.5.5 0 0 1 1 8zm7-8a.5.5 0 0 1 .5.5v3.793l1.146-1.147a.5.5 0 0 1 .708.708l-2 2a.5.5 0 0 1-.708 0l-2-2a.5.5 0 1 1 .708-.708L7.5 4.293V.5A.5.5 0 0 1 8 0zm-.5 11.707l-1.146 1.147a.5.5 0 0 1-.708-.708l2-2a.5.5 0 0 1 .708 0l2 2a.5.5 0 0 1-.708.708L8.5 11.707V15.5a.5.5 0 0 1-1 0v-3.793z"/>
-</svg>
diff --git a/site/layouts/partials/icons/droplet-fill.svg b/site/layouts/partials/icons/droplet-fill.svg
index 228abfa8b..1256029d2 100644
--- a/site/layouts/partials/icons/droplet-fill.svg
+++ b/site/layouts/partials/icons/droplet-fill.svg
@@ -1,3 +1,3 @@
-<svg xmlns="http://www.w3.org/2000/svg"{{ with .width }} width="{{ . }}"{{ end }}{{ with .height }} height="{{ . }}"{{ end }}{{ with .class }} class="{{ . }}"{{ end }} fill="currentColor" focusable="false" viewBox="0 0 16 16">
+<svg xmlns="http://www.w3.org/2000/svg"{{ with .width }} width="{{ . }}"{{ end }}{{ with .height }} height="{{ . }}"{{ end }}{{ with .class }} class="{{ . }}"{{ end }} fill="currentColor" viewBox="0 0 16 16" aria-hidden="true">
<path fill-rule="evenodd" d="M8 16a6 6 0 006-6c0-1.655-1.122-2.904-2.432-4.362C10.254 4.176 8.75 2.503 8 0c0 0-6 5.686-6 10a6 6 0 006 6zM6.646 4.646c-.376.377-1.272 1.489-2.093 3.13l.894.448c.78-1.559 1.616-2.58 1.907-2.87l-.708-.708z" clip-rule="evenodd"/>
</svg>
diff --git a/site/layouts/partials/icons/expand.svg b/site/layouts/partials/icons/expand.svg
deleted file mode 100644
index d14315175..000000000
--- a/site/layouts/partials/icons/expand.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg"{{ with .width }} width="{{ . }}"{{ end }}{{ with .height }} height="{{ . }}"{{ end }}{{ with .class }} class="{{ . }}"{{ end }} fill="currentColor" viewBox="0 0 16 16">
- <title>{{ with .title }}{{ . }}{{ else }}Expand{{ end }}</title>
- <path fill-rule="evenodd" d="M1 8a.5.5 0 0 1 .5-.5h13a.5.5 0 0 1 0 1h-13A.5.5 0 0 1 1 8zM7.646.146a.5.5 0 0 1 .708 0l2 2a.5.5 0 0 1-.708.708L8.5 1.707V5.5a.5.5 0 0 1-1 0V1.707L6.354 2.854a.5.5 0 1 1-.708-.708l2-2zM8 10a.5.5 0 0 1 .5.5v3.793l1.146-1.147a.5.5 0 0 1 .708.708l-2 2a.5.5 0 0 1-.708 0l-2-2a.5.5 0 0 1 .708-.708L7.5 14.293V10.5A.5.5 0 0 1 8 10z"/>
-</svg>
diff --git a/site/layouts/partials/icons/homepage-hero.svg b/site/layouts/partials/icons/homepage-hero.svg
deleted file mode 100644
index 538045ad9..000000000
--- a/site/layouts/partials/icons/homepage-hero.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg"{{ with .width }} width="{{ . }}"{{ end }}{{ with .height }} height="{{ . }}"{{ end }}{{ with .class }} class="{{ . }}"{{ end }} role="img" viewBox="0 0 900 800"><title>{{ with .title }}{{ . }}{{ else }}Bootstrap{{ end }}</title><defs><filter id="filter0_d" width="704" height="623.928" x="98" y="96" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feColorMatrix in="SourceAlpha" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"/><feOffset dy="8"/><feGaussianBlur stdDeviation="16"/><feColorMatrix values="0 0 0 0 0.423529 0 0 0 0 0.0666667 0 0 0 0 0.956863 0 0 0 0.25 0"/><feBlend in2="BackgroundImageFix" result="effect1_dropShadow"/><feBlend in="SourceGraphic" in2="effect1_dropShadow" result="shape"/></filter><filter id="filter1_d" width="704" height="623.928" x="98" y="96" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feColorMatrix in="SourceAlpha" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"/><feOffset dy="8"/><feGaussianBlur stdDeviation="16"/><feColorMatrix values="0 0 0 0 0.423529 0 0 0 0 0.0666667 0 0 0 0 0.956863 0 0 0 0.25 0"/><feBlend in2="BackgroundImageFix" result="effect1_dropShadow"/><feBlend in="SourceGraphic" in2="effect1_dropShadow" result="shape"/></filter><filter id="filter2_d" width="260.144" height="302.767" x="327.804" y="252.368" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feColorMatrix in="SourceAlpha" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"/><feOffset dy="4"/><feGaussianBlur stdDeviation="8"/><feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.15 0"/><feBlend in2="BackgroundImageFix" result="effect1_dropShadow"/><feBlend in="SourceGraphic" in2="effect1_dropShadow" result="shape"/></filter><filter id="filter3_d" width="261.369" height="303.992" x="327.192" y="251.755" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feColorMatrix in="SourceAlpha" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"/><feOffset dy="4"/><feGaussianBlur stdDeviation="8"/><feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.15 0"/><feBlend in2="BackgroundImageFix" result="effect1_dropShadow"/><feBlend in="SourceGraphic" in2="effect1_dropShadow" result="shape"/></filter><linearGradient id="paint1_linear" x1="211.405" x2="769.059" y1="251.5" y2="494.972" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#9013fe"/><stop offset=".995" stop-color="#6610f2"/></linearGradient><linearGradient id="paint2_linear" x1="363.642" x2="515.493" y1="319.901" y2="465.49" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#fff"/><stop offset="1" stop-color="#f1e5fc"/></linearGradient><radialGradient id="paint0_radial" cx="0" cy="0" r="1" gradientTransform="rotate(90 25 425) scale(400)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#ced4da"/><stop offset="1" stop-color="#ced4da" stop-opacity="0"/></radialGradient><clipPath id="clip0"><path fill="#fff" d="M0 0h900v800H0z"/></clipPath></defs><g clip-path="url(#clip0)"><circle cx="450" cy="400" r="400" fill="url(#paint0_radial)"/><path fill="#ffc107" fill-rule="evenodd" d="M138 539h98v46h-98v-46zm100-2v50H136v-50h102z" clip-rule="evenodd"/><path fill="#ffc107" fill-rule="evenodd" d="M238 539h89a7 7 0 017 7v32a7 7 0 01-7 7h-89v-46zm89-2a9 9 0 019 9v32a9 9 0 01-9 9h-91v-50h91zm-281.816 0c-5.072 0-9.184 4.029-9.184 9v32c0 4.971 4.112 9 9.184 9H136v-50H45.184zM60 558a4 4 0 000 8h52a4 4 0 000-8H60z" clip-rule="evenodd"/><path fill="#007bff" fill-rule="evenodd" d="M115 400a8 8 0 100-16 8 8 0 000 16zm0 2c5.523 0 10-4.477 10-10s-4.477-10-10-10-10 4.477-10 10 4.477 10 10 10zm-30 0c5.523 0 10-4.477 10-10s-4.477-10-10-10-10 4.477-10 10 4.477 10 10 10zm0-5a5 5 0 100-10 5 5 0 000 10zm53-15a4 4 0 00-4 4v12a4 4 0 004 4h12a4 4 0 004-4v-12a4 4 0 00-4-4h-12zm11.676 5.324a1.103 1.103 0 00-1.591.033l-5.115 6.517-3.084-3.084a1.105 1.105 0 00-1.562 1.563l3.898 3.898a1.103 1.103 0 001.589-.03l5.881-7.351a1.103 1.103 0 00-.016-1.546zM180 384h-12a2 2 0 00-2 2v12a2 2 0 002 2h12a2 2 0 002-2v-12a2 2 0 00-2-2zm-12-2a4 4 0 00-4 4v12a4 4 0 004 4h12a4 4 0 004-4v-12a4 4 0 00-4-4h-12z" clip-rule="evenodd"/><path fill="#adb5bd" fill-rule="evenodd" d="M473 554c0-5.523 4.477-10 10-10h260c5.523 0 10 4.477 10 10v130.125c0 5.523-4.477 10-10 10H626.646a7.994 7.994 0 00-5.64 2.327l-6.596 6.556c-.78.776-2.04.776-2.82 0l-6.596-6.556a7.994 7.994 0 00-5.64-2.327H483c-5.523 0-10-4.477-10-10V554zm10-8a8 8 0 00-8 8v29h276v-29a8 8 0 00-8-8H483zm268 39H475v99.125a8 8 0 008 8h116.354a10 10 0 017.05 2.908L613 701.59l6.596-6.557a10 10 0 017.05-2.908H743a8 8 0 008-8V585z" clip-rule="evenodd"/><path fill="#007bff" fill-rule="evenodd" d="M503 74c0-5.523 4.477-10 10-10h260c5.523 0 10 4.477 10 10v160c0 5.523-4.477 10-10 10H513c-5.523 0-10-4.477-10-10V74zm10-8a8 8 0 00-8 8v29h276V74a8 8 0 00-8-8H513zm268 39H505v97h276v-97zm0 99H644v38h129a8 8 0 008-8v-30zm-139 38v-38H505v30a8 8 0 008 8h129z" clip-rule="evenodd"/><path fill="#007bff" fill-rule="evenodd" d="M756.293 79.293a1 1 0 011.414 0L762 83.586l4.293-4.293a1 1 0 111.414 1.414L763.414 85l4.293 4.293a1 1 0 11-1.414 1.414L762 86.414l-4.293 4.293a1 1 0 11-1.414-1.414L760.586 85l-4.293-4.293a1 1 0 010-1.414z" clip-rule="evenodd"/><path fill="#007bff" d="M673 223a4 4 0 014-4h72a4 4 0 010 8h-72a4 4 0 01-4-4zm-140 0a4 4 0 014-4h72a4 4 0 010 8h-72a4 4 0 01-4-4z"/><path fill="#e83e8c" fill-rule="evenodd" d="M757 432H475a7 7 0 00-7 7v32a7 7 0 007 7h282a7 7 0 007-7v-32a7 7 0 00-7-7zm-282-2a9 9 0 00-9 9v32a9 9 0 009 9h282a9 9 0 009-9v-32a9 9 0 00-9-9H475zm310 0a9 9 0 00-9 9v32a9 9 0 009 9h72a9 9 0 009-9v-32a9 9 0 00-9-9h-72zm10 21a4 4 0 000 8h52a4 4 0 000-8h-52z" clip-rule="evenodd"/><path fill="#dc3545" fill-rule="evenodd" d="M825 336H541a6 6 0 100 12h284a6 6 0 100-12zm-284-2a8 8 0 000 16h284a8 8 0 000-16H541z" clip-rule="evenodd"/><path fill="#dc3545" d="M533 342a8 8 0 018-8h242v16H541a8 8 0 01-8-8z"/><path fill="#adb5bd" fill-rule="evenodd" d="M57 271a6 6 0 00-6 6v28a6 6 0 006 6h81.515a6 6 0 014.242 1.757l7.536 7.536a1 1 0 001.414 0l7.536-7.536a6 6 0 014.242-1.757H245a6 6 0 006-6v-28a6 6 0 00-6-6H57zm33 16a4 4 0 000 8h122a4 4 0 000-8H90z" clip-rule="evenodd"/><path fill="#20c997" fill-rule="evenodd" d="M253 157c0-5.523-4.477-10-10-10H141c-5.523 0-10 4.477-10 10v39a1 1 0 002 0v-39a8 8 0 018-8h102a8 8 0 018 8v39a1 1 0 001 1h198a1 1 0 000-2H253v-38z" clip-rule="evenodd"/><path fill="#20c997" d="M151 174a4 4 0 014-4h72a4 4 0 010 8h-72a4 4 0 01-4-4z"/><path fill="url(#paint1_linear)" fill-rule="evenodd" d="M202.606 300.603c-8.615-28.187 6.531-60.366 36.506-68.398l309.643-82.969c29.975-8.031 59.181 12.264 65.814 40.982 6.371 27.588 17.095 62.662 33.744 89.141 16.7 26.562 36.732 40.854 62.058 36.589l7.125 26.591c-24.065 8.969-34.268 31.362-35.45 62.716-1.178 31.256 7.072 66.993 15.348 94.07 8.615 28.187-6.531 60.366-36.506 68.398l-309.643 82.969c-29.975 8.031-59.181-12.264-65.814-40.982-6.371-27.587-17.095-62.661-33.744-89.141-16.7-26.562-36.732-40.854-62.058-36.588l-7.125-26.592c24.065-8.969 34.268-31.362 35.45-62.715 1.178-31.257-7.072-66.994-15.348-94.071z" clip-rule="evenodd" filter="url(#filter0_d)"/><path fill-opacity=".15" fill-rule="evenodd" d="M239.37 233.171c-29.369 7.87-44.275 39.435-35.808 67.14 8.286 27.109 16.576 62.974 15.391 94.4-1.175 31.158-11.239 53.906-35.25 63.291l6.659 24.848c25.486-3.877 45.576 10.791 62.172 37.187 16.739 26.623 27.493 61.828 33.872 89.448 6.519 28.227 35.21 48.11 64.58 40.241l309.644-82.969c29.369-7.87 44.275-39.435 35.807-67.139-8.285-27.11-16.575-62.975-15.39-94.401 1.175-31.158 11.239-53.906 35.25-63.29l-6.659-24.849c-25.486 3.877-45.576-10.791-62.172-37.186-16.739-26.624-27.493-61.829-33.872-89.449-6.519-28.227-35.21-48.11-64.58-40.241L239.37 233.171zm471.001 82.777c-25.326 4.265-45.358-10.027-62.058-36.589-16.649-26.479-27.373-61.553-33.744-89.141-6.633-28.718-35.839-49.013-65.814-40.982l-309.643 82.969c-29.975 8.032-45.121 40.211-36.506 68.398 8.276 27.077 16.526 62.814 15.348 94.071-1.182 31.353-11.385 53.746-35.45 62.715l7.125 26.592c25.326-4.266 45.358 10.026 62.058 36.588 16.649 26.479 27.373 61.554 33.744 89.141 6.633 28.718 35.839 49.013 65.814 40.982l309.643-82.969c29.975-8.032 45.121-40.211 36.506-68.398-8.276-27.077-16.526-62.814-15.348-94.07 1.182-31.354 11.385-53.747 35.45-62.716l-7.125-26.591z" clip-rule="evenodd" filter="url(#filter1_d)"/><path fill="url(#paint2_linear)" d="M494.943 510.853c48.05-12.875 70.547-44.737 59.895-84.492-8.052-30.051-34.542-46.271-66.141-41.494l-.336-1.252c21.532-9.796 33.472-35.977 27.056-59.924-9.143-34.12-41.392-49.3-81.46-38.564l-88.221 23.639a2 2 0 00-1.414 2.449l59.481 221.988a2 2 0 002.45 1.414l88.69-23.764zM386.538 328.532l46.642-12.498c25.355-6.794 42.858.93 48.478 21.903 5.997 22.382-7.395 39.39-37.759 47.526l-39.286 10.527-18.075-67.458zm45.167 168.567l-19.92-74.345 46.328-12.414c33.181-8.891 53.753-.983 60.296 23.434 6.542 24.416-6.724 41.894-38.34 50.366l-48.364 12.959z" filter="url(#filter2_d)"/><path fill="#fff" fill-rule="evenodd" d="M343.839 311.345a2.5 2.5 0 011.767-3.062l88.221-23.639c20.12-5.391 38.326-4.288 52.67 2.492 14.355 6.784 24.796 19.232 29.403 36.426 6.438 24.026-5.424 50.293-26.947 60.331l.111.414c31.637-4.594 58.171 11.749 66.257 41.925 5.36 20.004 2.385 38.065-8.009 52.744-10.386 14.667-28.139 25.902-52.24 32.36l-88.69 23.764a2.5 2.5 0 01-3.062-1.768l-59.481-221.987zm2.026-2.096a1.5 1.5 0 00-1.06 1.837l59.481 221.988a1.5 1.5 0 001.837 1.06l88.691-23.764c23.949-6.418 41.47-17.551 51.682-31.972 10.203-14.409 13.151-32.157 7.859-51.908-7.981-29.786-34.216-45.87-65.584-41.129l-.442.067-.561-2.093.386-.175c21.297-9.689 33.137-35.616 26.78-59.34-4.536-16.926-14.791-29.128-28.864-35.78-14.083-6.656-32.036-7.775-51.984-2.43l-88.221 23.639zm40.061 18.929l47.124-12.627c12.743-3.414 23.585-3.201 31.974.566 8.408 3.775 14.275 11.085 17.117 21.691 3.034 11.325 1.167 21.34-5.336 29.545-6.485 8.183-17.539 14.51-32.777 18.593l-39.768 10.656-18.334-68.424zm1.224.707l17.817 66.492 38.802-10.397c15.126-4.053 25.951-10.297 32.253-18.248 6.284-7.929 8.115-17.61 5.153-28.666-2.778-10.367-8.473-17.405-16.56-21.037-8.106-3.64-18.693-3.891-31.306-.512l-46.159 12.368zm24.022 93.515l46.812-12.543c16.638-4.458 30.197-4.729 40.447-.757 10.282 3.985 17.155 12.209 20.461 24.544 3.303 12.329 1.615 22.969-4.946 31.595-6.545 8.603-17.885 15.133-33.748 19.384l-48.846 13.088-20.18-75.311zm1.225.707l19.662 73.379 47.88-12.829c15.753-4.221 26.854-10.666 33.211-19.024 6.341-8.335 8.014-18.643 4.776-30.73-3.238-12.081-9.921-20.019-19.856-23.87-9.967-3.863-23.284-3.643-39.827.79l-45.846 12.284z" clip-rule="evenodd" filter="url(#filter3_d)"/></g></svg> \ No newline at end of file
diff --git a/site/layouts/partials/icons/list.svg b/site/layouts/partials/icons/list.svg
deleted file mode 100644
index a801c2262..000000000
--- a/site/layouts/partials/icons/list.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg"{{ with .width }} width="{{ . }}"{{ end }}{{ with .height }} height="{{ . }}"{{ end }}{{ with .class }} class="{{ . }}"{{ end }} viewBox="0 0 16 16">
- <path fill-rule="evenodd" d="M2.5 11.5A.5.5 0 0 1 3 11h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm0-4A.5.5 0 0 1 3 7h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm0-4A.5.5 0 0 1 3 3h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5z"/>
-</svg> \ No newline at end of file
diff --git a/site/layouts/partials/icons/menu.svg b/site/layouts/partials/icons/menu.svg
deleted file mode 100644
index 70eaccec7..000000000
--- a/site/layouts/partials/icons/menu.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg"{{ with .width }} width="{{ . }}"{{ end }}{{ with .height }} height="{{ . }}"{{ end }}{{ with .class }} class="{{ . }}"{{ end }} viewBox="0 0 30 30" role="img"><title>{{ with .title }}{{ . }}{{ else }}Menu{{ end }}</title><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"/></svg> \ No newline at end of file
diff --git a/site/layouts/partials/icons/slack.svg b/site/layouts/partials/icons/slack.svg
deleted file mode 100644
index e3c995cc7..000000000
--- a/site/layouts/partials/icons/slack.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg"{{ with .width }} width="{{ . }}"{{ end }}{{ with .height }} height="{{ . }}"{{ end }}{{ with .class }} class="{{ . }}"{{ end }} viewBox="0 0 512 512" role="img"><title>{{ with .title }}{{ . }}{{ else }}Slack{{ end }}</title><path fill="currentColor" d="M210.787 234.832l68.31-22.883 22.1 65.977-68.309 22.882z"/><path fill="currentColor" d="M490.54 185.6C437.7 9.59 361.6-31.34 185.6 21.46S-31.3 150.4 21.46 326.4 150.4 543.3 326.4 490.54 543.34 361.6 490.54 185.6zM401.7 299.8l-33.15 11.05 11.46 34.38c4.5 13.92-2.87 29.06-16.78 33.56-2.87.82-6.14 1.64-9 1.23a27.32 27.32 0 0 1-24.56-18l-11.46-34.38-68.36 22.92 11.46 34.38c4.5 13.92-2.87 29.06-16.78 33.56-2.87.82-6.14 1.64-9 1.23a27.32 27.32 0 0 1-24.56-18l-11.46-34.43-33.15 11.05c-2.87.82-6.14 1.64-9 1.23a27.32 27.32 0 0 1-24.56-18c-4.5-13.92 2.87-29.06 16.78-33.56l33.12-11.03-22.1-65.9-33.15 11.05c-2.87.82-6.14 1.64-9 1.23a27.32 27.32 0 0 1-24.56-18c-4.48-13.93 2.89-29.07 16.81-33.58l33.15-11.05-11.46-34.38c-4.5-13.92 2.87-29.06 16.78-33.56s29.06 2.87 33.56 16.78l11.46 34.38 68.36-22.92-11.46-34.38c-4.5-13.92 2.87-29.06 16.78-33.56s29.06 2.87 33.56 16.78l11.47 34.42 33.15-11.05c13.92-4.5 29.06 2.87 33.56 16.78s-2.87 29.06-16.78 33.56L329.7 194.6l22.1 65.9 33.15-11.05c13.92-4.5 29.06 2.87 33.56 16.78s-2.88 29.07-16.81 33.57z"/></svg> \ No newline at end of file
diff --git a/site/layouts/partials/js-data-attributes.md b/site/layouts/partials/js-data-attributes.md
new file mode 100644
index 000000000..3b3696ed8
--- /dev/null
+++ b/site/layouts/partials/js-data-attributes.md
@@ -0,0 +1,5 @@
+As options can be passed via data attributes or JavaScript, you can append an option name to `data-bs-`, as in `data-bs-animation="{value}"`. Make sure to change the case type of the option name from "_camelCase_" to "_kebab-case_" when passing the options via data attributes. For example, use `data-bs-custom-class="beautifier"` instead of `data-bs-customClass="beautifier"`.
+
+As of Bootstrap 5.2.0, all components support an **experimental** reserved data attribute `data-bs-config` that can house simple component configuration as a JSON string. When an element has `data-bs-config='{"delay":0, "title":123}'` and `data-bs-title="456"` attributes, the final `title` value will be `456` and the separate data attributes will override values given on `data-bs-config`. In addition, existing data attributes are able to house JSON values like `data-bs-delay='{"show":0,"hide":150}'`.
+
+The final configuration object is the merged result of `data-bs-config`, `data-bs-`, and `js object` where the latest given key-value overrides the others.
diff --git a/site/layouts/partials/responsive-img.html b/site/layouts/partials/responsive-img.html
new file mode 100644
index 000000000..06aafb6aa
--- /dev/null
+++ b/site/layouts/partials/responsive-img.html
@@ -0,0 +1,22 @@
+{{- /*
+ Accepts context, classes, imgPath, alt and lazyload
+*/ -}}
+
+{{- $lazy := .lazyload | default true -}}
+{{- $classes := slice "img-fluid" "mx-auto" | append (slice .classes) -}}
+
+{{- $basePath := path.Join "/docs" .context.Site.Params.docs_version (path.Dir .imgPath) -}}
+{{- $basename := path.BaseName .imgPath -}}
+{{- $ext := path.Ext .imgPath -}}
+{{- $imgPath := path.Join $basePath (printf "%s%s" $basename $ext) -}}
+{{- $imgPath2x := path.Join $basePath (printf "%s@2x%s" $basename $ext) -}}
+
+{{- with (imageConfig (path.Join "/site/static" $imgPath)) }}
+<img class="{{ delimit $classes " " }}"
+ srcset="{{ $imgPath }}, {{ $imgPath2x }} 2x"
+ src="{{ $imgPath }}"
+ alt="{{ $.alt }}"{{ if eq $lazy true }}
+ loading="lazy"{{ end }}
+ width="{{ .Width }}"
+ height="{{ .Height }}">
+{{- end }}
diff --git a/site/layouts/partials/scripts.html b/site/layouts/partials/scripts.html
index d25add3ff..e224c4b37 100644
--- a/site/layouts/partials/scripts.html
+++ b/site/layouts/partials/scripts.html
@@ -1,20 +1,40 @@
-{{ if eq hugo.Environment "production" -}}
- <script src="/docs/{{ .Site.Params.docs_version }}/dist/js/bootstrap.bundle.min.js" {{ printf "integrity=%q" .Site.Params.cdn.js_bundle_hash | safeHTMLAttr }} crossorigin="anonymous"></script>
+{{ if hugo.IsProduction -}}
+ <script defer src="/docs/{{ .Site.Params.docs_version }}/dist/js/bootstrap.bundle.min.js" {{ printf "integrity=%q" .Site.Params.cdn.js_bundle_hash | safeHTMLAttr }}></script>
{{ else -}}
- <script src="/docs/{{ .Site.Params.docs_version }}/dist/js/bootstrap.bundle.js"></script>
+ <script defer src="/docs/{{ .Site.Params.docs_version }}/dist/js/bootstrap.bundle.js"></script>
{{- end }}
-{{ if eq .Page.Layout "docs" -}}
-<script src="https://cdn.jsdelivr.net/npm/docsearch.js@2/dist/cdn/docsearch.min.js"></script>
+{{- $esbuildOptions := dict "target" "es2019" -}}
+{{- $targetDocsJSPath := path.Join "/docs" .Site.Params.docs_version -}}
+
+{{- if hugo.IsProduction -}}
+ {{- $esbuildOptions = merge $esbuildOptions (dict "minify" "true") -}}
{{- end }}
-{{- $vendor := resources.Match "js/vendor/*.js" -}}
-{{- $js := resources.Match "js/*.js" -}}
-{{- $targetDocsJSPath := path.Join "/docs" .Site.Params.docs_version "assets/js/docs.js" -}}
-{{- $docsJs := append $js $vendor | resources.Concat $targetDocsJSPath -}}
+{{- $applicationJs := resources.Get "js/application.js" | js.Build $esbuildOptions | resources.Copy (path.Join $targetDocsJSPath "/assets/js/application.js") }}
+<script defer src="{{ $applicationJs.RelPermalink }}"></script>
-{{- if eq hugo.Environment "production" -}}
- {{- $docsJs = $docsJs | resources.Minify -}}
-{{- end }}
+{{- if (ne .Page.Layout "examples") -}}
+{{- $esbuildParams := dict
+ "apiKey" .Site.Params.algolia.apiKey
+ "appId" .Site.Params.algolia.appId
+ "indexName" .Site.Params.algolia.indexName
+-}}
+{{- $esbuildOptions = merge $esbuildOptions (dict "params" $esbuildParams) -}}
+{{- $searchJs := resources.Get "js/search.js" | js.Build $esbuildOptions | resources.Copy (path.Join $targetDocsJSPath "/assets/js/search.js") }}
+<script defer src="{{ $searchJs.RelPermalink }}"></script>
+{{- end -}}
-<script src="{{ $docsJs.Permalink | relURL }}"></script>
+{{ if eq .Page.Layout "docs" -}}
+{{- /* Disable minify options for snippets.js so that the file's readable on StackBlitz */ -}}
+{{- $snippetsFile := resources.Get "js/snippets.js" | js.Build (merge $esbuildOptions (dict "minify" "false")) -}}
+{{- $esbuildParams := dict
+ "cssCdn" .Site.Params.cdn.css
+ "jsBundleCdn" .Site.Params.cdn.js_bundle
+ "docsVersion" .Site.Params.docs_version
+ "jsSnippetFile" $snippetsFile.Content
+-}}
+{{- $esbuildOptions = merge $esbuildOptions (dict "params" $esbuildParams) -}}
+{{- $stackblitzJs := resources.Get "js/stackblitz.js" | js.Build $esbuildOptions | resources.Copy (path.Join $targetDocsJSPath "/assets/js/stackblitz.js") }}
+<script defer src="{{ $stackblitzJs.RelPermalink }}"></script>
+{{- end -}}
diff --git a/site/layouts/partials/social.html b/site/layouts/partials/social.html
index a63f6caee..03658ea9b 100644
--- a/site/layouts/partials/social.html
+++ b/site/layouts/partials/social.html
@@ -1,17 +1,27 @@
-{{ "<!-- Twitter -->" | safeHTML }}
-<meta name="twitter:card" content="{{ if .IsHome }}summary_large_image{{ else }}summary{{ end }}">
+{{- $pageTitle := .Title | markdownify -}}
+{{- $pageDescription := .Page.Params.description | default .Site.Params.description | markdownify -}}
+{{- $socialImagePath := urls.JoinPath "/docs" .Site.Params.docs_version "assets" -}}
+
+{{- if .Page.Params.thumbnail -}}
+ {{- $socialImagePath = urls.JoinPath $socialImagePath "img" .Page.Params.thumbnail -}}
+{{- else -}}
+ {{- $socialImagePath = urls.JoinPath $socialImagePath "brand/bootstrap-social.png" -}}
+{{- end -}}
+
+<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:site" content="@{{ .Site.Params.twitter }}">
<meta name="twitter:creator" content="@{{ .Site.Params.twitter }}">
-<meta name="twitter:title" content="{{ .Title | markdownify }}">
-<meta name="twitter:description" content="{{ .Page.Params.description | default .Site.Params.description | markdownify }}">
-<meta name="twitter:image" content="{{ if .IsHome }}{{ .Site.Params.social_logo_path | absURL }}{{ else }}{{ .Site.Params.social_image_path | absURL }}{{ end }}">
+<meta name="twitter:title" content="{{ $pageTitle }}">
+<meta name="twitter:description" content="{{ $pageDescription }}">
+<meta name="twitter:image" content="{{ $socialImagePath | absURL }}">
-{{ "<!-- Facebook -->" | safeHTML }}
<meta property="og:url" content="{{ .Permalink }}">
-<meta property="og:title" content="{{ .Title | markdownify }}">
-<meta property="og:description" content="{{ .Page.Params.description | default .Site.Params.description | markdownify }}">
+<meta property="og:title" content="{{ $pageTitle }}">
+<meta property="og:description" content="{{ $pageDescription }}">
<meta property="og:type" content="{{ if .IsPage }}article{{ else }}website{{ end }}">
-<meta property="og:image" content="{{ .Site.Params.social_image_path | absURL }}">
+<meta property="og:image" content="{{ $socialImagePath | absURL }}">
<meta property="og:image:type" content="image/png">
-<meta property="og:image:width" content="1000">
-<meta property="og:image:height" content="500">
+{{ with (imageConfig (path.Join "site/static" $socialImagePath)) -}}
+<meta property="og:image:width" content="{{ .Width }}">
+<meta property="og:image:height" content="{{ .Height }}">
+{{- end }}
diff --git a/site/layouts/partials/stylesheet.html b/site/layouts/partials/stylesheet.html
index cc4473383..9969ee44f 100644
--- a/site/layouts/partials/stylesheet.html
+++ b/site/layouts/partials/stylesheet.html
@@ -1,24 +1,27 @@
-{{- "<!-- Bootstrap core CSS -->" | safeHTML }}
-{{ if eq hugo.Environment "production" -}}
+{{ if hugo.IsProduction -}}
{{ if eq .Page.Params.direction "rtl" -}}
-<link href="/docs/{{ .Site.Params.docs_version }}/dist/css/bootstrap.rtl.min.css" rel="stylesheet" {{ printf "integrity=%q" .Site.Params.cdn.css_rtl_hash | safeHTMLAttr }} crossorigin="anonymous">
+<link href="/docs/{{ .Site.Params.docs_version }}/dist/css/bootstrap.rtl.min.css" rel="stylesheet" {{ printf "integrity=%q" .Site.Params.cdn.css_rtl_hash | safeHTMLAttr }}>
{{- else -}}
-<link href="/docs/{{ .Site.Params.docs_version }}/dist/css/bootstrap.min.css" rel="stylesheet" {{ printf "integrity=%q" .Site.Params.cdn.css_hash | safeHTMLAttr }} crossorigin="anonymous">
+<link href="/docs/{{ .Site.Params.docs_version }}/dist/css/bootstrap.min.css" rel="stylesheet" {{ printf "integrity=%q" .Site.Params.cdn.css_hash | safeHTMLAttr }}>
{{- end -}}
{{- else -}}
<link href="/docs/{{ .Site.Params.docs_version }}/dist/css/bootstrap{{ if eq .Page.Params.direction "rtl" }}.rtl{{ end }}.css" rel="stylesheet">
{{- end }}
{{- if (ne .Page.Layout "examples") }}
-{{- $targetDocsCssPath := path.Join "/docs" .Site.Params.docs_version "assets/css/docs.css" -}}
-{{- $sassOptions := dict "targetPath" $targetDocsCssPath "outputStyle" "expanded" "precision" 6 -}}
+{{- $sassOptions := dict "outputStyle" "expanded" "precision" 6 -}}
{{- $postcssOptions := dict "use" "autoprefixer" "noMap" true -}}
-{{ if eq hugo.Environment "production" -}}
+{{- $targetDocsCssPath := path.Join "/docs" .Site.Params.docs_version "assets/css/docs.css" -}}
+{{- $targetSearchCssPath := path.Join "/docs" .Site.Params.docs_version "assets/css/search.css" -}}
+
+{{ if hugo.IsProduction -}}
{{- $sassOptions = merge $sassOptions (dict "outputStyle" "compressed") -}}
{{- end -}}
-{{- $style := resources.Get "scss/docs.scss" | toCSS $sassOptions | postCSS $postcssOptions }}
+{{- $docsCss := resources.Get "scss/docs.scss" | toCSS (merge (dict "targetPath" $targetDocsCssPath) $sassOptions) | postCSS $postcssOptions -}}
+{{- $searchCss := resources.Get "scss/search.scss" | toCSS (merge (dict "targetPath" $targetSearchCssPath) $sassOptions) | postCSS $postcssOptions -}}
-<link href="{{ $style.Permalink | relURL }}" rel="stylesheet">
+<link href="{{ $docsCss.RelPermalink }}" rel="stylesheet">
+<link href="{{ $searchCss.RelPermalink }}" rel="stylesheet">
{{- end }}
diff --git a/site/layouts/partials/theme-toggler.html b/site/layouts/partials/theme-toggler.html
new file mode 100644
index 000000000..05de756fd
--- /dev/null
+++ b/site/layouts/partials/theme-toggler.html
@@ -0,0 +1,34 @@
+{{- $isExamples := eq .Layout "examples" -}}
+<button class="btn {{ if $isExamples }}btn-bd-primary{{ else }}btn-link nav-link px-0 px-lg-2{{ end }} py-2 dropdown-toggle d-flex align-items-center"
+ id="bd-theme"
+ type="button"
+ aria-expanded="false"
+ data-bs-toggle="dropdown"
+ {{ if not $isExamples }}data-bs-display="static"{{ end }}
+ aria-label="Toggle theme (auto)">
+ <svg class="bi my-1 theme-icon-active"><use href="#circle-half"></use></svg>
+ <span class="{{ if $isExamples }}visually-hidden{{ else }}d-lg-none ms-2{{ end }}" id="bd-theme-text">Toggle theme</span>
+</button>
+<ul class="dropdown-menu dropdown-menu-end{{ if $isExamples }} shadow{{ end }}" aria-labelledby="bd-theme-text">
+ <li>
+ <button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="light" aria-pressed="false">
+ <svg class="bi me-2 opacity-50"><use href="#sun-fill"></use></svg>
+ Light
+ <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
+ </button>
+ </li>
+ <li>
+ <button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="dark" aria-pressed="false">
+ <svg class="bi me-2 opacity-50"><use href="#moon-stars-fill"></use></svg>
+ Dark
+ <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
+ </button>
+ </li>
+ <li>
+ <button type="button" class="dropdown-item d-flex align-items-center active" data-bs-theme-value="auto" aria-pressed="true">
+ <svg class="bi me-2 opacity-50"><use href="#circle-half"></use></svg>
+ Auto
+ <svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
+ </button>
+ </li>
+</ul>
diff --git a/site/layouts/robots.txt b/site/layouts/robots.txt
index 271b4f1b7..bafd23893 100644
--- a/site/layouts/robots.txt
+++ b/site/layouts/robots.txt
@@ -1,8 +1,7 @@
# www.robotstxt.org
-{{- $isProduction := eq hugo.Environment "production" -}}
{{- $isNetlify := eq (getenv "NETLIFY") "true" -}}
-{{- $allowCrawling := and (not $isNetlify) $isProduction -}}
+{{- $allowCrawling := and (not $isNetlify) hugo.IsProduction -}}
{{ if $allowCrawling }}
# Allow crawling of all content
diff --git a/site/layouts/shortcodes/added-in.html b/site/layouts/shortcodes/added-in.html
new file mode 100644
index 000000000..abd8dc4f3
--- /dev/null
+++ b/site/layouts/shortcodes/added-in.html
@@ -0,0 +1,5 @@
+{{- /* Outputs badge to identify the first version something was added */ -}}
+
+{{- $version := .Get 0 -}}
+
+<small class="d-inline-flex mb-3 px-2 py-1 fw-semibold text-success-emphasis bg-success-subtle border border-success-subtle rounded-2">Added in v{{ $version }}</small>
diff --git a/site/layouts/shortcodes/bs-table.html b/site/layouts/shortcodes/bs-table.html
index 42a18d578..9eec109cb 100644
--- a/site/layouts/shortcodes/bs-table.html
+++ b/site/layouts/shortcodes/bs-table.html
@@ -4,5 +4,6 @@
{{- $css_class := .Get 0 | default "table" -}}
{{- $html_table := .Inner | markdownify -}}
-{{- $html_table = replace $html_table "<table>" (printf `<table class="%s">` $css_class) -}}
+{{- $html_table = replace $html_table "<table>" (printf `<div class="table-responsive"><table class="%s">` $css_class) -}}
+{{- $html_table = replace $html_table "</table>" "</table></div>" -}}
{{- $html_table | safeHTML -}}
diff --git a/site/layouts/shortcodes/callout-deprecated-dark-variants.html b/site/layouts/shortcodes/callout-deprecated-dark-variants.html
new file mode 100644
index 000000000..e682a7fbe
--- /dev/null
+++ b/site/layouts/shortcodes/callout-deprecated-dark-variants.html
@@ -0,0 +1,9 @@
+{{- /* Outputs message about dark mode component variants being deprecated in v5.3. */ -}}
+
+{{- $component := .Get 0 -}}
+
+<div class="bd-callout bd-callout-warning">
+ <p>
+ <strong>Heads up!</strong> Dark variants for components were deprecated in v5.3.0 with the introduction of color modes. Instead of adding <code>.{{ $component }}-dark</code>, set <code>data-bs-theme="dark"</code> on the root element, a parent wrapper, or the component itself.
+ </p>
+</div>
diff --git a/site/layouts/shortcodes/deprecated-in.html b/site/layouts/shortcodes/deprecated-in.html
new file mode 100644
index 000000000..b353368df
--- /dev/null
+++ b/site/layouts/shortcodes/deprecated-in.html
@@ -0,0 +1,5 @@
+{{- /* Outputs badge to identify the version something was deprecated */ -}}
+
+{{- $version := .Get 0 -}}
+
+<small class="d-inline-flex mb-3 px-2 py-1 fw-semibold text-warning-emphasis bg-warning-subtle border border-warning-subtle rounded-2">Deprecated in v{{ $version }}</small>
diff --git a/site/layouts/shortcodes/docsref.html b/site/layouts/shortcodes/docsref.html
index 2379de2b1..06523d859 100644
--- a/site/layouts/shortcodes/docsref.html
+++ b/site/layouts/shortcodes/docsref.html
@@ -1 +1,2 @@
-{{- relref . ((path.Join "docs" $.Site.Params.docs_version (.Get 0)) | relURL) -}}
+{{- $pageToReference := path.Join "docs" $.Site.Params.docs_version (.Get 0) -}}
+{{- relref . $pageToReference | relURL -}}
diff --git a/site/layouts/shortcodes/example.html b/site/layouts/shortcodes/example.html
index 0592adc6b..5b398e681 100644
--- a/site/layouts/shortcodes/example.html
+++ b/site/layouts/shortcodes/example.html
@@ -4,25 +4,46 @@
`args` are all optional and can be one of the following:
* id: the `div`'s id - default: ""
* class: any extra class(es) to be added to the `div` - default: ""
- * show_preview: if the preview should be output in the HTML - default: `true`
+ * lang: language used to display the code - default: "html"
* show_markup: if the markup should be output in the HTML - default: `true`
+ * show_preview: if the preview should be output in the HTML - default: `true`
+ * stackblitz_add_js: if extra JS snippet should be added to StackBlitz - default: `false`
*/ -}}
{{- $id := .Get "id" -}}
{{- $class := .Get "class" -}}
{{- $lang := .Get "lang" | default "html" -}}
-{{- $show_preview := .Get "show_preview" | default true -}}
{{- $show_markup := .Get "show_markup" | default true -}}
-{{- $input := .Inner -}}
+{{- $show_preview := .Get "show_preview" | default true -}}
+{{- $stackblitz_add_js := .Get "stackblitz_add_js" | default false -}}
-{{- if eq $show_preview true -}}
-<div{{ with $id }} id="{{ . }}"{{ end }} class="bd-example{{ with $class }} {{ . }}{{ end }}">
- {{- $input -}}
-</div>
-{{- end -}}
+{{- $content := .Inner -}}
+
+<div class="bd-example-snippet bd-code-snippet">
+ {{- if eq $show_preview true }}
+ <div{{ with $id }} id="{{ . }}"{{ end }} class="bd-example m-0 border-0{{ with $class }} {{ . }}{{ end }}">
+ {{ $content }}
+ </div>
+ {{- end }}
-{{- if eq $show_markup true -}}
- {{- $content := replaceRE `<svg class="bd-placeholder-img(?:-lg)?(?: *?bd-placeholder-img-lg)? ?(.*?)".*?<\/svg>\n` `<img src="..." class="$1" alt="...">` $input -}}
- {{- $content = replaceRE ` (class=" *?")` "" $content -}}
- {{- highlight (trim $content "\n") $lang "" -}}
-{{- end -}}
+ {{- if eq $show_markup true -}}
+ {{- if eq $show_preview true -}}
+ <div class="d-flex align-items-center highlight-toolbar ps-3 pe-2 py-1 border-0 border-top border-bottom">
+ <small class="font-monospace text-body-secondary text-uppercase">{{ $lang }}</small>
+ <div class="d-flex ms-auto">
+ <button type="button" class="btn-edit text-nowrap"{{ with $stackblitz_add_js }} data-sb-js-snippet="{{ $stackblitz_add_js }}"{{ end }} title="Try it on StackBlitz">
+ <svg class="bi" aria-hidden="true"><use xlink:href="#lightning-charge-fill"/></svg>
+ </button>
+ <button type="button" class="btn-clipboard mt-0 me-0" title="Copy to clipboard">
+ <svg class="bi" aria-hidden="true"><use xlink:href="#clipboard"/></svg>
+ </button>
+ </div>
+ </div>
+ {{- end -}}
+
+ {{- $content = replaceRE `<svg class="bd-placeholder-img(?:-lg)?(?: *?bd-placeholder-img-lg)? ?(.*?)".*?<\/svg>` `<img src="..." class="$1" alt="...">` $content -}}
+ {{- $content = replaceRE `<img class="bd-placeholder-img(?:-lg)?(?: *?bd-placeholder-img-lg)? ?(.*?)".*?>` `<img src="..." class="$1" alt="...">` $content -}}
+ {{- $content = replaceRE ` (class=" *?")` "" $content -}}
+ {{- highlight (trim $content "\n") $lang "" -}}
+ {{- end }}
+</div>
diff --git a/site/layouts/shortcodes/js-dismiss.html b/site/layouts/shortcodes/js-dismiss.html
index 45d72d0eb..3d0c27883 100644
--- a/site/layouts/shortcodes/js-dismiss.html
+++ b/site/layouts/shortcodes/js-dismiss.html
@@ -2,13 +2,13 @@
{{- $name := .Get 0 -}}
-Dismissal can be achieved with the `data` attribute on a button **within the {{ $name }}** as demonstrated below:
+Dismissal can be achieved with the `data-bs-dismiss` attribute on a button **within the {{ $name }}** as demonstrated below:
```html
<button type="button" class="btn-close" data-bs-dismiss="{{ $name }}" aria-label="Close"></button>
```
-or on a button **outside the {{ $name }}** using the `data-bs-target` as demonstrated below:
+or on a button **outside the {{ $name }}** using the additional `data-bs-target` as demonstrated below:
```html
<button type="button" class="btn-close" data-bs-dismiss="{{ $name }}" data-bs-target="#my-{{ $name }}" aria-label="Close"></button>
diff --git a/site/layouts/shortcodes/js-docs.html b/site/layouts/shortcodes/js-docs.html
new file mode 100644
index 000000000..8eed4a0eb
--- /dev/null
+++ b/site/layouts/shortcodes/js-docs.html
@@ -0,0 +1,70 @@
+{{- /*
+ Usage: `js-docs name="name" file="file/_location.js`
+
+ Prints everything between `// js-docs-start "name"` and `// js-docs-end "name"`
+ comments in the docs.
+*/ -}}
+
+{{- $name := .Get "name" -}}
+{{- $file := .Get "file" -}}
+
+{{- /* If any parameters are missing, print an error and exit */ -}}
+{{- if or (not $name) (not $file) -}}
+ {{- errorf "%s: %q: Missing required parameters! Got: name=%q file=%q!" .Position .Name $name $file -}}
+{{- else -}}
+ {{- $capture_start := printf "// js-docs-start %s\n" $name -}}
+ {{- $capture_end := printf "// js-docs-end %s\n" $name -}}
+ {{- $regex := printf `%s((?:.|\n)*)%s` $capture_start $capture_end -}}
+ {{- $regex_nested := printf `// js-docs-.*\n` -}}
+
+ {{- $match := findRE $regex (readFile $file) -}}
+ {{- $match = index $match 0 -}}
+
+ {{- if not $match -}}
+ {{- errorf "%s: %q: Got no matches for name=%q in file=%q!" .Position .Name $name $file -}}
+ {{- end -}}
+
+ {{- $match = replace $match $capture_start "" -}}
+ {{- $match = replace $match $capture_end "" -}}
+
+ {{- $match_nested := findRE $regex_nested $match -}}
+ {{- range $to_remove := $match_nested -}}
+ {{- $match = replace $match $to_remove "" -}}
+ {{- end -}}
+
+ <div class="bd-example-snippet bd-code-snippet bd-file-ref">
+ <div class="d-flex align-items-center highlight-toolbar ps-3 pe-2 py-1 border-bottom">
+ <a class="font-monospace link-secondary link-underline-secondary link-underline-opacity-0 link-underline-opacity-100-hover small" href="{{ .Site.Params.repo }}/blob/v{{ .Site.Params.current_version }}/{{ $file | replaceRE `\\` "/" }}">
+ {{- $file -}}
+ </a>
+ <div class="d-flex ms-auto">
+ <button type="button" class="btn-clipboard mt-0 me-0" title="Copy to clipboard">
+ <svg class="bi" aria-hidden="true"><use xlink:href="#clipboard"/></svg>
+ </button>
+ </div>
+ </div>
+
+ {{- $unindent := 0 -}}
+ {{- $found := false -}}
+ {{- $first_line:= index (split $match "\n") 0 -}}
+ {{- range $char := split $first_line "" -}}
+ {{- if and (eq $char " ") (not $found) -}}
+ {{- $unindent = add $unindent 1 -}}
+ {{- else -}}
+ {{- $found = true -}}
+ {{- end -}}
+ {{- end -}}
+ {{- $output := "" -}}
+ {{- if (gt $unindent 0) -}}
+ {{- $prefix := (strings.Repeat $unindent " ") -}}
+ {{- range $line := split $match "\n" -}}
+ {{- $line = strings.TrimPrefix $prefix $line -}}
+ {{ $output = printf "%s%s\n" $output $line }}
+ {{- end -}}
+ {{- $output = chomp $output -}}
+ {{- else -}}
+ {{- $output = $match -}}
+ {{- end -}}
+ {{- highlight $output "js" "" -}}
+ </div>
+{{- end -}}
diff --git a/site/layouts/shortcodes/placeholder.html b/site/layouts/shortcodes/placeholder.html
index c267bf4a7..9cc639435 100644
--- a/site/layouts/shortcodes/placeholder.html
+++ b/site/layouts/shortcodes/placeholder.html
@@ -4,11 +4,12 @@
`args` are all optional and can be one of the following:
* title: Used in the SVG `title` tag - default: "Placeholder"
* text: The text to show in the image - default: "width x height"
- * class: Class to add to the `svg` - default: "bd-placeholder-img"
+ * class: Class to add to the `svg` or `img` - default: "bd-placeholder-img"
* color: The text color (foreground) - default: "#dee2e6"
* background: The background color - default: "#868e96"
* width: default: "100%"
* height: default: "180px"
+ * markup: If it should render `svg` or `img` tags - default: "svg"
*/ -}}
{{- $grays := $.Site.Data.grays -}}
@@ -26,8 +27,18 @@
{{- $show_title := not (eq $title "false") -}}
{{- $show_text := not (eq $text "false") -}}
-<svg class="bd-placeholder-img{{ with $class }} {{ . }}{{ end }}" width="{{ $width }}" height="{{ $height }}" xmlns="http://www.w3.org/2000/svg"{{ if (or $show_title $show_text) }} role="img" aria-label="{{ if $show_title }}{{ $title }}{{ if $show_text }}: {{ end }}{{ end }}{{ if ($show_text) }}{{ $text }}{{ end }}"{{ else }} aria-hidden="true"{{ end }} preserveAspectRatio="xMidYMid slice" focusable="false">
- {{- if $show_title }}<title>{{ $title }}</title>{{ end -}}
- <rect width="100%" height="100%" fill="{{ $background }}"/>
- {{- if $show_text }}<text x="50%" y="50%" fill="{{ $color }}" dy=".3em">{{ $text }}</text>{{ end -}}
-</svg>
+{{- $markup := .Get "markup" | default "svg" -}}
+
+{{- if eq $markup "img" -}}
+ <img class="bd-placeholder-img{{ with $class }} {{ . }}{{ end }}" alt="{{ $title }} : {{ $text }}" width="{{ $width }}" height="{{ $height }}" src="data:image/svg+xml,%3Csvg%20style='font-size:%201.125rem;%20font-family:system-ui,-apple-system,%22Segoe%20UI%22,Roboto,%22Helvetica%20Neue%22,%22Noto%20Sans%22,%22Liberation%20Sans%22,Arial,sans-serif,%22Apple%20Color%20Emoji%22,%22Segoe%20UI%20Emoji%22,%22Segoe%20UI%20Symbol%22,%22Noto%20Color%20Emoji%22;%20-webkit-user-select:%20none;%20-moz-user-select:%20none;%20user-select:%20none;%20text-anchor:%20middle;'%20width='200'%20height='200'%20xmlns='http://www.w3.org/2000/svg'%3E
+ {{- if $show_title }}%3Ctitle%3E{{ $title }}%3C/title%3E{{ end -}}
+ %3Crect%20width='100%25'%20height='100%25'%20fill='{{ replace $background "#" "%23" }}'%3E%3C/rect%3E
+ {{- if $show_text }}%3Ctext%20x='50%25'%20y='50%25'%20fill='{{ replace $color "#" "%23" }}'%20dy='.3em'%3E{{ $text }}%3C/text%3E{{ end -}}
+ %3C/svg%3E">
+{{- else -}}
+ <svg class="bd-placeholder-img{{ with $class }} {{ . }}{{ end }}" width="{{ $width }}" height="{{ $height }}" xmlns="http://www.w3.org/2000/svg"{{ if (or $show_title $show_text) }} role="img" aria-label="{{ if $show_title }}{{ $title }}{{ if $show_text }}: {{ end }}{{ end }}{{ if ($show_text) }}{{ $text }}{{ end }}"{{ else }} aria-hidden="true"{{ end }} preserveAspectRatio="xMidYMid slice">
+ {{- if $show_title }}<title>{{ $title }}</title>{{ end -}}
+ <rect width="100%" height="100%" fill="{{ $background }}"/>
+ {{- if $show_text }}<text x="50%" y="50%" fill="{{ $color }}" dy=".3em">{{ $text }}</text>{{ end -}}
+ </svg>
+{{- end -}}
diff --git a/site/layouts/shortcodes/scss-docs.html b/site/layouts/shortcodes/scss-docs.html
index 3d1cd09a5..6e7c129f4 100644
--- a/site/layouts/shortcodes/scss-docs.html
+++ b/site/layouts/shortcodes/scss-docs.html
@@ -17,8 +17,9 @@
{{- errorf "%s: %q: Missing required parameters! Got: name=%q file=%q!" .Position .Name $name $file -}}
{{- else -}}
{{- $capture_start := printf "// scss-docs-start %s\n" $name -}}
- {{- $capture_end := printf "// scss-docs-end %s" $name -}}
+ {{- $capture_end := printf "// scss-docs-end %s\n" $name -}}
{{- $regex := printf `%s((?:.|\n)*)%s` $capture_start $capture_end -}}
+ {{- $regex_nested := printf `// scss-docs-.*\n` -}}
{{- /*
TODO: figure out why we can't do the following and get the first group (the only capturing one)...
@@ -35,9 +36,47 @@
{{- $match = replace $match $capture_start "" -}}
{{- $match = replace $match $capture_end "" -}}
+ {{- $match_nested := findRE $regex_nested $match -}}
+ {{- range $to_remove := $match_nested -}}
+ {{- $match = replace $match $to_remove "" -}}
+ {{- end -}}
+
{{- if (ne $strip_default "false") -}}
{{- $match = replace $match " !default" "" -}}
{{- end -}}
- {{- highlight $match "scss" "" -}}
+ <div class="bd-example-snippet bd-code-snippet bd-file-ref">
+ <div class="d-flex align-items-center highlight-toolbar ps-3 pe-2 py-1 border-bottom">
+ <a class="font-monospace link-secondary link-underline-secondary link-underline-opacity-0 link-underline-opacity-100-hover small" href="{{ .Site.Params.repo }}/blob/v{{ .Site.Params.current_version }}/{{ $file | replaceRE `\\` "/" }}">
+ {{- $file -}}
+ </a>
+ <div class="d-flex ms-auto">
+ <button type="button" class="btn-clipboard mt-0 me-0" title="Copy to clipboard">
+ <svg class="bi" aria-hidden="true"><use xlink:href="#clipboard"/></svg>
+ </button>
+ </div>
+ </div>
+ {{- $unindent := 0 -}}
+ {{- $found := false -}}
+ {{- $first_line:= index (split $match "\n") 0 -}}
+ {{- range $char := split $first_line "" -}}
+ {{- if and (eq $char " ") (not $found) -}}
+ {{- $unindent = add $unindent 1 -}}
+ {{- else -}}
+ {{- $found = true -}}
+ {{- end -}}
+ {{- end -}}
+ {{- $output := "" -}}
+ {{- if (gt $unindent 0) -}}
+ {{- $prefix := (strings.Repeat $unindent " ") -}}
+ {{- range $line := split $match "\n" -}}
+ {{- $line = strings.TrimPrefix $prefix $line -}}
+ {{ $output = printf "%s%s\n" $output $line }}
+ {{- end -}}
+ {{- $output = chomp $output -}}
+ {{- else -}}
+ {{- $output = $match -}}
+ {{- end -}}
+ {{- highlight $output "scss" "" -}}
+ </div>
{{- end -}}
diff --git a/site/layouts/sitemap.xml b/site/layouts/sitemap.xml
deleted file mode 100644
index 869f1cbe8..000000000
--- a/site/layouts/sitemap.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-{{ printf "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\"?>" | safeHTML }}
-<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml">
- {{- range .Data.Pages -}}{{ if and .Permalink (ne .Params.sitemap_exclude true) }}
- <url>
- <loc>{{ .Permalink }}</loc>{{ if not .Lastmod.IsZero }}
- <lastmod>{{ safeHTML (.Lastmod.Format "2006-01-02T15:04:05-07:00") }}</lastmod>{{ end }}{{ with .Sitemap.ChangeFreq }}
- <changefreq>{{ . }}</changefreq>{{ end }}{{ if ge .Sitemap.Priority 0.0 }}
- <priority>{{ .Sitemap.Priority }}</priority>{{ end }}{{ if .IsTranslated }}{{ range .Translations }}
- <xhtml:link rel="alternate" hreflang="{{ .Language.Lang }}" href="{{ .Permalink }}"/>{{ end }}
- <xhtml:link rel="alternate" hreflang="{{ .Language.Lang }}" href="{{ .Permalink }}"/>{{ end }}
- </url>{{ end }}{{ end }}
-</urlset>