[
  {
    "path": ".babelrc.js",
    "content": "module.exports = {\n  presets: [\n    [\n      '@babel/preset-env',\n      {\n        loose: true,\n        bugfixes: true,\n        modules: false\n      }\n    ]\n  ]\n};\n"
  },
  {
    "path": ".browserslistrc",
    "content": "# https://github.com/browserslist/browserslist#readme\n\n>= 0.5%\nlast 2 major versions\nnot dead\nChrome >= 60\nFirefox >= 60\nFirefox ESR\niOS >= 12\nSafari >= 12\nnot Explorer <= 11\nnot kaios <= 2.5 # fix floating label issues in Firefox (see https://github.com/postcss/autoprefixer/issues/1533)\n"
  },
  {
    "path": ".bundlewatch.config.json",
    "content": "{\n  \"files\": [\n    {\n      \"path\": \"./dist/css/bootstrap-grid.css\",\n      \"maxSize\": \"6.5 kB\"\n    },\n    {\n      \"path\": \"./dist/css/bootstrap-grid.min.css\",\n      \"maxSize\": \"6.0 kB\"\n    },\n    {\n      \"path\": \"./dist/css/bootstrap-reboot.css\",\n      \"maxSize\": \"3.5 kB\"\n    },\n    {\n      \"path\": \"./dist/css/bootstrap-reboot.min.css\",\n      \"maxSize\": \"3.25 kB\"\n    },\n    {\n      \"path\": \"./dist/css/bootstrap-utilities.css\",\n      \"maxSize\": \"11.75 kB\"\n    },\n    {\n      \"path\": \"./dist/css/bootstrap-utilities.min.css\",\n      \"maxSize\": \"10.75 kB\"\n    },\n    {\n      \"path\": \"./dist/css/bootstrap.css\",\n      \"maxSize\": \"32.5 kB\"\n    },\n    {\n      \"path\": \"./dist/css/bootstrap.min.css\",\n      \"maxSize\": \"30.25 kB\"\n    },\n    {\n      \"path\": \"./dist/js/bootstrap.bundle.js\",\n      \"maxSize\": \"43.0 kB\"\n    },\n    {\n      \"path\": \"./dist/js/bootstrap.bundle.min.js\",\n      \"maxSize\": \"23.5 kB\"\n    },\n    {\n      \"path\": \"./dist/js/bootstrap.esm.js\",\n      \"maxSize\": \"28.0 kB\"\n    },\n    {\n      \"path\": \"./dist/js/bootstrap.esm.min.js\",\n      \"maxSize\": \"18.25 kB\"\n    },\n    {\n      \"path\": \"./dist/js/bootstrap.js\",\n      \"maxSize\": \"28.75 kB\"\n    },\n    {\n      \"path\": \"./dist/js/bootstrap.min.js\",\n      \"maxSize\": \"16.25 kB\"\n    }\n  ],\n  \"ci\": {\n    \"trackBranches\": [\n      \"main\",\n      \"v4-dev\"\n    ]\n  }\n}\n"
  },
  {
    "path": ".cspell.json",
    "content": "{\n  \"version\": \"0.2\",\n  \"words\": [\n    \"affordance\",\n    \"allowfullscreen\",\n    \"Analyser\",\n    \"autohide\",\n    \"autohiding\",\n    \"autoplay\",\n    \"autoplays\",\n    \"autoplaying\",\n    \"blazingly\",\n    \"Blockquotes\",\n    \"Bootstrappers\",\n    \"borderless\",\n    \"Brotli\",\n    \"browserslist\",\n    \"browserslistrc\",\n    \"btncheck\",\n    \"btnradio\",\n    \"callout\",\n    \"callouts\",\n    \"camelCase\",\n    \"clearfix\",\n    \"Codesniffer\",\n    \"combinator\",\n    \"Contentful\",\n    \"Cpath\",\n    \"Crossfade\",\n    \"crossfading\",\n    \"cssgrid\",\n    \"Csvg\",\n    \"Datalists\",\n    \"Deque\",\n    \"discoverability\",\n    \"docsearch\",\n    \"docsref\",\n    \"dropend\",\n    \"dropleft\",\n    \"dropright\",\n    \"dropstart\",\n    \"dropup\",\n    \"dgst\",\n    \"errorf\",\n    \"favicon\",\n    \"favicons\",\n    \"fieldsets\",\n    \"flexbox\",\n    \"fullscreen\",\n    \"getbootstrap\",\n    \"Grayscale\",\n    \"Hoverable\",\n    \"hreflang\",\n    \"hstack\",\n    \"importmap\",\n    \"jsdelivr\",\n    \"Jumpstart\",\n    \"keyframes\",\n    \"libera\",\n    \"libman\",\n    \"Libsass\",\n    \"lightboxes\",\n    \"Lowercased\",\n    \"markdownify\",\n    \"mediaqueries\",\n    \"minifiers\",\n    \"misfunction\",\n    \"mkdir\",\n    \"monospace\",\n    \"mouseleave\",\n    \"navbars\",\n    \"navs\",\n    \"Neue\",\n    \"noindex\",\n    \"Noto\",\n    \"offcanvas\",\n    \"offcanvases\",\n    \"Packagist\",\n    \"popperjs\",\n    \"prebuild\",\n    \"prefersreducedmotion\",\n    \"prepended\",\n    \"printf\",\n    \"rects\",\n    \"relref\",\n    \"rgba\",\n    \"roboto\",\n    \"RTLCSS\",\n    \"ruleset\",\n    \"sassrc\",\n    \"screenreaders\",\n    \"scrollbars\",\n    \"scrollspy\",\n    \"Segoe\",\n    \"semibold\",\n    \"socio\",\n    \"srcset\",\n    \"stackblitz\",\n    \"stickied\",\n    \"Stylelint\",\n    \"subnav\",\n    \"tabbable\",\n    \"textareas\",\n    \"toggleable\",\n    \"topbar\",\n    \"touchend\",\n    \"twbs\",\n    \"unitless\",\n    \"unstylable\",\n    \"unstyled\",\n    \"Uppercased\",\n    \"urlize\",\n    \"urlquery\",\n    \"vbtn\",\n    \"viewports\",\n    \"Vite\",\n    \"vstack\",\n    \"walkthroughs\",\n    \"WCAG\",\n    \"zindex\"\n  ],\n  \"language\": \"en-US\",\n  \"ignorePaths\": [\n    \".cspell.json\",\n    \"dist/\",\n    \"*.min.*\",\n    \"**/*rtl*\",\n    \"**/tests/**\"\n  ],\n  \"useGitignore\": true\n}\n"
  },
  {
    "path": ".editorconfig",
    "content": "# editorconfig.org\n\nroot = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\nindent_size = 2\nindent_style = space\ninsert_final_newline = true\ntrim_trailing_whitespace = true\n"
  },
  {
    "path": ".eslintignore",
    "content": "**/*.min.js\n**/dist/\n**/vendor/\n/_site/\n/site/public/\n/js/coverage/\n/site/static/sw.js\n/site/static/docs/**/assets/sw.js\n/site/layouts/partials/\n"
  },
  {
    "path": ".eslintrc.json",
    "content": "{\n  \"root\": true,\n  \"extends\": [\n    \"plugin:import/errors\",\n    \"plugin:import/warnings\",\n    \"plugin:unicorn/recommended\",\n    \"xo\",\n    \"xo/browser\"\n  ],\n  \"rules\": {\n    \"arrow-body-style\": \"off\",\n    \"capitalized-comments\": \"off\",\n    \"comma-dangle\": [\n      \"error\",\n      \"never\"\n    ],\n    \"import/extensions\": [\n      \"error\",\n      \"ignorePackages\",\n      {\n        \"js\": \"always\"\n      }\n    ],\n    \"import/first\": \"error\",\n    \"import/newline-after-import\": \"error\",\n    \"import/no-absolute-path\": \"error\",\n    \"import/no-amd\": \"error\",\n    \"import/no-cycle\": [\n      \"error\",\n      {\n        \"ignoreExternal\": true\n      }\n    ],\n    \"import/no-duplicates\": \"error\",\n    \"import/no-extraneous-dependencies\": \"error\",\n    \"import/no-mutable-exports\": \"error\",\n    \"import/no-named-as-default\": \"error\",\n    \"import/no-named-as-default-member\": \"error\",\n    \"import/no-named-default\": \"error\",\n    \"import/no-self-import\": \"error\",\n    \"import/no-unassigned-import\": [\n      \"error\"\n    ],\n    \"import/no-useless-path-segments\": \"error\",\n    \"import/order\": \"error\",\n    \"indent\": [\n      \"error\",\n      2,\n      {\n        \"MemberExpression\": \"off\",\n        \"SwitchCase\": 1\n      }\n    ],\n    \"logical-assignment-operators\": \"off\",\n    \"max-params\": [\n      \"warn\",\n      5\n    ],\n    \"multiline-ternary\": [\n      \"error\",\n      \"always-multiline\"\n    ],\n    \"new-cap\": [\n      \"error\",\n      {\n        \"properties\": false\n      }\n    ],\n    \"no-console\": \"error\",\n    \"no-negated-condition\": \"off\",\n    \"object-curly-spacing\": [\n      \"error\",\n      \"always\"\n    ],\n    \"operator-linebreak\": [\n      \"error\",\n      \"after\"\n    ],\n    \"prefer-object-has-own\": \"off\",\n    \"prefer-template\": \"error\",\n    \"semi\": [\n      \"error\",\n      \"never\"\n    ],\n    \"strict\": \"error\",\n    \"unicorn/explicit-length-check\": \"off\",\n    \"unicorn/filename-case\": \"off\",\n    \"unicorn/no-anonymous-default-export\": \"off\",\n    \"unicorn/no-array-callback-reference\": \"off\",\n    \"unicorn/no-array-method-this-argument\": \"off\",\n    \"unicorn/no-null\": \"off\",\n    \"unicorn/no-typeof-undefined\": \"off\",\n    \"unicorn/no-unused-properties\": \"error\",\n    \"unicorn/numeric-separators-style\": \"off\",\n    \"unicorn/prefer-array-flat\": \"off\",\n    \"unicorn/prefer-at\": \"off\",\n    \"unicorn/prefer-dom-node-dataset\": \"off\",\n    \"unicorn/prefer-global-this\": \"off\",\n    \"unicorn/prefer-module\": \"off\",\n    \"unicorn/prefer-query-selector\": \"off\",\n    \"unicorn/prefer-spread\": \"off\",\n    \"unicorn/prefer-string-raw\": \"off\",\n    \"unicorn/prefer-string-replace-all\": \"off\",\n    \"unicorn/prefer-structured-clone\": \"off\",\n    \"unicorn/prevent-abbreviations\": \"off\"\n  },\n  \"overrides\": [\n    {\n      \"files\": [\n        \"build/**\"\n      ],\n      \"env\": {\n        \"browser\": false,\n        \"node\": true\n      },\n      \"parserOptions\": {\n        \"sourceType\": \"module\"\n      },\n      \"rules\": {\n        \"no-console\": \"off\",\n        \"unicorn/prefer-top-level-await\": \"off\"\n      }\n    },\n    {\n      \"files\": [\n        \"js/**\"\n      ],\n      \"parserOptions\": {\n        \"sourceType\": \"module\"\n      }\n    },\n    {\n      \"files\": [\n        \"js/tests/*.js\",\n        \"js/tests/integration/rollup*.js\"\n      ],\n      \"env\": {\n        \"node\": true\n      },\n      \"parserOptions\": {\n        \"sourceType\": \"script\"\n      }\n    },\n    {\n      \"files\": [\n        \"js/tests/unit/**\"\n      ],\n      \"env\": {\n        \"jasmine\": true\n      },\n      \"rules\": {\n        \"no-console\": \"off\",\n        \"unicorn/consistent-function-scoping\": \"off\",\n        \"unicorn/no-useless-undefined\": \"off\",\n        \"unicorn/prefer-add-event-listener\": \"off\"\n      }\n    },\n    {\n      \"files\": [\n        \"js/tests/visual/**\"\n      ],\n      \"plugins\": [\n        \"html\"\n      ],\n      \"settings\": {\n        \"html/html-extensions\": [\n          \".html\"\n        ]\n      },\n      \"rules\": {\n        \"no-console\": \"off\",\n        \"no-new\": \"off\",\n        \"unicorn/no-array-for-each\": \"off\"\n      }\n    },\n    {\n      \"files\": [\n        \"scss/tests/**\"\n      ],\n      \"env\": {\n        \"node\": true\n      },\n      \"parserOptions\": {\n        \"sourceType\": \"script\"\n      }\n    },\n    {\n      \"files\": [\n        \"site/**\"\n      ],\n      \"env\": {\n        \"browser\": true,\n        \"node\": false\n      },\n      \"parserOptions\": {\n        \"sourceType\": \"script\",\n        \"ecmaVersion\": 2019\n      },\n      \"rules\": {\n        \"no-new\": \"off\",\n        \"unicorn/no-array-for-each\": \"off\"\n      }\n    },\n    {\n      \"files\": [\n        \"site/src/assets/application.js\",\n        \"site/src/assets/partials/*.js\",\n        \"site/src/assets/search.js\",\n        \"site/src/assets/snippets.js\",\n        \"site/src/assets/stackblitz.js\",\n        \"site/src/plugins/*.js\"\n      ],\n      \"parserOptions\": {\n        \"sourceType\": \"module\",\n        \"ecmaVersion\": 2020\n      }\n    },\n    {\n      \"files\": [\n        \"**/*.md\"\n      ],\n      \"plugins\": [\n        \"markdown\"\n      ],\n      \"processor\": \"markdown/markdown\"\n    },\n    {\n      \"files\": [\n        \"**/*.md/*.js\",\n        \"**/*.md/*.mjs\"\n      ],\n      \"extends\": \"plugin:markdown/recommended-legacy\",\n      \"parserOptions\": {\n        \"sourceType\": \"module\"\n      },\n      \"rules\": {\n        \"unicorn/prefer-node-protocol\": \"off\"\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": ".gitattributes",
    "content": "# Enforce Unix newlines\n* text=auto eol=lf\n\n# Don't diff or textually merge source maps\n*.map binary\n\nbootstrap.css linguist-vendored=false\nbootstrap.js linguist-vendored=false\n"
  },
  {
    "path": ".github/CODEOWNERS",
    "content": "*.js    @twbs/js-review\n*.css   @twbs/css-review\n*.scss  @twbs/css-review\n"
  },
  {
    "path": ".github/CONTRIBUTING.md",
    "content": "# Contributing to Bootstrap\n\nLooking to contribute something to Bootstrap? **Here’s how you can help.**\n\nPlease take a moment to review this document in order to make the contribution\nprocess easy and effective for everyone involved.\n\nFollowing these guidelines helps to communicate that you respect the time of\nthe developers managing and developing this open source project. In return,\nthey should reciprocate that respect in addressing your issue or assessing\npatches and features.\n\n\n## Using the issue tracker\n\nThe [issue tracker](https://github.com/twbs/bootstrap/issues) is\nthe preferred channel for [bug reports](#bug-reports), [features requests](#feature-requests)\nand [submitting pull requests](#pull-requests), but please respect the following\nrestrictions:\n\n- Please **do not** use the issue tracker for personal support requests. Stack Overflow ([`bootstrap-5`](https://stackoverflow.com/questions/tagged/bootstrap-5) tag), [our GitHub Discussions](https://github.com/twbs/bootstrap/discussions) or [IRC](/README.md#community) are better places to get help.\n\n- Please **do not** derail or troll issues. Keep the discussion on topic and\n  respect the opinions of others.\n\n- Please **do not** post comments consisting solely of \"+1\" or \":thumbsup:\".\n  Use [GitHub's \"reactions\" feature](https://github.blog/news-insights/product-news/add-reactions-to-pull-requests-issues-and-comments/)\n  instead. We reserve the right to delete comments which violate this rule.\n\n\n## Issues assignment\n\nThe core team will be looking at the open issues, analyze them, and provide guidance on how to proceed. **Issues won’t be assigned to anyone outside the core team.** However, contributors are welcome to participate in the discussion and provide their input on how to best solve the issue, and even submit a PR if they want to. Please wait that the issue is ready to be worked on before submitting a PR, we don’t want to waste your time.\n\nPlease keep in mind that the core team is small, has limited resources and that we are not always able to respond immediately. We will try to provide feedback as soon as possible, but please be patient. If you don’t get a response immediately, it doesn’t mean that we are ignoring you or that we don’t care about your issue or PR. We will get back to you as soon as we can.\n\n\n## Issues and labels\n\nOur bug tracker utilizes several labels to help organize and identify issues. Here’s what they represent and how we use them:\n\n- `browser bug` - Issues that are reported to us, but actually are the result of a browser-specific bug. These are diagnosed with reduced test cases and result in an issue opened on that browser's own bug tracker.\n- `confirmed` - Issues that have been confirmed with a reduced test case and identify a bug in Bootstrap.\n- `css` - Issues stemming from our compiled CSS or source Sass files.\n- `docs` - Issues for improving or updating our documentation.\n- `examples` - Issues involving the example templates included in our docs.\n- `feature` - Issues asking for a new feature to be added, or an existing one to be extended or modified. New features require a minor version bump (e.g., `v3.0.0` to `v3.1.0`).\n- `build` - Issues with our build system, which is used to run all our tests, concatenate and compile source files, and more.\n- `help wanted` - Issues we need or would love help from the community to resolve.\n- `js` - Issues stemming from our compiled or source JavaScript files.\n- `meta` - Issues with the project itself or our GitHub repository.\n\nFor a complete look at our labels, see the [project labels page](https://github.com/twbs/bootstrap/labels).\n\n\n## Bug reports\n\nA bug is a _demonstrable problem_ that is caused by the code in the repository.\nGood bug reports are extremely helpful, so thanks!\n\nGuidelines for bug reports:\n\n0. **[Validate your HTML](https://html5.validator.nu/)** to ensure your\n   problem isn’t caused by a simple error in your own code.\n\n1. **Use the GitHub issue search** &mdash; check if the issue has already been\n   reported.\n\n2. **Check if the issue has been fixed** &mdash; try to reproduce it using the\n   latest `main` (or `v4-dev` branch if the issue is about v4) in the repository.\n\n3. **Isolate the problem** &mdash; ideally create a [reduced test\n   case](https://css-tricks.com/reduced-test-cases/) and a live example.\n   These [v4 CodePen](https://codepen.io/team/bootstrap/pen/yLabNQL) and [v5 CodePen](https://codepen.io/team/bootstrap/pen/qBamdLj) are helpful templates.\n\n\nA good bug report shouldn’t leave others needing to chase you up for more\ninformation. Please try to be as detailed as possible in your report. What is\nyour environment? What steps will reproduce the issue? What browser(s) and OS\nexperience the problem? Do other browsers show the bug differently? What\nwould you expect to be the outcome? All these details will help people to fix\nany potential bugs.\n\nExample:\n\n> Short and descriptive example bug report title\n>\n> A summary of the issue and the browser/OS environment in which it occurs. If\n> suitable, include the steps required to reproduce the bug.\n>\n> 1. This is the first step\n> 2. This is the second step\n> 3. Further steps, etc.\n>\n> `<url>` - a link to the reduced test case\n>\n> Any other information you want to share that is relevant to the issue being\n> reported. This might include the lines of code that you have identified as\n> causing the bug, and potential solutions (and your opinions on their\n> merits).\n\n### Reporting upstream browser bugs\n\nSometimes bugs reported to us are actually caused by bugs in the browser(s) themselves, not bugs in Bootstrap per se.\n\n| Vendor(s)     | Browser(s)                   | Rendering engine | Bug reporting website(s)                               | Notes                                                    |\n| ------------- | ---------------------------- | ---------------- | ------------------------------------------------------ | -------------------------------------------------------- |\n| Mozilla       | Firefox                      | Gecko            | <https://bugzilla.mozilla.org/enter_bug.cgi>             | \"Core\" is normally the right product option to choose.   |\n| Apple         | Safari                       | WebKit           | <https://bugs.webkit.org/enter_bug.cgi?product=WebKit>   | In Apple’s bug reporter, choose \"Safari\" as the product. |\n| Google, Opera | Chrome, Chromium, Opera v15+ | Blink            | <https://bugs.chromium.org/p/chromium/issues/list>       | Click the \"New issue\" button.                            |\n| Microsoft     | Edge                         | Blink            | <https://developer.microsoft.com/en-us/microsoft-edge/>  | Go to \"Help > Send Feedback\" from the browser            |\n\n\n## Feature requests\n\nFeature requests are welcome. But take a moment to find out whether your idea\nfits with the scope and aims of the project. It’s up to _you_ to make a strong\ncase to convince the project’s developers of the merits of this feature. Please\nprovide as much detail and context as possible.\n\n\n## Pull requests\n\nGood pull requests—patches, improvements, new features—are a fantastic\nhelp. They should remain focused in scope and avoid containing unrelated\ncommits.\n\n**Please ask first** before embarking on any **significant** pull request (e.g.\nimplementing features, refactoring code, porting to a different language),\notherwise you risk spending a lot of time working on something that the\nproject’s developers might not want to merge into the project. For trivial\nthings, or things that don’t require a lot of your time, you can go ahead and\nmake a PR.\n\nPlease adhere to the [coding guidelines](#code-guidelines) used throughout the\nproject (indentation, accurate comments, etc.) and any other requirements\n(such as test coverage).\n\n**Do not edit `bootstrap.css` or `bootstrap.js`, and do not commit\nany dist files (`dist/` or `js/dist`).** Those files are automatically generated by our build tools. You should\nedit the source files in [`/bootstrap/scss/`](https://github.com/twbs/bootstrap/tree/main/scss)\nand/or [`/bootstrap/js/src/`](https://github.com/twbs/bootstrap/tree/main/js/src) instead.\n\nSimilarly, when contributing to Bootstrap’s documentation, you should edit the\ndocumentation source files in\n[the `/bootstrap/site/content/docs/` directory of the `main` branch](https://github.com/twbs/bootstrap/tree/main/site/content/docs).\n**Do not edit the `gh-pages` branch.** That branch is generated from the\ndocumentation source files and is managed separately by the Bootstrap Core Team.\n\nAdhering to the following process is the best way to get your work\nincluded in the project:\n\n1. [Fork](https://help.github.com/articles/fork-a-repo/) the project, clone your fork,\n   and configure the remotes:\n\n   ```bash\n   # Clone your fork of the repo into the current directory\n   git clone https://github.com/<your-username>/bootstrap.git\n   # Navigate to the newly cloned directory\n   cd bootstrap\n   # Assign the original repo to a remote called \"upstream\"\n   git remote add upstream https://github.com/twbs/bootstrap.git\n   ```\n\n2. If you cloned a while ago, get the latest changes from upstream:\n\n   ```bash\n   git checkout main\n   git pull upstream main\n   ```\n\n3. Install or update project dependencies with npm:\n\n   ```bash\n   npm install\n   ```\n\n4. Create a new topic branch (off the main project development branch) to\n   contain your feature, change, or fix:\n\n   ```bash\n   git checkout -b <topic-branch-name>\n   ```\n\n5. Commit your changes in logical chunks. Please adhere to these [git commit\n   message guidelines](https://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html)\n   or your code is unlikely be merged into the main project. Use Git’s\n   [interactive rebase](https://help.github.com/articles/about-git-rebase/)\n   feature to tidy up your commits before making them public.\n\n6. Ensure your changes compile the dist CSS and JS files in the `dist/` directory. Verify\n   the build succeeds locally without errors.\n\n   ```bash\n   npm run dist\n   ```\n\n7. Locally merge (or rebase) the upstream development branch into your topic branch:\n\n   ```bash\n   git pull [--rebase] upstream main\n   ```\n\n8. Commit your changes, but **do not push compiled CSS and JS files in `dist` and `js/dist`**.\n   Push your topic branch up to your fork:\n\n   ```bash\n   git push origin <topic-branch-name>\n   ```\n\n9. [Open a pull request](https://help.github.com/articles/about-pull-requests/)\n   with a clear title and description against the `main` branch.\n\n**IMPORTANT**: By submitting a patch, you agree to allow the project owners to\nlicense your work under the terms of the [MIT License](../LICENSE) (if it\nincludes code changes) and under the terms of the\n[Creative Commons Attribution 3.0 Unported License](https://creativecommons.org/licenses/by/3.0/)\n(if it includes documentation changes).\n\n\n## Code guidelines\n\n### HTML\n\n[Adhere to the Code Guide.](https://codeguide.co/#html)\n\n- Use tags and elements appropriate for an HTML5 doctype (e.g., self-closing tags).\n- Use CDNs and HTTPS for third-party JS when possible. We don’t use protocol-relative URLs in this case because they break when viewing the page locally via `file://`.\n- Use [WAI-ARIA](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA) attributes in documentation examples to promote accessibility.\n\n### CSS\n\n[Adhere to the Code Guide.](https://codeguide.co/#css)\n\n- When feasible, default color palettes should comply with [WCAG color contrast guidelines](https://www.w3.org/TR/WCAG/#distinguishable).\n- Except in rare cases, don’t remove default `:focus` styles (via e.g. `outline: none;`) without providing alternative styles. See [this A11Y Project post](https://www.a11yproject.com/posts/2013-01-25-never-remove-css-outlines/) for more details.\n\n### JS\n\n- No semicolons (in client-side JS)\n- 2 spaces (no tabs)\n- strict mode\n- \"Attractive\"\n\n### Checking coding style\n\nRun `npm run test` before committing to ensure your changes follow our coding standards.\n\n\n## License\n\nBy contributing your code, you agree to license your contribution under the [MIT License](../LICENSE).\nBy contributing to the documentation, you agree to license your contribution under the [Creative Commons Attribution 3.0 Unported License](https://creativecommons.org/licenses/by/3.0/).\n\nPrior to v3.1.0, Bootstrap’s code was released under the Apache License v2.0.\n"
  },
  {
    "path": ".github/INCIDENT_RESPONSE.md",
    "content": "# Incident response plan\n\nThis document describes how the Bootstrap maintainers respond to and manage security or operational incidents affecting the project, its website, or its distributed releases. This plan is public to promote transparency and community trust. Operational details (e.g., private contacts, credentials, or internal coordination tools) are maintained separately in the maintainers’ private documentation.\n\n---\n\n## 1. Purpose & Scope\n\nThis plan defines how Bootstrap maintainers will:\n\n- Identify, triage, and manage security or integrity incidents affecting project code, releases, or infrastructure.\n- Communicate with the community and downstream consumers during and after an incident.\n- Record lessons learned and update processes to reduce future risk.\n\nIt applies to:\n\n- The Bootstrap source code, documentation, and build pipelines.\n- Release artifacts (npm, CDN, GitHub releases).\n- The main website ([https://getbootstrap.com](https://getbootstrap.com)).\n- Any official Bootstrap GitHub organization infrastructure.\n\nIt does **not** cover unrelated third-party forks or integrations.\n\n---\n\n## 2. Definitions\n\n- **Incident**: Any event that could compromise the confidentiality, integrity, or availability of Bootstrap code, releases, or users. Examples include:\n  - A discovered security vulnerability.\n  - A compromised GitHub account or CI/CD token.\n  - A malicious dependency or injected code in a release.\n  - Website defacement or unauthorized modification of documentation.\n  - Leaked secrets related to the project infrastructure.\n\n- **Incident Commander (IC)**: The maintainer responsible for coordinating the overall response.\n\n---\n\n## 3. Roles & Responsibilities\n\n| Role | Responsibilities |\n|------|-------------------|\n| **Incident Commander (IC)** | Coordinate the response, assign tasks, ensure timely communication. |\n| **Security Maintainers** | Triage reported vulnerabilities, assess impact, create fixes, handle embargoes. |\n| **Infrastructure Lead** | Manage CI/CD, website, and release infrastructure. |\n| **Communications Lead** | Manage public announcements, blog posts, and social updates. |\n| **Contributors & Community** | Promptly report suspected security issues and follow responsible disclosure guidelines. |\n\nIn practice, Bootstrap’s core team fulfills these roles collectively, assigning an IC on a per-incident basis.\n\n---\n\n## 4. Incident workflow\n\n### 4.1 Detection & Reporting\n\n- All security issues should be **privately reported** via the contact method in [`SECURITY.md`](../SECURITY.md) or through GitHub’s Security Advisory mechanism.\n- Maintainers also monitor:\n  - Automated dependency scanners (e.g., Dependabot, npm audit).\n  - GitHub notifications and vulnerability alerts.\n  - Community channels for suspicious activity.\n\n### 4.2 Initial triage\n\nUpon receiving a report:\n\n1. A maintainer acknowledges receipt within 3 business days (or sooner, when possible).  \n   Bootstrap is maintained by a small volunteer team; response times may vary slightly outside normal working hours.\n2. The IC assesses severity and impact:\n   - **Critical:** immediate compromise of release infrastructure or code integrity.\n   - **High:** exploitable vulnerability in distributed assets.\n   - **Medium:** minor vulnerability or low-likelihood attack vector.\n   - **Low:** informational, no direct risk.\n3. If confirmed as an incident, the IC opens a private coordination channel for maintainers and begins containment.\n\n### 4.3 Containment & Eradication\n\n- Revoke or rotate any affected credentials.\n- Disable compromised infrastructure or build pipelines if necessary.\n- Patch affected branches or dependencies.\n- Verify integrity of artifacts and releases.\n\n### 4.4 Communication\n\n- Keep the reporting party informed (when applicable).\n- For major incidents, the Communications Lead drafts a public advisory describing:\n  - What happened\n  - What was impacted\n  - How users can verify or mitigate\n  - What actions were taken\n- Communications occur after containment to avoid amplifying risk.\n\nPublic disclosures are posted via:\n\n- GitHub Security Advisory if appropriate\n- [blog.getbootstrap.com/](https://blog.getbootstrap.com/)\n- [Bootstrap GitHub discussions](https://github.com/orgs/twbs/discussions)\n- [@getbootstrap](https://x.com/getbootstrap) on X (formerly Twitter) for critical security notices.\n\n### 4.5 Recovery\n\n- Validate all systems and releases are secure.\n- Resume normal operations.\n- Tag patched releases and notify affected users.\n\n### 4.6 Post-incident review\n\nWithin two weeks after resolution:\n\n- Conduct an internal debrief.\n- Record:\n  - Root cause\n  - What worked / what didn’t\n  - Remediation steps\n  - Documentation or automation updates needed\n- Summarize lessons learned in the private maintainers’ wiki (with optional public summary if appropriate).\n\n---\n\n## 5. Severity levels & Response targets\n\n| Severity | Example | Target response (volunteer team) |\n|-----------|----------|----------------------------------|\n| **Critical** | Compromised release, stolen signing keys | Acknowledge ≤ 24h (best effort), containment ≤ 48h, fix ideally ≤ 14d |\n| **High** | Vulnerability enabling arbitrary code execution | Acknowledge ≤ 3 business days, fix ideally ≤ 14–21d |\n| **Medium** | XSS or content injection on docs site | Acknowledge ≤ 5 business days, fix in next release cycle |\n| **Low** | Minor issue with limited risk | Acknowledge ≤ 7 business days, fix as scheduled |\n\n**Note:** Timelines represent good-faith targets for a small volunteer core team, not hard SLAs. The maintainers will always prioritize public safety and transparency, even if timing varies.\n\n---\n\n## 6. Public disclosure principles\n\nBootstrap follows a responsible disclosure approach:\n\n- Work privately with reporters and affected parties before publishing details.\n- Never name reporters without consent.\n- Coordinate embargo periods with downstream consumers when needed.\n- Publish advisories only after patches or mitigations are available.\n\n---\n\n## 7. Communication Channels\n\n| Purpose | Channel |\n|----------|----------|\n| Private reporting | Email address in [`SECURITY.md`](./SECURITY.md) or GitHub advisory form |\n| General updates | [blog.getbootstrap.com/](https://blog.getbootstrap.com/) blog |\n| Security advisories | GitHub Security Advisory dashboard |\n| Social alerts | [@getbootstrap](https://x.com/getbootstrap) |\n| GitHub discussion alerts | [github.com/orgs/twbs/discussions](https://github.com/orgs/twbs/discussions) |\n\n---\n\n## 8. Plan Maintenance\n\nThis plan is reviewed at least annually or after any major incident. Changes are approved by the Core Team and recorded in Git history.\n\n---\n\n_The Bootstrap maintainers are committed to transparency, user trust, and continuous improvement in our security and response practices._\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.yml",
    "content": "name: Report a bug\ndescription: Tell us about a bug or issue you may have identified in Bootstrap.\ntitle: \"Provide a general summary of the issue\"\nlabels: [bug]\nassignees: \"-\"\nbody:\n  - type: checkboxes\n    attributes:\n      label: Prerequisites\n      description: Take a couple minutes to help our maintainers work faster.\n      options:\n        - label: I have [searched](https://github.com/twbs/bootstrap/issues?utf8=%E2%9C%93&q=is%3Aissue) for duplicate or closed issues\n          required: true\n        - label: I have [validated](https://html5.validator.nu/) any HTML to avoid common problems\n          required: true\n        - label: I have read the [contributing guidelines](https://github.com/twbs/bootstrap/blob/main/.github/CONTRIBUTING.md)\n          required: true\n  - type: textarea\n    id: what-happened\n    attributes:\n      label: Describe the issue\n      description: Provide a summary of the issue and what you expected to happen, including specific steps to reproduce.\n    validations:\n      required: true\n  - type: textarea\n    id: reduced-test-case\n    attributes:\n      label: Reduced test cases\n      description: Include links [reduced test case](https://css-tricks.com/reduced-test-cases/) links or suggested fixes using CodePen ([v4 template](https://codepen.io/team/bootstrap/pen/yLabNQL) or [v5 template](https://codepen.io/team/bootstrap/pen/qBamdLj)).\n    validations:\n      required: true\n  - type: dropdown\n    id: os\n    attributes:\n      label: What operating system(s) are you seeing the problem on?\n      multiple: true\n      options:\n        - Windows\n        - macOS\n        - Android\n        - iOS\n        - Linux\n    validations:\n      required: true\n  - type: dropdown\n    id: browser\n    attributes:\n      label: What browser(s) are you seeing the problem on?\n      multiple: true\n      options:\n        - Chrome\n        - Safari\n        - Firefox\n        - Microsoft Edge\n        - Opera\n  - type: input\n    id: version\n    attributes:\n      label: What version of Bootstrap are you using?\n      placeholder: \"e.g., v5.1.0 or v4.5.2\"\n    validations:\n      required: true\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "content": "contact_links:\n  - name: Ask the community\n    url: https://github.com/twbs/bootstrap/discussions/new\n    about: Ask and discuss questions with other Bootstrap community members.\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.yml",
    "content": "name: Feature request\ndescription: Suggest new or updated features to include in Bootstrap.\ntitle: \"Suggest a new feature\"\nlabels: [feature]\nassignees: []\nbody:\n  - type: checkboxes\n    attributes:\n      label: Prerequisites\n      description: Take a couple minutes to help our maintainers work faster.\n      options:\n        - label: I have [searched](https://github.com/twbs/bootstrap/issues?utf8=%E2%9C%93&q=is%3Aissue) for duplicate or closed feature requests\n          required: true\n        - label: I have read the [contributing guidelines](https://github.com/twbs/bootstrap/blob/main/.github/CONTRIBUTING.md)\n          required: true\n  - type: textarea\n    id: proposal\n    attributes:\n      label: Proposal\n      description: Provide detailed information for what we should add, including relevant links to prior art, screenshots, or live demos whenever possible.\n    validations:\n      required: true\n  - type: textarea\n    id: motivation\n    attributes:\n      label: Motivation and context\n      description: Tell us why this change is needed or helpful, and what problems it may help solve.\n    validations:\n      required: true\n"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "content": "### Description\n\n<!-- Describe your changes in detail -->\n\n### Motivation & Context\n\n<!-- Why is this change required? What problem does it solve? -->\n\n### Type of changes\n\n<!-- What types of changes does your code introduce? Put an `x` in all the boxes that apply. -->\n\n- [ ] Bug fix (non-breaking change which fixes an issue)\n- [ ] New feature (non-breaking change which adds functionality)\n- [ ] Refactoring (non-breaking change)\n- [ ] Breaking change (fix or feature that would change existing functionality)\n\n### Checklist\n\n<!-- Go over all the following points, and put an `x` in all the boxes that apply. -->\n<!-- If you’re unsure about any of these, don’t hesitate to ask. We’re here to help! -->\n\n- [ ] I have read the [contributing guidelines](https://github.com/twbs/bootstrap/blob/main/.github/CONTRIBUTING.md)\n- [ ] My code follows the code style of the project _(using `npm run lint`)_\n- [ ] My change introduces changes to the documentation\n- [ ] I have updated the documentation accordingly\n- [ ] I have added tests to cover my changes\n- [ ] All new and existing tests passed\n\n#### Live previews\n\n<!-- Please add direct links where your modifications can be seen in the documentation -->\n\n- <https://deploy-preview-{your_pr_number}--twbs-bootstrap.netlify.app/>\n\n### Related issues\n\n<!-- Please link any related issues here. -->\n"
  },
  {
    "path": ".github/SUPPORT.md",
    "content": "### Bug reports\n\nSee the [contributing guidelines](CONTRIBUTING.md) for sharing bug reports.\n\n### How-to\n\nFor general troubleshooting or help getting started:\n\n- Ask and explore [our GitHub Discussions](https://github.com/twbs/bootstrap/discussions).\n- Chat with fellow Bootstrappers in IRC. On the `irc.libera.chat` server, in the `#bootstrap` channel.\n- Ask and explore Stack Overflow with the [`bootstrap-5`](https://stackoverflow.com/questions/tagged/bootstrap-5) tag.\n"
  },
  {
    "path": ".github/codeql/codeql-config.yml",
    "content": "name: \"CodeQL config\"\npaths-ignore:\n  - dist\n"
  },
  {
    "path": ".github/dependabot.yml",
    "content": "version: 2\nupdates:\n  - package-ecosystem: \"github-actions\"\n    directory: \"/\"\n    schedule:\n      interval: weekly\n      day: tuesday\n      time: \"12:00\"\n      timezone: Europe/Athens\n    groups:\n      github-actions:\n        patterns:\n          - \"*\"\n  - package-ecosystem: npm\n    directory: \"/\"\n    labels:\n      - dependencies\n      - v5\n    schedule:\n      interval: weekly\n      day: tuesday\n      time: \"12:00\"\n      timezone: Europe/Athens\n    versioning-strategy: increase\n    rebase-strategy: disabled\n    groups:\n      production-dependencies:\n        dependency-type: \"production\"\n      development-dependencies:\n        dependency-type: \"development\"\n"
  },
  {
    "path": ".github/release-drafter.yml",
    "content": "name-template: 'v$NEXT_MAJOR_VERSION'\ntag-template: 'v$NEXT_MAJOR_VERSION'\nprerelease: true\nexclude-labels:\n  - 'skip-changelog'\ncategories:\n  - title: '❗ Breaking Changes'\n    labels:\n      - 'breaking-change'\n  - title: '🚀 Highlights'\n    labels:\n      - 'release-highlight'\n  - title: '🚀 Features'\n    labels:\n      - 'new-feature'\n      - 'feature'\n      - 'enhancement'\n  - title: '🐛 Bug fixes'\n    labels:\n      - 'fix'\n      - 'bugfix'\n      - 'bug'\n  - title: '⚡ Performance improvements'\n    labels:\n      - 'performance'\n  - title: '🎨 CSS'\n    labels:\n      - 'css'\n  - title: '☕️ JavaScript'\n    labels:\n      - 'js'\n  - title: '📖 Docs'\n    labels:\n      - 'docs'\n  - title: '🛠 Examples'\n    labels:\n      - 'examples'\n  - title: '🌎 Accessibility'\n    labels:\n      - 'accessibility'\n  - title: '🔧 Utility API'\n    labels:\n      - 'utility API'\n      - 'utilities'\n  - title: '🏭 Tests'\n    labels:\n      - 'tests'\n  - title: '🧰 Misc'\n    labels:\n      - 'build'\n      - 'meta'\n      - 'chore'\n      - 'CI'\n  - title: '📦 Dependencies'\n    labels:\n      - 'dependencies'\nchange-template: '- #$NUMBER: $TITLE'\ntemplate: |\n  ## Changes\n  $CHANGES\n"
  },
  {
    "path": ".github/workflows/browserstack.yml",
    "content": "name: BrowserStack\n\non:\n  push:\n    branches:\n      - \"**\"\n      - \"!dependabot/**\"\n  workflow_dispatch:\n\nenv:\n  FORCE_COLOR: 2\n  NODE: 22\n\npermissions:\n  contents: read\n\njobs:\n  browserstack:\n    runs-on: ubuntu-latest\n    if: github.repository == 'twbs/bootstrap'\n    timeout-minutes: 30\n\n    steps:\n      - name: Clone repository\n        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2\n        with:\n          persist-credentials: false\n\n      - name: Set up Node.js\n        uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0\n        with:\n          node-version: \"${{ env.NODE }}\"\n          cache: npm\n\n      - name: Install npm dependencies\n        run: npm ci\n\n      - name: Run dist\n        run: npm run dist\n\n      - name: Run BrowserStack tests\n        run: npm run js-test-cloud\n        env:\n          BROWSER_STACK_ACCESS_KEY: \"${{ secrets.BROWSER_STACK_ACCESS_KEY }}\"\n          BROWSER_STACK_USERNAME: \"${{ secrets.BROWSER_STACK_USERNAME }}\"\n          GITHUB_SHA: \"${{ github.sha }}\"\n"
  },
  {
    "path": ".github/workflows/bundlewatch.yml",
    "content": "name: Bundlewatch\n\non:\n  push:\n    branches:\n      - main\n  pull_request:\n  workflow_dispatch:\n\nenv:\n  FORCE_COLOR: 2\n  NODE: 22\n\npermissions:\n  contents: read\n\njobs:\n  bundlewatch:\n    runs-on: ubuntu-latest\n\n    steps:\n      - name: Clone repository\n        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2\n        with:\n          persist-credentials: false\n\n      - name: Set up Node.js\n        uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0\n        with:\n          node-version: \"${{ env.NODE }}\"\n          cache: npm\n\n      - name: Install npm dependencies\n        run: npm ci\n\n      - name: Run dist\n        run: npm run dist\n\n      - name: Run bundlewatch\n        run: npm run bundlewatch\n        env:\n          BUNDLEWATCH_GITHUB_TOKEN: \"${{ secrets.BUNDLEWATCH_GITHUB_TOKEN }}\"\n          CI_BRANCH_BASE: main\n"
  },
  {
    "path": ".github/workflows/calibreapp-image-actions.yml",
    "content": "name: Compress Images\n\non:\n  pull_request:\n    paths:\n      - '**.jpg'\n      - '**.jpeg'\n      - '**.png'\n      - '**.webp'\n\npermissions:\n  contents: read\n\njobs:\n  build:\n    # Only run on Pull Requests within the same repository, and not from forks.\n    if: github.event.pull_request.head.repo.full_name == github.repository\n    name: calibreapp/image-actions\n    runs-on: ubuntu-latest\n    permissions:\n      # allow calibreapp/image-actions to update PRs\n      pull-requests: write\n    steps:\n      - name: Clone repository\n        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2\n        with:\n          persist-credentials: false\n\n      - name: Compress Images\n        uses: calibreapp/image-actions@f32575787d333b0579f0b7d506ff03be63a669d1 # v1.4.1\n        with:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n"
  },
  {
    "path": ".github/workflows/codeql.yml",
    "content": "name: \"CodeQL\"\n\non:\n  push:\n    branches:\n      - main\n      - v4-dev\n      - \"!dependabot/**\"\n  pull_request:\n    branches:\n      - main\n      - v4-dev\n      - \"!dependabot/**\"\n  schedule:\n    - cron: \"0 2 * * 4\"\n  workflow_dispatch:\n\njobs:\n  analyze:\n    name: Analyze\n    runs-on: ubuntu-latest\n    permissions:\n      security-events: write\n\n    steps:\n      - name: Checkout repository\n        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2\n        with:\n          persist-credentials: false\n\n      - name: Initialize CodeQL\n        uses: github/codeql-action/init@c10b8064de6f491fea524254123dbe5e09572f13 # v4.35.1\n        with:\n          config-file: ./.github/codeql/codeql-config.yml\n          languages: \"javascript\"\n          queries: +security-and-quality\n\n      - name: Autobuild\n        uses: github/codeql-action/autobuild@c10b8064de6f491fea524254123dbe5e09572f13 # v4.35.1\n\n      - name: Perform CodeQL Analysis\n        uses: github/codeql-action/analyze@c10b8064de6f491fea524254123dbe5e09572f13 # v4.35.1\n        with:\n          category: \"/language:javascript\"\n"
  },
  {
    "path": ".github/workflows/cspell.yml",
    "content": "name: cspell\n\non:\n  push:\n    branches:\n      - main\n  pull_request:\n  workflow_dispatch:\n\nenv:\n  FORCE_COLOR: 2\n\npermissions:\n  contents: read\n\njobs:\n  cspell:\n    permissions:\n      # allow streetsidesoftware/cspell-action to fetch files for commits and PRs\n      contents: read\n      pull-requests: read\n    runs-on: ubuntu-latest\n\n    steps:\n      - name: Clone repository\n        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2\n        with:\n          persist-credentials: false\n\n      - name: Run cspell\n        uses: streetsidesoftware/cspell-action@9cd41bb518a24fefdafd9880cbab8f0ceba04d28 # v8.3.0\n        with:\n          config: \".cspell.json\"\n          files: \"**/*.{md,mdx}\"\n          inline: error\n          incremental_files_only: false\n"
  },
  {
    "path": ".github/workflows/css.yml",
    "content": "name: CSS\n\non:\n  push:\n    branches:\n      - main\n  pull_request:\n  workflow_dispatch:\n\nenv:\n  FORCE_COLOR: 2\n  NODE: 22\n\npermissions:\n  contents: read\n\njobs:\n  css:\n    runs-on: ubuntu-latest\n\n    steps:\n      - name: Clone repository\n        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2\n        with:\n          persist-credentials: false\n\n      - name: Set up Node.js\n        uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0\n        with:\n          node-version: \"${{ env.NODE }}\"\n          cache: npm\n\n      - name: Install npm dependencies\n        run: npm ci\n\n      - name: Build CSS\n        run: npm run css\n\n      - name: Run CSS tests\n        run: npm run css-test\n"
  },
  {
    "path": ".github/workflows/docs.yml",
    "content": "name: Docs\n\non:\n  push:\n    branches:\n      - main\n  pull_request:\n  workflow_dispatch:\n\nenv:\n  FORCE_COLOR: 2\n  NODE: 22\n\npermissions:\n  contents: read\n\njobs:\n  docs:\n    runs-on: ubuntu-latest\n\n    steps:\n      - name: Clone repository\n        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2\n        with:\n          persist-credentials: false\n\n      - name: Set up Node.js\n        uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0\n        with:\n          node-version: \"${{ env.NODE }}\"\n          cache: npm\n\n      - run: java -version\n\n      - name: Install npm dependencies\n        run: npm ci\n\n      - name: Build docs\n        run: npm run docs-build\n\n      - name: Validate HTML\n        run: npm run docs-vnu\n\n      - name: Run linkinator\n        uses: JustinBeckwith/linkinator-action@f62ba0c110a76effb2ee6022cc6ce4ab161085e3 # v2.4\n        with:\n          paths: _site\n          recurse: true\n          verbosity: error\n          skip: \"^http://localhost\"\n"
  },
  {
    "path": ".github/workflows/issue-close-require.yml",
    "content": "name: Close Issue Awaiting Reply\n\non:\n  schedule:\n    - cron: \"0 0 * * *\"\n\npermissions:\n  contents: read\n\njobs:\n  issue-close-require:\n    permissions:\n      # allow actions-cool/issues-helper to update issues and PRs\n      issues: write\n      pull-requests: write\n    runs-on: ubuntu-latest\n    if: github.repository == 'twbs/bootstrap'\n    steps:\n      - name: awaiting reply\n        uses: actions-cool/issues-helper@200c78641dbf33838311e5a1e0c31bbdb92d7cf0 # v3.8.0\n        with:\n          actions: \"close-issues\"\n          labels: \"awaiting-reply\"\n          inactive-day: 14\n          body: |\n            As the issue was labeled with `awaiting-reply`, but there has been no response in 14 days, this issue will be closed. If you have any questions, you can comment/reply.\n"
  },
  {
    "path": ".github/workflows/issue-labeled.yml",
    "content": "name: Issue Labeled\n\non:\n  issues:\n    types: [labeled]\n\npermissions:\n  contents: read\n\njobs:\n  issue-labeled:\n    permissions:\n      # allow actions-cool/issues-helper to update issues and PRs\n      issues: write\n      pull-requests: write\n    if: github.repository == 'twbs/bootstrap'\n    runs-on: ubuntu-latest\n    steps:\n      - name: awaiting reply\n        if: github.event.label.name == 'needs-example'\n        uses: actions-cool/issues-helper@200c78641dbf33838311e5a1e0c31bbdb92d7cf0 # v3.8.0\n        with:\n          actions: \"create-comment\"\n          token: ${{ secrets.GITHUB_TOKEN }}\n          body: |\n            Hello @${{ github.event.issue.user.login }}. Bug reports must include a **live demo** of the issue. Per our [contributing guidelines](https://github.com/twbs/bootstrap/blob/main/.github/CONTRIBUTING.md), please create a reduced test case on [CodePen](https://codepen.io/) or [StackBlitz](https://stackblitz.com/) and report back with your link, Bootstrap version, and specific browser and Operating System details.\n"
  },
  {
    "path": ".github/workflows/js.yml",
    "content": "name: JS Tests\n\non:\n  push:\n    branches:\n      - main\n  pull_request:\n  workflow_dispatch:\n\nenv:\n  FORCE_COLOR: 2\n  NODE: 22\n\npermissions:\n  contents: read\n\njobs:\n  run:\n    permissions:\n      # allow coverallsapp/github-action to create new checks issues and fetch code\n      checks: write\n      contents: read\n    name: JS Tests\n    runs-on: ubuntu-latest\n\n    steps:\n      - name: Clone repository\n        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2\n        with:\n          persist-credentials: false\n\n      - name: Set up Node.js\n        uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0\n        with:\n          node-version: ${{ env.NODE }}\n          cache: npm\n\n      - name: Install npm dependencies\n        run: npm ci\n\n      - name: Run dist\n        run: npm run js\n\n      - name: Run JS tests\n        run: npm run js-test\n\n      - name: Run Coveralls\n        uses: coverallsapp/github-action@5cbfd81b66ca5d10c19b062c04de0199c215fb6e # v2.3.7\n        if: ${{ !github.event.repository.fork }}\n        with:\n          github-token: \"${{ secrets.GITHUB_TOKEN }}\"\n          path-to-lcov: \"./js/coverage/lcov.info\"\n"
  },
  {
    "path": ".github/workflows/lint.yml",
    "content": "name: Lint\n\non:\n  push:\n    branches:\n      - main\n  pull_request:\n  workflow_dispatch:\n\nenv:\n  FORCE_COLOR: 2\n  NODE: 22\n\npermissions:\n  contents: read\n\njobs:\n  lint:\n    runs-on: ubuntu-latest\n\n    steps:\n      - name: Clone repository\n        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2\n        with:\n          persist-credentials: false\n\n      - name: Set up Node.js\n        uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0\n        with:\n          node-version: \"${{ env.NODE }}\"\n          cache: npm\n\n      - name: Install npm dependencies\n        run: npm ci\n\n      - name: Lint\n        run: npm run lint\n"
  },
  {
    "path": ".github/workflows/node-sass.yml",
    "content": "name: CSS (node-sass)\n\non:\n  push:\n    branches:\n      - main\n  pull_request:\n  workflow_dispatch:\n\nenv:\n  FORCE_COLOR: 2\n  NODE: 22\n\npermissions:\n  contents: read\n\njobs:\n  css:\n    runs-on: ubuntu-latest\n\n    steps:\n      - name: Clone repository\n        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2\n        with:\n          persist-credentials: false\n\n      - name: Set up Node.js\n        uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0\n        with:\n          node-version: \"${{ env.NODE }}\"\n\n      - name: Build CSS with node-sass\n        run: |\n          npx --package node-sass@latest node-sass --version\n          npx --package node-sass@latest node-sass --output-style expanded --source-map true --source-map-contents true --precision 6 scss/ -o dist-sass/css/\n          ls -Al dist-sass/css\n\n      - name: Check built CSS files for Sass variables\n        shell: bash\n        run: |\n          SASS_VARS_FOUND=$(find \"dist-sass/css/\" -type f -name \"*.css\" -print0 | xargs -0 --no-run-if-empty grep -F \"\\$\" || true)\n          if [[ -z \"$SASS_VARS_FOUND\" ]]; then\n            echo \"All good, no Sass variables found!\"\n            exit 0\n          else\n            echo \"Found $(echo \"$SASS_VARS_FOUND\" | wc -l | bc) Sass variables:\"\n            echo \"$SASS_VARS_FOUND\"\n            exit 1\n          fi\n"
  },
  {
    "path": ".github/workflows/publish-nuget.yml",
    "content": "name: Publish NuGet Packages\n\non:\n  release:\n    types: [published]\n\npermissions:\n  contents: read\n\njobs:\n  package-nuget:\n    runs-on: windows-latest\n    if: ${{ github.repository == 'twbs/bootstrap' && startsWith(github.event.release.tag_name, 'v') }}\n    env:\n      GITHUB_REF_NAME: ${{ github.ref_name }}\n    steps:\n      - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2\n        with:\n          persist-credentials: false\n\n      - name: Set up NuGet\n        uses: nuget/setup-nuget@12c57947e9458a5b976961b08ea0706a17dd71ae # v3.0.0\n        with:\n          nuget-api-key: ${{ secrets.NuGetAPIKey }}\n          nuget-version: '5.x'\n\n      - name: Pack NuGet packages\n        shell: pwsh\n        run: |\n          $bsversion = $env:GITHUB_REF_NAME.Substring(1)\n          nuget pack \"nuget\\bootstrap.nuspec\" -Verbosity detailed -NonInteractive -BasePath . -Version $bsversion\n          nuget pack \"nuget\\bootstrap.sass.nuspec\" -Verbosity detailed -NonInteractive -BasePath . -Version $bsversion\n          nuget push \"bootstrap.$bsversion.nupkg\" -Verbosity detailed -NonInteractive -Source \"https://api.nuget.org/v3/index.json\"\n          nuget push \"bootstrap.sass.$bsversion.nupkg\" -Verbosity detailed -NonInteractive -Source \"https://api.nuget.org/v3/index.json\"\n"
  },
  {
    "path": ".github/workflows/release-notes.yml",
    "content": "name: Release notes\n\non:\n  push:\n    branches:\n      - main\n  workflow_dispatch:\n\npermissions:\n  contents: read\n\njobs:\n  update_release_draft:\n    permissions:\n      # allow release-drafter/release-drafter to create GitHub releases and add labels to PRs\n      contents: write\n      pull-requests: write\n    runs-on: ubuntu-latest\n    if: github.repository == 'twbs/bootstrap'\n    steps:\n      - uses: release-drafter/release-drafter@139054aeaa9adc52ab36ddf67437541f039b88e2 # v7.1.1\n        env:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n"
  },
  {
    "path": ".github/workflows/scorecard.yml",
    "content": "# This workflow uses actions that are not certified by GitHub. They are provided\n# by a third-party and are governed by separate terms of service, privacy\n# policy, and support documentation.\n\nname: Scorecard supply-chain security\non:\n  # For Branch-Protection check. Only the default branch is supported. See\n  # https://github.com/ossf/scorecard/blob/main/docs/checks.md#branch-protection\n  branch_protection_rule:\n  # To guarantee Maintained check is occasionally updated. See\n  # https://github.com/ossf/scorecard/blob/main/docs/checks.md#maintained\n  schedule:\n    - cron: '27 12 * * 2'\n  push:\n    branches: [ \"main\" ]\n\n# Declare default permissions as read only.\npermissions: read-all\n\njobs:\n  analysis:\n    name: Scorecard analysis\n    runs-on: ubuntu-latest\n    # `publish_results: true` only works when run from the default branch. conditional can be removed if disabled.\n    if: github.event.repository.default_branch == github.ref_name || github.event_name == 'pull_request'\n    permissions:\n      # Needed to upload the results to code-scanning dashboard.\n      security-events: write\n      # Needed to publish results and get a badge (see publish_results below).\n      id-token: write\n      # Uncomment the permissions below if installing in a private repository.\n      # contents: read\n      # actions: read\n\n    steps:\n      - name: \"Checkout code\"\n        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2\n        with:\n          persist-credentials: false\n\n      - name: \"Run analysis\"\n        uses: ossf/scorecard-action@4eaacf0543bb3f2c246792bd56e8cdeffafb205a # v2.4.3\n        with:\n          results_file: results.sarif\n          results_format: sarif\n          # (Optional) \"write\" PAT token. Uncomment the `repo_token` line below if:\n          # - you want to enable the Branch-Protection check on a *public* repository, or\n          # - you are installing Scorecard on a *private* repository\n          # To create the PAT, follow the steps in https://github.com/ossf/scorecard-action?tab=readme-ov-file#authentication-with-fine-grained-pat-optional.\n          # repo_token: ${{ secrets.SCORECARD_TOKEN }}\n\n          # Public repositories:\n          #   - Publish results to OpenSSF REST API for easy access by consumers\n          #   - Allows the repository to include the Scorecard badge.\n          #   - See https://github.com/ossf/scorecard-action#publishing-results.\n          # For private repositories:\n          #   - `publish_results` will always be set to `false`, regardless\n          #     of the value entered here.\n          publish_results: true\n\n          # (Optional) Uncomment file_mode if you have a .gitattributes with files marked export-ignore\n          # file_mode: git\n\n      # Upload the results as artifacts (optional). Commenting out will disable uploads of run results in SARIF\n      # format to the repository Actions tab.\n      - name: \"Upload artifact\"\n        uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0\n        with:\n          name: SARIF file\n          path: results.sarif\n          retention-days: 5\n\n      # Upload the results to GitHub's code scanning dashboard (optional).\n      # Commenting out will disable upload of results to your repo's Code Scanning dashboard\n      - name: \"Upload to code-scanning\"\n        uses: github/codeql-action/upload-sarif@c10b8064de6f491fea524254123dbe5e09572f13 # v4.35.1\n        with:\n          sarif_file: results.sarif\n"
  },
  {
    "path": ".gitignore",
    "content": "# Ignore docs files\n/_site/\n\n# Numerous always-ignore extensions\n*.diff\n*.err\n*.log\n*.orig\n*.rej\n*.swo\n*.swp\n*.vi\n*.zip\n*~\n\n# OS or Editor folders\n._*\n.cache\n.DS_Store\n.idea\n.project\n.settings\n.tmproj\n*.esproj\n*.sublime-project\n*.sublime-workspace\nnbproject\nThumbs.db\n# Local Netlify folder\n.netlify\n\n# Komodo\n.komodotools\n*.komodoproject\n\n# Folders to ignore\n/dist-sass/\n/js/coverage/\n/node_modules/\n\n# Site\n/site/dist\n/site/node_modules\n/site/.astro\n/site/public\n"
  },
  {
    "path": ".prettierignore",
    "content": "# Prettier is only used for the website\n\nsite/.astro\nsite/dist\nsite/public\nsite/src/assets\nsite/src/scss\nsite/src/pages/**/*.md\nsite/src/pages/**/*.mdx\nsite/src/content/**/*.mdx\nsite/src/layouts/RedirectLayout.astro\nsite/static\n"
  },
  {
    "path": ".stylelintignore",
    "content": "**/*.min.css\n**/dist/\n**/vendor/\n/_site/\n/site/public/\n/js/coverage/\n"
  },
  {
    "path": ".stylelintrc.json",
    "content": "{\n  \"extends\": [\n    \"stylelint-config-twbs-bootstrap\"\n  ],\n  \"reportInvalidScopeDisables\": true,\n  \"reportNeedlessDisables\": true,\n  \"overrides\": [\n    {\n      \"files\": \"**/*.scss\",\n      \"rules\": {\n        \"declaration-property-value-disallowed-list\": {\n          \"border\": \"none\",\n          \"outline\": \"none\"\n        },\n        \"function-disallowed-list\": [\n          \"calc\",\n          \"lighten\",\n          \"darken\"\n        ],\n        \"property-disallowed-list\": [\n          \"border-radius\",\n          \"border-top-left-radius\",\n          \"border-top-right-radius\",\n          \"border-bottom-right-radius\",\n          \"border-bottom-left-radius\",\n          \"transition\"\n        ],\n        \"scss/dollar-variable-default\": [\n          true,\n          {\n            \"ignore\": \"local\"\n          }\n        ],\n        \"scss/selector-no-union-class-name\": true\n      }\n    },\n    {\n      \"files\": \"scss/**/*.{test,spec}.scss\",\n      \"rules\": {\n        \"scss/dollar-variable-default\": null,\n        \"declaration-no-important\": null\n      }\n    },\n    {\n      \"files\": \"site/**/*.scss\",\n      \"rules\": {\n        \"scss/dollar-variable-default\": null\n      }\n    },\n    {\n      \"files\": \"site/**/examples/**/*.css\",\n      \"rules\": {\n        \"comment-empty-line-before\": null,\n        \"property-no-vendor-prefix\": null,\n        \"selector-no-qualifying-type\": null,\n        \"value-no-vendor-prefix\": null\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": ".vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"astro-build.astro-vscode\",\n    \"dbaeumer.vscode-eslint\",\n    \"EditorConfig.EditorConfig\",\n    \"hossaini.bootstrap-intellisense\",\n    \"streetsidesoftware.code-spell-checker\",\n    \"stylelint.vscode-stylelint\"\n  ]\n}\n"
  },
  {
    "path": ".vscode/settings.json",
    "content": "{\n  \"editor.codeActionsOnSave\": {\n    \"source.fixAll.eslint\": \"explicit\",\n    \"source.fixAll.stylelint\": \"always\"\n  },\n  \"editor.renderWhitespace\": \"all\",\n  \"scss.validate\": false,\n  \"stylelint.enable\": true,\n  \"stylelint.validate\": [\"scss\"]\n}\n"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "content": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nWe as members, contributors, and leaders pledge to make participation in our\ncommunity a harassment-free experience for everyone, regardless of age, body\nsize, visible or invisible disability, ethnicity, sex characteristics, gender\nidentity and expression, level of experience, education, socio-economic status,\nnationality, personal appearance, race, caste, color, religion, or sexual\nidentity and orientation.\n\nWe pledge to act and interact in ways that contribute to an open, welcoming,\ndiverse, inclusive, and healthy community.\n\n## Our Standards\n\nExamples of behavior that contributes to a positive environment for our\ncommunity include:\n\n- Demonstrating empathy and kindness toward other people\n- Being respectful of differing opinions, viewpoints, and experiences\n- Giving and gracefully accepting constructive feedback\n- Accepting responsibility and apologizing to those affected by our mistakes,\n  and learning from the experience\n- Focusing on what is best not just for us as individuals, but for the overall\n  community\n\nExamples of unacceptable behavior include:\n\n- The use of sexualized language or imagery, and sexual attention or advances of\n  any kind\n- Trolling, insulting or derogatory comments, and personal or political attacks\n- Public or private harassment\n- Publishing others’ private information, such as a physical or email address,\n  without their explicit permission\n- Other conduct which could reasonably be considered inappropriate in a\n  professional setting\n\n## Enforcement Responsibilities\n\nCommunity leaders are responsible for clarifying and enforcing our standards of\nacceptable behavior and will take appropriate and fair corrective action in\nresponse to any behavior that they deem inappropriate, threatening, offensive,\nor harmful.\n\nCommunity leaders have the right and responsibility to remove, edit, or reject\ncomments, commits, code, wiki edits, issues, and other contributions that are\nnot aligned to this Code of Conduct, and will communicate reasons for moderation\ndecisions when appropriate.\n\n## Scope\n\nThis Code of Conduct applies within all community spaces, and also applies when\nan individual is officially representing the community in public spaces.\nExamples of representing our community include using an official e-mail address,\nposting via an official social media account, or acting as an appointed\nrepresentative at an online or offline event.\n\n## Enforcement\n\nInstances of abusive, harassing, or otherwise unacceptable behavior may be\nreported to the community leaders responsible for enforcement at\nmdo@getbootstrap.com.\nAll complaints will be reviewed and investigated promptly and fairly.\n\nAll community leaders are obligated to respect the privacy and security of the\nreporter of any incident.\n\n## Enforcement Guidelines\n\nCommunity leaders will follow these Community Impact Guidelines in determining\nthe consequences for any action they deem in violation of this Code of Conduct:\n\n### 1. Correction\n\n**Community Impact**: Use of inappropriate language or other behavior deemed\nunprofessional or unwelcome in the community.\n\n**Consequence**: A private, written warning from community leaders, providing\nclarity around the nature of the violation and an explanation of why the\nbehavior was inappropriate. A public apology may be requested.\n\n### 2. Warning\n\n**Community Impact**: A violation through a single incident or series of\nactions.\n\n**Consequence**: A warning with consequences for continued behavior. No\ninteraction with the people involved, including unsolicited interaction with\nthose enforcing the Code of Conduct, for a specified period of time. This\nincludes avoiding interactions in community spaces as well as external channels\nlike social media. Violating these terms may lead to a temporary or permanent\nban.\n\n### 3. Temporary Ban\n\n**Community Impact**: A serious violation of community standards, including\nsustained inappropriate behavior.\n\n**Consequence**: A temporary ban from any sort of interaction or public\ncommunication with the community for a specified period of time. No public or\nprivate interaction with the people involved, including unsolicited interaction\nwith those enforcing the Code of Conduct, is allowed during this period.\nViolating these terms may lead to a permanent ban.\n\n### 4. Permanent Ban\n\n**Community Impact**: Demonstrating a pattern of violation of community\nstandards, including sustained inappropriate behavior, harassment of an\nindividual, or aggression toward or disparagement of classes of individuals.\n\n**Consequence**: A permanent ban from any sort of public interaction within the\ncommunity.\n\n## Attribution\n\nThis Code of Conduct is adapted from the [Contributor Covenant][homepage],\nversion 2.1, available at\n[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1].\n\nCommunity Impact Guidelines were inspired by\n[Mozilla's code of conduct enforcement ladder][Mozilla CoC].\n\nFor answers to common questions about this code of conduct, see the FAQ at\n[https://www.contributor-covenant.org/faq][FAQ]. Translations are available at\n[https://www.contributor-covenant.org/translations][translations].\n\n[homepage]: https://www.contributor-covenant.org\n[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html\n[Mozilla CoC]: https://github.com/mozilla/diversity\n[FAQ]: https://www.contributor-covenant.org/faq\n[translations]: https://www.contributor-covenant.org/translations\n"
  },
  {
    "path": "LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2011-2026 The Bootstrap Authors\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "<p align=\"center\">\n  <a href=\"https://getbootstrap.com/\">\n    <img src=\"https://getbootstrap.com/docs/5.3/assets/brand/bootstrap-logo-shadow.png\" alt=\"Bootstrap logo\" width=\"200\" height=\"165\">\n  </a>\n</p>\n\n<h3 align=\"center\">Bootstrap</h3>\n\n<p align=\"center\">\n  Sleek, intuitive, and powerful front-end framework for faster and easier web development.\n  <br>\n  <a href=\"https://getbootstrap.com/docs/5.3/\"><strong>Explore Bootstrap docs »</strong></a>\n  <br>\n  <br>\n  <a href=\"https://github.com/twbs/bootstrap/issues/new?assignees=-&labels=bug&template=bug_report.yml\">Report bug</a>\n  ·\n  <a href=\"https://github.com/twbs/bootstrap/issues/new?assignees=&labels=feature&template=feature_request.yml\">Request feature</a>\n  ·\n  <a href=\"https://blog.getbootstrap.com/\">Blog</a>\n</p>\n\n\n## Bootstrap 5\n\nOur default branch is for development of our Bootstrap 5 release. Head to the [`v4-dev` branch](https://github.com/twbs/bootstrap/tree/v4-dev) to view the readme, documentation, and source code for Bootstrap 4.\n\n\n## Table of contents\n\n- [Quick start](#quick-start)\n- [Status](#status)\n- [What’s included](#whats-included)\n- [Bugs and feature requests](#bugs-and-feature-requests)\n- [Documentation](#documentation)\n- [Contributing](#contributing)\n- [Community](#community)\n- [Versioning](#versioning)\n- [Creators](#creators)\n- [Thanks](#thanks)\n- [Copyright and license](#copyright-and-license)\n\n\n## Quick start\n\nSeveral quick start options are available:\n\n- [Download the latest release](https://github.com/twbs/bootstrap/archive/v5.3.8.zip)\n- Clone the repo: `git clone https://github.com/twbs/bootstrap.git`\n- Install with [npm](https://www.npmjs.com/): `npm install bootstrap@v5.3.8`\n- Install with [yarn](https://yarnpkg.com/): `yarn add bootstrap@v5.3.8`\n- Install with [Bun](https://bun.sh/): `bun add bootstrap@v5.3.8`\n- Install with [Composer](https://getcomposer.org/): `composer require twbs/bootstrap:5.3.8`\n- Install with [NuGet](https://www.nuget.org/): CSS: `Install-Package bootstrap` Sass: `Install-Package bootstrap.sass`\n\nRead the [Getting started page](https://getbootstrap.com/docs/5.3/getting-started/introduction/) for information on the framework contents, templates, examples, and more.\n\n\n## Status\n\n[![Build Status](https://img.shields.io/github/actions/workflow/status/twbs/bootstrap/js.yml?branch=main&label=JS%20Tests&logo=github)](https://github.com/twbs/bootstrap/actions/workflows/js.yml?query=workflow%3AJS+branch%3Amain)\n[![npm version](https://img.shields.io/npm/v/bootstrap?logo=npm&logoColor=fff)](https://www.npmjs.com/package/bootstrap)\n[![Gem version](https://img.shields.io/gem/v/bootstrap?logo=rubygems&logoColor=fff)](https://rubygems.org/gems/bootstrap)\n[![Meteor Atmosphere](https://img.shields.io/badge/meteor-twbs%3Abootstrap-blue?logo=meteor&logoColor=fff)](https://atmospherejs.com/twbs/bootstrap)\n[![Packagist Prerelease](https://img.shields.io/packagist/vpre/twbs/bootstrap?logo=packagist&logoColor=fff)](https://packagist.org/packages/twbs/bootstrap)\n[![NuGet](https://img.shields.io/nuget/vpre/bootstrap?logo=nuget&logoColor=fff)](https://www.nuget.org/packages/bootstrap/absoluteLatest)\n[![Coverage Status](https://img.shields.io/coveralls/github/twbs/bootstrap/main?logo=coveralls&logoColor=fff)](https://coveralls.io/github/twbs/bootstrap?branch=main)\n[![CSS gzip size](https://img.badgesize.io/twbs/bootstrap/main/dist/css/bootstrap.min.css?compression=gzip&label=CSS%20gzip%20size)](https://github.com/twbs/bootstrap/blob/main/dist/css/bootstrap.min.css)\n[![CSS Brotli size](https://img.badgesize.io/twbs/bootstrap/main/dist/css/bootstrap.min.css?compression=brotli&label=CSS%20Brotli%20size)](https://github.com/twbs/bootstrap/blob/main/dist/css/bootstrap.min.css)\n[![JS gzip size](https://img.badgesize.io/twbs/bootstrap/main/dist/js/bootstrap.min.js?compression=gzip&label=JS%20gzip%20size)](https://github.com/twbs/bootstrap/blob/main/dist/js/bootstrap.min.js)\n[![JS Brotli size](https://img.badgesize.io/twbs/bootstrap/main/dist/js/bootstrap.min.js?compression=brotli&label=JS%20Brotli%20size)](https://github.com/twbs/bootstrap/blob/main/dist/js/bootstrap.min.js)\n![Open Source Security Foundation Scorecard](https://img.shields.io/ossf-scorecard/github.com/twbs/bootstrap)\n[![Backers on Open Collective](https://img.shields.io/opencollective/backers/bootstrap?logo=opencollective&logoColor=fff)](#backers)\n[![Sponsors on Open Collective](https://img.shields.io/opencollective/sponsors/bootstrap?logo=opencollective&logoColor=fff)](#sponsors)\n\n\n## What’s included\n\nWithin the download you’ll find the following directories and files, logically grouping common assets and providing both compiled and minified variations.\n\n<details>\n  <summary>Download contents</summary>\n\n  ```text\n  bootstrap/\n  ├── css/\n  │   ├── bootstrap-grid.css\n  │   ├── bootstrap-grid.css.map\n  │   ├── bootstrap-grid.min.css\n  │   ├── bootstrap-grid.min.css.map\n  │   ├── bootstrap-grid.rtl.css\n  │   ├── bootstrap-grid.rtl.css.map\n  │   ├── bootstrap-grid.rtl.min.css\n  │   ├── bootstrap-grid.rtl.min.css.map\n  │   ├── bootstrap-reboot.css\n  │   ├── bootstrap-reboot.css.map\n  │   ├── bootstrap-reboot.min.css\n  │   ├── bootstrap-reboot.min.css.map\n  │   ├── bootstrap-reboot.rtl.css\n  │   ├── bootstrap-reboot.rtl.css.map\n  │   ├── bootstrap-reboot.rtl.min.css\n  │   ├── bootstrap-reboot.rtl.min.css.map\n  │   ├── bootstrap-utilities.css\n  │   ├── bootstrap-utilities.css.map\n  │   ├── bootstrap-utilities.min.css\n  │   ├── bootstrap-utilities.min.css.map\n  │   ├── bootstrap-utilities.rtl.css\n  │   ├── bootstrap-utilities.rtl.css.map\n  │   ├── bootstrap-utilities.rtl.min.css\n  │   ├── bootstrap-utilities.rtl.min.css.map\n  │   ├── bootstrap.css\n  │   ├── bootstrap.css.map\n  │   ├── bootstrap.min.css\n  │   ├── bootstrap.min.css.map\n  │   ├── bootstrap.rtl.css\n  │   ├── bootstrap.rtl.css.map\n  │   ├── bootstrap.rtl.min.css\n  │   └── bootstrap.rtl.min.css.map\n  └── js/\n      ├── bootstrap.bundle.js\n      ├── bootstrap.bundle.js.map\n      ├── bootstrap.bundle.min.js\n      ├── bootstrap.bundle.min.js.map\n      ├── bootstrap.esm.js\n      ├── bootstrap.esm.js.map\n      ├── bootstrap.esm.min.js\n      ├── bootstrap.esm.min.js.map\n      ├── bootstrap.js\n      ├── bootstrap.js.map\n      ├── bootstrap.min.js\n      └── bootstrap.min.js.map\n  ```\n</details>\n\nWe provide compiled CSS and JS (`bootstrap.*`), as well as compiled and minified CSS and JS (`bootstrap.min.*`). [Source maps](https://web.dev/articles/source-maps) (`bootstrap.*.map`) are available for use with certain browsers’ developer tools. Bundled JS files (`bootstrap.bundle.js` and minified `bootstrap.bundle.min.js`) include [Popper](https://popper.js.org/docs/v2/).\n\n\n## Bugs and feature requests\n\nHave a bug or a feature request? Please first read the [issue guidelines](https://github.com/twbs/bootstrap/blob/main/.github/CONTRIBUTING.md#using-the-issue-tracker) and search for existing and closed issues. If your problem or idea is not addressed yet, [please open a new issue](https://github.com/twbs/bootstrap/issues/new/choose).\n\n\n## Documentation\n\nBootstrap’s documentation, included in this repo in the root directory, is built with [Astro](https://astro.build/) and publicly hosted on GitHub Pages at <https://getbootstrap.com/>. The docs may also be run locally.\n\nDocumentation search is powered by [Algolia's DocSearch](https://docsearch.algolia.com/).\n\n### Running documentation locally\n\n1. Run `npm install` to install the Node.js dependencies, including Astro (the site builder).\n2. Run `npm run test` (or a specific npm script) to rebuild distributed CSS and JavaScript files, as well as our docs assets.\n3. From the root `/bootstrap` directory, run `npm run docs-serve` in the command line.\n4. Open <http://localhost:9001> in your browser, and voilà.\n\nLearn more about using Astro by reading its [documentation](https://docs.astro.build/en/getting-started/).\n\n### Documentation for previous releases\n\nYou can find all our previous releases docs on <https://getbootstrap.com/docs/versions/>.\n\n[Previous releases](https://github.com/twbs/bootstrap/releases) and their documentation are also available for download.\n\n\n## Contributing\n\nPlease read through our [contributing guidelines](https://github.com/twbs/bootstrap/blob/main/.github/CONTRIBUTING.md). Included are directions for opening issues, coding standards, and notes on development.\n\nMoreover, if your pull request contains JavaScript patches or features, you must include [relevant unit tests](https://github.com/twbs/bootstrap/tree/main/js/tests). All HTML and CSS should conform to the [Code Guide](https://github.com/mdo/code-guide), maintained by [Mark Otto](https://github.com/mdo).\n\nEditor preferences are available in the [editor config](https://github.com/twbs/bootstrap/blob/main/.editorconfig) for easy use in common text editors. Read more and download plugins at <https://editorconfig.org/>.\n\n\n## Community\n\nGet updates on Bootstrap’s development and chat with the project maintainers and community members.\n\n- Follow [@getbootstrap on X](https://x.com/getbootstrap).\n- Read and subscribe to [The Official Bootstrap Blog](https://blog.getbootstrap.com/).\n- Ask questions and explore [our GitHub Discussions](https://github.com/twbs/bootstrap/discussions).\n- Discuss, ask questions, and more on [the community Discord](https://discord.gg/bZUvakRU3M) or [Bootstrap subreddit](https://www.reddit.com/r/bootstrap/).\n- Chat with fellow Bootstrappers in IRC. On the `irc.libera.chat` server, in the `#bootstrap` channel.\n- Implementation help may be found at Stack Overflow (tagged [`bootstrap-5`](https://stackoverflow.com/questions/tagged/bootstrap-5)).\n- Developers should use the keyword `bootstrap` on packages which modify or add to the functionality of Bootstrap when distributing through [npm](https://www.npmjs.com/browse/keyword/bootstrap) or similar delivery mechanisms for maximum discoverability.\n\n\n## Versioning\n\nFor transparency into our release cycle and in striving to maintain backward compatibility, Bootstrap is maintained under [the Semantic Versioning guidelines](https://semver.org/). Sometimes we screw up, but we adhere to those rules whenever possible.\n\nSee [the Releases section of our GitHub project](https://github.com/twbs/bootstrap/releases) for changelogs for each release version of Bootstrap. Release announcement posts on [the official Bootstrap blog](https://blog.getbootstrap.com/) contain summaries of the most noteworthy changes made in each release.\n\n\n## Creators\n\n**Mark Otto**\n\n- <https://x.com/mdo>\n- <https://github.com/mdo>\n\n**Jacob Thornton**\n\n- <https://x.com/fat>\n- <https://github.com/fat>\n\n\n## Thanks\n\n<a href=\"https://www.browserstack.com/\">\n  <img src=\"https://live.browserstack.com/images/opensource/browserstack-logo.svg\" alt=\"BrowserStack\" width=\"192\" height=\"42\">\n</a>\n\nThanks to [BrowserStack](https://www.browserstack.com/) for providing the infrastructure that allows us to test in real browsers!\n\n<a href=\"https://www.netlify.com/\">\n  <img src=\"https://www.netlify.com/v3/img/components/full-logo-light.svg\" alt=\"Netlify\" width=\"147\" height=\"40\">\n</a>\n\nThanks to [Netlify](https://www.netlify.com/) for providing us with Deploy Previews!\n\n\n## Sponsors\n\nSupport this project by becoming a sponsor. Your logo will show up here with a link to your website. [[Become a sponsor](https://opencollective.com/bootstrap#sponsor)]\n\n[![OC sponsor 0](https://opencollective.com/bootstrap/sponsor/0/avatar.svg)](https://opencollective.com/bootstrap/sponsor/0/website)\n[![OC sponsor 1](https://opencollective.com/bootstrap/sponsor/1/avatar.svg)](https://opencollective.com/bootstrap/sponsor/1/website)\n[![OC sponsor 2](https://opencollective.com/bootstrap/sponsor/2/avatar.svg)](https://opencollective.com/bootstrap/sponsor/2/website)\n[![OC sponsor 3](https://opencollective.com/bootstrap/sponsor/3/avatar.svg)](https://opencollective.com/bootstrap/sponsor/3/website)\n[![OC sponsor 4](https://opencollective.com/bootstrap/sponsor/4/avatar.svg)](https://opencollective.com/bootstrap/sponsor/4/website)\n[![OC sponsor 5](https://opencollective.com/bootstrap/sponsor/5/avatar.svg)](https://opencollective.com/bootstrap/sponsor/5/website)\n[![OC sponsor 6](https://opencollective.com/bootstrap/sponsor/6/avatar.svg)](https://opencollective.com/bootstrap/sponsor/6/website)\n[![OC sponsor 7](https://opencollective.com/bootstrap/sponsor/7/avatar.svg)](https://opencollective.com/bootstrap/sponsor/7/website)\n[![OC sponsor 8](https://opencollective.com/bootstrap/sponsor/8/avatar.svg)](https://opencollective.com/bootstrap/sponsor/8/website)\n[![OC sponsor 9](https://opencollective.com/bootstrap/sponsor/9/avatar.svg)](https://opencollective.com/bootstrap/sponsor/9/website)\n\n\n## Backers\n\nThank you to all our backers! 🙏 [[Become a backer](https://opencollective.com/bootstrap#backer)]\n\n[![Backers](https://opencollective.com/bootstrap/backers.svg?width=890)](https://opencollective.com/bootstrap#backers)\n\n\n## Copyright and license\n\nCode and documentation copyright 2011-2026 the [Bootstrap Authors](https://github.com/twbs/bootstrap/graphs/contributors). Code released under the [MIT License](https://github.com/twbs/bootstrap/blob/main/LICENSE). Docs released under [Creative Commons](https://creativecommons.org/licenses/by/3.0/).\n"
  },
  {
    "path": "SECURITY.md",
    "content": "# Reporting Security Issues\n\nThe Bootstrap team and community take security issues in Bootstrap seriously. We appreciate your efforts to responsibly disclose your findings, and will make every effort to acknowledge your contributions.\n\nTo report a security issue, email [security@getbootstrap.com](mailto:security@getbootstrap.com) and include the word \"SECURITY\" in the subject line.\n\nWe'll endeavor to respond quickly, and will keep you updated throughout the process.\n"
  },
  {
    "path": "build/banner.mjs",
    "content": "import fs from 'node:fs/promises'\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url))\n\nconst pkgJson = path.join(__dirname, '../package.json')\nconst pkg = JSON.parse(await fs.readFile(pkgJson, 'utf8'))\n\nconst year = new Date().getFullYear()\n\nfunction getBanner(pluginFilename) {\n  return `/*!\n  * Bootstrap${pluginFilename ? ` ${pluginFilename}` : ''} v${pkg.version} (${pkg.homepage})\n  * Copyright 2011-${year} ${pkg.author}\n  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n  */`\n}\n\nexport default getBanner\n"
  },
  {
    "path": "build/build-plugins.mjs",
    "content": "#!/usr/bin/env node\n\n/*!\n * Script to build our plugins to use them separately.\n * Copyright 2020-2026 The Bootstrap Authors\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport { babel } from '@rollup/plugin-babel'\nimport { globby } from 'globby'\nimport { rollup } from 'rollup'\nimport banner from './banner.mjs'\n\nconst __filename = fileURLToPath(import.meta.url)\nconst __dirname = path.dirname(fileURLToPath(import.meta.url))\n\nconst sourcePath = path.resolve(__dirname, '../js/src/').replace(/\\\\/g, '/')\nconst jsFiles = await globby(`${sourcePath}/**/*.js`)\n\n// Array which holds the resolved plugins\nconst resolvedPlugins = []\n\n// Trims the \"js\" extension and uppercases => first letter, hyphens, backslashes & slashes\nconst filenameToEntity = filename => filename.replace('.js', '')\n  .replace(/(?:^|-|\\/|\\\\)[a-z]/g, str => str.slice(-1).toUpperCase())\n\nfor (const file of jsFiles) {\n  resolvedPlugins.push({\n    src: file,\n    dist: file.replace('src', 'dist'),\n    fileName: path.basename(file),\n    className: filenameToEntity(path.basename(file))\n    // safeClassName: filenameToEntity(path.relative(sourcePath, file))\n  })\n}\n\nconst build = async plugin => {\n  /**\n   * @type {import('rollup').GlobalsOption}\n   */\n  const globals = {}\n\n  const bundle = await rollup({\n    input: plugin.src,\n    plugins: [\n      babel({\n        // Only transpile our source code\n        exclude: 'node_modules/**',\n        // Include the helpers in each file, at most one copy of each\n        babelHelpers: 'bundled'\n      })\n    ],\n    external(source) {\n      // Pattern to identify local files\n      const pattern = /^(\\.{1,2})\\//\n\n      // It's not a local file, e.g a Node.js package\n      if (!pattern.test(source)) {\n        globals[source] = source\n        return true\n      }\n\n      const usedPlugin = resolvedPlugins.find(plugin => {\n        return plugin.src.includes(source.replace(pattern, ''))\n      })\n\n      if (!usedPlugin) {\n        throw new Error(`Source ${source} is not mapped!`)\n      }\n\n      // We can change `Index` with `UtilIndex` etc if we use\n      // `safeClassName` instead of `className` everywhere\n      globals[path.normalize(usedPlugin.src)] = usedPlugin.className\n      return true\n    }\n  })\n\n  await bundle.write({\n    banner: banner(plugin.fileName),\n    format: 'umd',\n    name: plugin.className,\n    sourcemap: true,\n    globals,\n    generatedCode: 'es2015',\n    file: plugin.dist\n  })\n\n  console.log(`Built ${plugin.className}`)\n}\n\n(async () => {\n  try {\n    const basename = path.basename(__filename)\n    const timeLabel = `[${basename}] finished`\n\n    console.log('Building individual plugins...')\n    console.time(timeLabel)\n\n    await Promise.all(Object.values(resolvedPlugins).map(plugin => build(plugin)))\n\n    console.timeEnd(timeLabel)\n  } catch (error) {\n    console.error(error)\n    process.exit(1)\n  }\n})()\n"
  },
  {
    "path": "build/change-version.mjs",
    "content": "#!/usr/bin/env node\n\n/*!\n * Script to update version number references in the project.\n * Copyright 2017-2026 The Bootstrap Authors\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n\nimport { execFile } from 'node:child_process'\nimport fs from 'node:fs/promises'\nimport process from 'node:process'\n\nconst VERBOSE = process.argv.includes('--verbose')\nconst DRY_RUN = process.argv.includes('--dry') || process.argv.includes('--dry-run')\n\n// These are the files we only care about replacing the version\nconst FILES = [\n  'README.md',\n  'config.yml',\n  'js/src/base-component.js',\n  'package.js',\n  'scss/mixins/_banner.scss',\n  'site/data/docs-versions.yml'\n]\n\n// Blame TC39... https://github.com/benjamingr/RegExp.escape/issues/37\nfunction regExpQuote(string) {\n  return string.replace(/[$()*+-.?[\\\\\\]^{|}]/g, '\\\\$&')\n}\n\nfunction regExpQuoteReplacement(string) {\n  return string.replace(/\\$/g, '$$')\n}\n\nasync function replaceRecursively(file, oldVersion, newVersion) {\n  const originalString = await fs.readFile(file, 'utf8')\n  const newString = originalString\n    .replace(\n      new RegExp(regExpQuote(oldVersion), 'g'),\n      regExpQuoteReplacement(newVersion)\n    )\n    // Also replace the version used by the rubygem,\n    // which is using periods (`.`) instead of hyphens (`-`)\n    .replace(\n      new RegExp(regExpQuote(oldVersion.replace(/-/g, '.')), 'g'),\n      regExpQuoteReplacement(newVersion.replace(/-/g, '.'))\n    )\n\n  // No need to move any further if the strings are identical\n  if (originalString === newString) {\n    return\n  }\n\n  if (VERBOSE) {\n    console.log(`Found ${oldVersion} in ${file}`)\n  }\n\n  if (DRY_RUN) {\n    return\n  }\n\n  await fs.writeFile(file, newString, 'utf8')\n}\n\nfunction bumpNpmVersion(newVersion) {\n  if (DRY_RUN) {\n    return\n  }\n\n  execFile('npm', ['version', newVersion, '--no-git-tag'], { shell: true }, error => {\n    if (error) {\n      console.error(error)\n      process.exit(1)\n    }\n  })\n}\n\nfunction showUsage(args) {\n  console.error('USAGE: change-version old_version new_version [--verbose] [--dry[-run]]')\n  console.error('Got arguments:', args)\n  process.exit(1)\n}\n\nasync function main(args) {\n  let [oldVersion, newVersion] = args\n\n  if (!oldVersion || !newVersion) {\n    showUsage(args)\n  }\n\n  // Strip any leading `v` from arguments because\n  // otherwise we will end up with duplicate `v`s\n  [oldVersion, newVersion] = [oldVersion, newVersion].map(arg => {\n    return arg.startsWith('v') ? arg.slice(1) : arg\n  })\n\n  if (oldVersion === newVersion) {\n    showUsage(args)\n  }\n\n  bumpNpmVersion(newVersion)\n\n  try {\n    await Promise.all(\n      FILES.map(file => replaceRecursively(file, oldVersion, newVersion))\n    )\n  } catch (error) {\n    console.error(error)\n    process.exit(1)\n  }\n}\n\nmain(process.argv.slice(2))\n"
  },
  {
    "path": "build/docs-prep.sh",
    "content": "#!/bin/bash\n\n# Colors for output\nRED='\\033[0;31m'\nGREEN='\\033[0;32m'\nYELLOW='\\033[0;33m'\nBLUE='\\033[0;34m'\nNC='\\033[0m' # No Color\n\n# Default branch suffix\nBRANCH_SUFFIX=\"release\"\n\n# Check if a custom version parameter was provided\nif [ $# -eq 1 ]; then\n  BRANCH_SUFFIX=\"$1\"\nfi\n\n# Branch name to create\nNEW_BRANCH=\"gh-pages-${BRANCH_SUFFIX}\"\n\n# Get the current docs version from config\nDOCS_VERSION=$(node -p \"require('js-yaml').load(require('fs').readFileSync('config.yml', 'utf8')).docs_version\")\n\n# Function to print colored messages\nprint_success() {\n  echo -e \"${GREEN}✓ $1${NC}\"\n}\n\nprint_error() {\n  echo -e \"${RED}✗ $1${NC}\"\n  exit 1\n}\n\nprint_info() {\n  echo -e \"${BLUE}ℹ $1${NC}\"\n}\n\nprint_warning() {\n  echo -e \"${YELLOW}⚠ $1${NC}\"\n}\n\n# Function to execute command with error handling\nexecute() {\n  print_info \"Running: $1\"\n  eval $1\n  if [ $? -ne 0 ]; then\n    print_error \"Failed to execute: $1\"\n  else\n    print_success \"Successfully executed: $1\"\n  fi\n}\n\n# Check if /tmp/_site directory exists from a previous run\nif [ -d \"/tmp/_site\" ]; then\n  print_warning \"Found existing /tmp/_site directory. Removing it…\"\n  rm -rf /tmp/_site\nfi\n\n# Main process\nprint_info \"Starting documentation deployment process…\"\n\n# Step 1: Build documentation\nprint_info \"Building documentation with npm run docs…\"\nnpm run docs\nif [ $? -ne 0 ]; then\n  print_error \"Documentation build failed!\"\nfi\nprint_success \"Documentation built successfully\"\n\n# Step 2: Move _site to /tmp/\nprint_info \"Moving _site to temporary location…\"\nexecute \"mv _site /tmp/\"\n\n# Step 3: Switch to gh-pages branch\nprint_info \"Checking out gh-pages branch…\"\ngit checkout gh-pages\nif [ $? -ne 0 ]; then\n  print_error \"Failed to checkout gh-pages branch. Make sure it exists.\"\nfi\nprint_success \"Switched to gh-pages branch\"\n\ngit reset --hard origin/gh-pages\nif [ $? -ne 0 ]; then\n  print_error \"Failed to reset to origin/gh-pages. Check your git configuration.\"\nfi\nprint_success \"Reset to origin/gh-pages\"\n\ngit pull origin gh-pages\nif [ $? -ne 0 ]; then\n  print_error \"Failed to pull from origin/gh-pages. Check your network connection and git configuration.\"\nfi\nprint_success \"Pulled latest changes from origin/gh-pages\"\n\n# Step 4: Create a new branch for the update\nprint_info \"Checking if branch ${NEW_BRANCH} exists and deleting it if it does…\"\nif git show-ref --verify --quiet refs/heads/${NEW_BRANCH}; then\n  execute \"git branch -D ${NEW_BRANCH}\"\nelse\n  print_info \"Branch ${NEW_BRANCH} does not exist, proceeding with creation…\"\nfi\nprint_info \"Creating new branch ${NEW_BRANCH}…\"\nexecute \"git checkout -b ${NEW_BRANCH}\"\n\n# Step 5: Move all root-level files from Astro build\nfind /tmp/_site -maxdepth 1 -type f -exec mv {} . \\;\n\n# Step 6: Move all top-level directories except 'docs' (which needs special handling)\nfind /tmp/_site -maxdepth 1 -type d ! -name \"_site\" ! -name \"docs\" -exec sh -c 'dir=$(basename \"$1\"); rm -rf \"$dir\"; mv \"$1\" .' _ {} \\;\n\n# Step 7: Handle docs directory specially\nif [ -d \"/tmp/_site/docs\" ]; then\n  # Replace only the current version's docs\n  if [ -d \"docs/$DOCS_VERSION\" ]; then\n    rm -rf \"docs/$DOCS_VERSION\"\n  fi\n  mv \"/tmp/_site/docs/$DOCS_VERSION\" \"docs/\"\n\n  # Handle docs root files\n  find /tmp/_site/docs -maxdepth 1 -type f -exec mv {} docs/ \\;\n\n  # Handle special docs directories (getting-started, versions)\n  for special_dir in getting-started versions; do\n    if [ -d \"/tmp/_site/docs/$special_dir\" ]; then\n      rm -rf \"docs/$special_dir\"\n      mv \"/tmp/_site/docs/$special_dir\" \"docs/\"\n    fi\n  done\nfi\n\n# Clean up remaining files in /tmp/_site if any\nif [ -d \"/tmp/_site\" ]; then\n  remaining_files=$(find /tmp/_site -type f | wc -l)\n  remaining_dirs=$(find /tmp/_site -type d | wc -l)\n  if [ $remaining_files -gt 0 ] || [ $remaining_dirs -gt 1 ]; then\n    print_warning \"There are still some files or directories in /tmp/_site that weren't moved.\"\n    print_warning \"You may want to inspect /tmp/_site to see if anything important was missed.\"\n  else\n    print_info \"Cleaning up temporary directory…\"\n    rm -rf /tmp/_site\n    print_success \"Temporary directory cleaned up\"\n  fi\nfi\n\n# Step 10: Remove empty site directory if it exists\nif [ -d \"site\" ]; then\n  print_info \"Removing empty site directory…\"\n  execute \"rm -rf site\"\nfi\n\nprint_success \"Docs prep complete!\"\nprint_info \"Review changes before committing and pushing.\"\nprint_info \"Next steps:\"\nprint_info \"  1. Run a local server to review changes\"\nprint_info \"  2. Check browser and web inspector for any errors\"\nprint_info \"  3. git add .\"\nprint_info \"  4. git commit -m \\\"Update documentation\\\"\"\nprint_info \"  5. git push origin ${NEW_BRANCH}\"\n"
  },
  {
    "path": "build/generate-sri.mjs",
    "content": "#!/usr/bin/env node\n\n/*!\n * Script to generate SRI hashes for use in our docs.\n * Remember to use the same vendor files as the CDN ones,\n * otherwise the hashes won't match!\n *\n * Copyright 2017-2026 The Bootstrap Authors\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n\nimport crypto from 'node:crypto'\nimport fs from 'node:fs'\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport sh from 'shelljs'\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url))\n\nsh.config.fatal = true\n\nconst configFile = path.join(__dirname, '../config.yml')\n\n// Array of objects which holds the files to generate SRI hashes for.\n// `file` is the path from the root folder\n// `configPropertyName` is the config.yml variable's name of the file\nconst files = [\n  {\n    file: 'dist/css/bootstrap.min.css',\n    configPropertyName: 'css_hash'\n  },\n  {\n    file: 'dist/css/bootstrap.rtl.min.css',\n    configPropertyName: 'css_rtl_hash'\n  },\n  {\n    file: 'dist/js/bootstrap.min.js',\n    configPropertyName: 'js_hash'\n  },\n  {\n    file: 'dist/js/bootstrap.bundle.min.js',\n    configPropertyName: 'js_bundle_hash'\n  },\n  {\n    file: 'node_modules/@popperjs/core/dist/umd/popper.min.js',\n    configPropertyName: 'popper_hash'\n  }\n]\n\nfor (const { file, configPropertyName } of files) {\n  fs.readFile(file, 'utf8', (error, data) => {\n    if (error) {\n      throw error\n    }\n\n    const algorithm = 'sha384'\n    const hash = crypto.createHash(algorithm).update(data, 'utf8').digest('base64')\n    const integrity = `${algorithm}-${hash}`\n\n    console.log(`${configPropertyName}: ${integrity}`)\n\n    sh.sed('-i', new RegExp(`^(\\\\s+${configPropertyName}:\\\\s+[\"'])\\\\S*([\"'])`), `$1${integrity}$2`, configFile)\n  })\n}\n"
  },
  {
    "path": "build/postcss.config.mjs",
    "content": "const mapConfig = {\n  inline: false,\n  annotation: true,\n  sourcesContent: true\n}\n\nexport default context => {\n  return {\n    map: context.file.dirname.includes('examples') ? false : mapConfig,\n    plugins: {\n      autoprefixer: {\n        cascade: false\n      },\n      rtlcss: context.env === 'RTL'\n    }\n  }\n}\n"
  },
  {
    "path": "build/rollup.config.mjs",
    "content": "import path from 'node:path'\nimport process from 'node:process'\nimport { fileURLToPath } from 'node:url'\nimport { babel } from '@rollup/plugin-babel'\nimport { nodeResolve } from '@rollup/plugin-node-resolve'\nimport replace from '@rollup/plugin-replace'\nimport banner from './banner.mjs'\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url))\n\nconst BUNDLE = process.env.BUNDLE === 'true'\nconst ESM = process.env.ESM === 'true'\n\nlet destinationFile = `bootstrap${ESM ? '.esm' : ''}`\nconst external = ['@popperjs/core']\nconst plugins = [\n  babel({\n    // Only transpile our source code\n    exclude: 'node_modules/**',\n    // Include the helpers in the bundle, at most one copy of each\n    babelHelpers: 'bundled'\n  })\n]\nconst globals = {\n  '@popperjs/core': 'Popper'\n}\n\nif (BUNDLE) {\n  destinationFile += '.bundle'\n  // Remove last entry in external array to bundle Popper\n  external.pop()\n  delete globals['@popperjs/core']\n  plugins.push(\n    replace({\n      'process.env.NODE_ENV': '\"production\"',\n      preventAssignment: true\n    }),\n    nodeResolve()\n  )\n}\n\nconst rollupConfig = {\n  input: path.resolve(__dirname, `../js/index.${ESM ? 'esm' : 'umd'}.js`),\n  output: {\n    banner: banner(),\n    file: path.resolve(__dirname, `../dist/js/${destinationFile}.js`),\n    format: ESM ? 'esm' : 'umd',\n    globals,\n    generatedCode: 'es2015'\n  },\n  external,\n  plugins\n}\n\nif (!ESM) {\n  rollupConfig.output.name = 'bootstrap'\n}\n\nexport default rollupConfig\n"
  },
  {
    "path": "build/vnu-jar.mjs",
    "content": "#!/usr/bin/env node\n\n/*!\n * Script to run vnu-jar if Java is available.\n * Copyright 2017-2026 The Bootstrap Authors\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n\nimport { execFile, spawn } from 'node:child_process'\nimport vnu from 'vnu-jar'\n\nexecFile('java', ['-version'], (error, stdout, stderr) => {\n  if (error) {\n    console.error('Skipping vnu-jar test; Java is probably missing.')\n    console.error(error)\n    return\n  }\n\n  console.log('Running vnu-jar validation...')\n\n  const is32bitJava = !/64-Bit/.test(stderr)\n\n  // vnu-jar accepts multiple ignores joined with a `|`.\n  // Also note that the ignores are string regular expressions.\n  const ignores = [\n    // \"autocomplete\" is included in <button> and checkboxes and radio <input>s due to\n    // Firefox's non-standard autocomplete behavior - see https://bugzilla.mozilla.org/show_bug.cgi?id=654072\n    'Attribute “autocomplete” is only allowed when the input type is.*',\n    'Attribute “autocomplete” not allowed on element “button” at this point.',\n    // Per https://www.w3.org/TR/html-aria/#docconformance having \"aria-disabled\" on a link is\n    // NOT RECOMMENDED, but it's still valid - we explain in the docs that it's not ideal,\n    // and offer more robust alternatives, but also need to show a less-than-ideal example\n    'An “aria-disabled” attribute whose value is “true” should not be specified on an “a” element that has an “href” attribute.',\n    // A `code` element with the `is:raw` attribute coming from remark-prismjs (Astro upstream possible bug)\n    'Attribute “is:raw” is not serializable as XML 1.0.',\n    'Attribute “is:raw” not allowed on element “code” at this point.',\n    // Astro's expecting trailing slashes on HTML tags such as <br />\n    'Trailing slash on void elements has no effect and interacts badly with unquoted attribute values.',\n    // Allow `switch` attribute.\n    'Attribute “switch” not allowed on element “input” at this point.'\n  ].join('|')\n\n  const args = [\n    '-jar',\n    `\"${vnu}\"`,\n    '--asciiquotes',\n    '--skip-non-html',\n    '--Werror',\n    `--filterpattern \"${ignores}\"`,\n    '_site/',\n    'js/tests/'\n  ]\n\n  // For the 32-bit Java we need to pass `-Xss512k`\n  if (is32bitJava) {\n    args.splice(0, 0, '-Xss512k')\n  }\n\n  console.log(`command used: java ${args.join(' ')}`)\n\n  return spawn('java', args, {\n    shell: true,\n    stdio: 'inherit'\n  })\n    .on('exit', process.exit)\n})\n"
  },
  {
    "path": "build/zip-examples.mjs",
    "content": "#!/usr/bin/env node\n\n/*!\n * Script to create the built examples zip archive;\n * requires the `zip` command to be present!\n * Copyright 2020-2026 The Bootstrap Authors\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n\nimport fs from 'node:fs/promises'\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport sh from 'shelljs'\nimport { format } from 'prettier'\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url))\n\nconst pkgJson = path.join(__dirname, '../package.json')\nconst pkg = JSON.parse(await fs.readFile(pkgJson, 'utf8'))\n\nconst versionShort = pkg.config.version_short\nconst distFolder = `bootstrap-${pkg.version}-examples`\nconst rootDocsDir = '_site'\nconst docsDir = `${rootDocsDir}/docs/${versionShort}/`\n\n// these are the files we need in the examples\nconst cssFiles = [\n  'bootstrap.min.css',\n  'bootstrap.min.css.map',\n  'bootstrap.rtl.min.css',\n  'bootstrap.rtl.min.css.map'\n]\nconst jsFiles = [\n  'bootstrap.bundle.min.js',\n  'bootstrap.bundle.min.js.map'\n]\nconst imgFiles = [\n  'bootstrap-logo.svg',\n  'bootstrap-logo-white.svg'\n]\nconst staticJsFiles = [\n  'color-modes.js'\n]\n\nsh.config.fatal = true\n\nif (!sh.test('-d', rootDocsDir)) {\n  throw new Error(`The \"${rootDocsDir}\" folder does not exist, did you forget building the docs?`)\n}\n\n// switch to the root dir\nsh.cd(path.join(__dirname, '..'))\n\n// remove any previously created folder/zip with the same name\nsh.rm('-rf', [distFolder, `${distFolder}.zip`])\n\n// create any folders so that `cp` works\nsh.mkdir('-p', [\n  distFolder,\n  `${distFolder}/assets/brand/`,\n  `${distFolder}/assets/dist/css/`,\n  `${distFolder}/assets/dist/js/`,\n  `${distFolder}/assets/js/`\n])\n\nsh.cp('-Rf', `${docsDir}/examples/*`, distFolder)\n\nfor (const file of cssFiles) {\n  sh.cp('-f', `${docsDir}/dist/css/${file}`, `${distFolder}/assets/dist/css/`)\n}\n\nfor (const file of jsFiles) {\n  sh.cp('-f', `${docsDir}/dist/js/${file}`, `${distFolder}/assets/dist/js/`)\n}\n\nfor (const file of imgFiles) {\n  sh.cp('-f', `${docsDir}/assets/brand/${file}`, `${distFolder}/assets/brand/`)\n}\n\nfor (const file of staticJsFiles) {\n  sh.cp('-f', `${docsDir}/assets/js/${file}`, `${distFolder}/assets/js/`)\n}\n\nsh.rm(`${distFolder}/index.html`)\n\n// get all examples' HTML files\nconst htmlFiles = sh.find(`${distFolder}/**/*.html`)\n\nconst formatPromises = htmlFiles.map(async file => {\n  const fileContents = sh.cat(file)\n    .toString()\n    .replace(new RegExp(`\"/docs/${versionShort}/`, 'g'), '\"../')\n    .replace(/\"..\\/dist\\//g, '\"../assets/dist/')\n    .replace(/(<link href=\"\\.\\.\\/[^\"]*\"[^>]*) integrity=\"[^\"]*\"/g, '$1')\n    .replace(/<link[^>]*href=\"\\.\\.\\/assets\\/img\\/favicons\\/[^\"]*\"[^>]*>/g, '')\n    .replace(/(<script src=\"\\.\\.\\/[^\"]*\"[^>]*) integrity=\"[^\"]*\"/g, '$1')\n\n  let formattedHTML\n  try {\n    formattedHTML = await format(fileContents, {\n      parser: 'html',\n      filepath: file\n    })\n  } catch (error) {\n    console.error(`\\nError formatting ${file}:`)\n    console.error(`Message: ${error.message}`)\n    console.error('\\nSkipping formatting for this file...\\n')\n    formattedHTML = fileContents\n  }\n\n  new sh.ShellString(formattedHTML).to(file)\n})\n\nawait Promise.all(formatPromises)\n\n// create the zip file\nsh.exec(`zip -qr9 \"${distFolder}.zip\" \"${distFolder}\"`)\n\n// remove the folder we created\nsh.rm('-rf', distFolder)\n"
  },
  {
    "path": "composer.json",
    "content": "{\n  \"name\": \"twbs/bootstrap\",\n  \"description\": \"The most popular front-end framework for developing responsive, mobile first projects on the web.\",\n  \"keywords\": [\n    \"css\",\n    \"js\",\n    \"sass\",\n    \"mobile-first\",\n    \"responsive\",\n    \"front-end\",\n    \"framework\",\n    \"web\"\n  ],\n  \"homepage\": \"https://getbootstrap.com/\",\n  \"authors\": [\n    {\n      \"name\": \"Mark Otto\",\n      \"email\": \"markdotto@gmail.com\"\n    },\n    {\n      \"name\": \"Jacob Thornton\",\n      \"email\": \"jacobthornton@gmail.com\"\n    }\n  ],\n  \"support\": {\n    \"issues\": \"https://github.com/twbs/bootstrap/issues\"\n  },\n  \"license\": \"MIT\",\n  \"replace\": {\n    \"twitter/bootstrap\": \"self.version\"\n  }\n}\n"
  },
  {
    "path": "config.yml",
    "content": "title:                  \"Bootstrap\"\nbaseURL:                \"https://getbootstrap.com\"\n\ndocsDir:                \"site\"\n\nsubtitle:               \"The most popular HTML, CSS, and JS library in the world.\"\ndescription:            \"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.\"\nauthors:                \"Mark Otto, Jacob Thornton, and Bootstrap contributors\"\n\ncurrent_version:        \"5.3.8\"\ncurrent_ruby_version:   \"5.3.8\"\ndocs_version:           \"5.3\"\nrfs_version:            \"v10.0.0\"\ngithub_org:             \"https://github.com/twbs\"\nrepo:                   \"https://github.com/twbs/bootstrap\"\nx:                      \"getbootstrap\"\nopencollective:         \"https://opencollective.com/bootstrap\"\nblog:                   \"https://blog.getbootstrap.com/\"\nicons:                  \"https://icons.getbootstrap.com/\"\nswag:                   \"https://cottonbureau.com/people/bootstrap\"\n\nanalytics:\n  fathom_site:          \"ITUSEYJG\"\n\nalgolia:\n  app_id:                \"AK7KMZKZHQ\"\n  api_key:               \"3151f502c7b9e9dafd5e6372b691a24e\"\n  index_name:            \"bootstrap\"\n\ndownload:\n  source:               \"https://github.com/twbs/bootstrap/archive/v5.3.8.zip\"\n  dist:                 \"https://github.com/twbs/bootstrap/releases/download/v5.3.8/bootstrap-5.3.8-dist.zip\"\n  dist_examples:        \"https://github.com/twbs/bootstrap/releases/download/v5.3.8/bootstrap-5.3.8-examples.zip\"\n\ncdn:\n  # See https://www.srihash.org for info on how to generate the hashes\n  css:                  \"https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/css/bootstrap.min.css\"\n  css_hash:             \"sha384-sRIl4kxILFvY47J16cr9ZwB07vP4J8+LH7qKQnuqkuIAvNWLzeN8tE5YBujZqJLB\"\n  css_rtl:              \"https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/css/bootstrap.rtl.min.css\"\n  css_rtl_hash:         \"sha384-CfCrinSRH2IR6a4e6fy2q6ioOX7O6Mtm1L9vRvFZ1trBncWmMePhzvafv7oIcWiW\"\n  js:                   \"https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/js/bootstrap.min.js\"\n  js_hash:              \"sha384-G/EV+4j2dNv+tEPo3++6LCgdCROaejBqfUeNjuKAiuXbjrxilcCdDz6ZAVfHWe1Y\"\n  js_bundle:            \"https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/js/bootstrap.bundle.min.js\"\n  js_bundle_hash:       \"sha384-FKyoEForCGlyvwx9Hj09JcYn3nv7wiPVlz7YYwJrWVcXK/BmnVDxM+D2scQbITxI\"\n  popper:               \"https://cdn.jsdelivr.net/npm/@popperjs/core@2.11.8/dist/umd/popper.min.js\"\n  popper_hash:          \"sha384-I7E8VVD/ismYTF4hNIPjVp/Zjvgyol6VFvRkX/vR+Vc4jQkC+hVqc2pM8ODewa9r\"\n  popper_esm:           \"https://cdn.jsdelivr.net/npm/@popperjs/core@2.11.8/dist/esm/popper.min.js\"\n\nanchors:\n  min:                  2\n  max:                  5\n\ntoc:\n  min:                  2\n  max:                  6\n"
  },
  {
    "path": "dist/css/bootstrap-grid.css",
    "content": "/*!\n * Bootstrap Grid v5.3.8 (https://getbootstrap.com/)\n * Copyright 2011-2025 The Bootstrap Authors\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n.container,\n.container-fluid,\n.container-xxl,\n.container-xl,\n.container-lg,\n.container-md,\n.container-sm {\n  --bs-gutter-x: 1.5rem;\n  --bs-gutter-y: 0;\n  width: 100%;\n  padding-right: calc(var(--bs-gutter-x) * 0.5);\n  padding-left: calc(var(--bs-gutter-x) * 0.5);\n  margin-right: auto;\n  margin-left: auto;\n}\n\n@media (min-width: 576px) {\n  .container-sm, .container {\n    max-width: 540px;\n  }\n}\n@media (min-width: 768px) {\n  .container-md, .container-sm, .container {\n    max-width: 720px;\n  }\n}\n@media (min-width: 992px) {\n  .container-lg, .container-md, .container-sm, .container {\n    max-width: 960px;\n  }\n}\n@media (min-width: 1200px) {\n  .container-xl, .container-lg, .container-md, .container-sm, .container {\n    max-width: 1140px;\n  }\n}\n@media (min-width: 1400px) {\n  .container-xxl, .container-xl, .container-lg, .container-md, .container-sm, .container {\n    max-width: 1320px;\n  }\n}\n:root {\n  --bs-breakpoint-xs: 0;\n  --bs-breakpoint-sm: 576px;\n  --bs-breakpoint-md: 768px;\n  --bs-breakpoint-lg: 992px;\n  --bs-breakpoint-xl: 1200px;\n  --bs-breakpoint-xxl: 1400px;\n}\n\n.row {\n  --bs-gutter-x: 1.5rem;\n  --bs-gutter-y: 0;\n  display: flex;\n  flex-wrap: wrap;\n  margin-top: calc(-1 * var(--bs-gutter-y));\n  margin-right: calc(-0.5 * var(--bs-gutter-x));\n  margin-left: calc(-0.5 * var(--bs-gutter-x));\n}\n.row > * {\n  box-sizing: border-box;\n  flex-shrink: 0;\n  width: 100%;\n  max-width: 100%;\n  padding-right: calc(var(--bs-gutter-x) * 0.5);\n  padding-left: calc(var(--bs-gutter-x) * 0.5);\n  margin-top: var(--bs-gutter-y);\n}\n\n.col {\n  flex: 1 0 0;\n}\n\n.row-cols-auto > * {\n  flex: 0 0 auto;\n  width: auto;\n}\n\n.row-cols-1 > * {\n  flex: 0 0 auto;\n  width: 100%;\n}\n\n.row-cols-2 > * {\n  flex: 0 0 auto;\n  width: 50%;\n}\n\n.row-cols-3 > * {\n  flex: 0 0 auto;\n  width: 33.33333333%;\n}\n\n.row-cols-4 > * {\n  flex: 0 0 auto;\n  width: 25%;\n}\n\n.row-cols-5 > * {\n  flex: 0 0 auto;\n  width: 20%;\n}\n\n.row-cols-6 > * {\n  flex: 0 0 auto;\n  width: 16.66666667%;\n}\n\n.col-auto {\n  flex: 0 0 auto;\n  width: auto;\n}\n\n.col-1 {\n  flex: 0 0 auto;\n  width: 8.33333333%;\n}\n\n.col-2 {\n  flex: 0 0 auto;\n  width: 16.66666667%;\n}\n\n.col-3 {\n  flex: 0 0 auto;\n  width: 25%;\n}\n\n.col-4 {\n  flex: 0 0 auto;\n  width: 33.33333333%;\n}\n\n.col-5 {\n  flex: 0 0 auto;\n  width: 41.66666667%;\n}\n\n.col-6 {\n  flex: 0 0 auto;\n  width: 50%;\n}\n\n.col-7 {\n  flex: 0 0 auto;\n  width: 58.33333333%;\n}\n\n.col-8 {\n  flex: 0 0 auto;\n  width: 66.66666667%;\n}\n\n.col-9 {\n  flex: 0 0 auto;\n  width: 75%;\n}\n\n.col-10 {\n  flex: 0 0 auto;\n  width: 83.33333333%;\n}\n\n.col-11 {\n  flex: 0 0 auto;\n  width: 91.66666667%;\n}\n\n.col-12 {\n  flex: 0 0 auto;\n  width: 100%;\n}\n\n.offset-1 {\n  margin-left: 8.33333333%;\n}\n\n.offset-2 {\n  margin-left: 16.66666667%;\n}\n\n.offset-3 {\n  margin-left: 25%;\n}\n\n.offset-4 {\n  margin-left: 33.33333333%;\n}\n\n.offset-5 {\n  margin-left: 41.66666667%;\n}\n\n.offset-6 {\n  margin-left: 50%;\n}\n\n.offset-7 {\n  margin-left: 58.33333333%;\n}\n\n.offset-8 {\n  margin-left: 66.66666667%;\n}\n\n.offset-9 {\n  margin-left: 75%;\n}\n\n.offset-10 {\n  margin-left: 83.33333333%;\n}\n\n.offset-11 {\n  margin-left: 91.66666667%;\n}\n\n.g-0,\n.gx-0 {\n  --bs-gutter-x: 0;\n}\n\n.g-0,\n.gy-0 {\n  --bs-gutter-y: 0;\n}\n\n.g-1,\n.gx-1 {\n  --bs-gutter-x: 0.25rem;\n}\n\n.g-1,\n.gy-1 {\n  --bs-gutter-y: 0.25rem;\n}\n\n.g-2,\n.gx-2 {\n  --bs-gutter-x: 0.5rem;\n}\n\n.g-2,\n.gy-2 {\n  --bs-gutter-y: 0.5rem;\n}\n\n.g-3,\n.gx-3 {\n  --bs-gutter-x: 1rem;\n}\n\n.g-3,\n.gy-3 {\n  --bs-gutter-y: 1rem;\n}\n\n.g-4,\n.gx-4 {\n  --bs-gutter-x: 1.5rem;\n}\n\n.g-4,\n.gy-4 {\n  --bs-gutter-y: 1.5rem;\n}\n\n.g-5,\n.gx-5 {\n  --bs-gutter-x: 3rem;\n}\n\n.g-5,\n.gy-5 {\n  --bs-gutter-y: 3rem;\n}\n\n@media (min-width: 576px) {\n  .col-sm {\n    flex: 1 0 0;\n  }\n  .row-cols-sm-auto > * {\n    flex: 0 0 auto;\n    width: auto;\n  }\n  .row-cols-sm-1 > * {\n    flex: 0 0 auto;\n    width: 100%;\n  }\n  .row-cols-sm-2 > * {\n    flex: 0 0 auto;\n    width: 50%;\n  }\n  .row-cols-sm-3 > * {\n    flex: 0 0 auto;\n    width: 33.33333333%;\n  }\n  .row-cols-sm-4 > * {\n    flex: 0 0 auto;\n    width: 25%;\n  }\n  .row-cols-sm-5 > * {\n    flex: 0 0 auto;\n    width: 20%;\n  }\n  .row-cols-sm-6 > * {\n    flex: 0 0 auto;\n    width: 16.66666667%;\n  }\n  .col-sm-auto {\n    flex: 0 0 auto;\n    width: auto;\n  }\n  .col-sm-1 {\n    flex: 0 0 auto;\n    width: 8.33333333%;\n  }\n  .col-sm-2 {\n    flex: 0 0 auto;\n    width: 16.66666667%;\n  }\n  .col-sm-3 {\n    flex: 0 0 auto;\n    width: 25%;\n  }\n  .col-sm-4 {\n    flex: 0 0 auto;\n    width: 33.33333333%;\n  }\n  .col-sm-5 {\n    flex: 0 0 auto;\n    width: 41.66666667%;\n  }\n  .col-sm-6 {\n    flex: 0 0 auto;\n    width: 50%;\n  }\n  .col-sm-7 {\n    flex: 0 0 auto;\n    width: 58.33333333%;\n  }\n  .col-sm-8 {\n    flex: 0 0 auto;\n    width: 66.66666667%;\n  }\n  .col-sm-9 {\n    flex: 0 0 auto;\n    width: 75%;\n  }\n  .col-sm-10 {\n    flex: 0 0 auto;\n    width: 83.33333333%;\n  }\n  .col-sm-11 {\n    flex: 0 0 auto;\n    width: 91.66666667%;\n  }\n  .col-sm-12 {\n    flex: 0 0 auto;\n    width: 100%;\n  }\n  .offset-sm-0 {\n    margin-left: 0;\n  }\n  .offset-sm-1 {\n    margin-left: 8.33333333%;\n  }\n  .offset-sm-2 {\n    margin-left: 16.66666667%;\n  }\n  .offset-sm-3 {\n    margin-left: 25%;\n  }\n  .offset-sm-4 {\n    margin-left: 33.33333333%;\n  }\n  .offset-sm-5 {\n    margin-left: 41.66666667%;\n  }\n  .offset-sm-6 {\n    margin-left: 50%;\n  }\n  .offset-sm-7 {\n    margin-left: 58.33333333%;\n  }\n  .offset-sm-8 {\n    margin-left: 66.66666667%;\n  }\n  .offset-sm-9 {\n    margin-left: 75%;\n  }\n  .offset-sm-10 {\n    margin-left: 83.33333333%;\n  }\n  .offset-sm-11 {\n    margin-left: 91.66666667%;\n  }\n  .g-sm-0,\n  .gx-sm-0 {\n    --bs-gutter-x: 0;\n  }\n  .g-sm-0,\n  .gy-sm-0 {\n    --bs-gutter-y: 0;\n  }\n  .g-sm-1,\n  .gx-sm-1 {\n    --bs-gutter-x: 0.25rem;\n  }\n  .g-sm-1,\n  .gy-sm-1 {\n    --bs-gutter-y: 0.25rem;\n  }\n  .g-sm-2,\n  .gx-sm-2 {\n    --bs-gutter-x: 0.5rem;\n  }\n  .g-sm-2,\n  .gy-sm-2 {\n    --bs-gutter-y: 0.5rem;\n  }\n  .g-sm-3,\n  .gx-sm-3 {\n    --bs-gutter-x: 1rem;\n  }\n  .g-sm-3,\n  .gy-sm-3 {\n    --bs-gutter-y: 1rem;\n  }\n  .g-sm-4,\n  .gx-sm-4 {\n    --bs-gutter-x: 1.5rem;\n  }\n  .g-sm-4,\n  .gy-sm-4 {\n    --bs-gutter-y: 1.5rem;\n  }\n  .g-sm-5,\n  .gx-sm-5 {\n    --bs-gutter-x: 3rem;\n  }\n  .g-sm-5,\n  .gy-sm-5 {\n    --bs-gutter-y: 3rem;\n  }\n}\n@media (min-width: 768px) {\n  .col-md {\n    flex: 1 0 0;\n  }\n  .row-cols-md-auto > * {\n    flex: 0 0 auto;\n    width: auto;\n  }\n  .row-cols-md-1 > * {\n    flex: 0 0 auto;\n    width: 100%;\n  }\n  .row-cols-md-2 > * {\n    flex: 0 0 auto;\n    width: 50%;\n  }\n  .row-cols-md-3 > * {\n    flex: 0 0 auto;\n    width: 33.33333333%;\n  }\n  .row-cols-md-4 > * {\n    flex: 0 0 auto;\n    width: 25%;\n  }\n  .row-cols-md-5 > * {\n    flex: 0 0 auto;\n    width: 20%;\n  }\n  .row-cols-md-6 > * {\n    flex: 0 0 auto;\n    width: 16.66666667%;\n  }\n  .col-md-auto {\n    flex: 0 0 auto;\n    width: auto;\n  }\n  .col-md-1 {\n    flex: 0 0 auto;\n    width: 8.33333333%;\n  }\n  .col-md-2 {\n    flex: 0 0 auto;\n    width: 16.66666667%;\n  }\n  .col-md-3 {\n    flex: 0 0 auto;\n    width: 25%;\n  }\n  .col-md-4 {\n    flex: 0 0 auto;\n    width: 33.33333333%;\n  }\n  .col-md-5 {\n    flex: 0 0 auto;\n    width: 41.66666667%;\n  }\n  .col-md-6 {\n    flex: 0 0 auto;\n    width: 50%;\n  }\n  .col-md-7 {\n    flex: 0 0 auto;\n    width: 58.33333333%;\n  }\n  .col-md-8 {\n    flex: 0 0 auto;\n    width: 66.66666667%;\n  }\n  .col-md-9 {\n    flex: 0 0 auto;\n    width: 75%;\n  }\n  .col-md-10 {\n    flex: 0 0 auto;\n    width: 83.33333333%;\n  }\n  .col-md-11 {\n    flex: 0 0 auto;\n    width: 91.66666667%;\n  }\n  .col-md-12 {\n    flex: 0 0 auto;\n    width: 100%;\n  }\n  .offset-md-0 {\n    margin-left: 0;\n  }\n  .offset-md-1 {\n    margin-left: 8.33333333%;\n  }\n  .offset-md-2 {\n    margin-left: 16.66666667%;\n  }\n  .offset-md-3 {\n    margin-left: 25%;\n  }\n  .offset-md-4 {\n    margin-left: 33.33333333%;\n  }\n  .offset-md-5 {\n    margin-left: 41.66666667%;\n  }\n  .offset-md-6 {\n    margin-left: 50%;\n  }\n  .offset-md-7 {\n    margin-left: 58.33333333%;\n  }\n  .offset-md-8 {\n    margin-left: 66.66666667%;\n  }\n  .offset-md-9 {\n    margin-left: 75%;\n  }\n  .offset-md-10 {\n    margin-left: 83.33333333%;\n  }\n  .offset-md-11 {\n    margin-left: 91.66666667%;\n  }\n  .g-md-0,\n  .gx-md-0 {\n    --bs-gutter-x: 0;\n  }\n  .g-md-0,\n  .gy-md-0 {\n    --bs-gutter-y: 0;\n  }\n  .g-md-1,\n  .gx-md-1 {\n    --bs-gutter-x: 0.25rem;\n  }\n  .g-md-1,\n  .gy-md-1 {\n    --bs-gutter-y: 0.25rem;\n  }\n  .g-md-2,\n  .gx-md-2 {\n    --bs-gutter-x: 0.5rem;\n  }\n  .g-md-2,\n  .gy-md-2 {\n    --bs-gutter-y: 0.5rem;\n  }\n  .g-md-3,\n  .gx-md-3 {\n    --bs-gutter-x: 1rem;\n  }\n  .g-md-3,\n  .gy-md-3 {\n    --bs-gutter-y: 1rem;\n  }\n  .g-md-4,\n  .gx-md-4 {\n    --bs-gutter-x: 1.5rem;\n  }\n  .g-md-4,\n  .gy-md-4 {\n    --bs-gutter-y: 1.5rem;\n  }\n  .g-md-5,\n  .gx-md-5 {\n    --bs-gutter-x: 3rem;\n  }\n  .g-md-5,\n  .gy-md-5 {\n    --bs-gutter-y: 3rem;\n  }\n}\n@media (min-width: 992px) {\n  .col-lg {\n    flex: 1 0 0;\n  }\n  .row-cols-lg-auto > * {\n    flex: 0 0 auto;\n    width: auto;\n  }\n  .row-cols-lg-1 > * {\n    flex: 0 0 auto;\n    width: 100%;\n  }\n  .row-cols-lg-2 > * {\n    flex: 0 0 auto;\n    width: 50%;\n  }\n  .row-cols-lg-3 > * {\n    flex: 0 0 auto;\n    width: 33.33333333%;\n  }\n  .row-cols-lg-4 > * {\n    flex: 0 0 auto;\n    width: 25%;\n  }\n  .row-cols-lg-5 > * {\n    flex: 0 0 auto;\n    width: 20%;\n  }\n  .row-cols-lg-6 > * {\n    flex: 0 0 auto;\n    width: 16.66666667%;\n  }\n  .col-lg-auto {\n    flex: 0 0 auto;\n    width: auto;\n  }\n  .col-lg-1 {\n    flex: 0 0 auto;\n    width: 8.33333333%;\n  }\n  .col-lg-2 {\n    flex: 0 0 auto;\n    width: 16.66666667%;\n  }\n  .col-lg-3 {\n    flex: 0 0 auto;\n    width: 25%;\n  }\n  .col-lg-4 {\n    flex: 0 0 auto;\n    width: 33.33333333%;\n  }\n  .col-lg-5 {\n    flex: 0 0 auto;\n    width: 41.66666667%;\n  }\n  .col-lg-6 {\n    flex: 0 0 auto;\n    width: 50%;\n  }\n  .col-lg-7 {\n    flex: 0 0 auto;\n    width: 58.33333333%;\n  }\n  .col-lg-8 {\n    flex: 0 0 auto;\n    width: 66.66666667%;\n  }\n  .col-lg-9 {\n    flex: 0 0 auto;\n    width: 75%;\n  }\n  .col-lg-10 {\n    flex: 0 0 auto;\n    width: 83.33333333%;\n  }\n  .col-lg-11 {\n    flex: 0 0 auto;\n    width: 91.66666667%;\n  }\n  .col-lg-12 {\n    flex: 0 0 auto;\n    width: 100%;\n  }\n  .offset-lg-0 {\n    margin-left: 0;\n  }\n  .offset-lg-1 {\n    margin-left: 8.33333333%;\n  }\n  .offset-lg-2 {\n    margin-left: 16.66666667%;\n  }\n  .offset-lg-3 {\n    margin-left: 25%;\n  }\n  .offset-lg-4 {\n    margin-left: 33.33333333%;\n  }\n  .offset-lg-5 {\n    margin-left: 41.66666667%;\n  }\n  .offset-lg-6 {\n    margin-left: 50%;\n  }\n  .offset-lg-7 {\n    margin-left: 58.33333333%;\n  }\n  .offset-lg-8 {\n    margin-left: 66.66666667%;\n  }\n  .offset-lg-9 {\n    margin-left: 75%;\n  }\n  .offset-lg-10 {\n    margin-left: 83.33333333%;\n  }\n  .offset-lg-11 {\n    margin-left: 91.66666667%;\n  }\n  .g-lg-0,\n  .gx-lg-0 {\n    --bs-gutter-x: 0;\n  }\n  .g-lg-0,\n  .gy-lg-0 {\n    --bs-gutter-y: 0;\n  }\n  .g-lg-1,\n  .gx-lg-1 {\n    --bs-gutter-x: 0.25rem;\n  }\n  .g-lg-1,\n  .gy-lg-1 {\n    --bs-gutter-y: 0.25rem;\n  }\n  .g-lg-2,\n  .gx-lg-2 {\n    --bs-gutter-x: 0.5rem;\n  }\n  .g-lg-2,\n  .gy-lg-2 {\n    --bs-gutter-y: 0.5rem;\n  }\n  .g-lg-3,\n  .gx-lg-3 {\n    --bs-gutter-x: 1rem;\n  }\n  .g-lg-3,\n  .gy-lg-3 {\n    --bs-gutter-y: 1rem;\n  }\n  .g-lg-4,\n  .gx-lg-4 {\n    --bs-gutter-x: 1.5rem;\n  }\n  .g-lg-4,\n  .gy-lg-4 {\n    --bs-gutter-y: 1.5rem;\n  }\n  .g-lg-5,\n  .gx-lg-5 {\n    --bs-gutter-x: 3rem;\n  }\n  .g-lg-5,\n  .gy-lg-5 {\n    --bs-gutter-y: 3rem;\n  }\n}\n@media (min-width: 1200px) {\n  .col-xl {\n    flex: 1 0 0;\n  }\n  .row-cols-xl-auto > * {\n    flex: 0 0 auto;\n    width: auto;\n  }\n  .row-cols-xl-1 > * {\n    flex: 0 0 auto;\n    width: 100%;\n  }\n  .row-cols-xl-2 > * {\n    flex: 0 0 auto;\n    width: 50%;\n  }\n  .row-cols-xl-3 > * {\n    flex: 0 0 auto;\n    width: 33.33333333%;\n  }\n  .row-cols-xl-4 > * {\n    flex: 0 0 auto;\n    width: 25%;\n  }\n  .row-cols-xl-5 > * {\n    flex: 0 0 auto;\n    width: 20%;\n  }\n  .row-cols-xl-6 > * {\n    flex: 0 0 auto;\n    width: 16.66666667%;\n  }\n  .col-xl-auto {\n    flex: 0 0 auto;\n    width: auto;\n  }\n  .col-xl-1 {\n    flex: 0 0 auto;\n    width: 8.33333333%;\n  }\n  .col-xl-2 {\n    flex: 0 0 auto;\n    width: 16.66666667%;\n  }\n  .col-xl-3 {\n    flex: 0 0 auto;\n    width: 25%;\n  }\n  .col-xl-4 {\n    flex: 0 0 auto;\n    width: 33.33333333%;\n  }\n  .col-xl-5 {\n    flex: 0 0 auto;\n    width: 41.66666667%;\n  }\n  .col-xl-6 {\n    flex: 0 0 auto;\n    width: 50%;\n  }\n  .col-xl-7 {\n    flex: 0 0 auto;\n    width: 58.33333333%;\n  }\n  .col-xl-8 {\n    flex: 0 0 auto;\n    width: 66.66666667%;\n  }\n  .col-xl-9 {\n    flex: 0 0 auto;\n    width: 75%;\n  }\n  .col-xl-10 {\n    flex: 0 0 auto;\n    width: 83.33333333%;\n  }\n  .col-xl-11 {\n    flex: 0 0 auto;\n    width: 91.66666667%;\n  }\n  .col-xl-12 {\n    flex: 0 0 auto;\n    width: 100%;\n  }\n  .offset-xl-0 {\n    margin-left: 0;\n  }\n  .offset-xl-1 {\n    margin-left: 8.33333333%;\n  }\n  .offset-xl-2 {\n    margin-left: 16.66666667%;\n  }\n  .offset-xl-3 {\n    margin-left: 25%;\n  }\n  .offset-xl-4 {\n    margin-left: 33.33333333%;\n  }\n  .offset-xl-5 {\n    margin-left: 41.66666667%;\n  }\n  .offset-xl-6 {\n    margin-left: 50%;\n  }\n  .offset-xl-7 {\n    margin-left: 58.33333333%;\n  }\n  .offset-xl-8 {\n    margin-left: 66.66666667%;\n  }\n  .offset-xl-9 {\n    margin-left: 75%;\n  }\n  .offset-xl-10 {\n    margin-left: 83.33333333%;\n  }\n  .offset-xl-11 {\n    margin-left: 91.66666667%;\n  }\n  .g-xl-0,\n  .gx-xl-0 {\n    --bs-gutter-x: 0;\n  }\n  .g-xl-0,\n  .gy-xl-0 {\n    --bs-gutter-y: 0;\n  }\n  .g-xl-1,\n  .gx-xl-1 {\n    --bs-gutter-x: 0.25rem;\n  }\n  .g-xl-1,\n  .gy-xl-1 {\n    --bs-gutter-y: 0.25rem;\n  }\n  .g-xl-2,\n  .gx-xl-2 {\n    --bs-gutter-x: 0.5rem;\n  }\n  .g-xl-2,\n  .gy-xl-2 {\n    --bs-gutter-y: 0.5rem;\n  }\n  .g-xl-3,\n  .gx-xl-3 {\n    --bs-gutter-x: 1rem;\n  }\n  .g-xl-3,\n  .gy-xl-3 {\n    --bs-gutter-y: 1rem;\n  }\n  .g-xl-4,\n  .gx-xl-4 {\n    --bs-gutter-x: 1.5rem;\n  }\n  .g-xl-4,\n  .gy-xl-4 {\n    --bs-gutter-y: 1.5rem;\n  }\n  .g-xl-5,\n  .gx-xl-5 {\n    --bs-gutter-x: 3rem;\n  }\n  .g-xl-5,\n  .gy-xl-5 {\n    --bs-gutter-y: 3rem;\n  }\n}\n@media (min-width: 1400px) {\n  .col-xxl {\n    flex: 1 0 0;\n  }\n  .row-cols-xxl-auto > * {\n    flex: 0 0 auto;\n    width: auto;\n  }\n  .row-cols-xxl-1 > * {\n    flex: 0 0 auto;\n    width: 100%;\n  }\n  .row-cols-xxl-2 > * {\n    flex: 0 0 auto;\n    width: 50%;\n  }\n  .row-cols-xxl-3 > * {\n    flex: 0 0 auto;\n    width: 33.33333333%;\n  }\n  .row-cols-xxl-4 > * {\n    flex: 0 0 auto;\n    width: 25%;\n  }\n  .row-cols-xxl-5 > * {\n    flex: 0 0 auto;\n    width: 20%;\n  }\n  .row-cols-xxl-6 > * {\n    flex: 0 0 auto;\n    width: 16.66666667%;\n  }\n  .col-xxl-auto {\n    flex: 0 0 auto;\n    width: auto;\n  }\n  .col-xxl-1 {\n    flex: 0 0 auto;\n    width: 8.33333333%;\n  }\n  .col-xxl-2 {\n    flex: 0 0 auto;\n    width: 16.66666667%;\n  }\n  .col-xxl-3 {\n    flex: 0 0 auto;\n    width: 25%;\n  }\n  .col-xxl-4 {\n    flex: 0 0 auto;\n    width: 33.33333333%;\n  }\n  .col-xxl-5 {\n    flex: 0 0 auto;\n    width: 41.66666667%;\n  }\n  .col-xxl-6 {\n    flex: 0 0 auto;\n    width: 50%;\n  }\n  .col-xxl-7 {\n    flex: 0 0 auto;\n    width: 58.33333333%;\n  }\n  .col-xxl-8 {\n    flex: 0 0 auto;\n    width: 66.66666667%;\n  }\n  .col-xxl-9 {\n    flex: 0 0 auto;\n    width: 75%;\n  }\n  .col-xxl-10 {\n    flex: 0 0 auto;\n    width: 83.33333333%;\n  }\n  .col-xxl-11 {\n    flex: 0 0 auto;\n    width: 91.66666667%;\n  }\n  .col-xxl-12 {\n    flex: 0 0 auto;\n    width: 100%;\n  }\n  .offset-xxl-0 {\n    margin-left: 0;\n  }\n  .offset-xxl-1 {\n    margin-left: 8.33333333%;\n  }\n  .offset-xxl-2 {\n    margin-left: 16.66666667%;\n  }\n  .offset-xxl-3 {\n    margin-left: 25%;\n  }\n  .offset-xxl-4 {\n    margin-left: 33.33333333%;\n  }\n  .offset-xxl-5 {\n    margin-left: 41.66666667%;\n  }\n  .offset-xxl-6 {\n    margin-left: 50%;\n  }\n  .offset-xxl-7 {\n    margin-left: 58.33333333%;\n  }\n  .offset-xxl-8 {\n    margin-left: 66.66666667%;\n  }\n  .offset-xxl-9 {\n    margin-left: 75%;\n  }\n  .offset-xxl-10 {\n    margin-left: 83.33333333%;\n  }\n  .offset-xxl-11 {\n    margin-left: 91.66666667%;\n  }\n  .g-xxl-0,\n  .gx-xxl-0 {\n    --bs-gutter-x: 0;\n  }\n  .g-xxl-0,\n  .gy-xxl-0 {\n    --bs-gutter-y: 0;\n  }\n  .g-xxl-1,\n  .gx-xxl-1 {\n    --bs-gutter-x: 0.25rem;\n  }\n  .g-xxl-1,\n  .gy-xxl-1 {\n    --bs-gutter-y: 0.25rem;\n  }\n  .g-xxl-2,\n  .gx-xxl-2 {\n    --bs-gutter-x: 0.5rem;\n  }\n  .g-xxl-2,\n  .gy-xxl-2 {\n    --bs-gutter-y: 0.5rem;\n  }\n  .g-xxl-3,\n  .gx-xxl-3 {\n    --bs-gutter-x: 1rem;\n  }\n  .g-xxl-3,\n  .gy-xxl-3 {\n    --bs-gutter-y: 1rem;\n  }\n  .g-xxl-4,\n  .gx-xxl-4 {\n    --bs-gutter-x: 1.5rem;\n  }\n  .g-xxl-4,\n  .gy-xxl-4 {\n    --bs-gutter-y: 1.5rem;\n  }\n  .g-xxl-5,\n  .gx-xxl-5 {\n    --bs-gutter-x: 3rem;\n  }\n  .g-xxl-5,\n  .gy-xxl-5 {\n    --bs-gutter-y: 3rem;\n  }\n}\n.d-inline {\n  display: inline !important;\n}\n\n.d-inline-block {\n  display: inline-block !important;\n}\n\n.d-block {\n  display: block !important;\n}\n\n.d-grid {\n  display: grid !important;\n}\n\n.d-inline-grid {\n  display: inline-grid !important;\n}\n\n.d-table {\n  display: table !important;\n}\n\n.d-table-row {\n  display: table-row !important;\n}\n\n.d-table-cell {\n  display: table-cell !important;\n}\n\n.d-flex {\n  display: flex !important;\n}\n\n.d-inline-flex {\n  display: inline-flex !important;\n}\n\n.d-none {\n  display: none !important;\n}\n\n.flex-fill {\n  flex: 1 1 auto !important;\n}\n\n.flex-row {\n  flex-direction: row !important;\n}\n\n.flex-column {\n  flex-direction: column !important;\n}\n\n.flex-row-reverse {\n  flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n  flex-direction: column-reverse !important;\n}\n\n.flex-grow-0 {\n  flex-grow: 0 !important;\n}\n\n.flex-grow-1 {\n  flex-grow: 1 !important;\n}\n\n.flex-shrink-0 {\n  flex-shrink: 0 !important;\n}\n\n.flex-shrink-1 {\n  flex-shrink: 1 !important;\n}\n\n.flex-wrap {\n  flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n  flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n  flex-wrap: wrap-reverse !important;\n}\n\n.justify-content-start {\n  justify-content: flex-start !important;\n}\n\n.justify-content-end {\n  justify-content: flex-end !important;\n}\n\n.justify-content-center {\n  justify-content: center !important;\n}\n\n.justify-content-between {\n  justify-content: space-between !important;\n}\n\n.justify-content-around {\n  justify-content: space-around !important;\n}\n\n.justify-content-evenly {\n  justify-content: space-evenly !important;\n}\n\n.align-items-start {\n  align-items: flex-start !important;\n}\n\n.align-items-end {\n  align-items: flex-end !important;\n}\n\n.align-items-center {\n  align-items: center !important;\n}\n\n.align-items-baseline {\n  align-items: baseline !important;\n}\n\n.align-items-stretch {\n  align-items: stretch !important;\n}\n\n.align-content-start {\n  align-content: flex-start !important;\n}\n\n.align-content-end {\n  align-content: flex-end !important;\n}\n\n.align-content-center {\n  align-content: center !important;\n}\n\n.align-content-between {\n  align-content: space-between !important;\n}\n\n.align-content-around {\n  align-content: space-around !important;\n}\n\n.align-content-stretch {\n  align-content: stretch !important;\n}\n\n.align-self-auto {\n  align-self: auto !important;\n}\n\n.align-self-start {\n  align-self: flex-start !important;\n}\n\n.align-self-end {\n  align-self: flex-end !important;\n}\n\n.align-self-center {\n  align-self: center !important;\n}\n\n.align-self-baseline {\n  align-self: baseline !important;\n}\n\n.align-self-stretch {\n  align-self: stretch !important;\n}\n\n.order-first {\n  order: -1 !important;\n}\n\n.order-0 {\n  order: 0 !important;\n}\n\n.order-1 {\n  order: 1 !important;\n}\n\n.order-2 {\n  order: 2 !important;\n}\n\n.order-3 {\n  order: 3 !important;\n}\n\n.order-4 {\n  order: 4 !important;\n}\n\n.order-5 {\n  order: 5 !important;\n}\n\n.order-last {\n  order: 6 !important;\n}\n\n.m-0 {\n  margin: 0 !important;\n}\n\n.m-1 {\n  margin: 0.25rem !important;\n}\n\n.m-2 {\n  margin: 0.5rem !important;\n}\n\n.m-3 {\n  margin: 1rem !important;\n}\n\n.m-4 {\n  margin: 1.5rem !important;\n}\n\n.m-5 {\n  margin: 3rem !important;\n}\n\n.m-auto {\n  margin: auto !important;\n}\n\n.mx-0 {\n  margin-right: 0 !important;\n  margin-left: 0 !important;\n}\n\n.mx-1 {\n  margin-right: 0.25rem !important;\n  margin-left: 0.25rem !important;\n}\n\n.mx-2 {\n  margin-right: 0.5rem !important;\n  margin-left: 0.5rem !important;\n}\n\n.mx-3 {\n  margin-right: 1rem !important;\n  margin-left: 1rem !important;\n}\n\n.mx-4 {\n  margin-right: 1.5rem !important;\n  margin-left: 1.5rem !important;\n}\n\n.mx-5 {\n  margin-right: 3rem !important;\n  margin-left: 3rem !important;\n}\n\n.mx-auto {\n  margin-right: auto !important;\n  margin-left: auto !important;\n}\n\n.my-0 {\n  margin-top: 0 !important;\n  margin-bottom: 0 !important;\n}\n\n.my-1 {\n  margin-top: 0.25rem !important;\n  margin-bottom: 0.25rem !important;\n}\n\n.my-2 {\n  margin-top: 0.5rem !important;\n  margin-bottom: 0.5rem !important;\n}\n\n.my-3 {\n  margin-top: 1rem !important;\n  margin-bottom: 1rem !important;\n}\n\n.my-4 {\n  margin-top: 1.5rem !important;\n  margin-bottom: 1.5rem !important;\n}\n\n.my-5 {\n  margin-top: 3rem !important;\n  margin-bottom: 3rem !important;\n}\n\n.my-auto {\n  margin-top: auto !important;\n  margin-bottom: auto !important;\n}\n\n.mt-0 {\n  margin-top: 0 !important;\n}\n\n.mt-1 {\n  margin-top: 0.25rem !important;\n}\n\n.mt-2 {\n  margin-top: 0.5rem !important;\n}\n\n.mt-3 {\n  margin-top: 1rem !important;\n}\n\n.mt-4 {\n  margin-top: 1.5rem !important;\n}\n\n.mt-5 {\n  margin-top: 3rem !important;\n}\n\n.mt-auto {\n  margin-top: auto !important;\n}\n\n.me-0 {\n  margin-right: 0 !important;\n}\n\n.me-1 {\n  margin-right: 0.25rem !important;\n}\n\n.me-2 {\n  margin-right: 0.5rem !important;\n}\n\n.me-3 {\n  margin-right: 1rem !important;\n}\n\n.me-4 {\n  margin-right: 1.5rem !important;\n}\n\n.me-5 {\n  margin-right: 3rem !important;\n}\n\n.me-auto {\n  margin-right: auto !important;\n}\n\n.mb-0 {\n  margin-bottom: 0 !important;\n}\n\n.mb-1 {\n  margin-bottom: 0.25rem !important;\n}\n\n.mb-2 {\n  margin-bottom: 0.5rem !important;\n}\n\n.mb-3 {\n  margin-bottom: 1rem !important;\n}\n\n.mb-4 {\n  margin-bottom: 1.5rem !important;\n}\n\n.mb-5 {\n  margin-bottom: 3rem !important;\n}\n\n.mb-auto {\n  margin-bottom: auto !important;\n}\n\n.ms-0 {\n  margin-left: 0 !important;\n}\n\n.ms-1 {\n  margin-left: 0.25rem !important;\n}\n\n.ms-2 {\n  margin-left: 0.5rem !important;\n}\n\n.ms-3 {\n  margin-left: 1rem !important;\n}\n\n.ms-4 {\n  margin-left: 1.5rem !important;\n}\n\n.ms-5 {\n  margin-left: 3rem !important;\n}\n\n.ms-auto {\n  margin-left: auto !important;\n}\n\n.p-0 {\n  padding: 0 !important;\n}\n\n.p-1 {\n  padding: 0.25rem !important;\n}\n\n.p-2 {\n  padding: 0.5rem !important;\n}\n\n.p-3 {\n  padding: 1rem !important;\n}\n\n.p-4 {\n  padding: 1.5rem !important;\n}\n\n.p-5 {\n  padding: 3rem !important;\n}\n\n.px-0 {\n  padding-right: 0 !important;\n  padding-left: 0 !important;\n}\n\n.px-1 {\n  padding-right: 0.25rem !important;\n  padding-left: 0.25rem !important;\n}\n\n.px-2 {\n  padding-right: 0.5rem !important;\n  padding-left: 0.5rem !important;\n}\n\n.px-3 {\n  padding-right: 1rem !important;\n  padding-left: 1rem !important;\n}\n\n.px-4 {\n  padding-right: 1.5rem !important;\n  padding-left: 1.5rem !important;\n}\n\n.px-5 {\n  padding-right: 3rem !important;\n  padding-left: 3rem !important;\n}\n\n.py-0 {\n  padding-top: 0 !important;\n  padding-bottom: 0 !important;\n}\n\n.py-1 {\n  padding-top: 0.25rem !important;\n  padding-bottom: 0.25rem !important;\n}\n\n.py-2 {\n  padding-top: 0.5rem !important;\n  padding-bottom: 0.5rem !important;\n}\n\n.py-3 {\n  padding-top: 1rem !important;\n  padding-bottom: 1rem !important;\n}\n\n.py-4 {\n  padding-top: 1.5rem !important;\n  padding-bottom: 1.5rem !important;\n}\n\n.py-5 {\n  padding-top: 3rem !important;\n  padding-bottom: 3rem !important;\n}\n\n.pt-0 {\n  padding-top: 0 !important;\n}\n\n.pt-1 {\n  padding-top: 0.25rem !important;\n}\n\n.pt-2 {\n  padding-top: 0.5rem !important;\n}\n\n.pt-3 {\n  padding-top: 1rem !important;\n}\n\n.pt-4 {\n  padding-top: 1.5rem !important;\n}\n\n.pt-5 {\n  padding-top: 3rem !important;\n}\n\n.pe-0 {\n  padding-right: 0 !important;\n}\n\n.pe-1 {\n  padding-right: 0.25rem !important;\n}\n\n.pe-2 {\n  padding-right: 0.5rem !important;\n}\n\n.pe-3 {\n  padding-right: 1rem !important;\n}\n\n.pe-4 {\n  padding-right: 1.5rem !important;\n}\n\n.pe-5 {\n  padding-right: 3rem !important;\n}\n\n.pb-0 {\n  padding-bottom: 0 !important;\n}\n\n.pb-1 {\n  padding-bottom: 0.25rem !important;\n}\n\n.pb-2 {\n  padding-bottom: 0.5rem !important;\n}\n\n.pb-3 {\n  padding-bottom: 1rem !important;\n}\n\n.pb-4 {\n  padding-bottom: 1.5rem !important;\n}\n\n.pb-5 {\n  padding-bottom: 3rem !important;\n}\n\n.ps-0 {\n  padding-left: 0 !important;\n}\n\n.ps-1 {\n  padding-left: 0.25rem !important;\n}\n\n.ps-2 {\n  padding-left: 0.5rem !important;\n}\n\n.ps-3 {\n  padding-left: 1rem !important;\n}\n\n.ps-4 {\n  padding-left: 1.5rem !important;\n}\n\n.ps-5 {\n  padding-left: 3rem !important;\n}\n\n@media (min-width: 576px) {\n  .d-sm-inline {\n    display: inline !important;\n  }\n  .d-sm-inline-block {\n    display: inline-block !important;\n  }\n  .d-sm-block {\n    display: block !important;\n  }\n  .d-sm-grid {\n    display: grid !important;\n  }\n  .d-sm-inline-grid {\n    display: inline-grid !important;\n  }\n  .d-sm-table {\n    display: table !important;\n  }\n  .d-sm-table-row {\n    display: table-row !important;\n  }\n  .d-sm-table-cell {\n    display: table-cell !important;\n  }\n  .d-sm-flex {\n    display: flex !important;\n  }\n  .d-sm-inline-flex {\n    display: inline-flex !important;\n  }\n  .d-sm-none {\n    display: none !important;\n  }\n  .flex-sm-fill {\n    flex: 1 1 auto !important;\n  }\n  .flex-sm-row {\n    flex-direction: row !important;\n  }\n  .flex-sm-column {\n    flex-direction: column !important;\n  }\n  .flex-sm-row-reverse {\n    flex-direction: row-reverse !important;\n  }\n  .flex-sm-column-reverse {\n    flex-direction: column-reverse !important;\n  }\n  .flex-sm-grow-0 {\n    flex-grow: 0 !important;\n  }\n  .flex-sm-grow-1 {\n    flex-grow: 1 !important;\n  }\n  .flex-sm-shrink-0 {\n    flex-shrink: 0 !important;\n  }\n  .flex-sm-shrink-1 {\n    flex-shrink: 1 !important;\n  }\n  .flex-sm-wrap {\n    flex-wrap: wrap !important;\n  }\n  .flex-sm-nowrap {\n    flex-wrap: nowrap !important;\n  }\n  .flex-sm-wrap-reverse {\n    flex-wrap: wrap-reverse !important;\n  }\n  .justify-content-sm-start {\n    justify-content: flex-start !important;\n  }\n  .justify-content-sm-end {\n    justify-content: flex-end !important;\n  }\n  .justify-content-sm-center {\n    justify-content: center !important;\n  }\n  .justify-content-sm-between {\n    justify-content: space-between !important;\n  }\n  .justify-content-sm-around {\n    justify-content: space-around !important;\n  }\n  .justify-content-sm-evenly {\n    justify-content: space-evenly !important;\n  }\n  .align-items-sm-start {\n    align-items: flex-start !important;\n  }\n  .align-items-sm-end {\n    align-items: flex-end !important;\n  }\n  .align-items-sm-center {\n    align-items: center !important;\n  }\n  .align-items-sm-baseline {\n    align-items: baseline !important;\n  }\n  .align-items-sm-stretch {\n    align-items: stretch !important;\n  }\n  .align-content-sm-start {\n    align-content: flex-start !important;\n  }\n  .align-content-sm-end {\n    align-content: flex-end !important;\n  }\n  .align-content-sm-center {\n    align-content: center !important;\n  }\n  .align-content-sm-between {\n    align-content: space-between !important;\n  }\n  .align-content-sm-around {\n    align-content: space-around !important;\n  }\n  .align-content-sm-stretch {\n    align-content: stretch !important;\n  }\n  .align-self-sm-auto {\n    align-self: auto !important;\n  }\n  .align-self-sm-start {\n    align-self: flex-start !important;\n  }\n  .align-self-sm-end {\n    align-self: flex-end !important;\n  }\n  .align-self-sm-center {\n    align-self: center !important;\n  }\n  .align-self-sm-baseline {\n    align-self: baseline !important;\n  }\n  .align-self-sm-stretch {\n    align-self: stretch !important;\n  }\n  .order-sm-first {\n    order: -1 !important;\n  }\n  .order-sm-0 {\n    order: 0 !important;\n  }\n  .order-sm-1 {\n    order: 1 !important;\n  }\n  .order-sm-2 {\n    order: 2 !important;\n  }\n  .order-sm-3 {\n    order: 3 !important;\n  }\n  .order-sm-4 {\n    order: 4 !important;\n  }\n  .order-sm-5 {\n    order: 5 !important;\n  }\n  .order-sm-last {\n    order: 6 !important;\n  }\n  .m-sm-0 {\n    margin: 0 !important;\n  }\n  .m-sm-1 {\n    margin: 0.25rem !important;\n  }\n  .m-sm-2 {\n    margin: 0.5rem !important;\n  }\n  .m-sm-3 {\n    margin: 1rem !important;\n  }\n  .m-sm-4 {\n    margin: 1.5rem !important;\n  }\n  .m-sm-5 {\n    margin: 3rem !important;\n  }\n  .m-sm-auto {\n    margin: auto !important;\n  }\n  .mx-sm-0 {\n    margin-right: 0 !important;\n    margin-left: 0 !important;\n  }\n  .mx-sm-1 {\n    margin-right: 0.25rem !important;\n    margin-left: 0.25rem !important;\n  }\n  .mx-sm-2 {\n    margin-right: 0.5rem !important;\n    margin-left: 0.5rem !important;\n  }\n  .mx-sm-3 {\n    margin-right: 1rem !important;\n    margin-left: 1rem !important;\n  }\n  .mx-sm-4 {\n    margin-right: 1.5rem !important;\n    margin-left: 1.5rem !important;\n  }\n  .mx-sm-5 {\n    margin-right: 3rem !important;\n    margin-left: 3rem !important;\n  }\n  .mx-sm-auto {\n    margin-right: auto !important;\n    margin-left: auto !important;\n  }\n  .my-sm-0 {\n    margin-top: 0 !important;\n    margin-bottom: 0 !important;\n  }\n  .my-sm-1 {\n    margin-top: 0.25rem !important;\n    margin-bottom: 0.25rem !important;\n  }\n  .my-sm-2 {\n    margin-top: 0.5rem !important;\n    margin-bottom: 0.5rem !important;\n  }\n  .my-sm-3 {\n    margin-top: 1rem !important;\n    margin-bottom: 1rem !important;\n  }\n  .my-sm-4 {\n    margin-top: 1.5rem !important;\n    margin-bottom: 1.5rem !important;\n  }\n  .my-sm-5 {\n    margin-top: 3rem !important;\n    margin-bottom: 3rem !important;\n  }\n  .my-sm-auto {\n    margin-top: auto !important;\n    margin-bottom: auto !important;\n  }\n  .mt-sm-0 {\n    margin-top: 0 !important;\n  }\n  .mt-sm-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mt-sm-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mt-sm-3 {\n    margin-top: 1rem !important;\n  }\n  .mt-sm-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mt-sm-5 {\n    margin-top: 3rem !important;\n  }\n  .mt-sm-auto {\n    margin-top: auto !important;\n  }\n  .me-sm-0 {\n    margin-right: 0 !important;\n  }\n  .me-sm-1 {\n    margin-right: 0.25rem !important;\n  }\n  .me-sm-2 {\n    margin-right: 0.5rem !important;\n  }\n  .me-sm-3 {\n    margin-right: 1rem !important;\n  }\n  .me-sm-4 {\n    margin-right: 1.5rem !important;\n  }\n  .me-sm-5 {\n    margin-right: 3rem !important;\n  }\n  .me-sm-auto {\n    margin-right: auto !important;\n  }\n  .mb-sm-0 {\n    margin-bottom: 0 !important;\n  }\n  .mb-sm-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .mb-sm-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .mb-sm-3 {\n    margin-bottom: 1rem !important;\n  }\n  .mb-sm-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .mb-sm-5 {\n    margin-bottom: 3rem !important;\n  }\n  .mb-sm-auto {\n    margin-bottom: auto !important;\n  }\n  .ms-sm-0 {\n    margin-left: 0 !important;\n  }\n  .ms-sm-1 {\n    margin-left: 0.25rem !important;\n  }\n  .ms-sm-2 {\n    margin-left: 0.5rem !important;\n  }\n  .ms-sm-3 {\n    margin-left: 1rem !important;\n  }\n  .ms-sm-4 {\n    margin-left: 1.5rem !important;\n  }\n  .ms-sm-5 {\n    margin-left: 3rem !important;\n  }\n  .ms-sm-auto {\n    margin-left: auto !important;\n  }\n  .p-sm-0 {\n    padding: 0 !important;\n  }\n  .p-sm-1 {\n    padding: 0.25rem !important;\n  }\n  .p-sm-2 {\n    padding: 0.5rem !important;\n  }\n  .p-sm-3 {\n    padding: 1rem !important;\n  }\n  .p-sm-4 {\n    padding: 1.5rem !important;\n  }\n  .p-sm-5 {\n    padding: 3rem !important;\n  }\n  .px-sm-0 {\n    padding-right: 0 !important;\n    padding-left: 0 !important;\n  }\n  .px-sm-1 {\n    padding-right: 0.25rem !important;\n    padding-left: 0.25rem !important;\n  }\n  .px-sm-2 {\n    padding-right: 0.5rem !important;\n    padding-left: 0.5rem !important;\n  }\n  .px-sm-3 {\n    padding-right: 1rem !important;\n    padding-left: 1rem !important;\n  }\n  .px-sm-4 {\n    padding-right: 1.5rem !important;\n    padding-left: 1.5rem !important;\n  }\n  .px-sm-5 {\n    padding-right: 3rem !important;\n    padding-left: 3rem !important;\n  }\n  .py-sm-0 {\n    padding-top: 0 !important;\n    padding-bottom: 0 !important;\n  }\n  .py-sm-1 {\n    padding-top: 0.25rem !important;\n    padding-bottom: 0.25rem !important;\n  }\n  .py-sm-2 {\n    padding-top: 0.5rem !important;\n    padding-bottom: 0.5rem !important;\n  }\n  .py-sm-3 {\n    padding-top: 1rem !important;\n    padding-bottom: 1rem !important;\n  }\n  .py-sm-4 {\n    padding-top: 1.5rem !important;\n    padding-bottom: 1.5rem !important;\n  }\n  .py-sm-5 {\n    padding-top: 3rem !important;\n    padding-bottom: 3rem !important;\n  }\n  .pt-sm-0 {\n    padding-top: 0 !important;\n  }\n  .pt-sm-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pt-sm-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pt-sm-3 {\n    padding-top: 1rem !important;\n  }\n  .pt-sm-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pt-sm-5 {\n    padding-top: 3rem !important;\n  }\n  .pe-sm-0 {\n    padding-right: 0 !important;\n  }\n  .pe-sm-1 {\n    padding-right: 0.25rem !important;\n  }\n  .pe-sm-2 {\n    padding-right: 0.5rem !important;\n  }\n  .pe-sm-3 {\n    padding-right: 1rem !important;\n  }\n  .pe-sm-4 {\n    padding-right: 1.5rem !important;\n  }\n  .pe-sm-5 {\n    padding-right: 3rem !important;\n  }\n  .pb-sm-0 {\n    padding-bottom: 0 !important;\n  }\n  .pb-sm-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pb-sm-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pb-sm-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pb-sm-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pb-sm-5 {\n    padding-bottom: 3rem !important;\n  }\n  .ps-sm-0 {\n    padding-left: 0 !important;\n  }\n  .ps-sm-1 {\n    padding-left: 0.25rem !important;\n  }\n  .ps-sm-2 {\n    padding-left: 0.5rem !important;\n  }\n  .ps-sm-3 {\n    padding-left: 1rem !important;\n  }\n  .ps-sm-4 {\n    padding-left: 1.5rem !important;\n  }\n  .ps-sm-5 {\n    padding-left: 3rem !important;\n  }\n}\n@media (min-width: 768px) {\n  .d-md-inline {\n    display: inline !important;\n  }\n  .d-md-inline-block {\n    display: inline-block !important;\n  }\n  .d-md-block {\n    display: block !important;\n  }\n  .d-md-grid {\n    display: grid !important;\n  }\n  .d-md-inline-grid {\n    display: inline-grid !important;\n  }\n  .d-md-table {\n    display: table !important;\n  }\n  .d-md-table-row {\n    display: table-row !important;\n  }\n  .d-md-table-cell {\n    display: table-cell !important;\n  }\n  .d-md-flex {\n    display: flex !important;\n  }\n  .d-md-inline-flex {\n    display: inline-flex !important;\n  }\n  .d-md-none {\n    display: none !important;\n  }\n  .flex-md-fill {\n    flex: 1 1 auto !important;\n  }\n  .flex-md-row {\n    flex-direction: row !important;\n  }\n  .flex-md-column {\n    flex-direction: column !important;\n  }\n  .flex-md-row-reverse {\n    flex-direction: row-reverse !important;\n  }\n  .flex-md-column-reverse {\n    flex-direction: column-reverse !important;\n  }\n  .flex-md-grow-0 {\n    flex-grow: 0 !important;\n  }\n  .flex-md-grow-1 {\n    flex-grow: 1 !important;\n  }\n  .flex-md-shrink-0 {\n    flex-shrink: 0 !important;\n  }\n  .flex-md-shrink-1 {\n    flex-shrink: 1 !important;\n  }\n  .flex-md-wrap {\n    flex-wrap: wrap !important;\n  }\n  .flex-md-nowrap {\n    flex-wrap: nowrap !important;\n  }\n  .flex-md-wrap-reverse {\n    flex-wrap: wrap-reverse !important;\n  }\n  .justify-content-md-start {\n    justify-content: flex-start !important;\n  }\n  .justify-content-md-end {\n    justify-content: flex-end !important;\n  }\n  .justify-content-md-center {\n    justify-content: center !important;\n  }\n  .justify-content-md-between {\n    justify-content: space-between !important;\n  }\n  .justify-content-md-around {\n    justify-content: space-around !important;\n  }\n  .justify-content-md-evenly {\n    justify-content: space-evenly !important;\n  }\n  .align-items-md-start {\n    align-items: flex-start !important;\n  }\n  .align-items-md-end {\n    align-items: flex-end !important;\n  }\n  .align-items-md-center {\n    align-items: center !important;\n  }\n  .align-items-md-baseline {\n    align-items: baseline !important;\n  }\n  .align-items-md-stretch {\n    align-items: stretch !important;\n  }\n  .align-content-md-start {\n    align-content: flex-start !important;\n  }\n  .align-content-md-end {\n    align-content: flex-end !important;\n  }\n  .align-content-md-center {\n    align-content: center !important;\n  }\n  .align-content-md-between {\n    align-content: space-between !important;\n  }\n  .align-content-md-around {\n    align-content: space-around !important;\n  }\n  .align-content-md-stretch {\n    align-content: stretch !important;\n  }\n  .align-self-md-auto {\n    align-self: auto !important;\n  }\n  .align-self-md-start {\n    align-self: flex-start !important;\n  }\n  .align-self-md-end {\n    align-self: flex-end !important;\n  }\n  .align-self-md-center {\n    align-self: center !important;\n  }\n  .align-self-md-baseline {\n    align-self: baseline !important;\n  }\n  .align-self-md-stretch {\n    align-self: stretch !important;\n  }\n  .order-md-first {\n    order: -1 !important;\n  }\n  .order-md-0 {\n    order: 0 !important;\n  }\n  .order-md-1 {\n    order: 1 !important;\n  }\n  .order-md-2 {\n    order: 2 !important;\n  }\n  .order-md-3 {\n    order: 3 !important;\n  }\n  .order-md-4 {\n    order: 4 !important;\n  }\n  .order-md-5 {\n    order: 5 !important;\n  }\n  .order-md-last {\n    order: 6 !important;\n  }\n  .m-md-0 {\n    margin: 0 !important;\n  }\n  .m-md-1 {\n    margin: 0.25rem !important;\n  }\n  .m-md-2 {\n    margin: 0.5rem !important;\n  }\n  .m-md-3 {\n    margin: 1rem !important;\n  }\n  .m-md-4 {\n    margin: 1.5rem !important;\n  }\n  .m-md-5 {\n    margin: 3rem !important;\n  }\n  .m-md-auto {\n    margin: auto !important;\n  }\n  .mx-md-0 {\n    margin-right: 0 !important;\n    margin-left: 0 !important;\n  }\n  .mx-md-1 {\n    margin-right: 0.25rem !important;\n    margin-left: 0.25rem !important;\n  }\n  .mx-md-2 {\n    margin-right: 0.5rem !important;\n    margin-left: 0.5rem !important;\n  }\n  .mx-md-3 {\n    margin-right: 1rem !important;\n    margin-left: 1rem !important;\n  }\n  .mx-md-4 {\n    margin-right: 1.5rem !important;\n    margin-left: 1.5rem !important;\n  }\n  .mx-md-5 {\n    margin-right: 3rem !important;\n    margin-left: 3rem !important;\n  }\n  .mx-md-auto {\n    margin-right: auto !important;\n    margin-left: auto !important;\n  }\n  .my-md-0 {\n    margin-top: 0 !important;\n    margin-bottom: 0 !important;\n  }\n  .my-md-1 {\n    margin-top: 0.25rem !important;\n    margin-bottom: 0.25rem !important;\n  }\n  .my-md-2 {\n    margin-top: 0.5rem !important;\n    margin-bottom: 0.5rem !important;\n  }\n  .my-md-3 {\n    margin-top: 1rem !important;\n    margin-bottom: 1rem !important;\n  }\n  .my-md-4 {\n    margin-top: 1.5rem !important;\n    margin-bottom: 1.5rem !important;\n  }\n  .my-md-5 {\n    margin-top: 3rem !important;\n    margin-bottom: 3rem !important;\n  }\n  .my-md-auto {\n    margin-top: auto !important;\n    margin-bottom: auto !important;\n  }\n  .mt-md-0 {\n    margin-top: 0 !important;\n  }\n  .mt-md-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mt-md-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mt-md-3 {\n    margin-top: 1rem !important;\n  }\n  .mt-md-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mt-md-5 {\n    margin-top: 3rem !important;\n  }\n  .mt-md-auto {\n    margin-top: auto !important;\n  }\n  .me-md-0 {\n    margin-right: 0 !important;\n  }\n  .me-md-1 {\n    margin-right: 0.25rem !important;\n  }\n  .me-md-2 {\n    margin-right: 0.5rem !important;\n  }\n  .me-md-3 {\n    margin-right: 1rem !important;\n  }\n  .me-md-4 {\n    margin-right: 1.5rem !important;\n  }\n  .me-md-5 {\n    margin-right: 3rem !important;\n  }\n  .me-md-auto {\n    margin-right: auto !important;\n  }\n  .mb-md-0 {\n    margin-bottom: 0 !important;\n  }\n  .mb-md-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .mb-md-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .mb-md-3 {\n    margin-bottom: 1rem !important;\n  }\n  .mb-md-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .mb-md-5 {\n    margin-bottom: 3rem !important;\n  }\n  .mb-md-auto {\n    margin-bottom: auto !important;\n  }\n  .ms-md-0 {\n    margin-left: 0 !important;\n  }\n  .ms-md-1 {\n    margin-left: 0.25rem !important;\n  }\n  .ms-md-2 {\n    margin-left: 0.5rem !important;\n  }\n  .ms-md-3 {\n    margin-left: 1rem !important;\n  }\n  .ms-md-4 {\n    margin-left: 1.5rem !important;\n  }\n  .ms-md-5 {\n    margin-left: 3rem !important;\n  }\n  .ms-md-auto {\n    margin-left: auto !important;\n  }\n  .p-md-0 {\n    padding: 0 !important;\n  }\n  .p-md-1 {\n    padding: 0.25rem !important;\n  }\n  .p-md-2 {\n    padding: 0.5rem !important;\n  }\n  .p-md-3 {\n    padding: 1rem !important;\n  }\n  .p-md-4 {\n    padding: 1.5rem !important;\n  }\n  .p-md-5 {\n    padding: 3rem !important;\n  }\n  .px-md-0 {\n    padding-right: 0 !important;\n    padding-left: 0 !important;\n  }\n  .px-md-1 {\n    padding-right: 0.25rem !important;\n    padding-left: 0.25rem !important;\n  }\n  .px-md-2 {\n    padding-right: 0.5rem !important;\n    padding-left: 0.5rem !important;\n  }\n  .px-md-3 {\n    padding-right: 1rem !important;\n    padding-left: 1rem !important;\n  }\n  .px-md-4 {\n    padding-right: 1.5rem !important;\n    padding-left: 1.5rem !important;\n  }\n  .px-md-5 {\n    padding-right: 3rem !important;\n    padding-left: 3rem !important;\n  }\n  .py-md-0 {\n    padding-top: 0 !important;\n    padding-bottom: 0 !important;\n  }\n  .py-md-1 {\n    padding-top: 0.25rem !important;\n    padding-bottom: 0.25rem !important;\n  }\n  .py-md-2 {\n    padding-top: 0.5rem !important;\n    padding-bottom: 0.5rem !important;\n  }\n  .py-md-3 {\n    padding-top: 1rem !important;\n    padding-bottom: 1rem !important;\n  }\n  .py-md-4 {\n    padding-top: 1.5rem !important;\n    padding-bottom: 1.5rem !important;\n  }\n  .py-md-5 {\n    padding-top: 3rem !important;\n    padding-bottom: 3rem !important;\n  }\n  .pt-md-0 {\n    padding-top: 0 !important;\n  }\n  .pt-md-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pt-md-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pt-md-3 {\n    padding-top: 1rem !important;\n  }\n  .pt-md-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pt-md-5 {\n    padding-top: 3rem !important;\n  }\n  .pe-md-0 {\n    padding-right: 0 !important;\n  }\n  .pe-md-1 {\n    padding-right: 0.25rem !important;\n  }\n  .pe-md-2 {\n    padding-right: 0.5rem !important;\n  }\n  .pe-md-3 {\n    padding-right: 1rem !important;\n  }\n  .pe-md-4 {\n    padding-right: 1.5rem !important;\n  }\n  .pe-md-5 {\n    padding-right: 3rem !important;\n  }\n  .pb-md-0 {\n    padding-bottom: 0 !important;\n  }\n  .pb-md-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pb-md-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pb-md-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pb-md-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pb-md-5 {\n    padding-bottom: 3rem !important;\n  }\n  .ps-md-0 {\n    padding-left: 0 !important;\n  }\n  .ps-md-1 {\n    padding-left: 0.25rem !important;\n  }\n  .ps-md-2 {\n    padding-left: 0.5rem !important;\n  }\n  .ps-md-3 {\n    padding-left: 1rem !important;\n  }\n  .ps-md-4 {\n    padding-left: 1.5rem !important;\n  }\n  .ps-md-5 {\n    padding-left: 3rem !important;\n  }\n}\n@media (min-width: 992px) {\n  .d-lg-inline {\n    display: inline !important;\n  }\n  .d-lg-inline-block {\n    display: inline-block !important;\n  }\n  .d-lg-block {\n    display: block !important;\n  }\n  .d-lg-grid {\n    display: grid !important;\n  }\n  .d-lg-inline-grid {\n    display: inline-grid !important;\n  }\n  .d-lg-table {\n    display: table !important;\n  }\n  .d-lg-table-row {\n    display: table-row !important;\n  }\n  .d-lg-table-cell {\n    display: table-cell !important;\n  }\n  .d-lg-flex {\n    display: flex !important;\n  }\n  .d-lg-inline-flex {\n    display: inline-flex !important;\n  }\n  .d-lg-none {\n    display: none !important;\n  }\n  .flex-lg-fill {\n    flex: 1 1 auto !important;\n  }\n  .flex-lg-row {\n    flex-direction: row !important;\n  }\n  .flex-lg-column {\n    flex-direction: column !important;\n  }\n  .flex-lg-row-reverse {\n    flex-direction: row-reverse !important;\n  }\n  .flex-lg-column-reverse {\n    flex-direction: column-reverse !important;\n  }\n  .flex-lg-grow-0 {\n    flex-grow: 0 !important;\n  }\n  .flex-lg-grow-1 {\n    flex-grow: 1 !important;\n  }\n  .flex-lg-shrink-0 {\n    flex-shrink: 0 !important;\n  }\n  .flex-lg-shrink-1 {\n    flex-shrink: 1 !important;\n  }\n  .flex-lg-wrap {\n    flex-wrap: wrap !important;\n  }\n  .flex-lg-nowrap {\n    flex-wrap: nowrap !important;\n  }\n  .flex-lg-wrap-reverse {\n    flex-wrap: wrap-reverse !important;\n  }\n  .justify-content-lg-start {\n    justify-content: flex-start !important;\n  }\n  .justify-content-lg-end {\n    justify-content: flex-end !important;\n  }\n  .justify-content-lg-center {\n    justify-content: center !important;\n  }\n  .justify-content-lg-between {\n    justify-content: space-between !important;\n  }\n  .justify-content-lg-around {\n    justify-content: space-around !important;\n  }\n  .justify-content-lg-evenly {\n    justify-content: space-evenly !important;\n  }\n  .align-items-lg-start {\n    align-items: flex-start !important;\n  }\n  .align-items-lg-end {\n    align-items: flex-end !important;\n  }\n  .align-items-lg-center {\n    align-items: center !important;\n  }\n  .align-items-lg-baseline {\n    align-items: baseline !important;\n  }\n  .align-items-lg-stretch {\n    align-items: stretch !important;\n  }\n  .align-content-lg-start {\n    align-content: flex-start !important;\n  }\n  .align-content-lg-end {\n    align-content: flex-end !important;\n  }\n  .align-content-lg-center {\n    align-content: center !important;\n  }\n  .align-content-lg-between {\n    align-content: space-between !important;\n  }\n  .align-content-lg-around {\n    align-content: space-around !important;\n  }\n  .align-content-lg-stretch {\n    align-content: stretch !important;\n  }\n  .align-self-lg-auto {\n    align-self: auto !important;\n  }\n  .align-self-lg-start {\n    align-self: flex-start !important;\n  }\n  .align-self-lg-end {\n    align-self: flex-end !important;\n  }\n  .align-self-lg-center {\n    align-self: center !important;\n  }\n  .align-self-lg-baseline {\n    align-self: baseline !important;\n  }\n  .align-self-lg-stretch {\n    align-self: stretch !important;\n  }\n  .order-lg-first {\n    order: -1 !important;\n  }\n  .order-lg-0 {\n    order: 0 !important;\n  }\n  .order-lg-1 {\n    order: 1 !important;\n  }\n  .order-lg-2 {\n    order: 2 !important;\n  }\n  .order-lg-3 {\n    order: 3 !important;\n  }\n  .order-lg-4 {\n    order: 4 !important;\n  }\n  .order-lg-5 {\n    order: 5 !important;\n  }\n  .order-lg-last {\n    order: 6 !important;\n  }\n  .m-lg-0 {\n    margin: 0 !important;\n  }\n  .m-lg-1 {\n    margin: 0.25rem !important;\n  }\n  .m-lg-2 {\n    margin: 0.5rem !important;\n  }\n  .m-lg-3 {\n    margin: 1rem !important;\n  }\n  .m-lg-4 {\n    margin: 1.5rem !important;\n  }\n  .m-lg-5 {\n    margin: 3rem !important;\n  }\n  .m-lg-auto {\n    margin: auto !important;\n  }\n  .mx-lg-0 {\n    margin-right: 0 !important;\n    margin-left: 0 !important;\n  }\n  .mx-lg-1 {\n    margin-right: 0.25rem !important;\n    margin-left: 0.25rem !important;\n  }\n  .mx-lg-2 {\n    margin-right: 0.5rem !important;\n    margin-left: 0.5rem !important;\n  }\n  .mx-lg-3 {\n    margin-right: 1rem !important;\n    margin-left: 1rem !important;\n  }\n  .mx-lg-4 {\n    margin-right: 1.5rem !important;\n    margin-left: 1.5rem !important;\n  }\n  .mx-lg-5 {\n    margin-right: 3rem !important;\n    margin-left: 3rem !important;\n  }\n  .mx-lg-auto {\n    margin-right: auto !important;\n    margin-left: auto !important;\n  }\n  .my-lg-0 {\n    margin-top: 0 !important;\n    margin-bottom: 0 !important;\n  }\n  .my-lg-1 {\n    margin-top: 0.25rem !important;\n    margin-bottom: 0.25rem !important;\n  }\n  .my-lg-2 {\n    margin-top: 0.5rem !important;\n    margin-bottom: 0.5rem !important;\n  }\n  .my-lg-3 {\n    margin-top: 1rem !important;\n    margin-bottom: 1rem !important;\n  }\n  .my-lg-4 {\n    margin-top: 1.5rem !important;\n    margin-bottom: 1.5rem !important;\n  }\n  .my-lg-5 {\n    margin-top: 3rem !important;\n    margin-bottom: 3rem !important;\n  }\n  .my-lg-auto {\n    margin-top: auto !important;\n    margin-bottom: auto !important;\n  }\n  .mt-lg-0 {\n    margin-top: 0 !important;\n  }\n  .mt-lg-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mt-lg-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mt-lg-3 {\n    margin-top: 1rem !important;\n  }\n  .mt-lg-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mt-lg-5 {\n    margin-top: 3rem !important;\n  }\n  .mt-lg-auto {\n    margin-top: auto !important;\n  }\n  .me-lg-0 {\n    margin-right: 0 !important;\n  }\n  .me-lg-1 {\n    margin-right: 0.25rem !important;\n  }\n  .me-lg-2 {\n    margin-right: 0.5rem !important;\n  }\n  .me-lg-3 {\n    margin-right: 1rem !important;\n  }\n  .me-lg-4 {\n    margin-right: 1.5rem !important;\n  }\n  .me-lg-5 {\n    margin-right: 3rem !important;\n  }\n  .me-lg-auto {\n    margin-right: auto !important;\n  }\n  .mb-lg-0 {\n    margin-bottom: 0 !important;\n  }\n  .mb-lg-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .mb-lg-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .mb-lg-3 {\n    margin-bottom: 1rem !important;\n  }\n  .mb-lg-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .mb-lg-5 {\n    margin-bottom: 3rem !important;\n  }\n  .mb-lg-auto {\n    margin-bottom: auto !important;\n  }\n  .ms-lg-0 {\n    margin-left: 0 !important;\n  }\n  .ms-lg-1 {\n    margin-left: 0.25rem !important;\n  }\n  .ms-lg-2 {\n    margin-left: 0.5rem !important;\n  }\n  .ms-lg-3 {\n    margin-left: 1rem !important;\n  }\n  .ms-lg-4 {\n    margin-left: 1.5rem !important;\n  }\n  .ms-lg-5 {\n    margin-left: 3rem !important;\n  }\n  .ms-lg-auto {\n    margin-left: auto !important;\n  }\n  .p-lg-0 {\n    padding: 0 !important;\n  }\n  .p-lg-1 {\n    padding: 0.25rem !important;\n  }\n  .p-lg-2 {\n    padding: 0.5rem !important;\n  }\n  .p-lg-3 {\n    padding: 1rem !important;\n  }\n  .p-lg-4 {\n    padding: 1.5rem !important;\n  }\n  .p-lg-5 {\n    padding: 3rem !important;\n  }\n  .px-lg-0 {\n    padding-right: 0 !important;\n    padding-left: 0 !important;\n  }\n  .px-lg-1 {\n    padding-right: 0.25rem !important;\n    padding-left: 0.25rem !important;\n  }\n  .px-lg-2 {\n    padding-right: 0.5rem !important;\n    padding-left: 0.5rem !important;\n  }\n  .px-lg-3 {\n    padding-right: 1rem !important;\n    padding-left: 1rem !important;\n  }\n  .px-lg-4 {\n    padding-right: 1.5rem !important;\n    padding-left: 1.5rem !important;\n  }\n  .px-lg-5 {\n    padding-right: 3rem !important;\n    padding-left: 3rem !important;\n  }\n  .py-lg-0 {\n    padding-top: 0 !important;\n    padding-bottom: 0 !important;\n  }\n  .py-lg-1 {\n    padding-top: 0.25rem !important;\n    padding-bottom: 0.25rem !important;\n  }\n  .py-lg-2 {\n    padding-top: 0.5rem !important;\n    padding-bottom: 0.5rem !important;\n  }\n  .py-lg-3 {\n    padding-top: 1rem !important;\n    padding-bottom: 1rem !important;\n  }\n  .py-lg-4 {\n    padding-top: 1.5rem !important;\n    padding-bottom: 1.5rem !important;\n  }\n  .py-lg-5 {\n    padding-top: 3rem !important;\n    padding-bottom: 3rem !important;\n  }\n  .pt-lg-0 {\n    padding-top: 0 !important;\n  }\n  .pt-lg-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pt-lg-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pt-lg-3 {\n    padding-top: 1rem !important;\n  }\n  .pt-lg-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pt-lg-5 {\n    padding-top: 3rem !important;\n  }\n  .pe-lg-0 {\n    padding-right: 0 !important;\n  }\n  .pe-lg-1 {\n    padding-right: 0.25rem !important;\n  }\n  .pe-lg-2 {\n    padding-right: 0.5rem !important;\n  }\n  .pe-lg-3 {\n    padding-right: 1rem !important;\n  }\n  .pe-lg-4 {\n    padding-right: 1.5rem !important;\n  }\n  .pe-lg-5 {\n    padding-right: 3rem !important;\n  }\n  .pb-lg-0 {\n    padding-bottom: 0 !important;\n  }\n  .pb-lg-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pb-lg-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pb-lg-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pb-lg-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pb-lg-5 {\n    padding-bottom: 3rem !important;\n  }\n  .ps-lg-0 {\n    padding-left: 0 !important;\n  }\n  .ps-lg-1 {\n    padding-left: 0.25rem !important;\n  }\n  .ps-lg-2 {\n    padding-left: 0.5rem !important;\n  }\n  .ps-lg-3 {\n    padding-left: 1rem !important;\n  }\n  .ps-lg-4 {\n    padding-left: 1.5rem !important;\n  }\n  .ps-lg-5 {\n    padding-left: 3rem !important;\n  }\n}\n@media (min-width: 1200px) {\n  .d-xl-inline {\n    display: inline !important;\n  }\n  .d-xl-inline-block {\n    display: inline-block !important;\n  }\n  .d-xl-block {\n    display: block !important;\n  }\n  .d-xl-grid {\n    display: grid !important;\n  }\n  .d-xl-inline-grid {\n    display: inline-grid !important;\n  }\n  .d-xl-table {\n    display: table !important;\n  }\n  .d-xl-table-row {\n    display: table-row !important;\n  }\n  .d-xl-table-cell {\n    display: table-cell !important;\n  }\n  .d-xl-flex {\n    display: flex !important;\n  }\n  .d-xl-inline-flex {\n    display: inline-flex !important;\n  }\n  .d-xl-none {\n    display: none !important;\n  }\n  .flex-xl-fill {\n    flex: 1 1 auto !important;\n  }\n  .flex-xl-row {\n    flex-direction: row !important;\n  }\n  .flex-xl-column {\n    flex-direction: column !important;\n  }\n  .flex-xl-row-reverse {\n    flex-direction: row-reverse !important;\n  }\n  .flex-xl-column-reverse {\n    flex-direction: column-reverse !important;\n  }\n  .flex-xl-grow-0 {\n    flex-grow: 0 !important;\n  }\n  .flex-xl-grow-1 {\n    flex-grow: 1 !important;\n  }\n  .flex-xl-shrink-0 {\n    flex-shrink: 0 !important;\n  }\n  .flex-xl-shrink-1 {\n    flex-shrink: 1 !important;\n  }\n  .flex-xl-wrap {\n    flex-wrap: wrap !important;\n  }\n  .flex-xl-nowrap {\n    flex-wrap: nowrap !important;\n  }\n  .flex-xl-wrap-reverse {\n    flex-wrap: wrap-reverse !important;\n  }\n  .justify-content-xl-start {\n    justify-content: flex-start !important;\n  }\n  .justify-content-xl-end {\n    justify-content: flex-end !important;\n  }\n  .justify-content-xl-center {\n    justify-content: center !important;\n  }\n  .justify-content-xl-between {\n    justify-content: space-between !important;\n  }\n  .justify-content-xl-around {\n    justify-content: space-around !important;\n  }\n  .justify-content-xl-evenly {\n    justify-content: space-evenly !important;\n  }\n  .align-items-xl-start {\n    align-items: flex-start !important;\n  }\n  .align-items-xl-end {\n    align-items: flex-end !important;\n  }\n  .align-items-xl-center {\n    align-items: center !important;\n  }\n  .align-items-xl-baseline {\n    align-items: baseline !important;\n  }\n  .align-items-xl-stretch {\n    align-items: stretch !important;\n  }\n  .align-content-xl-start {\n    align-content: flex-start !important;\n  }\n  .align-content-xl-end {\n    align-content: flex-end !important;\n  }\n  .align-content-xl-center {\n    align-content: center !important;\n  }\n  .align-content-xl-between {\n    align-content: space-between !important;\n  }\n  .align-content-xl-around {\n    align-content: space-around !important;\n  }\n  .align-content-xl-stretch {\n    align-content: stretch !important;\n  }\n  .align-self-xl-auto {\n    align-self: auto !important;\n  }\n  .align-self-xl-start {\n    align-self: flex-start !important;\n  }\n  .align-self-xl-end {\n    align-self: flex-end !important;\n  }\n  .align-self-xl-center {\n    align-self: center !important;\n  }\n  .align-self-xl-baseline {\n    align-self: baseline !important;\n  }\n  .align-self-xl-stretch {\n    align-self: stretch !important;\n  }\n  .order-xl-first {\n    order: -1 !important;\n  }\n  .order-xl-0 {\n    order: 0 !important;\n  }\n  .order-xl-1 {\n    order: 1 !important;\n  }\n  .order-xl-2 {\n    order: 2 !important;\n  }\n  .order-xl-3 {\n    order: 3 !important;\n  }\n  .order-xl-4 {\n    order: 4 !important;\n  }\n  .order-xl-5 {\n    order: 5 !important;\n  }\n  .order-xl-last {\n    order: 6 !important;\n  }\n  .m-xl-0 {\n    margin: 0 !important;\n  }\n  .m-xl-1 {\n    margin: 0.25rem !important;\n  }\n  .m-xl-2 {\n    margin: 0.5rem !important;\n  }\n  .m-xl-3 {\n    margin: 1rem !important;\n  }\n  .m-xl-4 {\n    margin: 1.5rem !important;\n  }\n  .m-xl-5 {\n    margin: 3rem !important;\n  }\n  .m-xl-auto {\n    margin: auto !important;\n  }\n  .mx-xl-0 {\n    margin-right: 0 !important;\n    margin-left: 0 !important;\n  }\n  .mx-xl-1 {\n    margin-right: 0.25rem !important;\n    margin-left: 0.25rem !important;\n  }\n  .mx-xl-2 {\n    margin-right: 0.5rem !important;\n    margin-left: 0.5rem !important;\n  }\n  .mx-xl-3 {\n    margin-right: 1rem !important;\n    margin-left: 1rem !important;\n  }\n  .mx-xl-4 {\n    margin-right: 1.5rem !important;\n    margin-left: 1.5rem !important;\n  }\n  .mx-xl-5 {\n    margin-right: 3rem !important;\n    margin-left: 3rem !important;\n  }\n  .mx-xl-auto {\n    margin-right: auto !important;\n    margin-left: auto !important;\n  }\n  .my-xl-0 {\n    margin-top: 0 !important;\n    margin-bottom: 0 !important;\n  }\n  .my-xl-1 {\n    margin-top: 0.25rem !important;\n    margin-bottom: 0.25rem !important;\n  }\n  .my-xl-2 {\n    margin-top: 0.5rem !important;\n    margin-bottom: 0.5rem !important;\n  }\n  .my-xl-3 {\n    margin-top: 1rem !important;\n    margin-bottom: 1rem !important;\n  }\n  .my-xl-4 {\n    margin-top: 1.5rem !important;\n    margin-bottom: 1.5rem !important;\n  }\n  .my-xl-5 {\n    margin-top: 3rem !important;\n    margin-bottom: 3rem !important;\n  }\n  .my-xl-auto {\n    margin-top: auto !important;\n    margin-bottom: auto !important;\n  }\n  .mt-xl-0 {\n    margin-top: 0 !important;\n  }\n  .mt-xl-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mt-xl-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mt-xl-3 {\n    margin-top: 1rem !important;\n  }\n  .mt-xl-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mt-xl-5 {\n    margin-top: 3rem !important;\n  }\n  .mt-xl-auto {\n    margin-top: auto !important;\n  }\n  .me-xl-0 {\n    margin-right: 0 !important;\n  }\n  .me-xl-1 {\n    margin-right: 0.25rem !important;\n  }\n  .me-xl-2 {\n    margin-right: 0.5rem !important;\n  }\n  .me-xl-3 {\n    margin-right: 1rem !important;\n  }\n  .me-xl-4 {\n    margin-right: 1.5rem !important;\n  }\n  .me-xl-5 {\n    margin-right: 3rem !important;\n  }\n  .me-xl-auto {\n    margin-right: auto !important;\n  }\n  .mb-xl-0 {\n    margin-bottom: 0 !important;\n  }\n  .mb-xl-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .mb-xl-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .mb-xl-3 {\n    margin-bottom: 1rem !important;\n  }\n  .mb-xl-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .mb-xl-5 {\n    margin-bottom: 3rem !important;\n  }\n  .mb-xl-auto {\n    margin-bottom: auto !important;\n  }\n  .ms-xl-0 {\n    margin-left: 0 !important;\n  }\n  .ms-xl-1 {\n    margin-left: 0.25rem !important;\n  }\n  .ms-xl-2 {\n    margin-left: 0.5rem !important;\n  }\n  .ms-xl-3 {\n    margin-left: 1rem !important;\n  }\n  .ms-xl-4 {\n    margin-left: 1.5rem !important;\n  }\n  .ms-xl-5 {\n    margin-left: 3rem !important;\n  }\n  .ms-xl-auto {\n    margin-left: auto !important;\n  }\n  .p-xl-0 {\n    padding: 0 !important;\n  }\n  .p-xl-1 {\n    padding: 0.25rem !important;\n  }\n  .p-xl-2 {\n    padding: 0.5rem !important;\n  }\n  .p-xl-3 {\n    padding: 1rem !important;\n  }\n  .p-xl-4 {\n    padding: 1.5rem !important;\n  }\n  .p-xl-5 {\n    padding: 3rem !important;\n  }\n  .px-xl-0 {\n    padding-right: 0 !important;\n    padding-left: 0 !important;\n  }\n  .px-xl-1 {\n    padding-right: 0.25rem !important;\n    padding-left: 0.25rem !important;\n  }\n  .px-xl-2 {\n    padding-right: 0.5rem !important;\n    padding-left: 0.5rem !important;\n  }\n  .px-xl-3 {\n    padding-right: 1rem !important;\n    padding-left: 1rem !important;\n  }\n  .px-xl-4 {\n    padding-right: 1.5rem !important;\n    padding-left: 1.5rem !important;\n  }\n  .px-xl-5 {\n    padding-right: 3rem !important;\n    padding-left: 3rem !important;\n  }\n  .py-xl-0 {\n    padding-top: 0 !important;\n    padding-bottom: 0 !important;\n  }\n  .py-xl-1 {\n    padding-top: 0.25rem !important;\n    padding-bottom: 0.25rem !important;\n  }\n  .py-xl-2 {\n    padding-top: 0.5rem !important;\n    padding-bottom: 0.5rem !important;\n  }\n  .py-xl-3 {\n    padding-top: 1rem !important;\n    padding-bottom: 1rem !important;\n  }\n  .py-xl-4 {\n    padding-top: 1.5rem !important;\n    padding-bottom: 1.5rem !important;\n  }\n  .py-xl-5 {\n    padding-top: 3rem !important;\n    padding-bottom: 3rem !important;\n  }\n  .pt-xl-0 {\n    padding-top: 0 !important;\n  }\n  .pt-xl-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pt-xl-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pt-xl-3 {\n    padding-top: 1rem !important;\n  }\n  .pt-xl-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pt-xl-5 {\n    padding-top: 3rem !important;\n  }\n  .pe-xl-0 {\n    padding-right: 0 !important;\n  }\n  .pe-xl-1 {\n    padding-right: 0.25rem !important;\n  }\n  .pe-xl-2 {\n    padding-right: 0.5rem !important;\n  }\n  .pe-xl-3 {\n    padding-right: 1rem !important;\n  }\n  .pe-xl-4 {\n    padding-right: 1.5rem !important;\n  }\n  .pe-xl-5 {\n    padding-right: 3rem !important;\n  }\n  .pb-xl-0 {\n    padding-bottom: 0 !important;\n  }\n  .pb-xl-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pb-xl-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pb-xl-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pb-xl-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pb-xl-5 {\n    padding-bottom: 3rem !important;\n  }\n  .ps-xl-0 {\n    padding-left: 0 !important;\n  }\n  .ps-xl-1 {\n    padding-left: 0.25rem !important;\n  }\n  .ps-xl-2 {\n    padding-left: 0.5rem !important;\n  }\n  .ps-xl-3 {\n    padding-left: 1rem !important;\n  }\n  .ps-xl-4 {\n    padding-left: 1.5rem !important;\n  }\n  .ps-xl-5 {\n    padding-left: 3rem !important;\n  }\n}\n@media (min-width: 1400px) {\n  .d-xxl-inline {\n    display: inline !important;\n  }\n  .d-xxl-inline-block {\n    display: inline-block !important;\n  }\n  .d-xxl-block {\n    display: block !important;\n  }\n  .d-xxl-grid {\n    display: grid !important;\n  }\n  .d-xxl-inline-grid {\n    display: inline-grid !important;\n  }\n  .d-xxl-table {\n    display: table !important;\n  }\n  .d-xxl-table-row {\n    display: table-row !important;\n  }\n  .d-xxl-table-cell {\n    display: table-cell !important;\n  }\n  .d-xxl-flex {\n    display: flex !important;\n  }\n  .d-xxl-inline-flex {\n    display: inline-flex !important;\n  }\n  .d-xxl-none {\n    display: none !important;\n  }\n  .flex-xxl-fill {\n    flex: 1 1 auto !important;\n  }\n  .flex-xxl-row {\n    flex-direction: row !important;\n  }\n  .flex-xxl-column {\n    flex-direction: column !important;\n  }\n  .flex-xxl-row-reverse {\n    flex-direction: row-reverse !important;\n  }\n  .flex-xxl-column-reverse {\n    flex-direction: column-reverse !important;\n  }\n  .flex-xxl-grow-0 {\n    flex-grow: 0 !important;\n  }\n  .flex-xxl-grow-1 {\n    flex-grow: 1 !important;\n  }\n  .flex-xxl-shrink-0 {\n    flex-shrink: 0 !important;\n  }\n  .flex-xxl-shrink-1 {\n    flex-shrink: 1 !important;\n  }\n  .flex-xxl-wrap {\n    flex-wrap: wrap !important;\n  }\n  .flex-xxl-nowrap {\n    flex-wrap: nowrap !important;\n  }\n  .flex-xxl-wrap-reverse {\n    flex-wrap: wrap-reverse !important;\n  }\n  .justify-content-xxl-start {\n    justify-content: flex-start !important;\n  }\n  .justify-content-xxl-end {\n    justify-content: flex-end !important;\n  }\n  .justify-content-xxl-center {\n    justify-content: center !important;\n  }\n  .justify-content-xxl-between {\n    justify-content: space-between !important;\n  }\n  .justify-content-xxl-around {\n    justify-content: space-around !important;\n  }\n  .justify-content-xxl-evenly {\n    justify-content: space-evenly !important;\n  }\n  .align-items-xxl-start {\n    align-items: flex-start !important;\n  }\n  .align-items-xxl-end {\n    align-items: flex-end !important;\n  }\n  .align-items-xxl-center {\n    align-items: center !important;\n  }\n  .align-items-xxl-baseline {\n    align-items: baseline !important;\n  }\n  .align-items-xxl-stretch {\n    align-items: stretch !important;\n  }\n  .align-content-xxl-start {\n    align-content: flex-start !important;\n  }\n  .align-content-xxl-end {\n    align-content: flex-end !important;\n  }\n  .align-content-xxl-center {\n    align-content: center !important;\n  }\n  .align-content-xxl-between {\n    align-content: space-between !important;\n  }\n  .align-content-xxl-around {\n    align-content: space-around !important;\n  }\n  .align-content-xxl-stretch {\n    align-content: stretch !important;\n  }\n  .align-self-xxl-auto {\n    align-self: auto !important;\n  }\n  .align-self-xxl-start {\n    align-self: flex-start !important;\n  }\n  .align-self-xxl-end {\n    align-self: flex-end !important;\n  }\n  .align-self-xxl-center {\n    align-self: center !important;\n  }\n  .align-self-xxl-baseline {\n    align-self: baseline !important;\n  }\n  .align-self-xxl-stretch {\n    align-self: stretch !important;\n  }\n  .order-xxl-first {\n    order: -1 !important;\n  }\n  .order-xxl-0 {\n    order: 0 !important;\n  }\n  .order-xxl-1 {\n    order: 1 !important;\n  }\n  .order-xxl-2 {\n    order: 2 !important;\n  }\n  .order-xxl-3 {\n    order: 3 !important;\n  }\n  .order-xxl-4 {\n    order: 4 !important;\n  }\n  .order-xxl-5 {\n    order: 5 !important;\n  }\n  .order-xxl-last {\n    order: 6 !important;\n  }\n  .m-xxl-0 {\n    margin: 0 !important;\n  }\n  .m-xxl-1 {\n    margin: 0.25rem !important;\n  }\n  .m-xxl-2 {\n    margin: 0.5rem !important;\n  }\n  .m-xxl-3 {\n    margin: 1rem !important;\n  }\n  .m-xxl-4 {\n    margin: 1.5rem !important;\n  }\n  .m-xxl-5 {\n    margin: 3rem !important;\n  }\n  .m-xxl-auto {\n    margin: auto !important;\n  }\n  .mx-xxl-0 {\n    margin-right: 0 !important;\n    margin-left: 0 !important;\n  }\n  .mx-xxl-1 {\n    margin-right: 0.25rem !important;\n    margin-left: 0.25rem !important;\n  }\n  .mx-xxl-2 {\n    margin-right: 0.5rem !important;\n    margin-left: 0.5rem !important;\n  }\n  .mx-xxl-3 {\n    margin-right: 1rem !important;\n    margin-left: 1rem !important;\n  }\n  .mx-xxl-4 {\n    margin-right: 1.5rem !important;\n    margin-left: 1.5rem !important;\n  }\n  .mx-xxl-5 {\n    margin-right: 3rem !important;\n    margin-left: 3rem !important;\n  }\n  .mx-xxl-auto {\n    margin-right: auto !important;\n    margin-left: auto !important;\n  }\n  .my-xxl-0 {\n    margin-top: 0 !important;\n    margin-bottom: 0 !important;\n  }\n  .my-xxl-1 {\n    margin-top: 0.25rem !important;\n    margin-bottom: 0.25rem !important;\n  }\n  .my-xxl-2 {\n    margin-top: 0.5rem !important;\n    margin-bottom: 0.5rem !important;\n  }\n  .my-xxl-3 {\n    margin-top: 1rem !important;\n    margin-bottom: 1rem !important;\n  }\n  .my-xxl-4 {\n    margin-top: 1.5rem !important;\n    margin-bottom: 1.5rem !important;\n  }\n  .my-xxl-5 {\n    margin-top: 3rem !important;\n    margin-bottom: 3rem !important;\n  }\n  .my-xxl-auto {\n    margin-top: auto !important;\n    margin-bottom: auto !important;\n  }\n  .mt-xxl-0 {\n    margin-top: 0 !important;\n  }\n  .mt-xxl-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mt-xxl-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mt-xxl-3 {\n    margin-top: 1rem !important;\n  }\n  .mt-xxl-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mt-xxl-5 {\n    margin-top: 3rem !important;\n  }\n  .mt-xxl-auto {\n    margin-top: auto !important;\n  }\n  .me-xxl-0 {\n    margin-right: 0 !important;\n  }\n  .me-xxl-1 {\n    margin-right: 0.25rem !important;\n  }\n  .me-xxl-2 {\n    margin-right: 0.5rem !important;\n  }\n  .me-xxl-3 {\n    margin-right: 1rem !important;\n  }\n  .me-xxl-4 {\n    margin-right: 1.5rem !important;\n  }\n  .me-xxl-5 {\n    margin-right: 3rem !important;\n  }\n  .me-xxl-auto {\n    margin-right: auto !important;\n  }\n  .mb-xxl-0 {\n    margin-bottom: 0 !important;\n  }\n  .mb-xxl-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .mb-xxl-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .mb-xxl-3 {\n    margin-bottom: 1rem !important;\n  }\n  .mb-xxl-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .mb-xxl-5 {\n    margin-bottom: 3rem !important;\n  }\n  .mb-xxl-auto {\n    margin-bottom: auto !important;\n  }\n  .ms-xxl-0 {\n    margin-left: 0 !important;\n  }\n  .ms-xxl-1 {\n    margin-left: 0.25rem !important;\n  }\n  .ms-xxl-2 {\n    margin-left: 0.5rem !important;\n  }\n  .ms-xxl-3 {\n    margin-left: 1rem !important;\n  }\n  .ms-xxl-4 {\n    margin-left: 1.5rem !important;\n  }\n  .ms-xxl-5 {\n    margin-left: 3rem !important;\n  }\n  .ms-xxl-auto {\n    margin-left: auto !important;\n  }\n  .p-xxl-0 {\n    padding: 0 !important;\n  }\n  .p-xxl-1 {\n    padding: 0.25rem !important;\n  }\n  .p-xxl-2 {\n    padding: 0.5rem !important;\n  }\n  .p-xxl-3 {\n    padding: 1rem !important;\n  }\n  .p-xxl-4 {\n    padding: 1.5rem !important;\n  }\n  .p-xxl-5 {\n    padding: 3rem !important;\n  }\n  .px-xxl-0 {\n    padding-right: 0 !important;\n    padding-left: 0 !important;\n  }\n  .px-xxl-1 {\n    padding-right: 0.25rem !important;\n    padding-left: 0.25rem !important;\n  }\n  .px-xxl-2 {\n    padding-right: 0.5rem !important;\n    padding-left: 0.5rem !important;\n  }\n  .px-xxl-3 {\n    padding-right: 1rem !important;\n    padding-left: 1rem !important;\n  }\n  .px-xxl-4 {\n    padding-right: 1.5rem !important;\n    padding-left: 1.5rem !important;\n  }\n  .px-xxl-5 {\n    padding-right: 3rem !important;\n    padding-left: 3rem !important;\n  }\n  .py-xxl-0 {\n    padding-top: 0 !important;\n    padding-bottom: 0 !important;\n  }\n  .py-xxl-1 {\n    padding-top: 0.25rem !important;\n    padding-bottom: 0.25rem !important;\n  }\n  .py-xxl-2 {\n    padding-top: 0.5rem !important;\n    padding-bottom: 0.5rem !important;\n  }\n  .py-xxl-3 {\n    padding-top: 1rem !important;\n    padding-bottom: 1rem !important;\n  }\n  .py-xxl-4 {\n    padding-top: 1.5rem !important;\n    padding-bottom: 1.5rem !important;\n  }\n  .py-xxl-5 {\n    padding-top: 3rem !important;\n    padding-bottom: 3rem !important;\n  }\n  .pt-xxl-0 {\n    padding-top: 0 !important;\n  }\n  .pt-xxl-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pt-xxl-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pt-xxl-3 {\n    padding-top: 1rem !important;\n  }\n  .pt-xxl-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pt-xxl-5 {\n    padding-top: 3rem !important;\n  }\n  .pe-xxl-0 {\n    padding-right: 0 !important;\n  }\n  .pe-xxl-1 {\n    padding-right: 0.25rem !important;\n  }\n  .pe-xxl-2 {\n    padding-right: 0.5rem !important;\n  }\n  .pe-xxl-3 {\n    padding-right: 1rem !important;\n  }\n  .pe-xxl-4 {\n    padding-right: 1.5rem !important;\n  }\n  .pe-xxl-5 {\n    padding-right: 3rem !important;\n  }\n  .pb-xxl-0 {\n    padding-bottom: 0 !important;\n  }\n  .pb-xxl-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pb-xxl-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pb-xxl-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pb-xxl-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pb-xxl-5 {\n    padding-bottom: 3rem !important;\n  }\n  .ps-xxl-0 {\n    padding-left: 0 !important;\n  }\n  .ps-xxl-1 {\n    padding-left: 0.25rem !important;\n  }\n  .ps-xxl-2 {\n    padding-left: 0.5rem !important;\n  }\n  .ps-xxl-3 {\n    padding-left: 1rem !important;\n  }\n  .ps-xxl-4 {\n    padding-left: 1.5rem !important;\n  }\n  .ps-xxl-5 {\n    padding-left: 3rem !important;\n  }\n}\n@media print {\n  .d-print-inline {\n    display: inline !important;\n  }\n  .d-print-inline-block {\n    display: inline-block !important;\n  }\n  .d-print-block {\n    display: block !important;\n  }\n  .d-print-grid {\n    display: grid !important;\n  }\n  .d-print-inline-grid {\n    display: inline-grid !important;\n  }\n  .d-print-table {\n    display: table !important;\n  }\n  .d-print-table-row {\n    display: table-row !important;\n  }\n  .d-print-table-cell {\n    display: table-cell !important;\n  }\n  .d-print-flex {\n    display: flex !important;\n  }\n  .d-print-inline-flex {\n    display: inline-flex !important;\n  }\n  .d-print-none {\n    display: none !important;\n  }\n}\n\n/*# sourceMappingURL=bootstrap-grid.css.map */"
  },
  {
    "path": "dist/css/bootstrap-grid.rtl.css",
    "content": "/*!\n * Bootstrap Grid v5.3.8 (https://getbootstrap.com/)\n * Copyright 2011-2025 The Bootstrap Authors\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n.container,\n.container-fluid,\n.container-xxl,\n.container-xl,\n.container-lg,\n.container-md,\n.container-sm {\n  --bs-gutter-x: 1.5rem;\n  --bs-gutter-y: 0;\n  width: 100%;\n  padding-left: calc(var(--bs-gutter-x) * 0.5);\n  padding-right: calc(var(--bs-gutter-x) * 0.5);\n  margin-left: auto;\n  margin-right: auto;\n}\n\n@media (min-width: 576px) {\n  .container-sm, .container {\n    max-width: 540px;\n  }\n}\n@media (min-width: 768px) {\n  .container-md, .container-sm, .container {\n    max-width: 720px;\n  }\n}\n@media (min-width: 992px) {\n  .container-lg, .container-md, .container-sm, .container {\n    max-width: 960px;\n  }\n}\n@media (min-width: 1200px) {\n  .container-xl, .container-lg, .container-md, .container-sm, .container {\n    max-width: 1140px;\n  }\n}\n@media (min-width: 1400px) {\n  .container-xxl, .container-xl, .container-lg, .container-md, .container-sm, .container {\n    max-width: 1320px;\n  }\n}\n:root {\n  --bs-breakpoint-xs: 0;\n  --bs-breakpoint-sm: 576px;\n  --bs-breakpoint-md: 768px;\n  --bs-breakpoint-lg: 992px;\n  --bs-breakpoint-xl: 1200px;\n  --bs-breakpoint-xxl: 1400px;\n}\n\n.row {\n  --bs-gutter-x: 1.5rem;\n  --bs-gutter-y: 0;\n  display: flex;\n  flex-wrap: wrap;\n  margin-top: calc(-1 * var(--bs-gutter-y));\n  margin-left: calc(-0.5 * var(--bs-gutter-x));\n  margin-right: calc(-0.5 * var(--bs-gutter-x));\n}\n.row > * {\n  box-sizing: border-box;\n  flex-shrink: 0;\n  width: 100%;\n  max-width: 100%;\n  padding-left: calc(var(--bs-gutter-x) * 0.5);\n  padding-right: calc(var(--bs-gutter-x) * 0.5);\n  margin-top: var(--bs-gutter-y);\n}\n\n.col {\n  flex: 1 0 0;\n}\n\n.row-cols-auto > * {\n  flex: 0 0 auto;\n  width: auto;\n}\n\n.row-cols-1 > * {\n  flex: 0 0 auto;\n  width: 100%;\n}\n\n.row-cols-2 > * {\n  flex: 0 0 auto;\n  width: 50%;\n}\n\n.row-cols-3 > * {\n  flex: 0 0 auto;\n  width: 33.33333333%;\n}\n\n.row-cols-4 > * {\n  flex: 0 0 auto;\n  width: 25%;\n}\n\n.row-cols-5 > * {\n  flex: 0 0 auto;\n  width: 20%;\n}\n\n.row-cols-6 > * {\n  flex: 0 0 auto;\n  width: 16.66666667%;\n}\n\n.col-auto {\n  flex: 0 0 auto;\n  width: auto;\n}\n\n.col-1 {\n  flex: 0 0 auto;\n  width: 8.33333333%;\n}\n\n.col-2 {\n  flex: 0 0 auto;\n  width: 16.66666667%;\n}\n\n.col-3 {\n  flex: 0 0 auto;\n  width: 25%;\n}\n\n.col-4 {\n  flex: 0 0 auto;\n  width: 33.33333333%;\n}\n\n.col-5 {\n  flex: 0 0 auto;\n  width: 41.66666667%;\n}\n\n.col-6 {\n  flex: 0 0 auto;\n  width: 50%;\n}\n\n.col-7 {\n  flex: 0 0 auto;\n  width: 58.33333333%;\n}\n\n.col-8 {\n  flex: 0 0 auto;\n  width: 66.66666667%;\n}\n\n.col-9 {\n  flex: 0 0 auto;\n  width: 75%;\n}\n\n.col-10 {\n  flex: 0 0 auto;\n  width: 83.33333333%;\n}\n\n.col-11 {\n  flex: 0 0 auto;\n  width: 91.66666667%;\n}\n\n.col-12 {\n  flex: 0 0 auto;\n  width: 100%;\n}\n\n.offset-1 {\n  margin-right: 8.33333333%;\n}\n\n.offset-2 {\n  margin-right: 16.66666667%;\n}\n\n.offset-3 {\n  margin-right: 25%;\n}\n\n.offset-4 {\n  margin-right: 33.33333333%;\n}\n\n.offset-5 {\n  margin-right: 41.66666667%;\n}\n\n.offset-6 {\n  margin-right: 50%;\n}\n\n.offset-7 {\n  margin-right: 58.33333333%;\n}\n\n.offset-8 {\n  margin-right: 66.66666667%;\n}\n\n.offset-9 {\n  margin-right: 75%;\n}\n\n.offset-10 {\n  margin-right: 83.33333333%;\n}\n\n.offset-11 {\n  margin-right: 91.66666667%;\n}\n\n.g-0,\n.gx-0 {\n  --bs-gutter-x: 0;\n}\n\n.g-0,\n.gy-0 {\n  --bs-gutter-y: 0;\n}\n\n.g-1,\n.gx-1 {\n  --bs-gutter-x: 0.25rem;\n}\n\n.g-1,\n.gy-1 {\n  --bs-gutter-y: 0.25rem;\n}\n\n.g-2,\n.gx-2 {\n  --bs-gutter-x: 0.5rem;\n}\n\n.g-2,\n.gy-2 {\n  --bs-gutter-y: 0.5rem;\n}\n\n.g-3,\n.gx-3 {\n  --bs-gutter-x: 1rem;\n}\n\n.g-3,\n.gy-3 {\n  --bs-gutter-y: 1rem;\n}\n\n.g-4,\n.gx-4 {\n  --bs-gutter-x: 1.5rem;\n}\n\n.g-4,\n.gy-4 {\n  --bs-gutter-y: 1.5rem;\n}\n\n.g-5,\n.gx-5 {\n  --bs-gutter-x: 3rem;\n}\n\n.g-5,\n.gy-5 {\n  --bs-gutter-y: 3rem;\n}\n\n@media (min-width: 576px) {\n  .col-sm {\n    flex: 1 0 0;\n  }\n  .row-cols-sm-auto > * {\n    flex: 0 0 auto;\n    width: auto;\n  }\n  .row-cols-sm-1 > * {\n    flex: 0 0 auto;\n    width: 100%;\n  }\n  .row-cols-sm-2 > * {\n    flex: 0 0 auto;\n    width: 50%;\n  }\n  .row-cols-sm-3 > * {\n    flex: 0 0 auto;\n    width: 33.33333333%;\n  }\n  .row-cols-sm-4 > * {\n    flex: 0 0 auto;\n    width: 25%;\n  }\n  .row-cols-sm-5 > * {\n    flex: 0 0 auto;\n    width: 20%;\n  }\n  .row-cols-sm-6 > * {\n    flex: 0 0 auto;\n    width: 16.66666667%;\n  }\n  .col-sm-auto {\n    flex: 0 0 auto;\n    width: auto;\n  }\n  .col-sm-1 {\n    flex: 0 0 auto;\n    width: 8.33333333%;\n  }\n  .col-sm-2 {\n    flex: 0 0 auto;\n    width: 16.66666667%;\n  }\n  .col-sm-3 {\n    flex: 0 0 auto;\n    width: 25%;\n  }\n  .col-sm-4 {\n    flex: 0 0 auto;\n    width: 33.33333333%;\n  }\n  .col-sm-5 {\n    flex: 0 0 auto;\n    width: 41.66666667%;\n  }\n  .col-sm-6 {\n    flex: 0 0 auto;\n    width: 50%;\n  }\n  .col-sm-7 {\n    flex: 0 0 auto;\n    width: 58.33333333%;\n  }\n  .col-sm-8 {\n    flex: 0 0 auto;\n    width: 66.66666667%;\n  }\n  .col-sm-9 {\n    flex: 0 0 auto;\n    width: 75%;\n  }\n  .col-sm-10 {\n    flex: 0 0 auto;\n    width: 83.33333333%;\n  }\n  .col-sm-11 {\n    flex: 0 0 auto;\n    width: 91.66666667%;\n  }\n  .col-sm-12 {\n    flex: 0 0 auto;\n    width: 100%;\n  }\n  .offset-sm-0 {\n    margin-right: 0;\n  }\n  .offset-sm-1 {\n    margin-right: 8.33333333%;\n  }\n  .offset-sm-2 {\n    margin-right: 16.66666667%;\n  }\n  .offset-sm-3 {\n    margin-right: 25%;\n  }\n  .offset-sm-4 {\n    margin-right: 33.33333333%;\n  }\n  .offset-sm-5 {\n    margin-right: 41.66666667%;\n  }\n  .offset-sm-6 {\n    margin-right: 50%;\n  }\n  .offset-sm-7 {\n    margin-right: 58.33333333%;\n  }\n  .offset-sm-8 {\n    margin-right: 66.66666667%;\n  }\n  .offset-sm-9 {\n    margin-right: 75%;\n  }\n  .offset-sm-10 {\n    margin-right: 83.33333333%;\n  }\n  .offset-sm-11 {\n    margin-right: 91.66666667%;\n  }\n  .g-sm-0,\n  .gx-sm-0 {\n    --bs-gutter-x: 0;\n  }\n  .g-sm-0,\n  .gy-sm-0 {\n    --bs-gutter-y: 0;\n  }\n  .g-sm-1,\n  .gx-sm-1 {\n    --bs-gutter-x: 0.25rem;\n  }\n  .g-sm-1,\n  .gy-sm-1 {\n    --bs-gutter-y: 0.25rem;\n  }\n  .g-sm-2,\n  .gx-sm-2 {\n    --bs-gutter-x: 0.5rem;\n  }\n  .g-sm-2,\n  .gy-sm-2 {\n    --bs-gutter-y: 0.5rem;\n  }\n  .g-sm-3,\n  .gx-sm-3 {\n    --bs-gutter-x: 1rem;\n  }\n  .g-sm-3,\n  .gy-sm-3 {\n    --bs-gutter-y: 1rem;\n  }\n  .g-sm-4,\n  .gx-sm-4 {\n    --bs-gutter-x: 1.5rem;\n  }\n  .g-sm-4,\n  .gy-sm-4 {\n    --bs-gutter-y: 1.5rem;\n  }\n  .g-sm-5,\n  .gx-sm-5 {\n    --bs-gutter-x: 3rem;\n  }\n  .g-sm-5,\n  .gy-sm-5 {\n    --bs-gutter-y: 3rem;\n  }\n}\n@media (min-width: 768px) {\n  .col-md {\n    flex: 1 0 0;\n  }\n  .row-cols-md-auto > * {\n    flex: 0 0 auto;\n    width: auto;\n  }\n  .row-cols-md-1 > * {\n    flex: 0 0 auto;\n    width: 100%;\n  }\n  .row-cols-md-2 > * {\n    flex: 0 0 auto;\n    width: 50%;\n  }\n  .row-cols-md-3 > * {\n    flex: 0 0 auto;\n    width: 33.33333333%;\n  }\n  .row-cols-md-4 > * {\n    flex: 0 0 auto;\n    width: 25%;\n  }\n  .row-cols-md-5 > * {\n    flex: 0 0 auto;\n    width: 20%;\n  }\n  .row-cols-md-6 > * {\n    flex: 0 0 auto;\n    width: 16.66666667%;\n  }\n  .col-md-auto {\n    flex: 0 0 auto;\n    width: auto;\n  }\n  .col-md-1 {\n    flex: 0 0 auto;\n    width: 8.33333333%;\n  }\n  .col-md-2 {\n    flex: 0 0 auto;\n    width: 16.66666667%;\n  }\n  .col-md-3 {\n    flex: 0 0 auto;\n    width: 25%;\n  }\n  .col-md-4 {\n    flex: 0 0 auto;\n    width: 33.33333333%;\n  }\n  .col-md-5 {\n    flex: 0 0 auto;\n    width: 41.66666667%;\n  }\n  .col-md-6 {\n    flex: 0 0 auto;\n    width: 50%;\n  }\n  .col-md-7 {\n    flex: 0 0 auto;\n    width: 58.33333333%;\n  }\n  .col-md-8 {\n    flex: 0 0 auto;\n    width: 66.66666667%;\n  }\n  .col-md-9 {\n    flex: 0 0 auto;\n    width: 75%;\n  }\n  .col-md-10 {\n    flex: 0 0 auto;\n    width: 83.33333333%;\n  }\n  .col-md-11 {\n    flex: 0 0 auto;\n    width: 91.66666667%;\n  }\n  .col-md-12 {\n    flex: 0 0 auto;\n    width: 100%;\n  }\n  .offset-md-0 {\n    margin-right: 0;\n  }\n  .offset-md-1 {\n    margin-right: 8.33333333%;\n  }\n  .offset-md-2 {\n    margin-right: 16.66666667%;\n  }\n  .offset-md-3 {\n    margin-right: 25%;\n  }\n  .offset-md-4 {\n    margin-right: 33.33333333%;\n  }\n  .offset-md-5 {\n    margin-right: 41.66666667%;\n  }\n  .offset-md-6 {\n    margin-right: 50%;\n  }\n  .offset-md-7 {\n    margin-right: 58.33333333%;\n  }\n  .offset-md-8 {\n    margin-right: 66.66666667%;\n  }\n  .offset-md-9 {\n    margin-right: 75%;\n  }\n  .offset-md-10 {\n    margin-right: 83.33333333%;\n  }\n  .offset-md-11 {\n    margin-right: 91.66666667%;\n  }\n  .g-md-0,\n  .gx-md-0 {\n    --bs-gutter-x: 0;\n  }\n  .g-md-0,\n  .gy-md-0 {\n    --bs-gutter-y: 0;\n  }\n  .g-md-1,\n  .gx-md-1 {\n    --bs-gutter-x: 0.25rem;\n  }\n  .g-md-1,\n  .gy-md-1 {\n    --bs-gutter-y: 0.25rem;\n  }\n  .g-md-2,\n  .gx-md-2 {\n    --bs-gutter-x: 0.5rem;\n  }\n  .g-md-2,\n  .gy-md-2 {\n    --bs-gutter-y: 0.5rem;\n  }\n  .g-md-3,\n  .gx-md-3 {\n    --bs-gutter-x: 1rem;\n  }\n  .g-md-3,\n  .gy-md-3 {\n    --bs-gutter-y: 1rem;\n  }\n  .g-md-4,\n  .gx-md-4 {\n    --bs-gutter-x: 1.5rem;\n  }\n  .g-md-4,\n  .gy-md-4 {\n    --bs-gutter-y: 1.5rem;\n  }\n  .g-md-5,\n  .gx-md-5 {\n    --bs-gutter-x: 3rem;\n  }\n  .g-md-5,\n  .gy-md-5 {\n    --bs-gutter-y: 3rem;\n  }\n}\n@media (min-width: 992px) {\n  .col-lg {\n    flex: 1 0 0;\n  }\n  .row-cols-lg-auto > * {\n    flex: 0 0 auto;\n    width: auto;\n  }\n  .row-cols-lg-1 > * {\n    flex: 0 0 auto;\n    width: 100%;\n  }\n  .row-cols-lg-2 > * {\n    flex: 0 0 auto;\n    width: 50%;\n  }\n  .row-cols-lg-3 > * {\n    flex: 0 0 auto;\n    width: 33.33333333%;\n  }\n  .row-cols-lg-4 > * {\n    flex: 0 0 auto;\n    width: 25%;\n  }\n  .row-cols-lg-5 > * {\n    flex: 0 0 auto;\n    width: 20%;\n  }\n  .row-cols-lg-6 > * {\n    flex: 0 0 auto;\n    width: 16.66666667%;\n  }\n  .col-lg-auto {\n    flex: 0 0 auto;\n    width: auto;\n  }\n  .col-lg-1 {\n    flex: 0 0 auto;\n    width: 8.33333333%;\n  }\n  .col-lg-2 {\n    flex: 0 0 auto;\n    width: 16.66666667%;\n  }\n  .col-lg-3 {\n    flex: 0 0 auto;\n    width: 25%;\n  }\n  .col-lg-4 {\n    flex: 0 0 auto;\n    width: 33.33333333%;\n  }\n  .col-lg-5 {\n    flex: 0 0 auto;\n    width: 41.66666667%;\n  }\n  .col-lg-6 {\n    flex: 0 0 auto;\n    width: 50%;\n  }\n  .col-lg-7 {\n    flex: 0 0 auto;\n    width: 58.33333333%;\n  }\n  .col-lg-8 {\n    flex: 0 0 auto;\n    width: 66.66666667%;\n  }\n  .col-lg-9 {\n    flex: 0 0 auto;\n    width: 75%;\n  }\n  .col-lg-10 {\n    flex: 0 0 auto;\n    width: 83.33333333%;\n  }\n  .col-lg-11 {\n    flex: 0 0 auto;\n    width: 91.66666667%;\n  }\n  .col-lg-12 {\n    flex: 0 0 auto;\n    width: 100%;\n  }\n  .offset-lg-0 {\n    margin-right: 0;\n  }\n  .offset-lg-1 {\n    margin-right: 8.33333333%;\n  }\n  .offset-lg-2 {\n    margin-right: 16.66666667%;\n  }\n  .offset-lg-3 {\n    margin-right: 25%;\n  }\n  .offset-lg-4 {\n    margin-right: 33.33333333%;\n  }\n  .offset-lg-5 {\n    margin-right: 41.66666667%;\n  }\n  .offset-lg-6 {\n    margin-right: 50%;\n  }\n  .offset-lg-7 {\n    margin-right: 58.33333333%;\n  }\n  .offset-lg-8 {\n    margin-right: 66.66666667%;\n  }\n  .offset-lg-9 {\n    margin-right: 75%;\n  }\n  .offset-lg-10 {\n    margin-right: 83.33333333%;\n  }\n  .offset-lg-11 {\n    margin-right: 91.66666667%;\n  }\n  .g-lg-0,\n  .gx-lg-0 {\n    --bs-gutter-x: 0;\n  }\n  .g-lg-0,\n  .gy-lg-0 {\n    --bs-gutter-y: 0;\n  }\n  .g-lg-1,\n  .gx-lg-1 {\n    --bs-gutter-x: 0.25rem;\n  }\n  .g-lg-1,\n  .gy-lg-1 {\n    --bs-gutter-y: 0.25rem;\n  }\n  .g-lg-2,\n  .gx-lg-2 {\n    --bs-gutter-x: 0.5rem;\n  }\n  .g-lg-2,\n  .gy-lg-2 {\n    --bs-gutter-y: 0.5rem;\n  }\n  .g-lg-3,\n  .gx-lg-3 {\n    --bs-gutter-x: 1rem;\n  }\n  .g-lg-3,\n  .gy-lg-3 {\n    --bs-gutter-y: 1rem;\n  }\n  .g-lg-4,\n  .gx-lg-4 {\n    --bs-gutter-x: 1.5rem;\n  }\n  .g-lg-4,\n  .gy-lg-4 {\n    --bs-gutter-y: 1.5rem;\n  }\n  .g-lg-5,\n  .gx-lg-5 {\n    --bs-gutter-x: 3rem;\n  }\n  .g-lg-5,\n  .gy-lg-5 {\n    --bs-gutter-y: 3rem;\n  }\n}\n@media (min-width: 1200px) {\n  .col-xl {\n    flex: 1 0 0;\n  }\n  .row-cols-xl-auto > * {\n    flex: 0 0 auto;\n    width: auto;\n  }\n  .row-cols-xl-1 > * {\n    flex: 0 0 auto;\n    width: 100%;\n  }\n  .row-cols-xl-2 > * {\n    flex: 0 0 auto;\n    width: 50%;\n  }\n  .row-cols-xl-3 > * {\n    flex: 0 0 auto;\n    width: 33.33333333%;\n  }\n  .row-cols-xl-4 > * {\n    flex: 0 0 auto;\n    width: 25%;\n  }\n  .row-cols-xl-5 > * {\n    flex: 0 0 auto;\n    width: 20%;\n  }\n  .row-cols-xl-6 > * {\n    flex: 0 0 auto;\n    width: 16.66666667%;\n  }\n  .col-xl-auto {\n    flex: 0 0 auto;\n    width: auto;\n  }\n  .col-xl-1 {\n    flex: 0 0 auto;\n    width: 8.33333333%;\n  }\n  .col-xl-2 {\n    flex: 0 0 auto;\n    width: 16.66666667%;\n  }\n  .col-xl-3 {\n    flex: 0 0 auto;\n    width: 25%;\n  }\n  .col-xl-4 {\n    flex: 0 0 auto;\n    width: 33.33333333%;\n  }\n  .col-xl-5 {\n    flex: 0 0 auto;\n    width: 41.66666667%;\n  }\n  .col-xl-6 {\n    flex: 0 0 auto;\n    width: 50%;\n  }\n  .col-xl-7 {\n    flex: 0 0 auto;\n    width: 58.33333333%;\n  }\n  .col-xl-8 {\n    flex: 0 0 auto;\n    width: 66.66666667%;\n  }\n  .col-xl-9 {\n    flex: 0 0 auto;\n    width: 75%;\n  }\n  .col-xl-10 {\n    flex: 0 0 auto;\n    width: 83.33333333%;\n  }\n  .col-xl-11 {\n    flex: 0 0 auto;\n    width: 91.66666667%;\n  }\n  .col-xl-12 {\n    flex: 0 0 auto;\n    width: 100%;\n  }\n  .offset-xl-0 {\n    margin-right: 0;\n  }\n  .offset-xl-1 {\n    margin-right: 8.33333333%;\n  }\n  .offset-xl-2 {\n    margin-right: 16.66666667%;\n  }\n  .offset-xl-3 {\n    margin-right: 25%;\n  }\n  .offset-xl-4 {\n    margin-right: 33.33333333%;\n  }\n  .offset-xl-5 {\n    margin-right: 41.66666667%;\n  }\n  .offset-xl-6 {\n    margin-right: 50%;\n  }\n  .offset-xl-7 {\n    margin-right: 58.33333333%;\n  }\n  .offset-xl-8 {\n    margin-right: 66.66666667%;\n  }\n  .offset-xl-9 {\n    margin-right: 75%;\n  }\n  .offset-xl-10 {\n    margin-right: 83.33333333%;\n  }\n  .offset-xl-11 {\n    margin-right: 91.66666667%;\n  }\n  .g-xl-0,\n  .gx-xl-0 {\n    --bs-gutter-x: 0;\n  }\n  .g-xl-0,\n  .gy-xl-0 {\n    --bs-gutter-y: 0;\n  }\n  .g-xl-1,\n  .gx-xl-1 {\n    --bs-gutter-x: 0.25rem;\n  }\n  .g-xl-1,\n  .gy-xl-1 {\n    --bs-gutter-y: 0.25rem;\n  }\n  .g-xl-2,\n  .gx-xl-2 {\n    --bs-gutter-x: 0.5rem;\n  }\n  .g-xl-2,\n  .gy-xl-2 {\n    --bs-gutter-y: 0.5rem;\n  }\n  .g-xl-3,\n  .gx-xl-3 {\n    --bs-gutter-x: 1rem;\n  }\n  .g-xl-3,\n  .gy-xl-3 {\n    --bs-gutter-y: 1rem;\n  }\n  .g-xl-4,\n  .gx-xl-4 {\n    --bs-gutter-x: 1.5rem;\n  }\n  .g-xl-4,\n  .gy-xl-4 {\n    --bs-gutter-y: 1.5rem;\n  }\n  .g-xl-5,\n  .gx-xl-5 {\n    --bs-gutter-x: 3rem;\n  }\n  .g-xl-5,\n  .gy-xl-5 {\n    --bs-gutter-y: 3rem;\n  }\n}\n@media (min-width: 1400px) {\n  .col-xxl {\n    flex: 1 0 0;\n  }\n  .row-cols-xxl-auto > * {\n    flex: 0 0 auto;\n    width: auto;\n  }\n  .row-cols-xxl-1 > * {\n    flex: 0 0 auto;\n    width: 100%;\n  }\n  .row-cols-xxl-2 > * {\n    flex: 0 0 auto;\n    width: 50%;\n  }\n  .row-cols-xxl-3 > * {\n    flex: 0 0 auto;\n    width: 33.33333333%;\n  }\n  .row-cols-xxl-4 > * {\n    flex: 0 0 auto;\n    width: 25%;\n  }\n  .row-cols-xxl-5 > * {\n    flex: 0 0 auto;\n    width: 20%;\n  }\n  .row-cols-xxl-6 > * {\n    flex: 0 0 auto;\n    width: 16.66666667%;\n  }\n  .col-xxl-auto {\n    flex: 0 0 auto;\n    width: auto;\n  }\n  .col-xxl-1 {\n    flex: 0 0 auto;\n    width: 8.33333333%;\n  }\n  .col-xxl-2 {\n    flex: 0 0 auto;\n    width: 16.66666667%;\n  }\n  .col-xxl-3 {\n    flex: 0 0 auto;\n    width: 25%;\n  }\n  .col-xxl-4 {\n    flex: 0 0 auto;\n    width: 33.33333333%;\n  }\n  .col-xxl-5 {\n    flex: 0 0 auto;\n    width: 41.66666667%;\n  }\n  .col-xxl-6 {\n    flex: 0 0 auto;\n    width: 50%;\n  }\n  .col-xxl-7 {\n    flex: 0 0 auto;\n    width: 58.33333333%;\n  }\n  .col-xxl-8 {\n    flex: 0 0 auto;\n    width: 66.66666667%;\n  }\n  .col-xxl-9 {\n    flex: 0 0 auto;\n    width: 75%;\n  }\n  .col-xxl-10 {\n    flex: 0 0 auto;\n    width: 83.33333333%;\n  }\n  .col-xxl-11 {\n    flex: 0 0 auto;\n    width: 91.66666667%;\n  }\n  .col-xxl-12 {\n    flex: 0 0 auto;\n    width: 100%;\n  }\n  .offset-xxl-0 {\n    margin-right: 0;\n  }\n  .offset-xxl-1 {\n    margin-right: 8.33333333%;\n  }\n  .offset-xxl-2 {\n    margin-right: 16.66666667%;\n  }\n  .offset-xxl-3 {\n    margin-right: 25%;\n  }\n  .offset-xxl-4 {\n    margin-right: 33.33333333%;\n  }\n  .offset-xxl-5 {\n    margin-right: 41.66666667%;\n  }\n  .offset-xxl-6 {\n    margin-right: 50%;\n  }\n  .offset-xxl-7 {\n    margin-right: 58.33333333%;\n  }\n  .offset-xxl-8 {\n    margin-right: 66.66666667%;\n  }\n  .offset-xxl-9 {\n    margin-right: 75%;\n  }\n  .offset-xxl-10 {\n    margin-right: 83.33333333%;\n  }\n  .offset-xxl-11 {\n    margin-right: 91.66666667%;\n  }\n  .g-xxl-0,\n  .gx-xxl-0 {\n    --bs-gutter-x: 0;\n  }\n  .g-xxl-0,\n  .gy-xxl-0 {\n    --bs-gutter-y: 0;\n  }\n  .g-xxl-1,\n  .gx-xxl-1 {\n    --bs-gutter-x: 0.25rem;\n  }\n  .g-xxl-1,\n  .gy-xxl-1 {\n    --bs-gutter-y: 0.25rem;\n  }\n  .g-xxl-2,\n  .gx-xxl-2 {\n    --bs-gutter-x: 0.5rem;\n  }\n  .g-xxl-2,\n  .gy-xxl-2 {\n    --bs-gutter-y: 0.5rem;\n  }\n  .g-xxl-3,\n  .gx-xxl-3 {\n    --bs-gutter-x: 1rem;\n  }\n  .g-xxl-3,\n  .gy-xxl-3 {\n    --bs-gutter-y: 1rem;\n  }\n  .g-xxl-4,\n  .gx-xxl-4 {\n    --bs-gutter-x: 1.5rem;\n  }\n  .g-xxl-4,\n  .gy-xxl-4 {\n    --bs-gutter-y: 1.5rem;\n  }\n  .g-xxl-5,\n  .gx-xxl-5 {\n    --bs-gutter-x: 3rem;\n  }\n  .g-xxl-5,\n  .gy-xxl-5 {\n    --bs-gutter-y: 3rem;\n  }\n}\n.d-inline {\n  display: inline !important;\n}\n\n.d-inline-block {\n  display: inline-block !important;\n}\n\n.d-block {\n  display: block !important;\n}\n\n.d-grid {\n  display: grid !important;\n}\n\n.d-inline-grid {\n  display: inline-grid !important;\n}\n\n.d-table {\n  display: table !important;\n}\n\n.d-table-row {\n  display: table-row !important;\n}\n\n.d-table-cell {\n  display: table-cell !important;\n}\n\n.d-flex {\n  display: flex !important;\n}\n\n.d-inline-flex {\n  display: inline-flex !important;\n}\n\n.d-none {\n  display: none !important;\n}\n\n.flex-fill {\n  flex: 1 1 auto !important;\n}\n\n.flex-row {\n  flex-direction: row !important;\n}\n\n.flex-column {\n  flex-direction: column !important;\n}\n\n.flex-row-reverse {\n  flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n  flex-direction: column-reverse !important;\n}\n\n.flex-grow-0 {\n  flex-grow: 0 !important;\n}\n\n.flex-grow-1 {\n  flex-grow: 1 !important;\n}\n\n.flex-shrink-0 {\n  flex-shrink: 0 !important;\n}\n\n.flex-shrink-1 {\n  flex-shrink: 1 !important;\n}\n\n.flex-wrap {\n  flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n  flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n  flex-wrap: wrap-reverse !important;\n}\n\n.justify-content-start {\n  justify-content: flex-start !important;\n}\n\n.justify-content-end {\n  justify-content: flex-end !important;\n}\n\n.justify-content-center {\n  justify-content: center !important;\n}\n\n.justify-content-between {\n  justify-content: space-between !important;\n}\n\n.justify-content-around {\n  justify-content: space-around !important;\n}\n\n.justify-content-evenly {\n  justify-content: space-evenly !important;\n}\n\n.align-items-start {\n  align-items: flex-start !important;\n}\n\n.align-items-end {\n  align-items: flex-end !important;\n}\n\n.align-items-center {\n  align-items: center !important;\n}\n\n.align-items-baseline {\n  align-items: baseline !important;\n}\n\n.align-items-stretch {\n  align-items: stretch !important;\n}\n\n.align-content-start {\n  align-content: flex-start !important;\n}\n\n.align-content-end {\n  align-content: flex-end !important;\n}\n\n.align-content-center {\n  align-content: center !important;\n}\n\n.align-content-between {\n  align-content: space-between !important;\n}\n\n.align-content-around {\n  align-content: space-around !important;\n}\n\n.align-content-stretch {\n  align-content: stretch !important;\n}\n\n.align-self-auto {\n  align-self: auto !important;\n}\n\n.align-self-start {\n  align-self: flex-start !important;\n}\n\n.align-self-end {\n  align-self: flex-end !important;\n}\n\n.align-self-center {\n  align-self: center !important;\n}\n\n.align-self-baseline {\n  align-self: baseline !important;\n}\n\n.align-self-stretch {\n  align-self: stretch !important;\n}\n\n.order-first {\n  order: -1 !important;\n}\n\n.order-0 {\n  order: 0 !important;\n}\n\n.order-1 {\n  order: 1 !important;\n}\n\n.order-2 {\n  order: 2 !important;\n}\n\n.order-3 {\n  order: 3 !important;\n}\n\n.order-4 {\n  order: 4 !important;\n}\n\n.order-5 {\n  order: 5 !important;\n}\n\n.order-last {\n  order: 6 !important;\n}\n\n.m-0 {\n  margin: 0 !important;\n}\n\n.m-1 {\n  margin: 0.25rem !important;\n}\n\n.m-2 {\n  margin: 0.5rem !important;\n}\n\n.m-3 {\n  margin: 1rem !important;\n}\n\n.m-4 {\n  margin: 1.5rem !important;\n}\n\n.m-5 {\n  margin: 3rem !important;\n}\n\n.m-auto {\n  margin: auto !important;\n}\n\n.mx-0 {\n  margin-left: 0 !important;\n  margin-right: 0 !important;\n}\n\n.mx-1 {\n  margin-left: 0.25rem !important;\n  margin-right: 0.25rem !important;\n}\n\n.mx-2 {\n  margin-left: 0.5rem !important;\n  margin-right: 0.5rem !important;\n}\n\n.mx-3 {\n  margin-left: 1rem !important;\n  margin-right: 1rem !important;\n}\n\n.mx-4 {\n  margin-left: 1.5rem !important;\n  margin-right: 1.5rem !important;\n}\n\n.mx-5 {\n  margin-left: 3rem !important;\n  margin-right: 3rem !important;\n}\n\n.mx-auto {\n  margin-left: auto !important;\n  margin-right: auto !important;\n}\n\n.my-0 {\n  margin-top: 0 !important;\n  margin-bottom: 0 !important;\n}\n\n.my-1 {\n  margin-top: 0.25rem !important;\n  margin-bottom: 0.25rem !important;\n}\n\n.my-2 {\n  margin-top: 0.5rem !important;\n  margin-bottom: 0.5rem !important;\n}\n\n.my-3 {\n  margin-top: 1rem !important;\n  margin-bottom: 1rem !important;\n}\n\n.my-4 {\n  margin-top: 1.5rem !important;\n  margin-bottom: 1.5rem !important;\n}\n\n.my-5 {\n  margin-top: 3rem !important;\n  margin-bottom: 3rem !important;\n}\n\n.my-auto {\n  margin-top: auto !important;\n  margin-bottom: auto !important;\n}\n\n.mt-0 {\n  margin-top: 0 !important;\n}\n\n.mt-1 {\n  margin-top: 0.25rem !important;\n}\n\n.mt-2 {\n  margin-top: 0.5rem !important;\n}\n\n.mt-3 {\n  margin-top: 1rem !important;\n}\n\n.mt-4 {\n  margin-top: 1.5rem !important;\n}\n\n.mt-5 {\n  margin-top: 3rem !important;\n}\n\n.mt-auto {\n  margin-top: auto !important;\n}\n\n.me-0 {\n  margin-left: 0 !important;\n}\n\n.me-1 {\n  margin-left: 0.25rem !important;\n}\n\n.me-2 {\n  margin-left: 0.5rem !important;\n}\n\n.me-3 {\n  margin-left: 1rem !important;\n}\n\n.me-4 {\n  margin-left: 1.5rem !important;\n}\n\n.me-5 {\n  margin-left: 3rem !important;\n}\n\n.me-auto {\n  margin-left: auto !important;\n}\n\n.mb-0 {\n  margin-bottom: 0 !important;\n}\n\n.mb-1 {\n  margin-bottom: 0.25rem !important;\n}\n\n.mb-2 {\n  margin-bottom: 0.5rem !important;\n}\n\n.mb-3 {\n  margin-bottom: 1rem !important;\n}\n\n.mb-4 {\n  margin-bottom: 1.5rem !important;\n}\n\n.mb-5 {\n  margin-bottom: 3rem !important;\n}\n\n.mb-auto {\n  margin-bottom: auto !important;\n}\n\n.ms-0 {\n  margin-right: 0 !important;\n}\n\n.ms-1 {\n  margin-right: 0.25rem !important;\n}\n\n.ms-2 {\n  margin-right: 0.5rem !important;\n}\n\n.ms-3 {\n  margin-right: 1rem !important;\n}\n\n.ms-4 {\n  margin-right: 1.5rem !important;\n}\n\n.ms-5 {\n  margin-right: 3rem !important;\n}\n\n.ms-auto {\n  margin-right: auto !important;\n}\n\n.p-0 {\n  padding: 0 !important;\n}\n\n.p-1 {\n  padding: 0.25rem !important;\n}\n\n.p-2 {\n  padding: 0.5rem !important;\n}\n\n.p-3 {\n  padding: 1rem !important;\n}\n\n.p-4 {\n  padding: 1.5rem !important;\n}\n\n.p-5 {\n  padding: 3rem !important;\n}\n\n.px-0 {\n  padding-left: 0 !important;\n  padding-right: 0 !important;\n}\n\n.px-1 {\n  padding-left: 0.25rem !important;\n  padding-right: 0.25rem !important;\n}\n\n.px-2 {\n  padding-left: 0.5rem !important;\n  padding-right: 0.5rem !important;\n}\n\n.px-3 {\n  padding-left: 1rem !important;\n  padding-right: 1rem !important;\n}\n\n.px-4 {\n  padding-left: 1.5rem !important;\n  padding-right: 1.5rem !important;\n}\n\n.px-5 {\n  padding-left: 3rem !important;\n  padding-right: 3rem !important;\n}\n\n.py-0 {\n  padding-top: 0 !important;\n  padding-bottom: 0 !important;\n}\n\n.py-1 {\n  padding-top: 0.25rem !important;\n  padding-bottom: 0.25rem !important;\n}\n\n.py-2 {\n  padding-top: 0.5rem !important;\n  padding-bottom: 0.5rem !important;\n}\n\n.py-3 {\n  padding-top: 1rem !important;\n  padding-bottom: 1rem !important;\n}\n\n.py-4 {\n  padding-top: 1.5rem !important;\n  padding-bottom: 1.5rem !important;\n}\n\n.py-5 {\n  padding-top: 3rem !important;\n  padding-bottom: 3rem !important;\n}\n\n.pt-0 {\n  padding-top: 0 !important;\n}\n\n.pt-1 {\n  padding-top: 0.25rem !important;\n}\n\n.pt-2 {\n  padding-top: 0.5rem !important;\n}\n\n.pt-3 {\n  padding-top: 1rem !important;\n}\n\n.pt-4 {\n  padding-top: 1.5rem !important;\n}\n\n.pt-5 {\n  padding-top: 3rem !important;\n}\n\n.pe-0 {\n  padding-left: 0 !important;\n}\n\n.pe-1 {\n  padding-left: 0.25rem !important;\n}\n\n.pe-2 {\n  padding-left: 0.5rem !important;\n}\n\n.pe-3 {\n  padding-left: 1rem !important;\n}\n\n.pe-4 {\n  padding-left: 1.5rem !important;\n}\n\n.pe-5 {\n  padding-left: 3rem !important;\n}\n\n.pb-0 {\n  padding-bottom: 0 !important;\n}\n\n.pb-1 {\n  padding-bottom: 0.25rem !important;\n}\n\n.pb-2 {\n  padding-bottom: 0.5rem !important;\n}\n\n.pb-3 {\n  padding-bottom: 1rem !important;\n}\n\n.pb-4 {\n  padding-bottom: 1.5rem !important;\n}\n\n.pb-5 {\n  padding-bottom: 3rem !important;\n}\n\n.ps-0 {\n  padding-right: 0 !important;\n}\n\n.ps-1 {\n  padding-right: 0.25rem !important;\n}\n\n.ps-2 {\n  padding-right: 0.5rem !important;\n}\n\n.ps-3 {\n  padding-right: 1rem !important;\n}\n\n.ps-4 {\n  padding-right: 1.5rem !important;\n}\n\n.ps-5 {\n  padding-right: 3rem !important;\n}\n\n@media (min-width: 576px) {\n  .d-sm-inline {\n    display: inline !important;\n  }\n  .d-sm-inline-block {\n    display: inline-block !important;\n  }\n  .d-sm-block {\n    display: block !important;\n  }\n  .d-sm-grid {\n    display: grid !important;\n  }\n  .d-sm-inline-grid {\n    display: inline-grid !important;\n  }\n  .d-sm-table {\n    display: table !important;\n  }\n  .d-sm-table-row {\n    display: table-row !important;\n  }\n  .d-sm-table-cell {\n    display: table-cell !important;\n  }\n  .d-sm-flex {\n    display: flex !important;\n  }\n  .d-sm-inline-flex {\n    display: inline-flex !important;\n  }\n  .d-sm-none {\n    display: none !important;\n  }\n  .flex-sm-fill {\n    flex: 1 1 auto !important;\n  }\n  .flex-sm-row {\n    flex-direction: row !important;\n  }\n  .flex-sm-column {\n    flex-direction: column !important;\n  }\n  .flex-sm-row-reverse {\n    flex-direction: row-reverse !important;\n  }\n  .flex-sm-column-reverse {\n    flex-direction: column-reverse !important;\n  }\n  .flex-sm-grow-0 {\n    flex-grow: 0 !important;\n  }\n  .flex-sm-grow-1 {\n    flex-grow: 1 !important;\n  }\n  .flex-sm-shrink-0 {\n    flex-shrink: 0 !important;\n  }\n  .flex-sm-shrink-1 {\n    flex-shrink: 1 !important;\n  }\n  .flex-sm-wrap {\n    flex-wrap: wrap !important;\n  }\n  .flex-sm-nowrap {\n    flex-wrap: nowrap !important;\n  }\n  .flex-sm-wrap-reverse {\n    flex-wrap: wrap-reverse !important;\n  }\n  .justify-content-sm-start {\n    justify-content: flex-start !important;\n  }\n  .justify-content-sm-end {\n    justify-content: flex-end !important;\n  }\n  .justify-content-sm-center {\n    justify-content: center !important;\n  }\n  .justify-content-sm-between {\n    justify-content: space-between !important;\n  }\n  .justify-content-sm-around {\n    justify-content: space-around !important;\n  }\n  .justify-content-sm-evenly {\n    justify-content: space-evenly !important;\n  }\n  .align-items-sm-start {\n    align-items: flex-start !important;\n  }\n  .align-items-sm-end {\n    align-items: flex-end !important;\n  }\n  .align-items-sm-center {\n    align-items: center !important;\n  }\n  .align-items-sm-baseline {\n    align-items: baseline !important;\n  }\n  .align-items-sm-stretch {\n    align-items: stretch !important;\n  }\n  .align-content-sm-start {\n    align-content: flex-start !important;\n  }\n  .align-content-sm-end {\n    align-content: flex-end !important;\n  }\n  .align-content-sm-center {\n    align-content: center !important;\n  }\n  .align-content-sm-between {\n    align-content: space-between !important;\n  }\n  .align-content-sm-around {\n    align-content: space-around !important;\n  }\n  .align-content-sm-stretch {\n    align-content: stretch !important;\n  }\n  .align-self-sm-auto {\n    align-self: auto !important;\n  }\n  .align-self-sm-start {\n    align-self: flex-start !important;\n  }\n  .align-self-sm-end {\n    align-self: flex-end !important;\n  }\n  .align-self-sm-center {\n    align-self: center !important;\n  }\n  .align-self-sm-baseline {\n    align-self: baseline !important;\n  }\n  .align-self-sm-stretch {\n    align-self: stretch !important;\n  }\n  .order-sm-first {\n    order: -1 !important;\n  }\n  .order-sm-0 {\n    order: 0 !important;\n  }\n  .order-sm-1 {\n    order: 1 !important;\n  }\n  .order-sm-2 {\n    order: 2 !important;\n  }\n  .order-sm-3 {\n    order: 3 !important;\n  }\n  .order-sm-4 {\n    order: 4 !important;\n  }\n  .order-sm-5 {\n    order: 5 !important;\n  }\n  .order-sm-last {\n    order: 6 !important;\n  }\n  .m-sm-0 {\n    margin: 0 !important;\n  }\n  .m-sm-1 {\n    margin: 0.25rem !important;\n  }\n  .m-sm-2 {\n    margin: 0.5rem !important;\n  }\n  .m-sm-3 {\n    margin: 1rem !important;\n  }\n  .m-sm-4 {\n    margin: 1.5rem !important;\n  }\n  .m-sm-5 {\n    margin: 3rem !important;\n  }\n  .m-sm-auto {\n    margin: auto !important;\n  }\n  .mx-sm-0 {\n    margin-left: 0 !important;\n    margin-right: 0 !important;\n  }\n  .mx-sm-1 {\n    margin-left: 0.25rem !important;\n    margin-right: 0.25rem !important;\n  }\n  .mx-sm-2 {\n    margin-left: 0.5rem !important;\n    margin-right: 0.5rem !important;\n  }\n  .mx-sm-3 {\n    margin-left: 1rem !important;\n    margin-right: 1rem !important;\n  }\n  .mx-sm-4 {\n    margin-left: 1.5rem !important;\n    margin-right: 1.5rem !important;\n  }\n  .mx-sm-5 {\n    margin-left: 3rem !important;\n    margin-right: 3rem !important;\n  }\n  .mx-sm-auto {\n    margin-left: auto !important;\n    margin-right: auto !important;\n  }\n  .my-sm-0 {\n    margin-top: 0 !important;\n    margin-bottom: 0 !important;\n  }\n  .my-sm-1 {\n    margin-top: 0.25rem !important;\n    margin-bottom: 0.25rem !important;\n  }\n  .my-sm-2 {\n    margin-top: 0.5rem !important;\n    margin-bottom: 0.5rem !important;\n  }\n  .my-sm-3 {\n    margin-top: 1rem !important;\n    margin-bottom: 1rem !important;\n  }\n  .my-sm-4 {\n    margin-top: 1.5rem !important;\n    margin-bottom: 1.5rem !important;\n  }\n  .my-sm-5 {\n    margin-top: 3rem !important;\n    margin-bottom: 3rem !important;\n  }\n  .my-sm-auto {\n    margin-top: auto !important;\n    margin-bottom: auto !important;\n  }\n  .mt-sm-0 {\n    margin-top: 0 !important;\n  }\n  .mt-sm-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mt-sm-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mt-sm-3 {\n    margin-top: 1rem !important;\n  }\n  .mt-sm-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mt-sm-5 {\n    margin-top: 3rem !important;\n  }\n  .mt-sm-auto {\n    margin-top: auto !important;\n  }\n  .me-sm-0 {\n    margin-left: 0 !important;\n  }\n  .me-sm-1 {\n    margin-left: 0.25rem !important;\n  }\n  .me-sm-2 {\n    margin-left: 0.5rem !important;\n  }\n  .me-sm-3 {\n    margin-left: 1rem !important;\n  }\n  .me-sm-4 {\n    margin-left: 1.5rem !important;\n  }\n  .me-sm-5 {\n    margin-left: 3rem !important;\n  }\n  .me-sm-auto {\n    margin-left: auto !important;\n  }\n  .mb-sm-0 {\n    margin-bottom: 0 !important;\n  }\n  .mb-sm-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .mb-sm-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .mb-sm-3 {\n    margin-bottom: 1rem !important;\n  }\n  .mb-sm-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .mb-sm-5 {\n    margin-bottom: 3rem !important;\n  }\n  .mb-sm-auto {\n    margin-bottom: auto !important;\n  }\n  .ms-sm-0 {\n    margin-right: 0 !important;\n  }\n  .ms-sm-1 {\n    margin-right: 0.25rem !important;\n  }\n  .ms-sm-2 {\n    margin-right: 0.5rem !important;\n  }\n  .ms-sm-3 {\n    margin-right: 1rem !important;\n  }\n  .ms-sm-4 {\n    margin-right: 1.5rem !important;\n  }\n  .ms-sm-5 {\n    margin-right: 3rem !important;\n  }\n  .ms-sm-auto {\n    margin-right: auto !important;\n  }\n  .p-sm-0 {\n    padding: 0 !important;\n  }\n  .p-sm-1 {\n    padding: 0.25rem !important;\n  }\n  .p-sm-2 {\n    padding: 0.5rem !important;\n  }\n  .p-sm-3 {\n    padding: 1rem !important;\n  }\n  .p-sm-4 {\n    padding: 1.5rem !important;\n  }\n  .p-sm-5 {\n    padding: 3rem !important;\n  }\n  .px-sm-0 {\n    padding-left: 0 !important;\n    padding-right: 0 !important;\n  }\n  .px-sm-1 {\n    padding-left: 0.25rem !important;\n    padding-right: 0.25rem !important;\n  }\n  .px-sm-2 {\n    padding-left: 0.5rem !important;\n    padding-right: 0.5rem !important;\n  }\n  .px-sm-3 {\n    padding-left: 1rem !important;\n    padding-right: 1rem !important;\n  }\n  .px-sm-4 {\n    padding-left: 1.5rem !important;\n    padding-right: 1.5rem !important;\n  }\n  .px-sm-5 {\n    padding-left: 3rem !important;\n    padding-right: 3rem !important;\n  }\n  .py-sm-0 {\n    padding-top: 0 !important;\n    padding-bottom: 0 !important;\n  }\n  .py-sm-1 {\n    padding-top: 0.25rem !important;\n    padding-bottom: 0.25rem !important;\n  }\n  .py-sm-2 {\n    padding-top: 0.5rem !important;\n    padding-bottom: 0.5rem !important;\n  }\n  .py-sm-3 {\n    padding-top: 1rem !important;\n    padding-bottom: 1rem !important;\n  }\n  .py-sm-4 {\n    padding-top: 1.5rem !important;\n    padding-bottom: 1.5rem !important;\n  }\n  .py-sm-5 {\n    padding-top: 3rem !important;\n    padding-bottom: 3rem !important;\n  }\n  .pt-sm-0 {\n    padding-top: 0 !important;\n  }\n  .pt-sm-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pt-sm-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pt-sm-3 {\n    padding-top: 1rem !important;\n  }\n  .pt-sm-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pt-sm-5 {\n    padding-top: 3rem !important;\n  }\n  .pe-sm-0 {\n    padding-left: 0 !important;\n  }\n  .pe-sm-1 {\n    padding-left: 0.25rem !important;\n  }\n  .pe-sm-2 {\n    padding-left: 0.5rem !important;\n  }\n  .pe-sm-3 {\n    padding-left: 1rem !important;\n  }\n  .pe-sm-4 {\n    padding-left: 1.5rem !important;\n  }\n  .pe-sm-5 {\n    padding-left: 3rem !important;\n  }\n  .pb-sm-0 {\n    padding-bottom: 0 !important;\n  }\n  .pb-sm-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pb-sm-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pb-sm-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pb-sm-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pb-sm-5 {\n    padding-bottom: 3rem !important;\n  }\n  .ps-sm-0 {\n    padding-right: 0 !important;\n  }\n  .ps-sm-1 {\n    padding-right: 0.25rem !important;\n  }\n  .ps-sm-2 {\n    padding-right: 0.5rem !important;\n  }\n  .ps-sm-3 {\n    padding-right: 1rem !important;\n  }\n  .ps-sm-4 {\n    padding-right: 1.5rem !important;\n  }\n  .ps-sm-5 {\n    padding-right: 3rem !important;\n  }\n}\n@media (min-width: 768px) {\n  .d-md-inline {\n    display: inline !important;\n  }\n  .d-md-inline-block {\n    display: inline-block !important;\n  }\n  .d-md-block {\n    display: block !important;\n  }\n  .d-md-grid {\n    display: grid !important;\n  }\n  .d-md-inline-grid {\n    display: inline-grid !important;\n  }\n  .d-md-table {\n    display: table !important;\n  }\n  .d-md-table-row {\n    display: table-row !important;\n  }\n  .d-md-table-cell {\n    display: table-cell !important;\n  }\n  .d-md-flex {\n    display: flex !important;\n  }\n  .d-md-inline-flex {\n    display: inline-flex !important;\n  }\n  .d-md-none {\n    display: none !important;\n  }\n  .flex-md-fill {\n    flex: 1 1 auto !important;\n  }\n  .flex-md-row {\n    flex-direction: row !important;\n  }\n  .flex-md-column {\n    flex-direction: column !important;\n  }\n  .flex-md-row-reverse {\n    flex-direction: row-reverse !important;\n  }\n  .flex-md-column-reverse {\n    flex-direction: column-reverse !important;\n  }\n  .flex-md-grow-0 {\n    flex-grow: 0 !important;\n  }\n  .flex-md-grow-1 {\n    flex-grow: 1 !important;\n  }\n  .flex-md-shrink-0 {\n    flex-shrink: 0 !important;\n  }\n  .flex-md-shrink-1 {\n    flex-shrink: 1 !important;\n  }\n  .flex-md-wrap {\n    flex-wrap: wrap !important;\n  }\n  .flex-md-nowrap {\n    flex-wrap: nowrap !important;\n  }\n  .flex-md-wrap-reverse {\n    flex-wrap: wrap-reverse !important;\n  }\n  .justify-content-md-start {\n    justify-content: flex-start !important;\n  }\n  .justify-content-md-end {\n    justify-content: flex-end !important;\n  }\n  .justify-content-md-center {\n    justify-content: center !important;\n  }\n  .justify-content-md-between {\n    justify-content: space-between !important;\n  }\n  .justify-content-md-around {\n    justify-content: space-around !important;\n  }\n  .justify-content-md-evenly {\n    justify-content: space-evenly !important;\n  }\n  .align-items-md-start {\n    align-items: flex-start !important;\n  }\n  .align-items-md-end {\n    align-items: flex-end !important;\n  }\n  .align-items-md-center {\n    align-items: center !important;\n  }\n  .align-items-md-baseline {\n    align-items: baseline !important;\n  }\n  .align-items-md-stretch {\n    align-items: stretch !important;\n  }\n  .align-content-md-start {\n    align-content: flex-start !important;\n  }\n  .align-content-md-end {\n    align-content: flex-end !important;\n  }\n  .align-content-md-center {\n    align-content: center !important;\n  }\n  .align-content-md-between {\n    align-content: space-between !important;\n  }\n  .align-content-md-around {\n    align-content: space-around !important;\n  }\n  .align-content-md-stretch {\n    align-content: stretch !important;\n  }\n  .align-self-md-auto {\n    align-self: auto !important;\n  }\n  .align-self-md-start {\n    align-self: flex-start !important;\n  }\n  .align-self-md-end {\n    align-self: flex-end !important;\n  }\n  .align-self-md-center {\n    align-self: center !important;\n  }\n  .align-self-md-baseline {\n    align-self: baseline !important;\n  }\n  .align-self-md-stretch {\n    align-self: stretch !important;\n  }\n  .order-md-first {\n    order: -1 !important;\n  }\n  .order-md-0 {\n    order: 0 !important;\n  }\n  .order-md-1 {\n    order: 1 !important;\n  }\n  .order-md-2 {\n    order: 2 !important;\n  }\n  .order-md-3 {\n    order: 3 !important;\n  }\n  .order-md-4 {\n    order: 4 !important;\n  }\n  .order-md-5 {\n    order: 5 !important;\n  }\n  .order-md-last {\n    order: 6 !important;\n  }\n  .m-md-0 {\n    margin: 0 !important;\n  }\n  .m-md-1 {\n    margin: 0.25rem !important;\n  }\n  .m-md-2 {\n    margin: 0.5rem !important;\n  }\n  .m-md-3 {\n    margin: 1rem !important;\n  }\n  .m-md-4 {\n    margin: 1.5rem !important;\n  }\n  .m-md-5 {\n    margin: 3rem !important;\n  }\n  .m-md-auto {\n    margin: auto !important;\n  }\n  .mx-md-0 {\n    margin-left: 0 !important;\n    margin-right: 0 !important;\n  }\n  .mx-md-1 {\n    margin-left: 0.25rem !important;\n    margin-right: 0.25rem !important;\n  }\n  .mx-md-2 {\n    margin-left: 0.5rem !important;\n    margin-right: 0.5rem !important;\n  }\n  .mx-md-3 {\n    margin-left: 1rem !important;\n    margin-right: 1rem !important;\n  }\n  .mx-md-4 {\n    margin-left: 1.5rem !important;\n    margin-right: 1.5rem !important;\n  }\n  .mx-md-5 {\n    margin-left: 3rem !important;\n    margin-right: 3rem !important;\n  }\n  .mx-md-auto {\n    margin-left: auto !important;\n    margin-right: auto !important;\n  }\n  .my-md-0 {\n    margin-top: 0 !important;\n    margin-bottom: 0 !important;\n  }\n  .my-md-1 {\n    margin-top: 0.25rem !important;\n    margin-bottom: 0.25rem !important;\n  }\n  .my-md-2 {\n    margin-top: 0.5rem !important;\n    margin-bottom: 0.5rem !important;\n  }\n  .my-md-3 {\n    margin-top: 1rem !important;\n    margin-bottom: 1rem !important;\n  }\n  .my-md-4 {\n    margin-top: 1.5rem !important;\n    margin-bottom: 1.5rem !important;\n  }\n  .my-md-5 {\n    margin-top: 3rem !important;\n    margin-bottom: 3rem !important;\n  }\n  .my-md-auto {\n    margin-top: auto !important;\n    margin-bottom: auto !important;\n  }\n  .mt-md-0 {\n    margin-top: 0 !important;\n  }\n  .mt-md-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mt-md-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mt-md-3 {\n    margin-top: 1rem !important;\n  }\n  .mt-md-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mt-md-5 {\n    margin-top: 3rem !important;\n  }\n  .mt-md-auto {\n    margin-top: auto !important;\n  }\n  .me-md-0 {\n    margin-left: 0 !important;\n  }\n  .me-md-1 {\n    margin-left: 0.25rem !important;\n  }\n  .me-md-2 {\n    margin-left: 0.5rem !important;\n  }\n  .me-md-3 {\n    margin-left: 1rem !important;\n  }\n  .me-md-4 {\n    margin-left: 1.5rem !important;\n  }\n  .me-md-5 {\n    margin-left: 3rem !important;\n  }\n  .me-md-auto {\n    margin-left: auto !important;\n  }\n  .mb-md-0 {\n    margin-bottom: 0 !important;\n  }\n  .mb-md-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .mb-md-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .mb-md-3 {\n    margin-bottom: 1rem !important;\n  }\n  .mb-md-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .mb-md-5 {\n    margin-bottom: 3rem !important;\n  }\n  .mb-md-auto {\n    margin-bottom: auto !important;\n  }\n  .ms-md-0 {\n    margin-right: 0 !important;\n  }\n  .ms-md-1 {\n    margin-right: 0.25rem !important;\n  }\n  .ms-md-2 {\n    margin-right: 0.5rem !important;\n  }\n  .ms-md-3 {\n    margin-right: 1rem !important;\n  }\n  .ms-md-4 {\n    margin-right: 1.5rem !important;\n  }\n  .ms-md-5 {\n    margin-right: 3rem !important;\n  }\n  .ms-md-auto {\n    margin-right: auto !important;\n  }\n  .p-md-0 {\n    padding: 0 !important;\n  }\n  .p-md-1 {\n    padding: 0.25rem !important;\n  }\n  .p-md-2 {\n    padding: 0.5rem !important;\n  }\n  .p-md-3 {\n    padding: 1rem !important;\n  }\n  .p-md-4 {\n    padding: 1.5rem !important;\n  }\n  .p-md-5 {\n    padding: 3rem !important;\n  }\n  .px-md-0 {\n    padding-left: 0 !important;\n    padding-right: 0 !important;\n  }\n  .px-md-1 {\n    padding-left: 0.25rem !important;\n    padding-right: 0.25rem !important;\n  }\n  .px-md-2 {\n    padding-left: 0.5rem !important;\n    padding-right: 0.5rem !important;\n  }\n  .px-md-3 {\n    padding-left: 1rem !important;\n    padding-right: 1rem !important;\n  }\n  .px-md-4 {\n    padding-left: 1.5rem !important;\n    padding-right: 1.5rem !important;\n  }\n  .px-md-5 {\n    padding-left: 3rem !important;\n    padding-right: 3rem !important;\n  }\n  .py-md-0 {\n    padding-top: 0 !important;\n    padding-bottom: 0 !important;\n  }\n  .py-md-1 {\n    padding-top: 0.25rem !important;\n    padding-bottom: 0.25rem !important;\n  }\n  .py-md-2 {\n    padding-top: 0.5rem !important;\n    padding-bottom: 0.5rem !important;\n  }\n  .py-md-3 {\n    padding-top: 1rem !important;\n    padding-bottom: 1rem !important;\n  }\n  .py-md-4 {\n    padding-top: 1.5rem !important;\n    padding-bottom: 1.5rem !important;\n  }\n  .py-md-5 {\n    padding-top: 3rem !important;\n    padding-bottom: 3rem !important;\n  }\n  .pt-md-0 {\n    padding-top: 0 !important;\n  }\n  .pt-md-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pt-md-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pt-md-3 {\n    padding-top: 1rem !important;\n  }\n  .pt-md-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pt-md-5 {\n    padding-top: 3rem !important;\n  }\n  .pe-md-0 {\n    padding-left: 0 !important;\n  }\n  .pe-md-1 {\n    padding-left: 0.25rem !important;\n  }\n  .pe-md-2 {\n    padding-left: 0.5rem !important;\n  }\n  .pe-md-3 {\n    padding-left: 1rem !important;\n  }\n  .pe-md-4 {\n    padding-left: 1.5rem !important;\n  }\n  .pe-md-5 {\n    padding-left: 3rem !important;\n  }\n  .pb-md-0 {\n    padding-bottom: 0 !important;\n  }\n  .pb-md-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pb-md-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pb-md-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pb-md-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pb-md-5 {\n    padding-bottom: 3rem !important;\n  }\n  .ps-md-0 {\n    padding-right: 0 !important;\n  }\n  .ps-md-1 {\n    padding-right: 0.25rem !important;\n  }\n  .ps-md-2 {\n    padding-right: 0.5rem !important;\n  }\n  .ps-md-3 {\n    padding-right: 1rem !important;\n  }\n  .ps-md-4 {\n    padding-right: 1.5rem !important;\n  }\n  .ps-md-5 {\n    padding-right: 3rem !important;\n  }\n}\n@media (min-width: 992px) {\n  .d-lg-inline {\n    display: inline !important;\n  }\n  .d-lg-inline-block {\n    display: inline-block !important;\n  }\n  .d-lg-block {\n    display: block !important;\n  }\n  .d-lg-grid {\n    display: grid !important;\n  }\n  .d-lg-inline-grid {\n    display: inline-grid !important;\n  }\n  .d-lg-table {\n    display: table !important;\n  }\n  .d-lg-table-row {\n    display: table-row !important;\n  }\n  .d-lg-table-cell {\n    display: table-cell !important;\n  }\n  .d-lg-flex {\n    display: flex !important;\n  }\n  .d-lg-inline-flex {\n    display: inline-flex !important;\n  }\n  .d-lg-none {\n    display: none !important;\n  }\n  .flex-lg-fill {\n    flex: 1 1 auto !important;\n  }\n  .flex-lg-row {\n    flex-direction: row !important;\n  }\n  .flex-lg-column {\n    flex-direction: column !important;\n  }\n  .flex-lg-row-reverse {\n    flex-direction: row-reverse !important;\n  }\n  .flex-lg-column-reverse {\n    flex-direction: column-reverse !important;\n  }\n  .flex-lg-grow-0 {\n    flex-grow: 0 !important;\n  }\n  .flex-lg-grow-1 {\n    flex-grow: 1 !important;\n  }\n  .flex-lg-shrink-0 {\n    flex-shrink: 0 !important;\n  }\n  .flex-lg-shrink-1 {\n    flex-shrink: 1 !important;\n  }\n  .flex-lg-wrap {\n    flex-wrap: wrap !important;\n  }\n  .flex-lg-nowrap {\n    flex-wrap: nowrap !important;\n  }\n  .flex-lg-wrap-reverse {\n    flex-wrap: wrap-reverse !important;\n  }\n  .justify-content-lg-start {\n    justify-content: flex-start !important;\n  }\n  .justify-content-lg-end {\n    justify-content: flex-end !important;\n  }\n  .justify-content-lg-center {\n    justify-content: center !important;\n  }\n  .justify-content-lg-between {\n    justify-content: space-between !important;\n  }\n  .justify-content-lg-around {\n    justify-content: space-around !important;\n  }\n  .justify-content-lg-evenly {\n    justify-content: space-evenly !important;\n  }\n  .align-items-lg-start {\n    align-items: flex-start !important;\n  }\n  .align-items-lg-end {\n    align-items: flex-end !important;\n  }\n  .align-items-lg-center {\n    align-items: center !important;\n  }\n  .align-items-lg-baseline {\n    align-items: baseline !important;\n  }\n  .align-items-lg-stretch {\n    align-items: stretch !important;\n  }\n  .align-content-lg-start {\n    align-content: flex-start !important;\n  }\n  .align-content-lg-end {\n    align-content: flex-end !important;\n  }\n  .align-content-lg-center {\n    align-content: center !important;\n  }\n  .align-content-lg-between {\n    align-content: space-between !important;\n  }\n  .align-content-lg-around {\n    align-content: space-around !important;\n  }\n  .align-content-lg-stretch {\n    align-content: stretch !important;\n  }\n  .align-self-lg-auto {\n    align-self: auto !important;\n  }\n  .align-self-lg-start {\n    align-self: flex-start !important;\n  }\n  .align-self-lg-end {\n    align-self: flex-end !important;\n  }\n  .align-self-lg-center {\n    align-self: center !important;\n  }\n  .align-self-lg-baseline {\n    align-self: baseline !important;\n  }\n  .align-self-lg-stretch {\n    align-self: stretch !important;\n  }\n  .order-lg-first {\n    order: -1 !important;\n  }\n  .order-lg-0 {\n    order: 0 !important;\n  }\n  .order-lg-1 {\n    order: 1 !important;\n  }\n  .order-lg-2 {\n    order: 2 !important;\n  }\n  .order-lg-3 {\n    order: 3 !important;\n  }\n  .order-lg-4 {\n    order: 4 !important;\n  }\n  .order-lg-5 {\n    order: 5 !important;\n  }\n  .order-lg-last {\n    order: 6 !important;\n  }\n  .m-lg-0 {\n    margin: 0 !important;\n  }\n  .m-lg-1 {\n    margin: 0.25rem !important;\n  }\n  .m-lg-2 {\n    margin: 0.5rem !important;\n  }\n  .m-lg-3 {\n    margin: 1rem !important;\n  }\n  .m-lg-4 {\n    margin: 1.5rem !important;\n  }\n  .m-lg-5 {\n    margin: 3rem !important;\n  }\n  .m-lg-auto {\n    margin: auto !important;\n  }\n  .mx-lg-0 {\n    margin-left: 0 !important;\n    margin-right: 0 !important;\n  }\n  .mx-lg-1 {\n    margin-left: 0.25rem !important;\n    margin-right: 0.25rem !important;\n  }\n  .mx-lg-2 {\n    margin-left: 0.5rem !important;\n    margin-right: 0.5rem !important;\n  }\n  .mx-lg-3 {\n    margin-left: 1rem !important;\n    margin-right: 1rem !important;\n  }\n  .mx-lg-4 {\n    margin-left: 1.5rem !important;\n    margin-right: 1.5rem !important;\n  }\n  .mx-lg-5 {\n    margin-left: 3rem !important;\n    margin-right: 3rem !important;\n  }\n  .mx-lg-auto {\n    margin-left: auto !important;\n    margin-right: auto !important;\n  }\n  .my-lg-0 {\n    margin-top: 0 !important;\n    margin-bottom: 0 !important;\n  }\n  .my-lg-1 {\n    margin-top: 0.25rem !important;\n    margin-bottom: 0.25rem !important;\n  }\n  .my-lg-2 {\n    margin-top: 0.5rem !important;\n    margin-bottom: 0.5rem !important;\n  }\n  .my-lg-3 {\n    margin-top: 1rem !important;\n    margin-bottom: 1rem !important;\n  }\n  .my-lg-4 {\n    margin-top: 1.5rem !important;\n    margin-bottom: 1.5rem !important;\n  }\n  .my-lg-5 {\n    margin-top: 3rem !important;\n    margin-bottom: 3rem !important;\n  }\n  .my-lg-auto {\n    margin-top: auto !important;\n    margin-bottom: auto !important;\n  }\n  .mt-lg-0 {\n    margin-top: 0 !important;\n  }\n  .mt-lg-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mt-lg-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mt-lg-3 {\n    margin-top: 1rem !important;\n  }\n  .mt-lg-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mt-lg-5 {\n    margin-top: 3rem !important;\n  }\n  .mt-lg-auto {\n    margin-top: auto !important;\n  }\n  .me-lg-0 {\n    margin-left: 0 !important;\n  }\n  .me-lg-1 {\n    margin-left: 0.25rem !important;\n  }\n  .me-lg-2 {\n    margin-left: 0.5rem !important;\n  }\n  .me-lg-3 {\n    margin-left: 1rem !important;\n  }\n  .me-lg-4 {\n    margin-left: 1.5rem !important;\n  }\n  .me-lg-5 {\n    margin-left: 3rem !important;\n  }\n  .me-lg-auto {\n    margin-left: auto !important;\n  }\n  .mb-lg-0 {\n    margin-bottom: 0 !important;\n  }\n  .mb-lg-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .mb-lg-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .mb-lg-3 {\n    margin-bottom: 1rem !important;\n  }\n  .mb-lg-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .mb-lg-5 {\n    margin-bottom: 3rem !important;\n  }\n  .mb-lg-auto {\n    margin-bottom: auto !important;\n  }\n  .ms-lg-0 {\n    margin-right: 0 !important;\n  }\n  .ms-lg-1 {\n    margin-right: 0.25rem !important;\n  }\n  .ms-lg-2 {\n    margin-right: 0.5rem !important;\n  }\n  .ms-lg-3 {\n    margin-right: 1rem !important;\n  }\n  .ms-lg-4 {\n    margin-right: 1.5rem !important;\n  }\n  .ms-lg-5 {\n    margin-right: 3rem !important;\n  }\n  .ms-lg-auto {\n    margin-right: auto !important;\n  }\n  .p-lg-0 {\n    padding: 0 !important;\n  }\n  .p-lg-1 {\n    padding: 0.25rem !important;\n  }\n  .p-lg-2 {\n    padding: 0.5rem !important;\n  }\n  .p-lg-3 {\n    padding: 1rem !important;\n  }\n  .p-lg-4 {\n    padding: 1.5rem !important;\n  }\n  .p-lg-5 {\n    padding: 3rem !important;\n  }\n  .px-lg-0 {\n    padding-left: 0 !important;\n    padding-right: 0 !important;\n  }\n  .px-lg-1 {\n    padding-left: 0.25rem !important;\n    padding-right: 0.25rem !important;\n  }\n  .px-lg-2 {\n    padding-left: 0.5rem !important;\n    padding-right: 0.5rem !important;\n  }\n  .px-lg-3 {\n    padding-left: 1rem !important;\n    padding-right: 1rem !important;\n  }\n  .px-lg-4 {\n    padding-left: 1.5rem !important;\n    padding-right: 1.5rem !important;\n  }\n  .px-lg-5 {\n    padding-left: 3rem !important;\n    padding-right: 3rem !important;\n  }\n  .py-lg-0 {\n    padding-top: 0 !important;\n    padding-bottom: 0 !important;\n  }\n  .py-lg-1 {\n    padding-top: 0.25rem !important;\n    padding-bottom: 0.25rem !important;\n  }\n  .py-lg-2 {\n    padding-top: 0.5rem !important;\n    padding-bottom: 0.5rem !important;\n  }\n  .py-lg-3 {\n    padding-top: 1rem !important;\n    padding-bottom: 1rem !important;\n  }\n  .py-lg-4 {\n    padding-top: 1.5rem !important;\n    padding-bottom: 1.5rem !important;\n  }\n  .py-lg-5 {\n    padding-top: 3rem !important;\n    padding-bottom: 3rem !important;\n  }\n  .pt-lg-0 {\n    padding-top: 0 !important;\n  }\n  .pt-lg-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pt-lg-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pt-lg-3 {\n    padding-top: 1rem !important;\n  }\n  .pt-lg-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pt-lg-5 {\n    padding-top: 3rem !important;\n  }\n  .pe-lg-0 {\n    padding-left: 0 !important;\n  }\n  .pe-lg-1 {\n    padding-left: 0.25rem !important;\n  }\n  .pe-lg-2 {\n    padding-left: 0.5rem !important;\n  }\n  .pe-lg-3 {\n    padding-left: 1rem !important;\n  }\n  .pe-lg-4 {\n    padding-left: 1.5rem !important;\n  }\n  .pe-lg-5 {\n    padding-left: 3rem !important;\n  }\n  .pb-lg-0 {\n    padding-bottom: 0 !important;\n  }\n  .pb-lg-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pb-lg-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pb-lg-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pb-lg-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pb-lg-5 {\n    padding-bottom: 3rem !important;\n  }\n  .ps-lg-0 {\n    padding-right: 0 !important;\n  }\n  .ps-lg-1 {\n    padding-right: 0.25rem !important;\n  }\n  .ps-lg-2 {\n    padding-right: 0.5rem !important;\n  }\n  .ps-lg-3 {\n    padding-right: 1rem !important;\n  }\n  .ps-lg-4 {\n    padding-right: 1.5rem !important;\n  }\n  .ps-lg-5 {\n    padding-right: 3rem !important;\n  }\n}\n@media (min-width: 1200px) {\n  .d-xl-inline {\n    display: inline !important;\n  }\n  .d-xl-inline-block {\n    display: inline-block !important;\n  }\n  .d-xl-block {\n    display: block !important;\n  }\n  .d-xl-grid {\n    display: grid !important;\n  }\n  .d-xl-inline-grid {\n    display: inline-grid !important;\n  }\n  .d-xl-table {\n    display: table !important;\n  }\n  .d-xl-table-row {\n    display: table-row !important;\n  }\n  .d-xl-table-cell {\n    display: table-cell !important;\n  }\n  .d-xl-flex {\n    display: flex !important;\n  }\n  .d-xl-inline-flex {\n    display: inline-flex !important;\n  }\n  .d-xl-none {\n    display: none !important;\n  }\n  .flex-xl-fill {\n    flex: 1 1 auto !important;\n  }\n  .flex-xl-row {\n    flex-direction: row !important;\n  }\n  .flex-xl-column {\n    flex-direction: column !important;\n  }\n  .flex-xl-row-reverse {\n    flex-direction: row-reverse !important;\n  }\n  .flex-xl-column-reverse {\n    flex-direction: column-reverse !important;\n  }\n  .flex-xl-grow-0 {\n    flex-grow: 0 !important;\n  }\n  .flex-xl-grow-1 {\n    flex-grow: 1 !important;\n  }\n  .flex-xl-shrink-0 {\n    flex-shrink: 0 !important;\n  }\n  .flex-xl-shrink-1 {\n    flex-shrink: 1 !important;\n  }\n  .flex-xl-wrap {\n    flex-wrap: wrap !important;\n  }\n  .flex-xl-nowrap {\n    flex-wrap: nowrap !important;\n  }\n  .flex-xl-wrap-reverse {\n    flex-wrap: wrap-reverse !important;\n  }\n  .justify-content-xl-start {\n    justify-content: flex-start !important;\n  }\n  .justify-content-xl-end {\n    justify-content: flex-end !important;\n  }\n  .justify-content-xl-center {\n    justify-content: center !important;\n  }\n  .justify-content-xl-between {\n    justify-content: space-between !important;\n  }\n  .justify-content-xl-around {\n    justify-content: space-around !important;\n  }\n  .justify-content-xl-evenly {\n    justify-content: space-evenly !important;\n  }\n  .align-items-xl-start {\n    align-items: flex-start !important;\n  }\n  .align-items-xl-end {\n    align-items: flex-end !important;\n  }\n  .align-items-xl-center {\n    align-items: center !important;\n  }\n  .align-items-xl-baseline {\n    align-items: baseline !important;\n  }\n  .align-items-xl-stretch {\n    align-items: stretch !important;\n  }\n  .align-content-xl-start {\n    align-content: flex-start !important;\n  }\n  .align-content-xl-end {\n    align-content: flex-end !important;\n  }\n  .align-content-xl-center {\n    align-content: center !important;\n  }\n  .align-content-xl-between {\n    align-content: space-between !important;\n  }\n  .align-content-xl-around {\n    align-content: space-around !important;\n  }\n  .align-content-xl-stretch {\n    align-content: stretch !important;\n  }\n  .align-self-xl-auto {\n    align-self: auto !important;\n  }\n  .align-self-xl-start {\n    align-self: flex-start !important;\n  }\n  .align-self-xl-end {\n    align-self: flex-end !important;\n  }\n  .align-self-xl-center {\n    align-self: center !important;\n  }\n  .align-self-xl-baseline {\n    align-self: baseline !important;\n  }\n  .align-self-xl-stretch {\n    align-self: stretch !important;\n  }\n  .order-xl-first {\n    order: -1 !important;\n  }\n  .order-xl-0 {\n    order: 0 !important;\n  }\n  .order-xl-1 {\n    order: 1 !important;\n  }\n  .order-xl-2 {\n    order: 2 !important;\n  }\n  .order-xl-3 {\n    order: 3 !important;\n  }\n  .order-xl-4 {\n    order: 4 !important;\n  }\n  .order-xl-5 {\n    order: 5 !important;\n  }\n  .order-xl-last {\n    order: 6 !important;\n  }\n  .m-xl-0 {\n    margin: 0 !important;\n  }\n  .m-xl-1 {\n    margin: 0.25rem !important;\n  }\n  .m-xl-2 {\n    margin: 0.5rem !important;\n  }\n  .m-xl-3 {\n    margin: 1rem !important;\n  }\n  .m-xl-4 {\n    margin: 1.5rem !important;\n  }\n  .m-xl-5 {\n    margin: 3rem !important;\n  }\n  .m-xl-auto {\n    margin: auto !important;\n  }\n  .mx-xl-0 {\n    margin-left: 0 !important;\n    margin-right: 0 !important;\n  }\n  .mx-xl-1 {\n    margin-left: 0.25rem !important;\n    margin-right: 0.25rem !important;\n  }\n  .mx-xl-2 {\n    margin-left: 0.5rem !important;\n    margin-right: 0.5rem !important;\n  }\n  .mx-xl-3 {\n    margin-left: 1rem !important;\n    margin-right: 1rem !important;\n  }\n  .mx-xl-4 {\n    margin-left: 1.5rem !important;\n    margin-right: 1.5rem !important;\n  }\n  .mx-xl-5 {\n    margin-left: 3rem !important;\n    margin-right: 3rem !important;\n  }\n  .mx-xl-auto {\n    margin-left: auto !important;\n    margin-right: auto !important;\n  }\n  .my-xl-0 {\n    margin-top: 0 !important;\n    margin-bottom: 0 !important;\n  }\n  .my-xl-1 {\n    margin-top: 0.25rem !important;\n    margin-bottom: 0.25rem !important;\n  }\n  .my-xl-2 {\n    margin-top: 0.5rem !important;\n    margin-bottom: 0.5rem !important;\n  }\n  .my-xl-3 {\n    margin-top: 1rem !important;\n    margin-bottom: 1rem !important;\n  }\n  .my-xl-4 {\n    margin-top: 1.5rem !important;\n    margin-bottom: 1.5rem !important;\n  }\n  .my-xl-5 {\n    margin-top: 3rem !important;\n    margin-bottom: 3rem !important;\n  }\n  .my-xl-auto {\n    margin-top: auto !important;\n    margin-bottom: auto !important;\n  }\n  .mt-xl-0 {\n    margin-top: 0 !important;\n  }\n  .mt-xl-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mt-xl-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mt-xl-3 {\n    margin-top: 1rem !important;\n  }\n  .mt-xl-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mt-xl-5 {\n    margin-top: 3rem !important;\n  }\n  .mt-xl-auto {\n    margin-top: auto !important;\n  }\n  .me-xl-0 {\n    margin-left: 0 !important;\n  }\n  .me-xl-1 {\n    margin-left: 0.25rem !important;\n  }\n  .me-xl-2 {\n    margin-left: 0.5rem !important;\n  }\n  .me-xl-3 {\n    margin-left: 1rem !important;\n  }\n  .me-xl-4 {\n    margin-left: 1.5rem !important;\n  }\n  .me-xl-5 {\n    margin-left: 3rem !important;\n  }\n  .me-xl-auto {\n    margin-left: auto !important;\n  }\n  .mb-xl-0 {\n    margin-bottom: 0 !important;\n  }\n  .mb-xl-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .mb-xl-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .mb-xl-3 {\n    margin-bottom: 1rem !important;\n  }\n  .mb-xl-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .mb-xl-5 {\n    margin-bottom: 3rem !important;\n  }\n  .mb-xl-auto {\n    margin-bottom: auto !important;\n  }\n  .ms-xl-0 {\n    margin-right: 0 !important;\n  }\n  .ms-xl-1 {\n    margin-right: 0.25rem !important;\n  }\n  .ms-xl-2 {\n    margin-right: 0.5rem !important;\n  }\n  .ms-xl-3 {\n    margin-right: 1rem !important;\n  }\n  .ms-xl-4 {\n    margin-right: 1.5rem !important;\n  }\n  .ms-xl-5 {\n    margin-right: 3rem !important;\n  }\n  .ms-xl-auto {\n    margin-right: auto !important;\n  }\n  .p-xl-0 {\n    padding: 0 !important;\n  }\n  .p-xl-1 {\n    padding: 0.25rem !important;\n  }\n  .p-xl-2 {\n    padding: 0.5rem !important;\n  }\n  .p-xl-3 {\n    padding: 1rem !important;\n  }\n  .p-xl-4 {\n    padding: 1.5rem !important;\n  }\n  .p-xl-5 {\n    padding: 3rem !important;\n  }\n  .px-xl-0 {\n    padding-left: 0 !important;\n    padding-right: 0 !important;\n  }\n  .px-xl-1 {\n    padding-left: 0.25rem !important;\n    padding-right: 0.25rem !important;\n  }\n  .px-xl-2 {\n    padding-left: 0.5rem !important;\n    padding-right: 0.5rem !important;\n  }\n  .px-xl-3 {\n    padding-left: 1rem !important;\n    padding-right: 1rem !important;\n  }\n  .px-xl-4 {\n    padding-left: 1.5rem !important;\n    padding-right: 1.5rem !important;\n  }\n  .px-xl-5 {\n    padding-left: 3rem !important;\n    padding-right: 3rem !important;\n  }\n  .py-xl-0 {\n    padding-top: 0 !important;\n    padding-bottom: 0 !important;\n  }\n  .py-xl-1 {\n    padding-top: 0.25rem !important;\n    padding-bottom: 0.25rem !important;\n  }\n  .py-xl-2 {\n    padding-top: 0.5rem !important;\n    padding-bottom: 0.5rem !important;\n  }\n  .py-xl-3 {\n    padding-top: 1rem !important;\n    padding-bottom: 1rem !important;\n  }\n  .py-xl-4 {\n    padding-top: 1.5rem !important;\n    padding-bottom: 1.5rem !important;\n  }\n  .py-xl-5 {\n    padding-top: 3rem !important;\n    padding-bottom: 3rem !important;\n  }\n  .pt-xl-0 {\n    padding-top: 0 !important;\n  }\n  .pt-xl-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pt-xl-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pt-xl-3 {\n    padding-top: 1rem !important;\n  }\n  .pt-xl-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pt-xl-5 {\n    padding-top: 3rem !important;\n  }\n  .pe-xl-0 {\n    padding-left: 0 !important;\n  }\n  .pe-xl-1 {\n    padding-left: 0.25rem !important;\n  }\n  .pe-xl-2 {\n    padding-left: 0.5rem !important;\n  }\n  .pe-xl-3 {\n    padding-left: 1rem !important;\n  }\n  .pe-xl-4 {\n    padding-left: 1.5rem !important;\n  }\n  .pe-xl-5 {\n    padding-left: 3rem !important;\n  }\n  .pb-xl-0 {\n    padding-bottom: 0 !important;\n  }\n  .pb-xl-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pb-xl-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pb-xl-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pb-xl-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pb-xl-5 {\n    padding-bottom: 3rem !important;\n  }\n  .ps-xl-0 {\n    padding-right: 0 !important;\n  }\n  .ps-xl-1 {\n    padding-right: 0.25rem !important;\n  }\n  .ps-xl-2 {\n    padding-right: 0.5rem !important;\n  }\n  .ps-xl-3 {\n    padding-right: 1rem !important;\n  }\n  .ps-xl-4 {\n    padding-right: 1.5rem !important;\n  }\n  .ps-xl-5 {\n    padding-right: 3rem !important;\n  }\n}\n@media (min-width: 1400px) {\n  .d-xxl-inline {\n    display: inline !important;\n  }\n  .d-xxl-inline-block {\n    display: inline-block !important;\n  }\n  .d-xxl-block {\n    display: block !important;\n  }\n  .d-xxl-grid {\n    display: grid !important;\n  }\n  .d-xxl-inline-grid {\n    display: inline-grid !important;\n  }\n  .d-xxl-table {\n    display: table !important;\n  }\n  .d-xxl-table-row {\n    display: table-row !important;\n  }\n  .d-xxl-table-cell {\n    display: table-cell !important;\n  }\n  .d-xxl-flex {\n    display: flex !important;\n  }\n  .d-xxl-inline-flex {\n    display: inline-flex !important;\n  }\n  .d-xxl-none {\n    display: none !important;\n  }\n  .flex-xxl-fill {\n    flex: 1 1 auto !important;\n  }\n  .flex-xxl-row {\n    flex-direction: row !important;\n  }\n  .flex-xxl-column {\n    flex-direction: column !important;\n  }\n  .flex-xxl-row-reverse {\n    flex-direction: row-reverse !important;\n  }\n  .flex-xxl-column-reverse {\n    flex-direction: column-reverse !important;\n  }\n  .flex-xxl-grow-0 {\n    flex-grow: 0 !important;\n  }\n  .flex-xxl-grow-1 {\n    flex-grow: 1 !important;\n  }\n  .flex-xxl-shrink-0 {\n    flex-shrink: 0 !important;\n  }\n  .flex-xxl-shrink-1 {\n    flex-shrink: 1 !important;\n  }\n  .flex-xxl-wrap {\n    flex-wrap: wrap !important;\n  }\n  .flex-xxl-nowrap {\n    flex-wrap: nowrap !important;\n  }\n  .flex-xxl-wrap-reverse {\n    flex-wrap: wrap-reverse !important;\n  }\n  .justify-content-xxl-start {\n    justify-content: flex-start !important;\n  }\n  .justify-content-xxl-end {\n    justify-content: flex-end !important;\n  }\n  .justify-content-xxl-center {\n    justify-content: center !important;\n  }\n  .justify-content-xxl-between {\n    justify-content: space-between !important;\n  }\n  .justify-content-xxl-around {\n    justify-content: space-around !important;\n  }\n  .justify-content-xxl-evenly {\n    justify-content: space-evenly !important;\n  }\n  .align-items-xxl-start {\n    align-items: flex-start !important;\n  }\n  .align-items-xxl-end {\n    align-items: flex-end !important;\n  }\n  .align-items-xxl-center {\n    align-items: center !important;\n  }\n  .align-items-xxl-baseline {\n    align-items: baseline !important;\n  }\n  .align-items-xxl-stretch {\n    align-items: stretch !important;\n  }\n  .align-content-xxl-start {\n    align-content: flex-start !important;\n  }\n  .align-content-xxl-end {\n    align-content: flex-end !important;\n  }\n  .align-content-xxl-center {\n    align-content: center !important;\n  }\n  .align-content-xxl-between {\n    align-content: space-between !important;\n  }\n  .align-content-xxl-around {\n    align-content: space-around !important;\n  }\n  .align-content-xxl-stretch {\n    align-content: stretch !important;\n  }\n  .align-self-xxl-auto {\n    align-self: auto !important;\n  }\n  .align-self-xxl-start {\n    align-self: flex-start !important;\n  }\n  .align-self-xxl-end {\n    align-self: flex-end !important;\n  }\n  .align-self-xxl-center {\n    align-self: center !important;\n  }\n  .align-self-xxl-baseline {\n    align-self: baseline !important;\n  }\n  .align-self-xxl-stretch {\n    align-self: stretch !important;\n  }\n  .order-xxl-first {\n    order: -1 !important;\n  }\n  .order-xxl-0 {\n    order: 0 !important;\n  }\n  .order-xxl-1 {\n    order: 1 !important;\n  }\n  .order-xxl-2 {\n    order: 2 !important;\n  }\n  .order-xxl-3 {\n    order: 3 !important;\n  }\n  .order-xxl-4 {\n    order: 4 !important;\n  }\n  .order-xxl-5 {\n    order: 5 !important;\n  }\n  .order-xxl-last {\n    order: 6 !important;\n  }\n  .m-xxl-0 {\n    margin: 0 !important;\n  }\n  .m-xxl-1 {\n    margin: 0.25rem !important;\n  }\n  .m-xxl-2 {\n    margin: 0.5rem !important;\n  }\n  .m-xxl-3 {\n    margin: 1rem !important;\n  }\n  .m-xxl-4 {\n    margin: 1.5rem !important;\n  }\n  .m-xxl-5 {\n    margin: 3rem !important;\n  }\n  .m-xxl-auto {\n    margin: auto !important;\n  }\n  .mx-xxl-0 {\n    margin-left: 0 !important;\n    margin-right: 0 !important;\n  }\n  .mx-xxl-1 {\n    margin-left: 0.25rem !important;\n    margin-right: 0.25rem !important;\n  }\n  .mx-xxl-2 {\n    margin-left: 0.5rem !important;\n    margin-right: 0.5rem !important;\n  }\n  .mx-xxl-3 {\n    margin-left: 1rem !important;\n    margin-right: 1rem !important;\n  }\n  .mx-xxl-4 {\n    margin-left: 1.5rem !important;\n    margin-right: 1.5rem !important;\n  }\n  .mx-xxl-5 {\n    margin-left: 3rem !important;\n    margin-right: 3rem !important;\n  }\n  .mx-xxl-auto {\n    margin-left: auto !important;\n    margin-right: auto !important;\n  }\n  .my-xxl-0 {\n    margin-top: 0 !important;\n    margin-bottom: 0 !important;\n  }\n  .my-xxl-1 {\n    margin-top: 0.25rem !important;\n    margin-bottom: 0.25rem !important;\n  }\n  .my-xxl-2 {\n    margin-top: 0.5rem !important;\n    margin-bottom: 0.5rem !important;\n  }\n  .my-xxl-3 {\n    margin-top: 1rem !important;\n    margin-bottom: 1rem !important;\n  }\n  .my-xxl-4 {\n    margin-top: 1.5rem !important;\n    margin-bottom: 1.5rem !important;\n  }\n  .my-xxl-5 {\n    margin-top: 3rem !important;\n    margin-bottom: 3rem !important;\n  }\n  .my-xxl-auto {\n    margin-top: auto !important;\n    margin-bottom: auto !important;\n  }\n  .mt-xxl-0 {\n    margin-top: 0 !important;\n  }\n  .mt-xxl-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mt-xxl-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mt-xxl-3 {\n    margin-top: 1rem !important;\n  }\n  .mt-xxl-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mt-xxl-5 {\n    margin-top: 3rem !important;\n  }\n  .mt-xxl-auto {\n    margin-top: auto !important;\n  }\n  .me-xxl-0 {\n    margin-left: 0 !important;\n  }\n  .me-xxl-1 {\n    margin-left: 0.25rem !important;\n  }\n  .me-xxl-2 {\n    margin-left: 0.5rem !important;\n  }\n  .me-xxl-3 {\n    margin-left: 1rem !important;\n  }\n  .me-xxl-4 {\n    margin-left: 1.5rem !important;\n  }\n  .me-xxl-5 {\n    margin-left: 3rem !important;\n  }\n  .me-xxl-auto {\n    margin-left: auto !important;\n  }\n  .mb-xxl-0 {\n    margin-bottom: 0 !important;\n  }\n  .mb-xxl-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .mb-xxl-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .mb-xxl-3 {\n    margin-bottom: 1rem !important;\n  }\n  .mb-xxl-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .mb-xxl-5 {\n    margin-bottom: 3rem !important;\n  }\n  .mb-xxl-auto {\n    margin-bottom: auto !important;\n  }\n  .ms-xxl-0 {\n    margin-right: 0 !important;\n  }\n  .ms-xxl-1 {\n    margin-right: 0.25rem !important;\n  }\n  .ms-xxl-2 {\n    margin-right: 0.5rem !important;\n  }\n  .ms-xxl-3 {\n    margin-right: 1rem !important;\n  }\n  .ms-xxl-4 {\n    margin-right: 1.5rem !important;\n  }\n  .ms-xxl-5 {\n    margin-right: 3rem !important;\n  }\n  .ms-xxl-auto {\n    margin-right: auto !important;\n  }\n  .p-xxl-0 {\n    padding: 0 !important;\n  }\n  .p-xxl-1 {\n    padding: 0.25rem !important;\n  }\n  .p-xxl-2 {\n    padding: 0.5rem !important;\n  }\n  .p-xxl-3 {\n    padding: 1rem !important;\n  }\n  .p-xxl-4 {\n    padding: 1.5rem !important;\n  }\n  .p-xxl-5 {\n    padding: 3rem !important;\n  }\n  .px-xxl-0 {\n    padding-left: 0 !important;\n    padding-right: 0 !important;\n  }\n  .px-xxl-1 {\n    padding-left: 0.25rem !important;\n    padding-right: 0.25rem !important;\n  }\n  .px-xxl-2 {\n    padding-left: 0.5rem !important;\n    padding-right: 0.5rem !important;\n  }\n  .px-xxl-3 {\n    padding-left: 1rem !important;\n    padding-right: 1rem !important;\n  }\n  .px-xxl-4 {\n    padding-left: 1.5rem !important;\n    padding-right: 1.5rem !important;\n  }\n  .px-xxl-5 {\n    padding-left: 3rem !important;\n    padding-right: 3rem !important;\n  }\n  .py-xxl-0 {\n    padding-top: 0 !important;\n    padding-bottom: 0 !important;\n  }\n  .py-xxl-1 {\n    padding-top: 0.25rem !important;\n    padding-bottom: 0.25rem !important;\n  }\n  .py-xxl-2 {\n    padding-top: 0.5rem !important;\n    padding-bottom: 0.5rem !important;\n  }\n  .py-xxl-3 {\n    padding-top: 1rem !important;\n    padding-bottom: 1rem !important;\n  }\n  .py-xxl-4 {\n    padding-top: 1.5rem !important;\n    padding-bottom: 1.5rem !important;\n  }\n  .py-xxl-5 {\n    padding-top: 3rem !important;\n    padding-bottom: 3rem !important;\n  }\n  .pt-xxl-0 {\n    padding-top: 0 !important;\n  }\n  .pt-xxl-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pt-xxl-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pt-xxl-3 {\n    padding-top: 1rem !important;\n  }\n  .pt-xxl-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pt-xxl-5 {\n    padding-top: 3rem !important;\n  }\n  .pe-xxl-0 {\n    padding-left: 0 !important;\n  }\n  .pe-xxl-1 {\n    padding-left: 0.25rem !important;\n  }\n  .pe-xxl-2 {\n    padding-left: 0.5rem !important;\n  }\n  .pe-xxl-3 {\n    padding-left: 1rem !important;\n  }\n  .pe-xxl-4 {\n    padding-left: 1.5rem !important;\n  }\n  .pe-xxl-5 {\n    padding-left: 3rem !important;\n  }\n  .pb-xxl-0 {\n    padding-bottom: 0 !important;\n  }\n  .pb-xxl-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pb-xxl-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pb-xxl-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pb-xxl-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pb-xxl-5 {\n    padding-bottom: 3rem !important;\n  }\n  .ps-xxl-0 {\n    padding-right: 0 !important;\n  }\n  .ps-xxl-1 {\n    padding-right: 0.25rem !important;\n  }\n  .ps-xxl-2 {\n    padding-right: 0.5rem !important;\n  }\n  .ps-xxl-3 {\n    padding-right: 1rem !important;\n  }\n  .ps-xxl-4 {\n    padding-right: 1.5rem !important;\n  }\n  .ps-xxl-5 {\n    padding-right: 3rem !important;\n  }\n}\n@media print {\n  .d-print-inline {\n    display: inline !important;\n  }\n  .d-print-inline-block {\n    display: inline-block !important;\n  }\n  .d-print-block {\n    display: block !important;\n  }\n  .d-print-grid {\n    display: grid !important;\n  }\n  .d-print-inline-grid {\n    display: inline-grid !important;\n  }\n  .d-print-table {\n    display: table !important;\n  }\n  .d-print-table-row {\n    display: table-row !important;\n  }\n  .d-print-table-cell {\n    display: table-cell !important;\n  }\n  .d-print-flex {\n    display: flex !important;\n  }\n  .d-print-inline-flex {\n    display: inline-flex !important;\n  }\n  .d-print-none {\n    display: none !important;\n  }\n}\n/*# sourceMappingURL=bootstrap-grid.rtl.css.map */"
  },
  {
    "path": "dist/css/bootstrap-reboot.css",
    "content": "/*!\n * Bootstrap Reboot v5.3.8 (https://getbootstrap.com/)\n * Copyright 2011-2025 The Bootstrap Authors\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n:root,\n[data-bs-theme=light] {\n  --bs-blue: #0d6efd;\n  --bs-indigo: #6610f2;\n  --bs-purple: #6f42c1;\n  --bs-pink: #d63384;\n  --bs-red: #dc3545;\n  --bs-orange: #fd7e14;\n  --bs-yellow: #ffc107;\n  --bs-green: #198754;\n  --bs-teal: #20c997;\n  --bs-cyan: #0dcaf0;\n  --bs-black: #000;\n  --bs-white: #fff;\n  --bs-gray: #6c757d;\n  --bs-gray-dark: #343a40;\n  --bs-gray-100: #f8f9fa;\n  --bs-gray-200: #e9ecef;\n  --bs-gray-300: #dee2e6;\n  --bs-gray-400: #ced4da;\n  --bs-gray-500: #adb5bd;\n  --bs-gray-600: #6c757d;\n  --bs-gray-700: #495057;\n  --bs-gray-800: #343a40;\n  --bs-gray-900: #212529;\n  --bs-primary: #0d6efd;\n  --bs-secondary: #6c757d;\n  --bs-success: #198754;\n  --bs-info: #0dcaf0;\n  --bs-warning: #ffc107;\n  --bs-danger: #dc3545;\n  --bs-light: #f8f9fa;\n  --bs-dark: #212529;\n  --bs-primary-rgb: 13, 110, 253;\n  --bs-secondary-rgb: 108, 117, 125;\n  --bs-success-rgb: 25, 135, 84;\n  --bs-info-rgb: 13, 202, 240;\n  --bs-warning-rgb: 255, 193, 7;\n  --bs-danger-rgb: 220, 53, 69;\n  --bs-light-rgb: 248, 249, 250;\n  --bs-dark-rgb: 33, 37, 41;\n  --bs-primary-text-emphasis: #052c65;\n  --bs-secondary-text-emphasis: #2b2f32;\n  --bs-success-text-emphasis: #0a3622;\n  --bs-info-text-emphasis: #055160;\n  --bs-warning-text-emphasis: #664d03;\n  --bs-danger-text-emphasis: #58151c;\n  --bs-light-text-emphasis: #495057;\n  --bs-dark-text-emphasis: #495057;\n  --bs-primary-bg-subtle: #cfe2ff;\n  --bs-secondary-bg-subtle: #e2e3e5;\n  --bs-success-bg-subtle: #d1e7dd;\n  --bs-info-bg-subtle: #cff4fc;\n  --bs-warning-bg-subtle: #fff3cd;\n  --bs-danger-bg-subtle: #f8d7da;\n  --bs-light-bg-subtle: #fcfcfd;\n  --bs-dark-bg-subtle: #ced4da;\n  --bs-primary-border-subtle: #9ec5fe;\n  --bs-secondary-border-subtle: #c4c8cb;\n  --bs-success-border-subtle: #a3cfbb;\n  --bs-info-border-subtle: #9eeaf9;\n  --bs-warning-border-subtle: #ffe69c;\n  --bs-danger-border-subtle: #f1aeb5;\n  --bs-light-border-subtle: #e9ecef;\n  --bs-dark-border-subtle: #adb5bd;\n  --bs-white-rgb: 255, 255, 255;\n  --bs-black-rgb: 0, 0, 0;\n  --bs-font-sans-serif: system-ui, -apple-system, \"Segoe UI\", Roboto, \"Helvetica Neue\", \"Noto Sans\", \"Liberation Sans\", Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n  --bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n  --bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));\n  --bs-body-font-family: var(--bs-font-sans-serif);\n  --bs-body-font-size: 1rem;\n  --bs-body-font-weight: 400;\n  --bs-body-line-height: 1.5;\n  --bs-body-color: #212529;\n  --bs-body-color-rgb: 33, 37, 41;\n  --bs-body-bg: #fff;\n  --bs-body-bg-rgb: 255, 255, 255;\n  --bs-emphasis-color: #000;\n  --bs-emphasis-color-rgb: 0, 0, 0;\n  --bs-secondary-color: rgba(33, 37, 41, 0.75);\n  --bs-secondary-color-rgb: 33, 37, 41;\n  --bs-secondary-bg: #e9ecef;\n  --bs-secondary-bg-rgb: 233, 236, 239;\n  --bs-tertiary-color: rgba(33, 37, 41, 0.5);\n  --bs-tertiary-color-rgb: 33, 37, 41;\n  --bs-tertiary-bg: #f8f9fa;\n  --bs-tertiary-bg-rgb: 248, 249, 250;\n  --bs-heading-color: inherit;\n  --bs-link-color: #0d6efd;\n  --bs-link-color-rgb: 13, 110, 253;\n  --bs-link-decoration: underline;\n  --bs-link-hover-color: #0a58ca;\n  --bs-link-hover-color-rgb: 10, 88, 202;\n  --bs-code-color: #d63384;\n  --bs-highlight-color: #212529;\n  --bs-highlight-bg: #fff3cd;\n  --bs-border-width: 1px;\n  --bs-border-style: solid;\n  --bs-border-color: #dee2e6;\n  --bs-border-color-translucent: rgba(0, 0, 0, 0.175);\n  --bs-border-radius: 0.375rem;\n  --bs-border-radius-sm: 0.25rem;\n  --bs-border-radius-lg: 0.5rem;\n  --bs-border-radius-xl: 1rem;\n  --bs-border-radius-xxl: 2rem;\n  --bs-border-radius-2xl: var(--bs-border-radius-xxl);\n  --bs-border-radius-pill: 50rem;\n  --bs-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);\n  --bs-box-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);\n  --bs-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175);\n  --bs-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075);\n  --bs-focus-ring-width: 0.25rem;\n  --bs-focus-ring-opacity: 0.25;\n  --bs-focus-ring-color: rgba(13, 110, 253, 0.25);\n  --bs-form-valid-color: #198754;\n  --bs-form-valid-border-color: #198754;\n  --bs-form-invalid-color: #dc3545;\n  --bs-form-invalid-border-color: #dc3545;\n}\n\n[data-bs-theme=dark] {\n  color-scheme: dark;\n  --bs-body-color: #dee2e6;\n  --bs-body-color-rgb: 222, 226, 230;\n  --bs-body-bg: #212529;\n  --bs-body-bg-rgb: 33, 37, 41;\n  --bs-emphasis-color: #fff;\n  --bs-emphasis-color-rgb: 255, 255, 255;\n  --bs-secondary-color: rgba(222, 226, 230, 0.75);\n  --bs-secondary-color-rgb: 222, 226, 230;\n  --bs-secondary-bg: #343a40;\n  --bs-secondary-bg-rgb: 52, 58, 64;\n  --bs-tertiary-color: rgba(222, 226, 230, 0.5);\n  --bs-tertiary-color-rgb: 222, 226, 230;\n  --bs-tertiary-bg: #2b3035;\n  --bs-tertiary-bg-rgb: 43, 48, 53;\n  --bs-primary-text-emphasis: #6ea8fe;\n  --bs-secondary-text-emphasis: #a7acb1;\n  --bs-success-text-emphasis: #75b798;\n  --bs-info-text-emphasis: #6edff6;\n  --bs-warning-text-emphasis: #ffda6a;\n  --bs-danger-text-emphasis: #ea868f;\n  --bs-light-text-emphasis: #f8f9fa;\n  --bs-dark-text-emphasis: #dee2e6;\n  --bs-primary-bg-subtle: #031633;\n  --bs-secondary-bg-subtle: #161719;\n  --bs-success-bg-subtle: #051b11;\n  --bs-info-bg-subtle: #032830;\n  --bs-warning-bg-subtle: #332701;\n  --bs-danger-bg-subtle: #2c0b0e;\n  --bs-light-bg-subtle: #343a40;\n  --bs-dark-bg-subtle: #1a1d20;\n  --bs-primary-border-subtle: #084298;\n  --bs-secondary-border-subtle: #41464b;\n  --bs-success-border-subtle: #0f5132;\n  --bs-info-border-subtle: #087990;\n  --bs-warning-border-subtle: #997404;\n  --bs-danger-border-subtle: #842029;\n  --bs-light-border-subtle: #495057;\n  --bs-dark-border-subtle: #343a40;\n  --bs-heading-color: inherit;\n  --bs-link-color: #6ea8fe;\n  --bs-link-hover-color: #8bb9fe;\n  --bs-link-color-rgb: 110, 168, 254;\n  --bs-link-hover-color-rgb: 139, 185, 254;\n  --bs-code-color: #e685b5;\n  --bs-highlight-color: #dee2e6;\n  --bs-highlight-bg: #664d03;\n  --bs-border-color: #495057;\n  --bs-border-color-translucent: rgba(255, 255, 255, 0.15);\n  --bs-form-valid-color: #75b798;\n  --bs-form-valid-border-color: #75b798;\n  --bs-form-invalid-color: #ea868f;\n  --bs-form-invalid-border-color: #ea868f;\n}\n\n*,\n*::before,\n*::after {\n  box-sizing: border-box;\n}\n\n@media (prefers-reduced-motion: no-preference) {\n  :root {\n    scroll-behavior: smooth;\n  }\n}\n\nbody {\n  margin: 0;\n  font-family: var(--bs-body-font-family);\n  font-size: var(--bs-body-font-size);\n  font-weight: var(--bs-body-font-weight);\n  line-height: var(--bs-body-line-height);\n  color: var(--bs-body-color);\n  text-align: var(--bs-body-text-align);\n  background-color: var(--bs-body-bg);\n  -webkit-text-size-adjust: 100%;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\nhr {\n  margin: 1rem 0;\n  color: inherit;\n  border: 0;\n  border-top: var(--bs-border-width) solid;\n  opacity: 0.25;\n}\n\nh6, h5, h4, h3, h2, h1 {\n  margin-top: 0;\n  margin-bottom: 0.5rem;\n  font-weight: 500;\n  line-height: 1.2;\n  color: var(--bs-heading-color);\n}\n\nh1 {\n  font-size: calc(1.375rem + 1.5vw);\n}\n@media (min-width: 1200px) {\n  h1 {\n    font-size: 2.5rem;\n  }\n}\n\nh2 {\n  font-size: calc(1.325rem + 0.9vw);\n}\n@media (min-width: 1200px) {\n  h2 {\n    font-size: 2rem;\n  }\n}\n\nh3 {\n  font-size: calc(1.3rem + 0.6vw);\n}\n@media (min-width: 1200px) {\n  h3 {\n    font-size: 1.75rem;\n  }\n}\n\nh4 {\n  font-size: calc(1.275rem + 0.3vw);\n}\n@media (min-width: 1200px) {\n  h4 {\n    font-size: 1.5rem;\n  }\n}\n\nh5 {\n  font-size: 1.25rem;\n}\n\nh6 {\n  font-size: 1rem;\n}\n\np {\n  margin-top: 0;\n  margin-bottom: 1rem;\n}\n\nabbr[title] {\n  -webkit-text-decoration: underline dotted;\n  text-decoration: underline dotted;\n  cursor: help;\n  -webkit-text-decoration-skip-ink: none;\n  text-decoration-skip-ink: none;\n}\n\naddress {\n  margin-bottom: 1rem;\n  font-style: normal;\n  line-height: inherit;\n}\n\nol,\nul {\n  padding-left: 2rem;\n}\n\nol,\nul,\ndl {\n  margin-top: 0;\n  margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n  margin-bottom: 0;\n}\n\ndt {\n  font-weight: 700;\n}\n\ndd {\n  margin-bottom: 0.5rem;\n  margin-left: 0;\n}\n\nblockquote {\n  margin: 0 0 1rem;\n}\n\nb,\nstrong {\n  font-weight: bolder;\n}\n\nsmall {\n  font-size: 0.875em;\n}\n\nmark {\n  padding: 0.1875em;\n  color: var(--bs-highlight-color);\n  background-color: var(--bs-highlight-bg);\n}\n\nsub,\nsup {\n  position: relative;\n  font-size: 0.75em;\n  line-height: 0;\n  vertical-align: baseline;\n}\n\nsub {\n  bottom: -0.25em;\n}\n\nsup {\n  top: -0.5em;\n}\n\na {\n  color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 1));\n  text-decoration: underline;\n}\na:hover {\n  --bs-link-color-rgb: var(--bs-link-hover-color-rgb);\n}\n\na:not([href]):not([class]), a:not([href]):not([class]):hover {\n  color: inherit;\n  text-decoration: none;\n}\n\npre,\ncode,\nkbd,\nsamp {\n  font-family: var(--bs-font-monospace);\n  font-size: 1em;\n}\n\npre {\n  display: block;\n  margin-top: 0;\n  margin-bottom: 1rem;\n  overflow: auto;\n  font-size: 0.875em;\n}\npre code {\n  font-size: inherit;\n  color: inherit;\n  word-break: normal;\n}\n\ncode {\n  font-size: 0.875em;\n  color: var(--bs-code-color);\n  word-wrap: break-word;\n}\na > code {\n  color: inherit;\n}\n\nkbd {\n  padding: 0.1875rem 0.375rem;\n  font-size: 0.875em;\n  color: var(--bs-body-bg);\n  background-color: var(--bs-body-color);\n  border-radius: 0.25rem;\n}\nkbd kbd {\n  padding: 0;\n  font-size: 1em;\n}\n\nfigure {\n  margin: 0 0 1rem;\n}\n\nimg,\nsvg {\n  vertical-align: middle;\n}\n\ntable {\n  caption-side: bottom;\n  border-collapse: collapse;\n}\n\ncaption {\n  padding-top: 0.5rem;\n  padding-bottom: 0.5rem;\n  color: var(--bs-secondary-color);\n  text-align: left;\n}\n\nth {\n  text-align: inherit;\n  text-align: -webkit-match-parent;\n}\n\nthead,\ntbody,\ntfoot,\ntr,\ntd,\nth {\n  border-color: inherit;\n  border-style: solid;\n  border-width: 0;\n}\n\nlabel {\n  display: inline-block;\n}\n\nbutton {\n  border-radius: 0;\n}\n\nbutton:focus:not(:focus-visible) {\n  outline: 0;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n  margin: 0;\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\n\nbutton,\nselect {\n  text-transform: none;\n}\n\n[role=button] {\n  cursor: pointer;\n}\n\nselect {\n  word-wrap: normal;\n}\nselect:disabled {\n  opacity: 1;\n}\n\n[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator {\n  display: none !important;\n}\n\nbutton,\n[type=button],\n[type=reset],\n[type=submit] {\n  -webkit-appearance: button;\n}\nbutton:not(:disabled),\n[type=button]:not(:disabled),\n[type=reset]:not(:disabled),\n[type=submit]:not(:disabled) {\n  cursor: pointer;\n}\n\n::-moz-focus-inner {\n  padding: 0;\n  border-style: none;\n}\n\ntextarea {\n  resize: vertical;\n}\n\nfieldset {\n  min-width: 0;\n  padding: 0;\n  margin: 0;\n  border: 0;\n}\n\nlegend {\n  float: left;\n  width: 100%;\n  padding: 0;\n  margin-bottom: 0.5rem;\n  line-height: inherit;\n  font-size: calc(1.275rem + 0.3vw);\n}\n@media (min-width: 1200px) {\n  legend {\n    font-size: 1.5rem;\n  }\n}\nlegend + * {\n  clear: left;\n}\n\n::-webkit-datetime-edit-fields-wrapper,\n::-webkit-datetime-edit-text,\n::-webkit-datetime-edit-minute,\n::-webkit-datetime-edit-hour-field,\n::-webkit-datetime-edit-day-field,\n::-webkit-datetime-edit-month-field,\n::-webkit-datetime-edit-year-field {\n  padding: 0;\n}\n\n::-webkit-inner-spin-button {\n  height: auto;\n}\n\n[type=search] {\n  -webkit-appearance: textfield;\n  outline-offset: -2px;\n}\n[type=search]::-webkit-search-cancel-button {\n  cursor: pointer;\n  filter: grayscale(1);\n}\n\n/* rtl:raw:\n[type=\"tel\"],\n[type=\"url\"],\n[type=\"email\"],\n[type=\"number\"] {\n  direction: ltr;\n}\n*/\n::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\n\n::-webkit-color-swatch-wrapper {\n  padding: 0;\n}\n\n::-webkit-file-upload-button {\n  font: inherit;\n  -webkit-appearance: button;\n}\n\n::file-selector-button {\n  font: inherit;\n  -webkit-appearance: button;\n}\n\noutput {\n  display: inline-block;\n}\n\niframe {\n  border: 0;\n}\n\nsummary {\n  display: list-item;\n  cursor: pointer;\n}\n\nprogress {\n  vertical-align: baseline;\n}\n\n[hidden] {\n  display: none !important;\n}\n\n/*# sourceMappingURL=bootstrap-reboot.css.map */"
  },
  {
    "path": "dist/css/bootstrap-reboot.rtl.css",
    "content": "/*!\n * Bootstrap Reboot v5.3.8 (https://getbootstrap.com/)\n * Copyright 2011-2025 The Bootstrap Authors\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n:root,\n[data-bs-theme=light] {\n  --bs-blue: #0d6efd;\n  --bs-indigo: #6610f2;\n  --bs-purple: #6f42c1;\n  --bs-pink: #d63384;\n  --bs-red: #dc3545;\n  --bs-orange: #fd7e14;\n  --bs-yellow: #ffc107;\n  --bs-green: #198754;\n  --bs-teal: #20c997;\n  --bs-cyan: #0dcaf0;\n  --bs-black: #000;\n  --bs-white: #fff;\n  --bs-gray: #6c757d;\n  --bs-gray-dark: #343a40;\n  --bs-gray-100: #f8f9fa;\n  --bs-gray-200: #e9ecef;\n  --bs-gray-300: #dee2e6;\n  --bs-gray-400: #ced4da;\n  --bs-gray-500: #adb5bd;\n  --bs-gray-600: #6c757d;\n  --bs-gray-700: #495057;\n  --bs-gray-800: #343a40;\n  --bs-gray-900: #212529;\n  --bs-primary: #0d6efd;\n  --bs-secondary: #6c757d;\n  --bs-success: #198754;\n  --bs-info: #0dcaf0;\n  --bs-warning: #ffc107;\n  --bs-danger: #dc3545;\n  --bs-light: #f8f9fa;\n  --bs-dark: #212529;\n  --bs-primary-rgb: 13, 110, 253;\n  --bs-secondary-rgb: 108, 117, 125;\n  --bs-success-rgb: 25, 135, 84;\n  --bs-info-rgb: 13, 202, 240;\n  --bs-warning-rgb: 255, 193, 7;\n  --bs-danger-rgb: 220, 53, 69;\n  --bs-light-rgb: 248, 249, 250;\n  --bs-dark-rgb: 33, 37, 41;\n  --bs-primary-text-emphasis: #052c65;\n  --bs-secondary-text-emphasis: #2b2f32;\n  --bs-success-text-emphasis: #0a3622;\n  --bs-info-text-emphasis: #055160;\n  --bs-warning-text-emphasis: #664d03;\n  --bs-danger-text-emphasis: #58151c;\n  --bs-light-text-emphasis: #495057;\n  --bs-dark-text-emphasis: #495057;\n  --bs-primary-bg-subtle: #cfe2ff;\n  --bs-secondary-bg-subtle: #e2e3e5;\n  --bs-success-bg-subtle: #d1e7dd;\n  --bs-info-bg-subtle: #cff4fc;\n  --bs-warning-bg-subtle: #fff3cd;\n  --bs-danger-bg-subtle: #f8d7da;\n  --bs-light-bg-subtle: #fcfcfd;\n  --bs-dark-bg-subtle: #ced4da;\n  --bs-primary-border-subtle: #9ec5fe;\n  --bs-secondary-border-subtle: #c4c8cb;\n  --bs-success-border-subtle: #a3cfbb;\n  --bs-info-border-subtle: #9eeaf9;\n  --bs-warning-border-subtle: #ffe69c;\n  --bs-danger-border-subtle: #f1aeb5;\n  --bs-light-border-subtle: #e9ecef;\n  --bs-dark-border-subtle: #adb5bd;\n  --bs-white-rgb: 255, 255, 255;\n  --bs-black-rgb: 0, 0, 0;\n  --bs-font-sans-serif: system-ui, -apple-system, \"Segoe UI\", Roboto, \"Helvetica Neue\", \"Noto Sans\", \"Liberation Sans\", Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n  --bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n  --bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));\n  --bs-body-font-family: var(--bs-font-sans-serif);\n  --bs-body-font-size: 1rem;\n  --bs-body-font-weight: 400;\n  --bs-body-line-height: 1.5;\n  --bs-body-color: #212529;\n  --bs-body-color-rgb: 33, 37, 41;\n  --bs-body-bg: #fff;\n  --bs-body-bg-rgb: 255, 255, 255;\n  --bs-emphasis-color: #000;\n  --bs-emphasis-color-rgb: 0, 0, 0;\n  --bs-secondary-color: rgba(33, 37, 41, 0.75);\n  --bs-secondary-color-rgb: 33, 37, 41;\n  --bs-secondary-bg: #e9ecef;\n  --bs-secondary-bg-rgb: 233, 236, 239;\n  --bs-tertiary-color: rgba(33, 37, 41, 0.5);\n  --bs-tertiary-color-rgb: 33, 37, 41;\n  --bs-tertiary-bg: #f8f9fa;\n  --bs-tertiary-bg-rgb: 248, 249, 250;\n  --bs-heading-color: inherit;\n  --bs-link-color: #0d6efd;\n  --bs-link-color-rgb: 13, 110, 253;\n  --bs-link-decoration: underline;\n  --bs-link-hover-color: #0a58ca;\n  --bs-link-hover-color-rgb: 10, 88, 202;\n  --bs-code-color: #d63384;\n  --bs-highlight-color: #212529;\n  --bs-highlight-bg: #fff3cd;\n  --bs-border-width: 1px;\n  --bs-border-style: solid;\n  --bs-border-color: #dee2e6;\n  --bs-border-color-translucent: rgba(0, 0, 0, 0.175);\n  --bs-border-radius: 0.375rem;\n  --bs-border-radius-sm: 0.25rem;\n  --bs-border-radius-lg: 0.5rem;\n  --bs-border-radius-xl: 1rem;\n  --bs-border-radius-xxl: 2rem;\n  --bs-border-radius-2xl: var(--bs-border-radius-xxl);\n  --bs-border-radius-pill: 50rem;\n  --bs-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);\n  --bs-box-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);\n  --bs-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175);\n  --bs-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075);\n  --bs-focus-ring-width: 0.25rem;\n  --bs-focus-ring-opacity: 0.25;\n  --bs-focus-ring-color: rgba(13, 110, 253, 0.25);\n  --bs-form-valid-color: #198754;\n  --bs-form-valid-border-color: #198754;\n  --bs-form-invalid-color: #dc3545;\n  --bs-form-invalid-border-color: #dc3545;\n}\n\n[data-bs-theme=dark] {\n  color-scheme: dark;\n  --bs-body-color: #dee2e6;\n  --bs-body-color-rgb: 222, 226, 230;\n  --bs-body-bg: #212529;\n  --bs-body-bg-rgb: 33, 37, 41;\n  --bs-emphasis-color: #fff;\n  --bs-emphasis-color-rgb: 255, 255, 255;\n  --bs-secondary-color: rgba(222, 226, 230, 0.75);\n  --bs-secondary-color-rgb: 222, 226, 230;\n  --bs-secondary-bg: #343a40;\n  --bs-secondary-bg-rgb: 52, 58, 64;\n  --bs-tertiary-color: rgba(222, 226, 230, 0.5);\n  --bs-tertiary-color-rgb: 222, 226, 230;\n  --bs-tertiary-bg: #2b3035;\n  --bs-tertiary-bg-rgb: 43, 48, 53;\n  --bs-primary-text-emphasis: #6ea8fe;\n  --bs-secondary-text-emphasis: #a7acb1;\n  --bs-success-text-emphasis: #75b798;\n  --bs-info-text-emphasis: #6edff6;\n  --bs-warning-text-emphasis: #ffda6a;\n  --bs-danger-text-emphasis: #ea868f;\n  --bs-light-text-emphasis: #f8f9fa;\n  --bs-dark-text-emphasis: #dee2e6;\n  --bs-primary-bg-subtle: #031633;\n  --bs-secondary-bg-subtle: #161719;\n  --bs-success-bg-subtle: #051b11;\n  --bs-info-bg-subtle: #032830;\n  --bs-warning-bg-subtle: #332701;\n  --bs-danger-bg-subtle: #2c0b0e;\n  --bs-light-bg-subtle: #343a40;\n  --bs-dark-bg-subtle: #1a1d20;\n  --bs-primary-border-subtle: #084298;\n  --bs-secondary-border-subtle: #41464b;\n  --bs-success-border-subtle: #0f5132;\n  --bs-info-border-subtle: #087990;\n  --bs-warning-border-subtle: #997404;\n  --bs-danger-border-subtle: #842029;\n  --bs-light-border-subtle: #495057;\n  --bs-dark-border-subtle: #343a40;\n  --bs-heading-color: inherit;\n  --bs-link-color: #6ea8fe;\n  --bs-link-hover-color: #8bb9fe;\n  --bs-link-color-rgb: 110, 168, 254;\n  --bs-link-hover-color-rgb: 139, 185, 254;\n  --bs-code-color: #e685b5;\n  --bs-highlight-color: #dee2e6;\n  --bs-highlight-bg: #664d03;\n  --bs-border-color: #495057;\n  --bs-border-color-translucent: rgba(255, 255, 255, 0.15);\n  --bs-form-valid-color: #75b798;\n  --bs-form-valid-border-color: #75b798;\n  --bs-form-invalid-color: #ea868f;\n  --bs-form-invalid-border-color: #ea868f;\n}\n\n*,\n*::before,\n*::after {\n  box-sizing: border-box;\n}\n\n@media (prefers-reduced-motion: no-preference) {\n  :root {\n    scroll-behavior: smooth;\n  }\n}\n\nbody {\n  margin: 0;\n  font-family: var(--bs-body-font-family);\n  font-size: var(--bs-body-font-size);\n  font-weight: var(--bs-body-font-weight);\n  line-height: var(--bs-body-line-height);\n  color: var(--bs-body-color);\n  text-align: var(--bs-body-text-align);\n  background-color: var(--bs-body-bg);\n  -webkit-text-size-adjust: 100%;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\nhr {\n  margin: 1rem 0;\n  color: inherit;\n  border: 0;\n  border-top: var(--bs-border-width) solid;\n  opacity: 0.25;\n}\n\nh6, h5, h4, h3, h2, h1 {\n  margin-top: 0;\n  margin-bottom: 0.5rem;\n  font-weight: 500;\n  line-height: 1.2;\n  color: var(--bs-heading-color);\n}\n\nh1 {\n  font-size: calc(1.375rem + 1.5vw);\n}\n@media (min-width: 1200px) {\n  h1 {\n    font-size: 2.5rem;\n  }\n}\n\nh2 {\n  font-size: calc(1.325rem + 0.9vw);\n}\n@media (min-width: 1200px) {\n  h2 {\n    font-size: 2rem;\n  }\n}\n\nh3 {\n  font-size: calc(1.3rem + 0.6vw);\n}\n@media (min-width: 1200px) {\n  h3 {\n    font-size: 1.75rem;\n  }\n}\n\nh4 {\n  font-size: calc(1.275rem + 0.3vw);\n}\n@media (min-width: 1200px) {\n  h4 {\n    font-size: 1.5rem;\n  }\n}\n\nh5 {\n  font-size: 1.25rem;\n}\n\nh6 {\n  font-size: 1rem;\n}\n\np {\n  margin-top: 0;\n  margin-bottom: 1rem;\n}\n\nabbr[title] {\n  -webkit-text-decoration: underline dotted;\n  text-decoration: underline dotted;\n  cursor: help;\n  -webkit-text-decoration-skip-ink: none;\n  text-decoration-skip-ink: none;\n}\n\naddress {\n  margin-bottom: 1rem;\n  font-style: normal;\n  line-height: inherit;\n}\n\nol,\nul {\n  padding-right: 2rem;\n}\n\nol,\nul,\ndl {\n  margin-top: 0;\n  margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n  margin-bottom: 0;\n}\n\ndt {\n  font-weight: 700;\n}\n\ndd {\n  margin-bottom: 0.5rem;\n  margin-right: 0;\n}\n\nblockquote {\n  margin: 0 0 1rem;\n}\n\nb,\nstrong {\n  font-weight: bolder;\n}\n\nsmall {\n  font-size: 0.875em;\n}\n\nmark {\n  padding: 0.1875em;\n  color: var(--bs-highlight-color);\n  background-color: var(--bs-highlight-bg);\n}\n\nsub,\nsup {\n  position: relative;\n  font-size: 0.75em;\n  line-height: 0;\n  vertical-align: baseline;\n}\n\nsub {\n  bottom: -0.25em;\n}\n\nsup {\n  top: -0.5em;\n}\n\na {\n  color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 1));\n  text-decoration: underline;\n}\na:hover {\n  --bs-link-color-rgb: var(--bs-link-hover-color-rgb);\n}\n\na:not([href]):not([class]), a:not([href]):not([class]):hover {\n  color: inherit;\n  text-decoration: none;\n}\n\npre,\ncode,\nkbd,\nsamp {\n  font-family: var(--bs-font-monospace);\n  font-size: 1em;\n}\n\npre {\n  display: block;\n  margin-top: 0;\n  margin-bottom: 1rem;\n  overflow: auto;\n  font-size: 0.875em;\n}\npre code {\n  font-size: inherit;\n  color: inherit;\n  word-break: normal;\n}\n\ncode {\n  font-size: 0.875em;\n  color: var(--bs-code-color);\n  word-wrap: break-word;\n}\na > code {\n  color: inherit;\n}\n\nkbd {\n  padding: 0.1875rem 0.375rem;\n  font-size: 0.875em;\n  color: var(--bs-body-bg);\n  background-color: var(--bs-body-color);\n  border-radius: 0.25rem;\n}\nkbd kbd {\n  padding: 0;\n  font-size: 1em;\n}\n\nfigure {\n  margin: 0 0 1rem;\n}\n\nimg,\nsvg {\n  vertical-align: middle;\n}\n\ntable {\n  caption-side: bottom;\n  border-collapse: collapse;\n}\n\ncaption {\n  padding-top: 0.5rem;\n  padding-bottom: 0.5rem;\n  color: var(--bs-secondary-color);\n  text-align: right;\n}\n\nth {\n  text-align: inherit;\n  text-align: -webkit-match-parent;\n}\n\nthead,\ntbody,\ntfoot,\ntr,\ntd,\nth {\n  border-color: inherit;\n  border-style: solid;\n  border-width: 0;\n}\n\nlabel {\n  display: inline-block;\n}\n\nbutton {\n  border-radius: 0;\n}\n\nbutton:focus:not(:focus-visible) {\n  outline: 0;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n  margin: 0;\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\n\nbutton,\nselect {\n  text-transform: none;\n}\n\n[role=button] {\n  cursor: pointer;\n}\n\nselect {\n  word-wrap: normal;\n}\nselect:disabled {\n  opacity: 1;\n}\n\n[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator {\n  display: none !important;\n}\n\nbutton,\n[type=button],\n[type=reset],\n[type=submit] {\n  -webkit-appearance: button;\n}\nbutton:not(:disabled),\n[type=button]:not(:disabled),\n[type=reset]:not(:disabled),\n[type=submit]:not(:disabled) {\n  cursor: pointer;\n}\n\n::-moz-focus-inner {\n  padding: 0;\n  border-style: none;\n}\n\ntextarea {\n  resize: vertical;\n}\n\nfieldset {\n  min-width: 0;\n  padding: 0;\n  margin: 0;\n  border: 0;\n}\n\nlegend {\n  float: right;\n  width: 100%;\n  padding: 0;\n  margin-bottom: 0.5rem;\n  line-height: inherit;\n  font-size: calc(1.275rem + 0.3vw);\n}\n@media (min-width: 1200px) {\n  legend {\n    font-size: 1.5rem;\n  }\n}\nlegend + * {\n  clear: right;\n}\n\n::-webkit-datetime-edit-fields-wrapper,\n::-webkit-datetime-edit-text,\n::-webkit-datetime-edit-minute,\n::-webkit-datetime-edit-hour-field,\n::-webkit-datetime-edit-day-field,\n::-webkit-datetime-edit-month-field,\n::-webkit-datetime-edit-year-field {\n  padding: 0;\n}\n\n::-webkit-inner-spin-button {\n  height: auto;\n}\n\n[type=search] {\n  -webkit-appearance: textfield;\n  outline-offset: -2px;\n}\n[type=search]::-webkit-search-cancel-button {\n  cursor: pointer;\n  filter: grayscale(1);\n}\n\n[type=\"tel\"],\n[type=\"url\"],\n[type=\"email\"],\n[type=\"number\"] {\n  direction: ltr;\n}\n::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\n\n::-webkit-color-swatch-wrapper {\n  padding: 0;\n}\n\n::-webkit-file-upload-button {\n  font: inherit;\n  -webkit-appearance: button;\n}\n\n::file-selector-button {\n  font: inherit;\n  -webkit-appearance: button;\n}\n\noutput {\n  display: inline-block;\n}\n\niframe {\n  border: 0;\n}\n\nsummary {\n  display: list-item;\n  cursor: pointer;\n}\n\nprogress {\n  vertical-align: baseline;\n}\n\n[hidden] {\n  display: none !important;\n}\n/*# sourceMappingURL=bootstrap-reboot.rtl.css.map */"
  },
  {
    "path": "dist/css/bootstrap-utilities.css",
    "content": "/*!\n * Bootstrap Utilities v5.3.8 (https://getbootstrap.com/)\n * Copyright 2011-2025 The Bootstrap Authors\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n:root,\n[data-bs-theme=light] {\n  --bs-blue: #0d6efd;\n  --bs-indigo: #6610f2;\n  --bs-purple: #6f42c1;\n  --bs-pink: #d63384;\n  --bs-red: #dc3545;\n  --bs-orange: #fd7e14;\n  --bs-yellow: #ffc107;\n  --bs-green: #198754;\n  --bs-teal: #20c997;\n  --bs-cyan: #0dcaf0;\n  --bs-black: #000;\n  --bs-white: #fff;\n  --bs-gray: #6c757d;\n  --bs-gray-dark: #343a40;\n  --bs-gray-100: #f8f9fa;\n  --bs-gray-200: #e9ecef;\n  --bs-gray-300: #dee2e6;\n  --bs-gray-400: #ced4da;\n  --bs-gray-500: #adb5bd;\n  --bs-gray-600: #6c757d;\n  --bs-gray-700: #495057;\n  --bs-gray-800: #343a40;\n  --bs-gray-900: #212529;\n  --bs-primary: #0d6efd;\n  --bs-secondary: #6c757d;\n  --bs-success: #198754;\n  --bs-info: #0dcaf0;\n  --bs-warning: #ffc107;\n  --bs-danger: #dc3545;\n  --bs-light: #f8f9fa;\n  --bs-dark: #212529;\n  --bs-primary-rgb: 13, 110, 253;\n  --bs-secondary-rgb: 108, 117, 125;\n  --bs-success-rgb: 25, 135, 84;\n  --bs-info-rgb: 13, 202, 240;\n  --bs-warning-rgb: 255, 193, 7;\n  --bs-danger-rgb: 220, 53, 69;\n  --bs-light-rgb: 248, 249, 250;\n  --bs-dark-rgb: 33, 37, 41;\n  --bs-primary-text-emphasis: #052c65;\n  --bs-secondary-text-emphasis: #2b2f32;\n  --bs-success-text-emphasis: #0a3622;\n  --bs-info-text-emphasis: #055160;\n  --bs-warning-text-emphasis: #664d03;\n  --bs-danger-text-emphasis: #58151c;\n  --bs-light-text-emphasis: #495057;\n  --bs-dark-text-emphasis: #495057;\n  --bs-primary-bg-subtle: #cfe2ff;\n  --bs-secondary-bg-subtle: #e2e3e5;\n  --bs-success-bg-subtle: #d1e7dd;\n  --bs-info-bg-subtle: #cff4fc;\n  --bs-warning-bg-subtle: #fff3cd;\n  --bs-danger-bg-subtle: #f8d7da;\n  --bs-light-bg-subtle: #fcfcfd;\n  --bs-dark-bg-subtle: #ced4da;\n  --bs-primary-border-subtle: #9ec5fe;\n  --bs-secondary-border-subtle: #c4c8cb;\n  --bs-success-border-subtle: #a3cfbb;\n  --bs-info-border-subtle: #9eeaf9;\n  --bs-warning-border-subtle: #ffe69c;\n  --bs-danger-border-subtle: #f1aeb5;\n  --bs-light-border-subtle: #e9ecef;\n  --bs-dark-border-subtle: #adb5bd;\n  --bs-white-rgb: 255, 255, 255;\n  --bs-black-rgb: 0, 0, 0;\n  --bs-font-sans-serif: system-ui, -apple-system, \"Segoe UI\", Roboto, \"Helvetica Neue\", \"Noto Sans\", \"Liberation Sans\", Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n  --bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n  --bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));\n  --bs-body-font-family: var(--bs-font-sans-serif);\n  --bs-body-font-size: 1rem;\n  --bs-body-font-weight: 400;\n  --bs-body-line-height: 1.5;\n  --bs-body-color: #212529;\n  --bs-body-color-rgb: 33, 37, 41;\n  --bs-body-bg: #fff;\n  --bs-body-bg-rgb: 255, 255, 255;\n  --bs-emphasis-color: #000;\n  --bs-emphasis-color-rgb: 0, 0, 0;\n  --bs-secondary-color: rgba(33, 37, 41, 0.75);\n  --bs-secondary-color-rgb: 33, 37, 41;\n  --bs-secondary-bg: #e9ecef;\n  --bs-secondary-bg-rgb: 233, 236, 239;\n  --bs-tertiary-color: rgba(33, 37, 41, 0.5);\n  --bs-tertiary-color-rgb: 33, 37, 41;\n  --bs-tertiary-bg: #f8f9fa;\n  --bs-tertiary-bg-rgb: 248, 249, 250;\n  --bs-heading-color: inherit;\n  --bs-link-color: #0d6efd;\n  --bs-link-color-rgb: 13, 110, 253;\n  --bs-link-decoration: underline;\n  --bs-link-hover-color: #0a58ca;\n  --bs-link-hover-color-rgb: 10, 88, 202;\n  --bs-code-color: #d63384;\n  --bs-highlight-color: #212529;\n  --bs-highlight-bg: #fff3cd;\n  --bs-border-width: 1px;\n  --bs-border-style: solid;\n  --bs-border-color: #dee2e6;\n  --bs-border-color-translucent: rgba(0, 0, 0, 0.175);\n  --bs-border-radius: 0.375rem;\n  --bs-border-radius-sm: 0.25rem;\n  --bs-border-radius-lg: 0.5rem;\n  --bs-border-radius-xl: 1rem;\n  --bs-border-radius-xxl: 2rem;\n  --bs-border-radius-2xl: var(--bs-border-radius-xxl);\n  --bs-border-radius-pill: 50rem;\n  --bs-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);\n  --bs-box-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);\n  --bs-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175);\n  --bs-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075);\n  --bs-focus-ring-width: 0.25rem;\n  --bs-focus-ring-opacity: 0.25;\n  --bs-focus-ring-color: rgba(13, 110, 253, 0.25);\n  --bs-form-valid-color: #198754;\n  --bs-form-valid-border-color: #198754;\n  --bs-form-invalid-color: #dc3545;\n  --bs-form-invalid-border-color: #dc3545;\n}\n\n[data-bs-theme=dark] {\n  color-scheme: dark;\n  --bs-body-color: #dee2e6;\n  --bs-body-color-rgb: 222, 226, 230;\n  --bs-body-bg: #212529;\n  --bs-body-bg-rgb: 33, 37, 41;\n  --bs-emphasis-color: #fff;\n  --bs-emphasis-color-rgb: 255, 255, 255;\n  --bs-secondary-color: rgba(222, 226, 230, 0.75);\n  --bs-secondary-color-rgb: 222, 226, 230;\n  --bs-secondary-bg: #343a40;\n  --bs-secondary-bg-rgb: 52, 58, 64;\n  --bs-tertiary-color: rgba(222, 226, 230, 0.5);\n  --bs-tertiary-color-rgb: 222, 226, 230;\n  --bs-tertiary-bg: #2b3035;\n  --bs-tertiary-bg-rgb: 43, 48, 53;\n  --bs-primary-text-emphasis: #6ea8fe;\n  --bs-secondary-text-emphasis: #a7acb1;\n  --bs-success-text-emphasis: #75b798;\n  --bs-info-text-emphasis: #6edff6;\n  --bs-warning-text-emphasis: #ffda6a;\n  --bs-danger-text-emphasis: #ea868f;\n  --bs-light-text-emphasis: #f8f9fa;\n  --bs-dark-text-emphasis: #dee2e6;\n  --bs-primary-bg-subtle: #031633;\n  --bs-secondary-bg-subtle: #161719;\n  --bs-success-bg-subtle: #051b11;\n  --bs-info-bg-subtle: #032830;\n  --bs-warning-bg-subtle: #332701;\n  --bs-danger-bg-subtle: #2c0b0e;\n  --bs-light-bg-subtle: #343a40;\n  --bs-dark-bg-subtle: #1a1d20;\n  --bs-primary-border-subtle: #084298;\n  --bs-secondary-border-subtle: #41464b;\n  --bs-success-border-subtle: #0f5132;\n  --bs-info-border-subtle: #087990;\n  --bs-warning-border-subtle: #997404;\n  --bs-danger-border-subtle: #842029;\n  --bs-light-border-subtle: #495057;\n  --bs-dark-border-subtle: #343a40;\n  --bs-heading-color: inherit;\n  --bs-link-color: #6ea8fe;\n  --bs-link-hover-color: #8bb9fe;\n  --bs-link-color-rgb: 110, 168, 254;\n  --bs-link-hover-color-rgb: 139, 185, 254;\n  --bs-code-color: #e685b5;\n  --bs-highlight-color: #dee2e6;\n  --bs-highlight-bg: #664d03;\n  --bs-border-color: #495057;\n  --bs-border-color-translucent: rgba(255, 255, 255, 0.15);\n  --bs-form-valid-color: #75b798;\n  --bs-form-valid-border-color: #75b798;\n  --bs-form-invalid-color: #ea868f;\n  --bs-form-invalid-border-color: #ea868f;\n}\n\n.clearfix::after {\n  display: block;\n  clear: both;\n  content: \"\";\n}\n\n.text-bg-primary {\n  color: #fff !important;\n  background-color: RGBA(var(--bs-primary-rgb), var(--bs-bg-opacity, 1)) !important;\n}\n\n.text-bg-secondary {\n  color: #fff !important;\n  background-color: RGBA(var(--bs-secondary-rgb), var(--bs-bg-opacity, 1)) !important;\n}\n\n.text-bg-success {\n  color: #fff !important;\n  background-color: RGBA(var(--bs-success-rgb), var(--bs-bg-opacity, 1)) !important;\n}\n\n.text-bg-info {\n  color: #000 !important;\n  background-color: RGBA(var(--bs-info-rgb), var(--bs-bg-opacity, 1)) !important;\n}\n\n.text-bg-warning {\n  color: #000 !important;\n  background-color: RGBA(var(--bs-warning-rgb), var(--bs-bg-opacity, 1)) !important;\n}\n\n.text-bg-danger {\n  color: #fff !important;\n  background-color: RGBA(var(--bs-danger-rgb), var(--bs-bg-opacity, 1)) !important;\n}\n\n.text-bg-light {\n  color: #000 !important;\n  background-color: RGBA(var(--bs-light-rgb), var(--bs-bg-opacity, 1)) !important;\n}\n\n.text-bg-dark {\n  color: #fff !important;\n  background-color: RGBA(var(--bs-dark-rgb), var(--bs-bg-opacity, 1)) !important;\n}\n\n.link-primary {\n  color: RGBA(var(--bs-primary-rgb), var(--bs-link-opacity, 1)) !important;\n  -webkit-text-decoration-color: RGBA(var(--bs-primary-rgb), var(--bs-link-underline-opacity, 1)) !important;\n  text-decoration-color: RGBA(var(--bs-primary-rgb), var(--bs-link-underline-opacity, 1)) !important;\n}\n.link-primary:hover, .link-primary:focus {\n  color: RGBA(10, 88, 202, var(--bs-link-opacity, 1)) !important;\n  -webkit-text-decoration-color: RGBA(10, 88, 202, var(--bs-link-underline-opacity, 1)) !important;\n  text-decoration-color: RGBA(10, 88, 202, var(--bs-link-underline-opacity, 1)) !important;\n}\n\n.link-secondary {\n  color: RGBA(var(--bs-secondary-rgb), var(--bs-link-opacity, 1)) !important;\n  -webkit-text-decoration-color: RGBA(var(--bs-secondary-rgb), var(--bs-link-underline-opacity, 1)) !important;\n  text-decoration-color: RGBA(var(--bs-secondary-rgb), var(--bs-link-underline-opacity, 1)) !important;\n}\n.link-secondary:hover, .link-secondary:focus {\n  color: RGBA(86, 94, 100, var(--bs-link-opacity, 1)) !important;\n  -webkit-text-decoration-color: RGBA(86, 94, 100, var(--bs-link-underline-opacity, 1)) !important;\n  text-decoration-color: RGBA(86, 94, 100, var(--bs-link-underline-opacity, 1)) !important;\n}\n\n.link-success {\n  color: RGBA(var(--bs-success-rgb), var(--bs-link-opacity, 1)) !important;\n  -webkit-text-decoration-color: RGBA(var(--bs-success-rgb), var(--bs-link-underline-opacity, 1)) !important;\n  text-decoration-color: RGBA(var(--bs-success-rgb), var(--bs-link-underline-opacity, 1)) !important;\n}\n.link-success:hover, .link-success:focus {\n  color: RGBA(20, 108, 67, var(--bs-link-opacity, 1)) !important;\n  -webkit-text-decoration-color: RGBA(20, 108, 67, var(--bs-link-underline-opacity, 1)) !important;\n  text-decoration-color: RGBA(20, 108, 67, var(--bs-link-underline-opacity, 1)) !important;\n}\n\n.link-info {\n  color: RGBA(var(--bs-info-rgb), var(--bs-link-opacity, 1)) !important;\n  -webkit-text-decoration-color: RGBA(var(--bs-info-rgb), var(--bs-link-underline-opacity, 1)) !important;\n  text-decoration-color: RGBA(var(--bs-info-rgb), var(--bs-link-underline-opacity, 1)) !important;\n}\n.link-info:hover, .link-info:focus {\n  color: RGBA(61, 213, 243, var(--bs-link-opacity, 1)) !important;\n  -webkit-text-decoration-color: RGBA(61, 213, 243, var(--bs-link-underline-opacity, 1)) !important;\n  text-decoration-color: RGBA(61, 213, 243, var(--bs-link-underline-opacity, 1)) !important;\n}\n\n.link-warning {\n  color: RGBA(var(--bs-warning-rgb), var(--bs-link-opacity, 1)) !important;\n  -webkit-text-decoration-color: RGBA(var(--bs-warning-rgb), var(--bs-link-underline-opacity, 1)) !important;\n  text-decoration-color: RGBA(var(--bs-warning-rgb), var(--bs-link-underline-opacity, 1)) !important;\n}\n.link-warning:hover, .link-warning:focus {\n  color: RGBA(255, 205, 57, var(--bs-link-opacity, 1)) !important;\n  -webkit-text-decoration-color: RGBA(255, 205, 57, var(--bs-link-underline-opacity, 1)) !important;\n  text-decoration-color: RGBA(255, 205, 57, var(--bs-link-underline-opacity, 1)) !important;\n}\n\n.link-danger {\n  color: RGBA(var(--bs-danger-rgb), var(--bs-link-opacity, 1)) !important;\n  -webkit-text-decoration-color: RGBA(var(--bs-danger-rgb), var(--bs-link-underline-opacity, 1)) !important;\n  text-decoration-color: RGBA(var(--bs-danger-rgb), var(--bs-link-underline-opacity, 1)) !important;\n}\n.link-danger:hover, .link-danger:focus {\n  color: RGBA(176, 42, 55, var(--bs-link-opacity, 1)) !important;\n  -webkit-text-decoration-color: RGBA(176, 42, 55, var(--bs-link-underline-opacity, 1)) !important;\n  text-decoration-color: RGBA(176, 42, 55, var(--bs-link-underline-opacity, 1)) !important;\n}\n\n.link-light {\n  color: RGBA(var(--bs-light-rgb), var(--bs-link-opacity, 1)) !important;\n  -webkit-text-decoration-color: RGBA(var(--bs-light-rgb), var(--bs-link-underline-opacity, 1)) !important;\n  text-decoration-color: RGBA(var(--bs-light-rgb), var(--bs-link-underline-opacity, 1)) !important;\n}\n.link-light:hover, .link-light:focus {\n  color: RGBA(249, 250, 251, var(--bs-link-opacity, 1)) !important;\n  -webkit-text-decoration-color: RGBA(249, 250, 251, var(--bs-link-underline-opacity, 1)) !important;\n  text-decoration-color: RGBA(249, 250, 251, var(--bs-link-underline-opacity, 1)) !important;\n}\n\n.link-dark {\n  color: RGBA(var(--bs-dark-rgb), var(--bs-link-opacity, 1)) !important;\n  -webkit-text-decoration-color: RGBA(var(--bs-dark-rgb), var(--bs-link-underline-opacity, 1)) !important;\n  text-decoration-color: RGBA(var(--bs-dark-rgb), var(--bs-link-underline-opacity, 1)) !important;\n}\n.link-dark:hover, .link-dark:focus {\n  color: RGBA(26, 30, 33, var(--bs-link-opacity, 1)) !important;\n  -webkit-text-decoration-color: RGBA(26, 30, 33, var(--bs-link-underline-opacity, 1)) !important;\n  text-decoration-color: RGBA(26, 30, 33, var(--bs-link-underline-opacity, 1)) !important;\n}\n\n.link-body-emphasis {\n  color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 1)) !important;\n  -webkit-text-decoration-color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 1)) !important;\n  text-decoration-color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 1)) !important;\n}\n.link-body-emphasis:hover, .link-body-emphasis:focus {\n  color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 0.75)) !important;\n  -webkit-text-decoration-color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 0.75)) !important;\n  text-decoration-color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 0.75)) !important;\n}\n\n.focus-ring:focus {\n  outline: 0;\n  box-shadow: var(--bs-focus-ring-x, 0) var(--bs-focus-ring-y, 0) var(--bs-focus-ring-blur, 0) var(--bs-focus-ring-width) var(--bs-focus-ring-color);\n}\n\n.icon-link {\n  display: inline-flex;\n  gap: 0.375rem;\n  align-items: center;\n  -webkit-text-decoration-color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 0.5));\n  text-decoration-color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 0.5));\n  text-underline-offset: 0.25em;\n  -webkit-backface-visibility: hidden;\n  backface-visibility: hidden;\n}\n.icon-link > .bi {\n  flex-shrink: 0;\n  width: 1em;\n  height: 1em;\n  fill: currentcolor;\n  transition: 0.2s ease-in-out transform;\n}\n@media (prefers-reduced-motion: reduce) {\n  .icon-link > .bi {\n    transition: none;\n  }\n}\n\n.icon-link-hover:hover > .bi, .icon-link-hover:focus-visible > .bi {\n  transform: var(--bs-icon-link-transform, translate3d(0.25em, 0, 0));\n}\n\n.ratio {\n  position: relative;\n  width: 100%;\n}\n.ratio::before {\n  display: block;\n  padding-top: var(--bs-aspect-ratio);\n  content: \"\";\n}\n.ratio > * {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n}\n\n.ratio-1x1 {\n  --bs-aspect-ratio: 100%;\n}\n\n.ratio-4x3 {\n  --bs-aspect-ratio: 75%;\n}\n\n.ratio-16x9 {\n  --bs-aspect-ratio: 56.25%;\n}\n\n.ratio-21x9 {\n  --bs-aspect-ratio: 42.8571428571%;\n}\n\n.fixed-top {\n  position: fixed;\n  top: 0;\n  right: 0;\n  left: 0;\n  z-index: 1030;\n}\n\n.fixed-bottom {\n  position: fixed;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1030;\n}\n\n.sticky-top {\n  position: -webkit-sticky;\n  position: sticky;\n  top: 0;\n  z-index: 1020;\n}\n\n.sticky-bottom {\n  position: -webkit-sticky;\n  position: sticky;\n  bottom: 0;\n  z-index: 1020;\n}\n\n@media (min-width: 576px) {\n  .sticky-sm-top {\n    position: -webkit-sticky;\n    position: sticky;\n    top: 0;\n    z-index: 1020;\n  }\n  .sticky-sm-bottom {\n    position: -webkit-sticky;\n    position: sticky;\n    bottom: 0;\n    z-index: 1020;\n  }\n}\n@media (min-width: 768px) {\n  .sticky-md-top {\n    position: -webkit-sticky;\n    position: sticky;\n    top: 0;\n    z-index: 1020;\n  }\n  .sticky-md-bottom {\n    position: -webkit-sticky;\n    position: sticky;\n    bottom: 0;\n    z-index: 1020;\n  }\n}\n@media (min-width: 992px) {\n  .sticky-lg-top {\n    position: -webkit-sticky;\n    position: sticky;\n    top: 0;\n    z-index: 1020;\n  }\n  .sticky-lg-bottom {\n    position: -webkit-sticky;\n    position: sticky;\n    bottom: 0;\n    z-index: 1020;\n  }\n}\n@media (min-width: 1200px) {\n  .sticky-xl-top {\n    position: -webkit-sticky;\n    position: sticky;\n    top: 0;\n    z-index: 1020;\n  }\n  .sticky-xl-bottom {\n    position: -webkit-sticky;\n    position: sticky;\n    bottom: 0;\n    z-index: 1020;\n  }\n}\n@media (min-width: 1400px) {\n  .sticky-xxl-top {\n    position: -webkit-sticky;\n    position: sticky;\n    top: 0;\n    z-index: 1020;\n  }\n  .sticky-xxl-bottom {\n    position: -webkit-sticky;\n    position: sticky;\n    bottom: 0;\n    z-index: 1020;\n  }\n}\n.hstack {\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  align-self: stretch;\n}\n\n.vstack {\n  display: flex;\n  flex: 1 1 auto;\n  flex-direction: column;\n  align-self: stretch;\n}\n\n.visually-hidden,\n.visually-hidden-focusable:not(:focus):not(:focus-within) {\n  width: 1px !important;\n  height: 1px !important;\n  padding: 0 !important;\n  margin: -1px !important;\n  overflow: hidden !important;\n  clip: rect(0, 0, 0, 0) !important;\n  white-space: nowrap !important;\n  border: 0 !important;\n}\n.visually-hidden:not(caption),\n.visually-hidden-focusable:not(:focus):not(:focus-within):not(caption) {\n  position: absolute !important;\n}\n.visually-hidden *,\n.visually-hidden-focusable:not(:focus):not(:focus-within) * {\n  overflow: hidden !important;\n}\n\n.stretched-link::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1;\n  content: \"\";\n}\n\n.text-truncate {\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n\n.vr {\n  display: inline-block;\n  align-self: stretch;\n  width: var(--bs-border-width);\n  min-height: 1em;\n  background-color: currentcolor;\n  opacity: 0.25;\n}\n\n.align-baseline {\n  vertical-align: baseline !important;\n}\n\n.align-top {\n  vertical-align: top !important;\n}\n\n.align-middle {\n  vertical-align: middle !important;\n}\n\n.align-bottom {\n  vertical-align: bottom !important;\n}\n\n.align-text-bottom {\n  vertical-align: text-bottom !important;\n}\n\n.align-text-top {\n  vertical-align: text-top !important;\n}\n\n.float-start {\n  float: left !important;\n}\n\n.float-end {\n  float: right !important;\n}\n\n.float-none {\n  float: none !important;\n}\n\n.object-fit-contain {\n  -o-object-fit: contain !important;\n  object-fit: contain !important;\n}\n\n.object-fit-cover {\n  -o-object-fit: cover !important;\n  object-fit: cover !important;\n}\n\n.object-fit-fill {\n  -o-object-fit: fill !important;\n  object-fit: fill !important;\n}\n\n.object-fit-scale {\n  -o-object-fit: scale-down !important;\n  object-fit: scale-down !important;\n}\n\n.object-fit-none {\n  -o-object-fit: none !important;\n  object-fit: none !important;\n}\n\n.opacity-0 {\n  opacity: 0 !important;\n}\n\n.opacity-25 {\n  opacity: 0.25 !important;\n}\n\n.opacity-50 {\n  opacity: 0.5 !important;\n}\n\n.opacity-75 {\n  opacity: 0.75 !important;\n}\n\n.opacity-100 {\n  opacity: 1 !important;\n}\n\n.overflow-auto {\n  overflow: auto !important;\n}\n\n.overflow-hidden {\n  overflow: hidden !important;\n}\n\n.overflow-visible {\n  overflow: visible !important;\n}\n\n.overflow-scroll {\n  overflow: scroll !important;\n}\n\n.overflow-x-auto {\n  overflow-x: auto !important;\n}\n\n.overflow-x-hidden {\n  overflow-x: hidden !important;\n}\n\n.overflow-x-visible {\n  overflow-x: visible !important;\n}\n\n.overflow-x-scroll {\n  overflow-x: scroll !important;\n}\n\n.overflow-y-auto {\n  overflow-y: auto !important;\n}\n\n.overflow-y-hidden {\n  overflow-y: hidden !important;\n}\n\n.overflow-y-visible {\n  overflow-y: visible !important;\n}\n\n.overflow-y-scroll {\n  overflow-y: scroll !important;\n}\n\n.d-inline {\n  display: inline !important;\n}\n\n.d-inline-block {\n  display: inline-block !important;\n}\n\n.d-block {\n  display: block !important;\n}\n\n.d-grid {\n  display: grid !important;\n}\n\n.d-inline-grid {\n  display: inline-grid !important;\n}\n\n.d-table {\n  display: table !important;\n}\n\n.d-table-row {\n  display: table-row !important;\n}\n\n.d-table-cell {\n  display: table-cell !important;\n}\n\n.d-flex {\n  display: flex !important;\n}\n\n.d-inline-flex {\n  display: inline-flex !important;\n}\n\n.d-none {\n  display: none !important;\n}\n\n.shadow {\n  box-shadow: var(--bs-box-shadow) !important;\n}\n\n.shadow-sm {\n  box-shadow: var(--bs-box-shadow-sm) !important;\n}\n\n.shadow-lg {\n  box-shadow: var(--bs-box-shadow-lg) !important;\n}\n\n.shadow-none {\n  box-shadow: none !important;\n}\n\n.focus-ring-primary {\n  --bs-focus-ring-color: rgba(var(--bs-primary-rgb), var(--bs-focus-ring-opacity));\n}\n\n.focus-ring-secondary {\n  --bs-focus-ring-color: rgba(var(--bs-secondary-rgb), var(--bs-focus-ring-opacity));\n}\n\n.focus-ring-success {\n  --bs-focus-ring-color: rgba(var(--bs-success-rgb), var(--bs-focus-ring-opacity));\n}\n\n.focus-ring-info {\n  --bs-focus-ring-color: rgba(var(--bs-info-rgb), var(--bs-focus-ring-opacity));\n}\n\n.focus-ring-warning {\n  --bs-focus-ring-color: rgba(var(--bs-warning-rgb), var(--bs-focus-ring-opacity));\n}\n\n.focus-ring-danger {\n  --bs-focus-ring-color: rgba(var(--bs-danger-rgb), var(--bs-focus-ring-opacity));\n}\n\n.focus-ring-light {\n  --bs-focus-ring-color: rgba(var(--bs-light-rgb), var(--bs-focus-ring-opacity));\n}\n\n.focus-ring-dark {\n  --bs-focus-ring-color: rgba(var(--bs-dark-rgb), var(--bs-focus-ring-opacity));\n}\n\n.position-static {\n  position: static !important;\n}\n\n.position-relative {\n  position: relative !important;\n}\n\n.position-absolute {\n  position: absolute !important;\n}\n\n.position-fixed {\n  position: fixed !important;\n}\n\n.position-sticky {\n  position: -webkit-sticky !important;\n  position: sticky !important;\n}\n\n.top-0 {\n  top: 0 !important;\n}\n\n.top-50 {\n  top: 50% !important;\n}\n\n.top-100 {\n  top: 100% !important;\n}\n\n.bottom-0 {\n  bottom: 0 !important;\n}\n\n.bottom-50 {\n  bottom: 50% !important;\n}\n\n.bottom-100 {\n  bottom: 100% !important;\n}\n\n.start-0 {\n  left: 0 !important;\n}\n\n.start-50 {\n  left: 50% !important;\n}\n\n.start-100 {\n  left: 100% !important;\n}\n\n.end-0 {\n  right: 0 !important;\n}\n\n.end-50 {\n  right: 50% !important;\n}\n\n.end-100 {\n  right: 100% !important;\n}\n\n.translate-middle {\n  transform: translate(-50%, -50%) !important;\n}\n\n.translate-middle-x {\n  transform: translateX(-50%) !important;\n}\n\n.translate-middle-y {\n  transform: translateY(-50%) !important;\n}\n\n.border {\n  border: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important;\n}\n\n.border-0 {\n  border: 0 !important;\n}\n\n.border-top {\n  border-top: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important;\n}\n\n.border-top-0 {\n  border-top: 0 !important;\n}\n\n.border-end {\n  border-right: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important;\n}\n\n.border-end-0 {\n  border-right: 0 !important;\n}\n\n.border-bottom {\n  border-bottom: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important;\n}\n\n.border-bottom-0 {\n  border-bottom: 0 !important;\n}\n\n.border-start {\n  border-left: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important;\n}\n\n.border-start-0 {\n  border-left: 0 !important;\n}\n\n.border-primary {\n  --bs-border-opacity: 1;\n  border-color: rgba(var(--bs-primary-rgb), var(--bs-border-opacity)) !important;\n}\n\n.border-secondary {\n  --bs-border-opacity: 1;\n  border-color: rgba(var(--bs-secondary-rgb), var(--bs-border-opacity)) !important;\n}\n\n.border-success {\n  --bs-border-opacity: 1;\n  border-color: rgba(var(--bs-success-rgb), var(--bs-border-opacity)) !important;\n}\n\n.border-info {\n  --bs-border-opacity: 1;\n  border-color: rgba(var(--bs-info-rgb), var(--bs-border-opacity)) !important;\n}\n\n.border-warning {\n  --bs-border-opacity: 1;\n  border-color: rgba(var(--bs-warning-rgb), var(--bs-border-opacity)) !important;\n}\n\n.border-danger {\n  --bs-border-opacity: 1;\n  border-color: rgba(var(--bs-danger-rgb), var(--bs-border-opacity)) !important;\n}\n\n.border-light {\n  --bs-border-opacity: 1;\n  border-color: rgba(var(--bs-light-rgb), var(--bs-border-opacity)) !important;\n}\n\n.border-dark {\n  --bs-border-opacity: 1;\n  border-color: rgba(var(--bs-dark-rgb), var(--bs-border-opacity)) !important;\n}\n\n.border-black {\n  --bs-border-opacity: 1;\n  border-color: rgba(var(--bs-black-rgb), var(--bs-border-opacity)) !important;\n}\n\n.border-white {\n  --bs-border-opacity: 1;\n  border-color: rgba(var(--bs-white-rgb), var(--bs-border-opacity)) !important;\n}\n\n.border-primary-subtle {\n  border-color: var(--bs-primary-border-subtle) !important;\n}\n\n.border-secondary-subtle {\n  border-color: var(--bs-secondary-border-subtle) !important;\n}\n\n.border-success-subtle {\n  border-color: var(--bs-success-border-subtle) !important;\n}\n\n.border-info-subtle {\n  border-color: var(--bs-info-border-subtle) !important;\n}\n\n.border-warning-subtle {\n  border-color: var(--bs-warning-border-subtle) !important;\n}\n\n.border-danger-subtle {\n  border-color: var(--bs-danger-border-subtle) !important;\n}\n\n.border-light-subtle {\n  border-color: var(--bs-light-border-subtle) !important;\n}\n\n.border-dark-subtle {\n  border-color: var(--bs-dark-border-subtle) !important;\n}\n\n.border-1 {\n  border-width: 1px !important;\n}\n\n.border-2 {\n  border-width: 2px !important;\n}\n\n.border-3 {\n  border-width: 3px !important;\n}\n\n.border-4 {\n  border-width: 4px !important;\n}\n\n.border-5 {\n  border-width: 5px !important;\n}\n\n.border-opacity-10 {\n  --bs-border-opacity: 0.1;\n}\n\n.border-opacity-25 {\n  --bs-border-opacity: 0.25;\n}\n\n.border-opacity-50 {\n  --bs-border-opacity: 0.5;\n}\n\n.border-opacity-75 {\n  --bs-border-opacity: 0.75;\n}\n\n.border-opacity-100 {\n  --bs-border-opacity: 1;\n}\n\n.w-25 {\n  width: 25% !important;\n}\n\n.w-50 {\n  width: 50% !important;\n}\n\n.w-75 {\n  width: 75% !important;\n}\n\n.w-100 {\n  width: 100% !important;\n}\n\n.w-auto {\n  width: auto !important;\n}\n\n.mw-100 {\n  max-width: 100% !important;\n}\n\n.vw-100 {\n  width: 100vw !important;\n}\n\n.min-vw-100 {\n  min-width: 100vw !important;\n}\n\n.h-25 {\n  height: 25% !important;\n}\n\n.h-50 {\n  height: 50% !important;\n}\n\n.h-75 {\n  height: 75% !important;\n}\n\n.h-100 {\n  height: 100% !important;\n}\n\n.h-auto {\n  height: auto !important;\n}\n\n.mh-100 {\n  max-height: 100% !important;\n}\n\n.vh-100 {\n  height: 100vh !important;\n}\n\n.min-vh-100 {\n  min-height: 100vh !important;\n}\n\n.flex-fill {\n  flex: 1 1 auto !important;\n}\n\n.flex-row {\n  flex-direction: row !important;\n}\n\n.flex-column {\n  flex-direction: column !important;\n}\n\n.flex-row-reverse {\n  flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n  flex-direction: column-reverse !important;\n}\n\n.flex-grow-0 {\n  flex-grow: 0 !important;\n}\n\n.flex-grow-1 {\n  flex-grow: 1 !important;\n}\n\n.flex-shrink-0 {\n  flex-shrink: 0 !important;\n}\n\n.flex-shrink-1 {\n  flex-shrink: 1 !important;\n}\n\n.flex-wrap {\n  flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n  flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n  flex-wrap: wrap-reverse !important;\n}\n\n.justify-content-start {\n  justify-content: flex-start !important;\n}\n\n.justify-content-end {\n  justify-content: flex-end !important;\n}\n\n.justify-content-center {\n  justify-content: center !important;\n}\n\n.justify-content-between {\n  justify-content: space-between !important;\n}\n\n.justify-content-around {\n  justify-content: space-around !important;\n}\n\n.justify-content-evenly {\n  justify-content: space-evenly !important;\n}\n\n.align-items-start {\n  align-items: flex-start !important;\n}\n\n.align-items-end {\n  align-items: flex-end !important;\n}\n\n.align-items-center {\n  align-items: center !important;\n}\n\n.align-items-baseline {\n  align-items: baseline !important;\n}\n\n.align-items-stretch {\n  align-items: stretch !important;\n}\n\n.align-content-start {\n  align-content: flex-start !important;\n}\n\n.align-content-end {\n  align-content: flex-end !important;\n}\n\n.align-content-center {\n  align-content: center !important;\n}\n\n.align-content-between {\n  align-content: space-between !important;\n}\n\n.align-content-around {\n  align-content: space-around !important;\n}\n\n.align-content-stretch {\n  align-content: stretch !important;\n}\n\n.align-self-auto {\n  align-self: auto !important;\n}\n\n.align-self-start {\n  align-self: flex-start !important;\n}\n\n.align-self-end {\n  align-self: flex-end !important;\n}\n\n.align-self-center {\n  align-self: center !important;\n}\n\n.align-self-baseline {\n  align-self: baseline !important;\n}\n\n.align-self-stretch {\n  align-self: stretch !important;\n}\n\n.order-first {\n  order: -1 !important;\n}\n\n.order-0 {\n  order: 0 !important;\n}\n\n.order-1 {\n  order: 1 !important;\n}\n\n.order-2 {\n  order: 2 !important;\n}\n\n.order-3 {\n  order: 3 !important;\n}\n\n.order-4 {\n  order: 4 !important;\n}\n\n.order-5 {\n  order: 5 !important;\n}\n\n.order-last {\n  order: 6 !important;\n}\n\n.m-0 {\n  margin: 0 !important;\n}\n\n.m-1 {\n  margin: 0.25rem !important;\n}\n\n.m-2 {\n  margin: 0.5rem !important;\n}\n\n.m-3 {\n  margin: 1rem !important;\n}\n\n.m-4 {\n  margin: 1.5rem !important;\n}\n\n.m-5 {\n  margin: 3rem !important;\n}\n\n.m-auto {\n  margin: auto !important;\n}\n\n.mx-0 {\n  margin-right: 0 !important;\n  margin-left: 0 !important;\n}\n\n.mx-1 {\n  margin-right: 0.25rem !important;\n  margin-left: 0.25rem !important;\n}\n\n.mx-2 {\n  margin-right: 0.5rem !important;\n  margin-left: 0.5rem !important;\n}\n\n.mx-3 {\n  margin-right: 1rem !important;\n  margin-left: 1rem !important;\n}\n\n.mx-4 {\n  margin-right: 1.5rem !important;\n  margin-left: 1.5rem !important;\n}\n\n.mx-5 {\n  margin-right: 3rem !important;\n  margin-left: 3rem !important;\n}\n\n.mx-auto {\n  margin-right: auto !important;\n  margin-left: auto !important;\n}\n\n.my-0 {\n  margin-top: 0 !important;\n  margin-bottom: 0 !important;\n}\n\n.my-1 {\n  margin-top: 0.25rem !important;\n  margin-bottom: 0.25rem !important;\n}\n\n.my-2 {\n  margin-top: 0.5rem !important;\n  margin-bottom: 0.5rem !important;\n}\n\n.my-3 {\n  margin-top: 1rem !important;\n  margin-bottom: 1rem !important;\n}\n\n.my-4 {\n  margin-top: 1.5rem !important;\n  margin-bottom: 1.5rem !important;\n}\n\n.my-5 {\n  margin-top: 3rem !important;\n  margin-bottom: 3rem !important;\n}\n\n.my-auto {\n  margin-top: auto !important;\n  margin-bottom: auto !important;\n}\n\n.mt-0 {\n  margin-top: 0 !important;\n}\n\n.mt-1 {\n  margin-top: 0.25rem !important;\n}\n\n.mt-2 {\n  margin-top: 0.5rem !important;\n}\n\n.mt-3 {\n  margin-top: 1rem !important;\n}\n\n.mt-4 {\n  margin-top: 1.5rem !important;\n}\n\n.mt-5 {\n  margin-top: 3rem !important;\n}\n\n.mt-auto {\n  margin-top: auto !important;\n}\n\n.me-0 {\n  margin-right: 0 !important;\n}\n\n.me-1 {\n  margin-right: 0.25rem !important;\n}\n\n.me-2 {\n  margin-right: 0.5rem !important;\n}\n\n.me-3 {\n  margin-right: 1rem !important;\n}\n\n.me-4 {\n  margin-right: 1.5rem !important;\n}\n\n.me-5 {\n  margin-right: 3rem !important;\n}\n\n.me-auto {\n  margin-right: auto !important;\n}\n\n.mb-0 {\n  margin-bottom: 0 !important;\n}\n\n.mb-1 {\n  margin-bottom: 0.25rem !important;\n}\n\n.mb-2 {\n  margin-bottom: 0.5rem !important;\n}\n\n.mb-3 {\n  margin-bottom: 1rem !important;\n}\n\n.mb-4 {\n  margin-bottom: 1.5rem !important;\n}\n\n.mb-5 {\n  margin-bottom: 3rem !important;\n}\n\n.mb-auto {\n  margin-bottom: auto !important;\n}\n\n.ms-0 {\n  margin-left: 0 !important;\n}\n\n.ms-1 {\n  margin-left: 0.25rem !important;\n}\n\n.ms-2 {\n  margin-left: 0.5rem !important;\n}\n\n.ms-3 {\n  margin-left: 1rem !important;\n}\n\n.ms-4 {\n  margin-left: 1.5rem !important;\n}\n\n.ms-5 {\n  margin-left: 3rem !important;\n}\n\n.ms-auto {\n  margin-left: auto !important;\n}\n\n.p-0 {\n  padding: 0 !important;\n}\n\n.p-1 {\n  padding: 0.25rem !important;\n}\n\n.p-2 {\n  padding: 0.5rem !important;\n}\n\n.p-3 {\n  padding: 1rem !important;\n}\n\n.p-4 {\n  padding: 1.5rem !important;\n}\n\n.p-5 {\n  padding: 3rem !important;\n}\n\n.px-0 {\n  padding-right: 0 !important;\n  padding-left: 0 !important;\n}\n\n.px-1 {\n  padding-right: 0.25rem !important;\n  padding-left: 0.25rem !important;\n}\n\n.px-2 {\n  padding-right: 0.5rem !important;\n  padding-left: 0.5rem !important;\n}\n\n.px-3 {\n  padding-right: 1rem !important;\n  padding-left: 1rem !important;\n}\n\n.px-4 {\n  padding-right: 1.5rem !important;\n  padding-left: 1.5rem !important;\n}\n\n.px-5 {\n  padding-right: 3rem !important;\n  padding-left: 3rem !important;\n}\n\n.py-0 {\n  padding-top: 0 !important;\n  padding-bottom: 0 !important;\n}\n\n.py-1 {\n  padding-top: 0.25rem !important;\n  padding-bottom: 0.25rem !important;\n}\n\n.py-2 {\n  padding-top: 0.5rem !important;\n  padding-bottom: 0.5rem !important;\n}\n\n.py-3 {\n  padding-top: 1rem !important;\n  padding-bottom: 1rem !important;\n}\n\n.py-4 {\n  padding-top: 1.5rem !important;\n  padding-bottom: 1.5rem !important;\n}\n\n.py-5 {\n  padding-top: 3rem !important;\n  padding-bottom: 3rem !important;\n}\n\n.pt-0 {\n  padding-top: 0 !important;\n}\n\n.pt-1 {\n  padding-top: 0.25rem !important;\n}\n\n.pt-2 {\n  padding-top: 0.5rem !important;\n}\n\n.pt-3 {\n  padding-top: 1rem !important;\n}\n\n.pt-4 {\n  padding-top: 1.5rem !important;\n}\n\n.pt-5 {\n  padding-top: 3rem !important;\n}\n\n.pe-0 {\n  padding-right: 0 !important;\n}\n\n.pe-1 {\n  padding-right: 0.25rem !important;\n}\n\n.pe-2 {\n  padding-right: 0.5rem !important;\n}\n\n.pe-3 {\n  padding-right: 1rem !important;\n}\n\n.pe-4 {\n  padding-right: 1.5rem !important;\n}\n\n.pe-5 {\n  padding-right: 3rem !important;\n}\n\n.pb-0 {\n  padding-bottom: 0 !important;\n}\n\n.pb-1 {\n  padding-bottom: 0.25rem !important;\n}\n\n.pb-2 {\n  padding-bottom: 0.5rem !important;\n}\n\n.pb-3 {\n  padding-bottom: 1rem !important;\n}\n\n.pb-4 {\n  padding-bottom: 1.5rem !important;\n}\n\n.pb-5 {\n  padding-bottom: 3rem !important;\n}\n\n.ps-0 {\n  padding-left: 0 !important;\n}\n\n.ps-1 {\n  padding-left: 0.25rem !important;\n}\n\n.ps-2 {\n  padding-left: 0.5rem !important;\n}\n\n.ps-3 {\n  padding-left: 1rem !important;\n}\n\n.ps-4 {\n  padding-left: 1.5rem !important;\n}\n\n.ps-5 {\n  padding-left: 3rem !important;\n}\n\n.gap-0 {\n  gap: 0 !important;\n}\n\n.gap-1 {\n  gap: 0.25rem !important;\n}\n\n.gap-2 {\n  gap: 0.5rem !important;\n}\n\n.gap-3 {\n  gap: 1rem !important;\n}\n\n.gap-4 {\n  gap: 1.5rem !important;\n}\n\n.gap-5 {\n  gap: 3rem !important;\n}\n\n.row-gap-0 {\n  row-gap: 0 !important;\n}\n\n.row-gap-1 {\n  row-gap: 0.25rem !important;\n}\n\n.row-gap-2 {\n  row-gap: 0.5rem !important;\n}\n\n.row-gap-3 {\n  row-gap: 1rem !important;\n}\n\n.row-gap-4 {\n  row-gap: 1.5rem !important;\n}\n\n.row-gap-5 {\n  row-gap: 3rem !important;\n}\n\n.column-gap-0 {\n  -moz-column-gap: 0 !important;\n  column-gap: 0 !important;\n}\n\n.column-gap-1 {\n  -moz-column-gap: 0.25rem !important;\n  column-gap: 0.25rem !important;\n}\n\n.column-gap-2 {\n  -moz-column-gap: 0.5rem !important;\n  column-gap: 0.5rem !important;\n}\n\n.column-gap-3 {\n  -moz-column-gap: 1rem !important;\n  column-gap: 1rem !important;\n}\n\n.column-gap-4 {\n  -moz-column-gap: 1.5rem !important;\n  column-gap: 1.5rem !important;\n}\n\n.column-gap-5 {\n  -moz-column-gap: 3rem !important;\n  column-gap: 3rem !important;\n}\n\n.font-monospace {\n  font-family: var(--bs-font-monospace) !important;\n}\n\n.fs-1 {\n  font-size: calc(1.375rem + 1.5vw) !important;\n}\n\n.fs-2 {\n  font-size: calc(1.325rem + 0.9vw) !important;\n}\n\n.fs-3 {\n  font-size: calc(1.3rem + 0.6vw) !important;\n}\n\n.fs-4 {\n  font-size: calc(1.275rem + 0.3vw) !important;\n}\n\n.fs-5 {\n  font-size: 1.25rem !important;\n}\n\n.fs-6 {\n  font-size: 1rem !important;\n}\n\n.fst-italic {\n  font-style: italic !important;\n}\n\n.fst-normal {\n  font-style: normal !important;\n}\n\n.fw-lighter {\n  font-weight: lighter !important;\n}\n\n.fw-light {\n  font-weight: 300 !important;\n}\n\n.fw-normal {\n  font-weight: 400 !important;\n}\n\n.fw-medium {\n  font-weight: 500 !important;\n}\n\n.fw-semibold {\n  font-weight: 600 !important;\n}\n\n.fw-bold {\n  font-weight: 700 !important;\n}\n\n.fw-bolder {\n  font-weight: bolder !important;\n}\n\n.lh-1 {\n  line-height: 1 !important;\n}\n\n.lh-sm {\n  line-height: 1.25 !important;\n}\n\n.lh-base {\n  line-height: 1.5 !important;\n}\n\n.lh-lg {\n  line-height: 2 !important;\n}\n\n.text-start {\n  text-align: left !important;\n}\n\n.text-end {\n  text-align: right !important;\n}\n\n.text-center {\n  text-align: center !important;\n}\n\n.text-decoration-none {\n  text-decoration: none !important;\n}\n\n.text-decoration-underline {\n  text-decoration: underline !important;\n}\n\n.text-decoration-line-through {\n  text-decoration: line-through !important;\n}\n\n.text-lowercase {\n  text-transform: lowercase !important;\n}\n\n.text-uppercase {\n  text-transform: uppercase !important;\n}\n\n.text-capitalize {\n  text-transform: capitalize !important;\n}\n\n.text-wrap {\n  white-space: normal !important;\n}\n\n.text-nowrap {\n  white-space: nowrap !important;\n}\n\n/* rtl:begin:remove */\n.text-break {\n  word-wrap: break-word !important;\n  word-break: break-word !important;\n}\n\n/* rtl:end:remove */\n.text-primary {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-primary-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-secondary {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-secondary-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-success {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-success-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-info {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-info-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-warning {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-warning-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-danger {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-danger-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-light {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-light-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-dark {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-dark-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-black {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-black-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-white {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-white-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-body {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-body-color-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-muted {\n  --bs-text-opacity: 1;\n  color: var(--bs-secondary-color) !important;\n}\n\n.text-black-50 {\n  --bs-text-opacity: 1;\n  color: rgba(0, 0, 0, 0.5) !important;\n}\n\n.text-white-50 {\n  --bs-text-opacity: 1;\n  color: rgba(255, 255, 255, 0.5) !important;\n}\n\n.text-body-secondary {\n  --bs-text-opacity: 1;\n  color: var(--bs-secondary-color) !important;\n}\n\n.text-body-tertiary {\n  --bs-text-opacity: 1;\n  color: var(--bs-tertiary-color) !important;\n}\n\n.text-body-emphasis {\n  --bs-text-opacity: 1;\n  color: var(--bs-emphasis-color) !important;\n}\n\n.text-reset {\n  --bs-text-opacity: 1;\n  color: inherit !important;\n}\n\n.text-opacity-25 {\n  --bs-text-opacity: 0.25;\n}\n\n.text-opacity-50 {\n  --bs-text-opacity: 0.5;\n}\n\n.text-opacity-75 {\n  --bs-text-opacity: 0.75;\n}\n\n.text-opacity-100 {\n  --bs-text-opacity: 1;\n}\n\n.text-primary-emphasis {\n  color: var(--bs-primary-text-emphasis) !important;\n}\n\n.text-secondary-emphasis {\n  color: var(--bs-secondary-text-emphasis) !important;\n}\n\n.text-success-emphasis {\n  color: var(--bs-success-text-emphasis) !important;\n}\n\n.text-info-emphasis {\n  color: var(--bs-info-text-emphasis) !important;\n}\n\n.text-warning-emphasis {\n  color: var(--bs-warning-text-emphasis) !important;\n}\n\n.text-danger-emphasis {\n  color: var(--bs-danger-text-emphasis) !important;\n}\n\n.text-light-emphasis {\n  color: var(--bs-light-text-emphasis) !important;\n}\n\n.text-dark-emphasis {\n  color: var(--bs-dark-text-emphasis) !important;\n}\n\n.link-opacity-10 {\n  --bs-link-opacity: 0.1;\n}\n\n.link-opacity-10-hover:hover {\n  --bs-link-opacity: 0.1;\n}\n\n.link-opacity-25 {\n  --bs-link-opacity: 0.25;\n}\n\n.link-opacity-25-hover:hover {\n  --bs-link-opacity: 0.25;\n}\n\n.link-opacity-50 {\n  --bs-link-opacity: 0.5;\n}\n\n.link-opacity-50-hover:hover {\n  --bs-link-opacity: 0.5;\n}\n\n.link-opacity-75 {\n  --bs-link-opacity: 0.75;\n}\n\n.link-opacity-75-hover:hover {\n  --bs-link-opacity: 0.75;\n}\n\n.link-opacity-100 {\n  --bs-link-opacity: 1;\n}\n\n.link-opacity-100-hover:hover {\n  --bs-link-opacity: 1;\n}\n\n.link-offset-1 {\n  text-underline-offset: 0.125em !important;\n}\n\n.link-offset-1-hover:hover {\n  text-underline-offset: 0.125em !important;\n}\n\n.link-offset-2 {\n  text-underline-offset: 0.25em !important;\n}\n\n.link-offset-2-hover:hover {\n  text-underline-offset: 0.25em !important;\n}\n\n.link-offset-3 {\n  text-underline-offset: 0.375em !important;\n}\n\n.link-offset-3-hover:hover {\n  text-underline-offset: 0.375em !important;\n}\n\n.link-underline-primary {\n  --bs-link-underline-opacity: 1;\n  -webkit-text-decoration-color: rgba(var(--bs-primary-rgb), var(--bs-link-underline-opacity)) !important;\n  text-decoration-color: rgba(var(--bs-primary-rgb), var(--bs-link-underline-opacity)) !important;\n}\n\n.link-underline-secondary {\n  --bs-link-underline-opacity: 1;\n  -webkit-text-decoration-color: rgba(var(--bs-secondary-rgb), var(--bs-link-underline-opacity)) !important;\n  text-decoration-color: rgba(var(--bs-secondary-rgb), var(--bs-link-underline-opacity)) !important;\n}\n\n.link-underline-success {\n  --bs-link-underline-opacity: 1;\n  -webkit-text-decoration-color: rgba(var(--bs-success-rgb), var(--bs-link-underline-opacity)) !important;\n  text-decoration-color: rgba(var(--bs-success-rgb), var(--bs-link-underline-opacity)) !important;\n}\n\n.link-underline-info {\n  --bs-link-underline-opacity: 1;\n  -webkit-text-decoration-color: rgba(var(--bs-info-rgb), var(--bs-link-underline-opacity)) !important;\n  text-decoration-color: rgba(var(--bs-info-rgb), var(--bs-link-underline-opacity)) !important;\n}\n\n.link-underline-warning {\n  --bs-link-underline-opacity: 1;\n  -webkit-text-decoration-color: rgba(var(--bs-warning-rgb), var(--bs-link-underline-opacity)) !important;\n  text-decoration-color: rgba(var(--bs-warning-rgb), var(--bs-link-underline-opacity)) !important;\n}\n\n.link-underline-danger {\n  --bs-link-underline-opacity: 1;\n  -webkit-text-decoration-color: rgba(var(--bs-danger-rgb), var(--bs-link-underline-opacity)) !important;\n  text-decoration-color: rgba(var(--bs-danger-rgb), var(--bs-link-underline-opacity)) !important;\n}\n\n.link-underline-light {\n  --bs-link-underline-opacity: 1;\n  -webkit-text-decoration-color: rgba(var(--bs-light-rgb), var(--bs-link-underline-opacity)) !important;\n  text-decoration-color: rgba(var(--bs-light-rgb), var(--bs-link-underline-opacity)) !important;\n}\n\n.link-underline-dark {\n  --bs-link-underline-opacity: 1;\n  -webkit-text-decoration-color: rgba(var(--bs-dark-rgb), var(--bs-link-underline-opacity)) !important;\n  text-decoration-color: rgba(var(--bs-dark-rgb), var(--bs-link-underline-opacity)) !important;\n}\n\n.link-underline {\n  --bs-link-underline-opacity: 1;\n  -webkit-text-decoration-color: rgba(var(--bs-link-color-rgb), var(--bs-link-underline-opacity, 1)) !important;\n  text-decoration-color: rgba(var(--bs-link-color-rgb), var(--bs-link-underline-opacity, 1)) !important;\n}\n\n.link-underline-opacity-0 {\n  --bs-link-underline-opacity: 0;\n}\n\n.link-underline-opacity-0-hover:hover {\n  --bs-link-underline-opacity: 0;\n}\n\n.link-underline-opacity-10 {\n  --bs-link-underline-opacity: 0.1;\n}\n\n.link-underline-opacity-10-hover:hover {\n  --bs-link-underline-opacity: 0.1;\n}\n\n.link-underline-opacity-25 {\n  --bs-link-underline-opacity: 0.25;\n}\n\n.link-underline-opacity-25-hover:hover {\n  --bs-link-underline-opacity: 0.25;\n}\n\n.link-underline-opacity-50 {\n  --bs-link-underline-opacity: 0.5;\n}\n\n.link-underline-opacity-50-hover:hover {\n  --bs-link-underline-opacity: 0.5;\n}\n\n.link-underline-opacity-75 {\n  --bs-link-underline-opacity: 0.75;\n}\n\n.link-underline-opacity-75-hover:hover {\n  --bs-link-underline-opacity: 0.75;\n}\n\n.link-underline-opacity-100 {\n  --bs-link-underline-opacity: 1;\n}\n\n.link-underline-opacity-100-hover:hover {\n  --bs-link-underline-opacity: 1;\n}\n\n.bg-primary {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-primary-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-secondary {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-secondary-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-success {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-success-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-info {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-info-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-warning {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-warning-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-danger {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-danger-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-light {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-light-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-dark {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-dark-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-black {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-black-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-white {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-white-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-body {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-body-bg-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-transparent {\n  --bs-bg-opacity: 1;\n  background-color: transparent !important;\n}\n\n.bg-body-secondary {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-secondary-bg-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-body-tertiary {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-tertiary-bg-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-opacity-10 {\n  --bs-bg-opacity: 0.1;\n}\n\n.bg-opacity-25 {\n  --bs-bg-opacity: 0.25;\n}\n\n.bg-opacity-50 {\n  --bs-bg-opacity: 0.5;\n}\n\n.bg-opacity-75 {\n  --bs-bg-opacity: 0.75;\n}\n\n.bg-opacity-100 {\n  --bs-bg-opacity: 1;\n}\n\n.bg-primary-subtle {\n  background-color: var(--bs-primary-bg-subtle) !important;\n}\n\n.bg-secondary-subtle {\n  background-color: var(--bs-secondary-bg-subtle) !important;\n}\n\n.bg-success-subtle {\n  background-color: var(--bs-success-bg-subtle) !important;\n}\n\n.bg-info-subtle {\n  background-color: var(--bs-info-bg-subtle) !important;\n}\n\n.bg-warning-subtle {\n  background-color: var(--bs-warning-bg-subtle) !important;\n}\n\n.bg-danger-subtle {\n  background-color: var(--bs-danger-bg-subtle) !important;\n}\n\n.bg-light-subtle {\n  background-color: var(--bs-light-bg-subtle) !important;\n}\n\n.bg-dark-subtle {\n  background-color: var(--bs-dark-bg-subtle) !important;\n}\n\n.bg-gradient {\n  background-image: var(--bs-gradient) !important;\n}\n\n.user-select-all {\n  -webkit-user-select: all !important;\n  -moz-user-select: all !important;\n  user-select: all !important;\n}\n\n.user-select-auto {\n  -webkit-user-select: auto !important;\n  -moz-user-select: auto !important;\n  user-select: auto !important;\n}\n\n.user-select-none {\n  -webkit-user-select: none !important;\n  -moz-user-select: none !important;\n  user-select: none !important;\n}\n\n.pe-none {\n  pointer-events: none !important;\n}\n\n.pe-auto {\n  pointer-events: auto !important;\n}\n\n.rounded {\n  border-radius: var(--bs-border-radius) !important;\n}\n\n.rounded-0 {\n  border-radius: 0 !important;\n}\n\n.rounded-1 {\n  border-radius: var(--bs-border-radius-sm) !important;\n}\n\n.rounded-2 {\n  border-radius: var(--bs-border-radius) !important;\n}\n\n.rounded-3 {\n  border-radius: var(--bs-border-radius-lg) !important;\n}\n\n.rounded-4 {\n  border-radius: var(--bs-border-radius-xl) !important;\n}\n\n.rounded-5 {\n  border-radius: var(--bs-border-radius-xxl) !important;\n}\n\n.rounded-circle {\n  border-radius: 50% !important;\n}\n\n.rounded-pill {\n  border-radius: var(--bs-border-radius-pill) !important;\n}\n\n.rounded-top {\n  border-top-left-radius: var(--bs-border-radius) !important;\n  border-top-right-radius: var(--bs-border-radius) !important;\n}\n\n.rounded-top-0 {\n  border-top-left-radius: 0 !important;\n  border-top-right-radius: 0 !important;\n}\n\n.rounded-top-1 {\n  border-top-left-radius: var(--bs-border-radius-sm) !important;\n  border-top-right-radius: var(--bs-border-radius-sm) !important;\n}\n\n.rounded-top-2 {\n  border-top-left-radius: var(--bs-border-radius) !important;\n  border-top-right-radius: var(--bs-border-radius) !important;\n}\n\n.rounded-top-3 {\n  border-top-left-radius: var(--bs-border-radius-lg) !important;\n  border-top-right-radius: var(--bs-border-radius-lg) !important;\n}\n\n.rounded-top-4 {\n  border-top-left-radius: var(--bs-border-radius-xl) !important;\n  border-top-right-radius: var(--bs-border-radius-xl) !important;\n}\n\n.rounded-top-5 {\n  border-top-left-radius: var(--bs-border-radius-xxl) !important;\n  border-top-right-radius: var(--bs-border-radius-xxl) !important;\n}\n\n.rounded-top-circle {\n  border-top-left-radius: 50% !important;\n  border-top-right-radius: 50% !important;\n}\n\n.rounded-top-pill {\n  border-top-left-radius: var(--bs-border-radius-pill) !important;\n  border-top-right-radius: var(--bs-border-radius-pill) !important;\n}\n\n.rounded-end {\n  border-top-right-radius: var(--bs-border-radius) !important;\n  border-bottom-right-radius: var(--bs-border-radius) !important;\n}\n\n.rounded-end-0 {\n  border-top-right-radius: 0 !important;\n  border-bottom-right-radius: 0 !important;\n}\n\n.rounded-end-1 {\n  border-top-right-radius: var(--bs-border-radius-sm) !important;\n  border-bottom-right-radius: var(--bs-border-radius-sm) !important;\n}\n\n.rounded-end-2 {\n  border-top-right-radius: var(--bs-border-radius) !important;\n  border-bottom-right-radius: var(--bs-border-radius) !important;\n}\n\n.rounded-end-3 {\n  border-top-right-radius: var(--bs-border-radius-lg) !important;\n  border-bottom-right-radius: var(--bs-border-radius-lg) !important;\n}\n\n.rounded-end-4 {\n  border-top-right-radius: var(--bs-border-radius-xl) !important;\n  border-bottom-right-radius: var(--bs-border-radius-xl) !important;\n}\n\n.rounded-end-5 {\n  border-top-right-radius: var(--bs-border-radius-xxl) !important;\n  border-bottom-right-radius: var(--bs-border-radius-xxl) !important;\n}\n\n.rounded-end-circle {\n  border-top-right-radius: 50% !important;\n  border-bottom-right-radius: 50% !important;\n}\n\n.rounded-end-pill {\n  border-top-right-radius: var(--bs-border-radius-pill) !important;\n  border-bottom-right-radius: var(--bs-border-radius-pill) !important;\n}\n\n.rounded-bottom {\n  border-bottom-right-radius: var(--bs-border-radius) !important;\n  border-bottom-left-radius: var(--bs-border-radius) !important;\n}\n\n.rounded-bottom-0 {\n  border-bottom-right-radius: 0 !important;\n  border-bottom-left-radius: 0 !important;\n}\n\n.rounded-bottom-1 {\n  border-bottom-right-radius: var(--bs-border-radius-sm) !important;\n  border-bottom-left-radius: var(--bs-border-radius-sm) !important;\n}\n\n.rounded-bottom-2 {\n  border-bottom-right-radius: var(--bs-border-radius) !important;\n  border-bottom-left-radius: var(--bs-border-radius) !important;\n}\n\n.rounded-bottom-3 {\n  border-bottom-right-radius: var(--bs-border-radius-lg) !important;\n  border-bottom-left-radius: var(--bs-border-radius-lg) !important;\n}\n\n.rounded-bottom-4 {\n  border-bottom-right-radius: var(--bs-border-radius-xl) !important;\n  border-bottom-left-radius: var(--bs-border-radius-xl) !important;\n}\n\n.rounded-bottom-5 {\n  border-bottom-right-radius: var(--bs-border-radius-xxl) !important;\n  border-bottom-left-radius: var(--bs-border-radius-xxl) !important;\n}\n\n.rounded-bottom-circle {\n  border-bottom-right-radius: 50% !important;\n  border-bottom-left-radius: 50% !important;\n}\n\n.rounded-bottom-pill {\n  border-bottom-right-radius: var(--bs-border-radius-pill) !important;\n  border-bottom-left-radius: var(--bs-border-radius-pill) !important;\n}\n\n.rounded-start {\n  border-bottom-left-radius: var(--bs-border-radius) !important;\n  border-top-left-radius: var(--bs-border-radius) !important;\n}\n\n.rounded-start-0 {\n  border-bottom-left-radius: 0 !important;\n  border-top-left-radius: 0 !important;\n}\n\n.rounded-start-1 {\n  border-bottom-left-radius: var(--bs-border-radius-sm) !important;\n  border-top-left-radius: var(--bs-border-radius-sm) !important;\n}\n\n.rounded-start-2 {\n  border-bottom-left-radius: var(--bs-border-radius) !important;\n  border-top-left-radius: var(--bs-border-radius) !important;\n}\n\n.rounded-start-3 {\n  border-bottom-left-radius: var(--bs-border-radius-lg) !important;\n  border-top-left-radius: var(--bs-border-radius-lg) !important;\n}\n\n.rounded-start-4 {\n  border-bottom-left-radius: var(--bs-border-radius-xl) !important;\n  border-top-left-radius: var(--bs-border-radius-xl) !important;\n}\n\n.rounded-start-5 {\n  border-bottom-left-radius: var(--bs-border-radius-xxl) !important;\n  border-top-left-radius: var(--bs-border-radius-xxl) !important;\n}\n\n.rounded-start-circle {\n  border-bottom-left-radius: 50% !important;\n  border-top-left-radius: 50% !important;\n}\n\n.rounded-start-pill {\n  border-bottom-left-radius: var(--bs-border-radius-pill) !important;\n  border-top-left-radius: var(--bs-border-radius-pill) !important;\n}\n\n.visible {\n  visibility: visible !important;\n}\n\n.invisible {\n  visibility: hidden !important;\n}\n\n.z-n1 {\n  z-index: -1 !important;\n}\n\n.z-0 {\n  z-index: 0 !important;\n}\n\n.z-1 {\n  z-index: 1 !important;\n}\n\n.z-2 {\n  z-index: 2 !important;\n}\n\n.z-3 {\n  z-index: 3 !important;\n}\n\n@media (min-width: 576px) {\n  .float-sm-start {\n    float: left !important;\n  }\n  .float-sm-end {\n    float: right !important;\n  }\n  .float-sm-none {\n    float: none !important;\n  }\n  .object-fit-sm-contain {\n    -o-object-fit: contain !important;\n    object-fit: contain !important;\n  }\n  .object-fit-sm-cover {\n    -o-object-fit: cover !important;\n    object-fit: cover !important;\n  }\n  .object-fit-sm-fill {\n    -o-object-fit: fill !important;\n    object-fit: fill !important;\n  }\n  .object-fit-sm-scale {\n    -o-object-fit: scale-down !important;\n    object-fit: scale-down !important;\n  }\n  .object-fit-sm-none {\n    -o-object-fit: none !important;\n    object-fit: none !important;\n  }\n  .d-sm-inline {\n    display: inline !important;\n  }\n  .d-sm-inline-block {\n    display: inline-block !important;\n  }\n  .d-sm-block {\n    display: block !important;\n  }\n  .d-sm-grid {\n    display: grid !important;\n  }\n  .d-sm-inline-grid {\n    display: inline-grid !important;\n  }\n  .d-sm-table {\n    display: table !important;\n  }\n  .d-sm-table-row {\n    display: table-row !important;\n  }\n  .d-sm-table-cell {\n    display: table-cell !important;\n  }\n  .d-sm-flex {\n    display: flex !important;\n  }\n  .d-sm-inline-flex {\n    display: inline-flex !important;\n  }\n  .d-sm-none {\n    display: none !important;\n  }\n  .flex-sm-fill {\n    flex: 1 1 auto !important;\n  }\n  .flex-sm-row {\n    flex-direction: row !important;\n  }\n  .flex-sm-column {\n    flex-direction: column !important;\n  }\n  .flex-sm-row-reverse {\n    flex-direction: row-reverse !important;\n  }\n  .flex-sm-column-reverse {\n    flex-direction: column-reverse !important;\n  }\n  .flex-sm-grow-0 {\n    flex-grow: 0 !important;\n  }\n  .flex-sm-grow-1 {\n    flex-grow: 1 !important;\n  }\n  .flex-sm-shrink-0 {\n    flex-shrink: 0 !important;\n  }\n  .flex-sm-shrink-1 {\n    flex-shrink: 1 !important;\n  }\n  .flex-sm-wrap {\n    flex-wrap: wrap !important;\n  }\n  .flex-sm-nowrap {\n    flex-wrap: nowrap !important;\n  }\n  .flex-sm-wrap-reverse {\n    flex-wrap: wrap-reverse !important;\n  }\n  .justify-content-sm-start {\n    justify-content: flex-start !important;\n  }\n  .justify-content-sm-end {\n    justify-content: flex-end !important;\n  }\n  .justify-content-sm-center {\n    justify-content: center !important;\n  }\n  .justify-content-sm-between {\n    justify-content: space-between !important;\n  }\n  .justify-content-sm-around {\n    justify-content: space-around !important;\n  }\n  .justify-content-sm-evenly {\n    justify-content: space-evenly !important;\n  }\n  .align-items-sm-start {\n    align-items: flex-start !important;\n  }\n  .align-items-sm-end {\n    align-items: flex-end !important;\n  }\n  .align-items-sm-center {\n    align-items: center !important;\n  }\n  .align-items-sm-baseline {\n    align-items: baseline !important;\n  }\n  .align-items-sm-stretch {\n    align-items: stretch !important;\n  }\n  .align-content-sm-start {\n    align-content: flex-start !important;\n  }\n  .align-content-sm-end {\n    align-content: flex-end !important;\n  }\n  .align-content-sm-center {\n    align-content: center !important;\n  }\n  .align-content-sm-between {\n    align-content: space-between !important;\n  }\n  .align-content-sm-around {\n    align-content: space-around !important;\n  }\n  .align-content-sm-stretch {\n    align-content: stretch !important;\n  }\n  .align-self-sm-auto {\n    align-self: auto !important;\n  }\n  .align-self-sm-start {\n    align-self: flex-start !important;\n  }\n  .align-self-sm-end {\n    align-self: flex-end !important;\n  }\n  .align-self-sm-center {\n    align-self: center !important;\n  }\n  .align-self-sm-baseline {\n    align-self: baseline !important;\n  }\n  .align-self-sm-stretch {\n    align-self: stretch !important;\n  }\n  .order-sm-first {\n    order: -1 !important;\n  }\n  .order-sm-0 {\n    order: 0 !important;\n  }\n  .order-sm-1 {\n    order: 1 !important;\n  }\n  .order-sm-2 {\n    order: 2 !important;\n  }\n  .order-sm-3 {\n    order: 3 !important;\n  }\n  .order-sm-4 {\n    order: 4 !important;\n  }\n  .order-sm-5 {\n    order: 5 !important;\n  }\n  .order-sm-last {\n    order: 6 !important;\n  }\n  .m-sm-0 {\n    margin: 0 !important;\n  }\n  .m-sm-1 {\n    margin: 0.25rem !important;\n  }\n  .m-sm-2 {\n    margin: 0.5rem !important;\n  }\n  .m-sm-3 {\n    margin: 1rem !important;\n  }\n  .m-sm-4 {\n    margin: 1.5rem !important;\n  }\n  .m-sm-5 {\n    margin: 3rem !important;\n  }\n  .m-sm-auto {\n    margin: auto !important;\n  }\n  .mx-sm-0 {\n    margin-right: 0 !important;\n    margin-left: 0 !important;\n  }\n  .mx-sm-1 {\n    margin-right: 0.25rem !important;\n    margin-left: 0.25rem !important;\n  }\n  .mx-sm-2 {\n    margin-right: 0.5rem !important;\n    margin-left: 0.5rem !important;\n  }\n  .mx-sm-3 {\n    margin-right: 1rem !important;\n    margin-left: 1rem !important;\n  }\n  .mx-sm-4 {\n    margin-right: 1.5rem !important;\n    margin-left: 1.5rem !important;\n  }\n  .mx-sm-5 {\n    margin-right: 3rem !important;\n    margin-left: 3rem !important;\n  }\n  .mx-sm-auto {\n    margin-right: auto !important;\n    margin-left: auto !important;\n  }\n  .my-sm-0 {\n    margin-top: 0 !important;\n    margin-bottom: 0 !important;\n  }\n  .my-sm-1 {\n    margin-top: 0.25rem !important;\n    margin-bottom: 0.25rem !important;\n  }\n  .my-sm-2 {\n    margin-top: 0.5rem !important;\n    margin-bottom: 0.5rem !important;\n  }\n  .my-sm-3 {\n    margin-top: 1rem !important;\n    margin-bottom: 1rem !important;\n  }\n  .my-sm-4 {\n    margin-top: 1.5rem !important;\n    margin-bottom: 1.5rem !important;\n  }\n  .my-sm-5 {\n    margin-top: 3rem !important;\n    margin-bottom: 3rem !important;\n  }\n  .my-sm-auto {\n    margin-top: auto !important;\n    margin-bottom: auto !important;\n  }\n  .mt-sm-0 {\n    margin-top: 0 !important;\n  }\n  .mt-sm-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mt-sm-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mt-sm-3 {\n    margin-top: 1rem !important;\n  }\n  .mt-sm-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mt-sm-5 {\n    margin-top: 3rem !important;\n  }\n  .mt-sm-auto {\n    margin-top: auto !important;\n  }\n  .me-sm-0 {\n    margin-right: 0 !important;\n  }\n  .me-sm-1 {\n    margin-right: 0.25rem !important;\n  }\n  .me-sm-2 {\n    margin-right: 0.5rem !important;\n  }\n  .me-sm-3 {\n    margin-right: 1rem !important;\n  }\n  .me-sm-4 {\n    margin-right: 1.5rem !important;\n  }\n  .me-sm-5 {\n    margin-right: 3rem !important;\n  }\n  .me-sm-auto {\n    margin-right: auto !important;\n  }\n  .mb-sm-0 {\n    margin-bottom: 0 !important;\n  }\n  .mb-sm-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .mb-sm-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .mb-sm-3 {\n    margin-bottom: 1rem !important;\n  }\n  .mb-sm-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .mb-sm-5 {\n    margin-bottom: 3rem !important;\n  }\n  .mb-sm-auto {\n    margin-bottom: auto !important;\n  }\n  .ms-sm-0 {\n    margin-left: 0 !important;\n  }\n  .ms-sm-1 {\n    margin-left: 0.25rem !important;\n  }\n  .ms-sm-2 {\n    margin-left: 0.5rem !important;\n  }\n  .ms-sm-3 {\n    margin-left: 1rem !important;\n  }\n  .ms-sm-4 {\n    margin-left: 1.5rem !important;\n  }\n  .ms-sm-5 {\n    margin-left: 3rem !important;\n  }\n  .ms-sm-auto {\n    margin-left: auto !important;\n  }\n  .p-sm-0 {\n    padding: 0 !important;\n  }\n  .p-sm-1 {\n    padding: 0.25rem !important;\n  }\n  .p-sm-2 {\n    padding: 0.5rem !important;\n  }\n  .p-sm-3 {\n    padding: 1rem !important;\n  }\n  .p-sm-4 {\n    padding: 1.5rem !important;\n  }\n  .p-sm-5 {\n    padding: 3rem !important;\n  }\n  .px-sm-0 {\n    padding-right: 0 !important;\n    padding-left: 0 !important;\n  }\n  .px-sm-1 {\n    padding-right: 0.25rem !important;\n    padding-left: 0.25rem !important;\n  }\n  .px-sm-2 {\n    padding-right: 0.5rem !important;\n    padding-left: 0.5rem !important;\n  }\n  .px-sm-3 {\n    padding-right: 1rem !important;\n    padding-left: 1rem !important;\n  }\n  .px-sm-4 {\n    padding-right: 1.5rem !important;\n    padding-left: 1.5rem !important;\n  }\n  .px-sm-5 {\n    padding-right: 3rem !important;\n    padding-left: 3rem !important;\n  }\n  .py-sm-0 {\n    padding-top: 0 !important;\n    padding-bottom: 0 !important;\n  }\n  .py-sm-1 {\n    padding-top: 0.25rem !important;\n    padding-bottom: 0.25rem !important;\n  }\n  .py-sm-2 {\n    padding-top: 0.5rem !important;\n    padding-bottom: 0.5rem !important;\n  }\n  .py-sm-3 {\n    padding-top: 1rem !important;\n    padding-bottom: 1rem !important;\n  }\n  .py-sm-4 {\n    padding-top: 1.5rem !important;\n    padding-bottom: 1.5rem !important;\n  }\n  .py-sm-5 {\n    padding-top: 3rem !important;\n    padding-bottom: 3rem !important;\n  }\n  .pt-sm-0 {\n    padding-top: 0 !important;\n  }\n  .pt-sm-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pt-sm-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pt-sm-3 {\n    padding-top: 1rem !important;\n  }\n  .pt-sm-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pt-sm-5 {\n    padding-top: 3rem !important;\n  }\n  .pe-sm-0 {\n    padding-right: 0 !important;\n  }\n  .pe-sm-1 {\n    padding-right: 0.25rem !important;\n  }\n  .pe-sm-2 {\n    padding-right: 0.5rem !important;\n  }\n  .pe-sm-3 {\n    padding-right: 1rem !important;\n  }\n  .pe-sm-4 {\n    padding-right: 1.5rem !important;\n  }\n  .pe-sm-5 {\n    padding-right: 3rem !important;\n  }\n  .pb-sm-0 {\n    padding-bottom: 0 !important;\n  }\n  .pb-sm-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pb-sm-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pb-sm-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pb-sm-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pb-sm-5 {\n    padding-bottom: 3rem !important;\n  }\n  .ps-sm-0 {\n    padding-left: 0 !important;\n  }\n  .ps-sm-1 {\n    padding-left: 0.25rem !important;\n  }\n  .ps-sm-2 {\n    padding-left: 0.5rem !important;\n  }\n  .ps-sm-3 {\n    padding-left: 1rem !important;\n  }\n  .ps-sm-4 {\n    padding-left: 1.5rem !important;\n  }\n  .ps-sm-5 {\n    padding-left: 3rem !important;\n  }\n  .gap-sm-0 {\n    gap: 0 !important;\n  }\n  .gap-sm-1 {\n    gap: 0.25rem !important;\n  }\n  .gap-sm-2 {\n    gap: 0.5rem !important;\n  }\n  .gap-sm-3 {\n    gap: 1rem !important;\n  }\n  .gap-sm-4 {\n    gap: 1.5rem !important;\n  }\n  .gap-sm-5 {\n    gap: 3rem !important;\n  }\n  .row-gap-sm-0 {\n    row-gap: 0 !important;\n  }\n  .row-gap-sm-1 {\n    row-gap: 0.25rem !important;\n  }\n  .row-gap-sm-2 {\n    row-gap: 0.5rem !important;\n  }\n  .row-gap-sm-3 {\n    row-gap: 1rem !important;\n  }\n  .row-gap-sm-4 {\n    row-gap: 1.5rem !important;\n  }\n  .row-gap-sm-5 {\n    row-gap: 3rem !important;\n  }\n  .column-gap-sm-0 {\n    -moz-column-gap: 0 !important;\n    column-gap: 0 !important;\n  }\n  .column-gap-sm-1 {\n    -moz-column-gap: 0.25rem !important;\n    column-gap: 0.25rem !important;\n  }\n  .column-gap-sm-2 {\n    -moz-column-gap: 0.5rem !important;\n    column-gap: 0.5rem !important;\n  }\n  .column-gap-sm-3 {\n    -moz-column-gap: 1rem !important;\n    column-gap: 1rem !important;\n  }\n  .column-gap-sm-4 {\n    -moz-column-gap: 1.5rem !important;\n    column-gap: 1.5rem !important;\n  }\n  .column-gap-sm-5 {\n    -moz-column-gap: 3rem !important;\n    column-gap: 3rem !important;\n  }\n  .text-sm-start {\n    text-align: left !important;\n  }\n  .text-sm-end {\n    text-align: right !important;\n  }\n  .text-sm-center {\n    text-align: center !important;\n  }\n}\n@media (min-width: 768px) {\n  .float-md-start {\n    float: left !important;\n  }\n  .float-md-end {\n    float: right !important;\n  }\n  .float-md-none {\n    float: none !important;\n  }\n  .object-fit-md-contain {\n    -o-object-fit: contain !important;\n    object-fit: contain !important;\n  }\n  .object-fit-md-cover {\n    -o-object-fit: cover !important;\n    object-fit: cover !important;\n  }\n  .object-fit-md-fill {\n    -o-object-fit: fill !important;\n    object-fit: fill !important;\n  }\n  .object-fit-md-scale {\n    -o-object-fit: scale-down !important;\n    object-fit: scale-down !important;\n  }\n  .object-fit-md-none {\n    -o-object-fit: none !important;\n    object-fit: none !important;\n  }\n  .d-md-inline {\n    display: inline !important;\n  }\n  .d-md-inline-block {\n    display: inline-block !important;\n  }\n  .d-md-block {\n    display: block !important;\n  }\n  .d-md-grid {\n    display: grid !important;\n  }\n  .d-md-inline-grid {\n    display: inline-grid !important;\n  }\n  .d-md-table {\n    display: table !important;\n  }\n  .d-md-table-row {\n    display: table-row !important;\n  }\n  .d-md-table-cell {\n    display: table-cell !important;\n  }\n  .d-md-flex {\n    display: flex !important;\n  }\n  .d-md-inline-flex {\n    display: inline-flex !important;\n  }\n  .d-md-none {\n    display: none !important;\n  }\n  .flex-md-fill {\n    flex: 1 1 auto !important;\n  }\n  .flex-md-row {\n    flex-direction: row !important;\n  }\n  .flex-md-column {\n    flex-direction: column !important;\n  }\n  .flex-md-row-reverse {\n    flex-direction: row-reverse !important;\n  }\n  .flex-md-column-reverse {\n    flex-direction: column-reverse !important;\n  }\n  .flex-md-grow-0 {\n    flex-grow: 0 !important;\n  }\n  .flex-md-grow-1 {\n    flex-grow: 1 !important;\n  }\n  .flex-md-shrink-0 {\n    flex-shrink: 0 !important;\n  }\n  .flex-md-shrink-1 {\n    flex-shrink: 1 !important;\n  }\n  .flex-md-wrap {\n    flex-wrap: wrap !important;\n  }\n  .flex-md-nowrap {\n    flex-wrap: nowrap !important;\n  }\n  .flex-md-wrap-reverse {\n    flex-wrap: wrap-reverse !important;\n  }\n  .justify-content-md-start {\n    justify-content: flex-start !important;\n  }\n  .justify-content-md-end {\n    justify-content: flex-end !important;\n  }\n  .justify-content-md-center {\n    justify-content: center !important;\n  }\n  .justify-content-md-between {\n    justify-content: space-between !important;\n  }\n  .justify-content-md-around {\n    justify-content: space-around !important;\n  }\n  .justify-content-md-evenly {\n    justify-content: space-evenly !important;\n  }\n  .align-items-md-start {\n    align-items: flex-start !important;\n  }\n  .align-items-md-end {\n    align-items: flex-end !important;\n  }\n  .align-items-md-center {\n    align-items: center !important;\n  }\n  .align-items-md-baseline {\n    align-items: baseline !important;\n  }\n  .align-items-md-stretch {\n    align-items: stretch !important;\n  }\n  .align-content-md-start {\n    align-content: flex-start !important;\n  }\n  .align-content-md-end {\n    align-content: flex-end !important;\n  }\n  .align-content-md-center {\n    align-content: center !important;\n  }\n  .align-content-md-between {\n    align-content: space-between !important;\n  }\n  .align-content-md-around {\n    align-content: space-around !important;\n  }\n  .align-content-md-stretch {\n    align-content: stretch !important;\n  }\n  .align-self-md-auto {\n    align-self: auto !important;\n  }\n  .align-self-md-start {\n    align-self: flex-start !important;\n  }\n  .align-self-md-end {\n    align-self: flex-end !important;\n  }\n  .align-self-md-center {\n    align-self: center !important;\n  }\n  .align-self-md-baseline {\n    align-self: baseline !important;\n  }\n  .align-self-md-stretch {\n    align-self: stretch !important;\n  }\n  .order-md-first {\n    order: -1 !important;\n  }\n  .order-md-0 {\n    order: 0 !important;\n  }\n  .order-md-1 {\n    order: 1 !important;\n  }\n  .order-md-2 {\n    order: 2 !important;\n  }\n  .order-md-3 {\n    order: 3 !important;\n  }\n  .order-md-4 {\n    order: 4 !important;\n  }\n  .order-md-5 {\n    order: 5 !important;\n  }\n  .order-md-last {\n    order: 6 !important;\n  }\n  .m-md-0 {\n    margin: 0 !important;\n  }\n  .m-md-1 {\n    margin: 0.25rem !important;\n  }\n  .m-md-2 {\n    margin: 0.5rem !important;\n  }\n  .m-md-3 {\n    margin: 1rem !important;\n  }\n  .m-md-4 {\n    margin: 1.5rem !important;\n  }\n  .m-md-5 {\n    margin: 3rem !important;\n  }\n  .m-md-auto {\n    margin: auto !important;\n  }\n  .mx-md-0 {\n    margin-right: 0 !important;\n    margin-left: 0 !important;\n  }\n  .mx-md-1 {\n    margin-right: 0.25rem !important;\n    margin-left: 0.25rem !important;\n  }\n  .mx-md-2 {\n    margin-right: 0.5rem !important;\n    margin-left: 0.5rem !important;\n  }\n  .mx-md-3 {\n    margin-right: 1rem !important;\n    margin-left: 1rem !important;\n  }\n  .mx-md-4 {\n    margin-right: 1.5rem !important;\n    margin-left: 1.5rem !important;\n  }\n  .mx-md-5 {\n    margin-right: 3rem !important;\n    margin-left: 3rem !important;\n  }\n  .mx-md-auto {\n    margin-right: auto !important;\n    margin-left: auto !important;\n  }\n  .my-md-0 {\n    margin-top: 0 !important;\n    margin-bottom: 0 !important;\n  }\n  .my-md-1 {\n    margin-top: 0.25rem !important;\n    margin-bottom: 0.25rem !important;\n  }\n  .my-md-2 {\n    margin-top: 0.5rem !important;\n    margin-bottom: 0.5rem !important;\n  }\n  .my-md-3 {\n    margin-top: 1rem !important;\n    margin-bottom: 1rem !important;\n  }\n  .my-md-4 {\n    margin-top: 1.5rem !important;\n    margin-bottom: 1.5rem !important;\n  }\n  .my-md-5 {\n    margin-top: 3rem !important;\n    margin-bottom: 3rem !important;\n  }\n  .my-md-auto {\n    margin-top: auto !important;\n    margin-bottom: auto !important;\n  }\n  .mt-md-0 {\n    margin-top: 0 !important;\n  }\n  .mt-md-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mt-md-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mt-md-3 {\n    margin-top: 1rem !important;\n  }\n  .mt-md-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mt-md-5 {\n    margin-top: 3rem !important;\n  }\n  .mt-md-auto {\n    margin-top: auto !important;\n  }\n  .me-md-0 {\n    margin-right: 0 !important;\n  }\n  .me-md-1 {\n    margin-right: 0.25rem !important;\n  }\n  .me-md-2 {\n    margin-right: 0.5rem !important;\n  }\n  .me-md-3 {\n    margin-right: 1rem !important;\n  }\n  .me-md-4 {\n    margin-right: 1.5rem !important;\n  }\n  .me-md-5 {\n    margin-right: 3rem !important;\n  }\n  .me-md-auto {\n    margin-right: auto !important;\n  }\n  .mb-md-0 {\n    margin-bottom: 0 !important;\n  }\n  .mb-md-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .mb-md-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .mb-md-3 {\n    margin-bottom: 1rem !important;\n  }\n  .mb-md-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .mb-md-5 {\n    margin-bottom: 3rem !important;\n  }\n  .mb-md-auto {\n    margin-bottom: auto !important;\n  }\n  .ms-md-0 {\n    margin-left: 0 !important;\n  }\n  .ms-md-1 {\n    margin-left: 0.25rem !important;\n  }\n  .ms-md-2 {\n    margin-left: 0.5rem !important;\n  }\n  .ms-md-3 {\n    margin-left: 1rem !important;\n  }\n  .ms-md-4 {\n    margin-left: 1.5rem !important;\n  }\n  .ms-md-5 {\n    margin-left: 3rem !important;\n  }\n  .ms-md-auto {\n    margin-left: auto !important;\n  }\n  .p-md-0 {\n    padding: 0 !important;\n  }\n  .p-md-1 {\n    padding: 0.25rem !important;\n  }\n  .p-md-2 {\n    padding: 0.5rem !important;\n  }\n  .p-md-3 {\n    padding: 1rem !important;\n  }\n  .p-md-4 {\n    padding: 1.5rem !important;\n  }\n  .p-md-5 {\n    padding: 3rem !important;\n  }\n  .px-md-0 {\n    padding-right: 0 !important;\n    padding-left: 0 !important;\n  }\n  .px-md-1 {\n    padding-right: 0.25rem !important;\n    padding-left: 0.25rem !important;\n  }\n  .px-md-2 {\n    padding-right: 0.5rem !important;\n    padding-left: 0.5rem !important;\n  }\n  .px-md-3 {\n    padding-right: 1rem !important;\n    padding-left: 1rem !important;\n  }\n  .px-md-4 {\n    padding-right: 1.5rem !important;\n    padding-left: 1.5rem !important;\n  }\n  .px-md-5 {\n    padding-right: 3rem !important;\n    padding-left: 3rem !important;\n  }\n  .py-md-0 {\n    padding-top: 0 !important;\n    padding-bottom: 0 !important;\n  }\n  .py-md-1 {\n    padding-top: 0.25rem !important;\n    padding-bottom: 0.25rem !important;\n  }\n  .py-md-2 {\n    padding-top: 0.5rem !important;\n    padding-bottom: 0.5rem !important;\n  }\n  .py-md-3 {\n    padding-top: 1rem !important;\n    padding-bottom: 1rem !important;\n  }\n  .py-md-4 {\n    padding-top: 1.5rem !important;\n    padding-bottom: 1.5rem !important;\n  }\n  .py-md-5 {\n    padding-top: 3rem !important;\n    padding-bottom: 3rem !important;\n  }\n  .pt-md-0 {\n    padding-top: 0 !important;\n  }\n  .pt-md-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pt-md-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pt-md-3 {\n    padding-top: 1rem !important;\n  }\n  .pt-md-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pt-md-5 {\n    padding-top: 3rem !important;\n  }\n  .pe-md-0 {\n    padding-right: 0 !important;\n  }\n  .pe-md-1 {\n    padding-right: 0.25rem !important;\n  }\n  .pe-md-2 {\n    padding-right: 0.5rem !important;\n  }\n  .pe-md-3 {\n    padding-right: 1rem !important;\n  }\n  .pe-md-4 {\n    padding-right: 1.5rem !important;\n  }\n  .pe-md-5 {\n    padding-right: 3rem !important;\n  }\n  .pb-md-0 {\n    padding-bottom: 0 !important;\n  }\n  .pb-md-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pb-md-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pb-md-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pb-md-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pb-md-5 {\n    padding-bottom: 3rem !important;\n  }\n  .ps-md-0 {\n    padding-left: 0 !important;\n  }\n  .ps-md-1 {\n    padding-left: 0.25rem !important;\n  }\n  .ps-md-2 {\n    padding-left: 0.5rem !important;\n  }\n  .ps-md-3 {\n    padding-left: 1rem !important;\n  }\n  .ps-md-4 {\n    padding-left: 1.5rem !important;\n  }\n  .ps-md-5 {\n    padding-left: 3rem !important;\n  }\n  .gap-md-0 {\n    gap: 0 !important;\n  }\n  .gap-md-1 {\n    gap: 0.25rem !important;\n  }\n  .gap-md-2 {\n    gap: 0.5rem !important;\n  }\n  .gap-md-3 {\n    gap: 1rem !important;\n  }\n  .gap-md-4 {\n    gap: 1.5rem !important;\n  }\n  .gap-md-5 {\n    gap: 3rem !important;\n  }\n  .row-gap-md-0 {\n    row-gap: 0 !important;\n  }\n  .row-gap-md-1 {\n    row-gap: 0.25rem !important;\n  }\n  .row-gap-md-2 {\n    row-gap: 0.5rem !important;\n  }\n  .row-gap-md-3 {\n    row-gap: 1rem !important;\n  }\n  .row-gap-md-4 {\n    row-gap: 1.5rem !important;\n  }\n  .row-gap-md-5 {\n    row-gap: 3rem !important;\n  }\n  .column-gap-md-0 {\n    -moz-column-gap: 0 !important;\n    column-gap: 0 !important;\n  }\n  .column-gap-md-1 {\n    -moz-column-gap: 0.25rem !important;\n    column-gap: 0.25rem !important;\n  }\n  .column-gap-md-2 {\n    -moz-column-gap: 0.5rem !important;\n    column-gap: 0.5rem !important;\n  }\n  .column-gap-md-3 {\n    -moz-column-gap: 1rem !important;\n    column-gap: 1rem !important;\n  }\n  .column-gap-md-4 {\n    -moz-column-gap: 1.5rem !important;\n    column-gap: 1.5rem !important;\n  }\n  .column-gap-md-5 {\n    -moz-column-gap: 3rem !important;\n    column-gap: 3rem !important;\n  }\n  .text-md-start {\n    text-align: left !important;\n  }\n  .text-md-end {\n    text-align: right !important;\n  }\n  .text-md-center {\n    text-align: center !important;\n  }\n}\n@media (min-width: 992px) {\n  .float-lg-start {\n    float: left !important;\n  }\n  .float-lg-end {\n    float: right !important;\n  }\n  .float-lg-none {\n    float: none !important;\n  }\n  .object-fit-lg-contain {\n    -o-object-fit: contain !important;\n    object-fit: contain !important;\n  }\n  .object-fit-lg-cover {\n    -o-object-fit: cover !important;\n    object-fit: cover !important;\n  }\n  .object-fit-lg-fill {\n    -o-object-fit: fill !important;\n    object-fit: fill !important;\n  }\n  .object-fit-lg-scale {\n    -o-object-fit: scale-down !important;\n    object-fit: scale-down !important;\n  }\n  .object-fit-lg-none {\n    -o-object-fit: none !important;\n    object-fit: none !important;\n  }\n  .d-lg-inline {\n    display: inline !important;\n  }\n  .d-lg-inline-block {\n    display: inline-block !important;\n  }\n  .d-lg-block {\n    display: block !important;\n  }\n  .d-lg-grid {\n    display: grid !important;\n  }\n  .d-lg-inline-grid {\n    display: inline-grid !important;\n  }\n  .d-lg-table {\n    display: table !important;\n  }\n  .d-lg-table-row {\n    display: table-row !important;\n  }\n  .d-lg-table-cell {\n    display: table-cell !important;\n  }\n  .d-lg-flex {\n    display: flex !important;\n  }\n  .d-lg-inline-flex {\n    display: inline-flex !important;\n  }\n  .d-lg-none {\n    display: none !important;\n  }\n  .flex-lg-fill {\n    flex: 1 1 auto !important;\n  }\n  .flex-lg-row {\n    flex-direction: row !important;\n  }\n  .flex-lg-column {\n    flex-direction: column !important;\n  }\n  .flex-lg-row-reverse {\n    flex-direction: row-reverse !important;\n  }\n  .flex-lg-column-reverse {\n    flex-direction: column-reverse !important;\n  }\n  .flex-lg-grow-0 {\n    flex-grow: 0 !important;\n  }\n  .flex-lg-grow-1 {\n    flex-grow: 1 !important;\n  }\n  .flex-lg-shrink-0 {\n    flex-shrink: 0 !important;\n  }\n  .flex-lg-shrink-1 {\n    flex-shrink: 1 !important;\n  }\n  .flex-lg-wrap {\n    flex-wrap: wrap !important;\n  }\n  .flex-lg-nowrap {\n    flex-wrap: nowrap !important;\n  }\n  .flex-lg-wrap-reverse {\n    flex-wrap: wrap-reverse !important;\n  }\n  .justify-content-lg-start {\n    justify-content: flex-start !important;\n  }\n  .justify-content-lg-end {\n    justify-content: flex-end !important;\n  }\n  .justify-content-lg-center {\n    justify-content: center !important;\n  }\n  .justify-content-lg-between {\n    justify-content: space-between !important;\n  }\n  .justify-content-lg-around {\n    justify-content: space-around !important;\n  }\n  .justify-content-lg-evenly {\n    justify-content: space-evenly !important;\n  }\n  .align-items-lg-start {\n    align-items: flex-start !important;\n  }\n  .align-items-lg-end {\n    align-items: flex-end !important;\n  }\n  .align-items-lg-center {\n    align-items: center !important;\n  }\n  .align-items-lg-baseline {\n    align-items: baseline !important;\n  }\n  .align-items-lg-stretch {\n    align-items: stretch !important;\n  }\n  .align-content-lg-start {\n    align-content: flex-start !important;\n  }\n  .align-content-lg-end {\n    align-content: flex-end !important;\n  }\n  .align-content-lg-center {\n    align-content: center !important;\n  }\n  .align-content-lg-between {\n    align-content: space-between !important;\n  }\n  .align-content-lg-around {\n    align-content: space-around !important;\n  }\n  .align-content-lg-stretch {\n    align-content: stretch !important;\n  }\n  .align-self-lg-auto {\n    align-self: auto !important;\n  }\n  .align-self-lg-start {\n    align-self: flex-start !important;\n  }\n  .align-self-lg-end {\n    align-self: flex-end !important;\n  }\n  .align-self-lg-center {\n    align-self: center !important;\n  }\n  .align-self-lg-baseline {\n    align-self: baseline !important;\n  }\n  .align-self-lg-stretch {\n    align-self: stretch !important;\n  }\n  .order-lg-first {\n    order: -1 !important;\n  }\n  .order-lg-0 {\n    order: 0 !important;\n  }\n  .order-lg-1 {\n    order: 1 !important;\n  }\n  .order-lg-2 {\n    order: 2 !important;\n  }\n  .order-lg-3 {\n    order: 3 !important;\n  }\n  .order-lg-4 {\n    order: 4 !important;\n  }\n  .order-lg-5 {\n    order: 5 !important;\n  }\n  .order-lg-last {\n    order: 6 !important;\n  }\n  .m-lg-0 {\n    margin: 0 !important;\n  }\n  .m-lg-1 {\n    margin: 0.25rem !important;\n  }\n  .m-lg-2 {\n    margin: 0.5rem !important;\n  }\n  .m-lg-3 {\n    margin: 1rem !important;\n  }\n  .m-lg-4 {\n    margin: 1.5rem !important;\n  }\n  .m-lg-5 {\n    margin: 3rem !important;\n  }\n  .m-lg-auto {\n    margin: auto !important;\n  }\n  .mx-lg-0 {\n    margin-right: 0 !important;\n    margin-left: 0 !important;\n  }\n  .mx-lg-1 {\n    margin-right: 0.25rem !important;\n    margin-left: 0.25rem !important;\n  }\n  .mx-lg-2 {\n    margin-right: 0.5rem !important;\n    margin-left: 0.5rem !important;\n  }\n  .mx-lg-3 {\n    margin-right: 1rem !important;\n    margin-left: 1rem !important;\n  }\n  .mx-lg-4 {\n    margin-right: 1.5rem !important;\n    margin-left: 1.5rem !important;\n  }\n  .mx-lg-5 {\n    margin-right: 3rem !important;\n    margin-left: 3rem !important;\n  }\n  .mx-lg-auto {\n    margin-right: auto !important;\n    margin-left: auto !important;\n  }\n  .my-lg-0 {\n    margin-top: 0 !important;\n    margin-bottom: 0 !important;\n  }\n  .my-lg-1 {\n    margin-top: 0.25rem !important;\n    margin-bottom: 0.25rem !important;\n  }\n  .my-lg-2 {\n    margin-top: 0.5rem !important;\n    margin-bottom: 0.5rem !important;\n  }\n  .my-lg-3 {\n    margin-top: 1rem !important;\n    margin-bottom: 1rem !important;\n  }\n  .my-lg-4 {\n    margin-top: 1.5rem !important;\n    margin-bottom: 1.5rem !important;\n  }\n  .my-lg-5 {\n    margin-top: 3rem !important;\n    margin-bottom: 3rem !important;\n  }\n  .my-lg-auto {\n    margin-top: auto !important;\n    margin-bottom: auto !important;\n  }\n  .mt-lg-0 {\n    margin-top: 0 !important;\n  }\n  .mt-lg-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mt-lg-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mt-lg-3 {\n    margin-top: 1rem !important;\n  }\n  .mt-lg-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mt-lg-5 {\n    margin-top: 3rem !important;\n  }\n  .mt-lg-auto {\n    margin-top: auto !important;\n  }\n  .me-lg-0 {\n    margin-right: 0 !important;\n  }\n  .me-lg-1 {\n    margin-right: 0.25rem !important;\n  }\n  .me-lg-2 {\n    margin-right: 0.5rem !important;\n  }\n  .me-lg-3 {\n    margin-right: 1rem !important;\n  }\n  .me-lg-4 {\n    margin-right: 1.5rem !important;\n  }\n  .me-lg-5 {\n    margin-right: 3rem !important;\n  }\n  .me-lg-auto {\n    margin-right: auto !important;\n  }\n  .mb-lg-0 {\n    margin-bottom: 0 !important;\n  }\n  .mb-lg-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .mb-lg-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .mb-lg-3 {\n    margin-bottom: 1rem !important;\n  }\n  .mb-lg-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .mb-lg-5 {\n    margin-bottom: 3rem !important;\n  }\n  .mb-lg-auto {\n    margin-bottom: auto !important;\n  }\n  .ms-lg-0 {\n    margin-left: 0 !important;\n  }\n  .ms-lg-1 {\n    margin-left: 0.25rem !important;\n  }\n  .ms-lg-2 {\n    margin-left: 0.5rem !important;\n  }\n  .ms-lg-3 {\n    margin-left: 1rem !important;\n  }\n  .ms-lg-4 {\n    margin-left: 1.5rem !important;\n  }\n  .ms-lg-5 {\n    margin-left: 3rem !important;\n  }\n  .ms-lg-auto {\n    margin-left: auto !important;\n  }\n  .p-lg-0 {\n    padding: 0 !important;\n  }\n  .p-lg-1 {\n    padding: 0.25rem !important;\n  }\n  .p-lg-2 {\n    padding: 0.5rem !important;\n  }\n  .p-lg-3 {\n    padding: 1rem !important;\n  }\n  .p-lg-4 {\n    padding: 1.5rem !important;\n  }\n  .p-lg-5 {\n    padding: 3rem !important;\n  }\n  .px-lg-0 {\n    padding-right: 0 !important;\n    padding-left: 0 !important;\n  }\n  .px-lg-1 {\n    padding-right: 0.25rem !important;\n    padding-left: 0.25rem !important;\n  }\n  .px-lg-2 {\n    padding-right: 0.5rem !important;\n    padding-left: 0.5rem !important;\n  }\n  .px-lg-3 {\n    padding-right: 1rem !important;\n    padding-left: 1rem !important;\n  }\n  .px-lg-4 {\n    padding-right: 1.5rem !important;\n    padding-left: 1.5rem !important;\n  }\n  .px-lg-5 {\n    padding-right: 3rem !important;\n    padding-left: 3rem !important;\n  }\n  .py-lg-0 {\n    padding-top: 0 !important;\n    padding-bottom: 0 !important;\n  }\n  .py-lg-1 {\n    padding-top: 0.25rem !important;\n    padding-bottom: 0.25rem !important;\n  }\n  .py-lg-2 {\n    padding-top: 0.5rem !important;\n    padding-bottom: 0.5rem !important;\n  }\n  .py-lg-3 {\n    padding-top: 1rem !important;\n    padding-bottom: 1rem !important;\n  }\n  .py-lg-4 {\n    padding-top: 1.5rem !important;\n    padding-bottom: 1.5rem !important;\n  }\n  .py-lg-5 {\n    padding-top: 3rem !important;\n    padding-bottom: 3rem !important;\n  }\n  .pt-lg-0 {\n    padding-top: 0 !important;\n  }\n  .pt-lg-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pt-lg-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pt-lg-3 {\n    padding-top: 1rem !important;\n  }\n  .pt-lg-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pt-lg-5 {\n    padding-top: 3rem !important;\n  }\n  .pe-lg-0 {\n    padding-right: 0 !important;\n  }\n  .pe-lg-1 {\n    padding-right: 0.25rem !important;\n  }\n  .pe-lg-2 {\n    padding-right: 0.5rem !important;\n  }\n  .pe-lg-3 {\n    padding-right: 1rem !important;\n  }\n  .pe-lg-4 {\n    padding-right: 1.5rem !important;\n  }\n  .pe-lg-5 {\n    padding-right: 3rem !important;\n  }\n  .pb-lg-0 {\n    padding-bottom: 0 !important;\n  }\n  .pb-lg-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pb-lg-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pb-lg-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pb-lg-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pb-lg-5 {\n    padding-bottom: 3rem !important;\n  }\n  .ps-lg-0 {\n    padding-left: 0 !important;\n  }\n  .ps-lg-1 {\n    padding-left: 0.25rem !important;\n  }\n  .ps-lg-2 {\n    padding-left: 0.5rem !important;\n  }\n  .ps-lg-3 {\n    padding-left: 1rem !important;\n  }\n  .ps-lg-4 {\n    padding-left: 1.5rem !important;\n  }\n  .ps-lg-5 {\n    padding-left: 3rem !important;\n  }\n  .gap-lg-0 {\n    gap: 0 !important;\n  }\n  .gap-lg-1 {\n    gap: 0.25rem !important;\n  }\n  .gap-lg-2 {\n    gap: 0.5rem !important;\n  }\n  .gap-lg-3 {\n    gap: 1rem !important;\n  }\n  .gap-lg-4 {\n    gap: 1.5rem !important;\n  }\n  .gap-lg-5 {\n    gap: 3rem !important;\n  }\n  .row-gap-lg-0 {\n    row-gap: 0 !important;\n  }\n  .row-gap-lg-1 {\n    row-gap: 0.25rem !important;\n  }\n  .row-gap-lg-2 {\n    row-gap: 0.5rem !important;\n  }\n  .row-gap-lg-3 {\n    row-gap: 1rem !important;\n  }\n  .row-gap-lg-4 {\n    row-gap: 1.5rem !important;\n  }\n  .row-gap-lg-5 {\n    row-gap: 3rem !important;\n  }\n  .column-gap-lg-0 {\n    -moz-column-gap: 0 !important;\n    column-gap: 0 !important;\n  }\n  .column-gap-lg-1 {\n    -moz-column-gap: 0.25rem !important;\n    column-gap: 0.25rem !important;\n  }\n  .column-gap-lg-2 {\n    -moz-column-gap: 0.5rem !important;\n    column-gap: 0.5rem !important;\n  }\n  .column-gap-lg-3 {\n    -moz-column-gap: 1rem !important;\n    column-gap: 1rem !important;\n  }\n  .column-gap-lg-4 {\n    -moz-column-gap: 1.5rem !important;\n    column-gap: 1.5rem !important;\n  }\n  .column-gap-lg-5 {\n    -moz-column-gap: 3rem !important;\n    column-gap: 3rem !important;\n  }\n  .text-lg-start {\n    text-align: left !important;\n  }\n  .text-lg-end {\n    text-align: right !important;\n  }\n  .text-lg-center {\n    text-align: center !important;\n  }\n}\n@media (min-width: 1200px) {\n  .float-xl-start {\n    float: left !important;\n  }\n  .float-xl-end {\n    float: right !important;\n  }\n  .float-xl-none {\n    float: none !important;\n  }\n  .object-fit-xl-contain {\n    -o-object-fit: contain !important;\n    object-fit: contain !important;\n  }\n  .object-fit-xl-cover {\n    -o-object-fit: cover !important;\n    object-fit: cover !important;\n  }\n  .object-fit-xl-fill {\n    -o-object-fit: fill !important;\n    object-fit: fill !important;\n  }\n  .object-fit-xl-scale {\n    -o-object-fit: scale-down !important;\n    object-fit: scale-down !important;\n  }\n  .object-fit-xl-none {\n    -o-object-fit: none !important;\n    object-fit: none !important;\n  }\n  .d-xl-inline {\n    display: inline !important;\n  }\n  .d-xl-inline-block {\n    display: inline-block !important;\n  }\n  .d-xl-block {\n    display: block !important;\n  }\n  .d-xl-grid {\n    display: grid !important;\n  }\n  .d-xl-inline-grid {\n    display: inline-grid !important;\n  }\n  .d-xl-table {\n    display: table !important;\n  }\n  .d-xl-table-row {\n    display: table-row !important;\n  }\n  .d-xl-table-cell {\n    display: table-cell !important;\n  }\n  .d-xl-flex {\n    display: flex !important;\n  }\n  .d-xl-inline-flex {\n    display: inline-flex !important;\n  }\n  .d-xl-none {\n    display: none !important;\n  }\n  .flex-xl-fill {\n    flex: 1 1 auto !important;\n  }\n  .flex-xl-row {\n    flex-direction: row !important;\n  }\n  .flex-xl-column {\n    flex-direction: column !important;\n  }\n  .flex-xl-row-reverse {\n    flex-direction: row-reverse !important;\n  }\n  .flex-xl-column-reverse {\n    flex-direction: column-reverse !important;\n  }\n  .flex-xl-grow-0 {\n    flex-grow: 0 !important;\n  }\n  .flex-xl-grow-1 {\n    flex-grow: 1 !important;\n  }\n  .flex-xl-shrink-0 {\n    flex-shrink: 0 !important;\n  }\n  .flex-xl-shrink-1 {\n    flex-shrink: 1 !important;\n  }\n  .flex-xl-wrap {\n    flex-wrap: wrap !important;\n  }\n  .flex-xl-nowrap {\n    flex-wrap: nowrap !important;\n  }\n  .flex-xl-wrap-reverse {\n    flex-wrap: wrap-reverse !important;\n  }\n  .justify-content-xl-start {\n    justify-content: flex-start !important;\n  }\n  .justify-content-xl-end {\n    justify-content: flex-end !important;\n  }\n  .justify-content-xl-center {\n    justify-content: center !important;\n  }\n  .justify-content-xl-between {\n    justify-content: space-between !important;\n  }\n  .justify-content-xl-around {\n    justify-content: space-around !important;\n  }\n  .justify-content-xl-evenly {\n    justify-content: space-evenly !important;\n  }\n  .align-items-xl-start {\n    align-items: flex-start !important;\n  }\n  .align-items-xl-end {\n    align-items: flex-end !important;\n  }\n  .align-items-xl-center {\n    align-items: center !important;\n  }\n  .align-items-xl-baseline {\n    align-items: baseline !important;\n  }\n  .align-items-xl-stretch {\n    align-items: stretch !important;\n  }\n  .align-content-xl-start {\n    align-content: flex-start !important;\n  }\n  .align-content-xl-end {\n    align-content: flex-end !important;\n  }\n  .align-content-xl-center {\n    align-content: center !important;\n  }\n  .align-content-xl-between {\n    align-content: space-between !important;\n  }\n  .align-content-xl-around {\n    align-content: space-around !important;\n  }\n  .align-content-xl-stretch {\n    align-content: stretch !important;\n  }\n  .align-self-xl-auto {\n    align-self: auto !important;\n  }\n  .align-self-xl-start {\n    align-self: flex-start !important;\n  }\n  .align-self-xl-end {\n    align-self: flex-end !important;\n  }\n  .align-self-xl-center {\n    align-self: center !important;\n  }\n  .align-self-xl-baseline {\n    align-self: baseline !important;\n  }\n  .align-self-xl-stretch {\n    align-self: stretch !important;\n  }\n  .order-xl-first {\n    order: -1 !important;\n  }\n  .order-xl-0 {\n    order: 0 !important;\n  }\n  .order-xl-1 {\n    order: 1 !important;\n  }\n  .order-xl-2 {\n    order: 2 !important;\n  }\n  .order-xl-3 {\n    order: 3 !important;\n  }\n  .order-xl-4 {\n    order: 4 !important;\n  }\n  .order-xl-5 {\n    order: 5 !important;\n  }\n  .order-xl-last {\n    order: 6 !important;\n  }\n  .m-xl-0 {\n    margin: 0 !important;\n  }\n  .m-xl-1 {\n    margin: 0.25rem !important;\n  }\n  .m-xl-2 {\n    margin: 0.5rem !important;\n  }\n  .m-xl-3 {\n    margin: 1rem !important;\n  }\n  .m-xl-4 {\n    margin: 1.5rem !important;\n  }\n  .m-xl-5 {\n    margin: 3rem !important;\n  }\n  .m-xl-auto {\n    margin: auto !important;\n  }\n  .mx-xl-0 {\n    margin-right: 0 !important;\n    margin-left: 0 !important;\n  }\n  .mx-xl-1 {\n    margin-right: 0.25rem !important;\n    margin-left: 0.25rem !important;\n  }\n  .mx-xl-2 {\n    margin-right: 0.5rem !important;\n    margin-left: 0.5rem !important;\n  }\n  .mx-xl-3 {\n    margin-right: 1rem !important;\n    margin-left: 1rem !important;\n  }\n  .mx-xl-4 {\n    margin-right: 1.5rem !important;\n    margin-left: 1.5rem !important;\n  }\n  .mx-xl-5 {\n    margin-right: 3rem !important;\n    margin-left: 3rem !important;\n  }\n  .mx-xl-auto {\n    margin-right: auto !important;\n    margin-left: auto !important;\n  }\n  .my-xl-0 {\n    margin-top: 0 !important;\n    margin-bottom: 0 !important;\n  }\n  .my-xl-1 {\n    margin-top: 0.25rem !important;\n    margin-bottom: 0.25rem !important;\n  }\n  .my-xl-2 {\n    margin-top: 0.5rem !important;\n    margin-bottom: 0.5rem !important;\n  }\n  .my-xl-3 {\n    margin-top: 1rem !important;\n    margin-bottom: 1rem !important;\n  }\n  .my-xl-4 {\n    margin-top: 1.5rem !important;\n    margin-bottom: 1.5rem !important;\n  }\n  .my-xl-5 {\n    margin-top: 3rem !important;\n    margin-bottom: 3rem !important;\n  }\n  .my-xl-auto {\n    margin-top: auto !important;\n    margin-bottom: auto !important;\n  }\n  .mt-xl-0 {\n    margin-top: 0 !important;\n  }\n  .mt-xl-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mt-xl-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mt-xl-3 {\n    margin-top: 1rem !important;\n  }\n  .mt-xl-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mt-xl-5 {\n    margin-top: 3rem !important;\n  }\n  .mt-xl-auto {\n    margin-top: auto !important;\n  }\n  .me-xl-0 {\n    margin-right: 0 !important;\n  }\n  .me-xl-1 {\n    margin-right: 0.25rem !important;\n  }\n  .me-xl-2 {\n    margin-right: 0.5rem !important;\n  }\n  .me-xl-3 {\n    margin-right: 1rem !important;\n  }\n  .me-xl-4 {\n    margin-right: 1.5rem !important;\n  }\n  .me-xl-5 {\n    margin-right: 3rem !important;\n  }\n  .me-xl-auto {\n    margin-right: auto !important;\n  }\n  .mb-xl-0 {\n    margin-bottom: 0 !important;\n  }\n  .mb-xl-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .mb-xl-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .mb-xl-3 {\n    margin-bottom: 1rem !important;\n  }\n  .mb-xl-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .mb-xl-5 {\n    margin-bottom: 3rem !important;\n  }\n  .mb-xl-auto {\n    margin-bottom: auto !important;\n  }\n  .ms-xl-0 {\n    margin-left: 0 !important;\n  }\n  .ms-xl-1 {\n    margin-left: 0.25rem !important;\n  }\n  .ms-xl-2 {\n    margin-left: 0.5rem !important;\n  }\n  .ms-xl-3 {\n    margin-left: 1rem !important;\n  }\n  .ms-xl-4 {\n    margin-left: 1.5rem !important;\n  }\n  .ms-xl-5 {\n    margin-left: 3rem !important;\n  }\n  .ms-xl-auto {\n    margin-left: auto !important;\n  }\n  .p-xl-0 {\n    padding: 0 !important;\n  }\n  .p-xl-1 {\n    padding: 0.25rem !important;\n  }\n  .p-xl-2 {\n    padding: 0.5rem !important;\n  }\n  .p-xl-3 {\n    padding: 1rem !important;\n  }\n  .p-xl-4 {\n    padding: 1.5rem !important;\n  }\n  .p-xl-5 {\n    padding: 3rem !important;\n  }\n  .px-xl-0 {\n    padding-right: 0 !important;\n    padding-left: 0 !important;\n  }\n  .px-xl-1 {\n    padding-right: 0.25rem !important;\n    padding-left: 0.25rem !important;\n  }\n  .px-xl-2 {\n    padding-right: 0.5rem !important;\n    padding-left: 0.5rem !important;\n  }\n  .px-xl-3 {\n    padding-right: 1rem !important;\n    padding-left: 1rem !important;\n  }\n  .px-xl-4 {\n    padding-right: 1.5rem !important;\n    padding-left: 1.5rem !important;\n  }\n  .px-xl-5 {\n    padding-right: 3rem !important;\n    padding-left: 3rem !important;\n  }\n  .py-xl-0 {\n    padding-top: 0 !important;\n    padding-bottom: 0 !important;\n  }\n  .py-xl-1 {\n    padding-top: 0.25rem !important;\n    padding-bottom: 0.25rem !important;\n  }\n  .py-xl-2 {\n    padding-top: 0.5rem !important;\n    padding-bottom: 0.5rem !important;\n  }\n  .py-xl-3 {\n    padding-top: 1rem !important;\n    padding-bottom: 1rem !important;\n  }\n  .py-xl-4 {\n    padding-top: 1.5rem !important;\n    padding-bottom: 1.5rem !important;\n  }\n  .py-xl-5 {\n    padding-top: 3rem !important;\n    padding-bottom: 3rem !important;\n  }\n  .pt-xl-0 {\n    padding-top: 0 !important;\n  }\n  .pt-xl-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pt-xl-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pt-xl-3 {\n    padding-top: 1rem !important;\n  }\n  .pt-xl-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pt-xl-5 {\n    padding-top: 3rem !important;\n  }\n  .pe-xl-0 {\n    padding-right: 0 !important;\n  }\n  .pe-xl-1 {\n    padding-right: 0.25rem !important;\n  }\n  .pe-xl-2 {\n    padding-right: 0.5rem !important;\n  }\n  .pe-xl-3 {\n    padding-right: 1rem !important;\n  }\n  .pe-xl-4 {\n    padding-right: 1.5rem !important;\n  }\n  .pe-xl-5 {\n    padding-right: 3rem !important;\n  }\n  .pb-xl-0 {\n    padding-bottom: 0 !important;\n  }\n  .pb-xl-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pb-xl-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pb-xl-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pb-xl-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pb-xl-5 {\n    padding-bottom: 3rem !important;\n  }\n  .ps-xl-0 {\n    padding-left: 0 !important;\n  }\n  .ps-xl-1 {\n    padding-left: 0.25rem !important;\n  }\n  .ps-xl-2 {\n    padding-left: 0.5rem !important;\n  }\n  .ps-xl-3 {\n    padding-left: 1rem !important;\n  }\n  .ps-xl-4 {\n    padding-left: 1.5rem !important;\n  }\n  .ps-xl-5 {\n    padding-left: 3rem !important;\n  }\n  .gap-xl-0 {\n    gap: 0 !important;\n  }\n  .gap-xl-1 {\n    gap: 0.25rem !important;\n  }\n  .gap-xl-2 {\n    gap: 0.5rem !important;\n  }\n  .gap-xl-3 {\n    gap: 1rem !important;\n  }\n  .gap-xl-4 {\n    gap: 1.5rem !important;\n  }\n  .gap-xl-5 {\n    gap: 3rem !important;\n  }\n  .row-gap-xl-0 {\n    row-gap: 0 !important;\n  }\n  .row-gap-xl-1 {\n    row-gap: 0.25rem !important;\n  }\n  .row-gap-xl-2 {\n    row-gap: 0.5rem !important;\n  }\n  .row-gap-xl-3 {\n    row-gap: 1rem !important;\n  }\n  .row-gap-xl-4 {\n    row-gap: 1.5rem !important;\n  }\n  .row-gap-xl-5 {\n    row-gap: 3rem !important;\n  }\n  .column-gap-xl-0 {\n    -moz-column-gap: 0 !important;\n    column-gap: 0 !important;\n  }\n  .column-gap-xl-1 {\n    -moz-column-gap: 0.25rem !important;\n    column-gap: 0.25rem !important;\n  }\n  .column-gap-xl-2 {\n    -moz-column-gap: 0.5rem !important;\n    column-gap: 0.5rem !important;\n  }\n  .column-gap-xl-3 {\n    -moz-column-gap: 1rem !important;\n    column-gap: 1rem !important;\n  }\n  .column-gap-xl-4 {\n    -moz-column-gap: 1.5rem !important;\n    column-gap: 1.5rem !important;\n  }\n  .column-gap-xl-5 {\n    -moz-column-gap: 3rem !important;\n    column-gap: 3rem !important;\n  }\n  .text-xl-start {\n    text-align: left !important;\n  }\n  .text-xl-end {\n    text-align: right !important;\n  }\n  .text-xl-center {\n    text-align: center !important;\n  }\n}\n@media (min-width: 1400px) {\n  .float-xxl-start {\n    float: left !important;\n  }\n  .float-xxl-end {\n    float: right !important;\n  }\n  .float-xxl-none {\n    float: none !important;\n  }\n  .object-fit-xxl-contain {\n    -o-object-fit: contain !important;\n    object-fit: contain !important;\n  }\n  .object-fit-xxl-cover {\n    -o-object-fit: cover !important;\n    object-fit: cover !important;\n  }\n  .object-fit-xxl-fill {\n    -o-object-fit: fill !important;\n    object-fit: fill !important;\n  }\n  .object-fit-xxl-scale {\n    -o-object-fit: scale-down !important;\n    object-fit: scale-down !important;\n  }\n  .object-fit-xxl-none {\n    -o-object-fit: none !important;\n    object-fit: none !important;\n  }\n  .d-xxl-inline {\n    display: inline !important;\n  }\n  .d-xxl-inline-block {\n    display: inline-block !important;\n  }\n  .d-xxl-block {\n    display: block !important;\n  }\n  .d-xxl-grid {\n    display: grid !important;\n  }\n  .d-xxl-inline-grid {\n    display: inline-grid !important;\n  }\n  .d-xxl-table {\n    display: table !important;\n  }\n  .d-xxl-table-row {\n    display: table-row !important;\n  }\n  .d-xxl-table-cell {\n    display: table-cell !important;\n  }\n  .d-xxl-flex {\n    display: flex !important;\n  }\n  .d-xxl-inline-flex {\n    display: inline-flex !important;\n  }\n  .d-xxl-none {\n    display: none !important;\n  }\n  .flex-xxl-fill {\n    flex: 1 1 auto !important;\n  }\n  .flex-xxl-row {\n    flex-direction: row !important;\n  }\n  .flex-xxl-column {\n    flex-direction: column !important;\n  }\n  .flex-xxl-row-reverse {\n    flex-direction: row-reverse !important;\n  }\n  .flex-xxl-column-reverse {\n    flex-direction: column-reverse !important;\n  }\n  .flex-xxl-grow-0 {\n    flex-grow: 0 !important;\n  }\n  .flex-xxl-grow-1 {\n    flex-grow: 1 !important;\n  }\n  .flex-xxl-shrink-0 {\n    flex-shrink: 0 !important;\n  }\n  .flex-xxl-shrink-1 {\n    flex-shrink: 1 !important;\n  }\n  .flex-xxl-wrap {\n    flex-wrap: wrap !important;\n  }\n  .flex-xxl-nowrap {\n    flex-wrap: nowrap !important;\n  }\n  .flex-xxl-wrap-reverse {\n    flex-wrap: wrap-reverse !important;\n  }\n  .justify-content-xxl-start {\n    justify-content: flex-start !important;\n  }\n  .justify-content-xxl-end {\n    justify-content: flex-end !important;\n  }\n  .justify-content-xxl-center {\n    justify-content: center !important;\n  }\n  .justify-content-xxl-between {\n    justify-content: space-between !important;\n  }\n  .justify-content-xxl-around {\n    justify-content: space-around !important;\n  }\n  .justify-content-xxl-evenly {\n    justify-content: space-evenly !important;\n  }\n  .align-items-xxl-start {\n    align-items: flex-start !important;\n  }\n  .align-items-xxl-end {\n    align-items: flex-end !important;\n  }\n  .align-items-xxl-center {\n    align-items: center !important;\n  }\n  .align-items-xxl-baseline {\n    align-items: baseline !important;\n  }\n  .align-items-xxl-stretch {\n    align-items: stretch !important;\n  }\n  .align-content-xxl-start {\n    align-content: flex-start !important;\n  }\n  .align-content-xxl-end {\n    align-content: flex-end !important;\n  }\n  .align-content-xxl-center {\n    align-content: center !important;\n  }\n  .align-content-xxl-between {\n    align-content: space-between !important;\n  }\n  .align-content-xxl-around {\n    align-content: space-around !important;\n  }\n  .align-content-xxl-stretch {\n    align-content: stretch !important;\n  }\n  .align-self-xxl-auto {\n    align-self: auto !important;\n  }\n  .align-self-xxl-start {\n    align-self: flex-start !important;\n  }\n  .align-self-xxl-end {\n    align-self: flex-end !important;\n  }\n  .align-self-xxl-center {\n    align-self: center !important;\n  }\n  .align-self-xxl-baseline {\n    align-self: baseline !important;\n  }\n  .align-self-xxl-stretch {\n    align-self: stretch !important;\n  }\n  .order-xxl-first {\n    order: -1 !important;\n  }\n  .order-xxl-0 {\n    order: 0 !important;\n  }\n  .order-xxl-1 {\n    order: 1 !important;\n  }\n  .order-xxl-2 {\n    order: 2 !important;\n  }\n  .order-xxl-3 {\n    order: 3 !important;\n  }\n  .order-xxl-4 {\n    order: 4 !important;\n  }\n  .order-xxl-5 {\n    order: 5 !important;\n  }\n  .order-xxl-last {\n    order: 6 !important;\n  }\n  .m-xxl-0 {\n    margin: 0 !important;\n  }\n  .m-xxl-1 {\n    margin: 0.25rem !important;\n  }\n  .m-xxl-2 {\n    margin: 0.5rem !important;\n  }\n  .m-xxl-3 {\n    margin: 1rem !important;\n  }\n  .m-xxl-4 {\n    margin: 1.5rem !important;\n  }\n  .m-xxl-5 {\n    margin: 3rem !important;\n  }\n  .m-xxl-auto {\n    margin: auto !important;\n  }\n  .mx-xxl-0 {\n    margin-right: 0 !important;\n    margin-left: 0 !important;\n  }\n  .mx-xxl-1 {\n    margin-right: 0.25rem !important;\n    margin-left: 0.25rem !important;\n  }\n  .mx-xxl-2 {\n    margin-right: 0.5rem !important;\n    margin-left: 0.5rem !important;\n  }\n  .mx-xxl-3 {\n    margin-right: 1rem !important;\n    margin-left: 1rem !important;\n  }\n  .mx-xxl-4 {\n    margin-right: 1.5rem !important;\n    margin-left: 1.5rem !important;\n  }\n  .mx-xxl-5 {\n    margin-right: 3rem !important;\n    margin-left: 3rem !important;\n  }\n  .mx-xxl-auto {\n    margin-right: auto !important;\n    margin-left: auto !important;\n  }\n  .my-xxl-0 {\n    margin-top: 0 !important;\n    margin-bottom: 0 !important;\n  }\n  .my-xxl-1 {\n    margin-top: 0.25rem !important;\n    margin-bottom: 0.25rem !important;\n  }\n  .my-xxl-2 {\n    margin-top: 0.5rem !important;\n    margin-bottom: 0.5rem !important;\n  }\n  .my-xxl-3 {\n    margin-top: 1rem !important;\n    margin-bottom: 1rem !important;\n  }\n  .my-xxl-4 {\n    margin-top: 1.5rem !important;\n    margin-bottom: 1.5rem !important;\n  }\n  .my-xxl-5 {\n    margin-top: 3rem !important;\n    margin-bottom: 3rem !important;\n  }\n  .my-xxl-auto {\n    margin-top: auto !important;\n    margin-bottom: auto !important;\n  }\n  .mt-xxl-0 {\n    margin-top: 0 !important;\n  }\n  .mt-xxl-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mt-xxl-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mt-xxl-3 {\n    margin-top: 1rem !important;\n  }\n  .mt-xxl-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mt-xxl-5 {\n    margin-top: 3rem !important;\n  }\n  .mt-xxl-auto {\n    margin-top: auto !important;\n  }\n  .me-xxl-0 {\n    margin-right: 0 !important;\n  }\n  .me-xxl-1 {\n    margin-right: 0.25rem !important;\n  }\n  .me-xxl-2 {\n    margin-right: 0.5rem !important;\n  }\n  .me-xxl-3 {\n    margin-right: 1rem !important;\n  }\n  .me-xxl-4 {\n    margin-right: 1.5rem !important;\n  }\n  .me-xxl-5 {\n    margin-right: 3rem !important;\n  }\n  .me-xxl-auto {\n    margin-right: auto !important;\n  }\n  .mb-xxl-0 {\n    margin-bottom: 0 !important;\n  }\n  .mb-xxl-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .mb-xxl-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .mb-xxl-3 {\n    margin-bottom: 1rem !important;\n  }\n  .mb-xxl-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .mb-xxl-5 {\n    margin-bottom: 3rem !important;\n  }\n  .mb-xxl-auto {\n    margin-bottom: auto !important;\n  }\n  .ms-xxl-0 {\n    margin-left: 0 !important;\n  }\n  .ms-xxl-1 {\n    margin-left: 0.25rem !important;\n  }\n  .ms-xxl-2 {\n    margin-left: 0.5rem !important;\n  }\n  .ms-xxl-3 {\n    margin-left: 1rem !important;\n  }\n  .ms-xxl-4 {\n    margin-left: 1.5rem !important;\n  }\n  .ms-xxl-5 {\n    margin-left: 3rem !important;\n  }\n  .ms-xxl-auto {\n    margin-left: auto !important;\n  }\n  .p-xxl-0 {\n    padding: 0 !important;\n  }\n  .p-xxl-1 {\n    padding: 0.25rem !important;\n  }\n  .p-xxl-2 {\n    padding: 0.5rem !important;\n  }\n  .p-xxl-3 {\n    padding: 1rem !important;\n  }\n  .p-xxl-4 {\n    padding: 1.5rem !important;\n  }\n  .p-xxl-5 {\n    padding: 3rem !important;\n  }\n  .px-xxl-0 {\n    padding-right: 0 !important;\n    padding-left: 0 !important;\n  }\n  .px-xxl-1 {\n    padding-right: 0.25rem !important;\n    padding-left: 0.25rem !important;\n  }\n  .px-xxl-2 {\n    padding-right: 0.5rem !important;\n    padding-left: 0.5rem !important;\n  }\n  .px-xxl-3 {\n    padding-right: 1rem !important;\n    padding-left: 1rem !important;\n  }\n  .px-xxl-4 {\n    padding-right: 1.5rem !important;\n    padding-left: 1.5rem !important;\n  }\n  .px-xxl-5 {\n    padding-right: 3rem !important;\n    padding-left: 3rem !important;\n  }\n  .py-xxl-0 {\n    padding-top: 0 !important;\n    padding-bottom: 0 !important;\n  }\n  .py-xxl-1 {\n    padding-top: 0.25rem !important;\n    padding-bottom: 0.25rem !important;\n  }\n  .py-xxl-2 {\n    padding-top: 0.5rem !important;\n    padding-bottom: 0.5rem !important;\n  }\n  .py-xxl-3 {\n    padding-top: 1rem !important;\n    padding-bottom: 1rem !important;\n  }\n  .py-xxl-4 {\n    padding-top: 1.5rem !important;\n    padding-bottom: 1.5rem !important;\n  }\n  .py-xxl-5 {\n    padding-top: 3rem !important;\n    padding-bottom: 3rem !important;\n  }\n  .pt-xxl-0 {\n    padding-top: 0 !important;\n  }\n  .pt-xxl-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pt-xxl-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pt-xxl-3 {\n    padding-top: 1rem !important;\n  }\n  .pt-xxl-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pt-xxl-5 {\n    padding-top: 3rem !important;\n  }\n  .pe-xxl-0 {\n    padding-right: 0 !important;\n  }\n  .pe-xxl-1 {\n    padding-right: 0.25rem !important;\n  }\n  .pe-xxl-2 {\n    padding-right: 0.5rem !important;\n  }\n  .pe-xxl-3 {\n    padding-right: 1rem !important;\n  }\n  .pe-xxl-4 {\n    padding-right: 1.5rem !important;\n  }\n  .pe-xxl-5 {\n    padding-right: 3rem !important;\n  }\n  .pb-xxl-0 {\n    padding-bottom: 0 !important;\n  }\n  .pb-xxl-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pb-xxl-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pb-xxl-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pb-xxl-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pb-xxl-5 {\n    padding-bottom: 3rem !important;\n  }\n  .ps-xxl-0 {\n    padding-left: 0 !important;\n  }\n  .ps-xxl-1 {\n    padding-left: 0.25rem !important;\n  }\n  .ps-xxl-2 {\n    padding-left: 0.5rem !important;\n  }\n  .ps-xxl-3 {\n    padding-left: 1rem !important;\n  }\n  .ps-xxl-4 {\n    padding-left: 1.5rem !important;\n  }\n  .ps-xxl-5 {\n    padding-left: 3rem !important;\n  }\n  .gap-xxl-0 {\n    gap: 0 !important;\n  }\n  .gap-xxl-1 {\n    gap: 0.25rem !important;\n  }\n  .gap-xxl-2 {\n    gap: 0.5rem !important;\n  }\n  .gap-xxl-3 {\n    gap: 1rem !important;\n  }\n  .gap-xxl-4 {\n    gap: 1.5rem !important;\n  }\n  .gap-xxl-5 {\n    gap: 3rem !important;\n  }\n  .row-gap-xxl-0 {\n    row-gap: 0 !important;\n  }\n  .row-gap-xxl-1 {\n    row-gap: 0.25rem !important;\n  }\n  .row-gap-xxl-2 {\n    row-gap: 0.5rem !important;\n  }\n  .row-gap-xxl-3 {\n    row-gap: 1rem !important;\n  }\n  .row-gap-xxl-4 {\n    row-gap: 1.5rem !important;\n  }\n  .row-gap-xxl-5 {\n    row-gap: 3rem !important;\n  }\n  .column-gap-xxl-0 {\n    -moz-column-gap: 0 !important;\n    column-gap: 0 !important;\n  }\n  .column-gap-xxl-1 {\n    -moz-column-gap: 0.25rem !important;\n    column-gap: 0.25rem !important;\n  }\n  .column-gap-xxl-2 {\n    -moz-column-gap: 0.5rem !important;\n    column-gap: 0.5rem !important;\n  }\n  .column-gap-xxl-3 {\n    -moz-column-gap: 1rem !important;\n    column-gap: 1rem !important;\n  }\n  .column-gap-xxl-4 {\n    -moz-column-gap: 1.5rem !important;\n    column-gap: 1.5rem !important;\n  }\n  .column-gap-xxl-5 {\n    -moz-column-gap: 3rem !important;\n    column-gap: 3rem !important;\n  }\n  .text-xxl-start {\n    text-align: left !important;\n  }\n  .text-xxl-end {\n    text-align: right !important;\n  }\n  .text-xxl-center {\n    text-align: center !important;\n  }\n}\n@media (min-width: 1200px) {\n  .fs-1 {\n    font-size: 2.5rem !important;\n  }\n  .fs-2 {\n    font-size: 2rem !important;\n  }\n  .fs-3 {\n    font-size: 1.75rem !important;\n  }\n  .fs-4 {\n    font-size: 1.5rem !important;\n  }\n}\n@media print {\n  .d-print-inline {\n    display: inline !important;\n  }\n  .d-print-inline-block {\n    display: inline-block !important;\n  }\n  .d-print-block {\n    display: block !important;\n  }\n  .d-print-grid {\n    display: grid !important;\n  }\n  .d-print-inline-grid {\n    display: inline-grid !important;\n  }\n  .d-print-table {\n    display: table !important;\n  }\n  .d-print-table-row {\n    display: table-row !important;\n  }\n  .d-print-table-cell {\n    display: table-cell !important;\n  }\n  .d-print-flex {\n    display: flex !important;\n  }\n  .d-print-inline-flex {\n    display: inline-flex !important;\n  }\n  .d-print-none {\n    display: none !important;\n  }\n}\n\n/*# sourceMappingURL=bootstrap-utilities.css.map */"
  },
  {
    "path": "dist/css/bootstrap-utilities.rtl.css",
    "content": "/*!\n * Bootstrap Utilities v5.3.8 (https://getbootstrap.com/)\n * Copyright 2011-2025 The Bootstrap Authors\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n:root,\n[data-bs-theme=light] {\n  --bs-blue: #0d6efd;\n  --bs-indigo: #6610f2;\n  --bs-purple: #6f42c1;\n  --bs-pink: #d63384;\n  --bs-red: #dc3545;\n  --bs-orange: #fd7e14;\n  --bs-yellow: #ffc107;\n  --bs-green: #198754;\n  --bs-teal: #20c997;\n  --bs-cyan: #0dcaf0;\n  --bs-black: #000;\n  --bs-white: #fff;\n  --bs-gray: #6c757d;\n  --bs-gray-dark: #343a40;\n  --bs-gray-100: #f8f9fa;\n  --bs-gray-200: #e9ecef;\n  --bs-gray-300: #dee2e6;\n  --bs-gray-400: #ced4da;\n  --bs-gray-500: #adb5bd;\n  --bs-gray-600: #6c757d;\n  --bs-gray-700: #495057;\n  --bs-gray-800: #343a40;\n  --bs-gray-900: #212529;\n  --bs-primary: #0d6efd;\n  --bs-secondary: #6c757d;\n  --bs-success: #198754;\n  --bs-info: #0dcaf0;\n  --bs-warning: #ffc107;\n  --bs-danger: #dc3545;\n  --bs-light: #f8f9fa;\n  --bs-dark: #212529;\n  --bs-primary-rgb: 13, 110, 253;\n  --bs-secondary-rgb: 108, 117, 125;\n  --bs-success-rgb: 25, 135, 84;\n  --bs-info-rgb: 13, 202, 240;\n  --bs-warning-rgb: 255, 193, 7;\n  --bs-danger-rgb: 220, 53, 69;\n  --bs-light-rgb: 248, 249, 250;\n  --bs-dark-rgb: 33, 37, 41;\n  --bs-primary-text-emphasis: #052c65;\n  --bs-secondary-text-emphasis: #2b2f32;\n  --bs-success-text-emphasis: #0a3622;\n  --bs-info-text-emphasis: #055160;\n  --bs-warning-text-emphasis: #664d03;\n  --bs-danger-text-emphasis: #58151c;\n  --bs-light-text-emphasis: #495057;\n  --bs-dark-text-emphasis: #495057;\n  --bs-primary-bg-subtle: #cfe2ff;\n  --bs-secondary-bg-subtle: #e2e3e5;\n  --bs-success-bg-subtle: #d1e7dd;\n  --bs-info-bg-subtle: #cff4fc;\n  --bs-warning-bg-subtle: #fff3cd;\n  --bs-danger-bg-subtle: #f8d7da;\n  --bs-light-bg-subtle: #fcfcfd;\n  --bs-dark-bg-subtle: #ced4da;\n  --bs-primary-border-subtle: #9ec5fe;\n  --bs-secondary-border-subtle: #c4c8cb;\n  --bs-success-border-subtle: #a3cfbb;\n  --bs-info-border-subtle: #9eeaf9;\n  --bs-warning-border-subtle: #ffe69c;\n  --bs-danger-border-subtle: #f1aeb5;\n  --bs-light-border-subtle: #e9ecef;\n  --bs-dark-border-subtle: #adb5bd;\n  --bs-white-rgb: 255, 255, 255;\n  --bs-black-rgb: 0, 0, 0;\n  --bs-font-sans-serif: system-ui, -apple-system, \"Segoe UI\", Roboto, \"Helvetica Neue\", \"Noto Sans\", \"Liberation Sans\", Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n  --bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n  --bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));\n  --bs-body-font-family: var(--bs-font-sans-serif);\n  --bs-body-font-size: 1rem;\n  --bs-body-font-weight: 400;\n  --bs-body-line-height: 1.5;\n  --bs-body-color: #212529;\n  --bs-body-color-rgb: 33, 37, 41;\n  --bs-body-bg: #fff;\n  --bs-body-bg-rgb: 255, 255, 255;\n  --bs-emphasis-color: #000;\n  --bs-emphasis-color-rgb: 0, 0, 0;\n  --bs-secondary-color: rgba(33, 37, 41, 0.75);\n  --bs-secondary-color-rgb: 33, 37, 41;\n  --bs-secondary-bg: #e9ecef;\n  --bs-secondary-bg-rgb: 233, 236, 239;\n  --bs-tertiary-color: rgba(33, 37, 41, 0.5);\n  --bs-tertiary-color-rgb: 33, 37, 41;\n  --bs-tertiary-bg: #f8f9fa;\n  --bs-tertiary-bg-rgb: 248, 249, 250;\n  --bs-heading-color: inherit;\n  --bs-link-color: #0d6efd;\n  --bs-link-color-rgb: 13, 110, 253;\n  --bs-link-decoration: underline;\n  --bs-link-hover-color: #0a58ca;\n  --bs-link-hover-color-rgb: 10, 88, 202;\n  --bs-code-color: #d63384;\n  --bs-highlight-color: #212529;\n  --bs-highlight-bg: #fff3cd;\n  --bs-border-width: 1px;\n  --bs-border-style: solid;\n  --bs-border-color: #dee2e6;\n  --bs-border-color-translucent: rgba(0, 0, 0, 0.175);\n  --bs-border-radius: 0.375rem;\n  --bs-border-radius-sm: 0.25rem;\n  --bs-border-radius-lg: 0.5rem;\n  --bs-border-radius-xl: 1rem;\n  --bs-border-radius-xxl: 2rem;\n  --bs-border-radius-2xl: var(--bs-border-radius-xxl);\n  --bs-border-radius-pill: 50rem;\n  --bs-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);\n  --bs-box-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);\n  --bs-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175);\n  --bs-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075);\n  --bs-focus-ring-width: 0.25rem;\n  --bs-focus-ring-opacity: 0.25;\n  --bs-focus-ring-color: rgba(13, 110, 253, 0.25);\n  --bs-form-valid-color: #198754;\n  --bs-form-valid-border-color: #198754;\n  --bs-form-invalid-color: #dc3545;\n  --bs-form-invalid-border-color: #dc3545;\n}\n\n[data-bs-theme=dark] {\n  color-scheme: dark;\n  --bs-body-color: #dee2e6;\n  --bs-body-color-rgb: 222, 226, 230;\n  --bs-body-bg: #212529;\n  --bs-body-bg-rgb: 33, 37, 41;\n  --bs-emphasis-color: #fff;\n  --bs-emphasis-color-rgb: 255, 255, 255;\n  --bs-secondary-color: rgba(222, 226, 230, 0.75);\n  --bs-secondary-color-rgb: 222, 226, 230;\n  --bs-secondary-bg: #343a40;\n  --bs-secondary-bg-rgb: 52, 58, 64;\n  --bs-tertiary-color: rgba(222, 226, 230, 0.5);\n  --bs-tertiary-color-rgb: 222, 226, 230;\n  --bs-tertiary-bg: #2b3035;\n  --bs-tertiary-bg-rgb: 43, 48, 53;\n  --bs-primary-text-emphasis: #6ea8fe;\n  --bs-secondary-text-emphasis: #a7acb1;\n  --bs-success-text-emphasis: #75b798;\n  --bs-info-text-emphasis: #6edff6;\n  --bs-warning-text-emphasis: #ffda6a;\n  --bs-danger-text-emphasis: #ea868f;\n  --bs-light-text-emphasis: #f8f9fa;\n  --bs-dark-text-emphasis: #dee2e6;\n  --bs-primary-bg-subtle: #031633;\n  --bs-secondary-bg-subtle: #161719;\n  --bs-success-bg-subtle: #051b11;\n  --bs-info-bg-subtle: #032830;\n  --bs-warning-bg-subtle: #332701;\n  --bs-danger-bg-subtle: #2c0b0e;\n  --bs-light-bg-subtle: #343a40;\n  --bs-dark-bg-subtle: #1a1d20;\n  --bs-primary-border-subtle: #084298;\n  --bs-secondary-border-subtle: #41464b;\n  --bs-success-border-subtle: #0f5132;\n  --bs-info-border-subtle: #087990;\n  --bs-warning-border-subtle: #997404;\n  --bs-danger-border-subtle: #842029;\n  --bs-light-border-subtle: #495057;\n  --bs-dark-border-subtle: #343a40;\n  --bs-heading-color: inherit;\n  --bs-link-color: #6ea8fe;\n  --bs-link-hover-color: #8bb9fe;\n  --bs-link-color-rgb: 110, 168, 254;\n  --bs-link-hover-color-rgb: 139, 185, 254;\n  --bs-code-color: #e685b5;\n  --bs-highlight-color: #dee2e6;\n  --bs-highlight-bg: #664d03;\n  --bs-border-color: #495057;\n  --bs-border-color-translucent: rgba(255, 255, 255, 0.15);\n  --bs-form-valid-color: #75b798;\n  --bs-form-valid-border-color: #75b798;\n  --bs-form-invalid-color: #ea868f;\n  --bs-form-invalid-border-color: #ea868f;\n}\n\n.clearfix::after {\n  display: block;\n  clear: both;\n  content: \"\";\n}\n\n.text-bg-primary {\n  color: #fff !important;\n  background-color: RGBA(var(--bs-primary-rgb), var(--bs-bg-opacity, 1)) !important;\n}\n\n.text-bg-secondary {\n  color: #fff !important;\n  background-color: RGBA(var(--bs-secondary-rgb), var(--bs-bg-opacity, 1)) !important;\n}\n\n.text-bg-success {\n  color: #fff !important;\n  background-color: RGBA(var(--bs-success-rgb), var(--bs-bg-opacity, 1)) !important;\n}\n\n.text-bg-info {\n  color: #000 !important;\n  background-color: RGBA(var(--bs-info-rgb), var(--bs-bg-opacity, 1)) !important;\n}\n\n.text-bg-warning {\n  color: #000 !important;\n  background-color: RGBA(var(--bs-warning-rgb), var(--bs-bg-opacity, 1)) !important;\n}\n\n.text-bg-danger {\n  color: #fff !important;\n  background-color: RGBA(var(--bs-danger-rgb), var(--bs-bg-opacity, 1)) !important;\n}\n\n.text-bg-light {\n  color: #000 !important;\n  background-color: RGBA(var(--bs-light-rgb), var(--bs-bg-opacity, 1)) !important;\n}\n\n.text-bg-dark {\n  color: #fff !important;\n  background-color: RGBA(var(--bs-dark-rgb), var(--bs-bg-opacity, 1)) !important;\n}\n\n.link-primary {\n  color: RGBA(var(--bs-primary-rgb), var(--bs-link-opacity, 1)) !important;\n  -webkit-text-decoration-color: RGBA(var(--bs-primary-rgb), var(--bs-link-underline-opacity, 1)) !important;\n  text-decoration-color: RGBA(var(--bs-primary-rgb), var(--bs-link-underline-opacity, 1)) !important;\n}\n.link-primary:hover, .link-primary:focus {\n  color: RGBA(10, 88, 202, var(--bs-link-opacity, 1)) !important;\n  -webkit-text-decoration-color: RGBA(10, 88, 202, var(--bs-link-underline-opacity, 1)) !important;\n  text-decoration-color: RGBA(10, 88, 202, var(--bs-link-underline-opacity, 1)) !important;\n}\n\n.link-secondary {\n  color: RGBA(var(--bs-secondary-rgb), var(--bs-link-opacity, 1)) !important;\n  -webkit-text-decoration-color: RGBA(var(--bs-secondary-rgb), var(--bs-link-underline-opacity, 1)) !important;\n  text-decoration-color: RGBA(var(--bs-secondary-rgb), var(--bs-link-underline-opacity, 1)) !important;\n}\n.link-secondary:hover, .link-secondary:focus {\n  color: RGBA(86, 94, 100, var(--bs-link-opacity, 1)) !important;\n  -webkit-text-decoration-color: RGBA(86, 94, 100, var(--bs-link-underline-opacity, 1)) !important;\n  text-decoration-color: RGBA(86, 94, 100, var(--bs-link-underline-opacity, 1)) !important;\n}\n\n.link-success {\n  color: RGBA(var(--bs-success-rgb), var(--bs-link-opacity, 1)) !important;\n  -webkit-text-decoration-color: RGBA(var(--bs-success-rgb), var(--bs-link-underline-opacity, 1)) !important;\n  text-decoration-color: RGBA(var(--bs-success-rgb), var(--bs-link-underline-opacity, 1)) !important;\n}\n.link-success:hover, .link-success:focus {\n  color: RGBA(20, 108, 67, var(--bs-link-opacity, 1)) !important;\n  -webkit-text-decoration-color: RGBA(20, 108, 67, var(--bs-link-underline-opacity, 1)) !important;\n  text-decoration-color: RGBA(20, 108, 67, var(--bs-link-underline-opacity, 1)) !important;\n}\n\n.link-info {\n  color: RGBA(var(--bs-info-rgb), var(--bs-link-opacity, 1)) !important;\n  -webkit-text-decoration-color: RGBA(var(--bs-info-rgb), var(--bs-link-underline-opacity, 1)) !important;\n  text-decoration-color: RGBA(var(--bs-info-rgb), var(--bs-link-underline-opacity, 1)) !important;\n}\n.link-info:hover, .link-info:focus {\n  color: RGBA(61, 213, 243, var(--bs-link-opacity, 1)) !important;\n  -webkit-text-decoration-color: RGBA(61, 213, 243, var(--bs-link-underline-opacity, 1)) !important;\n  text-decoration-color: RGBA(61, 213, 243, var(--bs-link-underline-opacity, 1)) !important;\n}\n\n.link-warning {\n  color: RGBA(var(--bs-warning-rgb), var(--bs-link-opacity, 1)) !important;\n  -webkit-text-decoration-color: RGBA(var(--bs-warning-rgb), var(--bs-link-underline-opacity, 1)) !important;\n  text-decoration-color: RGBA(var(--bs-warning-rgb), var(--bs-link-underline-opacity, 1)) !important;\n}\n.link-warning:hover, .link-warning:focus {\n  color: RGBA(255, 205, 57, var(--bs-link-opacity, 1)) !important;\n  -webkit-text-decoration-color: RGBA(255, 205, 57, var(--bs-link-underline-opacity, 1)) !important;\n  text-decoration-color: RGBA(255, 205, 57, var(--bs-link-underline-opacity, 1)) !important;\n}\n\n.link-danger {\n  color: RGBA(var(--bs-danger-rgb), var(--bs-link-opacity, 1)) !important;\n  -webkit-text-decoration-color: RGBA(var(--bs-danger-rgb), var(--bs-link-underline-opacity, 1)) !important;\n  text-decoration-color: RGBA(var(--bs-danger-rgb), var(--bs-link-underline-opacity, 1)) !important;\n}\n.link-danger:hover, .link-danger:focus {\n  color: RGBA(176, 42, 55, var(--bs-link-opacity, 1)) !important;\n  -webkit-text-decoration-color: RGBA(176, 42, 55, var(--bs-link-underline-opacity, 1)) !important;\n  text-decoration-color: RGBA(176, 42, 55, var(--bs-link-underline-opacity, 1)) !important;\n}\n\n.link-light {\n  color: RGBA(var(--bs-light-rgb), var(--bs-link-opacity, 1)) !important;\n  -webkit-text-decoration-color: RGBA(var(--bs-light-rgb), var(--bs-link-underline-opacity, 1)) !important;\n  text-decoration-color: RGBA(var(--bs-light-rgb), var(--bs-link-underline-opacity, 1)) !important;\n}\n.link-light:hover, .link-light:focus {\n  color: RGBA(249, 250, 251, var(--bs-link-opacity, 1)) !important;\n  -webkit-text-decoration-color: RGBA(249, 250, 251, var(--bs-link-underline-opacity, 1)) !important;\n  text-decoration-color: RGBA(249, 250, 251, var(--bs-link-underline-opacity, 1)) !important;\n}\n\n.link-dark {\n  color: RGBA(var(--bs-dark-rgb), var(--bs-link-opacity, 1)) !important;\n  -webkit-text-decoration-color: RGBA(var(--bs-dark-rgb), var(--bs-link-underline-opacity, 1)) !important;\n  text-decoration-color: RGBA(var(--bs-dark-rgb), var(--bs-link-underline-opacity, 1)) !important;\n}\n.link-dark:hover, .link-dark:focus {\n  color: RGBA(26, 30, 33, var(--bs-link-opacity, 1)) !important;\n  -webkit-text-decoration-color: RGBA(26, 30, 33, var(--bs-link-underline-opacity, 1)) !important;\n  text-decoration-color: RGBA(26, 30, 33, var(--bs-link-underline-opacity, 1)) !important;\n}\n\n.link-body-emphasis {\n  color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 1)) !important;\n  -webkit-text-decoration-color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 1)) !important;\n  text-decoration-color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 1)) !important;\n}\n.link-body-emphasis:hover, .link-body-emphasis:focus {\n  color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 0.75)) !important;\n  -webkit-text-decoration-color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 0.75)) !important;\n  text-decoration-color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 0.75)) !important;\n}\n\n.focus-ring:focus {\n  outline: 0;\n  box-shadow: var(--bs-focus-ring-x, 0) var(--bs-focus-ring-y, 0) var(--bs-focus-ring-blur, 0) var(--bs-focus-ring-width) var(--bs-focus-ring-color);\n}\n\n.icon-link {\n  display: inline-flex;\n  gap: 0.375rem;\n  align-items: center;\n  -webkit-text-decoration-color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 0.5));\n  text-decoration-color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 0.5));\n  text-underline-offset: 0.25em;\n  -webkit-backface-visibility: hidden;\n  backface-visibility: hidden;\n}\n.icon-link > .bi {\n  flex-shrink: 0;\n  width: 1em;\n  height: 1em;\n  fill: currentcolor;\n  transition: 0.2s ease-in-out transform;\n}\n@media (prefers-reduced-motion: reduce) {\n  .icon-link > .bi {\n    transition: none;\n  }\n}\n\n.icon-link-hover:hover > .bi, .icon-link-hover:focus-visible > .bi {\n  transform: var(--bs-icon-link-transform, translate3d(-0.25em, 0, 0));\n}\n\n.ratio {\n  position: relative;\n  width: 100%;\n}\n.ratio::before {\n  display: block;\n  padding-top: var(--bs-aspect-ratio);\n  content: \"\";\n}\n.ratio > * {\n  position: absolute;\n  top: 0;\n  right: 0;\n  width: 100%;\n  height: 100%;\n}\n\n.ratio-1x1 {\n  --bs-aspect-ratio: 100%;\n}\n\n.ratio-4x3 {\n  --bs-aspect-ratio: 75%;\n}\n\n.ratio-16x9 {\n  --bs-aspect-ratio: 56.25%;\n}\n\n.ratio-21x9 {\n  --bs-aspect-ratio: 42.8571428571%;\n}\n\n.fixed-top {\n  position: fixed;\n  top: 0;\n  left: 0;\n  right: 0;\n  z-index: 1030;\n}\n\n.fixed-bottom {\n  position: fixed;\n  left: 0;\n  bottom: 0;\n  right: 0;\n  z-index: 1030;\n}\n\n.sticky-top {\n  position: -webkit-sticky;\n  position: sticky;\n  top: 0;\n  z-index: 1020;\n}\n\n.sticky-bottom {\n  position: -webkit-sticky;\n  position: sticky;\n  bottom: 0;\n  z-index: 1020;\n}\n\n@media (min-width: 576px) {\n  .sticky-sm-top {\n    position: -webkit-sticky;\n    position: sticky;\n    top: 0;\n    z-index: 1020;\n  }\n  .sticky-sm-bottom {\n    position: -webkit-sticky;\n    position: sticky;\n    bottom: 0;\n    z-index: 1020;\n  }\n}\n@media (min-width: 768px) {\n  .sticky-md-top {\n    position: -webkit-sticky;\n    position: sticky;\n    top: 0;\n    z-index: 1020;\n  }\n  .sticky-md-bottom {\n    position: -webkit-sticky;\n    position: sticky;\n    bottom: 0;\n    z-index: 1020;\n  }\n}\n@media (min-width: 992px) {\n  .sticky-lg-top {\n    position: -webkit-sticky;\n    position: sticky;\n    top: 0;\n    z-index: 1020;\n  }\n  .sticky-lg-bottom {\n    position: -webkit-sticky;\n    position: sticky;\n    bottom: 0;\n    z-index: 1020;\n  }\n}\n@media (min-width: 1200px) {\n  .sticky-xl-top {\n    position: -webkit-sticky;\n    position: sticky;\n    top: 0;\n    z-index: 1020;\n  }\n  .sticky-xl-bottom {\n    position: -webkit-sticky;\n    position: sticky;\n    bottom: 0;\n    z-index: 1020;\n  }\n}\n@media (min-width: 1400px) {\n  .sticky-xxl-top {\n    position: -webkit-sticky;\n    position: sticky;\n    top: 0;\n    z-index: 1020;\n  }\n  .sticky-xxl-bottom {\n    position: -webkit-sticky;\n    position: sticky;\n    bottom: 0;\n    z-index: 1020;\n  }\n}\n.hstack {\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  align-self: stretch;\n}\n\n.vstack {\n  display: flex;\n  flex: 1 1 auto;\n  flex-direction: column;\n  align-self: stretch;\n}\n\n.visually-hidden,\n.visually-hidden-focusable:not(:focus):not(:focus-within) {\n  width: 1px !important;\n  height: 1px !important;\n  padding: 0 !important;\n  margin: -1px !important;\n  overflow: hidden !important;\n  clip: rect(0, 0, 0, 0) !important;\n  white-space: nowrap !important;\n  border: 0 !important;\n}\n.visually-hidden:not(caption),\n.visually-hidden-focusable:not(:focus):not(:focus-within):not(caption) {\n  position: absolute !important;\n}\n.visually-hidden *,\n.visually-hidden-focusable:not(:focus):not(:focus-within) * {\n  overflow: hidden !important;\n}\n\n.stretched-link::after {\n  position: absolute;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  right: 0;\n  z-index: 1;\n  content: \"\";\n}\n\n.text-truncate {\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n\n.vr {\n  display: inline-block;\n  align-self: stretch;\n  width: var(--bs-border-width);\n  min-height: 1em;\n  background-color: currentcolor;\n  opacity: 0.25;\n}\n\n.align-baseline {\n  vertical-align: baseline !important;\n}\n\n.align-top {\n  vertical-align: top !important;\n}\n\n.align-middle {\n  vertical-align: middle !important;\n}\n\n.align-bottom {\n  vertical-align: bottom !important;\n}\n\n.align-text-bottom {\n  vertical-align: text-bottom !important;\n}\n\n.align-text-top {\n  vertical-align: text-top !important;\n}\n\n.float-start {\n  float: right !important;\n}\n\n.float-end {\n  float: left !important;\n}\n\n.float-none {\n  float: none !important;\n}\n\n.object-fit-contain {\n  -o-object-fit: contain !important;\n  object-fit: contain !important;\n}\n\n.object-fit-cover {\n  -o-object-fit: cover !important;\n  object-fit: cover !important;\n}\n\n.object-fit-fill {\n  -o-object-fit: fill !important;\n  object-fit: fill !important;\n}\n\n.object-fit-scale {\n  -o-object-fit: scale-down !important;\n  object-fit: scale-down !important;\n}\n\n.object-fit-none {\n  -o-object-fit: none !important;\n  object-fit: none !important;\n}\n\n.opacity-0 {\n  opacity: 0 !important;\n}\n\n.opacity-25 {\n  opacity: 0.25 !important;\n}\n\n.opacity-50 {\n  opacity: 0.5 !important;\n}\n\n.opacity-75 {\n  opacity: 0.75 !important;\n}\n\n.opacity-100 {\n  opacity: 1 !important;\n}\n\n.overflow-auto {\n  overflow: auto !important;\n}\n\n.overflow-hidden {\n  overflow: hidden !important;\n}\n\n.overflow-visible {\n  overflow: visible !important;\n}\n\n.overflow-scroll {\n  overflow: scroll !important;\n}\n\n.overflow-x-auto {\n  overflow-x: auto !important;\n}\n\n.overflow-x-hidden {\n  overflow-x: hidden !important;\n}\n\n.overflow-x-visible {\n  overflow-x: visible !important;\n}\n\n.overflow-x-scroll {\n  overflow-x: scroll !important;\n}\n\n.overflow-y-auto {\n  overflow-y: auto !important;\n}\n\n.overflow-y-hidden {\n  overflow-y: hidden !important;\n}\n\n.overflow-y-visible {\n  overflow-y: visible !important;\n}\n\n.overflow-y-scroll {\n  overflow-y: scroll !important;\n}\n\n.d-inline {\n  display: inline !important;\n}\n\n.d-inline-block {\n  display: inline-block !important;\n}\n\n.d-block {\n  display: block !important;\n}\n\n.d-grid {\n  display: grid !important;\n}\n\n.d-inline-grid {\n  display: inline-grid !important;\n}\n\n.d-table {\n  display: table !important;\n}\n\n.d-table-row {\n  display: table-row !important;\n}\n\n.d-table-cell {\n  display: table-cell !important;\n}\n\n.d-flex {\n  display: flex !important;\n}\n\n.d-inline-flex {\n  display: inline-flex !important;\n}\n\n.d-none {\n  display: none !important;\n}\n\n.shadow {\n  box-shadow: var(--bs-box-shadow) !important;\n}\n\n.shadow-sm {\n  box-shadow: var(--bs-box-shadow-sm) !important;\n}\n\n.shadow-lg {\n  box-shadow: var(--bs-box-shadow-lg) !important;\n}\n\n.shadow-none {\n  box-shadow: none !important;\n}\n\n.focus-ring-primary {\n  --bs-focus-ring-color: rgba(var(--bs-primary-rgb), var(--bs-focus-ring-opacity));\n}\n\n.focus-ring-secondary {\n  --bs-focus-ring-color: rgba(var(--bs-secondary-rgb), var(--bs-focus-ring-opacity));\n}\n\n.focus-ring-success {\n  --bs-focus-ring-color: rgba(var(--bs-success-rgb), var(--bs-focus-ring-opacity));\n}\n\n.focus-ring-info {\n  --bs-focus-ring-color: rgba(var(--bs-info-rgb), var(--bs-focus-ring-opacity));\n}\n\n.focus-ring-warning {\n  --bs-focus-ring-color: rgba(var(--bs-warning-rgb), var(--bs-focus-ring-opacity));\n}\n\n.focus-ring-danger {\n  --bs-focus-ring-color: rgba(var(--bs-danger-rgb), var(--bs-focus-ring-opacity));\n}\n\n.focus-ring-light {\n  --bs-focus-ring-color: rgba(var(--bs-light-rgb), var(--bs-focus-ring-opacity));\n}\n\n.focus-ring-dark {\n  --bs-focus-ring-color: rgba(var(--bs-dark-rgb), var(--bs-focus-ring-opacity));\n}\n\n.position-static {\n  position: static !important;\n}\n\n.position-relative {\n  position: relative !important;\n}\n\n.position-absolute {\n  position: absolute !important;\n}\n\n.position-fixed {\n  position: fixed !important;\n}\n\n.position-sticky {\n  position: -webkit-sticky !important;\n  position: sticky !important;\n}\n\n.top-0 {\n  top: 0 !important;\n}\n\n.top-50 {\n  top: 50% !important;\n}\n\n.top-100 {\n  top: 100% !important;\n}\n\n.bottom-0 {\n  bottom: 0 !important;\n}\n\n.bottom-50 {\n  bottom: 50% !important;\n}\n\n.bottom-100 {\n  bottom: 100% !important;\n}\n\n.start-0 {\n  right: 0 !important;\n}\n\n.start-50 {\n  right: 50% !important;\n}\n\n.start-100 {\n  right: 100% !important;\n}\n\n.end-0 {\n  left: 0 !important;\n}\n\n.end-50 {\n  left: 50% !important;\n}\n\n.end-100 {\n  left: 100% !important;\n}\n\n.translate-middle {\n  transform: translate(50%, -50%) !important;\n}\n\n.translate-middle-x {\n  transform: translateX(50%) !important;\n}\n\n.translate-middle-y {\n  transform: translateY(-50%) !important;\n}\n\n.border {\n  border: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important;\n}\n\n.border-0 {\n  border: 0 !important;\n}\n\n.border-top {\n  border-top: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important;\n}\n\n.border-top-0 {\n  border-top: 0 !important;\n}\n\n.border-end {\n  border-left: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important;\n}\n\n.border-end-0 {\n  border-left: 0 !important;\n}\n\n.border-bottom {\n  border-bottom: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important;\n}\n\n.border-bottom-0 {\n  border-bottom: 0 !important;\n}\n\n.border-start {\n  border-right: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important;\n}\n\n.border-start-0 {\n  border-right: 0 !important;\n}\n\n.border-primary {\n  --bs-border-opacity: 1;\n  border-color: rgba(var(--bs-primary-rgb), var(--bs-border-opacity)) !important;\n}\n\n.border-secondary {\n  --bs-border-opacity: 1;\n  border-color: rgba(var(--bs-secondary-rgb), var(--bs-border-opacity)) !important;\n}\n\n.border-success {\n  --bs-border-opacity: 1;\n  border-color: rgba(var(--bs-success-rgb), var(--bs-border-opacity)) !important;\n}\n\n.border-info {\n  --bs-border-opacity: 1;\n  border-color: rgba(var(--bs-info-rgb), var(--bs-border-opacity)) !important;\n}\n\n.border-warning {\n  --bs-border-opacity: 1;\n  border-color: rgba(var(--bs-warning-rgb), var(--bs-border-opacity)) !important;\n}\n\n.border-danger {\n  --bs-border-opacity: 1;\n  border-color: rgba(var(--bs-danger-rgb), var(--bs-border-opacity)) !important;\n}\n\n.border-light {\n  --bs-border-opacity: 1;\n  border-color: rgba(var(--bs-light-rgb), var(--bs-border-opacity)) !important;\n}\n\n.border-dark {\n  --bs-border-opacity: 1;\n  border-color: rgba(var(--bs-dark-rgb), var(--bs-border-opacity)) !important;\n}\n\n.border-black {\n  --bs-border-opacity: 1;\n  border-color: rgba(var(--bs-black-rgb), var(--bs-border-opacity)) !important;\n}\n\n.border-white {\n  --bs-border-opacity: 1;\n  border-color: rgba(var(--bs-white-rgb), var(--bs-border-opacity)) !important;\n}\n\n.border-primary-subtle {\n  border-color: var(--bs-primary-border-subtle) !important;\n}\n\n.border-secondary-subtle {\n  border-color: var(--bs-secondary-border-subtle) !important;\n}\n\n.border-success-subtle {\n  border-color: var(--bs-success-border-subtle) !important;\n}\n\n.border-info-subtle {\n  border-color: var(--bs-info-border-subtle) !important;\n}\n\n.border-warning-subtle {\n  border-color: var(--bs-warning-border-subtle) !important;\n}\n\n.border-danger-subtle {\n  border-color: var(--bs-danger-border-subtle) !important;\n}\n\n.border-light-subtle {\n  border-color: var(--bs-light-border-subtle) !important;\n}\n\n.border-dark-subtle {\n  border-color: var(--bs-dark-border-subtle) !important;\n}\n\n.border-1 {\n  border-width: 1px !important;\n}\n\n.border-2 {\n  border-width: 2px !important;\n}\n\n.border-3 {\n  border-width: 3px !important;\n}\n\n.border-4 {\n  border-width: 4px !important;\n}\n\n.border-5 {\n  border-width: 5px !important;\n}\n\n.border-opacity-10 {\n  --bs-border-opacity: 0.1;\n}\n\n.border-opacity-25 {\n  --bs-border-opacity: 0.25;\n}\n\n.border-opacity-50 {\n  --bs-border-opacity: 0.5;\n}\n\n.border-opacity-75 {\n  --bs-border-opacity: 0.75;\n}\n\n.border-opacity-100 {\n  --bs-border-opacity: 1;\n}\n\n.w-25 {\n  width: 25% !important;\n}\n\n.w-50 {\n  width: 50% !important;\n}\n\n.w-75 {\n  width: 75% !important;\n}\n\n.w-100 {\n  width: 100% !important;\n}\n\n.w-auto {\n  width: auto !important;\n}\n\n.mw-100 {\n  max-width: 100% !important;\n}\n\n.vw-100 {\n  width: 100vw !important;\n}\n\n.min-vw-100 {\n  min-width: 100vw !important;\n}\n\n.h-25 {\n  height: 25% !important;\n}\n\n.h-50 {\n  height: 50% !important;\n}\n\n.h-75 {\n  height: 75% !important;\n}\n\n.h-100 {\n  height: 100% !important;\n}\n\n.h-auto {\n  height: auto !important;\n}\n\n.mh-100 {\n  max-height: 100% !important;\n}\n\n.vh-100 {\n  height: 100vh !important;\n}\n\n.min-vh-100 {\n  min-height: 100vh !important;\n}\n\n.flex-fill {\n  flex: 1 1 auto !important;\n}\n\n.flex-row {\n  flex-direction: row !important;\n}\n\n.flex-column {\n  flex-direction: column !important;\n}\n\n.flex-row-reverse {\n  flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n  flex-direction: column-reverse !important;\n}\n\n.flex-grow-0 {\n  flex-grow: 0 !important;\n}\n\n.flex-grow-1 {\n  flex-grow: 1 !important;\n}\n\n.flex-shrink-0 {\n  flex-shrink: 0 !important;\n}\n\n.flex-shrink-1 {\n  flex-shrink: 1 !important;\n}\n\n.flex-wrap {\n  flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n  flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n  flex-wrap: wrap-reverse !important;\n}\n\n.justify-content-start {\n  justify-content: flex-start !important;\n}\n\n.justify-content-end {\n  justify-content: flex-end !important;\n}\n\n.justify-content-center {\n  justify-content: center !important;\n}\n\n.justify-content-between {\n  justify-content: space-between !important;\n}\n\n.justify-content-around {\n  justify-content: space-around !important;\n}\n\n.justify-content-evenly {\n  justify-content: space-evenly !important;\n}\n\n.align-items-start {\n  align-items: flex-start !important;\n}\n\n.align-items-end {\n  align-items: flex-end !important;\n}\n\n.align-items-center {\n  align-items: center !important;\n}\n\n.align-items-baseline {\n  align-items: baseline !important;\n}\n\n.align-items-stretch {\n  align-items: stretch !important;\n}\n\n.align-content-start {\n  align-content: flex-start !important;\n}\n\n.align-content-end {\n  align-content: flex-end !important;\n}\n\n.align-content-center {\n  align-content: center !important;\n}\n\n.align-content-between {\n  align-content: space-between !important;\n}\n\n.align-content-around {\n  align-content: space-around !important;\n}\n\n.align-content-stretch {\n  align-content: stretch !important;\n}\n\n.align-self-auto {\n  align-self: auto !important;\n}\n\n.align-self-start {\n  align-self: flex-start !important;\n}\n\n.align-self-end {\n  align-self: flex-end !important;\n}\n\n.align-self-center {\n  align-self: center !important;\n}\n\n.align-self-baseline {\n  align-self: baseline !important;\n}\n\n.align-self-stretch {\n  align-self: stretch !important;\n}\n\n.order-first {\n  order: -1 !important;\n}\n\n.order-0 {\n  order: 0 !important;\n}\n\n.order-1 {\n  order: 1 !important;\n}\n\n.order-2 {\n  order: 2 !important;\n}\n\n.order-3 {\n  order: 3 !important;\n}\n\n.order-4 {\n  order: 4 !important;\n}\n\n.order-5 {\n  order: 5 !important;\n}\n\n.order-last {\n  order: 6 !important;\n}\n\n.m-0 {\n  margin: 0 !important;\n}\n\n.m-1 {\n  margin: 0.25rem !important;\n}\n\n.m-2 {\n  margin: 0.5rem !important;\n}\n\n.m-3 {\n  margin: 1rem !important;\n}\n\n.m-4 {\n  margin: 1.5rem !important;\n}\n\n.m-5 {\n  margin: 3rem !important;\n}\n\n.m-auto {\n  margin: auto !important;\n}\n\n.mx-0 {\n  margin-left: 0 !important;\n  margin-right: 0 !important;\n}\n\n.mx-1 {\n  margin-left: 0.25rem !important;\n  margin-right: 0.25rem !important;\n}\n\n.mx-2 {\n  margin-left: 0.5rem !important;\n  margin-right: 0.5rem !important;\n}\n\n.mx-3 {\n  margin-left: 1rem !important;\n  margin-right: 1rem !important;\n}\n\n.mx-4 {\n  margin-left: 1.5rem !important;\n  margin-right: 1.5rem !important;\n}\n\n.mx-5 {\n  margin-left: 3rem !important;\n  margin-right: 3rem !important;\n}\n\n.mx-auto {\n  margin-left: auto !important;\n  margin-right: auto !important;\n}\n\n.my-0 {\n  margin-top: 0 !important;\n  margin-bottom: 0 !important;\n}\n\n.my-1 {\n  margin-top: 0.25rem !important;\n  margin-bottom: 0.25rem !important;\n}\n\n.my-2 {\n  margin-top: 0.5rem !important;\n  margin-bottom: 0.5rem !important;\n}\n\n.my-3 {\n  margin-top: 1rem !important;\n  margin-bottom: 1rem !important;\n}\n\n.my-4 {\n  margin-top: 1.5rem !important;\n  margin-bottom: 1.5rem !important;\n}\n\n.my-5 {\n  margin-top: 3rem !important;\n  margin-bottom: 3rem !important;\n}\n\n.my-auto {\n  margin-top: auto !important;\n  margin-bottom: auto !important;\n}\n\n.mt-0 {\n  margin-top: 0 !important;\n}\n\n.mt-1 {\n  margin-top: 0.25rem !important;\n}\n\n.mt-2 {\n  margin-top: 0.5rem !important;\n}\n\n.mt-3 {\n  margin-top: 1rem !important;\n}\n\n.mt-4 {\n  margin-top: 1.5rem !important;\n}\n\n.mt-5 {\n  margin-top: 3rem !important;\n}\n\n.mt-auto {\n  margin-top: auto !important;\n}\n\n.me-0 {\n  margin-left: 0 !important;\n}\n\n.me-1 {\n  margin-left: 0.25rem !important;\n}\n\n.me-2 {\n  margin-left: 0.5rem !important;\n}\n\n.me-3 {\n  margin-left: 1rem !important;\n}\n\n.me-4 {\n  margin-left: 1.5rem !important;\n}\n\n.me-5 {\n  margin-left: 3rem !important;\n}\n\n.me-auto {\n  margin-left: auto !important;\n}\n\n.mb-0 {\n  margin-bottom: 0 !important;\n}\n\n.mb-1 {\n  margin-bottom: 0.25rem !important;\n}\n\n.mb-2 {\n  margin-bottom: 0.5rem !important;\n}\n\n.mb-3 {\n  margin-bottom: 1rem !important;\n}\n\n.mb-4 {\n  margin-bottom: 1.5rem !important;\n}\n\n.mb-5 {\n  margin-bottom: 3rem !important;\n}\n\n.mb-auto {\n  margin-bottom: auto !important;\n}\n\n.ms-0 {\n  margin-right: 0 !important;\n}\n\n.ms-1 {\n  margin-right: 0.25rem !important;\n}\n\n.ms-2 {\n  margin-right: 0.5rem !important;\n}\n\n.ms-3 {\n  margin-right: 1rem !important;\n}\n\n.ms-4 {\n  margin-right: 1.5rem !important;\n}\n\n.ms-5 {\n  margin-right: 3rem !important;\n}\n\n.ms-auto {\n  margin-right: auto !important;\n}\n\n.p-0 {\n  padding: 0 !important;\n}\n\n.p-1 {\n  padding: 0.25rem !important;\n}\n\n.p-2 {\n  padding: 0.5rem !important;\n}\n\n.p-3 {\n  padding: 1rem !important;\n}\n\n.p-4 {\n  padding: 1.5rem !important;\n}\n\n.p-5 {\n  padding: 3rem !important;\n}\n\n.px-0 {\n  padding-left: 0 !important;\n  padding-right: 0 !important;\n}\n\n.px-1 {\n  padding-left: 0.25rem !important;\n  padding-right: 0.25rem !important;\n}\n\n.px-2 {\n  padding-left: 0.5rem !important;\n  padding-right: 0.5rem !important;\n}\n\n.px-3 {\n  padding-left: 1rem !important;\n  padding-right: 1rem !important;\n}\n\n.px-4 {\n  padding-left: 1.5rem !important;\n  padding-right: 1.5rem !important;\n}\n\n.px-5 {\n  padding-left: 3rem !important;\n  padding-right: 3rem !important;\n}\n\n.py-0 {\n  padding-top: 0 !important;\n  padding-bottom: 0 !important;\n}\n\n.py-1 {\n  padding-top: 0.25rem !important;\n  padding-bottom: 0.25rem !important;\n}\n\n.py-2 {\n  padding-top: 0.5rem !important;\n  padding-bottom: 0.5rem !important;\n}\n\n.py-3 {\n  padding-top: 1rem !important;\n  padding-bottom: 1rem !important;\n}\n\n.py-4 {\n  padding-top: 1.5rem !important;\n  padding-bottom: 1.5rem !important;\n}\n\n.py-5 {\n  padding-top: 3rem !important;\n  padding-bottom: 3rem !important;\n}\n\n.pt-0 {\n  padding-top: 0 !important;\n}\n\n.pt-1 {\n  padding-top: 0.25rem !important;\n}\n\n.pt-2 {\n  padding-top: 0.5rem !important;\n}\n\n.pt-3 {\n  padding-top: 1rem !important;\n}\n\n.pt-4 {\n  padding-top: 1.5rem !important;\n}\n\n.pt-5 {\n  padding-top: 3rem !important;\n}\n\n.pe-0 {\n  padding-left: 0 !important;\n}\n\n.pe-1 {\n  padding-left: 0.25rem !important;\n}\n\n.pe-2 {\n  padding-left: 0.5rem !important;\n}\n\n.pe-3 {\n  padding-left: 1rem !important;\n}\n\n.pe-4 {\n  padding-left: 1.5rem !important;\n}\n\n.pe-5 {\n  padding-left: 3rem !important;\n}\n\n.pb-0 {\n  padding-bottom: 0 !important;\n}\n\n.pb-1 {\n  padding-bottom: 0.25rem !important;\n}\n\n.pb-2 {\n  padding-bottom: 0.5rem !important;\n}\n\n.pb-3 {\n  padding-bottom: 1rem !important;\n}\n\n.pb-4 {\n  padding-bottom: 1.5rem !important;\n}\n\n.pb-5 {\n  padding-bottom: 3rem !important;\n}\n\n.ps-0 {\n  padding-right: 0 !important;\n}\n\n.ps-1 {\n  padding-right: 0.25rem !important;\n}\n\n.ps-2 {\n  padding-right: 0.5rem !important;\n}\n\n.ps-3 {\n  padding-right: 1rem !important;\n}\n\n.ps-4 {\n  padding-right: 1.5rem !important;\n}\n\n.ps-5 {\n  padding-right: 3rem !important;\n}\n\n.gap-0 {\n  gap: 0 !important;\n}\n\n.gap-1 {\n  gap: 0.25rem !important;\n}\n\n.gap-2 {\n  gap: 0.5rem !important;\n}\n\n.gap-3 {\n  gap: 1rem !important;\n}\n\n.gap-4 {\n  gap: 1.5rem !important;\n}\n\n.gap-5 {\n  gap: 3rem !important;\n}\n\n.row-gap-0 {\n  row-gap: 0 !important;\n}\n\n.row-gap-1 {\n  row-gap: 0.25rem !important;\n}\n\n.row-gap-2 {\n  row-gap: 0.5rem !important;\n}\n\n.row-gap-3 {\n  row-gap: 1rem !important;\n}\n\n.row-gap-4 {\n  row-gap: 1.5rem !important;\n}\n\n.row-gap-5 {\n  row-gap: 3rem !important;\n}\n\n.column-gap-0 {\n  -moz-column-gap: 0 !important;\n  column-gap: 0 !important;\n}\n\n.column-gap-1 {\n  -moz-column-gap: 0.25rem !important;\n  column-gap: 0.25rem !important;\n}\n\n.column-gap-2 {\n  -moz-column-gap: 0.5rem !important;\n  column-gap: 0.5rem !important;\n}\n\n.column-gap-3 {\n  -moz-column-gap: 1rem !important;\n  column-gap: 1rem !important;\n}\n\n.column-gap-4 {\n  -moz-column-gap: 1.5rem !important;\n  column-gap: 1.5rem !important;\n}\n\n.column-gap-5 {\n  -moz-column-gap: 3rem !important;\n  column-gap: 3rem !important;\n}\n\n.font-monospace {\n  font-family: var(--bs-font-monospace) !important;\n}\n\n.fs-1 {\n  font-size: calc(1.375rem + 1.5vw) !important;\n}\n\n.fs-2 {\n  font-size: calc(1.325rem + 0.9vw) !important;\n}\n\n.fs-3 {\n  font-size: calc(1.3rem + 0.6vw) !important;\n}\n\n.fs-4 {\n  font-size: calc(1.275rem + 0.3vw) !important;\n}\n\n.fs-5 {\n  font-size: 1.25rem !important;\n}\n\n.fs-6 {\n  font-size: 1rem !important;\n}\n\n.fst-italic {\n  font-style: italic !important;\n}\n\n.fst-normal {\n  font-style: normal !important;\n}\n\n.fw-lighter {\n  font-weight: lighter !important;\n}\n\n.fw-light {\n  font-weight: 300 !important;\n}\n\n.fw-normal {\n  font-weight: 400 !important;\n}\n\n.fw-medium {\n  font-weight: 500 !important;\n}\n\n.fw-semibold {\n  font-weight: 600 !important;\n}\n\n.fw-bold {\n  font-weight: 700 !important;\n}\n\n.fw-bolder {\n  font-weight: bolder !important;\n}\n\n.lh-1 {\n  line-height: 1 !important;\n}\n\n.lh-sm {\n  line-height: 1.25 !important;\n}\n\n.lh-base {\n  line-height: 1.5 !important;\n}\n\n.lh-lg {\n  line-height: 2 !important;\n}\n\n.text-start {\n  text-align: right !important;\n}\n\n.text-end {\n  text-align: left !important;\n}\n\n.text-center {\n  text-align: center !important;\n}\n\n.text-decoration-none {\n  text-decoration: none !important;\n}\n\n.text-decoration-underline {\n  text-decoration: underline !important;\n}\n\n.text-decoration-line-through {\n  text-decoration: line-through !important;\n}\n\n.text-lowercase {\n  text-transform: lowercase !important;\n}\n\n.text-uppercase {\n  text-transform: uppercase !important;\n}\n\n.text-capitalize {\n  text-transform: capitalize !important;\n}\n\n.text-wrap {\n  white-space: normal !important;\n}\n\n.text-nowrap {\n  white-space: nowrap !important;\n}\n.text-primary {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-primary-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-secondary {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-secondary-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-success {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-success-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-info {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-info-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-warning {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-warning-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-danger {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-danger-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-light {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-light-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-dark {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-dark-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-black {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-black-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-white {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-white-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-body {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-body-color-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-muted {\n  --bs-text-opacity: 1;\n  color: var(--bs-secondary-color) !important;\n}\n\n.text-black-50 {\n  --bs-text-opacity: 1;\n  color: rgba(0, 0, 0, 0.5) !important;\n}\n\n.text-white-50 {\n  --bs-text-opacity: 1;\n  color: rgba(255, 255, 255, 0.5) !important;\n}\n\n.text-body-secondary {\n  --bs-text-opacity: 1;\n  color: var(--bs-secondary-color) !important;\n}\n\n.text-body-tertiary {\n  --bs-text-opacity: 1;\n  color: var(--bs-tertiary-color) !important;\n}\n\n.text-body-emphasis {\n  --bs-text-opacity: 1;\n  color: var(--bs-emphasis-color) !important;\n}\n\n.text-reset {\n  --bs-text-opacity: 1;\n  color: inherit !important;\n}\n\n.text-opacity-25 {\n  --bs-text-opacity: 0.25;\n}\n\n.text-opacity-50 {\n  --bs-text-opacity: 0.5;\n}\n\n.text-opacity-75 {\n  --bs-text-opacity: 0.75;\n}\n\n.text-opacity-100 {\n  --bs-text-opacity: 1;\n}\n\n.text-primary-emphasis {\n  color: var(--bs-primary-text-emphasis) !important;\n}\n\n.text-secondary-emphasis {\n  color: var(--bs-secondary-text-emphasis) !important;\n}\n\n.text-success-emphasis {\n  color: var(--bs-success-text-emphasis) !important;\n}\n\n.text-info-emphasis {\n  color: var(--bs-info-text-emphasis) !important;\n}\n\n.text-warning-emphasis {\n  color: var(--bs-warning-text-emphasis) !important;\n}\n\n.text-danger-emphasis {\n  color: var(--bs-danger-text-emphasis) !important;\n}\n\n.text-light-emphasis {\n  color: var(--bs-light-text-emphasis) !important;\n}\n\n.text-dark-emphasis {\n  color: var(--bs-dark-text-emphasis) !important;\n}\n\n.link-opacity-10 {\n  --bs-link-opacity: 0.1;\n}\n\n.link-opacity-10-hover:hover {\n  --bs-link-opacity: 0.1;\n}\n\n.link-opacity-25 {\n  --bs-link-opacity: 0.25;\n}\n\n.link-opacity-25-hover:hover {\n  --bs-link-opacity: 0.25;\n}\n\n.link-opacity-50 {\n  --bs-link-opacity: 0.5;\n}\n\n.link-opacity-50-hover:hover {\n  --bs-link-opacity: 0.5;\n}\n\n.link-opacity-75 {\n  --bs-link-opacity: 0.75;\n}\n\n.link-opacity-75-hover:hover {\n  --bs-link-opacity: 0.75;\n}\n\n.link-opacity-100 {\n  --bs-link-opacity: 1;\n}\n\n.link-opacity-100-hover:hover {\n  --bs-link-opacity: 1;\n}\n\n.link-offset-1 {\n  text-underline-offset: 0.125em !important;\n}\n\n.link-offset-1-hover:hover {\n  text-underline-offset: 0.125em !important;\n}\n\n.link-offset-2 {\n  text-underline-offset: 0.25em !important;\n}\n\n.link-offset-2-hover:hover {\n  text-underline-offset: 0.25em !important;\n}\n\n.link-offset-3 {\n  text-underline-offset: 0.375em !important;\n}\n\n.link-offset-3-hover:hover {\n  text-underline-offset: 0.375em !important;\n}\n\n.link-underline-primary {\n  --bs-link-underline-opacity: 1;\n  -webkit-text-decoration-color: rgba(var(--bs-primary-rgb), var(--bs-link-underline-opacity)) !important;\n  text-decoration-color: rgba(var(--bs-primary-rgb), var(--bs-link-underline-opacity)) !important;\n}\n\n.link-underline-secondary {\n  --bs-link-underline-opacity: 1;\n  -webkit-text-decoration-color: rgba(var(--bs-secondary-rgb), var(--bs-link-underline-opacity)) !important;\n  text-decoration-color: rgba(var(--bs-secondary-rgb), var(--bs-link-underline-opacity)) !important;\n}\n\n.link-underline-success {\n  --bs-link-underline-opacity: 1;\n  -webkit-text-decoration-color: rgba(var(--bs-success-rgb), var(--bs-link-underline-opacity)) !important;\n  text-decoration-color: rgba(var(--bs-success-rgb), var(--bs-link-underline-opacity)) !important;\n}\n\n.link-underline-info {\n  --bs-link-underline-opacity: 1;\n  -webkit-text-decoration-color: rgba(var(--bs-info-rgb), var(--bs-link-underline-opacity)) !important;\n  text-decoration-color: rgba(var(--bs-info-rgb), var(--bs-link-underline-opacity)) !important;\n}\n\n.link-underline-warning {\n  --bs-link-underline-opacity: 1;\n  -webkit-text-decoration-color: rgba(var(--bs-warning-rgb), var(--bs-link-underline-opacity)) !important;\n  text-decoration-color: rgba(var(--bs-warning-rgb), var(--bs-link-underline-opacity)) !important;\n}\n\n.link-underline-danger {\n  --bs-link-underline-opacity: 1;\n  -webkit-text-decoration-color: rgba(var(--bs-danger-rgb), var(--bs-link-underline-opacity)) !important;\n  text-decoration-color: rgba(var(--bs-danger-rgb), var(--bs-link-underline-opacity)) !important;\n}\n\n.link-underline-light {\n  --bs-link-underline-opacity: 1;\n  -webkit-text-decoration-color: rgba(var(--bs-light-rgb), var(--bs-link-underline-opacity)) !important;\n  text-decoration-color: rgba(var(--bs-light-rgb), var(--bs-link-underline-opacity)) !important;\n}\n\n.link-underline-dark {\n  --bs-link-underline-opacity: 1;\n  -webkit-text-decoration-color: rgba(var(--bs-dark-rgb), var(--bs-link-underline-opacity)) !important;\n  text-decoration-color: rgba(var(--bs-dark-rgb), var(--bs-link-underline-opacity)) !important;\n}\n\n.link-underline {\n  --bs-link-underline-opacity: 1;\n  -webkit-text-decoration-color: rgba(var(--bs-link-color-rgb), var(--bs-link-underline-opacity, 1)) !important;\n  text-decoration-color: rgba(var(--bs-link-color-rgb), var(--bs-link-underline-opacity, 1)) !important;\n}\n\n.link-underline-opacity-0 {\n  --bs-link-underline-opacity: 0;\n}\n\n.link-underline-opacity-0-hover:hover {\n  --bs-link-underline-opacity: 0;\n}\n\n.link-underline-opacity-10 {\n  --bs-link-underline-opacity: 0.1;\n}\n\n.link-underline-opacity-10-hover:hover {\n  --bs-link-underline-opacity: 0.1;\n}\n\n.link-underline-opacity-25 {\n  --bs-link-underline-opacity: 0.25;\n}\n\n.link-underline-opacity-25-hover:hover {\n  --bs-link-underline-opacity: 0.25;\n}\n\n.link-underline-opacity-50 {\n  --bs-link-underline-opacity: 0.5;\n}\n\n.link-underline-opacity-50-hover:hover {\n  --bs-link-underline-opacity: 0.5;\n}\n\n.link-underline-opacity-75 {\n  --bs-link-underline-opacity: 0.75;\n}\n\n.link-underline-opacity-75-hover:hover {\n  --bs-link-underline-opacity: 0.75;\n}\n\n.link-underline-opacity-100 {\n  --bs-link-underline-opacity: 1;\n}\n\n.link-underline-opacity-100-hover:hover {\n  --bs-link-underline-opacity: 1;\n}\n\n.bg-primary {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-primary-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-secondary {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-secondary-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-success {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-success-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-info {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-info-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-warning {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-warning-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-danger {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-danger-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-light {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-light-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-dark {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-dark-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-black {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-black-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-white {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-white-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-body {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-body-bg-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-transparent {\n  --bs-bg-opacity: 1;\n  background-color: transparent !important;\n}\n\n.bg-body-secondary {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-secondary-bg-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-body-tertiary {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-tertiary-bg-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-opacity-10 {\n  --bs-bg-opacity: 0.1;\n}\n\n.bg-opacity-25 {\n  --bs-bg-opacity: 0.25;\n}\n\n.bg-opacity-50 {\n  --bs-bg-opacity: 0.5;\n}\n\n.bg-opacity-75 {\n  --bs-bg-opacity: 0.75;\n}\n\n.bg-opacity-100 {\n  --bs-bg-opacity: 1;\n}\n\n.bg-primary-subtle {\n  background-color: var(--bs-primary-bg-subtle) !important;\n}\n\n.bg-secondary-subtle {\n  background-color: var(--bs-secondary-bg-subtle) !important;\n}\n\n.bg-success-subtle {\n  background-color: var(--bs-success-bg-subtle) !important;\n}\n\n.bg-info-subtle {\n  background-color: var(--bs-info-bg-subtle) !important;\n}\n\n.bg-warning-subtle {\n  background-color: var(--bs-warning-bg-subtle) !important;\n}\n\n.bg-danger-subtle {\n  background-color: var(--bs-danger-bg-subtle) !important;\n}\n\n.bg-light-subtle {\n  background-color: var(--bs-light-bg-subtle) !important;\n}\n\n.bg-dark-subtle {\n  background-color: var(--bs-dark-bg-subtle) !important;\n}\n\n.bg-gradient {\n  background-image: var(--bs-gradient) !important;\n}\n\n.user-select-all {\n  -webkit-user-select: all !important;\n  -moz-user-select: all !important;\n  user-select: all !important;\n}\n\n.user-select-auto {\n  -webkit-user-select: auto !important;\n  -moz-user-select: auto !important;\n  user-select: auto !important;\n}\n\n.user-select-none {\n  -webkit-user-select: none !important;\n  -moz-user-select: none !important;\n  user-select: none !important;\n}\n\n.pe-none {\n  pointer-events: none !important;\n}\n\n.pe-auto {\n  pointer-events: auto !important;\n}\n\n.rounded {\n  border-radius: var(--bs-border-radius) !important;\n}\n\n.rounded-0 {\n  border-radius: 0 !important;\n}\n\n.rounded-1 {\n  border-radius: var(--bs-border-radius-sm) !important;\n}\n\n.rounded-2 {\n  border-radius: var(--bs-border-radius) !important;\n}\n\n.rounded-3 {\n  border-radius: var(--bs-border-radius-lg) !important;\n}\n\n.rounded-4 {\n  border-radius: var(--bs-border-radius-xl) !important;\n}\n\n.rounded-5 {\n  border-radius: var(--bs-border-radius-xxl) !important;\n}\n\n.rounded-circle {\n  border-radius: 50% !important;\n}\n\n.rounded-pill {\n  border-radius: var(--bs-border-radius-pill) !important;\n}\n\n.rounded-top {\n  border-top-right-radius: var(--bs-border-radius) !important;\n  border-top-left-radius: var(--bs-border-radius) !important;\n}\n\n.rounded-top-0 {\n  border-top-right-radius: 0 !important;\n  border-top-left-radius: 0 !important;\n}\n\n.rounded-top-1 {\n  border-top-right-radius: var(--bs-border-radius-sm) !important;\n  border-top-left-radius: var(--bs-border-radius-sm) !important;\n}\n\n.rounded-top-2 {\n  border-top-right-radius: var(--bs-border-radius) !important;\n  border-top-left-radius: var(--bs-border-radius) !important;\n}\n\n.rounded-top-3 {\n  border-top-right-radius: var(--bs-border-radius-lg) !important;\n  border-top-left-radius: var(--bs-border-radius-lg) !important;\n}\n\n.rounded-top-4 {\n  border-top-right-radius: var(--bs-border-radius-xl) !important;\n  border-top-left-radius: var(--bs-border-radius-xl) !important;\n}\n\n.rounded-top-5 {\n  border-top-right-radius: var(--bs-border-radius-xxl) !important;\n  border-top-left-radius: var(--bs-border-radius-xxl) !important;\n}\n\n.rounded-top-circle {\n  border-top-right-radius: 50% !important;\n  border-top-left-radius: 50% !important;\n}\n\n.rounded-top-pill {\n  border-top-right-radius: var(--bs-border-radius-pill) !important;\n  border-top-left-radius: var(--bs-border-radius-pill) !important;\n}\n\n.rounded-end {\n  border-top-left-radius: var(--bs-border-radius) !important;\n  border-bottom-left-radius: var(--bs-border-radius) !important;\n}\n\n.rounded-end-0 {\n  border-top-left-radius: 0 !important;\n  border-bottom-left-radius: 0 !important;\n}\n\n.rounded-end-1 {\n  border-top-left-radius: var(--bs-border-radius-sm) !important;\n  border-bottom-left-radius: var(--bs-border-radius-sm) !important;\n}\n\n.rounded-end-2 {\n  border-top-left-radius: var(--bs-border-radius) !important;\n  border-bottom-left-radius: var(--bs-border-radius) !important;\n}\n\n.rounded-end-3 {\n  border-top-left-radius: var(--bs-border-radius-lg) !important;\n  border-bottom-left-radius: var(--bs-border-radius-lg) !important;\n}\n\n.rounded-end-4 {\n  border-top-left-radius: var(--bs-border-radius-xl) !important;\n  border-bottom-left-radius: var(--bs-border-radius-xl) !important;\n}\n\n.rounded-end-5 {\n  border-top-left-radius: var(--bs-border-radius-xxl) !important;\n  border-bottom-left-radius: var(--bs-border-radius-xxl) !important;\n}\n\n.rounded-end-circle {\n  border-top-left-radius: 50% !important;\n  border-bottom-left-radius: 50% !important;\n}\n\n.rounded-end-pill {\n  border-top-left-radius: var(--bs-border-radius-pill) !important;\n  border-bottom-left-radius: var(--bs-border-radius-pill) !important;\n}\n\n.rounded-bottom {\n  border-bottom-left-radius: var(--bs-border-radius) !important;\n  border-bottom-right-radius: var(--bs-border-radius) !important;\n}\n\n.rounded-bottom-0 {\n  border-bottom-left-radius: 0 !important;\n  border-bottom-right-radius: 0 !important;\n}\n\n.rounded-bottom-1 {\n  border-bottom-left-radius: var(--bs-border-radius-sm) !important;\n  border-bottom-right-radius: var(--bs-border-radius-sm) !important;\n}\n\n.rounded-bottom-2 {\n  border-bottom-left-radius: var(--bs-border-radius) !important;\n  border-bottom-right-radius: var(--bs-border-radius) !important;\n}\n\n.rounded-bottom-3 {\n  border-bottom-left-radius: var(--bs-border-radius-lg) !important;\n  border-bottom-right-radius: var(--bs-border-radius-lg) !important;\n}\n\n.rounded-bottom-4 {\n  border-bottom-left-radius: var(--bs-border-radius-xl) !important;\n  border-bottom-right-radius: var(--bs-border-radius-xl) !important;\n}\n\n.rounded-bottom-5 {\n  border-bottom-left-radius: var(--bs-border-radius-xxl) !important;\n  border-bottom-right-radius: var(--bs-border-radius-xxl) !important;\n}\n\n.rounded-bottom-circle {\n  border-bottom-left-radius: 50% !important;\n  border-bottom-right-radius: 50% !important;\n}\n\n.rounded-bottom-pill {\n  border-bottom-left-radius: var(--bs-border-radius-pill) !important;\n  border-bottom-right-radius: var(--bs-border-radius-pill) !important;\n}\n\n.rounded-start {\n  border-bottom-right-radius: var(--bs-border-radius) !important;\n  border-top-right-radius: var(--bs-border-radius) !important;\n}\n\n.rounded-start-0 {\n  border-bottom-right-radius: 0 !important;\n  border-top-right-radius: 0 !important;\n}\n\n.rounded-start-1 {\n  border-bottom-right-radius: var(--bs-border-radius-sm) !important;\n  border-top-right-radius: var(--bs-border-radius-sm) !important;\n}\n\n.rounded-start-2 {\n  border-bottom-right-radius: var(--bs-border-radius) !important;\n  border-top-right-radius: var(--bs-border-radius) !important;\n}\n\n.rounded-start-3 {\n  border-bottom-right-radius: var(--bs-border-radius-lg) !important;\n  border-top-right-radius: var(--bs-border-radius-lg) !important;\n}\n\n.rounded-start-4 {\n  border-bottom-right-radius: var(--bs-border-radius-xl) !important;\n  border-top-right-radius: var(--bs-border-radius-xl) !important;\n}\n\n.rounded-start-5 {\n  border-bottom-right-radius: var(--bs-border-radius-xxl) !important;\n  border-top-right-radius: var(--bs-border-radius-xxl) !important;\n}\n\n.rounded-start-circle {\n  border-bottom-right-radius: 50% !important;\n  border-top-right-radius: 50% !important;\n}\n\n.rounded-start-pill {\n  border-bottom-right-radius: var(--bs-border-radius-pill) !important;\n  border-top-right-radius: var(--bs-border-radius-pill) !important;\n}\n\n.visible {\n  visibility: visible !important;\n}\n\n.invisible {\n  visibility: hidden !important;\n}\n\n.z-n1 {\n  z-index: -1 !important;\n}\n\n.z-0 {\n  z-index: 0 !important;\n}\n\n.z-1 {\n  z-index: 1 !important;\n}\n\n.z-2 {\n  z-index: 2 !important;\n}\n\n.z-3 {\n  z-index: 3 !important;\n}\n\n@media (min-width: 576px) {\n  .float-sm-start {\n    float: right !important;\n  }\n  .float-sm-end {\n    float: left !important;\n  }\n  .float-sm-none {\n    float: none !important;\n  }\n  .object-fit-sm-contain {\n    -o-object-fit: contain !important;\n    object-fit: contain !important;\n  }\n  .object-fit-sm-cover {\n    -o-object-fit: cover !important;\n    object-fit: cover !important;\n  }\n  .object-fit-sm-fill {\n    -o-object-fit: fill !important;\n    object-fit: fill !important;\n  }\n  .object-fit-sm-scale {\n    -o-object-fit: scale-down !important;\n    object-fit: scale-down !important;\n  }\n  .object-fit-sm-none {\n    -o-object-fit: none !important;\n    object-fit: none !important;\n  }\n  .d-sm-inline {\n    display: inline !important;\n  }\n  .d-sm-inline-block {\n    display: inline-block !important;\n  }\n  .d-sm-block {\n    display: block !important;\n  }\n  .d-sm-grid {\n    display: grid !important;\n  }\n  .d-sm-inline-grid {\n    display: inline-grid !important;\n  }\n  .d-sm-table {\n    display: table !important;\n  }\n  .d-sm-table-row {\n    display: table-row !important;\n  }\n  .d-sm-table-cell {\n    display: table-cell !important;\n  }\n  .d-sm-flex {\n    display: flex !important;\n  }\n  .d-sm-inline-flex {\n    display: inline-flex !important;\n  }\n  .d-sm-none {\n    display: none !important;\n  }\n  .flex-sm-fill {\n    flex: 1 1 auto !important;\n  }\n  .flex-sm-row {\n    flex-direction: row !important;\n  }\n  .flex-sm-column {\n    flex-direction: column !important;\n  }\n  .flex-sm-row-reverse {\n    flex-direction: row-reverse !important;\n  }\n  .flex-sm-column-reverse {\n    flex-direction: column-reverse !important;\n  }\n  .flex-sm-grow-0 {\n    flex-grow: 0 !important;\n  }\n  .flex-sm-grow-1 {\n    flex-grow: 1 !important;\n  }\n  .flex-sm-shrink-0 {\n    flex-shrink: 0 !important;\n  }\n  .flex-sm-shrink-1 {\n    flex-shrink: 1 !important;\n  }\n  .flex-sm-wrap {\n    flex-wrap: wrap !important;\n  }\n  .flex-sm-nowrap {\n    flex-wrap: nowrap !important;\n  }\n  .flex-sm-wrap-reverse {\n    flex-wrap: wrap-reverse !important;\n  }\n  .justify-content-sm-start {\n    justify-content: flex-start !important;\n  }\n  .justify-content-sm-end {\n    justify-content: flex-end !important;\n  }\n  .justify-content-sm-center {\n    justify-content: center !important;\n  }\n  .justify-content-sm-between {\n    justify-content: space-between !important;\n  }\n  .justify-content-sm-around {\n    justify-content: space-around !important;\n  }\n  .justify-content-sm-evenly {\n    justify-content: space-evenly !important;\n  }\n  .align-items-sm-start {\n    align-items: flex-start !important;\n  }\n  .align-items-sm-end {\n    align-items: flex-end !important;\n  }\n  .align-items-sm-center {\n    align-items: center !important;\n  }\n  .align-items-sm-baseline {\n    align-items: baseline !important;\n  }\n  .align-items-sm-stretch {\n    align-items: stretch !important;\n  }\n  .align-content-sm-start {\n    align-content: flex-start !important;\n  }\n  .align-content-sm-end {\n    align-content: flex-end !important;\n  }\n  .align-content-sm-center {\n    align-content: center !important;\n  }\n  .align-content-sm-between {\n    align-content: space-between !important;\n  }\n  .align-content-sm-around {\n    align-content: space-around !important;\n  }\n  .align-content-sm-stretch {\n    align-content: stretch !important;\n  }\n  .align-self-sm-auto {\n    align-self: auto !important;\n  }\n  .align-self-sm-start {\n    align-self: flex-start !important;\n  }\n  .align-self-sm-end {\n    align-self: flex-end !important;\n  }\n  .align-self-sm-center {\n    align-self: center !important;\n  }\n  .align-self-sm-baseline {\n    align-self: baseline !important;\n  }\n  .align-self-sm-stretch {\n    align-self: stretch !important;\n  }\n  .order-sm-first {\n    order: -1 !important;\n  }\n  .order-sm-0 {\n    order: 0 !important;\n  }\n  .order-sm-1 {\n    order: 1 !important;\n  }\n  .order-sm-2 {\n    order: 2 !important;\n  }\n  .order-sm-3 {\n    order: 3 !important;\n  }\n  .order-sm-4 {\n    order: 4 !important;\n  }\n  .order-sm-5 {\n    order: 5 !important;\n  }\n  .order-sm-last {\n    order: 6 !important;\n  }\n  .m-sm-0 {\n    margin: 0 !important;\n  }\n  .m-sm-1 {\n    margin: 0.25rem !important;\n  }\n  .m-sm-2 {\n    margin: 0.5rem !important;\n  }\n  .m-sm-3 {\n    margin: 1rem !important;\n  }\n  .m-sm-4 {\n    margin: 1.5rem !important;\n  }\n  .m-sm-5 {\n    margin: 3rem !important;\n  }\n  .m-sm-auto {\n    margin: auto !important;\n  }\n  .mx-sm-0 {\n    margin-left: 0 !important;\n    margin-right: 0 !important;\n  }\n  .mx-sm-1 {\n    margin-left: 0.25rem !important;\n    margin-right: 0.25rem !important;\n  }\n  .mx-sm-2 {\n    margin-left: 0.5rem !important;\n    margin-right: 0.5rem !important;\n  }\n  .mx-sm-3 {\n    margin-left: 1rem !important;\n    margin-right: 1rem !important;\n  }\n  .mx-sm-4 {\n    margin-left: 1.5rem !important;\n    margin-right: 1.5rem !important;\n  }\n  .mx-sm-5 {\n    margin-left: 3rem !important;\n    margin-right: 3rem !important;\n  }\n  .mx-sm-auto {\n    margin-left: auto !important;\n    margin-right: auto !important;\n  }\n  .my-sm-0 {\n    margin-top: 0 !important;\n    margin-bottom: 0 !important;\n  }\n  .my-sm-1 {\n    margin-top: 0.25rem !important;\n    margin-bottom: 0.25rem !important;\n  }\n  .my-sm-2 {\n    margin-top: 0.5rem !important;\n    margin-bottom: 0.5rem !important;\n  }\n  .my-sm-3 {\n    margin-top: 1rem !important;\n    margin-bottom: 1rem !important;\n  }\n  .my-sm-4 {\n    margin-top: 1.5rem !important;\n    margin-bottom: 1.5rem !important;\n  }\n  .my-sm-5 {\n    margin-top: 3rem !important;\n    margin-bottom: 3rem !important;\n  }\n  .my-sm-auto {\n    margin-top: auto !important;\n    margin-bottom: auto !important;\n  }\n  .mt-sm-0 {\n    margin-top: 0 !important;\n  }\n  .mt-sm-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mt-sm-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mt-sm-3 {\n    margin-top: 1rem !important;\n  }\n  .mt-sm-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mt-sm-5 {\n    margin-top: 3rem !important;\n  }\n  .mt-sm-auto {\n    margin-top: auto !important;\n  }\n  .me-sm-0 {\n    margin-left: 0 !important;\n  }\n  .me-sm-1 {\n    margin-left: 0.25rem !important;\n  }\n  .me-sm-2 {\n    margin-left: 0.5rem !important;\n  }\n  .me-sm-3 {\n    margin-left: 1rem !important;\n  }\n  .me-sm-4 {\n    margin-left: 1.5rem !important;\n  }\n  .me-sm-5 {\n    margin-left: 3rem !important;\n  }\n  .me-sm-auto {\n    margin-left: auto !important;\n  }\n  .mb-sm-0 {\n    margin-bottom: 0 !important;\n  }\n  .mb-sm-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .mb-sm-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .mb-sm-3 {\n    margin-bottom: 1rem !important;\n  }\n  .mb-sm-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .mb-sm-5 {\n    margin-bottom: 3rem !important;\n  }\n  .mb-sm-auto {\n    margin-bottom: auto !important;\n  }\n  .ms-sm-0 {\n    margin-right: 0 !important;\n  }\n  .ms-sm-1 {\n    margin-right: 0.25rem !important;\n  }\n  .ms-sm-2 {\n    margin-right: 0.5rem !important;\n  }\n  .ms-sm-3 {\n    margin-right: 1rem !important;\n  }\n  .ms-sm-4 {\n    margin-right: 1.5rem !important;\n  }\n  .ms-sm-5 {\n    margin-right: 3rem !important;\n  }\n  .ms-sm-auto {\n    margin-right: auto !important;\n  }\n  .p-sm-0 {\n    padding: 0 !important;\n  }\n  .p-sm-1 {\n    padding: 0.25rem !important;\n  }\n  .p-sm-2 {\n    padding: 0.5rem !important;\n  }\n  .p-sm-3 {\n    padding: 1rem !important;\n  }\n  .p-sm-4 {\n    padding: 1.5rem !important;\n  }\n  .p-sm-5 {\n    padding: 3rem !important;\n  }\n  .px-sm-0 {\n    padding-left: 0 !important;\n    padding-right: 0 !important;\n  }\n  .px-sm-1 {\n    padding-left: 0.25rem !important;\n    padding-right: 0.25rem !important;\n  }\n  .px-sm-2 {\n    padding-left: 0.5rem !important;\n    padding-right: 0.5rem !important;\n  }\n  .px-sm-3 {\n    padding-left: 1rem !important;\n    padding-right: 1rem !important;\n  }\n  .px-sm-4 {\n    padding-left: 1.5rem !important;\n    padding-right: 1.5rem !important;\n  }\n  .px-sm-5 {\n    padding-left: 3rem !important;\n    padding-right: 3rem !important;\n  }\n  .py-sm-0 {\n    padding-top: 0 !important;\n    padding-bottom: 0 !important;\n  }\n  .py-sm-1 {\n    padding-top: 0.25rem !important;\n    padding-bottom: 0.25rem !important;\n  }\n  .py-sm-2 {\n    padding-top: 0.5rem !important;\n    padding-bottom: 0.5rem !important;\n  }\n  .py-sm-3 {\n    padding-top: 1rem !important;\n    padding-bottom: 1rem !important;\n  }\n  .py-sm-4 {\n    padding-top: 1.5rem !important;\n    padding-bottom: 1.5rem !important;\n  }\n  .py-sm-5 {\n    padding-top: 3rem !important;\n    padding-bottom: 3rem !important;\n  }\n  .pt-sm-0 {\n    padding-top: 0 !important;\n  }\n  .pt-sm-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pt-sm-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pt-sm-3 {\n    padding-top: 1rem !important;\n  }\n  .pt-sm-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pt-sm-5 {\n    padding-top: 3rem !important;\n  }\n  .pe-sm-0 {\n    padding-left: 0 !important;\n  }\n  .pe-sm-1 {\n    padding-left: 0.25rem !important;\n  }\n  .pe-sm-2 {\n    padding-left: 0.5rem !important;\n  }\n  .pe-sm-3 {\n    padding-left: 1rem !important;\n  }\n  .pe-sm-4 {\n    padding-left: 1.5rem !important;\n  }\n  .pe-sm-5 {\n    padding-left: 3rem !important;\n  }\n  .pb-sm-0 {\n    padding-bottom: 0 !important;\n  }\n  .pb-sm-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pb-sm-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pb-sm-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pb-sm-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pb-sm-5 {\n    padding-bottom: 3rem !important;\n  }\n  .ps-sm-0 {\n    padding-right: 0 !important;\n  }\n  .ps-sm-1 {\n    padding-right: 0.25rem !important;\n  }\n  .ps-sm-2 {\n    padding-right: 0.5rem !important;\n  }\n  .ps-sm-3 {\n    padding-right: 1rem !important;\n  }\n  .ps-sm-4 {\n    padding-right: 1.5rem !important;\n  }\n  .ps-sm-5 {\n    padding-right: 3rem !important;\n  }\n  .gap-sm-0 {\n    gap: 0 !important;\n  }\n  .gap-sm-1 {\n    gap: 0.25rem !important;\n  }\n  .gap-sm-2 {\n    gap: 0.5rem !important;\n  }\n  .gap-sm-3 {\n    gap: 1rem !important;\n  }\n  .gap-sm-4 {\n    gap: 1.5rem !important;\n  }\n  .gap-sm-5 {\n    gap: 3rem !important;\n  }\n  .row-gap-sm-0 {\n    row-gap: 0 !important;\n  }\n  .row-gap-sm-1 {\n    row-gap: 0.25rem !important;\n  }\n  .row-gap-sm-2 {\n    row-gap: 0.5rem !important;\n  }\n  .row-gap-sm-3 {\n    row-gap: 1rem !important;\n  }\n  .row-gap-sm-4 {\n    row-gap: 1.5rem !important;\n  }\n  .row-gap-sm-5 {\n    row-gap: 3rem !important;\n  }\n  .column-gap-sm-0 {\n    -moz-column-gap: 0 !important;\n    column-gap: 0 !important;\n  }\n  .column-gap-sm-1 {\n    -moz-column-gap: 0.25rem !important;\n    column-gap: 0.25rem !important;\n  }\n  .column-gap-sm-2 {\n    -moz-column-gap: 0.5rem !important;\n    column-gap: 0.5rem !important;\n  }\n  .column-gap-sm-3 {\n    -moz-column-gap: 1rem !important;\n    column-gap: 1rem !important;\n  }\n  .column-gap-sm-4 {\n    -moz-column-gap: 1.5rem !important;\n    column-gap: 1.5rem !important;\n  }\n  .column-gap-sm-5 {\n    -moz-column-gap: 3rem !important;\n    column-gap: 3rem !important;\n  }\n  .text-sm-start {\n    text-align: right !important;\n  }\n  .text-sm-end {\n    text-align: left !important;\n  }\n  .text-sm-center {\n    text-align: center !important;\n  }\n}\n@media (min-width: 768px) {\n  .float-md-start {\n    float: right !important;\n  }\n  .float-md-end {\n    float: left !important;\n  }\n  .float-md-none {\n    float: none !important;\n  }\n  .object-fit-md-contain {\n    -o-object-fit: contain !important;\n    object-fit: contain !important;\n  }\n  .object-fit-md-cover {\n    -o-object-fit: cover !important;\n    object-fit: cover !important;\n  }\n  .object-fit-md-fill {\n    -o-object-fit: fill !important;\n    object-fit: fill !important;\n  }\n  .object-fit-md-scale {\n    -o-object-fit: scale-down !important;\n    object-fit: scale-down !important;\n  }\n  .object-fit-md-none {\n    -o-object-fit: none !important;\n    object-fit: none !important;\n  }\n  .d-md-inline {\n    display: inline !important;\n  }\n  .d-md-inline-block {\n    display: inline-block !important;\n  }\n  .d-md-block {\n    display: block !important;\n  }\n  .d-md-grid {\n    display: grid !important;\n  }\n  .d-md-inline-grid {\n    display: inline-grid !important;\n  }\n  .d-md-table {\n    display: table !important;\n  }\n  .d-md-table-row {\n    display: table-row !important;\n  }\n  .d-md-table-cell {\n    display: table-cell !important;\n  }\n  .d-md-flex {\n    display: flex !important;\n  }\n  .d-md-inline-flex {\n    display: inline-flex !important;\n  }\n  .d-md-none {\n    display: none !important;\n  }\n  .flex-md-fill {\n    flex: 1 1 auto !important;\n  }\n  .flex-md-row {\n    flex-direction: row !important;\n  }\n  .flex-md-column {\n    flex-direction: column !important;\n  }\n  .flex-md-row-reverse {\n    flex-direction: row-reverse !important;\n  }\n  .flex-md-column-reverse {\n    flex-direction: column-reverse !important;\n  }\n  .flex-md-grow-0 {\n    flex-grow: 0 !important;\n  }\n  .flex-md-grow-1 {\n    flex-grow: 1 !important;\n  }\n  .flex-md-shrink-0 {\n    flex-shrink: 0 !important;\n  }\n  .flex-md-shrink-1 {\n    flex-shrink: 1 !important;\n  }\n  .flex-md-wrap {\n    flex-wrap: wrap !important;\n  }\n  .flex-md-nowrap {\n    flex-wrap: nowrap !important;\n  }\n  .flex-md-wrap-reverse {\n    flex-wrap: wrap-reverse !important;\n  }\n  .justify-content-md-start {\n    justify-content: flex-start !important;\n  }\n  .justify-content-md-end {\n    justify-content: flex-end !important;\n  }\n  .justify-content-md-center {\n    justify-content: center !important;\n  }\n  .justify-content-md-between {\n    justify-content: space-between !important;\n  }\n  .justify-content-md-around {\n    justify-content: space-around !important;\n  }\n  .justify-content-md-evenly {\n    justify-content: space-evenly !important;\n  }\n  .align-items-md-start {\n    align-items: flex-start !important;\n  }\n  .align-items-md-end {\n    align-items: flex-end !important;\n  }\n  .align-items-md-center {\n    align-items: center !important;\n  }\n  .align-items-md-baseline {\n    align-items: baseline !important;\n  }\n  .align-items-md-stretch {\n    align-items: stretch !important;\n  }\n  .align-content-md-start {\n    align-content: flex-start !important;\n  }\n  .align-content-md-end {\n    align-content: flex-end !important;\n  }\n  .align-content-md-center {\n    align-content: center !important;\n  }\n  .align-content-md-between {\n    align-content: space-between !important;\n  }\n  .align-content-md-around {\n    align-content: space-around !important;\n  }\n  .align-content-md-stretch {\n    align-content: stretch !important;\n  }\n  .align-self-md-auto {\n    align-self: auto !important;\n  }\n  .align-self-md-start {\n    align-self: flex-start !important;\n  }\n  .align-self-md-end {\n    align-self: flex-end !important;\n  }\n  .align-self-md-center {\n    align-self: center !important;\n  }\n  .align-self-md-baseline {\n    align-self: baseline !important;\n  }\n  .align-self-md-stretch {\n    align-self: stretch !important;\n  }\n  .order-md-first {\n    order: -1 !important;\n  }\n  .order-md-0 {\n    order: 0 !important;\n  }\n  .order-md-1 {\n    order: 1 !important;\n  }\n  .order-md-2 {\n    order: 2 !important;\n  }\n  .order-md-3 {\n    order: 3 !important;\n  }\n  .order-md-4 {\n    order: 4 !important;\n  }\n  .order-md-5 {\n    order: 5 !important;\n  }\n  .order-md-last {\n    order: 6 !important;\n  }\n  .m-md-0 {\n    margin: 0 !important;\n  }\n  .m-md-1 {\n    margin: 0.25rem !important;\n  }\n  .m-md-2 {\n    margin: 0.5rem !important;\n  }\n  .m-md-3 {\n    margin: 1rem !important;\n  }\n  .m-md-4 {\n    margin: 1.5rem !important;\n  }\n  .m-md-5 {\n    margin: 3rem !important;\n  }\n  .m-md-auto {\n    margin: auto !important;\n  }\n  .mx-md-0 {\n    margin-left: 0 !important;\n    margin-right: 0 !important;\n  }\n  .mx-md-1 {\n    margin-left: 0.25rem !important;\n    margin-right: 0.25rem !important;\n  }\n  .mx-md-2 {\n    margin-left: 0.5rem !important;\n    margin-right: 0.5rem !important;\n  }\n  .mx-md-3 {\n    margin-left: 1rem !important;\n    margin-right: 1rem !important;\n  }\n  .mx-md-4 {\n    margin-left: 1.5rem !important;\n    margin-right: 1.5rem !important;\n  }\n  .mx-md-5 {\n    margin-left: 3rem !important;\n    margin-right: 3rem !important;\n  }\n  .mx-md-auto {\n    margin-left: auto !important;\n    margin-right: auto !important;\n  }\n  .my-md-0 {\n    margin-top: 0 !important;\n    margin-bottom: 0 !important;\n  }\n  .my-md-1 {\n    margin-top: 0.25rem !important;\n    margin-bottom: 0.25rem !important;\n  }\n  .my-md-2 {\n    margin-top: 0.5rem !important;\n    margin-bottom: 0.5rem !important;\n  }\n  .my-md-3 {\n    margin-top: 1rem !important;\n    margin-bottom: 1rem !important;\n  }\n  .my-md-4 {\n    margin-top: 1.5rem !important;\n    margin-bottom: 1.5rem !important;\n  }\n  .my-md-5 {\n    margin-top: 3rem !important;\n    margin-bottom: 3rem !important;\n  }\n  .my-md-auto {\n    margin-top: auto !important;\n    margin-bottom: auto !important;\n  }\n  .mt-md-0 {\n    margin-top: 0 !important;\n  }\n  .mt-md-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mt-md-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mt-md-3 {\n    margin-top: 1rem !important;\n  }\n  .mt-md-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mt-md-5 {\n    margin-top: 3rem !important;\n  }\n  .mt-md-auto {\n    margin-top: auto !important;\n  }\n  .me-md-0 {\n    margin-left: 0 !important;\n  }\n  .me-md-1 {\n    margin-left: 0.25rem !important;\n  }\n  .me-md-2 {\n    margin-left: 0.5rem !important;\n  }\n  .me-md-3 {\n    margin-left: 1rem !important;\n  }\n  .me-md-4 {\n    margin-left: 1.5rem !important;\n  }\n  .me-md-5 {\n    margin-left: 3rem !important;\n  }\n  .me-md-auto {\n    margin-left: auto !important;\n  }\n  .mb-md-0 {\n    margin-bottom: 0 !important;\n  }\n  .mb-md-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .mb-md-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .mb-md-3 {\n    margin-bottom: 1rem !important;\n  }\n  .mb-md-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .mb-md-5 {\n    margin-bottom: 3rem !important;\n  }\n  .mb-md-auto {\n    margin-bottom: auto !important;\n  }\n  .ms-md-0 {\n    margin-right: 0 !important;\n  }\n  .ms-md-1 {\n    margin-right: 0.25rem !important;\n  }\n  .ms-md-2 {\n    margin-right: 0.5rem !important;\n  }\n  .ms-md-3 {\n    margin-right: 1rem !important;\n  }\n  .ms-md-4 {\n    margin-right: 1.5rem !important;\n  }\n  .ms-md-5 {\n    margin-right: 3rem !important;\n  }\n  .ms-md-auto {\n    margin-right: auto !important;\n  }\n  .p-md-0 {\n    padding: 0 !important;\n  }\n  .p-md-1 {\n    padding: 0.25rem !important;\n  }\n  .p-md-2 {\n    padding: 0.5rem !important;\n  }\n  .p-md-3 {\n    padding: 1rem !important;\n  }\n  .p-md-4 {\n    padding: 1.5rem !important;\n  }\n  .p-md-5 {\n    padding: 3rem !important;\n  }\n  .px-md-0 {\n    padding-left: 0 !important;\n    padding-right: 0 !important;\n  }\n  .px-md-1 {\n    padding-left: 0.25rem !important;\n    padding-right: 0.25rem !important;\n  }\n  .px-md-2 {\n    padding-left: 0.5rem !important;\n    padding-right: 0.5rem !important;\n  }\n  .px-md-3 {\n    padding-left: 1rem !important;\n    padding-right: 1rem !important;\n  }\n  .px-md-4 {\n    padding-left: 1.5rem !important;\n    padding-right: 1.5rem !important;\n  }\n  .px-md-5 {\n    padding-left: 3rem !important;\n    padding-right: 3rem !important;\n  }\n  .py-md-0 {\n    padding-top: 0 !important;\n    padding-bottom: 0 !important;\n  }\n  .py-md-1 {\n    padding-top: 0.25rem !important;\n    padding-bottom: 0.25rem !important;\n  }\n  .py-md-2 {\n    padding-top: 0.5rem !important;\n    padding-bottom: 0.5rem !important;\n  }\n  .py-md-3 {\n    padding-top: 1rem !important;\n    padding-bottom: 1rem !important;\n  }\n  .py-md-4 {\n    padding-top: 1.5rem !important;\n    padding-bottom: 1.5rem !important;\n  }\n  .py-md-5 {\n    padding-top: 3rem !important;\n    padding-bottom: 3rem !important;\n  }\n  .pt-md-0 {\n    padding-top: 0 !important;\n  }\n  .pt-md-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pt-md-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pt-md-3 {\n    padding-top: 1rem !important;\n  }\n  .pt-md-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pt-md-5 {\n    padding-top: 3rem !important;\n  }\n  .pe-md-0 {\n    padding-left: 0 !important;\n  }\n  .pe-md-1 {\n    padding-left: 0.25rem !important;\n  }\n  .pe-md-2 {\n    padding-left: 0.5rem !important;\n  }\n  .pe-md-3 {\n    padding-left: 1rem !important;\n  }\n  .pe-md-4 {\n    padding-left: 1.5rem !important;\n  }\n  .pe-md-5 {\n    padding-left: 3rem !important;\n  }\n  .pb-md-0 {\n    padding-bottom: 0 !important;\n  }\n  .pb-md-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pb-md-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pb-md-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pb-md-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pb-md-5 {\n    padding-bottom: 3rem !important;\n  }\n  .ps-md-0 {\n    padding-right: 0 !important;\n  }\n  .ps-md-1 {\n    padding-right: 0.25rem !important;\n  }\n  .ps-md-2 {\n    padding-right: 0.5rem !important;\n  }\n  .ps-md-3 {\n    padding-right: 1rem !important;\n  }\n  .ps-md-4 {\n    padding-right: 1.5rem !important;\n  }\n  .ps-md-5 {\n    padding-right: 3rem !important;\n  }\n  .gap-md-0 {\n    gap: 0 !important;\n  }\n  .gap-md-1 {\n    gap: 0.25rem !important;\n  }\n  .gap-md-2 {\n    gap: 0.5rem !important;\n  }\n  .gap-md-3 {\n    gap: 1rem !important;\n  }\n  .gap-md-4 {\n    gap: 1.5rem !important;\n  }\n  .gap-md-5 {\n    gap: 3rem !important;\n  }\n  .row-gap-md-0 {\n    row-gap: 0 !important;\n  }\n  .row-gap-md-1 {\n    row-gap: 0.25rem !important;\n  }\n  .row-gap-md-2 {\n    row-gap: 0.5rem !important;\n  }\n  .row-gap-md-3 {\n    row-gap: 1rem !important;\n  }\n  .row-gap-md-4 {\n    row-gap: 1.5rem !important;\n  }\n  .row-gap-md-5 {\n    row-gap: 3rem !important;\n  }\n  .column-gap-md-0 {\n    -moz-column-gap: 0 !important;\n    column-gap: 0 !important;\n  }\n  .column-gap-md-1 {\n    -moz-column-gap: 0.25rem !important;\n    column-gap: 0.25rem !important;\n  }\n  .column-gap-md-2 {\n    -moz-column-gap: 0.5rem !important;\n    column-gap: 0.5rem !important;\n  }\n  .column-gap-md-3 {\n    -moz-column-gap: 1rem !important;\n    column-gap: 1rem !important;\n  }\n  .column-gap-md-4 {\n    -moz-column-gap: 1.5rem !important;\n    column-gap: 1.5rem !important;\n  }\n  .column-gap-md-5 {\n    -moz-column-gap: 3rem !important;\n    column-gap: 3rem !important;\n  }\n  .text-md-start {\n    text-align: right !important;\n  }\n  .text-md-end {\n    text-align: left !important;\n  }\n  .text-md-center {\n    text-align: center !important;\n  }\n}\n@media (min-width: 992px) {\n  .float-lg-start {\n    float: right !important;\n  }\n  .float-lg-end {\n    float: left !important;\n  }\n  .float-lg-none {\n    float: none !important;\n  }\n  .object-fit-lg-contain {\n    -o-object-fit: contain !important;\n    object-fit: contain !important;\n  }\n  .object-fit-lg-cover {\n    -o-object-fit: cover !important;\n    object-fit: cover !important;\n  }\n  .object-fit-lg-fill {\n    -o-object-fit: fill !important;\n    object-fit: fill !important;\n  }\n  .object-fit-lg-scale {\n    -o-object-fit: scale-down !important;\n    object-fit: scale-down !important;\n  }\n  .object-fit-lg-none {\n    -o-object-fit: none !important;\n    object-fit: none !important;\n  }\n  .d-lg-inline {\n    display: inline !important;\n  }\n  .d-lg-inline-block {\n    display: inline-block !important;\n  }\n  .d-lg-block {\n    display: block !important;\n  }\n  .d-lg-grid {\n    display: grid !important;\n  }\n  .d-lg-inline-grid {\n    display: inline-grid !important;\n  }\n  .d-lg-table {\n    display: table !important;\n  }\n  .d-lg-table-row {\n    display: table-row !important;\n  }\n  .d-lg-table-cell {\n    display: table-cell !important;\n  }\n  .d-lg-flex {\n    display: flex !important;\n  }\n  .d-lg-inline-flex {\n    display: inline-flex !important;\n  }\n  .d-lg-none {\n    display: none !important;\n  }\n  .flex-lg-fill {\n    flex: 1 1 auto !important;\n  }\n  .flex-lg-row {\n    flex-direction: row !important;\n  }\n  .flex-lg-column {\n    flex-direction: column !important;\n  }\n  .flex-lg-row-reverse {\n    flex-direction: row-reverse !important;\n  }\n  .flex-lg-column-reverse {\n    flex-direction: column-reverse !important;\n  }\n  .flex-lg-grow-0 {\n    flex-grow: 0 !important;\n  }\n  .flex-lg-grow-1 {\n    flex-grow: 1 !important;\n  }\n  .flex-lg-shrink-0 {\n    flex-shrink: 0 !important;\n  }\n  .flex-lg-shrink-1 {\n    flex-shrink: 1 !important;\n  }\n  .flex-lg-wrap {\n    flex-wrap: wrap !important;\n  }\n  .flex-lg-nowrap {\n    flex-wrap: nowrap !important;\n  }\n  .flex-lg-wrap-reverse {\n    flex-wrap: wrap-reverse !important;\n  }\n  .justify-content-lg-start {\n    justify-content: flex-start !important;\n  }\n  .justify-content-lg-end {\n    justify-content: flex-end !important;\n  }\n  .justify-content-lg-center {\n    justify-content: center !important;\n  }\n  .justify-content-lg-between {\n    justify-content: space-between !important;\n  }\n  .justify-content-lg-around {\n    justify-content: space-around !important;\n  }\n  .justify-content-lg-evenly {\n    justify-content: space-evenly !important;\n  }\n  .align-items-lg-start {\n    align-items: flex-start !important;\n  }\n  .align-items-lg-end {\n    align-items: flex-end !important;\n  }\n  .align-items-lg-center {\n    align-items: center !important;\n  }\n  .align-items-lg-baseline {\n    align-items: baseline !important;\n  }\n  .align-items-lg-stretch {\n    align-items: stretch !important;\n  }\n  .align-content-lg-start {\n    align-content: flex-start !important;\n  }\n  .align-content-lg-end {\n    align-content: flex-end !important;\n  }\n  .align-content-lg-center {\n    align-content: center !important;\n  }\n  .align-content-lg-between {\n    align-content: space-between !important;\n  }\n  .align-content-lg-around {\n    align-content: space-around !important;\n  }\n  .align-content-lg-stretch {\n    align-content: stretch !important;\n  }\n  .align-self-lg-auto {\n    align-self: auto !important;\n  }\n  .align-self-lg-start {\n    align-self: flex-start !important;\n  }\n  .align-self-lg-end {\n    align-self: flex-end !important;\n  }\n  .align-self-lg-center {\n    align-self: center !important;\n  }\n  .align-self-lg-baseline {\n    align-self: baseline !important;\n  }\n  .align-self-lg-stretch {\n    align-self: stretch !important;\n  }\n  .order-lg-first {\n    order: -1 !important;\n  }\n  .order-lg-0 {\n    order: 0 !important;\n  }\n  .order-lg-1 {\n    order: 1 !important;\n  }\n  .order-lg-2 {\n    order: 2 !important;\n  }\n  .order-lg-3 {\n    order: 3 !important;\n  }\n  .order-lg-4 {\n    order: 4 !important;\n  }\n  .order-lg-5 {\n    order: 5 !important;\n  }\n  .order-lg-last {\n    order: 6 !important;\n  }\n  .m-lg-0 {\n    margin: 0 !important;\n  }\n  .m-lg-1 {\n    margin: 0.25rem !important;\n  }\n  .m-lg-2 {\n    margin: 0.5rem !important;\n  }\n  .m-lg-3 {\n    margin: 1rem !important;\n  }\n  .m-lg-4 {\n    margin: 1.5rem !important;\n  }\n  .m-lg-5 {\n    margin: 3rem !important;\n  }\n  .m-lg-auto {\n    margin: auto !important;\n  }\n  .mx-lg-0 {\n    margin-left: 0 !important;\n    margin-right: 0 !important;\n  }\n  .mx-lg-1 {\n    margin-left: 0.25rem !important;\n    margin-right: 0.25rem !important;\n  }\n  .mx-lg-2 {\n    margin-left: 0.5rem !important;\n    margin-right: 0.5rem !important;\n  }\n  .mx-lg-3 {\n    margin-left: 1rem !important;\n    margin-right: 1rem !important;\n  }\n  .mx-lg-4 {\n    margin-left: 1.5rem !important;\n    margin-right: 1.5rem !important;\n  }\n  .mx-lg-5 {\n    margin-left: 3rem !important;\n    margin-right: 3rem !important;\n  }\n  .mx-lg-auto {\n    margin-left: auto !important;\n    margin-right: auto !important;\n  }\n  .my-lg-0 {\n    margin-top: 0 !important;\n    margin-bottom: 0 !important;\n  }\n  .my-lg-1 {\n    margin-top: 0.25rem !important;\n    margin-bottom: 0.25rem !important;\n  }\n  .my-lg-2 {\n    margin-top: 0.5rem !important;\n    margin-bottom: 0.5rem !important;\n  }\n  .my-lg-3 {\n    margin-top: 1rem !important;\n    margin-bottom: 1rem !important;\n  }\n  .my-lg-4 {\n    margin-top: 1.5rem !important;\n    margin-bottom: 1.5rem !important;\n  }\n  .my-lg-5 {\n    margin-top: 3rem !important;\n    margin-bottom: 3rem !important;\n  }\n  .my-lg-auto {\n    margin-top: auto !important;\n    margin-bottom: auto !important;\n  }\n  .mt-lg-0 {\n    margin-top: 0 !important;\n  }\n  .mt-lg-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mt-lg-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mt-lg-3 {\n    margin-top: 1rem !important;\n  }\n  .mt-lg-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mt-lg-5 {\n    margin-top: 3rem !important;\n  }\n  .mt-lg-auto {\n    margin-top: auto !important;\n  }\n  .me-lg-0 {\n    margin-left: 0 !important;\n  }\n  .me-lg-1 {\n    margin-left: 0.25rem !important;\n  }\n  .me-lg-2 {\n    margin-left: 0.5rem !important;\n  }\n  .me-lg-3 {\n    margin-left: 1rem !important;\n  }\n  .me-lg-4 {\n    margin-left: 1.5rem !important;\n  }\n  .me-lg-5 {\n    margin-left: 3rem !important;\n  }\n  .me-lg-auto {\n    margin-left: auto !important;\n  }\n  .mb-lg-0 {\n    margin-bottom: 0 !important;\n  }\n  .mb-lg-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .mb-lg-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .mb-lg-3 {\n    margin-bottom: 1rem !important;\n  }\n  .mb-lg-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .mb-lg-5 {\n    margin-bottom: 3rem !important;\n  }\n  .mb-lg-auto {\n    margin-bottom: auto !important;\n  }\n  .ms-lg-0 {\n    margin-right: 0 !important;\n  }\n  .ms-lg-1 {\n    margin-right: 0.25rem !important;\n  }\n  .ms-lg-2 {\n    margin-right: 0.5rem !important;\n  }\n  .ms-lg-3 {\n    margin-right: 1rem !important;\n  }\n  .ms-lg-4 {\n    margin-right: 1.5rem !important;\n  }\n  .ms-lg-5 {\n    margin-right: 3rem !important;\n  }\n  .ms-lg-auto {\n    margin-right: auto !important;\n  }\n  .p-lg-0 {\n    padding: 0 !important;\n  }\n  .p-lg-1 {\n    padding: 0.25rem !important;\n  }\n  .p-lg-2 {\n    padding: 0.5rem !important;\n  }\n  .p-lg-3 {\n    padding: 1rem !important;\n  }\n  .p-lg-4 {\n    padding: 1.5rem !important;\n  }\n  .p-lg-5 {\n    padding: 3rem !important;\n  }\n  .px-lg-0 {\n    padding-left: 0 !important;\n    padding-right: 0 !important;\n  }\n  .px-lg-1 {\n    padding-left: 0.25rem !important;\n    padding-right: 0.25rem !important;\n  }\n  .px-lg-2 {\n    padding-left: 0.5rem !important;\n    padding-right: 0.5rem !important;\n  }\n  .px-lg-3 {\n    padding-left: 1rem !important;\n    padding-right: 1rem !important;\n  }\n  .px-lg-4 {\n    padding-left: 1.5rem !important;\n    padding-right: 1.5rem !important;\n  }\n  .px-lg-5 {\n    padding-left: 3rem !important;\n    padding-right: 3rem !important;\n  }\n  .py-lg-0 {\n    padding-top: 0 !important;\n    padding-bottom: 0 !important;\n  }\n  .py-lg-1 {\n    padding-top: 0.25rem !important;\n    padding-bottom: 0.25rem !important;\n  }\n  .py-lg-2 {\n    padding-top: 0.5rem !important;\n    padding-bottom: 0.5rem !important;\n  }\n  .py-lg-3 {\n    padding-top: 1rem !important;\n    padding-bottom: 1rem !important;\n  }\n  .py-lg-4 {\n    padding-top: 1.5rem !important;\n    padding-bottom: 1.5rem !important;\n  }\n  .py-lg-5 {\n    padding-top: 3rem !important;\n    padding-bottom: 3rem !important;\n  }\n  .pt-lg-0 {\n    padding-top: 0 !important;\n  }\n  .pt-lg-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pt-lg-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pt-lg-3 {\n    padding-top: 1rem !important;\n  }\n  .pt-lg-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pt-lg-5 {\n    padding-top: 3rem !important;\n  }\n  .pe-lg-0 {\n    padding-left: 0 !important;\n  }\n  .pe-lg-1 {\n    padding-left: 0.25rem !important;\n  }\n  .pe-lg-2 {\n    padding-left: 0.5rem !important;\n  }\n  .pe-lg-3 {\n    padding-left: 1rem !important;\n  }\n  .pe-lg-4 {\n    padding-left: 1.5rem !important;\n  }\n  .pe-lg-5 {\n    padding-left: 3rem !important;\n  }\n  .pb-lg-0 {\n    padding-bottom: 0 !important;\n  }\n  .pb-lg-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pb-lg-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pb-lg-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pb-lg-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pb-lg-5 {\n    padding-bottom: 3rem !important;\n  }\n  .ps-lg-0 {\n    padding-right: 0 !important;\n  }\n  .ps-lg-1 {\n    padding-right: 0.25rem !important;\n  }\n  .ps-lg-2 {\n    padding-right: 0.5rem !important;\n  }\n  .ps-lg-3 {\n    padding-right: 1rem !important;\n  }\n  .ps-lg-4 {\n    padding-right: 1.5rem !important;\n  }\n  .ps-lg-5 {\n    padding-right: 3rem !important;\n  }\n  .gap-lg-0 {\n    gap: 0 !important;\n  }\n  .gap-lg-1 {\n    gap: 0.25rem !important;\n  }\n  .gap-lg-2 {\n    gap: 0.5rem !important;\n  }\n  .gap-lg-3 {\n    gap: 1rem !important;\n  }\n  .gap-lg-4 {\n    gap: 1.5rem !important;\n  }\n  .gap-lg-5 {\n    gap: 3rem !important;\n  }\n  .row-gap-lg-0 {\n    row-gap: 0 !important;\n  }\n  .row-gap-lg-1 {\n    row-gap: 0.25rem !important;\n  }\n  .row-gap-lg-2 {\n    row-gap: 0.5rem !important;\n  }\n  .row-gap-lg-3 {\n    row-gap: 1rem !important;\n  }\n  .row-gap-lg-4 {\n    row-gap: 1.5rem !important;\n  }\n  .row-gap-lg-5 {\n    row-gap: 3rem !important;\n  }\n  .column-gap-lg-0 {\n    -moz-column-gap: 0 !important;\n    column-gap: 0 !important;\n  }\n  .column-gap-lg-1 {\n    -moz-column-gap: 0.25rem !important;\n    column-gap: 0.25rem !important;\n  }\n  .column-gap-lg-2 {\n    -moz-column-gap: 0.5rem !important;\n    column-gap: 0.5rem !important;\n  }\n  .column-gap-lg-3 {\n    -moz-column-gap: 1rem !important;\n    column-gap: 1rem !important;\n  }\n  .column-gap-lg-4 {\n    -moz-column-gap: 1.5rem !important;\n    column-gap: 1.5rem !important;\n  }\n  .column-gap-lg-5 {\n    -moz-column-gap: 3rem !important;\n    column-gap: 3rem !important;\n  }\n  .text-lg-start {\n    text-align: right !important;\n  }\n  .text-lg-end {\n    text-align: left !important;\n  }\n  .text-lg-center {\n    text-align: center !important;\n  }\n}\n@media (min-width: 1200px) {\n  .float-xl-start {\n    float: right !important;\n  }\n  .float-xl-end {\n    float: left !important;\n  }\n  .float-xl-none {\n    float: none !important;\n  }\n  .object-fit-xl-contain {\n    -o-object-fit: contain !important;\n    object-fit: contain !important;\n  }\n  .object-fit-xl-cover {\n    -o-object-fit: cover !important;\n    object-fit: cover !important;\n  }\n  .object-fit-xl-fill {\n    -o-object-fit: fill !important;\n    object-fit: fill !important;\n  }\n  .object-fit-xl-scale {\n    -o-object-fit: scale-down !important;\n    object-fit: scale-down !important;\n  }\n  .object-fit-xl-none {\n    -o-object-fit: none !important;\n    object-fit: none !important;\n  }\n  .d-xl-inline {\n    display: inline !important;\n  }\n  .d-xl-inline-block {\n    display: inline-block !important;\n  }\n  .d-xl-block {\n    display: block !important;\n  }\n  .d-xl-grid {\n    display: grid !important;\n  }\n  .d-xl-inline-grid {\n    display: inline-grid !important;\n  }\n  .d-xl-table {\n    display: table !important;\n  }\n  .d-xl-table-row {\n    display: table-row !important;\n  }\n  .d-xl-table-cell {\n    display: table-cell !important;\n  }\n  .d-xl-flex {\n    display: flex !important;\n  }\n  .d-xl-inline-flex {\n    display: inline-flex !important;\n  }\n  .d-xl-none {\n    display: none !important;\n  }\n  .flex-xl-fill {\n    flex: 1 1 auto !important;\n  }\n  .flex-xl-row {\n    flex-direction: row !important;\n  }\n  .flex-xl-column {\n    flex-direction: column !important;\n  }\n  .flex-xl-row-reverse {\n    flex-direction: row-reverse !important;\n  }\n  .flex-xl-column-reverse {\n    flex-direction: column-reverse !important;\n  }\n  .flex-xl-grow-0 {\n    flex-grow: 0 !important;\n  }\n  .flex-xl-grow-1 {\n    flex-grow: 1 !important;\n  }\n  .flex-xl-shrink-0 {\n    flex-shrink: 0 !important;\n  }\n  .flex-xl-shrink-1 {\n    flex-shrink: 1 !important;\n  }\n  .flex-xl-wrap {\n    flex-wrap: wrap !important;\n  }\n  .flex-xl-nowrap {\n    flex-wrap: nowrap !important;\n  }\n  .flex-xl-wrap-reverse {\n    flex-wrap: wrap-reverse !important;\n  }\n  .justify-content-xl-start {\n    justify-content: flex-start !important;\n  }\n  .justify-content-xl-end {\n    justify-content: flex-end !important;\n  }\n  .justify-content-xl-center {\n    justify-content: center !important;\n  }\n  .justify-content-xl-between {\n    justify-content: space-between !important;\n  }\n  .justify-content-xl-around {\n    justify-content: space-around !important;\n  }\n  .justify-content-xl-evenly {\n    justify-content: space-evenly !important;\n  }\n  .align-items-xl-start {\n    align-items: flex-start !important;\n  }\n  .align-items-xl-end {\n    align-items: flex-end !important;\n  }\n  .align-items-xl-center {\n    align-items: center !important;\n  }\n  .align-items-xl-baseline {\n    align-items: baseline !important;\n  }\n  .align-items-xl-stretch {\n    align-items: stretch !important;\n  }\n  .align-content-xl-start {\n    align-content: flex-start !important;\n  }\n  .align-content-xl-end {\n    align-content: flex-end !important;\n  }\n  .align-content-xl-center {\n    align-content: center !important;\n  }\n  .align-content-xl-between {\n    align-content: space-between !important;\n  }\n  .align-content-xl-around {\n    align-content: space-around !important;\n  }\n  .align-content-xl-stretch {\n    align-content: stretch !important;\n  }\n  .align-self-xl-auto {\n    align-self: auto !important;\n  }\n  .align-self-xl-start {\n    align-self: flex-start !important;\n  }\n  .align-self-xl-end {\n    align-self: flex-end !important;\n  }\n  .align-self-xl-center {\n    align-self: center !important;\n  }\n  .align-self-xl-baseline {\n    align-self: baseline !important;\n  }\n  .align-self-xl-stretch {\n    align-self: stretch !important;\n  }\n  .order-xl-first {\n    order: -1 !important;\n  }\n  .order-xl-0 {\n    order: 0 !important;\n  }\n  .order-xl-1 {\n    order: 1 !important;\n  }\n  .order-xl-2 {\n    order: 2 !important;\n  }\n  .order-xl-3 {\n    order: 3 !important;\n  }\n  .order-xl-4 {\n    order: 4 !important;\n  }\n  .order-xl-5 {\n    order: 5 !important;\n  }\n  .order-xl-last {\n    order: 6 !important;\n  }\n  .m-xl-0 {\n    margin: 0 !important;\n  }\n  .m-xl-1 {\n    margin: 0.25rem !important;\n  }\n  .m-xl-2 {\n    margin: 0.5rem !important;\n  }\n  .m-xl-3 {\n    margin: 1rem !important;\n  }\n  .m-xl-4 {\n    margin: 1.5rem !important;\n  }\n  .m-xl-5 {\n    margin: 3rem !important;\n  }\n  .m-xl-auto {\n    margin: auto !important;\n  }\n  .mx-xl-0 {\n    margin-left: 0 !important;\n    margin-right: 0 !important;\n  }\n  .mx-xl-1 {\n    margin-left: 0.25rem !important;\n    margin-right: 0.25rem !important;\n  }\n  .mx-xl-2 {\n    margin-left: 0.5rem !important;\n    margin-right: 0.5rem !important;\n  }\n  .mx-xl-3 {\n    margin-left: 1rem !important;\n    margin-right: 1rem !important;\n  }\n  .mx-xl-4 {\n    margin-left: 1.5rem !important;\n    margin-right: 1.5rem !important;\n  }\n  .mx-xl-5 {\n    margin-left: 3rem !important;\n    margin-right: 3rem !important;\n  }\n  .mx-xl-auto {\n    margin-left: auto !important;\n    margin-right: auto !important;\n  }\n  .my-xl-0 {\n    margin-top: 0 !important;\n    margin-bottom: 0 !important;\n  }\n  .my-xl-1 {\n    margin-top: 0.25rem !important;\n    margin-bottom: 0.25rem !important;\n  }\n  .my-xl-2 {\n    margin-top: 0.5rem !important;\n    margin-bottom: 0.5rem !important;\n  }\n  .my-xl-3 {\n    margin-top: 1rem !important;\n    margin-bottom: 1rem !important;\n  }\n  .my-xl-4 {\n    margin-top: 1.5rem !important;\n    margin-bottom: 1.5rem !important;\n  }\n  .my-xl-5 {\n    margin-top: 3rem !important;\n    margin-bottom: 3rem !important;\n  }\n  .my-xl-auto {\n    margin-top: auto !important;\n    margin-bottom: auto !important;\n  }\n  .mt-xl-0 {\n    margin-top: 0 !important;\n  }\n  .mt-xl-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mt-xl-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mt-xl-3 {\n    margin-top: 1rem !important;\n  }\n  .mt-xl-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mt-xl-5 {\n    margin-top: 3rem !important;\n  }\n  .mt-xl-auto {\n    margin-top: auto !important;\n  }\n  .me-xl-0 {\n    margin-left: 0 !important;\n  }\n  .me-xl-1 {\n    margin-left: 0.25rem !important;\n  }\n  .me-xl-2 {\n    margin-left: 0.5rem !important;\n  }\n  .me-xl-3 {\n    margin-left: 1rem !important;\n  }\n  .me-xl-4 {\n    margin-left: 1.5rem !important;\n  }\n  .me-xl-5 {\n    margin-left: 3rem !important;\n  }\n  .me-xl-auto {\n    margin-left: auto !important;\n  }\n  .mb-xl-0 {\n    margin-bottom: 0 !important;\n  }\n  .mb-xl-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .mb-xl-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .mb-xl-3 {\n    margin-bottom: 1rem !important;\n  }\n  .mb-xl-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .mb-xl-5 {\n    margin-bottom: 3rem !important;\n  }\n  .mb-xl-auto {\n    margin-bottom: auto !important;\n  }\n  .ms-xl-0 {\n    margin-right: 0 !important;\n  }\n  .ms-xl-1 {\n    margin-right: 0.25rem !important;\n  }\n  .ms-xl-2 {\n    margin-right: 0.5rem !important;\n  }\n  .ms-xl-3 {\n    margin-right: 1rem !important;\n  }\n  .ms-xl-4 {\n    margin-right: 1.5rem !important;\n  }\n  .ms-xl-5 {\n    margin-right: 3rem !important;\n  }\n  .ms-xl-auto {\n    margin-right: auto !important;\n  }\n  .p-xl-0 {\n    padding: 0 !important;\n  }\n  .p-xl-1 {\n    padding: 0.25rem !important;\n  }\n  .p-xl-2 {\n    padding: 0.5rem !important;\n  }\n  .p-xl-3 {\n    padding: 1rem !important;\n  }\n  .p-xl-4 {\n    padding: 1.5rem !important;\n  }\n  .p-xl-5 {\n    padding: 3rem !important;\n  }\n  .px-xl-0 {\n    padding-left: 0 !important;\n    padding-right: 0 !important;\n  }\n  .px-xl-1 {\n    padding-left: 0.25rem !important;\n    padding-right: 0.25rem !important;\n  }\n  .px-xl-2 {\n    padding-left: 0.5rem !important;\n    padding-right: 0.5rem !important;\n  }\n  .px-xl-3 {\n    padding-left: 1rem !important;\n    padding-right: 1rem !important;\n  }\n  .px-xl-4 {\n    padding-left: 1.5rem !important;\n    padding-right: 1.5rem !important;\n  }\n  .px-xl-5 {\n    padding-left: 3rem !important;\n    padding-right: 3rem !important;\n  }\n  .py-xl-0 {\n    padding-top: 0 !important;\n    padding-bottom: 0 !important;\n  }\n  .py-xl-1 {\n    padding-top: 0.25rem !important;\n    padding-bottom: 0.25rem !important;\n  }\n  .py-xl-2 {\n    padding-top: 0.5rem !important;\n    padding-bottom: 0.5rem !important;\n  }\n  .py-xl-3 {\n    padding-top: 1rem !important;\n    padding-bottom: 1rem !important;\n  }\n  .py-xl-4 {\n    padding-top: 1.5rem !important;\n    padding-bottom: 1.5rem !important;\n  }\n  .py-xl-5 {\n    padding-top: 3rem !important;\n    padding-bottom: 3rem !important;\n  }\n  .pt-xl-0 {\n    padding-top: 0 !important;\n  }\n  .pt-xl-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pt-xl-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pt-xl-3 {\n    padding-top: 1rem !important;\n  }\n  .pt-xl-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pt-xl-5 {\n    padding-top: 3rem !important;\n  }\n  .pe-xl-0 {\n    padding-left: 0 !important;\n  }\n  .pe-xl-1 {\n    padding-left: 0.25rem !important;\n  }\n  .pe-xl-2 {\n    padding-left: 0.5rem !important;\n  }\n  .pe-xl-3 {\n    padding-left: 1rem !important;\n  }\n  .pe-xl-4 {\n    padding-left: 1.5rem !important;\n  }\n  .pe-xl-5 {\n    padding-left: 3rem !important;\n  }\n  .pb-xl-0 {\n    padding-bottom: 0 !important;\n  }\n  .pb-xl-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pb-xl-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pb-xl-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pb-xl-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pb-xl-5 {\n    padding-bottom: 3rem !important;\n  }\n  .ps-xl-0 {\n    padding-right: 0 !important;\n  }\n  .ps-xl-1 {\n    padding-right: 0.25rem !important;\n  }\n  .ps-xl-2 {\n    padding-right: 0.5rem !important;\n  }\n  .ps-xl-3 {\n    padding-right: 1rem !important;\n  }\n  .ps-xl-4 {\n    padding-right: 1.5rem !important;\n  }\n  .ps-xl-5 {\n    padding-right: 3rem !important;\n  }\n  .gap-xl-0 {\n    gap: 0 !important;\n  }\n  .gap-xl-1 {\n    gap: 0.25rem !important;\n  }\n  .gap-xl-2 {\n    gap: 0.5rem !important;\n  }\n  .gap-xl-3 {\n    gap: 1rem !important;\n  }\n  .gap-xl-4 {\n    gap: 1.5rem !important;\n  }\n  .gap-xl-5 {\n    gap: 3rem !important;\n  }\n  .row-gap-xl-0 {\n    row-gap: 0 !important;\n  }\n  .row-gap-xl-1 {\n    row-gap: 0.25rem !important;\n  }\n  .row-gap-xl-2 {\n    row-gap: 0.5rem !important;\n  }\n  .row-gap-xl-3 {\n    row-gap: 1rem !important;\n  }\n  .row-gap-xl-4 {\n    row-gap: 1.5rem !important;\n  }\n  .row-gap-xl-5 {\n    row-gap: 3rem !important;\n  }\n  .column-gap-xl-0 {\n    -moz-column-gap: 0 !important;\n    column-gap: 0 !important;\n  }\n  .column-gap-xl-1 {\n    -moz-column-gap: 0.25rem !important;\n    column-gap: 0.25rem !important;\n  }\n  .column-gap-xl-2 {\n    -moz-column-gap: 0.5rem !important;\n    column-gap: 0.5rem !important;\n  }\n  .column-gap-xl-3 {\n    -moz-column-gap: 1rem !important;\n    column-gap: 1rem !important;\n  }\n  .column-gap-xl-4 {\n    -moz-column-gap: 1.5rem !important;\n    column-gap: 1.5rem !important;\n  }\n  .column-gap-xl-5 {\n    -moz-column-gap: 3rem !important;\n    column-gap: 3rem !important;\n  }\n  .text-xl-start {\n    text-align: right !important;\n  }\n  .text-xl-end {\n    text-align: left !important;\n  }\n  .text-xl-center {\n    text-align: center !important;\n  }\n}\n@media (min-width: 1400px) {\n  .float-xxl-start {\n    float: right !important;\n  }\n  .float-xxl-end {\n    float: left !important;\n  }\n  .float-xxl-none {\n    float: none !important;\n  }\n  .object-fit-xxl-contain {\n    -o-object-fit: contain !important;\n    object-fit: contain !important;\n  }\n  .object-fit-xxl-cover {\n    -o-object-fit: cover !important;\n    object-fit: cover !important;\n  }\n  .object-fit-xxl-fill {\n    -o-object-fit: fill !important;\n    object-fit: fill !important;\n  }\n  .object-fit-xxl-scale {\n    -o-object-fit: scale-down !important;\n    object-fit: scale-down !important;\n  }\n  .object-fit-xxl-none {\n    -o-object-fit: none !important;\n    object-fit: none !important;\n  }\n  .d-xxl-inline {\n    display: inline !important;\n  }\n  .d-xxl-inline-block {\n    display: inline-block !important;\n  }\n  .d-xxl-block {\n    display: block !important;\n  }\n  .d-xxl-grid {\n    display: grid !important;\n  }\n  .d-xxl-inline-grid {\n    display: inline-grid !important;\n  }\n  .d-xxl-table {\n    display: table !important;\n  }\n  .d-xxl-table-row {\n    display: table-row !important;\n  }\n  .d-xxl-table-cell {\n    display: table-cell !important;\n  }\n  .d-xxl-flex {\n    display: flex !important;\n  }\n  .d-xxl-inline-flex {\n    display: inline-flex !important;\n  }\n  .d-xxl-none {\n    display: none !important;\n  }\n  .flex-xxl-fill {\n    flex: 1 1 auto !important;\n  }\n  .flex-xxl-row {\n    flex-direction: row !important;\n  }\n  .flex-xxl-column {\n    flex-direction: column !important;\n  }\n  .flex-xxl-row-reverse {\n    flex-direction: row-reverse !important;\n  }\n  .flex-xxl-column-reverse {\n    flex-direction: column-reverse !important;\n  }\n  .flex-xxl-grow-0 {\n    flex-grow: 0 !important;\n  }\n  .flex-xxl-grow-1 {\n    flex-grow: 1 !important;\n  }\n  .flex-xxl-shrink-0 {\n    flex-shrink: 0 !important;\n  }\n  .flex-xxl-shrink-1 {\n    flex-shrink: 1 !important;\n  }\n  .flex-xxl-wrap {\n    flex-wrap: wrap !important;\n  }\n  .flex-xxl-nowrap {\n    flex-wrap: nowrap !important;\n  }\n  .flex-xxl-wrap-reverse {\n    flex-wrap: wrap-reverse !important;\n  }\n  .justify-content-xxl-start {\n    justify-content: flex-start !important;\n  }\n  .justify-content-xxl-end {\n    justify-content: flex-end !important;\n  }\n  .justify-content-xxl-center {\n    justify-content: center !important;\n  }\n  .justify-content-xxl-between {\n    justify-content: space-between !important;\n  }\n  .justify-content-xxl-around {\n    justify-content: space-around !important;\n  }\n  .justify-content-xxl-evenly {\n    justify-content: space-evenly !important;\n  }\n  .align-items-xxl-start {\n    align-items: flex-start !important;\n  }\n  .align-items-xxl-end {\n    align-items: flex-end !important;\n  }\n  .align-items-xxl-center {\n    align-items: center !important;\n  }\n  .align-items-xxl-baseline {\n    align-items: baseline !important;\n  }\n  .align-items-xxl-stretch {\n    align-items: stretch !important;\n  }\n  .align-content-xxl-start {\n    align-content: flex-start !important;\n  }\n  .align-content-xxl-end {\n    align-content: flex-end !important;\n  }\n  .align-content-xxl-center {\n    align-content: center !important;\n  }\n  .align-content-xxl-between {\n    align-content: space-between !important;\n  }\n  .align-content-xxl-around {\n    align-content: space-around !important;\n  }\n  .align-content-xxl-stretch {\n    align-content: stretch !important;\n  }\n  .align-self-xxl-auto {\n    align-self: auto !important;\n  }\n  .align-self-xxl-start {\n    align-self: flex-start !important;\n  }\n  .align-self-xxl-end {\n    align-self: flex-end !important;\n  }\n  .align-self-xxl-center {\n    align-self: center !important;\n  }\n  .align-self-xxl-baseline {\n    align-self: baseline !important;\n  }\n  .align-self-xxl-stretch {\n    align-self: stretch !important;\n  }\n  .order-xxl-first {\n    order: -1 !important;\n  }\n  .order-xxl-0 {\n    order: 0 !important;\n  }\n  .order-xxl-1 {\n    order: 1 !important;\n  }\n  .order-xxl-2 {\n    order: 2 !important;\n  }\n  .order-xxl-3 {\n    order: 3 !important;\n  }\n  .order-xxl-4 {\n    order: 4 !important;\n  }\n  .order-xxl-5 {\n    order: 5 !important;\n  }\n  .order-xxl-last {\n    order: 6 !important;\n  }\n  .m-xxl-0 {\n    margin: 0 !important;\n  }\n  .m-xxl-1 {\n    margin: 0.25rem !important;\n  }\n  .m-xxl-2 {\n    margin: 0.5rem !important;\n  }\n  .m-xxl-3 {\n    margin: 1rem !important;\n  }\n  .m-xxl-4 {\n    margin: 1.5rem !important;\n  }\n  .m-xxl-5 {\n    margin: 3rem !important;\n  }\n  .m-xxl-auto {\n    margin: auto !important;\n  }\n  .mx-xxl-0 {\n    margin-left: 0 !important;\n    margin-right: 0 !important;\n  }\n  .mx-xxl-1 {\n    margin-left: 0.25rem !important;\n    margin-right: 0.25rem !important;\n  }\n  .mx-xxl-2 {\n    margin-left: 0.5rem !important;\n    margin-right: 0.5rem !important;\n  }\n  .mx-xxl-3 {\n    margin-left: 1rem !important;\n    margin-right: 1rem !important;\n  }\n  .mx-xxl-4 {\n    margin-left: 1.5rem !important;\n    margin-right: 1.5rem !important;\n  }\n  .mx-xxl-5 {\n    margin-left: 3rem !important;\n    margin-right: 3rem !important;\n  }\n  .mx-xxl-auto {\n    margin-left: auto !important;\n    margin-right: auto !important;\n  }\n  .my-xxl-0 {\n    margin-top: 0 !important;\n    margin-bottom: 0 !important;\n  }\n  .my-xxl-1 {\n    margin-top: 0.25rem !important;\n    margin-bottom: 0.25rem !important;\n  }\n  .my-xxl-2 {\n    margin-top: 0.5rem !important;\n    margin-bottom: 0.5rem !important;\n  }\n  .my-xxl-3 {\n    margin-top: 1rem !important;\n    margin-bottom: 1rem !important;\n  }\n  .my-xxl-4 {\n    margin-top: 1.5rem !important;\n    margin-bottom: 1.5rem !important;\n  }\n  .my-xxl-5 {\n    margin-top: 3rem !important;\n    margin-bottom: 3rem !important;\n  }\n  .my-xxl-auto {\n    margin-top: auto !important;\n    margin-bottom: auto !important;\n  }\n  .mt-xxl-0 {\n    margin-top: 0 !important;\n  }\n  .mt-xxl-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mt-xxl-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mt-xxl-3 {\n    margin-top: 1rem !important;\n  }\n  .mt-xxl-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mt-xxl-5 {\n    margin-top: 3rem !important;\n  }\n  .mt-xxl-auto {\n    margin-top: auto !important;\n  }\n  .me-xxl-0 {\n    margin-left: 0 !important;\n  }\n  .me-xxl-1 {\n    margin-left: 0.25rem !important;\n  }\n  .me-xxl-2 {\n    margin-left: 0.5rem !important;\n  }\n  .me-xxl-3 {\n    margin-left: 1rem !important;\n  }\n  .me-xxl-4 {\n    margin-left: 1.5rem !important;\n  }\n  .me-xxl-5 {\n    margin-left: 3rem !important;\n  }\n  .me-xxl-auto {\n    margin-left: auto !important;\n  }\n  .mb-xxl-0 {\n    margin-bottom: 0 !important;\n  }\n  .mb-xxl-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .mb-xxl-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .mb-xxl-3 {\n    margin-bottom: 1rem !important;\n  }\n  .mb-xxl-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .mb-xxl-5 {\n    margin-bottom: 3rem !important;\n  }\n  .mb-xxl-auto {\n    margin-bottom: auto !important;\n  }\n  .ms-xxl-0 {\n    margin-right: 0 !important;\n  }\n  .ms-xxl-1 {\n    margin-right: 0.25rem !important;\n  }\n  .ms-xxl-2 {\n    margin-right: 0.5rem !important;\n  }\n  .ms-xxl-3 {\n    margin-right: 1rem !important;\n  }\n  .ms-xxl-4 {\n    margin-right: 1.5rem !important;\n  }\n  .ms-xxl-5 {\n    margin-right: 3rem !important;\n  }\n  .ms-xxl-auto {\n    margin-right: auto !important;\n  }\n  .p-xxl-0 {\n    padding: 0 !important;\n  }\n  .p-xxl-1 {\n    padding: 0.25rem !important;\n  }\n  .p-xxl-2 {\n    padding: 0.5rem !important;\n  }\n  .p-xxl-3 {\n    padding: 1rem !important;\n  }\n  .p-xxl-4 {\n    padding: 1.5rem !important;\n  }\n  .p-xxl-5 {\n    padding: 3rem !important;\n  }\n  .px-xxl-0 {\n    padding-left: 0 !important;\n    padding-right: 0 !important;\n  }\n  .px-xxl-1 {\n    padding-left: 0.25rem !important;\n    padding-right: 0.25rem !important;\n  }\n  .px-xxl-2 {\n    padding-left: 0.5rem !important;\n    padding-right: 0.5rem !important;\n  }\n  .px-xxl-3 {\n    padding-left: 1rem !important;\n    padding-right: 1rem !important;\n  }\n  .px-xxl-4 {\n    padding-left: 1.5rem !important;\n    padding-right: 1.5rem !important;\n  }\n  .px-xxl-5 {\n    padding-left: 3rem !important;\n    padding-right: 3rem !important;\n  }\n  .py-xxl-0 {\n    padding-top: 0 !important;\n    padding-bottom: 0 !important;\n  }\n  .py-xxl-1 {\n    padding-top: 0.25rem !important;\n    padding-bottom: 0.25rem !important;\n  }\n  .py-xxl-2 {\n    padding-top: 0.5rem !important;\n    padding-bottom: 0.5rem !important;\n  }\n  .py-xxl-3 {\n    padding-top: 1rem !important;\n    padding-bottom: 1rem !important;\n  }\n  .py-xxl-4 {\n    padding-top: 1.5rem !important;\n    padding-bottom: 1.5rem !important;\n  }\n  .py-xxl-5 {\n    padding-top: 3rem !important;\n    padding-bottom: 3rem !important;\n  }\n  .pt-xxl-0 {\n    padding-top: 0 !important;\n  }\n  .pt-xxl-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pt-xxl-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pt-xxl-3 {\n    padding-top: 1rem !important;\n  }\n  .pt-xxl-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pt-xxl-5 {\n    padding-top: 3rem !important;\n  }\n  .pe-xxl-0 {\n    padding-left: 0 !important;\n  }\n  .pe-xxl-1 {\n    padding-left: 0.25rem !important;\n  }\n  .pe-xxl-2 {\n    padding-left: 0.5rem !important;\n  }\n  .pe-xxl-3 {\n    padding-left: 1rem !important;\n  }\n  .pe-xxl-4 {\n    padding-left: 1.5rem !important;\n  }\n  .pe-xxl-5 {\n    padding-left: 3rem !important;\n  }\n  .pb-xxl-0 {\n    padding-bottom: 0 !important;\n  }\n  .pb-xxl-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pb-xxl-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pb-xxl-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pb-xxl-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pb-xxl-5 {\n    padding-bottom: 3rem !important;\n  }\n  .ps-xxl-0 {\n    padding-right: 0 !important;\n  }\n  .ps-xxl-1 {\n    padding-right: 0.25rem !important;\n  }\n  .ps-xxl-2 {\n    padding-right: 0.5rem !important;\n  }\n  .ps-xxl-3 {\n    padding-right: 1rem !important;\n  }\n  .ps-xxl-4 {\n    padding-right: 1.5rem !important;\n  }\n  .ps-xxl-5 {\n    padding-right: 3rem !important;\n  }\n  .gap-xxl-0 {\n    gap: 0 !important;\n  }\n  .gap-xxl-1 {\n    gap: 0.25rem !important;\n  }\n  .gap-xxl-2 {\n    gap: 0.5rem !important;\n  }\n  .gap-xxl-3 {\n    gap: 1rem !important;\n  }\n  .gap-xxl-4 {\n    gap: 1.5rem !important;\n  }\n  .gap-xxl-5 {\n    gap: 3rem !important;\n  }\n  .row-gap-xxl-0 {\n    row-gap: 0 !important;\n  }\n  .row-gap-xxl-1 {\n    row-gap: 0.25rem !important;\n  }\n  .row-gap-xxl-2 {\n    row-gap: 0.5rem !important;\n  }\n  .row-gap-xxl-3 {\n    row-gap: 1rem !important;\n  }\n  .row-gap-xxl-4 {\n    row-gap: 1.5rem !important;\n  }\n  .row-gap-xxl-5 {\n    row-gap: 3rem !important;\n  }\n  .column-gap-xxl-0 {\n    -moz-column-gap: 0 !important;\n    column-gap: 0 !important;\n  }\n  .column-gap-xxl-1 {\n    -moz-column-gap: 0.25rem !important;\n    column-gap: 0.25rem !important;\n  }\n  .column-gap-xxl-2 {\n    -moz-column-gap: 0.5rem !important;\n    column-gap: 0.5rem !important;\n  }\n  .column-gap-xxl-3 {\n    -moz-column-gap: 1rem !important;\n    column-gap: 1rem !important;\n  }\n  .column-gap-xxl-4 {\n    -moz-column-gap: 1.5rem !important;\n    column-gap: 1.5rem !important;\n  }\n  .column-gap-xxl-5 {\n    -moz-column-gap: 3rem !important;\n    column-gap: 3rem !important;\n  }\n  .text-xxl-start {\n    text-align: right !important;\n  }\n  .text-xxl-end {\n    text-align: left !important;\n  }\n  .text-xxl-center {\n    text-align: center !important;\n  }\n}\n@media (min-width: 1200px) {\n  .fs-1 {\n    font-size: 2.5rem !important;\n  }\n  .fs-2 {\n    font-size: 2rem !important;\n  }\n  .fs-3 {\n    font-size: 1.75rem !important;\n  }\n  .fs-4 {\n    font-size: 1.5rem !important;\n  }\n}\n@media print {\n  .d-print-inline {\n    display: inline !important;\n  }\n  .d-print-inline-block {\n    display: inline-block !important;\n  }\n  .d-print-block {\n    display: block !important;\n  }\n  .d-print-grid {\n    display: grid !important;\n  }\n  .d-print-inline-grid {\n    display: inline-grid !important;\n  }\n  .d-print-table {\n    display: table !important;\n  }\n  .d-print-table-row {\n    display: table-row !important;\n  }\n  .d-print-table-cell {\n    display: table-cell !important;\n  }\n  .d-print-flex {\n    display: flex !important;\n  }\n  .d-print-inline-flex {\n    display: inline-flex !important;\n  }\n  .d-print-none {\n    display: none !important;\n  }\n}\n/*# sourceMappingURL=bootstrap-utilities.rtl.css.map */"
  },
  {
    "path": "dist/css/bootstrap.css",
    "content": "@charset \"UTF-8\";\n/*!\n * Bootstrap  v5.3.8 (https://getbootstrap.com/)\n * Copyright 2011-2025 The Bootstrap Authors\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n:root,\n[data-bs-theme=light] {\n  --bs-blue: #0d6efd;\n  --bs-indigo: #6610f2;\n  --bs-purple: #6f42c1;\n  --bs-pink: #d63384;\n  --bs-red: #dc3545;\n  --bs-orange: #fd7e14;\n  --bs-yellow: #ffc107;\n  --bs-green: #198754;\n  --bs-teal: #20c997;\n  --bs-cyan: #0dcaf0;\n  --bs-black: #000;\n  --bs-white: #fff;\n  --bs-gray: #6c757d;\n  --bs-gray-dark: #343a40;\n  --bs-gray-100: #f8f9fa;\n  --bs-gray-200: #e9ecef;\n  --bs-gray-300: #dee2e6;\n  --bs-gray-400: #ced4da;\n  --bs-gray-500: #adb5bd;\n  --bs-gray-600: #6c757d;\n  --bs-gray-700: #495057;\n  --bs-gray-800: #343a40;\n  --bs-gray-900: #212529;\n  --bs-primary: #0d6efd;\n  --bs-secondary: #6c757d;\n  --bs-success: #198754;\n  --bs-info: #0dcaf0;\n  --bs-warning: #ffc107;\n  --bs-danger: #dc3545;\n  --bs-light: #f8f9fa;\n  --bs-dark: #212529;\n  --bs-primary-rgb: 13, 110, 253;\n  --bs-secondary-rgb: 108, 117, 125;\n  --bs-success-rgb: 25, 135, 84;\n  --bs-info-rgb: 13, 202, 240;\n  --bs-warning-rgb: 255, 193, 7;\n  --bs-danger-rgb: 220, 53, 69;\n  --bs-light-rgb: 248, 249, 250;\n  --bs-dark-rgb: 33, 37, 41;\n  --bs-primary-text-emphasis: #052c65;\n  --bs-secondary-text-emphasis: #2b2f32;\n  --bs-success-text-emphasis: #0a3622;\n  --bs-info-text-emphasis: #055160;\n  --bs-warning-text-emphasis: #664d03;\n  --bs-danger-text-emphasis: #58151c;\n  --bs-light-text-emphasis: #495057;\n  --bs-dark-text-emphasis: #495057;\n  --bs-primary-bg-subtle: #cfe2ff;\n  --bs-secondary-bg-subtle: #e2e3e5;\n  --bs-success-bg-subtle: #d1e7dd;\n  --bs-info-bg-subtle: #cff4fc;\n  --bs-warning-bg-subtle: #fff3cd;\n  --bs-danger-bg-subtle: #f8d7da;\n  --bs-light-bg-subtle: #fcfcfd;\n  --bs-dark-bg-subtle: #ced4da;\n  --bs-primary-border-subtle: #9ec5fe;\n  --bs-secondary-border-subtle: #c4c8cb;\n  --bs-success-border-subtle: #a3cfbb;\n  --bs-info-border-subtle: #9eeaf9;\n  --bs-warning-border-subtle: #ffe69c;\n  --bs-danger-border-subtle: #f1aeb5;\n  --bs-light-border-subtle: #e9ecef;\n  --bs-dark-border-subtle: #adb5bd;\n  --bs-white-rgb: 255, 255, 255;\n  --bs-black-rgb: 0, 0, 0;\n  --bs-font-sans-serif: system-ui, -apple-system, \"Segoe UI\", Roboto, \"Helvetica Neue\", \"Noto Sans\", \"Liberation Sans\", Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n  --bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n  --bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));\n  --bs-body-font-family: var(--bs-font-sans-serif);\n  --bs-body-font-size: 1rem;\n  --bs-body-font-weight: 400;\n  --bs-body-line-height: 1.5;\n  --bs-body-color: #212529;\n  --bs-body-color-rgb: 33, 37, 41;\n  --bs-body-bg: #fff;\n  --bs-body-bg-rgb: 255, 255, 255;\n  --bs-emphasis-color: #000;\n  --bs-emphasis-color-rgb: 0, 0, 0;\n  --bs-secondary-color: rgba(33, 37, 41, 0.75);\n  --bs-secondary-color-rgb: 33, 37, 41;\n  --bs-secondary-bg: #e9ecef;\n  --bs-secondary-bg-rgb: 233, 236, 239;\n  --bs-tertiary-color: rgba(33, 37, 41, 0.5);\n  --bs-tertiary-color-rgb: 33, 37, 41;\n  --bs-tertiary-bg: #f8f9fa;\n  --bs-tertiary-bg-rgb: 248, 249, 250;\n  --bs-heading-color: inherit;\n  --bs-link-color: #0d6efd;\n  --bs-link-color-rgb: 13, 110, 253;\n  --bs-link-decoration: underline;\n  --bs-link-hover-color: #0a58ca;\n  --bs-link-hover-color-rgb: 10, 88, 202;\n  --bs-code-color: #d63384;\n  --bs-highlight-color: #212529;\n  --bs-highlight-bg: #fff3cd;\n  --bs-border-width: 1px;\n  --bs-border-style: solid;\n  --bs-border-color: #dee2e6;\n  --bs-border-color-translucent: rgba(0, 0, 0, 0.175);\n  --bs-border-radius: 0.375rem;\n  --bs-border-radius-sm: 0.25rem;\n  --bs-border-radius-lg: 0.5rem;\n  --bs-border-radius-xl: 1rem;\n  --bs-border-radius-xxl: 2rem;\n  --bs-border-radius-2xl: var(--bs-border-radius-xxl);\n  --bs-border-radius-pill: 50rem;\n  --bs-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);\n  --bs-box-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);\n  --bs-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175);\n  --bs-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075);\n  --bs-focus-ring-width: 0.25rem;\n  --bs-focus-ring-opacity: 0.25;\n  --bs-focus-ring-color: rgba(13, 110, 253, 0.25);\n  --bs-form-valid-color: #198754;\n  --bs-form-valid-border-color: #198754;\n  --bs-form-invalid-color: #dc3545;\n  --bs-form-invalid-border-color: #dc3545;\n}\n\n[data-bs-theme=dark] {\n  color-scheme: dark;\n  --bs-body-color: #dee2e6;\n  --bs-body-color-rgb: 222, 226, 230;\n  --bs-body-bg: #212529;\n  --bs-body-bg-rgb: 33, 37, 41;\n  --bs-emphasis-color: #fff;\n  --bs-emphasis-color-rgb: 255, 255, 255;\n  --bs-secondary-color: rgba(222, 226, 230, 0.75);\n  --bs-secondary-color-rgb: 222, 226, 230;\n  --bs-secondary-bg: #343a40;\n  --bs-secondary-bg-rgb: 52, 58, 64;\n  --bs-tertiary-color: rgba(222, 226, 230, 0.5);\n  --bs-tertiary-color-rgb: 222, 226, 230;\n  --bs-tertiary-bg: #2b3035;\n  --bs-tertiary-bg-rgb: 43, 48, 53;\n  --bs-primary-text-emphasis: #6ea8fe;\n  --bs-secondary-text-emphasis: #a7acb1;\n  --bs-success-text-emphasis: #75b798;\n  --bs-info-text-emphasis: #6edff6;\n  --bs-warning-text-emphasis: #ffda6a;\n  --bs-danger-text-emphasis: #ea868f;\n  --bs-light-text-emphasis: #f8f9fa;\n  --bs-dark-text-emphasis: #dee2e6;\n  --bs-primary-bg-subtle: #031633;\n  --bs-secondary-bg-subtle: #161719;\n  --bs-success-bg-subtle: #051b11;\n  --bs-info-bg-subtle: #032830;\n  --bs-warning-bg-subtle: #332701;\n  --bs-danger-bg-subtle: #2c0b0e;\n  --bs-light-bg-subtle: #343a40;\n  --bs-dark-bg-subtle: #1a1d20;\n  --bs-primary-border-subtle: #084298;\n  --bs-secondary-border-subtle: #41464b;\n  --bs-success-border-subtle: #0f5132;\n  --bs-info-border-subtle: #087990;\n  --bs-warning-border-subtle: #997404;\n  --bs-danger-border-subtle: #842029;\n  --bs-light-border-subtle: #495057;\n  --bs-dark-border-subtle: #343a40;\n  --bs-heading-color: inherit;\n  --bs-link-color: #6ea8fe;\n  --bs-link-hover-color: #8bb9fe;\n  --bs-link-color-rgb: 110, 168, 254;\n  --bs-link-hover-color-rgb: 139, 185, 254;\n  --bs-code-color: #e685b5;\n  --bs-highlight-color: #dee2e6;\n  --bs-highlight-bg: #664d03;\n  --bs-border-color: #495057;\n  --bs-border-color-translucent: rgba(255, 255, 255, 0.15);\n  --bs-form-valid-color: #75b798;\n  --bs-form-valid-border-color: #75b798;\n  --bs-form-invalid-color: #ea868f;\n  --bs-form-invalid-border-color: #ea868f;\n}\n\n*,\n*::before,\n*::after {\n  box-sizing: border-box;\n}\n\n@media (prefers-reduced-motion: no-preference) {\n  :root {\n    scroll-behavior: smooth;\n  }\n}\n\nbody {\n  margin: 0;\n  font-family: var(--bs-body-font-family);\n  font-size: var(--bs-body-font-size);\n  font-weight: var(--bs-body-font-weight);\n  line-height: var(--bs-body-line-height);\n  color: var(--bs-body-color);\n  text-align: var(--bs-body-text-align);\n  background-color: var(--bs-body-bg);\n  -webkit-text-size-adjust: 100%;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\nhr {\n  margin: 1rem 0;\n  color: inherit;\n  border: 0;\n  border-top: var(--bs-border-width) solid;\n  opacity: 0.25;\n}\n\nh6, .h6, h5, .h5, h4, .h4, h3, .h3, h2, .h2, h1, .h1 {\n  margin-top: 0;\n  margin-bottom: 0.5rem;\n  font-weight: 500;\n  line-height: 1.2;\n  color: var(--bs-heading-color);\n}\n\nh1, .h1 {\n  font-size: calc(1.375rem + 1.5vw);\n}\n@media (min-width: 1200px) {\n  h1, .h1 {\n    font-size: 2.5rem;\n  }\n}\n\nh2, .h2 {\n  font-size: calc(1.325rem + 0.9vw);\n}\n@media (min-width: 1200px) {\n  h2, .h2 {\n    font-size: 2rem;\n  }\n}\n\nh3, .h3 {\n  font-size: calc(1.3rem + 0.6vw);\n}\n@media (min-width: 1200px) {\n  h3, .h3 {\n    font-size: 1.75rem;\n  }\n}\n\nh4, .h4 {\n  font-size: calc(1.275rem + 0.3vw);\n}\n@media (min-width: 1200px) {\n  h4, .h4 {\n    font-size: 1.5rem;\n  }\n}\n\nh5, .h5 {\n  font-size: 1.25rem;\n}\n\nh6, .h6 {\n  font-size: 1rem;\n}\n\np {\n  margin-top: 0;\n  margin-bottom: 1rem;\n}\n\nabbr[title] {\n  -webkit-text-decoration: underline dotted;\n  text-decoration: underline dotted;\n  cursor: help;\n  -webkit-text-decoration-skip-ink: none;\n  text-decoration-skip-ink: none;\n}\n\naddress {\n  margin-bottom: 1rem;\n  font-style: normal;\n  line-height: inherit;\n}\n\nol,\nul {\n  padding-left: 2rem;\n}\n\nol,\nul,\ndl {\n  margin-top: 0;\n  margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n  margin-bottom: 0;\n}\n\ndt {\n  font-weight: 700;\n}\n\ndd {\n  margin-bottom: 0.5rem;\n  margin-left: 0;\n}\n\nblockquote {\n  margin: 0 0 1rem;\n}\n\nb,\nstrong {\n  font-weight: bolder;\n}\n\nsmall, .small {\n  font-size: 0.875em;\n}\n\nmark, .mark {\n  padding: 0.1875em;\n  color: var(--bs-highlight-color);\n  background-color: var(--bs-highlight-bg);\n}\n\nsub,\nsup {\n  position: relative;\n  font-size: 0.75em;\n  line-height: 0;\n  vertical-align: baseline;\n}\n\nsub {\n  bottom: -0.25em;\n}\n\nsup {\n  top: -0.5em;\n}\n\na {\n  color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 1));\n  text-decoration: underline;\n}\na:hover {\n  --bs-link-color-rgb: var(--bs-link-hover-color-rgb);\n}\n\na:not([href]):not([class]), a:not([href]):not([class]):hover {\n  color: inherit;\n  text-decoration: none;\n}\n\npre,\ncode,\nkbd,\nsamp {\n  font-family: var(--bs-font-monospace);\n  font-size: 1em;\n}\n\npre {\n  display: block;\n  margin-top: 0;\n  margin-bottom: 1rem;\n  overflow: auto;\n  font-size: 0.875em;\n}\npre code {\n  font-size: inherit;\n  color: inherit;\n  word-break: normal;\n}\n\ncode {\n  font-size: 0.875em;\n  color: var(--bs-code-color);\n  word-wrap: break-word;\n}\na > code {\n  color: inherit;\n}\n\nkbd {\n  padding: 0.1875rem 0.375rem;\n  font-size: 0.875em;\n  color: var(--bs-body-bg);\n  background-color: var(--bs-body-color);\n  border-radius: 0.25rem;\n}\nkbd kbd {\n  padding: 0;\n  font-size: 1em;\n}\n\nfigure {\n  margin: 0 0 1rem;\n}\n\nimg,\nsvg {\n  vertical-align: middle;\n}\n\ntable {\n  caption-side: bottom;\n  border-collapse: collapse;\n}\n\ncaption {\n  padding-top: 0.5rem;\n  padding-bottom: 0.5rem;\n  color: var(--bs-secondary-color);\n  text-align: left;\n}\n\nth {\n  text-align: inherit;\n  text-align: -webkit-match-parent;\n}\n\nthead,\ntbody,\ntfoot,\ntr,\ntd,\nth {\n  border-color: inherit;\n  border-style: solid;\n  border-width: 0;\n}\n\nlabel {\n  display: inline-block;\n}\n\nbutton {\n  border-radius: 0;\n}\n\nbutton:focus:not(:focus-visible) {\n  outline: 0;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n  margin: 0;\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\n\nbutton,\nselect {\n  text-transform: none;\n}\n\n[role=button] {\n  cursor: pointer;\n}\n\nselect {\n  word-wrap: normal;\n}\nselect:disabled {\n  opacity: 1;\n}\n\n[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator {\n  display: none !important;\n}\n\nbutton,\n[type=button],\n[type=reset],\n[type=submit] {\n  -webkit-appearance: button;\n}\nbutton:not(:disabled),\n[type=button]:not(:disabled),\n[type=reset]:not(:disabled),\n[type=submit]:not(:disabled) {\n  cursor: pointer;\n}\n\n::-moz-focus-inner {\n  padding: 0;\n  border-style: none;\n}\n\ntextarea {\n  resize: vertical;\n}\n\nfieldset {\n  min-width: 0;\n  padding: 0;\n  margin: 0;\n  border: 0;\n}\n\nlegend {\n  float: left;\n  width: 100%;\n  padding: 0;\n  margin-bottom: 0.5rem;\n  line-height: inherit;\n  font-size: calc(1.275rem + 0.3vw);\n}\n@media (min-width: 1200px) {\n  legend {\n    font-size: 1.5rem;\n  }\n}\nlegend + * {\n  clear: left;\n}\n\n::-webkit-datetime-edit-fields-wrapper,\n::-webkit-datetime-edit-text,\n::-webkit-datetime-edit-minute,\n::-webkit-datetime-edit-hour-field,\n::-webkit-datetime-edit-day-field,\n::-webkit-datetime-edit-month-field,\n::-webkit-datetime-edit-year-field {\n  padding: 0;\n}\n\n::-webkit-inner-spin-button {\n  height: auto;\n}\n\n[type=search] {\n  -webkit-appearance: textfield;\n  outline-offset: -2px;\n}\n[type=search]::-webkit-search-cancel-button {\n  cursor: pointer;\n  filter: grayscale(1);\n}\n\n/* rtl:raw:\n[type=\"tel\"],\n[type=\"url\"],\n[type=\"email\"],\n[type=\"number\"] {\n  direction: ltr;\n}\n*/\n::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\n\n::-webkit-color-swatch-wrapper {\n  padding: 0;\n}\n\n::-webkit-file-upload-button {\n  font: inherit;\n  -webkit-appearance: button;\n}\n\n::file-selector-button {\n  font: inherit;\n  -webkit-appearance: button;\n}\n\noutput {\n  display: inline-block;\n}\n\niframe {\n  border: 0;\n}\n\nsummary {\n  display: list-item;\n  cursor: pointer;\n}\n\nprogress {\n  vertical-align: baseline;\n}\n\n[hidden] {\n  display: none !important;\n}\n\n.lead {\n  font-size: 1.25rem;\n  font-weight: 300;\n}\n\n.display-1 {\n  font-weight: 300;\n  line-height: 1.2;\n  font-size: calc(1.625rem + 4.5vw);\n}\n@media (min-width: 1200px) {\n  .display-1 {\n    font-size: 5rem;\n  }\n}\n\n.display-2 {\n  font-weight: 300;\n  line-height: 1.2;\n  font-size: calc(1.575rem + 3.9vw);\n}\n@media (min-width: 1200px) {\n  .display-2 {\n    font-size: 4.5rem;\n  }\n}\n\n.display-3 {\n  font-weight: 300;\n  line-height: 1.2;\n  font-size: calc(1.525rem + 3.3vw);\n}\n@media (min-width: 1200px) {\n  .display-3 {\n    font-size: 4rem;\n  }\n}\n\n.display-4 {\n  font-weight: 300;\n  line-height: 1.2;\n  font-size: calc(1.475rem + 2.7vw);\n}\n@media (min-width: 1200px) {\n  .display-4 {\n    font-size: 3.5rem;\n  }\n}\n\n.display-5 {\n  font-weight: 300;\n  line-height: 1.2;\n  font-size: calc(1.425rem + 2.1vw);\n}\n@media (min-width: 1200px) {\n  .display-5 {\n    font-size: 3rem;\n  }\n}\n\n.display-6 {\n  font-weight: 300;\n  line-height: 1.2;\n  font-size: calc(1.375rem + 1.5vw);\n}\n@media (min-width: 1200px) {\n  .display-6 {\n    font-size: 2.5rem;\n  }\n}\n\n.list-unstyled {\n  padding-left: 0;\n  list-style: none;\n}\n\n.list-inline {\n  padding-left: 0;\n  list-style: none;\n}\n\n.list-inline-item {\n  display: inline-block;\n}\n.list-inline-item:not(:last-child) {\n  margin-right: 0.5rem;\n}\n\n.initialism {\n  font-size: 0.875em;\n  text-transform: uppercase;\n}\n\n.blockquote {\n  margin-bottom: 1rem;\n  font-size: 1.25rem;\n}\n.blockquote > :last-child {\n  margin-bottom: 0;\n}\n\n.blockquote-footer {\n  margin-top: -1rem;\n  margin-bottom: 1rem;\n  font-size: 0.875em;\n  color: #6c757d;\n}\n.blockquote-footer::before {\n  content: \"— \";\n}\n\n.img-fluid {\n  max-width: 100%;\n  height: auto;\n}\n\n.img-thumbnail {\n  padding: 0.25rem;\n  background-color: var(--bs-body-bg);\n  border: var(--bs-border-width) solid var(--bs-border-color);\n  border-radius: var(--bs-border-radius);\n  max-width: 100%;\n  height: auto;\n}\n\n.figure {\n  display: inline-block;\n}\n\n.figure-img {\n  margin-bottom: 0.5rem;\n  line-height: 1;\n}\n\n.figure-caption {\n  font-size: 0.875em;\n  color: var(--bs-secondary-color);\n}\n\n.container,\n.container-fluid,\n.container-xxl,\n.container-xl,\n.container-lg,\n.container-md,\n.container-sm {\n  --bs-gutter-x: 1.5rem;\n  --bs-gutter-y: 0;\n  width: 100%;\n  padding-right: calc(var(--bs-gutter-x) * 0.5);\n  padding-left: calc(var(--bs-gutter-x) * 0.5);\n  margin-right: auto;\n  margin-left: auto;\n}\n\n@media (min-width: 576px) {\n  .container-sm, .container {\n    max-width: 540px;\n  }\n}\n@media (min-width: 768px) {\n  .container-md, .container-sm, .container {\n    max-width: 720px;\n  }\n}\n@media (min-width: 992px) {\n  .container-lg, .container-md, .container-sm, .container {\n    max-width: 960px;\n  }\n}\n@media (min-width: 1200px) {\n  .container-xl, .container-lg, .container-md, .container-sm, .container {\n    max-width: 1140px;\n  }\n}\n@media (min-width: 1400px) {\n  .container-xxl, .container-xl, .container-lg, .container-md, .container-sm, .container {\n    max-width: 1320px;\n  }\n}\n:root {\n  --bs-breakpoint-xs: 0;\n  --bs-breakpoint-sm: 576px;\n  --bs-breakpoint-md: 768px;\n  --bs-breakpoint-lg: 992px;\n  --bs-breakpoint-xl: 1200px;\n  --bs-breakpoint-xxl: 1400px;\n}\n\n.row {\n  --bs-gutter-x: 1.5rem;\n  --bs-gutter-y: 0;\n  display: flex;\n  flex-wrap: wrap;\n  margin-top: calc(-1 * var(--bs-gutter-y));\n  margin-right: calc(-0.5 * var(--bs-gutter-x));\n  margin-left: calc(-0.5 * var(--bs-gutter-x));\n}\n.row > * {\n  flex-shrink: 0;\n  width: 100%;\n  max-width: 100%;\n  padding-right: calc(var(--bs-gutter-x) * 0.5);\n  padding-left: calc(var(--bs-gutter-x) * 0.5);\n  margin-top: var(--bs-gutter-y);\n}\n\n.col {\n  flex: 1 0 0;\n}\n\n.row-cols-auto > * {\n  flex: 0 0 auto;\n  width: auto;\n}\n\n.row-cols-1 > * {\n  flex: 0 0 auto;\n  width: 100%;\n}\n\n.row-cols-2 > * {\n  flex: 0 0 auto;\n  width: 50%;\n}\n\n.row-cols-3 > * {\n  flex: 0 0 auto;\n  width: 33.33333333%;\n}\n\n.row-cols-4 > * {\n  flex: 0 0 auto;\n  width: 25%;\n}\n\n.row-cols-5 > * {\n  flex: 0 0 auto;\n  width: 20%;\n}\n\n.row-cols-6 > * {\n  flex: 0 0 auto;\n  width: 16.66666667%;\n}\n\n.col-auto {\n  flex: 0 0 auto;\n  width: auto;\n}\n\n.col-1 {\n  flex: 0 0 auto;\n  width: 8.33333333%;\n}\n\n.col-2 {\n  flex: 0 0 auto;\n  width: 16.66666667%;\n}\n\n.col-3 {\n  flex: 0 0 auto;\n  width: 25%;\n}\n\n.col-4 {\n  flex: 0 0 auto;\n  width: 33.33333333%;\n}\n\n.col-5 {\n  flex: 0 0 auto;\n  width: 41.66666667%;\n}\n\n.col-6 {\n  flex: 0 0 auto;\n  width: 50%;\n}\n\n.col-7 {\n  flex: 0 0 auto;\n  width: 58.33333333%;\n}\n\n.col-8 {\n  flex: 0 0 auto;\n  width: 66.66666667%;\n}\n\n.col-9 {\n  flex: 0 0 auto;\n  width: 75%;\n}\n\n.col-10 {\n  flex: 0 0 auto;\n  width: 83.33333333%;\n}\n\n.col-11 {\n  flex: 0 0 auto;\n  width: 91.66666667%;\n}\n\n.col-12 {\n  flex: 0 0 auto;\n  width: 100%;\n}\n\n.offset-1 {\n  margin-left: 8.33333333%;\n}\n\n.offset-2 {\n  margin-left: 16.66666667%;\n}\n\n.offset-3 {\n  margin-left: 25%;\n}\n\n.offset-4 {\n  margin-left: 33.33333333%;\n}\n\n.offset-5 {\n  margin-left: 41.66666667%;\n}\n\n.offset-6 {\n  margin-left: 50%;\n}\n\n.offset-7 {\n  margin-left: 58.33333333%;\n}\n\n.offset-8 {\n  margin-left: 66.66666667%;\n}\n\n.offset-9 {\n  margin-left: 75%;\n}\n\n.offset-10 {\n  margin-left: 83.33333333%;\n}\n\n.offset-11 {\n  margin-left: 91.66666667%;\n}\n\n.g-0,\n.gx-0 {\n  --bs-gutter-x: 0;\n}\n\n.g-0,\n.gy-0 {\n  --bs-gutter-y: 0;\n}\n\n.g-1,\n.gx-1 {\n  --bs-gutter-x: 0.25rem;\n}\n\n.g-1,\n.gy-1 {\n  --bs-gutter-y: 0.25rem;\n}\n\n.g-2,\n.gx-2 {\n  --bs-gutter-x: 0.5rem;\n}\n\n.g-2,\n.gy-2 {\n  --bs-gutter-y: 0.5rem;\n}\n\n.g-3,\n.gx-3 {\n  --bs-gutter-x: 1rem;\n}\n\n.g-3,\n.gy-3 {\n  --bs-gutter-y: 1rem;\n}\n\n.g-4,\n.gx-4 {\n  --bs-gutter-x: 1.5rem;\n}\n\n.g-4,\n.gy-4 {\n  --bs-gutter-y: 1.5rem;\n}\n\n.g-5,\n.gx-5 {\n  --bs-gutter-x: 3rem;\n}\n\n.g-5,\n.gy-5 {\n  --bs-gutter-y: 3rem;\n}\n\n@media (min-width: 576px) {\n  .col-sm {\n    flex: 1 0 0;\n  }\n  .row-cols-sm-auto > * {\n    flex: 0 0 auto;\n    width: auto;\n  }\n  .row-cols-sm-1 > * {\n    flex: 0 0 auto;\n    width: 100%;\n  }\n  .row-cols-sm-2 > * {\n    flex: 0 0 auto;\n    width: 50%;\n  }\n  .row-cols-sm-3 > * {\n    flex: 0 0 auto;\n    width: 33.33333333%;\n  }\n  .row-cols-sm-4 > * {\n    flex: 0 0 auto;\n    width: 25%;\n  }\n  .row-cols-sm-5 > * {\n    flex: 0 0 auto;\n    width: 20%;\n  }\n  .row-cols-sm-6 > * {\n    flex: 0 0 auto;\n    width: 16.66666667%;\n  }\n  .col-sm-auto {\n    flex: 0 0 auto;\n    width: auto;\n  }\n  .col-sm-1 {\n    flex: 0 0 auto;\n    width: 8.33333333%;\n  }\n  .col-sm-2 {\n    flex: 0 0 auto;\n    width: 16.66666667%;\n  }\n  .col-sm-3 {\n    flex: 0 0 auto;\n    width: 25%;\n  }\n  .col-sm-4 {\n    flex: 0 0 auto;\n    width: 33.33333333%;\n  }\n  .col-sm-5 {\n    flex: 0 0 auto;\n    width: 41.66666667%;\n  }\n  .col-sm-6 {\n    flex: 0 0 auto;\n    width: 50%;\n  }\n  .col-sm-7 {\n    flex: 0 0 auto;\n    width: 58.33333333%;\n  }\n  .col-sm-8 {\n    flex: 0 0 auto;\n    width: 66.66666667%;\n  }\n  .col-sm-9 {\n    flex: 0 0 auto;\n    width: 75%;\n  }\n  .col-sm-10 {\n    flex: 0 0 auto;\n    width: 83.33333333%;\n  }\n  .col-sm-11 {\n    flex: 0 0 auto;\n    width: 91.66666667%;\n  }\n  .col-sm-12 {\n    flex: 0 0 auto;\n    width: 100%;\n  }\n  .offset-sm-0 {\n    margin-left: 0;\n  }\n  .offset-sm-1 {\n    margin-left: 8.33333333%;\n  }\n  .offset-sm-2 {\n    margin-left: 16.66666667%;\n  }\n  .offset-sm-3 {\n    margin-left: 25%;\n  }\n  .offset-sm-4 {\n    margin-left: 33.33333333%;\n  }\n  .offset-sm-5 {\n    margin-left: 41.66666667%;\n  }\n  .offset-sm-6 {\n    margin-left: 50%;\n  }\n  .offset-sm-7 {\n    margin-left: 58.33333333%;\n  }\n  .offset-sm-8 {\n    margin-left: 66.66666667%;\n  }\n  .offset-sm-9 {\n    margin-left: 75%;\n  }\n  .offset-sm-10 {\n    margin-left: 83.33333333%;\n  }\n  .offset-sm-11 {\n    margin-left: 91.66666667%;\n  }\n  .g-sm-0,\n  .gx-sm-0 {\n    --bs-gutter-x: 0;\n  }\n  .g-sm-0,\n  .gy-sm-0 {\n    --bs-gutter-y: 0;\n  }\n  .g-sm-1,\n  .gx-sm-1 {\n    --bs-gutter-x: 0.25rem;\n  }\n  .g-sm-1,\n  .gy-sm-1 {\n    --bs-gutter-y: 0.25rem;\n  }\n  .g-sm-2,\n  .gx-sm-2 {\n    --bs-gutter-x: 0.5rem;\n  }\n  .g-sm-2,\n  .gy-sm-2 {\n    --bs-gutter-y: 0.5rem;\n  }\n  .g-sm-3,\n  .gx-sm-3 {\n    --bs-gutter-x: 1rem;\n  }\n  .g-sm-3,\n  .gy-sm-3 {\n    --bs-gutter-y: 1rem;\n  }\n  .g-sm-4,\n  .gx-sm-4 {\n    --bs-gutter-x: 1.5rem;\n  }\n  .g-sm-4,\n  .gy-sm-4 {\n    --bs-gutter-y: 1.5rem;\n  }\n  .g-sm-5,\n  .gx-sm-5 {\n    --bs-gutter-x: 3rem;\n  }\n  .g-sm-5,\n  .gy-sm-5 {\n    --bs-gutter-y: 3rem;\n  }\n}\n@media (min-width: 768px) {\n  .col-md {\n    flex: 1 0 0;\n  }\n  .row-cols-md-auto > * {\n    flex: 0 0 auto;\n    width: auto;\n  }\n  .row-cols-md-1 > * {\n    flex: 0 0 auto;\n    width: 100%;\n  }\n  .row-cols-md-2 > * {\n    flex: 0 0 auto;\n    width: 50%;\n  }\n  .row-cols-md-3 > * {\n    flex: 0 0 auto;\n    width: 33.33333333%;\n  }\n  .row-cols-md-4 > * {\n    flex: 0 0 auto;\n    width: 25%;\n  }\n  .row-cols-md-5 > * {\n    flex: 0 0 auto;\n    width: 20%;\n  }\n  .row-cols-md-6 > * {\n    flex: 0 0 auto;\n    width: 16.66666667%;\n  }\n  .col-md-auto {\n    flex: 0 0 auto;\n    width: auto;\n  }\n  .col-md-1 {\n    flex: 0 0 auto;\n    width: 8.33333333%;\n  }\n  .col-md-2 {\n    flex: 0 0 auto;\n    width: 16.66666667%;\n  }\n  .col-md-3 {\n    flex: 0 0 auto;\n    width: 25%;\n  }\n  .col-md-4 {\n    flex: 0 0 auto;\n    width: 33.33333333%;\n  }\n  .col-md-5 {\n    flex: 0 0 auto;\n    width: 41.66666667%;\n  }\n  .col-md-6 {\n    flex: 0 0 auto;\n    width: 50%;\n  }\n  .col-md-7 {\n    flex: 0 0 auto;\n    width: 58.33333333%;\n  }\n  .col-md-8 {\n    flex: 0 0 auto;\n    width: 66.66666667%;\n  }\n  .col-md-9 {\n    flex: 0 0 auto;\n    width: 75%;\n  }\n  .col-md-10 {\n    flex: 0 0 auto;\n    width: 83.33333333%;\n  }\n  .col-md-11 {\n    flex: 0 0 auto;\n    width: 91.66666667%;\n  }\n  .col-md-12 {\n    flex: 0 0 auto;\n    width: 100%;\n  }\n  .offset-md-0 {\n    margin-left: 0;\n  }\n  .offset-md-1 {\n    margin-left: 8.33333333%;\n  }\n  .offset-md-2 {\n    margin-left: 16.66666667%;\n  }\n  .offset-md-3 {\n    margin-left: 25%;\n  }\n  .offset-md-4 {\n    margin-left: 33.33333333%;\n  }\n  .offset-md-5 {\n    margin-left: 41.66666667%;\n  }\n  .offset-md-6 {\n    margin-left: 50%;\n  }\n  .offset-md-7 {\n    margin-left: 58.33333333%;\n  }\n  .offset-md-8 {\n    margin-left: 66.66666667%;\n  }\n  .offset-md-9 {\n    margin-left: 75%;\n  }\n  .offset-md-10 {\n    margin-left: 83.33333333%;\n  }\n  .offset-md-11 {\n    margin-left: 91.66666667%;\n  }\n  .g-md-0,\n  .gx-md-0 {\n    --bs-gutter-x: 0;\n  }\n  .g-md-0,\n  .gy-md-0 {\n    --bs-gutter-y: 0;\n  }\n  .g-md-1,\n  .gx-md-1 {\n    --bs-gutter-x: 0.25rem;\n  }\n  .g-md-1,\n  .gy-md-1 {\n    --bs-gutter-y: 0.25rem;\n  }\n  .g-md-2,\n  .gx-md-2 {\n    --bs-gutter-x: 0.5rem;\n  }\n  .g-md-2,\n  .gy-md-2 {\n    --bs-gutter-y: 0.5rem;\n  }\n  .g-md-3,\n  .gx-md-3 {\n    --bs-gutter-x: 1rem;\n  }\n  .g-md-3,\n  .gy-md-3 {\n    --bs-gutter-y: 1rem;\n  }\n  .g-md-4,\n  .gx-md-4 {\n    --bs-gutter-x: 1.5rem;\n  }\n  .g-md-4,\n  .gy-md-4 {\n    --bs-gutter-y: 1.5rem;\n  }\n  .g-md-5,\n  .gx-md-5 {\n    --bs-gutter-x: 3rem;\n  }\n  .g-md-5,\n  .gy-md-5 {\n    --bs-gutter-y: 3rem;\n  }\n}\n@media (min-width: 992px) {\n  .col-lg {\n    flex: 1 0 0;\n  }\n  .row-cols-lg-auto > * {\n    flex: 0 0 auto;\n    width: auto;\n  }\n  .row-cols-lg-1 > * {\n    flex: 0 0 auto;\n    width: 100%;\n  }\n  .row-cols-lg-2 > * {\n    flex: 0 0 auto;\n    width: 50%;\n  }\n  .row-cols-lg-3 > * {\n    flex: 0 0 auto;\n    width: 33.33333333%;\n  }\n  .row-cols-lg-4 > * {\n    flex: 0 0 auto;\n    width: 25%;\n  }\n  .row-cols-lg-5 > * {\n    flex: 0 0 auto;\n    width: 20%;\n  }\n  .row-cols-lg-6 > * {\n    flex: 0 0 auto;\n    width: 16.66666667%;\n  }\n  .col-lg-auto {\n    flex: 0 0 auto;\n    width: auto;\n  }\n  .col-lg-1 {\n    flex: 0 0 auto;\n    width: 8.33333333%;\n  }\n  .col-lg-2 {\n    flex: 0 0 auto;\n    width: 16.66666667%;\n  }\n  .col-lg-3 {\n    flex: 0 0 auto;\n    width: 25%;\n  }\n  .col-lg-4 {\n    flex: 0 0 auto;\n    width: 33.33333333%;\n  }\n  .col-lg-5 {\n    flex: 0 0 auto;\n    width: 41.66666667%;\n  }\n  .col-lg-6 {\n    flex: 0 0 auto;\n    width: 50%;\n  }\n  .col-lg-7 {\n    flex: 0 0 auto;\n    width: 58.33333333%;\n  }\n  .col-lg-8 {\n    flex: 0 0 auto;\n    width: 66.66666667%;\n  }\n  .col-lg-9 {\n    flex: 0 0 auto;\n    width: 75%;\n  }\n  .col-lg-10 {\n    flex: 0 0 auto;\n    width: 83.33333333%;\n  }\n  .col-lg-11 {\n    flex: 0 0 auto;\n    width: 91.66666667%;\n  }\n  .col-lg-12 {\n    flex: 0 0 auto;\n    width: 100%;\n  }\n  .offset-lg-0 {\n    margin-left: 0;\n  }\n  .offset-lg-1 {\n    margin-left: 8.33333333%;\n  }\n  .offset-lg-2 {\n    margin-left: 16.66666667%;\n  }\n  .offset-lg-3 {\n    margin-left: 25%;\n  }\n  .offset-lg-4 {\n    margin-left: 33.33333333%;\n  }\n  .offset-lg-5 {\n    margin-left: 41.66666667%;\n  }\n  .offset-lg-6 {\n    margin-left: 50%;\n  }\n  .offset-lg-7 {\n    margin-left: 58.33333333%;\n  }\n  .offset-lg-8 {\n    margin-left: 66.66666667%;\n  }\n  .offset-lg-9 {\n    margin-left: 75%;\n  }\n  .offset-lg-10 {\n    margin-left: 83.33333333%;\n  }\n  .offset-lg-11 {\n    margin-left: 91.66666667%;\n  }\n  .g-lg-0,\n  .gx-lg-0 {\n    --bs-gutter-x: 0;\n  }\n  .g-lg-0,\n  .gy-lg-0 {\n    --bs-gutter-y: 0;\n  }\n  .g-lg-1,\n  .gx-lg-1 {\n    --bs-gutter-x: 0.25rem;\n  }\n  .g-lg-1,\n  .gy-lg-1 {\n    --bs-gutter-y: 0.25rem;\n  }\n  .g-lg-2,\n  .gx-lg-2 {\n    --bs-gutter-x: 0.5rem;\n  }\n  .g-lg-2,\n  .gy-lg-2 {\n    --bs-gutter-y: 0.5rem;\n  }\n  .g-lg-3,\n  .gx-lg-3 {\n    --bs-gutter-x: 1rem;\n  }\n  .g-lg-3,\n  .gy-lg-3 {\n    --bs-gutter-y: 1rem;\n  }\n  .g-lg-4,\n  .gx-lg-4 {\n    --bs-gutter-x: 1.5rem;\n  }\n  .g-lg-4,\n  .gy-lg-4 {\n    --bs-gutter-y: 1.5rem;\n  }\n  .g-lg-5,\n  .gx-lg-5 {\n    --bs-gutter-x: 3rem;\n  }\n  .g-lg-5,\n  .gy-lg-5 {\n    --bs-gutter-y: 3rem;\n  }\n}\n@media (min-width: 1200px) {\n  .col-xl {\n    flex: 1 0 0;\n  }\n  .row-cols-xl-auto > * {\n    flex: 0 0 auto;\n    width: auto;\n  }\n  .row-cols-xl-1 > * {\n    flex: 0 0 auto;\n    width: 100%;\n  }\n  .row-cols-xl-2 > * {\n    flex: 0 0 auto;\n    width: 50%;\n  }\n  .row-cols-xl-3 > * {\n    flex: 0 0 auto;\n    width: 33.33333333%;\n  }\n  .row-cols-xl-4 > * {\n    flex: 0 0 auto;\n    width: 25%;\n  }\n  .row-cols-xl-5 > * {\n    flex: 0 0 auto;\n    width: 20%;\n  }\n  .row-cols-xl-6 > * {\n    flex: 0 0 auto;\n    width: 16.66666667%;\n  }\n  .col-xl-auto {\n    flex: 0 0 auto;\n    width: auto;\n  }\n  .col-xl-1 {\n    flex: 0 0 auto;\n    width: 8.33333333%;\n  }\n  .col-xl-2 {\n    flex: 0 0 auto;\n    width: 16.66666667%;\n  }\n  .col-xl-3 {\n    flex: 0 0 auto;\n    width: 25%;\n  }\n  .col-xl-4 {\n    flex: 0 0 auto;\n    width: 33.33333333%;\n  }\n  .col-xl-5 {\n    flex: 0 0 auto;\n    width: 41.66666667%;\n  }\n  .col-xl-6 {\n    flex: 0 0 auto;\n    width: 50%;\n  }\n  .col-xl-7 {\n    flex: 0 0 auto;\n    width: 58.33333333%;\n  }\n  .col-xl-8 {\n    flex: 0 0 auto;\n    width: 66.66666667%;\n  }\n  .col-xl-9 {\n    flex: 0 0 auto;\n    width: 75%;\n  }\n  .col-xl-10 {\n    flex: 0 0 auto;\n    width: 83.33333333%;\n  }\n  .col-xl-11 {\n    flex: 0 0 auto;\n    width: 91.66666667%;\n  }\n  .col-xl-12 {\n    flex: 0 0 auto;\n    width: 100%;\n  }\n  .offset-xl-0 {\n    margin-left: 0;\n  }\n  .offset-xl-1 {\n    margin-left: 8.33333333%;\n  }\n  .offset-xl-2 {\n    margin-left: 16.66666667%;\n  }\n  .offset-xl-3 {\n    margin-left: 25%;\n  }\n  .offset-xl-4 {\n    margin-left: 33.33333333%;\n  }\n  .offset-xl-5 {\n    margin-left: 41.66666667%;\n  }\n  .offset-xl-6 {\n    margin-left: 50%;\n  }\n  .offset-xl-7 {\n    margin-left: 58.33333333%;\n  }\n  .offset-xl-8 {\n    margin-left: 66.66666667%;\n  }\n  .offset-xl-9 {\n    margin-left: 75%;\n  }\n  .offset-xl-10 {\n    margin-left: 83.33333333%;\n  }\n  .offset-xl-11 {\n    margin-left: 91.66666667%;\n  }\n  .g-xl-0,\n  .gx-xl-0 {\n    --bs-gutter-x: 0;\n  }\n  .g-xl-0,\n  .gy-xl-0 {\n    --bs-gutter-y: 0;\n  }\n  .g-xl-1,\n  .gx-xl-1 {\n    --bs-gutter-x: 0.25rem;\n  }\n  .g-xl-1,\n  .gy-xl-1 {\n    --bs-gutter-y: 0.25rem;\n  }\n  .g-xl-2,\n  .gx-xl-2 {\n    --bs-gutter-x: 0.5rem;\n  }\n  .g-xl-2,\n  .gy-xl-2 {\n    --bs-gutter-y: 0.5rem;\n  }\n  .g-xl-3,\n  .gx-xl-3 {\n    --bs-gutter-x: 1rem;\n  }\n  .g-xl-3,\n  .gy-xl-3 {\n    --bs-gutter-y: 1rem;\n  }\n  .g-xl-4,\n  .gx-xl-4 {\n    --bs-gutter-x: 1.5rem;\n  }\n  .g-xl-4,\n  .gy-xl-4 {\n    --bs-gutter-y: 1.5rem;\n  }\n  .g-xl-5,\n  .gx-xl-5 {\n    --bs-gutter-x: 3rem;\n  }\n  .g-xl-5,\n  .gy-xl-5 {\n    --bs-gutter-y: 3rem;\n  }\n}\n@media (min-width: 1400px) {\n  .col-xxl {\n    flex: 1 0 0;\n  }\n  .row-cols-xxl-auto > * {\n    flex: 0 0 auto;\n    width: auto;\n  }\n  .row-cols-xxl-1 > * {\n    flex: 0 0 auto;\n    width: 100%;\n  }\n  .row-cols-xxl-2 > * {\n    flex: 0 0 auto;\n    width: 50%;\n  }\n  .row-cols-xxl-3 > * {\n    flex: 0 0 auto;\n    width: 33.33333333%;\n  }\n  .row-cols-xxl-4 > * {\n    flex: 0 0 auto;\n    width: 25%;\n  }\n  .row-cols-xxl-5 > * {\n    flex: 0 0 auto;\n    width: 20%;\n  }\n  .row-cols-xxl-6 > * {\n    flex: 0 0 auto;\n    width: 16.66666667%;\n  }\n  .col-xxl-auto {\n    flex: 0 0 auto;\n    width: auto;\n  }\n  .col-xxl-1 {\n    flex: 0 0 auto;\n    width: 8.33333333%;\n  }\n  .col-xxl-2 {\n    flex: 0 0 auto;\n    width: 16.66666667%;\n  }\n  .col-xxl-3 {\n    flex: 0 0 auto;\n    width: 25%;\n  }\n  .col-xxl-4 {\n    flex: 0 0 auto;\n    width: 33.33333333%;\n  }\n  .col-xxl-5 {\n    flex: 0 0 auto;\n    width: 41.66666667%;\n  }\n  .col-xxl-6 {\n    flex: 0 0 auto;\n    width: 50%;\n  }\n  .col-xxl-7 {\n    flex: 0 0 auto;\n    width: 58.33333333%;\n  }\n  .col-xxl-8 {\n    flex: 0 0 auto;\n    width: 66.66666667%;\n  }\n  .col-xxl-9 {\n    flex: 0 0 auto;\n    width: 75%;\n  }\n  .col-xxl-10 {\n    flex: 0 0 auto;\n    width: 83.33333333%;\n  }\n  .col-xxl-11 {\n    flex: 0 0 auto;\n    width: 91.66666667%;\n  }\n  .col-xxl-12 {\n    flex: 0 0 auto;\n    width: 100%;\n  }\n  .offset-xxl-0 {\n    margin-left: 0;\n  }\n  .offset-xxl-1 {\n    margin-left: 8.33333333%;\n  }\n  .offset-xxl-2 {\n    margin-left: 16.66666667%;\n  }\n  .offset-xxl-3 {\n    margin-left: 25%;\n  }\n  .offset-xxl-4 {\n    margin-left: 33.33333333%;\n  }\n  .offset-xxl-5 {\n    margin-left: 41.66666667%;\n  }\n  .offset-xxl-6 {\n    margin-left: 50%;\n  }\n  .offset-xxl-7 {\n    margin-left: 58.33333333%;\n  }\n  .offset-xxl-8 {\n    margin-left: 66.66666667%;\n  }\n  .offset-xxl-9 {\n    margin-left: 75%;\n  }\n  .offset-xxl-10 {\n    margin-left: 83.33333333%;\n  }\n  .offset-xxl-11 {\n    margin-left: 91.66666667%;\n  }\n  .g-xxl-0,\n  .gx-xxl-0 {\n    --bs-gutter-x: 0;\n  }\n  .g-xxl-0,\n  .gy-xxl-0 {\n    --bs-gutter-y: 0;\n  }\n  .g-xxl-1,\n  .gx-xxl-1 {\n    --bs-gutter-x: 0.25rem;\n  }\n  .g-xxl-1,\n  .gy-xxl-1 {\n    --bs-gutter-y: 0.25rem;\n  }\n  .g-xxl-2,\n  .gx-xxl-2 {\n    --bs-gutter-x: 0.5rem;\n  }\n  .g-xxl-2,\n  .gy-xxl-2 {\n    --bs-gutter-y: 0.5rem;\n  }\n  .g-xxl-3,\n  .gx-xxl-3 {\n    --bs-gutter-x: 1rem;\n  }\n  .g-xxl-3,\n  .gy-xxl-3 {\n    --bs-gutter-y: 1rem;\n  }\n  .g-xxl-4,\n  .gx-xxl-4 {\n    --bs-gutter-x: 1.5rem;\n  }\n  .g-xxl-4,\n  .gy-xxl-4 {\n    --bs-gutter-y: 1.5rem;\n  }\n  .g-xxl-5,\n  .gx-xxl-5 {\n    --bs-gutter-x: 3rem;\n  }\n  .g-xxl-5,\n  .gy-xxl-5 {\n    --bs-gutter-y: 3rem;\n  }\n}\n.table {\n  --bs-table-color-type: initial;\n  --bs-table-bg-type: initial;\n  --bs-table-color-state: initial;\n  --bs-table-bg-state: initial;\n  --bs-table-color: var(--bs-emphasis-color);\n  --bs-table-bg: var(--bs-body-bg);\n  --bs-table-border-color: var(--bs-border-color);\n  --bs-table-accent-bg: transparent;\n  --bs-table-striped-color: var(--bs-emphasis-color);\n  --bs-table-striped-bg: rgba(var(--bs-emphasis-color-rgb), 0.05);\n  --bs-table-active-color: var(--bs-emphasis-color);\n  --bs-table-active-bg: rgba(var(--bs-emphasis-color-rgb), 0.1);\n  --bs-table-hover-color: var(--bs-emphasis-color);\n  --bs-table-hover-bg: rgba(var(--bs-emphasis-color-rgb), 0.075);\n  width: 100%;\n  margin-bottom: 1rem;\n  vertical-align: top;\n  border-color: var(--bs-table-border-color);\n}\n.table > :not(caption) > * > * {\n  padding: 0.5rem 0.5rem;\n  color: var(--bs-table-color-state, var(--bs-table-color-type, var(--bs-table-color)));\n  background-color: var(--bs-table-bg);\n  border-bottom-width: var(--bs-border-width);\n  box-shadow: inset 0 0 0 9999px var(--bs-table-bg-state, var(--bs-table-bg-type, var(--bs-table-accent-bg)));\n}\n.table > tbody {\n  vertical-align: inherit;\n}\n.table > thead {\n  vertical-align: bottom;\n}\n\n.table-group-divider {\n  border-top: calc(var(--bs-border-width) * 2) solid currentcolor;\n}\n\n.caption-top {\n  caption-side: top;\n}\n\n.table-sm > :not(caption) > * > * {\n  padding: 0.25rem 0.25rem;\n}\n\n.table-bordered > :not(caption) > * {\n  border-width: var(--bs-border-width) 0;\n}\n.table-bordered > :not(caption) > * > * {\n  border-width: 0 var(--bs-border-width);\n}\n\n.table-borderless > :not(caption) > * > * {\n  border-bottom-width: 0;\n}\n.table-borderless > :not(:first-child) {\n  border-top-width: 0;\n}\n\n.table-striped > tbody > tr:nth-of-type(odd) > * {\n  --bs-table-color-type: var(--bs-table-striped-color);\n  --bs-table-bg-type: var(--bs-table-striped-bg);\n}\n\n.table-striped-columns > :not(caption) > tr > :nth-child(even) {\n  --bs-table-color-type: var(--bs-table-striped-color);\n  --bs-table-bg-type: var(--bs-table-striped-bg);\n}\n\n.table-active {\n  --bs-table-color-state: var(--bs-table-active-color);\n  --bs-table-bg-state: var(--bs-table-active-bg);\n}\n\n.table-hover > tbody > tr:hover > * {\n  --bs-table-color-state: var(--bs-table-hover-color);\n  --bs-table-bg-state: var(--bs-table-hover-bg);\n}\n\n.table-primary {\n  --bs-table-color: #000;\n  --bs-table-bg: #cfe2ff;\n  --bs-table-border-color: #a6b5cc;\n  --bs-table-striped-bg: #c5d7f2;\n  --bs-table-striped-color: #000;\n  --bs-table-active-bg: #bacbe6;\n  --bs-table-active-color: #000;\n  --bs-table-hover-bg: #bfd1ec;\n  --bs-table-hover-color: #000;\n  color: var(--bs-table-color);\n  border-color: var(--bs-table-border-color);\n}\n\n.table-secondary {\n  --bs-table-color: #000;\n  --bs-table-bg: #e2e3e5;\n  --bs-table-border-color: #b5b6b7;\n  --bs-table-striped-bg: #d7d8da;\n  --bs-table-striped-color: #000;\n  --bs-table-active-bg: #cbccce;\n  --bs-table-active-color: #000;\n  --bs-table-hover-bg: #d1d2d4;\n  --bs-table-hover-color: #000;\n  color: var(--bs-table-color);\n  border-color: var(--bs-table-border-color);\n}\n\n.table-success {\n  --bs-table-color: #000;\n  --bs-table-bg: #d1e7dd;\n  --bs-table-border-color: #a7b9b1;\n  --bs-table-striped-bg: #c7dbd2;\n  --bs-table-striped-color: #000;\n  --bs-table-active-bg: #bcd0c7;\n  --bs-table-active-color: #000;\n  --bs-table-hover-bg: #c1d6cc;\n  --bs-table-hover-color: #000;\n  color: var(--bs-table-color);\n  border-color: var(--bs-table-border-color);\n}\n\n.table-info {\n  --bs-table-color: #000;\n  --bs-table-bg: #cff4fc;\n  --bs-table-border-color: #a6c3ca;\n  --bs-table-striped-bg: #c5e8ef;\n  --bs-table-striped-color: #000;\n  --bs-table-active-bg: #badce3;\n  --bs-table-active-color: #000;\n  --bs-table-hover-bg: #bfe2e9;\n  --bs-table-hover-color: #000;\n  color: var(--bs-table-color);\n  border-color: var(--bs-table-border-color);\n}\n\n.table-warning {\n  --bs-table-color: #000;\n  --bs-table-bg: #fff3cd;\n  --bs-table-border-color: #ccc2a4;\n  --bs-table-striped-bg: #f2e7c3;\n  --bs-table-striped-color: #000;\n  --bs-table-active-bg: #e6dbb9;\n  --bs-table-active-color: #000;\n  --bs-table-hover-bg: #ece1be;\n  --bs-table-hover-color: #000;\n  color: var(--bs-table-color);\n  border-color: var(--bs-table-border-color);\n}\n\n.table-danger {\n  --bs-table-color: #000;\n  --bs-table-bg: #f8d7da;\n  --bs-table-border-color: #c6acae;\n  --bs-table-striped-bg: #eccccf;\n  --bs-table-striped-color: #000;\n  --bs-table-active-bg: #dfc2c4;\n  --bs-table-active-color: #000;\n  --bs-table-hover-bg: #e5c7ca;\n  --bs-table-hover-color: #000;\n  color: var(--bs-table-color);\n  border-color: var(--bs-table-border-color);\n}\n\n.table-light {\n  --bs-table-color: #000;\n  --bs-table-bg: #f8f9fa;\n  --bs-table-border-color: #c6c7c8;\n  --bs-table-striped-bg: #ecedee;\n  --bs-table-striped-color: #000;\n  --bs-table-active-bg: #dfe0e1;\n  --bs-table-active-color: #000;\n  --bs-table-hover-bg: #e5e6e7;\n  --bs-table-hover-color: #000;\n  color: var(--bs-table-color);\n  border-color: var(--bs-table-border-color);\n}\n\n.table-dark {\n  --bs-table-color: #fff;\n  --bs-table-bg: #212529;\n  --bs-table-border-color: #4d5154;\n  --bs-table-striped-bg: #2c3034;\n  --bs-table-striped-color: #fff;\n  --bs-table-active-bg: #373b3e;\n  --bs-table-active-color: #fff;\n  --bs-table-hover-bg: #323539;\n  --bs-table-hover-color: #fff;\n  color: var(--bs-table-color);\n  border-color: var(--bs-table-border-color);\n}\n\n.table-responsive {\n  overflow-x: auto;\n  -webkit-overflow-scrolling: touch;\n}\n\n@media (max-width: 575.98px) {\n  .table-responsive-sm {\n    overflow-x: auto;\n    -webkit-overflow-scrolling: touch;\n  }\n}\n@media (max-width: 767.98px) {\n  .table-responsive-md {\n    overflow-x: auto;\n    -webkit-overflow-scrolling: touch;\n  }\n}\n@media (max-width: 991.98px) {\n  .table-responsive-lg {\n    overflow-x: auto;\n    -webkit-overflow-scrolling: touch;\n  }\n}\n@media (max-width: 1199.98px) {\n  .table-responsive-xl {\n    overflow-x: auto;\n    -webkit-overflow-scrolling: touch;\n  }\n}\n@media (max-width: 1399.98px) {\n  .table-responsive-xxl {\n    overflow-x: auto;\n    -webkit-overflow-scrolling: touch;\n  }\n}\n.form-label {\n  margin-bottom: 0.5rem;\n}\n\n.col-form-label {\n  padding-top: calc(0.375rem + var(--bs-border-width));\n  padding-bottom: calc(0.375rem + var(--bs-border-width));\n  margin-bottom: 0;\n  font-size: inherit;\n  line-height: 1.5;\n}\n\n.col-form-label-lg {\n  padding-top: calc(0.5rem + var(--bs-border-width));\n  padding-bottom: calc(0.5rem + var(--bs-border-width));\n  font-size: 1.25rem;\n}\n\n.col-form-label-sm {\n  padding-top: calc(0.25rem + var(--bs-border-width));\n  padding-bottom: calc(0.25rem + var(--bs-border-width));\n  font-size: 0.875rem;\n}\n\n.form-text {\n  margin-top: 0.25rem;\n  font-size: 0.875em;\n  color: var(--bs-secondary-color);\n}\n\n.form-control {\n  display: block;\n  width: 100%;\n  padding: 0.375rem 0.75rem;\n  font-size: 1rem;\n  font-weight: 400;\n  line-height: 1.5;\n  color: var(--bs-body-color);\n  -webkit-appearance: none;\n  -moz-appearance: none;\n  appearance: none;\n  background-color: var(--bs-body-bg);\n  background-clip: padding-box;\n  border: var(--bs-border-width) solid var(--bs-border-color);\n  border-radius: var(--bs-border-radius);\n  transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n  .form-control {\n    transition: none;\n  }\n}\n.form-control[type=file] {\n  overflow: hidden;\n}\n.form-control[type=file]:not(:disabled):not([readonly]) {\n  cursor: pointer;\n}\n.form-control:focus {\n  color: var(--bs-body-color);\n  background-color: var(--bs-body-bg);\n  border-color: #86b7fe;\n  outline: 0;\n  box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n}\n.form-control::-webkit-date-and-time-value {\n  min-width: 85px;\n  height: 1.5em;\n  margin: 0;\n}\n.form-control::-webkit-datetime-edit {\n  display: block;\n  padding: 0;\n}\n.form-control::placeholder {\n  color: var(--bs-secondary-color);\n  opacity: 1;\n}\n.form-control:disabled {\n  background-color: var(--bs-secondary-bg);\n  opacity: 1;\n}\n.form-control::-webkit-file-upload-button {\n  padding: 0.375rem 0.75rem;\n  margin: -0.375rem -0.75rem;\n  -webkit-margin-end: 0.75rem;\n  margin-inline-end: 0.75rem;\n  color: var(--bs-body-color);\n  background-color: var(--bs-tertiary-bg);\n  pointer-events: none;\n  border-color: inherit;\n  border-style: solid;\n  border-width: 0;\n  border-inline-end-width: var(--bs-border-width);\n  border-radius: 0;\n  -webkit-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n  transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n.form-control::file-selector-button {\n  padding: 0.375rem 0.75rem;\n  margin: -0.375rem -0.75rem;\n  -webkit-margin-end: 0.75rem;\n  margin-inline-end: 0.75rem;\n  color: var(--bs-body-color);\n  background-color: var(--bs-tertiary-bg);\n  pointer-events: none;\n  border-color: inherit;\n  border-style: solid;\n  border-width: 0;\n  border-inline-end-width: var(--bs-border-width);\n  border-radius: 0;\n  transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n  .form-control::-webkit-file-upload-button {\n    -webkit-transition: none;\n    transition: none;\n  }\n  .form-control::file-selector-button {\n    transition: none;\n  }\n}\n.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button {\n  background-color: var(--bs-secondary-bg);\n}\n.form-control:hover:not(:disabled):not([readonly])::file-selector-button {\n  background-color: var(--bs-secondary-bg);\n}\n\n.form-control-plaintext {\n  display: block;\n  width: 100%;\n  padding: 0.375rem 0;\n  margin-bottom: 0;\n  line-height: 1.5;\n  color: var(--bs-body-color);\n  background-color: transparent;\n  border: solid transparent;\n  border-width: var(--bs-border-width) 0;\n}\n.form-control-plaintext:focus {\n  outline: 0;\n}\n.form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg {\n  padding-right: 0;\n  padding-left: 0;\n}\n\n.form-control-sm {\n  min-height: calc(1.5em + 0.5rem + calc(var(--bs-border-width) * 2));\n  padding: 0.25rem 0.5rem;\n  font-size: 0.875rem;\n  border-radius: var(--bs-border-radius-sm);\n}\n.form-control-sm::-webkit-file-upload-button {\n  padding: 0.25rem 0.5rem;\n  margin: -0.25rem -0.5rem;\n  -webkit-margin-end: 0.5rem;\n  margin-inline-end: 0.5rem;\n}\n.form-control-sm::file-selector-button {\n  padding: 0.25rem 0.5rem;\n  margin: -0.25rem -0.5rem;\n  -webkit-margin-end: 0.5rem;\n  margin-inline-end: 0.5rem;\n}\n\n.form-control-lg {\n  min-height: calc(1.5em + 1rem + calc(var(--bs-border-width) * 2));\n  padding: 0.5rem 1rem;\n  font-size: 1.25rem;\n  border-radius: var(--bs-border-radius-lg);\n}\n.form-control-lg::-webkit-file-upload-button {\n  padding: 0.5rem 1rem;\n  margin: -0.5rem -1rem;\n  -webkit-margin-end: 1rem;\n  margin-inline-end: 1rem;\n}\n.form-control-lg::file-selector-button {\n  padding: 0.5rem 1rem;\n  margin: -0.5rem -1rem;\n  -webkit-margin-end: 1rem;\n  margin-inline-end: 1rem;\n}\n\ntextarea.form-control {\n  min-height: calc(1.5em + 0.75rem + calc(var(--bs-border-width) * 2));\n}\ntextarea.form-control-sm {\n  min-height: calc(1.5em + 0.5rem + calc(var(--bs-border-width) * 2));\n}\ntextarea.form-control-lg {\n  min-height: calc(1.5em + 1rem + calc(var(--bs-border-width) * 2));\n}\n\n.form-control-color {\n  width: 3rem;\n  height: calc(1.5em + 0.75rem + calc(var(--bs-border-width) * 2));\n  padding: 0.375rem;\n}\n.form-control-color:not(:disabled):not([readonly]) {\n  cursor: pointer;\n}\n.form-control-color::-moz-color-swatch {\n  border: 0 !important;\n  border-radius: var(--bs-border-radius);\n}\n.form-control-color::-webkit-color-swatch {\n  border: 0 !important;\n  border-radius: var(--bs-border-radius);\n}\n.form-control-color.form-control-sm {\n  height: calc(1.5em + 0.5rem + calc(var(--bs-border-width) * 2));\n}\n.form-control-color.form-control-lg {\n  height: calc(1.5em + 1rem + calc(var(--bs-border-width) * 2));\n}\n\n.form-select {\n  --bs-form-select-bg-img: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e\");\n  display: block;\n  width: 100%;\n  padding: 0.375rem 2.25rem 0.375rem 0.75rem;\n  font-size: 1rem;\n  font-weight: 400;\n  line-height: 1.5;\n  color: var(--bs-body-color);\n  -webkit-appearance: none;\n  -moz-appearance: none;\n  appearance: none;\n  background-color: var(--bs-body-bg);\n  background-image: var(--bs-form-select-bg-img), var(--bs-form-select-bg-icon, none);\n  background-repeat: no-repeat;\n  background-position: right 0.75rem center;\n  background-size: 16px 12px;\n  border: var(--bs-border-width) solid var(--bs-border-color);\n  border-radius: var(--bs-border-radius);\n  transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n  .form-select {\n    transition: none;\n  }\n}\n.form-select:focus {\n  border-color: #86b7fe;\n  outline: 0;\n  box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n}\n.form-select[multiple], .form-select[size]:not([size=\"1\"]) {\n  padding-right: 0.75rem;\n  background-image: none;\n}\n.form-select:disabled {\n  background-color: var(--bs-secondary-bg);\n}\n.form-select:-moz-focusring {\n  color: transparent;\n  text-shadow: 0 0 0 var(--bs-body-color);\n}\n\n.form-select-sm {\n  padding-top: 0.25rem;\n  padding-bottom: 0.25rem;\n  padding-left: 0.5rem;\n  font-size: 0.875rem;\n  border-radius: var(--bs-border-radius-sm);\n}\n\n.form-select-lg {\n  padding-top: 0.5rem;\n  padding-bottom: 0.5rem;\n  padding-left: 1rem;\n  font-size: 1.25rem;\n  border-radius: var(--bs-border-radius-lg);\n}\n\n[data-bs-theme=dark] .form-select {\n  --bs-form-select-bg-img: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23dee2e6' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e\");\n}\n\n.form-check {\n  display: block;\n  min-height: 1.5rem;\n  padding-left: 1.5em;\n  margin-bottom: 0.125rem;\n}\n.form-check .form-check-input {\n  float: left;\n  margin-left: -1.5em;\n}\n\n.form-check-reverse {\n  padding-right: 1.5em;\n  padding-left: 0;\n  text-align: right;\n}\n.form-check-reverse .form-check-input {\n  float: right;\n  margin-right: -1.5em;\n  margin-left: 0;\n}\n\n.form-check-input {\n  --bs-form-check-bg: var(--bs-body-bg);\n  flex-shrink: 0;\n  width: 1em;\n  height: 1em;\n  margin-top: 0.25em;\n  vertical-align: top;\n  -webkit-appearance: none;\n  -moz-appearance: none;\n  appearance: none;\n  background-color: var(--bs-form-check-bg);\n  background-image: var(--bs-form-check-bg-image);\n  background-repeat: no-repeat;\n  background-position: center;\n  background-size: contain;\n  border: var(--bs-border-width) solid var(--bs-border-color);\n  -webkit-print-color-adjust: exact;\n  color-adjust: exact;\n  print-color-adjust: exact;\n}\n.form-check-input[type=checkbox] {\n  border-radius: 0.25em;\n}\n.form-check-input[type=radio] {\n  border-radius: 50%;\n}\n.form-check-input:active {\n  filter: brightness(90%);\n}\n.form-check-input:focus {\n  border-color: #86b7fe;\n  outline: 0;\n  box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n}\n.form-check-input:checked {\n  background-color: #0d6efd;\n  border-color: #0d6efd;\n}\n.form-check-input:checked[type=checkbox] {\n  --bs-form-check-bg-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e\");\n}\n.form-check-input:checked[type=radio] {\n  --bs-form-check-bg-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e\");\n}\n.form-check-input[type=checkbox]:indeterminate {\n  background-color: #0d6efd;\n  border-color: #0d6efd;\n  --bs-form-check-bg-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e\");\n}\n.form-check-input:disabled {\n  pointer-events: none;\n  filter: none;\n  opacity: 0.5;\n}\n.form-check-input[disabled] ~ .form-check-label, .form-check-input:disabled ~ .form-check-label {\n  cursor: default;\n  opacity: 0.5;\n}\n\n.form-switch {\n  padding-left: 2.5em;\n}\n.form-switch .form-check-input {\n  --bs-form-switch-bg: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e\");\n  width: 2em;\n  margin-left: -2.5em;\n  background-image: var(--bs-form-switch-bg);\n  background-position: left center;\n  border-radius: 2em;\n  transition: background-position 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n  .form-switch .form-check-input {\n    transition: none;\n  }\n}\n.form-switch .form-check-input:focus {\n  --bs-form-switch-bg: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2386b7fe'/%3e%3c/svg%3e\");\n}\n.form-switch .form-check-input:checked {\n  background-position: right center;\n  --bs-form-switch-bg: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e\");\n}\n.form-switch.form-check-reverse {\n  padding-right: 2.5em;\n  padding-left: 0;\n}\n.form-switch.form-check-reverse .form-check-input {\n  margin-right: -2.5em;\n  margin-left: 0;\n}\n\n.form-check-inline {\n  display: inline-block;\n  margin-right: 1rem;\n}\n\n.btn-check {\n  position: absolute;\n  clip: rect(0, 0, 0, 0);\n  pointer-events: none;\n}\n.btn-check[disabled] + .btn, .btn-check:disabled + .btn {\n  pointer-events: none;\n  filter: none;\n  opacity: 0.65;\n}\n\n[data-bs-theme=dark] .form-switch .form-check-input:not(:checked):not(:focus) {\n  --bs-form-switch-bg: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%28255, 255, 255, 0.25%29'/%3e%3c/svg%3e\");\n}\n\n.form-range {\n  width: 100%;\n  height: 1.5rem;\n  padding: 0;\n  -webkit-appearance: none;\n  -moz-appearance: none;\n  appearance: none;\n  background-color: transparent;\n}\n.form-range:focus {\n  outline: 0;\n}\n.form-range:focus::-webkit-slider-thumb {\n  box-shadow: 0 0 0 1px #fff, 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n}\n.form-range:focus::-moz-range-thumb {\n  box-shadow: 0 0 0 1px #fff, 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n}\n.form-range::-moz-focus-outer {\n  border: 0;\n}\n.form-range::-webkit-slider-thumb {\n  width: 1rem;\n  height: 1rem;\n  margin-top: -0.25rem;\n  -webkit-appearance: none;\n  appearance: none;\n  background-color: #0d6efd;\n  border: 0;\n  border-radius: 1rem;\n  -webkit-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n  transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n  .form-range::-webkit-slider-thumb {\n    -webkit-transition: none;\n    transition: none;\n  }\n}\n.form-range::-webkit-slider-thumb:active {\n  background-color: #b6d4fe;\n}\n.form-range::-webkit-slider-runnable-track {\n  width: 100%;\n  height: 0.5rem;\n  color: transparent;\n  cursor: pointer;\n  background-color: var(--bs-secondary-bg);\n  border-color: transparent;\n  border-radius: 1rem;\n}\n.form-range::-moz-range-thumb {\n  width: 1rem;\n  height: 1rem;\n  -moz-appearance: none;\n  appearance: none;\n  background-color: #0d6efd;\n  border: 0;\n  border-radius: 1rem;\n  -moz-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n  transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n  .form-range::-moz-range-thumb {\n    -moz-transition: none;\n    transition: none;\n  }\n}\n.form-range::-moz-range-thumb:active {\n  background-color: #b6d4fe;\n}\n.form-range::-moz-range-track {\n  width: 100%;\n  height: 0.5rem;\n  color: transparent;\n  cursor: pointer;\n  background-color: var(--bs-secondary-bg);\n  border-color: transparent;\n  border-radius: 1rem;\n}\n.form-range:disabled {\n  pointer-events: none;\n}\n.form-range:disabled::-webkit-slider-thumb {\n  background-color: var(--bs-secondary-color);\n}\n.form-range:disabled::-moz-range-thumb {\n  background-color: var(--bs-secondary-color);\n}\n\n.form-floating {\n  position: relative;\n}\n.form-floating > .form-control,\n.form-floating > .form-control-plaintext,\n.form-floating > .form-select {\n  height: calc(3.5rem + calc(var(--bs-border-width) * 2));\n  min-height: calc(3.5rem + calc(var(--bs-border-width) * 2));\n  line-height: 1.25;\n}\n.form-floating > label {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 2;\n  max-width: 100%;\n  height: 100%;\n  padding: 1rem 0.75rem;\n  overflow: hidden;\n  color: rgba(var(--bs-body-color-rgb), 0.65);\n  text-align: start;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n  pointer-events: none;\n  border: var(--bs-border-width) solid transparent;\n  transform-origin: 0 0;\n  transition: opacity 0.1s ease-in-out, transform 0.1s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n  .form-floating > label {\n    transition: none;\n  }\n}\n.form-floating > .form-control,\n.form-floating > .form-control-plaintext {\n  padding: 1rem 0.75rem;\n}\n.form-floating > .form-control::placeholder,\n.form-floating > .form-control-plaintext::placeholder {\n  color: transparent;\n}\n.form-floating > .form-control:focus, .form-floating > .form-control:not(:placeholder-shown),\n.form-floating > .form-control-plaintext:focus,\n.form-floating > .form-control-plaintext:not(:placeholder-shown) {\n  padding-top: 1.625rem;\n  padding-bottom: 0.625rem;\n}\n.form-floating > .form-control:-webkit-autofill,\n.form-floating > .form-control-plaintext:-webkit-autofill {\n  padding-top: 1.625rem;\n  padding-bottom: 0.625rem;\n}\n.form-floating > .form-select {\n  padding-top: 1.625rem;\n  padding-bottom: 0.625rem;\n  padding-left: 0.75rem;\n}\n.form-floating > .form-control:focus ~ label,\n.form-floating > .form-control:not(:placeholder-shown) ~ label,\n.form-floating > .form-control-plaintext ~ label,\n.form-floating > .form-select ~ label {\n  transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem);\n}\n.form-floating > .form-control:-webkit-autofill ~ label {\n  transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem);\n}\n.form-floating > textarea:focus ~ label::after,\n.form-floating > textarea:not(:placeholder-shown) ~ label::after {\n  position: absolute;\n  inset: 1rem 0.375rem;\n  z-index: -1;\n  height: 1.5em;\n  content: \"\";\n  background-color: var(--bs-body-bg);\n  border-radius: var(--bs-border-radius);\n}\n.form-floating > textarea:disabled ~ label::after {\n  background-color: var(--bs-secondary-bg);\n}\n.form-floating > .form-control-plaintext ~ label {\n  border-width: var(--bs-border-width) 0;\n}\n.form-floating > :disabled ~ label,\n.form-floating > .form-control:disabled ~ label {\n  color: #6c757d;\n}\n\n.input-group {\n  position: relative;\n  display: flex;\n  flex-wrap: wrap;\n  align-items: stretch;\n  width: 100%;\n}\n.input-group > .form-control,\n.input-group > .form-select,\n.input-group > .form-floating {\n  position: relative;\n  flex: 1 1 auto;\n  width: 1%;\n  min-width: 0;\n}\n.input-group > .form-control:focus,\n.input-group > .form-select:focus,\n.input-group > .form-floating:focus-within {\n  z-index: 5;\n}\n.input-group .btn {\n  position: relative;\n  z-index: 2;\n}\n.input-group .btn:focus {\n  z-index: 5;\n}\n\n.input-group-text {\n  display: flex;\n  align-items: center;\n  padding: 0.375rem 0.75rem;\n  font-size: 1rem;\n  font-weight: 400;\n  line-height: 1.5;\n  color: var(--bs-body-color);\n  text-align: center;\n  white-space: nowrap;\n  background-color: var(--bs-tertiary-bg);\n  border: var(--bs-border-width) solid var(--bs-border-color);\n  border-radius: var(--bs-border-radius);\n}\n\n.input-group-lg > .form-control,\n.input-group-lg > .form-select,\n.input-group-lg > .input-group-text,\n.input-group-lg > .btn {\n  padding: 0.5rem 1rem;\n  font-size: 1.25rem;\n  border-radius: var(--bs-border-radius-lg);\n}\n\n.input-group-sm > .form-control,\n.input-group-sm > .form-select,\n.input-group-sm > .input-group-text,\n.input-group-sm > .btn {\n  padding: 0.25rem 0.5rem;\n  font-size: 0.875rem;\n  border-radius: var(--bs-border-radius-sm);\n}\n\n.input-group-lg > .form-select,\n.input-group-sm > .form-select {\n  padding-right: 3rem;\n}\n\n.input-group:not(.has-validation) > :not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),\n.input-group:not(.has-validation) > .dropdown-toggle:nth-last-child(n+3),\n.input-group:not(.has-validation) > .form-floating:not(:last-child) > .form-control,\n.input-group:not(.has-validation) > .form-floating:not(:last-child) > .form-select {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.input-group.has-validation > :nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),\n.input-group.has-validation > .dropdown-toggle:nth-last-child(n+4),\n.input-group.has-validation > .form-floating:nth-last-child(n+3) > .form-control,\n.input-group.has-validation > .form-floating:nth-last-child(n+3) > .form-select {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.input-group > :not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback) {\n  margin-left: calc(-1 * var(--bs-border-width));\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.input-group > .form-floating:not(:first-child) > .form-control,\n.input-group > .form-floating:not(:first-child) > .form-select {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.valid-feedback {\n  display: none;\n  width: 100%;\n  margin-top: 0.25rem;\n  font-size: 0.875em;\n  color: var(--bs-form-valid-color);\n}\n\n.valid-tooltip {\n  position: absolute;\n  top: 100%;\n  z-index: 5;\n  display: none;\n  max-width: 100%;\n  padding: 0.25rem 0.5rem;\n  margin-top: 0.1rem;\n  font-size: 0.875rem;\n  color: #fff;\n  background-color: var(--bs-success);\n  border-radius: var(--bs-border-radius);\n}\n\n.was-validated :valid ~ .valid-feedback,\n.was-validated :valid ~ .valid-tooltip,\n.is-valid ~ .valid-feedback,\n.is-valid ~ .valid-tooltip {\n  display: block;\n}\n\n.was-validated .form-control:valid, .form-control.is-valid {\n  border-color: var(--bs-form-valid-border-color);\n  padding-right: calc(1.5em + 0.75rem);\n  background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1'/%3e%3c/svg%3e\");\n  background-repeat: no-repeat;\n  background-position: right calc(0.375em + 0.1875rem) center;\n  background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n.was-validated .form-control:valid:focus, .form-control.is-valid:focus {\n  border-color: var(--bs-form-valid-border-color);\n  box-shadow: 0 0 0 0.25rem rgba(var(--bs-success-rgb), 0.25);\n}\n\n.was-validated textarea.form-control:valid, textarea.form-control.is-valid {\n  padding-right: calc(1.5em + 0.75rem);\n  background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);\n}\n\n.was-validated .form-select:valid, .form-select.is-valid {\n  border-color: var(--bs-form-valid-border-color);\n}\n.was-validated .form-select:valid:not([multiple]):not([size]), .was-validated .form-select:valid:not([multiple])[size=\"1\"], .form-select.is-valid:not([multiple]):not([size]), .form-select.is-valid:not([multiple])[size=\"1\"] {\n  --bs-form-select-bg-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1'/%3e%3c/svg%3e\");\n  padding-right: 4.125rem;\n  background-position: right 0.75rem center, center right 2.25rem;\n  background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n.was-validated .form-select:valid:focus, .form-select.is-valid:focus {\n  border-color: var(--bs-form-valid-border-color);\n  box-shadow: 0 0 0 0.25rem rgba(var(--bs-success-rgb), 0.25);\n}\n\n.was-validated .form-control-color:valid, .form-control-color.is-valid {\n  width: calc(3rem + calc(1.5em + 0.75rem));\n}\n\n.was-validated .form-check-input:valid, .form-check-input.is-valid {\n  border-color: var(--bs-form-valid-border-color);\n}\n.was-validated .form-check-input:valid:checked, .form-check-input.is-valid:checked {\n  background-color: var(--bs-form-valid-color);\n}\n.was-validated .form-check-input:valid:focus, .form-check-input.is-valid:focus {\n  box-shadow: 0 0 0 0.25rem rgba(var(--bs-success-rgb), 0.25);\n}\n.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label {\n  color: var(--bs-form-valid-color);\n}\n\n.form-check-inline .form-check-input ~ .valid-feedback {\n  margin-left: 0.5em;\n}\n\n.was-validated .input-group > .form-control:not(:focus):valid, .input-group > .form-control:not(:focus).is-valid,\n.was-validated .input-group > .form-select:not(:focus):valid,\n.input-group > .form-select:not(:focus).is-valid,\n.was-validated .input-group > .form-floating:not(:focus-within):valid,\n.input-group > .form-floating:not(:focus-within).is-valid {\n  z-index: 3;\n}\n\n.invalid-feedback {\n  display: none;\n  width: 100%;\n  margin-top: 0.25rem;\n  font-size: 0.875em;\n  color: var(--bs-form-invalid-color);\n}\n\n.invalid-tooltip {\n  position: absolute;\n  top: 100%;\n  z-index: 5;\n  display: none;\n  max-width: 100%;\n  padding: 0.25rem 0.5rem;\n  margin-top: 0.1rem;\n  font-size: 0.875rem;\n  color: #fff;\n  background-color: var(--bs-danger);\n  border-radius: var(--bs-border-radius);\n}\n\n.was-validated :invalid ~ .invalid-feedback,\n.was-validated :invalid ~ .invalid-tooltip,\n.is-invalid ~ .invalid-feedback,\n.is-invalid ~ .invalid-tooltip {\n  display: block;\n}\n\n.was-validated .form-control:invalid, .form-control.is-invalid {\n  border-color: var(--bs-form-invalid-border-color);\n  padding-right: calc(1.5em + 0.75rem);\n  background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e\");\n  background-repeat: no-repeat;\n  background-position: right calc(0.375em + 0.1875rem) center;\n  background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus {\n  border-color: var(--bs-form-invalid-border-color);\n  box-shadow: 0 0 0 0.25rem rgba(var(--bs-danger-rgb), 0.25);\n}\n\n.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid {\n  padding-right: calc(1.5em + 0.75rem);\n  background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);\n}\n\n.was-validated .form-select:invalid, .form-select.is-invalid {\n  border-color: var(--bs-form-invalid-border-color);\n}\n.was-validated .form-select:invalid:not([multiple]):not([size]), .was-validated .form-select:invalid:not([multiple])[size=\"1\"], .form-select.is-invalid:not([multiple]):not([size]), .form-select.is-invalid:not([multiple])[size=\"1\"] {\n  --bs-form-select-bg-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e\");\n  padding-right: 4.125rem;\n  background-position: right 0.75rem center, center right 2.25rem;\n  background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n.was-validated .form-select:invalid:focus, .form-select.is-invalid:focus {\n  border-color: var(--bs-form-invalid-border-color);\n  box-shadow: 0 0 0 0.25rem rgba(var(--bs-danger-rgb), 0.25);\n}\n\n.was-validated .form-control-color:invalid, .form-control-color.is-invalid {\n  width: calc(3rem + calc(1.5em + 0.75rem));\n}\n\n.was-validated .form-check-input:invalid, .form-check-input.is-invalid {\n  border-color: var(--bs-form-invalid-border-color);\n}\n.was-validated .form-check-input:invalid:checked, .form-check-input.is-invalid:checked {\n  background-color: var(--bs-form-invalid-color);\n}\n.was-validated .form-check-input:invalid:focus, .form-check-input.is-invalid:focus {\n  box-shadow: 0 0 0 0.25rem rgba(var(--bs-danger-rgb), 0.25);\n}\n.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label {\n  color: var(--bs-form-invalid-color);\n}\n\n.form-check-inline .form-check-input ~ .invalid-feedback {\n  margin-left: 0.5em;\n}\n\n.was-validated .input-group > .form-control:not(:focus):invalid, .input-group > .form-control:not(:focus).is-invalid,\n.was-validated .input-group > .form-select:not(:focus):invalid,\n.input-group > .form-select:not(:focus).is-invalid,\n.was-validated .input-group > .form-floating:not(:focus-within):invalid,\n.input-group > .form-floating:not(:focus-within).is-invalid {\n  z-index: 4;\n}\n\n.btn {\n  --bs-btn-padding-x: 0.75rem;\n  --bs-btn-padding-y: 0.375rem;\n  --bs-btn-font-family: ;\n  --bs-btn-font-size: 1rem;\n  --bs-btn-font-weight: 400;\n  --bs-btn-line-height: 1.5;\n  --bs-btn-color: var(--bs-body-color);\n  --bs-btn-bg: transparent;\n  --bs-btn-border-width: var(--bs-border-width);\n  --bs-btn-border-color: transparent;\n  --bs-btn-border-radius: var(--bs-border-radius);\n  --bs-btn-hover-border-color: transparent;\n  --bs-btn-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n  --bs-btn-disabled-opacity: 0.65;\n  --bs-btn-focus-box-shadow: 0 0 0 0.25rem rgba(var(--bs-btn-focus-shadow-rgb), .5);\n  display: inline-block;\n  padding: var(--bs-btn-padding-y) var(--bs-btn-padding-x);\n  font-family: var(--bs-btn-font-family);\n  font-size: var(--bs-btn-font-size);\n  font-weight: var(--bs-btn-font-weight);\n  line-height: var(--bs-btn-line-height);\n  color: var(--bs-btn-color);\n  text-align: center;\n  text-decoration: none;\n  vertical-align: middle;\n  cursor: pointer;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  user-select: none;\n  border: var(--bs-btn-border-width) solid var(--bs-btn-border-color);\n  border-radius: var(--bs-btn-border-radius);\n  background-color: var(--bs-btn-bg);\n  transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n  .btn {\n    transition: none;\n  }\n}\n.btn:hover {\n  color: var(--bs-btn-hover-color);\n  background-color: var(--bs-btn-hover-bg);\n  border-color: var(--bs-btn-hover-border-color);\n}\n.btn-check + .btn:hover {\n  color: var(--bs-btn-color);\n  background-color: var(--bs-btn-bg);\n  border-color: var(--bs-btn-border-color);\n}\n.btn:focus-visible {\n  color: var(--bs-btn-hover-color);\n  background-color: var(--bs-btn-hover-bg);\n  border-color: var(--bs-btn-hover-border-color);\n  outline: 0;\n  box-shadow: var(--bs-btn-focus-box-shadow);\n}\n.btn-check:focus-visible + .btn {\n  border-color: var(--bs-btn-hover-border-color);\n  outline: 0;\n  box-shadow: var(--bs-btn-focus-box-shadow);\n}\n.btn-check:checked + .btn, :not(.btn-check) + .btn:active, .btn:first-child:active, .btn.active, .btn.show {\n  color: var(--bs-btn-active-color);\n  background-color: var(--bs-btn-active-bg);\n  border-color: var(--bs-btn-active-border-color);\n}\n.btn-check:checked + .btn:focus-visible, :not(.btn-check) + .btn:active:focus-visible, .btn:first-child:active:focus-visible, .btn.active:focus-visible, .btn.show:focus-visible {\n  box-shadow: var(--bs-btn-focus-box-shadow);\n}\n.btn-check:checked:focus-visible + .btn {\n  box-shadow: var(--bs-btn-focus-box-shadow);\n}\n.btn:disabled, .btn.disabled, fieldset:disabled .btn {\n  color: var(--bs-btn-disabled-color);\n  pointer-events: none;\n  background-color: var(--bs-btn-disabled-bg);\n  border-color: var(--bs-btn-disabled-border-color);\n  opacity: var(--bs-btn-disabled-opacity);\n}\n\n.btn-primary {\n  --bs-btn-color: #fff;\n  --bs-btn-bg: #0d6efd;\n  --bs-btn-border-color: #0d6efd;\n  --bs-btn-hover-color: #fff;\n  --bs-btn-hover-bg: #0b5ed7;\n  --bs-btn-hover-border-color: #0a58ca;\n  --bs-btn-focus-shadow-rgb: 49, 132, 253;\n  --bs-btn-active-color: #fff;\n  --bs-btn-active-bg: #0a58ca;\n  --bs-btn-active-border-color: #0a53be;\n  --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n  --bs-btn-disabled-color: #fff;\n  --bs-btn-disabled-bg: #0d6efd;\n  --bs-btn-disabled-border-color: #0d6efd;\n}\n\n.btn-secondary {\n  --bs-btn-color: #fff;\n  --bs-btn-bg: #6c757d;\n  --bs-btn-border-color: #6c757d;\n  --bs-btn-hover-color: #fff;\n  --bs-btn-hover-bg: #5c636a;\n  --bs-btn-hover-border-color: #565e64;\n  --bs-btn-focus-shadow-rgb: 130, 138, 145;\n  --bs-btn-active-color: #fff;\n  --bs-btn-active-bg: #565e64;\n  --bs-btn-active-border-color: #51585e;\n  --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n  --bs-btn-disabled-color: #fff;\n  --bs-btn-disabled-bg: #6c757d;\n  --bs-btn-disabled-border-color: #6c757d;\n}\n\n.btn-success {\n  --bs-btn-color: #fff;\n  --bs-btn-bg: #198754;\n  --bs-btn-border-color: #198754;\n  --bs-btn-hover-color: #fff;\n  --bs-btn-hover-bg: #157347;\n  --bs-btn-hover-border-color: #146c43;\n  --bs-btn-focus-shadow-rgb: 60, 153, 110;\n  --bs-btn-active-color: #fff;\n  --bs-btn-active-bg: #146c43;\n  --bs-btn-active-border-color: #13653f;\n  --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n  --bs-btn-disabled-color: #fff;\n  --bs-btn-disabled-bg: #198754;\n  --bs-btn-disabled-border-color: #198754;\n}\n\n.btn-info {\n  --bs-btn-color: #000;\n  --bs-btn-bg: #0dcaf0;\n  --bs-btn-border-color: #0dcaf0;\n  --bs-btn-hover-color: #000;\n  --bs-btn-hover-bg: #31d2f2;\n  --bs-btn-hover-border-color: #25cff2;\n  --bs-btn-focus-shadow-rgb: 11, 172, 204;\n  --bs-btn-active-color: #000;\n  --bs-btn-active-bg: #3dd5f3;\n  --bs-btn-active-border-color: #25cff2;\n  --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n  --bs-btn-disabled-color: #000;\n  --bs-btn-disabled-bg: #0dcaf0;\n  --bs-btn-disabled-border-color: #0dcaf0;\n}\n\n.btn-warning {\n  --bs-btn-color: #000;\n  --bs-btn-bg: #ffc107;\n  --bs-btn-border-color: #ffc107;\n  --bs-btn-hover-color: #000;\n  --bs-btn-hover-bg: #ffca2c;\n  --bs-btn-hover-border-color: #ffc720;\n  --bs-btn-focus-shadow-rgb: 217, 164, 6;\n  --bs-btn-active-color: #000;\n  --bs-btn-active-bg: #ffcd39;\n  --bs-btn-active-border-color: #ffc720;\n  --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n  --bs-btn-disabled-color: #000;\n  --bs-btn-disabled-bg: #ffc107;\n  --bs-btn-disabled-border-color: #ffc107;\n}\n\n.btn-danger {\n  --bs-btn-color: #fff;\n  --bs-btn-bg: #dc3545;\n  --bs-btn-border-color: #dc3545;\n  --bs-btn-hover-color: #fff;\n  --bs-btn-hover-bg: #bb2d3b;\n  --bs-btn-hover-border-color: #b02a37;\n  --bs-btn-focus-shadow-rgb: 225, 83, 97;\n  --bs-btn-active-color: #fff;\n  --bs-btn-active-bg: #b02a37;\n  --bs-btn-active-border-color: #a52834;\n  --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n  --bs-btn-disabled-color: #fff;\n  --bs-btn-disabled-bg: #dc3545;\n  --bs-btn-disabled-border-color: #dc3545;\n}\n\n.btn-light {\n  --bs-btn-color: #000;\n  --bs-btn-bg: #f8f9fa;\n  --bs-btn-border-color: #f8f9fa;\n  --bs-btn-hover-color: #000;\n  --bs-btn-hover-bg: #d3d4d5;\n  --bs-btn-hover-border-color: #c6c7c8;\n  --bs-btn-focus-shadow-rgb: 211, 212, 213;\n  --bs-btn-active-color: #000;\n  --bs-btn-active-bg: #c6c7c8;\n  --bs-btn-active-border-color: #babbbc;\n  --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n  --bs-btn-disabled-color: #000;\n  --bs-btn-disabled-bg: #f8f9fa;\n  --bs-btn-disabled-border-color: #f8f9fa;\n}\n\n.btn-dark {\n  --bs-btn-color: #fff;\n  --bs-btn-bg: #212529;\n  --bs-btn-border-color: #212529;\n  --bs-btn-hover-color: #fff;\n  --bs-btn-hover-bg: #424649;\n  --bs-btn-hover-border-color: #373b3e;\n  --bs-btn-focus-shadow-rgb: 66, 70, 73;\n  --bs-btn-active-color: #fff;\n  --bs-btn-active-bg: #4d5154;\n  --bs-btn-active-border-color: #373b3e;\n  --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n  --bs-btn-disabled-color: #fff;\n  --bs-btn-disabled-bg: #212529;\n  --bs-btn-disabled-border-color: #212529;\n}\n\n.btn-outline-primary {\n  --bs-btn-color: #0d6efd;\n  --bs-btn-border-color: #0d6efd;\n  --bs-btn-hover-color: #fff;\n  --bs-btn-hover-bg: #0d6efd;\n  --bs-btn-hover-border-color: #0d6efd;\n  --bs-btn-focus-shadow-rgb: 13, 110, 253;\n  --bs-btn-active-color: #fff;\n  --bs-btn-active-bg: #0d6efd;\n  --bs-btn-active-border-color: #0d6efd;\n  --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n  --bs-btn-disabled-color: #0d6efd;\n  --bs-btn-disabled-bg: transparent;\n  --bs-btn-disabled-border-color: #0d6efd;\n  --bs-gradient: none;\n}\n\n.btn-outline-secondary {\n  --bs-btn-color: #6c757d;\n  --bs-btn-border-color: #6c757d;\n  --bs-btn-hover-color: #fff;\n  --bs-btn-hover-bg: #6c757d;\n  --bs-btn-hover-border-color: #6c757d;\n  --bs-btn-focus-shadow-rgb: 108, 117, 125;\n  --bs-btn-active-color: #fff;\n  --bs-btn-active-bg: #6c757d;\n  --bs-btn-active-border-color: #6c757d;\n  --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n  --bs-btn-disabled-color: #6c757d;\n  --bs-btn-disabled-bg: transparent;\n  --bs-btn-disabled-border-color: #6c757d;\n  --bs-gradient: none;\n}\n\n.btn-outline-success {\n  --bs-btn-color: #198754;\n  --bs-btn-border-color: #198754;\n  --bs-btn-hover-color: #fff;\n  --bs-btn-hover-bg: #198754;\n  --bs-btn-hover-border-color: #198754;\n  --bs-btn-focus-shadow-rgb: 25, 135, 84;\n  --bs-btn-active-color: #fff;\n  --bs-btn-active-bg: #198754;\n  --bs-btn-active-border-color: #198754;\n  --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n  --bs-btn-disabled-color: #198754;\n  --bs-btn-disabled-bg: transparent;\n  --bs-btn-disabled-border-color: #198754;\n  --bs-gradient: none;\n}\n\n.btn-outline-info {\n  --bs-btn-color: #0dcaf0;\n  --bs-btn-border-color: #0dcaf0;\n  --bs-btn-hover-color: #000;\n  --bs-btn-hover-bg: #0dcaf0;\n  --bs-btn-hover-border-color: #0dcaf0;\n  --bs-btn-focus-shadow-rgb: 13, 202, 240;\n  --bs-btn-active-color: #000;\n  --bs-btn-active-bg: #0dcaf0;\n  --bs-btn-active-border-color: #0dcaf0;\n  --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n  --bs-btn-disabled-color: #0dcaf0;\n  --bs-btn-disabled-bg: transparent;\n  --bs-btn-disabled-border-color: #0dcaf0;\n  --bs-gradient: none;\n}\n\n.btn-outline-warning {\n  --bs-btn-color: #ffc107;\n  --bs-btn-border-color: #ffc107;\n  --bs-btn-hover-color: #000;\n  --bs-btn-hover-bg: #ffc107;\n  --bs-btn-hover-border-color: #ffc107;\n  --bs-btn-focus-shadow-rgb: 255, 193, 7;\n  --bs-btn-active-color: #000;\n  --bs-btn-active-bg: #ffc107;\n  --bs-btn-active-border-color: #ffc107;\n  --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n  --bs-btn-disabled-color: #ffc107;\n  --bs-btn-disabled-bg: transparent;\n  --bs-btn-disabled-border-color: #ffc107;\n  --bs-gradient: none;\n}\n\n.btn-outline-danger {\n  --bs-btn-color: #dc3545;\n  --bs-btn-border-color: #dc3545;\n  --bs-btn-hover-color: #fff;\n  --bs-btn-hover-bg: #dc3545;\n  --bs-btn-hover-border-color: #dc3545;\n  --bs-btn-focus-shadow-rgb: 220, 53, 69;\n  --bs-btn-active-color: #fff;\n  --bs-btn-active-bg: #dc3545;\n  --bs-btn-active-border-color: #dc3545;\n  --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n  --bs-btn-disabled-color: #dc3545;\n  --bs-btn-disabled-bg: transparent;\n  --bs-btn-disabled-border-color: #dc3545;\n  --bs-gradient: none;\n}\n\n.btn-outline-light {\n  --bs-btn-color: #f8f9fa;\n  --bs-btn-border-color: #f8f9fa;\n  --bs-btn-hover-color: #000;\n  --bs-btn-hover-bg: #f8f9fa;\n  --bs-btn-hover-border-color: #f8f9fa;\n  --bs-btn-focus-shadow-rgb: 248, 249, 250;\n  --bs-btn-active-color: #000;\n  --bs-btn-active-bg: #f8f9fa;\n  --bs-btn-active-border-color: #f8f9fa;\n  --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n  --bs-btn-disabled-color: #f8f9fa;\n  --bs-btn-disabled-bg: transparent;\n  --bs-btn-disabled-border-color: #f8f9fa;\n  --bs-gradient: none;\n}\n\n.btn-outline-dark {\n  --bs-btn-color: #212529;\n  --bs-btn-border-color: #212529;\n  --bs-btn-hover-color: #fff;\n  --bs-btn-hover-bg: #212529;\n  --bs-btn-hover-border-color: #212529;\n  --bs-btn-focus-shadow-rgb: 33, 37, 41;\n  --bs-btn-active-color: #fff;\n  --bs-btn-active-bg: #212529;\n  --bs-btn-active-border-color: #212529;\n  --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n  --bs-btn-disabled-color: #212529;\n  --bs-btn-disabled-bg: transparent;\n  --bs-btn-disabled-border-color: #212529;\n  --bs-gradient: none;\n}\n\n.btn-link {\n  --bs-btn-font-weight: 400;\n  --bs-btn-color: var(--bs-link-color);\n  --bs-btn-bg: transparent;\n  --bs-btn-border-color: transparent;\n  --bs-btn-hover-color: var(--bs-link-hover-color);\n  --bs-btn-hover-border-color: transparent;\n  --bs-btn-active-color: var(--bs-link-hover-color);\n  --bs-btn-active-border-color: transparent;\n  --bs-btn-disabled-color: #6c757d;\n  --bs-btn-disabled-border-color: transparent;\n  --bs-btn-box-shadow: 0 0 0 #000;\n  --bs-btn-focus-shadow-rgb: 49, 132, 253;\n  text-decoration: underline;\n}\n.btn-link:focus-visible {\n  color: var(--bs-btn-color);\n}\n.btn-link:hover {\n  color: var(--bs-btn-hover-color);\n}\n\n.btn-lg, .btn-group-lg > .btn {\n  --bs-btn-padding-y: 0.5rem;\n  --bs-btn-padding-x: 1rem;\n  --bs-btn-font-size: 1.25rem;\n  --bs-btn-border-radius: var(--bs-border-radius-lg);\n}\n\n.btn-sm, .btn-group-sm > .btn {\n  --bs-btn-padding-y: 0.25rem;\n  --bs-btn-padding-x: 0.5rem;\n  --bs-btn-font-size: 0.875rem;\n  --bs-btn-border-radius: var(--bs-border-radius-sm);\n}\n\n.fade {\n  transition: opacity 0.15s linear;\n}\n@media (prefers-reduced-motion: reduce) {\n  .fade {\n    transition: none;\n  }\n}\n.fade:not(.show) {\n  opacity: 0;\n}\n\n.collapse:not(.show) {\n  display: none;\n}\n\n.collapsing {\n  height: 0;\n  overflow: hidden;\n  transition: height 0.35s ease;\n}\n@media (prefers-reduced-motion: reduce) {\n  .collapsing {\n    transition: none;\n  }\n}\n.collapsing.collapse-horizontal {\n  width: 0;\n  height: auto;\n  transition: width 0.35s ease;\n}\n@media (prefers-reduced-motion: reduce) {\n  .collapsing.collapse-horizontal {\n    transition: none;\n  }\n}\n\n.dropup,\n.dropend,\n.dropdown,\n.dropstart,\n.dropup-center,\n.dropdown-center {\n  position: relative;\n}\n\n.dropdown-toggle {\n  white-space: nowrap;\n}\n.dropdown-toggle::after {\n  display: inline-block;\n  margin-left: 0.255em;\n  vertical-align: 0.255em;\n  content: \"\";\n  border-top: 0.3em solid;\n  border-right: 0.3em solid transparent;\n  border-bottom: 0;\n  border-left: 0.3em solid transparent;\n}\n.dropdown-toggle:empty::after {\n  margin-left: 0;\n}\n\n.dropdown-menu {\n  --bs-dropdown-zindex: 1000;\n  --bs-dropdown-min-width: 10rem;\n  --bs-dropdown-padding-x: 0;\n  --bs-dropdown-padding-y: 0.5rem;\n  --bs-dropdown-spacer: 0.125rem;\n  --bs-dropdown-font-size: 1rem;\n  --bs-dropdown-color: var(--bs-body-color);\n  --bs-dropdown-bg: var(--bs-body-bg);\n  --bs-dropdown-border-color: var(--bs-border-color-translucent);\n  --bs-dropdown-border-radius: var(--bs-border-radius);\n  --bs-dropdown-border-width: var(--bs-border-width);\n  --bs-dropdown-inner-border-radius: calc(var(--bs-border-radius) - var(--bs-border-width));\n  --bs-dropdown-divider-bg: var(--bs-border-color-translucent);\n  --bs-dropdown-divider-margin-y: 0.5rem;\n  --bs-dropdown-box-shadow: var(--bs-box-shadow);\n  --bs-dropdown-link-color: var(--bs-body-color);\n  --bs-dropdown-link-hover-color: var(--bs-body-color);\n  --bs-dropdown-link-hover-bg: var(--bs-tertiary-bg);\n  --bs-dropdown-link-active-color: #fff;\n  --bs-dropdown-link-active-bg: #0d6efd;\n  --bs-dropdown-link-disabled-color: var(--bs-tertiary-color);\n  --bs-dropdown-item-padding-x: 1rem;\n  --bs-dropdown-item-padding-y: 0.25rem;\n  --bs-dropdown-header-color: #6c757d;\n  --bs-dropdown-header-padding-x: 1rem;\n  --bs-dropdown-header-padding-y: 0.5rem;\n  position: absolute;\n  z-index: var(--bs-dropdown-zindex);\n  display: none;\n  min-width: var(--bs-dropdown-min-width);\n  padding: var(--bs-dropdown-padding-y) var(--bs-dropdown-padding-x);\n  margin: 0;\n  font-size: var(--bs-dropdown-font-size);\n  color: var(--bs-dropdown-color);\n  text-align: left;\n  list-style: none;\n  background-color: var(--bs-dropdown-bg);\n  background-clip: padding-box;\n  border: var(--bs-dropdown-border-width) solid var(--bs-dropdown-border-color);\n  border-radius: var(--bs-dropdown-border-radius);\n}\n.dropdown-menu[data-bs-popper] {\n  top: 100%;\n  left: 0;\n  margin-top: var(--bs-dropdown-spacer);\n}\n\n.dropdown-menu-start {\n  --bs-position: start;\n}\n.dropdown-menu-start[data-bs-popper] {\n  right: auto;\n  left: 0;\n}\n\n.dropdown-menu-end {\n  --bs-position: end;\n}\n.dropdown-menu-end[data-bs-popper] {\n  right: 0;\n  left: auto;\n}\n\n@media (min-width: 576px) {\n  .dropdown-menu-sm-start {\n    --bs-position: start;\n  }\n  .dropdown-menu-sm-start[data-bs-popper] {\n    right: auto;\n    left: 0;\n  }\n  .dropdown-menu-sm-end {\n    --bs-position: end;\n  }\n  .dropdown-menu-sm-end[data-bs-popper] {\n    right: 0;\n    left: auto;\n  }\n}\n@media (min-width: 768px) {\n  .dropdown-menu-md-start {\n    --bs-position: start;\n  }\n  .dropdown-menu-md-start[data-bs-popper] {\n    right: auto;\n    left: 0;\n  }\n  .dropdown-menu-md-end {\n    --bs-position: end;\n  }\n  .dropdown-menu-md-end[data-bs-popper] {\n    right: 0;\n    left: auto;\n  }\n}\n@media (min-width: 992px) {\n  .dropdown-menu-lg-start {\n    --bs-position: start;\n  }\n  .dropdown-menu-lg-start[data-bs-popper] {\n    right: auto;\n    left: 0;\n  }\n  .dropdown-menu-lg-end {\n    --bs-position: end;\n  }\n  .dropdown-menu-lg-end[data-bs-popper] {\n    right: 0;\n    left: auto;\n  }\n}\n@media (min-width: 1200px) {\n  .dropdown-menu-xl-start {\n    --bs-position: start;\n  }\n  .dropdown-menu-xl-start[data-bs-popper] {\n    right: auto;\n    left: 0;\n  }\n  .dropdown-menu-xl-end {\n    --bs-position: end;\n  }\n  .dropdown-menu-xl-end[data-bs-popper] {\n    right: 0;\n    left: auto;\n  }\n}\n@media (min-width: 1400px) {\n  .dropdown-menu-xxl-start {\n    --bs-position: start;\n  }\n  .dropdown-menu-xxl-start[data-bs-popper] {\n    right: auto;\n    left: 0;\n  }\n  .dropdown-menu-xxl-end {\n    --bs-position: end;\n  }\n  .dropdown-menu-xxl-end[data-bs-popper] {\n    right: 0;\n    left: auto;\n  }\n}\n.dropup .dropdown-menu[data-bs-popper] {\n  top: auto;\n  bottom: 100%;\n  margin-top: 0;\n  margin-bottom: var(--bs-dropdown-spacer);\n}\n.dropup .dropdown-toggle::after {\n  display: inline-block;\n  margin-left: 0.255em;\n  vertical-align: 0.255em;\n  content: \"\";\n  border-top: 0;\n  border-right: 0.3em solid transparent;\n  border-bottom: 0.3em solid;\n  border-left: 0.3em solid transparent;\n}\n.dropup .dropdown-toggle:empty::after {\n  margin-left: 0;\n}\n\n.dropend .dropdown-menu[data-bs-popper] {\n  top: 0;\n  right: auto;\n  left: 100%;\n  margin-top: 0;\n  margin-left: var(--bs-dropdown-spacer);\n}\n.dropend .dropdown-toggle::after {\n  display: inline-block;\n  margin-left: 0.255em;\n  vertical-align: 0.255em;\n  content: \"\";\n  border-top: 0.3em solid transparent;\n  border-right: 0;\n  border-bottom: 0.3em solid transparent;\n  border-left: 0.3em solid;\n}\n.dropend .dropdown-toggle:empty::after {\n  margin-left: 0;\n}\n.dropend .dropdown-toggle::after {\n  vertical-align: 0;\n}\n\n.dropstart .dropdown-menu[data-bs-popper] {\n  top: 0;\n  right: 100%;\n  left: auto;\n  margin-top: 0;\n  margin-right: var(--bs-dropdown-spacer);\n}\n.dropstart .dropdown-toggle::after {\n  display: inline-block;\n  margin-left: 0.255em;\n  vertical-align: 0.255em;\n  content: \"\";\n}\n.dropstart .dropdown-toggle::after {\n  display: none;\n}\n.dropstart .dropdown-toggle::before {\n  display: inline-block;\n  margin-right: 0.255em;\n  vertical-align: 0.255em;\n  content: \"\";\n  border-top: 0.3em solid transparent;\n  border-right: 0.3em solid;\n  border-bottom: 0.3em solid transparent;\n}\n.dropstart .dropdown-toggle:empty::after {\n  margin-left: 0;\n}\n.dropstart .dropdown-toggle::before {\n  vertical-align: 0;\n}\n\n.dropdown-divider {\n  height: 0;\n  margin: var(--bs-dropdown-divider-margin-y) 0;\n  overflow: hidden;\n  border-top: 1px solid var(--bs-dropdown-divider-bg);\n  opacity: 1;\n}\n\n.dropdown-item {\n  display: block;\n  width: 100%;\n  padding: var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);\n  clear: both;\n  font-weight: 400;\n  color: var(--bs-dropdown-link-color);\n  text-align: inherit;\n  text-decoration: none;\n  white-space: nowrap;\n  background-color: transparent;\n  border: 0;\n  border-radius: var(--bs-dropdown-item-border-radius, 0);\n}\n.dropdown-item:hover, .dropdown-item:focus {\n  color: var(--bs-dropdown-link-hover-color);\n  background-color: var(--bs-dropdown-link-hover-bg);\n}\n.dropdown-item.active, .dropdown-item:active {\n  color: var(--bs-dropdown-link-active-color);\n  text-decoration: none;\n  background-color: var(--bs-dropdown-link-active-bg);\n}\n.dropdown-item.disabled, .dropdown-item:disabled {\n  color: var(--bs-dropdown-link-disabled-color);\n  pointer-events: none;\n  background-color: transparent;\n}\n\n.dropdown-menu.show {\n  display: block;\n}\n\n.dropdown-header {\n  display: block;\n  padding: var(--bs-dropdown-header-padding-y) var(--bs-dropdown-header-padding-x);\n  margin-bottom: 0;\n  font-size: 0.875rem;\n  color: var(--bs-dropdown-header-color);\n  white-space: nowrap;\n}\n\n.dropdown-item-text {\n  display: block;\n  padding: var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);\n  color: var(--bs-dropdown-link-color);\n}\n\n.dropdown-menu-dark {\n  --bs-dropdown-color: #dee2e6;\n  --bs-dropdown-bg: #343a40;\n  --bs-dropdown-border-color: var(--bs-border-color-translucent);\n  --bs-dropdown-box-shadow: ;\n  --bs-dropdown-link-color: #dee2e6;\n  --bs-dropdown-link-hover-color: #fff;\n  --bs-dropdown-divider-bg: var(--bs-border-color-translucent);\n  --bs-dropdown-link-hover-bg: rgba(255, 255, 255, 0.15);\n  --bs-dropdown-link-active-color: #fff;\n  --bs-dropdown-link-active-bg: #0d6efd;\n  --bs-dropdown-link-disabled-color: #adb5bd;\n  --bs-dropdown-header-color: #adb5bd;\n}\n\n.btn-group,\n.btn-group-vertical {\n  position: relative;\n  display: inline-flex;\n  vertical-align: middle;\n}\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n  position: relative;\n  flex: 1 1 auto;\n}\n.btn-group > .btn-check:checked + .btn,\n.btn-group > .btn-check:focus + .btn,\n.btn-group > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn-check:checked + .btn,\n.btn-group-vertical > .btn-check:focus + .btn,\n.btn-group-vertical > .btn:hover,\n.btn-group-vertical > .btn:focus,\n.btn-group-vertical > .btn:active,\n.btn-group-vertical > .btn.active {\n  z-index: 1;\n}\n\n.btn-toolbar {\n  display: flex;\n  flex-wrap: wrap;\n  justify-content: flex-start;\n}\n.btn-toolbar .input-group {\n  width: auto;\n}\n\n.btn-group {\n  border-radius: var(--bs-border-radius);\n}\n.btn-group > :not(.btn-check:first-child) + .btn,\n.btn-group > .btn-group:not(:first-child) {\n  margin-left: calc(-1 * var(--bs-border-width));\n}\n.btn-group > .btn:not(:last-child):not(.dropdown-toggle),\n.btn-group > .btn.dropdown-toggle-split:first-child,\n.btn-group > .btn-group:not(:last-child) > .btn {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.btn-group > .btn:nth-child(n+3),\n.btn-group > :not(.btn-check) + .btn,\n.btn-group > .btn-group:not(:first-child) > .btn {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.dropdown-toggle-split {\n  padding-right: 0.5625rem;\n  padding-left: 0.5625rem;\n}\n.dropdown-toggle-split::after, .dropup .dropdown-toggle-split::after, .dropend .dropdown-toggle-split::after {\n  margin-left: 0;\n}\n.dropstart .dropdown-toggle-split::before {\n  margin-right: 0;\n}\n\n.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split {\n  padding-right: 0.375rem;\n  padding-left: 0.375rem;\n}\n\n.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split {\n  padding-right: 0.75rem;\n  padding-left: 0.75rem;\n}\n\n.btn-group-vertical {\n  flex-direction: column;\n  align-items: flex-start;\n  justify-content: center;\n}\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group {\n  width: 100%;\n}\n.btn-group-vertical > .btn:not(:first-child),\n.btn-group-vertical > .btn-group:not(:first-child) {\n  margin-top: calc(-1 * var(--bs-border-width));\n}\n.btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle),\n.btn-group-vertical > .btn-group:not(:last-child) > .btn {\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn:nth-child(n+3),\n.btn-group-vertical > :not(.btn-check) + .btn,\n.btn-group-vertical > .btn-group:not(:first-child) > .btn {\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n}\n\n.nav {\n  --bs-nav-link-padding-x: 1rem;\n  --bs-nav-link-padding-y: 0.5rem;\n  --bs-nav-link-font-weight: ;\n  --bs-nav-link-color: var(--bs-link-color);\n  --bs-nav-link-hover-color: var(--bs-link-hover-color);\n  --bs-nav-link-disabled-color: var(--bs-secondary-color);\n  display: flex;\n  flex-wrap: wrap;\n  padding-left: 0;\n  margin-bottom: 0;\n  list-style: none;\n}\n\n.nav-link {\n  display: block;\n  padding: var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x);\n  font-size: var(--bs-nav-link-font-size);\n  font-weight: var(--bs-nav-link-font-weight);\n  color: var(--bs-nav-link-color);\n  text-decoration: none;\n  background: none;\n  border: 0;\n  transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n  .nav-link {\n    transition: none;\n  }\n}\n.nav-link:hover, .nav-link:focus {\n  color: var(--bs-nav-link-hover-color);\n}\n.nav-link:focus-visible {\n  outline: 0;\n  box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n}\n.nav-link.disabled, .nav-link:disabled {\n  color: var(--bs-nav-link-disabled-color);\n  pointer-events: none;\n  cursor: default;\n}\n\n.nav-tabs {\n  --bs-nav-tabs-border-width: var(--bs-border-width);\n  --bs-nav-tabs-border-color: var(--bs-border-color);\n  --bs-nav-tabs-border-radius: var(--bs-border-radius);\n  --bs-nav-tabs-link-hover-border-color: var(--bs-secondary-bg) var(--bs-secondary-bg) var(--bs-border-color);\n  --bs-nav-tabs-link-active-color: var(--bs-emphasis-color);\n  --bs-nav-tabs-link-active-bg: var(--bs-body-bg);\n  --bs-nav-tabs-link-active-border-color: var(--bs-border-color) var(--bs-border-color) var(--bs-body-bg);\n  border-bottom: var(--bs-nav-tabs-border-width) solid var(--bs-nav-tabs-border-color);\n}\n.nav-tabs .nav-link {\n  margin-bottom: calc(-1 * var(--bs-nav-tabs-border-width));\n  border: var(--bs-nav-tabs-border-width) solid transparent;\n  border-top-left-radius: var(--bs-nav-tabs-border-radius);\n  border-top-right-radius: var(--bs-nav-tabs-border-radius);\n}\n.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus {\n  isolation: isolate;\n  border-color: var(--bs-nav-tabs-link-hover-border-color);\n}\n.nav-tabs .nav-link.active,\n.nav-tabs .nav-item.show .nav-link {\n  color: var(--bs-nav-tabs-link-active-color);\n  background-color: var(--bs-nav-tabs-link-active-bg);\n  border-color: var(--bs-nav-tabs-link-active-border-color);\n}\n.nav-tabs .dropdown-menu {\n  margin-top: calc(-1 * var(--bs-nav-tabs-border-width));\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n}\n\n.nav-pills {\n  --bs-nav-pills-border-radius: var(--bs-border-radius);\n  --bs-nav-pills-link-active-color: #fff;\n  --bs-nav-pills-link-active-bg: #0d6efd;\n}\n.nav-pills .nav-link {\n  border-radius: var(--bs-nav-pills-border-radius);\n}\n.nav-pills .nav-link.active,\n.nav-pills .show > .nav-link {\n  color: var(--bs-nav-pills-link-active-color);\n  background-color: var(--bs-nav-pills-link-active-bg);\n}\n\n.nav-underline {\n  --bs-nav-underline-gap: 1rem;\n  --bs-nav-underline-border-width: 0.125rem;\n  --bs-nav-underline-link-active-color: var(--bs-emphasis-color);\n  gap: var(--bs-nav-underline-gap);\n}\n.nav-underline .nav-link {\n  padding-right: 0;\n  padding-left: 0;\n  border-bottom: var(--bs-nav-underline-border-width) solid transparent;\n}\n.nav-underline .nav-link:hover, .nav-underline .nav-link:focus {\n  border-bottom-color: currentcolor;\n}\n.nav-underline .nav-link.active,\n.nav-underline .show > .nav-link {\n  font-weight: 700;\n  color: var(--bs-nav-underline-link-active-color);\n  border-bottom-color: currentcolor;\n}\n\n.nav-fill > .nav-link,\n.nav-fill .nav-item {\n  flex: 1 1 auto;\n  text-align: center;\n}\n\n.nav-justified > .nav-link,\n.nav-justified .nav-item {\n  flex-grow: 1;\n  flex-basis: 0;\n  text-align: center;\n}\n\n.nav-fill .nav-item .nav-link,\n.nav-justified .nav-item .nav-link {\n  width: 100%;\n}\n\n.tab-content > .tab-pane {\n  display: none;\n}\n.tab-content > .active {\n  display: block;\n}\n\n.navbar {\n  --bs-navbar-padding-x: 0;\n  --bs-navbar-padding-y: 0.5rem;\n  --bs-navbar-color: rgba(var(--bs-emphasis-color-rgb), 0.65);\n  --bs-navbar-hover-color: rgba(var(--bs-emphasis-color-rgb), 0.8);\n  --bs-navbar-disabled-color: rgba(var(--bs-emphasis-color-rgb), 0.3);\n  --bs-navbar-active-color: rgba(var(--bs-emphasis-color-rgb), 1);\n  --bs-navbar-brand-padding-y: 0.3125rem;\n  --bs-navbar-brand-margin-end: 1rem;\n  --bs-navbar-brand-font-size: 1.25rem;\n  --bs-navbar-brand-color: rgba(var(--bs-emphasis-color-rgb), 1);\n  --bs-navbar-brand-hover-color: rgba(var(--bs-emphasis-color-rgb), 1);\n  --bs-navbar-nav-link-padding-x: 0.5rem;\n  --bs-navbar-toggler-padding-y: 0.25rem;\n  --bs-navbar-toggler-padding-x: 0.75rem;\n  --bs-navbar-toggler-font-size: 1.25rem;\n  --bs-navbar-toggler-icon-bg: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%2833, 37, 41, 0.75%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\");\n  --bs-navbar-toggler-border-color: rgba(var(--bs-emphasis-color-rgb), 0.15);\n  --bs-navbar-toggler-border-radius: var(--bs-border-radius);\n  --bs-navbar-toggler-focus-width: 0.25rem;\n  --bs-navbar-toggler-transition: box-shadow 0.15s ease-in-out;\n  position: relative;\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  justify-content: space-between;\n  padding: var(--bs-navbar-padding-y) var(--bs-navbar-padding-x);\n}\n.navbar > .container,\n.navbar > .container-fluid,\n.navbar > .container-sm,\n.navbar > .container-md,\n.navbar > .container-lg,\n.navbar > .container-xl,\n.navbar > .container-xxl {\n  display: flex;\n  flex-wrap: inherit;\n  align-items: center;\n  justify-content: space-between;\n}\n.navbar-brand {\n  padding-top: var(--bs-navbar-brand-padding-y);\n  padding-bottom: var(--bs-navbar-brand-padding-y);\n  margin-right: var(--bs-navbar-brand-margin-end);\n  font-size: var(--bs-navbar-brand-font-size);\n  color: var(--bs-navbar-brand-color);\n  text-decoration: none;\n  white-space: nowrap;\n}\n.navbar-brand:hover, .navbar-brand:focus {\n  color: var(--bs-navbar-brand-hover-color);\n}\n\n.navbar-nav {\n  --bs-nav-link-padding-x: 0;\n  --bs-nav-link-padding-y: 0.5rem;\n  --bs-nav-link-font-weight: ;\n  --bs-nav-link-color: var(--bs-navbar-color);\n  --bs-nav-link-hover-color: var(--bs-navbar-hover-color);\n  --bs-nav-link-disabled-color: var(--bs-navbar-disabled-color);\n  display: flex;\n  flex-direction: column;\n  padding-left: 0;\n  margin-bottom: 0;\n  list-style: none;\n}\n.navbar-nav .nav-link.active, .navbar-nav .nav-link.show {\n  color: var(--bs-navbar-active-color);\n}\n.navbar-nav .dropdown-menu {\n  position: static;\n}\n\n.navbar-text {\n  padding-top: 0.5rem;\n  padding-bottom: 0.5rem;\n  color: var(--bs-navbar-color);\n}\n.navbar-text a,\n.navbar-text a:hover,\n.navbar-text a:focus {\n  color: var(--bs-navbar-active-color);\n}\n\n.navbar-collapse {\n  flex-grow: 1;\n  flex-basis: 100%;\n  align-items: center;\n}\n\n.navbar-toggler {\n  padding: var(--bs-navbar-toggler-padding-y) var(--bs-navbar-toggler-padding-x);\n  font-size: var(--bs-navbar-toggler-font-size);\n  line-height: 1;\n  color: var(--bs-navbar-color);\n  background-color: transparent;\n  border: var(--bs-border-width) solid var(--bs-navbar-toggler-border-color);\n  border-radius: var(--bs-navbar-toggler-border-radius);\n  transition: var(--bs-navbar-toggler-transition);\n}\n@media (prefers-reduced-motion: reduce) {\n  .navbar-toggler {\n    transition: none;\n  }\n}\n.navbar-toggler:hover {\n  text-decoration: none;\n}\n.navbar-toggler:focus {\n  text-decoration: none;\n  outline: 0;\n  box-shadow: 0 0 0 var(--bs-navbar-toggler-focus-width);\n}\n\n.navbar-toggler-icon {\n  display: inline-block;\n  width: 1.5em;\n  height: 1.5em;\n  vertical-align: middle;\n  background-image: var(--bs-navbar-toggler-icon-bg);\n  background-repeat: no-repeat;\n  background-position: center;\n  background-size: 100%;\n}\n\n.navbar-nav-scroll {\n  max-height: var(--bs-scroll-height, 75vh);\n  overflow-y: auto;\n}\n\n@media (min-width: 576px) {\n  .navbar-expand-sm {\n    flex-wrap: nowrap;\n    justify-content: flex-start;\n  }\n  .navbar-expand-sm .navbar-nav {\n    flex-direction: row;\n  }\n  .navbar-expand-sm .navbar-nav .dropdown-menu {\n    position: absolute;\n  }\n  .navbar-expand-sm .navbar-nav .nav-link {\n    padding-right: var(--bs-navbar-nav-link-padding-x);\n    padding-left: var(--bs-navbar-nav-link-padding-x);\n  }\n  .navbar-expand-sm .navbar-nav-scroll {\n    overflow: visible;\n  }\n  .navbar-expand-sm .navbar-collapse {\n    display: flex !important;\n    flex-basis: auto;\n  }\n  .navbar-expand-sm .navbar-toggler {\n    display: none;\n  }\n  .navbar-expand-sm .offcanvas {\n    position: static;\n    z-index: auto;\n    flex-grow: 1;\n    width: auto !important;\n    height: auto !important;\n    visibility: visible !important;\n    background-color: transparent !important;\n    border: 0 !important;\n    transform: none !important;\n    transition: none;\n  }\n  .navbar-expand-sm .offcanvas .offcanvas-header {\n    display: none;\n  }\n  .navbar-expand-sm .offcanvas .offcanvas-body {\n    display: flex;\n    flex-grow: 0;\n    padding: 0;\n    overflow-y: visible;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-expand-md {\n    flex-wrap: nowrap;\n    justify-content: flex-start;\n  }\n  .navbar-expand-md .navbar-nav {\n    flex-direction: row;\n  }\n  .navbar-expand-md .navbar-nav .dropdown-menu {\n    position: absolute;\n  }\n  .navbar-expand-md .navbar-nav .nav-link {\n    padding-right: var(--bs-navbar-nav-link-padding-x);\n    padding-left: var(--bs-navbar-nav-link-padding-x);\n  }\n  .navbar-expand-md .navbar-nav-scroll {\n    overflow: visible;\n  }\n  .navbar-expand-md .navbar-collapse {\n    display: flex !important;\n    flex-basis: auto;\n  }\n  .navbar-expand-md .navbar-toggler {\n    display: none;\n  }\n  .navbar-expand-md .offcanvas {\n    position: static;\n    z-index: auto;\n    flex-grow: 1;\n    width: auto !important;\n    height: auto !important;\n    visibility: visible !important;\n    background-color: transparent !important;\n    border: 0 !important;\n    transform: none !important;\n    transition: none;\n  }\n  .navbar-expand-md .offcanvas .offcanvas-header {\n    display: none;\n  }\n  .navbar-expand-md .offcanvas .offcanvas-body {\n    display: flex;\n    flex-grow: 0;\n    padding: 0;\n    overflow-y: visible;\n  }\n}\n@media (min-width: 992px) {\n  .navbar-expand-lg {\n    flex-wrap: nowrap;\n    justify-content: flex-start;\n  }\n  .navbar-expand-lg .navbar-nav {\n    flex-direction: row;\n  }\n  .navbar-expand-lg .navbar-nav .dropdown-menu {\n    position: absolute;\n  }\n  .navbar-expand-lg .navbar-nav .nav-link {\n    padding-right: var(--bs-navbar-nav-link-padding-x);\n    padding-left: var(--bs-navbar-nav-link-padding-x);\n  }\n  .navbar-expand-lg .navbar-nav-scroll {\n    overflow: visible;\n  }\n  .navbar-expand-lg .navbar-collapse {\n    display: flex !important;\n    flex-basis: auto;\n  }\n  .navbar-expand-lg .navbar-toggler {\n    display: none;\n  }\n  .navbar-expand-lg .offcanvas {\n    position: static;\n    z-index: auto;\n    flex-grow: 1;\n    width: auto !important;\n    height: auto !important;\n    visibility: visible !important;\n    background-color: transparent !important;\n    border: 0 !important;\n    transform: none !important;\n    transition: none;\n  }\n  .navbar-expand-lg .offcanvas .offcanvas-header {\n    display: none;\n  }\n  .navbar-expand-lg .offcanvas .offcanvas-body {\n    display: flex;\n    flex-grow: 0;\n    padding: 0;\n    overflow-y: visible;\n  }\n}\n@media (min-width: 1200px) {\n  .navbar-expand-xl {\n    flex-wrap: nowrap;\n    justify-content: flex-start;\n  }\n  .navbar-expand-xl .navbar-nav {\n    flex-direction: row;\n  }\n  .navbar-expand-xl .navbar-nav .dropdown-menu {\n    position: absolute;\n  }\n  .navbar-expand-xl .navbar-nav .nav-link {\n    padding-right: var(--bs-navbar-nav-link-padding-x);\n    padding-left: var(--bs-navbar-nav-link-padding-x);\n  }\n  .navbar-expand-xl .navbar-nav-scroll {\n    overflow: visible;\n  }\n  .navbar-expand-xl .navbar-collapse {\n    display: flex !important;\n    flex-basis: auto;\n  }\n  .navbar-expand-xl .navbar-toggler {\n    display: none;\n  }\n  .navbar-expand-xl .offcanvas {\n    position: static;\n    z-index: auto;\n    flex-grow: 1;\n    width: auto !important;\n    height: auto !important;\n    visibility: visible !important;\n    background-color: transparent !important;\n    border: 0 !important;\n    transform: none !important;\n    transition: none;\n  }\n  .navbar-expand-xl .offcanvas .offcanvas-header {\n    display: none;\n  }\n  .navbar-expand-xl .offcanvas .offcanvas-body {\n    display: flex;\n    flex-grow: 0;\n    padding: 0;\n    overflow-y: visible;\n  }\n}\n@media (min-width: 1400px) {\n  .navbar-expand-xxl {\n    flex-wrap: nowrap;\n    justify-content: flex-start;\n  }\n  .navbar-expand-xxl .navbar-nav {\n    flex-direction: row;\n  }\n  .navbar-expand-xxl .navbar-nav .dropdown-menu {\n    position: absolute;\n  }\n  .navbar-expand-xxl .navbar-nav .nav-link {\n    padding-right: var(--bs-navbar-nav-link-padding-x);\n    padding-left: var(--bs-navbar-nav-link-padding-x);\n  }\n  .navbar-expand-xxl .navbar-nav-scroll {\n    overflow: visible;\n  }\n  .navbar-expand-xxl .navbar-collapse {\n    display: flex !important;\n    flex-basis: auto;\n  }\n  .navbar-expand-xxl .navbar-toggler {\n    display: none;\n  }\n  .navbar-expand-xxl .offcanvas {\n    position: static;\n    z-index: auto;\n    flex-grow: 1;\n    width: auto !important;\n    height: auto !important;\n    visibility: visible !important;\n    background-color: transparent !important;\n    border: 0 !important;\n    transform: none !important;\n    transition: none;\n  }\n  .navbar-expand-xxl .offcanvas .offcanvas-header {\n    display: none;\n  }\n  .navbar-expand-xxl .offcanvas .offcanvas-body {\n    display: flex;\n    flex-grow: 0;\n    padding: 0;\n    overflow-y: visible;\n  }\n}\n.navbar-expand {\n  flex-wrap: nowrap;\n  justify-content: flex-start;\n}\n.navbar-expand .navbar-nav {\n  flex-direction: row;\n}\n.navbar-expand .navbar-nav .dropdown-menu {\n  position: absolute;\n}\n.navbar-expand .navbar-nav .nav-link {\n  padding-right: var(--bs-navbar-nav-link-padding-x);\n  padding-left: var(--bs-navbar-nav-link-padding-x);\n}\n.navbar-expand .navbar-nav-scroll {\n  overflow: visible;\n}\n.navbar-expand .navbar-collapse {\n  display: flex !important;\n  flex-basis: auto;\n}\n.navbar-expand .navbar-toggler {\n  display: none;\n}\n.navbar-expand .offcanvas {\n  position: static;\n  z-index: auto;\n  flex-grow: 1;\n  width: auto !important;\n  height: auto !important;\n  visibility: visible !important;\n  background-color: transparent !important;\n  border: 0 !important;\n  transform: none !important;\n  transition: none;\n}\n.navbar-expand .offcanvas .offcanvas-header {\n  display: none;\n}\n.navbar-expand .offcanvas .offcanvas-body {\n  display: flex;\n  flex-grow: 0;\n  padding: 0;\n  overflow-y: visible;\n}\n\n.navbar-dark,\n.navbar[data-bs-theme=dark] {\n  --bs-navbar-color: rgba(255, 255, 255, 0.55);\n  --bs-navbar-hover-color: rgba(255, 255, 255, 0.75);\n  --bs-navbar-disabled-color: rgba(255, 255, 255, 0.25);\n  --bs-navbar-active-color: #fff;\n  --bs-navbar-brand-color: #fff;\n  --bs-navbar-brand-hover-color: #fff;\n  --bs-navbar-toggler-border-color: rgba(255, 255, 255, 0.1);\n  --bs-navbar-toggler-icon-bg: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\");\n}\n\n[data-bs-theme=dark] .navbar-toggler-icon {\n  --bs-navbar-toggler-icon-bg: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\");\n}\n\n.card {\n  --bs-card-spacer-y: 1rem;\n  --bs-card-spacer-x: 1rem;\n  --bs-card-title-spacer-y: 0.5rem;\n  --bs-card-title-color: ;\n  --bs-card-subtitle-color: ;\n  --bs-card-border-width: var(--bs-border-width);\n  --bs-card-border-color: var(--bs-border-color-translucent);\n  --bs-card-border-radius: var(--bs-border-radius);\n  --bs-card-box-shadow: ;\n  --bs-card-inner-border-radius: calc(var(--bs-border-radius) - (var(--bs-border-width)));\n  --bs-card-cap-padding-y: 0.5rem;\n  --bs-card-cap-padding-x: 1rem;\n  --bs-card-cap-bg: rgba(var(--bs-body-color-rgb), 0.03);\n  --bs-card-cap-color: ;\n  --bs-card-height: ;\n  --bs-card-color: ;\n  --bs-card-bg: var(--bs-body-bg);\n  --bs-card-img-overlay-padding: 1rem;\n  --bs-card-group-margin: 0.75rem;\n  position: relative;\n  display: flex;\n  flex-direction: column;\n  min-width: 0;\n  height: var(--bs-card-height);\n  color: var(--bs-body-color);\n  word-wrap: break-word;\n  background-color: var(--bs-card-bg);\n  background-clip: border-box;\n  border: var(--bs-card-border-width) solid var(--bs-card-border-color);\n  border-radius: var(--bs-card-border-radius);\n}\n.card > hr {\n  margin-right: 0;\n  margin-left: 0;\n}\n.card > .list-group {\n  border-top: inherit;\n  border-bottom: inherit;\n}\n.card > .list-group:first-child {\n  border-top-width: 0;\n  border-top-left-radius: var(--bs-card-inner-border-radius);\n  border-top-right-radius: var(--bs-card-inner-border-radius);\n}\n.card > .list-group:last-child {\n  border-bottom-width: 0;\n  border-bottom-right-radius: var(--bs-card-inner-border-radius);\n  border-bottom-left-radius: var(--bs-card-inner-border-radius);\n}\n.card > .card-header + .list-group,\n.card > .list-group + .card-footer {\n  border-top: 0;\n}\n\n.card-body {\n  flex: 1 1 auto;\n  padding: var(--bs-card-spacer-y) var(--bs-card-spacer-x);\n  color: var(--bs-card-color);\n}\n\n.card-title {\n  margin-bottom: var(--bs-card-title-spacer-y);\n  color: var(--bs-card-title-color);\n}\n\n.card-subtitle {\n  margin-top: calc(-0.5 * var(--bs-card-title-spacer-y));\n  margin-bottom: 0;\n  color: var(--bs-card-subtitle-color);\n}\n\n.card-text:last-child {\n  margin-bottom: 0;\n}\n\n.card-link + .card-link {\n  margin-left: var(--bs-card-spacer-x);\n}\n\n.card-header {\n  padding: var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);\n  margin-bottom: 0;\n  color: var(--bs-card-cap-color);\n  background-color: var(--bs-card-cap-bg);\n  border-bottom: var(--bs-card-border-width) solid var(--bs-card-border-color);\n}\n.card-header:first-child {\n  border-radius: var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius) 0 0;\n}\n\n.card-footer {\n  padding: var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);\n  color: var(--bs-card-cap-color);\n  background-color: var(--bs-card-cap-bg);\n  border-top: var(--bs-card-border-width) solid var(--bs-card-border-color);\n}\n.card-footer:last-child {\n  border-radius: 0 0 var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius);\n}\n\n.card-header-tabs {\n  margin-right: calc(-0.5 * var(--bs-card-cap-padding-x));\n  margin-bottom: calc(-1 * var(--bs-card-cap-padding-y));\n  margin-left: calc(-0.5 * var(--bs-card-cap-padding-x));\n  border-bottom: 0;\n}\n.card-header-tabs .nav-link.active {\n  background-color: var(--bs-card-bg);\n  border-bottom-color: var(--bs-card-bg);\n}\n\n.card-header-pills {\n  margin-right: calc(-0.5 * var(--bs-card-cap-padding-x));\n  margin-left: calc(-0.5 * var(--bs-card-cap-padding-x));\n}\n\n.card-img-overlay {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  padding: var(--bs-card-img-overlay-padding);\n  border-radius: var(--bs-card-inner-border-radius);\n}\n\n.card-img,\n.card-img-top,\n.card-img-bottom {\n  width: 100%;\n}\n\n.card-img,\n.card-img-top {\n  border-top-left-radius: var(--bs-card-inner-border-radius);\n  border-top-right-radius: var(--bs-card-inner-border-radius);\n}\n\n.card-img,\n.card-img-bottom {\n  border-bottom-right-radius: var(--bs-card-inner-border-radius);\n  border-bottom-left-radius: var(--bs-card-inner-border-radius);\n}\n\n.card-group > .card {\n  margin-bottom: var(--bs-card-group-margin);\n}\n@media (min-width: 576px) {\n  .card-group {\n    display: flex;\n    flex-flow: row wrap;\n  }\n  .card-group > .card {\n    flex: 1 0 0;\n    margin-bottom: 0;\n  }\n  .card-group > .card + .card {\n    margin-left: 0;\n    border-left: 0;\n  }\n  .card-group > .card:not(:last-child) {\n    border-top-right-radius: 0;\n    border-bottom-right-radius: 0;\n  }\n  .card-group > .card:not(:last-child) > .card-img-top,\n  .card-group > .card:not(:last-child) > .card-header {\n    border-top-right-radius: 0;\n  }\n  .card-group > .card:not(:last-child) > .card-img-bottom,\n  .card-group > .card:not(:last-child) > .card-footer {\n    border-bottom-right-radius: 0;\n  }\n  .card-group > .card:not(:first-child) {\n    border-top-left-radius: 0;\n    border-bottom-left-radius: 0;\n  }\n  .card-group > .card:not(:first-child) > .card-img-top,\n  .card-group > .card:not(:first-child) > .card-header {\n    border-top-left-radius: 0;\n  }\n  .card-group > .card:not(:first-child) > .card-img-bottom,\n  .card-group > .card:not(:first-child) > .card-footer {\n    border-bottom-left-radius: 0;\n  }\n}\n\n.accordion {\n  --bs-accordion-color: var(--bs-body-color);\n  --bs-accordion-bg: var(--bs-body-bg);\n  --bs-accordion-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, border-radius 0.15s ease;\n  --bs-accordion-border-color: var(--bs-border-color);\n  --bs-accordion-border-width: var(--bs-border-width);\n  --bs-accordion-border-radius: var(--bs-border-radius);\n  --bs-accordion-inner-border-radius: calc(var(--bs-border-radius) - (var(--bs-border-width)));\n  --bs-accordion-btn-padding-x: 1.25rem;\n  --bs-accordion-btn-padding-y: 1rem;\n  --bs-accordion-btn-color: var(--bs-body-color);\n  --bs-accordion-btn-bg: var(--bs-accordion-bg);\n  --bs-accordion-btn-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%23212529' stroke-linecap='round' stroke-linejoin='round'%3e%3cpath d='m2 5 6 6 6-6'/%3e%3c/svg%3e\");\n  --bs-accordion-btn-icon-width: 1.25rem;\n  --bs-accordion-btn-icon-transform: rotate(-180deg);\n  --bs-accordion-btn-icon-transition: transform 0.2s ease-in-out;\n  --bs-accordion-btn-active-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%23052c65' stroke-linecap='round' stroke-linejoin='round'%3e%3cpath d='m2 5 6 6 6-6'/%3e%3c/svg%3e\");\n  --bs-accordion-btn-focus-box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n  --bs-accordion-body-padding-x: 1.25rem;\n  --bs-accordion-body-padding-y: 1rem;\n  --bs-accordion-active-color: var(--bs-primary-text-emphasis);\n  --bs-accordion-active-bg: var(--bs-primary-bg-subtle);\n}\n\n.accordion-button {\n  position: relative;\n  display: flex;\n  align-items: center;\n  width: 100%;\n  padding: var(--bs-accordion-btn-padding-y) var(--bs-accordion-btn-padding-x);\n  font-size: 1rem;\n  color: var(--bs-accordion-btn-color);\n  text-align: left;\n  background-color: var(--bs-accordion-btn-bg);\n  border: 0;\n  border-radius: 0;\n  overflow-anchor: none;\n  transition: var(--bs-accordion-transition);\n}\n@media (prefers-reduced-motion: reduce) {\n  .accordion-button {\n    transition: none;\n  }\n}\n.accordion-button:not(.collapsed) {\n  color: var(--bs-accordion-active-color);\n  background-color: var(--bs-accordion-active-bg);\n  box-shadow: inset 0 calc(-1 * var(--bs-accordion-border-width)) 0 var(--bs-accordion-border-color);\n}\n.accordion-button:not(.collapsed)::after {\n  background-image: var(--bs-accordion-btn-active-icon);\n  transform: var(--bs-accordion-btn-icon-transform);\n}\n.accordion-button::after {\n  flex-shrink: 0;\n  width: var(--bs-accordion-btn-icon-width);\n  height: var(--bs-accordion-btn-icon-width);\n  margin-left: auto;\n  content: \"\";\n  background-image: var(--bs-accordion-btn-icon);\n  background-repeat: no-repeat;\n  background-size: var(--bs-accordion-btn-icon-width);\n  transition: var(--bs-accordion-btn-icon-transition);\n}\n@media (prefers-reduced-motion: reduce) {\n  .accordion-button::after {\n    transition: none;\n  }\n}\n.accordion-button:hover {\n  z-index: 2;\n}\n.accordion-button:focus {\n  z-index: 3;\n  outline: 0;\n  box-shadow: var(--bs-accordion-btn-focus-box-shadow);\n}\n\n.accordion-header {\n  margin-bottom: 0;\n}\n\n.accordion-item {\n  color: var(--bs-accordion-color);\n  background-color: var(--bs-accordion-bg);\n  border: var(--bs-accordion-border-width) solid var(--bs-accordion-border-color);\n}\n.accordion-item:first-of-type {\n  border-top-left-radius: var(--bs-accordion-border-radius);\n  border-top-right-radius: var(--bs-accordion-border-radius);\n}\n.accordion-item:first-of-type > .accordion-header .accordion-button {\n  border-top-left-radius: var(--bs-accordion-inner-border-radius);\n  border-top-right-radius: var(--bs-accordion-inner-border-radius);\n}\n.accordion-item:not(:first-of-type) {\n  border-top: 0;\n}\n.accordion-item:last-of-type {\n  border-bottom-right-radius: var(--bs-accordion-border-radius);\n  border-bottom-left-radius: var(--bs-accordion-border-radius);\n}\n.accordion-item:last-of-type > .accordion-header .accordion-button.collapsed {\n  border-bottom-right-radius: var(--bs-accordion-inner-border-radius);\n  border-bottom-left-radius: var(--bs-accordion-inner-border-radius);\n}\n.accordion-item:last-of-type > .accordion-collapse {\n  border-bottom-right-radius: var(--bs-accordion-border-radius);\n  border-bottom-left-radius: var(--bs-accordion-border-radius);\n}\n\n.accordion-body {\n  padding: var(--bs-accordion-body-padding-y) var(--bs-accordion-body-padding-x);\n}\n\n.accordion-flush > .accordion-item {\n  border-right: 0;\n  border-left: 0;\n  border-radius: 0;\n}\n.accordion-flush > .accordion-item:first-child {\n  border-top: 0;\n}\n.accordion-flush > .accordion-item:last-child {\n  border-bottom: 0;\n}\n.accordion-flush > .accordion-item > .accordion-collapse,\n.accordion-flush > .accordion-item > .accordion-header .accordion-button,\n.accordion-flush > .accordion-item > .accordion-header .accordion-button.collapsed {\n  border-radius: 0;\n}\n\n[data-bs-theme=dark] .accordion-button::after {\n  --bs-accordion-btn-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%236ea8fe'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708'/%3e%3c/svg%3e\");\n  --bs-accordion-btn-active-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%236ea8fe'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708'/%3e%3c/svg%3e\");\n}\n\n.breadcrumb {\n  --bs-breadcrumb-padding-x: 0;\n  --bs-breadcrumb-padding-y: 0;\n  --bs-breadcrumb-margin-bottom: 1rem;\n  --bs-breadcrumb-bg: ;\n  --bs-breadcrumb-border-radius: ;\n  --bs-breadcrumb-divider-color: var(--bs-secondary-color);\n  --bs-breadcrumb-item-padding-x: 0.5rem;\n  --bs-breadcrumb-item-active-color: var(--bs-secondary-color);\n  display: flex;\n  flex-wrap: wrap;\n  padding: var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x);\n  margin-bottom: var(--bs-breadcrumb-margin-bottom);\n  font-size: var(--bs-breadcrumb-font-size);\n  list-style: none;\n  background-color: var(--bs-breadcrumb-bg);\n  border-radius: var(--bs-breadcrumb-border-radius);\n}\n\n.breadcrumb-item + .breadcrumb-item {\n  padding-left: var(--bs-breadcrumb-item-padding-x);\n}\n.breadcrumb-item + .breadcrumb-item::before {\n  float: left;\n  padding-right: var(--bs-breadcrumb-item-padding-x);\n  color: var(--bs-breadcrumb-divider-color);\n  content: var(--bs-breadcrumb-divider, \"/\") /* rtl: var(--bs-breadcrumb-divider, \"/\") */;\n}\n.breadcrumb-item.active {\n  color: var(--bs-breadcrumb-item-active-color);\n}\n\n.pagination {\n  --bs-pagination-padding-x: 0.75rem;\n  --bs-pagination-padding-y: 0.375rem;\n  --bs-pagination-font-size: 1rem;\n  --bs-pagination-color: var(--bs-link-color);\n  --bs-pagination-bg: var(--bs-body-bg);\n  --bs-pagination-border-width: var(--bs-border-width);\n  --bs-pagination-border-color: var(--bs-border-color);\n  --bs-pagination-border-radius: var(--bs-border-radius);\n  --bs-pagination-hover-color: var(--bs-link-hover-color);\n  --bs-pagination-hover-bg: var(--bs-tertiary-bg);\n  --bs-pagination-hover-border-color: var(--bs-border-color);\n  --bs-pagination-focus-color: var(--bs-link-hover-color);\n  --bs-pagination-focus-bg: var(--bs-secondary-bg);\n  --bs-pagination-focus-box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n  --bs-pagination-active-color: #fff;\n  --bs-pagination-active-bg: #0d6efd;\n  --bs-pagination-active-border-color: #0d6efd;\n  --bs-pagination-disabled-color: var(--bs-secondary-color);\n  --bs-pagination-disabled-bg: var(--bs-secondary-bg);\n  --bs-pagination-disabled-border-color: var(--bs-border-color);\n  display: flex;\n  padding-left: 0;\n  list-style: none;\n}\n\n.page-link {\n  position: relative;\n  display: block;\n  padding: var(--bs-pagination-padding-y) var(--bs-pagination-padding-x);\n  font-size: var(--bs-pagination-font-size);\n  color: var(--bs-pagination-color);\n  text-decoration: none;\n  background-color: var(--bs-pagination-bg);\n  border: var(--bs-pagination-border-width) solid var(--bs-pagination-border-color);\n  transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n  .page-link {\n    transition: none;\n  }\n}\n.page-link:hover {\n  z-index: 2;\n  color: var(--bs-pagination-hover-color);\n  background-color: var(--bs-pagination-hover-bg);\n  border-color: var(--bs-pagination-hover-border-color);\n}\n.page-link:focus {\n  z-index: 3;\n  color: var(--bs-pagination-focus-color);\n  background-color: var(--bs-pagination-focus-bg);\n  outline: 0;\n  box-shadow: var(--bs-pagination-focus-box-shadow);\n}\n.page-link.active, .active > .page-link {\n  z-index: 3;\n  color: var(--bs-pagination-active-color);\n  background-color: var(--bs-pagination-active-bg);\n  border-color: var(--bs-pagination-active-border-color);\n}\n.page-link.disabled, .disabled > .page-link {\n  color: var(--bs-pagination-disabled-color);\n  pointer-events: none;\n  background-color: var(--bs-pagination-disabled-bg);\n  border-color: var(--bs-pagination-disabled-border-color);\n}\n\n.page-item:not(:first-child) .page-link {\n  margin-left: calc(-1 * var(--bs-border-width));\n}\n.page-item:first-child .page-link {\n  border-top-left-radius: var(--bs-pagination-border-radius);\n  border-bottom-left-radius: var(--bs-pagination-border-radius);\n}\n.page-item:last-child .page-link {\n  border-top-right-radius: var(--bs-pagination-border-radius);\n  border-bottom-right-radius: var(--bs-pagination-border-radius);\n}\n\n.pagination-lg {\n  --bs-pagination-padding-x: 1.5rem;\n  --bs-pagination-padding-y: 0.75rem;\n  --bs-pagination-font-size: 1.25rem;\n  --bs-pagination-border-radius: var(--bs-border-radius-lg);\n}\n\n.pagination-sm {\n  --bs-pagination-padding-x: 0.5rem;\n  --bs-pagination-padding-y: 0.25rem;\n  --bs-pagination-font-size: 0.875rem;\n  --bs-pagination-border-radius: var(--bs-border-radius-sm);\n}\n\n.badge {\n  --bs-badge-padding-x: 0.65em;\n  --bs-badge-padding-y: 0.35em;\n  --bs-badge-font-size: 0.75em;\n  --bs-badge-font-weight: 700;\n  --bs-badge-color: #fff;\n  --bs-badge-border-radius: var(--bs-border-radius);\n  display: inline-block;\n  padding: var(--bs-badge-padding-y) var(--bs-badge-padding-x);\n  font-size: var(--bs-badge-font-size);\n  font-weight: var(--bs-badge-font-weight);\n  line-height: 1;\n  color: var(--bs-badge-color);\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  border-radius: var(--bs-badge-border-radius);\n}\n.badge:empty {\n  display: none;\n}\n\n.btn .badge {\n  position: relative;\n  top: -1px;\n}\n\n.alert {\n  --bs-alert-bg: transparent;\n  --bs-alert-padding-x: 1rem;\n  --bs-alert-padding-y: 1rem;\n  --bs-alert-margin-bottom: 1rem;\n  --bs-alert-color: inherit;\n  --bs-alert-border-color: transparent;\n  --bs-alert-border: var(--bs-border-width) solid var(--bs-alert-border-color);\n  --bs-alert-border-radius: var(--bs-border-radius);\n  --bs-alert-link-color: inherit;\n  position: relative;\n  padding: var(--bs-alert-padding-y) var(--bs-alert-padding-x);\n  margin-bottom: var(--bs-alert-margin-bottom);\n  color: var(--bs-alert-color);\n  background-color: var(--bs-alert-bg);\n  border: var(--bs-alert-border);\n  border-radius: var(--bs-alert-border-radius);\n}\n\n.alert-heading {\n  color: inherit;\n}\n\n.alert-link {\n  font-weight: 700;\n  color: var(--bs-alert-link-color);\n}\n\n.alert-dismissible {\n  padding-right: 3rem;\n}\n.alert-dismissible .btn-close {\n  position: absolute;\n  top: 0;\n  right: 0;\n  z-index: 2;\n  padding: 1.25rem 1rem;\n}\n\n.alert-primary {\n  --bs-alert-color: var(--bs-primary-text-emphasis);\n  --bs-alert-bg: var(--bs-primary-bg-subtle);\n  --bs-alert-border-color: var(--bs-primary-border-subtle);\n  --bs-alert-link-color: var(--bs-primary-text-emphasis);\n}\n\n.alert-secondary {\n  --bs-alert-color: var(--bs-secondary-text-emphasis);\n  --bs-alert-bg: var(--bs-secondary-bg-subtle);\n  --bs-alert-border-color: var(--bs-secondary-border-subtle);\n  --bs-alert-link-color: var(--bs-secondary-text-emphasis);\n}\n\n.alert-success {\n  --bs-alert-color: var(--bs-success-text-emphasis);\n  --bs-alert-bg: var(--bs-success-bg-subtle);\n  --bs-alert-border-color: var(--bs-success-border-subtle);\n  --bs-alert-link-color: var(--bs-success-text-emphasis);\n}\n\n.alert-info {\n  --bs-alert-color: var(--bs-info-text-emphasis);\n  --bs-alert-bg: var(--bs-info-bg-subtle);\n  --bs-alert-border-color: var(--bs-info-border-subtle);\n  --bs-alert-link-color: var(--bs-info-text-emphasis);\n}\n\n.alert-warning {\n  --bs-alert-color: var(--bs-warning-text-emphasis);\n  --bs-alert-bg: var(--bs-warning-bg-subtle);\n  --bs-alert-border-color: var(--bs-warning-border-subtle);\n  --bs-alert-link-color: var(--bs-warning-text-emphasis);\n}\n\n.alert-danger {\n  --bs-alert-color: var(--bs-danger-text-emphasis);\n  --bs-alert-bg: var(--bs-danger-bg-subtle);\n  --bs-alert-border-color: var(--bs-danger-border-subtle);\n  --bs-alert-link-color: var(--bs-danger-text-emphasis);\n}\n\n.alert-light {\n  --bs-alert-color: var(--bs-light-text-emphasis);\n  --bs-alert-bg: var(--bs-light-bg-subtle);\n  --bs-alert-border-color: var(--bs-light-border-subtle);\n  --bs-alert-link-color: var(--bs-light-text-emphasis);\n}\n\n.alert-dark {\n  --bs-alert-color: var(--bs-dark-text-emphasis);\n  --bs-alert-bg: var(--bs-dark-bg-subtle);\n  --bs-alert-border-color: var(--bs-dark-border-subtle);\n  --bs-alert-link-color: var(--bs-dark-text-emphasis);\n}\n\n@keyframes progress-bar-stripes {\n  0% {\n    background-position-x: var(--bs-progress-height);\n  }\n}\n.progress,\n.progress-stacked {\n  --bs-progress-height: 1rem;\n  --bs-progress-font-size: 0.75rem;\n  --bs-progress-bg: var(--bs-secondary-bg);\n  --bs-progress-border-radius: var(--bs-border-radius);\n  --bs-progress-box-shadow: var(--bs-box-shadow-inset);\n  --bs-progress-bar-color: #fff;\n  --bs-progress-bar-bg: #0d6efd;\n  --bs-progress-bar-transition: width 0.6s ease;\n  display: flex;\n  height: var(--bs-progress-height);\n  overflow: hidden;\n  font-size: var(--bs-progress-font-size);\n  background-color: var(--bs-progress-bg);\n  border-radius: var(--bs-progress-border-radius);\n}\n\n.progress-bar {\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n  overflow: hidden;\n  color: var(--bs-progress-bar-color);\n  text-align: center;\n  white-space: nowrap;\n  background-color: var(--bs-progress-bar-bg);\n  transition: var(--bs-progress-bar-transition);\n}\n@media (prefers-reduced-motion: reduce) {\n  .progress-bar {\n    transition: none;\n  }\n}\n\n.progress-bar-striped {\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-size: var(--bs-progress-height) var(--bs-progress-height);\n}\n\n.progress-stacked > .progress {\n  overflow: visible;\n}\n\n.progress-stacked > .progress > .progress-bar {\n  width: 100%;\n}\n\n.progress-bar-animated {\n  animation: 1s linear infinite progress-bar-stripes;\n}\n@media (prefers-reduced-motion: reduce) {\n  .progress-bar-animated {\n    animation: none;\n  }\n}\n\n.list-group {\n  --bs-list-group-color: var(--bs-body-color);\n  --bs-list-group-bg: var(--bs-body-bg);\n  --bs-list-group-border-color: var(--bs-border-color);\n  --bs-list-group-border-width: var(--bs-border-width);\n  --bs-list-group-border-radius: var(--bs-border-radius);\n  --bs-list-group-item-padding-x: 1rem;\n  --bs-list-group-item-padding-y: 0.5rem;\n  --bs-list-group-action-color: var(--bs-secondary-color);\n  --bs-list-group-action-hover-color: var(--bs-emphasis-color);\n  --bs-list-group-action-hover-bg: var(--bs-tertiary-bg);\n  --bs-list-group-action-active-color: var(--bs-body-color);\n  --bs-list-group-action-active-bg: var(--bs-secondary-bg);\n  --bs-list-group-disabled-color: var(--bs-secondary-color);\n  --bs-list-group-disabled-bg: var(--bs-body-bg);\n  --bs-list-group-active-color: #fff;\n  --bs-list-group-active-bg: #0d6efd;\n  --bs-list-group-active-border-color: #0d6efd;\n  display: flex;\n  flex-direction: column;\n  padding-left: 0;\n  margin-bottom: 0;\n  border-radius: var(--bs-list-group-border-radius);\n}\n\n.list-group-numbered {\n  list-style-type: none;\n  counter-reset: section;\n}\n.list-group-numbered > .list-group-item::before {\n  content: counters(section, \".\") \". \";\n  counter-increment: section;\n}\n\n.list-group-item {\n  position: relative;\n  display: block;\n  padding: var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x);\n  color: var(--bs-list-group-color);\n  text-decoration: none;\n  background-color: var(--bs-list-group-bg);\n  border: var(--bs-list-group-border-width) solid var(--bs-list-group-border-color);\n}\n.list-group-item:first-child {\n  border-top-left-radius: inherit;\n  border-top-right-radius: inherit;\n}\n.list-group-item:last-child {\n  border-bottom-right-radius: inherit;\n  border-bottom-left-radius: inherit;\n}\n.list-group-item.disabled, .list-group-item:disabled {\n  color: var(--bs-list-group-disabled-color);\n  pointer-events: none;\n  background-color: var(--bs-list-group-disabled-bg);\n}\n.list-group-item.active {\n  z-index: 2;\n  color: var(--bs-list-group-active-color);\n  background-color: var(--bs-list-group-active-bg);\n  border-color: var(--bs-list-group-active-border-color);\n}\n.list-group-item + .list-group-item {\n  border-top-width: 0;\n}\n.list-group-item + .list-group-item.active {\n  margin-top: calc(-1 * var(--bs-list-group-border-width));\n  border-top-width: var(--bs-list-group-border-width);\n}\n\n.list-group-item-action {\n  width: 100%;\n  color: var(--bs-list-group-action-color);\n  text-align: inherit;\n}\n.list-group-item-action:not(.active):hover, .list-group-item-action:not(.active):focus {\n  z-index: 1;\n  color: var(--bs-list-group-action-hover-color);\n  text-decoration: none;\n  background-color: var(--bs-list-group-action-hover-bg);\n}\n.list-group-item-action:not(.active):active {\n  color: var(--bs-list-group-action-active-color);\n  background-color: var(--bs-list-group-action-active-bg);\n}\n\n.list-group-horizontal {\n  flex-direction: row;\n}\n.list-group-horizontal > .list-group-item:first-child:not(:last-child) {\n  border-bottom-left-radius: var(--bs-list-group-border-radius);\n  border-top-right-radius: 0;\n}\n.list-group-horizontal > .list-group-item:last-child:not(:first-child) {\n  border-top-right-radius: var(--bs-list-group-border-radius);\n  border-bottom-left-radius: 0;\n}\n.list-group-horizontal > .list-group-item.active {\n  margin-top: 0;\n}\n.list-group-horizontal > .list-group-item + .list-group-item {\n  border-top-width: var(--bs-list-group-border-width);\n  border-left-width: 0;\n}\n.list-group-horizontal > .list-group-item + .list-group-item.active {\n  margin-left: calc(-1 * var(--bs-list-group-border-width));\n  border-left-width: var(--bs-list-group-border-width);\n}\n\n@media (min-width: 576px) {\n  .list-group-horizontal-sm {\n    flex-direction: row;\n  }\n  .list-group-horizontal-sm > .list-group-item:first-child:not(:last-child) {\n    border-bottom-left-radius: var(--bs-list-group-border-radius);\n    border-top-right-radius: 0;\n  }\n  .list-group-horizontal-sm > .list-group-item:last-child:not(:first-child) {\n    border-top-right-radius: var(--bs-list-group-border-radius);\n    border-bottom-left-radius: 0;\n  }\n  .list-group-horizontal-sm > .list-group-item.active {\n    margin-top: 0;\n  }\n  .list-group-horizontal-sm > .list-group-item + .list-group-item {\n    border-top-width: var(--bs-list-group-border-width);\n    border-left-width: 0;\n  }\n  .list-group-horizontal-sm > .list-group-item + .list-group-item.active {\n    margin-left: calc(-1 * var(--bs-list-group-border-width));\n    border-left-width: var(--bs-list-group-border-width);\n  }\n}\n@media (min-width: 768px) {\n  .list-group-horizontal-md {\n    flex-direction: row;\n  }\n  .list-group-horizontal-md > .list-group-item:first-child:not(:last-child) {\n    border-bottom-left-radius: var(--bs-list-group-border-radius);\n    border-top-right-radius: 0;\n  }\n  .list-group-horizontal-md > .list-group-item:last-child:not(:first-child) {\n    border-top-right-radius: var(--bs-list-group-border-radius);\n    border-bottom-left-radius: 0;\n  }\n  .list-group-horizontal-md > .list-group-item.active {\n    margin-top: 0;\n  }\n  .list-group-horizontal-md > .list-group-item + .list-group-item {\n    border-top-width: var(--bs-list-group-border-width);\n    border-left-width: 0;\n  }\n  .list-group-horizontal-md > .list-group-item + .list-group-item.active {\n    margin-left: calc(-1 * var(--bs-list-group-border-width));\n    border-left-width: var(--bs-list-group-border-width);\n  }\n}\n@media (min-width: 992px) {\n  .list-group-horizontal-lg {\n    flex-direction: row;\n  }\n  .list-group-horizontal-lg > .list-group-item:first-child:not(:last-child) {\n    border-bottom-left-radius: var(--bs-list-group-border-radius);\n    border-top-right-radius: 0;\n  }\n  .list-group-horizontal-lg > .list-group-item:last-child:not(:first-child) {\n    border-top-right-radius: var(--bs-list-group-border-radius);\n    border-bottom-left-radius: 0;\n  }\n  .list-group-horizontal-lg > .list-group-item.active {\n    margin-top: 0;\n  }\n  .list-group-horizontal-lg > .list-group-item + .list-group-item {\n    border-top-width: var(--bs-list-group-border-width);\n    border-left-width: 0;\n  }\n  .list-group-horizontal-lg > .list-group-item + .list-group-item.active {\n    margin-left: calc(-1 * var(--bs-list-group-border-width));\n    border-left-width: var(--bs-list-group-border-width);\n  }\n}\n@media (min-width: 1200px) {\n  .list-group-horizontal-xl {\n    flex-direction: row;\n  }\n  .list-group-horizontal-xl > .list-group-item:first-child:not(:last-child) {\n    border-bottom-left-radius: var(--bs-list-group-border-radius);\n    border-top-right-radius: 0;\n  }\n  .list-group-horizontal-xl > .list-group-item:last-child:not(:first-child) {\n    border-top-right-radius: var(--bs-list-group-border-radius);\n    border-bottom-left-radius: 0;\n  }\n  .list-group-horizontal-xl > .list-group-item.active {\n    margin-top: 0;\n  }\n  .list-group-horizontal-xl > .list-group-item + .list-group-item {\n    border-top-width: var(--bs-list-group-border-width);\n    border-left-width: 0;\n  }\n  .list-group-horizontal-xl > .list-group-item + .list-group-item.active {\n    margin-left: calc(-1 * var(--bs-list-group-border-width));\n    border-left-width: var(--bs-list-group-border-width);\n  }\n}\n@media (min-width: 1400px) {\n  .list-group-horizontal-xxl {\n    flex-direction: row;\n  }\n  .list-group-horizontal-xxl > .list-group-item:first-child:not(:last-child) {\n    border-bottom-left-radius: var(--bs-list-group-border-radius);\n    border-top-right-radius: 0;\n  }\n  .list-group-horizontal-xxl > .list-group-item:last-child:not(:first-child) {\n    border-top-right-radius: var(--bs-list-group-border-radius);\n    border-bottom-left-radius: 0;\n  }\n  .list-group-horizontal-xxl > .list-group-item.active {\n    margin-top: 0;\n  }\n  .list-group-horizontal-xxl > .list-group-item + .list-group-item {\n    border-top-width: var(--bs-list-group-border-width);\n    border-left-width: 0;\n  }\n  .list-group-horizontal-xxl > .list-group-item + .list-group-item.active {\n    margin-left: calc(-1 * var(--bs-list-group-border-width));\n    border-left-width: var(--bs-list-group-border-width);\n  }\n}\n.list-group-flush {\n  border-radius: 0;\n}\n.list-group-flush > .list-group-item {\n  border-width: 0 0 var(--bs-list-group-border-width);\n}\n.list-group-flush > .list-group-item:last-child {\n  border-bottom-width: 0;\n}\n\n.list-group-item-primary {\n  --bs-list-group-color: var(--bs-primary-text-emphasis);\n  --bs-list-group-bg: var(--bs-primary-bg-subtle);\n  --bs-list-group-border-color: var(--bs-primary-border-subtle);\n  --bs-list-group-action-hover-color: var(--bs-emphasis-color);\n  --bs-list-group-action-hover-bg: var(--bs-primary-border-subtle);\n  --bs-list-group-action-active-color: var(--bs-emphasis-color);\n  --bs-list-group-action-active-bg: var(--bs-primary-border-subtle);\n  --bs-list-group-active-color: var(--bs-primary-bg-subtle);\n  --bs-list-group-active-bg: var(--bs-primary-text-emphasis);\n  --bs-list-group-active-border-color: var(--bs-primary-text-emphasis);\n}\n\n.list-group-item-secondary {\n  --bs-list-group-color: var(--bs-secondary-text-emphasis);\n  --bs-list-group-bg: var(--bs-secondary-bg-subtle);\n  --bs-list-group-border-color: var(--bs-secondary-border-subtle);\n  --bs-list-group-action-hover-color: var(--bs-emphasis-color);\n  --bs-list-group-action-hover-bg: var(--bs-secondary-border-subtle);\n  --bs-list-group-action-active-color: var(--bs-emphasis-color);\n  --bs-list-group-action-active-bg: var(--bs-secondary-border-subtle);\n  --bs-list-group-active-color: var(--bs-secondary-bg-subtle);\n  --bs-list-group-active-bg: var(--bs-secondary-text-emphasis);\n  --bs-list-group-active-border-color: var(--bs-secondary-text-emphasis);\n}\n\n.list-group-item-success {\n  --bs-list-group-color: var(--bs-success-text-emphasis);\n  --bs-list-group-bg: var(--bs-success-bg-subtle);\n  --bs-list-group-border-color: var(--bs-success-border-subtle);\n  --bs-list-group-action-hover-color: var(--bs-emphasis-color);\n  --bs-list-group-action-hover-bg: var(--bs-success-border-subtle);\n  --bs-list-group-action-active-color: var(--bs-emphasis-color);\n  --bs-list-group-action-active-bg: var(--bs-success-border-subtle);\n  --bs-list-group-active-color: var(--bs-success-bg-subtle);\n  --bs-list-group-active-bg: var(--bs-success-text-emphasis);\n  --bs-list-group-active-border-color: var(--bs-success-text-emphasis);\n}\n\n.list-group-item-info {\n  --bs-list-group-color: var(--bs-info-text-emphasis);\n  --bs-list-group-bg: var(--bs-info-bg-subtle);\n  --bs-list-group-border-color: var(--bs-info-border-subtle);\n  --bs-list-group-action-hover-color: var(--bs-emphasis-color);\n  --bs-list-group-action-hover-bg: var(--bs-info-border-subtle);\n  --bs-list-group-action-active-color: var(--bs-emphasis-color);\n  --bs-list-group-action-active-bg: var(--bs-info-border-subtle);\n  --bs-list-group-active-color: var(--bs-info-bg-subtle);\n  --bs-list-group-active-bg: var(--bs-info-text-emphasis);\n  --bs-list-group-active-border-color: var(--bs-info-text-emphasis);\n}\n\n.list-group-item-warning {\n  --bs-list-group-color: var(--bs-warning-text-emphasis);\n  --bs-list-group-bg: var(--bs-warning-bg-subtle);\n  --bs-list-group-border-color: var(--bs-warning-border-subtle);\n  --bs-list-group-action-hover-color: var(--bs-emphasis-color);\n  --bs-list-group-action-hover-bg: var(--bs-warning-border-subtle);\n  --bs-list-group-action-active-color: var(--bs-emphasis-color);\n  --bs-list-group-action-active-bg: var(--bs-warning-border-subtle);\n  --bs-list-group-active-color: var(--bs-warning-bg-subtle);\n  --bs-list-group-active-bg: var(--bs-warning-text-emphasis);\n  --bs-list-group-active-border-color: var(--bs-warning-text-emphasis);\n}\n\n.list-group-item-danger {\n  --bs-list-group-color: var(--bs-danger-text-emphasis);\n  --bs-list-group-bg: var(--bs-danger-bg-subtle);\n  --bs-list-group-border-color: var(--bs-danger-border-subtle);\n  --bs-list-group-action-hover-color: var(--bs-emphasis-color);\n  --bs-list-group-action-hover-bg: var(--bs-danger-border-subtle);\n  --bs-list-group-action-active-color: var(--bs-emphasis-color);\n  --bs-list-group-action-active-bg: var(--bs-danger-border-subtle);\n  --bs-list-group-active-color: var(--bs-danger-bg-subtle);\n  --bs-list-group-active-bg: var(--bs-danger-text-emphasis);\n  --bs-list-group-active-border-color: var(--bs-danger-text-emphasis);\n}\n\n.list-group-item-light {\n  --bs-list-group-color: var(--bs-light-text-emphasis);\n  --bs-list-group-bg: var(--bs-light-bg-subtle);\n  --bs-list-group-border-color: var(--bs-light-border-subtle);\n  --bs-list-group-action-hover-color: var(--bs-emphasis-color);\n  --bs-list-group-action-hover-bg: var(--bs-light-border-subtle);\n  --bs-list-group-action-active-color: var(--bs-emphasis-color);\n  --bs-list-group-action-active-bg: var(--bs-light-border-subtle);\n  --bs-list-group-active-color: var(--bs-light-bg-subtle);\n  --bs-list-group-active-bg: var(--bs-light-text-emphasis);\n  --bs-list-group-active-border-color: var(--bs-light-text-emphasis);\n}\n\n.list-group-item-dark {\n  --bs-list-group-color: var(--bs-dark-text-emphasis);\n  --bs-list-group-bg: var(--bs-dark-bg-subtle);\n  --bs-list-group-border-color: var(--bs-dark-border-subtle);\n  --bs-list-group-action-hover-color: var(--bs-emphasis-color);\n  --bs-list-group-action-hover-bg: var(--bs-dark-border-subtle);\n  --bs-list-group-action-active-color: var(--bs-emphasis-color);\n  --bs-list-group-action-active-bg: var(--bs-dark-border-subtle);\n  --bs-list-group-active-color: var(--bs-dark-bg-subtle);\n  --bs-list-group-active-bg: var(--bs-dark-text-emphasis);\n  --bs-list-group-active-border-color: var(--bs-dark-text-emphasis);\n}\n\n.btn-close {\n  --bs-btn-close-color: #000;\n  --bs-btn-close-bg: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414'/%3e%3c/svg%3e\");\n  --bs-btn-close-opacity: 0.5;\n  --bs-btn-close-hover-opacity: 0.75;\n  --bs-btn-close-focus-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n  --bs-btn-close-focus-opacity: 1;\n  --bs-btn-close-disabled-opacity: 0.25;\n  box-sizing: content-box;\n  width: 1em;\n  height: 1em;\n  padding: 0.25em 0.25em;\n  color: var(--bs-btn-close-color);\n  background: transparent var(--bs-btn-close-bg) center/1em auto no-repeat;\n  filter: var(--bs-btn-close-filter);\n  border: 0;\n  border-radius: 0.375rem;\n  opacity: var(--bs-btn-close-opacity);\n}\n.btn-close:hover {\n  color: var(--bs-btn-close-color);\n  text-decoration: none;\n  opacity: var(--bs-btn-close-hover-opacity);\n}\n.btn-close:focus {\n  outline: 0;\n  box-shadow: var(--bs-btn-close-focus-shadow);\n  opacity: var(--bs-btn-close-focus-opacity);\n}\n.btn-close:disabled, .btn-close.disabled {\n  pointer-events: none;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  user-select: none;\n  opacity: var(--bs-btn-close-disabled-opacity);\n}\n\n.btn-close-white {\n  --bs-btn-close-filter: invert(1) grayscale(100%) brightness(200%);\n}\n\n:root,\n[data-bs-theme=light] {\n  --bs-btn-close-filter: ;\n}\n\n[data-bs-theme=dark] {\n  --bs-btn-close-filter: invert(1) grayscale(100%) brightness(200%);\n}\n\n.toast {\n  --bs-toast-zindex: 1090;\n  --bs-toast-padding-x: 0.75rem;\n  --bs-toast-padding-y: 0.5rem;\n  --bs-toast-spacing: 1.5rem;\n  --bs-toast-max-width: 350px;\n  --bs-toast-font-size: 0.875rem;\n  --bs-toast-color: ;\n  --bs-toast-bg: rgba(var(--bs-body-bg-rgb), 0.85);\n  --bs-toast-border-width: var(--bs-border-width);\n  --bs-toast-border-color: var(--bs-border-color-translucent);\n  --bs-toast-border-radius: var(--bs-border-radius);\n  --bs-toast-box-shadow: var(--bs-box-shadow);\n  --bs-toast-header-color: var(--bs-secondary-color);\n  --bs-toast-header-bg: rgba(var(--bs-body-bg-rgb), 0.85);\n  --bs-toast-header-border-color: var(--bs-border-color-translucent);\n  width: var(--bs-toast-max-width);\n  max-width: 100%;\n  font-size: var(--bs-toast-font-size);\n  color: var(--bs-toast-color);\n  pointer-events: auto;\n  background-color: var(--bs-toast-bg);\n  background-clip: padding-box;\n  border: var(--bs-toast-border-width) solid var(--bs-toast-border-color);\n  box-shadow: var(--bs-toast-box-shadow);\n  border-radius: var(--bs-toast-border-radius);\n}\n.toast.showing {\n  opacity: 0;\n}\n.toast:not(.show) {\n  display: none;\n}\n\n.toast-container {\n  --bs-toast-zindex: 1090;\n  position: absolute;\n  z-index: var(--bs-toast-zindex);\n  width: -webkit-max-content;\n  width: -moz-max-content;\n  width: max-content;\n  max-width: 100%;\n  pointer-events: none;\n}\n.toast-container > :not(:last-child) {\n  margin-bottom: var(--bs-toast-spacing);\n}\n\n.toast-header {\n  display: flex;\n  align-items: center;\n  padding: var(--bs-toast-padding-y) var(--bs-toast-padding-x);\n  color: var(--bs-toast-header-color);\n  background-color: var(--bs-toast-header-bg);\n  background-clip: padding-box;\n  border-bottom: var(--bs-toast-border-width) solid var(--bs-toast-header-border-color);\n  border-top-left-radius: calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width));\n  border-top-right-radius: calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width));\n}\n.toast-header .btn-close {\n  margin-right: calc(-0.5 * var(--bs-toast-padding-x));\n  margin-left: var(--bs-toast-padding-x);\n}\n\n.toast-body {\n  padding: var(--bs-toast-padding-x);\n  word-wrap: break-word;\n}\n\n.modal {\n  --bs-modal-zindex: 1055;\n  --bs-modal-width: 500px;\n  --bs-modal-padding: 1rem;\n  --bs-modal-margin: 0.5rem;\n  --bs-modal-color: var(--bs-body-color);\n  --bs-modal-bg: var(--bs-body-bg);\n  --bs-modal-border-color: var(--bs-border-color-translucent);\n  --bs-modal-border-width: var(--bs-border-width);\n  --bs-modal-border-radius: var(--bs-border-radius-lg);\n  --bs-modal-box-shadow: var(--bs-box-shadow-sm);\n  --bs-modal-inner-border-radius: calc(var(--bs-border-radius-lg) - (var(--bs-border-width)));\n  --bs-modal-header-padding-x: 1rem;\n  --bs-modal-header-padding-y: 1rem;\n  --bs-modal-header-padding: 1rem 1rem;\n  --bs-modal-header-border-color: var(--bs-border-color);\n  --bs-modal-header-border-width: var(--bs-border-width);\n  --bs-modal-title-line-height: 1.5;\n  --bs-modal-footer-gap: 0.5rem;\n  --bs-modal-footer-bg: ;\n  --bs-modal-footer-border-color: var(--bs-border-color);\n  --bs-modal-footer-border-width: var(--bs-border-width);\n  position: fixed;\n  top: 0;\n  left: 0;\n  z-index: var(--bs-modal-zindex);\n  display: none;\n  width: 100%;\n  height: 100%;\n  overflow-x: hidden;\n  overflow-y: auto;\n  outline: 0;\n}\n\n.modal-dialog {\n  position: relative;\n  width: auto;\n  margin: var(--bs-modal-margin);\n  pointer-events: none;\n}\n.modal.fade .modal-dialog {\n  transform: translate(0, -50px);\n  transition: transform 0.3s ease-out;\n}\n@media (prefers-reduced-motion: reduce) {\n  .modal.fade .modal-dialog {\n    transition: none;\n  }\n}\n.modal.show .modal-dialog {\n  transform: none;\n}\n.modal.modal-static .modal-dialog {\n  transform: scale(1.02);\n}\n\n.modal-dialog-scrollable {\n  height: calc(100% - var(--bs-modal-margin) * 2);\n}\n.modal-dialog-scrollable .modal-content {\n  max-height: 100%;\n  overflow: hidden;\n}\n.modal-dialog-scrollable .modal-body {\n  overflow-y: auto;\n}\n\n.modal-dialog-centered {\n  display: flex;\n  align-items: center;\n  min-height: calc(100% - var(--bs-modal-margin) * 2);\n}\n\n.modal-content {\n  position: relative;\n  display: flex;\n  flex-direction: column;\n  width: 100%;\n  color: var(--bs-modal-color);\n  pointer-events: auto;\n  background-color: var(--bs-modal-bg);\n  background-clip: padding-box;\n  border: var(--bs-modal-border-width) solid var(--bs-modal-border-color);\n  border-radius: var(--bs-modal-border-radius);\n  outline: 0;\n}\n\n.modal-backdrop {\n  --bs-backdrop-zindex: 1050;\n  --bs-backdrop-bg: #000;\n  --bs-backdrop-opacity: 0.5;\n  position: fixed;\n  top: 0;\n  left: 0;\n  z-index: var(--bs-backdrop-zindex);\n  width: 100vw;\n  height: 100vh;\n  background-color: var(--bs-backdrop-bg);\n}\n.modal-backdrop.fade {\n  opacity: 0;\n}\n.modal-backdrop.show {\n  opacity: var(--bs-backdrop-opacity);\n}\n\n.modal-header {\n  display: flex;\n  flex-shrink: 0;\n  align-items: center;\n  padding: var(--bs-modal-header-padding);\n  border-bottom: var(--bs-modal-header-border-width) solid var(--bs-modal-header-border-color);\n  border-top-left-radius: var(--bs-modal-inner-border-radius);\n  border-top-right-radius: var(--bs-modal-inner-border-radius);\n}\n.modal-header .btn-close {\n  padding: calc(var(--bs-modal-header-padding-y) * 0.5) calc(var(--bs-modal-header-padding-x) * 0.5);\n  margin-top: calc(-0.5 * var(--bs-modal-header-padding-y));\n  margin-right: calc(-0.5 * var(--bs-modal-header-padding-x));\n  margin-bottom: calc(-0.5 * var(--bs-modal-header-padding-y));\n  margin-left: auto;\n}\n\n.modal-title {\n  margin-bottom: 0;\n  line-height: var(--bs-modal-title-line-height);\n}\n\n.modal-body {\n  position: relative;\n  flex: 1 1 auto;\n  padding: var(--bs-modal-padding);\n}\n\n.modal-footer {\n  display: flex;\n  flex-shrink: 0;\n  flex-wrap: wrap;\n  align-items: center;\n  justify-content: flex-end;\n  padding: calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap) * 0.5);\n  background-color: var(--bs-modal-footer-bg);\n  border-top: var(--bs-modal-footer-border-width) solid var(--bs-modal-footer-border-color);\n  border-bottom-right-radius: var(--bs-modal-inner-border-radius);\n  border-bottom-left-radius: var(--bs-modal-inner-border-radius);\n}\n.modal-footer > * {\n  margin: calc(var(--bs-modal-footer-gap) * 0.5);\n}\n\n@media (min-width: 576px) {\n  .modal {\n    --bs-modal-margin: 1.75rem;\n    --bs-modal-box-shadow: var(--bs-box-shadow);\n  }\n  .modal-dialog {\n    max-width: var(--bs-modal-width);\n    margin-right: auto;\n    margin-left: auto;\n  }\n  .modal-sm {\n    --bs-modal-width: 300px;\n  }\n}\n@media (min-width: 992px) {\n  .modal-lg,\n  .modal-xl {\n    --bs-modal-width: 800px;\n  }\n}\n@media (min-width: 1200px) {\n  .modal-xl {\n    --bs-modal-width: 1140px;\n  }\n}\n.modal-fullscreen {\n  width: 100vw;\n  max-width: none;\n  height: 100%;\n  margin: 0;\n}\n.modal-fullscreen .modal-content {\n  height: 100%;\n  border: 0;\n  border-radius: 0;\n}\n.modal-fullscreen .modal-header,\n.modal-fullscreen .modal-footer {\n  border-radius: 0;\n}\n.modal-fullscreen .modal-body {\n  overflow-y: auto;\n}\n\n@media (max-width: 575.98px) {\n  .modal-fullscreen-sm-down {\n    width: 100vw;\n    max-width: none;\n    height: 100%;\n    margin: 0;\n  }\n  .modal-fullscreen-sm-down .modal-content {\n    height: 100%;\n    border: 0;\n    border-radius: 0;\n  }\n  .modal-fullscreen-sm-down .modal-header,\n  .modal-fullscreen-sm-down .modal-footer {\n    border-radius: 0;\n  }\n  .modal-fullscreen-sm-down .modal-body {\n    overflow-y: auto;\n  }\n}\n@media (max-width: 767.98px) {\n  .modal-fullscreen-md-down {\n    width: 100vw;\n    max-width: none;\n    height: 100%;\n    margin: 0;\n  }\n  .modal-fullscreen-md-down .modal-content {\n    height: 100%;\n    border: 0;\n    border-radius: 0;\n  }\n  .modal-fullscreen-md-down .modal-header,\n  .modal-fullscreen-md-down .modal-footer {\n    border-radius: 0;\n  }\n  .modal-fullscreen-md-down .modal-body {\n    overflow-y: auto;\n  }\n}\n@media (max-width: 991.98px) {\n  .modal-fullscreen-lg-down {\n    width: 100vw;\n    max-width: none;\n    height: 100%;\n    margin: 0;\n  }\n  .modal-fullscreen-lg-down .modal-content {\n    height: 100%;\n    border: 0;\n    border-radius: 0;\n  }\n  .modal-fullscreen-lg-down .modal-header,\n  .modal-fullscreen-lg-down .modal-footer {\n    border-radius: 0;\n  }\n  .modal-fullscreen-lg-down .modal-body {\n    overflow-y: auto;\n  }\n}\n@media (max-width: 1199.98px) {\n  .modal-fullscreen-xl-down {\n    width: 100vw;\n    max-width: none;\n    height: 100%;\n    margin: 0;\n  }\n  .modal-fullscreen-xl-down .modal-content {\n    height: 100%;\n    border: 0;\n    border-radius: 0;\n  }\n  .modal-fullscreen-xl-down .modal-header,\n  .modal-fullscreen-xl-down .modal-footer {\n    border-radius: 0;\n  }\n  .modal-fullscreen-xl-down .modal-body {\n    overflow-y: auto;\n  }\n}\n@media (max-width: 1399.98px) {\n  .modal-fullscreen-xxl-down {\n    width: 100vw;\n    max-width: none;\n    height: 100%;\n    margin: 0;\n  }\n  .modal-fullscreen-xxl-down .modal-content {\n    height: 100%;\n    border: 0;\n    border-radius: 0;\n  }\n  .modal-fullscreen-xxl-down .modal-header,\n  .modal-fullscreen-xxl-down .modal-footer {\n    border-radius: 0;\n  }\n  .modal-fullscreen-xxl-down .modal-body {\n    overflow-y: auto;\n  }\n}\n.tooltip {\n  --bs-tooltip-zindex: 1080;\n  --bs-tooltip-max-width: 200px;\n  --bs-tooltip-padding-x: 0.5rem;\n  --bs-tooltip-padding-y: 0.25rem;\n  --bs-tooltip-margin: ;\n  --bs-tooltip-font-size: 0.875rem;\n  --bs-tooltip-color: var(--bs-body-bg);\n  --bs-tooltip-bg: var(--bs-emphasis-color);\n  --bs-tooltip-border-radius: var(--bs-border-radius);\n  --bs-tooltip-opacity: 0.9;\n  --bs-tooltip-arrow-width: 0.8rem;\n  --bs-tooltip-arrow-height: 0.4rem;\n  z-index: var(--bs-tooltip-zindex);\n  display: block;\n  margin: var(--bs-tooltip-margin);\n  font-family: var(--bs-font-sans-serif);\n  font-style: normal;\n  font-weight: 400;\n  line-height: 1.5;\n  text-align: left;\n  text-align: start;\n  text-decoration: none;\n  text-shadow: none;\n  text-transform: none;\n  letter-spacing: normal;\n  word-break: normal;\n  white-space: normal;\n  word-spacing: normal;\n  line-break: auto;\n  font-size: var(--bs-tooltip-font-size);\n  word-wrap: break-word;\n  opacity: 0;\n}\n.tooltip.show {\n  opacity: var(--bs-tooltip-opacity);\n}\n.tooltip .tooltip-arrow {\n  display: block;\n  width: var(--bs-tooltip-arrow-width);\n  height: var(--bs-tooltip-arrow-height);\n}\n.tooltip .tooltip-arrow::before {\n  position: absolute;\n  content: \"\";\n  border-color: transparent;\n  border-style: solid;\n}\n\n.bs-tooltip-top .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow {\n  bottom: calc(-1 * var(--bs-tooltip-arrow-height));\n}\n.bs-tooltip-top .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before {\n  top: -1px;\n  border-width: var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * 0.5) 0;\n  border-top-color: var(--bs-tooltip-bg);\n}\n\n/* rtl:begin:ignore */\n.bs-tooltip-end .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow {\n  left: calc(-1 * var(--bs-tooltip-arrow-height));\n  width: var(--bs-tooltip-arrow-height);\n  height: var(--bs-tooltip-arrow-width);\n}\n.bs-tooltip-end .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before {\n  right: -1px;\n  border-width: calc(var(--bs-tooltip-arrow-width) * 0.5) var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * 0.5) 0;\n  border-right-color: var(--bs-tooltip-bg);\n}\n\n/* rtl:end:ignore */\n.bs-tooltip-bottom .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow {\n  top: calc(-1 * var(--bs-tooltip-arrow-height));\n}\n.bs-tooltip-bottom .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before {\n  bottom: -1px;\n  border-width: 0 calc(var(--bs-tooltip-arrow-width) * 0.5) var(--bs-tooltip-arrow-height);\n  border-bottom-color: var(--bs-tooltip-bg);\n}\n\n/* rtl:begin:ignore */\n.bs-tooltip-start .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow {\n  right: calc(-1 * var(--bs-tooltip-arrow-height));\n  width: var(--bs-tooltip-arrow-height);\n  height: var(--bs-tooltip-arrow-width);\n}\n.bs-tooltip-start .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before {\n  left: -1px;\n  border-width: calc(var(--bs-tooltip-arrow-width) * 0.5) 0 calc(var(--bs-tooltip-arrow-width) * 0.5) var(--bs-tooltip-arrow-height);\n  border-left-color: var(--bs-tooltip-bg);\n}\n\n/* rtl:end:ignore */\n.tooltip-inner {\n  max-width: var(--bs-tooltip-max-width);\n  padding: var(--bs-tooltip-padding-y) var(--bs-tooltip-padding-x);\n  color: var(--bs-tooltip-color);\n  text-align: center;\n  background-color: var(--bs-tooltip-bg);\n  border-radius: var(--bs-tooltip-border-radius);\n}\n\n.popover {\n  --bs-popover-zindex: 1070;\n  --bs-popover-max-width: 276px;\n  --bs-popover-font-size: 0.875rem;\n  --bs-popover-bg: var(--bs-body-bg);\n  --bs-popover-border-width: var(--bs-border-width);\n  --bs-popover-border-color: var(--bs-border-color-translucent);\n  --bs-popover-border-radius: var(--bs-border-radius-lg);\n  --bs-popover-inner-border-radius: calc(var(--bs-border-radius-lg) - var(--bs-border-width));\n  --bs-popover-box-shadow: var(--bs-box-shadow);\n  --bs-popover-header-padding-x: 1rem;\n  --bs-popover-header-padding-y: 0.5rem;\n  --bs-popover-header-font-size: 1rem;\n  --bs-popover-header-color: inherit;\n  --bs-popover-header-bg: var(--bs-secondary-bg);\n  --bs-popover-body-padding-x: 1rem;\n  --bs-popover-body-padding-y: 1rem;\n  --bs-popover-body-color: var(--bs-body-color);\n  --bs-popover-arrow-width: 1rem;\n  --bs-popover-arrow-height: 0.5rem;\n  --bs-popover-arrow-border: var(--bs-popover-border-color);\n  z-index: var(--bs-popover-zindex);\n  display: block;\n  max-width: var(--bs-popover-max-width);\n  font-family: var(--bs-font-sans-serif);\n  font-style: normal;\n  font-weight: 400;\n  line-height: 1.5;\n  text-align: left;\n  text-align: start;\n  text-decoration: none;\n  text-shadow: none;\n  text-transform: none;\n  letter-spacing: normal;\n  word-break: normal;\n  white-space: normal;\n  word-spacing: normal;\n  line-break: auto;\n  font-size: var(--bs-popover-font-size);\n  word-wrap: break-word;\n  background-color: var(--bs-popover-bg);\n  background-clip: padding-box;\n  border: var(--bs-popover-border-width) solid var(--bs-popover-border-color);\n  border-radius: var(--bs-popover-border-radius);\n}\n.popover .popover-arrow {\n  display: block;\n  width: var(--bs-popover-arrow-width);\n  height: var(--bs-popover-arrow-height);\n}\n.popover .popover-arrow::before, .popover .popover-arrow::after {\n  position: absolute;\n  display: block;\n  content: \"\";\n  border-color: transparent;\n  border-style: solid;\n  border-width: 0;\n}\n\n.bs-popover-top > .popover-arrow, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow {\n  bottom: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));\n}\n.bs-popover-top > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::before, .bs-popover-top > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::after {\n  border-width: var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * 0.5) 0;\n}\n.bs-popover-top > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::before {\n  bottom: 0;\n  border-top-color: var(--bs-popover-arrow-border);\n}\n.bs-popover-top > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::after {\n  bottom: var(--bs-popover-border-width);\n  border-top-color: var(--bs-popover-bg);\n}\n\n/* rtl:begin:ignore */\n.bs-popover-end > .popover-arrow, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow {\n  left: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));\n  width: var(--bs-popover-arrow-height);\n  height: var(--bs-popover-arrow-width);\n}\n.bs-popover-end > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::before, .bs-popover-end > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::after {\n  border-width: calc(var(--bs-popover-arrow-width) * 0.5) var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * 0.5) 0;\n}\n.bs-popover-end > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::before {\n  left: 0;\n  border-right-color: var(--bs-popover-arrow-border);\n}\n.bs-popover-end > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::after {\n  left: var(--bs-popover-border-width);\n  border-right-color: var(--bs-popover-bg);\n}\n\n/* rtl:end:ignore */\n.bs-popover-bottom > .popover-arrow, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow {\n  top: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));\n}\n.bs-popover-bottom > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::before, .bs-popover-bottom > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::after {\n  border-width: 0 calc(var(--bs-popover-arrow-width) * 0.5) var(--bs-popover-arrow-height);\n}\n.bs-popover-bottom > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::before {\n  top: 0;\n  border-bottom-color: var(--bs-popover-arrow-border);\n}\n.bs-popover-bottom > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::after {\n  top: var(--bs-popover-border-width);\n  border-bottom-color: var(--bs-popover-bg);\n}\n.bs-popover-bottom .popover-header::before, .bs-popover-auto[data-popper-placement^=bottom] .popover-header::before {\n  position: absolute;\n  top: 0;\n  left: 50%;\n  display: block;\n  width: var(--bs-popover-arrow-width);\n  margin-left: calc(-0.5 * var(--bs-popover-arrow-width));\n  content: \"\";\n  border-bottom: var(--bs-popover-border-width) solid var(--bs-popover-header-bg);\n}\n\n/* rtl:begin:ignore */\n.bs-popover-start > .popover-arrow, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow {\n  right: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));\n  width: var(--bs-popover-arrow-height);\n  height: var(--bs-popover-arrow-width);\n}\n.bs-popover-start > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::before, .bs-popover-start > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::after {\n  border-width: calc(var(--bs-popover-arrow-width) * 0.5) 0 calc(var(--bs-popover-arrow-width) * 0.5) var(--bs-popover-arrow-height);\n}\n.bs-popover-start > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::before {\n  right: 0;\n  border-left-color: var(--bs-popover-arrow-border);\n}\n.bs-popover-start > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::after {\n  right: var(--bs-popover-border-width);\n  border-left-color: var(--bs-popover-bg);\n}\n\n/* rtl:end:ignore */\n.popover-header {\n  padding: var(--bs-popover-header-padding-y) var(--bs-popover-header-padding-x);\n  margin-bottom: 0;\n  font-size: var(--bs-popover-header-font-size);\n  color: var(--bs-popover-header-color);\n  background-color: var(--bs-popover-header-bg);\n  border-bottom: var(--bs-popover-border-width) solid var(--bs-popover-border-color);\n  border-top-left-radius: var(--bs-popover-inner-border-radius);\n  border-top-right-radius: var(--bs-popover-inner-border-radius);\n}\n.popover-header:empty {\n  display: none;\n}\n\n.popover-body {\n  padding: var(--bs-popover-body-padding-y) var(--bs-popover-body-padding-x);\n  color: var(--bs-popover-body-color);\n}\n\n.carousel {\n  position: relative;\n}\n\n.carousel.pointer-event {\n  touch-action: pan-y;\n}\n\n.carousel-inner {\n  position: relative;\n  width: 100%;\n  overflow: hidden;\n}\n.carousel-inner::after {\n  display: block;\n  clear: both;\n  content: \"\";\n}\n\n.carousel-item {\n  position: relative;\n  display: none;\n  float: left;\n  width: 100%;\n  margin-right: -100%;\n  -webkit-backface-visibility: hidden;\n  backface-visibility: hidden;\n  transition: transform 0.6s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n  .carousel-item {\n    transition: none;\n  }\n}\n\n.carousel-item.active,\n.carousel-item-next,\n.carousel-item-prev {\n  display: block;\n}\n\n.carousel-item-next:not(.carousel-item-start),\n.active.carousel-item-end {\n  transform: translateX(100%);\n}\n\n.carousel-item-prev:not(.carousel-item-end),\n.active.carousel-item-start {\n  transform: translateX(-100%);\n}\n\n.carousel-fade .carousel-item {\n  opacity: 0;\n  transition-property: opacity;\n  transform: none;\n}\n.carousel-fade .carousel-item.active,\n.carousel-fade .carousel-item-next.carousel-item-start,\n.carousel-fade .carousel-item-prev.carousel-item-end {\n  z-index: 1;\n  opacity: 1;\n}\n.carousel-fade .active.carousel-item-start,\n.carousel-fade .active.carousel-item-end {\n  z-index: 0;\n  opacity: 0;\n  transition: opacity 0s 0.6s;\n}\n@media (prefers-reduced-motion: reduce) {\n  .carousel-fade .active.carousel-item-start,\n  .carousel-fade .active.carousel-item-end {\n    transition: none;\n  }\n}\n\n.carousel-control-prev,\n.carousel-control-next {\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  z-index: 1;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  width: 15%;\n  padding: 0;\n  color: #fff;\n  text-align: center;\n  background: none;\n  filter: var(--bs-carousel-control-icon-filter);\n  border: 0;\n  opacity: 0.5;\n  transition: opacity 0.15s ease;\n}\n@media (prefers-reduced-motion: reduce) {\n  .carousel-control-prev,\n  .carousel-control-next {\n    transition: none;\n  }\n}\n.carousel-control-prev:hover, .carousel-control-prev:focus,\n.carousel-control-next:hover,\n.carousel-control-next:focus {\n  color: #fff;\n  text-decoration: none;\n  outline: 0;\n  opacity: 0.9;\n}\n\n.carousel-control-prev {\n  left: 0;\n}\n\n.carousel-control-next {\n  right: 0;\n}\n\n.carousel-control-prev-icon,\n.carousel-control-next-icon {\n  display: inline-block;\n  width: 2rem;\n  height: 2rem;\n  background-repeat: no-repeat;\n  background-position: 50%;\n  background-size: 100% 100%;\n}\n\n.carousel-control-prev-icon {\n  background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0'/%3e%3c/svg%3e\") /*rtl:url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708'/%3e%3c/svg%3e\")*/;\n}\n\n.carousel-control-next-icon {\n  background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708'/%3e%3c/svg%3e\") /*rtl:url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0'/%3e%3c/svg%3e\")*/;\n}\n\n.carousel-indicators {\n  position: absolute;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 2;\n  display: flex;\n  justify-content: center;\n  padding: 0;\n  margin-right: 15%;\n  margin-bottom: 1rem;\n  margin-left: 15%;\n}\n.carousel-indicators [data-bs-target] {\n  box-sizing: content-box;\n  flex: 0 1 auto;\n  width: 30px;\n  height: 3px;\n  padding: 0;\n  margin-right: 3px;\n  margin-left: 3px;\n  text-indent: -999px;\n  cursor: pointer;\n  background-color: var(--bs-carousel-indicator-active-bg);\n  background-clip: padding-box;\n  border: 0;\n  border-top: 10px solid transparent;\n  border-bottom: 10px solid transparent;\n  opacity: 0.5;\n  transition: opacity 0.6s ease;\n}\n@media (prefers-reduced-motion: reduce) {\n  .carousel-indicators [data-bs-target] {\n    transition: none;\n  }\n}\n.carousel-indicators .active {\n  opacity: 1;\n}\n\n.carousel-caption {\n  position: absolute;\n  right: 15%;\n  bottom: 1.25rem;\n  left: 15%;\n  padding-top: 1.25rem;\n  padding-bottom: 1.25rem;\n  color: var(--bs-carousel-caption-color);\n  text-align: center;\n}\n\n.carousel-dark {\n  --bs-carousel-indicator-active-bg: #000;\n  --bs-carousel-caption-color: #000;\n  --bs-carousel-control-icon-filter: invert(1) grayscale(100);\n}\n\n:root,\n[data-bs-theme=light] {\n  --bs-carousel-indicator-active-bg: #fff;\n  --bs-carousel-caption-color: #fff;\n  --bs-carousel-control-icon-filter: ;\n}\n\n[data-bs-theme=dark] {\n  --bs-carousel-indicator-active-bg: #000;\n  --bs-carousel-caption-color: #000;\n  --bs-carousel-control-icon-filter: invert(1) grayscale(100);\n}\n\n.spinner-grow,\n.spinner-border {\n  display: inline-block;\n  flex-shrink: 0;\n  width: var(--bs-spinner-width);\n  height: var(--bs-spinner-height);\n  vertical-align: var(--bs-spinner-vertical-align);\n  border-radius: 50%;\n  animation: var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name);\n}\n\n@keyframes spinner-border {\n  to {\n    transform: rotate(360deg) /* rtl:ignore */;\n  }\n}\n.spinner-border {\n  --bs-spinner-width: 2rem;\n  --bs-spinner-height: 2rem;\n  --bs-spinner-vertical-align: -0.125em;\n  --bs-spinner-border-width: 0.25em;\n  --bs-spinner-animation-speed: 0.75s;\n  --bs-spinner-animation-name: spinner-border;\n  border: var(--bs-spinner-border-width) solid currentcolor;\n  border-right-color: transparent;\n}\n\n.spinner-border-sm {\n  --bs-spinner-width: 1rem;\n  --bs-spinner-height: 1rem;\n  --bs-spinner-border-width: 0.2em;\n}\n\n@keyframes spinner-grow {\n  0% {\n    transform: scale(0);\n  }\n  50% {\n    opacity: 1;\n    transform: none;\n  }\n}\n.spinner-grow {\n  --bs-spinner-width: 2rem;\n  --bs-spinner-height: 2rem;\n  --bs-spinner-vertical-align: -0.125em;\n  --bs-spinner-animation-speed: 0.75s;\n  --bs-spinner-animation-name: spinner-grow;\n  background-color: currentcolor;\n  opacity: 0;\n}\n\n.spinner-grow-sm {\n  --bs-spinner-width: 1rem;\n  --bs-spinner-height: 1rem;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .spinner-border,\n  .spinner-grow {\n    --bs-spinner-animation-speed: 1.5s;\n  }\n}\n.offcanvas, .offcanvas-xxl, .offcanvas-xl, .offcanvas-lg, .offcanvas-md, .offcanvas-sm {\n  --bs-offcanvas-zindex: 1045;\n  --bs-offcanvas-width: 400px;\n  --bs-offcanvas-height: 30vh;\n  --bs-offcanvas-padding-x: 1rem;\n  --bs-offcanvas-padding-y: 1rem;\n  --bs-offcanvas-color: var(--bs-body-color);\n  --bs-offcanvas-bg: var(--bs-body-bg);\n  --bs-offcanvas-border-width: var(--bs-border-width);\n  --bs-offcanvas-border-color: var(--bs-border-color-translucent);\n  --bs-offcanvas-box-shadow: var(--bs-box-shadow-sm);\n  --bs-offcanvas-transition: transform 0.3s ease-in-out;\n  --bs-offcanvas-title-line-height: 1.5;\n}\n\n@media (max-width: 575.98px) {\n  .offcanvas-sm {\n    position: fixed;\n    bottom: 0;\n    z-index: var(--bs-offcanvas-zindex);\n    display: flex;\n    flex-direction: column;\n    max-width: 100%;\n    color: var(--bs-offcanvas-color);\n    visibility: hidden;\n    background-color: var(--bs-offcanvas-bg);\n    background-clip: padding-box;\n    outline: 0;\n    transition: var(--bs-offcanvas-transition);\n  }\n}\n@media (max-width: 575.98px) and (prefers-reduced-motion: reduce) {\n  .offcanvas-sm {\n    transition: none;\n  }\n}\n@media (max-width: 575.98px) {\n  .offcanvas-sm.offcanvas-start {\n    top: 0;\n    left: 0;\n    width: var(--bs-offcanvas-width);\n    border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n    transform: translateX(-100%);\n  }\n  .offcanvas-sm.offcanvas-end {\n    top: 0;\n    right: 0;\n    width: var(--bs-offcanvas-width);\n    border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n    transform: translateX(100%);\n  }\n  .offcanvas-sm.offcanvas-top {\n    top: 0;\n    right: 0;\n    left: 0;\n    height: var(--bs-offcanvas-height);\n    max-height: 100%;\n    border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n    transform: translateY(-100%);\n  }\n  .offcanvas-sm.offcanvas-bottom {\n    right: 0;\n    left: 0;\n    height: var(--bs-offcanvas-height);\n    max-height: 100%;\n    border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n    transform: translateY(100%);\n  }\n  .offcanvas-sm.showing, .offcanvas-sm.show:not(.hiding) {\n    transform: none;\n  }\n  .offcanvas-sm.showing, .offcanvas-sm.hiding, .offcanvas-sm.show {\n    visibility: visible;\n  }\n}\n@media (min-width: 576px) {\n  .offcanvas-sm {\n    --bs-offcanvas-height: auto;\n    --bs-offcanvas-border-width: 0;\n    background-color: transparent !important;\n  }\n  .offcanvas-sm .offcanvas-header {\n    display: none;\n  }\n  .offcanvas-sm .offcanvas-body {\n    display: flex;\n    flex-grow: 0;\n    padding: 0;\n    overflow-y: visible;\n    background-color: transparent !important;\n  }\n}\n\n@media (max-width: 767.98px) {\n  .offcanvas-md {\n    position: fixed;\n    bottom: 0;\n    z-index: var(--bs-offcanvas-zindex);\n    display: flex;\n    flex-direction: column;\n    max-width: 100%;\n    color: var(--bs-offcanvas-color);\n    visibility: hidden;\n    background-color: var(--bs-offcanvas-bg);\n    background-clip: padding-box;\n    outline: 0;\n    transition: var(--bs-offcanvas-transition);\n  }\n}\n@media (max-width: 767.98px) and (prefers-reduced-motion: reduce) {\n  .offcanvas-md {\n    transition: none;\n  }\n}\n@media (max-width: 767.98px) {\n  .offcanvas-md.offcanvas-start {\n    top: 0;\n    left: 0;\n    width: var(--bs-offcanvas-width);\n    border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n    transform: translateX(-100%);\n  }\n  .offcanvas-md.offcanvas-end {\n    top: 0;\n    right: 0;\n    width: var(--bs-offcanvas-width);\n    border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n    transform: translateX(100%);\n  }\n  .offcanvas-md.offcanvas-top {\n    top: 0;\n    right: 0;\n    left: 0;\n    height: var(--bs-offcanvas-height);\n    max-height: 100%;\n    border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n    transform: translateY(-100%);\n  }\n  .offcanvas-md.offcanvas-bottom {\n    right: 0;\n    left: 0;\n    height: var(--bs-offcanvas-height);\n    max-height: 100%;\n    border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n    transform: translateY(100%);\n  }\n  .offcanvas-md.showing, .offcanvas-md.show:not(.hiding) {\n    transform: none;\n  }\n  .offcanvas-md.showing, .offcanvas-md.hiding, .offcanvas-md.show {\n    visibility: visible;\n  }\n}\n@media (min-width: 768px) {\n  .offcanvas-md {\n    --bs-offcanvas-height: auto;\n    --bs-offcanvas-border-width: 0;\n    background-color: transparent !important;\n  }\n  .offcanvas-md .offcanvas-header {\n    display: none;\n  }\n  .offcanvas-md .offcanvas-body {\n    display: flex;\n    flex-grow: 0;\n    padding: 0;\n    overflow-y: visible;\n    background-color: transparent !important;\n  }\n}\n\n@media (max-width: 991.98px) {\n  .offcanvas-lg {\n    position: fixed;\n    bottom: 0;\n    z-index: var(--bs-offcanvas-zindex);\n    display: flex;\n    flex-direction: column;\n    max-width: 100%;\n    color: var(--bs-offcanvas-color);\n    visibility: hidden;\n    background-color: var(--bs-offcanvas-bg);\n    background-clip: padding-box;\n    outline: 0;\n    transition: var(--bs-offcanvas-transition);\n  }\n}\n@media (max-width: 991.98px) and (prefers-reduced-motion: reduce) {\n  .offcanvas-lg {\n    transition: none;\n  }\n}\n@media (max-width: 991.98px) {\n  .offcanvas-lg.offcanvas-start {\n    top: 0;\n    left: 0;\n    width: var(--bs-offcanvas-width);\n    border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n    transform: translateX(-100%);\n  }\n  .offcanvas-lg.offcanvas-end {\n    top: 0;\n    right: 0;\n    width: var(--bs-offcanvas-width);\n    border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n    transform: translateX(100%);\n  }\n  .offcanvas-lg.offcanvas-top {\n    top: 0;\n    right: 0;\n    left: 0;\n    height: var(--bs-offcanvas-height);\n    max-height: 100%;\n    border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n    transform: translateY(-100%);\n  }\n  .offcanvas-lg.offcanvas-bottom {\n    right: 0;\n    left: 0;\n    height: var(--bs-offcanvas-height);\n    max-height: 100%;\n    border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n    transform: translateY(100%);\n  }\n  .offcanvas-lg.showing, .offcanvas-lg.show:not(.hiding) {\n    transform: none;\n  }\n  .offcanvas-lg.showing, .offcanvas-lg.hiding, .offcanvas-lg.show {\n    visibility: visible;\n  }\n}\n@media (min-width: 992px) {\n  .offcanvas-lg {\n    --bs-offcanvas-height: auto;\n    --bs-offcanvas-border-width: 0;\n    background-color: transparent !important;\n  }\n  .offcanvas-lg .offcanvas-header {\n    display: none;\n  }\n  .offcanvas-lg .offcanvas-body {\n    display: flex;\n    flex-grow: 0;\n    padding: 0;\n    overflow-y: visible;\n    background-color: transparent !important;\n  }\n}\n\n@media (max-width: 1199.98px) {\n  .offcanvas-xl {\n    position: fixed;\n    bottom: 0;\n    z-index: var(--bs-offcanvas-zindex);\n    display: flex;\n    flex-direction: column;\n    max-width: 100%;\n    color: var(--bs-offcanvas-color);\n    visibility: hidden;\n    background-color: var(--bs-offcanvas-bg);\n    background-clip: padding-box;\n    outline: 0;\n    transition: var(--bs-offcanvas-transition);\n  }\n}\n@media (max-width: 1199.98px) and (prefers-reduced-motion: reduce) {\n  .offcanvas-xl {\n    transition: none;\n  }\n}\n@media (max-width: 1199.98px) {\n  .offcanvas-xl.offcanvas-start {\n    top: 0;\n    left: 0;\n    width: var(--bs-offcanvas-width);\n    border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n    transform: translateX(-100%);\n  }\n  .offcanvas-xl.offcanvas-end {\n    top: 0;\n    right: 0;\n    width: var(--bs-offcanvas-width);\n    border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n    transform: translateX(100%);\n  }\n  .offcanvas-xl.offcanvas-top {\n    top: 0;\n    right: 0;\n    left: 0;\n    height: var(--bs-offcanvas-height);\n    max-height: 100%;\n    border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n    transform: translateY(-100%);\n  }\n  .offcanvas-xl.offcanvas-bottom {\n    right: 0;\n    left: 0;\n    height: var(--bs-offcanvas-height);\n    max-height: 100%;\n    border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n    transform: translateY(100%);\n  }\n  .offcanvas-xl.showing, .offcanvas-xl.show:not(.hiding) {\n    transform: none;\n  }\n  .offcanvas-xl.showing, .offcanvas-xl.hiding, .offcanvas-xl.show {\n    visibility: visible;\n  }\n}\n@media (min-width: 1200px) {\n  .offcanvas-xl {\n    --bs-offcanvas-height: auto;\n    --bs-offcanvas-border-width: 0;\n    background-color: transparent !important;\n  }\n  .offcanvas-xl .offcanvas-header {\n    display: none;\n  }\n  .offcanvas-xl .offcanvas-body {\n    display: flex;\n    flex-grow: 0;\n    padding: 0;\n    overflow-y: visible;\n    background-color: transparent !important;\n  }\n}\n\n@media (max-width: 1399.98px) {\n  .offcanvas-xxl {\n    position: fixed;\n    bottom: 0;\n    z-index: var(--bs-offcanvas-zindex);\n    display: flex;\n    flex-direction: column;\n    max-width: 100%;\n    color: var(--bs-offcanvas-color);\n    visibility: hidden;\n    background-color: var(--bs-offcanvas-bg);\n    background-clip: padding-box;\n    outline: 0;\n    transition: var(--bs-offcanvas-transition);\n  }\n}\n@media (max-width: 1399.98px) and (prefers-reduced-motion: reduce) {\n  .offcanvas-xxl {\n    transition: none;\n  }\n}\n@media (max-width: 1399.98px) {\n  .offcanvas-xxl.offcanvas-start {\n    top: 0;\n    left: 0;\n    width: var(--bs-offcanvas-width);\n    border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n    transform: translateX(-100%);\n  }\n  .offcanvas-xxl.offcanvas-end {\n    top: 0;\n    right: 0;\n    width: var(--bs-offcanvas-width);\n    border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n    transform: translateX(100%);\n  }\n  .offcanvas-xxl.offcanvas-top {\n    top: 0;\n    right: 0;\n    left: 0;\n    height: var(--bs-offcanvas-height);\n    max-height: 100%;\n    border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n    transform: translateY(-100%);\n  }\n  .offcanvas-xxl.offcanvas-bottom {\n    right: 0;\n    left: 0;\n    height: var(--bs-offcanvas-height);\n    max-height: 100%;\n    border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n    transform: translateY(100%);\n  }\n  .offcanvas-xxl.showing, .offcanvas-xxl.show:not(.hiding) {\n    transform: none;\n  }\n  .offcanvas-xxl.showing, .offcanvas-xxl.hiding, .offcanvas-xxl.show {\n    visibility: visible;\n  }\n}\n@media (min-width: 1400px) {\n  .offcanvas-xxl {\n    --bs-offcanvas-height: auto;\n    --bs-offcanvas-border-width: 0;\n    background-color: transparent !important;\n  }\n  .offcanvas-xxl .offcanvas-header {\n    display: none;\n  }\n  .offcanvas-xxl .offcanvas-body {\n    display: flex;\n    flex-grow: 0;\n    padding: 0;\n    overflow-y: visible;\n    background-color: transparent !important;\n  }\n}\n\n.offcanvas {\n  position: fixed;\n  bottom: 0;\n  z-index: var(--bs-offcanvas-zindex);\n  display: flex;\n  flex-direction: column;\n  max-width: 100%;\n  color: var(--bs-offcanvas-color);\n  visibility: hidden;\n  background-color: var(--bs-offcanvas-bg);\n  background-clip: padding-box;\n  outline: 0;\n  transition: var(--bs-offcanvas-transition);\n}\n@media (prefers-reduced-motion: reduce) {\n  .offcanvas {\n    transition: none;\n  }\n}\n.offcanvas.offcanvas-start {\n  top: 0;\n  left: 0;\n  width: var(--bs-offcanvas-width);\n  border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n  transform: translateX(-100%);\n}\n.offcanvas.offcanvas-end {\n  top: 0;\n  right: 0;\n  width: var(--bs-offcanvas-width);\n  border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n  transform: translateX(100%);\n}\n.offcanvas.offcanvas-top {\n  top: 0;\n  right: 0;\n  left: 0;\n  height: var(--bs-offcanvas-height);\n  max-height: 100%;\n  border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n  transform: translateY(-100%);\n}\n.offcanvas.offcanvas-bottom {\n  right: 0;\n  left: 0;\n  height: var(--bs-offcanvas-height);\n  max-height: 100%;\n  border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n  transform: translateY(100%);\n}\n.offcanvas.showing, .offcanvas.show:not(.hiding) {\n  transform: none;\n}\n.offcanvas.showing, .offcanvas.hiding, .offcanvas.show {\n  visibility: visible;\n}\n\n.offcanvas-backdrop {\n  position: fixed;\n  top: 0;\n  left: 0;\n  z-index: 1040;\n  width: 100vw;\n  height: 100vh;\n  background-color: #000;\n}\n.offcanvas-backdrop.fade {\n  opacity: 0;\n}\n.offcanvas-backdrop.show {\n  opacity: 0.5;\n}\n\n.offcanvas-header {\n  display: flex;\n  align-items: center;\n  padding: var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x);\n}\n.offcanvas-header .btn-close {\n  padding: calc(var(--bs-offcanvas-padding-y) * 0.5) calc(var(--bs-offcanvas-padding-x) * 0.5);\n  margin-top: calc(-0.5 * var(--bs-offcanvas-padding-y));\n  margin-right: calc(-0.5 * var(--bs-offcanvas-padding-x));\n  margin-bottom: calc(-0.5 * var(--bs-offcanvas-padding-y));\n  margin-left: auto;\n}\n\n.offcanvas-title {\n  margin-bottom: 0;\n  line-height: var(--bs-offcanvas-title-line-height);\n}\n\n.offcanvas-body {\n  flex-grow: 1;\n  padding: var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x);\n  overflow-y: auto;\n}\n\n.placeholder {\n  display: inline-block;\n  min-height: 1em;\n  vertical-align: middle;\n  cursor: wait;\n  background-color: currentcolor;\n  opacity: 0.5;\n}\n.placeholder.btn::before {\n  display: inline-block;\n  content: \"\";\n}\n\n.placeholder-xs {\n  min-height: 0.6em;\n}\n\n.placeholder-sm {\n  min-height: 0.8em;\n}\n\n.placeholder-lg {\n  min-height: 1.2em;\n}\n\n.placeholder-glow .placeholder {\n  animation: placeholder-glow 2s ease-in-out infinite;\n}\n\n@keyframes placeholder-glow {\n  50% {\n    opacity: 0.2;\n  }\n}\n.placeholder-wave {\n  -webkit-mask-image: linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%);\n  mask-image: linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%);\n  -webkit-mask-size: 200% 100%;\n  mask-size: 200% 100%;\n  animation: placeholder-wave 2s linear infinite;\n}\n\n@keyframes placeholder-wave {\n  100% {\n    -webkit-mask-position: -200% 0%;\n    mask-position: -200% 0%;\n  }\n}\n.clearfix::after {\n  display: block;\n  clear: both;\n  content: \"\";\n}\n\n.text-bg-primary {\n  color: #fff !important;\n  background-color: RGBA(var(--bs-primary-rgb), var(--bs-bg-opacity, 1)) !important;\n}\n\n.text-bg-secondary {\n  color: #fff !important;\n  background-color: RGBA(var(--bs-secondary-rgb), var(--bs-bg-opacity, 1)) !important;\n}\n\n.text-bg-success {\n  color: #fff !important;\n  background-color: RGBA(var(--bs-success-rgb), var(--bs-bg-opacity, 1)) !important;\n}\n\n.text-bg-info {\n  color: #000 !important;\n  background-color: RGBA(var(--bs-info-rgb), var(--bs-bg-opacity, 1)) !important;\n}\n\n.text-bg-warning {\n  color: #000 !important;\n  background-color: RGBA(var(--bs-warning-rgb), var(--bs-bg-opacity, 1)) !important;\n}\n\n.text-bg-danger {\n  color: #fff !important;\n  background-color: RGBA(var(--bs-danger-rgb), var(--bs-bg-opacity, 1)) !important;\n}\n\n.text-bg-light {\n  color: #000 !important;\n  background-color: RGBA(var(--bs-light-rgb), var(--bs-bg-opacity, 1)) !important;\n}\n\n.text-bg-dark {\n  color: #fff !important;\n  background-color: RGBA(var(--bs-dark-rgb), var(--bs-bg-opacity, 1)) !important;\n}\n\n.link-primary {\n  color: RGBA(var(--bs-primary-rgb), var(--bs-link-opacity, 1)) !important;\n  -webkit-text-decoration-color: RGBA(var(--bs-primary-rgb), var(--bs-link-underline-opacity, 1)) !important;\n  text-decoration-color: RGBA(var(--bs-primary-rgb), var(--bs-link-underline-opacity, 1)) !important;\n}\n.link-primary:hover, .link-primary:focus {\n  color: RGBA(10, 88, 202, var(--bs-link-opacity, 1)) !important;\n  -webkit-text-decoration-color: RGBA(10, 88, 202, var(--bs-link-underline-opacity, 1)) !important;\n  text-decoration-color: RGBA(10, 88, 202, var(--bs-link-underline-opacity, 1)) !important;\n}\n\n.link-secondary {\n  color: RGBA(var(--bs-secondary-rgb), var(--bs-link-opacity, 1)) !important;\n  -webkit-text-decoration-color: RGBA(var(--bs-secondary-rgb), var(--bs-link-underline-opacity, 1)) !important;\n  text-decoration-color: RGBA(var(--bs-secondary-rgb), var(--bs-link-underline-opacity, 1)) !important;\n}\n.link-secondary:hover, .link-secondary:focus {\n  color: RGBA(86, 94, 100, var(--bs-link-opacity, 1)) !important;\n  -webkit-text-decoration-color: RGBA(86, 94, 100, var(--bs-link-underline-opacity, 1)) !important;\n  text-decoration-color: RGBA(86, 94, 100, var(--bs-link-underline-opacity, 1)) !important;\n}\n\n.link-success {\n  color: RGBA(var(--bs-success-rgb), var(--bs-link-opacity, 1)) !important;\n  -webkit-text-decoration-color: RGBA(var(--bs-success-rgb), var(--bs-link-underline-opacity, 1)) !important;\n  text-decoration-color: RGBA(var(--bs-success-rgb), var(--bs-link-underline-opacity, 1)) !important;\n}\n.link-success:hover, .link-success:focus {\n  color: RGBA(20, 108, 67, var(--bs-link-opacity, 1)) !important;\n  -webkit-text-decoration-color: RGBA(20, 108, 67, var(--bs-link-underline-opacity, 1)) !important;\n  text-decoration-color: RGBA(20, 108, 67, var(--bs-link-underline-opacity, 1)) !important;\n}\n\n.link-info {\n  color: RGBA(var(--bs-info-rgb), var(--bs-link-opacity, 1)) !important;\n  -webkit-text-decoration-color: RGBA(var(--bs-info-rgb), var(--bs-link-underline-opacity, 1)) !important;\n  text-decoration-color: RGBA(var(--bs-info-rgb), var(--bs-link-underline-opacity, 1)) !important;\n}\n.link-info:hover, .link-info:focus {\n  color: RGBA(61, 213, 243, var(--bs-link-opacity, 1)) !important;\n  -webkit-text-decoration-color: RGBA(61, 213, 243, var(--bs-link-underline-opacity, 1)) !important;\n  text-decoration-color: RGBA(61, 213, 243, var(--bs-link-underline-opacity, 1)) !important;\n}\n\n.link-warning {\n  color: RGBA(var(--bs-warning-rgb), var(--bs-link-opacity, 1)) !important;\n  -webkit-text-decoration-color: RGBA(var(--bs-warning-rgb), var(--bs-link-underline-opacity, 1)) !important;\n  text-decoration-color: RGBA(var(--bs-warning-rgb), var(--bs-link-underline-opacity, 1)) !important;\n}\n.link-warning:hover, .link-warning:focus {\n  color: RGBA(255, 205, 57, var(--bs-link-opacity, 1)) !important;\n  -webkit-text-decoration-color: RGBA(255, 205, 57, var(--bs-link-underline-opacity, 1)) !important;\n  text-decoration-color: RGBA(255, 205, 57, var(--bs-link-underline-opacity, 1)) !important;\n}\n\n.link-danger {\n  color: RGBA(var(--bs-danger-rgb), var(--bs-link-opacity, 1)) !important;\n  -webkit-text-decoration-color: RGBA(var(--bs-danger-rgb), var(--bs-link-underline-opacity, 1)) !important;\n  text-decoration-color: RGBA(var(--bs-danger-rgb), var(--bs-link-underline-opacity, 1)) !important;\n}\n.link-danger:hover, .link-danger:focus {\n  color: RGBA(176, 42, 55, var(--bs-link-opacity, 1)) !important;\n  -webkit-text-decoration-color: RGBA(176, 42, 55, var(--bs-link-underline-opacity, 1)) !important;\n  text-decoration-color: RGBA(176, 42, 55, var(--bs-link-underline-opacity, 1)) !important;\n}\n\n.link-light {\n  color: RGBA(var(--bs-light-rgb), var(--bs-link-opacity, 1)) !important;\n  -webkit-text-decoration-color: RGBA(var(--bs-light-rgb), var(--bs-link-underline-opacity, 1)) !important;\n  text-decoration-color: RGBA(var(--bs-light-rgb), var(--bs-link-underline-opacity, 1)) !important;\n}\n.link-light:hover, .link-light:focus {\n  color: RGBA(249, 250, 251, var(--bs-link-opacity, 1)) !important;\n  -webkit-text-decoration-color: RGBA(249, 250, 251, var(--bs-link-underline-opacity, 1)) !important;\n  text-decoration-color: RGBA(249, 250, 251, var(--bs-link-underline-opacity, 1)) !important;\n}\n\n.link-dark {\n  color: RGBA(var(--bs-dark-rgb), var(--bs-link-opacity, 1)) !important;\n  -webkit-text-decoration-color: RGBA(var(--bs-dark-rgb), var(--bs-link-underline-opacity, 1)) !important;\n  text-decoration-color: RGBA(var(--bs-dark-rgb), var(--bs-link-underline-opacity, 1)) !important;\n}\n.link-dark:hover, .link-dark:focus {\n  color: RGBA(26, 30, 33, var(--bs-link-opacity, 1)) !important;\n  -webkit-text-decoration-color: RGBA(26, 30, 33, var(--bs-link-underline-opacity, 1)) !important;\n  text-decoration-color: RGBA(26, 30, 33, var(--bs-link-underline-opacity, 1)) !important;\n}\n\n.link-body-emphasis {\n  color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 1)) !important;\n  -webkit-text-decoration-color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 1)) !important;\n  text-decoration-color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 1)) !important;\n}\n.link-body-emphasis:hover, .link-body-emphasis:focus {\n  color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 0.75)) !important;\n  -webkit-text-decoration-color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 0.75)) !important;\n  text-decoration-color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 0.75)) !important;\n}\n\n.focus-ring:focus {\n  outline: 0;\n  box-shadow: var(--bs-focus-ring-x, 0) var(--bs-focus-ring-y, 0) var(--bs-focus-ring-blur, 0) var(--bs-focus-ring-width) var(--bs-focus-ring-color);\n}\n\n.icon-link {\n  display: inline-flex;\n  gap: 0.375rem;\n  align-items: center;\n  -webkit-text-decoration-color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 0.5));\n  text-decoration-color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 0.5));\n  text-underline-offset: 0.25em;\n  -webkit-backface-visibility: hidden;\n  backface-visibility: hidden;\n}\n.icon-link > .bi {\n  flex-shrink: 0;\n  width: 1em;\n  height: 1em;\n  fill: currentcolor;\n  transition: 0.2s ease-in-out transform;\n}\n@media (prefers-reduced-motion: reduce) {\n  .icon-link > .bi {\n    transition: none;\n  }\n}\n\n.icon-link-hover:hover > .bi, .icon-link-hover:focus-visible > .bi {\n  transform: var(--bs-icon-link-transform, translate3d(0.25em, 0, 0));\n}\n\n.ratio {\n  position: relative;\n  width: 100%;\n}\n.ratio::before {\n  display: block;\n  padding-top: var(--bs-aspect-ratio);\n  content: \"\";\n}\n.ratio > * {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n}\n\n.ratio-1x1 {\n  --bs-aspect-ratio: 100%;\n}\n\n.ratio-4x3 {\n  --bs-aspect-ratio: 75%;\n}\n\n.ratio-16x9 {\n  --bs-aspect-ratio: 56.25%;\n}\n\n.ratio-21x9 {\n  --bs-aspect-ratio: 42.8571428571%;\n}\n\n.fixed-top {\n  position: fixed;\n  top: 0;\n  right: 0;\n  left: 0;\n  z-index: 1030;\n}\n\n.fixed-bottom {\n  position: fixed;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1030;\n}\n\n.sticky-top {\n  position: -webkit-sticky;\n  position: sticky;\n  top: 0;\n  z-index: 1020;\n}\n\n.sticky-bottom {\n  position: -webkit-sticky;\n  position: sticky;\n  bottom: 0;\n  z-index: 1020;\n}\n\n@media (min-width: 576px) {\n  .sticky-sm-top {\n    position: -webkit-sticky;\n    position: sticky;\n    top: 0;\n    z-index: 1020;\n  }\n  .sticky-sm-bottom {\n    position: -webkit-sticky;\n    position: sticky;\n    bottom: 0;\n    z-index: 1020;\n  }\n}\n@media (min-width: 768px) {\n  .sticky-md-top {\n    position: -webkit-sticky;\n    position: sticky;\n    top: 0;\n    z-index: 1020;\n  }\n  .sticky-md-bottom {\n    position: -webkit-sticky;\n    position: sticky;\n    bottom: 0;\n    z-index: 1020;\n  }\n}\n@media (min-width: 992px) {\n  .sticky-lg-top {\n    position: -webkit-sticky;\n    position: sticky;\n    top: 0;\n    z-index: 1020;\n  }\n  .sticky-lg-bottom {\n    position: -webkit-sticky;\n    position: sticky;\n    bottom: 0;\n    z-index: 1020;\n  }\n}\n@media (min-width: 1200px) {\n  .sticky-xl-top {\n    position: -webkit-sticky;\n    position: sticky;\n    top: 0;\n    z-index: 1020;\n  }\n  .sticky-xl-bottom {\n    position: -webkit-sticky;\n    position: sticky;\n    bottom: 0;\n    z-index: 1020;\n  }\n}\n@media (min-width: 1400px) {\n  .sticky-xxl-top {\n    position: -webkit-sticky;\n    position: sticky;\n    top: 0;\n    z-index: 1020;\n  }\n  .sticky-xxl-bottom {\n    position: -webkit-sticky;\n    position: sticky;\n    bottom: 0;\n    z-index: 1020;\n  }\n}\n.hstack {\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  align-self: stretch;\n}\n\n.vstack {\n  display: flex;\n  flex: 1 1 auto;\n  flex-direction: column;\n  align-self: stretch;\n}\n\n.visually-hidden,\n.visually-hidden-focusable:not(:focus):not(:focus-within) {\n  width: 1px !important;\n  height: 1px !important;\n  padding: 0 !important;\n  margin: -1px !important;\n  overflow: hidden !important;\n  clip: rect(0, 0, 0, 0) !important;\n  white-space: nowrap !important;\n  border: 0 !important;\n}\n.visually-hidden:not(caption),\n.visually-hidden-focusable:not(:focus):not(:focus-within):not(caption) {\n  position: absolute !important;\n}\n.visually-hidden *,\n.visually-hidden-focusable:not(:focus):not(:focus-within) * {\n  overflow: hidden !important;\n}\n\n.stretched-link::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1;\n  content: \"\";\n}\n\n.text-truncate {\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n\n.vr {\n  display: inline-block;\n  align-self: stretch;\n  width: var(--bs-border-width);\n  min-height: 1em;\n  background-color: currentcolor;\n  opacity: 0.25;\n}\n\n.align-baseline {\n  vertical-align: baseline !important;\n}\n\n.align-top {\n  vertical-align: top !important;\n}\n\n.align-middle {\n  vertical-align: middle !important;\n}\n\n.align-bottom {\n  vertical-align: bottom !important;\n}\n\n.align-text-bottom {\n  vertical-align: text-bottom !important;\n}\n\n.align-text-top {\n  vertical-align: text-top !important;\n}\n\n.float-start {\n  float: left !important;\n}\n\n.float-end {\n  float: right !important;\n}\n\n.float-none {\n  float: none !important;\n}\n\n.object-fit-contain {\n  -o-object-fit: contain !important;\n  object-fit: contain !important;\n}\n\n.object-fit-cover {\n  -o-object-fit: cover !important;\n  object-fit: cover !important;\n}\n\n.object-fit-fill {\n  -o-object-fit: fill !important;\n  object-fit: fill !important;\n}\n\n.object-fit-scale {\n  -o-object-fit: scale-down !important;\n  object-fit: scale-down !important;\n}\n\n.object-fit-none {\n  -o-object-fit: none !important;\n  object-fit: none !important;\n}\n\n.opacity-0 {\n  opacity: 0 !important;\n}\n\n.opacity-25 {\n  opacity: 0.25 !important;\n}\n\n.opacity-50 {\n  opacity: 0.5 !important;\n}\n\n.opacity-75 {\n  opacity: 0.75 !important;\n}\n\n.opacity-100 {\n  opacity: 1 !important;\n}\n\n.overflow-auto {\n  overflow: auto !important;\n}\n\n.overflow-hidden {\n  overflow: hidden !important;\n}\n\n.overflow-visible {\n  overflow: visible !important;\n}\n\n.overflow-scroll {\n  overflow: scroll !important;\n}\n\n.overflow-x-auto {\n  overflow-x: auto !important;\n}\n\n.overflow-x-hidden {\n  overflow-x: hidden !important;\n}\n\n.overflow-x-visible {\n  overflow-x: visible !important;\n}\n\n.overflow-x-scroll {\n  overflow-x: scroll !important;\n}\n\n.overflow-y-auto {\n  overflow-y: auto !important;\n}\n\n.overflow-y-hidden {\n  overflow-y: hidden !important;\n}\n\n.overflow-y-visible {\n  overflow-y: visible !important;\n}\n\n.overflow-y-scroll {\n  overflow-y: scroll !important;\n}\n\n.d-inline {\n  display: inline !important;\n}\n\n.d-inline-block {\n  display: inline-block !important;\n}\n\n.d-block {\n  display: block !important;\n}\n\n.d-grid {\n  display: grid !important;\n}\n\n.d-inline-grid {\n  display: inline-grid !important;\n}\n\n.d-table {\n  display: table !important;\n}\n\n.d-table-row {\n  display: table-row !important;\n}\n\n.d-table-cell {\n  display: table-cell !important;\n}\n\n.d-flex {\n  display: flex !important;\n}\n\n.d-inline-flex {\n  display: inline-flex !important;\n}\n\n.d-none {\n  display: none !important;\n}\n\n.shadow {\n  box-shadow: var(--bs-box-shadow) !important;\n}\n\n.shadow-sm {\n  box-shadow: var(--bs-box-shadow-sm) !important;\n}\n\n.shadow-lg {\n  box-shadow: var(--bs-box-shadow-lg) !important;\n}\n\n.shadow-none {\n  box-shadow: none !important;\n}\n\n.focus-ring-primary {\n  --bs-focus-ring-color: rgba(var(--bs-primary-rgb), var(--bs-focus-ring-opacity));\n}\n\n.focus-ring-secondary {\n  --bs-focus-ring-color: rgba(var(--bs-secondary-rgb), var(--bs-focus-ring-opacity));\n}\n\n.focus-ring-success {\n  --bs-focus-ring-color: rgba(var(--bs-success-rgb), var(--bs-focus-ring-opacity));\n}\n\n.focus-ring-info {\n  --bs-focus-ring-color: rgba(var(--bs-info-rgb), var(--bs-focus-ring-opacity));\n}\n\n.focus-ring-warning {\n  --bs-focus-ring-color: rgba(var(--bs-warning-rgb), var(--bs-focus-ring-opacity));\n}\n\n.focus-ring-danger {\n  --bs-focus-ring-color: rgba(var(--bs-danger-rgb), var(--bs-focus-ring-opacity));\n}\n\n.focus-ring-light {\n  --bs-focus-ring-color: rgba(var(--bs-light-rgb), var(--bs-focus-ring-opacity));\n}\n\n.focus-ring-dark {\n  --bs-focus-ring-color: rgba(var(--bs-dark-rgb), var(--bs-focus-ring-opacity));\n}\n\n.position-static {\n  position: static !important;\n}\n\n.position-relative {\n  position: relative !important;\n}\n\n.position-absolute {\n  position: absolute !important;\n}\n\n.position-fixed {\n  position: fixed !important;\n}\n\n.position-sticky {\n  position: -webkit-sticky !important;\n  position: sticky !important;\n}\n\n.top-0 {\n  top: 0 !important;\n}\n\n.top-50 {\n  top: 50% !important;\n}\n\n.top-100 {\n  top: 100% !important;\n}\n\n.bottom-0 {\n  bottom: 0 !important;\n}\n\n.bottom-50 {\n  bottom: 50% !important;\n}\n\n.bottom-100 {\n  bottom: 100% !important;\n}\n\n.start-0 {\n  left: 0 !important;\n}\n\n.start-50 {\n  left: 50% !important;\n}\n\n.start-100 {\n  left: 100% !important;\n}\n\n.end-0 {\n  right: 0 !important;\n}\n\n.end-50 {\n  right: 50% !important;\n}\n\n.end-100 {\n  right: 100% !important;\n}\n\n.translate-middle {\n  transform: translate(-50%, -50%) !important;\n}\n\n.translate-middle-x {\n  transform: translateX(-50%) !important;\n}\n\n.translate-middle-y {\n  transform: translateY(-50%) !important;\n}\n\n.border {\n  border: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important;\n}\n\n.border-0 {\n  border: 0 !important;\n}\n\n.border-top {\n  border-top: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important;\n}\n\n.border-top-0 {\n  border-top: 0 !important;\n}\n\n.border-end {\n  border-right: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important;\n}\n\n.border-end-0 {\n  border-right: 0 !important;\n}\n\n.border-bottom {\n  border-bottom: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important;\n}\n\n.border-bottom-0 {\n  border-bottom: 0 !important;\n}\n\n.border-start {\n  border-left: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important;\n}\n\n.border-start-0 {\n  border-left: 0 !important;\n}\n\n.border-primary {\n  --bs-border-opacity: 1;\n  border-color: rgba(var(--bs-primary-rgb), var(--bs-border-opacity)) !important;\n}\n\n.border-secondary {\n  --bs-border-opacity: 1;\n  border-color: rgba(var(--bs-secondary-rgb), var(--bs-border-opacity)) !important;\n}\n\n.border-success {\n  --bs-border-opacity: 1;\n  border-color: rgba(var(--bs-success-rgb), var(--bs-border-opacity)) !important;\n}\n\n.border-info {\n  --bs-border-opacity: 1;\n  border-color: rgba(var(--bs-info-rgb), var(--bs-border-opacity)) !important;\n}\n\n.border-warning {\n  --bs-border-opacity: 1;\n  border-color: rgba(var(--bs-warning-rgb), var(--bs-border-opacity)) !important;\n}\n\n.border-danger {\n  --bs-border-opacity: 1;\n  border-color: rgba(var(--bs-danger-rgb), var(--bs-border-opacity)) !important;\n}\n\n.border-light {\n  --bs-border-opacity: 1;\n  border-color: rgba(var(--bs-light-rgb), var(--bs-border-opacity)) !important;\n}\n\n.border-dark {\n  --bs-border-opacity: 1;\n  border-color: rgba(var(--bs-dark-rgb), var(--bs-border-opacity)) !important;\n}\n\n.border-black {\n  --bs-border-opacity: 1;\n  border-color: rgba(var(--bs-black-rgb), var(--bs-border-opacity)) !important;\n}\n\n.border-white {\n  --bs-border-opacity: 1;\n  border-color: rgba(var(--bs-white-rgb), var(--bs-border-opacity)) !important;\n}\n\n.border-primary-subtle {\n  border-color: var(--bs-primary-border-subtle) !important;\n}\n\n.border-secondary-subtle {\n  border-color: var(--bs-secondary-border-subtle) !important;\n}\n\n.border-success-subtle {\n  border-color: var(--bs-success-border-subtle) !important;\n}\n\n.border-info-subtle {\n  border-color: var(--bs-info-border-subtle) !important;\n}\n\n.border-warning-subtle {\n  border-color: var(--bs-warning-border-subtle) !important;\n}\n\n.border-danger-subtle {\n  border-color: var(--bs-danger-border-subtle) !important;\n}\n\n.border-light-subtle {\n  border-color: var(--bs-light-border-subtle) !important;\n}\n\n.border-dark-subtle {\n  border-color: var(--bs-dark-border-subtle) !important;\n}\n\n.border-1 {\n  border-width: 1px !important;\n}\n\n.border-2 {\n  border-width: 2px !important;\n}\n\n.border-3 {\n  border-width: 3px !important;\n}\n\n.border-4 {\n  border-width: 4px !important;\n}\n\n.border-5 {\n  border-width: 5px !important;\n}\n\n.border-opacity-10 {\n  --bs-border-opacity: 0.1;\n}\n\n.border-opacity-25 {\n  --bs-border-opacity: 0.25;\n}\n\n.border-opacity-50 {\n  --bs-border-opacity: 0.5;\n}\n\n.border-opacity-75 {\n  --bs-border-opacity: 0.75;\n}\n\n.border-opacity-100 {\n  --bs-border-opacity: 1;\n}\n\n.w-25 {\n  width: 25% !important;\n}\n\n.w-50 {\n  width: 50% !important;\n}\n\n.w-75 {\n  width: 75% !important;\n}\n\n.w-100 {\n  width: 100% !important;\n}\n\n.w-auto {\n  width: auto !important;\n}\n\n.mw-100 {\n  max-width: 100% !important;\n}\n\n.vw-100 {\n  width: 100vw !important;\n}\n\n.min-vw-100 {\n  min-width: 100vw !important;\n}\n\n.h-25 {\n  height: 25% !important;\n}\n\n.h-50 {\n  height: 50% !important;\n}\n\n.h-75 {\n  height: 75% !important;\n}\n\n.h-100 {\n  height: 100% !important;\n}\n\n.h-auto {\n  height: auto !important;\n}\n\n.mh-100 {\n  max-height: 100% !important;\n}\n\n.vh-100 {\n  height: 100vh !important;\n}\n\n.min-vh-100 {\n  min-height: 100vh !important;\n}\n\n.flex-fill {\n  flex: 1 1 auto !important;\n}\n\n.flex-row {\n  flex-direction: row !important;\n}\n\n.flex-column {\n  flex-direction: column !important;\n}\n\n.flex-row-reverse {\n  flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n  flex-direction: column-reverse !important;\n}\n\n.flex-grow-0 {\n  flex-grow: 0 !important;\n}\n\n.flex-grow-1 {\n  flex-grow: 1 !important;\n}\n\n.flex-shrink-0 {\n  flex-shrink: 0 !important;\n}\n\n.flex-shrink-1 {\n  flex-shrink: 1 !important;\n}\n\n.flex-wrap {\n  flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n  flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n  flex-wrap: wrap-reverse !important;\n}\n\n.justify-content-start {\n  justify-content: flex-start !important;\n}\n\n.justify-content-end {\n  justify-content: flex-end !important;\n}\n\n.justify-content-center {\n  justify-content: center !important;\n}\n\n.justify-content-between {\n  justify-content: space-between !important;\n}\n\n.justify-content-around {\n  justify-content: space-around !important;\n}\n\n.justify-content-evenly {\n  justify-content: space-evenly !important;\n}\n\n.align-items-start {\n  align-items: flex-start !important;\n}\n\n.align-items-end {\n  align-items: flex-end !important;\n}\n\n.align-items-center {\n  align-items: center !important;\n}\n\n.align-items-baseline {\n  align-items: baseline !important;\n}\n\n.align-items-stretch {\n  align-items: stretch !important;\n}\n\n.align-content-start {\n  align-content: flex-start !important;\n}\n\n.align-content-end {\n  align-content: flex-end !important;\n}\n\n.align-content-center {\n  align-content: center !important;\n}\n\n.align-content-between {\n  align-content: space-between !important;\n}\n\n.align-content-around {\n  align-content: space-around !important;\n}\n\n.align-content-stretch {\n  align-content: stretch !important;\n}\n\n.align-self-auto {\n  align-self: auto !important;\n}\n\n.align-self-start {\n  align-self: flex-start !important;\n}\n\n.align-self-end {\n  align-self: flex-end !important;\n}\n\n.align-self-center {\n  align-self: center !important;\n}\n\n.align-self-baseline {\n  align-self: baseline !important;\n}\n\n.align-self-stretch {\n  align-self: stretch !important;\n}\n\n.order-first {\n  order: -1 !important;\n}\n\n.order-0 {\n  order: 0 !important;\n}\n\n.order-1 {\n  order: 1 !important;\n}\n\n.order-2 {\n  order: 2 !important;\n}\n\n.order-3 {\n  order: 3 !important;\n}\n\n.order-4 {\n  order: 4 !important;\n}\n\n.order-5 {\n  order: 5 !important;\n}\n\n.order-last {\n  order: 6 !important;\n}\n\n.m-0 {\n  margin: 0 !important;\n}\n\n.m-1 {\n  margin: 0.25rem !important;\n}\n\n.m-2 {\n  margin: 0.5rem !important;\n}\n\n.m-3 {\n  margin: 1rem !important;\n}\n\n.m-4 {\n  margin: 1.5rem !important;\n}\n\n.m-5 {\n  margin: 3rem !important;\n}\n\n.m-auto {\n  margin: auto !important;\n}\n\n.mx-0 {\n  margin-right: 0 !important;\n  margin-left: 0 !important;\n}\n\n.mx-1 {\n  margin-right: 0.25rem !important;\n  margin-left: 0.25rem !important;\n}\n\n.mx-2 {\n  margin-right: 0.5rem !important;\n  margin-left: 0.5rem !important;\n}\n\n.mx-3 {\n  margin-right: 1rem !important;\n  margin-left: 1rem !important;\n}\n\n.mx-4 {\n  margin-right: 1.5rem !important;\n  margin-left: 1.5rem !important;\n}\n\n.mx-5 {\n  margin-right: 3rem !important;\n  margin-left: 3rem !important;\n}\n\n.mx-auto {\n  margin-right: auto !important;\n  margin-left: auto !important;\n}\n\n.my-0 {\n  margin-top: 0 !important;\n  margin-bottom: 0 !important;\n}\n\n.my-1 {\n  margin-top: 0.25rem !important;\n  margin-bottom: 0.25rem !important;\n}\n\n.my-2 {\n  margin-top: 0.5rem !important;\n  margin-bottom: 0.5rem !important;\n}\n\n.my-3 {\n  margin-top: 1rem !important;\n  margin-bottom: 1rem !important;\n}\n\n.my-4 {\n  margin-top: 1.5rem !important;\n  margin-bottom: 1.5rem !important;\n}\n\n.my-5 {\n  margin-top: 3rem !important;\n  margin-bottom: 3rem !important;\n}\n\n.my-auto {\n  margin-top: auto !important;\n  margin-bottom: auto !important;\n}\n\n.mt-0 {\n  margin-top: 0 !important;\n}\n\n.mt-1 {\n  margin-top: 0.25rem !important;\n}\n\n.mt-2 {\n  margin-top: 0.5rem !important;\n}\n\n.mt-3 {\n  margin-top: 1rem !important;\n}\n\n.mt-4 {\n  margin-top: 1.5rem !important;\n}\n\n.mt-5 {\n  margin-top: 3rem !important;\n}\n\n.mt-auto {\n  margin-top: auto !important;\n}\n\n.me-0 {\n  margin-right: 0 !important;\n}\n\n.me-1 {\n  margin-right: 0.25rem !important;\n}\n\n.me-2 {\n  margin-right: 0.5rem !important;\n}\n\n.me-3 {\n  margin-right: 1rem !important;\n}\n\n.me-4 {\n  margin-right: 1.5rem !important;\n}\n\n.me-5 {\n  margin-right: 3rem !important;\n}\n\n.me-auto {\n  margin-right: auto !important;\n}\n\n.mb-0 {\n  margin-bottom: 0 !important;\n}\n\n.mb-1 {\n  margin-bottom: 0.25rem !important;\n}\n\n.mb-2 {\n  margin-bottom: 0.5rem !important;\n}\n\n.mb-3 {\n  margin-bottom: 1rem !important;\n}\n\n.mb-4 {\n  margin-bottom: 1.5rem !important;\n}\n\n.mb-5 {\n  margin-bottom: 3rem !important;\n}\n\n.mb-auto {\n  margin-bottom: auto !important;\n}\n\n.ms-0 {\n  margin-left: 0 !important;\n}\n\n.ms-1 {\n  margin-left: 0.25rem !important;\n}\n\n.ms-2 {\n  margin-left: 0.5rem !important;\n}\n\n.ms-3 {\n  margin-left: 1rem !important;\n}\n\n.ms-4 {\n  margin-left: 1.5rem !important;\n}\n\n.ms-5 {\n  margin-left: 3rem !important;\n}\n\n.ms-auto {\n  margin-left: auto !important;\n}\n\n.p-0 {\n  padding: 0 !important;\n}\n\n.p-1 {\n  padding: 0.25rem !important;\n}\n\n.p-2 {\n  padding: 0.5rem !important;\n}\n\n.p-3 {\n  padding: 1rem !important;\n}\n\n.p-4 {\n  padding: 1.5rem !important;\n}\n\n.p-5 {\n  padding: 3rem !important;\n}\n\n.px-0 {\n  padding-right: 0 !important;\n  padding-left: 0 !important;\n}\n\n.px-1 {\n  padding-right: 0.25rem !important;\n  padding-left: 0.25rem !important;\n}\n\n.px-2 {\n  padding-right: 0.5rem !important;\n  padding-left: 0.5rem !important;\n}\n\n.px-3 {\n  padding-right: 1rem !important;\n  padding-left: 1rem !important;\n}\n\n.px-4 {\n  padding-right: 1.5rem !important;\n  padding-left: 1.5rem !important;\n}\n\n.px-5 {\n  padding-right: 3rem !important;\n  padding-left: 3rem !important;\n}\n\n.py-0 {\n  padding-top: 0 !important;\n  padding-bottom: 0 !important;\n}\n\n.py-1 {\n  padding-top: 0.25rem !important;\n  padding-bottom: 0.25rem !important;\n}\n\n.py-2 {\n  padding-top: 0.5rem !important;\n  padding-bottom: 0.5rem !important;\n}\n\n.py-3 {\n  padding-top: 1rem !important;\n  padding-bottom: 1rem !important;\n}\n\n.py-4 {\n  padding-top: 1.5rem !important;\n  padding-bottom: 1.5rem !important;\n}\n\n.py-5 {\n  padding-top: 3rem !important;\n  padding-bottom: 3rem !important;\n}\n\n.pt-0 {\n  padding-top: 0 !important;\n}\n\n.pt-1 {\n  padding-top: 0.25rem !important;\n}\n\n.pt-2 {\n  padding-top: 0.5rem !important;\n}\n\n.pt-3 {\n  padding-top: 1rem !important;\n}\n\n.pt-4 {\n  padding-top: 1.5rem !important;\n}\n\n.pt-5 {\n  padding-top: 3rem !important;\n}\n\n.pe-0 {\n  padding-right: 0 !important;\n}\n\n.pe-1 {\n  padding-right: 0.25rem !important;\n}\n\n.pe-2 {\n  padding-right: 0.5rem !important;\n}\n\n.pe-3 {\n  padding-right: 1rem !important;\n}\n\n.pe-4 {\n  padding-right: 1.5rem !important;\n}\n\n.pe-5 {\n  padding-right: 3rem !important;\n}\n\n.pb-0 {\n  padding-bottom: 0 !important;\n}\n\n.pb-1 {\n  padding-bottom: 0.25rem !important;\n}\n\n.pb-2 {\n  padding-bottom: 0.5rem !important;\n}\n\n.pb-3 {\n  padding-bottom: 1rem !important;\n}\n\n.pb-4 {\n  padding-bottom: 1.5rem !important;\n}\n\n.pb-5 {\n  padding-bottom: 3rem !important;\n}\n\n.ps-0 {\n  padding-left: 0 !important;\n}\n\n.ps-1 {\n  padding-left: 0.25rem !important;\n}\n\n.ps-2 {\n  padding-left: 0.5rem !important;\n}\n\n.ps-3 {\n  padding-left: 1rem !important;\n}\n\n.ps-4 {\n  padding-left: 1.5rem !important;\n}\n\n.ps-5 {\n  padding-left: 3rem !important;\n}\n\n.gap-0 {\n  gap: 0 !important;\n}\n\n.gap-1 {\n  gap: 0.25rem !important;\n}\n\n.gap-2 {\n  gap: 0.5rem !important;\n}\n\n.gap-3 {\n  gap: 1rem !important;\n}\n\n.gap-4 {\n  gap: 1.5rem !important;\n}\n\n.gap-5 {\n  gap: 3rem !important;\n}\n\n.row-gap-0 {\n  row-gap: 0 !important;\n}\n\n.row-gap-1 {\n  row-gap: 0.25rem !important;\n}\n\n.row-gap-2 {\n  row-gap: 0.5rem !important;\n}\n\n.row-gap-3 {\n  row-gap: 1rem !important;\n}\n\n.row-gap-4 {\n  row-gap: 1.5rem !important;\n}\n\n.row-gap-5 {\n  row-gap: 3rem !important;\n}\n\n.column-gap-0 {\n  -moz-column-gap: 0 !important;\n  column-gap: 0 !important;\n}\n\n.column-gap-1 {\n  -moz-column-gap: 0.25rem !important;\n  column-gap: 0.25rem !important;\n}\n\n.column-gap-2 {\n  -moz-column-gap: 0.5rem !important;\n  column-gap: 0.5rem !important;\n}\n\n.column-gap-3 {\n  -moz-column-gap: 1rem !important;\n  column-gap: 1rem !important;\n}\n\n.column-gap-4 {\n  -moz-column-gap: 1.5rem !important;\n  column-gap: 1.5rem !important;\n}\n\n.column-gap-5 {\n  -moz-column-gap: 3rem !important;\n  column-gap: 3rem !important;\n}\n\n.font-monospace {\n  font-family: var(--bs-font-monospace) !important;\n}\n\n.fs-1 {\n  font-size: calc(1.375rem + 1.5vw) !important;\n}\n\n.fs-2 {\n  font-size: calc(1.325rem + 0.9vw) !important;\n}\n\n.fs-3 {\n  font-size: calc(1.3rem + 0.6vw) !important;\n}\n\n.fs-4 {\n  font-size: calc(1.275rem + 0.3vw) !important;\n}\n\n.fs-5 {\n  font-size: 1.25rem !important;\n}\n\n.fs-6 {\n  font-size: 1rem !important;\n}\n\n.fst-italic {\n  font-style: italic !important;\n}\n\n.fst-normal {\n  font-style: normal !important;\n}\n\n.fw-lighter {\n  font-weight: lighter !important;\n}\n\n.fw-light {\n  font-weight: 300 !important;\n}\n\n.fw-normal {\n  font-weight: 400 !important;\n}\n\n.fw-medium {\n  font-weight: 500 !important;\n}\n\n.fw-semibold {\n  font-weight: 600 !important;\n}\n\n.fw-bold {\n  font-weight: 700 !important;\n}\n\n.fw-bolder {\n  font-weight: bolder !important;\n}\n\n.lh-1 {\n  line-height: 1 !important;\n}\n\n.lh-sm {\n  line-height: 1.25 !important;\n}\n\n.lh-base {\n  line-height: 1.5 !important;\n}\n\n.lh-lg {\n  line-height: 2 !important;\n}\n\n.text-start {\n  text-align: left !important;\n}\n\n.text-end {\n  text-align: right !important;\n}\n\n.text-center {\n  text-align: center !important;\n}\n\n.text-decoration-none {\n  text-decoration: none !important;\n}\n\n.text-decoration-underline {\n  text-decoration: underline !important;\n}\n\n.text-decoration-line-through {\n  text-decoration: line-through !important;\n}\n\n.text-lowercase {\n  text-transform: lowercase !important;\n}\n\n.text-uppercase {\n  text-transform: uppercase !important;\n}\n\n.text-capitalize {\n  text-transform: capitalize !important;\n}\n\n.text-wrap {\n  white-space: normal !important;\n}\n\n.text-nowrap {\n  white-space: nowrap !important;\n}\n\n/* rtl:begin:remove */\n.text-break {\n  word-wrap: break-word !important;\n  word-break: break-word !important;\n}\n\n/* rtl:end:remove */\n.text-primary {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-primary-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-secondary {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-secondary-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-success {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-success-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-info {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-info-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-warning {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-warning-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-danger {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-danger-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-light {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-light-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-dark {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-dark-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-black {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-black-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-white {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-white-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-body {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-body-color-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-muted {\n  --bs-text-opacity: 1;\n  color: var(--bs-secondary-color) !important;\n}\n\n.text-black-50 {\n  --bs-text-opacity: 1;\n  color: rgba(0, 0, 0, 0.5) !important;\n}\n\n.text-white-50 {\n  --bs-text-opacity: 1;\n  color: rgba(255, 255, 255, 0.5) !important;\n}\n\n.text-body-secondary {\n  --bs-text-opacity: 1;\n  color: var(--bs-secondary-color) !important;\n}\n\n.text-body-tertiary {\n  --bs-text-opacity: 1;\n  color: var(--bs-tertiary-color) !important;\n}\n\n.text-body-emphasis {\n  --bs-text-opacity: 1;\n  color: var(--bs-emphasis-color) !important;\n}\n\n.text-reset {\n  --bs-text-opacity: 1;\n  color: inherit !important;\n}\n\n.text-opacity-25 {\n  --bs-text-opacity: 0.25;\n}\n\n.text-opacity-50 {\n  --bs-text-opacity: 0.5;\n}\n\n.text-opacity-75 {\n  --bs-text-opacity: 0.75;\n}\n\n.text-opacity-100 {\n  --bs-text-opacity: 1;\n}\n\n.text-primary-emphasis {\n  color: var(--bs-primary-text-emphasis) !important;\n}\n\n.text-secondary-emphasis {\n  color: var(--bs-secondary-text-emphasis) !important;\n}\n\n.text-success-emphasis {\n  color: var(--bs-success-text-emphasis) !important;\n}\n\n.text-info-emphasis {\n  color: var(--bs-info-text-emphasis) !important;\n}\n\n.text-warning-emphasis {\n  color: var(--bs-warning-text-emphasis) !important;\n}\n\n.text-danger-emphasis {\n  color: var(--bs-danger-text-emphasis) !important;\n}\n\n.text-light-emphasis {\n  color: var(--bs-light-text-emphasis) !important;\n}\n\n.text-dark-emphasis {\n  color: var(--bs-dark-text-emphasis) !important;\n}\n\n.link-opacity-10 {\n  --bs-link-opacity: 0.1;\n}\n\n.link-opacity-10-hover:hover {\n  --bs-link-opacity: 0.1;\n}\n\n.link-opacity-25 {\n  --bs-link-opacity: 0.25;\n}\n\n.link-opacity-25-hover:hover {\n  --bs-link-opacity: 0.25;\n}\n\n.link-opacity-50 {\n  --bs-link-opacity: 0.5;\n}\n\n.link-opacity-50-hover:hover {\n  --bs-link-opacity: 0.5;\n}\n\n.link-opacity-75 {\n  --bs-link-opacity: 0.75;\n}\n\n.link-opacity-75-hover:hover {\n  --bs-link-opacity: 0.75;\n}\n\n.link-opacity-100 {\n  --bs-link-opacity: 1;\n}\n\n.link-opacity-100-hover:hover {\n  --bs-link-opacity: 1;\n}\n\n.link-offset-1 {\n  text-underline-offset: 0.125em !important;\n}\n\n.link-offset-1-hover:hover {\n  text-underline-offset: 0.125em !important;\n}\n\n.link-offset-2 {\n  text-underline-offset: 0.25em !important;\n}\n\n.link-offset-2-hover:hover {\n  text-underline-offset: 0.25em !important;\n}\n\n.link-offset-3 {\n  text-underline-offset: 0.375em !important;\n}\n\n.link-offset-3-hover:hover {\n  text-underline-offset: 0.375em !important;\n}\n\n.link-underline-primary {\n  --bs-link-underline-opacity: 1;\n  -webkit-text-decoration-color: rgba(var(--bs-primary-rgb), var(--bs-link-underline-opacity)) !important;\n  text-decoration-color: rgba(var(--bs-primary-rgb), var(--bs-link-underline-opacity)) !important;\n}\n\n.link-underline-secondary {\n  --bs-link-underline-opacity: 1;\n  -webkit-text-decoration-color: rgba(var(--bs-secondary-rgb), var(--bs-link-underline-opacity)) !important;\n  text-decoration-color: rgba(var(--bs-secondary-rgb), var(--bs-link-underline-opacity)) !important;\n}\n\n.link-underline-success {\n  --bs-link-underline-opacity: 1;\n  -webkit-text-decoration-color: rgba(var(--bs-success-rgb), var(--bs-link-underline-opacity)) !important;\n  text-decoration-color: rgba(var(--bs-success-rgb), var(--bs-link-underline-opacity)) !important;\n}\n\n.link-underline-info {\n  --bs-link-underline-opacity: 1;\n  -webkit-text-decoration-color: rgba(var(--bs-info-rgb), var(--bs-link-underline-opacity)) !important;\n  text-decoration-color: rgba(var(--bs-info-rgb), var(--bs-link-underline-opacity)) !important;\n}\n\n.link-underline-warning {\n  --bs-link-underline-opacity: 1;\n  -webkit-text-decoration-color: rgba(var(--bs-warning-rgb), var(--bs-link-underline-opacity)) !important;\n  text-decoration-color: rgba(var(--bs-warning-rgb), var(--bs-link-underline-opacity)) !important;\n}\n\n.link-underline-danger {\n  --bs-link-underline-opacity: 1;\n  -webkit-text-decoration-color: rgba(var(--bs-danger-rgb), var(--bs-link-underline-opacity)) !important;\n  text-decoration-color: rgba(var(--bs-danger-rgb), var(--bs-link-underline-opacity)) !important;\n}\n\n.link-underline-light {\n  --bs-link-underline-opacity: 1;\n  -webkit-text-decoration-color: rgba(var(--bs-light-rgb), var(--bs-link-underline-opacity)) !important;\n  text-decoration-color: rgba(var(--bs-light-rgb), var(--bs-link-underline-opacity)) !important;\n}\n\n.link-underline-dark {\n  --bs-link-underline-opacity: 1;\n  -webkit-text-decoration-color: rgba(var(--bs-dark-rgb), var(--bs-link-underline-opacity)) !important;\n  text-decoration-color: rgba(var(--bs-dark-rgb), var(--bs-link-underline-opacity)) !important;\n}\n\n.link-underline {\n  --bs-link-underline-opacity: 1;\n  -webkit-text-decoration-color: rgba(var(--bs-link-color-rgb), var(--bs-link-underline-opacity, 1)) !important;\n  text-decoration-color: rgba(var(--bs-link-color-rgb), var(--bs-link-underline-opacity, 1)) !important;\n}\n\n.link-underline-opacity-0 {\n  --bs-link-underline-opacity: 0;\n}\n\n.link-underline-opacity-0-hover:hover {\n  --bs-link-underline-opacity: 0;\n}\n\n.link-underline-opacity-10 {\n  --bs-link-underline-opacity: 0.1;\n}\n\n.link-underline-opacity-10-hover:hover {\n  --bs-link-underline-opacity: 0.1;\n}\n\n.link-underline-opacity-25 {\n  --bs-link-underline-opacity: 0.25;\n}\n\n.link-underline-opacity-25-hover:hover {\n  --bs-link-underline-opacity: 0.25;\n}\n\n.link-underline-opacity-50 {\n  --bs-link-underline-opacity: 0.5;\n}\n\n.link-underline-opacity-50-hover:hover {\n  --bs-link-underline-opacity: 0.5;\n}\n\n.link-underline-opacity-75 {\n  --bs-link-underline-opacity: 0.75;\n}\n\n.link-underline-opacity-75-hover:hover {\n  --bs-link-underline-opacity: 0.75;\n}\n\n.link-underline-opacity-100 {\n  --bs-link-underline-opacity: 1;\n}\n\n.link-underline-opacity-100-hover:hover {\n  --bs-link-underline-opacity: 1;\n}\n\n.bg-primary {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-primary-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-secondary {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-secondary-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-success {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-success-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-info {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-info-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-warning {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-warning-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-danger {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-danger-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-light {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-light-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-dark {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-dark-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-black {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-black-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-white {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-white-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-body {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-body-bg-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-transparent {\n  --bs-bg-opacity: 1;\n  background-color: transparent !important;\n}\n\n.bg-body-secondary {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-secondary-bg-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-body-tertiary {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-tertiary-bg-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-opacity-10 {\n  --bs-bg-opacity: 0.1;\n}\n\n.bg-opacity-25 {\n  --bs-bg-opacity: 0.25;\n}\n\n.bg-opacity-50 {\n  --bs-bg-opacity: 0.5;\n}\n\n.bg-opacity-75 {\n  --bs-bg-opacity: 0.75;\n}\n\n.bg-opacity-100 {\n  --bs-bg-opacity: 1;\n}\n\n.bg-primary-subtle {\n  background-color: var(--bs-primary-bg-subtle) !important;\n}\n\n.bg-secondary-subtle {\n  background-color: var(--bs-secondary-bg-subtle) !important;\n}\n\n.bg-success-subtle {\n  background-color: var(--bs-success-bg-subtle) !important;\n}\n\n.bg-info-subtle {\n  background-color: var(--bs-info-bg-subtle) !important;\n}\n\n.bg-warning-subtle {\n  background-color: var(--bs-warning-bg-subtle) !important;\n}\n\n.bg-danger-subtle {\n  background-color: var(--bs-danger-bg-subtle) !important;\n}\n\n.bg-light-subtle {\n  background-color: var(--bs-light-bg-subtle) !important;\n}\n\n.bg-dark-subtle {\n  background-color: var(--bs-dark-bg-subtle) !important;\n}\n\n.bg-gradient {\n  background-image: var(--bs-gradient) !important;\n}\n\n.user-select-all {\n  -webkit-user-select: all !important;\n  -moz-user-select: all !important;\n  user-select: all !important;\n}\n\n.user-select-auto {\n  -webkit-user-select: auto !important;\n  -moz-user-select: auto !important;\n  user-select: auto !important;\n}\n\n.user-select-none {\n  -webkit-user-select: none !important;\n  -moz-user-select: none !important;\n  user-select: none !important;\n}\n\n.pe-none {\n  pointer-events: none !important;\n}\n\n.pe-auto {\n  pointer-events: auto !important;\n}\n\n.rounded {\n  border-radius: var(--bs-border-radius) !important;\n}\n\n.rounded-0 {\n  border-radius: 0 !important;\n}\n\n.rounded-1 {\n  border-radius: var(--bs-border-radius-sm) !important;\n}\n\n.rounded-2 {\n  border-radius: var(--bs-border-radius) !important;\n}\n\n.rounded-3 {\n  border-radius: var(--bs-border-radius-lg) !important;\n}\n\n.rounded-4 {\n  border-radius: var(--bs-border-radius-xl) !important;\n}\n\n.rounded-5 {\n  border-radius: var(--bs-border-radius-xxl) !important;\n}\n\n.rounded-circle {\n  border-radius: 50% !important;\n}\n\n.rounded-pill {\n  border-radius: var(--bs-border-radius-pill) !important;\n}\n\n.rounded-top {\n  border-top-left-radius: var(--bs-border-radius) !important;\n  border-top-right-radius: var(--bs-border-radius) !important;\n}\n\n.rounded-top-0 {\n  border-top-left-radius: 0 !important;\n  border-top-right-radius: 0 !important;\n}\n\n.rounded-top-1 {\n  border-top-left-radius: var(--bs-border-radius-sm) !important;\n  border-top-right-radius: var(--bs-border-radius-sm) !important;\n}\n\n.rounded-top-2 {\n  border-top-left-radius: var(--bs-border-radius) !important;\n  border-top-right-radius: var(--bs-border-radius) !important;\n}\n\n.rounded-top-3 {\n  border-top-left-radius: var(--bs-border-radius-lg) !important;\n  border-top-right-radius: var(--bs-border-radius-lg) !important;\n}\n\n.rounded-top-4 {\n  border-top-left-radius: var(--bs-border-radius-xl) !important;\n  border-top-right-radius: var(--bs-border-radius-xl) !important;\n}\n\n.rounded-top-5 {\n  border-top-left-radius: var(--bs-border-radius-xxl) !important;\n  border-top-right-radius: var(--bs-border-radius-xxl) !important;\n}\n\n.rounded-top-circle {\n  border-top-left-radius: 50% !important;\n  border-top-right-radius: 50% !important;\n}\n\n.rounded-top-pill {\n  border-top-left-radius: var(--bs-border-radius-pill) !important;\n  border-top-right-radius: var(--bs-border-radius-pill) !important;\n}\n\n.rounded-end {\n  border-top-right-radius: var(--bs-border-radius) !important;\n  border-bottom-right-radius: var(--bs-border-radius) !important;\n}\n\n.rounded-end-0 {\n  border-top-right-radius: 0 !important;\n  border-bottom-right-radius: 0 !important;\n}\n\n.rounded-end-1 {\n  border-top-right-radius: var(--bs-border-radius-sm) !important;\n  border-bottom-right-radius: var(--bs-border-radius-sm) !important;\n}\n\n.rounded-end-2 {\n  border-top-right-radius: var(--bs-border-radius) !important;\n  border-bottom-right-radius: var(--bs-border-radius) !important;\n}\n\n.rounded-end-3 {\n  border-top-right-radius: var(--bs-border-radius-lg) !important;\n  border-bottom-right-radius: var(--bs-border-radius-lg) !important;\n}\n\n.rounded-end-4 {\n  border-top-right-radius: var(--bs-border-radius-xl) !important;\n  border-bottom-right-radius: var(--bs-border-radius-xl) !important;\n}\n\n.rounded-end-5 {\n  border-top-right-radius: var(--bs-border-radius-xxl) !important;\n  border-bottom-right-radius: var(--bs-border-radius-xxl) !important;\n}\n\n.rounded-end-circle {\n  border-top-right-radius: 50% !important;\n  border-bottom-right-radius: 50% !important;\n}\n\n.rounded-end-pill {\n  border-top-right-radius: var(--bs-border-radius-pill) !important;\n  border-bottom-right-radius: var(--bs-border-radius-pill) !important;\n}\n\n.rounded-bottom {\n  border-bottom-right-radius: var(--bs-border-radius) !important;\n  border-bottom-left-radius: var(--bs-border-radius) !important;\n}\n\n.rounded-bottom-0 {\n  border-bottom-right-radius: 0 !important;\n  border-bottom-left-radius: 0 !important;\n}\n\n.rounded-bottom-1 {\n  border-bottom-right-radius: var(--bs-border-radius-sm) !important;\n  border-bottom-left-radius: var(--bs-border-radius-sm) !important;\n}\n\n.rounded-bottom-2 {\n  border-bottom-right-radius: var(--bs-border-radius) !important;\n  border-bottom-left-radius: var(--bs-border-radius) !important;\n}\n\n.rounded-bottom-3 {\n  border-bottom-right-radius: var(--bs-border-radius-lg) !important;\n  border-bottom-left-radius: var(--bs-border-radius-lg) !important;\n}\n\n.rounded-bottom-4 {\n  border-bottom-right-radius: var(--bs-border-radius-xl) !important;\n  border-bottom-left-radius: var(--bs-border-radius-xl) !important;\n}\n\n.rounded-bottom-5 {\n  border-bottom-right-radius: var(--bs-border-radius-xxl) !important;\n  border-bottom-left-radius: var(--bs-border-radius-xxl) !important;\n}\n\n.rounded-bottom-circle {\n  border-bottom-right-radius: 50% !important;\n  border-bottom-left-radius: 50% !important;\n}\n\n.rounded-bottom-pill {\n  border-bottom-right-radius: var(--bs-border-radius-pill) !important;\n  border-bottom-left-radius: var(--bs-border-radius-pill) !important;\n}\n\n.rounded-start {\n  border-bottom-left-radius: var(--bs-border-radius) !important;\n  border-top-left-radius: var(--bs-border-radius) !important;\n}\n\n.rounded-start-0 {\n  border-bottom-left-radius: 0 !important;\n  border-top-left-radius: 0 !important;\n}\n\n.rounded-start-1 {\n  border-bottom-left-radius: var(--bs-border-radius-sm) !important;\n  border-top-left-radius: var(--bs-border-radius-sm) !important;\n}\n\n.rounded-start-2 {\n  border-bottom-left-radius: var(--bs-border-radius) !important;\n  border-top-left-radius: var(--bs-border-radius) !important;\n}\n\n.rounded-start-3 {\n  border-bottom-left-radius: var(--bs-border-radius-lg) !important;\n  border-top-left-radius: var(--bs-border-radius-lg) !important;\n}\n\n.rounded-start-4 {\n  border-bottom-left-radius: var(--bs-border-radius-xl) !important;\n  border-top-left-radius: var(--bs-border-radius-xl) !important;\n}\n\n.rounded-start-5 {\n  border-bottom-left-radius: var(--bs-border-radius-xxl) !important;\n  border-top-left-radius: var(--bs-border-radius-xxl) !important;\n}\n\n.rounded-start-circle {\n  border-bottom-left-radius: 50% !important;\n  border-top-left-radius: 50% !important;\n}\n\n.rounded-start-pill {\n  border-bottom-left-radius: var(--bs-border-radius-pill) !important;\n  border-top-left-radius: var(--bs-border-radius-pill) !important;\n}\n\n.visible {\n  visibility: visible !important;\n}\n\n.invisible {\n  visibility: hidden !important;\n}\n\n.z-n1 {\n  z-index: -1 !important;\n}\n\n.z-0 {\n  z-index: 0 !important;\n}\n\n.z-1 {\n  z-index: 1 !important;\n}\n\n.z-2 {\n  z-index: 2 !important;\n}\n\n.z-3 {\n  z-index: 3 !important;\n}\n\n@media (min-width: 576px) {\n  .float-sm-start {\n    float: left !important;\n  }\n  .float-sm-end {\n    float: right !important;\n  }\n  .float-sm-none {\n    float: none !important;\n  }\n  .object-fit-sm-contain {\n    -o-object-fit: contain !important;\n    object-fit: contain !important;\n  }\n  .object-fit-sm-cover {\n    -o-object-fit: cover !important;\n    object-fit: cover !important;\n  }\n  .object-fit-sm-fill {\n    -o-object-fit: fill !important;\n    object-fit: fill !important;\n  }\n  .object-fit-sm-scale {\n    -o-object-fit: scale-down !important;\n    object-fit: scale-down !important;\n  }\n  .object-fit-sm-none {\n    -o-object-fit: none !important;\n    object-fit: none !important;\n  }\n  .d-sm-inline {\n    display: inline !important;\n  }\n  .d-sm-inline-block {\n    display: inline-block !important;\n  }\n  .d-sm-block {\n    display: block !important;\n  }\n  .d-sm-grid {\n    display: grid !important;\n  }\n  .d-sm-inline-grid {\n    display: inline-grid !important;\n  }\n  .d-sm-table {\n    display: table !important;\n  }\n  .d-sm-table-row {\n    display: table-row !important;\n  }\n  .d-sm-table-cell {\n    display: table-cell !important;\n  }\n  .d-sm-flex {\n    display: flex !important;\n  }\n  .d-sm-inline-flex {\n    display: inline-flex !important;\n  }\n  .d-sm-none {\n    display: none !important;\n  }\n  .flex-sm-fill {\n    flex: 1 1 auto !important;\n  }\n  .flex-sm-row {\n    flex-direction: row !important;\n  }\n  .flex-sm-column {\n    flex-direction: column !important;\n  }\n  .flex-sm-row-reverse {\n    flex-direction: row-reverse !important;\n  }\n  .flex-sm-column-reverse {\n    flex-direction: column-reverse !important;\n  }\n  .flex-sm-grow-0 {\n    flex-grow: 0 !important;\n  }\n  .flex-sm-grow-1 {\n    flex-grow: 1 !important;\n  }\n  .flex-sm-shrink-0 {\n    flex-shrink: 0 !important;\n  }\n  .flex-sm-shrink-1 {\n    flex-shrink: 1 !important;\n  }\n  .flex-sm-wrap {\n    flex-wrap: wrap !important;\n  }\n  .flex-sm-nowrap {\n    flex-wrap: nowrap !important;\n  }\n  .flex-sm-wrap-reverse {\n    flex-wrap: wrap-reverse !important;\n  }\n  .justify-content-sm-start {\n    justify-content: flex-start !important;\n  }\n  .justify-content-sm-end {\n    justify-content: flex-end !important;\n  }\n  .justify-content-sm-center {\n    justify-content: center !important;\n  }\n  .justify-content-sm-between {\n    justify-content: space-between !important;\n  }\n  .justify-content-sm-around {\n    justify-content: space-around !important;\n  }\n  .justify-content-sm-evenly {\n    justify-content: space-evenly !important;\n  }\n  .align-items-sm-start {\n    align-items: flex-start !important;\n  }\n  .align-items-sm-end {\n    align-items: flex-end !important;\n  }\n  .align-items-sm-center {\n    align-items: center !important;\n  }\n  .align-items-sm-baseline {\n    align-items: baseline !important;\n  }\n  .align-items-sm-stretch {\n    align-items: stretch !important;\n  }\n  .align-content-sm-start {\n    align-content: flex-start !important;\n  }\n  .align-content-sm-end {\n    align-content: flex-end !important;\n  }\n  .align-content-sm-center {\n    align-content: center !important;\n  }\n  .align-content-sm-between {\n    align-content: space-between !important;\n  }\n  .align-content-sm-around {\n    align-content: space-around !important;\n  }\n  .align-content-sm-stretch {\n    align-content: stretch !important;\n  }\n  .align-self-sm-auto {\n    align-self: auto !important;\n  }\n  .align-self-sm-start {\n    align-self: flex-start !important;\n  }\n  .align-self-sm-end {\n    align-self: flex-end !important;\n  }\n  .align-self-sm-center {\n    align-self: center !important;\n  }\n  .align-self-sm-baseline {\n    align-self: baseline !important;\n  }\n  .align-self-sm-stretch {\n    align-self: stretch !important;\n  }\n  .order-sm-first {\n    order: -1 !important;\n  }\n  .order-sm-0 {\n    order: 0 !important;\n  }\n  .order-sm-1 {\n    order: 1 !important;\n  }\n  .order-sm-2 {\n    order: 2 !important;\n  }\n  .order-sm-3 {\n    order: 3 !important;\n  }\n  .order-sm-4 {\n    order: 4 !important;\n  }\n  .order-sm-5 {\n    order: 5 !important;\n  }\n  .order-sm-last {\n    order: 6 !important;\n  }\n  .m-sm-0 {\n    margin: 0 !important;\n  }\n  .m-sm-1 {\n    margin: 0.25rem !important;\n  }\n  .m-sm-2 {\n    margin: 0.5rem !important;\n  }\n  .m-sm-3 {\n    margin: 1rem !important;\n  }\n  .m-sm-4 {\n    margin: 1.5rem !important;\n  }\n  .m-sm-5 {\n    margin: 3rem !important;\n  }\n  .m-sm-auto {\n    margin: auto !important;\n  }\n  .mx-sm-0 {\n    margin-right: 0 !important;\n    margin-left: 0 !important;\n  }\n  .mx-sm-1 {\n    margin-right: 0.25rem !important;\n    margin-left: 0.25rem !important;\n  }\n  .mx-sm-2 {\n    margin-right: 0.5rem !important;\n    margin-left: 0.5rem !important;\n  }\n  .mx-sm-3 {\n    margin-right: 1rem !important;\n    margin-left: 1rem !important;\n  }\n  .mx-sm-4 {\n    margin-right: 1.5rem !important;\n    margin-left: 1.5rem !important;\n  }\n  .mx-sm-5 {\n    margin-right: 3rem !important;\n    margin-left: 3rem !important;\n  }\n  .mx-sm-auto {\n    margin-right: auto !important;\n    margin-left: auto !important;\n  }\n  .my-sm-0 {\n    margin-top: 0 !important;\n    margin-bottom: 0 !important;\n  }\n  .my-sm-1 {\n    margin-top: 0.25rem !important;\n    margin-bottom: 0.25rem !important;\n  }\n  .my-sm-2 {\n    margin-top: 0.5rem !important;\n    margin-bottom: 0.5rem !important;\n  }\n  .my-sm-3 {\n    margin-top: 1rem !important;\n    margin-bottom: 1rem !important;\n  }\n  .my-sm-4 {\n    margin-top: 1.5rem !important;\n    margin-bottom: 1.5rem !important;\n  }\n  .my-sm-5 {\n    margin-top: 3rem !important;\n    margin-bottom: 3rem !important;\n  }\n  .my-sm-auto {\n    margin-top: auto !important;\n    margin-bottom: auto !important;\n  }\n  .mt-sm-0 {\n    margin-top: 0 !important;\n  }\n  .mt-sm-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mt-sm-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mt-sm-3 {\n    margin-top: 1rem !important;\n  }\n  .mt-sm-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mt-sm-5 {\n    margin-top: 3rem !important;\n  }\n  .mt-sm-auto {\n    margin-top: auto !important;\n  }\n  .me-sm-0 {\n    margin-right: 0 !important;\n  }\n  .me-sm-1 {\n    margin-right: 0.25rem !important;\n  }\n  .me-sm-2 {\n    margin-right: 0.5rem !important;\n  }\n  .me-sm-3 {\n    margin-right: 1rem !important;\n  }\n  .me-sm-4 {\n    margin-right: 1.5rem !important;\n  }\n  .me-sm-5 {\n    margin-right: 3rem !important;\n  }\n  .me-sm-auto {\n    margin-right: auto !important;\n  }\n  .mb-sm-0 {\n    margin-bottom: 0 !important;\n  }\n  .mb-sm-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .mb-sm-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .mb-sm-3 {\n    margin-bottom: 1rem !important;\n  }\n  .mb-sm-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .mb-sm-5 {\n    margin-bottom: 3rem !important;\n  }\n  .mb-sm-auto {\n    margin-bottom: auto !important;\n  }\n  .ms-sm-0 {\n    margin-left: 0 !important;\n  }\n  .ms-sm-1 {\n    margin-left: 0.25rem !important;\n  }\n  .ms-sm-2 {\n    margin-left: 0.5rem !important;\n  }\n  .ms-sm-3 {\n    margin-left: 1rem !important;\n  }\n  .ms-sm-4 {\n    margin-left: 1.5rem !important;\n  }\n  .ms-sm-5 {\n    margin-left: 3rem !important;\n  }\n  .ms-sm-auto {\n    margin-left: auto !important;\n  }\n  .p-sm-0 {\n    padding: 0 !important;\n  }\n  .p-sm-1 {\n    padding: 0.25rem !important;\n  }\n  .p-sm-2 {\n    padding: 0.5rem !important;\n  }\n  .p-sm-3 {\n    padding: 1rem !important;\n  }\n  .p-sm-4 {\n    padding: 1.5rem !important;\n  }\n  .p-sm-5 {\n    padding: 3rem !important;\n  }\n  .px-sm-0 {\n    padding-right: 0 !important;\n    padding-left: 0 !important;\n  }\n  .px-sm-1 {\n    padding-right: 0.25rem !important;\n    padding-left: 0.25rem !important;\n  }\n  .px-sm-2 {\n    padding-right: 0.5rem !important;\n    padding-left: 0.5rem !important;\n  }\n  .px-sm-3 {\n    padding-right: 1rem !important;\n    padding-left: 1rem !important;\n  }\n  .px-sm-4 {\n    padding-right: 1.5rem !important;\n    padding-left: 1.5rem !important;\n  }\n  .px-sm-5 {\n    padding-right: 3rem !important;\n    padding-left: 3rem !important;\n  }\n  .py-sm-0 {\n    padding-top: 0 !important;\n    padding-bottom: 0 !important;\n  }\n  .py-sm-1 {\n    padding-top: 0.25rem !important;\n    padding-bottom: 0.25rem !important;\n  }\n  .py-sm-2 {\n    padding-top: 0.5rem !important;\n    padding-bottom: 0.5rem !important;\n  }\n  .py-sm-3 {\n    padding-top: 1rem !important;\n    padding-bottom: 1rem !important;\n  }\n  .py-sm-4 {\n    padding-top: 1.5rem !important;\n    padding-bottom: 1.5rem !important;\n  }\n  .py-sm-5 {\n    padding-top: 3rem !important;\n    padding-bottom: 3rem !important;\n  }\n  .pt-sm-0 {\n    padding-top: 0 !important;\n  }\n  .pt-sm-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pt-sm-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pt-sm-3 {\n    padding-top: 1rem !important;\n  }\n  .pt-sm-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pt-sm-5 {\n    padding-top: 3rem !important;\n  }\n  .pe-sm-0 {\n    padding-right: 0 !important;\n  }\n  .pe-sm-1 {\n    padding-right: 0.25rem !important;\n  }\n  .pe-sm-2 {\n    padding-right: 0.5rem !important;\n  }\n  .pe-sm-3 {\n    padding-right: 1rem !important;\n  }\n  .pe-sm-4 {\n    padding-right: 1.5rem !important;\n  }\n  .pe-sm-5 {\n    padding-right: 3rem !important;\n  }\n  .pb-sm-0 {\n    padding-bottom: 0 !important;\n  }\n  .pb-sm-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pb-sm-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pb-sm-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pb-sm-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pb-sm-5 {\n    padding-bottom: 3rem !important;\n  }\n  .ps-sm-0 {\n    padding-left: 0 !important;\n  }\n  .ps-sm-1 {\n    padding-left: 0.25rem !important;\n  }\n  .ps-sm-2 {\n    padding-left: 0.5rem !important;\n  }\n  .ps-sm-3 {\n    padding-left: 1rem !important;\n  }\n  .ps-sm-4 {\n    padding-left: 1.5rem !important;\n  }\n  .ps-sm-5 {\n    padding-left: 3rem !important;\n  }\n  .gap-sm-0 {\n    gap: 0 !important;\n  }\n  .gap-sm-1 {\n    gap: 0.25rem !important;\n  }\n  .gap-sm-2 {\n    gap: 0.5rem !important;\n  }\n  .gap-sm-3 {\n    gap: 1rem !important;\n  }\n  .gap-sm-4 {\n    gap: 1.5rem !important;\n  }\n  .gap-sm-5 {\n    gap: 3rem !important;\n  }\n  .row-gap-sm-0 {\n    row-gap: 0 !important;\n  }\n  .row-gap-sm-1 {\n    row-gap: 0.25rem !important;\n  }\n  .row-gap-sm-2 {\n    row-gap: 0.5rem !important;\n  }\n  .row-gap-sm-3 {\n    row-gap: 1rem !important;\n  }\n  .row-gap-sm-4 {\n    row-gap: 1.5rem !important;\n  }\n  .row-gap-sm-5 {\n    row-gap: 3rem !important;\n  }\n  .column-gap-sm-0 {\n    -moz-column-gap: 0 !important;\n    column-gap: 0 !important;\n  }\n  .column-gap-sm-1 {\n    -moz-column-gap: 0.25rem !important;\n    column-gap: 0.25rem !important;\n  }\n  .column-gap-sm-2 {\n    -moz-column-gap: 0.5rem !important;\n    column-gap: 0.5rem !important;\n  }\n  .column-gap-sm-3 {\n    -moz-column-gap: 1rem !important;\n    column-gap: 1rem !important;\n  }\n  .column-gap-sm-4 {\n    -moz-column-gap: 1.5rem !important;\n    column-gap: 1.5rem !important;\n  }\n  .column-gap-sm-5 {\n    -moz-column-gap: 3rem !important;\n    column-gap: 3rem !important;\n  }\n  .text-sm-start {\n    text-align: left !important;\n  }\n  .text-sm-end {\n    text-align: right !important;\n  }\n  .text-sm-center {\n    text-align: center !important;\n  }\n}\n@media (min-width: 768px) {\n  .float-md-start {\n    float: left !important;\n  }\n  .float-md-end {\n    float: right !important;\n  }\n  .float-md-none {\n    float: none !important;\n  }\n  .object-fit-md-contain {\n    -o-object-fit: contain !important;\n    object-fit: contain !important;\n  }\n  .object-fit-md-cover {\n    -o-object-fit: cover !important;\n    object-fit: cover !important;\n  }\n  .object-fit-md-fill {\n    -o-object-fit: fill !important;\n    object-fit: fill !important;\n  }\n  .object-fit-md-scale {\n    -o-object-fit: scale-down !important;\n    object-fit: scale-down !important;\n  }\n  .object-fit-md-none {\n    -o-object-fit: none !important;\n    object-fit: none !important;\n  }\n  .d-md-inline {\n    display: inline !important;\n  }\n  .d-md-inline-block {\n    display: inline-block !important;\n  }\n  .d-md-block {\n    display: block !important;\n  }\n  .d-md-grid {\n    display: grid !important;\n  }\n  .d-md-inline-grid {\n    display: inline-grid !important;\n  }\n  .d-md-table {\n    display: table !important;\n  }\n  .d-md-table-row {\n    display: table-row !important;\n  }\n  .d-md-table-cell {\n    display: table-cell !important;\n  }\n  .d-md-flex {\n    display: flex !important;\n  }\n  .d-md-inline-flex {\n    display: inline-flex !important;\n  }\n  .d-md-none {\n    display: none !important;\n  }\n  .flex-md-fill {\n    flex: 1 1 auto !important;\n  }\n  .flex-md-row {\n    flex-direction: row !important;\n  }\n  .flex-md-column {\n    flex-direction: column !important;\n  }\n  .flex-md-row-reverse {\n    flex-direction: row-reverse !important;\n  }\n  .flex-md-column-reverse {\n    flex-direction: column-reverse !important;\n  }\n  .flex-md-grow-0 {\n    flex-grow: 0 !important;\n  }\n  .flex-md-grow-1 {\n    flex-grow: 1 !important;\n  }\n  .flex-md-shrink-0 {\n    flex-shrink: 0 !important;\n  }\n  .flex-md-shrink-1 {\n    flex-shrink: 1 !important;\n  }\n  .flex-md-wrap {\n    flex-wrap: wrap !important;\n  }\n  .flex-md-nowrap {\n    flex-wrap: nowrap !important;\n  }\n  .flex-md-wrap-reverse {\n    flex-wrap: wrap-reverse !important;\n  }\n  .justify-content-md-start {\n    justify-content: flex-start !important;\n  }\n  .justify-content-md-end {\n    justify-content: flex-end !important;\n  }\n  .justify-content-md-center {\n    justify-content: center !important;\n  }\n  .justify-content-md-between {\n    justify-content: space-between !important;\n  }\n  .justify-content-md-around {\n    justify-content: space-around !important;\n  }\n  .justify-content-md-evenly {\n    justify-content: space-evenly !important;\n  }\n  .align-items-md-start {\n    align-items: flex-start !important;\n  }\n  .align-items-md-end {\n    align-items: flex-end !important;\n  }\n  .align-items-md-center {\n    align-items: center !important;\n  }\n  .align-items-md-baseline {\n    align-items: baseline !important;\n  }\n  .align-items-md-stretch {\n    align-items: stretch !important;\n  }\n  .align-content-md-start {\n    align-content: flex-start !important;\n  }\n  .align-content-md-end {\n    align-content: flex-end !important;\n  }\n  .align-content-md-center {\n    align-content: center !important;\n  }\n  .align-content-md-between {\n    align-content: space-between !important;\n  }\n  .align-content-md-around {\n    align-content: space-around !important;\n  }\n  .align-content-md-stretch {\n    align-content: stretch !important;\n  }\n  .align-self-md-auto {\n    align-self: auto !important;\n  }\n  .align-self-md-start {\n    align-self: flex-start !important;\n  }\n  .align-self-md-end {\n    align-self: flex-end !important;\n  }\n  .align-self-md-center {\n    align-self: center !important;\n  }\n  .align-self-md-baseline {\n    align-self: baseline !important;\n  }\n  .align-self-md-stretch {\n    align-self: stretch !important;\n  }\n  .order-md-first {\n    order: -1 !important;\n  }\n  .order-md-0 {\n    order: 0 !important;\n  }\n  .order-md-1 {\n    order: 1 !important;\n  }\n  .order-md-2 {\n    order: 2 !important;\n  }\n  .order-md-3 {\n    order: 3 !important;\n  }\n  .order-md-4 {\n    order: 4 !important;\n  }\n  .order-md-5 {\n    order: 5 !important;\n  }\n  .order-md-last {\n    order: 6 !important;\n  }\n  .m-md-0 {\n    margin: 0 !important;\n  }\n  .m-md-1 {\n    margin: 0.25rem !important;\n  }\n  .m-md-2 {\n    margin: 0.5rem !important;\n  }\n  .m-md-3 {\n    margin: 1rem !important;\n  }\n  .m-md-4 {\n    margin: 1.5rem !important;\n  }\n  .m-md-5 {\n    margin: 3rem !important;\n  }\n  .m-md-auto {\n    margin: auto !important;\n  }\n  .mx-md-0 {\n    margin-right: 0 !important;\n    margin-left: 0 !important;\n  }\n  .mx-md-1 {\n    margin-right: 0.25rem !important;\n    margin-left: 0.25rem !important;\n  }\n  .mx-md-2 {\n    margin-right: 0.5rem !important;\n    margin-left: 0.5rem !important;\n  }\n  .mx-md-3 {\n    margin-right: 1rem !important;\n    margin-left: 1rem !important;\n  }\n  .mx-md-4 {\n    margin-right: 1.5rem !important;\n    margin-left: 1.5rem !important;\n  }\n  .mx-md-5 {\n    margin-right: 3rem !important;\n    margin-left: 3rem !important;\n  }\n  .mx-md-auto {\n    margin-right: auto !important;\n    margin-left: auto !important;\n  }\n  .my-md-0 {\n    margin-top: 0 !important;\n    margin-bottom: 0 !important;\n  }\n  .my-md-1 {\n    margin-top: 0.25rem !important;\n    margin-bottom: 0.25rem !important;\n  }\n  .my-md-2 {\n    margin-top: 0.5rem !important;\n    margin-bottom: 0.5rem !important;\n  }\n  .my-md-3 {\n    margin-top: 1rem !important;\n    margin-bottom: 1rem !important;\n  }\n  .my-md-4 {\n    margin-top: 1.5rem !important;\n    margin-bottom: 1.5rem !important;\n  }\n  .my-md-5 {\n    margin-top: 3rem !important;\n    margin-bottom: 3rem !important;\n  }\n  .my-md-auto {\n    margin-top: auto !important;\n    margin-bottom: auto !important;\n  }\n  .mt-md-0 {\n    margin-top: 0 !important;\n  }\n  .mt-md-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mt-md-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mt-md-3 {\n    margin-top: 1rem !important;\n  }\n  .mt-md-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mt-md-5 {\n    margin-top: 3rem !important;\n  }\n  .mt-md-auto {\n    margin-top: auto !important;\n  }\n  .me-md-0 {\n    margin-right: 0 !important;\n  }\n  .me-md-1 {\n    margin-right: 0.25rem !important;\n  }\n  .me-md-2 {\n    margin-right: 0.5rem !important;\n  }\n  .me-md-3 {\n    margin-right: 1rem !important;\n  }\n  .me-md-4 {\n    margin-right: 1.5rem !important;\n  }\n  .me-md-5 {\n    margin-right: 3rem !important;\n  }\n  .me-md-auto {\n    margin-right: auto !important;\n  }\n  .mb-md-0 {\n    margin-bottom: 0 !important;\n  }\n  .mb-md-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .mb-md-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .mb-md-3 {\n    margin-bottom: 1rem !important;\n  }\n  .mb-md-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .mb-md-5 {\n    margin-bottom: 3rem !important;\n  }\n  .mb-md-auto {\n    margin-bottom: auto !important;\n  }\n  .ms-md-0 {\n    margin-left: 0 !important;\n  }\n  .ms-md-1 {\n    margin-left: 0.25rem !important;\n  }\n  .ms-md-2 {\n    margin-left: 0.5rem !important;\n  }\n  .ms-md-3 {\n    margin-left: 1rem !important;\n  }\n  .ms-md-4 {\n    margin-left: 1.5rem !important;\n  }\n  .ms-md-5 {\n    margin-left: 3rem !important;\n  }\n  .ms-md-auto {\n    margin-left: auto !important;\n  }\n  .p-md-0 {\n    padding: 0 !important;\n  }\n  .p-md-1 {\n    padding: 0.25rem !important;\n  }\n  .p-md-2 {\n    padding: 0.5rem !important;\n  }\n  .p-md-3 {\n    padding: 1rem !important;\n  }\n  .p-md-4 {\n    padding: 1.5rem !important;\n  }\n  .p-md-5 {\n    padding: 3rem !important;\n  }\n  .px-md-0 {\n    padding-right: 0 !important;\n    padding-left: 0 !important;\n  }\n  .px-md-1 {\n    padding-right: 0.25rem !important;\n    padding-left: 0.25rem !important;\n  }\n  .px-md-2 {\n    padding-right: 0.5rem !important;\n    padding-left: 0.5rem !important;\n  }\n  .px-md-3 {\n    padding-right: 1rem !important;\n    padding-left: 1rem !important;\n  }\n  .px-md-4 {\n    padding-right: 1.5rem !important;\n    padding-left: 1.5rem !important;\n  }\n  .px-md-5 {\n    padding-right: 3rem !important;\n    padding-left: 3rem !important;\n  }\n  .py-md-0 {\n    padding-top: 0 !important;\n    padding-bottom: 0 !important;\n  }\n  .py-md-1 {\n    padding-top: 0.25rem !important;\n    padding-bottom: 0.25rem !important;\n  }\n  .py-md-2 {\n    padding-top: 0.5rem !important;\n    padding-bottom: 0.5rem !important;\n  }\n  .py-md-3 {\n    padding-top: 1rem !important;\n    padding-bottom: 1rem !important;\n  }\n  .py-md-4 {\n    padding-top: 1.5rem !important;\n    padding-bottom: 1.5rem !important;\n  }\n  .py-md-5 {\n    padding-top: 3rem !important;\n    padding-bottom: 3rem !important;\n  }\n  .pt-md-0 {\n    padding-top: 0 !important;\n  }\n  .pt-md-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pt-md-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pt-md-3 {\n    padding-top: 1rem !important;\n  }\n  .pt-md-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pt-md-5 {\n    padding-top: 3rem !important;\n  }\n  .pe-md-0 {\n    padding-right: 0 !important;\n  }\n  .pe-md-1 {\n    padding-right: 0.25rem !important;\n  }\n  .pe-md-2 {\n    padding-right: 0.5rem !important;\n  }\n  .pe-md-3 {\n    padding-right: 1rem !important;\n  }\n  .pe-md-4 {\n    padding-right: 1.5rem !important;\n  }\n  .pe-md-5 {\n    padding-right: 3rem !important;\n  }\n  .pb-md-0 {\n    padding-bottom: 0 !important;\n  }\n  .pb-md-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pb-md-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pb-md-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pb-md-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pb-md-5 {\n    padding-bottom: 3rem !important;\n  }\n  .ps-md-0 {\n    padding-left: 0 !important;\n  }\n  .ps-md-1 {\n    padding-left: 0.25rem !important;\n  }\n  .ps-md-2 {\n    padding-left: 0.5rem !important;\n  }\n  .ps-md-3 {\n    padding-left: 1rem !important;\n  }\n  .ps-md-4 {\n    padding-left: 1.5rem !important;\n  }\n  .ps-md-5 {\n    padding-left: 3rem !important;\n  }\n  .gap-md-0 {\n    gap: 0 !important;\n  }\n  .gap-md-1 {\n    gap: 0.25rem !important;\n  }\n  .gap-md-2 {\n    gap: 0.5rem !important;\n  }\n  .gap-md-3 {\n    gap: 1rem !important;\n  }\n  .gap-md-4 {\n    gap: 1.5rem !important;\n  }\n  .gap-md-5 {\n    gap: 3rem !important;\n  }\n  .row-gap-md-0 {\n    row-gap: 0 !important;\n  }\n  .row-gap-md-1 {\n    row-gap: 0.25rem !important;\n  }\n  .row-gap-md-2 {\n    row-gap: 0.5rem !important;\n  }\n  .row-gap-md-3 {\n    row-gap: 1rem !important;\n  }\n  .row-gap-md-4 {\n    row-gap: 1.5rem !important;\n  }\n  .row-gap-md-5 {\n    row-gap: 3rem !important;\n  }\n  .column-gap-md-0 {\n    -moz-column-gap: 0 !important;\n    column-gap: 0 !important;\n  }\n  .column-gap-md-1 {\n    -moz-column-gap: 0.25rem !important;\n    column-gap: 0.25rem !important;\n  }\n  .column-gap-md-2 {\n    -moz-column-gap: 0.5rem !important;\n    column-gap: 0.5rem !important;\n  }\n  .column-gap-md-3 {\n    -moz-column-gap: 1rem !important;\n    column-gap: 1rem !important;\n  }\n  .column-gap-md-4 {\n    -moz-column-gap: 1.5rem !important;\n    column-gap: 1.5rem !important;\n  }\n  .column-gap-md-5 {\n    -moz-column-gap: 3rem !important;\n    column-gap: 3rem !important;\n  }\n  .text-md-start {\n    text-align: left !important;\n  }\n  .text-md-end {\n    text-align: right !important;\n  }\n  .text-md-center {\n    text-align: center !important;\n  }\n}\n@media (min-width: 992px) {\n  .float-lg-start {\n    float: left !important;\n  }\n  .float-lg-end {\n    float: right !important;\n  }\n  .float-lg-none {\n    float: none !important;\n  }\n  .object-fit-lg-contain {\n    -o-object-fit: contain !important;\n    object-fit: contain !important;\n  }\n  .object-fit-lg-cover {\n    -o-object-fit: cover !important;\n    object-fit: cover !important;\n  }\n  .object-fit-lg-fill {\n    -o-object-fit: fill !important;\n    object-fit: fill !important;\n  }\n  .object-fit-lg-scale {\n    -o-object-fit: scale-down !important;\n    object-fit: scale-down !important;\n  }\n  .object-fit-lg-none {\n    -o-object-fit: none !important;\n    object-fit: none !important;\n  }\n  .d-lg-inline {\n    display: inline !important;\n  }\n  .d-lg-inline-block {\n    display: inline-block !important;\n  }\n  .d-lg-block {\n    display: block !important;\n  }\n  .d-lg-grid {\n    display: grid !important;\n  }\n  .d-lg-inline-grid {\n    display: inline-grid !important;\n  }\n  .d-lg-table {\n    display: table !important;\n  }\n  .d-lg-table-row {\n    display: table-row !important;\n  }\n  .d-lg-table-cell {\n    display: table-cell !important;\n  }\n  .d-lg-flex {\n    display: flex !important;\n  }\n  .d-lg-inline-flex {\n    display: inline-flex !important;\n  }\n  .d-lg-none {\n    display: none !important;\n  }\n  .flex-lg-fill {\n    flex: 1 1 auto !important;\n  }\n  .flex-lg-row {\n    flex-direction: row !important;\n  }\n  .flex-lg-column {\n    flex-direction: column !important;\n  }\n  .flex-lg-row-reverse {\n    flex-direction: row-reverse !important;\n  }\n  .flex-lg-column-reverse {\n    flex-direction: column-reverse !important;\n  }\n  .flex-lg-grow-0 {\n    flex-grow: 0 !important;\n  }\n  .flex-lg-grow-1 {\n    flex-grow: 1 !important;\n  }\n  .flex-lg-shrink-0 {\n    flex-shrink: 0 !important;\n  }\n  .flex-lg-shrink-1 {\n    flex-shrink: 1 !important;\n  }\n  .flex-lg-wrap {\n    flex-wrap: wrap !important;\n  }\n  .flex-lg-nowrap {\n    flex-wrap: nowrap !important;\n  }\n  .flex-lg-wrap-reverse {\n    flex-wrap: wrap-reverse !important;\n  }\n  .justify-content-lg-start {\n    justify-content: flex-start !important;\n  }\n  .justify-content-lg-end {\n    justify-content: flex-end !important;\n  }\n  .justify-content-lg-center {\n    justify-content: center !important;\n  }\n  .justify-content-lg-between {\n    justify-content: space-between !important;\n  }\n  .justify-content-lg-around {\n    justify-content: space-around !important;\n  }\n  .justify-content-lg-evenly {\n    justify-content: space-evenly !important;\n  }\n  .align-items-lg-start {\n    align-items: flex-start !important;\n  }\n  .align-items-lg-end {\n    align-items: flex-end !important;\n  }\n  .align-items-lg-center {\n    align-items: center !important;\n  }\n  .align-items-lg-baseline {\n    align-items: baseline !important;\n  }\n  .align-items-lg-stretch {\n    align-items: stretch !important;\n  }\n  .align-content-lg-start {\n    align-content: flex-start !important;\n  }\n  .align-content-lg-end {\n    align-content: flex-end !important;\n  }\n  .align-content-lg-center {\n    align-content: center !important;\n  }\n  .align-content-lg-between {\n    align-content: space-between !important;\n  }\n  .align-content-lg-around {\n    align-content: space-around !important;\n  }\n  .align-content-lg-stretch {\n    align-content: stretch !important;\n  }\n  .align-self-lg-auto {\n    align-self: auto !important;\n  }\n  .align-self-lg-start {\n    align-self: flex-start !important;\n  }\n  .align-self-lg-end {\n    align-self: flex-end !important;\n  }\n  .align-self-lg-center {\n    align-self: center !important;\n  }\n  .align-self-lg-baseline {\n    align-self: baseline !important;\n  }\n  .align-self-lg-stretch {\n    align-self: stretch !important;\n  }\n  .order-lg-first {\n    order: -1 !important;\n  }\n  .order-lg-0 {\n    order: 0 !important;\n  }\n  .order-lg-1 {\n    order: 1 !important;\n  }\n  .order-lg-2 {\n    order: 2 !important;\n  }\n  .order-lg-3 {\n    order: 3 !important;\n  }\n  .order-lg-4 {\n    order: 4 !important;\n  }\n  .order-lg-5 {\n    order: 5 !important;\n  }\n  .order-lg-last {\n    order: 6 !important;\n  }\n  .m-lg-0 {\n    margin: 0 !important;\n  }\n  .m-lg-1 {\n    margin: 0.25rem !important;\n  }\n  .m-lg-2 {\n    margin: 0.5rem !important;\n  }\n  .m-lg-3 {\n    margin: 1rem !important;\n  }\n  .m-lg-4 {\n    margin: 1.5rem !important;\n  }\n  .m-lg-5 {\n    margin: 3rem !important;\n  }\n  .m-lg-auto {\n    margin: auto !important;\n  }\n  .mx-lg-0 {\n    margin-right: 0 !important;\n    margin-left: 0 !important;\n  }\n  .mx-lg-1 {\n    margin-right: 0.25rem !important;\n    margin-left: 0.25rem !important;\n  }\n  .mx-lg-2 {\n    margin-right: 0.5rem !important;\n    margin-left: 0.5rem !important;\n  }\n  .mx-lg-3 {\n    margin-right: 1rem !important;\n    margin-left: 1rem !important;\n  }\n  .mx-lg-4 {\n    margin-right: 1.5rem !important;\n    margin-left: 1.5rem !important;\n  }\n  .mx-lg-5 {\n    margin-right: 3rem !important;\n    margin-left: 3rem !important;\n  }\n  .mx-lg-auto {\n    margin-right: auto !important;\n    margin-left: auto !important;\n  }\n  .my-lg-0 {\n    margin-top: 0 !important;\n    margin-bottom: 0 !important;\n  }\n  .my-lg-1 {\n    margin-top: 0.25rem !important;\n    margin-bottom: 0.25rem !important;\n  }\n  .my-lg-2 {\n    margin-top: 0.5rem !important;\n    margin-bottom: 0.5rem !important;\n  }\n  .my-lg-3 {\n    margin-top: 1rem !important;\n    margin-bottom: 1rem !important;\n  }\n  .my-lg-4 {\n    margin-top: 1.5rem !important;\n    margin-bottom: 1.5rem !important;\n  }\n  .my-lg-5 {\n    margin-top: 3rem !important;\n    margin-bottom: 3rem !important;\n  }\n  .my-lg-auto {\n    margin-top: auto !important;\n    margin-bottom: auto !important;\n  }\n  .mt-lg-0 {\n    margin-top: 0 !important;\n  }\n  .mt-lg-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mt-lg-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mt-lg-3 {\n    margin-top: 1rem !important;\n  }\n  .mt-lg-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mt-lg-5 {\n    margin-top: 3rem !important;\n  }\n  .mt-lg-auto {\n    margin-top: auto !important;\n  }\n  .me-lg-0 {\n    margin-right: 0 !important;\n  }\n  .me-lg-1 {\n    margin-right: 0.25rem !important;\n  }\n  .me-lg-2 {\n    margin-right: 0.5rem !important;\n  }\n  .me-lg-3 {\n    margin-right: 1rem !important;\n  }\n  .me-lg-4 {\n    margin-right: 1.5rem !important;\n  }\n  .me-lg-5 {\n    margin-right: 3rem !important;\n  }\n  .me-lg-auto {\n    margin-right: auto !important;\n  }\n  .mb-lg-0 {\n    margin-bottom: 0 !important;\n  }\n  .mb-lg-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .mb-lg-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .mb-lg-3 {\n    margin-bottom: 1rem !important;\n  }\n  .mb-lg-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .mb-lg-5 {\n    margin-bottom: 3rem !important;\n  }\n  .mb-lg-auto {\n    margin-bottom: auto !important;\n  }\n  .ms-lg-0 {\n    margin-left: 0 !important;\n  }\n  .ms-lg-1 {\n    margin-left: 0.25rem !important;\n  }\n  .ms-lg-2 {\n    margin-left: 0.5rem !important;\n  }\n  .ms-lg-3 {\n    margin-left: 1rem !important;\n  }\n  .ms-lg-4 {\n    margin-left: 1.5rem !important;\n  }\n  .ms-lg-5 {\n    margin-left: 3rem !important;\n  }\n  .ms-lg-auto {\n    margin-left: auto !important;\n  }\n  .p-lg-0 {\n    padding: 0 !important;\n  }\n  .p-lg-1 {\n    padding: 0.25rem !important;\n  }\n  .p-lg-2 {\n    padding: 0.5rem !important;\n  }\n  .p-lg-3 {\n    padding: 1rem !important;\n  }\n  .p-lg-4 {\n    padding: 1.5rem !important;\n  }\n  .p-lg-5 {\n    padding: 3rem !important;\n  }\n  .px-lg-0 {\n    padding-right: 0 !important;\n    padding-left: 0 !important;\n  }\n  .px-lg-1 {\n    padding-right: 0.25rem !important;\n    padding-left: 0.25rem !important;\n  }\n  .px-lg-2 {\n    padding-right: 0.5rem !important;\n    padding-left: 0.5rem !important;\n  }\n  .px-lg-3 {\n    padding-right: 1rem !important;\n    padding-left: 1rem !important;\n  }\n  .px-lg-4 {\n    padding-right: 1.5rem !important;\n    padding-left: 1.5rem !important;\n  }\n  .px-lg-5 {\n    padding-right: 3rem !important;\n    padding-left: 3rem !important;\n  }\n  .py-lg-0 {\n    padding-top: 0 !important;\n    padding-bottom: 0 !important;\n  }\n  .py-lg-1 {\n    padding-top: 0.25rem !important;\n    padding-bottom: 0.25rem !important;\n  }\n  .py-lg-2 {\n    padding-top: 0.5rem !important;\n    padding-bottom: 0.5rem !important;\n  }\n  .py-lg-3 {\n    padding-top: 1rem !important;\n    padding-bottom: 1rem !important;\n  }\n  .py-lg-4 {\n    padding-top: 1.5rem !important;\n    padding-bottom: 1.5rem !important;\n  }\n  .py-lg-5 {\n    padding-top: 3rem !important;\n    padding-bottom: 3rem !important;\n  }\n  .pt-lg-0 {\n    padding-top: 0 !important;\n  }\n  .pt-lg-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pt-lg-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pt-lg-3 {\n    padding-top: 1rem !important;\n  }\n  .pt-lg-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pt-lg-5 {\n    padding-top: 3rem !important;\n  }\n  .pe-lg-0 {\n    padding-right: 0 !important;\n  }\n  .pe-lg-1 {\n    padding-right: 0.25rem !important;\n  }\n  .pe-lg-2 {\n    padding-right: 0.5rem !important;\n  }\n  .pe-lg-3 {\n    padding-right: 1rem !important;\n  }\n  .pe-lg-4 {\n    padding-right: 1.5rem !important;\n  }\n  .pe-lg-5 {\n    padding-right: 3rem !important;\n  }\n  .pb-lg-0 {\n    padding-bottom: 0 !important;\n  }\n  .pb-lg-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pb-lg-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pb-lg-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pb-lg-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pb-lg-5 {\n    padding-bottom: 3rem !important;\n  }\n  .ps-lg-0 {\n    padding-left: 0 !important;\n  }\n  .ps-lg-1 {\n    padding-left: 0.25rem !important;\n  }\n  .ps-lg-2 {\n    padding-left: 0.5rem !important;\n  }\n  .ps-lg-3 {\n    padding-left: 1rem !important;\n  }\n  .ps-lg-4 {\n    padding-left: 1.5rem !important;\n  }\n  .ps-lg-5 {\n    padding-left: 3rem !important;\n  }\n  .gap-lg-0 {\n    gap: 0 !important;\n  }\n  .gap-lg-1 {\n    gap: 0.25rem !important;\n  }\n  .gap-lg-2 {\n    gap: 0.5rem !important;\n  }\n  .gap-lg-3 {\n    gap: 1rem !important;\n  }\n  .gap-lg-4 {\n    gap: 1.5rem !important;\n  }\n  .gap-lg-5 {\n    gap: 3rem !important;\n  }\n  .row-gap-lg-0 {\n    row-gap: 0 !important;\n  }\n  .row-gap-lg-1 {\n    row-gap: 0.25rem !important;\n  }\n  .row-gap-lg-2 {\n    row-gap: 0.5rem !important;\n  }\n  .row-gap-lg-3 {\n    row-gap: 1rem !important;\n  }\n  .row-gap-lg-4 {\n    row-gap: 1.5rem !important;\n  }\n  .row-gap-lg-5 {\n    row-gap: 3rem !important;\n  }\n  .column-gap-lg-0 {\n    -moz-column-gap: 0 !important;\n    column-gap: 0 !important;\n  }\n  .column-gap-lg-1 {\n    -moz-column-gap: 0.25rem !important;\n    column-gap: 0.25rem !important;\n  }\n  .column-gap-lg-2 {\n    -moz-column-gap: 0.5rem !important;\n    column-gap: 0.5rem !important;\n  }\n  .column-gap-lg-3 {\n    -moz-column-gap: 1rem !important;\n    column-gap: 1rem !important;\n  }\n  .column-gap-lg-4 {\n    -moz-column-gap: 1.5rem !important;\n    column-gap: 1.5rem !important;\n  }\n  .column-gap-lg-5 {\n    -moz-column-gap: 3rem !important;\n    column-gap: 3rem !important;\n  }\n  .text-lg-start {\n    text-align: left !important;\n  }\n  .text-lg-end {\n    text-align: right !important;\n  }\n  .text-lg-center {\n    text-align: center !important;\n  }\n}\n@media (min-width: 1200px) {\n  .float-xl-start {\n    float: left !important;\n  }\n  .float-xl-end {\n    float: right !important;\n  }\n  .float-xl-none {\n    float: none !important;\n  }\n  .object-fit-xl-contain {\n    -o-object-fit: contain !important;\n    object-fit: contain !important;\n  }\n  .object-fit-xl-cover {\n    -o-object-fit: cover !important;\n    object-fit: cover !important;\n  }\n  .object-fit-xl-fill {\n    -o-object-fit: fill !important;\n    object-fit: fill !important;\n  }\n  .object-fit-xl-scale {\n    -o-object-fit: scale-down !important;\n    object-fit: scale-down !important;\n  }\n  .object-fit-xl-none {\n    -o-object-fit: none !important;\n    object-fit: none !important;\n  }\n  .d-xl-inline {\n    display: inline !important;\n  }\n  .d-xl-inline-block {\n    display: inline-block !important;\n  }\n  .d-xl-block {\n    display: block !important;\n  }\n  .d-xl-grid {\n    display: grid !important;\n  }\n  .d-xl-inline-grid {\n    display: inline-grid !important;\n  }\n  .d-xl-table {\n    display: table !important;\n  }\n  .d-xl-table-row {\n    display: table-row !important;\n  }\n  .d-xl-table-cell {\n    display: table-cell !important;\n  }\n  .d-xl-flex {\n    display: flex !important;\n  }\n  .d-xl-inline-flex {\n    display: inline-flex !important;\n  }\n  .d-xl-none {\n    display: none !important;\n  }\n  .flex-xl-fill {\n    flex: 1 1 auto !important;\n  }\n  .flex-xl-row {\n    flex-direction: row !important;\n  }\n  .flex-xl-column {\n    flex-direction: column !important;\n  }\n  .flex-xl-row-reverse {\n    flex-direction: row-reverse !important;\n  }\n  .flex-xl-column-reverse {\n    flex-direction: column-reverse !important;\n  }\n  .flex-xl-grow-0 {\n    flex-grow: 0 !important;\n  }\n  .flex-xl-grow-1 {\n    flex-grow: 1 !important;\n  }\n  .flex-xl-shrink-0 {\n    flex-shrink: 0 !important;\n  }\n  .flex-xl-shrink-1 {\n    flex-shrink: 1 !important;\n  }\n  .flex-xl-wrap {\n    flex-wrap: wrap !important;\n  }\n  .flex-xl-nowrap {\n    flex-wrap: nowrap !important;\n  }\n  .flex-xl-wrap-reverse {\n    flex-wrap: wrap-reverse !important;\n  }\n  .justify-content-xl-start {\n    justify-content: flex-start !important;\n  }\n  .justify-content-xl-end {\n    justify-content: flex-end !important;\n  }\n  .justify-content-xl-center {\n    justify-content: center !important;\n  }\n  .justify-content-xl-between {\n    justify-content: space-between !important;\n  }\n  .justify-content-xl-around {\n    justify-content: space-around !important;\n  }\n  .justify-content-xl-evenly {\n    justify-content: space-evenly !important;\n  }\n  .align-items-xl-start {\n    align-items: flex-start !important;\n  }\n  .align-items-xl-end {\n    align-items: flex-end !important;\n  }\n  .align-items-xl-center {\n    align-items: center !important;\n  }\n  .align-items-xl-baseline {\n    align-items: baseline !important;\n  }\n  .align-items-xl-stretch {\n    align-items: stretch !important;\n  }\n  .align-content-xl-start {\n    align-content: flex-start !important;\n  }\n  .align-content-xl-end {\n    align-content: flex-end !important;\n  }\n  .align-content-xl-center {\n    align-content: center !important;\n  }\n  .align-content-xl-between {\n    align-content: space-between !important;\n  }\n  .align-content-xl-around {\n    align-content: space-around !important;\n  }\n  .align-content-xl-stretch {\n    align-content: stretch !important;\n  }\n  .align-self-xl-auto {\n    align-self: auto !important;\n  }\n  .align-self-xl-start {\n    align-self: flex-start !important;\n  }\n  .align-self-xl-end {\n    align-self: flex-end !important;\n  }\n  .align-self-xl-center {\n    align-self: center !important;\n  }\n  .align-self-xl-baseline {\n    align-self: baseline !important;\n  }\n  .align-self-xl-stretch {\n    align-self: stretch !important;\n  }\n  .order-xl-first {\n    order: -1 !important;\n  }\n  .order-xl-0 {\n    order: 0 !important;\n  }\n  .order-xl-1 {\n    order: 1 !important;\n  }\n  .order-xl-2 {\n    order: 2 !important;\n  }\n  .order-xl-3 {\n    order: 3 !important;\n  }\n  .order-xl-4 {\n    order: 4 !important;\n  }\n  .order-xl-5 {\n    order: 5 !important;\n  }\n  .order-xl-last {\n    order: 6 !important;\n  }\n  .m-xl-0 {\n    margin: 0 !important;\n  }\n  .m-xl-1 {\n    margin: 0.25rem !important;\n  }\n  .m-xl-2 {\n    margin: 0.5rem !important;\n  }\n  .m-xl-3 {\n    margin: 1rem !important;\n  }\n  .m-xl-4 {\n    margin: 1.5rem !important;\n  }\n  .m-xl-5 {\n    margin: 3rem !important;\n  }\n  .m-xl-auto {\n    margin: auto !important;\n  }\n  .mx-xl-0 {\n    margin-right: 0 !important;\n    margin-left: 0 !important;\n  }\n  .mx-xl-1 {\n    margin-right: 0.25rem !important;\n    margin-left: 0.25rem !important;\n  }\n  .mx-xl-2 {\n    margin-right: 0.5rem !important;\n    margin-left: 0.5rem !important;\n  }\n  .mx-xl-3 {\n    margin-right: 1rem !important;\n    margin-left: 1rem !important;\n  }\n  .mx-xl-4 {\n    margin-right: 1.5rem !important;\n    margin-left: 1.5rem !important;\n  }\n  .mx-xl-5 {\n    margin-right: 3rem !important;\n    margin-left: 3rem !important;\n  }\n  .mx-xl-auto {\n    margin-right: auto !important;\n    margin-left: auto !important;\n  }\n  .my-xl-0 {\n    margin-top: 0 !important;\n    margin-bottom: 0 !important;\n  }\n  .my-xl-1 {\n    margin-top: 0.25rem !important;\n    margin-bottom: 0.25rem !important;\n  }\n  .my-xl-2 {\n    margin-top: 0.5rem !important;\n    margin-bottom: 0.5rem !important;\n  }\n  .my-xl-3 {\n    margin-top: 1rem !important;\n    margin-bottom: 1rem !important;\n  }\n  .my-xl-4 {\n    margin-top: 1.5rem !important;\n    margin-bottom: 1.5rem !important;\n  }\n  .my-xl-5 {\n    margin-top: 3rem !important;\n    margin-bottom: 3rem !important;\n  }\n  .my-xl-auto {\n    margin-top: auto !important;\n    margin-bottom: auto !important;\n  }\n  .mt-xl-0 {\n    margin-top: 0 !important;\n  }\n  .mt-xl-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mt-xl-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mt-xl-3 {\n    margin-top: 1rem !important;\n  }\n  .mt-xl-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mt-xl-5 {\n    margin-top: 3rem !important;\n  }\n  .mt-xl-auto {\n    margin-top: auto !important;\n  }\n  .me-xl-0 {\n    margin-right: 0 !important;\n  }\n  .me-xl-1 {\n    margin-right: 0.25rem !important;\n  }\n  .me-xl-2 {\n    margin-right: 0.5rem !important;\n  }\n  .me-xl-3 {\n    margin-right: 1rem !important;\n  }\n  .me-xl-4 {\n    margin-right: 1.5rem !important;\n  }\n  .me-xl-5 {\n    margin-right: 3rem !important;\n  }\n  .me-xl-auto {\n    margin-right: auto !important;\n  }\n  .mb-xl-0 {\n    margin-bottom: 0 !important;\n  }\n  .mb-xl-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .mb-xl-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .mb-xl-3 {\n    margin-bottom: 1rem !important;\n  }\n  .mb-xl-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .mb-xl-5 {\n    margin-bottom: 3rem !important;\n  }\n  .mb-xl-auto {\n    margin-bottom: auto !important;\n  }\n  .ms-xl-0 {\n    margin-left: 0 !important;\n  }\n  .ms-xl-1 {\n    margin-left: 0.25rem !important;\n  }\n  .ms-xl-2 {\n    margin-left: 0.5rem !important;\n  }\n  .ms-xl-3 {\n    margin-left: 1rem !important;\n  }\n  .ms-xl-4 {\n    margin-left: 1.5rem !important;\n  }\n  .ms-xl-5 {\n    margin-left: 3rem !important;\n  }\n  .ms-xl-auto {\n    margin-left: auto !important;\n  }\n  .p-xl-0 {\n    padding: 0 !important;\n  }\n  .p-xl-1 {\n    padding: 0.25rem !important;\n  }\n  .p-xl-2 {\n    padding: 0.5rem !important;\n  }\n  .p-xl-3 {\n    padding: 1rem !important;\n  }\n  .p-xl-4 {\n    padding: 1.5rem !important;\n  }\n  .p-xl-5 {\n    padding: 3rem !important;\n  }\n  .px-xl-0 {\n    padding-right: 0 !important;\n    padding-left: 0 !important;\n  }\n  .px-xl-1 {\n    padding-right: 0.25rem !important;\n    padding-left: 0.25rem !important;\n  }\n  .px-xl-2 {\n    padding-right: 0.5rem !important;\n    padding-left: 0.5rem !important;\n  }\n  .px-xl-3 {\n    padding-right: 1rem !important;\n    padding-left: 1rem !important;\n  }\n  .px-xl-4 {\n    padding-right: 1.5rem !important;\n    padding-left: 1.5rem !important;\n  }\n  .px-xl-5 {\n    padding-right: 3rem !important;\n    padding-left: 3rem !important;\n  }\n  .py-xl-0 {\n    padding-top: 0 !important;\n    padding-bottom: 0 !important;\n  }\n  .py-xl-1 {\n    padding-top: 0.25rem !important;\n    padding-bottom: 0.25rem !important;\n  }\n  .py-xl-2 {\n    padding-top: 0.5rem !important;\n    padding-bottom: 0.5rem !important;\n  }\n  .py-xl-3 {\n    padding-top: 1rem !important;\n    padding-bottom: 1rem !important;\n  }\n  .py-xl-4 {\n    padding-top: 1.5rem !important;\n    padding-bottom: 1.5rem !important;\n  }\n  .py-xl-5 {\n    padding-top: 3rem !important;\n    padding-bottom: 3rem !important;\n  }\n  .pt-xl-0 {\n    padding-top: 0 !important;\n  }\n  .pt-xl-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pt-xl-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pt-xl-3 {\n    padding-top: 1rem !important;\n  }\n  .pt-xl-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pt-xl-5 {\n    padding-top: 3rem !important;\n  }\n  .pe-xl-0 {\n    padding-right: 0 !important;\n  }\n  .pe-xl-1 {\n    padding-right: 0.25rem !important;\n  }\n  .pe-xl-2 {\n    padding-right: 0.5rem !important;\n  }\n  .pe-xl-3 {\n    padding-right: 1rem !important;\n  }\n  .pe-xl-4 {\n    padding-right: 1.5rem !important;\n  }\n  .pe-xl-5 {\n    padding-right: 3rem !important;\n  }\n  .pb-xl-0 {\n    padding-bottom: 0 !important;\n  }\n  .pb-xl-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pb-xl-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pb-xl-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pb-xl-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pb-xl-5 {\n    padding-bottom: 3rem !important;\n  }\n  .ps-xl-0 {\n    padding-left: 0 !important;\n  }\n  .ps-xl-1 {\n    padding-left: 0.25rem !important;\n  }\n  .ps-xl-2 {\n    padding-left: 0.5rem !important;\n  }\n  .ps-xl-3 {\n    padding-left: 1rem !important;\n  }\n  .ps-xl-4 {\n    padding-left: 1.5rem !important;\n  }\n  .ps-xl-5 {\n    padding-left: 3rem !important;\n  }\n  .gap-xl-0 {\n    gap: 0 !important;\n  }\n  .gap-xl-1 {\n    gap: 0.25rem !important;\n  }\n  .gap-xl-2 {\n    gap: 0.5rem !important;\n  }\n  .gap-xl-3 {\n    gap: 1rem !important;\n  }\n  .gap-xl-4 {\n    gap: 1.5rem !important;\n  }\n  .gap-xl-5 {\n    gap: 3rem !important;\n  }\n  .row-gap-xl-0 {\n    row-gap: 0 !important;\n  }\n  .row-gap-xl-1 {\n    row-gap: 0.25rem !important;\n  }\n  .row-gap-xl-2 {\n    row-gap: 0.5rem !important;\n  }\n  .row-gap-xl-3 {\n    row-gap: 1rem !important;\n  }\n  .row-gap-xl-4 {\n    row-gap: 1.5rem !important;\n  }\n  .row-gap-xl-5 {\n    row-gap: 3rem !important;\n  }\n  .column-gap-xl-0 {\n    -moz-column-gap: 0 !important;\n    column-gap: 0 !important;\n  }\n  .column-gap-xl-1 {\n    -moz-column-gap: 0.25rem !important;\n    column-gap: 0.25rem !important;\n  }\n  .column-gap-xl-2 {\n    -moz-column-gap: 0.5rem !important;\n    column-gap: 0.5rem !important;\n  }\n  .column-gap-xl-3 {\n    -moz-column-gap: 1rem !important;\n    column-gap: 1rem !important;\n  }\n  .column-gap-xl-4 {\n    -moz-column-gap: 1.5rem !important;\n    column-gap: 1.5rem !important;\n  }\n  .column-gap-xl-5 {\n    -moz-column-gap: 3rem !important;\n    column-gap: 3rem !important;\n  }\n  .text-xl-start {\n    text-align: left !important;\n  }\n  .text-xl-end {\n    text-align: right !important;\n  }\n  .text-xl-center {\n    text-align: center !important;\n  }\n}\n@media (min-width: 1400px) {\n  .float-xxl-start {\n    float: left !important;\n  }\n  .float-xxl-end {\n    float: right !important;\n  }\n  .float-xxl-none {\n    float: none !important;\n  }\n  .object-fit-xxl-contain {\n    -o-object-fit: contain !important;\n    object-fit: contain !important;\n  }\n  .object-fit-xxl-cover {\n    -o-object-fit: cover !important;\n    object-fit: cover !important;\n  }\n  .object-fit-xxl-fill {\n    -o-object-fit: fill !important;\n    object-fit: fill !important;\n  }\n  .object-fit-xxl-scale {\n    -o-object-fit: scale-down !important;\n    object-fit: scale-down !important;\n  }\n  .object-fit-xxl-none {\n    -o-object-fit: none !important;\n    object-fit: none !important;\n  }\n  .d-xxl-inline {\n    display: inline !important;\n  }\n  .d-xxl-inline-block {\n    display: inline-block !important;\n  }\n  .d-xxl-block {\n    display: block !important;\n  }\n  .d-xxl-grid {\n    display: grid !important;\n  }\n  .d-xxl-inline-grid {\n    display: inline-grid !important;\n  }\n  .d-xxl-table {\n    display: table !important;\n  }\n  .d-xxl-table-row {\n    display: table-row !important;\n  }\n  .d-xxl-table-cell {\n    display: table-cell !important;\n  }\n  .d-xxl-flex {\n    display: flex !important;\n  }\n  .d-xxl-inline-flex {\n    display: inline-flex !important;\n  }\n  .d-xxl-none {\n    display: none !important;\n  }\n  .flex-xxl-fill {\n    flex: 1 1 auto !important;\n  }\n  .flex-xxl-row {\n    flex-direction: row !important;\n  }\n  .flex-xxl-column {\n    flex-direction: column !important;\n  }\n  .flex-xxl-row-reverse {\n    flex-direction: row-reverse !important;\n  }\n  .flex-xxl-column-reverse {\n    flex-direction: column-reverse !important;\n  }\n  .flex-xxl-grow-0 {\n    flex-grow: 0 !important;\n  }\n  .flex-xxl-grow-1 {\n    flex-grow: 1 !important;\n  }\n  .flex-xxl-shrink-0 {\n    flex-shrink: 0 !important;\n  }\n  .flex-xxl-shrink-1 {\n    flex-shrink: 1 !important;\n  }\n  .flex-xxl-wrap {\n    flex-wrap: wrap !important;\n  }\n  .flex-xxl-nowrap {\n    flex-wrap: nowrap !important;\n  }\n  .flex-xxl-wrap-reverse {\n    flex-wrap: wrap-reverse !important;\n  }\n  .justify-content-xxl-start {\n    justify-content: flex-start !important;\n  }\n  .justify-content-xxl-end {\n    justify-content: flex-end !important;\n  }\n  .justify-content-xxl-center {\n    justify-content: center !important;\n  }\n  .justify-content-xxl-between {\n    justify-content: space-between !important;\n  }\n  .justify-content-xxl-around {\n    justify-content: space-around !important;\n  }\n  .justify-content-xxl-evenly {\n    justify-content: space-evenly !important;\n  }\n  .align-items-xxl-start {\n    align-items: flex-start !important;\n  }\n  .align-items-xxl-end {\n    align-items: flex-end !important;\n  }\n  .align-items-xxl-center {\n    align-items: center !important;\n  }\n  .align-items-xxl-baseline {\n    align-items: baseline !important;\n  }\n  .align-items-xxl-stretch {\n    align-items: stretch !important;\n  }\n  .align-content-xxl-start {\n    align-content: flex-start !important;\n  }\n  .align-content-xxl-end {\n    align-content: flex-end !important;\n  }\n  .align-content-xxl-center {\n    align-content: center !important;\n  }\n  .align-content-xxl-between {\n    align-content: space-between !important;\n  }\n  .align-content-xxl-around {\n    align-content: space-around !important;\n  }\n  .align-content-xxl-stretch {\n    align-content: stretch !important;\n  }\n  .align-self-xxl-auto {\n    align-self: auto !important;\n  }\n  .align-self-xxl-start {\n    align-self: flex-start !important;\n  }\n  .align-self-xxl-end {\n    align-self: flex-end !important;\n  }\n  .align-self-xxl-center {\n    align-self: center !important;\n  }\n  .align-self-xxl-baseline {\n    align-self: baseline !important;\n  }\n  .align-self-xxl-stretch {\n    align-self: stretch !important;\n  }\n  .order-xxl-first {\n    order: -1 !important;\n  }\n  .order-xxl-0 {\n    order: 0 !important;\n  }\n  .order-xxl-1 {\n    order: 1 !important;\n  }\n  .order-xxl-2 {\n    order: 2 !important;\n  }\n  .order-xxl-3 {\n    order: 3 !important;\n  }\n  .order-xxl-4 {\n    order: 4 !important;\n  }\n  .order-xxl-5 {\n    order: 5 !important;\n  }\n  .order-xxl-last {\n    order: 6 !important;\n  }\n  .m-xxl-0 {\n    margin: 0 !important;\n  }\n  .m-xxl-1 {\n    margin: 0.25rem !important;\n  }\n  .m-xxl-2 {\n    margin: 0.5rem !important;\n  }\n  .m-xxl-3 {\n    margin: 1rem !important;\n  }\n  .m-xxl-4 {\n    margin: 1.5rem !important;\n  }\n  .m-xxl-5 {\n    margin: 3rem !important;\n  }\n  .m-xxl-auto {\n    margin: auto !important;\n  }\n  .mx-xxl-0 {\n    margin-right: 0 !important;\n    margin-left: 0 !important;\n  }\n  .mx-xxl-1 {\n    margin-right: 0.25rem !important;\n    margin-left: 0.25rem !important;\n  }\n  .mx-xxl-2 {\n    margin-right: 0.5rem !important;\n    margin-left: 0.5rem !important;\n  }\n  .mx-xxl-3 {\n    margin-right: 1rem !important;\n    margin-left: 1rem !important;\n  }\n  .mx-xxl-4 {\n    margin-right: 1.5rem !important;\n    margin-left: 1.5rem !important;\n  }\n  .mx-xxl-5 {\n    margin-right: 3rem !important;\n    margin-left: 3rem !important;\n  }\n  .mx-xxl-auto {\n    margin-right: auto !important;\n    margin-left: auto !important;\n  }\n  .my-xxl-0 {\n    margin-top: 0 !important;\n    margin-bottom: 0 !important;\n  }\n  .my-xxl-1 {\n    margin-top: 0.25rem !important;\n    margin-bottom: 0.25rem !important;\n  }\n  .my-xxl-2 {\n    margin-top: 0.5rem !important;\n    margin-bottom: 0.5rem !important;\n  }\n  .my-xxl-3 {\n    margin-top: 1rem !important;\n    margin-bottom: 1rem !important;\n  }\n  .my-xxl-4 {\n    margin-top: 1.5rem !important;\n    margin-bottom: 1.5rem !important;\n  }\n  .my-xxl-5 {\n    margin-top: 3rem !important;\n    margin-bottom: 3rem !important;\n  }\n  .my-xxl-auto {\n    margin-top: auto !important;\n    margin-bottom: auto !important;\n  }\n  .mt-xxl-0 {\n    margin-top: 0 !important;\n  }\n  .mt-xxl-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mt-xxl-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mt-xxl-3 {\n    margin-top: 1rem !important;\n  }\n  .mt-xxl-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mt-xxl-5 {\n    margin-top: 3rem !important;\n  }\n  .mt-xxl-auto {\n    margin-top: auto !important;\n  }\n  .me-xxl-0 {\n    margin-right: 0 !important;\n  }\n  .me-xxl-1 {\n    margin-right: 0.25rem !important;\n  }\n  .me-xxl-2 {\n    margin-right: 0.5rem !important;\n  }\n  .me-xxl-3 {\n    margin-right: 1rem !important;\n  }\n  .me-xxl-4 {\n    margin-right: 1.5rem !important;\n  }\n  .me-xxl-5 {\n    margin-right: 3rem !important;\n  }\n  .me-xxl-auto {\n    margin-right: auto !important;\n  }\n  .mb-xxl-0 {\n    margin-bottom: 0 !important;\n  }\n  .mb-xxl-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .mb-xxl-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .mb-xxl-3 {\n    margin-bottom: 1rem !important;\n  }\n  .mb-xxl-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .mb-xxl-5 {\n    margin-bottom: 3rem !important;\n  }\n  .mb-xxl-auto {\n    margin-bottom: auto !important;\n  }\n  .ms-xxl-0 {\n    margin-left: 0 !important;\n  }\n  .ms-xxl-1 {\n    margin-left: 0.25rem !important;\n  }\n  .ms-xxl-2 {\n    margin-left: 0.5rem !important;\n  }\n  .ms-xxl-3 {\n    margin-left: 1rem !important;\n  }\n  .ms-xxl-4 {\n    margin-left: 1.5rem !important;\n  }\n  .ms-xxl-5 {\n    margin-left: 3rem !important;\n  }\n  .ms-xxl-auto {\n    margin-left: auto !important;\n  }\n  .p-xxl-0 {\n    padding: 0 !important;\n  }\n  .p-xxl-1 {\n    padding: 0.25rem !important;\n  }\n  .p-xxl-2 {\n    padding: 0.5rem !important;\n  }\n  .p-xxl-3 {\n    padding: 1rem !important;\n  }\n  .p-xxl-4 {\n    padding: 1.5rem !important;\n  }\n  .p-xxl-5 {\n    padding: 3rem !important;\n  }\n  .px-xxl-0 {\n    padding-right: 0 !important;\n    padding-left: 0 !important;\n  }\n  .px-xxl-1 {\n    padding-right: 0.25rem !important;\n    padding-left: 0.25rem !important;\n  }\n  .px-xxl-2 {\n    padding-right: 0.5rem !important;\n    padding-left: 0.5rem !important;\n  }\n  .px-xxl-3 {\n    padding-right: 1rem !important;\n    padding-left: 1rem !important;\n  }\n  .px-xxl-4 {\n    padding-right: 1.5rem !important;\n    padding-left: 1.5rem !important;\n  }\n  .px-xxl-5 {\n    padding-right: 3rem !important;\n    padding-left: 3rem !important;\n  }\n  .py-xxl-0 {\n    padding-top: 0 !important;\n    padding-bottom: 0 !important;\n  }\n  .py-xxl-1 {\n    padding-top: 0.25rem !important;\n    padding-bottom: 0.25rem !important;\n  }\n  .py-xxl-2 {\n    padding-top: 0.5rem !important;\n    padding-bottom: 0.5rem !important;\n  }\n  .py-xxl-3 {\n    padding-top: 1rem !important;\n    padding-bottom: 1rem !important;\n  }\n  .py-xxl-4 {\n    padding-top: 1.5rem !important;\n    padding-bottom: 1.5rem !important;\n  }\n  .py-xxl-5 {\n    padding-top: 3rem !important;\n    padding-bottom: 3rem !important;\n  }\n  .pt-xxl-0 {\n    padding-top: 0 !important;\n  }\n  .pt-xxl-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pt-xxl-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pt-xxl-3 {\n    padding-top: 1rem !important;\n  }\n  .pt-xxl-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pt-xxl-5 {\n    padding-top: 3rem !important;\n  }\n  .pe-xxl-0 {\n    padding-right: 0 !important;\n  }\n  .pe-xxl-1 {\n    padding-right: 0.25rem !important;\n  }\n  .pe-xxl-2 {\n    padding-right: 0.5rem !important;\n  }\n  .pe-xxl-3 {\n    padding-right: 1rem !important;\n  }\n  .pe-xxl-4 {\n    padding-right: 1.5rem !important;\n  }\n  .pe-xxl-5 {\n    padding-right: 3rem !important;\n  }\n  .pb-xxl-0 {\n    padding-bottom: 0 !important;\n  }\n  .pb-xxl-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pb-xxl-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pb-xxl-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pb-xxl-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pb-xxl-5 {\n    padding-bottom: 3rem !important;\n  }\n  .ps-xxl-0 {\n    padding-left: 0 !important;\n  }\n  .ps-xxl-1 {\n    padding-left: 0.25rem !important;\n  }\n  .ps-xxl-2 {\n    padding-left: 0.5rem !important;\n  }\n  .ps-xxl-3 {\n    padding-left: 1rem !important;\n  }\n  .ps-xxl-4 {\n    padding-left: 1.5rem !important;\n  }\n  .ps-xxl-5 {\n    padding-left: 3rem !important;\n  }\n  .gap-xxl-0 {\n    gap: 0 !important;\n  }\n  .gap-xxl-1 {\n    gap: 0.25rem !important;\n  }\n  .gap-xxl-2 {\n    gap: 0.5rem !important;\n  }\n  .gap-xxl-3 {\n    gap: 1rem !important;\n  }\n  .gap-xxl-4 {\n    gap: 1.5rem !important;\n  }\n  .gap-xxl-5 {\n    gap: 3rem !important;\n  }\n  .row-gap-xxl-0 {\n    row-gap: 0 !important;\n  }\n  .row-gap-xxl-1 {\n    row-gap: 0.25rem !important;\n  }\n  .row-gap-xxl-2 {\n    row-gap: 0.5rem !important;\n  }\n  .row-gap-xxl-3 {\n    row-gap: 1rem !important;\n  }\n  .row-gap-xxl-4 {\n    row-gap: 1.5rem !important;\n  }\n  .row-gap-xxl-5 {\n    row-gap: 3rem !important;\n  }\n  .column-gap-xxl-0 {\n    -moz-column-gap: 0 !important;\n    column-gap: 0 !important;\n  }\n  .column-gap-xxl-1 {\n    -moz-column-gap: 0.25rem !important;\n    column-gap: 0.25rem !important;\n  }\n  .column-gap-xxl-2 {\n    -moz-column-gap: 0.5rem !important;\n    column-gap: 0.5rem !important;\n  }\n  .column-gap-xxl-3 {\n    -moz-column-gap: 1rem !important;\n    column-gap: 1rem !important;\n  }\n  .column-gap-xxl-4 {\n    -moz-column-gap: 1.5rem !important;\n    column-gap: 1.5rem !important;\n  }\n  .column-gap-xxl-5 {\n    -moz-column-gap: 3rem !important;\n    column-gap: 3rem !important;\n  }\n  .text-xxl-start {\n    text-align: left !important;\n  }\n  .text-xxl-end {\n    text-align: right !important;\n  }\n  .text-xxl-center {\n    text-align: center !important;\n  }\n}\n@media (min-width: 1200px) {\n  .fs-1 {\n    font-size: 2.5rem !important;\n  }\n  .fs-2 {\n    font-size: 2rem !important;\n  }\n  .fs-3 {\n    font-size: 1.75rem !important;\n  }\n  .fs-4 {\n    font-size: 1.5rem !important;\n  }\n}\n@media print {\n  .d-print-inline {\n    display: inline !important;\n  }\n  .d-print-inline-block {\n    display: inline-block !important;\n  }\n  .d-print-block {\n    display: block !important;\n  }\n  .d-print-grid {\n    display: grid !important;\n  }\n  .d-print-inline-grid {\n    display: inline-grid !important;\n  }\n  .d-print-table {\n    display: table !important;\n  }\n  .d-print-table-row {\n    display: table-row !important;\n  }\n  .d-print-table-cell {\n    display: table-cell !important;\n  }\n  .d-print-flex {\n    display: flex !important;\n  }\n  .d-print-inline-flex {\n    display: inline-flex !important;\n  }\n  .d-print-none {\n    display: none !important;\n  }\n}\n\n/*# sourceMappingURL=bootstrap.css.map */"
  },
  {
    "path": "dist/css/bootstrap.rtl.css",
    "content": "@charset \"UTF-8\";\n/*!\n * Bootstrap  v5.3.8 (https://getbootstrap.com/)\n * Copyright 2011-2025 The Bootstrap Authors\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n:root,\n[data-bs-theme=light] {\n  --bs-blue: #0d6efd;\n  --bs-indigo: #6610f2;\n  --bs-purple: #6f42c1;\n  --bs-pink: #d63384;\n  --bs-red: #dc3545;\n  --bs-orange: #fd7e14;\n  --bs-yellow: #ffc107;\n  --bs-green: #198754;\n  --bs-teal: #20c997;\n  --bs-cyan: #0dcaf0;\n  --bs-black: #000;\n  --bs-white: #fff;\n  --bs-gray: #6c757d;\n  --bs-gray-dark: #343a40;\n  --bs-gray-100: #f8f9fa;\n  --bs-gray-200: #e9ecef;\n  --bs-gray-300: #dee2e6;\n  --bs-gray-400: #ced4da;\n  --bs-gray-500: #adb5bd;\n  --bs-gray-600: #6c757d;\n  --bs-gray-700: #495057;\n  --bs-gray-800: #343a40;\n  --bs-gray-900: #212529;\n  --bs-primary: #0d6efd;\n  --bs-secondary: #6c757d;\n  --bs-success: #198754;\n  --bs-info: #0dcaf0;\n  --bs-warning: #ffc107;\n  --bs-danger: #dc3545;\n  --bs-light: #f8f9fa;\n  --bs-dark: #212529;\n  --bs-primary-rgb: 13, 110, 253;\n  --bs-secondary-rgb: 108, 117, 125;\n  --bs-success-rgb: 25, 135, 84;\n  --bs-info-rgb: 13, 202, 240;\n  --bs-warning-rgb: 255, 193, 7;\n  --bs-danger-rgb: 220, 53, 69;\n  --bs-light-rgb: 248, 249, 250;\n  --bs-dark-rgb: 33, 37, 41;\n  --bs-primary-text-emphasis: #052c65;\n  --bs-secondary-text-emphasis: #2b2f32;\n  --bs-success-text-emphasis: #0a3622;\n  --bs-info-text-emphasis: #055160;\n  --bs-warning-text-emphasis: #664d03;\n  --bs-danger-text-emphasis: #58151c;\n  --bs-light-text-emphasis: #495057;\n  --bs-dark-text-emphasis: #495057;\n  --bs-primary-bg-subtle: #cfe2ff;\n  --bs-secondary-bg-subtle: #e2e3e5;\n  --bs-success-bg-subtle: #d1e7dd;\n  --bs-info-bg-subtle: #cff4fc;\n  --bs-warning-bg-subtle: #fff3cd;\n  --bs-danger-bg-subtle: #f8d7da;\n  --bs-light-bg-subtle: #fcfcfd;\n  --bs-dark-bg-subtle: #ced4da;\n  --bs-primary-border-subtle: #9ec5fe;\n  --bs-secondary-border-subtle: #c4c8cb;\n  --bs-success-border-subtle: #a3cfbb;\n  --bs-info-border-subtle: #9eeaf9;\n  --bs-warning-border-subtle: #ffe69c;\n  --bs-danger-border-subtle: #f1aeb5;\n  --bs-light-border-subtle: #e9ecef;\n  --bs-dark-border-subtle: #adb5bd;\n  --bs-white-rgb: 255, 255, 255;\n  --bs-black-rgb: 0, 0, 0;\n  --bs-font-sans-serif: system-ui, -apple-system, \"Segoe UI\", Roboto, \"Helvetica Neue\", \"Noto Sans\", \"Liberation Sans\", Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n  --bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n  --bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));\n  --bs-body-font-family: var(--bs-font-sans-serif);\n  --bs-body-font-size: 1rem;\n  --bs-body-font-weight: 400;\n  --bs-body-line-height: 1.5;\n  --bs-body-color: #212529;\n  --bs-body-color-rgb: 33, 37, 41;\n  --bs-body-bg: #fff;\n  --bs-body-bg-rgb: 255, 255, 255;\n  --bs-emphasis-color: #000;\n  --bs-emphasis-color-rgb: 0, 0, 0;\n  --bs-secondary-color: rgba(33, 37, 41, 0.75);\n  --bs-secondary-color-rgb: 33, 37, 41;\n  --bs-secondary-bg: #e9ecef;\n  --bs-secondary-bg-rgb: 233, 236, 239;\n  --bs-tertiary-color: rgba(33, 37, 41, 0.5);\n  --bs-tertiary-color-rgb: 33, 37, 41;\n  --bs-tertiary-bg: #f8f9fa;\n  --bs-tertiary-bg-rgb: 248, 249, 250;\n  --bs-heading-color: inherit;\n  --bs-link-color: #0d6efd;\n  --bs-link-color-rgb: 13, 110, 253;\n  --bs-link-decoration: underline;\n  --bs-link-hover-color: #0a58ca;\n  --bs-link-hover-color-rgb: 10, 88, 202;\n  --bs-code-color: #d63384;\n  --bs-highlight-color: #212529;\n  --bs-highlight-bg: #fff3cd;\n  --bs-border-width: 1px;\n  --bs-border-style: solid;\n  --bs-border-color: #dee2e6;\n  --bs-border-color-translucent: rgba(0, 0, 0, 0.175);\n  --bs-border-radius: 0.375rem;\n  --bs-border-radius-sm: 0.25rem;\n  --bs-border-radius-lg: 0.5rem;\n  --bs-border-radius-xl: 1rem;\n  --bs-border-radius-xxl: 2rem;\n  --bs-border-radius-2xl: var(--bs-border-radius-xxl);\n  --bs-border-radius-pill: 50rem;\n  --bs-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);\n  --bs-box-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);\n  --bs-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175);\n  --bs-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075);\n  --bs-focus-ring-width: 0.25rem;\n  --bs-focus-ring-opacity: 0.25;\n  --bs-focus-ring-color: rgba(13, 110, 253, 0.25);\n  --bs-form-valid-color: #198754;\n  --bs-form-valid-border-color: #198754;\n  --bs-form-invalid-color: #dc3545;\n  --bs-form-invalid-border-color: #dc3545;\n}\n\n[data-bs-theme=dark] {\n  color-scheme: dark;\n  --bs-body-color: #dee2e6;\n  --bs-body-color-rgb: 222, 226, 230;\n  --bs-body-bg: #212529;\n  --bs-body-bg-rgb: 33, 37, 41;\n  --bs-emphasis-color: #fff;\n  --bs-emphasis-color-rgb: 255, 255, 255;\n  --bs-secondary-color: rgba(222, 226, 230, 0.75);\n  --bs-secondary-color-rgb: 222, 226, 230;\n  --bs-secondary-bg: #343a40;\n  --bs-secondary-bg-rgb: 52, 58, 64;\n  --bs-tertiary-color: rgba(222, 226, 230, 0.5);\n  --bs-tertiary-color-rgb: 222, 226, 230;\n  --bs-tertiary-bg: #2b3035;\n  --bs-tertiary-bg-rgb: 43, 48, 53;\n  --bs-primary-text-emphasis: #6ea8fe;\n  --bs-secondary-text-emphasis: #a7acb1;\n  --bs-success-text-emphasis: #75b798;\n  --bs-info-text-emphasis: #6edff6;\n  --bs-warning-text-emphasis: #ffda6a;\n  --bs-danger-text-emphasis: #ea868f;\n  --bs-light-text-emphasis: #f8f9fa;\n  --bs-dark-text-emphasis: #dee2e6;\n  --bs-primary-bg-subtle: #031633;\n  --bs-secondary-bg-subtle: #161719;\n  --bs-success-bg-subtle: #051b11;\n  --bs-info-bg-subtle: #032830;\n  --bs-warning-bg-subtle: #332701;\n  --bs-danger-bg-subtle: #2c0b0e;\n  --bs-light-bg-subtle: #343a40;\n  --bs-dark-bg-subtle: #1a1d20;\n  --bs-primary-border-subtle: #084298;\n  --bs-secondary-border-subtle: #41464b;\n  --bs-success-border-subtle: #0f5132;\n  --bs-info-border-subtle: #087990;\n  --bs-warning-border-subtle: #997404;\n  --bs-danger-border-subtle: #842029;\n  --bs-light-border-subtle: #495057;\n  --bs-dark-border-subtle: #343a40;\n  --bs-heading-color: inherit;\n  --bs-link-color: #6ea8fe;\n  --bs-link-hover-color: #8bb9fe;\n  --bs-link-color-rgb: 110, 168, 254;\n  --bs-link-hover-color-rgb: 139, 185, 254;\n  --bs-code-color: #e685b5;\n  --bs-highlight-color: #dee2e6;\n  --bs-highlight-bg: #664d03;\n  --bs-border-color: #495057;\n  --bs-border-color-translucent: rgba(255, 255, 255, 0.15);\n  --bs-form-valid-color: #75b798;\n  --bs-form-valid-border-color: #75b798;\n  --bs-form-invalid-color: #ea868f;\n  --bs-form-invalid-border-color: #ea868f;\n}\n\n*,\n*::before,\n*::after {\n  box-sizing: border-box;\n}\n\n@media (prefers-reduced-motion: no-preference) {\n  :root {\n    scroll-behavior: smooth;\n  }\n}\n\nbody {\n  margin: 0;\n  font-family: var(--bs-body-font-family);\n  font-size: var(--bs-body-font-size);\n  font-weight: var(--bs-body-font-weight);\n  line-height: var(--bs-body-line-height);\n  color: var(--bs-body-color);\n  text-align: var(--bs-body-text-align);\n  background-color: var(--bs-body-bg);\n  -webkit-text-size-adjust: 100%;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\nhr {\n  margin: 1rem 0;\n  color: inherit;\n  border: 0;\n  border-top: var(--bs-border-width) solid;\n  opacity: 0.25;\n}\n\nh6, .h6, h5, .h5, h4, .h4, h3, .h3, h2, .h2, h1, .h1 {\n  margin-top: 0;\n  margin-bottom: 0.5rem;\n  font-weight: 500;\n  line-height: 1.2;\n  color: var(--bs-heading-color);\n}\n\nh1, .h1 {\n  font-size: calc(1.375rem + 1.5vw);\n}\n@media (min-width: 1200px) {\n  h1, .h1 {\n    font-size: 2.5rem;\n  }\n}\n\nh2, .h2 {\n  font-size: calc(1.325rem + 0.9vw);\n}\n@media (min-width: 1200px) {\n  h2, .h2 {\n    font-size: 2rem;\n  }\n}\n\nh3, .h3 {\n  font-size: calc(1.3rem + 0.6vw);\n}\n@media (min-width: 1200px) {\n  h3, .h3 {\n    font-size: 1.75rem;\n  }\n}\n\nh4, .h4 {\n  font-size: calc(1.275rem + 0.3vw);\n}\n@media (min-width: 1200px) {\n  h4, .h4 {\n    font-size: 1.5rem;\n  }\n}\n\nh5, .h5 {\n  font-size: 1.25rem;\n}\n\nh6, .h6 {\n  font-size: 1rem;\n}\n\np {\n  margin-top: 0;\n  margin-bottom: 1rem;\n}\n\nabbr[title] {\n  -webkit-text-decoration: underline dotted;\n  text-decoration: underline dotted;\n  cursor: help;\n  -webkit-text-decoration-skip-ink: none;\n  text-decoration-skip-ink: none;\n}\n\naddress {\n  margin-bottom: 1rem;\n  font-style: normal;\n  line-height: inherit;\n}\n\nol,\nul {\n  padding-right: 2rem;\n}\n\nol,\nul,\ndl {\n  margin-top: 0;\n  margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n  margin-bottom: 0;\n}\n\ndt {\n  font-weight: 700;\n}\n\ndd {\n  margin-bottom: 0.5rem;\n  margin-right: 0;\n}\n\nblockquote {\n  margin: 0 0 1rem;\n}\n\nb,\nstrong {\n  font-weight: bolder;\n}\n\nsmall, .small {\n  font-size: 0.875em;\n}\n\nmark, .mark {\n  padding: 0.1875em;\n  color: var(--bs-highlight-color);\n  background-color: var(--bs-highlight-bg);\n}\n\nsub,\nsup {\n  position: relative;\n  font-size: 0.75em;\n  line-height: 0;\n  vertical-align: baseline;\n}\n\nsub {\n  bottom: -0.25em;\n}\n\nsup {\n  top: -0.5em;\n}\n\na {\n  color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 1));\n  text-decoration: underline;\n}\na:hover {\n  --bs-link-color-rgb: var(--bs-link-hover-color-rgb);\n}\n\na:not([href]):not([class]), a:not([href]):not([class]):hover {\n  color: inherit;\n  text-decoration: none;\n}\n\npre,\ncode,\nkbd,\nsamp {\n  font-family: var(--bs-font-monospace);\n  font-size: 1em;\n}\n\npre {\n  display: block;\n  margin-top: 0;\n  margin-bottom: 1rem;\n  overflow: auto;\n  font-size: 0.875em;\n}\npre code {\n  font-size: inherit;\n  color: inherit;\n  word-break: normal;\n}\n\ncode {\n  font-size: 0.875em;\n  color: var(--bs-code-color);\n  word-wrap: break-word;\n}\na > code {\n  color: inherit;\n}\n\nkbd {\n  padding: 0.1875rem 0.375rem;\n  font-size: 0.875em;\n  color: var(--bs-body-bg);\n  background-color: var(--bs-body-color);\n  border-radius: 0.25rem;\n}\nkbd kbd {\n  padding: 0;\n  font-size: 1em;\n}\n\nfigure {\n  margin: 0 0 1rem;\n}\n\nimg,\nsvg {\n  vertical-align: middle;\n}\n\ntable {\n  caption-side: bottom;\n  border-collapse: collapse;\n}\n\ncaption {\n  padding-top: 0.5rem;\n  padding-bottom: 0.5rem;\n  color: var(--bs-secondary-color);\n  text-align: right;\n}\n\nth {\n  text-align: inherit;\n  text-align: -webkit-match-parent;\n}\n\nthead,\ntbody,\ntfoot,\ntr,\ntd,\nth {\n  border-color: inherit;\n  border-style: solid;\n  border-width: 0;\n}\n\nlabel {\n  display: inline-block;\n}\n\nbutton {\n  border-radius: 0;\n}\n\nbutton:focus:not(:focus-visible) {\n  outline: 0;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n  margin: 0;\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\n\nbutton,\nselect {\n  text-transform: none;\n}\n\n[role=button] {\n  cursor: pointer;\n}\n\nselect {\n  word-wrap: normal;\n}\nselect:disabled {\n  opacity: 1;\n}\n\n[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator {\n  display: none !important;\n}\n\nbutton,\n[type=button],\n[type=reset],\n[type=submit] {\n  -webkit-appearance: button;\n}\nbutton:not(:disabled),\n[type=button]:not(:disabled),\n[type=reset]:not(:disabled),\n[type=submit]:not(:disabled) {\n  cursor: pointer;\n}\n\n::-moz-focus-inner {\n  padding: 0;\n  border-style: none;\n}\n\ntextarea {\n  resize: vertical;\n}\n\nfieldset {\n  min-width: 0;\n  padding: 0;\n  margin: 0;\n  border: 0;\n}\n\nlegend {\n  float: right;\n  width: 100%;\n  padding: 0;\n  margin-bottom: 0.5rem;\n  line-height: inherit;\n  font-size: calc(1.275rem + 0.3vw);\n}\n@media (min-width: 1200px) {\n  legend {\n    font-size: 1.5rem;\n  }\n}\nlegend + * {\n  clear: right;\n}\n\n::-webkit-datetime-edit-fields-wrapper,\n::-webkit-datetime-edit-text,\n::-webkit-datetime-edit-minute,\n::-webkit-datetime-edit-hour-field,\n::-webkit-datetime-edit-day-field,\n::-webkit-datetime-edit-month-field,\n::-webkit-datetime-edit-year-field {\n  padding: 0;\n}\n\n::-webkit-inner-spin-button {\n  height: auto;\n}\n\n[type=search] {\n  -webkit-appearance: textfield;\n  outline-offset: -2px;\n}\n[type=search]::-webkit-search-cancel-button {\n  cursor: pointer;\n  filter: grayscale(1);\n}\n\n[type=\"tel\"],\n[type=\"url\"],\n[type=\"email\"],\n[type=\"number\"] {\n  direction: ltr;\n}\n::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\n\n::-webkit-color-swatch-wrapper {\n  padding: 0;\n}\n\n::-webkit-file-upload-button {\n  font: inherit;\n  -webkit-appearance: button;\n}\n\n::file-selector-button {\n  font: inherit;\n  -webkit-appearance: button;\n}\n\noutput {\n  display: inline-block;\n}\n\niframe {\n  border: 0;\n}\n\nsummary {\n  display: list-item;\n  cursor: pointer;\n}\n\nprogress {\n  vertical-align: baseline;\n}\n\n[hidden] {\n  display: none !important;\n}\n\n.lead {\n  font-size: 1.25rem;\n  font-weight: 300;\n}\n\n.display-1 {\n  font-weight: 300;\n  line-height: 1.2;\n  font-size: calc(1.625rem + 4.5vw);\n}\n@media (min-width: 1200px) {\n  .display-1 {\n    font-size: 5rem;\n  }\n}\n\n.display-2 {\n  font-weight: 300;\n  line-height: 1.2;\n  font-size: calc(1.575rem + 3.9vw);\n}\n@media (min-width: 1200px) {\n  .display-2 {\n    font-size: 4.5rem;\n  }\n}\n\n.display-3 {\n  font-weight: 300;\n  line-height: 1.2;\n  font-size: calc(1.525rem + 3.3vw);\n}\n@media (min-width: 1200px) {\n  .display-3 {\n    font-size: 4rem;\n  }\n}\n\n.display-4 {\n  font-weight: 300;\n  line-height: 1.2;\n  font-size: calc(1.475rem + 2.7vw);\n}\n@media (min-width: 1200px) {\n  .display-4 {\n    font-size: 3.5rem;\n  }\n}\n\n.display-5 {\n  font-weight: 300;\n  line-height: 1.2;\n  font-size: calc(1.425rem + 2.1vw);\n}\n@media (min-width: 1200px) {\n  .display-5 {\n    font-size: 3rem;\n  }\n}\n\n.display-6 {\n  font-weight: 300;\n  line-height: 1.2;\n  font-size: calc(1.375rem + 1.5vw);\n}\n@media (min-width: 1200px) {\n  .display-6 {\n    font-size: 2.5rem;\n  }\n}\n\n.list-unstyled {\n  padding-right: 0;\n  list-style: none;\n}\n\n.list-inline {\n  padding-right: 0;\n  list-style: none;\n}\n\n.list-inline-item {\n  display: inline-block;\n}\n.list-inline-item:not(:last-child) {\n  margin-left: 0.5rem;\n}\n\n.initialism {\n  font-size: 0.875em;\n  text-transform: uppercase;\n}\n\n.blockquote {\n  margin-bottom: 1rem;\n  font-size: 1.25rem;\n}\n.blockquote > :last-child {\n  margin-bottom: 0;\n}\n\n.blockquote-footer {\n  margin-top: -1rem;\n  margin-bottom: 1rem;\n  font-size: 0.875em;\n  color: #6c757d;\n}\n.blockquote-footer::before {\n  content: \"— \";\n}\n\n.img-fluid {\n  max-width: 100%;\n  height: auto;\n}\n\n.img-thumbnail {\n  padding: 0.25rem;\n  background-color: var(--bs-body-bg);\n  border: var(--bs-border-width) solid var(--bs-border-color);\n  border-radius: var(--bs-border-radius);\n  max-width: 100%;\n  height: auto;\n}\n\n.figure {\n  display: inline-block;\n}\n\n.figure-img {\n  margin-bottom: 0.5rem;\n  line-height: 1;\n}\n\n.figure-caption {\n  font-size: 0.875em;\n  color: var(--bs-secondary-color);\n}\n\n.container,\n.container-fluid,\n.container-xxl,\n.container-xl,\n.container-lg,\n.container-md,\n.container-sm {\n  --bs-gutter-x: 1.5rem;\n  --bs-gutter-y: 0;\n  width: 100%;\n  padding-left: calc(var(--bs-gutter-x) * 0.5);\n  padding-right: calc(var(--bs-gutter-x) * 0.5);\n  margin-left: auto;\n  margin-right: auto;\n}\n\n@media (min-width: 576px) {\n  .container-sm, .container {\n    max-width: 540px;\n  }\n}\n@media (min-width: 768px) {\n  .container-md, .container-sm, .container {\n    max-width: 720px;\n  }\n}\n@media (min-width: 992px) {\n  .container-lg, .container-md, .container-sm, .container {\n    max-width: 960px;\n  }\n}\n@media (min-width: 1200px) {\n  .container-xl, .container-lg, .container-md, .container-sm, .container {\n    max-width: 1140px;\n  }\n}\n@media (min-width: 1400px) {\n  .container-xxl, .container-xl, .container-lg, .container-md, .container-sm, .container {\n    max-width: 1320px;\n  }\n}\n:root {\n  --bs-breakpoint-xs: 0;\n  --bs-breakpoint-sm: 576px;\n  --bs-breakpoint-md: 768px;\n  --bs-breakpoint-lg: 992px;\n  --bs-breakpoint-xl: 1200px;\n  --bs-breakpoint-xxl: 1400px;\n}\n\n.row {\n  --bs-gutter-x: 1.5rem;\n  --bs-gutter-y: 0;\n  display: flex;\n  flex-wrap: wrap;\n  margin-top: calc(-1 * var(--bs-gutter-y));\n  margin-left: calc(-0.5 * var(--bs-gutter-x));\n  margin-right: calc(-0.5 * var(--bs-gutter-x));\n}\n.row > * {\n  flex-shrink: 0;\n  width: 100%;\n  max-width: 100%;\n  padding-left: calc(var(--bs-gutter-x) * 0.5);\n  padding-right: calc(var(--bs-gutter-x) * 0.5);\n  margin-top: var(--bs-gutter-y);\n}\n\n.col {\n  flex: 1 0 0;\n}\n\n.row-cols-auto > * {\n  flex: 0 0 auto;\n  width: auto;\n}\n\n.row-cols-1 > * {\n  flex: 0 0 auto;\n  width: 100%;\n}\n\n.row-cols-2 > * {\n  flex: 0 0 auto;\n  width: 50%;\n}\n\n.row-cols-3 > * {\n  flex: 0 0 auto;\n  width: 33.33333333%;\n}\n\n.row-cols-4 > * {\n  flex: 0 0 auto;\n  width: 25%;\n}\n\n.row-cols-5 > * {\n  flex: 0 0 auto;\n  width: 20%;\n}\n\n.row-cols-6 > * {\n  flex: 0 0 auto;\n  width: 16.66666667%;\n}\n\n.col-auto {\n  flex: 0 0 auto;\n  width: auto;\n}\n\n.col-1 {\n  flex: 0 0 auto;\n  width: 8.33333333%;\n}\n\n.col-2 {\n  flex: 0 0 auto;\n  width: 16.66666667%;\n}\n\n.col-3 {\n  flex: 0 0 auto;\n  width: 25%;\n}\n\n.col-4 {\n  flex: 0 0 auto;\n  width: 33.33333333%;\n}\n\n.col-5 {\n  flex: 0 0 auto;\n  width: 41.66666667%;\n}\n\n.col-6 {\n  flex: 0 0 auto;\n  width: 50%;\n}\n\n.col-7 {\n  flex: 0 0 auto;\n  width: 58.33333333%;\n}\n\n.col-8 {\n  flex: 0 0 auto;\n  width: 66.66666667%;\n}\n\n.col-9 {\n  flex: 0 0 auto;\n  width: 75%;\n}\n\n.col-10 {\n  flex: 0 0 auto;\n  width: 83.33333333%;\n}\n\n.col-11 {\n  flex: 0 0 auto;\n  width: 91.66666667%;\n}\n\n.col-12 {\n  flex: 0 0 auto;\n  width: 100%;\n}\n\n.offset-1 {\n  margin-right: 8.33333333%;\n}\n\n.offset-2 {\n  margin-right: 16.66666667%;\n}\n\n.offset-3 {\n  margin-right: 25%;\n}\n\n.offset-4 {\n  margin-right: 33.33333333%;\n}\n\n.offset-5 {\n  margin-right: 41.66666667%;\n}\n\n.offset-6 {\n  margin-right: 50%;\n}\n\n.offset-7 {\n  margin-right: 58.33333333%;\n}\n\n.offset-8 {\n  margin-right: 66.66666667%;\n}\n\n.offset-9 {\n  margin-right: 75%;\n}\n\n.offset-10 {\n  margin-right: 83.33333333%;\n}\n\n.offset-11 {\n  margin-right: 91.66666667%;\n}\n\n.g-0,\n.gx-0 {\n  --bs-gutter-x: 0;\n}\n\n.g-0,\n.gy-0 {\n  --bs-gutter-y: 0;\n}\n\n.g-1,\n.gx-1 {\n  --bs-gutter-x: 0.25rem;\n}\n\n.g-1,\n.gy-1 {\n  --bs-gutter-y: 0.25rem;\n}\n\n.g-2,\n.gx-2 {\n  --bs-gutter-x: 0.5rem;\n}\n\n.g-2,\n.gy-2 {\n  --bs-gutter-y: 0.5rem;\n}\n\n.g-3,\n.gx-3 {\n  --bs-gutter-x: 1rem;\n}\n\n.g-3,\n.gy-3 {\n  --bs-gutter-y: 1rem;\n}\n\n.g-4,\n.gx-4 {\n  --bs-gutter-x: 1.5rem;\n}\n\n.g-4,\n.gy-4 {\n  --bs-gutter-y: 1.5rem;\n}\n\n.g-5,\n.gx-5 {\n  --bs-gutter-x: 3rem;\n}\n\n.g-5,\n.gy-5 {\n  --bs-gutter-y: 3rem;\n}\n\n@media (min-width: 576px) {\n  .col-sm {\n    flex: 1 0 0;\n  }\n  .row-cols-sm-auto > * {\n    flex: 0 0 auto;\n    width: auto;\n  }\n  .row-cols-sm-1 > * {\n    flex: 0 0 auto;\n    width: 100%;\n  }\n  .row-cols-sm-2 > * {\n    flex: 0 0 auto;\n    width: 50%;\n  }\n  .row-cols-sm-3 > * {\n    flex: 0 0 auto;\n    width: 33.33333333%;\n  }\n  .row-cols-sm-4 > * {\n    flex: 0 0 auto;\n    width: 25%;\n  }\n  .row-cols-sm-5 > * {\n    flex: 0 0 auto;\n    width: 20%;\n  }\n  .row-cols-sm-6 > * {\n    flex: 0 0 auto;\n    width: 16.66666667%;\n  }\n  .col-sm-auto {\n    flex: 0 0 auto;\n    width: auto;\n  }\n  .col-sm-1 {\n    flex: 0 0 auto;\n    width: 8.33333333%;\n  }\n  .col-sm-2 {\n    flex: 0 0 auto;\n    width: 16.66666667%;\n  }\n  .col-sm-3 {\n    flex: 0 0 auto;\n    width: 25%;\n  }\n  .col-sm-4 {\n    flex: 0 0 auto;\n    width: 33.33333333%;\n  }\n  .col-sm-5 {\n    flex: 0 0 auto;\n    width: 41.66666667%;\n  }\n  .col-sm-6 {\n    flex: 0 0 auto;\n    width: 50%;\n  }\n  .col-sm-7 {\n    flex: 0 0 auto;\n    width: 58.33333333%;\n  }\n  .col-sm-8 {\n    flex: 0 0 auto;\n    width: 66.66666667%;\n  }\n  .col-sm-9 {\n    flex: 0 0 auto;\n    width: 75%;\n  }\n  .col-sm-10 {\n    flex: 0 0 auto;\n    width: 83.33333333%;\n  }\n  .col-sm-11 {\n    flex: 0 0 auto;\n    width: 91.66666667%;\n  }\n  .col-sm-12 {\n    flex: 0 0 auto;\n    width: 100%;\n  }\n  .offset-sm-0 {\n    margin-right: 0;\n  }\n  .offset-sm-1 {\n    margin-right: 8.33333333%;\n  }\n  .offset-sm-2 {\n    margin-right: 16.66666667%;\n  }\n  .offset-sm-3 {\n    margin-right: 25%;\n  }\n  .offset-sm-4 {\n    margin-right: 33.33333333%;\n  }\n  .offset-sm-5 {\n    margin-right: 41.66666667%;\n  }\n  .offset-sm-6 {\n    margin-right: 50%;\n  }\n  .offset-sm-7 {\n    margin-right: 58.33333333%;\n  }\n  .offset-sm-8 {\n    margin-right: 66.66666667%;\n  }\n  .offset-sm-9 {\n    margin-right: 75%;\n  }\n  .offset-sm-10 {\n    margin-right: 83.33333333%;\n  }\n  .offset-sm-11 {\n    margin-right: 91.66666667%;\n  }\n  .g-sm-0,\n  .gx-sm-0 {\n    --bs-gutter-x: 0;\n  }\n  .g-sm-0,\n  .gy-sm-0 {\n    --bs-gutter-y: 0;\n  }\n  .g-sm-1,\n  .gx-sm-1 {\n    --bs-gutter-x: 0.25rem;\n  }\n  .g-sm-1,\n  .gy-sm-1 {\n    --bs-gutter-y: 0.25rem;\n  }\n  .g-sm-2,\n  .gx-sm-2 {\n    --bs-gutter-x: 0.5rem;\n  }\n  .g-sm-2,\n  .gy-sm-2 {\n    --bs-gutter-y: 0.5rem;\n  }\n  .g-sm-3,\n  .gx-sm-3 {\n    --bs-gutter-x: 1rem;\n  }\n  .g-sm-3,\n  .gy-sm-3 {\n    --bs-gutter-y: 1rem;\n  }\n  .g-sm-4,\n  .gx-sm-4 {\n    --bs-gutter-x: 1.5rem;\n  }\n  .g-sm-4,\n  .gy-sm-4 {\n    --bs-gutter-y: 1.5rem;\n  }\n  .g-sm-5,\n  .gx-sm-5 {\n    --bs-gutter-x: 3rem;\n  }\n  .g-sm-5,\n  .gy-sm-5 {\n    --bs-gutter-y: 3rem;\n  }\n}\n@media (min-width: 768px) {\n  .col-md {\n    flex: 1 0 0;\n  }\n  .row-cols-md-auto > * {\n    flex: 0 0 auto;\n    width: auto;\n  }\n  .row-cols-md-1 > * {\n    flex: 0 0 auto;\n    width: 100%;\n  }\n  .row-cols-md-2 > * {\n    flex: 0 0 auto;\n    width: 50%;\n  }\n  .row-cols-md-3 > * {\n    flex: 0 0 auto;\n    width: 33.33333333%;\n  }\n  .row-cols-md-4 > * {\n    flex: 0 0 auto;\n    width: 25%;\n  }\n  .row-cols-md-5 > * {\n    flex: 0 0 auto;\n    width: 20%;\n  }\n  .row-cols-md-6 > * {\n    flex: 0 0 auto;\n    width: 16.66666667%;\n  }\n  .col-md-auto {\n    flex: 0 0 auto;\n    width: auto;\n  }\n  .col-md-1 {\n    flex: 0 0 auto;\n    width: 8.33333333%;\n  }\n  .col-md-2 {\n    flex: 0 0 auto;\n    width: 16.66666667%;\n  }\n  .col-md-3 {\n    flex: 0 0 auto;\n    width: 25%;\n  }\n  .col-md-4 {\n    flex: 0 0 auto;\n    width: 33.33333333%;\n  }\n  .col-md-5 {\n    flex: 0 0 auto;\n    width: 41.66666667%;\n  }\n  .col-md-6 {\n    flex: 0 0 auto;\n    width: 50%;\n  }\n  .col-md-7 {\n    flex: 0 0 auto;\n    width: 58.33333333%;\n  }\n  .col-md-8 {\n    flex: 0 0 auto;\n    width: 66.66666667%;\n  }\n  .col-md-9 {\n    flex: 0 0 auto;\n    width: 75%;\n  }\n  .col-md-10 {\n    flex: 0 0 auto;\n    width: 83.33333333%;\n  }\n  .col-md-11 {\n    flex: 0 0 auto;\n    width: 91.66666667%;\n  }\n  .col-md-12 {\n    flex: 0 0 auto;\n    width: 100%;\n  }\n  .offset-md-0 {\n    margin-right: 0;\n  }\n  .offset-md-1 {\n    margin-right: 8.33333333%;\n  }\n  .offset-md-2 {\n    margin-right: 16.66666667%;\n  }\n  .offset-md-3 {\n    margin-right: 25%;\n  }\n  .offset-md-4 {\n    margin-right: 33.33333333%;\n  }\n  .offset-md-5 {\n    margin-right: 41.66666667%;\n  }\n  .offset-md-6 {\n    margin-right: 50%;\n  }\n  .offset-md-7 {\n    margin-right: 58.33333333%;\n  }\n  .offset-md-8 {\n    margin-right: 66.66666667%;\n  }\n  .offset-md-9 {\n    margin-right: 75%;\n  }\n  .offset-md-10 {\n    margin-right: 83.33333333%;\n  }\n  .offset-md-11 {\n    margin-right: 91.66666667%;\n  }\n  .g-md-0,\n  .gx-md-0 {\n    --bs-gutter-x: 0;\n  }\n  .g-md-0,\n  .gy-md-0 {\n    --bs-gutter-y: 0;\n  }\n  .g-md-1,\n  .gx-md-1 {\n    --bs-gutter-x: 0.25rem;\n  }\n  .g-md-1,\n  .gy-md-1 {\n    --bs-gutter-y: 0.25rem;\n  }\n  .g-md-2,\n  .gx-md-2 {\n    --bs-gutter-x: 0.5rem;\n  }\n  .g-md-2,\n  .gy-md-2 {\n    --bs-gutter-y: 0.5rem;\n  }\n  .g-md-3,\n  .gx-md-3 {\n    --bs-gutter-x: 1rem;\n  }\n  .g-md-3,\n  .gy-md-3 {\n    --bs-gutter-y: 1rem;\n  }\n  .g-md-4,\n  .gx-md-4 {\n    --bs-gutter-x: 1.5rem;\n  }\n  .g-md-4,\n  .gy-md-4 {\n    --bs-gutter-y: 1.5rem;\n  }\n  .g-md-5,\n  .gx-md-5 {\n    --bs-gutter-x: 3rem;\n  }\n  .g-md-5,\n  .gy-md-5 {\n    --bs-gutter-y: 3rem;\n  }\n}\n@media (min-width: 992px) {\n  .col-lg {\n    flex: 1 0 0;\n  }\n  .row-cols-lg-auto > * {\n    flex: 0 0 auto;\n    width: auto;\n  }\n  .row-cols-lg-1 > * {\n    flex: 0 0 auto;\n    width: 100%;\n  }\n  .row-cols-lg-2 > * {\n    flex: 0 0 auto;\n    width: 50%;\n  }\n  .row-cols-lg-3 > * {\n    flex: 0 0 auto;\n    width: 33.33333333%;\n  }\n  .row-cols-lg-4 > * {\n    flex: 0 0 auto;\n    width: 25%;\n  }\n  .row-cols-lg-5 > * {\n    flex: 0 0 auto;\n    width: 20%;\n  }\n  .row-cols-lg-6 > * {\n    flex: 0 0 auto;\n    width: 16.66666667%;\n  }\n  .col-lg-auto {\n    flex: 0 0 auto;\n    width: auto;\n  }\n  .col-lg-1 {\n    flex: 0 0 auto;\n    width: 8.33333333%;\n  }\n  .col-lg-2 {\n    flex: 0 0 auto;\n    width: 16.66666667%;\n  }\n  .col-lg-3 {\n    flex: 0 0 auto;\n    width: 25%;\n  }\n  .col-lg-4 {\n    flex: 0 0 auto;\n    width: 33.33333333%;\n  }\n  .col-lg-5 {\n    flex: 0 0 auto;\n    width: 41.66666667%;\n  }\n  .col-lg-6 {\n    flex: 0 0 auto;\n    width: 50%;\n  }\n  .col-lg-7 {\n    flex: 0 0 auto;\n    width: 58.33333333%;\n  }\n  .col-lg-8 {\n    flex: 0 0 auto;\n    width: 66.66666667%;\n  }\n  .col-lg-9 {\n    flex: 0 0 auto;\n    width: 75%;\n  }\n  .col-lg-10 {\n    flex: 0 0 auto;\n    width: 83.33333333%;\n  }\n  .col-lg-11 {\n    flex: 0 0 auto;\n    width: 91.66666667%;\n  }\n  .col-lg-12 {\n    flex: 0 0 auto;\n    width: 100%;\n  }\n  .offset-lg-0 {\n    margin-right: 0;\n  }\n  .offset-lg-1 {\n    margin-right: 8.33333333%;\n  }\n  .offset-lg-2 {\n    margin-right: 16.66666667%;\n  }\n  .offset-lg-3 {\n    margin-right: 25%;\n  }\n  .offset-lg-4 {\n    margin-right: 33.33333333%;\n  }\n  .offset-lg-5 {\n    margin-right: 41.66666667%;\n  }\n  .offset-lg-6 {\n    margin-right: 50%;\n  }\n  .offset-lg-7 {\n    margin-right: 58.33333333%;\n  }\n  .offset-lg-8 {\n    margin-right: 66.66666667%;\n  }\n  .offset-lg-9 {\n    margin-right: 75%;\n  }\n  .offset-lg-10 {\n    margin-right: 83.33333333%;\n  }\n  .offset-lg-11 {\n    margin-right: 91.66666667%;\n  }\n  .g-lg-0,\n  .gx-lg-0 {\n    --bs-gutter-x: 0;\n  }\n  .g-lg-0,\n  .gy-lg-0 {\n    --bs-gutter-y: 0;\n  }\n  .g-lg-1,\n  .gx-lg-1 {\n    --bs-gutter-x: 0.25rem;\n  }\n  .g-lg-1,\n  .gy-lg-1 {\n    --bs-gutter-y: 0.25rem;\n  }\n  .g-lg-2,\n  .gx-lg-2 {\n    --bs-gutter-x: 0.5rem;\n  }\n  .g-lg-2,\n  .gy-lg-2 {\n    --bs-gutter-y: 0.5rem;\n  }\n  .g-lg-3,\n  .gx-lg-3 {\n    --bs-gutter-x: 1rem;\n  }\n  .g-lg-3,\n  .gy-lg-3 {\n    --bs-gutter-y: 1rem;\n  }\n  .g-lg-4,\n  .gx-lg-4 {\n    --bs-gutter-x: 1.5rem;\n  }\n  .g-lg-4,\n  .gy-lg-4 {\n    --bs-gutter-y: 1.5rem;\n  }\n  .g-lg-5,\n  .gx-lg-5 {\n    --bs-gutter-x: 3rem;\n  }\n  .g-lg-5,\n  .gy-lg-5 {\n    --bs-gutter-y: 3rem;\n  }\n}\n@media (min-width: 1200px) {\n  .col-xl {\n    flex: 1 0 0;\n  }\n  .row-cols-xl-auto > * {\n    flex: 0 0 auto;\n    width: auto;\n  }\n  .row-cols-xl-1 > * {\n    flex: 0 0 auto;\n    width: 100%;\n  }\n  .row-cols-xl-2 > * {\n    flex: 0 0 auto;\n    width: 50%;\n  }\n  .row-cols-xl-3 > * {\n    flex: 0 0 auto;\n    width: 33.33333333%;\n  }\n  .row-cols-xl-4 > * {\n    flex: 0 0 auto;\n    width: 25%;\n  }\n  .row-cols-xl-5 > * {\n    flex: 0 0 auto;\n    width: 20%;\n  }\n  .row-cols-xl-6 > * {\n    flex: 0 0 auto;\n    width: 16.66666667%;\n  }\n  .col-xl-auto {\n    flex: 0 0 auto;\n    width: auto;\n  }\n  .col-xl-1 {\n    flex: 0 0 auto;\n    width: 8.33333333%;\n  }\n  .col-xl-2 {\n    flex: 0 0 auto;\n    width: 16.66666667%;\n  }\n  .col-xl-3 {\n    flex: 0 0 auto;\n    width: 25%;\n  }\n  .col-xl-4 {\n    flex: 0 0 auto;\n    width: 33.33333333%;\n  }\n  .col-xl-5 {\n    flex: 0 0 auto;\n    width: 41.66666667%;\n  }\n  .col-xl-6 {\n    flex: 0 0 auto;\n    width: 50%;\n  }\n  .col-xl-7 {\n    flex: 0 0 auto;\n    width: 58.33333333%;\n  }\n  .col-xl-8 {\n    flex: 0 0 auto;\n    width: 66.66666667%;\n  }\n  .col-xl-9 {\n    flex: 0 0 auto;\n    width: 75%;\n  }\n  .col-xl-10 {\n    flex: 0 0 auto;\n    width: 83.33333333%;\n  }\n  .col-xl-11 {\n    flex: 0 0 auto;\n    width: 91.66666667%;\n  }\n  .col-xl-12 {\n    flex: 0 0 auto;\n    width: 100%;\n  }\n  .offset-xl-0 {\n    margin-right: 0;\n  }\n  .offset-xl-1 {\n    margin-right: 8.33333333%;\n  }\n  .offset-xl-2 {\n    margin-right: 16.66666667%;\n  }\n  .offset-xl-3 {\n    margin-right: 25%;\n  }\n  .offset-xl-4 {\n    margin-right: 33.33333333%;\n  }\n  .offset-xl-5 {\n    margin-right: 41.66666667%;\n  }\n  .offset-xl-6 {\n    margin-right: 50%;\n  }\n  .offset-xl-7 {\n    margin-right: 58.33333333%;\n  }\n  .offset-xl-8 {\n    margin-right: 66.66666667%;\n  }\n  .offset-xl-9 {\n    margin-right: 75%;\n  }\n  .offset-xl-10 {\n    margin-right: 83.33333333%;\n  }\n  .offset-xl-11 {\n    margin-right: 91.66666667%;\n  }\n  .g-xl-0,\n  .gx-xl-0 {\n    --bs-gutter-x: 0;\n  }\n  .g-xl-0,\n  .gy-xl-0 {\n    --bs-gutter-y: 0;\n  }\n  .g-xl-1,\n  .gx-xl-1 {\n    --bs-gutter-x: 0.25rem;\n  }\n  .g-xl-1,\n  .gy-xl-1 {\n    --bs-gutter-y: 0.25rem;\n  }\n  .g-xl-2,\n  .gx-xl-2 {\n    --bs-gutter-x: 0.5rem;\n  }\n  .g-xl-2,\n  .gy-xl-2 {\n    --bs-gutter-y: 0.5rem;\n  }\n  .g-xl-3,\n  .gx-xl-3 {\n    --bs-gutter-x: 1rem;\n  }\n  .g-xl-3,\n  .gy-xl-3 {\n    --bs-gutter-y: 1rem;\n  }\n  .g-xl-4,\n  .gx-xl-4 {\n    --bs-gutter-x: 1.5rem;\n  }\n  .g-xl-4,\n  .gy-xl-4 {\n    --bs-gutter-y: 1.5rem;\n  }\n  .g-xl-5,\n  .gx-xl-5 {\n    --bs-gutter-x: 3rem;\n  }\n  .g-xl-5,\n  .gy-xl-5 {\n    --bs-gutter-y: 3rem;\n  }\n}\n@media (min-width: 1400px) {\n  .col-xxl {\n    flex: 1 0 0;\n  }\n  .row-cols-xxl-auto > * {\n    flex: 0 0 auto;\n    width: auto;\n  }\n  .row-cols-xxl-1 > * {\n    flex: 0 0 auto;\n    width: 100%;\n  }\n  .row-cols-xxl-2 > * {\n    flex: 0 0 auto;\n    width: 50%;\n  }\n  .row-cols-xxl-3 > * {\n    flex: 0 0 auto;\n    width: 33.33333333%;\n  }\n  .row-cols-xxl-4 > * {\n    flex: 0 0 auto;\n    width: 25%;\n  }\n  .row-cols-xxl-5 > * {\n    flex: 0 0 auto;\n    width: 20%;\n  }\n  .row-cols-xxl-6 > * {\n    flex: 0 0 auto;\n    width: 16.66666667%;\n  }\n  .col-xxl-auto {\n    flex: 0 0 auto;\n    width: auto;\n  }\n  .col-xxl-1 {\n    flex: 0 0 auto;\n    width: 8.33333333%;\n  }\n  .col-xxl-2 {\n    flex: 0 0 auto;\n    width: 16.66666667%;\n  }\n  .col-xxl-3 {\n    flex: 0 0 auto;\n    width: 25%;\n  }\n  .col-xxl-4 {\n    flex: 0 0 auto;\n    width: 33.33333333%;\n  }\n  .col-xxl-5 {\n    flex: 0 0 auto;\n    width: 41.66666667%;\n  }\n  .col-xxl-6 {\n    flex: 0 0 auto;\n    width: 50%;\n  }\n  .col-xxl-7 {\n    flex: 0 0 auto;\n    width: 58.33333333%;\n  }\n  .col-xxl-8 {\n    flex: 0 0 auto;\n    width: 66.66666667%;\n  }\n  .col-xxl-9 {\n    flex: 0 0 auto;\n    width: 75%;\n  }\n  .col-xxl-10 {\n    flex: 0 0 auto;\n    width: 83.33333333%;\n  }\n  .col-xxl-11 {\n    flex: 0 0 auto;\n    width: 91.66666667%;\n  }\n  .col-xxl-12 {\n    flex: 0 0 auto;\n    width: 100%;\n  }\n  .offset-xxl-0 {\n    margin-right: 0;\n  }\n  .offset-xxl-1 {\n    margin-right: 8.33333333%;\n  }\n  .offset-xxl-2 {\n    margin-right: 16.66666667%;\n  }\n  .offset-xxl-3 {\n    margin-right: 25%;\n  }\n  .offset-xxl-4 {\n    margin-right: 33.33333333%;\n  }\n  .offset-xxl-5 {\n    margin-right: 41.66666667%;\n  }\n  .offset-xxl-6 {\n    margin-right: 50%;\n  }\n  .offset-xxl-7 {\n    margin-right: 58.33333333%;\n  }\n  .offset-xxl-8 {\n    margin-right: 66.66666667%;\n  }\n  .offset-xxl-9 {\n    margin-right: 75%;\n  }\n  .offset-xxl-10 {\n    margin-right: 83.33333333%;\n  }\n  .offset-xxl-11 {\n    margin-right: 91.66666667%;\n  }\n  .g-xxl-0,\n  .gx-xxl-0 {\n    --bs-gutter-x: 0;\n  }\n  .g-xxl-0,\n  .gy-xxl-0 {\n    --bs-gutter-y: 0;\n  }\n  .g-xxl-1,\n  .gx-xxl-1 {\n    --bs-gutter-x: 0.25rem;\n  }\n  .g-xxl-1,\n  .gy-xxl-1 {\n    --bs-gutter-y: 0.25rem;\n  }\n  .g-xxl-2,\n  .gx-xxl-2 {\n    --bs-gutter-x: 0.5rem;\n  }\n  .g-xxl-2,\n  .gy-xxl-2 {\n    --bs-gutter-y: 0.5rem;\n  }\n  .g-xxl-3,\n  .gx-xxl-3 {\n    --bs-gutter-x: 1rem;\n  }\n  .g-xxl-3,\n  .gy-xxl-3 {\n    --bs-gutter-y: 1rem;\n  }\n  .g-xxl-4,\n  .gx-xxl-4 {\n    --bs-gutter-x: 1.5rem;\n  }\n  .g-xxl-4,\n  .gy-xxl-4 {\n    --bs-gutter-y: 1.5rem;\n  }\n  .g-xxl-5,\n  .gx-xxl-5 {\n    --bs-gutter-x: 3rem;\n  }\n  .g-xxl-5,\n  .gy-xxl-5 {\n    --bs-gutter-y: 3rem;\n  }\n}\n.table {\n  --bs-table-color-type: initial;\n  --bs-table-bg-type: initial;\n  --bs-table-color-state: initial;\n  --bs-table-bg-state: initial;\n  --bs-table-color: var(--bs-emphasis-color);\n  --bs-table-bg: var(--bs-body-bg);\n  --bs-table-border-color: var(--bs-border-color);\n  --bs-table-accent-bg: transparent;\n  --bs-table-striped-color: var(--bs-emphasis-color);\n  --bs-table-striped-bg: rgba(var(--bs-emphasis-color-rgb), 0.05);\n  --bs-table-active-color: var(--bs-emphasis-color);\n  --bs-table-active-bg: rgba(var(--bs-emphasis-color-rgb), 0.1);\n  --bs-table-hover-color: var(--bs-emphasis-color);\n  --bs-table-hover-bg: rgba(var(--bs-emphasis-color-rgb), 0.075);\n  width: 100%;\n  margin-bottom: 1rem;\n  vertical-align: top;\n  border-color: var(--bs-table-border-color);\n}\n.table > :not(caption) > * > * {\n  padding: 0.5rem 0.5rem;\n  color: var(--bs-table-color-state, var(--bs-table-color-type, var(--bs-table-color)));\n  background-color: var(--bs-table-bg);\n  border-bottom-width: var(--bs-border-width);\n  box-shadow: inset 0 0 0 9999px var(--bs-table-bg-state, var(--bs-table-bg-type, var(--bs-table-accent-bg)));\n}\n.table > tbody {\n  vertical-align: inherit;\n}\n.table > thead {\n  vertical-align: bottom;\n}\n\n.table-group-divider {\n  border-top: calc(var(--bs-border-width) * 2) solid currentcolor;\n}\n\n.caption-top {\n  caption-side: top;\n}\n\n.table-sm > :not(caption) > * > * {\n  padding: 0.25rem 0.25rem;\n}\n\n.table-bordered > :not(caption) > * {\n  border-width: var(--bs-border-width) 0;\n}\n.table-bordered > :not(caption) > * > * {\n  border-width: 0 var(--bs-border-width);\n}\n\n.table-borderless > :not(caption) > * > * {\n  border-bottom-width: 0;\n}\n.table-borderless > :not(:first-child) {\n  border-top-width: 0;\n}\n\n.table-striped > tbody > tr:nth-of-type(odd) > * {\n  --bs-table-color-type: var(--bs-table-striped-color);\n  --bs-table-bg-type: var(--bs-table-striped-bg);\n}\n\n.table-striped-columns > :not(caption) > tr > :nth-child(even) {\n  --bs-table-color-type: var(--bs-table-striped-color);\n  --bs-table-bg-type: var(--bs-table-striped-bg);\n}\n\n.table-active {\n  --bs-table-color-state: var(--bs-table-active-color);\n  --bs-table-bg-state: var(--bs-table-active-bg);\n}\n\n.table-hover > tbody > tr:hover > * {\n  --bs-table-color-state: var(--bs-table-hover-color);\n  --bs-table-bg-state: var(--bs-table-hover-bg);\n}\n\n.table-primary {\n  --bs-table-color: #000;\n  --bs-table-bg: #cfe2ff;\n  --bs-table-border-color: #a6b5cc;\n  --bs-table-striped-bg: #c5d7f2;\n  --bs-table-striped-color: #000;\n  --bs-table-active-bg: #bacbe6;\n  --bs-table-active-color: #000;\n  --bs-table-hover-bg: #bfd1ec;\n  --bs-table-hover-color: #000;\n  color: var(--bs-table-color);\n  border-color: var(--bs-table-border-color);\n}\n\n.table-secondary {\n  --bs-table-color: #000;\n  --bs-table-bg: #e2e3e5;\n  --bs-table-border-color: #b5b6b7;\n  --bs-table-striped-bg: #d7d8da;\n  --bs-table-striped-color: #000;\n  --bs-table-active-bg: #cbccce;\n  --bs-table-active-color: #000;\n  --bs-table-hover-bg: #d1d2d4;\n  --bs-table-hover-color: #000;\n  color: var(--bs-table-color);\n  border-color: var(--bs-table-border-color);\n}\n\n.table-success {\n  --bs-table-color: #000;\n  --bs-table-bg: #d1e7dd;\n  --bs-table-border-color: #a7b9b1;\n  --bs-table-striped-bg: #c7dbd2;\n  --bs-table-striped-color: #000;\n  --bs-table-active-bg: #bcd0c7;\n  --bs-table-active-color: #000;\n  --bs-table-hover-bg: #c1d6cc;\n  --bs-table-hover-color: #000;\n  color: var(--bs-table-color);\n  border-color: var(--bs-table-border-color);\n}\n\n.table-info {\n  --bs-table-color: #000;\n  --bs-table-bg: #cff4fc;\n  --bs-table-border-color: #a6c3ca;\n  --bs-table-striped-bg: #c5e8ef;\n  --bs-table-striped-color: #000;\n  --bs-table-active-bg: #badce3;\n  --bs-table-active-color: #000;\n  --bs-table-hover-bg: #bfe2e9;\n  --bs-table-hover-color: #000;\n  color: var(--bs-table-color);\n  border-color: var(--bs-table-border-color);\n}\n\n.table-warning {\n  --bs-table-color: #000;\n  --bs-table-bg: #fff3cd;\n  --bs-table-border-color: #ccc2a4;\n  --bs-table-striped-bg: #f2e7c3;\n  --bs-table-striped-color: #000;\n  --bs-table-active-bg: #e6dbb9;\n  --bs-table-active-color: #000;\n  --bs-table-hover-bg: #ece1be;\n  --bs-table-hover-color: #000;\n  color: var(--bs-table-color);\n  border-color: var(--bs-table-border-color);\n}\n\n.table-danger {\n  --bs-table-color: #000;\n  --bs-table-bg: #f8d7da;\n  --bs-table-border-color: #c6acae;\n  --bs-table-striped-bg: #eccccf;\n  --bs-table-striped-color: #000;\n  --bs-table-active-bg: #dfc2c4;\n  --bs-table-active-color: #000;\n  --bs-table-hover-bg: #e5c7ca;\n  --bs-table-hover-color: #000;\n  color: var(--bs-table-color);\n  border-color: var(--bs-table-border-color);\n}\n\n.table-light {\n  --bs-table-color: #000;\n  --bs-table-bg: #f8f9fa;\n  --bs-table-border-color: #c6c7c8;\n  --bs-table-striped-bg: #ecedee;\n  --bs-table-striped-color: #000;\n  --bs-table-active-bg: #dfe0e1;\n  --bs-table-active-color: #000;\n  --bs-table-hover-bg: #e5e6e7;\n  --bs-table-hover-color: #000;\n  color: var(--bs-table-color);\n  border-color: var(--bs-table-border-color);\n}\n\n.table-dark {\n  --bs-table-color: #fff;\n  --bs-table-bg: #212529;\n  --bs-table-border-color: #4d5154;\n  --bs-table-striped-bg: #2c3034;\n  --bs-table-striped-color: #fff;\n  --bs-table-active-bg: #373b3e;\n  --bs-table-active-color: #fff;\n  --bs-table-hover-bg: #323539;\n  --bs-table-hover-color: #fff;\n  color: var(--bs-table-color);\n  border-color: var(--bs-table-border-color);\n}\n\n.table-responsive {\n  overflow-x: auto;\n  -webkit-overflow-scrolling: touch;\n}\n\n@media (max-width: 575.98px) {\n  .table-responsive-sm {\n    overflow-x: auto;\n    -webkit-overflow-scrolling: touch;\n  }\n}\n@media (max-width: 767.98px) {\n  .table-responsive-md {\n    overflow-x: auto;\n    -webkit-overflow-scrolling: touch;\n  }\n}\n@media (max-width: 991.98px) {\n  .table-responsive-lg {\n    overflow-x: auto;\n    -webkit-overflow-scrolling: touch;\n  }\n}\n@media (max-width: 1199.98px) {\n  .table-responsive-xl {\n    overflow-x: auto;\n    -webkit-overflow-scrolling: touch;\n  }\n}\n@media (max-width: 1399.98px) {\n  .table-responsive-xxl {\n    overflow-x: auto;\n    -webkit-overflow-scrolling: touch;\n  }\n}\n.form-label {\n  margin-bottom: 0.5rem;\n}\n\n.col-form-label {\n  padding-top: calc(0.375rem + var(--bs-border-width));\n  padding-bottom: calc(0.375rem + var(--bs-border-width));\n  margin-bottom: 0;\n  font-size: inherit;\n  line-height: 1.5;\n}\n\n.col-form-label-lg {\n  padding-top: calc(0.5rem + var(--bs-border-width));\n  padding-bottom: calc(0.5rem + var(--bs-border-width));\n  font-size: 1.25rem;\n}\n\n.col-form-label-sm {\n  padding-top: calc(0.25rem + var(--bs-border-width));\n  padding-bottom: calc(0.25rem + var(--bs-border-width));\n  font-size: 0.875rem;\n}\n\n.form-text {\n  margin-top: 0.25rem;\n  font-size: 0.875em;\n  color: var(--bs-secondary-color);\n}\n\n.form-control {\n  display: block;\n  width: 100%;\n  padding: 0.375rem 0.75rem;\n  font-size: 1rem;\n  font-weight: 400;\n  line-height: 1.5;\n  color: var(--bs-body-color);\n  -webkit-appearance: none;\n  -moz-appearance: none;\n  appearance: none;\n  background-color: var(--bs-body-bg);\n  background-clip: padding-box;\n  border: var(--bs-border-width) solid var(--bs-border-color);\n  border-radius: var(--bs-border-radius);\n  transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n  .form-control {\n    transition: none;\n  }\n}\n.form-control[type=file] {\n  overflow: hidden;\n}\n.form-control[type=file]:not(:disabled):not([readonly]) {\n  cursor: pointer;\n}\n.form-control:focus {\n  color: var(--bs-body-color);\n  background-color: var(--bs-body-bg);\n  border-color: #86b7fe;\n  outline: 0;\n  box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n}\n.form-control::-webkit-date-and-time-value {\n  min-width: 85px;\n  height: 1.5em;\n  margin: 0;\n}\n.form-control::-webkit-datetime-edit {\n  display: block;\n  padding: 0;\n}\n.form-control::placeholder {\n  color: var(--bs-secondary-color);\n  opacity: 1;\n}\n.form-control:disabled {\n  background-color: var(--bs-secondary-bg);\n  opacity: 1;\n}\n.form-control::-webkit-file-upload-button {\n  padding: 0.375rem 0.75rem;\n  margin: -0.375rem -0.75rem;\n  -webkit-margin-end: 0.75rem;\n  margin-inline-end: 0.75rem;\n  color: var(--bs-body-color);\n  background-color: var(--bs-tertiary-bg);\n  pointer-events: none;\n  border-color: inherit;\n  border-style: solid;\n  border-width: 0;\n  border-inline-end-width: var(--bs-border-width);\n  border-radius: 0;\n  -webkit-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n  transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n.form-control::file-selector-button {\n  padding: 0.375rem 0.75rem;\n  margin: -0.375rem -0.75rem;\n  -webkit-margin-end: 0.75rem;\n  margin-inline-end: 0.75rem;\n  color: var(--bs-body-color);\n  background-color: var(--bs-tertiary-bg);\n  pointer-events: none;\n  border-color: inherit;\n  border-style: solid;\n  border-width: 0;\n  border-inline-end-width: var(--bs-border-width);\n  border-radius: 0;\n  transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n  .form-control::-webkit-file-upload-button {\n    -webkit-transition: none;\n    transition: none;\n  }\n  .form-control::file-selector-button {\n    transition: none;\n  }\n}\n.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button {\n  background-color: var(--bs-secondary-bg);\n}\n.form-control:hover:not(:disabled):not([readonly])::file-selector-button {\n  background-color: var(--bs-secondary-bg);\n}\n\n.form-control-plaintext {\n  display: block;\n  width: 100%;\n  padding: 0.375rem 0;\n  margin-bottom: 0;\n  line-height: 1.5;\n  color: var(--bs-body-color);\n  background-color: transparent;\n  border: solid transparent;\n  border-width: var(--bs-border-width) 0;\n}\n.form-control-plaintext:focus {\n  outline: 0;\n}\n.form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg {\n  padding-left: 0;\n  padding-right: 0;\n}\n\n.form-control-sm {\n  min-height: calc(1.5em + 0.5rem + calc(var(--bs-border-width) * 2));\n  padding: 0.25rem 0.5rem;\n  font-size: 0.875rem;\n  border-radius: var(--bs-border-radius-sm);\n}\n.form-control-sm::-webkit-file-upload-button {\n  padding: 0.25rem 0.5rem;\n  margin: -0.25rem -0.5rem;\n  -webkit-margin-end: 0.5rem;\n  margin-inline-end: 0.5rem;\n}\n.form-control-sm::file-selector-button {\n  padding: 0.25rem 0.5rem;\n  margin: -0.25rem -0.5rem;\n  -webkit-margin-end: 0.5rem;\n  margin-inline-end: 0.5rem;\n}\n\n.form-control-lg {\n  min-height: calc(1.5em + 1rem + calc(var(--bs-border-width) * 2));\n  padding: 0.5rem 1rem;\n  font-size: 1.25rem;\n  border-radius: var(--bs-border-radius-lg);\n}\n.form-control-lg::-webkit-file-upload-button {\n  padding: 0.5rem 1rem;\n  margin: -0.5rem -1rem;\n  -webkit-margin-end: 1rem;\n  margin-inline-end: 1rem;\n}\n.form-control-lg::file-selector-button {\n  padding: 0.5rem 1rem;\n  margin: -0.5rem -1rem;\n  -webkit-margin-end: 1rem;\n  margin-inline-end: 1rem;\n}\n\ntextarea.form-control {\n  min-height: calc(1.5em + 0.75rem + calc(var(--bs-border-width) * 2));\n}\ntextarea.form-control-sm {\n  min-height: calc(1.5em + 0.5rem + calc(var(--bs-border-width) * 2));\n}\ntextarea.form-control-lg {\n  min-height: calc(1.5em + 1rem + calc(var(--bs-border-width) * 2));\n}\n\n.form-control-color {\n  width: 3rem;\n  height: calc(1.5em + 0.75rem + calc(var(--bs-border-width) * 2));\n  padding: 0.375rem;\n}\n.form-control-color:not(:disabled):not([readonly]) {\n  cursor: pointer;\n}\n.form-control-color::-moz-color-swatch {\n  border: 0 !important;\n  border-radius: var(--bs-border-radius);\n}\n.form-control-color::-webkit-color-swatch {\n  border: 0 !important;\n  border-radius: var(--bs-border-radius);\n}\n.form-control-color.form-control-sm {\n  height: calc(1.5em + 0.5rem + calc(var(--bs-border-width) * 2));\n}\n.form-control-color.form-control-lg {\n  height: calc(1.5em + 1rem + calc(var(--bs-border-width) * 2));\n}\n\n.form-select {\n  --bs-form-select-bg-img: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e\");\n  display: block;\n  width: 100%;\n  padding: 0.375rem 0.75rem 0.375rem 2.25rem;\n  font-size: 1rem;\n  font-weight: 400;\n  line-height: 1.5;\n  color: var(--bs-body-color);\n  -webkit-appearance: none;\n  -moz-appearance: none;\n  appearance: none;\n  background-color: var(--bs-body-bg);\n  background-image: var(--bs-form-select-bg-img), var(--bs-form-select-bg-icon, none);\n  background-repeat: no-repeat;\n  background-position: left 0.75rem center;\n  background-size: 16px 12px;\n  border: var(--bs-border-width) solid var(--bs-border-color);\n  border-radius: var(--bs-border-radius);\n  transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n  .form-select {\n    transition: none;\n  }\n}\n.form-select:focus {\n  border-color: #86b7fe;\n  outline: 0;\n  box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n}\n.form-select[multiple], .form-select[size]:not([size=\"1\"]) {\n  padding-left: 0.75rem;\n  background-image: none;\n}\n.form-select:disabled {\n  background-color: var(--bs-secondary-bg);\n}\n.form-select:-moz-focusring {\n  color: transparent;\n  text-shadow: 0 0 0 var(--bs-body-color);\n}\n\n.form-select-sm {\n  padding-top: 0.25rem;\n  padding-bottom: 0.25rem;\n  padding-right: 0.5rem;\n  font-size: 0.875rem;\n  border-radius: var(--bs-border-radius-sm);\n}\n\n.form-select-lg {\n  padding-top: 0.5rem;\n  padding-bottom: 0.5rem;\n  padding-right: 1rem;\n  font-size: 1.25rem;\n  border-radius: var(--bs-border-radius-lg);\n}\n\n[data-bs-theme=dark] .form-select {\n  --bs-form-select-bg-img: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23dee2e6' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e\");\n}\n\n.form-check {\n  display: block;\n  min-height: 1.5rem;\n  padding-right: 1.5em;\n  margin-bottom: 0.125rem;\n}\n.form-check .form-check-input {\n  float: right;\n  margin-right: -1.5em;\n}\n\n.form-check-reverse {\n  padding-left: 1.5em;\n  padding-right: 0;\n  text-align: left;\n}\n.form-check-reverse .form-check-input {\n  float: left;\n  margin-left: -1.5em;\n  margin-right: 0;\n}\n\n.form-check-input {\n  --bs-form-check-bg: var(--bs-body-bg);\n  flex-shrink: 0;\n  width: 1em;\n  height: 1em;\n  margin-top: 0.25em;\n  vertical-align: top;\n  -webkit-appearance: none;\n  -moz-appearance: none;\n  appearance: none;\n  background-color: var(--bs-form-check-bg);\n  background-image: var(--bs-form-check-bg-image);\n  background-repeat: no-repeat;\n  background-position: center;\n  background-size: contain;\n  border: var(--bs-border-width) solid var(--bs-border-color);\n  -webkit-print-color-adjust: exact;\n  color-adjust: exact;\n  print-color-adjust: exact;\n}\n.form-check-input[type=checkbox] {\n  border-radius: 0.25em;\n}\n.form-check-input[type=radio] {\n  border-radius: 50%;\n}\n.form-check-input:active {\n  filter: brightness(90%);\n}\n.form-check-input:focus {\n  border-color: #86b7fe;\n  outline: 0;\n  box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n}\n.form-check-input:checked {\n  background-color: #0d6efd;\n  border-color: #0d6efd;\n}\n.form-check-input:checked[type=checkbox] {\n  --bs-form-check-bg-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e\");\n}\n.form-check-input:checked[type=radio] {\n  --bs-form-check-bg-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e\");\n}\n.form-check-input[type=checkbox]:indeterminate {\n  background-color: #0d6efd;\n  border-color: #0d6efd;\n  --bs-form-check-bg-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e\");\n}\n.form-check-input:disabled {\n  pointer-events: none;\n  filter: none;\n  opacity: 0.5;\n}\n.form-check-input[disabled] ~ .form-check-label, .form-check-input:disabled ~ .form-check-label {\n  cursor: default;\n  opacity: 0.5;\n}\n\n.form-switch {\n  padding-right: 2.5em;\n}\n.form-switch .form-check-input {\n  --bs-form-switch-bg: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e\");\n  width: 2em;\n  margin-right: -2.5em;\n  background-image: var(--bs-form-switch-bg);\n  background-position: right center;\n  border-radius: 2em;\n  transition: background-position 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n  .form-switch .form-check-input {\n    transition: none;\n  }\n}\n.form-switch .form-check-input:focus {\n  --bs-form-switch-bg: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2386b7fe'/%3e%3c/svg%3e\");\n}\n.form-switch .form-check-input:checked {\n  background-position: left center;\n  --bs-form-switch-bg: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e\");\n}\n.form-switch.form-check-reverse {\n  padding-left: 2.5em;\n  padding-right: 0;\n}\n.form-switch.form-check-reverse .form-check-input {\n  margin-left: -2.5em;\n  margin-right: 0;\n}\n\n.form-check-inline {\n  display: inline-block;\n  margin-left: 1rem;\n}\n\n.btn-check {\n  position: absolute;\n  clip: rect(0, 0, 0, 0);\n  pointer-events: none;\n}\n.btn-check[disabled] + .btn, .btn-check:disabled + .btn {\n  pointer-events: none;\n  filter: none;\n  opacity: 0.65;\n}\n\n[data-bs-theme=dark] .form-switch .form-check-input:not(:checked):not(:focus) {\n  --bs-form-switch-bg: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%28255, 255, 255, 0.25%29'/%3e%3c/svg%3e\");\n}\n\n.form-range {\n  width: 100%;\n  height: 1.5rem;\n  padding: 0;\n  -webkit-appearance: none;\n  -moz-appearance: none;\n  appearance: none;\n  background-color: transparent;\n}\n.form-range:focus {\n  outline: 0;\n}\n.form-range:focus::-webkit-slider-thumb {\n  box-shadow: 0 0 0 1px #fff, 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n}\n.form-range:focus::-moz-range-thumb {\n  box-shadow: 0 0 0 1px #fff, 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n}\n.form-range::-moz-focus-outer {\n  border: 0;\n}\n.form-range::-webkit-slider-thumb {\n  width: 1rem;\n  height: 1rem;\n  margin-top: -0.25rem;\n  -webkit-appearance: none;\n  appearance: none;\n  background-color: #0d6efd;\n  border: 0;\n  border-radius: 1rem;\n  -webkit-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n  transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n  .form-range::-webkit-slider-thumb {\n    -webkit-transition: none;\n    transition: none;\n  }\n}\n.form-range::-webkit-slider-thumb:active {\n  background-color: #b6d4fe;\n}\n.form-range::-webkit-slider-runnable-track {\n  width: 100%;\n  height: 0.5rem;\n  color: transparent;\n  cursor: pointer;\n  background-color: var(--bs-secondary-bg);\n  border-color: transparent;\n  border-radius: 1rem;\n}\n.form-range::-moz-range-thumb {\n  width: 1rem;\n  height: 1rem;\n  -moz-appearance: none;\n  appearance: none;\n  background-color: #0d6efd;\n  border: 0;\n  border-radius: 1rem;\n  -moz-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n  transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n  .form-range::-moz-range-thumb {\n    -moz-transition: none;\n    transition: none;\n  }\n}\n.form-range::-moz-range-thumb:active {\n  background-color: #b6d4fe;\n}\n.form-range::-moz-range-track {\n  width: 100%;\n  height: 0.5rem;\n  color: transparent;\n  cursor: pointer;\n  background-color: var(--bs-secondary-bg);\n  border-color: transparent;\n  border-radius: 1rem;\n}\n.form-range:disabled {\n  pointer-events: none;\n}\n.form-range:disabled::-webkit-slider-thumb {\n  background-color: var(--bs-secondary-color);\n}\n.form-range:disabled::-moz-range-thumb {\n  background-color: var(--bs-secondary-color);\n}\n\n.form-floating {\n  position: relative;\n}\n.form-floating > .form-control,\n.form-floating > .form-control-plaintext,\n.form-floating > .form-select {\n  height: calc(3.5rem + calc(var(--bs-border-width) * 2));\n  min-height: calc(3.5rem + calc(var(--bs-border-width) * 2));\n  line-height: 1.25;\n}\n.form-floating > label {\n  position: absolute;\n  top: 0;\n  right: 0;\n  z-index: 2;\n  max-width: 100%;\n  height: 100%;\n  padding: 1rem 0.75rem;\n  overflow: hidden;\n  color: rgba(var(--bs-body-color-rgb), 0.65);\n  text-align: start;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n  pointer-events: none;\n  border: var(--bs-border-width) solid transparent;\n  transform-origin: 100% 0;\n  transition: opacity 0.1s ease-in-out, transform 0.1s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n  .form-floating > label {\n    transition: none;\n  }\n}\n.form-floating > .form-control,\n.form-floating > .form-control-plaintext {\n  padding: 1rem 0.75rem;\n}\n.form-floating > .form-control::placeholder,\n.form-floating > .form-control-plaintext::placeholder {\n  color: transparent;\n}\n.form-floating > .form-control:focus, .form-floating > .form-control:not(:placeholder-shown),\n.form-floating > .form-control-plaintext:focus,\n.form-floating > .form-control-plaintext:not(:placeholder-shown) {\n  padding-top: 1.625rem;\n  padding-bottom: 0.625rem;\n}\n.form-floating > .form-control:-webkit-autofill,\n.form-floating > .form-control-plaintext:-webkit-autofill {\n  padding-top: 1.625rem;\n  padding-bottom: 0.625rem;\n}\n.form-floating > .form-select {\n  padding-top: 1.625rem;\n  padding-bottom: 0.625rem;\n  padding-right: 0.75rem;\n}\n.form-floating > .form-control:focus ~ label,\n.form-floating > .form-control:not(:placeholder-shown) ~ label,\n.form-floating > .form-control-plaintext ~ label,\n.form-floating > .form-select ~ label {\n  transform: scale(0.85) translateY(-0.5rem) translateX(-0.15rem);\n}\n.form-floating > .form-control:-webkit-autofill ~ label {\n  transform: scale(0.85) translateY(-0.5rem) translateX(-0.15rem);\n}\n.form-floating > textarea:focus ~ label::after,\n.form-floating > textarea:not(:placeholder-shown) ~ label::after {\n  position: absolute;\n  inset: 1rem 0.375rem;\n  z-index: -1;\n  height: 1.5em;\n  content: \"\";\n  background-color: var(--bs-body-bg);\n  border-radius: var(--bs-border-radius);\n}\n.form-floating > textarea:disabled ~ label::after {\n  background-color: var(--bs-secondary-bg);\n}\n.form-floating > .form-control-plaintext ~ label {\n  border-width: var(--bs-border-width) 0;\n}\n.form-floating > :disabled ~ label,\n.form-floating > .form-control:disabled ~ label {\n  color: #6c757d;\n}\n\n.input-group {\n  position: relative;\n  display: flex;\n  flex-wrap: wrap;\n  align-items: stretch;\n  width: 100%;\n}\n.input-group > .form-control,\n.input-group > .form-select,\n.input-group > .form-floating {\n  position: relative;\n  flex: 1 1 auto;\n  width: 1%;\n  min-width: 0;\n}\n.input-group > .form-control:focus,\n.input-group > .form-select:focus,\n.input-group > .form-floating:focus-within {\n  z-index: 5;\n}\n.input-group .btn {\n  position: relative;\n  z-index: 2;\n}\n.input-group .btn:focus {\n  z-index: 5;\n}\n\n.input-group-text {\n  display: flex;\n  align-items: center;\n  padding: 0.375rem 0.75rem;\n  font-size: 1rem;\n  font-weight: 400;\n  line-height: 1.5;\n  color: var(--bs-body-color);\n  text-align: center;\n  white-space: nowrap;\n  background-color: var(--bs-tertiary-bg);\n  border: var(--bs-border-width) solid var(--bs-border-color);\n  border-radius: var(--bs-border-radius);\n}\n\n.input-group-lg > .form-control,\n.input-group-lg > .form-select,\n.input-group-lg > .input-group-text,\n.input-group-lg > .btn {\n  padding: 0.5rem 1rem;\n  font-size: 1.25rem;\n  border-radius: var(--bs-border-radius-lg);\n}\n\n.input-group-sm > .form-control,\n.input-group-sm > .form-select,\n.input-group-sm > .input-group-text,\n.input-group-sm > .btn {\n  padding: 0.25rem 0.5rem;\n  font-size: 0.875rem;\n  border-radius: var(--bs-border-radius-sm);\n}\n\n.input-group-lg > .form-select,\n.input-group-sm > .form-select {\n  padding-left: 3rem;\n}\n\n.input-group:not(.has-validation) > :not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),\n.input-group:not(.has-validation) > .dropdown-toggle:nth-last-child(n+3),\n.input-group:not(.has-validation) > .form-floating:not(:last-child) > .form-control,\n.input-group:not(.has-validation) > .form-floating:not(:last-child) > .form-select {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.input-group.has-validation > :nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),\n.input-group.has-validation > .dropdown-toggle:nth-last-child(n+4),\n.input-group.has-validation > .form-floating:nth-last-child(n+3) > .form-control,\n.input-group.has-validation > .form-floating:nth-last-child(n+3) > .form-select {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.input-group > :not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback) {\n  margin-right: calc(-1 * var(--bs-border-width));\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.input-group > .form-floating:not(:first-child) > .form-control,\n.input-group > .form-floating:not(:first-child) > .form-select {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n\n.valid-feedback {\n  display: none;\n  width: 100%;\n  margin-top: 0.25rem;\n  font-size: 0.875em;\n  color: var(--bs-form-valid-color);\n}\n\n.valid-tooltip {\n  position: absolute;\n  top: 100%;\n  z-index: 5;\n  display: none;\n  max-width: 100%;\n  padding: 0.25rem 0.5rem;\n  margin-top: 0.1rem;\n  font-size: 0.875rem;\n  color: #fff;\n  background-color: var(--bs-success);\n  border-radius: var(--bs-border-radius);\n}\n\n.was-validated :valid ~ .valid-feedback,\n.was-validated :valid ~ .valid-tooltip,\n.is-valid ~ .valid-feedback,\n.is-valid ~ .valid-tooltip {\n  display: block;\n}\n\n.was-validated .form-control:valid, .form-control.is-valid {\n  border-color: var(--bs-form-valid-border-color);\n  padding-left: calc(1.5em + 0.75rem);\n  background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1'/%3e%3c/svg%3e\");\n  background-repeat: no-repeat;\n  background-position: left calc(0.375em + 0.1875rem) center;\n  background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n.was-validated .form-control:valid:focus, .form-control.is-valid:focus {\n  border-color: var(--bs-form-valid-border-color);\n  box-shadow: 0 0 0 0.25rem rgba(var(--bs-success-rgb), 0.25);\n}\n\n.was-validated textarea.form-control:valid, textarea.form-control.is-valid {\n  padding-left: calc(1.5em + 0.75rem);\n  background-position: top calc(0.375em + 0.1875rem) left calc(0.375em + 0.1875rem);\n}\n\n.was-validated .form-select:valid, .form-select.is-valid {\n  border-color: var(--bs-form-valid-border-color);\n}\n.was-validated .form-select:valid:not([multiple]):not([size]), .was-validated .form-select:valid:not([multiple])[size=\"1\"], .form-select.is-valid:not([multiple]):not([size]), .form-select.is-valid:not([multiple])[size=\"1\"] {\n  --bs-form-select-bg-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1'/%3e%3c/svg%3e\");\n  padding-left: 4.125rem;\n  background-position: left 0.75rem center, center left 2.25rem;\n  background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n.was-validated .form-select:valid:focus, .form-select.is-valid:focus {\n  border-color: var(--bs-form-valid-border-color);\n  box-shadow: 0 0 0 0.25rem rgba(var(--bs-success-rgb), 0.25);\n}\n\n.was-validated .form-control-color:valid, .form-control-color.is-valid {\n  width: calc(3rem + calc(1.5em + 0.75rem));\n}\n\n.was-validated .form-check-input:valid, .form-check-input.is-valid {\n  border-color: var(--bs-form-valid-border-color);\n}\n.was-validated .form-check-input:valid:checked, .form-check-input.is-valid:checked {\n  background-color: var(--bs-form-valid-color);\n}\n.was-validated .form-check-input:valid:focus, .form-check-input.is-valid:focus {\n  box-shadow: 0 0 0 0.25rem rgba(var(--bs-success-rgb), 0.25);\n}\n.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label {\n  color: var(--bs-form-valid-color);\n}\n\n.form-check-inline .form-check-input ~ .valid-feedback {\n  margin-right: 0.5em;\n}\n\n.was-validated .input-group > .form-control:not(:focus):valid, .input-group > .form-control:not(:focus).is-valid,\n.was-validated .input-group > .form-select:not(:focus):valid,\n.input-group > .form-select:not(:focus).is-valid,\n.was-validated .input-group > .form-floating:not(:focus-within):valid,\n.input-group > .form-floating:not(:focus-within).is-valid {\n  z-index: 3;\n}\n\n.invalid-feedback {\n  display: none;\n  width: 100%;\n  margin-top: 0.25rem;\n  font-size: 0.875em;\n  color: var(--bs-form-invalid-color);\n}\n\n.invalid-tooltip {\n  position: absolute;\n  top: 100%;\n  z-index: 5;\n  display: none;\n  max-width: 100%;\n  padding: 0.25rem 0.5rem;\n  margin-top: 0.1rem;\n  font-size: 0.875rem;\n  color: #fff;\n  background-color: var(--bs-danger);\n  border-radius: var(--bs-border-radius);\n}\n\n.was-validated :invalid ~ .invalid-feedback,\n.was-validated :invalid ~ .invalid-tooltip,\n.is-invalid ~ .invalid-feedback,\n.is-invalid ~ .invalid-tooltip {\n  display: block;\n}\n\n.was-validated .form-control:invalid, .form-control.is-invalid {\n  border-color: var(--bs-form-invalid-border-color);\n  padding-left: calc(1.5em + 0.75rem);\n  background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e\");\n  background-repeat: no-repeat;\n  background-position: left calc(0.375em + 0.1875rem) center;\n  background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus {\n  border-color: var(--bs-form-invalid-border-color);\n  box-shadow: 0 0 0 0.25rem rgba(var(--bs-danger-rgb), 0.25);\n}\n\n.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid {\n  padding-left: calc(1.5em + 0.75rem);\n  background-position: top calc(0.375em + 0.1875rem) left calc(0.375em + 0.1875rem);\n}\n\n.was-validated .form-select:invalid, .form-select.is-invalid {\n  border-color: var(--bs-form-invalid-border-color);\n}\n.was-validated .form-select:invalid:not([multiple]):not([size]), .was-validated .form-select:invalid:not([multiple])[size=\"1\"], .form-select.is-invalid:not([multiple]):not([size]), .form-select.is-invalid:not([multiple])[size=\"1\"] {\n  --bs-form-select-bg-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e\");\n  padding-left: 4.125rem;\n  background-position: left 0.75rem center, center left 2.25rem;\n  background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n.was-validated .form-select:invalid:focus, .form-select.is-invalid:focus {\n  border-color: var(--bs-form-invalid-border-color);\n  box-shadow: 0 0 0 0.25rem rgba(var(--bs-danger-rgb), 0.25);\n}\n\n.was-validated .form-control-color:invalid, .form-control-color.is-invalid {\n  width: calc(3rem + calc(1.5em + 0.75rem));\n}\n\n.was-validated .form-check-input:invalid, .form-check-input.is-invalid {\n  border-color: var(--bs-form-invalid-border-color);\n}\n.was-validated .form-check-input:invalid:checked, .form-check-input.is-invalid:checked {\n  background-color: var(--bs-form-invalid-color);\n}\n.was-validated .form-check-input:invalid:focus, .form-check-input.is-invalid:focus {\n  box-shadow: 0 0 0 0.25rem rgba(var(--bs-danger-rgb), 0.25);\n}\n.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label {\n  color: var(--bs-form-invalid-color);\n}\n\n.form-check-inline .form-check-input ~ .invalid-feedback {\n  margin-right: 0.5em;\n}\n\n.was-validated .input-group > .form-control:not(:focus):invalid, .input-group > .form-control:not(:focus).is-invalid,\n.was-validated .input-group > .form-select:not(:focus):invalid,\n.input-group > .form-select:not(:focus).is-invalid,\n.was-validated .input-group > .form-floating:not(:focus-within):invalid,\n.input-group > .form-floating:not(:focus-within).is-invalid {\n  z-index: 4;\n}\n\n.btn {\n  --bs-btn-padding-x: 0.75rem;\n  --bs-btn-padding-y: 0.375rem;\n  --bs-btn-font-family: ;\n  --bs-btn-font-size: 1rem;\n  --bs-btn-font-weight: 400;\n  --bs-btn-line-height: 1.5;\n  --bs-btn-color: var(--bs-body-color);\n  --bs-btn-bg: transparent;\n  --bs-btn-border-width: var(--bs-border-width);\n  --bs-btn-border-color: transparent;\n  --bs-btn-border-radius: var(--bs-border-radius);\n  --bs-btn-hover-border-color: transparent;\n  --bs-btn-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n  --bs-btn-disabled-opacity: 0.65;\n  --bs-btn-focus-box-shadow: 0 0 0 0.25rem rgba(var(--bs-btn-focus-shadow-rgb), .5);\n  display: inline-block;\n  padding: var(--bs-btn-padding-y) var(--bs-btn-padding-x);\n  font-family: var(--bs-btn-font-family);\n  font-size: var(--bs-btn-font-size);\n  font-weight: var(--bs-btn-font-weight);\n  line-height: var(--bs-btn-line-height);\n  color: var(--bs-btn-color);\n  text-align: center;\n  text-decoration: none;\n  vertical-align: middle;\n  cursor: pointer;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  user-select: none;\n  border: var(--bs-btn-border-width) solid var(--bs-btn-border-color);\n  border-radius: var(--bs-btn-border-radius);\n  background-color: var(--bs-btn-bg);\n  transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n  .btn {\n    transition: none;\n  }\n}\n.btn:hover {\n  color: var(--bs-btn-hover-color);\n  background-color: var(--bs-btn-hover-bg);\n  border-color: var(--bs-btn-hover-border-color);\n}\n.btn-check + .btn:hover {\n  color: var(--bs-btn-color);\n  background-color: var(--bs-btn-bg);\n  border-color: var(--bs-btn-border-color);\n}\n.btn:focus-visible {\n  color: var(--bs-btn-hover-color);\n  background-color: var(--bs-btn-hover-bg);\n  border-color: var(--bs-btn-hover-border-color);\n  outline: 0;\n  box-shadow: var(--bs-btn-focus-box-shadow);\n}\n.btn-check:focus-visible + .btn {\n  border-color: var(--bs-btn-hover-border-color);\n  outline: 0;\n  box-shadow: var(--bs-btn-focus-box-shadow);\n}\n.btn-check:checked + .btn, :not(.btn-check) + .btn:active, .btn:first-child:active, .btn.active, .btn.show {\n  color: var(--bs-btn-active-color);\n  background-color: var(--bs-btn-active-bg);\n  border-color: var(--bs-btn-active-border-color);\n}\n.btn-check:checked + .btn:focus-visible, :not(.btn-check) + .btn:active:focus-visible, .btn:first-child:active:focus-visible, .btn.active:focus-visible, .btn.show:focus-visible {\n  box-shadow: var(--bs-btn-focus-box-shadow);\n}\n.btn-check:checked:focus-visible + .btn {\n  box-shadow: var(--bs-btn-focus-box-shadow);\n}\n.btn:disabled, .btn.disabled, fieldset:disabled .btn {\n  color: var(--bs-btn-disabled-color);\n  pointer-events: none;\n  background-color: var(--bs-btn-disabled-bg);\n  border-color: var(--bs-btn-disabled-border-color);\n  opacity: var(--bs-btn-disabled-opacity);\n}\n\n.btn-primary {\n  --bs-btn-color: #fff;\n  --bs-btn-bg: #0d6efd;\n  --bs-btn-border-color: #0d6efd;\n  --bs-btn-hover-color: #fff;\n  --bs-btn-hover-bg: #0b5ed7;\n  --bs-btn-hover-border-color: #0a58ca;\n  --bs-btn-focus-shadow-rgb: 49, 132, 253;\n  --bs-btn-active-color: #fff;\n  --bs-btn-active-bg: #0a58ca;\n  --bs-btn-active-border-color: #0a53be;\n  --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n  --bs-btn-disabled-color: #fff;\n  --bs-btn-disabled-bg: #0d6efd;\n  --bs-btn-disabled-border-color: #0d6efd;\n}\n\n.btn-secondary {\n  --bs-btn-color: #fff;\n  --bs-btn-bg: #6c757d;\n  --bs-btn-border-color: #6c757d;\n  --bs-btn-hover-color: #fff;\n  --bs-btn-hover-bg: #5c636a;\n  --bs-btn-hover-border-color: #565e64;\n  --bs-btn-focus-shadow-rgb: 130, 138, 145;\n  --bs-btn-active-color: #fff;\n  --bs-btn-active-bg: #565e64;\n  --bs-btn-active-border-color: #51585e;\n  --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n  --bs-btn-disabled-color: #fff;\n  --bs-btn-disabled-bg: #6c757d;\n  --bs-btn-disabled-border-color: #6c757d;\n}\n\n.btn-success {\n  --bs-btn-color: #fff;\n  --bs-btn-bg: #198754;\n  --bs-btn-border-color: #198754;\n  --bs-btn-hover-color: #fff;\n  --bs-btn-hover-bg: #157347;\n  --bs-btn-hover-border-color: #146c43;\n  --bs-btn-focus-shadow-rgb: 60, 153, 110;\n  --bs-btn-active-color: #fff;\n  --bs-btn-active-bg: #146c43;\n  --bs-btn-active-border-color: #13653f;\n  --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n  --bs-btn-disabled-color: #fff;\n  --bs-btn-disabled-bg: #198754;\n  --bs-btn-disabled-border-color: #198754;\n}\n\n.btn-info {\n  --bs-btn-color: #000;\n  --bs-btn-bg: #0dcaf0;\n  --bs-btn-border-color: #0dcaf0;\n  --bs-btn-hover-color: #000;\n  --bs-btn-hover-bg: #31d2f2;\n  --bs-btn-hover-border-color: #25cff2;\n  --bs-btn-focus-shadow-rgb: 11, 172, 204;\n  --bs-btn-active-color: #000;\n  --bs-btn-active-bg: #3dd5f3;\n  --bs-btn-active-border-color: #25cff2;\n  --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n  --bs-btn-disabled-color: #000;\n  --bs-btn-disabled-bg: #0dcaf0;\n  --bs-btn-disabled-border-color: #0dcaf0;\n}\n\n.btn-warning {\n  --bs-btn-color: #000;\n  --bs-btn-bg: #ffc107;\n  --bs-btn-border-color: #ffc107;\n  --bs-btn-hover-color: #000;\n  --bs-btn-hover-bg: #ffca2c;\n  --bs-btn-hover-border-color: #ffc720;\n  --bs-btn-focus-shadow-rgb: 217, 164, 6;\n  --bs-btn-active-color: #000;\n  --bs-btn-active-bg: #ffcd39;\n  --bs-btn-active-border-color: #ffc720;\n  --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n  --bs-btn-disabled-color: #000;\n  --bs-btn-disabled-bg: #ffc107;\n  --bs-btn-disabled-border-color: #ffc107;\n}\n\n.btn-danger {\n  --bs-btn-color: #fff;\n  --bs-btn-bg: #dc3545;\n  --bs-btn-border-color: #dc3545;\n  --bs-btn-hover-color: #fff;\n  --bs-btn-hover-bg: #bb2d3b;\n  --bs-btn-hover-border-color: #b02a37;\n  --bs-btn-focus-shadow-rgb: 225, 83, 97;\n  --bs-btn-active-color: #fff;\n  --bs-btn-active-bg: #b02a37;\n  --bs-btn-active-border-color: #a52834;\n  --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n  --bs-btn-disabled-color: #fff;\n  --bs-btn-disabled-bg: #dc3545;\n  --bs-btn-disabled-border-color: #dc3545;\n}\n\n.btn-light {\n  --bs-btn-color: #000;\n  --bs-btn-bg: #f8f9fa;\n  --bs-btn-border-color: #f8f9fa;\n  --bs-btn-hover-color: #000;\n  --bs-btn-hover-bg: #d3d4d5;\n  --bs-btn-hover-border-color: #c6c7c8;\n  --bs-btn-focus-shadow-rgb: 211, 212, 213;\n  --bs-btn-active-color: #000;\n  --bs-btn-active-bg: #c6c7c8;\n  --bs-btn-active-border-color: #babbbc;\n  --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n  --bs-btn-disabled-color: #000;\n  --bs-btn-disabled-bg: #f8f9fa;\n  --bs-btn-disabled-border-color: #f8f9fa;\n}\n\n.btn-dark {\n  --bs-btn-color: #fff;\n  --bs-btn-bg: #212529;\n  --bs-btn-border-color: #212529;\n  --bs-btn-hover-color: #fff;\n  --bs-btn-hover-bg: #424649;\n  --bs-btn-hover-border-color: #373b3e;\n  --bs-btn-focus-shadow-rgb: 66, 70, 73;\n  --bs-btn-active-color: #fff;\n  --bs-btn-active-bg: #4d5154;\n  --bs-btn-active-border-color: #373b3e;\n  --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n  --bs-btn-disabled-color: #fff;\n  --bs-btn-disabled-bg: #212529;\n  --bs-btn-disabled-border-color: #212529;\n}\n\n.btn-outline-primary {\n  --bs-btn-color: #0d6efd;\n  --bs-btn-border-color: #0d6efd;\n  --bs-btn-hover-color: #fff;\n  --bs-btn-hover-bg: #0d6efd;\n  --bs-btn-hover-border-color: #0d6efd;\n  --bs-btn-focus-shadow-rgb: 13, 110, 253;\n  --bs-btn-active-color: #fff;\n  --bs-btn-active-bg: #0d6efd;\n  --bs-btn-active-border-color: #0d6efd;\n  --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n  --bs-btn-disabled-color: #0d6efd;\n  --bs-btn-disabled-bg: transparent;\n  --bs-btn-disabled-border-color: #0d6efd;\n  --bs-gradient: none;\n}\n\n.btn-outline-secondary {\n  --bs-btn-color: #6c757d;\n  --bs-btn-border-color: #6c757d;\n  --bs-btn-hover-color: #fff;\n  --bs-btn-hover-bg: #6c757d;\n  --bs-btn-hover-border-color: #6c757d;\n  --bs-btn-focus-shadow-rgb: 108, 117, 125;\n  --bs-btn-active-color: #fff;\n  --bs-btn-active-bg: #6c757d;\n  --bs-btn-active-border-color: #6c757d;\n  --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n  --bs-btn-disabled-color: #6c757d;\n  --bs-btn-disabled-bg: transparent;\n  --bs-btn-disabled-border-color: #6c757d;\n  --bs-gradient: none;\n}\n\n.btn-outline-success {\n  --bs-btn-color: #198754;\n  --bs-btn-border-color: #198754;\n  --bs-btn-hover-color: #fff;\n  --bs-btn-hover-bg: #198754;\n  --bs-btn-hover-border-color: #198754;\n  --bs-btn-focus-shadow-rgb: 25, 135, 84;\n  --bs-btn-active-color: #fff;\n  --bs-btn-active-bg: #198754;\n  --bs-btn-active-border-color: #198754;\n  --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n  --bs-btn-disabled-color: #198754;\n  --bs-btn-disabled-bg: transparent;\n  --bs-btn-disabled-border-color: #198754;\n  --bs-gradient: none;\n}\n\n.btn-outline-info {\n  --bs-btn-color: #0dcaf0;\n  --bs-btn-border-color: #0dcaf0;\n  --bs-btn-hover-color: #000;\n  --bs-btn-hover-bg: #0dcaf0;\n  --bs-btn-hover-border-color: #0dcaf0;\n  --bs-btn-focus-shadow-rgb: 13, 202, 240;\n  --bs-btn-active-color: #000;\n  --bs-btn-active-bg: #0dcaf0;\n  --bs-btn-active-border-color: #0dcaf0;\n  --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n  --bs-btn-disabled-color: #0dcaf0;\n  --bs-btn-disabled-bg: transparent;\n  --bs-btn-disabled-border-color: #0dcaf0;\n  --bs-gradient: none;\n}\n\n.btn-outline-warning {\n  --bs-btn-color: #ffc107;\n  --bs-btn-border-color: #ffc107;\n  --bs-btn-hover-color: #000;\n  --bs-btn-hover-bg: #ffc107;\n  --bs-btn-hover-border-color: #ffc107;\n  --bs-btn-focus-shadow-rgb: 255, 193, 7;\n  --bs-btn-active-color: #000;\n  --bs-btn-active-bg: #ffc107;\n  --bs-btn-active-border-color: #ffc107;\n  --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n  --bs-btn-disabled-color: #ffc107;\n  --bs-btn-disabled-bg: transparent;\n  --bs-btn-disabled-border-color: #ffc107;\n  --bs-gradient: none;\n}\n\n.btn-outline-danger {\n  --bs-btn-color: #dc3545;\n  --bs-btn-border-color: #dc3545;\n  --bs-btn-hover-color: #fff;\n  --bs-btn-hover-bg: #dc3545;\n  --bs-btn-hover-border-color: #dc3545;\n  --bs-btn-focus-shadow-rgb: 220, 53, 69;\n  --bs-btn-active-color: #fff;\n  --bs-btn-active-bg: #dc3545;\n  --bs-btn-active-border-color: #dc3545;\n  --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n  --bs-btn-disabled-color: #dc3545;\n  --bs-btn-disabled-bg: transparent;\n  --bs-btn-disabled-border-color: #dc3545;\n  --bs-gradient: none;\n}\n\n.btn-outline-light {\n  --bs-btn-color: #f8f9fa;\n  --bs-btn-border-color: #f8f9fa;\n  --bs-btn-hover-color: #000;\n  --bs-btn-hover-bg: #f8f9fa;\n  --bs-btn-hover-border-color: #f8f9fa;\n  --bs-btn-focus-shadow-rgb: 248, 249, 250;\n  --bs-btn-active-color: #000;\n  --bs-btn-active-bg: #f8f9fa;\n  --bs-btn-active-border-color: #f8f9fa;\n  --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n  --bs-btn-disabled-color: #f8f9fa;\n  --bs-btn-disabled-bg: transparent;\n  --bs-btn-disabled-border-color: #f8f9fa;\n  --bs-gradient: none;\n}\n\n.btn-outline-dark {\n  --bs-btn-color: #212529;\n  --bs-btn-border-color: #212529;\n  --bs-btn-hover-color: #fff;\n  --bs-btn-hover-bg: #212529;\n  --bs-btn-hover-border-color: #212529;\n  --bs-btn-focus-shadow-rgb: 33, 37, 41;\n  --bs-btn-active-color: #fff;\n  --bs-btn-active-bg: #212529;\n  --bs-btn-active-border-color: #212529;\n  --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n  --bs-btn-disabled-color: #212529;\n  --bs-btn-disabled-bg: transparent;\n  --bs-btn-disabled-border-color: #212529;\n  --bs-gradient: none;\n}\n\n.btn-link {\n  --bs-btn-font-weight: 400;\n  --bs-btn-color: var(--bs-link-color);\n  --bs-btn-bg: transparent;\n  --bs-btn-border-color: transparent;\n  --bs-btn-hover-color: var(--bs-link-hover-color);\n  --bs-btn-hover-border-color: transparent;\n  --bs-btn-active-color: var(--bs-link-hover-color);\n  --bs-btn-active-border-color: transparent;\n  --bs-btn-disabled-color: #6c757d;\n  --bs-btn-disabled-border-color: transparent;\n  --bs-btn-box-shadow: 0 0 0 #000;\n  --bs-btn-focus-shadow-rgb: 49, 132, 253;\n  text-decoration: underline;\n}\n.btn-link:focus-visible {\n  color: var(--bs-btn-color);\n}\n.btn-link:hover {\n  color: var(--bs-btn-hover-color);\n}\n\n.btn-lg, .btn-group-lg > .btn {\n  --bs-btn-padding-y: 0.5rem;\n  --bs-btn-padding-x: 1rem;\n  --bs-btn-font-size: 1.25rem;\n  --bs-btn-border-radius: var(--bs-border-radius-lg);\n}\n\n.btn-sm, .btn-group-sm > .btn {\n  --bs-btn-padding-y: 0.25rem;\n  --bs-btn-padding-x: 0.5rem;\n  --bs-btn-font-size: 0.875rem;\n  --bs-btn-border-radius: var(--bs-border-radius-sm);\n}\n\n.fade {\n  transition: opacity 0.15s linear;\n}\n@media (prefers-reduced-motion: reduce) {\n  .fade {\n    transition: none;\n  }\n}\n.fade:not(.show) {\n  opacity: 0;\n}\n\n.collapse:not(.show) {\n  display: none;\n}\n\n.collapsing {\n  height: 0;\n  overflow: hidden;\n  transition: height 0.35s ease;\n}\n@media (prefers-reduced-motion: reduce) {\n  .collapsing {\n    transition: none;\n  }\n}\n.collapsing.collapse-horizontal {\n  width: 0;\n  height: auto;\n  transition: width 0.35s ease;\n}\n@media (prefers-reduced-motion: reduce) {\n  .collapsing.collapse-horizontal {\n    transition: none;\n  }\n}\n\n.dropup,\n.dropend,\n.dropdown,\n.dropstart,\n.dropup-center,\n.dropdown-center {\n  position: relative;\n}\n\n.dropdown-toggle {\n  white-space: nowrap;\n}\n.dropdown-toggle::after {\n  display: inline-block;\n  margin-right: 0.255em;\n  vertical-align: 0.255em;\n  content: \"\";\n  border-top: 0.3em solid;\n  border-left: 0.3em solid transparent;\n  border-bottom: 0;\n  border-right: 0.3em solid transparent;\n}\n.dropdown-toggle:empty::after {\n  margin-right: 0;\n}\n\n.dropdown-menu {\n  --bs-dropdown-zindex: 1000;\n  --bs-dropdown-min-width: 10rem;\n  --bs-dropdown-padding-x: 0;\n  --bs-dropdown-padding-y: 0.5rem;\n  --bs-dropdown-spacer: 0.125rem;\n  --bs-dropdown-font-size: 1rem;\n  --bs-dropdown-color: var(--bs-body-color);\n  --bs-dropdown-bg: var(--bs-body-bg);\n  --bs-dropdown-border-color: var(--bs-border-color-translucent);\n  --bs-dropdown-border-radius: var(--bs-border-radius);\n  --bs-dropdown-border-width: var(--bs-border-width);\n  --bs-dropdown-inner-border-radius: calc(var(--bs-border-radius) - var(--bs-border-width));\n  --bs-dropdown-divider-bg: var(--bs-border-color-translucent);\n  --bs-dropdown-divider-margin-y: 0.5rem;\n  --bs-dropdown-box-shadow: var(--bs-box-shadow);\n  --bs-dropdown-link-color: var(--bs-body-color);\n  --bs-dropdown-link-hover-color: var(--bs-body-color);\n  --bs-dropdown-link-hover-bg: var(--bs-tertiary-bg);\n  --bs-dropdown-link-active-color: #fff;\n  --bs-dropdown-link-active-bg: #0d6efd;\n  --bs-dropdown-link-disabled-color: var(--bs-tertiary-color);\n  --bs-dropdown-item-padding-x: 1rem;\n  --bs-dropdown-item-padding-y: 0.25rem;\n  --bs-dropdown-header-color: #6c757d;\n  --bs-dropdown-header-padding-x: 1rem;\n  --bs-dropdown-header-padding-y: 0.5rem;\n  position: absolute;\n  z-index: var(--bs-dropdown-zindex);\n  display: none;\n  min-width: var(--bs-dropdown-min-width);\n  padding: var(--bs-dropdown-padding-y) var(--bs-dropdown-padding-x);\n  margin: 0;\n  font-size: var(--bs-dropdown-font-size);\n  color: var(--bs-dropdown-color);\n  text-align: right;\n  list-style: none;\n  background-color: var(--bs-dropdown-bg);\n  background-clip: padding-box;\n  border: var(--bs-dropdown-border-width) solid var(--bs-dropdown-border-color);\n  border-radius: var(--bs-dropdown-border-radius);\n}\n.dropdown-menu[data-bs-popper] {\n  top: 100%;\n  right: 0;\n  margin-top: var(--bs-dropdown-spacer);\n}\n\n.dropdown-menu-start {\n  --bs-position: start;\n}\n.dropdown-menu-start[data-bs-popper] {\n  left: auto;\n  right: 0;\n}\n\n.dropdown-menu-end {\n  --bs-position: end;\n}\n.dropdown-menu-end[data-bs-popper] {\n  left: 0;\n  right: auto;\n}\n\n@media (min-width: 576px) {\n  .dropdown-menu-sm-start {\n    --bs-position: start;\n  }\n  .dropdown-menu-sm-start[data-bs-popper] {\n    left: auto;\n    right: 0;\n  }\n  .dropdown-menu-sm-end {\n    --bs-position: end;\n  }\n  .dropdown-menu-sm-end[data-bs-popper] {\n    left: 0;\n    right: auto;\n  }\n}\n@media (min-width: 768px) {\n  .dropdown-menu-md-start {\n    --bs-position: start;\n  }\n  .dropdown-menu-md-start[data-bs-popper] {\n    left: auto;\n    right: 0;\n  }\n  .dropdown-menu-md-end {\n    --bs-position: end;\n  }\n  .dropdown-menu-md-end[data-bs-popper] {\n    left: 0;\n    right: auto;\n  }\n}\n@media (min-width: 992px) {\n  .dropdown-menu-lg-start {\n    --bs-position: start;\n  }\n  .dropdown-menu-lg-start[data-bs-popper] {\n    left: auto;\n    right: 0;\n  }\n  .dropdown-menu-lg-end {\n    --bs-position: end;\n  }\n  .dropdown-menu-lg-end[data-bs-popper] {\n    left: 0;\n    right: auto;\n  }\n}\n@media (min-width: 1200px) {\n  .dropdown-menu-xl-start {\n    --bs-position: start;\n  }\n  .dropdown-menu-xl-start[data-bs-popper] {\n    left: auto;\n    right: 0;\n  }\n  .dropdown-menu-xl-end {\n    --bs-position: end;\n  }\n  .dropdown-menu-xl-end[data-bs-popper] {\n    left: 0;\n    right: auto;\n  }\n}\n@media (min-width: 1400px) {\n  .dropdown-menu-xxl-start {\n    --bs-position: start;\n  }\n  .dropdown-menu-xxl-start[data-bs-popper] {\n    left: auto;\n    right: 0;\n  }\n  .dropdown-menu-xxl-end {\n    --bs-position: end;\n  }\n  .dropdown-menu-xxl-end[data-bs-popper] {\n    left: 0;\n    right: auto;\n  }\n}\n.dropup .dropdown-menu[data-bs-popper] {\n  top: auto;\n  bottom: 100%;\n  margin-top: 0;\n  margin-bottom: var(--bs-dropdown-spacer);\n}\n.dropup .dropdown-toggle::after {\n  display: inline-block;\n  margin-right: 0.255em;\n  vertical-align: 0.255em;\n  content: \"\";\n  border-top: 0;\n  border-left: 0.3em solid transparent;\n  border-bottom: 0.3em solid;\n  border-right: 0.3em solid transparent;\n}\n.dropup .dropdown-toggle:empty::after {\n  margin-right: 0;\n}\n\n.dropend .dropdown-menu[data-bs-popper] {\n  top: 0;\n  left: auto;\n  right: 100%;\n  margin-top: 0;\n  margin-right: var(--bs-dropdown-spacer);\n}\n.dropend .dropdown-toggle::after {\n  display: inline-block;\n  margin-right: 0.255em;\n  vertical-align: 0.255em;\n  content: \"\";\n  border-top: 0.3em solid transparent;\n  border-left: 0;\n  border-bottom: 0.3em solid transparent;\n  border-right: 0.3em solid;\n}\n.dropend .dropdown-toggle:empty::after {\n  margin-right: 0;\n}\n.dropend .dropdown-toggle::after {\n  vertical-align: 0;\n}\n\n.dropstart .dropdown-menu[data-bs-popper] {\n  top: 0;\n  left: 100%;\n  right: auto;\n  margin-top: 0;\n  margin-left: var(--bs-dropdown-spacer);\n}\n.dropstart .dropdown-toggle::after {\n  display: inline-block;\n  margin-right: 0.255em;\n  vertical-align: 0.255em;\n  content: \"\";\n}\n.dropstart .dropdown-toggle::after {\n  display: none;\n}\n.dropstart .dropdown-toggle::before {\n  display: inline-block;\n  margin-left: 0.255em;\n  vertical-align: 0.255em;\n  content: \"\";\n  border-top: 0.3em solid transparent;\n  border-left: 0.3em solid;\n  border-bottom: 0.3em solid transparent;\n}\n.dropstart .dropdown-toggle:empty::after {\n  margin-right: 0;\n}\n.dropstart .dropdown-toggle::before {\n  vertical-align: 0;\n}\n\n.dropdown-divider {\n  height: 0;\n  margin: var(--bs-dropdown-divider-margin-y) 0;\n  overflow: hidden;\n  border-top: 1px solid var(--bs-dropdown-divider-bg);\n  opacity: 1;\n}\n\n.dropdown-item {\n  display: block;\n  width: 100%;\n  padding: var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);\n  clear: both;\n  font-weight: 400;\n  color: var(--bs-dropdown-link-color);\n  text-align: inherit;\n  text-decoration: none;\n  white-space: nowrap;\n  background-color: transparent;\n  border: 0;\n  border-radius: var(--bs-dropdown-item-border-radius, 0);\n}\n.dropdown-item:hover, .dropdown-item:focus {\n  color: var(--bs-dropdown-link-hover-color);\n  background-color: var(--bs-dropdown-link-hover-bg);\n}\n.dropdown-item.active, .dropdown-item:active {\n  color: var(--bs-dropdown-link-active-color);\n  text-decoration: none;\n  background-color: var(--bs-dropdown-link-active-bg);\n}\n.dropdown-item.disabled, .dropdown-item:disabled {\n  color: var(--bs-dropdown-link-disabled-color);\n  pointer-events: none;\n  background-color: transparent;\n}\n\n.dropdown-menu.show {\n  display: block;\n}\n\n.dropdown-header {\n  display: block;\n  padding: var(--bs-dropdown-header-padding-y) var(--bs-dropdown-header-padding-x);\n  margin-bottom: 0;\n  font-size: 0.875rem;\n  color: var(--bs-dropdown-header-color);\n  white-space: nowrap;\n}\n\n.dropdown-item-text {\n  display: block;\n  padding: var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);\n  color: var(--bs-dropdown-link-color);\n}\n\n.dropdown-menu-dark {\n  --bs-dropdown-color: #dee2e6;\n  --bs-dropdown-bg: #343a40;\n  --bs-dropdown-border-color: var(--bs-border-color-translucent);\n  --bs-dropdown-box-shadow: ;\n  --bs-dropdown-link-color: #dee2e6;\n  --bs-dropdown-link-hover-color: #fff;\n  --bs-dropdown-divider-bg: var(--bs-border-color-translucent);\n  --bs-dropdown-link-hover-bg: rgba(255, 255, 255, 0.15);\n  --bs-dropdown-link-active-color: #fff;\n  --bs-dropdown-link-active-bg: #0d6efd;\n  --bs-dropdown-link-disabled-color: #adb5bd;\n  --bs-dropdown-header-color: #adb5bd;\n}\n\n.btn-group,\n.btn-group-vertical {\n  position: relative;\n  display: inline-flex;\n  vertical-align: middle;\n}\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n  position: relative;\n  flex: 1 1 auto;\n}\n.btn-group > .btn-check:checked + .btn,\n.btn-group > .btn-check:focus + .btn,\n.btn-group > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn-check:checked + .btn,\n.btn-group-vertical > .btn-check:focus + .btn,\n.btn-group-vertical > .btn:hover,\n.btn-group-vertical > .btn:focus,\n.btn-group-vertical > .btn:active,\n.btn-group-vertical > .btn.active {\n  z-index: 1;\n}\n\n.btn-toolbar {\n  display: flex;\n  flex-wrap: wrap;\n  justify-content: flex-start;\n}\n.btn-toolbar .input-group {\n  width: auto;\n}\n\n.btn-group {\n  border-radius: var(--bs-border-radius);\n}\n.btn-group > :not(.btn-check:first-child) + .btn,\n.btn-group > .btn-group:not(:first-child) {\n  margin-right: calc(-1 * var(--bs-border-width));\n}\n.btn-group > .btn:not(:last-child):not(.dropdown-toggle),\n.btn-group > .btn.dropdown-toggle-split:first-child,\n.btn-group > .btn-group:not(:last-child) > .btn {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.btn-group > .btn:nth-child(n+3),\n.btn-group > :not(.btn-check) + .btn,\n.btn-group > .btn-group:not(:first-child) > .btn {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n\n.dropdown-toggle-split {\n  padding-left: 0.5625rem;\n  padding-right: 0.5625rem;\n}\n.dropdown-toggle-split::after, .dropup .dropdown-toggle-split::after, .dropend .dropdown-toggle-split::after {\n  margin-right: 0;\n}\n.dropstart .dropdown-toggle-split::before {\n  margin-left: 0;\n}\n\n.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split {\n  padding-left: 0.375rem;\n  padding-right: 0.375rem;\n}\n\n.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split {\n  padding-left: 0.75rem;\n  padding-right: 0.75rem;\n}\n\n.btn-group-vertical {\n  flex-direction: column;\n  align-items: flex-start;\n  justify-content: center;\n}\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group {\n  width: 100%;\n}\n.btn-group-vertical > .btn:not(:first-child),\n.btn-group-vertical > .btn-group:not(:first-child) {\n  margin-top: calc(-1 * var(--bs-border-width));\n}\n.btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle),\n.btn-group-vertical > .btn-group:not(:last-child) > .btn {\n  border-bottom-left-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.btn-group-vertical > .btn:nth-child(n+3),\n.btn-group-vertical > :not(.btn-check) + .btn,\n.btn-group-vertical > .btn-group:not(:first-child) > .btn {\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.nav {\n  --bs-nav-link-padding-x: 1rem;\n  --bs-nav-link-padding-y: 0.5rem;\n  --bs-nav-link-font-weight: ;\n  --bs-nav-link-color: var(--bs-link-color);\n  --bs-nav-link-hover-color: var(--bs-link-hover-color);\n  --bs-nav-link-disabled-color: var(--bs-secondary-color);\n  display: flex;\n  flex-wrap: wrap;\n  padding-right: 0;\n  margin-bottom: 0;\n  list-style: none;\n}\n\n.nav-link {\n  display: block;\n  padding: var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x);\n  font-size: var(--bs-nav-link-font-size);\n  font-weight: var(--bs-nav-link-font-weight);\n  color: var(--bs-nav-link-color);\n  text-decoration: none;\n  background: none;\n  border: 0;\n  transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n  .nav-link {\n    transition: none;\n  }\n}\n.nav-link:hover, .nav-link:focus {\n  color: var(--bs-nav-link-hover-color);\n}\n.nav-link:focus-visible {\n  outline: 0;\n  box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n}\n.nav-link.disabled, .nav-link:disabled {\n  color: var(--bs-nav-link-disabled-color);\n  pointer-events: none;\n  cursor: default;\n}\n\n.nav-tabs {\n  --bs-nav-tabs-border-width: var(--bs-border-width);\n  --bs-nav-tabs-border-color: var(--bs-border-color);\n  --bs-nav-tabs-border-radius: var(--bs-border-radius);\n  --bs-nav-tabs-link-hover-border-color: var(--bs-secondary-bg) var(--bs-secondary-bg) var(--bs-border-color);\n  --bs-nav-tabs-link-active-color: var(--bs-emphasis-color);\n  --bs-nav-tabs-link-active-bg: var(--bs-body-bg);\n  --bs-nav-tabs-link-active-border-color: var(--bs-border-color) var(--bs-border-color) var(--bs-body-bg);\n  border-bottom: var(--bs-nav-tabs-border-width) solid var(--bs-nav-tabs-border-color);\n}\n.nav-tabs .nav-link {\n  margin-bottom: calc(-1 * var(--bs-nav-tabs-border-width));\n  border: var(--bs-nav-tabs-border-width) solid transparent;\n  border-top-right-radius: var(--bs-nav-tabs-border-radius);\n  border-top-left-radius: var(--bs-nav-tabs-border-radius);\n}\n.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus {\n  isolation: isolate;\n  border-color: var(--bs-nav-tabs-link-hover-border-color);\n}\n.nav-tabs .nav-link.active,\n.nav-tabs .nav-item.show .nav-link {\n  color: var(--bs-nav-tabs-link-active-color);\n  background-color: var(--bs-nav-tabs-link-active-bg);\n  border-color: var(--bs-nav-tabs-link-active-border-color);\n}\n.nav-tabs .dropdown-menu {\n  margin-top: calc(-1 * var(--bs-nav-tabs-border-width));\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.nav-pills {\n  --bs-nav-pills-border-radius: var(--bs-border-radius);\n  --bs-nav-pills-link-active-color: #fff;\n  --bs-nav-pills-link-active-bg: #0d6efd;\n}\n.nav-pills .nav-link {\n  border-radius: var(--bs-nav-pills-border-radius);\n}\n.nav-pills .nav-link.active,\n.nav-pills .show > .nav-link {\n  color: var(--bs-nav-pills-link-active-color);\n  background-color: var(--bs-nav-pills-link-active-bg);\n}\n\n.nav-underline {\n  --bs-nav-underline-gap: 1rem;\n  --bs-nav-underline-border-width: 0.125rem;\n  --bs-nav-underline-link-active-color: var(--bs-emphasis-color);\n  gap: var(--bs-nav-underline-gap);\n}\n.nav-underline .nav-link {\n  padding-left: 0;\n  padding-right: 0;\n  border-bottom: var(--bs-nav-underline-border-width) solid transparent;\n}\n.nav-underline .nav-link:hover, .nav-underline .nav-link:focus {\n  border-bottom-color: currentcolor;\n}\n.nav-underline .nav-link.active,\n.nav-underline .show > .nav-link {\n  font-weight: 700;\n  color: var(--bs-nav-underline-link-active-color);\n  border-bottom-color: currentcolor;\n}\n\n.nav-fill > .nav-link,\n.nav-fill .nav-item {\n  flex: 1 1 auto;\n  text-align: center;\n}\n\n.nav-justified > .nav-link,\n.nav-justified .nav-item {\n  flex-grow: 1;\n  flex-basis: 0;\n  text-align: center;\n}\n\n.nav-fill .nav-item .nav-link,\n.nav-justified .nav-item .nav-link {\n  width: 100%;\n}\n\n.tab-content > .tab-pane {\n  display: none;\n}\n.tab-content > .active {\n  display: block;\n}\n\n.navbar {\n  --bs-navbar-padding-x: 0;\n  --bs-navbar-padding-y: 0.5rem;\n  --bs-navbar-color: rgba(var(--bs-emphasis-color-rgb), 0.65);\n  --bs-navbar-hover-color: rgba(var(--bs-emphasis-color-rgb), 0.8);\n  --bs-navbar-disabled-color: rgba(var(--bs-emphasis-color-rgb), 0.3);\n  --bs-navbar-active-color: rgba(var(--bs-emphasis-color-rgb), 1);\n  --bs-navbar-brand-padding-y: 0.3125rem;\n  --bs-navbar-brand-margin-end: 1rem;\n  --bs-navbar-brand-font-size: 1.25rem;\n  --bs-navbar-brand-color: rgba(var(--bs-emphasis-color-rgb), 1);\n  --bs-navbar-brand-hover-color: rgba(var(--bs-emphasis-color-rgb), 1);\n  --bs-navbar-nav-link-padding-x: 0.5rem;\n  --bs-navbar-toggler-padding-y: 0.25rem;\n  --bs-navbar-toggler-padding-x: 0.75rem;\n  --bs-navbar-toggler-font-size: 1.25rem;\n  --bs-navbar-toggler-icon-bg: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%2833, 37, 41, 0.75%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\");\n  --bs-navbar-toggler-border-color: rgba(var(--bs-emphasis-color-rgb), 0.15);\n  --bs-navbar-toggler-border-radius: var(--bs-border-radius);\n  --bs-navbar-toggler-focus-width: 0.25rem;\n  --bs-navbar-toggler-transition: box-shadow 0.15s ease-in-out;\n  position: relative;\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  justify-content: space-between;\n  padding: var(--bs-navbar-padding-y) var(--bs-navbar-padding-x);\n}\n.navbar > .container,\n.navbar > .container-fluid,\n.navbar > .container-sm,\n.navbar > .container-md,\n.navbar > .container-lg,\n.navbar > .container-xl,\n.navbar > .container-xxl {\n  display: flex;\n  flex-wrap: inherit;\n  align-items: center;\n  justify-content: space-between;\n}\n.navbar-brand {\n  padding-top: var(--bs-navbar-brand-padding-y);\n  padding-bottom: var(--bs-navbar-brand-padding-y);\n  margin-left: var(--bs-navbar-brand-margin-end);\n  font-size: var(--bs-navbar-brand-font-size);\n  color: var(--bs-navbar-brand-color);\n  text-decoration: none;\n  white-space: nowrap;\n}\n.navbar-brand:hover, .navbar-brand:focus {\n  color: var(--bs-navbar-brand-hover-color);\n}\n\n.navbar-nav {\n  --bs-nav-link-padding-x: 0;\n  --bs-nav-link-padding-y: 0.5rem;\n  --bs-nav-link-font-weight: ;\n  --bs-nav-link-color: var(--bs-navbar-color);\n  --bs-nav-link-hover-color: var(--bs-navbar-hover-color);\n  --bs-nav-link-disabled-color: var(--bs-navbar-disabled-color);\n  display: flex;\n  flex-direction: column;\n  padding-right: 0;\n  margin-bottom: 0;\n  list-style: none;\n}\n.navbar-nav .nav-link.active, .navbar-nav .nav-link.show {\n  color: var(--bs-navbar-active-color);\n}\n.navbar-nav .dropdown-menu {\n  position: static;\n}\n\n.navbar-text {\n  padding-top: 0.5rem;\n  padding-bottom: 0.5rem;\n  color: var(--bs-navbar-color);\n}\n.navbar-text a,\n.navbar-text a:hover,\n.navbar-text a:focus {\n  color: var(--bs-navbar-active-color);\n}\n\n.navbar-collapse {\n  flex-grow: 1;\n  flex-basis: 100%;\n  align-items: center;\n}\n\n.navbar-toggler {\n  padding: var(--bs-navbar-toggler-padding-y) var(--bs-navbar-toggler-padding-x);\n  font-size: var(--bs-navbar-toggler-font-size);\n  line-height: 1;\n  color: var(--bs-navbar-color);\n  background-color: transparent;\n  border: var(--bs-border-width) solid var(--bs-navbar-toggler-border-color);\n  border-radius: var(--bs-navbar-toggler-border-radius);\n  transition: var(--bs-navbar-toggler-transition);\n}\n@media (prefers-reduced-motion: reduce) {\n  .navbar-toggler {\n    transition: none;\n  }\n}\n.navbar-toggler:hover {\n  text-decoration: none;\n}\n.navbar-toggler:focus {\n  text-decoration: none;\n  outline: 0;\n  box-shadow: 0 0 0 var(--bs-navbar-toggler-focus-width);\n}\n\n.navbar-toggler-icon {\n  display: inline-block;\n  width: 1.5em;\n  height: 1.5em;\n  vertical-align: middle;\n  background-image: var(--bs-navbar-toggler-icon-bg);\n  background-repeat: no-repeat;\n  background-position: center;\n  background-size: 100%;\n}\n\n.navbar-nav-scroll {\n  max-height: var(--bs-scroll-height, 75vh);\n  overflow-y: auto;\n}\n\n@media (min-width: 576px) {\n  .navbar-expand-sm {\n    flex-wrap: nowrap;\n    justify-content: flex-start;\n  }\n  .navbar-expand-sm .navbar-nav {\n    flex-direction: row;\n  }\n  .navbar-expand-sm .navbar-nav .dropdown-menu {\n    position: absolute;\n  }\n  .navbar-expand-sm .navbar-nav .nav-link {\n    padding-left: var(--bs-navbar-nav-link-padding-x);\n    padding-right: var(--bs-navbar-nav-link-padding-x);\n  }\n  .navbar-expand-sm .navbar-nav-scroll {\n    overflow: visible;\n  }\n  .navbar-expand-sm .navbar-collapse {\n    display: flex !important;\n    flex-basis: auto;\n  }\n  .navbar-expand-sm .navbar-toggler {\n    display: none;\n  }\n  .navbar-expand-sm .offcanvas {\n    position: static;\n    z-index: auto;\n    flex-grow: 1;\n    width: auto !important;\n    height: auto !important;\n    visibility: visible !important;\n    background-color: transparent !important;\n    border: 0 !important;\n    transform: none !important;\n    transition: none;\n  }\n  .navbar-expand-sm .offcanvas .offcanvas-header {\n    display: none;\n  }\n  .navbar-expand-sm .offcanvas .offcanvas-body {\n    display: flex;\n    flex-grow: 0;\n    padding: 0;\n    overflow-y: visible;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-expand-md {\n    flex-wrap: nowrap;\n    justify-content: flex-start;\n  }\n  .navbar-expand-md .navbar-nav {\n    flex-direction: row;\n  }\n  .navbar-expand-md .navbar-nav .dropdown-menu {\n    position: absolute;\n  }\n  .navbar-expand-md .navbar-nav .nav-link {\n    padding-left: var(--bs-navbar-nav-link-padding-x);\n    padding-right: var(--bs-navbar-nav-link-padding-x);\n  }\n  .navbar-expand-md .navbar-nav-scroll {\n    overflow: visible;\n  }\n  .navbar-expand-md .navbar-collapse {\n    display: flex !important;\n    flex-basis: auto;\n  }\n  .navbar-expand-md .navbar-toggler {\n    display: none;\n  }\n  .navbar-expand-md .offcanvas {\n    position: static;\n    z-index: auto;\n    flex-grow: 1;\n    width: auto !important;\n    height: auto !important;\n    visibility: visible !important;\n    background-color: transparent !important;\n    border: 0 !important;\n    transform: none !important;\n    transition: none;\n  }\n  .navbar-expand-md .offcanvas .offcanvas-header {\n    display: none;\n  }\n  .navbar-expand-md .offcanvas .offcanvas-body {\n    display: flex;\n    flex-grow: 0;\n    padding: 0;\n    overflow-y: visible;\n  }\n}\n@media (min-width: 992px) {\n  .navbar-expand-lg {\n    flex-wrap: nowrap;\n    justify-content: flex-start;\n  }\n  .navbar-expand-lg .navbar-nav {\n    flex-direction: row;\n  }\n  .navbar-expand-lg .navbar-nav .dropdown-menu {\n    position: absolute;\n  }\n  .navbar-expand-lg .navbar-nav .nav-link {\n    padding-left: var(--bs-navbar-nav-link-padding-x);\n    padding-right: var(--bs-navbar-nav-link-padding-x);\n  }\n  .navbar-expand-lg .navbar-nav-scroll {\n    overflow: visible;\n  }\n  .navbar-expand-lg .navbar-collapse {\n    display: flex !important;\n    flex-basis: auto;\n  }\n  .navbar-expand-lg .navbar-toggler {\n    display: none;\n  }\n  .navbar-expand-lg .offcanvas {\n    position: static;\n    z-index: auto;\n    flex-grow: 1;\n    width: auto !important;\n    height: auto !important;\n    visibility: visible !important;\n    background-color: transparent !important;\n    border: 0 !important;\n    transform: none !important;\n    transition: none;\n  }\n  .navbar-expand-lg .offcanvas .offcanvas-header {\n    display: none;\n  }\n  .navbar-expand-lg .offcanvas .offcanvas-body {\n    display: flex;\n    flex-grow: 0;\n    padding: 0;\n    overflow-y: visible;\n  }\n}\n@media (min-width: 1200px) {\n  .navbar-expand-xl {\n    flex-wrap: nowrap;\n    justify-content: flex-start;\n  }\n  .navbar-expand-xl .navbar-nav {\n    flex-direction: row;\n  }\n  .navbar-expand-xl .navbar-nav .dropdown-menu {\n    position: absolute;\n  }\n  .navbar-expand-xl .navbar-nav .nav-link {\n    padding-left: var(--bs-navbar-nav-link-padding-x);\n    padding-right: var(--bs-navbar-nav-link-padding-x);\n  }\n  .navbar-expand-xl .navbar-nav-scroll {\n    overflow: visible;\n  }\n  .navbar-expand-xl .navbar-collapse {\n    display: flex !important;\n    flex-basis: auto;\n  }\n  .navbar-expand-xl .navbar-toggler {\n    display: none;\n  }\n  .navbar-expand-xl .offcanvas {\n    position: static;\n    z-index: auto;\n    flex-grow: 1;\n    width: auto !important;\n    height: auto !important;\n    visibility: visible !important;\n    background-color: transparent !important;\n    border: 0 !important;\n    transform: none !important;\n    transition: none;\n  }\n  .navbar-expand-xl .offcanvas .offcanvas-header {\n    display: none;\n  }\n  .navbar-expand-xl .offcanvas .offcanvas-body {\n    display: flex;\n    flex-grow: 0;\n    padding: 0;\n    overflow-y: visible;\n  }\n}\n@media (min-width: 1400px) {\n  .navbar-expand-xxl {\n    flex-wrap: nowrap;\n    justify-content: flex-start;\n  }\n  .navbar-expand-xxl .navbar-nav {\n    flex-direction: row;\n  }\n  .navbar-expand-xxl .navbar-nav .dropdown-menu {\n    position: absolute;\n  }\n  .navbar-expand-xxl .navbar-nav .nav-link {\n    padding-left: var(--bs-navbar-nav-link-padding-x);\n    padding-right: var(--bs-navbar-nav-link-padding-x);\n  }\n  .navbar-expand-xxl .navbar-nav-scroll {\n    overflow: visible;\n  }\n  .navbar-expand-xxl .navbar-collapse {\n    display: flex !important;\n    flex-basis: auto;\n  }\n  .navbar-expand-xxl .navbar-toggler {\n    display: none;\n  }\n  .navbar-expand-xxl .offcanvas {\n    position: static;\n    z-index: auto;\n    flex-grow: 1;\n    width: auto !important;\n    height: auto !important;\n    visibility: visible !important;\n    background-color: transparent !important;\n    border: 0 !important;\n    transform: none !important;\n    transition: none;\n  }\n  .navbar-expand-xxl .offcanvas .offcanvas-header {\n    display: none;\n  }\n  .navbar-expand-xxl .offcanvas .offcanvas-body {\n    display: flex;\n    flex-grow: 0;\n    padding: 0;\n    overflow-y: visible;\n  }\n}\n.navbar-expand {\n  flex-wrap: nowrap;\n  justify-content: flex-start;\n}\n.navbar-expand .navbar-nav {\n  flex-direction: row;\n}\n.navbar-expand .navbar-nav .dropdown-menu {\n  position: absolute;\n}\n.navbar-expand .navbar-nav .nav-link {\n  padding-left: var(--bs-navbar-nav-link-padding-x);\n  padding-right: var(--bs-navbar-nav-link-padding-x);\n}\n.navbar-expand .navbar-nav-scroll {\n  overflow: visible;\n}\n.navbar-expand .navbar-collapse {\n  display: flex !important;\n  flex-basis: auto;\n}\n.navbar-expand .navbar-toggler {\n  display: none;\n}\n.navbar-expand .offcanvas {\n  position: static;\n  z-index: auto;\n  flex-grow: 1;\n  width: auto !important;\n  height: auto !important;\n  visibility: visible !important;\n  background-color: transparent !important;\n  border: 0 !important;\n  transform: none !important;\n  transition: none;\n}\n.navbar-expand .offcanvas .offcanvas-header {\n  display: none;\n}\n.navbar-expand .offcanvas .offcanvas-body {\n  display: flex;\n  flex-grow: 0;\n  padding: 0;\n  overflow-y: visible;\n}\n\n.navbar-dark,\n.navbar[data-bs-theme=dark] {\n  --bs-navbar-color: rgba(255, 255, 255, 0.55);\n  --bs-navbar-hover-color: rgba(255, 255, 255, 0.75);\n  --bs-navbar-disabled-color: rgba(255, 255, 255, 0.25);\n  --bs-navbar-active-color: #fff;\n  --bs-navbar-brand-color: #fff;\n  --bs-navbar-brand-hover-color: #fff;\n  --bs-navbar-toggler-border-color: rgba(255, 255, 255, 0.1);\n  --bs-navbar-toggler-icon-bg: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\");\n}\n\n[data-bs-theme=dark] .navbar-toggler-icon {\n  --bs-navbar-toggler-icon-bg: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\");\n}\n\n.card {\n  --bs-card-spacer-y: 1rem;\n  --bs-card-spacer-x: 1rem;\n  --bs-card-title-spacer-y: 0.5rem;\n  --bs-card-title-color: ;\n  --bs-card-subtitle-color: ;\n  --bs-card-border-width: var(--bs-border-width);\n  --bs-card-border-color: var(--bs-border-color-translucent);\n  --bs-card-border-radius: var(--bs-border-radius);\n  --bs-card-box-shadow: ;\n  --bs-card-inner-border-radius: calc(var(--bs-border-radius) - (var(--bs-border-width)));\n  --bs-card-cap-padding-y: 0.5rem;\n  --bs-card-cap-padding-x: 1rem;\n  --bs-card-cap-bg: rgba(var(--bs-body-color-rgb), 0.03);\n  --bs-card-cap-color: ;\n  --bs-card-height: ;\n  --bs-card-color: ;\n  --bs-card-bg: var(--bs-body-bg);\n  --bs-card-img-overlay-padding: 1rem;\n  --bs-card-group-margin: 0.75rem;\n  position: relative;\n  display: flex;\n  flex-direction: column;\n  min-width: 0;\n  height: var(--bs-card-height);\n  color: var(--bs-body-color);\n  word-wrap: break-word;\n  background-color: var(--bs-card-bg);\n  background-clip: border-box;\n  border: var(--bs-card-border-width) solid var(--bs-card-border-color);\n  border-radius: var(--bs-card-border-radius);\n}\n.card > hr {\n  margin-left: 0;\n  margin-right: 0;\n}\n.card > .list-group {\n  border-top: inherit;\n  border-bottom: inherit;\n}\n.card > .list-group:first-child {\n  border-top-width: 0;\n  border-top-right-radius: var(--bs-card-inner-border-radius);\n  border-top-left-radius: var(--bs-card-inner-border-radius);\n}\n.card > .list-group:last-child {\n  border-bottom-width: 0;\n  border-bottom-left-radius: var(--bs-card-inner-border-radius);\n  border-bottom-right-radius: var(--bs-card-inner-border-radius);\n}\n.card > .card-header + .list-group,\n.card > .list-group + .card-footer {\n  border-top: 0;\n}\n\n.card-body {\n  flex: 1 1 auto;\n  padding: var(--bs-card-spacer-y) var(--bs-card-spacer-x);\n  color: var(--bs-card-color);\n}\n\n.card-title {\n  margin-bottom: var(--bs-card-title-spacer-y);\n  color: var(--bs-card-title-color);\n}\n\n.card-subtitle {\n  margin-top: calc(-0.5 * var(--bs-card-title-spacer-y));\n  margin-bottom: 0;\n  color: var(--bs-card-subtitle-color);\n}\n\n.card-text:last-child {\n  margin-bottom: 0;\n}\n\n.card-link + .card-link {\n  margin-right: var(--bs-card-spacer-x);\n}\n\n.card-header {\n  padding: var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);\n  margin-bottom: 0;\n  color: var(--bs-card-cap-color);\n  background-color: var(--bs-card-cap-bg);\n  border-bottom: var(--bs-card-border-width) solid var(--bs-card-border-color);\n}\n.card-header:first-child {\n  border-radius: var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius) 0 0;\n}\n\n.card-footer {\n  padding: var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);\n  color: var(--bs-card-cap-color);\n  background-color: var(--bs-card-cap-bg);\n  border-top: var(--bs-card-border-width) solid var(--bs-card-border-color);\n}\n.card-footer:last-child {\n  border-radius: 0 0 var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius);\n}\n\n.card-header-tabs {\n  margin-left: calc(-0.5 * var(--bs-card-cap-padding-x));\n  margin-bottom: calc(-1 * var(--bs-card-cap-padding-y));\n  margin-right: calc(-0.5 * var(--bs-card-cap-padding-x));\n  border-bottom: 0;\n}\n.card-header-tabs .nav-link.active {\n  background-color: var(--bs-card-bg);\n  border-bottom-color: var(--bs-card-bg);\n}\n\n.card-header-pills {\n  margin-left: calc(-0.5 * var(--bs-card-cap-padding-x));\n  margin-right: calc(-0.5 * var(--bs-card-cap-padding-x));\n}\n\n.card-img-overlay {\n  position: absolute;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  right: 0;\n  padding: var(--bs-card-img-overlay-padding);\n  border-radius: var(--bs-card-inner-border-radius);\n}\n\n.card-img,\n.card-img-top,\n.card-img-bottom {\n  width: 100%;\n}\n\n.card-img,\n.card-img-top {\n  border-top-right-radius: var(--bs-card-inner-border-radius);\n  border-top-left-radius: var(--bs-card-inner-border-radius);\n}\n\n.card-img,\n.card-img-bottom {\n  border-bottom-left-radius: var(--bs-card-inner-border-radius);\n  border-bottom-right-radius: var(--bs-card-inner-border-radius);\n}\n\n.card-group > .card {\n  margin-bottom: var(--bs-card-group-margin);\n}\n@media (min-width: 576px) {\n  .card-group {\n    display: flex;\n    flex-flow: row wrap;\n  }\n  .card-group > .card {\n    flex: 1 0 0;\n    margin-bottom: 0;\n  }\n  .card-group > .card + .card {\n    margin-right: 0;\n    border-right: 0;\n  }\n  .card-group > .card:not(:last-child) {\n    border-top-left-radius: 0;\n    border-bottom-left-radius: 0;\n  }\n  .card-group > .card:not(:last-child) > .card-img-top,\n  .card-group > .card:not(:last-child) > .card-header {\n    border-top-left-radius: 0;\n  }\n  .card-group > .card:not(:last-child) > .card-img-bottom,\n  .card-group > .card:not(:last-child) > .card-footer {\n    border-bottom-left-radius: 0;\n  }\n  .card-group > .card:not(:first-child) {\n    border-top-right-radius: 0;\n    border-bottom-right-radius: 0;\n  }\n  .card-group > .card:not(:first-child) > .card-img-top,\n  .card-group > .card:not(:first-child) > .card-header {\n    border-top-right-radius: 0;\n  }\n  .card-group > .card:not(:first-child) > .card-img-bottom,\n  .card-group > .card:not(:first-child) > .card-footer {\n    border-bottom-right-radius: 0;\n  }\n}\n\n.accordion {\n  --bs-accordion-color: var(--bs-body-color);\n  --bs-accordion-bg: var(--bs-body-bg);\n  --bs-accordion-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, border-radius 0.15s ease;\n  --bs-accordion-border-color: var(--bs-border-color);\n  --bs-accordion-border-width: var(--bs-border-width);\n  --bs-accordion-border-radius: var(--bs-border-radius);\n  --bs-accordion-inner-border-radius: calc(var(--bs-border-radius) - (var(--bs-border-width)));\n  --bs-accordion-btn-padding-x: 1.25rem;\n  --bs-accordion-btn-padding-y: 1rem;\n  --bs-accordion-btn-color: var(--bs-body-color);\n  --bs-accordion-btn-bg: var(--bs-accordion-bg);\n  --bs-accordion-btn-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%23212529' stroke-linecap='round' stroke-linejoin='round'%3e%3cpath d='m2 5 6 6 6-6'/%3e%3c/svg%3e\");\n  --bs-accordion-btn-icon-width: 1.25rem;\n  --bs-accordion-btn-icon-transform: rotate(-180deg);\n  --bs-accordion-btn-icon-transition: transform 0.2s ease-in-out;\n  --bs-accordion-btn-active-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%23052c65' stroke-linecap='round' stroke-linejoin='round'%3e%3cpath d='m2 5 6 6 6-6'/%3e%3c/svg%3e\");\n  --bs-accordion-btn-focus-box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n  --bs-accordion-body-padding-x: 1.25rem;\n  --bs-accordion-body-padding-y: 1rem;\n  --bs-accordion-active-color: var(--bs-primary-text-emphasis);\n  --bs-accordion-active-bg: var(--bs-primary-bg-subtle);\n}\n\n.accordion-button {\n  position: relative;\n  display: flex;\n  align-items: center;\n  width: 100%;\n  padding: var(--bs-accordion-btn-padding-y) var(--bs-accordion-btn-padding-x);\n  font-size: 1rem;\n  color: var(--bs-accordion-btn-color);\n  text-align: right;\n  background-color: var(--bs-accordion-btn-bg);\n  border: 0;\n  border-radius: 0;\n  overflow-anchor: none;\n  transition: var(--bs-accordion-transition);\n}\n@media (prefers-reduced-motion: reduce) {\n  .accordion-button {\n    transition: none;\n  }\n}\n.accordion-button:not(.collapsed) {\n  color: var(--bs-accordion-active-color);\n  background-color: var(--bs-accordion-active-bg);\n  box-shadow: inset 0 calc(-1 * var(--bs-accordion-border-width)) 0 var(--bs-accordion-border-color);\n}\n.accordion-button:not(.collapsed)::after {\n  background-image: var(--bs-accordion-btn-active-icon);\n  transform: var(--bs-accordion-btn-icon-transform);\n}\n.accordion-button::after {\n  flex-shrink: 0;\n  width: var(--bs-accordion-btn-icon-width);\n  height: var(--bs-accordion-btn-icon-width);\n  margin-right: auto;\n  content: \"\";\n  background-image: var(--bs-accordion-btn-icon);\n  background-repeat: no-repeat;\n  background-size: var(--bs-accordion-btn-icon-width);\n  transition: var(--bs-accordion-btn-icon-transition);\n}\n@media (prefers-reduced-motion: reduce) {\n  .accordion-button::after {\n    transition: none;\n  }\n}\n.accordion-button:hover {\n  z-index: 2;\n}\n.accordion-button:focus {\n  z-index: 3;\n  outline: 0;\n  box-shadow: var(--bs-accordion-btn-focus-box-shadow);\n}\n\n.accordion-header {\n  margin-bottom: 0;\n}\n\n.accordion-item {\n  color: var(--bs-accordion-color);\n  background-color: var(--bs-accordion-bg);\n  border: var(--bs-accordion-border-width) solid var(--bs-accordion-border-color);\n}\n.accordion-item:first-of-type {\n  border-top-right-radius: var(--bs-accordion-border-radius);\n  border-top-left-radius: var(--bs-accordion-border-radius);\n}\n.accordion-item:first-of-type > .accordion-header .accordion-button {\n  border-top-right-radius: var(--bs-accordion-inner-border-radius);\n  border-top-left-radius: var(--bs-accordion-inner-border-radius);\n}\n.accordion-item:not(:first-of-type) {\n  border-top: 0;\n}\n.accordion-item:last-of-type {\n  border-bottom-left-radius: var(--bs-accordion-border-radius);\n  border-bottom-right-radius: var(--bs-accordion-border-radius);\n}\n.accordion-item:last-of-type > .accordion-header .accordion-button.collapsed {\n  border-bottom-left-radius: var(--bs-accordion-inner-border-radius);\n  border-bottom-right-radius: var(--bs-accordion-inner-border-radius);\n}\n.accordion-item:last-of-type > .accordion-collapse {\n  border-bottom-left-radius: var(--bs-accordion-border-radius);\n  border-bottom-right-radius: var(--bs-accordion-border-radius);\n}\n\n.accordion-body {\n  padding: var(--bs-accordion-body-padding-y) var(--bs-accordion-body-padding-x);\n}\n\n.accordion-flush > .accordion-item {\n  border-left: 0;\n  border-right: 0;\n  border-radius: 0;\n}\n.accordion-flush > .accordion-item:first-child {\n  border-top: 0;\n}\n.accordion-flush > .accordion-item:last-child {\n  border-bottom: 0;\n}\n.accordion-flush > .accordion-item > .accordion-collapse,\n.accordion-flush > .accordion-item > .accordion-header .accordion-button,\n.accordion-flush > .accordion-item > .accordion-header .accordion-button.collapsed {\n  border-radius: 0;\n}\n\n[data-bs-theme=dark] .accordion-button::after {\n  --bs-accordion-btn-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%236ea8fe'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708'/%3e%3c/svg%3e\");\n  --bs-accordion-btn-active-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%236ea8fe'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708'/%3e%3c/svg%3e\");\n}\n\n.breadcrumb {\n  --bs-breadcrumb-padding-x: 0;\n  --bs-breadcrumb-padding-y: 0;\n  --bs-breadcrumb-margin-bottom: 1rem;\n  --bs-breadcrumb-bg: ;\n  --bs-breadcrumb-border-radius: ;\n  --bs-breadcrumb-divider-color: var(--bs-secondary-color);\n  --bs-breadcrumb-item-padding-x: 0.5rem;\n  --bs-breadcrumb-item-active-color: var(--bs-secondary-color);\n  display: flex;\n  flex-wrap: wrap;\n  padding: var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x);\n  margin-bottom: var(--bs-breadcrumb-margin-bottom);\n  font-size: var(--bs-breadcrumb-font-size);\n  list-style: none;\n  background-color: var(--bs-breadcrumb-bg);\n  border-radius: var(--bs-breadcrumb-border-radius);\n}\n\n.breadcrumb-item + .breadcrumb-item {\n  padding-right: var(--bs-breadcrumb-item-padding-x);\n}\n.breadcrumb-item + .breadcrumb-item::before {\n  float: right;\n  padding-left: var(--bs-breadcrumb-item-padding-x);\n  color: var(--bs-breadcrumb-divider-color);\n  content:  var(--bs-breadcrumb-divider, \"/\") ;\n}\n.breadcrumb-item.active {\n  color: var(--bs-breadcrumb-item-active-color);\n}\n\n.pagination {\n  --bs-pagination-padding-x: 0.75rem;\n  --bs-pagination-padding-y: 0.375rem;\n  --bs-pagination-font-size: 1rem;\n  --bs-pagination-color: var(--bs-link-color);\n  --bs-pagination-bg: var(--bs-body-bg);\n  --bs-pagination-border-width: var(--bs-border-width);\n  --bs-pagination-border-color: var(--bs-border-color);\n  --bs-pagination-border-radius: var(--bs-border-radius);\n  --bs-pagination-hover-color: var(--bs-link-hover-color);\n  --bs-pagination-hover-bg: var(--bs-tertiary-bg);\n  --bs-pagination-hover-border-color: var(--bs-border-color);\n  --bs-pagination-focus-color: var(--bs-link-hover-color);\n  --bs-pagination-focus-bg: var(--bs-secondary-bg);\n  --bs-pagination-focus-box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n  --bs-pagination-active-color: #fff;\n  --bs-pagination-active-bg: #0d6efd;\n  --bs-pagination-active-border-color: #0d6efd;\n  --bs-pagination-disabled-color: var(--bs-secondary-color);\n  --bs-pagination-disabled-bg: var(--bs-secondary-bg);\n  --bs-pagination-disabled-border-color: var(--bs-border-color);\n  display: flex;\n  padding-right: 0;\n  list-style: none;\n}\n\n.page-link {\n  position: relative;\n  display: block;\n  padding: var(--bs-pagination-padding-y) var(--bs-pagination-padding-x);\n  font-size: var(--bs-pagination-font-size);\n  color: var(--bs-pagination-color);\n  text-decoration: none;\n  background-color: var(--bs-pagination-bg);\n  border: var(--bs-pagination-border-width) solid var(--bs-pagination-border-color);\n  transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n  .page-link {\n    transition: none;\n  }\n}\n.page-link:hover {\n  z-index: 2;\n  color: var(--bs-pagination-hover-color);\n  background-color: var(--bs-pagination-hover-bg);\n  border-color: var(--bs-pagination-hover-border-color);\n}\n.page-link:focus {\n  z-index: 3;\n  color: var(--bs-pagination-focus-color);\n  background-color: var(--bs-pagination-focus-bg);\n  outline: 0;\n  box-shadow: var(--bs-pagination-focus-box-shadow);\n}\n.page-link.active, .active > .page-link {\n  z-index: 3;\n  color: var(--bs-pagination-active-color);\n  background-color: var(--bs-pagination-active-bg);\n  border-color: var(--bs-pagination-active-border-color);\n}\n.page-link.disabled, .disabled > .page-link {\n  color: var(--bs-pagination-disabled-color);\n  pointer-events: none;\n  background-color: var(--bs-pagination-disabled-bg);\n  border-color: var(--bs-pagination-disabled-border-color);\n}\n\n.page-item:not(:first-child) .page-link {\n  margin-right: calc(-1 * var(--bs-border-width));\n}\n.page-item:first-child .page-link {\n  border-top-right-radius: var(--bs-pagination-border-radius);\n  border-bottom-right-radius: var(--bs-pagination-border-radius);\n}\n.page-item:last-child .page-link {\n  border-top-left-radius: var(--bs-pagination-border-radius);\n  border-bottom-left-radius: var(--bs-pagination-border-radius);\n}\n\n.pagination-lg {\n  --bs-pagination-padding-x: 1.5rem;\n  --bs-pagination-padding-y: 0.75rem;\n  --bs-pagination-font-size: 1.25rem;\n  --bs-pagination-border-radius: var(--bs-border-radius-lg);\n}\n\n.pagination-sm {\n  --bs-pagination-padding-x: 0.5rem;\n  --bs-pagination-padding-y: 0.25rem;\n  --bs-pagination-font-size: 0.875rem;\n  --bs-pagination-border-radius: var(--bs-border-radius-sm);\n}\n\n.badge {\n  --bs-badge-padding-x: 0.65em;\n  --bs-badge-padding-y: 0.35em;\n  --bs-badge-font-size: 0.75em;\n  --bs-badge-font-weight: 700;\n  --bs-badge-color: #fff;\n  --bs-badge-border-radius: var(--bs-border-radius);\n  display: inline-block;\n  padding: var(--bs-badge-padding-y) var(--bs-badge-padding-x);\n  font-size: var(--bs-badge-font-size);\n  font-weight: var(--bs-badge-font-weight);\n  line-height: 1;\n  color: var(--bs-badge-color);\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  border-radius: var(--bs-badge-border-radius);\n}\n.badge:empty {\n  display: none;\n}\n\n.btn .badge {\n  position: relative;\n  top: -1px;\n}\n\n.alert {\n  --bs-alert-bg: transparent;\n  --bs-alert-padding-x: 1rem;\n  --bs-alert-padding-y: 1rem;\n  --bs-alert-margin-bottom: 1rem;\n  --bs-alert-color: inherit;\n  --bs-alert-border-color: transparent;\n  --bs-alert-border: var(--bs-border-width) solid var(--bs-alert-border-color);\n  --bs-alert-border-radius: var(--bs-border-radius);\n  --bs-alert-link-color: inherit;\n  position: relative;\n  padding: var(--bs-alert-padding-y) var(--bs-alert-padding-x);\n  margin-bottom: var(--bs-alert-margin-bottom);\n  color: var(--bs-alert-color);\n  background-color: var(--bs-alert-bg);\n  border: var(--bs-alert-border);\n  border-radius: var(--bs-alert-border-radius);\n}\n\n.alert-heading {\n  color: inherit;\n}\n\n.alert-link {\n  font-weight: 700;\n  color: var(--bs-alert-link-color);\n}\n\n.alert-dismissible {\n  padding-left: 3rem;\n}\n.alert-dismissible .btn-close {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 2;\n  padding: 1.25rem 1rem;\n}\n\n.alert-primary {\n  --bs-alert-color: var(--bs-primary-text-emphasis);\n  --bs-alert-bg: var(--bs-primary-bg-subtle);\n  --bs-alert-border-color: var(--bs-primary-border-subtle);\n  --bs-alert-link-color: var(--bs-primary-text-emphasis);\n}\n\n.alert-secondary {\n  --bs-alert-color: var(--bs-secondary-text-emphasis);\n  --bs-alert-bg: var(--bs-secondary-bg-subtle);\n  --bs-alert-border-color: var(--bs-secondary-border-subtle);\n  --bs-alert-link-color: var(--bs-secondary-text-emphasis);\n}\n\n.alert-success {\n  --bs-alert-color: var(--bs-success-text-emphasis);\n  --bs-alert-bg: var(--bs-success-bg-subtle);\n  --bs-alert-border-color: var(--bs-success-border-subtle);\n  --bs-alert-link-color: var(--bs-success-text-emphasis);\n}\n\n.alert-info {\n  --bs-alert-color: var(--bs-info-text-emphasis);\n  --bs-alert-bg: var(--bs-info-bg-subtle);\n  --bs-alert-border-color: var(--bs-info-border-subtle);\n  --bs-alert-link-color: var(--bs-info-text-emphasis);\n}\n\n.alert-warning {\n  --bs-alert-color: var(--bs-warning-text-emphasis);\n  --bs-alert-bg: var(--bs-warning-bg-subtle);\n  --bs-alert-border-color: var(--bs-warning-border-subtle);\n  --bs-alert-link-color: var(--bs-warning-text-emphasis);\n}\n\n.alert-danger {\n  --bs-alert-color: var(--bs-danger-text-emphasis);\n  --bs-alert-bg: var(--bs-danger-bg-subtle);\n  --bs-alert-border-color: var(--bs-danger-border-subtle);\n  --bs-alert-link-color: var(--bs-danger-text-emphasis);\n}\n\n.alert-light {\n  --bs-alert-color: var(--bs-light-text-emphasis);\n  --bs-alert-bg: var(--bs-light-bg-subtle);\n  --bs-alert-border-color: var(--bs-light-border-subtle);\n  --bs-alert-link-color: var(--bs-light-text-emphasis);\n}\n\n.alert-dark {\n  --bs-alert-color: var(--bs-dark-text-emphasis);\n  --bs-alert-bg: var(--bs-dark-bg-subtle);\n  --bs-alert-border-color: var(--bs-dark-border-subtle);\n  --bs-alert-link-color: var(--bs-dark-text-emphasis);\n}\n\n@keyframes progress-bar-stripes {\n  0% {\n    background-position-x: var(--bs-progress-height);\n  }\n}\n.progress,\n.progress-stacked {\n  --bs-progress-height: 1rem;\n  --bs-progress-font-size: 0.75rem;\n  --bs-progress-bg: var(--bs-secondary-bg);\n  --bs-progress-border-radius: var(--bs-border-radius);\n  --bs-progress-box-shadow: var(--bs-box-shadow-inset);\n  --bs-progress-bar-color: #fff;\n  --bs-progress-bar-bg: #0d6efd;\n  --bs-progress-bar-transition: width 0.6s ease;\n  display: flex;\n  height: var(--bs-progress-height);\n  overflow: hidden;\n  font-size: var(--bs-progress-font-size);\n  background-color: var(--bs-progress-bg);\n  border-radius: var(--bs-progress-border-radius);\n}\n\n.progress-bar {\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n  overflow: hidden;\n  color: var(--bs-progress-bar-color);\n  text-align: center;\n  white-space: nowrap;\n  background-color: var(--bs-progress-bar-bg);\n  transition: var(--bs-progress-bar-transition);\n}\n@media (prefers-reduced-motion: reduce) {\n  .progress-bar {\n    transition: none;\n  }\n}\n\n.progress-bar-striped {\n  background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-size: var(--bs-progress-height) var(--bs-progress-height);\n}\n\n.progress-stacked > .progress {\n  overflow: visible;\n}\n\n.progress-stacked > .progress > .progress-bar {\n  width: 100%;\n}\n\n.progress-bar-animated {\n  animation: 1s linear infinite progress-bar-stripes;\n}\n@media (prefers-reduced-motion: reduce) {\n  .progress-bar-animated {\n    animation: none;\n  }\n}\n\n.list-group {\n  --bs-list-group-color: var(--bs-body-color);\n  --bs-list-group-bg: var(--bs-body-bg);\n  --bs-list-group-border-color: var(--bs-border-color);\n  --bs-list-group-border-width: var(--bs-border-width);\n  --bs-list-group-border-radius: var(--bs-border-radius);\n  --bs-list-group-item-padding-x: 1rem;\n  --bs-list-group-item-padding-y: 0.5rem;\n  --bs-list-group-action-color: var(--bs-secondary-color);\n  --bs-list-group-action-hover-color: var(--bs-emphasis-color);\n  --bs-list-group-action-hover-bg: var(--bs-tertiary-bg);\n  --bs-list-group-action-active-color: var(--bs-body-color);\n  --bs-list-group-action-active-bg: var(--bs-secondary-bg);\n  --bs-list-group-disabled-color: var(--bs-secondary-color);\n  --bs-list-group-disabled-bg: var(--bs-body-bg);\n  --bs-list-group-active-color: #fff;\n  --bs-list-group-active-bg: #0d6efd;\n  --bs-list-group-active-border-color: #0d6efd;\n  display: flex;\n  flex-direction: column;\n  padding-right: 0;\n  margin-bottom: 0;\n  border-radius: var(--bs-list-group-border-radius);\n}\n\n.list-group-numbered {\n  list-style-type: none;\n  counter-reset: section;\n}\n.list-group-numbered > .list-group-item::before {\n  content: counters(section, \".\") \". \";\n  counter-increment: section;\n}\n\n.list-group-item {\n  position: relative;\n  display: block;\n  padding: var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x);\n  color: var(--bs-list-group-color);\n  text-decoration: none;\n  background-color: var(--bs-list-group-bg);\n  border: var(--bs-list-group-border-width) solid var(--bs-list-group-border-color);\n}\n.list-group-item:first-child {\n  border-top-right-radius: inherit;\n  border-top-left-radius: inherit;\n}\n.list-group-item:last-child {\n  border-bottom-left-radius: inherit;\n  border-bottom-right-radius: inherit;\n}\n.list-group-item.disabled, .list-group-item:disabled {\n  color: var(--bs-list-group-disabled-color);\n  pointer-events: none;\n  background-color: var(--bs-list-group-disabled-bg);\n}\n.list-group-item.active {\n  z-index: 2;\n  color: var(--bs-list-group-active-color);\n  background-color: var(--bs-list-group-active-bg);\n  border-color: var(--bs-list-group-active-border-color);\n}\n.list-group-item + .list-group-item {\n  border-top-width: 0;\n}\n.list-group-item + .list-group-item.active {\n  margin-top: calc(-1 * var(--bs-list-group-border-width));\n  border-top-width: var(--bs-list-group-border-width);\n}\n\n.list-group-item-action {\n  width: 100%;\n  color: var(--bs-list-group-action-color);\n  text-align: inherit;\n}\n.list-group-item-action:not(.active):hover, .list-group-item-action:not(.active):focus {\n  z-index: 1;\n  color: var(--bs-list-group-action-hover-color);\n  text-decoration: none;\n  background-color: var(--bs-list-group-action-hover-bg);\n}\n.list-group-item-action:not(.active):active {\n  color: var(--bs-list-group-action-active-color);\n  background-color: var(--bs-list-group-action-active-bg);\n}\n\n.list-group-horizontal {\n  flex-direction: row;\n}\n.list-group-horizontal > .list-group-item:first-child:not(:last-child) {\n  border-bottom-right-radius: var(--bs-list-group-border-radius);\n  border-top-left-radius: 0;\n}\n.list-group-horizontal > .list-group-item:last-child:not(:first-child) {\n  border-top-left-radius: var(--bs-list-group-border-radius);\n  border-bottom-right-radius: 0;\n}\n.list-group-horizontal > .list-group-item.active {\n  margin-top: 0;\n}\n.list-group-horizontal > .list-group-item + .list-group-item {\n  border-top-width: var(--bs-list-group-border-width);\n  border-right-width: 0;\n}\n.list-group-horizontal > .list-group-item + .list-group-item.active {\n  margin-right: calc(-1 * var(--bs-list-group-border-width));\n  border-right-width: var(--bs-list-group-border-width);\n}\n\n@media (min-width: 576px) {\n  .list-group-horizontal-sm {\n    flex-direction: row;\n  }\n  .list-group-horizontal-sm > .list-group-item:first-child:not(:last-child) {\n    border-bottom-right-radius: var(--bs-list-group-border-radius);\n    border-top-left-radius: 0;\n  }\n  .list-group-horizontal-sm > .list-group-item:last-child:not(:first-child) {\n    border-top-left-radius: var(--bs-list-group-border-radius);\n    border-bottom-right-radius: 0;\n  }\n  .list-group-horizontal-sm > .list-group-item.active {\n    margin-top: 0;\n  }\n  .list-group-horizontal-sm > .list-group-item + .list-group-item {\n    border-top-width: var(--bs-list-group-border-width);\n    border-right-width: 0;\n  }\n  .list-group-horizontal-sm > .list-group-item + .list-group-item.active {\n    margin-right: calc(-1 * var(--bs-list-group-border-width));\n    border-right-width: var(--bs-list-group-border-width);\n  }\n}\n@media (min-width: 768px) {\n  .list-group-horizontal-md {\n    flex-direction: row;\n  }\n  .list-group-horizontal-md > .list-group-item:first-child:not(:last-child) {\n    border-bottom-right-radius: var(--bs-list-group-border-radius);\n    border-top-left-radius: 0;\n  }\n  .list-group-horizontal-md > .list-group-item:last-child:not(:first-child) {\n    border-top-left-radius: var(--bs-list-group-border-radius);\n    border-bottom-right-radius: 0;\n  }\n  .list-group-horizontal-md > .list-group-item.active {\n    margin-top: 0;\n  }\n  .list-group-horizontal-md > .list-group-item + .list-group-item {\n    border-top-width: var(--bs-list-group-border-width);\n    border-right-width: 0;\n  }\n  .list-group-horizontal-md > .list-group-item + .list-group-item.active {\n    margin-right: calc(-1 * var(--bs-list-group-border-width));\n    border-right-width: var(--bs-list-group-border-width);\n  }\n}\n@media (min-width: 992px) {\n  .list-group-horizontal-lg {\n    flex-direction: row;\n  }\n  .list-group-horizontal-lg > .list-group-item:first-child:not(:last-child) {\n    border-bottom-right-radius: var(--bs-list-group-border-radius);\n    border-top-left-radius: 0;\n  }\n  .list-group-horizontal-lg > .list-group-item:last-child:not(:first-child) {\n    border-top-left-radius: var(--bs-list-group-border-radius);\n    border-bottom-right-radius: 0;\n  }\n  .list-group-horizontal-lg > .list-group-item.active {\n    margin-top: 0;\n  }\n  .list-group-horizontal-lg > .list-group-item + .list-group-item {\n    border-top-width: var(--bs-list-group-border-width);\n    border-right-width: 0;\n  }\n  .list-group-horizontal-lg > .list-group-item + .list-group-item.active {\n    margin-right: calc(-1 * var(--bs-list-group-border-width));\n    border-right-width: var(--bs-list-group-border-width);\n  }\n}\n@media (min-width: 1200px) {\n  .list-group-horizontal-xl {\n    flex-direction: row;\n  }\n  .list-group-horizontal-xl > .list-group-item:first-child:not(:last-child) {\n    border-bottom-right-radius: var(--bs-list-group-border-radius);\n    border-top-left-radius: 0;\n  }\n  .list-group-horizontal-xl > .list-group-item:last-child:not(:first-child) {\n    border-top-left-radius: var(--bs-list-group-border-radius);\n    border-bottom-right-radius: 0;\n  }\n  .list-group-horizontal-xl > .list-group-item.active {\n    margin-top: 0;\n  }\n  .list-group-horizontal-xl > .list-group-item + .list-group-item {\n    border-top-width: var(--bs-list-group-border-width);\n    border-right-width: 0;\n  }\n  .list-group-horizontal-xl > .list-group-item + .list-group-item.active {\n    margin-right: calc(-1 * var(--bs-list-group-border-width));\n    border-right-width: var(--bs-list-group-border-width);\n  }\n}\n@media (min-width: 1400px) {\n  .list-group-horizontal-xxl {\n    flex-direction: row;\n  }\n  .list-group-horizontal-xxl > .list-group-item:first-child:not(:last-child) {\n    border-bottom-right-radius: var(--bs-list-group-border-radius);\n    border-top-left-radius: 0;\n  }\n  .list-group-horizontal-xxl > .list-group-item:last-child:not(:first-child) {\n    border-top-left-radius: var(--bs-list-group-border-radius);\n    border-bottom-right-radius: 0;\n  }\n  .list-group-horizontal-xxl > .list-group-item.active {\n    margin-top: 0;\n  }\n  .list-group-horizontal-xxl > .list-group-item + .list-group-item {\n    border-top-width: var(--bs-list-group-border-width);\n    border-right-width: 0;\n  }\n  .list-group-horizontal-xxl > .list-group-item + .list-group-item.active {\n    margin-right: calc(-1 * var(--bs-list-group-border-width));\n    border-right-width: var(--bs-list-group-border-width);\n  }\n}\n.list-group-flush {\n  border-radius: 0;\n}\n.list-group-flush > .list-group-item {\n  border-width: 0 0 var(--bs-list-group-border-width);\n}\n.list-group-flush > .list-group-item:last-child {\n  border-bottom-width: 0;\n}\n\n.list-group-item-primary {\n  --bs-list-group-color: var(--bs-primary-text-emphasis);\n  --bs-list-group-bg: var(--bs-primary-bg-subtle);\n  --bs-list-group-border-color: var(--bs-primary-border-subtle);\n  --bs-list-group-action-hover-color: var(--bs-emphasis-color);\n  --bs-list-group-action-hover-bg: var(--bs-primary-border-subtle);\n  --bs-list-group-action-active-color: var(--bs-emphasis-color);\n  --bs-list-group-action-active-bg: var(--bs-primary-border-subtle);\n  --bs-list-group-active-color: var(--bs-primary-bg-subtle);\n  --bs-list-group-active-bg: var(--bs-primary-text-emphasis);\n  --bs-list-group-active-border-color: var(--bs-primary-text-emphasis);\n}\n\n.list-group-item-secondary {\n  --bs-list-group-color: var(--bs-secondary-text-emphasis);\n  --bs-list-group-bg: var(--bs-secondary-bg-subtle);\n  --bs-list-group-border-color: var(--bs-secondary-border-subtle);\n  --bs-list-group-action-hover-color: var(--bs-emphasis-color);\n  --bs-list-group-action-hover-bg: var(--bs-secondary-border-subtle);\n  --bs-list-group-action-active-color: var(--bs-emphasis-color);\n  --bs-list-group-action-active-bg: var(--bs-secondary-border-subtle);\n  --bs-list-group-active-color: var(--bs-secondary-bg-subtle);\n  --bs-list-group-active-bg: var(--bs-secondary-text-emphasis);\n  --bs-list-group-active-border-color: var(--bs-secondary-text-emphasis);\n}\n\n.list-group-item-success {\n  --bs-list-group-color: var(--bs-success-text-emphasis);\n  --bs-list-group-bg: var(--bs-success-bg-subtle);\n  --bs-list-group-border-color: var(--bs-success-border-subtle);\n  --bs-list-group-action-hover-color: var(--bs-emphasis-color);\n  --bs-list-group-action-hover-bg: var(--bs-success-border-subtle);\n  --bs-list-group-action-active-color: var(--bs-emphasis-color);\n  --bs-list-group-action-active-bg: var(--bs-success-border-subtle);\n  --bs-list-group-active-color: var(--bs-success-bg-subtle);\n  --bs-list-group-active-bg: var(--bs-success-text-emphasis);\n  --bs-list-group-active-border-color: var(--bs-success-text-emphasis);\n}\n\n.list-group-item-info {\n  --bs-list-group-color: var(--bs-info-text-emphasis);\n  --bs-list-group-bg: var(--bs-info-bg-subtle);\n  --bs-list-group-border-color: var(--bs-info-border-subtle);\n  --bs-list-group-action-hover-color: var(--bs-emphasis-color);\n  --bs-list-group-action-hover-bg: var(--bs-info-border-subtle);\n  --bs-list-group-action-active-color: var(--bs-emphasis-color);\n  --bs-list-group-action-active-bg: var(--bs-info-border-subtle);\n  --bs-list-group-active-color: var(--bs-info-bg-subtle);\n  --bs-list-group-active-bg: var(--bs-info-text-emphasis);\n  --bs-list-group-active-border-color: var(--bs-info-text-emphasis);\n}\n\n.list-group-item-warning {\n  --bs-list-group-color: var(--bs-warning-text-emphasis);\n  --bs-list-group-bg: var(--bs-warning-bg-subtle);\n  --bs-list-group-border-color: var(--bs-warning-border-subtle);\n  --bs-list-group-action-hover-color: var(--bs-emphasis-color);\n  --bs-list-group-action-hover-bg: var(--bs-warning-border-subtle);\n  --bs-list-group-action-active-color: var(--bs-emphasis-color);\n  --bs-list-group-action-active-bg: var(--bs-warning-border-subtle);\n  --bs-list-group-active-color: var(--bs-warning-bg-subtle);\n  --bs-list-group-active-bg: var(--bs-warning-text-emphasis);\n  --bs-list-group-active-border-color: var(--bs-warning-text-emphasis);\n}\n\n.list-group-item-danger {\n  --bs-list-group-color: var(--bs-danger-text-emphasis);\n  --bs-list-group-bg: var(--bs-danger-bg-subtle);\n  --bs-list-group-border-color: var(--bs-danger-border-subtle);\n  --bs-list-group-action-hover-color: var(--bs-emphasis-color);\n  --bs-list-group-action-hover-bg: var(--bs-danger-border-subtle);\n  --bs-list-group-action-active-color: var(--bs-emphasis-color);\n  --bs-list-group-action-active-bg: var(--bs-danger-border-subtle);\n  --bs-list-group-active-color: var(--bs-danger-bg-subtle);\n  --bs-list-group-active-bg: var(--bs-danger-text-emphasis);\n  --bs-list-group-active-border-color: var(--bs-danger-text-emphasis);\n}\n\n.list-group-item-light {\n  --bs-list-group-color: var(--bs-light-text-emphasis);\n  --bs-list-group-bg: var(--bs-light-bg-subtle);\n  --bs-list-group-border-color: var(--bs-light-border-subtle);\n  --bs-list-group-action-hover-color: var(--bs-emphasis-color);\n  --bs-list-group-action-hover-bg: var(--bs-light-border-subtle);\n  --bs-list-group-action-active-color: var(--bs-emphasis-color);\n  --bs-list-group-action-active-bg: var(--bs-light-border-subtle);\n  --bs-list-group-active-color: var(--bs-light-bg-subtle);\n  --bs-list-group-active-bg: var(--bs-light-text-emphasis);\n  --bs-list-group-active-border-color: var(--bs-light-text-emphasis);\n}\n\n.list-group-item-dark {\n  --bs-list-group-color: var(--bs-dark-text-emphasis);\n  --bs-list-group-bg: var(--bs-dark-bg-subtle);\n  --bs-list-group-border-color: var(--bs-dark-border-subtle);\n  --bs-list-group-action-hover-color: var(--bs-emphasis-color);\n  --bs-list-group-action-hover-bg: var(--bs-dark-border-subtle);\n  --bs-list-group-action-active-color: var(--bs-emphasis-color);\n  --bs-list-group-action-active-bg: var(--bs-dark-border-subtle);\n  --bs-list-group-active-color: var(--bs-dark-bg-subtle);\n  --bs-list-group-active-bg: var(--bs-dark-text-emphasis);\n  --bs-list-group-active-border-color: var(--bs-dark-text-emphasis);\n}\n\n.btn-close {\n  --bs-btn-close-color: #000;\n  --bs-btn-close-bg: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414'/%3e%3c/svg%3e\");\n  --bs-btn-close-opacity: 0.5;\n  --bs-btn-close-hover-opacity: 0.75;\n  --bs-btn-close-focus-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n  --bs-btn-close-focus-opacity: 1;\n  --bs-btn-close-disabled-opacity: 0.25;\n  box-sizing: content-box;\n  width: 1em;\n  height: 1em;\n  padding: 0.25em 0.25em;\n  color: var(--bs-btn-close-color);\n  background: transparent var(--bs-btn-close-bg) center/1em auto no-repeat;\n  filter: var(--bs-btn-close-filter);\n  border: 0;\n  border-radius: 0.375rem;\n  opacity: var(--bs-btn-close-opacity);\n}\n.btn-close:hover {\n  color: var(--bs-btn-close-color);\n  text-decoration: none;\n  opacity: var(--bs-btn-close-hover-opacity);\n}\n.btn-close:focus {\n  outline: 0;\n  box-shadow: var(--bs-btn-close-focus-shadow);\n  opacity: var(--bs-btn-close-focus-opacity);\n}\n.btn-close:disabled, .btn-close.disabled {\n  pointer-events: none;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  user-select: none;\n  opacity: var(--bs-btn-close-disabled-opacity);\n}\n\n.btn-close-white {\n  --bs-btn-close-filter: invert(1) grayscale(100%) brightness(200%);\n}\n\n:root,\n[data-bs-theme=light] {\n  --bs-btn-close-filter: ;\n}\n\n[data-bs-theme=dark] {\n  --bs-btn-close-filter: invert(1) grayscale(100%) brightness(200%);\n}\n\n.toast {\n  --bs-toast-zindex: 1090;\n  --bs-toast-padding-x: 0.75rem;\n  --bs-toast-padding-y: 0.5rem;\n  --bs-toast-spacing: 1.5rem;\n  --bs-toast-max-width: 350px;\n  --bs-toast-font-size: 0.875rem;\n  --bs-toast-color: ;\n  --bs-toast-bg: rgba(var(--bs-body-bg-rgb), 0.85);\n  --bs-toast-border-width: var(--bs-border-width);\n  --bs-toast-border-color: var(--bs-border-color-translucent);\n  --bs-toast-border-radius: var(--bs-border-radius);\n  --bs-toast-box-shadow: var(--bs-box-shadow);\n  --bs-toast-header-color: var(--bs-secondary-color);\n  --bs-toast-header-bg: rgba(var(--bs-body-bg-rgb), 0.85);\n  --bs-toast-header-border-color: var(--bs-border-color-translucent);\n  width: var(--bs-toast-max-width);\n  max-width: 100%;\n  font-size: var(--bs-toast-font-size);\n  color: var(--bs-toast-color);\n  pointer-events: auto;\n  background-color: var(--bs-toast-bg);\n  background-clip: padding-box;\n  border: var(--bs-toast-border-width) solid var(--bs-toast-border-color);\n  box-shadow: var(--bs-toast-box-shadow);\n  border-radius: var(--bs-toast-border-radius);\n}\n.toast.showing {\n  opacity: 0;\n}\n.toast:not(.show) {\n  display: none;\n}\n\n.toast-container {\n  --bs-toast-zindex: 1090;\n  position: absolute;\n  z-index: var(--bs-toast-zindex);\n  width: -webkit-max-content;\n  width: -moz-max-content;\n  width: max-content;\n  max-width: 100%;\n  pointer-events: none;\n}\n.toast-container > :not(:last-child) {\n  margin-bottom: var(--bs-toast-spacing);\n}\n\n.toast-header {\n  display: flex;\n  align-items: center;\n  padding: var(--bs-toast-padding-y) var(--bs-toast-padding-x);\n  color: var(--bs-toast-header-color);\n  background-color: var(--bs-toast-header-bg);\n  background-clip: padding-box;\n  border-bottom: var(--bs-toast-border-width) solid var(--bs-toast-header-border-color);\n  border-top-right-radius: calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width));\n  border-top-left-radius: calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width));\n}\n.toast-header .btn-close {\n  margin-left: calc(-0.5 * var(--bs-toast-padding-x));\n  margin-right: var(--bs-toast-padding-x);\n}\n\n.toast-body {\n  padding: var(--bs-toast-padding-x);\n  word-wrap: break-word;\n}\n\n.modal {\n  --bs-modal-zindex: 1055;\n  --bs-modal-width: 500px;\n  --bs-modal-padding: 1rem;\n  --bs-modal-margin: 0.5rem;\n  --bs-modal-color: var(--bs-body-color);\n  --bs-modal-bg: var(--bs-body-bg);\n  --bs-modal-border-color: var(--bs-border-color-translucent);\n  --bs-modal-border-width: var(--bs-border-width);\n  --bs-modal-border-radius: var(--bs-border-radius-lg);\n  --bs-modal-box-shadow: var(--bs-box-shadow-sm);\n  --bs-modal-inner-border-radius: calc(var(--bs-border-radius-lg) - (var(--bs-border-width)));\n  --bs-modal-header-padding-x: 1rem;\n  --bs-modal-header-padding-y: 1rem;\n  --bs-modal-header-padding: 1rem 1rem;\n  --bs-modal-header-border-color: var(--bs-border-color);\n  --bs-modal-header-border-width: var(--bs-border-width);\n  --bs-modal-title-line-height: 1.5;\n  --bs-modal-footer-gap: 0.5rem;\n  --bs-modal-footer-bg: ;\n  --bs-modal-footer-border-color: var(--bs-border-color);\n  --bs-modal-footer-border-width: var(--bs-border-width);\n  position: fixed;\n  top: 0;\n  right: 0;\n  z-index: var(--bs-modal-zindex);\n  display: none;\n  width: 100%;\n  height: 100%;\n  overflow-x: hidden;\n  overflow-y: auto;\n  outline: 0;\n}\n\n.modal-dialog {\n  position: relative;\n  width: auto;\n  margin: var(--bs-modal-margin);\n  pointer-events: none;\n}\n.modal.fade .modal-dialog {\n  transform: translate(0, -50px);\n  transition: transform 0.3s ease-out;\n}\n@media (prefers-reduced-motion: reduce) {\n  .modal.fade .modal-dialog {\n    transition: none;\n  }\n}\n.modal.show .modal-dialog {\n  transform: none;\n}\n.modal.modal-static .modal-dialog {\n  transform: scale(1.02);\n}\n\n.modal-dialog-scrollable {\n  height: calc(100% - var(--bs-modal-margin) * 2);\n}\n.modal-dialog-scrollable .modal-content {\n  max-height: 100%;\n  overflow: hidden;\n}\n.modal-dialog-scrollable .modal-body {\n  overflow-y: auto;\n}\n\n.modal-dialog-centered {\n  display: flex;\n  align-items: center;\n  min-height: calc(100% - var(--bs-modal-margin) * 2);\n}\n\n.modal-content {\n  position: relative;\n  display: flex;\n  flex-direction: column;\n  width: 100%;\n  color: var(--bs-modal-color);\n  pointer-events: auto;\n  background-color: var(--bs-modal-bg);\n  background-clip: padding-box;\n  border: var(--bs-modal-border-width) solid var(--bs-modal-border-color);\n  border-radius: var(--bs-modal-border-radius);\n  outline: 0;\n}\n\n.modal-backdrop {\n  --bs-backdrop-zindex: 1050;\n  --bs-backdrop-bg: #000;\n  --bs-backdrop-opacity: 0.5;\n  position: fixed;\n  top: 0;\n  right: 0;\n  z-index: var(--bs-backdrop-zindex);\n  width: 100vw;\n  height: 100vh;\n  background-color: var(--bs-backdrop-bg);\n}\n.modal-backdrop.fade {\n  opacity: 0;\n}\n.modal-backdrop.show {\n  opacity: var(--bs-backdrop-opacity);\n}\n\n.modal-header {\n  display: flex;\n  flex-shrink: 0;\n  align-items: center;\n  padding: var(--bs-modal-header-padding);\n  border-bottom: var(--bs-modal-header-border-width) solid var(--bs-modal-header-border-color);\n  border-top-right-radius: var(--bs-modal-inner-border-radius);\n  border-top-left-radius: var(--bs-modal-inner-border-radius);\n}\n.modal-header .btn-close {\n  padding: calc(var(--bs-modal-header-padding-y) * 0.5) calc(var(--bs-modal-header-padding-x) * 0.5);\n  margin-top: calc(-0.5 * var(--bs-modal-header-padding-y));\n  margin-left: calc(-0.5 * var(--bs-modal-header-padding-x));\n  margin-bottom: calc(-0.5 * var(--bs-modal-header-padding-y));\n  margin-right: auto;\n}\n\n.modal-title {\n  margin-bottom: 0;\n  line-height: var(--bs-modal-title-line-height);\n}\n\n.modal-body {\n  position: relative;\n  flex: 1 1 auto;\n  padding: var(--bs-modal-padding);\n}\n\n.modal-footer {\n  display: flex;\n  flex-shrink: 0;\n  flex-wrap: wrap;\n  align-items: center;\n  justify-content: flex-end;\n  padding: calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap) * 0.5);\n  background-color: var(--bs-modal-footer-bg);\n  border-top: var(--bs-modal-footer-border-width) solid var(--bs-modal-footer-border-color);\n  border-bottom-left-radius: var(--bs-modal-inner-border-radius);\n  border-bottom-right-radius: var(--bs-modal-inner-border-radius);\n}\n.modal-footer > * {\n  margin: calc(var(--bs-modal-footer-gap) * 0.5);\n}\n\n@media (min-width: 576px) {\n  .modal {\n    --bs-modal-margin: 1.75rem;\n    --bs-modal-box-shadow: var(--bs-box-shadow);\n  }\n  .modal-dialog {\n    max-width: var(--bs-modal-width);\n    margin-left: auto;\n    margin-right: auto;\n  }\n  .modal-sm {\n    --bs-modal-width: 300px;\n  }\n}\n@media (min-width: 992px) {\n  .modal-lg,\n  .modal-xl {\n    --bs-modal-width: 800px;\n  }\n}\n@media (min-width: 1200px) {\n  .modal-xl {\n    --bs-modal-width: 1140px;\n  }\n}\n.modal-fullscreen {\n  width: 100vw;\n  max-width: none;\n  height: 100%;\n  margin: 0;\n}\n.modal-fullscreen .modal-content {\n  height: 100%;\n  border: 0;\n  border-radius: 0;\n}\n.modal-fullscreen .modal-header,\n.modal-fullscreen .modal-footer {\n  border-radius: 0;\n}\n.modal-fullscreen .modal-body {\n  overflow-y: auto;\n}\n\n@media (max-width: 575.98px) {\n  .modal-fullscreen-sm-down {\n    width: 100vw;\n    max-width: none;\n    height: 100%;\n    margin: 0;\n  }\n  .modal-fullscreen-sm-down .modal-content {\n    height: 100%;\n    border: 0;\n    border-radius: 0;\n  }\n  .modal-fullscreen-sm-down .modal-header,\n  .modal-fullscreen-sm-down .modal-footer {\n    border-radius: 0;\n  }\n  .modal-fullscreen-sm-down .modal-body {\n    overflow-y: auto;\n  }\n}\n@media (max-width: 767.98px) {\n  .modal-fullscreen-md-down {\n    width: 100vw;\n    max-width: none;\n    height: 100%;\n    margin: 0;\n  }\n  .modal-fullscreen-md-down .modal-content {\n    height: 100%;\n    border: 0;\n    border-radius: 0;\n  }\n  .modal-fullscreen-md-down .modal-header,\n  .modal-fullscreen-md-down .modal-footer {\n    border-radius: 0;\n  }\n  .modal-fullscreen-md-down .modal-body {\n    overflow-y: auto;\n  }\n}\n@media (max-width: 991.98px) {\n  .modal-fullscreen-lg-down {\n    width: 100vw;\n    max-width: none;\n    height: 100%;\n    margin: 0;\n  }\n  .modal-fullscreen-lg-down .modal-content {\n    height: 100%;\n    border: 0;\n    border-radius: 0;\n  }\n  .modal-fullscreen-lg-down .modal-header,\n  .modal-fullscreen-lg-down .modal-footer {\n    border-radius: 0;\n  }\n  .modal-fullscreen-lg-down .modal-body {\n    overflow-y: auto;\n  }\n}\n@media (max-width: 1199.98px) {\n  .modal-fullscreen-xl-down {\n    width: 100vw;\n    max-width: none;\n    height: 100%;\n    margin: 0;\n  }\n  .modal-fullscreen-xl-down .modal-content {\n    height: 100%;\n    border: 0;\n    border-radius: 0;\n  }\n  .modal-fullscreen-xl-down .modal-header,\n  .modal-fullscreen-xl-down .modal-footer {\n    border-radius: 0;\n  }\n  .modal-fullscreen-xl-down .modal-body {\n    overflow-y: auto;\n  }\n}\n@media (max-width: 1399.98px) {\n  .modal-fullscreen-xxl-down {\n    width: 100vw;\n    max-width: none;\n    height: 100%;\n    margin: 0;\n  }\n  .modal-fullscreen-xxl-down .modal-content {\n    height: 100%;\n    border: 0;\n    border-radius: 0;\n  }\n  .modal-fullscreen-xxl-down .modal-header,\n  .modal-fullscreen-xxl-down .modal-footer {\n    border-radius: 0;\n  }\n  .modal-fullscreen-xxl-down .modal-body {\n    overflow-y: auto;\n  }\n}\n.tooltip {\n  --bs-tooltip-zindex: 1080;\n  --bs-tooltip-max-width: 200px;\n  --bs-tooltip-padding-x: 0.5rem;\n  --bs-tooltip-padding-y: 0.25rem;\n  --bs-tooltip-margin: ;\n  --bs-tooltip-font-size: 0.875rem;\n  --bs-tooltip-color: var(--bs-body-bg);\n  --bs-tooltip-bg: var(--bs-emphasis-color);\n  --bs-tooltip-border-radius: var(--bs-border-radius);\n  --bs-tooltip-opacity: 0.9;\n  --bs-tooltip-arrow-width: 0.8rem;\n  --bs-tooltip-arrow-height: 0.4rem;\n  z-index: var(--bs-tooltip-zindex);\n  display: block;\n  margin: var(--bs-tooltip-margin);\n  font-family: var(--bs-font-sans-serif);\n  font-style: normal;\n  font-weight: 400;\n  line-height: 1.5;\n  text-align: right;\n  text-align: start;\n  text-decoration: none;\n  text-shadow: none;\n  text-transform: none;\n  letter-spacing: normal;\n  word-break: normal;\n  white-space: normal;\n  word-spacing: normal;\n  line-break: auto;\n  font-size: var(--bs-tooltip-font-size);\n  word-wrap: break-word;\n  opacity: 0;\n}\n.tooltip.show {\n  opacity: var(--bs-tooltip-opacity);\n}\n.tooltip .tooltip-arrow {\n  display: block;\n  width: var(--bs-tooltip-arrow-width);\n  height: var(--bs-tooltip-arrow-height);\n}\n.tooltip .tooltip-arrow::before {\n  position: absolute;\n  content: \"\";\n  border-color: transparent;\n  border-style: solid;\n}\n\n.bs-tooltip-top .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow {\n  bottom: calc(-1 * var(--bs-tooltip-arrow-height));\n}\n.bs-tooltip-top .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before {\n  top: -1px;\n  border-width: var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * 0.5) 0;\n  border-top-color: var(--bs-tooltip-bg);\n}\n.bs-tooltip-end .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow {\n  left: calc(-1 * var(--bs-tooltip-arrow-height));\n  width: var(--bs-tooltip-arrow-height);\n  height: var(--bs-tooltip-arrow-width);\n}\n.bs-tooltip-end .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before {\n  right: -1px;\n  border-width: calc(var(--bs-tooltip-arrow-width) * 0.5) var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * 0.5) 0;\n  border-right-color: var(--bs-tooltip-bg);\n}\n.bs-tooltip-bottom .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow {\n  top: calc(-1 * var(--bs-tooltip-arrow-height));\n}\n.bs-tooltip-bottom .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before {\n  bottom: -1px;\n  border-width: 0 calc(var(--bs-tooltip-arrow-width) * 0.5) var(--bs-tooltip-arrow-height);\n  border-bottom-color: var(--bs-tooltip-bg);\n}\n.bs-tooltip-start .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow {\n  right: calc(-1 * var(--bs-tooltip-arrow-height));\n  width: var(--bs-tooltip-arrow-height);\n  height: var(--bs-tooltip-arrow-width);\n}\n.bs-tooltip-start .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before {\n  left: -1px;\n  border-width: calc(var(--bs-tooltip-arrow-width) * 0.5) 0 calc(var(--bs-tooltip-arrow-width) * 0.5) var(--bs-tooltip-arrow-height);\n  border-left-color: var(--bs-tooltip-bg);\n}\n.tooltip-inner {\n  max-width: var(--bs-tooltip-max-width);\n  padding: var(--bs-tooltip-padding-y) var(--bs-tooltip-padding-x);\n  color: var(--bs-tooltip-color);\n  text-align: center;\n  background-color: var(--bs-tooltip-bg);\n  border-radius: var(--bs-tooltip-border-radius);\n}\n\n.popover {\n  --bs-popover-zindex: 1070;\n  --bs-popover-max-width: 276px;\n  --bs-popover-font-size: 0.875rem;\n  --bs-popover-bg: var(--bs-body-bg);\n  --bs-popover-border-width: var(--bs-border-width);\n  --bs-popover-border-color: var(--bs-border-color-translucent);\n  --bs-popover-border-radius: var(--bs-border-radius-lg);\n  --bs-popover-inner-border-radius: calc(var(--bs-border-radius-lg) - var(--bs-border-width));\n  --bs-popover-box-shadow: var(--bs-box-shadow);\n  --bs-popover-header-padding-x: 1rem;\n  --bs-popover-header-padding-y: 0.5rem;\n  --bs-popover-header-font-size: 1rem;\n  --bs-popover-header-color: inherit;\n  --bs-popover-header-bg: var(--bs-secondary-bg);\n  --bs-popover-body-padding-x: 1rem;\n  --bs-popover-body-padding-y: 1rem;\n  --bs-popover-body-color: var(--bs-body-color);\n  --bs-popover-arrow-width: 1rem;\n  --bs-popover-arrow-height: 0.5rem;\n  --bs-popover-arrow-border: var(--bs-popover-border-color);\n  z-index: var(--bs-popover-zindex);\n  display: block;\n  max-width: var(--bs-popover-max-width);\n  font-family: var(--bs-font-sans-serif);\n  font-style: normal;\n  font-weight: 400;\n  line-height: 1.5;\n  text-align: right;\n  text-align: start;\n  text-decoration: none;\n  text-shadow: none;\n  text-transform: none;\n  letter-spacing: normal;\n  word-break: normal;\n  white-space: normal;\n  word-spacing: normal;\n  line-break: auto;\n  font-size: var(--bs-popover-font-size);\n  word-wrap: break-word;\n  background-color: var(--bs-popover-bg);\n  background-clip: padding-box;\n  border: var(--bs-popover-border-width) solid var(--bs-popover-border-color);\n  border-radius: var(--bs-popover-border-radius);\n}\n.popover .popover-arrow {\n  display: block;\n  width: var(--bs-popover-arrow-width);\n  height: var(--bs-popover-arrow-height);\n}\n.popover .popover-arrow::before, .popover .popover-arrow::after {\n  position: absolute;\n  display: block;\n  content: \"\";\n  border-color: transparent;\n  border-style: solid;\n  border-width: 0;\n}\n\n.bs-popover-top > .popover-arrow, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow {\n  bottom: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));\n}\n.bs-popover-top > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::before, .bs-popover-top > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::after {\n  border-width: var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * 0.5) 0;\n}\n.bs-popover-top > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::before {\n  bottom: 0;\n  border-top-color: var(--bs-popover-arrow-border);\n}\n.bs-popover-top > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::after {\n  bottom: var(--bs-popover-border-width);\n  border-top-color: var(--bs-popover-bg);\n}\n.bs-popover-end > .popover-arrow, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow {\n  left: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));\n  width: var(--bs-popover-arrow-height);\n  height: var(--bs-popover-arrow-width);\n}\n.bs-popover-end > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::before, .bs-popover-end > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::after {\n  border-width: calc(var(--bs-popover-arrow-width) * 0.5) var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * 0.5) 0;\n}\n.bs-popover-end > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::before {\n  left: 0;\n  border-right-color: var(--bs-popover-arrow-border);\n}\n.bs-popover-end > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::after {\n  left: var(--bs-popover-border-width);\n  border-right-color: var(--bs-popover-bg);\n}\n.bs-popover-bottom > .popover-arrow, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow {\n  top: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));\n}\n.bs-popover-bottom > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::before, .bs-popover-bottom > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::after {\n  border-width: 0 calc(var(--bs-popover-arrow-width) * 0.5) var(--bs-popover-arrow-height);\n}\n.bs-popover-bottom > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::before {\n  top: 0;\n  border-bottom-color: var(--bs-popover-arrow-border);\n}\n.bs-popover-bottom > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::after {\n  top: var(--bs-popover-border-width);\n  border-bottom-color: var(--bs-popover-bg);\n}\n.bs-popover-bottom .popover-header::before, .bs-popover-auto[data-popper-placement^=bottom] .popover-header::before {\n  position: absolute;\n  top: 0;\n  right: 50%;\n  display: block;\n  width: var(--bs-popover-arrow-width);\n  margin-right: calc(-0.5 * var(--bs-popover-arrow-width));\n  content: \"\";\n  border-bottom: var(--bs-popover-border-width) solid var(--bs-popover-header-bg);\n}\n.bs-popover-start > .popover-arrow, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow {\n  right: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));\n  width: var(--bs-popover-arrow-height);\n  height: var(--bs-popover-arrow-width);\n}\n.bs-popover-start > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::before, .bs-popover-start > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::after {\n  border-width: calc(var(--bs-popover-arrow-width) * 0.5) 0 calc(var(--bs-popover-arrow-width) * 0.5) var(--bs-popover-arrow-height);\n}\n.bs-popover-start > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::before {\n  right: 0;\n  border-left-color: var(--bs-popover-arrow-border);\n}\n.bs-popover-start > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::after {\n  right: var(--bs-popover-border-width);\n  border-left-color: var(--bs-popover-bg);\n}\n.popover-header {\n  padding: var(--bs-popover-header-padding-y) var(--bs-popover-header-padding-x);\n  margin-bottom: 0;\n  font-size: var(--bs-popover-header-font-size);\n  color: var(--bs-popover-header-color);\n  background-color: var(--bs-popover-header-bg);\n  border-bottom: var(--bs-popover-border-width) solid var(--bs-popover-border-color);\n  border-top-right-radius: var(--bs-popover-inner-border-radius);\n  border-top-left-radius: var(--bs-popover-inner-border-radius);\n}\n.popover-header:empty {\n  display: none;\n}\n\n.popover-body {\n  padding: var(--bs-popover-body-padding-y) var(--bs-popover-body-padding-x);\n  color: var(--bs-popover-body-color);\n}\n\n.carousel {\n  position: relative;\n}\n\n.carousel.pointer-event {\n  touch-action: pan-y;\n}\n\n.carousel-inner {\n  position: relative;\n  width: 100%;\n  overflow: hidden;\n}\n.carousel-inner::after {\n  display: block;\n  clear: both;\n  content: \"\";\n}\n\n.carousel-item {\n  position: relative;\n  display: none;\n  float: right;\n  width: 100%;\n  margin-left: -100%;\n  -webkit-backface-visibility: hidden;\n  backface-visibility: hidden;\n  transition: transform 0.6s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n  .carousel-item {\n    transition: none;\n  }\n}\n\n.carousel-item.active,\n.carousel-item-next,\n.carousel-item-prev {\n  display: block;\n}\n\n.carousel-item-next:not(.carousel-item-start),\n.active.carousel-item-end {\n  transform: translateX(-100%);\n}\n\n.carousel-item-prev:not(.carousel-item-end),\n.active.carousel-item-start {\n  transform: translateX(100%);\n}\n\n.carousel-fade .carousel-item {\n  opacity: 0;\n  transition-property: opacity;\n  transform: none;\n}\n.carousel-fade .carousel-item.active,\n.carousel-fade .carousel-item-next.carousel-item-start,\n.carousel-fade .carousel-item-prev.carousel-item-end {\n  z-index: 1;\n  opacity: 1;\n}\n.carousel-fade .active.carousel-item-start,\n.carousel-fade .active.carousel-item-end {\n  z-index: 0;\n  opacity: 0;\n  transition: opacity 0s 0.6s;\n}\n@media (prefers-reduced-motion: reduce) {\n  .carousel-fade .active.carousel-item-start,\n  .carousel-fade .active.carousel-item-end {\n    transition: none;\n  }\n}\n\n.carousel-control-prev,\n.carousel-control-next {\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  z-index: 1;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  width: 15%;\n  padding: 0;\n  color: #fff;\n  text-align: center;\n  background: none;\n  filter: var(--bs-carousel-control-icon-filter);\n  border: 0;\n  opacity: 0.5;\n  transition: opacity 0.15s ease;\n}\n@media (prefers-reduced-motion: reduce) {\n  .carousel-control-prev,\n  .carousel-control-next {\n    transition: none;\n  }\n}\n.carousel-control-prev:hover, .carousel-control-prev:focus,\n.carousel-control-next:hover,\n.carousel-control-next:focus {\n  color: #fff;\n  text-decoration: none;\n  outline: 0;\n  opacity: 0.9;\n}\n\n.carousel-control-prev {\n  right: 0;\n}\n\n.carousel-control-next {\n  left: 0;\n}\n\n.carousel-control-prev-icon,\n.carousel-control-next-icon {\n  display: inline-block;\n  width: 2rem;\n  height: 2rem;\n  background-repeat: no-repeat;\n  background-position: 50%;\n  background-size: 100% 100%;\n}\n\n.carousel-control-prev-icon {\n  background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708'/%3e%3c/svg%3e\");\n}\n\n.carousel-control-next-icon {\n  background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0'/%3e%3c/svg%3e\");\n}\n\n.carousel-indicators {\n  position: absolute;\n  left: 0;\n  bottom: 0;\n  right: 0;\n  z-index: 2;\n  display: flex;\n  justify-content: center;\n  padding: 0;\n  margin-left: 15%;\n  margin-bottom: 1rem;\n  margin-right: 15%;\n}\n.carousel-indicators [data-bs-target] {\n  box-sizing: content-box;\n  flex: 0 1 auto;\n  width: 30px;\n  height: 3px;\n  padding: 0;\n  margin-left: 3px;\n  margin-right: 3px;\n  text-indent: -999px;\n  cursor: pointer;\n  background-color: var(--bs-carousel-indicator-active-bg);\n  background-clip: padding-box;\n  border: 0;\n  border-top: 10px solid transparent;\n  border-bottom: 10px solid transparent;\n  opacity: 0.5;\n  transition: opacity 0.6s ease;\n}\n@media (prefers-reduced-motion: reduce) {\n  .carousel-indicators [data-bs-target] {\n    transition: none;\n  }\n}\n.carousel-indicators .active {\n  opacity: 1;\n}\n\n.carousel-caption {\n  position: absolute;\n  left: 15%;\n  bottom: 1.25rem;\n  right: 15%;\n  padding-top: 1.25rem;\n  padding-bottom: 1.25rem;\n  color: var(--bs-carousel-caption-color);\n  text-align: center;\n}\n\n.carousel-dark {\n  --bs-carousel-indicator-active-bg: #000;\n  --bs-carousel-caption-color: #000;\n  --bs-carousel-control-icon-filter: invert(1) grayscale(100);\n}\n\n:root,\n[data-bs-theme=light] {\n  --bs-carousel-indicator-active-bg: #fff;\n  --bs-carousel-caption-color: #fff;\n  --bs-carousel-control-icon-filter: ;\n}\n\n[data-bs-theme=dark] {\n  --bs-carousel-indicator-active-bg: #000;\n  --bs-carousel-caption-color: #000;\n  --bs-carousel-control-icon-filter: invert(1) grayscale(100);\n}\n\n.spinner-grow,\n.spinner-border {\n  display: inline-block;\n  flex-shrink: 0;\n  width: var(--bs-spinner-width);\n  height: var(--bs-spinner-height);\n  vertical-align: var(--bs-spinner-vertical-align);\n  border-radius: 50%;\n  animation: var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name);\n}\n\n@keyframes spinner-border {\n  to {\n    transform: rotate(360deg) ;\n  }\n}\n.spinner-border {\n  --bs-spinner-width: 2rem;\n  --bs-spinner-height: 2rem;\n  --bs-spinner-vertical-align: -0.125em;\n  --bs-spinner-border-width: 0.25em;\n  --bs-spinner-animation-speed: 0.75s;\n  --bs-spinner-animation-name: spinner-border;\n  border: var(--bs-spinner-border-width) solid currentcolor;\n  border-left-color: transparent;\n}\n\n.spinner-border-sm {\n  --bs-spinner-width: 1rem;\n  --bs-spinner-height: 1rem;\n  --bs-spinner-border-width: 0.2em;\n}\n\n@keyframes spinner-grow {\n  0% {\n    transform: scale(0);\n  }\n  50% {\n    opacity: 1;\n    transform: none;\n  }\n}\n.spinner-grow {\n  --bs-spinner-width: 2rem;\n  --bs-spinner-height: 2rem;\n  --bs-spinner-vertical-align: -0.125em;\n  --bs-spinner-animation-speed: 0.75s;\n  --bs-spinner-animation-name: spinner-grow;\n  background-color: currentcolor;\n  opacity: 0;\n}\n\n.spinner-grow-sm {\n  --bs-spinner-width: 1rem;\n  --bs-spinner-height: 1rem;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .spinner-border,\n  .spinner-grow {\n    --bs-spinner-animation-speed: 1.5s;\n  }\n}\n.offcanvas, .offcanvas-xxl, .offcanvas-xl, .offcanvas-lg, .offcanvas-md, .offcanvas-sm {\n  --bs-offcanvas-zindex: 1045;\n  --bs-offcanvas-width: 400px;\n  --bs-offcanvas-height: 30vh;\n  --bs-offcanvas-padding-x: 1rem;\n  --bs-offcanvas-padding-y: 1rem;\n  --bs-offcanvas-color: var(--bs-body-color);\n  --bs-offcanvas-bg: var(--bs-body-bg);\n  --bs-offcanvas-border-width: var(--bs-border-width);\n  --bs-offcanvas-border-color: var(--bs-border-color-translucent);\n  --bs-offcanvas-box-shadow: var(--bs-box-shadow-sm);\n  --bs-offcanvas-transition: transform 0.3s ease-in-out;\n  --bs-offcanvas-title-line-height: 1.5;\n}\n\n@media (max-width: 575.98px) {\n  .offcanvas-sm {\n    position: fixed;\n    bottom: 0;\n    z-index: var(--bs-offcanvas-zindex);\n    display: flex;\n    flex-direction: column;\n    max-width: 100%;\n    color: var(--bs-offcanvas-color);\n    visibility: hidden;\n    background-color: var(--bs-offcanvas-bg);\n    background-clip: padding-box;\n    outline: 0;\n    transition: var(--bs-offcanvas-transition);\n  }\n}\n@media (max-width: 575.98px) and (prefers-reduced-motion: reduce) {\n  .offcanvas-sm {\n    transition: none;\n  }\n}\n@media (max-width: 575.98px) {\n  .offcanvas-sm.offcanvas-start {\n    top: 0;\n    right: 0;\n    width: var(--bs-offcanvas-width);\n    border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n    transform: translateX(100%);\n  }\n  .offcanvas-sm.offcanvas-end {\n    top: 0;\n    left: 0;\n    width: var(--bs-offcanvas-width);\n    border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n    transform: translateX(-100%);\n  }\n  .offcanvas-sm.offcanvas-top {\n    top: 0;\n    left: 0;\n    right: 0;\n    height: var(--bs-offcanvas-height);\n    max-height: 100%;\n    border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n    transform: translateY(-100%);\n  }\n  .offcanvas-sm.offcanvas-bottom {\n    left: 0;\n    right: 0;\n    height: var(--bs-offcanvas-height);\n    max-height: 100%;\n    border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n    transform: translateY(100%);\n  }\n  .offcanvas-sm.showing, .offcanvas-sm.show:not(.hiding) {\n    transform: none;\n  }\n  .offcanvas-sm.showing, .offcanvas-sm.hiding, .offcanvas-sm.show {\n    visibility: visible;\n  }\n}\n@media (min-width: 576px) {\n  .offcanvas-sm {\n    --bs-offcanvas-height: auto;\n    --bs-offcanvas-border-width: 0;\n    background-color: transparent !important;\n  }\n  .offcanvas-sm .offcanvas-header {\n    display: none;\n  }\n  .offcanvas-sm .offcanvas-body {\n    display: flex;\n    flex-grow: 0;\n    padding: 0;\n    overflow-y: visible;\n    background-color: transparent !important;\n  }\n}\n\n@media (max-width: 767.98px) {\n  .offcanvas-md {\n    position: fixed;\n    bottom: 0;\n    z-index: var(--bs-offcanvas-zindex);\n    display: flex;\n    flex-direction: column;\n    max-width: 100%;\n    color: var(--bs-offcanvas-color);\n    visibility: hidden;\n    background-color: var(--bs-offcanvas-bg);\n    background-clip: padding-box;\n    outline: 0;\n    transition: var(--bs-offcanvas-transition);\n  }\n}\n@media (max-width: 767.98px) and (prefers-reduced-motion: reduce) {\n  .offcanvas-md {\n    transition: none;\n  }\n}\n@media (max-width: 767.98px) {\n  .offcanvas-md.offcanvas-start {\n    top: 0;\n    right: 0;\n    width: var(--bs-offcanvas-width);\n    border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n    transform: translateX(100%);\n  }\n  .offcanvas-md.offcanvas-end {\n    top: 0;\n    left: 0;\n    width: var(--bs-offcanvas-width);\n    border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n    transform: translateX(-100%);\n  }\n  .offcanvas-md.offcanvas-top {\n    top: 0;\n    left: 0;\n    right: 0;\n    height: var(--bs-offcanvas-height);\n    max-height: 100%;\n    border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n    transform: translateY(-100%);\n  }\n  .offcanvas-md.offcanvas-bottom {\n    left: 0;\n    right: 0;\n    height: var(--bs-offcanvas-height);\n    max-height: 100%;\n    border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n    transform: translateY(100%);\n  }\n  .offcanvas-md.showing, .offcanvas-md.show:not(.hiding) {\n    transform: none;\n  }\n  .offcanvas-md.showing, .offcanvas-md.hiding, .offcanvas-md.show {\n    visibility: visible;\n  }\n}\n@media (min-width: 768px) {\n  .offcanvas-md {\n    --bs-offcanvas-height: auto;\n    --bs-offcanvas-border-width: 0;\n    background-color: transparent !important;\n  }\n  .offcanvas-md .offcanvas-header {\n    display: none;\n  }\n  .offcanvas-md .offcanvas-body {\n    display: flex;\n    flex-grow: 0;\n    padding: 0;\n    overflow-y: visible;\n    background-color: transparent !important;\n  }\n}\n\n@media (max-width: 991.98px) {\n  .offcanvas-lg {\n    position: fixed;\n    bottom: 0;\n    z-index: var(--bs-offcanvas-zindex);\n    display: flex;\n    flex-direction: column;\n    max-width: 100%;\n    color: var(--bs-offcanvas-color);\n    visibility: hidden;\n    background-color: var(--bs-offcanvas-bg);\n    background-clip: padding-box;\n    outline: 0;\n    transition: var(--bs-offcanvas-transition);\n  }\n}\n@media (max-width: 991.98px) and (prefers-reduced-motion: reduce) {\n  .offcanvas-lg {\n    transition: none;\n  }\n}\n@media (max-width: 991.98px) {\n  .offcanvas-lg.offcanvas-start {\n    top: 0;\n    right: 0;\n    width: var(--bs-offcanvas-width);\n    border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n    transform: translateX(100%);\n  }\n  .offcanvas-lg.offcanvas-end {\n    top: 0;\n    left: 0;\n    width: var(--bs-offcanvas-width);\n    border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n    transform: translateX(-100%);\n  }\n  .offcanvas-lg.offcanvas-top {\n    top: 0;\n    left: 0;\n    right: 0;\n    height: var(--bs-offcanvas-height);\n    max-height: 100%;\n    border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n    transform: translateY(-100%);\n  }\n  .offcanvas-lg.offcanvas-bottom {\n    left: 0;\n    right: 0;\n    height: var(--bs-offcanvas-height);\n    max-height: 100%;\n    border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n    transform: translateY(100%);\n  }\n  .offcanvas-lg.showing, .offcanvas-lg.show:not(.hiding) {\n    transform: none;\n  }\n  .offcanvas-lg.showing, .offcanvas-lg.hiding, .offcanvas-lg.show {\n    visibility: visible;\n  }\n}\n@media (min-width: 992px) {\n  .offcanvas-lg {\n    --bs-offcanvas-height: auto;\n    --bs-offcanvas-border-width: 0;\n    background-color: transparent !important;\n  }\n  .offcanvas-lg .offcanvas-header {\n    display: none;\n  }\n  .offcanvas-lg .offcanvas-body {\n    display: flex;\n    flex-grow: 0;\n    padding: 0;\n    overflow-y: visible;\n    background-color: transparent !important;\n  }\n}\n\n@media (max-width: 1199.98px) {\n  .offcanvas-xl {\n    position: fixed;\n    bottom: 0;\n    z-index: var(--bs-offcanvas-zindex);\n    display: flex;\n    flex-direction: column;\n    max-width: 100%;\n    color: var(--bs-offcanvas-color);\n    visibility: hidden;\n    background-color: var(--bs-offcanvas-bg);\n    background-clip: padding-box;\n    outline: 0;\n    transition: var(--bs-offcanvas-transition);\n  }\n}\n@media (max-width: 1199.98px) and (prefers-reduced-motion: reduce) {\n  .offcanvas-xl {\n    transition: none;\n  }\n}\n@media (max-width: 1199.98px) {\n  .offcanvas-xl.offcanvas-start {\n    top: 0;\n    right: 0;\n    width: var(--bs-offcanvas-width);\n    border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n    transform: translateX(100%);\n  }\n  .offcanvas-xl.offcanvas-end {\n    top: 0;\n    left: 0;\n    width: var(--bs-offcanvas-width);\n    border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n    transform: translateX(-100%);\n  }\n  .offcanvas-xl.offcanvas-top {\n    top: 0;\n    left: 0;\n    right: 0;\n    height: var(--bs-offcanvas-height);\n    max-height: 100%;\n    border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n    transform: translateY(-100%);\n  }\n  .offcanvas-xl.offcanvas-bottom {\n    left: 0;\n    right: 0;\n    height: var(--bs-offcanvas-height);\n    max-height: 100%;\n    border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n    transform: translateY(100%);\n  }\n  .offcanvas-xl.showing, .offcanvas-xl.show:not(.hiding) {\n    transform: none;\n  }\n  .offcanvas-xl.showing, .offcanvas-xl.hiding, .offcanvas-xl.show {\n    visibility: visible;\n  }\n}\n@media (min-width: 1200px) {\n  .offcanvas-xl {\n    --bs-offcanvas-height: auto;\n    --bs-offcanvas-border-width: 0;\n    background-color: transparent !important;\n  }\n  .offcanvas-xl .offcanvas-header {\n    display: none;\n  }\n  .offcanvas-xl .offcanvas-body {\n    display: flex;\n    flex-grow: 0;\n    padding: 0;\n    overflow-y: visible;\n    background-color: transparent !important;\n  }\n}\n\n@media (max-width: 1399.98px) {\n  .offcanvas-xxl {\n    position: fixed;\n    bottom: 0;\n    z-index: var(--bs-offcanvas-zindex);\n    display: flex;\n    flex-direction: column;\n    max-width: 100%;\n    color: var(--bs-offcanvas-color);\n    visibility: hidden;\n    background-color: var(--bs-offcanvas-bg);\n    background-clip: padding-box;\n    outline: 0;\n    transition: var(--bs-offcanvas-transition);\n  }\n}\n@media (max-width: 1399.98px) and (prefers-reduced-motion: reduce) {\n  .offcanvas-xxl {\n    transition: none;\n  }\n}\n@media (max-width: 1399.98px) {\n  .offcanvas-xxl.offcanvas-start {\n    top: 0;\n    right: 0;\n    width: var(--bs-offcanvas-width);\n    border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n    transform: translateX(100%);\n  }\n  .offcanvas-xxl.offcanvas-end {\n    top: 0;\n    left: 0;\n    width: var(--bs-offcanvas-width);\n    border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n    transform: translateX(-100%);\n  }\n  .offcanvas-xxl.offcanvas-top {\n    top: 0;\n    left: 0;\n    right: 0;\n    height: var(--bs-offcanvas-height);\n    max-height: 100%;\n    border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n    transform: translateY(-100%);\n  }\n  .offcanvas-xxl.offcanvas-bottom {\n    left: 0;\n    right: 0;\n    height: var(--bs-offcanvas-height);\n    max-height: 100%;\n    border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n    transform: translateY(100%);\n  }\n  .offcanvas-xxl.showing, .offcanvas-xxl.show:not(.hiding) {\n    transform: none;\n  }\n  .offcanvas-xxl.showing, .offcanvas-xxl.hiding, .offcanvas-xxl.show {\n    visibility: visible;\n  }\n}\n@media (min-width: 1400px) {\n  .offcanvas-xxl {\n    --bs-offcanvas-height: auto;\n    --bs-offcanvas-border-width: 0;\n    background-color: transparent !important;\n  }\n  .offcanvas-xxl .offcanvas-header {\n    display: none;\n  }\n  .offcanvas-xxl .offcanvas-body {\n    display: flex;\n    flex-grow: 0;\n    padding: 0;\n    overflow-y: visible;\n    background-color: transparent !important;\n  }\n}\n\n.offcanvas {\n  position: fixed;\n  bottom: 0;\n  z-index: var(--bs-offcanvas-zindex);\n  display: flex;\n  flex-direction: column;\n  max-width: 100%;\n  color: var(--bs-offcanvas-color);\n  visibility: hidden;\n  background-color: var(--bs-offcanvas-bg);\n  background-clip: padding-box;\n  outline: 0;\n  transition: var(--bs-offcanvas-transition);\n}\n@media (prefers-reduced-motion: reduce) {\n  .offcanvas {\n    transition: none;\n  }\n}\n.offcanvas.offcanvas-start {\n  top: 0;\n  right: 0;\n  width: var(--bs-offcanvas-width);\n  border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n  transform: translateX(100%);\n}\n.offcanvas.offcanvas-end {\n  top: 0;\n  left: 0;\n  width: var(--bs-offcanvas-width);\n  border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n  transform: translateX(-100%);\n}\n.offcanvas.offcanvas-top {\n  top: 0;\n  left: 0;\n  right: 0;\n  height: var(--bs-offcanvas-height);\n  max-height: 100%;\n  border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n  transform: translateY(-100%);\n}\n.offcanvas.offcanvas-bottom {\n  left: 0;\n  right: 0;\n  height: var(--bs-offcanvas-height);\n  max-height: 100%;\n  border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n  transform: translateY(100%);\n}\n.offcanvas.showing, .offcanvas.show:not(.hiding) {\n  transform: none;\n}\n.offcanvas.showing, .offcanvas.hiding, .offcanvas.show {\n  visibility: visible;\n}\n\n.offcanvas-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  z-index: 1040;\n  width: 100vw;\n  height: 100vh;\n  background-color: #000;\n}\n.offcanvas-backdrop.fade {\n  opacity: 0;\n}\n.offcanvas-backdrop.show {\n  opacity: 0.5;\n}\n\n.offcanvas-header {\n  display: flex;\n  align-items: center;\n  padding: var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x);\n}\n.offcanvas-header .btn-close {\n  padding: calc(var(--bs-offcanvas-padding-y) * 0.5) calc(var(--bs-offcanvas-padding-x) * 0.5);\n  margin-top: calc(-0.5 * var(--bs-offcanvas-padding-y));\n  margin-left: calc(-0.5 * var(--bs-offcanvas-padding-x));\n  margin-bottom: calc(-0.5 * var(--bs-offcanvas-padding-y));\n  margin-right: auto;\n}\n\n.offcanvas-title {\n  margin-bottom: 0;\n  line-height: var(--bs-offcanvas-title-line-height);\n}\n\n.offcanvas-body {\n  flex-grow: 1;\n  padding: var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x);\n  overflow-y: auto;\n}\n\n.placeholder {\n  display: inline-block;\n  min-height: 1em;\n  vertical-align: middle;\n  cursor: wait;\n  background-color: currentcolor;\n  opacity: 0.5;\n}\n.placeholder.btn::before {\n  display: inline-block;\n  content: \"\";\n}\n\n.placeholder-xs {\n  min-height: 0.6em;\n}\n\n.placeholder-sm {\n  min-height: 0.8em;\n}\n\n.placeholder-lg {\n  min-height: 1.2em;\n}\n\n.placeholder-glow .placeholder {\n  animation: placeholder-glow 2s ease-in-out infinite;\n}\n\n@keyframes placeholder-glow {\n  50% {\n    opacity: 0.2;\n  }\n}\n.placeholder-wave {\n  -webkit-mask-image: linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%);\n  mask-image: linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%);\n  -webkit-mask-size: 200% 100%;\n  mask-size: 200% 100%;\n  animation: placeholder-wave 2s linear infinite;\n}\n\n@keyframes placeholder-wave {\n  100% {\n    -webkit-mask-position: -200% 0%;\n    mask-position: -200% 0%;\n  }\n}\n.clearfix::after {\n  display: block;\n  clear: both;\n  content: \"\";\n}\n\n.text-bg-primary {\n  color: #fff !important;\n  background-color: RGBA(var(--bs-primary-rgb), var(--bs-bg-opacity, 1)) !important;\n}\n\n.text-bg-secondary {\n  color: #fff !important;\n  background-color: RGBA(var(--bs-secondary-rgb), var(--bs-bg-opacity, 1)) !important;\n}\n\n.text-bg-success {\n  color: #fff !important;\n  background-color: RGBA(var(--bs-success-rgb), var(--bs-bg-opacity, 1)) !important;\n}\n\n.text-bg-info {\n  color: #000 !important;\n  background-color: RGBA(var(--bs-info-rgb), var(--bs-bg-opacity, 1)) !important;\n}\n\n.text-bg-warning {\n  color: #000 !important;\n  background-color: RGBA(var(--bs-warning-rgb), var(--bs-bg-opacity, 1)) !important;\n}\n\n.text-bg-danger {\n  color: #fff !important;\n  background-color: RGBA(var(--bs-danger-rgb), var(--bs-bg-opacity, 1)) !important;\n}\n\n.text-bg-light {\n  color: #000 !important;\n  background-color: RGBA(var(--bs-light-rgb), var(--bs-bg-opacity, 1)) !important;\n}\n\n.text-bg-dark {\n  color: #fff !important;\n  background-color: RGBA(var(--bs-dark-rgb), var(--bs-bg-opacity, 1)) !important;\n}\n\n.link-primary {\n  color: RGBA(var(--bs-primary-rgb), var(--bs-link-opacity, 1)) !important;\n  -webkit-text-decoration-color: RGBA(var(--bs-primary-rgb), var(--bs-link-underline-opacity, 1)) !important;\n  text-decoration-color: RGBA(var(--bs-primary-rgb), var(--bs-link-underline-opacity, 1)) !important;\n}\n.link-primary:hover, .link-primary:focus {\n  color: RGBA(10, 88, 202, var(--bs-link-opacity, 1)) !important;\n  -webkit-text-decoration-color: RGBA(10, 88, 202, var(--bs-link-underline-opacity, 1)) !important;\n  text-decoration-color: RGBA(10, 88, 202, var(--bs-link-underline-opacity, 1)) !important;\n}\n\n.link-secondary {\n  color: RGBA(var(--bs-secondary-rgb), var(--bs-link-opacity, 1)) !important;\n  -webkit-text-decoration-color: RGBA(var(--bs-secondary-rgb), var(--bs-link-underline-opacity, 1)) !important;\n  text-decoration-color: RGBA(var(--bs-secondary-rgb), var(--bs-link-underline-opacity, 1)) !important;\n}\n.link-secondary:hover, .link-secondary:focus {\n  color: RGBA(86, 94, 100, var(--bs-link-opacity, 1)) !important;\n  -webkit-text-decoration-color: RGBA(86, 94, 100, var(--bs-link-underline-opacity, 1)) !important;\n  text-decoration-color: RGBA(86, 94, 100, var(--bs-link-underline-opacity, 1)) !important;\n}\n\n.link-success {\n  color: RGBA(var(--bs-success-rgb), var(--bs-link-opacity, 1)) !important;\n  -webkit-text-decoration-color: RGBA(var(--bs-success-rgb), var(--bs-link-underline-opacity, 1)) !important;\n  text-decoration-color: RGBA(var(--bs-success-rgb), var(--bs-link-underline-opacity, 1)) !important;\n}\n.link-success:hover, .link-success:focus {\n  color: RGBA(20, 108, 67, var(--bs-link-opacity, 1)) !important;\n  -webkit-text-decoration-color: RGBA(20, 108, 67, var(--bs-link-underline-opacity, 1)) !important;\n  text-decoration-color: RGBA(20, 108, 67, var(--bs-link-underline-opacity, 1)) !important;\n}\n\n.link-info {\n  color: RGBA(var(--bs-info-rgb), var(--bs-link-opacity, 1)) !important;\n  -webkit-text-decoration-color: RGBA(var(--bs-info-rgb), var(--bs-link-underline-opacity, 1)) !important;\n  text-decoration-color: RGBA(var(--bs-info-rgb), var(--bs-link-underline-opacity, 1)) !important;\n}\n.link-info:hover, .link-info:focus {\n  color: RGBA(61, 213, 243, var(--bs-link-opacity, 1)) !important;\n  -webkit-text-decoration-color: RGBA(61, 213, 243, var(--bs-link-underline-opacity, 1)) !important;\n  text-decoration-color: RGBA(61, 213, 243, var(--bs-link-underline-opacity, 1)) !important;\n}\n\n.link-warning {\n  color: RGBA(var(--bs-warning-rgb), var(--bs-link-opacity, 1)) !important;\n  -webkit-text-decoration-color: RGBA(var(--bs-warning-rgb), var(--bs-link-underline-opacity, 1)) !important;\n  text-decoration-color: RGBA(var(--bs-warning-rgb), var(--bs-link-underline-opacity, 1)) !important;\n}\n.link-warning:hover, .link-warning:focus {\n  color: RGBA(255, 205, 57, var(--bs-link-opacity, 1)) !important;\n  -webkit-text-decoration-color: RGBA(255, 205, 57, var(--bs-link-underline-opacity, 1)) !important;\n  text-decoration-color: RGBA(255, 205, 57, var(--bs-link-underline-opacity, 1)) !important;\n}\n\n.link-danger {\n  color: RGBA(var(--bs-danger-rgb), var(--bs-link-opacity, 1)) !important;\n  -webkit-text-decoration-color: RGBA(var(--bs-danger-rgb), var(--bs-link-underline-opacity, 1)) !important;\n  text-decoration-color: RGBA(var(--bs-danger-rgb), var(--bs-link-underline-opacity, 1)) !important;\n}\n.link-danger:hover, .link-danger:focus {\n  color: RGBA(176, 42, 55, var(--bs-link-opacity, 1)) !important;\n  -webkit-text-decoration-color: RGBA(176, 42, 55, var(--bs-link-underline-opacity, 1)) !important;\n  text-decoration-color: RGBA(176, 42, 55, var(--bs-link-underline-opacity, 1)) !important;\n}\n\n.link-light {\n  color: RGBA(var(--bs-light-rgb), var(--bs-link-opacity, 1)) !important;\n  -webkit-text-decoration-color: RGBA(var(--bs-light-rgb), var(--bs-link-underline-opacity, 1)) !important;\n  text-decoration-color: RGBA(var(--bs-light-rgb), var(--bs-link-underline-opacity, 1)) !important;\n}\n.link-light:hover, .link-light:focus {\n  color: RGBA(249, 250, 251, var(--bs-link-opacity, 1)) !important;\n  -webkit-text-decoration-color: RGBA(249, 250, 251, var(--bs-link-underline-opacity, 1)) !important;\n  text-decoration-color: RGBA(249, 250, 251, var(--bs-link-underline-opacity, 1)) !important;\n}\n\n.link-dark {\n  color: RGBA(var(--bs-dark-rgb), var(--bs-link-opacity, 1)) !important;\n  -webkit-text-decoration-color: RGBA(var(--bs-dark-rgb), var(--bs-link-underline-opacity, 1)) !important;\n  text-decoration-color: RGBA(var(--bs-dark-rgb), var(--bs-link-underline-opacity, 1)) !important;\n}\n.link-dark:hover, .link-dark:focus {\n  color: RGBA(26, 30, 33, var(--bs-link-opacity, 1)) !important;\n  -webkit-text-decoration-color: RGBA(26, 30, 33, var(--bs-link-underline-opacity, 1)) !important;\n  text-decoration-color: RGBA(26, 30, 33, var(--bs-link-underline-opacity, 1)) !important;\n}\n\n.link-body-emphasis {\n  color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 1)) !important;\n  -webkit-text-decoration-color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 1)) !important;\n  text-decoration-color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 1)) !important;\n}\n.link-body-emphasis:hover, .link-body-emphasis:focus {\n  color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 0.75)) !important;\n  -webkit-text-decoration-color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 0.75)) !important;\n  text-decoration-color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 0.75)) !important;\n}\n\n.focus-ring:focus {\n  outline: 0;\n  box-shadow: var(--bs-focus-ring-x, 0) var(--bs-focus-ring-y, 0) var(--bs-focus-ring-blur, 0) var(--bs-focus-ring-width) var(--bs-focus-ring-color);\n}\n\n.icon-link {\n  display: inline-flex;\n  gap: 0.375rem;\n  align-items: center;\n  -webkit-text-decoration-color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 0.5));\n  text-decoration-color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 0.5));\n  text-underline-offset: 0.25em;\n  -webkit-backface-visibility: hidden;\n  backface-visibility: hidden;\n}\n.icon-link > .bi {\n  flex-shrink: 0;\n  width: 1em;\n  height: 1em;\n  fill: currentcolor;\n  transition: 0.2s ease-in-out transform;\n}\n@media (prefers-reduced-motion: reduce) {\n  .icon-link > .bi {\n    transition: none;\n  }\n}\n\n.icon-link-hover:hover > .bi, .icon-link-hover:focus-visible > .bi {\n  transform: var(--bs-icon-link-transform, translate3d(-0.25em, 0, 0));\n}\n\n.ratio {\n  position: relative;\n  width: 100%;\n}\n.ratio::before {\n  display: block;\n  padding-top: var(--bs-aspect-ratio);\n  content: \"\";\n}\n.ratio > * {\n  position: absolute;\n  top: 0;\n  right: 0;\n  width: 100%;\n  height: 100%;\n}\n\n.ratio-1x1 {\n  --bs-aspect-ratio: 100%;\n}\n\n.ratio-4x3 {\n  --bs-aspect-ratio: 75%;\n}\n\n.ratio-16x9 {\n  --bs-aspect-ratio: 56.25%;\n}\n\n.ratio-21x9 {\n  --bs-aspect-ratio: 42.8571428571%;\n}\n\n.fixed-top {\n  position: fixed;\n  top: 0;\n  left: 0;\n  right: 0;\n  z-index: 1030;\n}\n\n.fixed-bottom {\n  position: fixed;\n  left: 0;\n  bottom: 0;\n  right: 0;\n  z-index: 1030;\n}\n\n.sticky-top {\n  position: -webkit-sticky;\n  position: sticky;\n  top: 0;\n  z-index: 1020;\n}\n\n.sticky-bottom {\n  position: -webkit-sticky;\n  position: sticky;\n  bottom: 0;\n  z-index: 1020;\n}\n\n@media (min-width: 576px) {\n  .sticky-sm-top {\n    position: -webkit-sticky;\n    position: sticky;\n    top: 0;\n    z-index: 1020;\n  }\n  .sticky-sm-bottom {\n    position: -webkit-sticky;\n    position: sticky;\n    bottom: 0;\n    z-index: 1020;\n  }\n}\n@media (min-width: 768px) {\n  .sticky-md-top {\n    position: -webkit-sticky;\n    position: sticky;\n    top: 0;\n    z-index: 1020;\n  }\n  .sticky-md-bottom {\n    position: -webkit-sticky;\n    position: sticky;\n    bottom: 0;\n    z-index: 1020;\n  }\n}\n@media (min-width: 992px) {\n  .sticky-lg-top {\n    position: -webkit-sticky;\n    position: sticky;\n    top: 0;\n    z-index: 1020;\n  }\n  .sticky-lg-bottom {\n    position: -webkit-sticky;\n    position: sticky;\n    bottom: 0;\n    z-index: 1020;\n  }\n}\n@media (min-width: 1200px) {\n  .sticky-xl-top {\n    position: -webkit-sticky;\n    position: sticky;\n    top: 0;\n    z-index: 1020;\n  }\n  .sticky-xl-bottom {\n    position: -webkit-sticky;\n    position: sticky;\n    bottom: 0;\n    z-index: 1020;\n  }\n}\n@media (min-width: 1400px) {\n  .sticky-xxl-top {\n    position: -webkit-sticky;\n    position: sticky;\n    top: 0;\n    z-index: 1020;\n  }\n  .sticky-xxl-bottom {\n    position: -webkit-sticky;\n    position: sticky;\n    bottom: 0;\n    z-index: 1020;\n  }\n}\n.hstack {\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  align-self: stretch;\n}\n\n.vstack {\n  display: flex;\n  flex: 1 1 auto;\n  flex-direction: column;\n  align-self: stretch;\n}\n\n.visually-hidden,\n.visually-hidden-focusable:not(:focus):not(:focus-within) {\n  width: 1px !important;\n  height: 1px !important;\n  padding: 0 !important;\n  margin: -1px !important;\n  overflow: hidden !important;\n  clip: rect(0, 0, 0, 0) !important;\n  white-space: nowrap !important;\n  border: 0 !important;\n}\n.visually-hidden:not(caption),\n.visually-hidden-focusable:not(:focus):not(:focus-within):not(caption) {\n  position: absolute !important;\n}\n.visually-hidden *,\n.visually-hidden-focusable:not(:focus):not(:focus-within) * {\n  overflow: hidden !important;\n}\n\n.stretched-link::after {\n  position: absolute;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  right: 0;\n  z-index: 1;\n  content: \"\";\n}\n\n.text-truncate {\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n\n.vr {\n  display: inline-block;\n  align-self: stretch;\n  width: var(--bs-border-width);\n  min-height: 1em;\n  background-color: currentcolor;\n  opacity: 0.25;\n}\n\n.align-baseline {\n  vertical-align: baseline !important;\n}\n\n.align-top {\n  vertical-align: top !important;\n}\n\n.align-middle {\n  vertical-align: middle !important;\n}\n\n.align-bottom {\n  vertical-align: bottom !important;\n}\n\n.align-text-bottom {\n  vertical-align: text-bottom !important;\n}\n\n.align-text-top {\n  vertical-align: text-top !important;\n}\n\n.float-start {\n  float: right !important;\n}\n\n.float-end {\n  float: left !important;\n}\n\n.float-none {\n  float: none !important;\n}\n\n.object-fit-contain {\n  -o-object-fit: contain !important;\n  object-fit: contain !important;\n}\n\n.object-fit-cover {\n  -o-object-fit: cover !important;\n  object-fit: cover !important;\n}\n\n.object-fit-fill {\n  -o-object-fit: fill !important;\n  object-fit: fill !important;\n}\n\n.object-fit-scale {\n  -o-object-fit: scale-down !important;\n  object-fit: scale-down !important;\n}\n\n.object-fit-none {\n  -o-object-fit: none !important;\n  object-fit: none !important;\n}\n\n.opacity-0 {\n  opacity: 0 !important;\n}\n\n.opacity-25 {\n  opacity: 0.25 !important;\n}\n\n.opacity-50 {\n  opacity: 0.5 !important;\n}\n\n.opacity-75 {\n  opacity: 0.75 !important;\n}\n\n.opacity-100 {\n  opacity: 1 !important;\n}\n\n.overflow-auto {\n  overflow: auto !important;\n}\n\n.overflow-hidden {\n  overflow: hidden !important;\n}\n\n.overflow-visible {\n  overflow: visible !important;\n}\n\n.overflow-scroll {\n  overflow: scroll !important;\n}\n\n.overflow-x-auto {\n  overflow-x: auto !important;\n}\n\n.overflow-x-hidden {\n  overflow-x: hidden !important;\n}\n\n.overflow-x-visible {\n  overflow-x: visible !important;\n}\n\n.overflow-x-scroll {\n  overflow-x: scroll !important;\n}\n\n.overflow-y-auto {\n  overflow-y: auto !important;\n}\n\n.overflow-y-hidden {\n  overflow-y: hidden !important;\n}\n\n.overflow-y-visible {\n  overflow-y: visible !important;\n}\n\n.overflow-y-scroll {\n  overflow-y: scroll !important;\n}\n\n.d-inline {\n  display: inline !important;\n}\n\n.d-inline-block {\n  display: inline-block !important;\n}\n\n.d-block {\n  display: block !important;\n}\n\n.d-grid {\n  display: grid !important;\n}\n\n.d-inline-grid {\n  display: inline-grid !important;\n}\n\n.d-table {\n  display: table !important;\n}\n\n.d-table-row {\n  display: table-row !important;\n}\n\n.d-table-cell {\n  display: table-cell !important;\n}\n\n.d-flex {\n  display: flex !important;\n}\n\n.d-inline-flex {\n  display: inline-flex !important;\n}\n\n.d-none {\n  display: none !important;\n}\n\n.shadow {\n  box-shadow: var(--bs-box-shadow) !important;\n}\n\n.shadow-sm {\n  box-shadow: var(--bs-box-shadow-sm) !important;\n}\n\n.shadow-lg {\n  box-shadow: var(--bs-box-shadow-lg) !important;\n}\n\n.shadow-none {\n  box-shadow: none !important;\n}\n\n.focus-ring-primary {\n  --bs-focus-ring-color: rgba(var(--bs-primary-rgb), var(--bs-focus-ring-opacity));\n}\n\n.focus-ring-secondary {\n  --bs-focus-ring-color: rgba(var(--bs-secondary-rgb), var(--bs-focus-ring-opacity));\n}\n\n.focus-ring-success {\n  --bs-focus-ring-color: rgba(var(--bs-success-rgb), var(--bs-focus-ring-opacity));\n}\n\n.focus-ring-info {\n  --bs-focus-ring-color: rgba(var(--bs-info-rgb), var(--bs-focus-ring-opacity));\n}\n\n.focus-ring-warning {\n  --bs-focus-ring-color: rgba(var(--bs-warning-rgb), var(--bs-focus-ring-opacity));\n}\n\n.focus-ring-danger {\n  --bs-focus-ring-color: rgba(var(--bs-danger-rgb), var(--bs-focus-ring-opacity));\n}\n\n.focus-ring-light {\n  --bs-focus-ring-color: rgba(var(--bs-light-rgb), var(--bs-focus-ring-opacity));\n}\n\n.focus-ring-dark {\n  --bs-focus-ring-color: rgba(var(--bs-dark-rgb), var(--bs-focus-ring-opacity));\n}\n\n.position-static {\n  position: static !important;\n}\n\n.position-relative {\n  position: relative !important;\n}\n\n.position-absolute {\n  position: absolute !important;\n}\n\n.position-fixed {\n  position: fixed !important;\n}\n\n.position-sticky {\n  position: -webkit-sticky !important;\n  position: sticky !important;\n}\n\n.top-0 {\n  top: 0 !important;\n}\n\n.top-50 {\n  top: 50% !important;\n}\n\n.top-100 {\n  top: 100% !important;\n}\n\n.bottom-0 {\n  bottom: 0 !important;\n}\n\n.bottom-50 {\n  bottom: 50% !important;\n}\n\n.bottom-100 {\n  bottom: 100% !important;\n}\n\n.start-0 {\n  right: 0 !important;\n}\n\n.start-50 {\n  right: 50% !important;\n}\n\n.start-100 {\n  right: 100% !important;\n}\n\n.end-0 {\n  left: 0 !important;\n}\n\n.end-50 {\n  left: 50% !important;\n}\n\n.end-100 {\n  left: 100% !important;\n}\n\n.translate-middle {\n  transform: translate(50%, -50%) !important;\n}\n\n.translate-middle-x {\n  transform: translateX(50%) !important;\n}\n\n.translate-middle-y {\n  transform: translateY(-50%) !important;\n}\n\n.border {\n  border: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important;\n}\n\n.border-0 {\n  border: 0 !important;\n}\n\n.border-top {\n  border-top: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important;\n}\n\n.border-top-0 {\n  border-top: 0 !important;\n}\n\n.border-end {\n  border-left: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important;\n}\n\n.border-end-0 {\n  border-left: 0 !important;\n}\n\n.border-bottom {\n  border-bottom: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important;\n}\n\n.border-bottom-0 {\n  border-bottom: 0 !important;\n}\n\n.border-start {\n  border-right: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important;\n}\n\n.border-start-0 {\n  border-right: 0 !important;\n}\n\n.border-primary {\n  --bs-border-opacity: 1;\n  border-color: rgba(var(--bs-primary-rgb), var(--bs-border-opacity)) !important;\n}\n\n.border-secondary {\n  --bs-border-opacity: 1;\n  border-color: rgba(var(--bs-secondary-rgb), var(--bs-border-opacity)) !important;\n}\n\n.border-success {\n  --bs-border-opacity: 1;\n  border-color: rgba(var(--bs-success-rgb), var(--bs-border-opacity)) !important;\n}\n\n.border-info {\n  --bs-border-opacity: 1;\n  border-color: rgba(var(--bs-info-rgb), var(--bs-border-opacity)) !important;\n}\n\n.border-warning {\n  --bs-border-opacity: 1;\n  border-color: rgba(var(--bs-warning-rgb), var(--bs-border-opacity)) !important;\n}\n\n.border-danger {\n  --bs-border-opacity: 1;\n  border-color: rgba(var(--bs-danger-rgb), var(--bs-border-opacity)) !important;\n}\n\n.border-light {\n  --bs-border-opacity: 1;\n  border-color: rgba(var(--bs-light-rgb), var(--bs-border-opacity)) !important;\n}\n\n.border-dark {\n  --bs-border-opacity: 1;\n  border-color: rgba(var(--bs-dark-rgb), var(--bs-border-opacity)) !important;\n}\n\n.border-black {\n  --bs-border-opacity: 1;\n  border-color: rgba(var(--bs-black-rgb), var(--bs-border-opacity)) !important;\n}\n\n.border-white {\n  --bs-border-opacity: 1;\n  border-color: rgba(var(--bs-white-rgb), var(--bs-border-opacity)) !important;\n}\n\n.border-primary-subtle {\n  border-color: var(--bs-primary-border-subtle) !important;\n}\n\n.border-secondary-subtle {\n  border-color: var(--bs-secondary-border-subtle) !important;\n}\n\n.border-success-subtle {\n  border-color: var(--bs-success-border-subtle) !important;\n}\n\n.border-info-subtle {\n  border-color: var(--bs-info-border-subtle) !important;\n}\n\n.border-warning-subtle {\n  border-color: var(--bs-warning-border-subtle) !important;\n}\n\n.border-danger-subtle {\n  border-color: var(--bs-danger-border-subtle) !important;\n}\n\n.border-light-subtle {\n  border-color: var(--bs-light-border-subtle) !important;\n}\n\n.border-dark-subtle {\n  border-color: var(--bs-dark-border-subtle) !important;\n}\n\n.border-1 {\n  border-width: 1px !important;\n}\n\n.border-2 {\n  border-width: 2px !important;\n}\n\n.border-3 {\n  border-width: 3px !important;\n}\n\n.border-4 {\n  border-width: 4px !important;\n}\n\n.border-5 {\n  border-width: 5px !important;\n}\n\n.border-opacity-10 {\n  --bs-border-opacity: 0.1;\n}\n\n.border-opacity-25 {\n  --bs-border-opacity: 0.25;\n}\n\n.border-opacity-50 {\n  --bs-border-opacity: 0.5;\n}\n\n.border-opacity-75 {\n  --bs-border-opacity: 0.75;\n}\n\n.border-opacity-100 {\n  --bs-border-opacity: 1;\n}\n\n.w-25 {\n  width: 25% !important;\n}\n\n.w-50 {\n  width: 50% !important;\n}\n\n.w-75 {\n  width: 75% !important;\n}\n\n.w-100 {\n  width: 100% !important;\n}\n\n.w-auto {\n  width: auto !important;\n}\n\n.mw-100 {\n  max-width: 100% !important;\n}\n\n.vw-100 {\n  width: 100vw !important;\n}\n\n.min-vw-100 {\n  min-width: 100vw !important;\n}\n\n.h-25 {\n  height: 25% !important;\n}\n\n.h-50 {\n  height: 50% !important;\n}\n\n.h-75 {\n  height: 75% !important;\n}\n\n.h-100 {\n  height: 100% !important;\n}\n\n.h-auto {\n  height: auto !important;\n}\n\n.mh-100 {\n  max-height: 100% !important;\n}\n\n.vh-100 {\n  height: 100vh !important;\n}\n\n.min-vh-100 {\n  min-height: 100vh !important;\n}\n\n.flex-fill {\n  flex: 1 1 auto !important;\n}\n\n.flex-row {\n  flex-direction: row !important;\n}\n\n.flex-column {\n  flex-direction: column !important;\n}\n\n.flex-row-reverse {\n  flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n  flex-direction: column-reverse !important;\n}\n\n.flex-grow-0 {\n  flex-grow: 0 !important;\n}\n\n.flex-grow-1 {\n  flex-grow: 1 !important;\n}\n\n.flex-shrink-0 {\n  flex-shrink: 0 !important;\n}\n\n.flex-shrink-1 {\n  flex-shrink: 1 !important;\n}\n\n.flex-wrap {\n  flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n  flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n  flex-wrap: wrap-reverse !important;\n}\n\n.justify-content-start {\n  justify-content: flex-start !important;\n}\n\n.justify-content-end {\n  justify-content: flex-end !important;\n}\n\n.justify-content-center {\n  justify-content: center !important;\n}\n\n.justify-content-between {\n  justify-content: space-between !important;\n}\n\n.justify-content-around {\n  justify-content: space-around !important;\n}\n\n.justify-content-evenly {\n  justify-content: space-evenly !important;\n}\n\n.align-items-start {\n  align-items: flex-start !important;\n}\n\n.align-items-end {\n  align-items: flex-end !important;\n}\n\n.align-items-center {\n  align-items: center !important;\n}\n\n.align-items-baseline {\n  align-items: baseline !important;\n}\n\n.align-items-stretch {\n  align-items: stretch !important;\n}\n\n.align-content-start {\n  align-content: flex-start !important;\n}\n\n.align-content-end {\n  align-content: flex-end !important;\n}\n\n.align-content-center {\n  align-content: center !important;\n}\n\n.align-content-between {\n  align-content: space-between !important;\n}\n\n.align-content-around {\n  align-content: space-around !important;\n}\n\n.align-content-stretch {\n  align-content: stretch !important;\n}\n\n.align-self-auto {\n  align-self: auto !important;\n}\n\n.align-self-start {\n  align-self: flex-start !important;\n}\n\n.align-self-end {\n  align-self: flex-end !important;\n}\n\n.align-self-center {\n  align-self: center !important;\n}\n\n.align-self-baseline {\n  align-self: baseline !important;\n}\n\n.align-self-stretch {\n  align-self: stretch !important;\n}\n\n.order-first {\n  order: -1 !important;\n}\n\n.order-0 {\n  order: 0 !important;\n}\n\n.order-1 {\n  order: 1 !important;\n}\n\n.order-2 {\n  order: 2 !important;\n}\n\n.order-3 {\n  order: 3 !important;\n}\n\n.order-4 {\n  order: 4 !important;\n}\n\n.order-5 {\n  order: 5 !important;\n}\n\n.order-last {\n  order: 6 !important;\n}\n\n.m-0 {\n  margin: 0 !important;\n}\n\n.m-1 {\n  margin: 0.25rem !important;\n}\n\n.m-2 {\n  margin: 0.5rem !important;\n}\n\n.m-3 {\n  margin: 1rem !important;\n}\n\n.m-4 {\n  margin: 1.5rem !important;\n}\n\n.m-5 {\n  margin: 3rem !important;\n}\n\n.m-auto {\n  margin: auto !important;\n}\n\n.mx-0 {\n  margin-left: 0 !important;\n  margin-right: 0 !important;\n}\n\n.mx-1 {\n  margin-left: 0.25rem !important;\n  margin-right: 0.25rem !important;\n}\n\n.mx-2 {\n  margin-left: 0.5rem !important;\n  margin-right: 0.5rem !important;\n}\n\n.mx-3 {\n  margin-left: 1rem !important;\n  margin-right: 1rem !important;\n}\n\n.mx-4 {\n  margin-left: 1.5rem !important;\n  margin-right: 1.5rem !important;\n}\n\n.mx-5 {\n  margin-left: 3rem !important;\n  margin-right: 3rem !important;\n}\n\n.mx-auto {\n  margin-left: auto !important;\n  margin-right: auto !important;\n}\n\n.my-0 {\n  margin-top: 0 !important;\n  margin-bottom: 0 !important;\n}\n\n.my-1 {\n  margin-top: 0.25rem !important;\n  margin-bottom: 0.25rem !important;\n}\n\n.my-2 {\n  margin-top: 0.5rem !important;\n  margin-bottom: 0.5rem !important;\n}\n\n.my-3 {\n  margin-top: 1rem !important;\n  margin-bottom: 1rem !important;\n}\n\n.my-4 {\n  margin-top: 1.5rem !important;\n  margin-bottom: 1.5rem !important;\n}\n\n.my-5 {\n  margin-top: 3rem !important;\n  margin-bottom: 3rem !important;\n}\n\n.my-auto {\n  margin-top: auto !important;\n  margin-bottom: auto !important;\n}\n\n.mt-0 {\n  margin-top: 0 !important;\n}\n\n.mt-1 {\n  margin-top: 0.25rem !important;\n}\n\n.mt-2 {\n  margin-top: 0.5rem !important;\n}\n\n.mt-3 {\n  margin-top: 1rem !important;\n}\n\n.mt-4 {\n  margin-top: 1.5rem !important;\n}\n\n.mt-5 {\n  margin-top: 3rem !important;\n}\n\n.mt-auto {\n  margin-top: auto !important;\n}\n\n.me-0 {\n  margin-left: 0 !important;\n}\n\n.me-1 {\n  margin-left: 0.25rem !important;\n}\n\n.me-2 {\n  margin-left: 0.5rem !important;\n}\n\n.me-3 {\n  margin-left: 1rem !important;\n}\n\n.me-4 {\n  margin-left: 1.5rem !important;\n}\n\n.me-5 {\n  margin-left: 3rem !important;\n}\n\n.me-auto {\n  margin-left: auto !important;\n}\n\n.mb-0 {\n  margin-bottom: 0 !important;\n}\n\n.mb-1 {\n  margin-bottom: 0.25rem !important;\n}\n\n.mb-2 {\n  margin-bottom: 0.5rem !important;\n}\n\n.mb-3 {\n  margin-bottom: 1rem !important;\n}\n\n.mb-4 {\n  margin-bottom: 1.5rem !important;\n}\n\n.mb-5 {\n  margin-bottom: 3rem !important;\n}\n\n.mb-auto {\n  margin-bottom: auto !important;\n}\n\n.ms-0 {\n  margin-right: 0 !important;\n}\n\n.ms-1 {\n  margin-right: 0.25rem !important;\n}\n\n.ms-2 {\n  margin-right: 0.5rem !important;\n}\n\n.ms-3 {\n  margin-right: 1rem !important;\n}\n\n.ms-4 {\n  margin-right: 1.5rem !important;\n}\n\n.ms-5 {\n  margin-right: 3rem !important;\n}\n\n.ms-auto {\n  margin-right: auto !important;\n}\n\n.p-0 {\n  padding: 0 !important;\n}\n\n.p-1 {\n  padding: 0.25rem !important;\n}\n\n.p-2 {\n  padding: 0.5rem !important;\n}\n\n.p-3 {\n  padding: 1rem !important;\n}\n\n.p-4 {\n  padding: 1.5rem !important;\n}\n\n.p-5 {\n  padding: 3rem !important;\n}\n\n.px-0 {\n  padding-left: 0 !important;\n  padding-right: 0 !important;\n}\n\n.px-1 {\n  padding-left: 0.25rem !important;\n  padding-right: 0.25rem !important;\n}\n\n.px-2 {\n  padding-left: 0.5rem !important;\n  padding-right: 0.5rem !important;\n}\n\n.px-3 {\n  padding-left: 1rem !important;\n  padding-right: 1rem !important;\n}\n\n.px-4 {\n  padding-left: 1.5rem !important;\n  padding-right: 1.5rem !important;\n}\n\n.px-5 {\n  padding-left: 3rem !important;\n  padding-right: 3rem !important;\n}\n\n.py-0 {\n  padding-top: 0 !important;\n  padding-bottom: 0 !important;\n}\n\n.py-1 {\n  padding-top: 0.25rem !important;\n  padding-bottom: 0.25rem !important;\n}\n\n.py-2 {\n  padding-top: 0.5rem !important;\n  padding-bottom: 0.5rem !important;\n}\n\n.py-3 {\n  padding-top: 1rem !important;\n  padding-bottom: 1rem !important;\n}\n\n.py-4 {\n  padding-top: 1.5rem !important;\n  padding-bottom: 1.5rem !important;\n}\n\n.py-5 {\n  padding-top: 3rem !important;\n  padding-bottom: 3rem !important;\n}\n\n.pt-0 {\n  padding-top: 0 !important;\n}\n\n.pt-1 {\n  padding-top: 0.25rem !important;\n}\n\n.pt-2 {\n  padding-top: 0.5rem !important;\n}\n\n.pt-3 {\n  padding-top: 1rem !important;\n}\n\n.pt-4 {\n  padding-top: 1.5rem !important;\n}\n\n.pt-5 {\n  padding-top: 3rem !important;\n}\n\n.pe-0 {\n  padding-left: 0 !important;\n}\n\n.pe-1 {\n  padding-left: 0.25rem !important;\n}\n\n.pe-2 {\n  padding-left: 0.5rem !important;\n}\n\n.pe-3 {\n  padding-left: 1rem !important;\n}\n\n.pe-4 {\n  padding-left: 1.5rem !important;\n}\n\n.pe-5 {\n  padding-left: 3rem !important;\n}\n\n.pb-0 {\n  padding-bottom: 0 !important;\n}\n\n.pb-1 {\n  padding-bottom: 0.25rem !important;\n}\n\n.pb-2 {\n  padding-bottom: 0.5rem !important;\n}\n\n.pb-3 {\n  padding-bottom: 1rem !important;\n}\n\n.pb-4 {\n  padding-bottom: 1.5rem !important;\n}\n\n.pb-5 {\n  padding-bottom: 3rem !important;\n}\n\n.ps-0 {\n  padding-right: 0 !important;\n}\n\n.ps-1 {\n  padding-right: 0.25rem !important;\n}\n\n.ps-2 {\n  padding-right: 0.5rem !important;\n}\n\n.ps-3 {\n  padding-right: 1rem !important;\n}\n\n.ps-4 {\n  padding-right: 1.5rem !important;\n}\n\n.ps-5 {\n  padding-right: 3rem !important;\n}\n\n.gap-0 {\n  gap: 0 !important;\n}\n\n.gap-1 {\n  gap: 0.25rem !important;\n}\n\n.gap-2 {\n  gap: 0.5rem !important;\n}\n\n.gap-3 {\n  gap: 1rem !important;\n}\n\n.gap-4 {\n  gap: 1.5rem !important;\n}\n\n.gap-5 {\n  gap: 3rem !important;\n}\n\n.row-gap-0 {\n  row-gap: 0 !important;\n}\n\n.row-gap-1 {\n  row-gap: 0.25rem !important;\n}\n\n.row-gap-2 {\n  row-gap: 0.5rem !important;\n}\n\n.row-gap-3 {\n  row-gap: 1rem !important;\n}\n\n.row-gap-4 {\n  row-gap: 1.5rem !important;\n}\n\n.row-gap-5 {\n  row-gap: 3rem !important;\n}\n\n.column-gap-0 {\n  -moz-column-gap: 0 !important;\n  column-gap: 0 !important;\n}\n\n.column-gap-1 {\n  -moz-column-gap: 0.25rem !important;\n  column-gap: 0.25rem !important;\n}\n\n.column-gap-2 {\n  -moz-column-gap: 0.5rem !important;\n  column-gap: 0.5rem !important;\n}\n\n.column-gap-3 {\n  -moz-column-gap: 1rem !important;\n  column-gap: 1rem !important;\n}\n\n.column-gap-4 {\n  -moz-column-gap: 1.5rem !important;\n  column-gap: 1.5rem !important;\n}\n\n.column-gap-5 {\n  -moz-column-gap: 3rem !important;\n  column-gap: 3rem !important;\n}\n\n.font-monospace {\n  font-family: var(--bs-font-monospace) !important;\n}\n\n.fs-1 {\n  font-size: calc(1.375rem + 1.5vw) !important;\n}\n\n.fs-2 {\n  font-size: calc(1.325rem + 0.9vw) !important;\n}\n\n.fs-3 {\n  font-size: calc(1.3rem + 0.6vw) !important;\n}\n\n.fs-4 {\n  font-size: calc(1.275rem + 0.3vw) !important;\n}\n\n.fs-5 {\n  font-size: 1.25rem !important;\n}\n\n.fs-6 {\n  font-size: 1rem !important;\n}\n\n.fst-italic {\n  font-style: italic !important;\n}\n\n.fst-normal {\n  font-style: normal !important;\n}\n\n.fw-lighter {\n  font-weight: lighter !important;\n}\n\n.fw-light {\n  font-weight: 300 !important;\n}\n\n.fw-normal {\n  font-weight: 400 !important;\n}\n\n.fw-medium {\n  font-weight: 500 !important;\n}\n\n.fw-semibold {\n  font-weight: 600 !important;\n}\n\n.fw-bold {\n  font-weight: 700 !important;\n}\n\n.fw-bolder {\n  font-weight: bolder !important;\n}\n\n.lh-1 {\n  line-height: 1 !important;\n}\n\n.lh-sm {\n  line-height: 1.25 !important;\n}\n\n.lh-base {\n  line-height: 1.5 !important;\n}\n\n.lh-lg {\n  line-height: 2 !important;\n}\n\n.text-start {\n  text-align: right !important;\n}\n\n.text-end {\n  text-align: left !important;\n}\n\n.text-center {\n  text-align: center !important;\n}\n\n.text-decoration-none {\n  text-decoration: none !important;\n}\n\n.text-decoration-underline {\n  text-decoration: underline !important;\n}\n\n.text-decoration-line-through {\n  text-decoration: line-through !important;\n}\n\n.text-lowercase {\n  text-transform: lowercase !important;\n}\n\n.text-uppercase {\n  text-transform: uppercase !important;\n}\n\n.text-capitalize {\n  text-transform: capitalize !important;\n}\n\n.text-wrap {\n  white-space: normal !important;\n}\n\n.text-nowrap {\n  white-space: nowrap !important;\n}\n.text-primary {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-primary-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-secondary {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-secondary-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-success {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-success-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-info {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-info-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-warning {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-warning-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-danger {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-danger-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-light {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-light-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-dark {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-dark-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-black {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-black-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-white {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-white-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-body {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-body-color-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-muted {\n  --bs-text-opacity: 1;\n  color: var(--bs-secondary-color) !important;\n}\n\n.text-black-50 {\n  --bs-text-opacity: 1;\n  color: rgba(0, 0, 0, 0.5) !important;\n}\n\n.text-white-50 {\n  --bs-text-opacity: 1;\n  color: rgba(255, 255, 255, 0.5) !important;\n}\n\n.text-body-secondary {\n  --bs-text-opacity: 1;\n  color: var(--bs-secondary-color) !important;\n}\n\n.text-body-tertiary {\n  --bs-text-opacity: 1;\n  color: var(--bs-tertiary-color) !important;\n}\n\n.text-body-emphasis {\n  --bs-text-opacity: 1;\n  color: var(--bs-emphasis-color) !important;\n}\n\n.text-reset {\n  --bs-text-opacity: 1;\n  color: inherit !important;\n}\n\n.text-opacity-25 {\n  --bs-text-opacity: 0.25;\n}\n\n.text-opacity-50 {\n  --bs-text-opacity: 0.5;\n}\n\n.text-opacity-75 {\n  --bs-text-opacity: 0.75;\n}\n\n.text-opacity-100 {\n  --bs-text-opacity: 1;\n}\n\n.text-primary-emphasis {\n  color: var(--bs-primary-text-emphasis) !important;\n}\n\n.text-secondary-emphasis {\n  color: var(--bs-secondary-text-emphasis) !important;\n}\n\n.text-success-emphasis {\n  color: var(--bs-success-text-emphasis) !important;\n}\n\n.text-info-emphasis {\n  color: var(--bs-info-text-emphasis) !important;\n}\n\n.text-warning-emphasis {\n  color: var(--bs-warning-text-emphasis) !important;\n}\n\n.text-danger-emphasis {\n  color: var(--bs-danger-text-emphasis) !important;\n}\n\n.text-light-emphasis {\n  color: var(--bs-light-text-emphasis) !important;\n}\n\n.text-dark-emphasis {\n  color: var(--bs-dark-text-emphasis) !important;\n}\n\n.link-opacity-10 {\n  --bs-link-opacity: 0.1;\n}\n\n.link-opacity-10-hover:hover {\n  --bs-link-opacity: 0.1;\n}\n\n.link-opacity-25 {\n  --bs-link-opacity: 0.25;\n}\n\n.link-opacity-25-hover:hover {\n  --bs-link-opacity: 0.25;\n}\n\n.link-opacity-50 {\n  --bs-link-opacity: 0.5;\n}\n\n.link-opacity-50-hover:hover {\n  --bs-link-opacity: 0.5;\n}\n\n.link-opacity-75 {\n  --bs-link-opacity: 0.75;\n}\n\n.link-opacity-75-hover:hover {\n  --bs-link-opacity: 0.75;\n}\n\n.link-opacity-100 {\n  --bs-link-opacity: 1;\n}\n\n.link-opacity-100-hover:hover {\n  --bs-link-opacity: 1;\n}\n\n.link-offset-1 {\n  text-underline-offset: 0.125em !important;\n}\n\n.link-offset-1-hover:hover {\n  text-underline-offset: 0.125em !important;\n}\n\n.link-offset-2 {\n  text-underline-offset: 0.25em !important;\n}\n\n.link-offset-2-hover:hover {\n  text-underline-offset: 0.25em !important;\n}\n\n.link-offset-3 {\n  text-underline-offset: 0.375em !important;\n}\n\n.link-offset-3-hover:hover {\n  text-underline-offset: 0.375em !important;\n}\n\n.link-underline-primary {\n  --bs-link-underline-opacity: 1;\n  -webkit-text-decoration-color: rgba(var(--bs-primary-rgb), var(--bs-link-underline-opacity)) !important;\n  text-decoration-color: rgba(var(--bs-primary-rgb), var(--bs-link-underline-opacity)) !important;\n}\n\n.link-underline-secondary {\n  --bs-link-underline-opacity: 1;\n  -webkit-text-decoration-color: rgba(var(--bs-secondary-rgb), var(--bs-link-underline-opacity)) !important;\n  text-decoration-color: rgba(var(--bs-secondary-rgb), var(--bs-link-underline-opacity)) !important;\n}\n\n.link-underline-success {\n  --bs-link-underline-opacity: 1;\n  -webkit-text-decoration-color: rgba(var(--bs-success-rgb), var(--bs-link-underline-opacity)) !important;\n  text-decoration-color: rgba(var(--bs-success-rgb), var(--bs-link-underline-opacity)) !important;\n}\n\n.link-underline-info {\n  --bs-link-underline-opacity: 1;\n  -webkit-text-decoration-color: rgba(var(--bs-info-rgb), var(--bs-link-underline-opacity)) !important;\n  text-decoration-color: rgba(var(--bs-info-rgb), var(--bs-link-underline-opacity)) !important;\n}\n\n.link-underline-warning {\n  --bs-link-underline-opacity: 1;\n  -webkit-text-decoration-color: rgba(var(--bs-warning-rgb), var(--bs-link-underline-opacity)) !important;\n  text-decoration-color: rgba(var(--bs-warning-rgb), var(--bs-link-underline-opacity)) !important;\n}\n\n.link-underline-danger {\n  --bs-link-underline-opacity: 1;\n  -webkit-text-decoration-color: rgba(var(--bs-danger-rgb), var(--bs-link-underline-opacity)) !important;\n  text-decoration-color: rgba(var(--bs-danger-rgb), var(--bs-link-underline-opacity)) !important;\n}\n\n.link-underline-light {\n  --bs-link-underline-opacity: 1;\n  -webkit-text-decoration-color: rgba(var(--bs-light-rgb), var(--bs-link-underline-opacity)) !important;\n  text-decoration-color: rgba(var(--bs-light-rgb), var(--bs-link-underline-opacity)) !important;\n}\n\n.link-underline-dark {\n  --bs-link-underline-opacity: 1;\n  -webkit-text-decoration-color: rgba(var(--bs-dark-rgb), var(--bs-link-underline-opacity)) !important;\n  text-decoration-color: rgba(var(--bs-dark-rgb), var(--bs-link-underline-opacity)) !important;\n}\n\n.link-underline {\n  --bs-link-underline-opacity: 1;\n  -webkit-text-decoration-color: rgba(var(--bs-link-color-rgb), var(--bs-link-underline-opacity, 1)) !important;\n  text-decoration-color: rgba(var(--bs-link-color-rgb), var(--bs-link-underline-opacity, 1)) !important;\n}\n\n.link-underline-opacity-0 {\n  --bs-link-underline-opacity: 0;\n}\n\n.link-underline-opacity-0-hover:hover {\n  --bs-link-underline-opacity: 0;\n}\n\n.link-underline-opacity-10 {\n  --bs-link-underline-opacity: 0.1;\n}\n\n.link-underline-opacity-10-hover:hover {\n  --bs-link-underline-opacity: 0.1;\n}\n\n.link-underline-opacity-25 {\n  --bs-link-underline-opacity: 0.25;\n}\n\n.link-underline-opacity-25-hover:hover {\n  --bs-link-underline-opacity: 0.25;\n}\n\n.link-underline-opacity-50 {\n  --bs-link-underline-opacity: 0.5;\n}\n\n.link-underline-opacity-50-hover:hover {\n  --bs-link-underline-opacity: 0.5;\n}\n\n.link-underline-opacity-75 {\n  --bs-link-underline-opacity: 0.75;\n}\n\n.link-underline-opacity-75-hover:hover {\n  --bs-link-underline-opacity: 0.75;\n}\n\n.link-underline-opacity-100 {\n  --bs-link-underline-opacity: 1;\n}\n\n.link-underline-opacity-100-hover:hover {\n  --bs-link-underline-opacity: 1;\n}\n\n.bg-primary {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-primary-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-secondary {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-secondary-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-success {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-success-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-info {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-info-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-warning {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-warning-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-danger {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-danger-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-light {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-light-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-dark {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-dark-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-black {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-black-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-white {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-white-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-body {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-body-bg-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-transparent {\n  --bs-bg-opacity: 1;\n  background-color: transparent !important;\n}\n\n.bg-body-secondary {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-secondary-bg-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-body-tertiary {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-tertiary-bg-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-opacity-10 {\n  --bs-bg-opacity: 0.1;\n}\n\n.bg-opacity-25 {\n  --bs-bg-opacity: 0.25;\n}\n\n.bg-opacity-50 {\n  --bs-bg-opacity: 0.5;\n}\n\n.bg-opacity-75 {\n  --bs-bg-opacity: 0.75;\n}\n\n.bg-opacity-100 {\n  --bs-bg-opacity: 1;\n}\n\n.bg-primary-subtle {\n  background-color: var(--bs-primary-bg-subtle) !important;\n}\n\n.bg-secondary-subtle {\n  background-color: var(--bs-secondary-bg-subtle) !important;\n}\n\n.bg-success-subtle {\n  background-color: var(--bs-success-bg-subtle) !important;\n}\n\n.bg-info-subtle {\n  background-color: var(--bs-info-bg-subtle) !important;\n}\n\n.bg-warning-subtle {\n  background-color: var(--bs-warning-bg-subtle) !important;\n}\n\n.bg-danger-subtle {\n  background-color: var(--bs-danger-bg-subtle) !important;\n}\n\n.bg-light-subtle {\n  background-color: var(--bs-light-bg-subtle) !important;\n}\n\n.bg-dark-subtle {\n  background-color: var(--bs-dark-bg-subtle) !important;\n}\n\n.bg-gradient {\n  background-image: var(--bs-gradient) !important;\n}\n\n.user-select-all {\n  -webkit-user-select: all !important;\n  -moz-user-select: all !important;\n  user-select: all !important;\n}\n\n.user-select-auto {\n  -webkit-user-select: auto !important;\n  -moz-user-select: auto !important;\n  user-select: auto !important;\n}\n\n.user-select-none {\n  -webkit-user-select: none !important;\n  -moz-user-select: none !important;\n  user-select: none !important;\n}\n\n.pe-none {\n  pointer-events: none !important;\n}\n\n.pe-auto {\n  pointer-events: auto !important;\n}\n\n.rounded {\n  border-radius: var(--bs-border-radius) !important;\n}\n\n.rounded-0 {\n  border-radius: 0 !important;\n}\n\n.rounded-1 {\n  border-radius: var(--bs-border-radius-sm) !important;\n}\n\n.rounded-2 {\n  border-radius: var(--bs-border-radius) !important;\n}\n\n.rounded-3 {\n  border-radius: var(--bs-border-radius-lg) !important;\n}\n\n.rounded-4 {\n  border-radius: var(--bs-border-radius-xl) !important;\n}\n\n.rounded-5 {\n  border-radius: var(--bs-border-radius-xxl) !important;\n}\n\n.rounded-circle {\n  border-radius: 50% !important;\n}\n\n.rounded-pill {\n  border-radius: var(--bs-border-radius-pill) !important;\n}\n\n.rounded-top {\n  border-top-right-radius: var(--bs-border-radius) !important;\n  border-top-left-radius: var(--bs-border-radius) !important;\n}\n\n.rounded-top-0 {\n  border-top-right-radius: 0 !important;\n  border-top-left-radius: 0 !important;\n}\n\n.rounded-top-1 {\n  border-top-right-radius: var(--bs-border-radius-sm) !important;\n  border-top-left-radius: var(--bs-border-radius-sm) !important;\n}\n\n.rounded-top-2 {\n  border-top-right-radius: var(--bs-border-radius) !important;\n  border-top-left-radius: var(--bs-border-radius) !important;\n}\n\n.rounded-top-3 {\n  border-top-right-radius: var(--bs-border-radius-lg) !important;\n  border-top-left-radius: var(--bs-border-radius-lg) !important;\n}\n\n.rounded-top-4 {\n  border-top-right-radius: var(--bs-border-radius-xl) !important;\n  border-top-left-radius: var(--bs-border-radius-xl) !important;\n}\n\n.rounded-top-5 {\n  border-top-right-radius: var(--bs-border-radius-xxl) !important;\n  border-top-left-radius: var(--bs-border-radius-xxl) !important;\n}\n\n.rounded-top-circle {\n  border-top-right-radius: 50% !important;\n  border-top-left-radius: 50% !important;\n}\n\n.rounded-top-pill {\n  border-top-right-radius: var(--bs-border-radius-pill) !important;\n  border-top-left-radius: var(--bs-border-radius-pill) !important;\n}\n\n.rounded-end {\n  border-top-left-radius: var(--bs-border-radius) !important;\n  border-bottom-left-radius: var(--bs-border-radius) !important;\n}\n\n.rounded-end-0 {\n  border-top-left-radius: 0 !important;\n  border-bottom-left-radius: 0 !important;\n}\n\n.rounded-end-1 {\n  border-top-left-radius: var(--bs-border-radius-sm) !important;\n  border-bottom-left-radius: var(--bs-border-radius-sm) !important;\n}\n\n.rounded-end-2 {\n  border-top-left-radius: var(--bs-border-radius) !important;\n  border-bottom-left-radius: var(--bs-border-radius) !important;\n}\n\n.rounded-end-3 {\n  border-top-left-radius: var(--bs-border-radius-lg) !important;\n  border-bottom-left-radius: var(--bs-border-radius-lg) !important;\n}\n\n.rounded-end-4 {\n  border-top-left-radius: var(--bs-border-radius-xl) !important;\n  border-bottom-left-radius: var(--bs-border-radius-xl) !important;\n}\n\n.rounded-end-5 {\n  border-top-left-radius: var(--bs-border-radius-xxl) !important;\n  border-bottom-left-radius: var(--bs-border-radius-xxl) !important;\n}\n\n.rounded-end-circle {\n  border-top-left-radius: 50% !important;\n  border-bottom-left-radius: 50% !important;\n}\n\n.rounded-end-pill {\n  border-top-left-radius: var(--bs-border-radius-pill) !important;\n  border-bottom-left-radius: var(--bs-border-radius-pill) !important;\n}\n\n.rounded-bottom {\n  border-bottom-left-radius: var(--bs-border-radius) !important;\n  border-bottom-right-radius: var(--bs-border-radius) !important;\n}\n\n.rounded-bottom-0 {\n  border-bottom-left-radius: 0 !important;\n  border-bottom-right-radius: 0 !important;\n}\n\n.rounded-bottom-1 {\n  border-bottom-left-radius: var(--bs-border-radius-sm) !important;\n  border-bottom-right-radius: var(--bs-border-radius-sm) !important;\n}\n\n.rounded-bottom-2 {\n  border-bottom-left-radius: var(--bs-border-radius) !important;\n  border-bottom-right-radius: var(--bs-border-radius) !important;\n}\n\n.rounded-bottom-3 {\n  border-bottom-left-radius: var(--bs-border-radius-lg) !important;\n  border-bottom-right-radius: var(--bs-border-radius-lg) !important;\n}\n\n.rounded-bottom-4 {\n  border-bottom-left-radius: var(--bs-border-radius-xl) !important;\n  border-bottom-right-radius: var(--bs-border-radius-xl) !important;\n}\n\n.rounded-bottom-5 {\n  border-bottom-left-radius: var(--bs-border-radius-xxl) !important;\n  border-bottom-right-radius: var(--bs-border-radius-xxl) !important;\n}\n\n.rounded-bottom-circle {\n  border-bottom-left-radius: 50% !important;\n  border-bottom-right-radius: 50% !important;\n}\n\n.rounded-bottom-pill {\n  border-bottom-left-radius: var(--bs-border-radius-pill) !important;\n  border-bottom-right-radius: var(--bs-border-radius-pill) !important;\n}\n\n.rounded-start {\n  border-bottom-right-radius: var(--bs-border-radius) !important;\n  border-top-right-radius: var(--bs-border-radius) !important;\n}\n\n.rounded-start-0 {\n  border-bottom-right-radius: 0 !important;\n  border-top-right-radius: 0 !important;\n}\n\n.rounded-start-1 {\n  border-bottom-right-radius: var(--bs-border-radius-sm) !important;\n  border-top-right-radius: var(--bs-border-radius-sm) !important;\n}\n\n.rounded-start-2 {\n  border-bottom-right-radius: var(--bs-border-radius) !important;\n  border-top-right-radius: var(--bs-border-radius) !important;\n}\n\n.rounded-start-3 {\n  border-bottom-right-radius: var(--bs-border-radius-lg) !important;\n  border-top-right-radius: var(--bs-border-radius-lg) !important;\n}\n\n.rounded-start-4 {\n  border-bottom-right-radius: var(--bs-border-radius-xl) !important;\n  border-top-right-radius: var(--bs-border-radius-xl) !important;\n}\n\n.rounded-start-5 {\n  border-bottom-right-radius: var(--bs-border-radius-xxl) !important;\n  border-top-right-radius: var(--bs-border-radius-xxl) !important;\n}\n\n.rounded-start-circle {\n  border-bottom-right-radius: 50% !important;\n  border-top-right-radius: 50% !important;\n}\n\n.rounded-start-pill {\n  border-bottom-right-radius: var(--bs-border-radius-pill) !important;\n  border-top-right-radius: var(--bs-border-radius-pill) !important;\n}\n\n.visible {\n  visibility: visible !important;\n}\n\n.invisible {\n  visibility: hidden !important;\n}\n\n.z-n1 {\n  z-index: -1 !important;\n}\n\n.z-0 {\n  z-index: 0 !important;\n}\n\n.z-1 {\n  z-index: 1 !important;\n}\n\n.z-2 {\n  z-index: 2 !important;\n}\n\n.z-3 {\n  z-index: 3 !important;\n}\n\n@media (min-width: 576px) {\n  .float-sm-start {\n    float: right !important;\n  }\n  .float-sm-end {\n    float: left !important;\n  }\n  .float-sm-none {\n    float: none !important;\n  }\n  .object-fit-sm-contain {\n    -o-object-fit: contain !important;\n    object-fit: contain !important;\n  }\n  .object-fit-sm-cover {\n    -o-object-fit: cover !important;\n    object-fit: cover !important;\n  }\n  .object-fit-sm-fill {\n    -o-object-fit: fill !important;\n    object-fit: fill !important;\n  }\n  .object-fit-sm-scale {\n    -o-object-fit: scale-down !important;\n    object-fit: scale-down !important;\n  }\n  .object-fit-sm-none {\n    -o-object-fit: none !important;\n    object-fit: none !important;\n  }\n  .d-sm-inline {\n    display: inline !important;\n  }\n  .d-sm-inline-block {\n    display: inline-block !important;\n  }\n  .d-sm-block {\n    display: block !important;\n  }\n  .d-sm-grid {\n    display: grid !important;\n  }\n  .d-sm-inline-grid {\n    display: inline-grid !important;\n  }\n  .d-sm-table {\n    display: table !important;\n  }\n  .d-sm-table-row {\n    display: table-row !important;\n  }\n  .d-sm-table-cell {\n    display: table-cell !important;\n  }\n  .d-sm-flex {\n    display: flex !important;\n  }\n  .d-sm-inline-flex {\n    display: inline-flex !important;\n  }\n  .d-sm-none {\n    display: none !important;\n  }\n  .flex-sm-fill {\n    flex: 1 1 auto !important;\n  }\n  .flex-sm-row {\n    flex-direction: row !important;\n  }\n  .flex-sm-column {\n    flex-direction: column !important;\n  }\n  .flex-sm-row-reverse {\n    flex-direction: row-reverse !important;\n  }\n  .flex-sm-column-reverse {\n    flex-direction: column-reverse !important;\n  }\n  .flex-sm-grow-0 {\n    flex-grow: 0 !important;\n  }\n  .flex-sm-grow-1 {\n    flex-grow: 1 !important;\n  }\n  .flex-sm-shrink-0 {\n    flex-shrink: 0 !important;\n  }\n  .flex-sm-shrink-1 {\n    flex-shrink: 1 !important;\n  }\n  .flex-sm-wrap {\n    flex-wrap: wrap !important;\n  }\n  .flex-sm-nowrap {\n    flex-wrap: nowrap !important;\n  }\n  .flex-sm-wrap-reverse {\n    flex-wrap: wrap-reverse !important;\n  }\n  .justify-content-sm-start {\n    justify-content: flex-start !important;\n  }\n  .justify-content-sm-end {\n    justify-content: flex-end !important;\n  }\n  .justify-content-sm-center {\n    justify-content: center !important;\n  }\n  .justify-content-sm-between {\n    justify-content: space-between !important;\n  }\n  .justify-content-sm-around {\n    justify-content: space-around !important;\n  }\n  .justify-content-sm-evenly {\n    justify-content: space-evenly !important;\n  }\n  .align-items-sm-start {\n    align-items: flex-start !important;\n  }\n  .align-items-sm-end {\n    align-items: flex-end !important;\n  }\n  .align-items-sm-center {\n    align-items: center !important;\n  }\n  .align-items-sm-baseline {\n    align-items: baseline !important;\n  }\n  .align-items-sm-stretch {\n    align-items: stretch !important;\n  }\n  .align-content-sm-start {\n    align-content: flex-start !important;\n  }\n  .align-content-sm-end {\n    align-content: flex-end !important;\n  }\n  .align-content-sm-center {\n    align-content: center !important;\n  }\n  .align-content-sm-between {\n    align-content: space-between !important;\n  }\n  .align-content-sm-around {\n    align-content: space-around !important;\n  }\n  .align-content-sm-stretch {\n    align-content: stretch !important;\n  }\n  .align-self-sm-auto {\n    align-self: auto !important;\n  }\n  .align-self-sm-start {\n    align-self: flex-start !important;\n  }\n  .align-self-sm-end {\n    align-self: flex-end !important;\n  }\n  .align-self-sm-center {\n    align-self: center !important;\n  }\n  .align-self-sm-baseline {\n    align-self: baseline !important;\n  }\n  .align-self-sm-stretch {\n    align-self: stretch !important;\n  }\n  .order-sm-first {\n    order: -1 !important;\n  }\n  .order-sm-0 {\n    order: 0 !important;\n  }\n  .order-sm-1 {\n    order: 1 !important;\n  }\n  .order-sm-2 {\n    order: 2 !important;\n  }\n  .order-sm-3 {\n    order: 3 !important;\n  }\n  .order-sm-4 {\n    order: 4 !important;\n  }\n  .order-sm-5 {\n    order: 5 !important;\n  }\n  .order-sm-last {\n    order: 6 !important;\n  }\n  .m-sm-0 {\n    margin: 0 !important;\n  }\n  .m-sm-1 {\n    margin: 0.25rem !important;\n  }\n  .m-sm-2 {\n    margin: 0.5rem !important;\n  }\n  .m-sm-3 {\n    margin: 1rem !important;\n  }\n  .m-sm-4 {\n    margin: 1.5rem !important;\n  }\n  .m-sm-5 {\n    margin: 3rem !important;\n  }\n  .m-sm-auto {\n    margin: auto !important;\n  }\n  .mx-sm-0 {\n    margin-left: 0 !important;\n    margin-right: 0 !important;\n  }\n  .mx-sm-1 {\n    margin-left: 0.25rem !important;\n    margin-right: 0.25rem !important;\n  }\n  .mx-sm-2 {\n    margin-left: 0.5rem !important;\n    margin-right: 0.5rem !important;\n  }\n  .mx-sm-3 {\n    margin-left: 1rem !important;\n    margin-right: 1rem !important;\n  }\n  .mx-sm-4 {\n    margin-left: 1.5rem !important;\n    margin-right: 1.5rem !important;\n  }\n  .mx-sm-5 {\n    margin-left: 3rem !important;\n    margin-right: 3rem !important;\n  }\n  .mx-sm-auto {\n    margin-left: auto !important;\n    margin-right: auto !important;\n  }\n  .my-sm-0 {\n    margin-top: 0 !important;\n    margin-bottom: 0 !important;\n  }\n  .my-sm-1 {\n    margin-top: 0.25rem !important;\n    margin-bottom: 0.25rem !important;\n  }\n  .my-sm-2 {\n    margin-top: 0.5rem !important;\n    margin-bottom: 0.5rem !important;\n  }\n  .my-sm-3 {\n    margin-top: 1rem !important;\n    margin-bottom: 1rem !important;\n  }\n  .my-sm-4 {\n    margin-top: 1.5rem !important;\n    margin-bottom: 1.5rem !important;\n  }\n  .my-sm-5 {\n    margin-top: 3rem !important;\n    margin-bottom: 3rem !important;\n  }\n  .my-sm-auto {\n    margin-top: auto !important;\n    margin-bottom: auto !important;\n  }\n  .mt-sm-0 {\n    margin-top: 0 !important;\n  }\n  .mt-sm-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mt-sm-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mt-sm-3 {\n    margin-top: 1rem !important;\n  }\n  .mt-sm-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mt-sm-5 {\n    margin-top: 3rem !important;\n  }\n  .mt-sm-auto {\n    margin-top: auto !important;\n  }\n  .me-sm-0 {\n    margin-left: 0 !important;\n  }\n  .me-sm-1 {\n    margin-left: 0.25rem !important;\n  }\n  .me-sm-2 {\n    margin-left: 0.5rem !important;\n  }\n  .me-sm-3 {\n    margin-left: 1rem !important;\n  }\n  .me-sm-4 {\n    margin-left: 1.5rem !important;\n  }\n  .me-sm-5 {\n    margin-left: 3rem !important;\n  }\n  .me-sm-auto {\n    margin-left: auto !important;\n  }\n  .mb-sm-0 {\n    margin-bottom: 0 !important;\n  }\n  .mb-sm-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .mb-sm-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .mb-sm-3 {\n    margin-bottom: 1rem !important;\n  }\n  .mb-sm-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .mb-sm-5 {\n    margin-bottom: 3rem !important;\n  }\n  .mb-sm-auto {\n    margin-bottom: auto !important;\n  }\n  .ms-sm-0 {\n    margin-right: 0 !important;\n  }\n  .ms-sm-1 {\n    margin-right: 0.25rem !important;\n  }\n  .ms-sm-2 {\n    margin-right: 0.5rem !important;\n  }\n  .ms-sm-3 {\n    margin-right: 1rem !important;\n  }\n  .ms-sm-4 {\n    margin-right: 1.5rem !important;\n  }\n  .ms-sm-5 {\n    margin-right: 3rem !important;\n  }\n  .ms-sm-auto {\n    margin-right: auto !important;\n  }\n  .p-sm-0 {\n    padding: 0 !important;\n  }\n  .p-sm-1 {\n    padding: 0.25rem !important;\n  }\n  .p-sm-2 {\n    padding: 0.5rem !important;\n  }\n  .p-sm-3 {\n    padding: 1rem !important;\n  }\n  .p-sm-4 {\n    padding: 1.5rem !important;\n  }\n  .p-sm-5 {\n    padding: 3rem !important;\n  }\n  .px-sm-0 {\n    padding-left: 0 !important;\n    padding-right: 0 !important;\n  }\n  .px-sm-1 {\n    padding-left: 0.25rem !important;\n    padding-right: 0.25rem !important;\n  }\n  .px-sm-2 {\n    padding-left: 0.5rem !important;\n    padding-right: 0.5rem !important;\n  }\n  .px-sm-3 {\n    padding-left: 1rem !important;\n    padding-right: 1rem !important;\n  }\n  .px-sm-4 {\n    padding-left: 1.5rem !important;\n    padding-right: 1.5rem !important;\n  }\n  .px-sm-5 {\n    padding-left: 3rem !important;\n    padding-right: 3rem !important;\n  }\n  .py-sm-0 {\n    padding-top: 0 !important;\n    padding-bottom: 0 !important;\n  }\n  .py-sm-1 {\n    padding-top: 0.25rem !important;\n    padding-bottom: 0.25rem !important;\n  }\n  .py-sm-2 {\n    padding-top: 0.5rem !important;\n    padding-bottom: 0.5rem !important;\n  }\n  .py-sm-3 {\n    padding-top: 1rem !important;\n    padding-bottom: 1rem !important;\n  }\n  .py-sm-4 {\n    padding-top: 1.5rem !important;\n    padding-bottom: 1.5rem !important;\n  }\n  .py-sm-5 {\n    padding-top: 3rem !important;\n    padding-bottom: 3rem !important;\n  }\n  .pt-sm-0 {\n    padding-top: 0 !important;\n  }\n  .pt-sm-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pt-sm-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pt-sm-3 {\n    padding-top: 1rem !important;\n  }\n  .pt-sm-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pt-sm-5 {\n    padding-top: 3rem !important;\n  }\n  .pe-sm-0 {\n    padding-left: 0 !important;\n  }\n  .pe-sm-1 {\n    padding-left: 0.25rem !important;\n  }\n  .pe-sm-2 {\n    padding-left: 0.5rem !important;\n  }\n  .pe-sm-3 {\n    padding-left: 1rem !important;\n  }\n  .pe-sm-4 {\n    padding-left: 1.5rem !important;\n  }\n  .pe-sm-5 {\n    padding-left: 3rem !important;\n  }\n  .pb-sm-0 {\n    padding-bottom: 0 !important;\n  }\n  .pb-sm-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pb-sm-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pb-sm-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pb-sm-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pb-sm-5 {\n    padding-bottom: 3rem !important;\n  }\n  .ps-sm-0 {\n    padding-right: 0 !important;\n  }\n  .ps-sm-1 {\n    padding-right: 0.25rem !important;\n  }\n  .ps-sm-2 {\n    padding-right: 0.5rem !important;\n  }\n  .ps-sm-3 {\n    padding-right: 1rem !important;\n  }\n  .ps-sm-4 {\n    padding-right: 1.5rem !important;\n  }\n  .ps-sm-5 {\n    padding-right: 3rem !important;\n  }\n  .gap-sm-0 {\n    gap: 0 !important;\n  }\n  .gap-sm-1 {\n    gap: 0.25rem !important;\n  }\n  .gap-sm-2 {\n    gap: 0.5rem !important;\n  }\n  .gap-sm-3 {\n    gap: 1rem !important;\n  }\n  .gap-sm-4 {\n    gap: 1.5rem !important;\n  }\n  .gap-sm-5 {\n    gap: 3rem !important;\n  }\n  .row-gap-sm-0 {\n    row-gap: 0 !important;\n  }\n  .row-gap-sm-1 {\n    row-gap: 0.25rem !important;\n  }\n  .row-gap-sm-2 {\n    row-gap: 0.5rem !important;\n  }\n  .row-gap-sm-3 {\n    row-gap: 1rem !important;\n  }\n  .row-gap-sm-4 {\n    row-gap: 1.5rem !important;\n  }\n  .row-gap-sm-5 {\n    row-gap: 3rem !important;\n  }\n  .column-gap-sm-0 {\n    -moz-column-gap: 0 !important;\n    column-gap: 0 !important;\n  }\n  .column-gap-sm-1 {\n    -moz-column-gap: 0.25rem !important;\n    column-gap: 0.25rem !important;\n  }\n  .column-gap-sm-2 {\n    -moz-column-gap: 0.5rem !important;\n    column-gap: 0.5rem !important;\n  }\n  .column-gap-sm-3 {\n    -moz-column-gap: 1rem !important;\n    column-gap: 1rem !important;\n  }\n  .column-gap-sm-4 {\n    -moz-column-gap: 1.5rem !important;\n    column-gap: 1.5rem !important;\n  }\n  .column-gap-sm-5 {\n    -moz-column-gap: 3rem !important;\n    column-gap: 3rem !important;\n  }\n  .text-sm-start {\n    text-align: right !important;\n  }\n  .text-sm-end {\n    text-align: left !important;\n  }\n  .text-sm-center {\n    text-align: center !important;\n  }\n}\n@media (min-width: 768px) {\n  .float-md-start {\n    float: right !important;\n  }\n  .float-md-end {\n    float: left !important;\n  }\n  .float-md-none {\n    float: none !important;\n  }\n  .object-fit-md-contain {\n    -o-object-fit: contain !important;\n    object-fit: contain !important;\n  }\n  .object-fit-md-cover {\n    -o-object-fit: cover !important;\n    object-fit: cover !important;\n  }\n  .object-fit-md-fill {\n    -o-object-fit: fill !important;\n    object-fit: fill !important;\n  }\n  .object-fit-md-scale {\n    -o-object-fit: scale-down !important;\n    object-fit: scale-down !important;\n  }\n  .object-fit-md-none {\n    -o-object-fit: none !important;\n    object-fit: none !important;\n  }\n  .d-md-inline {\n    display: inline !important;\n  }\n  .d-md-inline-block {\n    display: inline-block !important;\n  }\n  .d-md-block {\n    display: block !important;\n  }\n  .d-md-grid {\n    display: grid !important;\n  }\n  .d-md-inline-grid {\n    display: inline-grid !important;\n  }\n  .d-md-table {\n    display: table !important;\n  }\n  .d-md-table-row {\n    display: table-row !important;\n  }\n  .d-md-table-cell {\n    display: table-cell !important;\n  }\n  .d-md-flex {\n    display: flex !important;\n  }\n  .d-md-inline-flex {\n    display: inline-flex !important;\n  }\n  .d-md-none {\n    display: none !important;\n  }\n  .flex-md-fill {\n    flex: 1 1 auto !important;\n  }\n  .flex-md-row {\n    flex-direction: row !important;\n  }\n  .flex-md-column {\n    flex-direction: column !important;\n  }\n  .flex-md-row-reverse {\n    flex-direction: row-reverse !important;\n  }\n  .flex-md-column-reverse {\n    flex-direction: column-reverse !important;\n  }\n  .flex-md-grow-0 {\n    flex-grow: 0 !important;\n  }\n  .flex-md-grow-1 {\n    flex-grow: 1 !important;\n  }\n  .flex-md-shrink-0 {\n    flex-shrink: 0 !important;\n  }\n  .flex-md-shrink-1 {\n    flex-shrink: 1 !important;\n  }\n  .flex-md-wrap {\n    flex-wrap: wrap !important;\n  }\n  .flex-md-nowrap {\n    flex-wrap: nowrap !important;\n  }\n  .flex-md-wrap-reverse {\n    flex-wrap: wrap-reverse !important;\n  }\n  .justify-content-md-start {\n    justify-content: flex-start !important;\n  }\n  .justify-content-md-end {\n    justify-content: flex-end !important;\n  }\n  .justify-content-md-center {\n    justify-content: center !important;\n  }\n  .justify-content-md-between {\n    justify-content: space-between !important;\n  }\n  .justify-content-md-around {\n    justify-content: space-around !important;\n  }\n  .justify-content-md-evenly {\n    justify-content: space-evenly !important;\n  }\n  .align-items-md-start {\n    align-items: flex-start !important;\n  }\n  .align-items-md-end {\n    align-items: flex-end !important;\n  }\n  .align-items-md-center {\n    align-items: center !important;\n  }\n  .align-items-md-baseline {\n    align-items: baseline !important;\n  }\n  .align-items-md-stretch {\n    align-items: stretch !important;\n  }\n  .align-content-md-start {\n    align-content: flex-start !important;\n  }\n  .align-content-md-end {\n    align-content: flex-end !important;\n  }\n  .align-content-md-center {\n    align-content: center !important;\n  }\n  .align-content-md-between {\n    align-content: space-between !important;\n  }\n  .align-content-md-around {\n    align-content: space-around !important;\n  }\n  .align-content-md-stretch {\n    align-content: stretch !important;\n  }\n  .align-self-md-auto {\n    align-self: auto !important;\n  }\n  .align-self-md-start {\n    align-self: flex-start !important;\n  }\n  .align-self-md-end {\n    align-self: flex-end !important;\n  }\n  .align-self-md-center {\n    align-self: center !important;\n  }\n  .align-self-md-baseline {\n    align-self: baseline !important;\n  }\n  .align-self-md-stretch {\n    align-self: stretch !important;\n  }\n  .order-md-first {\n    order: -1 !important;\n  }\n  .order-md-0 {\n    order: 0 !important;\n  }\n  .order-md-1 {\n    order: 1 !important;\n  }\n  .order-md-2 {\n    order: 2 !important;\n  }\n  .order-md-3 {\n    order: 3 !important;\n  }\n  .order-md-4 {\n    order: 4 !important;\n  }\n  .order-md-5 {\n    order: 5 !important;\n  }\n  .order-md-last {\n    order: 6 !important;\n  }\n  .m-md-0 {\n    margin: 0 !important;\n  }\n  .m-md-1 {\n    margin: 0.25rem !important;\n  }\n  .m-md-2 {\n    margin: 0.5rem !important;\n  }\n  .m-md-3 {\n    margin: 1rem !important;\n  }\n  .m-md-4 {\n    margin: 1.5rem !important;\n  }\n  .m-md-5 {\n    margin: 3rem !important;\n  }\n  .m-md-auto {\n    margin: auto !important;\n  }\n  .mx-md-0 {\n    margin-left: 0 !important;\n    margin-right: 0 !important;\n  }\n  .mx-md-1 {\n    margin-left: 0.25rem !important;\n    margin-right: 0.25rem !important;\n  }\n  .mx-md-2 {\n    margin-left: 0.5rem !important;\n    margin-right: 0.5rem !important;\n  }\n  .mx-md-3 {\n    margin-left: 1rem !important;\n    margin-right: 1rem !important;\n  }\n  .mx-md-4 {\n    margin-left: 1.5rem !important;\n    margin-right: 1.5rem !important;\n  }\n  .mx-md-5 {\n    margin-left: 3rem !important;\n    margin-right: 3rem !important;\n  }\n  .mx-md-auto {\n    margin-left: auto !important;\n    margin-right: auto !important;\n  }\n  .my-md-0 {\n    margin-top: 0 !important;\n    margin-bottom: 0 !important;\n  }\n  .my-md-1 {\n    margin-top: 0.25rem !important;\n    margin-bottom: 0.25rem !important;\n  }\n  .my-md-2 {\n    margin-top: 0.5rem !important;\n    margin-bottom: 0.5rem !important;\n  }\n  .my-md-3 {\n    margin-top: 1rem !important;\n    margin-bottom: 1rem !important;\n  }\n  .my-md-4 {\n    margin-top: 1.5rem !important;\n    margin-bottom: 1.5rem !important;\n  }\n  .my-md-5 {\n    margin-top: 3rem !important;\n    margin-bottom: 3rem !important;\n  }\n  .my-md-auto {\n    margin-top: auto !important;\n    margin-bottom: auto !important;\n  }\n  .mt-md-0 {\n    margin-top: 0 !important;\n  }\n  .mt-md-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mt-md-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mt-md-3 {\n    margin-top: 1rem !important;\n  }\n  .mt-md-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mt-md-5 {\n    margin-top: 3rem !important;\n  }\n  .mt-md-auto {\n    margin-top: auto !important;\n  }\n  .me-md-0 {\n    margin-left: 0 !important;\n  }\n  .me-md-1 {\n    margin-left: 0.25rem !important;\n  }\n  .me-md-2 {\n    margin-left: 0.5rem !important;\n  }\n  .me-md-3 {\n    margin-left: 1rem !important;\n  }\n  .me-md-4 {\n    margin-left: 1.5rem !important;\n  }\n  .me-md-5 {\n    margin-left: 3rem !important;\n  }\n  .me-md-auto {\n    margin-left: auto !important;\n  }\n  .mb-md-0 {\n    margin-bottom: 0 !important;\n  }\n  .mb-md-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .mb-md-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .mb-md-3 {\n    margin-bottom: 1rem !important;\n  }\n  .mb-md-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .mb-md-5 {\n    margin-bottom: 3rem !important;\n  }\n  .mb-md-auto {\n    margin-bottom: auto !important;\n  }\n  .ms-md-0 {\n    margin-right: 0 !important;\n  }\n  .ms-md-1 {\n    margin-right: 0.25rem !important;\n  }\n  .ms-md-2 {\n    margin-right: 0.5rem !important;\n  }\n  .ms-md-3 {\n    margin-right: 1rem !important;\n  }\n  .ms-md-4 {\n    margin-right: 1.5rem !important;\n  }\n  .ms-md-5 {\n    margin-right: 3rem !important;\n  }\n  .ms-md-auto {\n    margin-right: auto !important;\n  }\n  .p-md-0 {\n    padding: 0 !important;\n  }\n  .p-md-1 {\n    padding: 0.25rem !important;\n  }\n  .p-md-2 {\n    padding: 0.5rem !important;\n  }\n  .p-md-3 {\n    padding: 1rem !important;\n  }\n  .p-md-4 {\n    padding: 1.5rem !important;\n  }\n  .p-md-5 {\n    padding: 3rem !important;\n  }\n  .px-md-0 {\n    padding-left: 0 !important;\n    padding-right: 0 !important;\n  }\n  .px-md-1 {\n    padding-left: 0.25rem !important;\n    padding-right: 0.25rem !important;\n  }\n  .px-md-2 {\n    padding-left: 0.5rem !important;\n    padding-right: 0.5rem !important;\n  }\n  .px-md-3 {\n    padding-left: 1rem !important;\n    padding-right: 1rem !important;\n  }\n  .px-md-4 {\n    padding-left: 1.5rem !important;\n    padding-right: 1.5rem !important;\n  }\n  .px-md-5 {\n    padding-left: 3rem !important;\n    padding-right: 3rem !important;\n  }\n  .py-md-0 {\n    padding-top: 0 !important;\n    padding-bottom: 0 !important;\n  }\n  .py-md-1 {\n    padding-top: 0.25rem !important;\n    padding-bottom: 0.25rem !important;\n  }\n  .py-md-2 {\n    padding-top: 0.5rem !important;\n    padding-bottom: 0.5rem !important;\n  }\n  .py-md-3 {\n    padding-top: 1rem !important;\n    padding-bottom: 1rem !important;\n  }\n  .py-md-4 {\n    padding-top: 1.5rem !important;\n    padding-bottom: 1.5rem !important;\n  }\n  .py-md-5 {\n    padding-top: 3rem !important;\n    padding-bottom: 3rem !important;\n  }\n  .pt-md-0 {\n    padding-top: 0 !important;\n  }\n  .pt-md-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pt-md-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pt-md-3 {\n    padding-top: 1rem !important;\n  }\n  .pt-md-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pt-md-5 {\n    padding-top: 3rem !important;\n  }\n  .pe-md-0 {\n    padding-left: 0 !important;\n  }\n  .pe-md-1 {\n    padding-left: 0.25rem !important;\n  }\n  .pe-md-2 {\n    padding-left: 0.5rem !important;\n  }\n  .pe-md-3 {\n    padding-left: 1rem !important;\n  }\n  .pe-md-4 {\n    padding-left: 1.5rem !important;\n  }\n  .pe-md-5 {\n    padding-left: 3rem !important;\n  }\n  .pb-md-0 {\n    padding-bottom: 0 !important;\n  }\n  .pb-md-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pb-md-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pb-md-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pb-md-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pb-md-5 {\n    padding-bottom: 3rem !important;\n  }\n  .ps-md-0 {\n    padding-right: 0 !important;\n  }\n  .ps-md-1 {\n    padding-right: 0.25rem !important;\n  }\n  .ps-md-2 {\n    padding-right: 0.5rem !important;\n  }\n  .ps-md-3 {\n    padding-right: 1rem !important;\n  }\n  .ps-md-4 {\n    padding-right: 1.5rem !important;\n  }\n  .ps-md-5 {\n    padding-right: 3rem !important;\n  }\n  .gap-md-0 {\n    gap: 0 !important;\n  }\n  .gap-md-1 {\n    gap: 0.25rem !important;\n  }\n  .gap-md-2 {\n    gap: 0.5rem !important;\n  }\n  .gap-md-3 {\n    gap: 1rem !important;\n  }\n  .gap-md-4 {\n    gap: 1.5rem !important;\n  }\n  .gap-md-5 {\n    gap: 3rem !important;\n  }\n  .row-gap-md-0 {\n    row-gap: 0 !important;\n  }\n  .row-gap-md-1 {\n    row-gap: 0.25rem !important;\n  }\n  .row-gap-md-2 {\n    row-gap: 0.5rem !important;\n  }\n  .row-gap-md-3 {\n    row-gap: 1rem !important;\n  }\n  .row-gap-md-4 {\n    row-gap: 1.5rem !important;\n  }\n  .row-gap-md-5 {\n    row-gap: 3rem !important;\n  }\n  .column-gap-md-0 {\n    -moz-column-gap: 0 !important;\n    column-gap: 0 !important;\n  }\n  .column-gap-md-1 {\n    -moz-column-gap: 0.25rem !important;\n    column-gap: 0.25rem !important;\n  }\n  .column-gap-md-2 {\n    -moz-column-gap: 0.5rem !important;\n    column-gap: 0.5rem !important;\n  }\n  .column-gap-md-3 {\n    -moz-column-gap: 1rem !important;\n    column-gap: 1rem !important;\n  }\n  .column-gap-md-4 {\n    -moz-column-gap: 1.5rem !important;\n    column-gap: 1.5rem !important;\n  }\n  .column-gap-md-5 {\n    -moz-column-gap: 3rem !important;\n    column-gap: 3rem !important;\n  }\n  .text-md-start {\n    text-align: right !important;\n  }\n  .text-md-end {\n    text-align: left !important;\n  }\n  .text-md-center {\n    text-align: center !important;\n  }\n}\n@media (min-width: 992px) {\n  .float-lg-start {\n    float: right !important;\n  }\n  .float-lg-end {\n    float: left !important;\n  }\n  .float-lg-none {\n    float: none !important;\n  }\n  .object-fit-lg-contain {\n    -o-object-fit: contain !important;\n    object-fit: contain !important;\n  }\n  .object-fit-lg-cover {\n    -o-object-fit: cover !important;\n    object-fit: cover !important;\n  }\n  .object-fit-lg-fill {\n    -o-object-fit: fill !important;\n    object-fit: fill !important;\n  }\n  .object-fit-lg-scale {\n    -o-object-fit: scale-down !important;\n    object-fit: scale-down !important;\n  }\n  .object-fit-lg-none {\n    -o-object-fit: none !important;\n    object-fit: none !important;\n  }\n  .d-lg-inline {\n    display: inline !important;\n  }\n  .d-lg-inline-block {\n    display: inline-block !important;\n  }\n  .d-lg-block {\n    display: block !important;\n  }\n  .d-lg-grid {\n    display: grid !important;\n  }\n  .d-lg-inline-grid {\n    display: inline-grid !important;\n  }\n  .d-lg-table {\n    display: table !important;\n  }\n  .d-lg-table-row {\n    display: table-row !important;\n  }\n  .d-lg-table-cell {\n    display: table-cell !important;\n  }\n  .d-lg-flex {\n    display: flex !important;\n  }\n  .d-lg-inline-flex {\n    display: inline-flex !important;\n  }\n  .d-lg-none {\n    display: none !important;\n  }\n  .flex-lg-fill {\n    flex: 1 1 auto !important;\n  }\n  .flex-lg-row {\n    flex-direction: row !important;\n  }\n  .flex-lg-column {\n    flex-direction: column !important;\n  }\n  .flex-lg-row-reverse {\n    flex-direction: row-reverse !important;\n  }\n  .flex-lg-column-reverse {\n    flex-direction: column-reverse !important;\n  }\n  .flex-lg-grow-0 {\n    flex-grow: 0 !important;\n  }\n  .flex-lg-grow-1 {\n    flex-grow: 1 !important;\n  }\n  .flex-lg-shrink-0 {\n    flex-shrink: 0 !important;\n  }\n  .flex-lg-shrink-1 {\n    flex-shrink: 1 !important;\n  }\n  .flex-lg-wrap {\n    flex-wrap: wrap !important;\n  }\n  .flex-lg-nowrap {\n    flex-wrap: nowrap !important;\n  }\n  .flex-lg-wrap-reverse {\n    flex-wrap: wrap-reverse !important;\n  }\n  .justify-content-lg-start {\n    justify-content: flex-start !important;\n  }\n  .justify-content-lg-end {\n    justify-content: flex-end !important;\n  }\n  .justify-content-lg-center {\n    justify-content: center !important;\n  }\n  .justify-content-lg-between {\n    justify-content: space-between !important;\n  }\n  .justify-content-lg-around {\n    justify-content: space-around !important;\n  }\n  .justify-content-lg-evenly {\n    justify-content: space-evenly !important;\n  }\n  .align-items-lg-start {\n    align-items: flex-start !important;\n  }\n  .align-items-lg-end {\n    align-items: flex-end !important;\n  }\n  .align-items-lg-center {\n    align-items: center !important;\n  }\n  .align-items-lg-baseline {\n    align-items: baseline !important;\n  }\n  .align-items-lg-stretch {\n    align-items: stretch !important;\n  }\n  .align-content-lg-start {\n    align-content: flex-start !important;\n  }\n  .align-content-lg-end {\n    align-content: flex-end !important;\n  }\n  .align-content-lg-center {\n    align-content: center !important;\n  }\n  .align-content-lg-between {\n    align-content: space-between !important;\n  }\n  .align-content-lg-around {\n    align-content: space-around !important;\n  }\n  .align-content-lg-stretch {\n    align-content: stretch !important;\n  }\n  .align-self-lg-auto {\n    align-self: auto !important;\n  }\n  .align-self-lg-start {\n    align-self: flex-start !important;\n  }\n  .align-self-lg-end {\n    align-self: flex-end !important;\n  }\n  .align-self-lg-center {\n    align-self: center !important;\n  }\n  .align-self-lg-baseline {\n    align-self: baseline !important;\n  }\n  .align-self-lg-stretch {\n    align-self: stretch !important;\n  }\n  .order-lg-first {\n    order: -1 !important;\n  }\n  .order-lg-0 {\n    order: 0 !important;\n  }\n  .order-lg-1 {\n    order: 1 !important;\n  }\n  .order-lg-2 {\n    order: 2 !important;\n  }\n  .order-lg-3 {\n    order: 3 !important;\n  }\n  .order-lg-4 {\n    order: 4 !important;\n  }\n  .order-lg-5 {\n    order: 5 !important;\n  }\n  .order-lg-last {\n    order: 6 !important;\n  }\n  .m-lg-0 {\n    margin: 0 !important;\n  }\n  .m-lg-1 {\n    margin: 0.25rem !important;\n  }\n  .m-lg-2 {\n    margin: 0.5rem !important;\n  }\n  .m-lg-3 {\n    margin: 1rem !important;\n  }\n  .m-lg-4 {\n    margin: 1.5rem !important;\n  }\n  .m-lg-5 {\n    margin: 3rem !important;\n  }\n  .m-lg-auto {\n    margin: auto !important;\n  }\n  .mx-lg-0 {\n    margin-left: 0 !important;\n    margin-right: 0 !important;\n  }\n  .mx-lg-1 {\n    margin-left: 0.25rem !important;\n    margin-right: 0.25rem !important;\n  }\n  .mx-lg-2 {\n    margin-left: 0.5rem !important;\n    margin-right: 0.5rem !important;\n  }\n  .mx-lg-3 {\n    margin-left: 1rem !important;\n    margin-right: 1rem !important;\n  }\n  .mx-lg-4 {\n    margin-left: 1.5rem !important;\n    margin-right: 1.5rem !important;\n  }\n  .mx-lg-5 {\n    margin-left: 3rem !important;\n    margin-right: 3rem !important;\n  }\n  .mx-lg-auto {\n    margin-left: auto !important;\n    margin-right: auto !important;\n  }\n  .my-lg-0 {\n    margin-top: 0 !important;\n    margin-bottom: 0 !important;\n  }\n  .my-lg-1 {\n    margin-top: 0.25rem !important;\n    margin-bottom: 0.25rem !important;\n  }\n  .my-lg-2 {\n    margin-top: 0.5rem !important;\n    margin-bottom: 0.5rem !important;\n  }\n  .my-lg-3 {\n    margin-top: 1rem !important;\n    margin-bottom: 1rem !important;\n  }\n  .my-lg-4 {\n    margin-top: 1.5rem !important;\n    margin-bottom: 1.5rem !important;\n  }\n  .my-lg-5 {\n    margin-top: 3rem !important;\n    margin-bottom: 3rem !important;\n  }\n  .my-lg-auto {\n    margin-top: auto !important;\n    margin-bottom: auto !important;\n  }\n  .mt-lg-0 {\n    margin-top: 0 !important;\n  }\n  .mt-lg-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mt-lg-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mt-lg-3 {\n    margin-top: 1rem !important;\n  }\n  .mt-lg-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mt-lg-5 {\n    margin-top: 3rem !important;\n  }\n  .mt-lg-auto {\n    margin-top: auto !important;\n  }\n  .me-lg-0 {\n    margin-left: 0 !important;\n  }\n  .me-lg-1 {\n    margin-left: 0.25rem !important;\n  }\n  .me-lg-2 {\n    margin-left: 0.5rem !important;\n  }\n  .me-lg-3 {\n    margin-left: 1rem !important;\n  }\n  .me-lg-4 {\n    margin-left: 1.5rem !important;\n  }\n  .me-lg-5 {\n    margin-left: 3rem !important;\n  }\n  .me-lg-auto {\n    margin-left: auto !important;\n  }\n  .mb-lg-0 {\n    margin-bottom: 0 !important;\n  }\n  .mb-lg-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .mb-lg-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .mb-lg-3 {\n    margin-bottom: 1rem !important;\n  }\n  .mb-lg-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .mb-lg-5 {\n    margin-bottom: 3rem !important;\n  }\n  .mb-lg-auto {\n    margin-bottom: auto !important;\n  }\n  .ms-lg-0 {\n    margin-right: 0 !important;\n  }\n  .ms-lg-1 {\n    margin-right: 0.25rem !important;\n  }\n  .ms-lg-2 {\n    margin-right: 0.5rem !important;\n  }\n  .ms-lg-3 {\n    margin-right: 1rem !important;\n  }\n  .ms-lg-4 {\n    margin-right: 1.5rem !important;\n  }\n  .ms-lg-5 {\n    margin-right: 3rem !important;\n  }\n  .ms-lg-auto {\n    margin-right: auto !important;\n  }\n  .p-lg-0 {\n    padding: 0 !important;\n  }\n  .p-lg-1 {\n    padding: 0.25rem !important;\n  }\n  .p-lg-2 {\n    padding: 0.5rem !important;\n  }\n  .p-lg-3 {\n    padding: 1rem !important;\n  }\n  .p-lg-4 {\n    padding: 1.5rem !important;\n  }\n  .p-lg-5 {\n    padding: 3rem !important;\n  }\n  .px-lg-0 {\n    padding-left: 0 !important;\n    padding-right: 0 !important;\n  }\n  .px-lg-1 {\n    padding-left: 0.25rem !important;\n    padding-right: 0.25rem !important;\n  }\n  .px-lg-2 {\n    padding-left: 0.5rem !important;\n    padding-right: 0.5rem !important;\n  }\n  .px-lg-3 {\n    padding-left: 1rem !important;\n    padding-right: 1rem !important;\n  }\n  .px-lg-4 {\n    padding-left: 1.5rem !important;\n    padding-right: 1.5rem !important;\n  }\n  .px-lg-5 {\n    padding-left: 3rem !important;\n    padding-right: 3rem !important;\n  }\n  .py-lg-0 {\n    padding-top: 0 !important;\n    padding-bottom: 0 !important;\n  }\n  .py-lg-1 {\n    padding-top: 0.25rem !important;\n    padding-bottom: 0.25rem !important;\n  }\n  .py-lg-2 {\n    padding-top: 0.5rem !important;\n    padding-bottom: 0.5rem !important;\n  }\n  .py-lg-3 {\n    padding-top: 1rem !important;\n    padding-bottom: 1rem !important;\n  }\n  .py-lg-4 {\n    padding-top: 1.5rem !important;\n    padding-bottom: 1.5rem !important;\n  }\n  .py-lg-5 {\n    padding-top: 3rem !important;\n    padding-bottom: 3rem !important;\n  }\n  .pt-lg-0 {\n    padding-top: 0 !important;\n  }\n  .pt-lg-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pt-lg-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pt-lg-3 {\n    padding-top: 1rem !important;\n  }\n  .pt-lg-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pt-lg-5 {\n    padding-top: 3rem !important;\n  }\n  .pe-lg-0 {\n    padding-left: 0 !important;\n  }\n  .pe-lg-1 {\n    padding-left: 0.25rem !important;\n  }\n  .pe-lg-2 {\n    padding-left: 0.5rem !important;\n  }\n  .pe-lg-3 {\n    padding-left: 1rem !important;\n  }\n  .pe-lg-4 {\n    padding-left: 1.5rem !important;\n  }\n  .pe-lg-5 {\n    padding-left: 3rem !important;\n  }\n  .pb-lg-0 {\n    padding-bottom: 0 !important;\n  }\n  .pb-lg-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pb-lg-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pb-lg-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pb-lg-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pb-lg-5 {\n    padding-bottom: 3rem !important;\n  }\n  .ps-lg-0 {\n    padding-right: 0 !important;\n  }\n  .ps-lg-1 {\n    padding-right: 0.25rem !important;\n  }\n  .ps-lg-2 {\n    padding-right: 0.5rem !important;\n  }\n  .ps-lg-3 {\n    padding-right: 1rem !important;\n  }\n  .ps-lg-4 {\n    padding-right: 1.5rem !important;\n  }\n  .ps-lg-5 {\n    padding-right: 3rem !important;\n  }\n  .gap-lg-0 {\n    gap: 0 !important;\n  }\n  .gap-lg-1 {\n    gap: 0.25rem !important;\n  }\n  .gap-lg-2 {\n    gap: 0.5rem !important;\n  }\n  .gap-lg-3 {\n    gap: 1rem !important;\n  }\n  .gap-lg-4 {\n    gap: 1.5rem !important;\n  }\n  .gap-lg-5 {\n    gap: 3rem !important;\n  }\n  .row-gap-lg-0 {\n    row-gap: 0 !important;\n  }\n  .row-gap-lg-1 {\n    row-gap: 0.25rem !important;\n  }\n  .row-gap-lg-2 {\n    row-gap: 0.5rem !important;\n  }\n  .row-gap-lg-3 {\n    row-gap: 1rem !important;\n  }\n  .row-gap-lg-4 {\n    row-gap: 1.5rem !important;\n  }\n  .row-gap-lg-5 {\n    row-gap: 3rem !important;\n  }\n  .column-gap-lg-0 {\n    -moz-column-gap: 0 !important;\n    column-gap: 0 !important;\n  }\n  .column-gap-lg-1 {\n    -moz-column-gap: 0.25rem !important;\n    column-gap: 0.25rem !important;\n  }\n  .column-gap-lg-2 {\n    -moz-column-gap: 0.5rem !important;\n    column-gap: 0.5rem !important;\n  }\n  .column-gap-lg-3 {\n    -moz-column-gap: 1rem !important;\n    column-gap: 1rem !important;\n  }\n  .column-gap-lg-4 {\n    -moz-column-gap: 1.5rem !important;\n    column-gap: 1.5rem !important;\n  }\n  .column-gap-lg-5 {\n    -moz-column-gap: 3rem !important;\n    column-gap: 3rem !important;\n  }\n  .text-lg-start {\n    text-align: right !important;\n  }\n  .text-lg-end {\n    text-align: left !important;\n  }\n  .text-lg-center {\n    text-align: center !important;\n  }\n}\n@media (min-width: 1200px) {\n  .float-xl-start {\n    float: right !important;\n  }\n  .float-xl-end {\n    float: left !important;\n  }\n  .float-xl-none {\n    float: none !important;\n  }\n  .object-fit-xl-contain {\n    -o-object-fit: contain !important;\n    object-fit: contain !important;\n  }\n  .object-fit-xl-cover {\n    -o-object-fit: cover !important;\n    object-fit: cover !important;\n  }\n  .object-fit-xl-fill {\n    -o-object-fit: fill !important;\n    object-fit: fill !important;\n  }\n  .object-fit-xl-scale {\n    -o-object-fit: scale-down !important;\n    object-fit: scale-down !important;\n  }\n  .object-fit-xl-none {\n    -o-object-fit: none !important;\n    object-fit: none !important;\n  }\n  .d-xl-inline {\n    display: inline !important;\n  }\n  .d-xl-inline-block {\n    display: inline-block !important;\n  }\n  .d-xl-block {\n    display: block !important;\n  }\n  .d-xl-grid {\n    display: grid !important;\n  }\n  .d-xl-inline-grid {\n    display: inline-grid !important;\n  }\n  .d-xl-table {\n    display: table !important;\n  }\n  .d-xl-table-row {\n    display: table-row !important;\n  }\n  .d-xl-table-cell {\n    display: table-cell !important;\n  }\n  .d-xl-flex {\n    display: flex !important;\n  }\n  .d-xl-inline-flex {\n    display: inline-flex !important;\n  }\n  .d-xl-none {\n    display: none !important;\n  }\n  .flex-xl-fill {\n    flex: 1 1 auto !important;\n  }\n  .flex-xl-row {\n    flex-direction: row !important;\n  }\n  .flex-xl-column {\n    flex-direction: column !important;\n  }\n  .flex-xl-row-reverse {\n    flex-direction: row-reverse !important;\n  }\n  .flex-xl-column-reverse {\n    flex-direction: column-reverse !important;\n  }\n  .flex-xl-grow-0 {\n    flex-grow: 0 !important;\n  }\n  .flex-xl-grow-1 {\n    flex-grow: 1 !important;\n  }\n  .flex-xl-shrink-0 {\n    flex-shrink: 0 !important;\n  }\n  .flex-xl-shrink-1 {\n    flex-shrink: 1 !important;\n  }\n  .flex-xl-wrap {\n    flex-wrap: wrap !important;\n  }\n  .flex-xl-nowrap {\n    flex-wrap: nowrap !important;\n  }\n  .flex-xl-wrap-reverse {\n    flex-wrap: wrap-reverse !important;\n  }\n  .justify-content-xl-start {\n    justify-content: flex-start !important;\n  }\n  .justify-content-xl-end {\n    justify-content: flex-end !important;\n  }\n  .justify-content-xl-center {\n    justify-content: center !important;\n  }\n  .justify-content-xl-between {\n    justify-content: space-between !important;\n  }\n  .justify-content-xl-around {\n    justify-content: space-around !important;\n  }\n  .justify-content-xl-evenly {\n    justify-content: space-evenly !important;\n  }\n  .align-items-xl-start {\n    align-items: flex-start !important;\n  }\n  .align-items-xl-end {\n    align-items: flex-end !important;\n  }\n  .align-items-xl-center {\n    align-items: center !important;\n  }\n  .align-items-xl-baseline {\n    align-items: baseline !important;\n  }\n  .align-items-xl-stretch {\n    align-items: stretch !important;\n  }\n  .align-content-xl-start {\n    align-content: flex-start !important;\n  }\n  .align-content-xl-end {\n    align-content: flex-end !important;\n  }\n  .align-content-xl-center {\n    align-content: center !important;\n  }\n  .align-content-xl-between {\n    align-content: space-between !important;\n  }\n  .align-content-xl-around {\n    align-content: space-around !important;\n  }\n  .align-content-xl-stretch {\n    align-content: stretch !important;\n  }\n  .align-self-xl-auto {\n    align-self: auto !important;\n  }\n  .align-self-xl-start {\n    align-self: flex-start !important;\n  }\n  .align-self-xl-end {\n    align-self: flex-end !important;\n  }\n  .align-self-xl-center {\n    align-self: center !important;\n  }\n  .align-self-xl-baseline {\n    align-self: baseline !important;\n  }\n  .align-self-xl-stretch {\n    align-self: stretch !important;\n  }\n  .order-xl-first {\n    order: -1 !important;\n  }\n  .order-xl-0 {\n    order: 0 !important;\n  }\n  .order-xl-1 {\n    order: 1 !important;\n  }\n  .order-xl-2 {\n    order: 2 !important;\n  }\n  .order-xl-3 {\n    order: 3 !important;\n  }\n  .order-xl-4 {\n    order: 4 !important;\n  }\n  .order-xl-5 {\n    order: 5 !important;\n  }\n  .order-xl-last {\n    order: 6 !important;\n  }\n  .m-xl-0 {\n    margin: 0 !important;\n  }\n  .m-xl-1 {\n    margin: 0.25rem !important;\n  }\n  .m-xl-2 {\n    margin: 0.5rem !important;\n  }\n  .m-xl-3 {\n    margin: 1rem !important;\n  }\n  .m-xl-4 {\n    margin: 1.5rem !important;\n  }\n  .m-xl-5 {\n    margin: 3rem !important;\n  }\n  .m-xl-auto {\n    margin: auto !important;\n  }\n  .mx-xl-0 {\n    margin-left: 0 !important;\n    margin-right: 0 !important;\n  }\n  .mx-xl-1 {\n    margin-left: 0.25rem !important;\n    margin-right: 0.25rem !important;\n  }\n  .mx-xl-2 {\n    margin-left: 0.5rem !important;\n    margin-right: 0.5rem !important;\n  }\n  .mx-xl-3 {\n    margin-left: 1rem !important;\n    margin-right: 1rem !important;\n  }\n  .mx-xl-4 {\n    margin-left: 1.5rem !important;\n    margin-right: 1.5rem !important;\n  }\n  .mx-xl-5 {\n    margin-left: 3rem !important;\n    margin-right: 3rem !important;\n  }\n  .mx-xl-auto {\n    margin-left: auto !important;\n    margin-right: auto !important;\n  }\n  .my-xl-0 {\n    margin-top: 0 !important;\n    margin-bottom: 0 !important;\n  }\n  .my-xl-1 {\n    margin-top: 0.25rem !important;\n    margin-bottom: 0.25rem !important;\n  }\n  .my-xl-2 {\n    margin-top: 0.5rem !important;\n    margin-bottom: 0.5rem !important;\n  }\n  .my-xl-3 {\n    margin-top: 1rem !important;\n    margin-bottom: 1rem !important;\n  }\n  .my-xl-4 {\n    margin-top: 1.5rem !important;\n    margin-bottom: 1.5rem !important;\n  }\n  .my-xl-5 {\n    margin-top: 3rem !important;\n    margin-bottom: 3rem !important;\n  }\n  .my-xl-auto {\n    margin-top: auto !important;\n    margin-bottom: auto !important;\n  }\n  .mt-xl-0 {\n    margin-top: 0 !important;\n  }\n  .mt-xl-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mt-xl-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mt-xl-3 {\n    margin-top: 1rem !important;\n  }\n  .mt-xl-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mt-xl-5 {\n    margin-top: 3rem !important;\n  }\n  .mt-xl-auto {\n    margin-top: auto !important;\n  }\n  .me-xl-0 {\n    margin-left: 0 !important;\n  }\n  .me-xl-1 {\n    margin-left: 0.25rem !important;\n  }\n  .me-xl-2 {\n    margin-left: 0.5rem !important;\n  }\n  .me-xl-3 {\n    margin-left: 1rem !important;\n  }\n  .me-xl-4 {\n    margin-left: 1.5rem !important;\n  }\n  .me-xl-5 {\n    margin-left: 3rem !important;\n  }\n  .me-xl-auto {\n    margin-left: auto !important;\n  }\n  .mb-xl-0 {\n    margin-bottom: 0 !important;\n  }\n  .mb-xl-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .mb-xl-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .mb-xl-3 {\n    margin-bottom: 1rem !important;\n  }\n  .mb-xl-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .mb-xl-5 {\n    margin-bottom: 3rem !important;\n  }\n  .mb-xl-auto {\n    margin-bottom: auto !important;\n  }\n  .ms-xl-0 {\n    margin-right: 0 !important;\n  }\n  .ms-xl-1 {\n    margin-right: 0.25rem !important;\n  }\n  .ms-xl-2 {\n    margin-right: 0.5rem !important;\n  }\n  .ms-xl-3 {\n    margin-right: 1rem !important;\n  }\n  .ms-xl-4 {\n    margin-right: 1.5rem !important;\n  }\n  .ms-xl-5 {\n    margin-right: 3rem !important;\n  }\n  .ms-xl-auto {\n    margin-right: auto !important;\n  }\n  .p-xl-0 {\n    padding: 0 !important;\n  }\n  .p-xl-1 {\n    padding: 0.25rem !important;\n  }\n  .p-xl-2 {\n    padding: 0.5rem !important;\n  }\n  .p-xl-3 {\n    padding: 1rem !important;\n  }\n  .p-xl-4 {\n    padding: 1.5rem !important;\n  }\n  .p-xl-5 {\n    padding: 3rem !important;\n  }\n  .px-xl-0 {\n    padding-left: 0 !important;\n    padding-right: 0 !important;\n  }\n  .px-xl-1 {\n    padding-left: 0.25rem !important;\n    padding-right: 0.25rem !important;\n  }\n  .px-xl-2 {\n    padding-left: 0.5rem !important;\n    padding-right: 0.5rem !important;\n  }\n  .px-xl-3 {\n    padding-left: 1rem !important;\n    padding-right: 1rem !important;\n  }\n  .px-xl-4 {\n    padding-left: 1.5rem !important;\n    padding-right: 1.5rem !important;\n  }\n  .px-xl-5 {\n    padding-left: 3rem !important;\n    padding-right: 3rem !important;\n  }\n  .py-xl-0 {\n    padding-top: 0 !important;\n    padding-bottom: 0 !important;\n  }\n  .py-xl-1 {\n    padding-top: 0.25rem !important;\n    padding-bottom: 0.25rem !important;\n  }\n  .py-xl-2 {\n    padding-top: 0.5rem !important;\n    padding-bottom: 0.5rem !important;\n  }\n  .py-xl-3 {\n    padding-top: 1rem !important;\n    padding-bottom: 1rem !important;\n  }\n  .py-xl-4 {\n    padding-top: 1.5rem !important;\n    padding-bottom: 1.5rem !important;\n  }\n  .py-xl-5 {\n    padding-top: 3rem !important;\n    padding-bottom: 3rem !important;\n  }\n  .pt-xl-0 {\n    padding-top: 0 !important;\n  }\n  .pt-xl-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pt-xl-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pt-xl-3 {\n    padding-top: 1rem !important;\n  }\n  .pt-xl-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pt-xl-5 {\n    padding-top: 3rem !important;\n  }\n  .pe-xl-0 {\n    padding-left: 0 !important;\n  }\n  .pe-xl-1 {\n    padding-left: 0.25rem !important;\n  }\n  .pe-xl-2 {\n    padding-left: 0.5rem !important;\n  }\n  .pe-xl-3 {\n    padding-left: 1rem !important;\n  }\n  .pe-xl-4 {\n    padding-left: 1.5rem !important;\n  }\n  .pe-xl-5 {\n    padding-left: 3rem !important;\n  }\n  .pb-xl-0 {\n    padding-bottom: 0 !important;\n  }\n  .pb-xl-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pb-xl-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pb-xl-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pb-xl-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pb-xl-5 {\n    padding-bottom: 3rem !important;\n  }\n  .ps-xl-0 {\n    padding-right: 0 !important;\n  }\n  .ps-xl-1 {\n    padding-right: 0.25rem !important;\n  }\n  .ps-xl-2 {\n    padding-right: 0.5rem !important;\n  }\n  .ps-xl-3 {\n    padding-right: 1rem !important;\n  }\n  .ps-xl-4 {\n    padding-right: 1.5rem !important;\n  }\n  .ps-xl-5 {\n    padding-right: 3rem !important;\n  }\n  .gap-xl-0 {\n    gap: 0 !important;\n  }\n  .gap-xl-1 {\n    gap: 0.25rem !important;\n  }\n  .gap-xl-2 {\n    gap: 0.5rem !important;\n  }\n  .gap-xl-3 {\n    gap: 1rem !important;\n  }\n  .gap-xl-4 {\n    gap: 1.5rem !important;\n  }\n  .gap-xl-5 {\n    gap: 3rem !important;\n  }\n  .row-gap-xl-0 {\n    row-gap: 0 !important;\n  }\n  .row-gap-xl-1 {\n    row-gap: 0.25rem !important;\n  }\n  .row-gap-xl-2 {\n    row-gap: 0.5rem !important;\n  }\n  .row-gap-xl-3 {\n    row-gap: 1rem !important;\n  }\n  .row-gap-xl-4 {\n    row-gap: 1.5rem !important;\n  }\n  .row-gap-xl-5 {\n    row-gap: 3rem !important;\n  }\n  .column-gap-xl-0 {\n    -moz-column-gap: 0 !important;\n    column-gap: 0 !important;\n  }\n  .column-gap-xl-1 {\n    -moz-column-gap: 0.25rem !important;\n    column-gap: 0.25rem !important;\n  }\n  .column-gap-xl-2 {\n    -moz-column-gap: 0.5rem !important;\n    column-gap: 0.5rem !important;\n  }\n  .column-gap-xl-3 {\n    -moz-column-gap: 1rem !important;\n    column-gap: 1rem !important;\n  }\n  .column-gap-xl-4 {\n    -moz-column-gap: 1.5rem !important;\n    column-gap: 1.5rem !important;\n  }\n  .column-gap-xl-5 {\n    -moz-column-gap: 3rem !important;\n    column-gap: 3rem !important;\n  }\n  .text-xl-start {\n    text-align: right !important;\n  }\n  .text-xl-end {\n    text-align: left !important;\n  }\n  .text-xl-center {\n    text-align: center !important;\n  }\n}\n@media (min-width: 1400px) {\n  .float-xxl-start {\n    float: right !important;\n  }\n  .float-xxl-end {\n    float: left !important;\n  }\n  .float-xxl-none {\n    float: none !important;\n  }\n  .object-fit-xxl-contain {\n    -o-object-fit: contain !important;\n    object-fit: contain !important;\n  }\n  .object-fit-xxl-cover {\n    -o-object-fit: cover !important;\n    object-fit: cover !important;\n  }\n  .object-fit-xxl-fill {\n    -o-object-fit: fill !important;\n    object-fit: fill !important;\n  }\n  .object-fit-xxl-scale {\n    -o-object-fit: scale-down !important;\n    object-fit: scale-down !important;\n  }\n  .object-fit-xxl-none {\n    -o-object-fit: none !important;\n    object-fit: none !important;\n  }\n  .d-xxl-inline {\n    display: inline !important;\n  }\n  .d-xxl-inline-block {\n    display: inline-block !important;\n  }\n  .d-xxl-block {\n    display: block !important;\n  }\n  .d-xxl-grid {\n    display: grid !important;\n  }\n  .d-xxl-inline-grid {\n    display: inline-grid !important;\n  }\n  .d-xxl-table {\n    display: table !important;\n  }\n  .d-xxl-table-row {\n    display: table-row !important;\n  }\n  .d-xxl-table-cell {\n    display: table-cell !important;\n  }\n  .d-xxl-flex {\n    display: flex !important;\n  }\n  .d-xxl-inline-flex {\n    display: inline-flex !important;\n  }\n  .d-xxl-none {\n    display: none !important;\n  }\n  .flex-xxl-fill {\n    flex: 1 1 auto !important;\n  }\n  .flex-xxl-row {\n    flex-direction: row !important;\n  }\n  .flex-xxl-column {\n    flex-direction: column !important;\n  }\n  .flex-xxl-row-reverse {\n    flex-direction: row-reverse !important;\n  }\n  .flex-xxl-column-reverse {\n    flex-direction: column-reverse !important;\n  }\n  .flex-xxl-grow-0 {\n    flex-grow: 0 !important;\n  }\n  .flex-xxl-grow-1 {\n    flex-grow: 1 !important;\n  }\n  .flex-xxl-shrink-0 {\n    flex-shrink: 0 !important;\n  }\n  .flex-xxl-shrink-1 {\n    flex-shrink: 1 !important;\n  }\n  .flex-xxl-wrap {\n    flex-wrap: wrap !important;\n  }\n  .flex-xxl-nowrap {\n    flex-wrap: nowrap !important;\n  }\n  .flex-xxl-wrap-reverse {\n    flex-wrap: wrap-reverse !important;\n  }\n  .justify-content-xxl-start {\n    justify-content: flex-start !important;\n  }\n  .justify-content-xxl-end {\n    justify-content: flex-end !important;\n  }\n  .justify-content-xxl-center {\n    justify-content: center !important;\n  }\n  .justify-content-xxl-between {\n    justify-content: space-between !important;\n  }\n  .justify-content-xxl-around {\n    justify-content: space-around !important;\n  }\n  .justify-content-xxl-evenly {\n    justify-content: space-evenly !important;\n  }\n  .align-items-xxl-start {\n    align-items: flex-start !important;\n  }\n  .align-items-xxl-end {\n    align-items: flex-end !important;\n  }\n  .align-items-xxl-center {\n    align-items: center !important;\n  }\n  .align-items-xxl-baseline {\n    align-items: baseline !important;\n  }\n  .align-items-xxl-stretch {\n    align-items: stretch !important;\n  }\n  .align-content-xxl-start {\n    align-content: flex-start !important;\n  }\n  .align-content-xxl-end {\n    align-content: flex-end !important;\n  }\n  .align-content-xxl-center {\n    align-content: center !important;\n  }\n  .align-content-xxl-between {\n    align-content: space-between !important;\n  }\n  .align-content-xxl-around {\n    align-content: space-around !important;\n  }\n  .align-content-xxl-stretch {\n    align-content: stretch !important;\n  }\n  .align-self-xxl-auto {\n    align-self: auto !important;\n  }\n  .align-self-xxl-start {\n    align-self: flex-start !important;\n  }\n  .align-self-xxl-end {\n    align-self: flex-end !important;\n  }\n  .align-self-xxl-center {\n    align-self: center !important;\n  }\n  .align-self-xxl-baseline {\n    align-self: baseline !important;\n  }\n  .align-self-xxl-stretch {\n    align-self: stretch !important;\n  }\n  .order-xxl-first {\n    order: -1 !important;\n  }\n  .order-xxl-0 {\n    order: 0 !important;\n  }\n  .order-xxl-1 {\n    order: 1 !important;\n  }\n  .order-xxl-2 {\n    order: 2 !important;\n  }\n  .order-xxl-3 {\n    order: 3 !important;\n  }\n  .order-xxl-4 {\n    order: 4 !important;\n  }\n  .order-xxl-5 {\n    order: 5 !important;\n  }\n  .order-xxl-last {\n    order: 6 !important;\n  }\n  .m-xxl-0 {\n    margin: 0 !important;\n  }\n  .m-xxl-1 {\n    margin: 0.25rem !important;\n  }\n  .m-xxl-2 {\n    margin: 0.5rem !important;\n  }\n  .m-xxl-3 {\n    margin: 1rem !important;\n  }\n  .m-xxl-4 {\n    margin: 1.5rem !important;\n  }\n  .m-xxl-5 {\n    margin: 3rem !important;\n  }\n  .m-xxl-auto {\n    margin: auto !important;\n  }\n  .mx-xxl-0 {\n    margin-left: 0 !important;\n    margin-right: 0 !important;\n  }\n  .mx-xxl-1 {\n    margin-left: 0.25rem !important;\n    margin-right: 0.25rem !important;\n  }\n  .mx-xxl-2 {\n    margin-left: 0.5rem !important;\n    margin-right: 0.5rem !important;\n  }\n  .mx-xxl-3 {\n    margin-left: 1rem !important;\n    margin-right: 1rem !important;\n  }\n  .mx-xxl-4 {\n    margin-left: 1.5rem !important;\n    margin-right: 1.5rem !important;\n  }\n  .mx-xxl-5 {\n    margin-left: 3rem !important;\n    margin-right: 3rem !important;\n  }\n  .mx-xxl-auto {\n    margin-left: auto !important;\n    margin-right: auto !important;\n  }\n  .my-xxl-0 {\n    margin-top: 0 !important;\n    margin-bottom: 0 !important;\n  }\n  .my-xxl-1 {\n    margin-top: 0.25rem !important;\n    margin-bottom: 0.25rem !important;\n  }\n  .my-xxl-2 {\n    margin-top: 0.5rem !important;\n    margin-bottom: 0.5rem !important;\n  }\n  .my-xxl-3 {\n    margin-top: 1rem !important;\n    margin-bottom: 1rem !important;\n  }\n  .my-xxl-4 {\n    margin-top: 1.5rem !important;\n    margin-bottom: 1.5rem !important;\n  }\n  .my-xxl-5 {\n    margin-top: 3rem !important;\n    margin-bottom: 3rem !important;\n  }\n  .my-xxl-auto {\n    margin-top: auto !important;\n    margin-bottom: auto !important;\n  }\n  .mt-xxl-0 {\n    margin-top: 0 !important;\n  }\n  .mt-xxl-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mt-xxl-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mt-xxl-3 {\n    margin-top: 1rem !important;\n  }\n  .mt-xxl-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mt-xxl-5 {\n    margin-top: 3rem !important;\n  }\n  .mt-xxl-auto {\n    margin-top: auto !important;\n  }\n  .me-xxl-0 {\n    margin-left: 0 !important;\n  }\n  .me-xxl-1 {\n    margin-left: 0.25rem !important;\n  }\n  .me-xxl-2 {\n    margin-left: 0.5rem !important;\n  }\n  .me-xxl-3 {\n    margin-left: 1rem !important;\n  }\n  .me-xxl-4 {\n    margin-left: 1.5rem !important;\n  }\n  .me-xxl-5 {\n    margin-left: 3rem !important;\n  }\n  .me-xxl-auto {\n    margin-left: auto !important;\n  }\n  .mb-xxl-0 {\n    margin-bottom: 0 !important;\n  }\n  .mb-xxl-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .mb-xxl-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .mb-xxl-3 {\n    margin-bottom: 1rem !important;\n  }\n  .mb-xxl-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .mb-xxl-5 {\n    margin-bottom: 3rem !important;\n  }\n  .mb-xxl-auto {\n    margin-bottom: auto !important;\n  }\n  .ms-xxl-0 {\n    margin-right: 0 !important;\n  }\n  .ms-xxl-1 {\n    margin-right: 0.25rem !important;\n  }\n  .ms-xxl-2 {\n    margin-right: 0.5rem !important;\n  }\n  .ms-xxl-3 {\n    margin-right: 1rem !important;\n  }\n  .ms-xxl-4 {\n    margin-right: 1.5rem !important;\n  }\n  .ms-xxl-5 {\n    margin-right: 3rem !important;\n  }\n  .ms-xxl-auto {\n    margin-right: auto !important;\n  }\n  .p-xxl-0 {\n    padding: 0 !important;\n  }\n  .p-xxl-1 {\n    padding: 0.25rem !important;\n  }\n  .p-xxl-2 {\n    padding: 0.5rem !important;\n  }\n  .p-xxl-3 {\n    padding: 1rem !important;\n  }\n  .p-xxl-4 {\n    padding: 1.5rem !important;\n  }\n  .p-xxl-5 {\n    padding: 3rem !important;\n  }\n  .px-xxl-0 {\n    padding-left: 0 !important;\n    padding-right: 0 !important;\n  }\n  .px-xxl-1 {\n    padding-left: 0.25rem !important;\n    padding-right: 0.25rem !important;\n  }\n  .px-xxl-2 {\n    padding-left: 0.5rem !important;\n    padding-right: 0.5rem !important;\n  }\n  .px-xxl-3 {\n    padding-left: 1rem !important;\n    padding-right: 1rem !important;\n  }\n  .px-xxl-4 {\n    padding-left: 1.5rem !important;\n    padding-right: 1.5rem !important;\n  }\n  .px-xxl-5 {\n    padding-left: 3rem !important;\n    padding-right: 3rem !important;\n  }\n  .py-xxl-0 {\n    padding-top: 0 !important;\n    padding-bottom: 0 !important;\n  }\n  .py-xxl-1 {\n    padding-top: 0.25rem !important;\n    padding-bottom: 0.25rem !important;\n  }\n  .py-xxl-2 {\n    padding-top: 0.5rem !important;\n    padding-bottom: 0.5rem !important;\n  }\n  .py-xxl-3 {\n    padding-top: 1rem !important;\n    padding-bottom: 1rem !important;\n  }\n  .py-xxl-4 {\n    padding-top: 1.5rem !important;\n    padding-bottom: 1.5rem !important;\n  }\n  .py-xxl-5 {\n    padding-top: 3rem !important;\n    padding-bottom: 3rem !important;\n  }\n  .pt-xxl-0 {\n    padding-top: 0 !important;\n  }\n  .pt-xxl-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pt-xxl-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pt-xxl-3 {\n    padding-top: 1rem !important;\n  }\n  .pt-xxl-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pt-xxl-5 {\n    padding-top: 3rem !important;\n  }\n  .pe-xxl-0 {\n    padding-left: 0 !important;\n  }\n  .pe-xxl-1 {\n    padding-left: 0.25rem !important;\n  }\n  .pe-xxl-2 {\n    padding-left: 0.5rem !important;\n  }\n  .pe-xxl-3 {\n    padding-left: 1rem !important;\n  }\n  .pe-xxl-4 {\n    padding-left: 1.5rem !important;\n  }\n  .pe-xxl-5 {\n    padding-left: 3rem !important;\n  }\n  .pb-xxl-0 {\n    padding-bottom: 0 !important;\n  }\n  .pb-xxl-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pb-xxl-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pb-xxl-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pb-xxl-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pb-xxl-5 {\n    padding-bottom: 3rem !important;\n  }\n  .ps-xxl-0 {\n    padding-right: 0 !important;\n  }\n  .ps-xxl-1 {\n    padding-right: 0.25rem !important;\n  }\n  .ps-xxl-2 {\n    padding-right: 0.5rem !important;\n  }\n  .ps-xxl-3 {\n    padding-right: 1rem !important;\n  }\n  .ps-xxl-4 {\n    padding-right: 1.5rem !important;\n  }\n  .ps-xxl-5 {\n    padding-right: 3rem !important;\n  }\n  .gap-xxl-0 {\n    gap: 0 !important;\n  }\n  .gap-xxl-1 {\n    gap: 0.25rem !important;\n  }\n  .gap-xxl-2 {\n    gap: 0.5rem !important;\n  }\n  .gap-xxl-3 {\n    gap: 1rem !important;\n  }\n  .gap-xxl-4 {\n    gap: 1.5rem !important;\n  }\n  .gap-xxl-5 {\n    gap: 3rem !important;\n  }\n  .row-gap-xxl-0 {\n    row-gap: 0 !important;\n  }\n  .row-gap-xxl-1 {\n    row-gap: 0.25rem !important;\n  }\n  .row-gap-xxl-2 {\n    row-gap: 0.5rem !important;\n  }\n  .row-gap-xxl-3 {\n    row-gap: 1rem !important;\n  }\n  .row-gap-xxl-4 {\n    row-gap: 1.5rem !important;\n  }\n  .row-gap-xxl-5 {\n    row-gap: 3rem !important;\n  }\n  .column-gap-xxl-0 {\n    -moz-column-gap: 0 !important;\n    column-gap: 0 !important;\n  }\n  .column-gap-xxl-1 {\n    -moz-column-gap: 0.25rem !important;\n    column-gap: 0.25rem !important;\n  }\n  .column-gap-xxl-2 {\n    -moz-column-gap: 0.5rem !important;\n    column-gap: 0.5rem !important;\n  }\n  .column-gap-xxl-3 {\n    -moz-column-gap: 1rem !important;\n    column-gap: 1rem !important;\n  }\n  .column-gap-xxl-4 {\n    -moz-column-gap: 1.5rem !important;\n    column-gap: 1.5rem !important;\n  }\n  .column-gap-xxl-5 {\n    -moz-column-gap: 3rem !important;\n    column-gap: 3rem !important;\n  }\n  .text-xxl-start {\n    text-align: right !important;\n  }\n  .text-xxl-end {\n    text-align: left !important;\n  }\n  .text-xxl-center {\n    text-align: center !important;\n  }\n}\n@media (min-width: 1200px) {\n  .fs-1 {\n    font-size: 2.5rem !important;\n  }\n  .fs-2 {\n    font-size: 2rem !important;\n  }\n  .fs-3 {\n    font-size: 1.75rem !important;\n  }\n  .fs-4 {\n    font-size: 1.5rem !important;\n  }\n}\n@media print {\n  .d-print-inline {\n    display: inline !important;\n  }\n  .d-print-inline-block {\n    display: inline-block !important;\n  }\n  .d-print-block {\n    display: block !important;\n  }\n  .d-print-grid {\n    display: grid !important;\n  }\n  .d-print-inline-grid {\n    display: inline-grid !important;\n  }\n  .d-print-table {\n    display: table !important;\n  }\n  .d-print-table-row {\n    display: table-row !important;\n  }\n  .d-print-table-cell {\n    display: table-cell !important;\n  }\n  .d-print-flex {\n    display: flex !important;\n  }\n  .d-print-inline-flex {\n    display: inline-flex !important;\n  }\n  .d-print-none {\n    display: none !important;\n  }\n}\n/*# sourceMappingURL=bootstrap.rtl.css.map */"
  },
  {
    "path": "dist/js/bootstrap.bundle.js",
    "content": "/*!\n  * Bootstrap v5.3.8 (https://getbootstrap.com/)\n  * Copyright 2011-2025 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n  */\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n  typeof define === 'function' && define.amd ? define(factory) :\n  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.bootstrap = factory());\n})(this, (function () { 'use strict';\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap dom/data.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n  /**\n   * Constants\n   */\n\n  const elementMap = new Map();\n  const Data = {\n    set(element, key, instance) {\n      if (!elementMap.has(element)) {\n        elementMap.set(element, new Map());\n      }\n      const instanceMap = elementMap.get(element);\n\n      // make it clear we only want one instance per element\n      // can be removed later when multiple key/instances are fine to be used\n      if (!instanceMap.has(key) && instanceMap.size !== 0) {\n        // eslint-disable-next-line no-console\n        console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`);\n        return;\n      }\n      instanceMap.set(key, instance);\n    },\n    get(element, key) {\n      if (elementMap.has(element)) {\n        return elementMap.get(element).get(key) || null;\n      }\n      return null;\n    },\n    remove(element, key) {\n      if (!elementMap.has(element)) {\n        return;\n      }\n      const instanceMap = elementMap.get(element);\n      instanceMap.delete(key);\n\n      // free up element references if there are no instances left for an element\n      if (instanceMap.size === 0) {\n        elementMap.delete(element);\n      }\n    }\n  };\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap util/index.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n  const MAX_UID = 1000000;\n  const MILLISECONDS_MULTIPLIER = 1000;\n  const TRANSITION_END = 'transitionend';\n\n  /**\n   * Properly escape IDs selectors to handle weird IDs\n   * @param {string} selector\n   * @returns {string}\n   */\n  const parseSelector = selector => {\n    if (selector && window.CSS && window.CSS.escape) {\n      // document.querySelector needs escaping to handle IDs (html5+) containing for instance /\n      selector = selector.replace(/#([^\\s\"#']+)/g, (match, id) => `#${CSS.escape(id)}`);\n    }\n    return selector;\n  };\n\n  // Shout-out Angus Croll (https://goo.gl/pxwQGp)\n  const toType = object => {\n    if (object === null || object === undefined) {\n      return `${object}`;\n    }\n    return Object.prototype.toString.call(object).match(/\\s([a-z]+)/i)[1].toLowerCase();\n  };\n\n  /**\n   * Public Util API\n   */\n\n  const getUID = prefix => {\n    do {\n      prefix += Math.floor(Math.random() * MAX_UID);\n    } while (document.getElementById(prefix));\n    return prefix;\n  };\n  const getTransitionDurationFromElement = element => {\n    if (!element) {\n      return 0;\n    }\n\n    // Get transition-duration of the element\n    let {\n      transitionDuration,\n      transitionDelay\n    } = window.getComputedStyle(element);\n    const floatTransitionDuration = Number.parseFloat(transitionDuration);\n    const floatTransitionDelay = Number.parseFloat(transitionDelay);\n\n    // Return 0 if element or transition duration is not found\n    if (!floatTransitionDuration && !floatTransitionDelay) {\n      return 0;\n    }\n\n    // If multiple durations are defined, take the first\n    transitionDuration = transitionDuration.split(',')[0];\n    transitionDelay = transitionDelay.split(',')[0];\n    return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER;\n  };\n  const triggerTransitionEnd = element => {\n    element.dispatchEvent(new Event(TRANSITION_END));\n  };\n  const isElement$1 = object => {\n    if (!object || typeof object !== 'object') {\n      return false;\n    }\n    if (typeof object.jquery !== 'undefined') {\n      object = object[0];\n    }\n    return typeof object.nodeType !== 'undefined';\n  };\n  const getElement = object => {\n    // it's a jQuery object or a node element\n    if (isElement$1(object)) {\n      return object.jquery ? object[0] : object;\n    }\n    if (typeof object === 'string' && object.length > 0) {\n      return document.querySelector(parseSelector(object));\n    }\n    return null;\n  };\n  const isVisible = element => {\n    if (!isElement$1(element) || element.getClientRects().length === 0) {\n      return false;\n    }\n    const elementIsVisible = getComputedStyle(element).getPropertyValue('visibility') === 'visible';\n    // Handle `details` element as its content may falsie appear visible when it is closed\n    const closedDetails = element.closest('details:not([open])');\n    if (!closedDetails) {\n      return elementIsVisible;\n    }\n    if (closedDetails !== element) {\n      const summary = element.closest('summary');\n      if (summary && summary.parentNode !== closedDetails) {\n        return false;\n      }\n      if (summary === null) {\n        return false;\n      }\n    }\n    return elementIsVisible;\n  };\n  const isDisabled = element => {\n    if (!element || element.nodeType !== Node.ELEMENT_NODE) {\n      return true;\n    }\n    if (element.classList.contains('disabled')) {\n      return true;\n    }\n    if (typeof element.disabled !== 'undefined') {\n      return element.disabled;\n    }\n    return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false';\n  };\n  const findShadowRoot = element => {\n    if (!document.documentElement.attachShadow) {\n      return null;\n    }\n\n    // Can find the shadow root otherwise it'll return the document\n    if (typeof element.getRootNode === 'function') {\n      const root = element.getRootNode();\n      return root instanceof ShadowRoot ? root : null;\n    }\n    if (element instanceof ShadowRoot) {\n      return element;\n    }\n\n    // when we don't find a shadow root\n    if (!element.parentNode) {\n      return null;\n    }\n    return findShadowRoot(element.parentNode);\n  };\n  const noop = () => {};\n\n  /**\n   * Trick to restart an element's animation\n   *\n   * @param {HTMLElement} element\n   * @return void\n   *\n   * @see https://www.harrytheo.com/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation\n   */\n  const reflow = element => {\n    element.offsetHeight; // eslint-disable-line no-unused-expressions\n  };\n  const getjQuery = () => {\n    if (window.jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {\n      return window.jQuery;\n    }\n    return null;\n  };\n  const DOMContentLoadedCallbacks = [];\n  const onDOMContentLoaded = callback => {\n    if (document.readyState === 'loading') {\n      // add listener on the first call when the document is in loading state\n      if (!DOMContentLoadedCallbacks.length) {\n        document.addEventListener('DOMContentLoaded', () => {\n          for (const callback of DOMContentLoadedCallbacks) {\n            callback();\n          }\n        });\n      }\n      DOMContentLoadedCallbacks.push(callback);\n    } else {\n      callback();\n    }\n  };\n  const isRTL = () => document.documentElement.dir === 'rtl';\n  const defineJQueryPlugin = plugin => {\n    onDOMContentLoaded(() => {\n      const $ = getjQuery();\n      /* istanbul ignore if */\n      if ($) {\n        const name = plugin.NAME;\n        const JQUERY_NO_CONFLICT = $.fn[name];\n        $.fn[name] = plugin.jQueryInterface;\n        $.fn[name].Constructor = plugin;\n        $.fn[name].noConflict = () => {\n          $.fn[name] = JQUERY_NO_CONFLICT;\n          return plugin.jQueryInterface;\n        };\n      }\n    });\n  };\n  const execute = (possibleCallback, args = [], defaultValue = possibleCallback) => {\n    return typeof possibleCallback === 'function' ? possibleCallback.call(...args) : defaultValue;\n  };\n  const executeAfterTransition = (callback, transitionElement, waitForTransition = true) => {\n    if (!waitForTransition) {\n      execute(callback);\n      return;\n    }\n    const durationPadding = 5;\n    const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding;\n    let called = false;\n    const handler = ({\n      target\n    }) => {\n      if (target !== transitionElement) {\n        return;\n      }\n      called = true;\n      transitionElement.removeEventListener(TRANSITION_END, handler);\n      execute(callback);\n    };\n    transitionElement.addEventListener(TRANSITION_END, handler);\n    setTimeout(() => {\n      if (!called) {\n        triggerTransitionEnd(transitionElement);\n      }\n    }, emulatedDuration);\n  };\n\n  /**\n   * Return the previous/next element of a list.\n   *\n   * @param {array} list    The list of elements\n   * @param activeElement   The active element\n   * @param shouldGetNext   Choose to get next or previous element\n   * @param isCycleAllowed\n   * @return {Element|elem} The proper element\n   */\n  const getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => {\n    const listLength = list.length;\n    let index = list.indexOf(activeElement);\n\n    // if the element does not exist in the list return an element\n    // depending on the direction and if cycle is allowed\n    if (index === -1) {\n      return !shouldGetNext && isCycleAllowed ? list[listLength - 1] : list[0];\n    }\n    index += shouldGetNext ? 1 : -1;\n    if (isCycleAllowed) {\n      index = (index + listLength) % listLength;\n    }\n    return list[Math.max(0, Math.min(index, listLength - 1))];\n  };\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap dom/event-handler.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n\n  /**\n   * Constants\n   */\n\n  const namespaceRegex = /[^.]*(?=\\..*)\\.|.*/;\n  const stripNameRegex = /\\..*/;\n  const stripUidRegex = /::\\d+$/;\n  const eventRegistry = {}; // Events storage\n  let uidEvent = 1;\n  const customEvents = {\n    mouseenter: 'mouseover',\n    mouseleave: 'mouseout'\n  };\n  const nativeEvents = new Set(['click', 'dblclick', 'mouseup', 'mousedown', 'contextmenu', 'mousewheel', 'DOMMouseScroll', 'mouseover', 'mouseout', 'mousemove', 'selectstart', 'selectend', 'keydown', 'keypress', 'keyup', 'orientationchange', 'touchstart', 'touchmove', 'touchend', 'touchcancel', 'pointerdown', 'pointermove', 'pointerup', 'pointerleave', 'pointercancel', 'gesturestart', 'gesturechange', 'gestureend', 'focus', 'blur', 'change', 'reset', 'select', 'submit', 'focusin', 'focusout', 'load', 'unload', 'beforeunload', 'resize', 'move', 'DOMContentLoaded', 'readystatechange', 'error', 'abort', 'scroll']);\n\n  /**\n   * Private methods\n   */\n\n  function makeEventUid(element, uid) {\n    return uid && `${uid}::${uidEvent++}` || element.uidEvent || uidEvent++;\n  }\n  function getElementEvents(element) {\n    const uid = makeEventUid(element);\n    element.uidEvent = uid;\n    eventRegistry[uid] = eventRegistry[uid] || {};\n    return eventRegistry[uid];\n  }\n  function bootstrapHandler(element, fn) {\n    return function handler(event) {\n      hydrateObj(event, {\n        delegateTarget: element\n      });\n      if (handler.oneOff) {\n        EventHandler.off(element, event.type, fn);\n      }\n      return fn.apply(element, [event]);\n    };\n  }\n  function bootstrapDelegationHandler(element, selector, fn) {\n    return function handler(event) {\n      const domElements = element.querySelectorAll(selector);\n      for (let {\n        target\n      } = event; target && target !== this; target = target.parentNode) {\n        for (const domElement of domElements) {\n          if (domElement !== target) {\n            continue;\n          }\n          hydrateObj(event, {\n            delegateTarget: target\n          });\n          if (handler.oneOff) {\n            EventHandler.off(element, event.type, selector, fn);\n          }\n          return fn.apply(target, [event]);\n        }\n      }\n    };\n  }\n  function findHandler(events, callable, delegationSelector = null) {\n    return Object.values(events).find(event => event.callable === callable && event.delegationSelector === delegationSelector);\n  }\n  function normalizeParameters(originalTypeEvent, handler, delegationFunction) {\n    const isDelegated = typeof handler === 'string';\n    // TODO: tooltip passes `false` instead of selector, so we need to check\n    const callable = isDelegated ? delegationFunction : handler || delegationFunction;\n    let typeEvent = getTypeEvent(originalTypeEvent);\n    if (!nativeEvents.has(typeEvent)) {\n      typeEvent = originalTypeEvent;\n    }\n    return [isDelegated, callable, typeEvent];\n  }\n  function addHandler(element, originalTypeEvent, handler, delegationFunction, oneOff) {\n    if (typeof originalTypeEvent !== 'string' || !element) {\n      return;\n    }\n    let [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction);\n\n    // in case of mouseenter or mouseleave wrap the handler within a function that checks for its DOM position\n    // this prevents the handler from being dispatched the same way as mouseover or mouseout does\n    if (originalTypeEvent in customEvents) {\n      const wrapFunction = fn => {\n        return function (event) {\n          if (!event.relatedTarget || event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget)) {\n            return fn.call(this, event);\n          }\n        };\n      };\n      callable = wrapFunction(callable);\n    }\n    const events = getElementEvents(element);\n    const handlers = events[typeEvent] || (events[typeEvent] = {});\n    const previousFunction = findHandler(handlers, callable, isDelegated ? handler : null);\n    if (previousFunction) {\n      previousFunction.oneOff = previousFunction.oneOff && oneOff;\n      return;\n    }\n    const uid = makeEventUid(callable, originalTypeEvent.replace(namespaceRegex, ''));\n    const fn = isDelegated ? bootstrapDelegationHandler(element, handler, callable) : bootstrapHandler(element, callable);\n    fn.delegationSelector = isDelegated ? handler : null;\n    fn.callable = callable;\n    fn.oneOff = oneOff;\n    fn.uidEvent = uid;\n    handlers[uid] = fn;\n    element.addEventListener(typeEvent, fn, isDelegated);\n  }\n  function removeHandler(element, events, typeEvent, handler, delegationSelector) {\n    const fn = findHandler(events[typeEvent], handler, delegationSelector);\n    if (!fn) {\n      return;\n    }\n    element.removeEventListener(typeEvent, fn, Boolean(delegationSelector));\n    delete events[typeEvent][fn.uidEvent];\n  }\n  function removeNamespacedHandlers(element, events, typeEvent, namespace) {\n    const storeElementEvent = events[typeEvent] || {};\n    for (const [handlerKey, event] of Object.entries(storeElementEvent)) {\n      if (handlerKey.includes(namespace)) {\n        removeHandler(element, events, typeEvent, event.callable, event.delegationSelector);\n      }\n    }\n  }\n  function getTypeEvent(event) {\n    // allow to get the native events from namespaced events ('click.bs.button' --> 'click')\n    event = event.replace(stripNameRegex, '');\n    return customEvents[event] || event;\n  }\n  const EventHandler = {\n    on(element, event, handler, delegationFunction) {\n      addHandler(element, event, handler, delegationFunction, false);\n    },\n    one(element, event, handler, delegationFunction) {\n      addHandler(element, event, handler, delegationFunction, true);\n    },\n    off(element, originalTypeEvent, handler, delegationFunction) {\n      if (typeof originalTypeEvent !== 'string' || !element) {\n        return;\n      }\n      const [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction);\n      const inNamespace = typeEvent !== originalTypeEvent;\n      const events = getElementEvents(element);\n      const storeElementEvent = events[typeEvent] || {};\n      const isNamespace = originalTypeEvent.startsWith('.');\n      if (typeof callable !== 'undefined') {\n        // Simplest case: handler is passed, remove that listener ONLY.\n        if (!Object.keys(storeElementEvent).length) {\n          return;\n        }\n        removeHandler(element, events, typeEvent, callable, isDelegated ? handler : null);\n        return;\n      }\n      if (isNamespace) {\n        for (const elementEvent of Object.keys(events)) {\n          removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1));\n        }\n      }\n      for (const [keyHandlers, event] of Object.entries(storeElementEvent)) {\n        const handlerKey = keyHandlers.replace(stripUidRegex, '');\n        if (!inNamespace || originalTypeEvent.includes(handlerKey)) {\n          removeHandler(element, events, typeEvent, event.callable, event.delegationSelector);\n        }\n      }\n    },\n    trigger(element, event, args) {\n      if (typeof event !== 'string' || !element) {\n        return null;\n      }\n      const $ = getjQuery();\n      const typeEvent = getTypeEvent(event);\n      const inNamespace = event !== typeEvent;\n      let jQueryEvent = null;\n      let bubbles = true;\n      let nativeDispatch = true;\n      let defaultPrevented = false;\n      if (inNamespace && $) {\n        jQueryEvent = $.Event(event, args);\n        $(element).trigger(jQueryEvent);\n        bubbles = !jQueryEvent.isPropagationStopped();\n        nativeDispatch = !jQueryEvent.isImmediatePropagationStopped();\n        defaultPrevented = jQueryEvent.isDefaultPrevented();\n      }\n      const evt = hydrateObj(new Event(event, {\n        bubbles,\n        cancelable: true\n      }), args);\n      if (defaultPrevented) {\n        evt.preventDefault();\n      }\n      if (nativeDispatch) {\n        element.dispatchEvent(evt);\n      }\n      if (evt.defaultPrevented && jQueryEvent) {\n        jQueryEvent.preventDefault();\n      }\n      return evt;\n    }\n  };\n  function hydrateObj(obj, meta = {}) {\n    for (const [key, value] of Object.entries(meta)) {\n      try {\n        obj[key] = value;\n      } catch (_unused) {\n        Object.defineProperty(obj, key, {\n          configurable: true,\n          get() {\n            return value;\n          }\n        });\n      }\n    }\n    return obj;\n  }\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap dom/manipulator.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n  function normalizeData(value) {\n    if (value === 'true') {\n      return true;\n    }\n    if (value === 'false') {\n      return false;\n    }\n    if (value === Number(value).toString()) {\n      return Number(value);\n    }\n    if (value === '' || value === 'null') {\n      return null;\n    }\n    if (typeof value !== 'string') {\n      return value;\n    }\n    try {\n      return JSON.parse(decodeURIComponent(value));\n    } catch (_unused) {\n      return value;\n    }\n  }\n  function normalizeDataKey(key) {\n    return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`);\n  }\n  const Manipulator = {\n    setDataAttribute(element, key, value) {\n      element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value);\n    },\n    removeDataAttribute(element, key) {\n      element.removeAttribute(`data-bs-${normalizeDataKey(key)}`);\n    },\n    getDataAttributes(element) {\n      if (!element) {\n        return {};\n      }\n      const attributes = {};\n      const bsKeys = Object.keys(element.dataset).filter(key => key.startsWith('bs') && !key.startsWith('bsConfig'));\n      for (const key of bsKeys) {\n        let pureKey = key.replace(/^bs/, '');\n        pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1);\n        attributes[pureKey] = normalizeData(element.dataset[key]);\n      }\n      return attributes;\n    },\n    getDataAttribute(element, key) {\n      return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`));\n    }\n  };\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap util/config.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n\n  /**\n   * Class definition\n   */\n\n  class Config {\n    // Getters\n    static get Default() {\n      return {};\n    }\n    static get DefaultType() {\n      return {};\n    }\n    static get NAME() {\n      throw new Error('You have to implement the static method \"NAME\", for each component!');\n    }\n    _getConfig(config) {\n      config = this._mergeConfigObj(config);\n      config = this._configAfterMerge(config);\n      this._typeCheckConfig(config);\n      return config;\n    }\n    _configAfterMerge(config) {\n      return config;\n    }\n    _mergeConfigObj(config, element) {\n      const jsonConfig = isElement$1(element) ? Manipulator.getDataAttribute(element, 'config') : {}; // try to parse\n\n      return {\n        ...this.constructor.Default,\n        ...(typeof jsonConfig === 'object' ? jsonConfig : {}),\n        ...(isElement$1(element) ? Manipulator.getDataAttributes(element) : {}),\n        ...(typeof config === 'object' ? config : {})\n      };\n    }\n    _typeCheckConfig(config, configTypes = this.constructor.DefaultType) {\n      for (const [property, expectedTypes] of Object.entries(configTypes)) {\n        const value = config[property];\n        const valueType = isElement$1(value) ? 'element' : toType(value);\n        if (!new RegExp(expectedTypes).test(valueType)) {\n          throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option \"${property}\" provided type \"${valueType}\" but expected type \"${expectedTypes}\".`);\n        }\n      }\n    }\n  }\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap base-component.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n\n  /**\n   * Constants\n   */\n\n  const VERSION = '5.3.8';\n\n  /**\n   * Class definition\n   */\n\n  class BaseComponent extends Config {\n    constructor(element, config) {\n      super();\n      element = getElement(element);\n      if (!element) {\n        return;\n      }\n      this._element = element;\n      this._config = this._getConfig(config);\n      Data.set(this._element, this.constructor.DATA_KEY, this);\n    }\n\n    // Public\n    dispose() {\n      Data.remove(this._element, this.constructor.DATA_KEY);\n      EventHandler.off(this._element, this.constructor.EVENT_KEY);\n      for (const propertyName of Object.getOwnPropertyNames(this)) {\n        this[propertyName] = null;\n      }\n    }\n\n    // Private\n    _queueCallback(callback, element, isAnimated = true) {\n      executeAfterTransition(callback, element, isAnimated);\n    }\n    _getConfig(config) {\n      config = this._mergeConfigObj(config, this._element);\n      config = this._configAfterMerge(config);\n      this._typeCheckConfig(config);\n      return config;\n    }\n\n    // Static\n    static getInstance(element) {\n      return Data.get(getElement(element), this.DATA_KEY);\n    }\n    static getOrCreateInstance(element, config = {}) {\n      return this.getInstance(element) || new this(element, typeof config === 'object' ? config : null);\n    }\n    static get VERSION() {\n      return VERSION;\n    }\n    static get DATA_KEY() {\n      return `bs.${this.NAME}`;\n    }\n    static get EVENT_KEY() {\n      return `.${this.DATA_KEY}`;\n    }\n    static eventName(name) {\n      return `${name}${this.EVENT_KEY}`;\n    }\n  }\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap dom/selector-engine.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n  const getSelector = element => {\n    let selector = element.getAttribute('data-bs-target');\n    if (!selector || selector === '#') {\n      let hrefAttribute = element.getAttribute('href');\n\n      // The only valid content that could double as a selector are IDs or classes,\n      // so everything starting with `#` or `.`. If a \"real\" URL is used as the selector,\n      // `document.querySelector` will rightfully complain it is invalid.\n      // See https://github.com/twbs/bootstrap/issues/32273\n      if (!hrefAttribute || !hrefAttribute.includes('#') && !hrefAttribute.startsWith('.')) {\n        return null;\n      }\n\n      // Just in case some CMS puts out a full URL with the anchor appended\n      if (hrefAttribute.includes('#') && !hrefAttribute.startsWith('#')) {\n        hrefAttribute = `#${hrefAttribute.split('#')[1]}`;\n      }\n      selector = hrefAttribute && hrefAttribute !== '#' ? hrefAttribute.trim() : null;\n    }\n    return selector ? selector.split(',').map(sel => parseSelector(sel)).join(',') : null;\n  };\n  const SelectorEngine = {\n    find(selector, element = document.documentElement) {\n      return [].concat(...Element.prototype.querySelectorAll.call(element, selector));\n    },\n    findOne(selector, element = document.documentElement) {\n      return Element.prototype.querySelector.call(element, selector);\n    },\n    children(element, selector) {\n      return [].concat(...element.children).filter(child => child.matches(selector));\n    },\n    parents(element, selector) {\n      const parents = [];\n      let ancestor = element.parentNode.closest(selector);\n      while (ancestor) {\n        parents.push(ancestor);\n        ancestor = ancestor.parentNode.closest(selector);\n      }\n      return parents;\n    },\n    prev(element, selector) {\n      let previous = element.previousElementSibling;\n      while (previous) {\n        if (previous.matches(selector)) {\n          return [previous];\n        }\n        previous = previous.previousElementSibling;\n      }\n      return [];\n    },\n    // TODO: this is now unused; remove later along with prev()\n    next(element, selector) {\n      let next = element.nextElementSibling;\n      while (next) {\n        if (next.matches(selector)) {\n          return [next];\n        }\n        next = next.nextElementSibling;\n      }\n      return [];\n    },\n    focusableChildren(element) {\n      const focusables = ['a', 'button', 'input', 'textarea', 'select', 'details', '[tabindex]', '[contenteditable=\"true\"]'].map(selector => `${selector}:not([tabindex^=\"-\"])`).join(',');\n      return this.find(focusables, element).filter(el => !isDisabled(el) && isVisible(el));\n    },\n    getSelectorFromElement(element) {\n      const selector = getSelector(element);\n      if (selector) {\n        return SelectorEngine.findOne(selector) ? selector : null;\n      }\n      return null;\n    },\n    getElementFromSelector(element) {\n      const selector = getSelector(element);\n      return selector ? SelectorEngine.findOne(selector) : null;\n    },\n    getMultipleElementsFromSelector(element) {\n      const selector = getSelector(element);\n      return selector ? SelectorEngine.find(selector) : [];\n    }\n  };\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap util/component-functions.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n  const enableDismissTrigger = (component, method = 'hide') => {\n    const clickEvent = `click.dismiss${component.EVENT_KEY}`;\n    const name = component.NAME;\n    EventHandler.on(document, clickEvent, `[data-bs-dismiss=\"${name}\"]`, function (event) {\n      if (['A', 'AREA'].includes(this.tagName)) {\n        event.preventDefault();\n      }\n      if (isDisabled(this)) {\n        return;\n      }\n      const target = SelectorEngine.getElementFromSelector(this) || this.closest(`.${name}`);\n      const instance = component.getOrCreateInstance(target);\n\n      // Method argument is left, for Alert and only, as it doesn't implement the 'hide' method\n      instance[method]();\n    });\n  };\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap alert.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n\n  /**\n   * Constants\n   */\n\n  const NAME$f = 'alert';\n  const DATA_KEY$a = 'bs.alert';\n  const EVENT_KEY$b = `.${DATA_KEY$a}`;\n  const EVENT_CLOSE = `close${EVENT_KEY$b}`;\n  const EVENT_CLOSED = `closed${EVENT_KEY$b}`;\n  const CLASS_NAME_FADE$5 = 'fade';\n  const CLASS_NAME_SHOW$8 = 'show';\n\n  /**\n   * Class definition\n   */\n\n  class Alert extends BaseComponent {\n    // Getters\n    static get NAME() {\n      return NAME$f;\n    }\n\n    // Public\n    close() {\n      const closeEvent = EventHandler.trigger(this._element, EVENT_CLOSE);\n      if (closeEvent.defaultPrevented) {\n        return;\n      }\n      this._element.classList.remove(CLASS_NAME_SHOW$8);\n      const isAnimated = this._element.classList.contains(CLASS_NAME_FADE$5);\n      this._queueCallback(() => this._destroyElement(), this._element, isAnimated);\n    }\n\n    // Private\n    _destroyElement() {\n      this._element.remove();\n      EventHandler.trigger(this._element, EVENT_CLOSED);\n      this.dispose();\n    }\n\n    // Static\n    static jQueryInterface(config) {\n      return this.each(function () {\n        const data = Alert.getOrCreateInstance(this);\n        if (typeof config !== 'string') {\n          return;\n        }\n        if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n          throw new TypeError(`No method named \"${config}\"`);\n        }\n        data[config](this);\n      });\n    }\n  }\n\n  /**\n   * Data API implementation\n   */\n\n  enableDismissTrigger(Alert, 'close');\n\n  /**\n   * jQuery\n   */\n\n  defineJQueryPlugin(Alert);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap button.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n\n  /**\n   * Constants\n   */\n\n  const NAME$e = 'button';\n  const DATA_KEY$9 = 'bs.button';\n  const EVENT_KEY$a = `.${DATA_KEY$9}`;\n  const DATA_API_KEY$6 = '.data-api';\n  const CLASS_NAME_ACTIVE$3 = 'active';\n  const SELECTOR_DATA_TOGGLE$5 = '[data-bs-toggle=\"button\"]';\n  const EVENT_CLICK_DATA_API$6 = `click${EVENT_KEY$a}${DATA_API_KEY$6}`;\n\n  /**\n   * Class definition\n   */\n\n  class Button extends BaseComponent {\n    // Getters\n    static get NAME() {\n      return NAME$e;\n    }\n\n    // Public\n    toggle() {\n      // Toggle class and sync the `aria-pressed` attribute with the return value of the `.toggle()` method\n      this._element.setAttribute('aria-pressed', this._element.classList.toggle(CLASS_NAME_ACTIVE$3));\n    }\n\n    // Static\n    static jQueryInterface(config) {\n      return this.each(function () {\n        const data = Button.getOrCreateInstance(this);\n        if (config === 'toggle') {\n          data[config]();\n        }\n      });\n    }\n  }\n\n  /**\n   * Data API implementation\n   */\n\n  EventHandler.on(document, EVENT_CLICK_DATA_API$6, SELECTOR_DATA_TOGGLE$5, event => {\n    event.preventDefault();\n    const button = event.target.closest(SELECTOR_DATA_TOGGLE$5);\n    const data = Button.getOrCreateInstance(button);\n    data.toggle();\n  });\n\n  /**\n   * jQuery\n   */\n\n  defineJQueryPlugin(Button);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap util/swipe.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n\n  /**\n   * Constants\n   */\n\n  const NAME$d = 'swipe';\n  const EVENT_KEY$9 = '.bs.swipe';\n  const EVENT_TOUCHSTART = `touchstart${EVENT_KEY$9}`;\n  const EVENT_TOUCHMOVE = `touchmove${EVENT_KEY$9}`;\n  const EVENT_TOUCHEND = `touchend${EVENT_KEY$9}`;\n  const EVENT_POINTERDOWN = `pointerdown${EVENT_KEY$9}`;\n  const EVENT_POINTERUP = `pointerup${EVENT_KEY$9}`;\n  const POINTER_TYPE_TOUCH = 'touch';\n  const POINTER_TYPE_PEN = 'pen';\n  const CLASS_NAME_POINTER_EVENT = 'pointer-event';\n  const SWIPE_THRESHOLD = 40;\n  const Default$c = {\n    endCallback: null,\n    leftCallback: null,\n    rightCallback: null\n  };\n  const DefaultType$c = {\n    endCallback: '(function|null)',\n    leftCallback: '(function|null)',\n    rightCallback: '(function|null)'\n  };\n\n  /**\n   * Class definition\n   */\n\n  class Swipe extends Config {\n    constructor(element, config) {\n      super();\n      this._element = element;\n      if (!element || !Swipe.isSupported()) {\n        return;\n      }\n      this._config = this._getConfig(config);\n      this._deltaX = 0;\n      this._supportPointerEvents = Boolean(window.PointerEvent);\n      this._initEvents();\n    }\n\n    // Getters\n    static get Default() {\n      return Default$c;\n    }\n    static get DefaultType() {\n      return DefaultType$c;\n    }\n    static get NAME() {\n      return NAME$d;\n    }\n\n    // Public\n    dispose() {\n      EventHandler.off(this._element, EVENT_KEY$9);\n    }\n\n    // Private\n    _start(event) {\n      if (!this._supportPointerEvents) {\n        this._deltaX = event.touches[0].clientX;\n        return;\n      }\n      if (this._eventIsPointerPenTouch(event)) {\n        this._deltaX = event.clientX;\n      }\n    }\n    _end(event) {\n      if (this._eventIsPointerPenTouch(event)) {\n        this._deltaX = event.clientX - this._deltaX;\n      }\n      this._handleSwipe();\n      execute(this._config.endCallback);\n    }\n    _move(event) {\n      this._deltaX = event.touches && event.touches.length > 1 ? 0 : event.touches[0].clientX - this._deltaX;\n    }\n    _handleSwipe() {\n      const absDeltaX = Math.abs(this._deltaX);\n      if (absDeltaX <= SWIPE_THRESHOLD) {\n        return;\n      }\n      const direction = absDeltaX / this._deltaX;\n      this._deltaX = 0;\n      if (!direction) {\n        return;\n      }\n      execute(direction > 0 ? this._config.rightCallback : this._config.leftCallback);\n    }\n    _initEvents() {\n      if (this._supportPointerEvents) {\n        EventHandler.on(this._element, EVENT_POINTERDOWN, event => this._start(event));\n        EventHandler.on(this._element, EVENT_POINTERUP, event => this._end(event));\n        this._element.classList.add(CLASS_NAME_POINTER_EVENT);\n      } else {\n        EventHandler.on(this._element, EVENT_TOUCHSTART, event => this._start(event));\n        EventHandler.on(this._element, EVENT_TOUCHMOVE, event => this._move(event));\n        EventHandler.on(this._element, EVENT_TOUCHEND, event => this._end(event));\n      }\n    }\n    _eventIsPointerPenTouch(event) {\n      return this._supportPointerEvents && (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH);\n    }\n\n    // Static\n    static isSupported() {\n      return 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0;\n    }\n  }\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap carousel.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n\n  /**\n   * Constants\n   */\n\n  const NAME$c = 'carousel';\n  const DATA_KEY$8 = 'bs.carousel';\n  const EVENT_KEY$8 = `.${DATA_KEY$8}`;\n  const DATA_API_KEY$5 = '.data-api';\n  const ARROW_LEFT_KEY$1 = 'ArrowLeft';\n  const ARROW_RIGHT_KEY$1 = 'ArrowRight';\n  const TOUCHEVENT_COMPAT_WAIT = 500; // Time for mouse compat events to fire after touch\n\n  const ORDER_NEXT = 'next';\n  const ORDER_PREV = 'prev';\n  const DIRECTION_LEFT = 'left';\n  const DIRECTION_RIGHT = 'right';\n  const EVENT_SLIDE = `slide${EVENT_KEY$8}`;\n  const EVENT_SLID = `slid${EVENT_KEY$8}`;\n  const EVENT_KEYDOWN$1 = `keydown${EVENT_KEY$8}`;\n  const EVENT_MOUSEENTER$1 = `mouseenter${EVENT_KEY$8}`;\n  const EVENT_MOUSELEAVE$1 = `mouseleave${EVENT_KEY$8}`;\n  const EVENT_DRAG_START = `dragstart${EVENT_KEY$8}`;\n  const EVENT_LOAD_DATA_API$3 = `load${EVENT_KEY$8}${DATA_API_KEY$5}`;\n  const EVENT_CLICK_DATA_API$5 = `click${EVENT_KEY$8}${DATA_API_KEY$5}`;\n  const CLASS_NAME_CAROUSEL = 'carousel';\n  const CLASS_NAME_ACTIVE$2 = 'active';\n  const CLASS_NAME_SLIDE = 'slide';\n  const CLASS_NAME_END = 'carousel-item-end';\n  const CLASS_NAME_START = 'carousel-item-start';\n  const CLASS_NAME_NEXT = 'carousel-item-next';\n  const CLASS_NAME_PREV = 'carousel-item-prev';\n  const SELECTOR_ACTIVE = '.active';\n  const SELECTOR_ITEM = '.carousel-item';\n  const SELECTOR_ACTIVE_ITEM = SELECTOR_ACTIVE + SELECTOR_ITEM;\n  const SELECTOR_ITEM_IMG = '.carousel-item img';\n  const SELECTOR_INDICATORS = '.carousel-indicators';\n  const SELECTOR_DATA_SLIDE = '[data-bs-slide], [data-bs-slide-to]';\n  const SELECTOR_DATA_RIDE = '[data-bs-ride=\"carousel\"]';\n  const KEY_TO_DIRECTION = {\n    [ARROW_LEFT_KEY$1]: DIRECTION_RIGHT,\n    [ARROW_RIGHT_KEY$1]: DIRECTION_LEFT\n  };\n  const Default$b = {\n    interval: 5000,\n    keyboard: true,\n    pause: 'hover',\n    ride: false,\n    touch: true,\n    wrap: true\n  };\n  const DefaultType$b = {\n    interval: '(number|boolean)',\n    // TODO:v6 remove boolean support\n    keyboard: 'boolean',\n    pause: '(string|boolean)',\n    ride: '(boolean|string)',\n    touch: 'boolean',\n    wrap: 'boolean'\n  };\n\n  /**\n   * Class definition\n   */\n\n  class Carousel extends BaseComponent {\n    constructor(element, config) {\n      super(element, config);\n      this._interval = null;\n      this._activeElement = null;\n      this._isSliding = false;\n      this.touchTimeout = null;\n      this._swipeHelper = null;\n      this._indicatorsElement = SelectorEngine.findOne(SELECTOR_INDICATORS, this._element);\n      this._addEventListeners();\n      if (this._config.ride === CLASS_NAME_CAROUSEL) {\n        this.cycle();\n      }\n    }\n\n    // Getters\n    static get Default() {\n      return Default$b;\n    }\n    static get DefaultType() {\n      return DefaultType$b;\n    }\n    static get NAME() {\n      return NAME$c;\n    }\n\n    // Public\n    next() {\n      this._slide(ORDER_NEXT);\n    }\n    nextWhenVisible() {\n      // FIXME TODO use `document.visibilityState`\n      // Don't call next when the page isn't visible\n      // or the carousel or its parent isn't visible\n      if (!document.hidden && isVisible(this._element)) {\n        this.next();\n      }\n    }\n    prev() {\n      this._slide(ORDER_PREV);\n    }\n    pause() {\n      if (this._isSliding) {\n        triggerTransitionEnd(this._element);\n      }\n      this._clearInterval();\n    }\n    cycle() {\n      this._clearInterval();\n      this._updateInterval();\n      this._interval = setInterval(() => this.nextWhenVisible(), this._config.interval);\n    }\n    _maybeEnableCycle() {\n      if (!this._config.ride) {\n        return;\n      }\n      if (this._isSliding) {\n        EventHandler.one(this._element, EVENT_SLID, () => this.cycle());\n        return;\n      }\n      this.cycle();\n    }\n    to(index) {\n      const items = this._getItems();\n      if (index > items.length - 1 || index < 0) {\n        return;\n      }\n      if (this._isSliding) {\n        EventHandler.one(this._element, EVENT_SLID, () => this.to(index));\n        return;\n      }\n      const activeIndex = this._getItemIndex(this._getActive());\n      if (activeIndex === index) {\n        return;\n      }\n      const order = index > activeIndex ? ORDER_NEXT : ORDER_PREV;\n      this._slide(order, items[index]);\n    }\n    dispose() {\n      if (this._swipeHelper) {\n        this._swipeHelper.dispose();\n      }\n      super.dispose();\n    }\n\n    // Private\n    _configAfterMerge(config) {\n      config.defaultInterval = config.interval;\n      return config;\n    }\n    _addEventListeners() {\n      if (this._config.keyboard) {\n        EventHandler.on(this._element, EVENT_KEYDOWN$1, event => this._keydown(event));\n      }\n      if (this._config.pause === 'hover') {\n        EventHandler.on(this._element, EVENT_MOUSEENTER$1, () => this.pause());\n        EventHandler.on(this._element, EVENT_MOUSELEAVE$1, () => this._maybeEnableCycle());\n      }\n      if (this._config.touch && Swipe.isSupported()) {\n        this._addTouchEventListeners();\n      }\n    }\n    _addTouchEventListeners() {\n      for (const img of SelectorEngine.find(SELECTOR_ITEM_IMG, this._element)) {\n        EventHandler.on(img, EVENT_DRAG_START, event => event.preventDefault());\n      }\n      const endCallBack = () => {\n        if (this._config.pause !== 'hover') {\n          return;\n        }\n\n        // If it's a touch-enabled device, mouseenter/leave are fired as\n        // part of the mouse compatibility events on first tap - the carousel\n        // would stop cycling until user tapped out of it;\n        // here, we listen for touchend, explicitly pause the carousel\n        // (as if it's the second time we tap on it, mouseenter compat event\n        // is NOT fired) and after a timeout (to allow for mouse compatibility\n        // events to fire) we explicitly restart cycling\n\n        this.pause();\n        if (this.touchTimeout) {\n          clearTimeout(this.touchTimeout);\n        }\n        this.touchTimeout = setTimeout(() => this._maybeEnableCycle(), TOUCHEVENT_COMPAT_WAIT + this._config.interval);\n      };\n      const swipeConfig = {\n        leftCallback: () => this._slide(this._directionToOrder(DIRECTION_LEFT)),\n        rightCallback: () => this._slide(this._directionToOrder(DIRECTION_RIGHT)),\n        endCallback: endCallBack\n      };\n      this._swipeHelper = new Swipe(this._element, swipeConfig);\n    }\n    _keydown(event) {\n      if (/input|textarea/i.test(event.target.tagName)) {\n        return;\n      }\n      const direction = KEY_TO_DIRECTION[event.key];\n      if (direction) {\n        event.preventDefault();\n        this._slide(this._directionToOrder(direction));\n      }\n    }\n    _getItemIndex(element) {\n      return this._getItems().indexOf(element);\n    }\n    _setActiveIndicatorElement(index) {\n      if (!this._indicatorsElement) {\n        return;\n      }\n      const activeIndicator = SelectorEngine.findOne(SELECTOR_ACTIVE, this._indicatorsElement);\n      activeIndicator.classList.remove(CLASS_NAME_ACTIVE$2);\n      activeIndicator.removeAttribute('aria-current');\n      const newActiveIndicator = SelectorEngine.findOne(`[data-bs-slide-to=\"${index}\"]`, this._indicatorsElement);\n      if (newActiveIndicator) {\n        newActiveIndicator.classList.add(CLASS_NAME_ACTIVE$2);\n        newActiveIndicator.setAttribute('aria-current', 'true');\n      }\n    }\n    _updateInterval() {\n      const element = this._activeElement || this._getActive();\n      if (!element) {\n        return;\n      }\n      const elementInterval = Number.parseInt(element.getAttribute('data-bs-interval'), 10);\n      this._config.interval = elementInterval || this._config.defaultInterval;\n    }\n    _slide(order, element = null) {\n      if (this._isSliding) {\n        return;\n      }\n      const activeElement = this._getActive();\n      const isNext = order === ORDER_NEXT;\n      const nextElement = element || getNextActiveElement(this._getItems(), activeElement, isNext, this._config.wrap);\n      if (nextElement === activeElement) {\n        return;\n      }\n      const nextElementIndex = this._getItemIndex(nextElement);\n      const triggerEvent = eventName => {\n        return EventHandler.trigger(this._element, eventName, {\n          relatedTarget: nextElement,\n          direction: this._orderToDirection(order),\n          from: this._getItemIndex(activeElement),\n          to: nextElementIndex\n        });\n      };\n      const slideEvent = triggerEvent(EVENT_SLIDE);\n      if (slideEvent.defaultPrevented) {\n        return;\n      }\n      if (!activeElement || !nextElement) {\n        // Some weirdness is happening, so we bail\n        // TODO: change tests that use empty divs to avoid this check\n        return;\n      }\n      const isCycling = Boolean(this._interval);\n      this.pause();\n      this._isSliding = true;\n      this._setActiveIndicatorElement(nextElementIndex);\n      this._activeElement = nextElement;\n      const directionalClassName = isNext ? CLASS_NAME_START : CLASS_NAME_END;\n      const orderClassName = isNext ? CLASS_NAME_NEXT : CLASS_NAME_PREV;\n      nextElement.classList.add(orderClassName);\n      reflow(nextElement);\n      activeElement.classList.add(directionalClassName);\n      nextElement.classList.add(directionalClassName);\n      const completeCallBack = () => {\n        nextElement.classList.remove(directionalClassName, orderClassName);\n        nextElement.classList.add(CLASS_NAME_ACTIVE$2);\n        activeElement.classList.remove(CLASS_NAME_ACTIVE$2, orderClassName, directionalClassName);\n        this._isSliding = false;\n        triggerEvent(EVENT_SLID);\n      };\n      this._queueCallback(completeCallBack, activeElement, this._isAnimated());\n      if (isCycling) {\n        this.cycle();\n      }\n    }\n    _isAnimated() {\n      return this._element.classList.contains(CLASS_NAME_SLIDE);\n    }\n    _getActive() {\n      return SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element);\n    }\n    _getItems() {\n      return SelectorEngine.find(SELECTOR_ITEM, this._element);\n    }\n    _clearInterval() {\n      if (this._interval) {\n        clearInterval(this._interval);\n        this._interval = null;\n      }\n    }\n    _directionToOrder(direction) {\n      if (isRTL()) {\n        return direction === DIRECTION_LEFT ? ORDER_PREV : ORDER_NEXT;\n      }\n      return direction === DIRECTION_LEFT ? ORDER_NEXT : ORDER_PREV;\n    }\n    _orderToDirection(order) {\n      if (isRTL()) {\n        return order === ORDER_PREV ? DIRECTION_LEFT : DIRECTION_RIGHT;\n      }\n      return order === ORDER_PREV ? DIRECTION_RIGHT : DIRECTION_LEFT;\n    }\n\n    // Static\n    static jQueryInterface(config) {\n      return this.each(function () {\n        const data = Carousel.getOrCreateInstance(this, config);\n        if (typeof config === 'number') {\n          data.to(config);\n          return;\n        }\n        if (typeof config === 'string') {\n          if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n            throw new TypeError(`No method named \"${config}\"`);\n          }\n          data[config]();\n        }\n      });\n    }\n  }\n\n  /**\n   * Data API implementation\n   */\n\n  EventHandler.on(document, EVENT_CLICK_DATA_API$5, SELECTOR_DATA_SLIDE, function (event) {\n    const target = SelectorEngine.getElementFromSelector(this);\n    if (!target || !target.classList.contains(CLASS_NAME_CAROUSEL)) {\n      return;\n    }\n    event.preventDefault();\n    const carousel = Carousel.getOrCreateInstance(target);\n    const slideIndex = this.getAttribute('data-bs-slide-to');\n    if (slideIndex) {\n      carousel.to(slideIndex);\n      carousel._maybeEnableCycle();\n      return;\n    }\n    if (Manipulator.getDataAttribute(this, 'slide') === 'next') {\n      carousel.next();\n      carousel._maybeEnableCycle();\n      return;\n    }\n    carousel.prev();\n    carousel._maybeEnableCycle();\n  });\n  EventHandler.on(window, EVENT_LOAD_DATA_API$3, () => {\n    const carousels = SelectorEngine.find(SELECTOR_DATA_RIDE);\n    for (const carousel of carousels) {\n      Carousel.getOrCreateInstance(carousel);\n    }\n  });\n\n  /**\n   * jQuery\n   */\n\n  defineJQueryPlugin(Carousel);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap collapse.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n\n  /**\n   * Constants\n   */\n\n  const NAME$b = 'collapse';\n  const DATA_KEY$7 = 'bs.collapse';\n  const EVENT_KEY$7 = `.${DATA_KEY$7}`;\n  const DATA_API_KEY$4 = '.data-api';\n  const EVENT_SHOW$6 = `show${EVENT_KEY$7}`;\n  const EVENT_SHOWN$6 = `shown${EVENT_KEY$7}`;\n  const EVENT_HIDE$6 = `hide${EVENT_KEY$7}`;\n  const EVENT_HIDDEN$6 = `hidden${EVENT_KEY$7}`;\n  const EVENT_CLICK_DATA_API$4 = `click${EVENT_KEY$7}${DATA_API_KEY$4}`;\n  const CLASS_NAME_SHOW$7 = 'show';\n  const CLASS_NAME_COLLAPSE = 'collapse';\n  const CLASS_NAME_COLLAPSING = 'collapsing';\n  const CLASS_NAME_COLLAPSED = 'collapsed';\n  const CLASS_NAME_DEEPER_CHILDREN = `:scope .${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`;\n  const CLASS_NAME_HORIZONTAL = 'collapse-horizontal';\n  const WIDTH = 'width';\n  const HEIGHT = 'height';\n  const SELECTOR_ACTIVES = '.collapse.show, .collapse.collapsing';\n  const SELECTOR_DATA_TOGGLE$4 = '[data-bs-toggle=\"collapse\"]';\n  const Default$a = {\n    parent: null,\n    toggle: true\n  };\n  const DefaultType$a = {\n    parent: '(null|element)',\n    toggle: 'boolean'\n  };\n\n  /**\n   * Class definition\n   */\n\n  class Collapse extends BaseComponent {\n    constructor(element, config) {\n      super(element, config);\n      this._isTransitioning = false;\n      this._triggerArray = [];\n      const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE$4);\n      for (const elem of toggleList) {\n        const selector = SelectorEngine.getSelectorFromElement(elem);\n        const filterElement = SelectorEngine.find(selector).filter(foundElement => foundElement === this._element);\n        if (selector !== null && filterElement.length) {\n          this._triggerArray.push(elem);\n        }\n      }\n      this._initializeChildren();\n      if (!this._config.parent) {\n        this._addAriaAndCollapsedClass(this._triggerArray, this._isShown());\n      }\n      if (this._config.toggle) {\n        this.toggle();\n      }\n    }\n\n    // Getters\n    static get Default() {\n      return Default$a;\n    }\n    static get DefaultType() {\n      return DefaultType$a;\n    }\n    static get NAME() {\n      return NAME$b;\n    }\n\n    // Public\n    toggle() {\n      if (this._isShown()) {\n        this.hide();\n      } else {\n        this.show();\n      }\n    }\n    show() {\n      if (this._isTransitioning || this._isShown()) {\n        return;\n      }\n      let activeChildren = [];\n\n      // find active children\n      if (this._config.parent) {\n        activeChildren = this._getFirstLevelChildren(SELECTOR_ACTIVES).filter(element => element !== this._element).map(element => Collapse.getOrCreateInstance(element, {\n          toggle: false\n        }));\n      }\n      if (activeChildren.length && activeChildren[0]._isTransitioning) {\n        return;\n      }\n      const startEvent = EventHandler.trigger(this._element, EVENT_SHOW$6);\n      if (startEvent.defaultPrevented) {\n        return;\n      }\n      for (const activeInstance of activeChildren) {\n        activeInstance.hide();\n      }\n      const dimension = this._getDimension();\n      this._element.classList.remove(CLASS_NAME_COLLAPSE);\n      this._element.classList.add(CLASS_NAME_COLLAPSING);\n      this._element.style[dimension] = 0;\n      this._addAriaAndCollapsedClass(this._triggerArray, true);\n      this._isTransitioning = true;\n      const complete = () => {\n        this._isTransitioning = false;\n        this._element.classList.remove(CLASS_NAME_COLLAPSING);\n        this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7);\n        this._element.style[dimension] = '';\n        EventHandler.trigger(this._element, EVENT_SHOWN$6);\n      };\n      const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);\n      const scrollSize = `scroll${capitalizedDimension}`;\n      this._queueCallback(complete, this._element, true);\n      this._element.style[dimension] = `${this._element[scrollSize]}px`;\n    }\n    hide() {\n      if (this._isTransitioning || !this._isShown()) {\n        return;\n      }\n      const startEvent = EventHandler.trigger(this._element, EVENT_HIDE$6);\n      if (startEvent.defaultPrevented) {\n        return;\n      }\n      const dimension = this._getDimension();\n      this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`;\n      reflow(this._element);\n      this._element.classList.add(CLASS_NAME_COLLAPSING);\n      this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7);\n      for (const trigger of this._triggerArray) {\n        const element = SelectorEngine.getElementFromSelector(trigger);\n        if (element && !this._isShown(element)) {\n          this._addAriaAndCollapsedClass([trigger], false);\n        }\n      }\n      this._isTransitioning = true;\n      const complete = () => {\n        this._isTransitioning = false;\n        this._element.classList.remove(CLASS_NAME_COLLAPSING);\n        this._element.classList.add(CLASS_NAME_COLLAPSE);\n        EventHandler.trigger(this._element, EVENT_HIDDEN$6);\n      };\n      this._element.style[dimension] = '';\n      this._queueCallback(complete, this._element, true);\n    }\n\n    // Private\n    _isShown(element = this._element) {\n      return element.classList.contains(CLASS_NAME_SHOW$7);\n    }\n    _configAfterMerge(config) {\n      config.toggle = Boolean(config.toggle); // Coerce string values\n      config.parent = getElement(config.parent);\n      return config;\n    }\n    _getDimension() {\n      return this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT;\n    }\n    _initializeChildren() {\n      if (!this._config.parent) {\n        return;\n      }\n      const children = this._getFirstLevelChildren(SELECTOR_DATA_TOGGLE$4);\n      for (const element of children) {\n        const selected = SelectorEngine.getElementFromSelector(element);\n        if (selected) {\n          this._addAriaAndCollapsedClass([element], this._isShown(selected));\n        }\n      }\n    }\n    _getFirstLevelChildren(selector) {\n      const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent);\n      // remove children if greater depth\n      return SelectorEngine.find(selector, this._config.parent).filter(element => !children.includes(element));\n    }\n    _addAriaAndCollapsedClass(triggerArray, isOpen) {\n      if (!triggerArray.length) {\n        return;\n      }\n      for (const element of triggerArray) {\n        element.classList.toggle(CLASS_NAME_COLLAPSED, !isOpen);\n        element.setAttribute('aria-expanded', isOpen);\n      }\n    }\n\n    // Static\n    static jQueryInterface(config) {\n      const _config = {};\n      if (typeof config === 'string' && /show|hide/.test(config)) {\n        _config.toggle = false;\n      }\n      return this.each(function () {\n        const data = Collapse.getOrCreateInstance(this, _config);\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(`No method named \"${config}\"`);\n          }\n          data[config]();\n        }\n      });\n    }\n  }\n\n  /**\n   * Data API implementation\n   */\n\n  EventHandler.on(document, EVENT_CLICK_DATA_API$4, SELECTOR_DATA_TOGGLE$4, function (event) {\n    // preventDefault only for <a> elements (which change the URL) not inside the collapsible element\n    if (event.target.tagName === 'A' || event.delegateTarget && event.delegateTarget.tagName === 'A') {\n      event.preventDefault();\n    }\n    for (const element of SelectorEngine.getMultipleElementsFromSelector(this)) {\n      Collapse.getOrCreateInstance(element, {\n        toggle: false\n      }).toggle();\n    }\n  });\n\n  /**\n   * jQuery\n   */\n\n  defineJQueryPlugin(Collapse);\n\n  var top = 'top';\n  var bottom = 'bottom';\n  var right = 'right';\n  var left = 'left';\n  var auto = 'auto';\n  var basePlacements = [top, bottom, right, left];\n  var start = 'start';\n  var end = 'end';\n  var clippingParents = 'clippingParents';\n  var viewport = 'viewport';\n  var popper = 'popper';\n  var reference = 'reference';\n  var variationPlacements = /*#__PURE__*/basePlacements.reduce(function (acc, placement) {\n    return acc.concat([placement + \"-\" + start, placement + \"-\" + end]);\n  }, []);\n  var placements = /*#__PURE__*/[].concat(basePlacements, [auto]).reduce(function (acc, placement) {\n    return acc.concat([placement, placement + \"-\" + start, placement + \"-\" + end]);\n  }, []); // modifiers that need to read the DOM\n\n  var beforeRead = 'beforeRead';\n  var read = 'read';\n  var afterRead = 'afterRead'; // pure-logic modifiers\n\n  var beforeMain = 'beforeMain';\n  var main = 'main';\n  var afterMain = 'afterMain'; // modifier with the purpose to write to the DOM (or write into a framework state)\n\n  var beforeWrite = 'beforeWrite';\n  var write = 'write';\n  var afterWrite = 'afterWrite';\n  var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite];\n\n  function getNodeName(element) {\n    return element ? (element.nodeName || '').toLowerCase() : null;\n  }\n\n  function getWindow(node) {\n    if (node == null) {\n      return window;\n    }\n\n    if (node.toString() !== '[object Window]') {\n      var ownerDocument = node.ownerDocument;\n      return ownerDocument ? ownerDocument.defaultView || window : window;\n    }\n\n    return node;\n  }\n\n  function isElement(node) {\n    var OwnElement = getWindow(node).Element;\n    return node instanceof OwnElement || node instanceof Element;\n  }\n\n  function isHTMLElement(node) {\n    var OwnElement = getWindow(node).HTMLElement;\n    return node instanceof OwnElement || node instanceof HTMLElement;\n  }\n\n  function isShadowRoot(node) {\n    // IE 11 has no ShadowRoot\n    if (typeof ShadowRoot === 'undefined') {\n      return false;\n    }\n\n    var OwnElement = getWindow(node).ShadowRoot;\n    return node instanceof OwnElement || node instanceof ShadowRoot;\n  }\n\n  // and applies them to the HTMLElements such as popper and arrow\n\n  function applyStyles(_ref) {\n    var state = _ref.state;\n    Object.keys(state.elements).forEach(function (name) {\n      var style = state.styles[name] || {};\n      var attributes = state.attributes[name] || {};\n      var element = state.elements[name]; // arrow is optional + virtual elements\n\n      if (!isHTMLElement(element) || !getNodeName(element)) {\n        return;\n      } // Flow doesn't support to extend this property, but it's the most\n      // effective way to apply styles to an HTMLElement\n      // $FlowFixMe[cannot-write]\n\n\n      Object.assign(element.style, style);\n      Object.keys(attributes).forEach(function (name) {\n        var value = attributes[name];\n\n        if (value === false) {\n          element.removeAttribute(name);\n        } else {\n          element.setAttribute(name, value === true ? '' : value);\n        }\n      });\n    });\n  }\n\n  function effect$2(_ref2) {\n    var state = _ref2.state;\n    var initialStyles = {\n      popper: {\n        position: state.options.strategy,\n        left: '0',\n        top: '0',\n        margin: '0'\n      },\n      arrow: {\n        position: 'absolute'\n      },\n      reference: {}\n    };\n    Object.assign(state.elements.popper.style, initialStyles.popper);\n    state.styles = initialStyles;\n\n    if (state.elements.arrow) {\n      Object.assign(state.elements.arrow.style, initialStyles.arrow);\n    }\n\n    return function () {\n      Object.keys(state.elements).forEach(function (name) {\n        var element = state.elements[name];\n        var attributes = state.attributes[name] || {};\n        var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); // Set all values to an empty string to unset them\n\n        var style = styleProperties.reduce(function (style, property) {\n          style[property] = '';\n          return style;\n        }, {}); // arrow is optional + virtual elements\n\n        if (!isHTMLElement(element) || !getNodeName(element)) {\n          return;\n        }\n\n        Object.assign(element.style, style);\n        Object.keys(attributes).forEach(function (attribute) {\n          element.removeAttribute(attribute);\n        });\n      });\n    };\n  } // eslint-disable-next-line import/no-unused-modules\n\n\n  const applyStyles$1 = {\n    name: 'applyStyles',\n    enabled: true,\n    phase: 'write',\n    fn: applyStyles,\n    effect: effect$2,\n    requires: ['computeStyles']\n  };\n\n  function getBasePlacement(placement) {\n    return placement.split('-')[0];\n  }\n\n  var max = Math.max;\n  var min = Math.min;\n  var round = Math.round;\n\n  function getUAString() {\n    var uaData = navigator.userAgentData;\n\n    if (uaData != null && uaData.brands && Array.isArray(uaData.brands)) {\n      return uaData.brands.map(function (item) {\n        return item.brand + \"/\" + item.version;\n      }).join(' ');\n    }\n\n    return navigator.userAgent;\n  }\n\n  function isLayoutViewport() {\n    return !/^((?!chrome|android).)*safari/i.test(getUAString());\n  }\n\n  function getBoundingClientRect(element, includeScale, isFixedStrategy) {\n    if (includeScale === void 0) {\n      includeScale = false;\n    }\n\n    if (isFixedStrategy === void 0) {\n      isFixedStrategy = false;\n    }\n\n    var clientRect = element.getBoundingClientRect();\n    var scaleX = 1;\n    var scaleY = 1;\n\n    if (includeScale && isHTMLElement(element)) {\n      scaleX = element.offsetWidth > 0 ? round(clientRect.width) / element.offsetWidth || 1 : 1;\n      scaleY = element.offsetHeight > 0 ? round(clientRect.height) / element.offsetHeight || 1 : 1;\n    }\n\n    var _ref = isElement(element) ? getWindow(element) : window,\n        visualViewport = _ref.visualViewport;\n\n    var addVisualOffsets = !isLayoutViewport() && isFixedStrategy;\n    var x = (clientRect.left + (addVisualOffsets && visualViewport ? visualViewport.offsetLeft : 0)) / scaleX;\n    var y = (clientRect.top + (addVisualOffsets && visualViewport ? visualViewport.offsetTop : 0)) / scaleY;\n    var width = clientRect.width / scaleX;\n    var height = clientRect.height / scaleY;\n    return {\n      width: width,\n      height: height,\n      top: y,\n      right: x + width,\n      bottom: y + height,\n      left: x,\n      x: x,\n      y: y\n    };\n  }\n\n  // means it doesn't take into account transforms.\n\n  function getLayoutRect(element) {\n    var clientRect = getBoundingClientRect(element); // Use the clientRect sizes if it's not been transformed.\n    // Fixes https://github.com/popperjs/popper-core/issues/1223\n\n    var width = element.offsetWidth;\n    var height = element.offsetHeight;\n\n    if (Math.abs(clientRect.width - width) <= 1) {\n      width = clientRect.width;\n    }\n\n    if (Math.abs(clientRect.height - height) <= 1) {\n      height = clientRect.height;\n    }\n\n    return {\n      x: element.offsetLeft,\n      y: element.offsetTop,\n      width: width,\n      height: height\n    };\n  }\n\n  function contains(parent, child) {\n    var rootNode = child.getRootNode && child.getRootNode(); // First, attempt with faster native method\n\n    if (parent.contains(child)) {\n      return true;\n    } // then fallback to custom implementation with Shadow DOM support\n    else if (rootNode && isShadowRoot(rootNode)) {\n        var next = child;\n\n        do {\n          if (next && parent.isSameNode(next)) {\n            return true;\n          } // $FlowFixMe[prop-missing]: need a better way to handle this...\n\n\n          next = next.parentNode || next.host;\n        } while (next);\n      } // Give up, the result is false\n\n\n    return false;\n  }\n\n  function getComputedStyle$1(element) {\n    return getWindow(element).getComputedStyle(element);\n  }\n\n  function isTableElement(element) {\n    return ['table', 'td', 'th'].indexOf(getNodeName(element)) >= 0;\n  }\n\n  function getDocumentElement(element) {\n    // $FlowFixMe[incompatible-return]: assume body is always available\n    return ((isElement(element) ? element.ownerDocument : // $FlowFixMe[prop-missing]\n    element.document) || window.document).documentElement;\n  }\n\n  function getParentNode(element) {\n    if (getNodeName(element) === 'html') {\n      return element;\n    }\n\n    return (// this is a quicker (but less type safe) way to save quite some bytes from the bundle\n      // $FlowFixMe[incompatible-return]\n      // $FlowFixMe[prop-missing]\n      element.assignedSlot || // step into the shadow DOM of the parent of a slotted node\n      element.parentNode || ( // DOM Element detected\n      isShadowRoot(element) ? element.host : null) || // ShadowRoot detected\n      // $FlowFixMe[incompatible-call]: HTMLElement is a Node\n      getDocumentElement(element) // fallback\n\n    );\n  }\n\n  function getTrueOffsetParent(element) {\n    if (!isHTMLElement(element) || // https://github.com/popperjs/popper-core/issues/837\n    getComputedStyle$1(element).position === 'fixed') {\n      return null;\n    }\n\n    return element.offsetParent;\n  } // `.offsetParent` reports `null` for fixed elements, while absolute elements\n  // return the containing block\n\n\n  function getContainingBlock(element) {\n    var isFirefox = /firefox/i.test(getUAString());\n    var isIE = /Trident/i.test(getUAString());\n\n    if (isIE && isHTMLElement(element)) {\n      // In IE 9, 10 and 11 fixed elements containing block is always established by the viewport\n      var elementCss = getComputedStyle$1(element);\n\n      if (elementCss.position === 'fixed') {\n        return null;\n      }\n    }\n\n    var currentNode = getParentNode(element);\n\n    if (isShadowRoot(currentNode)) {\n      currentNode = currentNode.host;\n    }\n\n    while (isHTMLElement(currentNode) && ['html', 'body'].indexOf(getNodeName(currentNode)) < 0) {\n      var css = getComputedStyle$1(currentNode); // This is non-exhaustive but covers the most common CSS properties that\n      // create a containing block.\n      // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n\n      if (css.transform !== 'none' || css.perspective !== 'none' || css.contain === 'paint' || ['transform', 'perspective'].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === 'filter' || isFirefox && css.filter && css.filter !== 'none') {\n        return currentNode;\n      } else {\n        currentNode = currentNode.parentNode;\n      }\n    }\n\n    return null;\n  } // Gets the closest ancestor positioned element. Handles some edge cases,\n  // such as table ancestors and cross browser bugs.\n\n\n  function getOffsetParent(element) {\n    var window = getWindow(element);\n    var offsetParent = getTrueOffsetParent(element);\n\n    while (offsetParent && isTableElement(offsetParent) && getComputedStyle$1(offsetParent).position === 'static') {\n      offsetParent = getTrueOffsetParent(offsetParent);\n    }\n\n    if (offsetParent && (getNodeName(offsetParent) === 'html' || getNodeName(offsetParent) === 'body' && getComputedStyle$1(offsetParent).position === 'static')) {\n      return window;\n    }\n\n    return offsetParent || getContainingBlock(element) || window;\n  }\n\n  function getMainAxisFromPlacement(placement) {\n    return ['top', 'bottom'].indexOf(placement) >= 0 ? 'x' : 'y';\n  }\n\n  function within(min$1, value, max$1) {\n    return max(min$1, min(value, max$1));\n  }\n  function withinMaxClamp(min, value, max) {\n    var v = within(min, value, max);\n    return v > max ? max : v;\n  }\n\n  function getFreshSideObject() {\n    return {\n      top: 0,\n      right: 0,\n      bottom: 0,\n      left: 0\n    };\n  }\n\n  function mergePaddingObject(paddingObject) {\n    return Object.assign({}, getFreshSideObject(), paddingObject);\n  }\n\n  function expandToHashMap(value, keys) {\n    return keys.reduce(function (hashMap, key) {\n      hashMap[key] = value;\n      return hashMap;\n    }, {});\n  }\n\n  var toPaddingObject = function toPaddingObject(padding, state) {\n    padding = typeof padding === 'function' ? padding(Object.assign({}, state.rects, {\n      placement: state.placement\n    })) : padding;\n    return mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n  };\n\n  function arrow(_ref) {\n    var _state$modifiersData$;\n\n    var state = _ref.state,\n        name = _ref.name,\n        options = _ref.options;\n    var arrowElement = state.elements.arrow;\n    var popperOffsets = state.modifiersData.popperOffsets;\n    var basePlacement = getBasePlacement(state.placement);\n    var axis = getMainAxisFromPlacement(basePlacement);\n    var isVertical = [left, right].indexOf(basePlacement) >= 0;\n    var len = isVertical ? 'height' : 'width';\n\n    if (!arrowElement || !popperOffsets) {\n      return;\n    }\n\n    var paddingObject = toPaddingObject(options.padding, state);\n    var arrowRect = getLayoutRect(arrowElement);\n    var minProp = axis === 'y' ? top : left;\n    var maxProp = axis === 'y' ? bottom : right;\n    var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets[axis] - state.rects.popper[len];\n    var startDiff = popperOffsets[axis] - state.rects.reference[axis];\n    var arrowOffsetParent = getOffsetParent(arrowElement);\n    var clientSize = arrowOffsetParent ? axis === 'y' ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0;\n    var centerToReference = endDiff / 2 - startDiff / 2; // Make sure the arrow doesn't overflow the popper if the center point is\n    // outside of the popper bounds\n\n    var min = paddingObject[minProp];\n    var max = clientSize - arrowRect[len] - paddingObject[maxProp];\n    var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference;\n    var offset = within(min, center, max); // Prevents breaking syntax highlighting...\n\n    var axisProp = axis;\n    state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset, _state$modifiersData$.centerOffset = offset - center, _state$modifiersData$);\n  }\n\n  function effect$1(_ref2) {\n    var state = _ref2.state,\n        options = _ref2.options;\n    var _options$element = options.element,\n        arrowElement = _options$element === void 0 ? '[data-popper-arrow]' : _options$element;\n\n    if (arrowElement == null) {\n      return;\n    } // CSS selector\n\n\n    if (typeof arrowElement === 'string') {\n      arrowElement = state.elements.popper.querySelector(arrowElement);\n\n      if (!arrowElement) {\n        return;\n      }\n    }\n\n    if (!contains(state.elements.popper, arrowElement)) {\n      return;\n    }\n\n    state.elements.arrow = arrowElement;\n  } // eslint-disable-next-line import/no-unused-modules\n\n\n  const arrow$1 = {\n    name: 'arrow',\n    enabled: true,\n    phase: 'main',\n    fn: arrow,\n    effect: effect$1,\n    requires: ['popperOffsets'],\n    requiresIfExists: ['preventOverflow']\n  };\n\n  function getVariation(placement) {\n    return placement.split('-')[1];\n  }\n\n  var unsetSides = {\n    top: 'auto',\n    right: 'auto',\n    bottom: 'auto',\n    left: 'auto'\n  }; // Round the offsets to the nearest suitable subpixel based on the DPR.\n  // Zooming can change the DPR, but it seems to report a value that will\n  // cleanly divide the values into the appropriate subpixels.\n\n  function roundOffsetsByDPR(_ref, win) {\n    var x = _ref.x,\n        y = _ref.y;\n    var dpr = win.devicePixelRatio || 1;\n    return {\n      x: round(x * dpr) / dpr || 0,\n      y: round(y * dpr) / dpr || 0\n    };\n  }\n\n  function mapToStyles(_ref2) {\n    var _Object$assign2;\n\n    var popper = _ref2.popper,\n        popperRect = _ref2.popperRect,\n        placement = _ref2.placement,\n        variation = _ref2.variation,\n        offsets = _ref2.offsets,\n        position = _ref2.position,\n        gpuAcceleration = _ref2.gpuAcceleration,\n        adaptive = _ref2.adaptive,\n        roundOffsets = _ref2.roundOffsets,\n        isFixed = _ref2.isFixed;\n    var _offsets$x = offsets.x,\n        x = _offsets$x === void 0 ? 0 : _offsets$x,\n        _offsets$y = offsets.y,\n        y = _offsets$y === void 0 ? 0 : _offsets$y;\n\n    var _ref3 = typeof roundOffsets === 'function' ? roundOffsets({\n      x: x,\n      y: y\n    }) : {\n      x: x,\n      y: y\n    };\n\n    x = _ref3.x;\n    y = _ref3.y;\n    var hasX = offsets.hasOwnProperty('x');\n    var hasY = offsets.hasOwnProperty('y');\n    var sideX = left;\n    var sideY = top;\n    var win = window;\n\n    if (adaptive) {\n      var offsetParent = getOffsetParent(popper);\n      var heightProp = 'clientHeight';\n      var widthProp = 'clientWidth';\n\n      if (offsetParent === getWindow(popper)) {\n        offsetParent = getDocumentElement(popper);\n\n        if (getComputedStyle$1(offsetParent).position !== 'static' && position === 'absolute') {\n          heightProp = 'scrollHeight';\n          widthProp = 'scrollWidth';\n        }\n      } // $FlowFixMe[incompatible-cast]: force type refinement, we compare offsetParent with window above, but Flow doesn't detect it\n\n\n      offsetParent = offsetParent;\n\n      if (placement === top || (placement === left || placement === right) && variation === end) {\n        sideY = bottom;\n        var offsetY = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.height : // $FlowFixMe[prop-missing]\n        offsetParent[heightProp];\n        y -= offsetY - popperRect.height;\n        y *= gpuAcceleration ? 1 : -1;\n      }\n\n      if (placement === left || (placement === top || placement === bottom) && variation === end) {\n        sideX = right;\n        var offsetX = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.width : // $FlowFixMe[prop-missing]\n        offsetParent[widthProp];\n        x -= offsetX - popperRect.width;\n        x *= gpuAcceleration ? 1 : -1;\n      }\n    }\n\n    var commonStyles = Object.assign({\n      position: position\n    }, adaptive && unsetSides);\n\n    var _ref4 = roundOffsets === true ? roundOffsetsByDPR({\n      x: x,\n      y: y\n    }, getWindow(popper)) : {\n      x: x,\n      y: y\n    };\n\n    x = _ref4.x;\n    y = _ref4.y;\n\n    if (gpuAcceleration) {\n      var _Object$assign;\n\n      return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? '0' : '', _Object$assign[sideX] = hasX ? '0' : '', _Object$assign.transform = (win.devicePixelRatio || 1) <= 1 ? \"translate(\" + x + \"px, \" + y + \"px)\" : \"translate3d(\" + x + \"px, \" + y + \"px, 0)\", _Object$assign));\n    }\n\n    return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + \"px\" : '', _Object$assign2[sideX] = hasX ? x + \"px\" : '', _Object$assign2.transform = '', _Object$assign2));\n  }\n\n  function computeStyles(_ref5) {\n    var state = _ref5.state,\n        options = _ref5.options;\n    var _options$gpuAccelerat = options.gpuAcceleration,\n        gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat,\n        _options$adaptive = options.adaptive,\n        adaptive = _options$adaptive === void 0 ? true : _options$adaptive,\n        _options$roundOffsets = options.roundOffsets,\n        roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets;\n    var commonStyles = {\n      placement: getBasePlacement(state.placement),\n      variation: getVariation(state.placement),\n      popper: state.elements.popper,\n      popperRect: state.rects.popper,\n      gpuAcceleration: gpuAcceleration,\n      isFixed: state.options.strategy === 'fixed'\n    };\n\n    if (state.modifiersData.popperOffsets != null) {\n      state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, {\n        offsets: state.modifiersData.popperOffsets,\n        position: state.options.strategy,\n        adaptive: adaptive,\n        roundOffsets: roundOffsets\n      })));\n    }\n\n    if (state.modifiersData.arrow != null) {\n      state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, {\n        offsets: state.modifiersData.arrow,\n        position: 'absolute',\n        adaptive: false,\n        roundOffsets: roundOffsets\n      })));\n    }\n\n    state.attributes.popper = Object.assign({}, state.attributes.popper, {\n      'data-popper-placement': state.placement\n    });\n  } // eslint-disable-next-line import/no-unused-modules\n\n\n  const computeStyles$1 = {\n    name: 'computeStyles',\n    enabled: true,\n    phase: 'beforeWrite',\n    fn: computeStyles,\n    data: {}\n  };\n\n  var passive = {\n    passive: true\n  };\n\n  function effect(_ref) {\n    var state = _ref.state,\n        instance = _ref.instance,\n        options = _ref.options;\n    var _options$scroll = options.scroll,\n        scroll = _options$scroll === void 0 ? true : _options$scroll,\n        _options$resize = options.resize,\n        resize = _options$resize === void 0 ? true : _options$resize;\n    var window = getWindow(state.elements.popper);\n    var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper);\n\n    if (scroll) {\n      scrollParents.forEach(function (scrollParent) {\n        scrollParent.addEventListener('scroll', instance.update, passive);\n      });\n    }\n\n    if (resize) {\n      window.addEventListener('resize', instance.update, passive);\n    }\n\n    return function () {\n      if (scroll) {\n        scrollParents.forEach(function (scrollParent) {\n          scrollParent.removeEventListener('scroll', instance.update, passive);\n        });\n      }\n\n      if (resize) {\n        window.removeEventListener('resize', instance.update, passive);\n      }\n    };\n  } // eslint-disable-next-line import/no-unused-modules\n\n\n  const eventListeners = {\n    name: 'eventListeners',\n    enabled: true,\n    phase: 'write',\n    fn: function fn() {},\n    effect: effect,\n    data: {}\n  };\n\n  var hash$1 = {\n    left: 'right',\n    right: 'left',\n    bottom: 'top',\n    top: 'bottom'\n  };\n  function getOppositePlacement(placement) {\n    return placement.replace(/left|right|bottom|top/g, function (matched) {\n      return hash$1[matched];\n    });\n  }\n\n  var hash = {\n    start: 'end',\n    end: 'start'\n  };\n  function getOppositeVariationPlacement(placement) {\n    return placement.replace(/start|end/g, function (matched) {\n      return hash[matched];\n    });\n  }\n\n  function getWindowScroll(node) {\n    var win = getWindow(node);\n    var scrollLeft = win.pageXOffset;\n    var scrollTop = win.pageYOffset;\n    return {\n      scrollLeft: scrollLeft,\n      scrollTop: scrollTop\n    };\n  }\n\n  function getWindowScrollBarX(element) {\n    // If <html> has a CSS width greater than the viewport, then this will be\n    // incorrect for RTL.\n    // Popper 1 is broken in this case and never had a bug report so let's assume\n    // it's not an issue. I don't think anyone ever specifies width on <html>\n    // anyway.\n    // Browsers where the left scrollbar doesn't cause an issue report `0` for\n    // this (e.g. Edge 2019, IE11, Safari)\n    return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft;\n  }\n\n  function getViewportRect(element, strategy) {\n    var win = getWindow(element);\n    var html = getDocumentElement(element);\n    var visualViewport = win.visualViewport;\n    var width = html.clientWidth;\n    var height = html.clientHeight;\n    var x = 0;\n    var y = 0;\n\n    if (visualViewport) {\n      width = visualViewport.width;\n      height = visualViewport.height;\n      var layoutViewport = isLayoutViewport();\n\n      if (layoutViewport || !layoutViewport && strategy === 'fixed') {\n        x = visualViewport.offsetLeft;\n        y = visualViewport.offsetTop;\n      }\n    }\n\n    return {\n      width: width,\n      height: height,\n      x: x + getWindowScrollBarX(element),\n      y: y\n    };\n  }\n\n  // of the `<html>` and `<body>` rect bounds if horizontally scrollable\n\n  function getDocumentRect(element) {\n    var _element$ownerDocumen;\n\n    var html = getDocumentElement(element);\n    var winScroll = getWindowScroll(element);\n    var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body;\n    var width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0);\n    var height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0);\n    var x = -winScroll.scrollLeft + getWindowScrollBarX(element);\n    var y = -winScroll.scrollTop;\n\n    if (getComputedStyle$1(body || html).direction === 'rtl') {\n      x += max(html.clientWidth, body ? body.clientWidth : 0) - width;\n    }\n\n    return {\n      width: width,\n      height: height,\n      x: x,\n      y: y\n    };\n  }\n\n  function isScrollParent(element) {\n    // Firefox wants us to check `-x` and `-y` variations as well\n    var _getComputedStyle = getComputedStyle$1(element),\n        overflow = _getComputedStyle.overflow,\n        overflowX = _getComputedStyle.overflowX,\n        overflowY = _getComputedStyle.overflowY;\n\n    return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX);\n  }\n\n  function getScrollParent(node) {\n    if (['html', 'body', '#document'].indexOf(getNodeName(node)) >= 0) {\n      // $FlowFixMe[incompatible-return]: assume body is always available\n      return node.ownerDocument.body;\n    }\n\n    if (isHTMLElement(node) && isScrollParent(node)) {\n      return node;\n    }\n\n    return getScrollParent(getParentNode(node));\n  }\n\n  /*\n  given a DOM element, return the list of all scroll parents, up the list of ancesors\n  until we get to the top window object. This list is what we attach scroll listeners\n  to, because if any of these parent elements scroll, we'll need to re-calculate the\n  reference element's position.\n  */\n\n  function listScrollParents(element, list) {\n    var _element$ownerDocumen;\n\n    if (list === void 0) {\n      list = [];\n    }\n\n    var scrollParent = getScrollParent(element);\n    var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body);\n    var win = getWindow(scrollParent);\n    var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent;\n    var updatedList = list.concat(target);\n    return isBody ? updatedList : // $FlowFixMe[incompatible-call]: isBody tells us target will be an HTMLElement here\n    updatedList.concat(listScrollParents(getParentNode(target)));\n  }\n\n  function rectToClientRect(rect) {\n    return Object.assign({}, rect, {\n      left: rect.x,\n      top: rect.y,\n      right: rect.x + rect.width,\n      bottom: rect.y + rect.height\n    });\n  }\n\n  function getInnerBoundingClientRect(element, strategy) {\n    var rect = getBoundingClientRect(element, false, strategy === 'fixed');\n    rect.top = rect.top + element.clientTop;\n    rect.left = rect.left + element.clientLeft;\n    rect.bottom = rect.top + element.clientHeight;\n    rect.right = rect.left + element.clientWidth;\n    rect.width = element.clientWidth;\n    rect.height = element.clientHeight;\n    rect.x = rect.left;\n    rect.y = rect.top;\n    return rect;\n  }\n\n  function getClientRectFromMixedType(element, clippingParent, strategy) {\n    return clippingParent === viewport ? rectToClientRect(getViewportRect(element, strategy)) : isElement(clippingParent) ? getInnerBoundingClientRect(clippingParent, strategy) : rectToClientRect(getDocumentRect(getDocumentElement(element)));\n  } // A \"clipping parent\" is an overflowable container with the characteristic of\n  // clipping (or hiding) overflowing elements with a position different from\n  // `initial`\n\n\n  function getClippingParents(element) {\n    var clippingParents = listScrollParents(getParentNode(element));\n    var canEscapeClipping = ['absolute', 'fixed'].indexOf(getComputedStyle$1(element).position) >= 0;\n    var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element;\n\n    if (!isElement(clipperElement)) {\n      return [];\n    } // $FlowFixMe[incompatible-return]: https://github.com/facebook/flow/issues/1414\n\n\n    return clippingParents.filter(function (clippingParent) {\n      return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== 'body';\n    });\n  } // Gets the maximum area that the element is visible in due to any number of\n  // clipping parents\n\n\n  function getClippingRect(element, boundary, rootBoundary, strategy) {\n    var mainClippingParents = boundary === 'clippingParents' ? getClippingParents(element) : [].concat(boundary);\n    var clippingParents = [].concat(mainClippingParents, [rootBoundary]);\n    var firstClippingParent = clippingParents[0];\n    var clippingRect = clippingParents.reduce(function (accRect, clippingParent) {\n      var rect = getClientRectFromMixedType(element, clippingParent, strategy);\n      accRect.top = max(rect.top, accRect.top);\n      accRect.right = min(rect.right, accRect.right);\n      accRect.bottom = min(rect.bottom, accRect.bottom);\n      accRect.left = max(rect.left, accRect.left);\n      return accRect;\n    }, getClientRectFromMixedType(element, firstClippingParent, strategy));\n    clippingRect.width = clippingRect.right - clippingRect.left;\n    clippingRect.height = clippingRect.bottom - clippingRect.top;\n    clippingRect.x = clippingRect.left;\n    clippingRect.y = clippingRect.top;\n    return clippingRect;\n  }\n\n  function computeOffsets(_ref) {\n    var reference = _ref.reference,\n        element = _ref.element,\n        placement = _ref.placement;\n    var basePlacement = placement ? getBasePlacement(placement) : null;\n    var variation = placement ? getVariation(placement) : null;\n    var commonX = reference.x + reference.width / 2 - element.width / 2;\n    var commonY = reference.y + reference.height / 2 - element.height / 2;\n    var offsets;\n\n    switch (basePlacement) {\n      case top:\n        offsets = {\n          x: commonX,\n          y: reference.y - element.height\n        };\n        break;\n\n      case bottom:\n        offsets = {\n          x: commonX,\n          y: reference.y + reference.height\n        };\n        break;\n\n      case right:\n        offsets = {\n          x: reference.x + reference.width,\n          y: commonY\n        };\n        break;\n\n      case left:\n        offsets = {\n          x: reference.x - element.width,\n          y: commonY\n        };\n        break;\n\n      default:\n        offsets = {\n          x: reference.x,\n          y: reference.y\n        };\n    }\n\n    var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null;\n\n    if (mainAxis != null) {\n      var len = mainAxis === 'y' ? 'height' : 'width';\n\n      switch (variation) {\n        case start:\n          offsets[mainAxis] = offsets[mainAxis] - (reference[len] / 2 - element[len] / 2);\n          break;\n\n        case end:\n          offsets[mainAxis] = offsets[mainAxis] + (reference[len] / 2 - element[len] / 2);\n          break;\n      }\n    }\n\n    return offsets;\n  }\n\n  function detectOverflow(state, options) {\n    if (options === void 0) {\n      options = {};\n    }\n\n    var _options = options,\n        _options$placement = _options.placement,\n        placement = _options$placement === void 0 ? state.placement : _options$placement,\n        _options$strategy = _options.strategy,\n        strategy = _options$strategy === void 0 ? state.strategy : _options$strategy,\n        _options$boundary = _options.boundary,\n        boundary = _options$boundary === void 0 ? clippingParents : _options$boundary,\n        _options$rootBoundary = _options.rootBoundary,\n        rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary,\n        _options$elementConte = _options.elementContext,\n        elementContext = _options$elementConte === void 0 ? popper : _options$elementConte,\n        _options$altBoundary = _options.altBoundary,\n        altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary,\n        _options$padding = _options.padding,\n        padding = _options$padding === void 0 ? 0 : _options$padding;\n    var paddingObject = mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n    var altContext = elementContext === popper ? reference : popper;\n    var popperRect = state.rects.popper;\n    var element = state.elements[altBoundary ? altContext : elementContext];\n    var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary, strategy);\n    var referenceClientRect = getBoundingClientRect(state.elements.reference);\n    var popperOffsets = computeOffsets({\n      reference: referenceClientRect,\n      element: popperRect,\n      placement: placement\n    });\n    var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets));\n    var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect; // positive = overflowing the clipping rect\n    // 0 or negative = within the clipping rect\n\n    var overflowOffsets = {\n      top: clippingClientRect.top - elementClientRect.top + paddingObject.top,\n      bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom,\n      left: clippingClientRect.left - elementClientRect.left + paddingObject.left,\n      right: elementClientRect.right - clippingClientRect.right + paddingObject.right\n    };\n    var offsetData = state.modifiersData.offset; // Offsets can be applied only to the popper element\n\n    if (elementContext === popper && offsetData) {\n      var offset = offsetData[placement];\n      Object.keys(overflowOffsets).forEach(function (key) {\n        var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1;\n        var axis = [top, bottom].indexOf(key) >= 0 ? 'y' : 'x';\n        overflowOffsets[key] += offset[axis] * multiply;\n      });\n    }\n\n    return overflowOffsets;\n  }\n\n  function computeAutoPlacement(state, options) {\n    if (options === void 0) {\n      options = {};\n    }\n\n    var _options = options,\n        placement = _options.placement,\n        boundary = _options.boundary,\n        rootBoundary = _options.rootBoundary,\n        padding = _options.padding,\n        flipVariations = _options.flipVariations,\n        _options$allowedAutoP = _options.allowedAutoPlacements,\n        allowedAutoPlacements = _options$allowedAutoP === void 0 ? placements : _options$allowedAutoP;\n    var variation = getVariation(placement);\n    var placements$1 = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function (placement) {\n      return getVariation(placement) === variation;\n    }) : basePlacements;\n    var allowedPlacements = placements$1.filter(function (placement) {\n      return allowedAutoPlacements.indexOf(placement) >= 0;\n    });\n\n    if (allowedPlacements.length === 0) {\n      allowedPlacements = placements$1;\n    } // $FlowFixMe[incompatible-type]: Flow seems to have problems with two array unions...\n\n\n    var overflows = allowedPlacements.reduce(function (acc, placement) {\n      acc[placement] = detectOverflow(state, {\n        placement: placement,\n        boundary: boundary,\n        rootBoundary: rootBoundary,\n        padding: padding\n      })[getBasePlacement(placement)];\n      return acc;\n    }, {});\n    return Object.keys(overflows).sort(function (a, b) {\n      return overflows[a] - overflows[b];\n    });\n  }\n\n  function getExpandedFallbackPlacements(placement) {\n    if (getBasePlacement(placement) === auto) {\n      return [];\n    }\n\n    var oppositePlacement = getOppositePlacement(placement);\n    return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)];\n  }\n\n  function flip(_ref) {\n    var state = _ref.state,\n        options = _ref.options,\n        name = _ref.name;\n\n    if (state.modifiersData[name]._skip) {\n      return;\n    }\n\n    var _options$mainAxis = options.mainAxis,\n        checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n        _options$altAxis = options.altAxis,\n        checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis,\n        specifiedFallbackPlacements = options.fallbackPlacements,\n        padding = options.padding,\n        boundary = options.boundary,\n        rootBoundary = options.rootBoundary,\n        altBoundary = options.altBoundary,\n        _options$flipVariatio = options.flipVariations,\n        flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio,\n        allowedAutoPlacements = options.allowedAutoPlacements;\n    var preferredPlacement = state.options.placement;\n    var basePlacement = getBasePlacement(preferredPlacement);\n    var isBasePlacement = basePlacement === preferredPlacement;\n    var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement));\n    var placements = [preferredPlacement].concat(fallbackPlacements).reduce(function (acc, placement) {\n      return acc.concat(getBasePlacement(placement) === auto ? computeAutoPlacement(state, {\n        placement: placement,\n        boundary: boundary,\n        rootBoundary: rootBoundary,\n        padding: padding,\n        flipVariations: flipVariations,\n        allowedAutoPlacements: allowedAutoPlacements\n      }) : placement);\n    }, []);\n    var referenceRect = state.rects.reference;\n    var popperRect = state.rects.popper;\n    var checksMap = new Map();\n    var makeFallbackChecks = true;\n    var firstFittingPlacement = placements[0];\n\n    for (var i = 0; i < placements.length; i++) {\n      var placement = placements[i];\n\n      var _basePlacement = getBasePlacement(placement);\n\n      var isStartVariation = getVariation(placement) === start;\n      var isVertical = [top, bottom].indexOf(_basePlacement) >= 0;\n      var len = isVertical ? 'width' : 'height';\n      var overflow = detectOverflow(state, {\n        placement: placement,\n        boundary: boundary,\n        rootBoundary: rootBoundary,\n        altBoundary: altBoundary,\n        padding: padding\n      });\n      var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top;\n\n      if (referenceRect[len] > popperRect[len]) {\n        mainVariationSide = getOppositePlacement(mainVariationSide);\n      }\n\n      var altVariationSide = getOppositePlacement(mainVariationSide);\n      var checks = [];\n\n      if (checkMainAxis) {\n        checks.push(overflow[_basePlacement] <= 0);\n      }\n\n      if (checkAltAxis) {\n        checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0);\n      }\n\n      if (checks.every(function (check) {\n        return check;\n      })) {\n        firstFittingPlacement = placement;\n        makeFallbackChecks = false;\n        break;\n      }\n\n      checksMap.set(placement, checks);\n    }\n\n    if (makeFallbackChecks) {\n      // `2` may be desired in some cases – research later\n      var numberOfChecks = flipVariations ? 3 : 1;\n\n      var _loop = function _loop(_i) {\n        var fittingPlacement = placements.find(function (placement) {\n          var checks = checksMap.get(placement);\n\n          if (checks) {\n            return checks.slice(0, _i).every(function (check) {\n              return check;\n            });\n          }\n        });\n\n        if (fittingPlacement) {\n          firstFittingPlacement = fittingPlacement;\n          return \"break\";\n        }\n      };\n\n      for (var _i = numberOfChecks; _i > 0; _i--) {\n        var _ret = _loop(_i);\n\n        if (_ret === \"break\") break;\n      }\n    }\n\n    if (state.placement !== firstFittingPlacement) {\n      state.modifiersData[name]._skip = true;\n      state.placement = firstFittingPlacement;\n      state.reset = true;\n    }\n  } // eslint-disable-next-line import/no-unused-modules\n\n\n  const flip$1 = {\n    name: 'flip',\n    enabled: true,\n    phase: 'main',\n    fn: flip,\n    requiresIfExists: ['offset'],\n    data: {\n      _skip: false\n    }\n  };\n\n  function getSideOffsets(overflow, rect, preventedOffsets) {\n    if (preventedOffsets === void 0) {\n      preventedOffsets = {\n        x: 0,\n        y: 0\n      };\n    }\n\n    return {\n      top: overflow.top - rect.height - preventedOffsets.y,\n      right: overflow.right - rect.width + preventedOffsets.x,\n      bottom: overflow.bottom - rect.height + preventedOffsets.y,\n      left: overflow.left - rect.width - preventedOffsets.x\n    };\n  }\n\n  function isAnySideFullyClipped(overflow) {\n    return [top, right, bottom, left].some(function (side) {\n      return overflow[side] >= 0;\n    });\n  }\n\n  function hide(_ref) {\n    var state = _ref.state,\n        name = _ref.name;\n    var referenceRect = state.rects.reference;\n    var popperRect = state.rects.popper;\n    var preventedOffsets = state.modifiersData.preventOverflow;\n    var referenceOverflow = detectOverflow(state, {\n      elementContext: 'reference'\n    });\n    var popperAltOverflow = detectOverflow(state, {\n      altBoundary: true\n    });\n    var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect);\n    var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets);\n    var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets);\n    var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets);\n    state.modifiersData[name] = {\n      referenceClippingOffsets: referenceClippingOffsets,\n      popperEscapeOffsets: popperEscapeOffsets,\n      isReferenceHidden: isReferenceHidden,\n      hasPopperEscaped: hasPopperEscaped\n    };\n    state.attributes.popper = Object.assign({}, state.attributes.popper, {\n      'data-popper-reference-hidden': isReferenceHidden,\n      'data-popper-escaped': hasPopperEscaped\n    });\n  } // eslint-disable-next-line import/no-unused-modules\n\n\n  const hide$1 = {\n    name: 'hide',\n    enabled: true,\n    phase: 'main',\n    requiresIfExists: ['preventOverflow'],\n    fn: hide\n  };\n\n  function distanceAndSkiddingToXY(placement, rects, offset) {\n    var basePlacement = getBasePlacement(placement);\n    var invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1;\n\n    var _ref = typeof offset === 'function' ? offset(Object.assign({}, rects, {\n      placement: placement\n    })) : offset,\n        skidding = _ref[0],\n        distance = _ref[1];\n\n    skidding = skidding || 0;\n    distance = (distance || 0) * invertDistance;\n    return [left, right].indexOf(basePlacement) >= 0 ? {\n      x: distance,\n      y: skidding\n    } : {\n      x: skidding,\n      y: distance\n    };\n  }\n\n  function offset(_ref2) {\n    var state = _ref2.state,\n        options = _ref2.options,\n        name = _ref2.name;\n    var _options$offset = options.offset,\n        offset = _options$offset === void 0 ? [0, 0] : _options$offset;\n    var data = placements.reduce(function (acc, placement) {\n      acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset);\n      return acc;\n    }, {});\n    var _data$state$placement = data[state.placement],\n        x = _data$state$placement.x,\n        y = _data$state$placement.y;\n\n    if (state.modifiersData.popperOffsets != null) {\n      state.modifiersData.popperOffsets.x += x;\n      state.modifiersData.popperOffsets.y += y;\n    }\n\n    state.modifiersData[name] = data;\n  } // eslint-disable-next-line import/no-unused-modules\n\n\n  const offset$1 = {\n    name: 'offset',\n    enabled: true,\n    phase: 'main',\n    requires: ['popperOffsets'],\n    fn: offset\n  };\n\n  function popperOffsets(_ref) {\n    var state = _ref.state,\n        name = _ref.name;\n    // Offsets are the actual position the popper needs to have to be\n    // properly positioned near its reference element\n    // This is the most basic placement, and will be adjusted by\n    // the modifiers in the next step\n    state.modifiersData[name] = computeOffsets({\n      reference: state.rects.reference,\n      element: state.rects.popper,\n      placement: state.placement\n    });\n  } // eslint-disable-next-line import/no-unused-modules\n\n\n  const popperOffsets$1 = {\n    name: 'popperOffsets',\n    enabled: true,\n    phase: 'read',\n    fn: popperOffsets,\n    data: {}\n  };\n\n  function getAltAxis(axis) {\n    return axis === 'x' ? 'y' : 'x';\n  }\n\n  function preventOverflow(_ref) {\n    var state = _ref.state,\n        options = _ref.options,\n        name = _ref.name;\n    var _options$mainAxis = options.mainAxis,\n        checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n        _options$altAxis = options.altAxis,\n        checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis,\n        boundary = options.boundary,\n        rootBoundary = options.rootBoundary,\n        altBoundary = options.altBoundary,\n        padding = options.padding,\n        _options$tether = options.tether,\n        tether = _options$tether === void 0 ? true : _options$tether,\n        _options$tetherOffset = options.tetherOffset,\n        tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset;\n    var overflow = detectOverflow(state, {\n      boundary: boundary,\n      rootBoundary: rootBoundary,\n      padding: padding,\n      altBoundary: altBoundary\n    });\n    var basePlacement = getBasePlacement(state.placement);\n    var variation = getVariation(state.placement);\n    var isBasePlacement = !variation;\n    var mainAxis = getMainAxisFromPlacement(basePlacement);\n    var altAxis = getAltAxis(mainAxis);\n    var popperOffsets = state.modifiersData.popperOffsets;\n    var referenceRect = state.rects.reference;\n    var popperRect = state.rects.popper;\n    var tetherOffsetValue = typeof tetherOffset === 'function' ? tetherOffset(Object.assign({}, state.rects, {\n      placement: state.placement\n    })) : tetherOffset;\n    var normalizedTetherOffsetValue = typeof tetherOffsetValue === 'number' ? {\n      mainAxis: tetherOffsetValue,\n      altAxis: tetherOffsetValue\n    } : Object.assign({\n      mainAxis: 0,\n      altAxis: 0\n    }, tetherOffsetValue);\n    var offsetModifierState = state.modifiersData.offset ? state.modifiersData.offset[state.placement] : null;\n    var data = {\n      x: 0,\n      y: 0\n    };\n\n    if (!popperOffsets) {\n      return;\n    }\n\n    if (checkMainAxis) {\n      var _offsetModifierState$;\n\n      var mainSide = mainAxis === 'y' ? top : left;\n      var altSide = mainAxis === 'y' ? bottom : right;\n      var len = mainAxis === 'y' ? 'height' : 'width';\n      var offset = popperOffsets[mainAxis];\n      var min$1 = offset + overflow[mainSide];\n      var max$1 = offset - overflow[altSide];\n      var additive = tether ? -popperRect[len] / 2 : 0;\n      var minLen = variation === start ? referenceRect[len] : popperRect[len];\n      var maxLen = variation === start ? -popperRect[len] : -referenceRect[len]; // We need to include the arrow in the calculation so the arrow doesn't go\n      // outside the reference bounds\n\n      var arrowElement = state.elements.arrow;\n      var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : {\n        width: 0,\n        height: 0\n      };\n      var arrowPaddingObject = state.modifiersData['arrow#persistent'] ? state.modifiersData['arrow#persistent'].padding : getFreshSideObject();\n      var arrowPaddingMin = arrowPaddingObject[mainSide];\n      var arrowPaddingMax = arrowPaddingObject[altSide]; // If the reference length is smaller than the arrow length, we don't want\n      // to include its full size in the calculation. If the reference is small\n      // and near the edge of a boundary, the popper can overflow even if the\n      // reference is not overflowing as well (e.g. virtual elements with no\n      // width or height)\n\n      var arrowLen = within(0, referenceRect[len], arrowRect[len]);\n      var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis : minLen - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis;\n      var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis : maxLen + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis;\n      var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow);\n      var clientOffset = arrowOffsetParent ? mainAxis === 'y' ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0;\n      var offsetModifierValue = (_offsetModifierState$ = offsetModifierState == null ? void 0 : offsetModifierState[mainAxis]) != null ? _offsetModifierState$ : 0;\n      var tetherMin = offset + minOffset - offsetModifierValue - clientOffset;\n      var tetherMax = offset + maxOffset - offsetModifierValue;\n      var preventedOffset = within(tether ? min(min$1, tetherMin) : min$1, offset, tether ? max(max$1, tetherMax) : max$1);\n      popperOffsets[mainAxis] = preventedOffset;\n      data[mainAxis] = preventedOffset - offset;\n    }\n\n    if (checkAltAxis) {\n      var _offsetModifierState$2;\n\n      var _mainSide = mainAxis === 'x' ? top : left;\n\n      var _altSide = mainAxis === 'x' ? bottom : right;\n\n      var _offset = popperOffsets[altAxis];\n\n      var _len = altAxis === 'y' ? 'height' : 'width';\n\n      var _min = _offset + overflow[_mainSide];\n\n      var _max = _offset - overflow[_altSide];\n\n      var isOriginSide = [top, left].indexOf(basePlacement) !== -1;\n\n      var _offsetModifierValue = (_offsetModifierState$2 = offsetModifierState == null ? void 0 : offsetModifierState[altAxis]) != null ? _offsetModifierState$2 : 0;\n\n      var _tetherMin = isOriginSide ? _min : _offset - referenceRect[_len] - popperRect[_len] - _offsetModifierValue + normalizedTetherOffsetValue.altAxis;\n\n      var _tetherMax = isOriginSide ? _offset + referenceRect[_len] + popperRect[_len] - _offsetModifierValue - normalizedTetherOffsetValue.altAxis : _max;\n\n      var _preventedOffset = tether && isOriginSide ? withinMaxClamp(_tetherMin, _offset, _tetherMax) : within(tether ? _tetherMin : _min, _offset, tether ? _tetherMax : _max);\n\n      popperOffsets[altAxis] = _preventedOffset;\n      data[altAxis] = _preventedOffset - _offset;\n    }\n\n    state.modifiersData[name] = data;\n  } // eslint-disable-next-line import/no-unused-modules\n\n\n  const preventOverflow$1 = {\n    name: 'preventOverflow',\n    enabled: true,\n    phase: 'main',\n    fn: preventOverflow,\n    requiresIfExists: ['offset']\n  };\n\n  function getHTMLElementScroll(element) {\n    return {\n      scrollLeft: element.scrollLeft,\n      scrollTop: element.scrollTop\n    };\n  }\n\n  function getNodeScroll(node) {\n    if (node === getWindow(node) || !isHTMLElement(node)) {\n      return getWindowScroll(node);\n    } else {\n      return getHTMLElementScroll(node);\n    }\n  }\n\n  function isElementScaled(element) {\n    var rect = element.getBoundingClientRect();\n    var scaleX = round(rect.width) / element.offsetWidth || 1;\n    var scaleY = round(rect.height) / element.offsetHeight || 1;\n    return scaleX !== 1 || scaleY !== 1;\n  } // Returns the composite rect of an element relative to its offsetParent.\n  // Composite means it takes into account transforms as well as layout.\n\n\n  function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) {\n    if (isFixed === void 0) {\n      isFixed = false;\n    }\n\n    var isOffsetParentAnElement = isHTMLElement(offsetParent);\n    var offsetParentIsScaled = isHTMLElement(offsetParent) && isElementScaled(offsetParent);\n    var documentElement = getDocumentElement(offsetParent);\n    var rect = getBoundingClientRect(elementOrVirtualElement, offsetParentIsScaled, isFixed);\n    var scroll = {\n      scrollLeft: 0,\n      scrollTop: 0\n    };\n    var offsets = {\n      x: 0,\n      y: 0\n    };\n\n    if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n      if (getNodeName(offsetParent) !== 'body' || // https://github.com/popperjs/popper-core/issues/1078\n      isScrollParent(documentElement)) {\n        scroll = getNodeScroll(offsetParent);\n      }\n\n      if (isHTMLElement(offsetParent)) {\n        offsets = getBoundingClientRect(offsetParent, true);\n        offsets.x += offsetParent.clientLeft;\n        offsets.y += offsetParent.clientTop;\n      } else if (documentElement) {\n        offsets.x = getWindowScrollBarX(documentElement);\n      }\n    }\n\n    return {\n      x: rect.left + scroll.scrollLeft - offsets.x,\n      y: rect.top + scroll.scrollTop - offsets.y,\n      width: rect.width,\n      height: rect.height\n    };\n  }\n\n  function order(modifiers) {\n    var map = new Map();\n    var visited = new Set();\n    var result = [];\n    modifiers.forEach(function (modifier) {\n      map.set(modifier.name, modifier);\n    }); // On visiting object, check for its dependencies and visit them recursively\n\n    function sort(modifier) {\n      visited.add(modifier.name);\n      var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []);\n      requires.forEach(function (dep) {\n        if (!visited.has(dep)) {\n          var depModifier = map.get(dep);\n\n          if (depModifier) {\n            sort(depModifier);\n          }\n        }\n      });\n      result.push(modifier);\n    }\n\n    modifiers.forEach(function (modifier) {\n      if (!visited.has(modifier.name)) {\n        // check for visited object\n        sort(modifier);\n      }\n    });\n    return result;\n  }\n\n  function orderModifiers(modifiers) {\n    // order based on dependencies\n    var orderedModifiers = order(modifiers); // order based on phase\n\n    return modifierPhases.reduce(function (acc, phase) {\n      return acc.concat(orderedModifiers.filter(function (modifier) {\n        return modifier.phase === phase;\n      }));\n    }, []);\n  }\n\n  function debounce(fn) {\n    var pending;\n    return function () {\n      if (!pending) {\n        pending = new Promise(function (resolve) {\n          Promise.resolve().then(function () {\n            pending = undefined;\n            resolve(fn());\n          });\n        });\n      }\n\n      return pending;\n    };\n  }\n\n  function mergeByName(modifiers) {\n    var merged = modifiers.reduce(function (merged, current) {\n      var existing = merged[current.name];\n      merged[current.name] = existing ? Object.assign({}, existing, current, {\n        options: Object.assign({}, existing.options, current.options),\n        data: Object.assign({}, existing.data, current.data)\n      }) : current;\n      return merged;\n    }, {}); // IE11 does not support Object.values\n\n    return Object.keys(merged).map(function (key) {\n      return merged[key];\n    });\n  }\n\n  var DEFAULT_OPTIONS = {\n    placement: 'bottom',\n    modifiers: [],\n    strategy: 'absolute'\n  };\n\n  function areValidElements() {\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    return !args.some(function (element) {\n      return !(element && typeof element.getBoundingClientRect === 'function');\n    });\n  }\n\n  function popperGenerator(generatorOptions) {\n    if (generatorOptions === void 0) {\n      generatorOptions = {};\n    }\n\n    var _generatorOptions = generatorOptions,\n        _generatorOptions$def = _generatorOptions.defaultModifiers,\n        defaultModifiers = _generatorOptions$def === void 0 ? [] : _generatorOptions$def,\n        _generatorOptions$def2 = _generatorOptions.defaultOptions,\n        defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2;\n    return function createPopper(reference, popper, options) {\n      if (options === void 0) {\n        options = defaultOptions;\n      }\n\n      var state = {\n        placement: 'bottom',\n        orderedModifiers: [],\n        options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions),\n        modifiersData: {},\n        elements: {\n          reference: reference,\n          popper: popper\n        },\n        attributes: {},\n        styles: {}\n      };\n      var effectCleanupFns = [];\n      var isDestroyed = false;\n      var instance = {\n        state: state,\n        setOptions: function setOptions(setOptionsAction) {\n          var options = typeof setOptionsAction === 'function' ? setOptionsAction(state.options) : setOptionsAction;\n          cleanupModifierEffects();\n          state.options = Object.assign({}, defaultOptions, state.options, options);\n          state.scrollParents = {\n            reference: isElement(reference) ? listScrollParents(reference) : reference.contextElement ? listScrollParents(reference.contextElement) : [],\n            popper: listScrollParents(popper)\n          }; // Orders the modifiers based on their dependencies and `phase`\n          // properties\n\n          var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers, state.options.modifiers))); // Strip out disabled modifiers\n\n          state.orderedModifiers = orderedModifiers.filter(function (m) {\n            return m.enabled;\n          });\n          runModifierEffects();\n          return instance.update();\n        },\n        // Sync update – it will always be executed, even if not necessary. This\n        // is useful for low frequency updates where sync behavior simplifies the\n        // logic.\n        // For high frequency updates (e.g. `resize` and `scroll` events), always\n        // prefer the async Popper#update method\n        forceUpdate: function forceUpdate() {\n          if (isDestroyed) {\n            return;\n          }\n\n          var _state$elements = state.elements,\n              reference = _state$elements.reference,\n              popper = _state$elements.popper; // Don't proceed if `reference` or `popper` are not valid elements\n          // anymore\n\n          if (!areValidElements(reference, popper)) {\n            return;\n          } // Store the reference and popper rects to be read by modifiers\n\n\n          state.rects = {\n            reference: getCompositeRect(reference, getOffsetParent(popper), state.options.strategy === 'fixed'),\n            popper: getLayoutRect(popper)\n          }; // Modifiers have the ability to reset the current update cycle. The\n          // most common use case for this is the `flip` modifier changing the\n          // placement, which then needs to re-run all the modifiers, because the\n          // logic was previously ran for the previous placement and is therefore\n          // stale/incorrect\n\n          state.reset = false;\n          state.placement = state.options.placement; // On each update cycle, the `modifiersData` property for each modifier\n          // is filled with the initial data specified by the modifier. This means\n          // it doesn't persist and is fresh on each update.\n          // To ensure persistent data, use `${name}#persistent`\n\n          state.orderedModifiers.forEach(function (modifier) {\n            return state.modifiersData[modifier.name] = Object.assign({}, modifier.data);\n          });\n\n          for (var index = 0; index < state.orderedModifiers.length; index++) {\n            if (state.reset === true) {\n              state.reset = false;\n              index = -1;\n              continue;\n            }\n\n            var _state$orderedModifie = state.orderedModifiers[index],\n                fn = _state$orderedModifie.fn,\n                _state$orderedModifie2 = _state$orderedModifie.options,\n                _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2,\n                name = _state$orderedModifie.name;\n\n            if (typeof fn === 'function') {\n              state = fn({\n                state: state,\n                options: _options,\n                name: name,\n                instance: instance\n              }) || state;\n            }\n          }\n        },\n        // Async and optimistically optimized update – it will not be executed if\n        // not necessary (debounced to run at most once-per-tick)\n        update: debounce(function () {\n          return new Promise(function (resolve) {\n            instance.forceUpdate();\n            resolve(state);\n          });\n        }),\n        destroy: function destroy() {\n          cleanupModifierEffects();\n          isDestroyed = true;\n        }\n      };\n\n      if (!areValidElements(reference, popper)) {\n        return instance;\n      }\n\n      instance.setOptions(options).then(function (state) {\n        if (!isDestroyed && options.onFirstUpdate) {\n          options.onFirstUpdate(state);\n        }\n      }); // Modifiers have the ability to execute arbitrary code before the first\n      // update cycle runs. They will be executed in the same order as the update\n      // cycle. This is useful when a modifier adds some persistent data that\n      // other modifiers need to use, but the modifier is run after the dependent\n      // one.\n\n      function runModifierEffects() {\n        state.orderedModifiers.forEach(function (_ref) {\n          var name = _ref.name,\n              _ref$options = _ref.options,\n              options = _ref$options === void 0 ? {} : _ref$options,\n              effect = _ref.effect;\n\n          if (typeof effect === 'function') {\n            var cleanupFn = effect({\n              state: state,\n              name: name,\n              instance: instance,\n              options: options\n            });\n\n            var noopFn = function noopFn() {};\n\n            effectCleanupFns.push(cleanupFn || noopFn);\n          }\n        });\n      }\n\n      function cleanupModifierEffects() {\n        effectCleanupFns.forEach(function (fn) {\n          return fn();\n        });\n        effectCleanupFns = [];\n      }\n\n      return instance;\n    };\n  }\n  var createPopper$2 = /*#__PURE__*/popperGenerator(); // eslint-disable-next-line import/no-unused-modules\n\n  var defaultModifiers$1 = [eventListeners, popperOffsets$1, computeStyles$1, applyStyles$1];\n  var createPopper$1 = /*#__PURE__*/popperGenerator({\n    defaultModifiers: defaultModifiers$1\n  }); // eslint-disable-next-line import/no-unused-modules\n\n  var defaultModifiers = [eventListeners, popperOffsets$1, computeStyles$1, applyStyles$1, offset$1, flip$1, preventOverflow$1, arrow$1, hide$1];\n  var createPopper = /*#__PURE__*/popperGenerator({\n    defaultModifiers: defaultModifiers\n  }); // eslint-disable-next-line import/no-unused-modules\n\n  const Popper = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.defineProperty({\n    __proto__: null,\n    afterMain,\n    afterRead,\n    afterWrite,\n    applyStyles: applyStyles$1,\n    arrow: arrow$1,\n    auto,\n    basePlacements,\n    beforeMain,\n    beforeRead,\n    beforeWrite,\n    bottom,\n    clippingParents,\n    computeStyles: computeStyles$1,\n    createPopper,\n    createPopperBase: createPopper$2,\n    createPopperLite: createPopper$1,\n    detectOverflow,\n    end,\n    eventListeners,\n    flip: flip$1,\n    hide: hide$1,\n    left,\n    main,\n    modifierPhases,\n    offset: offset$1,\n    placements,\n    popper,\n    popperGenerator,\n    popperOffsets: popperOffsets$1,\n    preventOverflow: preventOverflow$1,\n    read,\n    reference,\n    right,\n    start,\n    top,\n    variationPlacements,\n    viewport,\n    write\n  }, Symbol.toStringTag, { value: 'Module' }));\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap dropdown.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n\n  /**\n   * Constants\n   */\n\n  const NAME$a = 'dropdown';\n  const DATA_KEY$6 = 'bs.dropdown';\n  const EVENT_KEY$6 = `.${DATA_KEY$6}`;\n  const DATA_API_KEY$3 = '.data-api';\n  const ESCAPE_KEY$2 = 'Escape';\n  const TAB_KEY$1 = 'Tab';\n  const ARROW_UP_KEY$1 = 'ArrowUp';\n  const ARROW_DOWN_KEY$1 = 'ArrowDown';\n  const RIGHT_MOUSE_BUTTON = 2; // MouseEvent.button value for the secondary button, usually the right button\n\n  const EVENT_HIDE$5 = `hide${EVENT_KEY$6}`;\n  const EVENT_HIDDEN$5 = `hidden${EVENT_KEY$6}`;\n  const EVENT_SHOW$5 = `show${EVENT_KEY$6}`;\n  const EVENT_SHOWN$5 = `shown${EVENT_KEY$6}`;\n  const EVENT_CLICK_DATA_API$3 = `click${EVENT_KEY$6}${DATA_API_KEY$3}`;\n  const EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY$6}${DATA_API_KEY$3}`;\n  const EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY$6}${DATA_API_KEY$3}`;\n  const CLASS_NAME_SHOW$6 = 'show';\n  const CLASS_NAME_DROPUP = 'dropup';\n  const CLASS_NAME_DROPEND = 'dropend';\n  const CLASS_NAME_DROPSTART = 'dropstart';\n  const CLASS_NAME_DROPUP_CENTER = 'dropup-center';\n  const CLASS_NAME_DROPDOWN_CENTER = 'dropdown-center';\n  const SELECTOR_DATA_TOGGLE$3 = '[data-bs-toggle=\"dropdown\"]:not(.disabled):not(:disabled)';\n  const SELECTOR_DATA_TOGGLE_SHOWN = `${SELECTOR_DATA_TOGGLE$3}.${CLASS_NAME_SHOW$6}`;\n  const SELECTOR_MENU = '.dropdown-menu';\n  const SELECTOR_NAVBAR = '.navbar';\n  const SELECTOR_NAVBAR_NAV = '.navbar-nav';\n  const SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)';\n  const PLACEMENT_TOP = isRTL() ? 'top-end' : 'top-start';\n  const PLACEMENT_TOPEND = isRTL() ? 'top-start' : 'top-end';\n  const PLACEMENT_BOTTOM = isRTL() ? 'bottom-end' : 'bottom-start';\n  const PLACEMENT_BOTTOMEND = isRTL() ? 'bottom-start' : 'bottom-end';\n  const PLACEMENT_RIGHT = isRTL() ? 'left-start' : 'right-start';\n  const PLACEMENT_LEFT = isRTL() ? 'right-start' : 'left-start';\n  const PLACEMENT_TOPCENTER = 'top';\n  const PLACEMENT_BOTTOMCENTER = 'bottom';\n  const Default$9 = {\n    autoClose: true,\n    boundary: 'clippingParents',\n    display: 'dynamic',\n    offset: [0, 2],\n    popperConfig: null,\n    reference: 'toggle'\n  };\n  const DefaultType$9 = {\n    autoClose: '(boolean|string)',\n    boundary: '(string|element)',\n    display: 'string',\n    offset: '(array|string|function)',\n    popperConfig: '(null|object|function)',\n    reference: '(string|element|object)'\n  };\n\n  /**\n   * Class definition\n   */\n\n  class Dropdown extends BaseComponent {\n    constructor(element, config) {\n      super(element, config);\n      this._popper = null;\n      this._parent = this._element.parentNode; // dropdown wrapper\n      // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/\n      this._menu = SelectorEngine.next(this._element, SELECTOR_MENU)[0] || SelectorEngine.prev(this._element, SELECTOR_MENU)[0] || SelectorEngine.findOne(SELECTOR_MENU, this._parent);\n      this._inNavbar = this._detectNavbar();\n    }\n\n    // Getters\n    static get Default() {\n      return Default$9;\n    }\n    static get DefaultType() {\n      return DefaultType$9;\n    }\n    static get NAME() {\n      return NAME$a;\n    }\n\n    // Public\n    toggle() {\n      return this._isShown() ? this.hide() : this.show();\n    }\n    show() {\n      if (isDisabled(this._element) || this._isShown()) {\n        return;\n      }\n      const relatedTarget = {\n        relatedTarget: this._element\n      };\n      const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$5, relatedTarget);\n      if (showEvent.defaultPrevented) {\n        return;\n      }\n      this._createPopper();\n\n      // If this is a touch-enabled device we add extra\n      // empty mouseover listeners to the body's immediate children;\n      // only needed because of broken event delegation on iOS\n      // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n      if ('ontouchstart' in document.documentElement && !this._parent.closest(SELECTOR_NAVBAR_NAV)) {\n        for (const element of [].concat(...document.body.children)) {\n          EventHandler.on(element, 'mouseover', noop);\n        }\n      }\n      this._element.focus();\n      this._element.setAttribute('aria-expanded', true);\n      this._menu.classList.add(CLASS_NAME_SHOW$6);\n      this._element.classList.add(CLASS_NAME_SHOW$6);\n      EventHandler.trigger(this._element, EVENT_SHOWN$5, relatedTarget);\n    }\n    hide() {\n      if (isDisabled(this._element) || !this._isShown()) {\n        return;\n      }\n      const relatedTarget = {\n        relatedTarget: this._element\n      };\n      this._completeHide(relatedTarget);\n    }\n    dispose() {\n      if (this._popper) {\n        this._popper.destroy();\n      }\n      super.dispose();\n    }\n    update() {\n      this._inNavbar = this._detectNavbar();\n      if (this._popper) {\n        this._popper.update();\n      }\n    }\n\n    // Private\n    _completeHide(relatedTarget) {\n      const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$5, relatedTarget);\n      if (hideEvent.defaultPrevented) {\n        return;\n      }\n\n      // If this is a touch-enabled device we remove the extra\n      // empty mouseover listeners we added for iOS support\n      if ('ontouchstart' in document.documentElement) {\n        for (const element of [].concat(...document.body.children)) {\n          EventHandler.off(element, 'mouseover', noop);\n        }\n      }\n      if (this._popper) {\n        this._popper.destroy();\n      }\n      this._menu.classList.remove(CLASS_NAME_SHOW$6);\n      this._element.classList.remove(CLASS_NAME_SHOW$6);\n      this._element.setAttribute('aria-expanded', 'false');\n      Manipulator.removeDataAttribute(this._menu, 'popper');\n      EventHandler.trigger(this._element, EVENT_HIDDEN$5, relatedTarget);\n    }\n    _getConfig(config) {\n      config = super._getConfig(config);\n      if (typeof config.reference === 'object' && !isElement$1(config.reference) && typeof config.reference.getBoundingClientRect !== 'function') {\n        // Popper virtual elements require a getBoundingClientRect method\n        throw new TypeError(`${NAME$a.toUpperCase()}: Option \"reference\" provided type \"object\" without a required \"getBoundingClientRect\" method.`);\n      }\n      return config;\n    }\n    _createPopper() {\n      if (typeof Popper === 'undefined') {\n        throw new TypeError('Bootstrap\\'s dropdowns require Popper (https://popper.js.org/docs/v2/)');\n      }\n      let referenceElement = this._element;\n      if (this._config.reference === 'parent') {\n        referenceElement = this._parent;\n      } else if (isElement$1(this._config.reference)) {\n        referenceElement = getElement(this._config.reference);\n      } else if (typeof this._config.reference === 'object') {\n        referenceElement = this._config.reference;\n      }\n      const popperConfig = this._getPopperConfig();\n      this._popper = createPopper(referenceElement, this._menu, popperConfig);\n    }\n    _isShown() {\n      return this._menu.classList.contains(CLASS_NAME_SHOW$6);\n    }\n    _getPlacement() {\n      const parentDropdown = this._parent;\n      if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) {\n        return PLACEMENT_RIGHT;\n      }\n      if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) {\n        return PLACEMENT_LEFT;\n      }\n      if (parentDropdown.classList.contains(CLASS_NAME_DROPUP_CENTER)) {\n        return PLACEMENT_TOPCENTER;\n      }\n      if (parentDropdown.classList.contains(CLASS_NAME_DROPDOWN_CENTER)) {\n        return PLACEMENT_BOTTOMCENTER;\n      }\n\n      // We need to trim the value because custom properties can also include spaces\n      const isEnd = getComputedStyle(this._menu).getPropertyValue('--bs-position').trim() === 'end';\n      if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) {\n        return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP;\n      }\n      return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM;\n    }\n    _detectNavbar() {\n      return this._element.closest(SELECTOR_NAVBAR) !== null;\n    }\n    _getOffset() {\n      const {\n        offset\n      } = this._config;\n      if (typeof offset === 'string') {\n        return offset.split(',').map(value => Number.parseInt(value, 10));\n      }\n      if (typeof offset === 'function') {\n        return popperData => offset(popperData, this._element);\n      }\n      return offset;\n    }\n    _getPopperConfig() {\n      const defaultBsPopperConfig = {\n        placement: this._getPlacement(),\n        modifiers: [{\n          name: 'preventOverflow',\n          options: {\n            boundary: this._config.boundary\n          }\n        }, {\n          name: 'offset',\n          options: {\n            offset: this._getOffset()\n          }\n        }]\n      };\n\n      // Disable Popper if we have a static display or Dropdown is in Navbar\n      if (this._inNavbar || this._config.display === 'static') {\n        Manipulator.setDataAttribute(this._menu, 'popper', 'static'); // TODO: v6 remove\n        defaultBsPopperConfig.modifiers = [{\n          name: 'applyStyles',\n          enabled: false\n        }];\n      }\n      return {\n        ...defaultBsPopperConfig,\n        ...execute(this._config.popperConfig, [undefined, defaultBsPopperConfig])\n      };\n    }\n    _selectMenuItem({\n      key,\n      target\n    }) {\n      const items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, this._menu).filter(element => isVisible(element));\n      if (!items.length) {\n        return;\n      }\n\n      // if target isn't included in items (e.g. when expanding the dropdown)\n      // allow cycling to get the last item in case key equals ARROW_UP_KEY\n      getNextActiveElement(items, target, key === ARROW_DOWN_KEY$1, !items.includes(target)).focus();\n    }\n\n    // Static\n    static jQueryInterface(config) {\n      return this.each(function () {\n        const data = Dropdown.getOrCreateInstance(this, config);\n        if (typeof config !== 'string') {\n          return;\n        }\n        if (typeof data[config] === 'undefined') {\n          throw new TypeError(`No method named \"${config}\"`);\n        }\n        data[config]();\n      });\n    }\n    static clearMenus(event) {\n      if (event.button === RIGHT_MOUSE_BUTTON || event.type === 'keyup' && event.key !== TAB_KEY$1) {\n        return;\n      }\n      const openToggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE_SHOWN);\n      for (const toggle of openToggles) {\n        const context = Dropdown.getInstance(toggle);\n        if (!context || context._config.autoClose === false) {\n          continue;\n        }\n        const composedPath = event.composedPath();\n        const isMenuTarget = composedPath.includes(context._menu);\n        if (composedPath.includes(context._element) || context._config.autoClose === 'inside' && !isMenuTarget || context._config.autoClose === 'outside' && isMenuTarget) {\n          continue;\n        }\n\n        // Tab navigation through the dropdown menu or events from contained inputs shouldn't close the menu\n        if (context._menu.contains(event.target) && (event.type === 'keyup' && event.key === TAB_KEY$1 || /input|select|option|textarea|form/i.test(event.target.tagName))) {\n          continue;\n        }\n        const relatedTarget = {\n          relatedTarget: context._element\n        };\n        if (event.type === 'click') {\n          relatedTarget.clickEvent = event;\n        }\n        context._completeHide(relatedTarget);\n      }\n    }\n    static dataApiKeydownHandler(event) {\n      // If not an UP | DOWN | ESCAPE key => not a dropdown command\n      // If input/textarea && if key is other than ESCAPE => not a dropdown command\n\n      const isInput = /input|textarea/i.test(event.target.tagName);\n      const isEscapeEvent = event.key === ESCAPE_KEY$2;\n      const isUpOrDownEvent = [ARROW_UP_KEY$1, ARROW_DOWN_KEY$1].includes(event.key);\n      if (!isUpOrDownEvent && !isEscapeEvent) {\n        return;\n      }\n      if (isInput && !isEscapeEvent) {\n        return;\n      }\n      event.preventDefault();\n\n      // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/\n      const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE$3) ? this : SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE$3)[0] || SelectorEngine.next(this, SELECTOR_DATA_TOGGLE$3)[0] || SelectorEngine.findOne(SELECTOR_DATA_TOGGLE$3, event.delegateTarget.parentNode);\n      const instance = Dropdown.getOrCreateInstance(getToggleButton);\n      if (isUpOrDownEvent) {\n        event.stopPropagation();\n        instance.show();\n        instance._selectMenuItem(event);\n        return;\n      }\n      if (instance._isShown()) {\n        // else is escape and we check if it is shown\n        event.stopPropagation();\n        instance.hide();\n        getToggleButton.focus();\n      }\n    }\n  }\n\n  /**\n   * Data API implementation\n   */\n\n  EventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE$3, Dropdown.dataApiKeydownHandler);\n  EventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler);\n  EventHandler.on(document, EVENT_CLICK_DATA_API$3, Dropdown.clearMenus);\n  EventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus);\n  EventHandler.on(document, EVENT_CLICK_DATA_API$3, SELECTOR_DATA_TOGGLE$3, function (event) {\n    event.preventDefault();\n    Dropdown.getOrCreateInstance(this).toggle();\n  });\n\n  /**\n   * jQuery\n   */\n\n  defineJQueryPlugin(Dropdown);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap util/backdrop.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n\n  /**\n   * Constants\n   */\n\n  const NAME$9 = 'backdrop';\n  const CLASS_NAME_FADE$4 = 'fade';\n  const CLASS_NAME_SHOW$5 = 'show';\n  const EVENT_MOUSEDOWN = `mousedown.bs.${NAME$9}`;\n  const Default$8 = {\n    className: 'modal-backdrop',\n    clickCallback: null,\n    isAnimated: false,\n    isVisible: true,\n    // if false, we use the backdrop helper without adding any element to the dom\n    rootElement: 'body' // give the choice to place backdrop under different elements\n  };\n  const DefaultType$8 = {\n    className: 'string',\n    clickCallback: '(function|null)',\n    isAnimated: 'boolean',\n    isVisible: 'boolean',\n    rootElement: '(element|string)'\n  };\n\n  /**\n   * Class definition\n   */\n\n  class Backdrop extends Config {\n    constructor(config) {\n      super();\n      this._config = this._getConfig(config);\n      this._isAppended = false;\n      this._element = null;\n    }\n\n    // Getters\n    static get Default() {\n      return Default$8;\n    }\n    static get DefaultType() {\n      return DefaultType$8;\n    }\n    static get NAME() {\n      return NAME$9;\n    }\n\n    // Public\n    show(callback) {\n      if (!this._config.isVisible) {\n        execute(callback);\n        return;\n      }\n      this._append();\n      const element = this._getElement();\n      if (this._config.isAnimated) {\n        reflow(element);\n      }\n      element.classList.add(CLASS_NAME_SHOW$5);\n      this._emulateAnimation(() => {\n        execute(callback);\n      });\n    }\n    hide(callback) {\n      if (!this._config.isVisible) {\n        execute(callback);\n        return;\n      }\n      this._getElement().classList.remove(CLASS_NAME_SHOW$5);\n      this._emulateAnimation(() => {\n        this.dispose();\n        execute(callback);\n      });\n    }\n    dispose() {\n      if (!this._isAppended) {\n        return;\n      }\n      EventHandler.off(this._element, EVENT_MOUSEDOWN);\n      this._element.remove();\n      this._isAppended = false;\n    }\n\n    // Private\n    _getElement() {\n      if (!this._element) {\n        const backdrop = document.createElement('div');\n        backdrop.className = this._config.className;\n        if (this._config.isAnimated) {\n          backdrop.classList.add(CLASS_NAME_FADE$4);\n        }\n        this._element = backdrop;\n      }\n      return this._element;\n    }\n    _configAfterMerge(config) {\n      // use getElement() with the default \"body\" to get a fresh Element on each instantiation\n      config.rootElement = getElement(config.rootElement);\n      return config;\n    }\n    _append() {\n      if (this._isAppended) {\n        return;\n      }\n      const element = this._getElement();\n      this._config.rootElement.append(element);\n      EventHandler.on(element, EVENT_MOUSEDOWN, () => {\n        execute(this._config.clickCallback);\n      });\n      this._isAppended = true;\n    }\n    _emulateAnimation(callback) {\n      executeAfterTransition(callback, this._getElement(), this._config.isAnimated);\n    }\n  }\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap util/focustrap.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n\n  /**\n   * Constants\n   */\n\n  const NAME$8 = 'focustrap';\n  const DATA_KEY$5 = 'bs.focustrap';\n  const EVENT_KEY$5 = `.${DATA_KEY$5}`;\n  const EVENT_FOCUSIN$2 = `focusin${EVENT_KEY$5}`;\n  const EVENT_KEYDOWN_TAB = `keydown.tab${EVENT_KEY$5}`;\n  const TAB_KEY = 'Tab';\n  const TAB_NAV_FORWARD = 'forward';\n  const TAB_NAV_BACKWARD = 'backward';\n  const Default$7 = {\n    autofocus: true,\n    trapElement: null // The element to trap focus inside of\n  };\n  const DefaultType$7 = {\n    autofocus: 'boolean',\n    trapElement: 'element'\n  };\n\n  /**\n   * Class definition\n   */\n\n  class FocusTrap extends Config {\n    constructor(config) {\n      super();\n      this._config = this._getConfig(config);\n      this._isActive = false;\n      this._lastTabNavDirection = null;\n    }\n\n    // Getters\n    static get Default() {\n      return Default$7;\n    }\n    static get DefaultType() {\n      return DefaultType$7;\n    }\n    static get NAME() {\n      return NAME$8;\n    }\n\n    // Public\n    activate() {\n      if (this._isActive) {\n        return;\n      }\n      if (this._config.autofocus) {\n        this._config.trapElement.focus();\n      }\n      EventHandler.off(document, EVENT_KEY$5); // guard against infinite focus loop\n      EventHandler.on(document, EVENT_FOCUSIN$2, event => this._handleFocusin(event));\n      EventHandler.on(document, EVENT_KEYDOWN_TAB, event => this._handleKeydown(event));\n      this._isActive = true;\n    }\n    deactivate() {\n      if (!this._isActive) {\n        return;\n      }\n      this._isActive = false;\n      EventHandler.off(document, EVENT_KEY$5);\n    }\n\n    // Private\n    _handleFocusin(event) {\n      const {\n        trapElement\n      } = this._config;\n      if (event.target === document || event.target === trapElement || trapElement.contains(event.target)) {\n        return;\n      }\n      const elements = SelectorEngine.focusableChildren(trapElement);\n      if (elements.length === 0) {\n        trapElement.focus();\n      } else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) {\n        elements[elements.length - 1].focus();\n      } else {\n        elements[0].focus();\n      }\n    }\n    _handleKeydown(event) {\n      if (event.key !== TAB_KEY) {\n        return;\n      }\n      this._lastTabNavDirection = event.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD;\n    }\n  }\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap util/scrollBar.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n\n  /**\n   * Constants\n   */\n\n  const SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top';\n  const SELECTOR_STICKY_CONTENT = '.sticky-top';\n  const PROPERTY_PADDING = 'padding-right';\n  const PROPERTY_MARGIN = 'margin-right';\n\n  /**\n   * Class definition\n   */\n\n  class ScrollBarHelper {\n    constructor() {\n      this._element = document.body;\n    }\n\n    // Public\n    getWidth() {\n      // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes\n      const documentWidth = document.documentElement.clientWidth;\n      return Math.abs(window.innerWidth - documentWidth);\n    }\n    hide() {\n      const width = this.getWidth();\n      this._disableOverFlow();\n      // give padding to element to balance the hidden scrollbar width\n      this._setElementAttributes(this._element, PROPERTY_PADDING, calculatedValue => calculatedValue + width);\n      // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements to keep showing fullwidth\n      this._setElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING, calculatedValue => calculatedValue + width);\n      this._setElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN, calculatedValue => calculatedValue - width);\n    }\n    reset() {\n      this._resetElementAttributes(this._element, 'overflow');\n      this._resetElementAttributes(this._element, PROPERTY_PADDING);\n      this._resetElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING);\n      this._resetElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN);\n    }\n    isOverflowing() {\n      return this.getWidth() > 0;\n    }\n\n    // Private\n    _disableOverFlow() {\n      this._saveInitialAttribute(this._element, 'overflow');\n      this._element.style.overflow = 'hidden';\n    }\n    _setElementAttributes(selector, styleProperty, callback) {\n      const scrollbarWidth = this.getWidth();\n      const manipulationCallBack = element => {\n        if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) {\n          return;\n        }\n        this._saveInitialAttribute(element, styleProperty);\n        const calculatedValue = window.getComputedStyle(element).getPropertyValue(styleProperty);\n        element.style.setProperty(styleProperty, `${callback(Number.parseFloat(calculatedValue))}px`);\n      };\n      this._applyManipulationCallback(selector, manipulationCallBack);\n    }\n    _saveInitialAttribute(element, styleProperty) {\n      const actualValue = element.style.getPropertyValue(styleProperty);\n      if (actualValue) {\n        Manipulator.setDataAttribute(element, styleProperty, actualValue);\n      }\n    }\n    _resetElementAttributes(selector, styleProperty) {\n      const manipulationCallBack = element => {\n        const value = Manipulator.getDataAttribute(element, styleProperty);\n        // We only want to remove the property if the value is `null`; the value can also be zero\n        if (value === null) {\n          element.style.removeProperty(styleProperty);\n          return;\n        }\n        Manipulator.removeDataAttribute(element, styleProperty);\n        element.style.setProperty(styleProperty, value);\n      };\n      this._applyManipulationCallback(selector, manipulationCallBack);\n    }\n    _applyManipulationCallback(selector, callBack) {\n      if (isElement$1(selector)) {\n        callBack(selector);\n        return;\n      }\n      for (const sel of SelectorEngine.find(selector, this._element)) {\n        callBack(sel);\n      }\n    }\n  }\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap modal.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n\n  /**\n   * Constants\n   */\n\n  const NAME$7 = 'modal';\n  const DATA_KEY$4 = 'bs.modal';\n  const EVENT_KEY$4 = `.${DATA_KEY$4}`;\n  const DATA_API_KEY$2 = '.data-api';\n  const ESCAPE_KEY$1 = 'Escape';\n  const EVENT_HIDE$4 = `hide${EVENT_KEY$4}`;\n  const EVENT_HIDE_PREVENTED$1 = `hidePrevented${EVENT_KEY$4}`;\n  const EVENT_HIDDEN$4 = `hidden${EVENT_KEY$4}`;\n  const EVENT_SHOW$4 = `show${EVENT_KEY$4}`;\n  const EVENT_SHOWN$4 = `shown${EVENT_KEY$4}`;\n  const EVENT_RESIZE$1 = `resize${EVENT_KEY$4}`;\n  const EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY$4}`;\n  const EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY$4}`;\n  const EVENT_KEYDOWN_DISMISS$1 = `keydown.dismiss${EVENT_KEY$4}`;\n  const EVENT_CLICK_DATA_API$2 = `click${EVENT_KEY$4}${DATA_API_KEY$2}`;\n  const CLASS_NAME_OPEN = 'modal-open';\n  const CLASS_NAME_FADE$3 = 'fade';\n  const CLASS_NAME_SHOW$4 = 'show';\n  const CLASS_NAME_STATIC = 'modal-static';\n  const OPEN_SELECTOR$1 = '.modal.show';\n  const SELECTOR_DIALOG = '.modal-dialog';\n  const SELECTOR_MODAL_BODY = '.modal-body';\n  const SELECTOR_DATA_TOGGLE$2 = '[data-bs-toggle=\"modal\"]';\n  const Default$6 = {\n    backdrop: true,\n    focus: true,\n    keyboard: true\n  };\n  const DefaultType$6 = {\n    backdrop: '(boolean|string)',\n    focus: 'boolean',\n    keyboard: 'boolean'\n  };\n\n  /**\n   * Class definition\n   */\n\n  class Modal extends BaseComponent {\n    constructor(element, config) {\n      super(element, config);\n      this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, this._element);\n      this._backdrop = this._initializeBackDrop();\n      this._focustrap = this._initializeFocusTrap();\n      this._isShown = false;\n      this._isTransitioning = false;\n      this._scrollBar = new ScrollBarHelper();\n      this._addEventListeners();\n    }\n\n    // Getters\n    static get Default() {\n      return Default$6;\n    }\n    static get DefaultType() {\n      return DefaultType$6;\n    }\n    static get NAME() {\n      return NAME$7;\n    }\n\n    // Public\n    toggle(relatedTarget) {\n      return this._isShown ? this.hide() : this.show(relatedTarget);\n    }\n    show(relatedTarget) {\n      if (this._isShown || this._isTransitioning) {\n        return;\n      }\n      const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$4, {\n        relatedTarget\n      });\n      if (showEvent.defaultPrevented) {\n        return;\n      }\n      this._isShown = true;\n      this._isTransitioning = true;\n      this._scrollBar.hide();\n      document.body.classList.add(CLASS_NAME_OPEN);\n      this._adjustDialog();\n      this._backdrop.show(() => this._showElement(relatedTarget));\n    }\n    hide() {\n      if (!this._isShown || this._isTransitioning) {\n        return;\n      }\n      const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$4);\n      if (hideEvent.defaultPrevented) {\n        return;\n      }\n      this._isShown = false;\n      this._isTransitioning = true;\n      this._focustrap.deactivate();\n      this._element.classList.remove(CLASS_NAME_SHOW$4);\n      this._queueCallback(() => this._hideModal(), this._element, this._isAnimated());\n    }\n    dispose() {\n      EventHandler.off(window, EVENT_KEY$4);\n      EventHandler.off(this._dialog, EVENT_KEY$4);\n      this._backdrop.dispose();\n      this._focustrap.deactivate();\n      super.dispose();\n    }\n    handleUpdate() {\n      this._adjustDialog();\n    }\n\n    // Private\n    _initializeBackDrop() {\n      return new Backdrop({\n        isVisible: Boolean(this._config.backdrop),\n        // 'static' option will be translated to true, and booleans will keep their value,\n        isAnimated: this._isAnimated()\n      });\n    }\n    _initializeFocusTrap() {\n      return new FocusTrap({\n        trapElement: this._element\n      });\n    }\n    _showElement(relatedTarget) {\n      // try to append dynamic modal\n      if (!document.body.contains(this._element)) {\n        document.body.append(this._element);\n      }\n      this._element.style.display = 'block';\n      this._element.removeAttribute('aria-hidden');\n      this._element.setAttribute('aria-modal', true);\n      this._element.setAttribute('role', 'dialog');\n      this._element.scrollTop = 0;\n      const modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog);\n      if (modalBody) {\n        modalBody.scrollTop = 0;\n      }\n      reflow(this._element);\n      this._element.classList.add(CLASS_NAME_SHOW$4);\n      const transitionComplete = () => {\n        if (this._config.focus) {\n          this._focustrap.activate();\n        }\n        this._isTransitioning = false;\n        EventHandler.trigger(this._element, EVENT_SHOWN$4, {\n          relatedTarget\n        });\n      };\n      this._queueCallback(transitionComplete, this._dialog, this._isAnimated());\n    }\n    _addEventListeners() {\n      EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS$1, event => {\n        if (event.key !== ESCAPE_KEY$1) {\n          return;\n        }\n        if (this._config.keyboard) {\n          this.hide();\n          return;\n        }\n        this._triggerBackdropTransition();\n      });\n      EventHandler.on(window, EVENT_RESIZE$1, () => {\n        if (this._isShown && !this._isTransitioning) {\n          this._adjustDialog();\n        }\n      });\n      EventHandler.on(this._element, EVENT_MOUSEDOWN_DISMISS, event => {\n        // a bad trick to segregate clicks that may start inside dialog but end outside, and avoid listen to scrollbar clicks\n        EventHandler.one(this._element, EVENT_CLICK_DISMISS, event2 => {\n          if (this._element !== event.target || this._element !== event2.target) {\n            return;\n          }\n          if (this._config.backdrop === 'static') {\n            this._triggerBackdropTransition();\n            return;\n          }\n          if (this._config.backdrop) {\n            this.hide();\n          }\n        });\n      });\n    }\n    _hideModal() {\n      this._element.style.display = 'none';\n      this._element.setAttribute('aria-hidden', true);\n      this._element.removeAttribute('aria-modal');\n      this._element.removeAttribute('role');\n      this._isTransitioning = false;\n      this._backdrop.hide(() => {\n        document.body.classList.remove(CLASS_NAME_OPEN);\n        this._resetAdjustments();\n        this._scrollBar.reset();\n        EventHandler.trigger(this._element, EVENT_HIDDEN$4);\n      });\n    }\n    _isAnimated() {\n      return this._element.classList.contains(CLASS_NAME_FADE$3);\n    }\n    _triggerBackdropTransition() {\n      const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED$1);\n      if (hideEvent.defaultPrevented) {\n        return;\n      }\n      const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;\n      const initialOverflowY = this._element.style.overflowY;\n      // return if the following background transition hasn't yet completed\n      if (initialOverflowY === 'hidden' || this._element.classList.contains(CLASS_NAME_STATIC)) {\n        return;\n      }\n      if (!isModalOverflowing) {\n        this._element.style.overflowY = 'hidden';\n      }\n      this._element.classList.add(CLASS_NAME_STATIC);\n      this._queueCallback(() => {\n        this._element.classList.remove(CLASS_NAME_STATIC);\n        this._queueCallback(() => {\n          this._element.style.overflowY = initialOverflowY;\n        }, this._dialog);\n      }, this._dialog);\n      this._element.focus();\n    }\n\n    /**\n     * The following methods are used to handle overflowing modals\n     */\n\n    _adjustDialog() {\n      const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;\n      const scrollbarWidth = this._scrollBar.getWidth();\n      const isBodyOverflowing = scrollbarWidth > 0;\n      if (isBodyOverflowing && !isModalOverflowing) {\n        const property = isRTL() ? 'paddingLeft' : 'paddingRight';\n        this._element.style[property] = `${scrollbarWidth}px`;\n      }\n      if (!isBodyOverflowing && isModalOverflowing) {\n        const property = isRTL() ? 'paddingRight' : 'paddingLeft';\n        this._element.style[property] = `${scrollbarWidth}px`;\n      }\n    }\n    _resetAdjustments() {\n      this._element.style.paddingLeft = '';\n      this._element.style.paddingRight = '';\n    }\n\n    // Static\n    static jQueryInterface(config, relatedTarget) {\n      return this.each(function () {\n        const data = Modal.getOrCreateInstance(this, config);\n        if (typeof config !== 'string') {\n          return;\n        }\n        if (typeof data[config] === 'undefined') {\n          throw new TypeError(`No method named \"${config}\"`);\n        }\n        data[config](relatedTarget);\n      });\n    }\n  }\n\n  /**\n   * Data API implementation\n   */\n\n  EventHandler.on(document, EVENT_CLICK_DATA_API$2, SELECTOR_DATA_TOGGLE$2, function (event) {\n    const target = SelectorEngine.getElementFromSelector(this);\n    if (['A', 'AREA'].includes(this.tagName)) {\n      event.preventDefault();\n    }\n    EventHandler.one(target, EVENT_SHOW$4, showEvent => {\n      if (showEvent.defaultPrevented) {\n        // only register focus restorer if modal will actually get shown\n        return;\n      }\n      EventHandler.one(target, EVENT_HIDDEN$4, () => {\n        if (isVisible(this)) {\n          this.focus();\n        }\n      });\n    });\n\n    // avoid conflict when clicking modal toggler while another one is open\n    const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR$1);\n    if (alreadyOpen) {\n      Modal.getInstance(alreadyOpen).hide();\n    }\n    const data = Modal.getOrCreateInstance(target);\n    data.toggle(this);\n  });\n  enableDismissTrigger(Modal);\n\n  /**\n   * jQuery\n   */\n\n  defineJQueryPlugin(Modal);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap offcanvas.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n\n  /**\n   * Constants\n   */\n\n  const NAME$6 = 'offcanvas';\n  const DATA_KEY$3 = 'bs.offcanvas';\n  const EVENT_KEY$3 = `.${DATA_KEY$3}`;\n  const DATA_API_KEY$1 = '.data-api';\n  const EVENT_LOAD_DATA_API$2 = `load${EVENT_KEY$3}${DATA_API_KEY$1}`;\n  const ESCAPE_KEY = 'Escape';\n  const CLASS_NAME_SHOW$3 = 'show';\n  const CLASS_NAME_SHOWING$1 = 'showing';\n  const CLASS_NAME_HIDING = 'hiding';\n  const CLASS_NAME_BACKDROP = 'offcanvas-backdrop';\n  const OPEN_SELECTOR = '.offcanvas.show';\n  const EVENT_SHOW$3 = `show${EVENT_KEY$3}`;\n  const EVENT_SHOWN$3 = `shown${EVENT_KEY$3}`;\n  const EVENT_HIDE$3 = `hide${EVENT_KEY$3}`;\n  const EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY$3}`;\n  const EVENT_HIDDEN$3 = `hidden${EVENT_KEY$3}`;\n  const EVENT_RESIZE = `resize${EVENT_KEY$3}`;\n  const EVENT_CLICK_DATA_API$1 = `click${EVENT_KEY$3}${DATA_API_KEY$1}`;\n  const EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY$3}`;\n  const SELECTOR_DATA_TOGGLE$1 = '[data-bs-toggle=\"offcanvas\"]';\n  const Default$5 = {\n    backdrop: true,\n    keyboard: true,\n    scroll: false\n  };\n  const DefaultType$5 = {\n    backdrop: '(boolean|string)',\n    keyboard: 'boolean',\n    scroll: 'boolean'\n  };\n\n  /**\n   * Class definition\n   */\n\n  class Offcanvas extends BaseComponent {\n    constructor(element, config) {\n      super(element, config);\n      this._isShown = false;\n      this._backdrop = this._initializeBackDrop();\n      this._focustrap = this._initializeFocusTrap();\n      this._addEventListeners();\n    }\n\n    // Getters\n    static get Default() {\n      return Default$5;\n    }\n    static get DefaultType() {\n      return DefaultType$5;\n    }\n    static get NAME() {\n      return NAME$6;\n    }\n\n    // Public\n    toggle(relatedTarget) {\n      return this._isShown ? this.hide() : this.show(relatedTarget);\n    }\n    show(relatedTarget) {\n      if (this._isShown) {\n        return;\n      }\n      const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$3, {\n        relatedTarget\n      });\n      if (showEvent.defaultPrevented) {\n        return;\n      }\n      this._isShown = true;\n      this._backdrop.show();\n      if (!this._config.scroll) {\n        new ScrollBarHelper().hide();\n      }\n      this._element.setAttribute('aria-modal', true);\n      this._element.setAttribute('role', 'dialog');\n      this._element.classList.add(CLASS_NAME_SHOWING$1);\n      const completeCallBack = () => {\n        if (!this._config.scroll || this._config.backdrop) {\n          this._focustrap.activate();\n        }\n        this._element.classList.add(CLASS_NAME_SHOW$3);\n        this._element.classList.remove(CLASS_NAME_SHOWING$1);\n        EventHandler.trigger(this._element, EVENT_SHOWN$3, {\n          relatedTarget\n        });\n      };\n      this._queueCallback(completeCallBack, this._element, true);\n    }\n    hide() {\n      if (!this._isShown) {\n        return;\n      }\n      const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$3);\n      if (hideEvent.defaultPrevented) {\n        return;\n      }\n      this._focustrap.deactivate();\n      this._element.blur();\n      this._isShown = false;\n      this._element.classList.add(CLASS_NAME_HIDING);\n      this._backdrop.hide();\n      const completeCallback = () => {\n        this._element.classList.remove(CLASS_NAME_SHOW$3, CLASS_NAME_HIDING);\n        this._element.removeAttribute('aria-modal');\n        this._element.removeAttribute('role');\n        if (!this._config.scroll) {\n          new ScrollBarHelper().reset();\n        }\n        EventHandler.trigger(this._element, EVENT_HIDDEN$3);\n      };\n      this._queueCallback(completeCallback, this._element, true);\n    }\n    dispose() {\n      this._backdrop.dispose();\n      this._focustrap.deactivate();\n      super.dispose();\n    }\n\n    // Private\n    _initializeBackDrop() {\n      const clickCallback = () => {\n        if (this._config.backdrop === 'static') {\n          EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED);\n          return;\n        }\n        this.hide();\n      };\n\n      // 'static' option will be translated to true, and booleans will keep their value\n      const isVisible = Boolean(this._config.backdrop);\n      return new Backdrop({\n        className: CLASS_NAME_BACKDROP,\n        isVisible,\n        isAnimated: true,\n        rootElement: this._element.parentNode,\n        clickCallback: isVisible ? clickCallback : null\n      });\n    }\n    _initializeFocusTrap() {\n      return new FocusTrap({\n        trapElement: this._element\n      });\n    }\n    _addEventListeners() {\n      EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {\n        if (event.key !== ESCAPE_KEY) {\n          return;\n        }\n        if (this._config.keyboard) {\n          this.hide();\n          return;\n        }\n        EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED);\n      });\n    }\n\n    // Static\n    static jQueryInterface(config) {\n      return this.each(function () {\n        const data = Offcanvas.getOrCreateInstance(this, config);\n        if (typeof config !== 'string') {\n          return;\n        }\n        if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n          throw new TypeError(`No method named \"${config}\"`);\n        }\n        data[config](this);\n      });\n    }\n  }\n\n  /**\n   * Data API implementation\n   */\n\n  EventHandler.on(document, EVENT_CLICK_DATA_API$1, SELECTOR_DATA_TOGGLE$1, function (event) {\n    const target = SelectorEngine.getElementFromSelector(this);\n    if (['A', 'AREA'].includes(this.tagName)) {\n      event.preventDefault();\n    }\n    if (isDisabled(this)) {\n      return;\n    }\n    EventHandler.one(target, EVENT_HIDDEN$3, () => {\n      // focus on trigger when it is closed\n      if (isVisible(this)) {\n        this.focus();\n      }\n    });\n\n    // avoid conflict when clicking a toggler of an offcanvas, while another is open\n    const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR);\n    if (alreadyOpen && alreadyOpen !== target) {\n      Offcanvas.getInstance(alreadyOpen).hide();\n    }\n    const data = Offcanvas.getOrCreateInstance(target);\n    data.toggle(this);\n  });\n  EventHandler.on(window, EVENT_LOAD_DATA_API$2, () => {\n    for (const selector of SelectorEngine.find(OPEN_SELECTOR)) {\n      Offcanvas.getOrCreateInstance(selector).show();\n    }\n  });\n  EventHandler.on(window, EVENT_RESIZE, () => {\n    for (const element of SelectorEngine.find('[aria-modal][class*=show][class*=offcanvas-]')) {\n      if (getComputedStyle(element).position !== 'fixed') {\n        Offcanvas.getOrCreateInstance(element).hide();\n      }\n    }\n  });\n  enableDismissTrigger(Offcanvas);\n\n  /**\n   * jQuery\n   */\n\n  defineJQueryPlugin(Offcanvas);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap util/sanitizer.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n  // js-docs-start allow-list\n  const ARIA_ATTRIBUTE_PATTERN = /^aria-[\\w-]*$/i;\n  const DefaultAllowlist = {\n    // Global attributes allowed on any supplied element below.\n    '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\n    a: ['target', 'href', 'title', 'rel'],\n    area: [],\n    b: [],\n    br: [],\n    col: [],\n    code: [],\n    dd: [],\n    div: [],\n    dl: [],\n    dt: [],\n    em: [],\n    hr: [],\n    h1: [],\n    h2: [],\n    h3: [],\n    h4: [],\n    h5: [],\n    h6: [],\n    i: [],\n    img: ['src', 'srcset', 'alt', 'title', 'width', 'height'],\n    li: [],\n    ol: [],\n    p: [],\n    pre: [],\n    s: [],\n    small: [],\n    span: [],\n    sub: [],\n    sup: [],\n    strong: [],\n    u: [],\n    ul: []\n  };\n  // js-docs-end allow-list\n\n  const uriAttributes = new Set(['background', 'cite', 'href', 'itemtype', 'longdesc', 'poster', 'src', 'xlink:href']);\n\n  /**\n   * A pattern that recognizes URLs that are safe wrt. XSS in URL navigation\n   * contexts.\n   *\n   * Shout-out to Angular https://github.com/angular/angular/blob/15.2.8/packages/core/src/sanitization/url_sanitizer.ts#L38\n   */\n  const SAFE_URL_PATTERN = /^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i;\n  const allowedAttribute = (attribute, allowedAttributeList) => {\n    const attributeName = attribute.nodeName.toLowerCase();\n    if (allowedAttributeList.includes(attributeName)) {\n      if (uriAttributes.has(attributeName)) {\n        return Boolean(SAFE_URL_PATTERN.test(attribute.nodeValue));\n      }\n      return true;\n    }\n\n    // Check if a regular expression validates the attribute.\n    return allowedAttributeList.filter(attributeRegex => attributeRegex instanceof RegExp).some(regex => regex.test(attributeName));\n  };\n  function sanitizeHtml(unsafeHtml, allowList, sanitizeFunction) {\n    if (!unsafeHtml.length) {\n      return unsafeHtml;\n    }\n    if (sanitizeFunction && typeof sanitizeFunction === 'function') {\n      return sanitizeFunction(unsafeHtml);\n    }\n    const domParser = new window.DOMParser();\n    const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html');\n    const elements = [].concat(...createdDocument.body.querySelectorAll('*'));\n    for (const element of elements) {\n      const elementName = element.nodeName.toLowerCase();\n      if (!Object.keys(allowList).includes(elementName)) {\n        element.remove();\n        continue;\n      }\n      const attributeList = [].concat(...element.attributes);\n      const allowedAttributes = [].concat(allowList['*'] || [], allowList[elementName] || []);\n      for (const attribute of attributeList) {\n        if (!allowedAttribute(attribute, allowedAttributes)) {\n          element.removeAttribute(attribute.nodeName);\n        }\n      }\n    }\n    return createdDocument.body.innerHTML;\n  }\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap util/template-factory.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n\n  /**\n   * Constants\n   */\n\n  const NAME$5 = 'TemplateFactory';\n  const Default$4 = {\n    allowList: DefaultAllowlist,\n    content: {},\n    // { selector : text ,  selector2 : text2 , }\n    extraClass: '',\n    html: false,\n    sanitize: true,\n    sanitizeFn: null,\n    template: '<div></div>'\n  };\n  const DefaultType$4 = {\n    allowList: 'object',\n    content: 'object',\n    extraClass: '(string|function)',\n    html: 'boolean',\n    sanitize: 'boolean',\n    sanitizeFn: '(null|function)',\n    template: 'string'\n  };\n  const DefaultContentType = {\n    entry: '(string|element|function|null)',\n    selector: '(string|element)'\n  };\n\n  /**\n   * Class definition\n   */\n\n  class TemplateFactory extends Config {\n    constructor(config) {\n      super();\n      this._config = this._getConfig(config);\n    }\n\n    // Getters\n    static get Default() {\n      return Default$4;\n    }\n    static get DefaultType() {\n      return DefaultType$4;\n    }\n    static get NAME() {\n      return NAME$5;\n    }\n\n    // Public\n    getContent() {\n      return Object.values(this._config.content).map(config => this._resolvePossibleFunction(config)).filter(Boolean);\n    }\n    hasContent() {\n      return this.getContent().length > 0;\n    }\n    changeContent(content) {\n      this._checkContent(content);\n      this._config.content = {\n        ...this._config.content,\n        ...content\n      };\n      return this;\n    }\n    toHtml() {\n      const templateWrapper = document.createElement('div');\n      templateWrapper.innerHTML = this._maybeSanitize(this._config.template);\n      for (const [selector, text] of Object.entries(this._config.content)) {\n        this._setContent(templateWrapper, text, selector);\n      }\n      const template = templateWrapper.children[0];\n      const extraClass = this._resolvePossibleFunction(this._config.extraClass);\n      if (extraClass) {\n        template.classList.add(...extraClass.split(' '));\n      }\n      return template;\n    }\n\n    // Private\n    _typeCheckConfig(config) {\n      super._typeCheckConfig(config);\n      this._checkContent(config.content);\n    }\n    _checkContent(arg) {\n      for (const [selector, content] of Object.entries(arg)) {\n        super._typeCheckConfig({\n          selector,\n          entry: content\n        }, DefaultContentType);\n      }\n    }\n    _setContent(template, content, selector) {\n      const templateElement = SelectorEngine.findOne(selector, template);\n      if (!templateElement) {\n        return;\n      }\n      content = this._resolvePossibleFunction(content);\n      if (!content) {\n        templateElement.remove();\n        return;\n      }\n      if (isElement$1(content)) {\n        this._putElementInTemplate(getElement(content), templateElement);\n        return;\n      }\n      if (this._config.html) {\n        templateElement.innerHTML = this._maybeSanitize(content);\n        return;\n      }\n      templateElement.textContent = content;\n    }\n    _maybeSanitize(arg) {\n      return this._config.sanitize ? sanitizeHtml(arg, this._config.allowList, this._config.sanitizeFn) : arg;\n    }\n    _resolvePossibleFunction(arg) {\n      return execute(arg, [undefined, this]);\n    }\n    _putElementInTemplate(element, templateElement) {\n      if (this._config.html) {\n        templateElement.innerHTML = '';\n        templateElement.append(element);\n        return;\n      }\n      templateElement.textContent = element.textContent;\n    }\n  }\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap tooltip.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n\n  /**\n   * Constants\n   */\n\n  const NAME$4 = 'tooltip';\n  const DISALLOWED_ATTRIBUTES = new Set(['sanitize', 'allowList', 'sanitizeFn']);\n  const CLASS_NAME_FADE$2 = 'fade';\n  const CLASS_NAME_MODAL = 'modal';\n  const CLASS_NAME_SHOW$2 = 'show';\n  const SELECTOR_TOOLTIP_INNER = '.tooltip-inner';\n  const SELECTOR_MODAL = `.${CLASS_NAME_MODAL}`;\n  const EVENT_MODAL_HIDE = 'hide.bs.modal';\n  const TRIGGER_HOVER = 'hover';\n  const TRIGGER_FOCUS = 'focus';\n  const TRIGGER_CLICK = 'click';\n  const TRIGGER_MANUAL = 'manual';\n  const EVENT_HIDE$2 = 'hide';\n  const EVENT_HIDDEN$2 = 'hidden';\n  const EVENT_SHOW$2 = 'show';\n  const EVENT_SHOWN$2 = 'shown';\n  const EVENT_INSERTED = 'inserted';\n  const EVENT_CLICK$1 = 'click';\n  const EVENT_FOCUSIN$1 = 'focusin';\n  const EVENT_FOCUSOUT$1 = 'focusout';\n  const EVENT_MOUSEENTER = 'mouseenter';\n  const EVENT_MOUSELEAVE = 'mouseleave';\n  const AttachmentMap = {\n    AUTO: 'auto',\n    TOP: 'top',\n    RIGHT: isRTL() ? 'left' : 'right',\n    BOTTOM: 'bottom',\n    LEFT: isRTL() ? 'right' : 'left'\n  };\n  const Default$3 = {\n    allowList: DefaultAllowlist,\n    animation: true,\n    boundary: 'clippingParents',\n    container: false,\n    customClass: '',\n    delay: 0,\n    fallbackPlacements: ['top', 'right', 'bottom', 'left'],\n    html: false,\n    offset: [0, 6],\n    placement: 'top',\n    popperConfig: null,\n    sanitize: true,\n    sanitizeFn: null,\n    selector: false,\n    template: '<div class=\"tooltip\" role=\"tooltip\">' + '<div class=\"tooltip-arrow\"></div>' + '<div class=\"tooltip-inner\"></div>' + '</div>',\n    title: '',\n    trigger: 'hover focus'\n  };\n  const DefaultType$3 = {\n    allowList: 'object',\n    animation: 'boolean',\n    boundary: '(string|element)',\n    container: '(string|element|boolean)',\n    customClass: '(string|function)',\n    delay: '(number|object)',\n    fallbackPlacements: 'array',\n    html: 'boolean',\n    offset: '(array|string|function)',\n    placement: '(string|function)',\n    popperConfig: '(null|object|function)',\n    sanitize: 'boolean',\n    sanitizeFn: '(null|function)',\n    selector: '(string|boolean)',\n    template: 'string',\n    title: '(string|element|function)',\n    trigger: 'string'\n  };\n\n  /**\n   * Class definition\n   */\n\n  class Tooltip extends BaseComponent {\n    constructor(element, config) {\n      if (typeof Popper === 'undefined') {\n        throw new TypeError('Bootstrap\\'s tooltips require Popper (https://popper.js.org/docs/v2/)');\n      }\n      super(element, config);\n\n      // Private\n      this._isEnabled = true;\n      this._timeout = 0;\n      this._isHovered = null;\n      this._activeTrigger = {};\n      this._popper = null;\n      this._templateFactory = null;\n      this._newContent = null;\n\n      // Protected\n      this.tip = null;\n      this._setListeners();\n      if (!this._config.selector) {\n        this._fixTitle();\n      }\n    }\n\n    // Getters\n    static get Default() {\n      return Default$3;\n    }\n    static get DefaultType() {\n      return DefaultType$3;\n    }\n    static get NAME() {\n      return NAME$4;\n    }\n\n    // Public\n    enable() {\n      this._isEnabled = true;\n    }\n    disable() {\n      this._isEnabled = false;\n    }\n    toggleEnabled() {\n      this._isEnabled = !this._isEnabled;\n    }\n    toggle() {\n      if (!this._isEnabled) {\n        return;\n      }\n      if (this._isShown()) {\n        this._leave();\n        return;\n      }\n      this._enter();\n    }\n    dispose() {\n      clearTimeout(this._timeout);\n      EventHandler.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);\n      if (this._element.getAttribute('data-bs-original-title')) {\n        this._element.setAttribute('title', this._element.getAttribute('data-bs-original-title'));\n      }\n      this._disposePopper();\n      super.dispose();\n    }\n    show() {\n      if (this._element.style.display === 'none') {\n        throw new Error('Please use show on visible elements');\n      }\n      if (!(this._isWithContent() && this._isEnabled)) {\n        return;\n      }\n      const showEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOW$2));\n      const shadowRoot = findShadowRoot(this._element);\n      const isInTheDom = (shadowRoot || this._element.ownerDocument.documentElement).contains(this._element);\n      if (showEvent.defaultPrevented || !isInTheDom) {\n        return;\n      }\n\n      // TODO: v6 remove this or make it optional\n      this._disposePopper();\n      const tip = this._getTipElement();\n      this._element.setAttribute('aria-describedby', tip.getAttribute('id'));\n      const {\n        container\n      } = this._config;\n      if (!this._element.ownerDocument.documentElement.contains(this.tip)) {\n        container.append(tip);\n        EventHandler.trigger(this._element, this.constructor.eventName(EVENT_INSERTED));\n      }\n      this._popper = this._createPopper(tip);\n      tip.classList.add(CLASS_NAME_SHOW$2);\n\n      // If this is a touch-enabled device we add extra\n      // empty mouseover listeners to the body's immediate children;\n      // only needed because of broken event delegation on iOS\n      // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n      if ('ontouchstart' in document.documentElement) {\n        for (const element of [].concat(...document.body.children)) {\n          EventHandler.on(element, 'mouseover', noop);\n        }\n      }\n      const complete = () => {\n        EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOWN$2));\n        if (this._isHovered === false) {\n          this._leave();\n        }\n        this._isHovered = false;\n      };\n      this._queueCallback(complete, this.tip, this._isAnimated());\n    }\n    hide() {\n      if (!this._isShown()) {\n        return;\n      }\n      const hideEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDE$2));\n      if (hideEvent.defaultPrevented) {\n        return;\n      }\n      const tip = this._getTipElement();\n      tip.classList.remove(CLASS_NAME_SHOW$2);\n\n      // If this is a touch-enabled device we remove the extra\n      // empty mouseover listeners we added for iOS support\n      if ('ontouchstart' in document.documentElement) {\n        for (const element of [].concat(...document.body.children)) {\n          EventHandler.off(element, 'mouseover', noop);\n        }\n      }\n      this._activeTrigger[TRIGGER_CLICK] = false;\n      this._activeTrigger[TRIGGER_FOCUS] = false;\n      this._activeTrigger[TRIGGER_HOVER] = false;\n      this._isHovered = null; // it is a trick to support manual triggering\n\n      const complete = () => {\n        if (this._isWithActiveTrigger()) {\n          return;\n        }\n        if (!this._isHovered) {\n          this._disposePopper();\n        }\n        this._element.removeAttribute('aria-describedby');\n        EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDDEN$2));\n      };\n      this._queueCallback(complete, this.tip, this._isAnimated());\n    }\n    update() {\n      if (this._popper) {\n        this._popper.update();\n      }\n    }\n\n    // Protected\n    _isWithContent() {\n      return Boolean(this._getTitle());\n    }\n    _getTipElement() {\n      if (!this.tip) {\n        this.tip = this._createTipElement(this._newContent || this._getContentForTemplate());\n      }\n      return this.tip;\n    }\n    _createTipElement(content) {\n      const tip = this._getTemplateFactory(content).toHtml();\n\n      // TODO: remove this check in v6\n      if (!tip) {\n        return null;\n      }\n      tip.classList.remove(CLASS_NAME_FADE$2, CLASS_NAME_SHOW$2);\n      // TODO: v6 the following can be achieved with CSS only\n      tip.classList.add(`bs-${this.constructor.NAME}-auto`);\n      const tipId = getUID(this.constructor.NAME).toString();\n      tip.setAttribute('id', tipId);\n      if (this._isAnimated()) {\n        tip.classList.add(CLASS_NAME_FADE$2);\n      }\n      return tip;\n    }\n    setContent(content) {\n      this._newContent = content;\n      if (this._isShown()) {\n        this._disposePopper();\n        this.show();\n      }\n    }\n    _getTemplateFactory(content) {\n      if (this._templateFactory) {\n        this._templateFactory.changeContent(content);\n      } else {\n        this._templateFactory = new TemplateFactory({\n          ...this._config,\n          // the `content` var has to be after `this._config`\n          // to override config.content in case of popover\n          content,\n          extraClass: this._resolvePossibleFunction(this._config.customClass)\n        });\n      }\n      return this._templateFactory;\n    }\n    _getContentForTemplate() {\n      return {\n        [SELECTOR_TOOLTIP_INNER]: this._getTitle()\n      };\n    }\n    _getTitle() {\n      return this._resolvePossibleFunction(this._config.title) || this._element.getAttribute('data-bs-original-title');\n    }\n\n    // Private\n    _initializeOnDelegatedTarget(event) {\n      return this.constructor.getOrCreateInstance(event.delegateTarget, this._getDelegateConfig());\n    }\n    _isAnimated() {\n      return this._config.animation || this.tip && this.tip.classList.contains(CLASS_NAME_FADE$2);\n    }\n    _isShown() {\n      return this.tip && this.tip.classList.contains(CLASS_NAME_SHOW$2);\n    }\n    _createPopper(tip) {\n      const placement = execute(this._config.placement, [this, tip, this._element]);\n      const attachment = AttachmentMap[placement.toUpperCase()];\n      return createPopper(this._element, tip, this._getPopperConfig(attachment));\n    }\n    _getOffset() {\n      const {\n        offset\n      } = this._config;\n      if (typeof offset === 'string') {\n        return offset.split(',').map(value => Number.parseInt(value, 10));\n      }\n      if (typeof offset === 'function') {\n        return popperData => offset(popperData, this._element);\n      }\n      return offset;\n    }\n    _resolvePossibleFunction(arg) {\n      return execute(arg, [this._element, this._element]);\n    }\n    _getPopperConfig(attachment) {\n      const defaultBsPopperConfig = {\n        placement: attachment,\n        modifiers: [{\n          name: 'flip',\n          options: {\n            fallbackPlacements: this._config.fallbackPlacements\n          }\n        }, {\n          name: 'offset',\n          options: {\n            offset: this._getOffset()\n          }\n        }, {\n          name: 'preventOverflow',\n          options: {\n            boundary: this._config.boundary\n          }\n        }, {\n          name: 'arrow',\n          options: {\n            element: `.${this.constructor.NAME}-arrow`\n          }\n        }, {\n          name: 'preSetPlacement',\n          enabled: true,\n          phase: 'beforeMain',\n          fn: data => {\n            // Pre-set Popper's placement attribute in order to read the arrow sizes properly.\n            // Otherwise, Popper mixes up the width and height dimensions since the initial arrow style is for top placement\n            this._getTipElement().setAttribute('data-popper-placement', data.state.placement);\n          }\n        }]\n      };\n      return {\n        ...defaultBsPopperConfig,\n        ...execute(this._config.popperConfig, [undefined, defaultBsPopperConfig])\n      };\n    }\n    _setListeners() {\n      const triggers = this._config.trigger.split(' ');\n      for (const trigger of triggers) {\n        if (trigger === 'click') {\n          EventHandler.on(this._element, this.constructor.eventName(EVENT_CLICK$1), this._config.selector, event => {\n            const context = this._initializeOnDelegatedTarget(event);\n            context._activeTrigger[TRIGGER_CLICK] = !(context._isShown() && context._activeTrigger[TRIGGER_CLICK]);\n            context.toggle();\n          });\n        } else if (trigger !== TRIGGER_MANUAL) {\n          const eventIn = trigger === TRIGGER_HOVER ? this.constructor.eventName(EVENT_MOUSEENTER) : this.constructor.eventName(EVENT_FOCUSIN$1);\n          const eventOut = trigger === TRIGGER_HOVER ? this.constructor.eventName(EVENT_MOUSELEAVE) : this.constructor.eventName(EVENT_FOCUSOUT$1);\n          EventHandler.on(this._element, eventIn, this._config.selector, event => {\n            const context = this._initializeOnDelegatedTarget(event);\n            context._activeTrigger[event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER] = true;\n            context._enter();\n          });\n          EventHandler.on(this._element, eventOut, this._config.selector, event => {\n            const context = this._initializeOnDelegatedTarget(event);\n            context._activeTrigger[event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER] = context._element.contains(event.relatedTarget);\n            context._leave();\n          });\n        }\n      }\n      this._hideModalHandler = () => {\n        if (this._element) {\n          this.hide();\n        }\n      };\n      EventHandler.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);\n    }\n    _fixTitle() {\n      const title = this._element.getAttribute('title');\n      if (!title) {\n        return;\n      }\n      if (!this._element.getAttribute('aria-label') && !this._element.textContent.trim()) {\n        this._element.setAttribute('aria-label', title);\n      }\n      this._element.setAttribute('data-bs-original-title', title); // DO NOT USE IT. Is only for backwards compatibility\n      this._element.removeAttribute('title');\n    }\n    _enter() {\n      if (this._isShown() || this._isHovered) {\n        this._isHovered = true;\n        return;\n      }\n      this._isHovered = true;\n      this._setTimeout(() => {\n        if (this._isHovered) {\n          this.show();\n        }\n      }, this._config.delay.show);\n    }\n    _leave() {\n      if (this._isWithActiveTrigger()) {\n        return;\n      }\n      this._isHovered = false;\n      this._setTimeout(() => {\n        if (!this._isHovered) {\n          this.hide();\n        }\n      }, this._config.delay.hide);\n    }\n    _setTimeout(handler, timeout) {\n      clearTimeout(this._timeout);\n      this._timeout = setTimeout(handler, timeout);\n    }\n    _isWithActiveTrigger() {\n      return Object.values(this._activeTrigger).includes(true);\n    }\n    _getConfig(config) {\n      const dataAttributes = Manipulator.getDataAttributes(this._element);\n      for (const dataAttribute of Object.keys(dataAttributes)) {\n        if (DISALLOWED_ATTRIBUTES.has(dataAttribute)) {\n          delete dataAttributes[dataAttribute];\n        }\n      }\n      config = {\n        ...dataAttributes,\n        ...(typeof config === 'object' && config ? config : {})\n      };\n      config = this._mergeConfigObj(config);\n      config = this._configAfterMerge(config);\n      this._typeCheckConfig(config);\n      return config;\n    }\n    _configAfterMerge(config) {\n      config.container = config.container === false ? document.body : getElement(config.container);\n      if (typeof config.delay === 'number') {\n        config.delay = {\n          show: config.delay,\n          hide: config.delay\n        };\n      }\n      if (typeof config.title === 'number') {\n        config.title = config.title.toString();\n      }\n      if (typeof config.content === 'number') {\n        config.content = config.content.toString();\n      }\n      return config;\n    }\n    _getDelegateConfig() {\n      const config = {};\n      for (const [key, value] of Object.entries(this._config)) {\n        if (this.constructor.Default[key] !== value) {\n          config[key] = value;\n        }\n      }\n      config.selector = false;\n      config.trigger = 'manual';\n\n      // In the future can be replaced with:\n      // const keysWithDifferentValues = Object.entries(this._config).filter(entry => this.constructor.Default[entry[0]] !== this._config[entry[0]])\n      // `Object.fromEntries(keysWithDifferentValues)`\n      return config;\n    }\n    _disposePopper() {\n      if (this._popper) {\n        this._popper.destroy();\n        this._popper = null;\n      }\n      if (this.tip) {\n        this.tip.remove();\n        this.tip = null;\n      }\n    }\n\n    // Static\n    static jQueryInterface(config) {\n      return this.each(function () {\n        const data = Tooltip.getOrCreateInstance(this, config);\n        if (typeof config !== 'string') {\n          return;\n        }\n        if (typeof data[config] === 'undefined') {\n          throw new TypeError(`No method named \"${config}\"`);\n        }\n        data[config]();\n      });\n    }\n  }\n\n  /**\n   * jQuery\n   */\n\n  defineJQueryPlugin(Tooltip);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap popover.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n\n  /**\n   * Constants\n   */\n\n  const NAME$3 = 'popover';\n  const SELECTOR_TITLE = '.popover-header';\n  const SELECTOR_CONTENT = '.popover-body';\n  const Default$2 = {\n    ...Tooltip.Default,\n    content: '',\n    offset: [0, 8],\n    placement: 'right',\n    template: '<div class=\"popover\" role=\"tooltip\">' + '<div class=\"popover-arrow\"></div>' + '<h3 class=\"popover-header\"></h3>' + '<div class=\"popover-body\"></div>' + '</div>',\n    trigger: 'click'\n  };\n  const DefaultType$2 = {\n    ...Tooltip.DefaultType,\n    content: '(null|string|element|function)'\n  };\n\n  /**\n   * Class definition\n   */\n\n  class Popover extends Tooltip {\n    // Getters\n    static get Default() {\n      return Default$2;\n    }\n    static get DefaultType() {\n      return DefaultType$2;\n    }\n    static get NAME() {\n      return NAME$3;\n    }\n\n    // Overrides\n    _isWithContent() {\n      return this._getTitle() || this._getContent();\n    }\n\n    // Private\n    _getContentForTemplate() {\n      return {\n        [SELECTOR_TITLE]: this._getTitle(),\n        [SELECTOR_CONTENT]: this._getContent()\n      };\n    }\n    _getContent() {\n      return this._resolvePossibleFunction(this._config.content);\n    }\n\n    // Static\n    static jQueryInterface(config) {\n      return this.each(function () {\n        const data = Popover.getOrCreateInstance(this, config);\n        if (typeof config !== 'string') {\n          return;\n        }\n        if (typeof data[config] === 'undefined') {\n          throw new TypeError(`No method named \"${config}\"`);\n        }\n        data[config]();\n      });\n    }\n  }\n\n  /**\n   * jQuery\n   */\n\n  defineJQueryPlugin(Popover);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap scrollspy.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n\n  /**\n   * Constants\n   */\n\n  const NAME$2 = 'scrollspy';\n  const DATA_KEY$2 = 'bs.scrollspy';\n  const EVENT_KEY$2 = `.${DATA_KEY$2}`;\n  const DATA_API_KEY = '.data-api';\n  const EVENT_ACTIVATE = `activate${EVENT_KEY$2}`;\n  const EVENT_CLICK = `click${EVENT_KEY$2}`;\n  const EVENT_LOAD_DATA_API$1 = `load${EVENT_KEY$2}${DATA_API_KEY}`;\n  const CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item';\n  const CLASS_NAME_ACTIVE$1 = 'active';\n  const SELECTOR_DATA_SPY = '[data-bs-spy=\"scroll\"]';\n  const SELECTOR_TARGET_LINKS = '[href]';\n  const SELECTOR_NAV_LIST_GROUP = '.nav, .list-group';\n  const SELECTOR_NAV_LINKS = '.nav-link';\n  const SELECTOR_NAV_ITEMS = '.nav-item';\n  const SELECTOR_LIST_ITEMS = '.list-group-item';\n  const SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_NAV_ITEMS} > ${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`;\n  const SELECTOR_DROPDOWN = '.dropdown';\n  const SELECTOR_DROPDOWN_TOGGLE$1 = '.dropdown-toggle';\n  const Default$1 = {\n    offset: null,\n    // TODO: v6 @deprecated, keep it for backwards compatibility reasons\n    rootMargin: '0px 0px -25%',\n    smoothScroll: false,\n    target: null,\n    threshold: [0.1, 0.5, 1]\n  };\n  const DefaultType$1 = {\n    offset: '(number|null)',\n    // TODO v6 @deprecated, keep it for backwards compatibility reasons\n    rootMargin: 'string',\n    smoothScroll: 'boolean',\n    target: 'element',\n    threshold: 'array'\n  };\n\n  /**\n   * Class definition\n   */\n\n  class ScrollSpy extends BaseComponent {\n    constructor(element, config) {\n      super(element, config);\n\n      // this._element is the observablesContainer and config.target the menu links wrapper\n      this._targetLinks = new Map();\n      this._observableSections = new Map();\n      this._rootElement = getComputedStyle(this._element).overflowY === 'visible' ? null : this._element;\n      this._activeTarget = null;\n      this._observer = null;\n      this._previousScrollData = {\n        visibleEntryTop: 0,\n        parentScrollTop: 0\n      };\n      this.refresh(); // initialize\n    }\n\n    // Getters\n    static get Default() {\n      return Default$1;\n    }\n    static get DefaultType() {\n      return DefaultType$1;\n    }\n    static get NAME() {\n      return NAME$2;\n    }\n\n    // Public\n    refresh() {\n      this._initializeTargetsAndObservables();\n      this._maybeEnableSmoothScroll();\n      if (this._observer) {\n        this._observer.disconnect();\n      } else {\n        this._observer = this._getNewObserver();\n      }\n      for (const section of this._observableSections.values()) {\n        this._observer.observe(section);\n      }\n    }\n    dispose() {\n      this._observer.disconnect();\n      super.dispose();\n    }\n\n    // Private\n    _configAfterMerge(config) {\n      // TODO: on v6 target should be given explicitly & remove the {target: 'ss-target'} case\n      config.target = getElement(config.target) || document.body;\n\n      // TODO: v6 Only for backwards compatibility reasons. Use rootMargin only\n      config.rootMargin = config.offset ? `${config.offset}px 0px -30%` : config.rootMargin;\n      if (typeof config.threshold === 'string') {\n        config.threshold = config.threshold.split(',').map(value => Number.parseFloat(value));\n      }\n      return config;\n    }\n    _maybeEnableSmoothScroll() {\n      if (!this._config.smoothScroll) {\n        return;\n      }\n\n      // unregister any previous listeners\n      EventHandler.off(this._config.target, EVENT_CLICK);\n      EventHandler.on(this._config.target, EVENT_CLICK, SELECTOR_TARGET_LINKS, event => {\n        const observableSection = this._observableSections.get(event.target.hash);\n        if (observableSection) {\n          event.preventDefault();\n          const root = this._rootElement || window;\n          const height = observableSection.offsetTop - this._element.offsetTop;\n          if (root.scrollTo) {\n            root.scrollTo({\n              top: height,\n              behavior: 'smooth'\n            });\n            return;\n          }\n\n          // Chrome 60 doesn't support `scrollTo`\n          root.scrollTop = height;\n        }\n      });\n    }\n    _getNewObserver() {\n      const options = {\n        root: this._rootElement,\n        threshold: this._config.threshold,\n        rootMargin: this._config.rootMargin\n      };\n      return new IntersectionObserver(entries => this._observerCallback(entries), options);\n    }\n\n    // The logic of selection\n    _observerCallback(entries) {\n      const targetElement = entry => this._targetLinks.get(`#${entry.target.id}`);\n      const activate = entry => {\n        this._previousScrollData.visibleEntryTop = entry.target.offsetTop;\n        this._process(targetElement(entry));\n      };\n      const parentScrollTop = (this._rootElement || document.documentElement).scrollTop;\n      const userScrollsDown = parentScrollTop >= this._previousScrollData.parentScrollTop;\n      this._previousScrollData.parentScrollTop = parentScrollTop;\n      for (const entry of entries) {\n        if (!entry.isIntersecting) {\n          this._activeTarget = null;\n          this._clearActiveClass(targetElement(entry));\n          continue;\n        }\n        const entryIsLowerThanPrevious = entry.target.offsetTop >= this._previousScrollData.visibleEntryTop;\n        // if we are scrolling down, pick the bigger offsetTop\n        if (userScrollsDown && entryIsLowerThanPrevious) {\n          activate(entry);\n          // if parent isn't scrolled, let's keep the first visible item, breaking the iteration\n          if (!parentScrollTop) {\n            return;\n          }\n          continue;\n        }\n\n        // if we are scrolling up, pick the smallest offsetTop\n        if (!userScrollsDown && !entryIsLowerThanPrevious) {\n          activate(entry);\n        }\n      }\n    }\n    _initializeTargetsAndObservables() {\n      this._targetLinks = new Map();\n      this._observableSections = new Map();\n      const targetLinks = SelectorEngine.find(SELECTOR_TARGET_LINKS, this._config.target);\n      for (const anchor of targetLinks) {\n        // ensure that the anchor has an id and is not disabled\n        if (!anchor.hash || isDisabled(anchor)) {\n          continue;\n        }\n        const observableSection = SelectorEngine.findOne(decodeURI(anchor.hash), this._element);\n\n        // ensure that the observableSection exists & is visible\n        if (isVisible(observableSection)) {\n          this._targetLinks.set(decodeURI(anchor.hash), anchor);\n          this._observableSections.set(anchor.hash, observableSection);\n        }\n      }\n    }\n    _process(target) {\n      if (this._activeTarget === target) {\n        return;\n      }\n      this._clearActiveClass(this._config.target);\n      this._activeTarget = target;\n      target.classList.add(CLASS_NAME_ACTIVE$1);\n      this._activateParents(target);\n      EventHandler.trigger(this._element, EVENT_ACTIVATE, {\n        relatedTarget: target\n      });\n    }\n    _activateParents(target) {\n      // Activate dropdown parents\n      if (target.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) {\n        SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE$1, target.closest(SELECTOR_DROPDOWN)).classList.add(CLASS_NAME_ACTIVE$1);\n        return;\n      }\n      for (const listGroup of SelectorEngine.parents(target, SELECTOR_NAV_LIST_GROUP)) {\n        // Set triggered links parents as active\n        // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor\n        for (const item of SelectorEngine.prev(listGroup, SELECTOR_LINK_ITEMS)) {\n          item.classList.add(CLASS_NAME_ACTIVE$1);\n        }\n      }\n    }\n    _clearActiveClass(parent) {\n      parent.classList.remove(CLASS_NAME_ACTIVE$1);\n      const activeNodes = SelectorEngine.find(`${SELECTOR_TARGET_LINKS}.${CLASS_NAME_ACTIVE$1}`, parent);\n      for (const node of activeNodes) {\n        node.classList.remove(CLASS_NAME_ACTIVE$1);\n      }\n    }\n\n    // Static\n    static jQueryInterface(config) {\n      return this.each(function () {\n        const data = ScrollSpy.getOrCreateInstance(this, config);\n        if (typeof config !== 'string') {\n          return;\n        }\n        if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n          throw new TypeError(`No method named \"${config}\"`);\n        }\n        data[config]();\n      });\n    }\n  }\n\n  /**\n   * Data API implementation\n   */\n\n  EventHandler.on(window, EVENT_LOAD_DATA_API$1, () => {\n    for (const spy of SelectorEngine.find(SELECTOR_DATA_SPY)) {\n      ScrollSpy.getOrCreateInstance(spy);\n    }\n  });\n\n  /**\n   * jQuery\n   */\n\n  defineJQueryPlugin(ScrollSpy);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap tab.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n\n  /**\n   * Constants\n   */\n\n  const NAME$1 = 'tab';\n  const DATA_KEY$1 = 'bs.tab';\n  const EVENT_KEY$1 = `.${DATA_KEY$1}`;\n  const EVENT_HIDE$1 = `hide${EVENT_KEY$1}`;\n  const EVENT_HIDDEN$1 = `hidden${EVENT_KEY$1}`;\n  const EVENT_SHOW$1 = `show${EVENT_KEY$1}`;\n  const EVENT_SHOWN$1 = `shown${EVENT_KEY$1}`;\n  const EVENT_CLICK_DATA_API = `click${EVENT_KEY$1}`;\n  const EVENT_KEYDOWN = `keydown${EVENT_KEY$1}`;\n  const EVENT_LOAD_DATA_API = `load${EVENT_KEY$1}`;\n  const ARROW_LEFT_KEY = 'ArrowLeft';\n  const ARROW_RIGHT_KEY = 'ArrowRight';\n  const ARROW_UP_KEY = 'ArrowUp';\n  const ARROW_DOWN_KEY = 'ArrowDown';\n  const HOME_KEY = 'Home';\n  const END_KEY = 'End';\n  const CLASS_NAME_ACTIVE = 'active';\n  const CLASS_NAME_FADE$1 = 'fade';\n  const CLASS_NAME_SHOW$1 = 'show';\n  const CLASS_DROPDOWN = 'dropdown';\n  const SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle';\n  const SELECTOR_DROPDOWN_MENU = '.dropdown-menu';\n  const NOT_SELECTOR_DROPDOWN_TOGGLE = `:not(${SELECTOR_DROPDOWN_TOGGLE})`;\n  const SELECTOR_TAB_PANEL = '.list-group, .nav, [role=\"tablist\"]';\n  const SELECTOR_OUTER = '.nav-item, .list-group-item';\n  const SELECTOR_INNER = `.nav-link${NOT_SELECTOR_DROPDOWN_TOGGLE}, .list-group-item${NOT_SELECTOR_DROPDOWN_TOGGLE}, [role=\"tab\"]${NOT_SELECTOR_DROPDOWN_TOGGLE}`;\n  const SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"tab\"], [data-bs-toggle=\"pill\"], [data-bs-toggle=\"list\"]'; // TODO: could only be `tab` in v6\n  const SELECTOR_INNER_ELEM = `${SELECTOR_INNER}, ${SELECTOR_DATA_TOGGLE}`;\n  const SELECTOR_DATA_TOGGLE_ACTIVE = `.${CLASS_NAME_ACTIVE}[data-bs-toggle=\"tab\"], .${CLASS_NAME_ACTIVE}[data-bs-toggle=\"pill\"], .${CLASS_NAME_ACTIVE}[data-bs-toggle=\"list\"]`;\n\n  /**\n   * Class definition\n   */\n\n  class Tab extends BaseComponent {\n    constructor(element) {\n      super(element);\n      this._parent = this._element.closest(SELECTOR_TAB_PANEL);\n      if (!this._parent) {\n        return;\n        // TODO: should throw exception in v6\n        // throw new TypeError(`${element.outerHTML} has not a valid parent ${SELECTOR_INNER_ELEM}`)\n      }\n\n      // Set up initial aria attributes\n      this._setInitialAttributes(this._parent, this._getChildren());\n      EventHandler.on(this._element, EVENT_KEYDOWN, event => this._keydown(event));\n    }\n\n    // Getters\n    static get NAME() {\n      return NAME$1;\n    }\n\n    // Public\n    show() {\n      // Shows this elem and deactivate the active sibling if exists\n      const innerElem = this._element;\n      if (this._elemIsActive(innerElem)) {\n        return;\n      }\n\n      // Search for active tab on same parent to deactivate it\n      const active = this._getActiveElem();\n      const hideEvent = active ? EventHandler.trigger(active, EVENT_HIDE$1, {\n        relatedTarget: innerElem\n      }) : null;\n      const showEvent = EventHandler.trigger(innerElem, EVENT_SHOW$1, {\n        relatedTarget: active\n      });\n      if (showEvent.defaultPrevented || hideEvent && hideEvent.defaultPrevented) {\n        return;\n      }\n      this._deactivate(active, innerElem);\n      this._activate(innerElem, active);\n    }\n\n    // Private\n    _activate(element, relatedElem) {\n      if (!element) {\n        return;\n      }\n      element.classList.add(CLASS_NAME_ACTIVE);\n      this._activate(SelectorEngine.getElementFromSelector(element)); // Search and activate/show the proper section\n\n      const complete = () => {\n        if (element.getAttribute('role') !== 'tab') {\n          element.classList.add(CLASS_NAME_SHOW$1);\n          return;\n        }\n        element.removeAttribute('tabindex');\n        element.setAttribute('aria-selected', true);\n        this._toggleDropDown(element, true);\n        EventHandler.trigger(element, EVENT_SHOWN$1, {\n          relatedTarget: relatedElem\n        });\n      };\n      this._queueCallback(complete, element, element.classList.contains(CLASS_NAME_FADE$1));\n    }\n    _deactivate(element, relatedElem) {\n      if (!element) {\n        return;\n      }\n      element.classList.remove(CLASS_NAME_ACTIVE);\n      element.blur();\n      this._deactivate(SelectorEngine.getElementFromSelector(element)); // Search and deactivate the shown section too\n\n      const complete = () => {\n        if (element.getAttribute('role') !== 'tab') {\n          element.classList.remove(CLASS_NAME_SHOW$1);\n          return;\n        }\n        element.setAttribute('aria-selected', false);\n        element.setAttribute('tabindex', '-1');\n        this._toggleDropDown(element, false);\n        EventHandler.trigger(element, EVENT_HIDDEN$1, {\n          relatedTarget: relatedElem\n        });\n      };\n      this._queueCallback(complete, element, element.classList.contains(CLASS_NAME_FADE$1));\n    }\n    _keydown(event) {\n      if (![ARROW_LEFT_KEY, ARROW_RIGHT_KEY, ARROW_UP_KEY, ARROW_DOWN_KEY, HOME_KEY, END_KEY].includes(event.key)) {\n        return;\n      }\n      event.stopPropagation(); // stopPropagation/preventDefault both added to support up/down keys without scrolling the page\n      event.preventDefault();\n      const children = this._getChildren().filter(element => !isDisabled(element));\n      let nextActiveElement;\n      if ([HOME_KEY, END_KEY].includes(event.key)) {\n        nextActiveElement = children[event.key === HOME_KEY ? 0 : children.length - 1];\n      } else {\n        const isNext = [ARROW_RIGHT_KEY, ARROW_DOWN_KEY].includes(event.key);\n        nextActiveElement = getNextActiveElement(children, event.target, isNext, true);\n      }\n      if (nextActiveElement) {\n        nextActiveElement.focus({\n          preventScroll: true\n        });\n        Tab.getOrCreateInstance(nextActiveElement).show();\n      }\n    }\n    _getChildren() {\n      // collection of inner elements\n      return SelectorEngine.find(SELECTOR_INNER_ELEM, this._parent);\n    }\n    _getActiveElem() {\n      return this._getChildren().find(child => this._elemIsActive(child)) || null;\n    }\n    _setInitialAttributes(parent, children) {\n      this._setAttributeIfNotExists(parent, 'role', 'tablist');\n      for (const child of children) {\n        this._setInitialAttributesOnChild(child);\n      }\n    }\n    _setInitialAttributesOnChild(child) {\n      child = this._getInnerElement(child);\n      const isActive = this._elemIsActive(child);\n      const outerElem = this._getOuterElement(child);\n      child.setAttribute('aria-selected', isActive);\n      if (outerElem !== child) {\n        this._setAttributeIfNotExists(outerElem, 'role', 'presentation');\n      }\n      if (!isActive) {\n        child.setAttribute('tabindex', '-1');\n      }\n      this._setAttributeIfNotExists(child, 'role', 'tab');\n\n      // set attributes to the related panel too\n      this._setInitialAttributesOnTargetPanel(child);\n    }\n    _setInitialAttributesOnTargetPanel(child) {\n      const target = SelectorEngine.getElementFromSelector(child);\n      if (!target) {\n        return;\n      }\n      this._setAttributeIfNotExists(target, 'role', 'tabpanel');\n      if (child.id) {\n        this._setAttributeIfNotExists(target, 'aria-labelledby', `${child.id}`);\n      }\n    }\n    _toggleDropDown(element, open) {\n      const outerElem = this._getOuterElement(element);\n      if (!outerElem.classList.contains(CLASS_DROPDOWN)) {\n        return;\n      }\n      const toggle = (selector, className) => {\n        const element = SelectorEngine.findOne(selector, outerElem);\n        if (element) {\n          element.classList.toggle(className, open);\n        }\n      };\n      toggle(SELECTOR_DROPDOWN_TOGGLE, CLASS_NAME_ACTIVE);\n      toggle(SELECTOR_DROPDOWN_MENU, CLASS_NAME_SHOW$1);\n      outerElem.setAttribute('aria-expanded', open);\n    }\n    _setAttributeIfNotExists(element, attribute, value) {\n      if (!element.hasAttribute(attribute)) {\n        element.setAttribute(attribute, value);\n      }\n    }\n    _elemIsActive(elem) {\n      return elem.classList.contains(CLASS_NAME_ACTIVE);\n    }\n\n    // Try to get the inner element (usually the .nav-link)\n    _getInnerElement(elem) {\n      return elem.matches(SELECTOR_INNER_ELEM) ? elem : SelectorEngine.findOne(SELECTOR_INNER_ELEM, elem);\n    }\n\n    // Try to get the outer element (usually the .nav-item)\n    _getOuterElement(elem) {\n      return elem.closest(SELECTOR_OUTER) || elem;\n    }\n\n    // Static\n    static jQueryInterface(config) {\n      return this.each(function () {\n        const data = Tab.getOrCreateInstance(this);\n        if (typeof config !== 'string') {\n          return;\n        }\n        if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n          throw new TypeError(`No method named \"${config}\"`);\n        }\n        data[config]();\n      });\n    }\n  }\n\n  /**\n   * Data API implementation\n   */\n\n  EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n    if (['A', 'AREA'].includes(this.tagName)) {\n      event.preventDefault();\n    }\n    if (isDisabled(this)) {\n      return;\n    }\n    Tab.getOrCreateInstance(this).show();\n  });\n\n  /**\n   * Initialize on focus\n   */\n  EventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n    for (const element of SelectorEngine.find(SELECTOR_DATA_TOGGLE_ACTIVE)) {\n      Tab.getOrCreateInstance(element);\n    }\n  });\n  /**\n   * jQuery\n   */\n\n  defineJQueryPlugin(Tab);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap toast.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n\n  /**\n   * Constants\n   */\n\n  const NAME = 'toast';\n  const DATA_KEY = 'bs.toast';\n  const EVENT_KEY = `.${DATA_KEY}`;\n  const EVENT_MOUSEOVER = `mouseover${EVENT_KEY}`;\n  const EVENT_MOUSEOUT = `mouseout${EVENT_KEY}`;\n  const EVENT_FOCUSIN = `focusin${EVENT_KEY}`;\n  const EVENT_FOCUSOUT = `focusout${EVENT_KEY}`;\n  const EVENT_HIDE = `hide${EVENT_KEY}`;\n  const EVENT_HIDDEN = `hidden${EVENT_KEY}`;\n  const EVENT_SHOW = `show${EVENT_KEY}`;\n  const EVENT_SHOWN = `shown${EVENT_KEY}`;\n  const CLASS_NAME_FADE = 'fade';\n  const CLASS_NAME_HIDE = 'hide'; // @deprecated - kept here only for backwards compatibility\n  const CLASS_NAME_SHOW = 'show';\n  const CLASS_NAME_SHOWING = 'showing';\n  const DefaultType = {\n    animation: 'boolean',\n    autohide: 'boolean',\n    delay: 'number'\n  };\n  const Default = {\n    animation: true,\n    autohide: true,\n    delay: 5000\n  };\n\n  /**\n   * Class definition\n   */\n\n  class Toast extends BaseComponent {\n    constructor(element, config) {\n      super(element, config);\n      this._timeout = null;\n      this._hasMouseInteraction = false;\n      this._hasKeyboardInteraction = false;\n      this._setListeners();\n    }\n\n    // Getters\n    static get Default() {\n      return Default;\n    }\n    static get DefaultType() {\n      return DefaultType;\n    }\n    static get NAME() {\n      return NAME;\n    }\n\n    // Public\n    show() {\n      const showEvent = EventHandler.trigger(this._element, EVENT_SHOW);\n      if (showEvent.defaultPrevented) {\n        return;\n      }\n      this._clearTimeout();\n      if (this._config.animation) {\n        this._element.classList.add(CLASS_NAME_FADE);\n      }\n      const complete = () => {\n        this._element.classList.remove(CLASS_NAME_SHOWING);\n        EventHandler.trigger(this._element, EVENT_SHOWN);\n        this._maybeScheduleHide();\n      };\n      this._element.classList.remove(CLASS_NAME_HIDE); // @deprecated\n      reflow(this._element);\n      this._element.classList.add(CLASS_NAME_SHOW, CLASS_NAME_SHOWING);\n      this._queueCallback(complete, this._element, this._config.animation);\n    }\n    hide() {\n      if (!this.isShown()) {\n        return;\n      }\n      const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE);\n      if (hideEvent.defaultPrevented) {\n        return;\n      }\n      const complete = () => {\n        this._element.classList.add(CLASS_NAME_HIDE); // @deprecated\n        this._element.classList.remove(CLASS_NAME_SHOWING, CLASS_NAME_SHOW);\n        EventHandler.trigger(this._element, EVENT_HIDDEN);\n      };\n      this._element.classList.add(CLASS_NAME_SHOWING);\n      this._queueCallback(complete, this._element, this._config.animation);\n    }\n    dispose() {\n      this._clearTimeout();\n      if (this.isShown()) {\n        this._element.classList.remove(CLASS_NAME_SHOW);\n      }\n      super.dispose();\n    }\n    isShown() {\n      return this._element.classList.contains(CLASS_NAME_SHOW);\n    }\n\n    // Private\n    _maybeScheduleHide() {\n      if (!this._config.autohide) {\n        return;\n      }\n      if (this._hasMouseInteraction || this._hasKeyboardInteraction) {\n        return;\n      }\n      this._timeout = setTimeout(() => {\n        this.hide();\n      }, this._config.delay);\n    }\n    _onInteraction(event, isInteracting) {\n      switch (event.type) {\n        case 'mouseover':\n        case 'mouseout':\n          {\n            this._hasMouseInteraction = isInteracting;\n            break;\n          }\n        case 'focusin':\n        case 'focusout':\n          {\n            this._hasKeyboardInteraction = isInteracting;\n            break;\n          }\n      }\n      if (isInteracting) {\n        this._clearTimeout();\n        return;\n      }\n      const nextElement = event.relatedTarget;\n      if (this._element === nextElement || this._element.contains(nextElement)) {\n        return;\n      }\n      this._maybeScheduleHide();\n    }\n    _setListeners() {\n      EventHandler.on(this._element, EVENT_MOUSEOVER, event => this._onInteraction(event, true));\n      EventHandler.on(this._element, EVENT_MOUSEOUT, event => this._onInteraction(event, false));\n      EventHandler.on(this._element, EVENT_FOCUSIN, event => this._onInteraction(event, true));\n      EventHandler.on(this._element, EVENT_FOCUSOUT, event => this._onInteraction(event, false));\n    }\n    _clearTimeout() {\n      clearTimeout(this._timeout);\n      this._timeout = null;\n    }\n\n    // Static\n    static jQueryInterface(config) {\n      return this.each(function () {\n        const data = Toast.getOrCreateInstance(this, config);\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(`No method named \"${config}\"`);\n          }\n          data[config](this);\n        }\n      });\n    }\n  }\n\n  /**\n   * Data API implementation\n   */\n\n  enableDismissTrigger(Toast);\n\n  /**\n   * jQuery\n   */\n\n  defineJQueryPlugin(Toast);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap index.umd.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n  const index_umd = {\n    Alert,\n    Button,\n    Carousel,\n    Collapse,\n    Dropdown,\n    Modal,\n    Offcanvas,\n    Popover,\n    ScrollSpy,\n    Tab,\n    Toast,\n    Tooltip\n  };\n\n  return index_umd;\n\n}));\n//# sourceMappingURL=bootstrap.bundle.js.map\n"
  },
  {
    "path": "dist/js/bootstrap.esm.js",
    "content": "/*!\n  * Bootstrap v5.3.8 (https://getbootstrap.com/)\n  * Copyright 2011-2025 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n  */\nimport * as Popper from '@popperjs/core';\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/data.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n/**\n * Constants\n */\n\nconst elementMap = new Map();\nconst Data = {\n  set(element, key, instance) {\n    if (!elementMap.has(element)) {\n      elementMap.set(element, new Map());\n    }\n    const instanceMap = elementMap.get(element);\n\n    // make it clear we only want one instance per element\n    // can be removed later when multiple key/instances are fine to be used\n    if (!instanceMap.has(key) && instanceMap.size !== 0) {\n      // eslint-disable-next-line no-console\n      console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`);\n      return;\n    }\n    instanceMap.set(key, instance);\n  },\n  get(element, key) {\n    if (elementMap.has(element)) {\n      return elementMap.get(element).get(key) || null;\n    }\n    return null;\n  },\n  remove(element, key) {\n    if (!elementMap.has(element)) {\n      return;\n    }\n    const instanceMap = elementMap.get(element);\n    instanceMap.delete(key);\n\n    // free up element references if there are no instances left for an element\n    if (instanceMap.size === 0) {\n      elementMap.delete(element);\n    }\n  }\n};\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/index.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst MAX_UID = 1000000;\nconst MILLISECONDS_MULTIPLIER = 1000;\nconst TRANSITION_END = 'transitionend';\n\n/**\n * Properly escape IDs selectors to handle weird IDs\n * @param {string} selector\n * @returns {string}\n */\nconst parseSelector = selector => {\n  if (selector && window.CSS && window.CSS.escape) {\n    // document.querySelector needs escaping to handle IDs (html5+) containing for instance /\n    selector = selector.replace(/#([^\\s\"#']+)/g, (match, id) => `#${CSS.escape(id)}`);\n  }\n  return selector;\n};\n\n// Shout-out Angus Croll (https://goo.gl/pxwQGp)\nconst toType = object => {\n  if (object === null || object === undefined) {\n    return `${object}`;\n  }\n  return Object.prototype.toString.call(object).match(/\\s([a-z]+)/i)[1].toLowerCase();\n};\n\n/**\n * Public Util API\n */\n\nconst getUID = prefix => {\n  do {\n    prefix += Math.floor(Math.random() * MAX_UID);\n  } while (document.getElementById(prefix));\n  return prefix;\n};\nconst getTransitionDurationFromElement = element => {\n  if (!element) {\n    return 0;\n  }\n\n  // Get transition-duration of the element\n  let {\n    transitionDuration,\n    transitionDelay\n  } = window.getComputedStyle(element);\n  const floatTransitionDuration = Number.parseFloat(transitionDuration);\n  const floatTransitionDelay = Number.parseFloat(transitionDelay);\n\n  // Return 0 if element or transition duration is not found\n  if (!floatTransitionDuration && !floatTransitionDelay) {\n    return 0;\n  }\n\n  // If multiple durations are defined, take the first\n  transitionDuration = transitionDuration.split(',')[0];\n  transitionDelay = transitionDelay.split(',')[0];\n  return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER;\n};\nconst triggerTransitionEnd = element => {\n  element.dispatchEvent(new Event(TRANSITION_END));\n};\nconst isElement = object => {\n  if (!object || typeof object !== 'object') {\n    return false;\n  }\n  if (typeof object.jquery !== 'undefined') {\n    object = object[0];\n  }\n  return typeof object.nodeType !== 'undefined';\n};\nconst getElement = object => {\n  // it's a jQuery object or a node element\n  if (isElement(object)) {\n    return object.jquery ? object[0] : object;\n  }\n  if (typeof object === 'string' && object.length > 0) {\n    return document.querySelector(parseSelector(object));\n  }\n  return null;\n};\nconst isVisible = element => {\n  if (!isElement(element) || element.getClientRects().length === 0) {\n    return false;\n  }\n  const elementIsVisible = getComputedStyle(element).getPropertyValue('visibility') === 'visible';\n  // Handle `details` element as its content may falsie appear visible when it is closed\n  const closedDetails = element.closest('details:not([open])');\n  if (!closedDetails) {\n    return elementIsVisible;\n  }\n  if (closedDetails !== element) {\n    const summary = element.closest('summary');\n    if (summary && summary.parentNode !== closedDetails) {\n      return false;\n    }\n    if (summary === null) {\n      return false;\n    }\n  }\n  return elementIsVisible;\n};\nconst isDisabled = element => {\n  if (!element || element.nodeType !== Node.ELEMENT_NODE) {\n    return true;\n  }\n  if (element.classList.contains('disabled')) {\n    return true;\n  }\n  if (typeof element.disabled !== 'undefined') {\n    return element.disabled;\n  }\n  return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false';\n};\nconst findShadowRoot = element => {\n  if (!document.documentElement.attachShadow) {\n    return null;\n  }\n\n  // Can find the shadow root otherwise it'll return the document\n  if (typeof element.getRootNode === 'function') {\n    const root = element.getRootNode();\n    return root instanceof ShadowRoot ? root : null;\n  }\n  if (element instanceof ShadowRoot) {\n    return element;\n  }\n\n  // when we don't find a shadow root\n  if (!element.parentNode) {\n    return null;\n  }\n  return findShadowRoot(element.parentNode);\n};\nconst noop = () => {};\n\n/**\n * Trick to restart an element's animation\n *\n * @param {HTMLElement} element\n * @return void\n *\n * @see https://www.harrytheo.com/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation\n */\nconst reflow = element => {\n  element.offsetHeight; // eslint-disable-line no-unused-expressions\n};\nconst getjQuery = () => {\n  if (window.jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {\n    return window.jQuery;\n  }\n  return null;\n};\nconst DOMContentLoadedCallbacks = [];\nconst onDOMContentLoaded = callback => {\n  if (document.readyState === 'loading') {\n    // add listener on the first call when the document is in loading state\n    if (!DOMContentLoadedCallbacks.length) {\n      document.addEventListener('DOMContentLoaded', () => {\n        for (const callback of DOMContentLoadedCallbacks) {\n          callback();\n        }\n      });\n    }\n    DOMContentLoadedCallbacks.push(callback);\n  } else {\n    callback();\n  }\n};\nconst isRTL = () => document.documentElement.dir === 'rtl';\nconst defineJQueryPlugin = plugin => {\n  onDOMContentLoaded(() => {\n    const $ = getjQuery();\n    /* istanbul ignore if */\n    if ($) {\n      const name = plugin.NAME;\n      const JQUERY_NO_CONFLICT = $.fn[name];\n      $.fn[name] = plugin.jQueryInterface;\n      $.fn[name].Constructor = plugin;\n      $.fn[name].noConflict = () => {\n        $.fn[name] = JQUERY_NO_CONFLICT;\n        return plugin.jQueryInterface;\n      };\n    }\n  });\n};\nconst execute = (possibleCallback, args = [], defaultValue = possibleCallback) => {\n  return typeof possibleCallback === 'function' ? possibleCallback.call(...args) : defaultValue;\n};\nconst executeAfterTransition = (callback, transitionElement, waitForTransition = true) => {\n  if (!waitForTransition) {\n    execute(callback);\n    return;\n  }\n  const durationPadding = 5;\n  const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding;\n  let called = false;\n  const handler = ({\n    target\n  }) => {\n    if (target !== transitionElement) {\n      return;\n    }\n    called = true;\n    transitionElement.removeEventListener(TRANSITION_END, handler);\n    execute(callback);\n  };\n  transitionElement.addEventListener(TRANSITION_END, handler);\n  setTimeout(() => {\n    if (!called) {\n      triggerTransitionEnd(transitionElement);\n    }\n  }, emulatedDuration);\n};\n\n/**\n * Return the previous/next element of a list.\n *\n * @param {array} list    The list of elements\n * @param activeElement   The active element\n * @param shouldGetNext   Choose to get next or previous element\n * @param isCycleAllowed\n * @return {Element|elem} The proper element\n */\nconst getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => {\n  const listLength = list.length;\n  let index = list.indexOf(activeElement);\n\n  // if the element does not exist in the list return an element\n  // depending on the direction and if cycle is allowed\n  if (index === -1) {\n    return !shouldGetNext && isCycleAllowed ? list[listLength - 1] : list[0];\n  }\n  index += shouldGetNext ? 1 : -1;\n  if (isCycleAllowed) {\n    index = (index + listLength) % listLength;\n  }\n  return list[Math.max(0, Math.min(index, listLength - 1))];\n};\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/event-handler.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst namespaceRegex = /[^.]*(?=\\..*)\\.|.*/;\nconst stripNameRegex = /\\..*/;\nconst stripUidRegex = /::\\d+$/;\nconst eventRegistry = {}; // Events storage\nlet uidEvent = 1;\nconst customEvents = {\n  mouseenter: 'mouseover',\n  mouseleave: 'mouseout'\n};\nconst nativeEvents = new Set(['click', 'dblclick', 'mouseup', 'mousedown', 'contextmenu', 'mousewheel', 'DOMMouseScroll', 'mouseover', 'mouseout', 'mousemove', 'selectstart', 'selectend', 'keydown', 'keypress', 'keyup', 'orientationchange', 'touchstart', 'touchmove', 'touchend', 'touchcancel', 'pointerdown', 'pointermove', 'pointerup', 'pointerleave', 'pointercancel', 'gesturestart', 'gesturechange', 'gestureend', 'focus', 'blur', 'change', 'reset', 'select', 'submit', 'focusin', 'focusout', 'load', 'unload', 'beforeunload', 'resize', 'move', 'DOMContentLoaded', 'readystatechange', 'error', 'abort', 'scroll']);\n\n/**\n * Private methods\n */\n\nfunction makeEventUid(element, uid) {\n  return uid && `${uid}::${uidEvent++}` || element.uidEvent || uidEvent++;\n}\nfunction getElementEvents(element) {\n  const uid = makeEventUid(element);\n  element.uidEvent = uid;\n  eventRegistry[uid] = eventRegistry[uid] || {};\n  return eventRegistry[uid];\n}\nfunction bootstrapHandler(element, fn) {\n  return function handler(event) {\n    hydrateObj(event, {\n      delegateTarget: element\n    });\n    if (handler.oneOff) {\n      EventHandler.off(element, event.type, fn);\n    }\n    return fn.apply(element, [event]);\n  };\n}\nfunction bootstrapDelegationHandler(element, selector, fn) {\n  return function handler(event) {\n    const domElements = element.querySelectorAll(selector);\n    for (let {\n      target\n    } = event; target && target !== this; target = target.parentNode) {\n      for (const domElement of domElements) {\n        if (domElement !== target) {\n          continue;\n        }\n        hydrateObj(event, {\n          delegateTarget: target\n        });\n        if (handler.oneOff) {\n          EventHandler.off(element, event.type, selector, fn);\n        }\n        return fn.apply(target, [event]);\n      }\n    }\n  };\n}\nfunction findHandler(events, callable, delegationSelector = null) {\n  return Object.values(events).find(event => event.callable === callable && event.delegationSelector === delegationSelector);\n}\nfunction normalizeParameters(originalTypeEvent, handler, delegationFunction) {\n  const isDelegated = typeof handler === 'string';\n  // TODO: tooltip passes `false` instead of selector, so we need to check\n  const callable = isDelegated ? delegationFunction : handler || delegationFunction;\n  let typeEvent = getTypeEvent(originalTypeEvent);\n  if (!nativeEvents.has(typeEvent)) {\n    typeEvent = originalTypeEvent;\n  }\n  return [isDelegated, callable, typeEvent];\n}\nfunction addHandler(element, originalTypeEvent, handler, delegationFunction, oneOff) {\n  if (typeof originalTypeEvent !== 'string' || !element) {\n    return;\n  }\n  let [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction);\n\n  // in case of mouseenter or mouseleave wrap the handler within a function that checks for its DOM position\n  // this prevents the handler from being dispatched the same way as mouseover or mouseout does\n  if (originalTypeEvent in customEvents) {\n    const wrapFunction = fn => {\n      return function (event) {\n        if (!event.relatedTarget || event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget)) {\n          return fn.call(this, event);\n        }\n      };\n    };\n    callable = wrapFunction(callable);\n  }\n  const events = getElementEvents(element);\n  const handlers = events[typeEvent] || (events[typeEvent] = {});\n  const previousFunction = findHandler(handlers, callable, isDelegated ? handler : null);\n  if (previousFunction) {\n    previousFunction.oneOff = previousFunction.oneOff && oneOff;\n    return;\n  }\n  const uid = makeEventUid(callable, originalTypeEvent.replace(namespaceRegex, ''));\n  const fn = isDelegated ? bootstrapDelegationHandler(element, handler, callable) : bootstrapHandler(element, callable);\n  fn.delegationSelector = isDelegated ? handler : null;\n  fn.callable = callable;\n  fn.oneOff = oneOff;\n  fn.uidEvent = uid;\n  handlers[uid] = fn;\n  element.addEventListener(typeEvent, fn, isDelegated);\n}\nfunction removeHandler(element, events, typeEvent, handler, delegationSelector) {\n  const fn = findHandler(events[typeEvent], handler, delegationSelector);\n  if (!fn) {\n    return;\n  }\n  element.removeEventListener(typeEvent, fn, Boolean(delegationSelector));\n  delete events[typeEvent][fn.uidEvent];\n}\nfunction removeNamespacedHandlers(element, events, typeEvent, namespace) {\n  const storeElementEvent = events[typeEvent] || {};\n  for (const [handlerKey, event] of Object.entries(storeElementEvent)) {\n    if (handlerKey.includes(namespace)) {\n      removeHandler(element, events, typeEvent, event.callable, event.delegationSelector);\n    }\n  }\n}\nfunction getTypeEvent(event) {\n  // allow to get the native events from namespaced events ('click.bs.button' --> 'click')\n  event = event.replace(stripNameRegex, '');\n  return customEvents[event] || event;\n}\nconst EventHandler = {\n  on(element, event, handler, delegationFunction) {\n    addHandler(element, event, handler, delegationFunction, false);\n  },\n  one(element, event, handler, delegationFunction) {\n    addHandler(element, event, handler, delegationFunction, true);\n  },\n  off(element, originalTypeEvent, handler, delegationFunction) {\n    if (typeof originalTypeEvent !== 'string' || !element) {\n      return;\n    }\n    const [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction);\n    const inNamespace = typeEvent !== originalTypeEvent;\n    const events = getElementEvents(element);\n    const storeElementEvent = events[typeEvent] || {};\n    const isNamespace = originalTypeEvent.startsWith('.');\n    if (typeof callable !== 'undefined') {\n      // Simplest case: handler is passed, remove that listener ONLY.\n      if (!Object.keys(storeElementEvent).length) {\n        return;\n      }\n      removeHandler(element, events, typeEvent, callable, isDelegated ? handler : null);\n      return;\n    }\n    if (isNamespace) {\n      for (const elementEvent of Object.keys(events)) {\n        removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1));\n      }\n    }\n    for (const [keyHandlers, event] of Object.entries(storeElementEvent)) {\n      const handlerKey = keyHandlers.replace(stripUidRegex, '');\n      if (!inNamespace || originalTypeEvent.includes(handlerKey)) {\n        removeHandler(element, events, typeEvent, event.callable, event.delegationSelector);\n      }\n    }\n  },\n  trigger(element, event, args) {\n    if (typeof event !== 'string' || !element) {\n      return null;\n    }\n    const $ = getjQuery();\n    const typeEvent = getTypeEvent(event);\n    const inNamespace = event !== typeEvent;\n    let jQueryEvent = null;\n    let bubbles = true;\n    let nativeDispatch = true;\n    let defaultPrevented = false;\n    if (inNamespace && $) {\n      jQueryEvent = $.Event(event, args);\n      $(element).trigger(jQueryEvent);\n      bubbles = !jQueryEvent.isPropagationStopped();\n      nativeDispatch = !jQueryEvent.isImmediatePropagationStopped();\n      defaultPrevented = jQueryEvent.isDefaultPrevented();\n    }\n    const evt = hydrateObj(new Event(event, {\n      bubbles,\n      cancelable: true\n    }), args);\n    if (defaultPrevented) {\n      evt.preventDefault();\n    }\n    if (nativeDispatch) {\n      element.dispatchEvent(evt);\n    }\n    if (evt.defaultPrevented && jQueryEvent) {\n      jQueryEvent.preventDefault();\n    }\n    return evt;\n  }\n};\nfunction hydrateObj(obj, meta = {}) {\n  for (const [key, value] of Object.entries(meta)) {\n    try {\n      obj[key] = value;\n    } catch (_unused) {\n      Object.defineProperty(obj, key, {\n        configurable: true,\n        get() {\n          return value;\n        }\n      });\n    }\n  }\n  return obj;\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/manipulator.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nfunction normalizeData(value) {\n  if (value === 'true') {\n    return true;\n  }\n  if (value === 'false') {\n    return false;\n  }\n  if (value === Number(value).toString()) {\n    return Number(value);\n  }\n  if (value === '' || value === 'null') {\n    return null;\n  }\n  if (typeof value !== 'string') {\n    return value;\n  }\n  try {\n    return JSON.parse(decodeURIComponent(value));\n  } catch (_unused) {\n    return value;\n  }\n}\nfunction normalizeDataKey(key) {\n  return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`);\n}\nconst Manipulator = {\n  setDataAttribute(element, key, value) {\n    element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value);\n  },\n  removeDataAttribute(element, key) {\n    element.removeAttribute(`data-bs-${normalizeDataKey(key)}`);\n  },\n  getDataAttributes(element) {\n    if (!element) {\n      return {};\n    }\n    const attributes = {};\n    const bsKeys = Object.keys(element.dataset).filter(key => key.startsWith('bs') && !key.startsWith('bsConfig'));\n    for (const key of bsKeys) {\n      let pureKey = key.replace(/^bs/, '');\n      pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1);\n      attributes[pureKey] = normalizeData(element.dataset[key]);\n    }\n    return attributes;\n  },\n  getDataAttribute(element, key) {\n    return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`));\n  }\n};\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/config.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Class definition\n */\n\nclass Config {\n  // Getters\n  static get Default() {\n    return {};\n  }\n  static get DefaultType() {\n    return {};\n  }\n  static get NAME() {\n    throw new Error('You have to implement the static method \"NAME\", for each component!');\n  }\n  _getConfig(config) {\n    config = this._mergeConfigObj(config);\n    config = this._configAfterMerge(config);\n    this._typeCheckConfig(config);\n    return config;\n  }\n  _configAfterMerge(config) {\n    return config;\n  }\n  _mergeConfigObj(config, element) {\n    const jsonConfig = isElement(element) ? Manipulator.getDataAttribute(element, 'config') : {}; // try to parse\n\n    return {\n      ...this.constructor.Default,\n      ...(typeof jsonConfig === 'object' ? jsonConfig : {}),\n      ...(isElement(element) ? Manipulator.getDataAttributes(element) : {}),\n      ...(typeof config === 'object' ? config : {})\n    };\n  }\n  _typeCheckConfig(config, configTypes = this.constructor.DefaultType) {\n    for (const [property, expectedTypes] of Object.entries(configTypes)) {\n      const value = config[property];\n      const valueType = isElement(value) ? 'element' : toType(value);\n      if (!new RegExp(expectedTypes).test(valueType)) {\n        throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option \"${property}\" provided type \"${valueType}\" but expected type \"${expectedTypes}\".`);\n      }\n    }\n  }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap base-component.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst VERSION = '5.3.8';\n\n/**\n * Class definition\n */\n\nclass BaseComponent extends Config {\n  constructor(element, config) {\n    super();\n    element = getElement(element);\n    if (!element) {\n      return;\n    }\n    this._element = element;\n    this._config = this._getConfig(config);\n    Data.set(this._element, this.constructor.DATA_KEY, this);\n  }\n\n  // Public\n  dispose() {\n    Data.remove(this._element, this.constructor.DATA_KEY);\n    EventHandler.off(this._element, this.constructor.EVENT_KEY);\n    for (const propertyName of Object.getOwnPropertyNames(this)) {\n      this[propertyName] = null;\n    }\n  }\n\n  // Private\n  _queueCallback(callback, element, isAnimated = true) {\n    executeAfterTransition(callback, element, isAnimated);\n  }\n  _getConfig(config) {\n    config = this._mergeConfigObj(config, this._element);\n    config = this._configAfterMerge(config);\n    this._typeCheckConfig(config);\n    return config;\n  }\n\n  // Static\n  static getInstance(element) {\n    return Data.get(getElement(element), this.DATA_KEY);\n  }\n  static getOrCreateInstance(element, config = {}) {\n    return this.getInstance(element) || new this(element, typeof config === 'object' ? config : null);\n  }\n  static get VERSION() {\n    return VERSION;\n  }\n  static get DATA_KEY() {\n    return `bs.${this.NAME}`;\n  }\n  static get EVENT_KEY() {\n    return `.${this.DATA_KEY}`;\n  }\n  static eventName(name) {\n    return `${name}${this.EVENT_KEY}`;\n  }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/selector-engine.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst getSelector = element => {\n  let selector = element.getAttribute('data-bs-target');\n  if (!selector || selector === '#') {\n    let hrefAttribute = element.getAttribute('href');\n\n    // The only valid content that could double as a selector are IDs or classes,\n    // so everything starting with `#` or `.`. If a \"real\" URL is used as the selector,\n    // `document.querySelector` will rightfully complain it is invalid.\n    // See https://github.com/twbs/bootstrap/issues/32273\n    if (!hrefAttribute || !hrefAttribute.includes('#') && !hrefAttribute.startsWith('.')) {\n      return null;\n    }\n\n    // Just in case some CMS puts out a full URL with the anchor appended\n    if (hrefAttribute.includes('#') && !hrefAttribute.startsWith('#')) {\n      hrefAttribute = `#${hrefAttribute.split('#')[1]}`;\n    }\n    selector = hrefAttribute && hrefAttribute !== '#' ? hrefAttribute.trim() : null;\n  }\n  return selector ? selector.split(',').map(sel => parseSelector(sel)).join(',') : null;\n};\nconst SelectorEngine = {\n  find(selector, element = document.documentElement) {\n    return [].concat(...Element.prototype.querySelectorAll.call(element, selector));\n  },\n  findOne(selector, element = document.documentElement) {\n    return Element.prototype.querySelector.call(element, selector);\n  },\n  children(element, selector) {\n    return [].concat(...element.children).filter(child => child.matches(selector));\n  },\n  parents(element, selector) {\n    const parents = [];\n    let ancestor = element.parentNode.closest(selector);\n    while (ancestor) {\n      parents.push(ancestor);\n      ancestor = ancestor.parentNode.closest(selector);\n    }\n    return parents;\n  },\n  prev(element, selector) {\n    let previous = element.previousElementSibling;\n    while (previous) {\n      if (previous.matches(selector)) {\n        return [previous];\n      }\n      previous = previous.previousElementSibling;\n    }\n    return [];\n  },\n  // TODO: this is now unused; remove later along with prev()\n  next(element, selector) {\n    let next = element.nextElementSibling;\n    while (next) {\n      if (next.matches(selector)) {\n        return [next];\n      }\n      next = next.nextElementSibling;\n    }\n    return [];\n  },\n  focusableChildren(element) {\n    const focusables = ['a', 'button', 'input', 'textarea', 'select', 'details', '[tabindex]', '[contenteditable=\"true\"]'].map(selector => `${selector}:not([tabindex^=\"-\"])`).join(',');\n    return this.find(focusables, element).filter(el => !isDisabled(el) && isVisible(el));\n  },\n  getSelectorFromElement(element) {\n    const selector = getSelector(element);\n    if (selector) {\n      return SelectorEngine.findOne(selector) ? selector : null;\n    }\n    return null;\n  },\n  getElementFromSelector(element) {\n    const selector = getSelector(element);\n    return selector ? SelectorEngine.findOne(selector) : null;\n  },\n  getMultipleElementsFromSelector(element) {\n    const selector = getSelector(element);\n    return selector ? SelectorEngine.find(selector) : [];\n  }\n};\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/component-functions.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst enableDismissTrigger = (component, method = 'hide') => {\n  const clickEvent = `click.dismiss${component.EVENT_KEY}`;\n  const name = component.NAME;\n  EventHandler.on(document, clickEvent, `[data-bs-dismiss=\"${name}\"]`, function (event) {\n    if (['A', 'AREA'].includes(this.tagName)) {\n      event.preventDefault();\n    }\n    if (isDisabled(this)) {\n      return;\n    }\n    const target = SelectorEngine.getElementFromSelector(this) || this.closest(`.${name}`);\n    const instance = component.getOrCreateInstance(target);\n\n    // Method argument is left, for Alert and only, as it doesn't implement the 'hide' method\n    instance[method]();\n  });\n};\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap alert.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$f = 'alert';\nconst DATA_KEY$a = 'bs.alert';\nconst EVENT_KEY$b = `.${DATA_KEY$a}`;\nconst EVENT_CLOSE = `close${EVENT_KEY$b}`;\nconst EVENT_CLOSED = `closed${EVENT_KEY$b}`;\nconst CLASS_NAME_FADE$5 = 'fade';\nconst CLASS_NAME_SHOW$8 = 'show';\n\n/**\n * Class definition\n */\n\nclass Alert extends BaseComponent {\n  // Getters\n  static get NAME() {\n    return NAME$f;\n  }\n\n  // Public\n  close() {\n    const closeEvent = EventHandler.trigger(this._element, EVENT_CLOSE);\n    if (closeEvent.defaultPrevented) {\n      return;\n    }\n    this._element.classList.remove(CLASS_NAME_SHOW$8);\n    const isAnimated = this._element.classList.contains(CLASS_NAME_FADE$5);\n    this._queueCallback(() => this._destroyElement(), this._element, isAnimated);\n  }\n\n  // Private\n  _destroyElement() {\n    this._element.remove();\n    EventHandler.trigger(this._element, EVENT_CLOSED);\n    this.dispose();\n  }\n\n  // Static\n  static jQueryInterface(config) {\n    return this.each(function () {\n      const data = Alert.getOrCreateInstance(this);\n      if (typeof config !== 'string') {\n        return;\n      }\n      if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n        throw new TypeError(`No method named \"${config}\"`);\n      }\n      data[config](this);\n    });\n  }\n}\n\n/**\n * Data API implementation\n */\n\nenableDismissTrigger(Alert, 'close');\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Alert);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap button.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$e = 'button';\nconst DATA_KEY$9 = 'bs.button';\nconst EVENT_KEY$a = `.${DATA_KEY$9}`;\nconst DATA_API_KEY$6 = '.data-api';\nconst CLASS_NAME_ACTIVE$3 = 'active';\nconst SELECTOR_DATA_TOGGLE$5 = '[data-bs-toggle=\"button\"]';\nconst EVENT_CLICK_DATA_API$6 = `click${EVENT_KEY$a}${DATA_API_KEY$6}`;\n\n/**\n * Class definition\n */\n\nclass Button extends BaseComponent {\n  // Getters\n  static get NAME() {\n    return NAME$e;\n  }\n\n  // Public\n  toggle() {\n    // Toggle class and sync the `aria-pressed` attribute with the return value of the `.toggle()` method\n    this._element.setAttribute('aria-pressed', this._element.classList.toggle(CLASS_NAME_ACTIVE$3));\n  }\n\n  // Static\n  static jQueryInterface(config) {\n    return this.each(function () {\n      const data = Button.getOrCreateInstance(this);\n      if (config === 'toggle') {\n        data[config]();\n      }\n    });\n  }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API$6, SELECTOR_DATA_TOGGLE$5, event => {\n  event.preventDefault();\n  const button = event.target.closest(SELECTOR_DATA_TOGGLE$5);\n  const data = Button.getOrCreateInstance(button);\n  data.toggle();\n});\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Button);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/swipe.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$d = 'swipe';\nconst EVENT_KEY$9 = '.bs.swipe';\nconst EVENT_TOUCHSTART = `touchstart${EVENT_KEY$9}`;\nconst EVENT_TOUCHMOVE = `touchmove${EVENT_KEY$9}`;\nconst EVENT_TOUCHEND = `touchend${EVENT_KEY$9}`;\nconst EVENT_POINTERDOWN = `pointerdown${EVENT_KEY$9}`;\nconst EVENT_POINTERUP = `pointerup${EVENT_KEY$9}`;\nconst POINTER_TYPE_TOUCH = 'touch';\nconst POINTER_TYPE_PEN = 'pen';\nconst CLASS_NAME_POINTER_EVENT = 'pointer-event';\nconst SWIPE_THRESHOLD = 40;\nconst Default$c = {\n  endCallback: null,\n  leftCallback: null,\n  rightCallback: null\n};\nconst DefaultType$c = {\n  endCallback: '(function|null)',\n  leftCallback: '(function|null)',\n  rightCallback: '(function|null)'\n};\n\n/**\n * Class definition\n */\n\nclass Swipe extends Config {\n  constructor(element, config) {\n    super();\n    this._element = element;\n    if (!element || !Swipe.isSupported()) {\n      return;\n    }\n    this._config = this._getConfig(config);\n    this._deltaX = 0;\n    this._supportPointerEvents = Boolean(window.PointerEvent);\n    this._initEvents();\n  }\n\n  // Getters\n  static get Default() {\n    return Default$c;\n  }\n  static get DefaultType() {\n    return DefaultType$c;\n  }\n  static get NAME() {\n    return NAME$d;\n  }\n\n  // Public\n  dispose() {\n    EventHandler.off(this._element, EVENT_KEY$9);\n  }\n\n  // Private\n  _start(event) {\n    if (!this._supportPointerEvents) {\n      this._deltaX = event.touches[0].clientX;\n      return;\n    }\n    if (this._eventIsPointerPenTouch(event)) {\n      this._deltaX = event.clientX;\n    }\n  }\n  _end(event) {\n    if (this._eventIsPointerPenTouch(event)) {\n      this._deltaX = event.clientX - this._deltaX;\n    }\n    this._handleSwipe();\n    execute(this._config.endCallback);\n  }\n  _move(event) {\n    this._deltaX = event.touches && event.touches.length > 1 ? 0 : event.touches[0].clientX - this._deltaX;\n  }\n  _handleSwipe() {\n    const absDeltaX = Math.abs(this._deltaX);\n    if (absDeltaX <= SWIPE_THRESHOLD) {\n      return;\n    }\n    const direction = absDeltaX / this._deltaX;\n    this._deltaX = 0;\n    if (!direction) {\n      return;\n    }\n    execute(direction > 0 ? this._config.rightCallback : this._config.leftCallback);\n  }\n  _initEvents() {\n    if (this._supportPointerEvents) {\n      EventHandler.on(this._element, EVENT_POINTERDOWN, event => this._start(event));\n      EventHandler.on(this._element, EVENT_POINTERUP, event => this._end(event));\n      this._element.classList.add(CLASS_NAME_POINTER_EVENT);\n    } else {\n      EventHandler.on(this._element, EVENT_TOUCHSTART, event => this._start(event));\n      EventHandler.on(this._element, EVENT_TOUCHMOVE, event => this._move(event));\n      EventHandler.on(this._element, EVENT_TOUCHEND, event => this._end(event));\n    }\n  }\n  _eventIsPointerPenTouch(event) {\n    return this._supportPointerEvents && (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH);\n  }\n\n  // Static\n  static isSupported() {\n    return 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0;\n  }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap carousel.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$c = 'carousel';\nconst DATA_KEY$8 = 'bs.carousel';\nconst EVENT_KEY$8 = `.${DATA_KEY$8}`;\nconst DATA_API_KEY$5 = '.data-api';\nconst ARROW_LEFT_KEY$1 = 'ArrowLeft';\nconst ARROW_RIGHT_KEY$1 = 'ArrowRight';\nconst TOUCHEVENT_COMPAT_WAIT = 500; // Time for mouse compat events to fire after touch\n\nconst ORDER_NEXT = 'next';\nconst ORDER_PREV = 'prev';\nconst DIRECTION_LEFT = 'left';\nconst DIRECTION_RIGHT = 'right';\nconst EVENT_SLIDE = `slide${EVENT_KEY$8}`;\nconst EVENT_SLID = `slid${EVENT_KEY$8}`;\nconst EVENT_KEYDOWN$1 = `keydown${EVENT_KEY$8}`;\nconst EVENT_MOUSEENTER$1 = `mouseenter${EVENT_KEY$8}`;\nconst EVENT_MOUSELEAVE$1 = `mouseleave${EVENT_KEY$8}`;\nconst EVENT_DRAG_START = `dragstart${EVENT_KEY$8}`;\nconst EVENT_LOAD_DATA_API$3 = `load${EVENT_KEY$8}${DATA_API_KEY$5}`;\nconst EVENT_CLICK_DATA_API$5 = `click${EVENT_KEY$8}${DATA_API_KEY$5}`;\nconst CLASS_NAME_CAROUSEL = 'carousel';\nconst CLASS_NAME_ACTIVE$2 = 'active';\nconst CLASS_NAME_SLIDE = 'slide';\nconst CLASS_NAME_END = 'carousel-item-end';\nconst CLASS_NAME_START = 'carousel-item-start';\nconst CLASS_NAME_NEXT = 'carousel-item-next';\nconst CLASS_NAME_PREV = 'carousel-item-prev';\nconst SELECTOR_ACTIVE = '.active';\nconst SELECTOR_ITEM = '.carousel-item';\nconst SELECTOR_ACTIVE_ITEM = SELECTOR_ACTIVE + SELECTOR_ITEM;\nconst SELECTOR_ITEM_IMG = '.carousel-item img';\nconst SELECTOR_INDICATORS = '.carousel-indicators';\nconst SELECTOR_DATA_SLIDE = '[data-bs-slide], [data-bs-slide-to]';\nconst SELECTOR_DATA_RIDE = '[data-bs-ride=\"carousel\"]';\nconst KEY_TO_DIRECTION = {\n  [ARROW_LEFT_KEY$1]: DIRECTION_RIGHT,\n  [ARROW_RIGHT_KEY$1]: DIRECTION_LEFT\n};\nconst Default$b = {\n  interval: 5000,\n  keyboard: true,\n  pause: 'hover',\n  ride: false,\n  touch: true,\n  wrap: true\n};\nconst DefaultType$b = {\n  interval: '(number|boolean)',\n  // TODO:v6 remove boolean support\n  keyboard: 'boolean',\n  pause: '(string|boolean)',\n  ride: '(boolean|string)',\n  touch: 'boolean',\n  wrap: 'boolean'\n};\n\n/**\n * Class definition\n */\n\nclass Carousel extends BaseComponent {\n  constructor(element, config) {\n    super(element, config);\n    this._interval = null;\n    this._activeElement = null;\n    this._isSliding = false;\n    this.touchTimeout = null;\n    this._swipeHelper = null;\n    this._indicatorsElement = SelectorEngine.findOne(SELECTOR_INDICATORS, this._element);\n    this._addEventListeners();\n    if (this._config.ride === CLASS_NAME_CAROUSEL) {\n      this.cycle();\n    }\n  }\n\n  // Getters\n  static get Default() {\n    return Default$b;\n  }\n  static get DefaultType() {\n    return DefaultType$b;\n  }\n  static get NAME() {\n    return NAME$c;\n  }\n\n  // Public\n  next() {\n    this._slide(ORDER_NEXT);\n  }\n  nextWhenVisible() {\n    // FIXME TODO use `document.visibilityState`\n    // Don't call next when the page isn't visible\n    // or the carousel or its parent isn't visible\n    if (!document.hidden && isVisible(this._element)) {\n      this.next();\n    }\n  }\n  prev() {\n    this._slide(ORDER_PREV);\n  }\n  pause() {\n    if (this._isSliding) {\n      triggerTransitionEnd(this._element);\n    }\n    this._clearInterval();\n  }\n  cycle() {\n    this._clearInterval();\n    this._updateInterval();\n    this._interval = setInterval(() => this.nextWhenVisible(), this._config.interval);\n  }\n  _maybeEnableCycle() {\n    if (!this._config.ride) {\n      return;\n    }\n    if (this._isSliding) {\n      EventHandler.one(this._element, EVENT_SLID, () => this.cycle());\n      return;\n    }\n    this.cycle();\n  }\n  to(index) {\n    const items = this._getItems();\n    if (index > items.length - 1 || index < 0) {\n      return;\n    }\n    if (this._isSliding) {\n      EventHandler.one(this._element, EVENT_SLID, () => this.to(index));\n      return;\n    }\n    const activeIndex = this._getItemIndex(this._getActive());\n    if (activeIndex === index) {\n      return;\n    }\n    const order = index > activeIndex ? ORDER_NEXT : ORDER_PREV;\n    this._slide(order, items[index]);\n  }\n  dispose() {\n    if (this._swipeHelper) {\n      this._swipeHelper.dispose();\n    }\n    super.dispose();\n  }\n\n  // Private\n  _configAfterMerge(config) {\n    config.defaultInterval = config.interval;\n    return config;\n  }\n  _addEventListeners() {\n    if (this._config.keyboard) {\n      EventHandler.on(this._element, EVENT_KEYDOWN$1, event => this._keydown(event));\n    }\n    if (this._config.pause === 'hover') {\n      EventHandler.on(this._element, EVENT_MOUSEENTER$1, () => this.pause());\n      EventHandler.on(this._element, EVENT_MOUSELEAVE$1, () => this._maybeEnableCycle());\n    }\n    if (this._config.touch && Swipe.isSupported()) {\n      this._addTouchEventListeners();\n    }\n  }\n  _addTouchEventListeners() {\n    for (const img of SelectorEngine.find(SELECTOR_ITEM_IMG, this._element)) {\n      EventHandler.on(img, EVENT_DRAG_START, event => event.preventDefault());\n    }\n    const endCallBack = () => {\n      if (this._config.pause !== 'hover') {\n        return;\n      }\n\n      // If it's a touch-enabled device, mouseenter/leave are fired as\n      // part of the mouse compatibility events on first tap - the carousel\n      // would stop cycling until user tapped out of it;\n      // here, we listen for touchend, explicitly pause the carousel\n      // (as if it's the second time we tap on it, mouseenter compat event\n      // is NOT fired) and after a timeout (to allow for mouse compatibility\n      // events to fire) we explicitly restart cycling\n\n      this.pause();\n      if (this.touchTimeout) {\n        clearTimeout(this.touchTimeout);\n      }\n      this.touchTimeout = setTimeout(() => this._maybeEnableCycle(), TOUCHEVENT_COMPAT_WAIT + this._config.interval);\n    };\n    const swipeConfig = {\n      leftCallback: () => this._slide(this._directionToOrder(DIRECTION_LEFT)),\n      rightCallback: () => this._slide(this._directionToOrder(DIRECTION_RIGHT)),\n      endCallback: endCallBack\n    };\n    this._swipeHelper = new Swipe(this._element, swipeConfig);\n  }\n  _keydown(event) {\n    if (/input|textarea/i.test(event.target.tagName)) {\n      return;\n    }\n    const direction = KEY_TO_DIRECTION[event.key];\n    if (direction) {\n      event.preventDefault();\n      this._slide(this._directionToOrder(direction));\n    }\n  }\n  _getItemIndex(element) {\n    return this._getItems().indexOf(element);\n  }\n  _setActiveIndicatorElement(index) {\n    if (!this._indicatorsElement) {\n      return;\n    }\n    const activeIndicator = SelectorEngine.findOne(SELECTOR_ACTIVE, this._indicatorsElement);\n    activeIndicator.classList.remove(CLASS_NAME_ACTIVE$2);\n    activeIndicator.removeAttribute('aria-current');\n    const newActiveIndicator = SelectorEngine.findOne(`[data-bs-slide-to=\"${index}\"]`, this._indicatorsElement);\n    if (newActiveIndicator) {\n      newActiveIndicator.classList.add(CLASS_NAME_ACTIVE$2);\n      newActiveIndicator.setAttribute('aria-current', 'true');\n    }\n  }\n  _updateInterval() {\n    const element = this._activeElement || this._getActive();\n    if (!element) {\n      return;\n    }\n    const elementInterval = Number.parseInt(element.getAttribute('data-bs-interval'), 10);\n    this._config.interval = elementInterval || this._config.defaultInterval;\n  }\n  _slide(order, element = null) {\n    if (this._isSliding) {\n      return;\n    }\n    const activeElement = this._getActive();\n    const isNext = order === ORDER_NEXT;\n    const nextElement = element || getNextActiveElement(this._getItems(), activeElement, isNext, this._config.wrap);\n    if (nextElement === activeElement) {\n      return;\n    }\n    const nextElementIndex = this._getItemIndex(nextElement);\n    const triggerEvent = eventName => {\n      return EventHandler.trigger(this._element, eventName, {\n        relatedTarget: nextElement,\n        direction: this._orderToDirection(order),\n        from: this._getItemIndex(activeElement),\n        to: nextElementIndex\n      });\n    };\n    const slideEvent = triggerEvent(EVENT_SLIDE);\n    if (slideEvent.defaultPrevented) {\n      return;\n    }\n    if (!activeElement || !nextElement) {\n      // Some weirdness is happening, so we bail\n      // TODO: change tests that use empty divs to avoid this check\n      return;\n    }\n    const isCycling = Boolean(this._interval);\n    this.pause();\n    this._isSliding = true;\n    this._setActiveIndicatorElement(nextElementIndex);\n    this._activeElement = nextElement;\n    const directionalClassName = isNext ? CLASS_NAME_START : CLASS_NAME_END;\n    const orderClassName = isNext ? CLASS_NAME_NEXT : CLASS_NAME_PREV;\n    nextElement.classList.add(orderClassName);\n    reflow(nextElement);\n    activeElement.classList.add(directionalClassName);\n    nextElement.classList.add(directionalClassName);\n    const completeCallBack = () => {\n      nextElement.classList.remove(directionalClassName, orderClassName);\n      nextElement.classList.add(CLASS_NAME_ACTIVE$2);\n      activeElement.classList.remove(CLASS_NAME_ACTIVE$2, orderClassName, directionalClassName);\n      this._isSliding = false;\n      triggerEvent(EVENT_SLID);\n    };\n    this._queueCallback(completeCallBack, activeElement, this._isAnimated());\n    if (isCycling) {\n      this.cycle();\n    }\n  }\n  _isAnimated() {\n    return this._element.classList.contains(CLASS_NAME_SLIDE);\n  }\n  _getActive() {\n    return SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element);\n  }\n  _getItems() {\n    return SelectorEngine.find(SELECTOR_ITEM, this._element);\n  }\n  _clearInterval() {\n    if (this._interval) {\n      clearInterval(this._interval);\n      this._interval = null;\n    }\n  }\n  _directionToOrder(direction) {\n    if (isRTL()) {\n      return direction === DIRECTION_LEFT ? ORDER_PREV : ORDER_NEXT;\n    }\n    return direction === DIRECTION_LEFT ? ORDER_NEXT : ORDER_PREV;\n  }\n  _orderToDirection(order) {\n    if (isRTL()) {\n      return order === ORDER_PREV ? DIRECTION_LEFT : DIRECTION_RIGHT;\n    }\n    return order === ORDER_PREV ? DIRECTION_RIGHT : DIRECTION_LEFT;\n  }\n\n  // Static\n  static jQueryInterface(config) {\n    return this.each(function () {\n      const data = Carousel.getOrCreateInstance(this, config);\n      if (typeof config === 'number') {\n        data.to(config);\n        return;\n      }\n      if (typeof config === 'string') {\n        if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n          throw new TypeError(`No method named \"${config}\"`);\n        }\n        data[config]();\n      }\n    });\n  }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API$5, SELECTOR_DATA_SLIDE, function (event) {\n  const target = SelectorEngine.getElementFromSelector(this);\n  if (!target || !target.classList.contains(CLASS_NAME_CAROUSEL)) {\n    return;\n  }\n  event.preventDefault();\n  const carousel = Carousel.getOrCreateInstance(target);\n  const slideIndex = this.getAttribute('data-bs-slide-to');\n  if (slideIndex) {\n    carousel.to(slideIndex);\n    carousel._maybeEnableCycle();\n    return;\n  }\n  if (Manipulator.getDataAttribute(this, 'slide') === 'next') {\n    carousel.next();\n    carousel._maybeEnableCycle();\n    return;\n  }\n  carousel.prev();\n  carousel._maybeEnableCycle();\n});\nEventHandler.on(window, EVENT_LOAD_DATA_API$3, () => {\n  const carousels = SelectorEngine.find(SELECTOR_DATA_RIDE);\n  for (const carousel of carousels) {\n    Carousel.getOrCreateInstance(carousel);\n  }\n});\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Carousel);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap collapse.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$b = 'collapse';\nconst DATA_KEY$7 = 'bs.collapse';\nconst EVENT_KEY$7 = `.${DATA_KEY$7}`;\nconst DATA_API_KEY$4 = '.data-api';\nconst EVENT_SHOW$6 = `show${EVENT_KEY$7}`;\nconst EVENT_SHOWN$6 = `shown${EVENT_KEY$7}`;\nconst EVENT_HIDE$6 = `hide${EVENT_KEY$7}`;\nconst EVENT_HIDDEN$6 = `hidden${EVENT_KEY$7}`;\nconst EVENT_CLICK_DATA_API$4 = `click${EVENT_KEY$7}${DATA_API_KEY$4}`;\nconst CLASS_NAME_SHOW$7 = 'show';\nconst CLASS_NAME_COLLAPSE = 'collapse';\nconst CLASS_NAME_COLLAPSING = 'collapsing';\nconst CLASS_NAME_COLLAPSED = 'collapsed';\nconst CLASS_NAME_DEEPER_CHILDREN = `:scope .${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`;\nconst CLASS_NAME_HORIZONTAL = 'collapse-horizontal';\nconst WIDTH = 'width';\nconst HEIGHT = 'height';\nconst SELECTOR_ACTIVES = '.collapse.show, .collapse.collapsing';\nconst SELECTOR_DATA_TOGGLE$4 = '[data-bs-toggle=\"collapse\"]';\nconst Default$a = {\n  parent: null,\n  toggle: true\n};\nconst DefaultType$a = {\n  parent: '(null|element)',\n  toggle: 'boolean'\n};\n\n/**\n * Class definition\n */\n\nclass Collapse extends BaseComponent {\n  constructor(element, config) {\n    super(element, config);\n    this._isTransitioning = false;\n    this._triggerArray = [];\n    const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE$4);\n    for (const elem of toggleList) {\n      const selector = SelectorEngine.getSelectorFromElement(elem);\n      const filterElement = SelectorEngine.find(selector).filter(foundElement => foundElement === this._element);\n      if (selector !== null && filterElement.length) {\n        this._triggerArray.push(elem);\n      }\n    }\n    this._initializeChildren();\n    if (!this._config.parent) {\n      this._addAriaAndCollapsedClass(this._triggerArray, this._isShown());\n    }\n    if (this._config.toggle) {\n      this.toggle();\n    }\n  }\n\n  // Getters\n  static get Default() {\n    return Default$a;\n  }\n  static get DefaultType() {\n    return DefaultType$a;\n  }\n  static get NAME() {\n    return NAME$b;\n  }\n\n  // Public\n  toggle() {\n    if (this._isShown()) {\n      this.hide();\n    } else {\n      this.show();\n    }\n  }\n  show() {\n    if (this._isTransitioning || this._isShown()) {\n      return;\n    }\n    let activeChildren = [];\n\n    // find active children\n    if (this._config.parent) {\n      activeChildren = this._getFirstLevelChildren(SELECTOR_ACTIVES).filter(element => element !== this._element).map(element => Collapse.getOrCreateInstance(element, {\n        toggle: false\n      }));\n    }\n    if (activeChildren.length && activeChildren[0]._isTransitioning) {\n      return;\n    }\n    const startEvent = EventHandler.trigger(this._element, EVENT_SHOW$6);\n    if (startEvent.defaultPrevented) {\n      return;\n    }\n    for (const activeInstance of activeChildren) {\n      activeInstance.hide();\n    }\n    const dimension = this._getDimension();\n    this._element.classList.remove(CLASS_NAME_COLLAPSE);\n    this._element.classList.add(CLASS_NAME_COLLAPSING);\n    this._element.style[dimension] = 0;\n    this._addAriaAndCollapsedClass(this._triggerArray, true);\n    this._isTransitioning = true;\n    const complete = () => {\n      this._isTransitioning = false;\n      this._element.classList.remove(CLASS_NAME_COLLAPSING);\n      this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7);\n      this._element.style[dimension] = '';\n      EventHandler.trigger(this._element, EVENT_SHOWN$6);\n    };\n    const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);\n    const scrollSize = `scroll${capitalizedDimension}`;\n    this._queueCallback(complete, this._element, true);\n    this._element.style[dimension] = `${this._element[scrollSize]}px`;\n  }\n  hide() {\n    if (this._isTransitioning || !this._isShown()) {\n      return;\n    }\n    const startEvent = EventHandler.trigger(this._element, EVENT_HIDE$6);\n    if (startEvent.defaultPrevented) {\n      return;\n    }\n    const dimension = this._getDimension();\n    this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`;\n    reflow(this._element);\n    this._element.classList.add(CLASS_NAME_COLLAPSING);\n    this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7);\n    for (const trigger of this._triggerArray) {\n      const element = SelectorEngine.getElementFromSelector(trigger);\n      if (element && !this._isShown(element)) {\n        this._addAriaAndCollapsedClass([trigger], false);\n      }\n    }\n    this._isTransitioning = true;\n    const complete = () => {\n      this._isTransitioning = false;\n      this._element.classList.remove(CLASS_NAME_COLLAPSING);\n      this._element.classList.add(CLASS_NAME_COLLAPSE);\n      EventHandler.trigger(this._element, EVENT_HIDDEN$6);\n    };\n    this._element.style[dimension] = '';\n    this._queueCallback(complete, this._element, true);\n  }\n\n  // Private\n  _isShown(element = this._element) {\n    return element.classList.contains(CLASS_NAME_SHOW$7);\n  }\n  _configAfterMerge(config) {\n    config.toggle = Boolean(config.toggle); // Coerce string values\n    config.parent = getElement(config.parent);\n    return config;\n  }\n  _getDimension() {\n    return this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT;\n  }\n  _initializeChildren() {\n    if (!this._config.parent) {\n      return;\n    }\n    const children = this._getFirstLevelChildren(SELECTOR_DATA_TOGGLE$4);\n    for (const element of children) {\n      const selected = SelectorEngine.getElementFromSelector(element);\n      if (selected) {\n        this._addAriaAndCollapsedClass([element], this._isShown(selected));\n      }\n    }\n  }\n  _getFirstLevelChildren(selector) {\n    const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent);\n    // remove children if greater depth\n    return SelectorEngine.find(selector, this._config.parent).filter(element => !children.includes(element));\n  }\n  _addAriaAndCollapsedClass(triggerArray, isOpen) {\n    if (!triggerArray.length) {\n      return;\n    }\n    for (const element of triggerArray) {\n      element.classList.toggle(CLASS_NAME_COLLAPSED, !isOpen);\n      element.setAttribute('aria-expanded', isOpen);\n    }\n  }\n\n  // Static\n  static jQueryInterface(config) {\n    const _config = {};\n    if (typeof config === 'string' && /show|hide/.test(config)) {\n      _config.toggle = false;\n    }\n    return this.each(function () {\n      const data = Collapse.getOrCreateInstance(this, _config);\n      if (typeof config === 'string') {\n        if (typeof data[config] === 'undefined') {\n          throw new TypeError(`No method named \"${config}\"`);\n        }\n        data[config]();\n      }\n    });\n  }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API$4, SELECTOR_DATA_TOGGLE$4, function (event) {\n  // preventDefault only for <a> elements (which change the URL) not inside the collapsible element\n  if (event.target.tagName === 'A' || event.delegateTarget && event.delegateTarget.tagName === 'A') {\n    event.preventDefault();\n  }\n  for (const element of SelectorEngine.getMultipleElementsFromSelector(this)) {\n    Collapse.getOrCreateInstance(element, {\n      toggle: false\n    }).toggle();\n  }\n});\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Collapse);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap dropdown.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$a = 'dropdown';\nconst DATA_KEY$6 = 'bs.dropdown';\nconst EVENT_KEY$6 = `.${DATA_KEY$6}`;\nconst DATA_API_KEY$3 = '.data-api';\nconst ESCAPE_KEY$2 = 'Escape';\nconst TAB_KEY$1 = 'Tab';\nconst ARROW_UP_KEY$1 = 'ArrowUp';\nconst ARROW_DOWN_KEY$1 = 'ArrowDown';\nconst RIGHT_MOUSE_BUTTON = 2; // MouseEvent.button value for the secondary button, usually the right button\n\nconst EVENT_HIDE$5 = `hide${EVENT_KEY$6}`;\nconst EVENT_HIDDEN$5 = `hidden${EVENT_KEY$6}`;\nconst EVENT_SHOW$5 = `show${EVENT_KEY$6}`;\nconst EVENT_SHOWN$5 = `shown${EVENT_KEY$6}`;\nconst EVENT_CLICK_DATA_API$3 = `click${EVENT_KEY$6}${DATA_API_KEY$3}`;\nconst EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY$6}${DATA_API_KEY$3}`;\nconst EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY$6}${DATA_API_KEY$3}`;\nconst CLASS_NAME_SHOW$6 = 'show';\nconst CLASS_NAME_DROPUP = 'dropup';\nconst CLASS_NAME_DROPEND = 'dropend';\nconst CLASS_NAME_DROPSTART = 'dropstart';\nconst CLASS_NAME_DROPUP_CENTER = 'dropup-center';\nconst CLASS_NAME_DROPDOWN_CENTER = 'dropdown-center';\nconst SELECTOR_DATA_TOGGLE$3 = '[data-bs-toggle=\"dropdown\"]:not(.disabled):not(:disabled)';\nconst SELECTOR_DATA_TOGGLE_SHOWN = `${SELECTOR_DATA_TOGGLE$3}.${CLASS_NAME_SHOW$6}`;\nconst SELECTOR_MENU = '.dropdown-menu';\nconst SELECTOR_NAVBAR = '.navbar';\nconst SELECTOR_NAVBAR_NAV = '.navbar-nav';\nconst SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)';\nconst PLACEMENT_TOP = isRTL() ? 'top-end' : 'top-start';\nconst PLACEMENT_TOPEND = isRTL() ? 'top-start' : 'top-end';\nconst PLACEMENT_BOTTOM = isRTL() ? 'bottom-end' : 'bottom-start';\nconst PLACEMENT_BOTTOMEND = isRTL() ? 'bottom-start' : 'bottom-end';\nconst PLACEMENT_RIGHT = isRTL() ? 'left-start' : 'right-start';\nconst PLACEMENT_LEFT = isRTL() ? 'right-start' : 'left-start';\nconst PLACEMENT_TOPCENTER = 'top';\nconst PLACEMENT_BOTTOMCENTER = 'bottom';\nconst Default$9 = {\n  autoClose: true,\n  boundary: 'clippingParents',\n  display: 'dynamic',\n  offset: [0, 2],\n  popperConfig: null,\n  reference: 'toggle'\n};\nconst DefaultType$9 = {\n  autoClose: '(boolean|string)',\n  boundary: '(string|element)',\n  display: 'string',\n  offset: '(array|string|function)',\n  popperConfig: '(null|object|function)',\n  reference: '(string|element|object)'\n};\n\n/**\n * Class definition\n */\n\nclass Dropdown extends BaseComponent {\n  constructor(element, config) {\n    super(element, config);\n    this._popper = null;\n    this._parent = this._element.parentNode; // dropdown wrapper\n    // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/\n    this._menu = SelectorEngine.next(this._element, SELECTOR_MENU)[0] || SelectorEngine.prev(this._element, SELECTOR_MENU)[0] || SelectorEngine.findOne(SELECTOR_MENU, this._parent);\n    this._inNavbar = this._detectNavbar();\n  }\n\n  // Getters\n  static get Default() {\n    return Default$9;\n  }\n  static get DefaultType() {\n    return DefaultType$9;\n  }\n  static get NAME() {\n    return NAME$a;\n  }\n\n  // Public\n  toggle() {\n    return this._isShown() ? this.hide() : this.show();\n  }\n  show() {\n    if (isDisabled(this._element) || this._isShown()) {\n      return;\n    }\n    const relatedTarget = {\n      relatedTarget: this._element\n    };\n    const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$5, relatedTarget);\n    if (showEvent.defaultPrevented) {\n      return;\n    }\n    this._createPopper();\n\n    // If this is a touch-enabled device we add extra\n    // empty mouseover listeners to the body's immediate children;\n    // only needed because of broken event delegation on iOS\n    // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n    if ('ontouchstart' in document.documentElement && !this._parent.closest(SELECTOR_NAVBAR_NAV)) {\n      for (const element of [].concat(...document.body.children)) {\n        EventHandler.on(element, 'mouseover', noop);\n      }\n    }\n    this._element.focus();\n    this._element.setAttribute('aria-expanded', true);\n    this._menu.classList.add(CLASS_NAME_SHOW$6);\n    this._element.classList.add(CLASS_NAME_SHOW$6);\n    EventHandler.trigger(this._element, EVENT_SHOWN$5, relatedTarget);\n  }\n  hide() {\n    if (isDisabled(this._element) || !this._isShown()) {\n      return;\n    }\n    const relatedTarget = {\n      relatedTarget: this._element\n    };\n    this._completeHide(relatedTarget);\n  }\n  dispose() {\n    if (this._popper) {\n      this._popper.destroy();\n    }\n    super.dispose();\n  }\n  update() {\n    this._inNavbar = this._detectNavbar();\n    if (this._popper) {\n      this._popper.update();\n    }\n  }\n\n  // Private\n  _completeHide(relatedTarget) {\n    const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$5, relatedTarget);\n    if (hideEvent.defaultPrevented) {\n      return;\n    }\n\n    // If this is a touch-enabled device we remove the extra\n    // empty mouseover listeners we added for iOS support\n    if ('ontouchstart' in document.documentElement) {\n      for (const element of [].concat(...document.body.children)) {\n        EventHandler.off(element, 'mouseover', noop);\n      }\n    }\n    if (this._popper) {\n      this._popper.destroy();\n    }\n    this._menu.classList.remove(CLASS_NAME_SHOW$6);\n    this._element.classList.remove(CLASS_NAME_SHOW$6);\n    this._element.setAttribute('aria-expanded', 'false');\n    Manipulator.removeDataAttribute(this._menu, 'popper');\n    EventHandler.trigger(this._element, EVENT_HIDDEN$5, relatedTarget);\n  }\n  _getConfig(config) {\n    config = super._getConfig(config);\n    if (typeof config.reference === 'object' && !isElement(config.reference) && typeof config.reference.getBoundingClientRect !== 'function') {\n      // Popper virtual elements require a getBoundingClientRect method\n      throw new TypeError(`${NAME$a.toUpperCase()}: Option \"reference\" provided type \"object\" without a required \"getBoundingClientRect\" method.`);\n    }\n    return config;\n  }\n  _createPopper() {\n    if (typeof Popper === 'undefined') {\n      throw new TypeError('Bootstrap\\'s dropdowns require Popper (https://popper.js.org/docs/v2/)');\n    }\n    let referenceElement = this._element;\n    if (this._config.reference === 'parent') {\n      referenceElement = this._parent;\n    } else if (isElement(this._config.reference)) {\n      referenceElement = getElement(this._config.reference);\n    } else if (typeof this._config.reference === 'object') {\n      referenceElement = this._config.reference;\n    }\n    const popperConfig = this._getPopperConfig();\n    this._popper = Popper.createPopper(referenceElement, this._menu, popperConfig);\n  }\n  _isShown() {\n    return this._menu.classList.contains(CLASS_NAME_SHOW$6);\n  }\n  _getPlacement() {\n    const parentDropdown = this._parent;\n    if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) {\n      return PLACEMENT_RIGHT;\n    }\n    if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) {\n      return PLACEMENT_LEFT;\n    }\n    if (parentDropdown.classList.contains(CLASS_NAME_DROPUP_CENTER)) {\n      return PLACEMENT_TOPCENTER;\n    }\n    if (parentDropdown.classList.contains(CLASS_NAME_DROPDOWN_CENTER)) {\n      return PLACEMENT_BOTTOMCENTER;\n    }\n\n    // We need to trim the value because custom properties can also include spaces\n    const isEnd = getComputedStyle(this._menu).getPropertyValue('--bs-position').trim() === 'end';\n    if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) {\n      return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP;\n    }\n    return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM;\n  }\n  _detectNavbar() {\n    return this._element.closest(SELECTOR_NAVBAR) !== null;\n  }\n  _getOffset() {\n    const {\n      offset\n    } = this._config;\n    if (typeof offset === 'string') {\n      return offset.split(',').map(value => Number.parseInt(value, 10));\n    }\n    if (typeof offset === 'function') {\n      return popperData => offset(popperData, this._element);\n    }\n    return offset;\n  }\n  _getPopperConfig() {\n    const defaultBsPopperConfig = {\n      placement: this._getPlacement(),\n      modifiers: [{\n        name: 'preventOverflow',\n        options: {\n          boundary: this._config.boundary\n        }\n      }, {\n        name: 'offset',\n        options: {\n          offset: this._getOffset()\n        }\n      }]\n    };\n\n    // Disable Popper if we have a static display or Dropdown is in Navbar\n    if (this._inNavbar || this._config.display === 'static') {\n      Manipulator.setDataAttribute(this._menu, 'popper', 'static'); // TODO: v6 remove\n      defaultBsPopperConfig.modifiers = [{\n        name: 'applyStyles',\n        enabled: false\n      }];\n    }\n    return {\n      ...defaultBsPopperConfig,\n      ...execute(this._config.popperConfig, [undefined, defaultBsPopperConfig])\n    };\n  }\n  _selectMenuItem({\n    key,\n    target\n  }) {\n    const items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, this._menu).filter(element => isVisible(element));\n    if (!items.length) {\n      return;\n    }\n\n    // if target isn't included in items (e.g. when expanding the dropdown)\n    // allow cycling to get the last item in case key equals ARROW_UP_KEY\n    getNextActiveElement(items, target, key === ARROW_DOWN_KEY$1, !items.includes(target)).focus();\n  }\n\n  // Static\n  static jQueryInterface(config) {\n    return this.each(function () {\n      const data = Dropdown.getOrCreateInstance(this, config);\n      if (typeof config !== 'string') {\n        return;\n      }\n      if (typeof data[config] === 'undefined') {\n        throw new TypeError(`No method named \"${config}\"`);\n      }\n      data[config]();\n    });\n  }\n  static clearMenus(event) {\n    if (event.button === RIGHT_MOUSE_BUTTON || event.type === 'keyup' && event.key !== TAB_KEY$1) {\n      return;\n    }\n    const openToggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE_SHOWN);\n    for (const toggle of openToggles) {\n      const context = Dropdown.getInstance(toggle);\n      if (!context || context._config.autoClose === false) {\n        continue;\n      }\n      const composedPath = event.composedPath();\n      const isMenuTarget = composedPath.includes(context._menu);\n      if (composedPath.includes(context._element) || context._config.autoClose === 'inside' && !isMenuTarget || context._config.autoClose === 'outside' && isMenuTarget) {\n        continue;\n      }\n\n      // Tab navigation through the dropdown menu or events from contained inputs shouldn't close the menu\n      if (context._menu.contains(event.target) && (event.type === 'keyup' && event.key === TAB_KEY$1 || /input|select|option|textarea|form/i.test(event.target.tagName))) {\n        continue;\n      }\n      const relatedTarget = {\n        relatedTarget: context._element\n      };\n      if (event.type === 'click') {\n        relatedTarget.clickEvent = event;\n      }\n      context._completeHide(relatedTarget);\n    }\n  }\n  static dataApiKeydownHandler(event) {\n    // If not an UP | DOWN | ESCAPE key => not a dropdown command\n    // If input/textarea && if key is other than ESCAPE => not a dropdown command\n\n    const isInput = /input|textarea/i.test(event.target.tagName);\n    const isEscapeEvent = event.key === ESCAPE_KEY$2;\n    const isUpOrDownEvent = [ARROW_UP_KEY$1, ARROW_DOWN_KEY$1].includes(event.key);\n    if (!isUpOrDownEvent && !isEscapeEvent) {\n      return;\n    }\n    if (isInput && !isEscapeEvent) {\n      return;\n    }\n    event.preventDefault();\n\n    // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/\n    const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE$3) ? this : SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE$3)[0] || SelectorEngine.next(this, SELECTOR_DATA_TOGGLE$3)[0] || SelectorEngine.findOne(SELECTOR_DATA_TOGGLE$3, event.delegateTarget.parentNode);\n    const instance = Dropdown.getOrCreateInstance(getToggleButton);\n    if (isUpOrDownEvent) {\n      event.stopPropagation();\n      instance.show();\n      instance._selectMenuItem(event);\n      return;\n    }\n    if (instance._isShown()) {\n      // else is escape and we check if it is shown\n      event.stopPropagation();\n      instance.hide();\n      getToggleButton.focus();\n    }\n  }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE$3, Dropdown.dataApiKeydownHandler);\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler);\nEventHandler.on(document, EVENT_CLICK_DATA_API$3, Dropdown.clearMenus);\nEventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus);\nEventHandler.on(document, EVENT_CLICK_DATA_API$3, SELECTOR_DATA_TOGGLE$3, function (event) {\n  event.preventDefault();\n  Dropdown.getOrCreateInstance(this).toggle();\n});\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Dropdown);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/backdrop.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$9 = 'backdrop';\nconst CLASS_NAME_FADE$4 = 'fade';\nconst CLASS_NAME_SHOW$5 = 'show';\nconst EVENT_MOUSEDOWN = `mousedown.bs.${NAME$9}`;\nconst Default$8 = {\n  className: 'modal-backdrop',\n  clickCallback: null,\n  isAnimated: false,\n  isVisible: true,\n  // if false, we use the backdrop helper without adding any element to the dom\n  rootElement: 'body' // give the choice to place backdrop under different elements\n};\nconst DefaultType$8 = {\n  className: 'string',\n  clickCallback: '(function|null)',\n  isAnimated: 'boolean',\n  isVisible: 'boolean',\n  rootElement: '(element|string)'\n};\n\n/**\n * Class definition\n */\n\nclass Backdrop extends Config {\n  constructor(config) {\n    super();\n    this._config = this._getConfig(config);\n    this._isAppended = false;\n    this._element = null;\n  }\n\n  // Getters\n  static get Default() {\n    return Default$8;\n  }\n  static get DefaultType() {\n    return DefaultType$8;\n  }\n  static get NAME() {\n    return NAME$9;\n  }\n\n  // Public\n  show(callback) {\n    if (!this._config.isVisible) {\n      execute(callback);\n      return;\n    }\n    this._append();\n    const element = this._getElement();\n    if (this._config.isAnimated) {\n      reflow(element);\n    }\n    element.classList.add(CLASS_NAME_SHOW$5);\n    this._emulateAnimation(() => {\n      execute(callback);\n    });\n  }\n  hide(callback) {\n    if (!this._config.isVisible) {\n      execute(callback);\n      return;\n    }\n    this._getElement().classList.remove(CLASS_NAME_SHOW$5);\n    this._emulateAnimation(() => {\n      this.dispose();\n      execute(callback);\n    });\n  }\n  dispose() {\n    if (!this._isAppended) {\n      return;\n    }\n    EventHandler.off(this._element, EVENT_MOUSEDOWN);\n    this._element.remove();\n    this._isAppended = false;\n  }\n\n  // Private\n  _getElement() {\n    if (!this._element) {\n      const backdrop = document.createElement('div');\n      backdrop.className = this._config.className;\n      if (this._config.isAnimated) {\n        backdrop.classList.add(CLASS_NAME_FADE$4);\n      }\n      this._element = backdrop;\n    }\n    return this._element;\n  }\n  _configAfterMerge(config) {\n    // use getElement() with the default \"body\" to get a fresh Element on each instantiation\n    config.rootElement = getElement(config.rootElement);\n    return config;\n  }\n  _append() {\n    if (this._isAppended) {\n      return;\n    }\n    const element = this._getElement();\n    this._config.rootElement.append(element);\n    EventHandler.on(element, EVENT_MOUSEDOWN, () => {\n      execute(this._config.clickCallback);\n    });\n    this._isAppended = true;\n  }\n  _emulateAnimation(callback) {\n    executeAfterTransition(callback, this._getElement(), this._config.isAnimated);\n  }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/focustrap.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$8 = 'focustrap';\nconst DATA_KEY$5 = 'bs.focustrap';\nconst EVENT_KEY$5 = `.${DATA_KEY$5}`;\nconst EVENT_FOCUSIN$2 = `focusin${EVENT_KEY$5}`;\nconst EVENT_KEYDOWN_TAB = `keydown.tab${EVENT_KEY$5}`;\nconst TAB_KEY = 'Tab';\nconst TAB_NAV_FORWARD = 'forward';\nconst TAB_NAV_BACKWARD = 'backward';\nconst Default$7 = {\n  autofocus: true,\n  trapElement: null // The element to trap focus inside of\n};\nconst DefaultType$7 = {\n  autofocus: 'boolean',\n  trapElement: 'element'\n};\n\n/**\n * Class definition\n */\n\nclass FocusTrap extends Config {\n  constructor(config) {\n    super();\n    this._config = this._getConfig(config);\n    this._isActive = false;\n    this._lastTabNavDirection = null;\n  }\n\n  // Getters\n  static get Default() {\n    return Default$7;\n  }\n  static get DefaultType() {\n    return DefaultType$7;\n  }\n  static get NAME() {\n    return NAME$8;\n  }\n\n  // Public\n  activate() {\n    if (this._isActive) {\n      return;\n    }\n    if (this._config.autofocus) {\n      this._config.trapElement.focus();\n    }\n    EventHandler.off(document, EVENT_KEY$5); // guard against infinite focus loop\n    EventHandler.on(document, EVENT_FOCUSIN$2, event => this._handleFocusin(event));\n    EventHandler.on(document, EVENT_KEYDOWN_TAB, event => this._handleKeydown(event));\n    this._isActive = true;\n  }\n  deactivate() {\n    if (!this._isActive) {\n      return;\n    }\n    this._isActive = false;\n    EventHandler.off(document, EVENT_KEY$5);\n  }\n\n  // Private\n  _handleFocusin(event) {\n    const {\n      trapElement\n    } = this._config;\n    if (event.target === document || event.target === trapElement || trapElement.contains(event.target)) {\n      return;\n    }\n    const elements = SelectorEngine.focusableChildren(trapElement);\n    if (elements.length === 0) {\n      trapElement.focus();\n    } else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) {\n      elements[elements.length - 1].focus();\n    } else {\n      elements[0].focus();\n    }\n  }\n  _handleKeydown(event) {\n    if (event.key !== TAB_KEY) {\n      return;\n    }\n    this._lastTabNavDirection = event.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD;\n  }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/scrollBar.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top';\nconst SELECTOR_STICKY_CONTENT = '.sticky-top';\nconst PROPERTY_PADDING = 'padding-right';\nconst PROPERTY_MARGIN = 'margin-right';\n\n/**\n * Class definition\n */\n\nclass ScrollBarHelper {\n  constructor() {\n    this._element = document.body;\n  }\n\n  // Public\n  getWidth() {\n    // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes\n    const documentWidth = document.documentElement.clientWidth;\n    return Math.abs(window.innerWidth - documentWidth);\n  }\n  hide() {\n    const width = this.getWidth();\n    this._disableOverFlow();\n    // give padding to element to balance the hidden scrollbar width\n    this._setElementAttributes(this._element, PROPERTY_PADDING, calculatedValue => calculatedValue + width);\n    // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements to keep showing fullwidth\n    this._setElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING, calculatedValue => calculatedValue + width);\n    this._setElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN, calculatedValue => calculatedValue - width);\n  }\n  reset() {\n    this._resetElementAttributes(this._element, 'overflow');\n    this._resetElementAttributes(this._element, PROPERTY_PADDING);\n    this._resetElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING);\n    this._resetElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN);\n  }\n  isOverflowing() {\n    return this.getWidth() > 0;\n  }\n\n  // Private\n  _disableOverFlow() {\n    this._saveInitialAttribute(this._element, 'overflow');\n    this._element.style.overflow = 'hidden';\n  }\n  _setElementAttributes(selector, styleProperty, callback) {\n    const scrollbarWidth = this.getWidth();\n    const manipulationCallBack = element => {\n      if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) {\n        return;\n      }\n      this._saveInitialAttribute(element, styleProperty);\n      const calculatedValue = window.getComputedStyle(element).getPropertyValue(styleProperty);\n      element.style.setProperty(styleProperty, `${callback(Number.parseFloat(calculatedValue))}px`);\n    };\n    this._applyManipulationCallback(selector, manipulationCallBack);\n  }\n  _saveInitialAttribute(element, styleProperty) {\n    const actualValue = element.style.getPropertyValue(styleProperty);\n    if (actualValue) {\n      Manipulator.setDataAttribute(element, styleProperty, actualValue);\n    }\n  }\n  _resetElementAttributes(selector, styleProperty) {\n    const manipulationCallBack = element => {\n      const value = Manipulator.getDataAttribute(element, styleProperty);\n      // We only want to remove the property if the value is `null`; the value can also be zero\n      if (value === null) {\n        element.style.removeProperty(styleProperty);\n        return;\n      }\n      Manipulator.removeDataAttribute(element, styleProperty);\n      element.style.setProperty(styleProperty, value);\n    };\n    this._applyManipulationCallback(selector, manipulationCallBack);\n  }\n  _applyManipulationCallback(selector, callBack) {\n    if (isElement(selector)) {\n      callBack(selector);\n      return;\n    }\n    for (const sel of SelectorEngine.find(selector, this._element)) {\n      callBack(sel);\n    }\n  }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap modal.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$7 = 'modal';\nconst DATA_KEY$4 = 'bs.modal';\nconst EVENT_KEY$4 = `.${DATA_KEY$4}`;\nconst DATA_API_KEY$2 = '.data-api';\nconst ESCAPE_KEY$1 = 'Escape';\nconst EVENT_HIDE$4 = `hide${EVENT_KEY$4}`;\nconst EVENT_HIDE_PREVENTED$1 = `hidePrevented${EVENT_KEY$4}`;\nconst EVENT_HIDDEN$4 = `hidden${EVENT_KEY$4}`;\nconst EVENT_SHOW$4 = `show${EVENT_KEY$4}`;\nconst EVENT_SHOWN$4 = `shown${EVENT_KEY$4}`;\nconst EVENT_RESIZE$1 = `resize${EVENT_KEY$4}`;\nconst EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY$4}`;\nconst EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY$4}`;\nconst EVENT_KEYDOWN_DISMISS$1 = `keydown.dismiss${EVENT_KEY$4}`;\nconst EVENT_CLICK_DATA_API$2 = `click${EVENT_KEY$4}${DATA_API_KEY$2}`;\nconst CLASS_NAME_OPEN = 'modal-open';\nconst CLASS_NAME_FADE$3 = 'fade';\nconst CLASS_NAME_SHOW$4 = 'show';\nconst CLASS_NAME_STATIC = 'modal-static';\nconst OPEN_SELECTOR$1 = '.modal.show';\nconst SELECTOR_DIALOG = '.modal-dialog';\nconst SELECTOR_MODAL_BODY = '.modal-body';\nconst SELECTOR_DATA_TOGGLE$2 = '[data-bs-toggle=\"modal\"]';\nconst Default$6 = {\n  backdrop: true,\n  focus: true,\n  keyboard: true\n};\nconst DefaultType$6 = {\n  backdrop: '(boolean|string)',\n  focus: 'boolean',\n  keyboard: 'boolean'\n};\n\n/**\n * Class definition\n */\n\nclass Modal extends BaseComponent {\n  constructor(element, config) {\n    super(element, config);\n    this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, this._element);\n    this._backdrop = this._initializeBackDrop();\n    this._focustrap = this._initializeFocusTrap();\n    this._isShown = false;\n    this._isTransitioning = false;\n    this._scrollBar = new ScrollBarHelper();\n    this._addEventListeners();\n  }\n\n  // Getters\n  static get Default() {\n    return Default$6;\n  }\n  static get DefaultType() {\n    return DefaultType$6;\n  }\n  static get NAME() {\n    return NAME$7;\n  }\n\n  // Public\n  toggle(relatedTarget) {\n    return this._isShown ? this.hide() : this.show(relatedTarget);\n  }\n  show(relatedTarget) {\n    if (this._isShown || this._isTransitioning) {\n      return;\n    }\n    const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$4, {\n      relatedTarget\n    });\n    if (showEvent.defaultPrevented) {\n      return;\n    }\n    this._isShown = true;\n    this._isTransitioning = true;\n    this._scrollBar.hide();\n    document.body.classList.add(CLASS_NAME_OPEN);\n    this._adjustDialog();\n    this._backdrop.show(() => this._showElement(relatedTarget));\n  }\n  hide() {\n    if (!this._isShown || this._isTransitioning) {\n      return;\n    }\n    const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$4);\n    if (hideEvent.defaultPrevented) {\n      return;\n    }\n    this._isShown = false;\n    this._isTransitioning = true;\n    this._focustrap.deactivate();\n    this._element.classList.remove(CLASS_NAME_SHOW$4);\n    this._queueCallback(() => this._hideModal(), this._element, this._isAnimated());\n  }\n  dispose() {\n    EventHandler.off(window, EVENT_KEY$4);\n    EventHandler.off(this._dialog, EVENT_KEY$4);\n    this._backdrop.dispose();\n    this._focustrap.deactivate();\n    super.dispose();\n  }\n  handleUpdate() {\n    this._adjustDialog();\n  }\n\n  // Private\n  _initializeBackDrop() {\n    return new Backdrop({\n      isVisible: Boolean(this._config.backdrop),\n      // 'static' option will be translated to true, and booleans will keep their value,\n      isAnimated: this._isAnimated()\n    });\n  }\n  _initializeFocusTrap() {\n    return new FocusTrap({\n      trapElement: this._element\n    });\n  }\n  _showElement(relatedTarget) {\n    // try to append dynamic modal\n    if (!document.body.contains(this._element)) {\n      document.body.append(this._element);\n    }\n    this._element.style.display = 'block';\n    this._element.removeAttribute('aria-hidden');\n    this._element.setAttribute('aria-modal', true);\n    this._element.setAttribute('role', 'dialog');\n    this._element.scrollTop = 0;\n    const modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog);\n    if (modalBody) {\n      modalBody.scrollTop = 0;\n    }\n    reflow(this._element);\n    this._element.classList.add(CLASS_NAME_SHOW$4);\n    const transitionComplete = () => {\n      if (this._config.focus) {\n        this._focustrap.activate();\n      }\n      this._isTransitioning = false;\n      EventHandler.trigger(this._element, EVENT_SHOWN$4, {\n        relatedTarget\n      });\n    };\n    this._queueCallback(transitionComplete, this._dialog, this._isAnimated());\n  }\n  _addEventListeners() {\n    EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS$1, event => {\n      if (event.key !== ESCAPE_KEY$1) {\n        return;\n      }\n      if (this._config.keyboard) {\n        this.hide();\n        return;\n      }\n      this._triggerBackdropTransition();\n    });\n    EventHandler.on(window, EVENT_RESIZE$1, () => {\n      if (this._isShown && !this._isTransitioning) {\n        this._adjustDialog();\n      }\n    });\n    EventHandler.on(this._element, EVENT_MOUSEDOWN_DISMISS, event => {\n      // a bad trick to segregate clicks that may start inside dialog but end outside, and avoid listen to scrollbar clicks\n      EventHandler.one(this._element, EVENT_CLICK_DISMISS, event2 => {\n        if (this._element !== event.target || this._element !== event2.target) {\n          return;\n        }\n        if (this._config.backdrop === 'static') {\n          this._triggerBackdropTransition();\n          return;\n        }\n        if (this._config.backdrop) {\n          this.hide();\n        }\n      });\n    });\n  }\n  _hideModal() {\n    this._element.style.display = 'none';\n    this._element.setAttribute('aria-hidden', true);\n    this._element.removeAttribute('aria-modal');\n    this._element.removeAttribute('role');\n    this._isTransitioning = false;\n    this._backdrop.hide(() => {\n      document.body.classList.remove(CLASS_NAME_OPEN);\n      this._resetAdjustments();\n      this._scrollBar.reset();\n      EventHandler.trigger(this._element, EVENT_HIDDEN$4);\n    });\n  }\n  _isAnimated() {\n    return this._element.classList.contains(CLASS_NAME_FADE$3);\n  }\n  _triggerBackdropTransition() {\n    const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED$1);\n    if (hideEvent.defaultPrevented) {\n      return;\n    }\n    const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;\n    const initialOverflowY = this._element.style.overflowY;\n    // return if the following background transition hasn't yet completed\n    if (initialOverflowY === 'hidden' || this._element.classList.contains(CLASS_NAME_STATIC)) {\n      return;\n    }\n    if (!isModalOverflowing) {\n      this._element.style.overflowY = 'hidden';\n    }\n    this._element.classList.add(CLASS_NAME_STATIC);\n    this._queueCallback(() => {\n      this._element.classList.remove(CLASS_NAME_STATIC);\n      this._queueCallback(() => {\n        this._element.style.overflowY = initialOverflowY;\n      }, this._dialog);\n    }, this._dialog);\n    this._element.focus();\n  }\n\n  /**\n   * The following methods are used to handle overflowing modals\n   */\n\n  _adjustDialog() {\n    const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;\n    const scrollbarWidth = this._scrollBar.getWidth();\n    const isBodyOverflowing = scrollbarWidth > 0;\n    if (isBodyOverflowing && !isModalOverflowing) {\n      const property = isRTL() ? 'paddingLeft' : 'paddingRight';\n      this._element.style[property] = `${scrollbarWidth}px`;\n    }\n    if (!isBodyOverflowing && isModalOverflowing) {\n      const property = isRTL() ? 'paddingRight' : 'paddingLeft';\n      this._element.style[property] = `${scrollbarWidth}px`;\n    }\n  }\n  _resetAdjustments() {\n    this._element.style.paddingLeft = '';\n    this._element.style.paddingRight = '';\n  }\n\n  // Static\n  static jQueryInterface(config, relatedTarget) {\n    return this.each(function () {\n      const data = Modal.getOrCreateInstance(this, config);\n      if (typeof config !== 'string') {\n        return;\n      }\n      if (typeof data[config] === 'undefined') {\n        throw new TypeError(`No method named \"${config}\"`);\n      }\n      data[config](relatedTarget);\n    });\n  }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API$2, SELECTOR_DATA_TOGGLE$2, function (event) {\n  const target = SelectorEngine.getElementFromSelector(this);\n  if (['A', 'AREA'].includes(this.tagName)) {\n    event.preventDefault();\n  }\n  EventHandler.one(target, EVENT_SHOW$4, showEvent => {\n    if (showEvent.defaultPrevented) {\n      // only register focus restorer if modal will actually get shown\n      return;\n    }\n    EventHandler.one(target, EVENT_HIDDEN$4, () => {\n      if (isVisible(this)) {\n        this.focus();\n      }\n    });\n  });\n\n  // avoid conflict when clicking modal toggler while another one is open\n  const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR$1);\n  if (alreadyOpen) {\n    Modal.getInstance(alreadyOpen).hide();\n  }\n  const data = Modal.getOrCreateInstance(target);\n  data.toggle(this);\n});\nenableDismissTrigger(Modal);\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Modal);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap offcanvas.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$6 = 'offcanvas';\nconst DATA_KEY$3 = 'bs.offcanvas';\nconst EVENT_KEY$3 = `.${DATA_KEY$3}`;\nconst DATA_API_KEY$1 = '.data-api';\nconst EVENT_LOAD_DATA_API$2 = `load${EVENT_KEY$3}${DATA_API_KEY$1}`;\nconst ESCAPE_KEY = 'Escape';\nconst CLASS_NAME_SHOW$3 = 'show';\nconst CLASS_NAME_SHOWING$1 = 'showing';\nconst CLASS_NAME_HIDING = 'hiding';\nconst CLASS_NAME_BACKDROP = 'offcanvas-backdrop';\nconst OPEN_SELECTOR = '.offcanvas.show';\nconst EVENT_SHOW$3 = `show${EVENT_KEY$3}`;\nconst EVENT_SHOWN$3 = `shown${EVENT_KEY$3}`;\nconst EVENT_HIDE$3 = `hide${EVENT_KEY$3}`;\nconst EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY$3}`;\nconst EVENT_HIDDEN$3 = `hidden${EVENT_KEY$3}`;\nconst EVENT_RESIZE = `resize${EVENT_KEY$3}`;\nconst EVENT_CLICK_DATA_API$1 = `click${EVENT_KEY$3}${DATA_API_KEY$1}`;\nconst EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY$3}`;\nconst SELECTOR_DATA_TOGGLE$1 = '[data-bs-toggle=\"offcanvas\"]';\nconst Default$5 = {\n  backdrop: true,\n  keyboard: true,\n  scroll: false\n};\nconst DefaultType$5 = {\n  backdrop: '(boolean|string)',\n  keyboard: 'boolean',\n  scroll: 'boolean'\n};\n\n/**\n * Class definition\n */\n\nclass Offcanvas extends BaseComponent {\n  constructor(element, config) {\n    super(element, config);\n    this._isShown = false;\n    this._backdrop = this._initializeBackDrop();\n    this._focustrap = this._initializeFocusTrap();\n    this._addEventListeners();\n  }\n\n  // Getters\n  static get Default() {\n    return Default$5;\n  }\n  static get DefaultType() {\n    return DefaultType$5;\n  }\n  static get NAME() {\n    return NAME$6;\n  }\n\n  // Public\n  toggle(relatedTarget) {\n    return this._isShown ? this.hide() : this.show(relatedTarget);\n  }\n  show(relatedTarget) {\n    if (this._isShown) {\n      return;\n    }\n    const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$3, {\n      relatedTarget\n    });\n    if (showEvent.defaultPrevented) {\n      return;\n    }\n    this._isShown = true;\n    this._backdrop.show();\n    if (!this._config.scroll) {\n      new ScrollBarHelper().hide();\n    }\n    this._element.setAttribute('aria-modal', true);\n    this._element.setAttribute('role', 'dialog');\n    this._element.classList.add(CLASS_NAME_SHOWING$1);\n    const completeCallBack = () => {\n      if (!this._config.scroll || this._config.backdrop) {\n        this._focustrap.activate();\n      }\n      this._element.classList.add(CLASS_NAME_SHOW$3);\n      this._element.classList.remove(CLASS_NAME_SHOWING$1);\n      EventHandler.trigger(this._element, EVENT_SHOWN$3, {\n        relatedTarget\n      });\n    };\n    this._queueCallback(completeCallBack, this._element, true);\n  }\n  hide() {\n    if (!this._isShown) {\n      return;\n    }\n    const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$3);\n    if (hideEvent.defaultPrevented) {\n      return;\n    }\n    this._focustrap.deactivate();\n    this._element.blur();\n    this._isShown = false;\n    this._element.classList.add(CLASS_NAME_HIDING);\n    this._backdrop.hide();\n    const completeCallback = () => {\n      this._element.classList.remove(CLASS_NAME_SHOW$3, CLASS_NAME_HIDING);\n      this._element.removeAttribute('aria-modal');\n      this._element.removeAttribute('role');\n      if (!this._config.scroll) {\n        new ScrollBarHelper().reset();\n      }\n      EventHandler.trigger(this._element, EVENT_HIDDEN$3);\n    };\n    this._queueCallback(completeCallback, this._element, true);\n  }\n  dispose() {\n    this._backdrop.dispose();\n    this._focustrap.deactivate();\n    super.dispose();\n  }\n\n  // Private\n  _initializeBackDrop() {\n    const clickCallback = () => {\n      if (this._config.backdrop === 'static') {\n        EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED);\n        return;\n      }\n      this.hide();\n    };\n\n    // 'static' option will be translated to true, and booleans will keep their value\n    const isVisible = Boolean(this._config.backdrop);\n    return new Backdrop({\n      className: CLASS_NAME_BACKDROP,\n      isVisible,\n      isAnimated: true,\n      rootElement: this._element.parentNode,\n      clickCallback: isVisible ? clickCallback : null\n    });\n  }\n  _initializeFocusTrap() {\n    return new FocusTrap({\n      trapElement: this._element\n    });\n  }\n  _addEventListeners() {\n    EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {\n      if (event.key !== ESCAPE_KEY) {\n        return;\n      }\n      if (this._config.keyboard) {\n        this.hide();\n        return;\n      }\n      EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED);\n    });\n  }\n\n  // Static\n  static jQueryInterface(config) {\n    return this.each(function () {\n      const data = Offcanvas.getOrCreateInstance(this, config);\n      if (typeof config !== 'string') {\n        return;\n      }\n      if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n        throw new TypeError(`No method named \"${config}\"`);\n      }\n      data[config](this);\n    });\n  }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API$1, SELECTOR_DATA_TOGGLE$1, function (event) {\n  const target = SelectorEngine.getElementFromSelector(this);\n  if (['A', 'AREA'].includes(this.tagName)) {\n    event.preventDefault();\n  }\n  if (isDisabled(this)) {\n    return;\n  }\n  EventHandler.one(target, EVENT_HIDDEN$3, () => {\n    // focus on trigger when it is closed\n    if (isVisible(this)) {\n      this.focus();\n    }\n  });\n\n  // avoid conflict when clicking a toggler of an offcanvas, while another is open\n  const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR);\n  if (alreadyOpen && alreadyOpen !== target) {\n    Offcanvas.getInstance(alreadyOpen).hide();\n  }\n  const data = Offcanvas.getOrCreateInstance(target);\n  data.toggle(this);\n});\nEventHandler.on(window, EVENT_LOAD_DATA_API$2, () => {\n  for (const selector of SelectorEngine.find(OPEN_SELECTOR)) {\n    Offcanvas.getOrCreateInstance(selector).show();\n  }\n});\nEventHandler.on(window, EVENT_RESIZE, () => {\n  for (const element of SelectorEngine.find('[aria-modal][class*=show][class*=offcanvas-]')) {\n    if (getComputedStyle(element).position !== 'fixed') {\n      Offcanvas.getOrCreateInstance(element).hide();\n    }\n  }\n});\nenableDismissTrigger(Offcanvas);\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Offcanvas);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/sanitizer.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n// js-docs-start allow-list\nconst ARIA_ATTRIBUTE_PATTERN = /^aria-[\\w-]*$/i;\nconst DefaultAllowlist = {\n  // Global attributes allowed on any supplied element below.\n  '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\n  a: ['target', 'href', 'title', 'rel'],\n  area: [],\n  b: [],\n  br: [],\n  col: [],\n  code: [],\n  dd: [],\n  div: [],\n  dl: [],\n  dt: [],\n  em: [],\n  hr: [],\n  h1: [],\n  h2: [],\n  h3: [],\n  h4: [],\n  h5: [],\n  h6: [],\n  i: [],\n  img: ['src', 'srcset', 'alt', 'title', 'width', 'height'],\n  li: [],\n  ol: [],\n  p: [],\n  pre: [],\n  s: [],\n  small: [],\n  span: [],\n  sub: [],\n  sup: [],\n  strong: [],\n  u: [],\n  ul: []\n};\n// js-docs-end allow-list\n\nconst uriAttributes = new Set(['background', 'cite', 'href', 'itemtype', 'longdesc', 'poster', 'src', 'xlink:href']);\n\n/**\n * A pattern that recognizes URLs that are safe wrt. XSS in URL navigation\n * contexts.\n *\n * Shout-out to Angular https://github.com/angular/angular/blob/15.2.8/packages/core/src/sanitization/url_sanitizer.ts#L38\n */\nconst SAFE_URL_PATTERN = /^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i;\nconst allowedAttribute = (attribute, allowedAttributeList) => {\n  const attributeName = attribute.nodeName.toLowerCase();\n  if (allowedAttributeList.includes(attributeName)) {\n    if (uriAttributes.has(attributeName)) {\n      return Boolean(SAFE_URL_PATTERN.test(attribute.nodeValue));\n    }\n    return true;\n  }\n\n  // Check if a regular expression validates the attribute.\n  return allowedAttributeList.filter(attributeRegex => attributeRegex instanceof RegExp).some(regex => regex.test(attributeName));\n};\nfunction sanitizeHtml(unsafeHtml, allowList, sanitizeFunction) {\n  if (!unsafeHtml.length) {\n    return unsafeHtml;\n  }\n  if (sanitizeFunction && typeof sanitizeFunction === 'function') {\n    return sanitizeFunction(unsafeHtml);\n  }\n  const domParser = new window.DOMParser();\n  const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html');\n  const elements = [].concat(...createdDocument.body.querySelectorAll('*'));\n  for (const element of elements) {\n    const elementName = element.nodeName.toLowerCase();\n    if (!Object.keys(allowList).includes(elementName)) {\n      element.remove();\n      continue;\n    }\n    const attributeList = [].concat(...element.attributes);\n    const allowedAttributes = [].concat(allowList['*'] || [], allowList[elementName] || []);\n    for (const attribute of attributeList) {\n      if (!allowedAttribute(attribute, allowedAttributes)) {\n        element.removeAttribute(attribute.nodeName);\n      }\n    }\n  }\n  return createdDocument.body.innerHTML;\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/template-factory.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$5 = 'TemplateFactory';\nconst Default$4 = {\n  allowList: DefaultAllowlist,\n  content: {},\n  // { selector : text ,  selector2 : text2 , }\n  extraClass: '',\n  html: false,\n  sanitize: true,\n  sanitizeFn: null,\n  template: '<div></div>'\n};\nconst DefaultType$4 = {\n  allowList: 'object',\n  content: 'object',\n  extraClass: '(string|function)',\n  html: 'boolean',\n  sanitize: 'boolean',\n  sanitizeFn: '(null|function)',\n  template: 'string'\n};\nconst DefaultContentType = {\n  entry: '(string|element|function|null)',\n  selector: '(string|element)'\n};\n\n/**\n * Class definition\n */\n\nclass TemplateFactory extends Config {\n  constructor(config) {\n    super();\n    this._config = this._getConfig(config);\n  }\n\n  // Getters\n  static get Default() {\n    return Default$4;\n  }\n  static get DefaultType() {\n    return DefaultType$4;\n  }\n  static get NAME() {\n    return NAME$5;\n  }\n\n  // Public\n  getContent() {\n    return Object.values(this._config.content).map(config => this._resolvePossibleFunction(config)).filter(Boolean);\n  }\n  hasContent() {\n    return this.getContent().length > 0;\n  }\n  changeContent(content) {\n    this._checkContent(content);\n    this._config.content = {\n      ...this._config.content,\n      ...content\n    };\n    return this;\n  }\n  toHtml() {\n    const templateWrapper = document.createElement('div');\n    templateWrapper.innerHTML = this._maybeSanitize(this._config.template);\n    for (const [selector, text] of Object.entries(this._config.content)) {\n      this._setContent(templateWrapper, text, selector);\n    }\n    const template = templateWrapper.children[0];\n    const extraClass = this._resolvePossibleFunction(this._config.extraClass);\n    if (extraClass) {\n      template.classList.add(...extraClass.split(' '));\n    }\n    return template;\n  }\n\n  // Private\n  _typeCheckConfig(config) {\n    super._typeCheckConfig(config);\n    this._checkContent(config.content);\n  }\n  _checkContent(arg) {\n    for (const [selector, content] of Object.entries(arg)) {\n      super._typeCheckConfig({\n        selector,\n        entry: content\n      }, DefaultContentType);\n    }\n  }\n  _setContent(template, content, selector) {\n    const templateElement = SelectorEngine.findOne(selector, template);\n    if (!templateElement) {\n      return;\n    }\n    content = this._resolvePossibleFunction(content);\n    if (!content) {\n      templateElement.remove();\n      return;\n    }\n    if (isElement(content)) {\n      this._putElementInTemplate(getElement(content), templateElement);\n      return;\n    }\n    if (this._config.html) {\n      templateElement.innerHTML = this._maybeSanitize(content);\n      return;\n    }\n    templateElement.textContent = content;\n  }\n  _maybeSanitize(arg) {\n    return this._config.sanitize ? sanitizeHtml(arg, this._config.allowList, this._config.sanitizeFn) : arg;\n  }\n  _resolvePossibleFunction(arg) {\n    return execute(arg, [undefined, this]);\n  }\n  _putElementInTemplate(element, templateElement) {\n    if (this._config.html) {\n      templateElement.innerHTML = '';\n      templateElement.append(element);\n      return;\n    }\n    templateElement.textContent = element.textContent;\n  }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap tooltip.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$4 = 'tooltip';\nconst DISALLOWED_ATTRIBUTES = new Set(['sanitize', 'allowList', 'sanitizeFn']);\nconst CLASS_NAME_FADE$2 = 'fade';\nconst CLASS_NAME_MODAL = 'modal';\nconst CLASS_NAME_SHOW$2 = 'show';\nconst SELECTOR_TOOLTIP_INNER = '.tooltip-inner';\nconst SELECTOR_MODAL = `.${CLASS_NAME_MODAL}`;\nconst EVENT_MODAL_HIDE = 'hide.bs.modal';\nconst TRIGGER_HOVER = 'hover';\nconst TRIGGER_FOCUS = 'focus';\nconst TRIGGER_CLICK = 'click';\nconst TRIGGER_MANUAL = 'manual';\nconst EVENT_HIDE$2 = 'hide';\nconst EVENT_HIDDEN$2 = 'hidden';\nconst EVENT_SHOW$2 = 'show';\nconst EVENT_SHOWN$2 = 'shown';\nconst EVENT_INSERTED = 'inserted';\nconst EVENT_CLICK$1 = 'click';\nconst EVENT_FOCUSIN$1 = 'focusin';\nconst EVENT_FOCUSOUT$1 = 'focusout';\nconst EVENT_MOUSEENTER = 'mouseenter';\nconst EVENT_MOUSELEAVE = 'mouseleave';\nconst AttachmentMap = {\n  AUTO: 'auto',\n  TOP: 'top',\n  RIGHT: isRTL() ? 'left' : 'right',\n  BOTTOM: 'bottom',\n  LEFT: isRTL() ? 'right' : 'left'\n};\nconst Default$3 = {\n  allowList: DefaultAllowlist,\n  animation: true,\n  boundary: 'clippingParents',\n  container: false,\n  customClass: '',\n  delay: 0,\n  fallbackPlacements: ['top', 'right', 'bottom', 'left'],\n  html: false,\n  offset: [0, 6],\n  placement: 'top',\n  popperConfig: null,\n  sanitize: true,\n  sanitizeFn: null,\n  selector: false,\n  template: '<div class=\"tooltip\" role=\"tooltip\">' + '<div class=\"tooltip-arrow\"></div>' + '<div class=\"tooltip-inner\"></div>' + '</div>',\n  title: '',\n  trigger: 'hover focus'\n};\nconst DefaultType$3 = {\n  allowList: 'object',\n  animation: 'boolean',\n  boundary: '(string|element)',\n  container: '(string|element|boolean)',\n  customClass: '(string|function)',\n  delay: '(number|object)',\n  fallbackPlacements: 'array',\n  html: 'boolean',\n  offset: '(array|string|function)',\n  placement: '(string|function)',\n  popperConfig: '(null|object|function)',\n  sanitize: 'boolean',\n  sanitizeFn: '(null|function)',\n  selector: '(string|boolean)',\n  template: 'string',\n  title: '(string|element|function)',\n  trigger: 'string'\n};\n\n/**\n * Class definition\n */\n\nclass Tooltip extends BaseComponent {\n  constructor(element, config) {\n    if (typeof Popper === 'undefined') {\n      throw new TypeError('Bootstrap\\'s tooltips require Popper (https://popper.js.org/docs/v2/)');\n    }\n    super(element, config);\n\n    // Private\n    this._isEnabled = true;\n    this._timeout = 0;\n    this._isHovered = null;\n    this._activeTrigger = {};\n    this._popper = null;\n    this._templateFactory = null;\n    this._newContent = null;\n\n    // Protected\n    this.tip = null;\n    this._setListeners();\n    if (!this._config.selector) {\n      this._fixTitle();\n    }\n  }\n\n  // Getters\n  static get Default() {\n    return Default$3;\n  }\n  static get DefaultType() {\n    return DefaultType$3;\n  }\n  static get NAME() {\n    return NAME$4;\n  }\n\n  // Public\n  enable() {\n    this._isEnabled = true;\n  }\n  disable() {\n    this._isEnabled = false;\n  }\n  toggleEnabled() {\n    this._isEnabled = !this._isEnabled;\n  }\n  toggle() {\n    if (!this._isEnabled) {\n      return;\n    }\n    if (this._isShown()) {\n      this._leave();\n      return;\n    }\n    this._enter();\n  }\n  dispose() {\n    clearTimeout(this._timeout);\n    EventHandler.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);\n    if (this._element.getAttribute('data-bs-original-title')) {\n      this._element.setAttribute('title', this._element.getAttribute('data-bs-original-title'));\n    }\n    this._disposePopper();\n    super.dispose();\n  }\n  show() {\n    if (this._element.style.display === 'none') {\n      throw new Error('Please use show on visible elements');\n    }\n    if (!(this._isWithContent() && this._isEnabled)) {\n      return;\n    }\n    const showEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOW$2));\n    const shadowRoot = findShadowRoot(this._element);\n    const isInTheDom = (shadowRoot || this._element.ownerDocument.documentElement).contains(this._element);\n    if (showEvent.defaultPrevented || !isInTheDom) {\n      return;\n    }\n\n    // TODO: v6 remove this or make it optional\n    this._disposePopper();\n    const tip = this._getTipElement();\n    this._element.setAttribute('aria-describedby', tip.getAttribute('id'));\n    const {\n      container\n    } = this._config;\n    if (!this._element.ownerDocument.documentElement.contains(this.tip)) {\n      container.append(tip);\n      EventHandler.trigger(this._element, this.constructor.eventName(EVENT_INSERTED));\n    }\n    this._popper = this._createPopper(tip);\n    tip.classList.add(CLASS_NAME_SHOW$2);\n\n    // If this is a touch-enabled device we add extra\n    // empty mouseover listeners to the body's immediate children;\n    // only needed because of broken event delegation on iOS\n    // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n    if ('ontouchstart' in document.documentElement) {\n      for (const element of [].concat(...document.body.children)) {\n        EventHandler.on(element, 'mouseover', noop);\n      }\n    }\n    const complete = () => {\n      EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOWN$2));\n      if (this._isHovered === false) {\n        this._leave();\n      }\n      this._isHovered = false;\n    };\n    this._queueCallback(complete, this.tip, this._isAnimated());\n  }\n  hide() {\n    if (!this._isShown()) {\n      return;\n    }\n    const hideEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDE$2));\n    if (hideEvent.defaultPrevented) {\n      return;\n    }\n    const tip = this._getTipElement();\n    tip.classList.remove(CLASS_NAME_SHOW$2);\n\n    // If this is a touch-enabled device we remove the extra\n    // empty mouseover listeners we added for iOS support\n    if ('ontouchstart' in document.documentElement) {\n      for (const element of [].concat(...document.body.children)) {\n        EventHandler.off(element, 'mouseover', noop);\n      }\n    }\n    this._activeTrigger[TRIGGER_CLICK] = false;\n    this._activeTrigger[TRIGGER_FOCUS] = false;\n    this._activeTrigger[TRIGGER_HOVER] = false;\n    this._isHovered = null; // it is a trick to support manual triggering\n\n    const complete = () => {\n      if (this._isWithActiveTrigger()) {\n        return;\n      }\n      if (!this._isHovered) {\n        this._disposePopper();\n      }\n      this._element.removeAttribute('aria-describedby');\n      EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDDEN$2));\n    };\n    this._queueCallback(complete, this.tip, this._isAnimated());\n  }\n  update() {\n    if (this._popper) {\n      this._popper.update();\n    }\n  }\n\n  // Protected\n  _isWithContent() {\n    return Boolean(this._getTitle());\n  }\n  _getTipElement() {\n    if (!this.tip) {\n      this.tip = this._createTipElement(this._newContent || this._getContentForTemplate());\n    }\n    return this.tip;\n  }\n  _createTipElement(content) {\n    const tip = this._getTemplateFactory(content).toHtml();\n\n    // TODO: remove this check in v6\n    if (!tip) {\n      return null;\n    }\n    tip.classList.remove(CLASS_NAME_FADE$2, CLASS_NAME_SHOW$2);\n    // TODO: v6 the following can be achieved with CSS only\n    tip.classList.add(`bs-${this.constructor.NAME}-auto`);\n    const tipId = getUID(this.constructor.NAME).toString();\n    tip.setAttribute('id', tipId);\n    if (this._isAnimated()) {\n      tip.classList.add(CLASS_NAME_FADE$2);\n    }\n    return tip;\n  }\n  setContent(content) {\n    this._newContent = content;\n    if (this._isShown()) {\n      this._disposePopper();\n      this.show();\n    }\n  }\n  _getTemplateFactory(content) {\n    if (this._templateFactory) {\n      this._templateFactory.changeContent(content);\n    } else {\n      this._templateFactory = new TemplateFactory({\n        ...this._config,\n        // the `content` var has to be after `this._config`\n        // to override config.content in case of popover\n        content,\n        extraClass: this._resolvePossibleFunction(this._config.customClass)\n      });\n    }\n    return this._templateFactory;\n  }\n  _getContentForTemplate() {\n    return {\n      [SELECTOR_TOOLTIP_INNER]: this._getTitle()\n    };\n  }\n  _getTitle() {\n    return this._resolvePossibleFunction(this._config.title) || this._element.getAttribute('data-bs-original-title');\n  }\n\n  // Private\n  _initializeOnDelegatedTarget(event) {\n    return this.constructor.getOrCreateInstance(event.delegateTarget, this._getDelegateConfig());\n  }\n  _isAnimated() {\n    return this._config.animation || this.tip && this.tip.classList.contains(CLASS_NAME_FADE$2);\n  }\n  _isShown() {\n    return this.tip && this.tip.classList.contains(CLASS_NAME_SHOW$2);\n  }\n  _createPopper(tip) {\n    const placement = execute(this._config.placement, [this, tip, this._element]);\n    const attachment = AttachmentMap[placement.toUpperCase()];\n    return Popper.createPopper(this._element, tip, this._getPopperConfig(attachment));\n  }\n  _getOffset() {\n    const {\n      offset\n    } = this._config;\n    if (typeof offset === 'string') {\n      return offset.split(',').map(value => Number.parseInt(value, 10));\n    }\n    if (typeof offset === 'function') {\n      return popperData => offset(popperData, this._element);\n    }\n    return offset;\n  }\n  _resolvePossibleFunction(arg) {\n    return execute(arg, [this._element, this._element]);\n  }\n  _getPopperConfig(attachment) {\n    const defaultBsPopperConfig = {\n      placement: attachment,\n      modifiers: [{\n        name: 'flip',\n        options: {\n          fallbackPlacements: this._config.fallbackPlacements\n        }\n      }, {\n        name: 'offset',\n        options: {\n          offset: this._getOffset()\n        }\n      }, {\n        name: 'preventOverflow',\n        options: {\n          boundary: this._config.boundary\n        }\n      }, {\n        name: 'arrow',\n        options: {\n          element: `.${this.constructor.NAME}-arrow`\n        }\n      }, {\n        name: 'preSetPlacement',\n        enabled: true,\n        phase: 'beforeMain',\n        fn: data => {\n          // Pre-set Popper's placement attribute in order to read the arrow sizes properly.\n          // Otherwise, Popper mixes up the width and height dimensions since the initial arrow style is for top placement\n          this._getTipElement().setAttribute('data-popper-placement', data.state.placement);\n        }\n      }]\n    };\n    return {\n      ...defaultBsPopperConfig,\n      ...execute(this._config.popperConfig, [undefined, defaultBsPopperConfig])\n    };\n  }\n  _setListeners() {\n    const triggers = this._config.trigger.split(' ');\n    for (const trigger of triggers) {\n      if (trigger === 'click') {\n        EventHandler.on(this._element, this.constructor.eventName(EVENT_CLICK$1), this._config.selector, event => {\n          const context = this._initializeOnDelegatedTarget(event);\n          context._activeTrigger[TRIGGER_CLICK] = !(context._isShown() && context._activeTrigger[TRIGGER_CLICK]);\n          context.toggle();\n        });\n      } else if (trigger !== TRIGGER_MANUAL) {\n        const eventIn = trigger === TRIGGER_HOVER ? this.constructor.eventName(EVENT_MOUSEENTER) : this.constructor.eventName(EVENT_FOCUSIN$1);\n        const eventOut = trigger === TRIGGER_HOVER ? this.constructor.eventName(EVENT_MOUSELEAVE) : this.constructor.eventName(EVENT_FOCUSOUT$1);\n        EventHandler.on(this._element, eventIn, this._config.selector, event => {\n          const context = this._initializeOnDelegatedTarget(event);\n          context._activeTrigger[event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER] = true;\n          context._enter();\n        });\n        EventHandler.on(this._element, eventOut, this._config.selector, event => {\n          const context = this._initializeOnDelegatedTarget(event);\n          context._activeTrigger[event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER] = context._element.contains(event.relatedTarget);\n          context._leave();\n        });\n      }\n    }\n    this._hideModalHandler = () => {\n      if (this._element) {\n        this.hide();\n      }\n    };\n    EventHandler.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);\n  }\n  _fixTitle() {\n    const title = this._element.getAttribute('title');\n    if (!title) {\n      return;\n    }\n    if (!this._element.getAttribute('aria-label') && !this._element.textContent.trim()) {\n      this._element.setAttribute('aria-label', title);\n    }\n    this._element.setAttribute('data-bs-original-title', title); // DO NOT USE IT. Is only for backwards compatibility\n    this._element.removeAttribute('title');\n  }\n  _enter() {\n    if (this._isShown() || this._isHovered) {\n      this._isHovered = true;\n      return;\n    }\n    this._isHovered = true;\n    this._setTimeout(() => {\n      if (this._isHovered) {\n        this.show();\n      }\n    }, this._config.delay.show);\n  }\n  _leave() {\n    if (this._isWithActiveTrigger()) {\n      return;\n    }\n    this._isHovered = false;\n    this._setTimeout(() => {\n      if (!this._isHovered) {\n        this.hide();\n      }\n    }, this._config.delay.hide);\n  }\n  _setTimeout(handler, timeout) {\n    clearTimeout(this._timeout);\n    this._timeout = setTimeout(handler, timeout);\n  }\n  _isWithActiveTrigger() {\n    return Object.values(this._activeTrigger).includes(true);\n  }\n  _getConfig(config) {\n    const dataAttributes = Manipulator.getDataAttributes(this._element);\n    for (const dataAttribute of Object.keys(dataAttributes)) {\n      if (DISALLOWED_ATTRIBUTES.has(dataAttribute)) {\n        delete dataAttributes[dataAttribute];\n      }\n    }\n    config = {\n      ...dataAttributes,\n      ...(typeof config === 'object' && config ? config : {})\n    };\n    config = this._mergeConfigObj(config);\n    config = this._configAfterMerge(config);\n    this._typeCheckConfig(config);\n    return config;\n  }\n  _configAfterMerge(config) {\n    config.container = config.container === false ? document.body : getElement(config.container);\n    if (typeof config.delay === 'number') {\n      config.delay = {\n        show: config.delay,\n        hide: config.delay\n      };\n    }\n    if (typeof config.title === 'number') {\n      config.title = config.title.toString();\n    }\n    if (typeof config.content === 'number') {\n      config.content = config.content.toString();\n    }\n    return config;\n  }\n  _getDelegateConfig() {\n    const config = {};\n    for (const [key, value] of Object.entries(this._config)) {\n      if (this.constructor.Default[key] !== value) {\n        config[key] = value;\n      }\n    }\n    config.selector = false;\n    config.trigger = 'manual';\n\n    // In the future can be replaced with:\n    // const keysWithDifferentValues = Object.entries(this._config).filter(entry => this.constructor.Default[entry[0]] !== this._config[entry[0]])\n    // `Object.fromEntries(keysWithDifferentValues)`\n    return config;\n  }\n  _disposePopper() {\n    if (this._popper) {\n      this._popper.destroy();\n      this._popper = null;\n    }\n    if (this.tip) {\n      this.tip.remove();\n      this.tip = null;\n    }\n  }\n\n  // Static\n  static jQueryInterface(config) {\n    return this.each(function () {\n      const data = Tooltip.getOrCreateInstance(this, config);\n      if (typeof config !== 'string') {\n        return;\n      }\n      if (typeof data[config] === 'undefined') {\n        throw new TypeError(`No method named \"${config}\"`);\n      }\n      data[config]();\n    });\n  }\n}\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Tooltip);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap popover.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$3 = 'popover';\nconst SELECTOR_TITLE = '.popover-header';\nconst SELECTOR_CONTENT = '.popover-body';\nconst Default$2 = {\n  ...Tooltip.Default,\n  content: '',\n  offset: [0, 8],\n  placement: 'right',\n  template: '<div class=\"popover\" role=\"tooltip\">' + '<div class=\"popover-arrow\"></div>' + '<h3 class=\"popover-header\"></h3>' + '<div class=\"popover-body\"></div>' + '</div>',\n  trigger: 'click'\n};\nconst DefaultType$2 = {\n  ...Tooltip.DefaultType,\n  content: '(null|string|element|function)'\n};\n\n/**\n * Class definition\n */\n\nclass Popover extends Tooltip {\n  // Getters\n  static get Default() {\n    return Default$2;\n  }\n  static get DefaultType() {\n    return DefaultType$2;\n  }\n  static get NAME() {\n    return NAME$3;\n  }\n\n  // Overrides\n  _isWithContent() {\n    return this._getTitle() || this._getContent();\n  }\n\n  // Private\n  _getContentForTemplate() {\n    return {\n      [SELECTOR_TITLE]: this._getTitle(),\n      [SELECTOR_CONTENT]: this._getContent()\n    };\n  }\n  _getContent() {\n    return this._resolvePossibleFunction(this._config.content);\n  }\n\n  // Static\n  static jQueryInterface(config) {\n    return this.each(function () {\n      const data = Popover.getOrCreateInstance(this, config);\n      if (typeof config !== 'string') {\n        return;\n      }\n      if (typeof data[config] === 'undefined') {\n        throw new TypeError(`No method named \"${config}\"`);\n      }\n      data[config]();\n    });\n  }\n}\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Popover);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap scrollspy.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$2 = 'scrollspy';\nconst DATA_KEY$2 = 'bs.scrollspy';\nconst EVENT_KEY$2 = `.${DATA_KEY$2}`;\nconst DATA_API_KEY = '.data-api';\nconst EVENT_ACTIVATE = `activate${EVENT_KEY$2}`;\nconst EVENT_CLICK = `click${EVENT_KEY$2}`;\nconst EVENT_LOAD_DATA_API$1 = `load${EVENT_KEY$2}${DATA_API_KEY}`;\nconst CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item';\nconst CLASS_NAME_ACTIVE$1 = 'active';\nconst SELECTOR_DATA_SPY = '[data-bs-spy=\"scroll\"]';\nconst SELECTOR_TARGET_LINKS = '[href]';\nconst SELECTOR_NAV_LIST_GROUP = '.nav, .list-group';\nconst SELECTOR_NAV_LINKS = '.nav-link';\nconst SELECTOR_NAV_ITEMS = '.nav-item';\nconst SELECTOR_LIST_ITEMS = '.list-group-item';\nconst SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_NAV_ITEMS} > ${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`;\nconst SELECTOR_DROPDOWN = '.dropdown';\nconst SELECTOR_DROPDOWN_TOGGLE$1 = '.dropdown-toggle';\nconst Default$1 = {\n  offset: null,\n  // TODO: v6 @deprecated, keep it for backwards compatibility reasons\n  rootMargin: '0px 0px -25%',\n  smoothScroll: false,\n  target: null,\n  threshold: [0.1, 0.5, 1]\n};\nconst DefaultType$1 = {\n  offset: '(number|null)',\n  // TODO v6 @deprecated, keep it for backwards compatibility reasons\n  rootMargin: 'string',\n  smoothScroll: 'boolean',\n  target: 'element',\n  threshold: 'array'\n};\n\n/**\n * Class definition\n */\n\nclass ScrollSpy extends BaseComponent {\n  constructor(element, config) {\n    super(element, config);\n\n    // this._element is the observablesContainer and config.target the menu links wrapper\n    this._targetLinks = new Map();\n    this._observableSections = new Map();\n    this._rootElement = getComputedStyle(this._element).overflowY === 'visible' ? null : this._element;\n    this._activeTarget = null;\n    this._observer = null;\n    this._previousScrollData = {\n      visibleEntryTop: 0,\n      parentScrollTop: 0\n    };\n    this.refresh(); // initialize\n  }\n\n  // Getters\n  static get Default() {\n    return Default$1;\n  }\n  static get DefaultType() {\n    return DefaultType$1;\n  }\n  static get NAME() {\n    return NAME$2;\n  }\n\n  // Public\n  refresh() {\n    this._initializeTargetsAndObservables();\n    this._maybeEnableSmoothScroll();\n    if (this._observer) {\n      this._observer.disconnect();\n    } else {\n      this._observer = this._getNewObserver();\n    }\n    for (const section of this._observableSections.values()) {\n      this._observer.observe(section);\n    }\n  }\n  dispose() {\n    this._observer.disconnect();\n    super.dispose();\n  }\n\n  // Private\n  _configAfterMerge(config) {\n    // TODO: on v6 target should be given explicitly & remove the {target: 'ss-target'} case\n    config.target = getElement(config.target) || document.body;\n\n    // TODO: v6 Only for backwards compatibility reasons. Use rootMargin only\n    config.rootMargin = config.offset ? `${config.offset}px 0px -30%` : config.rootMargin;\n    if (typeof config.threshold === 'string') {\n      config.threshold = config.threshold.split(',').map(value => Number.parseFloat(value));\n    }\n    return config;\n  }\n  _maybeEnableSmoothScroll() {\n    if (!this._config.smoothScroll) {\n      return;\n    }\n\n    // unregister any previous listeners\n    EventHandler.off(this._config.target, EVENT_CLICK);\n    EventHandler.on(this._config.target, EVENT_CLICK, SELECTOR_TARGET_LINKS, event => {\n      const observableSection = this._observableSections.get(event.target.hash);\n      if (observableSection) {\n        event.preventDefault();\n        const root = this._rootElement || window;\n        const height = observableSection.offsetTop - this._element.offsetTop;\n        if (root.scrollTo) {\n          root.scrollTo({\n            top: height,\n            behavior: 'smooth'\n          });\n          return;\n        }\n\n        // Chrome 60 doesn't support `scrollTo`\n        root.scrollTop = height;\n      }\n    });\n  }\n  _getNewObserver() {\n    const options = {\n      root: this._rootElement,\n      threshold: this._config.threshold,\n      rootMargin: this._config.rootMargin\n    };\n    return new IntersectionObserver(entries => this._observerCallback(entries), options);\n  }\n\n  // The logic of selection\n  _observerCallback(entries) {\n    const targetElement = entry => this._targetLinks.get(`#${entry.target.id}`);\n    const activate = entry => {\n      this._previousScrollData.visibleEntryTop = entry.target.offsetTop;\n      this._process(targetElement(entry));\n    };\n    const parentScrollTop = (this._rootElement || document.documentElement).scrollTop;\n    const userScrollsDown = parentScrollTop >= this._previousScrollData.parentScrollTop;\n    this._previousScrollData.parentScrollTop = parentScrollTop;\n    for (const entry of entries) {\n      if (!entry.isIntersecting) {\n        this._activeTarget = null;\n        this._clearActiveClass(targetElement(entry));\n        continue;\n      }\n      const entryIsLowerThanPrevious = entry.target.offsetTop >= this._previousScrollData.visibleEntryTop;\n      // if we are scrolling down, pick the bigger offsetTop\n      if (userScrollsDown && entryIsLowerThanPrevious) {\n        activate(entry);\n        // if parent isn't scrolled, let's keep the first visible item, breaking the iteration\n        if (!parentScrollTop) {\n          return;\n        }\n        continue;\n      }\n\n      // if we are scrolling up, pick the smallest offsetTop\n      if (!userScrollsDown && !entryIsLowerThanPrevious) {\n        activate(entry);\n      }\n    }\n  }\n  _initializeTargetsAndObservables() {\n    this._targetLinks = new Map();\n    this._observableSections = new Map();\n    const targetLinks = SelectorEngine.find(SELECTOR_TARGET_LINKS, this._config.target);\n    for (const anchor of targetLinks) {\n      // ensure that the anchor has an id and is not disabled\n      if (!anchor.hash || isDisabled(anchor)) {\n        continue;\n      }\n      const observableSection = SelectorEngine.findOne(decodeURI(anchor.hash), this._element);\n\n      // ensure that the observableSection exists & is visible\n      if (isVisible(observableSection)) {\n        this._targetLinks.set(decodeURI(anchor.hash), anchor);\n        this._observableSections.set(anchor.hash, observableSection);\n      }\n    }\n  }\n  _process(target) {\n    if (this._activeTarget === target) {\n      return;\n    }\n    this._clearActiveClass(this._config.target);\n    this._activeTarget = target;\n    target.classList.add(CLASS_NAME_ACTIVE$1);\n    this._activateParents(target);\n    EventHandler.trigger(this._element, EVENT_ACTIVATE, {\n      relatedTarget: target\n    });\n  }\n  _activateParents(target) {\n    // Activate dropdown parents\n    if (target.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) {\n      SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE$1, target.closest(SELECTOR_DROPDOWN)).classList.add(CLASS_NAME_ACTIVE$1);\n      return;\n    }\n    for (const listGroup of SelectorEngine.parents(target, SELECTOR_NAV_LIST_GROUP)) {\n      // Set triggered links parents as active\n      // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor\n      for (const item of SelectorEngine.prev(listGroup, SELECTOR_LINK_ITEMS)) {\n        item.classList.add(CLASS_NAME_ACTIVE$1);\n      }\n    }\n  }\n  _clearActiveClass(parent) {\n    parent.classList.remove(CLASS_NAME_ACTIVE$1);\n    const activeNodes = SelectorEngine.find(`${SELECTOR_TARGET_LINKS}.${CLASS_NAME_ACTIVE$1}`, parent);\n    for (const node of activeNodes) {\n      node.classList.remove(CLASS_NAME_ACTIVE$1);\n    }\n  }\n\n  // Static\n  static jQueryInterface(config) {\n    return this.each(function () {\n      const data = ScrollSpy.getOrCreateInstance(this, config);\n      if (typeof config !== 'string') {\n        return;\n      }\n      if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n        throw new TypeError(`No method named \"${config}\"`);\n      }\n      data[config]();\n    });\n  }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(window, EVENT_LOAD_DATA_API$1, () => {\n  for (const spy of SelectorEngine.find(SELECTOR_DATA_SPY)) {\n    ScrollSpy.getOrCreateInstance(spy);\n  }\n});\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(ScrollSpy);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap tab.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$1 = 'tab';\nconst DATA_KEY$1 = 'bs.tab';\nconst EVENT_KEY$1 = `.${DATA_KEY$1}`;\nconst EVENT_HIDE$1 = `hide${EVENT_KEY$1}`;\nconst EVENT_HIDDEN$1 = `hidden${EVENT_KEY$1}`;\nconst EVENT_SHOW$1 = `show${EVENT_KEY$1}`;\nconst EVENT_SHOWN$1 = `shown${EVENT_KEY$1}`;\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY$1}`;\nconst EVENT_KEYDOWN = `keydown${EVENT_KEY$1}`;\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY$1}`;\nconst ARROW_LEFT_KEY = 'ArrowLeft';\nconst ARROW_RIGHT_KEY = 'ArrowRight';\nconst ARROW_UP_KEY = 'ArrowUp';\nconst ARROW_DOWN_KEY = 'ArrowDown';\nconst HOME_KEY = 'Home';\nconst END_KEY = 'End';\nconst CLASS_NAME_ACTIVE = 'active';\nconst CLASS_NAME_FADE$1 = 'fade';\nconst CLASS_NAME_SHOW$1 = 'show';\nconst CLASS_DROPDOWN = 'dropdown';\nconst SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle';\nconst SELECTOR_DROPDOWN_MENU = '.dropdown-menu';\nconst NOT_SELECTOR_DROPDOWN_TOGGLE = `:not(${SELECTOR_DROPDOWN_TOGGLE})`;\nconst SELECTOR_TAB_PANEL = '.list-group, .nav, [role=\"tablist\"]';\nconst SELECTOR_OUTER = '.nav-item, .list-group-item';\nconst SELECTOR_INNER = `.nav-link${NOT_SELECTOR_DROPDOWN_TOGGLE}, .list-group-item${NOT_SELECTOR_DROPDOWN_TOGGLE}, [role=\"tab\"]${NOT_SELECTOR_DROPDOWN_TOGGLE}`;\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"tab\"], [data-bs-toggle=\"pill\"], [data-bs-toggle=\"list\"]'; // TODO: could only be `tab` in v6\nconst SELECTOR_INNER_ELEM = `${SELECTOR_INNER}, ${SELECTOR_DATA_TOGGLE}`;\nconst SELECTOR_DATA_TOGGLE_ACTIVE = `.${CLASS_NAME_ACTIVE}[data-bs-toggle=\"tab\"], .${CLASS_NAME_ACTIVE}[data-bs-toggle=\"pill\"], .${CLASS_NAME_ACTIVE}[data-bs-toggle=\"list\"]`;\n\n/**\n * Class definition\n */\n\nclass Tab extends BaseComponent {\n  constructor(element) {\n    super(element);\n    this._parent = this._element.closest(SELECTOR_TAB_PANEL);\n    if (!this._parent) {\n      return;\n      // TODO: should throw exception in v6\n      // throw new TypeError(`${element.outerHTML} has not a valid parent ${SELECTOR_INNER_ELEM}`)\n    }\n\n    // Set up initial aria attributes\n    this._setInitialAttributes(this._parent, this._getChildren());\n    EventHandler.on(this._element, EVENT_KEYDOWN, event => this._keydown(event));\n  }\n\n  // Getters\n  static get NAME() {\n    return NAME$1;\n  }\n\n  // Public\n  show() {\n    // Shows this elem and deactivate the active sibling if exists\n    const innerElem = this._element;\n    if (this._elemIsActive(innerElem)) {\n      return;\n    }\n\n    // Search for active tab on same parent to deactivate it\n    const active = this._getActiveElem();\n    const hideEvent = active ? EventHandler.trigger(active, EVENT_HIDE$1, {\n      relatedTarget: innerElem\n    }) : null;\n    const showEvent = EventHandler.trigger(innerElem, EVENT_SHOW$1, {\n      relatedTarget: active\n    });\n    if (showEvent.defaultPrevented || hideEvent && hideEvent.defaultPrevented) {\n      return;\n    }\n    this._deactivate(active, innerElem);\n    this._activate(innerElem, active);\n  }\n\n  // Private\n  _activate(element, relatedElem) {\n    if (!element) {\n      return;\n    }\n    element.classList.add(CLASS_NAME_ACTIVE);\n    this._activate(SelectorEngine.getElementFromSelector(element)); // Search and activate/show the proper section\n\n    const complete = () => {\n      if (element.getAttribute('role') !== 'tab') {\n        element.classList.add(CLASS_NAME_SHOW$1);\n        return;\n      }\n      element.removeAttribute('tabindex');\n      element.setAttribute('aria-selected', true);\n      this._toggleDropDown(element, true);\n      EventHandler.trigger(element, EVENT_SHOWN$1, {\n        relatedTarget: relatedElem\n      });\n    };\n    this._queueCallback(complete, element, element.classList.contains(CLASS_NAME_FADE$1));\n  }\n  _deactivate(element, relatedElem) {\n    if (!element) {\n      return;\n    }\n    element.classList.remove(CLASS_NAME_ACTIVE);\n    element.blur();\n    this._deactivate(SelectorEngine.getElementFromSelector(element)); // Search and deactivate the shown section too\n\n    const complete = () => {\n      if (element.getAttribute('role') !== 'tab') {\n        element.classList.remove(CLASS_NAME_SHOW$1);\n        return;\n      }\n      element.setAttribute('aria-selected', false);\n      element.setAttribute('tabindex', '-1');\n      this._toggleDropDown(element, false);\n      EventHandler.trigger(element, EVENT_HIDDEN$1, {\n        relatedTarget: relatedElem\n      });\n    };\n    this._queueCallback(complete, element, element.classList.contains(CLASS_NAME_FADE$1));\n  }\n  _keydown(event) {\n    if (![ARROW_LEFT_KEY, ARROW_RIGHT_KEY, ARROW_UP_KEY, ARROW_DOWN_KEY, HOME_KEY, END_KEY].includes(event.key)) {\n      return;\n    }\n    event.stopPropagation(); // stopPropagation/preventDefault both added to support up/down keys without scrolling the page\n    event.preventDefault();\n    const children = this._getChildren().filter(element => !isDisabled(element));\n    let nextActiveElement;\n    if ([HOME_KEY, END_KEY].includes(event.key)) {\n      nextActiveElement = children[event.key === HOME_KEY ? 0 : children.length - 1];\n    } else {\n      const isNext = [ARROW_RIGHT_KEY, ARROW_DOWN_KEY].includes(event.key);\n      nextActiveElement = getNextActiveElement(children, event.target, isNext, true);\n    }\n    if (nextActiveElement) {\n      nextActiveElement.focus({\n        preventScroll: true\n      });\n      Tab.getOrCreateInstance(nextActiveElement).show();\n    }\n  }\n  _getChildren() {\n    // collection of inner elements\n    return SelectorEngine.find(SELECTOR_INNER_ELEM, this._parent);\n  }\n  _getActiveElem() {\n    return this._getChildren().find(child => this._elemIsActive(child)) || null;\n  }\n  _setInitialAttributes(parent, children) {\n    this._setAttributeIfNotExists(parent, 'role', 'tablist');\n    for (const child of children) {\n      this._setInitialAttributesOnChild(child);\n    }\n  }\n  _setInitialAttributesOnChild(child) {\n    child = this._getInnerElement(child);\n    const isActive = this._elemIsActive(child);\n    const outerElem = this._getOuterElement(child);\n    child.setAttribute('aria-selected', isActive);\n    if (outerElem !== child) {\n      this._setAttributeIfNotExists(outerElem, 'role', 'presentation');\n    }\n    if (!isActive) {\n      child.setAttribute('tabindex', '-1');\n    }\n    this._setAttributeIfNotExists(child, 'role', 'tab');\n\n    // set attributes to the related panel too\n    this._setInitialAttributesOnTargetPanel(child);\n  }\n  _setInitialAttributesOnTargetPanel(child) {\n    const target = SelectorEngine.getElementFromSelector(child);\n    if (!target) {\n      return;\n    }\n    this._setAttributeIfNotExists(target, 'role', 'tabpanel');\n    if (child.id) {\n      this._setAttributeIfNotExists(target, 'aria-labelledby', `${child.id}`);\n    }\n  }\n  _toggleDropDown(element, open) {\n    const outerElem = this._getOuterElement(element);\n    if (!outerElem.classList.contains(CLASS_DROPDOWN)) {\n      return;\n    }\n    const toggle = (selector, className) => {\n      const element = SelectorEngine.findOne(selector, outerElem);\n      if (element) {\n        element.classList.toggle(className, open);\n      }\n    };\n    toggle(SELECTOR_DROPDOWN_TOGGLE, CLASS_NAME_ACTIVE);\n    toggle(SELECTOR_DROPDOWN_MENU, CLASS_NAME_SHOW$1);\n    outerElem.setAttribute('aria-expanded', open);\n  }\n  _setAttributeIfNotExists(element, attribute, value) {\n    if (!element.hasAttribute(attribute)) {\n      element.setAttribute(attribute, value);\n    }\n  }\n  _elemIsActive(elem) {\n    return elem.classList.contains(CLASS_NAME_ACTIVE);\n  }\n\n  // Try to get the inner element (usually the .nav-link)\n  _getInnerElement(elem) {\n    return elem.matches(SELECTOR_INNER_ELEM) ? elem : SelectorEngine.findOne(SELECTOR_INNER_ELEM, elem);\n  }\n\n  // Try to get the outer element (usually the .nav-item)\n  _getOuterElement(elem) {\n    return elem.closest(SELECTOR_OUTER) || elem;\n  }\n\n  // Static\n  static jQueryInterface(config) {\n    return this.each(function () {\n      const data = Tab.getOrCreateInstance(this);\n      if (typeof config !== 'string') {\n        return;\n      }\n      if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n        throw new TypeError(`No method named \"${config}\"`);\n      }\n      data[config]();\n    });\n  }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n  if (['A', 'AREA'].includes(this.tagName)) {\n    event.preventDefault();\n  }\n  if (isDisabled(this)) {\n    return;\n  }\n  Tab.getOrCreateInstance(this).show();\n});\n\n/**\n * Initialize on focus\n */\nEventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n  for (const element of SelectorEngine.find(SELECTOR_DATA_TOGGLE_ACTIVE)) {\n    Tab.getOrCreateInstance(element);\n  }\n});\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Tab);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap toast.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME = 'toast';\nconst DATA_KEY = 'bs.toast';\nconst EVENT_KEY = `.${DATA_KEY}`;\nconst EVENT_MOUSEOVER = `mouseover${EVENT_KEY}`;\nconst EVENT_MOUSEOUT = `mouseout${EVENT_KEY}`;\nconst EVENT_FOCUSIN = `focusin${EVENT_KEY}`;\nconst EVENT_FOCUSOUT = `focusout${EVENT_KEY}`;\nconst EVENT_HIDE = `hide${EVENT_KEY}`;\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`;\nconst EVENT_SHOW = `show${EVENT_KEY}`;\nconst EVENT_SHOWN = `shown${EVENT_KEY}`;\nconst CLASS_NAME_FADE = 'fade';\nconst CLASS_NAME_HIDE = 'hide'; // @deprecated - kept here only for backwards compatibility\nconst CLASS_NAME_SHOW = 'show';\nconst CLASS_NAME_SHOWING = 'showing';\nconst DefaultType = {\n  animation: 'boolean',\n  autohide: 'boolean',\n  delay: 'number'\n};\nconst Default = {\n  animation: true,\n  autohide: true,\n  delay: 5000\n};\n\n/**\n * Class definition\n */\n\nclass Toast extends BaseComponent {\n  constructor(element, config) {\n    super(element, config);\n    this._timeout = null;\n    this._hasMouseInteraction = false;\n    this._hasKeyboardInteraction = false;\n    this._setListeners();\n  }\n\n  // Getters\n  static get Default() {\n    return Default;\n  }\n  static get DefaultType() {\n    return DefaultType;\n  }\n  static get NAME() {\n    return NAME;\n  }\n\n  // Public\n  show() {\n    const showEvent = EventHandler.trigger(this._element, EVENT_SHOW);\n    if (showEvent.defaultPrevented) {\n      return;\n    }\n    this._clearTimeout();\n    if (this._config.animation) {\n      this._element.classList.add(CLASS_NAME_FADE);\n    }\n    const complete = () => {\n      this._element.classList.remove(CLASS_NAME_SHOWING);\n      EventHandler.trigger(this._element, EVENT_SHOWN);\n      this._maybeScheduleHide();\n    };\n    this._element.classList.remove(CLASS_NAME_HIDE); // @deprecated\n    reflow(this._element);\n    this._element.classList.add(CLASS_NAME_SHOW, CLASS_NAME_SHOWING);\n    this._queueCallback(complete, this._element, this._config.animation);\n  }\n  hide() {\n    if (!this.isShown()) {\n      return;\n    }\n    const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE);\n    if (hideEvent.defaultPrevented) {\n      return;\n    }\n    const complete = () => {\n      this._element.classList.add(CLASS_NAME_HIDE); // @deprecated\n      this._element.classList.remove(CLASS_NAME_SHOWING, CLASS_NAME_SHOW);\n      EventHandler.trigger(this._element, EVENT_HIDDEN);\n    };\n    this._element.classList.add(CLASS_NAME_SHOWING);\n    this._queueCallback(complete, this._element, this._config.animation);\n  }\n  dispose() {\n    this._clearTimeout();\n    if (this.isShown()) {\n      this._element.classList.remove(CLASS_NAME_SHOW);\n    }\n    super.dispose();\n  }\n  isShown() {\n    return this._element.classList.contains(CLASS_NAME_SHOW);\n  }\n\n  // Private\n  _maybeScheduleHide() {\n    if (!this._config.autohide) {\n      return;\n    }\n    if (this._hasMouseInteraction || this._hasKeyboardInteraction) {\n      return;\n    }\n    this._timeout = setTimeout(() => {\n      this.hide();\n    }, this._config.delay);\n  }\n  _onInteraction(event, isInteracting) {\n    switch (event.type) {\n      case 'mouseover':\n      case 'mouseout':\n        {\n          this._hasMouseInteraction = isInteracting;\n          break;\n        }\n      case 'focusin':\n      case 'focusout':\n        {\n          this._hasKeyboardInteraction = isInteracting;\n          break;\n        }\n    }\n    if (isInteracting) {\n      this._clearTimeout();\n      return;\n    }\n    const nextElement = event.relatedTarget;\n    if (this._element === nextElement || this._element.contains(nextElement)) {\n      return;\n    }\n    this._maybeScheduleHide();\n  }\n  _setListeners() {\n    EventHandler.on(this._element, EVENT_MOUSEOVER, event => this._onInteraction(event, true));\n    EventHandler.on(this._element, EVENT_MOUSEOUT, event => this._onInteraction(event, false));\n    EventHandler.on(this._element, EVENT_FOCUSIN, event => this._onInteraction(event, true));\n    EventHandler.on(this._element, EVENT_FOCUSOUT, event => this._onInteraction(event, false));\n  }\n  _clearTimeout() {\n    clearTimeout(this._timeout);\n    this._timeout = null;\n  }\n\n  // Static\n  static jQueryInterface(config) {\n    return this.each(function () {\n      const data = Toast.getOrCreateInstance(this, config);\n      if (typeof config === 'string') {\n        if (typeof data[config] === 'undefined') {\n          throw new TypeError(`No method named \"${config}\"`);\n        }\n        data[config](this);\n      }\n    });\n  }\n}\n\n/**\n * Data API implementation\n */\n\nenableDismissTrigger(Toast);\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Toast);\n\nexport { Alert, Button, Carousel, Collapse, Dropdown, Modal, Offcanvas, Popover, ScrollSpy, Tab, Toast, Tooltip };\n//# sourceMappingURL=bootstrap.esm.js.map\n"
  },
  {
    "path": "dist/js/bootstrap.js",
    "content": "/*!\n  * Bootstrap v5.3.8 (https://getbootstrap.com/)\n  * Copyright 2011-2025 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n  */\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('@popperjs/core')) :\n  typeof define === 'function' && define.amd ? define(['@popperjs/core'], factory) :\n  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.bootstrap = factory(global.Popper));\n})(this, (function (Popper) { 'use strict';\n\n  function _interopNamespaceDefault(e) {\n    const n = Object.create(null, { [Symbol.toStringTag]: { value: 'Module' } });\n    if (e) {\n      for (const k in e) {\n        if (k !== 'default') {\n          const d = Object.getOwnPropertyDescriptor(e, k);\n          Object.defineProperty(n, k, d.get ? d : {\n            enumerable: true,\n            get: () => e[k]\n          });\n        }\n      }\n    }\n    n.default = e;\n    return Object.freeze(n);\n  }\n\n  const Popper__namespace = /*#__PURE__*/_interopNamespaceDefault(Popper);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap dom/data.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n  /**\n   * Constants\n   */\n\n  const elementMap = new Map();\n  const Data = {\n    set(element, key, instance) {\n      if (!elementMap.has(element)) {\n        elementMap.set(element, new Map());\n      }\n      const instanceMap = elementMap.get(element);\n\n      // make it clear we only want one instance per element\n      // can be removed later when multiple key/instances are fine to be used\n      if (!instanceMap.has(key) && instanceMap.size !== 0) {\n        // eslint-disable-next-line no-console\n        console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`);\n        return;\n      }\n      instanceMap.set(key, instance);\n    },\n    get(element, key) {\n      if (elementMap.has(element)) {\n        return elementMap.get(element).get(key) || null;\n      }\n      return null;\n    },\n    remove(element, key) {\n      if (!elementMap.has(element)) {\n        return;\n      }\n      const instanceMap = elementMap.get(element);\n      instanceMap.delete(key);\n\n      // free up element references if there are no instances left for an element\n      if (instanceMap.size === 0) {\n        elementMap.delete(element);\n      }\n    }\n  };\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap util/index.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n  const MAX_UID = 1000000;\n  const MILLISECONDS_MULTIPLIER = 1000;\n  const TRANSITION_END = 'transitionend';\n\n  /**\n   * Properly escape IDs selectors to handle weird IDs\n   * @param {string} selector\n   * @returns {string}\n   */\n  const parseSelector = selector => {\n    if (selector && window.CSS && window.CSS.escape) {\n      // document.querySelector needs escaping to handle IDs (html5+) containing for instance /\n      selector = selector.replace(/#([^\\s\"#']+)/g, (match, id) => `#${CSS.escape(id)}`);\n    }\n    return selector;\n  };\n\n  // Shout-out Angus Croll (https://goo.gl/pxwQGp)\n  const toType = object => {\n    if (object === null || object === undefined) {\n      return `${object}`;\n    }\n    return Object.prototype.toString.call(object).match(/\\s([a-z]+)/i)[1].toLowerCase();\n  };\n\n  /**\n   * Public Util API\n   */\n\n  const getUID = prefix => {\n    do {\n      prefix += Math.floor(Math.random() * MAX_UID);\n    } while (document.getElementById(prefix));\n    return prefix;\n  };\n  const getTransitionDurationFromElement = element => {\n    if (!element) {\n      return 0;\n    }\n\n    // Get transition-duration of the element\n    let {\n      transitionDuration,\n      transitionDelay\n    } = window.getComputedStyle(element);\n    const floatTransitionDuration = Number.parseFloat(transitionDuration);\n    const floatTransitionDelay = Number.parseFloat(transitionDelay);\n\n    // Return 0 if element or transition duration is not found\n    if (!floatTransitionDuration && !floatTransitionDelay) {\n      return 0;\n    }\n\n    // If multiple durations are defined, take the first\n    transitionDuration = transitionDuration.split(',')[0];\n    transitionDelay = transitionDelay.split(',')[0];\n    return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER;\n  };\n  const triggerTransitionEnd = element => {\n    element.dispatchEvent(new Event(TRANSITION_END));\n  };\n  const isElement = object => {\n    if (!object || typeof object !== 'object') {\n      return false;\n    }\n    if (typeof object.jquery !== 'undefined') {\n      object = object[0];\n    }\n    return typeof object.nodeType !== 'undefined';\n  };\n  const getElement = object => {\n    // it's a jQuery object or a node element\n    if (isElement(object)) {\n      return object.jquery ? object[0] : object;\n    }\n    if (typeof object === 'string' && object.length > 0) {\n      return document.querySelector(parseSelector(object));\n    }\n    return null;\n  };\n  const isVisible = element => {\n    if (!isElement(element) || element.getClientRects().length === 0) {\n      return false;\n    }\n    const elementIsVisible = getComputedStyle(element).getPropertyValue('visibility') === 'visible';\n    // Handle `details` element as its content may falsie appear visible when it is closed\n    const closedDetails = element.closest('details:not([open])');\n    if (!closedDetails) {\n      return elementIsVisible;\n    }\n    if (closedDetails !== element) {\n      const summary = element.closest('summary');\n      if (summary && summary.parentNode !== closedDetails) {\n        return false;\n      }\n      if (summary === null) {\n        return false;\n      }\n    }\n    return elementIsVisible;\n  };\n  const isDisabled = element => {\n    if (!element || element.nodeType !== Node.ELEMENT_NODE) {\n      return true;\n    }\n    if (element.classList.contains('disabled')) {\n      return true;\n    }\n    if (typeof element.disabled !== 'undefined') {\n      return element.disabled;\n    }\n    return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false';\n  };\n  const findShadowRoot = element => {\n    if (!document.documentElement.attachShadow) {\n      return null;\n    }\n\n    // Can find the shadow root otherwise it'll return the document\n    if (typeof element.getRootNode === 'function') {\n      const root = element.getRootNode();\n      return root instanceof ShadowRoot ? root : null;\n    }\n    if (element instanceof ShadowRoot) {\n      return element;\n    }\n\n    // when we don't find a shadow root\n    if (!element.parentNode) {\n      return null;\n    }\n    return findShadowRoot(element.parentNode);\n  };\n  const noop = () => {};\n\n  /**\n   * Trick to restart an element's animation\n   *\n   * @param {HTMLElement} element\n   * @return void\n   *\n   * @see https://www.harrytheo.com/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation\n   */\n  const reflow = element => {\n    element.offsetHeight; // eslint-disable-line no-unused-expressions\n  };\n  const getjQuery = () => {\n    if (window.jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {\n      return window.jQuery;\n    }\n    return null;\n  };\n  const DOMContentLoadedCallbacks = [];\n  const onDOMContentLoaded = callback => {\n    if (document.readyState === 'loading') {\n      // add listener on the first call when the document is in loading state\n      if (!DOMContentLoadedCallbacks.length) {\n        document.addEventListener('DOMContentLoaded', () => {\n          for (const callback of DOMContentLoadedCallbacks) {\n            callback();\n          }\n        });\n      }\n      DOMContentLoadedCallbacks.push(callback);\n    } else {\n      callback();\n    }\n  };\n  const isRTL = () => document.documentElement.dir === 'rtl';\n  const defineJQueryPlugin = plugin => {\n    onDOMContentLoaded(() => {\n      const $ = getjQuery();\n      /* istanbul ignore if */\n      if ($) {\n        const name = plugin.NAME;\n        const JQUERY_NO_CONFLICT = $.fn[name];\n        $.fn[name] = plugin.jQueryInterface;\n        $.fn[name].Constructor = plugin;\n        $.fn[name].noConflict = () => {\n          $.fn[name] = JQUERY_NO_CONFLICT;\n          return plugin.jQueryInterface;\n        };\n      }\n    });\n  };\n  const execute = (possibleCallback, args = [], defaultValue = possibleCallback) => {\n    return typeof possibleCallback === 'function' ? possibleCallback.call(...args) : defaultValue;\n  };\n  const executeAfterTransition = (callback, transitionElement, waitForTransition = true) => {\n    if (!waitForTransition) {\n      execute(callback);\n      return;\n    }\n    const durationPadding = 5;\n    const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding;\n    let called = false;\n    const handler = ({\n      target\n    }) => {\n      if (target !== transitionElement) {\n        return;\n      }\n      called = true;\n      transitionElement.removeEventListener(TRANSITION_END, handler);\n      execute(callback);\n    };\n    transitionElement.addEventListener(TRANSITION_END, handler);\n    setTimeout(() => {\n      if (!called) {\n        triggerTransitionEnd(transitionElement);\n      }\n    }, emulatedDuration);\n  };\n\n  /**\n   * Return the previous/next element of a list.\n   *\n   * @param {array} list    The list of elements\n   * @param activeElement   The active element\n   * @param shouldGetNext   Choose to get next or previous element\n   * @param isCycleAllowed\n   * @return {Element|elem} The proper element\n   */\n  const getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => {\n    const listLength = list.length;\n    let index = list.indexOf(activeElement);\n\n    // if the element does not exist in the list return an element\n    // depending on the direction and if cycle is allowed\n    if (index === -1) {\n      return !shouldGetNext && isCycleAllowed ? list[listLength - 1] : list[0];\n    }\n    index += shouldGetNext ? 1 : -1;\n    if (isCycleAllowed) {\n      index = (index + listLength) % listLength;\n    }\n    return list[Math.max(0, Math.min(index, listLength - 1))];\n  };\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap dom/event-handler.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n\n  /**\n   * Constants\n   */\n\n  const namespaceRegex = /[^.]*(?=\\..*)\\.|.*/;\n  const stripNameRegex = /\\..*/;\n  const stripUidRegex = /::\\d+$/;\n  const eventRegistry = {}; // Events storage\n  let uidEvent = 1;\n  const customEvents = {\n    mouseenter: 'mouseover',\n    mouseleave: 'mouseout'\n  };\n  const nativeEvents = new Set(['click', 'dblclick', 'mouseup', 'mousedown', 'contextmenu', 'mousewheel', 'DOMMouseScroll', 'mouseover', 'mouseout', 'mousemove', 'selectstart', 'selectend', 'keydown', 'keypress', 'keyup', 'orientationchange', 'touchstart', 'touchmove', 'touchend', 'touchcancel', 'pointerdown', 'pointermove', 'pointerup', 'pointerleave', 'pointercancel', 'gesturestart', 'gesturechange', 'gestureend', 'focus', 'blur', 'change', 'reset', 'select', 'submit', 'focusin', 'focusout', 'load', 'unload', 'beforeunload', 'resize', 'move', 'DOMContentLoaded', 'readystatechange', 'error', 'abort', 'scroll']);\n\n  /**\n   * Private methods\n   */\n\n  function makeEventUid(element, uid) {\n    return uid && `${uid}::${uidEvent++}` || element.uidEvent || uidEvent++;\n  }\n  function getElementEvents(element) {\n    const uid = makeEventUid(element);\n    element.uidEvent = uid;\n    eventRegistry[uid] = eventRegistry[uid] || {};\n    return eventRegistry[uid];\n  }\n  function bootstrapHandler(element, fn) {\n    return function handler(event) {\n      hydrateObj(event, {\n        delegateTarget: element\n      });\n      if (handler.oneOff) {\n        EventHandler.off(element, event.type, fn);\n      }\n      return fn.apply(element, [event]);\n    };\n  }\n  function bootstrapDelegationHandler(element, selector, fn) {\n    return function handler(event) {\n      const domElements = element.querySelectorAll(selector);\n      for (let {\n        target\n      } = event; target && target !== this; target = target.parentNode) {\n        for (const domElement of domElements) {\n          if (domElement !== target) {\n            continue;\n          }\n          hydrateObj(event, {\n            delegateTarget: target\n          });\n          if (handler.oneOff) {\n            EventHandler.off(element, event.type, selector, fn);\n          }\n          return fn.apply(target, [event]);\n        }\n      }\n    };\n  }\n  function findHandler(events, callable, delegationSelector = null) {\n    return Object.values(events).find(event => event.callable === callable && event.delegationSelector === delegationSelector);\n  }\n  function normalizeParameters(originalTypeEvent, handler, delegationFunction) {\n    const isDelegated = typeof handler === 'string';\n    // TODO: tooltip passes `false` instead of selector, so we need to check\n    const callable = isDelegated ? delegationFunction : handler || delegationFunction;\n    let typeEvent = getTypeEvent(originalTypeEvent);\n    if (!nativeEvents.has(typeEvent)) {\n      typeEvent = originalTypeEvent;\n    }\n    return [isDelegated, callable, typeEvent];\n  }\n  function addHandler(element, originalTypeEvent, handler, delegationFunction, oneOff) {\n    if (typeof originalTypeEvent !== 'string' || !element) {\n      return;\n    }\n    let [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction);\n\n    // in case of mouseenter or mouseleave wrap the handler within a function that checks for its DOM position\n    // this prevents the handler from being dispatched the same way as mouseover or mouseout does\n    if (originalTypeEvent in customEvents) {\n      const wrapFunction = fn => {\n        return function (event) {\n          if (!event.relatedTarget || event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget)) {\n            return fn.call(this, event);\n          }\n        };\n      };\n      callable = wrapFunction(callable);\n    }\n    const events = getElementEvents(element);\n    const handlers = events[typeEvent] || (events[typeEvent] = {});\n    const previousFunction = findHandler(handlers, callable, isDelegated ? handler : null);\n    if (previousFunction) {\n      previousFunction.oneOff = previousFunction.oneOff && oneOff;\n      return;\n    }\n    const uid = makeEventUid(callable, originalTypeEvent.replace(namespaceRegex, ''));\n    const fn = isDelegated ? bootstrapDelegationHandler(element, handler, callable) : bootstrapHandler(element, callable);\n    fn.delegationSelector = isDelegated ? handler : null;\n    fn.callable = callable;\n    fn.oneOff = oneOff;\n    fn.uidEvent = uid;\n    handlers[uid] = fn;\n    element.addEventListener(typeEvent, fn, isDelegated);\n  }\n  function removeHandler(element, events, typeEvent, handler, delegationSelector) {\n    const fn = findHandler(events[typeEvent], handler, delegationSelector);\n    if (!fn) {\n      return;\n    }\n    element.removeEventListener(typeEvent, fn, Boolean(delegationSelector));\n    delete events[typeEvent][fn.uidEvent];\n  }\n  function removeNamespacedHandlers(element, events, typeEvent, namespace) {\n    const storeElementEvent = events[typeEvent] || {};\n    for (const [handlerKey, event] of Object.entries(storeElementEvent)) {\n      if (handlerKey.includes(namespace)) {\n        removeHandler(element, events, typeEvent, event.callable, event.delegationSelector);\n      }\n    }\n  }\n  function getTypeEvent(event) {\n    // allow to get the native events from namespaced events ('click.bs.button' --> 'click')\n    event = event.replace(stripNameRegex, '');\n    return customEvents[event] || event;\n  }\n  const EventHandler = {\n    on(element, event, handler, delegationFunction) {\n      addHandler(element, event, handler, delegationFunction, false);\n    },\n    one(element, event, handler, delegationFunction) {\n      addHandler(element, event, handler, delegationFunction, true);\n    },\n    off(element, originalTypeEvent, handler, delegationFunction) {\n      if (typeof originalTypeEvent !== 'string' || !element) {\n        return;\n      }\n      const [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction);\n      const inNamespace = typeEvent !== originalTypeEvent;\n      const events = getElementEvents(element);\n      const storeElementEvent = events[typeEvent] || {};\n      const isNamespace = originalTypeEvent.startsWith('.');\n      if (typeof callable !== 'undefined') {\n        // Simplest case: handler is passed, remove that listener ONLY.\n        if (!Object.keys(storeElementEvent).length) {\n          return;\n        }\n        removeHandler(element, events, typeEvent, callable, isDelegated ? handler : null);\n        return;\n      }\n      if (isNamespace) {\n        for (const elementEvent of Object.keys(events)) {\n          removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1));\n        }\n      }\n      for (const [keyHandlers, event] of Object.entries(storeElementEvent)) {\n        const handlerKey = keyHandlers.replace(stripUidRegex, '');\n        if (!inNamespace || originalTypeEvent.includes(handlerKey)) {\n          removeHandler(element, events, typeEvent, event.callable, event.delegationSelector);\n        }\n      }\n    },\n    trigger(element, event, args) {\n      if (typeof event !== 'string' || !element) {\n        return null;\n      }\n      const $ = getjQuery();\n      const typeEvent = getTypeEvent(event);\n      const inNamespace = event !== typeEvent;\n      let jQueryEvent = null;\n      let bubbles = true;\n      let nativeDispatch = true;\n      let defaultPrevented = false;\n      if (inNamespace && $) {\n        jQueryEvent = $.Event(event, args);\n        $(element).trigger(jQueryEvent);\n        bubbles = !jQueryEvent.isPropagationStopped();\n        nativeDispatch = !jQueryEvent.isImmediatePropagationStopped();\n        defaultPrevented = jQueryEvent.isDefaultPrevented();\n      }\n      const evt = hydrateObj(new Event(event, {\n        bubbles,\n        cancelable: true\n      }), args);\n      if (defaultPrevented) {\n        evt.preventDefault();\n      }\n      if (nativeDispatch) {\n        element.dispatchEvent(evt);\n      }\n      if (evt.defaultPrevented && jQueryEvent) {\n        jQueryEvent.preventDefault();\n      }\n      return evt;\n    }\n  };\n  function hydrateObj(obj, meta = {}) {\n    for (const [key, value] of Object.entries(meta)) {\n      try {\n        obj[key] = value;\n      } catch (_unused) {\n        Object.defineProperty(obj, key, {\n          configurable: true,\n          get() {\n            return value;\n          }\n        });\n      }\n    }\n    return obj;\n  }\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap dom/manipulator.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n  function normalizeData(value) {\n    if (value === 'true') {\n      return true;\n    }\n    if (value === 'false') {\n      return false;\n    }\n    if (value === Number(value).toString()) {\n      return Number(value);\n    }\n    if (value === '' || value === 'null') {\n      return null;\n    }\n    if (typeof value !== 'string') {\n      return value;\n    }\n    try {\n      return JSON.parse(decodeURIComponent(value));\n    } catch (_unused) {\n      return value;\n    }\n  }\n  function normalizeDataKey(key) {\n    return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`);\n  }\n  const Manipulator = {\n    setDataAttribute(element, key, value) {\n      element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value);\n    },\n    removeDataAttribute(element, key) {\n      element.removeAttribute(`data-bs-${normalizeDataKey(key)}`);\n    },\n    getDataAttributes(element) {\n      if (!element) {\n        return {};\n      }\n      const attributes = {};\n      const bsKeys = Object.keys(element.dataset).filter(key => key.startsWith('bs') && !key.startsWith('bsConfig'));\n      for (const key of bsKeys) {\n        let pureKey = key.replace(/^bs/, '');\n        pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1);\n        attributes[pureKey] = normalizeData(element.dataset[key]);\n      }\n      return attributes;\n    },\n    getDataAttribute(element, key) {\n      return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`));\n    }\n  };\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap util/config.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n\n  /**\n   * Class definition\n   */\n\n  class Config {\n    // Getters\n    static get Default() {\n      return {};\n    }\n    static get DefaultType() {\n      return {};\n    }\n    static get NAME() {\n      throw new Error('You have to implement the static method \"NAME\", for each component!');\n    }\n    _getConfig(config) {\n      config = this._mergeConfigObj(config);\n      config = this._configAfterMerge(config);\n      this._typeCheckConfig(config);\n      return config;\n    }\n    _configAfterMerge(config) {\n      return config;\n    }\n    _mergeConfigObj(config, element) {\n      const jsonConfig = isElement(element) ? Manipulator.getDataAttribute(element, 'config') : {}; // try to parse\n\n      return {\n        ...this.constructor.Default,\n        ...(typeof jsonConfig === 'object' ? jsonConfig : {}),\n        ...(isElement(element) ? Manipulator.getDataAttributes(element) : {}),\n        ...(typeof config === 'object' ? config : {})\n      };\n    }\n    _typeCheckConfig(config, configTypes = this.constructor.DefaultType) {\n      for (const [property, expectedTypes] of Object.entries(configTypes)) {\n        const value = config[property];\n        const valueType = isElement(value) ? 'element' : toType(value);\n        if (!new RegExp(expectedTypes).test(valueType)) {\n          throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option \"${property}\" provided type \"${valueType}\" but expected type \"${expectedTypes}\".`);\n        }\n      }\n    }\n  }\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap base-component.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n\n  /**\n   * Constants\n   */\n\n  const VERSION = '5.3.8';\n\n  /**\n   * Class definition\n   */\n\n  class BaseComponent extends Config {\n    constructor(element, config) {\n      super();\n      element = getElement(element);\n      if (!element) {\n        return;\n      }\n      this._element = element;\n      this._config = this._getConfig(config);\n      Data.set(this._element, this.constructor.DATA_KEY, this);\n    }\n\n    // Public\n    dispose() {\n      Data.remove(this._element, this.constructor.DATA_KEY);\n      EventHandler.off(this._element, this.constructor.EVENT_KEY);\n      for (const propertyName of Object.getOwnPropertyNames(this)) {\n        this[propertyName] = null;\n      }\n    }\n\n    // Private\n    _queueCallback(callback, element, isAnimated = true) {\n      executeAfterTransition(callback, element, isAnimated);\n    }\n    _getConfig(config) {\n      config = this._mergeConfigObj(config, this._element);\n      config = this._configAfterMerge(config);\n      this._typeCheckConfig(config);\n      return config;\n    }\n\n    // Static\n    static getInstance(element) {\n      return Data.get(getElement(element), this.DATA_KEY);\n    }\n    static getOrCreateInstance(element, config = {}) {\n      return this.getInstance(element) || new this(element, typeof config === 'object' ? config : null);\n    }\n    static get VERSION() {\n      return VERSION;\n    }\n    static get DATA_KEY() {\n      return `bs.${this.NAME}`;\n    }\n    static get EVENT_KEY() {\n      return `.${this.DATA_KEY}`;\n    }\n    static eventName(name) {\n      return `${name}${this.EVENT_KEY}`;\n    }\n  }\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap dom/selector-engine.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n  const getSelector = element => {\n    let selector = element.getAttribute('data-bs-target');\n    if (!selector || selector === '#') {\n      let hrefAttribute = element.getAttribute('href');\n\n      // The only valid content that could double as a selector are IDs or classes,\n      // so everything starting with `#` or `.`. If a \"real\" URL is used as the selector,\n      // `document.querySelector` will rightfully complain it is invalid.\n      // See https://github.com/twbs/bootstrap/issues/32273\n      if (!hrefAttribute || !hrefAttribute.includes('#') && !hrefAttribute.startsWith('.')) {\n        return null;\n      }\n\n      // Just in case some CMS puts out a full URL with the anchor appended\n      if (hrefAttribute.includes('#') && !hrefAttribute.startsWith('#')) {\n        hrefAttribute = `#${hrefAttribute.split('#')[1]}`;\n      }\n      selector = hrefAttribute && hrefAttribute !== '#' ? hrefAttribute.trim() : null;\n    }\n    return selector ? selector.split(',').map(sel => parseSelector(sel)).join(',') : null;\n  };\n  const SelectorEngine = {\n    find(selector, element = document.documentElement) {\n      return [].concat(...Element.prototype.querySelectorAll.call(element, selector));\n    },\n    findOne(selector, element = document.documentElement) {\n      return Element.prototype.querySelector.call(element, selector);\n    },\n    children(element, selector) {\n      return [].concat(...element.children).filter(child => child.matches(selector));\n    },\n    parents(element, selector) {\n      const parents = [];\n      let ancestor = element.parentNode.closest(selector);\n      while (ancestor) {\n        parents.push(ancestor);\n        ancestor = ancestor.parentNode.closest(selector);\n      }\n      return parents;\n    },\n    prev(element, selector) {\n      let previous = element.previousElementSibling;\n      while (previous) {\n        if (previous.matches(selector)) {\n          return [previous];\n        }\n        previous = previous.previousElementSibling;\n      }\n      return [];\n    },\n    // TODO: this is now unused; remove later along with prev()\n    next(element, selector) {\n      let next = element.nextElementSibling;\n      while (next) {\n        if (next.matches(selector)) {\n          return [next];\n        }\n        next = next.nextElementSibling;\n      }\n      return [];\n    },\n    focusableChildren(element) {\n      const focusables = ['a', 'button', 'input', 'textarea', 'select', 'details', '[tabindex]', '[contenteditable=\"true\"]'].map(selector => `${selector}:not([tabindex^=\"-\"])`).join(',');\n      return this.find(focusables, element).filter(el => !isDisabled(el) && isVisible(el));\n    },\n    getSelectorFromElement(element) {\n      const selector = getSelector(element);\n      if (selector) {\n        return SelectorEngine.findOne(selector) ? selector : null;\n      }\n      return null;\n    },\n    getElementFromSelector(element) {\n      const selector = getSelector(element);\n      return selector ? SelectorEngine.findOne(selector) : null;\n    },\n    getMultipleElementsFromSelector(element) {\n      const selector = getSelector(element);\n      return selector ? SelectorEngine.find(selector) : [];\n    }\n  };\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap util/component-functions.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n  const enableDismissTrigger = (component, method = 'hide') => {\n    const clickEvent = `click.dismiss${component.EVENT_KEY}`;\n    const name = component.NAME;\n    EventHandler.on(document, clickEvent, `[data-bs-dismiss=\"${name}\"]`, function (event) {\n      if (['A', 'AREA'].includes(this.tagName)) {\n        event.preventDefault();\n      }\n      if (isDisabled(this)) {\n        return;\n      }\n      const target = SelectorEngine.getElementFromSelector(this) || this.closest(`.${name}`);\n      const instance = component.getOrCreateInstance(target);\n\n      // Method argument is left, for Alert and only, as it doesn't implement the 'hide' method\n      instance[method]();\n    });\n  };\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap alert.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n\n  /**\n   * Constants\n   */\n\n  const NAME$f = 'alert';\n  const DATA_KEY$a = 'bs.alert';\n  const EVENT_KEY$b = `.${DATA_KEY$a}`;\n  const EVENT_CLOSE = `close${EVENT_KEY$b}`;\n  const EVENT_CLOSED = `closed${EVENT_KEY$b}`;\n  const CLASS_NAME_FADE$5 = 'fade';\n  const CLASS_NAME_SHOW$8 = 'show';\n\n  /**\n   * Class definition\n   */\n\n  class Alert extends BaseComponent {\n    // Getters\n    static get NAME() {\n      return NAME$f;\n    }\n\n    // Public\n    close() {\n      const closeEvent = EventHandler.trigger(this._element, EVENT_CLOSE);\n      if (closeEvent.defaultPrevented) {\n        return;\n      }\n      this._element.classList.remove(CLASS_NAME_SHOW$8);\n      const isAnimated = this._element.classList.contains(CLASS_NAME_FADE$5);\n      this._queueCallback(() => this._destroyElement(), this._element, isAnimated);\n    }\n\n    // Private\n    _destroyElement() {\n      this._element.remove();\n      EventHandler.trigger(this._element, EVENT_CLOSED);\n      this.dispose();\n    }\n\n    // Static\n    static jQueryInterface(config) {\n      return this.each(function () {\n        const data = Alert.getOrCreateInstance(this);\n        if (typeof config !== 'string') {\n          return;\n        }\n        if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n          throw new TypeError(`No method named \"${config}\"`);\n        }\n        data[config](this);\n      });\n    }\n  }\n\n  /**\n   * Data API implementation\n   */\n\n  enableDismissTrigger(Alert, 'close');\n\n  /**\n   * jQuery\n   */\n\n  defineJQueryPlugin(Alert);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap button.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n\n  /**\n   * Constants\n   */\n\n  const NAME$e = 'button';\n  const DATA_KEY$9 = 'bs.button';\n  const EVENT_KEY$a = `.${DATA_KEY$9}`;\n  const DATA_API_KEY$6 = '.data-api';\n  const CLASS_NAME_ACTIVE$3 = 'active';\n  const SELECTOR_DATA_TOGGLE$5 = '[data-bs-toggle=\"button\"]';\n  const EVENT_CLICK_DATA_API$6 = `click${EVENT_KEY$a}${DATA_API_KEY$6}`;\n\n  /**\n   * Class definition\n   */\n\n  class Button extends BaseComponent {\n    // Getters\n    static get NAME() {\n      return NAME$e;\n    }\n\n    // Public\n    toggle() {\n      // Toggle class and sync the `aria-pressed` attribute with the return value of the `.toggle()` method\n      this._element.setAttribute('aria-pressed', this._element.classList.toggle(CLASS_NAME_ACTIVE$3));\n    }\n\n    // Static\n    static jQueryInterface(config) {\n      return this.each(function () {\n        const data = Button.getOrCreateInstance(this);\n        if (config === 'toggle') {\n          data[config]();\n        }\n      });\n    }\n  }\n\n  /**\n   * Data API implementation\n   */\n\n  EventHandler.on(document, EVENT_CLICK_DATA_API$6, SELECTOR_DATA_TOGGLE$5, event => {\n    event.preventDefault();\n    const button = event.target.closest(SELECTOR_DATA_TOGGLE$5);\n    const data = Button.getOrCreateInstance(button);\n    data.toggle();\n  });\n\n  /**\n   * jQuery\n   */\n\n  defineJQueryPlugin(Button);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap util/swipe.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n\n  /**\n   * Constants\n   */\n\n  const NAME$d = 'swipe';\n  const EVENT_KEY$9 = '.bs.swipe';\n  const EVENT_TOUCHSTART = `touchstart${EVENT_KEY$9}`;\n  const EVENT_TOUCHMOVE = `touchmove${EVENT_KEY$9}`;\n  const EVENT_TOUCHEND = `touchend${EVENT_KEY$9}`;\n  const EVENT_POINTERDOWN = `pointerdown${EVENT_KEY$9}`;\n  const EVENT_POINTERUP = `pointerup${EVENT_KEY$9}`;\n  const POINTER_TYPE_TOUCH = 'touch';\n  const POINTER_TYPE_PEN = 'pen';\n  const CLASS_NAME_POINTER_EVENT = 'pointer-event';\n  const SWIPE_THRESHOLD = 40;\n  const Default$c = {\n    endCallback: null,\n    leftCallback: null,\n    rightCallback: null\n  };\n  const DefaultType$c = {\n    endCallback: '(function|null)',\n    leftCallback: '(function|null)',\n    rightCallback: '(function|null)'\n  };\n\n  /**\n   * Class definition\n   */\n\n  class Swipe extends Config {\n    constructor(element, config) {\n      super();\n      this._element = element;\n      if (!element || !Swipe.isSupported()) {\n        return;\n      }\n      this._config = this._getConfig(config);\n      this._deltaX = 0;\n      this._supportPointerEvents = Boolean(window.PointerEvent);\n      this._initEvents();\n    }\n\n    // Getters\n    static get Default() {\n      return Default$c;\n    }\n    static get DefaultType() {\n      return DefaultType$c;\n    }\n    static get NAME() {\n      return NAME$d;\n    }\n\n    // Public\n    dispose() {\n      EventHandler.off(this._element, EVENT_KEY$9);\n    }\n\n    // Private\n    _start(event) {\n      if (!this._supportPointerEvents) {\n        this._deltaX = event.touches[0].clientX;\n        return;\n      }\n      if (this._eventIsPointerPenTouch(event)) {\n        this._deltaX = event.clientX;\n      }\n    }\n    _end(event) {\n      if (this._eventIsPointerPenTouch(event)) {\n        this._deltaX = event.clientX - this._deltaX;\n      }\n      this._handleSwipe();\n      execute(this._config.endCallback);\n    }\n    _move(event) {\n      this._deltaX = event.touches && event.touches.length > 1 ? 0 : event.touches[0].clientX - this._deltaX;\n    }\n    _handleSwipe() {\n      const absDeltaX = Math.abs(this._deltaX);\n      if (absDeltaX <= SWIPE_THRESHOLD) {\n        return;\n      }\n      const direction = absDeltaX / this._deltaX;\n      this._deltaX = 0;\n      if (!direction) {\n        return;\n      }\n      execute(direction > 0 ? this._config.rightCallback : this._config.leftCallback);\n    }\n    _initEvents() {\n      if (this._supportPointerEvents) {\n        EventHandler.on(this._element, EVENT_POINTERDOWN, event => this._start(event));\n        EventHandler.on(this._element, EVENT_POINTERUP, event => this._end(event));\n        this._element.classList.add(CLASS_NAME_POINTER_EVENT);\n      } else {\n        EventHandler.on(this._element, EVENT_TOUCHSTART, event => this._start(event));\n        EventHandler.on(this._element, EVENT_TOUCHMOVE, event => this._move(event));\n        EventHandler.on(this._element, EVENT_TOUCHEND, event => this._end(event));\n      }\n    }\n    _eventIsPointerPenTouch(event) {\n      return this._supportPointerEvents && (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH);\n    }\n\n    // Static\n    static isSupported() {\n      return 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0;\n    }\n  }\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap carousel.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n\n  /**\n   * Constants\n   */\n\n  const NAME$c = 'carousel';\n  const DATA_KEY$8 = 'bs.carousel';\n  const EVENT_KEY$8 = `.${DATA_KEY$8}`;\n  const DATA_API_KEY$5 = '.data-api';\n  const ARROW_LEFT_KEY$1 = 'ArrowLeft';\n  const ARROW_RIGHT_KEY$1 = 'ArrowRight';\n  const TOUCHEVENT_COMPAT_WAIT = 500; // Time for mouse compat events to fire after touch\n\n  const ORDER_NEXT = 'next';\n  const ORDER_PREV = 'prev';\n  const DIRECTION_LEFT = 'left';\n  const DIRECTION_RIGHT = 'right';\n  const EVENT_SLIDE = `slide${EVENT_KEY$8}`;\n  const EVENT_SLID = `slid${EVENT_KEY$8}`;\n  const EVENT_KEYDOWN$1 = `keydown${EVENT_KEY$8}`;\n  const EVENT_MOUSEENTER$1 = `mouseenter${EVENT_KEY$8}`;\n  const EVENT_MOUSELEAVE$1 = `mouseleave${EVENT_KEY$8}`;\n  const EVENT_DRAG_START = `dragstart${EVENT_KEY$8}`;\n  const EVENT_LOAD_DATA_API$3 = `load${EVENT_KEY$8}${DATA_API_KEY$5}`;\n  const EVENT_CLICK_DATA_API$5 = `click${EVENT_KEY$8}${DATA_API_KEY$5}`;\n  const CLASS_NAME_CAROUSEL = 'carousel';\n  const CLASS_NAME_ACTIVE$2 = 'active';\n  const CLASS_NAME_SLIDE = 'slide';\n  const CLASS_NAME_END = 'carousel-item-end';\n  const CLASS_NAME_START = 'carousel-item-start';\n  const CLASS_NAME_NEXT = 'carousel-item-next';\n  const CLASS_NAME_PREV = 'carousel-item-prev';\n  const SELECTOR_ACTIVE = '.active';\n  const SELECTOR_ITEM = '.carousel-item';\n  const SELECTOR_ACTIVE_ITEM = SELECTOR_ACTIVE + SELECTOR_ITEM;\n  const SELECTOR_ITEM_IMG = '.carousel-item img';\n  const SELECTOR_INDICATORS = '.carousel-indicators';\n  const SELECTOR_DATA_SLIDE = '[data-bs-slide], [data-bs-slide-to]';\n  const SELECTOR_DATA_RIDE = '[data-bs-ride=\"carousel\"]';\n  const KEY_TO_DIRECTION = {\n    [ARROW_LEFT_KEY$1]: DIRECTION_RIGHT,\n    [ARROW_RIGHT_KEY$1]: DIRECTION_LEFT\n  };\n  const Default$b = {\n    interval: 5000,\n    keyboard: true,\n    pause: 'hover',\n    ride: false,\n    touch: true,\n    wrap: true\n  };\n  const DefaultType$b = {\n    interval: '(number|boolean)',\n    // TODO:v6 remove boolean support\n    keyboard: 'boolean',\n    pause: '(string|boolean)',\n    ride: '(boolean|string)',\n    touch: 'boolean',\n    wrap: 'boolean'\n  };\n\n  /**\n   * Class definition\n   */\n\n  class Carousel extends BaseComponent {\n    constructor(element, config) {\n      super(element, config);\n      this._interval = null;\n      this._activeElement = null;\n      this._isSliding = false;\n      this.touchTimeout = null;\n      this._swipeHelper = null;\n      this._indicatorsElement = SelectorEngine.findOne(SELECTOR_INDICATORS, this._element);\n      this._addEventListeners();\n      if (this._config.ride === CLASS_NAME_CAROUSEL) {\n        this.cycle();\n      }\n    }\n\n    // Getters\n    static get Default() {\n      return Default$b;\n    }\n    static get DefaultType() {\n      return DefaultType$b;\n    }\n    static get NAME() {\n      return NAME$c;\n    }\n\n    // Public\n    next() {\n      this._slide(ORDER_NEXT);\n    }\n    nextWhenVisible() {\n      // FIXME TODO use `document.visibilityState`\n      // Don't call next when the page isn't visible\n      // or the carousel or its parent isn't visible\n      if (!document.hidden && isVisible(this._element)) {\n        this.next();\n      }\n    }\n    prev() {\n      this._slide(ORDER_PREV);\n    }\n    pause() {\n      if (this._isSliding) {\n        triggerTransitionEnd(this._element);\n      }\n      this._clearInterval();\n    }\n    cycle() {\n      this._clearInterval();\n      this._updateInterval();\n      this._interval = setInterval(() => this.nextWhenVisible(), this._config.interval);\n    }\n    _maybeEnableCycle() {\n      if (!this._config.ride) {\n        return;\n      }\n      if (this._isSliding) {\n        EventHandler.one(this._element, EVENT_SLID, () => this.cycle());\n        return;\n      }\n      this.cycle();\n    }\n    to(index) {\n      const items = this._getItems();\n      if (index > items.length - 1 || index < 0) {\n        return;\n      }\n      if (this._isSliding) {\n        EventHandler.one(this._element, EVENT_SLID, () => this.to(index));\n        return;\n      }\n      const activeIndex = this._getItemIndex(this._getActive());\n      if (activeIndex === index) {\n        return;\n      }\n      const order = index > activeIndex ? ORDER_NEXT : ORDER_PREV;\n      this._slide(order, items[index]);\n    }\n    dispose() {\n      if (this._swipeHelper) {\n        this._swipeHelper.dispose();\n      }\n      super.dispose();\n    }\n\n    // Private\n    _configAfterMerge(config) {\n      config.defaultInterval = config.interval;\n      return config;\n    }\n    _addEventListeners() {\n      if (this._config.keyboard) {\n        EventHandler.on(this._element, EVENT_KEYDOWN$1, event => this._keydown(event));\n      }\n      if (this._config.pause === 'hover') {\n        EventHandler.on(this._element, EVENT_MOUSEENTER$1, () => this.pause());\n        EventHandler.on(this._element, EVENT_MOUSELEAVE$1, () => this._maybeEnableCycle());\n      }\n      if (this._config.touch && Swipe.isSupported()) {\n        this._addTouchEventListeners();\n      }\n    }\n    _addTouchEventListeners() {\n      for (const img of SelectorEngine.find(SELECTOR_ITEM_IMG, this._element)) {\n        EventHandler.on(img, EVENT_DRAG_START, event => event.preventDefault());\n      }\n      const endCallBack = () => {\n        if (this._config.pause !== 'hover') {\n          return;\n        }\n\n        // If it's a touch-enabled device, mouseenter/leave are fired as\n        // part of the mouse compatibility events on first tap - the carousel\n        // would stop cycling until user tapped out of it;\n        // here, we listen for touchend, explicitly pause the carousel\n        // (as if it's the second time we tap on it, mouseenter compat event\n        // is NOT fired) and after a timeout (to allow for mouse compatibility\n        // events to fire) we explicitly restart cycling\n\n        this.pause();\n        if (this.touchTimeout) {\n          clearTimeout(this.touchTimeout);\n        }\n        this.touchTimeout = setTimeout(() => this._maybeEnableCycle(), TOUCHEVENT_COMPAT_WAIT + this._config.interval);\n      };\n      const swipeConfig = {\n        leftCallback: () => this._slide(this._directionToOrder(DIRECTION_LEFT)),\n        rightCallback: () => this._slide(this._directionToOrder(DIRECTION_RIGHT)),\n        endCallback: endCallBack\n      };\n      this._swipeHelper = new Swipe(this._element, swipeConfig);\n    }\n    _keydown(event) {\n      if (/input|textarea/i.test(event.target.tagName)) {\n        return;\n      }\n      const direction = KEY_TO_DIRECTION[event.key];\n      if (direction) {\n        event.preventDefault();\n        this._slide(this._directionToOrder(direction));\n      }\n    }\n    _getItemIndex(element) {\n      return this._getItems().indexOf(element);\n    }\n    _setActiveIndicatorElement(index) {\n      if (!this._indicatorsElement) {\n        return;\n      }\n      const activeIndicator = SelectorEngine.findOne(SELECTOR_ACTIVE, this._indicatorsElement);\n      activeIndicator.classList.remove(CLASS_NAME_ACTIVE$2);\n      activeIndicator.removeAttribute('aria-current');\n      const newActiveIndicator = SelectorEngine.findOne(`[data-bs-slide-to=\"${index}\"]`, this._indicatorsElement);\n      if (newActiveIndicator) {\n        newActiveIndicator.classList.add(CLASS_NAME_ACTIVE$2);\n        newActiveIndicator.setAttribute('aria-current', 'true');\n      }\n    }\n    _updateInterval() {\n      const element = this._activeElement || this._getActive();\n      if (!element) {\n        return;\n      }\n      const elementInterval = Number.parseInt(element.getAttribute('data-bs-interval'), 10);\n      this._config.interval = elementInterval || this._config.defaultInterval;\n    }\n    _slide(order, element = null) {\n      if (this._isSliding) {\n        return;\n      }\n      const activeElement = this._getActive();\n      const isNext = order === ORDER_NEXT;\n      const nextElement = element || getNextActiveElement(this._getItems(), activeElement, isNext, this._config.wrap);\n      if (nextElement === activeElement) {\n        return;\n      }\n      const nextElementIndex = this._getItemIndex(nextElement);\n      const triggerEvent = eventName => {\n        return EventHandler.trigger(this._element, eventName, {\n          relatedTarget: nextElement,\n          direction: this._orderToDirection(order),\n          from: this._getItemIndex(activeElement),\n          to: nextElementIndex\n        });\n      };\n      const slideEvent = triggerEvent(EVENT_SLIDE);\n      if (slideEvent.defaultPrevented) {\n        return;\n      }\n      if (!activeElement || !nextElement) {\n        // Some weirdness is happening, so we bail\n        // TODO: change tests that use empty divs to avoid this check\n        return;\n      }\n      const isCycling = Boolean(this._interval);\n      this.pause();\n      this._isSliding = true;\n      this._setActiveIndicatorElement(nextElementIndex);\n      this._activeElement = nextElement;\n      const directionalClassName = isNext ? CLASS_NAME_START : CLASS_NAME_END;\n      const orderClassName = isNext ? CLASS_NAME_NEXT : CLASS_NAME_PREV;\n      nextElement.classList.add(orderClassName);\n      reflow(nextElement);\n      activeElement.classList.add(directionalClassName);\n      nextElement.classList.add(directionalClassName);\n      const completeCallBack = () => {\n        nextElement.classList.remove(directionalClassName, orderClassName);\n        nextElement.classList.add(CLASS_NAME_ACTIVE$2);\n        activeElement.classList.remove(CLASS_NAME_ACTIVE$2, orderClassName, directionalClassName);\n        this._isSliding = false;\n        triggerEvent(EVENT_SLID);\n      };\n      this._queueCallback(completeCallBack, activeElement, this._isAnimated());\n      if (isCycling) {\n        this.cycle();\n      }\n    }\n    _isAnimated() {\n      return this._element.classList.contains(CLASS_NAME_SLIDE);\n    }\n    _getActive() {\n      return SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element);\n    }\n    _getItems() {\n      return SelectorEngine.find(SELECTOR_ITEM, this._element);\n    }\n    _clearInterval() {\n      if (this._interval) {\n        clearInterval(this._interval);\n        this._interval = null;\n      }\n    }\n    _directionToOrder(direction) {\n      if (isRTL()) {\n        return direction === DIRECTION_LEFT ? ORDER_PREV : ORDER_NEXT;\n      }\n      return direction === DIRECTION_LEFT ? ORDER_NEXT : ORDER_PREV;\n    }\n    _orderToDirection(order) {\n      if (isRTL()) {\n        return order === ORDER_PREV ? DIRECTION_LEFT : DIRECTION_RIGHT;\n      }\n      return order === ORDER_PREV ? DIRECTION_RIGHT : DIRECTION_LEFT;\n    }\n\n    // Static\n    static jQueryInterface(config) {\n      return this.each(function () {\n        const data = Carousel.getOrCreateInstance(this, config);\n        if (typeof config === 'number') {\n          data.to(config);\n          return;\n        }\n        if (typeof config === 'string') {\n          if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n            throw new TypeError(`No method named \"${config}\"`);\n          }\n          data[config]();\n        }\n      });\n    }\n  }\n\n  /**\n   * Data API implementation\n   */\n\n  EventHandler.on(document, EVENT_CLICK_DATA_API$5, SELECTOR_DATA_SLIDE, function (event) {\n    const target = SelectorEngine.getElementFromSelector(this);\n    if (!target || !target.classList.contains(CLASS_NAME_CAROUSEL)) {\n      return;\n    }\n    event.preventDefault();\n    const carousel = Carousel.getOrCreateInstance(target);\n    const slideIndex = this.getAttribute('data-bs-slide-to');\n    if (slideIndex) {\n      carousel.to(slideIndex);\n      carousel._maybeEnableCycle();\n      return;\n    }\n    if (Manipulator.getDataAttribute(this, 'slide') === 'next') {\n      carousel.next();\n      carousel._maybeEnableCycle();\n      return;\n    }\n    carousel.prev();\n    carousel._maybeEnableCycle();\n  });\n  EventHandler.on(window, EVENT_LOAD_DATA_API$3, () => {\n    const carousels = SelectorEngine.find(SELECTOR_DATA_RIDE);\n    for (const carousel of carousels) {\n      Carousel.getOrCreateInstance(carousel);\n    }\n  });\n\n  /**\n   * jQuery\n   */\n\n  defineJQueryPlugin(Carousel);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap collapse.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n\n  /**\n   * Constants\n   */\n\n  const NAME$b = 'collapse';\n  const DATA_KEY$7 = 'bs.collapse';\n  const EVENT_KEY$7 = `.${DATA_KEY$7}`;\n  const DATA_API_KEY$4 = '.data-api';\n  const EVENT_SHOW$6 = `show${EVENT_KEY$7}`;\n  const EVENT_SHOWN$6 = `shown${EVENT_KEY$7}`;\n  const EVENT_HIDE$6 = `hide${EVENT_KEY$7}`;\n  const EVENT_HIDDEN$6 = `hidden${EVENT_KEY$7}`;\n  const EVENT_CLICK_DATA_API$4 = `click${EVENT_KEY$7}${DATA_API_KEY$4}`;\n  const CLASS_NAME_SHOW$7 = 'show';\n  const CLASS_NAME_COLLAPSE = 'collapse';\n  const CLASS_NAME_COLLAPSING = 'collapsing';\n  const CLASS_NAME_COLLAPSED = 'collapsed';\n  const CLASS_NAME_DEEPER_CHILDREN = `:scope .${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`;\n  const CLASS_NAME_HORIZONTAL = 'collapse-horizontal';\n  const WIDTH = 'width';\n  const HEIGHT = 'height';\n  const SELECTOR_ACTIVES = '.collapse.show, .collapse.collapsing';\n  const SELECTOR_DATA_TOGGLE$4 = '[data-bs-toggle=\"collapse\"]';\n  const Default$a = {\n    parent: null,\n    toggle: true\n  };\n  const DefaultType$a = {\n    parent: '(null|element)',\n    toggle: 'boolean'\n  };\n\n  /**\n   * Class definition\n   */\n\n  class Collapse extends BaseComponent {\n    constructor(element, config) {\n      super(element, config);\n      this._isTransitioning = false;\n      this._triggerArray = [];\n      const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE$4);\n      for (const elem of toggleList) {\n        const selector = SelectorEngine.getSelectorFromElement(elem);\n        const filterElement = SelectorEngine.find(selector).filter(foundElement => foundElement === this._element);\n        if (selector !== null && filterElement.length) {\n          this._triggerArray.push(elem);\n        }\n      }\n      this._initializeChildren();\n      if (!this._config.parent) {\n        this._addAriaAndCollapsedClass(this._triggerArray, this._isShown());\n      }\n      if (this._config.toggle) {\n        this.toggle();\n      }\n    }\n\n    // Getters\n    static get Default() {\n      return Default$a;\n    }\n    static get DefaultType() {\n      return DefaultType$a;\n    }\n    static get NAME() {\n      return NAME$b;\n    }\n\n    // Public\n    toggle() {\n      if (this._isShown()) {\n        this.hide();\n      } else {\n        this.show();\n      }\n    }\n    show() {\n      if (this._isTransitioning || this._isShown()) {\n        return;\n      }\n      let activeChildren = [];\n\n      // find active children\n      if (this._config.parent) {\n        activeChildren = this._getFirstLevelChildren(SELECTOR_ACTIVES).filter(element => element !== this._element).map(element => Collapse.getOrCreateInstance(element, {\n          toggle: false\n        }));\n      }\n      if (activeChildren.length && activeChildren[0]._isTransitioning) {\n        return;\n      }\n      const startEvent = EventHandler.trigger(this._element, EVENT_SHOW$6);\n      if (startEvent.defaultPrevented) {\n        return;\n      }\n      for (const activeInstance of activeChildren) {\n        activeInstance.hide();\n      }\n      const dimension = this._getDimension();\n      this._element.classList.remove(CLASS_NAME_COLLAPSE);\n      this._element.classList.add(CLASS_NAME_COLLAPSING);\n      this._element.style[dimension] = 0;\n      this._addAriaAndCollapsedClass(this._triggerArray, true);\n      this._isTransitioning = true;\n      const complete = () => {\n        this._isTransitioning = false;\n        this._element.classList.remove(CLASS_NAME_COLLAPSING);\n        this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7);\n        this._element.style[dimension] = '';\n        EventHandler.trigger(this._element, EVENT_SHOWN$6);\n      };\n      const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);\n      const scrollSize = `scroll${capitalizedDimension}`;\n      this._queueCallback(complete, this._element, true);\n      this._element.style[dimension] = `${this._element[scrollSize]}px`;\n    }\n    hide() {\n      if (this._isTransitioning || !this._isShown()) {\n        return;\n      }\n      const startEvent = EventHandler.trigger(this._element, EVENT_HIDE$6);\n      if (startEvent.defaultPrevented) {\n        return;\n      }\n      const dimension = this._getDimension();\n      this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`;\n      reflow(this._element);\n      this._element.classList.add(CLASS_NAME_COLLAPSING);\n      this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7);\n      for (const trigger of this._triggerArray) {\n        const element = SelectorEngine.getElementFromSelector(trigger);\n        if (element && !this._isShown(element)) {\n          this._addAriaAndCollapsedClass([trigger], false);\n        }\n      }\n      this._isTransitioning = true;\n      const complete = () => {\n        this._isTransitioning = false;\n        this._element.classList.remove(CLASS_NAME_COLLAPSING);\n        this._element.classList.add(CLASS_NAME_COLLAPSE);\n        EventHandler.trigger(this._element, EVENT_HIDDEN$6);\n      };\n      this._element.style[dimension] = '';\n      this._queueCallback(complete, this._element, true);\n    }\n\n    // Private\n    _isShown(element = this._element) {\n      return element.classList.contains(CLASS_NAME_SHOW$7);\n    }\n    _configAfterMerge(config) {\n      config.toggle = Boolean(config.toggle); // Coerce string values\n      config.parent = getElement(config.parent);\n      return config;\n    }\n    _getDimension() {\n      return this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT;\n    }\n    _initializeChildren() {\n      if (!this._config.parent) {\n        return;\n      }\n      const children = this._getFirstLevelChildren(SELECTOR_DATA_TOGGLE$4);\n      for (const element of children) {\n        const selected = SelectorEngine.getElementFromSelector(element);\n        if (selected) {\n          this._addAriaAndCollapsedClass([element], this._isShown(selected));\n        }\n      }\n    }\n    _getFirstLevelChildren(selector) {\n      const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent);\n      // remove children if greater depth\n      return SelectorEngine.find(selector, this._config.parent).filter(element => !children.includes(element));\n    }\n    _addAriaAndCollapsedClass(triggerArray, isOpen) {\n      if (!triggerArray.length) {\n        return;\n      }\n      for (const element of triggerArray) {\n        element.classList.toggle(CLASS_NAME_COLLAPSED, !isOpen);\n        element.setAttribute('aria-expanded', isOpen);\n      }\n    }\n\n    // Static\n    static jQueryInterface(config) {\n      const _config = {};\n      if (typeof config === 'string' && /show|hide/.test(config)) {\n        _config.toggle = false;\n      }\n      return this.each(function () {\n        const data = Collapse.getOrCreateInstance(this, _config);\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(`No method named \"${config}\"`);\n          }\n          data[config]();\n        }\n      });\n    }\n  }\n\n  /**\n   * Data API implementation\n   */\n\n  EventHandler.on(document, EVENT_CLICK_DATA_API$4, SELECTOR_DATA_TOGGLE$4, function (event) {\n    // preventDefault only for <a> elements (which change the URL) not inside the collapsible element\n    if (event.target.tagName === 'A' || event.delegateTarget && event.delegateTarget.tagName === 'A') {\n      event.preventDefault();\n    }\n    for (const element of SelectorEngine.getMultipleElementsFromSelector(this)) {\n      Collapse.getOrCreateInstance(element, {\n        toggle: false\n      }).toggle();\n    }\n  });\n\n  /**\n   * jQuery\n   */\n\n  defineJQueryPlugin(Collapse);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap dropdown.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n\n  /**\n   * Constants\n   */\n\n  const NAME$a = 'dropdown';\n  const DATA_KEY$6 = 'bs.dropdown';\n  const EVENT_KEY$6 = `.${DATA_KEY$6}`;\n  const DATA_API_KEY$3 = '.data-api';\n  const ESCAPE_KEY$2 = 'Escape';\n  const TAB_KEY$1 = 'Tab';\n  const ARROW_UP_KEY$1 = 'ArrowUp';\n  const ARROW_DOWN_KEY$1 = 'ArrowDown';\n  const RIGHT_MOUSE_BUTTON = 2; // MouseEvent.button value for the secondary button, usually the right button\n\n  const EVENT_HIDE$5 = `hide${EVENT_KEY$6}`;\n  const EVENT_HIDDEN$5 = `hidden${EVENT_KEY$6}`;\n  const EVENT_SHOW$5 = `show${EVENT_KEY$6}`;\n  const EVENT_SHOWN$5 = `shown${EVENT_KEY$6}`;\n  const EVENT_CLICK_DATA_API$3 = `click${EVENT_KEY$6}${DATA_API_KEY$3}`;\n  const EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY$6}${DATA_API_KEY$3}`;\n  const EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY$6}${DATA_API_KEY$3}`;\n  const CLASS_NAME_SHOW$6 = 'show';\n  const CLASS_NAME_DROPUP = 'dropup';\n  const CLASS_NAME_DROPEND = 'dropend';\n  const CLASS_NAME_DROPSTART = 'dropstart';\n  const CLASS_NAME_DROPUP_CENTER = 'dropup-center';\n  const CLASS_NAME_DROPDOWN_CENTER = 'dropdown-center';\n  const SELECTOR_DATA_TOGGLE$3 = '[data-bs-toggle=\"dropdown\"]:not(.disabled):not(:disabled)';\n  const SELECTOR_DATA_TOGGLE_SHOWN = `${SELECTOR_DATA_TOGGLE$3}.${CLASS_NAME_SHOW$6}`;\n  const SELECTOR_MENU = '.dropdown-menu';\n  const SELECTOR_NAVBAR = '.navbar';\n  const SELECTOR_NAVBAR_NAV = '.navbar-nav';\n  const SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)';\n  const PLACEMENT_TOP = isRTL() ? 'top-end' : 'top-start';\n  const PLACEMENT_TOPEND = isRTL() ? 'top-start' : 'top-end';\n  const PLACEMENT_BOTTOM = isRTL() ? 'bottom-end' : 'bottom-start';\n  const PLACEMENT_BOTTOMEND = isRTL() ? 'bottom-start' : 'bottom-end';\n  const PLACEMENT_RIGHT = isRTL() ? 'left-start' : 'right-start';\n  const PLACEMENT_LEFT = isRTL() ? 'right-start' : 'left-start';\n  const PLACEMENT_TOPCENTER = 'top';\n  const PLACEMENT_BOTTOMCENTER = 'bottom';\n  const Default$9 = {\n    autoClose: true,\n    boundary: 'clippingParents',\n    display: 'dynamic',\n    offset: [0, 2],\n    popperConfig: null,\n    reference: 'toggle'\n  };\n  const DefaultType$9 = {\n    autoClose: '(boolean|string)',\n    boundary: '(string|element)',\n    display: 'string',\n    offset: '(array|string|function)',\n    popperConfig: '(null|object|function)',\n    reference: '(string|element|object)'\n  };\n\n  /**\n   * Class definition\n   */\n\n  class Dropdown extends BaseComponent {\n    constructor(element, config) {\n      super(element, config);\n      this._popper = null;\n      this._parent = this._element.parentNode; // dropdown wrapper\n      // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/\n      this._menu = SelectorEngine.next(this._element, SELECTOR_MENU)[0] || SelectorEngine.prev(this._element, SELECTOR_MENU)[0] || SelectorEngine.findOne(SELECTOR_MENU, this._parent);\n      this._inNavbar = this._detectNavbar();\n    }\n\n    // Getters\n    static get Default() {\n      return Default$9;\n    }\n    static get DefaultType() {\n      return DefaultType$9;\n    }\n    static get NAME() {\n      return NAME$a;\n    }\n\n    // Public\n    toggle() {\n      return this._isShown() ? this.hide() : this.show();\n    }\n    show() {\n      if (isDisabled(this._element) || this._isShown()) {\n        return;\n      }\n      const relatedTarget = {\n        relatedTarget: this._element\n      };\n      const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$5, relatedTarget);\n      if (showEvent.defaultPrevented) {\n        return;\n      }\n      this._createPopper();\n\n      // If this is a touch-enabled device we add extra\n      // empty mouseover listeners to the body's immediate children;\n      // only needed because of broken event delegation on iOS\n      // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n      if ('ontouchstart' in document.documentElement && !this._parent.closest(SELECTOR_NAVBAR_NAV)) {\n        for (const element of [].concat(...document.body.children)) {\n          EventHandler.on(element, 'mouseover', noop);\n        }\n      }\n      this._element.focus();\n      this._element.setAttribute('aria-expanded', true);\n      this._menu.classList.add(CLASS_NAME_SHOW$6);\n      this._element.classList.add(CLASS_NAME_SHOW$6);\n      EventHandler.trigger(this._element, EVENT_SHOWN$5, relatedTarget);\n    }\n    hide() {\n      if (isDisabled(this._element) || !this._isShown()) {\n        return;\n      }\n      const relatedTarget = {\n        relatedTarget: this._element\n      };\n      this._completeHide(relatedTarget);\n    }\n    dispose() {\n      if (this._popper) {\n        this._popper.destroy();\n      }\n      super.dispose();\n    }\n    update() {\n      this._inNavbar = this._detectNavbar();\n      if (this._popper) {\n        this._popper.update();\n      }\n    }\n\n    // Private\n    _completeHide(relatedTarget) {\n      const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$5, relatedTarget);\n      if (hideEvent.defaultPrevented) {\n        return;\n      }\n\n      // If this is a touch-enabled device we remove the extra\n      // empty mouseover listeners we added for iOS support\n      if ('ontouchstart' in document.documentElement) {\n        for (const element of [].concat(...document.body.children)) {\n          EventHandler.off(element, 'mouseover', noop);\n        }\n      }\n      if (this._popper) {\n        this._popper.destroy();\n      }\n      this._menu.classList.remove(CLASS_NAME_SHOW$6);\n      this._element.classList.remove(CLASS_NAME_SHOW$6);\n      this._element.setAttribute('aria-expanded', 'false');\n      Manipulator.removeDataAttribute(this._menu, 'popper');\n      EventHandler.trigger(this._element, EVENT_HIDDEN$5, relatedTarget);\n    }\n    _getConfig(config) {\n      config = super._getConfig(config);\n      if (typeof config.reference === 'object' && !isElement(config.reference) && typeof config.reference.getBoundingClientRect !== 'function') {\n        // Popper virtual elements require a getBoundingClientRect method\n        throw new TypeError(`${NAME$a.toUpperCase()}: Option \"reference\" provided type \"object\" without a required \"getBoundingClientRect\" method.`);\n      }\n      return config;\n    }\n    _createPopper() {\n      if (typeof Popper__namespace === 'undefined') {\n        throw new TypeError('Bootstrap\\'s dropdowns require Popper (https://popper.js.org/docs/v2/)');\n      }\n      let referenceElement = this._element;\n      if (this._config.reference === 'parent') {\n        referenceElement = this._parent;\n      } else if (isElement(this._config.reference)) {\n        referenceElement = getElement(this._config.reference);\n      } else if (typeof this._config.reference === 'object') {\n        referenceElement = this._config.reference;\n      }\n      const popperConfig = this._getPopperConfig();\n      this._popper = Popper__namespace.createPopper(referenceElement, this._menu, popperConfig);\n    }\n    _isShown() {\n      return this._menu.classList.contains(CLASS_NAME_SHOW$6);\n    }\n    _getPlacement() {\n      const parentDropdown = this._parent;\n      if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) {\n        return PLACEMENT_RIGHT;\n      }\n      if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) {\n        return PLACEMENT_LEFT;\n      }\n      if (parentDropdown.classList.contains(CLASS_NAME_DROPUP_CENTER)) {\n        return PLACEMENT_TOPCENTER;\n      }\n      if (parentDropdown.classList.contains(CLASS_NAME_DROPDOWN_CENTER)) {\n        return PLACEMENT_BOTTOMCENTER;\n      }\n\n      // We need to trim the value because custom properties can also include spaces\n      const isEnd = getComputedStyle(this._menu).getPropertyValue('--bs-position').trim() === 'end';\n      if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) {\n        return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP;\n      }\n      return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM;\n    }\n    _detectNavbar() {\n      return this._element.closest(SELECTOR_NAVBAR) !== null;\n    }\n    _getOffset() {\n      const {\n        offset\n      } = this._config;\n      if (typeof offset === 'string') {\n        return offset.split(',').map(value => Number.parseInt(value, 10));\n      }\n      if (typeof offset === 'function') {\n        return popperData => offset(popperData, this._element);\n      }\n      return offset;\n    }\n    _getPopperConfig() {\n      const defaultBsPopperConfig = {\n        placement: this._getPlacement(),\n        modifiers: [{\n          name: 'preventOverflow',\n          options: {\n            boundary: this._config.boundary\n          }\n        }, {\n          name: 'offset',\n          options: {\n            offset: this._getOffset()\n          }\n        }]\n      };\n\n      // Disable Popper if we have a static display or Dropdown is in Navbar\n      if (this._inNavbar || this._config.display === 'static') {\n        Manipulator.setDataAttribute(this._menu, 'popper', 'static'); // TODO: v6 remove\n        defaultBsPopperConfig.modifiers = [{\n          name: 'applyStyles',\n          enabled: false\n        }];\n      }\n      return {\n        ...defaultBsPopperConfig,\n        ...execute(this._config.popperConfig, [undefined, defaultBsPopperConfig])\n      };\n    }\n    _selectMenuItem({\n      key,\n      target\n    }) {\n      const items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, this._menu).filter(element => isVisible(element));\n      if (!items.length) {\n        return;\n      }\n\n      // if target isn't included in items (e.g. when expanding the dropdown)\n      // allow cycling to get the last item in case key equals ARROW_UP_KEY\n      getNextActiveElement(items, target, key === ARROW_DOWN_KEY$1, !items.includes(target)).focus();\n    }\n\n    // Static\n    static jQueryInterface(config) {\n      return this.each(function () {\n        const data = Dropdown.getOrCreateInstance(this, config);\n        if (typeof config !== 'string') {\n          return;\n        }\n        if (typeof data[config] === 'undefined') {\n          throw new TypeError(`No method named \"${config}\"`);\n        }\n        data[config]();\n      });\n    }\n    static clearMenus(event) {\n      if (event.button === RIGHT_MOUSE_BUTTON || event.type === 'keyup' && event.key !== TAB_KEY$1) {\n        return;\n      }\n      const openToggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE_SHOWN);\n      for (const toggle of openToggles) {\n        const context = Dropdown.getInstance(toggle);\n        if (!context || context._config.autoClose === false) {\n          continue;\n        }\n        const composedPath = event.composedPath();\n        const isMenuTarget = composedPath.includes(context._menu);\n        if (composedPath.includes(context._element) || context._config.autoClose === 'inside' && !isMenuTarget || context._config.autoClose === 'outside' && isMenuTarget) {\n          continue;\n        }\n\n        // Tab navigation through the dropdown menu or events from contained inputs shouldn't close the menu\n        if (context._menu.contains(event.target) && (event.type === 'keyup' && event.key === TAB_KEY$1 || /input|select|option|textarea|form/i.test(event.target.tagName))) {\n          continue;\n        }\n        const relatedTarget = {\n          relatedTarget: context._element\n        };\n        if (event.type === 'click') {\n          relatedTarget.clickEvent = event;\n        }\n        context._completeHide(relatedTarget);\n      }\n    }\n    static dataApiKeydownHandler(event) {\n      // If not an UP | DOWN | ESCAPE key => not a dropdown command\n      // If input/textarea && if key is other than ESCAPE => not a dropdown command\n\n      const isInput = /input|textarea/i.test(event.target.tagName);\n      const isEscapeEvent = event.key === ESCAPE_KEY$2;\n      const isUpOrDownEvent = [ARROW_UP_KEY$1, ARROW_DOWN_KEY$1].includes(event.key);\n      if (!isUpOrDownEvent && !isEscapeEvent) {\n        return;\n      }\n      if (isInput && !isEscapeEvent) {\n        return;\n      }\n      event.preventDefault();\n\n      // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/\n      const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE$3) ? this : SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE$3)[0] || SelectorEngine.next(this, SELECTOR_DATA_TOGGLE$3)[0] || SelectorEngine.findOne(SELECTOR_DATA_TOGGLE$3, event.delegateTarget.parentNode);\n      const instance = Dropdown.getOrCreateInstance(getToggleButton);\n      if (isUpOrDownEvent) {\n        event.stopPropagation();\n        instance.show();\n        instance._selectMenuItem(event);\n        return;\n      }\n      if (instance._isShown()) {\n        // else is escape and we check if it is shown\n        event.stopPropagation();\n        instance.hide();\n        getToggleButton.focus();\n      }\n    }\n  }\n\n  /**\n   * Data API implementation\n   */\n\n  EventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE$3, Dropdown.dataApiKeydownHandler);\n  EventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler);\n  EventHandler.on(document, EVENT_CLICK_DATA_API$3, Dropdown.clearMenus);\n  EventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus);\n  EventHandler.on(document, EVENT_CLICK_DATA_API$3, SELECTOR_DATA_TOGGLE$3, function (event) {\n    event.preventDefault();\n    Dropdown.getOrCreateInstance(this).toggle();\n  });\n\n  /**\n   * jQuery\n   */\n\n  defineJQueryPlugin(Dropdown);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap util/backdrop.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n\n  /**\n   * Constants\n   */\n\n  const NAME$9 = 'backdrop';\n  const CLASS_NAME_FADE$4 = 'fade';\n  const CLASS_NAME_SHOW$5 = 'show';\n  const EVENT_MOUSEDOWN = `mousedown.bs.${NAME$9}`;\n  const Default$8 = {\n    className: 'modal-backdrop',\n    clickCallback: null,\n    isAnimated: false,\n    isVisible: true,\n    // if false, we use the backdrop helper without adding any element to the dom\n    rootElement: 'body' // give the choice to place backdrop under different elements\n  };\n  const DefaultType$8 = {\n    className: 'string',\n    clickCallback: '(function|null)',\n    isAnimated: 'boolean',\n    isVisible: 'boolean',\n    rootElement: '(element|string)'\n  };\n\n  /**\n   * Class definition\n   */\n\n  class Backdrop extends Config {\n    constructor(config) {\n      super();\n      this._config = this._getConfig(config);\n      this._isAppended = false;\n      this._element = null;\n    }\n\n    // Getters\n    static get Default() {\n      return Default$8;\n    }\n    static get DefaultType() {\n      return DefaultType$8;\n    }\n    static get NAME() {\n      return NAME$9;\n    }\n\n    // Public\n    show(callback) {\n      if (!this._config.isVisible) {\n        execute(callback);\n        return;\n      }\n      this._append();\n      const element = this._getElement();\n      if (this._config.isAnimated) {\n        reflow(element);\n      }\n      element.classList.add(CLASS_NAME_SHOW$5);\n      this._emulateAnimation(() => {\n        execute(callback);\n      });\n    }\n    hide(callback) {\n      if (!this._config.isVisible) {\n        execute(callback);\n        return;\n      }\n      this._getElement().classList.remove(CLASS_NAME_SHOW$5);\n      this._emulateAnimation(() => {\n        this.dispose();\n        execute(callback);\n      });\n    }\n    dispose() {\n      if (!this._isAppended) {\n        return;\n      }\n      EventHandler.off(this._element, EVENT_MOUSEDOWN);\n      this._element.remove();\n      this._isAppended = false;\n    }\n\n    // Private\n    _getElement() {\n      if (!this._element) {\n        const backdrop = document.createElement('div');\n        backdrop.className = this._config.className;\n        if (this._config.isAnimated) {\n          backdrop.classList.add(CLASS_NAME_FADE$4);\n        }\n        this._element = backdrop;\n      }\n      return this._element;\n    }\n    _configAfterMerge(config) {\n      // use getElement() with the default \"body\" to get a fresh Element on each instantiation\n      config.rootElement = getElement(config.rootElement);\n      return config;\n    }\n    _append() {\n      if (this._isAppended) {\n        return;\n      }\n      const element = this._getElement();\n      this._config.rootElement.append(element);\n      EventHandler.on(element, EVENT_MOUSEDOWN, () => {\n        execute(this._config.clickCallback);\n      });\n      this._isAppended = true;\n    }\n    _emulateAnimation(callback) {\n      executeAfterTransition(callback, this._getElement(), this._config.isAnimated);\n    }\n  }\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap util/focustrap.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n\n  /**\n   * Constants\n   */\n\n  const NAME$8 = 'focustrap';\n  const DATA_KEY$5 = 'bs.focustrap';\n  const EVENT_KEY$5 = `.${DATA_KEY$5}`;\n  const EVENT_FOCUSIN$2 = `focusin${EVENT_KEY$5}`;\n  const EVENT_KEYDOWN_TAB = `keydown.tab${EVENT_KEY$5}`;\n  const TAB_KEY = 'Tab';\n  const TAB_NAV_FORWARD = 'forward';\n  const TAB_NAV_BACKWARD = 'backward';\n  const Default$7 = {\n    autofocus: true,\n    trapElement: null // The element to trap focus inside of\n  };\n  const DefaultType$7 = {\n    autofocus: 'boolean',\n    trapElement: 'element'\n  };\n\n  /**\n   * Class definition\n   */\n\n  class FocusTrap extends Config {\n    constructor(config) {\n      super();\n      this._config = this._getConfig(config);\n      this._isActive = false;\n      this._lastTabNavDirection = null;\n    }\n\n    // Getters\n    static get Default() {\n      return Default$7;\n    }\n    static get DefaultType() {\n      return DefaultType$7;\n    }\n    static get NAME() {\n      return NAME$8;\n    }\n\n    // Public\n    activate() {\n      if (this._isActive) {\n        return;\n      }\n      if (this._config.autofocus) {\n        this._config.trapElement.focus();\n      }\n      EventHandler.off(document, EVENT_KEY$5); // guard against infinite focus loop\n      EventHandler.on(document, EVENT_FOCUSIN$2, event => this._handleFocusin(event));\n      EventHandler.on(document, EVENT_KEYDOWN_TAB, event => this._handleKeydown(event));\n      this._isActive = true;\n    }\n    deactivate() {\n      if (!this._isActive) {\n        return;\n      }\n      this._isActive = false;\n      EventHandler.off(document, EVENT_KEY$5);\n    }\n\n    // Private\n    _handleFocusin(event) {\n      const {\n        trapElement\n      } = this._config;\n      if (event.target === document || event.target === trapElement || trapElement.contains(event.target)) {\n        return;\n      }\n      const elements = SelectorEngine.focusableChildren(trapElement);\n      if (elements.length === 0) {\n        trapElement.focus();\n      } else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) {\n        elements[elements.length - 1].focus();\n      } else {\n        elements[0].focus();\n      }\n    }\n    _handleKeydown(event) {\n      if (event.key !== TAB_KEY) {\n        return;\n      }\n      this._lastTabNavDirection = event.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD;\n    }\n  }\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap util/scrollBar.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n\n  /**\n   * Constants\n   */\n\n  const SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top';\n  const SELECTOR_STICKY_CONTENT = '.sticky-top';\n  const PROPERTY_PADDING = 'padding-right';\n  const PROPERTY_MARGIN = 'margin-right';\n\n  /**\n   * Class definition\n   */\n\n  class ScrollBarHelper {\n    constructor() {\n      this._element = document.body;\n    }\n\n    // Public\n    getWidth() {\n      // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes\n      const documentWidth = document.documentElement.clientWidth;\n      return Math.abs(window.innerWidth - documentWidth);\n    }\n    hide() {\n      const width = this.getWidth();\n      this._disableOverFlow();\n      // give padding to element to balance the hidden scrollbar width\n      this._setElementAttributes(this._element, PROPERTY_PADDING, calculatedValue => calculatedValue + width);\n      // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements to keep showing fullwidth\n      this._setElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING, calculatedValue => calculatedValue + width);\n      this._setElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN, calculatedValue => calculatedValue - width);\n    }\n    reset() {\n      this._resetElementAttributes(this._element, 'overflow');\n      this._resetElementAttributes(this._element, PROPERTY_PADDING);\n      this._resetElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING);\n      this._resetElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN);\n    }\n    isOverflowing() {\n      return this.getWidth() > 0;\n    }\n\n    // Private\n    _disableOverFlow() {\n      this._saveInitialAttribute(this._element, 'overflow');\n      this._element.style.overflow = 'hidden';\n    }\n    _setElementAttributes(selector, styleProperty, callback) {\n      const scrollbarWidth = this.getWidth();\n      const manipulationCallBack = element => {\n        if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) {\n          return;\n        }\n        this._saveInitialAttribute(element, styleProperty);\n        const calculatedValue = window.getComputedStyle(element).getPropertyValue(styleProperty);\n        element.style.setProperty(styleProperty, `${callback(Number.parseFloat(calculatedValue))}px`);\n      };\n      this._applyManipulationCallback(selector, manipulationCallBack);\n    }\n    _saveInitialAttribute(element, styleProperty) {\n      const actualValue = element.style.getPropertyValue(styleProperty);\n      if (actualValue) {\n        Manipulator.setDataAttribute(element, styleProperty, actualValue);\n      }\n    }\n    _resetElementAttributes(selector, styleProperty) {\n      const manipulationCallBack = element => {\n        const value = Manipulator.getDataAttribute(element, styleProperty);\n        // We only want to remove the property if the value is `null`; the value can also be zero\n        if (value === null) {\n          element.style.removeProperty(styleProperty);\n          return;\n        }\n        Manipulator.removeDataAttribute(element, styleProperty);\n        element.style.setProperty(styleProperty, value);\n      };\n      this._applyManipulationCallback(selector, manipulationCallBack);\n    }\n    _applyManipulationCallback(selector, callBack) {\n      if (isElement(selector)) {\n        callBack(selector);\n        return;\n      }\n      for (const sel of SelectorEngine.find(selector, this._element)) {\n        callBack(sel);\n      }\n    }\n  }\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap modal.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n\n  /**\n   * Constants\n   */\n\n  const NAME$7 = 'modal';\n  const DATA_KEY$4 = 'bs.modal';\n  const EVENT_KEY$4 = `.${DATA_KEY$4}`;\n  const DATA_API_KEY$2 = '.data-api';\n  const ESCAPE_KEY$1 = 'Escape';\n  const EVENT_HIDE$4 = `hide${EVENT_KEY$4}`;\n  const EVENT_HIDE_PREVENTED$1 = `hidePrevented${EVENT_KEY$4}`;\n  const EVENT_HIDDEN$4 = `hidden${EVENT_KEY$4}`;\n  const EVENT_SHOW$4 = `show${EVENT_KEY$4}`;\n  const EVENT_SHOWN$4 = `shown${EVENT_KEY$4}`;\n  const EVENT_RESIZE$1 = `resize${EVENT_KEY$4}`;\n  const EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY$4}`;\n  const EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY$4}`;\n  const EVENT_KEYDOWN_DISMISS$1 = `keydown.dismiss${EVENT_KEY$4}`;\n  const EVENT_CLICK_DATA_API$2 = `click${EVENT_KEY$4}${DATA_API_KEY$2}`;\n  const CLASS_NAME_OPEN = 'modal-open';\n  const CLASS_NAME_FADE$3 = 'fade';\n  const CLASS_NAME_SHOW$4 = 'show';\n  const CLASS_NAME_STATIC = 'modal-static';\n  const OPEN_SELECTOR$1 = '.modal.show';\n  const SELECTOR_DIALOG = '.modal-dialog';\n  const SELECTOR_MODAL_BODY = '.modal-body';\n  const SELECTOR_DATA_TOGGLE$2 = '[data-bs-toggle=\"modal\"]';\n  const Default$6 = {\n    backdrop: true,\n    focus: true,\n    keyboard: true\n  };\n  const DefaultType$6 = {\n    backdrop: '(boolean|string)',\n    focus: 'boolean',\n    keyboard: 'boolean'\n  };\n\n  /**\n   * Class definition\n   */\n\n  class Modal extends BaseComponent {\n    constructor(element, config) {\n      super(element, config);\n      this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, this._element);\n      this._backdrop = this._initializeBackDrop();\n      this._focustrap = this._initializeFocusTrap();\n      this._isShown = false;\n      this._isTransitioning = false;\n      this._scrollBar = new ScrollBarHelper();\n      this._addEventListeners();\n    }\n\n    // Getters\n    static get Default() {\n      return Default$6;\n    }\n    static get DefaultType() {\n      return DefaultType$6;\n    }\n    static get NAME() {\n      return NAME$7;\n    }\n\n    // Public\n    toggle(relatedTarget) {\n      return this._isShown ? this.hide() : this.show(relatedTarget);\n    }\n    show(relatedTarget) {\n      if (this._isShown || this._isTransitioning) {\n        return;\n      }\n      const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$4, {\n        relatedTarget\n      });\n      if (showEvent.defaultPrevented) {\n        return;\n      }\n      this._isShown = true;\n      this._isTransitioning = true;\n      this._scrollBar.hide();\n      document.body.classList.add(CLASS_NAME_OPEN);\n      this._adjustDialog();\n      this._backdrop.show(() => this._showElement(relatedTarget));\n    }\n    hide() {\n      if (!this._isShown || this._isTransitioning) {\n        return;\n      }\n      const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$4);\n      if (hideEvent.defaultPrevented) {\n        return;\n      }\n      this._isShown = false;\n      this._isTransitioning = true;\n      this._focustrap.deactivate();\n      this._element.classList.remove(CLASS_NAME_SHOW$4);\n      this._queueCallback(() => this._hideModal(), this._element, this._isAnimated());\n    }\n    dispose() {\n      EventHandler.off(window, EVENT_KEY$4);\n      EventHandler.off(this._dialog, EVENT_KEY$4);\n      this._backdrop.dispose();\n      this._focustrap.deactivate();\n      super.dispose();\n    }\n    handleUpdate() {\n      this._adjustDialog();\n    }\n\n    // Private\n    _initializeBackDrop() {\n      return new Backdrop({\n        isVisible: Boolean(this._config.backdrop),\n        // 'static' option will be translated to true, and booleans will keep their value,\n        isAnimated: this._isAnimated()\n      });\n    }\n    _initializeFocusTrap() {\n      return new FocusTrap({\n        trapElement: this._element\n      });\n    }\n    _showElement(relatedTarget) {\n      // try to append dynamic modal\n      if (!document.body.contains(this._element)) {\n        document.body.append(this._element);\n      }\n      this._element.style.display = 'block';\n      this._element.removeAttribute('aria-hidden');\n      this._element.setAttribute('aria-modal', true);\n      this._element.setAttribute('role', 'dialog');\n      this._element.scrollTop = 0;\n      const modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog);\n      if (modalBody) {\n        modalBody.scrollTop = 0;\n      }\n      reflow(this._element);\n      this._element.classList.add(CLASS_NAME_SHOW$4);\n      const transitionComplete = () => {\n        if (this._config.focus) {\n          this._focustrap.activate();\n        }\n        this._isTransitioning = false;\n        EventHandler.trigger(this._element, EVENT_SHOWN$4, {\n          relatedTarget\n        });\n      };\n      this._queueCallback(transitionComplete, this._dialog, this._isAnimated());\n    }\n    _addEventListeners() {\n      EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS$1, event => {\n        if (event.key !== ESCAPE_KEY$1) {\n          return;\n        }\n        if (this._config.keyboard) {\n          this.hide();\n          return;\n        }\n        this._triggerBackdropTransition();\n      });\n      EventHandler.on(window, EVENT_RESIZE$1, () => {\n        if (this._isShown && !this._isTransitioning) {\n          this._adjustDialog();\n        }\n      });\n      EventHandler.on(this._element, EVENT_MOUSEDOWN_DISMISS, event => {\n        // a bad trick to segregate clicks that may start inside dialog but end outside, and avoid listen to scrollbar clicks\n        EventHandler.one(this._element, EVENT_CLICK_DISMISS, event2 => {\n          if (this._element !== event.target || this._element !== event2.target) {\n            return;\n          }\n          if (this._config.backdrop === 'static') {\n            this._triggerBackdropTransition();\n            return;\n          }\n          if (this._config.backdrop) {\n            this.hide();\n          }\n        });\n      });\n    }\n    _hideModal() {\n      this._element.style.display = 'none';\n      this._element.setAttribute('aria-hidden', true);\n      this._element.removeAttribute('aria-modal');\n      this._element.removeAttribute('role');\n      this._isTransitioning = false;\n      this._backdrop.hide(() => {\n        document.body.classList.remove(CLASS_NAME_OPEN);\n        this._resetAdjustments();\n        this._scrollBar.reset();\n        EventHandler.trigger(this._element, EVENT_HIDDEN$4);\n      });\n    }\n    _isAnimated() {\n      return this._element.classList.contains(CLASS_NAME_FADE$3);\n    }\n    _triggerBackdropTransition() {\n      const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED$1);\n      if (hideEvent.defaultPrevented) {\n        return;\n      }\n      const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;\n      const initialOverflowY = this._element.style.overflowY;\n      // return if the following background transition hasn't yet completed\n      if (initialOverflowY === 'hidden' || this._element.classList.contains(CLASS_NAME_STATIC)) {\n        return;\n      }\n      if (!isModalOverflowing) {\n        this._element.style.overflowY = 'hidden';\n      }\n      this._element.classList.add(CLASS_NAME_STATIC);\n      this._queueCallback(() => {\n        this._element.classList.remove(CLASS_NAME_STATIC);\n        this._queueCallback(() => {\n          this._element.style.overflowY = initialOverflowY;\n        }, this._dialog);\n      }, this._dialog);\n      this._element.focus();\n    }\n\n    /**\n     * The following methods are used to handle overflowing modals\n     */\n\n    _adjustDialog() {\n      const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;\n      const scrollbarWidth = this._scrollBar.getWidth();\n      const isBodyOverflowing = scrollbarWidth > 0;\n      if (isBodyOverflowing && !isModalOverflowing) {\n        const property = isRTL() ? 'paddingLeft' : 'paddingRight';\n        this._element.style[property] = `${scrollbarWidth}px`;\n      }\n      if (!isBodyOverflowing && isModalOverflowing) {\n        const property = isRTL() ? 'paddingRight' : 'paddingLeft';\n        this._element.style[property] = `${scrollbarWidth}px`;\n      }\n    }\n    _resetAdjustments() {\n      this._element.style.paddingLeft = '';\n      this._element.style.paddingRight = '';\n    }\n\n    // Static\n    static jQueryInterface(config, relatedTarget) {\n      return this.each(function () {\n        const data = Modal.getOrCreateInstance(this, config);\n        if (typeof config !== 'string') {\n          return;\n        }\n        if (typeof data[config] === 'undefined') {\n          throw new TypeError(`No method named \"${config}\"`);\n        }\n        data[config](relatedTarget);\n      });\n    }\n  }\n\n  /**\n   * Data API implementation\n   */\n\n  EventHandler.on(document, EVENT_CLICK_DATA_API$2, SELECTOR_DATA_TOGGLE$2, function (event) {\n    const target = SelectorEngine.getElementFromSelector(this);\n    if (['A', 'AREA'].includes(this.tagName)) {\n      event.preventDefault();\n    }\n    EventHandler.one(target, EVENT_SHOW$4, showEvent => {\n      if (showEvent.defaultPrevented) {\n        // only register focus restorer if modal will actually get shown\n        return;\n      }\n      EventHandler.one(target, EVENT_HIDDEN$4, () => {\n        if (isVisible(this)) {\n          this.focus();\n        }\n      });\n    });\n\n    // avoid conflict when clicking modal toggler while another one is open\n    const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR$1);\n    if (alreadyOpen) {\n      Modal.getInstance(alreadyOpen).hide();\n    }\n    const data = Modal.getOrCreateInstance(target);\n    data.toggle(this);\n  });\n  enableDismissTrigger(Modal);\n\n  /**\n   * jQuery\n   */\n\n  defineJQueryPlugin(Modal);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap offcanvas.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n\n  /**\n   * Constants\n   */\n\n  const NAME$6 = 'offcanvas';\n  const DATA_KEY$3 = 'bs.offcanvas';\n  const EVENT_KEY$3 = `.${DATA_KEY$3}`;\n  const DATA_API_KEY$1 = '.data-api';\n  const EVENT_LOAD_DATA_API$2 = `load${EVENT_KEY$3}${DATA_API_KEY$1}`;\n  const ESCAPE_KEY = 'Escape';\n  const CLASS_NAME_SHOW$3 = 'show';\n  const CLASS_NAME_SHOWING$1 = 'showing';\n  const CLASS_NAME_HIDING = 'hiding';\n  const CLASS_NAME_BACKDROP = 'offcanvas-backdrop';\n  const OPEN_SELECTOR = '.offcanvas.show';\n  const EVENT_SHOW$3 = `show${EVENT_KEY$3}`;\n  const EVENT_SHOWN$3 = `shown${EVENT_KEY$3}`;\n  const EVENT_HIDE$3 = `hide${EVENT_KEY$3}`;\n  const EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY$3}`;\n  const EVENT_HIDDEN$3 = `hidden${EVENT_KEY$3}`;\n  const EVENT_RESIZE = `resize${EVENT_KEY$3}`;\n  const EVENT_CLICK_DATA_API$1 = `click${EVENT_KEY$3}${DATA_API_KEY$1}`;\n  const EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY$3}`;\n  const SELECTOR_DATA_TOGGLE$1 = '[data-bs-toggle=\"offcanvas\"]';\n  const Default$5 = {\n    backdrop: true,\n    keyboard: true,\n    scroll: false\n  };\n  const DefaultType$5 = {\n    backdrop: '(boolean|string)',\n    keyboard: 'boolean',\n    scroll: 'boolean'\n  };\n\n  /**\n   * Class definition\n   */\n\n  class Offcanvas extends BaseComponent {\n    constructor(element, config) {\n      super(element, config);\n      this._isShown = false;\n      this._backdrop = this._initializeBackDrop();\n      this._focustrap = this._initializeFocusTrap();\n      this._addEventListeners();\n    }\n\n    // Getters\n    static get Default() {\n      return Default$5;\n    }\n    static get DefaultType() {\n      return DefaultType$5;\n    }\n    static get NAME() {\n      return NAME$6;\n    }\n\n    // Public\n    toggle(relatedTarget) {\n      return this._isShown ? this.hide() : this.show(relatedTarget);\n    }\n    show(relatedTarget) {\n      if (this._isShown) {\n        return;\n      }\n      const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$3, {\n        relatedTarget\n      });\n      if (showEvent.defaultPrevented) {\n        return;\n      }\n      this._isShown = true;\n      this._backdrop.show();\n      if (!this._config.scroll) {\n        new ScrollBarHelper().hide();\n      }\n      this._element.setAttribute('aria-modal', true);\n      this._element.setAttribute('role', 'dialog');\n      this._element.classList.add(CLASS_NAME_SHOWING$1);\n      const completeCallBack = () => {\n        if (!this._config.scroll || this._config.backdrop) {\n          this._focustrap.activate();\n        }\n        this._element.classList.add(CLASS_NAME_SHOW$3);\n        this._element.classList.remove(CLASS_NAME_SHOWING$1);\n        EventHandler.trigger(this._element, EVENT_SHOWN$3, {\n          relatedTarget\n        });\n      };\n      this._queueCallback(completeCallBack, this._element, true);\n    }\n    hide() {\n      if (!this._isShown) {\n        return;\n      }\n      const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$3);\n      if (hideEvent.defaultPrevented) {\n        return;\n      }\n      this._focustrap.deactivate();\n      this._element.blur();\n      this._isShown = false;\n      this._element.classList.add(CLASS_NAME_HIDING);\n      this._backdrop.hide();\n      const completeCallback = () => {\n        this._element.classList.remove(CLASS_NAME_SHOW$3, CLASS_NAME_HIDING);\n        this._element.removeAttribute('aria-modal');\n        this._element.removeAttribute('role');\n        if (!this._config.scroll) {\n          new ScrollBarHelper().reset();\n        }\n        EventHandler.trigger(this._element, EVENT_HIDDEN$3);\n      };\n      this._queueCallback(completeCallback, this._element, true);\n    }\n    dispose() {\n      this._backdrop.dispose();\n      this._focustrap.deactivate();\n      super.dispose();\n    }\n\n    // Private\n    _initializeBackDrop() {\n      const clickCallback = () => {\n        if (this._config.backdrop === 'static') {\n          EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED);\n          return;\n        }\n        this.hide();\n      };\n\n      // 'static' option will be translated to true, and booleans will keep their value\n      const isVisible = Boolean(this._config.backdrop);\n      return new Backdrop({\n        className: CLASS_NAME_BACKDROP,\n        isVisible,\n        isAnimated: true,\n        rootElement: this._element.parentNode,\n        clickCallback: isVisible ? clickCallback : null\n      });\n    }\n    _initializeFocusTrap() {\n      return new FocusTrap({\n        trapElement: this._element\n      });\n    }\n    _addEventListeners() {\n      EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {\n        if (event.key !== ESCAPE_KEY) {\n          return;\n        }\n        if (this._config.keyboard) {\n          this.hide();\n          return;\n        }\n        EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED);\n      });\n    }\n\n    // Static\n    static jQueryInterface(config) {\n      return this.each(function () {\n        const data = Offcanvas.getOrCreateInstance(this, config);\n        if (typeof config !== 'string') {\n          return;\n        }\n        if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n          throw new TypeError(`No method named \"${config}\"`);\n        }\n        data[config](this);\n      });\n    }\n  }\n\n  /**\n   * Data API implementation\n   */\n\n  EventHandler.on(document, EVENT_CLICK_DATA_API$1, SELECTOR_DATA_TOGGLE$1, function (event) {\n    const target = SelectorEngine.getElementFromSelector(this);\n    if (['A', 'AREA'].includes(this.tagName)) {\n      event.preventDefault();\n    }\n    if (isDisabled(this)) {\n      return;\n    }\n    EventHandler.one(target, EVENT_HIDDEN$3, () => {\n      // focus on trigger when it is closed\n      if (isVisible(this)) {\n        this.focus();\n      }\n    });\n\n    // avoid conflict when clicking a toggler of an offcanvas, while another is open\n    const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR);\n    if (alreadyOpen && alreadyOpen !== target) {\n      Offcanvas.getInstance(alreadyOpen).hide();\n    }\n    const data = Offcanvas.getOrCreateInstance(target);\n    data.toggle(this);\n  });\n  EventHandler.on(window, EVENT_LOAD_DATA_API$2, () => {\n    for (const selector of SelectorEngine.find(OPEN_SELECTOR)) {\n      Offcanvas.getOrCreateInstance(selector).show();\n    }\n  });\n  EventHandler.on(window, EVENT_RESIZE, () => {\n    for (const element of SelectorEngine.find('[aria-modal][class*=show][class*=offcanvas-]')) {\n      if (getComputedStyle(element).position !== 'fixed') {\n        Offcanvas.getOrCreateInstance(element).hide();\n      }\n    }\n  });\n  enableDismissTrigger(Offcanvas);\n\n  /**\n   * jQuery\n   */\n\n  defineJQueryPlugin(Offcanvas);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap util/sanitizer.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n  // js-docs-start allow-list\n  const ARIA_ATTRIBUTE_PATTERN = /^aria-[\\w-]*$/i;\n  const DefaultAllowlist = {\n    // Global attributes allowed on any supplied element below.\n    '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\n    a: ['target', 'href', 'title', 'rel'],\n    area: [],\n    b: [],\n    br: [],\n    col: [],\n    code: [],\n    dd: [],\n    div: [],\n    dl: [],\n    dt: [],\n    em: [],\n    hr: [],\n    h1: [],\n    h2: [],\n    h3: [],\n    h4: [],\n    h5: [],\n    h6: [],\n    i: [],\n    img: ['src', 'srcset', 'alt', 'title', 'width', 'height'],\n    li: [],\n    ol: [],\n    p: [],\n    pre: [],\n    s: [],\n    small: [],\n    span: [],\n    sub: [],\n    sup: [],\n    strong: [],\n    u: [],\n    ul: []\n  };\n  // js-docs-end allow-list\n\n  const uriAttributes = new Set(['background', 'cite', 'href', 'itemtype', 'longdesc', 'poster', 'src', 'xlink:href']);\n\n  /**\n   * A pattern that recognizes URLs that are safe wrt. XSS in URL navigation\n   * contexts.\n   *\n   * Shout-out to Angular https://github.com/angular/angular/blob/15.2.8/packages/core/src/sanitization/url_sanitizer.ts#L38\n   */\n  const SAFE_URL_PATTERN = /^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i;\n  const allowedAttribute = (attribute, allowedAttributeList) => {\n    const attributeName = attribute.nodeName.toLowerCase();\n    if (allowedAttributeList.includes(attributeName)) {\n      if (uriAttributes.has(attributeName)) {\n        return Boolean(SAFE_URL_PATTERN.test(attribute.nodeValue));\n      }\n      return true;\n    }\n\n    // Check if a regular expression validates the attribute.\n    return allowedAttributeList.filter(attributeRegex => attributeRegex instanceof RegExp).some(regex => regex.test(attributeName));\n  };\n  function sanitizeHtml(unsafeHtml, allowList, sanitizeFunction) {\n    if (!unsafeHtml.length) {\n      return unsafeHtml;\n    }\n    if (sanitizeFunction && typeof sanitizeFunction === 'function') {\n      return sanitizeFunction(unsafeHtml);\n    }\n    const domParser = new window.DOMParser();\n    const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html');\n    const elements = [].concat(...createdDocument.body.querySelectorAll('*'));\n    for (const element of elements) {\n      const elementName = element.nodeName.toLowerCase();\n      if (!Object.keys(allowList).includes(elementName)) {\n        element.remove();\n        continue;\n      }\n      const attributeList = [].concat(...element.attributes);\n      const allowedAttributes = [].concat(allowList['*'] || [], allowList[elementName] || []);\n      for (const attribute of attributeList) {\n        if (!allowedAttribute(attribute, allowedAttributes)) {\n          element.removeAttribute(attribute.nodeName);\n        }\n      }\n    }\n    return createdDocument.body.innerHTML;\n  }\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap util/template-factory.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n\n  /**\n   * Constants\n   */\n\n  const NAME$5 = 'TemplateFactory';\n  const Default$4 = {\n    allowList: DefaultAllowlist,\n    content: {},\n    // { selector : text ,  selector2 : text2 , }\n    extraClass: '',\n    html: false,\n    sanitize: true,\n    sanitizeFn: null,\n    template: '<div></div>'\n  };\n  const DefaultType$4 = {\n    allowList: 'object',\n    content: 'object',\n    extraClass: '(string|function)',\n    html: 'boolean',\n    sanitize: 'boolean',\n    sanitizeFn: '(null|function)',\n    template: 'string'\n  };\n  const DefaultContentType = {\n    entry: '(string|element|function|null)',\n    selector: '(string|element)'\n  };\n\n  /**\n   * Class definition\n   */\n\n  class TemplateFactory extends Config {\n    constructor(config) {\n      super();\n      this._config = this._getConfig(config);\n    }\n\n    // Getters\n    static get Default() {\n      return Default$4;\n    }\n    static get DefaultType() {\n      return DefaultType$4;\n    }\n    static get NAME() {\n      return NAME$5;\n    }\n\n    // Public\n    getContent() {\n      return Object.values(this._config.content).map(config => this._resolvePossibleFunction(config)).filter(Boolean);\n    }\n    hasContent() {\n      return this.getContent().length > 0;\n    }\n    changeContent(content) {\n      this._checkContent(content);\n      this._config.content = {\n        ...this._config.content,\n        ...content\n      };\n      return this;\n    }\n    toHtml() {\n      const templateWrapper = document.createElement('div');\n      templateWrapper.innerHTML = this._maybeSanitize(this._config.template);\n      for (const [selector, text] of Object.entries(this._config.content)) {\n        this._setContent(templateWrapper, text, selector);\n      }\n      const template = templateWrapper.children[0];\n      const extraClass = this._resolvePossibleFunction(this._config.extraClass);\n      if (extraClass) {\n        template.classList.add(...extraClass.split(' '));\n      }\n      return template;\n    }\n\n    // Private\n    _typeCheckConfig(config) {\n      super._typeCheckConfig(config);\n      this._checkContent(config.content);\n    }\n    _checkContent(arg) {\n      for (const [selector, content] of Object.entries(arg)) {\n        super._typeCheckConfig({\n          selector,\n          entry: content\n        }, DefaultContentType);\n      }\n    }\n    _setContent(template, content, selector) {\n      const templateElement = SelectorEngine.findOne(selector, template);\n      if (!templateElement) {\n        return;\n      }\n      content = this._resolvePossibleFunction(content);\n      if (!content) {\n        templateElement.remove();\n        return;\n      }\n      if (isElement(content)) {\n        this._putElementInTemplate(getElement(content), templateElement);\n        return;\n      }\n      if (this._config.html) {\n        templateElement.innerHTML = this._maybeSanitize(content);\n        return;\n      }\n      templateElement.textContent = content;\n    }\n    _maybeSanitize(arg) {\n      return this._config.sanitize ? sanitizeHtml(arg, this._config.allowList, this._config.sanitizeFn) : arg;\n    }\n    _resolvePossibleFunction(arg) {\n      return execute(arg, [undefined, this]);\n    }\n    _putElementInTemplate(element, templateElement) {\n      if (this._config.html) {\n        templateElement.innerHTML = '';\n        templateElement.append(element);\n        return;\n      }\n      templateElement.textContent = element.textContent;\n    }\n  }\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap tooltip.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n\n  /**\n   * Constants\n   */\n\n  const NAME$4 = 'tooltip';\n  const DISALLOWED_ATTRIBUTES = new Set(['sanitize', 'allowList', 'sanitizeFn']);\n  const CLASS_NAME_FADE$2 = 'fade';\n  const CLASS_NAME_MODAL = 'modal';\n  const CLASS_NAME_SHOW$2 = 'show';\n  const SELECTOR_TOOLTIP_INNER = '.tooltip-inner';\n  const SELECTOR_MODAL = `.${CLASS_NAME_MODAL}`;\n  const EVENT_MODAL_HIDE = 'hide.bs.modal';\n  const TRIGGER_HOVER = 'hover';\n  const TRIGGER_FOCUS = 'focus';\n  const TRIGGER_CLICK = 'click';\n  const TRIGGER_MANUAL = 'manual';\n  const EVENT_HIDE$2 = 'hide';\n  const EVENT_HIDDEN$2 = 'hidden';\n  const EVENT_SHOW$2 = 'show';\n  const EVENT_SHOWN$2 = 'shown';\n  const EVENT_INSERTED = 'inserted';\n  const EVENT_CLICK$1 = 'click';\n  const EVENT_FOCUSIN$1 = 'focusin';\n  const EVENT_FOCUSOUT$1 = 'focusout';\n  const EVENT_MOUSEENTER = 'mouseenter';\n  const EVENT_MOUSELEAVE = 'mouseleave';\n  const AttachmentMap = {\n    AUTO: 'auto',\n    TOP: 'top',\n    RIGHT: isRTL() ? 'left' : 'right',\n    BOTTOM: 'bottom',\n    LEFT: isRTL() ? 'right' : 'left'\n  };\n  const Default$3 = {\n    allowList: DefaultAllowlist,\n    animation: true,\n    boundary: 'clippingParents',\n    container: false,\n    customClass: '',\n    delay: 0,\n    fallbackPlacements: ['top', 'right', 'bottom', 'left'],\n    html: false,\n    offset: [0, 6],\n    placement: 'top',\n    popperConfig: null,\n    sanitize: true,\n    sanitizeFn: null,\n    selector: false,\n    template: '<div class=\"tooltip\" role=\"tooltip\">' + '<div class=\"tooltip-arrow\"></div>' + '<div class=\"tooltip-inner\"></div>' + '</div>',\n    title: '',\n    trigger: 'hover focus'\n  };\n  const DefaultType$3 = {\n    allowList: 'object',\n    animation: 'boolean',\n    boundary: '(string|element)',\n    container: '(string|element|boolean)',\n    customClass: '(string|function)',\n    delay: '(number|object)',\n    fallbackPlacements: 'array',\n    html: 'boolean',\n    offset: '(array|string|function)',\n    placement: '(string|function)',\n    popperConfig: '(null|object|function)',\n    sanitize: 'boolean',\n    sanitizeFn: '(null|function)',\n    selector: '(string|boolean)',\n    template: 'string',\n    title: '(string|element|function)',\n    trigger: 'string'\n  };\n\n  /**\n   * Class definition\n   */\n\n  class Tooltip extends BaseComponent {\n    constructor(element, config) {\n      if (typeof Popper__namespace === 'undefined') {\n        throw new TypeError('Bootstrap\\'s tooltips require Popper (https://popper.js.org/docs/v2/)');\n      }\n      super(element, config);\n\n      // Private\n      this._isEnabled = true;\n      this._timeout = 0;\n      this._isHovered = null;\n      this._activeTrigger = {};\n      this._popper = null;\n      this._templateFactory = null;\n      this._newContent = null;\n\n      // Protected\n      this.tip = null;\n      this._setListeners();\n      if (!this._config.selector) {\n        this._fixTitle();\n      }\n    }\n\n    // Getters\n    static get Default() {\n      return Default$3;\n    }\n    static get DefaultType() {\n      return DefaultType$3;\n    }\n    static get NAME() {\n      return NAME$4;\n    }\n\n    // Public\n    enable() {\n      this._isEnabled = true;\n    }\n    disable() {\n      this._isEnabled = false;\n    }\n    toggleEnabled() {\n      this._isEnabled = !this._isEnabled;\n    }\n    toggle() {\n      if (!this._isEnabled) {\n        return;\n      }\n      if (this._isShown()) {\n        this._leave();\n        return;\n      }\n      this._enter();\n    }\n    dispose() {\n      clearTimeout(this._timeout);\n      EventHandler.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);\n      if (this._element.getAttribute('data-bs-original-title')) {\n        this._element.setAttribute('title', this._element.getAttribute('data-bs-original-title'));\n      }\n      this._disposePopper();\n      super.dispose();\n    }\n    show() {\n      if (this._element.style.display === 'none') {\n        throw new Error('Please use show on visible elements');\n      }\n      if (!(this._isWithContent() && this._isEnabled)) {\n        return;\n      }\n      const showEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOW$2));\n      const shadowRoot = findShadowRoot(this._element);\n      const isInTheDom = (shadowRoot || this._element.ownerDocument.documentElement).contains(this._element);\n      if (showEvent.defaultPrevented || !isInTheDom) {\n        return;\n      }\n\n      // TODO: v6 remove this or make it optional\n      this._disposePopper();\n      const tip = this._getTipElement();\n      this._element.setAttribute('aria-describedby', tip.getAttribute('id'));\n      const {\n        container\n      } = this._config;\n      if (!this._element.ownerDocument.documentElement.contains(this.tip)) {\n        container.append(tip);\n        EventHandler.trigger(this._element, this.constructor.eventName(EVENT_INSERTED));\n      }\n      this._popper = this._createPopper(tip);\n      tip.classList.add(CLASS_NAME_SHOW$2);\n\n      // If this is a touch-enabled device we add extra\n      // empty mouseover listeners to the body's immediate children;\n      // only needed because of broken event delegation on iOS\n      // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n      if ('ontouchstart' in document.documentElement) {\n        for (const element of [].concat(...document.body.children)) {\n          EventHandler.on(element, 'mouseover', noop);\n        }\n      }\n      const complete = () => {\n        EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOWN$2));\n        if (this._isHovered === false) {\n          this._leave();\n        }\n        this._isHovered = false;\n      };\n      this._queueCallback(complete, this.tip, this._isAnimated());\n    }\n    hide() {\n      if (!this._isShown()) {\n        return;\n      }\n      const hideEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDE$2));\n      if (hideEvent.defaultPrevented) {\n        return;\n      }\n      const tip = this._getTipElement();\n      tip.classList.remove(CLASS_NAME_SHOW$2);\n\n      // If this is a touch-enabled device we remove the extra\n      // empty mouseover listeners we added for iOS support\n      if ('ontouchstart' in document.documentElement) {\n        for (const element of [].concat(...document.body.children)) {\n          EventHandler.off(element, 'mouseover', noop);\n        }\n      }\n      this._activeTrigger[TRIGGER_CLICK] = false;\n      this._activeTrigger[TRIGGER_FOCUS] = false;\n      this._activeTrigger[TRIGGER_HOVER] = false;\n      this._isHovered = null; // it is a trick to support manual triggering\n\n      const complete = () => {\n        if (this._isWithActiveTrigger()) {\n          return;\n        }\n        if (!this._isHovered) {\n          this._disposePopper();\n        }\n        this._element.removeAttribute('aria-describedby');\n        EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDDEN$2));\n      };\n      this._queueCallback(complete, this.tip, this._isAnimated());\n    }\n    update() {\n      if (this._popper) {\n        this._popper.update();\n      }\n    }\n\n    // Protected\n    _isWithContent() {\n      return Boolean(this._getTitle());\n    }\n    _getTipElement() {\n      if (!this.tip) {\n        this.tip = this._createTipElement(this._newContent || this._getContentForTemplate());\n      }\n      return this.tip;\n    }\n    _createTipElement(content) {\n      const tip = this._getTemplateFactory(content).toHtml();\n\n      // TODO: remove this check in v6\n      if (!tip) {\n        return null;\n      }\n      tip.classList.remove(CLASS_NAME_FADE$2, CLASS_NAME_SHOW$2);\n      // TODO: v6 the following can be achieved with CSS only\n      tip.classList.add(`bs-${this.constructor.NAME}-auto`);\n      const tipId = getUID(this.constructor.NAME).toString();\n      tip.setAttribute('id', tipId);\n      if (this._isAnimated()) {\n        tip.classList.add(CLASS_NAME_FADE$2);\n      }\n      return tip;\n    }\n    setContent(content) {\n      this._newContent = content;\n      if (this._isShown()) {\n        this._disposePopper();\n        this.show();\n      }\n    }\n    _getTemplateFactory(content) {\n      if (this._templateFactory) {\n        this._templateFactory.changeContent(content);\n      } else {\n        this._templateFactory = new TemplateFactory({\n          ...this._config,\n          // the `content` var has to be after `this._config`\n          // to override config.content in case of popover\n          content,\n          extraClass: this._resolvePossibleFunction(this._config.customClass)\n        });\n      }\n      return this._templateFactory;\n    }\n    _getContentForTemplate() {\n      return {\n        [SELECTOR_TOOLTIP_INNER]: this._getTitle()\n      };\n    }\n    _getTitle() {\n      return this._resolvePossibleFunction(this._config.title) || this._element.getAttribute('data-bs-original-title');\n    }\n\n    // Private\n    _initializeOnDelegatedTarget(event) {\n      return this.constructor.getOrCreateInstance(event.delegateTarget, this._getDelegateConfig());\n    }\n    _isAnimated() {\n      return this._config.animation || this.tip && this.tip.classList.contains(CLASS_NAME_FADE$2);\n    }\n    _isShown() {\n      return this.tip && this.tip.classList.contains(CLASS_NAME_SHOW$2);\n    }\n    _createPopper(tip) {\n      const placement = execute(this._config.placement, [this, tip, this._element]);\n      const attachment = AttachmentMap[placement.toUpperCase()];\n      return Popper__namespace.createPopper(this._element, tip, this._getPopperConfig(attachment));\n    }\n    _getOffset() {\n      const {\n        offset\n      } = this._config;\n      if (typeof offset === 'string') {\n        return offset.split(',').map(value => Number.parseInt(value, 10));\n      }\n      if (typeof offset === 'function') {\n        return popperData => offset(popperData, this._element);\n      }\n      return offset;\n    }\n    _resolvePossibleFunction(arg) {\n      return execute(arg, [this._element, this._element]);\n    }\n    _getPopperConfig(attachment) {\n      const defaultBsPopperConfig = {\n        placement: attachment,\n        modifiers: [{\n          name: 'flip',\n          options: {\n            fallbackPlacements: this._config.fallbackPlacements\n          }\n        }, {\n          name: 'offset',\n          options: {\n            offset: this._getOffset()\n          }\n        }, {\n          name: 'preventOverflow',\n          options: {\n            boundary: this._config.boundary\n          }\n        }, {\n          name: 'arrow',\n          options: {\n            element: `.${this.constructor.NAME}-arrow`\n          }\n        }, {\n          name: 'preSetPlacement',\n          enabled: true,\n          phase: 'beforeMain',\n          fn: data => {\n            // Pre-set Popper's placement attribute in order to read the arrow sizes properly.\n            // Otherwise, Popper mixes up the width and height dimensions since the initial arrow style is for top placement\n            this._getTipElement().setAttribute('data-popper-placement', data.state.placement);\n          }\n        }]\n      };\n      return {\n        ...defaultBsPopperConfig,\n        ...execute(this._config.popperConfig, [undefined, defaultBsPopperConfig])\n      };\n    }\n    _setListeners() {\n      const triggers = this._config.trigger.split(' ');\n      for (const trigger of triggers) {\n        if (trigger === 'click') {\n          EventHandler.on(this._element, this.constructor.eventName(EVENT_CLICK$1), this._config.selector, event => {\n            const context = this._initializeOnDelegatedTarget(event);\n            context._activeTrigger[TRIGGER_CLICK] = !(context._isShown() && context._activeTrigger[TRIGGER_CLICK]);\n            context.toggle();\n          });\n        } else if (trigger !== TRIGGER_MANUAL) {\n          const eventIn = trigger === TRIGGER_HOVER ? this.constructor.eventName(EVENT_MOUSEENTER) : this.constructor.eventName(EVENT_FOCUSIN$1);\n          const eventOut = trigger === TRIGGER_HOVER ? this.constructor.eventName(EVENT_MOUSELEAVE) : this.constructor.eventName(EVENT_FOCUSOUT$1);\n          EventHandler.on(this._element, eventIn, this._config.selector, event => {\n            const context = this._initializeOnDelegatedTarget(event);\n            context._activeTrigger[event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER] = true;\n            context._enter();\n          });\n          EventHandler.on(this._element, eventOut, this._config.selector, event => {\n            const context = this._initializeOnDelegatedTarget(event);\n            context._activeTrigger[event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER] = context._element.contains(event.relatedTarget);\n            context._leave();\n          });\n        }\n      }\n      this._hideModalHandler = () => {\n        if (this._element) {\n          this.hide();\n        }\n      };\n      EventHandler.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);\n    }\n    _fixTitle() {\n      const title = this._element.getAttribute('title');\n      if (!title) {\n        return;\n      }\n      if (!this._element.getAttribute('aria-label') && !this._element.textContent.trim()) {\n        this._element.setAttribute('aria-label', title);\n      }\n      this._element.setAttribute('data-bs-original-title', title); // DO NOT USE IT. Is only for backwards compatibility\n      this._element.removeAttribute('title');\n    }\n    _enter() {\n      if (this._isShown() || this._isHovered) {\n        this._isHovered = true;\n        return;\n      }\n      this._isHovered = true;\n      this._setTimeout(() => {\n        if (this._isHovered) {\n          this.show();\n        }\n      }, this._config.delay.show);\n    }\n    _leave() {\n      if (this._isWithActiveTrigger()) {\n        return;\n      }\n      this._isHovered = false;\n      this._setTimeout(() => {\n        if (!this._isHovered) {\n          this.hide();\n        }\n      }, this._config.delay.hide);\n    }\n    _setTimeout(handler, timeout) {\n      clearTimeout(this._timeout);\n      this._timeout = setTimeout(handler, timeout);\n    }\n    _isWithActiveTrigger() {\n      return Object.values(this._activeTrigger).includes(true);\n    }\n    _getConfig(config) {\n      const dataAttributes = Manipulator.getDataAttributes(this._element);\n      for (const dataAttribute of Object.keys(dataAttributes)) {\n        if (DISALLOWED_ATTRIBUTES.has(dataAttribute)) {\n          delete dataAttributes[dataAttribute];\n        }\n      }\n      config = {\n        ...dataAttributes,\n        ...(typeof config === 'object' && config ? config : {})\n      };\n      config = this._mergeConfigObj(config);\n      config = this._configAfterMerge(config);\n      this._typeCheckConfig(config);\n      return config;\n    }\n    _configAfterMerge(config) {\n      config.container = config.container === false ? document.body : getElement(config.container);\n      if (typeof config.delay === 'number') {\n        config.delay = {\n          show: config.delay,\n          hide: config.delay\n        };\n      }\n      if (typeof config.title === 'number') {\n        config.title = config.title.toString();\n      }\n      if (typeof config.content === 'number') {\n        config.content = config.content.toString();\n      }\n      return config;\n    }\n    _getDelegateConfig() {\n      const config = {};\n      for (const [key, value] of Object.entries(this._config)) {\n        if (this.constructor.Default[key] !== value) {\n          config[key] = value;\n        }\n      }\n      config.selector = false;\n      config.trigger = 'manual';\n\n      // In the future can be replaced with:\n      // const keysWithDifferentValues = Object.entries(this._config).filter(entry => this.constructor.Default[entry[0]] !== this._config[entry[0]])\n      // `Object.fromEntries(keysWithDifferentValues)`\n      return config;\n    }\n    _disposePopper() {\n      if (this._popper) {\n        this._popper.destroy();\n        this._popper = null;\n      }\n      if (this.tip) {\n        this.tip.remove();\n        this.tip = null;\n      }\n    }\n\n    // Static\n    static jQueryInterface(config) {\n      return this.each(function () {\n        const data = Tooltip.getOrCreateInstance(this, config);\n        if (typeof config !== 'string') {\n          return;\n        }\n        if (typeof data[config] === 'undefined') {\n          throw new TypeError(`No method named \"${config}\"`);\n        }\n        data[config]();\n      });\n    }\n  }\n\n  /**\n   * jQuery\n   */\n\n  defineJQueryPlugin(Tooltip);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap popover.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n\n  /**\n   * Constants\n   */\n\n  const NAME$3 = 'popover';\n  const SELECTOR_TITLE = '.popover-header';\n  const SELECTOR_CONTENT = '.popover-body';\n  const Default$2 = {\n    ...Tooltip.Default,\n    content: '',\n    offset: [0, 8],\n    placement: 'right',\n    template: '<div class=\"popover\" role=\"tooltip\">' + '<div class=\"popover-arrow\"></div>' + '<h3 class=\"popover-header\"></h3>' + '<div class=\"popover-body\"></div>' + '</div>',\n    trigger: 'click'\n  };\n  const DefaultType$2 = {\n    ...Tooltip.DefaultType,\n    content: '(null|string|element|function)'\n  };\n\n  /**\n   * Class definition\n   */\n\n  class Popover extends Tooltip {\n    // Getters\n    static get Default() {\n      return Default$2;\n    }\n    static get DefaultType() {\n      return DefaultType$2;\n    }\n    static get NAME() {\n      return NAME$3;\n    }\n\n    // Overrides\n    _isWithContent() {\n      return this._getTitle() || this._getContent();\n    }\n\n    // Private\n    _getContentForTemplate() {\n      return {\n        [SELECTOR_TITLE]: this._getTitle(),\n        [SELECTOR_CONTENT]: this._getContent()\n      };\n    }\n    _getContent() {\n      return this._resolvePossibleFunction(this._config.content);\n    }\n\n    // Static\n    static jQueryInterface(config) {\n      return this.each(function () {\n        const data = Popover.getOrCreateInstance(this, config);\n        if (typeof config !== 'string') {\n          return;\n        }\n        if (typeof data[config] === 'undefined') {\n          throw new TypeError(`No method named \"${config}\"`);\n        }\n        data[config]();\n      });\n    }\n  }\n\n  /**\n   * jQuery\n   */\n\n  defineJQueryPlugin(Popover);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap scrollspy.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n\n  /**\n   * Constants\n   */\n\n  const NAME$2 = 'scrollspy';\n  const DATA_KEY$2 = 'bs.scrollspy';\n  const EVENT_KEY$2 = `.${DATA_KEY$2}`;\n  const DATA_API_KEY = '.data-api';\n  const EVENT_ACTIVATE = `activate${EVENT_KEY$2}`;\n  const EVENT_CLICK = `click${EVENT_KEY$2}`;\n  const EVENT_LOAD_DATA_API$1 = `load${EVENT_KEY$2}${DATA_API_KEY}`;\n  const CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item';\n  const CLASS_NAME_ACTIVE$1 = 'active';\n  const SELECTOR_DATA_SPY = '[data-bs-spy=\"scroll\"]';\n  const SELECTOR_TARGET_LINKS = '[href]';\n  const SELECTOR_NAV_LIST_GROUP = '.nav, .list-group';\n  const SELECTOR_NAV_LINKS = '.nav-link';\n  const SELECTOR_NAV_ITEMS = '.nav-item';\n  const SELECTOR_LIST_ITEMS = '.list-group-item';\n  const SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_NAV_ITEMS} > ${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`;\n  const SELECTOR_DROPDOWN = '.dropdown';\n  const SELECTOR_DROPDOWN_TOGGLE$1 = '.dropdown-toggle';\n  const Default$1 = {\n    offset: null,\n    // TODO: v6 @deprecated, keep it for backwards compatibility reasons\n    rootMargin: '0px 0px -25%',\n    smoothScroll: false,\n    target: null,\n    threshold: [0.1, 0.5, 1]\n  };\n  const DefaultType$1 = {\n    offset: '(number|null)',\n    // TODO v6 @deprecated, keep it for backwards compatibility reasons\n    rootMargin: 'string',\n    smoothScroll: 'boolean',\n    target: 'element',\n    threshold: 'array'\n  };\n\n  /**\n   * Class definition\n   */\n\n  class ScrollSpy extends BaseComponent {\n    constructor(element, config) {\n      super(element, config);\n\n      // this._element is the observablesContainer and config.target the menu links wrapper\n      this._targetLinks = new Map();\n      this._observableSections = new Map();\n      this._rootElement = getComputedStyle(this._element).overflowY === 'visible' ? null : this._element;\n      this._activeTarget = null;\n      this._observer = null;\n      this._previousScrollData = {\n        visibleEntryTop: 0,\n        parentScrollTop: 0\n      };\n      this.refresh(); // initialize\n    }\n\n    // Getters\n    static get Default() {\n      return Default$1;\n    }\n    static get DefaultType() {\n      return DefaultType$1;\n    }\n    static get NAME() {\n      return NAME$2;\n    }\n\n    // Public\n    refresh() {\n      this._initializeTargetsAndObservables();\n      this._maybeEnableSmoothScroll();\n      if (this._observer) {\n        this._observer.disconnect();\n      } else {\n        this._observer = this._getNewObserver();\n      }\n      for (const section of this._observableSections.values()) {\n        this._observer.observe(section);\n      }\n    }\n    dispose() {\n      this._observer.disconnect();\n      super.dispose();\n    }\n\n    // Private\n    _configAfterMerge(config) {\n      // TODO: on v6 target should be given explicitly & remove the {target: 'ss-target'} case\n      config.target = getElement(config.target) || document.body;\n\n      // TODO: v6 Only for backwards compatibility reasons. Use rootMargin only\n      config.rootMargin = config.offset ? `${config.offset}px 0px -30%` : config.rootMargin;\n      if (typeof config.threshold === 'string') {\n        config.threshold = config.threshold.split(',').map(value => Number.parseFloat(value));\n      }\n      return config;\n    }\n    _maybeEnableSmoothScroll() {\n      if (!this._config.smoothScroll) {\n        return;\n      }\n\n      // unregister any previous listeners\n      EventHandler.off(this._config.target, EVENT_CLICK);\n      EventHandler.on(this._config.target, EVENT_CLICK, SELECTOR_TARGET_LINKS, event => {\n        const observableSection = this._observableSections.get(event.target.hash);\n        if (observableSection) {\n          event.preventDefault();\n          const root = this._rootElement || window;\n          const height = observableSection.offsetTop - this._element.offsetTop;\n          if (root.scrollTo) {\n            root.scrollTo({\n              top: height,\n              behavior: 'smooth'\n            });\n            return;\n          }\n\n          // Chrome 60 doesn't support `scrollTo`\n          root.scrollTop = height;\n        }\n      });\n    }\n    _getNewObserver() {\n      const options = {\n        root: this._rootElement,\n        threshold: this._config.threshold,\n        rootMargin: this._config.rootMargin\n      };\n      return new IntersectionObserver(entries => this._observerCallback(entries), options);\n    }\n\n    // The logic of selection\n    _observerCallback(entries) {\n      const targetElement = entry => this._targetLinks.get(`#${entry.target.id}`);\n      const activate = entry => {\n        this._previousScrollData.visibleEntryTop = entry.target.offsetTop;\n        this._process(targetElement(entry));\n      };\n      const parentScrollTop = (this._rootElement || document.documentElement).scrollTop;\n      const userScrollsDown = parentScrollTop >= this._previousScrollData.parentScrollTop;\n      this._previousScrollData.parentScrollTop = parentScrollTop;\n      for (const entry of entries) {\n        if (!entry.isIntersecting) {\n          this._activeTarget = null;\n          this._clearActiveClass(targetElement(entry));\n          continue;\n        }\n        const entryIsLowerThanPrevious = entry.target.offsetTop >= this._previousScrollData.visibleEntryTop;\n        // if we are scrolling down, pick the bigger offsetTop\n        if (userScrollsDown && entryIsLowerThanPrevious) {\n          activate(entry);\n          // if parent isn't scrolled, let's keep the first visible item, breaking the iteration\n          if (!parentScrollTop) {\n            return;\n          }\n          continue;\n        }\n\n        // if we are scrolling up, pick the smallest offsetTop\n        if (!userScrollsDown && !entryIsLowerThanPrevious) {\n          activate(entry);\n        }\n      }\n    }\n    _initializeTargetsAndObservables() {\n      this._targetLinks = new Map();\n      this._observableSections = new Map();\n      const targetLinks = SelectorEngine.find(SELECTOR_TARGET_LINKS, this._config.target);\n      for (const anchor of targetLinks) {\n        // ensure that the anchor has an id and is not disabled\n        if (!anchor.hash || isDisabled(anchor)) {\n          continue;\n        }\n        const observableSection = SelectorEngine.findOne(decodeURI(anchor.hash), this._element);\n\n        // ensure that the observableSection exists & is visible\n        if (isVisible(observableSection)) {\n          this._targetLinks.set(decodeURI(anchor.hash), anchor);\n          this._observableSections.set(anchor.hash, observableSection);\n        }\n      }\n    }\n    _process(target) {\n      if (this._activeTarget === target) {\n        return;\n      }\n      this._clearActiveClass(this._config.target);\n      this._activeTarget = target;\n      target.classList.add(CLASS_NAME_ACTIVE$1);\n      this._activateParents(target);\n      EventHandler.trigger(this._element, EVENT_ACTIVATE, {\n        relatedTarget: target\n      });\n    }\n    _activateParents(target) {\n      // Activate dropdown parents\n      if (target.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) {\n        SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE$1, target.closest(SELECTOR_DROPDOWN)).classList.add(CLASS_NAME_ACTIVE$1);\n        return;\n      }\n      for (const listGroup of SelectorEngine.parents(target, SELECTOR_NAV_LIST_GROUP)) {\n        // Set triggered links parents as active\n        // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor\n        for (const item of SelectorEngine.prev(listGroup, SELECTOR_LINK_ITEMS)) {\n          item.classList.add(CLASS_NAME_ACTIVE$1);\n        }\n      }\n    }\n    _clearActiveClass(parent) {\n      parent.classList.remove(CLASS_NAME_ACTIVE$1);\n      const activeNodes = SelectorEngine.find(`${SELECTOR_TARGET_LINKS}.${CLASS_NAME_ACTIVE$1}`, parent);\n      for (const node of activeNodes) {\n        node.classList.remove(CLASS_NAME_ACTIVE$1);\n      }\n    }\n\n    // Static\n    static jQueryInterface(config) {\n      return this.each(function () {\n        const data = ScrollSpy.getOrCreateInstance(this, config);\n        if (typeof config !== 'string') {\n          return;\n        }\n        if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n          throw new TypeError(`No method named \"${config}\"`);\n        }\n        data[config]();\n      });\n    }\n  }\n\n  /**\n   * Data API implementation\n   */\n\n  EventHandler.on(window, EVENT_LOAD_DATA_API$1, () => {\n    for (const spy of SelectorEngine.find(SELECTOR_DATA_SPY)) {\n      ScrollSpy.getOrCreateInstance(spy);\n    }\n  });\n\n  /**\n   * jQuery\n   */\n\n  defineJQueryPlugin(ScrollSpy);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap tab.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n\n  /**\n   * Constants\n   */\n\n  const NAME$1 = 'tab';\n  const DATA_KEY$1 = 'bs.tab';\n  const EVENT_KEY$1 = `.${DATA_KEY$1}`;\n  const EVENT_HIDE$1 = `hide${EVENT_KEY$1}`;\n  const EVENT_HIDDEN$1 = `hidden${EVENT_KEY$1}`;\n  const EVENT_SHOW$1 = `show${EVENT_KEY$1}`;\n  const EVENT_SHOWN$1 = `shown${EVENT_KEY$1}`;\n  const EVENT_CLICK_DATA_API = `click${EVENT_KEY$1}`;\n  const EVENT_KEYDOWN = `keydown${EVENT_KEY$1}`;\n  const EVENT_LOAD_DATA_API = `load${EVENT_KEY$1}`;\n  const ARROW_LEFT_KEY = 'ArrowLeft';\n  const ARROW_RIGHT_KEY = 'ArrowRight';\n  const ARROW_UP_KEY = 'ArrowUp';\n  const ARROW_DOWN_KEY = 'ArrowDown';\n  const HOME_KEY = 'Home';\n  const END_KEY = 'End';\n  const CLASS_NAME_ACTIVE = 'active';\n  const CLASS_NAME_FADE$1 = 'fade';\n  const CLASS_NAME_SHOW$1 = 'show';\n  const CLASS_DROPDOWN = 'dropdown';\n  const SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle';\n  const SELECTOR_DROPDOWN_MENU = '.dropdown-menu';\n  const NOT_SELECTOR_DROPDOWN_TOGGLE = `:not(${SELECTOR_DROPDOWN_TOGGLE})`;\n  const SELECTOR_TAB_PANEL = '.list-group, .nav, [role=\"tablist\"]';\n  const SELECTOR_OUTER = '.nav-item, .list-group-item';\n  const SELECTOR_INNER = `.nav-link${NOT_SELECTOR_DROPDOWN_TOGGLE}, .list-group-item${NOT_SELECTOR_DROPDOWN_TOGGLE}, [role=\"tab\"]${NOT_SELECTOR_DROPDOWN_TOGGLE}`;\n  const SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"tab\"], [data-bs-toggle=\"pill\"], [data-bs-toggle=\"list\"]'; // TODO: could only be `tab` in v6\n  const SELECTOR_INNER_ELEM = `${SELECTOR_INNER}, ${SELECTOR_DATA_TOGGLE}`;\n  const SELECTOR_DATA_TOGGLE_ACTIVE = `.${CLASS_NAME_ACTIVE}[data-bs-toggle=\"tab\"], .${CLASS_NAME_ACTIVE}[data-bs-toggle=\"pill\"], .${CLASS_NAME_ACTIVE}[data-bs-toggle=\"list\"]`;\n\n  /**\n   * Class definition\n   */\n\n  class Tab extends BaseComponent {\n    constructor(element) {\n      super(element);\n      this._parent = this._element.closest(SELECTOR_TAB_PANEL);\n      if (!this._parent) {\n        return;\n        // TODO: should throw exception in v6\n        // throw new TypeError(`${element.outerHTML} has not a valid parent ${SELECTOR_INNER_ELEM}`)\n      }\n\n      // Set up initial aria attributes\n      this._setInitialAttributes(this._parent, this._getChildren());\n      EventHandler.on(this._element, EVENT_KEYDOWN, event => this._keydown(event));\n    }\n\n    // Getters\n    static get NAME() {\n      return NAME$1;\n    }\n\n    // Public\n    show() {\n      // Shows this elem and deactivate the active sibling if exists\n      const innerElem = this._element;\n      if (this._elemIsActive(innerElem)) {\n        return;\n      }\n\n      // Search for active tab on same parent to deactivate it\n      const active = this._getActiveElem();\n      const hideEvent = active ? EventHandler.trigger(active, EVENT_HIDE$1, {\n        relatedTarget: innerElem\n      }) : null;\n      const showEvent = EventHandler.trigger(innerElem, EVENT_SHOW$1, {\n        relatedTarget: active\n      });\n      if (showEvent.defaultPrevented || hideEvent && hideEvent.defaultPrevented) {\n        return;\n      }\n      this._deactivate(active, innerElem);\n      this._activate(innerElem, active);\n    }\n\n    // Private\n    _activate(element, relatedElem) {\n      if (!element) {\n        return;\n      }\n      element.classList.add(CLASS_NAME_ACTIVE);\n      this._activate(SelectorEngine.getElementFromSelector(element)); // Search and activate/show the proper section\n\n      const complete = () => {\n        if (element.getAttribute('role') !== 'tab') {\n          element.classList.add(CLASS_NAME_SHOW$1);\n          return;\n        }\n        element.removeAttribute('tabindex');\n        element.setAttribute('aria-selected', true);\n        this._toggleDropDown(element, true);\n        EventHandler.trigger(element, EVENT_SHOWN$1, {\n          relatedTarget: relatedElem\n        });\n      };\n      this._queueCallback(complete, element, element.classList.contains(CLASS_NAME_FADE$1));\n    }\n    _deactivate(element, relatedElem) {\n      if (!element) {\n        return;\n      }\n      element.classList.remove(CLASS_NAME_ACTIVE);\n      element.blur();\n      this._deactivate(SelectorEngine.getElementFromSelector(element)); // Search and deactivate the shown section too\n\n      const complete = () => {\n        if (element.getAttribute('role') !== 'tab') {\n          element.classList.remove(CLASS_NAME_SHOW$1);\n          return;\n        }\n        element.setAttribute('aria-selected', false);\n        element.setAttribute('tabindex', '-1');\n        this._toggleDropDown(element, false);\n        EventHandler.trigger(element, EVENT_HIDDEN$1, {\n          relatedTarget: relatedElem\n        });\n      };\n      this._queueCallback(complete, element, element.classList.contains(CLASS_NAME_FADE$1));\n    }\n    _keydown(event) {\n      if (![ARROW_LEFT_KEY, ARROW_RIGHT_KEY, ARROW_UP_KEY, ARROW_DOWN_KEY, HOME_KEY, END_KEY].includes(event.key)) {\n        return;\n      }\n      event.stopPropagation(); // stopPropagation/preventDefault both added to support up/down keys without scrolling the page\n      event.preventDefault();\n      const children = this._getChildren().filter(element => !isDisabled(element));\n      let nextActiveElement;\n      if ([HOME_KEY, END_KEY].includes(event.key)) {\n        nextActiveElement = children[event.key === HOME_KEY ? 0 : children.length - 1];\n      } else {\n        const isNext = [ARROW_RIGHT_KEY, ARROW_DOWN_KEY].includes(event.key);\n        nextActiveElement = getNextActiveElement(children, event.target, isNext, true);\n      }\n      if (nextActiveElement) {\n        nextActiveElement.focus({\n          preventScroll: true\n        });\n        Tab.getOrCreateInstance(nextActiveElement).show();\n      }\n    }\n    _getChildren() {\n      // collection of inner elements\n      return SelectorEngine.find(SELECTOR_INNER_ELEM, this._parent);\n    }\n    _getActiveElem() {\n      return this._getChildren().find(child => this._elemIsActive(child)) || null;\n    }\n    _setInitialAttributes(parent, children) {\n      this._setAttributeIfNotExists(parent, 'role', 'tablist');\n      for (const child of children) {\n        this._setInitialAttributesOnChild(child);\n      }\n    }\n    _setInitialAttributesOnChild(child) {\n      child = this._getInnerElement(child);\n      const isActive = this._elemIsActive(child);\n      const outerElem = this._getOuterElement(child);\n      child.setAttribute('aria-selected', isActive);\n      if (outerElem !== child) {\n        this._setAttributeIfNotExists(outerElem, 'role', 'presentation');\n      }\n      if (!isActive) {\n        child.setAttribute('tabindex', '-1');\n      }\n      this._setAttributeIfNotExists(child, 'role', 'tab');\n\n      // set attributes to the related panel too\n      this._setInitialAttributesOnTargetPanel(child);\n    }\n    _setInitialAttributesOnTargetPanel(child) {\n      const target = SelectorEngine.getElementFromSelector(child);\n      if (!target) {\n        return;\n      }\n      this._setAttributeIfNotExists(target, 'role', 'tabpanel');\n      if (child.id) {\n        this._setAttributeIfNotExists(target, 'aria-labelledby', `${child.id}`);\n      }\n    }\n    _toggleDropDown(element, open) {\n      const outerElem = this._getOuterElement(element);\n      if (!outerElem.classList.contains(CLASS_DROPDOWN)) {\n        return;\n      }\n      const toggle = (selector, className) => {\n        const element = SelectorEngine.findOne(selector, outerElem);\n        if (element) {\n          element.classList.toggle(className, open);\n        }\n      };\n      toggle(SELECTOR_DROPDOWN_TOGGLE, CLASS_NAME_ACTIVE);\n      toggle(SELECTOR_DROPDOWN_MENU, CLASS_NAME_SHOW$1);\n      outerElem.setAttribute('aria-expanded', open);\n    }\n    _setAttributeIfNotExists(element, attribute, value) {\n      if (!element.hasAttribute(attribute)) {\n        element.setAttribute(attribute, value);\n      }\n    }\n    _elemIsActive(elem) {\n      return elem.classList.contains(CLASS_NAME_ACTIVE);\n    }\n\n    // Try to get the inner element (usually the .nav-link)\n    _getInnerElement(elem) {\n      return elem.matches(SELECTOR_INNER_ELEM) ? elem : SelectorEngine.findOne(SELECTOR_INNER_ELEM, elem);\n    }\n\n    // Try to get the outer element (usually the .nav-item)\n    _getOuterElement(elem) {\n      return elem.closest(SELECTOR_OUTER) || elem;\n    }\n\n    // Static\n    static jQueryInterface(config) {\n      return this.each(function () {\n        const data = Tab.getOrCreateInstance(this);\n        if (typeof config !== 'string') {\n          return;\n        }\n        if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n          throw new TypeError(`No method named \"${config}\"`);\n        }\n        data[config]();\n      });\n    }\n  }\n\n  /**\n   * Data API implementation\n   */\n\n  EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n    if (['A', 'AREA'].includes(this.tagName)) {\n      event.preventDefault();\n    }\n    if (isDisabled(this)) {\n      return;\n    }\n    Tab.getOrCreateInstance(this).show();\n  });\n\n  /**\n   * Initialize on focus\n   */\n  EventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n    for (const element of SelectorEngine.find(SELECTOR_DATA_TOGGLE_ACTIVE)) {\n      Tab.getOrCreateInstance(element);\n    }\n  });\n  /**\n   * jQuery\n   */\n\n  defineJQueryPlugin(Tab);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap toast.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n\n  /**\n   * Constants\n   */\n\n  const NAME = 'toast';\n  const DATA_KEY = 'bs.toast';\n  const EVENT_KEY = `.${DATA_KEY}`;\n  const EVENT_MOUSEOVER = `mouseover${EVENT_KEY}`;\n  const EVENT_MOUSEOUT = `mouseout${EVENT_KEY}`;\n  const EVENT_FOCUSIN = `focusin${EVENT_KEY}`;\n  const EVENT_FOCUSOUT = `focusout${EVENT_KEY}`;\n  const EVENT_HIDE = `hide${EVENT_KEY}`;\n  const EVENT_HIDDEN = `hidden${EVENT_KEY}`;\n  const EVENT_SHOW = `show${EVENT_KEY}`;\n  const EVENT_SHOWN = `shown${EVENT_KEY}`;\n  const CLASS_NAME_FADE = 'fade';\n  const CLASS_NAME_HIDE = 'hide'; // @deprecated - kept here only for backwards compatibility\n  const CLASS_NAME_SHOW = 'show';\n  const CLASS_NAME_SHOWING = 'showing';\n  const DefaultType = {\n    animation: 'boolean',\n    autohide: 'boolean',\n    delay: 'number'\n  };\n  const Default = {\n    animation: true,\n    autohide: true,\n    delay: 5000\n  };\n\n  /**\n   * Class definition\n   */\n\n  class Toast extends BaseComponent {\n    constructor(element, config) {\n      super(element, config);\n      this._timeout = null;\n      this._hasMouseInteraction = false;\n      this._hasKeyboardInteraction = false;\n      this._setListeners();\n    }\n\n    // Getters\n    static get Default() {\n      return Default;\n    }\n    static get DefaultType() {\n      return DefaultType;\n    }\n    static get NAME() {\n      return NAME;\n    }\n\n    // Public\n    show() {\n      const showEvent = EventHandler.trigger(this._element, EVENT_SHOW);\n      if (showEvent.defaultPrevented) {\n        return;\n      }\n      this._clearTimeout();\n      if (this._config.animation) {\n        this._element.classList.add(CLASS_NAME_FADE);\n      }\n      const complete = () => {\n        this._element.classList.remove(CLASS_NAME_SHOWING);\n        EventHandler.trigger(this._element, EVENT_SHOWN);\n        this._maybeScheduleHide();\n      };\n      this._element.classList.remove(CLASS_NAME_HIDE); // @deprecated\n      reflow(this._element);\n      this._element.classList.add(CLASS_NAME_SHOW, CLASS_NAME_SHOWING);\n      this._queueCallback(complete, this._element, this._config.animation);\n    }\n    hide() {\n      if (!this.isShown()) {\n        return;\n      }\n      const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE);\n      if (hideEvent.defaultPrevented) {\n        return;\n      }\n      const complete = () => {\n        this._element.classList.add(CLASS_NAME_HIDE); // @deprecated\n        this._element.classList.remove(CLASS_NAME_SHOWING, CLASS_NAME_SHOW);\n        EventHandler.trigger(this._element, EVENT_HIDDEN);\n      };\n      this._element.classList.add(CLASS_NAME_SHOWING);\n      this._queueCallback(complete, this._element, this._config.animation);\n    }\n    dispose() {\n      this._clearTimeout();\n      if (this.isShown()) {\n        this._element.classList.remove(CLASS_NAME_SHOW);\n      }\n      super.dispose();\n    }\n    isShown() {\n      return this._element.classList.contains(CLASS_NAME_SHOW);\n    }\n\n    // Private\n    _maybeScheduleHide() {\n      if (!this._config.autohide) {\n        return;\n      }\n      if (this._hasMouseInteraction || this._hasKeyboardInteraction) {\n        return;\n      }\n      this._timeout = setTimeout(() => {\n        this.hide();\n      }, this._config.delay);\n    }\n    _onInteraction(event, isInteracting) {\n      switch (event.type) {\n        case 'mouseover':\n        case 'mouseout':\n          {\n            this._hasMouseInteraction = isInteracting;\n            break;\n          }\n        case 'focusin':\n        case 'focusout':\n          {\n            this._hasKeyboardInteraction = isInteracting;\n            break;\n          }\n      }\n      if (isInteracting) {\n        this._clearTimeout();\n        return;\n      }\n      const nextElement = event.relatedTarget;\n      if (this._element === nextElement || this._element.contains(nextElement)) {\n        return;\n      }\n      this._maybeScheduleHide();\n    }\n    _setListeners() {\n      EventHandler.on(this._element, EVENT_MOUSEOVER, event => this._onInteraction(event, true));\n      EventHandler.on(this._element, EVENT_MOUSEOUT, event => this._onInteraction(event, false));\n      EventHandler.on(this._element, EVENT_FOCUSIN, event => this._onInteraction(event, true));\n      EventHandler.on(this._element, EVENT_FOCUSOUT, event => this._onInteraction(event, false));\n    }\n    _clearTimeout() {\n      clearTimeout(this._timeout);\n      this._timeout = null;\n    }\n\n    // Static\n    static jQueryInterface(config) {\n      return this.each(function () {\n        const data = Toast.getOrCreateInstance(this, config);\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(`No method named \"${config}\"`);\n          }\n          data[config](this);\n        }\n      });\n    }\n  }\n\n  /**\n   * Data API implementation\n   */\n\n  enableDismissTrigger(Toast);\n\n  /**\n   * jQuery\n   */\n\n  defineJQueryPlugin(Toast);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap index.umd.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n  const index_umd = {\n    Alert,\n    Button,\n    Carousel,\n    Collapse,\n    Dropdown,\n    Modal,\n    Offcanvas,\n    Popover,\n    ScrollSpy,\n    Tab,\n    Toast,\n    Tooltip\n  };\n\n  return index_umd;\n\n}));\n//# sourceMappingURL=bootstrap.js.map\n"
  },
  {
    "path": "js/dist/alert.js",
    "content": "/*!\n  * Bootstrap alert.js v5.3.8 (https://getbootstrap.com/)\n  * Copyright 2011-2025 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n  */\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('./base-component.js'), require('./dom/event-handler.js'), require('./util/component-functions.js'), require('./util/index.js')) :\n  typeof define === 'function' && define.amd ? define(['./base-component', './dom/event-handler', './util/component-functions', './util/index'], factory) :\n  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Alert = factory(global.BaseComponent, global.EventHandler, global.ComponentFunctions, global.Index));\n})(this, (function (BaseComponent, EventHandler, componentFunctions_js, index_js) { 'use strict';\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap alert.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n\n  /**\n   * Constants\n   */\n\n  const NAME = 'alert';\n  const DATA_KEY = 'bs.alert';\n  const EVENT_KEY = `.${DATA_KEY}`;\n  const EVENT_CLOSE = `close${EVENT_KEY}`;\n  const EVENT_CLOSED = `closed${EVENT_KEY}`;\n  const CLASS_NAME_FADE = 'fade';\n  const CLASS_NAME_SHOW = 'show';\n\n  /**\n   * Class definition\n   */\n\n  class Alert extends BaseComponent {\n    // Getters\n    static get NAME() {\n      return NAME;\n    }\n\n    // Public\n    close() {\n      const closeEvent = EventHandler.trigger(this._element, EVENT_CLOSE);\n      if (closeEvent.defaultPrevented) {\n        return;\n      }\n      this._element.classList.remove(CLASS_NAME_SHOW);\n      const isAnimated = this._element.classList.contains(CLASS_NAME_FADE);\n      this._queueCallback(() => this._destroyElement(), this._element, isAnimated);\n    }\n\n    // Private\n    _destroyElement() {\n      this._element.remove();\n      EventHandler.trigger(this._element, EVENT_CLOSED);\n      this.dispose();\n    }\n\n    // Static\n    static jQueryInterface(config) {\n      return this.each(function () {\n        const data = Alert.getOrCreateInstance(this);\n        if (typeof config !== 'string') {\n          return;\n        }\n        if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n          throw new TypeError(`No method named \"${config}\"`);\n        }\n        data[config](this);\n      });\n    }\n  }\n\n  /**\n   * Data API implementation\n   */\n\n  componentFunctions_js.enableDismissTrigger(Alert, 'close');\n\n  /**\n   * jQuery\n   */\n\n  index_js.defineJQueryPlugin(Alert);\n\n  return Alert;\n\n}));\n//# sourceMappingURL=alert.js.map\n"
  },
  {
    "path": "js/dist/base-component.js",
    "content": "/*!\n  * Bootstrap base-component.js v5.3.8 (https://getbootstrap.com/)\n  * Copyright 2011-2025 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n  */\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('./dom/data.js'), require('./dom/event-handler.js'), require('./util/config.js'), require('./util/index.js')) :\n  typeof define === 'function' && define.amd ? define(['./dom/data', './dom/event-handler', './util/config', './util/index'], factory) :\n  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.BaseComponent = factory(global.Data, global.EventHandler, global.Config, global.Index));\n})(this, (function (Data, EventHandler, Config, index_js) { 'use strict';\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap base-component.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n\n  /**\n   * Constants\n   */\n\n  const VERSION = '5.3.8';\n\n  /**\n   * Class definition\n   */\n\n  class BaseComponent extends Config {\n    constructor(element, config) {\n      super();\n      element = index_js.getElement(element);\n      if (!element) {\n        return;\n      }\n      this._element = element;\n      this._config = this._getConfig(config);\n      Data.set(this._element, this.constructor.DATA_KEY, this);\n    }\n\n    // Public\n    dispose() {\n      Data.remove(this._element, this.constructor.DATA_KEY);\n      EventHandler.off(this._element, this.constructor.EVENT_KEY);\n      for (const propertyName of Object.getOwnPropertyNames(this)) {\n        this[propertyName] = null;\n      }\n    }\n\n    // Private\n    _queueCallback(callback, element, isAnimated = true) {\n      index_js.executeAfterTransition(callback, element, isAnimated);\n    }\n    _getConfig(config) {\n      config = this._mergeConfigObj(config, this._element);\n      config = this._configAfterMerge(config);\n      this._typeCheckConfig(config);\n      return config;\n    }\n\n    // Static\n    static getInstance(element) {\n      return Data.get(index_js.getElement(element), this.DATA_KEY);\n    }\n    static getOrCreateInstance(element, config = {}) {\n      return this.getInstance(element) || new this(element, typeof config === 'object' ? config : null);\n    }\n    static get VERSION() {\n      return VERSION;\n    }\n    static get DATA_KEY() {\n      return `bs.${this.NAME}`;\n    }\n    static get EVENT_KEY() {\n      return `.${this.DATA_KEY}`;\n    }\n    static eventName(name) {\n      return `${name}${this.EVENT_KEY}`;\n    }\n  }\n\n  return BaseComponent;\n\n}));\n//# sourceMappingURL=base-component.js.map\n"
  },
  {
    "path": "js/dist/button.js",
    "content": "/*!\n  * Bootstrap button.js v5.3.8 (https://getbootstrap.com/)\n  * Copyright 2011-2025 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n  */\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('./base-component.js'), require('./dom/event-handler.js'), require('./util/index.js')) :\n  typeof define === 'function' && define.amd ? define(['./base-component', './dom/event-handler', './util/index'], factory) :\n  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Button = factory(global.BaseComponent, global.EventHandler, global.Index));\n})(this, (function (BaseComponent, EventHandler, index_js) { 'use strict';\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap button.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n\n  /**\n   * Constants\n   */\n\n  const NAME = 'button';\n  const DATA_KEY = 'bs.button';\n  const EVENT_KEY = `.${DATA_KEY}`;\n  const DATA_API_KEY = '.data-api';\n  const CLASS_NAME_ACTIVE = 'active';\n  const SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"button\"]';\n  const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`;\n\n  /**\n   * Class definition\n   */\n\n  class Button extends BaseComponent {\n    // Getters\n    static get NAME() {\n      return NAME;\n    }\n\n    // Public\n    toggle() {\n      // Toggle class and sync the `aria-pressed` attribute with the return value of the `.toggle()` method\n      this._element.setAttribute('aria-pressed', this._element.classList.toggle(CLASS_NAME_ACTIVE));\n    }\n\n    // Static\n    static jQueryInterface(config) {\n      return this.each(function () {\n        const data = Button.getOrCreateInstance(this);\n        if (config === 'toggle') {\n          data[config]();\n        }\n      });\n    }\n  }\n\n  /**\n   * Data API implementation\n   */\n\n  EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, event => {\n    event.preventDefault();\n    const button = event.target.closest(SELECTOR_DATA_TOGGLE);\n    const data = Button.getOrCreateInstance(button);\n    data.toggle();\n  });\n\n  /**\n   * jQuery\n   */\n\n  index_js.defineJQueryPlugin(Button);\n\n  return Button;\n\n}));\n//# sourceMappingURL=button.js.map\n"
  },
  {
    "path": "js/dist/carousel.js",
    "content": "/*!\n  * Bootstrap carousel.js v5.3.8 (https://getbootstrap.com/)\n  * Copyright 2011-2025 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n  */\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('./base-component.js'), require('./dom/event-handler.js'), require('./dom/manipulator.js'), require('./dom/selector-engine.js'), require('./util/index.js'), require('./util/swipe.js')) :\n  typeof define === 'function' && define.amd ? define(['./base-component', './dom/event-handler', './dom/manipulator', './dom/selector-engine', './util/index', './util/swipe'], factory) :\n  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Carousel = factory(global.BaseComponent, global.EventHandler, global.Manipulator, global.SelectorEngine, global.Index, global.Swipe));\n})(this, (function (BaseComponent, EventHandler, Manipulator, SelectorEngine, index_js, Swipe) { 'use strict';\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap carousel.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n\n  /**\n   * Constants\n   */\n\n  const NAME = 'carousel';\n  const DATA_KEY = 'bs.carousel';\n  const EVENT_KEY = `.${DATA_KEY}`;\n  const DATA_API_KEY = '.data-api';\n  const ARROW_LEFT_KEY = 'ArrowLeft';\n  const ARROW_RIGHT_KEY = 'ArrowRight';\n  const TOUCHEVENT_COMPAT_WAIT = 500; // Time for mouse compat events to fire after touch\n\n  const ORDER_NEXT = 'next';\n  const ORDER_PREV = 'prev';\n  const DIRECTION_LEFT = 'left';\n  const DIRECTION_RIGHT = 'right';\n  const EVENT_SLIDE = `slide${EVENT_KEY}`;\n  const EVENT_SLID = `slid${EVENT_KEY}`;\n  const EVENT_KEYDOWN = `keydown${EVENT_KEY}`;\n  const EVENT_MOUSEENTER = `mouseenter${EVENT_KEY}`;\n  const EVENT_MOUSELEAVE = `mouseleave${EVENT_KEY}`;\n  const EVENT_DRAG_START = `dragstart${EVENT_KEY}`;\n  const EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`;\n  const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`;\n  const CLASS_NAME_CAROUSEL = 'carousel';\n  const CLASS_NAME_ACTIVE = 'active';\n  const CLASS_NAME_SLIDE = 'slide';\n  const CLASS_NAME_END = 'carousel-item-end';\n  const CLASS_NAME_START = 'carousel-item-start';\n  const CLASS_NAME_NEXT = 'carousel-item-next';\n  const CLASS_NAME_PREV = 'carousel-item-prev';\n  const SELECTOR_ACTIVE = '.active';\n  const SELECTOR_ITEM = '.carousel-item';\n  const SELECTOR_ACTIVE_ITEM = SELECTOR_ACTIVE + SELECTOR_ITEM;\n  const SELECTOR_ITEM_IMG = '.carousel-item img';\n  const SELECTOR_INDICATORS = '.carousel-indicators';\n  const SELECTOR_DATA_SLIDE = '[data-bs-slide], [data-bs-slide-to]';\n  const SELECTOR_DATA_RIDE = '[data-bs-ride=\"carousel\"]';\n  const KEY_TO_DIRECTION = {\n    [ARROW_LEFT_KEY]: DIRECTION_RIGHT,\n    [ARROW_RIGHT_KEY]: DIRECTION_LEFT\n  };\n  const Default = {\n    interval: 5000,\n    keyboard: true,\n    pause: 'hover',\n    ride: false,\n    touch: true,\n    wrap: true\n  };\n  const DefaultType = {\n    interval: '(number|boolean)',\n    // TODO:v6 remove boolean support\n    keyboard: 'boolean',\n    pause: '(string|boolean)',\n    ride: '(boolean|string)',\n    touch: 'boolean',\n    wrap: 'boolean'\n  };\n\n  /**\n   * Class definition\n   */\n\n  class Carousel extends BaseComponent {\n    constructor(element, config) {\n      super(element, config);\n      this._interval = null;\n      this._activeElement = null;\n      this._isSliding = false;\n      this.touchTimeout = null;\n      this._swipeHelper = null;\n      this._indicatorsElement = SelectorEngine.findOne(SELECTOR_INDICATORS, this._element);\n      this._addEventListeners();\n      if (this._config.ride === CLASS_NAME_CAROUSEL) {\n        this.cycle();\n      }\n    }\n\n    // Getters\n    static get Default() {\n      return Default;\n    }\n    static get DefaultType() {\n      return DefaultType;\n    }\n    static get NAME() {\n      return NAME;\n    }\n\n    // Public\n    next() {\n      this._slide(ORDER_NEXT);\n    }\n    nextWhenVisible() {\n      // FIXME TODO use `document.visibilityState`\n      // Don't call next when the page isn't visible\n      // or the carousel or its parent isn't visible\n      if (!document.hidden && index_js.isVisible(this._element)) {\n        this.next();\n      }\n    }\n    prev() {\n      this._slide(ORDER_PREV);\n    }\n    pause() {\n      if (this._isSliding) {\n        index_js.triggerTransitionEnd(this._element);\n      }\n      this._clearInterval();\n    }\n    cycle() {\n      this._clearInterval();\n      this._updateInterval();\n      this._interval = setInterval(() => this.nextWhenVisible(), this._config.interval);\n    }\n    _maybeEnableCycle() {\n      if (!this._config.ride) {\n        return;\n      }\n      if (this._isSliding) {\n        EventHandler.one(this._element, EVENT_SLID, () => this.cycle());\n        return;\n      }\n      this.cycle();\n    }\n    to(index) {\n      const items = this._getItems();\n      if (index > items.length - 1 || index < 0) {\n        return;\n      }\n      if (this._isSliding) {\n        EventHandler.one(this._element, EVENT_SLID, () => this.to(index));\n        return;\n      }\n      const activeIndex = this._getItemIndex(this._getActive());\n      if (activeIndex === index) {\n        return;\n      }\n      const order = index > activeIndex ? ORDER_NEXT : ORDER_PREV;\n      this._slide(order, items[index]);\n    }\n    dispose() {\n      if (this._swipeHelper) {\n        this._swipeHelper.dispose();\n      }\n      super.dispose();\n    }\n\n    // Private\n    _configAfterMerge(config) {\n      config.defaultInterval = config.interval;\n      return config;\n    }\n    _addEventListeners() {\n      if (this._config.keyboard) {\n        EventHandler.on(this._element, EVENT_KEYDOWN, event => this._keydown(event));\n      }\n      if (this._config.pause === 'hover') {\n        EventHandler.on(this._element, EVENT_MOUSEENTER, () => this.pause());\n        EventHandler.on(this._element, EVENT_MOUSELEAVE, () => this._maybeEnableCycle());\n      }\n      if (this._config.touch && Swipe.isSupported()) {\n        this._addTouchEventListeners();\n      }\n    }\n    _addTouchEventListeners() {\n      for (const img of SelectorEngine.find(SELECTOR_ITEM_IMG, this._element)) {\n        EventHandler.on(img, EVENT_DRAG_START, event => event.preventDefault());\n      }\n      const endCallBack = () => {\n        if (this._config.pause !== 'hover') {\n          return;\n        }\n\n        // If it's a touch-enabled device, mouseenter/leave are fired as\n        // part of the mouse compatibility events on first tap - the carousel\n        // would stop cycling until user tapped out of it;\n        // here, we listen for touchend, explicitly pause the carousel\n        // (as if it's the second time we tap on it, mouseenter compat event\n        // is NOT fired) and after a timeout (to allow for mouse compatibility\n        // events to fire) we explicitly restart cycling\n\n        this.pause();\n        if (this.touchTimeout) {\n          clearTimeout(this.touchTimeout);\n        }\n        this.touchTimeout = setTimeout(() => this._maybeEnableCycle(), TOUCHEVENT_COMPAT_WAIT + this._config.interval);\n      };\n      const swipeConfig = {\n        leftCallback: () => this._slide(this._directionToOrder(DIRECTION_LEFT)),\n        rightCallback: () => this._slide(this._directionToOrder(DIRECTION_RIGHT)),\n        endCallback: endCallBack\n      };\n      this._swipeHelper = new Swipe(this._element, swipeConfig);\n    }\n    _keydown(event) {\n      if (/input|textarea/i.test(event.target.tagName)) {\n        return;\n      }\n      const direction = KEY_TO_DIRECTION[event.key];\n      if (direction) {\n        event.preventDefault();\n        this._slide(this._directionToOrder(direction));\n      }\n    }\n    _getItemIndex(element) {\n      return this._getItems().indexOf(element);\n    }\n    _setActiveIndicatorElement(index) {\n      if (!this._indicatorsElement) {\n        return;\n      }\n      const activeIndicator = SelectorEngine.findOne(SELECTOR_ACTIVE, this._indicatorsElement);\n      activeIndicator.classList.remove(CLASS_NAME_ACTIVE);\n      activeIndicator.removeAttribute('aria-current');\n      const newActiveIndicator = SelectorEngine.findOne(`[data-bs-slide-to=\"${index}\"]`, this._indicatorsElement);\n      if (newActiveIndicator) {\n        newActiveIndicator.classList.add(CLASS_NAME_ACTIVE);\n        newActiveIndicator.setAttribute('aria-current', 'true');\n      }\n    }\n    _updateInterval() {\n      const element = this._activeElement || this._getActive();\n      if (!element) {\n        return;\n      }\n      const elementInterval = Number.parseInt(element.getAttribute('data-bs-interval'), 10);\n      this._config.interval = elementInterval || this._config.defaultInterval;\n    }\n    _slide(order, element = null) {\n      if (this._isSliding) {\n        return;\n      }\n      const activeElement = this._getActive();\n      const isNext = order === ORDER_NEXT;\n      const nextElement = element || index_js.getNextActiveElement(this._getItems(), activeElement, isNext, this._config.wrap);\n      if (nextElement === activeElement) {\n        return;\n      }\n      const nextElementIndex = this._getItemIndex(nextElement);\n      const triggerEvent = eventName => {\n        return EventHandler.trigger(this._element, eventName, {\n          relatedTarget: nextElement,\n          direction: this._orderToDirection(order),\n          from: this._getItemIndex(activeElement),\n          to: nextElementIndex\n        });\n      };\n      const slideEvent = triggerEvent(EVENT_SLIDE);\n      if (slideEvent.defaultPrevented) {\n        return;\n      }\n      if (!activeElement || !nextElement) {\n        // Some weirdness is happening, so we bail\n        // TODO: change tests that use empty divs to avoid this check\n        return;\n      }\n      const isCycling = Boolean(this._interval);\n      this.pause();\n      this._isSliding = true;\n      this._setActiveIndicatorElement(nextElementIndex);\n      this._activeElement = nextElement;\n      const directionalClassName = isNext ? CLASS_NAME_START : CLASS_NAME_END;\n      const orderClassName = isNext ? CLASS_NAME_NEXT : CLASS_NAME_PREV;\n      nextElement.classList.add(orderClassName);\n      index_js.reflow(nextElement);\n      activeElement.classList.add(directionalClassName);\n      nextElement.classList.add(directionalClassName);\n      const completeCallBack = () => {\n        nextElement.classList.remove(directionalClassName, orderClassName);\n        nextElement.classList.add(CLASS_NAME_ACTIVE);\n        activeElement.classList.remove(CLASS_NAME_ACTIVE, orderClassName, directionalClassName);\n        this._isSliding = false;\n        triggerEvent(EVENT_SLID);\n      };\n      this._queueCallback(completeCallBack, activeElement, this._isAnimated());\n      if (isCycling) {\n        this.cycle();\n      }\n    }\n    _isAnimated() {\n      return this._element.classList.contains(CLASS_NAME_SLIDE);\n    }\n    _getActive() {\n      return SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element);\n    }\n    _getItems() {\n      return SelectorEngine.find(SELECTOR_ITEM, this._element);\n    }\n    _clearInterval() {\n      if (this._interval) {\n        clearInterval(this._interval);\n        this._interval = null;\n      }\n    }\n    _directionToOrder(direction) {\n      if (index_js.isRTL()) {\n        return direction === DIRECTION_LEFT ? ORDER_PREV : ORDER_NEXT;\n      }\n      return direction === DIRECTION_LEFT ? ORDER_NEXT : ORDER_PREV;\n    }\n    _orderToDirection(order) {\n      if (index_js.isRTL()) {\n        return order === ORDER_PREV ? DIRECTION_LEFT : DIRECTION_RIGHT;\n      }\n      return order === ORDER_PREV ? DIRECTION_RIGHT : DIRECTION_LEFT;\n    }\n\n    // Static\n    static jQueryInterface(config) {\n      return this.each(function () {\n        const data = Carousel.getOrCreateInstance(this, config);\n        if (typeof config === 'number') {\n          data.to(config);\n          return;\n        }\n        if (typeof config === 'string') {\n          if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n            throw new TypeError(`No method named \"${config}\"`);\n          }\n          data[config]();\n        }\n      });\n    }\n  }\n\n  /**\n   * Data API implementation\n   */\n\n  EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_SLIDE, function (event) {\n    const target = SelectorEngine.getElementFromSelector(this);\n    if (!target || !target.classList.contains(CLASS_NAME_CAROUSEL)) {\n      return;\n    }\n    event.preventDefault();\n    const carousel = Carousel.getOrCreateInstance(target);\n    const slideIndex = this.getAttribute('data-bs-slide-to');\n    if (slideIndex) {\n      carousel.to(slideIndex);\n      carousel._maybeEnableCycle();\n      return;\n    }\n    if (Manipulator.getDataAttribute(this, 'slide') === 'next') {\n      carousel.next();\n      carousel._maybeEnableCycle();\n      return;\n    }\n    carousel.prev();\n    carousel._maybeEnableCycle();\n  });\n  EventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n    const carousels = SelectorEngine.find(SELECTOR_DATA_RIDE);\n    for (const carousel of carousels) {\n      Carousel.getOrCreateInstance(carousel);\n    }\n  });\n\n  /**\n   * jQuery\n   */\n\n  index_js.defineJQueryPlugin(Carousel);\n\n  return Carousel;\n\n}));\n//# sourceMappingURL=carousel.js.map\n"
  },
  {
    "path": "js/dist/collapse.js",
    "content": "/*!\n  * Bootstrap collapse.js v5.3.8 (https://getbootstrap.com/)\n  * Copyright 2011-2025 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n  */\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('./base-component.js'), require('./dom/event-handler.js'), require('./dom/selector-engine.js'), require('./util/index.js')) :\n  typeof define === 'function' && define.amd ? define(['./base-component', './dom/event-handler', './dom/selector-engine', './util/index'], factory) :\n  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Collapse = factory(global.BaseComponent, global.EventHandler, global.SelectorEngine, global.Index));\n})(this, (function (BaseComponent, EventHandler, SelectorEngine, index_js) { 'use strict';\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap collapse.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n\n  /**\n   * Constants\n   */\n\n  const NAME = 'collapse';\n  const DATA_KEY = 'bs.collapse';\n  const EVENT_KEY = `.${DATA_KEY}`;\n  const DATA_API_KEY = '.data-api';\n  const EVENT_SHOW = `show${EVENT_KEY}`;\n  const EVENT_SHOWN = `shown${EVENT_KEY}`;\n  const EVENT_HIDE = `hide${EVENT_KEY}`;\n  const EVENT_HIDDEN = `hidden${EVENT_KEY}`;\n  const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`;\n  const CLASS_NAME_SHOW = 'show';\n  const CLASS_NAME_COLLAPSE = 'collapse';\n  const CLASS_NAME_COLLAPSING = 'collapsing';\n  const CLASS_NAME_COLLAPSED = 'collapsed';\n  const CLASS_NAME_DEEPER_CHILDREN = `:scope .${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`;\n  const CLASS_NAME_HORIZONTAL = 'collapse-horizontal';\n  const WIDTH = 'width';\n  const HEIGHT = 'height';\n  const SELECTOR_ACTIVES = '.collapse.show, .collapse.collapsing';\n  const SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"collapse\"]';\n  const Default = {\n    parent: null,\n    toggle: true\n  };\n  const DefaultType = {\n    parent: '(null|element)',\n    toggle: 'boolean'\n  };\n\n  /**\n   * Class definition\n   */\n\n  class Collapse extends BaseComponent {\n    constructor(element, config) {\n      super(element, config);\n      this._isTransitioning = false;\n      this._triggerArray = [];\n      const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE);\n      for (const elem of toggleList) {\n        const selector = SelectorEngine.getSelectorFromElement(elem);\n        const filterElement = SelectorEngine.find(selector).filter(foundElement => foundElement === this._element);\n        if (selector !== null && filterElement.length) {\n          this._triggerArray.push(elem);\n        }\n      }\n      this._initializeChildren();\n      if (!this._config.parent) {\n        this._addAriaAndCollapsedClass(this._triggerArray, this._isShown());\n      }\n      if (this._config.toggle) {\n        this.toggle();\n      }\n    }\n\n    // Getters\n    static get Default() {\n      return Default;\n    }\n    static get DefaultType() {\n      return DefaultType;\n    }\n    static get NAME() {\n      return NAME;\n    }\n\n    // Public\n    toggle() {\n      if (this._isShown()) {\n        this.hide();\n      } else {\n        this.show();\n      }\n    }\n    show() {\n      if (this._isTransitioning || this._isShown()) {\n        return;\n      }\n      let activeChildren = [];\n\n      // find active children\n      if (this._config.parent) {\n        activeChildren = this._getFirstLevelChildren(SELECTOR_ACTIVES).filter(element => element !== this._element).map(element => Collapse.getOrCreateInstance(element, {\n          toggle: false\n        }));\n      }\n      if (activeChildren.length && activeChildren[0]._isTransitioning) {\n        return;\n      }\n      const startEvent = EventHandler.trigger(this._element, EVENT_SHOW);\n      if (startEvent.defaultPrevented) {\n        return;\n      }\n      for (const activeInstance of activeChildren) {\n        activeInstance.hide();\n      }\n      const dimension = this._getDimension();\n      this._element.classList.remove(CLASS_NAME_COLLAPSE);\n      this._element.classList.add(CLASS_NAME_COLLAPSING);\n      this._element.style[dimension] = 0;\n      this._addAriaAndCollapsedClass(this._triggerArray, true);\n      this._isTransitioning = true;\n      const complete = () => {\n        this._isTransitioning = false;\n        this._element.classList.remove(CLASS_NAME_COLLAPSING);\n        this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW);\n        this._element.style[dimension] = '';\n        EventHandler.trigger(this._element, EVENT_SHOWN);\n      };\n      const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);\n      const scrollSize = `scroll${capitalizedDimension}`;\n      this._queueCallback(complete, this._element, true);\n      this._element.style[dimension] = `${this._element[scrollSize]}px`;\n    }\n    hide() {\n      if (this._isTransitioning || !this._isShown()) {\n        return;\n      }\n      const startEvent = EventHandler.trigger(this._element, EVENT_HIDE);\n      if (startEvent.defaultPrevented) {\n        return;\n      }\n      const dimension = this._getDimension();\n      this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`;\n      index_js.reflow(this._element);\n      this._element.classList.add(CLASS_NAME_COLLAPSING);\n      this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW);\n      for (const trigger of this._triggerArray) {\n        const element = SelectorEngine.getElementFromSelector(trigger);\n        if (element && !this._isShown(element)) {\n          this._addAriaAndCollapsedClass([trigger], false);\n        }\n      }\n      this._isTransitioning = true;\n      const complete = () => {\n        this._isTransitioning = false;\n        this._element.classList.remove(CLASS_NAME_COLLAPSING);\n        this._element.classList.add(CLASS_NAME_COLLAPSE);\n        EventHandler.trigger(this._element, EVENT_HIDDEN);\n      };\n      this._element.style[dimension] = '';\n      this._queueCallback(complete, this._element, true);\n    }\n\n    // Private\n    _isShown(element = this._element) {\n      return element.classList.contains(CLASS_NAME_SHOW);\n    }\n    _configAfterMerge(config) {\n      config.toggle = Boolean(config.toggle); // Coerce string values\n      config.parent = index_js.getElement(config.parent);\n      return config;\n    }\n    _getDimension() {\n      return this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT;\n    }\n    _initializeChildren() {\n      if (!this._config.parent) {\n        return;\n      }\n      const children = this._getFirstLevelChildren(SELECTOR_DATA_TOGGLE);\n      for (const element of children) {\n        const selected = SelectorEngine.getElementFromSelector(element);\n        if (selected) {\n          this._addAriaAndCollapsedClass([element], this._isShown(selected));\n        }\n      }\n    }\n    _getFirstLevelChildren(selector) {\n      const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent);\n      // remove children if greater depth\n      return SelectorEngine.find(selector, this._config.parent).filter(element => !children.includes(element));\n    }\n    _addAriaAndCollapsedClass(triggerArray, isOpen) {\n      if (!triggerArray.length) {\n        return;\n      }\n      for (const element of triggerArray) {\n        element.classList.toggle(CLASS_NAME_COLLAPSED, !isOpen);\n        element.setAttribute('aria-expanded', isOpen);\n      }\n    }\n\n    // Static\n    static jQueryInterface(config) {\n      const _config = {};\n      if (typeof config === 'string' && /show|hide/.test(config)) {\n        _config.toggle = false;\n      }\n      return this.each(function () {\n        const data = Collapse.getOrCreateInstance(this, _config);\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(`No method named \"${config}\"`);\n          }\n          data[config]();\n        }\n      });\n    }\n  }\n\n  /**\n   * Data API implementation\n   */\n\n  EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n    // preventDefault only for <a> elements (which change the URL) not inside the collapsible element\n    if (event.target.tagName === 'A' || event.delegateTarget && event.delegateTarget.tagName === 'A') {\n      event.preventDefault();\n    }\n    for (const element of SelectorEngine.getMultipleElementsFromSelector(this)) {\n      Collapse.getOrCreateInstance(element, {\n        toggle: false\n      }).toggle();\n    }\n  });\n\n  /**\n   * jQuery\n   */\n\n  index_js.defineJQueryPlugin(Collapse);\n\n  return Collapse;\n\n}));\n//# sourceMappingURL=collapse.js.map\n"
  },
  {
    "path": "js/dist/dom/data.js",
    "content": "/*!\n  * Bootstrap data.js v5.3.8 (https://getbootstrap.com/)\n  * Copyright 2011-2025 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n  */\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n  typeof define === 'function' && define.amd ? define(factory) :\n  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Data = factory());\n})(this, (function () { 'use strict';\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap dom/data.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n  /**\n   * Constants\n   */\n\n  const elementMap = new Map();\n  const data = {\n    set(element, key, instance) {\n      if (!elementMap.has(element)) {\n        elementMap.set(element, new Map());\n      }\n      const instanceMap = elementMap.get(element);\n\n      // make it clear we only want one instance per element\n      // can be removed later when multiple key/instances are fine to be used\n      if (!instanceMap.has(key) && instanceMap.size !== 0) {\n        // eslint-disable-next-line no-console\n        console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`);\n        return;\n      }\n      instanceMap.set(key, instance);\n    },\n    get(element, key) {\n      if (elementMap.has(element)) {\n        return elementMap.get(element).get(key) || null;\n      }\n      return null;\n    },\n    remove(element, key) {\n      if (!elementMap.has(element)) {\n        return;\n      }\n      const instanceMap = elementMap.get(element);\n      instanceMap.delete(key);\n\n      // free up element references if there are no instances left for an element\n      if (instanceMap.size === 0) {\n        elementMap.delete(element);\n      }\n    }\n  };\n\n  return data;\n\n}));\n//# sourceMappingURL=data.js.map\n"
  },
  {
    "path": "js/dist/dom/event-handler.js",
    "content": "/*!\n  * Bootstrap event-handler.js v5.3.8 (https://getbootstrap.com/)\n  * Copyright 2011-2025 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n  */\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('../util/index.js')) :\n  typeof define === 'function' && define.amd ? define(['../util/index'], factory) :\n  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.EventHandler = factory(global.Index));\n})(this, (function (index_js) { 'use strict';\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap dom/event-handler.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n\n  /**\n   * Constants\n   */\n\n  const namespaceRegex = /[^.]*(?=\\..*)\\.|.*/;\n  const stripNameRegex = /\\..*/;\n  const stripUidRegex = /::\\d+$/;\n  const eventRegistry = {}; // Events storage\n  let uidEvent = 1;\n  const customEvents = {\n    mouseenter: 'mouseover',\n    mouseleave: 'mouseout'\n  };\n  const nativeEvents = new Set(['click', 'dblclick', 'mouseup', 'mousedown', 'contextmenu', 'mousewheel', 'DOMMouseScroll', 'mouseover', 'mouseout', 'mousemove', 'selectstart', 'selectend', 'keydown', 'keypress', 'keyup', 'orientationchange', 'touchstart', 'touchmove', 'touchend', 'touchcancel', 'pointerdown', 'pointermove', 'pointerup', 'pointerleave', 'pointercancel', 'gesturestart', 'gesturechange', 'gestureend', 'focus', 'blur', 'change', 'reset', 'select', 'submit', 'focusin', 'focusout', 'load', 'unload', 'beforeunload', 'resize', 'move', 'DOMContentLoaded', 'readystatechange', 'error', 'abort', 'scroll']);\n\n  /**\n   * Private methods\n   */\n\n  function makeEventUid(element, uid) {\n    return uid && `${uid}::${uidEvent++}` || element.uidEvent || uidEvent++;\n  }\n  function getElementEvents(element) {\n    const uid = makeEventUid(element);\n    element.uidEvent = uid;\n    eventRegistry[uid] = eventRegistry[uid] || {};\n    return eventRegistry[uid];\n  }\n  function bootstrapHandler(element, fn) {\n    return function handler(event) {\n      hydrateObj(event, {\n        delegateTarget: element\n      });\n      if (handler.oneOff) {\n        EventHandler.off(element, event.type, fn);\n      }\n      return fn.apply(element, [event]);\n    };\n  }\n  function bootstrapDelegationHandler(element, selector, fn) {\n    return function handler(event) {\n      const domElements = element.querySelectorAll(selector);\n      for (let {\n        target\n      } = event; target && target !== this; target = target.parentNode) {\n        for (const domElement of domElements) {\n          if (domElement !== target) {\n            continue;\n          }\n          hydrateObj(event, {\n            delegateTarget: target\n          });\n          if (handler.oneOff) {\n            EventHandler.off(element, event.type, selector, fn);\n          }\n          return fn.apply(target, [event]);\n        }\n      }\n    };\n  }\n  function findHandler(events, callable, delegationSelector = null) {\n    return Object.values(events).find(event => event.callable === callable && event.delegationSelector === delegationSelector);\n  }\n  function normalizeParameters(originalTypeEvent, handler, delegationFunction) {\n    const isDelegated = typeof handler === 'string';\n    // TODO: tooltip passes `false` instead of selector, so we need to check\n    const callable = isDelegated ? delegationFunction : handler || delegationFunction;\n    let typeEvent = getTypeEvent(originalTypeEvent);\n    if (!nativeEvents.has(typeEvent)) {\n      typeEvent = originalTypeEvent;\n    }\n    return [isDelegated, callable, typeEvent];\n  }\n  function addHandler(element, originalTypeEvent, handler, delegationFunction, oneOff) {\n    if (typeof originalTypeEvent !== 'string' || !element) {\n      return;\n    }\n    let [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction);\n\n    // in case of mouseenter or mouseleave wrap the handler within a function that checks for its DOM position\n    // this prevents the handler from being dispatched the same way as mouseover or mouseout does\n    if (originalTypeEvent in customEvents) {\n      const wrapFunction = fn => {\n        return function (event) {\n          if (!event.relatedTarget || event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget)) {\n            return fn.call(this, event);\n          }\n        };\n      };\n      callable = wrapFunction(callable);\n    }\n    const events = getElementEvents(element);\n    const handlers = events[typeEvent] || (events[typeEvent] = {});\n    const previousFunction = findHandler(handlers, callable, isDelegated ? handler : null);\n    if (previousFunction) {\n      previousFunction.oneOff = previousFunction.oneOff && oneOff;\n      return;\n    }\n    const uid = makeEventUid(callable, originalTypeEvent.replace(namespaceRegex, ''));\n    const fn = isDelegated ? bootstrapDelegationHandler(element, handler, callable) : bootstrapHandler(element, callable);\n    fn.delegationSelector = isDelegated ? handler : null;\n    fn.callable = callable;\n    fn.oneOff = oneOff;\n    fn.uidEvent = uid;\n    handlers[uid] = fn;\n    element.addEventListener(typeEvent, fn, isDelegated);\n  }\n  function removeHandler(element, events, typeEvent, handler, delegationSelector) {\n    const fn = findHandler(events[typeEvent], handler, delegationSelector);\n    if (!fn) {\n      return;\n    }\n    element.removeEventListener(typeEvent, fn, Boolean(delegationSelector));\n    delete events[typeEvent][fn.uidEvent];\n  }\n  function removeNamespacedHandlers(element, events, typeEvent, namespace) {\n    const storeElementEvent = events[typeEvent] || {};\n    for (const [handlerKey, event] of Object.entries(storeElementEvent)) {\n      if (handlerKey.includes(namespace)) {\n        removeHandler(element, events, typeEvent, event.callable, event.delegationSelector);\n      }\n    }\n  }\n  function getTypeEvent(event) {\n    // allow to get the native events from namespaced events ('click.bs.button' --> 'click')\n    event = event.replace(stripNameRegex, '');\n    return customEvents[event] || event;\n  }\n  const EventHandler = {\n    on(element, event, handler, delegationFunction) {\n      addHandler(element, event, handler, delegationFunction, false);\n    },\n    one(element, event, handler, delegationFunction) {\n      addHandler(element, event, handler, delegationFunction, true);\n    },\n    off(element, originalTypeEvent, handler, delegationFunction) {\n      if (typeof originalTypeEvent !== 'string' || !element) {\n        return;\n      }\n      const [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction);\n      const inNamespace = typeEvent !== originalTypeEvent;\n      const events = getElementEvents(element);\n      const storeElementEvent = events[typeEvent] || {};\n      const isNamespace = originalTypeEvent.startsWith('.');\n      if (typeof callable !== 'undefined') {\n        // Simplest case: handler is passed, remove that listener ONLY.\n        if (!Object.keys(storeElementEvent).length) {\n          return;\n        }\n        removeHandler(element, events, typeEvent, callable, isDelegated ? handler : null);\n        return;\n      }\n      if (isNamespace) {\n        for (const elementEvent of Object.keys(events)) {\n          removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1));\n        }\n      }\n      for (const [keyHandlers, event] of Object.entries(storeElementEvent)) {\n        const handlerKey = keyHandlers.replace(stripUidRegex, '');\n        if (!inNamespace || originalTypeEvent.includes(handlerKey)) {\n          removeHandler(element, events, typeEvent, event.callable, event.delegationSelector);\n        }\n      }\n    },\n    trigger(element, event, args) {\n      if (typeof event !== 'string' || !element) {\n        return null;\n      }\n      const $ = index_js.getjQuery();\n      const typeEvent = getTypeEvent(event);\n      const inNamespace = event !== typeEvent;\n      let jQueryEvent = null;\n      let bubbles = true;\n      let nativeDispatch = true;\n      let defaultPrevented = false;\n      if (inNamespace && $) {\n        jQueryEvent = $.Event(event, args);\n        $(element).trigger(jQueryEvent);\n        bubbles = !jQueryEvent.isPropagationStopped();\n        nativeDispatch = !jQueryEvent.isImmediatePropagationStopped();\n        defaultPrevented = jQueryEvent.isDefaultPrevented();\n      }\n      const evt = hydrateObj(new Event(event, {\n        bubbles,\n        cancelable: true\n      }), args);\n      if (defaultPrevented) {\n        evt.preventDefault();\n      }\n      if (nativeDispatch) {\n        element.dispatchEvent(evt);\n      }\n      if (evt.defaultPrevented && jQueryEvent) {\n        jQueryEvent.preventDefault();\n      }\n      return evt;\n    }\n  };\n  function hydrateObj(obj, meta = {}) {\n    for (const [key, value] of Object.entries(meta)) {\n      try {\n        obj[key] = value;\n      } catch (_unused) {\n        Object.defineProperty(obj, key, {\n          configurable: true,\n          get() {\n            return value;\n          }\n        });\n      }\n    }\n    return obj;\n  }\n\n  return EventHandler;\n\n}));\n//# sourceMappingURL=event-handler.js.map\n"
  },
  {
    "path": "js/dist/dom/manipulator.js",
    "content": "/*!\n  * Bootstrap manipulator.js v5.3.8 (https://getbootstrap.com/)\n  * Copyright 2011-2025 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n  */\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n  typeof define === 'function' && define.amd ? define(factory) :\n  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Manipulator = factory());\n})(this, (function () { 'use strict';\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap dom/manipulator.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n  function normalizeData(value) {\n    if (value === 'true') {\n      return true;\n    }\n    if (value === 'false') {\n      return false;\n    }\n    if (value === Number(value).toString()) {\n      return Number(value);\n    }\n    if (value === '' || value === 'null') {\n      return null;\n    }\n    if (typeof value !== 'string') {\n      return value;\n    }\n    try {\n      return JSON.parse(decodeURIComponent(value));\n    } catch (_unused) {\n      return value;\n    }\n  }\n  function normalizeDataKey(key) {\n    return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`);\n  }\n  const Manipulator = {\n    setDataAttribute(element, key, value) {\n      element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value);\n    },\n    removeDataAttribute(element, key) {\n      element.removeAttribute(`data-bs-${normalizeDataKey(key)}`);\n    },\n    getDataAttributes(element) {\n      if (!element) {\n        return {};\n      }\n      const attributes = {};\n      const bsKeys = Object.keys(element.dataset).filter(key => key.startsWith('bs') && !key.startsWith('bsConfig'));\n      for (const key of bsKeys) {\n        let pureKey = key.replace(/^bs/, '');\n        pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1);\n        attributes[pureKey] = normalizeData(element.dataset[key]);\n      }\n      return attributes;\n    },\n    getDataAttribute(element, key) {\n      return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`));\n    }\n  };\n\n  return Manipulator;\n\n}));\n//# sourceMappingURL=manipulator.js.map\n"
  },
  {
    "path": "js/dist/dom/selector-engine.js",
    "content": "/*!\n  * Bootstrap selector-engine.js v5.3.8 (https://getbootstrap.com/)\n  * Copyright 2011-2025 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n  */\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('../util/index.js')) :\n  typeof define === 'function' && define.amd ? define(['../util/index'], factory) :\n  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.SelectorEngine = factory(global.Index));\n})(this, (function (index_js) { 'use strict';\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap dom/selector-engine.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n  const getSelector = element => {\n    let selector = element.getAttribute('data-bs-target');\n    if (!selector || selector === '#') {\n      let hrefAttribute = element.getAttribute('href');\n\n      // The only valid content that could double as a selector are IDs or classes,\n      // so everything starting with `#` or `.`. If a \"real\" URL is used as the selector,\n      // `document.querySelector` will rightfully complain it is invalid.\n      // See https://github.com/twbs/bootstrap/issues/32273\n      if (!hrefAttribute || !hrefAttribute.includes('#') && !hrefAttribute.startsWith('.')) {\n        return null;\n      }\n\n      // Just in case some CMS puts out a full URL with the anchor appended\n      if (hrefAttribute.includes('#') && !hrefAttribute.startsWith('#')) {\n        hrefAttribute = `#${hrefAttribute.split('#')[1]}`;\n      }\n      selector = hrefAttribute && hrefAttribute !== '#' ? hrefAttribute.trim() : null;\n    }\n    return selector ? selector.split(',').map(sel => index_js.parseSelector(sel)).join(',') : null;\n  };\n  const SelectorEngine = {\n    find(selector, element = document.documentElement) {\n      return [].concat(...Element.prototype.querySelectorAll.call(element, selector));\n    },\n    findOne(selector, element = document.documentElement) {\n      return Element.prototype.querySelector.call(element, selector);\n    },\n    children(element, selector) {\n      return [].concat(...element.children).filter(child => child.matches(selector));\n    },\n    parents(element, selector) {\n      const parents = [];\n      let ancestor = element.parentNode.closest(selector);\n      while (ancestor) {\n        parents.push(ancestor);\n        ancestor = ancestor.parentNode.closest(selector);\n      }\n      return parents;\n    },\n    prev(element, selector) {\n      let previous = element.previousElementSibling;\n      while (previous) {\n        if (previous.matches(selector)) {\n          return [previous];\n        }\n        previous = previous.previousElementSibling;\n      }\n      return [];\n    },\n    // TODO: this is now unused; remove later along with prev()\n    next(element, selector) {\n      let next = element.nextElementSibling;\n      while (next) {\n        if (next.matches(selector)) {\n          return [next];\n        }\n        next = next.nextElementSibling;\n      }\n      return [];\n    },\n    focusableChildren(element) {\n      const focusables = ['a', 'button', 'input', 'textarea', 'select', 'details', '[tabindex]', '[contenteditable=\"true\"]'].map(selector => `${selector}:not([tabindex^=\"-\"])`).join(',');\n      return this.find(focusables, element).filter(el => !index_js.isDisabled(el) && index_js.isVisible(el));\n    },\n    getSelectorFromElement(element) {\n      const selector = getSelector(element);\n      if (selector) {\n        return SelectorEngine.findOne(selector) ? selector : null;\n      }\n      return null;\n    },\n    getElementFromSelector(element) {\n      const selector = getSelector(element);\n      return selector ? SelectorEngine.findOne(selector) : null;\n    },\n    getMultipleElementsFromSelector(element) {\n      const selector = getSelector(element);\n      return selector ? SelectorEngine.find(selector) : [];\n    }\n  };\n\n  return SelectorEngine;\n\n}));\n//# sourceMappingURL=selector-engine.js.map\n"
  },
  {
    "path": "js/dist/dropdown.js",
    "content": "/*!\n  * Bootstrap dropdown.js v5.3.8 (https://getbootstrap.com/)\n  * Copyright 2011-2025 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n  */\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('@popperjs/core'), require('./base-component.js'), require('./dom/event-handler.js'), require('./dom/manipulator.js'), require('./dom/selector-engine.js'), require('./util/index.js')) :\n  typeof define === 'function' && define.amd ? define(['@popperjs/core', './base-component', './dom/event-handler', './dom/manipulator', './dom/selector-engine', './util/index'], factory) :\n  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Dropdown = factory(global[\"@popperjs/core\"], global.BaseComponent, global.EventHandler, global.Manipulator, global.SelectorEngine, global.Index));\n})(this, (function (Popper, BaseComponent, EventHandler, Manipulator, SelectorEngine, index_js) { 'use strict';\n\n  function _interopNamespaceDefault(e) {\n    const n = Object.create(null, { [Symbol.toStringTag]: { value: 'Module' } });\n    if (e) {\n      for (const k in e) {\n        if (k !== 'default') {\n          const d = Object.getOwnPropertyDescriptor(e, k);\n          Object.defineProperty(n, k, d.get ? d : {\n            enumerable: true,\n            get: () => e[k]\n          });\n        }\n      }\n    }\n    n.default = e;\n    return Object.freeze(n);\n  }\n\n  const Popper__namespace = /*#__PURE__*/_interopNamespaceDefault(Popper);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap dropdown.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n\n  /**\n   * Constants\n   */\n\n  const NAME = 'dropdown';\n  const DATA_KEY = 'bs.dropdown';\n  const EVENT_KEY = `.${DATA_KEY}`;\n  const DATA_API_KEY = '.data-api';\n  const ESCAPE_KEY = 'Escape';\n  const TAB_KEY = 'Tab';\n  const ARROW_UP_KEY = 'ArrowUp';\n  const ARROW_DOWN_KEY = 'ArrowDown';\n  const RIGHT_MOUSE_BUTTON = 2; // MouseEvent.button value for the secondary button, usually the right button\n\n  const EVENT_HIDE = `hide${EVENT_KEY}`;\n  const EVENT_HIDDEN = `hidden${EVENT_KEY}`;\n  const EVENT_SHOW = `show${EVENT_KEY}`;\n  const EVENT_SHOWN = `shown${EVENT_KEY}`;\n  const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`;\n  const EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY}${DATA_API_KEY}`;\n  const EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY}${DATA_API_KEY}`;\n  const CLASS_NAME_SHOW = 'show';\n  const CLASS_NAME_DROPUP = 'dropup';\n  const CLASS_NAME_DROPEND = 'dropend';\n  const CLASS_NAME_DROPSTART = 'dropstart';\n  const CLASS_NAME_DROPUP_CENTER = 'dropup-center';\n  const CLASS_NAME_DROPDOWN_CENTER = 'dropdown-center';\n  const SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"dropdown\"]:not(.disabled):not(:disabled)';\n  const SELECTOR_DATA_TOGGLE_SHOWN = `${SELECTOR_DATA_TOGGLE}.${CLASS_NAME_SHOW}`;\n  const SELECTOR_MENU = '.dropdown-menu';\n  const SELECTOR_NAVBAR = '.navbar';\n  const SELECTOR_NAVBAR_NAV = '.navbar-nav';\n  const SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)';\n  const PLACEMENT_TOP = index_js.isRTL() ? 'top-end' : 'top-start';\n  const PLACEMENT_TOPEND = index_js.isRTL() ? 'top-start' : 'top-end';\n  const PLACEMENT_BOTTOM = index_js.isRTL() ? 'bottom-end' : 'bottom-start';\n  const PLACEMENT_BOTTOMEND = index_js.isRTL() ? 'bottom-start' : 'bottom-end';\n  const PLACEMENT_RIGHT = index_js.isRTL() ? 'left-start' : 'right-start';\n  const PLACEMENT_LEFT = index_js.isRTL() ? 'right-start' : 'left-start';\n  const PLACEMENT_TOPCENTER = 'top';\n  const PLACEMENT_BOTTOMCENTER = 'bottom';\n  const Default = {\n    autoClose: true,\n    boundary: 'clippingParents',\n    display: 'dynamic',\n    offset: [0, 2],\n    popperConfig: null,\n    reference: 'toggle'\n  };\n  const DefaultType = {\n    autoClose: '(boolean|string)',\n    boundary: '(string|element)',\n    display: 'string',\n    offset: '(array|string|function)',\n    popperConfig: '(null|object|function)',\n    reference: '(string|element|object)'\n  };\n\n  /**\n   * Class definition\n   */\n\n  class Dropdown extends BaseComponent {\n    constructor(element, config) {\n      super(element, config);\n      this._popper = null;\n      this._parent = this._element.parentNode; // dropdown wrapper\n      // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/\n      this._menu = SelectorEngine.next(this._element, SELECTOR_MENU)[0] || SelectorEngine.prev(this._element, SELECTOR_MENU)[0] || SelectorEngine.findOne(SELECTOR_MENU, this._parent);\n      this._inNavbar = this._detectNavbar();\n    }\n\n    // Getters\n    static get Default() {\n      return Default;\n    }\n    static get DefaultType() {\n      return DefaultType;\n    }\n    static get NAME() {\n      return NAME;\n    }\n\n    // Public\n    toggle() {\n      return this._isShown() ? this.hide() : this.show();\n    }\n    show() {\n      if (index_js.isDisabled(this._element) || this._isShown()) {\n        return;\n      }\n      const relatedTarget = {\n        relatedTarget: this._element\n      };\n      const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, relatedTarget);\n      if (showEvent.defaultPrevented) {\n        return;\n      }\n      this._createPopper();\n\n      // If this is a touch-enabled device we add extra\n      // empty mouseover listeners to the body's immediate children;\n      // only needed because of broken event delegation on iOS\n      // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n      if ('ontouchstart' in document.documentElement && !this._parent.closest(SELECTOR_NAVBAR_NAV)) {\n        for (const element of [].concat(...document.body.children)) {\n          EventHandler.on(element, 'mouseover', index_js.noop);\n        }\n      }\n      this._element.focus();\n      this._element.setAttribute('aria-expanded', true);\n      this._menu.classList.add(CLASS_NAME_SHOW);\n      this._element.classList.add(CLASS_NAME_SHOW);\n      EventHandler.trigger(this._element, EVENT_SHOWN, relatedTarget);\n    }\n    hide() {\n      if (index_js.isDisabled(this._element) || !this._isShown()) {\n        return;\n      }\n      const relatedTarget = {\n        relatedTarget: this._element\n      };\n      this._completeHide(relatedTarget);\n    }\n    dispose() {\n      if (this._popper) {\n        this._popper.destroy();\n      }\n      super.dispose();\n    }\n    update() {\n      this._inNavbar = this._detectNavbar();\n      if (this._popper) {\n        this._popper.update();\n      }\n    }\n\n    // Private\n    _completeHide(relatedTarget) {\n      const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE, relatedTarget);\n      if (hideEvent.defaultPrevented) {\n        return;\n      }\n\n      // If this is a touch-enabled device we remove the extra\n      // empty mouseover listeners we added for iOS support\n      if ('ontouchstart' in document.documentElement) {\n        for (const element of [].concat(...document.body.children)) {\n          EventHandler.off(element, 'mouseover', index_js.noop);\n        }\n      }\n      if (this._popper) {\n        this._popper.destroy();\n      }\n      this._menu.classList.remove(CLASS_NAME_SHOW);\n      this._element.classList.remove(CLASS_NAME_SHOW);\n      this._element.setAttribute('aria-expanded', 'false');\n      Manipulator.removeDataAttribute(this._menu, 'popper');\n      EventHandler.trigger(this._element, EVENT_HIDDEN, relatedTarget);\n    }\n    _getConfig(config) {\n      config = super._getConfig(config);\n      if (typeof config.reference === 'object' && !index_js.isElement(config.reference) && typeof config.reference.getBoundingClientRect !== 'function') {\n        // Popper virtual elements require a getBoundingClientRect method\n        throw new TypeError(`${NAME.toUpperCase()}: Option \"reference\" provided type \"object\" without a required \"getBoundingClientRect\" method.`);\n      }\n      return config;\n    }\n    _createPopper() {\n      if (typeof Popper__namespace === 'undefined') {\n        throw new TypeError('Bootstrap\\'s dropdowns require Popper (https://popper.js.org/docs/v2/)');\n      }\n      let referenceElement = this._element;\n      if (this._config.reference === 'parent') {\n        referenceElement = this._parent;\n      } else if (index_js.isElement(this._config.reference)) {\n        referenceElement = index_js.getElement(this._config.reference);\n      } else if (typeof this._config.reference === 'object') {\n        referenceElement = this._config.reference;\n      }\n      const popperConfig = this._getPopperConfig();\n      this._popper = Popper__namespace.createPopper(referenceElement, this._menu, popperConfig);\n    }\n    _isShown() {\n      return this._menu.classList.contains(CLASS_NAME_SHOW);\n    }\n    _getPlacement() {\n      const parentDropdown = this._parent;\n      if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) {\n        return PLACEMENT_RIGHT;\n      }\n      if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) {\n        return PLACEMENT_LEFT;\n      }\n      if (parentDropdown.classList.contains(CLASS_NAME_DROPUP_CENTER)) {\n        return PLACEMENT_TOPCENTER;\n      }\n      if (parentDropdown.classList.contains(CLASS_NAME_DROPDOWN_CENTER)) {\n        return PLACEMENT_BOTTOMCENTER;\n      }\n\n      // We need to trim the value because custom properties can also include spaces\n      const isEnd = getComputedStyle(this._menu).getPropertyValue('--bs-position').trim() === 'end';\n      if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) {\n        return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP;\n      }\n      return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM;\n    }\n    _detectNavbar() {\n      return this._element.closest(SELECTOR_NAVBAR) !== null;\n    }\n    _getOffset() {\n      const {\n        offset\n      } = this._config;\n      if (typeof offset === 'string') {\n        return offset.split(',').map(value => Number.parseInt(value, 10));\n      }\n      if (typeof offset === 'function') {\n        return popperData => offset(popperData, this._element);\n      }\n      return offset;\n    }\n    _getPopperConfig() {\n      const defaultBsPopperConfig = {\n        placement: this._getPlacement(),\n        modifiers: [{\n          name: 'preventOverflow',\n          options: {\n            boundary: this._config.boundary\n          }\n        }, {\n          name: 'offset',\n          options: {\n            offset: this._getOffset()\n          }\n        }]\n      };\n\n      // Disable Popper if we have a static display or Dropdown is in Navbar\n      if (this._inNavbar || this._config.display === 'static') {\n        Manipulator.setDataAttribute(this._menu, 'popper', 'static'); // TODO: v6 remove\n        defaultBsPopperConfig.modifiers = [{\n          name: 'applyStyles',\n          enabled: false\n        }];\n      }\n      return {\n        ...defaultBsPopperConfig,\n        ...index_js.execute(this._config.popperConfig, [undefined, defaultBsPopperConfig])\n      };\n    }\n    _selectMenuItem({\n      key,\n      target\n    }) {\n      const items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, this._menu).filter(element => index_js.isVisible(element));\n      if (!items.length) {\n        return;\n      }\n\n      // if target isn't included in items (e.g. when expanding the dropdown)\n      // allow cycling to get the last item in case key equals ARROW_UP_KEY\n      index_js.getNextActiveElement(items, target, key === ARROW_DOWN_KEY, !items.includes(target)).focus();\n    }\n\n    // Static\n    static jQueryInterface(config) {\n      return this.each(function () {\n        const data = Dropdown.getOrCreateInstance(this, config);\n        if (typeof config !== 'string') {\n          return;\n        }\n        if (typeof data[config] === 'undefined') {\n          throw new TypeError(`No method named \"${config}\"`);\n        }\n        data[config]();\n      });\n    }\n    static clearMenus(event) {\n      if (event.button === RIGHT_MOUSE_BUTTON || event.type === 'keyup' && event.key !== TAB_KEY) {\n        return;\n      }\n      const openToggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE_SHOWN);\n      for (const toggle of openToggles) {\n        const context = Dropdown.getInstance(toggle);\n        if (!context || context._config.autoClose === false) {\n          continue;\n        }\n        const composedPath = event.composedPath();\n        const isMenuTarget = composedPath.includes(context._menu);\n        if (composedPath.includes(context._element) || context._config.autoClose === 'inside' && !isMenuTarget || context._config.autoClose === 'outside' && isMenuTarget) {\n          continue;\n        }\n\n        // Tab navigation through the dropdown menu or events from contained inputs shouldn't close the menu\n        if (context._menu.contains(event.target) && (event.type === 'keyup' && event.key === TAB_KEY || /input|select|option|textarea|form/i.test(event.target.tagName))) {\n          continue;\n        }\n        const relatedTarget = {\n          relatedTarget: context._element\n        };\n        if (event.type === 'click') {\n          relatedTarget.clickEvent = event;\n        }\n        context._completeHide(relatedTarget);\n      }\n    }\n    static dataApiKeydownHandler(event) {\n      // If not an UP | DOWN | ESCAPE key => not a dropdown command\n      // If input/textarea && if key is other than ESCAPE => not a dropdown command\n\n      const isInput = /input|textarea/i.test(event.target.tagName);\n      const isEscapeEvent = event.key === ESCAPE_KEY;\n      const isUpOrDownEvent = [ARROW_UP_KEY, ARROW_DOWN_KEY].includes(event.key);\n      if (!isUpOrDownEvent && !isEscapeEvent) {\n        return;\n      }\n      if (isInput && !isEscapeEvent) {\n        return;\n      }\n      event.preventDefault();\n\n      // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/\n      const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE) ? this : SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE)[0] || SelectorEngine.next(this, SELECTOR_DATA_TOGGLE)[0] || SelectorEngine.findOne(SELECTOR_DATA_TOGGLE, event.delegateTarget.parentNode);\n      const instance = Dropdown.getOrCreateInstance(getToggleButton);\n      if (isUpOrDownEvent) {\n        event.stopPropagation();\n        instance.show();\n        instance._selectMenuItem(event);\n        return;\n      }\n      if (instance._isShown()) {\n        // else is escape and we check if it is shown\n        event.stopPropagation();\n        instance.hide();\n        getToggleButton.focus();\n      }\n    }\n  }\n\n  /**\n   * Data API implementation\n   */\n\n  EventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE, Dropdown.dataApiKeydownHandler);\n  EventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler);\n  EventHandler.on(document, EVENT_CLICK_DATA_API, Dropdown.clearMenus);\n  EventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus);\n  EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n    event.preventDefault();\n    Dropdown.getOrCreateInstance(this).toggle();\n  });\n\n  /**\n   * jQuery\n   */\n\n  index_js.defineJQueryPlugin(Dropdown);\n\n  return Dropdown;\n\n}));\n//# sourceMappingURL=dropdown.js.map\n"
  },
  {
    "path": "js/dist/modal.js",
    "content": "/*!\n  * Bootstrap modal.js v5.3.8 (https://getbootstrap.com/)\n  * Copyright 2011-2025 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n  */\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('./base-component.js'), require('./dom/event-handler.js'), require('./dom/selector-engine.js'), require('./util/backdrop.js'), require('./util/component-functions.js'), require('./util/focustrap.js'), require('./util/index.js'), require('./util/scrollbar.js')) :\n  typeof define === 'function' && define.amd ? define(['./base-component', './dom/event-handler', './dom/selector-engine', './util/backdrop', './util/component-functions', './util/focustrap', './util/index', './util/scrollbar'], factory) :\n  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Modal = factory(global.BaseComponent, global.EventHandler, global.SelectorEngine, global.Backdrop, global.ComponentFunctions, global.Focustrap, global.Index, global.Scrollbar));\n})(this, (function (BaseComponent, EventHandler, SelectorEngine, Backdrop, componentFunctions_js, FocusTrap, index_js, ScrollBarHelper) { 'use strict';\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap modal.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n\n  /**\n   * Constants\n   */\n\n  const NAME = 'modal';\n  const DATA_KEY = 'bs.modal';\n  const EVENT_KEY = `.${DATA_KEY}`;\n  const DATA_API_KEY = '.data-api';\n  const ESCAPE_KEY = 'Escape';\n  const EVENT_HIDE = `hide${EVENT_KEY}`;\n  const EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY}`;\n  const EVENT_HIDDEN = `hidden${EVENT_KEY}`;\n  const EVENT_SHOW = `show${EVENT_KEY}`;\n  const EVENT_SHOWN = `shown${EVENT_KEY}`;\n  const EVENT_RESIZE = `resize${EVENT_KEY}`;\n  const EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY}`;\n  const EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY}`;\n  const EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`;\n  const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`;\n  const CLASS_NAME_OPEN = 'modal-open';\n  const CLASS_NAME_FADE = 'fade';\n  const CLASS_NAME_SHOW = 'show';\n  const CLASS_NAME_STATIC = 'modal-static';\n  const OPEN_SELECTOR = '.modal.show';\n  const SELECTOR_DIALOG = '.modal-dialog';\n  const SELECTOR_MODAL_BODY = '.modal-body';\n  const SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"modal\"]';\n  const Default = {\n    backdrop: true,\n    focus: true,\n    keyboard: true\n  };\n  const DefaultType = {\n    backdrop: '(boolean|string)',\n    focus: 'boolean',\n    keyboard: 'boolean'\n  };\n\n  /**\n   * Class definition\n   */\n\n  class Modal extends BaseComponent {\n    constructor(element, config) {\n      super(element, config);\n      this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, this._element);\n      this._backdrop = this._initializeBackDrop();\n      this._focustrap = this._initializeFocusTrap();\n      this._isShown = false;\n      this._isTransitioning = false;\n      this._scrollBar = new ScrollBarHelper();\n      this._addEventListeners();\n    }\n\n    // Getters\n    static get Default() {\n      return Default;\n    }\n    static get DefaultType() {\n      return DefaultType;\n    }\n    static get NAME() {\n      return NAME;\n    }\n\n    // Public\n    toggle(relatedTarget) {\n      return this._isShown ? this.hide() : this.show(relatedTarget);\n    }\n    show(relatedTarget) {\n      if (this._isShown || this._isTransitioning) {\n        return;\n      }\n      const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, {\n        relatedTarget\n      });\n      if (showEvent.defaultPrevented) {\n        return;\n      }\n      this._isShown = true;\n      this._isTransitioning = true;\n      this._scrollBar.hide();\n      document.body.classList.add(CLASS_NAME_OPEN);\n      this._adjustDialog();\n      this._backdrop.show(() => this._showElement(relatedTarget));\n    }\n    hide() {\n      if (!this._isShown || this._isTransitioning) {\n        return;\n      }\n      const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE);\n      if (hideEvent.defaultPrevented) {\n        return;\n      }\n      this._isShown = false;\n      this._isTransitioning = true;\n      this._focustrap.deactivate();\n      this._element.classList.remove(CLASS_NAME_SHOW);\n      this._queueCallback(() => this._hideModal(), this._element, this._isAnimated());\n    }\n    dispose() {\n      EventHandler.off(window, EVENT_KEY);\n      EventHandler.off(this._dialog, EVENT_KEY);\n      this._backdrop.dispose();\n      this._focustrap.deactivate();\n      super.dispose();\n    }\n    handleUpdate() {\n      this._adjustDialog();\n    }\n\n    // Private\n    _initializeBackDrop() {\n      return new Backdrop({\n        isVisible: Boolean(this._config.backdrop),\n        // 'static' option will be translated to true, and booleans will keep their value,\n        isAnimated: this._isAnimated()\n      });\n    }\n    _initializeFocusTrap() {\n      return new FocusTrap({\n        trapElement: this._element\n      });\n    }\n    _showElement(relatedTarget) {\n      // try to append dynamic modal\n      if (!document.body.contains(this._element)) {\n        document.body.append(this._element);\n      }\n      this._element.style.display = 'block';\n      this._element.removeAttribute('aria-hidden');\n      this._element.setAttribute('aria-modal', true);\n      this._element.setAttribute('role', 'dialog');\n      this._element.scrollTop = 0;\n      const modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog);\n      if (modalBody) {\n        modalBody.scrollTop = 0;\n      }\n      index_js.reflow(this._element);\n      this._element.classList.add(CLASS_NAME_SHOW);\n      const transitionComplete = () => {\n        if (this._config.focus) {\n          this._focustrap.activate();\n        }\n        this._isTransitioning = false;\n        EventHandler.trigger(this._element, EVENT_SHOWN, {\n          relatedTarget\n        });\n      };\n      this._queueCallback(transitionComplete, this._dialog, this._isAnimated());\n    }\n    _addEventListeners() {\n      EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {\n        if (event.key !== ESCAPE_KEY) {\n          return;\n        }\n        if (this._config.keyboard) {\n          this.hide();\n          return;\n        }\n        this._triggerBackdropTransition();\n      });\n      EventHandler.on(window, EVENT_RESIZE, () => {\n        if (this._isShown && !this._isTransitioning) {\n          this._adjustDialog();\n        }\n      });\n      EventHandler.on(this._element, EVENT_MOUSEDOWN_DISMISS, event => {\n        // a bad trick to segregate clicks that may start inside dialog but end outside, and avoid listen to scrollbar clicks\n        EventHandler.one(this._element, EVENT_CLICK_DISMISS, event2 => {\n          if (this._element !== event.target || this._element !== event2.target) {\n            return;\n          }\n          if (this._config.backdrop === 'static') {\n            this._triggerBackdropTransition();\n            return;\n          }\n          if (this._config.backdrop) {\n            this.hide();\n          }\n        });\n      });\n    }\n    _hideModal() {\n      this._element.style.display = 'none';\n      this._element.setAttribute('aria-hidden', true);\n      this._element.removeAttribute('aria-modal');\n      this._element.removeAttribute('role');\n      this._isTransitioning = false;\n      this._backdrop.hide(() => {\n        document.body.classList.remove(CLASS_NAME_OPEN);\n        this._resetAdjustments();\n        this._scrollBar.reset();\n        EventHandler.trigger(this._element, EVENT_HIDDEN);\n      });\n    }\n    _isAnimated() {\n      return this._element.classList.contains(CLASS_NAME_FADE);\n    }\n    _triggerBackdropTransition() {\n      const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED);\n      if (hideEvent.defaultPrevented) {\n        return;\n      }\n      const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;\n      const initialOverflowY = this._element.style.overflowY;\n      // return if the following background transition hasn't yet completed\n      if (initialOverflowY === 'hidden' || this._element.classList.contains(CLASS_NAME_STATIC)) {\n        return;\n      }\n      if (!isModalOverflowing) {\n        this._element.style.overflowY = 'hidden';\n      }\n      this._element.classList.add(CLASS_NAME_STATIC);\n      this._queueCallback(() => {\n        this._element.classList.remove(CLASS_NAME_STATIC);\n        this._queueCallback(() => {\n          this._element.style.overflowY = initialOverflowY;\n        }, this._dialog);\n      }, this._dialog);\n      this._element.focus();\n    }\n\n    /**\n     * The following methods are used to handle overflowing modals\n     */\n\n    _adjustDialog() {\n      const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;\n      const scrollbarWidth = this._scrollBar.getWidth();\n      const isBodyOverflowing = scrollbarWidth > 0;\n      if (isBodyOverflowing && !isModalOverflowing) {\n        const property = index_js.isRTL() ? 'paddingLeft' : 'paddingRight';\n        this._element.style[property] = `${scrollbarWidth}px`;\n      }\n      if (!isBodyOverflowing && isModalOverflowing) {\n        const property = index_js.isRTL() ? 'paddingRight' : 'paddingLeft';\n        this._element.style[property] = `${scrollbarWidth}px`;\n      }\n    }\n    _resetAdjustments() {\n      this._element.style.paddingLeft = '';\n      this._element.style.paddingRight = '';\n    }\n\n    // Static\n    static jQueryInterface(config, relatedTarget) {\n      return this.each(function () {\n        const data = Modal.getOrCreateInstance(this, config);\n        if (typeof config !== 'string') {\n          return;\n        }\n        if (typeof data[config] === 'undefined') {\n          throw new TypeError(`No method named \"${config}\"`);\n        }\n        data[config](relatedTarget);\n      });\n    }\n  }\n\n  /**\n   * Data API implementation\n   */\n\n  EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n    const target = SelectorEngine.getElementFromSelector(this);\n    if (['A', 'AREA'].includes(this.tagName)) {\n      event.preventDefault();\n    }\n    EventHandler.one(target, EVENT_SHOW, showEvent => {\n      if (showEvent.defaultPrevented) {\n        // only register focus restorer if modal will actually get shown\n        return;\n      }\n      EventHandler.one(target, EVENT_HIDDEN, () => {\n        if (index_js.isVisible(this)) {\n          this.focus();\n        }\n      });\n    });\n\n    // avoid conflict when clicking modal toggler while another one is open\n    const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR);\n    if (alreadyOpen) {\n      Modal.getInstance(alreadyOpen).hide();\n    }\n    const data = Modal.getOrCreateInstance(target);\n    data.toggle(this);\n  });\n  componentFunctions_js.enableDismissTrigger(Modal);\n\n  /**\n   * jQuery\n   */\n\n  index_js.defineJQueryPlugin(Modal);\n\n  return Modal;\n\n}));\n//# sourceMappingURL=modal.js.map\n"
  },
  {
    "path": "js/dist/offcanvas.js",
    "content": "/*!\n  * Bootstrap offcanvas.js v5.3.8 (https://getbootstrap.com/)\n  * Copyright 2011-2025 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n  */\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('./base-component.js'), require('./dom/event-handler.js'), require('./dom/selector-engine.js'), require('./util/backdrop.js'), require('./util/component-functions.js'), require('./util/focustrap.js'), require('./util/index.js'), require('./util/scrollbar.js')) :\n  typeof define === 'function' && define.amd ? define(['./base-component', './dom/event-handler', './dom/selector-engine', './util/backdrop', './util/component-functions', './util/focustrap', './util/index', './util/scrollbar'], factory) :\n  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Offcanvas = factory(global.BaseComponent, global.EventHandler, global.SelectorEngine, global.Backdrop, global.ComponentFunctions, global.Focustrap, global.Index, global.Scrollbar));\n})(this, (function (BaseComponent, EventHandler, SelectorEngine, Backdrop, componentFunctions_js, FocusTrap, index_js, ScrollBarHelper) { 'use strict';\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap offcanvas.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n\n  /**\n   * Constants\n   */\n\n  const NAME = 'offcanvas';\n  const DATA_KEY = 'bs.offcanvas';\n  const EVENT_KEY = `.${DATA_KEY}`;\n  const DATA_API_KEY = '.data-api';\n  const EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`;\n  const ESCAPE_KEY = 'Escape';\n  const CLASS_NAME_SHOW = 'show';\n  const CLASS_NAME_SHOWING = 'showing';\n  const CLASS_NAME_HIDING = 'hiding';\n  const CLASS_NAME_BACKDROP = 'offcanvas-backdrop';\n  const OPEN_SELECTOR = '.offcanvas.show';\n  const EVENT_SHOW = `show${EVENT_KEY}`;\n  const EVENT_SHOWN = `shown${EVENT_KEY}`;\n  const EVENT_HIDE = `hide${EVENT_KEY}`;\n  const EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY}`;\n  const EVENT_HIDDEN = `hidden${EVENT_KEY}`;\n  const EVENT_RESIZE = `resize${EVENT_KEY}`;\n  const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`;\n  const EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`;\n  const SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"offcanvas\"]';\n  const Default = {\n    backdrop: true,\n    keyboard: true,\n    scroll: false\n  };\n  const DefaultType = {\n    backdrop: '(boolean|string)',\n    keyboard: 'boolean',\n    scroll: 'boolean'\n  };\n\n  /**\n   * Class definition\n   */\n\n  class Offcanvas extends BaseComponent {\n    constructor(element, config) {\n      super(element, config);\n      this._isShown = false;\n      this._backdrop = this._initializeBackDrop();\n      this._focustrap = this._initializeFocusTrap();\n      this._addEventListeners();\n    }\n\n    // Getters\n    static get Default() {\n      return Default;\n    }\n    static get DefaultType() {\n      return DefaultType;\n    }\n    static get NAME() {\n      return NAME;\n    }\n\n    // Public\n    toggle(relatedTarget) {\n      return this._isShown ? this.hide() : this.show(relatedTarget);\n    }\n    show(relatedTarget) {\n      if (this._isShown) {\n        return;\n      }\n      const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, {\n        relatedTarget\n      });\n      if (showEvent.defaultPrevented) {\n        return;\n      }\n      this._isShown = true;\n      this._backdrop.show();\n      if (!this._config.scroll) {\n        new ScrollBarHelper().hide();\n      }\n      this._element.setAttribute('aria-modal', true);\n      this._element.setAttribute('role', 'dialog');\n      this._element.classList.add(CLASS_NAME_SHOWING);\n      const completeCallBack = () => {\n        if (!this._config.scroll || this._config.backdrop) {\n          this._focustrap.activate();\n        }\n        this._element.classList.add(CLASS_NAME_SHOW);\n        this._element.classList.remove(CLASS_NAME_SHOWING);\n        EventHandler.trigger(this._element, EVENT_SHOWN, {\n          relatedTarget\n        });\n      };\n      this._queueCallback(completeCallBack, this._element, true);\n    }\n    hide() {\n      if (!this._isShown) {\n        return;\n      }\n      const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE);\n      if (hideEvent.defaultPrevented) {\n        return;\n      }\n      this._focustrap.deactivate();\n      this._element.blur();\n      this._isShown = false;\n      this._element.classList.add(CLASS_NAME_HIDING);\n      this._backdrop.hide();\n      const completeCallback = () => {\n        this._element.classList.remove(CLASS_NAME_SHOW, CLASS_NAME_HIDING);\n        this._element.removeAttribute('aria-modal');\n        this._element.removeAttribute('role');\n        if (!this._config.scroll) {\n          new ScrollBarHelper().reset();\n        }\n        EventHandler.trigger(this._element, EVENT_HIDDEN);\n      };\n      this._queueCallback(completeCallback, this._element, true);\n    }\n    dispose() {\n      this._backdrop.dispose();\n      this._focustrap.deactivate();\n      super.dispose();\n    }\n\n    // Private\n    _initializeBackDrop() {\n      const clickCallback = () => {\n        if (this._config.backdrop === 'static') {\n          EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED);\n          return;\n        }\n        this.hide();\n      };\n\n      // 'static' option will be translated to true, and booleans will keep their value\n      const isVisible = Boolean(this._config.backdrop);\n      return new Backdrop({\n        className: CLASS_NAME_BACKDROP,\n        isVisible,\n        isAnimated: true,\n        rootElement: this._element.parentNode,\n        clickCallback: isVisible ? clickCallback : null\n      });\n    }\n    _initializeFocusTrap() {\n      return new FocusTrap({\n        trapElement: this._element\n      });\n    }\n    _addEventListeners() {\n      EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {\n        if (event.key !== ESCAPE_KEY) {\n          return;\n        }\n        if (this._config.keyboard) {\n          this.hide();\n          return;\n        }\n        EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED);\n      });\n    }\n\n    // Static\n    static jQueryInterface(config) {\n      return this.each(function () {\n        const data = Offcanvas.getOrCreateInstance(this, config);\n        if (typeof config !== 'string') {\n          return;\n        }\n        if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n          throw new TypeError(`No method named \"${config}\"`);\n        }\n        data[config](this);\n      });\n    }\n  }\n\n  /**\n   * Data API implementation\n   */\n\n  EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n    const target = SelectorEngine.getElementFromSelector(this);\n    if (['A', 'AREA'].includes(this.tagName)) {\n      event.preventDefault();\n    }\n    if (index_js.isDisabled(this)) {\n      return;\n    }\n    EventHandler.one(target, EVENT_HIDDEN, () => {\n      // focus on trigger when it is closed\n      if (index_js.isVisible(this)) {\n        this.focus();\n      }\n    });\n\n    // avoid conflict when clicking a toggler of an offcanvas, while another is open\n    const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR);\n    if (alreadyOpen && alreadyOpen !== target) {\n      Offcanvas.getInstance(alreadyOpen).hide();\n    }\n    const data = Offcanvas.getOrCreateInstance(target);\n    data.toggle(this);\n  });\n  EventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n    for (const selector of SelectorEngine.find(OPEN_SELECTOR)) {\n      Offcanvas.getOrCreateInstance(selector).show();\n    }\n  });\n  EventHandler.on(window, EVENT_RESIZE, () => {\n    for (const element of SelectorEngine.find('[aria-modal][class*=show][class*=offcanvas-]')) {\n      if (getComputedStyle(element).position !== 'fixed') {\n        Offcanvas.getOrCreateInstance(element).hide();\n      }\n    }\n  });\n  componentFunctions_js.enableDismissTrigger(Offcanvas);\n\n  /**\n   * jQuery\n   */\n\n  index_js.defineJQueryPlugin(Offcanvas);\n\n  return Offcanvas;\n\n}));\n//# sourceMappingURL=offcanvas.js.map\n"
  },
  {
    "path": "js/dist/popover.js",
    "content": "/*!\n  * Bootstrap popover.js v5.3.8 (https://getbootstrap.com/)\n  * Copyright 2011-2025 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n  */\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('./tooltip.js'), require('./util/index.js')) :\n  typeof define === 'function' && define.amd ? define(['./tooltip', './util/index'], factory) :\n  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Popover = factory(global.Tooltip, global.Index));\n})(this, (function (Tooltip, index_js) { 'use strict';\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap popover.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n\n  /**\n   * Constants\n   */\n\n  const NAME = 'popover';\n  const SELECTOR_TITLE = '.popover-header';\n  const SELECTOR_CONTENT = '.popover-body';\n  const Default = {\n    ...Tooltip.Default,\n    content: '',\n    offset: [0, 8],\n    placement: 'right',\n    template: '<div class=\"popover\" role=\"tooltip\">' + '<div class=\"popover-arrow\"></div>' + '<h3 class=\"popover-header\"></h3>' + '<div class=\"popover-body\"></div>' + '</div>',\n    trigger: 'click'\n  };\n  const DefaultType = {\n    ...Tooltip.DefaultType,\n    content: '(null|string|element|function)'\n  };\n\n  /**\n   * Class definition\n   */\n\n  class Popover extends Tooltip {\n    // Getters\n    static get Default() {\n      return Default;\n    }\n    static get DefaultType() {\n      return DefaultType;\n    }\n    static get NAME() {\n      return NAME;\n    }\n\n    // Overrides\n    _isWithContent() {\n      return this._getTitle() || this._getContent();\n    }\n\n    // Private\n    _getContentForTemplate() {\n      return {\n        [SELECTOR_TITLE]: this._getTitle(),\n        [SELECTOR_CONTENT]: this._getContent()\n      };\n    }\n    _getContent() {\n      return this._resolvePossibleFunction(this._config.content);\n    }\n\n    // Static\n    static jQueryInterface(config) {\n      return this.each(function () {\n        const data = Popover.getOrCreateInstance(this, config);\n        if (typeof config !== 'string') {\n          return;\n        }\n        if (typeof data[config] === 'undefined') {\n          throw new TypeError(`No method named \"${config}\"`);\n        }\n        data[config]();\n      });\n    }\n  }\n\n  /**\n   * jQuery\n   */\n\n  index_js.defineJQueryPlugin(Popover);\n\n  return Popover;\n\n}));\n//# sourceMappingURL=popover.js.map\n"
  },
  {
    "path": "js/dist/scrollspy.js",
    "content": "/*!\n  * Bootstrap scrollspy.js v5.3.8 (https://getbootstrap.com/)\n  * Copyright 2011-2025 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n  */\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('./base-component.js'), require('./dom/event-handler.js'), require('./dom/selector-engine.js'), require('./util/index.js')) :\n  typeof define === 'function' && define.amd ? define(['./base-component', './dom/event-handler', './dom/selector-engine', './util/index'], factory) :\n  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Scrollspy = factory(global.BaseComponent, global.EventHandler, global.SelectorEngine, global.Index));\n})(this, (function (BaseComponent, EventHandler, SelectorEngine, index_js) { 'use strict';\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap scrollspy.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n\n  /**\n   * Constants\n   */\n\n  const NAME = 'scrollspy';\n  const DATA_KEY = 'bs.scrollspy';\n  const EVENT_KEY = `.${DATA_KEY}`;\n  const DATA_API_KEY = '.data-api';\n  const EVENT_ACTIVATE = `activate${EVENT_KEY}`;\n  const EVENT_CLICK = `click${EVENT_KEY}`;\n  const EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`;\n  const CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item';\n  const CLASS_NAME_ACTIVE = 'active';\n  const SELECTOR_DATA_SPY = '[data-bs-spy=\"scroll\"]';\n  const SELECTOR_TARGET_LINKS = '[href]';\n  const SELECTOR_NAV_LIST_GROUP = '.nav, .list-group';\n  const SELECTOR_NAV_LINKS = '.nav-link';\n  const SELECTOR_NAV_ITEMS = '.nav-item';\n  const SELECTOR_LIST_ITEMS = '.list-group-item';\n  const SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_NAV_ITEMS} > ${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`;\n  const SELECTOR_DROPDOWN = '.dropdown';\n  const SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle';\n  const Default = {\n    offset: null,\n    // TODO: v6 @deprecated, keep it for backwards compatibility reasons\n    rootMargin: '0px 0px -25%',\n    smoothScroll: false,\n    target: null,\n    threshold: [0.1, 0.5, 1]\n  };\n  const DefaultType = {\n    offset: '(number|null)',\n    // TODO v6 @deprecated, keep it for backwards compatibility reasons\n    rootMargin: 'string',\n    smoothScroll: 'boolean',\n    target: 'element',\n    threshold: 'array'\n  };\n\n  /**\n   * Class definition\n   */\n\n  class ScrollSpy extends BaseComponent {\n    constructor(element, config) {\n      super(element, config);\n\n      // this._element is the observablesContainer and config.target the menu links wrapper\n      this._targetLinks = new Map();\n      this._observableSections = new Map();\n      this._rootElement = getComputedStyle(this._element).overflowY === 'visible' ? null : this._element;\n      this._activeTarget = null;\n      this._observer = null;\n      this._previousScrollData = {\n        visibleEntryTop: 0,\n        parentScrollTop: 0\n      };\n      this.refresh(); // initialize\n    }\n\n    // Getters\n    static get Default() {\n      return Default;\n    }\n    static get DefaultType() {\n      return DefaultType;\n    }\n    static get NAME() {\n      return NAME;\n    }\n\n    // Public\n    refresh() {\n      this._initializeTargetsAndObservables();\n      this._maybeEnableSmoothScroll();\n      if (this._observer) {\n        this._observer.disconnect();\n      } else {\n        this._observer = this._getNewObserver();\n      }\n      for (const section of this._observableSections.values()) {\n        this._observer.observe(section);\n      }\n    }\n    dispose() {\n      this._observer.disconnect();\n      super.dispose();\n    }\n\n    // Private\n    _configAfterMerge(config) {\n      // TODO: on v6 target should be given explicitly & remove the {target: 'ss-target'} case\n      config.target = index_js.getElement(config.target) || document.body;\n\n      // TODO: v6 Only for backwards compatibility reasons. Use rootMargin only\n      config.rootMargin = config.offset ? `${config.offset}px 0px -30%` : config.rootMargin;\n      if (typeof config.threshold === 'string') {\n        config.threshold = config.threshold.split(',').map(value => Number.parseFloat(value));\n      }\n      return config;\n    }\n    _maybeEnableSmoothScroll() {\n      if (!this._config.smoothScroll) {\n        return;\n      }\n\n      // unregister any previous listeners\n      EventHandler.off(this._config.target, EVENT_CLICK);\n      EventHandler.on(this._config.target, EVENT_CLICK, SELECTOR_TARGET_LINKS, event => {\n        const observableSection = this._observableSections.get(event.target.hash);\n        if (observableSection) {\n          event.preventDefault();\n          const root = this._rootElement || window;\n          const height = observableSection.offsetTop - this._element.offsetTop;\n          if (root.scrollTo) {\n            root.scrollTo({\n              top: height,\n              behavior: 'smooth'\n            });\n            return;\n          }\n\n          // Chrome 60 doesn't support `scrollTo`\n          root.scrollTop = height;\n        }\n      });\n    }\n    _getNewObserver() {\n      const options = {\n        root: this._rootElement,\n        threshold: this._config.threshold,\n        rootMargin: this._config.rootMargin\n      };\n      return new IntersectionObserver(entries => this._observerCallback(entries), options);\n    }\n\n    // The logic of selection\n    _observerCallback(entries) {\n      const targetElement = entry => this._targetLinks.get(`#${entry.target.id}`);\n      const activate = entry => {\n        this._previousScrollData.visibleEntryTop = entry.target.offsetTop;\n        this._process(targetElement(entry));\n      };\n      const parentScrollTop = (this._rootElement || document.documentElement).scrollTop;\n      const userScrollsDown = parentScrollTop >= this._previousScrollData.parentScrollTop;\n      this._previousScrollData.parentScrollTop = parentScrollTop;\n      for (const entry of entries) {\n        if (!entry.isIntersecting) {\n          this._activeTarget = null;\n          this._clearActiveClass(targetElement(entry));\n          continue;\n        }\n        const entryIsLowerThanPrevious = entry.target.offsetTop >= this._previousScrollData.visibleEntryTop;\n        // if we are scrolling down, pick the bigger offsetTop\n        if (userScrollsDown && entryIsLowerThanPrevious) {\n          activate(entry);\n          // if parent isn't scrolled, let's keep the first visible item, breaking the iteration\n          if (!parentScrollTop) {\n            return;\n          }\n          continue;\n        }\n\n        // if we are scrolling up, pick the smallest offsetTop\n        if (!userScrollsDown && !entryIsLowerThanPrevious) {\n          activate(entry);\n        }\n      }\n    }\n    _initializeTargetsAndObservables() {\n      this._targetLinks = new Map();\n      this._observableSections = new Map();\n      const targetLinks = SelectorEngine.find(SELECTOR_TARGET_LINKS, this._config.target);\n      for (const anchor of targetLinks) {\n        // ensure that the anchor has an id and is not disabled\n        if (!anchor.hash || index_js.isDisabled(anchor)) {\n          continue;\n        }\n        const observableSection = SelectorEngine.findOne(decodeURI(anchor.hash), this._element);\n\n        // ensure that the observableSection exists & is visible\n        if (index_js.isVisible(observableSection)) {\n          this._targetLinks.set(decodeURI(anchor.hash), anchor);\n          this._observableSections.set(anchor.hash, observableSection);\n        }\n      }\n    }\n    _process(target) {\n      if (this._activeTarget === target) {\n        return;\n      }\n      this._clearActiveClass(this._config.target);\n      this._activeTarget = target;\n      target.classList.add(CLASS_NAME_ACTIVE);\n      this._activateParents(target);\n      EventHandler.trigger(this._element, EVENT_ACTIVATE, {\n        relatedTarget: target\n      });\n    }\n    _activateParents(target) {\n      // Activate dropdown parents\n      if (target.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) {\n        SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE, target.closest(SELECTOR_DROPDOWN)).classList.add(CLASS_NAME_ACTIVE);\n        return;\n      }\n      for (const listGroup of SelectorEngine.parents(target, SELECTOR_NAV_LIST_GROUP)) {\n        // Set triggered links parents as active\n        // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor\n        for (const item of SelectorEngine.prev(listGroup, SELECTOR_LINK_ITEMS)) {\n          item.classList.add(CLASS_NAME_ACTIVE);\n        }\n      }\n    }\n    _clearActiveClass(parent) {\n      parent.classList.remove(CLASS_NAME_ACTIVE);\n      const activeNodes = SelectorEngine.find(`${SELECTOR_TARGET_LINKS}.${CLASS_NAME_ACTIVE}`, parent);\n      for (const node of activeNodes) {\n        node.classList.remove(CLASS_NAME_ACTIVE);\n      }\n    }\n\n    // Static\n    static jQueryInterface(config) {\n      return this.each(function () {\n        const data = ScrollSpy.getOrCreateInstance(this, config);\n        if (typeof config !== 'string') {\n          return;\n        }\n        if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n          throw new TypeError(`No method named \"${config}\"`);\n        }\n        data[config]();\n      });\n    }\n  }\n\n  /**\n   * Data API implementation\n   */\n\n  EventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n    for (const spy of SelectorEngine.find(SELECTOR_DATA_SPY)) {\n      ScrollSpy.getOrCreateInstance(spy);\n    }\n  });\n\n  /**\n   * jQuery\n   */\n\n  index_js.defineJQueryPlugin(ScrollSpy);\n\n  return ScrollSpy;\n\n}));\n//# sourceMappingURL=scrollspy.js.map\n"
  },
  {
    "path": "js/dist/tab.js",
    "content": "/*!\n  * Bootstrap tab.js v5.3.8 (https://getbootstrap.com/)\n  * Copyright 2011-2025 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n  */\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('./base-component.js'), require('./dom/event-handler.js'), require('./dom/selector-engine.js'), require('./util/index.js')) :\n  typeof define === 'function' && define.amd ? define(['./base-component', './dom/event-handler', './dom/selector-engine', './util/index'], factory) :\n  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Tab = factory(global.BaseComponent, global.EventHandler, global.SelectorEngine, global.Index));\n})(this, (function (BaseComponent, EventHandler, SelectorEngine, index_js) { 'use strict';\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap tab.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n\n  /**\n   * Constants\n   */\n\n  const NAME = 'tab';\n  const DATA_KEY = 'bs.tab';\n  const EVENT_KEY = `.${DATA_KEY}`;\n  const EVENT_HIDE = `hide${EVENT_KEY}`;\n  const EVENT_HIDDEN = `hidden${EVENT_KEY}`;\n  const EVENT_SHOW = `show${EVENT_KEY}`;\n  const EVENT_SHOWN = `shown${EVENT_KEY}`;\n  const EVENT_CLICK_DATA_API = `click${EVENT_KEY}`;\n  const EVENT_KEYDOWN = `keydown${EVENT_KEY}`;\n  const EVENT_LOAD_DATA_API = `load${EVENT_KEY}`;\n  const ARROW_LEFT_KEY = 'ArrowLeft';\n  const ARROW_RIGHT_KEY = 'ArrowRight';\n  const ARROW_UP_KEY = 'ArrowUp';\n  const ARROW_DOWN_KEY = 'ArrowDown';\n  const HOME_KEY = 'Home';\n  const END_KEY = 'End';\n  const CLASS_NAME_ACTIVE = 'active';\n  const CLASS_NAME_FADE = 'fade';\n  const CLASS_NAME_SHOW = 'show';\n  const CLASS_DROPDOWN = 'dropdown';\n  const SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle';\n  const SELECTOR_DROPDOWN_MENU = '.dropdown-menu';\n  const NOT_SELECTOR_DROPDOWN_TOGGLE = `:not(${SELECTOR_DROPDOWN_TOGGLE})`;\n  const SELECTOR_TAB_PANEL = '.list-group, .nav, [role=\"tablist\"]';\n  const SELECTOR_OUTER = '.nav-item, .list-group-item';\n  const SELECTOR_INNER = `.nav-link${NOT_SELECTOR_DROPDOWN_TOGGLE}, .list-group-item${NOT_SELECTOR_DROPDOWN_TOGGLE}, [role=\"tab\"]${NOT_SELECTOR_DROPDOWN_TOGGLE}`;\n  const SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"tab\"], [data-bs-toggle=\"pill\"], [data-bs-toggle=\"list\"]'; // TODO: could only be `tab` in v6\n  const SELECTOR_INNER_ELEM = `${SELECTOR_INNER}, ${SELECTOR_DATA_TOGGLE}`;\n  const SELECTOR_DATA_TOGGLE_ACTIVE = `.${CLASS_NAME_ACTIVE}[data-bs-toggle=\"tab\"], .${CLASS_NAME_ACTIVE}[data-bs-toggle=\"pill\"], .${CLASS_NAME_ACTIVE}[data-bs-toggle=\"list\"]`;\n\n  /**\n   * Class definition\n   */\n\n  class Tab extends BaseComponent {\n    constructor(element) {\n      super(element);\n      this._parent = this._element.closest(SELECTOR_TAB_PANEL);\n      if (!this._parent) {\n        return;\n        // TODO: should throw exception in v6\n        // throw new TypeError(`${element.outerHTML} has not a valid parent ${SELECTOR_INNER_ELEM}`)\n      }\n\n      // Set up initial aria attributes\n      this._setInitialAttributes(this._parent, this._getChildren());\n      EventHandler.on(this._element, EVENT_KEYDOWN, event => this._keydown(event));\n    }\n\n    // Getters\n    static get NAME() {\n      return NAME;\n    }\n\n    // Public\n    show() {\n      // Shows this elem and deactivate the active sibling if exists\n      const innerElem = this._element;\n      if (this._elemIsActive(innerElem)) {\n        return;\n      }\n\n      // Search for active tab on same parent to deactivate it\n      const active = this._getActiveElem();\n      const hideEvent = active ? EventHandler.trigger(active, EVENT_HIDE, {\n        relatedTarget: innerElem\n      }) : null;\n      const showEvent = EventHandler.trigger(innerElem, EVENT_SHOW, {\n        relatedTarget: active\n      });\n      if (showEvent.defaultPrevented || hideEvent && hideEvent.defaultPrevented) {\n        return;\n      }\n      this._deactivate(active, innerElem);\n      this._activate(innerElem, active);\n    }\n\n    // Private\n    _activate(element, relatedElem) {\n      if (!element) {\n        return;\n      }\n      element.classList.add(CLASS_NAME_ACTIVE);\n      this._activate(SelectorEngine.getElementFromSelector(element)); // Search and activate/show the proper section\n\n      const complete = () => {\n        if (element.getAttribute('role') !== 'tab') {\n          element.classList.add(CLASS_NAME_SHOW);\n          return;\n        }\n        element.removeAttribute('tabindex');\n        element.setAttribute('aria-selected', true);\n        this._toggleDropDown(element, true);\n        EventHandler.trigger(element, EVENT_SHOWN, {\n          relatedTarget: relatedElem\n        });\n      };\n      this._queueCallback(complete, element, element.classList.contains(CLASS_NAME_FADE));\n    }\n    _deactivate(element, relatedElem) {\n      if (!element) {\n        return;\n      }\n      element.classList.remove(CLASS_NAME_ACTIVE);\n      element.blur();\n      this._deactivate(SelectorEngine.getElementFromSelector(element)); // Search and deactivate the shown section too\n\n      const complete = () => {\n        if (element.getAttribute('role') !== 'tab') {\n          element.classList.remove(CLASS_NAME_SHOW);\n          return;\n        }\n        element.setAttribute('aria-selected', false);\n        element.setAttribute('tabindex', '-1');\n        this._toggleDropDown(element, false);\n        EventHandler.trigger(element, EVENT_HIDDEN, {\n          relatedTarget: relatedElem\n        });\n      };\n      this._queueCallback(complete, element, element.classList.contains(CLASS_NAME_FADE));\n    }\n    _keydown(event) {\n      if (![ARROW_LEFT_KEY, ARROW_RIGHT_KEY, ARROW_UP_KEY, ARROW_DOWN_KEY, HOME_KEY, END_KEY].includes(event.key)) {\n        return;\n      }\n      event.stopPropagation(); // stopPropagation/preventDefault both added to support up/down keys without scrolling the page\n      event.preventDefault();\n      const children = this._getChildren().filter(element => !index_js.isDisabled(element));\n      let nextActiveElement;\n      if ([HOME_KEY, END_KEY].includes(event.key)) {\n        nextActiveElement = children[event.key === HOME_KEY ? 0 : children.length - 1];\n      } else {\n        const isNext = [ARROW_RIGHT_KEY, ARROW_DOWN_KEY].includes(event.key);\n        nextActiveElement = index_js.getNextActiveElement(children, event.target, isNext, true);\n      }\n      if (nextActiveElement) {\n        nextActiveElement.focus({\n          preventScroll: true\n        });\n        Tab.getOrCreateInstance(nextActiveElement).show();\n      }\n    }\n    _getChildren() {\n      // collection of inner elements\n      return SelectorEngine.find(SELECTOR_INNER_ELEM, this._parent);\n    }\n    _getActiveElem() {\n      return this._getChildren().find(child => this._elemIsActive(child)) || null;\n    }\n    _setInitialAttributes(parent, children) {\n      this._setAttributeIfNotExists(parent, 'role', 'tablist');\n      for (const child of children) {\n        this._setInitialAttributesOnChild(child);\n      }\n    }\n    _setInitialAttributesOnChild(child) {\n      child = this._getInnerElement(child);\n      const isActive = this._elemIsActive(child);\n      const outerElem = this._getOuterElement(child);\n      child.setAttribute('aria-selected', isActive);\n      if (outerElem !== child) {\n        this._setAttributeIfNotExists(outerElem, 'role', 'presentation');\n      }\n      if (!isActive) {\n        child.setAttribute('tabindex', '-1');\n      }\n      this._setAttributeIfNotExists(child, 'role', 'tab');\n\n      // set attributes to the related panel too\n      this._setInitialAttributesOnTargetPanel(child);\n    }\n    _setInitialAttributesOnTargetPanel(child) {\n      const target = SelectorEngine.getElementFromSelector(child);\n      if (!target) {\n        return;\n      }\n      this._setAttributeIfNotExists(target, 'role', 'tabpanel');\n      if (child.id) {\n        this._setAttributeIfNotExists(target, 'aria-labelledby', `${child.id}`);\n      }\n    }\n    _toggleDropDown(element, open) {\n      const outerElem = this._getOuterElement(element);\n      if (!outerElem.classList.contains(CLASS_DROPDOWN)) {\n        return;\n      }\n      const toggle = (selector, className) => {\n        const element = SelectorEngine.findOne(selector, outerElem);\n        if (element) {\n          element.classList.toggle(className, open);\n        }\n      };\n      toggle(SELECTOR_DROPDOWN_TOGGLE, CLASS_NAME_ACTIVE);\n      toggle(SELECTOR_DROPDOWN_MENU, CLASS_NAME_SHOW);\n      outerElem.setAttribute('aria-expanded', open);\n    }\n    _setAttributeIfNotExists(element, attribute, value) {\n      if (!element.hasAttribute(attribute)) {\n        element.setAttribute(attribute, value);\n      }\n    }\n    _elemIsActive(elem) {\n      return elem.classList.contains(CLASS_NAME_ACTIVE);\n    }\n\n    // Try to get the inner element (usually the .nav-link)\n    _getInnerElement(elem) {\n      return elem.matches(SELECTOR_INNER_ELEM) ? elem : SelectorEngine.findOne(SELECTOR_INNER_ELEM, elem);\n    }\n\n    // Try to get the outer element (usually the .nav-item)\n    _getOuterElement(elem) {\n      return elem.closest(SELECTOR_OUTER) || elem;\n    }\n\n    // Static\n    static jQueryInterface(config) {\n      return this.each(function () {\n        const data = Tab.getOrCreateInstance(this);\n        if (typeof config !== 'string') {\n          return;\n        }\n        if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n          throw new TypeError(`No method named \"${config}\"`);\n        }\n        data[config]();\n      });\n    }\n  }\n\n  /**\n   * Data API implementation\n   */\n\n  EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n    if (['A', 'AREA'].includes(this.tagName)) {\n      event.preventDefault();\n    }\n    if (index_js.isDisabled(this)) {\n      return;\n    }\n    Tab.getOrCreateInstance(this).show();\n  });\n\n  /**\n   * Initialize on focus\n   */\n  EventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n    for (const element of SelectorEngine.find(SELECTOR_DATA_TOGGLE_ACTIVE)) {\n      Tab.getOrCreateInstance(element);\n    }\n  });\n  /**\n   * jQuery\n   */\n\n  index_js.defineJQueryPlugin(Tab);\n\n  return Tab;\n\n}));\n//# sourceMappingURL=tab.js.map\n"
  },
  {
    "path": "js/dist/toast.js",
    "content": "/*!\n  * Bootstrap toast.js v5.3.8 (https://getbootstrap.com/)\n  * Copyright 2011-2025 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n  */\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('./base-component.js'), require('./dom/event-handler.js'), require('./util/component-functions.js'), require('./util/index.js')) :\n  typeof define === 'function' && define.amd ? define(['./base-component', './dom/event-handler', './util/component-functions', './util/index'], factory) :\n  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Toast = factory(global.BaseComponent, global.EventHandler, global.ComponentFunctions, global.Index));\n})(this, (function (BaseComponent, EventHandler, componentFunctions_js, index_js) { 'use strict';\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap toast.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n\n  /**\n   * Constants\n   */\n\n  const NAME = 'toast';\n  const DATA_KEY = 'bs.toast';\n  const EVENT_KEY = `.${DATA_KEY}`;\n  const EVENT_MOUSEOVER = `mouseover${EVENT_KEY}`;\n  const EVENT_MOUSEOUT = `mouseout${EVENT_KEY}`;\n  const EVENT_FOCUSIN = `focusin${EVENT_KEY}`;\n  const EVENT_FOCUSOUT = `focusout${EVENT_KEY}`;\n  const EVENT_HIDE = `hide${EVENT_KEY}`;\n  const EVENT_HIDDEN = `hidden${EVENT_KEY}`;\n  const EVENT_SHOW = `show${EVENT_KEY}`;\n  const EVENT_SHOWN = `shown${EVENT_KEY}`;\n  const CLASS_NAME_FADE = 'fade';\n  const CLASS_NAME_HIDE = 'hide'; // @deprecated - kept here only for backwards compatibility\n  const CLASS_NAME_SHOW = 'show';\n  const CLASS_NAME_SHOWING = 'showing';\n  const DefaultType = {\n    animation: 'boolean',\n    autohide: 'boolean',\n    delay: 'number'\n  };\n  const Default = {\n    animation: true,\n    autohide: true,\n    delay: 5000\n  };\n\n  /**\n   * Class definition\n   */\n\n  class Toast extends BaseComponent {\n    constructor(element, config) {\n      super(element, config);\n      this._timeout = null;\n      this._hasMouseInteraction = false;\n      this._hasKeyboardInteraction = false;\n      this._setListeners();\n    }\n\n    // Getters\n    static get Default() {\n      return Default;\n    }\n    static get DefaultType() {\n      return DefaultType;\n    }\n    static get NAME() {\n      return NAME;\n    }\n\n    // Public\n    show() {\n      const showEvent = EventHandler.trigger(this._element, EVENT_SHOW);\n      if (showEvent.defaultPrevented) {\n        return;\n      }\n      this._clearTimeout();\n      if (this._config.animation) {\n        this._element.classList.add(CLASS_NAME_FADE);\n      }\n      const complete = () => {\n        this._element.classList.remove(CLASS_NAME_SHOWING);\n        EventHandler.trigger(this._element, EVENT_SHOWN);\n        this._maybeScheduleHide();\n      };\n      this._element.classList.remove(CLASS_NAME_HIDE); // @deprecated\n      index_js.reflow(this._element);\n      this._element.classList.add(CLASS_NAME_SHOW, CLASS_NAME_SHOWING);\n      this._queueCallback(complete, this._element, this._config.animation);\n    }\n    hide() {\n      if (!this.isShown()) {\n        return;\n      }\n      const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE);\n      if (hideEvent.defaultPrevented) {\n        return;\n      }\n      const complete = () => {\n        this._element.classList.add(CLASS_NAME_HIDE); // @deprecated\n        this._element.classList.remove(CLASS_NAME_SHOWING, CLASS_NAME_SHOW);\n        EventHandler.trigger(this._element, EVENT_HIDDEN);\n      };\n      this._element.classList.add(CLASS_NAME_SHOWING);\n      this._queueCallback(complete, this._element, this._config.animation);\n    }\n    dispose() {\n      this._clearTimeout();\n      if (this.isShown()) {\n        this._element.classList.remove(CLASS_NAME_SHOW);\n      }\n      super.dispose();\n    }\n    isShown() {\n      return this._element.classList.contains(CLASS_NAME_SHOW);\n    }\n\n    // Private\n    _maybeScheduleHide() {\n      if (!this._config.autohide) {\n        return;\n      }\n      if (this._hasMouseInteraction || this._hasKeyboardInteraction) {\n        return;\n      }\n      this._timeout = setTimeout(() => {\n        this.hide();\n      }, this._config.delay);\n    }\n    _onInteraction(event, isInteracting) {\n      switch (event.type) {\n        case 'mouseover':\n        case 'mouseout':\n          {\n            this._hasMouseInteraction = isInteracting;\n            break;\n          }\n        case 'focusin':\n        case 'focusout':\n          {\n            this._hasKeyboardInteraction = isInteracting;\n            break;\n          }\n      }\n      if (isInteracting) {\n        this._clearTimeout();\n        return;\n      }\n      const nextElement = event.relatedTarget;\n      if (this._element === nextElement || this._element.contains(nextElement)) {\n        return;\n      }\n      this._maybeScheduleHide();\n    }\n    _setListeners() {\n      EventHandler.on(this._element, EVENT_MOUSEOVER, event => this._onInteraction(event, true));\n      EventHandler.on(this._element, EVENT_MOUSEOUT, event => this._onInteraction(event, false));\n      EventHandler.on(this._element, EVENT_FOCUSIN, event => this._onInteraction(event, true));\n      EventHandler.on(this._element, EVENT_FOCUSOUT, event => this._onInteraction(event, false));\n    }\n    _clearTimeout() {\n      clearTimeout(this._timeout);\n      this._timeout = null;\n    }\n\n    // Static\n    static jQueryInterface(config) {\n      return this.each(function () {\n        const data = Toast.getOrCreateInstance(this, config);\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(`No method named \"${config}\"`);\n          }\n          data[config](this);\n        }\n      });\n    }\n  }\n\n  /**\n   * Data API implementation\n   */\n\n  componentFunctions_js.enableDismissTrigger(Toast);\n\n  /**\n   * jQuery\n   */\n\n  index_js.defineJQueryPlugin(Toast);\n\n  return Toast;\n\n}));\n//# sourceMappingURL=toast.js.map\n"
  },
  {
    "path": "js/dist/tooltip.js",
    "content": "/*!\n  * Bootstrap tooltip.js v5.3.8 (https://getbootstrap.com/)\n  * Copyright 2011-2025 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n  */\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('@popperjs/core'), require('./base-component.js'), require('./dom/event-handler.js'), require('./dom/manipulator.js'), require('./util/index.js'), require('./util/sanitizer.js'), require('./util/template-factory.js')) :\n  typeof define === 'function' && define.amd ? define(['@popperjs/core', './base-component', './dom/event-handler', './dom/manipulator', './util/index', './util/sanitizer', './util/template-factory'], factory) :\n  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Tooltip = factory(global[\"@popperjs/core\"], global.BaseComponent, global.EventHandler, global.Manipulator, global.Index, global.Sanitizer, global.TemplateFactory));\n})(this, (function (Popper, BaseComponent, EventHandler, Manipulator, index_js, sanitizer_js, TemplateFactory) { 'use strict';\n\n  function _interopNamespaceDefault(e) {\n    const n = Object.create(null, { [Symbol.toStringTag]: { value: 'Module' } });\n    if (e) {\n      for (const k in e) {\n        if (k !== 'default') {\n          const d = Object.getOwnPropertyDescriptor(e, k);\n          Object.defineProperty(n, k, d.get ? d : {\n            enumerable: true,\n            get: () => e[k]\n          });\n        }\n      }\n    }\n    n.default = e;\n    return Object.freeze(n);\n  }\n\n  const Popper__namespace = /*#__PURE__*/_interopNamespaceDefault(Popper);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap tooltip.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n\n  /**\n   * Constants\n   */\n\n  const NAME = 'tooltip';\n  const DISALLOWED_ATTRIBUTES = new Set(['sanitize', 'allowList', 'sanitizeFn']);\n  const CLASS_NAME_FADE = 'fade';\n  const CLASS_NAME_MODAL = 'modal';\n  const CLASS_NAME_SHOW = 'show';\n  const SELECTOR_TOOLTIP_INNER = '.tooltip-inner';\n  const SELECTOR_MODAL = `.${CLASS_NAME_MODAL}`;\n  const EVENT_MODAL_HIDE = 'hide.bs.modal';\n  const TRIGGER_HOVER = 'hover';\n  const TRIGGER_FOCUS = 'focus';\n  const TRIGGER_CLICK = 'click';\n  const TRIGGER_MANUAL = 'manual';\n  const EVENT_HIDE = 'hide';\n  const EVENT_HIDDEN = 'hidden';\n  const EVENT_SHOW = 'show';\n  const EVENT_SHOWN = 'shown';\n  const EVENT_INSERTED = 'inserted';\n  const EVENT_CLICK = 'click';\n  const EVENT_FOCUSIN = 'focusin';\n  const EVENT_FOCUSOUT = 'focusout';\n  const EVENT_MOUSEENTER = 'mouseenter';\n  const EVENT_MOUSELEAVE = 'mouseleave';\n  const AttachmentMap = {\n    AUTO: 'auto',\n    TOP: 'top',\n    RIGHT: index_js.isRTL() ? 'left' : 'right',\n    BOTTOM: 'bottom',\n    LEFT: index_js.isRTL() ? 'right' : 'left'\n  };\n  const Default = {\n    allowList: sanitizer_js.DefaultAllowlist,\n    animation: true,\n    boundary: 'clippingParents',\n    container: false,\n    customClass: '',\n    delay: 0,\n    fallbackPlacements: ['top', 'right', 'bottom', 'left'],\n    html: false,\n    offset: [0, 6],\n    placement: 'top',\n    popperConfig: null,\n    sanitize: true,\n    sanitizeFn: null,\n    selector: false,\n    template: '<div class=\"tooltip\" role=\"tooltip\">' + '<div class=\"tooltip-arrow\"></div>' + '<div class=\"tooltip-inner\"></div>' + '</div>',\n    title: '',\n    trigger: 'hover focus'\n  };\n  const DefaultType = {\n    allowList: 'object',\n    animation: 'boolean',\n    boundary: '(string|element)',\n    container: '(string|element|boolean)',\n    customClass: '(string|function)',\n    delay: '(number|object)',\n    fallbackPlacements: 'array',\n    html: 'boolean',\n    offset: '(array|string|function)',\n    placement: '(string|function)',\n    popperConfig: '(null|object|function)',\n    sanitize: 'boolean',\n    sanitizeFn: '(null|function)',\n    selector: '(string|boolean)',\n    template: 'string',\n    title: '(string|element|function)',\n    trigger: 'string'\n  };\n\n  /**\n   * Class definition\n   */\n\n  class Tooltip extends BaseComponent {\n    constructor(element, config) {\n      if (typeof Popper__namespace === 'undefined') {\n        throw new TypeError('Bootstrap\\'s tooltips require Popper (https://popper.js.org/docs/v2/)');\n      }\n      super(element, config);\n\n      // Private\n      this._isEnabled = true;\n      this._timeout = 0;\n      this._isHovered = null;\n      this._activeTrigger = {};\n      this._popper = null;\n      this._templateFactory = null;\n      this._newContent = null;\n\n      // Protected\n      this.tip = null;\n      this._setListeners();\n      if (!this._config.selector) {\n        this._fixTitle();\n      }\n    }\n\n    // Getters\n    static get Default() {\n      return Default;\n    }\n    static get DefaultType() {\n      return DefaultType;\n    }\n    static get NAME() {\n      return NAME;\n    }\n\n    // Public\n    enable() {\n      this._isEnabled = true;\n    }\n    disable() {\n      this._isEnabled = false;\n    }\n    toggleEnabled() {\n      this._isEnabled = !this._isEnabled;\n    }\n    toggle() {\n      if (!this._isEnabled) {\n        return;\n      }\n      if (this._isShown()) {\n        this._leave();\n        return;\n      }\n      this._enter();\n    }\n    dispose() {\n      clearTimeout(this._timeout);\n      EventHandler.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);\n      if (this._element.getAttribute('data-bs-original-title')) {\n        this._element.setAttribute('title', this._element.getAttribute('data-bs-original-title'));\n      }\n      this._disposePopper();\n      super.dispose();\n    }\n    show() {\n      if (this._element.style.display === 'none') {\n        throw new Error('Please use show on visible elements');\n      }\n      if (!(this._isWithContent() && this._isEnabled)) {\n        return;\n      }\n      const showEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOW));\n      const shadowRoot = index_js.findShadowRoot(this._element);\n      const isInTheDom = (shadowRoot || this._element.ownerDocument.documentElement).contains(this._element);\n      if (showEvent.defaultPrevented || !isInTheDom) {\n        return;\n      }\n\n      // TODO: v6 remove this or make it optional\n      this._disposePopper();\n      const tip = this._getTipElement();\n      this._element.setAttribute('aria-describedby', tip.getAttribute('id'));\n      const {\n        container\n      } = this._config;\n      if (!this._element.ownerDocument.documentElement.contains(this.tip)) {\n        container.append(tip);\n        EventHandler.trigger(this._element, this.constructor.eventName(EVENT_INSERTED));\n      }\n      this._popper = this._createPopper(tip);\n      tip.classList.add(CLASS_NAME_SHOW);\n\n      // If this is a touch-enabled device we add extra\n      // empty mouseover listeners to the body's immediate children;\n      // only needed because of broken event delegation on iOS\n      // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n      if ('ontouchstart' in document.documentElement) {\n        for (const element of [].concat(...document.body.children)) {\n          EventHandler.on(element, 'mouseover', index_js.noop);\n        }\n      }\n      const complete = () => {\n        EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOWN));\n        if (this._isHovered === false) {\n          this._leave();\n        }\n        this._isHovered = false;\n      };\n      this._queueCallback(complete, this.tip, this._isAnimated());\n    }\n    hide() {\n      if (!this._isShown()) {\n        return;\n      }\n      const hideEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDE));\n      if (hideEvent.defaultPrevented) {\n        return;\n      }\n      const tip = this._getTipElement();\n      tip.classList.remove(CLASS_NAME_SHOW);\n\n      // If this is a touch-enabled device we remove the extra\n      // empty mouseover listeners we added for iOS support\n      if ('ontouchstart' in document.documentElement) {\n        for (const element of [].concat(...document.body.children)) {\n          EventHandler.off(element, 'mouseover', index_js.noop);\n        }\n      }\n      this._activeTrigger[TRIGGER_CLICK] = false;\n      this._activeTrigger[TRIGGER_FOCUS] = false;\n      this._activeTrigger[TRIGGER_HOVER] = false;\n      this._isHovered = null; // it is a trick to support manual triggering\n\n      const complete = () => {\n        if (this._isWithActiveTrigger()) {\n          return;\n        }\n        if (!this._isHovered) {\n          this._disposePopper();\n        }\n        this._element.removeAttribute('aria-describedby');\n        EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDDEN));\n      };\n      this._queueCallback(complete, this.tip, this._isAnimated());\n    }\n    update() {\n      if (this._popper) {\n        this._popper.update();\n      }\n    }\n\n    // Protected\n    _isWithContent() {\n      return Boolean(this._getTitle());\n    }\n    _getTipElement() {\n      if (!this.tip) {\n        this.tip = this._createTipElement(this._newContent || this._getContentForTemplate());\n      }\n      return this.tip;\n    }\n    _createTipElement(content) {\n      const tip = this._getTemplateFactory(content).toHtml();\n\n      // TODO: remove this check in v6\n      if (!tip) {\n        return null;\n      }\n      tip.classList.remove(CLASS_NAME_FADE, CLASS_NAME_SHOW);\n      // TODO: v6 the following can be achieved with CSS only\n      tip.classList.add(`bs-${this.constructor.NAME}-auto`);\n      const tipId = index_js.getUID(this.constructor.NAME).toString();\n      tip.setAttribute('id', tipId);\n      if (this._isAnimated()) {\n        tip.classList.add(CLASS_NAME_FADE);\n      }\n      return tip;\n    }\n    setContent(content) {\n      this._newContent = content;\n      if (this._isShown()) {\n        this._disposePopper();\n        this.show();\n      }\n    }\n    _getTemplateFactory(content) {\n      if (this._templateFactory) {\n        this._templateFactory.changeContent(content);\n      } else {\n        this._templateFactory = new TemplateFactory({\n          ...this._config,\n          // the `content` var has to be after `this._config`\n          // to override config.content in case of popover\n          content,\n          extraClass: this._resolvePossibleFunction(this._config.customClass)\n        });\n      }\n      return this._templateFactory;\n    }\n    _getContentForTemplate() {\n      return {\n        [SELECTOR_TOOLTIP_INNER]: this._getTitle()\n      };\n    }\n    _getTitle() {\n      return this._resolvePossibleFunction(this._config.title) || this._element.getAttribute('data-bs-original-title');\n    }\n\n    // Private\n    _initializeOnDelegatedTarget(event) {\n      return this.constructor.getOrCreateInstance(event.delegateTarget, this._getDelegateConfig());\n    }\n    _isAnimated() {\n      return this._config.animation || this.tip && this.tip.classList.contains(CLASS_NAME_FADE);\n    }\n    _isShown() {\n      return this.tip && this.tip.classList.contains(CLASS_NAME_SHOW);\n    }\n    _createPopper(tip) {\n      const placement = index_js.execute(this._config.placement, [this, tip, this._element]);\n      const attachment = AttachmentMap[placement.toUpperCase()];\n      return Popper__namespace.createPopper(this._element, tip, this._getPopperConfig(attachment));\n    }\n    _getOffset() {\n      const {\n        offset\n      } = this._config;\n      if (typeof offset === 'string') {\n        return offset.split(',').map(value => Number.parseInt(value, 10));\n      }\n      if (typeof offset === 'function') {\n        return popperData => offset(popperData, this._element);\n      }\n      return offset;\n    }\n    _resolvePossibleFunction(arg) {\n      return index_js.execute(arg, [this._element, this._element]);\n    }\n    _getPopperConfig(attachment) {\n      const defaultBsPopperConfig = {\n        placement: attachment,\n        modifiers: [{\n          name: 'flip',\n          options: {\n            fallbackPlacements: this._config.fallbackPlacements\n          }\n        }, {\n          name: 'offset',\n          options: {\n            offset: this._getOffset()\n          }\n        }, {\n          name: 'preventOverflow',\n          options: {\n            boundary: this._config.boundary\n          }\n        }, {\n          name: 'arrow',\n          options: {\n            element: `.${this.constructor.NAME}-arrow`\n          }\n        }, {\n          name: 'preSetPlacement',\n          enabled: true,\n          phase: 'beforeMain',\n          fn: data => {\n            // Pre-set Popper's placement attribute in order to read the arrow sizes properly.\n            // Otherwise, Popper mixes up the width and height dimensions since the initial arrow style is for top placement\n            this._getTipElement().setAttribute('data-popper-placement', data.state.placement);\n          }\n        }]\n      };\n      return {\n        ...defaultBsPopperConfig,\n        ...index_js.execute(this._config.popperConfig, [undefined, defaultBsPopperConfig])\n      };\n    }\n    _setListeners() {\n      const triggers = this._config.trigger.split(' ');\n      for (const trigger of triggers) {\n        if (trigger === 'click') {\n          EventHandler.on(this._element, this.constructor.eventName(EVENT_CLICK), this._config.selector, event => {\n            const context = this._initializeOnDelegatedTarget(event);\n            context._activeTrigger[TRIGGER_CLICK] = !(context._isShown() && context._activeTrigger[TRIGGER_CLICK]);\n            context.toggle();\n          });\n        } else if (trigger !== TRIGGER_MANUAL) {\n          const eventIn = trigger === TRIGGER_HOVER ? this.constructor.eventName(EVENT_MOUSEENTER) : this.constructor.eventName(EVENT_FOCUSIN);\n          const eventOut = trigger === TRIGGER_HOVER ? this.constructor.eventName(EVENT_MOUSELEAVE) : this.constructor.eventName(EVENT_FOCUSOUT);\n          EventHandler.on(this._element, eventIn, this._config.selector, event => {\n            const context = this._initializeOnDelegatedTarget(event);\n            context._activeTrigger[event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER] = true;\n            context._enter();\n          });\n          EventHandler.on(this._element, eventOut, this._config.selector, event => {\n            const context = this._initializeOnDelegatedTarget(event);\n            context._activeTrigger[event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER] = context._element.contains(event.relatedTarget);\n            context._leave();\n          });\n        }\n      }\n      this._hideModalHandler = () => {\n        if (this._element) {\n          this.hide();\n        }\n      };\n      EventHandler.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);\n    }\n    _fixTitle() {\n      const title = this._element.getAttribute('title');\n      if (!title) {\n        return;\n      }\n      if (!this._element.getAttribute('aria-label') && !this._element.textContent.trim()) {\n        this._element.setAttribute('aria-label', title);\n      }\n      this._element.setAttribute('data-bs-original-title', title); // DO NOT USE IT. Is only for backwards compatibility\n      this._element.removeAttribute('title');\n    }\n    _enter() {\n      if (this._isShown() || this._isHovered) {\n        this._isHovered = true;\n        return;\n      }\n      this._isHovered = true;\n      this._setTimeout(() => {\n        if (this._isHovered) {\n          this.show();\n        }\n      }, this._config.delay.show);\n    }\n    _leave() {\n      if (this._isWithActiveTrigger()) {\n        return;\n      }\n      this._isHovered = false;\n      this._setTimeout(() => {\n        if (!this._isHovered) {\n          this.hide();\n        }\n      }, this._config.delay.hide);\n    }\n    _setTimeout(handler, timeout) {\n      clearTimeout(this._timeout);\n      this._timeout = setTimeout(handler, timeout);\n    }\n    _isWithActiveTrigger() {\n      return Object.values(this._activeTrigger).includes(true);\n    }\n    _getConfig(config) {\n      const dataAttributes = Manipulator.getDataAttributes(this._element);\n      for (const dataAttribute of Object.keys(dataAttributes)) {\n        if (DISALLOWED_ATTRIBUTES.has(dataAttribute)) {\n          delete dataAttributes[dataAttribute];\n        }\n      }\n      config = {\n        ...dataAttributes,\n        ...(typeof config === 'object' && config ? config : {})\n      };\n      config = this._mergeConfigObj(config);\n      config = this._configAfterMerge(config);\n      this._typeCheckConfig(config);\n      return config;\n    }\n    _configAfterMerge(config) {\n      config.container = config.container === false ? document.body : index_js.getElement(config.container);\n      if (typeof config.delay === 'number') {\n        config.delay = {\n          show: config.delay,\n          hide: config.delay\n        };\n      }\n      if (typeof config.title === 'number') {\n        config.title = config.title.toString();\n      }\n      if (typeof config.content === 'number') {\n        config.content = config.content.toString();\n      }\n      return config;\n    }\n    _getDelegateConfig() {\n      const config = {};\n      for (const [key, value] of Object.entries(this._config)) {\n        if (this.constructor.Default[key] !== value) {\n          config[key] = value;\n        }\n      }\n      config.selector = false;\n      config.trigger = 'manual';\n\n      // In the future can be replaced with:\n      // const keysWithDifferentValues = Object.entries(this._config).filter(entry => this.constructor.Default[entry[0]] !== this._config[entry[0]])\n      // `Object.fromEntries(keysWithDifferentValues)`\n      return config;\n    }\n    _disposePopper() {\n      if (this._popper) {\n        this._popper.destroy();\n        this._popper = null;\n      }\n      if (this.tip) {\n        this.tip.remove();\n        this.tip = null;\n      }\n    }\n\n    // Static\n    static jQueryInterface(config) {\n      return this.each(function () {\n        const data = Tooltip.getOrCreateInstance(this, config);\n        if (typeof config !== 'string') {\n          return;\n        }\n        if (typeof data[config] === 'undefined') {\n          throw new TypeError(`No method named \"${config}\"`);\n        }\n        data[config]();\n      });\n    }\n  }\n\n  /**\n   * jQuery\n   */\n\n  index_js.defineJQueryPlugin(Tooltip);\n\n  return Tooltip;\n\n}));\n//# sourceMappingURL=tooltip.js.map\n"
  },
  {
    "path": "js/dist/util/backdrop.js",
    "content": "/*!\n  * Bootstrap backdrop.js v5.3.8 (https://getbootstrap.com/)\n  * Copyright 2011-2025 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n  */\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('../dom/event-handler.js'), require('./config.js'), require('./index.js')) :\n  typeof define === 'function' && define.amd ? define(['../dom/event-handler', './config', './index'], factory) :\n  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Backdrop = factory(global.EventHandler, global.Config, global.Index));\n})(this, (function (EventHandler, Config, index_js) { 'use strict';\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap util/backdrop.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n\n  /**\n   * Constants\n   */\n\n  const NAME = 'backdrop';\n  const CLASS_NAME_FADE = 'fade';\n  const CLASS_NAME_SHOW = 'show';\n  const EVENT_MOUSEDOWN = `mousedown.bs.${NAME}`;\n  const Default = {\n    className: 'modal-backdrop',\n    clickCallback: null,\n    isAnimated: false,\n    isVisible: true,\n    // if false, we use the backdrop helper without adding any element to the dom\n    rootElement: 'body' // give the choice to place backdrop under different elements\n  };\n  const DefaultType = {\n    className: 'string',\n    clickCallback: '(function|null)',\n    isAnimated: 'boolean',\n    isVisible: 'boolean',\n    rootElement: '(element|string)'\n  };\n\n  /**\n   * Class definition\n   */\n\n  class Backdrop extends Config {\n    constructor(config) {\n      super();\n      this._config = this._getConfig(config);\n      this._isAppended = false;\n      this._element = null;\n    }\n\n    // Getters\n    static get Default() {\n      return Default;\n    }\n    static get DefaultType() {\n      return DefaultType;\n    }\n    static get NAME() {\n      return NAME;\n    }\n\n    // Public\n    show(callback) {\n      if (!this._config.isVisible) {\n        index_js.execute(callback);\n        return;\n      }\n      this._append();\n      const element = this._getElement();\n      if (this._config.isAnimated) {\n        index_js.reflow(element);\n      }\n      element.classList.add(CLASS_NAME_SHOW);\n      this._emulateAnimation(() => {\n        index_js.execute(callback);\n      });\n    }\n    hide(callback) {\n      if (!this._config.isVisible) {\n        index_js.execute(callback);\n        return;\n      }\n      this._getElement().classList.remove(CLASS_NAME_SHOW);\n      this._emulateAnimation(() => {\n        this.dispose();\n        index_js.execute(callback);\n      });\n    }\n    dispose() {\n      if (!this._isAppended) {\n        return;\n      }\n      EventHandler.off(this._element, EVENT_MOUSEDOWN);\n      this._element.remove();\n      this._isAppended = false;\n    }\n\n    // Private\n    _getElement() {\n      if (!this._element) {\n        const backdrop = document.createElement('div');\n        backdrop.className = this._config.className;\n        if (this._config.isAnimated) {\n          backdrop.classList.add(CLASS_NAME_FADE);\n        }\n        this._element = backdrop;\n      }\n      return this._element;\n    }\n    _configAfterMerge(config) {\n      // use getElement() with the default \"body\" to get a fresh Element on each instantiation\n      config.rootElement = index_js.getElement(config.rootElement);\n      return config;\n    }\n    _append() {\n      if (this._isAppended) {\n        return;\n      }\n      const element = this._getElement();\n      this._config.rootElement.append(element);\n      EventHandler.on(element, EVENT_MOUSEDOWN, () => {\n        index_js.execute(this._config.clickCallback);\n      });\n      this._isAppended = true;\n    }\n    _emulateAnimation(callback) {\n      index_js.executeAfterTransition(callback, this._getElement(), this._config.isAnimated);\n    }\n  }\n\n  return Backdrop;\n\n}));\n//# sourceMappingURL=backdrop.js.map\n"
  },
  {
    "path": "js/dist/util/component-functions.js",
    "content": "/*!\n  * Bootstrap component-functions.js v5.3.8 (https://getbootstrap.com/)\n  * Copyright 2011-2025 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n  */\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('../dom/event-handler.js'), require('../dom/selector-engine.js'), require('./index.js')) :\n  typeof define === 'function' && define.amd ? define(['exports', '../dom/event-handler', '../dom/selector-engine', './index'], factory) :\n  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.ComponentFunctions = {}, global.EventHandler, global.SelectorEngine, global.Index));\n})(this, (function (exports, EventHandler, SelectorEngine, index_js) { 'use strict';\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap util/component-functions.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n  const enableDismissTrigger = (component, method = 'hide') => {\n    const clickEvent = `click.dismiss${component.EVENT_KEY}`;\n    const name = component.NAME;\n    EventHandler.on(document, clickEvent, `[data-bs-dismiss=\"${name}\"]`, function (event) {\n      if (['A', 'AREA'].includes(this.tagName)) {\n        event.preventDefault();\n      }\n      if (index_js.isDisabled(this)) {\n        return;\n      }\n      const target = SelectorEngine.getElementFromSelector(this) || this.closest(`.${name}`);\n      const instance = component.getOrCreateInstance(target);\n\n      // Method argument is left, for Alert and only, as it doesn't implement the 'hide' method\n      instance[method]();\n    });\n  };\n\n  exports.enableDismissTrigger = enableDismissTrigger;\n\n  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\n}));\n//# sourceMappingURL=component-functions.js.map\n"
  },
  {
    "path": "js/dist/util/config.js",
    "content": "/*!\n  * Bootstrap config.js v5.3.8 (https://getbootstrap.com/)\n  * Copyright 2011-2025 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n  */\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('../dom/manipulator.js'), require('./index.js')) :\n  typeof define === 'function' && define.amd ? define(['../dom/manipulator', './index'], factory) :\n  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Config = factory(global.Manipulator, global.Index));\n})(this, (function (Manipulator, index_js) { 'use strict';\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap util/config.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n\n  /**\n   * Class definition\n   */\n\n  class Config {\n    // Getters\n    static get Default() {\n      return {};\n    }\n    static get DefaultType() {\n      return {};\n    }\n    static get NAME() {\n      throw new Error('You have to implement the static method \"NAME\", for each component!');\n    }\n    _getConfig(config) {\n      config = this._mergeConfigObj(config);\n      config = this._configAfterMerge(config);\n      this._typeCheckConfig(config);\n      return config;\n    }\n    _configAfterMerge(config) {\n      return config;\n    }\n    _mergeConfigObj(config, element) {\n      const jsonConfig = index_js.isElement(element) ? Manipulator.getDataAttribute(element, 'config') : {}; // try to parse\n\n      return {\n        ...this.constructor.Default,\n        ...(typeof jsonConfig === 'object' ? jsonConfig : {}),\n        ...(index_js.isElement(element) ? Manipulator.getDataAttributes(element) : {}),\n        ...(typeof config === 'object' ? config : {})\n      };\n    }\n    _typeCheckConfig(config, configTypes = this.constructor.DefaultType) {\n      for (const [property, expectedTypes] of Object.entries(configTypes)) {\n        const value = config[property];\n        const valueType = index_js.isElement(value) ? 'element' : index_js.toType(value);\n        if (!new RegExp(expectedTypes).test(valueType)) {\n          throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option \"${property}\" provided type \"${valueType}\" but expected type \"${expectedTypes}\".`);\n        }\n      }\n    }\n  }\n\n  return Config;\n\n}));\n//# sourceMappingURL=config.js.map\n"
  },
  {
    "path": "js/dist/util/focustrap.js",
    "content": "/*!\n  * Bootstrap focustrap.js v5.3.8 (https://getbootstrap.com/)\n  * Copyright 2011-2025 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n  */\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('../dom/event-handler.js'), require('../dom/selector-engine.js'), require('./config.js')) :\n  typeof define === 'function' && define.amd ? define(['../dom/event-handler', '../dom/selector-engine', './config'], factory) :\n  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Focustrap = factory(global.EventHandler, global.SelectorEngine, global.Config));\n})(this, (function (EventHandler, SelectorEngine, Config) { 'use strict';\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap util/focustrap.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n\n  /**\n   * Constants\n   */\n\n  const NAME = 'focustrap';\n  const DATA_KEY = 'bs.focustrap';\n  const EVENT_KEY = `.${DATA_KEY}`;\n  const EVENT_FOCUSIN = `focusin${EVENT_KEY}`;\n  const EVENT_KEYDOWN_TAB = `keydown.tab${EVENT_KEY}`;\n  const TAB_KEY = 'Tab';\n  const TAB_NAV_FORWARD = 'forward';\n  const TAB_NAV_BACKWARD = 'backward';\n  const Default = {\n    autofocus: true,\n    trapElement: null // The element to trap focus inside of\n  };\n  const DefaultType = {\n    autofocus: 'boolean',\n    trapElement: 'element'\n  };\n\n  /**\n   * Class definition\n   */\n\n  class FocusTrap extends Config {\n    constructor(config) {\n      super();\n      this._config = this._getConfig(config);\n      this._isActive = false;\n      this._lastTabNavDirection = null;\n    }\n\n    // Getters\n    static get Default() {\n      return Default;\n    }\n    static get DefaultType() {\n      return DefaultType;\n    }\n    static get NAME() {\n      return NAME;\n    }\n\n    // Public\n    activate() {\n      if (this._isActive) {\n        return;\n      }\n      if (this._config.autofocus) {\n        this._config.trapElement.focus();\n      }\n      EventHandler.off(document, EVENT_KEY); // guard against infinite focus loop\n      EventHandler.on(document, EVENT_FOCUSIN, event => this._handleFocusin(event));\n      EventHandler.on(document, EVENT_KEYDOWN_TAB, event => this._handleKeydown(event));\n      this._isActive = true;\n    }\n    deactivate() {\n      if (!this._isActive) {\n        return;\n      }\n      this._isActive = false;\n      EventHandler.off(document, EVENT_KEY);\n    }\n\n    // Private\n    _handleFocusin(event) {\n      const {\n        trapElement\n      } = this._config;\n      if (event.target === document || event.target === trapElement || trapElement.contains(event.target)) {\n        return;\n      }\n      const elements = SelectorEngine.focusableChildren(trapElement);\n      if (elements.length === 0) {\n        trapElement.focus();\n      } else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) {\n        elements[elements.length - 1].focus();\n      } else {\n        elements[0].focus();\n      }\n    }\n    _handleKeydown(event) {\n      if (event.key !== TAB_KEY) {\n        return;\n      }\n      this._lastTabNavDirection = event.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD;\n    }\n  }\n\n  return FocusTrap;\n\n}));\n//# sourceMappingURL=focustrap.js.map\n"
  },
  {
    "path": "js/dist/util/index.js",
    "content": "/*!\n  * Bootstrap index.js v5.3.8 (https://getbootstrap.com/)\n  * Copyright 2011-2025 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n  */\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n  typeof define === 'function' && define.amd ? define(['exports'], factory) :\n  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.Index = {}));\n})(this, (function (exports) { 'use strict';\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap util/index.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n  const MAX_UID = 1000000;\n  const MILLISECONDS_MULTIPLIER = 1000;\n  const TRANSITION_END = 'transitionend';\n\n  /**\n   * Properly escape IDs selectors to handle weird IDs\n   * @param {string} selector\n   * @returns {string}\n   */\n  const parseSelector = selector => {\n    if (selector && window.CSS && window.CSS.escape) {\n      // document.querySelector needs escaping to handle IDs (html5+) containing for instance /\n      selector = selector.replace(/#([^\\s\"#']+)/g, (match, id) => `#${CSS.escape(id)}`);\n    }\n    return selector;\n  };\n\n  // Shout-out Angus Croll (https://goo.gl/pxwQGp)\n  const toType = object => {\n    if (object === null || object === undefined) {\n      return `${object}`;\n    }\n    return Object.prototype.toString.call(object).match(/\\s([a-z]+)/i)[1].toLowerCase();\n  };\n\n  /**\n   * Public Util API\n   */\n\n  const getUID = prefix => {\n    do {\n      prefix += Math.floor(Math.random() * MAX_UID);\n    } while (document.getElementById(prefix));\n    return prefix;\n  };\n  const getTransitionDurationFromElement = element => {\n    if (!element) {\n      return 0;\n    }\n\n    // Get transition-duration of the element\n    let {\n      transitionDuration,\n      transitionDelay\n    } = window.getComputedStyle(element);\n    const floatTransitionDuration = Number.parseFloat(transitionDuration);\n    const floatTransitionDelay = Number.parseFloat(transitionDelay);\n\n    // Return 0 if element or transition duration is not found\n    if (!floatTransitionDuration && !floatTransitionDelay) {\n      return 0;\n    }\n\n    // If multiple durations are defined, take the first\n    transitionDuration = transitionDuration.split(',')[0];\n    transitionDelay = transitionDelay.split(',')[0];\n    return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER;\n  };\n  const triggerTransitionEnd = element => {\n    element.dispatchEvent(new Event(TRANSITION_END));\n  };\n  const isElement = object => {\n    if (!object || typeof object !== 'object') {\n      return false;\n    }\n    if (typeof object.jquery !== 'undefined') {\n      object = object[0];\n    }\n    return typeof object.nodeType !== 'undefined';\n  };\n  const getElement = object => {\n    // it's a jQuery object or a node element\n    if (isElement(object)) {\n      return object.jquery ? object[0] : object;\n    }\n    if (typeof object === 'string' && object.length > 0) {\n      return document.querySelector(parseSelector(object));\n    }\n    return null;\n  };\n  const isVisible = element => {\n    if (!isElement(element) || element.getClientRects().length === 0) {\n      return false;\n    }\n    const elementIsVisible = getComputedStyle(element).getPropertyValue('visibility') === 'visible';\n    // Handle `details` element as its content may falsie appear visible when it is closed\n    const closedDetails = element.closest('details:not([open])');\n    if (!closedDetails) {\n      return elementIsVisible;\n    }\n    if (closedDetails !== element) {\n      const summary = element.closest('summary');\n      if (summary && summary.parentNode !== closedDetails) {\n        return false;\n      }\n      if (summary === null) {\n        return false;\n      }\n    }\n    return elementIsVisible;\n  };\n  const isDisabled = element => {\n    if (!element || element.nodeType !== Node.ELEMENT_NODE) {\n      return true;\n    }\n    if (element.classList.contains('disabled')) {\n      return true;\n    }\n    if (typeof element.disabled !== 'undefined') {\n      return element.disabled;\n    }\n    return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false';\n  };\n  const findShadowRoot = element => {\n    if (!document.documentElement.attachShadow) {\n      return null;\n    }\n\n    // Can find the shadow root otherwise it'll return the document\n    if (typeof element.getRootNode === 'function') {\n      const root = element.getRootNode();\n      return root instanceof ShadowRoot ? root : null;\n    }\n    if (element instanceof ShadowRoot) {\n      return element;\n    }\n\n    // when we don't find a shadow root\n    if (!element.parentNode) {\n      return null;\n    }\n    return findShadowRoot(element.parentNode);\n  };\n  const noop = () => {};\n\n  /**\n   * Trick to restart an element's animation\n   *\n   * @param {HTMLElement} element\n   * @return void\n   *\n   * @see https://www.harrytheo.com/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation\n   */\n  const reflow = element => {\n    element.offsetHeight; // eslint-disable-line no-unused-expressions\n  };\n  const getjQuery = () => {\n    if (window.jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {\n      return window.jQuery;\n    }\n    return null;\n  };\n  const DOMContentLoadedCallbacks = [];\n  const onDOMContentLoaded = callback => {\n    if (document.readyState === 'loading') {\n      // add listener on the first call when the document is in loading state\n      if (!DOMContentLoadedCallbacks.length) {\n        document.addEventListener('DOMContentLoaded', () => {\n          for (const callback of DOMContentLoadedCallbacks) {\n            callback();\n          }\n        });\n      }\n      DOMContentLoadedCallbacks.push(callback);\n    } else {\n      callback();\n    }\n  };\n  const isRTL = () => document.documentElement.dir === 'rtl';\n  const defineJQueryPlugin = plugin => {\n    onDOMContentLoaded(() => {\n      const $ = getjQuery();\n      /* istanbul ignore if */\n      if ($) {\n        const name = plugin.NAME;\n        const JQUERY_NO_CONFLICT = $.fn[name];\n        $.fn[name] = plugin.jQueryInterface;\n        $.fn[name].Constructor = plugin;\n        $.fn[name].noConflict = () => {\n          $.fn[name] = JQUERY_NO_CONFLICT;\n          return plugin.jQueryInterface;\n        };\n      }\n    });\n  };\n  const execute = (possibleCallback, args = [], defaultValue = possibleCallback) => {\n    return typeof possibleCallback === 'function' ? possibleCallback.call(...args) : defaultValue;\n  };\n  const executeAfterTransition = (callback, transitionElement, waitForTransition = true) => {\n    if (!waitForTransition) {\n      execute(callback);\n      return;\n    }\n    const durationPadding = 5;\n    const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding;\n    let called = false;\n    const handler = ({\n      target\n    }) => {\n      if (target !== transitionElement) {\n        return;\n      }\n      called = true;\n      transitionElement.removeEventListener(TRANSITION_END, handler);\n      execute(callback);\n    };\n    transitionElement.addEventListener(TRANSITION_END, handler);\n    setTimeout(() => {\n      if (!called) {\n        triggerTransitionEnd(transitionElement);\n      }\n    }, emulatedDuration);\n  };\n\n  /**\n   * Return the previous/next element of a list.\n   *\n   * @param {array} list    The list of elements\n   * @param activeElement   The active element\n   * @param shouldGetNext   Choose to get next or previous element\n   * @param isCycleAllowed\n   * @return {Element|elem} The proper element\n   */\n  const getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => {\n    const listLength = list.length;\n    let index = list.indexOf(activeElement);\n\n    // if the element does not exist in the list return an element\n    // depending on the direction and if cycle is allowed\n    if (index === -1) {\n      return !shouldGetNext && isCycleAllowed ? list[listLength - 1] : list[0];\n    }\n    index += shouldGetNext ? 1 : -1;\n    if (isCycleAllowed) {\n      index = (index + listLength) % listLength;\n    }\n    return list[Math.max(0, Math.min(index, listLength - 1))];\n  };\n\n  exports.defineJQueryPlugin = defineJQueryPlugin;\n  exports.execute = execute;\n  exports.executeAfterTransition = executeAfterTransition;\n  exports.findShadowRoot = findShadowRoot;\n  exports.getElement = getElement;\n  exports.getNextActiveElement = getNextActiveElement;\n  exports.getTransitionDurationFromElement = getTransitionDurationFromElement;\n  exports.getUID = getUID;\n  exports.getjQuery = getjQuery;\n  exports.isDisabled = isDisabled;\n  exports.isElement = isElement;\n  exports.isRTL = isRTL;\n  exports.isVisible = isVisible;\n  exports.noop = noop;\n  exports.onDOMContentLoaded = onDOMContentLoaded;\n  exports.parseSelector = parseSelector;\n  exports.reflow = reflow;\n  exports.toType = toType;\n  exports.triggerTransitionEnd = triggerTransitionEnd;\n\n  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\n}));\n//# sourceMappingURL=index.js.map\n"
  },
  {
    "path": "js/dist/util/sanitizer.js",
    "content": "/*!\n  * Bootstrap sanitizer.js v5.3.8 (https://getbootstrap.com/)\n  * Copyright 2011-2025 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n  */\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n  typeof define === 'function' && define.amd ? define(['exports'], factory) :\n  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.Sanitizer = {}));\n})(this, (function (exports) { 'use strict';\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap util/sanitizer.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n  // js-docs-start allow-list\n  const ARIA_ATTRIBUTE_PATTERN = /^aria-[\\w-]*$/i;\n  const DefaultAllowlist = {\n    // Global attributes allowed on any supplied element below.\n    '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\n    a: ['target', 'href', 'title', 'rel'],\n    area: [],\n    b: [],\n    br: [],\n    col: [],\n    code: [],\n    dd: [],\n    div: [],\n    dl: [],\n    dt: [],\n    em: [],\n    hr: [],\n    h1: [],\n    h2: [],\n    h3: [],\n    h4: [],\n    h5: [],\n    h6: [],\n    i: [],\n    img: ['src', 'srcset', 'alt', 'title', 'width', 'height'],\n    li: [],\n    ol: [],\n    p: [],\n    pre: [],\n    s: [],\n    small: [],\n    span: [],\n    sub: [],\n    sup: [],\n    strong: [],\n    u: [],\n    ul: []\n  };\n  // js-docs-end allow-list\n\n  const uriAttributes = new Set(['background', 'cite', 'href', 'itemtype', 'longdesc', 'poster', 'src', 'xlink:href']);\n\n  /**\n   * A pattern that recognizes URLs that are safe wrt. XSS in URL navigation\n   * contexts.\n   *\n   * Shout-out to Angular https://github.com/angular/angular/blob/15.2.8/packages/core/src/sanitization/url_sanitizer.ts#L38\n   */\n  const SAFE_URL_PATTERN = /^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i;\n  const allowedAttribute = (attribute, allowedAttributeList) => {\n    const attributeName = attribute.nodeName.toLowerCase();\n    if (allowedAttributeList.includes(attributeName)) {\n      if (uriAttributes.has(attributeName)) {\n        return Boolean(SAFE_URL_PATTERN.test(attribute.nodeValue));\n      }\n      return true;\n    }\n\n    // Check if a regular expression validates the attribute.\n    return allowedAttributeList.filter(attributeRegex => attributeRegex instanceof RegExp).some(regex => regex.test(attributeName));\n  };\n  function sanitizeHtml(unsafeHtml, allowList, sanitizeFunction) {\n    if (!unsafeHtml.length) {\n      return unsafeHtml;\n    }\n    if (sanitizeFunction && typeof sanitizeFunction === 'function') {\n      return sanitizeFunction(unsafeHtml);\n    }\n    const domParser = new window.DOMParser();\n    const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html');\n    const elements = [].concat(...createdDocument.body.querySelectorAll('*'));\n    for (const element of elements) {\n      const elementName = element.nodeName.toLowerCase();\n      if (!Object.keys(allowList).includes(elementName)) {\n        element.remove();\n        continue;\n      }\n      const attributeList = [].concat(...element.attributes);\n      const allowedAttributes = [].concat(allowList['*'] || [], allowList[elementName] || []);\n      for (const attribute of attributeList) {\n        if (!allowedAttribute(attribute, allowedAttributes)) {\n          element.removeAttribute(attribute.nodeName);\n        }\n      }\n    }\n    return createdDocument.body.innerHTML;\n  }\n\n  exports.DefaultAllowlist = DefaultAllowlist;\n  exports.sanitizeHtml = sanitizeHtml;\n\n  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\n}));\n//# sourceMappingURL=sanitizer.js.map\n"
  },
  {
    "path": "js/dist/util/scrollbar.js",
    "content": "/*!\n  * Bootstrap scrollbar.js v5.3.8 (https://getbootstrap.com/)\n  * Copyright 2011-2025 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n  */\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('../dom/manipulator.js'), require('../dom/selector-engine.js'), require('./index.js')) :\n  typeof define === 'function' && define.amd ? define(['../dom/manipulator', '../dom/selector-engine', './index'], factory) :\n  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Scrollbar = factory(global.Manipulator, global.SelectorEngine, global.Index));\n})(this, (function (Manipulator, SelectorEngine, index_js) { 'use strict';\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap util/scrollBar.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n\n  /**\n   * Constants\n   */\n\n  const SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top';\n  const SELECTOR_STICKY_CONTENT = '.sticky-top';\n  const PROPERTY_PADDING = 'padding-right';\n  const PROPERTY_MARGIN = 'margin-right';\n\n  /**\n   * Class definition\n   */\n\n  class ScrollBarHelper {\n    constructor() {\n      this._element = document.body;\n    }\n\n    // Public\n    getWidth() {\n      // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes\n      const documentWidth = document.documentElement.clientWidth;\n      return Math.abs(window.innerWidth - documentWidth);\n    }\n    hide() {\n      const width = this.getWidth();\n      this._disableOverFlow();\n      // give padding to element to balance the hidden scrollbar width\n      this._setElementAttributes(this._element, PROPERTY_PADDING, calculatedValue => calculatedValue + width);\n      // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements to keep showing fullwidth\n      this._setElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING, calculatedValue => calculatedValue + width);\n      this._setElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN, calculatedValue => calculatedValue - width);\n    }\n    reset() {\n      this._resetElementAttributes(this._element, 'overflow');\n      this._resetElementAttributes(this._element, PROPERTY_PADDING);\n      this._resetElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING);\n      this._resetElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN);\n    }\n    isOverflowing() {\n      return this.getWidth() > 0;\n    }\n\n    // Private\n    _disableOverFlow() {\n      this._saveInitialAttribute(this._element, 'overflow');\n      this._element.style.overflow = 'hidden';\n    }\n    _setElementAttributes(selector, styleProperty, callback) {\n      const scrollbarWidth = this.getWidth();\n      const manipulationCallBack = element => {\n        if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) {\n          return;\n        }\n        this._saveInitialAttribute(element, styleProperty);\n        const calculatedValue = window.getComputedStyle(element).getPropertyValue(styleProperty);\n        element.style.setProperty(styleProperty, `${callback(Number.parseFloat(calculatedValue))}px`);\n      };\n      this._applyManipulationCallback(selector, manipulationCallBack);\n    }\n    _saveInitialAttribute(element, styleProperty) {\n      const actualValue = element.style.getPropertyValue(styleProperty);\n      if (actualValue) {\n        Manipulator.setDataAttribute(element, styleProperty, actualValue);\n      }\n    }\n    _resetElementAttributes(selector, styleProperty) {\n      const manipulationCallBack = element => {\n        const value = Manipulator.getDataAttribute(element, styleProperty);\n        // We only want to remove the property if the value is `null`; the value can also be zero\n        if (value === null) {\n          element.style.removeProperty(styleProperty);\n          return;\n        }\n        Manipulator.removeDataAttribute(element, styleProperty);\n        element.style.setProperty(styleProperty, value);\n      };\n      this._applyManipulationCallback(selector, manipulationCallBack);\n    }\n    _applyManipulationCallback(selector, callBack) {\n      if (index_js.isElement(selector)) {\n        callBack(selector);\n        return;\n      }\n      for (const sel of SelectorEngine.find(selector, this._element)) {\n        callBack(sel);\n      }\n    }\n  }\n\n  return ScrollBarHelper;\n\n}));\n//# sourceMappingURL=scrollbar.js.map\n"
  },
  {
    "path": "js/dist/util/swipe.js",
    "content": "/*!\n  * Bootstrap swipe.js v5.3.8 (https://getbootstrap.com/)\n  * Copyright 2011-2025 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n  */\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('../dom/event-handler.js'), require('./config.js'), require('./index.js')) :\n  typeof define === 'function' && define.amd ? define(['../dom/event-handler', './config', './index'], factory) :\n  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Swipe = factory(global.EventHandler, global.Config, global.Index));\n})(this, (function (EventHandler, Config, index_js) { 'use strict';\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap util/swipe.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n\n  /**\n   * Constants\n   */\n\n  const NAME = 'swipe';\n  const EVENT_KEY = '.bs.swipe';\n  const EVENT_TOUCHSTART = `touchstart${EVENT_KEY}`;\n  const EVENT_TOUCHMOVE = `touchmove${EVENT_KEY}`;\n  const EVENT_TOUCHEND = `touchend${EVENT_KEY}`;\n  const EVENT_POINTERDOWN = `pointerdown${EVENT_KEY}`;\n  const EVENT_POINTERUP = `pointerup${EVENT_KEY}`;\n  const POINTER_TYPE_TOUCH = 'touch';\n  const POINTER_TYPE_PEN = 'pen';\n  const CLASS_NAME_POINTER_EVENT = 'pointer-event';\n  const SWIPE_THRESHOLD = 40;\n  const Default = {\n    endCallback: null,\n    leftCallback: null,\n    rightCallback: null\n  };\n  const DefaultType = {\n    endCallback: '(function|null)',\n    leftCallback: '(function|null)',\n    rightCallback: '(function|null)'\n  };\n\n  /**\n   * Class definition\n   */\n\n  class Swipe extends Config {\n    constructor(element, config) {\n      super();\n      this._element = element;\n      if (!element || !Swipe.isSupported()) {\n        return;\n      }\n      this._config = this._getConfig(config);\n      this._deltaX = 0;\n      this._supportPointerEvents = Boolean(window.PointerEvent);\n      this._initEvents();\n    }\n\n    // Getters\n    static get Default() {\n      return Default;\n    }\n    static get DefaultType() {\n      return DefaultType;\n    }\n    static get NAME() {\n      return NAME;\n    }\n\n    // Public\n    dispose() {\n      EventHandler.off(this._element, EVENT_KEY);\n    }\n\n    // Private\n    _start(event) {\n      if (!this._supportPointerEvents) {\n        this._deltaX = event.touches[0].clientX;\n        return;\n      }\n      if (this._eventIsPointerPenTouch(event)) {\n        this._deltaX = event.clientX;\n      }\n    }\n    _end(event) {\n      if (this._eventIsPointerPenTouch(event)) {\n        this._deltaX = event.clientX - this._deltaX;\n      }\n      this._handleSwipe();\n      index_js.execute(this._config.endCallback);\n    }\n    _move(event) {\n      this._deltaX = event.touches && event.touches.length > 1 ? 0 : event.touches[0].clientX - this._deltaX;\n    }\n    _handleSwipe() {\n      const absDeltaX = Math.abs(this._deltaX);\n      if (absDeltaX <= SWIPE_THRESHOLD) {\n        return;\n      }\n      const direction = absDeltaX / this._deltaX;\n      this._deltaX = 0;\n      if (!direction) {\n        return;\n      }\n      index_js.execute(direction > 0 ? this._config.rightCallback : this._config.leftCallback);\n    }\n    _initEvents() {\n      if (this._supportPointerEvents) {\n        EventHandler.on(this._element, EVENT_POINTERDOWN, event => this._start(event));\n        EventHandler.on(this._element, EVENT_POINTERUP, event => this._end(event));\n        this._element.classList.add(CLASS_NAME_POINTER_EVENT);\n      } else {\n        EventHandler.on(this._element, EVENT_TOUCHSTART, event => this._start(event));\n        EventHandler.on(this._element, EVENT_TOUCHMOVE, event => this._move(event));\n        EventHandler.on(this._element, EVENT_TOUCHEND, event => this._end(event));\n      }\n    }\n    _eventIsPointerPenTouch(event) {\n      return this._supportPointerEvents && (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH);\n    }\n\n    // Static\n    static isSupported() {\n      return 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0;\n    }\n  }\n\n  return Swipe;\n\n}));\n//# sourceMappingURL=swipe.js.map\n"
  },
  {
    "path": "js/dist/util/template-factory.js",
    "content": "/*!\n  * Bootstrap template-factory.js v5.3.8 (https://getbootstrap.com/)\n  * Copyright 2011-2025 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n  */\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('../dom/selector-engine.js'), require('./config.js'), require('./sanitizer.js'), require('./index.js')) :\n  typeof define === 'function' && define.amd ? define(['../dom/selector-engine', './config', './sanitizer', './index'], factory) :\n  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.TemplateFactory = factory(global.SelectorEngine, global.Config, global.Sanitizer, global.Index));\n})(this, (function (SelectorEngine, Config, sanitizer_js, index_js) { 'use strict';\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap util/template-factory.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n\n  /**\n   * Constants\n   */\n\n  const NAME = 'TemplateFactory';\n  const Default = {\n    allowList: sanitizer_js.DefaultAllowlist,\n    content: {},\n    // { selector : text ,  selector2 : text2 , }\n    extraClass: '',\n    html: false,\n    sanitize: true,\n    sanitizeFn: null,\n    template: '<div></div>'\n  };\n  const DefaultType = {\n    allowList: 'object',\n    content: 'object',\n    extraClass: '(string|function)',\n    html: 'boolean',\n    sanitize: 'boolean',\n    sanitizeFn: '(null|function)',\n    template: 'string'\n  };\n  const DefaultContentType = {\n    entry: '(string|element|function|null)',\n    selector: '(string|element)'\n  };\n\n  /**\n   * Class definition\n   */\n\n  class TemplateFactory extends Config {\n    constructor(config) {\n      super();\n      this._config = this._getConfig(config);\n    }\n\n    // Getters\n    static get Default() {\n      return Default;\n    }\n    static get DefaultType() {\n      return DefaultType;\n    }\n    static get NAME() {\n      return NAME;\n    }\n\n    // Public\n    getContent() {\n      return Object.values(this._config.content).map(config => this._resolvePossibleFunction(config)).filter(Boolean);\n    }\n    hasContent() {\n      return this.getContent().length > 0;\n    }\n    changeContent(content) {\n      this._checkContent(content);\n      this._config.content = {\n        ...this._config.content,\n        ...content\n      };\n      return this;\n    }\n    toHtml() {\n      const templateWrapper = document.createElement('div');\n      templateWrapper.innerHTML = this._maybeSanitize(this._config.template);\n      for (const [selector, text] of Object.entries(this._config.content)) {\n        this._setContent(templateWrapper, text, selector);\n      }\n      const template = templateWrapper.children[0];\n      const extraClass = this._resolvePossibleFunction(this._config.extraClass);\n      if (extraClass) {\n        template.classList.add(...extraClass.split(' '));\n      }\n      return template;\n    }\n\n    // Private\n    _typeCheckConfig(config) {\n      super._typeCheckConfig(config);\n      this._checkContent(config.content);\n    }\n    _checkContent(arg) {\n      for (const [selector, content] of Object.entries(arg)) {\n        super._typeCheckConfig({\n          selector,\n          entry: content\n        }, DefaultContentType);\n      }\n    }\n    _setContent(template, content, selector) {\n      const templateElement = SelectorEngine.findOne(selector, template);\n      if (!templateElement) {\n        return;\n      }\n      content = this._resolvePossibleFunction(content);\n      if (!content) {\n        templateElement.remove();\n        return;\n      }\n      if (index_js.isElement(content)) {\n        this._putElementInTemplate(index_js.getElement(content), templateElement);\n        return;\n      }\n      if (this._config.html) {\n        templateElement.innerHTML = this._maybeSanitize(content);\n        return;\n      }\n      templateElement.textContent = content;\n    }\n    _maybeSanitize(arg) {\n      return this._config.sanitize ? sanitizer_js.sanitizeHtml(arg, this._config.allowList, this._config.sanitizeFn) : arg;\n    }\n    _resolvePossibleFunction(arg) {\n      return index_js.execute(arg, [undefined, this]);\n    }\n    _putElementInTemplate(element, templateElement) {\n      if (this._config.html) {\n        templateElement.innerHTML = '';\n        templateElement.append(element);\n        return;\n      }\n      templateElement.textContent = element.textContent;\n    }\n  }\n\n  return TemplateFactory;\n\n}));\n//# sourceMappingURL=template-factory.js.map\n"
  },
  {
    "path": "js/index.esm.js",
    "content": "/**\n * --------------------------------------------------------------------------\n * Bootstrap index.esm.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nexport { default as Alert } from './src/alert.js'\nexport { default as Button } from './src/button.js'\nexport { default as Carousel } from './src/carousel.js'\nexport { default as Collapse } from './src/collapse.js'\nexport { default as Dropdown } from './src/dropdown.js'\nexport { default as Modal } from './src/modal.js'\nexport { default as Offcanvas } from './src/offcanvas.js'\nexport { default as Popover } from './src/popover.js'\nexport { default as ScrollSpy } from './src/scrollspy.js'\nexport { default as Tab } from './src/tab.js'\nexport { default as Toast } from './src/toast.js'\nexport { default as Tooltip } from './src/tooltip.js'\n"
  },
  {
    "path": "js/index.umd.js",
    "content": "/**\n * --------------------------------------------------------------------------\n * Bootstrap index.umd.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Alert from './src/alert.js'\nimport Button from './src/button.js'\nimport Carousel from './src/carousel.js'\nimport Collapse from './src/collapse.js'\nimport Dropdown from './src/dropdown.js'\nimport Modal from './src/modal.js'\nimport Offcanvas from './src/offcanvas.js'\nimport Popover from './src/popover.js'\nimport ScrollSpy from './src/scrollspy.js'\nimport Tab from './src/tab.js'\nimport Toast from './src/toast.js'\nimport Tooltip from './src/tooltip.js'\n\nexport default {\n  Alert,\n  Button,\n  Carousel,\n  Collapse,\n  Dropdown,\n  Modal,\n  Offcanvas,\n  Popover,\n  ScrollSpy,\n  Tab,\n  Toast,\n  Tooltip\n}\n"
  },
  {
    "path": "js/src/alert.js",
    "content": "/**\n * --------------------------------------------------------------------------\n * Bootstrap alert.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport { enableDismissTrigger } from './util/component-functions.js'\nimport { defineJQueryPlugin } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'alert'\nconst DATA_KEY = 'bs.alert'\nconst EVENT_KEY = `.${DATA_KEY}`\n\nconst EVENT_CLOSE = `close${EVENT_KEY}`\nconst EVENT_CLOSED = `closed${EVENT_KEY}`\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\n\n/**\n * Class definition\n */\n\nclass Alert extends BaseComponent {\n  // Getters\n  static get NAME() {\n    return NAME\n  }\n\n  // Public\n  close() {\n    const closeEvent = EventHandler.trigger(this._element, EVENT_CLOSE)\n\n    if (closeEvent.defaultPrevented) {\n      return\n    }\n\n    this._element.classList.remove(CLASS_NAME_SHOW)\n\n    const isAnimated = this._element.classList.contains(CLASS_NAME_FADE)\n    this._queueCallback(() => this._destroyElement(), this._element, isAnimated)\n  }\n\n  // Private\n  _destroyElement() {\n    this._element.remove()\n    EventHandler.trigger(this._element, EVENT_CLOSED)\n    this.dispose()\n  }\n\n  // Static\n  static jQueryInterface(config) {\n    return this.each(function () {\n      const data = Alert.getOrCreateInstance(this)\n\n      if (typeof config !== 'string') {\n        return\n      }\n\n      if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n        throw new TypeError(`No method named \"${config}\"`)\n      }\n\n      data[config](this)\n    })\n  }\n}\n\n/**\n * Data API implementation\n */\n\nenableDismissTrigger(Alert, 'close')\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Alert)\n\nexport default Alert\n"
  },
  {
    "path": "js/src/base-component.js",
    "content": "/**\n * --------------------------------------------------------------------------\n * Bootstrap base-component.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Data from './dom/data.js'\nimport EventHandler from './dom/event-handler.js'\nimport Config from './util/config.js'\nimport { executeAfterTransition, getElement } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst VERSION = '5.3.8'\n\n/**\n * Class definition\n */\n\nclass BaseComponent extends Config {\n  constructor(element, config) {\n    super()\n\n    element = getElement(element)\n    if (!element) {\n      return\n    }\n\n    this._element = element\n    this._config = this._getConfig(config)\n\n    Data.set(this._element, this.constructor.DATA_KEY, this)\n  }\n\n  // Public\n  dispose() {\n    Data.remove(this._element, this.constructor.DATA_KEY)\n    EventHandler.off(this._element, this.constructor.EVENT_KEY)\n\n    for (const propertyName of Object.getOwnPropertyNames(this)) {\n      this[propertyName] = null\n    }\n  }\n\n  // Private\n  _queueCallback(callback, element, isAnimated = true) {\n    executeAfterTransition(callback, element, isAnimated)\n  }\n\n  _getConfig(config) {\n    config = this._mergeConfigObj(config, this._element)\n    config = this._configAfterMerge(config)\n    this._typeCheckConfig(config)\n    return config\n  }\n\n  // Static\n  static getInstance(element) {\n    return Data.get(getElement(element), this.DATA_KEY)\n  }\n\n  static getOrCreateInstance(element, config = {}) {\n    return this.getInstance(element) || new this(element, typeof config === 'object' ? config : null)\n  }\n\n  static get VERSION() {\n    return VERSION\n  }\n\n  static get DATA_KEY() {\n    return `bs.${this.NAME}`\n  }\n\n  static get EVENT_KEY() {\n    return `.${this.DATA_KEY}`\n  }\n\n  static eventName(name) {\n    return `${name}${this.EVENT_KEY}`\n  }\n}\n\nexport default BaseComponent\n"
  },
  {
    "path": "js/src/button.js",
    "content": "/**\n * --------------------------------------------------------------------------\n * Bootstrap button.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport { defineJQueryPlugin } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'button'\nconst DATA_KEY = 'bs.button'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst CLASS_NAME_ACTIVE = 'active'\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"button\"]'\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\n/**\n * Class definition\n */\n\nclass Button extends BaseComponent {\n  // Getters\n  static get NAME() {\n    return NAME\n  }\n\n  // Public\n  toggle() {\n    // Toggle class and sync the `aria-pressed` attribute with the return value of the `.toggle()` method\n    this._element.setAttribute('aria-pressed', this._element.classList.toggle(CLASS_NAME_ACTIVE))\n  }\n\n  // Static\n  static jQueryInterface(config) {\n    return this.each(function () {\n      const data = Button.getOrCreateInstance(this)\n\n      if (config === 'toggle') {\n        data[config]()\n      }\n    })\n  }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, event => {\n  event.preventDefault()\n\n  const button = event.target.closest(SELECTOR_DATA_TOGGLE)\n  const data = Button.getOrCreateInstance(button)\n\n  data.toggle()\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Button)\n\nexport default Button\n"
  },
  {
    "path": "js/src/carousel.js",
    "content": "/**\n * --------------------------------------------------------------------------\n * Bootstrap carousel.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport Manipulator from './dom/manipulator.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport {\n  defineJQueryPlugin,\n  getNextActiveElement,\n  isRTL,\n  isVisible,\n  reflow,\n  triggerTransitionEnd\n} from './util/index.js'\nimport Swipe from './util/swipe.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'carousel'\nconst DATA_KEY = 'bs.carousel'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst ARROW_LEFT_KEY = 'ArrowLeft'\nconst ARROW_RIGHT_KEY = 'ArrowRight'\nconst TOUCHEVENT_COMPAT_WAIT = 500 // Time for mouse compat events to fire after touch\n\nconst ORDER_NEXT = 'next'\nconst ORDER_PREV = 'prev'\nconst DIRECTION_LEFT = 'left'\nconst DIRECTION_RIGHT = 'right'\n\nconst EVENT_SLIDE = `slide${EVENT_KEY}`\nconst EVENT_SLID = `slid${EVENT_KEY}`\nconst EVENT_KEYDOWN = `keydown${EVENT_KEY}`\nconst EVENT_MOUSEENTER = `mouseenter${EVENT_KEY}`\nconst EVENT_MOUSELEAVE = `mouseleave${EVENT_KEY}`\nconst EVENT_DRAG_START = `dragstart${EVENT_KEY}`\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_CAROUSEL = 'carousel'\nconst CLASS_NAME_ACTIVE = 'active'\nconst CLASS_NAME_SLIDE = 'slide'\nconst CLASS_NAME_END = 'carousel-item-end'\nconst CLASS_NAME_START = 'carousel-item-start'\nconst CLASS_NAME_NEXT = 'carousel-item-next'\nconst CLASS_NAME_PREV = 'carousel-item-prev'\n\nconst SELECTOR_ACTIVE = '.active'\nconst SELECTOR_ITEM = '.carousel-item'\nconst SELECTOR_ACTIVE_ITEM = SELECTOR_ACTIVE + SELECTOR_ITEM\nconst SELECTOR_ITEM_IMG = '.carousel-item img'\nconst SELECTOR_INDICATORS = '.carousel-indicators'\nconst SELECTOR_DATA_SLIDE = '[data-bs-slide], [data-bs-slide-to]'\nconst SELECTOR_DATA_RIDE = '[data-bs-ride=\"carousel\"]'\n\nconst KEY_TO_DIRECTION = {\n  [ARROW_LEFT_KEY]: DIRECTION_RIGHT,\n  [ARROW_RIGHT_KEY]: DIRECTION_LEFT\n}\n\nconst Default = {\n  interval: 5000,\n  keyboard: true,\n  pause: 'hover',\n  ride: false,\n  touch: true,\n  wrap: true\n}\n\nconst DefaultType = {\n  interval: '(number|boolean)', // TODO:v6 remove boolean support\n  keyboard: 'boolean',\n  pause: '(string|boolean)',\n  ride: '(boolean|string)',\n  touch: 'boolean',\n  wrap: 'boolean'\n}\n\n/**\n * Class definition\n */\n\nclass Carousel extends BaseComponent {\n  constructor(element, config) {\n    super(element, config)\n\n    this._interval = null\n    this._activeElement = null\n    this._isSliding = false\n    this.touchTimeout = null\n    this._swipeHelper = null\n\n    this._indicatorsElement = SelectorEngine.findOne(SELECTOR_INDICATORS, this._element)\n    this._addEventListeners()\n\n    if (this._config.ride === CLASS_NAME_CAROUSEL) {\n      this.cycle()\n    }\n  }\n\n  // Getters\n  static get Default() {\n    return Default\n  }\n\n  static get DefaultType() {\n    return DefaultType\n  }\n\n  static get NAME() {\n    return NAME\n  }\n\n  // Public\n  next() {\n    this._slide(ORDER_NEXT)\n  }\n\n  nextWhenVisible() {\n    // FIXME TODO use `document.visibilityState`\n    // Don't call next when the page isn't visible\n    // or the carousel or its parent isn't visible\n    if (!document.hidden && isVisible(this._element)) {\n      this.next()\n    }\n  }\n\n  prev() {\n    this._slide(ORDER_PREV)\n  }\n\n  pause() {\n    if (this._isSliding) {\n      triggerTransitionEnd(this._element)\n    }\n\n    this._clearInterval()\n  }\n\n  cycle() {\n    this._clearInterval()\n    this._updateInterval()\n\n    this._interval = setInterval(() => this.nextWhenVisible(), this._config.interval)\n  }\n\n  _maybeEnableCycle() {\n    if (!this._config.ride) {\n      return\n    }\n\n    if (this._isSliding) {\n      EventHandler.one(this._element, EVENT_SLID, () => this.cycle())\n      return\n    }\n\n    this.cycle()\n  }\n\n  to(index) {\n    const items = this._getItems()\n    if (index > items.length - 1 || index < 0) {\n      return\n    }\n\n    if (this._isSliding) {\n      EventHandler.one(this._element, EVENT_SLID, () => this.to(index))\n      return\n    }\n\n    const activeIndex = this._getItemIndex(this._getActive())\n    if (activeIndex === index) {\n      return\n    }\n\n    const order = index > activeIndex ? ORDER_NEXT : ORDER_PREV\n\n    this._slide(order, items[index])\n  }\n\n  dispose() {\n    if (this._swipeHelper) {\n      this._swipeHelper.dispose()\n    }\n\n    super.dispose()\n  }\n\n  // Private\n  _configAfterMerge(config) {\n    config.defaultInterval = config.interval\n    return config\n  }\n\n  _addEventListeners() {\n    if (this._config.keyboard) {\n      EventHandler.on(this._element, EVENT_KEYDOWN, event => this._keydown(event))\n    }\n\n    if (this._config.pause === 'hover') {\n      EventHandler.on(this._element, EVENT_MOUSEENTER, () => this.pause())\n      EventHandler.on(this._element, EVENT_MOUSELEAVE, () => this._maybeEnableCycle())\n    }\n\n    if (this._config.touch && Swipe.isSupported()) {\n      this._addTouchEventListeners()\n    }\n  }\n\n  _addTouchEventListeners() {\n    for (const img of SelectorEngine.find(SELECTOR_ITEM_IMG, this._element)) {\n      EventHandler.on(img, EVENT_DRAG_START, event => event.preventDefault())\n    }\n\n    const endCallBack = () => {\n      if (this._config.pause !== 'hover') {\n        return\n      }\n\n      // If it's a touch-enabled device, mouseenter/leave are fired as\n      // part of the mouse compatibility events on first tap - the carousel\n      // would stop cycling until user tapped out of it;\n      // here, we listen for touchend, explicitly pause the carousel\n      // (as if it's the second time we tap on it, mouseenter compat event\n      // is NOT fired) and after a timeout (to allow for mouse compatibility\n      // events to fire) we explicitly restart cycling\n\n      this.pause()\n      if (this.touchTimeout) {\n        clearTimeout(this.touchTimeout)\n      }\n\n      this.touchTimeout = setTimeout(() => this._maybeEnableCycle(), TOUCHEVENT_COMPAT_WAIT + this._config.interval)\n    }\n\n    const swipeConfig = {\n      leftCallback: () => this._slide(this._directionToOrder(DIRECTION_LEFT)),\n      rightCallback: () => this._slide(this._directionToOrder(DIRECTION_RIGHT)),\n      endCallback: endCallBack\n    }\n\n    this._swipeHelper = new Swipe(this._element, swipeConfig)\n  }\n\n  _keydown(event) {\n    if (/input|textarea/i.test(event.target.tagName)) {\n      return\n    }\n\n    const direction = KEY_TO_DIRECTION[event.key]\n    if (direction) {\n      event.preventDefault()\n      this._slide(this._directionToOrder(direction))\n    }\n  }\n\n  _getItemIndex(element) {\n    return this._getItems().indexOf(element)\n  }\n\n  _setActiveIndicatorElement(index) {\n    if (!this._indicatorsElement) {\n      return\n    }\n\n    const activeIndicator = SelectorEngine.findOne(SELECTOR_ACTIVE, this._indicatorsElement)\n\n    activeIndicator.classList.remove(CLASS_NAME_ACTIVE)\n    activeIndicator.removeAttribute('aria-current')\n\n    const newActiveIndicator = SelectorEngine.findOne(`[data-bs-slide-to=\"${index}\"]`, this._indicatorsElement)\n\n    if (newActiveIndicator) {\n      newActiveIndicator.classList.add(CLASS_NAME_ACTIVE)\n      newActiveIndicator.setAttribute('aria-current', 'true')\n    }\n  }\n\n  _updateInterval() {\n    const element = this._activeElement || this._getActive()\n\n    if (!element) {\n      return\n    }\n\n    const elementInterval = Number.parseInt(element.getAttribute('data-bs-interval'), 10)\n\n    this._config.interval = elementInterval || this._config.defaultInterval\n  }\n\n  _slide(order, element = null) {\n    if (this._isSliding) {\n      return\n    }\n\n    const activeElement = this._getActive()\n    const isNext = order === ORDER_NEXT\n    const nextElement = element || getNextActiveElement(this._getItems(), activeElement, isNext, this._config.wrap)\n\n    if (nextElement === activeElement) {\n      return\n    }\n\n    const nextElementIndex = this._getItemIndex(nextElement)\n\n    const triggerEvent = eventName => {\n      return EventHandler.trigger(this._element, eventName, {\n        relatedTarget: nextElement,\n        direction: this._orderToDirection(order),\n        from: this._getItemIndex(activeElement),\n        to: nextElementIndex\n      })\n    }\n\n    const slideEvent = triggerEvent(EVENT_SLIDE)\n\n    if (slideEvent.defaultPrevented) {\n      return\n    }\n\n    if (!activeElement || !nextElement) {\n      // Some weirdness is happening, so we bail\n      // TODO: change tests that use empty divs to avoid this check\n      return\n    }\n\n    const isCycling = Boolean(this._interval)\n    this.pause()\n\n    this._isSliding = true\n\n    this._setActiveIndicatorElement(nextElementIndex)\n    this._activeElement = nextElement\n\n    const directionalClassName = isNext ? CLASS_NAME_START : CLASS_NAME_END\n    const orderClassName = isNext ? CLASS_NAME_NEXT : CLASS_NAME_PREV\n\n    nextElement.classList.add(orderClassName)\n\n    reflow(nextElement)\n\n    activeElement.classList.add(directionalClassName)\n    nextElement.classList.add(directionalClassName)\n\n    const completeCallBack = () => {\n      nextElement.classList.remove(directionalClassName, orderClassName)\n      nextElement.classList.add(CLASS_NAME_ACTIVE)\n\n      activeElement.classList.remove(CLASS_NAME_ACTIVE, orderClassName, directionalClassName)\n\n      this._isSliding = false\n\n      triggerEvent(EVENT_SLID)\n    }\n\n    this._queueCallback(completeCallBack, activeElement, this._isAnimated())\n\n    if (isCycling) {\n      this.cycle()\n    }\n  }\n\n  _isAnimated() {\n    return this._element.classList.contains(CLASS_NAME_SLIDE)\n  }\n\n  _getActive() {\n    return SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element)\n  }\n\n  _getItems() {\n    return SelectorEngine.find(SELECTOR_ITEM, this._element)\n  }\n\n  _clearInterval() {\n    if (this._interval) {\n      clearInterval(this._interval)\n      this._interval = null\n    }\n  }\n\n  _directionToOrder(direction) {\n    if (isRTL()) {\n      return direction === DIRECTION_LEFT ? ORDER_PREV : ORDER_NEXT\n    }\n\n    return direction === DIRECTION_LEFT ? ORDER_NEXT : ORDER_PREV\n  }\n\n  _orderToDirection(order) {\n    if (isRTL()) {\n      return order === ORDER_PREV ? DIRECTION_LEFT : DIRECTION_RIGHT\n    }\n\n    return order === ORDER_PREV ? DIRECTION_RIGHT : DIRECTION_LEFT\n  }\n\n  // Static\n  static jQueryInterface(config) {\n    return this.each(function () {\n      const data = Carousel.getOrCreateInstance(this, config)\n\n      if (typeof config === 'number') {\n        data.to(config)\n        return\n      }\n\n      if (typeof config === 'string') {\n        if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n          throw new TypeError(`No method named \"${config}\"`)\n        }\n\n        data[config]()\n      }\n    })\n  }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_SLIDE, function (event) {\n  const target = SelectorEngine.getElementFromSelector(this)\n\n  if (!target || !target.classList.contains(CLASS_NAME_CAROUSEL)) {\n    return\n  }\n\n  event.preventDefault()\n\n  const carousel = Carousel.getOrCreateInstance(target)\n  const slideIndex = this.getAttribute('data-bs-slide-to')\n\n  if (slideIndex) {\n    carousel.to(slideIndex)\n    carousel._maybeEnableCycle()\n    return\n  }\n\n  if (Manipulator.getDataAttribute(this, 'slide') === 'next') {\n    carousel.next()\n    carousel._maybeEnableCycle()\n    return\n  }\n\n  carousel.prev()\n  carousel._maybeEnableCycle()\n})\n\nEventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n  const carousels = SelectorEngine.find(SELECTOR_DATA_RIDE)\n\n  for (const carousel of carousels) {\n    Carousel.getOrCreateInstance(carousel)\n  }\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Carousel)\n\nexport default Carousel\n"
  },
  {
    "path": "js/src/collapse.js",
    "content": "/**\n * --------------------------------------------------------------------------\n * Bootstrap collapse.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport {\n  defineJQueryPlugin,\n  getElement,\n  reflow\n} from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'collapse'\nconst DATA_KEY = 'bs.collapse'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_COLLAPSE = 'collapse'\nconst CLASS_NAME_COLLAPSING = 'collapsing'\nconst CLASS_NAME_COLLAPSED = 'collapsed'\nconst CLASS_NAME_DEEPER_CHILDREN = `:scope .${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`\nconst CLASS_NAME_HORIZONTAL = 'collapse-horizontal'\n\nconst WIDTH = 'width'\nconst HEIGHT = 'height'\n\nconst SELECTOR_ACTIVES = '.collapse.show, .collapse.collapsing'\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"collapse\"]'\n\nconst Default = {\n  parent: null,\n  toggle: true\n}\n\nconst DefaultType = {\n  parent: '(null|element)',\n  toggle: 'boolean'\n}\n\n/**\n * Class definition\n */\n\nclass Collapse extends BaseComponent {\n  constructor(element, config) {\n    super(element, config)\n\n    this._isTransitioning = false\n    this._triggerArray = []\n\n    const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE)\n\n    for (const elem of toggleList) {\n      const selector = SelectorEngine.getSelectorFromElement(elem)\n      const filterElement = SelectorEngine.find(selector)\n        .filter(foundElement => foundElement === this._element)\n\n      if (selector !== null && filterElement.length) {\n        this._triggerArray.push(elem)\n      }\n    }\n\n    this._initializeChildren()\n\n    if (!this._config.parent) {\n      this._addAriaAndCollapsedClass(this._triggerArray, this._isShown())\n    }\n\n    if (this._config.toggle) {\n      this.toggle()\n    }\n  }\n\n  // Getters\n  static get Default() {\n    return Default\n  }\n\n  static get DefaultType() {\n    return DefaultType\n  }\n\n  static get NAME() {\n    return NAME\n  }\n\n  // Public\n  toggle() {\n    if (this._isShown()) {\n      this.hide()\n    } else {\n      this.show()\n    }\n  }\n\n  show() {\n    if (this._isTransitioning || this._isShown()) {\n      return\n    }\n\n    let activeChildren = []\n\n    // find active children\n    if (this._config.parent) {\n      activeChildren = this._getFirstLevelChildren(SELECTOR_ACTIVES)\n        .filter(element => element !== this._element)\n        .map(element => Collapse.getOrCreateInstance(element, { toggle: false }))\n    }\n\n    if (activeChildren.length && activeChildren[0]._isTransitioning) {\n      return\n    }\n\n    const startEvent = EventHandler.trigger(this._element, EVENT_SHOW)\n    if (startEvent.defaultPrevented) {\n      return\n    }\n\n    for (const activeInstance of activeChildren) {\n      activeInstance.hide()\n    }\n\n    const dimension = this._getDimension()\n\n    this._element.classList.remove(CLASS_NAME_COLLAPSE)\n    this._element.classList.add(CLASS_NAME_COLLAPSING)\n\n    this._element.style[dimension] = 0\n\n    this._addAriaAndCollapsedClass(this._triggerArray, true)\n    this._isTransitioning = true\n\n    const complete = () => {\n      this._isTransitioning = false\n\n      this._element.classList.remove(CLASS_NAME_COLLAPSING)\n      this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW)\n\n      this._element.style[dimension] = ''\n\n      EventHandler.trigger(this._element, EVENT_SHOWN)\n    }\n\n    const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1)\n    const scrollSize = `scroll${capitalizedDimension}`\n\n    this._queueCallback(complete, this._element, true)\n    this._element.style[dimension] = `${this._element[scrollSize]}px`\n  }\n\n  hide() {\n    if (this._isTransitioning || !this._isShown()) {\n      return\n    }\n\n    const startEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n    if (startEvent.defaultPrevented) {\n      return\n    }\n\n    const dimension = this._getDimension()\n\n    this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`\n\n    reflow(this._element)\n\n    this._element.classList.add(CLASS_NAME_COLLAPSING)\n    this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW)\n\n    for (const trigger of this._triggerArray) {\n      const element = SelectorEngine.getElementFromSelector(trigger)\n\n      if (element && !this._isShown(element)) {\n        this._addAriaAndCollapsedClass([trigger], false)\n      }\n    }\n\n    this._isTransitioning = true\n\n    const complete = () => {\n      this._isTransitioning = false\n      this._element.classList.remove(CLASS_NAME_COLLAPSING)\n      this._element.classList.add(CLASS_NAME_COLLAPSE)\n      EventHandler.trigger(this._element, EVENT_HIDDEN)\n    }\n\n    this._element.style[dimension] = ''\n\n    this._queueCallback(complete, this._element, true)\n  }\n\n  // Private\n  _isShown(element = this._element) {\n    return element.classList.contains(CLASS_NAME_SHOW)\n  }\n\n  _configAfterMerge(config) {\n    config.toggle = Boolean(config.toggle) // Coerce string values\n    config.parent = getElement(config.parent)\n    return config\n  }\n\n  _getDimension() {\n    return this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT\n  }\n\n  _initializeChildren() {\n    if (!this._config.parent) {\n      return\n    }\n\n    const children = this._getFirstLevelChildren(SELECTOR_DATA_TOGGLE)\n\n    for (const element of children) {\n      const selected = SelectorEngine.getElementFromSelector(element)\n\n      if (selected) {\n        this._addAriaAndCollapsedClass([element], this._isShown(selected))\n      }\n    }\n  }\n\n  _getFirstLevelChildren(selector) {\n    const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent)\n    // remove children if greater depth\n    return SelectorEngine.find(selector, this._config.parent).filter(element => !children.includes(element))\n  }\n\n  _addAriaAndCollapsedClass(triggerArray, isOpen) {\n    if (!triggerArray.length) {\n      return\n    }\n\n    for (const element of triggerArray) {\n      element.classList.toggle(CLASS_NAME_COLLAPSED, !isOpen)\n      element.setAttribute('aria-expanded', isOpen)\n    }\n  }\n\n  // Static\n  static jQueryInterface(config) {\n    const _config = {}\n    if (typeof config === 'string' && /show|hide/.test(config)) {\n      _config.toggle = false\n    }\n\n    return this.each(function () {\n      const data = Collapse.getOrCreateInstance(this, _config)\n\n      if (typeof config === 'string') {\n        if (typeof data[config] === 'undefined') {\n          throw new TypeError(`No method named \"${config}\"`)\n        }\n\n        data[config]()\n      }\n    })\n  }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n  // preventDefault only for <a> elements (which change the URL) not inside the collapsible element\n  if (event.target.tagName === 'A' || (event.delegateTarget && event.delegateTarget.tagName === 'A')) {\n    event.preventDefault()\n  }\n\n  for (const element of SelectorEngine.getMultipleElementsFromSelector(this)) {\n    Collapse.getOrCreateInstance(element, { toggle: false }).toggle()\n  }\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Collapse)\n\nexport default Collapse\n"
  },
  {
    "path": "js/src/dom/data.js",
    "content": "/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/data.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n/**\n * Constants\n */\n\nconst elementMap = new Map()\n\nexport default {\n  set(element, key, instance) {\n    if (!elementMap.has(element)) {\n      elementMap.set(element, new Map())\n    }\n\n    const instanceMap = elementMap.get(element)\n\n    // make it clear we only want one instance per element\n    // can be removed later when multiple key/instances are fine to be used\n    if (!instanceMap.has(key) && instanceMap.size !== 0) {\n      // eslint-disable-next-line no-console\n      console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`)\n      return\n    }\n\n    instanceMap.set(key, instance)\n  },\n\n  get(element, key) {\n    if (elementMap.has(element)) {\n      return elementMap.get(element).get(key) || null\n    }\n\n    return null\n  },\n\n  remove(element, key) {\n    if (!elementMap.has(element)) {\n      return\n    }\n\n    const instanceMap = elementMap.get(element)\n\n    instanceMap.delete(key)\n\n    // free up element references if there are no instances left for an element\n    if (instanceMap.size === 0) {\n      elementMap.delete(element)\n    }\n  }\n}\n"
  },
  {
    "path": "js/src/dom/event-handler.js",
    "content": "/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/event-handler.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport { getjQuery } from '../util/index.js'\n\n/**\n * Constants\n */\n\nconst namespaceRegex = /[^.]*(?=\\..*)\\.|.*/\nconst stripNameRegex = /\\..*/\nconst stripUidRegex = /::\\d+$/\nconst eventRegistry = {} // Events storage\nlet uidEvent = 1\nconst customEvents = {\n  mouseenter: 'mouseover',\n  mouseleave: 'mouseout'\n}\n\nconst nativeEvents = new Set([\n  'click',\n  'dblclick',\n  'mouseup',\n  'mousedown',\n  'contextmenu',\n  'mousewheel',\n  'DOMMouseScroll',\n  'mouseover',\n  'mouseout',\n  'mousemove',\n  'selectstart',\n  'selectend',\n  'keydown',\n  'keypress',\n  'keyup',\n  'orientationchange',\n  'touchstart',\n  'touchmove',\n  'touchend',\n  'touchcancel',\n  'pointerdown',\n  'pointermove',\n  'pointerup',\n  'pointerleave',\n  'pointercancel',\n  'gesturestart',\n  'gesturechange',\n  'gestureend',\n  'focus',\n  'blur',\n  'change',\n  'reset',\n  'select',\n  'submit',\n  'focusin',\n  'focusout',\n  'load',\n  'unload',\n  'beforeunload',\n  'resize',\n  'move',\n  'DOMContentLoaded',\n  'readystatechange',\n  'error',\n  'abort',\n  'scroll'\n])\n\n/**\n * Private methods\n */\n\nfunction makeEventUid(element, uid) {\n  return (uid && `${uid}::${uidEvent++}`) || element.uidEvent || uidEvent++\n}\n\nfunction getElementEvents(element) {\n  const uid = makeEventUid(element)\n\n  element.uidEvent = uid\n  eventRegistry[uid] = eventRegistry[uid] || {}\n\n  return eventRegistry[uid]\n}\n\nfunction bootstrapHandler(element, fn) {\n  return function handler(event) {\n    hydrateObj(event, { delegateTarget: element })\n\n    if (handler.oneOff) {\n      EventHandler.off(element, event.type, fn)\n    }\n\n    return fn.apply(element, [event])\n  }\n}\n\nfunction bootstrapDelegationHandler(element, selector, fn) {\n  return function handler(event) {\n    const domElements = element.querySelectorAll(selector)\n\n    for (let { target } = event; target && target !== this; target = target.parentNode) {\n      for (const domElement of domElements) {\n        if (domElement !== target) {\n          continue\n        }\n\n        hydrateObj(event, { delegateTarget: target })\n\n        if (handler.oneOff) {\n          EventHandler.off(element, event.type, selector, fn)\n        }\n\n        return fn.apply(target, [event])\n      }\n    }\n  }\n}\n\nfunction findHandler(events, callable, delegationSelector = null) {\n  return Object.values(events)\n    .find(event => event.callable === callable && event.delegationSelector === delegationSelector)\n}\n\nfunction normalizeParameters(originalTypeEvent, handler, delegationFunction) {\n  const isDelegated = typeof handler === 'string'\n  // TODO: tooltip passes `false` instead of selector, so we need to check\n  const callable = isDelegated ? delegationFunction : (handler || delegationFunction)\n  let typeEvent = getTypeEvent(originalTypeEvent)\n\n  if (!nativeEvents.has(typeEvent)) {\n    typeEvent = originalTypeEvent\n  }\n\n  return [isDelegated, callable, typeEvent]\n}\n\nfunction addHandler(element, originalTypeEvent, handler, delegationFunction, oneOff) {\n  if (typeof originalTypeEvent !== 'string' || !element) {\n    return\n  }\n\n  let [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction)\n\n  // in case of mouseenter or mouseleave wrap the handler within a function that checks for its DOM position\n  // this prevents the handler from being dispatched the same way as mouseover or mouseout does\n  if (originalTypeEvent in customEvents) {\n    const wrapFunction = fn => {\n      return function (event) {\n        if (!event.relatedTarget || (event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget))) {\n          return fn.call(this, event)\n        }\n      }\n    }\n\n    callable = wrapFunction(callable)\n  }\n\n  const events = getElementEvents(element)\n  const handlers = events[typeEvent] || (events[typeEvent] = {})\n  const previousFunction = findHandler(handlers, callable, isDelegated ? handler : null)\n\n  if (previousFunction) {\n    previousFunction.oneOff = previousFunction.oneOff && oneOff\n\n    return\n  }\n\n  const uid = makeEventUid(callable, originalTypeEvent.replace(namespaceRegex, ''))\n  const fn = isDelegated ?\n    bootstrapDelegationHandler(element, handler, callable) :\n    bootstrapHandler(element, callable)\n\n  fn.delegationSelector = isDelegated ? handler : null\n  fn.callable = callable\n  fn.oneOff = oneOff\n  fn.uidEvent = uid\n  handlers[uid] = fn\n\n  element.addEventListener(typeEvent, fn, isDelegated)\n}\n\nfunction removeHandler(element, events, typeEvent, handler, delegationSelector) {\n  const fn = findHandler(events[typeEvent], handler, delegationSelector)\n\n  if (!fn) {\n    return\n  }\n\n  element.removeEventListener(typeEvent, fn, Boolean(delegationSelector))\n  delete events[typeEvent][fn.uidEvent]\n}\n\nfunction removeNamespacedHandlers(element, events, typeEvent, namespace) {\n  const storeElementEvent = events[typeEvent] || {}\n\n  for (const [handlerKey, event] of Object.entries(storeElementEvent)) {\n    if (handlerKey.includes(namespace)) {\n      removeHandler(element, events, typeEvent, event.callable, event.delegationSelector)\n    }\n  }\n}\n\nfunction getTypeEvent(event) {\n  // allow to get the native events from namespaced events ('click.bs.button' --> 'click')\n  event = event.replace(stripNameRegex, '')\n  return customEvents[event] || event\n}\n\nconst EventHandler = {\n  on(element, event, handler, delegationFunction) {\n    addHandler(element, event, handler, delegationFunction, false)\n  },\n\n  one(element, event, handler, delegationFunction) {\n    addHandler(element, event, handler, delegationFunction, true)\n  },\n\n  off(element, originalTypeEvent, handler, delegationFunction) {\n    if (typeof originalTypeEvent !== 'string' || !element) {\n      return\n    }\n\n    const [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction)\n    const inNamespace = typeEvent !== originalTypeEvent\n    const events = getElementEvents(element)\n    const storeElementEvent = events[typeEvent] || {}\n    const isNamespace = originalTypeEvent.startsWith('.')\n\n    if (typeof callable !== 'undefined') {\n      // Simplest case: handler is passed, remove that listener ONLY.\n      if (!Object.keys(storeElementEvent).length) {\n        return\n      }\n\n      removeHandler(element, events, typeEvent, callable, isDelegated ? handler : null)\n      return\n    }\n\n    if (isNamespace) {\n      for (const elementEvent of Object.keys(events)) {\n        removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1))\n      }\n    }\n\n    for (const [keyHandlers, event] of Object.entries(storeElementEvent)) {\n      const handlerKey = keyHandlers.replace(stripUidRegex, '')\n\n      if (!inNamespace || originalTypeEvent.includes(handlerKey)) {\n        removeHandler(element, events, typeEvent, event.callable, event.delegationSelector)\n      }\n    }\n  },\n\n  trigger(element, event, args) {\n    if (typeof event !== 'string' || !element) {\n      return null\n    }\n\n    const $ = getjQuery()\n    const typeEvent = getTypeEvent(event)\n    const inNamespace = event !== typeEvent\n\n    let jQueryEvent = null\n    let bubbles = true\n    let nativeDispatch = true\n    let defaultPrevented = false\n\n    if (inNamespace && $) {\n      jQueryEvent = $.Event(event, args)\n\n      $(element).trigger(jQueryEvent)\n      bubbles = !jQueryEvent.isPropagationStopped()\n      nativeDispatch = !jQueryEvent.isImmediatePropagationStopped()\n      defaultPrevented = jQueryEvent.isDefaultPrevented()\n    }\n\n    const evt = hydrateObj(new Event(event, { bubbles, cancelable: true }), args)\n\n    if (defaultPrevented) {\n      evt.preventDefault()\n    }\n\n    if (nativeDispatch) {\n      element.dispatchEvent(evt)\n    }\n\n    if (evt.defaultPrevented && jQueryEvent) {\n      jQueryEvent.preventDefault()\n    }\n\n    return evt\n  }\n}\n\nfunction hydrateObj(obj, meta = {}) {\n  for (const [key, value] of Object.entries(meta)) {\n    try {\n      obj[key] = value\n    } catch {\n      Object.defineProperty(obj, key, {\n        configurable: true,\n        get() {\n          return value\n        }\n      })\n    }\n  }\n\n  return obj\n}\n\nexport default EventHandler\n"
  },
  {
    "path": "js/src/dom/manipulator.js",
    "content": "/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/manipulator.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nfunction normalizeData(value) {\n  if (value === 'true') {\n    return true\n  }\n\n  if (value === 'false') {\n    return false\n  }\n\n  if (value === Number(value).toString()) {\n    return Number(value)\n  }\n\n  if (value === '' || value === 'null') {\n    return null\n  }\n\n  if (typeof value !== 'string') {\n    return value\n  }\n\n  try {\n    return JSON.parse(decodeURIComponent(value))\n  } catch {\n    return value\n  }\n}\n\nfunction normalizeDataKey(key) {\n  return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`)\n}\n\nconst Manipulator = {\n  setDataAttribute(element, key, value) {\n    element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value)\n  },\n\n  removeDataAttribute(element, key) {\n    element.removeAttribute(`data-bs-${normalizeDataKey(key)}`)\n  },\n\n  getDataAttributes(element) {\n    if (!element) {\n      return {}\n    }\n\n    const attributes = {}\n    const bsKeys = Object.keys(element.dataset).filter(key => key.startsWith('bs') && !key.startsWith('bsConfig'))\n\n    for (const key of bsKeys) {\n      let pureKey = key.replace(/^bs/, '')\n      pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1)\n      attributes[pureKey] = normalizeData(element.dataset[key])\n    }\n\n    return attributes\n  },\n\n  getDataAttribute(element, key) {\n    return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`))\n  }\n}\n\nexport default Manipulator\n"
  },
  {
    "path": "js/src/dom/selector-engine.js",
    "content": "/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/selector-engine.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport { isDisabled, isVisible, parseSelector } from '../util/index.js'\n\nconst getSelector = element => {\n  let selector = element.getAttribute('data-bs-target')\n\n  if (!selector || selector === '#') {\n    let hrefAttribute = element.getAttribute('href')\n\n    // The only valid content that could double as a selector are IDs or classes,\n    // so everything starting with `#` or `.`. If a \"real\" URL is used as the selector,\n    // `document.querySelector` will rightfully complain it is invalid.\n    // See https://github.com/twbs/bootstrap/issues/32273\n    if (!hrefAttribute || (!hrefAttribute.includes('#') && !hrefAttribute.startsWith('.'))) {\n      return null\n    }\n\n    // Just in case some CMS puts out a full URL with the anchor appended\n    if (hrefAttribute.includes('#') && !hrefAttribute.startsWith('#')) {\n      hrefAttribute = `#${hrefAttribute.split('#')[1]}`\n    }\n\n    selector = hrefAttribute && hrefAttribute !== '#' ? hrefAttribute.trim() : null\n  }\n\n  return selector ? selector.split(',').map(sel => parseSelector(sel)).join(',') : null\n}\n\nconst SelectorEngine = {\n  find(selector, element = document.documentElement) {\n    return [].concat(...Element.prototype.querySelectorAll.call(element, selector))\n  },\n\n  findOne(selector, element = document.documentElement) {\n    return Element.prototype.querySelector.call(element, selector)\n  },\n\n  children(element, selector) {\n    return [].concat(...element.children).filter(child => child.matches(selector))\n  },\n\n  parents(element, selector) {\n    const parents = []\n    let ancestor = element.parentNode.closest(selector)\n\n    while (ancestor) {\n      parents.push(ancestor)\n      ancestor = ancestor.parentNode.closest(selector)\n    }\n\n    return parents\n  },\n\n  prev(element, selector) {\n    let previous = element.previousElementSibling\n\n    while (previous) {\n      if (previous.matches(selector)) {\n        return [previous]\n      }\n\n      previous = previous.previousElementSibling\n    }\n\n    return []\n  },\n  // TODO: this is now unused; remove later along with prev()\n  next(element, selector) {\n    let next = element.nextElementSibling\n\n    while (next) {\n      if (next.matches(selector)) {\n        return [next]\n      }\n\n      next = next.nextElementSibling\n    }\n\n    return []\n  },\n\n  focusableChildren(element) {\n    const focusables = [\n      'a',\n      'button',\n      'input',\n      'textarea',\n      'select',\n      'details',\n      '[tabindex]',\n      '[contenteditable=\"true\"]'\n    ].map(selector => `${selector}:not([tabindex^=\"-\"])`).join(',')\n\n    return this.find(focusables, element).filter(el => !isDisabled(el) && isVisible(el))\n  },\n\n  getSelectorFromElement(element) {\n    const selector = getSelector(element)\n\n    if (selector) {\n      return SelectorEngine.findOne(selector) ? selector : null\n    }\n\n    return null\n  },\n\n  getElementFromSelector(element) {\n    const selector = getSelector(element)\n\n    return selector ? SelectorEngine.findOne(selector) : null\n  },\n\n  getMultipleElementsFromSelector(element) {\n    const selector = getSelector(element)\n\n    return selector ? SelectorEngine.find(selector) : []\n  }\n}\n\nexport default SelectorEngine\n"
  },
  {
    "path": "js/src/dropdown.js",
    "content": "/**\n * --------------------------------------------------------------------------\n * Bootstrap dropdown.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport * as Popper from '@popperjs/core'\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport Manipulator from './dom/manipulator.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport {\n  defineJQueryPlugin,\n  execute,\n  getElement,\n  getNextActiveElement,\n  isDisabled,\n  isElement,\n  isRTL,\n  isVisible,\n  noop\n} from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'dropdown'\nconst DATA_KEY = 'bs.dropdown'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst ESCAPE_KEY = 'Escape'\nconst TAB_KEY = 'Tab'\nconst ARROW_UP_KEY = 'ArrowUp'\nconst ARROW_DOWN_KEY = 'ArrowDown'\nconst RIGHT_MOUSE_BUTTON = 2 // MouseEvent.button value for the secondary button, usually the right button\n\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_DROPUP = 'dropup'\nconst CLASS_NAME_DROPEND = 'dropend'\nconst CLASS_NAME_DROPSTART = 'dropstart'\nconst CLASS_NAME_DROPUP_CENTER = 'dropup-center'\nconst CLASS_NAME_DROPDOWN_CENTER = 'dropdown-center'\n\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"dropdown\"]:not(.disabled):not(:disabled)'\nconst SELECTOR_DATA_TOGGLE_SHOWN = `${SELECTOR_DATA_TOGGLE}.${CLASS_NAME_SHOW}`\nconst SELECTOR_MENU = '.dropdown-menu'\nconst SELECTOR_NAVBAR = '.navbar'\nconst SELECTOR_NAVBAR_NAV = '.navbar-nav'\nconst SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'\n\nconst PLACEMENT_TOP = isRTL() ? 'top-end' : 'top-start'\nconst PLACEMENT_TOPEND = isRTL() ? 'top-start' : 'top-end'\nconst PLACEMENT_BOTTOM = isRTL() ? 'bottom-end' : 'bottom-start'\nconst PLACEMENT_BOTTOMEND = isRTL() ? 'bottom-start' : 'bottom-end'\nconst PLACEMENT_RIGHT = isRTL() ? 'left-start' : 'right-start'\nconst PLACEMENT_LEFT = isRTL() ? 'right-start' : 'left-start'\nconst PLACEMENT_TOPCENTER = 'top'\nconst PLACEMENT_BOTTOMCENTER = 'bottom'\n\nconst Default = {\n  autoClose: true,\n  boundary: 'clippingParents',\n  display: 'dynamic',\n  offset: [0, 2],\n  popperConfig: null,\n  reference: 'toggle'\n}\n\nconst DefaultType = {\n  autoClose: '(boolean|string)',\n  boundary: '(string|element)',\n  display: 'string',\n  offset: '(array|string|function)',\n  popperConfig: '(null|object|function)',\n  reference: '(string|element|object)'\n}\n\n/**\n * Class definition\n */\n\nclass Dropdown extends BaseComponent {\n  constructor(element, config) {\n    super(element, config)\n\n    this._popper = null\n    this._parent = this._element.parentNode // dropdown wrapper\n    // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/\n    this._menu = SelectorEngine.next(this._element, SELECTOR_MENU)[0] ||\n      SelectorEngine.prev(this._element, SELECTOR_MENU)[0] ||\n      SelectorEngine.findOne(SELECTOR_MENU, this._parent)\n    this._inNavbar = this._detectNavbar()\n  }\n\n  // Getters\n  static get Default() {\n    return Default\n  }\n\n  static get DefaultType() {\n    return DefaultType\n  }\n\n  static get NAME() {\n    return NAME\n  }\n\n  // Public\n  toggle() {\n    return this._isShown() ? this.hide() : this.show()\n  }\n\n  show() {\n    if (isDisabled(this._element) || this._isShown()) {\n      return\n    }\n\n    const relatedTarget = {\n      relatedTarget: this._element\n    }\n\n    const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, relatedTarget)\n\n    if (showEvent.defaultPrevented) {\n      return\n    }\n\n    this._createPopper()\n\n    // If this is a touch-enabled device we add extra\n    // empty mouseover listeners to the body's immediate children;\n    // only needed because of broken event delegation on iOS\n    // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n    if ('ontouchstart' in document.documentElement && !this._parent.closest(SELECTOR_NAVBAR_NAV)) {\n      for (const element of [].concat(...document.body.children)) {\n        EventHandler.on(element, 'mouseover', noop)\n      }\n    }\n\n    this._element.focus()\n    this._element.setAttribute('aria-expanded', true)\n\n    this._menu.classList.add(CLASS_NAME_SHOW)\n    this._element.classList.add(CLASS_NAME_SHOW)\n    EventHandler.trigger(this._element, EVENT_SHOWN, relatedTarget)\n  }\n\n  hide() {\n    if (isDisabled(this._element) || !this._isShown()) {\n      return\n    }\n\n    const relatedTarget = {\n      relatedTarget: this._element\n    }\n\n    this._completeHide(relatedTarget)\n  }\n\n  dispose() {\n    if (this._popper) {\n      this._popper.destroy()\n    }\n\n    super.dispose()\n  }\n\n  update() {\n    this._inNavbar = this._detectNavbar()\n    if (this._popper) {\n      this._popper.update()\n    }\n  }\n\n  // Private\n  _completeHide(relatedTarget) {\n    const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE, relatedTarget)\n    if (hideEvent.defaultPrevented) {\n      return\n    }\n\n    // If this is a touch-enabled device we remove the extra\n    // empty mouseover listeners we added for iOS support\n    if ('ontouchstart' in document.documentElement) {\n      for (const element of [].concat(...document.body.children)) {\n        EventHandler.off(element, 'mouseover', noop)\n      }\n    }\n\n    if (this._popper) {\n      this._popper.destroy()\n    }\n\n    this._menu.classList.remove(CLASS_NAME_SHOW)\n    this._element.classList.remove(CLASS_NAME_SHOW)\n    this._element.setAttribute('aria-expanded', 'false')\n    Manipulator.removeDataAttribute(this._menu, 'popper')\n    EventHandler.trigger(this._element, EVENT_HIDDEN, relatedTarget)\n  }\n\n  _getConfig(config) {\n    config = super._getConfig(config)\n\n    if (typeof config.reference === 'object' && !isElement(config.reference) &&\n      typeof config.reference.getBoundingClientRect !== 'function'\n    ) {\n      // Popper virtual elements require a getBoundingClientRect method\n      throw new TypeError(`${NAME.toUpperCase()}: Option \"reference\" provided type \"object\" without a required \"getBoundingClientRect\" method.`)\n    }\n\n    return config\n  }\n\n  _createPopper() {\n    if (typeof Popper === 'undefined') {\n      throw new TypeError('Bootstrap\\'s dropdowns require Popper (https://popper.js.org/docs/v2/)')\n    }\n\n    let referenceElement = this._element\n\n    if (this._config.reference === 'parent') {\n      referenceElement = this._parent\n    } else if (isElement(this._config.reference)) {\n      referenceElement = getElement(this._config.reference)\n    } else if (typeof this._config.reference === 'object') {\n      referenceElement = this._config.reference\n    }\n\n    const popperConfig = this._getPopperConfig()\n    this._popper = Popper.createPopper(referenceElement, this._menu, popperConfig)\n  }\n\n  _isShown() {\n    return this._menu.classList.contains(CLASS_NAME_SHOW)\n  }\n\n  _getPlacement() {\n    const parentDropdown = this._parent\n\n    if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) {\n      return PLACEMENT_RIGHT\n    }\n\n    if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) {\n      return PLACEMENT_LEFT\n    }\n\n    if (parentDropdown.classList.contains(CLASS_NAME_DROPUP_CENTER)) {\n      return PLACEMENT_TOPCENTER\n    }\n\n    if (parentDropdown.classList.contains(CLASS_NAME_DROPDOWN_CENTER)) {\n      return PLACEMENT_BOTTOMCENTER\n    }\n\n    // We need to trim the value because custom properties can also include spaces\n    const isEnd = getComputedStyle(this._menu).getPropertyValue('--bs-position').trim() === 'end'\n\n    if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) {\n      return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP\n    }\n\n    return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM\n  }\n\n  _detectNavbar() {\n    return this._element.closest(SELECTOR_NAVBAR) !== null\n  }\n\n  _getOffset() {\n    const { offset } = this._config\n\n    if (typeof offset === 'string') {\n      return offset.split(',').map(value => Number.parseInt(value, 10))\n    }\n\n    if (typeof offset === 'function') {\n      return popperData => offset(popperData, this._element)\n    }\n\n    return offset\n  }\n\n  _getPopperConfig() {\n    const defaultBsPopperConfig = {\n      placement: this._getPlacement(),\n      modifiers: [{\n        name: 'preventOverflow',\n        options: {\n          boundary: this._config.boundary\n        }\n      },\n      {\n        name: 'offset',\n        options: {\n          offset: this._getOffset()\n        }\n      }]\n    }\n\n    // Disable Popper if we have a static display or Dropdown is in Navbar\n    if (this._inNavbar || this._config.display === 'static') {\n      Manipulator.setDataAttribute(this._menu, 'popper', 'static') // TODO: v6 remove\n      defaultBsPopperConfig.modifiers = [{\n        name: 'applyStyles',\n        enabled: false\n      }]\n    }\n\n    return {\n      ...defaultBsPopperConfig,\n      ...execute(this._config.popperConfig, [undefined, defaultBsPopperConfig])\n    }\n  }\n\n  _selectMenuItem({ key, target }) {\n    const items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, this._menu).filter(element => isVisible(element))\n\n    if (!items.length) {\n      return\n    }\n\n    // if target isn't included in items (e.g. when expanding the dropdown)\n    // allow cycling to get the last item in case key equals ARROW_UP_KEY\n    getNextActiveElement(items, target, key === ARROW_DOWN_KEY, !items.includes(target)).focus()\n  }\n\n  // Static\n  static jQueryInterface(config) {\n    return this.each(function () {\n      const data = Dropdown.getOrCreateInstance(this, config)\n\n      if (typeof config !== 'string') {\n        return\n      }\n\n      if (typeof data[config] === 'undefined') {\n        throw new TypeError(`No method named \"${config}\"`)\n      }\n\n      data[config]()\n    })\n  }\n\n  static clearMenus(event) {\n    if (event.button === RIGHT_MOUSE_BUTTON || (event.type === 'keyup' && event.key !== TAB_KEY)) {\n      return\n    }\n\n    const openToggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE_SHOWN)\n\n    for (const toggle of openToggles) {\n      const context = Dropdown.getInstance(toggle)\n      if (!context || context._config.autoClose === false) {\n        continue\n      }\n\n      const composedPath = event.composedPath()\n      const isMenuTarget = composedPath.includes(context._menu)\n      if (\n        composedPath.includes(context._element) ||\n        (context._config.autoClose === 'inside' && !isMenuTarget) ||\n        (context._config.autoClose === 'outside' && isMenuTarget)\n      ) {\n        continue\n      }\n\n      // Tab navigation through the dropdown menu or events from contained inputs shouldn't close the menu\n      if (context._menu.contains(event.target) && ((event.type === 'keyup' && event.key === TAB_KEY) || /input|select|option|textarea|form/i.test(event.target.tagName))) {\n        continue\n      }\n\n      const relatedTarget = { relatedTarget: context._element }\n\n      if (event.type === 'click') {\n        relatedTarget.clickEvent = event\n      }\n\n      context._completeHide(relatedTarget)\n    }\n  }\n\n  static dataApiKeydownHandler(event) {\n    // If not an UP | DOWN | ESCAPE key => not a dropdown command\n    // If input/textarea && if key is other than ESCAPE => not a dropdown command\n\n    const isInput = /input|textarea/i.test(event.target.tagName)\n    const isEscapeEvent = event.key === ESCAPE_KEY\n    const isUpOrDownEvent = [ARROW_UP_KEY, ARROW_DOWN_KEY].includes(event.key)\n\n    if (!isUpOrDownEvent && !isEscapeEvent) {\n      return\n    }\n\n    if (isInput && !isEscapeEvent) {\n      return\n    }\n\n    event.preventDefault()\n\n    // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/\n    const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE) ?\n      this :\n      (SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE)[0] ||\n        SelectorEngine.next(this, SELECTOR_DATA_TOGGLE)[0] ||\n        SelectorEngine.findOne(SELECTOR_DATA_TOGGLE, event.delegateTarget.parentNode))\n\n    const instance = Dropdown.getOrCreateInstance(getToggleButton)\n\n    if (isUpOrDownEvent) {\n      event.stopPropagation()\n      instance.show()\n      instance._selectMenuItem(event)\n      return\n    }\n\n    if (instance._isShown()) { // else is escape and we check if it is shown\n      event.stopPropagation()\n      instance.hide()\n      getToggleButton.focus()\n    }\n  }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE, Dropdown.dataApiKeydownHandler)\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler)\nEventHandler.on(document, EVENT_CLICK_DATA_API, Dropdown.clearMenus)\nEventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus)\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n  event.preventDefault()\n  Dropdown.getOrCreateInstance(this).toggle()\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Dropdown)\n\nexport default Dropdown\n"
  },
  {
    "path": "js/src/modal.js",
    "content": "/**\n * --------------------------------------------------------------------------\n * Bootstrap modal.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport Backdrop from './util/backdrop.js'\nimport { enableDismissTrigger } from './util/component-functions.js'\nimport FocusTrap from './util/focustrap.js'\nimport {\n  defineJQueryPlugin, isRTL, isVisible, reflow\n} from './util/index.js'\nimport ScrollBarHelper from './util/scrollbar.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'modal'\nconst DATA_KEY = 'bs.modal'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst ESCAPE_KEY = 'Escape'\n\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_RESIZE = `resize${EVENT_KEY}`\nconst EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY}`\nconst EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY}`\nconst EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_OPEN = 'modal-open'\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_STATIC = 'modal-static'\n\nconst OPEN_SELECTOR = '.modal.show'\nconst SELECTOR_DIALOG = '.modal-dialog'\nconst SELECTOR_MODAL_BODY = '.modal-body'\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"modal\"]'\n\nconst Default = {\n  backdrop: true,\n  focus: true,\n  keyboard: true\n}\n\nconst DefaultType = {\n  backdrop: '(boolean|string)',\n  focus: 'boolean',\n  keyboard: 'boolean'\n}\n\n/**\n * Class definition\n */\n\nclass Modal extends BaseComponent {\n  constructor(element, config) {\n    super(element, config)\n\n    this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, this._element)\n    this._backdrop = this._initializeBackDrop()\n    this._focustrap = this._initializeFocusTrap()\n    this._isShown = false\n    this._isTransitioning = false\n    this._scrollBar = new ScrollBarHelper()\n\n    this._addEventListeners()\n  }\n\n  // Getters\n  static get Default() {\n    return Default\n  }\n\n  static get DefaultType() {\n    return DefaultType\n  }\n\n  static get NAME() {\n    return NAME\n  }\n\n  // Public\n  toggle(relatedTarget) {\n    return this._isShown ? this.hide() : this.show(relatedTarget)\n  }\n\n  show(relatedTarget) {\n    if (this._isShown || this._isTransitioning) {\n      return\n    }\n\n    const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, {\n      relatedTarget\n    })\n\n    if (showEvent.defaultPrevented) {\n      return\n    }\n\n    this._isShown = true\n    this._isTransitioning = true\n\n    this._scrollBar.hide()\n\n    document.body.classList.add(CLASS_NAME_OPEN)\n\n    this._adjustDialog()\n\n    this._backdrop.show(() => this._showElement(relatedTarget))\n  }\n\n  hide() {\n    if (!this._isShown || this._isTransitioning) {\n      return\n    }\n\n    const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n\n    if (hideEvent.defaultPrevented) {\n      return\n    }\n\n    this._isShown = false\n    this._isTransitioning = true\n    this._focustrap.deactivate()\n\n    this._element.classList.remove(CLASS_NAME_SHOW)\n\n    this._queueCallback(() => this._hideModal(), this._element, this._isAnimated())\n  }\n\n  dispose() {\n    EventHandler.off(window, EVENT_KEY)\n    EventHandler.off(this._dialog, EVENT_KEY)\n\n    this._backdrop.dispose()\n    this._focustrap.deactivate()\n\n    super.dispose()\n  }\n\n  handleUpdate() {\n    this._adjustDialog()\n  }\n\n  // Private\n  _initializeBackDrop() {\n    return new Backdrop({\n      isVisible: Boolean(this._config.backdrop), // 'static' option will be translated to true, and booleans will keep their value,\n      isAnimated: this._isAnimated()\n    })\n  }\n\n  _initializeFocusTrap() {\n    return new FocusTrap({\n      trapElement: this._element\n    })\n  }\n\n  _showElement(relatedTarget) {\n    // try to append dynamic modal\n    if (!document.body.contains(this._element)) {\n      document.body.append(this._element)\n    }\n\n    this._element.style.display = 'block'\n    this._element.removeAttribute('aria-hidden')\n    this._element.setAttribute('aria-modal', true)\n    this._element.setAttribute('role', 'dialog')\n    this._element.scrollTop = 0\n\n    const modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog)\n    if (modalBody) {\n      modalBody.scrollTop = 0\n    }\n\n    reflow(this._element)\n\n    this._element.classList.add(CLASS_NAME_SHOW)\n\n    const transitionComplete = () => {\n      if (this._config.focus) {\n        this._focustrap.activate()\n      }\n\n      this._isTransitioning = false\n      EventHandler.trigger(this._element, EVENT_SHOWN, {\n        relatedTarget\n      })\n    }\n\n    this._queueCallback(transitionComplete, this._dialog, this._isAnimated())\n  }\n\n  _addEventListeners() {\n    EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {\n      if (event.key !== ESCAPE_KEY) {\n        return\n      }\n\n      if (this._config.keyboard) {\n        this.hide()\n        return\n      }\n\n      this._triggerBackdropTransition()\n    })\n\n    EventHandler.on(window, EVENT_RESIZE, () => {\n      if (this._isShown && !this._isTransitioning) {\n        this._adjustDialog()\n      }\n    })\n\n    EventHandler.on(this._element, EVENT_MOUSEDOWN_DISMISS, event => {\n      // a bad trick to segregate clicks that may start inside dialog but end outside, and avoid listen to scrollbar clicks\n      EventHandler.one(this._element, EVENT_CLICK_DISMISS, event2 => {\n        if (this._element !== event.target || this._element !== event2.target) {\n          return\n        }\n\n        if (this._config.backdrop === 'static') {\n          this._triggerBackdropTransition()\n          return\n        }\n\n        if (this._config.backdrop) {\n          this.hide()\n        }\n      })\n    })\n  }\n\n  _hideModal() {\n    this._element.style.display = 'none'\n    this._element.setAttribute('aria-hidden', true)\n    this._element.removeAttribute('aria-modal')\n    this._element.removeAttribute('role')\n    this._isTransitioning = false\n\n    this._backdrop.hide(() => {\n      document.body.classList.remove(CLASS_NAME_OPEN)\n      this._resetAdjustments()\n      this._scrollBar.reset()\n      EventHandler.trigger(this._element, EVENT_HIDDEN)\n    })\n  }\n\n  _isAnimated() {\n    return this._element.classList.contains(CLASS_NAME_FADE)\n  }\n\n  _triggerBackdropTransition() {\n    const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED)\n    if (hideEvent.defaultPrevented) {\n      return\n    }\n\n    const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight\n    const initialOverflowY = this._element.style.overflowY\n    // return if the following background transition hasn't yet completed\n    if (initialOverflowY === 'hidden' || this._element.classList.contains(CLASS_NAME_STATIC)) {\n      return\n    }\n\n    if (!isModalOverflowing) {\n      this._element.style.overflowY = 'hidden'\n    }\n\n    this._element.classList.add(CLASS_NAME_STATIC)\n    this._queueCallback(() => {\n      this._element.classList.remove(CLASS_NAME_STATIC)\n      this._queueCallback(() => {\n        this._element.style.overflowY = initialOverflowY\n      }, this._dialog)\n    }, this._dialog)\n\n    this._element.focus()\n  }\n\n  /**\n   * The following methods are used to handle overflowing modals\n   */\n\n  _adjustDialog() {\n    const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight\n    const scrollbarWidth = this._scrollBar.getWidth()\n    const isBodyOverflowing = scrollbarWidth > 0\n\n    if (isBodyOverflowing && !isModalOverflowing) {\n      const property = isRTL() ? 'paddingLeft' : 'paddingRight'\n      this._element.style[property] = `${scrollbarWidth}px`\n    }\n\n    if (!isBodyOverflowing && isModalOverflowing) {\n      const property = isRTL() ? 'paddingRight' : 'paddingLeft'\n      this._element.style[property] = `${scrollbarWidth}px`\n    }\n  }\n\n  _resetAdjustments() {\n    this._element.style.paddingLeft = ''\n    this._element.style.paddingRight = ''\n  }\n\n  // Static\n  static jQueryInterface(config, relatedTarget) {\n    return this.each(function () {\n      const data = Modal.getOrCreateInstance(this, config)\n\n      if (typeof config !== 'string') {\n        return\n      }\n\n      if (typeof data[config] === 'undefined') {\n        throw new TypeError(`No method named \"${config}\"`)\n      }\n\n      data[config](relatedTarget)\n    })\n  }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n  const target = SelectorEngine.getElementFromSelector(this)\n\n  if (['A', 'AREA'].includes(this.tagName)) {\n    event.preventDefault()\n  }\n\n  EventHandler.one(target, EVENT_SHOW, showEvent => {\n    if (showEvent.defaultPrevented) {\n      // only register focus restorer if modal will actually get shown\n      return\n    }\n\n    EventHandler.one(target, EVENT_HIDDEN, () => {\n      if (isVisible(this)) {\n        this.focus()\n      }\n    })\n  })\n\n  // avoid conflict when clicking modal toggler while another one is open\n  const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR)\n  if (alreadyOpen) {\n    Modal.getInstance(alreadyOpen).hide()\n  }\n\n  const data = Modal.getOrCreateInstance(target)\n\n  data.toggle(this)\n})\n\nenableDismissTrigger(Modal)\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Modal)\n\nexport default Modal\n"
  },
  {
    "path": "js/src/offcanvas.js",
    "content": "/**\n * --------------------------------------------------------------------------\n * Bootstrap offcanvas.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport Backdrop from './util/backdrop.js'\nimport { enableDismissTrigger } from './util/component-functions.js'\nimport FocusTrap from './util/focustrap.js'\nimport {\n  defineJQueryPlugin,\n  isDisabled,\n  isVisible\n} from './util/index.js'\nimport ScrollBarHelper from './util/scrollbar.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'offcanvas'\nconst DATA_KEY = 'bs.offcanvas'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\nconst ESCAPE_KEY = 'Escape'\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_SHOWING = 'showing'\nconst CLASS_NAME_HIDING = 'hiding'\nconst CLASS_NAME_BACKDROP = 'offcanvas-backdrop'\nconst OPEN_SELECTOR = '.offcanvas.show'\n\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_RESIZE = `resize${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`\n\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"offcanvas\"]'\n\nconst Default = {\n  backdrop: true,\n  keyboard: true,\n  scroll: false\n}\n\nconst DefaultType = {\n  backdrop: '(boolean|string)',\n  keyboard: 'boolean',\n  scroll: 'boolean'\n}\n\n/**\n * Class definition\n */\n\nclass Offcanvas extends BaseComponent {\n  constructor(element, config) {\n    super(element, config)\n\n    this._isShown = false\n    this._backdrop = this._initializeBackDrop()\n    this._focustrap = this._initializeFocusTrap()\n    this._addEventListeners()\n  }\n\n  // Getters\n  static get Default() {\n    return Default\n  }\n\n  static get DefaultType() {\n    return DefaultType\n  }\n\n  static get NAME() {\n    return NAME\n  }\n\n  // Public\n  toggle(relatedTarget) {\n    return this._isShown ? this.hide() : this.show(relatedTarget)\n  }\n\n  show(relatedTarget) {\n    if (this._isShown) {\n      return\n    }\n\n    const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, { relatedTarget })\n\n    if (showEvent.defaultPrevented) {\n      return\n    }\n\n    this._isShown = true\n    this._backdrop.show()\n\n    if (!this._config.scroll) {\n      new ScrollBarHelper().hide()\n    }\n\n    this._element.setAttribute('aria-modal', true)\n    this._element.setAttribute('role', 'dialog')\n    this._element.classList.add(CLASS_NAME_SHOWING)\n\n    const completeCallBack = () => {\n      if (!this._config.scroll || this._config.backdrop) {\n        this._focustrap.activate()\n      }\n\n      this._element.classList.add(CLASS_NAME_SHOW)\n      this._element.classList.remove(CLASS_NAME_SHOWING)\n      EventHandler.trigger(this._element, EVENT_SHOWN, { relatedTarget })\n    }\n\n    this._queueCallback(completeCallBack, this._element, true)\n  }\n\n  hide() {\n    if (!this._isShown) {\n      return\n    }\n\n    const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n\n    if (hideEvent.defaultPrevented) {\n      return\n    }\n\n    this._focustrap.deactivate()\n    this._element.blur()\n    this._isShown = false\n    this._element.classList.add(CLASS_NAME_HIDING)\n    this._backdrop.hide()\n\n    const completeCallback = () => {\n      this._element.classList.remove(CLASS_NAME_SHOW, CLASS_NAME_HIDING)\n      this._element.removeAttribute('aria-modal')\n      this._element.removeAttribute('role')\n\n      if (!this._config.scroll) {\n        new ScrollBarHelper().reset()\n      }\n\n      EventHandler.trigger(this._element, EVENT_HIDDEN)\n    }\n\n    this._queueCallback(completeCallback, this._element, true)\n  }\n\n  dispose() {\n    this._backdrop.dispose()\n    this._focustrap.deactivate()\n    super.dispose()\n  }\n\n  // Private\n  _initializeBackDrop() {\n    const clickCallback = () => {\n      if (this._config.backdrop === 'static') {\n        EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED)\n        return\n      }\n\n      this.hide()\n    }\n\n    // 'static' option will be translated to true, and booleans will keep their value\n    const isVisible = Boolean(this._config.backdrop)\n\n    return new Backdrop({\n      className: CLASS_NAME_BACKDROP,\n      isVisible,\n      isAnimated: true,\n      rootElement: this._element.parentNode,\n      clickCallback: isVisible ? clickCallback : null\n    })\n  }\n\n  _initializeFocusTrap() {\n    return new FocusTrap({\n      trapElement: this._element\n    })\n  }\n\n  _addEventListeners() {\n    EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {\n      if (event.key !== ESCAPE_KEY) {\n        return\n      }\n\n      if (this._config.keyboard) {\n        this.hide()\n        return\n      }\n\n      EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED)\n    })\n  }\n\n  // Static\n  static jQueryInterface(config) {\n    return this.each(function () {\n      const data = Offcanvas.getOrCreateInstance(this, config)\n\n      if (typeof config !== 'string') {\n        return\n      }\n\n      if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n        throw new TypeError(`No method named \"${config}\"`)\n      }\n\n      data[config](this)\n    })\n  }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n  const target = SelectorEngine.getElementFromSelector(this)\n\n  if (['A', 'AREA'].includes(this.tagName)) {\n    event.preventDefault()\n  }\n\n  if (isDisabled(this)) {\n    return\n  }\n\n  EventHandler.one(target, EVENT_HIDDEN, () => {\n    // focus on trigger when it is closed\n    if (isVisible(this)) {\n      this.focus()\n    }\n  })\n\n  // avoid conflict when clicking a toggler of an offcanvas, while another is open\n  const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR)\n  if (alreadyOpen && alreadyOpen !== target) {\n    Offcanvas.getInstance(alreadyOpen).hide()\n  }\n\n  const data = Offcanvas.getOrCreateInstance(target)\n  data.toggle(this)\n})\n\nEventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n  for (const selector of SelectorEngine.find(OPEN_SELECTOR)) {\n    Offcanvas.getOrCreateInstance(selector).show()\n  }\n})\n\nEventHandler.on(window, EVENT_RESIZE, () => {\n  for (const element of SelectorEngine.find('[aria-modal][class*=show][class*=offcanvas-]')) {\n    if (getComputedStyle(element).position !== 'fixed') {\n      Offcanvas.getOrCreateInstance(element).hide()\n    }\n  }\n})\n\nenableDismissTrigger(Offcanvas)\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Offcanvas)\n\nexport default Offcanvas\n"
  },
  {
    "path": "js/src/popover.js",
    "content": "/**\n * --------------------------------------------------------------------------\n * Bootstrap popover.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Tooltip from './tooltip.js'\nimport { defineJQueryPlugin } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'popover'\n\nconst SELECTOR_TITLE = '.popover-header'\nconst SELECTOR_CONTENT = '.popover-body'\n\nconst Default = {\n  ...Tooltip.Default,\n  content: '',\n  offset: [0, 8],\n  placement: 'right',\n  template: '<div class=\"popover\" role=\"tooltip\">' +\n    '<div class=\"popover-arrow\"></div>' +\n    '<h3 class=\"popover-header\"></h3>' +\n    '<div class=\"popover-body\"></div>' +\n    '</div>',\n  trigger: 'click'\n}\n\nconst DefaultType = {\n  ...Tooltip.DefaultType,\n  content: '(null|string|element|function)'\n}\n\n/**\n * Class definition\n */\n\nclass Popover extends Tooltip {\n  // Getters\n  static get Default() {\n    return Default\n  }\n\n  static get DefaultType() {\n    return DefaultType\n  }\n\n  static get NAME() {\n    return NAME\n  }\n\n  // Overrides\n  _isWithContent() {\n    return this._getTitle() || this._getContent()\n  }\n\n  // Private\n  _getContentForTemplate() {\n    return {\n      [SELECTOR_TITLE]: this._getTitle(),\n      [SELECTOR_CONTENT]: this._getContent()\n    }\n  }\n\n  _getContent() {\n    return this._resolvePossibleFunction(this._config.content)\n  }\n\n  // Static\n  static jQueryInterface(config) {\n    return this.each(function () {\n      const data = Popover.getOrCreateInstance(this, config)\n\n      if (typeof config !== 'string') {\n        return\n      }\n\n      if (typeof data[config] === 'undefined') {\n        throw new TypeError(`No method named \"${config}\"`)\n      }\n\n      data[config]()\n    })\n  }\n}\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Popover)\n\nexport default Popover\n"
  },
  {
    "path": "js/src/scrollspy.js",
    "content": "/**\n * --------------------------------------------------------------------------\n * Bootstrap scrollspy.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport {\n  defineJQueryPlugin, getElement, isDisabled, isVisible\n} from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'scrollspy'\nconst DATA_KEY = 'bs.scrollspy'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst EVENT_ACTIVATE = `activate${EVENT_KEY}`\nconst EVENT_CLICK = `click${EVENT_KEY}`\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item'\nconst CLASS_NAME_ACTIVE = 'active'\n\nconst SELECTOR_DATA_SPY = '[data-bs-spy=\"scroll\"]'\nconst SELECTOR_TARGET_LINKS = '[href]'\nconst SELECTOR_NAV_LIST_GROUP = '.nav, .list-group'\nconst SELECTOR_NAV_LINKS = '.nav-link'\nconst SELECTOR_NAV_ITEMS = '.nav-item'\nconst SELECTOR_LIST_ITEMS = '.list-group-item'\nconst SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_NAV_ITEMS} > ${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`\nconst SELECTOR_DROPDOWN = '.dropdown'\nconst SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle'\n\nconst Default = {\n  offset: null, // TODO: v6 @deprecated, keep it for backwards compatibility reasons\n  rootMargin: '0px 0px -25%',\n  smoothScroll: false,\n  target: null,\n  threshold: [0.1, 0.5, 1]\n}\n\nconst DefaultType = {\n  offset: '(number|null)', // TODO v6 @deprecated, keep it for backwards compatibility reasons\n  rootMargin: 'string',\n  smoothScroll: 'boolean',\n  target: 'element',\n  threshold: 'array'\n}\n\n/**\n * Class definition\n */\n\nclass ScrollSpy extends BaseComponent {\n  constructor(element, config) {\n    super(element, config)\n\n    // this._element is the observablesContainer and config.target the menu links wrapper\n    this._targetLinks = new Map()\n    this._observableSections = new Map()\n    this._rootElement = getComputedStyle(this._element).overflowY === 'visible' ? null : this._element\n    this._activeTarget = null\n    this._observer = null\n    this._previousScrollData = {\n      visibleEntryTop: 0,\n      parentScrollTop: 0\n    }\n    this.refresh() // initialize\n  }\n\n  // Getters\n  static get Default() {\n    return Default\n  }\n\n  static get DefaultType() {\n    return DefaultType\n  }\n\n  static get NAME() {\n    return NAME\n  }\n\n  // Public\n  refresh() {\n    this._initializeTargetsAndObservables()\n    this._maybeEnableSmoothScroll()\n\n    if (this._observer) {\n      this._observer.disconnect()\n    } else {\n      this._observer = this._getNewObserver()\n    }\n\n    for (const section of this._observableSections.values()) {\n      this._observer.observe(section)\n    }\n  }\n\n  dispose() {\n    this._observer.disconnect()\n    super.dispose()\n  }\n\n  // Private\n  _configAfterMerge(config) {\n    // TODO: on v6 target should be given explicitly & remove the {target: 'ss-target'} case\n    config.target = getElement(config.target) || document.body\n\n    // TODO: v6 Only for backwards compatibility reasons. Use rootMargin only\n    config.rootMargin = config.offset ? `${config.offset}px 0px -30%` : config.rootMargin\n\n    if (typeof config.threshold === 'string') {\n      config.threshold = config.threshold.split(',').map(value => Number.parseFloat(value))\n    }\n\n    return config\n  }\n\n  _maybeEnableSmoothScroll() {\n    if (!this._config.smoothScroll) {\n      return\n    }\n\n    // unregister any previous listeners\n    EventHandler.off(this._config.target, EVENT_CLICK)\n\n    EventHandler.on(this._config.target, EVENT_CLICK, SELECTOR_TARGET_LINKS, event => {\n      const observableSection = this._observableSections.get(event.target.hash)\n      if (observableSection) {\n        event.preventDefault()\n        const root = this._rootElement || window\n        const height = observableSection.offsetTop - this._element.offsetTop\n        if (root.scrollTo) {\n          root.scrollTo({ top: height, behavior: 'smooth' })\n          return\n        }\n\n        // Chrome 60 doesn't support `scrollTo`\n        root.scrollTop = height\n      }\n    })\n  }\n\n  _getNewObserver() {\n    const options = {\n      root: this._rootElement,\n      threshold: this._config.threshold,\n      rootMargin: this._config.rootMargin\n    }\n\n    return new IntersectionObserver(entries => this._observerCallback(entries), options)\n  }\n\n  // The logic of selection\n  _observerCallback(entries) {\n    const targetElement = entry => this._targetLinks.get(`#${entry.target.id}`)\n    const activate = entry => {\n      this._previousScrollData.visibleEntryTop = entry.target.offsetTop\n      this._process(targetElement(entry))\n    }\n\n    const parentScrollTop = (this._rootElement || document.documentElement).scrollTop\n    const userScrollsDown = parentScrollTop >= this._previousScrollData.parentScrollTop\n    this._previousScrollData.parentScrollTop = parentScrollTop\n\n    for (const entry of entries) {\n      if (!entry.isIntersecting) {\n        this._activeTarget = null\n        this._clearActiveClass(targetElement(entry))\n\n        continue\n      }\n\n      const entryIsLowerThanPrevious = entry.target.offsetTop >= this._previousScrollData.visibleEntryTop\n      // if we are scrolling down, pick the bigger offsetTop\n      if (userScrollsDown && entryIsLowerThanPrevious) {\n        activate(entry)\n        // if parent isn't scrolled, let's keep the first visible item, breaking the iteration\n        if (!parentScrollTop) {\n          return\n        }\n\n        continue\n      }\n\n      // if we are scrolling up, pick the smallest offsetTop\n      if (!userScrollsDown && !entryIsLowerThanPrevious) {\n        activate(entry)\n      }\n    }\n  }\n\n  _initializeTargetsAndObservables() {\n    this._targetLinks = new Map()\n    this._observableSections = new Map()\n\n    const targetLinks = SelectorEngine.find(SELECTOR_TARGET_LINKS, this._config.target)\n\n    for (const anchor of targetLinks) {\n      // ensure that the anchor has an id and is not disabled\n      if (!anchor.hash || isDisabled(anchor)) {\n        continue\n      }\n\n      const observableSection = SelectorEngine.findOne(decodeURI(anchor.hash), this._element)\n\n      // ensure that the observableSection exists & is visible\n      if (isVisible(observableSection)) {\n        this._targetLinks.set(decodeURI(anchor.hash), anchor)\n        this._observableSections.set(anchor.hash, observableSection)\n      }\n    }\n  }\n\n  _process(target) {\n    if (this._activeTarget === target) {\n      return\n    }\n\n    this._clearActiveClass(this._config.target)\n    this._activeTarget = target\n    target.classList.add(CLASS_NAME_ACTIVE)\n    this._activateParents(target)\n\n    EventHandler.trigger(this._element, EVENT_ACTIVATE, { relatedTarget: target })\n  }\n\n  _activateParents(target) {\n    // Activate dropdown parents\n    if (target.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) {\n      SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE, target.closest(SELECTOR_DROPDOWN))\n        .classList.add(CLASS_NAME_ACTIVE)\n      return\n    }\n\n    for (const listGroup of SelectorEngine.parents(target, SELECTOR_NAV_LIST_GROUP)) {\n      // Set triggered links parents as active\n      // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor\n      for (const item of SelectorEngine.prev(listGroup, SELECTOR_LINK_ITEMS)) {\n        item.classList.add(CLASS_NAME_ACTIVE)\n      }\n    }\n  }\n\n  _clearActiveClass(parent) {\n    parent.classList.remove(CLASS_NAME_ACTIVE)\n\n    const activeNodes = SelectorEngine.find(`${SELECTOR_TARGET_LINKS}.${CLASS_NAME_ACTIVE}`, parent)\n    for (const node of activeNodes) {\n      node.classList.remove(CLASS_NAME_ACTIVE)\n    }\n  }\n\n  // Static\n  static jQueryInterface(config) {\n    return this.each(function () {\n      const data = ScrollSpy.getOrCreateInstance(this, config)\n\n      if (typeof config !== 'string') {\n        return\n      }\n\n      if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n        throw new TypeError(`No method named \"${config}\"`)\n      }\n\n      data[config]()\n    })\n  }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n  for (const spy of SelectorEngine.find(SELECTOR_DATA_SPY)) {\n    ScrollSpy.getOrCreateInstance(spy)\n  }\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(ScrollSpy)\n\nexport default ScrollSpy\n"
  },
  {
    "path": "js/src/tab.js",
    "content": "/**\n * --------------------------------------------------------------------------\n * Bootstrap tab.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport { defineJQueryPlugin, getNextActiveElement, isDisabled } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'tab'\nconst DATA_KEY = 'bs.tab'\nconst EVENT_KEY = `.${DATA_KEY}`\n\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}`\nconst EVENT_KEYDOWN = `keydown${EVENT_KEY}`\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}`\n\nconst ARROW_LEFT_KEY = 'ArrowLeft'\nconst ARROW_RIGHT_KEY = 'ArrowRight'\nconst ARROW_UP_KEY = 'ArrowUp'\nconst ARROW_DOWN_KEY = 'ArrowDown'\nconst HOME_KEY = 'Home'\nconst END_KEY = 'End'\n\nconst CLASS_NAME_ACTIVE = 'active'\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_DROPDOWN = 'dropdown'\n\nconst SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle'\nconst SELECTOR_DROPDOWN_MENU = '.dropdown-menu'\nconst NOT_SELECTOR_DROPDOWN_TOGGLE = `:not(${SELECTOR_DROPDOWN_TOGGLE})`\n\nconst SELECTOR_TAB_PANEL = '.list-group, .nav, [role=\"tablist\"]'\nconst SELECTOR_OUTER = '.nav-item, .list-group-item'\nconst SELECTOR_INNER = `.nav-link${NOT_SELECTOR_DROPDOWN_TOGGLE}, .list-group-item${NOT_SELECTOR_DROPDOWN_TOGGLE}, [role=\"tab\"]${NOT_SELECTOR_DROPDOWN_TOGGLE}`\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"tab\"], [data-bs-toggle=\"pill\"], [data-bs-toggle=\"list\"]' // TODO: could only be `tab` in v6\nconst SELECTOR_INNER_ELEM = `${SELECTOR_INNER}, ${SELECTOR_DATA_TOGGLE}`\n\nconst SELECTOR_DATA_TOGGLE_ACTIVE = `.${CLASS_NAME_ACTIVE}[data-bs-toggle=\"tab\"], .${CLASS_NAME_ACTIVE}[data-bs-toggle=\"pill\"], .${CLASS_NAME_ACTIVE}[data-bs-toggle=\"list\"]`\n\n/**\n * Class definition\n */\n\nclass Tab extends BaseComponent {\n  constructor(element) {\n    super(element)\n    this._parent = this._element.closest(SELECTOR_TAB_PANEL)\n\n    if (!this._parent) {\n      return\n      // TODO: should throw exception in v6\n      // throw new TypeError(`${element.outerHTML} has not a valid parent ${SELECTOR_INNER_ELEM}`)\n    }\n\n    // Set up initial aria attributes\n    this._setInitialAttributes(this._parent, this._getChildren())\n\n    EventHandler.on(this._element, EVENT_KEYDOWN, event => this._keydown(event))\n  }\n\n  // Getters\n  static get NAME() {\n    return NAME\n  }\n\n  // Public\n  show() { // Shows this elem and deactivate the active sibling if exists\n    const innerElem = this._element\n    if (this._elemIsActive(innerElem)) {\n      return\n    }\n\n    // Search for active tab on same parent to deactivate it\n    const active = this._getActiveElem()\n\n    const hideEvent = active ?\n      EventHandler.trigger(active, EVENT_HIDE, { relatedTarget: innerElem }) :\n      null\n\n    const showEvent = EventHandler.trigger(innerElem, EVENT_SHOW, { relatedTarget: active })\n\n    if (showEvent.defaultPrevented || (hideEvent && hideEvent.defaultPrevented)) {\n      return\n    }\n\n    this._deactivate(active, innerElem)\n    this._activate(innerElem, active)\n  }\n\n  // Private\n  _activate(element, relatedElem) {\n    if (!element) {\n      return\n    }\n\n    element.classList.add(CLASS_NAME_ACTIVE)\n\n    this._activate(SelectorEngine.getElementFromSelector(element)) // Search and activate/show the proper section\n\n    const complete = () => {\n      if (element.getAttribute('role') !== 'tab') {\n        element.classList.add(CLASS_NAME_SHOW)\n        return\n      }\n\n      element.removeAttribute('tabindex')\n      element.setAttribute('aria-selected', true)\n      this._toggleDropDown(element, true)\n      EventHandler.trigger(element, EVENT_SHOWN, {\n        relatedTarget: relatedElem\n      })\n    }\n\n    this._queueCallback(complete, element, element.classList.contains(CLASS_NAME_FADE))\n  }\n\n  _deactivate(element, relatedElem) {\n    if (!element) {\n      return\n    }\n\n    element.classList.remove(CLASS_NAME_ACTIVE)\n    element.blur()\n\n    this._deactivate(SelectorEngine.getElementFromSelector(element)) // Search and deactivate the shown section too\n\n    const complete = () => {\n      if (element.getAttribute('role') !== 'tab') {\n        element.classList.remove(CLASS_NAME_SHOW)\n        return\n      }\n\n      element.setAttribute('aria-selected', false)\n      element.setAttribute('tabindex', '-1')\n      this._toggleDropDown(element, false)\n      EventHandler.trigger(element, EVENT_HIDDEN, { relatedTarget: relatedElem })\n    }\n\n    this._queueCallback(complete, element, element.classList.contains(CLASS_NAME_FADE))\n  }\n\n  _keydown(event) {\n    if (!([ARROW_LEFT_KEY, ARROW_RIGHT_KEY, ARROW_UP_KEY, ARROW_DOWN_KEY, HOME_KEY, END_KEY].includes(event.key))) {\n      return\n    }\n\n    event.stopPropagation()// stopPropagation/preventDefault both added to support up/down keys without scrolling the page\n    event.preventDefault()\n\n    const children = this._getChildren().filter(element => !isDisabled(element))\n    let nextActiveElement\n\n    if ([HOME_KEY, END_KEY].includes(event.key)) {\n      nextActiveElement = children[event.key === HOME_KEY ? 0 : children.length - 1]\n    } else {\n      const isNext = [ARROW_RIGHT_KEY, ARROW_DOWN_KEY].includes(event.key)\n      nextActiveElement = getNextActiveElement(children, event.target, isNext, true)\n    }\n\n    if (nextActiveElement) {\n      nextActiveElement.focus({ preventScroll: true })\n      Tab.getOrCreateInstance(nextActiveElement).show()\n    }\n  }\n\n  _getChildren() { // collection of inner elements\n    return SelectorEngine.find(SELECTOR_INNER_ELEM, this._parent)\n  }\n\n  _getActiveElem() {\n    return this._getChildren().find(child => this._elemIsActive(child)) || null\n  }\n\n  _setInitialAttributes(parent, children) {\n    this._setAttributeIfNotExists(parent, 'role', 'tablist')\n\n    for (const child of children) {\n      this._setInitialAttributesOnChild(child)\n    }\n  }\n\n  _setInitialAttributesOnChild(child) {\n    child = this._getInnerElement(child)\n    const isActive = this._elemIsActive(child)\n    const outerElem = this._getOuterElement(child)\n    child.setAttribute('aria-selected', isActive)\n\n    if (outerElem !== child) {\n      this._setAttributeIfNotExists(outerElem, 'role', 'presentation')\n    }\n\n    if (!isActive) {\n      child.setAttribute('tabindex', '-1')\n    }\n\n    this._setAttributeIfNotExists(child, 'role', 'tab')\n\n    // set attributes to the related panel too\n    this._setInitialAttributesOnTargetPanel(child)\n  }\n\n  _setInitialAttributesOnTargetPanel(child) {\n    const target = SelectorEngine.getElementFromSelector(child)\n\n    if (!target) {\n      return\n    }\n\n    this._setAttributeIfNotExists(target, 'role', 'tabpanel')\n\n    if (child.id) {\n      this._setAttributeIfNotExists(target, 'aria-labelledby', `${child.id}`)\n    }\n  }\n\n  _toggleDropDown(element, open) {\n    const outerElem = this._getOuterElement(element)\n    if (!outerElem.classList.contains(CLASS_DROPDOWN)) {\n      return\n    }\n\n    const toggle = (selector, className) => {\n      const element = SelectorEngine.findOne(selector, outerElem)\n      if (element) {\n        element.classList.toggle(className, open)\n      }\n    }\n\n    toggle(SELECTOR_DROPDOWN_TOGGLE, CLASS_NAME_ACTIVE)\n    toggle(SELECTOR_DROPDOWN_MENU, CLASS_NAME_SHOW)\n    outerElem.setAttribute('aria-expanded', open)\n  }\n\n  _setAttributeIfNotExists(element, attribute, value) {\n    if (!element.hasAttribute(attribute)) {\n      element.setAttribute(attribute, value)\n    }\n  }\n\n  _elemIsActive(elem) {\n    return elem.classList.contains(CLASS_NAME_ACTIVE)\n  }\n\n  // Try to get the inner element (usually the .nav-link)\n  _getInnerElement(elem) {\n    return elem.matches(SELECTOR_INNER_ELEM) ? elem : SelectorEngine.findOne(SELECTOR_INNER_ELEM, elem)\n  }\n\n  // Try to get the outer element (usually the .nav-item)\n  _getOuterElement(elem) {\n    return elem.closest(SELECTOR_OUTER) || elem\n  }\n\n  // Static\n  static jQueryInterface(config) {\n    return this.each(function () {\n      const data = Tab.getOrCreateInstance(this)\n\n      if (typeof config !== 'string') {\n        return\n      }\n\n      if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n        throw new TypeError(`No method named \"${config}\"`)\n      }\n\n      data[config]()\n    })\n  }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n  if (['A', 'AREA'].includes(this.tagName)) {\n    event.preventDefault()\n  }\n\n  if (isDisabled(this)) {\n    return\n  }\n\n  Tab.getOrCreateInstance(this).show()\n})\n\n/**\n * Initialize on focus\n */\nEventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n  for (const element of SelectorEngine.find(SELECTOR_DATA_TOGGLE_ACTIVE)) {\n    Tab.getOrCreateInstance(element)\n  }\n})\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Tab)\n\nexport default Tab\n"
  },
  {
    "path": "js/src/toast.js",
    "content": "/**\n * --------------------------------------------------------------------------\n * Bootstrap toast.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport { enableDismissTrigger } from './util/component-functions.js'\nimport { defineJQueryPlugin, reflow } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'toast'\nconst DATA_KEY = 'bs.toast'\nconst EVENT_KEY = `.${DATA_KEY}`\n\nconst EVENT_MOUSEOVER = `mouseover${EVENT_KEY}`\nconst EVENT_MOUSEOUT = `mouseout${EVENT_KEY}`\nconst EVENT_FOCUSIN = `focusin${EVENT_KEY}`\nconst EVENT_FOCUSOUT = `focusout${EVENT_KEY}`\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\n\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_HIDE = 'hide' // @deprecated - kept here only for backwards compatibility\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_SHOWING = 'showing'\n\nconst DefaultType = {\n  animation: 'boolean',\n  autohide: 'boolean',\n  delay: 'number'\n}\n\nconst Default = {\n  animation: true,\n  autohide: true,\n  delay: 5000\n}\n\n/**\n * Class definition\n */\n\nclass Toast extends BaseComponent {\n  constructor(element, config) {\n    super(element, config)\n\n    this._timeout = null\n    this._hasMouseInteraction = false\n    this._hasKeyboardInteraction = false\n    this._setListeners()\n  }\n\n  // Getters\n  static get Default() {\n    return Default\n  }\n\n  static get DefaultType() {\n    return DefaultType\n  }\n\n  static get NAME() {\n    return NAME\n  }\n\n  // Public\n  show() {\n    const showEvent = EventHandler.trigger(this._element, EVENT_SHOW)\n\n    if (showEvent.defaultPrevented) {\n      return\n    }\n\n    this._clearTimeout()\n\n    if (this._config.animation) {\n      this._element.classList.add(CLASS_NAME_FADE)\n    }\n\n    const complete = () => {\n      this._element.classList.remove(CLASS_NAME_SHOWING)\n      EventHandler.trigger(this._element, EVENT_SHOWN)\n\n      this._maybeScheduleHide()\n    }\n\n    this._element.classList.remove(CLASS_NAME_HIDE) // @deprecated\n    reflow(this._element)\n    this._element.classList.add(CLASS_NAME_SHOW, CLASS_NAME_SHOWING)\n\n    this._queueCallback(complete, this._element, this._config.animation)\n  }\n\n  hide() {\n    if (!this.isShown()) {\n      return\n    }\n\n    const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n\n    if (hideEvent.defaultPrevented) {\n      return\n    }\n\n    const complete = () => {\n      this._element.classList.add(CLASS_NAME_HIDE) // @deprecated\n      this._element.classList.remove(CLASS_NAME_SHOWING, CLASS_NAME_SHOW)\n      EventHandler.trigger(this._element, EVENT_HIDDEN)\n    }\n\n    this._element.classList.add(CLASS_NAME_SHOWING)\n    this._queueCallback(complete, this._element, this._config.animation)\n  }\n\n  dispose() {\n    this._clearTimeout()\n\n    if (this.isShown()) {\n      this._element.classList.remove(CLASS_NAME_SHOW)\n    }\n\n    super.dispose()\n  }\n\n  isShown() {\n    return this._element.classList.contains(CLASS_NAME_SHOW)\n  }\n\n  // Private\n  _maybeScheduleHide() {\n    if (!this._config.autohide) {\n      return\n    }\n\n    if (this._hasMouseInteraction || this._hasKeyboardInteraction) {\n      return\n    }\n\n    this._timeout = setTimeout(() => {\n      this.hide()\n    }, this._config.delay)\n  }\n\n  _onInteraction(event, isInteracting) {\n    switch (event.type) {\n      case 'mouseover':\n      case 'mouseout': {\n        this._hasMouseInteraction = isInteracting\n        break\n      }\n\n      case 'focusin':\n      case 'focusout': {\n        this._hasKeyboardInteraction = isInteracting\n        break\n      }\n\n      default: {\n        break\n      }\n    }\n\n    if (isInteracting) {\n      this._clearTimeout()\n      return\n    }\n\n    const nextElement = event.relatedTarget\n    if (this._element === nextElement || this._element.contains(nextElement)) {\n      return\n    }\n\n    this._maybeScheduleHide()\n  }\n\n  _setListeners() {\n    EventHandler.on(this._element, EVENT_MOUSEOVER, event => this._onInteraction(event, true))\n    EventHandler.on(this._element, EVENT_MOUSEOUT, event => this._onInteraction(event, false))\n    EventHandler.on(this._element, EVENT_FOCUSIN, event => this._onInteraction(event, true))\n    EventHandler.on(this._element, EVENT_FOCUSOUT, event => this._onInteraction(event, false))\n  }\n\n  _clearTimeout() {\n    clearTimeout(this._timeout)\n    this._timeout = null\n  }\n\n  // Static\n  static jQueryInterface(config) {\n    return this.each(function () {\n      const data = Toast.getOrCreateInstance(this, config)\n\n      if (typeof config === 'string') {\n        if (typeof data[config] === 'undefined') {\n          throw new TypeError(`No method named \"${config}\"`)\n        }\n\n        data[config](this)\n      }\n    })\n  }\n}\n\n/**\n * Data API implementation\n */\n\nenableDismissTrigger(Toast)\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Toast)\n\nexport default Toast\n"
  },
  {
    "path": "js/src/tooltip.js",
    "content": "/**\n * --------------------------------------------------------------------------\n * Bootstrap tooltip.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport * as Popper from '@popperjs/core'\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport Manipulator from './dom/manipulator.js'\nimport {\n  defineJQueryPlugin, execute, findShadowRoot, getElement, getUID, isRTL, noop\n} from './util/index.js'\nimport { DefaultAllowlist } from './util/sanitizer.js'\nimport TemplateFactory from './util/template-factory.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'tooltip'\nconst DISALLOWED_ATTRIBUTES = new Set(['sanitize', 'allowList', 'sanitizeFn'])\n\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_MODAL = 'modal'\nconst CLASS_NAME_SHOW = 'show'\n\nconst SELECTOR_TOOLTIP_INNER = '.tooltip-inner'\nconst SELECTOR_MODAL = `.${CLASS_NAME_MODAL}`\n\nconst EVENT_MODAL_HIDE = 'hide.bs.modal'\n\nconst TRIGGER_HOVER = 'hover'\nconst TRIGGER_FOCUS = 'focus'\nconst TRIGGER_CLICK = 'click'\nconst TRIGGER_MANUAL = 'manual'\n\nconst EVENT_HIDE = 'hide'\nconst EVENT_HIDDEN = 'hidden'\nconst EVENT_SHOW = 'show'\nconst EVENT_SHOWN = 'shown'\nconst EVENT_INSERTED = 'inserted'\nconst EVENT_CLICK = 'click'\nconst EVENT_FOCUSIN = 'focusin'\nconst EVENT_FOCUSOUT = 'focusout'\nconst EVENT_MOUSEENTER = 'mouseenter'\nconst EVENT_MOUSELEAVE = 'mouseleave'\n\nconst AttachmentMap = {\n  AUTO: 'auto',\n  TOP: 'top',\n  RIGHT: isRTL() ? 'left' : 'right',\n  BOTTOM: 'bottom',\n  LEFT: isRTL() ? 'right' : 'left'\n}\n\nconst Default = {\n  allowList: DefaultAllowlist,\n  animation: true,\n  boundary: 'clippingParents',\n  container: false,\n  customClass: '',\n  delay: 0,\n  fallbackPlacements: ['top', 'right', 'bottom', 'left'],\n  html: false,\n  offset: [0, 6],\n  placement: 'top',\n  popperConfig: null,\n  sanitize: true,\n  sanitizeFn: null,\n  selector: false,\n  template: '<div class=\"tooltip\" role=\"tooltip\">' +\n            '<div class=\"tooltip-arrow\"></div>' +\n            '<div class=\"tooltip-inner\"></div>' +\n            '</div>',\n  title: '',\n  trigger: 'hover focus'\n}\n\nconst DefaultType = {\n  allowList: 'object',\n  animation: 'boolean',\n  boundary: '(string|element)',\n  container: '(string|element|boolean)',\n  customClass: '(string|function)',\n  delay: '(number|object)',\n  fallbackPlacements: 'array',\n  html: 'boolean',\n  offset: '(array|string|function)',\n  placement: '(string|function)',\n  popperConfig: '(null|object|function)',\n  sanitize: 'boolean',\n  sanitizeFn: '(null|function)',\n  selector: '(string|boolean)',\n  template: 'string',\n  title: '(string|element|function)',\n  trigger: 'string'\n}\n\n/**\n * Class definition\n */\n\nclass Tooltip extends BaseComponent {\n  constructor(element, config) {\n    if (typeof Popper === 'undefined') {\n      throw new TypeError('Bootstrap\\'s tooltips require Popper (https://popper.js.org/docs/v2/)')\n    }\n\n    super(element, config)\n\n    // Private\n    this._isEnabled = true\n    this._timeout = 0\n    this._isHovered = null\n    this._activeTrigger = {}\n    this._popper = null\n    this._templateFactory = null\n    this._newContent = null\n\n    // Protected\n    this.tip = null\n\n    this._setListeners()\n\n    if (!this._config.selector) {\n      this._fixTitle()\n    }\n  }\n\n  // Getters\n  static get Default() {\n    return Default\n  }\n\n  static get DefaultType() {\n    return DefaultType\n  }\n\n  static get NAME() {\n    return NAME\n  }\n\n  // Public\n  enable() {\n    this._isEnabled = true\n  }\n\n  disable() {\n    this._isEnabled = false\n  }\n\n  toggleEnabled() {\n    this._isEnabled = !this._isEnabled\n  }\n\n  toggle() {\n    if (!this._isEnabled) {\n      return\n    }\n\n    if (this._isShown()) {\n      this._leave()\n      return\n    }\n\n    this._enter()\n  }\n\n  dispose() {\n    clearTimeout(this._timeout)\n\n    EventHandler.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler)\n\n    if (this._element.getAttribute('data-bs-original-title')) {\n      this._element.setAttribute('title', this._element.getAttribute('data-bs-original-title'))\n    }\n\n    this._disposePopper()\n    super.dispose()\n  }\n\n  show() {\n    if (this._element.style.display === 'none') {\n      throw new Error('Please use show on visible elements')\n    }\n\n    if (!(this._isWithContent() && this._isEnabled)) {\n      return\n    }\n\n    const showEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOW))\n    const shadowRoot = findShadowRoot(this._element)\n    const isInTheDom = (shadowRoot || this._element.ownerDocument.documentElement).contains(this._element)\n\n    if (showEvent.defaultPrevented || !isInTheDom) {\n      return\n    }\n\n    // TODO: v6 remove this or make it optional\n    this._disposePopper()\n\n    const tip = this._getTipElement()\n\n    this._element.setAttribute('aria-describedby', tip.getAttribute('id'))\n\n    const { container } = this._config\n\n    if (!this._element.ownerDocument.documentElement.contains(this.tip)) {\n      container.append(tip)\n      EventHandler.trigger(this._element, this.constructor.eventName(EVENT_INSERTED))\n    }\n\n    this._popper = this._createPopper(tip)\n\n    tip.classList.add(CLASS_NAME_SHOW)\n\n    // If this is a touch-enabled device we add extra\n    // empty mouseover listeners to the body's immediate children;\n    // only needed because of broken event delegation on iOS\n    // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n    if ('ontouchstart' in document.documentElement) {\n      for (const element of [].concat(...document.body.children)) {\n        EventHandler.on(element, 'mouseover', noop)\n      }\n    }\n\n    const complete = () => {\n      EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOWN))\n\n      if (this._isHovered === false) {\n        this._leave()\n      }\n\n      this._isHovered = false\n    }\n\n    this._queueCallback(complete, this.tip, this._isAnimated())\n  }\n\n  hide() {\n    if (!this._isShown()) {\n      return\n    }\n\n    const hideEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDE))\n    if (hideEvent.defaultPrevented) {\n      return\n    }\n\n    const tip = this._getTipElement()\n    tip.classList.remove(CLASS_NAME_SHOW)\n\n    // If this is a touch-enabled device we remove the extra\n    // empty mouseover listeners we added for iOS support\n    if ('ontouchstart' in document.documentElement) {\n      for (const element of [].concat(...document.body.children)) {\n        EventHandler.off(element, 'mouseover', noop)\n      }\n    }\n\n    this._activeTrigger[TRIGGER_CLICK] = false\n    this._activeTrigger[TRIGGER_FOCUS] = false\n    this._activeTrigger[TRIGGER_HOVER] = false\n    this._isHovered = null // it is a trick to support manual triggering\n\n    const complete = () => {\n      if (this._isWithActiveTrigger()) {\n        return\n      }\n\n      if (!this._isHovered) {\n        this._disposePopper()\n      }\n\n      this._element.removeAttribute('aria-describedby')\n      EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDDEN))\n    }\n\n    this._queueCallback(complete, this.tip, this._isAnimated())\n  }\n\n  update() {\n    if (this._popper) {\n      this._popper.update()\n    }\n  }\n\n  // Protected\n  _isWithContent() {\n    return Boolean(this._getTitle())\n  }\n\n  _getTipElement() {\n    if (!this.tip) {\n      this.tip = this._createTipElement(this._newContent || this._getContentForTemplate())\n    }\n\n    return this.tip\n  }\n\n  _createTipElement(content) {\n    const tip = this._getTemplateFactory(content).toHtml()\n\n    // TODO: remove this check in v6\n    if (!tip) {\n      return null\n    }\n\n    tip.classList.remove(CLASS_NAME_FADE, CLASS_NAME_SHOW)\n    // TODO: v6 the following can be achieved with CSS only\n    tip.classList.add(`bs-${this.constructor.NAME}-auto`)\n\n    const tipId = getUID(this.constructor.NAME).toString()\n\n    tip.setAttribute('id', tipId)\n\n    if (this._isAnimated()) {\n      tip.classList.add(CLASS_NAME_FADE)\n    }\n\n    return tip\n  }\n\n  setContent(content) {\n    this._newContent = content\n    if (this._isShown()) {\n      this._disposePopper()\n      this.show()\n    }\n  }\n\n  _getTemplateFactory(content) {\n    if (this._templateFactory) {\n      this._templateFactory.changeContent(content)\n    } else {\n      this._templateFactory = new TemplateFactory({\n        ...this._config,\n        // the `content` var has to be after `this._config`\n        // to override config.content in case of popover\n        content,\n        extraClass: this._resolvePossibleFunction(this._config.customClass)\n      })\n    }\n\n    return this._templateFactory\n  }\n\n  _getContentForTemplate() {\n    return {\n      [SELECTOR_TOOLTIP_INNER]: this._getTitle()\n    }\n  }\n\n  _getTitle() {\n    return this._resolvePossibleFunction(this._config.title) || this._element.getAttribute('data-bs-original-title')\n  }\n\n  // Private\n  _initializeOnDelegatedTarget(event) {\n    return this.constructor.getOrCreateInstance(event.delegateTarget, this._getDelegateConfig())\n  }\n\n  _isAnimated() {\n    return this._config.animation || (this.tip && this.tip.classList.contains(CLASS_NAME_FADE))\n  }\n\n  _isShown() {\n    return this.tip && this.tip.classList.contains(CLASS_NAME_SHOW)\n  }\n\n  _createPopper(tip) {\n    const placement = execute(this._config.placement, [this, tip, this._element])\n    const attachment = AttachmentMap[placement.toUpperCase()]\n    return Popper.createPopper(this._element, tip, this._getPopperConfig(attachment))\n  }\n\n  _getOffset() {\n    const { offset } = this._config\n\n    if (typeof offset === 'string') {\n      return offset.split(',').map(value => Number.parseInt(value, 10))\n    }\n\n    if (typeof offset === 'function') {\n      return popperData => offset(popperData, this._element)\n    }\n\n    return offset\n  }\n\n  _resolvePossibleFunction(arg) {\n    return execute(arg, [this._element, this._element])\n  }\n\n  _getPopperConfig(attachment) {\n    const defaultBsPopperConfig = {\n      placement: attachment,\n      modifiers: [\n        {\n          name: 'flip',\n          options: {\n            fallbackPlacements: this._config.fallbackPlacements\n          }\n        },\n        {\n          name: 'offset',\n          options: {\n            offset: this._getOffset()\n          }\n        },\n        {\n          name: 'preventOverflow',\n          options: {\n            boundary: this._config.boundary\n          }\n        },\n        {\n          name: 'arrow',\n          options: {\n            element: `.${this.constructor.NAME}-arrow`\n          }\n        },\n        {\n          name: 'preSetPlacement',\n          enabled: true,\n          phase: 'beforeMain',\n          fn: data => {\n            // Pre-set Popper's placement attribute in order to read the arrow sizes properly.\n            // Otherwise, Popper mixes up the width and height dimensions since the initial arrow style is for top placement\n            this._getTipElement().setAttribute('data-popper-placement', data.state.placement)\n          }\n        }\n      ]\n    }\n\n    return {\n      ...defaultBsPopperConfig,\n      ...execute(this._config.popperConfig, [undefined, defaultBsPopperConfig])\n    }\n  }\n\n  _setListeners() {\n    const triggers = this._config.trigger.split(' ')\n\n    for (const trigger of triggers) {\n      if (trigger === 'click') {\n        EventHandler.on(this._element, this.constructor.eventName(EVENT_CLICK), this._config.selector, event => {\n          const context = this._initializeOnDelegatedTarget(event)\n          context._activeTrigger[TRIGGER_CLICK] = !(context._isShown() && context._activeTrigger[TRIGGER_CLICK])\n          context.toggle()\n        })\n      } else if (trigger !== TRIGGER_MANUAL) {\n        const eventIn = trigger === TRIGGER_HOVER ?\n          this.constructor.eventName(EVENT_MOUSEENTER) :\n          this.constructor.eventName(EVENT_FOCUSIN)\n        const eventOut = trigger === TRIGGER_HOVER ?\n          this.constructor.eventName(EVENT_MOUSELEAVE) :\n          this.constructor.eventName(EVENT_FOCUSOUT)\n\n        EventHandler.on(this._element, eventIn, this._config.selector, event => {\n          const context = this._initializeOnDelegatedTarget(event)\n          context._activeTrigger[event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER] = true\n          context._enter()\n        })\n        EventHandler.on(this._element, eventOut, this._config.selector, event => {\n          const context = this._initializeOnDelegatedTarget(event)\n          context._activeTrigger[event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER] =\n            context._element.contains(event.relatedTarget)\n\n          context._leave()\n        })\n      }\n    }\n\n    this._hideModalHandler = () => {\n      if (this._element) {\n        this.hide()\n      }\n    }\n\n    EventHandler.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler)\n  }\n\n  _fixTitle() {\n    const title = this._element.getAttribute('title')\n\n    if (!title) {\n      return\n    }\n\n    if (!this._element.getAttribute('aria-label') && !this._element.textContent.trim()) {\n      this._element.setAttribute('aria-label', title)\n    }\n\n    this._element.setAttribute('data-bs-original-title', title) // DO NOT USE IT. Is only for backwards compatibility\n    this._element.removeAttribute('title')\n  }\n\n  _enter() {\n    if (this._isShown() || this._isHovered) {\n      this._isHovered = true\n      return\n    }\n\n    this._isHovered = true\n\n    this._setTimeout(() => {\n      if (this._isHovered) {\n        this.show()\n      }\n    }, this._config.delay.show)\n  }\n\n  _leave() {\n    if (this._isWithActiveTrigger()) {\n      return\n    }\n\n    this._isHovered = false\n\n    this._setTimeout(() => {\n      if (!this._isHovered) {\n        this.hide()\n      }\n    }, this._config.delay.hide)\n  }\n\n  _setTimeout(handler, timeout) {\n    clearTimeout(this._timeout)\n    this._timeout = setTimeout(handler, timeout)\n  }\n\n  _isWithActiveTrigger() {\n    return Object.values(this._activeTrigger).includes(true)\n  }\n\n  _getConfig(config) {\n    const dataAttributes = Manipulator.getDataAttributes(this._element)\n\n    for (const dataAttribute of Object.keys(dataAttributes)) {\n      if (DISALLOWED_ATTRIBUTES.has(dataAttribute)) {\n        delete dataAttributes[dataAttribute]\n      }\n    }\n\n    config = {\n      ...dataAttributes,\n      ...(typeof config === 'object' && config ? config : {})\n    }\n    config = this._mergeConfigObj(config)\n    config = this._configAfterMerge(config)\n    this._typeCheckConfig(config)\n    return config\n  }\n\n  _configAfterMerge(config) {\n    config.container = config.container === false ? document.body : getElement(config.container)\n\n    if (typeof config.delay === 'number') {\n      config.delay = {\n        show: config.delay,\n        hide: config.delay\n      }\n    }\n\n    if (typeof config.title === 'number') {\n      config.title = config.title.toString()\n    }\n\n    if (typeof config.content === 'number') {\n      config.content = config.content.toString()\n    }\n\n    return config\n  }\n\n  _getDelegateConfig() {\n    const config = {}\n\n    for (const [key, value] of Object.entries(this._config)) {\n      if (this.constructor.Default[key] !== value) {\n        config[key] = value\n      }\n    }\n\n    config.selector = false\n    config.trigger = 'manual'\n\n    // In the future can be replaced with:\n    // const keysWithDifferentValues = Object.entries(this._config).filter(entry => this.constructor.Default[entry[0]] !== this._config[entry[0]])\n    // `Object.fromEntries(keysWithDifferentValues)`\n    return config\n  }\n\n  _disposePopper() {\n    if (this._popper) {\n      this._popper.destroy()\n      this._popper = null\n    }\n\n    if (this.tip) {\n      this.tip.remove()\n      this.tip = null\n    }\n  }\n\n  // Static\n  static jQueryInterface(config) {\n    return this.each(function () {\n      const data = Tooltip.getOrCreateInstance(this, config)\n\n      if (typeof config !== 'string') {\n        return\n      }\n\n      if (typeof data[config] === 'undefined') {\n        throw new TypeError(`No method named \"${config}\"`)\n      }\n\n      data[config]()\n    })\n  }\n}\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Tooltip)\n\nexport default Tooltip\n"
  },
  {
    "path": "js/src/util/backdrop.js",
    "content": "/**\n * --------------------------------------------------------------------------\n * Bootstrap util/backdrop.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler.js'\nimport Config from './config.js'\nimport {\n  execute, executeAfterTransition, getElement, reflow\n} from './index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'backdrop'\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\nconst EVENT_MOUSEDOWN = `mousedown.bs.${NAME}`\n\nconst Default = {\n  className: 'modal-backdrop',\n  clickCallback: null,\n  isAnimated: false,\n  isVisible: true, // if false, we use the backdrop helper without adding any element to the dom\n  rootElement: 'body' // give the choice to place backdrop under different elements\n}\n\nconst DefaultType = {\n  className: 'string',\n  clickCallback: '(function|null)',\n  isAnimated: 'boolean',\n  isVisible: 'boolean',\n  rootElement: '(element|string)'\n}\n\n/**\n * Class definition\n */\n\nclass Backdrop extends Config {\n  constructor(config) {\n    super()\n    this._config = this._getConfig(config)\n    this._isAppended = false\n    this._element = null\n  }\n\n  // Getters\n  static get Default() {\n    return Default\n  }\n\n  static get DefaultType() {\n    return DefaultType\n  }\n\n  static get NAME() {\n    return NAME\n  }\n\n  // Public\n  show(callback) {\n    if (!this._config.isVisible) {\n      execute(callback)\n      return\n    }\n\n    this._append()\n\n    const element = this._getElement()\n    if (this._config.isAnimated) {\n      reflow(element)\n    }\n\n    element.classList.add(CLASS_NAME_SHOW)\n\n    this._emulateAnimation(() => {\n      execute(callback)\n    })\n  }\n\n  hide(callback) {\n    if (!this._config.isVisible) {\n      execute(callback)\n      return\n    }\n\n    this._getElement().classList.remove(CLASS_NAME_SHOW)\n\n    this._emulateAnimation(() => {\n      this.dispose()\n      execute(callback)\n    })\n  }\n\n  dispose() {\n    if (!this._isAppended) {\n      return\n    }\n\n    EventHandler.off(this._element, EVENT_MOUSEDOWN)\n\n    this._element.remove()\n    this._isAppended = false\n  }\n\n  // Private\n  _getElement() {\n    if (!this._element) {\n      const backdrop = document.createElement('div')\n      backdrop.className = this._config.className\n      if (this._config.isAnimated) {\n        backdrop.classList.add(CLASS_NAME_FADE)\n      }\n\n      this._element = backdrop\n    }\n\n    return this._element\n  }\n\n  _configAfterMerge(config) {\n    // use getElement() with the default \"body\" to get a fresh Element on each instantiation\n    config.rootElement = getElement(config.rootElement)\n    return config\n  }\n\n  _append() {\n    if (this._isAppended) {\n      return\n    }\n\n    const element = this._getElement()\n    this._config.rootElement.append(element)\n\n    EventHandler.on(element, EVENT_MOUSEDOWN, () => {\n      execute(this._config.clickCallback)\n    })\n\n    this._isAppended = true\n  }\n\n  _emulateAnimation(callback) {\n    executeAfterTransition(callback, this._getElement(), this._config.isAnimated)\n  }\n}\n\nexport default Backdrop\n"
  },
  {
    "path": "js/src/util/component-functions.js",
    "content": "/**\n * --------------------------------------------------------------------------\n * Bootstrap util/component-functions.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler.js'\nimport SelectorEngine from '../dom/selector-engine.js'\nimport { isDisabled } from './index.js'\n\nconst enableDismissTrigger = (component, method = 'hide') => {\n  const clickEvent = `click.dismiss${component.EVENT_KEY}`\n  const name = component.NAME\n\n  EventHandler.on(document, clickEvent, `[data-bs-dismiss=\"${name}\"]`, function (event) {\n    if (['A', 'AREA'].includes(this.tagName)) {\n      event.preventDefault()\n    }\n\n    if (isDisabled(this)) {\n      return\n    }\n\n    const target = SelectorEngine.getElementFromSelector(this) || this.closest(`.${name}`)\n    const instance = component.getOrCreateInstance(target)\n\n    // Method argument is left, for Alert and only, as it doesn't implement the 'hide' method\n    instance[method]()\n  })\n}\n\nexport {\n  enableDismissTrigger\n}\n"
  },
  {
    "path": "js/src/util/config.js",
    "content": "/**\n * --------------------------------------------------------------------------\n * Bootstrap util/config.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Manipulator from '../dom/manipulator.js'\nimport { isElement, toType } from './index.js'\n\n/**\n * Class definition\n */\n\nclass Config {\n  // Getters\n  static get Default() {\n    return {}\n  }\n\n  static get DefaultType() {\n    return {}\n  }\n\n  static get NAME() {\n    throw new Error('You have to implement the static method \"NAME\", for each component!')\n  }\n\n  _getConfig(config) {\n    config = this._mergeConfigObj(config)\n    config = this._configAfterMerge(config)\n    this._typeCheckConfig(config)\n    return config\n  }\n\n  _configAfterMerge(config) {\n    return config\n  }\n\n  _mergeConfigObj(config, element) {\n    const jsonConfig = isElement(element) ? Manipulator.getDataAttribute(element, 'config') : {} // try to parse\n\n    return {\n      ...this.constructor.Default,\n      ...(typeof jsonConfig === 'object' ? jsonConfig : {}),\n      ...(isElement(element) ? Manipulator.getDataAttributes(element) : {}),\n      ...(typeof config === 'object' ? config : {})\n    }\n  }\n\n  _typeCheckConfig(config, configTypes = this.constructor.DefaultType) {\n    for (const [property, expectedTypes] of Object.entries(configTypes)) {\n      const value = config[property]\n      const valueType = isElement(value) ? 'element' : toType(value)\n\n      if (!new RegExp(expectedTypes).test(valueType)) {\n        throw new TypeError(\n          `${this.constructor.NAME.toUpperCase()}: Option \"${property}\" provided type \"${valueType}\" but expected type \"${expectedTypes}\".`\n        )\n      }\n    }\n  }\n}\n\nexport default Config\n"
  },
  {
    "path": "js/src/util/focustrap.js",
    "content": "/**\n * --------------------------------------------------------------------------\n * Bootstrap util/focustrap.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler.js'\nimport SelectorEngine from '../dom/selector-engine.js'\nimport Config from './config.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'focustrap'\nconst DATA_KEY = 'bs.focustrap'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst EVENT_FOCUSIN = `focusin${EVENT_KEY}`\nconst EVENT_KEYDOWN_TAB = `keydown.tab${EVENT_KEY}`\n\nconst TAB_KEY = 'Tab'\nconst TAB_NAV_FORWARD = 'forward'\nconst TAB_NAV_BACKWARD = 'backward'\n\nconst Default = {\n  autofocus: true,\n  trapElement: null // The element to trap focus inside of\n}\n\nconst DefaultType = {\n  autofocus: 'boolean',\n  trapElement: 'element'\n}\n\n/**\n * Class definition\n */\n\nclass FocusTrap extends Config {\n  constructor(config) {\n    super()\n    this._config = this._getConfig(config)\n    this._isActive = false\n    this._lastTabNavDirection = null\n  }\n\n  // Getters\n  static get Default() {\n    return Default\n  }\n\n  static get DefaultType() {\n    return DefaultType\n  }\n\n  static get NAME() {\n    return NAME\n  }\n\n  // Public\n  activate() {\n    if (this._isActive) {\n      return\n    }\n\n    if (this._config.autofocus) {\n      this._config.trapElement.focus()\n    }\n\n    EventHandler.off(document, EVENT_KEY) // guard against infinite focus loop\n    EventHandler.on(document, EVENT_FOCUSIN, event => this._handleFocusin(event))\n    EventHandler.on(document, EVENT_KEYDOWN_TAB, event => this._handleKeydown(event))\n\n    this._isActive = true\n  }\n\n  deactivate() {\n    if (!this._isActive) {\n      return\n    }\n\n    this._isActive = false\n    EventHandler.off(document, EVENT_KEY)\n  }\n\n  // Private\n  _handleFocusin(event) {\n    const { trapElement } = this._config\n\n    if (event.target === document || event.target === trapElement || trapElement.contains(event.target)) {\n      return\n    }\n\n    const elements = SelectorEngine.focusableChildren(trapElement)\n\n    if (elements.length === 0) {\n      trapElement.focus()\n    } else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) {\n      elements[elements.length - 1].focus()\n    } else {\n      elements[0].focus()\n    }\n  }\n\n  _handleKeydown(event) {\n    if (event.key !== TAB_KEY) {\n      return\n    }\n\n    this._lastTabNavDirection = event.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD\n  }\n}\n\nexport default FocusTrap\n"
  },
  {
    "path": "js/src/util/index.js",
    "content": "/**\n * --------------------------------------------------------------------------\n * Bootstrap util/index.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst MAX_UID = 1_000_000\nconst MILLISECONDS_MULTIPLIER = 1000\nconst TRANSITION_END = 'transitionend'\n\n/**\n * Properly escape IDs selectors to handle weird IDs\n * @param {string} selector\n * @returns {string}\n */\nconst parseSelector = selector => {\n  if (selector && window.CSS && window.CSS.escape) {\n    // document.querySelector needs escaping to handle IDs (html5+) containing for instance /\n    selector = selector.replace(/#([^\\s\"#']+)/g, (match, id) => `#${CSS.escape(id)}`)\n  }\n\n  return selector\n}\n\n// Shout-out Angus Croll (https://goo.gl/pxwQGp)\nconst toType = object => {\n  if (object === null || object === undefined) {\n    return `${object}`\n  }\n\n  return Object.prototype.toString.call(object).match(/\\s([a-z]+)/i)[1].toLowerCase()\n}\n\n/**\n * Public Util API\n */\n\nconst getUID = prefix => {\n  do {\n    prefix += Math.floor(Math.random() * MAX_UID)\n  } while (document.getElementById(prefix))\n\n  return prefix\n}\n\nconst getTransitionDurationFromElement = element => {\n  if (!element) {\n    return 0\n  }\n\n  // Get transition-duration of the element\n  let { transitionDuration, transitionDelay } = window.getComputedStyle(element)\n\n  const floatTransitionDuration = Number.parseFloat(transitionDuration)\n  const floatTransitionDelay = Number.parseFloat(transitionDelay)\n\n  // Return 0 if element or transition duration is not found\n  if (!floatTransitionDuration && !floatTransitionDelay) {\n    return 0\n  }\n\n  // If multiple durations are defined, take the first\n  transitionDuration = transitionDuration.split(',')[0]\n  transitionDelay = transitionDelay.split(',')[0]\n\n  return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER\n}\n\nconst triggerTransitionEnd = element => {\n  element.dispatchEvent(new Event(TRANSITION_END))\n}\n\nconst isElement = object => {\n  if (!object || typeof object !== 'object') {\n    return false\n  }\n\n  if (typeof object.jquery !== 'undefined') {\n    object = object[0]\n  }\n\n  return typeof object.nodeType !== 'undefined'\n}\n\nconst getElement = object => {\n  // it's a jQuery object or a node element\n  if (isElement(object)) {\n    return object.jquery ? object[0] : object\n  }\n\n  if (typeof object === 'string' && object.length > 0) {\n    return document.querySelector(parseSelector(object))\n  }\n\n  return null\n}\n\nconst isVisible = element => {\n  if (!isElement(element) || element.getClientRects().length === 0) {\n    return false\n  }\n\n  const elementIsVisible = getComputedStyle(element).getPropertyValue('visibility') === 'visible'\n  // Handle `details` element as its content may falsie appear visible when it is closed\n  const closedDetails = element.closest('details:not([open])')\n\n  if (!closedDetails) {\n    return elementIsVisible\n  }\n\n  if (closedDetails !== element) {\n    const summary = element.closest('summary')\n    if (summary && summary.parentNode !== closedDetails) {\n      return false\n    }\n\n    if (summary === null) {\n      return false\n    }\n  }\n\n  return elementIsVisible\n}\n\nconst isDisabled = element => {\n  if (!element || element.nodeType !== Node.ELEMENT_NODE) {\n    return true\n  }\n\n  if (element.classList.contains('disabled')) {\n    return true\n  }\n\n  if (typeof element.disabled !== 'undefined') {\n    return element.disabled\n  }\n\n  return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false'\n}\n\nconst findShadowRoot = element => {\n  if (!document.documentElement.attachShadow) {\n    return null\n  }\n\n  // Can find the shadow root otherwise it'll return the document\n  if (typeof element.getRootNode === 'function') {\n    const root = element.getRootNode()\n    return root instanceof ShadowRoot ? root : null\n  }\n\n  if (element instanceof ShadowRoot) {\n    return element\n  }\n\n  // when we don't find a shadow root\n  if (!element.parentNode) {\n    return null\n  }\n\n  return findShadowRoot(element.parentNode)\n}\n\nconst noop = () => {}\n\n/**\n * Trick to restart an element's animation\n *\n * @param {HTMLElement} element\n * @return void\n *\n * @see https://www.harrytheo.com/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation\n */\nconst reflow = element => {\n  element.offsetHeight // eslint-disable-line no-unused-expressions\n}\n\nconst getjQuery = () => {\n  if (window.jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {\n    return window.jQuery\n  }\n\n  return null\n}\n\nconst DOMContentLoadedCallbacks = []\n\nconst onDOMContentLoaded = callback => {\n  if (document.readyState === 'loading') {\n    // add listener on the first call when the document is in loading state\n    if (!DOMContentLoadedCallbacks.length) {\n      document.addEventListener('DOMContentLoaded', () => {\n        for (const callback of DOMContentLoadedCallbacks) {\n          callback()\n        }\n      })\n    }\n\n    DOMContentLoadedCallbacks.push(callback)\n  } else {\n    callback()\n  }\n}\n\nconst isRTL = () => document.documentElement.dir === 'rtl'\n\nconst defineJQueryPlugin = plugin => {\n  onDOMContentLoaded(() => {\n    const $ = getjQuery()\n    /* istanbul ignore if */\n    if ($) {\n      const name = plugin.NAME\n      const JQUERY_NO_CONFLICT = $.fn[name]\n      $.fn[name] = plugin.jQueryInterface\n      $.fn[name].Constructor = plugin\n      $.fn[name].noConflict = () => {\n        $.fn[name] = JQUERY_NO_CONFLICT\n        return plugin.jQueryInterface\n      }\n    }\n  })\n}\n\nconst execute = (possibleCallback, args = [], defaultValue = possibleCallback) => {\n  return typeof possibleCallback === 'function' ? possibleCallback.call(...args) : defaultValue\n}\n\nconst executeAfterTransition = (callback, transitionElement, waitForTransition = true) => {\n  if (!waitForTransition) {\n    execute(callback)\n    return\n  }\n\n  const durationPadding = 5\n  const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding\n\n  let called = false\n\n  const handler = ({ target }) => {\n    if (target !== transitionElement) {\n      return\n    }\n\n    called = true\n    transitionElement.removeEventListener(TRANSITION_END, handler)\n    execute(callback)\n  }\n\n  transitionElement.addEventListener(TRANSITION_END, handler)\n  setTimeout(() => {\n    if (!called) {\n      triggerTransitionEnd(transitionElement)\n    }\n  }, emulatedDuration)\n}\n\n/**\n * Return the previous/next element of a list.\n *\n * @param {array} list    The list of elements\n * @param activeElement   The active element\n * @param shouldGetNext   Choose to get next or previous element\n * @param isCycleAllowed\n * @return {Element|elem} The proper element\n */\nconst getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => {\n  const listLength = list.length\n  let index = list.indexOf(activeElement)\n\n  // if the element does not exist in the list return an element\n  // depending on the direction and if cycle is allowed\n  if (index === -1) {\n    return !shouldGetNext && isCycleAllowed ? list[listLength - 1] : list[0]\n  }\n\n  index += shouldGetNext ? 1 : -1\n\n  if (isCycleAllowed) {\n    index = (index + listLength) % listLength\n  }\n\n  return list[Math.max(0, Math.min(index, listLength - 1))]\n}\n\nexport {\n  defineJQueryPlugin,\n  execute,\n  executeAfterTransition,\n  findShadowRoot,\n  getElement,\n  getjQuery,\n  getNextActiveElement,\n  getTransitionDurationFromElement,\n  getUID,\n  isDisabled,\n  isElement,\n  isRTL,\n  isVisible,\n  noop,\n  onDOMContentLoaded,\n  parseSelector,\n  reflow,\n  triggerTransitionEnd,\n  toType\n}\n"
  },
  {
    "path": "js/src/util/sanitizer.js",
    "content": "/**\n * --------------------------------------------------------------------------\n * Bootstrap util/sanitizer.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n// js-docs-start allow-list\nconst ARIA_ATTRIBUTE_PATTERN = /^aria-[\\w-]*$/i\n\nexport const DefaultAllowlist = {\n  // Global attributes allowed on any supplied element below.\n  '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\n  a: ['target', 'href', 'title', 'rel'],\n  area: [],\n  b: [],\n  br: [],\n  col: [],\n  code: [],\n  dd: [],\n  div: [],\n  dl: [],\n  dt: [],\n  em: [],\n  hr: [],\n  h1: [],\n  h2: [],\n  h3: [],\n  h4: [],\n  h5: [],\n  h6: [],\n  i: [],\n  img: ['src', 'srcset', 'alt', 'title', 'width', 'height'],\n  li: [],\n  ol: [],\n  p: [],\n  pre: [],\n  s: [],\n  small: [],\n  span: [],\n  sub: [],\n  sup: [],\n  strong: [],\n  u: [],\n  ul: []\n}\n// js-docs-end allow-list\n\nconst uriAttributes = new Set([\n  'background',\n  'cite',\n  'href',\n  'itemtype',\n  'longdesc',\n  'poster',\n  'src',\n  'xlink:href'\n])\n\n/**\n * A pattern that recognizes URLs that are safe wrt. XSS in URL navigation\n * contexts.\n *\n * Shout-out to Angular https://github.com/angular/angular/blob/15.2.8/packages/core/src/sanitization/url_sanitizer.ts#L38\n */\nconst SAFE_URL_PATTERN = /^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i\n\nconst allowedAttribute = (attribute, allowedAttributeList) => {\n  const attributeName = attribute.nodeName.toLowerCase()\n\n  if (allowedAttributeList.includes(attributeName)) {\n    if (uriAttributes.has(attributeName)) {\n      return Boolean(SAFE_URL_PATTERN.test(attribute.nodeValue))\n    }\n\n    return true\n  }\n\n  // Check if a regular expression validates the attribute.\n  return allowedAttributeList.filter(attributeRegex => attributeRegex instanceof RegExp)\n    .some(regex => regex.test(attributeName))\n}\n\nexport function sanitizeHtml(unsafeHtml, allowList, sanitizeFunction) {\n  if (!unsafeHtml.length) {\n    return unsafeHtml\n  }\n\n  if (sanitizeFunction && typeof sanitizeFunction === 'function') {\n    return sanitizeFunction(unsafeHtml)\n  }\n\n  const domParser = new window.DOMParser()\n  const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html')\n  const elements = [].concat(...createdDocument.body.querySelectorAll('*'))\n\n  for (const element of elements) {\n    const elementName = element.nodeName.toLowerCase()\n\n    if (!Object.keys(allowList).includes(elementName)) {\n      element.remove()\n      continue\n    }\n\n    const attributeList = [].concat(...element.attributes)\n    const allowedAttributes = [].concat(allowList['*'] || [], allowList[elementName] || [])\n\n    for (const attribute of attributeList) {\n      if (!allowedAttribute(attribute, allowedAttributes)) {\n        element.removeAttribute(attribute.nodeName)\n      }\n    }\n  }\n\n  return createdDocument.body.innerHTML\n}\n"
  },
  {
    "path": "js/src/util/scrollbar.js",
    "content": "/**\n * --------------------------------------------------------------------------\n * Bootstrap util/scrollBar.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Manipulator from '../dom/manipulator.js'\nimport SelectorEngine from '../dom/selector-engine.js'\nimport { isElement } from './index.js'\n\n/**\n * Constants\n */\n\nconst SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top'\nconst SELECTOR_STICKY_CONTENT = '.sticky-top'\nconst PROPERTY_PADDING = 'padding-right'\nconst PROPERTY_MARGIN = 'margin-right'\n\n/**\n * Class definition\n */\n\nclass ScrollBarHelper {\n  constructor() {\n    this._element = document.body\n  }\n\n  // Public\n  getWidth() {\n    // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes\n    const documentWidth = document.documentElement.clientWidth\n    return Math.abs(window.innerWidth - documentWidth)\n  }\n\n  hide() {\n    const width = this.getWidth()\n    this._disableOverFlow()\n    // give padding to element to balance the hidden scrollbar width\n    this._setElementAttributes(this._element, PROPERTY_PADDING, calculatedValue => calculatedValue + width)\n    // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements to keep showing fullwidth\n    this._setElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING, calculatedValue => calculatedValue + width)\n    this._setElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN, calculatedValue => calculatedValue - width)\n  }\n\n  reset() {\n    this._resetElementAttributes(this._element, 'overflow')\n    this._resetElementAttributes(this._element, PROPERTY_PADDING)\n    this._resetElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING)\n    this._resetElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN)\n  }\n\n  isOverflowing() {\n    return this.getWidth() > 0\n  }\n\n  // Private\n  _disableOverFlow() {\n    this._saveInitialAttribute(this._element, 'overflow')\n    this._element.style.overflow = 'hidden'\n  }\n\n  _setElementAttributes(selector, styleProperty, callback) {\n    const scrollbarWidth = this.getWidth()\n    const manipulationCallBack = element => {\n      if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) {\n        return\n      }\n\n      this._saveInitialAttribute(element, styleProperty)\n      const calculatedValue = window.getComputedStyle(element).getPropertyValue(styleProperty)\n      element.style.setProperty(styleProperty, `${callback(Number.parseFloat(calculatedValue))}px`)\n    }\n\n    this._applyManipulationCallback(selector, manipulationCallBack)\n  }\n\n  _saveInitialAttribute(element, styleProperty) {\n    const actualValue = element.style.getPropertyValue(styleProperty)\n    if (actualValue) {\n      Manipulator.setDataAttribute(element, styleProperty, actualValue)\n    }\n  }\n\n  _resetElementAttributes(selector, styleProperty) {\n    const manipulationCallBack = element => {\n      const value = Manipulator.getDataAttribute(element, styleProperty)\n      // We only want to remove the property if the value is `null`; the value can also be zero\n      if (value === null) {\n        element.style.removeProperty(styleProperty)\n        return\n      }\n\n      Manipulator.removeDataAttribute(element, styleProperty)\n      element.style.setProperty(styleProperty, value)\n    }\n\n    this._applyManipulationCallback(selector, manipulationCallBack)\n  }\n\n  _applyManipulationCallback(selector, callBack) {\n    if (isElement(selector)) {\n      callBack(selector)\n      return\n    }\n\n    for (const sel of SelectorEngine.find(selector, this._element)) {\n      callBack(sel)\n    }\n  }\n}\n\nexport default ScrollBarHelper\n"
  },
  {
    "path": "js/src/util/swipe.js",
    "content": "/**\n * --------------------------------------------------------------------------\n * Bootstrap util/swipe.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler.js'\nimport Config from './config.js'\nimport { execute } from './index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'swipe'\nconst EVENT_KEY = '.bs.swipe'\nconst EVENT_TOUCHSTART = `touchstart${EVENT_KEY}`\nconst EVENT_TOUCHMOVE = `touchmove${EVENT_KEY}`\nconst EVENT_TOUCHEND = `touchend${EVENT_KEY}`\nconst EVENT_POINTERDOWN = `pointerdown${EVENT_KEY}`\nconst EVENT_POINTERUP = `pointerup${EVENT_KEY}`\nconst POINTER_TYPE_TOUCH = 'touch'\nconst POINTER_TYPE_PEN = 'pen'\nconst CLASS_NAME_POINTER_EVENT = 'pointer-event'\nconst SWIPE_THRESHOLD = 40\n\nconst Default = {\n  endCallback: null,\n  leftCallback: null,\n  rightCallback: null\n}\n\nconst DefaultType = {\n  endCallback: '(function|null)',\n  leftCallback: '(function|null)',\n  rightCallback: '(function|null)'\n}\n\n/**\n * Class definition\n */\n\nclass Swipe extends Config {\n  constructor(element, config) {\n    super()\n    this._element = element\n\n    if (!element || !Swipe.isSupported()) {\n      return\n    }\n\n    this._config = this._getConfig(config)\n    this._deltaX = 0\n    this._supportPointerEvents = Boolean(window.PointerEvent)\n    this._initEvents()\n  }\n\n  // Getters\n  static get Default() {\n    return Default\n  }\n\n  static get DefaultType() {\n    return DefaultType\n  }\n\n  static get NAME() {\n    return NAME\n  }\n\n  // Public\n  dispose() {\n    EventHandler.off(this._element, EVENT_KEY)\n  }\n\n  // Private\n  _start(event) {\n    if (!this._supportPointerEvents) {\n      this._deltaX = event.touches[0].clientX\n\n      return\n    }\n\n    if (this._eventIsPointerPenTouch(event)) {\n      this._deltaX = event.clientX\n    }\n  }\n\n  _end(event) {\n    if (this._eventIsPointerPenTouch(event)) {\n      this._deltaX = event.clientX - this._deltaX\n    }\n\n    this._handleSwipe()\n    execute(this._config.endCallback)\n  }\n\n  _move(event) {\n    this._deltaX = event.touches && event.touches.length > 1 ?\n      0 :\n      event.touches[0].clientX - this._deltaX\n  }\n\n  _handleSwipe() {\n    const absDeltaX = Math.abs(this._deltaX)\n\n    if (absDeltaX <= SWIPE_THRESHOLD) {\n      return\n    }\n\n    const direction = absDeltaX / this._deltaX\n\n    this._deltaX = 0\n\n    if (!direction) {\n      return\n    }\n\n    execute(direction > 0 ? this._config.rightCallback : this._config.leftCallback)\n  }\n\n  _initEvents() {\n    if (this._supportPointerEvents) {\n      EventHandler.on(this._element, EVENT_POINTERDOWN, event => this._start(event))\n      EventHandler.on(this._element, EVENT_POINTERUP, event => this._end(event))\n\n      this._element.classList.add(CLASS_NAME_POINTER_EVENT)\n    } else {\n      EventHandler.on(this._element, EVENT_TOUCHSTART, event => this._start(event))\n      EventHandler.on(this._element, EVENT_TOUCHMOVE, event => this._move(event))\n      EventHandler.on(this._element, EVENT_TOUCHEND, event => this._end(event))\n    }\n  }\n\n  _eventIsPointerPenTouch(event) {\n    return this._supportPointerEvents && (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH)\n  }\n\n  // Static\n  static isSupported() {\n    return 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0\n  }\n}\n\nexport default Swipe\n"
  },
  {
    "path": "js/src/util/template-factory.js",
    "content": "/**\n * --------------------------------------------------------------------------\n * Bootstrap util/template-factory.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport SelectorEngine from '../dom/selector-engine.js'\nimport Config from './config.js'\nimport { DefaultAllowlist, sanitizeHtml } from './sanitizer.js'\nimport { execute, getElement, isElement } from './index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'TemplateFactory'\n\nconst Default = {\n  allowList: DefaultAllowlist,\n  content: {}, // { selector : text ,  selector2 : text2 , }\n  extraClass: '',\n  html: false,\n  sanitize: true,\n  sanitizeFn: null,\n  template: '<div></div>'\n}\n\nconst DefaultType = {\n  allowList: 'object',\n  content: 'object',\n  extraClass: '(string|function)',\n  html: 'boolean',\n  sanitize: 'boolean',\n  sanitizeFn: '(null|function)',\n  template: 'string'\n}\n\nconst DefaultContentType = {\n  entry: '(string|element|function|null)',\n  selector: '(string|element)'\n}\n\n/**\n * Class definition\n */\n\nclass TemplateFactory extends Config {\n  constructor(config) {\n    super()\n    this._config = this._getConfig(config)\n  }\n\n  // Getters\n  static get Default() {\n    return Default\n  }\n\n  static get DefaultType() {\n    return DefaultType\n  }\n\n  static get NAME() {\n    return NAME\n  }\n\n  // Public\n  getContent() {\n    return Object.values(this._config.content)\n      .map(config => this._resolvePossibleFunction(config))\n      .filter(Boolean)\n  }\n\n  hasContent() {\n    return this.getContent().length > 0\n  }\n\n  changeContent(content) {\n    this._checkContent(content)\n    this._config.content = { ...this._config.content, ...content }\n    return this\n  }\n\n  toHtml() {\n    const templateWrapper = document.createElement('div')\n    templateWrapper.innerHTML = this._maybeSanitize(this._config.template)\n\n    for (const [selector, text] of Object.entries(this._config.content)) {\n      this._setContent(templateWrapper, text, selector)\n    }\n\n    const template = templateWrapper.children[0]\n    const extraClass = this._resolvePossibleFunction(this._config.extraClass)\n\n    if (extraClass) {\n      template.classList.add(...extraClass.split(' '))\n    }\n\n    return template\n  }\n\n  // Private\n  _typeCheckConfig(config) {\n    super._typeCheckConfig(config)\n    this._checkContent(config.content)\n  }\n\n  _checkContent(arg) {\n    for (const [selector, content] of Object.entries(arg)) {\n      super._typeCheckConfig({ selector, entry: content }, DefaultContentType)\n    }\n  }\n\n  _setContent(template, content, selector) {\n    const templateElement = SelectorEngine.findOne(selector, template)\n\n    if (!templateElement) {\n      return\n    }\n\n    content = this._resolvePossibleFunction(content)\n\n    if (!content) {\n      templateElement.remove()\n      return\n    }\n\n    if (isElement(content)) {\n      this._putElementInTemplate(getElement(content), templateElement)\n      return\n    }\n\n    if (this._config.html) {\n      templateElement.innerHTML = this._maybeSanitize(content)\n      return\n    }\n\n    templateElement.textContent = content\n  }\n\n  _maybeSanitize(arg) {\n    return this._config.sanitize ? sanitizeHtml(arg, this._config.allowList, this._config.sanitizeFn) : arg\n  }\n\n  _resolvePossibleFunction(arg) {\n    return execute(arg, [undefined, this])\n  }\n\n  _putElementInTemplate(element, templateElement) {\n    if (this._config.html) {\n      templateElement.innerHTML = ''\n      templateElement.append(element)\n      return\n    }\n\n    templateElement.textContent = element.textContent\n  }\n}\n\nexport default TemplateFactory\n"
  },
  {
    "path": "js/tests/README.md",
    "content": "## How does Bootstrap’s test suite work?\n\nBootstrap uses [Jasmine](https://jasmine.github.io/). Each plugin has a file dedicated to its tests in `tests/unit/<plugin-name>.spec.js`.\n\n- `visual/` contains \"visual\" tests which are run interactively in real browsers and require manual verification by humans.\n\nTo run the unit test suite via [Karma](https://karma-runner.github.io/), run `npm run js-test`.\nTo run the unit test suite via [Karma](https://karma-runner.github.io/) and debug, run `npm run js-debug`.\n\n## How do I add a new unit test?\n\n1. Locate and open the file dedicated to the plugin which you need to add tests to (`tests/unit/<plugin-name>.spec.js`).\n2. Review the [Jasmine API Documentation](https://jasmine.github.io/pages/docs_home.html) and use the existing tests as references for how to structure your new tests.\n3. Write the necessary unit test(s) for the new or revised functionality.\n4. Run `npm run js-test` to see the results of your newly-added test(s).\n\n**Note:** Your new unit tests should fail before your changes are applied to the plugin, and should pass after your changes are applied to the plugin.\n\n## What should a unit test look like?\n\n- Each test should have a unique name clearly stating what unit is being tested.\n- Each test should be in the corresponding `describe`.\n- Each test should test only one unit per test, although one test can include several assertions. Create multiple tests for multiple units of functionality.\n- Each test should use [`expect`](https://jasmine.github.io/api/edge/matchers.html) to ensure something is expected.\n- Each test should follow the project’s [JavaScript Code Guidelines](https://github.com/twbs/bootstrap/blob/main/.github/CONTRIBUTING.md#js)\n\n## Code coverage\n\nCurrently we’re aiming for at least 90% test coverage for our code. To ensure your changes meet or exceed this limit, run `npm run js-test-karma` and open the file in `js/coverage/lcov-report/index.html` to see the code coverage for each plugin. See more details when you select a plugin and ensure your change is fully covered by unit tests.\n\n### Example tests\n\n```js\n// Synchronous test\ndescribe('getInstance', () => {\n  it('should return null if there is no instance', () => {\n    // Make assertion\n    expect(Tab.getInstance(fixtureEl)).toBeNull()\n  })\n\n  it('should return this instance', () => {\n    fixtureEl.innerHTML = '<div></div>'\n\n    const divEl = fixtureEl.querySelector('div')\n    const tab = new Tab(divEl)\n\n    // Make assertion\n    expect(Tab.getInstance(divEl)).toEqual(tab)\n  })\n})\n\n// Asynchronous test\nit('should show a tooltip without the animation', () => {\n  return new Promise(resolve => {\n    fixtureEl.innerHTML = '<a href=\"#\" rel=\"tooltip\" title=\"Another tooltip\"></a>'\n\n    const tooltipEl = fixtureEl.querySelector('a')\n    const tooltip = new Tooltip(tooltipEl, {\n      animation: false\n    })\n\n    tooltipEl.addEventListener('shown.bs.tooltip', () => {\n      const tip = document.querySelector('.tooltip')\n\n      expect(tip).not.toBeNull()\n      expect(tip.classList.contains('fade')).toEqual(false)\n      resolve()\n    })\n\n    tooltip.show()\n  })\n})\n```\n"
  },
  {
    "path": "js/tests/browsers.js",
    "content": "/* eslint-disable camelcase */\n\n'use strict'\n\nconst browsers = {\n  safariMac: {\n    base: 'BrowserStack',\n    os: 'OS X',\n    os_version: 'Catalina',\n    browser: 'Safari',\n    browser_version: 'latest'\n  },\n  chromeMac: {\n    base: 'BrowserStack',\n    os: 'OS X',\n    os_version: 'Catalina',\n    browser: 'Chrome',\n    browser_version: 'latest'\n  },\n  firefoxMac: {\n    base: 'BrowserStack',\n    os: 'OS X',\n    os_version: 'Catalina',\n    browser: 'Firefox',\n    browser_version: 'latest'\n  },\n  chromeWin10: {\n    base: 'BrowserStack',\n    os: 'Windows',\n    os_version: '10',\n    browser: 'Chrome',\n    browser_version: '60'\n  },\n  firefoxWin10: {\n    base: 'BrowserStack',\n    os: 'Windows',\n    os_version: '10',\n    browser: 'Firefox',\n    browser_version: '60'\n  },\n  chromeWin10Latest: {\n    base: 'BrowserStack',\n    os: 'Windows',\n    os_version: '10',\n    browser: 'Chrome',\n    browser_version: 'latest'\n  },\n  firefoxWin10Latest: {\n    base: 'BrowserStack',\n    os: 'Windows',\n    os_version: '10',\n    browser: 'Firefox',\n    browser_version: 'latest'\n  },\n  iphone7: {\n    base: 'BrowserStack',\n    os: 'ios',\n    os_version: '12.0',\n    device: 'iPhone 7',\n    real_mobile: true\n  },\n  iphone12: {\n    base: 'BrowserStack',\n    os: 'ios',\n    os_version: '14.0',\n    device: 'iPhone 12',\n    real_mobile: true\n  },\n  pixel2: {\n    base: 'BrowserStack',\n    os: 'android',\n    os_version: '8.0',\n    device: 'Google Pixel 2',\n    real_mobile: true\n  }\n}\n\nmodule.exports = {\n  browsers\n}\n"
  },
  {
    "path": "js/tests/helpers/fixture.js",
    "content": "const FIXTURE_ID = 'fixture'\n\nexport const getFixture = () => {\n  let fixtureElement = document.getElementById(FIXTURE_ID)\n\n  if (!fixtureElement) {\n    fixtureElement = document.createElement('div')\n    fixtureElement.setAttribute('id', FIXTURE_ID)\n    fixtureElement.style.position = 'absolute'\n    fixtureElement.style.top = '-10000px'\n    fixtureElement.style.left = '-10000px'\n    fixtureElement.style.width = '10000px'\n    fixtureElement.style.height = '10000px'\n    document.body.append(fixtureElement)\n  }\n\n  return fixtureElement\n}\n\nexport const clearFixture = () => {\n  const fixtureElement = getFixture()\n\n  fixtureElement.innerHTML = ''\n}\n\nexport const createEvent = (eventName, parameters = {}) => {\n  return new Event(eventName, parameters)\n}\n\nexport const jQueryMock = {\n  elements: undefined,\n  fn: {},\n  each(fn) {\n    for (const element of this.elements) {\n      fn.call(element)\n    }\n  }\n}\n\nexport const clearBodyAndDocument = () => {\n  const attributes = ['data-bs-padding-right', 'style']\n\n  for (const attribute of attributes) {\n    document.documentElement.removeAttribute(attribute)\n    document.body.removeAttribute(attribute)\n  }\n}\n"
  },
  {
    "path": "js/tests/integration/bundle-modularity.js",
    "content": "/* eslint-disable import/extensions, import/no-unassigned-import */\n\nimport Tooltip from '../../dist/tooltip'\nimport '../../dist/carousel'\n\nwindow.addEventListener('load', () => {\n  [].concat(...document.querySelectorAll('[data-bs-toggle=\"tooltip\"]'))\n    .map(tooltipNode => new Tooltip(tooltipNode))\n})\n"
  },
  {
    "path": "js/tests/integration/bundle.js",
    "content": "import { Tooltip } from '../../../dist/js/bootstrap.esm.js'\n\nwindow.addEventListener('load', () => {\n  [].concat(...document.querySelectorAll('[data-bs-toggle=\"tooltip\"]'))\n    .map(tooltipNode => new Tooltip(tooltipNode))\n})\n"
  },
  {
    "path": "js/tests/integration/index.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n  <head>\n    <!-- Required meta tags -->\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n\n    <!-- Bootstrap CSS -->\n    <link href=\"../../../dist/css/bootstrap.min.css\" rel=\"stylesheet\">\n\n    <title>Hello, world!</title>\n  </head>\n  <body>\n    <div class=\"container py-4\">\n      <h1>Hello, world!</h1>\n\n      <div class=\"mt-5\">\n        <button type=\"button\" class=\"btn btn-secondary mb-3\" data-bs-toggle=\"tooltip\" data-bs-placement=\"top\" title=\"Tooltip on top\">\n          Tooltip on top\n        </button>\n\n        <div id=\"carouselExampleIndicators\" class=\"carousel slide mt-2\" data-bs-ride=\"carousel\">\n          <div class=\"carousel-indicators\">\n            <button type=\"button\" data-bs-target=\"#carouselExampleIndicators\" data-bs-slide-to=\"0\" aria-label=\"Slide 1\"></button>\n            <button type=\"button\" data-bs-target=\"#carouselExampleIndicators\" data-bs-slide-to=\"1\" class=\"active\" aria-current=\"true\" aria-label=\"Slide 2\"></button>\n            <button type=\"button\" data-bs-target=\"#carouselExampleIndicators\" data-bs-slide-to=\"2\" aria-label=\"Slide 3\"></button>\n          </div>\n\n          <div class=\"carousel-inner\">\n            <div class=\"carousel-item\">\n              <img class=\"d-block w-100\" alt=\"First slide\" src=\"data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22800%22%20height%3D%22400%22%20preserveAspectRatio%3D%22none%22%20viewBox%3D%220%200%20800%20400%22%3E%3Cpath%20fill%3D%22%23777%22%20d%3D%22M0%200h800v400H0z%22%2F%3E%3Ctext%20x%3D%22285.922%22%20y%3D%22217.7%22%20fill%3D%22%23555%22%20font-family%3D%22Helvetica%2Cmonospace%22%20font-size%3D%2240pt%22%20font-weight%3D%22400%22%3EFirst%20slide%3C%2Ftext%3E%3C%2Fsvg%3E\">\n              <div class=\"carousel-caption d-none d-md-block\">\n                <h5>First slide label</h5>\n                <p>Nulla vitae elit libero, a pharetra augue mollis interdum.</p>\n              </div>\n            </div>\n            <div class=\"carousel-item active\">\n              <img class=\"d-block w-100\" alt=\"Second slide\" src=\"data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22800%22%20height%3D%22400%22%20preserveAspectRatio%3D%22none%22%20viewBox%3D%220%200%20800%20400%22%3E%3Cpath%20fill%3D%22%23777%22%20d%3D%22M0%200h800v400H0z%22%2F%3E%3Ctext%20x%3D%22285.922%22%20y%3D%22217.7%22%20fill%3D%22%23555%22%20font-family%3D%22Helvetica%2Cmonospace%22%20font-size%3D%2240pt%22%20font-weight%3D%22400%22%3ESecond%20slide%3C%2Ftext%3E%3C%2Fsvg%3E\">\n              <div class=\"carousel-caption d-none d-md-block\">\n                <h5>Second slide label</h5>\n                <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>\n              </div>\n            </div>\n            <div class=\"carousel-item\">\n              <img class=\"d-block w-100\" alt=\"Third slide\" src=\"data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22800%22%20height%3D%22400%22%20preserveAspectRatio%3D%22none%22%20viewBox%3D%220%200%20800%20400%22%3E%3Cpath%20fill%3D%22%23777%22%20d%3D%22M0%200h800v400H0z%22%2F%3E%3Ctext%20x%3D%22285.922%22%20y%3D%22217.7%22%20fill%3D%22%23555%22%20font-family%3D%22Helvetica%2Cmonospace%22%20font-size%3D%2240pt%22%20font-weight%3D%22400%22%3EThird%20slide%3C%2Ftext%3E%3C%2Fsvg%3E\">\n              <div class=\"carousel-caption d-none d-md-block\">\n                <h5>Third slide label</h5>\n                <p>Praesent commodo cursus magna, vel scelerisque nisl consectetur.</p>\n              </div>\n            </div>\n          </div>\n\n          <a class=\"carousel-control-prev\" href=\"#carouselExampleIndicators\" role=\"button\" data-bs-slide=\"prev\">\n            <span class=\"carousel-control-prev-icon\" aria-hidden=\"true\"></span>\n            <span class=\"visually-hidden\">Previous</span>\n          </a>\n          <a class=\"carousel-control-next\" href=\"#carouselExampleIndicators\" role=\"button\" data-bs-slide=\"next\">\n            <span class=\"carousel-control-next-icon\" aria-hidden=\"true\"></span>\n            <span class=\"visually-hidden\">Next</span>\n          </a>\n        </div>\n      </div>\n    </div>\n\n    <script src=\"../../coverage/bundle.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "js/tests/integration/rollup.bundle-modularity.js",
    "content": "'use strict'\n\nconst commonjs = require('@rollup/plugin-commonjs')\nconst configRollup = require('./rollup.bundle.js')\n\nconst config = {\n  ...configRollup,\n  input: 'js/tests/integration/bundle-modularity.js',\n  output: {\n    file: 'js/coverage/bundle-modularity.js',\n    format: 'iife'\n  }\n}\n\nconfig.plugins.unshift(commonjs())\n\nmodule.exports = config\n"
  },
  {
    "path": "js/tests/integration/rollup.bundle.js",
    "content": "'use strict'\n\nconst { babel } = require('@rollup/plugin-babel')\nconst { nodeResolve } = require('@rollup/plugin-node-resolve')\nconst replace = require('@rollup/plugin-replace')\n\nmodule.exports = {\n  input: 'js/tests/integration/bundle.js',\n  output: {\n    file: 'js/coverage/bundle.js',\n    format: 'iife'\n  },\n  plugins: [\n    replace({\n      'process.env.NODE_ENV': '\"production\"',\n      preventAssignment: true\n    }),\n    nodeResolve(),\n    babel({\n      exclude: 'node_modules/**',\n      babelHelpers: 'bundled'\n    })\n  ]\n}\n"
  },
  {
    "path": "js/tests/karma.conf.js",
    "content": "'use strict'\n\nconst path = require('node:path')\nconst ip = require('ip')\nconst { babel } = require('@rollup/plugin-babel')\nconst istanbul = require('rollup-plugin-istanbul')\nconst { nodeResolve } = require('@rollup/plugin-node-resolve')\nconst replace = require('@rollup/plugin-replace')\nconst { browsers } = require('./browsers.js')\n\nconst ENV = process.env\nconst BROWSERSTACK = Boolean(ENV.BROWSERSTACK)\nconst DEBUG = Boolean(ENV.DEBUG)\nconst JQUERY_TEST = Boolean(ENV.JQUERY)\n\nconst frameworks = [\n  'jasmine'\n]\n\nconst plugins = [\n  'karma-jasmine',\n  'karma-rollup-preprocessor'\n]\n\nconst reporters = ['dots']\n\nconst detectBrowsers = {\n  usePhantomJS: false,\n  postDetection(availableBrowser) {\n    // On CI just use Chrome\n    if (ENV.CI === true) {\n      return ['ChromeHeadless']\n    }\n\n    if (availableBrowser.includes('Chrome')) {\n      return DEBUG ? ['Chrome'] : ['ChromeHeadless']\n    }\n\n    if (availableBrowser.includes('Chromium')) {\n      return DEBUG ? ['Chromium'] : ['ChromiumHeadless']\n    }\n\n    if (availableBrowser.includes('Firefox')) {\n      return DEBUG ? ['Firefox'] : ['FirefoxHeadless']\n    }\n\n    throw new Error('Please install Chrome, Chromium or Firefox')\n  }\n}\n\nconst config = {\n  basePath: '../..',\n  port: 9876,\n  colors: true,\n  autoWatch: false,\n  singleRun: true,\n  concurrency: Number.POSITIVE_INFINITY,\n  client: {\n    clearContext: false\n  },\n  files: [\n    'node_modules/hammer-simulator/index.js',\n    {\n      pattern: 'js/tests/unit/**/!(jquery).spec.js',\n      watched: !BROWSERSTACK\n    }\n  ],\n  preprocessors: {\n    'js/tests/unit/**/*.spec.js': ['rollup']\n  },\n  rollupPreprocessor: {\n    plugins: [\n      replace({\n        'process.env.NODE_ENV': '\"dev\"',\n        preventAssignment: true\n      }),\n      istanbul({\n        exclude: [\n          'node_modules/**',\n          'js/tests/unit/**/*.spec.js',\n          'js/tests/helpers/**/*.js'\n        ]\n      }),\n      babel({\n        // Only transpile our source code\n        exclude: 'node_modules/**',\n        // Inline the required helpers in each file\n        babelHelpers: 'inline'\n      }),\n      nodeResolve()\n    ],\n    output: {\n      format: 'iife',\n      name: 'bootstrapTest',\n      sourcemap: 'inline',\n      generatedCode: 'es2015'\n    }\n  }\n}\n\nif (BROWSERSTACK) {\n  config.hostname = ip.address()\n  config.browserStack = {\n    username: ENV.BROWSER_STACK_USERNAME,\n    accessKey: ENV.BROWSER_STACK_ACCESS_KEY,\n    build: `bootstrap-${ENV.GITHUB_SHA ? `${ENV.GITHUB_SHA.slice(0, 7)}-` : ''}${new Date().toISOString()}`,\n    project: 'Bootstrap',\n    retryLimit: 2\n  }\n  plugins.push('karma-browserstack-launcher', 'karma-jasmine-html-reporter')\n  config.customLaunchers = browsers\n  config.browsers = Object.keys(browsers)\n  reporters.push('BrowserStack', 'kjhtml')\n} else if (JQUERY_TEST) {\n  frameworks.push('detectBrowsers')\n  plugins.push(\n    'karma-chrome-launcher',\n    'karma-firefox-launcher',\n    'karma-detect-browsers'\n  )\n  config.detectBrowsers = detectBrowsers\n  config.files = [\n    'node_modules/jquery/dist/jquery.slim.min.js',\n    {\n      pattern: 'js/tests/unit/jquery.spec.js',\n      watched: false\n    }\n  ]\n} else {\n  frameworks.push('detectBrowsers')\n  plugins.push(\n    'karma-chrome-launcher',\n    'karma-firefox-launcher',\n    'karma-detect-browsers',\n    'karma-coverage-istanbul-reporter'\n  )\n  reporters.push('coverage-istanbul')\n  config.detectBrowsers = detectBrowsers\n  config.coverageIstanbulReporter = {\n    dir: path.resolve(__dirname, '../coverage/'),\n    reports: ['lcov', 'text-summary'],\n    thresholds: {\n      emitWarning: false,\n      global: {\n        statements: 90,\n        branches: 89,\n        functions: 90,\n        lines: 90\n      }\n    }\n  }\n\n  if (DEBUG) {\n    config.hostname = ip.address()\n    plugins.push('karma-jasmine-html-reporter')\n    reporters.push('kjhtml')\n    config.singleRun = false\n    config.autoWatch = true\n  }\n}\n\nconfig.frameworks = frameworks\nconfig.plugins = plugins\nconfig.reporters = reporters\n\nmodule.exports = karmaConfig => {\n  config.logLevel = karmaConfig.LOG_ERROR\n  karmaConfig.set(config)\n}\n"
  },
  {
    "path": "js/tests/unit/alert.spec.js",
    "content": "import Alert from '../../src/alert.js'\nimport { getTransitionDurationFromElement } from '../../src/util/index.js'\nimport { clearFixture, getFixture, jQueryMock } from '../helpers/fixture.js'\n\ndescribe('Alert', () => {\n  let fixtureEl\n\n  beforeAll(() => {\n    fixtureEl = getFixture()\n  })\n\n  afterEach(() => {\n    clearFixture()\n  })\n\n  it('should take care of element either passed as a CSS selector or DOM element', () => {\n    fixtureEl.innerHTML = '<div class=\"alert\"></div>'\n\n    const alertEl = fixtureEl.querySelector('.alert')\n    const alertBySelector = new Alert('.alert')\n    const alertByElement = new Alert(alertEl)\n\n    expect(alertBySelector._element).toEqual(alertEl)\n    expect(alertByElement._element).toEqual(alertEl)\n  })\n\n  it('should return version', () => {\n    expect(Alert.VERSION).toEqual(jasmine.any(String))\n  })\n\n  describe('DATA_KEY', () => {\n    it('should return plugin data key', () => {\n      expect(Alert.DATA_KEY).toEqual('bs.alert')\n    })\n  })\n\n  describe('data-api', () => {\n    it('should close an alert without instantiating it manually', () => {\n      fixtureEl.innerHTML = [\n        '<div class=\"alert\">',\n        '  <button type=\"button\" data-bs-dismiss=\"alert\">x</button>',\n        '</div>'\n      ].join('')\n\n      const button = document.querySelector('button')\n\n      button.click()\n      expect(document.querySelectorAll('.alert')).toHaveSize(0)\n    })\n\n    it('should close an alert without instantiating it manually with the parent selector', () => {\n      fixtureEl.innerHTML = [\n        '<div class=\"alert\">',\n        '  <button type=\"button\" data-bs-target=\".alert\" data-bs-dismiss=\"alert\">x</button>',\n        '</div>'\n      ].join('')\n\n      const button = document.querySelector('button')\n\n      button.click()\n      expect(document.querySelectorAll('.alert')).toHaveSize(0)\n    })\n  })\n\n  describe('close', () => {\n    it('should close an alert', () => {\n      return new Promise(resolve => {\n        const spy = jasmine.createSpy('spy', getTransitionDurationFromElement)\n        fixtureEl.innerHTML = '<div class=\"alert\"></div>'\n\n        const alertEl = document.querySelector('.alert')\n        const alert = new Alert(alertEl)\n\n        alertEl.addEventListener('closed.bs.alert', () => {\n          expect(document.querySelectorAll('.alert')).toHaveSize(0)\n          expect(spy).not.toHaveBeenCalled()\n          resolve()\n        })\n\n        alert.close()\n      })\n    })\n\n    it('should close alert with fade class', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<div class=\"alert fade\"></div>'\n\n        const alertEl = document.querySelector('.alert')\n        const alert = new Alert(alertEl)\n\n        alertEl.addEventListener('transitionend', () => {\n          expect().nothing()\n        })\n\n        alertEl.addEventListener('closed.bs.alert', () => {\n          expect(document.querySelectorAll('.alert')).toHaveSize(0)\n          resolve()\n        })\n\n        alert.close()\n      })\n    })\n\n    it('should not remove alert if close event is prevented', () => {\n      return new Promise((resolve, reject) => {\n        fixtureEl.innerHTML = '<div class=\"alert\"></div>'\n\n        const getAlert = () => document.querySelector('.alert')\n        const alertEl = getAlert()\n        const alert = new Alert(alertEl)\n\n        alertEl.addEventListener('close.bs.alert', event => {\n          event.preventDefault()\n          setTimeout(() => {\n            expect(getAlert()).not.toBeNull()\n            resolve()\n          }, 10)\n        })\n\n        alertEl.addEventListener('closed.bs.alert', () => {\n          reject(new Error('should not fire closed event'))\n        })\n\n        alert.close()\n      })\n    })\n  })\n\n  describe('dispose', () => {\n    it('should dispose an alert', () => {\n      fixtureEl.innerHTML = '<div class=\"alert\"></div>'\n\n      const alertEl = document.querySelector('.alert')\n      const alert = new Alert(alertEl)\n\n      expect(Alert.getInstance(alertEl)).not.toBeNull()\n\n      alert.dispose()\n\n      expect(Alert.getInstance(alertEl)).toBeNull()\n    })\n  })\n\n  describe('jQueryInterface', () => {\n    it('should handle config passed and toggle existing alert', () => {\n      fixtureEl.innerHTML = '<div class=\"alert\"></div>'\n\n      const alertEl = fixtureEl.querySelector('.alert')\n      const alert = new Alert(alertEl)\n\n      const spy = spyOn(alert, 'close')\n\n      jQueryMock.fn.alert = Alert.jQueryInterface\n      jQueryMock.elements = [alertEl]\n\n      jQueryMock.fn.alert.call(jQueryMock, 'close')\n\n      expect(spy).toHaveBeenCalled()\n    })\n\n    it('should create new alert instance and call close', () => {\n      fixtureEl.innerHTML = '<div class=\"alert\"></div>'\n\n      const alertEl = fixtureEl.querySelector('.alert')\n\n      jQueryMock.fn.alert = Alert.jQueryInterface\n      jQueryMock.elements = [alertEl]\n\n      expect(Alert.getInstance(alertEl)).toBeNull()\n      jQueryMock.fn.alert.call(jQueryMock, 'close')\n\n      expect(fixtureEl.querySelector('.alert')).toBeNull()\n    })\n\n    it('should just create an alert instance without calling close', () => {\n      fixtureEl.innerHTML = '<div class=\"alert\"></div>'\n\n      const alertEl = fixtureEl.querySelector('.alert')\n\n      jQueryMock.fn.alert = Alert.jQueryInterface\n      jQueryMock.elements = [alertEl]\n\n      jQueryMock.fn.alert.call(jQueryMock)\n\n      expect(Alert.getInstance(alertEl)).not.toBeNull()\n      expect(fixtureEl.querySelector('.alert')).not.toBeNull()\n    })\n\n    it('should throw an error on undefined method', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n      const action = 'undefinedMethod'\n\n      jQueryMock.fn.alert = Alert.jQueryInterface\n      jQueryMock.elements = [div]\n\n      expect(() => {\n        jQueryMock.fn.alert.call(jQueryMock, action)\n      }).toThrowError(TypeError, `No method named \"${action}\"`)\n    })\n\n    it('should throw an error on protected method', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n      const action = '_getConfig'\n\n      jQueryMock.fn.alert = Alert.jQueryInterface\n      jQueryMock.elements = [div]\n\n      expect(() => {\n        jQueryMock.fn.alert.call(jQueryMock, action)\n      }).toThrowError(TypeError, `No method named \"${action}\"`)\n    })\n  })\n\n  describe('getInstance', () => {\n    it('should return alert instance', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n      const alert = new Alert(div)\n\n      expect(Alert.getInstance(div)).toEqual(alert)\n      expect(Alert.getInstance(div)).toBeInstanceOf(Alert)\n    })\n\n    it('should return null when there is no alert instance', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n\n      expect(Alert.getInstance(div)).toBeNull()\n    })\n  })\n\n  describe('getOrCreateInstance', () => {\n    it('should return alert instance', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n      const alert = new Alert(div)\n\n      expect(Alert.getOrCreateInstance(div)).toEqual(alert)\n      expect(Alert.getInstance(div)).toEqual(Alert.getOrCreateInstance(div, {}))\n      expect(Alert.getOrCreateInstance(div)).toBeInstanceOf(Alert)\n    })\n\n    it('should return new instance when there is no alert instance', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n\n      expect(Alert.getInstance(div)).toBeNull()\n      expect(Alert.getOrCreateInstance(div)).toBeInstanceOf(Alert)\n    })\n  })\n})\n"
  },
  {
    "path": "js/tests/unit/base-component.spec.js",
    "content": "import BaseComponent from '../../src/base-component.js'\nimport EventHandler from '../../src/dom/event-handler.js'\nimport { noop } from '../../src/util/index.js'\nimport { clearFixture, getFixture } from '../helpers/fixture.js'\n\nclass DummyClass extends BaseComponent {\n  constructor(element) {\n    super(element)\n\n    EventHandler.on(this._element, `click${DummyClass.EVENT_KEY}`, noop)\n  }\n\n  static get NAME() {\n    return 'dummy'\n  }\n}\n\ndescribe('Base Component', () => {\n  let fixtureEl\n  const name = 'dummy'\n  let element\n  let instance\n  const createInstance = () => {\n    fixtureEl.innerHTML = '<div id=\"foo\"></div>'\n    element = fixtureEl.querySelector('#foo')\n    instance = new DummyClass(element)\n  }\n\n  beforeAll(() => {\n    fixtureEl = getFixture()\n  })\n\n  afterEach(() => {\n    clearFixture()\n  })\n\n  describe('Static Methods', () => {\n    describe('VERSION', () => {\n      it('should return version', () => {\n        expect(DummyClass.VERSION).toEqual(jasmine.any(String))\n      })\n    })\n\n    describe('DATA_KEY', () => {\n      it('should return plugin data key', () => {\n        expect(DummyClass.DATA_KEY).toEqual(`bs.${name}`)\n      })\n    })\n\n    describe('NAME', () => {\n      it('should throw an Error if it is not initialized', () => {\n        expect(() => {\n          // eslint-disable-next-line no-unused-expressions\n          BaseComponent.NAME\n        }).toThrowError(Error)\n      })\n\n      it('should return plugin NAME', () => {\n        expect(DummyClass.NAME).toEqual(name)\n      })\n    })\n\n    describe('EVENT_KEY', () => {\n      it('should return plugin event key', () => {\n        expect(DummyClass.EVENT_KEY).toEqual(`.bs.${name}`)\n      })\n    })\n  })\n\n  describe('Public Methods', () => {\n    describe('constructor', () => {\n      it('should accept element, either passed as a CSS selector or DOM element', () => {\n        fixtureEl.innerHTML = [\n          '<div id=\"foo\"></div>',\n          '<div id=\"bar\"></div>'\n        ].join('')\n\n        const el = fixtureEl.querySelector('#foo')\n        const elInstance = new DummyClass(el)\n        const selectorInstance = new DummyClass('#bar')\n\n        expect(elInstance._element).toEqual(el)\n        expect(selectorInstance._element).toEqual(fixtureEl.querySelector('#bar'))\n      })\n\n      it('should not initialize and add element record to Data (caching), if argument `element` is not an HTML element', () => {\n        fixtureEl.innerHTML = ''\n\n        const el = fixtureEl.querySelector('#foo')\n        const elInstance = new DummyClass(el)\n        const selectorInstance = new DummyClass('#bar')\n\n        expect(elInstance._element).not.toBeDefined()\n        expect(selectorInstance._element).not.toBeDefined()\n      })\n    })\n\n    describe('dispose', () => {\n      it('should dispose an component', () => {\n        createInstance()\n        expect(DummyClass.getInstance(element)).not.toBeNull()\n\n        instance.dispose()\n\n        expect(DummyClass.getInstance(element)).toBeNull()\n        expect(instance._element).toBeNull()\n      })\n\n      it('should de-register element event listeners', () => {\n        createInstance()\n        const spy = spyOn(EventHandler, 'off')\n\n        instance.dispose()\n\n        expect(spy).toHaveBeenCalledWith(element, DummyClass.EVENT_KEY)\n      })\n    })\n\n    describe('getInstance', () => {\n      it('should return an instance', () => {\n        createInstance()\n\n        expect(DummyClass.getInstance(element)).toEqual(instance)\n        expect(DummyClass.getInstance(element)).toBeInstanceOf(DummyClass)\n      })\n\n      it('should accept element, either passed as a CSS selector, jQuery element, or DOM element', () => {\n        createInstance()\n\n        expect(DummyClass.getInstance('#foo')).toEqual(instance)\n        expect(DummyClass.getInstance(element)).toEqual(instance)\n\n        const fakejQueryObject = {\n          0: element,\n          jquery: 'foo'\n        }\n\n        expect(DummyClass.getInstance(fakejQueryObject)).toEqual(instance)\n      })\n\n      it('should return null when there is no instance', () => {\n        fixtureEl.innerHTML = '<div></div>'\n\n        const div = fixtureEl.querySelector('div')\n\n        expect(DummyClass.getInstance(div)).toBeNull()\n      })\n    })\n\n    describe('getOrCreateInstance', () => {\n      it('should return an instance', () => {\n        createInstance()\n\n        expect(DummyClass.getOrCreateInstance(element)).toEqual(instance)\n        expect(DummyClass.getInstance(element)).toEqual(DummyClass.getOrCreateInstance(element, {}))\n        expect(DummyClass.getOrCreateInstance(element)).toBeInstanceOf(DummyClass)\n      })\n\n      it('should return new instance when there is no alert instance', () => {\n        fixtureEl.innerHTML = '<div id=\"foo\"></div>'\n        element = fixtureEl.querySelector('#foo')\n\n        expect(DummyClass.getInstance(element)).toBeNull()\n        expect(DummyClass.getOrCreateInstance(element)).toBeInstanceOf(DummyClass)\n      })\n    })\n  })\n})\n"
  },
  {
    "path": "js/tests/unit/button.spec.js",
    "content": "import Button from '../../src/button.js'\nimport { clearFixture, getFixture, jQueryMock } from '../helpers/fixture.js'\n\ndescribe('Button', () => {\n  let fixtureEl\n\n  beforeAll(() => {\n    fixtureEl = getFixture()\n  })\n\n  afterEach(() => {\n    clearFixture()\n  })\n\n  it('should take care of element either passed as a CSS selector or DOM element', () => {\n    fixtureEl.innerHTML = '<button data-bs-toggle=\"button\">Placeholder</button>'\n    const buttonEl = fixtureEl.querySelector('[data-bs-toggle=\"button\"]')\n    const buttonBySelector = new Button('[data-bs-toggle=\"button\"]')\n    const buttonByElement = new Button(buttonEl)\n\n    expect(buttonBySelector._element).toEqual(buttonEl)\n    expect(buttonByElement._element).toEqual(buttonEl)\n  })\n\n  describe('VERSION', () => {\n    it('should return plugin version', () => {\n      expect(Button.VERSION).toEqual(jasmine.any(String))\n    })\n  })\n\n  describe('DATA_KEY', () => {\n    it('should return plugin data key', () => {\n      expect(Button.DATA_KEY).toEqual('bs.button')\n    })\n  })\n\n  describe('data-api', () => {\n    it('should toggle active class on click', () => {\n      fixtureEl.innerHTML = [\n        '<button class=\"btn\" data-bs-toggle=\"button\">btn</button>',\n        '<button class=\"btn testParent\" data-bs-toggle=\"button\"><div class=\"test\"></div></button>'\n      ].join('')\n\n      const btn = fixtureEl.querySelector('.btn')\n      const divTest = fixtureEl.querySelector('.test')\n      const btnTestParent = fixtureEl.querySelector('.testParent')\n\n      expect(btn).not.toHaveClass('active')\n\n      btn.click()\n\n      expect(btn).toHaveClass('active')\n\n      btn.click()\n\n      expect(btn).not.toHaveClass('active')\n\n      divTest.click()\n\n      expect(btnTestParent).toHaveClass('active')\n    })\n  })\n\n  describe('toggle', () => {\n    it('should toggle aria-pressed', () => {\n      fixtureEl.innerHTML = '<button class=\"btn\" data-bs-toggle=\"button\" aria-pressed=\"false\"></button>'\n\n      const btnEl = fixtureEl.querySelector('.btn')\n      const button = new Button(btnEl)\n\n      expect(btnEl.getAttribute('aria-pressed')).toEqual('false')\n      expect(btnEl).not.toHaveClass('active')\n\n      button.toggle()\n\n      expect(btnEl.getAttribute('aria-pressed')).toEqual('true')\n      expect(btnEl).toHaveClass('active')\n    })\n  })\n\n  describe('dispose', () => {\n    it('should dispose a button', () => {\n      fixtureEl.innerHTML = '<button class=\"btn\" data-bs-toggle=\"button\"></button>'\n\n      const btnEl = fixtureEl.querySelector('.btn')\n      const button = new Button(btnEl)\n\n      expect(Button.getInstance(btnEl)).not.toBeNull()\n\n      button.dispose()\n\n      expect(Button.getInstance(btnEl)).toBeNull()\n    })\n  })\n\n  describe('jQueryInterface', () => {\n    it('should handle config passed and toggle existing button', () => {\n      fixtureEl.innerHTML = '<button class=\"btn\" data-bs-toggle=\"button\"></button>'\n\n      const btnEl = fixtureEl.querySelector('.btn')\n      const button = new Button(btnEl)\n\n      const spy = spyOn(button, 'toggle')\n\n      jQueryMock.fn.button = Button.jQueryInterface\n      jQueryMock.elements = [btnEl]\n\n      jQueryMock.fn.button.call(jQueryMock, 'toggle')\n\n      expect(spy).toHaveBeenCalled()\n    })\n\n    it('should create new button instance and call toggle', () => {\n      fixtureEl.innerHTML = '<button class=\"btn\" data-bs-toggle=\"button\"></button>'\n\n      const btnEl = fixtureEl.querySelector('.btn')\n\n      jQueryMock.fn.button = Button.jQueryInterface\n      jQueryMock.elements = [btnEl]\n\n      jQueryMock.fn.button.call(jQueryMock, 'toggle')\n\n      expect(Button.getInstance(btnEl)).not.toBeNull()\n      expect(btnEl).toHaveClass('active')\n    })\n\n    it('should just create a button instance without calling toggle', () => {\n      fixtureEl.innerHTML = '<button class=\"btn\" data-bs-toggle=\"button\"></button>'\n\n      const btnEl = fixtureEl.querySelector('.btn')\n\n      jQueryMock.fn.button = Button.jQueryInterface\n      jQueryMock.elements = [btnEl]\n\n      jQueryMock.fn.button.call(jQueryMock)\n\n      expect(Button.getInstance(btnEl)).not.toBeNull()\n      expect(btnEl).not.toHaveClass('active')\n    })\n  })\n\n  describe('getInstance', () => {\n    it('should return button instance', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n      const button = new Button(div)\n\n      expect(Button.getInstance(div)).toEqual(button)\n      expect(Button.getInstance(div)).toBeInstanceOf(Button)\n    })\n\n    it('should return null when there is no button instance', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n\n      expect(Button.getInstance(div)).toBeNull()\n    })\n  })\n\n  describe('getOrCreateInstance', () => {\n    it('should return button instance', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n      const button = new Button(div)\n\n      expect(Button.getOrCreateInstance(div)).toEqual(button)\n      expect(Button.getInstance(div)).toEqual(Button.getOrCreateInstance(div, {}))\n      expect(Button.getOrCreateInstance(div)).toBeInstanceOf(Button)\n    })\n\n    it('should return new instance when there is no button instance', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n\n      expect(Button.getInstance(div)).toBeNull()\n      expect(Button.getOrCreateInstance(div)).toBeInstanceOf(Button)\n    })\n  })\n})\n"
  },
  {
    "path": "js/tests/unit/carousel.spec.js",
    "content": "import Carousel from '../../src/carousel.js'\nimport EventHandler from '../../src/dom/event-handler.js'\nimport { isRTL, noop } from '../../src/util/index.js'\nimport Swipe from '../../src/util/swipe.js'\nimport {\n  clearFixture, createEvent, getFixture, jQueryMock\n} from '../helpers/fixture.js'\n\ndescribe('Carousel', () => {\n  const { Simulator, PointerEvent } = window\n  const originWinPointerEvent = PointerEvent\n  const supportPointerEvent = Boolean(PointerEvent)\n\n  const cssStyleCarousel = '.carousel.pointer-event { touch-action: none; }'\n\n  const stylesCarousel = document.createElement('style')\n  stylesCarousel.type = 'text/css'\n  stylesCarousel.append(document.createTextNode(cssStyleCarousel))\n\n  const clearPointerEvents = () => {\n    window.PointerEvent = null\n  }\n\n  const restorePointerEvents = () => {\n    window.PointerEvent = originWinPointerEvent\n  }\n\n  let fixtureEl\n\n  beforeAll(() => {\n    fixtureEl = getFixture()\n  })\n\n  afterEach(() => {\n    clearFixture()\n  })\n\n  describe('VERSION', () => {\n    it('should return plugin version', () => {\n      expect(Carousel.VERSION).toEqual(jasmine.any(String))\n    })\n  })\n\n  describe('Default', () => {\n    it('should return plugin default config', () => {\n      expect(Carousel.Default).toEqual(jasmine.any(Object))\n    })\n  })\n\n  describe('DATA_KEY', () => {\n    it('should return plugin data key', () => {\n      expect(Carousel.DATA_KEY).toEqual('bs.carousel')\n    })\n  })\n\n  describe('constructor', () => {\n    it('should take care of element either passed as a CSS selector or DOM element', () => {\n      fixtureEl.innerHTML = '<div id=\"myCarousel\" class=\"carousel slide\"></div>'\n\n      const carouselEl = fixtureEl.querySelector('#myCarousel')\n      const carouselBySelector = new Carousel('#myCarousel')\n      const carouselByElement = new Carousel(carouselEl)\n\n      expect(carouselBySelector._element).toEqual(carouselEl)\n      expect(carouselByElement._element).toEqual(carouselEl)\n    })\n\n    it('should start cycling if `ride`===`carousel`', () => {\n      fixtureEl.innerHTML = '<div id=\"myCarousel\" class=\"carousel slide\" data-bs-ride=\"carousel\"></div>'\n\n      const carousel = new Carousel('#myCarousel')\n      expect(carousel._interval).not.toBeNull()\n    })\n\n    it('should not start cycling if `ride`!==`carousel`', () => {\n      fixtureEl.innerHTML = '<div id=\"myCarousel\" class=\"carousel slide\" data-bs-ride=\"true\"></div>'\n\n      const carousel = new Carousel('#myCarousel')\n      expect(carousel._interval).toBeNull()\n    })\n\n    it('should go to next item if right arrow key is pressed', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div id=\"myCarousel\" class=\"carousel slide\">',\n          '  <div class=\"carousel-inner\">',\n          '    <div class=\"carousel-item active\">item 1</div>',\n          '    <div id=\"item2\" class=\"carousel-item\">item 2</div>',\n          '    <div class=\"carousel-item\">item 3</div>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const carouselEl = fixtureEl.querySelector('#myCarousel')\n        const carousel = new Carousel(carouselEl, {\n          keyboard: true\n        })\n\n        const spy = spyOn(carousel, '_keydown').and.callThrough()\n\n        carouselEl.addEventListener('slid.bs.carousel', () => {\n          expect(fixtureEl.querySelector('.active')).toEqual(fixtureEl.querySelector('#item2'))\n          expect(spy).toHaveBeenCalled()\n          resolve()\n        })\n\n        const keydown = createEvent('keydown')\n        keydown.key = 'ArrowRight'\n\n        carouselEl.dispatchEvent(keydown)\n      })\n    })\n\n    it('should ignore keyboard events if data-bs-keyboard=false', () => {\n      fixtureEl.innerHTML = [\n        '<div id=\"myCarousel\" class=\"carousel slide\" data-bs-keyboard=\"false\">',\n        '  <div class=\"carousel-inner\">',\n        '    <div class=\"carousel-item active\">item 1</div>',\n        '    <div id=\"item2\" class=\"carousel-item\">item 2</div>',\n        '  </div>',\n        '</div>'\n      ].join('')\n\n      const spy = spyOn(EventHandler, 'trigger').and.callThrough()\n      const carouselEl = fixtureEl.querySelector('#myCarousel')\n      // eslint-disable-next-line no-new\n      new Carousel('#myCarousel')\n      expect(spy).not.toHaveBeenCalledWith(carouselEl, 'keydown.bs.carousel', jasmine.any(Function))\n    })\n\n    it('should ignore mouse events if data-bs-pause=false', () => {\n      fixtureEl.innerHTML = [\n        '<div id=\"myCarousel\" class=\"carousel slide\" data-bs-pause=\"false\">',\n        '  <div class=\"carousel-inner\">',\n        '    <div class=\"carousel-item active\">item 1</div>',\n        '    <div id=\"item2\" class=\"carousel-item\">item 2</div>',\n        '  </div>',\n        '</div>'\n      ].join('')\n\n      const spy = spyOn(EventHandler, 'trigger').and.callThrough()\n      const carouselEl = fixtureEl.querySelector('#myCarousel')\n      // eslint-disable-next-line no-new\n      new Carousel('#myCarousel')\n      expect(spy).not.toHaveBeenCalledWith(carouselEl, 'hover.bs.carousel', jasmine.any(Function))\n    })\n\n    it('should go to previous item if left arrow key is pressed', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div id=\"myCarousel\" class=\"carousel slide\">',\n          '  <div class=\"carousel-inner\">',\n          '    <div id=\"item1\" class=\"carousel-item\">item 1</div>',\n          '    <div class=\"carousel-item active\">item 2</div>',\n          '    <div class=\"carousel-item\">item 3</div>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const carouselEl = fixtureEl.querySelector('#myCarousel')\n        const carousel = new Carousel(carouselEl, {\n          keyboard: true\n        })\n\n        const spy = spyOn(carousel, '_keydown').and.callThrough()\n\n        carouselEl.addEventListener('slid.bs.carousel', () => {\n          expect(fixtureEl.querySelector('.active')).toEqual(fixtureEl.querySelector('#item1'))\n          expect(spy).toHaveBeenCalled()\n          resolve()\n        })\n\n        const keydown = createEvent('keydown')\n        keydown.key = 'ArrowLeft'\n\n        carouselEl.dispatchEvent(keydown)\n      })\n    })\n\n    it('should not prevent keydown if key is not ARROW_LEFT or ARROW_RIGHT', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div id=\"myCarousel\" class=\"carousel slide\">',\n          '  <div class=\"carousel-inner\">',\n          '    <div class=\"carousel-item active\">item 1</div>',\n          '    <div class=\"carousel-item\">item 2</div>',\n          '    <div class=\"carousel-item\">item 3</div>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const carouselEl = fixtureEl.querySelector('#myCarousel')\n        const carousel = new Carousel(carouselEl, {\n          keyboard: true\n        })\n\n        const spy = spyOn(carousel, '_keydown').and.callThrough()\n\n        carouselEl.addEventListener('keydown', event => {\n          expect(spy).toHaveBeenCalled()\n          expect(event.defaultPrevented).toBeFalse()\n          resolve()\n        })\n\n        const keydown = createEvent('keydown')\n        keydown.key = 'ArrowDown'\n\n        carouselEl.dispatchEvent(keydown)\n      })\n    })\n\n    it('should ignore keyboard events within <input>s and <textarea>s', () => {\n      fixtureEl.innerHTML = [\n        '<div id=\"myCarousel\" class=\"carousel slide\">',\n        '  <div class=\"carousel-inner\">',\n        '    <div class=\"carousel-item active\">',\n        '      <input type=\"text\">',\n        '      <textarea></textarea>',\n        '    </div>',\n        '    <div class=\"carousel-item\"></div>',\n        '    <div class=\"carousel-item\">item 3</div>',\n        '  </div>',\n        '</div>'\n      ].join('')\n\n      const carouselEl = fixtureEl.querySelector('#myCarousel')\n      const input = fixtureEl.querySelector('input')\n      const textarea = fixtureEl.querySelector('textarea')\n      const carousel = new Carousel(carouselEl, {\n        keyboard: true\n      })\n\n      const spyKeydown = spyOn(carousel, '_keydown').and.callThrough()\n      const spySlide = spyOn(carousel, '_slide')\n\n      const keydown = createEvent('keydown', { bubbles: true, cancelable: true })\n      keydown.key = 'ArrowRight'\n      Object.defineProperty(keydown, 'target', {\n        value: input,\n        writable: true,\n        configurable: true\n      })\n\n      input.dispatchEvent(keydown)\n\n      expect(spyKeydown).toHaveBeenCalled()\n      expect(spySlide).not.toHaveBeenCalled()\n\n      spyKeydown.calls.reset()\n      spySlide.calls.reset()\n\n      Object.defineProperty(keydown, 'target', {\n        value: textarea\n      })\n      textarea.dispatchEvent(keydown)\n\n      expect(spyKeydown).toHaveBeenCalled()\n      expect(spySlide).not.toHaveBeenCalled()\n    })\n\n    it('should not slide if arrow key is pressed and carousel is sliding', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const carouselEl = fixtureEl.querySelector('div')\n      const carousel = new Carousel(carouselEl, {})\n\n      const spy = spyOn(EventHandler, 'trigger')\n\n      carousel._isSliding = true\n\n      for (const key of ['ArrowLeft', 'ArrowRight']) {\n        const keydown = createEvent('keydown')\n        keydown.key = key\n\n        carouselEl.dispatchEvent(keydown)\n      }\n\n      expect(spy).not.toHaveBeenCalled()\n    })\n\n    it('should wrap around from end to start when wrap option is true', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div id=\"myCarousel\" class=\"carousel slide\">',\n          '  <div class=\"carousel-inner\">',\n          '    <div id=\"one\" class=\"carousel-item active\"></div>',\n          '    <div id=\"two\" class=\"carousel-item\"></div>',\n          '    <div id=\"three\" class=\"carousel-item\">item 3</div>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const carouselEl = fixtureEl.querySelector('#myCarousel')\n        const carousel = new Carousel(carouselEl, { wrap: true })\n        const getActiveId = () => carouselEl.querySelector('.carousel-item.active').getAttribute('id')\n\n        carouselEl.addEventListener('slid.bs.carousel', event => {\n          const activeId = getActiveId()\n\n          if (activeId === 'two') {\n            carousel.next()\n            return\n          }\n\n          if (activeId === 'three') {\n            carousel.next()\n            return\n          }\n\n          if (activeId === 'one') {\n            // carousel wrapped around and slid from 3rd to 1st slide\n            expect(activeId).toEqual('one')\n            expect(event.from + 1).toEqual(3)\n            resolve()\n          }\n        })\n\n        carousel.next()\n      })\n    })\n\n    it('should stay at the start when the prev method is called and wrap is false', () => {\n      return new Promise((resolve, reject) => {\n        fixtureEl.innerHTML = [\n          '<div id=\"myCarousel\" class=\"carousel slide\">',\n          '  <div class=\"carousel-inner\">',\n          '    <div id=\"one\" class=\"carousel-item active\"></div>',\n          '    <div id=\"two\" class=\"carousel-item\"></div>',\n          '    <div id=\"three\" class=\"carousel-item\">item 3</div>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const carouselEl = fixtureEl.querySelector('#myCarousel')\n        const firstElement = fixtureEl.querySelector('#one')\n        const carousel = new Carousel(carouselEl, { wrap: false })\n\n        carouselEl.addEventListener('slid.bs.carousel', () => {\n          reject(new Error('carousel slid when it should not have slid'))\n        })\n\n        carousel.prev()\n\n        setTimeout(() => {\n          expect(firstElement).toHaveClass('active')\n          resolve()\n        }, 10)\n      })\n    })\n\n    it('should not add touch event listeners if touch = false', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const carouselEl = fixtureEl.querySelector('div')\n\n      const spy = spyOn(Carousel.prototype, '_addTouchEventListeners')\n\n      const carousel = new Carousel(carouselEl, {\n        touch: false\n      })\n\n      expect(spy).not.toHaveBeenCalled()\n      expect(carousel._swipeHelper).toBeNull()\n    })\n\n    it('should not add touch event listeners if touch supported = false', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const carouselEl = fixtureEl.querySelector('div')\n      spyOn(Swipe, 'isSupported').and.returnValue(false)\n\n      const carousel = new Carousel(carouselEl)\n      EventHandler.off(carouselEl, Carousel.EVENT_KEY)\n\n      const spy = spyOn(carousel, '_addTouchEventListeners')\n\n      carousel._addEventListeners()\n\n      expect(spy).not.toHaveBeenCalled()\n      expect(carousel._swipeHelper).toBeNull()\n    })\n\n    it('should add touch event listeners by default', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const carouselEl = fixtureEl.querySelector('div')\n\n      spyOn(Carousel.prototype, '_addTouchEventListeners')\n\n      // Headless browser does not support touch events, so need to fake it\n      // to test that touch events are add properly.\n      document.documentElement.ontouchstart = noop\n      const carousel = new Carousel(carouselEl)\n\n      expect(carousel._addTouchEventListeners).toHaveBeenCalled()\n    })\n\n    it('should allow swiperight and call _slide (prev) with pointer events', () => {\n      return new Promise(resolve => {\n        if (!supportPointerEvent) {\n          expect().nothing()\n          resolve()\n          return\n        }\n\n        document.documentElement.ontouchstart = noop\n        document.head.append(stylesCarousel)\n        Simulator.setType('pointer')\n\n        fixtureEl.innerHTML = [\n          '<div class=\"carousel\">',\n          '  <div class=\"carousel-inner\">',\n          '    <div id=\"item\" class=\"carousel-item\">',\n          '      <img alt=\"\">',\n          '    </div>',\n          '    <div class=\"carousel-item active\">',\n          '      <img alt=\"\">',\n          '    </div>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const carouselEl = fixtureEl.querySelector('.carousel')\n        const item = fixtureEl.querySelector('#item')\n        const carousel = new Carousel(carouselEl)\n\n        const spy = spyOn(carousel, '_slide').and.callThrough()\n\n        carouselEl.addEventListener('slid.bs.carousel', event => {\n          expect(item).toHaveClass('active')\n          expect(spy).toHaveBeenCalledWith('prev')\n          expect(event.direction).toEqual('right')\n          stylesCarousel.remove()\n          delete document.documentElement.ontouchstart\n          resolve()\n        })\n\n        Simulator.gestures.swipe(carouselEl, {\n          deltaX: 300,\n          deltaY: 0\n        })\n      })\n    })\n\n    it('should allow swipeleft and call next with pointer events', () => {\n      return new Promise(resolve => {\n        if (!supportPointerEvent) {\n          expect().nothing()\n          resolve()\n          return\n        }\n\n        document.documentElement.ontouchstart = noop\n        document.head.append(stylesCarousel)\n        Simulator.setType('pointer')\n\n        fixtureEl.innerHTML = [\n          '<div class=\"carousel\">',\n          '  <div class=\"carousel-inner\">',\n          '    <div id=\"item\" class=\"carousel-item active\">',\n          '      <img alt=\"\">',\n          '    </div>',\n          '    <div class=\"carousel-item\">',\n          '      <img alt=\"\">',\n          '    </div>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const carouselEl = fixtureEl.querySelector('.carousel')\n        const item = fixtureEl.querySelector('#item')\n        const carousel = new Carousel(carouselEl)\n\n        const spy = spyOn(carousel, '_slide').and.callThrough()\n\n        carouselEl.addEventListener('slid.bs.carousel', event => {\n          expect(item).not.toHaveClass('active')\n          expect(spy).toHaveBeenCalledWith('next')\n          expect(event.direction).toEqual('left')\n          stylesCarousel.remove()\n          delete document.documentElement.ontouchstart\n          resolve()\n        })\n\n        Simulator.gestures.swipe(carouselEl, {\n          pos: [300, 10],\n          deltaX: -300,\n          deltaY: 0\n        })\n      })\n    })\n\n    it('should allow swiperight and call _slide (prev) with touch events', () => {\n      return new Promise(resolve => {\n        Simulator.setType('touch')\n        clearPointerEvents()\n        document.documentElement.ontouchstart = noop\n\n        fixtureEl.innerHTML = [\n          '<div class=\"carousel\">',\n          '  <div class=\"carousel-inner\">',\n          '    <div id=\"item\" class=\"carousel-item\">',\n          '      <img alt=\"\">',\n          '    </div>',\n          '    <div class=\"carousel-item active\">',\n          '      <img alt=\"\">',\n          '    </div>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const carouselEl = fixtureEl.querySelector('.carousel')\n        const item = fixtureEl.querySelector('#item')\n        const carousel = new Carousel(carouselEl)\n\n        const spy = spyOn(carousel, '_slide').and.callThrough()\n\n        carouselEl.addEventListener('slid.bs.carousel', event => {\n          expect(item).toHaveClass('active')\n          expect(spy).toHaveBeenCalledWith('prev')\n          expect(event.direction).toEqual('right')\n          delete document.documentElement.ontouchstart\n          restorePointerEvents()\n          resolve()\n        })\n\n        Simulator.gestures.swipe(carouselEl, {\n          deltaX: 300,\n          deltaY: 0\n        })\n      })\n    })\n\n    it('should allow swipeleft and call _slide (next) with touch events', () => {\n      return new Promise(resolve => {\n        Simulator.setType('touch')\n        clearPointerEvents()\n        document.documentElement.ontouchstart = noop\n\n        fixtureEl.innerHTML = [\n          '<div class=\"carousel\">',\n          '  <div class=\"carousel-inner\">',\n          '    <div id=\"item\" class=\"carousel-item active\">',\n          '      <img alt=\"\">',\n          '    </div>',\n          '    <div class=\"carousel-item\">',\n          '      <img alt=\"\">',\n          '    </div>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const carouselEl = fixtureEl.querySelector('.carousel')\n        const item = fixtureEl.querySelector('#item')\n        const carousel = new Carousel(carouselEl)\n\n        const spy = spyOn(carousel, '_slide').and.callThrough()\n\n        carouselEl.addEventListener('slid.bs.carousel', event => {\n          expect(item).not.toHaveClass('active')\n          expect(spy).toHaveBeenCalledWith('next')\n          expect(event.direction).toEqual('left')\n          delete document.documentElement.ontouchstart\n          restorePointerEvents()\n          resolve()\n        })\n\n        Simulator.gestures.swipe(carouselEl, {\n          pos: [300, 10],\n          deltaX: -300,\n          deltaY: 0\n        })\n      })\n    })\n\n    it('should not slide when swiping and carousel is sliding', () => {\n      return new Promise(resolve => {\n        Simulator.setType('touch')\n        clearPointerEvents()\n        document.documentElement.ontouchstart = noop\n\n        fixtureEl.innerHTML = [\n          '<div class=\"carousel\">',\n          '  <div class=\"carousel-inner\">',\n          '    <div id=\"item\" class=\"carousel-item active\">',\n          '      <img alt=\"\">',\n          '    </div>',\n          '    <div class=\"carousel-item\">',\n          '      <img alt=\"\">',\n          '    </div>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const carouselEl = fixtureEl.querySelector('.carousel')\n        const carousel = new Carousel(carouselEl)\n        carousel._isSliding = true\n\n        const spy = spyOn(EventHandler, 'trigger')\n\n        Simulator.gestures.swipe(carouselEl, {\n          deltaX: 300,\n          deltaY: 0\n        })\n\n        Simulator.gestures.swipe(carouselEl, {\n          pos: [300, 10],\n          deltaX: -300,\n          deltaY: 0\n        })\n\n        setTimeout(() => {\n          expect(spy).not.toHaveBeenCalled()\n          delete document.documentElement.ontouchstart\n          restorePointerEvents()\n          resolve()\n        }, 300)\n      })\n    })\n\n    it('should not allow pinch with touch events', () => {\n      return new Promise(resolve => {\n        Simulator.setType('touch')\n        clearPointerEvents()\n        document.documentElement.ontouchstart = noop\n\n        fixtureEl.innerHTML = '<div class=\"carousel\"></div>'\n\n        const carouselEl = fixtureEl.querySelector('.carousel')\n        const carousel = new Carousel(carouselEl)\n\n        Simulator.gestures.swipe(carouselEl, {\n          pos: [300, 10],\n          deltaX: -300,\n          deltaY: 0,\n          touches: 2\n        }, () => {\n          restorePointerEvents()\n          delete document.documentElement.ontouchstart\n          expect(carousel._swipeHelper._deltaX).toEqual(0)\n          resolve()\n        })\n      })\n    })\n\n    it('should call pause method on mouse over with pause equal to hover', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<div class=\"carousel\"></div>'\n\n        const carouselEl = fixtureEl.querySelector('.carousel')\n        const carousel = new Carousel(carouselEl)\n\n        const spy = spyOn(carousel, 'pause')\n\n        const mouseOverEvent = createEvent('mouseover')\n        carouselEl.dispatchEvent(mouseOverEvent)\n\n        setTimeout(() => {\n          expect(spy).toHaveBeenCalled()\n          resolve()\n        }, 10)\n      })\n    })\n\n    it('should call `maybeEnableCycle` on mouse out with pause equal to hover', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<div class=\"carousel\" data-bs-ride=\"true\"></div>'\n\n        const carouselEl = fixtureEl.querySelector('.carousel')\n        const carousel = new Carousel(carouselEl)\n\n        const spyEnable = spyOn(carousel, '_maybeEnableCycle').and.callThrough()\n        const spyCycle = spyOn(carousel, 'cycle')\n\n        const mouseOutEvent = createEvent('mouseout')\n        carouselEl.dispatchEvent(mouseOutEvent)\n\n        setTimeout(() => {\n          expect(spyEnable).toHaveBeenCalled()\n          expect(spyCycle).toHaveBeenCalled()\n          resolve()\n        }, 10)\n      })\n    })\n  })\n\n  describe('next', () => {\n    it('should not slide if the carousel is sliding', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const carouselEl = fixtureEl.querySelector('div')\n      const carousel = new Carousel(carouselEl, {})\n\n      const spy = spyOn(EventHandler, 'trigger')\n\n      carousel._isSliding = true\n      carousel.next()\n\n      expect(spy).not.toHaveBeenCalled()\n    })\n\n    it('should not fire slid when slide is prevented', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<div></div>'\n\n        const carouselEl = fixtureEl.querySelector('div')\n        const carousel = new Carousel(carouselEl, {})\n        let slidEvent = false\n\n        const doneTest = () => {\n          setTimeout(() => {\n            expect(slidEvent).toBeFalse()\n            resolve()\n          }, 20)\n        }\n\n        carouselEl.addEventListener('slide.bs.carousel', event => {\n          event.preventDefault()\n          doneTest()\n        })\n\n        carouselEl.addEventListener('slid.bs.carousel', () => {\n          slidEvent = true\n        })\n\n        carousel.next()\n      })\n    })\n\n    it('should fire slide event with: direction, relatedTarget, from and to', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div id=\"myCarousel\" class=\"carousel slide\">',\n          '  <div class=\"carousel-inner\">',\n          '    <div class=\"carousel-item active\">item 1</div>',\n          '    <div class=\"carousel-item\">item 2</div>',\n          '    <div class=\"carousel-item\">item 3</div>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const carouselEl = fixtureEl.querySelector('#myCarousel')\n        const carousel = new Carousel(carouselEl, {})\n\n        const onSlide = event => {\n          expect(event.direction).toEqual('left')\n          expect(event.relatedTarget).toHaveClass('carousel-item')\n          expect(event.from).toEqual(0)\n          expect(event.to).toEqual(1)\n\n          carouselEl.removeEventListener('slide.bs.carousel', onSlide)\n          carouselEl.addEventListener('slide.bs.carousel', onSlide2)\n\n          carousel.prev()\n        }\n\n        const onSlide2 = event => {\n          expect(event.direction).toEqual('right')\n          resolve()\n        }\n\n        carouselEl.addEventListener('slide.bs.carousel', onSlide)\n        carousel.next()\n      })\n    })\n\n    it('should fire slid event with: direction, relatedTarget, from and to', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div id=\"myCarousel\" class=\"carousel slide\">',\n          '  <div class=\"carousel-inner\">',\n          '    <div class=\"carousel-item active\">item 1</div>',\n          '    <div class=\"carousel-item\">item 2</div>',\n          '    <div class=\"carousel-item\">item 3</div>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const carouselEl = fixtureEl.querySelector('#myCarousel')\n        const carousel = new Carousel(carouselEl, {})\n\n        const onSlid = event => {\n          expect(event.direction).toEqual('left')\n          expect(event.relatedTarget).toHaveClass('carousel-item')\n          expect(event.from).toEqual(0)\n          expect(event.to).toEqual(1)\n\n          carouselEl.removeEventListener('slid.bs.carousel', onSlid)\n          carouselEl.addEventListener('slid.bs.carousel', onSlid2)\n\n          carousel.prev()\n        }\n\n        const onSlid2 = event => {\n          expect(event.direction).toEqual('right')\n          resolve()\n        }\n\n        carouselEl.addEventListener('slid.bs.carousel', onSlid)\n        carousel.next()\n      })\n    })\n\n    it('should update the active element to the next item before sliding', () => {\n      fixtureEl.innerHTML = [\n        '<div id=\"myCarousel\" class=\"carousel slide\">',\n        '  <div class=\"carousel-inner\">',\n        '    <div class=\"carousel-item active\">item 1</div>',\n        '    <div id=\"secondItem\" class=\"carousel-item\">item 2</div>',\n        '    <div class=\"carousel-item\">item 3</div>',\n        '  </div>',\n        '</div>'\n      ].join('')\n\n      const carouselEl = fixtureEl.querySelector('#myCarousel')\n      const secondItemEl = fixtureEl.querySelector('#secondItem')\n      const carousel = new Carousel(carouselEl)\n\n      carousel.next()\n\n      expect(carousel._activeElement).toEqual(secondItemEl)\n    })\n\n    it('should continue cycling if it was already', () => {\n      fixtureEl.innerHTML = [\n        '<div id=\"myCarousel\" class=\"carousel slide\">',\n        '  <div class=\"carousel-inner\">',\n        '    <div class=\"carousel-item active\">item 1</div>',\n        '    <div class=\"carousel-item\">item 2</div>',\n        '  </div>',\n        '</div>'\n      ].join('')\n\n      const carouselEl = fixtureEl.querySelector('#myCarousel')\n      const carousel = new Carousel(carouselEl)\n      const spy = spyOn(carousel, 'cycle')\n\n      carousel.next()\n      expect(spy).not.toHaveBeenCalled()\n\n      carousel.cycle()\n      carousel.next()\n      expect(spy).toHaveBeenCalledTimes(1)\n    })\n\n    it('should update indicators if present', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div id=\"myCarousel\" class=\"carousel slide\">',\n          '  <div class=\"carousel-indicators\">',\n          '    <button type=\"button\" id=\"firstIndicator\" data-bs-target=\"myCarousel\" data-bs-slide-to=\"0\" class=\"active\" aria-current=\"true\" aria-label=\"Slide 1\"></button>',\n          '    <button type=\"button\" id=\"secondIndicator\" data-bs-target=\"myCarousel\" data-bs-slide-to=\"1\" aria-label=\"Slide 2\"></button>',\n          '    <button type=\"button\" data-bs-target=\"myCarousel\" data-bs-slide-to=\"2\" aria-label=\"Slide 3\"></button>',\n          '  </div>',\n          '  <div class=\"carousel-inner\">',\n          '    <div class=\"carousel-item active\">item 1</div>',\n          '    <div class=\"carousel-item\" data-bs-interval=\"7\">item 2</div>',\n          '    <div class=\"carousel-item\">item 3</div>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const carouselEl = fixtureEl.querySelector('#myCarousel')\n        const firstIndicator = fixtureEl.querySelector('#firstIndicator')\n        const secondIndicator = fixtureEl.querySelector('#secondIndicator')\n        const carousel = new Carousel(carouselEl)\n\n        carouselEl.addEventListener('slid.bs.carousel', () => {\n          expect(firstIndicator).not.toHaveClass('active')\n          expect(firstIndicator.hasAttribute('aria-current')).toBeFalse()\n          expect(secondIndicator).toHaveClass('active')\n          expect(secondIndicator.getAttribute('aria-current')).toEqual('true')\n          resolve()\n        })\n\n        carousel.next()\n      })\n    })\n\n    it('should call next()/prev() instance methods when clicking the respective direction buttons', () => {\n      fixtureEl.innerHTML = [\n        '<div id=\"carousel\" class=\"carousel slide\">',\n        '  <div class=\"carousel-inner\">',\n        '    <div class=\"carousel-item active\">item 1</div>',\n        '    <div class=\"carousel-item\">item 2</div>',\n        '    <div class=\"carousel-item\">item 3</div>',\n        '  </div>',\n        '  <button class=\"carousel-control-prev\" type=\"button\" data-bs-target=\"#carousel\" data-bs-slide=\"prev\"></button>',\n        '  <button class=\"carousel-control-next\" type=\"button\" data-bs-target=\"#carousel\" data-bs-slide=\"next\"></button>',\n        '</div>'\n      ].join('')\n\n      const carouselEl = fixtureEl.querySelector('#carousel')\n      const prevBtnEl = fixtureEl.querySelector('.carousel-control-prev')\n      const nextBtnEl = fixtureEl.querySelector('.carousel-control-next')\n\n      const carousel = new Carousel(carouselEl)\n      const nextSpy = spyOn(carousel, 'next')\n      const prevSpy = spyOn(carousel, 'prev')\n      const spyEnable = spyOn(carousel, '_maybeEnableCycle')\n\n      nextBtnEl.click()\n      prevBtnEl.click()\n\n      expect(nextSpy).toHaveBeenCalled()\n      expect(prevSpy).toHaveBeenCalled()\n      expect(spyEnable).toHaveBeenCalled()\n    })\n  })\n\n  describe('nextWhenVisible', () => {\n    it('should not call next when the page is not visible', () => {\n      fixtureEl.innerHTML = [\n        '<div style=\"display: none;\">',\n        '  <div class=\"carousel\"></div>',\n        '</div>'\n      ].join('')\n\n      const carouselEl = fixtureEl.querySelector('.carousel')\n      const carousel = new Carousel(carouselEl)\n\n      const spy = spyOn(carousel, 'next')\n\n      carousel.nextWhenVisible()\n\n      expect(spy).not.toHaveBeenCalled()\n    })\n  })\n\n  describe('prev', () => {\n    it('should not slide if the carousel is sliding', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const carouselEl = fixtureEl.querySelector('div')\n      const carousel = new Carousel(carouselEl, {})\n\n      const spy = spyOn(EventHandler, 'trigger')\n\n      carousel._isSliding = true\n      carousel.prev()\n\n      expect(spy).not.toHaveBeenCalled()\n    })\n  })\n\n  describe('pause', () => {\n    it('should trigger transitionend if the carousel have carousel-item-next or carousel-item-prev class, cause is sliding', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div id=\"myCarousel\" class=\"carousel slide\">',\n          '  <div class=\"carousel-inner\">',\n          '    <div class=\"carousel-item active\">item 1</div>',\n          '    <div class=\"carousel-item carousel-item-next\">item 2</div>',\n          '    <div class=\"carousel-item\">item 3</div>',\n          '  </div>',\n          '  <div class=\"carousel-control-prev\"></div>',\n          '  <div class=\"carousel-control-next\"></div>',\n          '</div>'\n        ].join('')\n\n        const carouselEl = fixtureEl.querySelector('#myCarousel')\n        const carousel = new Carousel(carouselEl)\n        const spy = spyOn(carousel, '_clearInterval')\n\n        carouselEl.addEventListener('transitionend', () => {\n          expect(spy).toHaveBeenCalled()\n          resolve()\n        })\n\n        carousel._slide('next')\n        carousel.pause()\n      })\n    })\n  })\n\n  describe('cycle', () => {\n    it('should set an interval', () => {\n      fixtureEl.innerHTML = [\n        '<div id=\"myCarousel\" class=\"carousel slide\">',\n        '  <div class=\"carousel-inner\">',\n        '    <div class=\"carousel-item active\">item 1</div>',\n        '    <div class=\"carousel-item\">item 2</div>',\n        '    <div class=\"carousel-item\">item 3</div>',\n        '  </div>',\n        '  <div class=\"carousel-control-prev\"></div>',\n        '  <div class=\"carousel-control-next\"></div>',\n        '</div>'\n      ].join('')\n\n      const carouselEl = fixtureEl.querySelector('#myCarousel')\n      const carousel = new Carousel(carouselEl)\n\n      const spy = spyOn(window, 'setInterval').and.callThrough()\n\n      carousel.cycle()\n\n      expect(spy).toHaveBeenCalled()\n    })\n\n    it('should clear interval if there is one', () => {\n      fixtureEl.innerHTML = [\n        '<div id=\"myCarousel\" class=\"carousel slide\">',\n        '  <div class=\"carousel-inner\">',\n        '    <div class=\"carousel-item active\">item 1</div>',\n        '    <div class=\"carousel-item\">item 2</div>',\n        '    <div class=\"carousel-item\">item 3</div>',\n        '  </div>',\n        '  <div class=\"carousel-control-prev\"></div>',\n        '  <div class=\"carousel-control-next\"></div>',\n        '</div>'\n      ].join('')\n\n      const carouselEl = fixtureEl.querySelector('#myCarousel')\n      const carousel = new Carousel(carouselEl)\n\n      carousel._interval = setInterval(noop, 10)\n\n      const spySet = spyOn(window, 'setInterval').and.callThrough()\n      const spyClear = spyOn(window, 'clearInterval').and.callThrough()\n\n      carousel.cycle()\n\n      expect(spySet).toHaveBeenCalled()\n      expect(spyClear).toHaveBeenCalled()\n    })\n\n    it('should get interval from data attribute on the active item element', () => {\n      fixtureEl.innerHTML = [\n        '<div id=\"myCarousel\" class=\"carousel slide\">',\n        '  <div class=\"carousel-inner\">',\n        '    <div class=\"carousel-item active\" data-bs-interval=\"7\">item 1</div>',\n        '    <div id=\"secondItem\" class=\"carousel-item\" data-bs-interval=\"9385\">item 2</div>',\n        '    <div class=\"carousel-item\">item 3</div>',\n        '  </div>',\n        '</div>'\n      ].join('')\n\n      const carouselEl = fixtureEl.querySelector('#myCarousel')\n      const secondItemEl = fixtureEl.querySelector('#secondItem')\n      const carousel = new Carousel(carouselEl, {\n        interval: 1814\n      })\n\n      expect(carousel._config.interval).toEqual(1814)\n\n      carousel.cycle()\n\n      expect(carousel._config.interval).toEqual(7)\n\n      carousel._activeElement = secondItemEl\n      carousel.cycle()\n\n      expect(carousel._config.interval).toEqual(9385)\n    })\n  })\n\n  describe('to', () => {\n    it('should go directly to the provided index', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div id=\"myCarousel\" class=\"carousel slide\">',\n          '  <div class=\"carousel-inner\">',\n          '    <div id=\"item1\" class=\"carousel-item active\">item 1</div>',\n          '    <div class=\"carousel-item\">item 2</div>',\n          '    <div id=\"item3\" class=\"carousel-item\">item 3</div>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const carouselEl = fixtureEl.querySelector('#myCarousel')\n        const carousel = new Carousel(carouselEl, {})\n\n        expect(fixtureEl.querySelector('.active')).toEqual(fixtureEl.querySelector('#item1'))\n\n        carousel.to(2)\n\n        carouselEl.addEventListener('slid.bs.carousel', () => {\n          expect(fixtureEl.querySelector('.active')).toEqual(fixtureEl.querySelector('#item3'))\n          resolve()\n        })\n      })\n    })\n\n    it('should return to a previous slide if the provided index is lower than the current', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div id=\"myCarousel\" class=\"carousel slide\">',\n          '  <div class=\"carousel-inner\">',\n          '    <div class=\"carousel-item\">item 1</div>',\n          '    <div id=\"item2\" class=\"carousel-item\">item 2</div>',\n          '    <div id=\"item3\" class=\"carousel-item active\">item 3</div>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const carouselEl = fixtureEl.querySelector('#myCarousel')\n        const carousel = new Carousel(carouselEl, {})\n\n        expect(fixtureEl.querySelector('.active')).toEqual(fixtureEl.querySelector('#item3'))\n\n        carousel.to(1)\n\n        carouselEl.addEventListener('slid.bs.carousel', () => {\n          expect(fixtureEl.querySelector('.active')).toEqual(fixtureEl.querySelector('#item2'))\n          resolve()\n        })\n      })\n    })\n\n    it('should do nothing if a wrong index is provided', () => {\n      fixtureEl.innerHTML = [\n        '<div id=\"myCarousel\" class=\"carousel slide\">',\n        '  <div class=\"carousel-inner\">',\n        '    <div class=\"carousel-item active\">item 1</div>',\n        '    <div class=\"carousel-item\" data-bs-interval=\"7\">item 2</div>',\n        '    <div class=\"carousel-item\">item 3</div>',\n        '  </div>',\n        '</div>'\n      ].join('')\n\n      const carouselEl = fixtureEl.querySelector('#myCarousel')\n      const carousel = new Carousel(carouselEl, {})\n\n      const spy = spyOn(carousel, '_slide')\n\n      carousel.to(25)\n\n      expect(spy).not.toHaveBeenCalled()\n\n      spy.calls.reset()\n\n      carousel.to(-5)\n\n      expect(spy).not.toHaveBeenCalled()\n    })\n\n    it('should not continue if the provided is the same compare to the current one', () => {\n      fixtureEl.innerHTML = [\n        '<div id=\"myCarousel\" class=\"carousel slide\">',\n        '  <div class=\"carousel-inner\">',\n        '    <div class=\"carousel-item active\">item 1</div>',\n        '    <div class=\"carousel-item\" data-bs-interval=\"7\">item 2</div>',\n        '    <div class=\"carousel-item\">item 3</div>',\n        '  </div>',\n        '</div>'\n      ].join('')\n\n      const carouselEl = fixtureEl.querySelector('#myCarousel')\n      const carousel = new Carousel(carouselEl, {})\n\n      const spy = spyOn(carousel, '_slide')\n\n      carousel.to(0)\n\n      expect(spy).not.toHaveBeenCalled()\n    })\n\n    it('should wait before performing to if a slide is sliding', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div id=\"myCarousel\" class=\"carousel slide\">',\n          '  <div class=\"carousel-inner\">',\n          '    <div class=\"carousel-item active\">item 1</div>',\n          '    <div class=\"carousel-item\" data-bs-interval=\"7\">item 2</div>',\n          '    <div class=\"carousel-item\">item 3</div>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const carouselEl = fixtureEl.querySelector('#myCarousel')\n        const carousel = new Carousel(carouselEl, {})\n\n        const spyOne = spyOn(EventHandler, 'one').and.callThrough()\n        const spySlide = spyOn(carousel, '_slide')\n\n        carousel._isSliding = true\n        carousel.to(1)\n\n        expect(spySlide).not.toHaveBeenCalled()\n        expect(spyOne).toHaveBeenCalled()\n\n        const spyTo = spyOn(carousel, 'to')\n\n        EventHandler.trigger(carouselEl, 'slid.bs.carousel')\n\n        setTimeout(() => {\n          expect(spyTo).toHaveBeenCalledWith(1)\n          resolve()\n        })\n      })\n    })\n  })\n\n  describe('rtl function', () => {\n    it('\"_directionToOrder\" and \"_orderToDirection\" must return the right results', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const carouselEl = fixtureEl.querySelector('div')\n      const carousel = new Carousel(carouselEl, {})\n\n      expect(carousel._directionToOrder('left')).toEqual('next')\n      expect(carousel._directionToOrder('right')).toEqual('prev')\n\n      expect(carousel._orderToDirection('next')).toEqual('left')\n      expect(carousel._orderToDirection('prev')).toEqual('right')\n    })\n\n    it('\"_directionToOrder\" and \"_orderToDirection\" must return the right results when rtl=true', () => {\n      document.documentElement.dir = 'rtl'\n      fixtureEl.innerHTML = '<div></div>'\n\n      const carouselEl = fixtureEl.querySelector('div')\n      const carousel = new Carousel(carouselEl, {})\n      expect(isRTL()).toBeTrue()\n\n      expect(carousel._directionToOrder('left')).toEqual('prev')\n      expect(carousel._directionToOrder('right')).toEqual('next')\n\n      expect(carousel._orderToDirection('next')).toEqual('right')\n      expect(carousel._orderToDirection('prev')).toEqual('left')\n      document.documentElement.dir = 'ltl'\n    })\n\n    it('\"_slide\" has to call _directionToOrder and \"_orderToDirection\"', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const carouselEl = fixtureEl.querySelector('div')\n      const carousel = new Carousel(carouselEl, {})\n\n      const spy = spyOn(carousel, '_orderToDirection').and.callThrough()\n\n      carousel._slide(carousel._directionToOrder('left'))\n      expect(spy).toHaveBeenCalledWith('next')\n\n      carousel._slide(carousel._directionToOrder('right'))\n      expect(spy).toHaveBeenCalledWith('prev')\n    })\n\n    it('\"_slide\" has to call \"_directionToOrder\" and \"_orderToDirection\" when rtl=true', () => {\n      document.documentElement.dir = 'rtl'\n      fixtureEl.innerHTML = '<div></div>'\n\n      const carouselEl = fixtureEl.querySelector('div')\n      const carousel = new Carousel(carouselEl, {})\n      const spy = spyOn(carousel, '_orderToDirection').and.callThrough()\n\n      carousel._slide(carousel._directionToOrder('left'))\n      expect(spy).toHaveBeenCalledWith('prev')\n\n      carousel._slide(carousel._directionToOrder('right'))\n      expect(spy).toHaveBeenCalledWith('next')\n\n      document.documentElement.dir = 'ltl'\n    })\n  })\n\n  describe('dispose', () => {\n    it('should destroy a carousel', () => {\n      fixtureEl.innerHTML = [\n        '<div id=\"myCarousel\" class=\"carousel slide\">',\n        '  <div class=\"carousel-inner\">',\n        '    <div class=\"carousel-item active\">item 1</div>',\n        '    <div class=\"carousel-item\" data-bs-interval=\"7\">item 2</div>',\n        '    <div class=\"carousel-item\">item 3</div>',\n        '  </div>',\n        '</div>'\n      ].join('')\n\n      const carouselEl = fixtureEl.querySelector('#myCarousel')\n      const addEventSpy = spyOn(carouselEl, 'addEventListener').and.callThrough()\n      const removeEventSpy = spyOn(EventHandler, 'off').and.callThrough()\n\n      // Headless browser does not support touch events, so need to fake it\n      // to test that touch events are add/removed properly.\n      document.documentElement.ontouchstart = noop\n\n      const carousel = new Carousel(carouselEl)\n      const swipeHelperSpy = spyOn(carousel._swipeHelper, 'dispose').and.callThrough()\n\n      const expectedArgs = [\n        ['keydown', jasmine.any(Function), jasmine.any(Boolean)],\n        ['mouseover', jasmine.any(Function), jasmine.any(Boolean)],\n        ['mouseout', jasmine.any(Function), jasmine.any(Boolean)],\n        ...(carousel._swipeHelper._supportPointerEvents ?\n          [\n            ['pointerdown', jasmine.any(Function), jasmine.any(Boolean)],\n            ['pointerup', jasmine.any(Function), jasmine.any(Boolean)]\n          ] :\n          [\n            ['touchstart', jasmine.any(Function), jasmine.any(Boolean)],\n            ['touchmove', jasmine.any(Function), jasmine.any(Boolean)],\n            ['touchend', jasmine.any(Function), jasmine.any(Boolean)]\n          ])\n      ]\n\n      expect(addEventSpy.calls.allArgs()).toEqual(expectedArgs)\n\n      carousel.dispose()\n\n      expect(carousel._swipeHelper).toBeNull()\n      expect(removeEventSpy).toHaveBeenCalledWith(carouselEl, Carousel.EVENT_KEY)\n      expect(swipeHelperSpy).toHaveBeenCalled()\n\n      delete document.documentElement.ontouchstart\n    })\n  })\n\n  describe('getInstance', () => {\n    it('should return carousel instance', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n      const carousel = new Carousel(div)\n\n      expect(Carousel.getInstance(div)).toEqual(carousel)\n      expect(Carousel.getInstance(div)).toBeInstanceOf(Carousel)\n    })\n\n    it('should return null when there is no carousel instance', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n\n      expect(Carousel.getInstance(div)).toBeNull()\n    })\n  })\n\n  describe('getOrCreateInstance', () => {\n    it('should return carousel instance', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n      const carousel = new Carousel(div)\n\n      expect(Carousel.getOrCreateInstance(div)).toEqual(carousel)\n      expect(Carousel.getInstance(div)).toEqual(Carousel.getOrCreateInstance(div, {}))\n      expect(Carousel.getOrCreateInstance(div)).toBeInstanceOf(Carousel)\n    })\n\n    it('should return new instance when there is no carousel instance', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n\n      expect(Carousel.getInstance(div)).toBeNull()\n      expect(Carousel.getOrCreateInstance(div)).toBeInstanceOf(Carousel)\n    })\n\n    it('should return new instance when there is no carousel instance with given configuration', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n\n      expect(Carousel.getInstance(div)).toBeNull()\n      const carousel = Carousel.getOrCreateInstance(div, {\n        interval: 1\n      })\n      expect(carousel).toBeInstanceOf(Carousel)\n\n      expect(carousel._config.interval).toEqual(1)\n    })\n\n    it('should return the instance when exists without given configuration', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n      const carousel = new Carousel(div, {\n        interval: 1\n      })\n      expect(Carousel.getInstance(div)).toEqual(carousel)\n\n      const carousel2 = Carousel.getOrCreateInstance(div, {\n        interval: 2\n      })\n      expect(carousel).toBeInstanceOf(Carousel)\n      expect(carousel2).toEqual(carousel)\n\n      expect(carousel2._config.interval).toEqual(1)\n    })\n  })\n\n  describe('jQueryInterface', () => {\n    it('should create a carousel', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n\n      jQueryMock.fn.carousel = Carousel.jQueryInterface\n      jQueryMock.elements = [div]\n\n      jQueryMock.fn.carousel.call(jQueryMock)\n\n      expect(Carousel.getInstance(div)).not.toBeNull()\n    })\n\n    it('should not re create a carousel', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n      const carousel = new Carousel(div)\n\n      jQueryMock.fn.carousel = Carousel.jQueryInterface\n      jQueryMock.elements = [div]\n\n      jQueryMock.fn.carousel.call(jQueryMock)\n\n      expect(Carousel.getInstance(div)).toEqual(carousel)\n    })\n\n    it('should call to if the config is a number', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n      const carousel = new Carousel(div)\n      const slideTo = 2\n\n      const spy = spyOn(carousel, 'to')\n\n      jQueryMock.fn.carousel = Carousel.jQueryInterface\n      jQueryMock.elements = [div]\n\n      jQueryMock.fn.carousel.call(jQueryMock, slideTo)\n\n      expect(spy).toHaveBeenCalledWith(slideTo)\n    })\n\n    it('should throw error on undefined method', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n      const action = 'undefinedMethod'\n\n      jQueryMock.fn.carousel = Carousel.jQueryInterface\n      jQueryMock.elements = [div]\n\n      expect(() => {\n        jQueryMock.fn.carousel.call(jQueryMock, action)\n      }).toThrowError(TypeError, `No method named \"${action}\"`)\n    })\n  })\n\n  describe('data-api', () => {\n    it('should init carousels with data-bs-ride=\"carousel\" on load', () => {\n      fixtureEl.innerHTML = '<div data-bs-ride=\"carousel\"></div>'\n\n      const carouselEl = fixtureEl.querySelector('div')\n      const loadEvent = createEvent('load')\n\n      window.dispatchEvent(loadEvent)\n      const carousel = Carousel.getInstance(carouselEl)\n      expect(carousel._interval).not.toBeNull()\n    })\n\n    it('should create carousel and go to the next slide on click (with real button controls)', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div id=\"myCarousel\" class=\"carousel slide\">',\n          '  <div class=\"carousel-inner\">',\n          '    <div class=\"carousel-item active\">item 1</div>',\n          '    <div id=\"item2\" class=\"carousel-item\">item 2</div>',\n          '    <div class=\"carousel-item\">item 3</div>',\n          '  </div>',\n          '  <button class=\"carousel-control-prev\" data-bs-target=\"#myCarousel\" type=\"button\" data-bs-slide=\"prev\"></button>',\n          '  <button id=\"next\" class=\"carousel-control-next\" data-bs-target=\"#myCarousel\" type=\"button\" data-bs-slide=\"next\"></button>',\n          '</div>'\n        ].join('')\n\n        const next = fixtureEl.querySelector('#next')\n        const item2 = fixtureEl.querySelector('#item2')\n\n        next.click()\n\n        setTimeout(() => {\n          expect(item2).toHaveClass('active')\n          resolve()\n        }, 10)\n      })\n    })\n\n    it('should create carousel and go to the next slide on click (using links as controls)', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div id=\"myCarousel\" class=\"carousel slide\">',\n          '  <div class=\"carousel-inner\">',\n          '    <div class=\"carousel-item active\">item 1</div>',\n          '    <div id=\"item2\" class=\"carousel-item\">item 2</div>',\n          '    <div class=\"carousel-item\">item 3</div>',\n          '  </div>',\n          '  <a class=\"carousel-control-prev\" href=\"#myCarousel\" role=\"button\" data-bs-slide=\"prev\"></a>',\n          '  <a id=\"next\" class=\"carousel-control-next\" href=\"#myCarousel\" role=\"button\" data-bs-slide=\"next\"></a>',\n          '</div>'\n        ].join('')\n\n        const next = fixtureEl.querySelector('#next')\n        const item2 = fixtureEl.querySelector('#item2')\n\n        next.click()\n\n        setTimeout(() => {\n          expect(item2).toHaveClass('active')\n          resolve()\n        }, 10)\n      })\n    })\n\n    it('should create carousel and go to the next slide on click with data-bs-slide-to', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div id=\"myCarousel\" class=\"carousel slide\" data-bs-ride=\"true\">',\n          '  <div class=\"carousel-inner\">',\n          '    <div class=\"carousel-item active\">item 1</div>',\n          '    <div id=\"item2\" class=\"carousel-item\">item 2</div>',\n          '    <div class=\"carousel-item\">item 3</div>',\n          '  </div>',\n          '  <div id=\"next\" data-bs-target=\"#myCarousel\" data-bs-slide-to=\"1\"></div>',\n          '</div>'\n        ].join('')\n\n        const next = fixtureEl.querySelector('#next')\n        const item2 = fixtureEl.querySelector('#item2')\n\n        next.click()\n\n        setTimeout(() => {\n          expect(item2).toHaveClass('active')\n          expect(Carousel.getInstance('#myCarousel')._interval).not.toBeNull()\n          resolve()\n        }, 10)\n      })\n    })\n\n    it('should do nothing if no selector on click on arrows', () => {\n      fixtureEl.innerHTML = [\n        '<div id=\"myCarousel\" class=\"carousel slide\">',\n        '  <div class=\"carousel-inner\">',\n        '    <div class=\"carousel-item active\">item 1</div>',\n        '    <div class=\"carousel-item\">item 2</div>',\n        '    <div class=\"carousel-item\">item 3</div>',\n        '  </div>',\n        '  <button class=\"carousel-control-prev\" data-bs-target=\"#myCarousel\" type=\"button\" data-bs-slide=\"prev\"></button>',\n        '  <button id=\"next\" class=\"carousel-control-next\" type=\"button\" data-bs-slide=\"next\"></button>',\n        '</div>'\n      ].join('')\n\n      const next = fixtureEl.querySelector('#next')\n\n      next.click()\n\n      expect().nothing()\n    })\n\n    it('should do nothing if no carousel class on click on arrows', () => {\n      fixtureEl.innerHTML = [\n        '<div id=\"myCarousel\" class=\"slide\">',\n        '  <div class=\"carousel-inner\">',\n        '    <div class=\"carousel-item active\">item 1</div>',\n        '    <div id=\"item2\" class=\"carousel-item\">item 2</div>',\n        '    <div class=\"carousel-item\">item 3</div>',\n        '  </div>',\n        '  <button class=\"carousel-control-prev\" data-bs-target=\"#myCarousel\" type=\"button\" data-bs-slide=\"prev\"></button>',\n        '  <button id=\"next\" class=\"carousel-control-next\" data-bs-target=\"#myCarousel\" type=\"button\" data-bs-slide=\"next\"></button>',\n        '</div>'\n      ].join('')\n\n      const next = fixtureEl.querySelector('#next')\n\n      next.click()\n\n      expect().nothing()\n    })\n  })\n})\n"
  },
  {
    "path": "js/tests/unit/collapse.spec.js",
    "content": "import Collapse from '../../src/collapse.js'\nimport EventHandler from '../../src/dom/event-handler.js'\nimport { clearFixture, getFixture, jQueryMock } from '../helpers/fixture.js'\n\ndescribe('Collapse', () => {\n  let fixtureEl\n\n  beforeAll(() => {\n    fixtureEl = getFixture()\n  })\n\n  afterEach(() => {\n    clearFixture()\n  })\n\n  describe('VERSION', () => {\n    it('should return plugin version', () => {\n      expect(Collapse.VERSION).toEqual(jasmine.any(String))\n    })\n  })\n\n  describe('Default', () => {\n    it('should return plugin default config', () => {\n      expect(Collapse.Default).toEqual(jasmine.any(Object))\n    })\n  })\n\n  describe('DATA_KEY', () => {\n    it('should return plugin data key', () => {\n      expect(Collapse.DATA_KEY).toEqual('bs.collapse')\n    })\n  })\n\n  describe('constructor', () => {\n    it('should take care of element either passed as a CSS selector or DOM element', () => {\n      fixtureEl.innerHTML = '<div class=\"my-collapse\"></div>'\n\n      const collapseEl = fixtureEl.querySelector('div.my-collapse')\n      const collapseBySelector = new Collapse('div.my-collapse')\n      const collapseByElement = new Collapse(collapseEl)\n\n      expect(collapseBySelector._element).toEqual(collapseEl)\n      expect(collapseByElement._element).toEqual(collapseEl)\n    })\n\n    it('should allow jquery object in parent config', () => {\n      fixtureEl.innerHTML = [\n        '<div class=\"my-collapse\">',\n        '  <div class=\"item\">',\n        '    <a data-bs-toggle=\"collapse\" href=\"#\">Toggle item</a>',\n        '    <div class=\"collapse\">Lorem ipsum</div>',\n        '  </div>',\n        '</div>'\n      ].join('')\n\n      const collapseEl = fixtureEl.querySelector('div.collapse')\n      const myCollapseEl = fixtureEl.querySelector('.my-collapse')\n      const fakejQueryObject = {\n        0: myCollapseEl,\n        jquery: 'foo'\n      }\n      const collapse = new Collapse(collapseEl, {\n        parent: fakejQueryObject\n      })\n\n      expect(collapse._config.parent).toEqual(myCollapseEl)\n    })\n\n    it('should allow non jquery object in parent config', () => {\n      fixtureEl.innerHTML = [\n        '<div class=\"my-collapse\">',\n        '  <div class=\"item\">',\n        '    <a data-bs-toggle=\"collapse\" href=\"#\">Toggle item</a>',\n        '    <div class=\"collapse\">Lorem ipsum</div>',\n        '  </div>',\n        '</div>'\n      ].join('')\n\n      const collapseEl = fixtureEl.querySelector('div.collapse')\n      const myCollapseEl = fixtureEl.querySelector('.my-collapse')\n      const collapse = new Collapse(collapseEl, {\n        parent: myCollapseEl\n      })\n\n      expect(collapse._config.parent).toEqual(myCollapseEl)\n    })\n\n    it('should allow string selector in parent config', () => {\n      fixtureEl.innerHTML = [\n        '<div class=\"my-collapse\">',\n        '  <div class=\"item\">',\n        '    <a data-bs-toggle=\"collapse\" href=\"#\">Toggle item</a>',\n        '    <div class=\"collapse\">Lorem ipsum</div>',\n        '  </div>',\n        '</div>'\n      ].join('')\n\n      const collapseEl = fixtureEl.querySelector('div.collapse')\n      const myCollapseEl = fixtureEl.querySelector('.my-collapse')\n      const collapse = new Collapse(collapseEl, {\n        parent: 'div.my-collapse'\n      })\n\n      expect(collapse._config.parent).toEqual(myCollapseEl)\n    })\n  })\n\n  describe('toggle', () => {\n    it('should call show method if show class is not present', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const collapseEl = fixtureEl.querySelector('div')\n      const collapse = new Collapse(collapseEl)\n\n      const spy = spyOn(collapse, 'show')\n\n      collapse.toggle()\n\n      expect(spy).toHaveBeenCalled()\n    })\n\n    it('should call hide method if show class is present', () => {\n      fixtureEl.innerHTML = '<div class=\"show\"></div>'\n\n      const collapseEl = fixtureEl.querySelector('.show')\n      const collapse = new Collapse(collapseEl, {\n        toggle: false\n      })\n\n      const spy = spyOn(collapse, 'hide')\n\n      collapse.toggle()\n\n      expect(spy).toHaveBeenCalled()\n    })\n\n    it('should find collapse children if they have collapse class too not only data-bs-parent', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div class=\"my-collapse\">',\n          '  <div class=\"item\">',\n          '    <a data-bs-toggle=\"collapse\" href=\"#\">Toggle item 1</a>',\n          '    <div id=\"collapse1\" class=\"collapse show\">Lorem ipsum 1</div>',\n          '  </div>',\n          '  <div class=\"item\">',\n          '    <a id=\"triggerCollapse2\" data-bs-toggle=\"collapse\" href=\"#\">Toggle item 2</a>',\n          '    <div id=\"collapse2\" class=\"collapse\">Lorem ipsum 2</div>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const parent = fixtureEl.querySelector('.my-collapse')\n        const collapseEl1 = fixtureEl.querySelector('#collapse1')\n        const collapseEl2 = fixtureEl.querySelector('#collapse2')\n\n        const collapseList = [].concat(...fixtureEl.querySelectorAll('.collapse'))\n          .map(el => new Collapse(el, {\n            parent,\n            toggle: false\n          }))\n\n        collapseEl2.addEventListener('shown.bs.collapse', () => {\n          expect(collapseEl2).toHaveClass('show')\n          expect(collapseEl1).not.toHaveClass('show')\n          resolve()\n        })\n\n        collapseList[1].toggle()\n      })\n    })\n  })\n\n  describe('show', () => {\n    it('should do nothing if is transitioning', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const spy = spyOn(EventHandler, 'trigger')\n\n      const collapseEl = fixtureEl.querySelector('div')\n      const collapse = new Collapse(collapseEl, {\n        toggle: false\n      })\n\n      collapse._isTransitioning = true\n      collapse.show()\n\n      expect(spy).not.toHaveBeenCalled()\n    })\n\n    it('should do nothing if already shown', () => {\n      fixtureEl.innerHTML = '<div class=\"show\"></div>'\n\n      const spy = spyOn(EventHandler, 'trigger')\n\n      const collapseEl = fixtureEl.querySelector('div')\n      const collapse = new Collapse(collapseEl, {\n        toggle: false\n      })\n\n      collapse.show()\n\n      expect(spy).not.toHaveBeenCalled()\n    })\n\n    it('should show a collapsed element', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<div class=\"collapse\" style=\"height: 0px;\"></div>'\n\n        const collapseEl = fixtureEl.querySelector('div')\n        const collapse = new Collapse(collapseEl, {\n          toggle: false\n        })\n\n        collapseEl.addEventListener('show.bs.collapse', () => {\n          expect(collapseEl.style.height).toEqual('0px')\n        })\n        collapseEl.addEventListener('shown.bs.collapse', () => {\n          expect(collapseEl).toHaveClass('show')\n          expect(collapseEl.style.height).toEqual('')\n          resolve()\n        })\n\n        collapse.show()\n      })\n    })\n\n    it('should show a collapsed element on width', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<div class=\"collapse collapse-horizontal\" style=\"width: 0px;\"></div>'\n\n        const collapseEl = fixtureEl.querySelector('div')\n        const collapse = new Collapse(collapseEl, {\n          toggle: false\n        })\n\n        collapseEl.addEventListener('show.bs.collapse', () => {\n          expect(collapseEl.style.width).toEqual('0px')\n        })\n        collapseEl.addEventListener('shown.bs.collapse', () => {\n          expect(collapseEl).toHaveClass('show')\n          expect(collapseEl.style.width).toEqual('')\n          resolve()\n        })\n\n        collapse.show()\n      })\n    })\n\n    it('should collapse only the first collapse', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div class=\"card\" id=\"accordion1\">',\n          '  <div id=\"collapse1\" class=\"collapse\"></div>',\n          '</div>',\n          '<div class=\"card\" id=\"accordion2\">',\n          '  <div id=\"collapse2\" class=\"collapse show\"></div>',\n          '</div>'\n        ].join('')\n\n        const el1 = fixtureEl.querySelector('#collapse1')\n        const el2 = fixtureEl.querySelector('#collapse2')\n        const collapse = new Collapse(el1, {\n          toggle: false\n        })\n\n        el1.addEventListener('shown.bs.collapse', () => {\n          expect(el1).toHaveClass('show')\n          expect(el2).toHaveClass('show')\n          resolve()\n        })\n\n        collapse.show()\n      })\n    })\n\n    it('should be able to handle toggling of other children siblings', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div id=\"parentGroup\" class=\"accordion\">',\n          '  <div class=\"accordion-header\">',\n          '    <button data-bs-target=\"#parentContent\" data-bs-toggle=\"collapse\" class=\"accordion-toggle\">Parent</button>',\n          '  </div>',\n          '  <div id=\"parentContent\" class=\"accordion-collapse collapse\" data-bs-parent=\"#parentGroup\">',\n          '    <div class=\"accordion-body\">',\n          '      <div id=\"childGroup\" class=\"accordion\">',\n          '        <div class=\"accordion-item\">',\n          '          <div class=\"accordion-header\">',\n          '            <button data-bs-target=\"#childContent1\" data-bs-toggle=\"collapse\" class=\"accordion-toggle\">Child 1</button>',\n          '          </div>',\n          '          <div id=\"childContent1\" class=\"accordion-collapse collapse\" data-bs-parent=\"#childGroup\">',\n          '            <div>content</div>',\n          '          </div>',\n          '        </div>',\n          '        <div class=\"accordion-item\">',\n          '          <div class=\"accordion-header\">',\n          '            <button data-bs-target=\"#childContent2\" data-bs-toggle=\"collapse\" class=\"accordion-toggle\">Child 2</button>',\n          '          </div>',\n          '          <div id=\"childContent2\" class=\"accordion-collapse collapse\" data-bs-parent=\"#childGroup\">',\n          '            <div>content</div>',\n          '          </div>',\n          '        </div>',\n          '      </div>',\n          '    </div>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const el = selector => fixtureEl.querySelector(selector)\n\n        const parentBtn = el('[data-bs-target=\"#parentContent\"]')\n        const childBtn1 = el('[data-bs-target=\"#childContent1\"]')\n        const childBtn2 = el('[data-bs-target=\"#childContent2\"]')\n\n        const parentCollapseEl = el('#parentContent')\n        const childCollapseEl1 = el('#childContent1')\n        const childCollapseEl2 = el('#childContent2')\n\n        parentCollapseEl.addEventListener('shown.bs.collapse', () => {\n          expect(parentCollapseEl).toHaveClass('show')\n          childBtn1.click()\n        })\n        childCollapseEl1.addEventListener('shown.bs.collapse', () => {\n          expect(childCollapseEl1).toHaveClass('show')\n          childBtn2.click()\n        })\n        childCollapseEl2.addEventListener('shown.bs.collapse', () => {\n          expect(childCollapseEl2).toHaveClass('show')\n          expect(childCollapseEl1).not.toHaveClass('show')\n          resolve()\n        })\n\n        parentBtn.click()\n      })\n    })\n\n    it('should not change tab tabpanels descendants on accordion', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div class=\"accordion\" id=\"accordionExample\">',\n          '  <div class=\"accordion-item\">',\n          '    <h2 class=\"accordion-header\">',\n          '      <button class=\"accordion-button\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#collapseOne\" aria-expanded=\"true\" aria-controls=\"collapseOne\">',\n          '        Accordion Item #1',\n          '      </button>',\n          '    </h2>',\n          '    <div id=\"collapseOne\" class=\"accordion-collapse collapse show\" data-bs-parent=\"#accordionExample\">',\n          '      <div class=\"accordion-body\">',\n          '        <nav>',\n          '          <div class=\"nav nav-tabs\" id=\"nav-tab\" role=\"tablist\">',\n          '            <button class=\"nav-link active\" id=\"nav-home-tab\" data-bs-toggle=\"tab\" data-bs-target=\"#nav-home\" type=\"button\" role=\"tab\" aria-controls=\"nav-home\" aria-selected=\"true\">Home</button>',\n          '            <button class=\"nav-link\" id=\"nav-profile-tab\" data-bs-toggle=\"tab\" data-bs-target=\"#nav-profile\" type=\"button\" role=\"tab\" aria-controls=\"nav-profile\" aria-selected=\"false\">Profile</button>',\n          '          </div>',\n          '        </nav>',\n          '        <div class=\"tab-content\" id=\"nav-tabContent\">',\n          '          <div class=\"tab-pane fade show active\" id=\"nav-home\" role=\"tabpanel\" aria-labelledby=\"nav-home-tab\">Home</div>',\n          '          <div class=\"tab-pane fade\" id=\"nav-profile\" role=\"tabpanel\" aria-labelledby=\"nav-profile-tab\">Profile</div>',\n          '        </div>',\n          '      </div>',\n          '    </div>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const el = fixtureEl.querySelector('#collapseOne')\n        const activeTabPane = fixtureEl.querySelector('#nav-home')\n        const collapse = new Collapse(el)\n        let times = 1\n\n        el.addEventListener('hidden.bs.collapse', () => {\n          collapse.show()\n        })\n\n        el.addEventListener('shown.bs.collapse', () => {\n          expect(activeTabPane).toHaveClass('show')\n          times++\n          if (times === 2) {\n            resolve()\n          }\n\n          collapse.hide()\n        })\n\n        collapse.show()\n      })\n    })\n\n    it('should not fire shown when show is prevented', () => {\n      return new Promise((resolve, reject) => {\n        fixtureEl.innerHTML = '<div class=\"collapse\"></div>'\n\n        const collapseEl = fixtureEl.querySelector('div')\n        const collapse = new Collapse(collapseEl, {\n          toggle: false\n        })\n\n        const expectEnd = () => {\n          setTimeout(() => {\n            expect().nothing()\n            resolve()\n          }, 10)\n        }\n\n        collapseEl.addEventListener('show.bs.collapse', event => {\n          event.preventDefault()\n          expectEnd()\n        })\n\n        collapseEl.addEventListener('shown.bs.collapse', () => {\n          reject(new Error('should not fire shown event'))\n        })\n\n        collapse.show()\n      })\n    })\n  })\n\n  describe('hide', () => {\n    it('should do nothing if is transitioning', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const spy = spyOn(EventHandler, 'trigger')\n\n      const collapseEl = fixtureEl.querySelector('div')\n      const collapse = new Collapse(collapseEl, {\n        toggle: false\n      })\n\n      collapse._isTransitioning = true\n      collapse.hide()\n\n      expect(spy).not.toHaveBeenCalled()\n    })\n\n    it('should do nothing if already shown', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const spy = spyOn(EventHandler, 'trigger')\n\n      const collapseEl = fixtureEl.querySelector('div')\n      const collapse = new Collapse(collapseEl, {\n        toggle: false\n      })\n\n      collapse.hide()\n\n      expect(spy).not.toHaveBeenCalled()\n    })\n\n    it('should hide a collapsed element', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<div class=\"collapse show\"></div>'\n\n        const collapseEl = fixtureEl.querySelector('div')\n        const collapse = new Collapse(collapseEl, {\n          toggle: false\n        })\n\n        collapseEl.addEventListener('hidden.bs.collapse', () => {\n          expect(collapseEl).not.toHaveClass('show')\n          expect(collapseEl.style.height).toEqual('')\n          resolve()\n        })\n\n        collapse.hide()\n      })\n    })\n\n    it('should not fire hidden when hide is prevented', () => {\n      return new Promise((resolve, reject) => {\n        fixtureEl.innerHTML = '<div class=\"collapse show\"></div>'\n\n        const collapseEl = fixtureEl.querySelector('div')\n        const collapse = new Collapse(collapseEl, {\n          toggle: false\n        })\n\n        const expectEnd = () => {\n          setTimeout(() => {\n            expect().nothing()\n            resolve()\n          }, 10)\n        }\n\n        collapseEl.addEventListener('hide.bs.collapse', event => {\n          event.preventDefault()\n          expectEnd()\n        })\n\n        collapseEl.addEventListener('hidden.bs.collapse', () => {\n          reject(new Error('should not fire hidden event'))\n        })\n\n        collapse.hide()\n      })\n    })\n  })\n\n  describe('dispose', () => {\n    it('should destroy a collapse', () => {\n      fixtureEl.innerHTML = '<div class=\"collapse show\"></div>'\n\n      const collapseEl = fixtureEl.querySelector('div')\n      const collapse = new Collapse(collapseEl, {\n        toggle: false\n      })\n\n      expect(Collapse.getInstance(collapseEl)).toEqual(collapse)\n\n      collapse.dispose()\n\n      expect(Collapse.getInstance(collapseEl)).toBeNull()\n    })\n  })\n\n  describe('data-api', () => {\n    it('should prevent url change if click on nested elements', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<a role=\"button\" data-bs-toggle=\"collapse\" class=\"collapsed\" href=\"#collapse\">',\n          '  <span id=\"nested\"></span>',\n          '</a>',\n          '<div id=\"collapse\" class=\"collapse\"></div>'\n        ].join('')\n\n        const triggerEl = fixtureEl.querySelector('a')\n        const nestedTriggerEl = fixtureEl.querySelector('#nested')\n\n        const spy = spyOn(Event.prototype, 'preventDefault').and.callThrough()\n\n        triggerEl.addEventListener('click', event => {\n          expect(event.target.isEqualNode(nestedTriggerEl)).toBeTrue()\n          expect(event.delegateTarget.isEqualNode(triggerEl)).toBeTrue()\n          expect(spy).toHaveBeenCalled()\n          resolve()\n        })\n\n        nestedTriggerEl.click()\n      })\n    })\n\n    it('should show multiple collapsed elements', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<a role=\"button\" data-bs-toggle=\"collapse\" class=\"collapsed\" href=\".multi\"></a>',\n          '<div id=\"collapse1\" class=\"collapse multi\"></div>',\n          '<div id=\"collapse2\" class=\"collapse multi\"></div>'\n        ].join('')\n\n        const trigger = fixtureEl.querySelector('a')\n        const collapse1 = fixtureEl.querySelector('#collapse1')\n        const collapse2 = fixtureEl.querySelector('#collapse2')\n\n        collapse2.addEventListener('shown.bs.collapse', () => {\n          expect(trigger.getAttribute('aria-expanded')).toEqual('true')\n          expect(trigger).not.toHaveClass('collapsed')\n          expect(collapse1).toHaveClass('show')\n          expect(collapse1).toHaveClass('show')\n          resolve()\n        })\n\n        trigger.click()\n      })\n    })\n\n    it('should hide multiple collapsed elements', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<a role=\"button\" data-bs-toggle=\"collapse\" href=\".multi\"></a>',\n          '<div id=\"collapse1\" class=\"collapse multi show\"></div>',\n          '<div id=\"collapse2\" class=\"collapse multi show\"></div>'\n        ].join('')\n\n        const trigger = fixtureEl.querySelector('a')\n        const collapse1 = fixtureEl.querySelector('#collapse1')\n        const collapse2 = fixtureEl.querySelector('#collapse2')\n\n        collapse2.addEventListener('hidden.bs.collapse', () => {\n          expect(trigger.getAttribute('aria-expanded')).toEqual('false')\n          expect(trigger).toHaveClass('collapsed')\n          expect(collapse1).not.toHaveClass('show')\n          expect(collapse1).not.toHaveClass('show')\n          resolve()\n        })\n\n        trigger.click()\n      })\n    })\n\n    it('should remove \"collapsed\" class from target when collapse is shown', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<a id=\"link1\" role=\"button\" data-bs-toggle=\"collapse\" class=\"collapsed\" href=\"#\" data-bs-target=\"#test1\"></a>',\n          '<a id=\"link2\" role=\"button\" data-bs-toggle=\"collapse\" class=\"collapsed\" href=\"#\" data-bs-target=\"#test1\"></a>',\n          '<div id=\"test1\"></div>'\n        ].join('')\n\n        const link1 = fixtureEl.querySelector('#link1')\n        const link2 = fixtureEl.querySelector('#link2')\n        const collapseTest1 = fixtureEl.querySelector('#test1')\n\n        collapseTest1.addEventListener('shown.bs.collapse', () => {\n          expect(link1.getAttribute('aria-expanded')).toEqual('true')\n          expect(link2.getAttribute('aria-expanded')).toEqual('true')\n          expect(link1).not.toHaveClass('collapsed')\n          expect(link2).not.toHaveClass('collapsed')\n          resolve()\n        })\n\n        link1.click()\n      })\n    })\n\n    it('should add \"collapsed\" class to target when collapse is hidden', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<a id=\"link1\" role=\"button\" data-bs-toggle=\"collapse\" href=\"#\" data-bs-target=\"#test1\"></a>',\n          '<a id=\"link2\" role=\"button\" data-bs-toggle=\"collapse\" href=\"#\" data-bs-target=\"#test1\"></a>',\n          '<div id=\"test1\" class=\"show\"></div>'\n        ].join('')\n\n        const link1 = fixtureEl.querySelector('#link1')\n        const link2 = fixtureEl.querySelector('#link2')\n        const collapseTest1 = fixtureEl.querySelector('#test1')\n\n        collapseTest1.addEventListener('hidden.bs.collapse', () => {\n          expect(link1.getAttribute('aria-expanded')).toEqual('false')\n          expect(link2.getAttribute('aria-expanded')).toEqual('false')\n          expect(link1).toHaveClass('collapsed')\n          expect(link2).toHaveClass('collapsed')\n          resolve()\n        })\n\n        link1.click()\n      })\n    })\n\n    it('should allow accordion to use children other than card', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div id=\"accordion\">',\n          '  <div class=\"item\">',\n          '    <a id=\"linkTrigger\" data-bs-toggle=\"collapse\" href=\"#collapseOne\" aria-expanded=\"false\" aria-controls=\"collapseOne\"></a>',\n          '    <div id=\"collapseOne\" class=\"collapse\" role=\"tabpanel\" data-bs-parent=\"#accordion\"></div>',\n          '  </div>',\n          '  <div class=\"item\">',\n          '    <a id=\"linkTriggerTwo\" data-bs-toggle=\"collapse\" href=\"#collapseTwo\" aria-expanded=\"false\" aria-controls=\"collapseTwo\"></a>',\n          '    <div id=\"collapseTwo\" class=\"collapse show\" role=\"tabpanel\" data-bs-parent=\"#accordion\"></div>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const trigger = fixtureEl.querySelector('#linkTrigger')\n        const triggerTwo = fixtureEl.querySelector('#linkTriggerTwo')\n        const collapseOne = fixtureEl.querySelector('#collapseOne')\n        const collapseTwo = fixtureEl.querySelector('#collapseTwo')\n\n        collapseOne.addEventListener('shown.bs.collapse', () => {\n          expect(collapseOne).toHaveClass('show')\n          expect(collapseTwo).not.toHaveClass('show')\n\n          collapseTwo.addEventListener('shown.bs.collapse', () => {\n            expect(collapseOne).not.toHaveClass('show')\n            expect(collapseTwo).toHaveClass('show')\n            resolve()\n          })\n\n          triggerTwo.click()\n        })\n\n        trigger.click()\n      })\n    })\n\n    it('should not prevent event for input', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<input type=\"checkbox\" data-bs-toggle=\"collapse\" data-bs-target=\"#collapsediv1\">',\n          '<div id=\"collapsediv1\"></div>'\n        ].join('')\n\n        const target = fixtureEl.querySelector('input')\n        const collapseEl = fixtureEl.querySelector('#collapsediv1')\n\n        collapseEl.addEventListener('shown.bs.collapse', () => {\n          expect(collapseEl).toHaveClass('show')\n          expect(target.checked).toBeTrue()\n          resolve()\n        })\n\n        target.click()\n      })\n    })\n\n    it('should allow accordion to contain nested elements', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div id=\"accordion\">',\n          '  <div class=\"row\">',\n          '    <div class=\"col-lg-6\">',\n          '      <div class=\"item\">',\n          '        <a id=\"linkTrigger\" data-bs-toggle=\"collapse\" href=\"#collapseOne\" aria-expanded=\"false\" aria-controls=\"collapseOne\"></a>',\n          '        <div id=\"collapseOne\" class=\"collapse\" role=\"tabpanel\" data-bs-parent=\"#accordion\"></div>',\n          '      </div>',\n          '    </div>',\n          '    <div class=\"col-lg-6\">',\n          '      <div class=\"item\">',\n          '        <a id=\"linkTriggerTwo\" data-bs-toggle=\"collapse\" href=\"#collapseTwo\" aria-expanded=\"false\" aria-controls=\"collapseTwo\"></a>',\n          '        <div id=\"collapseTwo\" class=\"collapse show\" role=\"tabpanel\" data-bs-parent=\"#accordion\"></div>',\n          '      </div>',\n          '    </div>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const triggerEl = fixtureEl.querySelector('#linkTrigger')\n        const triggerTwoEl = fixtureEl.querySelector('#linkTriggerTwo')\n        const collapseOneEl = fixtureEl.querySelector('#collapseOne')\n        const collapseTwoEl = fixtureEl.querySelector('#collapseTwo')\n\n        collapseOneEl.addEventListener('shown.bs.collapse', () => {\n          expect(collapseOneEl).toHaveClass('show')\n          expect(triggerEl).not.toHaveClass('collapsed')\n          expect(triggerEl.getAttribute('aria-expanded')).toEqual('true')\n\n          expect(collapseTwoEl).not.toHaveClass('show')\n          expect(triggerTwoEl).toHaveClass('collapsed')\n          expect(triggerTwoEl.getAttribute('aria-expanded')).toEqual('false')\n\n          collapseTwoEl.addEventListener('shown.bs.collapse', () => {\n            expect(collapseOneEl).not.toHaveClass('show')\n            expect(triggerEl).toHaveClass('collapsed')\n            expect(triggerEl.getAttribute('aria-expanded')).toEqual('false')\n\n            expect(collapseTwoEl).toHaveClass('show')\n            expect(triggerTwoEl).not.toHaveClass('collapsed')\n            expect(triggerTwoEl.getAttribute('aria-expanded')).toEqual('true')\n            resolve()\n          })\n\n          triggerTwoEl.click()\n        })\n\n        triggerEl.click()\n      })\n    })\n\n    it('should allow accordion to target multiple elements', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div id=\"accordion\">',\n          '  <a id=\"linkTriggerOne\" data-bs-toggle=\"collapse\" data-bs-target=\".collapseOne\" href=\"#\" aria-expanded=\"false\" aria-controls=\"collapseOne\"></a>',\n          '  <a id=\"linkTriggerTwo\" data-bs-toggle=\"collapse\" data-bs-target=\".collapseTwo\" href=\"#\" aria-expanded=\"false\" aria-controls=\"collapseTwo\"></a>',\n          '  <div id=\"collapseOneOne\" class=\"collapse collapseOne\" role=\"tabpanel\" data-bs-parent=\"#accordion\"></div>',\n          '  <div id=\"collapseOneTwo\" class=\"collapse collapseOne\" role=\"tabpanel\" data-bs-parent=\"#accordion\"></div>',\n          '  <div id=\"collapseTwoOne\" class=\"collapse collapseTwo\" role=\"tabpanel\" data-bs-parent=\"#accordion\"></div>',\n          '  <div id=\"collapseTwoTwo\" class=\"collapse collapseTwo\" role=\"tabpanel\" data-bs-parent=\"#accordion\"></div>',\n          '</div>'\n        ].join('')\n\n        const trigger = fixtureEl.querySelector('#linkTriggerOne')\n        const triggerTwo = fixtureEl.querySelector('#linkTriggerTwo')\n        const collapseOneOne = fixtureEl.querySelector('#collapseOneOne')\n        const collapseOneTwo = fixtureEl.querySelector('#collapseOneTwo')\n        const collapseTwoOne = fixtureEl.querySelector('#collapseTwoOne')\n        const collapseTwoTwo = fixtureEl.querySelector('#collapseTwoTwo')\n        const collapsedElements = {\n          one: false,\n          two: false\n        }\n\n        function firstTest() {\n          expect(collapseOneOne).toHaveClass('show')\n          expect(collapseOneTwo).toHaveClass('show')\n\n          expect(collapseTwoOne).not.toHaveClass('show')\n          expect(collapseTwoTwo).not.toHaveClass('show')\n\n          triggerTwo.click()\n        }\n\n        function secondTest() {\n          expect(collapseOneOne).not.toHaveClass('show')\n          expect(collapseOneTwo).not.toHaveClass('show')\n\n          expect(collapseTwoOne).toHaveClass('show')\n          expect(collapseTwoTwo).toHaveClass('show')\n          resolve()\n        }\n\n        collapseOneOne.addEventListener('shown.bs.collapse', () => {\n          if (collapsedElements.one) {\n            firstTest()\n          } else {\n            collapsedElements.one = true\n          }\n        })\n\n        collapseOneTwo.addEventListener('shown.bs.collapse', () => {\n          if (collapsedElements.one) {\n            firstTest()\n          } else {\n            collapsedElements.one = true\n          }\n        })\n\n        collapseTwoOne.addEventListener('shown.bs.collapse', () => {\n          if (collapsedElements.two) {\n            secondTest()\n          } else {\n            collapsedElements.two = true\n          }\n        })\n\n        collapseTwoTwo.addEventListener('shown.bs.collapse', () => {\n          if (collapsedElements.two) {\n            secondTest()\n          } else {\n            collapsedElements.two = true\n          }\n        })\n\n        trigger.click()\n      })\n    })\n\n    it('should collapse accordion children but not nested accordion children', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div id=\"accordion\">',\n          '  <div class=\"item\">',\n          '    <a id=\"linkTrigger\" data-bs-toggle=\"collapse\" href=\"#collapseOne\" aria-expanded=\"false\" aria-controls=\"collapseOne\"></a>',\n          '    <div id=\"collapseOne\" data-bs-parent=\"#accordion\" class=\"collapse\" role=\"tabpanel\">',\n          '      <div id=\"nestedAccordion\">',\n          '        <div class=\"item\">',\n          '          <a id=\"nestedLinkTrigger\" data-bs-toggle=\"collapse\" href=\"#nestedCollapseOne\" aria-expanded=\"false\" aria-controls=\"nestedCollapseOne\"></a>',\n          '          <div id=\"nestedCollapseOne\" data-bs-parent=\"#nestedAccordion\" class=\"collapse\" role=\"tabpanel\"></div>',\n          '        </div>',\n          '      </div>',\n          '    </div>',\n          '  </div>',\n          '  <div class=\"item\">',\n          '    <a id=\"linkTriggerTwo\" data-bs-toggle=\"collapse\" href=\"#collapseTwo\" aria-expanded=\"false\" aria-controls=\"collapseTwo\"></a>',\n          '    <div id=\"collapseTwo\" data-bs-parent=\"#accordion\" class=\"collapse show\" role=\"tabpanel\"></div>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const trigger = fixtureEl.querySelector('#linkTrigger')\n        const triggerTwo = fixtureEl.querySelector('#linkTriggerTwo')\n        const nestedTrigger = fixtureEl.querySelector('#nestedLinkTrigger')\n        const collapseOne = fixtureEl.querySelector('#collapseOne')\n        const collapseTwo = fixtureEl.querySelector('#collapseTwo')\n        const nestedCollapseOne = fixtureEl.querySelector('#nestedCollapseOne')\n\n        function handlerCollapseOne() {\n          expect(collapseOne).toHaveClass('show')\n          expect(collapseTwo).not.toHaveClass('show')\n          expect(nestedCollapseOne).not.toHaveClass('show')\n\n          nestedCollapseOne.addEventListener('shown.bs.collapse', handlerNestedCollapseOne)\n          nestedTrigger.click()\n          collapseOne.removeEventListener('shown.bs.collapse', handlerCollapseOne)\n        }\n\n        function handlerNestedCollapseOne() {\n          expect(collapseOne).toHaveClass('show')\n          expect(collapseTwo).not.toHaveClass('show')\n          expect(nestedCollapseOne).toHaveClass('show')\n\n          collapseTwo.addEventListener('shown.bs.collapse', () => {\n            expect(collapseOne).not.toHaveClass('show')\n            expect(collapseTwo).toHaveClass('show')\n            expect(nestedCollapseOne).toHaveClass('show')\n            resolve()\n          })\n\n          triggerTwo.click()\n          nestedCollapseOne.removeEventListener('shown.bs.collapse', handlerNestedCollapseOne)\n        }\n\n        collapseOne.addEventListener('shown.bs.collapse', handlerCollapseOne)\n        trigger.click()\n      })\n    })\n\n    it('should add \"collapsed\" class and set aria-expanded to triggers only when all the targeted collapse are hidden', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<a id=\"trigger1\" role=\"button\" data-bs-toggle=\"collapse\" href=\"#test1\"></a>',\n          '<a id=\"trigger2\" role=\"button\" data-bs-toggle=\"collapse\" href=\"#0/my/id\"></a>',\n          '<a id=\"trigger3\" role=\"button\" data-bs-toggle=\"collapse\" href=\".multi\"></a>',\n          '<div id=\"test1\" class=\"multi\"></div>',\n          '<div id=\"0/my/id\" class=\"multi\"></div>'\n        ].join('')\n\n        const trigger1 = fixtureEl.querySelector('#trigger1')\n        const trigger2 = fixtureEl.querySelector('#trigger2')\n        const trigger3 = fixtureEl.querySelector('#trigger3')\n        const target1 = fixtureEl.querySelector('#test1')\n        const target2 = fixtureEl.querySelector(`#${CSS.escape('0/my/id')}`)\n\n        const target2Shown = () => {\n          expect(trigger1).not.toHaveClass('collapsed')\n          expect(trigger1.getAttribute('aria-expanded')).toEqual('true')\n\n          expect(trigger2).not.toHaveClass('collapsed')\n          expect(trigger2.getAttribute('aria-expanded')).toEqual('true')\n\n          expect(trigger3).not.toHaveClass('collapsed')\n          expect(trigger3.getAttribute('aria-expanded')).toEqual('true')\n\n          target2.addEventListener('hidden.bs.collapse', () => {\n            expect(trigger1).not.toHaveClass('collapsed')\n            expect(trigger1.getAttribute('aria-expanded')).toEqual('true')\n\n            expect(trigger2).toHaveClass('collapsed')\n            expect(trigger2.getAttribute('aria-expanded')).toEqual('false')\n\n            expect(trigger3).not.toHaveClass('collapsed')\n            expect(trigger3.getAttribute('aria-expanded')).toEqual('true')\n\n            target1.addEventListener('hidden.bs.collapse', () => {\n              expect(trigger1).toHaveClass('collapsed')\n              expect(trigger1.getAttribute('aria-expanded')).toEqual('false')\n\n              expect(trigger2).toHaveClass('collapsed')\n              expect(trigger2.getAttribute('aria-expanded')).toEqual('false')\n\n              expect(trigger3).toHaveClass('collapsed')\n              expect(trigger3.getAttribute('aria-expanded')).toEqual('false')\n              resolve()\n            })\n\n            trigger1.click()\n          })\n\n          trigger2.click()\n        }\n\n        target2.addEventListener('shown.bs.collapse', target2Shown)\n        trigger3.click()\n      })\n    })\n  })\n\n  describe('jQueryInterface', () => {\n    it('should create a collapse', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n\n      jQueryMock.fn.collapse = Collapse.jQueryInterface\n      jQueryMock.elements = [div]\n\n      jQueryMock.fn.collapse.call(jQueryMock)\n\n      expect(Collapse.getInstance(div)).not.toBeNull()\n    })\n\n    it('should not re create a collapse', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n      const collapse = new Collapse(div)\n\n      jQueryMock.fn.collapse = Collapse.jQueryInterface\n      jQueryMock.elements = [div]\n\n      jQueryMock.fn.collapse.call(jQueryMock)\n\n      expect(Collapse.getInstance(div)).toEqual(collapse)\n    })\n\n    it('should throw error on undefined method', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n      const action = 'undefinedMethod'\n\n      jQueryMock.fn.collapse = Collapse.jQueryInterface\n      jQueryMock.elements = [div]\n\n      expect(() => {\n        jQueryMock.fn.collapse.call(jQueryMock, action)\n      }).toThrowError(TypeError, `No method named \"${action}\"`)\n    })\n  })\n\n  describe('getInstance', () => {\n    it('should return collapse instance', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n      const collapse = new Collapse(div)\n\n      expect(Collapse.getInstance(div)).toEqual(collapse)\n      expect(Collapse.getInstance(div)).toBeInstanceOf(Collapse)\n    })\n\n    it('should return null when there is no collapse instance', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n\n      expect(Collapse.getInstance(div)).toBeNull()\n    })\n  })\n\n  describe('getOrCreateInstance', () => {\n    it('should return collapse instance', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n      const collapse = new Collapse(div)\n\n      expect(Collapse.getOrCreateInstance(div)).toEqual(collapse)\n      expect(Collapse.getInstance(div)).toEqual(Collapse.getOrCreateInstance(div, {}))\n      expect(Collapse.getOrCreateInstance(div)).toBeInstanceOf(Collapse)\n    })\n\n    it('should return new instance when there is no collapse instance', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n\n      expect(Collapse.getInstance(div)).toBeNull()\n      expect(Collapse.getOrCreateInstance(div)).toBeInstanceOf(Collapse)\n    })\n\n    it('should return new instance when there is no collapse instance with given configuration', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n\n      expect(Collapse.getInstance(div)).toBeNull()\n      const collapse = Collapse.getOrCreateInstance(div, {\n        toggle: false\n      })\n      expect(collapse).toBeInstanceOf(Collapse)\n\n      expect(collapse._config.toggle).toBeFalse()\n    })\n\n    it('should return the instance when exists without given configuration', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n      const collapse = new Collapse(div, {\n        toggle: false\n      })\n      expect(Collapse.getInstance(div)).toEqual(collapse)\n\n      const collapse2 = Collapse.getOrCreateInstance(div, {\n        toggle: true\n      })\n      expect(collapse).toBeInstanceOf(Collapse)\n      expect(collapse2).toEqual(collapse)\n\n      expect(collapse2._config.toggle).toBeFalse()\n    })\n  })\n})\n"
  },
  {
    "path": "js/tests/unit/dom/data.spec.js",
    "content": "import Data from '../../../src/dom/data.js'\nimport { clearFixture, getFixture } from '../../helpers/fixture.js'\n\ndescribe('Data', () => {\n  const TEST_KEY = 'bs.test'\n  const UNKNOWN_KEY = 'bs.unknown'\n  const TEST_DATA = {\n    test: 'bsData'\n  }\n\n  let fixtureEl\n  let div\n\n  beforeAll(() => {\n    fixtureEl = getFixture()\n  })\n\n  beforeEach(() => {\n    fixtureEl.innerHTML = '<div></div>'\n    div = fixtureEl.querySelector('div')\n  })\n\n  afterEach(() => {\n    Data.remove(div, TEST_KEY)\n    clearFixture()\n  })\n\n  it('should return null for unknown elements', () => {\n    const data = { ...TEST_DATA }\n\n    Data.set(div, TEST_KEY, data)\n\n    expect(Data.get(null)).toBeNull()\n    expect(Data.get(undefined)).toBeNull()\n    expect(Data.get(document.createElement('div'), TEST_KEY)).toBeNull()\n  })\n\n  it('should return null for unknown keys', () => {\n    const data = { ...TEST_DATA }\n\n    Data.set(div, TEST_KEY, data)\n\n    expect(Data.get(div, null)).toBeNull()\n    expect(Data.get(div, undefined)).toBeNull()\n    expect(Data.get(div, UNKNOWN_KEY)).toBeNull()\n  })\n\n  it('should store data for an element with a given key and return it', () => {\n    const data = { ...TEST_DATA }\n\n    Data.set(div, TEST_KEY, data)\n\n    expect(Data.get(div, TEST_KEY)).toEqual(data)\n  })\n\n  it('should overwrite data if something is already stored', () => {\n    const data = { ...TEST_DATA }\n    const copy = { ...data }\n\n    Data.set(div, TEST_KEY, data)\n    Data.set(div, TEST_KEY, copy)\n\n    // Using `toBe` since spread creates a shallow copy\n    expect(Data.get(div, TEST_KEY)).not.toBe(data)\n    expect(Data.get(div, TEST_KEY)).toBe(copy)\n  })\n\n  it('should do nothing when an element has nothing stored', () => {\n    Data.remove(div, TEST_KEY)\n\n    expect().nothing()\n  })\n\n  it('should remove nothing for an unknown key', () => {\n    const data = { ...TEST_DATA }\n\n    Data.set(div, TEST_KEY, data)\n    Data.remove(div, UNKNOWN_KEY)\n\n    expect(Data.get(div, TEST_KEY)).toEqual(data)\n  })\n\n  it('should remove data for a given key', () => {\n    const data = { ...TEST_DATA }\n\n    Data.set(div, TEST_KEY, data)\n    Data.remove(div, TEST_KEY)\n\n    expect(Data.get(div, TEST_KEY)).toBeNull()\n  })\n\n  it('should console.error a message if called with multiple keys', () => {\n    console.error = jasmine.createSpy('console.error')\n\n    const data = { ...TEST_DATA }\n    const copy = { ...data }\n\n    Data.set(div, TEST_KEY, data)\n    Data.set(div, UNKNOWN_KEY, copy)\n\n    expect(console.error).toHaveBeenCalled()\n    expect(Data.get(div, UNKNOWN_KEY)).toBeNull()\n  })\n})\n"
  },
  {
    "path": "js/tests/unit/dom/event-handler.spec.js",
    "content": "import EventHandler from '../../../src/dom/event-handler.js'\nimport { noop } from '../../../src/util/index.js'\nimport { clearFixture, getFixture } from '../../helpers/fixture.js'\n\ndescribe('EventHandler', () => {\n  let fixtureEl\n\n  beforeAll(() => {\n    fixtureEl = getFixture()\n  })\n\n  afterEach(() => {\n    clearFixture()\n  })\n\n  describe('on', () => {\n    it('should not add event listener if the event is not a string', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n\n      EventHandler.on(div, null, noop)\n      EventHandler.on(null, 'click', noop)\n\n      expect().nothing()\n    })\n\n    it('should add event listener', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<div></div>'\n\n        const div = fixtureEl.querySelector('div')\n\n        EventHandler.on(div, 'click', () => {\n          expect().nothing()\n          resolve()\n        })\n\n        div.click()\n      })\n    })\n\n    it('should add namespaced event listener', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<div></div>'\n\n        const div = fixtureEl.querySelector('div')\n\n        EventHandler.on(div, 'bs.namespace', () => {\n          expect().nothing()\n          resolve()\n        })\n\n        EventHandler.trigger(div, 'bs.namespace')\n      })\n    })\n\n    it('should add native namespaced event listener', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<div></div>'\n\n        const div = fixtureEl.querySelector('div')\n\n        EventHandler.on(div, 'click.namespace', () => {\n          expect().nothing()\n          resolve()\n        })\n\n        EventHandler.trigger(div, 'click')\n      })\n    })\n\n    it('should handle event delegation', () => {\n      return new Promise(resolve => {\n        EventHandler.on(document, 'click', '.test', () => {\n          expect().nothing()\n          resolve()\n        })\n\n        fixtureEl.innerHTML = '<div class=\"test\"></div>'\n\n        const div = fixtureEl.querySelector('div')\n\n        div.click()\n      })\n    })\n\n    it('should handle mouseenter/mouseleave like the native counterpart', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div class=\"outer\">',\n          '<div class=\"inner\">',\n          '<div class=\"nested\">',\n          '<div class=\"deep\"></div>',\n          '</div>',\n          '</div>',\n          '<div class=\"sibling\"></div>',\n          '</div>'\n        ].join('')\n\n        const outer = fixtureEl.querySelector('.outer')\n        const inner = fixtureEl.querySelector('.inner')\n        const nested = fixtureEl.querySelector('.nested')\n        const deep = fixtureEl.querySelector('.deep')\n        const sibling = fixtureEl.querySelector('.sibling')\n\n        const enterSpy = jasmine.createSpy('mouseenter')\n        const leaveSpy = jasmine.createSpy('mouseleave')\n        const delegateEnterSpy = jasmine.createSpy('mouseenter')\n        const delegateLeaveSpy = jasmine.createSpy('mouseleave')\n\n        EventHandler.on(inner, 'mouseenter', enterSpy)\n        EventHandler.on(inner, 'mouseleave', leaveSpy)\n        EventHandler.on(outer, 'mouseenter', '.inner', delegateEnterSpy)\n        EventHandler.on(outer, 'mouseleave', '.inner', delegateLeaveSpy)\n\n        EventHandler.on(sibling, 'mouseenter', () => {\n          expect(enterSpy.calls.count()).toEqual(2)\n          expect(leaveSpy.calls.count()).toEqual(2)\n          expect(delegateEnterSpy.calls.count()).toEqual(2)\n          expect(delegateLeaveSpy.calls.count()).toEqual(2)\n          resolve()\n        })\n\n        const moveMouse = (from, to) => {\n          from.dispatchEvent(new MouseEvent('mouseout', {\n            bubbles: true,\n            relatedTarget: to\n          }))\n\n          to.dispatchEvent(new MouseEvent('mouseover', {\n            bubbles: true,\n            relatedTarget: from\n          }))\n        }\n\n        // from outer to deep and back to outer (nested)\n        moveMouse(outer, inner)\n        moveMouse(inner, nested)\n        moveMouse(nested, deep)\n        moveMouse(deep, nested)\n        moveMouse(nested, inner)\n        moveMouse(inner, outer)\n\n        setTimeout(() => {\n          expect(enterSpy.calls.count()).toEqual(1)\n          expect(leaveSpy.calls.count()).toEqual(1)\n          expect(delegateEnterSpy.calls.count()).toEqual(1)\n          expect(delegateLeaveSpy.calls.count()).toEqual(1)\n\n          // from outer to inner to sibling (adjacent)\n          moveMouse(outer, inner)\n          moveMouse(inner, sibling)\n        }, 20)\n      })\n    })\n  })\n\n  describe('one', () => {\n    it('should call listener just once', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<div></div>'\n\n        let called = 0\n        const div = fixtureEl.querySelector('div')\n        const obj = {\n          oneListener() {\n            called++\n          }\n        }\n\n        EventHandler.one(div, 'bootstrap', obj.oneListener)\n\n        EventHandler.trigger(div, 'bootstrap')\n        EventHandler.trigger(div, 'bootstrap')\n\n        setTimeout(() => {\n          expect(called).toEqual(1)\n          resolve()\n        }, 20)\n      })\n    })\n\n    it('should call delegated listener just once', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<div></div>'\n\n        let called = 0\n        const div = fixtureEl.querySelector('div')\n        const obj = {\n          oneListener() {\n            called++\n          }\n        }\n\n        EventHandler.one(fixtureEl, 'bootstrap', 'div', obj.oneListener)\n\n        EventHandler.trigger(div, 'bootstrap')\n        EventHandler.trigger(div, 'bootstrap')\n\n        setTimeout(() => {\n          expect(called).toEqual(1)\n          resolve()\n        }, 20)\n      })\n    })\n  })\n\n  describe('off', () => {\n    it('should not remove a listener', () => {\n      fixtureEl.innerHTML = '<div></div>'\n      const div = fixtureEl.querySelector('div')\n\n      EventHandler.off(div, null, noop)\n      EventHandler.off(null, 'click', noop)\n      expect().nothing()\n    })\n\n    it('should remove a listener', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<div></div>'\n        const div = fixtureEl.querySelector('div')\n\n        let called = 0\n        const handler = () => {\n          called++\n        }\n\n        EventHandler.on(div, 'foobar', handler)\n        EventHandler.trigger(div, 'foobar')\n\n        EventHandler.off(div, 'foobar', handler)\n        EventHandler.trigger(div, 'foobar')\n\n        setTimeout(() => {\n          expect(called).toEqual(1)\n          resolve()\n        }, 20)\n      })\n    })\n\n    it('should remove all the events', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<div></div>'\n        const div = fixtureEl.querySelector('div')\n\n        let called = 0\n\n        EventHandler.on(div, 'foobar', () => {\n          called++\n        })\n        EventHandler.on(div, 'foobar', () => {\n          called++\n        })\n        EventHandler.trigger(div, 'foobar')\n\n        EventHandler.off(div, 'foobar')\n        EventHandler.trigger(div, 'foobar')\n\n        setTimeout(() => {\n          expect(called).toEqual(2)\n          resolve()\n        }, 20)\n      })\n    })\n\n    it('should remove all the namespaced listeners if namespace is passed', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<div></div>'\n        const div = fixtureEl.querySelector('div')\n\n        let called = 0\n\n        EventHandler.on(div, 'foobar.namespace', () => {\n          called++\n        })\n        EventHandler.on(div, 'foofoo.namespace', () => {\n          called++\n        })\n        EventHandler.trigger(div, 'foobar.namespace')\n        EventHandler.trigger(div, 'foofoo.namespace')\n\n        EventHandler.off(div, '.namespace')\n        EventHandler.trigger(div, 'foobar.namespace')\n        EventHandler.trigger(div, 'foofoo.namespace')\n\n        setTimeout(() => {\n          expect(called).toEqual(2)\n          resolve()\n        }, 20)\n      })\n    })\n\n    it('should remove the namespaced listeners', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<div></div>'\n        const div = fixtureEl.querySelector('div')\n\n        let calledCallback1 = 0\n        let calledCallback2 = 0\n\n        EventHandler.on(div, 'foobar.namespace', () => {\n          calledCallback1++\n        })\n        EventHandler.on(div, 'foofoo.namespace', () => {\n          calledCallback2++\n        })\n\n        EventHandler.trigger(div, 'foobar.namespace')\n        EventHandler.off(div, 'foobar.namespace')\n        EventHandler.trigger(div, 'foobar.namespace')\n\n        EventHandler.trigger(div, 'foofoo.namespace')\n\n        setTimeout(() => {\n          expect(calledCallback1).toEqual(1)\n          expect(calledCallback2).toEqual(1)\n          resolve()\n        }, 20)\n      })\n    })\n\n    it('should remove the all the namespaced listeners for native events', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<div></div>'\n        const div = fixtureEl.querySelector('div')\n\n        let called = 0\n\n        EventHandler.on(div, 'click.namespace', () => {\n          called++\n        })\n        EventHandler.on(div, 'click.namespace2', () => {\n          called++\n        })\n\n        EventHandler.trigger(div, 'click')\n        EventHandler.off(div, 'click')\n        EventHandler.trigger(div, 'click')\n\n        setTimeout(() => {\n          expect(called).toEqual(2)\n          resolve()\n        }, 20)\n      })\n    })\n\n    it('should remove the specified namespaced listeners for native events', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<div></div>'\n        const div = fixtureEl.querySelector('div')\n\n        let called1 = 0\n        let called2 = 0\n\n        EventHandler.on(div, 'click.namespace', () => {\n          called1++\n        })\n        EventHandler.on(div, 'click.namespace2', () => {\n          called2++\n        })\n        EventHandler.trigger(div, 'click')\n\n        EventHandler.off(div, 'click.namespace')\n        EventHandler.trigger(div, 'click')\n\n        setTimeout(() => {\n          expect(called1).toEqual(1)\n          expect(called2).toEqual(2)\n          resolve()\n        }, 20)\n      })\n    })\n\n    it('should remove a listener registered by .one', () => {\n      return new Promise((resolve, reject) => {\n        fixtureEl.innerHTML = '<div></div>'\n\n        const div = fixtureEl.querySelector('div')\n        const handler = () => {\n          reject(new Error('called'))\n        }\n\n        EventHandler.one(div, 'foobar', handler)\n        EventHandler.off(div, 'foobar', handler)\n\n        EventHandler.trigger(div, 'foobar')\n        setTimeout(() => {\n          expect().nothing()\n          resolve()\n        }, 20)\n      })\n    })\n\n    it('should remove the correct delegated event listener', () => {\n      const element = document.createElement('div')\n      const subelement = document.createElement('span')\n      element.append(subelement)\n\n      const anchor = document.createElement('a')\n      element.append(anchor)\n\n      let i = 0\n      const handler = () => {\n        i++\n      }\n\n      EventHandler.on(element, 'click', 'a', handler)\n      EventHandler.on(element, 'click', 'span', handler)\n\n      fixtureEl.append(element)\n\n      EventHandler.trigger(anchor, 'click')\n      EventHandler.trigger(subelement, 'click')\n\n      // first listeners called\n      expect(i).toEqual(2)\n\n      EventHandler.off(element, 'click', 'span', handler)\n      EventHandler.trigger(subelement, 'click')\n\n      // removed listener not called\n      expect(i).toEqual(2)\n\n      EventHandler.trigger(anchor, 'click')\n\n      // not removed listener called\n      expect(i).toEqual(3)\n\n      EventHandler.on(element, 'click', 'span', handler)\n      EventHandler.trigger(anchor, 'click')\n      EventHandler.trigger(subelement, 'click')\n\n      // listener re-registered\n      expect(i).toEqual(5)\n\n      EventHandler.off(element, 'click', 'span')\n      EventHandler.trigger(subelement, 'click')\n\n      // listener removed again\n      expect(i).toEqual(5)\n    })\n  })\n\n  describe('general functionality', () => {\n    it('should hydrate properties, and make them configurable', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div id=\"div1\">',\n          '   <div id=\"div2\"></div>',\n          '   <div id=\"div3\"></div>',\n          '</div>'\n        ].join('')\n\n        const div1 = fixtureEl.querySelector('#div1')\n        const div2 = fixtureEl.querySelector('#div2')\n\n        EventHandler.on(div1, 'click', event => {\n          expect(event.currentTarget).toBe(div2)\n          expect(event.delegateTarget).toBe(div1)\n          expect(event.originalTarget).toBeNull()\n\n          Object.defineProperty(event, 'currentTarget', {\n            configurable: true,\n            get() {\n              return div1\n            }\n          })\n\n          expect(event.currentTarget).toBe(div1)\n          resolve()\n        })\n\n        expect(() => {\n          EventHandler.trigger(div1, 'click', { originalTarget: null, currentTarget: div2 })\n        }).not.toThrowError(TypeError)\n      })\n    })\n  })\n})\n"
  },
  {
    "path": "js/tests/unit/dom/manipulator.spec.js",
    "content": "import Manipulator from '../../../src/dom/manipulator.js'\nimport { clearFixture, getFixture } from '../../helpers/fixture.js'\n\ndescribe('Manipulator', () => {\n  let fixtureEl\n\n  beforeAll(() => {\n    fixtureEl = getFixture()\n  })\n\n  afterEach(() => {\n    clearFixture()\n  })\n\n  describe('setDataAttribute', () => {\n    it('should set data attribute prefixed with bs', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n\n      Manipulator.setDataAttribute(div, 'key', 'value')\n      expect(div.getAttribute('data-bs-key')).toEqual('value')\n    })\n\n    it('should set data attribute in kebab case', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n\n      Manipulator.setDataAttribute(div, 'testKey', 'value')\n      expect(div.getAttribute('data-bs-test-key')).toEqual('value')\n    })\n  })\n\n  describe('removeDataAttribute', () => {\n    it('should only remove bs-prefixed data attribute', () => {\n      fixtureEl.innerHTML = '<div data-bs-key=\"value\" data-key-bs=\"postfixed\" data-key=\"value\"></div>'\n\n      const div = fixtureEl.querySelector('div')\n\n      Manipulator.removeDataAttribute(div, 'key')\n      expect(div.getAttribute('data-bs-key')).toBeNull()\n      expect(div.getAttribute('data-key-bs')).toEqual('postfixed')\n      expect(div.getAttribute('data-key')).toEqual('value')\n    })\n\n    it('should remove data attribute in kebab case', () => {\n      fixtureEl.innerHTML = '<div data-bs-test-key=\"value\"></div>'\n\n      const div = fixtureEl.querySelector('div')\n\n      Manipulator.removeDataAttribute(div, 'testKey')\n      expect(div.getAttribute('data-bs-test-key')).toBeNull()\n    })\n  })\n\n  describe('getDataAttributes', () => {\n    it('should return an empty object for null', () => {\n      expect(Manipulator.getDataAttributes(null)).toEqual({})\n      expect().nothing()\n    })\n\n    it('should get only bs-prefixed data attributes without bs namespace', () => {\n      fixtureEl.innerHTML = '<div data-bs-toggle=\"tabs\" data-bs-target=\"#element\" data-another=\"value\" data-target-bs=\"#element\" data-in-bs-out=\"in-between\"></div>'\n\n      const div = fixtureEl.querySelector('div')\n\n      expect(Manipulator.getDataAttributes(div)).toEqual({\n        toggle: 'tabs',\n        target: '#element'\n      })\n    })\n\n    it('should omit `bs-config` data attribute', () => {\n      fixtureEl.innerHTML = '<div data-bs-toggle=\"tabs\" data-bs-target=\"#element\" data-bs-config=\\'{\"testBool\":false}\\'></div>'\n\n      const div = fixtureEl.querySelector('div')\n\n      expect(Manipulator.getDataAttributes(div)).toEqual({\n        toggle: 'tabs',\n        target: '#element'\n      })\n    })\n  })\n\n  describe('getDataAttribute', () => {\n    it('should only get bs-prefixed data attribute', () => {\n      fixtureEl.innerHTML = '<div data-bs-key=\"value\" data-test-bs=\"postFixed\" data-toggle=\"tab\"></div>'\n\n      const div = fixtureEl.querySelector('div')\n\n      expect(Manipulator.getDataAttribute(div, 'key')).toEqual('value')\n      expect(Manipulator.getDataAttribute(div, 'test')).toBeNull()\n      expect(Manipulator.getDataAttribute(div, 'toggle')).toBeNull()\n    })\n\n    it('should get data attribute in kebab case', () => {\n      fixtureEl.innerHTML = '<div data-bs-test-key=\"value\" ></div>'\n\n      const div = fixtureEl.querySelector('div')\n\n      expect(Manipulator.getDataAttribute(div, 'testKey')).toEqual('value')\n    })\n\n    it('should normalize data', () => {\n      fixtureEl.innerHTML = '<div data-bs-test=\"false\" ></div>'\n\n      const div = fixtureEl.querySelector('div')\n\n      expect(Manipulator.getDataAttribute(div, 'test')).toBeFalse()\n\n      div.setAttribute('data-bs-test', 'true')\n      expect(Manipulator.getDataAttribute(div, 'test')).toBeTrue()\n\n      div.setAttribute('data-bs-test', '1')\n      expect(Manipulator.getDataAttribute(div, 'test')).toEqual(1)\n    })\n\n    it('should normalize json data', () => {\n      fixtureEl.innerHTML = '<div data-bs-test=\\'{\"delay\":{\"show\":100,\"hide\":10}}\\'></div>'\n\n      const div = fixtureEl.querySelector('div')\n\n      expect(Manipulator.getDataAttribute(div, 'test')).toEqual({ delay: { show: 100, hide: 10 } })\n\n      const objectData = { 'Super Hero': ['Iron Man', 'Super Man'], testNum: 90, url: 'http://localhost:8080/test?foo=bar' }\n      const dataStr = JSON.stringify(objectData)\n      div.setAttribute('data-bs-test', encodeURIComponent(dataStr))\n      expect(Manipulator.getDataAttribute(div, 'test')).toEqual(objectData)\n\n      div.setAttribute('data-bs-test', dataStr)\n      expect(Manipulator.getDataAttribute(div, 'test')).toEqual(objectData)\n    })\n  })\n})\n"
  },
  {
    "path": "js/tests/unit/dom/selector-engine.spec.js",
    "content": "import SelectorEngine from '../../../src/dom/selector-engine.js'\nimport { clearFixture, getFixture } from '../../helpers/fixture.js'\n\ndescribe('SelectorEngine', () => {\n  let fixtureEl\n\n  beforeAll(() => {\n    fixtureEl = getFixture()\n  })\n\n  afterEach(() => {\n    clearFixture()\n  })\n\n  describe('find', () => {\n    it('should find elements', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n\n      expect(SelectorEngine.find('div', fixtureEl)).toEqual([div])\n    })\n\n    it('should find elements globally', () => {\n      fixtureEl.innerHTML = '<div id=\"test\"></div>'\n\n      const div = fixtureEl.querySelector('#test')\n\n      expect(SelectorEngine.find('#test')).toEqual([div])\n    })\n\n    it('should handle :scope selectors', () => {\n      fixtureEl.innerHTML = [\n        '<ul>',\n        '  <li></li>',\n        '  <li>',\n        '    <a href=\"#\" class=\"active\">link</a>',\n        '  </li>',\n        '  <li></li>',\n        '</ul>'\n      ].join('')\n\n      const listEl = fixtureEl.querySelector('ul')\n      const aActive = fixtureEl.querySelector('.active')\n\n      expect(SelectorEngine.find(':scope > li > .active', listEl)).toEqual([aActive])\n    })\n  })\n\n  describe('findOne', () => {\n    it('should return one element', () => {\n      fixtureEl.innerHTML = '<div id=\"test\"></div>'\n\n      const div = fixtureEl.querySelector('#test')\n\n      expect(SelectorEngine.findOne('#test')).toEqual(div)\n    })\n  })\n\n  describe('children', () => {\n    it('should find children', () => {\n      fixtureEl.innerHTML = [\n        '<ul>',\n        '  <li></li>',\n        '  <li></li>',\n        '  <li></li>',\n        '</ul>'\n      ].join('')\n\n      const list = fixtureEl.querySelector('ul')\n      const liList = [].concat(...fixtureEl.querySelectorAll('li'))\n      const result = SelectorEngine.children(list, 'li')\n\n      expect(result).toEqual(liList)\n    })\n  })\n\n  describe('parents', () => {\n    it('should return parents', () => {\n      expect(SelectorEngine.parents(fixtureEl, 'body')).toHaveSize(1)\n    })\n  })\n\n  describe('prev', () => {\n    it('should return previous element', () => {\n      fixtureEl.innerHTML = '<div class=\"test\"></div><button class=\"btn\"></button>'\n\n      const btn = fixtureEl.querySelector('.btn')\n      const divTest = fixtureEl.querySelector('.test')\n\n      expect(SelectorEngine.prev(btn, '.test')).toEqual([divTest])\n    })\n\n    it('should return previous element with an extra element between', () => {\n      fixtureEl.innerHTML = [\n        '<div class=\"test\"></div>',\n        '<span></span>',\n        '<button class=\"btn\"></button>'\n      ].join('')\n\n      const btn = fixtureEl.querySelector('.btn')\n      const divTest = fixtureEl.querySelector('.test')\n\n      expect(SelectorEngine.prev(btn, '.test')).toEqual([divTest])\n    })\n\n    it('should return previous element with comments or text nodes between', () => {\n      fixtureEl.innerHTML = [\n        '<div class=\"test\"></div>',\n        '<div class=\"test\"></div>',\n        '<!-- Comment-->',\n        'Text',\n        '<button class=\"btn\"></button>'\n      ].join('')\n\n      const btn = fixtureEl.querySelector('.btn')\n      const divTest = fixtureEl.querySelectorAll('.test')[1]\n\n      expect(SelectorEngine.prev(btn, '.test')).toEqual([divTest])\n    })\n  })\n\n  describe('next', () => {\n    it('should return next element', () => {\n      fixtureEl.innerHTML = '<div class=\"test\"></div><button class=\"btn\"></button>'\n\n      const btn = fixtureEl.querySelector('.btn')\n      const divTest = fixtureEl.querySelector('.test')\n\n      expect(SelectorEngine.next(divTest, '.btn')).toEqual([btn])\n    })\n\n    it('should return next element with an extra element between', () => {\n      fixtureEl.innerHTML = [\n        '<div class=\"test\"></div>',\n        '<span></span>',\n        '<button class=\"btn\"></button>'\n      ].join('')\n\n      const btn = fixtureEl.querySelector('.btn')\n      const divTest = fixtureEl.querySelector('.test')\n\n      expect(SelectorEngine.next(divTest, '.btn')).toEqual([btn])\n    })\n\n    it('should return next element with comments or text nodes between', () => {\n      fixtureEl.innerHTML = [\n        '<div class=\"test\"></div>',\n        '<!-- Comment-->',\n        'Text',\n        '<button class=\"btn\"></button>',\n        '<button class=\"btn\"></button>'\n      ].join('')\n\n      const btn = fixtureEl.querySelector('.btn')\n      const divTest = fixtureEl.querySelector('.test')\n\n      expect(SelectorEngine.next(divTest, '.btn')).toEqual([btn])\n    })\n  })\n\n  describe('focusableChildren', () => {\n    it('should return only elements with specific tag names', () => {\n      fixtureEl.innerHTML = [\n        '<div>lorem</div>',\n        '<span>lorem</span>',\n        '<a>lorem</a>',\n        '<button>lorem</button>',\n        '<input>',\n        '<textarea></textarea>',\n        '<select></select>',\n        '<details>lorem</details>'\n      ].join('')\n\n      const expectedElements = [\n        fixtureEl.querySelector('a'),\n        fixtureEl.querySelector('button'),\n        fixtureEl.querySelector('input'),\n        fixtureEl.querySelector('textarea'),\n        fixtureEl.querySelector('select'),\n        fixtureEl.querySelector('details')\n      ]\n\n      expect(SelectorEngine.focusableChildren(fixtureEl)).toEqual(expectedElements)\n    })\n\n    it('should return any element with non negative tab index', () => {\n      fixtureEl.innerHTML = [\n        '<div tabindex>lorem</div>',\n        '<div tabindex=\"0\">lorem</div>',\n        '<div tabindex=\"10\">lorem</div>'\n      ].join('')\n\n      const expectedElements = [\n        fixtureEl.querySelector('[tabindex]'),\n        fixtureEl.querySelector('[tabindex=\"0\"]'),\n        fixtureEl.querySelector('[tabindex=\"10\"]')\n      ]\n\n      expect(SelectorEngine.focusableChildren(fixtureEl)).toEqual(expectedElements)\n    })\n\n    it('should return not return elements with negative tab index', () => {\n      fixtureEl.innerHTML = '<button tabindex=\"-1\">lorem</button>'\n\n      const expectedElements = []\n\n      expect(SelectorEngine.focusableChildren(fixtureEl)).toEqual(expectedElements)\n    })\n\n    it('should return contenteditable elements', () => {\n      fixtureEl.innerHTML = '<div contenteditable=\"true\">lorem</div>'\n\n      const expectedElements = [fixtureEl.querySelector('[contenteditable=\"true\"]')]\n\n      expect(SelectorEngine.focusableChildren(fixtureEl)).toEqual(expectedElements)\n    })\n\n    it('should not return disabled elements', () => {\n      fixtureEl.innerHTML = '<button disabled=\"true\">lorem</button>'\n\n      const expectedElements = []\n\n      expect(SelectorEngine.focusableChildren(fixtureEl)).toEqual(expectedElements)\n    })\n\n    it('should not return invisible elements', () => {\n      fixtureEl.innerHTML = '<button style=\"display:none;\">lorem</button>'\n\n      const expectedElements = []\n\n      expect(SelectorEngine.focusableChildren(fixtureEl)).toEqual(expectedElements)\n    })\n  })\n\n  describe('getSelectorFromElement', () => {\n    it('should get selector from data-bs-target', () => {\n      fixtureEl.innerHTML = [\n        '<div id=\"test\" data-bs-target=\".target\"></div>',\n        '<div class=\"target\"></div>'\n      ].join('')\n\n      const testEl = fixtureEl.querySelector('#test')\n\n      expect(SelectorEngine.getSelectorFromElement(testEl)).toEqual('.target')\n    })\n\n    it('should get selector from href if no data-bs-target set', () => {\n      fixtureEl.innerHTML = [\n        '<a id=\"test\" href=\".target\"></a>',\n        '<div class=\"target\"></div>'\n      ].join('')\n\n      const testEl = fixtureEl.querySelector('#test')\n\n      expect(SelectorEngine.getSelectorFromElement(testEl)).toEqual('.target')\n    })\n\n    it('should get selector from href if data-bs-target equal to #', () => {\n      fixtureEl.innerHTML = [\n        '<a id=\"test\" data-bs-target=\"#\" href=\".target\"></a>',\n        '<div class=\"target\"></div>'\n      ].join('')\n\n      const testEl = fixtureEl.querySelector('#test')\n\n      expect(SelectorEngine.getSelectorFromElement(testEl)).toEqual('.target')\n    })\n\n    it('should return null if a selector from a href is a url without an anchor', () => {\n      fixtureEl.innerHTML = [\n        '<a id=\"test\" data-bs-target=\"#\" href=\"foo/bar.html\"></a>',\n        '<div class=\"target\"></div>'\n      ].join('')\n\n      const testEl = fixtureEl.querySelector('#test')\n\n      expect(SelectorEngine.getSelectorFromElement(testEl)).toBeNull()\n    })\n\n    it('should return the anchor if a selector from a href is a url', () => {\n      fixtureEl.innerHTML = [\n        '<a id=\"test\" data-bs-target=\"#\" href=\"foo/bar.html#target\"></a>',\n        '<div id=\"target\"></div>'\n      ].join('')\n\n      const testEl = fixtureEl.querySelector('#test')\n\n      expect(SelectorEngine.getSelectorFromElement(testEl)).toEqual('#target')\n    })\n\n    it('should return null if selector not found', () => {\n      fixtureEl.innerHTML = '<a id=\"test\" href=\".target\"></a>'\n\n      const testEl = fixtureEl.querySelector('#test')\n\n      expect(SelectorEngine.getSelectorFromElement(testEl)).toBeNull()\n    })\n\n    it('should return null if no selector', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const testEl = fixtureEl.querySelector('div')\n\n      expect(SelectorEngine.getSelectorFromElement(testEl)).toBeNull()\n    })\n  })\n\n  describe('getElementFromSelector', () => {\n    it('should get element from data-bs-target', () => {\n      fixtureEl.innerHTML = [\n        '<div id=\"test\" data-bs-target=\".target\"></div>',\n        '<div class=\"target\"></div>'\n      ].join('')\n\n      const testEl = fixtureEl.querySelector('#test')\n\n      expect(SelectorEngine.getElementFromSelector(testEl)).toEqual(fixtureEl.querySelector('.target'))\n    })\n\n    it('should get element from href if no data-bs-target set', () => {\n      fixtureEl.innerHTML = [\n        '<a id=\"test\" href=\".target\"></a>',\n        '<div class=\"target\"></div>'\n      ].join('')\n\n      const testEl = fixtureEl.querySelector('#test')\n\n      expect(SelectorEngine.getElementFromSelector(testEl)).toEqual(fixtureEl.querySelector('.target'))\n    })\n\n    it('should return null if element not found', () => {\n      fixtureEl.innerHTML = '<a id=\"test\" href=\".target\"></a>'\n\n      const testEl = fixtureEl.querySelector('#test')\n\n      expect(SelectorEngine.getElementFromSelector(testEl)).toBeNull()\n    })\n\n    it('should return null if no selector', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const testEl = fixtureEl.querySelector('div')\n\n      expect(SelectorEngine.getElementFromSelector(testEl)).toBeNull()\n    })\n  })\n\n  describe('getMultipleElementsFromSelector', () => {\n    it('should get elements from data-bs-target', () => {\n      fixtureEl.innerHTML = [\n        '<div id=\"test\" data-bs-target=\".target\"></div>',\n        '<div class=\"target\"></div>',\n        '<div class=\"target\"></div>'\n      ].join('')\n\n      const testEl = fixtureEl.querySelector('#test')\n\n      expect(SelectorEngine.getMultipleElementsFromSelector(testEl)).toEqual(Array.from(fixtureEl.querySelectorAll('.target')))\n    })\n\n    it('should get elements if several ids are given', () => {\n      fixtureEl.innerHTML = [\n        '<div id=\"test\" data-bs-target=\"#target1,#target2\"></div>',\n        '<div class=\"target\" id=\"target1\"></div>',\n        '<div class=\"target\" id=\"target2\"></div>'\n      ].join('')\n\n      const testEl = fixtureEl.querySelector('#test')\n\n      expect(SelectorEngine.getMultipleElementsFromSelector(testEl)).toEqual(Array.from(fixtureEl.querySelectorAll('.target')))\n    })\n\n    it('should get elements if several ids with special chars are given', () => {\n      fixtureEl.innerHTML = [\n        '<div id=\"test\" data-bs-target=\"#j_id11:exampleModal,#j_id22:exampleModal\"></div>',\n        '<div class=\"target\" id=\"j_id11:exampleModal\"></div>',\n        '<div class=\"target\" id=\"j_id22:exampleModal\"></div>'\n      ].join('')\n\n      const testEl = fixtureEl.querySelector('#test')\n\n      expect(SelectorEngine.getMultipleElementsFromSelector(testEl)).toEqual(Array.from(fixtureEl.querySelectorAll('.target')))\n    })\n\n    it('should get elements in array, from href if no data-bs-target set', () => {\n      fixtureEl.innerHTML = [\n        '<a id=\"test\" href=\".target\"></a>',\n        '<div class=\"target\"></div>',\n        '<div class=\"target\"></div>'\n      ].join('')\n\n      const testEl = fixtureEl.querySelector('#test')\n\n      expect(SelectorEngine.getMultipleElementsFromSelector(testEl)).toEqual(Array.from(fixtureEl.querySelectorAll('.target')))\n    })\n\n    it('should return empty array if elements not found', () => {\n      fixtureEl.innerHTML = '<a id=\"test\" href=\".target\"></a>'\n\n      const testEl = fixtureEl.querySelector('#test')\n\n      expect(SelectorEngine.getMultipleElementsFromSelector(testEl)).toHaveSize(0)\n    })\n\n    it('should return empty array if no selector', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const testEl = fixtureEl.querySelector('div')\n\n      expect(SelectorEngine.getMultipleElementsFromSelector(testEl)).toHaveSize(0)\n    })\n  })\n})\n"
  },
  {
    "path": "js/tests/unit/dropdown.spec.js",
    "content": "import EventHandler from '../../src/dom/event-handler.js'\nimport Dropdown from '../../src/dropdown.js'\nimport { noop } from '../../src/util/index.js'\nimport {\n  clearFixture, createEvent, getFixture, jQueryMock\n} from '../helpers/fixture.js'\n\ndescribe('Dropdown', () => {\n  let fixtureEl\n\n  beforeAll(() => {\n    fixtureEl = getFixture()\n  })\n\n  afterEach(() => {\n    clearFixture()\n  })\n\n  describe('VERSION', () => {\n    it('should return plugin version', () => {\n      expect(Dropdown.VERSION).toEqual(jasmine.any(String))\n    })\n  })\n\n  describe('Default', () => {\n    it('should return plugin default config', () => {\n      expect(Dropdown.Default).toEqual(jasmine.any(Object))\n    })\n  })\n\n  describe('DefaultType', () => {\n    it('should return plugin default type config', () => {\n      expect(Dropdown.DefaultType).toEqual(jasmine.any(Object))\n    })\n  })\n\n  describe('DATA_KEY', () => {\n    it('should return plugin data key', () => {\n      expect(Dropdown.DATA_KEY).toEqual('bs.dropdown')\n    })\n  })\n\n  describe('constructor', () => {\n    it('should take care of element either passed as a CSS selector or DOM element', () => {\n      fixtureEl.innerHTML = [\n        '<div class=\"dropdown\">',\n        '  <button class=\"btn dropdown-toggle\" data-bs-toggle=\"dropdown\">Dropdown</button>',\n        '  <div class=\"dropdown-menu\">',\n        '    <a class=\"dropdown-item\" href=\"#\">Link</a>',\n        '  </div>',\n        '</div>'\n      ].join('')\n\n      const btnDropdown = fixtureEl.querySelector('[data-bs-toggle=\"dropdown\"]')\n      const dropdownBySelector = new Dropdown('[data-bs-toggle=\"dropdown\"]')\n      const dropdownByElement = new Dropdown(btnDropdown)\n\n      expect(dropdownBySelector._element).toEqual(btnDropdown)\n      expect(dropdownByElement._element).toEqual(btnDropdown)\n    })\n\n    it('should work on invalid markup', () => {\n      return new Promise(resolve => {\n        // TODO: REMOVE in v6\n        fixtureEl.innerHTML = [\n          '<div class=\"dropdown\">',\n          '  <div class=\"dropdown-menu\">',\n          '    <a class=\"dropdown-item\" href=\"#\">Link</a>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const dropdownElem = fixtureEl.querySelector('.dropdown-menu')\n        const dropdown = new Dropdown(dropdownElem)\n\n        dropdownElem.addEventListener('shown.bs.dropdown', () => {\n          resolve()\n        })\n\n        expect().nothing()\n        dropdown.show()\n      })\n    })\n\n    it('should create offset modifier correctly when offset option is a function', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div class=\"dropdown\">',\n          '  <button class=\"btn dropdown-toggle\" data-bs-toggle=\"dropdown\">Dropdown</button>',\n          '  <div class=\"dropdown-menu\">',\n          '    <a class=\"dropdown-item\" href=\"#\">Secondary link</a>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const getOffset = jasmine.createSpy('getOffset').and.returnValue([10, 20])\n        const btnDropdown = fixtureEl.querySelector('[data-bs-toggle=\"dropdown\"]')\n        const dropdown = new Dropdown(btnDropdown, {\n          offset: getOffset,\n          popperConfig: {\n            onFirstUpdate(state) {\n              expect(getOffset).toHaveBeenCalledWith({\n                popper: state.rects.popper,\n                reference: state.rects.reference,\n                placement: state.placement\n              }, btnDropdown)\n              resolve()\n            }\n          }\n        })\n        const offset = dropdown._getOffset()\n\n        expect(typeof offset).toEqual('function')\n\n        dropdown.show()\n      })\n    })\n\n    it('should create offset modifier correctly when offset option is a string into data attribute', () => {\n      fixtureEl.innerHTML = [\n        '<div class=\"dropdown\">',\n        '  <button class=\"btn dropdown-toggle\" data-bs-toggle=\"dropdown\" data-bs-offset=\"10,20\">Dropdown</button>',\n        '  <div class=\"dropdown-menu\">',\n        '    <a class=\"dropdown-item\" href=\"#\">Secondary link</a>',\n        '  </div>',\n        '</div>'\n      ].join('')\n\n      const btnDropdown = fixtureEl.querySelector('[data-bs-toggle=\"dropdown\"]')\n      const dropdown = new Dropdown(btnDropdown)\n\n      expect(dropdown._getOffset()).toEqual([10, 20])\n    })\n\n    it('should allow to pass config to Popper with `popperConfig`', () => {\n      fixtureEl.innerHTML = [\n        '<div class=\"dropdown\">',\n        '  <button class=\"btn dropdown-toggle\" data-bs-toggle=\"dropdown\">Dropdown</button>',\n        '  <div class=\"dropdown-menu\">',\n        '    <a class=\"dropdown-item\" href=\"#\">Secondary link</a>',\n        '  </div>',\n        '</div>'\n      ].join('')\n\n      const btnDropdown = fixtureEl.querySelector('[data-bs-toggle=\"dropdown\"]')\n      const dropdown = new Dropdown(btnDropdown, {\n        popperConfig: {\n          placement: 'left'\n        }\n      })\n\n      const popperConfig = dropdown._getPopperConfig()\n\n      expect(popperConfig.placement).toEqual('left')\n    })\n\n    it('should allow to pass config to Popper with `popperConfig` as a function', () => {\n      fixtureEl.innerHTML = [\n        '<div class=\"dropdown\">',\n        '  <button class=\"btn dropdown-toggle\" data-bs-toggle=\"dropdown\" data-bs-placement=\"right\">Dropdown</button>',\n        '  <div class=\"dropdown-menu\">',\n        '    <a class=\"dropdown-item\" href=\"#\">Secondary link</a>',\n        '  </div>',\n        '</div>'\n      ].join('')\n\n      const btnDropdown = fixtureEl.querySelector('[data-bs-toggle=\"dropdown\"]')\n      const getPopperConfig = jasmine.createSpy('getPopperConfig').and.returnValue({ placement: 'left' })\n      const dropdown = new Dropdown(btnDropdown, {\n        popperConfig: getPopperConfig\n      })\n\n      const popperConfig = dropdown._getPopperConfig()\n\n      // Ensure that the function was called with the default config.\n      expect(getPopperConfig).toHaveBeenCalledWith(jasmine.objectContaining({\n        placement: jasmine.any(String)\n      }))\n      expect(popperConfig.placement).toEqual('left')\n    })\n  })\n\n  describe('toggle', () => {\n    it('should toggle a dropdown', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div class=\"dropdown\">',\n          '  <button class=\"btn dropdown-toggle\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">Dropdown</button>',\n          '  <div class=\"dropdown-menu\">',\n          '    <a class=\"dropdown-item\" href=\"#\">Secondary link</a>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const btnDropdown = fixtureEl.querySelector('[data-bs-toggle=\"dropdown\"]')\n        const dropdown = new Dropdown(btnDropdown)\n\n        btnDropdown.addEventListener('shown.bs.dropdown', () => {\n          expect(btnDropdown).toHaveClass('show')\n          expect(btnDropdown.getAttribute('aria-expanded')).toEqual('true')\n          resolve()\n        })\n\n        dropdown.toggle()\n      })\n    })\n\n    it('should destroy old popper references on toggle', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div class=\"first dropdown\">',\n          '  <button class=\"firstBtn btn\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">Dropdown</button>',\n          '  <div class=\"dropdown-menu\">',\n          '    <a class=\"dropdown-item\" href=\"#\">Secondary link</a>',\n          '  </div>',\n          '</div>',\n          '<div class=\"second dropdown\">',\n          '  <button class=\"secondBtn btn\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">Dropdown</button>',\n          '  <div class=\"dropdown-menu\">',\n          '    <a class=\"dropdown-item\" href=\"#\">Secondary link</a>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const btnDropdown1 = fixtureEl.querySelector('.firstBtn')\n        const btnDropdown2 = fixtureEl.querySelector('.secondBtn')\n        const firstDropdownEl = fixtureEl.querySelector('.first')\n        const secondDropdownEl = fixtureEl.querySelector('.second')\n        const dropdown1 = new Dropdown(btnDropdown1)\n\n        firstDropdownEl.addEventListener('shown.bs.dropdown', () => {\n          expect(btnDropdown1).toHaveClass('show')\n          spyOn(dropdown1._popper, 'destroy')\n          btnDropdown2.click()\n        })\n\n        secondDropdownEl.addEventListener('shown.bs.dropdown', () => setTimeout(() => {\n          expect(dropdown1._popper.destroy).toHaveBeenCalled()\n          resolve()\n        }))\n\n        dropdown1.toggle()\n      })\n    })\n\n    it('should toggle a dropdown and add/remove event listener on mobile', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div class=\"dropdown\">',\n          '  <button class=\"btn dropdown-toggle\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">Dropdown</button>',\n          '  <div class=\"dropdown-menu\">',\n          '    <a class=\"dropdown-item\" href=\"#\">Secondary link</a>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const defaultValueOnTouchStart = document.documentElement.ontouchstart\n        const btnDropdown = fixtureEl.querySelector('[data-bs-toggle=\"dropdown\"]')\n        const dropdown = new Dropdown(btnDropdown)\n\n        document.documentElement.ontouchstart = noop\n        const spy = spyOn(EventHandler, 'on')\n        const spyOff = spyOn(EventHandler, 'off')\n\n        btnDropdown.addEventListener('shown.bs.dropdown', () => {\n          expect(btnDropdown).toHaveClass('show')\n          expect(btnDropdown.getAttribute('aria-expanded')).toEqual('true')\n          expect(spy).toHaveBeenCalledWith(jasmine.any(Object), 'mouseover', noop)\n\n          dropdown.toggle()\n        })\n\n        btnDropdown.addEventListener('hidden.bs.dropdown', () => {\n          expect(btnDropdown).not.toHaveClass('show')\n          expect(btnDropdown.getAttribute('aria-expanded')).toEqual('false')\n          expect(spyOff).toHaveBeenCalledWith(jasmine.any(Object), 'mouseover', noop)\n\n          document.documentElement.ontouchstart = defaultValueOnTouchStart\n          resolve()\n        })\n\n        dropdown.toggle()\n      })\n    })\n\n    it('should toggle a dropdown at the right', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div class=\"dropdown\">',\n          '  <button class=\"btn dropdown-toggle\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">Dropdown</button>',\n          '  <div class=\"dropdown-menu dropdown-menu-end\">',\n          '    <a class=\"dropdown-item\" href=\"#\">Secondary link</a>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const btnDropdown = fixtureEl.querySelector('[data-bs-toggle=\"dropdown\"]')\n        const dropdown = new Dropdown(btnDropdown)\n\n        btnDropdown.addEventListener('shown.bs.dropdown', () => {\n          expect(btnDropdown).toHaveClass('show')\n          expect(btnDropdown.getAttribute('aria-expanded')).toEqual('true')\n          resolve()\n        })\n\n        dropdown.toggle()\n      })\n    })\n\n    it('should toggle a centered dropdown', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div class=\"dropdown-center\">',\n          '  <button class=\"btn dropdown-toggle\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">Dropdown</button>',\n          '  <div class=\"dropdown-menu\">',\n          '    <a class=\"dropdown-item\" href=\"#\">Secondary link</a>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const btnDropdown = fixtureEl.querySelector('[data-bs-toggle=\"dropdown\"]')\n        const dropdown = new Dropdown(btnDropdown)\n\n        btnDropdown.addEventListener('shown.bs.dropdown', () => {\n          expect(btnDropdown).toHaveClass('show')\n          expect(btnDropdown.getAttribute('aria-expanded')).toEqual('true')\n          resolve()\n        })\n\n        dropdown.toggle()\n      })\n    })\n\n    it('should toggle a dropup', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div class=\"dropup\">',\n          '  <button class=\"btn dropdown-toggle\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">Dropdown</button>',\n          '  <div class=\"dropdown-menu\">',\n          '    <a class=\"dropdown-item\" href=\"#\">Secondary link</a>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const btnDropdown = fixtureEl.querySelector('[data-bs-toggle=\"dropdown\"]')\n        const dropupEl = fixtureEl.querySelector('.dropup')\n        const dropdown = new Dropdown(btnDropdown)\n\n        dropupEl.addEventListener('shown.bs.dropdown', () => {\n          expect(btnDropdown).toHaveClass('show')\n          expect(btnDropdown.getAttribute('aria-expanded')).toEqual('true')\n          resolve()\n        })\n\n        dropdown.toggle()\n      })\n    })\n\n    it('should toggle a dropup centered', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div class=\"dropup-center\">',\n          '  <button class=\"btn dropdown-toggle\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">Dropdown</button>',\n          '  <div class=\"dropdown-menu\">',\n          '    <a class=\"dropdown-item\" href=\"#\">Secondary link</a>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const btnDropdown = fixtureEl.querySelector('[data-bs-toggle=\"dropdown\"]')\n        const dropupEl = fixtureEl.querySelector('.dropup-center')\n        const dropdown = new Dropdown(btnDropdown)\n\n        dropupEl.addEventListener('shown.bs.dropdown', () => {\n          expect(btnDropdown).toHaveClass('show')\n          expect(btnDropdown.getAttribute('aria-expanded')).toEqual('true')\n          resolve()\n        })\n\n        dropdown.toggle()\n      })\n    })\n\n    it('should toggle a dropup at the right', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div class=\"dropup\">',\n          '  <button class=\"btn dropdown-toggle\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">Dropdown</button>',\n          '  <div class=\"dropdown-menu dropdown-menu-end\">',\n          '    <a class=\"dropdown-item\" href=\"#\">Secondary link</a>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const btnDropdown = fixtureEl.querySelector('[data-bs-toggle=\"dropdown\"]')\n        const dropupEl = fixtureEl.querySelector('.dropup')\n        const dropdown = new Dropdown(btnDropdown)\n\n        dropupEl.addEventListener('shown.bs.dropdown', () => {\n          expect(btnDropdown).toHaveClass('show')\n          expect(btnDropdown.getAttribute('aria-expanded')).toEqual('true')\n          resolve()\n        })\n\n        dropdown.toggle()\n      })\n    })\n\n    it('should toggle a dropend', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div class=\"dropend\">',\n          '  <button class=\"btn dropdown-toggle\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">Dropdown</button>',\n          '  <div class=\"dropdown-menu\">',\n          '    <a class=\"dropdown-item\" href=\"#\">Secondary link</a>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const btnDropdown = fixtureEl.querySelector('[data-bs-toggle=\"dropdown\"]')\n        const dropendEl = fixtureEl.querySelector('.dropend')\n        const dropdown = new Dropdown(btnDropdown)\n\n        dropendEl.addEventListener('shown.bs.dropdown', () => {\n          expect(btnDropdown).toHaveClass('show')\n          expect(btnDropdown.getAttribute('aria-expanded')).toEqual('true')\n          resolve()\n        })\n\n        dropdown.toggle()\n      })\n    })\n\n    it('should toggle a dropstart', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div class=\"dropstart\">',\n          '  <button class=\"btn dropdown-toggle\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">Dropdown</button>',\n          '  <div class=\"dropdown-menu\">',\n          '    <a class=\"dropdown-item\" href=\"#\">Secondary link</a>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const btnDropdown = fixtureEl.querySelector('[data-bs-toggle=\"dropdown\"]')\n        const dropstartEl = fixtureEl.querySelector('.dropstart')\n        const dropdown = new Dropdown(btnDropdown)\n\n        dropstartEl.addEventListener('shown.bs.dropdown', () => {\n          expect(btnDropdown).toHaveClass('show')\n          expect(btnDropdown.getAttribute('aria-expanded')).toEqual('true')\n          resolve()\n        })\n\n        dropdown.toggle()\n      })\n    })\n\n    it('should toggle a dropdown with parent reference', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div class=\"dropdown\">',\n          '  <button class=\"btn dropdown-toggle\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">Dropdown</button>',\n          '  <div class=\"dropdown-menu\">',\n          '    <a class=\"dropdown-item\" href=\"#\">Secondary link</a>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const btnDropdown = fixtureEl.querySelector('[data-bs-toggle=\"dropdown\"]')\n        const dropdown = new Dropdown(btnDropdown, {\n          reference: 'parent'\n        })\n\n        btnDropdown.addEventListener('shown.bs.dropdown', () => {\n          expect(btnDropdown).toHaveClass('show')\n          expect(btnDropdown.getAttribute('aria-expanded')).toEqual('true')\n          resolve()\n        })\n\n        dropdown.toggle()\n      })\n    })\n\n    it('should toggle a dropdown with a dom node reference', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div class=\"dropdown\">',\n          '  <button class=\"btn dropdown-toggle\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">Dropdown</button>',\n          '  <div class=\"dropdown-menu\">',\n          '    <a class=\"dropdown-item\" href=\"#\">Secondary link</a>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const btnDropdown = fixtureEl.querySelector('[data-bs-toggle=\"dropdown\"]')\n        const dropdown = new Dropdown(btnDropdown, {\n          reference: fixtureEl\n        })\n\n        btnDropdown.addEventListener('shown.bs.dropdown', () => {\n          expect(btnDropdown).toHaveClass('show')\n          expect(btnDropdown.getAttribute('aria-expanded')).toEqual('true')\n          resolve()\n        })\n\n        dropdown.toggle()\n      })\n    })\n\n    it('should toggle a dropdown with a jquery object reference', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div class=\"dropdown\">',\n          '  <button class=\"btn dropdown-toggle\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">Dropdown</button>',\n          '  <div class=\"dropdown-menu\">',\n          '    <a class=\"dropdown-item\" href=\"#\">Secondary link</a>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const btnDropdown = fixtureEl.querySelector('[data-bs-toggle=\"dropdown\"]')\n        const dropdown = new Dropdown(btnDropdown, {\n          reference: { 0: fixtureEl, jquery: 'jQuery' }\n        })\n\n        btnDropdown.addEventListener('shown.bs.dropdown', () => {\n          expect(btnDropdown).toHaveClass('show')\n          expect(btnDropdown.getAttribute('aria-expanded')).toEqual('true')\n          resolve()\n        })\n\n        dropdown.toggle()\n      })\n    })\n\n    it('should toggle a dropdown with a valid virtual element reference', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div class=\"dropdown\">',\n          '  <button class=\"btn dropdown-toggle visually-hidden\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">Dropdown</button>',\n          '  <div class=\"dropdown-menu\">',\n          '    <a class=\"dropdown-item\" href=\"#\">Secondary link</a>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const btnDropdown = fixtureEl.querySelector('[data-bs-toggle=\"dropdown\"]')\n        const virtualElement = {\n          nodeType: 1,\n          getBoundingClientRect() {\n            return {\n              width: 0,\n              height: 0,\n              top: 0,\n              right: 0,\n              bottom: 0,\n              left: 0\n            }\n          }\n        }\n\n        expect(() => new Dropdown(btnDropdown, {\n          reference: {}\n        })).toThrowError(TypeError, 'DROPDOWN: Option \"reference\" provided type \"object\" without a required \"getBoundingClientRect\" method.')\n\n        expect(() => new Dropdown(btnDropdown, {\n          reference: {\n            getBoundingClientRect: 'not-a-function'\n          }\n        })).toThrowError(TypeError, 'DROPDOWN: Option \"reference\" provided type \"object\" without a required \"getBoundingClientRect\" method.')\n\n        // use onFirstUpdate as Poppers internal update is executed async\n        const dropdown = new Dropdown(btnDropdown, {\n          reference: virtualElement,\n          popperConfig: {\n            onFirstUpdate() {\n              expect(spy).toHaveBeenCalled()\n              expect(btnDropdown).toHaveClass('show')\n              expect(btnDropdown.getAttribute('aria-expanded')).toEqual('true')\n              resolve()\n            }\n          }\n        })\n\n        const spy = spyOn(virtualElement, 'getBoundingClientRect').and.callThrough()\n\n        dropdown.toggle()\n      })\n    })\n\n    it('should not toggle a dropdown if the element is disabled', () => {\n      return new Promise((resolve, reject) => {\n        fixtureEl.innerHTML = [\n          '<div class=\"dropdown\">',\n          '  <button disabled class=\"btn dropdown-toggle\" data-bs-toggle=\"dropdown\">Dropdown</button>',\n          '  <div class=\"dropdown-menu\">',\n          '    <a class=\"dropdown-item\" href=\"#\">Secondary link</a>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const btnDropdown = fixtureEl.querySelector('[data-bs-toggle=\"dropdown\"]')\n        const dropdown = new Dropdown(btnDropdown)\n\n        btnDropdown.addEventListener('shown.bs.dropdown', () => {\n          reject(new Error('should not throw shown.bs.dropdown event'))\n        })\n\n        dropdown.toggle()\n\n        setTimeout(() => {\n          expect().nothing()\n          resolve()\n        })\n      })\n    })\n\n    it('should not toggle a dropdown if the element contains .disabled', () => {\n      return new Promise((resolve, reject) => {\n        fixtureEl.innerHTML = [\n          '<div class=\"dropdown\">',\n          '  <button class=\"btn dropdown-toggle disabled\" data-bs-toggle=\"dropdown\">Dropdown</button>',\n          '  <div class=\"dropdown-menu\">',\n          '    <a class=\"dropdown-item\" href=\"#\">Secondary link</a>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const btnDropdown = fixtureEl.querySelector('[data-bs-toggle=\"dropdown\"]')\n        const dropdown = new Dropdown(btnDropdown)\n\n        btnDropdown.addEventListener('shown.bs.dropdown', () => {\n          reject(new Error('should not throw shown.bs.dropdown event'))\n        })\n\n        dropdown.toggle()\n\n        setTimeout(() => {\n          expect().nothing()\n          resolve()\n        })\n      })\n    })\n\n    it('should not toggle a dropdown if the menu is shown', () => {\n      return new Promise((resolve, reject) => {\n        fixtureEl.innerHTML = [\n          '<div class=\"dropdown\">',\n          '  <button class=\"btn dropdown-toggle\" data-bs-toggle=\"dropdown\">Dropdown</button>',\n          '  <div class=\"dropdown-menu show\">',\n          '    <a class=\"dropdown-item\" href=\"#\">Secondary link</a>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const btnDropdown = fixtureEl.querySelector('[data-bs-toggle=\"dropdown\"]')\n        const dropdown = new Dropdown(btnDropdown)\n\n        btnDropdown.addEventListener('shown.bs.dropdown', () => {\n          reject(new Error('should not throw shown.bs.dropdown event'))\n        })\n\n        dropdown.toggle()\n\n        setTimeout(() => {\n          expect().nothing()\n          resolve()\n        })\n      })\n    })\n\n    it('should not toggle a dropdown if show event is prevented', () => {\n      return new Promise((resolve, reject) => {\n        fixtureEl.innerHTML = [\n          '<div class=\"dropdown\">',\n          '  <button class=\"btn dropdown-toggle\" data-bs-toggle=\"dropdown\">Dropdown</button>',\n          '  <div class=\"dropdown-menu\">',\n          '    <a class=\"dropdown-item\" href=\"#\">Secondary link</a>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const btnDropdown = fixtureEl.querySelector('[data-bs-toggle=\"dropdown\"]')\n        const dropdown = new Dropdown(btnDropdown)\n\n        btnDropdown.addEventListener('show.bs.dropdown', event => {\n          event.preventDefault()\n        })\n\n        btnDropdown.addEventListener('shown.bs.dropdown', () => {\n          reject(new Error('should not throw shown.bs.dropdown event'))\n        })\n\n        dropdown.toggle()\n\n        setTimeout(() => {\n          expect().nothing()\n          resolve()\n        })\n      })\n    })\n  })\n\n  describe('show', () => {\n    it('should show a dropdown', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div class=\"dropdown\">',\n          '  <button class=\"btn dropdown-toggle\" data-bs-toggle=\"dropdown\">Dropdown</button>',\n          '  <div class=\"dropdown-menu\">',\n          '    <a class=\"dropdown-item\" href=\"#\">Secondary link</a>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const btnDropdown = fixtureEl.querySelector('[data-bs-toggle=\"dropdown\"]')\n        const dropdown = new Dropdown(btnDropdown)\n\n        btnDropdown.addEventListener('shown.bs.dropdown', () => {\n          expect(btnDropdown).toHaveClass('show')\n          resolve()\n        })\n\n        dropdown.show()\n      })\n    })\n\n    it('should not show a dropdown if the element is disabled', () => {\n      return new Promise((resolve, reject) => {\n        fixtureEl.innerHTML = [\n          '<div class=\"dropdown\">',\n          '  <button disabled class=\"btn dropdown-toggle\" data-bs-toggle=\"dropdown\">Dropdown</button>',\n          '  <div class=\"dropdown-menu\">',\n          '    <a class=\"dropdown-item\" href=\"#\">Secondary link</a>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const btnDropdown = fixtureEl.querySelector('[data-bs-toggle=\"dropdown\"]')\n        const dropdown = new Dropdown(btnDropdown)\n\n        btnDropdown.addEventListener('shown.bs.dropdown', () => {\n          reject(new Error('should not throw shown.bs.dropdown event'))\n        })\n\n        dropdown.show()\n\n        setTimeout(() => {\n          expect().nothing()\n          resolve()\n        }, 10)\n      })\n    })\n\n    it('should not show a dropdown if the element contains .disabled', () => {\n      return new Promise((resolve, reject) => {\n        fixtureEl.innerHTML = [\n          '<div class=\"dropdown\">',\n          '  <button class=\"btn dropdown-toggle disabled\" data-bs-toggle=\"dropdown\">Dropdown</button>',\n          '  <div class=\"dropdown-menu\">',\n          '    <a class=\"dropdown-item\" href=\"#\">Secondary link</a>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const btnDropdown = fixtureEl.querySelector('[data-bs-toggle=\"dropdown\"]')\n        const dropdown = new Dropdown(btnDropdown)\n\n        btnDropdown.addEventListener('shown.bs.dropdown', () => {\n          reject(new Error('should not throw shown.bs.dropdown event'))\n        })\n\n        dropdown.show()\n\n        setTimeout(() => {\n          expect().nothing()\n          resolve()\n        }, 10)\n      })\n    })\n\n    it('should not show a dropdown if the menu is shown', () => {\n      return new Promise((resolve, reject) => {\n        fixtureEl.innerHTML = [\n          '<div class=\"dropdown\">',\n          '  <button class=\"btn dropdown-toggle\" data-bs-toggle=\"dropdown\">Dropdown</button>',\n          '  <div class=\"dropdown-menu show\">',\n          '    <a class=\"dropdown-item\" href=\"#\">Secondary link</a>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const btnDropdown = fixtureEl.querySelector('[data-bs-toggle=\"dropdown\"]')\n        const dropdown = new Dropdown(btnDropdown)\n\n        btnDropdown.addEventListener('shown.bs.dropdown', () => {\n          reject(new Error('should not throw shown.bs.dropdown event'))\n        })\n\n        dropdown.show()\n\n        setTimeout(() => {\n          expect().nothing()\n          resolve()\n        }, 10)\n      })\n    })\n\n    it('should not show a dropdown if show event is prevented', () => {\n      return new Promise((resolve, reject) => {\n        fixtureEl.innerHTML = [\n          '<div class=\"dropdown\">',\n          '  <button class=\"btn dropdown-toggle\" data-bs-toggle=\"dropdown\">Dropdown</button>',\n          '  <div class=\"dropdown-menu\">',\n          '    <a class=\"dropdown-item\" href=\"#\">Secondary link</a>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const btnDropdown = fixtureEl.querySelector('[data-bs-toggle=\"dropdown\"]')\n        const dropdown = new Dropdown(btnDropdown)\n\n        btnDropdown.addEventListener('show.bs.dropdown', event => {\n          event.preventDefault()\n        })\n\n        btnDropdown.addEventListener('shown.bs.dropdown', () => {\n          reject(new Error('should not throw shown.bs.dropdown event'))\n        })\n\n        dropdown.show()\n\n        setTimeout(() => {\n          expect().nothing()\n          resolve()\n        }, 10)\n      })\n    })\n  })\n\n  describe('hide', () => {\n    it('should hide a dropdown', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div class=\"dropdown\">',\n          '  <button class=\"btn dropdown-toggle\" data-bs-toggle=\"dropdown\" aria-expanded=\"true\">Dropdown</button>',\n          '  <div class=\"dropdown-menu show\">',\n          '    <a class=\"dropdown-item\" href=\"#\">Secondary link</a>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const btnDropdown = fixtureEl.querySelector('[data-bs-toggle=\"dropdown\"]')\n        const dropdownMenu = fixtureEl.querySelector('.dropdown-menu')\n        const dropdown = new Dropdown(btnDropdown)\n\n        btnDropdown.addEventListener('hidden.bs.dropdown', () => {\n          expect(dropdownMenu).not.toHaveClass('show')\n          expect(btnDropdown.getAttribute('aria-expanded')).toEqual('false')\n          resolve()\n        })\n\n        dropdown.hide()\n      })\n    })\n\n    it('should hide a dropdown and destroy popper', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div class=\"dropdown\">',\n          '  <button class=\"btn dropdown-toggle\" data-bs-toggle=\"dropdown\">Dropdown</button>',\n          '  <div class=\"dropdown-menu\">',\n          '    <a class=\"dropdown-item\" href=\"#\">Secondary link</a>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const btnDropdown = fixtureEl.querySelector('[data-bs-toggle=\"dropdown\"]')\n        const dropdown = new Dropdown(btnDropdown)\n\n        btnDropdown.addEventListener('shown.bs.dropdown', () => {\n          spyOn(dropdown._popper, 'destroy')\n          dropdown.hide()\n        })\n\n        btnDropdown.addEventListener('hidden.bs.dropdown', () => {\n          expect(dropdown._popper.destroy).toHaveBeenCalled()\n          resolve()\n        })\n\n        dropdown.show()\n      })\n    })\n\n    it('should not hide a dropdown if the element is disabled', () => {\n      return new Promise((resolve, reject) => {\n        fixtureEl.innerHTML = [\n          '<div class=\"dropdown\">',\n          '  <button disabled class=\"btn dropdown-toggle\" data-bs-toggle=\"dropdown\">Dropdown</button>',\n          '  <div class=\"dropdown-menu show\">',\n          '    <a class=\"dropdown-item\" href=\"#\">Secondary link</a>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const btnDropdown = fixtureEl.querySelector('[data-bs-toggle=\"dropdown\"]')\n        const dropdownMenu = fixtureEl.querySelector('.dropdown-menu')\n        const dropdown = new Dropdown(btnDropdown)\n\n        btnDropdown.addEventListener('hidden.bs.dropdown', () => {\n          reject(new Error('should not throw hidden.bs.dropdown event'))\n        })\n\n        dropdown.hide()\n\n        setTimeout(() => {\n          expect(dropdownMenu).toHaveClass('show')\n          resolve()\n        }, 10)\n      })\n    })\n\n    it('should not hide a dropdown if the element contains .disabled', () => {\n      return new Promise((resolve, reject) => {\n        fixtureEl.innerHTML = [\n          '<div class=\"dropdown\">',\n          '  <button class=\"btn dropdown-toggle disabled\" data-bs-toggle=\"dropdown\">Dropdown</button>',\n          '  <div class=\"dropdown-menu show\">',\n          '    <a class=\"dropdown-item\" href=\"#\">Secondary link</a>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const btnDropdown = fixtureEl.querySelector('[data-bs-toggle=\"dropdown\"]')\n        const dropdownMenu = fixtureEl.querySelector('.dropdown-menu')\n        const dropdown = new Dropdown(btnDropdown)\n\n        btnDropdown.addEventListener('hidden.bs.dropdown', () => {\n          reject(new Error('should not throw hidden.bs.dropdown event'))\n        })\n\n        dropdown.hide()\n\n        setTimeout(() => {\n          expect(dropdownMenu).toHaveClass('show')\n          resolve()\n        }, 10)\n      })\n    })\n\n    it('should not hide a dropdown if the menu is not shown', () => {\n      return new Promise((resolve, reject) => {\n        fixtureEl.innerHTML = [\n          '<div class=\"dropdown\">',\n          '  <button class=\"btn dropdown-toggle\" data-bs-toggle=\"dropdown\">Dropdown</button>',\n          '  <div class=\"dropdown-menu\">',\n          '    <a class=\"dropdown-item\" href=\"#\">Secondary link</a>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const btnDropdown = fixtureEl.querySelector('[data-bs-toggle=\"dropdown\"]')\n        const dropdown = new Dropdown(btnDropdown)\n\n        btnDropdown.addEventListener('hidden.bs.dropdown', () => {\n          reject(new Error('should not throw hidden.bs.dropdown event'))\n        })\n\n        dropdown.hide()\n\n        setTimeout(() => {\n          expect().nothing()\n          resolve()\n        }, 10)\n      })\n    })\n\n    it('should not hide a dropdown if hide event is prevented', () => {\n      return new Promise((resolve, reject) => {\n        fixtureEl.innerHTML = [\n          '<div class=\"dropdown\">',\n          '  <button class=\"btn dropdown-toggle\" data-bs-toggle=\"dropdown\">Dropdown</button>',\n          '  <div class=\"dropdown-menu show\">',\n          '    <a class=\"dropdown-item\" href=\"#\">Secondary link</a>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const btnDropdown = fixtureEl.querySelector('[data-bs-toggle=\"dropdown\"]')\n        const dropdownMenu = fixtureEl.querySelector('.dropdown-menu')\n        const dropdown = new Dropdown(btnDropdown)\n\n        btnDropdown.addEventListener('hide.bs.dropdown', event => {\n          event.preventDefault()\n        })\n\n        btnDropdown.addEventListener('hidden.bs.dropdown', () => {\n          reject(new Error('should not throw hidden.bs.dropdown event'))\n        })\n\n        dropdown.hide()\n\n        setTimeout(() => {\n          expect(dropdownMenu).toHaveClass('show')\n          resolve()\n        })\n      })\n    })\n\n    it('should remove event listener on touch-enabled device that was added in show method', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div class=\"dropdown\">',\n          '  <button class=\"btn dropdown-toggle\" data-bs-toggle=\"dropdown\">Dropdown</button>',\n          '  <div class=\"dropdown-menu\">',\n          '    <a class=\"dropdown-item\" href=\"#\">Dropdown item</a>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const defaultValueOnTouchStart = document.documentElement.ontouchstart\n        const btnDropdown = fixtureEl.querySelector('[data-bs-toggle=\"dropdown\"]')\n        const dropdown = new Dropdown(btnDropdown)\n\n        document.documentElement.ontouchstart = noop\n        const spy = spyOn(EventHandler, 'off')\n\n        btnDropdown.addEventListener('shown.bs.dropdown', () => {\n          dropdown.hide()\n        })\n\n        btnDropdown.addEventListener('hidden.bs.dropdown', () => {\n          expect(btnDropdown).not.toHaveClass('show')\n          expect(btnDropdown.getAttribute('aria-expanded')).toEqual('false')\n          expect(spy).toHaveBeenCalled()\n\n          document.documentElement.ontouchstart = defaultValueOnTouchStart\n          resolve()\n        })\n\n        dropdown.show()\n      })\n    })\n  })\n\n  describe('dispose', () => {\n    it('should dispose dropdown', () => {\n      fixtureEl.innerHTML = [\n        '<div class=\"dropdown\">',\n        '  <button class=\"btn dropdown-toggle\" data-bs-toggle=\"dropdown\">Dropdown</button>',\n        '  <div class=\"dropdown-menu\">',\n        '    <a class=\"dropdown-item\" href=\"#\">Secondary link</a>',\n        '  </div>',\n        '</div>'\n      ].join('')\n\n      const btnDropdown = fixtureEl.querySelector('[data-bs-toggle=\"dropdown\"]')\n\n      const dropdown = new Dropdown(btnDropdown)\n\n      expect(dropdown._popper).toBeNull()\n      expect(dropdown._menu).not.toBeNull()\n      expect(dropdown._element).not.toBeNull()\n      const spy = spyOn(EventHandler, 'off')\n\n      dropdown.dispose()\n\n      expect(dropdown._menu).toBeNull()\n      expect(dropdown._element).toBeNull()\n      expect(spy).toHaveBeenCalledWith(btnDropdown, Dropdown.EVENT_KEY)\n    })\n\n    it('should dispose dropdown with Popper', () => {\n      fixtureEl.innerHTML = [\n        '<div class=\"dropdown\">',\n        '  <button class=\"btn dropdown-toggle\" data-bs-toggle=\"dropdown\">Dropdown</button>',\n        '  <div class=\"dropdown-menu\">',\n        '    <a class=\"dropdown-item\" href=\"#\">Secondary link</a>',\n        '  </div>',\n        '</div>'\n      ].join('')\n\n      const btnDropdown = fixtureEl.querySelector('[data-bs-toggle=\"dropdown\"]')\n      const dropdown = new Dropdown(btnDropdown)\n\n      dropdown.toggle()\n\n      expect(dropdown._popper).not.toBeNull()\n      expect(dropdown._menu).not.toBeNull()\n      expect(dropdown._element).not.toBeNull()\n\n      dropdown.dispose()\n\n      expect(dropdown._popper).toBeNull()\n      expect(dropdown._menu).toBeNull()\n      expect(dropdown._element).toBeNull()\n    })\n  })\n\n  describe('update', () => {\n    it('should call Popper and detect navbar on update', () => {\n      fixtureEl.innerHTML = [\n        '<div class=\"dropdown\">',\n        '  <button class=\"btn dropdown-toggle\" data-bs-toggle=\"dropdown\">Dropdown</button>',\n        '  <div class=\"dropdown-menu\">',\n        '    <a class=\"dropdown-item\" href=\"#\">Secondary link</a>',\n        '  </div>',\n        '</div>'\n      ].join('')\n\n      const btnDropdown = fixtureEl.querySelector('[data-bs-toggle=\"dropdown\"]')\n      const dropdown = new Dropdown(btnDropdown)\n\n      dropdown.toggle()\n\n      expect(dropdown._popper).not.toBeNull()\n\n      const spyUpdate = spyOn(dropdown._popper, 'update')\n      const spyDetect = spyOn(dropdown, '_detectNavbar')\n\n      dropdown.update()\n\n      expect(spyUpdate).toHaveBeenCalled()\n      expect(spyDetect).toHaveBeenCalled()\n    })\n\n    it('should just detect navbar on update', () => {\n      fixtureEl.innerHTML = [\n        '<div class=\"dropdown\">',\n        '  <button class=\"btn dropdown-toggle\" data-bs-toggle=\"dropdown\">Dropdown</button>',\n        '  <div class=\"dropdown-menu\">',\n        '    <a class=\"dropdown-item\" href=\"#\">Secondary link</a>',\n        '  </div>',\n        '</div>'\n      ].join('')\n\n      const btnDropdown = fixtureEl.querySelector('[data-bs-toggle=\"dropdown\"]')\n      const dropdown = new Dropdown(btnDropdown)\n\n      const spy = spyOn(dropdown, '_detectNavbar')\n\n      dropdown.update()\n\n      expect(dropdown._popper).toBeNull()\n      expect(spy).toHaveBeenCalled()\n    })\n  })\n\n  describe('data-api', () => {\n    it('should show and hide a dropdown', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div class=\"dropdown\">',\n          '  <button class=\"btn dropdown-toggle\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">Dropdown</button>',\n          '  <div class=\"dropdown-menu\">',\n          '    <a class=\"dropdown-item\" href=\"#\">Secondary link</a>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const btnDropdown = fixtureEl.querySelector('[data-bs-toggle=\"dropdown\"]')\n        let showEventTriggered = false\n        let hideEventTriggered = false\n\n        btnDropdown.addEventListener('show.bs.dropdown', () => {\n          showEventTriggered = true\n        })\n\n        btnDropdown.addEventListener('shown.bs.dropdown', event => setTimeout(() => {\n          expect(btnDropdown).toHaveClass('show')\n          expect(btnDropdown.getAttribute('aria-expanded')).toEqual('true')\n          expect(showEventTriggered).toBeTrue()\n          expect(event.relatedTarget).toEqual(btnDropdown)\n          document.body.click()\n        }))\n\n        btnDropdown.addEventListener('hide.bs.dropdown', () => {\n          hideEventTriggered = true\n        })\n\n        btnDropdown.addEventListener('hidden.bs.dropdown', event => {\n          expect(btnDropdown).not.toHaveClass('show')\n          expect(btnDropdown.getAttribute('aria-expanded')).toEqual('false')\n          expect(hideEventTriggered).toBeTrue()\n          expect(event.relatedTarget).toEqual(btnDropdown)\n          resolve()\n        })\n\n        btnDropdown.click()\n      })\n    })\n\n    it('should not use \"static\" Popper in navbar', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<nav class=\"navbar navbar-expand-md bg-light\">',\n          '  <div class=\"dropdown\">',\n          '    <button class=\"btn dropdown-toggle\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">Dropdown</button>',\n          '    <div class=\"dropdown-menu\">',\n          '      <a class=\"dropdown-item\" href=\"#\">Secondary link</a>',\n          '    </div>',\n          '  </div>',\n          '</nav>'\n        ].join('')\n\n        const btnDropdown = fixtureEl.querySelector('[data-bs-toggle=\"dropdown\"]')\n        const dropdownMenu = fixtureEl.querySelector('.dropdown-menu')\n        const dropdown = new Dropdown(btnDropdown)\n\n        btnDropdown.addEventListener('shown.bs.dropdown', () => {\n          expect(dropdown._popper).not.toBeNull()\n          expect(dropdownMenu.getAttribute('data-bs-popper')).toEqual('static')\n          resolve()\n        })\n\n        dropdown.show()\n      })\n    })\n\n    it('should not collapse the dropdown when clicking a select option nested in the dropdown', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div class=\"dropdown\">',\n          '  <button class=\"btn dropdown-toggle\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">Dropdown</button>',\n          '  <div class=\"dropdown-menu\">',\n          '    <select>',\n          '      <option selected>Open this select menu</option>',\n          '      <option value=\"1\">One</option>',\n          '    </select>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const btnDropdown = fixtureEl.querySelector('[data-bs-toggle=\"dropdown\"]')\n        const dropdownMenu = fixtureEl.querySelector('.dropdown-menu')\n        const dropdown = new Dropdown(btnDropdown)\n\n        const hideSpy = spyOn(dropdown, '_completeHide')\n\n        btnDropdown.addEventListener('shown.bs.dropdown', () => {\n          const clickEvent = new MouseEvent('click', {\n            bubbles: true\n          })\n\n          dropdownMenu.querySelector('option').dispatchEvent(clickEvent)\n        })\n\n        dropdownMenu.addEventListener('click', event => {\n          expect(event.target.tagName).toMatch(/select|option/i)\n\n          Dropdown.clearMenus(event)\n\n          setTimeout(() => {\n            expect(hideSpy).not.toHaveBeenCalled()\n            resolve()\n          }, 10)\n        })\n\n        dropdown.show()\n      })\n    })\n\n    it('should manage bs attribute `data-bs-popper`=\"static\" when dropdown is in navbar', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<nav class=\"navbar navbar-expand-md bg-light\">',\n          '  <div class=\"dropdown\">',\n          '    <button class=\"btn dropdown-toggle\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">Dropdown</button>',\n          '    <div class=\"dropdown-menu\">',\n          '      <a class=\"dropdown-item\" href=\"#\">Secondary link</a>',\n          '    </div>',\n          '  </div>',\n          '</nav>'\n        ].join('')\n\n        const btnDropdown = fixtureEl.querySelector('[data-bs-toggle=\"dropdown\"]')\n        const dropdownMenu = fixtureEl.querySelector('.dropdown-menu')\n        const dropdown = new Dropdown(btnDropdown)\n\n        btnDropdown.addEventListener('shown.bs.dropdown', () => {\n          expect(dropdownMenu.getAttribute('data-bs-popper')).toEqual('static')\n          dropdown.hide()\n        })\n\n        btnDropdown.addEventListener('hidden.bs.dropdown', () => {\n          expect(dropdownMenu.getAttribute('data-bs-popper')).toBeNull()\n          resolve()\n        })\n\n        dropdown.show()\n      })\n    })\n\n    it('should not use Popper if display set to static', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div class=\"dropdown\">',\n          '  <button class=\"btn dropdown-toggle\" data-bs-toggle=\"dropdown\" data-bs-display=\"static\">Dropdown</button>',\n          '  <div class=\"dropdown-menu\">',\n          '    <a class=\"dropdown-item\" href=\"#\">Secondary link</a>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const btnDropdown = fixtureEl.querySelector('[data-bs-toggle=\"dropdown\"]')\n        const dropdownMenu = fixtureEl.querySelector('.dropdown-menu')\n\n        btnDropdown.addEventListener('shown.bs.dropdown', () => {\n          // Popper adds this attribute when we use it\n          expect(dropdownMenu.getAttribute('data-popper-placement')).toBeNull()\n          resolve()\n        })\n\n        btnDropdown.click()\n      })\n    })\n\n    it('should manage bs attribute `data-bs-popper`=\"static\" when display set to static', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div class=\"dropdown\">',\n          '  <button class=\"btn dropdown-toggle\" data-bs-toggle=\"dropdown\" data-bs-display=\"static\">Dropdown</button>',\n          '  <div class=\"dropdown-menu\">',\n          '    <a class=\"dropdown-item\" href=\"#\">Secondary link</a>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const btnDropdown = fixtureEl.querySelector('[data-bs-toggle=\"dropdown\"]')\n        const dropdownMenu = fixtureEl.querySelector('.dropdown-menu')\n        const dropdown = new Dropdown(btnDropdown)\n\n        btnDropdown.addEventListener('shown.bs.dropdown', () => {\n          expect(dropdownMenu.getAttribute('data-bs-popper')).toEqual('static')\n          dropdown.hide()\n        })\n\n        btnDropdown.addEventListener('hidden.bs.dropdown', () => {\n          expect(dropdownMenu.getAttribute('data-bs-popper')).toBeNull()\n          resolve()\n        })\n\n        dropdown.show()\n      })\n    })\n\n    it('should remove \"show\" class if tabbing outside of menu', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div class=\"dropdown\">',\n          '  <button class=\"btn dropdown-toggle\" data-bs-toggle=\"dropdown\">Dropdown</button>',\n          '  <div class=\"dropdown-menu\">',\n          '    <a class=\"dropdown-item\" href=\"#\">Secondary link</a>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const btnDropdown = fixtureEl.querySelector('[data-bs-toggle=\"dropdown\"]')\n\n        btnDropdown.addEventListener('shown.bs.dropdown', () => {\n          expect(btnDropdown).toHaveClass('show')\n\n          const keyup = createEvent('keyup')\n\n          keyup.key = 'Tab'\n          document.dispatchEvent(keyup)\n        })\n\n        btnDropdown.addEventListener('hidden.bs.dropdown', () => {\n          expect(btnDropdown).not.toHaveClass('show')\n          resolve()\n        })\n\n        btnDropdown.click()\n      })\n    })\n\n    it('should remove \"show\" class if body is clicked, with multiple dropdowns', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div class=\"nav\">',\n          '  <div class=\"dropdown\" id=\"testmenu\">',\n          '    <a class=\"dropdown-toggle\" data-bs-toggle=\"dropdown\" href=\"#testmenu\">Test menu</a>',\n          '    <div class=\"dropdown-menu\">',\n          '      <a class=\"dropdown-item\" href=\"#sub1\">Submenu 1</a>',\n          '    </div>',\n          '  </div>',\n          '</div>',\n          '<div class=\"btn-group\">',\n          '  <button class=\"btn\">Actions</button>',\n          '  <button class=\"btn dropdown-toggle\" data-bs-toggle=\"dropdown\"></button>',\n          '  <div class=\"dropdown-menu\">',\n          '    <a class=\"dropdown-item\" href=\"#\">Action 1</a>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const triggerDropdownList = fixtureEl.querySelectorAll('[data-bs-toggle=\"dropdown\"]')\n\n        expect(triggerDropdownList).toHaveSize(2)\n\n        const [triggerDropdownFirst, triggerDropdownLast] = triggerDropdownList\n\n        triggerDropdownFirst.addEventListener('shown.bs.dropdown', () => {\n          expect(triggerDropdownFirst).toHaveClass('show')\n          expect(fixtureEl.querySelectorAll('.dropdown-menu.show')).toHaveSize(1)\n          document.body.click()\n        })\n\n        triggerDropdownFirst.addEventListener('hidden.bs.dropdown', () => {\n          expect(fixtureEl.querySelectorAll('.dropdown-menu.show')).toHaveSize(0)\n          triggerDropdownLast.click()\n        })\n\n        triggerDropdownLast.addEventListener('shown.bs.dropdown', () => {\n          expect(triggerDropdownLast).toHaveClass('show')\n          expect(fixtureEl.querySelectorAll('.dropdown-menu.show')).toHaveSize(1)\n          document.body.click()\n        })\n\n        triggerDropdownLast.addEventListener('hidden.bs.dropdown', () => {\n          expect(fixtureEl.querySelectorAll('.dropdown-menu.show')).toHaveSize(0)\n          resolve()\n        })\n\n        triggerDropdownFirst.click()\n      })\n    })\n\n    it('should remove \"show\" class if body if tabbing outside of menu, with multiple dropdowns', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div class=\"dropdown\">',\n          '  <a class=\"dropdown-toggle\" data-bs-toggle=\"dropdown\" href=\"#testmenu\">Test menu</a>',\n          '  <div class=\"dropdown-menu\">',\n          '    <a class=\"dropdown-item\" href=\"#sub1\">Submenu 1</a>',\n          '  </div>',\n          '</div>',\n          '<div class=\"btn-group\">',\n          '  <button class=\"btn\">Actions</button>',\n          '  <button class=\"btn dropdown-toggle\" data-bs-toggle=\"dropdown\"></button>',\n          '  <div class=\"dropdown-menu\">',\n          '    <a class=\"dropdown-item\" href=\"#\">Action 1</a>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const triggerDropdownList = fixtureEl.querySelectorAll('[data-bs-toggle=\"dropdown\"]')\n\n        expect(triggerDropdownList).toHaveSize(2)\n\n        const [triggerDropdownFirst, triggerDropdownLast] = triggerDropdownList\n\n        triggerDropdownFirst.addEventListener('shown.bs.dropdown', () => {\n          expect(triggerDropdownFirst).toHaveClass('show')\n          expect(fixtureEl.querySelectorAll('.dropdown-menu.show')).toHaveSize(1)\n\n          const keyup = createEvent('keyup')\n          keyup.key = 'Tab'\n\n          document.dispatchEvent(keyup)\n        })\n\n        triggerDropdownFirst.addEventListener('hidden.bs.dropdown', () => {\n          expect(fixtureEl.querySelectorAll('.dropdown-menu.show')).toHaveSize(0)\n          triggerDropdownLast.click()\n        })\n\n        triggerDropdownLast.addEventListener('shown.bs.dropdown', () => {\n          expect(triggerDropdownLast).toHaveClass('show')\n          expect(fixtureEl.querySelectorAll('.dropdown-menu.show')).toHaveSize(1)\n\n          const keyup = createEvent('keyup')\n          keyup.key = 'Tab'\n\n          document.dispatchEvent(keyup)\n        })\n\n        triggerDropdownLast.addEventListener('hidden.bs.dropdown', () => {\n          expect(fixtureEl.querySelectorAll('.dropdown-menu.show')).toHaveSize(0)\n          resolve()\n        })\n\n        triggerDropdownFirst.click()\n      })\n    })\n\n    it('should be able to identify clicked dropdown, even with multiple dropdowns in the same tag', () => {\n      fixtureEl.innerHTML = [\n        '<div class=\"dropdown\">',\n        '  <button id=\"dropdown1\" class=\"btn dropdown-toggle\" data-bs-toggle=\"dropdown\">Dropdown toggle</button>',\n        '  <div id=\"menu1\" class=\"dropdown-menu\">',\n        '    <a class=\"dropdown-item\" href=\"#\">Dropdown item</a>',\n        '  </div>',\n        '  <button id=\"dropdown2\" class=\"btn dropdown-toggle\" data-bs-toggle=\"dropdown\">Dropdown toggle</button>',\n        '  <div id=\"menu2\" class=\"dropdown-menu\">',\n        '    <a class=\"dropdown-item\" href=\"#\">Dropdown item</a>',\n        '  </div>',\n        '</div>'\n      ].join('')\n\n      const dropdownToggle1 = fixtureEl.querySelector('#dropdown1')\n      const dropdownToggle2 = fixtureEl.querySelector('#dropdown2')\n      const dropdownMenu1 = fixtureEl.querySelector('#menu1')\n      const dropdownMenu2 = fixtureEl.querySelector('#menu2')\n      const spy = spyOn(Dropdown, 'getOrCreateInstance').and.callThrough()\n\n      dropdownToggle1.click()\n      expect(spy).toHaveBeenCalledWith(dropdownToggle1)\n\n      dropdownToggle2.click()\n      expect(spy).toHaveBeenCalledWith(dropdownToggle2)\n\n      dropdownMenu1.click()\n      expect(spy).toHaveBeenCalledWith(dropdownToggle1)\n\n      dropdownMenu2.click()\n      expect(spy).toHaveBeenCalledWith(dropdownToggle2)\n    })\n\n    it('should be able to show the proper menu, even with multiple dropdowns in the same tag', () => {\n      fixtureEl.innerHTML = [\n        '<div class=\"dropdown\">',\n        '  <button id=\"dropdown1\" class=\"btn dropdown-toggle\" data-bs-toggle=\"dropdown\">Dropdown toggle</button>',\n        '  <div id=\"menu1\" class=\"dropdown-menu\">',\n        '    <a class=\"dropdown-item\" href=\"#\">Dropdown item</a>',\n        '  </div>',\n        '  <button id=\"dropdown2\" class=\"btn dropdown-toggle\" data-bs-toggle=\"dropdown\">Dropdown toggle</button>',\n        '  <div id=\"menu2\" class=\"dropdown-menu\">',\n        '    <a class=\"dropdown-item\" href=\"#\">Dropdown item</a>',\n        '  </div>',\n        '</div>'\n      ].join('')\n\n      const dropdownToggle1 = fixtureEl.querySelector('#dropdown1')\n      const dropdownToggle2 = fixtureEl.querySelector('#dropdown2')\n      const dropdownMenu1 = fixtureEl.querySelector('#menu1')\n      const dropdownMenu2 = fixtureEl.querySelector('#menu2')\n\n      dropdownToggle1.click()\n      expect(dropdownMenu1).toHaveClass('show')\n      expect(dropdownMenu2).not.toHaveClass('show')\n\n      dropdownToggle2.click()\n      expect(dropdownMenu1).not.toHaveClass('show')\n      expect(dropdownMenu2).toHaveClass('show')\n    })\n\n    it('should fire hide and hidden event without a clickEvent if event type is not click', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div class=\"dropdown\">',\n          '  <button class=\"btn dropdown-toggle\" data-bs-toggle=\"dropdown\">Dropdown</button>',\n          '  <div class=\"dropdown-menu\">',\n          '    <a class=\"dropdown-item\" href=\"#sub1\">Submenu 1</a>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const triggerDropdown = fixtureEl.querySelector('[data-bs-toggle=\"dropdown\"]')\n\n        triggerDropdown.addEventListener('hide.bs.dropdown', event => {\n          expect(event.clickEvent).toBeUndefined()\n        })\n\n        triggerDropdown.addEventListener('hidden.bs.dropdown', event => {\n          expect(event.clickEvent).toBeUndefined()\n          resolve()\n        })\n\n        triggerDropdown.addEventListener('shown.bs.dropdown', () => {\n          const keydown = createEvent('keydown')\n\n          keydown.key = 'Escape'\n          triggerDropdown.dispatchEvent(keydown)\n        })\n\n        triggerDropdown.click()\n      })\n    })\n\n    it('should bubble up the events to the parent elements', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div class=\"dropdown\">',\n          '  <button class=\"btn dropdown-toggle\" data-bs-toggle=\"dropdown\">Dropdown</button>',\n          '  <div class=\"dropdown-menu\">',\n          '    <a class=\"dropdown-item\" href=\"#subMenu\">Sub menu</a>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const triggerDropdown = fixtureEl.querySelector('[data-bs-toggle=\"dropdown\"]')\n        const dropdownParent = fixtureEl.querySelector('.dropdown')\n        const dropdown = new Dropdown(triggerDropdown)\n\n        const showFunction = jasmine.createSpy('showFunction')\n        dropdownParent.addEventListener('show.bs.dropdown', showFunction)\n\n        const shownFunction = jasmine.createSpy('shownFunction')\n        dropdownParent.addEventListener('shown.bs.dropdown', () => {\n          shownFunction()\n          dropdown.hide()\n        })\n\n        const hideFunction = jasmine.createSpy('hideFunction')\n        dropdownParent.addEventListener('hide.bs.dropdown', hideFunction)\n\n        dropdownParent.addEventListener('hidden.bs.dropdown', () => {\n          expect(showFunction).toHaveBeenCalled()\n          expect(shownFunction).toHaveBeenCalled()\n          expect(hideFunction).toHaveBeenCalled()\n          resolve()\n        })\n\n        dropdown.show()\n      })\n    })\n\n    it('should ignore keyboard events within <input>s and <textarea>s', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div class=\"dropdown\">',\n          '  <button class=\"btn dropdown-toggle\" data-bs-toggle=\"dropdown\">Dropdown</button>',\n          '  <div class=\"dropdown-menu\">',\n          '    <a class=\"dropdown-item\" href=\"#sub1\">Submenu 1</a>',\n          '    <input type=\"text\">',\n          '    <textarea></textarea>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const triggerDropdown = fixtureEl.querySelector('[data-bs-toggle=\"dropdown\"]')\n        const input = fixtureEl.querySelector('input')\n        const textarea = fixtureEl.querySelector('textarea')\n\n        triggerDropdown.addEventListener('shown.bs.dropdown', () => {\n          input.focus()\n          const keydown = createEvent('keydown')\n\n          keydown.key = 'ArrowUp'\n          input.dispatchEvent(keydown)\n\n          expect(document.activeElement).toEqual(input, 'input still focused')\n\n          textarea.focus()\n          textarea.dispatchEvent(keydown)\n\n          expect(document.activeElement).toEqual(textarea, 'textarea still focused')\n          resolve()\n        })\n\n        triggerDropdown.click()\n      })\n    })\n\n    it('should skip disabled element when using keyboard navigation', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div class=\"dropdown\">',\n          '  <button class=\"btn dropdown-toggle\" data-bs-toggle=\"dropdown\">Dropdown</button>',\n          '  <div class=\"dropdown-menu\">',\n          '    <a class=\"dropdown-item disabled\" href=\"#sub1\">Submenu 1</a>',\n          '    <button class=\"dropdown-item\" type=\"button\" disabled>Disabled button</button>',\n          '    <a id=\"item1\" class=\"dropdown-item\" href=\"#\">Another link</a>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const triggerDropdown = fixtureEl.querySelector('[data-bs-toggle=\"dropdown\"]')\n\n        triggerDropdown.addEventListener('shown.bs.dropdown', () => {\n          const keydown = createEvent('keydown')\n          keydown.key = 'ArrowDown'\n\n          triggerDropdown.dispatchEvent(keydown)\n          triggerDropdown.dispatchEvent(keydown)\n\n          expect(document.activeElement).not.toHaveClass('disabled')\n          expect(document.activeElement.hasAttribute('disabled')).toBeFalse()\n          resolve()\n        })\n\n        triggerDropdown.click()\n      })\n    })\n\n    it('should skip hidden element when using keyboard navigation', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<style>',\n          '  .d-none {',\n          '    display: none;',\n          '  }',\n          '</style>',\n          '<div class=\"dropdown\">',\n          '  <button class=\"btn dropdown-toggle\" data-bs-toggle=\"dropdown\">Dropdown</button>',\n          '  <div class=\"dropdown-menu\">',\n          '    <button class=\"dropdown-item d-none\" type=\"button\">Hidden button by class</button>',\n          '    <a class=\"dropdown-item\" href=\"#sub1\" style=\"display: none\">Hidden link</a>',\n          '    <a class=\"dropdown-item\" href=\"#sub1\" style=\"visibility: hidden\">Hidden link</a>',\n          '    <a id=\"item1\" class=\"dropdown-item\" href=\"#\">Another link</a>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const triggerDropdown = fixtureEl.querySelector('[data-bs-toggle=\"dropdown\"]')\n\n        triggerDropdown.addEventListener('shown.bs.dropdown', () => {\n          const keydown = createEvent('keydown')\n          keydown.key = 'ArrowDown'\n\n          triggerDropdown.dispatchEvent(keydown)\n\n          expect(document.activeElement).not.toHaveClass('d-none')\n          expect(document.activeElement.style.display).not.toEqual('none')\n          expect(document.activeElement.style.visibility).not.toEqual('hidden')\n\n          resolve()\n        })\n\n        triggerDropdown.click()\n      })\n    })\n\n    it('should focus next/previous element when using keyboard navigation', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div class=\"dropdown\">',\n          '  <button class=\"btn dropdown-toggle\" data-bs-toggle=\"dropdown\">Dropdown</button>',\n          '  <div class=\"dropdown-menu\">',\n          '    <a id=\"item1\" class=\"dropdown-item\" href=\"#\">A link</a>',\n          '    <a id=\"item2\" class=\"dropdown-item\" href=\"#\">Another link</a>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const triggerDropdown = fixtureEl.querySelector('[data-bs-toggle=\"dropdown\"]')\n        const item1 = fixtureEl.querySelector('#item1')\n        const item2 = fixtureEl.querySelector('#item2')\n\n        triggerDropdown.addEventListener('shown.bs.dropdown', () => {\n          const keydownArrowDown = createEvent('keydown')\n          keydownArrowDown.key = 'ArrowDown'\n\n          triggerDropdown.dispatchEvent(keydownArrowDown)\n          expect(document.activeElement).toEqual(item1, 'item1 is focused')\n\n          document.activeElement.dispatchEvent(keydownArrowDown)\n          expect(document.activeElement).toEqual(item2, 'item2 is focused')\n\n          const keydownArrowUp = createEvent('keydown')\n          keydownArrowUp.key = 'ArrowUp'\n\n          document.activeElement.dispatchEvent(keydownArrowUp)\n          expect(document.activeElement).toEqual(item1, 'item1 is focused')\n\n          resolve()\n        })\n\n        triggerDropdown.click()\n      })\n    })\n\n    it('should open the dropdown and focus on the last item when using ArrowUp for the first time', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div class=\"dropdown\">',\n          '  <button class=\"btn dropdown-toggle\" data-bs-toggle=\"dropdown\">Dropdown</button>',\n          '  <div class=\"dropdown-menu\">',\n          '    <a id=\"item1\" class=\"dropdown-item\" href=\"#\">A link</a>',\n          '    <a id=\"item2\" class=\"dropdown-item\" href=\"#\">Another link</a>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const triggerDropdown = fixtureEl.querySelector('[data-bs-toggle=\"dropdown\"]')\n        const lastItem = fixtureEl.querySelector('#item2')\n\n        triggerDropdown.addEventListener('shown.bs.dropdown', () => {\n          setTimeout(() => {\n            expect(document.activeElement).toEqual(lastItem, 'item2 is focused')\n            resolve()\n          })\n        })\n\n        const keydown = createEvent('keydown')\n        keydown.key = 'ArrowUp'\n        triggerDropdown.dispatchEvent(keydown)\n      })\n    })\n\n    it('should open the dropdown and focus on the first item when using ArrowDown for the first time', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div class=\"dropdown\">',\n          '  <button class=\"btn dropdown-toggle\" data-bs-toggle=\"dropdown\">Dropdown</button>',\n          '  <div class=\"dropdown-menu\">',\n          '    <a id=\"item1\" class=\"dropdown-item\" href=\"#\">A link</a>',\n          '    <a id=\"item2\" class=\"dropdown-item\" href=\"#\">Another link</a>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const triggerDropdown = fixtureEl.querySelector('[data-bs-toggle=\"dropdown\"]')\n        const firstItem = fixtureEl.querySelector('#item1')\n\n        triggerDropdown.addEventListener('shown.bs.dropdown', () => {\n          setTimeout(() => {\n            expect(document.activeElement).toEqual(firstItem, 'item1 is focused')\n            resolve()\n          })\n        })\n\n        const keydown = createEvent('keydown')\n        keydown.key = 'ArrowDown'\n        triggerDropdown.dispatchEvent(keydown)\n      })\n    })\n\n    it('should not close the dropdown if the user clicks on a text field within dropdown-menu', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div class=\"dropdown\">',\n          '  <button class=\"btn dropdown-toggle\" data-bs-toggle=\"dropdown\">Dropdown</button>',\n          '  <div class=\"dropdown-menu\">',\n          '    <input type=\"text\">',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const triggerDropdown = fixtureEl.querySelector('[data-bs-toggle=\"dropdown\"]')\n        const input = fixtureEl.querySelector('input')\n\n        input.addEventListener('click', () => {\n          expect(triggerDropdown).toHaveClass('show')\n          resolve()\n        })\n\n        triggerDropdown.addEventListener('shown.bs.dropdown', () => {\n          expect(triggerDropdown).toHaveClass('show')\n          input.dispatchEvent(createEvent('click'))\n        })\n\n        triggerDropdown.click()\n      })\n    })\n\n    it('should not close the dropdown if the user clicks on a textarea within dropdown-menu', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div class=\"dropdown\">',\n          '  <button class=\"btn dropdown-toggle\" data-bs-toggle=\"dropdown\">Dropdown</button>',\n          '  <div class=\"dropdown-menu\">',\n          '    <textarea></textarea>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const triggerDropdown = fixtureEl.querySelector('[data-bs-toggle=\"dropdown\"]')\n        const textarea = fixtureEl.querySelector('textarea')\n\n        textarea.addEventListener('click', () => {\n          expect(triggerDropdown).toHaveClass('show')\n          resolve()\n        })\n\n        triggerDropdown.addEventListener('shown.bs.dropdown', () => {\n          expect(triggerDropdown).toHaveClass('show')\n          textarea.dispatchEvent(createEvent('click'))\n        })\n\n        triggerDropdown.click()\n      })\n    })\n\n    it('should close the dropdown if the user clicks on a text field that is not contained within dropdown-menu', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div class=\"dropdown\">',\n          '  <button class=\"btn dropdown-toggle\" data-bs-toggle=\"dropdown\">Dropdown</button>',\n          '  <div class=\"dropdown-menu\">',\n          '  </div>',\n          '</div>',\n          '<input type=\"text\">'\n        ].join('')\n\n        const triggerDropdown = fixtureEl.querySelector('[data-bs-toggle=\"dropdown\"]')\n        const input = fixtureEl.querySelector('input')\n\n        triggerDropdown.addEventListener('hidden.bs.dropdown', () => {\n          expect().nothing()\n          resolve()\n        })\n\n        triggerDropdown.addEventListener('shown.bs.dropdown', () => {\n          input.dispatchEvent(createEvent('click', {\n            bubbles: true\n          }))\n        })\n\n        triggerDropdown.click()\n      })\n    })\n\n    it('should ignore keyboard events for <input>s and <textarea>s within dropdown-menu, except for escape key', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div class=\"dropdown\">',\n          '  <button class=\"btn dropdown-toggle\" data-bs-toggle=\"dropdown\">Dropdown</button>',\n          '  <div class=\"dropdown-menu\">',\n          '    <a class=\"dropdown-item\" href=\"#sub1\">Submenu 1</a>',\n          '    <input type=\"text\">',\n          '    <textarea></textarea>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const triggerDropdown = fixtureEl.querySelector('[data-bs-toggle=\"dropdown\"]')\n        const input = fixtureEl.querySelector('input')\n        const textarea = fixtureEl.querySelector('textarea')\n\n        const test = (eventKey, elementToDispatch) => {\n          const event = createEvent('keydown')\n          event.key = eventKey\n          elementToDispatch.focus()\n          elementToDispatch.dispatchEvent(event)\n          expect(document.activeElement).toEqual(elementToDispatch, `${elementToDispatch.tagName} still focused`)\n        }\n\n        const keydownEscape = createEvent('keydown')\n        keydownEscape.key = 'Escape'\n\n        triggerDropdown.addEventListener('shown.bs.dropdown', () => {\n          // Key Space\n          test('Space', input)\n\n          test('Space', textarea)\n\n          // Key ArrowUp\n          test('ArrowUp', input)\n\n          test('ArrowUp', textarea)\n\n          // Key ArrowDown\n          test('ArrowDown', input)\n\n          test('ArrowDown', textarea)\n\n          // Key Escape\n          input.focus()\n          input.dispatchEvent(keydownEscape)\n\n          expect(triggerDropdown).not.toHaveClass('show')\n          resolve()\n        })\n\n        triggerDropdown.click()\n      })\n    })\n\n    it('should not open dropdown if escape key was pressed on the toggle', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div class=\"tabs\">',\n          '  <div class=\"dropdown\">',\n          '    <button disabled class=\"btn dropdown-toggle\" data-bs-toggle=\"dropdown\">Dropdown</button>',\n          '    <div class=\"dropdown-menu\">',\n          '      <a class=\"dropdown-item\" href=\"#\">Secondary link</a>',\n          '      <a class=\"dropdown-item\" href=\"#\">Something else here</a>',\n          '      <div class=\"divider\"></div>',\n          '      <a class=\"dropdown-item\" href=\"#\">Another link</a>',\n          '    </div>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const triggerDropdown = fixtureEl.querySelector('[data-bs-toggle=\"dropdown\"]')\n        const dropdown = new Dropdown(triggerDropdown)\n        const button = fixtureEl.querySelector('button[data-bs-toggle=\"dropdown\"]')\n\n        const spy = spyOn(dropdown, 'toggle')\n\n        // Key escape\n        button.focus()\n        // Key escape\n        const keydownEscape = createEvent('keydown')\n        keydownEscape.key = 'Escape'\n        button.dispatchEvent(keydownEscape)\n\n        setTimeout(() => {\n          expect(spy).not.toHaveBeenCalled()\n          expect(triggerDropdown).not.toHaveClass('show')\n          resolve()\n        }, 20)\n      })\n    })\n\n    it('should propagate escape key events if dropdown is closed', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div class=\"parent\">',\n          '  <div class=\"dropdown\">',\n          '    <button class=\"btn dropdown-toggle\" data-bs-toggle=\"dropdown\">Dropdown</button>',\n          '    <div class=\"dropdown-menu\">',\n          '      <a class=\"dropdown-item\" href=\"#\">Some Item</a>',\n          '    </div>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const parent = fixtureEl.querySelector('.parent')\n        const toggle = fixtureEl.querySelector('[data-bs-toggle=\"dropdown\"]')\n\n        const parentKeyHandler = jasmine.createSpy('parentKeyHandler')\n\n        parent.addEventListener('keydown', parentKeyHandler)\n        parent.addEventListener('keyup', () => {\n          expect(parentKeyHandler).toHaveBeenCalled()\n          resolve()\n        })\n\n        const keydownEscape = createEvent('keydown', { bubbles: true })\n        keydownEscape.key = 'Escape'\n        const keyupEscape = createEvent('keyup', { bubbles: true })\n        keyupEscape.key = 'Escape'\n\n        toggle.focus()\n        toggle.dispatchEvent(keydownEscape)\n        toggle.dispatchEvent(keyupEscape)\n      })\n    })\n\n    it('should not propagate escape key events if dropdown is open', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div class=\"parent\">',\n          '  <div class=\"dropdown\">',\n          '    <button class=\"btn dropdown-toggle\" data-bs-toggle=\"dropdown\">Dropdown</button>',\n          '    <div class=\"dropdown-menu\">',\n          '      <a class=\"dropdown-item\" href=\"#\">Some Item</a>',\n          '    </div>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const parent = fixtureEl.querySelector('.parent')\n        const toggle = fixtureEl.querySelector('[data-bs-toggle=\"dropdown\"]')\n\n        const parentKeyHandler = jasmine.createSpy('parentKeyHandler')\n\n        parent.addEventListener('keydown', parentKeyHandler)\n        parent.addEventListener('keyup', () => {\n          expect(parentKeyHandler).not.toHaveBeenCalled()\n          resolve()\n        })\n\n        const keydownEscape = createEvent('keydown', { bubbles: true })\n        keydownEscape.key = 'Escape'\n        const keyupEscape = createEvent('keyup', { bubbles: true })\n        keyupEscape.key = 'Escape'\n\n        toggle.click()\n        toggle.dispatchEvent(keydownEscape)\n        toggle.dispatchEvent(keyupEscape)\n      })\n    })\n\n    it('should close dropdown using `escape` button, and return focus to its trigger', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div class=\"dropdown\">',\n          '  <button class=\"btn dropdown-toggle\" data-bs-toggle=\"dropdown\">Dropdown</button>',\n          '  <div class=\"dropdown-menu\">',\n          '    <a class=\"dropdown-item\" href=\"#\">Some Item</a>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const toggle = fixtureEl.querySelector('[data-bs-toggle=\"dropdown\"]')\n\n        toggle.addEventListener('shown.bs.dropdown', () => {\n          const keydownEvent = createEvent('keydown', { bubbles: true })\n          keydownEvent.key = 'ArrowDown'\n          toggle.dispatchEvent(keydownEvent)\n          keydownEvent.key = 'Escape'\n          toggle.dispatchEvent(keydownEvent)\n        })\n\n        toggle.addEventListener('hidden.bs.dropdown', () => setTimeout(() => {\n          expect(document.activeElement).toEqual(toggle)\n          resolve()\n        }))\n\n        toggle.click()\n      })\n    })\n\n    it('should close dropdown (only) by clicking inside the dropdown menu when it has data-attribute `data-bs-auto-close=\"inside\"`', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div class=\"dropdown\">',\n          '  <button class=\"btn dropdown-toggle\" data-bs-toggle=\"dropdown\" data-bs-auto-close=\"inside\">Dropdown toggle</button>',\n          '  <div class=\"dropdown-menu\">',\n          '    <a class=\"dropdown-item\" href=\"#\">Dropdown item</a>',\n          ' </div>',\n          '</div>'\n        ].join('')\n\n        const dropdownToggle = fixtureEl.querySelector('[data-bs-toggle=\"dropdown\"]')\n        const dropdownMenu = fixtureEl.querySelector('.dropdown-menu')\n\n        const expectDropdownToBeOpened = () => setTimeout(() => {\n          expect(dropdownToggle).toHaveClass('show')\n          dropdownMenu.click()\n        }, 150)\n\n        dropdownToggle.addEventListener('shown.bs.dropdown', () => {\n          document.documentElement.click()\n          expectDropdownToBeOpened()\n        })\n\n        dropdownToggle.addEventListener('hidden.bs.dropdown', () => setTimeout(() => {\n          expect(dropdownToggle).not.toHaveClass('show')\n          resolve()\n        }))\n\n        dropdownToggle.click()\n      })\n    })\n\n    it('should close dropdown (only) by clicking outside the dropdown menu when it has data-attribute `data-bs-auto-close=\"outside\"`', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div class=\"dropdown\">',\n          '  <button class=\"btn dropdown-toggle\" data-bs-toggle=\"dropdown\" data-bs-auto-close=\"outside\">Dropdown toggle</button>',\n          '  <div class=\"dropdown-menu\">',\n          '    <a class=\"dropdown-item\" href=\"#\">Dropdown item</a>',\n          ' </div>',\n          '</div>'\n        ].join('')\n\n        const dropdownToggle = fixtureEl.querySelector('[data-bs-toggle=\"dropdown\"]')\n        const dropdownMenu = fixtureEl.querySelector('.dropdown-menu')\n\n        const expectDropdownToBeOpened = () => setTimeout(() => {\n          expect(dropdownToggle).toHaveClass('show')\n          document.documentElement.click()\n        }, 150)\n\n        dropdownToggle.addEventListener('shown.bs.dropdown', () => {\n          dropdownMenu.click()\n          expectDropdownToBeOpened()\n        })\n\n        dropdownToggle.addEventListener('hidden.bs.dropdown', () => {\n          expect(dropdownToggle).not.toHaveClass('show')\n          resolve()\n        })\n\n        dropdownToggle.click()\n      })\n    })\n\n    it('should not close dropdown by clicking inside or outside the dropdown menu when it has data-attribute `data-bs-auto-close=\"false\"`', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div class=\"dropdown\">',\n          '  <button class=\"btn dropdown-toggle\" data-bs-toggle=\"dropdown\" data-bs-auto-close=\"false\">Dropdown toggle</button>',\n          '  <div class=\"dropdown-menu\">',\n          '    <a class=\"dropdown-item\" href=\"#\">Dropdown item</a>',\n          ' </div>',\n          '</div>'\n        ].join('')\n\n        const dropdownToggle = fixtureEl.querySelector('[data-bs-toggle=\"dropdown\"]')\n        const dropdownMenu = fixtureEl.querySelector('.dropdown-menu')\n\n        const expectDropdownToBeOpened = (shouldTriggerClick = true) => setTimeout(() => {\n          expect(dropdownToggle).toHaveClass('show')\n          if (shouldTriggerClick) {\n            document.documentElement.click()\n          } else {\n            resolve()\n          }\n\n          expectDropdownToBeOpened(false)\n        }, 150)\n\n        dropdownToggle.addEventListener('shown.bs.dropdown', () => {\n          dropdownMenu.click()\n          expectDropdownToBeOpened()\n        })\n\n        dropdownToggle.click()\n      })\n    })\n\n    it('should be able to identify clicked dropdown, no matter the markup order', () => {\n      fixtureEl.innerHTML = [\n        '<div class=\"dropdown\">',\n        '  <div class=\"dropdown-menu\">',\n        '    <a class=\"dropdown-item\" href=\"#\">Dropdown item</a>',\n        '  </div>',\n        '  <button class=\"btn dropdown-toggle\" data-bs-toggle=\"dropdown\">Dropdown toggle</button>',\n        '</div>'\n      ].join('')\n\n      const dropdownToggle = fixtureEl.querySelector('[data-bs-toggle=\"dropdown\"]')\n      const dropdownMenu = fixtureEl.querySelector('.dropdown-menu')\n      const spy = spyOn(Dropdown, 'getOrCreateInstance').and.callThrough()\n\n      dropdownToggle.click()\n      expect(spy).toHaveBeenCalledWith(dropdownToggle)\n      dropdownMenu.click()\n      expect(spy).toHaveBeenCalledWith(dropdownToggle)\n    })\n  })\n\n  describe('jQueryInterface', () => {\n    it('should create a dropdown', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n\n      jQueryMock.fn.dropdown = Dropdown.jQueryInterface\n      jQueryMock.elements = [div]\n\n      jQueryMock.fn.dropdown.call(jQueryMock)\n\n      expect(Dropdown.getInstance(div)).not.toBeNull()\n    })\n\n    it('should not re create a dropdown', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n      const dropdown = new Dropdown(div)\n\n      jQueryMock.fn.dropdown = Dropdown.jQueryInterface\n      jQueryMock.elements = [div]\n\n      jQueryMock.fn.dropdown.call(jQueryMock)\n\n      expect(Dropdown.getInstance(div)).toEqual(dropdown)\n    })\n\n    it('should throw error on undefined method', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n      const action = 'undefinedMethod'\n\n      jQueryMock.fn.dropdown = Dropdown.jQueryInterface\n      jQueryMock.elements = [div]\n\n      expect(() => {\n        jQueryMock.fn.dropdown.call(jQueryMock, action)\n      }).toThrowError(TypeError, `No method named \"${action}\"`)\n    })\n  })\n\n  describe('getInstance', () => {\n    it('should return dropdown instance', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n      const dropdown = new Dropdown(div)\n\n      expect(Dropdown.getInstance(div)).toEqual(dropdown)\n      expect(Dropdown.getInstance(div)).toBeInstanceOf(Dropdown)\n    })\n\n    it('should return null when there is no dropdown instance', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n\n      expect(Dropdown.getInstance(div)).toBeNull()\n    })\n  })\n\n  describe('getOrCreateInstance', () => {\n    it('should return dropdown instance', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n      const dropdown = new Dropdown(div)\n\n      expect(Dropdown.getOrCreateInstance(div)).toEqual(dropdown)\n      expect(Dropdown.getInstance(div)).toEqual(Dropdown.getOrCreateInstance(div, {}))\n      expect(Dropdown.getOrCreateInstance(div)).toBeInstanceOf(Dropdown)\n    })\n\n    it('should return new instance when there is no dropdown instance', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n\n      expect(Dropdown.getInstance(div)).toBeNull()\n      expect(Dropdown.getOrCreateInstance(div)).toBeInstanceOf(Dropdown)\n    })\n\n    it('should return new instance when there is no dropdown instance with given configuration', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n\n      expect(Dropdown.getInstance(div)).toBeNull()\n      const dropdown = Dropdown.getOrCreateInstance(div, {\n        display: 'dynamic'\n      })\n      expect(dropdown).toBeInstanceOf(Dropdown)\n\n      expect(dropdown._config.display).toEqual('dynamic')\n    })\n\n    it('should return the instance when exists without given configuration', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n      const dropdown = new Dropdown(div, {\n        display: 'dynamic'\n      })\n      expect(Dropdown.getInstance(div)).toEqual(dropdown)\n\n      const dropdown2 = Dropdown.getOrCreateInstance(div, {\n        display: 'static'\n      })\n      expect(dropdown).toBeInstanceOf(Dropdown)\n      expect(dropdown2).toEqual(dropdown)\n\n      expect(dropdown2._config.display).toEqual('dynamic')\n    })\n  })\n\n  it('should open dropdown when pressing keydown or keyup', () => {\n    return new Promise(resolve => {\n      fixtureEl.innerHTML = [\n        '<div class=\"dropdown\">',\n        '  <button class=\"btn dropdown-toggle\" data-bs-toggle=\"dropdown\">Dropdown</button>',\n        '  <div class=\"dropdown-menu\">',\n        '    <a class=\"dropdown-item disabled\" href=\"#sub1\">Submenu 1</a>',\n        '    <button class=\"dropdown-item\" type=\"button\" disabled>Disabled button</button>',\n        '    <a id=\"item1\" class=\"dropdown-item\" href=\"#\">Another link</a>',\n        '  </div>',\n        '</div>'\n      ].join('')\n\n      const triggerDropdown = fixtureEl.querySelector('[data-bs-toggle=\"dropdown\"]')\n      const dropdown = fixtureEl.querySelector('.dropdown')\n\n      const keydown = createEvent('keydown')\n      keydown.key = 'ArrowDown'\n\n      const keyup = createEvent('keyup')\n      keyup.key = 'ArrowUp'\n\n      const handleArrowDown = () => {\n        expect(triggerDropdown).toHaveClass('show')\n        expect(triggerDropdown.getAttribute('aria-expanded')).toEqual('true')\n        setTimeout(() => {\n          dropdown.hide()\n          keydown.key = 'ArrowUp'\n          triggerDropdown.dispatchEvent(keyup)\n        }, 20)\n      }\n\n      const handleArrowUp = () => {\n        expect(triggerDropdown).toHaveClass('show')\n        expect(triggerDropdown.getAttribute('aria-expanded')).toEqual('true')\n        resolve()\n      }\n\n      dropdown.addEventListener('shown.bs.dropdown', event => {\n        if (event.target.key === 'ArrowDown') {\n          handleArrowDown()\n        } else {\n          handleArrowUp()\n        }\n      })\n\n      triggerDropdown.dispatchEvent(keydown)\n    })\n  })\n\n  it('should allow `data-bs-toggle=\"dropdown\"` click events to bubble up', () => {\n    fixtureEl.innerHTML = [\n      '<div class=\"dropdown\">',\n      '  <button class=\"btn dropdown-toggle\" data-bs-toggle=\"dropdown\">Dropdown</button>',\n      '  <div class=\"dropdown-menu\">',\n      '    <a class=\"dropdown-item\" href=\"#\">Secondary link</a>',\n      '  </div>',\n      '</div>'\n    ].join('')\n\n    const btnDropdown = fixtureEl.querySelector('[data-bs-toggle=\"dropdown\"]')\n    const clickListener = jasmine.createSpy('clickListener')\n    const delegatedClickListener = jasmine.createSpy('delegatedClickListener')\n\n    btnDropdown.addEventListener('click', clickListener)\n    document.addEventListener('click', delegatedClickListener)\n\n    btnDropdown.click()\n\n    expect(clickListener).toHaveBeenCalled()\n    expect(delegatedClickListener).toHaveBeenCalled()\n  })\n\n  it('should open the dropdown when clicking the child element inside `data-bs-toggle=\"dropdown\"`', () => {\n    return new Promise(resolve => {\n      fixtureEl.innerHTML = [\n        '<div class=\"container\">',\n        '  <div class=\"dropdown\">',\n        '    <button class=\"btn dropdown-toggle\" data-bs-toggle=\"dropdown\"><span id=\"childElement\">Dropdown</span></button>',\n        '    <div class=\"dropdown-menu\">',\n        '      <a class=\"dropdown-item\" href=\"#subMenu\">Sub menu</a>',\n        '    </div>',\n        '  </div>',\n        '</div>'\n      ].join('')\n\n      const btnDropdown = fixtureEl.querySelector('[data-bs-toggle=\"dropdown\"]')\n      const childElement = fixtureEl.querySelector('#childElement')\n\n      btnDropdown.addEventListener('shown.bs.dropdown', () => setTimeout(() => {\n        expect(btnDropdown).toHaveClass('show')\n        expect(btnDropdown.getAttribute('aria-expanded')).toEqual('true')\n        resolve()\n      }))\n\n      childElement.click()\n    })\n  })\n})\n"
  },
  {
    "path": "js/tests/unit/jquery.spec.js",
    "content": "/* eslint-env jquery */\n\nimport Alert from '../../src/alert.js'\nimport Button from '../../src/button.js'\nimport Carousel from '../../src/carousel.js'\nimport Collapse from '../../src/collapse.js'\nimport Dropdown from '../../src/dropdown.js'\nimport Modal from '../../src/modal.js'\nimport Offcanvas from '../../src/offcanvas.js'\nimport Popover from '../../src/popover.js'\nimport ScrollSpy from '../../src/scrollspy.js'\nimport Tab from '../../src/tab.js'\nimport Toast from '../../src/toast.js'\nimport Tooltip from '../../src/tooltip.js'\nimport { clearFixture, getFixture } from '../helpers/fixture.js'\n\ndescribe('jQuery', () => {\n  let fixtureEl\n\n  beforeAll(() => {\n    fixtureEl = getFixture()\n  })\n\n  afterEach(() => {\n    clearFixture()\n  })\n\n  it('should add all plugins in jQuery', () => {\n    expect(Alert.jQueryInterface).toEqual(jQuery.fn.alert)\n    expect(Button.jQueryInterface).toEqual(jQuery.fn.button)\n    expect(Carousel.jQueryInterface).toEqual(jQuery.fn.carousel)\n    expect(Collapse.jQueryInterface).toEqual(jQuery.fn.collapse)\n    expect(Dropdown.jQueryInterface).toEqual(jQuery.fn.dropdown)\n    expect(Modal.jQueryInterface).toEqual(jQuery.fn.modal)\n    expect(Offcanvas.jQueryInterface).toEqual(jQuery.fn.offcanvas)\n    expect(Popover.jQueryInterface).toEqual(jQuery.fn.popover)\n    expect(ScrollSpy.jQueryInterface).toEqual(jQuery.fn.scrollspy)\n    expect(Tab.jQueryInterface).toEqual(jQuery.fn.tab)\n    expect(Toast.jQueryInterface).toEqual(jQuery.fn.toast)\n    expect(Tooltip.jQueryInterface).toEqual(jQuery.fn.tooltip)\n  })\n\n  it('should use jQuery event system', () => {\n    return new Promise(resolve => {\n      fixtureEl.innerHTML = [\n        '<div class=\"alert\">',\n        '  <button type=\"button\" data-bs-dismiss=\"alert\">x</button>',\n        '</div>'\n      ].join('')\n\n      $(fixtureEl).find('.alert')\n        .one('closed.bs.alert', () => {\n          expect($(fixtureEl).find('.alert')).toHaveSize(0)\n          resolve()\n        })\n\n      $(fixtureEl).find('button').trigger('click')\n    })\n  })\n})\n"
  },
  {
    "path": "js/tests/unit/modal.spec.js",
    "content": "import EventHandler from '../../src/dom/event-handler.js'\nimport Modal from '../../src/modal.js'\nimport ScrollBarHelper from '../../src/util/scrollbar.js'\nimport {\n  clearBodyAndDocument, clearFixture, createEvent, getFixture, jQueryMock\n} from '../helpers/fixture.js'\n\ndescribe('Modal', () => {\n  let fixtureEl\n\n  beforeAll(() => {\n    fixtureEl = getFixture()\n  })\n\n  afterEach(() => {\n    clearFixture()\n    clearBodyAndDocument()\n    document.body.classList.remove('modal-open')\n\n    for (const backdrop of document.querySelectorAll('.modal-backdrop')) {\n      backdrop.remove()\n    }\n  })\n\n  beforeEach(() => {\n    clearBodyAndDocument()\n  })\n\n  describe('VERSION', () => {\n    it('should return plugin version', () => {\n      expect(Modal.VERSION).toEqual(jasmine.any(String))\n    })\n  })\n\n  describe('Default', () => {\n    it('should return plugin default config', () => {\n      expect(Modal.Default).toEqual(jasmine.any(Object))\n    })\n  })\n\n  describe('DATA_KEY', () => {\n    it('should return plugin data key', () => {\n      expect(Modal.DATA_KEY).toEqual('bs.modal')\n    })\n  })\n\n  describe('constructor', () => {\n    it('should take care of element either passed as a CSS selector or DOM element', () => {\n      fixtureEl.innerHTML = '<div class=\"modal\"><div class=\"modal-dialog\"></div></div>'\n\n      const modalEl = fixtureEl.querySelector('.modal')\n      const modalBySelector = new Modal('.modal')\n      const modalByElement = new Modal(modalEl)\n\n      expect(modalBySelector._element).toEqual(modalEl)\n      expect(modalByElement._element).toEqual(modalEl)\n    })\n  })\n\n  describe('toggle', () => {\n    it('should call ScrollBarHelper to handle scrollBar on body', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<div class=\"modal\"><div class=\"modal-dialog\"></div></div>'\n\n        const spyHide = spyOn(ScrollBarHelper.prototype, 'hide').and.callThrough()\n        const spyReset = spyOn(ScrollBarHelper.prototype, 'reset').and.callThrough()\n        const modalEl = fixtureEl.querySelector('.modal')\n        const modal = new Modal(modalEl)\n\n        modalEl.addEventListener('shown.bs.modal', () => {\n          expect(spyHide).toHaveBeenCalled()\n          modal.toggle()\n        })\n\n        modalEl.addEventListener('hidden.bs.modal', () => {\n          expect(spyReset).toHaveBeenCalled()\n          resolve()\n        })\n\n        modal.toggle()\n      })\n    })\n  })\n\n  describe('show', () => {\n    it('should show a modal', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<div class=\"modal\"><div class=\"modal-dialog\"></div></div>'\n\n        const modalEl = fixtureEl.querySelector('.modal')\n        const modal = new Modal(modalEl)\n\n        modalEl.addEventListener('show.bs.modal', event => {\n          expect(event).toBeDefined()\n        })\n\n        modalEl.addEventListener('shown.bs.modal', () => {\n          expect(modalEl.getAttribute('aria-modal')).toEqual('true')\n          expect(modalEl.getAttribute('role')).toEqual('dialog')\n          expect(modalEl.getAttribute('aria-hidden')).toBeNull()\n          expect(modalEl.style.display).toEqual('block')\n          expect(document.querySelector('.modal-backdrop')).not.toBeNull()\n          resolve()\n        })\n\n        modal.show()\n      })\n    })\n\n    it('should show a modal without backdrop', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<div class=\"modal\"><div class=\"modal-dialog\"></div></div>'\n\n        const modalEl = fixtureEl.querySelector('.modal')\n        const modal = new Modal(modalEl, {\n          backdrop: false\n        })\n\n        modalEl.addEventListener('show.bs.modal', event => {\n          expect(event).toBeDefined()\n        })\n\n        modalEl.addEventListener('shown.bs.modal', () => {\n          expect(modalEl.getAttribute('aria-modal')).toEqual('true')\n          expect(modalEl.getAttribute('role')).toEqual('dialog')\n          expect(modalEl.getAttribute('aria-hidden')).toBeNull()\n          expect(modalEl.style.display).toEqual('block')\n          expect(document.querySelector('.modal-backdrop')).toBeNull()\n          resolve()\n        })\n\n        modal.show()\n      })\n    })\n\n    it('should show a modal and append the element', () => {\n      return new Promise(resolve => {\n        const modalEl = document.createElement('div')\n        const id = 'dynamicModal'\n\n        modalEl.setAttribute('id', id)\n        modalEl.classList.add('modal')\n        modalEl.innerHTML = '<div class=\"modal-dialog\"></div>'\n\n        const modal = new Modal(modalEl)\n\n        modalEl.addEventListener('shown.bs.modal', () => {\n          const dynamicModal = document.getElementById(id)\n          expect(dynamicModal).not.toBeNull()\n          dynamicModal.remove()\n          resolve()\n        })\n\n        modal.show()\n      })\n    })\n\n    it('should do nothing if a modal is shown', () => {\n      fixtureEl.innerHTML = '<div class=\"modal\"><div class=\"modal-dialog\"></div></div>'\n\n      const modalEl = fixtureEl.querySelector('.modal')\n      const modal = new Modal(modalEl)\n\n      const spy = spyOn(EventHandler, 'trigger')\n      modal._isShown = true\n\n      modal.show()\n\n      expect(spy).not.toHaveBeenCalled()\n    })\n\n    it('should do nothing if a modal is transitioning', () => {\n      fixtureEl.innerHTML = '<div class=\"modal\"><div class=\"modal-dialog\"></div></div>'\n\n      const modalEl = fixtureEl.querySelector('.modal')\n      const modal = new Modal(modalEl)\n\n      const spy = spyOn(EventHandler, 'trigger')\n      modal._isTransitioning = true\n\n      modal.show()\n\n      expect(spy).not.toHaveBeenCalled()\n    })\n\n    it('should not fire shown event when show is prevented', () => {\n      return new Promise((resolve, reject) => {\n        fixtureEl.innerHTML = '<div class=\"modal\"><div class=\"modal-dialog\"></div></div>'\n\n        const modalEl = fixtureEl.querySelector('.modal')\n        const modal = new Modal(modalEl)\n\n        modalEl.addEventListener('show.bs.modal', event => {\n          event.preventDefault()\n\n          const expectedDone = () => {\n            expect().nothing()\n            resolve()\n          }\n\n          setTimeout(expectedDone, 10)\n        })\n\n        modalEl.addEventListener('shown.bs.modal', () => {\n          reject(new Error('shown event triggered'))\n        })\n\n        modal.show()\n      })\n    })\n\n    it('should be shown after the first call to show() has been prevented while fading is enabled ', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<div class=\"modal fade\"><div class=\"modal-dialog\"></div></div>'\n\n        const modalEl = fixtureEl.querySelector('.modal')\n        const modal = new Modal(modalEl)\n\n        let prevented = false\n        modalEl.addEventListener('show.bs.modal', event => {\n          if (!prevented) {\n            event.preventDefault()\n            prevented = true\n\n            setTimeout(() => {\n              modal.show()\n            })\n          }\n        })\n\n        modalEl.addEventListener('shown.bs.modal', () => {\n          expect(prevented).toBeTrue()\n          expect(modal._isAnimated()).toBeTrue()\n          resolve()\n        })\n\n        modal.show()\n      })\n    })\n    it('should set is transitioning if fade class is present', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<div class=\"modal fade\"><div class=\"modal-dialog\"></div></div>'\n\n        const modalEl = fixtureEl.querySelector('.modal')\n        const modal = new Modal(modalEl)\n\n        modalEl.addEventListener('show.bs.modal', () => {\n          setTimeout(() => {\n            expect(modal._isTransitioning).toBeTrue()\n          })\n        })\n\n        modalEl.addEventListener('shown.bs.modal', () => {\n          expect(modal._isTransitioning).toBeFalse()\n          resolve()\n        })\n\n        modal.show()\n      })\n    })\n\n    it('should close modal when a click occurred on data-bs-dismiss=\"modal\" inside modal', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div class=\"modal fade\">',\n          '  <div class=\"modal-dialog\">',\n          '    <div class=\"modal-header\">',\n          '      <button type=\"button\" data-bs-dismiss=\"modal\"></button>',\n          '    </div>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const modalEl = fixtureEl.querySelector('.modal')\n        const btnClose = fixtureEl.querySelector('[data-bs-dismiss=\"modal\"]')\n        const modal = new Modal(modalEl)\n\n        const spy = spyOn(modal, 'hide').and.callThrough()\n\n        modalEl.addEventListener('shown.bs.modal', () => {\n          btnClose.click()\n        })\n\n        modalEl.addEventListener('hidden.bs.modal', () => {\n          expect(spy).toHaveBeenCalled()\n          resolve()\n        })\n\n        modal.show()\n      })\n    })\n\n    it('should close modal when a click occurred on a data-bs-dismiss=\"modal\" with \"bs-target\" outside of modal element', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<button type=\"button\" data-bs-dismiss=\"modal\" data-bs-target=\"#modal1\"></button>',\n          '<div id=\"modal1\" class=\"modal fade\">',\n          '  <div class=\"modal-dialog\"></div>',\n          '</div>'\n        ].join('')\n\n        const modalEl = fixtureEl.querySelector('.modal')\n        const btnClose = fixtureEl.querySelector('[data-bs-dismiss=\"modal\"]')\n        const modal = new Modal(modalEl)\n\n        const spy = spyOn(modal, 'hide').and.callThrough()\n\n        modalEl.addEventListener('shown.bs.modal', () => {\n          btnClose.click()\n        })\n\n        modalEl.addEventListener('hidden.bs.modal', () => {\n          expect(spy).toHaveBeenCalled()\n          resolve()\n        })\n\n        modal.show()\n      })\n    })\n\n    it('should set .modal\\'s scroll top to 0', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div class=\"modal fade\">',\n          '  <div class=\"modal-dialog\"></div>',\n          '</div>'\n        ].join('')\n\n        const modalEl = fixtureEl.querySelector('.modal')\n        const modal = new Modal(modalEl)\n\n        modalEl.addEventListener('shown.bs.modal', () => {\n          expect(modalEl.scrollTop).toEqual(0)\n          resolve()\n        })\n\n        modal.show()\n      })\n    })\n\n    it('should set modal body scroll top to 0 if modal body do not exists', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div class=\"modal fade\">',\n          '  <div class=\"modal-dialog\">',\n          '    <div class=\"modal-body\"></div>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const modalEl = fixtureEl.querySelector('.modal')\n        const modalBody = modalEl.querySelector('.modal-body')\n        const modal = new Modal(modalEl)\n\n        modalEl.addEventListener('shown.bs.modal', () => {\n          expect(modalBody.scrollTop).toEqual(0)\n          resolve()\n        })\n\n        modal.show()\n      })\n    })\n\n    it('should not trap focus if focus equal to false', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<div class=\"modal fade\"><div class=\"modal-dialog\"></div></div>'\n\n        const modalEl = fixtureEl.querySelector('.modal')\n        const modal = new Modal(modalEl, {\n          focus: false\n        })\n\n        const spy = spyOn(modal._focustrap, 'activate').and.callThrough()\n\n        modalEl.addEventListener('shown.bs.modal', () => {\n          expect(spy).not.toHaveBeenCalled()\n          resolve()\n        })\n\n        modal.show()\n      })\n    })\n\n    it('should add listener when escape touch is pressed', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<div class=\"modal\"><div class=\"modal-dialog\"></div></div>'\n\n        const modalEl = fixtureEl.querySelector('.modal')\n        const modal = new Modal(modalEl)\n\n        const spy = spyOn(modal, 'hide').and.callThrough()\n\n        modalEl.addEventListener('shown.bs.modal', () => {\n          const keydownEscape = createEvent('keydown')\n          keydownEscape.key = 'Escape'\n\n          modalEl.dispatchEvent(keydownEscape)\n        })\n\n        modalEl.addEventListener('hidden.bs.modal', () => {\n          expect(spy).toHaveBeenCalled()\n          resolve()\n        })\n\n        modal.show()\n      })\n    })\n\n    it('should do nothing when the pressed key is not escape', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<div class=\"modal\"><div class=\"modal-dialog\"></div></div>'\n\n        const modalEl = fixtureEl.querySelector('.modal')\n        const modal = new Modal(modalEl)\n\n        const spy = spyOn(modal, 'hide')\n\n        const expectDone = () => {\n          expect(spy).not.toHaveBeenCalled()\n\n          resolve()\n        }\n\n        modalEl.addEventListener('shown.bs.modal', () => {\n          const keydownTab = createEvent('keydown')\n          keydownTab.key = 'Tab'\n\n          modalEl.dispatchEvent(keydownTab)\n          setTimeout(expectDone, 30)\n        })\n\n        modal.show()\n      })\n    })\n\n    it('should adjust dialog on resize', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<div class=\"modal\"><div class=\"modal-dialog\"></div></div>'\n\n        const modalEl = fixtureEl.querySelector('.modal')\n        const modal = new Modal(modalEl)\n\n        const spy = spyOn(modal, '_adjustDialog').and.callThrough()\n\n        const expectDone = () => {\n          expect(spy).toHaveBeenCalled()\n\n          resolve()\n        }\n\n        modalEl.addEventListener('shown.bs.modal', () => {\n          const resizeEvent = createEvent('resize')\n\n          window.dispatchEvent(resizeEvent)\n          setTimeout(expectDone, 10)\n        })\n\n        modal.show()\n      })\n    })\n\n    it('should not close modal when clicking on modal-content', () => {\n      return new Promise((resolve, reject) => {\n        fixtureEl.innerHTML = [\n          '<div class=\"modal\">',\n          '  <div class=\"modal-dialog\">',\n          '    <div class=\"modal-content\"></div>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const modalEl = fixtureEl.querySelector('.modal')\n        const modal = new Modal(modalEl)\n\n        const shownCallback = () => {\n          setTimeout(() => {\n            expect(modal._isShown).toEqual(true)\n            resolve()\n          }, 10)\n        }\n\n        modalEl.addEventListener('shown.bs.modal', () => {\n          fixtureEl.querySelector('.modal-dialog').click()\n          fixtureEl.querySelector('.modal-content').click()\n          shownCallback()\n        })\n\n        modalEl.addEventListener('hidden.bs.modal', () => {\n          reject(new Error('Should not hide a modal'))\n        })\n\n        modal.show()\n      })\n    })\n\n    it('should not close modal when clicking outside of modal-content if backdrop = false', () => {\n      return new Promise((resolve, reject) => {\n        fixtureEl.innerHTML = '<div class=\"modal\"><div class=\"modal-dialog\"></div></div>'\n\n        const modalEl = fixtureEl.querySelector('.modal')\n        const modal = new Modal(modalEl, {\n          backdrop: false\n        })\n\n        const shownCallback = () => {\n          setTimeout(() => {\n            expect(modal._isShown).toBeTrue()\n            resolve()\n          }, 10)\n        }\n\n        modalEl.addEventListener('shown.bs.modal', () => {\n          modalEl.click()\n          shownCallback()\n        })\n\n        modalEl.addEventListener('hidden.bs.modal', () => {\n          reject(new Error('Should not hide a modal'))\n        })\n\n        modal.show()\n      })\n    })\n\n    it('should not close modal when clicking outside of modal-content if backdrop = static', () => {\n      return new Promise((resolve, reject) => {\n        fixtureEl.innerHTML = '<div class=\"modal\"><div class=\"modal-dialog\"></div></div>'\n\n        const modalEl = fixtureEl.querySelector('.modal')\n        const modal = new Modal(modalEl, {\n          backdrop: 'static'\n        })\n\n        const shownCallback = () => {\n          setTimeout(() => {\n            expect(modal._isShown).toBeTrue()\n            resolve()\n          }, 10)\n        }\n\n        modalEl.addEventListener('shown.bs.modal', () => {\n          modalEl.click()\n          shownCallback()\n        })\n\n        modalEl.addEventListener('hidden.bs.modal', () => {\n          reject(new Error('Should not hide a modal'))\n        })\n\n        modal.show()\n      })\n    })\n    it('should close modal when escape key is pressed with keyboard = true and backdrop is static', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<div class=\"modal\"><div class=\"modal-dialog\"></div></div>'\n\n        const modalEl = fixtureEl.querySelector('.modal')\n        const modal = new Modal(modalEl, {\n          backdrop: 'static',\n          keyboard: true\n        })\n\n        const shownCallback = () => {\n          setTimeout(() => {\n            expect(modal._isShown).toBeFalse()\n            resolve()\n          }, 10)\n        }\n\n        modalEl.addEventListener('shown.bs.modal', () => {\n          const keydownEscape = createEvent('keydown')\n          keydownEscape.key = 'Escape'\n\n          modalEl.dispatchEvent(keydownEscape)\n          shownCallback()\n        })\n\n        modal.show()\n      })\n    })\n\n    it('should not close modal when escape key is pressed with keyboard = false', () => {\n      return new Promise((resolve, reject) => {\n        fixtureEl.innerHTML = '<div class=\"modal\"><div class=\"modal-dialog\"></div></div>'\n\n        const modalEl = fixtureEl.querySelector('.modal')\n        const modal = new Modal(modalEl, {\n          keyboard: false\n        })\n\n        const shownCallback = () => {\n          setTimeout(() => {\n            expect(modal._isShown).toBeTrue()\n            resolve()\n          }, 10)\n        }\n\n        modalEl.addEventListener('shown.bs.modal', () => {\n          const keydownEscape = createEvent('keydown')\n          keydownEscape.key = 'Escape'\n\n          modalEl.dispatchEvent(keydownEscape)\n          shownCallback()\n        })\n\n        modalEl.addEventListener('hidden.bs.modal', () => {\n          reject(new Error('Should not hide a modal'))\n        })\n\n        modal.show()\n      })\n    })\n\n    it('should not overflow when clicking outside of modal-content if backdrop = static', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<div class=\"modal\"><div class=\"modal-dialog\" style=\"transition-duration: 20ms;\"></div></div>'\n\n        const modalEl = fixtureEl.querySelector('.modal')\n        const modal = new Modal(modalEl, {\n          backdrop: 'static'\n        })\n\n        modalEl.addEventListener('shown.bs.modal', () => {\n          modalEl.click()\n          setTimeout(() => {\n            expect(modalEl.clientHeight).toEqual(modalEl.scrollHeight)\n            resolve()\n          }, 20)\n        })\n\n        modal.show()\n      })\n    })\n\n    it('should not queue multiple callbacks when clicking outside of modal-content and backdrop = static', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<div class=\"modal\"><div class=\"modal-dialog\" style=\"transition-duration: 50ms;\"></div></div>'\n\n        const modalEl = fixtureEl.querySelector('.modal')\n        const modal = new Modal(modalEl, {\n          backdrop: 'static'\n        })\n\n        modalEl.addEventListener('shown.bs.modal', () => {\n          const spy = spyOn(modal, '_queueCallback').and.callThrough()\n          const mouseDown = createEvent('mousedown')\n\n          modalEl.dispatchEvent(mouseDown)\n          modalEl.click()\n          modalEl.dispatchEvent(mouseDown)\n          modalEl.click()\n\n          setTimeout(() => {\n            expect(spy).toHaveBeenCalledTimes(1)\n            resolve()\n          }, 20)\n        })\n\n        modal.show()\n      })\n    })\n\n    it('should trap focus', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<div class=\"modal\"><div class=\"modal-dialog\"></div></div>'\n\n        const modalEl = fixtureEl.querySelector('.modal')\n        const modal = new Modal(modalEl)\n\n        const spy = spyOn(modal._focustrap, 'activate').and.callThrough()\n\n        modalEl.addEventListener('shown.bs.modal', () => {\n          expect(spy).toHaveBeenCalled()\n          resolve()\n        })\n\n        modal.show()\n      })\n    })\n  })\n\n  describe('hide', () => {\n    it('should hide a modal', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<div class=\"modal\"><div class=\"modal-dialog\"></div></div>'\n\n        const modalEl = fixtureEl.querySelector('.modal')\n        const modal = new Modal(modalEl)\n        const backdropSpy = spyOn(modal._backdrop, 'hide').and.callThrough()\n\n        modalEl.addEventListener('shown.bs.modal', () => {\n          modal.hide()\n        })\n\n        modalEl.addEventListener('hide.bs.modal', event => {\n          expect(event).toBeDefined()\n        })\n\n        modalEl.addEventListener('hidden.bs.modal', () => {\n          expect(modalEl.getAttribute('aria-modal')).toBeNull()\n          expect(modalEl.getAttribute('role')).toBeNull()\n          expect(modalEl.getAttribute('aria-hidden')).toEqual('true')\n          expect(modalEl.style.display).toEqual('none')\n          expect(backdropSpy).toHaveBeenCalled()\n          resolve()\n        })\n\n        modal.show()\n      })\n    })\n\n    it('should close modal when clicking outside of modal-content', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<div class=\"modal\"><div class=\"modal-dialog\"></div></div>'\n\n        const modalEl = fixtureEl.querySelector('.modal')\n        const dialogEl = modalEl.querySelector('.modal-dialog')\n        const modal = new Modal(modalEl)\n\n        const spy = spyOn(modal, 'hide')\n\n        modalEl.addEventListener('shown.bs.modal', () => {\n          const mouseDown = createEvent('mousedown')\n\n          dialogEl.dispatchEvent(mouseDown)\n          modalEl.click()\n          expect(spy).not.toHaveBeenCalled()\n\n          modalEl.dispatchEvent(mouseDown)\n          modalEl.click()\n          expect(spy).toHaveBeenCalled()\n          resolve()\n        })\n\n        modal.show()\n      })\n    })\n\n    it('should not close modal when clicking on an element removed from modal content', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div class=\"modal\">',\n          ' <div class=\"modal-dialog\">',\n          '   <button class=\"btn\">BTN</button>',\n          ' </div>',\n          '</div>'\n        ].join('')\n\n        const modalEl = fixtureEl.querySelector('.modal')\n        const buttonEl = modalEl.querySelector('.btn')\n        const modal = new Modal(modalEl)\n\n        const spy = spyOn(modal, 'hide')\n        buttonEl.addEventListener('click', () => {\n          buttonEl.remove()\n        })\n\n        modalEl.addEventListener('shown.bs.modal', () => {\n          modalEl.dispatchEvent(createEvent('mousedown'))\n          buttonEl.click()\n          expect(spy).not.toHaveBeenCalled()\n          resolve()\n        })\n\n        modal.show()\n      })\n    })\n\n    it('should do nothing is the modal is not shown', () => {\n      fixtureEl.innerHTML = '<div class=\"modal\"><div class=\"modal-dialog\"></div></div>'\n\n      const modalEl = fixtureEl.querySelector('.modal')\n      const modal = new Modal(modalEl)\n\n      modal.hide()\n\n      expect().nothing()\n    })\n\n    it('should do nothing is the modal is transitioning', () => {\n      fixtureEl.innerHTML = '<div class=\"modal\"><div class=\"modal-dialog\"></div></div>'\n\n      const modalEl = fixtureEl.querySelector('.modal')\n      const modal = new Modal(modalEl)\n\n      modal._isTransitioning = true\n      modal.hide()\n\n      expect().nothing()\n    })\n\n    it('should not hide a modal if hide is prevented', () => {\n      return new Promise((resolve, reject) => {\n        fixtureEl.innerHTML = '<div class=\"modal\"><div class=\"modal-dialog\"></div></div>'\n\n        const modalEl = fixtureEl.querySelector('.modal')\n        const modal = new Modal(modalEl)\n\n        modalEl.addEventListener('shown.bs.modal', () => {\n          modal.hide()\n        })\n\n        const hideCallback = () => {\n          setTimeout(() => {\n            expect(modal._isShown).toBeTrue()\n            resolve()\n          }, 10)\n        }\n\n        modalEl.addEventListener('hide.bs.modal', event => {\n          event.preventDefault()\n          hideCallback()\n        })\n\n        modalEl.addEventListener('hidden.bs.modal', () => {\n          reject(new Error('should not trigger hidden'))\n        })\n\n        modal.show()\n      })\n    })\n\n    it('should release focus trap', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<div class=\"modal\"><div class=\"modal-dialog\"></div></div>'\n\n        const modalEl = fixtureEl.querySelector('.modal')\n        const modal = new Modal(modalEl)\n        const spy = spyOn(modal._focustrap, 'deactivate').and.callThrough()\n\n        modalEl.addEventListener('shown.bs.modal', () => {\n          modal.hide()\n        })\n\n        modalEl.addEventListener('hidden.bs.modal', () => {\n          expect(spy).toHaveBeenCalled()\n          resolve()\n        })\n\n        modal.show()\n      })\n    })\n  })\n\n  describe('dispose', () => {\n    it('should dispose a modal', () => {\n      fixtureEl.innerHTML = '<div id=\"exampleModal\" class=\"modal\"><div class=\"modal-dialog\"></div></div>'\n\n      const modalEl = fixtureEl.querySelector('.modal')\n      const modal = new Modal(modalEl)\n      const focustrap = modal._focustrap\n      const spyDeactivate = spyOn(focustrap, 'deactivate').and.callThrough()\n\n      expect(Modal.getInstance(modalEl)).toEqual(modal)\n\n      const spyOff = spyOn(EventHandler, 'off')\n\n      modal.dispose()\n\n      expect(Modal.getInstance(modalEl)).toBeNull()\n      expect(spyOff).toHaveBeenCalledTimes(3)\n      expect(spyDeactivate).toHaveBeenCalled()\n    })\n  })\n\n  describe('handleUpdate', () => {\n    it('should call adjust dialog', () => {\n      fixtureEl.innerHTML = '<div id=\"exampleModal\" class=\"modal\"><div class=\"modal-dialog\"></div></div>'\n\n      const modalEl = fixtureEl.querySelector('.modal')\n      const modal = new Modal(modalEl)\n\n      const spy = spyOn(modal, '_adjustDialog')\n\n      modal.handleUpdate()\n\n      expect(spy).toHaveBeenCalled()\n    })\n  })\n\n  describe('data-api', () => {\n    it('should toggle modal', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<button type=\"button\" data-bs-toggle=\"modal\" data-bs-target=\"#exampleModal\"></button>',\n          '<div id=\"exampleModal\" class=\"modal\"><div class=\"modal-dialog\"></div></div>'\n        ].join('')\n\n        const modalEl = fixtureEl.querySelector('.modal')\n        const trigger = fixtureEl.querySelector('[data-bs-toggle=\"modal\"]')\n\n        modalEl.addEventListener('shown.bs.modal', () => {\n          expect(modalEl.getAttribute('aria-modal')).toEqual('true')\n          expect(modalEl.getAttribute('role')).toEqual('dialog')\n          expect(modalEl.getAttribute('aria-hidden')).toBeNull()\n          expect(modalEl.style.display).toEqual('block')\n          expect(document.querySelector('.modal-backdrop')).not.toBeNull()\n          setTimeout(() => trigger.click(), 10)\n        })\n\n        modalEl.addEventListener('hidden.bs.modal', () => {\n          expect(modalEl.getAttribute('aria-modal')).toBeNull()\n          expect(modalEl.getAttribute('role')).toBeNull()\n          expect(modalEl.getAttribute('aria-hidden')).toEqual('true')\n          expect(modalEl.style.display).toEqual('none')\n          expect(document.querySelector('.modal-backdrop')).toBeNull()\n          resolve()\n        })\n\n        trigger.click()\n      })\n    })\n\n    it('should not recreate a new modal', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<button type=\"button\" data-bs-toggle=\"modal\" data-bs-target=\"#exampleModal\"></button>',\n          '<div id=\"exampleModal\" class=\"modal\"><div class=\"modal-dialog\"></div></div>'\n        ].join('')\n\n        const modalEl = fixtureEl.querySelector('.modal')\n        const modal = new Modal(modalEl)\n        const trigger = fixtureEl.querySelector('[data-bs-toggle=\"modal\"]')\n\n        const spy = spyOn(modal, 'show').and.callThrough()\n\n        modalEl.addEventListener('shown.bs.modal', () => {\n          expect(spy).toHaveBeenCalled()\n          resolve()\n        })\n\n        trigger.click()\n      })\n    })\n\n    it('should prevent default when the trigger is <a> or <area>', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<a data-bs-toggle=\"modal\" href=\"#\" data-bs-target=\"#exampleModal\"></a>',\n          '<div id=\"exampleModal\" class=\"modal\"><div class=\"modal-dialog\"></div></div>'\n        ].join('')\n\n        const modalEl = fixtureEl.querySelector('.modal')\n        const trigger = fixtureEl.querySelector('[data-bs-toggle=\"modal\"]')\n\n        const spy = spyOn(Event.prototype, 'preventDefault').and.callThrough()\n\n        modalEl.addEventListener('shown.bs.modal', () => {\n          expect(modalEl.getAttribute('aria-modal')).toEqual('true')\n          expect(modalEl.getAttribute('role')).toEqual('dialog')\n          expect(modalEl.getAttribute('aria-hidden')).toBeNull()\n          expect(modalEl.style.display).toEqual('block')\n          expect(document.querySelector('.modal-backdrop')).not.toBeNull()\n          expect(spy).toHaveBeenCalled()\n          resolve()\n        })\n\n        trigger.click()\n      })\n    })\n\n    it('should focus the trigger on hide', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<a data-bs-toggle=\"modal\" href=\"#\" data-bs-target=\"#exampleModal\"></a>',\n          '<div id=\"exampleModal\" class=\"modal\"><div class=\"modal-dialog\"></div></div>'\n        ].join('')\n\n        const modalEl = fixtureEl.querySelector('.modal')\n        const trigger = fixtureEl.querySelector('[data-bs-toggle=\"modal\"]')\n\n        const spy = spyOn(trigger, 'focus')\n\n        modalEl.addEventListener('shown.bs.modal', () => {\n          const modal = Modal.getInstance(modalEl)\n\n          modal.hide()\n        })\n\n        const hideListener = () => {\n          setTimeout(() => {\n            expect(spy).toHaveBeenCalled()\n            resolve()\n          }, 20)\n        }\n\n        modalEl.addEventListener('hidden.bs.modal', () => {\n          hideListener()\n        })\n\n        trigger.click()\n      })\n    })\n\n    it('should open modal, having special characters in its id', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<button class=\"btn btn-primary\" data-bs-toggle=\"modal\" data-bs-target=\"#j_id22:exampleModal\">',\n          '   Launch demo modal',\n          '</button>',\n          '<div class=\"modal fade\" id=\"j_id22:exampleModal\" aria-labelledby=\"exampleModalLabel\" aria-hidden=\"true\">',\n          '  <div class=\"modal-dialog\">',\n          '    <div class=\"modal-content\">',\n          '      <div class=\"modal-body\">',\n          '        <p>modal body</p>',\n          '      </div>',\n          '    </div>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const modalEl = fixtureEl.querySelector('.modal')\n        const trigger = fixtureEl.querySelector('[data-bs-toggle=\"modal\"]')\n\n        modalEl.addEventListener('shown.bs.modal', () => {\n          resolve()\n        })\n\n        trigger.click()\n      })\n    })\n\n    it('should not prevent default when a click occurred on data-bs-dismiss=\"modal\" where tagName is DIFFERENT than <a> or <area>', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div class=\"modal\">',\n          '  <div class=\"modal-dialog\">',\n          '    <button type=\"button\" data-bs-dismiss=\"modal\"></button>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const modalEl = fixtureEl.querySelector('.modal')\n        const btnClose = fixtureEl.querySelector('button[data-bs-dismiss=\"modal\"]')\n        const modal = new Modal(modalEl)\n\n        const spy = spyOn(Event.prototype, 'preventDefault').and.callThrough()\n\n        modalEl.addEventListener('shown.bs.modal', () => {\n          btnClose.click()\n        })\n\n        modalEl.addEventListener('hidden.bs.modal', () => {\n          expect(spy).not.toHaveBeenCalled()\n          resolve()\n        })\n\n        modal.show()\n      })\n    })\n\n    it('should prevent default when a click occurred on data-bs-dismiss=\"modal\" where tagName is <a> or <area>', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div class=\"modal\">',\n          '  <div class=\"modal-dialog\">',\n          '    <a type=\"button\" data-bs-dismiss=\"modal\"></a>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const modalEl = fixtureEl.querySelector('.modal')\n        const btnClose = fixtureEl.querySelector('a[data-bs-dismiss=\"modal\"]')\n        const modal = new Modal(modalEl)\n\n        const spy = spyOn(Event.prototype, 'preventDefault').and.callThrough()\n\n        modalEl.addEventListener('shown.bs.modal', () => {\n          btnClose.click()\n        })\n\n        modalEl.addEventListener('hidden.bs.modal', () => {\n          expect(spy).toHaveBeenCalled()\n          resolve()\n        })\n\n        modal.show()\n      })\n    })\n    it('should not focus the trigger if the modal is not visible', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<a data-bs-toggle=\"modal\" href=\"#\" data-bs-target=\"#exampleModal\" style=\"display: none;\"></a>',\n          '<div id=\"exampleModal\" class=\"modal\" style=\"display: none;\"><div class=\"modal-dialog\"></div></div>'\n        ].join('')\n\n        const modalEl = fixtureEl.querySelector('.modal')\n        const trigger = fixtureEl.querySelector('[data-bs-toggle=\"modal\"]')\n\n        const spy = spyOn(trigger, 'focus')\n\n        modalEl.addEventListener('shown.bs.modal', () => {\n          const modal = Modal.getInstance(modalEl)\n\n          modal.hide()\n        })\n\n        const hideListener = () => {\n          setTimeout(() => {\n            expect(spy).not.toHaveBeenCalled()\n            resolve()\n          }, 20)\n        }\n\n        modalEl.addEventListener('hidden.bs.modal', () => {\n          hideListener()\n        })\n\n        trigger.click()\n      })\n    })\n    it('should not focus the trigger if the modal is not shown', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<a data-bs-toggle=\"modal\" href=\"#\" data-bs-target=\"#exampleModal\"></a>',\n          '<div id=\"exampleModal\" class=\"modal\"><div class=\"modal-dialog\"></div></div>'\n        ].join('')\n\n        const modalEl = fixtureEl.querySelector('.modal')\n        const trigger = fixtureEl.querySelector('[data-bs-toggle=\"modal\"]')\n\n        const spy = spyOn(trigger, 'focus')\n\n        const showListener = () => {\n          setTimeout(() => {\n            expect(spy).not.toHaveBeenCalled()\n            resolve()\n          }, 10)\n        }\n\n        modalEl.addEventListener('show.bs.modal', event => {\n          event.preventDefault()\n          showListener()\n        })\n\n        trigger.click()\n      })\n    })\n\n    it('should call hide first, if another modal is open', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<button data-bs-toggle=\"modal\"  data-bs-target=\"#modal2\"></button>',\n          '<div id=\"modal1\" class=\"modal fade\"><div class=\"modal-dialog\"></div></div>',\n          '<div id=\"modal2\" class=\"modal\"><div class=\"modal-dialog\"></div></div>'\n        ].join('')\n\n        const trigger2 = fixtureEl.querySelector('button')\n        const modalEl1 = document.querySelector('#modal1')\n        const modalEl2 = document.querySelector('#modal2')\n        const modal1 = new Modal(modalEl1)\n\n        modalEl1.addEventListener('shown.bs.modal', () => {\n          trigger2.click()\n        })\n        modalEl1.addEventListener('hidden.bs.modal', () => {\n          expect(Modal.getInstance(modalEl2)).not.toBeNull()\n          expect(modalEl2).toHaveClass('show')\n          resolve()\n        })\n        modal1.show()\n      })\n    })\n  })\n  describe('jQueryInterface', () => {\n    it('should create a modal', () => {\n      fixtureEl.innerHTML = '<div class=\"modal\"><div class=\"modal-dialog\"></div></div>'\n\n      const div = fixtureEl.querySelector('div')\n\n      jQueryMock.fn.modal = Modal.jQueryInterface\n      jQueryMock.elements = [div]\n\n      jQueryMock.fn.modal.call(jQueryMock)\n\n      expect(Modal.getInstance(div)).not.toBeNull()\n    })\n\n    it('should create a modal with given config', () => {\n      fixtureEl.innerHTML = '<div class=\"modal\"><div class=\"modal-dialog\"></div></div>'\n\n      const div = fixtureEl.querySelector('div')\n\n      jQueryMock.fn.modal = Modal.jQueryInterface\n      jQueryMock.elements = [div]\n\n      jQueryMock.fn.modal.call(jQueryMock, { keyboard: false })\n      const spy = spyOn(Modal.prototype, 'constructor')\n      expect(spy).not.toHaveBeenCalledWith(div, { keyboard: false })\n\n      const modal = Modal.getInstance(div)\n      expect(modal).not.toBeNull()\n      expect(modal._config.keyboard).toBeFalse()\n    })\n\n    it('should not re create a modal', () => {\n      fixtureEl.innerHTML = '<div class=\"modal\"><div class=\"modal-dialog\"></div></div>'\n\n      const div = fixtureEl.querySelector('div')\n      const modal = new Modal(div)\n\n      jQueryMock.fn.modal = Modal.jQueryInterface\n      jQueryMock.elements = [div]\n\n      jQueryMock.fn.modal.call(jQueryMock)\n\n      expect(Modal.getInstance(div)).toEqual(modal)\n    })\n\n    it('should throw error on undefined method', () => {\n      fixtureEl.innerHTML = '<div class=\"modal\"><div class=\"modal-dialog\"></div></div>'\n\n      const div = fixtureEl.querySelector('div')\n      const action = 'undefinedMethod'\n\n      jQueryMock.fn.modal = Modal.jQueryInterface\n      jQueryMock.elements = [div]\n\n      expect(() => {\n        jQueryMock.fn.modal.call(jQueryMock, action)\n      }).toThrowError(TypeError, `No method named \"${action}\"`)\n    })\n\n    it('should call show method', () => {\n      fixtureEl.innerHTML = '<div class=\"modal\"><div class=\"modal-dialog\"></div></div>'\n\n      const div = fixtureEl.querySelector('div')\n      const modal = new Modal(div)\n\n      jQueryMock.fn.modal = Modal.jQueryInterface\n      jQueryMock.elements = [div]\n\n      const spy = spyOn(modal, 'show')\n\n      jQueryMock.fn.modal.call(jQueryMock, 'show')\n\n      expect(spy).toHaveBeenCalled()\n    })\n\n    it('should not call show method', () => {\n      fixtureEl.innerHTML = '<div class=\"modal\" data-bs-show=\"false\"><div class=\"modal-dialog\"></div></div>'\n\n      const div = fixtureEl.querySelector('div')\n\n      jQueryMock.fn.modal = Modal.jQueryInterface\n      jQueryMock.elements = [div]\n\n      const spy = spyOn(Modal.prototype, 'show')\n\n      jQueryMock.fn.modal.call(jQueryMock)\n\n      expect(spy).not.toHaveBeenCalled()\n    })\n  })\n\n  describe('getInstance', () => {\n    it('should return modal instance', () => {\n      fixtureEl.innerHTML = '<div class=\"modal\"><div class=\"modal-dialog\"></div></div>'\n\n      const div = fixtureEl.querySelector('div')\n      const modal = new Modal(div)\n\n      expect(Modal.getInstance(div)).toEqual(modal)\n      expect(Modal.getInstance(div)).toBeInstanceOf(Modal)\n    })\n\n    it('should return null when there is no modal instance', () => {\n      fixtureEl.innerHTML = '<div class=\"modal\"><div class=\"modal-dialog\"></div></div>'\n\n      const div = fixtureEl.querySelector('div')\n\n      expect(Modal.getInstance(div)).toBeNull()\n    })\n  })\n\n  describe('getOrCreateInstance', () => {\n    it('should return modal instance', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n      const modal = new Modal(div)\n\n      expect(Modal.getOrCreateInstance(div)).toEqual(modal)\n      expect(Modal.getInstance(div)).toEqual(Modal.getOrCreateInstance(div, {}))\n      expect(Modal.getOrCreateInstance(div)).toBeInstanceOf(Modal)\n    })\n\n    it('should return new instance when there is no modal instance', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n\n      expect(Modal.getInstance(div)).toBeNull()\n      expect(Modal.getOrCreateInstance(div)).toBeInstanceOf(Modal)\n    })\n\n    it('should return new instance when there is no modal instance with given configuration', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n\n      expect(Modal.getInstance(div)).toBeNull()\n      const modal = Modal.getOrCreateInstance(div, {\n        backdrop: true\n      })\n      expect(modal).toBeInstanceOf(Modal)\n\n      expect(modal._config.backdrop).toBeTrue()\n    })\n\n    it('should return the instance when exists without given configuration', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n      const modal = new Modal(div, {\n        backdrop: true\n      })\n      expect(Modal.getInstance(div)).toEqual(modal)\n\n      const modal2 = Modal.getOrCreateInstance(div, {\n        backdrop: false\n      })\n      expect(modal).toBeInstanceOf(Modal)\n      expect(modal2).toEqual(modal)\n\n      expect(modal2._config.backdrop).toBeTrue()\n    })\n  })\n})\n"
  },
  {
    "path": "js/tests/unit/offcanvas.spec.js",
    "content": "import EventHandler from '../../src/dom/event-handler.js'\nimport Offcanvas from '../../src/offcanvas.js'\nimport { isVisible } from '../../src/util/index.js'\nimport ScrollBarHelper from '../../src/util/scrollbar.js'\nimport {\n  clearBodyAndDocument, clearFixture, createEvent, getFixture, jQueryMock\n} from '../helpers/fixture.js'\n\ndescribe('Offcanvas', () => {\n  let fixtureEl\n\n  beforeAll(() => {\n    fixtureEl = getFixture()\n  })\n\n  afterEach(() => {\n    clearFixture()\n    document.body.classList.remove('offcanvas-open')\n    clearBodyAndDocument()\n  })\n\n  beforeEach(() => {\n    clearBodyAndDocument()\n  })\n\n  describe('VERSION', () => {\n    it('should return plugin version', () => {\n      expect(Offcanvas.VERSION).toEqual(jasmine.any(String))\n    })\n  })\n\n  describe('Default', () => {\n    it('should return plugin default config', () => {\n      expect(Offcanvas.Default).toEqual(jasmine.any(Object))\n    })\n  })\n\n  describe('DATA_KEY', () => {\n    it('should return plugin data key', () => {\n      expect(Offcanvas.DATA_KEY).toEqual('bs.offcanvas')\n    })\n  })\n\n  describe('constructor', () => {\n    it('should call hide when a element with data-bs-dismiss=\"offcanvas\" is clicked', () => {\n      fixtureEl.innerHTML = [\n        '<div class=\"offcanvas\">',\n        '  <a href=\"#\" data-bs-dismiss=\"offcanvas\">Close</a>',\n        '</div>'\n      ].join('')\n\n      const offCanvasEl = fixtureEl.querySelector('.offcanvas')\n      const closeEl = fixtureEl.querySelector('a')\n      const offCanvas = new Offcanvas(offCanvasEl)\n\n      const spy = spyOn(offCanvas, 'hide')\n\n      closeEl.click()\n\n      expect(offCanvas._config.keyboard).toBeTrue()\n      expect(spy).toHaveBeenCalled()\n    })\n\n    it('should hide if esc is pressed', () => {\n      fixtureEl.innerHTML = '<div class=\"offcanvas\"></div>'\n\n      const offCanvasEl = fixtureEl.querySelector('.offcanvas')\n      const offCanvas = new Offcanvas(offCanvasEl)\n      const keyDownEsc = createEvent('keydown')\n      keyDownEsc.key = 'Escape'\n\n      const spy = spyOn(offCanvas, 'hide')\n\n      offCanvasEl.dispatchEvent(keyDownEsc)\n\n      expect(spy).toHaveBeenCalled()\n    })\n\n    it('should hide if esc is pressed and backdrop is static', () => {\n      fixtureEl.innerHTML = '<div class=\"offcanvas\"></div>'\n\n      const offCanvasEl = fixtureEl.querySelector('.offcanvas')\n      const offCanvas = new Offcanvas(offCanvasEl, { backdrop: 'static' })\n      const keyDownEsc = createEvent('keydown')\n      keyDownEsc.key = 'Escape'\n\n      const spy = spyOn(offCanvas, 'hide')\n\n      offCanvasEl.dispatchEvent(keyDownEsc)\n\n      expect(spy).toHaveBeenCalled()\n    })\n\n    it('should not hide if esc is not pressed', () => {\n      fixtureEl.innerHTML = '<div class=\"offcanvas\"></div>'\n\n      const offCanvasEl = fixtureEl.querySelector('.offcanvas')\n      const offCanvas = new Offcanvas(offCanvasEl)\n      const keydownTab = createEvent('keydown')\n      keydownTab.key = 'Tab'\n\n      const spy = spyOn(offCanvas, 'hide')\n\n      offCanvasEl.dispatchEvent(keydownTab)\n\n      expect(spy).not.toHaveBeenCalled()\n    })\n\n    it('should not hide if esc is pressed but with keyboard = false', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<div class=\"offcanvas\"></div>'\n\n        const offCanvasEl = fixtureEl.querySelector('.offcanvas')\n        const offCanvas = new Offcanvas(offCanvasEl, { keyboard: false })\n        const keyDownEsc = createEvent('keydown')\n        keyDownEsc.key = 'Escape'\n\n        const spy = spyOn(offCanvas, 'hide')\n        const hidePreventedSpy = jasmine.createSpy('hidePrevented')\n        offCanvasEl.addEventListener('hidePrevented.bs.offcanvas', hidePreventedSpy)\n\n        offCanvasEl.addEventListener('shown.bs.offcanvas', () => {\n          expect(offCanvas._config.keyboard).toBeFalse()\n          offCanvasEl.dispatchEvent(keyDownEsc)\n\n          expect(hidePreventedSpy).toHaveBeenCalled()\n          expect(spy).not.toHaveBeenCalled()\n          resolve()\n        })\n\n        offCanvas.show()\n      })\n    })\n\n    it('should not hide if user clicks on static backdrop', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<div class=\"offcanvas\"></div>'\n\n        const offCanvasEl = fixtureEl.querySelector('div')\n        const offCanvas = new Offcanvas(offCanvasEl, { backdrop: 'static' })\n\n        const clickEvent = new Event('mousedown', { bubbles: true, cancelable: true })\n        const spyClick = spyOn(offCanvas._backdrop._config, 'clickCallback').and.callThrough()\n        const spyHide = spyOn(offCanvas._backdrop, 'hide').and.callThrough()\n        const hidePreventedSpy = jasmine.createSpy('hidePrevented')\n        offCanvasEl.addEventListener('hidePrevented.bs.offcanvas', hidePreventedSpy)\n\n        offCanvasEl.addEventListener('shown.bs.offcanvas', () => {\n          expect(spyClick).toEqual(jasmine.any(Function))\n\n          offCanvas._backdrop._getElement().dispatchEvent(clickEvent)\n          expect(hidePreventedSpy).toHaveBeenCalled()\n          expect(spyHide).not.toHaveBeenCalled()\n          resolve()\n        })\n\n        offCanvas.show()\n      })\n    })\n\n    it('should call `hide` on resize, if element\\'s position is not fixed any more', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<div class=\"offcanvas-lg\"></div>'\n\n        const offCanvasEl = fixtureEl.querySelector('div')\n        const offCanvas = new Offcanvas(offCanvasEl)\n\n        const spy = spyOn(offCanvas, 'hide').and.callThrough()\n\n        offCanvasEl.addEventListener('shown.bs.offcanvas', () => {\n          const resizeEvent = createEvent('resize')\n          offCanvasEl.style.removeProperty('position')\n\n          window.dispatchEvent(resizeEvent)\n          expect(spy).toHaveBeenCalled()\n          resolve()\n        })\n\n        offCanvas.show()\n      })\n    })\n  })\n\n  describe('config', () => {\n    it('should have default values', () => {\n      fixtureEl.innerHTML = '<div class=\"offcanvas\"></div>'\n\n      const offCanvasEl = fixtureEl.querySelector('.offcanvas')\n      const offCanvas = new Offcanvas(offCanvasEl)\n\n      expect(offCanvas._config.backdrop).toBeTrue()\n      expect(offCanvas._backdrop._config.isVisible).toBeTrue()\n      expect(offCanvas._config.keyboard).toBeTrue()\n      expect(offCanvas._config.scroll).toBeFalse()\n    })\n\n    it('should read data attributes and override default config', () => {\n      fixtureEl.innerHTML = '<div class=\"offcanvas\" data-bs-scroll=\"true\" data-bs-backdrop=\"false\" data-bs-keyboard=\"false\"></div>'\n\n      const offCanvasEl = fixtureEl.querySelector('.offcanvas')\n      const offCanvas = new Offcanvas(offCanvasEl)\n\n      expect(offCanvas._config.backdrop).toBeFalse()\n      expect(offCanvas._backdrop._config.isVisible).toBeFalse()\n      expect(offCanvas._config.keyboard).toBeFalse()\n      expect(offCanvas._config.scroll).toBeTrue()\n    })\n\n    it('given a config object must override data attributes', () => {\n      fixtureEl.innerHTML = '<div class=\"offcanvas\" data-bs-scroll=\"true\" data-bs-backdrop=\"false\" data-bs-keyboard=\"false\"></div>'\n\n      const offCanvasEl = fixtureEl.querySelector('.offcanvas')\n      const offCanvas = new Offcanvas(offCanvasEl, {\n        backdrop: true,\n        keyboard: true,\n        scroll: false\n      })\n      expect(offCanvas._config.backdrop).toBeTrue()\n      expect(offCanvas._config.keyboard).toBeTrue()\n      expect(offCanvas._config.scroll).toBeFalse()\n    })\n  })\n\n  describe('options', () => {\n    it('if scroll is enabled, should allow body to scroll while offcanvas is open', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<div class=\"offcanvas\"></div>'\n\n        const spyHide = spyOn(ScrollBarHelper.prototype, 'hide').and.callThrough()\n        const spyReset = spyOn(ScrollBarHelper.prototype, 'reset').and.callThrough()\n        const offCanvasEl = fixtureEl.querySelector('.offcanvas')\n        const offCanvas = new Offcanvas(offCanvasEl, { scroll: true })\n\n        offCanvasEl.addEventListener('shown.bs.offcanvas', () => {\n          expect(spyHide).not.toHaveBeenCalled()\n          offCanvas.hide()\n        })\n        offCanvasEl.addEventListener('hidden.bs.offcanvas', () => {\n          expect(spyReset).not.toHaveBeenCalled()\n          resolve()\n        })\n        offCanvas.show()\n      })\n    })\n\n    it('if scroll is disabled, should call ScrollBarHelper to handle scrollBar on body', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<div class=\"offcanvas\"></div>'\n\n        const spyHide = spyOn(ScrollBarHelper.prototype, 'hide').and.callThrough()\n        const spyReset = spyOn(ScrollBarHelper.prototype, 'reset').and.callThrough()\n        const offCanvasEl = fixtureEl.querySelector('.offcanvas')\n        const offCanvas = new Offcanvas(offCanvasEl, { scroll: false })\n\n        offCanvasEl.addEventListener('shown.bs.offcanvas', () => {\n          expect(spyHide).toHaveBeenCalled()\n          offCanvas.hide()\n        })\n        offCanvasEl.addEventListener('hidden.bs.offcanvas', () => {\n          expect(spyReset).toHaveBeenCalled()\n          resolve()\n        })\n        offCanvas.show()\n      })\n    })\n\n    it('should hide a shown element if user click on backdrop', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<div class=\"offcanvas\"></div>'\n\n        const offCanvasEl = fixtureEl.querySelector('div')\n        const offCanvas = new Offcanvas(offCanvasEl, { backdrop: true })\n\n        const clickEvent = new Event('mousedown', { bubbles: true, cancelable: true })\n        const spy = spyOn(offCanvas._backdrop._config, 'clickCallback').and.callThrough()\n\n        offCanvasEl.addEventListener('shown.bs.offcanvas', () => {\n          expect(offCanvas._backdrop._config.clickCallback).toEqual(jasmine.any(Function))\n\n          offCanvas._backdrop._getElement().dispatchEvent(clickEvent)\n        })\n\n        offCanvasEl.addEventListener('hidden.bs.offcanvas', () => {\n          expect(spy).toHaveBeenCalled()\n          resolve()\n        })\n\n        offCanvas.show()\n      })\n    })\n\n    it('should not trap focus if scroll is allowed', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<div class=\"offcanvas\"></div>'\n\n        const offCanvasEl = fixtureEl.querySelector('.offcanvas')\n        const offCanvas = new Offcanvas(offCanvasEl, {\n          scroll: true,\n          backdrop: false\n        })\n\n        const spy = spyOn(offCanvas._focustrap, 'activate').and.callThrough()\n\n        offCanvasEl.addEventListener('shown.bs.offcanvas', () => {\n          expect(spy).not.toHaveBeenCalled()\n          resolve()\n        })\n\n        offCanvas.show()\n      })\n    })\n\n    it('should trap focus if scroll is allowed OR backdrop is enabled', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<div class=\"offcanvas\"></div>'\n\n        const offCanvasEl = fixtureEl.querySelector('.offcanvas')\n        const offCanvas = new Offcanvas(offCanvasEl, {\n          scroll: true,\n          backdrop: true\n        })\n\n        const spy = spyOn(offCanvas._focustrap, 'activate').and.callThrough()\n\n        offCanvasEl.addEventListener('shown.bs.offcanvas', () => {\n          expect(spy).toHaveBeenCalled()\n          resolve()\n        })\n\n        offCanvas.show()\n      })\n    })\n  })\n\n  describe('toggle', () => {\n    it('should call show method if show class is not present', () => {\n      fixtureEl.innerHTML = '<div class=\"offcanvas\"></div>'\n\n      const offCanvasEl = fixtureEl.querySelector('.offcanvas')\n      const offCanvas = new Offcanvas(offCanvasEl)\n\n      const spy = spyOn(offCanvas, 'show')\n\n      offCanvas.toggle()\n\n      expect(spy).toHaveBeenCalled()\n    })\n\n    it('should call hide method if show class is present', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<div class=\"offcanvas\"></div>'\n\n        const offCanvasEl = fixtureEl.querySelector('.offcanvas')\n        const offCanvas = new Offcanvas(offCanvasEl)\n\n        offCanvasEl.addEventListener('shown.bs.offcanvas', () => {\n          expect(offCanvasEl).toHaveClass('show')\n          const spy = spyOn(offCanvas, 'hide')\n\n          offCanvas.toggle()\n\n          expect(spy).toHaveBeenCalled()\n          resolve()\n        })\n\n        offCanvas.show()\n      })\n    })\n  })\n\n  describe('show', () => {\n    it('should add `showing` class during opening and `show` class on end', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<div class=\"offcanvas\"></div>'\n        const offCanvasEl = fixtureEl.querySelector('.offcanvas')\n        const offCanvas = new Offcanvas(offCanvasEl)\n\n        offCanvasEl.addEventListener('show.bs.offcanvas', () => {\n          expect(offCanvasEl).not.toHaveClass('show')\n        })\n\n        offCanvasEl.addEventListener('shown.bs.offcanvas', () => {\n          expect(offCanvasEl).not.toHaveClass('showing')\n          expect(offCanvasEl).toHaveClass('show')\n          resolve()\n        })\n\n        offCanvas.show()\n        expect(offCanvasEl).toHaveClass('showing')\n      })\n    })\n\n    it('should do nothing if already shown', () => {\n      fixtureEl.innerHTML = '<div class=\"offcanvas show\"></div>'\n\n      const offCanvasEl = fixtureEl.querySelector('div')\n      const offCanvas = new Offcanvas(offCanvasEl)\n      offCanvas.show()\n\n      expect(offCanvasEl).toHaveClass('show')\n\n      const spyShow = spyOn(offCanvas._backdrop, 'show').and.callThrough()\n      const spyTrigger = spyOn(EventHandler, 'trigger').and.callThrough()\n      offCanvas.show()\n\n      expect(spyTrigger).not.toHaveBeenCalled()\n      expect(spyShow).not.toHaveBeenCalled()\n    })\n\n    it('should show a hidden element', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<div class=\"offcanvas\"></div>'\n\n        const offCanvasEl = fixtureEl.querySelector('div')\n        const offCanvas = new Offcanvas(offCanvasEl)\n        const spy = spyOn(offCanvas._backdrop, 'show').and.callThrough()\n\n        offCanvasEl.addEventListener('shown.bs.offcanvas', () => {\n          expect(offCanvasEl).toHaveClass('show')\n          expect(spy).toHaveBeenCalled()\n          resolve()\n        })\n\n        offCanvas.show()\n      })\n    })\n\n    it('should not fire shown when show is prevented', () => {\n      return new Promise((resolve, reject) => {\n        fixtureEl.innerHTML = '<div class=\"offcanvas\"></div>'\n\n        const offCanvasEl = fixtureEl.querySelector('div')\n        const offCanvas = new Offcanvas(offCanvasEl)\n        const spy = spyOn(offCanvas._backdrop, 'show').and.callThrough()\n\n        const expectEnd = () => {\n          setTimeout(() => {\n            expect(spy).not.toHaveBeenCalled()\n            resolve()\n          }, 10)\n        }\n\n        offCanvasEl.addEventListener('show.bs.offcanvas', event => {\n          event.preventDefault()\n          expectEnd()\n        })\n\n        offCanvasEl.addEventListener('shown.bs.offcanvas', () => {\n          reject(new Error('should not fire shown event'))\n        })\n\n        offCanvas.show()\n      })\n    })\n\n    it('on window load, should make visible an offcanvas element, if its markup contains class \"show\"', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<div class=\"offcanvas show\"></div>'\n\n        const offCanvasEl = fixtureEl.querySelector('div')\n        const spy = spyOn(Offcanvas.prototype, 'show').and.callThrough()\n\n        offCanvasEl.addEventListener('shown.bs.offcanvas', () => {\n          resolve()\n        })\n\n        window.dispatchEvent(createEvent('load'))\n\n        const instance = Offcanvas.getInstance(offCanvasEl)\n        expect(instance).not.toBeNull()\n        expect(spy).toHaveBeenCalled()\n      })\n    })\n\n    it('should trap focus', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<div class=\"offcanvas\"></div>'\n\n        const offCanvasEl = fixtureEl.querySelector('.offcanvas')\n        const offCanvas = new Offcanvas(offCanvasEl)\n\n        const spy = spyOn(offCanvas._focustrap, 'activate').and.callThrough()\n\n        offCanvasEl.addEventListener('shown.bs.offcanvas', () => {\n          expect(spy).toHaveBeenCalled()\n          resolve()\n        })\n\n        offCanvas.show()\n      })\n    })\n  })\n\n  describe('hide', () => {\n    it('should add `hiding` class during closing and remover `show` & `hiding` classes on end', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<div class=\"offcanvas\"></div>'\n        const offCanvasEl = fixtureEl.querySelector('.offcanvas')\n        const offCanvas = new Offcanvas(offCanvasEl)\n\n        offCanvasEl.addEventListener('hide.bs.offcanvas', () => {\n          expect(offCanvasEl).not.toHaveClass('showing')\n          expect(offCanvasEl).toHaveClass('show')\n        })\n\n        offCanvasEl.addEventListener('hidden.bs.offcanvas', () => {\n          expect(offCanvasEl).not.toHaveClass('hiding')\n          expect(offCanvasEl).not.toHaveClass('show')\n          resolve()\n        })\n\n        offCanvas.show()\n        offCanvasEl.addEventListener('shown.bs.offcanvas', () => {\n          offCanvas.hide()\n          expect(offCanvasEl).not.toHaveClass('showing')\n          expect(offCanvasEl).toHaveClass('hiding')\n        })\n      })\n    })\n\n    it('should do nothing if already shown', () => {\n      fixtureEl.innerHTML = '<div class=\"offcanvas\"></div>'\n\n      const spyTrigger = spyOn(EventHandler, 'trigger').and.callThrough()\n\n      const offCanvasEl = fixtureEl.querySelector('div')\n      const offCanvas = new Offcanvas(offCanvasEl)\n      const spyHide = spyOn(offCanvas._backdrop, 'hide').and.callThrough()\n\n      offCanvas.hide()\n      expect(spyHide).not.toHaveBeenCalled()\n      expect(spyTrigger).not.toHaveBeenCalled()\n    })\n\n    it('should hide a shown element', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<div class=\"offcanvas\"></div>'\n\n        const offCanvasEl = fixtureEl.querySelector('div')\n        const offCanvas = new Offcanvas(offCanvasEl)\n        const spy = spyOn(offCanvas._backdrop, 'hide').and.callThrough()\n        offCanvas.show()\n\n        offCanvasEl.addEventListener('hidden.bs.offcanvas', () => {\n          expect(offCanvasEl).not.toHaveClass('show')\n          expect(spy).toHaveBeenCalled()\n          resolve()\n        })\n\n        offCanvas.hide()\n      })\n    })\n\n    it('should not fire hidden when hide is prevented', () => {\n      return new Promise((resolve, reject) => {\n        fixtureEl.innerHTML = '<div class=\"offcanvas\"></div>'\n\n        const offCanvasEl = fixtureEl.querySelector('div')\n        const offCanvas = new Offcanvas(offCanvasEl)\n        const spy = spyOn(offCanvas._backdrop, 'hide').and.callThrough()\n\n        offCanvas.show()\n\n        const expectEnd = () => {\n          setTimeout(() => {\n            expect(spy).not.toHaveBeenCalled()\n            resolve()\n          }, 10)\n        }\n\n        offCanvasEl.addEventListener('hide.bs.offcanvas', event => {\n          event.preventDefault()\n          expectEnd()\n        })\n\n        offCanvasEl.addEventListener('hidden.bs.offcanvas', () => {\n          reject(new Error('should not fire hidden event'))\n        })\n\n        offCanvas.hide()\n      })\n    })\n\n    it('should release focus trap', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<div class=\"offcanvas\"></div>'\n\n        const offCanvasEl = fixtureEl.querySelector('div')\n        const offCanvas = new Offcanvas(offCanvasEl)\n        const spy = spyOn(offCanvas._focustrap, 'deactivate').and.callThrough()\n        offCanvas.show()\n\n        offCanvasEl.addEventListener('hidden.bs.offcanvas', () => {\n          expect(spy).toHaveBeenCalled()\n          resolve()\n        })\n\n        offCanvas.hide()\n      })\n    })\n  })\n\n  describe('dispose', () => {\n    it('should dispose an offcanvas', () => {\n      fixtureEl.innerHTML = '<div class=\"offcanvas\"></div>'\n\n      const offCanvasEl = fixtureEl.querySelector('div')\n      const offCanvas = new Offcanvas(offCanvasEl)\n      const backdrop = offCanvas._backdrop\n      const spyDispose = spyOn(backdrop, 'dispose').and.callThrough()\n      const focustrap = offCanvas._focustrap\n      const spyDeactivate = spyOn(focustrap, 'deactivate').and.callThrough()\n\n      expect(Offcanvas.getInstance(offCanvasEl)).toEqual(offCanvas)\n\n      offCanvas.dispose()\n\n      expect(spyDispose).toHaveBeenCalled()\n      expect(offCanvas._backdrop).toBeNull()\n      expect(spyDeactivate).toHaveBeenCalled()\n      expect(offCanvas._focustrap).toBeNull()\n      expect(Offcanvas.getInstance(offCanvasEl)).toBeNull()\n    })\n  })\n\n  describe('data-api', () => {\n    it('should not prevent event for input', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<input type=\"checkbox\" data-bs-toggle=\"offcanvas\" data-bs-target=\"#offcanvasdiv1\">',\n          '<div id=\"offcanvasdiv1\" class=\"offcanvas\"></div>'\n        ].join('')\n\n        const target = fixtureEl.querySelector('input')\n        const offCanvasEl = fixtureEl.querySelector('#offcanvasdiv1')\n\n        offCanvasEl.addEventListener('shown.bs.offcanvas', () => {\n          expect(offCanvasEl).toHaveClass('show')\n          expect(target.checked).toBeTrue()\n          resolve()\n        })\n\n        target.click()\n      })\n    })\n\n    it('should not call toggle on disabled elements', () => {\n      fixtureEl.innerHTML = [\n        '<a href=\"#\" data-bs-toggle=\"offcanvas\" data-bs-target=\"#offcanvasdiv1\" class=\"disabled\"></a>',\n        '<div id=\"offcanvasdiv1\" class=\"offcanvas\"></div>'\n      ].join('')\n\n      const target = fixtureEl.querySelector('a')\n\n      const spy = spyOn(Offcanvas.prototype, 'toggle')\n\n      target.click()\n\n      expect(spy).not.toHaveBeenCalled()\n    })\n\n    it('should call hide first, if another offcanvas is open', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<button id=\"btn2\" data-bs-toggle=\"offcanvas\" data-bs-target=\"#offcanvas2\"></button>',\n          '<div id=\"offcanvas1\" class=\"offcanvas\"></div>',\n          '<div id=\"offcanvas2\" class=\"offcanvas\"></div>'\n        ].join('')\n\n        const trigger2 = fixtureEl.querySelector('#btn2')\n        const offcanvasEl1 = document.querySelector('#offcanvas1')\n        const offcanvasEl2 = document.querySelector('#offcanvas2')\n        const offcanvas1 = new Offcanvas(offcanvasEl1)\n\n        offcanvasEl1.addEventListener('shown.bs.offcanvas', () => {\n          trigger2.click()\n        })\n        offcanvasEl1.addEventListener('hidden.bs.offcanvas', () => {\n          expect(Offcanvas.getInstance(offcanvasEl2)).not.toBeNull()\n          resolve()\n        })\n        offcanvas1.show()\n      })\n    })\n\n    it('should focus on trigger element after closing offcanvas', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<button id=\"btn\" data-bs-toggle=\"offcanvas\" data-bs-target=\"#offcanvas\"></button>',\n          '<div id=\"offcanvas\" class=\"offcanvas\"></div>'\n        ].join('')\n\n        const trigger = fixtureEl.querySelector('#btn')\n        const offcanvasEl = fixtureEl.querySelector('#offcanvas')\n        const offcanvas = new Offcanvas(offcanvasEl)\n        const spy = spyOn(trigger, 'focus')\n\n        offcanvasEl.addEventListener('shown.bs.offcanvas', () => {\n          offcanvas.hide()\n        })\n        offcanvasEl.addEventListener('hidden.bs.offcanvas', () => {\n          setTimeout(() => {\n            expect(spy).toHaveBeenCalled()\n            resolve()\n          }, 5)\n        })\n\n        trigger.click()\n      })\n    })\n\n    it('should not focus on trigger element after closing offcanvas, if it is not visible', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<button id=\"btn\" data-bs-toggle=\"offcanvas\" data-bs-target=\"#offcanvas\"></button>',\n          '<div id=\"offcanvas\" class=\"offcanvas\"></div>'\n        ].join('')\n\n        const trigger = fixtureEl.querySelector('#btn')\n        const offcanvasEl = fixtureEl.querySelector('#offcanvas')\n        const offcanvas = new Offcanvas(offcanvasEl)\n        const spy = spyOn(trigger, 'focus')\n\n        offcanvasEl.addEventListener('shown.bs.offcanvas', () => {\n          trigger.style.display = 'none'\n          offcanvas.hide()\n        })\n        offcanvasEl.addEventListener('hidden.bs.offcanvas', () => {\n          setTimeout(() => {\n            expect(isVisible(trigger)).toBeFalse()\n            expect(spy).not.toHaveBeenCalled()\n            resolve()\n          }, 5)\n        })\n\n        trigger.click()\n      })\n    })\n  })\n\n  describe('jQueryInterface', () => {\n    it('should create an offcanvas', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n\n      jQueryMock.fn.offcanvas = Offcanvas.jQueryInterface\n      jQueryMock.elements = [div]\n\n      jQueryMock.fn.offcanvas.call(jQueryMock)\n\n      expect(Offcanvas.getInstance(div)).not.toBeNull()\n    })\n\n    it('should not re create an offcanvas', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n      const offCanvas = new Offcanvas(div)\n\n      jQueryMock.fn.offcanvas = Offcanvas.jQueryInterface\n      jQueryMock.elements = [div]\n\n      jQueryMock.fn.offcanvas.call(jQueryMock)\n\n      expect(Offcanvas.getInstance(div)).toEqual(offCanvas)\n    })\n\n    it('should throw error on undefined method', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n      const action = 'undefinedMethod'\n\n      jQueryMock.fn.offcanvas = Offcanvas.jQueryInterface\n      jQueryMock.elements = [div]\n\n      expect(() => {\n        jQueryMock.fn.offcanvas.call(jQueryMock, action)\n      }).toThrowError(TypeError, `No method named \"${action}\"`)\n    })\n\n    it('should throw error on protected method', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n      const action = '_getConfig'\n\n      jQueryMock.fn.offcanvas = Offcanvas.jQueryInterface\n      jQueryMock.elements = [div]\n\n      expect(() => {\n        jQueryMock.fn.offcanvas.call(jQueryMock, action)\n      }).toThrowError(TypeError, `No method named \"${action}\"`)\n    })\n\n    it('should throw error if method \"constructor\" is being called', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n      const action = 'constructor'\n\n      jQueryMock.fn.offcanvas = Offcanvas.jQueryInterface\n      jQueryMock.elements = [div]\n\n      expect(() => {\n        jQueryMock.fn.offcanvas.call(jQueryMock, action)\n      }).toThrowError(TypeError, `No method named \"${action}\"`)\n    })\n\n    it('should call offcanvas method', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n\n      const spy = spyOn(Offcanvas.prototype, 'show')\n\n      jQueryMock.fn.offcanvas = Offcanvas.jQueryInterface\n      jQueryMock.elements = [div]\n\n      jQueryMock.fn.offcanvas.call(jQueryMock, 'show')\n      expect(spy).toHaveBeenCalled()\n    })\n\n    it('should create a offcanvas with given config', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n\n      jQueryMock.fn.offcanvas = Offcanvas.jQueryInterface\n      jQueryMock.elements = [div]\n\n      jQueryMock.fn.offcanvas.call(jQueryMock, { scroll: true })\n\n      const offcanvas = Offcanvas.getInstance(div)\n      expect(offcanvas).not.toBeNull()\n      expect(offcanvas._config.scroll).toBeTrue()\n    })\n  })\n\n  describe('getInstance', () => {\n    it('should return offcanvas instance', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n      const offCanvas = new Offcanvas(div)\n\n      expect(Offcanvas.getInstance(div)).toEqual(offCanvas)\n      expect(Offcanvas.getInstance(div)).toBeInstanceOf(Offcanvas)\n    })\n\n    it('should return null when there is no offcanvas instance', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n\n      expect(Offcanvas.getInstance(div)).toBeNull()\n    })\n  })\n\n  describe('getOrCreateInstance', () => {\n    it('should return offcanvas instance', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n      const offcanvas = new Offcanvas(div)\n\n      expect(Offcanvas.getOrCreateInstance(div)).toEqual(offcanvas)\n      expect(Offcanvas.getInstance(div)).toEqual(Offcanvas.getOrCreateInstance(div, {}))\n      expect(Offcanvas.getOrCreateInstance(div)).toBeInstanceOf(Offcanvas)\n    })\n\n    it('should return new instance when there is no Offcanvas instance', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n\n      expect(Offcanvas.getInstance(div)).toBeNull()\n      expect(Offcanvas.getOrCreateInstance(div)).toBeInstanceOf(Offcanvas)\n    })\n\n    it('should return new instance when there is no offcanvas instance with given configuration', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n\n      expect(Offcanvas.getInstance(div)).toBeNull()\n      const offcanvas = Offcanvas.getOrCreateInstance(div, {\n        scroll: true\n      })\n      expect(offcanvas).toBeInstanceOf(Offcanvas)\n\n      expect(offcanvas._config.scroll).toBeTrue()\n    })\n\n    it('should return the instance when exists without given configuration', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n      const offcanvas = new Offcanvas(div, {\n        scroll: true\n      })\n      expect(Offcanvas.getInstance(div)).toEqual(offcanvas)\n\n      const offcanvas2 = Offcanvas.getOrCreateInstance(div, {\n        scroll: false\n      })\n      expect(offcanvas).toBeInstanceOf(Offcanvas)\n      expect(offcanvas2).toEqual(offcanvas)\n\n      expect(offcanvas2._config.scroll).toBeTrue()\n    })\n  })\n})\n"
  },
  {
    "path": "js/tests/unit/popover.spec.js",
    "content": "import EventHandler from '../../src/dom/event-handler.js'\nimport Popover from '../../src/popover.js'\nimport {\n  clearFixture, getFixture, jQueryMock, createEvent\n} from '../helpers/fixture.js'\n\ndescribe('Popover', () => {\n  let fixtureEl\n\n  beforeAll(() => {\n    fixtureEl = getFixture()\n  })\n\n  afterEach(() => {\n    clearFixture()\n\n    const popoverList = document.querySelectorAll('.popover')\n\n    for (const popoverEl of popoverList) {\n      popoverEl.remove()\n    }\n  })\n\n  describe('VERSION', () => {\n    it('should return plugin version', () => {\n      expect(Popover.VERSION).toEqual(jasmine.any(String))\n    })\n  })\n\n  describe('Default', () => {\n    it('should return plugin default config', () => {\n      expect(Popover.Default).toEqual(jasmine.any(Object))\n    })\n  })\n\n  describe('NAME', () => {\n    it('should return plugin name', () => {\n      expect(Popover.NAME).toEqual(jasmine.any(String))\n    })\n  })\n\n  describe('DATA_KEY', () => {\n    it('should return plugin data key', () => {\n      expect(Popover.DATA_KEY).toEqual('bs.popover')\n    })\n  })\n\n  describe('EVENT_KEY', () => {\n    it('should return plugin event key', () => {\n      expect(Popover.EVENT_KEY).toEqual('.bs.popover')\n    })\n  })\n\n  describe('DefaultType', () => {\n    it('should return plugin default type', () => {\n      expect(Popover.DefaultType).toEqual(jasmine.any(Object))\n    })\n  })\n\n  describe('show', () => {\n    it('should toggle a popover after show', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<a href=\"#\" title=\"Popover\" data-bs-content=\"https://x.com/getbootstrap\">BS X</a>'\n\n        const popoverEl = fixtureEl.querySelector('a')\n        const popover = new Popover(popoverEl)\n\n        popoverEl.addEventListener('shown.bs.popover', () => {\n          expect(document.querySelector('.popover')).not.toBeNull()\n          popover.toggle()\n        })\n        popoverEl.addEventListener('hidden.bs.popover', () => {\n          expect(document.querySelector('.popover')).toBeNull()\n          resolve()\n        })\n\n        popover.show()\n      })\n    })\n\n    it('should show a popover', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<a href=\"#\" title=\"Popover\" data-bs-content=\"https://x.com/getbootstrap\">BS X</a>'\n\n        const popoverEl = fixtureEl.querySelector('a')\n        const popover = new Popover(popoverEl)\n\n        popoverEl.addEventListener('shown.bs.popover', () => {\n          expect(document.querySelector('.popover')).not.toBeNull()\n          resolve()\n        })\n\n        popover.show()\n      })\n    })\n\n    it('should set title and content from functions', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<a href=\"#\">BS X</a>'\n\n        const popoverEl = fixtureEl.querySelector('a')\n        const popover = new Popover(popoverEl, {\n          title: () => 'Bootstrap',\n          content: () => 'loves writing tests （╯°□°）╯︵ ┻━┻'\n        })\n\n        popoverEl.addEventListener('shown.bs.popover', () => {\n          const popoverDisplayed = document.querySelector('.popover')\n\n          expect(popoverDisplayed).not.toBeNull()\n          expect(popoverDisplayed.querySelector('.popover-header').textContent).toEqual('Bootstrap')\n          expect(popoverDisplayed.querySelector('.popover-body').textContent).toEqual('loves writing tests （╯°□°）╯︵ ┻━┻')\n          resolve()\n        })\n\n        popover.show()\n      })\n    })\n\n    it('should call content and title functions with trigger element', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<a href=\"#\" data-foo=\"bar\">BS X</a>'\n\n        const popoverEl = fixtureEl.querySelector('a')\n        const popover = new Popover(popoverEl, {\n          title(el) {\n            return el.dataset.foo\n          },\n          content(el) {\n            return el.dataset.foo\n          }\n        })\n\n        popoverEl.addEventListener('shown.bs.popover', () => {\n          const popoverDisplayed = document.querySelector('.popover')\n\n          expect(popoverDisplayed).not.toBeNull()\n          expect(popoverDisplayed.querySelector('.popover-header').textContent).toEqual('bar')\n          expect(popoverDisplayed.querySelector('.popover-body').textContent).toEqual('bar')\n          resolve()\n        })\n\n        popover.show()\n      })\n    })\n\n    it('should call content and title functions with correct this value', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<a href=\"#\" data-foo=\"bar\">BS X</a>'\n\n        const popoverEl = fixtureEl.querySelector('a')\n        const popover = new Popover(popoverEl, {\n          title() {\n            return this.dataset.foo\n          },\n          content() {\n            return this.dataset.foo\n          }\n        })\n\n        popoverEl.addEventListener('shown.bs.popover', () => {\n          const popoverDisplayed = document.querySelector('.popover')\n\n          expect(popoverDisplayed).not.toBeNull()\n          expect(popoverDisplayed.querySelector('.popover-header').textContent).toEqual('bar')\n          expect(popoverDisplayed.querySelector('.popover-body').textContent).toEqual('bar')\n          resolve()\n        })\n\n        popover.show()\n      })\n    })\n\n    it('should show a popover with just content without having header', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<a href=\"#\">Nice link</a>'\n\n        const popoverEl = fixtureEl.querySelector('a')\n        const popover = new Popover(popoverEl, {\n          content: 'Some beautiful content :)'\n        })\n\n        popoverEl.addEventListener('shown.bs.popover', () => {\n          const popoverDisplayed = document.querySelector('.popover')\n\n          expect(popoverDisplayed).not.toBeNull()\n          expect(popoverDisplayed.querySelector('.popover-header')).toBeNull()\n          expect(popoverDisplayed.querySelector('.popover-body').textContent).toEqual('Some beautiful content :)')\n          resolve()\n        })\n\n        popover.show()\n      })\n    })\n\n    it('should show a popover with just title without having body', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<a href=\"#\">Nice link</a>'\n\n        const popoverEl = fixtureEl.querySelector('a')\n        const popover = new Popover(popoverEl, {\n          title: 'Title which does not require content'\n        })\n\n        popoverEl.addEventListener('shown.bs.popover', () => {\n          const popoverDisplayed = document.querySelector('.popover')\n\n          expect(popoverDisplayed).not.toBeNull()\n          expect(popoverDisplayed.querySelector('.popover-body')).toBeNull()\n          expect(popoverDisplayed.querySelector('.popover-header').textContent).toEqual('Title which does not require content')\n          resolve()\n        })\n\n        popover.show()\n      })\n    })\n\n    it('should show a popover with just title without having body using data-attribute to get config', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<a href=\"#\" data-bs-content=\"\" title=\"Title which does not require content\">Nice link</a>'\n\n        const popoverEl = fixtureEl.querySelector('a')\n        const popover = new Popover(popoverEl)\n\n        popoverEl.addEventListener('shown.bs.popover', () => {\n          const popoverDisplayed = document.querySelector('.popover')\n\n          expect(popoverDisplayed).not.toBeNull()\n          expect(popoverDisplayed.querySelector('.popover-body')).toBeNull()\n          expect(popoverDisplayed.querySelector('.popover-header').textContent).toEqual('Title which does not require content')\n          resolve()\n        })\n\n        popover.show()\n      })\n    })\n\n    it('should NOT show a popover without `title` and `content`', () => {\n      fixtureEl.innerHTML = '<a href=\"#\" data-bs-content=\"\" title=\"\">Nice link</a>'\n\n      const popoverEl = fixtureEl.querySelector('a')\n      const popover = new Popover(popoverEl, { animation: false })\n      const spy = spyOn(EventHandler, 'trigger').and.callThrough()\n\n      popover.show()\n\n      expect(spy).not.toHaveBeenCalledWith(popoverEl, Popover.eventName('show'))\n      expect(document.querySelector('.popover')).toBeNull()\n    })\n\n    it('\"setContent\" should keep the initial template', () => {\n      fixtureEl.innerHTML = '<a href=\"#\" title=\"Popover\" data-bs-content=\"https://x.com/getbootstrap\" data-bs-custom-class=\"custom-class\">BS X</a>'\n\n      const popoverEl = fixtureEl.querySelector('a')\n      const popover = new Popover(popoverEl)\n\n      popover.setContent({ '.tooltip-inner': 'foo' })\n      const tip = popover._getTipElement()\n\n      expect(tip).toHaveClass('popover')\n      expect(tip).toHaveClass('bs-popover-auto')\n      expect(tip.querySelector('.popover-arrow')).not.toBeNull()\n      expect(tip.querySelector('.popover-header')).not.toBeNull()\n      expect(tip.querySelector('.popover-body')).not.toBeNull()\n    })\n\n    it('should call setContent once', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<a href=\"#\">BS X</a>'\n\n        const popoverEl = fixtureEl.querySelector('a')\n        const popover = new Popover(popoverEl, {\n          content: 'Popover content'\n        })\n        expect(popover._templateFactory).toBeNull()\n        let spy = null\n        let times = 1\n\n        popoverEl.addEventListener('hidden.bs.popover', () => {\n          popover.show()\n        })\n\n        popoverEl.addEventListener('shown.bs.popover', () => {\n          spy = spy || spyOn(popover._templateFactory, 'constructor').and.callThrough()\n          const popoverDisplayed = document.querySelector('.popover')\n\n          expect(popoverDisplayed).not.toBeNull()\n          expect(popoverDisplayed.querySelector('.popover-body').textContent).toEqual('Popover content')\n          expect(spy).toHaveBeenCalledTimes(0)\n          if (times > 1) {\n            resolve()\n          }\n\n          times++\n          popover.hide()\n        })\n        popover.show()\n      })\n    })\n\n    it('should show a popover with provided custom class', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<a href=\"#\" title=\"Popover\" data-bs-content=\"https://x.com/getbootstrap\" data-bs-custom-class=\"custom-class\">BS X</a>'\n\n        const popoverEl = fixtureEl.querySelector('a')\n        const popover = new Popover(popoverEl)\n\n        popoverEl.addEventListener('shown.bs.popover', () => {\n          const tip = document.querySelector('.popover')\n          expect(tip).not.toBeNull()\n          expect(tip).toHaveClass('custom-class')\n          resolve()\n        })\n\n        popover.show()\n      })\n    })\n\n    it('should keep popover open when mouse leaves after click trigger', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<a href=\"#\" title=\"Popover\" data-bs-content=\"https://x.com/getbootstrap\" data-bs-trigger=\"hover click\">BS X</a>'\n\n        const popoverEl = fixtureEl.querySelector('a')\n        new Popover(popoverEl) // eslint-disable-line no-new\n\n        popoverEl.addEventListener('shown.bs.popover', () => {\n          popoverEl.dispatchEvent(createEvent('mouseout'))\n\n          popoverEl.addEventListener('hide.bs.popover', () => {\n            throw new Error('Popover should not hide when mouse leaves after click')\n          })\n\n          expect(document.querySelector('.popover')).not.toBeNull()\n          resolve()\n        })\n\n        popoverEl.click()\n      })\n    })\n  })\n\n  describe('hide', () => {\n    it('should hide a popover', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<a href=\"#\" title=\"Popover\" data-bs-content=\"https://x.com/getbootstrap\">BS X</a>'\n\n        const popoverEl = fixtureEl.querySelector('a')\n        const popover = new Popover(popoverEl)\n\n        popoverEl.addEventListener('shown.bs.popover', () => {\n          popover.hide()\n        })\n\n        popoverEl.addEventListener('hidden.bs.popover', () => {\n          expect(document.querySelector('.popover')).toBeNull()\n          resolve()\n        })\n\n        popover.show()\n      })\n    })\n  })\n\n  describe('jQueryInterface', () => {\n    it('should create a popover', () => {\n      fixtureEl.innerHTML = '<a href=\"#\" title=\"Popover\" data-bs-content=\"https://x.com/getbootstrap\">BS X</a>'\n\n      const popoverEl = fixtureEl.querySelector('a')\n\n      jQueryMock.fn.popover = Popover.jQueryInterface\n      jQueryMock.elements = [popoverEl]\n\n      jQueryMock.fn.popover.call(jQueryMock)\n\n      expect(Popover.getInstance(popoverEl)).not.toBeNull()\n    })\n\n    it('should create a popover with a config object', () => {\n      fixtureEl.innerHTML = '<a href=\"#\" title=\"Popover\">BS X</a>'\n\n      const popoverEl = fixtureEl.querySelector('a')\n\n      jQueryMock.fn.popover = Popover.jQueryInterface\n      jQueryMock.elements = [popoverEl]\n\n      jQueryMock.fn.popover.call(jQueryMock, {\n        content: 'Popover content'\n      })\n\n      expect(Popover.getInstance(popoverEl)).not.toBeNull()\n    })\n\n    it('should not re create a popover', () => {\n      fixtureEl.innerHTML = '<a href=\"#\" title=\"Popover\" data-bs-content=\"https://x.com/getbootstrap\">BS X</a>'\n\n      const popoverEl = fixtureEl.querySelector('a')\n      const popover = new Popover(popoverEl)\n\n      jQueryMock.fn.popover = Popover.jQueryInterface\n      jQueryMock.elements = [popoverEl]\n\n      jQueryMock.fn.popover.call(jQueryMock)\n\n      expect(Popover.getInstance(popoverEl)).toEqual(popover)\n    })\n\n    it('should throw error on undefined method', () => {\n      fixtureEl.innerHTML = '<a href=\"#\" title=\"Popover\" data-bs-content=\"https://x.com/getbootstrap\">BS X</a>'\n\n      const popoverEl = fixtureEl.querySelector('a')\n      const action = 'undefinedMethod'\n\n      jQueryMock.fn.popover = Popover.jQueryInterface\n      jQueryMock.elements = [popoverEl]\n\n      expect(() => {\n        jQueryMock.fn.popover.call(jQueryMock, action)\n      }).toThrowError(TypeError, `No method named \"${action}\"`)\n    })\n\n    it('should should call show method', () => {\n      fixtureEl.innerHTML = '<a href=\"#\" title=\"Popover\" data-bs-content=\"https://x.com/getbootstrap\">BS X</a>'\n\n      const popoverEl = fixtureEl.querySelector('a')\n      const popover = new Popover(popoverEl)\n\n      jQueryMock.fn.popover = Popover.jQueryInterface\n      jQueryMock.elements = [popoverEl]\n\n      const spy = spyOn(popover, 'show')\n\n      jQueryMock.fn.popover.call(jQueryMock, 'show')\n\n      expect(spy).toHaveBeenCalled()\n    })\n  })\n\n  describe('getInstance', () => {\n    it('should return popover instance', () => {\n      fixtureEl.innerHTML = '<a href=\"#\" title=\"Popover\" data-bs-content=\"https://x.com/getbootstrap\">BS X</a>'\n\n      const popoverEl = fixtureEl.querySelector('a')\n      const popover = new Popover(popoverEl)\n\n      expect(Popover.getInstance(popoverEl)).toEqual(popover)\n      expect(Popover.getInstance(popoverEl)).toBeInstanceOf(Popover)\n    })\n\n    it('should return null when there is no popover instance', () => {\n      fixtureEl.innerHTML = '<a href=\"#\" title=\"Popover\" data-bs-content=\"https://x.com/getbootstrap\">BS X</a>'\n\n      const popoverEl = fixtureEl.querySelector('a')\n\n      expect(Popover.getInstance(popoverEl)).toBeNull()\n    })\n  })\n\n  describe('getOrCreateInstance', () => {\n    it('should return popover instance', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n      const popover = new Popover(div)\n\n      expect(Popover.getOrCreateInstance(div)).toEqual(popover)\n      expect(Popover.getInstance(div)).toEqual(Popover.getOrCreateInstance(div, {}))\n      expect(Popover.getOrCreateInstance(div)).toBeInstanceOf(Popover)\n    })\n\n    it('should return new instance when there is no popover instance', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n\n      expect(Popover.getInstance(div)).toBeNull()\n      expect(Popover.getOrCreateInstance(div)).toBeInstanceOf(Popover)\n    })\n\n    it('should return new instance when there is no popover instance with given configuration', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n\n      expect(Popover.getInstance(div)).toBeNull()\n      const popover = Popover.getOrCreateInstance(div, {\n        placement: 'top'\n      })\n      expect(popover).toBeInstanceOf(Popover)\n\n      expect(popover._config.placement).toEqual('top')\n    })\n\n    it('should return the instance when exists without given configuration', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n      const popover = new Popover(div, {\n        placement: 'top'\n      })\n      expect(Popover.getInstance(div)).toEqual(popover)\n\n      const popover2 = Popover.getOrCreateInstance(div, {\n        placement: 'bottom'\n      })\n      expect(popover).toBeInstanceOf(Popover)\n      expect(popover2).toEqual(popover)\n\n      expect(popover2._config.placement).toEqual('top')\n    })\n  })\n})\n"
  },
  {
    "path": "js/tests/unit/scrollspy.spec.js",
    "content": "import EventHandler from '../../src/dom/event-handler.js'\nimport ScrollSpy from '../../src/scrollspy.js'\nimport {\n  clearFixture, createEvent, getFixture, jQueryMock\n} from '../helpers/fixture.js'\n\ndescribe('ScrollSpy', () => {\n  let fixtureEl\n\n  const getElementScrollSpy = element => element.scrollTo ?\n    spyOn(element, 'scrollTo').and.callThrough() :\n    spyOnProperty(element, 'scrollTop', 'set').and.callThrough()\n\n  const scrollTo = (el, height) => {\n    el.scrollTop = height\n  }\n\n  const onScrollStop = (callback, element, timeout = 30) => {\n    let handle = null\n    const onScroll = function () {\n      if (handle) {\n        window.clearTimeout(handle)\n      }\n\n      handle = setTimeout(() => {\n        element.removeEventListener('scroll', onScroll)\n        callback()\n      }, timeout + 1)\n    }\n\n    element.addEventListener('scroll', onScroll)\n  }\n\n  const getDummyFixture = () => {\n    return [\n      '<nav id=\"navBar\" class=\"navbar\">',\n      '  <ul class=\"nav\">',\n      '    <li class=\"nav-item\"><a id=\"li-jsm-1\" class=\"nav-link\" href=\"#div-jsm-1\">div 1</a></li>',\n      '  </ul>',\n      '</nav>',\n      '<div class=\"content\" data-bs-target=\"#navBar\" style=\"overflow-y: auto\">',\n      '  <div id=\"div-jsm-1\">div 1</div>',\n      '</div>'\n    ].join('')\n  }\n\n  const testElementIsActiveAfterScroll = ({ elementSelector, targetSelector, contentEl, scrollSpy, cb }) => {\n    const element = fixtureEl.querySelector(elementSelector)\n    const target = fixtureEl.querySelector(targetSelector)\n    // add top padding to fix Chrome on Android failures\n    const paddingTop = 0\n    const parentOffset = getComputedStyle(contentEl).getPropertyValue('position') === 'relative' ? 0 : contentEl.offsetTop\n    const scrollHeight = (target.offsetTop - parentOffset) + paddingTop\n\n    contentEl.addEventListener('activate.bs.scrollspy', event => {\n      if (scrollSpy._activeTarget !== element) {\n        return\n      }\n\n      expect(element).toHaveClass('active')\n      expect(scrollSpy._activeTarget).toEqual(element)\n      expect(event.relatedTarget).toEqual(element)\n      cb()\n    })\n\n    setTimeout(() => { // in case we scroll something before the test\n      scrollTo(contentEl, scrollHeight)\n    }, 100)\n  }\n\n  beforeAll(() => {\n    fixtureEl = getFixture()\n  })\n\n  afterEach(() => {\n    clearFixture()\n  })\n\n  describe('VERSION', () => {\n    it('should return plugin version', () => {\n      expect(ScrollSpy.VERSION).toEqual(jasmine.any(String))\n    })\n  })\n\n  describe('Default', () => {\n    it('should return plugin default config', () => {\n      expect(ScrollSpy.Default).toEqual(jasmine.any(Object))\n    })\n  })\n\n  describe('DATA_KEY', () => {\n    it('should return plugin data key', () => {\n      expect(ScrollSpy.DATA_KEY).toEqual('bs.scrollspy')\n    })\n  })\n\n  describe('constructor', () => {\n    it('should take care of element either passed as a CSS selector or DOM element', () => {\n      fixtureEl.innerHTML = getDummyFixture()\n\n      const sSpyEl = fixtureEl.querySelector('.content')\n      const sSpyBySelector = new ScrollSpy('.content')\n      const sSpyByElement = new ScrollSpy(sSpyEl)\n\n      expect(sSpyBySelector._element).toEqual(sSpyEl)\n      expect(sSpyByElement._element).toEqual(sSpyEl)\n    })\n\n    it('should null, if element is not scrollable', () => {\n      fixtureEl.innerHTML = [\n        '<nav id=\"navigation\" class=\"navbar\">',\n        '  <ul class=\"navbar-nav\">' +\n        '     <li class=\"nav-item\"><a class=\"nav-link active\" id=\"one-link\" href=\"#\">One</a></li>' +\n        '  </ul>',\n        '</nav>',\n        '<div id=\"content\">',\n        '  <div id=\"1\" style=\"height: 300px;\">test</div>',\n        '</div>'\n      ].join('')\n\n      const scrollSpy = new ScrollSpy(fixtureEl.querySelector('#content'), {\n        target: '#navigation'\n      })\n\n      expect(scrollSpy._observer.root).toBeNull()\n      expect(scrollSpy._rootElement).toBeNull()\n    })\n\n    it('should respect threshold option', () => {\n      fixtureEl.innerHTML = [\n        '<ul id=\"navigation\" class=\"navbar\">',\n        '   <a class=\"nav-link active\" id=\"one-link\" href=\"#\">One</a>' +\n        '</ul>',\n        '<div id=\"content\">',\n        '  <div id=\"one-link\">test</div>',\n        '</div>'\n      ].join('')\n\n      const scrollSpy = new ScrollSpy('#content', {\n        target: '#navigation',\n        threshold: [1]\n      })\n\n      expect(scrollSpy._observer.thresholds).toEqual([1])\n    })\n\n    it('should respect threshold option markup', () => {\n      fixtureEl.innerHTML = [\n        '<ul id=\"navigation\" class=\"navbar\">',\n        '   <a class=\"nav-link active\" id=\"one-link\" href=\"#\">One</a>' +\n        '</ul>',\n        '<div id=\"content\" data-bs-threshold=\"0,0.2,1\">',\n        '  <div id=\"one-link\">test</div>',\n        '</div>'\n      ].join('')\n\n      const scrollSpy = new ScrollSpy('#content', {\n        target: '#navigation'\n      })\n\n      // See https://stackoverflow.com/a/45592926\n      const expectToBeCloseToArray = (actual, expected) => {\n        expect(actual.length).toBe(expected.length)\n        for (const x of actual) {\n          const i = actual.indexOf(x)\n          expect(x).withContext(`[${i}]`).toBeCloseTo(expected[i])\n        }\n      }\n\n      expectToBeCloseToArray(scrollSpy._observer.thresholds, [0, 0.2, 1])\n    })\n\n    it('should not take count to not visible sections', () => {\n      fixtureEl.innerHTML = [\n        '<nav id=\"navigation\" class=\"navbar\">',\n        '  <ul class=\"navbar-nav\">',\n        '    <li class=\"nav-item\"><a class=\"nav-link active\" id=\"one-link\" href=\"#one\">One</a></li>',\n        '    <li class=\"nav-item\"><a class=\"nav-link\" id=\"two-link\" href=\"#two\">Two</a></li>',\n        '    <li class=\"nav-item\"><a class=\"nav-link\" id=\"three-link\" href=\"#three\">Three</a></li>',\n        '  </ul>',\n        '</nav>',\n        '<div id=\"content\" style=\"height: 200px; overflow-y: auto;\">',\n        '  <div id=\"one\" style=\"height: 300px;\">test</div>',\n        '  <div id=\"two\" hidden style=\"height: 300px;\">test</div>',\n        '  <div id=\"three\"  style=\"display: none;\">test</div>',\n        '</div>'\n      ].join('')\n\n      const scrollSpy = new ScrollSpy(fixtureEl.querySelector('#content'), {\n        target: '#navigation'\n      })\n\n      expect(scrollSpy._observableSections.size).toBe(1)\n      expect(scrollSpy._targetLinks.size).toBe(1)\n    })\n\n    it('should not process element without target', () => {\n      fixtureEl.innerHTML = [\n        '<nav id=\"navigation\" class=\"navbar\">',\n        '  <ul class=\"navbar-nav\">',\n        '    <li class=\"nav-item\"><a class=\"nav-link active\" id=\"one-link\" href=\"#\">One</a></li>',\n        '    <li class=\"nav-item\"><a class=\"nav-link\" id=\"two-link\" href=\"#two\">Two</a></li>',\n        '    <li class=\"nav-item\"><a class=\"nav-link\" id=\"three-link\" href=\"#three\">Three</a></li>',\n        '  </ul>',\n        '</nav>',\n        '<div id=\"content\" style=\"height: 200px; overflow-y: auto;\">',\n        '  <div id=\"two\" style=\"height: 300px;\">test</div>',\n        '  <div id=\"three\" style=\"height: 10px;\">test2</div>',\n        '</div>'\n      ].join('')\n\n      const scrollSpy = new ScrollSpy(fixtureEl.querySelector('#content'), {\n        target: '#navigation'\n      })\n\n      expect(scrollSpy._targetLinks).toHaveSize(2)\n    })\n\n    it('should only switch \"active\" class on current target', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div id=\"root\" class=\"active\" style=\"display: block\">',\n          '  <div class=\"topbar\">',\n          '    <div class=\"topbar-inner\">',\n          '      <div class=\"container\" id=\"ss-target\">',\n          '        <ul class=\"nav\">',\n          '          <li class=\"nav-item\"><a href=\"#masthead\">Overview</a></li>',\n          '          <li class=\"nav-item\"><a href=\"#detail\">Detail</a></li>',\n          '        </ul>',\n          '      </div>',\n          '    </div>',\n          '  </div>',\n          '  <div id=\"scrollspy-example\" style=\"height: 100px; overflow: auto;\">',\n          '     <div style=\"height: 200px;\" id=\"masthead\">Overview</div>',\n          '     <div style=\"height: 200px;\" id=\"detail\">Detail</div>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const scrollSpyEl = fixtureEl.querySelector('#scrollspy-example')\n        const rootEl = fixtureEl.querySelector('#root')\n        const scrollSpy = new ScrollSpy(scrollSpyEl, {\n          target: 'ss-target'\n        })\n\n        const spy = spyOn(scrollSpy, '_process').and.callThrough()\n\n        onScrollStop(() => {\n          expect(rootEl).toHaveClass('active')\n          expect(spy).toHaveBeenCalled()\n          resolve()\n        }, scrollSpyEl)\n\n        scrollTo(scrollSpyEl, 350)\n      })\n    })\n\n    it('should not process data if `activeTarget` is same as given target', () => {\n      return new Promise((resolve, reject) => {\n        fixtureEl.innerHTML = [\n          '<nav class=\"navbar\">',\n          '  <ul class=\"nav\">',\n          '    <li class=\"nav-item\"><a class=\"nav-link\" id=\"a-1\" href=\"#div-1\">div 1</a></li>',\n          '    <li class=\"nav-item\"><a class=\"nav-link\" id=\"a-2\" href=\"#div-2\">div 2</a></li>',\n          '  </ul>',\n          '</nav>',\n          '<div class=\"content\" style=\"overflow: auto; height: 50px\">',\n          '  <div id=\"div-1\" style=\"height: 100px; padding: 0; margin: 0\">div 1</div>',\n          '  <div id=\"div-2\" style=\"height: 200px; padding: 0; margin: 0\">div 2</div>',\n          '</div>'\n        ].join('')\n\n        const contentEl = fixtureEl.querySelector('.content')\n        const scrollSpy = new ScrollSpy(contentEl, {\n          offset: 0,\n          target: '.navbar'\n        })\n\n        const triggerSpy = spyOn(EventHandler, 'trigger').and.callThrough()\n\n        scrollSpy._activeTarget = fixtureEl.querySelector('#a-1')\n        testElementIsActiveAfterScroll({\n          elementSelector: '#a-1',\n          targetSelector: '#div-1',\n          contentEl,\n          scrollSpy,\n          cb: reject\n        })\n\n        setTimeout(() => {\n          expect(triggerSpy).not.toHaveBeenCalled()\n          resolve()\n        }, 100)\n      })\n    })\n\n    it('should only switch \"active\" class on current target specified w element', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div id=\"root\" class=\"active\" style=\"display: block\">',\n          '  <div class=\"topbar\">',\n          '    <div class=\"topbar-inner\">',\n          '      <div class=\"container\" id=\"ss-target\">',\n          '        <ul class=\"nav\">',\n          '          <li class=\"nav-item\"><a href=\"#masthead\">Overview</a></li>',\n          '          <li class=\"nav-item\"><a href=\"#detail\">Detail</a></li>',\n          '        </ul>',\n          '      </div>',\n          '    </div>',\n          '  </div>',\n          '  <div id=\"scrollspy-example\" style=\"height: 100px; overflow: auto;\">',\n          '    <div style=\"height: 200px;\" id=\"masthead\">Overview</div>',\n          '    <div style=\"height: 200px;\" id=\"detail\">Detail</div>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const scrollSpyEl = fixtureEl.querySelector('#scrollspy-example')\n        const rootEl = fixtureEl.querySelector('#root')\n        const scrollSpy = new ScrollSpy(scrollSpyEl, {\n          target: fixtureEl.querySelector('#ss-target')\n        })\n\n        const spy = spyOn(scrollSpy, '_process').and.callThrough()\n\n        onScrollStop(() => {\n          expect(rootEl).toHaveClass('active')\n          expect(scrollSpy._activeTarget).toEqual(fixtureEl.querySelector('[href=\"#detail\"]'))\n          expect(spy).toHaveBeenCalled()\n          resolve()\n        }, scrollSpyEl)\n\n        scrollTo(scrollSpyEl, 350)\n      })\n    })\n\n    it('should add the active class to the correct element', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<nav class=\"navbar\">',\n          '  <ul class=\"nav\">',\n          '    <li class=\"nav-item\"><a class=\"nav-link\" id=\"a-1\" href=\"#div-1\">div 1</a></li>',\n          '    <li class=\"nav-item\"><a class=\"nav-link\" id=\"a-2\" href=\"#div-2\">div 2</a></li>',\n          '  </ul>',\n          '</nav>',\n          '<div class=\"content\" style=\"overflow: auto; height: 50px\">',\n          '  <div id=\"div-1\" style=\"height: 100px; padding: 0; margin: 0\">div 1</div>',\n          '  <div id=\"div-2\" style=\"height: 200px; padding: 0; margin: 0\">div 2</div>',\n          '</div>'\n        ].join('')\n\n        const contentEl = fixtureEl.querySelector('.content')\n        const scrollSpy = new ScrollSpy(contentEl, {\n          offset: 0,\n          target: '.navbar'\n        })\n\n        testElementIsActiveAfterScroll({\n          elementSelector: '#a-1',\n          targetSelector: '#div-1',\n          contentEl,\n          scrollSpy,\n          cb() {\n            testElementIsActiveAfterScroll({\n              elementSelector: '#a-2',\n              targetSelector: '#div-2',\n              contentEl,\n              scrollSpy,\n              cb: resolve\n            })\n          }\n        })\n      })\n    })\n\n    it('should add to nav the active class to the correct element (nav markup)', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<nav class=\"navbar\">',\n          '  <nav class=\"nav\">',\n          '    <a class=\"nav-link\" id=\"a-1\" href=\"#div-1\">div 1</a>',\n          '    <a class=\"nav-link\" id=\"a-2\" href=\"#div-2\">div 2</a>',\n          '  </nav>',\n          '</nav>',\n          '<div class=\"content\" style=\"overflow: auto; height: 50px\">',\n          '  <div id=\"div-1\" style=\"height: 100px; padding: 0; margin: 0\">div 1</div>',\n          '  <div id=\"div-2\" style=\"height: 200px; padding: 0; margin: 0\">div 2</div>',\n          '</div>'\n        ].join('')\n\n        const contentEl = fixtureEl.querySelector('.content')\n        const scrollSpy = new ScrollSpy(contentEl, {\n          offset: 0,\n          target: '.navbar'\n        })\n\n        testElementIsActiveAfterScroll({\n          elementSelector: '#a-1',\n          targetSelector: '#div-1',\n          contentEl,\n          scrollSpy,\n          cb() {\n            testElementIsActiveAfterScroll({\n              elementSelector: '#a-2',\n              targetSelector: '#div-2',\n              contentEl,\n              scrollSpy,\n              cb: resolve\n            })\n          }\n        })\n      })\n    })\n\n    it('should add to list-group, the active class to the correct element (list-group markup)', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<nav class=\"navbar\">',\n          '  <div class=\"list-group\">',\n          '    <a class=\"list-group-item\" id=\"a-1\" href=\"#div-1\">div 1</a>',\n          '    <a class=\"list-group-item\" id=\"a-2\" href=\"#div-2\">div 2</a>',\n          '  </div>',\n          '</nav>',\n          '<div class=\"content\" style=\"overflow: auto; height: 50px\">',\n          '  <div id=\"div-1\" style=\"height: 100px; padding: 0; margin: 0\">div 1</div>',\n          '  <div id=\"div-2\" style=\"height: 200px; padding: 0; margin: 0\">div 2</div>',\n          '</div>'\n        ].join('')\n\n        const contentEl = fixtureEl.querySelector('.content')\n        const scrollSpy = new ScrollSpy(contentEl, {\n          offset: 0,\n          target: '.navbar'\n        })\n\n        testElementIsActiveAfterScroll({\n          elementSelector: '#a-1',\n          targetSelector: '#div-1',\n          contentEl,\n          scrollSpy,\n          cb() {\n            testElementIsActiveAfterScroll({\n              elementSelector: '#a-2',\n              targetSelector: '#div-2',\n              contentEl,\n              scrollSpy,\n              cb: resolve\n            })\n          }\n        })\n      })\n    })\n\n    it('should clear selection if above the first section', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div id=\"header\" style=\"height: 500px;\"></div>',\n          '<nav id=\"navigation\" class=\"navbar\">',\n          '  <ul class=\"navbar-nav\">',\n          '    <li class=\"nav-item\"><a id=\"one-link\"   class=\"nav-link active\" href=\"#one\">One</a></li>',\n          '    <li class=\"nav-item\"><a id=\"two-link\"   class=\"nav-link\" href=\"#two\">Two</a></li>',\n          '    <li class=\"nav-item\"><a id=\"three-link\" class=\"nav-link\" href=\"#three\">Three</a></li>',\n          '  </ul>',\n          '</nav>',\n          '<div id=\"content\" style=\"height: 200px; overflow-y: auto;\">',\n          '  <div id=\"spacer\" style=\"height: 200px;\"></div>',\n          '  <div id=\"one\" style=\"height: 100px;\">text</div>',\n          '  <div id=\"two\" style=\"height: 100px;\">text</div>',\n          '  <div id=\"three\" style=\"height: 100px;\">text</div>',\n          '  <div id=\"spacer\" style=\"height: 100px;\"></div>',\n          '</div>'\n        ].join('')\n\n        const contentEl = fixtureEl.querySelector('#content')\n        const scrollSpy = new ScrollSpy(contentEl, {\n          target: '#navigation',\n          offset: contentEl.offsetTop\n        })\n        const spy = spyOn(scrollSpy, '_process').and.callThrough()\n\n        onScrollStop(() => {\n          const active = () => fixtureEl.querySelector('.active')\n          expect(spy).toHaveBeenCalled()\n\n          expect(fixtureEl.querySelectorAll('.active')).toHaveSize(1)\n          expect(active().getAttribute('id')).toEqual('two-link')\n          onScrollStop(() => {\n            expect(active()).toBeNull()\n            resolve()\n          }, contentEl)\n          scrollTo(contentEl, 0)\n        }, contentEl)\n\n        scrollTo(contentEl, 200)\n      })\n    })\n\n    it('should not clear selection if above the first section and first section is at the top', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div id=\"header\" style=\"height: 500px;\"></div>',\n          '<nav id=\"navigation\" class=\"navbar\">',\n          '  <ul class=\"navbar-nav\">',\n          '    <li class=\"nav-item\"><a id=\"one-link\" class=\"nav-link active\" href=\"#one\">One</a></li>',\n          '    <li class=\"nav-item\"><a id=\"two-link\" class=\"nav-link\" href=\"#two\">Two</a></li>',\n          '    <li class=\"nav-item\"><a id=\"three-link\" class=\"nav-link\" href=\"#three\">Three</a></li>',\n          '  </ul>',\n          '</nav>',\n          '<div id=\"content\" style=\"height: 150px; overflow-y: auto;\">',\n          '  <div id=\"one\" style=\"height: 100px;\">test</div>',\n          '  <div id=\"two\" style=\"height: 100px;\">test</div>',\n          '  <div id=\"three\" style=\"height: 100px;\">test</div>',\n          '  <div id=\"spacer\" style=\"height: 100px;\">test</div>',\n          '</div>'\n        ].join('')\n\n        const negativeHeight = 0\n        const startOfSectionTwo = 101\n        const contentEl = fixtureEl.querySelector('#content')\n        // eslint-disable-next-line no-unused-vars\n        const scrollSpy = new ScrollSpy(contentEl, {\n          target: '#navigation',\n          rootMargin: '0px 0px -50%'\n        })\n\n        onScrollStop(() => {\n          const activeId = () => fixtureEl.querySelector('.active').getAttribute('id')\n\n          expect(fixtureEl.querySelectorAll('.active')).toHaveSize(1)\n          expect(activeId()).toEqual('two-link')\n          scrollTo(contentEl, negativeHeight)\n\n          onScrollStop(() => {\n            expect(fixtureEl.querySelectorAll('.active')).toHaveSize(1)\n            expect(activeId()).toEqual('one-link')\n            resolve()\n          }, contentEl)\n\n          scrollTo(contentEl, 0)\n        }, contentEl)\n\n        scrollTo(contentEl, startOfSectionTwo)\n      })\n    })\n\n    it('should correctly select navigation element on backward scrolling when each target section height is 100%', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<nav class=\"navbar\">',\n          '  <ul class=\"nav\">',\n          '    <li class=\"nav-item\"><a id=\"li-100-1\" class=\"nav-link\" href=\"#div-100-1\">div 1</a></li>',\n          '    <li class=\"nav-item\"><a id=\"li-100-2\" class=\"nav-link\" href=\"#div-100-2\">div 2</a></li>',\n          '    <li class=\"nav-item\"><a id=\"li-100-3\" class=\"nav-link\" href=\"#div-100-3\">div 3</a></li>',\n          '    <li class=\"nav-item\"><a id=\"li-100-4\" class=\"nav-link\" href=\"#div-100-4\">div 4</a></li>',\n          '    <li class=\"nav-item\"><a id=\"li-100-5\" class=\"nav-link\" href=\"#div-100-5\">div 5</a></li>',\n          '  </ul>',\n          '</nav>',\n          '<div class=\"content\" style=\"position: relative; overflow: auto; height: 100px\">',\n          '  <div id=\"div-100-1\" style=\"position: relative; height: 100%; padding: 0; margin: 0\">div 1</div>',\n          '  <div id=\"div-100-2\" style=\"position: relative; height: 100%; padding: 0; margin: 0\">div 2</div>',\n          '  <div id=\"div-100-3\" style=\"position: relative; height: 100%; padding: 0; margin: 0\">div 3</div>',\n          '  <div id=\"div-100-4\" style=\"position: relative; height: 100%; padding: 0; margin: 0\">div 4</div>',\n          '  <div id=\"div-100-5\" style=\"position: relative; height: 100%; padding: 0; margin: 0\">div 5</div>',\n          '</div>'\n        ].join('')\n\n        const contentEl = fixtureEl.querySelector('.content')\n        const scrollSpy = new ScrollSpy(contentEl, {\n          offset: 0,\n          target: '.navbar'\n        })\n\n        scrollTo(contentEl, 0)\n        testElementIsActiveAfterScroll({\n          elementSelector: '#li-100-5',\n          targetSelector: '#div-100-5',\n          contentEl,\n          scrollSpy,\n          cb() {\n            scrollTo(contentEl, 0)\n            testElementIsActiveAfterScroll({\n              elementSelector: '#li-100-2',\n              targetSelector: '#div-100-2',\n              contentEl,\n              scrollSpy,\n              cb() {\n                scrollTo(contentEl, 0)\n                testElementIsActiveAfterScroll({\n                  elementSelector: '#li-100-3',\n                  targetSelector: '#div-100-3',\n                  contentEl,\n                  scrollSpy,\n                  cb() {\n                    scrollTo(contentEl, 0)\n                    testElementIsActiveAfterScroll({\n                      elementSelector: '#li-100-2',\n                      targetSelector: '#div-100-2',\n                      contentEl,\n                      scrollSpy,\n                      cb() {\n                        scrollTo(contentEl, 0)\n                        testElementIsActiveAfterScroll({\n                          elementSelector: '#li-100-1',\n                          targetSelector: '#div-100-1',\n                          contentEl,\n                          scrollSpy,\n                          cb: resolve\n                        })\n                      }\n                    })\n                  }\n                })\n              }\n            })\n          }\n        })\n      })\n    })\n  })\n\n  describe('refresh', () => {\n    it('should disconnect existing observer', () => {\n      fixtureEl.innerHTML = getDummyFixture()\n\n      const el = fixtureEl.querySelector('.content')\n      const scrollSpy = new ScrollSpy(el)\n\n      const spy = spyOn(scrollSpy._observer, 'disconnect')\n\n      scrollSpy.refresh()\n\n      expect(spy).toHaveBeenCalled()\n    })\n  })\n\n  describe('dispose', () => {\n    it('should dispose a scrollspy', () => {\n      fixtureEl.innerHTML = getDummyFixture()\n\n      const el = fixtureEl.querySelector('.content')\n      const scrollSpy = new ScrollSpy(el)\n\n      expect(ScrollSpy.getInstance(el)).not.toBeNull()\n\n      scrollSpy.dispose()\n\n      expect(ScrollSpy.getInstance(el)).toBeNull()\n    })\n  })\n\n  describe('jQueryInterface', () => {\n    it('should create a scrollspy', () => {\n      fixtureEl.innerHTML = getDummyFixture()\n\n      const div = fixtureEl.querySelector('.content')\n\n      jQueryMock.fn.scrollspy = ScrollSpy.jQueryInterface\n      jQueryMock.elements = [div]\n\n      jQueryMock.fn.scrollspy.call(jQueryMock, { target: '#navBar' })\n\n      expect(ScrollSpy.getInstance(div)).not.toBeNull()\n    })\n\n    it('should create a scrollspy with given config', () => {\n      fixtureEl.innerHTML = getDummyFixture()\n\n      const div = fixtureEl.querySelector('.content')\n\n      jQueryMock.fn.scrollspy = ScrollSpy.jQueryInterface\n      jQueryMock.elements = [div]\n\n      jQueryMock.fn.scrollspy.call(jQueryMock, { rootMargin: '100px' })\n      const spy = spyOn(ScrollSpy.prototype, 'constructor')\n      expect(spy).not.toHaveBeenCalledWith(div, { rootMargin: '100px' })\n\n      const scrollspy = ScrollSpy.getInstance(div)\n      expect(scrollspy).not.toBeNull()\n      expect(scrollspy._config.rootMargin).toEqual('100px')\n    })\n\n    it('should not re create a scrollspy', () => {\n      fixtureEl.innerHTML = getDummyFixture()\n\n      const div = fixtureEl.querySelector('.content')\n      const scrollSpy = new ScrollSpy(div)\n\n      jQueryMock.fn.scrollspy = ScrollSpy.jQueryInterface\n      jQueryMock.elements = [div]\n\n      jQueryMock.fn.scrollspy.call(jQueryMock)\n\n      expect(ScrollSpy.getInstance(div)).toEqual(scrollSpy)\n    })\n\n    it('should call a scrollspy method', () => {\n      fixtureEl.innerHTML = getDummyFixture()\n\n      const div = fixtureEl.querySelector('.content')\n      const scrollSpy = new ScrollSpy(div)\n\n      const spy = spyOn(scrollSpy, 'refresh')\n\n      jQueryMock.fn.scrollspy = ScrollSpy.jQueryInterface\n      jQueryMock.elements = [div]\n\n      jQueryMock.fn.scrollspy.call(jQueryMock, 'refresh')\n\n      expect(ScrollSpy.getInstance(div)).toEqual(scrollSpy)\n      expect(spy).toHaveBeenCalled()\n    })\n\n    it('should throw error on undefined method', () => {\n      fixtureEl.innerHTML = getDummyFixture()\n\n      const div = fixtureEl.querySelector('.content')\n      const action = 'undefinedMethod'\n\n      jQueryMock.fn.scrollspy = ScrollSpy.jQueryInterface\n      jQueryMock.elements = [div]\n\n      expect(() => {\n        jQueryMock.fn.scrollspy.call(jQueryMock, action)\n      }).toThrowError(TypeError, `No method named \"${action}\"`)\n    })\n\n    it('should throw error on protected method', () => {\n      fixtureEl.innerHTML = getDummyFixture()\n\n      const div = fixtureEl.querySelector('.content')\n      const action = '_getConfig'\n\n      jQueryMock.fn.scrollspy = ScrollSpy.jQueryInterface\n      jQueryMock.elements = [div]\n\n      expect(() => {\n        jQueryMock.fn.scrollspy.call(jQueryMock, action)\n      }).toThrowError(TypeError, `No method named \"${action}\"`)\n    })\n\n    it('should throw error if method \"constructor\" is being called', () => {\n      fixtureEl.innerHTML = getDummyFixture()\n\n      const div = fixtureEl.querySelector('.content')\n      const action = 'constructor'\n\n      jQueryMock.fn.scrollspy = ScrollSpy.jQueryInterface\n      jQueryMock.elements = [div]\n\n      expect(() => {\n        jQueryMock.fn.scrollspy.call(jQueryMock, action)\n      }).toThrowError(TypeError, `No method named \"${action}\"`)\n    })\n  })\n\n  describe('getInstance', () => {\n    it('should return scrollspy instance', () => {\n      fixtureEl.innerHTML = getDummyFixture()\n\n      const div = fixtureEl.querySelector('.content')\n      const scrollSpy = new ScrollSpy(div, { target: fixtureEl.querySelector('#navBar') })\n\n      expect(ScrollSpy.getInstance(div)).toEqual(scrollSpy)\n      expect(ScrollSpy.getInstance(div)).toBeInstanceOf(ScrollSpy)\n    })\n\n    it('should return null if there is no instance', () => {\n      fixtureEl.innerHTML = getDummyFixture()\n\n      const div = fixtureEl.querySelector('.content')\n      expect(ScrollSpy.getInstance(div)).toBeNull()\n    })\n  })\n\n  describe('getOrCreateInstance', () => {\n    it('should return scrollspy instance', () => {\n      fixtureEl.innerHTML = getDummyFixture()\n\n      const div = fixtureEl.querySelector('.content')\n      const scrollspy = new ScrollSpy(div)\n\n      expect(ScrollSpy.getOrCreateInstance(div)).toEqual(scrollspy)\n      expect(ScrollSpy.getInstance(div)).toEqual(ScrollSpy.getOrCreateInstance(div, {}))\n      expect(ScrollSpy.getOrCreateInstance(div)).toBeInstanceOf(ScrollSpy)\n    })\n\n    it('should return new instance when there is no scrollspy instance', () => {\n      fixtureEl.innerHTML = getDummyFixture()\n\n      const div = fixtureEl.querySelector('.content')\n\n      expect(ScrollSpy.getInstance(div)).toBeNull()\n      expect(ScrollSpy.getOrCreateInstance(div)).toBeInstanceOf(ScrollSpy)\n    })\n\n    it('should return new instance when there is no scrollspy instance with given configuration', () => {\n      fixtureEl.innerHTML = getDummyFixture()\n\n      const div = fixtureEl.querySelector('.content')\n\n      expect(ScrollSpy.getInstance(div)).toBeNull()\n      const scrollspy = ScrollSpy.getOrCreateInstance(div, {\n        offset: 1\n      })\n      expect(scrollspy).toBeInstanceOf(ScrollSpy)\n\n      expect(scrollspy._config.offset).toEqual(1)\n    })\n\n    it('should return the instance when exists without given configuration', () => {\n      fixtureEl.innerHTML = getDummyFixture()\n\n      const div = fixtureEl.querySelector('.content')\n      const scrollspy = new ScrollSpy(div, {\n        offset: 1\n      })\n      expect(ScrollSpy.getInstance(div)).toEqual(scrollspy)\n\n      const scrollspy2 = ScrollSpy.getOrCreateInstance(div, {\n        offset: 2\n      })\n      expect(scrollspy).toBeInstanceOf(ScrollSpy)\n      expect(scrollspy2).toEqual(scrollspy)\n\n      expect(scrollspy2._config.offset).toEqual(1)\n    })\n  })\n\n  describe('event handler', () => {\n    it('should create scrollspy on window load event', () => {\n      fixtureEl.innerHTML = [\n        '<div id=\"nav\"></div>' +\n        '<div id=\"wrapper\" data-bs-spy=\"scroll\" data-bs-target=\"#nav\" style=\"overflow-y: auto\"></div>'\n      ].join('')\n\n      const scrollSpyEl = fixtureEl.querySelector('#wrapper')\n\n      window.dispatchEvent(createEvent('load'))\n\n      expect(ScrollSpy.getInstance(scrollSpyEl)).not.toBeNull()\n    })\n  })\n\n  describe('SmoothScroll', () => {\n    it('should not enable smoothScroll', () => {\n      fixtureEl.innerHTML = getDummyFixture()\n      const offSpy = spyOn(EventHandler, 'off').and.callThrough()\n      const onSpy = spyOn(EventHandler, 'on').and.callThrough()\n\n      const div = fixtureEl.querySelector('.content')\n      const target = fixtureEl.querySelector('#navBar')\n      // eslint-disable-next-line no-new\n      new ScrollSpy(div, {\n        offset: 1\n      })\n\n      expect(offSpy).not.toHaveBeenCalledWith(target, 'click.bs.scrollspy')\n      expect(onSpy).not.toHaveBeenCalledWith(target, 'click.bs.scrollspy')\n    })\n\n    it('should enable smoothScroll', () => {\n      fixtureEl.innerHTML = getDummyFixture()\n      const offSpy = spyOn(EventHandler, 'off').and.callThrough()\n      const onSpy = spyOn(EventHandler, 'on').and.callThrough()\n\n      const div = fixtureEl.querySelector('.content')\n      const target = fixtureEl.querySelector('#navBar')\n      // eslint-disable-next-line no-new\n      new ScrollSpy(div, {\n        offset: 1,\n        smoothScroll: true\n      })\n\n      expect(offSpy).toHaveBeenCalledWith(target, 'click.bs.scrollspy')\n      expect(onSpy).toHaveBeenCalledWith(target, 'click.bs.scrollspy', '[href]', jasmine.any(Function))\n    })\n\n    it('should not smoothScroll to element if it not handles a scrollspy section', () => {\n      fixtureEl.innerHTML = [\n        '<nav id=\"navBar\" class=\"navbar\">',\n        '  <ul class=\"nav\">',\n        '    <a id=\"anchor-1\" href=\"#div-jsm-1\">div 1</a></li>',\n        '    <a id=\"anchor-2\" href=\"#foo\">div 2</a></li>',\n        '  </ul>',\n        '</nav>',\n        '<div class=\"content\" data-bs-target=\"#navBar\" style=\"overflow-y: auto\">',\n        '  <div id=\"div-jsm-1\">div 1</div>',\n        '</div>'\n      ].join('')\n\n      const div = fixtureEl.querySelector('.content')\n      // eslint-disable-next-line no-new\n      new ScrollSpy(div, {\n        offset: 1,\n        smoothScroll: true\n      })\n\n      const clickSpy = getElementScrollSpy(div)\n\n      fixtureEl.querySelector('#anchor-2').click()\n      expect(clickSpy).not.toHaveBeenCalled()\n    })\n\n    it('should call `scrollTop` if element doesn\\'t not support `scrollTo`', () => {\n      fixtureEl.innerHTML = getDummyFixture()\n\n      const div = fixtureEl.querySelector('.content')\n      const link = fixtureEl.querySelector('[href=\"#div-jsm-1\"]')\n      delete div.scrollTo\n      const clickSpy = getElementScrollSpy(div)\n      // eslint-disable-next-line no-new\n      new ScrollSpy(div, {\n        offset: 1,\n        smoothScroll: true\n      })\n\n      link.click()\n      expect(clickSpy).toHaveBeenCalled()\n    })\n\n    it('should smoothScroll to the proper observable element on anchor click', done => {\n      fixtureEl.innerHTML = getDummyFixture()\n\n      const div = fixtureEl.querySelector('.content')\n      const link = fixtureEl.querySelector('[href=\"#div-jsm-1\"]')\n      const observable = fixtureEl.querySelector('#div-jsm-1')\n      const clickSpy = getElementScrollSpy(div)\n      // eslint-disable-next-line no-new\n      new ScrollSpy(div, {\n        offset: 1,\n        smoothScroll: true\n      })\n\n      setTimeout(() => {\n        if (div.scrollTo) {\n          expect(clickSpy).toHaveBeenCalledWith({ top: observable.offsetTop - div.offsetTop, behavior: 'smooth' })\n        } else {\n          expect(clickSpy).toHaveBeenCalledWith(observable.offsetTop - div.offsetTop)\n        }\n\n        done()\n      }, 100)\n      link.click()\n    })\n\n    it('should smoothscroll to observable with anchor link that contains a french word as id', done => {\n      fixtureEl.innerHTML = [\n        '<nav id=\"navBar\" class=\"navbar\">',\n        '  <ul class=\"nav\">',\n        '    <li class=\"nav-item\"><a id=\"li-jsm-1\" class=\"nav-link\" href=\"#présentation\">div 1</a></li>',\n        '  </ul>',\n        '</nav>',\n        '<div class=\"content\" data-bs-target=\"#navBar\" style=\"overflow-y: auto\">',\n        '  <div id=\"présentation\">div 1</div>',\n        '</div>'\n      ].join('')\n\n      const div = fixtureEl.querySelector('.content')\n      const link = fixtureEl.querySelector('[href=\"#présentation\"]')\n      const observable = fixtureEl.querySelector('#présentation')\n      const clickSpy = getElementScrollSpy(div)\n      // eslint-disable-next-line no-new\n      new ScrollSpy(div, {\n        offset: 1,\n        smoothScroll: true\n      })\n\n      setTimeout(() => {\n        if (div.scrollTo) {\n          expect(clickSpy).toHaveBeenCalledWith({ top: observable.offsetTop - div.offsetTop, behavior: 'smooth' })\n        } else {\n          expect(clickSpy).toHaveBeenCalledWith(observable.offsetTop - div.offsetTop)\n        }\n\n        done()\n      }, 100)\n      link.click()\n    })\n  })\n})\n"
  },
  {
    "path": "js/tests/unit/tab.spec.js",
    "content": "import Tab from '../../src/tab.js'\nimport {\n  clearFixture, createEvent, getFixture, jQueryMock\n} from '../helpers/fixture.js'\n\ndescribe('Tab', () => {\n  let fixtureEl\n\n  beforeAll(() => {\n    fixtureEl = getFixture()\n  })\n\n  afterEach(() => {\n    clearFixture()\n  })\n\n  describe('VERSION', () => {\n    it('should return plugin version', () => {\n      expect(Tab.VERSION).toEqual(jasmine.any(String))\n    })\n  })\n\n  describe('constructor', () => {\n    it('should take care of element either passed as a CSS selector or DOM element', () => {\n      fixtureEl.innerHTML = [\n        '<ul class=\"nav\">',\n        '  <li><a href=\"#home\" role=\"tab\">Home</a></li>',\n        '</ul>',\n        '<ul>',\n        '  <li id=\"home\"></li>',\n        '</ul>'\n      ].join('')\n\n      const tabEl = fixtureEl.querySelector('[href=\"#home\"]')\n      const tabBySelector = new Tab('[href=\"#home\"]')\n      const tabByElement = new Tab(tabEl)\n\n      expect(tabBySelector._element).toEqual(tabEl)\n      expect(tabByElement._element).toEqual(tabEl)\n    })\n\n    it('Do not Throw exception if not parent', () => {\n      fixtureEl.innerHTML = [\n        fixtureEl.innerHTML = '<div class=\"\"><div class=\"nav-link\"></div></div>'\n      ].join('')\n      const navEl = fixtureEl.querySelector('.nav-link')\n\n      expect(() => {\n        new Tab(navEl) // eslint-disable-line no-new\n      }).not.toThrowError(TypeError)\n    })\n  })\n\n  describe('show', () => {\n    it('should activate element by tab id (using buttons, the preferred semantic way)', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<ul class=\"nav\" role=\"tablist\">',\n          '  <li><button type=\"button\" data-bs-target=\"#home\" role=\"tab\">Home</button></li>',\n          '  <li><button type=\"button\" id=\"triggerProfile\" data-bs-target=\"#profile\" role=\"tab\">Profile</button></li>',\n          '</ul>',\n          '<ul>',\n          '  <li id=\"home\" role=\"tabpanel\"></li>',\n          '  <li id=\"profile\" role=\"tabpanel\"></li>',\n          '</ul>'\n        ].join('')\n\n        const profileTriggerEl = fixtureEl.querySelector('#triggerProfile')\n        const tab = new Tab(profileTriggerEl)\n\n        profileTriggerEl.addEventListener('shown.bs.tab', () => {\n          expect(fixtureEl.querySelector('#profile')).toHaveClass('active')\n          expect(profileTriggerEl.getAttribute('aria-selected')).toEqual('true')\n          resolve()\n        })\n\n        tab.show()\n      })\n    })\n\n    it('should activate element by tab id (using links for tabs - not ideal, but still supported)', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<ul class=\"nav\" role=\"tablist\">',\n          '  <li><a href=\"#home\" role=\"tab\">Home</a></li>',\n          '  <li><a id=\"triggerProfile\" href=\"#profile\" role=\"tab\">Profile</a></li>',\n          '</ul>',\n          '<ul>',\n          '  <li id=\"home\" role=\"tabpanel\"></li>',\n          '  <li id=\"profile\" role=\"tabpanel\"></li>',\n          '</ul>'\n        ].join('')\n\n        const profileTriggerEl = fixtureEl.querySelector('#triggerProfile')\n        const tab = new Tab(profileTriggerEl)\n\n        profileTriggerEl.addEventListener('shown.bs.tab', () => {\n          expect(fixtureEl.querySelector('#profile')).toHaveClass('active')\n          expect(profileTriggerEl.getAttribute('aria-selected')).toEqual('true')\n          resolve()\n        })\n\n        tab.show()\n      })\n    })\n\n    it('should activate element by tab id in ordered list', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<ol class=\"nav nav-pills\">',\n          '  <li><button type=\"button\" data-bs-target=\"#home\" role=\"tab\">Home</button></li>',\n          '  <li><button type=\"button\" id=\"triggerProfile\" href=\"#profile\" role=\"tab\">Profile</button></li>',\n          '</ol>',\n          '<ol>',\n          '  <li id=\"home\" role=\"tabpanel\"></li>',\n          '  <li id=\"profile\" role=\"tabpanel\"></li>',\n          '</ol>'\n        ].join('')\n\n        const profileTriggerEl = fixtureEl.querySelector('#triggerProfile')\n        const tab = new Tab(profileTriggerEl)\n\n        profileTriggerEl.addEventListener('shown.bs.tab', () => {\n          expect(fixtureEl.querySelector('#profile')).toHaveClass('active')\n          resolve()\n        })\n\n        tab.show()\n      })\n    })\n\n    it('should activate element by tab id in nav list', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<nav class=\"nav\">',\n          '  <button type=\"button\" data-bs-target=\"#home\" role=\"tab\">Home</button>',\n          '  <button type=\"button\" id=\"triggerProfile\" data-bs-target=\"#profile\" role=\"tab\">Profile</button>',\n          '</nav>',\n          '<div>',\n          '  <div id=\"home\" role=\"tabpanel\"></div>',\n          '  <div id=\"profile\" role=\"tabpanel\"></div>',\n          '</div>'\n        ].join('')\n\n        const profileTriggerEl = fixtureEl.querySelector('#triggerProfile')\n        const tab = new Tab(profileTriggerEl)\n\n        profileTriggerEl.addEventListener('shown.bs.tab', () => {\n          expect(fixtureEl.querySelector('#profile')).toHaveClass('active')\n          resolve()\n        })\n\n        tab.show()\n      })\n    })\n\n    it('should activate element by tab id in list group', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div class=\"list-group\" role=\"tablist\">',\n          '  <button type=\"button\" data-bs-target=\"#home\" role=\"tab\">Home</button>',\n          '  <button type=\"button\" id=\"triggerProfile\" data-bs-target=\"#profile\" role=\"tab\">Profile</button>',\n          '</div>',\n          '<div>',\n          '  <div id=\"home\" role=\"tabpanel\"></div>',\n          '  <div id=\"profile\" role=\"tabpanel\"></div>',\n          '</div>'\n        ].join('')\n\n        const profileTriggerEl = fixtureEl.querySelector('#triggerProfile')\n        const tab = new Tab(profileTriggerEl)\n\n        profileTriggerEl.addEventListener('shown.bs.tab', () => {\n          expect(fixtureEl.querySelector('#profile')).toHaveClass('active')\n          resolve()\n        })\n\n        tab.show()\n      })\n    })\n\n    it('should work with tab id being an int', done => {\n      fixtureEl.innerHTML = [\n        '<div class=\"card-header d-block d-inline-block\">',\n        '  <ul class=\"nav nav-tabs card-header-tabs\" id=\"page_tabs\">',\n        '    <li class=\"nav-item\">',\n        '      <a class=\"nav-link\" draggable=\"false\" data-toggle=\"tab\" href=\"#tab1\">',\n        '        Working Tab 1 (#tab1)',\n        '     </a>',\n        '    </li>',\n        '    <li class=\"nav-item\">',\n        '      <a id=\"trigger2\" class=\"nav-link\" draggable=\"false\" data-toggle=\"tab\" href=\"#2\">',\n        '        Tab with numeric ID should work (#2)',\n        '      </a>',\n        '    </li>',\n        '  </ul>',\n        '</div>',\n        '<div class=\"card-body\">',\n        '  <div class=\"tab-content\" id=\"page_content\">',\n        '     <div class=\"tab-pane fade\" id=\"tab1\">',\n        '      Working Tab 1 (#tab1) Content Here',\n        '  </div>',\n        '  <div class=\"tab-pane fade\" id=\"2\">',\n        '      Working Tab 2 (#2) with numeric ID',\n        '  </div>',\n        '</div>'\n      ].join('')\n      const profileTriggerEl = fixtureEl.querySelector('#trigger2')\n      const tab = new Tab(profileTriggerEl)\n\n      profileTriggerEl.addEventListener('shown.bs.tab', () => {\n        expect(fixtureEl.querySelector(`#${CSS.escape('2')}`)).toHaveClass('active')\n        done()\n      })\n\n      tab.show()\n    })\n\n    it('should not fire shown when show is prevented', () => {\n      return new Promise((resolve, reject) => {\n        fixtureEl.innerHTML = '<div class=\"nav\"><div class=\"nav-link\"></div></div>'\n\n        const navEl = fixtureEl.querySelector('.nav > div')\n        const tab = new Tab(navEl)\n        const expectDone = () => {\n          setTimeout(() => {\n            expect().nothing()\n            resolve()\n          }, 30)\n        }\n\n        navEl.addEventListener('show.bs.tab', ev => {\n          ev.preventDefault()\n          expectDone()\n        })\n\n        navEl.addEventListener('shown.bs.tab', () => {\n          reject(new Error('should not trigger shown event'))\n        })\n\n        tab.show()\n      })\n    })\n\n    it('should not fire shown when tab is already active', () => {\n      return new Promise((resolve, reject) => {\n        fixtureEl.innerHTML = [\n          '<ul class=\"nav nav-tabs\" role=\"tablist\">',\n          '  <li class=\"nav-item\" role=\"presentation\"><button type=\"button\" data-bs-target=\"#home\" class=\"nav-link active\" role=\"tab\" aria-selected=\"true\">Home</button></li>',\n          '  <li class=\"nav-item\" role=\"presentation\"><button type=\"button\" data-bs-target=\"#profile\" class=\"nav-link\" role=\"tab\">Profile</button></li>',\n          '</ul>',\n          '<div class=\"tab-content\">',\n          '  <div class=\"tab-pane active\" id=\"home\" role=\"tabpanel\"></div>',\n          '  <div class=\"tab-pane\" id=\"profile\" role=\"tabpanel\"></div>',\n          '</div>'\n        ].join('')\n\n        const triggerActive = fixtureEl.querySelector('button.active')\n        const tab = new Tab(triggerActive)\n\n        triggerActive.addEventListener('shown.bs.tab', () => {\n          reject(new Error('should not trigger shown event'))\n        })\n\n        tab.show()\n        setTimeout(() => {\n          expect().nothing()\n          resolve()\n        }, 30)\n      })\n    })\n\n    it('show and shown events should reference correct relatedTarget', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<ul class=\"nav nav-tabs\" role=\"tablist\">',\n          '  <li class=\"nav-item\" role=\"presentation\"><button type=\"button\" data-bs-target=\"#home\" class=\"nav-link active\" role=\"tab\" aria-selected=\"true\">Home</button></li>',\n          '  <li class=\"nav-item\" role=\"presentation\"><button type=\"button\" id=\"triggerProfile\" data-bs-target=\"#profile\" class=\"nav-link\" role=\"tab\">Profile</button></li>',\n          '</ul>',\n          '<div class=\"tab-content\">',\n          '  <div class=\"tab-pane active\" id=\"home\" role=\"tabpanel\"></div>',\n          '  <div class=\"tab-pane\" id=\"profile\" role=\"tabpanel\"></div>',\n          '</div>'\n        ].join('')\n\n        const secondTabTrigger = fixtureEl.querySelector('#triggerProfile')\n        const secondTab = new Tab(secondTabTrigger)\n\n        secondTabTrigger.addEventListener('show.bs.tab', ev => {\n          expect(ev.relatedTarget.getAttribute('data-bs-target')).toEqual('#home')\n        })\n\n        secondTabTrigger.addEventListener('shown.bs.tab', ev => {\n          expect(ev.relatedTarget.getAttribute('data-bs-target')).toEqual('#home')\n          expect(secondTabTrigger.getAttribute('aria-selected')).toEqual('true')\n          expect(fixtureEl.querySelector('button:not(.active)').getAttribute('aria-selected')).toEqual('false')\n          resolve()\n        })\n\n        secondTab.show()\n      })\n    })\n\n    it('should fire hide and hidden events', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<ul class=\"nav\" role=\"tablist\">',\n          '  <li><button type=\"button\" data-bs-target=\"#home\" role=\"tab\">Home</button></li>',\n          '  <li><button type=\"button\" data-bs-target=\"#profile\" role=\"tab\">Profile</button></li>',\n          '</ul>'\n        ].join('')\n\n        const triggerList = fixtureEl.querySelectorAll('button')\n        const firstTab = new Tab(triggerList[0])\n        const secondTab = new Tab(triggerList[1])\n\n        let hideCalled = false\n        triggerList[0].addEventListener('shown.bs.tab', () => {\n          secondTab.show()\n        })\n\n        triggerList[0].addEventListener('hide.bs.tab', ev => {\n          hideCalled = true\n          expect(ev.relatedTarget.getAttribute('data-bs-target')).toEqual('#profile')\n        })\n\n        triggerList[0].addEventListener('hidden.bs.tab', ev => {\n          expect(hideCalled).toBeTrue()\n          expect(ev.relatedTarget.getAttribute('data-bs-target')).toEqual('#profile')\n          resolve()\n        })\n\n        firstTab.show()\n      })\n    })\n\n    it('should not fire hidden when hide is prevented', () => {\n      return new Promise((resolve, reject) => {\n        fixtureEl.innerHTML = [\n          '<ul class=\"nav\" role=\"tablist\">',\n          '  <li><button type=\"button\" data-bs-target=\"#home\" role=\"tab\">Home</button></li>',\n          '  <li><button type=\"button\" data-bs-target=\"#profile\" role=\"tab\">Profile</button></li>',\n          '</ul>'\n        ].join('')\n\n        const triggerList = fixtureEl.querySelectorAll('button')\n        const firstTab = new Tab(triggerList[0])\n        const secondTab = new Tab(triggerList[1])\n        const expectDone = () => {\n          setTimeout(() => {\n            expect().nothing()\n            resolve()\n          }, 30)\n        }\n\n        triggerList[0].addEventListener('shown.bs.tab', () => {\n          secondTab.show()\n        })\n\n        triggerList[0].addEventListener('hide.bs.tab', ev => {\n          ev.preventDefault()\n          expectDone()\n        })\n\n        triggerList[0].addEventListener('hidden.bs.tab', () => {\n          reject(new Error('should not trigger hidden'))\n        })\n\n        firstTab.show()\n      })\n    })\n\n    it('should handle removed tabs', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<ul class=\"nav nav-tabs\" role=\"tablist\">',\n          '  <li class=\"nav-item\" role=\"presentation\">',\n          '    <a class=\"nav-link nav-tab\" href=\"#profile\" role=\"tab\" data-bs-toggle=\"tab\">',\n          '      <button class=\"btn-close\" aria-label=\"Close\"></button>',\n          '    </a>',\n          '  </li>',\n          '  <li class=\"nav-item\" role=\"presentation\">',\n          '    <a id=\"secondNav\" class=\"nav-link nav-tab\" href=\"#buzz\" role=\"tab\" data-bs-toggle=\"tab\">',\n          '      <button class=\"btn-close\" aria-label=\"Close\"></button>',\n          '    </a>',\n          '  </li>',\n          '  <li class=\"nav-item\" role=\"presentation\">',\n          '    <a class=\"nav-link nav-tab\" href=\"#references\" role=\"tab\" data-bs-toggle=\"tab\">',\n          '      <button id=\"btnClose\" class=\"btn-close\" aria-label=\"Close\"></button>',\n          '    </a>',\n          '  </li>',\n          '</ul>',\n          '<div class=\"tab-content\">',\n          '  <div role=\"tabpanel\" class=\"tab-pane fade show active\" id=\"profile\">test 1</div>',\n          '  <div role=\"tabpanel\" class=\"tab-pane fade\" id=\"buzz\">test 2</div>',\n          '  <div role=\"tabpanel\" class=\"tab-pane fade\" id=\"references\">test 3</div>',\n          '</div>'\n        ].join('')\n\n        const secondNavEl = fixtureEl.querySelector('#secondNav')\n        const btnCloseEl = fixtureEl.querySelector('#btnClose')\n        const secondNavTab = new Tab(secondNavEl)\n\n        secondNavEl.addEventListener('shown.bs.tab', () => {\n          expect(fixtureEl.querySelectorAll('.nav-tab')).toHaveSize(2)\n          resolve()\n        })\n\n        btnCloseEl.addEventListener('click', () => {\n          const linkEl = btnCloseEl.parentNode\n          const liEl = linkEl.parentNode\n          const tabId = linkEl.getAttribute('href')\n          const tabIdEl = fixtureEl.querySelector(tabId)\n\n          liEl.remove()\n          tabIdEl.remove()\n          secondNavTab.show()\n        })\n\n        btnCloseEl.click()\n      })\n    })\n\n    it('should not focus on opened tab', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<ul class=\"nav\" role=\"tablist\">',\n          '  <li><button type=\"button\" id=\"home\" data-bs-target=\"#home\" role=\"tab\">Home</button></li>',\n          '  <li><button type=\"button\" id=\"triggerProfile\" data-bs-target=\"#profile\" role=\"tab\">Profile</button></li>',\n          '</ul>',\n          '<ul>',\n          '  <li id=\"home\" role=\"tabpanel\"></li>',\n          '  <li id=\"profile\" role=\"tabpanel\"></li>',\n          '</ul>'\n        ].join('')\n\n        const firstTab = fixtureEl.querySelector('#home')\n        firstTab.focus()\n\n        const profileTriggerEl = fixtureEl.querySelector('#triggerProfile')\n        const tab = new Tab(profileTriggerEl)\n\n        profileTriggerEl.addEventListener('shown.bs.tab', () => {\n          expect(document.activeElement).toBe(firstTab)\n          expect(document.activeElement).not.toBe(profileTriggerEl)\n          resolve()\n        })\n\n        tab.show()\n      })\n    })\n  })\n\n  describe('dispose', () => {\n    it('should dispose a tab', () => {\n      fixtureEl.innerHTML = '<div class=\"nav\"><div class=\"nav-link\"></div></div>'\n\n      const el = fixtureEl.querySelector('.nav > div')\n      const tab = new Tab(fixtureEl.querySelector('.nav > div'))\n\n      expect(Tab.getInstance(el)).not.toBeNull()\n\n      tab.dispose()\n\n      expect(Tab.getInstance(el)).toBeNull()\n    })\n  })\n\n  describe('_activate', () => {\n    it('should not be called if element argument is null', () => {\n      fixtureEl.innerHTML = [\n        '<ul class=\"nav\" role=\"tablist\">',\n        '  <li class=\"nav-link\"></li>',\n        '</ul>'\n      ].join('')\n\n      const tabEl = fixtureEl.querySelector('.nav-link')\n      const tab = new Tab(tabEl)\n      const spy = jasmine.createSpy('spy')\n\n      const spyQueue = spyOn(tab, '_queueCallback')\n      tab._activate(null, spy)\n      expect(spyQueue).not.toHaveBeenCalled()\n      expect(spy).not.toHaveBeenCalled()\n    })\n  })\n\n  describe('_setInitialAttributes', () => {\n    it('should put aria attributes', () => {\n      fixtureEl.innerHTML = [\n        '<ul class=\"nav\">',\n        '  <li class=\"nav-link\" id=\"foo\" data-bs-target=\"#panel\"></li>',\n        '  <li class=\"nav-link\" data-bs-target=\"#panel2\"></li>',\n        '</ul>',\n        '<div id=\"panel\"></div>',\n        '<div id=\"panel2\"></div>'\n      ].join('')\n\n      const tabEl = fixtureEl.querySelector('.nav-link')\n      const parent = fixtureEl.querySelector('.nav')\n      const children = fixtureEl.querySelectorAll('.nav-link')\n      const tabPanel = fixtureEl.querySelector('#panel')\n      const tabPanel2 = fixtureEl.querySelector('#panel2')\n\n      expect(parent.getAttribute('role')).toEqual(null)\n      expect(tabEl.getAttribute('role')).toEqual(null)\n      expect(tabPanel.getAttribute('role')).toEqual(null)\n      const tab = new Tab(tabEl)\n      tab._setInitialAttributes(parent, children)\n\n      expect(parent.getAttribute('role')).toEqual('tablist')\n      expect(tabEl.getAttribute('role')).toEqual('tab')\n\n      expect(tabPanel.getAttribute('role')).toEqual('tabpanel')\n      expect(tabPanel2.getAttribute('role')).toEqual('tabpanel')\n      expect(tabPanel.hasAttribute('tabindex')).toBeFalse()\n      expect(tabPanel.hasAttribute('tabindex2')).toBeFalse()\n\n      expect(tabPanel.getAttribute('aria-labelledby')).toEqual('foo')\n      expect(tabPanel2.hasAttribute('aria-labelledby')).toBeFalse()\n    })\n  })\n\n  describe('_keydown', () => {\n    it('if event is not one of left/right/up/down arrow, ignore it', () => {\n      fixtureEl.innerHTML = [\n        '<ul class=\"nav\">',\n        '  <li class=\"nav-link\" data-bs-toggle=\"tab\"></li>',\n        '</ul>'\n      ].join('')\n\n      const tabEl = fixtureEl.querySelector('.nav-link')\n      const tab = new Tab(tabEl)\n\n      const keydown = createEvent('keydown')\n      keydown.key = 'Enter'\n      const spyStop = spyOn(Event.prototype, 'stopPropagation').and.callThrough()\n      const spyPrevent = spyOn(Event.prototype, 'preventDefault').and.callThrough()\n      const spyKeydown = spyOn(tab, '_keydown')\n      const spyGet = spyOn(tab, '_getChildren')\n\n      tabEl.dispatchEvent(keydown)\n      expect(spyKeydown).toHaveBeenCalled()\n      expect(spyGet).not.toHaveBeenCalled()\n\n      expect(spyStop).not.toHaveBeenCalled()\n      expect(spyPrevent).not.toHaveBeenCalled()\n    })\n\n    it('if keydown event is right/down arrow, handle it', () => {\n      fixtureEl.innerHTML = [\n        '<div class=\"nav\">',\n        '  <span id=\"tab1\" class=\"nav-link\" data-bs-toggle=\"tab\"></span>',\n        '  <span id=\"tab2\" class=\"nav-link\" data-bs-toggle=\"tab\"></span>',\n        '  <span id=\"tab3\" class=\"nav-link\" data-bs-toggle=\"tab\"></span>',\n        '</div>'\n      ].join('')\n\n      const tabEl1 = fixtureEl.querySelector('#tab1')\n      const tabEl2 = fixtureEl.querySelector('#tab2')\n      const tabEl3 = fixtureEl.querySelector('#tab3')\n      const tab1 = new Tab(tabEl1)\n      const tab2 = new Tab(tabEl2)\n      const tab3 = new Tab(tabEl3)\n      const spyShow1 = spyOn(tab1, 'show').and.callThrough()\n      const spyShow2 = spyOn(tab2, 'show').and.callThrough()\n      const spyShow3 = spyOn(tab3, 'show').and.callThrough()\n      const spyFocus1 = spyOn(tabEl1, 'focus').and.callThrough()\n      const spyFocus2 = spyOn(tabEl2, 'focus').and.callThrough()\n      const spyFocus3 = spyOn(tabEl3, 'focus').and.callThrough()\n\n      const spyStop = spyOn(Event.prototype, 'stopPropagation').and.callThrough()\n      const spyPrevent = spyOn(Event.prototype, 'preventDefault').and.callThrough()\n\n      let keydown = createEvent('keydown')\n      keydown.key = 'ArrowRight'\n\n      tabEl1.dispatchEvent(keydown)\n      expect(spyShow2).toHaveBeenCalled()\n      expect(spyFocus2).toHaveBeenCalled()\n\n      keydown = createEvent('keydown')\n      keydown.key = 'ArrowDown'\n\n      tabEl2.dispatchEvent(keydown)\n      expect(spyShow3).toHaveBeenCalled()\n      expect(spyFocus3).toHaveBeenCalled()\n\n      tabEl3.dispatchEvent(keydown)\n      expect(spyShow1).toHaveBeenCalled()\n      expect(spyFocus1).toHaveBeenCalled()\n\n      expect(spyStop).toHaveBeenCalledTimes(3)\n      expect(spyPrevent).toHaveBeenCalledTimes(3)\n    })\n\n    it('if keydown event is left arrow, handle it', () => {\n      fixtureEl.innerHTML = [\n        '<div class=\"nav\">',\n        '  <span id=\"tab1\" class=\"nav-link\" data-bs-toggle=\"tab\"></span>',\n        '  <span id=\"tab2\" class=\"nav-link\" data-bs-toggle=\"tab\"></span>',\n        '</div>'\n      ].join('')\n\n      const tabEl1 = fixtureEl.querySelector('#tab1')\n      const tabEl2 = fixtureEl.querySelector('#tab2')\n      const tab1 = new Tab(tabEl1)\n      const tab2 = new Tab(tabEl2)\n      const spyShow1 = spyOn(tab1, 'show').and.callThrough()\n      const spyShow2 = spyOn(tab2, 'show').and.callThrough()\n      const spyFocus1 = spyOn(tabEl1, 'focus').and.callThrough()\n      const spyFocus2 = spyOn(tabEl2, 'focus').and.callThrough()\n\n      const spyStop = spyOn(Event.prototype, 'stopPropagation').and.callThrough()\n      const spyPrevent = spyOn(Event.prototype, 'preventDefault').and.callThrough()\n\n      let keydown = createEvent('keydown')\n      keydown.key = 'ArrowLeft'\n\n      tabEl2.dispatchEvent(keydown)\n      expect(spyShow1).toHaveBeenCalled()\n      expect(spyFocus1).toHaveBeenCalled()\n\n      keydown = createEvent('keydown')\n      keydown.key = 'ArrowUp'\n\n      tabEl1.dispatchEvent(keydown)\n      expect(spyShow2).toHaveBeenCalled()\n      expect(spyFocus2).toHaveBeenCalled()\n\n      expect(spyStop).toHaveBeenCalledTimes(2)\n      expect(spyPrevent).toHaveBeenCalledTimes(2)\n    })\n\n    it('if keydown event is Home, handle it', () => {\n      fixtureEl.innerHTML = [\n        '<div class=\"nav\">',\n        '  <span id=\"tab1\" class=\"nav-link\" data-bs-toggle=\"tab\"></span>',\n        '  <span id=\"tab2\" class=\"nav-link\" data-bs-toggle=\"tab\"></span>',\n        '  <span id=\"tab3\" class=\"nav-link\" data-bs-toggle=\"tab\"></span>',\n        '</div>'\n      ].join('')\n\n      const tabEl1 = fixtureEl.querySelector('#tab1')\n      const tabEl3 = fixtureEl.querySelector('#tab3')\n\n      const tab3 = new Tab(tabEl3)\n      tab3.show()\n\n      const spyShown = jasmine.createSpy()\n      tabEl1.addEventListener('shown.bs.tab', spyShown)\n\n      const keydown = createEvent('keydown')\n      keydown.key = 'Home'\n\n      tabEl3.dispatchEvent(keydown)\n\n      expect(spyShown).toHaveBeenCalled()\n    })\n\n    it('if keydown event is End, handle it', () => {\n      fixtureEl.innerHTML = [\n        '<div class=\"nav\">',\n        '  <span id=\"tab1\" class=\"nav-link\" data-bs-toggle=\"tab\"></span>',\n        '  <span id=\"tab2\" class=\"nav-link\" data-bs-toggle=\"tab\"></span>',\n        '  <span id=\"tab3\" class=\"nav-link\" data-bs-toggle=\"tab\"></span>',\n        '</div>'\n      ].join('')\n\n      const tabEl1 = fixtureEl.querySelector('#tab1')\n      const tabEl3 = fixtureEl.querySelector('#tab3')\n\n      const tab1 = new Tab(tabEl1)\n      tab1.show()\n\n      const spyShown = jasmine.createSpy()\n      tabEl3.addEventListener('shown.bs.tab', spyShown)\n\n      const keydown = createEvent('keydown')\n      keydown.key = 'End'\n\n      tabEl1.dispatchEvent(keydown)\n\n      expect(spyShown).toHaveBeenCalled()\n    })\n\n    it('if keydown event is right arrow and next element is disabled', () => {\n      fixtureEl.innerHTML = [\n        '<div class=\"nav\">',\n        '  <span id=\"tab1\" class=\"nav-link\" data-bs-toggle=\"tab\"></span>',\n        '  <span id=\"tab2\" class=\"nav-link\" data-bs-toggle=\"tab\" disabled></span>',\n        '  <span id=\"tab3\" class=\"nav-link disabled\" data-bs-toggle=\"tab\"></span>',\n        '  <span id=\"tab4\" class=\"nav-link\" data-bs-toggle=\"tab\"></span>',\n        '</div>'\n      ].join('')\n\n      const tabEl1 = fixtureEl.querySelector('#tab1')\n      const tabEl2 = fixtureEl.querySelector('#tab2')\n      const tabEl3 = fixtureEl.querySelector('#tab3')\n      const tabEl4 = fixtureEl.querySelector('#tab4')\n      const tab1 = new Tab(tabEl1)\n      const tab2 = new Tab(tabEl2)\n      const tab3 = new Tab(tabEl3)\n      const tab4 = new Tab(tabEl4)\n      const spy1 = spyOn(tab1, 'show').and.callThrough()\n      const spy2 = spyOn(tab2, 'show').and.callThrough()\n      const spy3 = spyOn(tab3, 'show').and.callThrough()\n      const spy4 = spyOn(tab4, 'show').and.callThrough()\n      const spyFocus1 = spyOn(tabEl1, 'focus').and.callThrough()\n      const spyFocus2 = spyOn(tabEl2, 'focus').and.callThrough()\n      const spyFocus3 = spyOn(tabEl3, 'focus').and.callThrough()\n      const spyFocus4 = spyOn(tabEl4, 'focus').and.callThrough()\n\n      const keydown = createEvent('keydown')\n      keydown.key = 'ArrowRight'\n\n      tabEl1.dispatchEvent(keydown)\n      expect(spy1).not.toHaveBeenCalled()\n      expect(spy2).not.toHaveBeenCalled()\n      expect(spy3).not.toHaveBeenCalled()\n      expect(spy4).toHaveBeenCalledTimes(1)\n      expect(spyFocus1).not.toHaveBeenCalled()\n      expect(spyFocus2).not.toHaveBeenCalled()\n      expect(spyFocus3).not.toHaveBeenCalled()\n      expect(spyFocus4).toHaveBeenCalledTimes(1)\n    })\n\n    it('if keydown event is left arrow and next element is disabled', () => {\n      fixtureEl.innerHTML = [\n        '<div class=\"nav\">',\n        '  <span id=\"tab1\" class=\"nav-link\" data-bs-toggle=\"tab\"></span>',\n        '  <span id=\"tab2\" class=\"nav-link\" data-bs-toggle=\"tab\" disabled></span>',\n        '  <span id=\"tab3\" class=\"nav-link disabled\" data-bs-toggle=\"tab\"></span>',\n        '  <span id=\"tab4\" class=\"nav-link\" data-bs-toggle=\"tab\"></span>',\n        '</div>'\n      ].join('')\n\n      const tabEl1 = fixtureEl.querySelector('#tab1')\n      const tabEl2 = fixtureEl.querySelector('#tab2')\n      const tabEl3 = fixtureEl.querySelector('#tab3')\n      const tabEl4 = fixtureEl.querySelector('#tab4')\n      const tab1 = new Tab(tabEl1)\n      const tab2 = new Tab(tabEl2)\n      const tab3 = new Tab(tabEl3)\n      const tab4 = new Tab(tabEl4)\n      const spy1 = spyOn(tab1, 'show').and.callThrough()\n      const spy2 = spyOn(tab2, 'show').and.callThrough()\n      const spy3 = spyOn(tab3, 'show').and.callThrough()\n      const spy4 = spyOn(tab4, 'show').and.callThrough()\n      const spyFocus1 = spyOn(tabEl1, 'focus').and.callThrough()\n      const spyFocus2 = spyOn(tabEl2, 'focus').and.callThrough()\n      const spyFocus3 = spyOn(tabEl3, 'focus').and.callThrough()\n      const spyFocus4 = spyOn(tabEl4, 'focus').and.callThrough()\n\n      const keydown = createEvent('keydown')\n      keydown.key = 'ArrowLeft'\n\n      tabEl4.dispatchEvent(keydown)\n      expect(spy4).not.toHaveBeenCalled()\n      expect(spy3).not.toHaveBeenCalled()\n      expect(spy2).not.toHaveBeenCalled()\n      expect(spy1).toHaveBeenCalledTimes(1)\n      expect(spyFocus4).not.toHaveBeenCalled()\n      expect(spyFocus3).not.toHaveBeenCalled()\n      expect(spyFocus2).not.toHaveBeenCalled()\n      expect(spyFocus1).toHaveBeenCalledTimes(1)\n    })\n\n    it('if keydown event is Home and first element is disabled', () => {\n      fixtureEl.innerHTML = [\n        '<div class=\"nav\">',\n        '  <span id=\"tab1\" class=\"nav-link disabled\" data-bs-toggle=\"tab\" disabled></span>',\n        '  <span id=\"tab2\" class=\"nav-link\" data-bs-toggle=\"tab\"></span>',\n        '  <span id=\"tab3\" class=\"nav-link\" data-bs-toggle=\"tab\"></span>',\n        '</div>'\n      ].join('')\n\n      const tabEl1 = fixtureEl.querySelector('#tab1')\n      const tabEl2 = fixtureEl.querySelector('#tab2')\n      const tabEl3 = fixtureEl.querySelector('#tab3')\n      const tab3 = new Tab(tabEl3)\n\n      tab3.show()\n\n      const spyShown1 = jasmine.createSpy()\n      const spyShown2 = jasmine.createSpy()\n      tabEl1.addEventListener('shown.bs.tab', spyShown1)\n      tabEl2.addEventListener('shown.bs.tab', spyShown2)\n\n      const keydown = createEvent('keydown')\n      keydown.key = 'Home'\n\n      tabEl3.dispatchEvent(keydown)\n\n      expect(spyShown1).not.toHaveBeenCalled()\n      expect(spyShown2).toHaveBeenCalled()\n    })\n\n    it('if keydown event is End and last element is disabled', () => {\n      fixtureEl.innerHTML = [\n        '<div class=\"nav\">',\n        '  <span id=\"tab1\" class=\"nav-link\" data-bs-toggle=\"tab\"></span>',\n        '  <span id=\"tab2\" class=\"nav-link\" data-bs-toggle=\"tab\"></span>',\n        '  <span id=\"tab3\" class=\"nav-link\" data-bs-toggle=\"tab\" disabled></span>',\n        '</div>'\n      ].join('')\n\n      const tabEl1 = fixtureEl.querySelector('#tab1')\n      const tabEl2 = fixtureEl.querySelector('#tab2')\n      const tabEl3 = fixtureEl.querySelector('#tab3')\n      const tab1 = new Tab(tabEl1)\n\n      tab1.show()\n\n      const spyShown2 = jasmine.createSpy()\n      const spyShown3 = jasmine.createSpy()\n      tabEl2.addEventListener('shown.bs.tab', spyShown2)\n      tabEl3.addEventListener('shown.bs.tab', spyShown3)\n\n      const keydown = createEvent('keydown')\n      keydown.key = 'End'\n\n      tabEl1.dispatchEvent(keydown)\n\n      expect(spyShown3).not.toHaveBeenCalled()\n      expect(spyShown2).toHaveBeenCalled()\n    })\n  })\n\n  describe('jQueryInterface', () => {\n    it('should create a tab', () => {\n      fixtureEl.innerHTML = '<div class=\"nav\"><div class=\"nav-link\"></div></div>'\n\n      const div = fixtureEl.querySelector('.nav > div')\n\n      jQueryMock.fn.tab = Tab.jQueryInterface\n      jQueryMock.elements = [div]\n\n      jQueryMock.fn.tab.call(jQueryMock)\n\n      expect(Tab.getInstance(div)).not.toBeNull()\n    })\n\n    it('should not re create a tab', () => {\n      fixtureEl.innerHTML = '<div class=\"nav\"><div class=\"nav-link\"></div></div>'\n\n      const div = fixtureEl.querySelector('.nav > div')\n      const tab = new Tab(div)\n\n      jQueryMock.fn.tab = Tab.jQueryInterface\n      jQueryMock.elements = [div]\n\n      jQueryMock.fn.tab.call(jQueryMock)\n\n      expect(Tab.getInstance(div)).toEqual(tab)\n    })\n\n    it('should call a tab method', () => {\n      fixtureEl.innerHTML = '<div class=\"nav\"><div class=\"nav-link\"></div></div>'\n\n      const div = fixtureEl.querySelector('.nav > div')\n      const tab = new Tab(div)\n\n      const spy = spyOn(tab, 'show')\n\n      jQueryMock.fn.tab = Tab.jQueryInterface\n      jQueryMock.elements = [div]\n\n      jQueryMock.fn.tab.call(jQueryMock, 'show')\n\n      expect(Tab.getInstance(div)).toEqual(tab)\n      expect(spy).toHaveBeenCalled()\n    })\n\n    it('should throw error on undefined method', () => {\n      fixtureEl.innerHTML = '<div class=\"nav\"><div class=\"nav-link\"></div></div>'\n\n      const div = fixtureEl.querySelector('.nav > div')\n      const action = 'undefinedMethod'\n\n      jQueryMock.fn.tab = Tab.jQueryInterface\n      jQueryMock.elements = [div]\n\n      expect(() => {\n        jQueryMock.fn.tab.call(jQueryMock, action)\n      }).toThrowError(TypeError, `No method named \"${action}\"`)\n    })\n  })\n\n  describe('getInstance', () => {\n    it('should return null if there is no instance', () => {\n      expect(Tab.getInstance(fixtureEl)).toBeNull()\n    })\n\n    it('should return this instance', () => {\n      fixtureEl.innerHTML = '<div class=\"nav\"><div class=\"nav-link\"></div></div>'\n\n      const divEl = fixtureEl.querySelector('.nav > div')\n      const tab = new Tab(divEl)\n\n      expect(Tab.getInstance(divEl)).toEqual(tab)\n      expect(Tab.getInstance(divEl)).toBeInstanceOf(Tab)\n    })\n  })\n\n  describe('getOrCreateInstance', () => {\n    it('should return tab instance', () => {\n      fixtureEl.innerHTML = '<div class=\"nav\"><div class=\"nav-link\"></div></div>'\n\n      const div = fixtureEl.querySelector('div')\n      const tab = new Tab(div)\n\n      expect(Tab.getOrCreateInstance(div)).toEqual(tab)\n      expect(Tab.getInstance(div)).toEqual(Tab.getOrCreateInstance(div, {}))\n      expect(Tab.getOrCreateInstance(div)).toBeInstanceOf(Tab)\n    })\n\n    it('should return new instance when there is no tab instance', () => {\n      fixtureEl.innerHTML = '<div class=\"nav\"><div class=\"nav-link\"></div></div>'\n\n      const div = fixtureEl.querySelector('div')\n\n      expect(Tab.getInstance(div)).toBeNull()\n      expect(Tab.getOrCreateInstance(div)).toBeInstanceOf(Tab)\n    })\n  })\n\n  describe('data-api', () => {\n    it('should create dynamically a tab', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<ul class=\"nav nav-tabs\" role=\"tablist\">',\n          '  <li class=\"nav-item\" role=\"presentation\"><button type=\"button\" data-bs-target=\"#home\" class=\"nav-link active\" role=\"tab\" aria-selected=\"true\">Home</button></li>',\n          '  <li class=\"nav-item\" role=\"presentation\"><button type=\"button\" id=\"triggerProfile\" data-bs-toggle=\"tab\" data-bs-target=\"#profile\" class=\"nav-link\" role=\"tab\">Profile</button></li>',\n          '</ul>',\n          '<div class=\"tab-content\">',\n          '  <div class=\"tab-pane active\" id=\"home\" role=\"tabpanel\"></div>',\n          '  <div class=\"tab-pane\" id=\"profile\" role=\"tabpanel\"></div>',\n          '</div>'\n        ].join('')\n\n        const secondTabTrigger = fixtureEl.querySelector('#triggerProfile')\n\n        secondTabTrigger.addEventListener('shown.bs.tab', () => {\n          expect(secondTabTrigger).toHaveClass('active')\n          expect(fixtureEl.querySelector('#profile')).toHaveClass('active')\n          resolve()\n        })\n\n        secondTabTrigger.click()\n      })\n    })\n\n    it('selected tab should deactivate previous selected link in dropdown', () => {\n      fixtureEl.innerHTML = [\n        '<ul class=\"nav nav-tabs\">',\n        '  <li class=\"nav-item\"><a class=\"nav-link\" href=\"#home\" data-bs-toggle=\"tab\">Home</a></li>',\n        '  <li class=\"nav-item\"><a class=\"nav-link\" href=\"#profile\" data-bs-toggle=\"tab\">Profile</a></li>',\n        '  <li class=\"nav-item dropdown\">',\n        '    <a class=\"nav-link dropdown-toggle active\" data-bs-toggle=\"dropdown\" href=\"#\">Dropdown</a>',\n        '    <div class=\"dropdown-menu\">',\n        '      <a class=\"dropdown-item active\" href=\"#dropdown1\" id=\"dropdown1-tab\" data-bs-toggle=\"tab\">@fat</a>',\n        '      <a class=\"dropdown-item\" href=\"#dropdown2\" id=\"dropdown2-tab\" data-bs-toggle=\"tab\">@mdo</a>',\n        '    </div>',\n        '  </li>',\n        '</ul>'\n      ].join('')\n\n      const firstLiLinkEl = fixtureEl.querySelector('li:first-child a')\n\n      firstLiLinkEl.click()\n      expect(firstLiLinkEl).toHaveClass('active')\n      expect(fixtureEl.querySelector('li:last-child a')).not.toHaveClass('active')\n      expect(fixtureEl.querySelector('li:last-child .dropdown-menu a:first-child')).not.toHaveClass('active')\n    })\n\n    it('selecting a dropdown tab does not activate another', () => {\n      const nav1 = [\n        '<ul class=\"nav nav-tabs\" id=\"nav1\">',\n        '  <li class=\"nav-item active\"><a class=\"nav-link\" href=\"#home\" data-bs-toggle=\"tab\">Home</a></li>',\n        '  <li class=\"nav-item dropdown\">',\n        '    <a class=\"nav-link dropdown-toggle\" data-bs-toggle=\"dropdown\" href=\"#\">Dropdown</a>',\n        '    <div class=\"dropdown-menu\">',\n        '      <a class=\"dropdown-item\" href=\"#dropdown1\" id=\"dropdown1-tab\" data-bs-toggle=\"tab\">@fat</a>',\n        '    </div>',\n        '  </li>',\n        '</ul>'\n      ].join('')\n      const nav2 = [\n        '<ul class=\"nav nav-tabs\" id=\"nav2\">',\n        '  <li class=\"nav-item active\"><a class=\"nav-link\" href=\"#home\" data-bs-toggle=\"tab\">Home</a></li>',\n        '  <li class=\"nav-item dropdown\">',\n        '    <a class=\"nav-link dropdown-toggle\" data-bs-toggle=\"dropdown\" href=\"#\">Dropdown</a>',\n        '    <div class=\"dropdown-menu\">',\n        '      <a class=\"dropdown-item\" href=\"#dropdown1\" id=\"dropdown1-tab\" data-bs-toggle=\"tab\">@fat</a>',\n        '    </div>',\n        '  </li>',\n        '</ul>'\n      ].join('')\n\n      fixtureEl.innerHTML = nav1 + nav2\n\n      const firstDropItem = fixtureEl.querySelector('#nav1 .dropdown-item')\n\n      firstDropItem.click()\n      expect(firstDropItem).toHaveClass('active')\n      expect(fixtureEl.querySelector('#nav1 .dropdown-toggle')).toHaveClass('active')\n      expect(fixtureEl.querySelector('#nav2 .dropdown-toggle')).not.toHaveClass('active')\n      expect(fixtureEl.querySelector('#nav2 .dropdown-item')).not.toHaveClass('active')\n    })\n\n    it('should support li > .dropdown-item', () => {\n      fixtureEl.innerHTML = [\n        '<ul class=\"nav nav-tabs\">',\n        '  <li class=\"nav-item\"><a class=\"nav-link active\" href=\"#home\" data-bs-toggle=\"tab\">Home</a></li>',\n        '  <li class=\"nav-item\"><a class=\"nav-link\" href=\"#profile\" data-bs-toggle=\"tab\">Profile</a></li>',\n        '  <li class=\"nav-item dropdown\">',\n        '    <a class=\"nav-link dropdown-toggle\" data-bs-toggle=\"dropdown\" href=\"#\">Dropdown</a>',\n        '    <ul class=\"dropdown-menu\">',\n        '      <li><a class=\"dropdown-item\" href=\"#dropdown1\" id=\"dropdown1-tab\" data-bs-toggle=\"tab\">@fat</a></li>',\n        '      <li><a class=\"dropdown-item\" href=\"#dropdown2\" id=\"dropdown2-tab\" data-bs-toggle=\"tab\">@mdo</a></li>',\n        '    </ul>',\n        '  </li>',\n        '</ul>'\n      ].join('')\n\n      const dropItems = fixtureEl.querySelectorAll('.dropdown-item')\n\n      dropItems[1].click()\n      expect(dropItems[0]).not.toHaveClass('active')\n      expect(dropItems[1]).toHaveClass('active')\n      expect(fixtureEl.querySelector('.nav-link')).not.toHaveClass('active')\n    })\n\n    it('should handle nested tabs', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<nav class=\"nav nav-tabs\" role=\"tablist\">',\n          '  <button type=\"button\" id=\"tab1\" data-bs-target=\"#x-tab1\" class=\"nav-link\" data-bs-toggle=\"tab\" role=\"tab\" aria-controls=\"x-tab1\">Tab 1</button>',\n          '  <button type=\"button\" data-bs-target=\"#x-tab2\" class=\"nav-link active\" data-bs-toggle=\"tab\" role=\"tab\" aria-controls=\"x-tab2\" aria-selected=\"true\">Tab 2</button>',\n          '  <button type=\"button\" data-bs-target=\"#x-tab3\" class=\"nav-link\" data-bs-toggle=\"tab\" role=\"tab\" aria-controls=\"x-tab3\">Tab 3</button>',\n          '</nav>',\n          '<div class=\"tab-content\">',\n          '  <div class=\"tab-pane\" id=\"x-tab1\" role=\"tabpanel\">',\n          '    <nav class=\"nav nav-tabs\" role=\"tablist\">',\n          '      <button type=\"button\" data-bs-target=\"#nested-tab1\" class=\"nav-link active\" data-bs-toggle=\"tab\" role=\"tab\" aria-controls=\"x-tab1\" aria-selected=\"true\">Nested Tab 1</button>',\n          '      <button type=\"button\" id=\"tabNested2\" data-bs-target=\"#nested-tab2\" class=\"nav-link\" data-bs-toggle=\"tab\" role=\"tab\" aria-controls=\"x-profile\">Nested Tab2</button>',\n          '    </nav>',\n          '    <div class=\"tab-content\">',\n          '      <div class=\"tab-pane active\" id=\"nested-tab1\" role=\"tabpanel\">Nested Tab1 Content</div>',\n          '      <div class=\"tab-pane\" id=\"nested-tab2\" role=\"tabpanel\">Nested Tab2 Content</div>',\n          '    </div>',\n          '  </div>',\n          '  <div class=\"tab-pane active\" id=\"x-tab2\" role=\"tabpanel\">Tab2 Content</div>',\n          '  <div class=\"tab-pane\" id=\"x-tab3\" role=\"tabpanel\">Tab3 Content</div>',\n          '</div>'\n        ].join('')\n\n        const tab1El = fixtureEl.querySelector('#tab1')\n        const tabNested2El = fixtureEl.querySelector('#tabNested2')\n        const xTab1El = fixtureEl.querySelector('#x-tab1')\n\n        tabNested2El.addEventListener('shown.bs.tab', () => {\n          expect(xTab1El).toHaveClass('active')\n          resolve()\n        })\n\n        tab1El.addEventListener('shown.bs.tab', () => {\n          expect(xTab1El).toHaveClass('active')\n          tabNested2El.click()\n        })\n\n        tab1El.click()\n      })\n    })\n\n    it('should not remove fade class if no active pane is present', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<ul class=\"nav nav-tabs\" role=\"tablist\">',\n          '  <li class=\"nav-item\" role=\"presentation\"><button type=\"button\" id=\"tab-home\" data-bs-target=\"#home\" class=\"nav-link\" data-bs-toggle=\"tab\" role=\"tab\">Home</button></li>',\n          '  <li class=\"nav-item\" role=\"presentation\"><button type=\"button\" id=\"tab-profile\" data-bs-target=\"#profile\" class=\"nav-link\" data-bs-toggle=\"tab\" role=\"tab\">Profile</button></li>',\n          '</ul>',\n          '<div class=\"tab-content\">',\n          '  <div class=\"tab-pane fade\" id=\"home\" role=\"tabpanel\"></div>',\n          '  <div class=\"tab-pane fade\" id=\"profile\" role=\"tabpanel\"></div>',\n          '</div>'\n        ].join('')\n\n        const triggerTabProfileEl = fixtureEl.querySelector('#tab-profile')\n        const triggerTabHomeEl = fixtureEl.querySelector('#tab-home')\n        const tabProfileEl = fixtureEl.querySelector('#profile')\n        const tabHomeEl = fixtureEl.querySelector('#home')\n\n        triggerTabHomeEl.addEventListener('shown.bs.tab', () => {\n          setTimeout(() => {\n            expect(tabProfileEl).toHaveClass('fade')\n            expect(tabProfileEl).not.toHaveClass('show')\n\n            expect(tabHomeEl).toHaveClass('fade')\n            expect(tabHomeEl).toHaveClass('show')\n\n            resolve()\n          }, 10)\n        })\n\n        triggerTabProfileEl.addEventListener('shown.bs.tab', () => {\n          setTimeout(() => {\n            expect(tabProfileEl).toHaveClass('fade')\n            expect(tabProfileEl).toHaveClass('show')\n            triggerTabHomeEl.click()\n          }, 10)\n        })\n\n        triggerTabProfileEl.click()\n      })\n    })\n\n    it('should add `show` class to tab panes if there is no `.fade` class', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<ul class=\"nav nav-tabs\" role=\"tablist\">',\n          '  <li class=\"nav-item\" role=\"presentation\">',\n          '    <button type=\"button\" class=\"nav-link nav-tab\" data-bs-target=\"#home\" role=\"tab\" data-bs-toggle=\"tab\">Home</button>',\n          '  </li>',\n          '  <li class=\"nav-item\" role=\"presentation\">',\n          '    <button type=\"button\" id=\"secondNav\" class=\"nav-link nav-tab\" data-bs-target=\"#profile\" role=\"tab\" data-bs-toggle=\"tab\">Profile</button>',\n          '  </li>',\n          '</ul>',\n          '<div class=\"tab-content\">',\n          '  <div role=\"tabpanel\" class=\"tab-pane\" id=\"home\">test 1</div>',\n          '  <div role=\"tabpanel\" class=\"tab-pane\" id=\"profile\">test 2</div>',\n          '</div>'\n        ].join('')\n\n        const secondNavEl = fixtureEl.querySelector('#secondNav')\n\n        secondNavEl.addEventListener('shown.bs.tab', () => {\n          expect(fixtureEl.querySelectorAll('.tab-content .show')).toHaveSize(1)\n          resolve()\n        })\n\n        secondNavEl.click()\n      })\n    })\n\n    it('should add show class to tab panes if there is a `.fade` class', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<ul class=\"nav nav-tabs\" role=\"tablist\">',\n          '  <li class=\"nav-item\" role=\"presentation\">',\n          '    <button type=\"button\" class=\"nav-link nav-tab\" data-bs-target=\"#home\" role=\"tab\" data-bs-toggle=\"tab\">Home</button>',\n          '  </li>',\n          '  <li class=\"nav-item\" role=\"presentation\">',\n          '    <button type=\"button\" id=\"secondNav\" class=\"nav-link nav-tab\" data-bs-target=\"#profile\" role=\"tab\" data-bs-toggle=\"tab\">Profile</button>',\n          '  </li>',\n          '</ul>',\n          '<div class=\"tab-content\">',\n          '  <div role=\"tabpanel\" class=\"tab-pane fade\" id=\"home\">test 1</div>',\n          '  <div role=\"tabpanel\" class=\"tab-pane fade\" id=\"profile\">test 2</div>',\n          '</div>'\n        ].join('')\n\n        const secondNavEl = fixtureEl.querySelector('#secondNav')\n\n        secondNavEl.addEventListener('shown.bs.tab', () => {\n          setTimeout(() => {\n            expect(fixtureEl.querySelectorAll('.show')).toHaveSize(1)\n            resolve()\n          }, 10)\n        })\n\n        secondNavEl.click()\n      })\n    })\n\n    it('should prevent default when the trigger is <a> or <area>', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<ul class=\"nav\" role=\"tablist\">',\n          '  <li><a type=\"button\" href=\"#test\"  class=\"active\" role=\"tab\" data-bs-toggle=\"tab\">Home</a></li>',\n          '  <li><a type=\"button\" href=\"#test2\" role=\"tab\" data-bs-toggle=\"tab\">Home</a></li>',\n          '</ul>'\n        ].join('')\n\n        const tabEl = fixtureEl.querySelector('[href=\"#test2\"]')\n        const spy = spyOn(Event.prototype, 'preventDefault').and.callThrough()\n\n        tabEl.addEventListener('shown.bs.tab', () => {\n          expect(tabEl).toHaveClass('active')\n          expect(spy).toHaveBeenCalled()\n          resolve()\n        })\n\n        tabEl.click()\n      })\n    })\n\n    it('should not fire shown when tab has disabled attribute', () => {\n      return new Promise((resolve, reject) => {\n        fixtureEl.innerHTML = [\n          '<ul class=\"nav nav-tabs\" role=\"tablist\">',\n          '  <li class=\"nav-item\" role=\"presentation\"><button type=\"button\" data-bs-target=\"#home\" class=\"nav-link active\" role=\"tab\" aria-selected=\"true\">Home</button></li>',\n          '  <li class=\"nav-item\" role=\"presentation\"><button type=\"button\" data-bs-target=\"#profile\" class=\"nav-link\" disabled role=\"tab\">Profile</button></li>',\n          '</ul>',\n          '<div class=\"tab-content\">',\n          '  <div class=\"tab-pane active\" id=\"home\" role=\"tabpanel\"></div>',\n          '  <div class=\"tab-pane\" id=\"profile\" role=\"tabpanel\"></div>',\n          '</div>'\n        ].join('')\n\n        const triggerDisabled = fixtureEl.querySelector('button[disabled]')\n        triggerDisabled.addEventListener('shown.bs.tab', () => {\n          reject(new Error('should not trigger shown event'))\n        })\n\n        triggerDisabled.click()\n        setTimeout(() => {\n          expect().nothing()\n          resolve()\n        }, 30)\n      })\n    })\n\n    it('should not fire shown when tab has disabled class', () => {\n      return new Promise((resolve, reject) => {\n        fixtureEl.innerHTML = [\n          '<ul class=\"nav nav-tabs\" role=\"tablist\">',\n          '  <li class=\"nav-item\" role=\"presentation\"><a href=\"#home\" class=\"nav-link active\" role=\"tab\" aria-selected=\"true\">Home</a></li>',\n          '  <li class=\"nav-item\" role=\"presentation\"><a href=\"#profile\" class=\"nav-link disabled\" role=\"tab\">Profile</a></li>',\n          '</ul>',\n          '<div class=\"tab-content\">',\n          '  <div class=\"tab-pane active\" id=\"home\" role=\"tabpanel\"></div>',\n          '  <div class=\"tab-pane\" id=\"profile\" role=\"tabpanel\"></div>',\n          '</div>'\n        ].join('')\n\n        const triggerDisabled = fixtureEl.querySelector('a.disabled')\n\n        triggerDisabled.addEventListener('shown.bs.tab', () => {\n          reject(new Error('should not trigger shown event'))\n        })\n\n        triggerDisabled.click()\n        setTimeout(() => {\n          expect().nothing()\n          resolve()\n        }, 30)\n      })\n    })\n  })\n})\n"
  },
  {
    "path": "js/tests/unit/toast.spec.js",
    "content": "import Toast from '../../src/toast.js'\nimport {\n  clearFixture, createEvent, getFixture, jQueryMock\n} from '../helpers/fixture.js'\n\ndescribe('Toast', () => {\n  let fixtureEl\n\n  beforeAll(() => {\n    fixtureEl = getFixture()\n  })\n\n  afterEach(() => {\n    clearFixture()\n  })\n\n  describe('VERSION', () => {\n    it('should return plugin version', () => {\n      expect(Toast.VERSION).toEqual(jasmine.any(String))\n    })\n  })\n\n  describe('DATA_KEY', () => {\n    it('should return plugin data key', () => {\n      expect(Toast.DATA_KEY).toEqual('bs.toast')\n    })\n  })\n\n  describe('constructor', () => {\n    it('should take care of element either passed as a CSS selector or DOM element', () => {\n      fixtureEl.innerHTML = '<div class=\"toast\"></div>'\n\n      const toastEl = fixtureEl.querySelector('.toast')\n      const toastBySelector = new Toast('.toast')\n      const toastByElement = new Toast(toastEl)\n\n      expect(toastBySelector._element).toEqual(toastEl)\n      expect(toastByElement._element).toEqual(toastEl)\n    })\n\n    it('should allow to config in js', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div class=\"toast\">',\n          '  <div class=\"toast-body\">',\n          '    a simple toast',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const toastEl = fixtureEl.querySelector('div')\n        const toast = new Toast(toastEl, {\n          delay: 1\n        })\n\n        toastEl.addEventListener('shown.bs.toast', () => {\n          expect(toastEl).toHaveClass('show')\n          resolve()\n        })\n\n        toast.show()\n      })\n    })\n\n    it('should close toast when close element with data-bs-dismiss attribute is set', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div class=\"toast\" data-bs-delay=\"1\" data-bs-autohide=\"false\" data-bs-animation=\"false\">',\n          '  <button type=\"button\" class=\"ms-2 mb-1 btn-close\" data-bs-dismiss=\"toast\" aria-label=\"Close\"></button>',\n          '</div>'\n        ].join('')\n\n        const toastEl = fixtureEl.querySelector('div')\n        const toast = new Toast(toastEl)\n\n        toastEl.addEventListener('shown.bs.toast', () => {\n          expect(toastEl).toHaveClass('show')\n\n          const button = toastEl.querySelector('.btn-close')\n\n          button.click()\n        })\n\n        toastEl.addEventListener('hidden.bs.toast', () => {\n          expect(toastEl).not.toHaveClass('show')\n          resolve()\n        })\n\n        toast.show()\n      })\n    })\n  })\n\n  describe('Default', () => {\n    it('should expose default setting to allow to override them', () => {\n      const defaultDelay = 1000\n\n      Toast.Default.delay = defaultDelay\n\n      fixtureEl.innerHTML = [\n        '<div class=\"toast\" data-bs-autohide=\"false\" data-bs-animation=\"false\">',\n        '  <button type=\"button\" class=\"ms-2 mb-1 btn-close\" data-bs-dismiss=\"toast\" aria-label=\"Close\"></button>',\n        '</div>'\n      ].join('')\n\n      const toastEl = fixtureEl.querySelector('div')\n      const toast = new Toast(toastEl)\n\n      expect(toast._config.delay).toEqual(defaultDelay)\n    })\n  })\n\n  describe('DefaultType', () => {\n    it('should expose default setting types for read', () => {\n      expect(Toast.DefaultType).toEqual(jasmine.any(Object))\n    })\n  })\n\n  describe('show', () => {\n    it('should auto hide', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div class=\"toast\" data-bs-delay=\"1\">',\n          '  <div class=\"toast-body\">',\n          '    a simple toast',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const toastEl = fixtureEl.querySelector('.toast')\n        const toast = new Toast(toastEl)\n\n        toastEl.addEventListener('hidden.bs.toast', () => {\n          expect(toastEl).not.toHaveClass('show')\n          resolve()\n        })\n\n        toast.show()\n      })\n    })\n\n    it('should not add fade class', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div class=\"toast\" data-bs-delay=\"1\" data-bs-animation=\"false\">',\n          '  <div class=\"toast-body\">',\n          '    a simple toast',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const toastEl = fixtureEl.querySelector('.toast')\n        const toast = new Toast(toastEl)\n\n        toastEl.addEventListener('shown.bs.toast', () => {\n          expect(toastEl).not.toHaveClass('fade')\n          resolve()\n        })\n\n        toast.show()\n      })\n    })\n\n    it('should not trigger shown if show is prevented', () => {\n      return new Promise((resolve, reject) => {\n        fixtureEl.innerHTML = [\n          '<div class=\"toast\" data-bs-delay=\"1\" data-bs-animation=\"false\">',\n          '  <div class=\"toast-body\">',\n          '    a simple toast',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const toastEl = fixtureEl.querySelector('.toast')\n        const toast = new Toast(toastEl)\n\n        const assertDone = () => {\n          setTimeout(() => {\n            expect(toastEl).not.toHaveClass('show')\n            resolve()\n          }, 20)\n        }\n\n        toastEl.addEventListener('show.bs.toast', event => {\n          event.preventDefault()\n          assertDone()\n        })\n\n        toastEl.addEventListener('shown.bs.toast', () => {\n          reject(new Error('shown event should not be triggered if show is prevented'))\n        })\n\n        toast.show()\n      })\n    })\n\n    it('should clear timeout if toast is shown again before it is hidden', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div class=\"toast\">',\n          '  <div class=\"toast-body\">',\n          '    a simple toast',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const toastEl = fixtureEl.querySelector('.toast')\n        const toast = new Toast(toastEl)\n\n        setTimeout(() => {\n          toast._config.autohide = false\n          toastEl.addEventListener('shown.bs.toast', () => {\n            expect(spy).toHaveBeenCalled()\n            expect(toast._timeout).toBeNull()\n            resolve()\n          })\n          toast.show()\n        }, toast._config.delay / 2)\n\n        const spy = spyOn(toast, '_clearTimeout').and.callThrough()\n\n        toast.show()\n      })\n    })\n\n    it('should clear timeout if toast is interacted with mouse', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div class=\"toast\">',\n          '  <div class=\"toast-body\">',\n          '    a simple toast',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const toastEl = fixtureEl.querySelector('.toast')\n        const toast = new Toast(toastEl)\n        const spy = spyOn(toast, '_clearTimeout').and.callThrough()\n\n        setTimeout(() => {\n          spy.calls.reset()\n\n          toastEl.addEventListener('mouseover', () => {\n            expect(toast._clearTimeout).toHaveBeenCalledTimes(1)\n            expect(toast._timeout).toBeNull()\n            resolve()\n          })\n\n          const mouseOverEvent = createEvent('mouseover')\n          toastEl.dispatchEvent(mouseOverEvent)\n        }, toast._config.delay / 2)\n\n        toast.show()\n      })\n    })\n\n    it('should clear timeout if toast is interacted with keyboard', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<button id=\"outside-focusable\">outside focusable</button>',\n          '<div class=\"toast\">',\n          '  <div class=\"toast-body\">',\n          '    a simple toast',\n          '    <button>with a button</button>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const toastEl = fixtureEl.querySelector('.toast')\n        const toast = new Toast(toastEl)\n        const spy = spyOn(toast, '_clearTimeout').and.callThrough()\n\n        setTimeout(() => {\n          spy.calls.reset()\n\n          toastEl.addEventListener('focusin', () => {\n            expect(toast._clearTimeout).toHaveBeenCalledTimes(1)\n            expect(toast._timeout).toBeNull()\n            resolve()\n          })\n\n          const insideFocusable = toastEl.querySelector('button')\n          insideFocusable.focus()\n        }, toast._config.delay / 2)\n\n        toast.show()\n      })\n    })\n\n    it('should still auto hide after being interacted with mouse and keyboard', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<button id=\"outside-focusable\">outside focusable</button>',\n          '<div class=\"toast\">',\n          '  <div class=\"toast-body\">',\n          '    a simple toast',\n          '    <button>with a button</button>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const toastEl = fixtureEl.querySelector('.toast')\n        const toast = new Toast(toastEl)\n\n        setTimeout(() => {\n          toastEl.addEventListener('mouseover', () => {\n            const insideFocusable = toastEl.querySelector('button')\n            insideFocusable.focus()\n          })\n\n          toastEl.addEventListener('focusin', () => {\n            const mouseOutEvent = createEvent('mouseout')\n            toastEl.dispatchEvent(mouseOutEvent)\n          })\n\n          toastEl.addEventListener('mouseout', () => {\n            const outsideFocusable = document.getElementById('outside-focusable')\n            outsideFocusable.focus()\n          })\n\n          toastEl.addEventListener('focusout', () => {\n            expect(toast._timeout).not.toBeNull()\n            resolve()\n          })\n\n          const mouseOverEvent = createEvent('mouseover')\n          toastEl.dispatchEvent(mouseOverEvent)\n        }, toast._config.delay / 2)\n\n        toast.show()\n      })\n    })\n\n    it('should not auto hide if focus leaves but mouse pointer remains inside', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<button id=\"outside-focusable\">outside focusable</button>',\n          '<div class=\"toast\">',\n          '  <div class=\"toast-body\">',\n          '    a simple toast',\n          '    <button>with a button</button>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const toastEl = fixtureEl.querySelector('.toast')\n        const toast = new Toast(toastEl)\n\n        setTimeout(() => {\n          toastEl.addEventListener('mouseover', () => {\n            const insideFocusable = toastEl.querySelector('button')\n            insideFocusable.focus()\n          })\n\n          toastEl.addEventListener('focusin', () => {\n            const outsideFocusable = document.getElementById('outside-focusable')\n            outsideFocusable.focus()\n          })\n\n          toastEl.addEventListener('focusout', () => {\n            expect(toast._timeout).toBeNull()\n            resolve()\n          })\n\n          const mouseOverEvent = createEvent('mouseover')\n          toastEl.dispatchEvent(mouseOverEvent)\n        }, toast._config.delay / 2)\n\n        toast.show()\n      })\n    })\n\n    it('should not auto hide if mouse pointer leaves but focus remains inside', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<button id=\"outside-focusable\">outside focusable</button>',\n          '<div class=\"toast\">',\n          '  <div class=\"toast-body\">',\n          '    a simple toast',\n          '    <button>with a button</button>',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const toastEl = fixtureEl.querySelector('.toast')\n        const toast = new Toast(toastEl)\n\n        setTimeout(() => {\n          toastEl.addEventListener('mouseover', () => {\n            const insideFocusable = toastEl.querySelector('button')\n            insideFocusable.focus()\n          })\n\n          toastEl.addEventListener('focusin', () => {\n            const mouseOutEvent = createEvent('mouseout')\n            toastEl.dispatchEvent(mouseOutEvent)\n          })\n\n          toastEl.addEventListener('mouseout', () => {\n            expect(toast._timeout).toBeNull()\n            resolve()\n          })\n\n          const mouseOverEvent = createEvent('mouseover')\n          toastEl.dispatchEvent(mouseOverEvent)\n        }, toast._config.delay / 2)\n\n        toast.show()\n      })\n    })\n  })\n\n  describe('hide', () => {\n    it('should allow to hide toast manually', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div class=\"toast\" data-bs-delay=\"1\" data-bs-autohide=\"false\">',\n          '  <div class=\"toast-body\">',\n          '    a simple toast',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const toastEl = fixtureEl.querySelector('.toast')\n        const toast = new Toast(toastEl)\n\n        toastEl.addEventListener('shown.bs.toast', () => {\n          toast.hide()\n        })\n\n        toastEl.addEventListener('hidden.bs.toast', () => {\n          expect(toastEl).not.toHaveClass('show')\n          resolve()\n        })\n\n        toast.show()\n      })\n    })\n\n    it('should do nothing when we call hide on a non shown toast', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const toastEl = fixtureEl.querySelector('div')\n      const toast = new Toast(toastEl)\n\n      const spy = spyOn(toastEl.classList, 'contains')\n\n      toast.hide()\n\n      expect(spy).toHaveBeenCalled()\n    })\n\n    it('should not trigger hidden if hide is prevented', () => {\n      return new Promise((resolve, reject) => {\n        fixtureEl.innerHTML = [\n          '<div class=\"toast\" data-bs-delay=\"1\" data-bs-animation=\"false\">',\n          '  <div class=\"toast-body\">',\n          '    a simple toast',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const toastEl = fixtureEl.querySelector('.toast')\n        const toast = new Toast(toastEl)\n\n        const assertDone = () => {\n          setTimeout(() => {\n            expect(toastEl).toHaveClass('show')\n            resolve()\n          }, 20)\n        }\n\n        toastEl.addEventListener('shown.bs.toast', () => {\n          toast.hide()\n        })\n\n        toastEl.addEventListener('hide.bs.toast', event => {\n          event.preventDefault()\n          assertDone()\n        })\n\n        toastEl.addEventListener('hidden.bs.toast', () => {\n          reject(new Error('hidden event should not be triggered if hide is prevented'))\n        })\n\n        toast.show()\n      })\n    })\n  })\n\n  describe('dispose', () => {\n    it('should allow to destroy toast', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const toastEl = fixtureEl.querySelector('div')\n\n      const toast = new Toast(toastEl)\n\n      expect(Toast.getInstance(toastEl)).not.toBeNull()\n\n      toast.dispose()\n\n      expect(Toast.getInstance(toastEl)).toBeNull()\n    })\n\n    it('should allow to destroy toast and hide it before that', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div class=\"toast\" data-bs-delay=\"0\" data-bs-autohide=\"false\">',\n          '  <div class=\"toast-body\">',\n          '    a simple toast',\n          '  </div>',\n          '</div>'\n        ].join('')\n\n        const toastEl = fixtureEl.querySelector('div')\n        const toast = new Toast(toastEl)\n        const expected = () => {\n          expect(toastEl).toHaveClass('show')\n          expect(Toast.getInstance(toastEl)).not.toBeNull()\n\n          toast.dispose()\n\n          expect(Toast.getInstance(toastEl)).toBeNull()\n          expect(toastEl).not.toHaveClass('show')\n\n          resolve()\n        }\n\n        toastEl.addEventListener('shown.bs.toast', () => {\n          setTimeout(expected, 1)\n        })\n\n        toast.show()\n      })\n    })\n  })\n\n  describe('jQueryInterface', () => {\n    it('should create a toast', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n\n      jQueryMock.fn.toast = Toast.jQueryInterface\n      jQueryMock.elements = [div]\n\n      jQueryMock.fn.toast.call(jQueryMock)\n\n      expect(Toast.getInstance(div)).not.toBeNull()\n    })\n\n    it('should not re create a toast', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n      const toast = new Toast(div)\n\n      jQueryMock.fn.toast = Toast.jQueryInterface\n      jQueryMock.elements = [div]\n\n      jQueryMock.fn.toast.call(jQueryMock)\n\n      expect(Toast.getInstance(div)).toEqual(toast)\n    })\n\n    it('should call a toast method', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n      const toast = new Toast(div)\n\n      const spy = spyOn(toast, 'show')\n\n      jQueryMock.fn.toast = Toast.jQueryInterface\n      jQueryMock.elements = [div]\n\n      jQueryMock.fn.toast.call(jQueryMock, 'show')\n\n      expect(Toast.getInstance(div)).toEqual(toast)\n      expect(spy).toHaveBeenCalled()\n    })\n\n    it('should throw error on undefined method', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n      const action = 'undefinedMethod'\n\n      jQueryMock.fn.toast = Toast.jQueryInterface\n      jQueryMock.elements = [div]\n\n      expect(() => {\n        jQueryMock.fn.toast.call(jQueryMock, action)\n      }).toThrowError(TypeError, `No method named \"${action}\"`)\n    })\n  })\n\n  describe('getInstance', () => {\n    it('should return a toast instance', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n      const toast = new Toast(div)\n\n      expect(Toast.getInstance(div)).toEqual(toast)\n      expect(Toast.getInstance(div)).toBeInstanceOf(Toast)\n    })\n\n    it('should return null when there is no toast instance', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n\n      expect(Toast.getInstance(div)).toBeNull()\n    })\n  })\n\n  describe('getOrCreateInstance', () => {\n    it('should return toast instance', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n      const toast = new Toast(div)\n\n      expect(Toast.getOrCreateInstance(div)).toEqual(toast)\n      expect(Toast.getInstance(div)).toEqual(Toast.getOrCreateInstance(div, {}))\n      expect(Toast.getOrCreateInstance(div)).toBeInstanceOf(Toast)\n    })\n\n    it('should return new instance when there is no toast instance', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n\n      expect(Toast.getInstance(div)).toBeNull()\n      expect(Toast.getOrCreateInstance(div)).toBeInstanceOf(Toast)\n    })\n\n    it('should return new instance when there is no toast instance with given configuration', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n\n      expect(Toast.getInstance(div)).toBeNull()\n      const toast = Toast.getOrCreateInstance(div, {\n        delay: 1\n      })\n      expect(toast).toBeInstanceOf(Toast)\n\n      expect(toast._config.delay).toEqual(1)\n    })\n\n    it('should return the instance when exists without given configuration', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n      const toast = new Toast(div, {\n        delay: 1\n      })\n      expect(Toast.getInstance(div)).toEqual(toast)\n\n      const toast2 = Toast.getOrCreateInstance(div, {\n        delay: 2\n      })\n      expect(toast).toBeInstanceOf(Toast)\n      expect(toast2).toEqual(toast)\n\n      expect(toast2._config.delay).toEqual(1)\n    })\n  })\n})\n"
  },
  {
    "path": "js/tests/unit/tooltip.spec.js",
    "content": "import EventHandler from '../../src/dom/event-handler.js'\nimport Tooltip from '../../src/tooltip.js'\nimport { noop } from '../../src/util/index.js'\nimport {\n  clearFixture, createEvent, getFixture, jQueryMock\n} from '../helpers/fixture.js'\n\ndescribe('Tooltip', () => {\n  let fixtureEl\n\n  beforeAll(() => {\n    fixtureEl = getFixture()\n  })\n\n  afterEach(() => {\n    clearFixture()\n\n    for (const tooltipEl of document.querySelectorAll('.tooltip')) {\n      tooltipEl.remove()\n    }\n  })\n\n  describe('VERSION', () => {\n    it('should return plugin version', () => {\n      expect(Tooltip.VERSION).toEqual(jasmine.any(String))\n    })\n  })\n\n  describe('Default', () => {\n    it('should return plugin default config', () => {\n      expect(Tooltip.Default).toEqual(jasmine.any(Object))\n    })\n  })\n\n  describe('NAME', () => {\n    it('should return plugin name', () => {\n      expect(Tooltip.NAME).toEqual(jasmine.any(String))\n    })\n  })\n\n  describe('DATA_KEY', () => {\n    it('should return plugin data key', () => {\n      expect(Tooltip.DATA_KEY).toEqual('bs.tooltip')\n    })\n  })\n\n  describe('EVENT_KEY', () => {\n    it('should return plugin event key', () => {\n      expect(Tooltip.EVENT_KEY).toEqual('.bs.tooltip')\n    })\n  })\n\n  describe('DefaultType', () => {\n    it('should return plugin default type', () => {\n      expect(Tooltip.DefaultType).toEqual(jasmine.any(Object))\n    })\n  })\n\n  describe('constructor', () => {\n    it('should take care of element either passed as a CSS selector or DOM element', () => {\n      fixtureEl.innerHTML = '<a href=\"#\" id=\"tooltipEl\" rel=\"tooltip\" title=\"Nice and short title\"></a>'\n\n      const tooltipEl = fixtureEl.querySelector('#tooltipEl')\n      const tooltipBySelector = new Tooltip('#tooltipEl')\n      const tooltipByElement = new Tooltip(tooltipEl)\n\n      expect(tooltipBySelector._element).toEqual(tooltipEl)\n      expect(tooltipByElement._element).toEqual(tooltipEl)\n    })\n\n    it('should not take care of disallowed data attributes', () => {\n      fixtureEl.innerHTML = '<a href=\"#\" rel=\"tooltip\" data-bs-sanitize=\"false\" title=\"Another tooltip\"></a>'\n\n      const tooltipEl = fixtureEl.querySelector('a')\n      const tooltip = new Tooltip(tooltipEl)\n\n      expect(tooltip._config.sanitize).toBeTrue()\n    })\n\n    it('should convert title and content to string if numbers', () => {\n      fixtureEl.innerHTML = '<a href=\"#\" rel=\"tooltip\"></a>'\n\n      const tooltipEl = fixtureEl.querySelector('a')\n      const tooltip = new Tooltip(tooltipEl, {\n        title: 1,\n        content: 7\n      })\n\n      expect(tooltip._config.title).toEqual('1')\n      expect(tooltip._config.content).toEqual('7')\n    })\n\n    it('should enable selector delegation', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<div></div>'\n\n        const containerEl = fixtureEl.querySelector('div')\n        const tooltipContainer = new Tooltip(containerEl, {\n          selector: 'a[rel=\"tooltip\"]',\n          trigger: 'click'\n        })\n\n        containerEl.innerHTML = '<a href=\"#\" rel=\"tooltip\" title=\"Another tooltip\"></a>'\n\n        const tooltipInContainerEl = containerEl.querySelector('a')\n\n        tooltipInContainerEl.addEventListener('shown.bs.tooltip', () => {\n          expect(document.querySelector('.tooltip')).not.toBeNull()\n          tooltipContainer.dispose()\n          resolve()\n        })\n\n        tooltipInContainerEl.click()\n      })\n    })\n\n    it('should create offset modifier when offset is passed as a function', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<a href=\"#\" rel=\"tooltip\" title=\"Offset from function\"></a>'\n\n        const getOffset = jasmine.createSpy('getOffset').and.returnValue([10, 20])\n        const tooltipEl = fixtureEl.querySelector('a')\n        const tooltip = new Tooltip(tooltipEl, {\n          offset: getOffset,\n          popperConfig: {\n            onFirstUpdate(state) {\n              expect(getOffset).toHaveBeenCalledWith({\n                popper: state.rects.popper,\n                reference: state.rects.reference,\n                placement: state.placement\n              }, tooltipEl)\n              resolve()\n            }\n          }\n        })\n\n        const offset = tooltip._getOffset()\n\n        expect(offset).toEqual(jasmine.any(Function))\n\n        tooltip.show()\n      })\n    })\n\n    it('should create offset modifier when offset option is passed in data attribute', () => {\n      fixtureEl.innerHTML = '<a href=\"#\" rel=\"tooltip\" data-bs-offset=\"10,20\" title=\"Another tooltip\"></a>'\n\n      const tooltipEl = fixtureEl.querySelector('a')\n      const tooltip = new Tooltip(tooltipEl)\n\n      expect(tooltip._getOffset()).toEqual([10, 20])\n    })\n\n    it('should allow to pass config to Popper with `popperConfig`', () => {\n      fixtureEl.innerHTML = '<a href=\"#\" rel=\"tooltip\"></a>'\n\n      const tooltipEl = fixtureEl.querySelector('a')\n      const tooltip = new Tooltip(tooltipEl, {\n        popperConfig: {\n          placement: 'left'\n        }\n      })\n\n      const popperConfig = tooltip._getPopperConfig('top')\n\n      expect(popperConfig.placement).toEqual('left')\n    })\n\n    it('should allow to pass config to Popper with `popperConfig` as a function', () => {\n      fixtureEl.innerHTML = '<a href=\"#\" rel=\"tooltip\"></a>'\n\n      const tooltipEl = fixtureEl.querySelector('a')\n      const getPopperConfig = jasmine.createSpy('getPopperConfig').and.returnValue({ placement: 'left' })\n      const tooltip = new Tooltip(tooltipEl, {\n        popperConfig: getPopperConfig\n      })\n\n      const popperConfig = tooltip._getPopperConfig('top')\n\n      // Ensure that the function was called with the default config.\n      expect(getPopperConfig).toHaveBeenCalledWith(jasmine.objectContaining({\n        placement: jasmine.any(String)\n      }))\n      expect(popperConfig.placement).toEqual('left')\n    })\n\n    it('should use original title, if not \"data-bs-title\" is given', () => {\n      fixtureEl.innerHTML = '<a href=\"#\" rel=\"tooltip\" title=\"Another tooltip\"></a>'\n\n      const tooltipEl = fixtureEl.querySelector('a')\n      const tooltip = new Tooltip(tooltipEl)\n\n      expect(tooltip._getTitle()).toEqual('Another tooltip')\n    })\n  })\n\n  describe('enable', () => {\n    it('should enable a tooltip', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<a href=\"#\" rel=\"tooltip\" title=\"Another tooltip\"></a>'\n\n        const tooltipEl = fixtureEl.querySelector('a')\n        const tooltip = new Tooltip(tooltipEl)\n\n        tooltip.enable()\n\n        tooltipEl.addEventListener('shown.bs.tooltip', () => {\n          expect(document.querySelector('.tooltip')).not.toBeNull()\n          resolve()\n        })\n\n        tooltip.show()\n      })\n    })\n  })\n\n  describe('disable', () => {\n    it('should disable tooltip', () => {\n      return new Promise((resolve, reject) => {\n        fixtureEl.innerHTML = '<a href=\"#\" rel=\"tooltip\" title=\"Another tooltip\"></a>'\n\n        const tooltipEl = fixtureEl.querySelector('a')\n        const tooltip = new Tooltip(tooltipEl)\n\n        tooltip.disable()\n\n        tooltipEl.addEventListener('show.bs.tooltip', () => {\n          reject(new Error('should not show a disabled tooltip'))\n        })\n\n        tooltip.show()\n\n        setTimeout(() => {\n          expect().nothing()\n          resolve()\n        }, 10)\n      })\n    })\n  })\n\n  describe('toggleEnabled', () => {\n    it('should toggle enabled', () => {\n      fixtureEl.innerHTML = '<a href=\"#\" rel=\"tooltip\" title=\"Another tooltip\"></a>'\n\n      const tooltipEl = fixtureEl.querySelector('a')\n      const tooltip = new Tooltip(tooltipEl)\n\n      expect(tooltip._isEnabled).toBeTrue()\n\n      tooltip.toggleEnabled()\n\n      expect(tooltip._isEnabled).toBeFalse()\n    })\n  })\n\n  describe('toggle', () => {\n    it('should do nothing if disabled', () => {\n      return new Promise((resolve, reject) => {\n        fixtureEl.innerHTML = '<a href=\"#\" rel=\"tooltip\" title=\"Another tooltip\"></a>'\n\n        const tooltipEl = fixtureEl.querySelector('a')\n        const tooltip = new Tooltip(tooltipEl)\n\n        tooltip.disable()\n\n        tooltipEl.addEventListener('show.bs.tooltip', () => {\n          reject(new Error('should not show a disabled tooltip'))\n        })\n\n        tooltip.toggle()\n\n        setTimeout(() => {\n          expect().nothing()\n          resolve()\n        }, 10)\n      })\n    })\n\n    it('should show a tooltip', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<a href=\"#\" rel=\"tooltip\" title=\"Another tooltip\"></a>'\n\n        const tooltipEl = fixtureEl.querySelector('a')\n        const tooltip = new Tooltip(tooltipEl)\n\n        tooltipEl.addEventListener('shown.bs.tooltip', () => {\n          expect(document.querySelector('.tooltip')).not.toBeNull()\n          resolve()\n        })\n\n        tooltip.toggle()\n      })\n    })\n\n    it('should call toggle and show the tooltip when trigger is \"click\"', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<a href=\"#\" rel=\"tooltip\" title=\"Another tooltip\"></a>'\n\n        const tooltipEl = fixtureEl.querySelector('a')\n        const tooltip = new Tooltip(tooltipEl, {\n          trigger: 'click'\n        })\n\n        const spy = spyOn(tooltip, 'toggle').and.callThrough()\n\n        tooltipEl.addEventListener('shown.bs.tooltip', () => {\n          expect(spy).toHaveBeenCalled()\n          resolve()\n        })\n\n        tooltipEl.click()\n      })\n    })\n\n    it('should hide a tooltip', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<a href=\"#\" rel=\"tooltip\" title=\"Another tooltip\"></a>'\n\n        const tooltipEl = fixtureEl.querySelector('a')\n        const tooltip = new Tooltip(tooltipEl)\n\n        tooltipEl.addEventListener('shown.bs.tooltip', () => {\n          tooltip.toggle()\n        })\n\n        tooltipEl.addEventListener('hidden.bs.tooltip', () => {\n          expect(document.querySelector('.tooltip')).toBeNull()\n          resolve()\n        })\n\n        tooltip.toggle()\n      })\n    })\n\n    it('should call toggle and hide the tooltip when trigger is \"click\"', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<a href=\"#\" rel=\"tooltip\" title=\"Another tooltip\"></a>'\n\n        const tooltipEl = fixtureEl.querySelector('a')\n        const tooltip = new Tooltip(tooltipEl, {\n          trigger: 'click'\n        })\n\n        const spy = spyOn(tooltip, 'toggle').and.callThrough()\n\n        tooltipEl.addEventListener('shown.bs.tooltip', () => {\n          tooltipEl.click()\n        })\n\n        tooltipEl.addEventListener('hidden.bs.tooltip', () => {\n          expect(spy).toHaveBeenCalled()\n          resolve()\n        })\n\n        tooltipEl.click()\n      })\n    })\n  })\n\n  describe('dispose', () => {\n    it('should destroy a tooltip', () => {\n      fixtureEl.innerHTML = '<a href=\"#\" rel=\"tooltip\" title=\"Another tooltip\"></a>'\n\n      const tooltipEl = fixtureEl.querySelector('a')\n      const addEventSpy = spyOn(tooltipEl, 'addEventListener').and.callThrough()\n      const removeEventSpy = spyOn(tooltipEl, 'removeEventListener').and.callThrough()\n\n      const tooltip = new Tooltip(tooltipEl)\n\n      expect(Tooltip.getInstance(tooltipEl)).toEqual(tooltip)\n\n      const expectedArgs = [\n        ['mouseover', jasmine.any(Function), jasmine.any(Boolean)],\n        ['mouseout', jasmine.any(Function), jasmine.any(Boolean)],\n        ['focusin', jasmine.any(Function), jasmine.any(Boolean)],\n        ['focusout', jasmine.any(Function), jasmine.any(Boolean)]\n      ]\n\n      expect(addEventSpy.calls.allArgs()).toEqual(expectedArgs)\n\n      tooltip.dispose()\n\n      expect(Tooltip.getInstance(tooltipEl)).toBeNull()\n      expect(removeEventSpy.calls.allArgs()).toEqual(expectedArgs)\n    })\n\n    it('should destroy a tooltip after it is shown and hidden', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<a href=\"#\" rel=\"tooltip\" title=\"Another tooltip\"></a>'\n\n        const tooltipEl = fixtureEl.querySelector('a')\n        const tooltip = new Tooltip(tooltipEl)\n\n        tooltipEl.addEventListener('shown.bs.tooltip', () => {\n          tooltip.hide()\n        })\n        tooltipEl.addEventListener('hidden.bs.tooltip', () => {\n          tooltip.dispose()\n          expect(tooltip.tip).toBeNull()\n          expect(Tooltip.getInstance(tooltipEl)).toBeNull()\n          resolve()\n        })\n\n        tooltip.show()\n      })\n    })\n\n    it('should destroy a tooltip and remove it from the dom', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<a href=\"#\" rel=\"tooltip\" title=\"Another tooltip\"></a>'\n\n        const tooltipEl = fixtureEl.querySelector('a')\n        const tooltip = new Tooltip(tooltipEl)\n\n        tooltipEl.addEventListener('shown.bs.tooltip', () => {\n          expect(document.querySelector('.tooltip')).not.toBeNull()\n\n          tooltip.dispose()\n\n          expect(document.querySelector('.tooltip')).toBeNull()\n          resolve()\n        })\n\n        tooltip.show()\n      })\n    })\n\n    it('should destroy a tooltip and reset it\\'s initial title', () => {\n      fixtureEl.innerHTML = [\n        '<span id=\"tooltipWithTitle\" rel=\"tooltip\" title=\"tooltipTitle\"></span>',\n        '<span id=\"tooltipWithoutTitle\" rel=\"tooltip\" data-bs-title=\"tooltipTitle\"></span>'\n      ].join('')\n\n      const tooltipWithTitleEl = fixtureEl.querySelector('#tooltipWithTitle')\n      const tooltip = new Tooltip('#tooltipWithTitle')\n      expect(tooltipWithTitleEl.getAttribute('title')).toBeNull()\n      tooltip.dispose()\n      expect(tooltipWithTitleEl.getAttribute('title')).toBe('tooltipTitle')\n\n      const tooltipWithoutTitleEl = fixtureEl.querySelector('#tooltipWithoutTitle')\n      const tooltip2 = new Tooltip('#tooltipWithTitle')\n      expect(tooltipWithoutTitleEl.getAttribute('title')).toBeNull()\n      tooltip2.dispose()\n      expect(tooltipWithoutTitleEl.getAttribute('title')).toBeNull()\n    })\n  })\n\n  describe('show', () => {\n    it('should show a tooltip', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<a href=\"#\" rel=\"tooltip\" title=\"Another tooltip\"></a>'\n\n        const tooltipEl = fixtureEl.querySelector('a')\n        const tooltip = new Tooltip(tooltipEl)\n\n        tooltipEl.addEventListener('shown.bs.tooltip', () => {\n          const tooltipShown = document.querySelector('.tooltip')\n\n          expect(tooltipShown).not.toBeNull()\n          expect(tooltipEl.getAttribute('aria-describedby')).toEqual(tooltipShown.getAttribute('id'))\n          expect(tooltipShown.getAttribute('id')).toContain('tooltip')\n          resolve()\n        })\n\n        tooltip.show()\n      })\n    })\n\n    it('should show a tooltip when hovering a child element', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<a href=\"#\" rel=\"tooltip\" title=\"Another tooltip\">',\n          '  <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"50\" height=\"50\" viewBox=\"0 0 100 100\">',\n          '    <rect width=\"100%\" fill=\"#563d7c\"/>',\n          '    <circle cx=\"50\" cy=\"50\" r=\"30\" fill=\"#fff\"/>',\n          '  </svg>',\n          '</a>'\n        ].join('')\n\n        const tooltipEl = fixtureEl.querySelector('a')\n        const tooltip = new Tooltip(tooltipEl)\n\n        const spy = spyOn(tooltip, 'show')\n\n        tooltipEl.querySelector('rect').dispatchEvent(createEvent('mouseover', { bubbles: true }))\n\n        setTimeout(() => {\n          expect(spy).toHaveBeenCalled()\n          resolve()\n        }, 0)\n      })\n    })\n\n    it('should show a tooltip on mobile', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<a href=\"#\" rel=\"tooltip\" title=\"Another tooltip\"></a>'\n\n        const tooltipEl = fixtureEl.querySelector('a')\n        const tooltip = new Tooltip(tooltipEl)\n        document.documentElement.ontouchstart = noop\n\n        const spy = spyOn(EventHandler, 'on').and.callThrough()\n\n        tooltipEl.addEventListener('shown.bs.tooltip', () => {\n          expect(document.querySelector('.tooltip')).not.toBeNull()\n          expect(spy).toHaveBeenCalledWith(jasmine.any(Object), 'mouseover', noop)\n          document.documentElement.ontouchstart = undefined\n          resolve()\n        })\n\n        tooltip.show()\n      })\n    })\n\n    it('should show a tooltip relative to placement option', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<a href=\"#\" rel=\"tooltip\" title=\"Another tooltip\"></a>'\n\n        const tooltipEl = fixtureEl.querySelector('a')\n        const tooltip = new Tooltip(tooltipEl, {\n          placement: 'bottom'\n        })\n\n        tooltipEl.addEventListener('inserted.bs.tooltip', () => {\n          expect(tooltip._getTipElement()).toHaveClass('bs-tooltip-auto')\n        })\n\n        tooltipEl.addEventListener('shown.bs.tooltip', () => {\n          expect(tooltip._getTipElement()).toHaveClass('bs-tooltip-auto')\n          expect(tooltip._getTipElement().getAttribute('data-popper-placement')).toEqual('bottom')\n          resolve()\n        })\n\n        tooltip.show()\n      })\n    })\n\n    it('should not error when trying to show a tooltip that has been removed from the dom', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<a href=\"#\" rel=\"tooltip\" title=\"Another tooltip\"></a>'\n\n        const tooltipEl = fixtureEl.querySelector('a')\n        const tooltip = new Tooltip(tooltipEl)\n\n        const firstCallback = () => {\n          tooltipEl.removeEventListener('shown.bs.tooltip', firstCallback)\n          let tooltipShown = document.querySelector('.tooltip')\n\n          tooltipShown.remove()\n\n          tooltipEl.addEventListener('shown.bs.tooltip', () => {\n            tooltipShown = document.querySelector('.tooltip')\n\n            expect(tooltipShown).not.toBeNull()\n            resolve()\n          })\n\n          tooltip.show()\n        }\n\n        tooltipEl.addEventListener('shown.bs.tooltip', firstCallback)\n\n        tooltip.show()\n      })\n    })\n\n    it('should show a tooltip with a dom element container', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<a href=\"#\" rel=\"tooltip\" title=\"Another tooltip\"></a>'\n\n        const tooltipEl = fixtureEl.querySelector('a')\n        const tooltip = new Tooltip(tooltipEl, {\n          container: fixtureEl\n        })\n\n        tooltipEl.addEventListener('shown.bs.tooltip', () => {\n          expect(fixtureEl.querySelector('.tooltip')).not.toBeNull()\n          resolve()\n        })\n\n        tooltip.show()\n      })\n    })\n\n    it('should show a tooltip with a jquery element container', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<a href=\"#\" rel=\"tooltip\" title=\"Another tooltip\"></a>'\n\n        const tooltipEl = fixtureEl.querySelector('a')\n        const tooltip = new Tooltip(tooltipEl, {\n          container: {\n            0: fixtureEl,\n            jquery: 'jQuery'\n          }\n        })\n\n        tooltipEl.addEventListener('shown.bs.tooltip', () => {\n          expect(fixtureEl.querySelector('.tooltip')).not.toBeNull()\n          resolve()\n        })\n\n        tooltip.show()\n      })\n    })\n\n    it('should show a tooltip with a selector in container', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<a href=\"#\" rel=\"tooltip\" title=\"Another tooltip\"></a>'\n\n        const tooltipEl = fixtureEl.querySelector('a')\n        const tooltip = new Tooltip(tooltipEl, {\n          container: '#fixture'\n        })\n\n        tooltipEl.addEventListener('shown.bs.tooltip', () => {\n          expect(fixtureEl.querySelector('.tooltip')).not.toBeNull()\n          resolve()\n        })\n\n        tooltip.show()\n      })\n    })\n\n    it('should show a tooltip with placement as a function', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<a href=\"#\" rel=\"tooltip\" title=\"Another tooltip\"></a>'\n\n        const spy = jasmine.createSpy('placement').and.returnValue('top')\n        const tooltipEl = fixtureEl.querySelector('a')\n        const tooltip = new Tooltip(tooltipEl, {\n          placement: spy\n        })\n\n        tooltipEl.addEventListener('shown.bs.tooltip', () => {\n          expect(document.querySelector('.tooltip')).not.toBeNull()\n          expect(spy).toHaveBeenCalled()\n          resolve()\n        })\n\n        tooltip.show()\n      })\n    })\n\n    it('should show a tooltip without the animation', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<a href=\"#\" rel=\"tooltip\" title=\"Another tooltip\"></a>'\n\n        const tooltipEl = fixtureEl.querySelector('a')\n        const tooltip = new Tooltip(tooltipEl, {\n          animation: false\n        })\n\n        tooltipEl.addEventListener('shown.bs.tooltip', () => {\n          const tip = document.querySelector('.tooltip')\n\n          expect(tip).not.toBeNull()\n          expect(tip).not.toHaveClass('fade')\n          resolve()\n        })\n\n        tooltip.show()\n      })\n    })\n\n    it('should throw an error the element is not visible', () => {\n      fixtureEl.innerHTML = '<a href=\"#\" style=\"display: none\" rel=\"tooltip\" title=\"Another tooltip\"></a>'\n\n      const tooltipEl = fixtureEl.querySelector('a')\n      const tooltip = new Tooltip(tooltipEl)\n\n      try {\n        tooltip.show()\n      } catch (error) {\n        expect(error.message).toEqual('Please use show on visible elements')\n      }\n    })\n\n    it('should not show a tooltip if show.bs.tooltip is prevented', () => {\n      return new Promise((resolve, reject) => {\n        fixtureEl.innerHTML = '<a href=\"#\" rel=\"tooltip\" title=\"Another tooltip\"></a>'\n\n        const tooltipEl = fixtureEl.querySelector('a')\n        const tooltip = new Tooltip(tooltipEl)\n\n        const expectedDone = () => {\n          setTimeout(() => {\n            expect(document.querySelector('.tooltip')).toBeNull()\n            resolve()\n          }, 10)\n        }\n\n        tooltipEl.addEventListener('show.bs.tooltip', ev => {\n          ev.preventDefault()\n          expectedDone()\n        })\n\n        tooltipEl.addEventListener('shown.bs.tooltip', () => {\n          reject(new Error('Tooltip should not be shown'))\n        })\n\n        tooltip.show()\n      })\n    })\n\n    it('should show tooltip if leave event hasn\\'t occurred before delay expires', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<a href=\"#\" rel=\"tooltip\" title=\"Another tooltip\"></a>'\n\n        const tooltipEl = fixtureEl.querySelector('a')\n        const tooltip = new Tooltip(tooltipEl, {\n          delay: 150\n        })\n\n        const spy = spyOn(tooltip, 'show')\n\n        setTimeout(() => {\n          expect(spy).not.toHaveBeenCalled()\n        }, 100)\n\n        setTimeout(() => {\n          expect(spy).toHaveBeenCalled()\n          resolve()\n        }, 200)\n\n        tooltipEl.dispatchEvent(createEvent('mouseover'))\n      })\n    })\n\n    it('should not show tooltip if leave event occurs before delay expires', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<a href=\"#\" rel=\"tooltip\" title=\"Another tooltip\"></a>'\n\n        const tooltipEl = fixtureEl.querySelector('a')\n        const tooltip = new Tooltip(tooltipEl, {\n          delay: 150\n        })\n\n        const spy = spyOn(tooltip, 'show')\n\n        setTimeout(() => {\n          expect(spy).not.toHaveBeenCalled()\n          tooltipEl.dispatchEvent(createEvent('mouseover'))\n        }, 100)\n\n        setTimeout(() => {\n          expect(spy).toHaveBeenCalled()\n          expect(document.querySelectorAll('.tooltip')).toHaveSize(0)\n          resolve()\n        }, 200)\n\n        tooltipEl.dispatchEvent(createEvent('mouseover'))\n      })\n    })\n\n    it('should not hide tooltip if leave event occurs and enter event occurs within the hide delay', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<a href=\"#\" rel=\"tooltip\" title=\"Another tooltip\" data-bs-delay=\\'{\"show\":0,\"hide\":150}\\'>'\n\n        const tooltipEl = fixtureEl.querySelector('a')\n        const tooltip = new Tooltip(tooltipEl)\n\n        expect(tooltip._config.delay).toEqual({ show: 0, hide: 150 })\n\n        setTimeout(() => {\n          expect(tooltip._getTipElement()).toHaveClass('show')\n          tooltipEl.dispatchEvent(createEvent('mouseout'))\n\n          setTimeout(() => {\n            expect(tooltip._getTipElement()).toHaveClass('show')\n            tooltipEl.dispatchEvent(createEvent('mouseover'))\n          }, 100)\n\n          setTimeout(() => {\n            expect(tooltip._getTipElement()).toHaveClass('show')\n            expect(document.querySelectorAll('.tooltip')).toHaveSize(1)\n            resolve()\n          }, 200)\n        }, 10)\n\n        tooltipEl.dispatchEvent(createEvent('mouseover'))\n      })\n    })\n\n    it('should not hide tooltip if leave event occurs and interaction remains inside trigger', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<a href=\"#\" rel=\"tooltip\" title=\"Another tooltip\">',\n          '<b>Trigger</b>',\n          'the tooltip',\n          '</a>'\n        ].join('')\n\n        const tooltipEl = fixtureEl.querySelector('a')\n        const tooltip = new Tooltip(tooltipEl)\n        const triggerChild = tooltipEl.querySelector('b')\n\n        const spy = spyOn(tooltip, 'hide').and.callThrough()\n\n        tooltipEl.addEventListener('mouseover', () => {\n          const moveMouseToChildEvent = createEvent('mouseout')\n          Object.defineProperty(moveMouseToChildEvent, 'relatedTarget', {\n            value: triggerChild\n          })\n\n          tooltipEl.dispatchEvent(moveMouseToChildEvent)\n        })\n\n        tooltipEl.addEventListener('mouseout', () => {\n          expect(spy).not.toHaveBeenCalled()\n          resolve()\n        })\n\n        tooltipEl.dispatchEvent(createEvent('mouseover'))\n      })\n    })\n\n    it('should properly maintain tooltip state if leave event occurs and enter event occurs during hide transition', () => {\n      return new Promise(resolve => {\n        // Style this tooltip to give it plenty of room for popper to do what it wants\n        fixtureEl.innerHTML = '<a href=\"#\" rel=\"tooltip\" title=\"Another tooltip\" data-bs-placement=\"top\" style=\"position:fixed;left:50%;top:50%;\">Trigger</a>'\n\n        const tooltipEl = fixtureEl.querySelector('a')\n        const tooltip = new Tooltip(tooltipEl)\n\n        spyOn(window, 'getComputedStyle').and.returnValue({\n          transitionDuration: '0.15s',\n          transitionDelay: '0s'\n        })\n\n        setTimeout(() => {\n          expect(tooltip._popper).not.toBeNull()\n          expect(tooltip._getTipElement().getAttribute('data-popper-placement')).toEqual('top')\n          tooltipEl.dispatchEvent(createEvent('mouseout'))\n\n          setTimeout(() => {\n            expect(tooltip._getTipElement()).not.toHaveClass('show')\n            tooltipEl.dispatchEvent(createEvent('mouseover'))\n          }, 100)\n\n          setTimeout(() => {\n            expect(tooltip._popper).not.toBeNull()\n            expect(tooltip._getTipElement().getAttribute('data-popper-placement')).toEqual('top')\n            resolve()\n          }, 200)\n        }, 10)\n\n        tooltipEl.dispatchEvent(createEvent('mouseover'))\n      })\n    })\n\n    it('should only trigger inserted event if a new tooltip element was created', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<a href=\"#\" rel=\"tooltip\" title=\"Another tooltip\"></a>'\n\n        const tooltipEl = fixtureEl.querySelector('a')\n        const tooltip = new Tooltip(tooltipEl)\n\n        spyOn(window, 'getComputedStyle').and.returnValue({\n          transitionDuration: '0.15s',\n          transitionDelay: '0s'\n        })\n\n        const insertedFunc = jasmine.createSpy()\n        tooltipEl.addEventListener('inserted.bs.tooltip', insertedFunc)\n\n        setTimeout(() => {\n          expect(insertedFunc).toHaveBeenCalledTimes(1)\n          tooltip.hide()\n\n          setTimeout(() => {\n            tooltip.show()\n          }, 100)\n\n          setTimeout(() => {\n            expect(insertedFunc).toHaveBeenCalledTimes(2)\n            resolve()\n          }, 200)\n        }, 0)\n\n        tooltip.show()\n      })\n    })\n\n    it('should show a tooltip with custom class provided in data attributes', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<a href=\"#\" rel=\"tooltip\" title=\"Another tooltip\" data-bs-custom-class=\"custom-class\"></a>'\n\n        const tooltipEl = fixtureEl.querySelector('a')\n        const tooltip = new Tooltip(tooltipEl)\n\n        tooltipEl.addEventListener('shown.bs.tooltip', () => {\n          const tip = document.querySelector('.tooltip')\n          expect(tip).not.toBeNull()\n          expect(tip).toHaveClass('custom-class')\n          resolve()\n        })\n\n        tooltip.show()\n      })\n    })\n\n    it('should show a tooltip with custom class provided as a string in config', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<a href=\"#\" rel=\"tooltip\" title=\"Another tooltip\"></a>'\n\n        const tooltipEl = fixtureEl.querySelector('a')\n        const tooltip = new Tooltip(tooltipEl, {\n          customClass: 'custom-class custom-class-2'\n        })\n\n        tooltipEl.addEventListener('shown.bs.tooltip', () => {\n          const tip = document.querySelector('.tooltip')\n          expect(tip).not.toBeNull()\n          expect(tip).toHaveClass('custom-class')\n          expect(tip).toHaveClass('custom-class-2')\n          resolve()\n        })\n\n        tooltip.show()\n      })\n    })\n\n    it('should show a tooltip with custom class provided as a function in config', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<a href=\"#\" rel=\"tooltip\" title=\"Another tooltip\" data-class-a=\"custom-class-a\" data-class-b=\"custom-class-b\"></a>'\n\n        const tooltipEl = fixtureEl.querySelector('a')\n        const spy = jasmine.createSpy('customClass').and.callFake(function (el) {\n          return `${el.dataset.classA} ${this.dataset.classB}`\n        })\n        const tooltip = new Tooltip(tooltipEl, {\n          customClass: spy\n        })\n\n        tooltipEl.addEventListener('shown.bs.tooltip', () => {\n          const tip = document.querySelector('.tooltip')\n          expect(tip).not.toBeNull()\n          expect(spy).toHaveBeenCalled()\n          expect(tip).toHaveClass('custom-class-a')\n          expect(tip).toHaveClass('custom-class-b')\n          resolve()\n        })\n\n        tooltip.show()\n      })\n    })\n\n    it('should remove `title` attribute if exists', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<a href=\"#\" rel=\"tooltip\" title=\"Another tooltip\"></a>'\n\n        const tooltipEl = fixtureEl.querySelector('a')\n        const tooltip = new Tooltip(tooltipEl)\n\n        tooltipEl.addEventListener('shown.bs.tooltip', () => {\n          expect(tooltipEl.getAttribute('title')).toBeNull()\n          resolve()\n        })\n        tooltip.show()\n      })\n    })\n  })\n\n  describe('hide', () => {\n    it('should hide a tooltip', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<a href=\"#\" rel=\"tooltip\" title=\"Another tooltip\"></a>'\n\n        const tooltipEl = fixtureEl.querySelector('a')\n        const tooltip = new Tooltip(tooltipEl)\n\n        tooltipEl.addEventListener('shown.bs.tooltip', () => tooltip.hide())\n        tooltipEl.addEventListener('hidden.bs.tooltip', () => {\n          expect(document.querySelector('.tooltip')).toBeNull()\n          expect(tooltipEl.getAttribute('aria-describedby')).toBeNull()\n          resolve()\n        })\n\n        tooltip.show()\n      })\n    })\n\n    it('should hide a tooltip on mobile', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<a href=\"#\" rel=\"tooltip\" title=\"Another tooltip\"></a>'\n\n        const tooltipEl = fixtureEl.querySelector('a')\n        const tooltip = new Tooltip(tooltipEl)\n        const spy = spyOn(EventHandler, 'off')\n\n        tooltipEl.addEventListener('shown.bs.tooltip', () => {\n          document.documentElement.ontouchstart = noop\n          tooltip.hide()\n        })\n\n        tooltipEl.addEventListener('hidden.bs.tooltip', () => {\n          expect(document.querySelector('.tooltip')).toBeNull()\n          expect(spy).toHaveBeenCalledWith(jasmine.any(Object), 'mouseover', noop)\n          document.documentElement.ontouchstart = undefined\n          resolve()\n        })\n\n        tooltip.show()\n      })\n    })\n\n    it('should hide a tooltip without animation', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<a href=\"#\" rel=\"tooltip\" title=\"Another tooltip\"></a>'\n\n        const tooltipEl = fixtureEl.querySelector('a')\n        const tooltip = new Tooltip(tooltipEl, {\n          animation: false\n        })\n\n        tooltipEl.addEventListener('shown.bs.tooltip', () => tooltip.hide())\n        tooltipEl.addEventListener('hidden.bs.tooltip', () => {\n          expect(document.querySelector('.tooltip')).toBeNull()\n          expect(tooltipEl.getAttribute('aria-describedby')).toBeNull()\n          resolve()\n        })\n\n        tooltip.show()\n      })\n    })\n\n    it('should not hide a tooltip if hide event is prevented', () => {\n      return new Promise((resolve, reject) => {\n        fixtureEl.innerHTML = '<a href=\"#\" rel=\"tooltip\" title=\"Another tooltip\"></a>'\n\n        const assertDone = () => {\n          setTimeout(() => {\n            expect(document.querySelector('.tooltip')).not.toBeNull()\n            resolve()\n          }, 20)\n        }\n\n        const tooltipEl = fixtureEl.querySelector('a')\n        const tooltip = new Tooltip(tooltipEl, {\n          animation: false\n        })\n\n        tooltipEl.addEventListener('shown.bs.tooltip', () => tooltip.hide())\n        tooltipEl.addEventListener('hide.bs.tooltip', event => {\n          event.preventDefault()\n          assertDone()\n        })\n        tooltipEl.addEventListener('hidden.bs.tooltip', () => {\n          reject(new Error('should not trigger hidden event'))\n        })\n\n        tooltip.show()\n      })\n    })\n\n    it('should not throw error running hide if popper hasn\\'t been shown', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n      const tooltip = new Tooltip(div)\n\n      try {\n        tooltip.hide()\n        expect().nothing()\n      } catch {\n        throw new Error('should not throw error')\n      }\n    })\n  })\n\n  describe('update', () => {\n    it('should call popper update', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<a href=\"#\" rel=\"tooltip\" title=\"Another tooltip\"></a>'\n\n        const tooltipEl = fixtureEl.querySelector('a')\n        const tooltip = new Tooltip(tooltipEl)\n\n        tooltipEl.addEventListener('shown.bs.tooltip', () => {\n          const spy = spyOn(tooltip._popper, 'update')\n\n          tooltip.update()\n\n          expect(spy).toHaveBeenCalled()\n          resolve()\n        })\n\n        tooltip.show()\n      })\n    })\n\n    it('should do nothing if the tooltip is not shown', () => {\n      fixtureEl.innerHTML = '<a href=\"#\" rel=\"tooltip\" title=\"Another tooltip\"></a>'\n\n      const tooltipEl = fixtureEl.querySelector('a')\n      const tooltip = new Tooltip(tooltipEl)\n\n      tooltip.update()\n      expect().nothing()\n    })\n  })\n\n  describe('_isWithContent', () => {\n    it('should return true if there is content', () => {\n      fixtureEl.innerHTML = '<a href=\"#\" rel=\"tooltip\" title=\"Another tooltip\"></a>'\n\n      const tooltipEl = fixtureEl.querySelector('a')\n      const tooltip = new Tooltip(tooltipEl)\n\n      expect(tooltip._isWithContent()).toBeTrue()\n    })\n\n    it('should return false if there is no content', () => {\n      fixtureEl.innerHTML = '<a href=\"#\" rel=\"tooltip\" title=\"\"></a>'\n\n      const tooltipEl = fixtureEl.querySelector('a')\n      const tooltip = new Tooltip(tooltipEl)\n\n      expect(tooltip._isWithContent()).toBeFalse()\n    })\n  })\n\n  describe('_getTipElement', () => {\n    it('should create the tip element and return it', () => {\n      fixtureEl.innerHTML = '<a href=\"#\" rel=\"tooltip\" title=\"Another tooltip\"></a>'\n\n      const tooltipEl = fixtureEl.querySelector('a')\n      const tooltip = new Tooltip(tooltipEl)\n\n      const spy = spyOn(document, 'createElement').and.callThrough()\n\n      expect(tooltip._getTipElement()).toBeDefined()\n      expect(spy).toHaveBeenCalled()\n    })\n\n    it('should return the created tip element', () => {\n      fixtureEl.innerHTML = '<a href=\"#\" rel=\"tooltip\" title=\"Another tooltip\"></a>'\n\n      const tooltipEl = fixtureEl.querySelector('a')\n      const tooltip = new Tooltip(tooltipEl)\n\n      const spy = spyOn(document, 'createElement').and.callThrough()\n\n      expect(tooltip._getTipElement()).toBeDefined()\n      expect(spy).toHaveBeenCalled()\n\n      spy.calls.reset()\n\n      expect(tooltip._getTipElement()).toBeDefined()\n      expect(spy).not.toHaveBeenCalled()\n    })\n  })\n\n  describe('setContent', () => {\n    it('should set tip content', () => {\n      fixtureEl.innerHTML = '<a href=\"#\" rel=\"tooltip\" title=\"Another tooltip\"></a>'\n\n      const tooltipEl = fixtureEl.querySelector('a')\n      const tooltip = new Tooltip(tooltipEl, { animation: false })\n\n      const tip = tooltip._getTipElement()\n\n      tooltip.setContent(tip)\n\n      expect(tip).not.toHaveClass('show')\n      expect(tip).not.toHaveClass('fade')\n      expect(tip.querySelector('.tooltip-inner').textContent).toEqual('Another tooltip')\n    })\n\n    it('should re-show tip if it was already shown', () => {\n      fixtureEl.innerHTML = '<a href=\"#\" rel=\"tooltip\" data-bs-title=\"Another tooltip\"></a>'\n\n      const tooltipEl = fixtureEl.querySelector('a')\n      const tooltip = new Tooltip(tooltipEl)\n      tooltip.show()\n      const tip = () => tooltip._getTipElement()\n\n      expect(tip()).toHaveClass('show')\n      tooltip.setContent({ '.tooltip-inner': 'foo' })\n\n      expect(tip()).toHaveClass('show')\n      expect(tip().querySelector('.tooltip-inner').textContent).toEqual('foo')\n    })\n\n    it('should keep tip hidden, if it was already hidden before', () => {\n      fixtureEl.innerHTML = '<a href=\"#\" rel=\"tooltip\" data-bs-title=\"Another tooltip\"></a>'\n\n      const tooltipEl = fixtureEl.querySelector('a')\n      const tooltip = new Tooltip(tooltipEl)\n      const tip = () => tooltip._getTipElement()\n\n      expect(tip()).not.toHaveClass('show')\n      tooltip.setContent({ '.tooltip-inner': 'foo' })\n\n      expect(tip()).not.toHaveClass('show')\n      tooltip.show()\n      expect(tip().querySelector('.tooltip-inner').textContent).toEqual('foo')\n    })\n\n    it('\"setContent\" should keep the initial template', () => {\n      fixtureEl.innerHTML = '<a href=\"#\" rel=\"tooltip\" title=\"Another tooltip\"></a>'\n\n      const tooltipEl = fixtureEl.querySelector('a')\n      const tooltip = new Tooltip(tooltipEl)\n\n      tooltip.setContent({ '.tooltip-inner': 'foo' })\n      const tip = tooltip._getTipElement()\n\n      expect(tip).toHaveClass('tooltip')\n      expect(tip).toHaveClass('bs-tooltip-auto')\n      expect(tip.querySelector('.tooltip-arrow')).not.toBeNull()\n      expect(tip.querySelector('.tooltip-inner')).not.toBeNull()\n    })\n  })\n\n  describe('setContent', () => {\n    it('should do nothing if the element is null', () => {\n      fixtureEl.innerHTML = '<a href=\"#\" rel=\"tooltip\" title=\"Another tooltip\"></a>'\n\n      const tooltipEl = fixtureEl.querySelector('a')\n      const tooltip = new Tooltip(tooltipEl)\n\n      tooltip.setContent({ '.tooltip': null })\n      expect().nothing()\n    })\n\n    it('should do nothing if the content is a child of the element', () => {\n      fixtureEl.innerHTML = [\n        '<a href=\"#\" rel=\"tooltip\" title=\"Another tooltip\">',\n        '  <div id=\"childContent\"></div>',\n        '</a>'\n      ].join('')\n\n      const tooltipEl = fixtureEl.querySelector('a')\n      const childContent = fixtureEl.querySelector('div')\n      const tooltip = new Tooltip(tooltipEl, {\n        html: true\n      })\n\n      tooltip._getTipElement().append(childContent)\n      tooltip.setContent({ '.tooltip': childContent })\n\n      expect().nothing()\n    })\n\n    it('should add the content as a child of the element for jQuery elements', () => {\n      fixtureEl.innerHTML = [\n        '<a href=\"#\" rel=\"tooltip\" title=\"Another tooltip\">',\n        '  <div id=\"childContent\"></div>',\n        '</a>'\n      ].join('')\n\n      const tooltipEl = fixtureEl.querySelector('a')\n      const childContent = fixtureEl.querySelector('div')\n      const tooltip = new Tooltip(tooltipEl, {\n        html: true\n      })\n\n      tooltip.setContent({ '.tooltip': { 0: childContent, jquery: 'jQuery' } })\n      tooltip.show()\n\n      expect(childContent.parentNode).toEqual(tooltip._getTipElement())\n    })\n\n    it('should add the child text content in the element', () => {\n      fixtureEl.innerHTML = [\n        '<a href=\"#\" rel=\"tooltip\" title=\"Another tooltip\">',\n        '  <div id=\"childContent\">Tooltip</div>',\n        '</a>'\n      ].join('')\n\n      const tooltipEl = fixtureEl.querySelector('a')\n      const childContent = fixtureEl.querySelector('div')\n      const tooltip = new Tooltip(tooltipEl)\n\n      tooltip.setContent({ '.tooltip': childContent })\n\n      expect(childContent.textContent).toEqual(tooltip._getTipElement().textContent)\n    })\n\n    it('should add html without sanitize it', () => {\n      fixtureEl.innerHTML = '<a href=\"#\" rel=\"tooltip\" title=\"Another tooltip\"></a>'\n\n      const tooltipEl = fixtureEl.querySelector('a')\n      const tooltip = new Tooltip(tooltipEl, {\n        sanitize: false,\n        html: true\n      })\n\n      tooltip.setContent({ '.tooltip': '<div id=\"childContent\">Tooltip</div>' })\n\n      expect(tooltip._getTipElement().querySelector('div').id).toEqual('childContent')\n    })\n\n    it('should add html sanitized', () => {\n      fixtureEl.innerHTML = '<a href=\"#\" rel=\"tooltip\" title=\"Another tooltip\"></a>'\n\n      const tooltipEl = fixtureEl.querySelector('a')\n      const tooltip = new Tooltip(tooltipEl, {\n        html: true\n      })\n\n      const content = [\n        '<div id=\"childContent\">',\n        '  <button type=\"button\">test btn</button>',\n        '</div>'\n      ].join('')\n\n      tooltip.setContent({ '.tooltip': content })\n      expect(tooltip._getTipElement().querySelector('div').id).toEqual('childContent')\n      expect(tooltip._getTipElement().querySelector('button')).toBeNull()\n    })\n\n    it('should add text content', () => {\n      fixtureEl.innerHTML = '<a href=\"#\" rel=\"tooltip\" title=\"Another tooltip\"></a>'\n\n      const tooltipEl = fixtureEl.querySelector('a')\n      const tooltip = new Tooltip(tooltipEl)\n\n      tooltip.setContent({ '.tooltip': 'test' })\n\n      expect(tooltip._getTipElement().textContent).toEqual('test')\n    })\n  })\n\n  describe('_getTitle', () => {\n    it('should return the title', () => {\n      fixtureEl.innerHTML = '<a href=\"#\" rel=\"tooltip\" title=\"Another tooltip\"></a>'\n\n      const tooltipEl = fixtureEl.querySelector('a')\n      const tooltip = new Tooltip(tooltipEl)\n\n      expect(tooltip._getTitle()).toEqual('Another tooltip')\n    })\n\n    it('should call title function', () => {\n      fixtureEl.innerHTML = '<a href=\"#\" rel=\"tooltip\"></a>'\n\n      const tooltipEl = fixtureEl.querySelector('a')\n      const tooltip = new Tooltip(tooltipEl, {\n        title: () => 'test'\n      })\n\n      expect(tooltip._getTitle()).toEqual('test')\n    })\n\n    it('should call title function with trigger element', () => {\n      fixtureEl.innerHTML = '<a href=\"#\" rel=\"tooltip\" data-foo=\"bar\"></a>'\n\n      const tooltipEl = fixtureEl.querySelector('a')\n      const tooltip = new Tooltip(tooltipEl, {\n        title(el) {\n          return el.dataset.foo\n        }\n      })\n\n      expect(tooltip._getTitle()).toEqual('bar')\n    })\n\n    it('should call title function with correct this value', () => {\n      fixtureEl.innerHTML = '<a href=\"#\" rel=\"tooltip\" data-foo=\"bar\"></a>'\n\n      const tooltipEl = fixtureEl.querySelector('a')\n      const tooltip = new Tooltip(tooltipEl, {\n        title() {\n          return this.dataset.foo\n        }\n      })\n\n      expect(tooltip._getTitle()).toEqual('bar')\n    })\n  })\n\n  describe('getInstance', () => {\n    it('should return tooltip instance', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n      const alert = new Tooltip(div)\n\n      expect(Tooltip.getInstance(div)).toEqual(alert)\n      expect(Tooltip.getInstance(div)).toBeInstanceOf(Tooltip)\n    })\n\n    it('should return null when there is no tooltip instance', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n\n      expect(Tooltip.getInstance(div)).toBeNull()\n    })\n  })\n\n  describe('aria-label', () => {\n    it('should add the aria-label attribute for referencing original title', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<a href=\"#\" rel=\"tooltip\" title=\"Another tooltip\"></a>'\n\n        const tooltipEl = fixtureEl.querySelector('a')\n        const tooltip = new Tooltip(tooltipEl)\n\n        tooltipEl.addEventListener('shown.bs.tooltip', () => {\n          const tooltipShown = document.querySelector('.tooltip')\n\n          expect(tooltipShown).not.toBeNull()\n          expect(tooltipEl.getAttribute('aria-label')).toEqual('Another tooltip')\n          resolve()\n        })\n\n        tooltip.show()\n      })\n    })\n\n    it('should add the aria-label attribute when element text content is a whitespace string', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<a href=\"#\" rel=\"tooltip\" title=\"A tooltip\"><span>    </span></a>'\n\n        const tooltipEl = fixtureEl.querySelector('a')\n        const tooltip = new Tooltip(tooltipEl)\n\n        tooltipEl.addEventListener('shown.bs.tooltip', () => {\n          const tooltipShown = document.querySelector('.tooltip')\n\n          expect(tooltipShown).not.toBeNull()\n          expect(tooltipEl.getAttribute('aria-label')).toEqual('A tooltip')\n          resolve()\n        })\n\n        tooltip.show()\n      })\n    })\n\n    it('should not add the aria-label attribute if the attribute already exists', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<a href=\"#\" rel=\"tooltip\" aria-label=\"Different label\" title=\"Another tooltip\"></a>'\n\n        const tooltipEl = fixtureEl.querySelector('a')\n        const tooltip = new Tooltip(tooltipEl)\n\n        tooltipEl.addEventListener('shown.bs.tooltip', () => {\n          const tooltipShown = document.querySelector('.tooltip')\n\n          expect(tooltipShown).not.toBeNull()\n          expect(tooltipEl.getAttribute('aria-label')).toEqual('Different label')\n          resolve()\n        })\n\n        tooltip.show()\n      })\n    })\n\n    it('should not add the aria-label attribute if the element has text content', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<a href=\"#\" rel=\"tooltip\" title=\"Another tooltip\">text content</a>'\n\n        const tooltipEl = fixtureEl.querySelector('a')\n        const tooltip = new Tooltip(tooltipEl)\n\n        tooltipEl.addEventListener('shown.bs.tooltip', () => {\n          const tooltipShown = document.querySelector('.tooltip')\n\n          expect(tooltipShown).not.toBeNull()\n          expect(tooltipEl.getAttribute('aria-label')).toBeNull()\n          resolve()\n        })\n\n        tooltip.show()\n      })\n    })\n  })\n\n  describe('getOrCreateInstance', () => {\n    it('should return tooltip instance', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n      const tooltip = new Tooltip(div)\n\n      expect(Tooltip.getOrCreateInstance(div)).toEqual(tooltip)\n      expect(Tooltip.getInstance(div)).toEqual(Tooltip.getOrCreateInstance(div, {}))\n      expect(Tooltip.getOrCreateInstance(div)).toBeInstanceOf(Tooltip)\n    })\n\n    it('should return new instance when there is no tooltip instance', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n\n      expect(Tooltip.getInstance(div)).toBeNull()\n      expect(Tooltip.getOrCreateInstance(div)).toBeInstanceOf(Tooltip)\n    })\n\n    it('should return new instance when there is no tooltip instance with given configuration', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n\n      expect(Tooltip.getInstance(div)).toBeNull()\n      const tooltip = Tooltip.getOrCreateInstance(div, {\n        title: () => 'test'\n      })\n      expect(tooltip).toBeInstanceOf(Tooltip)\n\n      expect(tooltip._getTitle()).toEqual('test')\n    })\n\n    it('should return the instance when exists without given configuration', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n      const tooltip = new Tooltip(div, {\n        title: () => 'nothing'\n      })\n      expect(Tooltip.getInstance(div)).toEqual(tooltip)\n\n      const tooltip2 = Tooltip.getOrCreateInstance(div, {\n        title: () => 'test'\n      })\n      expect(tooltip).toBeInstanceOf(Tooltip)\n      expect(tooltip2).toEqual(tooltip)\n\n      expect(tooltip2._getTitle()).toEqual('nothing')\n    })\n  })\n\n  describe('jQueryInterface', () => {\n    it('should create a tooltip', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n\n      jQueryMock.fn.tooltip = Tooltip.jQueryInterface\n      jQueryMock.elements = [div]\n\n      jQueryMock.fn.tooltip.call(jQueryMock)\n\n      expect(Tooltip.getInstance(div)).not.toBeNull()\n    })\n\n    it('should not re create a tooltip', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n      const tooltip = new Tooltip(div)\n\n      jQueryMock.fn.tooltip = Tooltip.jQueryInterface\n      jQueryMock.elements = [div]\n\n      jQueryMock.fn.tooltip.call(jQueryMock)\n\n      expect(Tooltip.getInstance(div)).toEqual(tooltip)\n    })\n\n    it('should call a tooltip method', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n      const tooltip = new Tooltip(div)\n\n      const spy = spyOn(tooltip, 'show')\n\n      jQueryMock.fn.tooltip = Tooltip.jQueryInterface\n      jQueryMock.elements = [div]\n\n      jQueryMock.fn.tooltip.call(jQueryMock, 'show')\n\n      expect(Tooltip.getInstance(div)).toEqual(tooltip)\n      expect(spy).toHaveBeenCalled()\n    })\n\n    it('should throw error on undefined method', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n      const action = 'undefinedMethod'\n\n      jQueryMock.fn.tooltip = Tooltip.jQueryInterface\n      jQueryMock.elements = [div]\n\n      expect(() => {\n        jQueryMock.fn.tooltip.call(jQueryMock, action)\n      }).toThrowError(TypeError, `No method named \"${action}\"`)\n    })\n  })\n})\n"
  },
  {
    "path": "js/tests/unit/util/backdrop.spec.js",
    "content": "import Backdrop from '../../../src/util/backdrop.js'\nimport { getTransitionDurationFromElement } from '../../../src/util/index.js'\nimport { clearFixture, getFixture } from '../../helpers/fixture.js'\n\nconst CLASS_BACKDROP = '.modal-backdrop'\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\n\ndescribe('Backdrop', () => {\n  let fixtureEl\n\n  beforeAll(() => {\n    fixtureEl = getFixture()\n  })\n\n  afterEach(() => {\n    clearFixture()\n    const list = document.querySelectorAll(CLASS_BACKDROP)\n\n    for (const el of list) {\n      el.remove()\n    }\n  })\n\n  describe('show', () => {\n    it('should append the backdrop html once on show and include the \"show\" class if it is \"shown\"', () => {\n      return new Promise(resolve => {\n        const instance = new Backdrop({\n          isVisible: true,\n          isAnimated: false\n        })\n        const getElements = () => document.querySelectorAll(CLASS_BACKDROP)\n\n        expect(getElements()).toHaveSize(0)\n\n        instance.show()\n        instance.show(() => {\n          expect(getElements()).toHaveSize(1)\n          for (const el of getElements()) {\n            expect(el).toHaveClass(CLASS_NAME_SHOW)\n          }\n\n          resolve()\n        })\n      })\n    })\n\n    it('should not append the backdrop html if it is not \"shown\"', () => {\n      return new Promise(resolve => {\n        const instance = new Backdrop({\n          isVisible: false,\n          isAnimated: true\n        })\n        const getElements = () => document.querySelectorAll(CLASS_BACKDROP)\n\n        expect(getElements()).toHaveSize(0)\n        instance.show(() => {\n          expect(getElements()).toHaveSize(0)\n          resolve()\n        })\n      })\n    })\n\n    it('should append the backdrop html once and include the \"fade\" class if it is \"shown\" and \"animated\"', () => {\n      return new Promise(resolve => {\n        const instance = new Backdrop({\n          isVisible: true,\n          isAnimated: true\n        })\n        const getElements = () => document.querySelectorAll(CLASS_BACKDROP)\n\n        expect(getElements()).toHaveSize(0)\n\n        instance.show(() => {\n          expect(getElements()).toHaveSize(1)\n          for (const el of getElements()) {\n            expect(el).toHaveClass(CLASS_NAME_FADE)\n          }\n\n          resolve()\n        })\n      })\n    })\n  })\n\n  describe('hide', () => {\n    it('should remove the backdrop html', () => {\n      return new Promise(resolve => {\n        const instance = new Backdrop({\n          isVisible: true,\n          isAnimated: true\n        })\n\n        const getElements = () => document.body.querySelectorAll(CLASS_BACKDROP)\n\n        expect(getElements()).toHaveSize(0)\n        instance.show(() => {\n          expect(getElements()).toHaveSize(1)\n          instance.hide(() => {\n            expect(getElements()).toHaveSize(0)\n            resolve()\n          })\n        })\n      })\n    })\n\n    it('should remove the \"show\" class', () => {\n      return new Promise(resolve => {\n        const instance = new Backdrop({\n          isVisible: true,\n          isAnimated: true\n        })\n        const elem = instance._getElement()\n\n        instance.show()\n        instance.hide(() => {\n          expect(elem).not.toHaveClass(CLASS_NAME_SHOW)\n          resolve()\n        })\n      })\n    })\n\n    it('should not try to remove Node on remove method if it is not \"shown\"', () => {\n      return new Promise(resolve => {\n        const instance = new Backdrop({\n          isVisible: false,\n          isAnimated: true\n        })\n        const getElements = () => document.querySelectorAll(CLASS_BACKDROP)\n        const spy = spyOn(instance, 'dispose').and.callThrough()\n\n        expect(getElements()).toHaveSize(0)\n        expect(instance._isAppended).toBeFalse()\n        instance.show(() => {\n          instance.hide(() => {\n            expect(getElements()).toHaveSize(0)\n            expect(spy).not.toHaveBeenCalled()\n            expect(instance._isAppended).toBeFalse()\n            resolve()\n          })\n        })\n      })\n    })\n\n    it('should not error if the backdrop no longer has a parent', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<div id=\"wrapper\"></div>'\n\n        const wrapper = fixtureEl.querySelector('#wrapper')\n        const instance = new Backdrop({\n          isVisible: true,\n          isAnimated: true,\n          rootElement: wrapper\n        })\n\n        const getElements = () => document.querySelectorAll(CLASS_BACKDROP)\n\n        instance.show(() => {\n          wrapper.remove()\n          instance.hide(() => {\n            expect(getElements()).toHaveSize(0)\n            resolve()\n          })\n        })\n      })\n    })\n  })\n\n  describe('click callback', () => {\n    it('should execute callback on click', () => {\n      return new Promise(resolve => {\n        const spy = jasmine.createSpy('spy')\n\n        const instance = new Backdrop({\n          isVisible: true,\n          isAnimated: false,\n          clickCallback: () => spy()\n        })\n        const endTest = () => {\n          setTimeout(() => {\n            expect(spy).toHaveBeenCalled()\n            resolve()\n          }, 10)\n        }\n\n        instance.show(() => {\n          const clickEvent = new Event('mousedown', { bubbles: true, cancelable: true })\n          document.querySelector(CLASS_BACKDROP).dispatchEvent(clickEvent)\n          endTest()\n        })\n      })\n    })\n\n    describe('animation callbacks', () => {\n      it('should show and hide backdrop after counting transition duration if it is animated', () => {\n        return new Promise(resolve => {\n          const instance = new Backdrop({\n            isVisible: true,\n            isAnimated: true\n          })\n          const spy2 = jasmine.createSpy('spy2')\n\n          const execDone = () => {\n            setTimeout(() => {\n              expect(spy2).toHaveBeenCalledTimes(2)\n              resolve()\n            }, 10)\n          }\n\n          instance.show(spy2)\n          instance.hide(() => {\n            spy2()\n            execDone()\n          })\n          expect(spy2).not.toHaveBeenCalled()\n        })\n      })\n\n      it('should show and hide backdrop without a delay if it is not animated', () => {\n        return new Promise(resolve => {\n          const spy = jasmine.createSpy('spy', getTransitionDurationFromElement)\n          const instance = new Backdrop({\n            isVisible: true,\n            isAnimated: false\n          })\n          const spy2 = jasmine.createSpy('spy2')\n\n          instance.show(spy2)\n          instance.hide(spy2)\n\n          setTimeout(() => {\n            expect(spy2).toHaveBeenCalled()\n            expect(spy).not.toHaveBeenCalled()\n            resolve()\n          }, 10)\n        })\n      })\n\n      it('should not call delay callbacks if it is not \"shown\"', () => {\n        return new Promise(resolve => {\n          const instance = new Backdrop({\n            isVisible: false,\n            isAnimated: true\n          })\n          const spy = jasmine.createSpy('spy', getTransitionDurationFromElement)\n\n          instance.show()\n          instance.hide(() => {\n            expect(spy).not.toHaveBeenCalled()\n            resolve()\n          })\n        })\n      })\n    })\n\n    describe('Config', () => {\n      describe('rootElement initialization', () => {\n        it('should be appended on \"document.body\" by default', () => {\n          return new Promise(resolve => {\n            const instance = new Backdrop({\n              isVisible: true\n            })\n            const getElement = () => document.querySelector(CLASS_BACKDROP)\n            instance.show(() => {\n              expect(getElement().parentElement).toEqual(document.body)\n              resolve()\n            })\n          })\n        })\n\n        it('should find the rootElement if passed as a string', () => {\n          return new Promise(resolve => {\n            const instance = new Backdrop({\n              isVisible: true,\n              rootElement: 'body'\n            })\n            const getElement = () => document.querySelector(CLASS_BACKDROP)\n            instance.show(() => {\n              expect(getElement().parentElement).toEqual(document.body)\n              resolve()\n            })\n          })\n        })\n\n        it('should be appended on any element given by the proper config', () => {\n          return new Promise(resolve => {\n            fixtureEl.innerHTML = '<div id=\"wrapper\"></div>'\n\n            const wrapper = fixtureEl.querySelector('#wrapper')\n            const instance = new Backdrop({\n              isVisible: true,\n              rootElement: wrapper\n            })\n            const getElement = () => document.querySelector(CLASS_BACKDROP)\n            instance.show(() => {\n              expect(getElement().parentElement).toEqual(wrapper)\n              resolve()\n            })\n          })\n        })\n      })\n\n      describe('ClassName', () => {\n        it('should allow configuring className', () => {\n          return new Promise(resolve => {\n            const instance = new Backdrop({\n              isVisible: true,\n              className: 'foo'\n            })\n            const getElement = () => document.querySelector('.foo')\n            instance.show(() => {\n              expect(getElement()).toEqual(instance._getElement())\n              instance.dispose()\n              resolve()\n            })\n          })\n        })\n      })\n    })\n  })\n})\n"
  },
  {
    "path": "js/tests/unit/util/component-functions.spec.js",
    "content": "import BaseComponent from '../../../src/base-component.js'\nimport { enableDismissTrigger } from '../../../src/util/component-functions.js'\nimport { clearFixture, createEvent, getFixture } from '../../helpers/fixture.js'\n\nclass DummyClass2 extends BaseComponent {\n  static get NAME() {\n    return 'test'\n  }\n\n  hide() {\n    return true\n  }\n\n  testMethod() {\n    return true\n  }\n}\n\ndescribe('Plugin functions', () => {\n  let fixtureEl\n\n  beforeAll(() => {\n    fixtureEl = getFixture()\n  })\n\n  afterEach(() => {\n    clearFixture()\n  })\n\n  describe('data-bs-dismiss functionality', () => {\n    it('should get Plugin and execute the given method, when a click occurred on data-bs-dismiss=\"PluginName\"', () => {\n      fixtureEl.innerHTML = [\n        '<div id=\"foo\" class=\"test\">',\n        '  <button type=\"button\" data-bs-dismiss=\"test\" data-bs-target=\"#foo\"></button>',\n        '</div>'\n      ].join('')\n\n      const spyGet = spyOn(DummyClass2, 'getOrCreateInstance').and.callThrough()\n      const spyTest = spyOn(DummyClass2.prototype, 'testMethod')\n      const componentWrapper = fixtureEl.querySelector('#foo')\n      const btnClose = fixtureEl.querySelector('[data-bs-dismiss=\"test\"]')\n      const event = createEvent('click')\n\n      enableDismissTrigger(DummyClass2, 'testMethod')\n      btnClose.dispatchEvent(event)\n\n      expect(spyGet).toHaveBeenCalledWith(componentWrapper)\n      expect(spyTest).toHaveBeenCalled()\n    })\n\n    it('if data-bs-dismiss=\"PluginName\" hasn\\'t got \"data-bs-target\", \"getOrCreateInstance\" has to be initialized by closest \"plugin.Name\" class', () => {\n      fixtureEl.innerHTML = [\n        '<div id=\"foo\" class=\"test\">',\n        '  <button type=\"button\" data-bs-dismiss=\"test\"></button>',\n        '</div>'\n      ].join('')\n\n      const spyGet = spyOn(DummyClass2, 'getOrCreateInstance').and.callThrough()\n      const spyHide = spyOn(DummyClass2.prototype, 'hide')\n      const componentWrapper = fixtureEl.querySelector('#foo')\n      const btnClose = fixtureEl.querySelector('[data-bs-dismiss=\"test\"]')\n      const event = createEvent('click')\n\n      enableDismissTrigger(DummyClass2)\n      btnClose.dispatchEvent(event)\n\n      expect(spyGet).toHaveBeenCalledWith(componentWrapper)\n      expect(spyHide).toHaveBeenCalled()\n    })\n\n    it('if data-bs-dismiss=\"PluginName\" is disabled, must not trigger function', () => {\n      fixtureEl.innerHTML = [\n        '<div id=\"foo\" class=\"test\">',\n        '  <button type=\"button\" disabled data-bs-dismiss=\"test\"></button>',\n        '</div>'\n      ].join('')\n\n      const spy = spyOn(DummyClass2, 'getOrCreateInstance').and.callThrough()\n      const btnClose = fixtureEl.querySelector('[data-bs-dismiss=\"test\"]')\n      const event = createEvent('click')\n\n      enableDismissTrigger(DummyClass2)\n      btnClose.dispatchEvent(event)\n\n      expect(spy).not.toHaveBeenCalled()\n    })\n\n    it('should prevent default when the trigger is <a> or <area>', () => {\n      fixtureEl.innerHTML = [\n        '<div id=\"foo\" class=\"test\">',\n        '  <a type=\"button\" data-bs-dismiss=\"test\"></a>',\n        '</div>'\n      ].join('')\n\n      const btnClose = fixtureEl.querySelector('[data-bs-dismiss=\"test\"]')\n      const event = createEvent('click')\n\n      enableDismissTrigger(DummyClass2)\n      const spy = spyOn(Event.prototype, 'preventDefault').and.callThrough()\n\n      btnClose.dispatchEvent(event)\n\n      expect(spy).toHaveBeenCalled()\n    })\n  })\n})\n"
  },
  {
    "path": "js/tests/unit/util/config.spec.js",
    "content": "import Config from '../../../src/util/config.js'\nimport { clearFixture, getFixture } from '../../helpers/fixture.js'\n\nclass DummyConfigClass extends Config {\n  static get NAME() {\n    return 'dummy'\n  }\n}\n\ndescribe('Config', () => {\n  let fixtureEl\n  const name = 'dummy'\n\n  beforeAll(() => {\n    fixtureEl = getFixture()\n  })\n\n  afterEach(() => {\n    clearFixture()\n  })\n\n  describe('NAME', () => {\n    it('should return plugin NAME', () => {\n      expect(DummyConfigClass.NAME).toEqual(name)\n    })\n  })\n\n  describe('DefaultType', () => {\n    it('should return plugin default type', () => {\n      expect(DummyConfigClass.DefaultType).toEqual(jasmine.any(Object))\n    })\n  })\n\n  describe('Default', () => {\n    it('should return plugin defaults', () => {\n      expect(DummyConfigClass.Default).toEqual(jasmine.any(Object))\n    })\n  })\n\n  describe('mergeConfigObj', () => {\n    it('should parse element\\'s data attributes and merge it with default config. Element\\'s data attributes must excel Defaults', () => {\n      fixtureEl.innerHTML = '<div id=\"test\" data-bs-test-bool=\"false\" data-bs-test-int=\"8\" data-bs-test-string1=\"bar\"></div>'\n\n      spyOnProperty(DummyConfigClass, 'Default', 'get').and.returnValue({\n        testBool: true,\n        testString: 'foo',\n        testString1: 'foo',\n        testInt: 7\n      })\n      const instance = new DummyConfigClass()\n      const configResult = instance._mergeConfigObj({}, fixtureEl.querySelector('#test'))\n\n      expect(configResult.testBool).toEqual(false)\n      expect(configResult.testString).toEqual('foo')\n      expect(configResult.testString1).toEqual('bar')\n      expect(configResult.testInt).toEqual(8)\n    })\n\n    it('should parse element\\'s data attributes and merge it with default config, plug these given during method call. The programmatically given should excel all', () => {\n      fixtureEl.innerHTML = '<div id=\"test\" data-bs-test-bool=\"false\" data-bs-test-int=\"8\" data-bs-test-string-1=\"bar\"></div>'\n\n      spyOnProperty(DummyConfigClass, 'Default', 'get').and.returnValue({\n        testBool: true,\n        testString: 'foo',\n        testString1: 'foo',\n        testInt: 7\n      })\n      const instance = new DummyConfigClass()\n      const configResult = instance._mergeConfigObj({\n        testString1: 'test',\n        testInt: 3\n      }, fixtureEl.querySelector('#test'))\n\n      expect(configResult.testBool).toEqual(false)\n      expect(configResult.testString).toEqual('foo')\n      expect(configResult.testString1).toEqual('test')\n      expect(configResult.testInt).toEqual(3)\n    })\n\n    it('should parse element\\'s data attribute `config` and any rest attributes. The programmatically given should excel all. Data attribute `config` should excel only Defaults', () => {\n      fixtureEl.innerHTML = '<div id=\"test\" data-bs-config=\\'{\"testBool\":false,\"testInt\":50,\"testInt2\":100}\\' data-bs-test-int=\"8\" data-bs-test-string-1=\"bar\"></div>'\n\n      spyOnProperty(DummyConfigClass, 'Default', 'get').and.returnValue({\n        testBool: true,\n        testString: 'foo',\n        testString1: 'foo',\n        testInt: 7,\n        testInt2: 600\n      })\n      const instance = new DummyConfigClass()\n      const configResult = instance._mergeConfigObj({\n        testString1: 'test'\n      }, fixtureEl.querySelector('#test'))\n\n      expect(configResult.testBool).toEqual(false)\n      expect(configResult.testString).toEqual('foo')\n      expect(configResult.testString1).toEqual('test')\n      expect(configResult.testInt).toEqual(8)\n      expect(configResult.testInt2).toEqual(100)\n    })\n\n    it('should omit element\\'s data attribute `config` if is not an object', () => {\n      fixtureEl.innerHTML = '<div id=\"test\" data-bs-config=\"foo\" data-bs-test-int=\"8\"></div>'\n\n      spyOnProperty(DummyConfigClass, 'Default', 'get').and.returnValue({\n        testInt: 7,\n        testInt2: 79\n      })\n      const instance = new DummyConfigClass()\n      const configResult = instance._mergeConfigObj({}, fixtureEl.querySelector('#test'))\n\n      expect(configResult.testInt).toEqual(8)\n      expect(configResult.testInt2).toEqual(79)\n    })\n  })\n\n  describe('typeCheckConfig', () => {\n    it('should check type of the config object', () => {\n      spyOnProperty(DummyConfigClass, 'DefaultType', 'get').and.returnValue({\n        toggle: 'boolean',\n        parent: '(string|element)'\n      })\n      const config = {\n        toggle: true,\n        parent: 777\n      }\n\n      const obj = new DummyConfigClass()\n      expect(() => {\n        obj._typeCheckConfig(config)\n      }).toThrowError(TypeError, `${obj.constructor.NAME.toUpperCase()}: Option \"parent\" provided type \"number\" but expected type \"(string|element)\".`)\n    })\n\n    it('should return null stringified when null is passed', () => {\n      spyOnProperty(DummyConfigClass, 'DefaultType', 'get').and.returnValue({\n        toggle: 'boolean',\n        parent: '(null|element)'\n      })\n\n      const obj = new DummyConfigClass()\n      const config = {\n        toggle: true,\n        parent: null\n      }\n\n      obj._typeCheckConfig(config)\n      expect().nothing()\n    })\n\n    it('should return undefined stringified when undefined is passed', () => {\n      spyOnProperty(DummyConfigClass, 'DefaultType', 'get').and.returnValue({\n        toggle: 'boolean',\n        parent: '(undefined|element)'\n      })\n\n      const obj = new DummyConfigClass()\n      const config = {\n        toggle: true,\n        parent: undefined\n      }\n\n      obj._typeCheckConfig(config)\n      expect().nothing()\n    })\n  })\n})\n"
  },
  {
    "path": "js/tests/unit/util/focustrap.spec.js",
    "content": "import EventHandler from '../../../src/dom/event-handler.js'\nimport SelectorEngine from '../../../src/dom/selector-engine.js'\nimport FocusTrap from '../../../src/util/focustrap.js'\nimport { clearFixture, createEvent, getFixture } from '../../helpers/fixture.js'\n\ndescribe('FocusTrap', () => {\n  let fixtureEl\n\n  beforeAll(() => {\n    fixtureEl = getFixture()\n  })\n\n  afterEach(() => {\n    clearFixture()\n  })\n\n  describe('activate', () => {\n    it('should autofocus itself by default', () => {\n      fixtureEl.innerHTML = '<div id=\"focustrap\" tabindex=\"-1\"></div>'\n\n      const trapElement = fixtureEl.querySelector('div')\n\n      const spy = spyOn(trapElement, 'focus')\n\n      const focustrap = new FocusTrap({ trapElement })\n      focustrap.activate()\n\n      expect(spy).toHaveBeenCalled()\n    })\n\n    it('if configured not to autofocus, should not autofocus itself', () => {\n      fixtureEl.innerHTML = '<div id=\"focustrap\" tabindex=\"-1\"></div>'\n\n      const trapElement = fixtureEl.querySelector('div')\n\n      const spy = spyOn(trapElement, 'focus')\n\n      const focustrap = new FocusTrap({ trapElement, autofocus: false })\n      focustrap.activate()\n\n      expect(spy).not.toHaveBeenCalled()\n    })\n\n    it('should force focus inside focus trap if it can', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<a href=\"#\" id=\"outside\">outside</a>',\n          '<div id=\"focustrap\" tabindex=\"-1\">',\n          '  <a href=\"#\" id=\"inside\">inside</a>',\n          '</div>'\n        ].join('')\n\n        const trapElement = fixtureEl.querySelector('div')\n        const focustrap = new FocusTrap({ trapElement })\n        focustrap.activate()\n\n        const inside = document.getElementById('inside')\n\n        const focusInListener = () => {\n          expect(spy).toHaveBeenCalled()\n          document.removeEventListener('focusin', focusInListener)\n          resolve()\n        }\n\n        const spy = spyOn(inside, 'focus')\n        spyOn(SelectorEngine, 'focusableChildren').and.callFake(() => [inside])\n\n        document.addEventListener('focusin', focusInListener)\n\n        const focusInEvent = createEvent('focusin', { bubbles: true })\n        Object.defineProperty(focusInEvent, 'target', {\n          value: document.getElementById('outside')\n        })\n\n        document.dispatchEvent(focusInEvent)\n      })\n    })\n\n    it('should wrap focus around forward on tab', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<a href=\"#\" id=\"outside\">outside</a>',\n          '<div id=\"focustrap\" tabindex=\"-1\">',\n          '  <a href=\"#\" id=\"first\">first</a>',\n          '  <a href=\"#\" id=\"inside\">inside</a>',\n          '  <a href=\"#\" id=\"last\">last</a>',\n          '</div>'\n        ].join('')\n\n        const trapElement = fixtureEl.querySelector('div')\n        const focustrap = new FocusTrap({ trapElement })\n        focustrap.activate()\n\n        const first = document.getElementById('first')\n        const inside = document.getElementById('inside')\n        const last = document.getElementById('last')\n        const outside = document.getElementById('outside')\n\n        spyOn(SelectorEngine, 'focusableChildren').and.callFake(() => [first, inside, last])\n        const spy = spyOn(first, 'focus').and.callThrough()\n\n        const focusInListener = () => {\n          expect(spy).toHaveBeenCalled()\n          first.removeEventListener('focusin', focusInListener)\n          resolve()\n        }\n\n        first.addEventListener('focusin', focusInListener)\n\n        const keydown = createEvent('keydown')\n        keydown.key = 'Tab'\n\n        document.dispatchEvent(keydown)\n        outside.focus()\n      })\n    })\n\n    it('should wrap focus around backwards on shift-tab', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<a href=\"#\" id=\"outside\">outside</a>',\n          '<div id=\"focustrap\" tabindex=\"-1\">',\n          '  <a href=\"#\" id=\"first\">first</a>',\n          '  <a href=\"#\" id=\"inside\">inside</a>',\n          '  <a href=\"#\" id=\"last\">last</a>',\n          '</div>'\n        ].join('')\n\n        const trapElement = fixtureEl.querySelector('div')\n        const focustrap = new FocusTrap({ trapElement })\n        focustrap.activate()\n\n        const first = document.getElementById('first')\n        const inside = document.getElementById('inside')\n        const last = document.getElementById('last')\n        const outside = document.getElementById('outside')\n\n        spyOn(SelectorEngine, 'focusableChildren').and.callFake(() => [first, inside, last])\n        const spy = spyOn(last, 'focus').and.callThrough()\n\n        const focusInListener = () => {\n          expect(spy).toHaveBeenCalled()\n          last.removeEventListener('focusin', focusInListener)\n          resolve()\n        }\n\n        last.addEventListener('focusin', focusInListener)\n\n        const keydown = createEvent('keydown')\n        keydown.key = 'Tab'\n        keydown.shiftKey = true\n\n        document.dispatchEvent(keydown)\n        outside.focus()\n      })\n    })\n\n    it('should force focus on itself if there is no focusable content', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<a href=\"#\" id=\"outside\">outside</a>',\n          '<div id=\"focustrap\" tabindex=\"-1\"></div>'\n        ].join('')\n\n        const trapElement = fixtureEl.querySelector('div')\n        const focustrap = new FocusTrap({ trapElement })\n        focustrap.activate()\n\n        const focusInListener = () => {\n          expect(spy).toHaveBeenCalled()\n          document.removeEventListener('focusin', focusInListener)\n          resolve()\n        }\n\n        const spy = spyOn(focustrap._config.trapElement, 'focus')\n\n        document.addEventListener('focusin', focusInListener)\n\n        const focusInEvent = createEvent('focusin', { bubbles: true })\n        Object.defineProperty(focusInEvent, 'target', {\n          value: document.getElementById('outside')\n        })\n\n        document.dispatchEvent(focusInEvent)\n      })\n    })\n  })\n\n  describe('deactivate', () => {\n    it('should flag itself as no longer active', () => {\n      const focustrap = new FocusTrap({ trapElement: fixtureEl })\n      focustrap.activate()\n      expect(focustrap._isActive).toBeTrue()\n\n      focustrap.deactivate()\n      expect(focustrap._isActive).toBeFalse()\n    })\n\n    it('should remove all event listeners', () => {\n      const focustrap = new FocusTrap({ trapElement: fixtureEl })\n      focustrap.activate()\n\n      const spy = spyOn(EventHandler, 'off')\n      focustrap.deactivate()\n\n      expect(spy).toHaveBeenCalled()\n    })\n\n    it('doesn\\'t try removing event listeners unless it needs to (in case it hasn\\'t been activated)', () => {\n      const focustrap = new FocusTrap({ trapElement: fixtureEl })\n\n      const spy = spyOn(EventHandler, 'off')\n      focustrap.deactivate()\n\n      expect(spy).not.toHaveBeenCalled()\n    })\n  })\n})\n"
  },
  {
    "path": "js/tests/unit/util/index.spec.js",
    "content": "import * as Util from '../../../src/util/index.js'\nimport { noop } from '../../../src/util/index.js'\nimport { clearFixture, getFixture } from '../../helpers/fixture.js'\n\ndescribe('Util', () => {\n  let fixtureEl\n\n  beforeAll(() => {\n    fixtureEl = getFixture()\n  })\n\n  afterEach(() => {\n    clearFixture()\n  })\n\n  describe('getUID', () => {\n    it('should generate uid', () => {\n      const uid = Util.getUID('bs')\n      const uid2 = Util.getUID('bs')\n\n      expect(uid).not.toEqual(uid2)\n    })\n  })\n\n  describe('getTransitionDurationFromElement', () => {\n    it('should get transition from element', () => {\n      fixtureEl.innerHTML = '<div style=\"transition: all 300ms ease-out;\"></div>'\n\n      expect(Util.getTransitionDurationFromElement(fixtureEl.querySelector('div'))).toEqual(300)\n    })\n\n    it('should return 0 if the element is undefined or null', () => {\n      expect(Util.getTransitionDurationFromElement(null)).toEqual(0)\n      expect(Util.getTransitionDurationFromElement(undefined)).toEqual(0)\n    })\n\n    it('should return 0 if the element do not possess transition', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      expect(Util.getTransitionDurationFromElement(fixtureEl.querySelector('div'))).toEqual(0)\n    })\n  })\n\n  describe('triggerTransitionEnd', () => {\n    it('should trigger transitionend event', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = '<div></div>'\n\n        const el = fixtureEl.querySelector('div')\n        const spy = spyOn(el, 'dispatchEvent').and.callThrough()\n\n        el.addEventListener('transitionend', () => {\n          expect(spy).toHaveBeenCalled()\n          resolve()\n        })\n\n        Util.triggerTransitionEnd(el)\n      })\n    })\n  })\n\n  describe('isElement', () => {\n    it('should detect if the parameter is an element or not and return Boolean', () => {\n      fixtureEl.innerHTML = [\n        '<div id=\"foo\" class=\"test\"></div>',\n        '<div id=\"bar\" class=\"test\"></div>'\n      ].join('')\n\n      const el = fixtureEl.querySelector('#foo')\n\n      expect(Util.isElement(el)).toBeTrue()\n      expect(Util.isElement({})).toBeFalse()\n      expect(Util.isElement(fixtureEl.querySelectorAll('.test'))).toBeFalse()\n    })\n\n    it('should detect jQuery element', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const el = fixtureEl.querySelector('div')\n      const fakejQuery = {\n        0: el,\n        jquery: 'foo'\n      }\n\n      expect(Util.isElement(fakejQuery)).toBeTrue()\n    })\n  })\n\n  describe('getElement', () => {\n    it('should try to parse element', () => {\n      fixtureEl.innerHTML = [\n        '<div id=\"foo\" class=\"test\"></div>',\n        '<div id=\"bar\" class=\"test\"></div>'\n      ].join('')\n\n      const el = fixtureEl.querySelector('div')\n\n      expect(Util.getElement(el)).toEqual(el)\n      expect(Util.getElement('#foo')).toEqual(el)\n      expect(Util.getElement('#fail')).toBeNull()\n      expect(Util.getElement({})).toBeNull()\n      expect(Util.getElement([])).toBeNull()\n      expect(Util.getElement()).toBeNull()\n      expect(Util.getElement(null)).toBeNull()\n      expect(Util.getElement(fixtureEl.querySelectorAll('.test'))).toBeNull()\n\n      const fakejQueryObject = {\n        0: el,\n        jquery: 'foo'\n      }\n\n      expect(Util.getElement(fakejQueryObject)).toEqual(el)\n    })\n  })\n\n  describe('isVisible', () => {\n    it('should return false if the element is not defined', () => {\n      expect(Util.isVisible(null)).toBeFalse()\n      expect(Util.isVisible(undefined)).toBeFalse()\n    })\n\n    it('should return false if the element provided is not a dom element', () => {\n      expect(Util.isVisible({})).toBeFalse()\n    })\n\n    it('should return false if the element is not visible with display none', () => {\n      fixtureEl.innerHTML = '<div style=\"display: none;\"></div>'\n\n      const div = fixtureEl.querySelector('div')\n\n      expect(Util.isVisible(div)).toBeFalse()\n    })\n\n    it('should return false if the element is not visible with visibility hidden', () => {\n      fixtureEl.innerHTML = '<div style=\"visibility: hidden;\"></div>'\n\n      const div = fixtureEl.querySelector('div')\n\n      expect(Util.isVisible(div)).toBeFalse()\n    })\n\n    it('should return false if an ancestor element is display none', () => {\n      fixtureEl.innerHTML = [\n        '<div style=\"display: none;\">',\n        '  <div>',\n        '    <div>',\n        '      <div class=\"content\"></div>',\n        '    </div>',\n        '  </div>',\n        '</div>'\n      ].join('')\n\n      const div = fixtureEl.querySelector('.content')\n\n      expect(Util.isVisible(div)).toBeFalse()\n    })\n\n    it('should return false if an ancestor element is visibility hidden', () => {\n      fixtureEl.innerHTML = [\n        '<div style=\"visibility: hidden;\">',\n        '  <div>',\n        '    <div>',\n        '      <div class=\"content\"></div>',\n        '    </div>',\n        '  </div>',\n        '</div>'\n      ].join('')\n\n      const div = fixtureEl.querySelector('.content')\n\n      expect(Util.isVisible(div)).toBeFalse()\n    })\n\n    it('should return true if an ancestor element is visibility hidden, but reverted', () => {\n      fixtureEl.innerHTML = [\n        '<div style=\"visibility: hidden;\">',\n        '  <div style=\"visibility: visible;\">',\n        '    <div>',\n        '      <div class=\"content\"></div>',\n        '    </div>',\n        '  </div>',\n        '</div>'\n      ].join('')\n\n      const div = fixtureEl.querySelector('.content')\n\n      expect(Util.isVisible(div)).toBeTrue()\n    })\n\n    it('should return true if the element is visible', () => {\n      fixtureEl.innerHTML = [\n        '<div>',\n        '  <div id=\"element\"></div>',\n        '</div>'\n      ].join('')\n\n      const div = fixtureEl.querySelector('#element')\n\n      expect(Util.isVisible(div)).toBeTrue()\n    })\n\n    it('should return false if the element is hidden, but not via display or visibility', () => {\n      fixtureEl.innerHTML = [\n        '<details>',\n        '  <div id=\"element\"></div>',\n        '</details>'\n      ].join('')\n\n      const div = fixtureEl.querySelector('#element')\n\n      expect(Util.isVisible(div)).toBeFalse()\n    })\n\n    it('should return true if its a closed details element', () => {\n      fixtureEl.innerHTML = '<details id=\"element\"></details>'\n\n      const div = fixtureEl.querySelector('#element')\n\n      expect(Util.isVisible(div)).toBeTrue()\n    })\n\n    it('should return true if the element is visible inside an open details element', () => {\n      fixtureEl.innerHTML = [\n        '<details open>',\n        '  <div id=\"element\"></div>',\n        '</details>'\n      ].join('')\n\n      const div = fixtureEl.querySelector('#element')\n\n      expect(Util.isVisible(div)).toBeTrue()\n    })\n\n    it('should return true if the element is a visible summary in a closed details element', () => {\n      fixtureEl.innerHTML = [\n        '<details>',\n        '  <summary id=\"element-1\">',\n        '    <span id=\"element-2\"></span>',\n        '  </summary>',\n        '</details>'\n      ].join('')\n\n      const element1 = fixtureEl.querySelector('#element-1')\n      const element2 = fixtureEl.querySelector('#element-2')\n\n      expect(Util.isVisible(element1)).toBeTrue()\n      expect(Util.isVisible(element2)).toBeTrue()\n    })\n  })\n\n  describe('isDisabled', () => {\n    it('should return true if the element is not defined', () => {\n      expect(Util.isDisabled(null)).toBeTrue()\n      expect(Util.isDisabled(undefined)).toBeTrue()\n      expect(Util.isDisabled()).toBeTrue()\n    })\n\n    it('should return true if the element provided is not a dom element', () => {\n      expect(Util.isDisabled({})).toBeTrue()\n      expect(Util.isDisabled('test')).toBeTrue()\n    })\n\n    it('should return true if the element has disabled attribute', () => {\n      fixtureEl.innerHTML = [\n        '<div>',\n        '  <div id=\"element\" disabled=\"disabled\"></div>',\n        '  <div id=\"element1\" disabled=\"true\"></div>',\n        '  <div id=\"element2\" disabled></div>',\n        '</div>'\n      ].join('')\n\n      const div = fixtureEl.querySelector('#element')\n      const div1 = fixtureEl.querySelector('#element1')\n      const div2 = fixtureEl.querySelector('#element2')\n\n      expect(Util.isDisabled(div)).toBeTrue()\n      expect(Util.isDisabled(div1)).toBeTrue()\n      expect(Util.isDisabled(div2)).toBeTrue()\n    })\n\n    it('should return false if the element has disabled attribute with \"false\" value, or doesn\\'t have attribute', () => {\n      fixtureEl.innerHTML = [\n        '<div>',\n        '  <div id=\"element\" disabled=\"false\"></div>',\n        '  <div id=\"element1\" ></div>',\n        '</div>'\n      ].join('')\n\n      const div = fixtureEl.querySelector('#element')\n      const div1 = fixtureEl.querySelector('#element1')\n\n      expect(Util.isDisabled(div)).toBeFalse()\n      expect(Util.isDisabled(div1)).toBeFalse()\n    })\n\n    it('should return false if the element is not disabled ', () => {\n      fixtureEl.innerHTML = [\n        '<div>',\n        '  <button id=\"button\"></button>',\n        '  <select id=\"select\"></select>',\n        '  <select id=\"input\"></select>',\n        '</div>'\n      ].join('')\n\n      const el = selector => fixtureEl.querySelector(selector)\n\n      expect(Util.isDisabled(el('#button'))).toBeFalse()\n      expect(Util.isDisabled(el('#select'))).toBeFalse()\n      expect(Util.isDisabled(el('#input'))).toBeFalse()\n    })\n\n    it('should return true if the element has disabled attribute', () => {\n      fixtureEl.innerHTML = [\n        '<div>',\n        '  <input id=\"input\" disabled=\"disabled\">',\n        '  <input id=\"input1\" disabled=\"disabled\">',\n        '  <button id=\"button\" disabled=\"true\"></button>',\n        '  <button id=\"button1\" disabled=\"disabled\"></button>',\n        '  <button id=\"button2\" disabled></button>',\n        '  <select id=\"select\" disabled></select>',\n        '  <select id=\"input\" disabled></select>',\n        '</div>'\n      ].join('')\n\n      const el = selector => fixtureEl.querySelector(selector)\n\n      expect(Util.isDisabled(el('#input'))).toBeTrue()\n      expect(Util.isDisabled(el('#input1'))).toBeTrue()\n      expect(Util.isDisabled(el('#button'))).toBeTrue()\n      expect(Util.isDisabled(el('#button1'))).toBeTrue()\n      expect(Util.isDisabled(el('#button2'))).toBeTrue()\n      expect(Util.isDisabled(el('#input'))).toBeTrue()\n    })\n\n    it('should return true if the element has class \"disabled\"', () => {\n      fixtureEl.innerHTML = [\n        '<div>',\n        '  <div id=\"element\" class=\"disabled\"></div>',\n        '</div>'\n      ].join('')\n\n      const div = fixtureEl.querySelector('#element')\n\n      expect(Util.isDisabled(div)).toBeTrue()\n    })\n\n    it('should return true if the element has class \"disabled\" but disabled attribute is false', () => {\n      fixtureEl.innerHTML = [\n        '<div>',\n        '  <input id=\"input\" class=\"disabled\" disabled=\"false\">',\n        '</div>'\n      ].join('')\n\n      const div = fixtureEl.querySelector('#input')\n\n      expect(Util.isDisabled(div)).toBeTrue()\n    })\n  })\n\n  describe('findShadowRoot', () => {\n    it('should return null if shadow dom is not available', () => {\n      // Only for newer browsers\n      if (!document.documentElement.attachShadow) {\n        expect().nothing()\n        return\n      }\n\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n\n      spyOn(document.documentElement, 'attachShadow').and.returnValue(null)\n\n      expect(Util.findShadowRoot(div)).toBeNull()\n    })\n\n    it('should return null when we do not find a shadow root', () => {\n      // Only for newer browsers\n      if (!document.documentElement.attachShadow) {\n        expect().nothing()\n        return\n      }\n\n      spyOn(document, 'getRootNode').and.returnValue(undefined)\n\n      expect(Util.findShadowRoot(document)).toBeNull()\n    })\n\n    it('should return the shadow root when found', () => {\n      // Only for newer browsers\n      if (!document.documentElement.attachShadow) {\n        expect().nothing()\n        return\n      }\n\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n      const shadowRoot = div.attachShadow({\n        mode: 'open'\n      })\n\n      expect(Util.findShadowRoot(shadowRoot)).toEqual(shadowRoot)\n\n      shadowRoot.innerHTML = '<button>Shadow Button</button>'\n\n      expect(Util.findShadowRoot(shadowRoot.firstChild)).toEqual(shadowRoot)\n    })\n  })\n\n  describe('noop', () => {\n    it('should be a function', () => {\n      expect(Util.noop).toEqual(jasmine.any(Function))\n    })\n  })\n\n  describe('reflow', () => {\n    it('should return element offset height to force the reflow', () => {\n      fixtureEl.innerHTML = '<div></div>'\n\n      const div = fixtureEl.querySelector('div')\n      const spy = spyOnProperty(div, 'offsetHeight')\n      Util.reflow(div)\n      expect(spy).toHaveBeenCalled()\n    })\n  })\n\n  describe('getjQuery', () => {\n    const fakejQuery = { trigger() {} }\n\n    beforeEach(() => {\n      Object.defineProperty(window, 'jQuery', {\n        value: fakejQuery,\n        writable: true\n      })\n    })\n\n    afterEach(() => {\n      window.jQuery = undefined\n    })\n\n    it('should return jQuery object when present', () => {\n      expect(Util.getjQuery()).toEqual(fakejQuery)\n    })\n\n    it('should not return jQuery object when present if data-bs-no-jquery', () => {\n      document.body.setAttribute('data-bs-no-jquery', '')\n\n      expect(window.jQuery).toEqual(fakejQuery)\n      expect(Util.getjQuery()).toBeNull()\n\n      document.body.removeAttribute('data-bs-no-jquery')\n    })\n\n    it('should not return jQuery if not present', () => {\n      window.jQuery = undefined\n      expect(Util.getjQuery()).toBeNull()\n    })\n  })\n\n  describe('onDOMContentLoaded', () => {\n    it('should execute callbacks when DOMContentLoaded is fired and should not add more than one listener', () => {\n      const spy = jasmine.createSpy()\n      const spy2 = jasmine.createSpy()\n\n      const spyAdd = spyOn(document, 'addEventListener').and.callThrough()\n      spyOnProperty(document, 'readyState').and.returnValue('loading')\n\n      Util.onDOMContentLoaded(spy)\n      Util.onDOMContentLoaded(spy2)\n\n      document.dispatchEvent(new Event('DOMContentLoaded', {\n        bubbles: true,\n        cancelable: true\n      }))\n\n      expect(spy).toHaveBeenCalled()\n      expect(spy2).toHaveBeenCalled()\n      expect(spyAdd).toHaveBeenCalledTimes(1)\n    })\n\n    it('should execute callback if readyState is not \"loading\"', () => {\n      const spy = jasmine.createSpy()\n      Util.onDOMContentLoaded(spy)\n      expect(spy).toHaveBeenCalled()\n    })\n  })\n\n  describe('defineJQueryPlugin', () => {\n    const fakejQuery = { fn: {} }\n\n    beforeEach(() => {\n      Object.defineProperty(window, 'jQuery', {\n        value: fakejQuery,\n        writable: true\n      })\n    })\n\n    afterEach(() => {\n      window.jQuery = undefined\n    })\n\n    it('should define a plugin on the jQuery instance', () => {\n      const pluginMock = Util.noop\n      pluginMock.NAME = 'test'\n      pluginMock.jQueryInterface = Util.noop\n\n      Util.defineJQueryPlugin(pluginMock)\n      expect(fakejQuery.fn.test).toEqual(pluginMock.jQueryInterface)\n      expect(fakejQuery.fn.test.Constructor).toEqual(pluginMock)\n      expect(fakejQuery.fn.test.noConflict).toEqual(jasmine.any(Function))\n    })\n  })\n\n  describe('execute', () => {\n    it('should execute if arg is function', () => {\n      const spy = jasmine.createSpy('spy')\n      Util.execute(spy)\n      expect(spy).toHaveBeenCalled()\n    })\n\n    it('should execute if arg is function & return the result', () => {\n      const functionFoo = (num1, num2 = 10) => num1 + num2\n      const resultFoo = Util.execute(functionFoo, [undefined, 4, 5])\n      expect(resultFoo).toBe(9)\n\n      const resultFoo1 = Util.execute(functionFoo, [undefined, 4])\n      expect(resultFoo1).toBe(14)\n\n      const functionBar = () => 'foo'\n      const resultBar = Util.execute(functionBar)\n      expect(resultBar).toBe('foo')\n    })\n\n    it('should not execute if arg is not function & return default argument', () => {\n      const foo = 'bar'\n      expect(Util.execute(foo)).toBe('bar')\n      expect(Util.execute(foo, [], 4)).toBe(4)\n    })\n  })\n\n  describe('executeAfterTransition', () => {\n    it('should immediately execute a function when waitForTransition parameter is false', () => {\n      const el = document.createElement('div')\n      const callbackSpy = jasmine.createSpy('callback spy')\n      const eventListenerSpy = spyOn(el, 'addEventListener')\n\n      Util.executeAfterTransition(callbackSpy, el, false)\n\n      expect(callbackSpy).toHaveBeenCalled()\n      expect(eventListenerSpy).not.toHaveBeenCalled()\n    })\n\n    it('should execute a function when a transitionend event is dispatched', () => {\n      const el = document.createElement('div')\n      const callbackSpy = jasmine.createSpy('callback spy')\n\n      spyOn(window, 'getComputedStyle').and.returnValue({\n        transitionDuration: '0.05s',\n        transitionDelay: '0s'\n      })\n\n      Util.executeAfterTransition(callbackSpy, el)\n\n      el.dispatchEvent(new TransitionEvent('transitionend'))\n\n      expect(callbackSpy).toHaveBeenCalled()\n    })\n\n    it('should execute a function after a computed CSS transition duration and there was no transitionend event dispatched', () => {\n      return new Promise(resolve => {\n        const el = document.createElement('div')\n        const callbackSpy = jasmine.createSpy('callback spy')\n\n        spyOn(window, 'getComputedStyle').and.returnValue({\n          transitionDuration: '0.05s',\n          transitionDelay: '0s'\n        })\n\n        Util.executeAfterTransition(callbackSpy, el)\n\n        setTimeout(() => {\n          expect(callbackSpy).toHaveBeenCalled()\n          resolve()\n        }, 70)\n      })\n    })\n\n    it('should not execute a function a second time after a computed CSS transition duration and if a transitionend event has already been dispatched', () => {\n      return new Promise(resolve => {\n        const el = document.createElement('div')\n        const callbackSpy = jasmine.createSpy('callback spy')\n\n        spyOn(window, 'getComputedStyle').and.returnValue({\n          transitionDuration: '0.05s',\n          transitionDelay: '0s'\n        })\n\n        Util.executeAfterTransition(callbackSpy, el)\n\n        setTimeout(() => {\n          el.dispatchEvent(new TransitionEvent('transitionend'))\n        }, 50)\n\n        setTimeout(() => {\n          expect(callbackSpy).toHaveBeenCalledTimes(1)\n          resolve()\n        }, 70)\n      })\n    })\n\n    it('should not trigger a transitionend event if another transitionend event had already happened', () => {\n      return new Promise(resolve => {\n        const el = document.createElement('div')\n\n        spyOn(window, 'getComputedStyle').and.returnValue({\n          transitionDuration: '0.05s',\n          transitionDelay: '0s'\n        })\n\n        Util.executeAfterTransition(noop, el)\n\n        // simulate a event dispatched by the browser\n        el.dispatchEvent(new TransitionEvent('transitionend'))\n\n        const dispatchSpy = spyOn(el, 'dispatchEvent').and.callThrough()\n\n        setTimeout(() => {\n          // setTimeout should not have triggered another transitionend event.\n          expect(dispatchSpy).not.toHaveBeenCalled()\n          resolve()\n        }, 70)\n      })\n    })\n\n    it('should ignore transitionend events from nested elements', () => {\n      return new Promise(resolve => {\n        fixtureEl.innerHTML = [\n          '<div class=\"outer\">',\n          '  <div class=\"nested\"></div>',\n          '</div>'\n        ].join('')\n\n        const outer = fixtureEl.querySelector('.outer')\n        const nested = fixtureEl.querySelector('.nested')\n        const callbackSpy = jasmine.createSpy('callback spy')\n\n        spyOn(window, 'getComputedStyle').and.returnValue({\n          transitionDuration: '0.05s',\n          transitionDelay: '0s'\n        })\n\n        Util.executeAfterTransition(callbackSpy, outer)\n\n        nested.dispatchEvent(new TransitionEvent('transitionend', {\n          bubbles: true\n        }))\n\n        setTimeout(() => {\n          expect(callbackSpy).not.toHaveBeenCalled()\n        }, 20)\n\n        setTimeout(() => {\n          expect(callbackSpy).toHaveBeenCalled()\n          resolve()\n        }, 70)\n      })\n    })\n  })\n\n  describe('getNextActiveElement', () => {\n    it('should return first element if active not exists or not given and shouldGetNext is either true, or false with cycling being disabled', () => {\n      const array = ['a', 'b', 'c', 'd']\n\n      expect(Util.getNextActiveElement(array, '', true, true)).toEqual('a')\n      expect(Util.getNextActiveElement(array, 'g', true, true)).toEqual('a')\n      expect(Util.getNextActiveElement(array, '', true, false)).toEqual('a')\n      expect(Util.getNextActiveElement(array, 'g', true, false)).toEqual('a')\n      expect(Util.getNextActiveElement(array, '', false, false)).toEqual('a')\n      expect(Util.getNextActiveElement(array, 'g', false, false)).toEqual('a')\n    })\n\n    it('should return last element if active not exists or not given and shouldGetNext is false but cycling is enabled', () => {\n      const array = ['a', 'b', 'c', 'd']\n\n      expect(Util.getNextActiveElement(array, '', false, true)).toEqual('d')\n      expect(Util.getNextActiveElement(array, 'g', false, true)).toEqual('d')\n    })\n\n    it('should return next element or same if is last', () => {\n      const array = ['a', 'b', 'c', 'd']\n\n      expect(Util.getNextActiveElement(array, 'a', true, true)).toEqual('b')\n      expect(Util.getNextActiveElement(array, 'b', true, true)).toEqual('c')\n      expect(Util.getNextActiveElement(array, 'd', true, false)).toEqual('d')\n    })\n\n    it('should return next element or first, if is last and \"isCycleAllowed = true\"', () => {\n      const array = ['a', 'b', 'c', 'd']\n\n      expect(Util.getNextActiveElement(array, 'c', true, true)).toEqual('d')\n      expect(Util.getNextActiveElement(array, 'd', true, true)).toEqual('a')\n    })\n\n    it('should return previous element or same if is first', () => {\n      const array = ['a', 'b', 'c', 'd']\n\n      expect(Util.getNextActiveElement(array, 'b', false, true)).toEqual('a')\n      expect(Util.getNextActiveElement(array, 'd', false, true)).toEqual('c')\n      expect(Util.getNextActiveElement(array, 'a', false, false)).toEqual('a')\n    })\n\n    it('should return next element or first, if is last and \"isCycleAllowed = true\"', () => {\n      const array = ['a', 'b', 'c', 'd']\n\n      expect(Util.getNextActiveElement(array, 'd', false, true)).toEqual('c')\n      expect(Util.getNextActiveElement(array, 'a', false, true)).toEqual('d')\n    })\n  })\n})\n"
  },
  {
    "path": "js/tests/unit/util/sanitizer.spec.js",
    "content": "import { DefaultAllowlist, sanitizeHtml } from '../../../src/util/sanitizer.js'\n\ndescribe('Sanitizer', () => {\n  describe('sanitizeHtml', () => {\n    it('should return the same on empty string', () => {\n      const empty = ''\n\n      const result = sanitizeHtml(empty, DefaultAllowlist, null)\n\n      expect(result).toEqual(empty)\n    })\n\n    it('should retain tags with valid URLs', () => {\n      const validUrls = [\n        '',\n        'http://abc',\n        'HTTP://abc',\n        'https://abc',\n        'HTTPS://abc',\n        'ftp://abc',\n        'FTP://abc',\n        'mailto:me@example.com',\n        'MAILTO:me@example.com',\n        'tel:123-123-1234',\n        'TEL:123-123-1234',\n        'sip:me@example.com',\n        'SIP:me@example.com',\n        '#anchor',\n        '/page1.md',\n        'http://JavaScript/my.js',\n        'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/', // Truncated.\n        'data:video/webm;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/',\n        'data:audio/opus;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/',\n        'unknown-scheme:abc'\n      ]\n\n      for (const url of validUrls) {\n        const template = [\n          '<div>',\n          `  <a href=\"${url}\">Click me</a>`,\n          '  <span>Some content</span>',\n          '</div>'\n        ].join('')\n\n        const result = sanitizeHtml(template, DefaultAllowlist, null)\n\n        expect(result).toContain(`href=\"${url}\"`)\n      }\n    })\n\n    it('should sanitize template by removing tags with XSS', () => {\n      const invalidUrls = [\n        // eslint-disable-next-line no-script-url\n        'javascript:alert(7)',\n        // eslint-disable-next-line no-script-url\n        'javascript:evil()',\n        // eslint-disable-next-line no-script-url\n        'JavaScript:abc',\n        ' javascript:abc',\n        ' \\n Java\\n Script:abc',\n        '&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;',\n        '&#106&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;',\n        '&#106 &#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;',\n        '&#0000106&#0000097&#0000118&#0000097&#0000115&#0000099&#0000114&#0000105&#0000112&#0000116&#0000058',\n        '&#x6A&#x61&#x76&#x61&#x73&#x63&#x72&#x69&#x70&#x74&#x3A;',\n        'jav&#x09;ascript:alert();',\n        'jav\\u0000ascript:alert();'\n      ]\n\n      for (const url of invalidUrls) {\n        const template = [\n          '<div>',\n          `  <a href=\"${url}\">Click me</a>`,\n          '  <span>Some content</span>',\n          '</div>'\n        ].join('')\n\n        const result = sanitizeHtml(template, DefaultAllowlist, null)\n\n        expect(result).not.toContain(`href=\"${url}\"`)\n      }\n    })\n\n    it('should sanitize template and work with multiple regex', () => {\n      const template = [\n        '<div>',\n        '  <a href=\"javascript:alert(7)\" aria-label=\"This is a link\" data-foo=\"bar\">Click me</a>',\n        '  <span>Some content</span>',\n        '</div>'\n      ].join('')\n\n      const myDefaultAllowList = DefaultAllowlist\n      // With the default allow list\n      let result = sanitizeHtml(template, myDefaultAllowList, null)\n\n      // `data-foo` won't be present\n      expect(result).not.toContain('data-foo=\"bar\"')\n\n      // Add the following regex too\n      myDefaultAllowList['*'].push(/^data-foo/)\n\n      result = sanitizeHtml(template, myDefaultAllowList, null)\n\n      expect(result).not.toContain('href=\"javascript:alert(7)') // This is in the default list\n      expect(result).toContain('aria-label=\"This is a link\"') // This is in the default list\n      expect(result).toContain('data-foo=\"bar\"') // We explicitly allow this\n    })\n\n    it('should allow aria attributes and safe attributes', () => {\n      const template = [\n        '<div aria-pressed=\"true\">',\n        '  <span class=\"test\">Some content</span>',\n        '</div>'\n      ].join('')\n\n      const result = sanitizeHtml(template, DefaultAllowlist, null)\n\n      expect(result).toContain('aria-pressed')\n      expect(result).toContain('class=\"test\"')\n    })\n\n    it('should remove tags not in allowlist', () => {\n      const template = [\n        '<div>',\n        '  <script>alert(7)</script>',\n        '</div>'\n      ].join('')\n\n      const result = sanitizeHtml(template, DefaultAllowlist, null)\n\n      expect(result).not.toContain('<script>')\n    })\n\n    it('should not use native api to sanitize if a custom function passed', () => {\n      const template = [\n        '<div>',\n        '  <span>Some content</span>',\n        '</div>'\n      ].join('')\n\n      function mySanitize(htmlUnsafe) {\n        return htmlUnsafe\n      }\n\n      const spy = spyOn(DOMParser.prototype, 'parseFromString')\n\n      const result = sanitizeHtml(template, DefaultAllowlist, mySanitize)\n\n      expect(result).toEqual(template)\n      expect(spy).not.toHaveBeenCalled()\n    })\n\n    it('should allow multiple sanitation passes of the same template', () => {\n      const template = '<img src=\"test.jpg\">'\n\n      const firstResult = sanitizeHtml(template, DefaultAllowlist, null)\n      const secondResult = sanitizeHtml(template, DefaultAllowlist, null)\n\n      expect(firstResult).toContain('src')\n      expect(secondResult).toContain('src')\n    })\n  })\n})\n"
  },
  {
    "path": "js/tests/unit/util/scrollbar.spec.js",
    "content": "import Manipulator from '../../../src/dom/manipulator.js'\nimport ScrollBarHelper from '../../../src/util/scrollbar.js'\nimport { clearBodyAndDocument, clearFixture, getFixture } from '../../helpers/fixture.js'\n\ndescribe('ScrollBar', () => {\n  let fixtureEl\n  const doc = document.documentElement\n  const parseIntDecimal = arg => Number.parseInt(arg, 10)\n  const getPaddingX = el => parseIntDecimal(window.getComputedStyle(el).paddingRight)\n  const getMarginX = el => parseIntDecimal(window.getComputedStyle(el).marginRight)\n  const getOverFlow = el => el.style.overflow\n  const getPaddingAttr = el => Manipulator.getDataAttribute(el, 'padding-right')\n  const getMarginAttr = el => Manipulator.getDataAttribute(el, 'margin-right')\n  const getOverFlowAttr = el => Manipulator.getDataAttribute(el, 'overflow')\n  const windowCalculations = () => {\n    return {\n      htmlClient: document.documentElement.clientWidth,\n      htmlOffset: document.documentElement.offsetWidth,\n      docClient: document.body.clientWidth,\n      htmlBound: document.documentElement.getBoundingClientRect().width,\n      bodyBound: document.body.getBoundingClientRect().width,\n      window: window.innerWidth,\n      width: Math.abs(window.innerWidth - document.documentElement.clientWidth)\n    }\n  }\n\n  // iOS, Android devices and macOS browsers hide scrollbar by default and show it only while scrolling.\n  // So the tests for scrollbar would fail\n  const isScrollBarHidden = () => {\n    const calc = windowCalculations()\n    return calc.htmlClient === calc.htmlOffset && calc.htmlClient === calc.window\n  }\n\n  beforeAll(() => {\n    fixtureEl = getFixture()\n    // custom fixture to avoid extreme style values\n    fixtureEl.removeAttribute('style')\n  })\n\n  afterAll(() => {\n    fixtureEl.remove()\n  })\n\n  afterEach(() => {\n    clearFixture()\n    clearBodyAndDocument()\n  })\n\n  beforeEach(() => {\n    clearBodyAndDocument()\n  })\n\n  describe('isBodyOverflowing', () => {\n    it('should return true if body is overflowing', () => {\n      document.documentElement.style.overflowY = 'scroll'\n      document.body.style.overflowY = 'scroll'\n      fixtureEl.innerHTML = '<div style=\"height: 110vh; width: 100%\"></div>'\n      const result = new ScrollBarHelper().isOverflowing()\n\n      if (isScrollBarHidden()) {\n        expect(result).toBeFalse()\n      } else {\n        expect(result).toBeTrue()\n      }\n    })\n\n    it('should return false if body is not overflowing', () => {\n      doc.style.overflowY = 'hidden'\n      document.body.style.overflowY = 'hidden'\n      fixtureEl.innerHTML = '<div style=\"height: 110vh; width: 100%\"></div>'\n      const scrollBar = new ScrollBarHelper()\n      const result = scrollBar.isOverflowing()\n\n      expect(result).toBeFalse()\n    })\n  })\n\n  describe('getWidth', () => {\n    it('should return an integer greater than zero, if body is overflowing', () => {\n      doc.style.overflowY = 'scroll'\n      document.body.style.overflowY = 'scroll'\n      fixtureEl.innerHTML = '<div style=\"height: 110vh; width: 100%\"></div>'\n      const result = new ScrollBarHelper().getWidth()\n\n      if (isScrollBarHidden()) {\n        expect(result).toEqual(0)\n      } else {\n        expect(result).toBeGreaterThan(1)\n      }\n    })\n\n    it('should return 0 if body is not overflowing', () => {\n      document.documentElement.style.overflowY = 'hidden'\n      document.body.style.overflowY = 'hidden'\n      fixtureEl.innerHTML = '<div style=\"height: 110vh; width: 100%\"></div>'\n\n      const result = new ScrollBarHelper().getWidth()\n\n      expect(result).toEqual(0)\n    })\n  })\n\n  describe('hide - reset', () => {\n    it('should adjust the inline padding of fixed elements which are full-width', () => {\n      fixtureEl.innerHTML = [\n        '<div style=\"height: 110vh; width: 100%\">',\n        '  <div class=\"fixed-top\" id=\"fixed1\" style=\"padding-right: 0px; width: 100vw\"></div>',\n        '  <div class=\"fixed-top\" id=\"fixed2\" style=\"padding-right: 5px; width: 100vw\"></div>',\n        '</div>'\n      ].join('')\n      doc.style.overflowY = 'scroll'\n\n      const fixedEl = fixtureEl.querySelector('#fixed1')\n      const fixedEl2 = fixtureEl.querySelector('#fixed2')\n      const originalPadding = getPaddingX(fixedEl)\n      const originalPadding2 = getPaddingX(fixedEl2)\n      const scrollBar = new ScrollBarHelper()\n      const expectedPadding = originalPadding + scrollBar.getWidth()\n      const expectedPadding2 = originalPadding2 + scrollBar.getWidth()\n\n      scrollBar.hide()\n\n      let currentPadding = getPaddingX(fixedEl)\n      let currentPadding2 = getPaddingX(fixedEl2)\n      expect(getPaddingAttr(fixedEl)).toEqual(`${originalPadding}px`)\n      expect(getPaddingAttr(fixedEl2)).toEqual(`${originalPadding2}px`)\n      expect(currentPadding).toEqual(expectedPadding)\n      expect(currentPadding2).toEqual(expectedPadding2)\n\n      scrollBar.reset()\n      currentPadding = getPaddingX(fixedEl)\n      currentPadding2 = getPaddingX(fixedEl2)\n      expect(getPaddingAttr(fixedEl)).toBeNull()\n      expect(getPaddingAttr(fixedEl2)).toBeNull()\n      expect(currentPadding).toEqual(originalPadding)\n      expect(currentPadding2).toEqual(originalPadding2)\n    })\n\n    it('should remove padding & margin if not existed before adjustment', () => {\n      fixtureEl.innerHTML = [\n        '<div style=\"height: 110vh; width: 100%\">',\n        '  <div class=\"fixed\" id=\"fixed\" style=\"width: 100vw;\"></div>',\n        '  <div class=\"sticky-top\" id=\"sticky\" style=\" width: 100vw;\"></div>',\n        '</div>'\n      ].join('')\n      doc.style.overflowY = 'scroll'\n\n      const fixedEl = fixtureEl.querySelector('#fixed')\n      const stickyEl = fixtureEl.querySelector('#sticky')\n      const scrollBar = new ScrollBarHelper()\n\n      scrollBar.hide()\n      scrollBar.reset()\n\n      expect(fixedEl.getAttribute('style').includes('padding-right')).toBeFalse()\n      expect(stickyEl.getAttribute('style').includes('margin-right')).toBeFalse()\n    })\n\n    it('should adjust the inline margin and padding of sticky elements', () => {\n      fixtureEl.innerHTML = [\n        '<div style=\"height: 110vh\">',\n        '  <div class=\"sticky-top\" style=\"margin-right: 10px; padding-right: 20px; width: 100vw; height: 10px\"></div>',\n        '</div>'\n      ].join('')\n      doc.style.overflowY = 'scroll'\n\n      const stickyTopEl = fixtureEl.querySelector('.sticky-top')\n      const originalMargin = getMarginX(stickyTopEl)\n      const originalPadding = getPaddingX(stickyTopEl)\n      const scrollBar = new ScrollBarHelper()\n      const expectedMargin = originalMargin - scrollBar.getWidth()\n      const expectedPadding = originalPadding + scrollBar.getWidth()\n      scrollBar.hide()\n\n      expect(getMarginAttr(stickyTopEl)).toEqual(`${originalMargin}px`)\n      expect(getMarginX(stickyTopEl)).toEqual(expectedMargin)\n      expect(getPaddingAttr(stickyTopEl)).toEqual(`${originalPadding}px`)\n      expect(getPaddingX(stickyTopEl)).toEqual(expectedPadding)\n\n      scrollBar.reset()\n      expect(getMarginAttr(stickyTopEl)).toBeNull()\n      expect(getMarginX(stickyTopEl)).toEqual(originalMargin)\n      expect(getPaddingAttr(stickyTopEl)).toBeNull()\n      expect(getPaddingX(stickyTopEl)).toEqual(originalPadding)\n    })\n\n    it('should not adjust the inline margin and padding of sticky and fixed elements when element do not have full width', () => {\n      fixtureEl.innerHTML = '<div class=\"sticky-top\" style=\"margin-right: 0px; padding-right: 0px; width: 50vw\"></div>'\n\n      const stickyTopEl = fixtureEl.querySelector('.sticky-top')\n      const originalMargin = getMarginX(stickyTopEl)\n      const originalPadding = getPaddingX(stickyTopEl)\n\n      const scrollBar = new ScrollBarHelper()\n      scrollBar.hide()\n\n      const currentMargin = getMarginX(stickyTopEl)\n      const currentPadding = getPaddingX(stickyTopEl)\n\n      expect(currentMargin).toEqual(originalMargin)\n      expect(currentPadding).toEqual(originalPadding)\n\n      scrollBar.reset()\n    })\n\n    it('should not put data-attribute if element doesn\\'t have the proper style property, should just remove style property if element didn\\'t had one', () => {\n      fixtureEl.innerHTML = [\n        '<div style=\"height: 110vh; width: 100%\">',\n        '  <div class=\"sticky-top\" id=\"sticky\" style=\"width: 100vw\"></div>',\n        '</div>'\n      ].join('')\n\n      document.body.style.overflowY = 'scroll'\n      const scrollBar = new ScrollBarHelper()\n\n      const hasPaddingAttr = el => el.hasAttribute('data-bs-padding-right')\n      const hasMarginAttr = el => el.hasAttribute('data-bs-margin-right')\n      const stickyEl = fixtureEl.querySelector('#sticky')\n      const originalPadding = getPaddingX(stickyEl)\n      const originalMargin = getMarginX(stickyEl)\n      const scrollBarWidth = scrollBar.getWidth()\n\n      scrollBar.hide()\n\n      expect(getPaddingX(stickyEl)).toEqual(scrollBarWidth + originalPadding)\n      const expectedMargin = scrollBarWidth + originalMargin\n      expect(getMarginX(stickyEl)).toEqual(expectedMargin === 0 ? expectedMargin : -expectedMargin)\n      expect(hasMarginAttr(stickyEl)).toBeFalse() // We do not have to keep css margin\n      expect(hasPaddingAttr(stickyEl)).toBeFalse() // We do not have to keep css padding\n\n      scrollBar.reset()\n\n      expect(getPaddingX(stickyEl)).toEqual(originalPadding)\n      expect(getPaddingX(stickyEl)).toEqual(originalPadding)\n    })\n\n    describe('Body Handling', () => {\n      it('should ignore other inline styles when trying to restore body defaults ', () => {\n        document.body.style.color = 'red'\n\n        const scrollBar = new ScrollBarHelper()\n        const scrollBarWidth = scrollBar.getWidth()\n        scrollBar.hide()\n\n        expect(getPaddingX(document.body)).toEqual(scrollBarWidth)\n        expect(document.body.style.color).toEqual('red')\n\n        scrollBar.reset()\n      })\n\n      it('should hide scrollbar and reset it to its initial value', () => {\n        const styleSheetPadding = '7px'\n        fixtureEl.innerHTML = [\n          '<style>',\n          '  body {',\n          `    padding-right: ${styleSheetPadding}`,\n          '  }',\n          '</style>'\n        ].join('')\n\n        const el = document.body\n        const inlineStylePadding = '10px'\n        el.style.paddingRight = inlineStylePadding\n\n        const originalPadding = getPaddingX(el)\n        expect(originalPadding).toEqual(parseIntDecimal(inlineStylePadding)) // Respect only the inline style as it has prevails this of css\n        const originalOverFlow = 'auto'\n        el.style.overflow = originalOverFlow\n        const scrollBar = new ScrollBarHelper()\n        const scrollBarWidth = scrollBar.getWidth()\n\n        scrollBar.hide()\n\n        const currentPadding = getPaddingX(el)\n\n        expect(currentPadding).toEqual(scrollBarWidth + originalPadding)\n        expect(currentPadding).toEqual(scrollBarWidth + parseIntDecimal(inlineStylePadding))\n        expect(getPaddingAttr(el)).toEqual(inlineStylePadding)\n        expect(getOverFlow(el)).toEqual('hidden')\n        expect(getOverFlowAttr(el)).toEqual(originalOverFlow)\n\n        scrollBar.reset()\n\n        const currentPadding1 = getPaddingX(el)\n        expect(currentPadding1).toEqual(originalPadding)\n        expect(getPaddingAttr(el)).toBeNull()\n        expect(getOverFlow(el)).toEqual(originalOverFlow)\n        expect(getOverFlowAttr(el)).toBeNull()\n      })\n\n      it('should hide scrollbar and reset it to its initial value - respecting css rules', () => {\n        const styleSheetPadding = '7px'\n        fixtureEl.innerHTML = [\n          '<style>',\n          '  body {',\n          `    padding-right: ${styleSheetPadding}`,\n          '  }',\n          '</style>'\n        ].join('')\n        const el = document.body\n        const originalPadding = getPaddingX(el)\n        const originalOverFlow = 'scroll'\n        el.style.overflow = originalOverFlow\n        const scrollBar = new ScrollBarHelper()\n        const scrollBarWidth = scrollBar.getWidth()\n\n        scrollBar.hide()\n\n        const currentPadding = getPaddingX(el)\n\n        expect(currentPadding).toEqual(scrollBarWidth + originalPadding)\n        expect(currentPadding).toEqual(scrollBarWidth + parseIntDecimal(styleSheetPadding))\n        expect(getPaddingAttr(el)).toBeNull() // We do not have to keep css padding\n        expect(getOverFlow(el)).toEqual('hidden')\n        expect(getOverFlowAttr(el)).toEqual(originalOverFlow)\n\n        scrollBar.reset()\n\n        const currentPadding1 = getPaddingX(el)\n        expect(currentPadding1).toEqual(originalPadding)\n        expect(getPaddingAttr(el)).toBeNull()\n        expect(getOverFlow(el)).toEqual(originalOverFlow)\n        expect(getOverFlowAttr(el)).toBeNull()\n      })\n\n      it('should not adjust the inline body padding when it does not overflow', () => {\n        const originalPadding = getPaddingX(document.body)\n        const scrollBar = new ScrollBarHelper()\n\n        // Hide scrollbars to prevent the body overflowing\n        doc.style.overflowY = 'hidden'\n        doc.style.paddingRight = '0px'\n\n        scrollBar.hide()\n        const currentPadding = getPaddingX(document.body)\n\n        expect(currentPadding).toEqual(originalPadding)\n        scrollBar.reset()\n      })\n\n      it('should not adjust the inline body padding when it does not overflow, even on a scaled display', () => {\n        const originalPadding = getPaddingX(document.body)\n        const scrollBar = new ScrollBarHelper()\n        // Remove body margins as would be done by Bootstrap css\n        document.body.style.margin = '0'\n\n        // Hide scrollbars to prevent the body overflowing\n        doc.style.overflowY = 'hidden'\n\n        // Simulate a discrepancy between exact, i.e. floating point body width, and rounded body width\n        // as it can occur when zooming or scaling the display to something else than 100%\n        doc.style.paddingRight = '.48px'\n        scrollBar.hide()\n\n        const currentPadding = getPaddingX(document.body)\n\n        expect(currentPadding).toEqual(originalPadding)\n\n        scrollBar.reset()\n      })\n    })\n  })\n})\n"
  },
  {
    "path": "js/tests/unit/util/swipe.spec.js",
    "content": "import EventHandler from '../../../src/dom/event-handler.js'\nimport { noop } from '../../../src/util/index.js'\nimport Swipe from '../../../src/util/swipe.js'\nimport { clearFixture, getFixture } from '../../helpers/fixture.js'\n\ndescribe('Swipe', () => {\n  const { Simulator, PointerEvent } = window\n  const originWinPointerEvent = PointerEvent\n  const supportPointerEvent = Boolean(PointerEvent)\n\n  let fixtureEl\n  let swipeEl\n  const clearPointerEvents = () => {\n    window.PointerEvent = null\n  }\n\n  const restorePointerEvents = () => {\n    window.PointerEvent = originWinPointerEvent\n  }\n\n  // The headless browser does not support touch events, so we need to fake it\n  // in order to test that touch events are added properly\n  const defineDocumentElementOntouchstart = () => {\n    document.documentElement.ontouchstart = noop\n  }\n\n  const deleteDocumentElementOntouchstart = () => {\n    delete document.documentElement.ontouchstart\n  }\n\n  const mockSwipeGesture = (element, options = {}, type = 'touch') => {\n    Simulator.setType(type)\n    const _options = { deltaX: 0, deltaY: 0, ...options }\n\n    Simulator.gestures.swipe(element, _options)\n  }\n\n  beforeEach(() => {\n    fixtureEl = getFixture()\n    const cssStyle = [\n      '<style>',\n      '  #fixture .pointer-event {',\n      '    touch-action: pan-y;',\n      '  }',\n      '  #fixture div {',\n      '    width: 300px;',\n      '    height: 300px;',\n      '  }',\n      '</style>'\n    ].join('')\n\n    fixtureEl.innerHTML = `<div id=\"swipeEl\"></div>${cssStyle}`\n    swipeEl = fixtureEl.querySelector('div')\n  })\n\n  afterEach(() => {\n    clearFixture()\n    deleteDocumentElementOntouchstart()\n  })\n\n  describe('constructor', () => {\n    it('should add touch event listeners by default', () => {\n      defineDocumentElementOntouchstart()\n\n      spyOn(Swipe.prototype, '_initEvents').and.callThrough()\n      const swipe = new Swipe(swipeEl)\n      expect(swipe._initEvents).toHaveBeenCalled()\n    })\n\n    it('should not add touch event listeners if touch is not supported', () => {\n      spyOn(Swipe, 'isSupported').and.returnValue(false)\n\n      spyOn(Swipe.prototype, '_initEvents').and.callThrough()\n      const swipe = new Swipe(swipeEl)\n\n      expect(swipe._initEvents).not.toHaveBeenCalled()\n    })\n  })\n\n  describe('Config', () => {\n    it('Test leftCallback', () => {\n      return new Promise(resolve => {\n        const spyRight = jasmine.createSpy('spy')\n        clearPointerEvents()\n        defineDocumentElementOntouchstart()\n        // eslint-disable-next-line no-new\n        new Swipe(swipeEl, {\n          leftCallback() {\n            expect(spyRight).not.toHaveBeenCalled()\n            restorePointerEvents()\n            resolve()\n          },\n          rightCallback: spyRight\n        })\n\n        mockSwipeGesture(swipeEl, {\n          pos: [300, 10],\n          deltaX: -300\n        })\n      })\n    })\n\n    it('Test rightCallback', () => {\n      return new Promise(resolve => {\n        const spyLeft = jasmine.createSpy('spy')\n        clearPointerEvents()\n        defineDocumentElementOntouchstart()\n        // eslint-disable-next-line no-new\n        new Swipe(swipeEl, {\n          rightCallback() {\n            expect(spyLeft).not.toHaveBeenCalled()\n            restorePointerEvents()\n            resolve()\n          },\n          leftCallback: spyLeft\n        })\n\n        mockSwipeGesture(swipeEl, {\n          pos: [10, 10],\n          deltaX: 300\n        })\n      })\n    })\n\n    it('Test endCallback', () => {\n      return new Promise(resolve => {\n        clearPointerEvents()\n        defineDocumentElementOntouchstart()\n        let isFirstTime = true\n\n        const callback = () => {\n          if (isFirstTime) {\n            isFirstTime = false\n            return\n          }\n\n          expect().nothing()\n          restorePointerEvents()\n          resolve()\n        }\n\n        // eslint-disable-next-line no-new\n        new Swipe(swipeEl, {\n          endCallback: callback\n        })\n        mockSwipeGesture(swipeEl, {\n          pos: [10, 10],\n          deltaX: 300\n        })\n\n        mockSwipeGesture(swipeEl, {\n          pos: [300, 10],\n          deltaX: -300\n        })\n      })\n    })\n  })\n\n  describe('Functionality on PointerEvents', () => {\n    it('should not allow pinch with touch events', () => {\n      Simulator.setType('touch')\n      clearPointerEvents()\n      deleteDocumentElementOntouchstart()\n\n      const swipe = new Swipe(swipeEl)\n      const spy = spyOn(swipe, '_handleSwipe')\n\n      mockSwipeGesture(swipeEl, {\n        pos: [300, 10],\n        deltaX: -300,\n        deltaY: 0,\n        touches: 2\n      })\n\n      restorePointerEvents()\n      expect(spy).not.toHaveBeenCalled()\n    })\n\n    it('should allow swipeRight and call \"rightCallback\" with pointer events', () => {\n      return new Promise(resolve => {\n        if (!supportPointerEvent) {\n          expect().nothing()\n          resolve()\n          return\n        }\n\n        const style = '#fixture .pointer-event { touch-action: none !important; }'\n        fixtureEl.innerHTML += style\n\n        defineDocumentElementOntouchstart()\n        // eslint-disable-next-line no-new\n        new Swipe(swipeEl, {\n          rightCallback() {\n            deleteDocumentElementOntouchstart()\n            expect().nothing()\n            resolve()\n          }\n        })\n\n        mockSwipeGesture(swipeEl, { deltaX: 300 }, 'pointer')\n      })\n    })\n\n    it('should allow swipeLeft and call \"leftCallback\" with pointer events', () => {\n      return new Promise(resolve => {\n        if (!supportPointerEvent) {\n          expect().nothing()\n          resolve()\n          return\n        }\n\n        const style = '#fixture .pointer-event { touch-action: none !important; }'\n        fixtureEl.innerHTML += style\n\n        defineDocumentElementOntouchstart()\n        // eslint-disable-next-line no-new\n        new Swipe(swipeEl, {\n          leftCallback() {\n            expect().nothing()\n            deleteDocumentElementOntouchstart()\n            resolve()\n          }\n        })\n\n        mockSwipeGesture(swipeEl, {\n          pos: [300, 10],\n          deltaX: -300\n        }, 'pointer')\n      })\n    })\n  })\n\n  describe('Dispose', () => {\n    it('should call EventHandler.off', () => {\n      defineDocumentElementOntouchstart()\n      spyOn(EventHandler, 'off').and.callThrough()\n      const swipe = new Swipe(swipeEl)\n\n      swipe.dispose()\n      expect(EventHandler.off).toHaveBeenCalledWith(swipeEl, '.bs.swipe')\n    })\n\n    it('should destroy', () => {\n      const addEventSpy = spyOn(fixtureEl, 'addEventListener').and.callThrough()\n      const removeEventSpy = spyOn(EventHandler, 'off').and.callThrough()\n      defineDocumentElementOntouchstart()\n\n      const swipe = new Swipe(fixtureEl)\n\n      const expectedArgs =\n        swipe._supportPointerEvents ?\n          [\n            ['pointerdown', jasmine.any(Function), jasmine.any(Boolean)],\n            ['pointerup', jasmine.any(Function), jasmine.any(Boolean)]\n          ] :\n          [\n            ['touchstart', jasmine.any(Function), jasmine.any(Boolean)],\n            ['touchmove', jasmine.any(Function), jasmine.any(Boolean)],\n            ['touchend', jasmine.any(Function), jasmine.any(Boolean)]\n          ]\n\n      expect(addEventSpy.calls.allArgs()).toEqual(expectedArgs)\n\n      swipe.dispose()\n\n      expect(removeEventSpy).toHaveBeenCalledWith(fixtureEl, '.bs.swipe')\n      deleteDocumentElementOntouchstart()\n    })\n  })\n\n  describe('\"isSupported\" static', () => {\n    it('should return \"true\" if \"touchstart\" exists in document element)', () => {\n      Object.defineProperty(window.navigator, 'maxTouchPoints', () => 0)\n      defineDocumentElementOntouchstart()\n\n      expect(Swipe.isSupported()).toBeTrue()\n    })\n\n    it('should return \"false\" if \"touchstart\" not exists in document element and \"navigator.maxTouchPoints\" are zero (0)', () => {\n      Object.defineProperty(window.navigator, 'maxTouchPoints', () => 0)\n      deleteDocumentElementOntouchstart()\n\n      if ('ontouchstart' in document.documentElement) {\n        expect().nothing()\n        return\n      }\n\n      expect(Swipe.isSupported()).toBeFalse()\n    })\n  })\n})\n"
  },
  {
    "path": "js/tests/unit/util/template-factory.spec.js",
    "content": "import TemplateFactory from '../../../src/util/template-factory.js'\nimport { clearFixture, getFixture } from '../../helpers/fixture.js'\n\ndescribe('TemplateFactory', () => {\n  let fixtureEl\n\n  beforeAll(() => {\n    fixtureEl = getFixture()\n  })\n\n  afterEach(() => {\n    clearFixture()\n  })\n\n  describe('NAME', () => {\n    it('should return plugin NAME', () => {\n      expect(TemplateFactory.NAME).toEqual('TemplateFactory')\n    })\n  })\n\n  describe('Default', () => {\n    it('should return plugin default config', () => {\n      expect(TemplateFactory.Default).toEqual(jasmine.any(Object))\n    })\n  })\n\n  describe('toHtml', () => {\n    describe('Sanitization', () => {\n      it('should use \"sanitizeHtml\" to sanitize template', () => {\n        const factory = new TemplateFactory({\n          sanitize: true,\n          template: '<div><a href=\"javascript:alert(7)\">Click me</a></div>'\n        })\n        const spy = spyOn(factory, '_maybeSanitize').and.callThrough()\n\n        expect(factory.toHtml().innerHTML).not.toContain('href=\"javascript:alert(7)')\n        expect(spy).toHaveBeenCalled()\n      })\n\n      it('should not sanitize template', () => {\n        const factory = new TemplateFactory({\n          sanitize: false,\n          template: '<div><a href=\"javascript:alert(7)\">Click me</a></div>'\n        })\n        const spy = spyOn(factory, '_maybeSanitize').and.callThrough()\n\n        expect(factory.toHtml().innerHTML).toContain('href=\"javascript:alert(7)')\n        expect(spy).toHaveBeenCalled()\n      })\n\n      it('should use \"sanitizeHtml\" to sanitize content', () => {\n        const factory = new TemplateFactory({\n          sanitize: true,\n          html: true,\n          template: '<div id=\"foo\"></div>',\n          content: { '#foo': '<a href=\"javascript:alert(7)\">Click me</a>' }\n        })\n        expect(factory.toHtml().innerHTML).not.toContain('href=\"javascript:alert(7)')\n      })\n\n      it('should not sanitize content', () => {\n        const factory = new TemplateFactory({\n          sanitize: false,\n          html: true,\n          template: '<div id=\"foo\"></div>',\n          content: { '#foo': '<a href=\"javascript:alert(7)\">Click me</a>' }\n        })\n        expect(factory.toHtml().innerHTML).toContain('href=\"javascript:alert(7)')\n      })\n\n      it('should sanitize content only if \"config.html\" is enabled', () => {\n        const factory = new TemplateFactory({\n          sanitize: true,\n          html: false,\n          template: '<div id=\"foo\"></div>',\n          content: { '#foo': '<a href=\"javascript:alert(7)\">Click me</a>' }\n        })\n        const spy = spyOn(factory, '_maybeSanitize').and.callThrough()\n\n        expect(spy).not.toHaveBeenCalled()\n      })\n    })\n\n    describe('Extra Class', () => {\n      it('should add extra class', () => {\n        const factory = new TemplateFactory({\n          extraClass: 'testClass'\n        })\n        expect(factory.toHtml()).toHaveClass('testClass')\n      })\n\n      it('should add extra classes', () => {\n        const factory = new TemplateFactory({\n          extraClass: 'testClass testClass2'\n        })\n        expect(factory.toHtml()).toHaveClass('testClass')\n        expect(factory.toHtml()).toHaveClass('testClass2')\n      })\n\n      it('should resolve class if function is given', () => {\n        const factory = new TemplateFactory({\n          extraClass(arg) {\n            expect(arg).toEqual(factory)\n            return 'testClass'\n          }\n        })\n\n        expect(factory.toHtml()).toHaveClass('testClass')\n      })\n    })\n  })\n\n  describe('Content', () => {\n    it('add simple text content', () => {\n      const template = [\n        '<div>',\n        '  <div class=\"foo\"></div>',\n        '  <div class=\"foo2\"></div>',\n        '</div>'\n      ].join('')\n\n      const factory = new TemplateFactory({\n        template,\n        content: {\n          '.foo': 'bar',\n          '.foo2': 'bar2'\n        }\n      })\n\n      const html = factory.toHtml()\n      expect(html.querySelector('.foo').textContent).toEqual('bar')\n      expect(html.querySelector('.foo2').textContent).toEqual('bar2')\n    })\n\n    it('should not fill template if selector not exists', () => {\n      const factory = new TemplateFactory({\n        sanitize: true,\n        html: true,\n        template: '<div id=\"foo\"></div>',\n        content: { '#bar': 'test' }\n      })\n\n      expect(factory.toHtml().outerHTML).toEqual('<div id=\"foo\"></div>')\n    })\n\n    it('should remove template selector, if content is null', () => {\n      const factory = new TemplateFactory({\n        sanitize: true,\n        html: true,\n        template: '<div><div id=\"foo\"></div></div>',\n        content: { '#foo': null }\n      })\n\n      expect(factory.toHtml().outerHTML).toEqual('<div></div>')\n    })\n\n    it('should resolve content if is function', () => {\n      const factory = new TemplateFactory({\n        sanitize: true,\n        html: true,\n        template: '<div><div id=\"foo\"></div></div>',\n        content: { '#foo': () => null }\n      })\n\n      expect(factory.toHtml().outerHTML).toEqual('<div></div>')\n    })\n\n    it('if content is element and \"config.html=false\", should put content\\'s textContent', () => {\n      fixtureEl.innerHTML = '<div>foo<span>bar</span></div>'\n      const contentElement = fixtureEl.querySelector('div')\n\n      const factory = new TemplateFactory({\n        html: false,\n        template: '<div><div id=\"foo\"></div></div>',\n        content: { '#foo': contentElement }\n      })\n\n      const fooEl = factory.toHtml().querySelector('#foo')\n      expect(fooEl.innerHTML).not.toEqual(contentElement.innerHTML)\n      expect(fooEl.textContent).toEqual(contentElement.textContent)\n      expect(fooEl.textContent).toEqual('foobar')\n    })\n\n    it('if content is element and \"config.html=true\", should put content\\'s outerHtml as child', () => {\n      fixtureEl.innerHTML = '<div>foo<span>bar</span></div>'\n      const contentElement = fixtureEl.querySelector('div')\n\n      const factory = new TemplateFactory({\n        html: true,\n        template: '<div><div id=\"foo\"></div></div>',\n        content: { '#foo': contentElement }\n      })\n\n      const fooEl = factory.toHtml().querySelector('#foo')\n      expect(fooEl.innerHTML).toEqual(contentElement.outerHTML)\n      expect(fooEl.textContent).toEqual(contentElement.textContent)\n    })\n  })\n\n  describe('getContent', () => {\n    it('should get content as array', () => {\n      const factory = new TemplateFactory({\n        content: {\n          '.foo': 'bar',\n          '.foo2': 'bar2'\n        }\n      })\n      expect(factory.getContent()).toEqual(['bar', 'bar2'])\n    })\n\n    it('should filter empties', () => {\n      const factory = new TemplateFactory({\n        content: {\n          '.foo': 'bar',\n          '.foo2': '',\n          '.foo3': null,\n          '.foo4': () => 2,\n          '.foo5': () => null\n        }\n      })\n      expect(factory.getContent()).toEqual(['bar', 2])\n    })\n  })\n\n  describe('hasContent', () => {\n    it('should return true, if it has', () => {\n      const factory = new TemplateFactory({\n        content: {\n          '.foo': 'bar',\n          '.foo2': 'bar2',\n          '.foo3': ''\n        }\n      })\n      expect(factory.hasContent()).toBeTrue()\n    })\n\n    it('should return false, if filtered content is empty', () => {\n      const factory = new TemplateFactory({\n        content: {\n          '.foo2': '',\n          '.foo3': null,\n          '.foo4': () => null\n        }\n      })\n      expect(factory.hasContent()).toBeFalse()\n    })\n  })\n\n  describe('changeContent', () => {\n    it('should change Content', () => {\n      const template = [\n        '<div>',\n        '  <div class=\"foo\"></div>',\n        '  <div class=\"foo2\"></div>',\n        '</div>'\n      ].join('')\n\n      const factory = new TemplateFactory({\n        template,\n        content: {\n          '.foo': 'bar',\n          '.foo2': 'bar2'\n        }\n      })\n\n      const html = selector => factory.toHtml().querySelector(selector).textContent\n      expect(html('.foo')).toEqual('bar')\n      expect(html('.foo2')).toEqual('bar2')\n      factory.changeContent({\n        '.foo': 'test',\n        '.foo2': 'test2'\n      })\n\n      expect(html('.foo')).toEqual('test')\n      expect(html('.foo2')).toEqual('test2')\n    })\n\n    it('should change only the given, content', () => {\n      const template = [\n        '<div>',\n        '  <div class=\"foo\"></div>',\n        '  <div class=\"foo2\"></div>',\n        '</div>'\n      ].join('')\n\n      const factory = new TemplateFactory({\n        template,\n        content: {\n          '.foo': 'bar',\n          '.foo2': 'bar2'\n        }\n      })\n\n      const html = selector => factory.toHtml().querySelector(selector).textContent\n      expect(html('.foo')).toEqual('bar')\n      expect(html('.foo2')).toEqual('bar2')\n      factory.changeContent({\n        '.foo': 'test',\n        '.wrong': 'wrong'\n      })\n\n      expect(html('.foo')).toEqual('test')\n      expect(html('.foo2')).toEqual('bar2')\n    })\n  })\n})\n"
  },
  {
    "path": "js/tests/visual/alert.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <link href=\"../../../dist/css/bootstrap.min.css\" rel=\"stylesheet\">\n    <title>Alert</title>\n  </head>\n  <body>\n    <div class=\"container\">\n      <h1>Alert <small>Bootstrap Visual Test</small></h1>\n\n      <div class=\"alert alert-warning alert-dismissible fade show\" role=\"alert\">\n        <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"alert\" aria-label=\"Close\"></button>\n        <strong>Holy guacamole!</strong> You should check in on some of those fields below.\n      </div>\n\n      <div class=\"alert alert-danger alert-dismissible fade show\" role=\"alert\">\n        <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"alert\" aria-label=\"Close\"></button>\n        <p>\n          <strong>Oh snap!</strong> <a href=\"#\" class=\"alert-link\">Change a few things up</a> and try submitting again.\n        </p>\n        <p>\n          <button type=\"button\" class=\"btn btn-danger\">Danger</button>\n          <button type=\"button\" class=\"btn btn-secondary\">Secondary</button>\n        </p>\n      </div>\n\n      <div class=\"alert alert-danger alert-dismissible fade show\" role=\"alert\">\n        <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"alert\" aria-label=\"Close\"></button>\n        <p>\n          <strong>Oh snap!</strong> <a href=\"#\" class=\"alert-link\">Change a few things up</a> and try submitting again. Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Cras mattis consectetur purus sit amet fermentum.\n        </p>\n        <p>\n          <button type=\"button\" class=\"btn btn-danger\">Take this action</button>\n          <button type=\"button\" class=\"btn btn-primary\">Or do this</button>\n        </p>\n      </div>\n\n      <div class=\"alert alert-warning alert-dismissible fade show\" role=\"alert\" style=\"transition-duration: 5s;\">\n        <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"alert\" aria-label=\"Close\"></button>\n        This alert will take 5 seconds to fade out.\n      </div>\n    </div>\n\n    <script src=\"../../../dist/js/bootstrap.bundle.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "js/tests/visual/button.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <link href=\"../../../dist/css/bootstrap.min.css\" rel=\"stylesheet\">\n    <title>Button</title>\n  </head>\n  <body>\n    <div class=\"container\">\n      <h1>Button <small>Bootstrap Visual Test</small></h1>\n\n      <button type=\"button\" class=\"btn btn-primary\" data-bs-toggle=\"button\" aria-pressed=\"false\" autocomplete=\"off\">\n        Single toggle\n      </button>\n\n      <p>For checkboxes and radio buttons, ensure that keyboard behavior is functioning correctly.</p>\n      <p>Navigate to the checkboxes with the keyboard (generally, using <kbd>Tab</kbd> / <kbd><kbd>Shift</kbd> + <kbd>Tab</kbd></kbd>), and ensure that <kbd>Space</kbd> toggles the currently focused checkbox. Click on one of the checkboxes using the mouse, ensure that focus was correctly set on the actual checkbox, and that <kbd>Space</kbd> toggles the checkbox again.</p>\n\n      <div class=\"btn-group\" data-bs-toggle=\"buttons\">\n        <label class=\"btn btn-primary active\">\n          <input type=\"checkbox\" checked autocomplete=\"off\"> Checkbox 1 (pre-checked)\n        </label>\n        <label class=\"btn btn-primary\">\n          <input type=\"checkbox\" autocomplete=\"off\"> Checkbox 2\n        </label>\n        <label class=\"btn btn-primary\">\n          <input type=\"checkbox\" autocomplete=\"off\"> Checkbox 3\n        </label>\n      </div>\n\n      <p>Navigate to the radio button group with the keyboard (generally, using <kbd>Tab</kbd> / <kbd><kbd>Shift</kbd> + <kbd>Tab</kbd></kbd>). If no radio button was initially set to be selected, the first/last radio button should receive focus (depending on whether you navigated \"forward\" to the group with <kbd>Tab</kbd> or \"backwards\" using <kbd><kbd>Shift</kbd> + <kbd>Tab</kbd></kbd>). If a radio button was already selected, navigating with the keyboard should set focus to that particular radio button. Only one radio button in a group should receive focus at any given time.  Ensure that the selected radio button can be changed by using the <kbd>←</kbd> and <kbd>→</kbd> arrow keys. Click on one of the radio buttons with the mouse,  ensure that focus was correctly set on the actual radio button, and that <kbd>←</kbd> and <kbd>→</kbd> change the selected radio button again.</p>\n\n      <div class=\"btn-group\" data-bs-toggle=\"buttons\">\n        <label class=\"btn btn-primary active\">\n          <input type=\"radio\" name=\"options\" id=\"option1\" autocomplete=\"off\" checked> Radio 1 (preselected)\n        </label>\n        <label class=\"btn btn-primary\">\n          <input type=\"radio\" name=\"options\" id=\"option2\" autocomplete=\"off\"> Radio 2\n        </label>\n        <label class=\"btn btn-primary\">\n          <input type=\"radio\" name=\"options\" id=\"option3\" autocomplete=\"off\"> Radio 3\n        </label>\n      </div>\n    </div>\n\n    <script src=\"../../../dist/js/bootstrap.bundle.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "js/tests/visual/carousel.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <link href=\"../../../dist/css/bootstrap.min.css\" rel=\"stylesheet\">\n    <title>Carousel</title>\n    <style>\n      .carousel-item {\n        transition: transform 2s ease, opacity .5s ease;\n      }\n    </style>\n  </head>\n  <body>\n    <div class=\"container\">\n      <h1>Carousel <small>Bootstrap Visual Test</small></h1>\n\n      <p>The transition duration should be around 2s. Also, the carousel shouldn't slide when its window/tab is hidden. Check the console log.</p>\n\n      <div id=\"carousel-example-generic\" class=\"carousel slide\" data-bs-ride=\"carousel\">\n        <div class=\"carousel-indicators\">\n          <button type=\"button\" data-bs-target=\"#carousel-example-generic\" data-bs-slide-to=\"0\" class=\"active\" aria-current=\"true\" aria-label=\"Slide 1\"></button>\n          <button type=\"button\" data-bs-target=\"#carousel-example-generic\" data-bs-slide-to=\"1\" aria-label=\"Slide 2\"></button>\n          <button type=\"button\" data-bs-target=\"#carousel-example-generic\" data-bs-slide-to=\"2\" aria-label=\"Slide 3\"></button>\n        </div>\n        <div class=\"carousel-inner\">\n          <div class=\"carousel-item active\">\n            <img src=\"https://i.imgur.com/iEZgY7Y.jpg\" alt=\"First slide\">\n          </div>\n          <div class=\"carousel-item\">\n            <img src=\"https://i.imgur.com/eNWn1Xs.jpg\" alt=\"Second slide\">\n          </div>\n          <div class=\"carousel-item\">\n            <img src=\"https://i.imgur.com/Nm7xoti.jpg\" alt=\"Third slide\">\n          </div>\n        </div>\n        <button class=\"carousel-control-prev\" data-bs-target=\"#carousel-example-generic\" type=\"button\" data-bs-slide=\"prev\">\n          <span class=\"carousel-control-prev-icon\" aria-hidden=\"true\"></span>\n          <span class=\"visually-hidden\">Previous</span>\n        </button>\n        <button class=\"carousel-control-next\" data-bs-target=\"#carousel-example-generic\" type=\"button\" data-bs-slide=\"next\">\n          <span class=\"carousel-control-next-icon\" aria-hidden=\"true\"></span>\n          <span class=\"visually-hidden\">Next</span>\n        </button>\n      </div>\n    </div>\n\n    <script src=\"../../../dist/js/bootstrap.bundle.js\"></script>\n    <script>\n      let t0\n      let t1\n      const carousel = document.getElementById('carousel-example-generic')\n\n      // Test to show that the carousel doesn't slide when the current tab isn't visible\n      // Test to show that transition-duration can be changed with css\n      carousel.addEventListener('slid.bs.carousel', event => {\n        t1 = performance.now()\n        console.log(`transition-duration took ${t1 - t0}ms, slid at ${event.timeStamp}`)\n      })\n      carousel.addEventListener('slide.bs.carousel', () => {\n        t0 = performance.now()\n      })\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "js/tests/visual/collapse.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <link href=\"../../../dist/css/bootstrap.min.css\" rel=\"stylesheet\">\n    <title>Collapse</title>\n  </head>\n  <body>\n    <div class=\"container\">\n      <h1>Collapse <small>Bootstrap Visual Test</small></h1>\n\n      <div id=\"accordion\" role=\"tablist\">\n        <div class=\"card\" role=\"presentation\">\n          <div class=\"card-header\" role=\"tab\" id=\"headingOne\">\n            <h5 class=\"mb-0\">\n              <a data-bs-toggle=\"collapse\" href=\"#collapseOne\" aria-expanded=\"true\" aria-controls=\"collapseOne\">\n                Collapsible Group Item #1\n              </a>\n            </h5>\n          </div>\n\n          <div id=\"collapseOne\" class=\"collapse show\" data-bs-parent=\"#accordion\" role=\"tabpanel\" aria-labelledby=\"headingOne\">\n            <div class=\"card-body\">\n              Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS.\n            </div>\n          </div>\n        </div>\n        <div class=\"card\" role=\"presentation\">\n          <div class=\"card-header\" role=\"tab\" id=\"headingTwo\">\n            <h5 class=\"mb-0\">\n              <a class=\"collapsed\" data-bs-toggle=\"collapse\" href=\"#collapseTwo\" aria-expanded=\"false\" aria-controls=\"collapseTwo\">\n                Collapsible Group Item #2\n              </a>\n            </h5>\n          </div>\n          <div id=\"collapseTwo\" class=\"collapse\" data-bs-parent=\"#accordion\" role=\"tabpanel\" aria-labelledby=\"headingTwo\">\n            <div class=\"card-body\">\n              Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS.\n            </div>\n          </div>\n        </div>\n        <div class=\"card\" role=\"presentation\">\n          <div class=\"card-header\" role=\"tab\" id=\"headingThree\">\n            <h5 class=\"mb-0\">\n              <a class=\"collapsed\" data-bs-toggle=\"collapse\" href=\"#collapseThree\" aria-expanded=\"false\" aria-controls=\"collapseThree\">\n                Collapsible Group Item #3\n              </a>\n            </h5>\n          </div>\n          <div id=\"collapseThree\" class=\"collapse\" data-bs-parent=\"#accordion\" role=\"tabpanel\" aria-labelledby=\"headingThree\">\n            <div class=\"card-body\">\n              Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS.\n            </div>\n          </div>\n        </div>\n        <div class=\"card\" role=\"presentation\">\n          <div class=\"card-header\" role=\"tab\" id=\"headingFour\">\n            <h5 class=\"mb-0\">\n              <a class=\"collapsed\" data-bs-toggle=\"collapse\" href=\"#collapseFour\" aria-expanded=\"false\" aria-controls=\"collapseFour\">\n                Collapsible Group Item with XSS in data-bs-parent\n              </a>\n            </h5>\n          </div>\n          <div id=\"collapseFour\" class=\"collapse\" data-bs-parent=\"<img src=1 onerror=alert(123)>\" role=\"tabpanel\" aria-labelledby=\"headingFour\">\n            <div class=\"card-body\">\n              Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS.\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n\n    <script src=\"../../../dist/js/bootstrap.bundle.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "js/tests/visual/dropdown.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <link href=\"../../../dist/css/bootstrap.min.css\" rel=\"stylesheet\">\n    <title>Dropdown</title>\n  </head>\n  <body>\n    <div class=\"container\">\n      <h1>Dropdown <small>Bootstrap Visual Test</small></h1>\n\n      <nav class=\"navbar navbar-expand-md bg-light\">\n        <a class=\"navbar-brand\" href=\"#\">Navbar</a>\n        <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbarResponsive\" aria-controls=\"navbarResponsive\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n          <span class=\"navbar-toggler-icon\"></span>\n        </button>\n\n        <div class=\"collapse navbar-collapse\" id=\"navbarResponsive\">\n          <ul class=\"navbar-nav\">\n            <li class=\"nav-item\">\n              <a class=\"nav-link active\" href=\"#\" aria-current=\"page\">Home</a>\n            </li>\n            <li class=\"nav-item\">\n              <a class=\"nav-link\" href=\"#\">Link</a>\n            </li>\n            <li class=\"nav-item\">\n              <a class=\"nav-link\" href=\"#\">Link</a>\n            </li>\n            <li class=\"nav-item dropdown\">\n              <a class=\"nav-link dropdown-toggle\" href=\"#\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">Dropdown</a>\n              <ul class=\"dropdown-menu\">\n                <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n                <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n                <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n              </ul>\n            </li>\n          </ul>\n        </div>\n      </nav>\n\n      <ul class=\"nav nav-pills mt-3\">\n        <li class=\"nav-item\">\n          <a class=\"nav-link active\" href=\"#\">Active</a>\n        </li>\n        <li class=\"nav-item\">\n          <a class=\"nav-link\" href=\"#\">Link</a>\n        </li>\n        <li class=\"nav-item\">\n          <a class=\"nav-link\" href=\"#\">Link</a>\n        </li>\n        <li class=\"nav-item dropdown\">\n          <a class=\"nav-link dropdown-toggle\" href=\"#\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">Dropdown</a>\n          <ul class=\"dropdown-menu\">\n            <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n            <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n            <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n          </ul>\n        </li>\n      </ul>\n\n      <div class=\"row\">\n        <div class=\"col-sm-12 mt-4\">\n          <div class=\"dropdown\">\n            <button type=\"button\" class=\"btn btn-secondary\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">Dropdown</button>\n            <div class=\"dropdown-menu\">\n              <input id=\"textField\" type=\"text\">\n            </div>\n          </div>\n          <div class=\"btn-group dropup\">\n            <button type=\"button\" class=\"btn btn-secondary\">Dropup split</button>\n            <button type=\"button\" class=\"btn btn-secondary dropdown-toggle\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n              <span class=\"visually-hidden\">Dropup split</span>\n            </button>\n            <ul class=\"dropdown-menu\">\n              <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n              <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n              <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n            </ul>\n          </div>\n        </div>\n\n        <div class=\"col-sm-12 mt-4\">\n          <div class=\"btn-group dropup\">\n            <button type=\"button\" class=\"btn btn-secondary dropdown-toggle\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">Dropup</button>\n            <ul class=\"dropdown-menu\">\n              <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n              <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n              <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n            </ul>\n          </div>\n\n          <div class=\"btn-group\">\n            <button type=\"button\" class=\"btn btn-secondary dropdown-toggle\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n              This dropdown's menu is end-aligned\n            </button>\n            <div class=\"dropdown-menu dropdown-menu-end\">\n              <button class=\"dropdown-item\" type=\"button\">Action</button>\n              <button class=\"dropdown-item\" type=\"button\">Another action</button>\n              <button class=\"dropdown-item\" type=\"button\">Something else here</button>\n            </div>\n          </div>\n        </div>\n\n        <div class=\"col-sm-12 mt-4\">\n          <div class=\"btn-group dropup\">\n            <a href=\"#\" class=\"btn btn-secondary\">Dropup split align end</a>\n            <button type=\"button\" id=\"dropdown-page-subheader-button-3\" class=\"btn btn-secondary dropdown-toggle dropdown-toggle-split\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n              <span class=\"visually-hidden\">Product actions</span>\n            </button>\n            <div class=\"dropdown-menu dropdown-menu-end\">\n              <button class=\"dropdown-item\" type=\"button\">Action</button>\n              <button class=\"dropdown-item\" type=\"button\">Another action</button>\n              <button class=\"dropdown-item\" type=\"button\">Something else here with a long text</button>\n            </div>\n          </div>\n          <div class=\"btn-group dropup\">\n            <button type=\"button\" class=\"btn btn-secondary dropdown-toggle\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">Dropup align end</button>\n            <div class=\"dropdown-menu dropdown-menu-end\">\n              <button class=\"dropdown-item\" type=\"button\">Action</button>\n              <button class=\"dropdown-item\" type=\"button\">Another action</button>\n              <button class=\"dropdown-item\" type=\"button\">Something else here with a long text</button>\n            </div>\n          </div>\n        </div>\n\n        <div class=\"col-sm-12 mt-4\">\n          <div class=\"btn-group dropend\">\n            <a href=\"#\" class=\"btn btn-secondary\">Dropend split</a>\n            <button type=\"button\" id=\"dropdown-page-subheader-button-4\" class=\"btn btn-secondary dropdown-toggle dropdown-toggle-split\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n              <span class=\"visually-hidden\">Product actions</span>\n            </button>\n            <div class=\"dropdown-menu\">\n              <button class=\"dropdown-item\" type=\"button\">Action</button>\n              <button class=\"dropdown-item\" type=\"button\">Another action</button>\n              <button class=\"dropdown-item\" type=\"button\">Something else here with a long text</button>\n            </div>\n          </div>\n          <div class=\"btn-group dropend\">\n            <button class=\"btn btn-secondary dropdown-toggle\" type=\"button\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n              Dropend\n            </button>\n            <div class=\"dropdown-menu\">\n              <button class=\"dropdown-item\" type=\"button\">Action</button>\n              <button class=\"dropdown-item\" type=\"button\">Another action</button>\n              <button class=\"dropdown-item\" type=\"button\">Something else here</button>\n            </div>\n          </div>\n          <!-- dropstart -->\n          <div class=\"btn-group dropstart\">\n            <a href=\"#\" class=\"btn btn-secondary\">Dropstart split</a>\n            <button type=\"button\" id=\"dropdown-page-subheader-button-5\" class=\"btn btn-secondary dropdown-toggle dropdown-toggle-split\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n              <span class=\"visually-hidden\">Product actions</span>\n            </button>\n            <div class=\"dropdown-menu\">\n              <button class=\"dropdown-item\" type=\"button\">Action</button>\n              <button class=\"dropdown-item\" type=\"button\">Another action</button>\n              <button class=\"dropdown-item\" type=\"button\">Something else here with a long text</button>\n            </div>\n          </div>\n          <div class=\"btn-group dropstart\">\n            <button class=\"btn btn-secondary dropdown-toggle\" type=\"button\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n              Dropstart\n            </button>\n            <div class=\"dropdown-menu\">\n              <button class=\"dropdown-item\" type=\"button\">Action</button>\n              <button class=\"dropdown-item\" type=\"button\">Another action</button>\n              <button class=\"dropdown-item\" type=\"button\">Something else here</button>\n            </div>\n          </div>\n        </div>\n      </div>\n\n      <div class=\"row\">\n        <div class=\"col-sm-3 mt-4\">\n          <div class=\"btn-group dropdown\">\n            <button type=\"button\" class=\"btn btn-secondary\">Dropdown reference</button>\n            <button type=\"button\" class=\"btn btn-secondary dropdown-toggle\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" data-bs-reference=\"parent\">\n              <span class=\"visually-hidden\">Dropdown split</span>\n            </button>\n            <ul class=\"dropdown-menu\">\n              <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n              <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n              <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n            </ul>\n          </div>\n        </div>\n        <div class=\"col-sm-3 mt-4\">\n          <div class=\"dropdown\">\n            <button class=\"btn btn-secondary dropdown-toggle\" type=\"button\" data-bs-toggle=\"dropdown\" data-bs-display=\"static\" aria-expanded=\"false\">\n              Dropdown menu without Popper\n            </button>\n            <ul class=\"dropdown-menu\">\n              <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n              <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n              <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n            </ul>\n          </div>\n        </div>\n      </div>\n    </div>\n\n    <script src=\"../../../dist/js/bootstrap.bundle.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "js/tests/visual/floating-label.html",
    "content": "<!doctype html>\n<html lang=\"zxx\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <link href=\"../../../dist/css/bootstrap.min.css\" rel=\"stylesheet\">\n    <title>Form</title>\n    <style></style>\n  </head>\n  <body>\n    <div class=\"container py-5 d-flex flex-column gap-3\">\n      <div class=\"form-floating\">\n        <input type=\"email\" class=\"form-control\" id=\"floatingInput\" placeholder=\"name@example.com\">\n        <label for=\"floatingInput\">Email address</label>\n      </div>\n      <div class=\"form-floating\">\n        <input type=\"email\" class=\"form-control\" id=\"floatingInput1\" placeholder=\"name@example.com\">\n        <label for=\"floatingInput1\">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum mattis mi at lobortis rutrum. Phasellus varius a risus non lobortis. Ut id congue enim. Quisque facilisis elit ac elit dapibus aliquet nec sit amet arcu. Morbi vitae ultricies eros. Proin varius augue in tristique pretium. Morbi at ullamcorper elit, at ullamcorper massa. Vivamus suscipit quam quis viverra eleifend.</label>\n      </div>\n      <form class=\"form-floating\">\n        <input type=\"email\" class=\"form-control\" id=\"floatingInputValue\" placeholder=\"name@example.com\" value=\"test@example.com\">\n        <label for=\"floatingInputValue\">Input with value</label>\n      </form>\n      <form class=\"form-floating\">\n        <input type=\"email\" class=\"form-control\" id=\"floatingInputValue1\" placeholder=\"name@example.com\" value=\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum mattis mi at lobortis rutrum. Phasellus varius a risus non lobortis. Ut id congue enim. Quisque facilisis elit ac elit dapibus aliquet nec sit amet arcu. Morbi vitae ultricies eros. Proin varius augue in tristique pretium. Morbi at ullamcorper elit, at ullamcorper massa. Vivamus suscipit quam quis viverra eleifend.\">\n        <label for=\"floatingInputValue1\">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum mattis mi at lobortis rutrum. Phasellus varius a risus non lobortis. Ut id congue enim. Quisque facilisis elit ac elit dapibus aliquet nec sit amet arcu. Morbi vitae ultricies eros. Proin varius augue in tristique pretium. Morbi at ullamcorper elit, at ullamcorper massa. Vivamus suscipit quam quis viverra eleifend.</label>\n      </form>\n      <form class=\"form-floating\">\n        <input type=\"email\" class=\"form-control is-invalid\" id=\"floatingInputInvalid\" placeholder=\"name@example.com\" value=\"test@example.com\">\n        <label for=\"floatingInputInvalid\">Invalid input</label>\n      </form>\n      <form class=\"form-floating\">\n        <input type=\"email\" class=\"form-control is-invalid\" id=\"floatingInputInvalid1\" placeholder=\"name@example.com\" value=\"test@example.com\">\n        <label for=\"floatingInputInvalid1\">Invalid input</label>\n      </form>\n      <form class=\"form-floating\">\n        <input type=\"email\" class=\"form-control is-invalid\" id=\"floatingInputInvalid2\" placeholder=\"name@example.com\">\n        <label for=\"floatingInputInvalid2\">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum mattis mi at lobortis rutrum. Phasellus varius a risus non lobortis. Ut id congue enim. Quisque facilisis elit ac elit dapibus aliquet nec sit amet arcu. Morbi vitae ultricies eros. Proin varius augue in tristique pretium. Morbi at ullamcorper elit, at ullamcorper massa. Vivamus suscipit quam quis viverra eleifend.</label>\n      </form>\n      <form class=\"form-floating\">\n        <input type=\"email\" class=\"form-control is-invalid\" id=\"floatingInputInvalid3\" placeholder=\"name@example.com\" value=\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum mattis mi at lobortis rutrum. Phasellus varius a risus non lobortis. Ut id congue enim. Quisque facilisis elit ac elit dapibus aliquet nec sit amet arcu. Morbi vitae ultricies eros. Proin varius augue in tristique pretium. Morbi at ullamcorper elit, at ullamcorper massa. Vivamus suscipit quam quis viverra eleifend.\">\n        <label for=\"floatingInputInvalid3\">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum mattis mi at lobortis rutrum. Phasellus varius a risus non lobortis. Ut id congue enim. Quisque facilisis elit ac elit dapibus aliquet nec sit amet arcu. Morbi vitae ultricies eros. Proin varius augue in tristique pretium. Morbi at ullamcorper elit, at ullamcorper massa. Vivamus suscipit quam quis viverra eleifend.</label>\n      </form>\n      <div class=\"form-floating\">\n        <textarea class=\"form-control\" placeholder=\"Leave a comment here\" id=\"floatingTextarea\"></textarea>\n        <label for=\"floatingTextarea\">Comments</label>\n      </div>\n      <div class=\"form-floating\">\n        <textarea class=\"form-control\" placeholder=\"Leave a comment here\" id=\"floatingTextarea1\"></textarea>\n        <label for=\"floatingTextarea1\">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum mattis mi at lobortis rutrum. Phasellus varius a risus non lobortis. Ut id congue enim. Quisque facilisis elit ac elit dapibus aliquet nec sit amet arcu. Morbi vitae ultricies eros. Proin varius augue in tristique pretium. Morbi at ullamcorper elit, at ullamcorper massa. Vivamus suscipit quam quis viverra eleifend.</label>\n      </div>\n      <div class=\"form-floating\">\n        <textarea class=\"form-control\" placeholder=\"Leave a comment here\" id=\"floatingTextarea2\" style=\"height: 50px\"></textarea>\n        <label for=\"floatingTextarea2\">Comments</label>\n      </div>\n      <div class=\"form-floating\">\n        <textarea class=\"form-control\" placeholder=\"Leave a comment here\" id=\"floatingTextarea3\" style=\"height: 50px\"></textarea>\n        <label for=\"floatingTextarea3\">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum mattis mi at lobortis rutrum. Phasellus varius a risus non lobortis. Ut id congue enim. Quisque facilisis elit ac elit dapibus aliquet nec sit amet arcu. Morbi vitae ultricies eros. Proin varius augue in tristique pretium. Morbi at ullamcorper elit, at ullamcorper massa. Vivamus suscipit quam quis viverra eleifend.</label>\n      </div>\n      <div class=\"form-floating\">\n        <textarea class=\"form-control\" placeholder=\"Leave a comment here\" id=\"floatingTextarea4\" style=\"height: 50px\">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum mattis mi at lobortis rutrum. Phasellus varius a risus non lobortis. Ut id congue enim. Quisque facilisis elit ac elit dapibus aliquet nec sit amet arcu. Morbi vitae ultricies eros. Proin varius augue in tristique pretium. Morbi at ullamcorper elit, at ullamcorper massa. Vivamus suscipit quam quis viverra eleifend.</textarea>\n        <label for=\"floatingTextarea4\">Comments</label>\n      </div>\n      <div class=\"form-floating\">\n        <textarea class=\"form-control\" placeholder=\"Leave a comment here\" id=\"floatingTextarea5\" style=\"height: 50px\">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum mattis mi at lobortis rutrum. Phasellus varius a risus non lobortis. Ut id congue enim. Quisque facilisis elit ac elit dapibus aliquet nec sit amet arcu. Morbi vitae ultricies eros. Proin varius augue in tristique pretium. Morbi at ullamcorper elit, at ullamcorper massa. Vivamus suscipit quam quis viverra eleifend.</textarea>\n        <label for=\"floatingTextarea5\">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum mattis mi at lobortis rutrum. Phasellus varius a risus non lobortis. Ut id congue enim. Quisque facilisis elit ac elit dapibus aliquet nec sit amet arcu. Morbi vitae ultricies eros. Proin varius augue in tristique pretium. Morbi at ullamcorper elit, at ullamcorper massa. Vivamus suscipit quam quis viverra eleifend.</label>\n      </div>\n      <div class=\"form-floating\">\n        <textarea class=\"form-control is-invalid\" placeholder=\"Leave a comment here\" id=\"floatingTextarea6\" style=\"height: 50px\">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum mattis mi at lobortis rutrum. Phasellus varius a risus non lobortis. Ut id congue enim. Quisque facilisis elit ac elit dapibus aliquet nec sit amet arcu. Morbi vitae ultricies eros. Proin varius augue in tristique pretium. Morbi at ullamcorper elit, at ullamcorper massa. Vivamus suscipit quam quis viverra eleifend.</textarea>\n        <label for=\"floatingTextarea6\">Comments</label>\n      </div>\n      <div class=\"form-floating\">\n        <textarea class=\"form-control is-invalid\" placeholder=\"Leave a comment here\" id=\"floatingTextarea7\" style=\"height: 50px\">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum mattis mi at lobortis rutrum. Phasellus varius a risus non lobortis. Ut id congue enim. Quisque facilisis elit ac elit dapibus aliquet nec sit amet arcu. Morbi vitae ultricies eros. Proin varius augue in tristique pretium. Morbi at ullamcorper elit, at ullamcorper massa. Vivamus suscipit quam quis viverra eleifend.</textarea>\n        <label for=\"floatingTextarea7\">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum mattis mi at lobortis rutrum. Phasellus varius a risus non lobortis. Ut id congue enim. Quisque facilisis elit ac elit dapibus aliquet nec sit amet arcu. Morbi vitae ultricies eros. Proin varius augue in tristique pretium. Morbi at ullamcorper elit, at ullamcorper massa. Vivamus suscipit quam quis viverra eleifend.</label>\n      </div>\n      <div class=\"form-floating\">\n        <select class=\"form-select\" id=\"floatingSelect\" aria-label=\"Floating label select example\">\n          <option selected>Open this select menu</option>\n          <option value=\"1\">One</option>\n          <option value=\"2\">Two</option>\n          <option value=\"3\">Three</option>\n        </select>\n        <label for=\"floatingSelect\">Works with selects</label>\n      </div>\n      <div class=\"form-floating\">\n        <select class=\"form-select is-invalid\" id=\"floatingSelect1\" aria-label=\"Floating label select example\">\n          <option selected>Open this select menu</option>\n          <option value=\"1\">One</option>\n          <option value=\"2\">Two</option>\n          <option value=\"3\">Three</option>\n        </select>\n        <label for=\"floatingSelect1\">Works with selects</label>\n      </div>\n      <div class=\"form-floating\">\n        <select class=\"form-select\" id=\"floatingSelect2\" aria-label=\"Floating label select example\">\n          <option selected>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum mattis mi at lobortis rutrum. Phasellus varius a risus non lobortis. Ut id congue enim. Quisque facilisis elit ac elit dapibus aliquet nec sit amet arcu. Morbi vitae ultricies eros. Proin varius augue in tristique pretium. Morbi at ullamcorper elit, at ullamcorper massa. Vivamus suscipit quam quis viverra eleifend.</option>\n          <option value=\"1\">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum mattis mi at lobortis rutrum. Phasellus varius a risus non lobortis. Ut id congue enim. Quisque facilisis elit ac elit dapibus aliquet nec sit amet arcu. Morbi vitae ultricies eros. Proin varius augue in tristique pretium. Morbi at ullamcorper elit, at ullamcorper massa. Vivamus suscipit quam quis viverra eleifend.</option>\n          <option value=\"2\">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum mattis mi at lobortis rutrum. Phasellus varius a risus non lobortis. Ut id congue enim. Quisque facilisis elit ac elit dapibus aliquet nec sit amet arcu. Morbi vitae ultricies eros. Proin varius augue in tristique pretium. Morbi at ullamcorper elit, at ullamcorper massa. Vivamus suscipit quam quis viverra eleifend.</option>\n          <option value=\"3\">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum mattis mi at lobortis rutrum. Phasellus varius a risus non lobortis. Ut id congue enim. Quisque facilisis elit ac elit dapibus aliquet nec sit amet arcu. Morbi vitae ultricies eros. Proin varius augue in tristique pretium. Morbi at ullamcorper elit, at ullamcorper massa. Vivamus suscipit quam quis viverra eleifend.</option>\n        </select>\n        <label for=\"floatingSelect2\">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum mattis mi at lobortis rutrum. Phasellus varius a risus non lobortis. Ut id congue enim. Quisque facilisis elit ac elit dapibus aliquet nec sit amet arcu. Morbi vitae ultricies eros. Proin varius augue in tristique pretium. Morbi at ullamcorper elit, at ullamcorper massa. Vivamus suscipit quam quis viverra eleifend.</label>\n      </div>\n      <div class=\"form-floating\">\n        <select class=\"form-select is-invalid\" id=\"floatingSelect3\" aria-label=\"Floating label select example\">\n          <option selected>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum mattis mi at lobortis rutrum. Phasellus varius a risus non lobortis. Ut id congue enim. Quisque facilisis elit ac elit dapibus aliquet nec sit amet arcu. Morbi vitae ultricies eros. Proin varius augue in tristique pretium. Morbi at ullamcorper elit, at ullamcorper massa. Vivamus suscipit quam quis viverra eleifend.</option>\n          <option value=\"1\">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum mattis mi at lobortis rutrum. Phasellus varius a risus non lobortis. Ut id congue enim. Quisque facilisis elit ac elit dapibus aliquet nec sit amet arcu. Morbi vitae ultricies eros. Proin varius augue in tristique pretium. Morbi at ullamcorper elit, at ullamcorper massa. Vivamus suscipit quam quis viverra eleifend.</option>\n          <option value=\"2\">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum mattis mi at lobortis rutrum. Phasellus varius a risus non lobortis. Ut id congue enim. Quisque facilisis elit ac elit dapibus aliquet nec sit amet arcu. Morbi vitae ultricies eros. Proin varius augue in tristique pretium. Morbi at ullamcorper elit, at ullamcorper massa. Vivamus suscipit quam quis viverra eleifend.</option>\n          <option value=\"3\">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum mattis mi at lobortis rutrum. Phasellus varius a risus non lobortis. Ut id congue enim. Quisque facilisis elit ac elit dapibus aliquet nec sit amet arcu. Morbi vitae ultricies eros. Proin varius augue in tristique pretium. Morbi at ullamcorper elit, at ullamcorper massa. Vivamus suscipit quam quis viverra eleifend.</option>\n        </select>\n        <label for=\"floatingSelect3\">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum mattis mi at lobortis rutrum. Phasellus varius a risus non lobortis. Ut id congue enim. Quisque facilisis elit ac elit dapibus aliquet nec sit amet arcu. Morbi vitae ultricies eros. Proin varius augue in tristique pretium. Morbi at ullamcorper elit, at ullamcorper massa. Vivamus suscipit quam quis viverra eleifend.</label>\n      </div>\n      <div class=\"form-floating mb-3\">\n        <input type=\"email\" class=\"form-control\" id=\"floatingInputDisabled\" placeholder=\"name@example.com\" disabled>\n        <label for=\"floatingInputDisabled\">Email address</label>\n      </div>\n      <div class=\"form-floating mb-3\">\n        <textarea class=\"form-control\" placeholder=\"Leave a comment here\" id=\"floatingTextareaDisabled\" disabled></textarea>\n        <label for=\"floatingTextareaDisabled\">Comments</label>\n      </div>\n      <div class=\"form-floating mb-3\">\n        <textarea class=\"form-control\" placeholder=\"Leave a comment here\" id=\"floatingTextareaDisabled1\" style=\"height: 50px\" disabled>Disabled textarea with some text inside</textarea>\n        <label for=\"floatingTextareaDisabled1\">Comments</label>\n      </div>\n      <div class=\"form-floating\">\n        <select class=\"form-select\" id=\"floatingSelectDisabled\" aria-label=\"Floating label disabled select example\" disabled>\n          <option selected>Open this select menu</option>\n          <option value=\"1\">One</option>\n          <option value=\"2\">Two</option>\n          <option value=\"3\">Three</option>\n        </select>\n        <label for=\"floatingSelectDisabled\">Works with selects</label>\n      </div>\n      <div class=\"form-floating mb-3\">\n        <input type=\"email\" class=\"form-control\" id=\"floatingInputDisabled1\" placeholder=\"name@example.com\" disabled>\n        <label for=\"floatingInputDisabled1\">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum mattis mi at lobortis rutrum. Phasellus varius a risus non lobortis. Ut id congue enim. Quisque facilisis elit ac elit dapibus aliquet nec sit amet arcu. Morbi vitae ultricies eros. Proin varius augue in tristique pretium. Morbi at ullamcorper elit, at ullamcorper massa. Vivamus suscipit quam quis viverra eleifend.</label>\n      </div>\n      <div class=\"form-floating mb-3\">\n        <textarea class=\"form-control\" placeholder=\"Leave a comment here\" id=\"floatingTextareaDisabled2\" disabled></textarea>\n        <label for=\"floatingTextareaDisabled2\">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum mattis mi at lobortis rutrum. Phasellus varius a risus non lobortis. Ut id congue enim. Quisque facilisis elit ac elit dapibus aliquet nec sit amet arcu. Morbi vitae ultricies eros. Proin varius augue in tristique pretium. Morbi at ullamcorper elit, at ullamcorper massa. Vivamus suscipit quam quis viverra eleifend.</label>\n      </div>\n      <div class=\"form-floating mb-3\">\n        <textarea class=\"form-control\" placeholder=\"Leave a comment here\" id=\"floatingTextareaDisabled3\" style=\"height: 50px\" disabled>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum mattis mi at lobortis rutrum. Phasellus varius a risus non lobortis. Ut id congue enim. Quisque facilisis elit ac elit dapibus aliquet nec sit amet arcu. Morbi vitae ultricies eros. Proin varius augue in tristique pretium. Morbi at ullamcorper elit, at ullamcorper massa. Vivamus suscipit quam quis viverra eleifend.</textarea>\n        <label for=\"floatingTextareaDisabled3\">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum mattis mi at lobortis rutrum. Phasellus varius a risus non lobortis. Ut id congue enim. Quisque facilisis elit ac elit dapibus aliquet nec sit amet arcu. Morbi vitae ultricies eros. Proin varius augue in tristique pretium. Morbi at ullamcorper elit, at ullamcorper massa. Vivamus suscipit quam quis viverra eleifend.</label>\n      </div>\n      <div class=\"form-floating\">\n        <select class=\"form-select\" id=\"floatingSelectDisabled1\" aria-label=\"Floating label disabled select example\" disabled>\n          <option selected>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum mattis mi at lobortis rutrum. Phasellus varius a risus non lobortis. Ut id congue enim. Quisque facilisis elit ac elit dapibus aliquet nec sit amet arcu. Morbi vitae ultricies eros. Proin varius augue in tristique pretium. Morbi at ullamcorper elit, at ullamcorper massa. Vivamus suscipit quam quis viverra eleifend.</option>\n          <option value=\"1\">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum mattis mi at lobortis rutrum. Phasellus varius a risus non lobortis. Ut id congue enim. Quisque facilisis elit ac elit dapibus aliquet nec sit amet arcu. Morbi vitae ultricies eros. Proin varius augue in tristique pretium. Morbi at ullamcorper elit, at ullamcorper massa. Vivamus suscipit quam quis viverra eleifend.</option>\n          <option value=\"2\">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum mattis mi at lobortis rutrum. Phasellus varius a risus non lobortis. Ut id congue enim. Quisque facilisis elit ac elit dapibus aliquet nec sit amet arcu. Morbi vitae ultricies eros. Proin varius augue in tristique pretium. Morbi at ullamcorper elit, at ullamcorper massa. Vivamus suscipit quam quis viverra eleifend.</option>\n          <option value=\"3\">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum mattis mi at lobortis rutrum. Phasellus varius a risus non lobortis. Ut id congue enim. Quisque facilisis elit ac elit dapibus aliquet nec sit amet arcu. Morbi vitae ultricies eros. Proin varius augue in tristique pretium. Morbi at ullamcorper elit, at ullamcorper massa. Vivamus suscipit quam quis viverra eleifend.</option>\n        </select>\n        <label for=\"floatingSelectDisabled1\">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum mattis mi at lobortis rutrum. Phasellus varius a risus non lobortis. Ut id congue enim. Quisque facilisis elit ac elit dapibus aliquet nec sit amet arcu. Morbi vitae ultricies eros. Proin varius augue in tristique pretium. Morbi at ullamcorper elit, at ullamcorper massa. Vivamus suscipit quam quis viverra eleifend.</label>\n      </div>\n      <div class=\"form-floating mb-3\">\n        <input type=\"email\" readonly class=\"form-control-plaintext\" id=\"floatingEmptyPlaintextInput\" placeholder=\"name@example.com\">\n        <label for=\"floatingEmptyPlaintextInput\">Empty input</label>\n      </div>\n      <div class=\"form-floating mb-3\">\n        <input type=\"email\" readonly class=\"form-control-plaintext\" id=\"floatingPlaintextInput\" placeholder=\"name@example.com\" value=\"name@example.com\">\n        <label for=\"floatingPlaintextInput\">Input with value</label>\n      </div>\n      <div class=\"form-floating mb-3\">\n        <input type=\"email\" readonly class=\"form-control-plaintext\" id=\"floatingEmptyPlaintextInput1\" placeholder=\"name@example.com\">\n        <label for=\"floatingEmptyPlaintextInput1\">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum mattis mi at lobortis rutrum. Phasellus varius a risus non lobortis. Ut id congue enim. Quisque facilisis elit ac elit dapibus aliquet nec sit amet arcu. Morbi vitae ultricies eros. Proin varius augue in tristique pretium. Morbi at ullamcorper elit, at ullamcorper massa. Vivamus suscipit quam quis viverra eleifend.</label>\n      </div>\n      <div class=\"form-floating mb-3\">\n        <input type=\"email\" readonly class=\"form-control-plaintext\" id=\"floatingPlaintextInput1\" placeholder=\"name@example.com\" value=\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum mattis mi at lobortis rutrum. Phasellus varius a risus non lobortis. Ut id congue enim. Quisque facilisis elit ac elit dapibus aliquet nec sit amet arcu. Morbi vitae ultricies eros. Proin varius augue in tristique pretium. Morbi at ullamcorper elit, at ullamcorper massa. Vivamus suscipit quam quis viverra eleifend.\">\n        <label for=\"floatingPlaintextInput1\">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum mattis mi at lobortis rutrum. Phasellus varius a risus non lobortis. Ut id congue enim. Quisque facilisis elit ac elit dapibus aliquet nec sit amet arcu. Morbi vitae ultricies eros. Proin varius augue in tristique pretium. Morbi at ullamcorper elit, at ullamcorper massa. Vivamus suscipit quam quis viverra eleifend.</label>\n      </div>\n      <!--Compare form-select rendering depending on the size-->\n      <div class=\"form-floating\">\n        <select class=\"form-select\" id=\"floatingSelectRegular\" aria-label=\"Floating label select example\">\n          <option selected=\"\">Open this select menu</option>\n          <option value=\"1\">One</option>\n          <option value=\"2\">Two</option>\n          <option value=\"3\">Three</option>\n        </select>\n        <label for=\"floatingSelectRegular\">Works with selects</label>\n      </div>\n      <div class=\"form-floating\">\n        <select class=\"form-select form-select-sm\" id=\"floatingSelectSmall\" aria-label=\"Floating label select example\">\n          <option selected=\"\">Open this select menu</option>\n          <option value=\"1\">One</option>\n          <option value=\"2\">Two</option>\n          <option value=\"3\">Three</option>\n        </select>\n        <label for=\"floatingSelectSmall\">Works with selects</label>\n      </div>\n      <div class=\"form-floating\">\n        <select class=\"form-select form-select-lg\" id=\"floatingSelectLarge\" aria-label=\"Floating label select example\">\n          <option selected=\"\">Open this select menu</option>\n          <option value=\"1\">One</option>\n          <option value=\"2\">Two</option>\n          <option value=\"3\">Three</option>\n        </select>\n        <label for=\"floatingSelectLarge\">Works with selects</label>\n      </div>\n    </div>\n\n    <div class=\"container-fluid bg-body\" data-bs-theme=\"dark\">\n      <div class=\"container py-5 d-flex flex-column gap-3\">\n        <div class=\"form-floating\">\n          <input type=\"email\" class=\"form-control\" id=\"floatingInput2\" placeholder=\"name@example.com\">\n          <label for=\"floatingInput2\">Email address</label>\n        </div>\n        <div class=\"form-floating\">\n          <input type=\"email\" class=\"form-control\" id=\"floatingInput3\" placeholder=\"name@example.com\">\n          <label for=\"floatingInput3\">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum mattis mi at lobortis rutrum. Phasellus varius a risus non lobortis. Ut id congue enim. Quisque facilisis elit ac elit dapibus aliquet nec sit amet arcu. Morbi vitae ultricies eros. Proin varius augue in tristique pretium. Morbi at ullamcorper elit, at ullamcorper massa. Vivamus suscipit quam quis viverra eleifend.</label>\n        </div>\n        <form class=\"form-floating\">\n          <input type=\"email\" class=\"form-control\" id=\"floatingInputValue2\" placeholder=\"name@example.com\" value=\"test@example.com\">\n          <label for=\"floatingInputValue2\">Input with value</label>\n        </form>\n        <form class=\"form-floating\">\n          <input type=\"email\" class=\"form-control\" id=\"floatingInputValue3\" placeholder=\"name@example.com\" value=\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum mattis mi at lobortis rutrum. Phasellus varius a risus non lobortis. Ut id congue enim. Quisque facilisis elit ac elit dapibus aliquet nec sit amet arcu. Morbi vitae ultricies eros. Proin varius augue in tristique pretium. Morbi at ullamcorper elit, at ullamcorper massa. Vivamus suscipit quam quis viverra eleifend.\">\n          <label for=\"floatingInputValue3\">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum mattis mi at lobortis rutrum. Phasellus varius a risus non lobortis. Ut id congue enim. Quisque facilisis elit ac elit dapibus aliquet nec sit amet arcu. Morbi vitae ultricies eros. Proin varius augue in tristique pretium. Morbi at ullamcorper elit, at ullamcorper massa. Vivamus suscipit quam quis viverra eleifend.</label>\n        </form>\n        <form class=\"form-floating\">\n          <input type=\"email\" class=\"form-control is-invalid\" id=\"floatingInputInvalid4\" placeholder=\"name@example.com\" value=\"test@example.com\">\n          <label for=\"floatingInputInvalid4\">Invalid input</label>\n        </form>\n        <form class=\"form-floating\">\n          <input type=\"email\" class=\"form-control is-invalid\" id=\"floatingInputInvalid5\" placeholder=\"name@example.com\" value=\"test@example.com\">\n          <label for=\"floatingInputInvalid5\">Invalid input</label>\n        </form>\n        <form class=\"form-floating\">\n          <input type=\"email\" class=\"form-control is-invalid\" id=\"floatingInputInvalid6\" placeholder=\"name@example.com\">\n          <label for=\"floatingInputInvalid6\">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum mattis mi at lobortis rutrum. Phasellus varius a risus non lobortis. Ut id congue enim. Quisque facilisis elit ac elit dapibus aliquet nec sit amet arcu. Morbi vitae ultricies eros. Proin varius augue in tristique pretium. Morbi at ullamcorper elit, at ullamcorper massa. Vivamus suscipit quam quis viverra eleifend.</label>\n        </form>\n        <form class=\"form-floating\">\n          <input type=\"email\" class=\"form-control is-invalid\" id=\"floatingInputInvalid7\" placeholder=\"name@example.com\" value=\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum mattis mi at lobortis rutrum. Phasellus varius a risus non lobortis. Ut id congue enim. Quisque facilisis elit ac elit dapibus aliquet nec sit amet arcu. Morbi vitae ultricies eros. Proin varius augue in tristique pretium. Morbi at ullamcorper elit, at ullamcorper massa. Vivamus suscipit quam quis viverra eleifend.\">\n          <label for=\"floatingInputInvalid7\">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum mattis mi at lobortis rutrum. Phasellus varius a risus non lobortis. Ut id congue enim. Quisque facilisis elit ac elit dapibus aliquet nec sit amet arcu. Morbi vitae ultricies eros. Proin varius augue in tristique pretium. Morbi at ullamcorper elit, at ullamcorper massa. Vivamus suscipit quam quis viverra eleifend.</label>\n        </form>\n        <div class=\"form-floating\">\n          <textarea class=\"form-control\" placeholder=\"Leave a comment here\" id=\"floatingTextarea8\"></textarea>\n          <label for=\"floatingTextarea8\">Comments</label>\n        </div>\n        <div class=\"form-floating\">\n          <textarea class=\"form-control\" placeholder=\"Leave a comment here\" id=\"floatingTextarea9\"></textarea>\n          <label for=\"floatingTextarea9\">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum mattis mi at lobortis rutrum. Phasellus varius a risus non lobortis. Ut id congue enim. Quisque facilisis elit ac elit dapibus aliquet nec sit amet arcu. Morbi vitae ultricies eros. Proin varius augue in tristique pretium. Morbi at ullamcorper elit, at ullamcorper massa. Vivamus suscipit quam quis viverra eleifend.</label>\n        </div>\n        <div class=\"form-floating\">\n          <textarea class=\"form-control\" placeholder=\"Leave a comment here\" id=\"floatingTextarea10\" style=\"height: 50px\"></textarea>\n          <label for=\"floatingTextarea10\">Comments</label>\n        </div>\n        <div class=\"form-floating\">\n          <textarea class=\"form-control\" placeholder=\"Leave a comment here\" id=\"floatingTextarea11\" style=\"height: 50px\"></textarea>\n          <label for=\"floatingTextarea11\">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum mattis mi at lobortis rutrum. Phasellus varius a risus non lobortis. Ut id congue enim. Quisque facilisis elit ac elit dapibus aliquet nec sit amet arcu. Morbi vitae ultricies eros. Proin varius augue in tristique pretium. Morbi at ullamcorper elit, at ullamcorper massa. Vivamus suscipit quam quis viverra eleifend.</label>\n        </div>\n        <div class=\"form-floating\">\n          <textarea class=\"form-control\" placeholder=\"Leave a comment here\" id=\"floatingTextarea12\" style=\"height: 50px\">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum mattis mi at lobortis rutrum. Phasellus varius a risus non lobortis. Ut id congue enim. Quisque facilisis elit ac elit dapibus aliquet nec sit amet arcu. Morbi vitae ultricies eros. Proin varius augue in tristique pretium. Morbi at ullamcorper elit, at ullamcorper massa. Vivamus suscipit quam quis viverra eleifend.</textarea>\n          <label for=\"floatingTextarea12\">Comments</label>\n        </div>\n        <div class=\"form-floating\">\n          <textarea class=\"form-control\" placeholder=\"Leave a comment here\" id=\"floatingTextarea13\" style=\"height: 50px\">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum mattis mi at lobortis rutrum. Phasellus varius a risus non lobortis. Ut id congue enim. Quisque facilisis elit ac elit dapibus aliquet nec sit amet arcu. Morbi vitae ultricies eros. Proin varius augue in tristique pretium. Morbi at ullamcorper elit, at ullamcorper massa. Vivamus suscipit quam quis viverra eleifend.</textarea>\n          <label for=\"floatingTextarea13\">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum mattis mi at lobortis rutrum. Phasellus varius a risus non lobortis. Ut id congue enim. Quisque facilisis elit ac elit dapibus aliquet nec sit amet arcu. Morbi vitae ultricies eros. Proin varius augue in tristique pretium. Morbi at ullamcorper elit, at ullamcorper massa. Vivamus suscipit quam quis viverra eleifend.</label>\n        </div>\n        <div class=\"form-floating\">\n          <textarea class=\"form-control is-invalid\" placeholder=\"Leave a comment here\" id=\"floatingTextarea14\" style=\"height: 50px\">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum mattis mi at lobortis rutrum. Phasellus varius a risus non lobortis. Ut id congue enim. Quisque facilisis elit ac elit dapibus aliquet nec sit amet arcu. Morbi vitae ultricies eros. Proin varius augue in tristique pretium. Morbi at ullamcorper elit, at ullamcorper massa. Vivamus suscipit quam quis viverra eleifend.</textarea>\n          <label for=\"floatingTextarea14\">Comments</label>\n        </div>\n        <div class=\"form-floating\">\n          <textarea class=\"form-control is-invalid\" placeholder=\"Leave a comment here\" id=\"floatingTextarea15\" style=\"height: 50px\">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum mattis mi at lobortis rutrum. Phasellus varius a risus non lobortis. Ut id congue enim. Quisque facilisis elit ac elit dapibus aliquet nec sit amet arcu. Morbi vitae ultricies eros. Proin varius augue in tristique pretium. Morbi at ullamcorper elit, at ullamcorper massa. Vivamus suscipit quam quis viverra eleifend.</textarea>\n          <label for=\"floatingTextarea15\">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum mattis mi at lobortis rutrum. Phasellus varius a risus non lobortis. Ut id congue enim. Quisque facilisis elit ac elit dapibus aliquet nec sit amet arcu. Morbi vitae ultricies eros. Proin varius augue in tristique pretium. Morbi at ullamcorper elit, at ullamcorper massa. Vivamus suscipit quam quis viverra eleifend.</label>\n        </div>\n        <div class=\"form-floating\">\n          <select class=\"form-select\" id=\"floatingSelect4\" aria-label=\"Floating label select example\">\n            <option selected>Open this select menu</option>\n            <option value=\"1\">One</option>\n            <option value=\"2\">Two</option>\n            <option value=\"3\">Three</option>\n          </select>\n          <label for=\"floatingSelect4\">Works with selects</label>\n        </div>\n        <div class=\"form-floating\">\n          <select class=\"form-select is-invalid\" id=\"floatingSelect5\" aria-label=\"Floating label select example\">\n            <option selected>Open this select menu</option>\n            <option value=\"1\">One</option>\n            <option value=\"2\">Two</option>\n            <option value=\"3\">Three</option>\n          </select>\n          <label for=\"floatingSelect5\">Works with selects</label>\n        </div>\n        <div class=\"form-floating\">\n          <select class=\"form-select\" id=\"floatingSelect6\" aria-label=\"Floating label select example\">\n            <option selected>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum mattis mi at lobortis rutrum. Phasellus varius a risus non lobortis. Ut id congue enim. Quisque facilisis elit ac elit dapibus aliquet nec sit amet arcu. Morbi vitae ultricies eros. Proin varius augue in tristique pretium. Morbi at ullamcorper elit, at ullamcorper massa. Vivamus suscipit quam quis viverra eleifend.</option>\n            <option value=\"1\">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum mattis mi at lobortis rutrum. Phasellus varius a risus non lobortis. Ut id congue enim. Quisque facilisis elit ac elit dapibus aliquet nec sit amet arcu. Morbi vitae ultricies eros. Proin varius augue in tristique pretium. Morbi at ullamcorper elit, at ullamcorper massa. Vivamus suscipit quam quis viverra eleifend.</option>\n            <option value=\"2\">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum mattis mi at lobortis rutrum. Phasellus varius a risus non lobortis. Ut id congue enim. Quisque facilisis elit ac elit dapibus aliquet nec sit amet arcu. Morbi vitae ultricies eros. Proin varius augue in tristique pretium. Morbi at ullamcorper elit, at ullamcorper massa. Vivamus suscipit quam quis viverra eleifend.</option>\n            <option value=\"3\">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum mattis mi at lobortis rutrum. Phasellus varius a risus non lobortis. Ut id congue enim. Quisque facilisis elit ac elit dapibus aliquet nec sit amet arcu. Morbi vitae ultricies eros. Proin varius augue in tristique pretium. Morbi at ullamcorper elit, at ullamcorper massa. Vivamus suscipit quam quis viverra eleifend.</option>\n          </select>\n          <label for=\"floatingSelect6\">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum mattis mi at lobortis rutrum. Phasellus varius a risus non lobortis. Ut id congue enim. Quisque facilisis elit ac elit dapibus aliquet nec sit amet arcu. Morbi vitae ultricies eros. Proin varius augue in tristique pretium. Morbi at ullamcorper elit, at ullamcorper massa. Vivamus suscipit quam quis viverra eleifend.</label>\n        </div>\n        <div class=\"form-floating\">\n          <select class=\"form-select is-invalid\" id=\"floatingSelect7\" aria-label=\"Floating label select example\">\n            <option selected>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum mattis mi at lobortis rutrum. Phasellus varius a risus non lobortis. Ut id congue enim. Quisque facilisis elit ac elit dapibus aliquet nec sit amet arcu. Morbi vitae ultricies eros. Proin varius augue in tristique pretium. Morbi at ullamcorper elit, at ullamcorper massa. Vivamus suscipit quam quis viverra eleifend.</option>\n            <option value=\"1\">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum mattis mi at lobortis rutrum. Phasellus varius a risus non lobortis. Ut id congue enim. Quisque facilisis elit ac elit dapibus aliquet nec sit amet arcu. Morbi vitae ultricies eros. Proin varius augue in tristique pretium. Morbi at ullamcorper elit, at ullamcorper massa. Vivamus suscipit quam quis viverra eleifend.</option>\n            <option value=\"2\">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum mattis mi at lobortis rutrum. Phasellus varius a risus non lobortis. Ut id congue enim. Quisque facilisis elit ac elit dapibus aliquet nec sit amet arcu. Morbi vitae ultricies eros. Proin varius augue in tristique pretium. Morbi at ullamcorper elit, at ullamcorper massa. Vivamus suscipit quam quis viverra eleifend.</option>\n            <option value=\"3\">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum mattis mi at lobortis rutrum. Phasellus varius a risus non lobortis. Ut id congue enim. Quisque facilisis elit ac elit dapibus aliquet nec sit amet arcu. Morbi vitae ultricies eros. Proin varius augue in tristique pretium. Morbi at ullamcorper elit, at ullamcorper massa. Vivamus suscipit quam quis viverra eleifend.</option>\n          </select>\n          <label for=\"floatingSelect7\">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum mattis mi at lobortis rutrum. Phasellus varius a risus non lobortis. Ut id congue enim. Quisque facilisis elit ac elit dapibus aliquet nec sit amet arcu. Morbi vitae ultricies eros. Proin varius augue in tristique pretium. Morbi at ullamcorper elit, at ullamcorper massa. Vivamus suscipit quam quis viverra eleifend.</label>\n        </div>\n        <div class=\"form-floating mb-3\">\n          <input type=\"email\" class=\"form-control\" id=\"floatingInputDisabled2\" placeholder=\"name@example.com\" disabled>\n          <label for=\"floatingInputDisabled2\">Email address</label>\n        </div>\n        <div class=\"form-floating mb-3\">\n          <textarea class=\"form-control\" placeholder=\"Leave a comment here\" id=\"floatingTextareaDisabled4\" disabled></textarea>\n          <label for=\"floatingTextareaDisabled4\">Comments</label>\n        </div>\n        <div class=\"form-floating mb-3\">\n          <textarea class=\"form-control\" placeholder=\"Leave a comment here\" id=\"floatingTextareaDisabled5\" style=\"height: 50px\" disabled>Disabled textarea with some text inside</textarea>\n          <label for=\"floatingTextareaDisabled5\">Comments</label>\n        </div>\n        <div class=\"form-floating\">\n          <select class=\"form-select\" id=\"floatingSelectDisabled2\" aria-label=\"Floating label disabled select example\" disabled>\n            <option selected>Open this select menu</option>\n            <option value=\"1\">One</option>\n            <option value=\"2\">Two</option>\n            <option value=\"3\">Three</option>\n          </select>\n          <label for=\"floatingSelectDisabled2\">Works with selects</label>\n        </div>\n        <div class=\"form-floating mb-3\">\n          <input type=\"email\" class=\"form-control\" id=\"floatingInputDisabled3\" placeholder=\"name@example.com\" disabled>\n          <label for=\"floatingInputDisabled3\">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum mattis mi at lobortis rutrum. Phasellus varius a risus non lobortis. Ut id congue enim. Quisque facilisis elit ac elit dapibus aliquet nec sit amet arcu. Morbi vitae ultricies eros. Proin varius augue in tristique pretium. Morbi at ullamcorper elit, at ullamcorper massa. Vivamus suscipit quam quis viverra eleifend.</label>\n        </div>\n        <div class=\"form-floating mb-3\">\n          <textarea class=\"form-control\" placeholder=\"Leave a comment here\" id=\"floatingTextareaDisabled6\" disabled></textarea>\n          <label for=\"floatingTextareaDisabled6\">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum mattis mi at lobortis rutrum. Phasellus varius a risus non lobortis. Ut id congue enim. Quisque facilisis elit ac elit dapibus aliquet nec sit amet arcu. Morbi vitae ultricies eros. Proin varius augue in tristique pretium. Morbi at ullamcorper elit, at ullamcorper massa. Vivamus suscipit quam quis viverra eleifend.</label>\n        </div>\n        <div class=\"form-floating mb-3\">\n          <textarea class=\"form-control\" placeholder=\"Leave a comment here\" id=\"floatingTextareaDisabled7\" style=\"height: 50px\" disabled>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum mattis mi at lobortis rutrum. Phasellus varius a risus non lobortis. Ut id congue enim. Quisque facilisis elit ac elit dapibus aliquet nec sit amet arcu. Morbi vitae ultricies eros. Proin varius augue in tristique pretium. Morbi at ullamcorper elit, at ullamcorper massa. Vivamus suscipit quam quis viverra eleifend.</textarea>\n          <label for=\"floatingTextareaDisabled7\">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum mattis mi at lobortis rutrum. Phasellus varius a risus non lobortis. Ut id congue enim. Quisque facilisis elit ac elit dapibus aliquet nec sit amet arcu. Morbi vitae ultricies eros. Proin varius augue in tristique pretium. Morbi at ullamcorper elit, at ullamcorper massa. Vivamus suscipit quam quis viverra eleifend.</label>\n        </div>\n        <div class=\"form-floating\">\n          <select class=\"form-select\" id=\"floatingSelectDisabled3\" aria-label=\"Floating label disabled select example\" disabled>\n            <option selected>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum mattis mi at lobortis rutrum. Phasellus varius a risus non lobortis. Ut id congue enim. Quisque facilisis elit ac elit dapibus aliquet nec sit amet arcu. Morbi vitae ultricies eros. Proin varius augue in tristique pretium. Morbi at ullamcorper elit, at ullamcorper massa. Vivamus suscipit quam quis viverra eleifend.</option>\n            <option value=\"1\">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum mattis mi at lobortis rutrum. Phasellus varius a risus non lobortis. Ut id congue enim. Quisque facilisis elit ac elit dapibus aliquet nec sit amet arcu. Morbi vitae ultricies eros. Proin varius augue in tristique pretium. Morbi at ullamcorper elit, at ullamcorper massa. Vivamus suscipit quam quis viverra eleifend.</option>\n            <option value=\"2\">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum mattis mi at lobortis rutrum. Phasellus varius a risus non lobortis. Ut id congue enim. Quisque facilisis elit ac elit dapibus aliquet nec sit amet arcu. Morbi vitae ultricies eros. Proin varius augue in tristique pretium. Morbi at ullamcorper elit, at ullamcorper massa. Vivamus suscipit quam quis viverra eleifend.</option>\n            <option value=\"3\">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum mattis mi at lobortis rutrum. Phasellus varius a risus non lobortis. Ut id congue enim. Quisque facilisis elit ac elit dapibus aliquet nec sit amet arcu. Morbi vitae ultricies eros. Proin varius augue in tristique pretium. Morbi at ullamcorper elit, at ullamcorper massa. Vivamus suscipit quam quis viverra eleifend.</option>\n          </select>\n          <label for=\"floatingSelectDisabled3\">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum mattis mi at lobortis rutrum. Phasellus varius a risus non lobortis. Ut id congue enim. Quisque facilisis elit ac elit dapibus aliquet nec sit amet arcu. Morbi vitae ultricies eros. Proin varius augue in tristique pretium. Morbi at ullamcorper elit, at ullamcorper massa. Vivamus suscipit quam quis viverra eleifend.</label>\n        </div>\n        <div class=\"form-floating mb-3\">\n          <input type=\"email\" readonly class=\"form-control-plaintext\" id=\"floatingEmptyPlaintextInput2\" placeholder=\"name@example.com\">\n          <label for=\"floatingEmptyPlaintextInput2\">Empty input</label>\n        </div>\n        <div class=\"form-floating mb-3\">\n          <input type=\"email\" readonly class=\"form-control-plaintext\" id=\"floatingPlaintextInput2\" placeholder=\"name@example.com\" value=\"name@example.com\">\n          <label for=\"floatingPlaintextInput2\">Input with value</label>\n        </div>\n        <div class=\"form-floating mb-3\">\n          <input type=\"email\" readonly class=\"form-control-plaintext\" id=\"floatingEmptyPlaintextInput3\" placeholder=\"name@example.com\">\n          <label for=\"floatingEmptyPlaintextInput3\">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum mattis mi at lobortis rutrum. Phasellus varius a risus non lobortis. Ut id congue enim. Quisque facilisis elit ac elit dapibus aliquet nec sit amet arcu. Morbi vitae ultricies eros. Proin varius augue in tristique pretium. Morbi at ullamcorper elit, at ullamcorper massa. Vivamus suscipit quam quis viverra eleifend.</label>\n        </div>\n        <div class=\"form-floating mb-3\">\n          <input type=\"email\" readonly class=\"form-control-plaintext\" id=\"floatingPlaintextInput3\" placeholder=\"name@example.com\" value=\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum mattis mi at lobortis rutrum. Phasellus varius a risus non lobortis. Ut id congue enim. Quisque facilisis elit ac elit dapibus aliquet nec sit amet arcu. Morbi vitae ultricies eros. Proin varius augue in tristique pretium. Morbi at ullamcorper elit, at ullamcorper massa. Vivamus suscipit quam quis viverra eleifend.\">\n          <label for=\"floatingPlaintextInput3\">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum mattis mi at lobortis rutrum. Phasellus varius a risus non lobortis. Ut id congue enim. Quisque facilisis elit ac elit dapibus aliquet nec sit amet arcu. Morbi vitae ultricies eros. Proin varius augue in tristique pretium. Morbi at ullamcorper elit, at ullamcorper massa. Vivamus suscipit quam quis viverra eleifend.</label>\n        </div>\n        <!--Compare form-select rendering depending on the size-->\n        <div class=\"form-floating\">\n          <select class=\"form-select\" id=\"floatingSelectRegularDark\" aria-label=\"Floating label select example\">\n            <option selected=\"\">Open this select menu</option>\n            <option value=\"1\">One</option>\n            <option value=\"2\">Two</option>\n            <option value=\"3\">Three</option>\n          </select>\n          <label for=\"floatingSelectRegularDark\">Works with selects</label>\n        </div>\n        <div class=\"form-floating\">\n          <select class=\"form-select form-select-sm\" id=\"floatingSelectSmallDark\" aria-label=\"Floating label select example\">\n            <option selected=\"\">Open this select menu</option>\n            <option value=\"1\">One</option>\n            <option value=\"2\">Two</option>\n            <option value=\"3\">Three</option>\n          </select>\n          <label for=\"floatingSelectSmallDark\">Works with selects</label>\n        </div>\n        <div class=\"form-floating\">\n          <select class=\"form-select form-select-lg\" id=\"floatingSelectLargeDark\" aria-label=\"Floating label select example\">\n            <option selected=\"\">Open this select menu</option>\n            <option value=\"1\">One</option>\n            <option value=\"2\">Two</option>\n            <option value=\"3\">Three</option>\n          </select>\n          <label for=\"floatingSelectLargeDark\">Works with selects</label>\n        </div>\n      </div>\n    </div>\n\n    <script src=\"../../../dist/js/bootstrap.bundle.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "js/tests/visual/input.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <link href=\"../../../dist/css/bootstrap.min.css\" rel=\"stylesheet\">\n    <title>Form</title>\n    <style></style>\n  </head>\n  <body>\n    <div class=\"container\">\n      <h1>Input <small>Bootstrap Visual Test</small></h1>\n\n      <h2>No layout</h2>\n\n      <div class=\"mb-3\">\n        Text\n        <input class=\"form-control\">\n      </div>\n      <div class=\"mb-3\">\n        Email\n        <input type=\"email\" class=\"form-control\">\n      </div>\n      <div class=\"mb-3\">\n        Number\n        <input type=\"number\" class=\"form-control\">\n      </div>\n      <div class=\"mb-3\">\n        Date\n        <input type=\"date\" class=\"form-control\">\n      </div>\n\n      <h2>Flex</h2>\n\n      <div class=\"d-flex flex-wrap gap-3 mb-3\">\n        <div>\n          Text\n          <input class=\"form-control\">\n        </div>\n        <div>\n          Email\n          <input type=\"email\" class=\"form-control\">\n        </div>\n        <div>\n          Number\n          <input type=\"number\" class=\"form-control\">\n        </div>\n        <div>\n          Date\n          <input type=\"date\" class=\"form-control\">\n        </div>\n      </div>\n\n      <h2>Grid</h2>\n\n      <div class=\"row mb-3\">\n        <div class=\"col\">\n          Text\n          <input class=\"form-control\">\n        </div>\n        <div class=\"col\">\n          Email\n          <input type=\"email\" class=\"form-control\">\n        </div>\n        <div class=\"col\">\n          Number\n          <input type=\"number\" class=\"form-control\">\n        </div>\n        <div class=\"col\">\n          Date\n          <input type=\"date\" class=\"form-control\">\n        </div>\n      </div>\n    </div>\n\n    <script src=\"../../../dist/js/bootstrap.bundle.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "js/tests/visual/modal.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <link href=\"../../../dist/css/bootstrap.min.css\" rel=\"stylesheet\">\n    <title>Modal</title>\n    <style>\n      #tall {\n        height: 1500px;\n        width: 100px;\n      }\n    </style>\n  </head>\n  <body>\n    <nav class=\"navbar navbar-expand-lg navbar-dark bg-dark\">\n      <div class=\"container-fluid\">\n        <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbarResponsive\" aria-controls=\"navbarResponsive\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n          <span class=\"navbar-toggler-icon\"></span>\n        </button>\n        <div class=\"collapse navbar-collapse\" id=\"navbarResponsive\">\n          <a class=\"navbar-brand\" href=\"#\">This shouldn't jump!</a>\n          <ul class=\"navbar-nav\">\n            <li class=\"nav-item\">\n              <a class=\"nav-link active\" href=\"#\" aria-current=\"page\">Home</a>\n            </li>\n            <li class=\"nav-item\">\n              <a class=\"nav-link\" href=\"#\">Link</a>\n            </li>\n            <li class=\"nav-item\">\n              <a class=\"nav-link\" href=\"#\">Link</a>\n            </li>\n          </ul>\n        </div>\n      </div>\n    </nav>\n\n    <div class=\"container mt-3\">\n      <h1>Modal <small>Bootstrap Visual Test</small></h1>\n\n      <div class=\"modal fade\" id=\"myModal\" tabindex=\"-1\" aria-labelledby=\"myModalLabel\" aria-hidden=\"true\">\n        <div class=\"modal-dialog\">\n          <div class=\"modal-content\">\n            <div class=\"modal-header\">\n              <h1 class=\"modal-title fs-4\" id=\"myModalLabel\">Modal title</h1>\n              <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>\n            </div>\n            <div class=\"modal-body\">\n              <h4>Text in a modal</h4>\n              <p>Duis mollis, est non commodo luctus, nisi erat porttitor ligula.</p>\n\n              <h4>Popover in a modal</h4>\n              <p>This <button type=\"button\" class=\"btn btn-primary\" data-bs-toggle=\"popover\" data-bs-placement=\"left\" title=\"Popover title\" data-bs-content=\"And here's some amazing content. It's very engaging. Right?\">button</button> should trigger a popover on click.</p>\n\n\n              <h4>Tooltips in a modal</h4>\n              <p><a href=\"#\" data-bs-toggle=\"tooltip\" data-bs-placement=\"top\" title=\"Tooltip on top\">This link</a> and <a href=\"#\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"Tooltip on bottom\">that link</a> should have tooltips on hover.</p>\n\n              <div id=\"accordion\" role=\"tablist\">\n                <div class=\"card\" role=\"presentation\">\n                  <div class=\"card-header\" role=\"tab\" id=\"headingOne\">\n                    <h5 class=\"mb-0\">\n                      <a data-bs-toggle=\"collapse\" href=\"#collapseOne\" aria-expanded=\"true\" aria-controls=\"collapseOne\">\n                        Collapsible Group Item #1\n                      </a>\n                    </h5>\n                  </div>\n\n                  <div id=\"collapseOne\" class=\"collapse show\" data-bs-parent=\"#accordion\" role=\"tabpanel\" aria-labelledby=\"headingOne\">\n                    <div class=\"card-body\">\n                      Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS.\n                    </div>\n                  </div>\n                </div>\n                <div class=\"card\" role=\"presentation\">\n                  <div class=\"card-header\" role=\"tab\" id=\"headingTwo\">\n                    <h5 class=\"mb-0\">\n                      <a class=\"collapsed\" data-bs-toggle=\"collapse\" href=\"#collapseTwo\" aria-expanded=\"false\" aria-controls=\"collapseTwo\">\n                        Collapsible Group Item #2\n                      </a>\n                    </h5>\n                  </div>\n                  <div id=\"collapseTwo\" class=\"collapse\" data-bs-parent=\"#accordion\" role=\"tabpanel\" aria-labelledby=\"headingTwo\">\n                    <div class=\"card-body\">\n                      Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS.\n                    </div>\n                  </div>\n                </div>\n                <div class=\"card\" role=\"presentation\">\n                  <div class=\"card-header\" role=\"tab\" id=\"headingThree\">\n                    <h5 class=\"mb-0\">\n                      <a class=\"collapsed\" data-bs-toggle=\"collapse\" href=\"#collapseThree\" aria-expanded=\"false\" aria-controls=\"collapseThree\">\n                        Collapsible Group Item #3\n                      </a>\n                    </h5>\n                  </div>\n                  <div id=\"collapseThree\" class=\"collapse\" data-bs-parent=\"#accordion\" role=\"tabpanel\" aria-labelledby=\"headingThree\">\n                    <div class=\"card-body\">\n                      Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS.\n                    </div>\n                  </div>\n                </div>\n              </div>\n\n              <hr>\n\n              <h4>Overflowing text to show scroll behavior</h4>\n              <p>Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.</p>\n              <p>Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor.</p>\n              <p>Aenean lacinia bibendum nulla sed consectetur. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Donec sed odio dui. Donec ullamcorper nulla non metus auctor fringilla.</p>\n              <p>Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.</p>\n              <p>Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor.</p>\n              <p>Aenean lacinia bibendum nulla sed consectetur. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Donec sed odio dui. Donec ullamcorper nulla non metus auctor fringilla.</p>\n              <p>Cras mattis consectetur purus sit amet fermentum. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.</p>\n              <p>Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor.</p>\n              <p>Aenean lacinia bibendum nulla sed consectetur. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Donec sed odio dui. Donec ullamcorper nulla non metus auctor fringilla.</p>\n            </div>\n            <div class=\"modal-footer\">\n              <button type=\"button\" class=\"btn btn-secondary\" data-bs-dismiss=\"modal\">Close</button>\n              <button type=\"button\" class=\"btn btn-primary\">Save changes</button>\n            </div>\n          </div>\n        </div>\n      </div>\n\n      <div class=\"modal fade\" id=\"firefoxModal\" tabindex=\"-1\" aria-labelledby=\"firefoxModalLabel\" aria-hidden=\"true\">\n        <div class=\"modal-dialog\">\n          <div class=\"modal-content\">\n            <div class=\"modal-header\">\n              <h1 class=\"modal-title fs-4\" id=\"firefoxModalLabel\">Firefox Bug Test</h1>\n              <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>\n            </div>\n            <div class=\"modal-body\">\n              <ol>\n                <li>Ensure you're using Firefox.</li>\n                <li>Open a new tab and then switch back to this tab.</li>\n                <li>Click into this input: <input type=\"text\" id=\"ff-bug-input\"></li>\n                <li>Switch to the other tab and then back to this tab.</li>\n              </ol>\n              <p>Test result: <strong id=\"ff-bug-test-result\"></strong></p>\n            </div>\n            <div class=\"modal-footer\">\n              <button type=\"button\" class=\"btn btn-secondary\" data-bs-dismiss=\"modal\">Close</button>\n              <button type=\"button\" class=\"btn btn-primary\">Save changes</button>\n            </div>\n          </div>\n        </div>\n      </div>\n\n      <div class=\"modal fade\" id=\"slowModal\" tabindex=\"-1\" aria-labelledby=\"slowModalLabel\" aria-hidden=\"true\" style=\"transition-duration: 5s;\">\n        <div class=\"modal-dialog\" style=\"transition-duration: inherit;\">\n          <div class=\"modal-content\">\n            <div class=\"modal-header\">\n              <h1 class=\"modal-title fs-4\" id=\"slowModalLabel\">Lorem slowly</h1>\n              <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>\n            </div>\n            <div class=\"modal-body\">\n              <p>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Donec sed odio dui. Nullam quis risus eget urna mollis ornare vel eu leo. Nulla vitae elit libero, a pharetra augue.</p>\n            </div>\n            <div class=\"modal-footer\">\n              <button type=\"button\" class=\"btn btn-secondary\" data-bs-dismiss=\"modal\">Close</button>\n              <button type=\"button\" class=\"btn btn-primary\">Save changes</button>\n            </div>\n          </div>\n        </div>\n      </div>\n\n      <button type=\"button\" class=\"btn btn-primary btn-lg\" data-bs-toggle=\"modal\" data-bs-target=\"#myModal\">\n        Launch demo modal\n      </button>\n\n      <button type=\"button\" class=\"btn btn-primary btn-lg\" id=\"tall-toggle\">\n        Toggle tall &lt;body&gt; content\n      </button>\n\n      <br><br>\n\n      <button type=\"button\" class=\"btn btn-secondary btn-lg\" data-bs-toggle=\"modal\" data-bs-target=\"#firefoxModal\">\n        Launch Firefox bug test modal\n      </button>\n      (<a href=\"https://github.com/twbs/bootstrap/issues/18365\">See Issue #18365</a>)\n\n      <br><br>\n\n      <button type=\"button\" class=\"btn btn-secondary btn-lg\" data-bs-toggle=\"modal\" data-bs-target=\"#slowModal\">\n        Launch modal with slow transition\n      </button>\n\n      <br><br>\n\n      <div class=\"text-bg-dark p-2\" id=\"tall\" style=\"display: none;\">\n        Tall body content to force the page to have a scrollbar.\n      </div>\n\n      <button type=\"button\" class=\"btn btn-secondary btn-lg\" data-bs-toggle=\"modal\" data-bs-target=\"&#x3C;div class=&#x22;modal fade the-bad&#x22; tabindex=&#x22;-1&#x22;&#x3E;&#x3C;div class=&#x22;modal-dialog&#x22;&#x3E;&#x3C;div class=&#x22;modal-content&#x22;&#x3E;&#x3C;div class=&#x22;modal-header&#x22;&#x3E;&#x3C;button type=&#x22;button&#x22; class=&#x22;btn-close&#x22; data-bs-dismiss=&#x22;modal&#x22; aria-label=&#x22;Close&#x22;&#x3E;&#x3C;span aria-hidden=&#x22;true&#x22;&#x3E;&#x26;times;&#x3C;/span&#x3E;&#x3C;/button&#x3E;&#x3C;h1 class=&#x22;modal-title fs-4&#x22;&#x3E;The Bad Modal&#x3C;/h1&#x3E;&#x3C;/div&#x3E;&#x3C;div class=&#x22;modal-body&#x22;&#x3E;This modal&#x27;s HTTML source code is declared inline, inside the data-bs-target attribute of it&#x27;s show-button&#x3C;/div&#x3E;&#x3C;/div&#x3E;&#x3C;/div&#x3E;&#x3C;/div&#x3E;\">\n        Modal with an XSS inside the data-bs-target\n      </button>\n\n      <br><br>\n\n      <button type=\"button\" class=\"btn btn-secondary btn-lg\" id=\"btnPreventModal\">\n        Launch prevented modal on hide (to see the result open your console)\n      </button>\n    </div>\n\n    <script src=\"../../../dist/js/bootstrap.bundle.js\"></script>\n    <script>\n      /* global bootstrap: false */\n\n      const ffBugTestResult = document.getElementById('ff-bug-test-result')\n      const firefoxTestDone = false\n\n      function reportFirefoxTestResult(result) {\n        if (!firefoxTestDone) {\n          ffBugTestResult.classList.add(result ? 'text-success' : 'text-danger')\n          ffBugTestResult.textContent = result ? 'PASS' : 'FAIL'\n        }\n      }\n\n      document.querySelectorAll('[data-bs-toggle=\"popover\"]').forEach(popoverEl => new bootstrap.Popover(popoverEl))\n\n      document.querySelectorAll('[data-bs-toggle=\"tooltip\"]').forEach(tooltipEl => new bootstrap.Tooltip(tooltipEl))\n\n      const tall = document.getElementById('tall')\n      document.getElementById('tall-toggle').addEventListener('click', () => {\n        tall.style.display = tall.style.display === 'none' ? 'block' : 'none'\n      })\n\n      const ffBugInput = document.getElementById('ff-bug-input')\n      const firefoxModal = document.getElementById('firefoxModal')\n      function handlerClickFfBugInput() {\n        firefoxModal.addEventListener('focus', reportFirefoxTestResult.bind(false))\n        ffBugInput.addEventListener('focus', reportFirefoxTestResult.bind(true))\n        ffBugInput.removeEventListener('focus', handlerClickFfBugInput)\n      }\n\n      ffBugInput.addEventListener('focus', handlerClickFfBugInput)\n\n      const modalFf = new bootstrap.Modal(firefoxModal)\n\n      document.getElementById('btnPreventModal').addEventListener('click', () => {\n        const shownFirefoxModal = () => {\n          modalFf.hide()\n          firefoxModal.removeEventListener('shown.bs.modal', hideFirefoxModal)\n        }\n\n        const hideFirefoxModal = event => {\n          event.preventDefault()\n          firefoxModal.removeEventListener('hide.bs.modal', hideFirefoxModal)\n\n          if (modalFf._isTransitioning) {\n            console.error('Modal plugin should not set _isTransitioning when hide event is prevented')\n          } else {\n            console.log('Test passed')\n            modalFf.hide() // work as expected\n          }\n        }\n\n        firefoxModal.addEventListener('shown.bs.modal', shownFirefoxModal)\n        firefoxModal.addEventListener('hide.bs.modal', hideFirefoxModal)\n        modalFf.show()\n      })\n\n      // Test transition duration\n      let t0\n      let t1\n      const slowModal = document.getElementById('slowModal')\n\n      slowModal.addEventListener('shown.bs.modal', () => {\n        t1 = performance.now()\n        console.log(`transition-duration took ${t1 - t0}ms.`)\n      })\n\n      slowModal.addEventListener('show.bs.modal', () => {\n        t0 = performance.now()\n      })\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "js/tests/visual/popover.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <link href=\"../../../dist/css/bootstrap.min.css\" rel=\"stylesheet\">\n    <title>Popover</title>\n  </head>\n  <body>\n    <div class=\"container\">\n      <h1>Popover <small>Bootstrap Visual Test</small></h1>\n\n      <button type=\"button\" class=\"btn btn-secondary\" data-bs-container=\"body\" data-bs-toggle=\"popover\" data-bs-placement=\"auto\" data-bs-content=\"Vivamus sagittis lacus vel augue laoreet rutrum faucibus.\">\n        Popover on auto\n      </button>\n\n      <button type=\"button\" class=\"btn btn-secondary\" data-bs-container=\"body\" data-bs-toggle=\"popover\" data-bs-placement=\"top\" data-bs-content=\"Default placement was on top but not enough place\">\n        Popover on top\n      </button>\n\n      <button type=\"button\" class=\"btn btn-secondary\" data-bs-container=\"body\" data-bs-toggle=\"popover\" data-bs-placement=\"right\" data-bs-content=\"Vivamus sagittis lacus vel augue laoreet rutrum faucibus.\">\n        Popover on end\n      </button>\n\n      <button type=\"button\" class=\"btn btn-secondary\" data-bs-container=\"body\" data-bs-toggle=\"popover\" data-bs-placement=\"bottom\" data-bs-content=\"Vivamus sagittis lacus vel augue laoreet rutrum faucibus.\">\n        Popover on bottom\n      </button>\n\n      <button type=\"button\" class=\"btn btn-secondary\" data-bs-container=\"body\" data-bs-toggle=\"popover\" data-bs-placement=\"left\" data-bs-content=\"Vivamus sagittis lacus vel augue laoreet rutrum faucibus.\">\n        Popover on start\n      </button>\n    </div>\n\n    <script src=\"../../../dist/js/bootstrap.bundle.js\"></script>\n    <script>\n      /* global bootstrap: false */\n\n      document.querySelectorAll('[data-bs-toggle=\"popover\"]').forEach(popoverEl => new bootstrap.Popover(popoverEl))\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "js/tests/visual/scrollspy.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <link href=\"../../../dist/css/bootstrap.min.css\" rel=\"stylesheet\">\n    <title>Scrollspy</title>\n    <style>\n      body { padding-top: 70px; }\n    </style>\n  </head>\n  <body data-bs-spy=\"scroll\" data-bs-target=\".navbar\" data-bs-offset=\"70\">\n    <nav class=\"navbar navbar-expand-md navbar-dark bg-dark fixed-top\">\n      <a class=\"navbar-brand\" href=\"#\">Scrollspy test</a>\n      <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbarSupportedContent\" aria-controls=\"navbarSupportedContent\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n        <span class=\"navbar-toggler-icon\"></span>\n      </button>\n      <div class=\"navbar-collapse collapse\" id=\"navbarSupportedContent\">\n        <ul class=\"navbar-nav me-auto\">\n          <li class=\"nav-item\">\n            <a class=\"nav-link\" href=\"#fat\">@fat</a>\n          </li>\n          <li class=\"nav-item\">\n            <a class=\"nav-link\" href=\"#mdo\">@mdo</a>\n          </li>\n          <li class=\"nav-item dropdown\">\n            <a class=\"nav-link dropdown-toggle\" href=\"#\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">Dropdown</a>\n            <ul class=\"dropdown-menu\">\n              <li><a class=\"dropdown-item\" href=\"#one\">One</a></li>\n              <li><a class=\"dropdown-item\" href=\"#two\">Two</a></li>\n              <li><a class=\"dropdown-item\" href=\"#three\">Three</a></li>\n              <li><a class=\"dropdown-item\" href=\"#présentation\">Présentation</a></li>\n            </ul>\n          </li>\n          <li class=\"nav-item\">\n            <a class=\"nav-link\" href=\"#final\">Final</a>\n          </li>\n        </ul>\n      </div>\n    </nav>\n    <div class=\"container\">\n      <h2 id=\"fat\">@fat</h2>\n      <p>Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.</p>\n      <p>Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.</p>\n      <p>Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.</p>\n      <p>Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.</p>\n      <p>Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.</p>\n      <hr>\n      <h2 id=\"mdo\">@mdo</h2>\n      <p>Veniam marfa mustache skateboard, adipisicing fugiat velit pitchfork beard. Freegan beard aliqua cupidatat mcsweeney's vero. Cupidatat four loko nisi, ea helvetica nulla carles. Tattooed cosby sweater food truck, mcsweeney's quis non freegan vinyl. Lo-fi wes anderson +1 sartorial. Carles non aesthetic exercitation quis gentrify. Brooklyn adipisicing craft beer vice keytar deserunt.</p>\n      <p>Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.</p>\n      <p>Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.</p>\n      <p>Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.</p>\n      <p>Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.</p>\n      <hr>\n      <h2 id=\"one\">one</h2>\n      <p>Occaecat commodo aliqua delectus. Fap craft beer deserunt skateboard ea. Lomo bicycle rights adipisicing banh mi, velit ea sunt next level locavore single-origin coffee in magna veniam. High life id vinyl, echo park consequat quis aliquip banh mi pitchfork. Vero VHS est adipisicing. Consectetur nisi DIY minim messenger bag. Cred ex in, sustainable delectus consectetur fanny pack iphone.</p>\n      <p>Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.</p>\n      <p>Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.</p>\n      <p>Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.</p>\n      <p>Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.</p>\n      <hr>\n      <h2 id=\"two\">two</h2>\n      <p>In incididunt echo park, officia deserunt mcsweeney's proident master cleanse thundercats sapiente veniam. Excepteur VHS elit, proident shoreditch +1 biodiesel laborum craft beer. Single-origin coffee wayfarers irure four loko, cupidatat terry richardson master cleanse. Assumenda you probably haven't heard of them art party fanny pack, tattooed nulla cardigan tempor ad. Proident wolf nesciunt sartorial keffiyeh eu banh mi sustainable. Elit wolf voluptate, lo-fi ea portland before they sold out four loko. Locavore enim nostrud mlkshk brooklyn nesciunt.</p>\n      <p>Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.</p>\n      <p>Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.</p>\n      <p>Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.</p>\n      <p>Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.</p>\n      <hr>\n      <h2 id=\"three\">three</h2>\n      <p>Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.</p>\n      <p>Keytar twee blog, culpa messenger bag marfa whatever delectus food truck. Sapiente synth id assumenda. Locavore sed helvetica cliche irony, thundercats you probably haven't heard of them consequat hoodie gluten-free lo-fi fap aliquip. Labore elit placeat before they sold out, terry richardson proident brunch nesciunt quis cosby sweater pariatur keffiyeh ut helvetica artisan. Cardigan craft beer seitan readymade velit. VHS chambray laboris tempor veniam. Anim mollit minim commodo ullamco thundercats.</p>\n      <p>Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.</p>\n      <p>Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.</p>\n      <p>Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.</p>\n      <p>Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.</p>\n      <p>Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.</p>\n      <p>Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.</p>\n      <p>Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.</p>\n      <p>Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.</p>\n      <p>Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.</p>\n      <p>Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.</p>\n      <p>Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.</p>\n      <p>Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.</p>\n      <hr>\n      <h2 id=\"présentation\">Présentation</h2>\n      <p>Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.</p>\n      <p>Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.</p>\n      <p>Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.</p>\n      <p>Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.</p>\n      <p>Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.</p>\n      <p>Ad leggings keytar, brunch id art party dolor labore. Pitchfork yr enim lo-fi before they sold out qui. Tumblr farm-to-table bicycle rights whatever. Anim keffiyeh carles cardigan. Velit seitan mcsweeney's photo booth 3 wolf moon irure. Cosby sweater lomo jean shorts, williamsburg hoodie minim qui you probably haven't heard of them et cardigan trust fund culpa biodiesel wes anderson aesthetic. Nihil tattooed accusamus, cred irony biodiesel keffiyeh artisan ullamco consequat.</p>\n      <hr>\n      <h2 id=\"final\">Final section</h2>\n      <p>Ad leggings keytar, brunch id art party dolor labore.</p>\n    </div>\n\n    <script src=\"../../../dist/js/bootstrap.bundle.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "js/tests/visual/tab.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <link href=\"../../../dist/css/bootstrap.min.css\" rel=\"stylesheet\">\n    <title>Tab</title>\n    <style>\n      h4 {\n        margin: 40px 0 10px;\n      }\n    </style>\n  </head>\n  <body>\n    <div class=\"container\">\n      <h1>Tab <small>Bootstrap Visual Test</small></h1>\n\n      <h4>Tabs without fade</h4>\n\n      <ul class=\"nav nav-tabs\" role=\"tablist\">\n        <li class=\"nav-item\" role=\"presentation\">\n          <button type=\"button\" class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#home\" role=\"tab\" aria-selected=\"true\">Home</button>\n        </li>\n        <li class=\"nav-item\" role=\"presentation\">\n          <button type=\"button\" class=\"nav-link\" data-bs-toggle=\"tab\" data-bs-target=\"#profile\" role=\"tab\">Profile</button>\n        </li>\n        <li class=\"nav-item\" role=\"presentation\">\n          <button type=\"button\" class=\"nav-link\" data-bs-toggle=\"tab\" data-bs-target=\"#fat\" role=\"tab\">@fat</button>\n        </li>\n        <li class=\"nav-item\" role=\"presentation\">\n          <button type=\"button\" class=\"nav-link\" data-bs-toggle=\"tab\" data-bs-target=\"#mdo\" role=\"tab\">@mdo</button>\n        </li>\n      </ul>\n\n      <div class=\"tab-content\" role=\"tablist\">\n        <div class=\"tab-pane active\" id=\"home\" role=\"tabpanel\">\n          <p>Raw denim you probably haven't heard of them jean shorts Austin. Nesciunt tofu stumptown aliqua, retro synth master cleanse. Mustache cliche tempor, williamsburg carles vegan helvetica. Reprehenderit butcher retro keffiyeh dreamcatcher synth. Cosby sweater eu banh mi, qui irure terry richardson ex squid. Aliquip placeat salvia cillum iphone. Seitan aliquip quis cardigan american apparel, butcher voluptate nisi qui.</p>\n          <p>Raw denim you probably haven't heard of them jean shorts Austin. Nesciunt tofu stumptown aliqua, retro synth master cleanse. Mustache cliche tempor, williamsburg carles vegan helvetica. Reprehenderit butcher retro keffiyeh dreamcatcher synth. Cosby sweater eu banh mi, qui irure terry richardson ex squid. Aliquip placeat salvia cillum iphone. Seitan aliquip quis cardigan american apparel, butcher voluptate nisi qui.</p>\n        </div>\n        <div class=\"tab-pane\" id=\"profile\" role=\"tabpanel\">\n          <p>Food truck fixie locavore, accusamus mcsweeney's marfa nulla single-origin coffee squid. Exercitation +1 labore velit, blog sartorial PBR leggings next level wes anderson artisan four loko farm-to-table craft beer twee. Qui photo booth letterpress, commodo enim craft beer mlkshk aliquip jean shorts ullamco ad vinyl cillum PBR. Homo nostrud organic, assumenda labore aesthetic magna delectus mollit. Keytar helvetica VHS salvia yr, vero magna velit sapiente labore stumptown. Vegan fanny pack odio cillum wes anderson 8-bit, sustainable jean shorts beard ut DIY ethical culpa terry richardson biodiesel. Art party scenester stumptown, tumblr butcher vero sint qui sapiente accusamus tattooed echo park.</p>\n          <p>Food truck fixie locavore, accusamus mcsweeney's marfa nulla single-origin coffee squid. Exercitation +1 labore velit, blog sartorial PBR leggings next level wes anderson artisan four loko farm-to-table craft beer twee. Qui photo booth letterpress, commodo enim craft beer mlkshk aliquip jean shorts ullamco ad vinyl cillum PBR. Homo nostrud organic, assumenda labore aesthetic magna delectus mollit. Keytar helvetica VHS salvia yr, vero magna velit sapiente labore stumptown. Vegan fanny pack odio cillum wes anderson 8-bit, sustainable jean shorts beard ut DIY ethical culpa terry richardson biodiesel. Art party scenester stumptown, tumblr butcher vero sint qui sapiente accusamus tattooed echo park.</p>\n        </div>\n        <div class=\"tab-pane\" id=\"fat\" role=\"tabpanel\">\n          <p>Etsy mixtape wayfarers, ethical wes anderson tofu before they sold out mcsweeney's organic lomo retro fanny pack lo-fi farm-to-table readymade. Messenger bag gentrify pitchfork tattooed craft beer, iphone skateboard locavore carles etsy salvia banksy hoodie helvetica. DIY synth PBR banksy irony. Leggings gentrify squid 8-bit cred pitchfork. Williamsburg banh mi whatever gluten-free, carles pitchfork biodiesel fixie etsy retro mlkshk vice blog. Scenester cred you probably haven't heard of them, vinyl craft beer blog stumptown. Pitchfork sustainable tofu synth chambray yr.</p>\n          <p>Etsy mixtape wayfarers, ethical wes anderson tofu before they sold out mcsweeney's organic lomo retro fanny pack lo-fi farm-to-table readymade. Messenger bag gentrify pitchfork tattooed craft beer, iphone skateboard locavore carles etsy salvia banksy hoodie helvetica. DIY synth PBR banksy irony. Leggings gentrify squid 8-bit cred pitchfork. Williamsburg banh mi whatever gluten-free, carles pitchfork biodiesel fixie etsy retro mlkshk vice blog. Scenester cred you probably haven't heard of them, vinyl craft beer blog stumptown. Pitchfork sustainable tofu synth chambray yr.</p>\n        </div>\n        <div class=\"tab-pane\" id=\"mdo\" role=\"tabpanel\">\n          <p>Trust fund seitan letterpress, keytar raw denim keffiyeh etsy art party before they sold out master cleanse gluten-free squid scenester freegan cosby sweater. Fanny pack portland seitan DIY, art party locavore wolf cliche high life echo park Austin. Cred vinyl keffiyeh DIY salvia PBR, banh mi before they sold out farm-to-table VHS viral locavore cosby sweater. Lomo wolf viral, mustache readymade thundercats keffiyeh craft beer marfa ethical. Wolf salvia freegan, sartorial keffiyeh echo park vegan.</p>\n          <p>Trust fund seitan letterpress, keytar raw denim keffiyeh etsy art party before they sold out master cleanse gluten-free squid scenester freegan cosby sweater. Fanny pack portland seitan DIY, art party locavore wolf cliche high life echo park Austin. Cred vinyl keffiyeh DIY salvia PBR, banh mi before they sold out farm-to-table VHS viral locavore cosby sweater. Lomo wolf viral, mustache readymade thundercats keffiyeh craft beer marfa ethical. Wolf salvia freegan, sartorial keffiyeh echo park vegan.</p>\n        </div>\n      </div>\n\n      <h4>Tabs with fade</h4>\n\n      <ul class=\"nav nav-tabs\" role=\"tablist\">\n        <li class=\"nav-item\" role=\"presentation\">\n          <button type=\"button\" class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#home2\" role=\"tab\" aria-selected=\"true\">Home</button>\n        </li>\n        <li class=\"nav-item\" role=\"presentation\">\n          <button type=\"button\" class=\"nav-link\" data-bs-toggle=\"tab\" data-bs-target=\"#profile2\" role=\"tab\">Profile</button>\n        </li>\n        <li class=\"nav-item\" role=\"presentation\">\n          <button type=\"button\" class=\"nav-link\" data-bs-toggle=\"tab\" data-bs-target=\"#fat2\" role=\"tab\">@fat</button>\n        </li>\n        <li class=\"nav-item\" role=\"presentation\">\n          <button type=\"button\" class=\"nav-link\" data-bs-toggle=\"tab\" data-bs-target=\"#mdo2\" role=\"tab\">@mdo</button>\n        </li>\n      </ul>\n\n      <div class=\"tab-content\" role=\"tablist\">\n        <div class=\"tab-pane fade show active\" id=\"home2\" role=\"tabpanel\">\n          <p>Raw denim you probably haven't heard of them jean shorts Austin. Nesciunt tofu stumptown aliqua, retro synth master cleanse. Mustache cliche tempor, williamsburg carles vegan helvetica. Reprehenderit butcher retro keffiyeh dreamcatcher synth. Cosby sweater eu banh mi, qui irure terry richardson ex squid. Aliquip placeat salvia cillum iphone. Seitan aliquip quis cardigan american apparel, butcher voluptate nisi qui.</p>\n          <p>Raw denim you probably haven't heard of them jean shorts Austin. Nesciunt tofu stumptown aliqua, retro synth master cleanse. Mustache cliche tempor, williamsburg carles vegan helvetica. Reprehenderit butcher retro keffiyeh dreamcatcher synth. Cosby sweater eu banh mi, qui irure terry richardson ex squid. Aliquip placeat salvia cillum iphone. Seitan aliquip quis cardigan american apparel, butcher voluptate nisi qui.</p>\n        </div>\n        <div class=\"tab-pane fade\" id=\"profile2\" role=\"tabpanel\">\n          <p>Food truck fixie locavore, accusamus mcsweeney's marfa nulla single-origin coffee squid. Exercitation +1 labore velit, blog sartorial PBR leggings next level wes anderson artisan four loko farm-to-table craft beer twee. Qui photo booth letterpress, commodo enim craft beer mlkshk aliquip jean shorts ullamco ad vinyl cillum PBR. Homo nostrud organic, assumenda labore aesthetic magna delectus mollit. Keytar helvetica VHS salvia yr, vero magna velit sapiente labore stumptown. Vegan fanny pack odio cillum wes anderson 8-bit, sustainable jean shorts beard ut DIY ethical culpa terry richardson biodiesel. Art party scenester stumptown, tumblr butcher vero sint qui sapiente accusamus tattooed echo park.</p>\n          <p>Food truck fixie locavore, accusamus mcsweeney's marfa nulla single-origin coffee squid. Exercitation +1 labore velit, blog sartorial PBR leggings next level wes anderson artisan four loko farm-to-table craft beer twee. Qui photo booth letterpress, commodo enim craft beer mlkshk aliquip jean shorts ullamco ad vinyl cillum PBR. Homo nostrud organic, assumenda labore aesthetic magna delectus mollit. Keytar helvetica VHS salvia yr, vero magna velit sapiente labore stumptown. Vegan fanny pack odio cillum wes anderson 8-bit, sustainable jean shorts beard ut DIY ethical culpa terry richardson biodiesel. Art party scenester stumptown, tumblr butcher vero sint qui sapiente accusamus tattooed echo park.</p>\n        </div>\n        <div class=\"tab-pane fade\" id=\"fat2\" role=\"tabpanel\">\n          <p>Etsy mixtape wayfarers, ethical wes anderson tofu before they sold out mcsweeney's organic lomo retro fanny pack lo-fi farm-to-table readymade. Messenger bag gentrify pitchfork tattooed craft beer, iphone skateboard locavore carles etsy salvia banksy hoodie helvetica. DIY synth PBR banksy irony. Leggings gentrify squid 8-bit cred pitchfork. Williamsburg banh mi whatever gluten-free, carles pitchfork biodiesel fixie etsy retro mlkshk vice blog. Scenester cred you probably haven't heard of them, vinyl craft beer blog stumptown. Pitchfork sustainable tofu synth chambray yr.</p>\n          <p>Etsy mixtape wayfarers, ethical wes anderson tofu before they sold out mcsweeney's organic lomo retro fanny pack lo-fi farm-to-table readymade. Messenger bag gentrify pitchfork tattooed craft beer, iphone skateboard locavore carles etsy salvia banksy hoodie helvetica. DIY synth PBR banksy irony. Leggings gentrify squid 8-bit cred pitchfork. Williamsburg banh mi whatever gluten-free, carles pitchfork biodiesel fixie etsy retro mlkshk vice blog. Scenester cred you probably haven't heard of them, vinyl craft beer blog stumptown. Pitchfork sustainable tofu synth chambray yr.</p>\n        </div>\n        <div class=\"tab-pane fade\" id=\"mdo2\" role=\"tabpanel\">\n          <p>Trust fund seitan letterpress, keytar raw denim keffiyeh etsy art party before they sold out master cleanse gluten-free squid scenester freegan cosby sweater. Fanny pack portland seitan DIY, art party locavore wolf cliche high life echo park Austin. Cred vinyl keffiyeh DIY salvia PBR, banh mi before they sold out farm-to-table VHS viral locavore cosby sweater. Lomo wolf viral, mustache readymade thundercats keffiyeh craft beer marfa ethical. Wolf salvia freegan, sartorial keffiyeh echo park vegan.</p>\n          <p>Trust fund seitan letterpress, keytar raw denim keffiyeh etsy art party before they sold out master cleanse gluten-free squid scenester freegan cosby sweater. Fanny pack portland seitan DIY, art party locavore wolf cliche high life echo park Austin. Cred vinyl keffiyeh DIY salvia PBR, banh mi before they sold out farm-to-table VHS viral locavore cosby sweater. Lomo wolf viral, mustache readymade thundercats keffiyeh craft beer marfa ethical. Wolf salvia freegan, sartorial keffiyeh echo park vegan.</p>\n        </div>\n      </div>\n\n      <h4>Tabs without fade (no initially active pane)</h4>\n\n      <ul class=\"nav nav-tabs\" role=\"tablist\">\n        <li class=\"nav-item\" role=\"presentation\">\n          <button type=\"button\" class=\"nav-link\" data-bs-toggle=\"tab\" data-bs-target=\"#home3\" role=\"tab\">Home</button>\n        </li>\n        <li class=\"nav-item\" role=\"presentation\">\n          <button type=\"button\" class=\"nav-link\" data-bs-toggle=\"tab\" data-bs-target=\"#profile3\" role=\"tab\">Profile</button>\n        </li>\n        <li class=\"nav-item\" role=\"presentation\">\n          <button type=\"button\" class=\"nav-link\" data-bs-toggle=\"tab\" data-bs-target=\"#fat3\" role=\"tab\">@fat</button>\n        </li>\n        <li class=\"nav-item\" role=\"presentation\">\n          <button type=\"button\" class=\"nav-link\" data-bs-toggle=\"tab\" data-bs-target=\"#mdo3\" role=\"tab\">@mdo</button>\n        </li>\n      </ul>\n\n      <div class=\"tab-content\" role=\"tablist\">\n        <div class=\"tab-pane\" id=\"home3\" role=\"tabpanel\">\n          <p>Raw denim you probably haven't heard of them jean shorts Austin. Nesciunt tofu stumptown aliqua, retro synth master cleanse. Mustache cliche tempor, williamsburg carles vegan helvetica. Reprehenderit butcher retro keffiyeh dreamcatcher synth. Cosby sweater eu banh mi, qui irure terry richardson ex squid. Aliquip placeat salvia cillum iphone. Seitan aliquip quis cardigan american apparel, butcher voluptate nisi qui.</p>\n          <p>Raw denim you probably haven't heard of them jean shorts Austin. Nesciunt tofu stumptown aliqua, retro synth master cleanse. Mustache cliche tempor, williamsburg carles vegan helvetica. Reprehenderit butcher retro keffiyeh dreamcatcher synth. Cosby sweater eu banh mi, qui irure terry richardson ex squid. Aliquip placeat salvia cillum iphone. Seitan aliquip quis cardigan american apparel, butcher voluptate nisi qui.</p>\n        </div>\n        <div class=\"tab-pane\" id=\"profile3\" role=\"tabpanel\">\n          <p>Food truck fixie locavore, accusamus mcsweeney's marfa nulla single-origin coffee squid. Exercitation +1 labore velit, blog sartorial PBR leggings next level wes anderson artisan four loko farm-to-table craft beer twee. Qui photo booth letterpress, commodo enim craft beer mlkshk aliquip jean shorts ullamco ad vinyl cillum PBR. Homo nostrud organic, assumenda labore aesthetic magna delectus mollit. Keytar helvetica VHS salvia yr, vero magna velit sapiente labore stumptown. Vegan fanny pack odio cillum wes anderson 8-bit, sustainable jean shorts beard ut DIY ethical culpa terry richardson biodiesel. Art party scenester stumptown, tumblr butcher vero sint qui sapiente accusamus tattooed echo park.</p>\n          <p>Food truck fixie locavore, accusamus mcsweeney's marfa nulla single-origin coffee squid. Exercitation +1 labore velit, blog sartorial PBR leggings next level wes anderson artisan four loko farm-to-table craft beer twee. Qui photo booth letterpress, commodo enim craft beer mlkshk aliquip jean shorts ullamco ad vinyl cillum PBR. Homo nostrud organic, assumenda labore aesthetic magna delectus mollit. Keytar helvetica VHS salvia yr, vero magna velit sapiente labore stumptown. Vegan fanny pack odio cillum wes anderson 8-bit, sustainable jean shorts beard ut DIY ethical culpa terry richardson biodiesel. Art party scenester stumptown, tumblr butcher vero sint qui sapiente accusamus tattooed echo park.</p>\n        </div>\n        <div class=\"tab-pane\" id=\"fat3\" role=\"tabpanel\">\n          <p>Etsy mixtape wayfarers, ethical wes anderson tofu before they sold out mcsweeney's organic lomo retro fanny pack lo-fi farm-to-table readymade. Messenger bag gentrify pitchfork tattooed craft beer, iphone skateboard locavore carles etsy salvia banksy hoodie helvetica. DIY synth PBR banksy irony. Leggings gentrify squid 8-bit cred pitchfork. Williamsburg banh mi whatever gluten-free, carles pitchfork biodiesel fixie etsy retro mlkshk vice blog. Scenester cred you probably haven't heard of them, vinyl craft beer blog stumptown. Pitchfork sustainable tofu synth chambray yr.</p>\n          <p>Etsy mixtape wayfarers, ethical wes anderson tofu before they sold out mcsweeney's organic lomo retro fanny pack lo-fi farm-to-table readymade. Messenger bag gentrify pitchfork tattooed craft beer, iphone skateboard locavore carles etsy salvia banksy hoodie helvetica. DIY synth PBR banksy irony. Leggings gentrify squid 8-bit cred pitchfork. Williamsburg banh mi whatever gluten-free, carles pitchfork biodiesel fixie etsy retro mlkshk vice blog. Scenester cred you probably haven't heard of them, vinyl craft beer blog stumptown. Pitchfork sustainable tofu synth chambray yr.</p>\n        </div>\n        <div class=\"tab-pane\" id=\"mdo3\" role=\"tabpanel\">\n          <p>Trust fund seitan letterpress, keytar raw denim keffiyeh etsy art party before they sold out master cleanse gluten-free squid scenester freegan cosby sweater. Fanny pack portland seitan DIY, art party locavore wolf cliche high life echo park Austin. Cred vinyl keffiyeh DIY salvia PBR, banh mi before they sold out farm-to-table VHS viral locavore cosby sweater. Lomo wolf viral, mustache readymade thundercats keffiyeh craft beer marfa ethical. Wolf salvia freegan, sartorial keffiyeh echo park vegan.</p>\n          <p>Trust fund seitan letterpress, keytar raw denim keffiyeh etsy art party before they sold out master cleanse gluten-free squid scenester freegan cosby sweater. Fanny pack portland seitan DIY, art party locavore wolf cliche high life echo park Austin. Cred vinyl keffiyeh DIY salvia PBR, banh mi before they sold out farm-to-table VHS viral locavore cosby sweater. Lomo wolf viral, mustache readymade thundercats keffiyeh craft beer marfa ethical. Wolf salvia freegan, sartorial keffiyeh echo park vegan.</p>\n        </div>\n      </div>\n\n      <h4>Tabs with fade (no initially active pane)</h4>\n\n      <ul class=\"nav nav-tabs\" role=\"tablist\">\n        <li class=\"nav-item\" role=\"presentation\">\n          <button type=\"button\" class=\"nav-link\" data-bs-toggle=\"tab\" data-bs-target=\"#home4\" role=\"tab\">Home</button>\n        </li>\n        <li class=\"nav-item\" role=\"presentation\">\n          <button type=\"button\" class=\"nav-link\" data-bs-toggle=\"tab\" data-bs-target=\"#profile4\" role=\"tab\">Profile</button>\n        </li>\n        <li class=\"nav-item\" role=\"presentation\">\n          <button type=\"button\" class=\"nav-link\" data-bs-toggle=\"tab\" data-bs-target=\"#fat4\" role=\"tab\">@fat</button>\n        </li>\n        <li class=\"nav-item\" role=\"presentation\">\n          <button type=\"button\" class=\"nav-link\" data-bs-toggle=\"tab\" data-bs-target=\"#mdo4\" role=\"tab\">@mdo</button>\n        </li>\n      </ul>\n\n      <div class=\"tab-content\">\n        <div class=\"tab-pane fade\" id=\"home4\" role=\"tabpanel\">\n          <p>Raw denim you probably haven't heard of them jean shorts Austin. Nesciunt tofu stumptown aliqua, retro synth master cleanse. Mustache cliche tempor, williamsburg carles vegan helvetica. Reprehenderit butcher retro keffiyeh dreamcatcher synth. Cosby sweater eu banh mi, qui irure terry richardson ex squid. Aliquip placeat salvia cillum iphone. Seitan aliquip quis cardigan american apparel, butcher voluptate nisi qui.</p>\n          <p>Raw denim you probably haven't heard of them jean shorts Austin. Nesciunt tofu stumptown aliqua, retro synth master cleanse. Mustache cliche tempor, williamsburg carles vegan helvetica. Reprehenderit butcher retro keffiyeh dreamcatcher synth. Cosby sweater eu banh mi, qui irure terry richardson ex squid. Aliquip placeat salvia cillum iphone. Seitan aliquip quis cardigan american apparel, butcher voluptate nisi qui.</p>\n        </div>\n        <div class=\"tab-pane fade\" id=\"profile4\" role=\"tabpanel\">\n          <p>Food truck fixie locavore, accusamus mcsweeney's marfa nulla single-origin coffee squid. Exercitation +1 labore velit, blog sartorial PBR leggings next level wes anderson artisan four loko farm-to-table craft beer twee. Qui photo booth letterpress, commodo enim craft beer mlkshk aliquip jean shorts ullamco ad vinyl cillum PBR. Homo nostrud organic, assumenda labore aesthetic magna delectus mollit. Keytar helvetica VHS salvia yr, vero magna velit sapiente labore stumptown. Vegan fanny pack odio cillum wes anderson 8-bit, sustainable jean shorts beard ut DIY ethical culpa terry richardson biodiesel. Art party scenester stumptown, tumblr butcher vero sint qui sapiente accusamus tattooed echo park.</p>\n          <p>Food truck fixie locavore, accusamus mcsweeney's marfa nulla single-origin coffee squid. Exercitation +1 labore velit, blog sartorial PBR leggings next level wes anderson artisan four loko farm-to-table craft beer twee. Qui photo booth letterpress, commodo enim craft beer mlkshk aliquip jean shorts ullamco ad vinyl cillum PBR. Homo nostrud organic, assumenda labore aesthetic magna delectus mollit. Keytar helvetica VHS salvia yr, vero magna velit sapiente labore stumptown. Vegan fanny pack odio cillum wes anderson 8-bit, sustainable jean shorts beard ut DIY ethical culpa terry richardson biodiesel. Art party scenester stumptown, tumblr butcher vero sint qui sapiente accusamus tattooed echo park.</p>\n        </div>\n        <div class=\"tab-pane fade\" id=\"fat4\" role=\"tabpanel\">\n          <p>Etsy mixtape wayfarers, ethical wes anderson tofu before they sold out mcsweeney's organic lomo retro fanny pack lo-fi farm-to-table readymade. Messenger bag gentrify pitchfork tattooed craft beer, iphone skateboard locavore carles etsy salvia banksy hoodie helvetica. DIY synth PBR banksy irony. Leggings gentrify squid 8-bit cred pitchfork. Williamsburg banh mi whatever gluten-free, carles pitchfork biodiesel fixie etsy retro mlkshk vice blog. Scenester cred you probably haven't heard of them, vinyl craft beer blog stumptown. Pitchfork sustainable tofu synth chambray yr.</p>\n          <p>Etsy mixtape wayfarers, ethical wes anderson tofu before they sold out mcsweeney's organic lomo retro fanny pack lo-fi farm-to-table readymade. Messenger bag gentrify pitchfork tattooed craft beer, iphone skateboard locavore carles etsy salvia banksy hoodie helvetica. DIY synth PBR banksy irony. Leggings gentrify squid 8-bit cred pitchfork. Williamsburg banh mi whatever gluten-free, carles pitchfork biodiesel fixie etsy retro mlkshk vice blog. Scenester cred you probably haven't heard of them, vinyl craft beer blog stumptown. Pitchfork sustainable tofu synth chambray yr.</p>\n        </div>\n        <div class=\"tab-pane fade\" id=\"mdo4\" role=\"tabpanel\">\n          <p>Trust fund seitan letterpress, keytar raw denim keffiyeh etsy art party before they sold out master cleanse gluten-free squid scenester freegan cosby sweater. Fanny pack portland seitan DIY, art party locavore wolf cliche high life echo park Austin. Cred vinyl keffiyeh DIY salvia PBR, banh mi before they sold out farm-to-table VHS viral locavore cosby sweater. Lomo wolf viral, mustache readymade thundercats keffiyeh craft beer marfa ethical. Wolf salvia freegan, sartorial keffiyeh echo park vegan.</p>\n          <p>Trust fund seitan letterpress, keytar raw denim keffiyeh etsy art party before they sold out master cleanse gluten-free squid scenester freegan cosby sweater. Fanny pack portland seitan DIY, art party locavore wolf cliche high life echo park Austin. Cred vinyl keffiyeh DIY salvia PBR, banh mi before they sold out farm-to-table VHS viral locavore cosby sweater. Lomo wolf viral, mustache readymade thundercats keffiyeh craft beer marfa ethical. Wolf salvia freegan, sartorial keffiyeh echo park vegan.</p>\n        </div>\n      </div>\n\n      <h4>Tabs with nav and using links (with fade)</h4>\n      <nav>\n        <div class=\"nav nav-pills\" id=\"nav-tab\" role=\"tablist\">\n          <a class=\"nav-link nav-item active\" role=\"tab\" data-bs-toggle=\"tab\" href=\"#home5\">Home</a>\n          <a class=\"nav-link nav-item\" role=\"tab\" data-bs-toggle=\"tab\" href=\"#profile5\">Profile</a>\n          <a class=\"nav-link nav-item\" role=\"tab\" data-bs-toggle=\"tab\" href=\"#fat5\">@fat</a>\n          <a class=\"nav-link nav-item\" role=\"tab\" data-bs-toggle=\"tab\" href=\"#mdo5\">@mdo</a>\n          <a class=\"nav-link nav-item disabled\" role=\"tab\" href=\"#\" aria-disabled=\"true\">Disabled</a>\n        </div>\n      </nav>\n\n      <div class=\"tab-content\">\n        <div class=\"tab-pane fade show active\" id=\"home5\" role=\"tabpanel\">\n          <p>Raw denim you probably haven't heard of them jean shorts Austin. Nesciunt tofu stumptown aliqua, retro synth master cleanse. Mustache cliche tempor, williamsburg carles vegan helvetica. Reprehenderit butcher retro keffiyeh dreamcatcher synth. Cosby sweater eu banh mi, qui irure terry richardson ex squid. Aliquip placeat salvia cillum iphone. Seitan aliquip quis cardigan american apparel, butcher voluptate nisi qui.</p>\n          <p>Raw denim you probably haven't heard of them jean shorts Austin. Nesciunt tofu stumptown aliqua, retro synth master cleanse. Mustache cliche tempor, williamsburg carles vegan helvetica. Reprehenderit butcher retro keffiyeh dreamcatcher synth. Cosby sweater eu banh mi, qui irure terry richardson ex squid. Aliquip placeat salvia cillum iphone. Seitan aliquip quis cardigan american apparel, butcher voluptate nisi qui.</p>\n        </div>\n        <div class=\"tab-pane fade\" id=\"profile5\" role=\"tabpanel\">\n          <p>Raw denim you probably haven't heard of them jean shorts Austin. Nesciunt tofu stumptown aliqua, retro synth master cleanse. Mustache cliche tempor, williamsburg carles vegan helvetica. Reprehenderit butcher retro keffiyeh dreamcatcher synth. Cosby sweater eu banh mi, qui irure terry richardson ex squid. Aliquip placeat salvia cillum iphone. Seitan aliquip quis cardigan american apparel, butcher voluptate nisi qui.</p>\n          <p>Raw denim you probably haven't heard of them jean shorts Austin. Nesciunt tofu stumptown aliqua, retro synth master cleanse. Mustache cliche tempor, williamsburg carles vegan helvetica. Reprehenderit butcher retro keffiyeh dreamcatcher synth. Cosby sweater eu banh mi, qui irure terry richardson ex squid. Aliquip placeat salvia cillum iphone. Seitan aliquip quis cardigan american apparel, butcher voluptate nisi qui.</p>\n        </div>\n        <div class=\"tab-pane fade\" id=\"fat5\" role=\"tabpanel\">\n          <p>Etsy mixtape wayfarers, ethical wes anderson tofu before they sold out mcsweeney's organic lomo retro fanny pack lo-fi farm-to-table readymade. Messenger bag gentrify pitchfork tattooed craft beer, iphone skateboard locavore carles etsy salvia banksy hoodie helvetica. DIY synth PBR banksy irony. Leggings gentrify squid 8-bit cred pitchfork. Williamsburg banh mi whatever gluten-free, carles pitchfork biodiesel fixie etsy retro mlkshk vice blog. Scenester cred you probably haven't heard of them, vinyl craft beer blog stumptown. Pitchfork sustainable tofu synth chambray yr.</p>\n          <p>Etsy mixtape wayfarers, ethical wes anderson tofu before they sold out mcsweeney's organic lomo retro fanny pack lo-fi farm-to-table readymade. Messenger bag gentrify pitchfork tattooed craft beer, iphone skateboard locavore carles etsy salvia banksy hoodie helvetica. DIY synth PBR banksy irony. Leggings gentrify squid 8-bit cred pitchfork. Williamsburg banh mi whatever gluten-free, carles pitchfork biodiesel fixie etsy retro mlkshk vice blog. Scenester cred you probably haven't heard of them, vinyl craft beer blog stumptown. Pitchfork sustainable tofu synth chambray yr.</p>\n        </div>\n        <div class=\"tab-pane fade\" id=\"mdo5\" role=\"tabpanel\">\n          <p>Trust fund seitan letterpress, keytar raw denim keffiyeh etsy art party before they sold out master cleanse gluten-free squid scenester freegan cosby sweater. Fanny pack portland seitan DIY, art party locavore wolf cliche high life echo park Austin. Cred vinyl keffiyeh DIY salvia PBR, banh mi before they sold out farm-to-table VHS viral locavore cosby sweater. Lomo wolf viral, mustache readymade thundercats keffiyeh craft beer marfa ethical. Wolf salvia freegan, sartorial keffiyeh echo park vegan.</p>\n          <p>Trust fund seitan letterpress, keytar raw denim keffiyeh etsy art party before they sold out master cleanse gluten-free squid scenester freegan cosby sweater. Fanny pack portland seitan DIY, art party locavore wolf cliche high life echo park Austin. Cred vinyl keffiyeh DIY salvia PBR, banh mi before they sold out farm-to-table VHS viral locavore cosby sweater. Lomo wolf viral, mustache readymade thundercats keffiyeh craft beer marfa ethical. Wolf salvia freegan, sartorial keffiyeh echo park vegan.</p>\n        </div>\n      </div>\n\n      <h4>Tabs with list-group (with fade)</h4>\n      <div class=\"row\">\n        <div class=\"col-4\">\n          <div class=\"list-group\" id=\"list-tab\" role=\"tablist\">\n            <button type=\"button\" class=\"list-group-item list-group-item-action active\" id=\"list-home-list\" data-bs-toggle=\"tab\" data-bs-target=\"#list-home\" role=\"tab\" aria-controls=\"list-home\" aria-selected=\"true\">Home</button>\n            <button type=\"button\"  class=\"list-group-item list-group-item-action\" id=\"list-profile-list\" data-bs-toggle=\"tab\" data-bs-target=\"#list-profile\" role=\"tab\" aria-controls=\"list-profile\">Profile</button>\n            <button type=\"button\"  class=\"list-group-item list-group-item-action\" id=\"list-messages-list\" data-bs-toggle=\"tab\" data-bs-target=\"#list-messages\" role=\"tab\" aria-controls=\"list-messages\">Messages</button>\n            <button type=\"button\"  class=\"list-group-item list-group-item-action\" id=\"list-settings-list\" data-bs-toggle=\"tab\" data-bs-target=\"#list-settings\" role=\"tab\" aria-controls=\"list-settings\">Settings</button>\n          </div>\n        </div>\n        <div class=\"col-8\">\n          <div class=\"tab-content\" id=\"nav-tabContent\">\n            <div class=\"tab-pane fade show active\" id=\"list-home\" role=\"tabpanel\" aria-labelledby=\"list-home-list\">\n              <p>Velit aute mollit ipsum ad dolor consectetur nulla officia culpa adipisicing exercitation fugiat tempor. Voluptate deserunt sit sunt nisi aliqua fugiat proident ea ut. Mollit voluptate reprehenderit occaecat nisi ad non minim tempor sunt voluptate consectetur exercitation id ut nulla. Ea et fugiat aliquip nostrud sunt incididunt consectetur culpa aliquip eiusmod dolor. Anim ad Lorem aliqua in cupidatat nisi enim eu nostrud do aliquip veniam minim.</p>\n            </div>\n            <div class=\"tab-pane fade\" id=\"list-profile\" role=\"tabpanel\" aria-labelledby=\"list-profile-list\">\n              <p>Cupidatat quis ad sint excepteur laborum in esse qui. Et excepteur consectetur ex nisi eu do cillum ad laborum. Mollit et eu officia dolore sunt Lorem culpa qui commodo velit ex amet id ex. Officia anim incididunt laboris deserunt anim aute dolor incididunt veniam aute dolore do exercitation. Dolor nisi culpa ex ad irure in elit eu dolore. Ad laboris ipsum reprehenderit irure non commodo enim culpa commodo veniam incididunt veniam ad.</p>\n            </div>\n            <div class=\"tab-pane fade\" id=\"list-messages\" role=\"tabpanel\" aria-labelledby=\"list-messages-list\">\n              <p>Ut ut do pariatur aliquip aliqua aliquip exercitation do nostrud commodo reprehenderit aute ipsum voluptate. Irure Lorem et laboris nostrud amet cupidatat cupidatat anim do ut velit mollit consequat enim tempor. Consectetur est minim nostrud nostrud consectetur irure labore voluptate irure. Ipsum id Lorem sit sint voluptate est pariatur eu ad cupidatat et deserunt culpa sit eiusmod deserunt. Consectetur et fugiat anim do eiusmod aliquip nulla laborum elit adipisicing pariatur cillum.</p>\n            </div>\n            <div class=\"tab-pane fade\" id=\"list-settings\" role=\"tabpanel\" aria-labelledby=\"list-settings-list\">\n              <p>Irure enim occaecat labore sit qui aliquip reprehenderit amet velit. Deserunt ullamco ex elit nostrud ut dolore nisi officia magna sit occaecat laboris sunt dolor. Nisi eu minim cillum occaecat aute est cupidatat aliqua labore aute occaecat ea aliquip sunt amet. Aute mollit dolor ut exercitation irure commodo non amet consectetur quis amet culpa. Quis ullamco nisi amet qui aute irure eu. Magna labore dolor quis ex labore id nostrud deserunt dolor eiusmod eu pariatur culpa mollit in irure.</p>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n\n    <script src=\"../../../dist/js/bootstrap.bundle.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "js/tests/visual/toast.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <link href=\"../../../dist/css/bootstrap.min.css\" rel=\"stylesheet\">\n    <title>Toast</title>\n    <style>\n      .notifications {\n        position: absolute;\n        top: 10px;\n        right: 10px;\n      }\n    </style>\n  </head>\n  <body>\n    <div class=\"container\">\n      <h1>Toast <small>Bootstrap Visual Test</small></h1>\n\n      <div class=\"row mt-3\">\n        <div class=\"col-md-12\">\n          <button id=\"btnShowToast\" class=\"btn btn-primary\">Show toast</button>\n          <button id=\"btnHideToast\" class=\"btn btn-primary\">Hide toast</button>\n        </div>\n      </div>\n    </div>\n\n    <div class=\"notifications\">\n      <div id=\"toastAutoHide\" class=\"toast\" role=\"alert\" aria-live=\"assertive\" aria-atomic=\"true\" data-bs-delay=\"2000\">\n        <div class=\"toast-header\">\n          <span class=\"d-block bg-primary rounded me-2\" style=\"width: 20px; height: 20px;\"></span>\n          <strong class=\"me-auto\">Bootstrap</strong>\n          <small>11 mins ago</small>\n        </div>\n        <div class=\"toast-body\">\n          Hello, world! This is a toast message with <strong>autohide</strong> in 2 seconds\n        </div>\n      </div>\n\n      <div class=\"toast\" data-bs-autohide=\"false\" role=\"alert\" aria-live=\"assertive\" aria-atomic=\"true\">\n        <div class=\"toast-header\">\n          <span class=\"d-block bg-primary rounded me-2\" style=\"width: 20px; height: 20px;\"></span>\n          <strong class=\"me-auto\">Bootstrap</strong>\n          <small class=\"text-body-secondary\">2 seconds ago</small>\n          <button type=\"button\" class=\"ms-2 mb-1 btn-close\" data-bs-dismiss=\"toast\" aria-label=\"Close\"></button>\n        </div>\n        <div class=\"toast-body\">\n          Heads up, toasts will stack automatically\n        </div>\n      </div>\n    </div>\n\n    <script src=\"../../../dist/js/bootstrap.bundle.js\"></script>\n    <script>\n      /* global bootstrap: false */\n\n      window.addEventListener('load', () => {\n        document.querySelectorAll('.toast').forEach(toastEl => new bootstrap.Toast(toastEl))\n\n        document.getElementById('btnShowToast').addEventListener('click', () => {\n          document.querySelectorAll('.toast').forEach(toastEl => bootstrap.Toast.getInstance(toastEl).show())\n        })\n\n        document.getElementById('btnHideToast').addEventListener('click', () => {\n          document.querySelectorAll('.toast').forEach(toastEl => bootstrap.Toast.getInstance(toastEl).hide())\n        })\n      })\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "js/tests/visual/tooltip.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <link href=\"../../../dist/css/bootstrap.min.css\" rel=\"stylesheet\">\n    <title>Tooltip</title>\n    <style>\n      #target {\n        border: 1px solid;\n        width: 100px;\n        height: 50px;\n        margin-left: 50px;\n        transform: rotate(270deg);\n        margin-top: 100px;\n      }\n    </style>\n  </head>\n  <body>\n    <div class=\"container\">\n      <h1>Tooltip <small>Bootstrap Visual Test</small></h1>\n\n      <p class=\"text-body-secondary\">Tight pants next level keffiyeh <a href=\"#\" data-bs-toggle=\"tooltip\" title=\"Default tooltip\">you probably</a> haven't heard of them. Photo booth beard raw denim letterpress vegan messenger bag stumptown. Farm-to-table seitan, mcsweeney's fixie sustainable quinoa 8-bit american apparel <a href=\"#\" data-bs-toggle=\"tooltip\" title=\"Another tooltip\">have a</a> terry richardson vinyl chambray. Beard stumptown, cardigans banh mi lomo thundercats. Tofu biodiesel williamsburg marfa, four loko mcsweeney's cleanse vegan chambray. A really ironic artisan <a href=\"#\" data-bs-toggle=\"tooltip\" title=\"Another one here too\">whatever keytar</a>, scenester farm-to-table banksy Austin <a href=\"#\" data-bs-toggle=\"tooltip\" title=\"The last tip!\">freegan cred</a> raw denim single-origin coffee viral.</p>\n\n      <hr>\n\n      <div class=\"row\">\n        <p>\n          <button type=\"button\" class=\"btn btn-secondary\" data-bs-toggle=\"tooltip\" data-bs-placement=\"auto\" title=\"Tooltip on auto\">\n            Tooltip on auto\n          </button>\n          <button type=\"button\" class=\"btn btn-secondary\" data-bs-toggle=\"tooltip\" data-bs-placement=\"top\" title=\"Tooltip on top\">\n            Tooltip on top\n          </button>\n          <button type=\"button\" class=\"btn btn-secondary\" data-bs-toggle=\"tooltip\" data-bs-placement=\"right\" title=\"Tooltip on right\">\n            Tooltip on end\n          </button>\n          <button type=\"button\" class=\"btn btn-secondary\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"Tooltip on bottom\">\n            Tooltip on bottom\n          </button>\n          <button type=\"button\" class=\"btn btn-secondary\" data-bs-toggle=\"tooltip\" data-bs-placement=\"left\" title=\"Tooltip on left\">\n            Tooltip on start\n          </button>\n        </p>\n      </div>\n      <div class=\"row\">\n        <p>\n          <button type=\"button\" class=\"btn btn-secondary\" data-bs-toggle=\"tooltip\" data-bs-placement=\"left\" title=\"Tooltip with container (selector)\" data-bs-container=\"#customContainer\">\n            Tooltip with container (selector)\n          </button>\n          <button id=\"tooltipElement\" type=\"button\" class=\"btn btn-secondary\" data-bs-placement=\"left\" title=\"Tooltip with container (element)\">\n            Tooltip with container (element)\n          </button>\n          <button type=\"button\" class=\"btn btn-secondary\" data-bs-toggle=\"tooltip\" data-bs-html=\"true\" title=\"<em>Tooltip</em> <u>with</u> <b>HTML</b>\">\n            Tooltip with HTML\n          </button>\n          <button type=\"button\" class=\"btn btn-secondary\" data-bs-toggle=\"tooltip\" data-bs-placement=\"left\" title=\"Tooltip with XSS\" data-bs-container=\"<img src=1 onerror=alert(123)>\">\n            Tooltip with XSS\n          </button>\n        </p>\n      </div>\n      <div class=\"row\">\n        <div class=\"col-sm-3\">\n          <div id=\"target\" title=\"Test tooltip on transformed element\"></div>\n        </div>\n        <div id=\"shadow\" class=\"pt-5\"></div>\n      </div>\n      <div id=\"customContainer\"></div>\n\n      <div class=\"row mt-4 border-top\">\n        <hr>\n        <div class=\"h4\">Test Selector triggered tooltips</div>\n        <div id=\"wrapperTriggeredBySelector\">\n          <div class=\"py-2 selectorButtonsBlock\">\n            <button type=\"button\" class=\"btn btn-secondary bs-dynamic-tooltip\" title=\"random title\">Using title</button>\n            <button type=\"button\" class=\"btn btn-secondary bs-dynamic-tooltip\" data-bs-title=\"random title\">Using bs-title</button>\n          </div>\n\n        </div>\n        <div class=\"mt-3\">\n          <button type=\"button\" class=\"btn btn-primary\" onclick=\"duplicateButtons()\">Duplicate above two buttons</button>\n        </div>\n      </div>\n    </div>\n\n    <script src=\"../../../dist/js/bootstrap.bundle.js\"></script>\n    <script>\n      /* global bootstrap: false */\n\n      if (typeof document.body.attachShadow === 'function') {\n        const shadowRoot = document.getElementById('shadow').attachShadow({ mode: 'open' })\n        shadowRoot.innerHTML =\n          '<button id=\"firstShadowTooltip\" type=\"button\" class=\"btn btn-secondary\" data-bs-toggle=\"tooltip\" data-bs-placement=\"top\" title=\"Tooltip on top in a shadow dom\">' +\n          '  Tooltip on top in a shadow dom' +\n          '</button>' +\n          '<button id=\"secondShadowTooltip\" type=\"button\" class=\"btn btn-secondary\" data-bs-toggle=\"tooltip\" data-bs-placement=\"top\" title=\"Tooltip on top in a shadow dom with container option\">' +\n          '  Tooltip on top in a shadow dom' +\n          '</button>'\n\n        new bootstrap.Tooltip(shadowRoot.firstChild)\n        new bootstrap.Tooltip(shadowRoot.getElementById('secondShadowTooltip'), {\n          container: shadowRoot\n        })\n      }\n\n      new bootstrap.Tooltip('#tooltipElement', {\n        container: '#customContainer'\n      })\n\n      const targetTooltip = new bootstrap.Tooltip('#target', {\n        placement: 'top',\n        trigger: 'manual'\n      })\n      targetTooltip.show()\n\n      document.querySelectorAll('[data-bs-toggle=\"tooltip\"]').forEach(tooltipEl => new bootstrap.Tooltip(tooltipEl))\n    </script>\n\n    <script>\n      /* global bootstrap: false */\n\n      new bootstrap.Tooltip('#wrapperTriggeredBySelector', {\n        animation: false,\n        selector: '.bs-dynamic-tooltip'\n      })\n\n      /* eslint-disable no-unused-vars */\n      function duplicateButtons() {\n        const buttonsBlock = document.querySelector('.selectorButtonsBlock')// get first\n        const buttonsBlockClone = buttonsBlock.cloneNode(true)\n        buttonsBlockClone.innerHTML += new Date().toLocaleString()\n        document.querySelector('#wrapperTriggeredBySelector').append(buttonsBlockClone)\n      }\n      /* eslint-enable no-unused-vars */\n    </script>\n\n  </body>\n</html>\n"
  },
  {
    "path": "nuget/bootstrap.nuspec",
    "content": "<?xml version=\"1.0\"?>\n<package xmlns=\"http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd\">\n  <metadata>\n    <id>bootstrap</id>\n    <!-- pulled from release tag -->\n    <version>5</version>\n    <title>Bootstrap CSS</title>\n    <authors>The Bootstrap Authors</authors>\n    <owners>bootstrap</owners>\n    <description>The most popular front-end framework for developing responsive, mobile first projects on the web.</description>\n    <releaseNotes>https://blog.getbootstrap.com/</releaseNotes>\n    <summary>Bootstrap framework in CSS. Includes JavaScript.</summary>\n    <language>en-us</language>\n    <projectUrl>https://getbootstrap.com/</projectUrl>\n    <repository type=\"git\" url=\"https://github.com/twbs/bootstrap.git\" branch=\"main\" />\n    <icon>bootstrap.png</icon>\n    <license type=\"expression\">MIT</license>\n    <copyright>Copyright 2011-2026</copyright>\n    <requireLicenseAcceptance>false</requireLicenseAcceptance>\n    <tags>css mobile-first responsive front-end framework web</tags>\n    <contentFiles>\n      <files include=\"**/*\" buildAction=\"Content\" />\n    </contentFiles>\n  </metadata>\n  <files>\n    <file src=\"nuget\\bootstrap.png\" target=\"\" />\n\n    <file src=\"dist\\css\\*.*\" target=\"content\\Content\" />\n    <file src=\"dist\\js\\bootstrap*.js\" target=\"content\\Scripts\" />\n    <file src=\"dist\\js\\bootstrap*.js.map\" target=\"content\\Scripts\" />\n\n    <file src=\"dist\\css\\*.*\" target=\"contentFiles\\any\\any\\wwwroot\\css\" />\n    <file src=\"dist\\js\\bootstrap*.js\" target=\"contentFiles\\any\\any\\wwwroot\\js\" />\n    <file src=\"dist\\js\\bootstrap*.js.map\" target=\"contentFiles\\any\\any\\wwwroot\\js\" />\n  </files>\n</package>\n"
  },
  {
    "path": "nuget/bootstrap.sass.nuspec",
    "content": "<?xml version=\"1.0\"?>\n<package xmlns=\"http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd\">\n  <metadata>\n    <id>bootstrap.sass</id>\n    <!-- pulled from release tag -->\n    <version>5</version>\n    <title>Bootstrap Sass</title>\n    <authors>The Bootstrap Authors</authors>\n    <owners>bootstrap</owners>\n    <description>The most popular front-end framework for developing responsive, mobile first projects on the web.</description>\n    <releaseNotes>https://blog.getbootstrap.com/</releaseNotes>\n    <summary>Bootstrap framework in Sass. Includes JavaScript</summary>\n    <language>en-us</language>\n    <projectUrl>https://getbootstrap.com/</projectUrl>\n    <repository type=\"git\" url=\"https://github.com/twbs/bootstrap.git\" branch=\"main\" />\n    <icon>bootstrap.png</icon>\n    <license type=\"expression\">MIT</license>\n    <copyright>Copyright 2011-2026</copyright>\n    <requireLicenseAcceptance>false</requireLicenseAcceptance>\n    <tags>css sass mobile-first responsive front-end framework web</tags>\n    <contentFiles>\n      <files include=\"**/*\" buildAction=\"Content\" />\n    </contentFiles>\n  </metadata>\n  <files>\n    <file src=\"nuget\\bootstrap.png\" target=\"\" />\n\n    <file src=\"scss\\**\\*.scss\" target=\"content\\Content\\bootstrap\" />\n    <file src=\"dist\\js\\bootstrap*.js\" target=\"content\\Scripts\" />\n    <file src=\"dist\\js\\bootstrap*.js.map\" target=\"content\\Scripts\" />\n\n    <file src=\"scss\\**\\*.scss\" target=\"contentFiles\\any\\any\\wwwroot\\scss\" />\n    <file src=\"dist\\js\\bootstrap*.js\" target=\"contentFiles\\any\\any\\wwwroot\\js\" />\n    <file src=\"dist\\js\\bootstrap*.js.map\" target=\"contentFiles\\any\\any\\wwwroot\\js\" />\n  </files>\n</package>\n"
  },
  {
    "path": "package.js",
    "content": "// package metadata file for Meteor.js\n\n/* eslint-env meteor */\n\nPackage.describe({\n  name: 'twbs:bootstrap', // https://atmospherejs.com/twbs/bootstrap\n  summary: 'The most popular front-end framework for developing responsive, mobile first projects on the web.',\n  version: '5.3.8',\n  git: 'https://github.com/twbs/bootstrap.git'\n})\n\nPackage.onUse(api => {\n  api.versionsFrom('METEOR@1.0')\n  api.addFiles([\n    'dist/css/bootstrap.css',\n    'dist/js/bootstrap.js'\n  ], 'client')\n})\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"bootstrap\",\n  \"description\": \"The most popular front-end framework for developing responsive, mobile first projects on the web.\",\n  \"version\": \"5.3.8\",\n  \"config\": {\n    \"version_short\": \"5.3\"\n  },\n  \"keywords\": [\n    \"css\",\n    \"sass\",\n    \"mobile-first\",\n    \"responsive\",\n    \"front-end\",\n    \"framework\",\n    \"web\"\n  ],\n  \"homepage\": \"https://getbootstrap.com/\",\n  \"author\": \"The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/twbs/bootstrap.git\"\n  },\n  \"bugs\": {\n    \"url\": \"https://github.com/twbs/bootstrap/issues\"\n  },\n  \"funding\": [\n    {\n      \"type\": \"github\",\n      \"url\": \"https://github.com/sponsors/twbs\"\n    },\n    {\n      \"type\": \"opencollective\",\n      \"url\": \"https://opencollective.com/bootstrap\"\n    }\n  ],\n  \"main\": \"dist/js/bootstrap.js\",\n  \"module\": \"dist/js/bootstrap.esm.js\",\n  \"sass\": \"scss/bootstrap.scss\",\n  \"style\": \"dist/css/bootstrap.css\",\n  \"scripts\": {\n    \"start\": \"npm-run-all --parallel watch docs-serve\",\n    \"bundlewatch\": \"bundlewatch --config .bundlewatch.config.json\",\n    \"css\": \"npm-run-all css-compile css-prefix css-rtl css-minify\",\n    \"css-compile\": \"sass --style expanded --source-map --embed-sources --no-error-css scss/:dist/css/\",\n    \"css-rtl\": \"cross-env NODE_ENV=RTL postcss --config build/postcss.config.mjs --dir \\\"dist/css\\\" --ext \\\".rtl.css\\\" \\\"dist/css/*.css\\\" \\\"!dist/css/*.min.css\\\" \\\"!dist/css/*.rtl.css\\\"\",\n    \"css-lint\": \"npm-run-all --aggregate-output --continue-on-error --parallel css-lint-*\",\n    \"css-lint-stylelint\": \"stylelint \\\"**/*.{css,scss}\\\" --cache --cache-location .cache/.stylelintcache\",\n    \"css-lint-vars\": \"fusv scss/ site/src/scss/\",\n    \"css-minify\": \"npm-run-all --aggregate-output --parallel css-minify-*\",\n    \"css-minify-main\": \"cleancss -O1 --format breakWith=lf --with-rebase --source-map --source-map-inline-sources --output dist/css/ --batch --batch-suffix \\\".min\\\" \\\"dist/css/*.css\\\" \\\"!dist/css/*.min.css\\\" \\\"!dist/css/*rtl*.css\\\"\",\n    \"css-minify-rtl\": \"cleancss -O1 --format breakWith=lf --with-rebase --source-map --source-map-inline-sources --output dist/css/ --batch --batch-suffix \\\".min\\\" \\\"dist/css/*rtl.css\\\" \\\"!dist/css/*.min.css\\\"\",\n    \"css-prefix\": \"npm-run-all --aggregate-output --parallel css-prefix-*\",\n    \"css-prefix-main\": \"postcss --config build/postcss.config.mjs --replace \\\"dist/css/*.css\\\" \\\"!dist/css/*.rtl*.css\\\" \\\"!dist/css/*.min.css\\\"\",\n    \"css-prefix-examples\": \"postcss --config build/postcss.config.mjs --replace \\\"site/src/assets/examples/**/*.css\\\"\",\n    \"css-prefix-examples-rtl\": \"cross-env-shell NODE_ENV=RTL postcss --config build/postcss.config.mjs --dir \\\"site/src/assets/examples/\\\" --ext \\\".rtl.css\\\" --base \\\"site/src/assets/examples/\\\" \\\"site/src/assets/examples/{blog,carousel,dashboard,cheatsheet}/*.css\\\" \\\"!site/src/assets/examples/{blog,carousel,dashboard,cheatsheet}/*.rtl.css\\\"\",\n    \"css-test\": \"jasmine --config=scss/tests/jasmine.js\",\n    \"js\": \"npm-run-all js-compile js-minify\",\n    \"js-compile\": \"npm-run-all --aggregate-output --parallel js-compile-*\",\n    \"js-compile-standalone\": \"rollup --environment BUNDLE:false --config build/rollup.config.mjs --sourcemap\",\n    \"js-compile-standalone-esm\": \"rollup --environment ESM:true,BUNDLE:false --config build/rollup.config.mjs --sourcemap\",\n    \"js-compile-bundle\": \"rollup --environment BUNDLE:true --config build/rollup.config.mjs --sourcemap\",\n    \"js-compile-plugins\": \"node build/build-plugins.mjs\",\n    \"js-lint\": \"eslint --cache --cache-location .cache/.eslintcache --report-unused-disable-directives --ext .html,.js,.mjs,.md .\",\n    \"js-minify\": \"npm-run-all --aggregate-output --parallel js-minify-*\",\n    \"js-minify-standalone\": \"terser --compress passes=2 --mangle --comments \\\"/^!/\\\" --source-map \\\"content=dist/js/bootstrap.js.map,includeSources,url=bootstrap.min.js.map\\\" --output dist/js/bootstrap.min.js dist/js/bootstrap.js\",\n    \"js-minify-standalone-esm\": \"terser --compress passes=2 --mangle --comments \\\"/^!/\\\" --source-map \\\"content=dist/js/bootstrap.esm.js.map,includeSources,url=bootstrap.esm.min.js.map\\\" --output dist/js/bootstrap.esm.min.js dist/js/bootstrap.esm.js\",\n    \"js-minify-bundle\": \"terser --compress passes=2 --mangle --comments \\\"/^!/\\\" --source-map \\\"content=dist/js/bootstrap.bundle.js.map,includeSources,url=bootstrap.bundle.min.js.map\\\" --output dist/js/bootstrap.bundle.min.js dist/js/bootstrap.bundle.js\",\n    \"js-test\": \"npm-run-all --aggregate-output --parallel js-test-karma js-test-jquery js-test-integration-*\",\n    \"js-debug\": \"cross-env DEBUG=true npm run js-test-karma\",\n    \"js-test-karma\": \"karma start js/tests/karma.conf.js\",\n    \"js-test-integration-bundle\": \"rollup --config js/tests/integration/rollup.bundle.js\",\n    \"js-test-integration-modularity\": \"rollup --config js/tests/integration/rollup.bundle-modularity.js\",\n    \"js-test-cloud\": \"cross-env BROWSERSTACK=true npm run js-test-karma\",\n    \"js-test-jquery\": \"cross-env JQUERY=true npm run js-test-karma\",\n    \"lint\": \"npm-run-all --aggregate-output --continue-on-error --parallel js-lint css-lint lockfile-lint\",\n    \"docs\": \"npm-run-all docs-build docs-lint\",\n    \"docs-build\": \"npm run astro-build\",\n    \"docs-compile\": \"npm run docs-build\",\n    \"docs-vnu\": \"node build/vnu-jar.mjs\",\n    \"docs-lint\": \"npm-run-all docs-prettier-check docs-vnu\",\n    \"docs-prettier-check\": \"prettier --config site/.prettierrc.json -c --cache site\",\n    \"docs-prettier-format\": \"prettier --config site/.prettierrc.json --write --cache site\",\n    \"docs-serve\": \"npm run astro-dev\",\n    \"docs-serve-only\": \"npx sirv-cli _site --port 9001\",\n    \"lockfile-lint\": \"lockfile-lint --allowed-hosts npm --allowed-schemes https: --empty-hostname false --type npm --path package-lock.json\",\n    \"update-deps\": \"ncu -u -x @docsearch/js,eslint,eslint-config-xo,eslint-plugin-unicorn,karma-browserstack-launcher,karma-rollup-preprocessor,sass,vnu-jar\",\n    \"release\": \"npm-run-all dist release-sri docs-build release-zip*\",\n    \"release-sri\": \"node build/generate-sri.mjs\",\n    \"release-version\": \"node build/change-version.mjs\",\n    \"release-zip\": \"cross-env-shell \\\"rm -rf bootstrap-$npm_package_version-dist bootstrap-$npm_package_version-dist.zip && cp -r dist/ bootstrap-$npm_package_version-dist && zip -qr9 bootstrap-$npm_package_version-dist.zip bootstrap-$npm_package_version-dist && rm -rf bootstrap-$npm_package_version-dist\\\"\",\n    \"release-zip-examples\": \"node build/zip-examples.mjs\",\n    \"dist\": \"npm-run-all --aggregate-output --parallel css js\",\n    \"test\": \"npm-run-all lint dist js-test docs-build docs-lint\",\n    \"netlify\": \"npm-run-all dist release-sri astro-build\",\n    \"watch\": \"npm-run-all --parallel watch-*\",\n    \"watch-css-main\": \"nodemon --watch scss/ --ext scss --exec \\\"npm-run-all css-lint css-compile css-prefix\\\"\",\n    \"watch-css-dist\": \"nodemon --watch dist/css/ --ext css --ignore \\\"dist/css/*.rtl.*\\\" --exec \\\"npm run css-rtl\\\"\",\n    \"watch-css-docs\": \"nodemon --watch site/src/scss/ --ext scss --exec \\\"npm run css-lint\\\"\",\n    \"watch-css-test\": \"nodemon --watch scss/ --ext scss,js --exec \\\"npm run css-test\\\"\",\n    \"watch-js-main\": \"nodemon --watch js/src/ --ext js --exec \\\"npm-run-all js-lint js-compile\\\"\",\n    \"watch-js-docs\": \"nodemon --watch site/src/assets/ --ext js --exec \\\"npm run js-lint\\\"\",\n    \"astro-dev\": \"astro dev --root site --port 9001\",\n    \"astro-build\": \"astro build --root site && rm -rf _site && cp -r site/dist _site\",\n    \"astro-preview\": \"astro preview --root site --port 9001\"\n  },\n  \"peerDependencies\": {\n    \"@popperjs/core\": \"^2.11.8\"\n  },\n  \"devDependencies\": {\n    \"@astrojs/check\": \"^0.9.6\",\n    \"@astrojs/markdown-remark\": \"^6.3.10\",\n    \"@astrojs/mdx\": \"^4.3.13\",\n    \"@astrojs/prism\": \"^3.3.0\",\n    \"@astrojs/sitemap\": \"^3.6.0\",\n    \"@babel/cli\": \"^7.28.3\",\n    \"@babel/core\": \"^7.28.5\",\n    \"@babel/preset-env\": \"^7.28.5\",\n    \"@docsearch/js\": \"^3.9.0\",\n    \"@popperjs/core\": \"^2.11.8\",\n    \"@rollup/plugin-babel\": \"^6.1.0\",\n    \"@rollup/plugin-commonjs\": \"^29.0.0\",\n    \"@rollup/plugin-node-resolve\": \"^16.0.3\",\n    \"@rollup/plugin-replace\": \"^6.0.3\",\n    \"@stackblitz/sdk\": \"^1.11.0\",\n    \"@types/js-yaml\": \"^4.0.9\",\n    \"@types/mime\": \"^4.0.0\",\n    \"@types/prismjs\": \"^1.26.6\",\n    \"astro\": \"^5.16.6\",\n    \"astro-auto-import\": \"^0.4.5\",\n    \"astro-broken-links-checker\": \"^1.0.7\",\n    \"autoprefixer\": \"^10.4.27\",\n    \"bundlewatch\": \"^0.4.1\",\n    \"clean-css-cli\": \"^5.6.3\",\n    \"clipboard\": \"^2.0.11\",\n    \"cross-env\": \"^10.1.0\",\n    \"eslint\": \"8.57.1\",\n    \"eslint-config-xo\": \"0.45.0\",\n    \"eslint-plugin-html\": \"^8.1.3\",\n    \"eslint-plugin-import\": \"^2.32.0\",\n    \"eslint-plugin-markdown\": \"^5.1.0\",\n    \"eslint-plugin-unicorn\": \"56.0.1\",\n    \"find-unused-sass-variables\": \"^6.1.1\",\n    \"github-slugger\": \"^2.0.0\",\n    \"globby\": \"^16.0.0\",\n    \"hammer-simulator\": \"0.0.1\",\n    \"htmlparser2\": \"^12.0.0\",\n    \"image-size\": \"^2.0.2\",\n    \"ip\": \"^2.0.1\",\n    \"jasmine\": \"^6.1.0\",\n    \"jquery\": \"^3.7.1\",\n    \"js-yaml\": \"^4.1.1\",\n    \"karma\": \"^6.4.4\",\n    \"karma-browserstack-launcher\": \"1.4.0\",\n    \"karma-chrome-launcher\": \"^3.2.0\",\n    \"karma-coverage-istanbul-reporter\": \"^3.0.3\",\n    \"karma-detect-browsers\": \"^2.3.3\",\n    \"karma-firefox-launcher\": \"^2.1.3\",\n    \"karma-jasmine\": \"^5.1.0\",\n    \"karma-jasmine-html-reporter\": \"^2.2.0\",\n    \"karma-rollup-preprocessor\": \"7.0.7\",\n    \"lockfile-lint\": \"^5.0.0\",\n    \"mime\": \"^4.1.0\",\n    \"nodemon\": \"^3.1.14\",\n    \"npm-run-all2\": \"^8.0.4\",\n    \"postcss\": \"^8.5.8\",\n    \"postcss-cli\": \"^11.0.1\",\n    \"prettier\": \"^3.8.1\",\n    \"prettier-plugin-astro\": \"^0.14.1\",\n    \"rehype-autolink-headings\": \"^7.1.0\",\n    \"remark\": \"^15.0.1\",\n    \"remark-html\": \"^16.0.1\",\n    \"rollup\": \"^4.54.0\",\n    \"rollup-plugin-istanbul\": \"^5.0.0\",\n    \"rtlcss\": \"^4.3.0\",\n    \"sass\": \"1.78.0\",\n    \"sass-true\": \"^10.1.0\",\n    \"shelljs\": \"^0.10.0\",\n    \"stylelint\": \"^16.26.1\",\n    \"stylelint-config-twbs-bootstrap\": \"^16.1.0\",\n    \"terser\": \"^5.44.1\",\n    \"unist-util-visit\": \"^5.1.0\",\n    \"vnu-jar\": \"25.11.25\",\n    \"zod\": \"^4.3.6\"\n  },\n  \"files\": [\n    \"dist/{css,js}/*.{css,js,map}\",\n    \"js/{src,dist}/**/*.{js,map}\",\n    \"js/index.{esm,umd}.js\",\n    \"scss/**/*.scss\",\n    \"!scss/tests/**\"\n  ],\n  \"jspm\": {\n    \"registry\": \"npm\",\n    \"main\": \"js/bootstrap\",\n    \"directories\": {\n      \"lib\": \"dist\"\n    },\n    \"shim\": {\n      \"js/bootstrap\": {\n        \"deps\": [\n          \"@popperjs/core\"\n        ]\n      }\n    },\n    \"dependencies\": {},\n    \"peerDependencies\": {\n      \"@popperjs/core\": \"^2.11.8\"\n    }\n  }\n}\n"
  },
  {
    "path": "scss/_accordion.scss",
    "content": "//\n// Base styles\n//\n\n.accordion {\n  // scss-docs-start accordion-css-vars\n  --#{$prefix}accordion-color: #{$accordion-color};\n  --#{$prefix}accordion-bg: #{$accordion-bg};\n  --#{$prefix}accordion-transition: #{$accordion-transition};\n  --#{$prefix}accordion-border-color: #{$accordion-border-color};\n  --#{$prefix}accordion-border-width: #{$accordion-border-width};\n  --#{$prefix}accordion-border-radius: #{$accordion-border-radius};\n  --#{$prefix}accordion-inner-border-radius: #{$accordion-inner-border-radius};\n  --#{$prefix}accordion-btn-padding-x: #{$accordion-button-padding-x};\n  --#{$prefix}accordion-btn-padding-y: #{$accordion-button-padding-y};\n  --#{$prefix}accordion-btn-color: #{$accordion-button-color};\n  --#{$prefix}accordion-btn-bg: #{$accordion-button-bg};\n  --#{$prefix}accordion-btn-icon: #{escape-svg($accordion-button-icon)};\n  --#{$prefix}accordion-btn-icon-width: #{$accordion-icon-width};\n  --#{$prefix}accordion-btn-icon-transform: #{$accordion-icon-transform};\n  --#{$prefix}accordion-btn-icon-transition: #{$accordion-icon-transition};\n  --#{$prefix}accordion-btn-active-icon: #{escape-svg($accordion-button-active-icon)};\n  --#{$prefix}accordion-btn-focus-box-shadow: #{$accordion-button-focus-box-shadow};\n  --#{$prefix}accordion-body-padding-x: #{$accordion-body-padding-x};\n  --#{$prefix}accordion-body-padding-y: #{$accordion-body-padding-y};\n  --#{$prefix}accordion-active-color: #{$accordion-button-active-color};\n  --#{$prefix}accordion-active-bg: #{$accordion-button-active-bg};\n  // scss-docs-end accordion-css-vars\n}\n\n.accordion-button {\n  position: relative;\n  display: flex;\n  align-items: center;\n  width: 100%;\n  padding: var(--#{$prefix}accordion-btn-padding-y) var(--#{$prefix}accordion-btn-padding-x);\n  @include font-size($font-size-base);\n  color: var(--#{$prefix}accordion-btn-color);\n  text-align: left; // Reset button style\n  background-color: var(--#{$prefix}accordion-btn-bg);\n  border: 0;\n  @include border-radius(0);\n  overflow-anchor: none;\n  @include transition(var(--#{$prefix}accordion-transition));\n\n  &:not(.collapsed) {\n    color: var(--#{$prefix}accordion-active-color);\n    background-color: var(--#{$prefix}accordion-active-bg);\n    box-shadow: inset 0 calc(-1 * var(--#{$prefix}accordion-border-width)) 0 var(--#{$prefix}accordion-border-color); // stylelint-disable-line function-disallowed-list\n\n    &::after {\n      background-image: var(--#{$prefix}accordion-btn-active-icon);\n      transform: var(--#{$prefix}accordion-btn-icon-transform);\n    }\n  }\n\n  // Accordion icon\n  &::after {\n    flex-shrink: 0;\n    width: var(--#{$prefix}accordion-btn-icon-width);\n    height: var(--#{$prefix}accordion-btn-icon-width);\n    margin-left: auto;\n    content: \"\";\n    background-image: var(--#{$prefix}accordion-btn-icon);\n    background-repeat: no-repeat;\n    background-size: var(--#{$prefix}accordion-btn-icon-width);\n    @include transition(var(--#{$prefix}accordion-btn-icon-transition));\n  }\n\n  &:hover {\n    z-index: 2;\n  }\n\n  &:focus {\n    z-index: 3;\n    outline: 0;\n    box-shadow: var(--#{$prefix}accordion-btn-focus-box-shadow);\n  }\n}\n\n.accordion-header {\n  margin-bottom: 0;\n}\n\n.accordion-item {\n  color: var(--#{$prefix}accordion-color);\n  background-color: var(--#{$prefix}accordion-bg);\n  border: var(--#{$prefix}accordion-border-width) solid var(--#{$prefix}accordion-border-color);\n\n  &:first-of-type {\n    @include border-top-radius(var(--#{$prefix}accordion-border-radius));\n\n    > .accordion-header .accordion-button {\n      @include border-top-radius(var(--#{$prefix}accordion-inner-border-radius));\n    }\n  }\n\n  &:not(:first-of-type) {\n    border-top: 0;\n  }\n\n  // Only set a border-radius on the last item if the accordion is collapsed\n  &:last-of-type {\n    @include border-bottom-radius(var(--#{$prefix}accordion-border-radius));\n\n    > .accordion-header .accordion-button {\n      &.collapsed {\n        @include border-bottom-radius(var(--#{$prefix}accordion-inner-border-radius));\n      }\n    }\n\n    > .accordion-collapse {\n      @include border-bottom-radius(var(--#{$prefix}accordion-border-radius));\n    }\n  }\n}\n\n.accordion-body {\n  padding: var(--#{$prefix}accordion-body-padding-y) var(--#{$prefix}accordion-body-padding-x);\n}\n\n\n// Flush accordion items\n//\n// Remove borders and border-radius to keep accordion items edge-to-edge.\n\n.accordion-flush {\n  > .accordion-item {\n    border-right: 0;\n    border-left: 0;\n    @include border-radius(0);\n\n    &:first-child { border-top: 0; }\n    &:last-child { border-bottom: 0; }\n\n    // stylelint-disable selector-max-class\n    > .accordion-collapse,\n    > .accordion-header .accordion-button,\n    > .accordion-header .accordion-button.collapsed {\n      @include border-radius(0);\n    }\n    // stylelint-enable selector-max-class\n  }\n}\n\n@if $enable-dark-mode {\n  @include color-mode(dark) {\n    .accordion-button::after {\n      --#{$prefix}accordion-btn-icon: #{escape-svg($accordion-button-icon-dark)};\n      --#{$prefix}accordion-btn-active-icon: #{escape-svg($accordion-button-active-icon-dark)};\n    }\n  }\n}\n"
  },
  {
    "path": "scss/_alert.scss",
    "content": "//\n// Base styles\n//\n\n.alert {\n  // scss-docs-start alert-css-vars\n  --#{$prefix}alert-bg: transparent;\n  --#{$prefix}alert-padding-x: #{$alert-padding-x};\n  --#{$prefix}alert-padding-y: #{$alert-padding-y};\n  --#{$prefix}alert-margin-bottom: #{$alert-margin-bottom};\n  --#{$prefix}alert-color: inherit;\n  --#{$prefix}alert-border-color: transparent;\n  --#{$prefix}alert-border: #{$alert-border-width} solid var(--#{$prefix}alert-border-color);\n  --#{$prefix}alert-border-radius: #{$alert-border-radius};\n  --#{$prefix}alert-link-color: inherit;\n  // scss-docs-end alert-css-vars\n\n  position: relative;\n  padding: var(--#{$prefix}alert-padding-y) var(--#{$prefix}alert-padding-x);\n  margin-bottom: var(--#{$prefix}alert-margin-bottom);\n  color: var(--#{$prefix}alert-color);\n  background-color: var(--#{$prefix}alert-bg);\n  border: var(--#{$prefix}alert-border);\n  @include border-radius(var(--#{$prefix}alert-border-radius));\n}\n\n// Headings for larger alerts\n.alert-heading {\n  // Specified to prevent conflicts of changing $headings-color\n  color: inherit;\n}\n\n// Provide class for links that match alerts\n.alert-link {\n  font-weight: $alert-link-font-weight;\n  color: var(--#{$prefix}alert-link-color);\n}\n\n\n// Dismissible alerts\n//\n// Expand the right padding and account for the close button's positioning.\n\n.alert-dismissible {\n  padding-right: $alert-dismissible-padding-r;\n\n  // Adjust close link position\n  .btn-close {\n    position: absolute;\n    top: 0;\n    right: 0;\n    z-index: $stretched-link-z-index + 1;\n    padding: $alert-padding-y * 1.25 $alert-padding-x;\n  }\n}\n\n\n// scss-docs-start alert-modifiers\n// Generate contextual modifier classes for colorizing the alert\n@each $state in map-keys($theme-colors) {\n  .alert-#{$state} {\n    --#{$prefix}alert-color: var(--#{$prefix}#{$state}-text-emphasis);\n    --#{$prefix}alert-bg: var(--#{$prefix}#{$state}-bg-subtle);\n    --#{$prefix}alert-border-color: var(--#{$prefix}#{$state}-border-subtle);\n    --#{$prefix}alert-link-color: var(--#{$prefix}#{$state}-text-emphasis);\n  }\n}\n// scss-docs-end alert-modifiers\n"
  },
  {
    "path": "scss/_badge.scss",
    "content": "// Base class\n//\n// Requires one of the contextual, color modifier classes for `color` and\n// `background-color`.\n\n.badge {\n  // scss-docs-start badge-css-vars\n  --#{$prefix}badge-padding-x: #{$badge-padding-x};\n  --#{$prefix}badge-padding-y: #{$badge-padding-y};\n  @include rfs($badge-font-size, --#{$prefix}badge-font-size);\n  --#{$prefix}badge-font-weight: #{$badge-font-weight};\n  --#{$prefix}badge-color: #{$badge-color};\n  --#{$prefix}badge-border-radius: #{$badge-border-radius};\n  // scss-docs-end badge-css-vars\n\n  display: inline-block;\n  padding: var(--#{$prefix}badge-padding-y) var(--#{$prefix}badge-padding-x);\n  @include font-size(var(--#{$prefix}badge-font-size));\n  font-weight: var(--#{$prefix}badge-font-weight);\n  line-height: 1;\n  color: var(--#{$prefix}badge-color);\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  @include border-radius(var(--#{$prefix}badge-border-radius));\n  @include gradient-bg();\n\n  // Empty badges collapse automatically\n  &:empty {\n    display: none;\n  }\n}\n\n// Quick fix for badges in buttons\n.btn .badge {\n  position: relative;\n  top: -1px;\n}\n"
  },
  {
    "path": "scss/_breadcrumb.scss",
    "content": ".breadcrumb {\n  // scss-docs-start breadcrumb-css-vars\n  --#{$prefix}breadcrumb-padding-x: #{$breadcrumb-padding-x};\n  --#{$prefix}breadcrumb-padding-y: #{$breadcrumb-padding-y};\n  --#{$prefix}breadcrumb-margin-bottom: #{$breadcrumb-margin-bottom};\n  @include rfs($breadcrumb-font-size, --#{$prefix}breadcrumb-font-size);\n  --#{$prefix}breadcrumb-bg: #{$breadcrumb-bg};\n  --#{$prefix}breadcrumb-border-radius: #{$breadcrumb-border-radius};\n  --#{$prefix}breadcrumb-divider-color: #{$breadcrumb-divider-color};\n  --#{$prefix}breadcrumb-item-padding-x: #{$breadcrumb-item-padding-x};\n  --#{$prefix}breadcrumb-item-active-color: #{$breadcrumb-active-color};\n  // scss-docs-end breadcrumb-css-vars\n\n  display: flex;\n  flex-wrap: wrap;\n  padding: var(--#{$prefix}breadcrumb-padding-y) var(--#{$prefix}breadcrumb-padding-x);\n  margin-bottom: var(--#{$prefix}breadcrumb-margin-bottom);\n  @include font-size(var(--#{$prefix}breadcrumb-font-size));\n  list-style: none;\n  background-color: var(--#{$prefix}breadcrumb-bg);\n  @include border-radius(var(--#{$prefix}breadcrumb-border-radius));\n}\n\n.breadcrumb-item {\n  // The separator between breadcrumbs (by default, a forward-slash: \"/\")\n  + .breadcrumb-item {\n    padding-left: var(--#{$prefix}breadcrumb-item-padding-x);\n\n    &::before {\n      float: left; // Suppress inline spacings and underlining of the separator\n      padding-right: var(--#{$prefix}breadcrumb-item-padding-x);\n      color: var(--#{$prefix}breadcrumb-divider-color);\n      content: var(--#{$prefix}breadcrumb-divider, escape-svg($breadcrumb-divider)) #{\"/* rtl:\"} var(--#{$prefix}breadcrumb-divider, escape-svg($breadcrumb-divider-flipped)) #{\"*/\"};\n    }\n  }\n\n  &.active {\n    color: var(--#{$prefix}breadcrumb-item-active-color);\n  }\n}\n"
  },
  {
    "path": "scss/_button-group.scss",
    "content": "// Make the div behave like a button\n.btn-group,\n.btn-group-vertical {\n  position: relative;\n  display: inline-flex;\n  vertical-align: middle; // match .btn alignment given font-size hack above\n\n  > .btn {\n    position: relative;\n    flex: 1 1 auto;\n  }\n\n  // Bring the hover, focused, and \"active\" buttons to the front to overlay\n  // the borders properly\n  > .btn-check:checked + .btn,\n  > .btn-check:focus + .btn,\n  > .btn:hover,\n  > .btn:focus,\n  > .btn:active,\n  > .btn.active {\n    z-index: 1;\n  }\n}\n\n// Optional: Group multiple button groups together for a toolbar\n.btn-toolbar {\n  display: flex;\n  flex-wrap: wrap;\n  justify-content: flex-start;\n\n  .input-group {\n    width: auto;\n  }\n}\n\n.btn-group {\n  @include border-radius($btn-border-radius);\n\n  // Prevent double borders when buttons are next to each other\n  > :not(.btn-check:first-child) + .btn,\n  > .btn-group:not(:first-child) {\n    margin-left: calc(-1 * #{$btn-border-width}); // stylelint-disable-line function-disallowed-list\n  }\n\n  // Reset rounded corners\n  > .btn:not(:last-child):not(.dropdown-toggle),\n  > .btn.dropdown-toggle-split:first-child,\n  > .btn-group:not(:last-child) > .btn {\n    @include border-end-radius(0);\n  }\n\n  // The left radius should be 0 if the button is:\n  // - the \"third or more\" child\n  // - the second child and the previous element isn't `.btn-check` (making it the first child visually)\n  // - part of a btn-group which isn't the first child\n  > .btn:nth-child(n + 3),\n  > :not(.btn-check) + .btn,\n  > .btn-group:not(:first-child) > .btn {\n    @include border-start-radius(0);\n  }\n}\n\n// Sizing\n//\n// Remix the default button sizing classes into new ones for easier manipulation.\n\n.btn-group-sm > .btn { @extend .btn-sm; }\n.btn-group-lg > .btn { @extend .btn-lg; }\n\n\n//\n// Split button dropdowns\n//\n\n.dropdown-toggle-split {\n  padding-right: $btn-padding-x * .75;\n  padding-left: $btn-padding-x * .75;\n\n  &::after,\n  .dropup &::after,\n  .dropend &::after {\n    margin-left: 0;\n  }\n\n  .dropstart &::before {\n    margin-right: 0;\n  }\n}\n\n.btn-sm + .dropdown-toggle-split {\n  padding-right: $btn-padding-x-sm * .75;\n  padding-left: $btn-padding-x-sm * .75;\n}\n\n.btn-lg + .dropdown-toggle-split {\n  padding-right: $btn-padding-x-lg * .75;\n  padding-left: $btn-padding-x-lg * .75;\n}\n\n\n// The clickable button for toggling the menu\n// Set the same inset shadow as the :active state\n.btn-group.show .dropdown-toggle {\n  @include box-shadow($btn-active-box-shadow);\n\n  // Show no shadow for `.btn-link` since it has no other button styles.\n  &.btn-link {\n    @include box-shadow(none);\n  }\n}\n\n\n//\n// Vertical button groups\n//\n\n.btn-group-vertical {\n  flex-direction: column;\n  align-items: flex-start;\n  justify-content: center;\n\n  > .btn,\n  > .btn-group {\n    width: 100%;\n  }\n\n  > .btn:not(:first-child),\n  > .btn-group:not(:first-child) {\n    margin-top: calc(-1 * #{$btn-border-width}); // stylelint-disable-line function-disallowed-list\n  }\n\n  // Reset rounded corners\n  > .btn:not(:last-child):not(.dropdown-toggle),\n  > .btn-group:not(:last-child) > .btn {\n    @include border-bottom-radius(0);\n  }\n\n  // The top radius should be 0 if the button is:\n  // - the \"third or more\" child\n  // - the second child and the previous element isn't `.btn-check` (making it the first child visually)\n  // - part of a btn-group which isn't the first child\n  > .btn:nth-child(n + 3),\n  > :not(.btn-check) + .btn,\n  > .btn-group:not(:first-child) > .btn {\n    @include border-top-radius(0);\n  }\n}\n"
  },
  {
    "path": "scss/_buttons.scss",
    "content": "//\n// Base styles\n//\n\n.btn {\n  // scss-docs-start btn-css-vars\n  --#{$prefix}btn-padding-x: #{$btn-padding-x};\n  --#{$prefix}btn-padding-y: #{$btn-padding-y};\n  --#{$prefix}btn-font-family: #{$btn-font-family};\n  @include rfs($btn-font-size, --#{$prefix}btn-font-size);\n  --#{$prefix}btn-font-weight: #{$btn-font-weight};\n  --#{$prefix}btn-line-height: #{$btn-line-height};\n  --#{$prefix}btn-color: #{$btn-color};\n  --#{$prefix}btn-bg: transparent;\n  --#{$prefix}btn-border-width: #{$btn-border-width};\n  --#{$prefix}btn-border-color: transparent;\n  --#{$prefix}btn-border-radius: #{$btn-border-radius};\n  --#{$prefix}btn-hover-border-color: transparent;\n  --#{$prefix}btn-box-shadow: #{$btn-box-shadow};\n  --#{$prefix}btn-disabled-opacity: #{$btn-disabled-opacity};\n  --#{$prefix}btn-focus-box-shadow: 0 0 0 #{$btn-focus-width} rgba(var(--#{$prefix}btn-focus-shadow-rgb), .5);\n  // scss-docs-end btn-css-vars\n\n  display: inline-block;\n  padding: var(--#{$prefix}btn-padding-y) var(--#{$prefix}btn-padding-x);\n  font-family: var(--#{$prefix}btn-font-family);\n  @include font-size(var(--#{$prefix}btn-font-size));\n  font-weight: var(--#{$prefix}btn-font-weight);\n  line-height: var(--#{$prefix}btn-line-height);\n  color: var(--#{$prefix}btn-color);\n  text-align: center;\n  text-decoration: if($link-decoration == none, null, none);\n  white-space: $btn-white-space;\n  vertical-align: middle;\n  cursor: if($enable-button-pointers, pointer, null);\n  user-select: none;\n  border: var(--#{$prefix}btn-border-width) solid var(--#{$prefix}btn-border-color);\n  @include border-radius(var(--#{$prefix}btn-border-radius));\n  @include gradient-bg(var(--#{$prefix}btn-bg));\n  @include box-shadow(var(--#{$prefix}btn-box-shadow));\n  @include transition($btn-transition);\n\n  &:hover {\n    color: var(--#{$prefix}btn-hover-color);\n    text-decoration: if($link-hover-decoration == underline, none, null);\n    background-color: var(--#{$prefix}btn-hover-bg);\n    border-color: var(--#{$prefix}btn-hover-border-color);\n  }\n\n  .btn-check + &:hover {\n    // override for the checkbox/radio buttons\n    color: var(--#{$prefix}btn-color);\n    background-color: var(--#{$prefix}btn-bg);\n    border-color: var(--#{$prefix}btn-border-color);\n  }\n\n  &:focus-visible {\n    color: var(--#{$prefix}btn-hover-color);\n    @include gradient-bg(var(--#{$prefix}btn-hover-bg));\n    border-color: var(--#{$prefix}btn-hover-border-color);\n    outline: 0;\n    // Avoid using mixin so we can pass custom focus shadow properly\n    @if $enable-shadows {\n      box-shadow: var(--#{$prefix}btn-box-shadow), var(--#{$prefix}btn-focus-box-shadow);\n    } @else {\n      box-shadow: var(--#{$prefix}btn-focus-box-shadow);\n    }\n  }\n\n  .btn-check:focus-visible + & {\n    border-color: var(--#{$prefix}btn-hover-border-color);\n    outline: 0;\n    // Avoid using mixin so we can pass custom focus shadow properly\n    @if $enable-shadows {\n      box-shadow: var(--#{$prefix}btn-box-shadow), var(--#{$prefix}btn-focus-box-shadow);\n    } @else {\n      box-shadow: var(--#{$prefix}btn-focus-box-shadow);\n    }\n  }\n\n  .btn-check:checked + &,\n  :not(.btn-check) + &:active,\n  &:first-child:active,\n  &.active,\n  &.show {\n    color: var(--#{$prefix}btn-active-color);\n    background-color: var(--#{$prefix}btn-active-bg);\n    // Remove CSS gradients if they're enabled\n    background-image: if($enable-gradients, none, null);\n    border-color: var(--#{$prefix}btn-active-border-color);\n    @include box-shadow(var(--#{$prefix}btn-active-shadow));\n\n    &:focus-visible {\n      // Avoid using mixin so we can pass custom focus shadow properly\n      @if $enable-shadows {\n        box-shadow: var(--#{$prefix}btn-active-shadow), var(--#{$prefix}btn-focus-box-shadow);\n      } @else {\n        box-shadow: var(--#{$prefix}btn-focus-box-shadow);\n      }\n    }\n  }\n\n  .btn-check:checked:focus-visible + & {\n    // Avoid using mixin so we can pass custom focus shadow properly\n    @if $enable-shadows {\n      box-shadow: var(--#{$prefix}btn-active-shadow), var(--#{$prefix}btn-focus-box-shadow);\n    } @else {\n      box-shadow: var(--#{$prefix}btn-focus-box-shadow);\n    }\n  }\n\n  &:disabled,\n  &.disabled,\n  fieldset:disabled & {\n    color: var(--#{$prefix}btn-disabled-color);\n    pointer-events: none;\n    background-color: var(--#{$prefix}btn-disabled-bg);\n    background-image: if($enable-gradients, none, null);\n    border-color: var(--#{$prefix}btn-disabled-border-color);\n    opacity: var(--#{$prefix}btn-disabled-opacity);\n    @include box-shadow(none);\n  }\n}\n\n\n//\n// Alternate buttons\n//\n\n// scss-docs-start btn-variant-loops\n@each $color, $value in $theme-colors {\n  .btn-#{$color} {\n    @if $color == \"light\" {\n      @include button-variant(\n        $value,\n        $value,\n        $hover-background: shade-color($value, $btn-hover-bg-shade-amount),\n        $hover-border: shade-color($value, $btn-hover-border-shade-amount),\n        $active-background: shade-color($value, $btn-active-bg-shade-amount),\n        $active-border: shade-color($value, $btn-active-border-shade-amount)\n      );\n    } @else if $color == \"dark\" {\n      @include button-variant(\n        $value,\n        $value,\n        $hover-background: tint-color($value, $btn-hover-bg-tint-amount),\n        $hover-border: tint-color($value, $btn-hover-border-tint-amount),\n        $active-background: tint-color($value, $btn-active-bg-tint-amount),\n        $active-border: tint-color($value, $btn-active-border-tint-amount)\n      );\n    } @else {\n      @include button-variant($value, $value);\n    }\n  }\n}\n\n@each $color, $value in $theme-colors {\n  .btn-outline-#{$color} {\n    @include button-outline-variant($value);\n  }\n}\n// scss-docs-end btn-variant-loops\n\n\n//\n// Link buttons\n//\n\n// Make a button look and behave like a link\n.btn-link {\n  --#{$prefix}btn-font-weight: #{$font-weight-normal};\n  --#{$prefix}btn-color: #{$btn-link-color};\n  --#{$prefix}btn-bg: transparent;\n  --#{$prefix}btn-border-color: transparent;\n  --#{$prefix}btn-hover-color: #{$btn-link-hover-color};\n  --#{$prefix}btn-hover-border-color: transparent;\n  --#{$prefix}btn-active-color: #{$btn-link-hover-color};\n  --#{$prefix}btn-active-border-color: transparent;\n  --#{$prefix}btn-disabled-color: #{$btn-link-disabled-color};\n  --#{$prefix}btn-disabled-border-color: transparent;\n  --#{$prefix}btn-box-shadow: 0 0 0 #000; // Can't use `none` as keyword negates all values when used with multiple shadows\n  --#{$prefix}btn-focus-shadow-rgb: #{$btn-link-focus-shadow-rgb};\n\n  text-decoration: $link-decoration;\n  @if $enable-gradients {\n    background-image: none;\n  }\n\n  &:hover,\n  &:focus-visible {\n    text-decoration: $link-hover-decoration;\n  }\n\n  &:focus-visible {\n    color: var(--#{$prefix}btn-color);\n  }\n\n  &:hover {\n    color: var(--#{$prefix}btn-hover-color);\n  }\n\n  // No need for an active state here\n}\n\n\n//\n// Button Sizes\n//\n\n.btn-lg {\n  @include button-size($btn-padding-y-lg, $btn-padding-x-lg, $btn-font-size-lg, $btn-border-radius-lg);\n}\n\n.btn-sm {\n  @include button-size($btn-padding-y-sm, $btn-padding-x-sm, $btn-font-size-sm, $btn-border-radius-sm);\n}\n"
  },
  {
    "path": "scss/_card.scss",
    "content": "//\n// Base styles\n//\n\n.card {\n  // scss-docs-start card-css-vars\n  --#{$prefix}card-spacer-y: #{$card-spacer-y};\n  --#{$prefix}card-spacer-x: #{$card-spacer-x};\n  --#{$prefix}card-title-spacer-y: #{$card-title-spacer-y};\n  --#{$prefix}card-title-color: #{$card-title-color};\n  --#{$prefix}card-subtitle-color: #{$card-subtitle-color};\n  --#{$prefix}card-border-width: #{$card-border-width};\n  --#{$prefix}card-border-color: #{$card-border-color};\n  --#{$prefix}card-border-radius: #{$card-border-radius};\n  --#{$prefix}card-box-shadow: #{$card-box-shadow};\n  --#{$prefix}card-inner-border-radius: #{$card-inner-border-radius};\n  --#{$prefix}card-cap-padding-y: #{$card-cap-padding-y};\n  --#{$prefix}card-cap-padding-x: #{$card-cap-padding-x};\n  --#{$prefix}card-cap-bg: #{$card-cap-bg};\n  --#{$prefix}card-cap-color: #{$card-cap-color};\n  --#{$prefix}card-height: #{$card-height};\n  --#{$prefix}card-color: #{$card-color};\n  --#{$prefix}card-bg: #{$card-bg};\n  --#{$prefix}card-img-overlay-padding: #{$card-img-overlay-padding};\n  --#{$prefix}card-group-margin: #{$card-group-margin};\n  // scss-docs-end card-css-vars\n\n  position: relative;\n  display: flex;\n  flex-direction: column;\n  min-width: 0; // See https://github.com/twbs/bootstrap/pull/22740#issuecomment-305868106\n  height: var(--#{$prefix}card-height);\n  color: var(--#{$prefix}body-color);\n  word-wrap: break-word;\n  background-color: var(--#{$prefix}card-bg);\n  background-clip: border-box;\n  border: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color);\n  @include border-radius(var(--#{$prefix}card-border-radius));\n  @include box-shadow(var(--#{$prefix}card-box-shadow));\n\n  > hr {\n    margin-right: 0;\n    margin-left: 0;\n  }\n\n  > .list-group {\n    border-top: inherit;\n    border-bottom: inherit;\n\n    &:first-child {\n      border-top-width: 0;\n      @include border-top-radius(var(--#{$prefix}card-inner-border-radius));\n    }\n\n    &:last-child  {\n      border-bottom-width: 0;\n      @include border-bottom-radius(var(--#{$prefix}card-inner-border-radius));\n    }\n  }\n\n  // Due to specificity of the above selector (`.card > .list-group`), we must\n  // use a child selector here to prevent double borders.\n  > .card-header + .list-group,\n  > .list-group + .card-footer {\n    border-top: 0;\n  }\n}\n\n.card-body {\n  // Enable `flex-grow: 1` for decks and groups so that card blocks take up\n  // as much space as possible, ensuring footers are aligned to the bottom.\n  flex: 1 1 auto;\n  padding: var(--#{$prefix}card-spacer-y) var(--#{$prefix}card-spacer-x);\n  color: var(--#{$prefix}card-color);\n}\n\n.card-title {\n  margin-bottom: var(--#{$prefix}card-title-spacer-y);\n  color: var(--#{$prefix}card-title-color);\n}\n\n.card-subtitle {\n  margin-top: calc(-.5 * var(--#{$prefix}card-title-spacer-y)); // stylelint-disable-line function-disallowed-list\n  margin-bottom: 0;\n  color: var(--#{$prefix}card-subtitle-color);\n}\n\n.card-text:last-child {\n  margin-bottom: 0;\n}\n\n.card-link {\n  &:hover {\n    text-decoration: if($link-hover-decoration == underline, none, null);\n  }\n\n  + .card-link {\n    margin-left: var(--#{$prefix}card-spacer-x);\n  }\n}\n\n//\n// Optional textual caps\n//\n\n.card-header {\n  padding: var(--#{$prefix}card-cap-padding-y) var(--#{$prefix}card-cap-padding-x);\n  margin-bottom: 0; // Removes the default margin-bottom of <hN>\n  color: var(--#{$prefix}card-cap-color);\n  background-color: var(--#{$prefix}card-cap-bg);\n  border-bottom: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color);\n\n  &:first-child {\n    @include border-radius(var(--#{$prefix}card-inner-border-radius) var(--#{$prefix}card-inner-border-radius) 0 0);\n  }\n}\n\n.card-footer {\n  padding: var(--#{$prefix}card-cap-padding-y) var(--#{$prefix}card-cap-padding-x);\n  color: var(--#{$prefix}card-cap-color);\n  background-color: var(--#{$prefix}card-cap-bg);\n  border-top: var(--#{$prefix}card-border-width) solid var(--#{$prefix}card-border-color);\n\n  &:last-child {\n    @include border-radius(0 0 var(--#{$prefix}card-inner-border-radius) var(--#{$prefix}card-inner-border-radius));\n  }\n}\n\n\n//\n// Header navs\n//\n\n.card-header-tabs {\n  margin-right: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list\n  margin-bottom: calc(-1 * var(--#{$prefix}card-cap-padding-y)); // stylelint-disable-line function-disallowed-list\n  margin-left: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list\n  border-bottom: 0;\n\n  .nav-link.active {\n    background-color: var(--#{$prefix}card-bg);\n    border-bottom-color: var(--#{$prefix}card-bg);\n  }\n}\n\n.card-header-pills {\n  margin-right: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list\n  margin-left: calc(-.5 * var(--#{$prefix}card-cap-padding-x)); // stylelint-disable-line function-disallowed-list\n}\n\n// Card image\n.card-img-overlay {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  padding: var(--#{$prefix}card-img-overlay-padding);\n  @include border-radius(var(--#{$prefix}card-inner-border-radius));\n}\n\n.card-img,\n.card-img-top,\n.card-img-bottom {\n  width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch\n}\n\n.card-img,\n.card-img-top {\n  @include border-top-radius(var(--#{$prefix}card-inner-border-radius));\n}\n\n.card-img,\n.card-img-bottom {\n  @include border-bottom-radius(var(--#{$prefix}card-inner-border-radius));\n}\n\n\n//\n// Card groups\n//\n\n.card-group {\n  // The child selector allows nested `.card` within `.card-group`\n  // to display properly.\n  > .card {\n    margin-bottom: var(--#{$prefix}card-group-margin);\n  }\n\n  @include media-breakpoint-up(sm) {\n    display: flex;\n    flex-flow: row wrap;\n    // The child selector allows nested `.card` within `.card-group`\n    // to display properly.\n    > .card {\n      flex: 1 0 0;\n      margin-bottom: 0;\n\n      + .card {\n        margin-left: 0;\n        border-left: 0;\n      }\n\n      // Handle rounded corners\n      @if $enable-rounded {\n        &:not(:last-child) {\n          @include border-end-radius(0);\n\n          > .card-img-top,\n          > .card-header {\n            // stylelint-disable-next-line property-disallowed-list\n            border-top-right-radius: 0;\n          }\n          > .card-img-bottom,\n          > .card-footer {\n            // stylelint-disable-next-line property-disallowed-list\n            border-bottom-right-radius: 0;\n          }\n        }\n\n        &:not(:first-child) {\n          @include border-start-radius(0);\n\n          > .card-img-top,\n          > .card-header {\n            // stylelint-disable-next-line property-disallowed-list\n            border-top-left-radius: 0;\n          }\n          > .card-img-bottom,\n          > .card-footer {\n            // stylelint-disable-next-line property-disallowed-list\n            border-bottom-left-radius: 0;\n          }\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "scss/_carousel.scss",
    "content": "// Notes on the classes:\n//\n// 1. .carousel.pointer-event should ideally be pan-y (to allow for users to scroll vertically)\n//    even when their scroll action started on a carousel, but for compatibility (with Firefox)\n//    we're preventing all actions instead\n// 2. The .carousel-item-start and .carousel-item-end is used to indicate where\n//    the active slide is heading.\n// 3. .active.carousel-item is the current slide.\n// 4. .active.carousel-item-start and .active.carousel-item-end is the current\n//    slide in its in-transition state. Only one of these occurs at a time.\n// 5. .carousel-item-next.carousel-item-start and .carousel-item-prev.carousel-item-end\n//    is the upcoming slide in transition.\n\n.carousel {\n  position: relative;\n}\n\n.carousel.pointer-event {\n  touch-action: pan-y;\n}\n\n.carousel-inner {\n  position: relative;\n  width: 100%;\n  overflow: hidden;\n  @include clearfix();\n}\n\n.carousel-item {\n  position: relative;\n  display: none;\n  float: left;\n  width: 100%;\n  margin-right: -100%;\n  backface-visibility: hidden;\n  @include transition($carousel-transition);\n}\n\n.carousel-item.active,\n.carousel-item-next,\n.carousel-item-prev {\n  display: block;\n}\n\n.carousel-item-next:not(.carousel-item-start),\n.active.carousel-item-end {\n  transform: translateX(100%);\n}\n\n.carousel-item-prev:not(.carousel-item-end),\n.active.carousel-item-start {\n  transform: translateX(-100%);\n}\n\n\n//\n// Alternate transitions\n//\n\n.carousel-fade {\n  .carousel-item {\n    opacity: 0;\n    transition-property: opacity;\n    transform: none;\n  }\n\n  .carousel-item.active,\n  .carousel-item-next.carousel-item-start,\n  .carousel-item-prev.carousel-item-end {\n    z-index: 1;\n    opacity: 1;\n  }\n\n  .active.carousel-item-start,\n  .active.carousel-item-end {\n    z-index: 0;\n    opacity: 0;\n    @include transition(opacity 0s $carousel-transition-duration);\n  }\n}\n\n\n//\n// Left/right controls for nav\n//\n\n.carousel-control-prev,\n.carousel-control-next {\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  z-index: 1;\n  // Use flex for alignment (1-3)\n  display: flex; // 1. allow flex styles\n  align-items: center; // 2. vertically center contents\n  justify-content: center; // 3. horizontally center contents\n  width: $carousel-control-width;\n  padding: 0;\n  color: $carousel-control-color;\n  text-align: center;\n  background: none;\n  filter: var(--#{$prefix}carousel-control-icon-filter);\n  border: 0;\n  opacity: $carousel-control-opacity;\n  @include transition($carousel-control-transition);\n\n  // Hover/focus state\n  &:hover,\n  &:focus {\n    color: $carousel-control-color;\n    text-decoration: none;\n    outline: 0;\n    opacity: $carousel-control-hover-opacity;\n  }\n}\n.carousel-control-prev {\n  left: 0;\n  background-image: if($enable-gradients, linear-gradient(90deg, rgba($black, .25), rgba($black, .001)), null);\n}\n.carousel-control-next {\n  right: 0;\n  background-image: if($enable-gradients, linear-gradient(270deg, rgba($black, .25), rgba($black, .001)), null);\n}\n\n// Icons for within\n.carousel-control-prev-icon,\n.carousel-control-next-icon {\n  display: inline-block;\n  width: $carousel-control-icon-width;\n  height: $carousel-control-icon-width;\n  background-repeat: no-repeat;\n  background-position: 50%;\n  background-size: 100% 100%;\n}\n\n.carousel-control-prev-icon {\n  background-image: escape-svg($carousel-control-prev-icon-bg) #{\"/*rtl:\" + escape-svg($carousel-control-next-icon-bg) + \"*/\"};\n}\n.carousel-control-next-icon {\n  background-image: escape-svg($carousel-control-next-icon-bg) #{\"/*rtl:\" + escape-svg($carousel-control-prev-icon-bg) + \"*/\"};\n}\n\n// Optional indicator pips/controls\n//\n// Add a container (such as a list) with the following class and add an item (ideally a focusable control,\n// like a button) with data-bs-target for each slide your carousel holds.\n\n.carousel-indicators {\n  position: absolute;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 2;\n  display: flex;\n  justify-content: center;\n  padding: 0;\n  // Use the .carousel-control's width as margin so we don't overlay those\n  margin-right: $carousel-control-width;\n  margin-bottom: 1rem;\n  margin-left: $carousel-control-width;\n\n  [data-bs-target] {\n    box-sizing: content-box;\n    flex: 0 1 auto;\n    width: $carousel-indicator-width;\n    height: $carousel-indicator-height;\n    padding: 0;\n    margin-right: $carousel-indicator-spacer;\n    margin-left: $carousel-indicator-spacer;\n    text-indent: -999px;\n    cursor: pointer;\n    background-color: var(--#{$prefix}carousel-indicator-active-bg);\n    background-clip: padding-box;\n    border: 0;\n    // Use transparent borders to increase the hit area by 10px on top and bottom.\n    border-top: $carousel-indicator-hit-area-height solid transparent;\n    border-bottom: $carousel-indicator-hit-area-height solid transparent;\n    opacity: $carousel-indicator-opacity;\n    @include transition($carousel-indicator-transition);\n  }\n\n  .active {\n    opacity: $carousel-indicator-active-opacity;\n  }\n}\n\n\n// Optional captions\n//\n//\n\n.carousel-caption {\n  position: absolute;\n  right: (100% - $carousel-caption-width) * .5;\n  bottom: $carousel-caption-spacer;\n  left: (100% - $carousel-caption-width) * .5;\n  padding-top: $carousel-caption-padding-y;\n  padding-bottom: $carousel-caption-padding-y;\n  color: var(--#{$prefix}carousel-caption-color);\n  text-align: center;\n}\n\n// Dark mode carousel\n\n@mixin carousel-dark() {\n  --#{$prefix}carousel-indicator-active-bg: #{$carousel-indicator-active-bg-dark};\n  --#{$prefix}carousel-caption-color: #{$carousel-caption-color-dark};\n  --#{$prefix}carousel-control-icon-filter: #{$carousel-control-icon-filter-dark};\n}\n\n.carousel-dark {\n  @include carousel-dark();\n}\n\n:root,\n[data-bs-theme=\"light\"] {\n  --#{$prefix}carousel-indicator-active-bg: #{$carousel-indicator-active-bg};\n  --#{$prefix}carousel-caption-color: #{$carousel-caption-color};\n  --#{$prefix}carousel-control-icon-filter: #{$carousel-control-icon-filter};\n}\n\n@if $enable-dark-mode {\n  @include color-mode(dark, true) {\n    @include carousel-dark();\n  }\n}\n"
  },
  {
    "path": "scss/_close.scss",
    "content": "// Transparent background and border properties included for button version.\n// iOS requires the button element instead of an anchor tag.\n// If you want the anchor version, it requires `href=\"#\"`.\n// See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n\n.btn-close {\n  // scss-docs-start close-css-vars\n  --#{$prefix}btn-close-color: #{$btn-close-color};\n  --#{$prefix}btn-close-bg: #{ escape-svg($btn-close-bg) };\n  --#{$prefix}btn-close-opacity: #{$btn-close-opacity};\n  --#{$prefix}btn-close-hover-opacity: #{$btn-close-hover-opacity};\n  --#{$prefix}btn-close-focus-shadow: #{$btn-close-focus-shadow};\n  --#{$prefix}btn-close-focus-opacity: #{$btn-close-focus-opacity};\n  --#{$prefix}btn-close-disabled-opacity: #{$btn-close-disabled-opacity};\n  // scss-docs-end close-css-vars\n\n  box-sizing: content-box;\n  width: $btn-close-width;\n  height: $btn-close-height;\n  padding: $btn-close-padding-y $btn-close-padding-x;\n  color: var(--#{$prefix}btn-close-color);\n  background: transparent var(--#{$prefix}btn-close-bg) center / $btn-close-width auto no-repeat; // include transparent for button elements\n  filter: var(--#{$prefix}btn-close-filter);\n  border: 0; // for button elements\n  @include border-radius();\n  opacity: var(--#{$prefix}btn-close-opacity);\n\n  // Override <a>'s hover style\n  &:hover {\n    color: var(--#{$prefix}btn-close-color);\n    text-decoration: none;\n    opacity: var(--#{$prefix}btn-close-hover-opacity);\n  }\n\n  &:focus {\n    outline: 0;\n    box-shadow: var(--#{$prefix}btn-close-focus-shadow);\n    opacity: var(--#{$prefix}btn-close-focus-opacity);\n  }\n\n  &:disabled,\n  &.disabled {\n    pointer-events: none;\n    user-select: none;\n    opacity: var(--#{$prefix}btn-close-disabled-opacity);\n  }\n}\n\n@mixin btn-close-white() {\n  --#{$prefix}btn-close-filter: #{$btn-close-filter-dark};\n}\n\n.btn-close-white {\n  @include btn-close-white();\n}\n\n:root,\n[data-bs-theme=\"light\"] {\n  --#{$prefix}btn-close-filter: #{$btn-close-filter};\n}\n\n@if $enable-dark-mode {\n  @include color-mode(dark, true) {\n    @include btn-close-white();\n  }\n}\n"
  },
  {
    "path": "scss/_containers.scss",
    "content": "// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n@if $enable-container-classes {\n  // Single container class with breakpoint max-widths\n  .container,\n  // 100% wide container at all breakpoints\n  .container-fluid {\n    @include make-container();\n  }\n\n  // Responsive containers that are 100% wide until a breakpoint\n  @each $breakpoint, $container-max-width in $container-max-widths {\n    .container-#{$breakpoint} {\n      @extend .container-fluid;\n    }\n\n    @include media-breakpoint-up($breakpoint, $grid-breakpoints) {\n      %responsive-container-#{$breakpoint} {\n        max-width: $container-max-width;\n      }\n\n      // Extend each breakpoint which is smaller or equal to the current breakpoint\n      $extend-breakpoint: true;\n\n      @each $name, $width in $grid-breakpoints {\n        @if ($extend-breakpoint) {\n          .container#{breakpoint-infix($name, $grid-breakpoints)} {\n            @extend %responsive-container-#{$breakpoint};\n          }\n\n          // Once the current breakpoint is reached, stop extending\n          @if ($breakpoint == $name) {\n            $extend-breakpoint: false;\n          }\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "scss/_dropdown.scss",
    "content": "// The dropdown wrapper (`<div>`)\n.dropup,\n.dropend,\n.dropdown,\n.dropstart,\n.dropup-center,\n.dropdown-center {\n  position: relative;\n}\n\n.dropdown-toggle {\n  white-space: nowrap;\n\n  // Generate the caret automatically\n  @include caret();\n}\n\n// The dropdown menu\n.dropdown-menu {\n  // scss-docs-start dropdown-css-vars\n  --#{$prefix}dropdown-zindex: #{$zindex-dropdown};\n  --#{$prefix}dropdown-min-width: #{$dropdown-min-width};\n  --#{$prefix}dropdown-padding-x: #{$dropdown-padding-x};\n  --#{$prefix}dropdown-padding-y: #{$dropdown-padding-y};\n  --#{$prefix}dropdown-spacer: #{$dropdown-spacer};\n  @include rfs($dropdown-font-size, --#{$prefix}dropdown-font-size);\n  --#{$prefix}dropdown-color: #{$dropdown-color};\n  --#{$prefix}dropdown-bg: #{$dropdown-bg};\n  --#{$prefix}dropdown-border-color: #{$dropdown-border-color};\n  --#{$prefix}dropdown-border-radius: #{$dropdown-border-radius};\n  --#{$prefix}dropdown-border-width: #{$dropdown-border-width};\n  --#{$prefix}dropdown-inner-border-radius: #{$dropdown-inner-border-radius};\n  --#{$prefix}dropdown-divider-bg: #{$dropdown-divider-bg};\n  --#{$prefix}dropdown-divider-margin-y: #{$dropdown-divider-margin-y};\n  --#{$prefix}dropdown-box-shadow: #{$dropdown-box-shadow};\n  --#{$prefix}dropdown-link-color: #{$dropdown-link-color};\n  --#{$prefix}dropdown-link-hover-color: #{$dropdown-link-hover-color};\n  --#{$prefix}dropdown-link-hover-bg: #{$dropdown-link-hover-bg};\n  --#{$prefix}dropdown-link-active-color: #{$dropdown-link-active-color};\n  --#{$prefix}dropdown-link-active-bg: #{$dropdown-link-active-bg};\n  --#{$prefix}dropdown-link-disabled-color: #{$dropdown-link-disabled-color};\n  --#{$prefix}dropdown-item-padding-x: #{$dropdown-item-padding-x};\n  --#{$prefix}dropdown-item-padding-y: #{$dropdown-item-padding-y};\n  --#{$prefix}dropdown-header-color: #{$dropdown-header-color};\n  --#{$prefix}dropdown-header-padding-x: #{$dropdown-header-padding-x};\n  --#{$prefix}dropdown-header-padding-y: #{$dropdown-header-padding-y};\n  // scss-docs-end dropdown-css-vars\n\n  position: absolute;\n  z-index: var(--#{$prefix}dropdown-zindex);\n  display: none; // none by default, but block on \"open\" of the menu\n  min-width: var(--#{$prefix}dropdown-min-width);\n  padding: var(--#{$prefix}dropdown-padding-y) var(--#{$prefix}dropdown-padding-x);\n  margin: 0; // Override default margin of ul\n  @include font-size(var(--#{$prefix}dropdown-font-size));\n  color: var(--#{$prefix}dropdown-color);\n  text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)\n  list-style: none;\n  background-color: var(--#{$prefix}dropdown-bg);\n  background-clip: padding-box;\n  border: var(--#{$prefix}dropdown-border-width) solid var(--#{$prefix}dropdown-border-color);\n  @include border-radius(var(--#{$prefix}dropdown-border-radius));\n  @include box-shadow(var(--#{$prefix}dropdown-box-shadow));\n\n  &[data-bs-popper] {\n    top: 100%;\n    left: 0;\n    margin-top: var(--#{$prefix}dropdown-spacer);\n  }\n\n  @if $dropdown-padding-y == 0 {\n    > .dropdown-item:first-child,\n    > li:first-child .dropdown-item {\n      @include border-top-radius(var(--#{$prefix}dropdown-inner-border-radius));\n    }\n    > .dropdown-item:last-child,\n    > li:last-child .dropdown-item {\n      @include border-bottom-radius(var(--#{$prefix}dropdown-inner-border-radius));\n    }\n\n  }\n}\n\n// scss-docs-start responsive-breakpoints\n// We deliberately hardcode the `bs-` prefix because we check\n// this custom property in JS to determine Popper's positioning\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n  @include media-breakpoint-up($breakpoint) {\n    $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n    .dropdown-menu#{$infix}-start {\n      --bs-position: start;\n\n      &[data-bs-popper] {\n        right: auto;\n        left: 0;\n      }\n    }\n\n    .dropdown-menu#{$infix}-end {\n      --bs-position: end;\n\n      &[data-bs-popper] {\n        right: 0;\n        left: auto;\n      }\n    }\n  }\n}\n// scss-docs-end responsive-breakpoints\n\n// Allow for dropdowns to go bottom up (aka, dropup-menu)\n// Just add .dropup after the standard .dropdown class and you're set.\n.dropup {\n  .dropdown-menu[data-bs-popper] {\n    top: auto;\n    bottom: 100%;\n    margin-top: 0;\n    margin-bottom: var(--#{$prefix}dropdown-spacer);\n  }\n\n  .dropdown-toggle {\n    @include caret(up);\n  }\n}\n\n.dropend {\n  .dropdown-menu[data-bs-popper] {\n    top: 0;\n    right: auto;\n    left: 100%;\n    margin-top: 0;\n    margin-left: var(--#{$prefix}dropdown-spacer);\n  }\n\n  .dropdown-toggle {\n    @include caret(end);\n    &::after {\n      vertical-align: 0;\n    }\n  }\n}\n\n.dropstart {\n  .dropdown-menu[data-bs-popper] {\n    top: 0;\n    right: 100%;\n    left: auto;\n    margin-top: 0;\n    margin-right: var(--#{$prefix}dropdown-spacer);\n  }\n\n  .dropdown-toggle {\n    @include caret(start);\n    &::before {\n      vertical-align: 0;\n    }\n  }\n}\n\n\n// Dividers (basically an `<hr>`) within the dropdown\n.dropdown-divider {\n  height: 0;\n  margin: var(--#{$prefix}dropdown-divider-margin-y) 0;\n  overflow: hidden;\n  border-top: 1px solid var(--#{$prefix}dropdown-divider-bg);\n  opacity: 1; // Revisit in v6 to de-dupe styles that conflict with <hr> element\n}\n\n// Links, buttons, and more within the dropdown menu\n//\n// `<button>`-specific styles are denoted with `// For <button>s`\n.dropdown-item {\n  display: block;\n  width: 100%; // For `<button>`s\n  padding: var(--#{$prefix}dropdown-item-padding-y) var(--#{$prefix}dropdown-item-padding-x);\n  clear: both;\n  font-weight: $font-weight-normal;\n  color: var(--#{$prefix}dropdown-link-color);\n  text-align: inherit; // For `<button>`s\n  text-decoration: if($link-decoration == none, null, none);\n  white-space: nowrap; // prevent links from randomly breaking onto new lines\n  background-color: transparent; // For `<button>`s\n  border: 0; // For `<button>`s\n  @include border-radius(var(--#{$prefix}dropdown-item-border-radius, 0));\n\n  &:hover,\n  &:focus {\n    color: var(--#{$prefix}dropdown-link-hover-color);\n    text-decoration: if($link-hover-decoration == underline, none, null);\n    @include gradient-bg(var(--#{$prefix}dropdown-link-hover-bg));\n  }\n\n  &.active,\n  &:active {\n    color: var(--#{$prefix}dropdown-link-active-color);\n    text-decoration: none;\n    @include gradient-bg(var(--#{$prefix}dropdown-link-active-bg));\n  }\n\n  &.disabled,\n  &:disabled {\n    color: var(--#{$prefix}dropdown-link-disabled-color);\n    pointer-events: none;\n    background-color: transparent;\n    // Remove CSS gradients if they're enabled\n    background-image: if($enable-gradients, none, null);\n  }\n}\n\n.dropdown-menu.show {\n  display: block;\n}\n\n// Dropdown section headers\n.dropdown-header {\n  display: block;\n  padding: var(--#{$prefix}dropdown-header-padding-y) var(--#{$prefix}dropdown-header-padding-x);\n  margin-bottom: 0; // for use with heading elements\n  @include font-size($font-size-sm);\n  color: var(--#{$prefix}dropdown-header-color);\n  white-space: nowrap; // as with > li > a\n}\n\n// Dropdown text\n.dropdown-item-text {\n  display: block;\n  padding: var(--#{$prefix}dropdown-item-padding-y) var(--#{$prefix}dropdown-item-padding-x);\n  color: var(--#{$prefix}dropdown-link-color);\n}\n\n// Dark dropdowns\n.dropdown-menu-dark {\n  // scss-docs-start dropdown-dark-css-vars\n  --#{$prefix}dropdown-color: #{$dropdown-dark-color};\n  --#{$prefix}dropdown-bg: #{$dropdown-dark-bg};\n  --#{$prefix}dropdown-border-color: #{$dropdown-dark-border-color};\n  --#{$prefix}dropdown-box-shadow: #{$dropdown-dark-box-shadow};\n  --#{$prefix}dropdown-link-color: #{$dropdown-dark-link-color};\n  --#{$prefix}dropdown-link-hover-color: #{$dropdown-dark-link-hover-color};\n  --#{$prefix}dropdown-divider-bg: #{$dropdown-dark-divider-bg};\n  --#{$prefix}dropdown-link-hover-bg: #{$dropdown-dark-link-hover-bg};\n  --#{$prefix}dropdown-link-active-color: #{$dropdown-dark-link-active-color};\n  --#{$prefix}dropdown-link-active-bg: #{$dropdown-dark-link-active-bg};\n  --#{$prefix}dropdown-link-disabled-color: #{$dropdown-dark-link-disabled-color};\n  --#{$prefix}dropdown-header-color: #{$dropdown-dark-header-color};\n  // scss-docs-end dropdown-dark-css-vars\n}\n"
  },
  {
    "path": "scss/_forms.scss",
    "content": "@import \"forms/labels\";\n@import \"forms/form-text\";\n@import \"forms/form-control\";\n@import \"forms/form-select\";\n@import \"forms/form-check\";\n@import \"forms/form-range\";\n@import \"forms/floating-labels\";\n@import \"forms/input-group\";\n@import \"forms/validation\";\n"
  },
  {
    "path": "scss/_functions.scss",
    "content": "// Bootstrap functions\n//\n// Utility mixins and functions for evaluating source code across our variables, maps, and mixins.\n\n// Ascending\n// Used to evaluate Sass maps like our grid breakpoints.\n@mixin _assert-ascending($map, $map-name) {\n  $prev-key: null;\n  $prev-num: null;\n  @each $key, $num in $map {\n    @if $prev-num == null or unit($num) == \"%\" or unit($prev-num) == \"%\" {\n      // Do nothing\n    } @else if not comparable($prev-num, $num) {\n      @warn \"Potentially invalid value for #{$map-name}: This map must be in ascending order, but key '#{$key}' has value #{$num} whose unit makes it incomparable to #{$prev-num}, the value of the previous key '#{$prev-key}' !\";\n    } @else if $prev-num >= $num {\n      @warn \"Invalid value for #{$map-name}: This map must be in ascending order, but key '#{$key}' has value #{$num} which isn't greater than #{$prev-num}, the value of the previous key '#{$prev-key}' !\";\n    }\n    $prev-key: $key;\n    $prev-num: $num;\n  }\n}\n\n// Starts at zero\n// Used to ensure the min-width of the lowest breakpoint starts at 0.\n@mixin _assert-starts-at-zero($map, $map-name: \"$grid-breakpoints\") {\n  @if length($map) > 0 {\n    $values: map-values($map);\n    $first-value: nth($values, 1);\n    @if $first-value != 0 {\n      @warn \"First breakpoint in #{$map-name} must start at 0, but starts at #{$first-value}.\";\n    }\n  }\n}\n\n// Colors\n@function to-rgb($value) {\n  @return red($value), green($value), blue($value);\n}\n\n// stylelint-disable scss/dollar-variable-pattern\n@function rgba-css-var($identifier, $target) {\n  @if $identifier == \"body\" and $target == \"bg\" {\n    @return rgba(var(--#{$prefix}#{$identifier}-bg-rgb), var(--#{$prefix}#{$target}-opacity));\n  } @if $identifier == \"body\" and $target == \"text\" {\n    @return rgba(var(--#{$prefix}#{$identifier}-color-rgb), var(--#{$prefix}#{$target}-opacity));\n  } @else {\n    @return rgba(var(--#{$prefix}#{$identifier}-rgb), var(--#{$prefix}#{$target}-opacity));\n  }\n}\n\n@function map-loop($map, $func, $args...) {\n  $_map: ();\n\n  @each $key, $value in $map {\n    // allow to pass the $key and $value of the map as an function argument\n    $_args: ();\n    @each $arg in $args {\n      $_args: append($_args, if($arg == \"$key\", $key, if($arg == \"$value\", $value, $arg)));\n    }\n\n    $_map: map-merge($_map, ($key: call(get-function($func), $_args...)));\n  }\n\n  @return $_map;\n}\n// stylelint-enable scss/dollar-variable-pattern\n\n@function varify($list) {\n  $result: null;\n  @each $entry in $list {\n    $result: append($result, var(--#{$prefix}#{$entry}), space);\n  }\n  @return $result;\n}\n\n// Internal Bootstrap function to turn maps into its negative variant.\n// It prefixes the keys with `n` and makes the value negative.\n@function negativify-map($map) {\n  $result: ();\n  @each $key, $value in $map {\n    @if $key != 0 {\n      $result: map-merge($result, (\"n\" + $key: (-$value)));\n    }\n  }\n  @return $result;\n}\n\n// Get multiple keys from a sass map\n@function map-get-multiple($map, $values) {\n  $result: ();\n  @each $key, $value in $map {\n    @if (index($values, $key) != null) {\n      $result: map-merge($result, ($key: $value));\n    }\n  }\n  @return $result;\n}\n\n// Merge multiple maps\n@function map-merge-multiple($maps...) {\n  $merged-maps: ();\n\n  @each $map in $maps {\n    $merged-maps: map-merge($merged-maps, $map);\n  }\n  @return $merged-maps;\n}\n\n// Replace `$search` with `$replace` in `$string`\n// Used on our SVG icon backgrounds for custom forms.\n//\n// @author Kitty Giraudel\n// @param {String} $string - Initial string\n// @param {String} $search - Substring to replace\n// @param {String} $replace ('') - New value\n// @return {String} - Updated string\n@function str-replace($string, $search, $replace: \"\") {\n  $index: str-index($string, $search);\n\n  @if $index {\n    @return str-slice($string, 1, $index - 1) + $replace + str-replace(str-slice($string, $index + str-length($search)), $search, $replace);\n  }\n\n  @return $string;\n}\n\n// See https://codepen.io/kevinweber/pen/dXWoRw\n//\n// Requires the use of quotes around data URIs.\n\n@function escape-svg($string) {\n  @if str-index($string, \"data:image/svg+xml\") {\n    @each $char, $encoded in $escaped-characters {\n      // Do not escape the url brackets\n      @if str-index($string, \"url(\") == 1 {\n        $string: url(\"#{str-replace(str-slice($string, 6, -3), $char, $encoded)}\");\n      } @else {\n        $string: str-replace($string, $char, $encoded);\n      }\n    }\n  }\n\n  @return $string;\n}\n\n// Color contrast\n// See https://github.com/twbs/bootstrap/pull/30168\n\n// A list of pre-calculated numbers of pow(divide((divide($value, 255) + .055), 1.055), 2.4). (from 0 to 255)\n// stylelint-disable-next-line scss/dollar-variable-default, scss/dollar-variable-pattern\n$_luminance-list: .0008 .001 .0011 .0013 .0015 .0017 .002 .0022 .0025 .0027 .003 .0033 .0037 .004 .0044 .0048 .0052 .0056 .006 .0065 .007 .0075 .008 .0086 .0091 .0097 .0103 .011 .0116 .0123 .013 .0137 .0144 .0152 .016 .0168 .0176 .0185 .0194 .0203 .0212 .0222 .0232 .0242 .0252 .0262 .0273 .0284 .0296 .0307 .0319 .0331 .0343 .0356 .0369 .0382 .0395 .0409 .0423 .0437 .0452 .0467 .0482 .0497 .0513 .0529 .0545 .0561 .0578 .0595 .0612 .063 .0648 .0666 .0685 .0704 .0723 .0742 .0762 .0782 .0802 .0823 .0844 .0865 .0887 .0908 .0931 .0953 .0976 .0999 .1022 .1046 .107 .1095 .1119 .1144 .117 .1195 .1221 .1248 .1274 .1301 .1329 .1356 .1384 .1413 .1441 .147 .15 .1529 .1559 .159 .162 .1651 .1683 .1714 .1746 .1779 .1812 .1845 .1878 .1912 .1946 .1981 .2016 .2051 .2086 .2122 .2159 .2195 .2232 .227 .2307 .2346 .2384 .2423 .2462 .2502 .2542 .2582 .2623 .2664 .2705 .2747 .2789 .2831 .2874 .2918 .2961 .3005 .305 .3095 .314 .3185 .3231 .3278 .3325 .3372 .3419 .3467 .3515 .3564 .3613 .3663 .3712 .3763 .3813 .3864 .3916 .3968 .402 .4072 .4125 .4179 .4233 .4287 .4342 .4397 .4452 .4508 .4564 .4621 .4678 .4735 .4793 .4851 .491 .4969 .5029 .5089 .5149 .521 .5271 .5333 .5395 .5457 .552 .5583 .5647 .5711 .5776 .5841 .5906 .5972 .6038 .6105 .6172 .624 .6308 .6376 .6445 .6514 .6584 .6654 .6724 .6795 .6867 .6939 .7011 .7084 .7157 .7231 .7305 .7379 .7454 .7529 .7605 .7682 .7758 .7835 .7913 .7991 .807 .8148 .8228 .8308 .8388 .8469 .855 .8632 .8714 .8796 .8879 .8963 .9047 .9131 .9216 .9301 .9387 .9473 .956 .9647 .9734 .9823 .9911 1;\n\n@function color-contrast($background, $color-contrast-dark: $color-contrast-dark, $color-contrast-light: $color-contrast-light, $min-contrast-ratio: $min-contrast-ratio) {\n  $foregrounds: $color-contrast-light, $color-contrast-dark, $white, $black;\n  $max-ratio: 0;\n  $max-ratio-color: null;\n\n  @each $color in $foregrounds {\n    $contrast-ratio: contrast-ratio($background, $color);\n    @if $contrast-ratio >= $min-contrast-ratio {\n      @return $color;\n    } @else if $contrast-ratio > $max-ratio {\n      $max-ratio: $contrast-ratio;\n      $max-ratio-color: $color;\n    }\n  }\n\n  @warn \"Found no color leading to #{$min-contrast-ratio}:1 contrast ratio against #{$background}...\";\n\n  @return $max-ratio-color;\n}\n\n@function contrast-ratio($background, $foreground: $color-contrast-light) {\n  $l1: luminance($background);\n  $l2: luminance(opaque($background, $foreground));\n\n  @return if($l1 > $l2, divide($l1 + .05, $l2 + .05), divide($l2 + .05, $l1 + .05));\n}\n\n// Return WCAG2.2 relative luminance\n// See https://www.w3.org/TR/WCAG/#dfn-relative-luminance\n// See https://www.w3.org/TR/WCAG/#dfn-contrast-ratio\n@function luminance($color) {\n  $rgb: (\n    \"r\": red($color),\n    \"g\": green($color),\n    \"b\": blue($color)\n  );\n\n  @each $name, $value in $rgb {\n    $value: if(divide($value, 255) < .04045, divide(divide($value, 255), 12.92), nth($_luminance-list, $value + 1));\n    $rgb: map-merge($rgb, ($name: $value));\n  }\n\n  @return (map-get($rgb, \"r\") * .2126) + (map-get($rgb, \"g\") * .7152) + (map-get($rgb, \"b\") * .0722);\n}\n\n// Return opaque color\n// opaque(#fff, rgba(0, 0, 0, .5)) => #808080\n@function opaque($background, $foreground) {\n  @return mix(rgba($foreground, 1), $background, opacity($foreground) * 100%);\n}\n\n// scss-docs-start color-functions\n// Tint a color: mix a color with white\n@function tint-color($color, $weight) {\n  @return mix(white, $color, $weight);\n}\n\n// Shade a color: mix a color with black\n@function shade-color($color, $weight) {\n  @return mix(black, $color, $weight);\n}\n\n// Shade the color if the weight is positive, else tint it\n@function shift-color($color, $weight) {\n  @return if($weight > 0, shade-color($color, $weight), tint-color($color, -$weight));\n}\n// scss-docs-end color-functions\n\n// Return valid calc\n@function add($value1, $value2, $return-calc: true) {\n  @if $value1 == null {\n    @return $value2;\n  }\n\n  @if $value2 == null {\n    @return $value1;\n  }\n\n  @if type-of($value1) == number and type-of($value2) == number and comparable($value1, $value2) {\n    @return $value1 + $value2;\n  }\n\n  @return if($return-calc == true, calc(#{$value1} + #{$value2}), $value1 + unquote(\" + \") + $value2);\n}\n\n@function subtract($value1, $value2, $return-calc: true) {\n  @if $value1 == null and $value2 == null {\n    @return null;\n  }\n\n  @if $value1 == null {\n    @return -$value2;\n  }\n\n  @if $value2 == null {\n    @return $value1;\n  }\n\n  @if type-of($value1) == number and type-of($value2) == number and comparable($value1, $value2) {\n    @return $value1 - $value2;\n  }\n\n  @if type-of($value2) != number {\n    $value2: unquote(\"(\") + $value2 + unquote(\")\");\n  }\n\n  @return if($return-calc == true, calc(#{$value1} - #{$value2}), $value1 + unquote(\" - \") + $value2);\n}\n\n@function divide($dividend, $divisor, $precision: 10) {\n  $sign: if($dividend > 0 and $divisor > 0 or $dividend < 0 and $divisor < 0, 1, -1);\n  $dividend: abs($dividend);\n  $divisor: abs($divisor);\n  @if $dividend == 0 {\n    @return 0;\n  }\n  @if $divisor == 0 {\n    @error \"Cannot divide by 0\";\n  }\n  $remainder: $dividend;\n  $result: 0;\n  $factor: 10;\n  @while ($remainder > 0 and $precision >= 0) {\n    $quotient: 0;\n    @while ($remainder >= $divisor) {\n      $remainder: $remainder - $divisor;\n      $quotient: $quotient + 1;\n    }\n    $result: $result * 10 + $quotient;\n    $factor: $factor * .1;\n    $remainder: $remainder * 10;\n    $precision: $precision - 1;\n    @if ($precision < 0 and $remainder >= $divisor * 5) {\n      $result: $result + 1;\n    }\n  }\n  $result: $result * $factor * $sign;\n  $dividend-unit: unit($dividend);\n  $divisor-unit: unit($divisor);\n  $unit-map: (\n    \"px\": 1px,\n    \"rem\": 1rem,\n    \"em\": 1em,\n    \"%\": 1%\n  );\n  @if ($dividend-unit != $divisor-unit and map-has-key($unit-map, $dividend-unit)) {\n    $result: $result * map-get($unit-map, $dividend-unit);\n  }\n  @return $result;\n}\n"
  },
  {
    "path": "scss/_grid.scss",
    "content": "// Row\n//\n// Rows contain your columns.\n\n:root {\n  @each $name, $value in $grid-breakpoints {\n    --#{$prefix}breakpoint-#{$name}: #{$value};\n  }\n}\n\n@if $enable-grid-classes {\n  .row {\n    @include make-row();\n\n    > * {\n      @include make-col-ready();\n    }\n  }\n}\n\n@if $enable-cssgrid {\n  .grid {\n    display: grid;\n    grid-template-rows: repeat(var(--#{$prefix}rows, 1), 1fr);\n    grid-template-columns: repeat(var(--#{$prefix}columns, #{$grid-columns}), 1fr);\n    gap: var(--#{$prefix}gap, #{$grid-gutter-width});\n\n    @include make-cssgrid();\n  }\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n@if $enable-grid-classes {\n  @include make-grid-columns();\n}\n"
  },
  {
    "path": "scss/_helpers.scss",
    "content": "@import \"helpers/clearfix\";\n@import \"helpers/color-bg\";\n@import \"helpers/colored-links\";\n@import \"helpers/focus-ring\";\n@import \"helpers/icon-link\";\n@import \"helpers/ratio\";\n@import \"helpers/position\";\n@import \"helpers/stacks\";\n@import \"helpers/visually-hidden\";\n@import \"helpers/stretched-link\";\n@import \"helpers/text-truncation\";\n@import \"helpers/vr\";\n"
  },
  {
    "path": "scss/_images.scss",
    "content": "// Responsive images (ensure images don't scale beyond their parents)\n//\n// This is purposefully opt-in via an explicit class rather than being the default for all `<img>`s.\n// We previously tried the \"images are responsive by default\" approach in Bootstrap v2,\n// and abandoned it in Bootstrap v3 because it breaks lots of third-party widgets (including Google Maps)\n// which weren't expecting the images within themselves to be involuntarily resized.\n// See also https://github.com/twbs/bootstrap/issues/18178\n.img-fluid {\n  @include img-fluid();\n}\n\n\n// Image thumbnails\n.img-thumbnail {\n  padding: $thumbnail-padding;\n  background-color: $thumbnail-bg;\n  border: $thumbnail-border-width solid $thumbnail-border-color;\n  @include border-radius($thumbnail-border-radius);\n  @include box-shadow($thumbnail-box-shadow);\n\n  // Keep them at most 100% wide\n  @include img-fluid();\n}\n\n//\n// Figures\n//\n\n.figure {\n  // Ensures the caption's text aligns with the image.\n  display: inline-block;\n}\n\n.figure-img {\n  margin-bottom: $spacer * .5;\n  line-height: 1;\n}\n\n.figure-caption {\n  @include font-size($figure-caption-font-size);\n  color: $figure-caption-color;\n}\n"
  },
  {
    "path": "scss/_list-group.scss",
    "content": "// Base class\n//\n// Easily usable on <ul>, <ol>, or <div>.\n\n.list-group {\n  // scss-docs-start list-group-css-vars\n  --#{$prefix}list-group-color: #{$list-group-color};\n  --#{$prefix}list-group-bg: #{$list-group-bg};\n  --#{$prefix}list-group-border-color: #{$list-group-border-color};\n  --#{$prefix}list-group-border-width: #{$list-group-border-width};\n  --#{$prefix}list-group-border-radius: #{$list-group-border-radius};\n  --#{$prefix}list-group-item-padding-x: #{$list-group-item-padding-x};\n  --#{$prefix}list-group-item-padding-y: #{$list-group-item-padding-y};\n  --#{$prefix}list-group-action-color: #{$list-group-action-color};\n  --#{$prefix}list-group-action-hover-color: #{$list-group-action-hover-color};\n  --#{$prefix}list-group-action-hover-bg: #{$list-group-hover-bg};\n  --#{$prefix}list-group-action-active-color: #{$list-group-action-active-color};\n  --#{$prefix}list-group-action-active-bg: #{$list-group-action-active-bg};\n  --#{$prefix}list-group-disabled-color: #{$list-group-disabled-color};\n  --#{$prefix}list-group-disabled-bg: #{$list-group-disabled-bg};\n  --#{$prefix}list-group-active-color: #{$list-group-active-color};\n  --#{$prefix}list-group-active-bg: #{$list-group-active-bg};\n  --#{$prefix}list-group-active-border-color: #{$list-group-active-border-color};\n  // scss-docs-end list-group-css-vars\n\n  display: flex;\n  flex-direction: column;\n\n  // No need to set list-style: none; since .list-group-item is block level\n  padding-left: 0; // reset padding because ul and ol\n  margin-bottom: 0;\n  @include border-radius(var(--#{$prefix}list-group-border-radius));\n}\n\n.list-group-numbered {\n  list-style-type: none;\n  counter-reset: section;\n\n  > .list-group-item::before {\n    // Increments only this instance of the section counter\n    content: counters(section, \".\") \". \";\n    counter-increment: section;\n  }\n}\n\n// Individual list items\n//\n// Use on `li`s or `div`s within the `.list-group` parent.\n\n.list-group-item {\n  position: relative;\n  display: block;\n  padding: var(--#{$prefix}list-group-item-padding-y) var(--#{$prefix}list-group-item-padding-x);\n  color: var(--#{$prefix}list-group-color);\n  text-decoration: if($link-decoration == none, null, none);\n  background-color: var(--#{$prefix}list-group-bg);\n  border: var(--#{$prefix}list-group-border-width) solid var(--#{$prefix}list-group-border-color);\n\n  &:first-child {\n    @include border-top-radius(inherit);\n  }\n\n  &:last-child {\n    @include border-bottom-radius(inherit);\n  }\n\n  &.disabled,\n  &:disabled {\n    color: var(--#{$prefix}list-group-disabled-color);\n    pointer-events: none;\n    background-color: var(--#{$prefix}list-group-disabled-bg);\n  }\n\n  // Include both here for `<a>`s and `<button>`s\n  &.active {\n    z-index: 2; // Place active items above their siblings for proper border styling\n    color: var(--#{$prefix}list-group-active-color);\n    background-color: var(--#{$prefix}list-group-active-bg);\n    border-color: var(--#{$prefix}list-group-active-border-color);\n  }\n\n  // stylelint-disable-next-line scss/selector-no-redundant-nesting-selector\n  & + .list-group-item {\n    border-top-width: 0;\n\n    &.active {\n      margin-top: calc(-1 * var(--#{$prefix}list-group-border-width)); // stylelint-disable-line function-disallowed-list\n      border-top-width: var(--#{$prefix}list-group-border-width);\n    }\n  }\n}\n\n// Interactive list items\n//\n// Use anchor or button elements instead of `li`s or `div`s to create interactive\n// list items. Includes an extra `.active` modifier class for selected items.\n\n.list-group-item-action {\n  width: 100%; // For `<button>`s (anchors become 100% by default though)\n  color: var(--#{$prefix}list-group-action-color);\n  text-align: inherit; // For `<button>`s (anchors inherit)\n\n  &:not(.active) {\n    // Hover state\n    &:hover,\n    &:focus {\n      z-index: 1; // Place hover/focus items above their siblings for proper border styling\n      color: var(--#{$prefix}list-group-action-hover-color);\n      text-decoration: none;\n      background-color: var(--#{$prefix}list-group-action-hover-bg);\n    }\n\n    &:active {\n      color: var(--#{$prefix}list-group-action-active-color);\n      background-color: var(--#{$prefix}list-group-action-active-bg);\n    }\n  }\n}\n\n// Horizontal\n//\n// Change the layout of list group items from vertical (default) to horizontal.\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n  @include media-breakpoint-up($breakpoint) {\n    $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n    .list-group-horizontal#{$infix} {\n      flex-direction: row;\n\n      > .list-group-item {\n        &:first-child:not(:last-child) {\n          @include border-bottom-start-radius(var(--#{$prefix}list-group-border-radius));\n          @include border-top-end-radius(0);\n        }\n\n        &:last-child:not(:first-child) {\n          @include border-top-end-radius(var(--#{$prefix}list-group-border-radius));\n          @include border-bottom-start-radius(0);\n        }\n\n        &.active {\n          margin-top: 0;\n        }\n\n        + .list-group-item {\n          border-top-width: var(--#{$prefix}list-group-border-width);\n          border-left-width: 0;\n\n          &.active {\n            margin-left: calc(-1 * var(--#{$prefix}list-group-border-width)); // stylelint-disable-line function-disallowed-list\n            border-left-width: var(--#{$prefix}list-group-border-width);\n          }\n        }\n      }\n    }\n  }\n}\n\n\n// Flush list items\n//\n// Remove borders and border-radius to keep list group items edge-to-edge. Most\n// useful within other components (e.g., cards).\n\n.list-group-flush {\n  @include border-radius(0);\n\n  > .list-group-item {\n    border-width: 0 0 var(--#{$prefix}list-group-border-width);\n\n    &:last-child {\n      border-bottom-width: 0;\n    }\n  }\n}\n\n\n// scss-docs-start list-group-modifiers\n// List group contextual variants\n//\n// Add modifier classes to change text and background color on individual items.\n// Organizationally, this must come after the `:hover` states.\n\n@each $state in map-keys($theme-colors) {\n  .list-group-item-#{$state} {\n    --#{$prefix}list-group-color: var(--#{$prefix}#{$state}-text-emphasis);\n    --#{$prefix}list-group-bg: var(--#{$prefix}#{$state}-bg-subtle);\n    --#{$prefix}list-group-border-color: var(--#{$prefix}#{$state}-border-subtle);\n    --#{$prefix}list-group-action-hover-color: var(--#{$prefix}emphasis-color);\n    --#{$prefix}list-group-action-hover-bg: var(--#{$prefix}#{$state}-border-subtle);\n    --#{$prefix}list-group-action-active-color: var(--#{$prefix}emphasis-color);\n    --#{$prefix}list-group-action-active-bg: var(--#{$prefix}#{$state}-border-subtle);\n    --#{$prefix}list-group-active-color: var(--#{$prefix}#{$state}-bg-subtle);\n    --#{$prefix}list-group-active-bg: var(--#{$prefix}#{$state}-text-emphasis);\n    --#{$prefix}list-group-active-border-color: var(--#{$prefix}#{$state}-text-emphasis);\n  }\n}\n// scss-docs-end list-group-modifiers\n"
  },
  {
    "path": "scss/_maps.scss",
    "content": "// Re-assigned maps\n//\n// Placed here so that others can override the default Sass maps and see automatic updates to utilities and more.\n\n// scss-docs-start theme-colors-rgb\n$theme-colors-rgb: map-loop($theme-colors, to-rgb, \"$value\") !default;\n// scss-docs-end theme-colors-rgb\n\n// scss-docs-start theme-text-map\n$theme-colors-text: (\n  \"primary\": $primary-text-emphasis,\n  \"secondary\": $secondary-text-emphasis,\n  \"success\": $success-text-emphasis,\n  \"info\": $info-text-emphasis,\n  \"warning\": $warning-text-emphasis,\n  \"danger\": $danger-text-emphasis,\n  \"light\": $light-text-emphasis,\n  \"dark\": $dark-text-emphasis,\n) !default;\n// scss-docs-end theme-text-map\n\n// scss-docs-start theme-bg-subtle-map\n$theme-colors-bg-subtle: (\n  \"primary\": $primary-bg-subtle,\n  \"secondary\": $secondary-bg-subtle,\n  \"success\": $success-bg-subtle,\n  \"info\": $info-bg-subtle,\n  \"warning\": $warning-bg-subtle,\n  \"danger\": $danger-bg-subtle,\n  \"light\": $light-bg-subtle,\n  \"dark\": $dark-bg-subtle,\n) !default;\n// scss-docs-end theme-bg-subtle-map\n\n// scss-docs-start theme-border-subtle-map\n$theme-colors-border-subtle: (\n  \"primary\": $primary-border-subtle,\n  \"secondary\": $secondary-border-subtle,\n  \"success\": $success-border-subtle,\n  \"info\": $info-border-subtle,\n  \"warning\": $warning-border-subtle,\n  \"danger\": $danger-border-subtle,\n  \"light\": $light-border-subtle,\n  \"dark\": $dark-border-subtle,\n) !default;\n// scss-docs-end theme-border-subtle-map\n\n$theme-colors-text-dark: null !default;\n$theme-colors-bg-subtle-dark: null !default;\n$theme-colors-border-subtle-dark: null !default;\n\n@if $enable-dark-mode {\n  // scss-docs-start theme-text-dark-map\n  $theme-colors-text-dark: (\n    \"primary\": $primary-text-emphasis-dark,\n    \"secondary\": $secondary-text-emphasis-dark,\n    \"success\": $success-text-emphasis-dark,\n    \"info\": $info-text-emphasis-dark,\n    \"warning\": $warning-text-emphasis-dark,\n    \"danger\": $danger-text-emphasis-dark,\n    \"light\": $light-text-emphasis-dark,\n    \"dark\": $dark-text-emphasis-dark,\n  ) !default;\n  // scss-docs-end theme-text-dark-map\n\n  // scss-docs-start theme-bg-subtle-dark-map\n  $theme-colors-bg-subtle-dark: (\n    \"primary\": $primary-bg-subtle-dark,\n    \"secondary\": $secondary-bg-subtle-dark,\n    \"success\": $success-bg-subtle-dark,\n    \"info\": $info-bg-subtle-dark,\n    \"warning\": $warning-bg-subtle-dark,\n    \"danger\": $danger-bg-subtle-dark,\n    \"light\": $light-bg-subtle-dark,\n    \"dark\": $dark-bg-subtle-dark,\n  ) !default;\n  // scss-docs-end theme-bg-subtle-dark-map\n\n  // scss-docs-start theme-border-subtle-dark-map\n  $theme-colors-border-subtle-dark: (\n    \"primary\": $primary-border-subtle-dark,\n    \"secondary\": $secondary-border-subtle-dark,\n    \"success\": $success-border-subtle-dark,\n    \"info\": $info-border-subtle-dark,\n    \"warning\": $warning-border-subtle-dark,\n    \"danger\": $danger-border-subtle-dark,\n    \"light\": $light-border-subtle-dark,\n    \"dark\": $dark-border-subtle-dark,\n  ) !default;\n  // scss-docs-end theme-border-subtle-dark-map\n}\n\n// Utilities maps\n//\n// Extends the default `$theme-colors` maps to help create our utilities.\n\n// Come v6, we'll de-dupe these variables. Until then, for backward compatibility, we keep them to reassign.\n// scss-docs-start utilities-colors\n$utilities-colors: $theme-colors-rgb !default;\n// scss-docs-end utilities-colors\n\n// scss-docs-start utilities-text-colors\n$utilities-text: map-merge(\n  $utilities-colors,\n  (\n    \"black\": to-rgb($black),\n    \"white\": to-rgb($white),\n    \"body\": to-rgb($body-color)\n  )\n) !default;\n$utilities-text-colors: map-loop($utilities-text, rgba-css-var, \"$key\", \"text\") !default;\n\n$utilities-text-emphasis-colors: (\n  \"primary-emphasis\": var(--#{$prefix}primary-text-emphasis),\n  \"secondary-emphasis\": var(--#{$prefix}secondary-text-emphasis),\n  \"success-emphasis\": var(--#{$prefix}success-text-emphasis),\n  \"info-emphasis\": var(--#{$prefix}info-text-emphasis),\n  \"warning-emphasis\": var(--#{$prefix}warning-text-emphasis),\n  \"danger-emphasis\": var(--#{$prefix}danger-text-emphasis),\n  \"light-emphasis\": var(--#{$prefix}light-text-emphasis),\n  \"dark-emphasis\": var(--#{$prefix}dark-text-emphasis)\n) !default;\n// scss-docs-end utilities-text-colors\n\n// scss-docs-start utilities-bg-colors\n$utilities-bg: map-merge(\n  $utilities-colors,\n  (\n    \"black\": to-rgb($black),\n    \"white\": to-rgb($white),\n    \"body\": to-rgb($body-bg)\n  )\n) !default;\n$utilities-bg-colors: map-loop($utilities-bg, rgba-css-var, \"$key\", \"bg\") !default;\n\n$utilities-bg-subtle: (\n  \"primary-subtle\": var(--#{$prefix}primary-bg-subtle),\n  \"secondary-subtle\": var(--#{$prefix}secondary-bg-subtle),\n  \"success-subtle\": var(--#{$prefix}success-bg-subtle),\n  \"info-subtle\": var(--#{$prefix}info-bg-subtle),\n  \"warning-subtle\": var(--#{$prefix}warning-bg-subtle),\n  \"danger-subtle\": var(--#{$prefix}danger-bg-subtle),\n  \"light-subtle\": var(--#{$prefix}light-bg-subtle),\n  \"dark-subtle\": var(--#{$prefix}dark-bg-subtle)\n) !default;\n// scss-docs-end utilities-bg-colors\n\n// scss-docs-start utilities-border-colors\n$utilities-border: map-merge(\n  $utilities-colors,\n  (\n    \"black\": to-rgb($black),\n    \"white\": to-rgb($white)\n  )\n) !default;\n$utilities-border-colors: map-loop($utilities-border, rgba-css-var, \"$key\", \"border\") !default;\n\n$utilities-border-subtle: (\n  \"primary-subtle\": var(--#{$prefix}primary-border-subtle),\n  \"secondary-subtle\": var(--#{$prefix}secondary-border-subtle),\n  \"success-subtle\": var(--#{$prefix}success-border-subtle),\n  \"info-subtle\": var(--#{$prefix}info-border-subtle),\n  \"warning-subtle\": var(--#{$prefix}warning-border-subtle),\n  \"danger-subtle\": var(--#{$prefix}danger-border-subtle),\n  \"light-subtle\": var(--#{$prefix}light-border-subtle),\n  \"dark-subtle\": var(--#{$prefix}dark-border-subtle)\n) !default;\n// scss-docs-end utilities-border-colors\n\n$utilities-links-underline: map-loop($utilities-colors, rgba-css-var, \"$key\", \"link-underline\") !default;\n\n$negative-spacers: if($enable-negative-margins, negativify-map($spacers), null) !default;\n\n$gutters: $spacers !default;\n"
  },
  {
    "path": "scss/_mixins.scss",
    "content": "// Toggles\n//\n// Used in conjunction with global variables to enable certain theme features.\n\n// Vendor\n@import \"vendor/rfs\";\n\n// Deprecate\n@import \"mixins/deprecate\";\n\n// Helpers\n@import \"mixins/breakpoints\";\n@import \"mixins/color-mode\";\n@import \"mixins/color-scheme\";\n@import \"mixins/image\";\n@import \"mixins/resize\";\n@import \"mixins/visually-hidden\";\n@import \"mixins/reset-text\";\n@import \"mixins/text-truncate\";\n\n// Utilities\n@import \"mixins/utilities\";\n\n// Components\n@import \"mixins/backdrop\";\n@import \"mixins/buttons\";\n@import \"mixins/caret\";\n@import \"mixins/pagination\";\n@import \"mixins/lists\";\n@import \"mixins/forms\";\n@import \"mixins/table-variants\";\n\n// Skins\n@import \"mixins/border-radius\";\n@import \"mixins/box-shadow\";\n@import \"mixins/gradients\";\n@import \"mixins/transition\";\n\n// Layout\n@import \"mixins/clearfix\";\n@import \"mixins/container\";\n@import \"mixins/grid\";\n"
  },
  {
    "path": "scss/_modal.scss",
    "content": "// stylelint-disable function-disallowed-list\n\n// .modal-open      - body class for killing the scroll\n// .modal           - container to scroll within\n// .modal-dialog    - positioning shell for the actual modal\n// .modal-content   - actual modal w/ bg and corners and stuff\n\n\n// Container that the modal scrolls within\n.modal {\n  // scss-docs-start modal-css-vars\n  --#{$prefix}modal-zindex: #{$zindex-modal};\n  --#{$prefix}modal-width: #{$modal-md};\n  --#{$prefix}modal-padding: #{$modal-inner-padding};\n  --#{$prefix}modal-margin: #{$modal-dialog-margin};\n  --#{$prefix}modal-color: #{$modal-content-color};\n  --#{$prefix}modal-bg: #{$modal-content-bg};\n  --#{$prefix}modal-border-color: #{$modal-content-border-color};\n  --#{$prefix}modal-border-width: #{$modal-content-border-width};\n  --#{$prefix}modal-border-radius: #{$modal-content-border-radius};\n  --#{$prefix}modal-box-shadow: #{$modal-content-box-shadow-xs};\n  --#{$prefix}modal-inner-border-radius: #{$modal-content-inner-border-radius};\n  --#{$prefix}modal-header-padding-x: #{$modal-header-padding-x};\n  --#{$prefix}modal-header-padding-y: #{$modal-header-padding-y};\n  --#{$prefix}modal-header-padding: #{$modal-header-padding}; // Todo in v6: Split this padding into x and y\n  --#{$prefix}modal-header-border-color: #{$modal-header-border-color};\n  --#{$prefix}modal-header-border-width: #{$modal-header-border-width};\n  --#{$prefix}modal-title-line-height: #{$modal-title-line-height};\n  --#{$prefix}modal-footer-gap: #{$modal-footer-margin-between};\n  --#{$prefix}modal-footer-bg: #{$modal-footer-bg};\n  --#{$prefix}modal-footer-border-color: #{$modal-footer-border-color};\n  --#{$prefix}modal-footer-border-width: #{$modal-footer-border-width};\n  // scss-docs-end modal-css-vars\n\n  position: fixed;\n  top: 0;\n  left: 0;\n  z-index: var(--#{$prefix}modal-zindex);\n  display: none;\n  width: 100%;\n  height: 100%;\n  overflow-x: hidden;\n  overflow-y: auto;\n  // Prevent Chrome on Windows from adding a focus outline. For details, see\n  // https://github.com/twbs/bootstrap/pull/10951.\n  outline: 0;\n  // We deliberately don't use `-webkit-overflow-scrolling: touch;` due to a\n  // gnarly iOS Safari bug: https://bugs.webkit.org/show_bug.cgi?id=158342\n  // See also https://github.com/twbs/bootstrap/issues/17695\n}\n\n// Shell div to position the modal with bottom padding\n.modal-dialog {\n  position: relative;\n  width: auto;\n  margin: var(--#{$prefix}modal-margin);\n  // allow clicks to pass through for custom click handling to close modal\n  pointer-events: none;\n\n  // When fading in the modal, animate it to slide down\n  .modal.fade & {\n    transform: $modal-fade-transform;\n    @include transition($modal-transition);\n  }\n  .modal.show & {\n    transform: $modal-show-transform;\n  }\n\n  // When trying to close, animate focus to scale\n  .modal.modal-static & {\n    transform: $modal-scale-transform;\n  }\n}\n\n.modal-dialog-scrollable {\n  height: calc(100% - var(--#{$prefix}modal-margin) * 2);\n\n  .modal-content {\n    max-height: 100%;\n    overflow: hidden;\n  }\n\n  .modal-body {\n    overflow-y: auto;\n  }\n}\n\n.modal-dialog-centered {\n  display: flex;\n  align-items: center;\n  min-height: calc(100% - var(--#{$prefix}modal-margin) * 2);\n}\n\n// Actual modal\n.modal-content {\n  position: relative;\n  display: flex;\n  flex-direction: column;\n  width: 100%; // Ensure `.modal-content` extends the full width of the parent `.modal-dialog`\n  // counteract the pointer-events: none; in the .modal-dialog\n  color: var(--#{$prefix}modal-color);\n  pointer-events: auto;\n  background-color: var(--#{$prefix}modal-bg);\n  background-clip: padding-box;\n  border: var(--#{$prefix}modal-border-width) solid var(--#{$prefix}modal-border-color);\n  @include border-radius(var(--#{$prefix}modal-border-radius));\n  @include box-shadow(var(--#{$prefix}modal-box-shadow));\n  // Remove focus outline from opened modal\n  outline: 0;\n}\n\n// Modal background\n.modal-backdrop {\n  // scss-docs-start modal-backdrop-css-vars\n  --#{$prefix}backdrop-zindex: #{$zindex-modal-backdrop};\n  --#{$prefix}backdrop-bg: #{$modal-backdrop-bg};\n  --#{$prefix}backdrop-opacity: #{$modal-backdrop-opacity};\n  // scss-docs-end modal-backdrop-css-vars\n\n  @include overlay-backdrop(var(--#{$prefix}backdrop-zindex), var(--#{$prefix}backdrop-bg), var(--#{$prefix}backdrop-opacity));\n}\n\n// Modal header\n// Top section of the modal w/ title and dismiss\n.modal-header {\n  display: flex;\n  flex-shrink: 0;\n  align-items: center;\n  padding: var(--#{$prefix}modal-header-padding);\n  border-bottom: var(--#{$prefix}modal-header-border-width) solid var(--#{$prefix}modal-header-border-color);\n  @include border-top-radius(var(--#{$prefix}modal-inner-border-radius));\n\n  .btn-close {\n    padding: calc(var(--#{$prefix}modal-header-padding-y) * .5) calc(var(--#{$prefix}modal-header-padding-x) * .5);\n    // Split properties to avoid invalid calc() function if value is 0\n    margin-top: calc(-.5 * var(--#{$prefix}modal-header-padding-y));\n    margin-right: calc(-.5 * var(--#{$prefix}modal-header-padding-x));\n    margin-bottom: calc(-.5 * var(--#{$prefix}modal-header-padding-y));\n    margin-left: auto;\n  }\n}\n\n// Title text within header\n.modal-title {\n  margin-bottom: 0;\n  line-height: var(--#{$prefix}modal-title-line-height);\n}\n\n// Modal body\n// Where all modal content resides (sibling of .modal-header and .modal-footer)\n.modal-body {\n  position: relative;\n  // Enable `flex-grow: 1` so that the body take up as much space as possible\n  // when there should be a fixed height on `.modal-dialog`.\n  flex: 1 1 auto;\n  padding: var(--#{$prefix}modal-padding);\n}\n\n// Footer (for actions)\n.modal-footer {\n  display: flex;\n  flex-shrink: 0;\n  flex-wrap: wrap;\n  align-items: center; // vertically center\n  justify-content: flex-end; // Right align buttons with flex property because text-align doesn't work on flex items\n  padding: calc(var(--#{$prefix}modal-padding) - var(--#{$prefix}modal-footer-gap) * .5);\n  background-color: var(--#{$prefix}modal-footer-bg);\n  border-top: var(--#{$prefix}modal-footer-border-width) solid var(--#{$prefix}modal-footer-border-color);\n  @include border-bottom-radius(var(--#{$prefix}modal-inner-border-radius));\n\n  // Place margin between footer elements\n  // This solution is far from ideal because of the universal selector usage,\n  // but is needed to fix https://github.com/twbs/bootstrap/issues/24800\n  > * {\n    margin: calc(var(--#{$prefix}modal-footer-gap) * .5); // Todo in v6: replace with gap on parent class\n  }\n}\n\n// Scale up the modal\n@include media-breakpoint-up(sm) {\n  .modal {\n    --#{$prefix}modal-margin: #{$modal-dialog-margin-y-sm-up};\n    --#{$prefix}modal-box-shadow: #{$modal-content-box-shadow-sm-up};\n  }\n\n  // Automatically set modal's width for larger viewports\n  .modal-dialog {\n    max-width: var(--#{$prefix}modal-width);\n    margin-right: auto;\n    margin-left: auto;\n  }\n\n  .modal-sm {\n    --#{$prefix}modal-width: #{$modal-sm};\n  }\n}\n\n@include media-breakpoint-up(lg) {\n  .modal-lg,\n  .modal-xl {\n    --#{$prefix}modal-width: #{$modal-lg};\n  }\n}\n\n@include media-breakpoint-up(xl) {\n  .modal-xl {\n    --#{$prefix}modal-width: #{$modal-xl};\n  }\n}\n\n// scss-docs-start modal-fullscreen-loop\n@each $breakpoint in map-keys($grid-breakpoints) {\n  $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n  $postfix: if($infix != \"\", $infix + \"-down\", \"\");\n\n  @include media-breakpoint-down($breakpoint) {\n    .modal-fullscreen#{$postfix} {\n      width: 100vw;\n      max-width: none;\n      height: 100%;\n      margin: 0;\n\n      .modal-content {\n        height: 100%;\n        border: 0;\n        @include border-radius(0);\n      }\n\n      .modal-header,\n      .modal-footer {\n        @include border-radius(0);\n      }\n\n      .modal-body {\n        overflow-y: auto;\n      }\n    }\n  }\n}\n// scss-docs-end modal-fullscreen-loop\n"
  },
  {
    "path": "scss/_nav.scss",
    "content": "// Base class\n//\n// Kickstart any navigation component with a set of style resets. Works with\n// `<nav>`s, `<ul>`s or `<ol>`s.\n\n.nav {\n  // scss-docs-start nav-css-vars\n  --#{$prefix}nav-link-padding-x: #{$nav-link-padding-x};\n  --#{$prefix}nav-link-padding-y: #{$nav-link-padding-y};\n  @include rfs($nav-link-font-size, --#{$prefix}nav-link-font-size);\n  --#{$prefix}nav-link-font-weight: #{$nav-link-font-weight};\n  --#{$prefix}nav-link-color: #{$nav-link-color};\n  --#{$prefix}nav-link-hover-color: #{$nav-link-hover-color};\n  --#{$prefix}nav-link-disabled-color: #{$nav-link-disabled-color};\n  // scss-docs-end nav-css-vars\n\n  display: flex;\n  flex-wrap: wrap;\n  padding-left: 0;\n  margin-bottom: 0;\n  list-style: none;\n}\n\n.nav-link {\n  display: block;\n  padding: var(--#{$prefix}nav-link-padding-y) var(--#{$prefix}nav-link-padding-x);\n  @include font-size(var(--#{$prefix}nav-link-font-size));\n  font-weight: var(--#{$prefix}nav-link-font-weight);\n  color: var(--#{$prefix}nav-link-color);\n  text-decoration: if($link-decoration == none, null, none);\n  background: none;\n  border: 0;\n  @include transition($nav-link-transition);\n\n  &:hover,\n  &:focus {\n    color: var(--#{$prefix}nav-link-hover-color);\n    text-decoration: if($link-hover-decoration == underline, none, null);\n  }\n\n  &:focus-visible {\n    outline: 0;\n    box-shadow: $nav-link-focus-box-shadow;\n  }\n\n  // Disabled state lightens text\n  &.disabled,\n  &:disabled {\n    color: var(--#{$prefix}nav-link-disabled-color);\n    pointer-events: none;\n    cursor: default;\n  }\n}\n\n//\n// Tabs\n//\n\n.nav-tabs {\n  // scss-docs-start nav-tabs-css-vars\n  --#{$prefix}nav-tabs-border-width: #{$nav-tabs-border-width};\n  --#{$prefix}nav-tabs-border-color: #{$nav-tabs-border-color};\n  --#{$prefix}nav-tabs-border-radius: #{$nav-tabs-border-radius};\n  --#{$prefix}nav-tabs-link-hover-border-color: #{$nav-tabs-link-hover-border-color};\n  --#{$prefix}nav-tabs-link-active-color: #{$nav-tabs-link-active-color};\n  --#{$prefix}nav-tabs-link-active-bg: #{$nav-tabs-link-active-bg};\n  --#{$prefix}nav-tabs-link-active-border-color: #{$nav-tabs-link-active-border-color};\n  // scss-docs-end nav-tabs-css-vars\n\n  border-bottom: var(--#{$prefix}nav-tabs-border-width) solid var(--#{$prefix}nav-tabs-border-color);\n\n  .nav-link {\n    margin-bottom: calc(-1 * var(--#{$prefix}nav-tabs-border-width)); // stylelint-disable-line function-disallowed-list\n    border: var(--#{$prefix}nav-tabs-border-width) solid transparent;\n    @include border-top-radius(var(--#{$prefix}nav-tabs-border-radius));\n\n    &:hover,\n    &:focus {\n      // Prevents active .nav-link tab overlapping focus outline of previous/next .nav-link\n      isolation: isolate;\n      border-color: var(--#{$prefix}nav-tabs-link-hover-border-color);\n    }\n  }\n\n  .nav-link.active,\n  .nav-item.show .nav-link {\n    color: var(--#{$prefix}nav-tabs-link-active-color);\n    background-color: var(--#{$prefix}nav-tabs-link-active-bg);\n    border-color: var(--#{$prefix}nav-tabs-link-active-border-color);\n  }\n\n  .dropdown-menu {\n    // Make dropdown border overlap tab border\n    margin-top: calc(-1 * var(--#{$prefix}nav-tabs-border-width)); // stylelint-disable-line function-disallowed-list\n    // Remove the top rounded corners here since there is a hard edge above the menu\n    @include border-top-radius(0);\n  }\n}\n\n\n//\n// Pills\n//\n\n.nav-pills {\n  // scss-docs-start nav-pills-css-vars\n  --#{$prefix}nav-pills-border-radius: #{$nav-pills-border-radius};\n  --#{$prefix}nav-pills-link-active-color: #{$nav-pills-link-active-color};\n  --#{$prefix}nav-pills-link-active-bg: #{$nav-pills-link-active-bg};\n  // scss-docs-end nav-pills-css-vars\n\n  .nav-link {\n    @include border-radius(var(--#{$prefix}nav-pills-border-radius));\n  }\n\n  .nav-link.active,\n  .show > .nav-link {\n    color: var(--#{$prefix}nav-pills-link-active-color);\n    @include gradient-bg(var(--#{$prefix}nav-pills-link-active-bg));\n  }\n}\n\n\n//\n// Underline\n//\n\n.nav-underline {\n  // scss-docs-start nav-underline-css-vars\n  --#{$prefix}nav-underline-gap: #{$nav-underline-gap};\n  --#{$prefix}nav-underline-border-width: #{$nav-underline-border-width};\n  --#{$prefix}nav-underline-link-active-color: #{$nav-underline-link-active-color};\n  // scss-docs-end nav-underline-css-vars\n\n  gap: var(--#{$prefix}nav-underline-gap);\n\n  .nav-link {\n    padding-right: 0;\n    padding-left: 0;\n    border-bottom: var(--#{$prefix}nav-underline-border-width) solid transparent;\n\n    &:hover,\n    &:focus {\n      border-bottom-color: currentcolor;\n    }\n  }\n\n  .nav-link.active,\n  .show > .nav-link {\n    font-weight: $font-weight-bold;\n    color: var(--#{$prefix}nav-underline-link-active-color);\n    border-bottom-color: currentcolor;\n  }\n}\n\n\n//\n// Justified variants\n//\n\n.nav-fill {\n  > .nav-link,\n  .nav-item {\n    flex: 1 1 auto;\n    text-align: center;\n  }\n}\n\n.nav-justified {\n  > .nav-link,\n  .nav-item {\n    flex-grow: 1;\n    flex-basis: 0;\n    text-align: center;\n  }\n}\n\n.nav-fill,\n.nav-justified {\n  .nav-item .nav-link {\n    width: 100%; // Make sure button will grow\n  }\n}\n\n\n// Tabbable tabs\n//\n// Hide tabbable panes to start, show them when `.active`\n\n.tab-content {\n  > .tab-pane {\n    display: none;\n  }\n  > .active {\n    display: block;\n  }\n}\n"
  },
  {
    "path": "scss/_navbar.scss",
    "content": "// Navbar\n//\n// Provide a static navbar from which we expand to create full-width, fixed, and\n// other navbar variations.\n\n.navbar {\n  // scss-docs-start navbar-css-vars\n  --#{$prefix}navbar-padding-x: #{if($navbar-padding-x == null, 0, $navbar-padding-x)};\n  --#{$prefix}navbar-padding-y: #{$navbar-padding-y};\n  --#{$prefix}navbar-color: #{$navbar-light-color};\n  --#{$prefix}navbar-hover-color: #{$navbar-light-hover-color};\n  --#{$prefix}navbar-disabled-color: #{$navbar-light-disabled-color};\n  --#{$prefix}navbar-active-color: #{$navbar-light-active-color};\n  --#{$prefix}navbar-brand-padding-y: #{$navbar-brand-padding-y};\n  --#{$prefix}navbar-brand-margin-end: #{$navbar-brand-margin-end};\n  --#{$prefix}navbar-brand-font-size: #{$navbar-brand-font-size};\n  --#{$prefix}navbar-brand-color: #{$navbar-light-brand-color};\n  --#{$prefix}navbar-brand-hover-color: #{$navbar-light-brand-hover-color};\n  --#{$prefix}navbar-nav-link-padding-x: #{$navbar-nav-link-padding-x};\n  --#{$prefix}navbar-toggler-padding-y: #{$navbar-toggler-padding-y};\n  --#{$prefix}navbar-toggler-padding-x: #{$navbar-toggler-padding-x};\n  --#{$prefix}navbar-toggler-font-size: #{$navbar-toggler-font-size};\n  --#{$prefix}navbar-toggler-icon-bg: #{escape-svg($navbar-light-toggler-icon-bg)};\n  --#{$prefix}navbar-toggler-border-color: #{$navbar-light-toggler-border-color};\n  --#{$prefix}navbar-toggler-border-radius: #{$navbar-toggler-border-radius};\n  --#{$prefix}navbar-toggler-focus-width: #{$navbar-toggler-focus-width};\n  --#{$prefix}navbar-toggler-transition: #{$navbar-toggler-transition};\n  // scss-docs-end navbar-css-vars\n\n  position: relative;\n  display: flex;\n  flex-wrap: wrap; // allow us to do the line break for collapsing content\n  align-items: center;\n  justify-content: space-between; // space out brand from logo\n  padding: var(--#{$prefix}navbar-padding-y) var(--#{$prefix}navbar-padding-x);\n  @include gradient-bg();\n\n  // Because flex properties aren't inherited, we need to redeclare these first\n  // few properties so that content nested within behave properly.\n  // The `flex-wrap` property is inherited to simplify the expanded navbars\n  %container-flex-properties {\n    display: flex;\n    flex-wrap: inherit;\n    align-items: center;\n    justify-content: space-between;\n  }\n\n  > .container,\n  > .container-fluid {\n    @extend %container-flex-properties;\n  }\n\n  @each $breakpoint, $container-max-width in $container-max-widths {\n    > .container#{breakpoint-infix($breakpoint, $container-max-widths)} {\n      @extend %container-flex-properties;\n    }\n  }\n}\n\n\n// Navbar brand\n//\n// Used for brand, project, or site names.\n\n.navbar-brand {\n  padding-top: var(--#{$prefix}navbar-brand-padding-y);\n  padding-bottom: var(--#{$prefix}navbar-brand-padding-y);\n  margin-right: var(--#{$prefix}navbar-brand-margin-end);\n  @include font-size(var(--#{$prefix}navbar-brand-font-size));\n  color: var(--#{$prefix}navbar-brand-color);\n  text-decoration: if($link-decoration == none, null, none);\n  white-space: nowrap;\n\n  &:hover,\n  &:focus {\n    color: var(--#{$prefix}navbar-brand-hover-color);\n    text-decoration: if($link-hover-decoration == underline, none, null);\n  }\n}\n\n\n// Navbar nav\n//\n// Custom navbar navigation (doesn't require `.nav`, but does make use of `.nav-link`).\n\n.navbar-nav {\n  // scss-docs-start navbar-nav-css-vars\n  --#{$prefix}nav-link-padding-x: 0;\n  --#{$prefix}nav-link-padding-y: #{$nav-link-padding-y};\n  @include rfs($nav-link-font-size, --#{$prefix}nav-link-font-size);\n  --#{$prefix}nav-link-font-weight: #{$nav-link-font-weight};\n  --#{$prefix}nav-link-color: var(--#{$prefix}navbar-color);\n  --#{$prefix}nav-link-hover-color: var(--#{$prefix}navbar-hover-color);\n  --#{$prefix}nav-link-disabled-color: var(--#{$prefix}navbar-disabled-color);\n  // scss-docs-end navbar-nav-css-vars\n\n  display: flex;\n  flex-direction: column; // cannot use `inherit` to get the `.navbar`s value\n  padding-left: 0;\n  margin-bottom: 0;\n  list-style: none;\n\n  .nav-link {\n    &.active,\n    &.show {\n      color: var(--#{$prefix}navbar-active-color);\n    }\n  }\n\n  .dropdown-menu {\n    position: static;\n  }\n}\n\n\n// Navbar text\n//\n//\n\n.navbar-text {\n  padding-top: $nav-link-padding-y;\n  padding-bottom: $nav-link-padding-y;\n  color: var(--#{$prefix}navbar-color);\n\n  a,\n  a:hover,\n  a:focus  {\n    color: var(--#{$prefix}navbar-active-color);\n  }\n}\n\n\n// Responsive navbar\n//\n// Custom styles for responsive collapsing and toggling of navbar contents.\n// Powered by the collapse Bootstrap JavaScript plugin.\n\n// When collapsed, prevent the toggleable navbar contents from appearing in\n// the default flexbox row orientation. Requires the use of `flex-wrap: wrap`\n// on the `.navbar` parent.\n.navbar-collapse {\n  flex-grow: 1;\n  flex-basis: 100%;\n  // For always expanded or extra full navbars, ensure content aligns itself\n  // properly vertically. Can be easily overridden with flex utilities.\n  align-items: center;\n}\n\n// Button for toggling the navbar when in its collapsed state\n.navbar-toggler {\n  padding: var(--#{$prefix}navbar-toggler-padding-y) var(--#{$prefix}navbar-toggler-padding-x);\n  @include font-size(var(--#{$prefix}navbar-toggler-font-size));\n  line-height: 1;\n  color: var(--#{$prefix}navbar-color);\n  background-color: transparent; // remove default button style\n  border: var(--#{$prefix}border-width) solid var(--#{$prefix}navbar-toggler-border-color); // remove default button style\n  @include border-radius(var(--#{$prefix}navbar-toggler-border-radius));\n  @include transition(var(--#{$prefix}navbar-toggler-transition));\n\n  &:hover {\n    text-decoration: none;\n  }\n\n  &:focus {\n    text-decoration: none;\n    outline: 0;\n    box-shadow: 0 0 0 var(--#{$prefix}navbar-toggler-focus-width);\n  }\n}\n\n// Keep as a separate element so folks can easily override it with another icon\n// or image file as needed.\n.navbar-toggler-icon {\n  display: inline-block;\n  width: 1.5em;\n  height: 1.5em;\n  vertical-align: middle;\n  background-image: var(--#{$prefix}navbar-toggler-icon-bg);\n  background-repeat: no-repeat;\n  background-position: center;\n  background-size: 100%;\n}\n\n.navbar-nav-scroll {\n  max-height: var(--#{$prefix}scroll-height, 75vh);\n  overflow-y: auto;\n}\n\n// scss-docs-start navbar-expand-loop\n// Generate series of `.navbar-expand-*` responsive classes for configuring\n// where your navbar collapses.\n.navbar-expand {\n  @each $breakpoint in map-keys($grid-breakpoints) {\n    $next: breakpoint-next($breakpoint, $grid-breakpoints);\n    $infix: breakpoint-infix($next, $grid-breakpoints);\n\n    // stylelint-disable-next-line scss/selector-no-union-class-name\n    &#{$infix} {\n      @include media-breakpoint-up($next) {\n        flex-wrap: nowrap;\n        justify-content: flex-start;\n\n        .navbar-nav {\n          flex-direction: row;\n\n          .dropdown-menu {\n            position: absolute;\n          }\n\n          .nav-link {\n            padding-right: var(--#{$prefix}navbar-nav-link-padding-x);\n            padding-left: var(--#{$prefix}navbar-nav-link-padding-x);\n          }\n        }\n\n        .navbar-nav-scroll {\n          overflow: visible;\n        }\n\n        .navbar-collapse {\n          display: flex !important; // stylelint-disable-line declaration-no-important\n          flex-basis: auto;\n        }\n\n        .navbar-toggler {\n          display: none;\n        }\n\n        .offcanvas {\n          // stylelint-disable declaration-no-important\n          position: static;\n          z-index: auto;\n          flex-grow: 1;\n          width: auto !important;\n          height: auto !important;\n          visibility: visible !important;\n          background-color: transparent !important;\n          border: 0 !important;\n          transform: none !important;\n          @include box-shadow(none);\n          @include transition(none);\n          // stylelint-enable declaration-no-important\n\n          .offcanvas-header {\n            display: none;\n          }\n\n          .offcanvas-body {\n            display: flex;\n            flex-grow: 0;\n            padding: 0;\n            overflow-y: visible;\n          }\n        }\n      }\n    }\n  }\n}\n// scss-docs-end navbar-expand-loop\n\n// Navbar themes\n//\n// Styles for switching between navbars with light or dark background.\n\n.navbar-light {\n  @include deprecate(\"`.navbar-light`\", \"v5.2.0\", \"v6.0.0\", true);\n}\n\n.navbar-dark,\n.navbar[data-bs-theme=\"dark\"] {\n  // scss-docs-start navbar-dark-css-vars\n  --#{$prefix}navbar-color: #{$navbar-dark-color};\n  --#{$prefix}navbar-hover-color: #{$navbar-dark-hover-color};\n  --#{$prefix}navbar-disabled-color: #{$navbar-dark-disabled-color};\n  --#{$prefix}navbar-active-color: #{$navbar-dark-active-color};\n  --#{$prefix}navbar-brand-color: #{$navbar-dark-brand-color};\n  --#{$prefix}navbar-brand-hover-color: #{$navbar-dark-brand-hover-color};\n  --#{$prefix}navbar-toggler-border-color: #{$navbar-dark-toggler-border-color};\n  --#{$prefix}navbar-toggler-icon-bg: #{escape-svg($navbar-dark-toggler-icon-bg)};\n  // scss-docs-end navbar-dark-css-vars\n}\n\n@if $enable-dark-mode {\n  @include color-mode(dark) {\n    .navbar-toggler-icon {\n      --#{$prefix}navbar-toggler-icon-bg: #{escape-svg($navbar-dark-toggler-icon-bg)};\n    }\n  }\n}\n"
  },
  {
    "path": "scss/_offcanvas.scss",
    "content": "// stylelint-disable function-disallowed-list\n\n%offcanvas-css-vars {\n  // scss-docs-start offcanvas-css-vars\n  --#{$prefix}offcanvas-zindex: #{$zindex-offcanvas};\n  --#{$prefix}offcanvas-width: #{$offcanvas-horizontal-width};\n  --#{$prefix}offcanvas-height: #{$offcanvas-vertical-height};\n  --#{$prefix}offcanvas-padding-x: #{$offcanvas-padding-x};\n  --#{$prefix}offcanvas-padding-y: #{$offcanvas-padding-y};\n  --#{$prefix}offcanvas-color: #{$offcanvas-color};\n  --#{$prefix}offcanvas-bg: #{$offcanvas-bg-color};\n  --#{$prefix}offcanvas-border-width: #{$offcanvas-border-width};\n  --#{$prefix}offcanvas-border-color: #{$offcanvas-border-color};\n  --#{$prefix}offcanvas-box-shadow: #{$offcanvas-box-shadow};\n  --#{$prefix}offcanvas-transition: #{transform $offcanvas-transition-duration ease-in-out};\n  --#{$prefix}offcanvas-title-line-height: #{$offcanvas-title-line-height};\n  // scss-docs-end offcanvas-css-vars\n}\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n  $next: breakpoint-next($breakpoint, $grid-breakpoints);\n  $infix: breakpoint-infix($next, $grid-breakpoints);\n\n  .offcanvas#{$infix} {\n    @extend %offcanvas-css-vars;\n  }\n}\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n  $next: breakpoint-next($breakpoint, $grid-breakpoints);\n  $infix: breakpoint-infix($next, $grid-breakpoints);\n\n  .offcanvas#{$infix} {\n    @include media-breakpoint-down($next) {\n      position: fixed;\n      bottom: 0;\n      z-index: var(--#{$prefix}offcanvas-zindex);\n      display: flex;\n      flex-direction: column;\n      max-width: 100%;\n      color: var(--#{$prefix}offcanvas-color);\n      visibility: hidden;\n      background-color: var(--#{$prefix}offcanvas-bg);\n      background-clip: padding-box;\n      outline: 0;\n      @include box-shadow(var(--#{$prefix}offcanvas-box-shadow));\n      @include transition(var(--#{$prefix}offcanvas-transition));\n\n      &.offcanvas-start {\n        top: 0;\n        left: 0;\n        width: var(--#{$prefix}offcanvas-width);\n        border-right: var(--#{$prefix}offcanvas-border-width) solid var(--#{$prefix}offcanvas-border-color);\n        transform: translateX(-100%);\n      }\n\n      &.offcanvas-end {\n        top: 0;\n        right: 0;\n        width: var(--#{$prefix}offcanvas-width);\n        border-left: var(--#{$prefix}offcanvas-border-width) solid var(--#{$prefix}offcanvas-border-color);\n        transform: translateX(100%);\n      }\n\n      &.offcanvas-top {\n        top: 0;\n        right: 0;\n        left: 0;\n        height: var(--#{$prefix}offcanvas-height);\n        max-height: 100%;\n        border-bottom: var(--#{$prefix}offcanvas-border-width) solid var(--#{$prefix}offcanvas-border-color);\n        transform: translateY(-100%);\n      }\n\n      &.offcanvas-bottom {\n        right: 0;\n        left: 0;\n        height: var(--#{$prefix}offcanvas-height);\n        max-height: 100%;\n        border-top: var(--#{$prefix}offcanvas-border-width) solid var(--#{$prefix}offcanvas-border-color);\n        transform: translateY(100%);\n      }\n\n      &.showing,\n      &.show:not(.hiding) {\n        transform: none;\n      }\n\n      &.showing,\n      &.hiding,\n      &.show {\n        visibility: visible;\n      }\n    }\n\n    @if not ($infix == \"\") {\n      @include media-breakpoint-up($next) {\n        --#{$prefix}offcanvas-height: auto;\n        --#{$prefix}offcanvas-border-width: 0;\n        background-color: transparent !important; // stylelint-disable-line declaration-no-important\n\n        .offcanvas-header {\n          display: none;\n        }\n\n        .offcanvas-body {\n          display: flex;\n          flex-grow: 0;\n          padding: 0;\n          overflow-y: visible;\n          // Reset `background-color` in case `.bg-*` classes are used in offcanvas\n          background-color: transparent !important; // stylelint-disable-line declaration-no-important\n        }\n      }\n    }\n  }\n}\n\n.offcanvas-backdrop {\n  @include overlay-backdrop($zindex-offcanvas-backdrop, $offcanvas-backdrop-bg, $offcanvas-backdrop-opacity);\n}\n\n.offcanvas-header {\n  display: flex;\n  align-items: center;\n  padding: var(--#{$prefix}offcanvas-padding-y) var(--#{$prefix}offcanvas-padding-x);\n\n  .btn-close {\n    padding: calc(var(--#{$prefix}offcanvas-padding-y) * .5) calc(var(--#{$prefix}offcanvas-padding-x) * .5);\n    // Split properties to avoid invalid calc() function if value is 0\n    margin-top: calc(-.5 * var(--#{$prefix}offcanvas-padding-y));\n    margin-right: calc(-.5 * var(--#{$prefix}offcanvas-padding-x));\n    margin-bottom: calc(-.5 * var(--#{$prefix}offcanvas-padding-y));\n    margin-left: auto;\n  }\n}\n\n.offcanvas-title {\n  margin-bottom: 0;\n  line-height: var(--#{$prefix}offcanvas-title-line-height);\n}\n\n.offcanvas-body {\n  flex-grow: 1;\n  padding: var(--#{$prefix}offcanvas-padding-y) var(--#{$prefix}offcanvas-padding-x);\n  overflow-y: auto;\n}\n"
  },
  {
    "path": "scss/_pagination.scss",
    "content": ".pagination {\n  // scss-docs-start pagination-css-vars\n  --#{$prefix}pagination-padding-x: #{$pagination-padding-x};\n  --#{$prefix}pagination-padding-y: #{$pagination-padding-y};\n  @include rfs($pagination-font-size, --#{$prefix}pagination-font-size);\n  --#{$prefix}pagination-color: #{$pagination-color};\n  --#{$prefix}pagination-bg: #{$pagination-bg};\n  --#{$prefix}pagination-border-width: #{$pagination-border-width};\n  --#{$prefix}pagination-border-color: #{$pagination-border-color};\n  --#{$prefix}pagination-border-radius: #{$pagination-border-radius};\n  --#{$prefix}pagination-hover-color: #{$pagination-hover-color};\n  --#{$prefix}pagination-hover-bg: #{$pagination-hover-bg};\n  --#{$prefix}pagination-hover-border-color: #{$pagination-hover-border-color};\n  --#{$prefix}pagination-focus-color: #{$pagination-focus-color};\n  --#{$prefix}pagination-focus-bg: #{$pagination-focus-bg};\n  --#{$prefix}pagination-focus-box-shadow: #{$pagination-focus-box-shadow};\n  --#{$prefix}pagination-active-color: #{$pagination-active-color};\n  --#{$prefix}pagination-active-bg: #{$pagination-active-bg};\n  --#{$prefix}pagination-active-border-color: #{$pagination-active-border-color};\n  --#{$prefix}pagination-disabled-color: #{$pagination-disabled-color};\n  --#{$prefix}pagination-disabled-bg: #{$pagination-disabled-bg};\n  --#{$prefix}pagination-disabled-border-color: #{$pagination-disabled-border-color};\n  // scss-docs-end pagination-css-vars\n\n  display: flex;\n  @include list-unstyled();\n}\n\n.page-link {\n  position: relative;\n  display: block;\n  padding: var(--#{$prefix}pagination-padding-y) var(--#{$prefix}pagination-padding-x);\n  @include font-size(var(--#{$prefix}pagination-font-size));\n  color: var(--#{$prefix}pagination-color);\n  text-decoration: if($link-decoration == none, null, none);\n  background-color: var(--#{$prefix}pagination-bg);\n  border: var(--#{$prefix}pagination-border-width) solid var(--#{$prefix}pagination-border-color);\n  @include transition($pagination-transition);\n\n  &:hover {\n    z-index: 2;\n    color: var(--#{$prefix}pagination-hover-color);\n    text-decoration: if($link-hover-decoration == underline, none, null);\n    background-color: var(--#{$prefix}pagination-hover-bg);\n    border-color: var(--#{$prefix}pagination-hover-border-color);\n  }\n\n  &:focus {\n    z-index: 3;\n    color: var(--#{$prefix}pagination-focus-color);\n    background-color: var(--#{$prefix}pagination-focus-bg);\n    outline: $pagination-focus-outline;\n    box-shadow: var(--#{$prefix}pagination-focus-box-shadow);\n  }\n\n  &.active,\n  .active > & {\n    z-index: 3;\n    color: var(--#{$prefix}pagination-active-color);\n    @include gradient-bg(var(--#{$prefix}pagination-active-bg));\n    border-color: var(--#{$prefix}pagination-active-border-color);\n  }\n\n  &.disabled,\n  .disabled > & {\n    color: var(--#{$prefix}pagination-disabled-color);\n    pointer-events: none;\n    background-color: var(--#{$prefix}pagination-disabled-bg);\n    border-color: var(--#{$prefix}pagination-disabled-border-color);\n  }\n}\n\n.page-item {\n  &:not(:first-child) .page-link {\n    margin-left: $pagination-margin-start;\n  }\n\n  @if $pagination-margin-start == calc(-1 * #{$pagination-border-width}) {\n    &:first-child {\n      .page-link {\n        @include border-start-radius(var(--#{$prefix}pagination-border-radius));\n      }\n    }\n\n    &:last-child {\n      .page-link {\n        @include border-end-radius(var(--#{$prefix}pagination-border-radius));\n      }\n    }\n  } @else {\n    // Add border-radius to all pageLinks in case they have left margin\n    .page-link {\n      @include border-radius(var(--#{$prefix}pagination-border-radius));\n    }\n  }\n}\n\n\n//\n// Sizing\n//\n\n.pagination-lg {\n  @include pagination-size($pagination-padding-y-lg, $pagination-padding-x-lg, $font-size-lg, $pagination-border-radius-lg);\n}\n\n.pagination-sm {\n  @include pagination-size($pagination-padding-y-sm, $pagination-padding-x-sm, $font-size-sm, $pagination-border-radius-sm);\n}\n"
  },
  {
    "path": "scss/_placeholders.scss",
    "content": ".placeholder {\n  display: inline-block;\n  min-height: 1em;\n  vertical-align: middle;\n  cursor: wait;\n  background-color: currentcolor;\n  opacity: $placeholder-opacity-max;\n\n  &.btn::before {\n    display: inline-block;\n    content: \"\";\n  }\n}\n\n// Sizing\n.placeholder-xs {\n  min-height: .6em;\n}\n\n.placeholder-sm {\n  min-height: .8em;\n}\n\n.placeholder-lg {\n  min-height: 1.2em;\n}\n\n// Animation\n.placeholder-glow {\n  .placeholder {\n    animation: placeholder-glow 2s ease-in-out infinite;\n  }\n}\n\n@keyframes placeholder-glow {\n  50% {\n    opacity: $placeholder-opacity-min;\n  }\n}\n\n.placeholder-wave {\n  mask-image: linear-gradient(130deg, $black 55%, rgba(0, 0, 0, (1 - $placeholder-opacity-min)) 75%, $black 95%);\n  mask-size: 200% 100%;\n  animation: placeholder-wave 2s linear infinite;\n}\n\n@keyframes placeholder-wave {\n  100% {\n    mask-position: -200% 0%;\n  }\n}\n"
  },
  {
    "path": "scss/_popover.scss",
    "content": ".popover {\n  // scss-docs-start popover-css-vars\n  --#{$prefix}popover-zindex: #{$zindex-popover};\n  --#{$prefix}popover-max-width: #{$popover-max-width};\n  @include rfs($popover-font-size, --#{$prefix}popover-font-size);\n  --#{$prefix}popover-bg: #{$popover-bg};\n  --#{$prefix}popover-border-width: #{$popover-border-width};\n  --#{$prefix}popover-border-color: #{$popover-border-color};\n  --#{$prefix}popover-border-radius: #{$popover-border-radius};\n  --#{$prefix}popover-inner-border-radius: #{$popover-inner-border-radius};\n  --#{$prefix}popover-box-shadow: #{$popover-box-shadow};\n  --#{$prefix}popover-header-padding-x: #{$popover-header-padding-x};\n  --#{$prefix}popover-header-padding-y: #{$popover-header-padding-y};\n  @include rfs($popover-header-font-size, --#{$prefix}popover-header-font-size);\n  --#{$prefix}popover-header-color: #{$popover-header-color};\n  --#{$prefix}popover-header-bg: #{$popover-header-bg};\n  --#{$prefix}popover-body-padding-x: #{$popover-body-padding-x};\n  --#{$prefix}popover-body-padding-y: #{$popover-body-padding-y};\n  --#{$prefix}popover-body-color: #{$popover-body-color};\n  --#{$prefix}popover-arrow-width: #{$popover-arrow-width};\n  --#{$prefix}popover-arrow-height: #{$popover-arrow-height};\n  --#{$prefix}popover-arrow-border: var(--#{$prefix}popover-border-color);\n  // scss-docs-end popover-css-vars\n\n  z-index: var(--#{$prefix}popover-zindex);\n  display: block;\n  max-width: var(--#{$prefix}popover-max-width);\n  // Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.\n  // So reset our font and text properties to avoid inheriting weird values.\n  @include reset-text();\n  @include font-size(var(--#{$prefix}popover-font-size));\n  // Allow breaking very long words so they don't overflow the popover's bounds\n  word-wrap: break-word;\n  background-color: var(--#{$prefix}popover-bg);\n  background-clip: padding-box;\n  border: var(--#{$prefix}popover-border-width) solid var(--#{$prefix}popover-border-color);\n  @include border-radius(var(--#{$prefix}popover-border-radius));\n  @include box-shadow(var(--#{$prefix}popover-box-shadow));\n\n  .popover-arrow {\n    display: block;\n    width: var(--#{$prefix}popover-arrow-width);\n    height: var(--#{$prefix}popover-arrow-height);\n\n    &::before,\n    &::after {\n      position: absolute;\n      display: block;\n      content: \"\";\n      border-color: transparent;\n      border-style: solid;\n      border-width: 0;\n    }\n  }\n}\n\n.bs-popover-top {\n  > .popover-arrow {\n    bottom: calc(-1 * (var(--#{$prefix}popover-arrow-height)) - var(--#{$prefix}popover-border-width)); // stylelint-disable-line function-disallowed-list\n\n    &::before,\n    &::after {\n      border-width: var(--#{$prefix}popover-arrow-height) calc(var(--#{$prefix}popover-arrow-width) * .5) 0; // stylelint-disable-line function-disallowed-list\n    }\n\n    &::before {\n      bottom: 0;\n      border-top-color: var(--#{$prefix}popover-arrow-border);\n    }\n\n    &::after {\n      bottom: var(--#{$prefix}popover-border-width);\n      border-top-color: var(--#{$prefix}popover-bg);\n    }\n  }\n}\n\n/* rtl:begin:ignore */\n.bs-popover-end {\n  > .popover-arrow {\n    left: calc(-1 * (var(--#{$prefix}popover-arrow-height)) - var(--#{$prefix}popover-border-width)); // stylelint-disable-line function-disallowed-list\n    width: var(--#{$prefix}popover-arrow-height);\n    height: var(--#{$prefix}popover-arrow-width);\n\n    &::before,\n    &::after {\n      border-width: calc(var(--#{$prefix}popover-arrow-width) * .5) var(--#{$prefix}popover-arrow-height) calc(var(--#{$prefix}popover-arrow-width) * .5) 0; // stylelint-disable-line function-disallowed-list\n    }\n\n    &::before {\n      left: 0;\n      border-right-color: var(--#{$prefix}popover-arrow-border);\n    }\n\n    &::after {\n      left: var(--#{$prefix}popover-border-width);\n      border-right-color: var(--#{$prefix}popover-bg);\n    }\n  }\n}\n\n/* rtl:end:ignore */\n\n.bs-popover-bottom {\n  > .popover-arrow {\n    top: calc(-1 * (var(--#{$prefix}popover-arrow-height)) - var(--#{$prefix}popover-border-width)); // stylelint-disable-line function-disallowed-list\n\n    &::before,\n    &::after {\n      border-width: 0 calc(var(--#{$prefix}popover-arrow-width) * .5) var(--#{$prefix}popover-arrow-height); // stylelint-disable-line function-disallowed-list\n    }\n\n    &::before {\n      top: 0;\n      border-bottom-color: var(--#{$prefix}popover-arrow-border);\n    }\n\n    &::after {\n      top: var(--#{$prefix}popover-border-width);\n      border-bottom-color: var(--#{$prefix}popover-bg);\n    }\n  }\n\n  // This will remove the popover-header's border just below the arrow\n  .popover-header::before {\n    position: absolute;\n    top: 0;\n    left: 50%;\n    display: block;\n    width: var(--#{$prefix}popover-arrow-width);\n    margin-left: calc(-.5 * var(--#{$prefix}popover-arrow-width)); // stylelint-disable-line function-disallowed-list\n    content: \"\";\n    border-bottom: var(--#{$prefix}popover-border-width) solid var(--#{$prefix}popover-header-bg);\n  }\n}\n\n/* rtl:begin:ignore */\n.bs-popover-start {\n  > .popover-arrow {\n    right: calc(-1 * (var(--#{$prefix}popover-arrow-height)) - var(--#{$prefix}popover-border-width)); // stylelint-disable-line function-disallowed-list\n    width: var(--#{$prefix}popover-arrow-height);\n    height: var(--#{$prefix}popover-arrow-width);\n\n    &::before,\n    &::after {\n      border-width: calc(var(--#{$prefix}popover-arrow-width) * .5) 0 calc(var(--#{$prefix}popover-arrow-width) * .5) var(--#{$prefix}popover-arrow-height); // stylelint-disable-line function-disallowed-list\n    }\n\n    &::before {\n      right: 0;\n      border-left-color: var(--#{$prefix}popover-arrow-border);\n    }\n\n    &::after {\n      right: var(--#{$prefix}popover-border-width);\n      border-left-color: var(--#{$prefix}popover-bg);\n    }\n  }\n}\n\n/* rtl:end:ignore */\n\n.bs-popover-auto {\n  &[data-popper-placement^=\"top\"] {\n    @extend .bs-popover-top;\n  }\n  &[data-popper-placement^=\"right\"] {\n    @extend .bs-popover-end;\n  }\n  &[data-popper-placement^=\"bottom\"] {\n    @extend .bs-popover-bottom;\n  }\n  &[data-popper-placement^=\"left\"] {\n    @extend .bs-popover-start;\n  }\n}\n\n// Offset the popover to account for the popover arrow\n.popover-header {\n  padding: var(--#{$prefix}popover-header-padding-y) var(--#{$prefix}popover-header-padding-x);\n  margin-bottom: 0; // Reset the default from Reboot\n  @include font-size(var(--#{$prefix}popover-header-font-size));\n  color: var(--#{$prefix}popover-header-color);\n  background-color: var(--#{$prefix}popover-header-bg);\n  border-bottom: var(--#{$prefix}popover-border-width) solid var(--#{$prefix}popover-border-color);\n  @include border-top-radius(var(--#{$prefix}popover-inner-border-radius));\n\n  &:empty {\n    display: none;\n  }\n}\n\n.popover-body {\n  padding: var(--#{$prefix}popover-body-padding-y) var(--#{$prefix}popover-body-padding-x);\n  color: var(--#{$prefix}popover-body-color);\n}\n"
  },
  {
    "path": "scss/_progress.scss",
    "content": "// Disable animation if transitions are disabled\n\n// scss-docs-start progress-keyframes\n@if $enable-transitions {\n  @keyframes progress-bar-stripes {\n    0% { background-position-x: var(--#{$prefix}progress-height); }\n  }\n}\n// scss-docs-end progress-keyframes\n\n.progress,\n.progress-stacked {\n  // scss-docs-start progress-css-vars\n  --#{$prefix}progress-height: #{$progress-height};\n  @include rfs($progress-font-size, --#{$prefix}progress-font-size);\n  --#{$prefix}progress-bg: #{$progress-bg};\n  --#{$prefix}progress-border-radius: #{$progress-border-radius};\n  --#{$prefix}progress-box-shadow: #{$progress-box-shadow};\n  --#{$prefix}progress-bar-color: #{$progress-bar-color};\n  --#{$prefix}progress-bar-bg: #{$progress-bar-bg};\n  --#{$prefix}progress-bar-transition: #{$progress-bar-transition};\n  // scss-docs-end progress-css-vars\n\n  display: flex;\n  height: var(--#{$prefix}progress-height);\n  overflow: hidden; // force rounded corners by cropping it\n  @include font-size(var(--#{$prefix}progress-font-size));\n  background-color: var(--#{$prefix}progress-bg);\n  @include border-radius(var(--#{$prefix}progress-border-radius));\n  @include box-shadow(var(--#{$prefix}progress-box-shadow));\n}\n\n.progress-bar {\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n  overflow: hidden;\n  color: var(--#{$prefix}progress-bar-color);\n  text-align: center;\n  white-space: nowrap;\n  background-color: var(--#{$prefix}progress-bar-bg);\n  @include transition(var(--#{$prefix}progress-bar-transition));\n}\n\n.progress-bar-striped {\n  @include gradient-striped();\n  background-size: var(--#{$prefix}progress-height) var(--#{$prefix}progress-height);\n}\n\n.progress-stacked > .progress {\n  overflow: visible;\n}\n\n.progress-stacked > .progress > .progress-bar {\n  width: 100%;\n}\n\n@if $enable-transitions {\n  .progress-bar-animated {\n    animation: $progress-bar-animation-timing progress-bar-stripes;\n\n    @if $enable-reduced-motion {\n      @media (prefers-reduced-motion: reduce) {\n        animation: none;\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "scss/_reboot.scss",
    "content": "// stylelint-disable declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix\n\n\n// Reboot\n//\n// Normalization of HTML elements, manually forked from Normalize.css to remove\n// styles targeting irrelevant browsers while applying new styles.\n//\n// Normalize is licensed MIT. https://github.com/necolas/normalize.css\n\n\n// Document\n//\n// Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.\n\n*,\n*::before,\n*::after {\n  box-sizing: border-box;\n}\n\n\n// Root\n//\n// Ability to the value of the root font sizes, affecting the value of `rem`.\n// null by default, thus nothing is generated.\n\n:root {\n  @if $font-size-root != null {\n    @include font-size(var(--#{$prefix}root-font-size));\n  }\n\n  @if $enable-smooth-scroll {\n    @media (prefers-reduced-motion: no-preference) {\n      scroll-behavior: smooth;\n    }\n  }\n}\n\n\n// Body\n//\n// 1. Remove the margin in all browsers.\n// 2. As a best practice, apply a default `background-color`.\n// 3. Prevent adjustments of font size after orientation changes in iOS.\n// 4. Change the default tap highlight to be completely transparent in iOS.\n\n// scss-docs-start reboot-body-rules\nbody {\n  margin: 0; // 1\n  font-family: var(--#{$prefix}body-font-family);\n  @include font-size(var(--#{$prefix}body-font-size));\n  font-weight: var(--#{$prefix}body-font-weight);\n  line-height: var(--#{$prefix}body-line-height);\n  color: var(--#{$prefix}body-color);\n  text-align: var(--#{$prefix}body-text-align);\n  background-color: var(--#{$prefix}body-bg); // 2\n  -webkit-text-size-adjust: 100%; // 3\n  -webkit-tap-highlight-color: rgba($black, 0); // 4\n}\n// scss-docs-end reboot-body-rules\n\n\n// Content grouping\n//\n// 1. Reset Firefox's gray color\n\nhr {\n  margin: $hr-margin-y 0;\n  color: $hr-color; // 1\n  border: 0;\n  border-top: $hr-border-width solid $hr-border-color;\n  opacity: $hr-opacity;\n}\n\n\n// Typography\n//\n// 1. Remove top margins from headings\n//    By default, `<h1>`-`<h6>` all receive top and bottom margins. We nuke the top\n//    margin for easier control within type scales as it avoids margin collapsing.\n\n%heading {\n  margin-top: 0; // 1\n  margin-bottom: $headings-margin-bottom;\n  font-family: $headings-font-family;\n  font-style: $headings-font-style;\n  font-weight: $headings-font-weight;\n  line-height: $headings-line-height;\n  color: var(--#{$prefix}heading-color);\n}\n\nh1 {\n  @extend %heading;\n  @include font-size($h1-font-size);\n}\n\nh2 {\n  @extend %heading;\n  @include font-size($h2-font-size);\n}\n\nh3 {\n  @extend %heading;\n  @include font-size($h3-font-size);\n}\n\nh4 {\n  @extend %heading;\n  @include font-size($h4-font-size);\n}\n\nh5 {\n  @extend %heading;\n  @include font-size($h5-font-size);\n}\n\nh6 {\n  @extend %heading;\n  @include font-size($h6-font-size);\n}\n\n\n// Reset margins on paragraphs\n//\n// Similarly, the top margin on `<p>`s get reset. However, we also reset the\n// bottom margin to use `rem` units instead of `em`.\n\np {\n  margin-top: 0;\n  margin-bottom: $paragraph-margin-bottom;\n}\n\n\n// Abbreviations\n//\n// 1. Add the correct text decoration in Chrome, Edge, Opera, and Safari.\n// 2. Add explicit cursor to indicate changed behavior.\n// 3. Prevent the text-decoration to be skipped.\n\nabbr[title] {\n  text-decoration: underline dotted; // 1\n  cursor: help; // 2\n  text-decoration-skip-ink: none; // 3\n}\n\n\n// Address\n\naddress {\n  margin-bottom: 1rem;\n  font-style: normal;\n  line-height: inherit;\n}\n\n\n// Lists\n\nol,\nul {\n  padding-left: 2rem;\n}\n\nol,\nul,\ndl {\n  margin-top: 0;\n  margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n  margin-bottom: 0;\n}\n\ndt {\n  font-weight: $dt-font-weight;\n}\n\n// 1. Undo browser default\n\ndd {\n  margin-bottom: .5rem;\n  margin-left: 0; // 1\n}\n\n\n// Blockquote\n\nblockquote {\n  margin: 0 0 1rem;\n}\n\n\n// Strong\n//\n// Add the correct font weight in Chrome, Edge, and Safari\n\nb,\nstrong {\n  font-weight: $font-weight-bolder;\n}\n\n\n// Small\n//\n// Add the correct font size in all browsers\n\nsmall {\n  @include font-size($small-font-size);\n}\n\n\n// Mark\n\nmark {\n  padding: $mark-padding;\n  color: var(--#{$prefix}highlight-color);\n  background-color: var(--#{$prefix}highlight-bg);\n}\n\n\n// Sub and Sup\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n\nsub,\nsup {\n  position: relative;\n  @include font-size($sub-sup-font-size);\n  line-height: 0;\n  vertical-align: baseline;\n}\n\nsub { bottom: -.25em; }\nsup { top: -.5em; }\n\n\n// Links\n\na {\n  color: rgba(var(--#{$prefix}link-color-rgb), var(--#{$prefix}link-opacity, 1));\n  text-decoration: $link-decoration;\n\n  &:hover {\n    --#{$prefix}link-color-rgb: var(--#{$prefix}link-hover-color-rgb);\n    text-decoration: $link-hover-decoration;\n  }\n}\n\n// And undo these styles for placeholder links/named anchors (without href).\n// It would be more straightforward to just use a[href] in previous block, but that\n// causes specificity issues in many other styles that are too complex to fix.\n// See https://github.com/twbs/bootstrap/issues/19402\n\na:not([href]):not([class]) {\n  &,\n  &:hover {\n    color: inherit;\n    text-decoration: none;\n  }\n}\n\n\n// Code\n\npre,\ncode,\nkbd,\nsamp {\n  font-family: $font-family-code;\n  @include font-size(1em); // Correct the odd `em` font sizing in all browsers.\n}\n\n// 1. Remove browser default top margin\n// 2. Reset browser default of `1em` to use `rem`s\n// 3. Don't allow content to break outside\n\npre {\n  display: block;\n  margin-top: 0; // 1\n  margin-bottom: 1rem; // 2\n  overflow: auto; // 3\n  @include font-size($code-font-size);\n  color: $pre-color;\n\n  // Account for some code outputs that place code tags in pre tags\n  code {\n    @include font-size(inherit);\n    color: inherit;\n    word-break: normal;\n  }\n}\n\ncode {\n  @include font-size($code-font-size);\n  color: var(--#{$prefix}code-color);\n  word-wrap: break-word;\n\n  // Streamline the style when inside anchors to avoid broken underline and more\n  a > & {\n    color: inherit;\n  }\n}\n\nkbd {\n  padding: $kbd-padding-y $kbd-padding-x;\n  @include font-size($kbd-font-size);\n  color: $kbd-color;\n  background-color: $kbd-bg;\n  @include border-radius($border-radius-sm);\n\n  kbd {\n    padding: 0;\n    @include font-size(1em);\n    font-weight: $nested-kbd-font-weight;\n  }\n}\n\n\n// Figures\n//\n// Apply a consistent margin strategy (matches our type styles).\n\nfigure {\n  margin: 0 0 1rem;\n}\n\n\n// Images and content\n\nimg,\nsvg {\n  vertical-align: middle;\n}\n\n\n// Tables\n//\n// Prevent double borders\n\ntable {\n  caption-side: bottom;\n  border-collapse: collapse;\n}\n\ncaption {\n  padding-top: $table-cell-padding-y;\n  padding-bottom: $table-cell-padding-y;\n  color: $table-caption-color;\n  text-align: left;\n}\n\n// 1. Removes font-weight bold by inheriting\n// 2. Matches default `<td>` alignment by inheriting `text-align`.\n// 3. Fix alignment for Safari\n\nth {\n  font-weight: $table-th-font-weight; // 1\n  text-align: inherit; // 2\n  text-align: -webkit-match-parent; // 3\n}\n\nthead,\ntbody,\ntfoot,\ntr,\ntd,\nth {\n  border-color: inherit;\n  border-style: solid;\n  border-width: 0;\n}\n\n\n// Forms\n//\n// 1. Allow labels to use `margin` for spacing.\n\nlabel {\n  display: inline-block; // 1\n}\n\n// Remove the default `border-radius` that macOS Chrome adds.\n// See https://github.com/twbs/bootstrap/issues/24093\n\nbutton {\n  // stylelint-disable-next-line property-disallowed-list\n  border-radius: 0;\n}\n\n// Explicitly remove focus outline in Chromium when it shouldn't be\n// visible (e.g. as result of mouse click or touch tap). It already\n// should be doing this automatically, but seems to currently be\n// confused and applies its very visible two-tone outline anyway.\n\nbutton:focus:not(:focus-visible) {\n  outline: 0;\n}\n\n// 1. Remove the margin in Firefox and Safari\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n  margin: 0; // 1\n  font-family: inherit;\n  @include font-size(inherit);\n  line-height: inherit;\n}\n\n// Remove the inheritance of text transform in Firefox\nbutton,\nselect {\n  text-transform: none;\n}\n// Set the cursor for non-`<button>` buttons\n//\n// Details at https://github.com/twbs/bootstrap/pull/30562\n[role=\"button\"] {\n  cursor: pointer;\n}\n\nselect {\n  // Remove the inheritance of word-wrap in Safari.\n  // See https://github.com/twbs/bootstrap/issues/24990\n  word-wrap: normal;\n\n  // Undo the opacity change from Chrome\n  &:disabled {\n    opacity: 1;\n  }\n}\n\n// Remove the dropdown arrow only from text type inputs built with datalists in Chrome.\n// See https://stackoverflow.com/a/54997118\n\n[list]:not([type=\"date\"]):not([type=\"datetime-local\"]):not([type=\"month\"]):not([type=\"week\"]):not([type=\"time\"])::-webkit-calendar-picker-indicator {\n  display: none !important;\n}\n\n// 1. Prevent a WebKit bug where (2) destroys native `audio` and `video`\n//    controls in Android 4.\n// 2. Correct the inability to style clickable types in iOS and Safari.\n// 3. Opinionated: add \"hand\" cursor to non-disabled button elements.\n\nbutton,\n[type=\"button\"], // 1\n[type=\"reset\"],\n[type=\"submit\"] {\n  -webkit-appearance: button; // 2\n\n  @if $enable-button-pointers {\n    &:not(:disabled) {\n      cursor: pointer; // 3\n    }\n  }\n}\n\n// Remove inner border and padding from Firefox, but don't restore the outline like Normalize.\n\n::-moz-focus-inner {\n  padding: 0;\n  border-style: none;\n}\n\n// 1. Textareas should really only resize vertically so they don't break their (horizontal) containers.\n\ntextarea {\n  resize: vertical; // 1\n}\n\n// 1. Browsers set a default `min-width: min-content;` on fieldsets,\n//    unlike e.g. `<div>`s, which have `min-width: 0;` by default.\n//    So we reset that to ensure fieldsets behave more like a standard block element.\n//    See https://github.com/twbs/bootstrap/issues/12359\n//    and https://html.spec.whatwg.org/multipage/#the-fieldset-and-legend-elements\n// 2. Reset the default outline behavior of fieldsets so they don't affect page layout.\n\nfieldset {\n  min-width: 0; // 1\n  padding: 0; // 2\n  margin: 0; // 2\n  border: 0; // 2\n}\n\n// 1. By using `float: left`, the legend will behave like a block element.\n//    This way the border of a fieldset wraps around the legend if present.\n// 2. Fix wrapping bug.\n//    See https://github.com/twbs/bootstrap/issues/29712\n\nlegend {\n  float: left; // 1\n  width: 100%;\n  padding: 0;\n  margin-bottom: $legend-margin-bottom;\n  font-weight: $legend-font-weight;\n  line-height: inherit;\n  @include font-size($legend-font-size);\n\n  + * {\n    clear: left; // 2\n  }\n}\n\n// Fix height of inputs with a type of datetime-local, date, month, week, or time\n// See https://github.com/twbs/bootstrap/issues/18842\n\n::-webkit-datetime-edit-fields-wrapper,\n::-webkit-datetime-edit-text,\n::-webkit-datetime-edit-minute,\n::-webkit-datetime-edit-hour-field,\n::-webkit-datetime-edit-day-field,\n::-webkit-datetime-edit-month-field,\n::-webkit-datetime-edit-year-field {\n  padding: 0;\n}\n\n::-webkit-inner-spin-button {\n  height: auto;\n}\n\n// 1. This overrides the extra rounded corners on search inputs in iOS so that our\n//    `.form-control` class can properly style them. Note that this cannot simply\n//    be added to `.form-control` as it's not specific enough. For details, see\n//    https://github.com/twbs/bootstrap/issues/11586.\n// 2. Correct the outline style in Safari.\n\n[type=\"search\"] {\n  -webkit-appearance: textfield; // 1\n  outline-offset: -2px; // 2\n\n  // 3. Better affordance and consistent appearance for search cancel button\n  &::-webkit-search-cancel-button {\n    cursor: pointer;\n    filter: grayscale(1);\n  }\n}\n\n// 1. A few input types should stay LTR\n// See https://rtlstyling.com/posts/rtl-styling#form-inputs\n// 2. RTL only output\n// See https://rtlcss.com/learn/usage-guide/control-directives/#raw\n\n/* rtl:raw:\n[type=\"tel\"],\n[type=\"url\"],\n[type=\"email\"],\n[type=\"number\"] {\n  direction: ltr;\n}\n*/\n\n// Remove the inner padding in Chrome and Safari on macOS.\n\n::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\n\n// Remove padding around color pickers in webkit browsers\n\n::-webkit-color-swatch-wrapper {\n  padding: 0;\n}\n\n\n// 1. Inherit font family and line height for file input buttons\n// 2. Correct the inability to style clickable types in iOS and Safari.\n\n::file-selector-button {\n  font: inherit; // 1\n  -webkit-appearance: button; // 2\n}\n\n// Correct element displays\n\noutput {\n  display: inline-block;\n}\n\n// Remove border from iframe\n\niframe {\n  border: 0;\n}\n\n// Summary\n//\n// 1. Add the correct display in all browsers\n\nsummary {\n  display: list-item; // 1\n  cursor: pointer;\n}\n\n\n// Progress\n//\n// Add the correct vertical alignment in Chrome, Firefox, and Opera.\n\nprogress {\n  vertical-align: baseline;\n}\n\n\n// Hidden attribute\n//\n// Always hide an element with the `hidden` HTML attribute.\n\n[hidden] {\n  display: none !important;\n}\n"
  },
  {
    "path": "scss/_root.scss",
    "content": ":root,\n[data-bs-theme=\"light\"] {\n  // Note: Custom variable values only support SassScript inside `#{}`.\n\n  // Colors\n  //\n  // Generate palettes for full colors, grays, and theme colors.\n\n  @each $color, $value in $colors {\n    --#{$prefix}#{$color}: #{$value};\n  }\n\n  @each $color, $value in $grays {\n    --#{$prefix}gray-#{$color}: #{$value};\n  }\n\n  @each $color, $value in $theme-colors {\n    --#{$prefix}#{$color}: #{$value};\n  }\n\n  @each $color, $value in $theme-colors-rgb {\n    --#{$prefix}#{$color}-rgb: #{$value};\n  }\n\n  @each $color, $value in $theme-colors-text {\n    --#{$prefix}#{$color}-text-emphasis: #{$value};\n  }\n\n  @each $color, $value in $theme-colors-bg-subtle {\n    --#{$prefix}#{$color}-bg-subtle: #{$value};\n  }\n\n  @each $color, $value in $theme-colors-border-subtle {\n    --#{$prefix}#{$color}-border-subtle: #{$value};\n  }\n\n  --#{$prefix}white-rgb: #{to-rgb($white)};\n  --#{$prefix}black-rgb: #{to-rgb($black)};\n\n  // Fonts\n\n  // Note: Use `inspect` for lists so that quoted items keep the quotes.\n  // See https://github.com/sass/sass/issues/2383#issuecomment-336349172\n  --#{$prefix}font-sans-serif: #{inspect($font-family-sans-serif)};\n  --#{$prefix}font-monospace: #{inspect($font-family-monospace)};\n  --#{$prefix}gradient: #{$gradient};\n\n  // Root and body\n  // scss-docs-start root-body-variables\n  @if $font-size-root != null {\n    --#{$prefix}root-font-size: #{$font-size-root};\n  }\n  --#{$prefix}body-font-family: #{inspect($font-family-base)};\n  @include rfs($font-size-base, --#{$prefix}body-font-size);\n  --#{$prefix}body-font-weight: #{$font-weight-base};\n  --#{$prefix}body-line-height: #{$line-height-base};\n  @if $body-text-align != null {\n    --#{$prefix}body-text-align: #{$body-text-align};\n  }\n\n  --#{$prefix}body-color: #{$body-color};\n  --#{$prefix}body-color-rgb: #{to-rgb($body-color)};\n  --#{$prefix}body-bg: #{$body-bg};\n  --#{$prefix}body-bg-rgb: #{to-rgb($body-bg)};\n\n  --#{$prefix}emphasis-color: #{$body-emphasis-color};\n  --#{$prefix}emphasis-color-rgb: #{to-rgb($body-emphasis-color)};\n\n  --#{$prefix}secondary-color: #{$body-secondary-color};\n  --#{$prefix}secondary-color-rgb: #{to-rgb($body-secondary-color)};\n  --#{$prefix}secondary-bg: #{$body-secondary-bg};\n  --#{$prefix}secondary-bg-rgb: #{to-rgb($body-secondary-bg)};\n\n  --#{$prefix}tertiary-color: #{$body-tertiary-color};\n  --#{$prefix}tertiary-color-rgb: #{to-rgb($body-tertiary-color)};\n  --#{$prefix}tertiary-bg: #{$body-tertiary-bg};\n  --#{$prefix}tertiary-bg-rgb: #{to-rgb($body-tertiary-bg)};\n  // scss-docs-end root-body-variables\n\n  --#{$prefix}heading-color: #{$headings-color};\n\n  --#{$prefix}link-color: #{$link-color};\n  --#{$prefix}link-color-rgb: #{to-rgb($link-color)};\n  --#{$prefix}link-decoration: #{$link-decoration};\n\n  --#{$prefix}link-hover-color: #{$link-hover-color};\n  --#{$prefix}link-hover-color-rgb: #{to-rgb($link-hover-color)};\n\n  @if $link-hover-decoration != null {\n    --#{$prefix}link-hover-decoration: #{$link-hover-decoration};\n  }\n\n  --#{$prefix}code-color: #{$code-color};\n  --#{$prefix}highlight-color: #{$mark-color};\n  --#{$prefix}highlight-bg: #{$mark-bg};\n\n  // scss-docs-start root-border-var\n  --#{$prefix}border-width: #{$border-width};\n  --#{$prefix}border-style: #{$border-style};\n  --#{$prefix}border-color: #{$border-color};\n  --#{$prefix}border-color-translucent: #{$border-color-translucent};\n\n  --#{$prefix}border-radius: #{$border-radius};\n  --#{$prefix}border-radius-sm: #{$border-radius-sm};\n  --#{$prefix}border-radius-lg: #{$border-radius-lg};\n  --#{$prefix}border-radius-xl: #{$border-radius-xl};\n  --#{$prefix}border-radius-xxl: #{$border-radius-xxl};\n  --#{$prefix}border-radius-2xl: var(--#{$prefix}border-radius-xxl); // Deprecated in v5.3.0 for consistency\n  --#{$prefix}border-radius-pill: #{$border-radius-pill};\n  // scss-docs-end root-border-var\n\n  --#{$prefix}box-shadow: #{$box-shadow};\n  --#{$prefix}box-shadow-sm: #{$box-shadow-sm};\n  --#{$prefix}box-shadow-lg: #{$box-shadow-lg};\n  --#{$prefix}box-shadow-inset: #{$box-shadow-inset};\n\n  // Focus styles\n  // scss-docs-start root-focus-variables\n  --#{$prefix}focus-ring-width: #{$focus-ring-width};\n  --#{$prefix}focus-ring-opacity: #{$focus-ring-opacity};\n  --#{$prefix}focus-ring-color: #{$focus-ring-color};\n  // scss-docs-end root-focus-variables\n\n  // scss-docs-start root-form-validation-variables\n  --#{$prefix}form-valid-color: #{$form-valid-color};\n  --#{$prefix}form-valid-border-color: #{$form-valid-border-color};\n  --#{$prefix}form-invalid-color: #{$form-invalid-color};\n  --#{$prefix}form-invalid-border-color: #{$form-invalid-border-color};\n  // scss-docs-end root-form-validation-variables\n}\n\n@if $enable-dark-mode {\n  @include color-mode(dark, true) {\n    color-scheme: dark;\n\n    // scss-docs-start root-dark-mode-vars\n    --#{$prefix}body-color: #{$body-color-dark};\n    --#{$prefix}body-color-rgb: #{to-rgb($body-color-dark)};\n    --#{$prefix}body-bg: #{$body-bg-dark};\n    --#{$prefix}body-bg-rgb: #{to-rgb($body-bg-dark)};\n\n    --#{$prefix}emphasis-color: #{$body-emphasis-color-dark};\n    --#{$prefix}emphasis-color-rgb: #{to-rgb($body-emphasis-color-dark)};\n\n    --#{$prefix}secondary-color: #{$body-secondary-color-dark};\n    --#{$prefix}secondary-color-rgb: #{to-rgb($body-secondary-color-dark)};\n    --#{$prefix}secondary-bg: #{$body-secondary-bg-dark};\n    --#{$prefix}secondary-bg-rgb: #{to-rgb($body-secondary-bg-dark)};\n\n    --#{$prefix}tertiary-color: #{$body-tertiary-color-dark};\n    --#{$prefix}tertiary-color-rgb: #{to-rgb($body-tertiary-color-dark)};\n    --#{$prefix}tertiary-bg: #{$body-tertiary-bg-dark};\n    --#{$prefix}tertiary-bg-rgb: #{to-rgb($body-tertiary-bg-dark)};\n\n    @each $color, $value in $theme-colors-text-dark {\n      --#{$prefix}#{$color}-text-emphasis: #{$value};\n    }\n\n    @each $color, $value in $theme-colors-bg-subtle-dark {\n      --#{$prefix}#{$color}-bg-subtle: #{$value};\n    }\n\n    @each $color, $value in $theme-colors-border-subtle-dark {\n      --#{$prefix}#{$color}-border-subtle: #{$value};\n    }\n\n    --#{$prefix}heading-color: #{$headings-color-dark};\n\n    --#{$prefix}link-color: #{$link-color-dark};\n    --#{$prefix}link-hover-color: #{$link-hover-color-dark};\n    --#{$prefix}link-color-rgb: #{to-rgb($link-color-dark)};\n    --#{$prefix}link-hover-color-rgb: #{to-rgb($link-hover-color-dark)};\n\n    --#{$prefix}code-color: #{$code-color-dark};\n    --#{$prefix}highlight-color: #{$mark-color-dark};\n    --#{$prefix}highlight-bg: #{$mark-bg-dark};\n\n    --#{$prefix}border-color: #{$border-color-dark};\n    --#{$prefix}border-color-translucent: #{$border-color-translucent-dark};\n\n    --#{$prefix}form-valid-color: #{$form-valid-color-dark};\n    --#{$prefix}form-valid-border-color: #{$form-valid-border-color-dark};\n    --#{$prefix}form-invalid-color: #{$form-invalid-color-dark};\n    --#{$prefix}form-invalid-border-color: #{$form-invalid-border-color-dark};\n    // scss-docs-end root-dark-mode-vars\n  }\n}\n"
  },
  {
    "path": "scss/_spinners.scss",
    "content": "//\n// Rotating border\n//\n\n.spinner-grow,\n.spinner-border {\n  display: inline-block;\n  flex-shrink: 0;\n  width: var(--#{$prefix}spinner-width);\n  height: var(--#{$prefix}spinner-height);\n  vertical-align: var(--#{$prefix}spinner-vertical-align);\n  // stylelint-disable-next-line property-disallowed-list\n  border-radius: 50%;\n  animation: var(--#{$prefix}spinner-animation-speed) linear infinite var(--#{$prefix}spinner-animation-name);\n}\n\n// scss-docs-start spinner-border-keyframes\n@keyframes spinner-border {\n  to { transform: rotate(360deg) #{\"/* rtl:ignore */\"}; }\n}\n// scss-docs-end spinner-border-keyframes\n\n.spinner-border {\n  // scss-docs-start spinner-border-css-vars\n  --#{$prefix}spinner-width: #{$spinner-width};\n  --#{$prefix}spinner-height: #{$spinner-height};\n  --#{$prefix}spinner-vertical-align: #{$spinner-vertical-align};\n  --#{$prefix}spinner-border-width: #{$spinner-border-width};\n  --#{$prefix}spinner-animation-speed: #{$spinner-animation-speed};\n  --#{$prefix}spinner-animation-name: spinner-border;\n  // scss-docs-end spinner-border-css-vars\n\n  border: var(--#{$prefix}spinner-border-width) solid currentcolor;\n  border-right-color: transparent;\n}\n\n.spinner-border-sm {\n  // scss-docs-start spinner-border-sm-css-vars\n  --#{$prefix}spinner-width: #{$spinner-width-sm};\n  --#{$prefix}spinner-height: #{$spinner-height-sm};\n  --#{$prefix}spinner-border-width: #{$spinner-border-width-sm};\n  // scss-docs-end spinner-border-sm-css-vars\n}\n\n//\n// Growing circle\n//\n\n// scss-docs-start spinner-grow-keyframes\n@keyframes spinner-grow {\n  0% {\n    transform: scale(0);\n  }\n  50% {\n    opacity: 1;\n    transform: none;\n  }\n}\n// scss-docs-end spinner-grow-keyframes\n\n.spinner-grow {\n  // scss-docs-start spinner-grow-css-vars\n  --#{$prefix}spinner-width: #{$spinner-width};\n  --#{$prefix}spinner-height: #{$spinner-height};\n  --#{$prefix}spinner-vertical-align: #{$spinner-vertical-align};\n  --#{$prefix}spinner-animation-speed: #{$spinner-animation-speed};\n  --#{$prefix}spinner-animation-name: spinner-grow;\n  // scss-docs-end spinner-grow-css-vars\n\n  background-color: currentcolor;\n  opacity: 0;\n}\n\n.spinner-grow-sm {\n  --#{$prefix}spinner-width: #{$spinner-width-sm};\n  --#{$prefix}spinner-height: #{$spinner-height-sm};\n}\n\n@if $enable-reduced-motion {\n  @media (prefers-reduced-motion: reduce) {\n    .spinner-border,\n    .spinner-grow {\n      --#{$prefix}spinner-animation-speed: #{$spinner-animation-speed * 2};\n    }\n  }\n}\n"
  },
  {
    "path": "scss/_tables.scss",
    "content": "//\n// Basic Bootstrap table\n//\n\n.table {\n  // Reset needed for nesting tables\n  --#{$prefix}table-color-type: initial;\n  --#{$prefix}table-bg-type: initial;\n  --#{$prefix}table-color-state: initial;\n  --#{$prefix}table-bg-state: initial;\n  // End of reset\n  --#{$prefix}table-color: #{$table-color};\n  --#{$prefix}table-bg: #{$table-bg};\n  --#{$prefix}table-border-color: #{$table-border-color};\n  --#{$prefix}table-accent-bg: #{$table-accent-bg};\n  --#{$prefix}table-striped-color: #{$table-striped-color};\n  --#{$prefix}table-striped-bg: #{$table-striped-bg};\n  --#{$prefix}table-active-color: #{$table-active-color};\n  --#{$prefix}table-active-bg: #{$table-active-bg};\n  --#{$prefix}table-hover-color: #{$table-hover-color};\n  --#{$prefix}table-hover-bg: #{$table-hover-bg};\n\n  width: 100%;\n  margin-bottom: $spacer;\n  vertical-align: $table-cell-vertical-align;\n  border-color: var(--#{$prefix}table-border-color);\n\n  // Target th & td\n  // We need the child combinator to prevent styles leaking to nested tables which doesn't have a `.table` class.\n  // We use the universal selectors here to simplify the selector (else we would need 6 different selectors).\n  // Another advantage is that this generates less code and makes the selector less specific making it easier to override.\n  // stylelint-disable-next-line selector-max-universal\n  > :not(caption) > * > * {\n    padding: $table-cell-padding-y $table-cell-padding-x;\n    // Following the precept of cascades: https://codepen.io/miriamsuzanne/full/vYNgodb\n    color: var(--#{$prefix}table-color-state, var(--#{$prefix}table-color-type, var(--#{$prefix}table-color)));\n    background-color: var(--#{$prefix}table-bg);\n    border-bottom-width: $table-border-width;\n    box-shadow: inset 0 0 0 9999px var(--#{$prefix}table-bg-state, var(--#{$prefix}table-bg-type, var(--#{$prefix}table-accent-bg)));\n  }\n\n  > tbody {\n    vertical-align: inherit;\n  }\n\n  > thead {\n    vertical-align: bottom;\n  }\n}\n\n.table-group-divider {\n  border-top: calc(#{$table-border-width} * 2) solid $table-group-separator-color; // stylelint-disable-line function-disallowed-list\n}\n\n//\n// Change placement of captions with a class\n//\n\n.caption-top {\n  caption-side: top;\n}\n\n\n//\n// Condensed table w/ half padding\n//\n\n.table-sm {\n  // stylelint-disable-next-line selector-max-universal\n  > :not(caption) > * > * {\n    padding: $table-cell-padding-y-sm $table-cell-padding-x-sm;\n  }\n}\n\n\n// Border versions\n//\n// Add or remove borders all around the table and between all the columns.\n//\n// When borders are added on all sides of the cells, the corners can render odd when\n// these borders do not have the same color or if they are semi-transparent.\n// Therefore we add top and border bottoms to the `tr`s and left and right borders\n// to the `td`s or `th`s\n\n.table-bordered {\n  > :not(caption) > * {\n    border-width: $table-border-width 0;\n\n    // stylelint-disable-next-line selector-max-universal\n    > * {\n      border-width: 0 $table-border-width;\n    }\n  }\n}\n\n.table-borderless {\n  // stylelint-disable-next-line selector-max-universal\n  > :not(caption) > * > * {\n    border-bottom-width: 0;\n  }\n\n  > :not(:first-child) {\n    border-top-width: 0;\n  }\n}\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n// For rows\n.table-striped {\n  > tbody > tr:nth-of-type(#{$table-striped-order}) > * {\n    --#{$prefix}table-color-type: var(--#{$prefix}table-striped-color);\n    --#{$prefix}table-bg-type: var(--#{$prefix}table-striped-bg);\n  }\n}\n\n// For columns\n.table-striped-columns {\n  > :not(caption) > tr > :nth-child(#{$table-striped-columns-order}) {\n    --#{$prefix}table-color-type: var(--#{$prefix}table-striped-color);\n    --#{$prefix}table-bg-type: var(--#{$prefix}table-striped-bg);\n  }\n}\n\n// Active table\n//\n// The `.table-active` class can be added to highlight rows or cells\n\n.table-active {\n  --#{$prefix}table-color-state: var(--#{$prefix}table-active-color);\n  --#{$prefix}table-bg-state: var(--#{$prefix}table-active-bg);\n}\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n  > tbody > tr:hover > * {\n    --#{$prefix}table-color-state: var(--#{$prefix}table-hover-color);\n    --#{$prefix}table-bg-state: var(--#{$prefix}table-hover-bg);\n  }\n}\n\n\n// Table variants\n//\n// Table variants set the table cell backgrounds, border colors\n// and the colors of the striped, hovered & active tables\n\n@each $color, $value in $table-variants {\n  @include table-variant($color, $value);\n}\n\n// Responsive tables\n//\n// Generate series of `.table-responsive-*` classes for configuring the screen\n// size of where your table will overflow.\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n  $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n  @include media-breakpoint-down($breakpoint) {\n    .table-responsive#{$infix} {\n      overflow-x: auto;\n      -webkit-overflow-scrolling: touch;\n    }\n  }\n}\n"
  },
  {
    "path": "scss/_toasts.scss",
    "content": ".toast {\n  // scss-docs-start toast-css-vars\n  --#{$prefix}toast-zindex: #{$zindex-toast};\n  --#{$prefix}toast-padding-x: #{$toast-padding-x};\n  --#{$prefix}toast-padding-y: #{$toast-padding-y};\n  --#{$prefix}toast-spacing: #{$toast-spacing};\n  --#{$prefix}toast-max-width: #{$toast-max-width};\n  @include rfs($toast-font-size, --#{$prefix}toast-font-size);\n  --#{$prefix}toast-color: #{$toast-color};\n  --#{$prefix}toast-bg: #{$toast-background-color};\n  --#{$prefix}toast-border-width: #{$toast-border-width};\n  --#{$prefix}toast-border-color: #{$toast-border-color};\n  --#{$prefix}toast-border-radius: #{$toast-border-radius};\n  --#{$prefix}toast-box-shadow: #{$toast-box-shadow};\n  --#{$prefix}toast-header-color: #{$toast-header-color};\n  --#{$prefix}toast-header-bg: #{$toast-header-background-color};\n  --#{$prefix}toast-header-border-color: #{$toast-header-border-color};\n  // scss-docs-end toast-css-vars\n\n  width: var(--#{$prefix}toast-max-width);\n  max-width: 100%;\n  @include font-size(var(--#{$prefix}toast-font-size));\n  color: var(--#{$prefix}toast-color);\n  pointer-events: auto;\n  background-color: var(--#{$prefix}toast-bg);\n  background-clip: padding-box;\n  border: var(--#{$prefix}toast-border-width) solid var(--#{$prefix}toast-border-color);\n  box-shadow: var(--#{$prefix}toast-box-shadow);\n  @include border-radius(var(--#{$prefix}toast-border-radius));\n\n  &.showing {\n    opacity: 0;\n  }\n\n  &:not(.show) {\n    display: none;\n  }\n}\n\n.toast-container {\n  --#{$prefix}toast-zindex: #{$zindex-toast};\n\n  position: absolute;\n  z-index: var(--#{$prefix}toast-zindex);\n  width: max-content;\n  max-width: 100%;\n  pointer-events: none;\n\n  > :not(:last-child) {\n    margin-bottom: var(--#{$prefix}toast-spacing);\n  }\n}\n\n.toast-header {\n  display: flex;\n  align-items: center;\n  padding: var(--#{$prefix}toast-padding-y) var(--#{$prefix}toast-padding-x);\n  color: var(--#{$prefix}toast-header-color);\n  background-color: var(--#{$prefix}toast-header-bg);\n  background-clip: padding-box;\n  border-bottom: var(--#{$prefix}toast-border-width) solid var(--#{$prefix}toast-header-border-color);\n  @include border-top-radius(calc(var(--#{$prefix}toast-border-radius) - var(--#{$prefix}toast-border-width)));\n\n  .btn-close {\n    margin-right: calc(-.5 * var(--#{$prefix}toast-padding-x)); // stylelint-disable-line function-disallowed-list\n    margin-left: var(--#{$prefix}toast-padding-x);\n  }\n}\n\n.toast-body {\n  padding: var(--#{$prefix}toast-padding-x);\n  word-wrap: break-word;\n}\n"
  },
  {
    "path": "scss/_tooltip.scss",
    "content": "// Base class\n.tooltip {\n  // scss-docs-start tooltip-css-vars\n  --#{$prefix}tooltip-zindex: #{$zindex-tooltip};\n  --#{$prefix}tooltip-max-width: #{$tooltip-max-width};\n  --#{$prefix}tooltip-padding-x: #{$tooltip-padding-x};\n  --#{$prefix}tooltip-padding-y: #{$tooltip-padding-y};\n  --#{$prefix}tooltip-margin: #{$tooltip-margin};\n  @include rfs($tooltip-font-size, --#{$prefix}tooltip-font-size);\n  --#{$prefix}tooltip-color: #{$tooltip-color};\n  --#{$prefix}tooltip-bg: #{$tooltip-bg};\n  --#{$prefix}tooltip-border-radius: #{$tooltip-border-radius};\n  --#{$prefix}tooltip-opacity: #{$tooltip-opacity};\n  --#{$prefix}tooltip-arrow-width: #{$tooltip-arrow-width};\n  --#{$prefix}tooltip-arrow-height: #{$tooltip-arrow-height};\n  // scss-docs-end tooltip-css-vars\n\n  z-index: var(--#{$prefix}tooltip-zindex);\n  display: block;\n  margin: var(--#{$prefix}tooltip-margin);\n  @include deprecate(\"`$tooltip-margin`\", \"v5\", \"v5.x\", true);\n  // Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.\n  // So reset our font and text properties to avoid inheriting weird values.\n  @include reset-text();\n  @include font-size(var(--#{$prefix}tooltip-font-size));\n  // Allow breaking very long words so they don't overflow the tooltip's bounds\n  word-wrap: break-word;\n  opacity: 0;\n\n  &.show { opacity: var(--#{$prefix}tooltip-opacity); }\n\n  .tooltip-arrow {\n    display: block;\n    width: var(--#{$prefix}tooltip-arrow-width);\n    height: var(--#{$prefix}tooltip-arrow-height);\n\n    &::before {\n      position: absolute;\n      content: \"\";\n      border-color: transparent;\n      border-style: solid;\n    }\n  }\n}\n\n.bs-tooltip-top .tooltip-arrow {\n  bottom: calc(-1 * var(--#{$prefix}tooltip-arrow-height)); // stylelint-disable-line function-disallowed-list\n\n  &::before {\n    top: -1px;\n    border-width: var(--#{$prefix}tooltip-arrow-height) calc(var(--#{$prefix}tooltip-arrow-width) * .5) 0; // stylelint-disable-line function-disallowed-list\n    border-top-color: var(--#{$prefix}tooltip-bg);\n  }\n}\n\n/* rtl:begin:ignore */\n.bs-tooltip-end .tooltip-arrow {\n  left: calc(-1 * var(--#{$prefix}tooltip-arrow-height)); // stylelint-disable-line function-disallowed-list\n  width: var(--#{$prefix}tooltip-arrow-height);\n  height: var(--#{$prefix}tooltip-arrow-width);\n\n  &::before {\n    right: -1px;\n    border-width: calc(var(--#{$prefix}tooltip-arrow-width) * .5) var(--#{$prefix}tooltip-arrow-height) calc(var(--#{$prefix}tooltip-arrow-width) * .5) 0; // stylelint-disable-line function-disallowed-list\n    border-right-color: var(--#{$prefix}tooltip-bg);\n  }\n}\n\n/* rtl:end:ignore */\n\n.bs-tooltip-bottom .tooltip-arrow {\n  top: calc(-1 * var(--#{$prefix}tooltip-arrow-height)); // stylelint-disable-line function-disallowed-list\n\n  &::before {\n    bottom: -1px;\n    border-width: 0 calc(var(--#{$prefix}tooltip-arrow-width) * .5) var(--#{$prefix}tooltip-arrow-height); // stylelint-disable-line function-disallowed-list\n    border-bottom-color: var(--#{$prefix}tooltip-bg);\n  }\n}\n\n/* rtl:begin:ignore */\n.bs-tooltip-start .tooltip-arrow {\n  right: calc(-1 * var(--#{$prefix}tooltip-arrow-height)); // stylelint-disable-line function-disallowed-list\n  width: var(--#{$prefix}tooltip-arrow-height);\n  height: var(--#{$prefix}tooltip-arrow-width);\n\n  &::before {\n    left: -1px;\n    border-width: calc(var(--#{$prefix}tooltip-arrow-width) * .5) 0 calc(var(--#{$prefix}tooltip-arrow-width) * .5) var(--#{$prefix}tooltip-arrow-height); // stylelint-disable-line function-disallowed-list\n    border-left-color: var(--#{$prefix}tooltip-bg);\n  }\n}\n\n/* rtl:end:ignore */\n\n.bs-tooltip-auto {\n  &[data-popper-placement^=\"top\"] {\n    @extend .bs-tooltip-top;\n  }\n  &[data-popper-placement^=\"right\"] {\n    @extend .bs-tooltip-end;\n  }\n  &[data-popper-placement^=\"bottom\"] {\n    @extend .bs-tooltip-bottom;\n  }\n  &[data-popper-placement^=\"left\"] {\n    @extend .bs-tooltip-start;\n  }\n}\n\n// Wrapper for the tooltip content\n.tooltip-inner {\n  max-width: var(--#{$prefix}tooltip-max-width);\n  padding: var(--#{$prefix}tooltip-padding-y) var(--#{$prefix}tooltip-padding-x);\n  color: var(--#{$prefix}tooltip-color);\n  text-align: center;\n  background-color: var(--#{$prefix}tooltip-bg);\n  @include border-radius(var(--#{$prefix}tooltip-border-radius));\n}\n"
  },
  {
    "path": "scss/_transitions.scss",
    "content": ".fade {\n  @include transition($transition-fade);\n\n  &:not(.show) {\n    opacity: 0;\n  }\n}\n\n// scss-docs-start collapse-classes\n.collapse {\n  &:not(.show) {\n    display: none;\n  }\n}\n\n.collapsing {\n  height: 0;\n  overflow: hidden;\n  @include transition($transition-collapse);\n\n  &.collapse-horizontal {\n    width: 0;\n    height: auto;\n    @include transition($transition-collapse-width);\n  }\n}\n// scss-docs-end collapse-classes\n"
  },
  {
    "path": "scss/_type.scss",
    "content": "//\n// Headings\n//\n.h1 {\n  @extend h1;\n}\n\n.h2 {\n  @extend h2;\n}\n\n.h3 {\n  @extend h3;\n}\n\n.h4 {\n  @extend h4;\n}\n\n.h5 {\n  @extend h5;\n}\n\n.h6 {\n  @extend h6;\n}\n\n\n.lead {\n  @include font-size($lead-font-size);\n  font-weight: $lead-font-weight;\n}\n\n// Type display classes\n@each $display, $font-size in $display-font-sizes {\n  .display-#{$display} {\n    font-family: $display-font-family;\n    font-style: $display-font-style;\n    font-weight: $display-font-weight;\n    line-height: $display-line-height;\n    @include font-size($font-size);\n  }\n}\n\n//\n// Emphasis\n//\n.small {\n  @extend small;\n}\n\n.mark {\n  @extend mark;\n}\n\n//\n// Lists\n//\n\n.list-unstyled {\n  @include list-unstyled();\n}\n\n// Inline turns list items into inline-block\n.list-inline {\n  @include list-unstyled();\n}\n.list-inline-item {\n  display: inline-block;\n\n  &:not(:last-child) {\n    margin-right: $list-inline-padding;\n  }\n}\n\n\n//\n// Misc\n//\n\n// Builds on `abbr`\n.initialism {\n  @include font-size($initialism-font-size);\n  text-transform: uppercase;\n}\n\n// Blockquotes\n.blockquote {\n  margin-bottom: $blockquote-margin-y;\n  @include font-size($blockquote-font-size);\n\n  > :last-child {\n    margin-bottom: 0;\n  }\n}\n\n.blockquote-footer {\n  margin-top: -$blockquote-margin-y;\n  margin-bottom: $blockquote-margin-y;\n  @include font-size($blockquote-footer-font-size);\n  color: $blockquote-footer-color;\n\n  &::before {\n    content: \"\\2014\\00A0\"; // em dash, nbsp\n  }\n}\n"
  },
  {
    "path": "scss/_utilities.scss",
    "content": "// Utilities\n\n$utilities: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$utilities: map-merge(\n  (\n    // scss-docs-start utils-vertical-align\n    \"align\": (\n      property: vertical-align,\n      class: align,\n      values: baseline top middle bottom text-bottom text-top\n    ),\n    // scss-docs-end utils-vertical-align\n    // scss-docs-start utils-float\n    \"float\": (\n      responsive: true,\n      property: float,\n      values: (\n        start: left,\n        end: right,\n        none: none,\n      )\n    ),\n    // scss-docs-end utils-float\n    // Object Fit utilities\n    // scss-docs-start utils-object-fit\n    \"object-fit\": (\n      responsive: true,\n      property: object-fit,\n      values: (\n        contain: contain,\n        cover: cover,\n        fill: fill,\n        scale: scale-down,\n        none: none,\n      )\n    ),\n    // scss-docs-end utils-object-fit\n    // Opacity utilities\n    // scss-docs-start utils-opacity\n    \"opacity\": (\n      property: opacity,\n      values: (\n        0: 0,\n        25: .25,\n        50: .5,\n        75: .75,\n        100: 1,\n      )\n    ),\n    // scss-docs-end utils-opacity\n    // scss-docs-start utils-overflow\n    \"overflow\": (\n      property: overflow,\n      values: auto hidden visible scroll,\n    ),\n    \"overflow-x\": (\n      property: overflow-x,\n      values: auto hidden visible scroll,\n    ),\n    \"overflow-y\": (\n      property: overflow-y,\n      values: auto hidden visible scroll,\n    ),\n    // scss-docs-end utils-overflow\n    // scss-docs-start utils-display\n    \"display\": (\n      responsive: true,\n      print: true,\n      property: display,\n      class: d,\n      values: inline inline-block block grid inline-grid table table-row table-cell flex inline-flex none\n    ),\n    // scss-docs-end utils-display\n    // scss-docs-start utils-shadow\n    \"shadow\": (\n      property: box-shadow,\n      class: shadow,\n      values: (\n        null: var(--#{$prefix}box-shadow),\n        sm: var(--#{$prefix}box-shadow-sm),\n        lg: var(--#{$prefix}box-shadow-lg),\n        none: none,\n      )\n    ),\n    // scss-docs-end utils-shadow\n    // scss-docs-start utils-focus-ring\n    \"focus-ring\": (\n      css-var: true,\n      css-variable-name: focus-ring-color,\n      class: focus-ring,\n      values: map-loop($theme-colors-rgb, rgba-css-var, \"$key\", \"focus-ring\")\n    ),\n    // scss-docs-end utils-focus-ring\n    // scss-docs-start utils-position\n    \"position\": (\n      property: position,\n      values: static relative absolute fixed sticky\n    ),\n    \"top\": (\n      property: top,\n      values: $position-values\n    ),\n    \"bottom\": (\n      property: bottom,\n      values: $position-values\n    ),\n    \"start\": (\n      property: left,\n      class: start,\n      values: $position-values\n    ),\n    \"end\": (\n      property: right,\n      class: end,\n      values: $position-values\n    ),\n    \"translate-middle\": (\n      property: transform,\n      class: translate-middle,\n      values: (\n        null: translate(-50%, -50%),\n        x: translateX(-50%),\n        y: translateY(-50%),\n      )\n    ),\n    // scss-docs-end utils-position\n    // scss-docs-start utils-borders\n    \"border\": (\n      property: border,\n      values: (\n        null: var(--#{$prefix}border-width) var(--#{$prefix}border-style) var(--#{$prefix}border-color),\n        0: 0,\n      )\n    ),\n    \"border-top\": (\n      property: border-top,\n      values: (\n        null: var(--#{$prefix}border-width) var(--#{$prefix}border-style) var(--#{$prefix}border-color),\n        0: 0,\n      )\n    ),\n    \"border-end\": (\n      property: border-right,\n      class: border-end,\n      values: (\n        null: var(--#{$prefix}border-width) var(--#{$prefix}border-style) var(--#{$prefix}border-color),\n        0: 0,\n      )\n    ),\n    \"border-bottom\": (\n      property: border-bottom,\n      values: (\n        null: var(--#{$prefix}border-width) var(--#{$prefix}border-style) var(--#{$prefix}border-color),\n        0: 0,\n      )\n    ),\n    \"border-start\": (\n      property: border-left,\n      class: border-start,\n      values: (\n        null: var(--#{$prefix}border-width) var(--#{$prefix}border-style) var(--#{$prefix}border-color),\n        0: 0,\n      )\n    ),\n    \"border-color\": (\n      property: border-color,\n      class: border,\n      local-vars: (\n        \"border-opacity\": 1\n      ),\n      values: $utilities-border-colors\n    ),\n    \"subtle-border-color\": (\n      property: border-color,\n      class: border,\n      values: $utilities-border-subtle\n    ),\n    \"border-width\": (\n      property: border-width,\n      class: border,\n      values: $border-widths\n    ),\n    \"border-opacity\": (\n      css-var: true,\n      class: border-opacity,\n      values: (\n        10: .1,\n        25: .25,\n        50: .5,\n        75: .75,\n        100: 1\n      )\n    ),\n    // scss-docs-end utils-borders\n    // Sizing utilities\n    // scss-docs-start utils-sizing\n    \"width\": (\n      property: width,\n      class: w,\n      values: (\n        25: 25%,\n        50: 50%,\n        75: 75%,\n        100: 100%,\n        auto: auto\n      )\n    ),\n    \"max-width\": (\n      property: max-width,\n      class: mw,\n      values: (100: 100%)\n    ),\n    \"viewport-width\": (\n      property: width,\n      class: vw,\n      values: (100: 100vw)\n    ),\n    \"min-viewport-width\": (\n      property: min-width,\n      class: min-vw,\n      values: (100: 100vw)\n    ),\n    \"height\": (\n      property: height,\n      class: h,\n      values: (\n        25: 25%,\n        50: 50%,\n        75: 75%,\n        100: 100%,\n        auto: auto\n      )\n    ),\n    \"max-height\": (\n      property: max-height,\n      class: mh,\n      values: (100: 100%)\n    ),\n    \"viewport-height\": (\n      property: height,\n      class: vh,\n      values: (100: 100vh)\n    ),\n    \"min-viewport-height\": (\n      property: min-height,\n      class: min-vh,\n      values: (100: 100vh)\n    ),\n    // scss-docs-end utils-sizing\n    // Flex utilities\n    // scss-docs-start utils-flex\n    \"flex\": (\n      responsive: true,\n      property: flex,\n      values: (fill: 1 1 auto)\n    ),\n    \"flex-direction\": (\n      responsive: true,\n      property: flex-direction,\n      class: flex,\n      values: row column row-reverse column-reverse\n    ),\n    \"flex-grow\": (\n      responsive: true,\n      property: flex-grow,\n      class: flex,\n      values: (\n        grow-0: 0,\n        grow-1: 1,\n      )\n    ),\n    \"flex-shrink\": (\n      responsive: true,\n      property: flex-shrink,\n      class: flex,\n      values: (\n        shrink-0: 0,\n        shrink-1: 1,\n      )\n    ),\n    \"flex-wrap\": (\n      responsive: true,\n      property: flex-wrap,\n      class: flex,\n      values: wrap nowrap wrap-reverse\n    ),\n    \"justify-content\": (\n      responsive: true,\n      property: justify-content,\n      values: (\n        start: flex-start,\n        end: flex-end,\n        center: center,\n        between: space-between,\n        around: space-around,\n        evenly: space-evenly,\n      )\n    ),\n    \"align-items\": (\n      responsive: true,\n      property: align-items,\n      values: (\n        start: flex-start,\n        end: flex-end,\n        center: center,\n        baseline: baseline,\n        stretch: stretch,\n      )\n    ),\n    \"align-content\": (\n      responsive: true,\n      property: align-content,\n      values: (\n        start: flex-start,\n        end: flex-end,\n        center: center,\n        between: space-between,\n        around: space-around,\n        stretch: stretch,\n      )\n    ),\n    \"align-self\": (\n      responsive: true,\n      property: align-self,\n      values: (\n        auto: auto,\n        start: flex-start,\n        end: flex-end,\n        center: center,\n        baseline: baseline,\n        stretch: stretch,\n      )\n    ),\n    \"order\": (\n      responsive: true,\n      property: order,\n      values: (\n        first: -1,\n        0: 0,\n        1: 1,\n        2: 2,\n        3: 3,\n        4: 4,\n        5: 5,\n        last: 6,\n      ),\n    ),\n    // scss-docs-end utils-flex\n    // Margin utilities\n    // scss-docs-start utils-spacing\n    \"margin\": (\n      responsive: true,\n      property: margin,\n      class: m,\n      values: map-merge($spacers, (auto: auto))\n    ),\n    \"margin-x\": (\n      responsive: true,\n      property: margin-right margin-left,\n      class: mx,\n      values: map-merge($spacers, (auto: auto))\n    ),\n    \"margin-y\": (\n      responsive: true,\n      property: margin-top margin-bottom,\n      class: my,\n      values: map-merge($spacers, (auto: auto))\n    ),\n    \"margin-top\": (\n      responsive: true,\n      property: margin-top,\n      class: mt,\n      values: map-merge($spacers, (auto: auto))\n    ),\n    \"margin-end\": (\n      responsive: true,\n      property: margin-right,\n      class: me,\n      values: map-merge($spacers, (auto: auto))\n    ),\n    \"margin-bottom\": (\n      responsive: true,\n      property: margin-bottom,\n      class: mb,\n      values: map-merge($spacers, (auto: auto))\n    ),\n    \"margin-start\": (\n      responsive: true,\n      property: margin-left,\n      class: ms,\n      values: map-merge($spacers, (auto: auto))\n    ),\n    // Negative margin utilities\n    \"negative-margin\": (\n      responsive: true,\n      property: margin,\n      class: m,\n      values: $negative-spacers\n    ),\n    \"negative-margin-x\": (\n      responsive: true,\n      property: margin-right margin-left,\n      class: mx,\n      values: $negative-spacers\n    ),\n    \"negative-margin-y\": (\n      responsive: true,\n      property: margin-top margin-bottom,\n      class: my,\n      values: $negative-spacers\n    ),\n    \"negative-margin-top\": (\n      responsive: true,\n      property: margin-top,\n      class: mt,\n      values: $negative-spacers\n    ),\n    \"negative-margin-end\": (\n      responsive: true,\n      property: margin-right,\n      class: me,\n      values: $negative-spacers\n    ),\n    \"negative-margin-bottom\": (\n      responsive: true,\n      property: margin-bottom,\n      class: mb,\n      values: $negative-spacers\n    ),\n    \"negative-margin-start\": (\n      responsive: true,\n      property: margin-left,\n      class: ms,\n      values: $negative-spacers\n    ),\n    // Padding utilities\n    \"padding\": (\n      responsive: true,\n      property: padding,\n      class: p,\n      values: $spacers\n    ),\n    \"padding-x\": (\n      responsive: true,\n      property: padding-right padding-left,\n      class: px,\n      values: $spacers\n    ),\n    \"padding-y\": (\n      responsive: true,\n      property: padding-top padding-bottom,\n      class: py,\n      values: $spacers\n    ),\n    \"padding-top\": (\n      responsive: true,\n      property: padding-top,\n      class: pt,\n      values: $spacers\n    ),\n    \"padding-end\": (\n      responsive: true,\n      property: padding-right,\n      class: pe,\n      values: $spacers\n    ),\n    \"padding-bottom\": (\n      responsive: true,\n      property: padding-bottom,\n      class: pb,\n      values: $spacers\n    ),\n    \"padding-start\": (\n      responsive: true,\n      property: padding-left,\n      class: ps,\n      values: $spacers\n    ),\n    // Gap utility\n    \"gap\": (\n      responsive: true,\n      property: gap,\n      class: gap,\n      values: $spacers\n    ),\n    \"row-gap\": (\n      responsive: true,\n      property: row-gap,\n      class: row-gap,\n      values: $spacers\n    ),\n    \"column-gap\": (\n      responsive: true,\n      property: column-gap,\n      class: column-gap,\n      values: $spacers\n    ),\n    // scss-docs-end utils-spacing\n    // Text\n    // scss-docs-start utils-text\n    \"font-family\": (\n      property: font-family,\n      class: font,\n      values: (monospace: var(--#{$prefix}font-monospace))\n    ),\n    \"font-size\": (\n      rfs: true,\n      property: font-size,\n      class: fs,\n      values: $font-sizes\n    ),\n    \"font-style\": (\n      property: font-style,\n      class: fst,\n      values: italic normal\n    ),\n    \"font-weight\": (\n      property: font-weight,\n      class: fw,\n      values: (\n        lighter: $font-weight-lighter,\n        light: $font-weight-light,\n        normal: $font-weight-normal,\n        medium: $font-weight-medium,\n        semibold: $font-weight-semibold,\n        bold: $font-weight-bold,\n        bolder: $font-weight-bolder\n      )\n    ),\n    \"line-height\": (\n      property: line-height,\n      class: lh,\n      values: (\n        1: 1,\n        sm: $line-height-sm,\n        base: $line-height-base,\n        lg: $line-height-lg,\n      )\n    ),\n    \"text-align\": (\n      responsive: true,\n      property: text-align,\n      class: text,\n      values: (\n        start: left,\n        end: right,\n        center: center,\n      )\n    ),\n    \"text-decoration\": (\n      property: text-decoration,\n      values: none underline line-through\n    ),\n    \"text-transform\": (\n      property: text-transform,\n      class: text,\n      values: lowercase uppercase capitalize\n    ),\n    \"white-space\": (\n      property: white-space,\n      class: text,\n      values: (\n        wrap: normal,\n        nowrap: nowrap,\n      )\n    ),\n    \"word-wrap\": (\n      property: word-wrap word-break,\n      class: text,\n      values: (break: break-word),\n      rtl: false\n    ),\n    // scss-docs-end utils-text\n    // scss-docs-start utils-color\n    \"color\": (\n      property: color,\n      class: text,\n      local-vars: (\n        \"text-opacity\": 1\n      ),\n      values: map-merge(\n        $utilities-text-colors,\n        (\n          \"muted\": var(--#{$prefix}secondary-color), // deprecated\n          \"black-50\": rgba($black, .5), // deprecated\n          \"white-50\": rgba($white, .5), // deprecated\n          \"body-secondary\": var(--#{$prefix}secondary-color),\n          \"body-tertiary\": var(--#{$prefix}tertiary-color),\n          \"body-emphasis\": var(--#{$prefix}emphasis-color),\n          \"reset\": inherit,\n        )\n      )\n    ),\n    \"text-opacity\": (\n      css-var: true,\n      class: text-opacity,\n      values: (\n        25: .25,\n        50: .5,\n        75: .75,\n        100: 1\n      )\n    ),\n    \"text-color\": (\n      property: color,\n      class: text,\n      values: $utilities-text-emphasis-colors\n    ),\n    // scss-docs-end utils-color\n    // scss-docs-start utils-links\n    \"link-opacity\": (\n      css-var: true,\n      class: link-opacity,\n      state: hover,\n      values: (\n        10: .1,\n        25: .25,\n        50: .5,\n        75: .75,\n        100: 1\n      )\n    ),\n    \"link-offset\": (\n      property: text-underline-offset,\n      class: link-offset,\n      state: hover,\n      values: (\n        1: .125em,\n        2: .25em,\n        3: .375em,\n      )\n    ),\n    \"link-underline\": (\n      property: text-decoration-color,\n      class: link-underline,\n      local-vars: (\n        \"link-underline-opacity\": 1\n      ),\n      values: map-merge(\n        $utilities-links-underline,\n        (\n          null: rgba(var(--#{$prefix}link-color-rgb), var(--#{$prefix}link-underline-opacity, 1)),\n        )\n      )\n    ),\n    \"link-underline-opacity\": (\n      css-var: true,\n      class: link-underline-opacity,\n      state: hover,\n      values: (\n        0: 0,\n        10: .1,\n        25: .25,\n        50: .5,\n        75: .75,\n        100: 1\n      ),\n    ),\n    // scss-docs-end utils-links\n    // scss-docs-start utils-bg-color\n    \"background-color\": (\n      property: background-color,\n      class: bg,\n      local-vars: (\n        \"bg-opacity\": 1\n      ),\n      values: map-merge(\n        $utilities-bg-colors,\n        (\n          \"transparent\": transparent,\n          \"body-secondary\": rgba(var(--#{$prefix}secondary-bg-rgb), var(--#{$prefix}bg-opacity)),\n          \"body-tertiary\": rgba(var(--#{$prefix}tertiary-bg-rgb), var(--#{$prefix}bg-opacity)),\n        )\n      )\n    ),\n    \"bg-opacity\": (\n      css-var: true,\n      class: bg-opacity,\n      values: (\n        10: .1,\n        25: .25,\n        50: .5,\n        75: .75,\n        100: 1\n      )\n    ),\n    \"subtle-background-color\": (\n      property: background-color,\n      class: bg,\n      values: $utilities-bg-subtle\n    ),\n    // scss-docs-end utils-bg-color\n    \"gradient\": (\n      property: background-image,\n      class: bg,\n      values: (gradient: var(--#{$prefix}gradient))\n    ),\n    // scss-docs-start utils-interaction\n    \"user-select\": (\n      property: user-select,\n      values: all auto none\n    ),\n    \"pointer-events\": (\n      property: pointer-events,\n      class: pe,\n      values: none auto,\n    ),\n    // scss-docs-end utils-interaction\n    // scss-docs-start utils-border-radius\n    \"rounded\": (\n      property: border-radius,\n      class: rounded,\n      values: (\n        null: var(--#{$prefix}border-radius),\n        0: 0,\n        1: var(--#{$prefix}border-radius-sm),\n        2: var(--#{$prefix}border-radius),\n        3: var(--#{$prefix}border-radius-lg),\n        4: var(--#{$prefix}border-radius-xl),\n        5: var(--#{$prefix}border-radius-xxl),\n        circle: 50%,\n        pill: var(--#{$prefix}border-radius-pill)\n      )\n    ),\n    \"rounded-top\": (\n      property: border-top-left-radius border-top-right-radius,\n      class: rounded-top,\n      values: (\n        null: var(--#{$prefix}border-radius),\n        0: 0,\n        1: var(--#{$prefix}border-radius-sm),\n        2: var(--#{$prefix}border-radius),\n        3: var(--#{$prefix}border-radius-lg),\n        4: var(--#{$prefix}border-radius-xl),\n        5: var(--#{$prefix}border-radius-xxl),\n        circle: 50%,\n        pill: var(--#{$prefix}border-radius-pill)\n      )\n    ),\n    \"rounded-end\": (\n      property: border-top-right-radius border-bottom-right-radius,\n      class: rounded-end,\n      values: (\n        null: var(--#{$prefix}border-radius),\n        0: 0,\n        1: var(--#{$prefix}border-radius-sm),\n        2: var(--#{$prefix}border-radius),\n        3: var(--#{$prefix}border-radius-lg),\n        4: var(--#{$prefix}border-radius-xl),\n        5: var(--#{$prefix}border-radius-xxl),\n        circle: 50%,\n        pill: var(--#{$prefix}border-radius-pill)\n      )\n    ),\n    \"rounded-bottom\": (\n      property: border-bottom-right-radius border-bottom-left-radius,\n      class: rounded-bottom,\n      values: (\n        null: var(--#{$prefix}border-radius),\n        0: 0,\n        1: var(--#{$prefix}border-radius-sm),\n        2: var(--#{$prefix}border-radius),\n        3: var(--#{$prefix}border-radius-lg),\n        4: var(--#{$prefix}border-radius-xl),\n        5: var(--#{$prefix}border-radius-xxl),\n        circle: 50%,\n        pill: var(--#{$prefix}border-radius-pill)\n      )\n    ),\n    \"rounded-start\": (\n      property: border-bottom-left-radius border-top-left-radius,\n      class: rounded-start,\n      values: (\n        null: var(--#{$prefix}border-radius),\n        0: 0,\n        1: var(--#{$prefix}border-radius-sm),\n        2: var(--#{$prefix}border-radius),\n        3: var(--#{$prefix}border-radius-lg),\n        4: var(--#{$prefix}border-radius-xl),\n        5: var(--#{$prefix}border-radius-xxl),\n        circle: 50%,\n        pill: var(--#{$prefix}border-radius-pill)\n      )\n    ),\n    // scss-docs-end utils-border-radius\n    // scss-docs-start utils-visibility\n    \"visibility\": (\n      property: visibility,\n      class: null,\n      values: (\n        visible: visible,\n        invisible: hidden,\n      )\n    ),\n    // scss-docs-end utils-visibility\n    // scss-docs-start utils-zindex\n    \"z-index\": (\n      property: z-index,\n      class: z,\n      values: $zindex-levels,\n    )\n    // scss-docs-end utils-zindex\n  ),\n  $utilities\n);\n"
  },
  {
    "path": "scss/_variables-dark.scss",
    "content": "// Dark color mode variables\n//\n// Custom variables for the `[data-bs-theme=\"dark\"]` theme. Use this as a starting point for your own custom color modes by creating a new theme-specific file like `_variables-dark.scss` and adding the variables you need.\n\n//\n// Global colors\n//\n\n// scss-docs-start sass-dark-mode-vars\n// scss-docs-start theme-text-dark-variables\n$primary-text-emphasis-dark:        tint-color($primary, 40%) !default;\n$secondary-text-emphasis-dark:      tint-color($secondary, 40%) !default;\n$success-text-emphasis-dark:        tint-color($success, 40%) !default;\n$info-text-emphasis-dark:           tint-color($info, 40%) !default;\n$warning-text-emphasis-dark:        tint-color($warning, 40%) !default;\n$danger-text-emphasis-dark:         tint-color($danger, 40%) !default;\n$light-text-emphasis-dark:          $gray-100 !default;\n$dark-text-emphasis-dark:           $gray-300 !default;\n// scss-docs-end theme-text-dark-variables\n\n// scss-docs-start theme-bg-subtle-dark-variables\n$primary-bg-subtle-dark:            shade-color($primary, 80%) !default;\n$secondary-bg-subtle-dark:          shade-color($secondary, 80%) !default;\n$success-bg-subtle-dark:            shade-color($success, 80%) !default;\n$info-bg-subtle-dark:               shade-color($info, 80%) !default;\n$warning-bg-subtle-dark:            shade-color($warning, 80%) !default;\n$danger-bg-subtle-dark:             shade-color($danger, 80%) !default;\n$light-bg-subtle-dark:              $gray-800 !default;\n$dark-bg-subtle-dark:               mix($gray-800, $black) !default;\n// scss-docs-end theme-bg-subtle-dark-variables\n\n// scss-docs-start theme-border-subtle-dark-variables\n$primary-border-subtle-dark:        shade-color($primary, 40%) !default;\n$secondary-border-subtle-dark:      shade-color($secondary, 40%) !default;\n$success-border-subtle-dark:        shade-color($success, 40%) !default;\n$info-border-subtle-dark:           shade-color($info, 40%) !default;\n$warning-border-subtle-dark:        shade-color($warning, 40%) !default;\n$danger-border-subtle-dark:         shade-color($danger, 40%) !default;\n$light-border-subtle-dark:          $gray-700 !default;\n$dark-border-subtle-dark:           $gray-800 !default;\n// scss-docs-end theme-border-subtle-dark-variables\n\n$body-color-dark:                   $gray-300 !default;\n$body-bg-dark:                      $gray-900 !default;\n$body-secondary-color-dark:         rgba($body-color-dark, .75) !default;\n$body-secondary-bg-dark:            $gray-800 !default;\n$body-tertiary-color-dark:          rgba($body-color-dark, .5) !default;\n$body-tertiary-bg-dark:             mix($gray-800, $gray-900, 50%) !default;\n$body-emphasis-color-dark:          $white !default;\n$border-color-dark:                 $gray-700 !default;\n$border-color-translucent-dark:     rgba($white, .15) !default;\n$headings-color-dark:               inherit !default;\n$link-color-dark:                   tint-color($primary, 40%) !default;\n$link-hover-color-dark:             shift-color($link-color-dark, -$link-shade-percentage) !default;\n$code-color-dark:                   tint-color($code-color, 40%) !default;\n$mark-color-dark:                   $body-color-dark !default;\n$mark-bg-dark:                      $yellow-800 !default;\n\n\n//\n// Forms\n//\n\n$form-select-indicator-color-dark:  $body-color-dark !default;\n$form-select-indicator-dark:        url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'><path fill='none' stroke='#{$form-select-indicator-color-dark}' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/></svg>\") !default;\n\n$form-switch-color-dark:            rgba($white, .25) !default;\n$form-switch-bg-image-dark:         url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'><circle r='3' fill='#{$form-switch-color-dark}'/></svg>\") !default;\n\n// scss-docs-start form-validation-colors-dark\n$form-valid-color-dark:             $green-300 !default;\n$form-valid-border-color-dark:      $green-300 !default;\n$form-invalid-color-dark:           $red-300 !default;\n$form-invalid-border-color-dark:    $red-300 !default;\n// scss-docs-end form-validation-colors-dark\n\n\n//\n// Accordion\n//\n\n$accordion-icon-color-dark:         $primary-text-emphasis-dark !default;\n$accordion-icon-active-color-dark:  $primary-text-emphasis-dark !default;\n\n$accordion-button-icon-dark:         url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='#{$accordion-icon-color-dark}'><path fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708'/></svg>\") !default;\n$accordion-button-active-icon-dark:  url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='#{$accordion-icon-active-color-dark}'><path fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708'/></svg>\") !default;\n// scss-docs-end sass-dark-mode-vars\n\n\n//\n// Carousel\n//\n\n$carousel-indicator-active-bg-dark:   $carousel-dark-indicator-active-bg !default;\n$carousel-caption-color-dark:         $carousel-dark-caption-color !default;\n$carousel-control-icon-filter-dark:   $carousel-dark-control-icon-filter !default;\n\n//\n// Close button\n//\n\n$btn-close-filter-dark:             $btn-close-white-filter !default;\n"
  },
  {
    "path": "scss/_variables.scss",
    "content": "// Variables\n//\n// Variables should follow the `$component-state-property-size` formula for\n// consistent naming. Ex: $nav-link-disabled-color and $modal-content-box-shadow-xs.\n\n// Color system\n\n// scss-docs-start gray-color-variables\n$white:    #fff !default;\n$gray-100: #f8f9fa !default;\n$gray-200: #e9ecef !default;\n$gray-300: #dee2e6 !default;\n$gray-400: #ced4da !default;\n$gray-500: #adb5bd !default;\n$gray-600: #6c757d !default;\n$gray-700: #495057 !default;\n$gray-800: #343a40 !default;\n$gray-900: #212529 !default;\n$black:    #000 !default;\n// scss-docs-end gray-color-variables\n\n// fusv-disable\n// scss-docs-start gray-colors-map\n$grays: (\n  \"100\": $gray-100,\n  \"200\": $gray-200,\n  \"300\": $gray-300,\n  \"400\": $gray-400,\n  \"500\": $gray-500,\n  \"600\": $gray-600,\n  \"700\": $gray-700,\n  \"800\": $gray-800,\n  \"900\": $gray-900\n) !default;\n// scss-docs-end gray-colors-map\n// fusv-enable\n\n// scss-docs-start color-variables\n$blue:    #0d6efd !default;\n$indigo:  #6610f2 !default;\n$purple:  #6f42c1 !default;\n$pink:    #d63384 !default;\n$red:     #dc3545 !default;\n$orange:  #fd7e14 !default;\n$yellow:  #ffc107 !default;\n$green:   #198754 !default;\n$teal:    #20c997 !default;\n$cyan:    #0dcaf0 !default;\n// scss-docs-end color-variables\n\n// scss-docs-start colors-map\n$colors: (\n  \"blue\":       $blue,\n  \"indigo\":     $indigo,\n  \"purple\":     $purple,\n  \"pink\":       $pink,\n  \"red\":        $red,\n  \"orange\":     $orange,\n  \"yellow\":     $yellow,\n  \"green\":      $green,\n  \"teal\":       $teal,\n  \"cyan\":       $cyan,\n  \"black\":      $black,\n  \"white\":      $white,\n  \"gray\":       $gray-600,\n  \"gray-dark\":  $gray-800\n) !default;\n// scss-docs-end colors-map\n\n// The contrast ratio to reach against white, to determine if color changes from \"light\" to \"dark\". Acceptable values for WCAG 2.2 are 3, 4.5 and 7.\n// See https://www.w3.org/TR/WCAG/#contrast-minimum\n$min-contrast-ratio:   4.5 !default;\n\n// Customize the light and dark text colors for use in our color contrast function.\n$color-contrast-dark:      $black !default;\n$color-contrast-light:     $white !default;\n\n// fusv-disable\n$blue-100: tint-color($blue, 80%) !default;\n$blue-200: tint-color($blue, 60%) !default;\n$blue-300: tint-color($blue, 40%) !default;\n$blue-400: tint-color($blue, 20%) !default;\n$blue-500: $blue !default;\n$blue-600: shade-color($blue, 20%) !default;\n$blue-700: shade-color($blue, 40%) !default;\n$blue-800: shade-color($blue, 60%) !default;\n$blue-900: shade-color($blue, 80%) !default;\n\n$indigo-100: tint-color($indigo, 80%) !default;\n$indigo-200: tint-color($indigo, 60%) !default;\n$indigo-300: tint-color($indigo, 40%) !default;\n$indigo-400: tint-color($indigo, 20%) !default;\n$indigo-500: $indigo !default;\n$indigo-600: shade-color($indigo, 20%) !default;\n$indigo-700: shade-color($indigo, 40%) !default;\n$indigo-800: shade-color($indigo, 60%) !default;\n$indigo-900: shade-color($indigo, 80%) !default;\n\n$purple-100: tint-color($purple, 80%) !default;\n$purple-200: tint-color($purple, 60%) !default;\n$purple-300: tint-color($purple, 40%) !default;\n$purple-400: tint-color($purple, 20%) !default;\n$purple-500: $purple !default;\n$purple-600: shade-color($purple, 20%) !default;\n$purple-700: shade-color($purple, 40%) !default;\n$purple-800: shade-color($purple, 60%) !default;\n$purple-900: shade-color($purple, 80%) !default;\n\n$pink-100: tint-color($pink, 80%) !default;\n$pink-200: tint-color($pink, 60%) !default;\n$pink-300: tint-color($pink, 40%) !default;\n$pink-400: tint-color($pink, 20%) !default;\n$pink-500: $pink !default;\n$pink-600: shade-color($pink, 20%) !default;\n$pink-700: shade-color($pink, 40%) !default;\n$pink-800: shade-color($pink, 60%) !default;\n$pink-900: shade-color($pink, 80%) !default;\n\n$red-100: tint-color($red, 80%) !default;\n$red-200: tint-color($red, 60%) !default;\n$red-300: tint-color($red, 40%) !default;\n$red-400: tint-color($red, 20%) !default;\n$red-500: $red !default;\n$red-600: shade-color($red, 20%) !default;\n$red-700: shade-color($red, 40%) !default;\n$red-800: shade-color($red, 60%) !default;\n$red-900: shade-color($red, 80%) !default;\n\n$orange-100: tint-color($orange, 80%) !default;\n$orange-200: tint-color($orange, 60%) !default;\n$orange-300: tint-color($orange, 40%) !default;\n$orange-400: tint-color($orange, 20%) !default;\n$orange-500: $orange !default;\n$orange-600: shade-color($orange, 20%) !default;\n$orange-700: shade-color($orange, 40%) !default;\n$orange-800: shade-color($orange, 60%) !default;\n$orange-900: shade-color($orange, 80%) !default;\n\n$yellow-100: tint-color($yellow, 80%) !default;\n$yellow-200: tint-color($yellow, 60%) !default;\n$yellow-300: tint-color($yellow, 40%) !default;\n$yellow-400: tint-color($yellow, 20%) !default;\n$yellow-500: $yellow !default;\n$yellow-600: shade-color($yellow, 20%) !default;\n$yellow-700: shade-color($yellow, 40%) !default;\n$yellow-800: shade-color($yellow, 60%) !default;\n$yellow-900: shade-color($yellow, 80%) !default;\n\n$green-100: tint-color($green, 80%) !default;\n$green-200: tint-color($green, 60%) !default;\n$green-300: tint-color($green, 40%) !default;\n$green-400: tint-color($green, 20%) !default;\n$green-500: $green !default;\n$green-600: shade-color($green, 20%) !default;\n$green-700: shade-color($green, 40%) !default;\n$green-800: shade-color($green, 60%) !default;\n$green-900: shade-color($green, 80%) !default;\n\n$teal-100: tint-color($teal, 80%) !default;\n$teal-200: tint-color($teal, 60%) !default;\n$teal-300: tint-color($teal, 40%) !default;\n$teal-400: tint-color($teal, 20%) !default;\n$teal-500: $teal !default;\n$teal-600: shade-color($teal, 20%) !default;\n$teal-700: shade-color($teal, 40%) !default;\n$teal-800: shade-color($teal, 60%) !default;\n$teal-900: shade-color($teal, 80%) !default;\n\n$cyan-100: tint-color($cyan, 80%) !default;\n$cyan-200: tint-color($cyan, 60%) !default;\n$cyan-300: tint-color($cyan, 40%) !default;\n$cyan-400: tint-color($cyan, 20%) !default;\n$cyan-500: $cyan !default;\n$cyan-600: shade-color($cyan, 20%) !default;\n$cyan-700: shade-color($cyan, 40%) !default;\n$cyan-800: shade-color($cyan, 60%) !default;\n$cyan-900: shade-color($cyan, 80%) !default;\n\n$blues: (\n  \"blue-100\": $blue-100,\n  \"blue-200\": $blue-200,\n  \"blue-300\": $blue-300,\n  \"blue-400\": $blue-400,\n  \"blue-500\": $blue-500,\n  \"blue-600\": $blue-600,\n  \"blue-700\": $blue-700,\n  \"blue-800\": $blue-800,\n  \"blue-900\": $blue-900\n) !default;\n\n$indigos: (\n  \"indigo-100\": $indigo-100,\n  \"indigo-200\": $indigo-200,\n  \"indigo-300\": $indigo-300,\n  \"indigo-400\": $indigo-400,\n  \"indigo-500\": $indigo-500,\n  \"indigo-600\": $indigo-600,\n  \"indigo-700\": $indigo-700,\n  \"indigo-800\": $indigo-800,\n  \"indigo-900\": $indigo-900\n) !default;\n\n$purples: (\n  \"purple-100\": $purple-100,\n  \"purple-200\": $purple-200,\n  \"purple-300\": $purple-300,\n  \"purple-400\": $purple-400,\n  \"purple-500\": $purple-500,\n  \"purple-600\": $purple-600,\n  \"purple-700\": $purple-700,\n  \"purple-800\": $purple-800,\n  \"purple-900\": $purple-900\n) !default;\n\n$pinks: (\n  \"pink-100\": $pink-100,\n  \"pink-200\": $pink-200,\n  \"pink-300\": $pink-300,\n  \"pink-400\": $pink-400,\n  \"pink-500\": $pink-500,\n  \"pink-600\": $pink-600,\n  \"pink-700\": $pink-700,\n  \"pink-800\": $pink-800,\n  \"pink-900\": $pink-900\n) !default;\n\n$reds: (\n  \"red-100\": $red-100,\n  \"red-200\": $red-200,\n  \"red-300\": $red-300,\n  \"red-400\": $red-400,\n  \"red-500\": $red-500,\n  \"red-600\": $red-600,\n  \"red-700\": $red-700,\n  \"red-800\": $red-800,\n  \"red-900\": $red-900\n) !default;\n\n$oranges: (\n  \"orange-100\": $orange-100,\n  \"orange-200\": $orange-200,\n  \"orange-300\": $orange-300,\n  \"orange-400\": $orange-400,\n  \"orange-500\": $orange-500,\n  \"orange-600\": $orange-600,\n  \"orange-700\": $orange-700,\n  \"orange-800\": $orange-800,\n  \"orange-900\": $orange-900\n) !default;\n\n$yellows: (\n  \"yellow-100\": $yellow-100,\n  \"yellow-200\": $yellow-200,\n  \"yellow-300\": $yellow-300,\n  \"yellow-400\": $yellow-400,\n  \"yellow-500\": $yellow-500,\n  \"yellow-600\": $yellow-600,\n  \"yellow-700\": $yellow-700,\n  \"yellow-800\": $yellow-800,\n  \"yellow-900\": $yellow-900\n) !default;\n\n$greens: (\n  \"green-100\": $green-100,\n  \"green-200\": $green-200,\n  \"green-300\": $green-300,\n  \"green-400\": $green-400,\n  \"green-500\": $green-500,\n  \"green-600\": $green-600,\n  \"green-700\": $green-700,\n  \"green-800\": $green-800,\n  \"green-900\": $green-900\n) !default;\n\n$teals: (\n  \"teal-100\": $teal-100,\n  \"teal-200\": $teal-200,\n  \"teal-300\": $teal-300,\n  \"teal-400\": $teal-400,\n  \"teal-500\": $teal-500,\n  \"teal-600\": $teal-600,\n  \"teal-700\": $teal-700,\n  \"teal-800\": $teal-800,\n  \"teal-900\": $teal-900\n) !default;\n\n$cyans: (\n  \"cyan-100\": $cyan-100,\n  \"cyan-200\": $cyan-200,\n  \"cyan-300\": $cyan-300,\n  \"cyan-400\": $cyan-400,\n  \"cyan-500\": $cyan-500,\n  \"cyan-600\": $cyan-600,\n  \"cyan-700\": $cyan-700,\n  \"cyan-800\": $cyan-800,\n  \"cyan-900\": $cyan-900\n) !default;\n// fusv-enable\n\n// scss-docs-start theme-color-variables\n$primary:       $blue !default;\n$secondary:     $gray-600 !default;\n$success:       $green !default;\n$info:          $cyan !default;\n$warning:       $yellow !default;\n$danger:        $red !default;\n$light:         $gray-100 !default;\n$dark:          $gray-900 !default;\n// scss-docs-end theme-color-variables\n\n// scss-docs-start theme-colors-map\n$theme-colors: (\n  \"primary\":    $primary,\n  \"secondary\":  $secondary,\n  \"success\":    $success,\n  \"info\":       $info,\n  \"warning\":    $warning,\n  \"danger\":     $danger,\n  \"light\":      $light,\n  \"dark\":       $dark\n) !default;\n// scss-docs-end theme-colors-map\n\n// scss-docs-start theme-text-variables\n$primary-text-emphasis:   shade-color($primary, 60%) !default;\n$secondary-text-emphasis: shade-color($secondary, 60%) !default;\n$success-text-emphasis:   shade-color($success, 60%) !default;\n$info-text-emphasis:      shade-color($info, 60%) !default;\n$warning-text-emphasis:   shade-color($warning, 60%) !default;\n$danger-text-emphasis:    shade-color($danger, 60%) !default;\n$light-text-emphasis:     $gray-700 !default;\n$dark-text-emphasis:      $gray-700 !default;\n// scss-docs-end theme-text-variables\n\n// scss-docs-start theme-bg-subtle-variables\n$primary-bg-subtle:       tint-color($primary, 80%) !default;\n$secondary-bg-subtle:     tint-color($secondary, 80%) !default;\n$success-bg-subtle:       tint-color($success, 80%) !default;\n$info-bg-subtle:          tint-color($info, 80%) !default;\n$warning-bg-subtle:       tint-color($warning, 80%) !default;\n$danger-bg-subtle:        tint-color($danger, 80%) !default;\n$light-bg-subtle:         mix($gray-100, $white) !default;\n$dark-bg-subtle:          $gray-400 !default;\n// scss-docs-end theme-bg-subtle-variables\n\n// scss-docs-start theme-border-subtle-variables\n$primary-border-subtle:   tint-color($primary, 60%) !default;\n$secondary-border-subtle: tint-color($secondary, 60%) !default;\n$success-border-subtle:   tint-color($success, 60%) !default;\n$info-border-subtle:      tint-color($info, 60%) !default;\n$warning-border-subtle:   tint-color($warning, 60%) !default;\n$danger-border-subtle:    tint-color($danger, 60%) !default;\n$light-border-subtle:     $gray-200 !default;\n$dark-border-subtle:      $gray-500 !default;\n// scss-docs-end theme-border-subtle-variables\n\n// Characters which are escaped by the escape-svg function\n$escaped-characters: (\n  (\"<\", \"%3c\"),\n  (\">\", \"%3e\"),\n  (\"#\", \"%23\"),\n  (\"(\", \"%28\"),\n  (\")\", \"%29\"),\n) !default;\n\n// Options\n//\n// Quickly modify global styling by enabling or disabling optional features.\n\n$enable-caret:                true !default;\n$enable-rounded:              true !default;\n$enable-shadows:              false !default;\n$enable-gradients:            false !default;\n$enable-transitions:          true !default;\n$enable-reduced-motion:       true !default;\n$enable-smooth-scroll:        true !default;\n$enable-grid-classes:         true !default;\n$enable-container-classes:    true !default;\n$enable-cssgrid:              false !default;\n$enable-button-pointers:      true !default;\n$enable-rfs:                  true !default;\n$enable-validation-icons:     true !default;\n$enable-negative-margins:     false !default;\n$enable-deprecation-messages: true !default;\n$enable-important-utilities:  true !default;\n\n$enable-dark-mode:            true !default;\n$color-mode-type:             data !default; // `data` or `media-query`\n\n// Prefix for :root CSS variables\n\n$variable-prefix:             bs- !default; // Deprecated in v5.2.0 for the shorter `$prefix`\n$prefix:                      $variable-prefix !default;\n\n// Gradient\n//\n// The gradient which is added to components if `$enable-gradients` is `true`\n// This gradient is also added to elements with `.bg-gradient`\n// scss-docs-start variable-gradient\n$gradient: linear-gradient(180deg, rgba($white, .15), rgba($white, 0)) !default;\n// scss-docs-end variable-gradient\n\n// Spacing\n//\n// Control the default styling of most Bootstrap elements by modifying these\n// variables. Mostly focused on spacing.\n// You can add more entries to the $spacers map, should you need more variation.\n\n// scss-docs-start spacer-variables-maps\n$spacer: 1rem !default;\n$spacers: (\n  0: 0,\n  1: $spacer * .25,\n  2: $spacer * .5,\n  3: $spacer,\n  4: $spacer * 1.5,\n  5: $spacer * 3,\n) !default;\n// scss-docs-end spacer-variables-maps\n\n// Position\n//\n// Define the edge positioning anchors of the position utilities.\n\n// scss-docs-start position-map\n$position-values: (\n  0: 0,\n  50: 50%,\n  100: 100%\n) !default;\n// scss-docs-end position-map\n\n// Body\n//\n// Settings for the `<body>` element.\n\n$body-text-align:           null !default;\n$body-color:                $gray-900 !default;\n$body-bg:                   $white !default;\n\n$body-secondary-color:      rgba($body-color, .75) !default;\n$body-secondary-bg:         $gray-200 !default;\n\n$body-tertiary-color:       rgba($body-color, .5) !default;\n$body-tertiary-bg:          $gray-100 !default;\n\n$body-emphasis-color:       $black !default;\n\n// Links\n//\n// Style anchor elements.\n\n$link-color:                              $primary !default;\n$link-decoration:                         underline !default;\n$link-shade-percentage:                   20% !default;\n$link-hover-color:                        shift-color($link-color, $link-shade-percentage) !default;\n$link-hover-decoration:                   null !default;\n\n$stretched-link-pseudo-element:           after !default;\n$stretched-link-z-index:                  1 !default;\n\n// Icon links\n// scss-docs-start icon-link-variables\n$icon-link-gap:               .375rem !default;\n$icon-link-underline-offset:  .25em !default;\n$icon-link-icon-size:         1em !default;\n$icon-link-icon-transition:   .2s ease-in-out transform !default;\n$icon-link-icon-transform:    translate3d(.25em, 0, 0) !default;\n// scss-docs-end icon-link-variables\n\n// Paragraphs\n//\n// Style p element.\n\n$paragraph-margin-bottom:   1rem !default;\n\n\n// Grid breakpoints\n//\n// Define the minimum dimensions at which your layout will change,\n// adapting to different screen sizes, for use in media queries.\n\n// scss-docs-start grid-breakpoints\n$grid-breakpoints: (\n  xs: 0,\n  sm: 576px,\n  md: 768px,\n  lg: 992px,\n  xl: 1200px,\n  xxl: 1400px\n) !default;\n// scss-docs-end grid-breakpoints\n\n@include _assert-ascending($grid-breakpoints, \"$grid-breakpoints\");\n@include _assert-starts-at-zero($grid-breakpoints, \"$grid-breakpoints\");\n\n\n// Grid containers\n//\n// Define the maximum width of `.container` for different screen sizes.\n\n// scss-docs-start container-max-widths\n$container-max-widths: (\n  sm: 540px,\n  md: 720px,\n  lg: 960px,\n  xl: 1140px,\n  xxl: 1320px\n) !default;\n// scss-docs-end container-max-widths\n\n@include _assert-ascending($container-max-widths, \"$container-max-widths\");\n\n\n// Grid columns\n//\n// Set the number of columns and specify the width of the gutters.\n\n$grid-columns:                12 !default;\n$grid-gutter-width:           1.5rem !default;\n$grid-row-columns:            6 !default;\n\n// Container padding\n\n$container-padding-x: $grid-gutter-width !default;\n\n\n// Components\n//\n// Define common padding and border radius sizes and more.\n\n// scss-docs-start border-variables\n$border-width:                1px !default;\n$border-widths: (\n  1: 1px,\n  2: 2px,\n  3: 3px,\n  4: 4px,\n  5: 5px\n) !default;\n$border-style:                solid !default;\n$border-color:                $gray-300 !default;\n$border-color-translucent:    rgba($black, .175) !default;\n// scss-docs-end border-variables\n\n// scss-docs-start border-radius-variables\n$border-radius:               .375rem !default;\n$border-radius-sm:            .25rem !default;\n$border-radius-lg:            .5rem !default;\n$border-radius-xl:            1rem !default;\n$border-radius-xxl:           2rem !default;\n$border-radius-pill:          50rem !default;\n// scss-docs-end border-radius-variables\n// fusv-disable\n$border-radius-2xl:           $border-radius-xxl !default; // Deprecated in v5.3.0\n// fusv-enable\n\n// scss-docs-start box-shadow-variables\n$box-shadow:                  0 .5rem 1rem rgba($black, .15) !default;\n$box-shadow-sm:               0 .125rem .25rem rgba($black, .075) !default;\n$box-shadow-lg:               0 1rem 3rem rgba($black, .175) !default;\n$box-shadow-inset:            inset 0 1px 2px rgba($black, .075) !default;\n// scss-docs-end box-shadow-variables\n\n$component-active-color:      $white !default;\n$component-active-bg:         $primary !default;\n\n// scss-docs-start focus-ring-variables\n$focus-ring-width:      .25rem !default;\n$focus-ring-opacity:    .25 !default;\n$focus-ring-color:      rgba($primary, $focus-ring-opacity) !default;\n$focus-ring-blur:       0 !default;\n$focus-ring-box-shadow: 0 0 $focus-ring-blur $focus-ring-width $focus-ring-color !default;\n// scss-docs-end focus-ring-variables\n\n// scss-docs-start caret-variables\n$caret-width:                 .3em !default;\n$caret-vertical-align:        $caret-width * .85 !default;\n$caret-spacing:               $caret-width * .85 !default;\n// scss-docs-end caret-variables\n\n$transition-base:             all .2s ease-in-out !default;\n$transition-fade:             opacity .15s linear !default;\n// scss-docs-start collapse-transition\n$transition-collapse:         height .35s ease !default;\n$transition-collapse-width:   width .35s ease !default;\n// scss-docs-end collapse-transition\n\n// stylelint-disable function-disallowed-list\n// scss-docs-start aspect-ratios\n$aspect-ratios: (\n  \"1x1\": 100%,\n  \"4x3\": calc(3 / 4 * 100%),\n  \"16x9\": calc(9 / 16 * 100%),\n  \"21x9\": calc(9 / 21 * 100%)\n) !default;\n// scss-docs-end aspect-ratios\n// stylelint-enable function-disallowed-list\n\n// Typography\n//\n// Font, line-height, and color for body text, headings, and more.\n\n// scss-docs-start font-variables\n// stylelint-disable value-keyword-case\n$font-family-sans-serif:      system-ui, -apple-system, \"Segoe UI\", Roboto, \"Helvetica Neue\", \"Noto Sans\", \"Liberation Sans\", Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\" !default;\n$font-family-monospace:       SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace !default;\n// stylelint-enable value-keyword-case\n$font-family-base:            var(--#{$prefix}font-sans-serif) !default;\n$font-family-code:            var(--#{$prefix}font-monospace) !default;\n\n// $font-size-root affects the value of `rem`, which is used for as well font sizes, paddings, and margins\n// $font-size-base affects the font size of the body text\n$font-size-root:              null !default;\n$font-size-base:              1rem !default; // Assumes the browser default, typically `16px`\n$font-size-sm:                $font-size-base * .875 !default;\n$font-size-lg:                $font-size-base * 1.25 !default;\n\n$font-weight-lighter:         lighter !default;\n$font-weight-light:           300 !default;\n$font-weight-normal:          400 !default;\n$font-weight-medium:          500 !default;\n$font-weight-semibold:        600 !default;\n$font-weight-bold:            700 !default;\n$font-weight-bolder:          bolder !default;\n\n$font-weight-base:            $font-weight-normal !default;\n\n$line-height-base:            1.5 !default;\n$line-height-sm:              1.25 !default;\n$line-height-lg:              2 !default;\n\n$h1-font-size:                $font-size-base * 2.5 !default;\n$h2-font-size:                $font-size-base * 2 !default;\n$h3-font-size:                $font-size-base * 1.75 !default;\n$h4-font-size:                $font-size-base * 1.5 !default;\n$h5-font-size:                $font-size-base * 1.25 !default;\n$h6-font-size:                $font-size-base !default;\n// scss-docs-end font-variables\n\n// scss-docs-start font-sizes\n$font-sizes: (\n  1: $h1-font-size,\n  2: $h2-font-size,\n  3: $h3-font-size,\n  4: $h4-font-size,\n  5: $h5-font-size,\n  6: $h6-font-size\n) !default;\n// scss-docs-end font-sizes\n\n// scss-docs-start headings-variables\n$headings-margin-bottom:      $spacer * .5 !default;\n$headings-font-family:        null !default;\n$headings-font-style:         null !default;\n$headings-font-weight:        500 !default;\n$headings-line-height:        1.2 !default;\n$headings-color:              inherit !default;\n// scss-docs-end headings-variables\n\n// scss-docs-start display-headings\n$display-font-sizes: (\n  1: 5rem,\n  2: 4.5rem,\n  3: 4rem,\n  4: 3.5rem,\n  5: 3rem,\n  6: 2.5rem\n) !default;\n\n$display-font-family: null !default;\n$display-font-style:  null !default;\n$display-font-weight: 300 !default;\n$display-line-height: $headings-line-height !default;\n// scss-docs-end display-headings\n\n// scss-docs-start type-variables\n$lead-font-size:              $font-size-base * 1.25 !default;\n$lead-font-weight:            300 !default;\n\n$small-font-size:             .875em !default;\n\n$sub-sup-font-size:           .75em !default;\n\n// fusv-disable\n$text-muted:                  var(--#{$prefix}secondary-color) !default; // Deprecated in 5.3.0\n// fusv-enable\n\n$initialism-font-size:        $small-font-size !default;\n\n$blockquote-margin-y:         $spacer !default;\n$blockquote-font-size:        $font-size-base * 1.25 !default;\n$blockquote-footer-color:     $gray-600 !default;\n$blockquote-footer-font-size: $small-font-size !default;\n\n$hr-margin-y:                 $spacer !default;\n$hr-color:                    inherit !default;\n\n// fusv-disable\n$hr-bg-color:                 null !default; // Deprecated in v5.2.0\n$hr-height:                   null !default; // Deprecated in v5.2.0\n// fusv-enable\n\n$hr-border-color:             null !default; // Allows for inherited colors\n$hr-border-width:             var(--#{$prefix}border-width) !default;\n$hr-opacity:                  .25 !default;\n\n// scss-docs-start vr-variables\n$vr-border-width:             var(--#{$prefix}border-width) !default;\n// scss-docs-end vr-variables\n\n$legend-margin-bottom:        .5rem !default;\n$legend-font-size:            1.5rem !default;\n$legend-font-weight:          null !default;\n\n$dt-font-weight:              $font-weight-bold !default;\n\n$list-inline-padding:         .5rem !default;\n\n$mark-padding:                .1875em !default;\n$mark-color:                  $body-color !default;\n$mark-bg:                     $yellow-100 !default;\n// scss-docs-end type-variables\n\n\n// Tables\n//\n// Customizes the `.table` component with basic values, each used across all table variations.\n\n// scss-docs-start table-variables\n$table-cell-padding-y:        .5rem !default;\n$table-cell-padding-x:        .5rem !default;\n$table-cell-padding-y-sm:     .25rem !default;\n$table-cell-padding-x-sm:     .25rem !default;\n\n$table-cell-vertical-align:   top !default;\n\n$table-color:                 var(--#{$prefix}emphasis-color) !default;\n$table-bg:                    var(--#{$prefix}body-bg) !default;\n$table-accent-bg:             transparent !default;\n\n$table-th-font-weight:        null !default;\n\n$table-striped-color:         $table-color !default;\n$table-striped-bg-factor:     .05 !default;\n$table-striped-bg:            rgba(var(--#{$prefix}emphasis-color-rgb), $table-striped-bg-factor) !default;\n\n$table-active-color:          $table-color !default;\n$table-active-bg-factor:      .1 !default;\n$table-active-bg:             rgba(var(--#{$prefix}emphasis-color-rgb), $table-active-bg-factor) !default;\n\n$table-hover-color:           $table-color !default;\n$table-hover-bg-factor:       .075 !default;\n$table-hover-bg:              rgba(var(--#{$prefix}emphasis-color-rgb), $table-hover-bg-factor) !default;\n\n$table-border-factor:         .2 !default;\n$table-border-width:          var(--#{$prefix}border-width) !default;\n$table-border-color:          var(--#{$prefix}border-color) !default;\n\n$table-striped-order:         odd !default;\n$table-striped-columns-order: even !default;\n\n$table-group-separator-color: currentcolor !default;\n\n$table-caption-color:         var(--#{$prefix}secondary-color) !default;\n\n$table-bg-scale:              -80% !default;\n// scss-docs-end table-variables\n\n// scss-docs-start table-loop\n$table-variants: (\n  \"primary\":    shift-color($primary, $table-bg-scale),\n  \"secondary\":  shift-color($secondary, $table-bg-scale),\n  \"success\":    shift-color($success, $table-bg-scale),\n  \"info\":       shift-color($info, $table-bg-scale),\n  \"warning\":    shift-color($warning, $table-bg-scale),\n  \"danger\":     shift-color($danger, $table-bg-scale),\n  \"light\":      $light,\n  \"dark\":       $dark,\n) !default;\n// scss-docs-end table-loop\n\n\n// Buttons + Forms\n//\n// Shared variables that are reassigned to `$input-` and `$btn-` specific variables.\n\n// scss-docs-start input-btn-variables\n$input-btn-padding-y:         .375rem !default;\n$input-btn-padding-x:         .75rem !default;\n$input-btn-font-family:       null !default;\n$input-btn-font-size:         $font-size-base !default;\n$input-btn-line-height:       $line-height-base !default;\n\n$input-btn-focus-width:         $focus-ring-width !default;\n$input-btn-focus-color-opacity: $focus-ring-opacity !default;\n$input-btn-focus-color:         $focus-ring-color !default;\n$input-btn-focus-blur:          $focus-ring-blur !default;\n$input-btn-focus-box-shadow:    $focus-ring-box-shadow !default;\n\n$input-btn-padding-y-sm:      .25rem !default;\n$input-btn-padding-x-sm:      .5rem !default;\n$input-btn-font-size-sm:      $font-size-sm !default;\n\n$input-btn-padding-y-lg:      .5rem !default;\n$input-btn-padding-x-lg:      1rem !default;\n$input-btn-font-size-lg:      $font-size-lg !default;\n\n$input-btn-border-width:      var(--#{$prefix}border-width) !default;\n// scss-docs-end input-btn-variables\n\n\n// Buttons\n//\n// For each of Bootstrap's buttons, define text, background, and border color.\n\n// scss-docs-start btn-variables\n$btn-color:                   var(--#{$prefix}body-color) !default;\n$btn-padding-y:               $input-btn-padding-y !default;\n$btn-padding-x:               $input-btn-padding-x !default;\n$btn-font-family:             $input-btn-font-family !default;\n$btn-font-size:               $input-btn-font-size !default;\n$btn-line-height:             $input-btn-line-height !default;\n$btn-white-space:             null !default; // Set to `nowrap` to prevent text wrapping\n\n$btn-padding-y-sm:            $input-btn-padding-y-sm !default;\n$btn-padding-x-sm:            $input-btn-padding-x-sm !default;\n$btn-font-size-sm:            $input-btn-font-size-sm !default;\n\n$btn-padding-y-lg:            $input-btn-padding-y-lg !default;\n$btn-padding-x-lg:            $input-btn-padding-x-lg !default;\n$btn-font-size-lg:            $input-btn-font-size-lg !default;\n\n$btn-border-width:            $input-btn-border-width !default;\n\n$btn-font-weight:             $font-weight-normal !default;\n$btn-box-shadow:              inset 0 1px 0 rgba($white, .15), 0 1px 1px rgba($black, .075) !default;\n$btn-focus-width:             $input-btn-focus-width !default;\n$btn-focus-box-shadow:        $input-btn-focus-box-shadow !default;\n$btn-disabled-opacity:        .65 !default;\n$btn-active-box-shadow:       inset 0 3px 5px rgba($black, .125) !default;\n\n$btn-link-color:              var(--#{$prefix}link-color) !default;\n$btn-link-hover-color:        var(--#{$prefix}link-hover-color) !default;\n$btn-link-disabled-color:     $gray-600 !default;\n$btn-link-focus-shadow-rgb:   to-rgb(mix(color-contrast($link-color), $link-color, 15%)) !default;\n\n// Allows for customizing button radius independently from global border radius\n$btn-border-radius:           var(--#{$prefix}border-radius) !default;\n$btn-border-radius-sm:        var(--#{$prefix}border-radius-sm) !default;\n$btn-border-radius-lg:        var(--#{$prefix}border-radius-lg) !default;\n\n$btn-transition:              color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$btn-hover-bg-shade-amount:       15% !default;\n$btn-hover-bg-tint-amount:        15% !default;\n$btn-hover-border-shade-amount:   20% !default;\n$btn-hover-border-tint-amount:    10% !default;\n$btn-active-bg-shade-amount:      20% !default;\n$btn-active-bg-tint-amount:       20% !default;\n$btn-active-border-shade-amount:  25% !default;\n$btn-active-border-tint-amount:   10% !default;\n// scss-docs-end btn-variables\n\n\n// Forms\n\n// scss-docs-start form-text-variables\n$form-text-margin-top:                  .25rem !default;\n$form-text-font-size:                   $small-font-size !default;\n$form-text-font-style:                  null !default;\n$form-text-font-weight:                 null !default;\n$form-text-color:                       var(--#{$prefix}secondary-color) !default;\n// scss-docs-end form-text-variables\n\n// scss-docs-start form-label-variables\n$form-label-margin-bottom:              .5rem !default;\n$form-label-font-size:                  null !default;\n$form-label-font-style:                 null !default;\n$form-label-font-weight:                null !default;\n$form-label-color:                      null !default;\n// scss-docs-end form-label-variables\n\n// scss-docs-start form-input-variables\n$input-padding-y:                       $input-btn-padding-y !default;\n$input-padding-x:                       $input-btn-padding-x !default;\n$input-font-family:                     $input-btn-font-family !default;\n$input-font-size:                       $input-btn-font-size !default;\n$input-font-weight:                     $font-weight-base !default;\n$input-line-height:                     $input-btn-line-height !default;\n\n$input-padding-y-sm:                    $input-btn-padding-y-sm !default;\n$input-padding-x-sm:                    $input-btn-padding-x-sm !default;\n$input-font-size-sm:                    $input-btn-font-size-sm !default;\n\n$input-padding-y-lg:                    $input-btn-padding-y-lg !default;\n$input-padding-x-lg:                    $input-btn-padding-x-lg !default;\n$input-font-size-lg:                    $input-btn-font-size-lg !default;\n\n$input-bg:                              var(--#{$prefix}body-bg) !default;\n$input-disabled-color:                  null !default;\n$input-disabled-bg:                     var(--#{$prefix}secondary-bg) !default;\n$input-disabled-border-color:           null !default;\n\n$input-color:                           var(--#{$prefix}body-color) !default;\n$input-border-color:                    var(--#{$prefix}border-color) !default;\n$input-border-width:                    $input-btn-border-width !default;\n$input-box-shadow:                      var(--#{$prefix}box-shadow-inset) !default;\n\n$input-border-radius:                   var(--#{$prefix}border-radius) !default;\n$input-border-radius-sm:                var(--#{$prefix}border-radius-sm) !default;\n$input-border-radius-lg:                var(--#{$prefix}border-radius-lg) !default;\n\n$input-focus-bg:                        $input-bg !default;\n$input-focus-border-color:              tint-color($component-active-bg, 50%) !default;\n$input-focus-color:                     $input-color !default;\n$input-focus-width:                     $input-btn-focus-width !default;\n$input-focus-box-shadow:                $input-btn-focus-box-shadow !default;\n\n$input-placeholder-color:               var(--#{$prefix}secondary-color) !default;\n$input-plaintext-color:                 var(--#{$prefix}body-color) !default;\n\n$input-height-border:                   calc(#{$input-border-width} * 2) !default; // stylelint-disable-line function-disallowed-list\n\n$input-height-inner:                    add($input-line-height * 1em, $input-padding-y * 2) !default;\n$input-height-inner-half:               add($input-line-height * .5em, $input-padding-y) !default;\n$input-height-inner-quarter:            add($input-line-height * .25em, $input-padding-y * .5) !default;\n\n$input-height:                          add($input-line-height * 1em, add($input-padding-y * 2, $input-height-border, false)) !default;\n$input-height-sm:                       add($input-line-height * 1em, add($input-padding-y-sm * 2, $input-height-border, false)) !default;\n$input-height-lg:                       add($input-line-height * 1em, add($input-padding-y-lg * 2, $input-height-border, false)) !default;\n\n$input-transition:                      border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$form-color-width:                      3rem !default;\n// scss-docs-end form-input-variables\n\n// scss-docs-start form-check-variables\n$form-check-input-width:                  1em !default;\n$form-check-min-height:                   $font-size-base * $line-height-base !default;\n$form-check-padding-start:                $form-check-input-width + .5em !default;\n$form-check-margin-bottom:                .125rem !default;\n$form-check-label-color:                  null !default;\n$form-check-label-cursor:                 null !default;\n$form-check-transition:                   null !default;\n\n$form-check-input-active-filter:          brightness(90%) !default;\n\n$form-check-input-bg:                     $input-bg !default;\n$form-check-input-border:                 var(--#{$prefix}border-width) solid var(--#{$prefix}border-color) !default;\n$form-check-input-border-radius:          .25em !default;\n$form-check-radio-border-radius:          50% !default;\n$form-check-input-focus-border:           $input-focus-border-color !default;\n$form-check-input-focus-box-shadow:       $focus-ring-box-shadow !default;\n\n$form-check-input-checked-color:          $component-active-color !default;\n$form-check-input-checked-bg-color:       $component-active-bg !default;\n$form-check-input-checked-border-color:   $form-check-input-checked-bg-color !default;\n$form-check-input-checked-bg-image:       url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'><path fill='none' stroke='#{$form-check-input-checked-color}' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/></svg>\") !default;\n$form-check-radio-checked-bg-image:       url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'><circle r='2' fill='#{$form-check-input-checked-color}'/></svg>\") !default;\n\n$form-check-input-indeterminate-color:          $component-active-color !default;\n$form-check-input-indeterminate-bg-color:       $component-active-bg !default;\n$form-check-input-indeterminate-border-color:   $form-check-input-indeterminate-bg-color !default;\n$form-check-input-indeterminate-bg-image:       url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'><path fill='none' stroke='#{$form-check-input-indeterminate-color}' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/></svg>\") !default;\n\n$form-check-input-disabled-opacity:        .5 !default;\n$form-check-label-disabled-opacity:        $form-check-input-disabled-opacity !default;\n$form-check-btn-check-disabled-opacity:    $btn-disabled-opacity !default;\n\n$form-check-inline-margin-end:    1rem !default;\n// scss-docs-end form-check-variables\n\n// scss-docs-start form-switch-variables\n$form-switch-color:               rgba($black, .25) !default;\n$form-switch-width:               2em !default;\n$form-switch-padding-start:       $form-switch-width + .5em !default;\n$form-switch-bg-image:            url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'><circle r='3' fill='#{$form-switch-color}'/></svg>\") !default;\n$form-switch-border-radius:       $form-switch-width !default;\n$form-switch-transition:          background-position .15s ease-in-out !default;\n\n$form-switch-focus-color:         $input-focus-border-color !default;\n$form-switch-focus-bg-image:      url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'><circle r='3' fill='#{$form-switch-focus-color}'/></svg>\") !default;\n\n$form-switch-checked-color:       $component-active-color !default;\n$form-switch-checked-bg-image:    url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'><circle r='3' fill='#{$form-switch-checked-color}'/></svg>\") !default;\n$form-switch-checked-bg-position: right center !default;\n// scss-docs-end form-switch-variables\n\n// scss-docs-start input-group-variables\n$input-group-addon-padding-y:           $input-padding-y !default;\n$input-group-addon-padding-x:           $input-padding-x !default;\n$input-group-addon-font-weight:         $input-font-weight !default;\n$input-group-addon-color:               $input-color !default;\n$input-group-addon-bg:                  var(--#{$prefix}tertiary-bg) !default;\n$input-group-addon-border-color:        $input-border-color !default;\n// scss-docs-end input-group-variables\n\n// scss-docs-start form-select-variables\n$form-select-padding-y:             $input-padding-y !default;\n$form-select-padding-x:             $input-padding-x !default;\n$form-select-font-family:           $input-font-family !default;\n$form-select-font-size:             $input-font-size !default;\n$form-select-indicator-padding:     $form-select-padding-x * 3 !default; // Extra padding for background-image\n$form-select-font-weight:           $input-font-weight !default;\n$form-select-line-height:           $input-line-height !default;\n$form-select-color:                 $input-color !default;\n$form-select-bg:                    $input-bg !default;\n$form-select-disabled-color:        null !default;\n$form-select-disabled-bg:           $input-disabled-bg !default;\n$form-select-disabled-border-color: $input-disabled-border-color !default;\n$form-select-bg-position:           right $form-select-padding-x center !default;\n$form-select-bg-size:               16px 12px !default; // In pixels because image dimensions\n$form-select-indicator-color:       $gray-800 !default;\n$form-select-indicator:             url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'><path fill='none' stroke='#{$form-select-indicator-color}' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/></svg>\") !default;\n\n$form-select-feedback-icon-padding-end: $form-select-padding-x * 2.5 + $form-select-indicator-padding !default;\n$form-select-feedback-icon-position:    center right $form-select-indicator-padding !default;\n$form-select-feedback-icon-size:        $input-height-inner-half $input-height-inner-half !default;\n\n$form-select-border-width:        $input-border-width !default;\n$form-select-border-color:        $input-border-color !default;\n$form-select-border-radius:       $input-border-radius !default;\n$form-select-box-shadow:          var(--#{$prefix}box-shadow-inset) !default;\n\n$form-select-focus-border-color:  $input-focus-border-color !default;\n$form-select-focus-width:         $input-focus-width !default;\n$form-select-focus-box-shadow:    0 0 0 $form-select-focus-width $input-btn-focus-color !default;\n\n$form-select-padding-y-sm:        $input-padding-y-sm !default;\n$form-select-padding-x-sm:        $input-padding-x-sm !default;\n$form-select-font-size-sm:        $input-font-size-sm !default;\n$form-select-border-radius-sm:    $input-border-radius-sm !default;\n\n$form-select-padding-y-lg:        $input-padding-y-lg !default;\n$form-select-padding-x-lg:        $input-padding-x-lg !default;\n$form-select-font-size-lg:        $input-font-size-lg !default;\n$form-select-border-radius-lg:    $input-border-radius-lg !default;\n\n$form-select-transition:          $input-transition !default;\n// scss-docs-end form-select-variables\n\n// scss-docs-start form-range-variables\n$form-range-track-width:          100% !default;\n$form-range-track-height:         .5rem !default;\n$form-range-track-cursor:         pointer !default;\n$form-range-track-bg:             var(--#{$prefix}secondary-bg) !default;\n$form-range-track-border-radius:  1rem !default;\n$form-range-track-box-shadow:     var(--#{$prefix}box-shadow-inset) !default;\n\n$form-range-thumb-width:                   1rem !default;\n$form-range-thumb-height:                  $form-range-thumb-width !default;\n$form-range-thumb-bg:                      $component-active-bg !default;\n$form-range-thumb-border:                  0 !default;\n$form-range-thumb-border-radius:           1rem !default;\n$form-range-thumb-box-shadow:              0 .1rem .25rem rgba($black, .1) !default;\n$form-range-thumb-focus-box-shadow:        0 0 0 1px $body-bg, $input-focus-box-shadow !default;\n$form-range-thumb-focus-box-shadow-width:  $input-focus-width !default; // For focus box shadow issue in Edge\n$form-range-thumb-active-bg:               tint-color($component-active-bg, 70%) !default;\n$form-range-thumb-disabled-bg:             var(--#{$prefix}secondary-color) !default;\n$form-range-thumb-transition:              background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n// scss-docs-end form-range-variables\n\n// scss-docs-start form-file-variables\n$form-file-button-color:          $input-color !default;\n$form-file-button-bg:             var(--#{$prefix}tertiary-bg) !default;\n$form-file-button-hover-bg:       var(--#{$prefix}secondary-bg) !default;\n// scss-docs-end form-file-variables\n\n// scss-docs-start form-floating-variables\n$form-floating-height:                  add(3.5rem, $input-height-border) !default;\n$form-floating-line-height:             1.25 !default;\n$form-floating-padding-x:               $input-padding-x !default;\n$form-floating-padding-y:               1rem !default;\n$form-floating-input-padding-t:         1.625rem !default;\n$form-floating-input-padding-b:         .625rem !default;\n$form-floating-label-height:            1.5em !default;\n$form-floating-label-opacity:           .65 !default;\n$form-floating-label-transform:         scale(.85) translateY(-.5rem) translateX(.15rem) !default;\n$form-floating-label-disabled-color:    $gray-600 !default;\n$form-floating-transition:              opacity .1s ease-in-out, transform .1s ease-in-out !default;\n// scss-docs-end form-floating-variables\n\n// Form validation\n\n// scss-docs-start form-feedback-variables\n$form-feedback-margin-top:          $form-text-margin-top !default;\n$form-feedback-font-size:           $form-text-font-size !default;\n$form-feedback-font-style:          $form-text-font-style !default;\n$form-feedback-valid-color:         $success !default;\n$form-feedback-invalid-color:       $danger !default;\n\n$form-feedback-icon-valid-color:    $form-feedback-valid-color !default;\n$form-feedback-icon-valid:          url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'><path fill='#{$form-feedback-icon-valid-color}' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1'/></svg>\") !default;\n$form-feedback-icon-invalid-color:  $form-feedback-invalid-color !default;\n$form-feedback-icon-invalid:        url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='#{$form-feedback-icon-invalid-color}'><circle cx='6' cy='6' r='4.5'/><path stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/><circle cx='6' cy='8.2' r='.6' fill='#{$form-feedback-icon-invalid-color}' stroke='none'/></svg>\") !default;\n// scss-docs-end form-feedback-variables\n\n// scss-docs-start form-validation-colors\n$form-valid-color:                  $form-feedback-valid-color !default;\n$form-valid-border-color:           $form-feedback-valid-color !default;\n$form-invalid-color:                $form-feedback-invalid-color !default;\n$form-invalid-border-color:         $form-feedback-invalid-color !default;\n// scss-docs-end form-validation-colors\n\n// scss-docs-start form-validation-states\n$form-validation-states: (\n  \"valid\": (\n    \"color\": var(--#{$prefix}form-valid-color),\n    \"icon\": $form-feedback-icon-valid,\n    \"tooltip-color\": #fff,\n    \"tooltip-bg-color\": var(--#{$prefix}success),\n    \"focus-box-shadow\": 0 0 $input-btn-focus-blur $input-focus-width rgba(var(--#{$prefix}success-rgb), $input-btn-focus-color-opacity),\n    \"border-color\": var(--#{$prefix}form-valid-border-color),\n  ),\n  \"invalid\": (\n    \"color\": var(--#{$prefix}form-invalid-color),\n    \"icon\": $form-feedback-icon-invalid,\n    \"tooltip-color\": #fff,\n    \"tooltip-bg-color\": var(--#{$prefix}danger),\n    \"focus-box-shadow\": 0 0 $input-btn-focus-blur $input-focus-width rgba(var(--#{$prefix}danger-rgb), $input-btn-focus-color-opacity),\n    \"border-color\": var(--#{$prefix}form-invalid-border-color),\n  )\n) !default;\n// scss-docs-end form-validation-states\n\n// Z-index master list\n//\n// Warning: Avoid customizing these values. They're used for a bird's eye view\n// of components dependent on the z-axis and are designed to all work together.\n\n// scss-docs-start zindex-stack\n$zindex-dropdown:                   1000 !default;\n$zindex-sticky:                     1020 !default;\n$zindex-fixed:                      1030 !default;\n$zindex-offcanvas-backdrop:         1040 !default;\n$zindex-offcanvas:                  1045 !default;\n$zindex-modal-backdrop:             1050 !default;\n$zindex-modal:                      1055 !default;\n$zindex-popover:                    1070 !default;\n$zindex-tooltip:                    1080 !default;\n$zindex-toast:                      1090 !default;\n// scss-docs-end zindex-stack\n\n// scss-docs-start zindex-levels-map\n$zindex-levels: (\n  n1: -1,\n  0: 0,\n  1: 1,\n  2: 2,\n  3: 3\n) !default;\n// scss-docs-end zindex-levels-map\n\n\n// Navs\n\n// scss-docs-start nav-variables\n$nav-link-padding-y:                .5rem !default;\n$nav-link-padding-x:                1rem !default;\n$nav-link-font-size:                null !default;\n$nav-link-font-weight:              null !default;\n$nav-link-color:                    var(--#{$prefix}link-color) !default;\n$nav-link-hover-color:              var(--#{$prefix}link-hover-color) !default;\n$nav-link-transition:               color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out !default;\n$nav-link-disabled-color:           var(--#{$prefix}secondary-color) !default;\n$nav-link-focus-box-shadow:         $focus-ring-box-shadow !default;\n\n$nav-tabs-border-color:             var(--#{$prefix}border-color) !default;\n$nav-tabs-border-width:             var(--#{$prefix}border-width) !default;\n$nav-tabs-border-radius:            var(--#{$prefix}border-radius) !default;\n$nav-tabs-link-hover-border-color:  var(--#{$prefix}secondary-bg) var(--#{$prefix}secondary-bg) $nav-tabs-border-color !default;\n$nav-tabs-link-active-color:        var(--#{$prefix}emphasis-color) !default;\n$nav-tabs-link-active-bg:           var(--#{$prefix}body-bg) !default;\n$nav-tabs-link-active-border-color: var(--#{$prefix}border-color) var(--#{$prefix}border-color) $nav-tabs-link-active-bg !default;\n\n$nav-pills-border-radius:           var(--#{$prefix}border-radius) !default;\n$nav-pills-link-active-color:       $component-active-color !default;\n$nav-pills-link-active-bg:          $component-active-bg !default;\n\n$nav-underline-gap:                 1rem !default;\n$nav-underline-border-width:        .125rem !default;\n$nav-underline-link-active-color:   var(--#{$prefix}emphasis-color) !default;\n// scss-docs-end nav-variables\n\n\n// Navbar\n\n// scss-docs-start navbar-variables\n$navbar-padding-y:                  $spacer * .5 !default;\n$navbar-padding-x:                  null !default;\n\n$navbar-nav-link-padding-x:         .5rem !default;\n\n$navbar-brand-font-size:            $font-size-lg !default;\n// Compute the navbar-brand padding-y so the navbar-brand will have the same height as navbar-text and nav-link\n$nav-link-height:                   $font-size-base * $line-height-base + $nav-link-padding-y * 2 !default;\n$navbar-brand-height:               $navbar-brand-font-size * $line-height-base !default;\n$navbar-brand-padding-y:            ($nav-link-height - $navbar-brand-height) * .5 !default;\n$navbar-brand-margin-end:           1rem !default;\n\n$navbar-toggler-padding-y:          .25rem !default;\n$navbar-toggler-padding-x:          .75rem !default;\n$navbar-toggler-font-size:          $font-size-lg !default;\n$navbar-toggler-border-radius:      $btn-border-radius !default;\n$navbar-toggler-focus-width:        $btn-focus-width !default;\n$navbar-toggler-transition:         box-shadow .15s ease-in-out !default;\n\n$navbar-light-color:                rgba(var(--#{$prefix}emphasis-color-rgb), .65) !default;\n$navbar-light-hover-color:          rgba(var(--#{$prefix}emphasis-color-rgb), .8) !default;\n$navbar-light-active-color:         rgba(var(--#{$prefix}emphasis-color-rgb), 1) !default;\n$navbar-light-disabled-color:       rgba(var(--#{$prefix}emphasis-color-rgb), .3) !default;\n$navbar-light-icon-color:           rgba($body-color, .75) !default;\n$navbar-light-toggler-icon-bg:      url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'><path stroke='#{$navbar-light-icon-color}' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/></svg>\") !default;\n$navbar-light-toggler-border-color: rgba(var(--#{$prefix}emphasis-color-rgb), .15) !default;\n$navbar-light-brand-color:          $navbar-light-active-color !default;\n$navbar-light-brand-hover-color:    $navbar-light-active-color !default;\n// scss-docs-end navbar-variables\n\n// scss-docs-start navbar-dark-variables\n$navbar-dark-color:                 rgba($white, .55) !default;\n$navbar-dark-hover-color:           rgba($white, .75) !default;\n$navbar-dark-active-color:          $white !default;\n$navbar-dark-disabled-color:        rgba($white, .25) !default;\n$navbar-dark-icon-color:            $navbar-dark-color !default;\n$navbar-dark-toggler-icon-bg:       url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'><path stroke='#{$navbar-dark-icon-color}' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/></svg>\") !default;\n$navbar-dark-toggler-border-color:  rgba($white, .1) !default;\n$navbar-dark-brand-color:           $navbar-dark-active-color !default;\n$navbar-dark-brand-hover-color:     $navbar-dark-active-color !default;\n// scss-docs-end navbar-dark-variables\n\n\n// Dropdowns\n//\n// Dropdown menu container and contents.\n\n// scss-docs-start dropdown-variables\n$dropdown-min-width:                10rem !default;\n$dropdown-padding-x:                0 !default;\n$dropdown-padding-y:                .5rem !default;\n$dropdown-spacer:                   .125rem !default;\n$dropdown-font-size:                $font-size-base !default;\n$dropdown-color:                    var(--#{$prefix}body-color) !default;\n$dropdown-bg:                       var(--#{$prefix}body-bg) !default;\n$dropdown-border-color:             var(--#{$prefix}border-color-translucent) !default;\n$dropdown-border-radius:            var(--#{$prefix}border-radius) !default;\n$dropdown-border-width:             var(--#{$prefix}border-width) !default;\n$dropdown-inner-border-radius:      calc(#{$dropdown-border-radius} - #{$dropdown-border-width}) !default; // stylelint-disable-line function-disallowed-list\n$dropdown-divider-bg:               $dropdown-border-color !default;\n$dropdown-divider-margin-y:         $spacer * .5 !default;\n$dropdown-box-shadow:               var(--#{$prefix}box-shadow) !default;\n\n$dropdown-link-color:               var(--#{$prefix}body-color) !default;\n$dropdown-link-hover-color:         $dropdown-link-color !default;\n$dropdown-link-hover-bg:            var(--#{$prefix}tertiary-bg) !default;\n\n$dropdown-link-active-color:        $component-active-color !default;\n$dropdown-link-active-bg:           $component-active-bg !default;\n\n$dropdown-link-disabled-color:      var(--#{$prefix}tertiary-color) !default;\n\n$dropdown-item-padding-y:           $spacer * .25 !default;\n$dropdown-item-padding-x:           $spacer !default;\n\n$dropdown-header-color:             $gray-600 !default;\n$dropdown-header-padding-x:         $dropdown-item-padding-x !default;\n$dropdown-header-padding-y:         $dropdown-padding-y !default;\n// fusv-disable\n$dropdown-header-padding:           $dropdown-header-padding-y $dropdown-header-padding-x !default; // Deprecated in v5.2.0\n// fusv-enable\n// scss-docs-end dropdown-variables\n\n// scss-docs-start dropdown-dark-variables\n$dropdown-dark-color:               $gray-300 !default;\n$dropdown-dark-bg:                  $gray-800 !default;\n$dropdown-dark-border-color:        $dropdown-border-color !default;\n$dropdown-dark-divider-bg:          $dropdown-divider-bg !default;\n$dropdown-dark-box-shadow:          null !default;\n$dropdown-dark-link-color:          $dropdown-dark-color !default;\n$dropdown-dark-link-hover-color:    $white !default;\n$dropdown-dark-link-hover-bg:       rgba($white, .15) !default;\n$dropdown-dark-link-active-color:   $dropdown-link-active-color !default;\n$dropdown-dark-link-active-bg:      $dropdown-link-active-bg !default;\n$dropdown-dark-link-disabled-color: $gray-500 !default;\n$dropdown-dark-header-color:        $gray-500 !default;\n// scss-docs-end dropdown-dark-variables\n\n\n// Pagination\n\n// scss-docs-start pagination-variables\n$pagination-padding-y:              .375rem !default;\n$pagination-padding-x:              .75rem !default;\n$pagination-padding-y-sm:           .25rem !default;\n$pagination-padding-x-sm:           .5rem !default;\n$pagination-padding-y-lg:           .75rem !default;\n$pagination-padding-x-lg:           1.5rem !default;\n\n$pagination-font-size:              $font-size-base !default;\n\n$pagination-color:                  var(--#{$prefix}link-color) !default;\n$pagination-bg:                     var(--#{$prefix}body-bg) !default;\n$pagination-border-radius:          var(--#{$prefix}border-radius) !default;\n$pagination-border-width:           var(--#{$prefix}border-width) !default;\n$pagination-margin-start:           calc(-1 * #{$pagination-border-width}) !default; // stylelint-disable-line function-disallowed-list\n$pagination-border-color:           var(--#{$prefix}border-color) !default;\n\n$pagination-focus-color:            var(--#{$prefix}link-hover-color) !default;\n$pagination-focus-bg:               var(--#{$prefix}secondary-bg) !default;\n$pagination-focus-box-shadow:       $focus-ring-box-shadow !default;\n$pagination-focus-outline:          0 !default;\n\n$pagination-hover-color:            var(--#{$prefix}link-hover-color) !default;\n$pagination-hover-bg:               var(--#{$prefix}tertiary-bg) !default;\n$pagination-hover-border-color:     var(--#{$prefix}border-color) !default; // Todo in v6: remove this?\n\n$pagination-active-color:           $component-active-color !default;\n$pagination-active-bg:              $component-active-bg !default;\n$pagination-active-border-color:    $component-active-bg !default;\n\n$pagination-disabled-color:         var(--#{$prefix}secondary-color) !default;\n$pagination-disabled-bg:            var(--#{$prefix}secondary-bg) !default;\n$pagination-disabled-border-color:  var(--#{$prefix}border-color) !default;\n\n$pagination-transition:              color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$pagination-border-radius-sm:       var(--#{$prefix}border-radius-sm) !default;\n$pagination-border-radius-lg:       var(--#{$prefix}border-radius-lg) !default;\n// scss-docs-end pagination-variables\n\n\n// Placeholders\n\n// scss-docs-start placeholders\n$placeholder-opacity-max:           .5 !default;\n$placeholder-opacity-min:           .2 !default;\n// scss-docs-end placeholders\n\n// Cards\n\n// scss-docs-start card-variables\n$card-spacer-y:                     $spacer !default;\n$card-spacer-x:                     $spacer !default;\n$card-title-spacer-y:               $spacer * .5 !default;\n$card-title-color:                  null !default;\n$card-subtitle-color:               null !default;\n$card-border-width:                 var(--#{$prefix}border-width) !default;\n$card-border-color:                 var(--#{$prefix}border-color-translucent) !default;\n$card-border-radius:                var(--#{$prefix}border-radius) !default;\n$card-box-shadow:                   null !default;\n$card-inner-border-radius:          subtract($card-border-radius, $card-border-width) !default;\n$card-cap-padding-y:                $card-spacer-y * .5 !default;\n$card-cap-padding-x:                $card-spacer-x !default;\n$card-cap-bg:                       rgba(var(--#{$prefix}body-color-rgb), .03) !default;\n$card-cap-color:                    null !default;\n$card-height:                       null !default;\n$card-color:                        null !default;\n$card-bg:                           var(--#{$prefix}body-bg) !default;\n$card-img-overlay-padding:          $spacer !default;\n$card-group-margin:                 $grid-gutter-width * .5 !default;\n// scss-docs-end card-variables\n\n// Accordion\n\n// scss-docs-start accordion-variables\n$accordion-padding-y:                     1rem !default;\n$accordion-padding-x:                     1.25rem !default;\n$accordion-color:                         var(--#{$prefix}body-color) !default;\n$accordion-bg:                            var(--#{$prefix}body-bg) !default;\n$accordion-border-width:                  var(--#{$prefix}border-width) !default;\n$accordion-border-color:                  var(--#{$prefix}border-color) !default;\n$accordion-border-radius:                 var(--#{$prefix}border-radius) !default;\n$accordion-inner-border-radius:           subtract($accordion-border-radius, $accordion-border-width) !default;\n\n$accordion-body-padding-y:                $accordion-padding-y !default;\n$accordion-body-padding-x:                $accordion-padding-x !default;\n\n$accordion-button-padding-y:              $accordion-padding-y !default;\n$accordion-button-padding-x:              $accordion-padding-x !default;\n$accordion-button-color:                  var(--#{$prefix}body-color) !default;\n$accordion-button-bg:                     var(--#{$prefix}accordion-bg) !default;\n$accordion-transition:                    $btn-transition, border-radius .15s ease !default;\n$accordion-button-active-bg:              var(--#{$prefix}primary-bg-subtle) !default;\n$accordion-button-active-color:           var(--#{$prefix}primary-text-emphasis) !default;\n\n// fusv-disable\n$accordion-button-focus-border-color:     $input-focus-border-color !default; // Deprecated in v5.3.3\n// fusv-enable\n$accordion-button-focus-box-shadow:       $btn-focus-box-shadow !default;\n\n$accordion-icon-width:                    1.25rem !default;\n$accordion-icon-color:                    $body-color !default;\n$accordion-icon-active-color:             $primary-text-emphasis !default;\n$accordion-icon-transition:               transform .2s ease-in-out !default;\n$accordion-icon-transform:                rotate(-180deg) !default;\n\n$accordion-button-icon:         url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='#{$accordion-icon-color}' stroke-linecap='round' stroke-linejoin='round'><path d='m2 5 6 6 6-6'/></svg>\") !default;\n$accordion-button-active-icon:  url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='#{$accordion-icon-active-color}' stroke-linecap='round' stroke-linejoin='round'><path d='m2 5 6 6 6-6'/></svg>\") !default;\n// scss-docs-end accordion-variables\n\n// Tooltips\n\n// scss-docs-start tooltip-variables\n$tooltip-font-size:                 $font-size-sm !default;\n$tooltip-max-width:                 200px !default;\n$tooltip-color:                     var(--#{$prefix}body-bg) !default;\n$tooltip-bg:                        var(--#{$prefix}emphasis-color) !default;\n$tooltip-border-radius:             var(--#{$prefix}border-radius) !default;\n$tooltip-opacity:                   .9 !default;\n$tooltip-padding-y:                 $spacer * .25 !default;\n$tooltip-padding-x:                 $spacer * .5 !default;\n$tooltip-margin:                    null !default; // TODO: remove this in v6\n\n$tooltip-arrow-width:               .8rem !default;\n$tooltip-arrow-height:              .4rem !default;\n// fusv-disable\n$tooltip-arrow-color:               null !default; // Deprecated in Bootstrap 5.2.0 for CSS variables\n// fusv-enable\n// scss-docs-end tooltip-variables\n\n// Form tooltips must come after regular tooltips\n// scss-docs-start tooltip-feedback-variables\n$form-feedback-tooltip-padding-y:     $tooltip-padding-y !default;\n$form-feedback-tooltip-padding-x:     $tooltip-padding-x !default;\n$form-feedback-tooltip-font-size:     $tooltip-font-size !default;\n$form-feedback-tooltip-line-height:   null !default;\n$form-feedback-tooltip-opacity:       $tooltip-opacity !default;\n$form-feedback-tooltip-border-radius: $tooltip-border-radius !default;\n// scss-docs-end tooltip-feedback-variables\n\n\n// Popovers\n\n// scss-docs-start popover-variables\n$popover-font-size:                 $font-size-sm !default;\n$popover-bg:                        var(--#{$prefix}body-bg) !default;\n$popover-max-width:                 276px !default;\n$popover-border-width:              var(--#{$prefix}border-width) !default;\n$popover-border-color:              var(--#{$prefix}border-color-translucent) !default;\n$popover-border-radius:             var(--#{$prefix}border-radius-lg) !default;\n$popover-inner-border-radius:       calc(#{$popover-border-radius} - #{$popover-border-width}) !default; // stylelint-disable-line function-disallowed-list\n$popover-box-shadow:                var(--#{$prefix}box-shadow) !default;\n\n$popover-header-font-size:          $font-size-base !default;\n$popover-header-bg:                 var(--#{$prefix}secondary-bg) !default;\n$popover-header-color:              $headings-color !default;\n$popover-header-padding-y:          .5rem !default;\n$popover-header-padding-x:          $spacer !default;\n\n$popover-body-color:                var(--#{$prefix}body-color) !default;\n$popover-body-padding-y:            $spacer !default;\n$popover-body-padding-x:            $spacer !default;\n\n$popover-arrow-width:               1rem !default;\n$popover-arrow-height:              .5rem !default;\n// scss-docs-end popover-variables\n\n// fusv-disable\n// Deprecated in Bootstrap 5.2.0 for CSS variables\n$popover-arrow-color:               $popover-bg !default;\n$popover-arrow-outer-color:         var(--#{$prefix}border-color-translucent) !default;\n// fusv-enable\n\n\n// Toasts\n\n// scss-docs-start toast-variables\n$toast-max-width:                   350px !default;\n$toast-padding-x:                   .75rem !default;\n$toast-padding-y:                   .5rem !default;\n$toast-font-size:                   .875rem !default;\n$toast-color:                       null !default;\n$toast-background-color:            rgba(var(--#{$prefix}body-bg-rgb), .85) !default;\n$toast-border-width:                var(--#{$prefix}border-width) !default;\n$toast-border-color:                var(--#{$prefix}border-color-translucent) !default;\n$toast-border-radius:               var(--#{$prefix}border-radius) !default;\n$toast-box-shadow:                  var(--#{$prefix}box-shadow) !default;\n$toast-spacing:                     $container-padding-x !default;\n\n$toast-header-color:                var(--#{$prefix}secondary-color) !default;\n$toast-header-background-color:     rgba(var(--#{$prefix}body-bg-rgb), .85) !default;\n$toast-header-border-color:         $toast-border-color !default;\n// scss-docs-end toast-variables\n\n\n// Badges\n\n// scss-docs-start badge-variables\n$badge-font-size:                   .75em !default;\n$badge-font-weight:                 $font-weight-bold !default;\n$badge-color:                       $white !default;\n$badge-padding-y:                   .35em !default;\n$badge-padding-x:                   .65em !default;\n$badge-border-radius:               var(--#{$prefix}border-radius) !default;\n// scss-docs-end badge-variables\n\n\n// Modals\n\n// scss-docs-start modal-variables\n$modal-inner-padding:               $spacer !default;\n\n$modal-footer-margin-between:       .5rem !default;\n\n$modal-dialog-margin:               .5rem !default;\n$modal-dialog-margin-y-sm-up:       1.75rem !default;\n\n$modal-title-line-height:           $line-height-base !default;\n\n$modal-content-color:               var(--#{$prefix}body-color) !default;\n$modal-content-bg:                  var(--#{$prefix}body-bg) !default;\n$modal-content-border-color:        var(--#{$prefix}border-color-translucent) !default;\n$modal-content-border-width:        var(--#{$prefix}border-width) !default;\n$modal-content-border-radius:       var(--#{$prefix}border-radius-lg) !default;\n$modal-content-inner-border-radius: subtract($modal-content-border-radius, $modal-content-border-width) !default;\n$modal-content-box-shadow-xs:       var(--#{$prefix}box-shadow-sm) !default;\n$modal-content-box-shadow-sm-up:    var(--#{$prefix}box-shadow) !default;\n\n$modal-backdrop-bg:                 $black !default;\n$modal-backdrop-opacity:            .5 !default;\n\n$modal-header-border-color:         var(--#{$prefix}border-color) !default;\n$modal-header-border-width:         $modal-content-border-width !default;\n$modal-header-padding-y:            $modal-inner-padding !default;\n$modal-header-padding-x:            $modal-inner-padding !default;\n$modal-header-padding:              $modal-header-padding-y $modal-header-padding-x !default; // Keep this for backwards compatibility\n\n$modal-footer-bg:                   null !default;\n$modal-footer-border-color:         $modal-header-border-color !default;\n$modal-footer-border-width:         $modal-header-border-width !default;\n\n$modal-sm:                          300px !default;\n$modal-md:                          500px !default;\n$modal-lg:                          800px !default;\n$modal-xl:                          1140px !default;\n\n$modal-fade-transform:              translate(0, -50px) !default;\n$modal-show-transform:              none !default;\n$modal-transition:                  transform .3s ease-out !default;\n$modal-scale-transform:             scale(1.02) !default;\n// scss-docs-end modal-variables\n\n\n// Alerts\n//\n// Define alert colors, border radius, and padding.\n\n// scss-docs-start alert-variables\n$alert-padding-y:               $spacer !default;\n$alert-padding-x:               $spacer !default;\n$alert-margin-bottom:           1rem !default;\n$alert-border-radius:           var(--#{$prefix}border-radius) !default;\n$alert-link-font-weight:        $font-weight-bold !default;\n$alert-border-width:            var(--#{$prefix}border-width) !default;\n$alert-dismissible-padding-r:   $alert-padding-x * 3 !default; // 3x covers width of x plus default padding on either side\n// scss-docs-end alert-variables\n\n// fusv-disable\n$alert-bg-scale:                -80% !default; // Deprecated in v5.2.0, to be removed in v6\n$alert-border-scale:            -70% !default; // Deprecated in v5.2.0, to be removed in v6\n$alert-color-scale:             40% !default; // Deprecated in v5.2.0, to be removed in v6\n// fusv-enable\n\n// Progress bars\n\n// scss-docs-start progress-variables\n$progress-height:                   1rem !default;\n$progress-font-size:                $font-size-base * .75 !default;\n$progress-bg:                       var(--#{$prefix}secondary-bg) !default;\n$progress-border-radius:            var(--#{$prefix}border-radius) !default;\n$progress-box-shadow:               var(--#{$prefix}box-shadow-inset) !default;\n$progress-bar-color:                $white !default;\n$progress-bar-bg:                   $primary !default;\n$progress-bar-animation-timing:     1s linear infinite !default;\n$progress-bar-transition:           width .6s ease !default;\n// scss-docs-end progress-variables\n\n\n// List group\n\n// scss-docs-start list-group-variables\n$list-group-color:                  var(--#{$prefix}body-color) !default;\n$list-group-bg:                     var(--#{$prefix}body-bg) !default;\n$list-group-border-color:           var(--#{$prefix}border-color) !default;\n$list-group-border-width:           var(--#{$prefix}border-width) !default;\n$list-group-border-radius:          var(--#{$prefix}border-radius) !default;\n\n$list-group-item-padding-y:         $spacer * .5 !default;\n$list-group-item-padding-x:         $spacer !default;\n// fusv-disable\n$list-group-item-bg-scale:          -80% !default; // Deprecated in v5.3.0\n$list-group-item-color-scale:       40% !default; // Deprecated in v5.3.0\n// fusv-enable\n\n$list-group-hover-bg:               var(--#{$prefix}tertiary-bg) !default;\n$list-group-active-color:           $component-active-color !default;\n$list-group-active-bg:              $component-active-bg !default;\n$list-group-active-border-color:    $list-group-active-bg !default;\n\n$list-group-disabled-color:         var(--#{$prefix}secondary-color) !default;\n$list-group-disabled-bg:            $list-group-bg !default;\n\n$list-group-action-color:           var(--#{$prefix}secondary-color) !default;\n$list-group-action-hover-color:     var(--#{$prefix}emphasis-color) !default;\n\n$list-group-action-active-color:    var(--#{$prefix}body-color) !default;\n$list-group-action-active-bg:       var(--#{$prefix}secondary-bg) !default;\n// scss-docs-end list-group-variables\n\n\n// Image thumbnails\n\n// scss-docs-start thumbnail-variables\n$thumbnail-padding:                 .25rem !default;\n$thumbnail-bg:                      var(--#{$prefix}body-bg) !default;\n$thumbnail-border-width:            var(--#{$prefix}border-width) !default;\n$thumbnail-border-color:            var(--#{$prefix}border-color) !default;\n$thumbnail-border-radius:           var(--#{$prefix}border-radius) !default;\n$thumbnail-box-shadow:              var(--#{$prefix}box-shadow-sm) !default;\n// scss-docs-end thumbnail-variables\n\n\n// Figures\n\n// scss-docs-start figure-variables\n$figure-caption-font-size:          $small-font-size !default;\n$figure-caption-color:              var(--#{$prefix}secondary-color) !default;\n// scss-docs-end figure-variables\n\n\n// Breadcrumbs\n\n// scss-docs-start breadcrumb-variables\n$breadcrumb-font-size:              null !default;\n$breadcrumb-padding-y:              0 !default;\n$breadcrumb-padding-x:              0 !default;\n$breadcrumb-item-padding-x:         .5rem !default;\n$breadcrumb-margin-bottom:          1rem !default;\n$breadcrumb-bg:                     null !default;\n$breadcrumb-divider-color:          var(--#{$prefix}secondary-color) !default;\n$breadcrumb-active-color:           var(--#{$prefix}secondary-color) !default;\n$breadcrumb-divider:                quote(\"/\") !default;\n$breadcrumb-divider-flipped:        $breadcrumb-divider !default;\n$breadcrumb-border-radius:          null !default;\n// scss-docs-end breadcrumb-variables\n\n// Carousel\n\n// scss-docs-start carousel-variables\n$carousel-control-color:             $white !default;\n$carousel-control-width:             15% !default;\n$carousel-control-opacity:           .5 !default;\n$carousel-control-hover-opacity:     .9 !default;\n$carousel-control-transition:        opacity .15s ease !default;\n$carousel-control-icon-filter:       null !default;\n\n$carousel-indicator-width:           30px !default;\n$carousel-indicator-height:          3px !default;\n$carousel-indicator-hit-area-height: 10px !default;\n$carousel-indicator-spacer:          3px !default;\n$carousel-indicator-opacity:         .5 !default;\n$carousel-indicator-active-bg:       $white !default;\n$carousel-indicator-active-opacity:  1 !default;\n$carousel-indicator-transition:      opacity .6s ease !default;\n\n$carousel-caption-width:             70% !default;\n$carousel-caption-color:             $white !default;\n$carousel-caption-padding-y:         1.25rem !default;\n$carousel-caption-spacer:            1.25rem !default;\n\n$carousel-control-icon-width:        2rem !default;\n\n$carousel-control-prev-icon-bg:      url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='#{$carousel-control-color}'><path d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0'/></svg>\") !default;\n$carousel-control-next-icon-bg:      url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='#{$carousel-control-color}'><path d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708'/></svg>\") !default;\n\n$carousel-transition-duration:       .6s !default;\n$carousel-transition:                transform $carousel-transition-duration ease-in-out !default; // Define transform transition first if using multiple transitions (e.g., `transform 2s ease, opacity .5s ease-out`)\n// scss-docs-end carousel-variables\n\n// scss-docs-start carousel-dark-variables\n$carousel-dark-indicator-active-bg:  $black !default; // Deprecated in v5.3.4\n$carousel-dark-caption-color:        $black !default; // Deprecated in v5.3.4\n$carousel-dark-control-icon-filter:  invert(1) grayscale(100) !default; // Deprecated in v5.3.4\n// scss-docs-end carousel-dark-variables\n\n\n// Spinners\n\n// scss-docs-start spinner-variables\n$spinner-width:           2rem !default;\n$spinner-height:          $spinner-width !default;\n$spinner-vertical-align:  -.125em !default;\n$spinner-border-width:    .25em !default;\n$spinner-animation-speed: .75s !default;\n\n$spinner-width-sm:        1rem !default;\n$spinner-height-sm:       $spinner-width-sm !default;\n$spinner-border-width-sm: .2em !default;\n// scss-docs-end spinner-variables\n\n\n// Close\n\n// scss-docs-start close-variables\n$btn-close-width:            1em !default;\n$btn-close-height:           $btn-close-width !default;\n$btn-close-padding-x:        .25em !default;\n$btn-close-padding-y:        $btn-close-padding-x !default;\n$btn-close-color:            $black !default;\n$btn-close-bg:               url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='#{$btn-close-color}'><path d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414'/></svg>\") !default;\n$btn-close-focus-shadow:     $focus-ring-box-shadow !default;\n$btn-close-opacity:          .5 !default;\n$btn-close-hover-opacity:    .75 !default;\n$btn-close-focus-opacity:    1 !default;\n$btn-close-disabled-opacity: .25 !default;\n$btn-close-filter:           null !default;\n$btn-close-white-filter:     invert(1) grayscale(100%) brightness(200%) !default; // Deprecated in v5.3.4\n// scss-docs-end close-variables\n\n\n// Offcanvas\n\n// scss-docs-start offcanvas-variables\n$offcanvas-padding-y:               $modal-inner-padding !default;\n$offcanvas-padding-x:               $modal-inner-padding !default;\n$offcanvas-horizontal-width:        400px !default;\n$offcanvas-vertical-height:         30vh !default;\n$offcanvas-transition-duration:     .3s !default;\n$offcanvas-border-color:            $modal-content-border-color !default;\n$offcanvas-border-width:            $modal-content-border-width !default;\n$offcanvas-title-line-height:       $modal-title-line-height !default;\n$offcanvas-bg-color:                var(--#{$prefix}body-bg) !default;\n$offcanvas-color:                   var(--#{$prefix}body-color) !default;\n$offcanvas-box-shadow:              $modal-content-box-shadow-xs !default;\n$offcanvas-backdrop-bg:             $modal-backdrop-bg !default;\n$offcanvas-backdrop-opacity:        $modal-backdrop-opacity !default;\n// scss-docs-end offcanvas-variables\n\n// Code\n\n$code-font-size:                    $small-font-size !default;\n$code-color:                        $pink !default;\n\n$kbd-padding-y:                     .1875rem !default;\n$kbd-padding-x:                     .375rem !default;\n$kbd-font-size:                     $code-font-size !default;\n$kbd-color:                         var(--#{$prefix}body-bg) !default;\n$kbd-bg:                            var(--#{$prefix}body-color) !default;\n$nested-kbd-font-weight:            null !default; // Deprecated in v5.2.0, removing in v6\n\n$pre-color:                         null !default;\n\n@import \"variables-dark\"; // TODO: can be removed safely in v6, only here to avoid breaking changes in v5.3\n"
  },
  {
    "path": "scss/bootstrap-grid.scss",
    "content": "@import \"mixins/banner\";\n@include bsBanner(Grid);\n\n$include-column-box-sizing: true !default;\n\n@import \"functions\";\n@import \"variables\";\n@import \"variables-dark\";\n@import \"maps\";\n\n@import \"mixins/breakpoints\";\n@import \"mixins/container\";\n@import \"mixins/grid\";\n@import \"mixins/utilities\";\n\n@import \"vendor/rfs\";\n\n@import \"containers\";\n@import \"grid\";\n\n@import \"utilities\";\n// Only use the utilities we need\n// stylelint-disable-next-line scss/dollar-variable-default\n$utilities: map-get-multiple(\n  $utilities,\n  (\n    \"display\",\n    \"order\",\n    \"flex\",\n    \"flex-direction\",\n    \"flex-grow\",\n    \"flex-shrink\",\n    \"flex-wrap\",\n    \"justify-content\",\n    \"align-items\",\n    \"align-content\",\n    \"align-self\",\n    \"margin\",\n    \"margin-x\",\n    \"margin-y\",\n    \"margin-top\",\n    \"margin-end\",\n    \"margin-bottom\",\n    \"margin-start\",\n    \"negative-margin\",\n    \"negative-margin-x\",\n    \"negative-margin-y\",\n    \"negative-margin-top\",\n    \"negative-margin-end\",\n    \"negative-margin-bottom\",\n    \"negative-margin-start\",\n    \"padding\",\n    \"padding-x\",\n    \"padding-y\",\n    \"padding-top\",\n    \"padding-end\",\n    \"padding-bottom\",\n    \"padding-start\",\n  )\n);\n\n@import \"utilities/api\";\n"
  },
  {
    "path": "scss/bootstrap-reboot.scss",
    "content": "@import \"mixins/banner\";\n@include bsBanner(Reboot);\n\n@import \"functions\";\n@import \"variables\";\n@import \"variables-dark\";\n@import \"maps\";\n@import \"mixins\";\n@import \"root\";\n@import \"reboot\";\n"
  },
  {
    "path": "scss/bootstrap-utilities.scss",
    "content": "@import \"mixins/banner\";\n@include bsBanner(Utilities);\n\n// Configuration\n@import \"functions\";\n@import \"variables\";\n@import \"variables-dark\";\n@import \"maps\";\n@import \"mixins\";\n@import \"utilities\";\n\n// Layout & components\n@import \"root\";\n\n// Helpers\n@import \"helpers\";\n\n// Utilities\n@import \"utilities/api\";\n"
  },
  {
    "path": "scss/bootstrap.scss",
    "content": "@import \"mixins/banner\";\n@include bsBanner(\"\");\n\n\n// scss-docs-start import-stack\n// Configuration\n@import \"functions\";\n@import \"variables\";\n@import \"variables-dark\";\n@import \"maps\";\n@import \"mixins\";\n@import \"utilities\";\n\n// Layout & components\n@import \"root\";\n@import \"reboot\";\n@import \"type\";\n@import \"images\";\n@import \"containers\";\n@import \"grid\";\n@import \"tables\";\n@import \"forms\";\n@import \"buttons\";\n@import \"transitions\";\n@import \"dropdown\";\n@import \"button-group\";\n@import \"nav\";\n@import \"navbar\";\n@import \"card\";\n@import \"accordion\";\n@import \"breadcrumb\";\n@import \"pagination\";\n@import \"badge\";\n@import \"alert\";\n@import \"progress\";\n@import \"list-group\";\n@import \"close\";\n@import \"toasts\";\n@import \"modal\";\n@import \"tooltip\";\n@import \"popover\";\n@import \"carousel\";\n@import \"spinners\";\n@import \"offcanvas\";\n@import \"placeholders\";\n\n// Helpers\n@import \"helpers\";\n\n// Utilities\n@import \"utilities/api\";\n// scss-docs-end import-stack\n"
  },
  {
    "path": "scss/forms/_floating-labels.scss",
    "content": ".form-floating {\n  position: relative;\n\n  > .form-control,\n  > .form-control-plaintext,\n  > .form-select {\n    height: $form-floating-height;\n    min-height: $form-floating-height;\n    line-height: $form-floating-line-height;\n  }\n\n  > label {\n    position: absolute;\n    top: 0;\n    left: 0;\n    z-index: 2;\n    max-width: 100%;\n    height: 100%; // allow textareas\n    padding: $form-floating-padding-y $form-floating-padding-x;\n    overflow: hidden;\n    color: rgba(var(--#{$prefix}body-color-rgb), #{$form-floating-label-opacity});\n    text-align: start;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n    pointer-events: none;\n    border: $input-border-width solid transparent; // Required for aligning label's text with the input as it affects inner box model\n    transform-origin: 0 0;\n    @include transition($form-floating-transition);\n  }\n\n  > .form-control,\n  > .form-control-plaintext {\n    padding: $form-floating-padding-y $form-floating-padding-x;\n\n    &::placeholder {\n      color: transparent;\n    }\n\n    &:focus,\n    &:not(:placeholder-shown) {\n      padding-top: $form-floating-input-padding-t;\n      padding-bottom: $form-floating-input-padding-b;\n    }\n    // Duplicated because `:-webkit-autofill` invalidates other selectors when grouped\n    &:-webkit-autofill {\n      padding-top: $form-floating-input-padding-t;\n      padding-bottom: $form-floating-input-padding-b;\n    }\n  }\n\n  > .form-select {\n    padding-top: $form-floating-input-padding-t;\n    padding-bottom: $form-floating-input-padding-b;\n    padding-left: $form-floating-padding-x;\n  }\n\n  > .form-control:focus,\n  > .form-control:not(:placeholder-shown),\n  > .form-control-plaintext,\n  > .form-select {\n    ~ label {\n      transform: $form-floating-label-transform;\n    }\n  }\n  // Duplicated because `:-webkit-autofill` invalidates other selectors when grouped\n  > .form-control:-webkit-autofill {\n    ~ label {\n      transform: $form-floating-label-transform;\n    }\n  }\n  > textarea:focus,\n  > textarea:not(:placeholder-shown) {\n    ~ label::after {\n      position: absolute;\n      inset: $form-floating-padding-y ($form-floating-padding-x * .5);\n      z-index: -1;\n      height: $form-floating-label-height;\n      content: \"\";\n      background-color: $input-bg;\n      @include border-radius($input-border-radius);\n    }\n  }\n  > textarea:disabled ~ label::after {\n    background-color: $input-disabled-bg;\n  }\n\n  > .form-control-plaintext {\n    ~ label {\n      border-width: $input-border-width 0; // Required to properly position label text - as explained above\n    }\n  }\n\n  > :disabled ~ label,\n  > .form-control:disabled ~ label { // Required for `.form-control`s because of specificity\n    color: $form-floating-label-disabled-color;\n  }\n}\n"
  },
  {
    "path": "scss/forms/_form-check.scss",
    "content": "//\n// Check/radio\n//\n\n.form-check {\n  display: block;\n  min-height: $form-check-min-height;\n  padding-left: $form-check-padding-start;\n  margin-bottom: $form-check-margin-bottom;\n\n  .form-check-input {\n    float: left;\n    margin-left: $form-check-padding-start * -1;\n  }\n}\n\n.form-check-reverse {\n  padding-right: $form-check-padding-start;\n  padding-left: 0;\n  text-align: right;\n\n  .form-check-input {\n    float: right;\n    margin-right: $form-check-padding-start * -1;\n    margin-left: 0;\n  }\n}\n\n.form-check-input {\n  --#{$prefix}form-check-bg: #{$form-check-input-bg};\n\n  flex-shrink: 0;\n  width: $form-check-input-width;\n  height: $form-check-input-width;\n  margin-top: ($line-height-base - $form-check-input-width) * .5; // line-height minus check height\n  vertical-align: top;\n  appearance: none;\n  background-color: var(--#{$prefix}form-check-bg);\n  background-image: var(--#{$prefix}form-check-bg-image);\n  background-repeat: no-repeat;\n  background-position: center;\n  background-size: contain;\n  border: $form-check-input-border;\n  print-color-adjust: exact; // Keep themed appearance for print\n  @include transition($form-check-transition);\n\n  &[type=\"checkbox\"] {\n    @include border-radius($form-check-input-border-radius);\n  }\n\n  &[type=\"radio\"] {\n    // stylelint-disable-next-line property-disallowed-list\n    border-radius: $form-check-radio-border-radius;\n  }\n\n  &:active {\n    filter: $form-check-input-active-filter;\n  }\n\n  &:focus {\n    border-color: $form-check-input-focus-border;\n    outline: 0;\n    box-shadow: $form-check-input-focus-box-shadow;\n  }\n\n  &:checked {\n    background-color: $form-check-input-checked-bg-color;\n    border-color: $form-check-input-checked-border-color;\n\n    &[type=\"checkbox\"] {\n      @if $enable-gradients {\n        --#{$prefix}form-check-bg-image: #{escape-svg($form-check-input-checked-bg-image)}, var(--#{$prefix}gradient);\n      } @else {\n        --#{$prefix}form-check-bg-image: #{escape-svg($form-check-input-checked-bg-image)};\n      }\n    }\n\n    &[type=\"radio\"] {\n      @if $enable-gradients {\n        --#{$prefix}form-check-bg-image: #{escape-svg($form-check-radio-checked-bg-image)}, var(--#{$prefix}gradient);\n      } @else {\n        --#{$prefix}form-check-bg-image: #{escape-svg($form-check-radio-checked-bg-image)};\n      }\n    }\n  }\n\n  &[type=\"checkbox\"]:indeterminate {\n    background-color: $form-check-input-indeterminate-bg-color;\n    border-color: $form-check-input-indeterminate-border-color;\n\n    @if $enable-gradients {\n      --#{$prefix}form-check-bg-image: #{escape-svg($form-check-input-indeterminate-bg-image)}, var(--#{$prefix}gradient);\n    } @else {\n      --#{$prefix}form-check-bg-image: #{escape-svg($form-check-input-indeterminate-bg-image)};\n    }\n  }\n\n  &:disabled {\n    pointer-events: none;\n    filter: none;\n    opacity: $form-check-input-disabled-opacity;\n  }\n\n  // Use disabled attribute in addition of :disabled pseudo-class\n  // See: https://github.com/twbs/bootstrap/issues/28247\n  &[disabled],\n  &:disabled {\n    ~ .form-check-label {\n      cursor: default;\n      opacity: $form-check-label-disabled-opacity;\n    }\n  }\n}\n\n.form-check-label {\n  color: $form-check-label-color;\n  cursor: $form-check-label-cursor;\n}\n\n//\n// Switch\n//\n\n.form-switch {\n  padding-left: $form-switch-padding-start;\n\n  .form-check-input {\n    --#{$prefix}form-switch-bg: #{escape-svg($form-switch-bg-image)};\n\n    width: $form-switch-width;\n    margin-left: $form-switch-padding-start * -1;\n    background-image: var(--#{$prefix}form-switch-bg);\n    background-position: left center;\n    @include border-radius($form-switch-border-radius, 0);\n    @include transition($form-switch-transition);\n\n    &:focus {\n      --#{$prefix}form-switch-bg: #{escape-svg($form-switch-focus-bg-image)};\n    }\n\n    &:checked {\n      background-position: $form-switch-checked-bg-position;\n\n      @if $enable-gradients {\n        --#{$prefix}form-switch-bg: #{escape-svg($form-switch-checked-bg-image)}, var(--#{$prefix}gradient);\n      } @else {\n        --#{$prefix}form-switch-bg: #{escape-svg($form-switch-checked-bg-image)};\n      }\n    }\n  }\n\n  &.form-check-reverse {\n    padding-right: $form-switch-padding-start;\n    padding-left: 0;\n\n    .form-check-input {\n      margin-right: $form-switch-padding-start * -1;\n      margin-left: 0;\n    }\n  }\n}\n\n.form-check-inline {\n  display: inline-block;\n  margin-right: $form-check-inline-margin-end;\n}\n\n.btn-check {\n  position: absolute;\n  clip: rect(0, 0, 0, 0);\n  pointer-events: none;\n\n  &[disabled],\n  &:disabled {\n    + .btn {\n      pointer-events: none;\n      filter: none;\n      opacity: $form-check-btn-check-disabled-opacity;\n    }\n  }\n}\n\n@if $enable-dark-mode {\n  @include color-mode(dark) {\n    .form-switch .form-check-input:not(:checked):not(:focus) {\n      --#{$prefix}form-switch-bg: #{escape-svg($form-switch-bg-image-dark)};\n    }\n  }\n}\n"
  },
  {
    "path": "scss/forms/_form-control.scss",
    "content": "//\n// General form controls (plus a few specific high-level interventions)\n//\n\n.form-control {\n  display: block;\n  width: 100%;\n  padding: $input-padding-y $input-padding-x;\n  font-family: $input-font-family;\n  @include font-size($input-font-size);\n  font-weight: $input-font-weight;\n  line-height: $input-line-height;\n  color: $input-color;\n  appearance: none; // Fix appearance for date inputs in Safari\n  background-color: $input-bg;\n  background-clip: padding-box;\n  border: $input-border-width solid $input-border-color;\n\n  // Note: This has no effect on <select>s in some browsers, due to the limited stylability of `<select>`s in CSS.\n  @include border-radius($input-border-radius, 0);\n\n  @include box-shadow($input-box-shadow);\n  @include transition($input-transition);\n\n  &[type=\"file\"] {\n    overflow: hidden; // prevent pseudo element button overlap\n\n    &:not(:disabled):not([readonly]) {\n      cursor: pointer;\n    }\n  }\n\n  // Customize the `:focus` state to imitate native WebKit styles.\n  &:focus {\n    color: $input-focus-color;\n    background-color: $input-focus-bg;\n    border-color: $input-focus-border-color;\n    outline: 0;\n    @if $enable-shadows {\n      @include box-shadow($input-box-shadow, $input-focus-box-shadow);\n    } @else {\n      // Avoid using mixin so we can pass custom focus shadow properly\n      box-shadow: $input-focus-box-shadow;\n    }\n  }\n\n  &::-webkit-date-and-time-value {\n    // On Android Chrome, form-control's \"width: 100%\" makes the input width too small\n    // Tested under Android 11 / Chrome 89, Android 12 / Chrome 100, Android 13 / Chrome 109\n    //\n    // On iOS Safari, form-control's \"appearance: none\" + \"width: 100%\" makes the input width too small\n    // Tested under iOS 16.2 / Safari 16.2\n    min-width: 85px; // Seems to be a good minimum safe width\n\n    // Add some height to date inputs on iOS\n    // https://github.com/twbs/bootstrap/issues/23307\n    // TODO: we can remove this workaround once https://bugs.webkit.org/show_bug.cgi?id=198959 is resolved\n    // Multiply line-height by 1em if it has no unit\n    height: if(unit($input-line-height) == \"\", $input-line-height * 1em, $input-line-height);\n\n    // Android Chrome type=\"date\" is taller than the other inputs\n    // because of \"margin: 1px 24px 1px 4px\" inside the shadow DOM\n    // Tested under Android 11 / Chrome 89, Android 12 / Chrome 100, Android 13 / Chrome 109\n    margin: 0;\n  }\n\n  // Prevent excessive date input height in Webkit\n  // https://github.com/twbs/bootstrap/issues/34433\n  &::-webkit-datetime-edit {\n    display: block;\n    padding: 0;\n  }\n\n  // Placeholder\n  &::placeholder {\n    color: $input-placeholder-color;\n    // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526.\n    opacity: 1;\n  }\n\n  // Disabled inputs\n  //\n  // HTML5 says that controls under a fieldset > legend:first-child won't be\n  // disabled if the fieldset is disabled. Due to implementation difficulty, we\n  // don't honor that edge case; we style them as disabled anyway.\n  &:disabled {\n    color: $input-disabled-color;\n    background-color: $input-disabled-bg;\n    border-color: $input-disabled-border-color;\n    // iOS fix for unreadable disabled content; see https://github.com/twbs/bootstrap/issues/11655.\n    opacity: 1;\n  }\n\n  // File input buttons theming\n  &::file-selector-button {\n    padding: $input-padding-y $input-padding-x;\n    margin: (-$input-padding-y) (-$input-padding-x);\n    margin-inline-end: $input-padding-x;\n    color: $form-file-button-color;\n    @include gradient-bg($form-file-button-bg);\n    pointer-events: none;\n    border-color: inherit;\n    border-style: solid;\n    border-width: 0;\n    border-inline-end-width: $input-border-width;\n    border-radius: 0; // stylelint-disable-line property-disallowed-list\n    @include transition($btn-transition);\n  }\n\n  &:hover:not(:disabled):not([readonly])::file-selector-button {\n    background-color: $form-file-button-hover-bg;\n  }\n}\n\n// Readonly controls as plain text\n//\n// Apply class to a readonly input to make it appear like regular plain\n// text (without any border, background color, focus indicator)\n\n.form-control-plaintext {\n  display: block;\n  width: 100%;\n  padding: $input-padding-y 0;\n  margin-bottom: 0; // match inputs if this class comes on inputs with default margins\n  line-height: $input-line-height;\n  color: $input-plaintext-color;\n  background-color: transparent;\n  border: solid transparent;\n  border-width: $input-border-width 0;\n\n  &:focus {\n    outline: 0;\n  }\n\n  &.form-control-sm,\n  &.form-control-lg {\n    padding-right: 0;\n    padding-left: 0;\n  }\n}\n\n// Form control sizing\n//\n// Build on `.form-control` with modifier classes to decrease or increase the\n// height and font-size of form controls.\n//\n// Repeated in `_input_group.scss` to avoid Sass extend issues.\n\n.form-control-sm {\n  min-height: $input-height-sm;\n  padding: $input-padding-y-sm $input-padding-x-sm;\n  @include font-size($input-font-size-sm);\n  @include border-radius($input-border-radius-sm);\n\n  &::file-selector-button {\n    padding: $input-padding-y-sm $input-padding-x-sm;\n    margin: (-$input-padding-y-sm) (-$input-padding-x-sm);\n    margin-inline-end: $input-padding-x-sm;\n  }\n}\n\n.form-control-lg {\n  min-height: $input-height-lg;\n  padding: $input-padding-y-lg $input-padding-x-lg;\n  @include font-size($input-font-size-lg);\n  @include border-radius($input-border-radius-lg);\n\n  &::file-selector-button {\n    padding: $input-padding-y-lg $input-padding-x-lg;\n    margin: (-$input-padding-y-lg) (-$input-padding-x-lg);\n    margin-inline-end: $input-padding-x-lg;\n  }\n}\n\n// Make sure textareas don't shrink too much when resized\n// https://github.com/twbs/bootstrap/pull/29124\n// stylelint-disable selector-no-qualifying-type\ntextarea {\n  &.form-control {\n    min-height: $input-height;\n  }\n\n  &.form-control-sm {\n    min-height: $input-height-sm;\n  }\n\n  &.form-control-lg {\n    min-height: $input-height-lg;\n  }\n}\n// stylelint-enable selector-no-qualifying-type\n\n.form-control-color {\n  width: $form-color-width;\n  height: $input-height;\n  padding: $input-padding-y;\n\n  &:not(:disabled):not([readonly]) {\n    cursor: pointer;\n  }\n\n  &::-moz-color-swatch {\n    border: 0 !important; // stylelint-disable-line declaration-no-important\n    @include border-radius($input-border-radius);\n  }\n\n  &::-webkit-color-swatch {\n    border: 0 !important; // stylelint-disable-line declaration-no-important\n    @include border-radius($input-border-radius);\n  }\n\n  &.form-control-sm { height: $input-height-sm; }\n  &.form-control-lg { height: $input-height-lg; }\n}\n"
  },
  {
    "path": "scss/forms/_form-range.scss",
    "content": "// Range\n//\n// Style range inputs the same across browsers. Vendor-specific rules for pseudo\n// elements cannot be mixed. As such, there are no shared styles for focus or\n// active states on prefixed selectors.\n\n.form-range {\n  width: 100%;\n  height: add($form-range-thumb-height, $form-range-thumb-focus-box-shadow-width * 2);\n  padding: 0; // Need to reset padding\n  appearance: none;\n  background-color: transparent;\n\n  &:focus {\n    outline: 0;\n\n    // Pseudo-elements must be split across multiple rulesets to have an effect.\n    // No box-shadow() mixin for focus accessibility.\n    &::-webkit-slider-thumb { box-shadow: $form-range-thumb-focus-box-shadow; }\n    &::-moz-range-thumb     { box-shadow: $form-range-thumb-focus-box-shadow; }\n  }\n\n  &::-moz-focus-outer {\n    border: 0;\n  }\n\n  &::-webkit-slider-thumb {\n    width: $form-range-thumb-width;\n    height: $form-range-thumb-height;\n    margin-top: ($form-range-track-height - $form-range-thumb-height) * .5; // Webkit specific\n    appearance: none;\n    @include gradient-bg($form-range-thumb-bg);\n    border: $form-range-thumb-border;\n    @include border-radius($form-range-thumb-border-radius);\n    @include box-shadow($form-range-thumb-box-shadow);\n    @include transition($form-range-thumb-transition);\n\n    &:active {\n      @include gradient-bg($form-range-thumb-active-bg);\n    }\n  }\n\n  &::-webkit-slider-runnable-track {\n    width: $form-range-track-width;\n    height: $form-range-track-height;\n    color: transparent; // Why?\n    cursor: $form-range-track-cursor;\n    background-color: $form-range-track-bg;\n    border-color: transparent;\n    @include border-radius($form-range-track-border-radius);\n    @include box-shadow($form-range-track-box-shadow);\n  }\n\n  &::-moz-range-thumb {\n    width: $form-range-thumb-width;\n    height: $form-range-thumb-height;\n    appearance: none;\n    @include gradient-bg($form-range-thumb-bg);\n    border: $form-range-thumb-border;\n    @include border-radius($form-range-thumb-border-radius);\n    @include box-shadow($form-range-thumb-box-shadow);\n    @include transition($form-range-thumb-transition);\n\n    &:active {\n      @include gradient-bg($form-range-thumb-active-bg);\n    }\n  }\n\n  &::-moz-range-track {\n    width: $form-range-track-width;\n    height: $form-range-track-height;\n    color: transparent;\n    cursor: $form-range-track-cursor;\n    background-color: $form-range-track-bg;\n    border-color: transparent; // Firefox specific?\n    @include border-radius($form-range-track-border-radius);\n    @include box-shadow($form-range-track-box-shadow);\n  }\n\n  &:disabled {\n    pointer-events: none;\n\n    &::-webkit-slider-thumb {\n      background-color: $form-range-thumb-disabled-bg;\n    }\n\n    &::-moz-range-thumb {\n      background-color: $form-range-thumb-disabled-bg;\n    }\n  }\n}\n"
  },
  {
    "path": "scss/forms/_form-select.scss",
    "content": "// Select\n//\n// Replaces the browser default select with a custom one, mostly pulled from\n// https://primer.github.io/.\n\n.form-select {\n  --#{$prefix}form-select-bg-img: #{escape-svg($form-select-indicator)};\n\n  display: block;\n  width: 100%;\n  padding: $form-select-padding-y $form-select-indicator-padding $form-select-padding-y $form-select-padding-x;\n  font-family: $form-select-font-family;\n  @include font-size($form-select-font-size);\n  font-weight: $form-select-font-weight;\n  line-height: $form-select-line-height;\n  color: $form-select-color;\n  appearance: none;\n  background-color: $form-select-bg;\n  background-image: var(--#{$prefix}form-select-bg-img), var(--#{$prefix}form-select-bg-icon, none);\n  background-repeat: no-repeat;\n  background-position: $form-select-bg-position;\n  background-size: $form-select-bg-size;\n  border: $form-select-border-width solid $form-select-border-color;\n  @include border-radius($form-select-border-radius, 0);\n  @include box-shadow($form-select-box-shadow);\n  @include transition($form-select-transition);\n\n  &:focus {\n    border-color: $form-select-focus-border-color;\n    outline: 0;\n    @if $enable-shadows {\n      @include box-shadow($form-select-box-shadow, $form-select-focus-box-shadow);\n    } @else {\n      // Avoid using mixin so we can pass custom focus shadow properly\n      box-shadow: $form-select-focus-box-shadow;\n    }\n  }\n\n  &[multiple],\n  &[size]:not([size=\"1\"]) {\n    padding-right: $form-select-padding-x;\n    background-image: none;\n  }\n\n  &:disabled {\n    color: $form-select-disabled-color;\n    background-color: $form-select-disabled-bg;\n    border-color: $form-select-disabled-border-color;\n  }\n\n  // Remove outline from select box in FF\n  &:-moz-focusring {\n    color: transparent;\n    text-shadow: 0 0 0 $form-select-color;\n  }\n}\n\n.form-select-sm {\n  padding-top: $form-select-padding-y-sm;\n  padding-bottom: $form-select-padding-y-sm;\n  padding-left: $form-select-padding-x-sm;\n  @include font-size($form-select-font-size-sm);\n  @include border-radius($form-select-border-radius-sm);\n}\n\n.form-select-lg {\n  padding-top: $form-select-padding-y-lg;\n  padding-bottom: $form-select-padding-y-lg;\n  padding-left: $form-select-padding-x-lg;\n  @include font-size($form-select-font-size-lg);\n  @include border-radius($form-select-border-radius-lg);\n}\n\n@if $enable-dark-mode {\n  @include color-mode(dark) {\n    .form-select {\n      --#{$prefix}form-select-bg-img: #{escape-svg($form-select-indicator-dark)};\n    }\n  }\n}\n"
  },
  {
    "path": "scss/forms/_form-text.scss",
    "content": "//\n// Form text\n//\n\n.form-text {\n  margin-top: $form-text-margin-top;\n  @include font-size($form-text-font-size);\n  font-style: $form-text-font-style;\n  font-weight: $form-text-font-weight;\n  color: $form-text-color;\n}\n"
  },
  {
    "path": "scss/forms/_input-group.scss",
    "content": "//\n// Base styles\n//\n\n.input-group {\n  position: relative;\n  display: flex;\n  flex-wrap: wrap; // For form validation feedback\n  align-items: stretch;\n  width: 100%;\n\n  > .form-control,\n  > .form-select,\n  > .form-floating {\n    position: relative; // For focus state's z-index\n    flex: 1 1 auto;\n    width: 1%;\n    min-width: 0; // https://stackoverflow.com/questions/36247140/why-dont-flex-items-shrink-past-content-size\n  }\n\n  // Bring the \"active\" form control to the top of surrounding elements\n  > .form-control:focus,\n  > .form-select:focus,\n  > .form-floating:focus-within {\n    z-index: 5;\n  }\n\n  // Ensure buttons are always above inputs for more visually pleasing borders.\n  // This isn't needed for `.input-group-text` since it shares the same border-color\n  // as our inputs.\n  .btn {\n    position: relative;\n    z-index: 2;\n\n    &:focus {\n      z-index: 5;\n    }\n  }\n}\n\n\n// Textual addons\n//\n// Serves as a catch-all element for any text or radio/checkbox input you wish\n// to prepend or append to an input.\n\n.input-group-text {\n  display: flex;\n  align-items: center;\n  padding: $input-group-addon-padding-y $input-group-addon-padding-x;\n  @include font-size($input-font-size); // Match inputs\n  font-weight: $input-group-addon-font-weight;\n  line-height: $input-line-height;\n  color: $input-group-addon-color;\n  text-align: center;\n  white-space: nowrap;\n  background-color: $input-group-addon-bg;\n  border: $input-border-width solid $input-group-addon-border-color;\n  @include border-radius($input-border-radius);\n}\n\n\n// Sizing\n//\n// Remix the default form control sizing classes into new ones for easier\n// manipulation.\n\n.input-group-lg > .form-control,\n.input-group-lg > .form-select,\n.input-group-lg > .input-group-text,\n.input-group-lg > .btn {\n  padding: $input-padding-y-lg $input-padding-x-lg;\n  @include font-size($input-font-size-lg);\n  @include border-radius($input-border-radius-lg);\n}\n\n.input-group-sm > .form-control,\n.input-group-sm > .form-select,\n.input-group-sm > .input-group-text,\n.input-group-sm > .btn {\n  padding: $input-padding-y-sm $input-padding-x-sm;\n  @include font-size($input-font-size-sm);\n  @include border-radius($input-border-radius-sm);\n}\n\n.input-group-lg > .form-select,\n.input-group-sm > .form-select {\n  padding-right: $form-select-padding-x + $form-select-indicator-padding;\n}\n\n\n// Rounded corners\n//\n// These rulesets must come after the sizing ones to properly override sm and lg\n// border-radius values when extending. They're more specific than we'd like\n// with the `.input-group >` part, but without it, we cannot override the sizing.\n\n// stylelint-disable-next-line no-duplicate-selectors\n.input-group {\n  &:not(.has-validation) {\n    > :not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),\n    > .dropdown-toggle:nth-last-child(n + 3),\n    > .form-floating:not(:last-child) > .form-control,\n    > .form-floating:not(:last-child) > .form-select {\n      @include border-end-radius(0);\n    }\n  }\n\n  &.has-validation {\n    > :nth-last-child(n + 3):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),\n    > .dropdown-toggle:nth-last-child(n + 4),\n    > .form-floating:nth-last-child(n + 3) > .form-control,\n    > .form-floating:nth-last-child(n + 3) > .form-select {\n      @include border-end-radius(0);\n    }\n  }\n\n  $validation-messages: \"\";\n  @each $state in map-keys($form-validation-states) {\n    $validation-messages: $validation-messages + \":not(.\" + unquote($state) + \"-tooltip)\" + \":not(.\" + unquote($state) + \"-feedback)\";\n  }\n\n  > :not(:first-child):not(.dropdown-menu)#{$validation-messages} {\n    margin-left: calc(-1 * #{$input-border-width}); // stylelint-disable-line function-disallowed-list\n    @include border-start-radius(0);\n  }\n\n  > .form-floating:not(:first-child) > .form-control,\n  > .form-floating:not(:first-child) > .form-select {\n    @include border-start-radius(0);\n  }\n}\n"
  },
  {
    "path": "scss/forms/_labels.scss",
    "content": "//\n// Labels\n//\n\n.form-label {\n  margin-bottom: $form-label-margin-bottom;\n  @include font-size($form-label-font-size);\n  font-style: $form-label-font-style;\n  font-weight: $form-label-font-weight;\n  color: $form-label-color;\n}\n\n// For use with horizontal and inline forms, when you need the label (or legend)\n// text to align with the form controls.\n.col-form-label {\n  padding-top: add($input-padding-y, $input-border-width);\n  padding-bottom: add($input-padding-y, $input-border-width);\n  margin-bottom: 0; // Override the `<legend>` default\n  @include font-size(inherit); // Override the `<legend>` default\n  font-style: $form-label-font-style;\n  font-weight: $form-label-font-weight;\n  line-height: $input-line-height;\n  color: $form-label-color;\n}\n\n.col-form-label-lg {\n  padding-top: add($input-padding-y-lg, $input-border-width);\n  padding-bottom: add($input-padding-y-lg, $input-border-width);\n  @include font-size($input-font-size-lg);\n}\n\n.col-form-label-sm {\n  padding-top: add($input-padding-y-sm, $input-border-width);\n  padding-bottom: add($input-padding-y-sm, $input-border-width);\n  @include font-size($input-font-size-sm);\n}\n"
  },
  {
    "path": "scss/forms/_validation.scss",
    "content": "// Form validation\n//\n// Provide feedback to users when form field values are valid or invalid. Works\n// primarily for client-side validation via scoped `:invalid` and `:valid`\n// pseudo-classes but also includes `.is-invalid` and `.is-valid` classes for\n// server-side validation.\n\n// scss-docs-start form-validation-states-loop\n@each $state, $data in $form-validation-states {\n  @include form-validation-state($state, $data...);\n}\n// scss-docs-end form-validation-states-loop\n"
  },
  {
    "path": "scss/helpers/_clearfix.scss",
    "content": ".clearfix {\n  @include clearfix();\n}\n"
  },
  {
    "path": "scss/helpers/_color-bg.scss",
    "content": "// All-caps `RGBA()` function used because of this Sass bug: https://github.com/sass/node-sass/issues/2251\n@each $color, $value in $theme-colors {\n  .text-bg-#{$color} {\n    color: color-contrast($value) if($enable-important-utilities, !important, null);\n    background-color: RGBA(var(--#{$prefix}#{$color}-rgb), var(--#{$prefix}bg-opacity, 1)) if($enable-important-utilities, !important, null);\n  }\n}\n"
  },
  {
    "path": "scss/helpers/_colored-links.scss",
    "content": "// All-caps `RGBA()` function used because of this Sass bug: https://github.com/sass/node-sass/issues/2251\n@each $color, $value in $theme-colors {\n  .link-#{$color} {\n    color: RGBA(var(--#{$prefix}#{$color}-rgb), var(--#{$prefix}link-opacity, 1)) if($enable-important-utilities, !important, null);\n    text-decoration-color: RGBA(var(--#{$prefix}#{$color}-rgb), var(--#{$prefix}link-underline-opacity, 1)) if($enable-important-utilities, !important, null);\n\n    @if $link-shade-percentage != 0 {\n      &:hover,\n      &:focus {\n        $hover-color: if(color-contrast($value) == $color-contrast-light, shade-color($value, $link-shade-percentage), tint-color($value, $link-shade-percentage));\n        color: RGBA(#{to-rgb($hover-color)}, var(--#{$prefix}link-opacity, 1)) if($enable-important-utilities, !important, null);\n        text-decoration-color: RGBA(to-rgb($hover-color), var(--#{$prefix}link-underline-opacity, 1)) if($enable-important-utilities, !important, null);\n      }\n    }\n  }\n}\n\n// One-off special link helper as a bridge until v6\n.link-body-emphasis {\n  color: RGBA(var(--#{$prefix}emphasis-color-rgb), var(--#{$prefix}link-opacity, 1)) if($enable-important-utilities, !important, null);\n  text-decoration-color: RGBA(var(--#{$prefix}emphasis-color-rgb), var(--#{$prefix}link-underline-opacity, 1)) if($enable-important-utilities, !important, null);\n\n  @if $link-shade-percentage != 0 {\n    &:hover,\n    &:focus {\n      color: RGBA(var(--#{$prefix}emphasis-color-rgb), var(--#{$prefix}link-opacity, .75)) if($enable-important-utilities, !important, null);\n      text-decoration-color: RGBA(var(--#{$prefix}emphasis-color-rgb), var(--#{$prefix}link-underline-opacity, .75)) if($enable-important-utilities, !important, null);\n    }\n  }\n}\n"
  },
  {
    "path": "scss/helpers/_focus-ring.scss",
    "content": ".focus-ring:focus {\n  outline: 0;\n  // By default, there is no `--bs-focus-ring-x`, `--bs-focus-ring-y`, or `--bs-focus-ring-blur`, but we provide CSS variables with fallbacks to initial `0` values\n  box-shadow: var(--#{$prefix}focus-ring-x, 0) var(--#{$prefix}focus-ring-y, 0) var(--#{$prefix}focus-ring-blur, 0) var(--#{$prefix}focus-ring-width) var(--#{$prefix}focus-ring-color);\n}\n"
  },
  {
    "path": "scss/helpers/_icon-link.scss",
    "content": ".icon-link {\n  display: inline-flex;\n  gap: $icon-link-gap;\n  align-items: center;\n  text-decoration-color: rgba(var(--#{$prefix}link-color-rgb), var(--#{$prefix}link-opacity, .5));\n  text-underline-offset: $icon-link-underline-offset;\n  backface-visibility: hidden;\n\n  > .bi {\n    flex-shrink: 0;\n    width: $icon-link-icon-size;\n    height: $icon-link-icon-size;\n    fill: currentcolor;\n    @include transition($icon-link-icon-transition);\n  }\n}\n\n.icon-link-hover {\n  &:hover,\n  &:focus-visible {\n    > .bi {\n      transform: var(--#{$prefix}icon-link-transform, $icon-link-icon-transform);\n    }\n  }\n}\n"
  },
  {
    "path": "scss/helpers/_position.scss",
    "content": "// Shorthand\n\n.fixed-top {\n  position: fixed;\n  top: 0;\n  right: 0;\n  left: 0;\n  z-index: $zindex-fixed;\n}\n\n.fixed-bottom {\n  position: fixed;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: $zindex-fixed;\n}\n\n// Responsive sticky top and bottom\n@each $breakpoint in map-keys($grid-breakpoints) {\n  @include media-breakpoint-up($breakpoint) {\n    $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n    .sticky#{$infix}-top {\n      position: sticky;\n      top: 0;\n      z-index: $zindex-sticky;\n    }\n\n    .sticky#{$infix}-bottom {\n      position: sticky;\n      bottom: 0;\n      z-index: $zindex-sticky;\n    }\n  }\n}\n"
  },
  {
    "path": "scss/helpers/_ratio.scss",
    "content": "// Credit: Nicolas Gallagher and SUIT CSS.\n\n.ratio {\n  position: relative;\n  width: 100%;\n\n  &::before {\n    display: block;\n    padding-top: var(--#{$prefix}aspect-ratio);\n    content: \"\";\n  }\n\n  > * {\n    position: absolute;\n    top: 0;\n    left: 0;\n    width: 100%;\n    height: 100%;\n  }\n}\n\n@each $key, $ratio in $aspect-ratios {\n  .ratio-#{$key} {\n    --#{$prefix}aspect-ratio: #{$ratio};\n  }\n}\n"
  },
  {
    "path": "scss/helpers/_stacks.scss",
    "content": "// scss-docs-start stacks\n.hstack {\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  align-self: stretch;\n}\n\n.vstack {\n  display: flex;\n  flex: 1 1 auto;\n  flex-direction: column;\n  align-self: stretch;\n}\n// scss-docs-end stacks\n"
  },
  {
    "path": "scss/helpers/_stretched-link.scss",
    "content": "//\n// Stretched link\n//\n\n.stretched-link {\n  &::#{$stretched-link-pseudo-element} {\n    position: absolute;\n    top: 0;\n    right: 0;\n    bottom: 0;\n    left: 0;\n    z-index: $stretched-link-z-index;\n    content: \"\";\n  }\n}\n"
  },
  {
    "path": "scss/helpers/_text-truncation.scss",
    "content": "//\n// Text truncation\n//\n\n.text-truncate {\n  @include text-truncate();\n}\n"
  },
  {
    "path": "scss/helpers/_visually-hidden.scss",
    "content": "//\n// Visually hidden\n//\n\n.visually-hidden,\n.visually-hidden-focusable:not(:focus):not(:focus-within) {\n  @include visually-hidden();\n}\n"
  },
  {
    "path": "scss/helpers/_vr.scss",
    "content": ".vr {\n  display: inline-block;\n  align-self: stretch;\n  width: $vr-border-width;\n  min-height: 1em;\n  background-color: currentcolor;\n  opacity: $hr-opacity;\n}\n"
  },
  {
    "path": "scss/mixins/_alert.scss",
    "content": "@include deprecate(\"`alert-variant()`\", \"v5.3.0\", \"v6.0.0\");\n\n// scss-docs-start alert-variant-mixin\n@mixin alert-variant($background, $border, $color) {\n  --#{$prefix}alert-color: #{$color};\n  --#{$prefix}alert-bg: #{$background};\n  --#{$prefix}alert-border-color: #{$border};\n  --#{$prefix}alert-link-color: #{shade-color($color, 20%)};\n\n  @if $enable-gradients {\n    background-image: var(--#{$prefix}gradient);\n  }\n\n  .alert-link {\n    color: var(--#{$prefix}alert-link-color);\n  }\n}\n// scss-docs-end alert-variant-mixin\n"
  },
  {
    "path": "scss/mixins/_backdrop.scss",
    "content": "// Shared between modals and offcanvases\n@mixin overlay-backdrop($zindex, $backdrop-bg, $backdrop-opacity) {\n  position: fixed;\n  top: 0;\n  left: 0;\n  z-index: $zindex;\n  width: 100vw;\n  height: 100vh;\n  background-color: $backdrop-bg;\n\n  // Fade for backdrop\n  &.fade { opacity: 0; }\n  &.show { opacity: $backdrop-opacity; }\n}\n"
  },
  {
    "path": "scss/mixins/_banner.scss",
    "content": "@mixin bsBanner($file) {\n  /*!\n   * Bootstrap #{$file} v5.3.8 (https://getbootstrap.com/)\n   * Copyright 2011-2026 The Bootstrap Authors\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   */\n}\n"
  },
  {
    "path": "scss/mixins/_border-radius.scss",
    "content": "// stylelint-disable property-disallowed-list\n// Single side border-radius\n\n// Helper function to replace negative values with 0\n@function valid-radius($radius) {\n  $return: ();\n  @each $value in $radius {\n    @if type-of($value) == number {\n      $return: append($return, max($value, 0));\n    } @else {\n      $return: append($return, $value);\n    }\n  }\n  @return $return;\n}\n\n// scss-docs-start border-radius-mixins\n@mixin border-radius($radius: $border-radius, $fallback-border-radius: false) {\n  @if $enable-rounded {\n    border-radius: valid-radius($radius);\n  }\n  @else if $fallback-border-radius != false {\n    border-radius: $fallback-border-radius;\n  }\n}\n\n@mixin border-top-radius($radius: $border-radius) {\n  @if $enable-rounded {\n    border-top-left-radius: valid-radius($radius);\n    border-top-right-radius: valid-radius($radius);\n  }\n}\n\n@mixin border-end-radius($radius: $border-radius) {\n  @if $enable-rounded {\n    border-top-right-radius: valid-radius($radius);\n    border-bottom-right-radius: valid-radius($radius);\n  }\n}\n\n@mixin border-bottom-radius($radius: $border-radius) {\n  @if $enable-rounded {\n    border-bottom-right-radius: valid-radius($radius);\n    border-bottom-left-radius: valid-radius($radius);\n  }\n}\n\n@mixin border-start-radius($radius: $border-radius) {\n  @if $enable-rounded {\n    border-top-left-radius: valid-radius($radius);\n    border-bottom-left-radius: valid-radius($radius);\n  }\n}\n\n@mixin border-top-start-radius($radius: $border-radius) {\n  @if $enable-rounded {\n    border-top-left-radius: valid-radius($radius);\n  }\n}\n\n@mixin border-top-end-radius($radius: $border-radius) {\n  @if $enable-rounded {\n    border-top-right-radius: valid-radius($radius);\n  }\n}\n\n@mixin border-bottom-end-radius($radius: $border-radius) {\n  @if $enable-rounded {\n    border-bottom-right-radius: valid-radius($radius);\n  }\n}\n\n@mixin border-bottom-start-radius($radius: $border-radius) {\n  @if $enable-rounded {\n    border-bottom-left-radius: valid-radius($radius);\n  }\n}\n// scss-docs-end border-radius-mixins\n"
  },
  {
    "path": "scss/mixins/_box-shadow.scss",
    "content": "@mixin box-shadow($shadow...) {\n  @if $enable-shadows {\n    $result: ();\n    $has-single-value: false;\n    $single-value: null;\n\n    @each $value in $shadow {\n      @if $value != null {\n        @if $value == none or $value == initial or $value == inherit or $value == unset {\n          $has-single-value: true;\n          $single-value: $value;\n        } @else {\n          $result: append($result, $value, \"comma\");\n        }\n      }\n    }\n\n    @if $has-single-value {\n      box-shadow: $single-value;\n    } @else if (length($result) > 0) {\n      box-shadow: $result;\n    }\n  }\n}\n"
  },
  {
    "path": "scss/mixins/_breakpoints.scss",
    "content": "// Breakpoint viewport sizes and media queries.\n//\n// Breakpoints are defined as a map of (name: minimum width), order from small to large:\n//\n//    (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px)\n//\n// The map defined in the `$grid-breakpoints` global variable is used as the `$breakpoints` argument by default.\n\n// Name of the next breakpoint, or null for the last breakpoint.\n//\n//    >> breakpoint-next(sm)\n//    md\n//    >> breakpoint-next(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n//    md\n//    >> breakpoint-next(sm, $breakpoint-names: (xs sm md lg xl xxl))\n//    md\n@function breakpoint-next($name, $breakpoints: $grid-breakpoints, $breakpoint-names: map-keys($breakpoints)) {\n  $n: index($breakpoint-names, $name);\n  @if not $n {\n    @error \"breakpoint `#{$name}` not found in `#{$breakpoints}`\";\n  }\n  @return if($n < length($breakpoint-names), nth($breakpoint-names, $n + 1), null);\n}\n\n// Minimum breakpoint width. Null for the smallest (first) breakpoint.\n//\n//    >> breakpoint-min(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n//    576px\n@function breakpoint-min($name, $breakpoints: $grid-breakpoints) {\n  $min: map-get($breakpoints, $name);\n  @return if($min != 0, $min, null);\n}\n\n// Maximum breakpoint width.\n// The maximum value is reduced by 0.02px to work around the limitations of\n// `min-` and `max-` prefixes and viewports with fractional widths.\n// See https://www.w3.org/TR/mediaqueries-4/#mq-min-max\n// Uses 0.02px rather than 0.01px to work around a current rounding bug in Safari.\n// See https://bugs.webkit.org/show_bug.cgi?id=178261\n//\n//    >> breakpoint-max(md, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n//    767.98px\n@function breakpoint-max($name, $breakpoints: $grid-breakpoints) {\n  $max: map-get($breakpoints, $name);\n  @return if($max and $max > 0, $max - .02, null);\n}\n\n// Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front.\n// Useful for making responsive utilities.\n//\n//    >> breakpoint-infix(xs, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n//    \"\"  (Returns a blank string)\n//    >> breakpoint-infix(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n//    \"-sm\"\n@function breakpoint-infix($name, $breakpoints: $grid-breakpoints) {\n  @return if(breakpoint-min($name, $breakpoints) == null, \"\", \"-#{$name}\");\n}\n\n// Media of at least the minimum breakpoint width. No query for the smallest breakpoint.\n// Makes the @content apply to the given breakpoint and wider.\n@mixin media-breakpoint-up($name, $breakpoints: $grid-breakpoints) {\n  $min: breakpoint-min($name, $breakpoints);\n  @if $min {\n    @media (min-width: $min) {\n      @content;\n    }\n  } @else {\n    @content;\n  }\n}\n\n// Media of at most the maximum breakpoint width. No query for the largest breakpoint.\n// Makes the @content apply to the given breakpoint and narrower.\n@mixin media-breakpoint-down($name, $breakpoints: $grid-breakpoints) {\n  $max: breakpoint-max($name, $breakpoints);\n  @if $max {\n    @media (max-width: $max) {\n      @content;\n    }\n  } @else {\n    @content;\n  }\n}\n\n// Media that spans multiple breakpoint widths.\n// Makes the @content apply between the min and max breakpoints\n@mixin media-breakpoint-between($lower, $upper, $breakpoints: $grid-breakpoints) {\n  $min: breakpoint-min($lower, $breakpoints);\n  $max: breakpoint-max($upper, $breakpoints);\n\n  @if $min != null and $max != null {\n    @media (min-width: $min) and (max-width: $max) {\n      @content;\n    }\n  } @else if $max == null {\n    @include media-breakpoint-up($lower, $breakpoints) {\n      @content;\n    }\n  } @else if $min == null {\n    @include media-breakpoint-down($upper, $breakpoints) {\n      @content;\n    }\n  }\n}\n\n// Media between the breakpoint's minimum and maximum widths.\n// No minimum for the smallest breakpoint, and no maximum for the largest one.\n// Makes the @content apply only to the given breakpoint, not viewports any wider or narrower.\n@mixin media-breakpoint-only($name, $breakpoints: $grid-breakpoints) {\n  $min:  breakpoint-min($name, $breakpoints);\n  $next: breakpoint-next($name, $breakpoints);\n  $max:  breakpoint-max($next, $breakpoints);\n\n  @if $min != null and $max != null {\n    @media (min-width: $min) and (max-width: $max) {\n      @content;\n    }\n  } @else if $max == null {\n    @include media-breakpoint-up($name, $breakpoints) {\n      @content;\n    }\n  } @else if $min == null {\n    @include media-breakpoint-down($next, $breakpoints) {\n      @content;\n    }\n  }\n}\n"
  },
  {
    "path": "scss/mixins/_buttons.scss",
    "content": "// Button variants\n//\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for all buttons\n\n// scss-docs-start btn-variant-mixin\n@mixin button-variant(\n  $background,\n  $border,\n  $color: color-contrast($background),\n  $hover-background: if($color == $color-contrast-light, shade-color($background, $btn-hover-bg-shade-amount), tint-color($background, $btn-hover-bg-tint-amount)),\n  $hover-border: if($color == $color-contrast-light, shade-color($border, $btn-hover-border-shade-amount), tint-color($border, $btn-hover-border-tint-amount)),\n  $hover-color: color-contrast($hover-background),\n  $active-background: if($color == $color-contrast-light, shade-color($background, $btn-active-bg-shade-amount), tint-color($background, $btn-active-bg-tint-amount)),\n  $active-border: if($color == $color-contrast-light, shade-color($border, $btn-active-border-shade-amount), tint-color($border, $btn-active-border-tint-amount)),\n  $active-color: color-contrast($active-background),\n  $disabled-background: $background,\n  $disabled-border: $border,\n  $disabled-color: color-contrast($disabled-background)\n) {\n  --#{$prefix}btn-color: #{$color};\n  --#{$prefix}btn-bg: #{$background};\n  --#{$prefix}btn-border-color: #{$border};\n  --#{$prefix}btn-hover-color: #{$hover-color};\n  --#{$prefix}btn-hover-bg: #{$hover-background};\n  --#{$prefix}btn-hover-border-color: #{$hover-border};\n  --#{$prefix}btn-focus-shadow-rgb: #{to-rgb(mix($color, $border, 15%))};\n  --#{$prefix}btn-active-color: #{$active-color};\n  --#{$prefix}btn-active-bg: #{$active-background};\n  --#{$prefix}btn-active-border-color: #{$active-border};\n  --#{$prefix}btn-active-shadow: #{$btn-active-box-shadow};\n  --#{$prefix}btn-disabled-color: #{$disabled-color};\n  --#{$prefix}btn-disabled-bg: #{$disabled-background};\n  --#{$prefix}btn-disabled-border-color: #{$disabled-border};\n}\n// scss-docs-end btn-variant-mixin\n\n// scss-docs-start btn-outline-variant-mixin\n@mixin button-outline-variant(\n  $color,\n  $color-hover: color-contrast($color),\n  $active-background: $color,\n  $active-border: $color,\n  $active-color: color-contrast($active-background)\n) {\n  --#{$prefix}btn-color: #{$color};\n  --#{$prefix}btn-border-color: #{$color};\n  --#{$prefix}btn-hover-color: #{$color-hover};\n  --#{$prefix}btn-hover-bg: #{$active-background};\n  --#{$prefix}btn-hover-border-color: #{$active-border};\n  --#{$prefix}btn-focus-shadow-rgb: #{to-rgb($color)};\n  --#{$prefix}btn-active-color: #{$active-color};\n  --#{$prefix}btn-active-bg: #{$active-background};\n  --#{$prefix}btn-active-border-color: #{$active-border};\n  --#{$prefix}btn-active-shadow: #{$btn-active-box-shadow};\n  --#{$prefix}btn-disabled-color: #{$color};\n  --#{$prefix}btn-disabled-bg: transparent;\n  --#{$prefix}btn-disabled-border-color: #{$color};\n  --#{$prefix}gradient: none;\n}\n// scss-docs-end btn-outline-variant-mixin\n\n// scss-docs-start btn-size-mixin\n@mixin button-size($padding-y, $padding-x, $font-size, $border-radius) {\n  --#{$prefix}btn-padding-y: #{$padding-y};\n  --#{$prefix}btn-padding-x: #{$padding-x};\n  @include rfs($font-size, --#{$prefix}btn-font-size);\n  --#{$prefix}btn-border-radius: #{$border-radius};\n}\n// scss-docs-end btn-size-mixin\n"
  },
  {
    "path": "scss/mixins/_caret.scss",
    "content": "// scss-docs-start caret-mixins\n@mixin caret-down($width: $caret-width) {\n  border-top: $width solid;\n  border-right: $width solid transparent;\n  border-bottom: 0;\n  border-left: $width solid transparent;\n}\n\n@mixin caret-up($width: $caret-width) {\n  border-top: 0;\n  border-right: $width solid transparent;\n  border-bottom: $width solid;\n  border-left: $width solid transparent;\n}\n\n@mixin caret-end($width: $caret-width) {\n  border-top: $width solid transparent;\n  border-right: 0;\n  border-bottom: $width solid transparent;\n  border-left: $width solid;\n}\n\n@mixin caret-start($width: $caret-width) {\n  border-top: $width solid transparent;\n  border-right: $width solid;\n  border-bottom: $width solid transparent;\n}\n\n@mixin caret(\n  $direction: down,\n  $width: $caret-width,\n  $spacing: $caret-spacing,\n  $vertical-align: $caret-vertical-align\n) {\n  @if $enable-caret {\n    &::after {\n      display: inline-block;\n      margin-left: $spacing;\n      vertical-align: $vertical-align;\n      content: \"\";\n      @if $direction == down {\n        @include caret-down($width);\n      } @else if $direction == up {\n        @include caret-up($width);\n      } @else if $direction == end {\n        @include caret-end($width);\n      }\n    }\n\n    @if $direction == start {\n      &::after {\n        display: none;\n      }\n\n      &::before {\n        display: inline-block;\n        margin-right: $spacing;\n        vertical-align: $vertical-align;\n        content: \"\";\n        @include caret-start($width);\n      }\n    }\n\n    &:empty::after {\n      margin-left: 0;\n    }\n  }\n}\n// scss-docs-end caret-mixins\n"
  },
  {
    "path": "scss/mixins/_clearfix.scss",
    "content": "// scss-docs-start clearfix\n@mixin clearfix() {\n  &::after {\n    display: block;\n    clear: both;\n    content: \"\";\n  }\n}\n// scss-docs-end clearfix\n"
  },
  {
    "path": "scss/mixins/_color-mode.scss",
    "content": "// scss-docs-start color-mode-mixin\n@mixin color-mode($mode: light, $root: false) {\n  @if $color-mode-type == \"media-query\" {\n    @if $root == true {\n      @media (prefers-color-scheme: $mode) {\n        :root {\n          @content;\n        }\n      }\n    } @else {\n      @media (prefers-color-scheme: $mode) {\n        @content;\n      }\n    }\n  } @else {\n    [data-bs-theme=\"#{$mode}\"] {\n      @content;\n    }\n  }\n}\n// scss-docs-end color-mode-mixin\n"
  },
  {
    "path": "scss/mixins/_color-scheme.scss",
    "content": "// scss-docs-start mixin-color-scheme\n@mixin color-scheme($name) {\n  @media (prefers-color-scheme: #{$name}) {\n    @content;\n  }\n}\n// scss-docs-end mixin-color-scheme\n"
  },
  {
    "path": "scss/mixins/_container.scss",
    "content": "// Container mixins\n\n@mixin make-container($gutter: $container-padding-x) {\n  --#{$prefix}gutter-x: #{$gutter};\n  --#{$prefix}gutter-y: 0;\n  width: 100%;\n  padding-right: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n  padding-left: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n  margin-right: auto;\n  margin-left: auto;\n}\n"
  },
  {
    "path": "scss/mixins/_deprecate.scss",
    "content": "// Deprecate mixin\n//\n// This mixin can be used to deprecate mixins or functions.\n// `$enable-deprecation-messages` is a global variable, `$ignore-warning` is a variable that can be passed to\n// some deprecated mixins to suppress the warning (for example if the mixin is still be used in the current version of Bootstrap)\n@mixin deprecate($name, $deprecate-version, $remove-version, $ignore-warning: false) {\n  @if ($enable-deprecation-messages != false and $ignore-warning != true) {\n    @warn \"#{$name} has been deprecated as of #{$deprecate-version}. It will be removed entirely in #{$remove-version}.\";\n  }\n}\n"
  },
  {
    "path": "scss/mixins/_forms.scss",
    "content": "// This mixin uses an `if()` technique to be compatible with Dart Sass\n// See https://github.com/sass/sass/issues/1873#issuecomment-152293725 for more details\n\n// scss-docs-start form-validation-mixins\n@mixin form-validation-state-selector($state) {\n  @if ($state == \"valid\" or $state == \"invalid\") {\n    .was-validated #{if(&, \"&\", \"\")}:#{$state},\n    #{if(&, \"&\", \"\")}.is-#{$state} {\n      @content;\n    }\n  } @else {\n    #{if(&, \"&\", \"\")}.is-#{$state} {\n      @content;\n    }\n  }\n}\n\n@mixin form-validation-state(\n  $state,\n  $color,\n  $icon,\n  $tooltip-color: color-contrast($color),\n  $tooltip-bg-color: rgba($color, $form-feedback-tooltip-opacity),\n  $focus-box-shadow: 0 0 $input-btn-focus-blur $input-focus-width rgba($color, $input-btn-focus-color-opacity),\n  $border-color: $color\n) {\n  .#{$state}-feedback {\n    display: none;\n    width: 100%;\n    margin-top: $form-feedback-margin-top;\n    @include font-size($form-feedback-font-size);\n    font-style: $form-feedback-font-style;\n    color: $color;\n  }\n\n  .#{$state}-tooltip {\n    position: absolute;\n    top: 100%;\n    z-index: 5;\n    display: none;\n    max-width: 100%; // Contain to parent when possible\n    padding: $form-feedback-tooltip-padding-y $form-feedback-tooltip-padding-x;\n    margin-top: .1rem;\n    @include font-size($form-feedback-tooltip-font-size);\n    line-height: $form-feedback-tooltip-line-height;\n    color: $tooltip-color;\n    background-color: $tooltip-bg-color;\n    @include border-radius($form-feedback-tooltip-border-radius);\n  }\n\n  @include form-validation-state-selector($state) {\n    ~ .#{$state}-feedback,\n    ~ .#{$state}-tooltip {\n      display: block;\n    }\n  }\n\n  .form-control {\n    @include form-validation-state-selector($state) {\n      border-color: $border-color;\n\n      @if $enable-validation-icons {\n        padding-right: $input-height-inner;\n        background-image: escape-svg($icon);\n        background-repeat: no-repeat;\n        background-position: right $input-height-inner-quarter center;\n        background-size: $input-height-inner-half $input-height-inner-half;\n      }\n\n      &:focus {\n        border-color: $border-color;\n        @if $enable-shadows {\n          @include box-shadow($input-box-shadow, $focus-box-shadow);\n        } @else {\n          // Avoid using mixin so we can pass custom focus shadow properly\n          box-shadow: $focus-box-shadow;\n        }\n      }\n    }\n  }\n\n  // stylelint-disable-next-line selector-no-qualifying-type\n  textarea.form-control {\n    @include form-validation-state-selector($state) {\n      @if $enable-validation-icons {\n        padding-right: $input-height-inner;\n        background-position: top $input-height-inner-quarter right $input-height-inner-quarter;\n      }\n    }\n  }\n\n  .form-select {\n    @include form-validation-state-selector($state) {\n      border-color: $border-color;\n\n      @if $enable-validation-icons {\n        &:not([multiple]):not([size]),\n        &:not([multiple])[size=\"1\"] {\n          --#{$prefix}form-select-bg-icon: #{escape-svg($icon)};\n          padding-right: $form-select-feedback-icon-padding-end;\n          background-position: $form-select-bg-position, $form-select-feedback-icon-position;\n          background-size: $form-select-bg-size, $form-select-feedback-icon-size;\n        }\n      }\n\n      &:focus {\n        border-color: $border-color;\n        @if $enable-shadows {\n          @include box-shadow($form-select-box-shadow, $focus-box-shadow);\n        } @else {\n          // Avoid using mixin so we can pass custom focus shadow properly\n          box-shadow: $focus-box-shadow;\n        }\n      }\n    }\n  }\n\n  .form-control-color {\n    @include form-validation-state-selector($state) {\n      @if $enable-validation-icons {\n        width: add($form-color-width, $input-height-inner);\n      }\n    }\n  }\n\n  .form-check-input {\n    @include form-validation-state-selector($state) {\n      border-color: $border-color;\n\n      &:checked {\n        background-color: $color;\n      }\n\n      &:focus {\n        box-shadow: $focus-box-shadow;\n      }\n\n      ~ .form-check-label {\n        color: $color;\n      }\n    }\n  }\n  .form-check-inline .form-check-input {\n    ~ .#{$state}-feedback {\n      margin-left: .5em;\n    }\n  }\n\n  .input-group {\n    > .form-control:not(:focus),\n    > .form-select:not(:focus),\n    > .form-floating:not(:focus-within) {\n      @include form-validation-state-selector($state) {\n        @if $state == \"valid\" {\n          z-index: 3;\n        } @else if $state == \"invalid\" {\n          z-index: 4;\n        }\n      }\n    }\n  }\n}\n// scss-docs-end form-validation-mixins\n"
  },
  {
    "path": "scss/mixins/_gradients.scss",
    "content": "// Gradients\n\n// scss-docs-start gradient-bg-mixin\n@mixin gradient-bg($color: null) {\n  background-color: $color;\n\n  @if $enable-gradients {\n    background-image: var(--#{$prefix}gradient);\n  }\n}\n// scss-docs-end gradient-bg-mixin\n\n// scss-docs-start gradient-mixins\n// Horizontal gradient, from left to right\n//\n// Creates two color stops, start and end, by specifying a color and position for each color stop.\n@mixin gradient-x($start-color: $gray-700, $end-color: $gray-800, $start-percent: 0%, $end-percent: 100%) {\n  background-image: linear-gradient(to right, $start-color $start-percent, $end-color $end-percent);\n}\n\n// Vertical gradient, from top to bottom\n//\n// Creates two color stops, start and end, by specifying a color and position for each color stop.\n@mixin gradient-y($start-color: $gray-700, $end-color: $gray-800, $start-percent: null, $end-percent: null) {\n  background-image: linear-gradient(to bottom, $start-color $start-percent, $end-color $end-percent);\n}\n\n@mixin gradient-directional($start-color: $gray-700, $end-color: $gray-800, $deg: 45deg) {\n  background-image: linear-gradient($deg, $start-color, $end-color);\n}\n\n@mixin gradient-x-three-colors($start-color: $blue, $mid-color: $purple, $color-stop: 50%, $end-color: $red) {\n  background-image: linear-gradient(to right, $start-color, $mid-color $color-stop, $end-color);\n}\n\n@mixin gradient-y-three-colors($start-color: $blue, $mid-color: $purple, $color-stop: 50%, $end-color: $red) {\n  background-image: linear-gradient($start-color, $mid-color $color-stop, $end-color);\n}\n\n@mixin gradient-radial($inner-color: $gray-700, $outer-color: $gray-800) {\n  background-image: radial-gradient(circle, $inner-color, $outer-color);\n}\n\n@mixin gradient-striped($color: rgba($white, .15), $angle: 45deg) {\n  background-image: linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent);\n}\n// scss-docs-end gradient-mixins\n"
  },
  {
    "path": "scss/mixins/_grid.scss",
    "content": "// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n@mixin make-row($gutter: $grid-gutter-width) {\n  --#{$prefix}gutter-x: #{$gutter};\n  --#{$prefix}gutter-y: 0;\n  display: flex;\n  flex-wrap: wrap;\n  // TODO: Revisit calc order after https://github.com/react-bootstrap/react-bootstrap/issues/6039 is fixed\n  margin-top: calc(-1 * var(--#{$prefix}gutter-y)); // stylelint-disable-line function-disallowed-list\n  margin-right: calc(-.5 * var(--#{$prefix}gutter-x)); // stylelint-disable-line function-disallowed-list\n  margin-left: calc(-.5 * var(--#{$prefix}gutter-x)); // stylelint-disable-line function-disallowed-list\n}\n\n@mixin make-col-ready() {\n  // Add box sizing if only the grid is loaded\n  box-sizing: if(variable-exists(include-column-box-sizing) and $include-column-box-sizing, border-box, null);\n  // Prevent columns from becoming too narrow when at smaller grid tiers by\n  // always setting `width: 100%;`. This works because we set the width\n  // later on to override this initial width.\n  flex-shrink: 0;\n  width: 100%;\n  max-width: 100%; // Prevent `.col-auto`, `.col` (& responsive variants) from breaking out the grid\n  padding-right: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n  padding-left: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n  margin-top: var(--#{$prefix}gutter-y);\n}\n\n@mixin make-col($size: false, $columns: $grid-columns) {\n  @if $size {\n    flex: 0 0 auto;\n    width: percentage(divide($size, $columns));\n\n  } @else {\n    flex: 1 1 0;\n    max-width: 100%;\n  }\n}\n\n@mixin make-col-auto() {\n  flex: 0 0 auto;\n  width: auto;\n}\n\n@mixin make-col-offset($size, $columns: $grid-columns) {\n  $num: divide($size, $columns);\n  margin-left: if($num == 0, 0, percentage($num));\n}\n\n// Row columns\n//\n// Specify on a parent element(e.g., .row) to force immediate children into NN\n// number of columns. Supports wrapping to new lines, but does not do a Masonry\n// style grid.\n@mixin row-cols($count) {\n  > * {\n    flex: 0 0 auto;\n    width: percentage(divide(1, $count));\n  }\n}\n\n// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `$grid-columns`.\n\n@mixin make-grid-columns($columns: $grid-columns, $gutter: $grid-gutter-width, $breakpoints: $grid-breakpoints) {\n  @each $breakpoint in map-keys($breakpoints) {\n    $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n    @include media-breakpoint-up($breakpoint, $breakpoints) {\n      // Provide basic `.col-{bp}` classes for equal-width flexbox columns\n      .col#{$infix} {\n        flex: 1 0 0;\n      }\n\n      .row-cols#{$infix}-auto > * {\n        @include make-col-auto();\n      }\n\n      @if $grid-row-columns > 0 {\n        @for $i from 1 through $grid-row-columns {\n          .row-cols#{$infix}-#{$i} {\n            @include row-cols($i);\n          }\n        }\n      }\n\n      .col#{$infix}-auto {\n        @include make-col-auto();\n      }\n\n      @if $columns > 0 {\n        @for $i from 1 through $columns {\n          .col#{$infix}-#{$i} {\n            @include make-col($i, $columns);\n          }\n        }\n\n        // `$columns - 1` because offsetting by the width of an entire row isn't possible\n        @for $i from 0 through ($columns - 1) {\n          @if not ($infix == \"\" and $i == 0) { // Avoid emitting useless .offset-0\n            .offset#{$infix}-#{$i} {\n              @include make-col-offset($i, $columns);\n            }\n          }\n        }\n      }\n\n      // Gutters\n      //\n      // Make use of `.g-*`, `.gx-*` or `.gy-*` utilities to change spacing between the columns.\n      @each $key, $value in $gutters {\n        .g#{$infix}-#{$key},\n        .gx#{$infix}-#{$key} {\n          --#{$prefix}gutter-x: #{$value};\n        }\n\n        .g#{$infix}-#{$key},\n        .gy#{$infix}-#{$key} {\n          --#{$prefix}gutter-y: #{$value};\n        }\n      }\n    }\n  }\n}\n\n@mixin make-cssgrid($columns: $grid-columns, $breakpoints: $grid-breakpoints) {\n  @each $breakpoint in map-keys($breakpoints) {\n    $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n    @include media-breakpoint-up($breakpoint, $breakpoints) {\n      @if $columns > 0 {\n        @for $i from 1 through $columns {\n          .g-col#{$infix}-#{$i} {\n            grid-column: auto / span $i;\n          }\n        }\n\n        // Start with `1` because `0` is an invalid value.\n        // Ends with `$columns - 1` because offsetting by the width of an entire row isn't possible.\n        @for $i from 1 through ($columns - 1) {\n          .g-start#{$infix}-#{$i} {\n            grid-column-start: $i;\n          }\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "scss/mixins/_image.scss",
    "content": "// Image Mixins\n// - Responsive image\n// - Retina image\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n\n@mixin img-fluid {\n  // Part 1: Set a maximum relative to the parent\n  max-width: 100%;\n  // Part 2: Override the height to auto, otherwise images will be stretched\n  // when setting a width and height attribute on the img element.\n  height: auto;\n}\n"
  },
  {
    "path": "scss/mixins/_list-group.scss",
    "content": "@include deprecate(\"`list-group-item-variant()`\", \"v5.3.0\", \"v6.0.0\");\n\n// List Groups\n\n// scss-docs-start list-group-mixin\n@mixin list-group-item-variant($state, $background, $color) {\n  .list-group-item-#{$state} {\n    color: $color;\n    background-color: $background;\n\n    &.list-group-item-action {\n      &:hover,\n      &:focus {\n        color: $color;\n        background-color: shade-color($background, 10%);\n      }\n\n      &.active {\n        color: $white;\n        background-color: $color;\n        border-color: $color;\n      }\n    }\n  }\n}\n// scss-docs-end list-group-mixin\n"
  },
  {
    "path": "scss/mixins/_lists.scss",
    "content": "// Lists\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n@mixin list-unstyled {\n  padding-left: 0;\n  list-style: none;\n}\n"
  },
  {
    "path": "scss/mixins/_pagination.scss",
    "content": "// Pagination\n\n// scss-docs-start pagination-mixin\n@mixin pagination-size($padding-y, $padding-x, $font-size, $border-radius) {\n  --#{$prefix}pagination-padding-x: #{$padding-x};\n  --#{$prefix}pagination-padding-y: #{$padding-y};\n  @include rfs($font-size, --#{$prefix}pagination-font-size);\n  --#{$prefix}pagination-border-radius: #{$border-radius};\n}\n// scss-docs-end pagination-mixin\n"
  },
  {
    "path": "scss/mixins/_reset-text.scss",
    "content": "@mixin reset-text {\n  font-family: $font-family-base;\n  // We deliberately do NOT reset font-size or overflow-wrap / word-wrap.\n  font-style: normal;\n  font-weight: $font-weight-normal;\n  line-height: $line-height-base;\n  text-align: left; // Fallback for where `start` is not supported\n  text-align: start;\n  text-decoration: none;\n  text-shadow: none;\n  text-transform: none;\n  letter-spacing: normal;\n  word-break: normal;\n  white-space: normal;\n  word-spacing: normal;\n  line-break: auto;\n}\n"
  },
  {
    "path": "scss/mixins/_resize.scss",
    "content": "// Resize anything\n\n@mixin resizable($direction) {\n  overflow: auto; // Per CSS3 UI, `resize` only applies when `overflow` isn't `visible`\n  resize: $direction; // Options: horizontal, vertical, both\n}\n"
  },
  {
    "path": "scss/mixins/_table-variants.scss",
    "content": "// scss-docs-start table-variant\n@mixin table-variant($state, $background) {\n  .table-#{$state} {\n    $color: color-contrast(opaque($body-bg, $background));\n    $hover-bg: mix($color, $background, percentage($table-hover-bg-factor));\n    $striped-bg: mix($color, $background, percentage($table-striped-bg-factor));\n    $active-bg: mix($color, $background, percentage($table-active-bg-factor));\n    $table-border-color: mix($color, $background, percentage($table-border-factor));\n\n    --#{$prefix}table-color: #{$color};\n    --#{$prefix}table-bg: #{$background};\n    --#{$prefix}table-border-color: #{$table-border-color};\n    --#{$prefix}table-striped-bg: #{$striped-bg};\n    --#{$prefix}table-striped-color: #{color-contrast($striped-bg)}; // stylelint-disable-line scss/dollar-variable-no-missing-interpolation\n    --#{$prefix}table-active-bg: #{$active-bg};\n    --#{$prefix}table-active-color: #{color-contrast($active-bg)}; // stylelint-disable-line scss/dollar-variable-no-missing-interpolation\n    --#{$prefix}table-hover-bg: #{$hover-bg};\n    --#{$prefix}table-hover-color: #{color-contrast($hover-bg)}; // stylelint-disable-line scss/dollar-variable-no-missing-interpolation\n\n    color: var(--#{$prefix}table-color);\n    border-color: var(--#{$prefix}table-border-color);\n  }\n}\n// scss-docs-end table-variant\n"
  },
  {
    "path": "scss/mixins/_text-truncate.scss",
    "content": "// Text truncate\n// Requires inline-block or block for proper styling\n\n@mixin text-truncate() {\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n"
  },
  {
    "path": "scss/mixins/_transition.scss",
    "content": "// stylelint-disable property-disallowed-list\n@mixin transition($transition...) {\n  @if length($transition) == 0 {\n    $transition: $transition-base;\n  }\n\n  @if length($transition) > 1 {\n    @each $value in $transition {\n      @if $value == null or $value == none {\n        @warn \"The keyword 'none' or 'null' must be used as a single argument.\";\n      }\n    }\n  }\n\n  @if $enable-transitions {\n    @if nth($transition, 1) != null {\n      transition: $transition;\n    }\n\n    @if $enable-reduced-motion and nth($transition, 1) != null and nth($transition, 1) != none {\n      @media (prefers-reduced-motion: reduce) {\n        transition: none;\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "scss/mixins/_utilities.scss",
    "content": "// Utility generator\n// Used to generate utilities & print utilities\n@mixin generate-utility($utility, $infix: \"\", $is-rfs-media-query: false) {\n  $values: map-get($utility, values);\n\n  // If the values are a list or string, convert it into a map\n  @if type-of($values) == \"string\" or type-of(nth($values, 1)) != \"list\" {\n    $values: zip($values, $values);\n  }\n\n  @each $key, $value in $values {\n    $properties: map-get($utility, property);\n\n    // Multiple properties are possible, for example with vertical or horizontal margins or paddings\n    @if type-of($properties) == \"string\" {\n      $properties: append((), $properties);\n    }\n\n    // Use custom class if present\n    $property-class: if(map-has-key($utility, class), map-get($utility, class), nth($properties, 1));\n    $property-class: if($property-class == null, \"\", $property-class);\n\n    // Use custom CSS variable name if present, otherwise default to `class`\n    $css-variable-name: if(map-has-key($utility, css-variable-name), map-get($utility, css-variable-name), map-get($utility, class));\n\n    // State params to generate pseudo-classes\n    $state: if(map-has-key($utility, state), map-get($utility, state), ());\n\n    $infix: if($property-class == \"\" and str-slice($infix, 1, 1) == \"-\", str-slice($infix, 2), $infix);\n\n    // Don't prefix if value key is null (e.g. with shadow class)\n    $property-class-modifier: if($key, if($property-class == \"\" and $infix == \"\", \"\", \"-\") + $key, \"\");\n\n    @if map-get($utility, rfs) {\n      // Inside the media query\n      @if $is-rfs-media-query {\n        $val: rfs-value($value);\n\n        // Do not render anything if fluid and non fluid values are the same\n        $value: if($val == rfs-fluid-value($value), null, $val);\n      }\n      @else {\n        $value: rfs-fluid-value($value);\n      }\n    }\n\n    $is-css-var: map-get($utility, css-var);\n    $is-local-vars: map-get($utility, local-vars);\n    $is-rtl: map-get($utility, rtl);\n\n    @if $value != null {\n      @if $is-rtl == false {\n        /* rtl:begin:remove */\n      }\n\n      @if $is-css-var {\n        .#{$property-class + $infix + $property-class-modifier} {\n          --#{$prefix}#{$css-variable-name}: #{$value};\n        }\n\n        @each $pseudo in $state {\n          .#{$property-class + $infix + $property-class-modifier}-#{$pseudo}:#{$pseudo} {\n            --#{$prefix}#{$css-variable-name}: #{$value};\n          }\n        }\n      } @else {\n        .#{$property-class + $infix + $property-class-modifier} {\n          @each $property in $properties {\n            @if $is-local-vars {\n              @each $local-var, $variable in $is-local-vars {\n                --#{$prefix}#{$local-var}: #{$variable};\n              }\n            }\n            #{$property}: $value if($enable-important-utilities, !important, null);\n          }\n        }\n\n        @each $pseudo in $state {\n          .#{$property-class + $infix + $property-class-modifier}-#{$pseudo}:#{$pseudo} {\n            @each $property in $properties {\n              @if $is-local-vars {\n                @each $local-var, $variable in $is-local-vars {\n                  --#{$prefix}#{$local-var}: #{$variable};\n                }\n              }\n              #{$property}: $value if($enable-important-utilities, !important, null);\n            }\n          }\n        }\n      }\n\n      @if $is-rtl == false {\n        /* rtl:end:remove */\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "scss/mixins/_visually-hidden.scss",
    "content": "// stylelint-disable declaration-no-important\n\n// Hide content visually while keeping it accessible to assistive technologies\n//\n// See: https://www.a11yproject.com/posts/2013-01-11-how-to-hide-content/\n// See: https://kittygiraudel.com/2016/10/13/css-hide-and-seek/\n\n@mixin visually-hidden() {\n  width: 1px !important;\n  height: 1px !important;\n  padding: 0 !important;\n  margin: -1px !important; // Fix for https://github.com/twbs/bootstrap/issues/25686\n  overflow: hidden !important;\n  clip: rect(0, 0, 0, 0) !important;\n  white-space: nowrap !important;\n  border: 0 !important;\n\n  // Fix for positioned table caption that could become anonymous cells\n  &:not(caption) {\n    position: absolute !important;\n  }\n\n  // Fix to prevent overflowing children to become focusable\n  * {\n    overflow: hidden !important;\n  }\n}\n\n// Use to only display content when it's focused, or one of its child elements is focused\n// (i.e. when focus is within the element/container that the class was applied to)\n//\n// Useful for \"Skip to main content\" links; see https://www.w3.org/WAI/WCAG22/Techniques/general/G1.html\n\n@mixin visually-hidden-focusable() {\n  &:not(:focus):not(:focus-within) {\n    @include visually-hidden();\n  }\n}\n"
  },
  {
    "path": "scss/tests/jasmine.js",
    "content": "/* eslint-disable camelcase */\n\n'use strict'\n\nconst path = require('node:path')\n\nmodule.exports = {\n  spec_dir: 'scss',\n  // Make Jasmine look for `.test.scss` files\n  spec_files: ['**/*.{test,spec}.scss'],\n  // Compile them into JS scripts running `sass-true`\n  requires: [path.join(__dirname, 'sass-true/register')],\n  // Ensure we use `require` so that the require.extensions works\n  // as `import` completely bypasses it\n  jsLoader: 'require'\n}\n"
  },
  {
    "path": "scss/tests/mixins/_auto-import-of-variables-dark.test.scss",
    "content": "// TODO: this file can be removed safely in v6 when `@import \"variables-dark\"` will be removed at the end of _variables.scss\n\n@import \"../../functions\";\n@import \"../../variables\";\n// Voluntarily not importing _variables-dark.scss\n@import \"../../maps\";\n@import \"../../mixins\";\n"
  },
  {
    "path": "scss/tests/mixins/_box-shadow.test.scss",
    "content": "@import \"../../functions\";\n@import \"../../variables\";\n@import \"../../mixins\";\n\n// Store original value\n$original-enable-shadows: $enable-shadows;\n\n// Enable shadows for all tests\n$enable-shadows: true !global;\n\n@include describe(\"box-shadow mixin\") {\n  @include it(\"handles single none value\") {\n    @include assert() {\n      @include output() {\n        .test {\n          @include box-shadow(none);\n        }\n      }\n\n      @include expect() {\n        .test {\n          box-shadow: none;\n        }\n      }\n    }\n  }\n\n  @include it(\"handles multiple none values by consolidating them\") {\n    @include assert() {\n      @include output() {\n        .test {\n          @include box-shadow(none, none, none);\n        }\n      }\n\n      @include expect() {\n        .test {\n          box-shadow: none;\n        }\n      }\n    }\n  }\n\n  @include it(\"handles other single-value keywords (initial, inherit, unset)\") {\n    @include assert() {\n      @include output() {\n        .test-initial {\n          @include box-shadow(initial);\n        }\n        .test-inherit {\n          @include box-shadow(inherit);\n        }\n        .test-unset {\n          @include box-shadow(unset);\n        }\n      }\n\n      @include expect() {\n        .test-initial {\n          box-shadow: initial;\n        }\n        .test-inherit {\n          box-shadow: inherit;\n        }\n        .test-unset {\n          box-shadow: unset;\n        }\n      }\n    }\n  }\n\n  @include it(\"handles multiple single-value keywords by using the last one\") {\n    @include assert() {\n      @include output() {\n        .test {\n          @include box-shadow(initial, inherit, unset);\n        }\n      }\n\n      @include expect() {\n        .test {\n          box-shadow: unset;\n        }\n      }\n    }\n  }\n\n  @include it(\"handles regular box-shadow values\") {\n    @include assert() {\n      @include output() {\n        .test {\n          @include box-shadow(0 0 10px rgba(0, 0, 0, .5));\n        }\n      }\n\n      @include expect() {\n        .test {\n          box-shadow: 0 0 10px rgba(0, 0, 0, .5);\n        }\n      }\n    }\n  }\n\n  @include it(\"handles multiple regular box-shadow values\") {\n    @include assert() {\n      @include output() {\n        .test {\n          @include box-shadow(0 0 10px rgba(0, 0, 0, .5), 0 0 20px rgba(0, 0, 0, .3));\n        }\n      }\n\n      @include expect() {\n        .test {\n          box-shadow: 0 0 10px rgba(0, 0, 0, .5), 0 0 20px rgba(0, 0, 0, .3);\n        }\n      }\n    }\n  }\n\n  @include it(\"handles null values by ignoring them\") {\n    @include assert() {\n      @include output() {\n        .test {\n          @include box-shadow(null, 0 0 10px rgba(0, 0, 0, .5), null);\n        }\n      }\n\n      @include expect() {\n        .test {\n          box-shadow: 0 0 10px rgba(0, 0, 0, .5);\n        }\n      }\n    }\n  }\n\n  @include it(\"handles mixed values with keywords and regular shadows\") {\n    @include assert() {\n      @include output() {\n        .test {\n          @include box-shadow(none, 0 0 10px rgba(0, 0, 0, .5));\n        }\n      }\n\n      @include expect() {\n        .test {\n          box-shadow: none;\n        }\n      }\n    }\n  }\n\n  @include it(\"handles empty input\") {\n    @include assert() {\n      @include output() {\n        .test {\n          @include box-shadow();\n        }\n      }\n\n      @include expect() {\n        .test { // stylelint-disable-line block-no-empty\n        }\n      }\n    }\n  }\n\n  @include it(\"respects $enable-shadows variable\") {\n    $enable-shadows: false !global;\n\n    @include assert() {\n      @include output() {\n        .test {\n          @include box-shadow(0 0 10px rgba(0, 0, 0, .5));\n        }\n      }\n\n      @include expect() {\n        .test { // stylelint-disable-line block-no-empty\n        }\n      }\n    }\n\n    $enable-shadows: true !global;\n  }\n}\n\n// Restore original value\n$enable-shadows: $original-enable-shadows !global;\n"
  },
  {
    "path": "scss/tests/mixins/_color-contrast.test.scss",
    "content": "@import \"../../functions\";\n@import \"../../variables\";\n@import \"../../variables-dark\";\n@import \"../../maps\";\n@import \"../../mixins\";\n\n@include describe(\"color-contrast function\") {\n  @include it(\"should return a color when contrast ratio equals minimum requirement (WCAG 2.1 compliance)\") {\n    // Test case: Background color that produces contrast ratio close to 4.5:1\n    // This tests the WCAG 2.1 requirement that contrast should be \"at least 4.5:1\" (>= 4.5)\n    // rather than \"strictly greater than 4.5:1\" (> 4.5)\n\n    // #777777 produces 4.4776:1 contrast ratio with white text\n    // Since this is below the 4.5:1 threshold, it should return the highest available contrast color\n    $test-background: #777;\n    $result: color-contrast($test-background);\n\n    @include assert-equal($result, $black, \"Should return black (highest available contrast) for background with 4.4776:1 contrast ratio (below threshold)\");\n  }\n\n  @include it(\"should return a color when contrast ratio is above minimum requirement\") {\n    // Test case: Background color that produces contrast ratio above 4.5:1\n    // #767676 produces 4.5415:1 contrast ratio with white text\n    $test-background: #767676;\n    $result: color-contrast($test-background);\n\n    @include assert-equal($result, $white, \"Should return white for background with 4.5415:1 contrast ratio (above threshold)\");\n  }\n\n  @include it(\"should return a color when contrast ratio is below minimum requirement\") {\n    // Test case: Background color that produces contrast ratio below 4.5:1\n    // #787878 produces 4.4155:1 contrast ratio with white text\n    $test-background: #787878;\n    $result: color-contrast($test-background);\n\n    // Should return the color with the highest available contrast ratio\n    @include assert-equal($result, $black, \"Should return black (highest available contrast) for background with 4.4155:1 contrast ratio (below threshold)\");\n  }\n\n  @include it(\"should handle edge case with very light background\") {\n    // Test case: Very light background that should return dark text\n    $test-background: #f8f9fa; // Very light gray\n    $result: color-contrast($test-background);\n\n    @include assert-equal($result, $color-contrast-dark, \"Should return dark text for very light background\");\n  }\n\n  @include it(\"should handle edge case with very dark background\") {\n    // Test case: Very dark background that should return light text\n    $test-background: #212529; // Very dark gray\n    $result: color-contrast($test-background);\n\n    @include assert-equal($result, $color-contrast-light, \"Should return light text for very dark background\");\n  }\n\n  @include it(\"should work with custom minimum contrast ratio\") {\n    // Test case: Using a custom minimum contrast ratio\n    $test-background: #666;\n    $result: color-contrast($test-background, $color-contrast-dark, $color-contrast-light, 3);\n\n    @include assert-equal($result, $white, \"Should return white when using custom minimum contrast ratio of 3.0\");\n  }\n\n  @include it(\"should test contrast ratio calculation accuracy\") {\n    // Test case: Verify that contrast-ratio function works correctly\n    $background: #767676;\n    $foreground: $white;\n    $ratio: contrast-ratio($background, $foreground);\n    // Bootstrap's implementation calculates this as ~4.5415, not exactly 4.5, due to its luminance math.\n    // We use 4.54 as the threshold for this test to match the actual implementation.\n    @include assert-true($ratio >= 4.54 and $ratio <= 4.55, \"Contrast ratio should be approximately 4.54:1 (Bootstrap's math)\");\n  }\n\n  @include it(\"should test luminance calculation\") {\n    // Test case: Verify luminance function works correctly\n    $white-luminance: luminance($white);\n    $black-luminance: luminance($black);\n\n    @include assert-equal($white-luminance, 1, \"White should have luminance of 1\");\n    @include assert-equal($black-luminance, 0, \"Black should have luminance of 0\");\n  }\n\n  @include it(\"should handle rgba colors correctly\") {\n    // Test case: Test with rgba colors\n    $test-background: rgba(118, 118, 118, 1); // Same as #767676\n    $result: color-contrast($test-background);\n\n    @include assert-equal($result, $white, \"Should handle rgba colors correctly\");\n  }\n\n  @include it(\"should test the WCAG 2.1 boundary condition with color below threshold\") {\n    // Test case: Background color that produces contrast ratio below 4.5:1\n    // #787878 produces 4.4155:1 contrast ratio with white\n    $test-background: #787878; // Produces 4.4155:1 contrast ratio\n    $contrast-ratio: contrast-ratio($test-background, $white);\n\n    // Verify the contrast ratio is below 4.5:1\n    @include assert-true($contrast-ratio < 4.5, \"Contrast ratio should be below 4.5:1 threshold\");\n\n    // The color-contrast function should return the color with highest available contrast\n    $result: color-contrast($test-background);\n    @include assert-equal($result, $black, \"color-contrast should return black (highest available contrast) for below-threshold ratio\");\n  }\n\n  @include it(\"should test the WCAG 2.1 boundary condition with color at threshold\") {\n    // Test case: Background color that produces contrast ratio close to 4.5:1\n    // #777777 produces 4.4776:1 contrast ratio with white\n    $test-background: #777; // Produces 4.4776:1 contrast ratio\n    $contrast-ratio: contrast-ratio($test-background, $white);\n\n    // Verify the contrast ratio is below 4.5:1 threshold\n    @include assert-true($contrast-ratio < 4.5, \"Contrast ratio is below threshold, function should handle gracefully\");\n  }\n\n  @include it(\"should demonstrate the difference between > and >= operators\") {\n    // Test case: Demonstrates the difference between > and >= operators\n    // Uses #767676 with a custom minimum contrast ratio that matches its actual ratio (4.5415)\n    // With > 4.5415: should return black (fallback to highest available)\n    // With >= 4.5415: should return white (meets threshold)\n\n    $test-background: #767676; // Produces 4.5415:1 contrast ratio\n    $actual-ratio: contrast-ratio($test-background, $white);\n\n    // Test with a custom minimum that matches the actual ratio\n    $result: color-contrast($test-background, $color-contrast-dark, $color-contrast-light, $actual-ratio);\n\n    // Should return white when using >= implementation\n    @include assert-equal($result, $white, \"color-contrast should return white when using exact ratio as threshold (>= implementation)\");\n  }\n\n  @include it(\"should test additional working colors above threshold\") {\n    // Test case: Background color that produces contrast ratio well above 4.5:1\n    // #757575 produces 4.6047:1 contrast ratio with white text\n    $test-background: #757575; // Produces 4.6047:1 contrast ratio\n    $result: color-contrast($test-background);\n\n    @include assert-equal($result, $white, \"Should return white for background with 4.6047:1 contrast ratio (well above threshold)\");\n  }\n}\n"
  },
  {
    "path": "scss/tests/mixins/_color-modes.test.scss",
    "content": "// stylelint-disable selector-attribute-quotes\n\n@import \"../../functions\";\n@import \"../../variables\";\n@import \"../../variables-dark\";\n@import \"../../maps\";\n@import \"../../mixins\";\n\n@include describe(\"global $color-mode-type: data\") {\n  @include it(\"generates data attribute selectors for dark mode\") {\n    @include assert() {\n      @include output() {\n        @include color-mode(dark) {\n          .element {\n            color: var(--bs-primary-text-emphasis);\n            background-color: var(--bs-primary-bg-subtle);\n          }\n        }\n        @include color-mode(dark, true) {\n          --custom-color: #{mix($indigo, $blue, 50%)};\n        }\n      }\n      @include expect() {\n        [data-bs-theme=dark] .element {\n          color: var(--bs-primary-text-emphasis);\n          background-color: var(--bs-primary-bg-subtle);\n        }\n        [data-bs-theme=dark] {\n          --custom-color: #3a3ff8;\n        }\n      }\n    }\n  }\n}\n\n@include describe(\"global $color-mode-type: media-query\") {\n  @include it(\"generates media queries for dark mode\") {\n    $color-mode-type: media-query !global;\n\n    @include assert() {\n      @include output() {\n        @include color-mode(dark) {\n          .element {\n            color: var(--bs-primary-text-emphasis);\n            background-color: var(--bs-primary-bg-subtle);\n          }\n        }\n        @include color-mode(dark, true) {\n          --custom-color: #{mix($indigo, $blue, 50%)};\n        }\n      }\n      @include expect() {\n        @media (prefers-color-scheme: dark) {\n          .element {\n            color: var(--bs-primary-text-emphasis);\n            background-color: var(--bs-primary-bg-subtle);\n          }\n        }\n        @media (prefers-color-scheme: dark) {\n          :root {\n            --custom-color: #3a3ff8;\n          }\n        }\n      }\n    }\n\n    $color-mode-type: data !global;\n  }\n}\n"
  },
  {
    "path": "scss/tests/mixins/_media-query-color-mode-full.test.scss",
    "content": "$color-mode-type: media-query;\n\n@import \"../../bootstrap\";\n\n@include describe(\"Bootstrap compile with global $color-mode-type: media-query\") {\n  @include it(\"compiles entirely Bootstrap CSS with media-query color mode\") { // stylelint-disable-line block-no-empty\n  }\n}\n"
  },
  {
    "path": "scss/tests/mixins/_utilities.test.scss",
    "content": "$prefix: bs-;\n$enable-important-utilities: false;\n\n// Important: Do not import rfs to check that the mixin just calls the appropriate functions from it\n@import \"../../mixins/utilities\";\n\n@mixin test-generate-utility($params...) {\n  @include assert() {\n    @include output() {\n      @include generate-utility($params...);\n    }\n\n    @include expect() {\n      @content;\n    }\n  }\n}\n\n@include describe(generate-utility) {\n  @include it(\"generates a utility class for each value\") {\n    @include test-generate-utility(\n      (\n        property: \"padding\",\n        values: (small: .5rem, large: 2rem)\n      )\n    ) {\n      .padding-small {\n        padding: .5rem;\n      }\n\n      .padding-large {\n        padding: 2rem;\n      }\n    }\n  }\n\n  @include describe(\"global $enable-important-utilities: true\") {\n    @include it(\"sets !important\") {\n      $enable-important-utilities: true !global;\n\n      @include test-generate-utility(\n        (\n          property: \"padding\",\n          values: (small: .5rem, large: 2rem)\n        )\n      ) {\n        .padding-small {\n          padding: .5rem !important;\n        }\n\n        .padding-large {\n          padding: 2rem !important;\n        }\n      }\n\n      $enable-important-utilities: false !global;\n    }\n  }\n\n  @include describe(\"$utility\") {\n    @include describe(\"values\") {\n      @include it(\"supports null keys\") {\n        @include test-generate-utility(\n          (\n            property: \"padding\",\n            values: (null: 1rem, small: .5rem, large: 2rem)\n          ),\n        ) {\n          .padding {\n            padding: 1rem;\n          }\n\n          .padding-small {\n            padding: .5rem;\n          }\n\n          .padding-large {\n            padding: 2rem;\n          }\n        }\n      }\n\n      @include it(\"ignores null values\") {\n        @include test-generate-utility(\n          (\n            property: \"padding\",\n            values: (small: null, large: 2rem)\n          )\n        ) {\n          .padding-large {\n            padding: 2rem;\n          }\n        }\n      }\n\n      @include it(\"supports lists\") {\n        @include test-generate-utility(\n          (\n            property: \"padding\",\n            values: 1rem 2rem\n          )\n        ) {\n          .padding-1rem {\n            padding: 1rem;\n          }\n\n          .padding-2rem {\n            padding: 2rem;\n          }\n        }\n      }\n\n      @include it(\"supports single values\") {\n        @include test-generate-utility(\n          (\n            property: padding,\n            values: 1rem\n          )\n        ) {\n          .padding-1rem {\n            padding: 1rem;\n          }\n        }\n      }\n    }\n\n    @include describe(\"class & property\") {\n      @include it(\"adds each property to the declaration\") {\n        @include test-generate-utility(\n          (\n            class: padding-x,\n            property: padding-inline-start padding-inline-end,\n            values: 1rem\n          )\n        ) {\n          .padding-x-1rem {\n            padding-inline-start: 1rem;\n            padding-inline-end: 1rem;\n          }\n        }\n      }\n\n      @include it(\"uses the first property as class name\") {\n        @include test-generate-utility(\n          (\n            property: padding-inline-start padding-inline-end,\n            values: 1rem\n          )\n        ) {\n          .padding-inline-start-1rem {\n            padding-inline-start: 1rem;\n            padding-inline-end: 1rem;\n          }\n        }\n      }\n\n      @include it(\"supports a null class to create classes straight from the values\") {\n        @include test-generate-utility(\n          (\n            property: visibility,\n            class: null,\n            values: (\n              visible: visible,\n              invisible: hidden,\n            )\n          )\n        ) {\n          .visible {\n            visibility: visible;\n          }\n\n          .invisible {\n            visibility: hidden;\n          }\n        }\n      }\n    }\n\n    @include describe(\"state\") {\n      @include it(\"Generates selectors for each states\") {\n        @include test-generate-utility(\n          (\n            property: padding,\n            values: 1rem,\n            state: hover focus,\n          )\n        ) {\n          .padding-1rem {\n            padding: 1rem;\n          }\n\n          .padding-1rem-hover:hover {\n            padding: 1rem;\n          }\n\n          .padding-1rem-focus:focus {\n            padding: 1rem;\n          }\n        }\n      }\n    }\n\n    @include describe(\"css-var\"){\n      @include it(\"sets a CSS variable instead of the property\") {\n        @include test-generate-utility(\n          (\n            property: padding,\n            css-variable-name: padding,\n            css-var: true,\n            values: 1rem 2rem\n          )\n        ) {\n          .padding-1rem {\n            --bs-padding: 1rem;\n          }\n\n          .padding-2rem {\n            --bs-padding: 2rem;\n          }\n        }\n      }\n\n      @include it(\"defaults to class\") {\n        @include test-generate-utility(\n          (\n            property: padding,\n            class: padding,\n            css-var: true,\n            values: 1rem 2rem\n          )\n        ) {\n          .padding-1rem {\n            --bs-padding: 1rem;\n          }\n\n          .padding-2rem {\n            --bs-padding: 2rem;\n          }\n        }\n      }\n    }\n\n    @include describe(\"local-vars\") {\n      @include it(\"generates the listed variables\") {\n        @include test-generate-utility(\n          (\n            property: color,\n            class: desaturated-color,\n            local-vars: (\n              color-opacity: 1,\n              color-saturation: .25\n            ),\n            values: (\n              blue: hsla(192deg, var(--bs-color-saturation), 0, var(--bs-color-opacity))\n            )\n          )\n        ) {\n          .desaturated-color-blue {\n            --bs-color-opacity: 1;\n            // Sass compilation will put a leading zero so we want to keep that one\n            // stylelint-disable-next-line @stylistic/number-leading-zero\n            --bs-color-saturation: 0.25;\n            color: hsla(192deg, var(--bs-color-saturation), 0, var(--bs-color-opacity));\n          }\n        }\n      }\n    }\n\n    @include describe(\"css-var & state\") {\n      @include it(\"Generates a rule with for each state with a CSS variable\") {\n        @include test-generate-utility(\n          (\n            property: padding,\n            css-var: true,\n            css-variable-name: padding,\n            values: 1rem,\n            state: hover focus,\n          )\n        ) {\n          .padding-1rem {\n            --bs-padding: 1rem;\n          }\n\n          .padding-1rem-hover:hover {\n            --bs-padding: 1rem;\n          }\n\n          .padding-1rem-focus:focus {\n            --bs-padding: 1rem;\n          }\n        }\n      }\n    }\n\n    @include describe(\"rtl\") {\n      @include it(\"sets up RTLCSS for removal when false\") {\n        @include test-generate-utility(\n          (\n            property: padding,\n            values: 1rem,\n            rtl: false\n          )\n        ) {\n          /* rtl:begin:remove */\n\n          .padding-1rem {\n            padding: 1rem;\n          }\n\n          /* rtl:end:remove */\n\n        }\n      }\n    }\n\n    @include describe(\"rfs\") {\n      @include it(\"sets the fluid value when not inside media query\") {\n        @include test-generate-utility(\n          (\n            property: padding,\n            values: 1rem,\n            rfs: true\n          )\n        ) {\n          .padding-1rem {\n            padding: rfs-fluid-value(1rem);\n          }\n        }\n      }\n\n      @include it(\"sets the value when inside the media query\") {\n        @include test-generate-utility(\n          (\n            property: padding,\n            values: 1rem,\n            rfs: true\n          ),\n          $is-rfs-media-query: true\n        ) {\n          .padding-1rem {\n            padding: rfs-value(1rem);\n          }\n        }\n      }\n    }\n  }\n\n  @include describe(\"$infix\") {\n    @include it(\"inserts the given infix\") {\n      @include test-generate-utility(\n        (\n          property: \"padding\",\n          values: (null: 1rem, small: .5rem, large: 2rem)\n        ),\n        $infix: -sm\n      ) {\n        .padding-sm {\n          padding: 1rem;\n        }\n\n        .padding-sm-small {\n          padding: .5rem;\n        }\n\n        .padding-sm-large {\n          padding: 2rem;\n        }\n      }\n    }\n\n    @include it(\"strips leading - if class is null\") {\n      @include test-generate-utility(\n        (\n          property: visibility,\n          class: null,\n          values: (\n            visible: visible,\n            invisible: hidden,\n          )\n        ),\n        -sm\n      ) {\n        .sm-visible {\n          visibility: visible;\n        }\n\n        .sm-invisible {\n          visibility: hidden;\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "scss/tests/sass-true/register.js",
    "content": "'use strict'\n\nconst path = require('node:path')\n\nconst runnerPath = path.join(__dirname, 'runner').replace(/\\\\/g, '/')\n\nrequire.extensions['.scss'] = (module, filename) => {\n  const normalizedFilename = filename.replace(/\\\\/g, '/')\n\n  return module._compile(`\n    const runner = require('${runnerPath}')\n    runner('${normalizedFilename}', { describe, it })\n    `, filename)\n}\n"
  },
  {
    "path": "scss/tests/sass-true/runner.js",
    "content": "'use strict'\n\nconst fs = require('node:fs')\nconst path = require('node:path')\nconst { runSass } = require('sass-true')\n\nmodule.exports = (filename, { describe, it }) => {\n  const data = fs.readFileSync(filename, 'utf8')\n  const TRUE_SETUP = '$true-terminal-output: false; @import \"true\";'\n  const sassString = TRUE_SETUP + data\n\n  runSass(\n    { describe, it, sourceType: 'string' },\n    sassString,\n    { loadPaths: [path.dirname(filename)] }\n  )\n}\n"
  },
  {
    "path": "scss/tests/utilities/_api.test.scss",
    "content": "@import \"../../functions\";\n@import \"../../variables\";\n@import \"../../variables-dark\";\n@import \"../../maps\";\n@import \"../../mixins\";\n\n$utilities: ();\n\n@include describe(\"utilities/api\") {\n  @include it(\"generates utilities for each breakpoints\") {\n    $utilities: (\n      margin: (\n        property: margin,\n        values: auto\n      ),\n      padding: (\n        property: padding,\n        responsive: true,\n        values: 1rem\n      ),\n      font-size: (\n        property: font-size,\n        values: (large: 1.25rem),\n        print: true\n      )\n    ) !global;\n\n    $grid-breakpoints: (\n      xs: 0,\n      sm: 333px,\n      md: 666px\n    ) !global;\n\n    @include assert() {\n      @include output() {\n        @import \"../../utilities/api\";\n      }\n\n      @include expect() {\n        // margin is not set to responsive\n        .margin-auto {\n          margin: auto !important;\n        }\n\n        // padding is, though\n        .padding-1rem {\n          padding: 1rem !important;\n        }\n\n        .font-size-large {\n          font-size: 1.25rem !important;\n        }\n\n        @media (min-width: 333px) {\n          .padding-sm-1rem {\n            padding: 1rem !important;\n          }\n        }\n\n        @media (min-width: 666px) {\n          .padding-md-1rem {\n            padding: 1rem !important;\n          }\n        }\n\n        @media print {\n          .font-size-print-large {\n            font-size: 1.25rem !important;\n          }\n        }\n      }\n\n    }\n  }\n}\n"
  },
  {
    "path": "scss/utilities/_api.scss",
    "content": "// Loop over each breakpoint\n@each $breakpoint in map-keys($grid-breakpoints) {\n\n  // Generate media query if needed\n  @include media-breakpoint-up($breakpoint) {\n    $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n    // Loop over each utility property\n    @each $key, $utility in $utilities {\n      // The utility can be disabled with `false`, thus check if the utility is a map first\n      // Only proceed if responsive media queries are enabled or if it's the base media query\n      @if type-of($utility) == \"map\" and (map-get($utility, responsive) or $infix == \"\") {\n        @include generate-utility($utility, $infix);\n      }\n    }\n  }\n}\n\n// RFS rescaling\n@media (min-width: $rfs-mq-value) {\n  @each $breakpoint in map-keys($grid-breakpoints) {\n    $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n    @if (map-get($grid-breakpoints, $breakpoint) < $rfs-breakpoint) {\n      // Loop over each utility property\n      @each $key, $utility in $utilities {\n        // The utility can be disabled with `false`, thus check if the utility is a map first\n        // Only proceed if responsive media queries are enabled or if it's the base media query\n        @if type-of($utility) == \"map\" and map-get($utility, rfs) and (map-get($utility, responsive) or $infix == \"\") {\n          @include generate-utility($utility, $infix, true);\n        }\n      }\n    }\n  }\n}\n\n\n// Print utilities\n@media print {\n  @each $key, $utility in $utilities {\n    // The utility can be disabled with `false`, thus check if the utility is a map first\n    // Then check if the utility needs print styles\n    @if type-of($utility) == \"map\" and map-get($utility, print) == true {\n      @include generate-utility($utility, \"-print\");\n    }\n  }\n}\n"
  },
  {
    "path": "scss/vendor/_rfs.scss",
    "content": "// stylelint-disable scss/dimension-no-non-numeric-values\n\n// SCSS RFS mixin\n//\n// Automated responsive values for font sizes, paddings, margins and much more\n//\n// Licensed under MIT (https://github.com/twbs/rfs/blob/main/LICENSE)\n\n// Configuration\n\n// Base value\n$rfs-base-value: 1.25rem !default;\n$rfs-unit: rem !default;\n\n@if $rfs-unit != rem and $rfs-unit != px {\n  @error \"`#{$rfs-unit}` is not a valid unit for $rfs-unit. Use `px` or `rem`.\";\n}\n\n// Breakpoint at where values start decreasing if screen width is smaller\n$rfs-breakpoint: 1200px !default;\n$rfs-breakpoint-unit: px !default;\n\n@if $rfs-breakpoint-unit != px and $rfs-breakpoint-unit != em and $rfs-breakpoint-unit != rem {\n  @error \"`#{$rfs-breakpoint-unit}` is not a valid unit for $rfs-breakpoint-unit. Use `px`, `em` or `rem`.\";\n}\n\n// Resize values based on screen height and width\n$rfs-two-dimensional: false !default;\n\n// Factor of decrease\n$rfs-factor: 10 !default;\n\n@if type-of($rfs-factor) != number or $rfs-factor <= 1 {\n  @error \"`#{$rfs-factor}` is not a valid  $rfs-factor, it must be greater than 1.\";\n}\n\n// Mode. Possibilities: \"min-media-query\", \"max-media-query\"\n$rfs-mode: min-media-query !default;\n\n// Generate enable or disable classes. Possibilities: false, \"enable\" or \"disable\"\n$rfs-class: false !default;\n\n// 1 rem = $rfs-rem-value px\n$rfs-rem-value: 16 !default;\n\n// Safari iframe resize bug: https://github.com/twbs/rfs/issues/14\n$rfs-safari-iframe-resize-bug-fix: false !default;\n\n// Disable RFS by setting $enable-rfs to false\n$enable-rfs: true !default;\n\n// Cache $rfs-base-value unit\n$rfs-base-value-unit: unit($rfs-base-value);\n\n@function divide($dividend, $divisor, $precision: 10) {\n  $sign: if($dividend > 0 and $divisor > 0 or $dividend < 0 and $divisor < 0, 1, -1);\n  $dividend: abs($dividend);\n  $divisor: abs($divisor);\n  @if $dividend == 0 {\n    @return 0;\n  }\n  @if $divisor == 0 {\n    @error \"Cannot divide by 0\";\n  }\n  $remainder: $dividend;\n  $result: 0;\n  $factor: 10;\n  @while ($remainder > 0 and $precision >= 0) {\n    $quotient: 0;\n    @while ($remainder >= $divisor) {\n      $remainder: $remainder - $divisor;\n      $quotient: $quotient + 1;\n    }\n    $result: $result * 10 + $quotient;\n    $factor: $factor * .1;\n    $remainder: $remainder * 10;\n    $precision: $precision - 1;\n    @if ($precision < 0 and $remainder >= $divisor * 5) {\n      $result: $result + 1;\n    }\n  }\n  $result: $result * $factor * $sign;\n  $dividend-unit: unit($dividend);\n  $divisor-unit: unit($divisor);\n  $unit-map: (\n    \"px\": 1px,\n    \"rem\": 1rem,\n    \"em\": 1em,\n    \"%\": 1%\n  );\n  @if ($dividend-unit != $divisor-unit and map-has-key($unit-map, $dividend-unit)) {\n    $result: $result * map-get($unit-map, $dividend-unit);\n  }\n  @return $result;\n}\n\n// Remove px-unit from $rfs-base-value for calculations\n@if $rfs-base-value-unit == px {\n  $rfs-base-value: divide($rfs-base-value, $rfs-base-value * 0 + 1);\n}\n@else if $rfs-base-value-unit == rem {\n  $rfs-base-value: divide($rfs-base-value, divide($rfs-base-value * 0 + 1, $rfs-rem-value));\n}\n\n// Cache $rfs-breakpoint unit to prevent multiple calls\n$rfs-breakpoint-unit-cache: unit($rfs-breakpoint);\n\n// Remove unit from $rfs-breakpoint for calculations\n@if $rfs-breakpoint-unit-cache == px {\n  $rfs-breakpoint: divide($rfs-breakpoint, $rfs-breakpoint * 0 + 1);\n}\n@else if $rfs-breakpoint-unit-cache == rem or $rfs-breakpoint-unit-cache == \"em\" {\n  $rfs-breakpoint: divide($rfs-breakpoint, divide($rfs-breakpoint * 0 + 1, $rfs-rem-value));\n}\n\n// Calculate the media query value\n$rfs-mq-value: if($rfs-breakpoint-unit == px, #{$rfs-breakpoint}px, #{divide($rfs-breakpoint, $rfs-rem-value)}#{$rfs-breakpoint-unit});\n$rfs-mq-property-width: if($rfs-mode == max-media-query, max-width, min-width);\n$rfs-mq-property-height: if($rfs-mode == max-media-query, max-height, min-height);\n\n// Internal mixin used to determine which media query needs to be used\n@mixin _rfs-media-query {\n  @if $rfs-two-dimensional {\n    @if $rfs-mode == max-media-query {\n      @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}), (#{$rfs-mq-property-height}: #{$rfs-mq-value}) {\n        @content;\n      }\n    }\n    @else {\n      @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}) and (#{$rfs-mq-property-height}: #{$rfs-mq-value}) {\n        @content;\n      }\n    }\n  }\n  @else {\n    @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}) {\n      @content;\n    }\n  }\n}\n\n// Internal mixin that adds disable classes to the selector if needed.\n@mixin _rfs-rule {\n  @if $rfs-class == disable and $rfs-mode == max-media-query {\n    // Adding an extra class increases specificity, which prevents the media query to override the property\n    &,\n    .disable-rfs &,\n    &.disable-rfs {\n      @content;\n    }\n  }\n  @else if $rfs-class == enable and $rfs-mode == min-media-query {\n    .enable-rfs &,\n    &.enable-rfs {\n      @content;\n    }\n  } @else {\n    @content;\n  }\n}\n\n// Internal mixin that adds enable classes to the selector if needed.\n@mixin _rfs-media-query-rule {\n\n  @if $rfs-class == enable {\n    @if $rfs-mode == min-media-query {\n      @content;\n    }\n\n    @include _rfs-media-query () {\n      .enable-rfs &,\n      &.enable-rfs {\n        @content;\n      }\n    }\n  }\n  @else {\n    @if $rfs-class == disable and $rfs-mode == min-media-query {\n      .disable-rfs &,\n      &.disable-rfs {\n        @content;\n      }\n    }\n    @include _rfs-media-query () {\n      @content;\n    }\n  }\n}\n\n// Helper function to get the formatted non-responsive value\n@function rfs-value($values) {\n  // Convert to list\n  $values: if(type-of($values) != list, ($values,), $values);\n\n  $val: \"\";\n\n  // Loop over each value and calculate value\n  @each $value in $values {\n    @if $value == 0 {\n      $val: $val + \" 0\";\n    }\n    @else {\n      // Cache $value unit\n      $unit: if(type-of($value) == \"number\", unit($value), false);\n\n      @if $unit == px {\n        // Convert to rem if needed\n        $val: $val + \" \" + if($rfs-unit == rem, #{divide($value, $value * 0 + $rfs-rem-value)}rem, $value);\n      }\n      @else if $unit == rem {\n        // Convert to px if needed\n        $val: $val + \" \" + if($rfs-unit == px, #{divide($value, $value * 0 + 1) * $rfs-rem-value}px, $value);\n      } @else {\n        // If $value isn't a number (like inherit) or $value has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\n        $val: $val + \" \" + $value;\n      }\n    }\n  }\n\n  // Remove first space\n  @return unquote(str-slice($val, 2));\n}\n\n// Helper function to get the responsive value calculated by RFS\n@function rfs-fluid-value($values) {\n  // Convert to list\n  $values: if(type-of($values) != list, ($values,), $values);\n\n  $val: \"\";\n\n  // Loop over each value and calculate value\n  @each $value in $values {\n    @if $value == 0 {\n      $val: $val + \" 0\";\n    } @else {\n      // Cache $value unit\n      $unit: if(type-of($value) == \"number\", unit($value), false);\n\n      // If $value isn't a number (like inherit) or $value has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\n      @if not $unit or $unit != px and $unit != rem {\n        $val: $val + \" \" + $value;\n      } @else {\n        // Remove unit from $value for calculations\n        $value: divide($value, $value * 0 + if($unit == px, 1, divide(1, $rfs-rem-value)));\n\n        // Only add the media query if the value is greater than the minimum value\n        @if abs($value) <= $rfs-base-value or not $enable-rfs {\n          $val: $val + \" \" + if($rfs-unit == rem, #{divide($value, $rfs-rem-value)}rem, #{$value}px);\n        }\n        @else {\n          // Calculate the minimum value\n          $value-min: $rfs-base-value + divide(abs($value) - $rfs-base-value, $rfs-factor);\n\n          // Calculate difference between $value and the minimum value\n          $value-diff: abs($value) - $value-min;\n\n          // Base value formatting\n          $min-width: if($rfs-unit == rem, #{divide($value-min, $rfs-rem-value)}rem, #{$value-min}px);\n\n          // Use negative value if needed\n          $min-width: if($value < 0, -$min-width, $min-width);\n\n          // Use `vmin` if two-dimensional is enabled\n          $variable-unit: if($rfs-two-dimensional, vmin, vw);\n\n          // Calculate the variable width between 0 and $rfs-breakpoint\n          $variable-width: #{divide($value-diff * 100, $rfs-breakpoint)}#{$variable-unit};\n\n          // Return the calculated value\n          $val: $val + \" calc(\" + $min-width + if($value < 0, \" - \", \" + \") + $variable-width + \")\";\n        }\n      }\n    }\n  }\n\n  // Remove first space\n  @return unquote(str-slice($val, 2));\n}\n\n// RFS mixin\n@mixin rfs($values, $property: font-size) {\n  @if $values != null {\n    $val: rfs-value($values);\n    $fluid-val: rfs-fluid-value($values);\n\n    // Do not print the media query if responsive & non-responsive values are the same\n    @if $val == $fluid-val {\n      #{$property}: $val;\n    }\n    @else {\n      @include _rfs-rule () {\n        #{$property}: if($rfs-mode == max-media-query, $val, $fluid-val);\n\n        // Include safari iframe resize fix if needed\n        min-width: if($rfs-safari-iframe-resize-bug-fix, (0 * 1vw), null);\n      }\n\n      @include _rfs-media-query-rule () {\n        #{$property}: if($rfs-mode == max-media-query, $fluid-val, $val);\n      }\n    }\n  }\n}\n\n// Shorthand helper mixins\n@mixin font-size($value) {\n  @include rfs($value);\n}\n\n@mixin padding($value) {\n  @include rfs($value, padding);\n}\n\n@mixin padding-top($value) {\n  @include rfs($value, padding-top);\n}\n\n@mixin padding-right($value) {\n  @include rfs($value, padding-right);\n}\n\n@mixin padding-bottom($value) {\n  @include rfs($value, padding-bottom);\n}\n\n@mixin padding-left($value) {\n  @include rfs($value, padding-left);\n}\n\n@mixin margin($value) {\n  @include rfs($value, margin);\n}\n\n@mixin margin-top($value) {\n  @include rfs($value, margin-top);\n}\n\n@mixin margin-right($value) {\n  @include rfs($value, margin-right);\n}\n\n@mixin margin-bottom($value) {\n  @include rfs($value, margin-bottom);\n}\n\n@mixin margin-left($value) {\n  @include rfs($value, margin-left);\n}\n"
  },
  {
    "path": "site/.prettierrc.json",
    "content": "{\n  \"$schema\": \"http://json.schemastore.org/prettierrc\",\n  \"arrowParens\": \"always\",\n  \"printWidth\": 120,\n  \"semi\": false,\n  \"singleQuote\": true,\n  \"trailingComma\": \"none\"\n}\n"
  },
  {
    "path": "site/astro.config.ts",
    "content": "import { defineConfig } from 'astro/config'\nimport astroBrokenLinksChecker from 'astro-broken-links-checker'\nimport { bootstrap } from './src/libs/astro'\nimport { getConfig } from './src/libs/config'\nimport { algoliaPlugin } from './src/plugins/algolia-plugin'\nimport { stackblitzPlugin } from './src/plugins/stackblitz-plugin'\n\nconst isDev = process.env.NODE_ENV === 'development'\n\nconst site = isDev\n  ? // In development mode, use the local dev server.\n    'http://localhost:9001'\n  : process.env.DEPLOY_PRIME_URL !== undefined\n    ? // If deploying on Netlify, use the `DEPLOY_PRIME_URL` environment variable.\n      process.env.DEPLOY_PRIME_URL\n    : // Otherwise, use the `baseURL` value defined in the `config.yml` file.\n      getConfig().baseURL\n\n// https://astro.build/config\nexport default defineConfig({\n  build: {\n    assets: `docs/${getConfig().docs_version}/assets`\n  },\n  integrations: [\n    bootstrap(),\n    astroBrokenLinksChecker({\n      checkExternalLinks: false,\n      cacheExternalLinks: false,\n      throwError: true,\n      linkCheckerDir: '.link-checker'\n    })\n  ],\n  markdown: {\n    smartypants: false,\n    syntaxHighlight: 'prism'\n  },\n  site,\n  vite: {\n    plugins: [algoliaPlugin(), stackblitzPlugin()]\n  }\n})\n"
  },
  {
    "path": "site/data/breakpoints.yml",
    "content": "- breakpoint: xs\n  abbr: ''\n  name: X-Small\n  min-width: 0px\n  container: ''\n\n- breakpoint: sm\n  abbr: -sm\n  name: Small\n  min-width: 576px\n  container: 540px\n\n- breakpoint: md\n  abbr: -md\n  name: Medium\n  min-width: 768px\n  container: 720px\n\n- breakpoint: lg\n  abbr: -lg\n  name: Large\n  min-width: 992px\n  container: 960px\n\n- breakpoint: xl\n  abbr: -xl\n  name: X-Large\n  min-width: 1200px\n  container: 1140px\n\n- breakpoint: xxl\n  abbr: -xxl\n  name: XX-Large\n  min-width: 1400px\n  container: 1320px\n"
  },
  {
    "path": "site/data/colors.yml",
    "content": "- name: blue\n  hex: '#0d6efd'\n- name: indigo\n  hex: '#6610f2'\n- name: purple\n  hex: '#6f42c1'\n- name: pink\n  hex: '#d63384'\n- name: red\n  hex: '#dc3545'\n- name: orange\n  hex: '#fd7e14'\n- name: yellow\n  hex: '#ffc107'\n- name: green\n  hex: '#198754'\n- name: teal\n  hex: '#20c997'\n- name: cyan\n  hex: '#0dcaf0'\n- name: white\n  hex: '#fff'\n- name: gray\n  hex: '#6c757d'\n- name: gray-dark\n  hex: '#343a40'\n"
  },
  {
    "path": "site/data/core-team.yml",
    "content": "- name: Mark Otto\n  user: mdo\n\n- name: Jacob Thornton\n  user: fat\n\n- name: XhmikosR\n  user: xhmikosr\n\n- name: GeoSot\n  user: geosot\n\n- name: Patrick H. Lauke\n  user: patrickhlauke\n\n- name: Julien Déramond\n  user: julien-deramond\n\n- name: Gaël Poupard\n  user: ffoodd\n\n- name: Rohit Sharma\n  user: rohit2sharma95\n\n- name: alpadev\n  user: alpadev\n\n- name: Martijn Cuppens\n  user: martijncuppens\n\n- name: Johann-S\n  user: johann-s\n\n- name: Gleb Mazovetskiy\n  user: glebm\n"
  },
  {
    "path": "site/data/docs-versions.yml",
    "content": "- group: v1.x\n  baseurl: 'https://getbootstrap.com'\n  description: 'Every minor and patch release from v1 is listed below.'\n  versions:\n    - '1.0.0'\n    - '1.1.0'\n    - '1.1.1'\n    - '1.2.0'\n    - '1.3.0'\n    - '1.4.0'\n\n- group: v2.x\n  baseurl: 'https://getbootstrap.com'\n  description: 'Every minor and patch release from v2 is listed below.'\n  versions:\n    - '2.0.0'\n    - '2.0.1'\n    - '2.0.2'\n    - '2.0.3'\n    - '2.0.4'\n    - '2.1.0'\n    - '2.1.1'\n    - '2.2.0'\n    - '2.2.1'\n    - '2.2.2'\n    - '2.3.0'\n    - '2.3.1'\n    - '2.3.2'\n\n- group: v3.x\n  baseurl: 'https://getbootstrap.com/docs'\n  description: 'Every minor release from v3 is listed below. Last update was v3.4.1.'\n  versions:\n    - '3.3'\n    - '3.4'\n\n- group: v4.x\n  baseurl: 'https://getbootstrap.com/docs'\n  description: 'Our previous major release with its minor releases. Last update was v4.6.2.'\n  versions:\n    - '4.0'\n    - '4.1'\n    - '4.2'\n    - '4.3'\n    - '4.4'\n    - '4.5'\n    - '4.6'\n\n- group: v5.x\n  baseurl: 'https://getbootstrap.com/docs'\n  description: 'Current major release. Last update was v5.3.8.'\n  versions:\n    - '5.0'\n    - '5.1'\n    - '5.2'\n    - '5.3'\n"
  },
  {
    "path": "site/data/examples.yml",
    "content": "- category: Starters\n  external: true\n  description: 'Functional examples of using Bootstrap in common JS frameworks like Webpack, Parcel, Vite, and more you can edit in StackBlitz.'\n  examples:\n    - name: CDN starter\n      description: \"Instantly include Bootstrap's compiled CSS and JavaScript via the jsDelivr CDN.\"\n      url: /examples/tree/main/starter\n    - name: Sass & JS\n      description: \"Use npm to import and compile Bootstrap's Sass with Autoprefixer and Stylelint, plus our bundled JavaScript.\"\n      url: /examples/tree/main/sass-js\n    - name: Sass & ESM JS\n      description: \"Import and compile Bootstrap's Sass with Autoprefixer and Stylelint, and compile our source JavaScript with an ESM shim.\"\n      url: /examples/tree/main/sass-js-esm\n    - name: Bootstrap color modes\n      description: \"Import and compile Bootstrap's Sass with Stylelint, and the Bootstrap color modes.\"\n      url: /examples/tree/main/color-modes\n    - name: Bootstrap Icons\n      description: \"Import and compile Bootstrap's Sass with Stylelint, PurgeCSS, and the Bootstrap Icons web font.\"\n      url: /examples/tree/main/icons-font\n    - name: Parcel\n      description: \"Import and bundle Bootstrap's source Sass and JavaScript via Parcel.\"\n      url: /examples/tree/main/parcel\n      indexPath: src/index.html\n    - name: React\n      description: \"Import and bundle Bootstrap's source Sass and JavaScript with React, Next.js, and React Bootstrap.\"\n      url: /examples/tree/main/react-nextjs\n      indexPath: src/pages/index.tsx\n    - name: Vite\n      description: \"Import and bundle Bootstrap's source Sass and JavaScript with Vite.\"\n      url: /examples/tree/main/vite\n    - name: Vue\n      description: \"Import and bundle Bootstrap's source Sass and JavaScript with Vue and Vite.\"\n      url: /examples/tree/main/vue\n    - name: Webpack\n      description: \"Import and bundle Bootstrap's source Sass and JavaScript with Webpack.\"\n      url: /examples/tree/main/webpack\n      indexPath: src/index.html\n\n- category: Snippets\n  description: 'Common patterns for building sites and apps that build on existing components and utilities with custom CSS and more.'\n  examples:\n    - name: Headers\n      description: 'Display your branding, navigation, search, and more with these header components'\n    - name: Heroes\n      description: 'Set the stage on your homepage with heroes that feature clear calls to action.'\n    - name: Features\n      description: 'Explain the features, benefits, or other details in your marketing content.'\n    - name: Sidebars\n      description: 'Common navigation patterns ideal for offcanvas or multi-column layouts.'\n    - name: Footers\n      description: 'Finish every page strong with an awesome footer, big or small.'\n    - name: Dropdowns\n      description: 'Enhance your dropdowns with filters, icons, custom styles, and more.'\n    - name: List groups\n      description: 'Extend list groups with utilities and custom styles for any content.'\n    - name: Modals\n      description: 'Transform modals to serve any purpose, from feature tours to dialogs.'\n    - name: Badges\n      description: 'Make badges work with custom inner HTML and new looks.'\n    - name: Breadcrumbs\n      description: 'Integrate custom icons and create stepper components.'\n    - name: Buttons\n      description: 'Create custom buttons for just about any use case with utilities.'\n    - name: Jumbotrons\n      description: 'Create modernized versions of the classic Bootstrap component.'\n\n- category: Custom Components\n  description: 'Brand-new components and templates to help folks quickly get started with Bootstrap and demonstrate best practices for adding onto the framework.'\n  examples:\n    - name: Album\n      description: 'Simple one-page template for photo galleries, portfolios, and more.'\n    - name: Pricing\n      description: 'Example pricing page built with Cards and featuring a custom header and footer.'\n    - name: Checkout\n      description: 'Custom checkout form showing our form components and their validation features.'\n    - name: Product\n      description: 'Lean product-focused marketing page with extensive grid and image work.'\n    - name: Cover\n      description: 'A one-page template for building simple and beautiful home pages.'\n    - name: Carousel\n      description: 'Customize the navbar and carousel, then add some new components.'\n    - name: Blog\n      description: 'Magazine like blog template with header, navigation, featured content.'\n    - name: Dashboard\n      description: 'Basic admin dashboard shell with fixed sidebar and navbar.'\n    - name: Sign-in\n      description: 'Custom form layout and design for a simple sign in form.'\n    - name: Sticky footer\n      description: 'Attach a footer to the bottom of the viewport when page content is short.'\n    - name: Sticky footer navbar\n      description: 'Attach a footer to the bottom of the viewport with a fixed top navbar.'\n    - name: Jumbotron\n      description: \"Use utilities to recreate and enhance Bootstrap 4's jumbotron.\"\n\n- category: Framework\n  description: 'Examples that focus on implementing uses of built-in components provided by Bootstrap.'\n  examples:\n    - name: 'Starter template'\n      description: 'Nothing but the basics: compiled CSS and JavaScript.'\n    - name: Grid\n      description: 'Multiple examples of grid layouts with all four tiers, nesting, and more.'\n    - name: Cheatsheet\n      description: 'Kitchen sink of Bootstrap components.'\n\n- category: Navbars\n  description: 'Taking the default navbar component and showing how it can be moved, placed, and extended.'\n  examples:\n    - name: Navbars\n      description: 'Demonstration of all responsive and container options for the navbar.'\n    - name: Navbars offcanvas\n      description: 'Same as the Navbars example, but with our offcanvas component.'\n    - name: Navbar static\n      description: 'Single navbar example of a static top navbar along with some additional content.'\n    - name: Navbar fixed\n      description: 'Single navbar example with a fixed top navbar along with some additional content.'\n    - name: Navbar bottom\n      description: 'Single navbar example with a bottom navbar along with some additional content.'\n    - name: Offcanvas navbar\n      description: \"Turn your expandable navbar into a sliding offcanvas menu (doesn't use our offcanvas component).\"\n\n- category: RTL\n  description: \"See Bootstrap's RTL version in action with these modified examples from various categories.\"\n  examples:\n    - name: Album RTL\n      description: 'Simple one-page template for photo galleries, portfolios, and more.'\n    - name: Checkout RTL\n      description: 'Custom checkout form showing our form components and their validation features.'\n    - name: Carousel RTL\n      description: 'Customize the navbar and carousel, then add some new components.'\n    - name: Blog RTL\n      description: 'Magazine like blog template with header, navigation, featured content.'\n    - name: Dashboard RTL\n      description: 'Basic admin dashboard shell with fixed sidebar and navbar.'\n    - name: Cheatsheet RTL\n      description: 'Kitchen sink of Bootstrap components, RTL.'\n\n- category: Integrations\n  description: 'Integrations with external libraries.'\n  examples:\n    - name: 'Masonry'\n      description: 'Combine the powers of the Bootstrap grid and the Masonry layout.'\n"
  },
  {
    "path": "site/data/grays.yml",
    "content": "- name: 100\n  hex: '#f8f9fa'\n- name: 200\n  hex: '#e9ecef'\n- name: 300\n  hex: '#dee2e6'\n- name: 400\n  hex: '#ced4da'\n- name: 500\n  hex: '#adb5bd'\n- name: 600\n  hex: '#868e96'\n- name: 700\n  hex: '#495057'\n- name: 800\n  hex: '#343a40'\n- name: 900\n  hex: '#212529'\n"
  },
  {
    "path": "site/data/icons.yml",
    "content": "preferred:\n  - name: Font Awesome\n    website: https://fontawesome.com/\n  - name: Feather\n    website: https://feathericons.com/\n  - name: Octicons\n    website: https://primer.style/foundations/icons\n\nmore:\n  - name: Bytesize\n    website: https://github.com/danklammer/bytesize-icons\n  - name: CoreUI Icons\n    website: https://coreui.io/icons/\n  - name: Google Material icons\n    website: https://fonts.google.com/icons\n  - name: Ionicons\n    website: https://ionic.io/ionicons\n  - name: Dripicons\n    website: http://demo.amitjakhu.com/dripicons/\n  - name: Ikons\n    website: https://ikons.piotrkwiatkowski.co.uk/\n  - name: Icons8\n    website: https://icons8.com/\n  - name: icofont\n    website: https://icofont.com/\n  - name: Tabler Icons\n    website: https://tabler.io/icons\n"
  },
  {
    "path": "site/data/plugins.yml",
    "content": "- name: Alert\n  description: Show and hide alert messages to your users.\n  link: components/alerts/#javascript-behavior\n\n- name: Button\n  description: Programmatically control the active state for buttons.\n  link: components/buttons/#button-plugin\n\n- name: Carousel\n  description: Add slideshows to any page, including support for crossfade.\n  link: components/carousel/\n\n- name: Collapse\n  description: Expand and collapse areas of content, or create accordions.\n  link: components/collapse/\n\n- name: Dropdown\n  description: Create menus of links, actions, forms, and more.\n  link: components/dropdowns/\n\n- name: Modal\n  description: Add flexible and responsive dialogs to your project.\n  link: components/modal/\n\n- name: Offcanvas\n  description: Build and toggle hidden sidebars into any page.\n  link: components/offcanvas/\n\n- name: Popover\n  description: Create custom overlays. Built on Popper.\n  link: components/popovers/\n\n- name: Scrollspy\n  description: Automatically update active nav links based on page scroll.\n  link: components/scrollspy/\n\n- name: Tab\n  description: Allow Bootstrap nav components to toggle contents.\n  link: components/navs-tabs/\n\n- name: Toast\n  description: Show and hide notifications to your visitors.\n  link: components/toasts/\n\n- name: Tooltip\n  description: Replace browser tooltips with custom ones. Built on Popper.\n  link: components/tooltips/\n"
  },
  {
    "path": "site/data/sidebar.yml",
    "content": "# This file holds all sidebar menu's entries.\n# The logic for the sidebar generation is in \"site/layouts/partials/docs-sidebar.html\".\n\n- title: Getting started\n  icon: book-half\n  icon_color: indigo\n  pages:\n    - title: Introduction\n    - title: Download\n    - title: Contents\n    - title: Browsers & devices\n    - title: JavaScript\n    - title: Webpack\n    - title: Parcel\n    - title: Vite\n    - title: Accessibility\n    - title: RFS\n    - title: RTL\n    - title: Contribute\n\n- title: Customize\n  icon: palette2\n  icon_color: pink\n  pages:\n    - title: Overview\n    - title: Sass\n    - title: Options\n    - title: Color\n    - title: Color modes\n    - title: Components\n    - title: CSS variables\n    - title: Optimize\n\n- title: Layout\n  icon: grid-fill\n  icon_color: teal\n  pages:\n    - title: Breakpoints\n    - title: Containers\n    - title: Grid\n    - title: Columns\n    - title: Gutters\n    - title: Utilities\n    - title: Z-index\n    - title: CSS Grid\n\n- title: Content\n  icon: file-earmark-richtext\n  icon_color: gray\n  pages:\n    - title: Reboot\n    - title: Typography\n    - title: Images\n    - title: Tables\n    - title: Figures\n\n- title: Forms\n  icon: ui-radios\n  icon_color: blue\n  pages:\n    - title: Overview\n    - title: Form control\n    - title: Select\n    - title: Checks & radios\n    - title: Range\n    - title: Input group\n    - title: Floating labels\n    - title: Layout\n    - title: Validation\n\n- title: Components\n  icon: menu-button-wide-fill\n  icon_color: cyan\n  pages:\n    - title: Accordion\n    - title: Alerts\n    - title: Badge\n    - title: Breadcrumb\n    - title: Buttons\n    - title: Button group\n    - title: Card\n    - title: Carousel\n    - title: Close button\n    - title: Collapse\n    - title: Dropdowns\n    - title: List group\n    - title: Modal\n    - title: Navbar\n    - title: Navs & tabs\n    - title: Offcanvas\n    - title: Pagination\n    - title: Placeholders\n    - title: Popovers\n    - title: Progress\n    - title: Scrollspy\n    - title: Spinners\n    - title: Toasts\n    - title: Tooltips\n\n- title: Helpers\n  icon: magic\n  icon_color: orange\n  pages:\n    - title: Clearfix\n    - title: Color & background\n    - title: Colored links\n    - title: Focus ring\n    - title: Icon link\n    - title: Position\n    - title: Ratio\n    - title: Stacks\n    - title: Stretched link\n    - title: Text truncation\n    - title: Vertical rule\n    - title: Visually hidden\n\n- title: Utilities\n  icon: braces-asterisk\n  icon_color: red\n  pages:\n    - title: API\n    - title: Background\n    - title: Borders\n    - title: Colors\n    - title: Display\n    - title: Flex\n    - title: Float\n    - title: Interactions\n    - title: Link\n    - title: Object fit\n    - title: Opacity\n    - title: Overflow\n    - title: Position\n    - title: Shadows\n    - title: Sizing\n    - title: Spacing\n    - title: Text\n    - title: Vertical align\n    - title: Visibility\n    - title: Z-index\n\n- title: Extend\n  icon: tools\n  icon_color: blue\n  pages:\n    - title: Approach\n    - title: Icons\n\n- title: About\n  icon: globe2\n  icon_color: indigo\n  pages:\n    - title: Overview\n    - title: Team\n    - title: Brand\n    - title: License\n    - title: Translations\n\n- title: Migration\n"
  },
  {
    "path": "site/data/theme-colors.yml",
    "content": "- name: primary\n  hex: '#0d6efd'\n- name: secondary\n  hex: '#6c757d'\n- name: success\n  hex: '#28a745'\n- name: danger\n  hex: '#dc3545'\n- name: warning\n  hex: '#ffc107'\n  contrast_color: dark\n- name: info\n  hex: '#17a2b8'\n  contrast_color: dark\n- name: light\n  hex: '#f8f9fa'\n  contrast_color: dark\n- name: dark\n  hex: '#343a40'\n  contrast_color: white\n"
  },
  {
    "path": "site/data/translations.yml",
    "content": "- name: 中文(繁體)\n  code: zh-tw\n  description: Bootstrap 5 繁體中文手冊\n  url: https://bootstrap5.hexschool.com/\n\n- name: Japanese\n  code: ja\n  description: Bootstrap 5 日本語リファレンス\n  url: https://getbootstrap.jp/\n\n- name: Russian\n  code: ru\n  description: Bootstrap 5 на русском\n  url: https://getbootstrap.su/\n\n- name: Korean\n  code: ko\n  description: Bootstrap 5 한국어 문서\n  url: https://getbootstrap.kr/\n"
  },
  {
    "path": "site/postcss.config.cjs",
    "content": "module.exports = {\n  plugins: [require('autoprefixer')]\n}\n"
  },
  {
    "path": "site/src/assets/application.js",
    "content": "// NOTICE!! DO NOT USE ANY OF THIS JAVASCRIPT\n// IT'S ALL JUST JUNK FOR OUR DOCS!\n// ++++++++++++++++++++++++++++++++++++++++++\n\n/*!\n * JavaScript for Bootstrap's docs (https://getbootstrap.com/)\n * Copyright 2011-2026 The Bootstrap Authors\n * Licensed under the Creative Commons Attribution 3.0 Unported License.\n * For details, see https://creativecommons.org/licenses/by/3.0/.\n */\n\nimport sidebarScroll from './partials/sidebar.js'\nimport snippets from './partials/snippets.js'\n\nsidebarScroll()\nsnippets()\n"
  },
  {
    "path": "site/src/assets/examples/album/index.astro",
    "content": "---\nimport { getVersionedDocsPath } from '@libs/path'\n\nexport const title = 'Album example'\nimport Placeholder from \"@shortcodes/Placeholder.astro\"\n---\n\n<header data-bs-theme=\"dark\">\n  <div class=\"collapse text-bg-dark\" id=\"navbarHeader\">\n    <div class=\"container\">\n      <div class=\"row\">\n        <div class=\"col-sm-8 col-md-7 py-4\">\n          <h4>About</h4>\n          <p class=\"text-body-secondary\">Add some information about the album below, the author, or any other background context. Make it a few sentences long so folks can pick up some informative tidbits. Then, link them off to some social networking sites or contact information.</p>\n        </div>\n        <div class=\"col-sm-4 offset-md-1 py-4\">\n          <h4>Contact</h4>\n          <ul class=\"list-unstyled\">\n            <li><a href=\"#\" class=\"text-white\">Follow on X</a></li>\n            <li><a href=\"#\" class=\"text-white\">Like on Facebook</a></li>\n            <li><a href=\"#\" class=\"text-white\">Email me</a></li>\n          </ul>\n        </div>\n      </div>\n    </div>\n  </div>\n  <div class=\"navbar navbar-dark bg-dark shadow-sm\">\n    <div class=\"container\">\n      <a href=\"#\" class=\"navbar-brand d-flex align-items-center\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" aria-hidden=\"true\" class=\"me-2\" viewBox=\"0 0 24 24\"><path d=\"M23 19a2 2 0 0 1-2 2H3a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h4l2-3h6l2 3h4a2 2 0 0 1 2 2z\"/><circle cx=\"12\" cy=\"13\" r=\"4\"/></svg>\n        <strong>Album</strong>\n      </a>\n      <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbarHeader\" aria-controls=\"navbarHeader\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n        <span class=\"navbar-toggler-icon\"></span>\n      </button>\n    </div>\n  </div>\n</header>\n\n<main>\n\n  <section class=\"py-5 text-center container\">\n    <div class=\"row py-lg-5\">\n      <div class=\"col-lg-6 col-md-8 mx-auto\">\n        <h1 class=\"fw-light\">Album example</h1>\n        <p class=\"lead text-body-secondary\">Something short and leading about the collection below—its contents, the creator, etc. Make it short and sweet, but not too short so folks don’t simply skip over it entirely.</p>\n        <p>\n          <a href=\"#\" class=\"btn btn-primary my-2\">Main call to action</a>\n          <a href=\"#\" class=\"btn btn-secondary my-2\">Secondary action</a>\n        </p>\n      </div>\n    </div>\n  </section>\n\n  <div class=\"album py-5 bg-body-tertiary\">\n    <div class=\"container\">\n\n      <div class=\"row row-cols-1 row-cols-sm-2 row-cols-md-3 g-3\">\n        <div class=\"col\">\n          <div class=\"card shadow-sm\">\n            <Placeholder width=\"100%\" height=\"225\" background=\"#55595c\" color=\"#eceeef\" class=\"card-img-top\" text=\"Thumbnail\" />\n            <div class=\"card-body\">\n              <p class=\"card-text\">This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</p>\n              <div class=\"d-flex justify-content-between align-items-center\">\n                <div class=\"btn-group\">\n                  <button type=\"button\" class=\"btn btn-sm btn-outline-secondary\">View</button>\n                  <button type=\"button\" class=\"btn btn-sm btn-outline-secondary\">Edit</button>\n                </div>\n                <small class=\"text-body-secondary\">9 mins</small>\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class=\"col\">\n          <div class=\"card shadow-sm\">\n            <Placeholder width=\"100%\" height=\"225\" background=\"#55595c\" color=\"#eceeef\" class=\"card-img-top\" text=\"Thumbnail\" />\n            <div class=\"card-body\">\n              <p class=\"card-text\">This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</p>\n              <div class=\"d-flex justify-content-between align-items-center\">\n                <div class=\"btn-group\">\n                  <button type=\"button\" class=\"btn btn-sm btn-outline-secondary\">View</button>\n                  <button type=\"button\" class=\"btn btn-sm btn-outline-secondary\">Edit</button>\n                </div>\n                <small class=\"text-body-secondary\">9 mins</small>\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class=\"col\">\n          <div class=\"card shadow-sm\">\n            <Placeholder width=\"100%\" height=\"225\" background=\"#55595c\" color=\"#eceeef\" class=\"card-img-top\" text=\"Thumbnail\" />\n            <div class=\"card-body\">\n              <p class=\"card-text\">This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</p>\n              <div class=\"d-flex justify-content-between align-items-center\">\n                <div class=\"btn-group\">\n                  <button type=\"button\" class=\"btn btn-sm btn-outline-secondary\">View</button>\n                  <button type=\"button\" class=\"btn btn-sm btn-outline-secondary\">Edit</button>\n                </div>\n                <small class=\"text-body-secondary\">9 mins</small>\n              </div>\n            </div>\n          </div>\n        </div>\n\n        <div class=\"col\">\n          <div class=\"card shadow-sm\">\n            <Placeholder width=\"100%\" height=\"225\" background=\"#55595c\" color=\"#eceeef\" class=\"card-img-top\" text=\"Thumbnail\" />\n            <div class=\"card-body\">\n              <p class=\"card-text\">This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</p>\n              <div class=\"d-flex justify-content-between align-items-center\">\n                <div class=\"btn-group\">\n                  <button type=\"button\" class=\"btn btn-sm btn-outline-secondary\">View</button>\n                  <button type=\"button\" class=\"btn btn-sm btn-outline-secondary\">Edit</button>\n                </div>\n                <small class=\"text-body-secondary\">9 mins</small>\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class=\"col\">\n          <div class=\"card shadow-sm\">\n            <Placeholder width=\"100%\" height=\"225\" background=\"#55595c\" color=\"#eceeef\" class=\"card-img-top\" text=\"Thumbnail\" />\n            <div class=\"card-body\">\n              <p class=\"card-text\">This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</p>\n              <div class=\"d-flex justify-content-between align-items-center\">\n                <div class=\"btn-group\">\n                  <button type=\"button\" class=\"btn btn-sm btn-outline-secondary\">View</button>\n                  <button type=\"button\" class=\"btn btn-sm btn-outline-secondary\">Edit</button>\n                </div>\n                <small class=\"text-body-secondary\">9 mins</small>\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class=\"col\">\n          <div class=\"card shadow-sm\">\n            <Placeholder width=\"100%\" height=\"225\" background=\"#55595c\" color=\"#eceeef\" class=\"card-img-top\" text=\"Thumbnail\" />\n            <div class=\"card-body\">\n              <p class=\"card-text\">This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</p>\n              <div class=\"d-flex justify-content-between align-items-center\">\n                <div class=\"btn-group\">\n                  <button type=\"button\" class=\"btn btn-sm btn-outline-secondary\">View</button>\n                  <button type=\"button\" class=\"btn btn-sm btn-outline-secondary\">Edit</button>\n                </div>\n                <small class=\"text-body-secondary\">9 mins</small>\n              </div>\n            </div>\n          </div>\n        </div>\n\n        <div class=\"col\">\n          <div class=\"card shadow-sm\">\n            <Placeholder width=\"100%\" height=\"225\" background=\"#55595c\" color=\"#eceeef\" class=\"card-img-top\" text=\"Thumbnail\" />\n            <div class=\"card-body\">\n              <p class=\"card-text\">This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</p>\n              <div class=\"d-flex justify-content-between align-items-center\">\n                <div class=\"btn-group\">\n                  <button type=\"button\" class=\"btn btn-sm btn-outline-secondary\">View</button>\n                  <button type=\"button\" class=\"btn btn-sm btn-outline-secondary\">Edit</button>\n                </div>\n                <small class=\"text-body-secondary\">9 mins</small>\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class=\"col\">\n          <div class=\"card shadow-sm\">\n            <Placeholder width=\"100%\" height=\"225\" background=\"#55595c\" color=\"#eceeef\" class=\"card-img-top\" text=\"Thumbnail\" />\n            <div class=\"card-body\">\n              <p class=\"card-text\">This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</p>\n              <div class=\"d-flex justify-content-between align-items-center\">\n                <div class=\"btn-group\">\n                  <button type=\"button\" class=\"btn btn-sm btn-outline-secondary\">View</button>\n                  <button type=\"button\" class=\"btn btn-sm btn-outline-secondary\">Edit</button>\n                </div>\n                <small class=\"text-body-secondary\">9 mins</small>\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class=\"col\">\n          <div class=\"card shadow-sm\">\n            <Placeholder width=\"100%\" height=\"225\" background=\"#55595c\" color=\"#eceeef\" class=\"card-img-top\" text=\"Thumbnail\" />\n            <div class=\"card-body\">\n              <p class=\"card-text\">This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</p>\n              <div class=\"d-flex justify-content-between align-items-center\">\n                <div class=\"btn-group\">\n                  <button type=\"button\" class=\"btn btn-sm btn-outline-secondary\">View</button>\n                  <button type=\"button\" class=\"btn btn-sm btn-outline-secondary\">Edit</button>\n                </div>\n                <small class=\"text-body-secondary\">9 mins</small>\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n\n</main>\n\n<footer class=\"text-body-secondary py-5\">\n  <div class=\"container\">\n    <p class=\"float-end mb-1\">\n      <a href=\"#\">Back to top</a>\n    </p>\n    <p class=\"mb-1\">Album example is &copy; Bootstrap, but please download and customize it for yourself!</p>\n    <p class=\"mb-0\">New to Bootstrap? <a href=\"/\">Visit the homepage</a> or read our <a href={getVersionedDocsPath('/getting-started/introduction')}>getting started guide</a>.</p>\n  </div>\n</footer>\n"
  },
  {
    "path": "site/src/assets/examples/album-rtl/index.astro",
    "content": "---\nimport { getVersionedDocsPath } from '@libs/path'\nimport Placeholder from '@shortcodes/Placeholder.astro'\n\nexport const title = 'مثال الألبوم'\nexport const direction = 'rtl'\n---\n\n<header data-bs-theme=\"dark\">\n  <div class=\"collapse text-bg-dark\" id=\"navbarHeader\">\n    <div class=\"container\">\n      <div class=\"row\">\n        <div class=\"col-sm-8 col-md-7 py-4\">\n          <h4>حول</h4>\n          <p class=\"text-body-secondary\">أضف بعض المعلومات حول الألبوم، المؤلف، أو أي سياق خلفية آخر. اجعلها بضع جمل حتى يتمكن الزوار من التقاط بعض التلميحات المفيدة. ثم اربطها ببعض مواقع التواصل الاجتماعي أو معلومات الاتصال.</p>\n        </div>\n        <div class=\"col-sm-4 offset-md-1 py-4\">\n          <h4>تواصل معي</h4>\n          <ul class=\"list-unstyled\">\n            <li><a href=\"#\" class=\"text-white\">تابعني على تويتر</a></li>\n            <li><a href=\"#\" class=\"text-white\">شاركني الإعجاب في فيسبوك</a></li>\n            <li><a href=\"#\" class=\"text-white\">راسلني على البريد الإلكتروني</a></li>\n          </ul>\n        </div>\n      </div>\n    </div>\n  </div>\n  <div class=\"navbar navbar-dark bg-dark shadow-sm\">\n    <div class=\"container\">\n      <a href=\"#\" class=\"navbar-brand d-flex align-items-center\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" aria-hidden=\"true\" class=\"me-2\" viewBox=\"0 0 24 24\"><path d=\"M23 19a2 2 0 0 1-2 2H3a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h4l2-3h6l2 3h4a2 2 0 0 1 2 2z\"/><circle cx=\"12\" cy=\"13\" r=\"4\"/></svg>\n        <strong>الألبوم</strong>\n      </a>\n      <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbarHeader\" aria-controls=\"navbarHeader\" aria-expanded=\"false\" aria-label=\"تبديل التنقل\">\n        <span class=\"navbar-toggler-icon\"></span>\n      </button>\n    </div>\n  </div>\n</header>\n\n<main>\n\n  <section class=\"py-5 text-center container\">\n    <div class=\"row py-lg-5\">\n      <div class=\"col-lg-6 col-md-8 mx-auto\">\n        <h1 class=\"fw-light\">مثال الألبوم</h1>\n        <p class=\"lead text-body-secondary\">وصف قصير حول الألبوم أدناه (محتوياته ، ومنشؤه ، وما إلى ذلك). اجعله قصير ولطيف، ولكن ليست قصير جدًا حتى لا يتخطى الناس هذا الألبوم تمامًا.</p>\n        <p>\n          <a href=\"#\" class=\"btn btn-primary my-2\">الدعوة الرئيسية للعمل</a>\n          <a href=\"#\" class=\"btn btn-secondary my-2\">عمل ثانوي</a>\n        </p>\n      </div>\n    </div>\n  </section>\n\n  <div class=\"album py-5 bg-body-tertiary\">\n    <div class=\"container\">\n\n      <div class=\"row row-cols-1 row-cols-sm-2 row-cols-md-3 g-3\">\n        <div class=\"col\">\n          <div class=\"card shadow-sm\">\n            <Placeholder width=\"100%\" height=\"225\" background=\"#55595c\" color=\"#eceeef\" class=\"card-img-top\" text=\"صورة مصغرة\" />\n            <div class=\"card-body\">\n              <p class=\"card-text\">هذه بطاقة أوسع مع نص داعم أدناه كمقدمة طبيعية لمحتوى إضافي. هذا المحتوى أطول قليلاً.</p>\n              <div class=\"d-flex justify-content-between align-items-center\">\n                <div class=\"btn-group\">\n                  <button type=\"button\" class=\"btn btn-sm btn-outline-secondary\">عرض</button>\n                  <button type=\"button\" class=\"btn btn-sm btn-outline-secondary\">تعديل</button>\n                </div>\n                <small class=\"text-body-secondary\">9 دقائق</small>\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class=\"col\">\n          <div class=\"card shadow-sm\">\n            <Placeholder width=\"100%\" height=\"225\" background=\"#55595c\" color=\"#eceeef\" class=\"card-img-top\" text=\"صورة مصغرة\" />\n            <div class=\"card-body\">\n              <p class=\"card-text\">هذه بطاقة أوسع مع نص داعم أدناه كمقدمة طبيعية لمحتوى إضافي. هذا المحتوى أطول قليلاً.</p>\n              <div class=\"d-flex justify-content-between align-items-center\">\n                <div class=\"btn-group\">\n                  <button type=\"button\" class=\"btn btn-sm btn-outline-secondary\">عرض</button>\n                  <button type=\"button\" class=\"btn btn-sm btn-outline-secondary\">تعديل</button>\n                </div>\n                <small class=\"text-body-secondary\">9 دقائق</small>\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class=\"col\">\n          <div class=\"card shadow-sm\">\n            <Placeholder width=\"100%\" height=\"225\" background=\"#55595c\" color=\"#eceeef\" class=\"card-img-top\" text=\"صورة مصغرة\" />\n            <div class=\"card-body\">\n              <p class=\"card-text\">هذه بطاقة أوسع مع نص داعم أدناه كمقدمة طبيعية لمحتوى إضافي. هذا المحتوى أطول قليلاً.</p>\n              <div class=\"d-flex justify-content-between align-items-center\">\n                <div class=\"btn-group\">\n                  <button type=\"button\" class=\"btn btn-sm btn-outline-secondary\">عرض</button>\n                  <button type=\"button\" class=\"btn btn-sm btn-outline-secondary\">تعديل</button>\n                </div>\n                <small class=\"text-body-secondary\">9 دقائق</small>\n              </div>\n            </div>\n          </div>\n        </div>\n\n        <div class=\"col\">\n          <div class=\"card shadow-sm\">\n            <Placeholder width=\"100%\" height=\"225\" background=\"#55595c\" color=\"#eceeef\" class=\"card-img-top\" text=\"صورة مصغرة\" />\n            <div class=\"card-body\">\n              <p class=\"card-text\">هذه بطاقة أوسع مع نص داعم أدناه كمقدمة طبيعية لمحتوى إضافي. هذا المحتوى أطول قليلاً.</p>\n              <div class=\"d-flex justify-content-between align-items-center\">\n                <div class=\"btn-group\">\n                  <button type=\"button\" class=\"btn btn-sm btn-outline-secondary\">عرض</button>\n                  <button type=\"button\" class=\"btn btn-sm btn-outline-secondary\">تعديل</button>\n                </div>\n                <small class=\"text-body-secondary\">9 دقائق</small>\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class=\"col\">\n          <div class=\"card shadow-sm\">\n            <Placeholder width=\"100%\" height=\"225\" background=\"#55595c\" color=\"#eceeef\" class=\"card-img-top\" text=\"صورة مصغرة\" />\n            <div class=\"card-body\">\n              <p class=\"card-text\">هذه بطاقة أوسع مع نص داعم أدناه كمقدمة طبيعية لمحتوى إضافي. هذا المحتوى أطول قليلاً.</p>\n              <div class=\"d-flex justify-content-between align-items-center\">\n                <div class=\"btn-group\">\n                  <button type=\"button\" class=\"btn btn-sm btn-outline-secondary\">عرض</button>\n                  <button type=\"button\" class=\"btn btn-sm btn-outline-secondary\">تعديل</button>\n                </div>\n                <small class=\"text-body-secondary\">9 دقائق</small>\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class=\"col\">\n          <div class=\"card shadow-sm\">\n            <Placeholder width=\"100%\" height=\"225\" background=\"#55595c\" color=\"#eceeef\" class=\"card-img-top\" text=\"صورة مصغرة\" />\n            <div class=\"card-body\">\n              <p class=\"card-text\">هذه بطاقة أوسع مع نص داعم أدناه كمقدمة طبيعية لمحتوى إضافي. هذا المحتوى أطول قليلاً.</p>\n              <div class=\"d-flex justify-content-between align-items-center\">\n                <div class=\"btn-group\">\n                  <button type=\"button\" class=\"btn btn-sm btn-outline-secondary\">عرض</button>\n                  <button type=\"button\" class=\"btn btn-sm btn-outline-secondary\">تعديل</button>\n                </div>\n                <small class=\"text-body-secondary\">9 دقائق</small>\n              </div>\n            </div>\n          </div>\n        </div>\n\n        <div class=\"col\">\n          <div class=\"card shadow-sm\">\n            <Placeholder width=\"100%\" height=\"225\" background=\"#55595c\" color=\"#eceeef\" class=\"card-img-top\" text=\"صورة مصغرة\" />\n            <div class=\"card-body\">\n              <p class=\"card-text\">هذه بطاقة أوسع مع نص داعم أدناه كمقدمة طبيعية لمحتوى إضافي. هذا المحتوى أطول قليلاً.</p>\n              <div class=\"d-flex justify-content-between align-items-center\">\n                <div class=\"btn-group\">\n                  <button type=\"button\" class=\"btn btn-sm btn-outline-secondary\">عرض</button>\n                  <button type=\"button\" class=\"btn btn-sm btn-outline-secondary\">تعديل</button>\n                </div>\n                <small class=\"text-body-secondary\">9 دقائق</small>\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class=\"col\">\n          <div class=\"card shadow-sm\">\n            <Placeholder width=\"100%\" height=\"225\" background=\"#55595c\" color=\"#eceeef\" class=\"card-img-top\" text=\"صورة مصغرة\" />\n            <div class=\"card-body\">\n              <p class=\"card-text\">هذه بطاقة أوسع مع نص داعم أدناه كمقدمة طبيعية لمحتوى إضافي. هذا المحتوى أطول قليلاً.</p>\n              <div class=\"d-flex justify-content-between align-items-center\">\n                <div class=\"btn-group\">\n                  <button type=\"button\" class=\"btn btn-sm btn-outline-secondary\">عرض</button>\n                  <button type=\"button\" class=\"btn btn-sm btn-outline-secondary\">تعديل</button>\n                </div>\n                <small class=\"text-body-secondary\">9 دقائق</small>\n              </div>\n            </div>\n          </div>\n        </div>\n        <div class=\"col\">\n          <div class=\"card shadow-sm\">\n            <Placeholder width=\"100%\" height=\"225\" background=\"#55595c\" color=\"#eceeef\" class=\"card-img-top\" text=\"صورة مصغرة\" />\n            <div class=\"card-body\">\n              <p class=\"card-text\">هذه بطاقة أوسع مع نص داعم أدناه كمقدمة طبيعية لمحتوى إضافي. هذا المحتوى أطول قليلاً.</p>\n              <div class=\"d-flex justify-content-between align-items-center\">\n                <div class=\"btn-group\">\n                  <button type=\"button\" class=\"btn btn-sm btn-outline-secondary\">عرض</button>\n                  <button type=\"button\" class=\"btn btn-sm btn-outline-secondary\">تعديل</button>\n                </div>\n                <small class=\"text-body-secondary\">9 دقائق</small>\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n\n</main>\n\n<footer class=\"text-body-secondary py-5\">\n  <div class=\"container\">\n    <p class=\"float-end mb-1\">\n      <a href=\"#\">عد إلى الأعلى</a>\n    </p>\n    <p class=\"mb-1\">مثال الألبوم هو © Bootstrap ، ولكن يرجى تنزيله وتخصيصه لنفسك!</p>\n    <p class=\"mb-0\">جديد على Bootstrap؟ <a href=\"/\"> تفضل بزيارة الصفحة الرئيسية </a> أو اقرأ <a href={getVersionedDocsPath('/getting-started/introduction')}> دليل البدء </a>.</p>\n  </div>\n</footer>\n"
  },
  {
    "path": "site/src/assets/examples/badges/badges.css",
    "content": ".badge > a {\n  color: inherit;\n}\n"
  },
  {
    "path": "site/src/assets/examples/badges/index.astro",
    "content": "---\nexport const title = 'Badges'\nexport const extra_css = ['badges.css']\n---\n\n<svg xmlns=\"http://www.w3.org/2000/svg\" class=\"d-none\">\n  <symbol id=\"x-circle-fill\" viewBox=\"0 0 16 16\">\n    <path d=\"M16 8A8 8 0 1 1 0 8a8 8 0 0 1 16 0zM5.354 4.646a.5.5 0 1 0-.708.708L7.293 8l-2.647 2.646a.5.5 0 0 0 .708.708L8 8.707l2.646 2.647a.5.5 0 0 0 .708-.708L8.707 8l2.647-2.646a.5.5 0 0 0-.708-.708L8 7.293 5.354 4.646z\"/>\n  </symbol>\n</svg>\n\n<div class=\"d-flex gap-2 justify-content-center py-5\">\n  <span class=\"badge text-bg-primary rounded-pill\">Primary</span>\n  <span class=\"badge text-bg-secondary rounded-pill\">Secondary</span>\n  <span class=\"badge text-bg-success rounded-pill\">Success</span>\n  <span class=\"badge text-bg-danger rounded-pill\">Danger</span>\n  <span class=\"badge text-bg-warning rounded-pill\">Warning</span>\n  <span class=\"badge text-bg-info rounded-pill\">Info</span>\n  <span class=\"badge text-bg-light rounded-pill\">Light</span>\n  <span class=\"badge text-bg-dark rounded-pill\">Dark</span>\n</div>\n\n<div class=\"b-example-divider\"></div>\n\n<div class=\"d-flex gap-2 justify-content-center py-5\">\n  <span class=\"badge bg-primary-subtle text-primary-emphasis rounded-pill\">Primary</span>\n  <span class=\"badge bg-secondary-subtle text-secondary-emphasis rounded-pill\">Secondary</span>\n  <span class=\"badge bg-success-subtle text-success-emphasis rounded-pill\">Success</span>\n  <span class=\"badge bg-danger-subtle text-danger-emphasis rounded-pill\">Danger</span>\n  <span class=\"badge bg-warning-subtle text-warning-emphasis rounded-pill\">Warning</span>\n  <span class=\"badge bg-info-subtle text-info-emphasis rounded-pill\">Info</span>\n  <span class=\"badge bg-light-subtle text-light-emphasis rounded-pill\">Light</span>\n  <span class=\"badge bg-dark-subtle text-dark-emphasis rounded-pill\">Dark</span>\n</div>\n\n<div class=\"b-example-divider\"></div>\n\n<div class=\"d-flex gap-2 justify-content-center py-5\">\n  <span class=\"badge bg-primary-subtle border border-primary-subtle text-primary-emphasis rounded-pill\">Primary</span>\n  <span class=\"badge bg-secondary-subtle border border-secondary-subtle text-secondary-emphasis rounded-pill\">Secondary</span>\n  <span class=\"badge bg-success-subtle border border-success-subtle text-success-emphasis rounded-pill\">Success</span>\n  <span class=\"badge bg-danger-subtle border border-danger-subtle text-danger-emphasis rounded-pill\">Danger</span>\n  <span class=\"badge bg-warning-subtle border border-warning-subtle text-warning-emphasis rounded-pill\">Warning</span>\n  <span class=\"badge bg-info-subtle border border-info-subtle text-info-emphasis rounded-pill\">Info</span>\n  <span class=\"badge bg-light-subtle border border-light-subtle text-light-emphasis rounded-pill\">Light</span>\n  <span class=\"badge bg-dark-subtle border border-dark-subtle text-dark-emphasis rounded-pill\">Dark</span>\n</div>\n\n<div class=\"b-example-divider\"></div>\n\n<div class=\"d-flex gap-2 justify-content-center py-5\">\n  <span class=\"badge d-flex align-items-center p-1 pe-2 text-primary-emphasis bg-primary-subtle border border-primary-subtle rounded-pill\">\n    <img class=\"rounded-circle me-1\" width=\"24\" height=\"24\" src=\"https://github.com/mdo.png\" alt=\"\">Primary\n  </span>\n  <span class=\"badge d-flex align-items-center p-1 pe-2 text-secondary-emphasis bg-secondary-subtle border border-secondary-subtle rounded-pill\">\n    <img class=\"rounded-circle me-1\" width=\"24\" height=\"24\" src=\"https://github.com/mdo.png\" alt=\"\">Secondary\n  </span>\n  <span class=\"badge d-flex align-items-center p-1 pe-2 text-success-emphasis bg-success-subtle border border-success-subtle rounded-pill\">\n    <img class=\"rounded-circle me-1\" width=\"24\" height=\"24\" src=\"https://github.com/mdo.png\" alt=\"\">Success\n  </span>\n  <span class=\"badge d-flex align-items-center p-1 pe-2 text-danger-emphasis bg-danger-subtle border border-danger-subtle rounded-pill\">\n    <img class=\"rounded-circle me-1\" width=\"24\" height=\"24\" src=\"https://github.com/mdo.png\" alt=\"\">Danger\n  </span>\n  <span class=\"badge d-flex align-items-center p-1 pe-2 text-warning-emphasis bg-warning-subtle border border-warning-subtle rounded-pill\">\n    <img class=\"rounded-circle me-1\" width=\"24\" height=\"24\" src=\"https://github.com/mdo.png\" alt=\"\">Warning\n  </span>\n  <span class=\"badge d-flex align-items-center p-1 pe-2 text-info-emphasis bg-info-subtle border border-info-subtle rounded-pill\">\n    <img class=\"rounded-circle me-1\" width=\"24\" height=\"24\" src=\"https://github.com/mdo.png\" alt=\"\">Info\n  </span>\n  <span class=\"badge d-flex align-items-center p-1 pe-2 text-dark-emphasis bg-light-subtle border border-dark-subtle rounded-pill\">\n    <img class=\"rounded-circle me-1\" width=\"24\" height=\"24\" src=\"https://github.com/mdo.png\" alt=\"\">Light\n  </span>\n  <span class=\"badge d-flex align-items-center p-1 pe-2 text-dark-emphasis bg-dark-subtle border border-dark-subtle rounded-pill\">\n    <img class=\"rounded-circle me-1\" width=\"24\" height=\"24\" src=\"https://github.com/mdo.png\" alt=\"\">Dark\n  </span>\n</div>\n\n<div class=\"b-example-divider\"></div>\n\n<div class=\"d-flex gap-2 justify-content-center py-5\">\n  <span class=\"badge d-flex p-2 align-items-center text-bg-primary rounded-pill\">\n    <span class=\"px-1\">Primary 1</span>\n    <a href=\"#\" aria-label=\"Delete primary 1\"><svg class=\"bi ms-1\" width=\"16\" height=\"16\" aria-hidden=\"true\"><use xlink:href=\"#x-circle-fill\"/></svg></a>\n  </span>\n  <span class=\"badge d-flex p-2 align-items-center text-primary-emphasis bg-primary-subtle rounded-pill\">\n    <span class=\"px-1\">Primary 2</span>\n    <a href=\"#\" aria-label=\"Delete primary 2\"><svg class=\"bi ms-1\" width=\"16\" height=\"16\" aria-hidden=\"true\"><use xlink:href=\"#x-circle-fill\"/></svg></a>\n  </span>\n  <span class=\"badge d-flex p-2 align-items-center text-primary-emphasis bg-primary-subtle border border-primary-subtle rounded-pill\">\n    <span class=\"px-1\">Primary 3</span>\n    <a href=\"#\" aria-label=\"Delete primary 3\"><svg class=\"bi ms-1\" width=\"16\" height=\"16\" aria-hidden=\"true\"><use xlink:href=\"#x-circle-fill\"/></svg></a>\n  </span>\n</div>\n\n<div class=\"b-example-divider\"></div>\n\n<div class=\"d-flex gap-2 justify-content-center py-5\">\n  <span class=\"badge d-flex align-items-center p-1 pe-2 text-primary-emphasis bg-primary-subtle border border-primary-subtle rounded-pill\">\n    <img class=\"rounded-circle me-1\" width=\"24\" height=\"24\" src=\"https://github.com/mdo.png\" alt=\"\">\n    Primary\n    <span class=\"vr mx-2\"></span>\n    <a href=\"#\" aria-label=\"Delete primary\"><svg class=\"bi\" width=\"16\" height=\"16\" aria-hidden=\"true\"><use xlink:href=\"#x-circle-fill\"/></svg></a>\n  </span>\n  <span class=\"badge d-flex align-items-center p-1 pe-2 text-secondary-emphasis bg-secondary-subtle border border-secondary-subtle rounded-pill\">\n    <img class=\"rounded-circle me-1\" width=\"24\" height=\"24\" src=\"https://github.com/mdo.png\" alt=\"\">\n    Secondary\n    <span class=\"vr mx-2\"></span>\n    <a href=\"#\" aria-label=\"Delete secondary\"><svg class=\"bi\" width=\"16\" height=\"16\" aria-hidden=\"true\"><use xlink:href=\"#x-circle-fill\"/></svg></a>\n  </span>\n  <span class=\"badge d-flex align-items-center p-1 pe-2 text-success-emphasis bg-success-subtle border border-success-subtle rounded-pill\">\n    <img class=\"rounded-circle me-1\" width=\"24\" height=\"24\" src=\"https://github.com/mdo.png\" alt=\"\">\n    Success\n    <span class=\"vr mx-2\"></span>\n    <a href=\"#\" aria-label=\"Delete success\"><svg class=\"bi\" width=\"16\" height=\"16\" aria-hidden=\"true\"><use xlink:href=\"#x-circle-fill\"/></svg></a>\n  </span>\n  <span class=\"badge d-flex align-items-center p-1 pe-2 text-danger-emphasis bg-danger-subtle border border-danger-subtle rounded-pill\">\n    <img class=\"rounded-circle me-1\" width=\"24\" height=\"24\" src=\"https://github.com/mdo.png\" alt=\"\">\n    Danger\n    <span class=\"vr mx-2\"></span>\n    <a href=\"#\" aria-label=\"Delete danger\"><svg class=\"bi\" width=\"16\" height=\"16\" aria-hidden=\"true\"><use xlink:href=\"#x-circle-fill\"/></svg></a>\n  </span>\n  <span class=\"badge d-flex align-items-center p-1 pe-2 text-warning-emphasis bg-warning-subtle border border-warning-subtle rounded-pill\">\n    <img class=\"rounded-circle me-1\" width=\"24\" height=\"24\" src=\"https://github.com/mdo.png\" alt=\"\">\n    Warning\n    <span class=\"vr mx-2\"></span>\n    <a href=\"#\" aria-label=\"Delete warning\"><svg class=\"bi\" width=\"16\" height=\"16\" aria-hidden=\"true\"><use xlink:href=\"#x-circle-fill\"/></svg></a>\n  </span>\n  <span class=\"badge d-flex align-items-center p-1 pe-2 text-info-emphasis bg-info-subtle border border-info-subtle rounded-pill\">\n    <img class=\"rounded-circle me-1\" width=\"24\" height=\"24\" src=\"https://github.com/mdo.png\" alt=\"\">\n    Info\n    <span class=\"vr mx-2\"></span>\n    <a href=\"#\" aria-label=\"Delete info\"><svg class=\"bi\" width=\"16\" height=\"16\" aria-hidden=\"true\"><use xlink:href=\"#x-circle-fill\"/></svg></a>\n  </span>\n  <span class=\"badge d-flex align-items-center p-1 pe-2 text-light-emphasis bg-light-subtle border border-dark-subtle rounded-pill\">\n    <img class=\"rounded-circle me-1\" width=\"24\" height=\"24\" src=\"https://github.com/mdo.png\" alt=\"\">\n    Light\n    <span class=\"vr mx-2\"></span>\n    <a href=\"#\" aria-label=\"Delete light\"><svg class=\"bi\" width=\"16\" height=\"16\" aria-hidden=\"true\"><use xlink:href=\"#x-circle-fill\"/></svg></a>\n  </span>\n  <span class=\"badge d-flex align-items-center p-1 pe-2 text-dark-emphasis bg-dark-subtle border border-dark-subtle rounded-pill\">\n    <img class=\"rounded-circle me-1\" width=\"24\" height=\"24\" src=\"https://github.com/mdo.png\" alt=\"\">\n    Dark\n    <span class=\"vr mx-2\"></span>\n    <a href=\"#\" aria-label=\"Delete dark\"><svg class=\"bi\" width=\"16\" height=\"16\" aria-hidden=\"true\"><use xlink:href=\"#x-circle-fill\"/></svg></a>\n  </span>\n</div>\n"
  },
  {
    "path": "site/src/assets/examples/blog/blog.css",
    "content": "/* stylelint-disable @stylistic/selector-list-comma-newline-after */\n\n.blog-header-logo {\n  font-family: \"Playfair Display\", Georgia, \"Times New Roman\", serif/*rtl:Amiri, Georgia, \"Times New Roman\", serif*/;\n  font-size: 2.25rem;\n}\n\n.blog-header-logo:hover {\n  text-decoration: none;\n}\n\nh1, h2, h3, h4, h5, h6 {\n  font-family: \"Playfair Display\", Georgia, \"Times New Roman\", serif/*rtl:Amiri, Georgia, \"Times New Roman\", serif*/;\n}\n\n.flex-auto {\n  flex: 0 0 auto;\n}\n\n.h-250 { height: 250px; }\n@media (min-width: 768px) {\n  .h-md-250 { height: 250px; }\n}\n\n/* Pagination */\n.blog-pagination {\n  margin-bottom: 4rem;\n}\n\n/*\n * Blog posts\n */\n.blog-post {\n  margin-bottom: 4rem;\n}\n.blog-post-meta {\n  margin-bottom: 1.25rem;\n  color: #727272;\n}\n"
  },
  {
    "path": "site/src/assets/examples/blog/blog.rtl.css",
    "content": "/* stylelint-disable @stylistic/selector-list-comma-newline-after */\n\n.blog-header-logo {\n  font-family: Amiri, Georgia, \"Times New Roman\", serif;\n  font-size: 2.25rem;\n}\n\n.blog-header-logo:hover {\n  text-decoration: none;\n}\n\nh1, h2, h3, h4, h5, h6 {\n  font-family: Amiri, Georgia, \"Times New Roman\", serif;\n}\n\n.flex-auto {\n  flex: 0 0 auto;\n}\n\n.h-250 { height: 250px; }\n@media (min-width: 768px) {\n  .h-md-250 { height: 250px; }\n}\n\n/* Pagination */\n.blog-pagination {\n  margin-bottom: 4rem;\n}\n\n/*\n * Blog posts\n */\n.blog-post {\n  margin-bottom: 4rem;\n}\n.blog-post-meta {\n  margin-bottom: 1.25rem;\n  color: #727272;\n}\n"
  },
  {
    "path": "site/src/assets/examples/blog/index.astro",
    "content": "---\nexport const title = 'Blog Template'\nexport const extra_css = ['https://fonts.googleapis.com/css?family=Playfair+Display:700,900&display=swap', 'blog.css']\nimport Placeholder from \"@shortcodes/Placeholder.astro\"\n---\n\n<svg xmlns=\"http://www.w3.org/2000/svg\" class=\"d-none\">\n  <symbol id=\"aperture\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" viewBox=\"0 0 24 24\">\n    <circle cx=\"12\" cy=\"12\" r=\"10\"/>\n    <path d=\"M14.31 8l5.74 9.94M9.69 8h11.48M7.38 12l5.74-9.94M9.69 16L3.95 6.06M14.31 16H2.83m13.79-4l-5.74 9.94\"/>\n  </symbol>\n  <symbol id=\"cart\" viewBox=\"0 0 16 16\">\n    <path d=\"M0 1.5A.5.5 0 0 1 .5 1H2a.5.5 0 0 1 .485.379L2.89 3H14.5a.5.5 0 0 1 .49.598l-1 5a.5.5 0 0 1-.465.401l-9.397.472L4.415 11H13a.5.5 0 0 1 0 1H4a.5.5 0 0 1-.491-.408L2.01 3.607 1.61 2H.5a.5.5 0 0 1-.5-.5zM3.102 4l.84 4.479 9.144-.459L13.89 4H3.102zM5 12a2 2 0 1 0 0 4 2 2 0 0 0 0-4zm7 0a2 2 0 1 0 0 4 2 2 0 0 0 0-4zm-7 1a1 1 0 1 1 0 2 1 1 0 0 1 0-2zm7 0a1 1 0 1 1 0 2 1 1 0 0 1 0-2z\"/>\n  </symbol>\n  <symbol id=\"chevron-right\" viewBox=\"0 0 16 16\">\n    <path fill-rule=\"evenodd\" d=\"M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z\"/>\n  </symbol>\n</svg>\n\n<div class=\"container\">\n  <header class=\"border-bottom lh-1 py-3\">\n    <div class=\"row flex-nowrap justify-content-between align-items-center\">\n      <div class=\"col-4 pt-1\">\n        <a class=\"link-secondary\" href=\"#\">Subscribe</a>\n      </div>\n      <div class=\"col-4 text-center\">\n        <a class=\"blog-header-logo text-body-emphasis text-decoration-none\" href=\"#\">Large</a>\n      </div>\n      <div class=\"col-4 d-flex justify-content-end align-items-center\">\n        <a class=\"link-secondary\" href=\"#\" aria-label=\"Search\">\n          <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" class=\"mx-3\" role=\"img\" viewBox=\"0 0 24 24\"><title>Search</title><circle cx=\"10.5\" cy=\"10.5\" r=\"7.5\"/><path d=\"M21 21l-5.2-5.2\"/></svg>\n        </a>\n        <a class=\"btn btn-sm btn-outline-secondary\" href=\"#\">Sign up</a>\n      </div>\n    </div>\n  </header>\n\n  <div class=\"nav-scroller py-1 mb-3 border-bottom\">\n    <nav class=\"nav nav-underline justify-content-between\">\n      <a class=\"nav-item nav-link link-body-emphasis active\" href=\"#\">World</a>\n      <a class=\"nav-item nav-link link-body-emphasis\" href=\"#\">U.S.</a>\n      <a class=\"nav-item nav-link link-body-emphasis\" href=\"#\">Technology</a>\n      <a class=\"nav-item nav-link link-body-emphasis\" href=\"#\">Design</a>\n      <a class=\"nav-item nav-link link-body-emphasis\" href=\"#\">Culture</a>\n      <a class=\"nav-item nav-link link-body-emphasis\" href=\"#\">Business</a>\n      <a class=\"nav-item nav-link link-body-emphasis\" href=\"#\">Politics</a>\n      <a class=\"nav-item nav-link link-body-emphasis\" href=\"#\">Opinion</a>\n      <a class=\"nav-item nav-link link-body-emphasis\" href=\"#\">Science</a>\n      <a class=\"nav-item nav-link link-body-emphasis\" href=\"#\">Health</a>\n      <a class=\"nav-item nav-link link-body-emphasis\" href=\"#\">Style</a>\n      <a class=\"nav-item nav-link link-body-emphasis\" href=\"#\">Travel</a>\n    </nav>\n  </div>\n</div>\n\n<main class=\"container\">\n  <div class=\"p-4 p-md-5 mb-4 rounded text-body-emphasis bg-body-secondary\">\n    <div class=\"col-lg-6 px-0\">\n      <h1 class=\"display-4 fst-italic\">Title of a longer featured blog post</h1>\n      <p class=\"lead my-3\">Multiple lines of text that form the lede, informing new readers quickly and efficiently about what’s most interesting in this post’s contents.</p>\n      <p class=\"lead mb-0\"><a href=\"#\" class=\"text-body-emphasis fw-bold\">Continue reading...</a></p>\n    </div>\n  </div>\n\n  <div class=\"row mb-2\">\n    <div class=\"col-md-6\">\n      <div class=\"row g-0 border rounded overflow-hidden flex-md-row mb-4 shadow-sm h-md-250 position-relative\">\n        <div class=\"col p-4 d-flex flex-column position-static\">\n          <strong class=\"d-inline-block mb-2 text-primary-emphasis\">World</strong>\n          <h3 class=\"mb-0\">Featured post</h3>\n          <div class=\"mb-1 text-body-secondary\">Nov 12</div>\n          <p class=\"card-text mb-auto\">This is a wider card with supporting text below as a natural lead-in to additional content.</p>\n          <a href=\"#\" class=\"icon-link gap-1 icon-link-hover stretched-link\">\n            Continue reading\n            <svg class=\"bi\" aria-hidden=\"true\"><use xlink:href=\"#chevron-right\"/></svg>\n          </a>\n        </div>\n        <div class=\"col-auto d-none d-lg-block\">\n          <Placeholder width=\"200\" height=\"250\" background=\"#55595c\" color=\"#eceeef\" text=\"Thumbnail\" />\n        </div>\n      </div>\n    </div>\n    <div class=\"col-md-6\">\n      <div class=\"row g-0 border rounded overflow-hidden flex-md-row mb-4 shadow-sm h-md-250 position-relative\">\n        <div class=\"col p-4 d-flex flex-column position-static\">\n          <strong class=\"d-inline-block mb-2 text-success-emphasis\">Design</strong>\n          <h3 class=\"mb-0\">Post title</h3>\n          <div class=\"mb-1 text-body-secondary\">Nov 11</div>\n          <p class=\"mb-auto\">This is a wider card with supporting text below as a natural lead-in to additional content.</p>\n          <a href=\"#\" class=\"icon-link gap-1 icon-link-hover stretched-link\">\n            Continue reading\n            <svg class=\"bi\" aria-hidden=\"true\"><use xlink:href=\"#chevron-right\"/></svg>\n          </a>\n        </div>\n        <div class=\"col-auto d-none d-lg-block\">\n          <Placeholder width=\"200\" height=\"250\" background=\"#55595c\" color=\"#eceeef\" text=\"Thumbnail\" />\n        </div>\n      </div>\n    </div>\n  </div>\n\n  <div class=\"row g-5\">\n    <div class=\"col-md-8\">\n      <h3 class=\"pb-4 mb-4 fst-italic border-bottom\">\n        From the Firehose\n      </h3>\n\n      <article class=\"blog-post\">\n        <h2 class=\"display-5 link-body-emphasis mb-1\">Sample blog post</h2>\n        <p class=\"blog-post-meta\">January 1, 2021 by <a href=\"#\">Mark</a></p>\n\n        <p>This blog post shows a few different types of content that’s supported and styled with Bootstrap. Basic typography, lists, tables, images, code, and more are all supported as expected.</p>\n        <hr>\n        <p>This is some additional paragraph placeholder content. It has been written to fill the available space and show how a longer snippet of text affects the surrounding content. We'll repeat it often to keep the demonstration flowing, so be on the lookout for this exact same string of text.</p>\n        <h2>Blockquotes</h2>\n        <p>This is an example blockquote in action:</p>\n        <blockquote class=\"blockquote\">\n          <p>Quoted text goes here.</p>\n        </blockquote>\n        <p>This is some additional paragraph placeholder content. It has been written to fill the available space and show how a longer snippet of text affects the surrounding content. We'll repeat it often to keep the demonstration flowing, so be on the lookout for this exact same string of text.</p>\n        <h3>Example lists</h3>\n        <p>This is some additional paragraph placeholder content. It's a slightly shorter version of the other highly repetitive body text used throughout. This is an example unordered list:</p>\n        <ul>\n          <li>First list item</li>\n          <li>Second list item with a longer description</li>\n          <li>Third list item to close it out</li>\n        </ul>\n        <p>And this is an ordered list:</p>\n        <ol>\n          <li>First list item</li>\n          <li>Second list item with a longer description</li>\n          <li>Third list item to close it out</li>\n        </ol>\n        <p>And this is a definition list:</p>\n        <dl>\n          <dt>HyperText Markup Language (HTML)</dt>\n          <dd>The language used to describe and define the content of a Web page</dd>\n          <dt>Cascading Style Sheets (CSS)</dt>\n          <dd>Used to describe the appearance of Web content</dd>\n          <dt>JavaScript (JS)</dt>\n          <dd>The programming language used to build advanced Web sites and applications</dd>\n        </dl>\n        <h2>Inline HTML elements</h2>\n        <p>HTML defines a long list of available inline tags, a complete list of which can be found on the <a href=\"https://developer.mozilla.org/en-US/docs/Web/HTML/Element\">Mozilla Developer Network</a>.</p>\n        <ul>\n          <li><strong>To bold text</strong>, use <code class=\"language-plaintext highlighter-rouge\">&lt;strong&gt;</code>.</li>\n          <li><em>To italicize text</em>, use <code class=\"language-plaintext highlighter-rouge\">&lt;em&gt;</code>.</li>\n          <li>Abbreviations, like <abbr title=\"HyperText Markup Language\">HTML</abbr> should use <code class=\"language-plaintext highlighter-rouge\">&lt;abbr&gt;</code>, with an optional <code class=\"language-plaintext highlighter-rouge\">title</code> attribute for the full phrase.</li>\n          <li>Citations, like <cite>— Mark Otto</cite>, should use <code class=\"language-plaintext highlighter-rouge\">&lt;cite&gt;</code>.</li>\n          <li><del>Deleted</del> text should use <code class=\"language-plaintext highlighter-rouge\">&lt;del&gt;</code> and <ins>inserted</ins> text should use <code class=\"language-plaintext highlighter-rouge\">&lt;ins&gt;</code>.</li>\n          <li>Superscript <sup>text</sup> uses <code class=\"language-plaintext highlighter-rouge\">&lt;sup&gt;</code> and subscript <sub>text</sub> uses <code class=\"language-plaintext highlighter-rouge\">&lt;sub&gt;</code>.</li>\n        </ul>\n        <p>Most of these elements are styled by browsers with few modifications on our part.</p>\n        <h2>Heading</h2>\n        <p>This is some additional paragraph placeholder content. It has been written to fill the available space and show how a longer snippet of text affects the surrounding content. We'll repeat it often to keep the demonstration flowing, so be on the lookout for this exact same string of text.</p>\n        <h3>Sub-heading</h3>\n        <p>This is some additional paragraph placeholder content. It has been written to fill the available space and show how a longer snippet of text affects the surrounding content. We'll repeat it often to keep the demonstration flowing, so be on the lookout for this exact same string of text.</p>\n        <pre><code>Example code block</code></pre>\n        <p>This is some additional paragraph placeholder content. It's a slightly shorter version of the other highly repetitive body text used throughout.</p>\n      </article>\n\n      <article class=\"blog-post\">\n        <h2 class=\"display-5 link-body-emphasis mb-1\">Another blog post</h2>\n        <p class=\"blog-post-meta\">December 23, 2020 by <a href=\"#\">Jacob</a></p>\n\n        <p>This is some additional paragraph placeholder content. It has been written to fill the available space and show how a longer snippet of text affects the surrounding content. We'll repeat it often to keep the demonstration flowing, so be on the lookout for this exact same string of text.</p>\n        <blockquote>\n          <p>Longer quote goes here, maybe with some <strong>emphasized text</strong> in the middle of it.</p>\n        </blockquote>\n        <p>This is some additional paragraph placeholder content. It has been written to fill the available space and show how a longer snippet of text affects the surrounding content. We'll repeat it often to keep the demonstration flowing, so be on the lookout for this exact same string of text.</p>\n        <h3>Example table</h3>\n        <p>And don't forget about tables in these posts:</p>\n        <table class=\"table\">\n          <thead>\n            <tr>\n              <th>Name</th>\n              <th>Upvotes</th>\n              <th>Downvotes</th>\n            </tr>\n          </thead>\n          <tbody>\n            <tr>\n              <td>Alice</td>\n              <td>10</td>\n              <td>11</td>\n            </tr>\n            <tr>\n              <td>Bob</td>\n              <td>4</td>\n              <td>3</td>\n            </tr>\n            <tr>\n              <td>Charlie</td>\n              <td>7</td>\n              <td>9</td>\n            </tr>\n          </tbody>\n          <tfoot>\n            <tr>\n              <td>Totals</td>\n              <td>21</td>\n              <td>23</td>\n            </tr>\n          </tfoot>\n        </table>\n\n        <p>This is some additional paragraph placeholder content. It's a slightly shorter version of the other highly repetitive body text used throughout.</p>\n      </article>\n\n      <article class=\"blog-post\">\n        <h2 class=\"display-5 link-body-emphasis mb-1\">New feature</h2>\n        <p class=\"blog-post-meta\">December 14, 2020 by <a href=\"#\">Chris</a></p>\n\n        <p>This is some additional paragraph placeholder content. It has been written to fill the available space and show how a longer snippet of text affects the surrounding content. We'll repeat it often to keep the demonstration flowing, so be on the lookout for this exact same string of text.</p>\n        <ul>\n          <li>First list item</li>\n          <li>Second list item with a longer description</li>\n          <li>Third list item to close it out</li>\n        </ul>\n        <p>This is some additional paragraph placeholder content. It's a slightly shorter version of the other highly repetitive body text used throughout.</p>\n      </article>\n\n      <nav class=\"blog-pagination\" aria-label=\"Pagination\">\n        <a class=\"btn btn-outline-primary rounded-pill\" href=\"#\">Older</a>\n        <a class=\"btn btn-outline-secondary rounded-pill disabled\" aria-disabled=\"true\">Newer</a>\n      </nav>\n\n    </div>\n\n    <div class=\"col-md-4\">\n      <div class=\"position-sticky\" style=\"top: 2rem;\">\n        <div class=\"p-4 mb-3 bg-body-tertiary rounded\">\n          <h4 class=\"fst-italic\">About</h4>\n          <p class=\"mb-0\">Customize this section to tell your visitors a little bit about your publication, writers, content, or something else entirely. Totally up to you.</p>\n        </div>\n\n        <div>\n          <h4 class=\"fst-italic\">Recent posts</h4>\n          <ul class=\"list-unstyled\">\n            <li>\n              <a class=\"d-flex flex-column flex-lg-row gap-3 align-items-start align-items-lg-center py-3 link-body-emphasis text-decoration-none border-top\" href=\"#\">\n                <Placeholder width=\"100%\" height=\"96\" background=\"#777\" color=\"#777\" text={false} title={false} />\n                <div class=\"col-lg-8\">\n                  <h6 class=\"mb-0\">Example blog post title</h6>\n                  <small class=\"text-body-secondary\">January 15, 2024</small>\n                </div>\n              </a>\n            </li>\n            <li>\n              <a class=\"d-flex flex-column flex-lg-row gap-3 align-items-start align-items-lg-center py-3 link-body-emphasis text-decoration-none border-top\" href=\"#\">\n                <Placeholder width=\"100%\" height=\"96\" background=\"#777\" color=\"#777\" text={false} title={false} />\n                <div class=\"col-lg-8\">\n                  <h6 class=\"mb-0\">This is another blog post title</h6>\n                  <small class=\"text-body-secondary\">January 14, 2024</small>\n                </div>\n              </a>\n            </li>\n            <li>\n              <a class=\"d-flex flex-column flex-lg-row gap-3 align-items-start align-items-lg-center py-3 link-body-emphasis text-decoration-none border-top\" href=\"#\">\n                <Placeholder width=\"100%\" height=\"96\" background=\"#777\" color=\"#777\" text={false} title={false} />\n                <div class=\"col-lg-8\">\n                  <h6 class=\"mb-0\">Longer blog post title: This one has multiple lines!</h6>\n                  <small class=\"text-body-secondary\">January 13, 2024</small>\n                </div>\n              </a>\n            </li>\n          </ul>\n        </div>\n\n        <div class=\"p-4\">\n          <h4 class=\"fst-italic\">Archives</h4>\n          <ol class=\"list-unstyled mb-0\">\n            <li><a href=\"#\">March 2021</a></li>\n            <li><a href=\"#\">February 2021</a></li>\n            <li><a href=\"#\">January 2021</a></li>\n            <li><a href=\"#\">December 2020</a></li>\n            <li><a href=\"#\">November 2020</a></li>\n            <li><a href=\"#\">October 2020</a></li>\n            <li><a href=\"#\">September 2020</a></li>\n            <li><a href=\"#\">August 2020</a></li>\n            <li><a href=\"#\">July 2020</a></li>\n            <li><a href=\"#\">June 2020</a></li>\n            <li><a href=\"#\">May 2020</a></li>\n            <li><a href=\"#\">April 2020</a></li>\n          </ol>\n        </div>\n\n        <div class=\"p-4\">\n          <h4 class=\"fst-italic\">Elsewhere</h4>\n          <ol class=\"list-unstyled\">\n            <li><a href=\"#\">GitHub</a></li>\n            <li><a href=\"#\">Social</a></li>\n            <li><a href=\"#\">Facebook</a></li>\n          </ol>\n        </div>\n      </div>\n    </div>\n  </div>\n\n</main>\n\n<footer class=\"py-5 text-center text-body-secondary bg-body-tertiary\">\n  <p>Blog template built for <a href=\"https://getbootstrap.com/\">Bootstrap</a> by <a href=\"https://x.com/mdo\">@mdo</a>.</p>\n  <p class=\"mb-0\">\n    <a href=\"#\">Back to top</a>\n  </p>\n</footer>\n"
  },
  {
    "path": "site/src/assets/examples/blog-rtl/index.astro",
    "content": "---\nexport const title = 'قالب المدونة'\nexport const direction = 'rtl'\nexport const extra_css = ['https://fonts.googleapis.com/css?family=Amiri:wght@400;700&display=swap', '../blog/blog.rtl.css']\nimport Placeholder from \"@shortcodes/Placeholder.astro\"\n---\n\n<svg xmlns=\"http://www.w3.org/2000/svg\" class=\"d-none\">\n  <symbol id=\"aperture\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" viewBox=\"0 0 24 24\">\n    <circle cx=\"12\" cy=\"12\" r=\"10\"/>\n    <path d=\"M14.31 8l5.74 9.94M9.69 8h11.48M7.38 12l5.74-9.94M9.69 16L3.95 6.06M14.31 16H2.83m13.79-4l-5.74 9.94\"/>\n  </symbol>\n  <symbol id=\"cart\" viewBox=\"0 0 16 16\">\n    <path d=\"M0 1.5A.5.5 0 0 1 .5 1H2a.5.5 0 0 1 .485.379L2.89 3H14.5a.5.5 0 0 1 .49.598l-1 5a.5.5 0 0 1-.465.401l-9.397.472L4.415 11H13a.5.5 0 0 1 0 1H4a.5.5 0 0 1-.491-.408L2.01 3.607 1.61 2H.5a.5.5 0 0 1-.5-.5zM3.102 4l.84 4.479 9.144-.459L13.89 4H3.102zM5 12a2 2 0 1 0 0 4 2 2 0 0 0 0-4zm7 0a2 2 0 1 0 0 4 2 2 0 0 0 0-4zm-7 1a1 1 0 1 1 0 2 1 1 0 0 1 0-2zm7 0a1 1 0 1 1 0 2 1 1 0 0 1 0-2z\"/>\n  </symbol>\n  <symbol id=\"chevron-right\" viewBox=\"0 0 16 16\">\n    <path fill-rule=\"evenodd\" d=\"M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z\"/>\n  </symbol>\n</svg>\n\n<div class=\"container\">\n  <header class=\"border-bottom lh-1 py-3\">\n    <div class=\"row flex-nowrap justify-content-between align-items-center\">\n      <div class=\"col-4 pt-1\">\n        <a class=\"link-secondary\" href=\"#\">الإشتراك في النشرة البريدية</a>\n      </div>\n      <div class=\"col-4 text-center\">\n        <a class=\"blog-header-logo text-body-emphasis text-decoration-none\" href=\"#\">كبير</a>\n      </div>\n      <div class=\"col-4 d-flex justify-content-end align-items-center\">\n        <a class=\"link-secondary\" href=\"#\" aria-label=\"بحث\">\n          <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" class=\"mx-3\" role=\"img\" viewBox=\"0 0 24 24\"><title>بحث</title><circle cx=\"10.5\" cy=\"10.5\" r=\"7.5\"/><path d=\"M21 21l-5.2-5.2\"/></svg>\n        </a>\n        <a class=\"btn btn-sm btn-outline-secondary\" href=\"#\">إنشاء حساب</a>\n      </div>\n    </div>\n  </header>\n\n  <div class=\"nav-scroller py-1 mb-3 border-bottom\">\n    <nav class=\"nav nav-underline justify-content-between\">\n      <a class=\"nav-item nav-link link-body-emphasis active\" href=\"#\">العالم</a>\n      <a class=\"nav-item nav-link link-body-emphasis\" href=\"#\">الولايات المتحدة</a>\n      <a class=\"nav-item nav-link link-body-emphasis\" href=\"#\">التقنية</a>\n      <a class=\"nav-item nav-link link-body-emphasis\" href=\"#\">التصميم</a>\n      <a class=\"nav-item nav-link link-body-emphasis\" href=\"#\">الحضارة</a>\n      <a class=\"nav-item nav-link link-body-emphasis\" href=\"#\">المال والأعمال</a>\n      <a class=\"nav-item nav-link link-body-emphasis\" href=\"#\">السياسة</a>\n      <a class=\"nav-item nav-link link-body-emphasis\" href=\"#\">الرأي العام</a>\n      <a class=\"nav-item nav-link link-body-emphasis\" href=\"#\">العلوم</a>\n      <a class=\"nav-item nav-link link-body-emphasis\" href=\"#\">الصحة</a>\n      <a class=\"nav-item nav-link link-body-emphasis\" href=\"#\">الموضة</a>\n      <a class=\"nav-item nav-link link-body-emphasis\" href=\"#\">السفر</a>\n    </nav>\n  </div>\n</div>\n\n<main class=\"container\">\n  <div class=\"p-4 p-md-5 mb-4 rounded text-body-emphasis bg-body-secondary\">\n    <div class=\"col-lg-6 px-0\">\n      <h1 class=\"display-4 fst-italic\">عنوان تدوينة مميزة أطول</h1>\n      <p class=\"lead my-3\">عدة أسطر نصية متعددة تعبر عن التدوية، وذلك لإعلام القراء الجدد بسرعة وكفاءة حول أكثر الأشياء إثارة للاهتمام في محتويات هذه التدوينة.</p>\n      <p class=\"lead mb-0\"><a href=\"#\" class=\"text-body-emphasis fw-bold\">أكمل القراءة...</a></p>\n    </div>\n  </div>\n\n  <div class=\"row mb-2\">\n    <div class=\"col-md-6\">\n      <div class=\"row g-0 border rounded overflow-hidden flex-md-row mb-4 shadow-sm h-md-250 position-relative\">\n        <div class=\"col p-4 d-flex flex-column position-static\">\n          <strong class=\"d-inline-block mb-2 text-primary-emphasis\">العالم</strong>\n          <h3 class=\"mb-0\">مشاركة مميزة</h3>\n          <div class=\"mb-1 text-body-secondary\">نوفمبر 12</div>\n          <p class=\"card-text mb-auto\">هذه بطاقة أوسع مع نص داعم أدناه كمقدمة طبيعية لمحتوى إضافي.</p>\n          <a href=\"#\" class=\"icon-link gap-1 icon-link-hover stretched-link\">\n            أكمل القراءة\n            <svg class=\"bi\" aria-hidden=\"true\"><use xlink:href=\"#chevron-right\"/></svg>\n          </a>\n        </div>\n        <div class=\"col-auto d-none d-lg-block\">\n          <Placeholder width=\"200\" height=\"250\" background=\"#55595c\" color=\"#eceeef\" text=\"صورة مصغرة\" />\n        </div>\n      </div>\n    </div>\n    <div class=\"col-md-6\">\n      <div class=\"row g-0 border rounded overflow-hidden flex-md-row mb-4 shadow-sm h-md-250 position-relative\">\n        <div class=\"col p-4 d-flex flex-column position-static\">\n          <strong class=\"d-inline-block mb-2 text-success-emphasis\">التصميم</strong>\n          <h3 class=\"mb-0\">عنوان الوظيفة</h3>\n          <div class=\"mb-1 text-body-secondary\">نوفمبر 11</div>\n          <p class=\"mb-auto\">هذه بطاقة أوسع مع نص داعم أدناه كمقدمة طبيعية لمحتوى إضافي.</p>\n          <a href=\"#\" class=\"icon-link gap-1 icon-link-hover stretched-link\">\n            أكمل القراءة\n            <svg class=\"bi\" aria-hidden=\"true\"><use xlink:href=\"#chevron-right\"/></svg>\n          </a>\n        </div>\n        <div class=\"col-auto d-none d-lg-block\">\n          <Placeholder width=\"200\" height=\"250\" background=\"#55595c\" color=\"#eceeef\" text=\"صورة مصغرة\" />\n        </div>\n      </div>\n    </div>\n  </div>\n\n  <div class=\"row g-5\">\n    <div class=\"col-md-8\">\n      <h3 class=\"pb-4 mb-4 fst-italic border-bottom\">\n        من Firehose\n      </h3>\n\n      <article class=\"blog-post\">\n        <h2 class=\"display-5 link-body-emphasis mb-1\">مثال على تدوينة</h2>\n        <p class=\"blog-post-meta\">1 يناير 2021 بواسطة <a href=\"#\"> Mark </a></p>\n\n        <p>تعرض مشاركة المدونة هذه بضعة أنواع مختلفة من المحتوى الذي يتم دعمه وتصميمه باستخدام Bootstrap. النصوص الأساسية، الصور، والأكواد مدعومة بشكل كامل.</p>\n        <hr>\n        <p>يشكِّل تأمين الغذاء في المستقبل قضية تؤرِّق حكومات العالَم والعلماء على حدٍّ سواء. فخلال القرن العشرين ازداد عدد سكان الأرض أربعة أضعاف، وتشير التقديرات إلى أن العدد سوف يصل إلى عشرة مليارات إنسان بحلول عام 2050م. وسوف تمثل هذه الزيادة الهائلة تحدياً كبيراً وضغطاً متصاعداً على قدرة الإنتاج الزراعي. الأمر الذي كان ولا بد من أن يدفع إلى تطوير تقنيات مبتكرة في تصنيع الغذاء غير الزراعة، منها تقنية مستقبلية تقوم على تصنيع الغذاء من الهواء.</p>\n        <blockquote class=\"blockquote\">\n          <p>تشغل الزراعة مساحات كبيرة من اليابسة، وتستهلك كميات هائلة من المياه، كما أن إنتاج الغذاء بواسطة الزراعة يسهم بنسبة عالية من انبعاثات غازات الاحتباس الحراري العالمية</p>\n        </blockquote>\n        <p>تشغل الزراعة مساحات كبيرة من اليابسة، وتستهلك كميات هائلة من المياه. كما أن إنتاج الغذاء بواسطة الزراعة يسهم بنسبة عالية من انبعاثات غازات الاحتباس الحراري العالمية، وللمقارنة فإن هذه النسبة من الانبعاثات هي أكبر مما ينتجه قطاع النقل بكل ما فيه من سيارات وشاحنات وطائرات وقطارات.</p>\n        <h2>عنوان</h2>\n        <p>تحصل النباتات على غذائها بواسطة عملية تسمى البناء الضوئي، حيث تقوم النباتات بتحويل ضوء الشمس والماء وثاني أكسيد الكربون الموجود في الغلاف الجوي إلى غذاء وتطلق الأكسجين كمنتج ثانوي لهذا التفاعل الكيميائي. وتحدث هذه العملية في \"البلاستيدات الخضراء\". فالنباتات تستفيد من طاقة ضوء الشمس في تقسيم الماء إلى هيدروجين وأكسجين، وتحدث تفاعلات كيميائية أخرى ينتج عنها سكر الجلكوز الذي تستخدمه كمصدر للغذاء وينطلق الأكسجين من النباتات إلى الغلاف الجوي. وهذا يعني أن النباتات تحوِّل ثاني أكسيد الكربون إلى غذاء من خلال تفاعلات كيميائية معقَّدة. ويُعد البناء الضوئي من أهم التفاعلات الكيميائية على كوكب الأرض، فقد ساعد في الماضي على تطوُّر كوكبنا وظهور الحياة عليه. فالنباتات تستخدم ثاني أكسيد الكربون لصنع غذائها، وتطلق الأكسجين لتساعد الكائنات الأخرى على التنفس!</p>\n        <h3>عنوان فرعي</h3>\n        <p>ألهمت هذه العملية علماء وكالة الفضاء الأمريكية (ناسا) خلال الستينيات من القرن الماضي، لبحث فكرة إطعام روَّاد الفضاء في مهمات الفضاء الطويلة مثل السفر إلى المريخ. وكانت واحدة من الأفكار الواعدة تصنيع الغذاء عن طريق ثاني أكسيد الكربون الذي ينتجه روَّاد الفضاء، لكن ليس بواسطة النباتات بل عن طريق ميكروبات صغيرة وحيدة الخلية قادرة على حصد ثاني أكسيد الكربون لإنتاج كميات وفيرة من البروتين المغذي على شكل مسحوق عديم النكهة، كما يمكن استخدام المادة في صنع الأطعمة المألوفة لدينا.</p>\n        <pre><code>Example code block</code></pre>\n        <p>وخلافاً لما هو الحال في عالم النبات، فإن هذه الميكروبات لا تستخدم الضوء كما يحدث في عملية البناء الضوئي التي تستخدمها النباتات للحصول على الغذاء، أي لأنها قادرة على النمو في الظلام. تسمى هذه البكتريا \"هيدروجينوتروف\" (Hydrogenotrophs)، وهي تستخدم الهيدروجين كوقود لإنتاج الغذاء من ثاني أكسيد الكربون. فعندما يُنتج روَّاد الفضاء ثاني أكسيد الكربون، تلتقطه الميكروبات، ويتحوَّل مع مدخلات أخرى إلى غذاء غني بالكربون. وبهذه الطريقة سوف نحصل على دورة كربون مغلقة الحلقة.</p>\n        <h3>عنوان فرعي</h3>\n        <p>بعد مرور أكثر من نصف قرن على أبحاث ناسا، تعمل حالياً عدة شركات في قطاع البيولوجيا التركيبية من ضمنها إير بروتين (Air Protein) وسولار فودز (Solar Foods) على تطوير جيل جديد من المنتجات الغذائية المستدامة، من دون وجود بصمة كربونية. ولن تقتصر هذه المنتجات الغذائية على روَّاد الفضاء فحسب، بل سوف تمتد لتشمل جميع سكان الأرض، وسوف تُنتَج في فترة زمنية قصيرة، بدلاً من الشهور، ومن دون الاعتماد على الأراضي الزراعية. وهذا يعني الحصول على منتجات غذائية بشكل سريع جداً. كما سيصبح من الممكن تصنيع الغذاء بطريقة عمودية من خلال هذه الميكروبات، بدلاً من الطريقة الأفقية التقليدية الشبيهة بتقنية الزراعة العمودية الحديثة. وهذا يعني توفير منتجات غذائية أكبر من المساحة نفسها.</p>\n        <p>يتكوَّن الغذاء البشري من ثلاثة أنواع رئيسة، هي:</p>\n        <ul>\n          <li>البروتينات</li>\n          <li>الكربوهيدرات</li>\n          <li>الدهون</li>\n        </ul>\n        <p>وتتكوَّن البروتينات من الأحماض الأمينية، وهي مجموعة من المركبات العضوية يبلغ عددها في جسم الإنسان عشرين حمضاً أمينياً، من بينها تسعة أساسية يحصل عليها الجسم من الغذاء. وتتكوَّن الأحماض الأمينية بشكل أساس من:</p>\n        <ol>\n          <li>الكربون</li>\n          <li>الهيدروجين</li>\n          <li>الأكسجين</li>\n          <li>النيتروجين</li>\n        </ol>\n        <p>ومن الملاحظ أن النيتروجين يشكِّل نسبة %78 من الهواء، كما أن الهيدروجين نحصل عليه من خلال التحليل الكهربائي للماء، ومن الممكن نظرياً سحب الكربون من الهواء لتشكيل هذه الأحماض، ذلك أن الكربون هو العمود الفقري للأحماض الأمينية، كما أن الحياة على كوكب الأرض قائمة على الكربون لقدرته على تكوين سلاسل كربونية طويلة، وهذا ما تفعله الميكروبات بتصنيع أحماض أمينية من ثاني أكسيد الكربون من خلال مجموعة من التفاعلات الكيميائية المعقَّدة. وإضافة إلى صنع وجبات غنية بالبروتين، فهذه الميكروبات تنتج منتجات أخرى مثل الزيوت التي لها عديد من الاستخدامات.</p>\n      </article>\n\n      <article class=\"blog-post\">\n        <h2 class=\"display-5 link-body-emphasis mb-1\">تدوينة أخرى</h2>\n        <p class=\"blog-post-meta\">23 ديسمبر 2020 بواسطة <a href=\"#\">Jacob</a></p>\n\n        <p>في الوقت الحالي، تدرس عدَّة شركات هذه الميكروبات بشكل أعمق، وتستزرعها من أجل الحصول على الغذاء. ففي عام 2019م، أعلن باحثون في شركة (Air Protein) الأمريكية نجاحهم في تحويل ثاني أكسيد الكربون الموجود في الهواء إلى لحوم صناعية مصنوعة من البروتين، التي لا تتطلَّب أي أرض زراعية، بل هي معتمدة بشكل أساسي على الهواء.</p>\n        <blockquote>\n          <p>تم تصنيع اللحوم بأنواع عديدة</p>\n        </blockquote>\n        <p>إذ استخدم هؤلاء الباحثون الهواء والطاقة المتجدِّدة كمدخلات في عملية مشابهة للتخمير، لإنتاج بروتين يحتوي على الأحماض الأمينية التسعة الأساسية وغني بالفيتامينات والمعادن، كما أنه خالٍ من الهرمونات والمضادات الحيوية والمبيدات الحشرية ومبيدات الأعشاب.</p>\n        <p> وتم تصنيع اللحوم بأنواع عديدة بما فيها الدواجن والأبقار والمأكولات البحرية، من دون حصول انبعاثات كربونية، على عكس تربية الأبقار التي تسهم في انبعاث غاز الميثان أحد غازات الاحتباس الحراري.</p>\n      </article>\n\n      <article class=\"blog-post\">\n        <h2 class=\"display-5 link-body-emphasis mb-1\">ميزة جديدة</h2>\n        <p class=\"blog-post-meta\">14 ديسمبر 2020 بواسطة <a href=\"#\">Jacob</a></p>\n\n        <p>كما أن الشركة الفنلندية (Solar Foods) طوَّرت تقنية لإنتاج البروتين من الهواء، حيث تبدأ العملية بتقسيم الماء إلى مكوناته الهيدروجين والأكسجين عن طريق الكهرباء. فالهيدروجين يوفِّر الطاقة للبكتريا لتحويل ثاني أكسيد الكربون والنيتروجين الموجودين في الهواء إلى مادة عضوية غنية بالبروتين بشكل أكفأ من نمو النباتات باستخدام البناء الضوئي. وهذا البروتين يشبه دقيق القمح وقد أطلق عليه اسم \"سولين\" (Solein).</p>\n        <p>وتقوم الشركة حالياً بجمع البيانات حول المنتج الغذائي لتقديمه إلى الاتحاد الأوروبي بهدف الحصول على ترخيص غذائي، كما أنها تخطط لبدء الإنتاج التجاري في العام المقبل 2021م. وقد أوضحت الشركة أنها مهتمة بإنتاج أطعمة صديقة للبيئة من خلال استخدام المواد الأساسية: الكهرباء وثاني أكسيد الكربون، وهذه الأطعمة سوف تجنبنا الأثر السلبي البيئي للزراعة التقليدية الذي يشمل كل شيء من استخدام الأرض والمياه إلى الانبعاثات الناتجة من تسميد المحاصيل أو تربية الحيوانات.</p>\n        <p>وعلى هذا، فإن البروتينات المشتقة من الميكروبات سوف:</p>\n        <ul>\n          <li>توفر حلاً ممكناً في ظل زيادة الطلب العالمي المستقبلي على الغذاء</li>\n          <li>تتوسع مصانع الغذاء في المستقبل لتكون أكفأ وأكثر استدامة</li>\n          <li>تصبح قادرة على توفير الغذاء لروَّاد الفضاء في سفرهم إلى المريخ وجميع سكان كوكب الأرض في عام 2050م</li>\n        </ul>\n        <p>فتخيّل أن الميكروبات ستكون مصانع المستقبل، وأن غذاء المستقبل سيكون مصنوعاً من الهواء! وأن عام 2050م سيكون مختلفاً تماماً عن عالمنا اليوم. فهو عالم من دون زراعة ولا تربية حيوانات من أجل الغذاء! قد يبدو ذلك خيالياً لكنه ليس مستحيلاً!</p>\n      </article>\n\n      <nav class=\"blog-pagination\" aria-label=\"Pagination\">\n        <a class=\"btn btn-outline-primary rounded-pill\" href=\"#\">تدوينات أقدم</a>\n        <a class=\"btn btn-outline-secondary rounded-pill disabled\" aria-disabled=\"true\">تدوينات أحدث</a>\n      </nav>\n\n    </div>\n\n    <div class=\"col-md-4\">\n      <div class=\"position-sticky\" style=\"top: 2rem;\">\n        <div class=\"p-4 mb-3 bg-body-tertiary rounded\">\n          <h4 class=\"fst-italic\">حول</h4>\n          <p class=\"mb-0\">أقبلت، فأقبلت معك الحياة بجميع صنوفها وألوانها: فالنبات ينبت، والأشجار تورق وتزهر، والهرة تموء، والقمري يسجع، والغنم يثغو، والبقر يخور، وكل أليف يدعو أليفه. كل شيء يشعر بالحياة وينسي هموم الحياة، ولا يذكر إلا سعادة الحياة، فإن كان الزمان جسدا فأنت روحه، وإن كان عمرا فأنت شبابه.</p>\n        </div>\n\n        <div>\n          <h4 class=\"fst-italic\">المشاركات الاخيرة</h4>\n          <ul class=\"list-unstyled\">\n            <li>\n              <a class=\"d-flex flex-column flex-lg-row gap-3 align-items-start align-items-lg-center py-3 link-body-emphasis text-decoration-none border-top\" href=\"#\">\n                <Placeholder width=\"100%\" height=\"96\" background=\"#777\" color=\"#777\" text={false} title={false} />\n                <div class=\"col-lg-8\">\n                  <h6 class=\"mb-0\">مثال على عنوان منشور المدونة</h6>\n                  <small class=\"text-body-secondary\">15 يناير 2024</small>\n                </div>\n              </a>\n            </li>\n            <li>\n              <a class=\"d-flex flex-column flex-lg-row gap-3 align-items-start align-items-lg-center py-3 link-body-emphasis text-decoration-none border-top\" href=\"#\">\n                <Placeholder width=\"100%\" height=\"96\" background=\"#777\" color=\"#777\" text={false} title={false} />\n                <div class=\"col-lg-8\">\n                  <h6 class=\"mb-0\">هذا عنوان آخر للمدونة</h6>\n                  <small class=\"text-body-secondary\">14 يناير 2024</small>\n                </div>\n              </a>\n            </li>\n            <li>\n              <a class=\"d-flex flex-column flex-lg-row gap-3 align-items-start align-items-lg-center py-3 link-body-emphasis text-decoration-none border-top\" href=\"#\">\n                <Placeholder width=\"100%\" height=\"96\" background=\"#777\" color=\"#777\" text={false} title={false} />\n                <div class=\"col-lg-8\">\n                  <h6 class=\"mb-0\">أطول عنوان منشور للمدونة: يحتوي هذا الخط على عدة أسطر!</h6>\n                  <small class=\"text-body-secondary\">13 يناير 2024</small>\n                </div>\n              </a>\n            </li>\n          </ul>\n        </div>\n\n        <div class=\"p-4\">\n          <h4 class=\"fst-italic\">الأرشيف</h4>\n          <ol class=\"list-unstyled mb-0\">\n            <li><a href=\"#\">مارس 2021</a></li>\n            <li><a href=\"#\">شباط 2021</a></li>\n            <li><a href=\"#\">يناير 2021</a></li>\n            <li><a href=\"#\">ديسمبر 2020</a></li>\n            <li><a href=\"#\">نوفمبر 2020</a></li>\n            <li><a href=\"#\">أكتوبر 2020</a></li>\n            <li><a href=\"#\">سبتمبر 2020</a></li>\n            <li><a href=\"#\">اغسطس 2020</a></li>\n            <li><a href=\"#\">يوليو 2020</a></li>\n            <li><a href=\"#\">يونيو 2020</a></li>\n            <li><a href=\"#\">مايو 2020</a></li>\n            <li><a href=\"#\">ابريل 2020</a></li>\n          </ol>\n        </div>\n\n        <div class=\"p-4\">\n          <h4 class=\"fst-italic\">في مكان آخر</h4>\n          <ol class=\"list-unstyled\">\n            <li><a href=\"#\">GitHub</a></li>\n            <li><a href=\"#\">Social</a></li>\n            <li><a href=\"#\">Facebook</a></li>\n          </ol>\n        </div>\n      </div>\n    </div>\n  </div>\n\n</main>\n\n<footer class=\"py-5 text-center text-body-secondary bg-body-tertiary\">\n  <p>تم تصميم نموذج المدونة لـ <a href=\"https://getbootstrap.com/\">Bootstrap</a> بواسطة <a href=\"https://x.com/mdo\"><bdi lang=\"en\" dir=\"ltr\">@mdo</bdi></a>.</p>\n  <p class=\"mb-0\">\n    <a href=\"#\">عد إلى الأعلى</a>\n  </p>\n</footer>\n"
  },
  {
    "path": "site/src/assets/examples/breadcrumbs/breadcrumbs.css",
    "content": ".breadcrumb-chevron {\n  --bs-breadcrumb-divider: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='%236c757d'%3E%3Cpath fill-rule='evenodd' d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3E%3C/svg%3E\");\n  gap: .5rem;\n}\n.breadcrumb-chevron .breadcrumb-item {\n  display: flex;\n  gap: inherit;\n  align-items: center;\n  padding-left: 0;\n  line-height: 1;\n}\n.breadcrumb-chevron .breadcrumb-item::before {\n  gap: inherit;\n  float: none;\n  width: 1rem;\n  height: 1rem;\n}\n\n.breadcrumb-custom .breadcrumb-item {\n  position: relative;\n  flex-grow: 1;\n  padding: .75rem 3rem;\n}\n.breadcrumb-custom .breadcrumb-item::before {\n  display: none;\n}\n.breadcrumb-custom .breadcrumb-item::after {\n  position: absolute;\n  top: 50%;\n  right: -25px;\n  z-index: 1;\n  display: inline-block;\n  width: 50px;\n  height: 50px;\n  margin-top: -25px;\n  content: \"\";\n  background-color: var(--bs-tertiary-bg);\n  border-top-right-radius: .5rem;\n  box-shadow: 1px -1px var(--bs-border-color);\n  transform: scale(.707) rotate(45deg);\n}\n.breadcrumb-custom .breadcrumb-item:first-child {\n  padding-left: 1.5rem;\n}\n.breadcrumb-custom .breadcrumb-item:last-child {\n  padding-right: 1.5rem;\n}\n.breadcrumb-custom .breadcrumb-item:last-child::after {\n  display: none;\n}\n"
  },
  {
    "path": "site/src/assets/examples/breadcrumbs/index.astro",
    "content": "---\nexport const title = 'Breadcrumbs'\nexport const extra_css = ['breadcrumbs.css']\n---\n\n<svg xmlns=\"http://www.w3.org/2000/svg\" class=\"d-none\">\n  <symbol id=\"house-door-fill\" viewBox=\"0 0 16 16\">\n    <path d=\"M6.5 14.5v-3.505c0-.245.25-.495.5-.495h2c.25 0 .5.25.5.5v3.5a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5v-7a.5.5 0 0 0-.146-.354L13 5.793V2.5a.5.5 0 0 0-.5-.5h-1a.5.5 0 0 0-.5.5v1.293L8.354 1.146a.5.5 0 0 0-.708 0l-6 6A.5.5 0 0 0 1.5 7.5v7a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5z\"/>\n  </symbol>\n</svg>\n\n<div class=\"container my-5\">\n  <nav aria-label=\"breadcrumb\">\n    <ol class=\"breadcrumb p-3 bg-body-tertiary rounded-3\">\n      <li class=\"breadcrumb-item\"><a href=\"#\">Home</a></li>\n      <li class=\"breadcrumb-item\"><a href=\"#\">Library</a></li>\n      <li class=\"breadcrumb-item active\" aria-current=\"page\">Data</li>\n    </ol>\n  </nav>\n</div>\n\n<div class=\"b-example-divider\"></div>\n\n<div class=\"container my-5\">\n  <nav aria-label=\"breadcrumb\">\n    <ol class=\"breadcrumb p-3 bg-body-tertiary rounded-3\">\n      <li class=\"breadcrumb-item\">\n        <a class=\"link-body-emphasis\" href=\"#\">\n          <svg class=\"bi\" width=\"16\" height=\"16\" aria-hidden=\"true\"><use xlink:href=\"#house-door-fill\"></use></svg>\n          <span class=\"visually-hidden\">Home</span>\n        </a>\n      </li>\n      <li class=\"breadcrumb-item\">\n        <a class=\"link-body-emphasis fw-semibold text-decoration-none\" href=\"#\">Library</a>\n      </li>\n      <li class=\"breadcrumb-item active\" aria-current=\"page\">\n        Data\n      </li>\n    </ol>\n  </nav>\n</div>\n\n<div class=\"b-example-divider\"></div>\n\n<div class=\"container my-5\">\n  <nav aria-label=\"breadcrumb\">\n    <ol class=\"breadcrumb breadcrumb-chevron p-3 bg-body-tertiary rounded-3\">\n      <li class=\"breadcrumb-item\">\n        <a class=\"link-body-emphasis\" href=\"#\">\n          <svg class=\"bi\" width=\"16\" height=\"16\" aria-hidden=\"true\"><use xlink:href=\"#house-door-fill\"></use></svg>\n          <span class=\"visually-hidden\">Home</span>\n        </a>\n      </li>\n      <li class=\"breadcrumb-item\">\n        <a class=\"link-body-emphasis fw-semibold text-decoration-none\" href=\"#\">Library</a>\n      </li>\n      <li class=\"breadcrumb-item active\" aria-current=\"page\">\n        Data\n      </li>\n    </ol>\n  </nav>\n</div>\n\n<div class=\"b-example-divider\"></div>\n\n<div class=\"container my-5\">\n  <nav aria-label=\"breadcrumb\">\n    <ol class=\"breadcrumb breadcrumb-custom overflow-hidden text-center bg-body-tertiary border rounded-3\">\n      <li class=\"breadcrumb-item\">\n        <a class=\"link-body-emphasis fw-semibold text-decoration-none\" href=\"#\">\n          <svg class=\"bi\" width=\"16\" height=\"16\" aria-hidden=\"true\"><use xlink:href=\"#house-door-fill\"></use></svg>\n          Home\n        </a>\n      </li>\n      <li class=\"breadcrumb-item\">\n        <a class=\"link-body-emphasis fw-semibold text-decoration-none\" href=\"#\">Library</a>\n      </li>\n      <li class=\"breadcrumb-item active\" aria-current=\"page\">\n        Data\n      </li>\n    </ol>\n  </nav>\n</div>\n\n<div class=\"b-example-divider\"></div>\n"
  },
  {
    "path": "site/src/assets/examples/buttons/index.astro",
    "content": "---\nexport const title = 'Buttons'\n---\n\n<svg xmlns=\"http://www.w3.org/2000/svg\" class=\"d-none\">\n  <symbol id=\"arrow-right-short\" viewBox=\"0 0 16 16\">\n    <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 8z\"/>\n  </symbol>\n  <symbol id=\"x-lg\" viewBox=\"0 0 16 16\">\n    <path fill-rule=\"evenodd\" d=\"M13.854 2.146a.5.5 0 0 1 0 .708l-11 11a.5.5 0 0 1-.708-.708l11-11a.5.5 0 0 1 .708 0Z\"/>\n    <path fill-rule=\"evenodd\" d=\"M2.146 2.146a.5.5 0 0 0 0 .708l11 11a.5.5 0 0 0 .708-.708l-11-11a.5.5 0 0 0-.708 0Z\"/>\n  </symbol>\n</svg>\n\n<div class=\"d-flex gap-2 justify-content-center py-5\">\n  <button class=\"btn btn-primary rounded-pill px-3\" type=\"button\">Primary</button>\n  <button class=\"btn btn-secondary rounded-pill px-3\" type=\"button\">Secondary</button>\n  <button class=\"btn btn-success rounded-pill px-3\" type=\"button\">Success</button>\n  <button class=\"btn btn-danger rounded-pill px-3\" type=\"button\">Danger</button>\n  <button class=\"btn btn-warning rounded-pill px-3\" type=\"button\">Warning</button>\n  <button class=\"btn btn-info rounded-pill px-3\" type=\"button\">Info</button>\n  <button class=\"btn btn-light rounded-pill px-3\" type=\"button\">Light</button>\n  <button class=\"btn btn-dark rounded-pill px-3\" type=\"button\">Dark</button>\n  <button class=\"btn btn-link rounded-pill px-3\" type=\"button\">Link</button>\n</div>\n\n<div class=\"b-example-divider\"></div>\n\n<div class=\"col-lg-6 col-xxl-4 my-5 mx-auto\">\n  <div class=\"d-grid gap-2\">\n    <button class=\"btn btn-outline-secondary\" type=\"button\">Secondary action</button>\n    <button class=\"btn btn-primary\" type=\"button\">Primary action</button>\n  </div>\n</div>\n\n<div class=\"b-example-divider\"></div>\n\n<div class=\"d-flex gap-2 justify-content-center py-5\">\n  <button class=\"btn btn-primary d-inline-flex align-items-center\" type=\"button\">\n    Primary icon\n    <svg class=\"bi ms-1\" width=\"20\" height=\"20\" aria-hidden=\"true\"><use xlink:href=\"#arrow-right-short\"/></svg>\n  </button>\n  <button class=\"btn btn-outline-secondary d-inline-flex align-items-center\" type=\"button\">\n    Secondary icon\n    <svg class=\"bi ms-1\" width=\"20\" height=\"20\" aria-hidden=\"true\"><use xlink:href=\"#arrow-right-short\"/></svg>\n  </button>\n</div>\n\n<div class=\"b-example-divider\"></div>\n\n<div class=\"d-flex gap-2 justify-content-center py-5\">\n  <button class=\"btn btn-primary\" type=\"button\" disabled>\n    <span class=\"spinner-border spinner-border-sm\" aria-hidden=\"true\"></span>\n    <span class=\"visually-hidden\" role=\"status\">Loading...</span>\n  </button>\n  <button class=\"btn btn-primary\" type=\"button\" disabled>\n    <span class=\"spinner-border spinner-border-sm\" aria-hidden=\"true\"></span>\n    <span role=\"status\">Loading...</span>\n  </button>\n</div>\n\n<div class=\"b-example-divider\"></div>\n\n<div class=\"d-flex gap-2 justify-content-center pt-5 pb-4\">\n  <button class=\"btn btn-primary rounded-circle p-2 lh-1\" type=\"button\">\n    <svg class=\"bi\" width=\"16\" height=\"16\" aria-hidden=\"true\"><use xlink:href=\"#x-lg\"/></svg>\n    <span class=\"visually-hidden\">Dismiss</span>\n  </button>\n  <button class=\"btn btn-outline-primary rounded-circle p-2 lh-1\" type=\"button\">\n    <svg class=\"bi\" width=\"16\" height=\"16\" aria-hidden=\"true\"><use xlink:href=\"#x-lg\"/></svg>\n    <span class=\"visually-hidden\">Dismiss</span>\n  </button>\n</div>\n\n<div class=\"d-flex gap-2 justify-content-center pb-5\">\n  <button class=\"btn btn-primary rounded-circle p-3 lh-1\" type=\"button\">\n    <svg class=\"bi\" width=\"24\" height=\"24\" aria-hidden=\"true\"><use xlink:href=\"#x-lg\"/></svg>\n    <span class=\"visually-hidden\">Dismiss</span>\n  </button>\n  <button class=\"btn btn-outline-primary rounded-circle p-3 lh-1\" type=\"button\">\n    <svg class=\"bi\" width=\"24\" height=\"24\" aria-hidden=\"true\"><use xlink:href=\"#x-lg\"/></svg>\n    <span class=\"visually-hidden\">Dismiss</span>\n  </button>\n</div>\n\n<div class=\"b-example-divider\"></div>\n"
  },
  {
    "path": "site/src/assets/examples/carousel/carousel.css",
    "content": "/* GLOBAL STYLES\n-------------------------------------------------- */\n/* Padding below the footer and lighter body text */\n\nbody {\n  padding-top: 3rem;\n  padding-bottom: 3rem;\n  color: rgb(var(--bs-tertiary-color-rgb));\n}\n\n\n/* CUSTOMIZE THE CAROUSEL\n-------------------------------------------------- */\n\n/* Carousel base class */\n.carousel {\n  margin-bottom: 4rem;\n}\n/* Since positioning the image, we need to help out the caption */\n.carousel-caption {\n  bottom: 3rem;\n  z-index: 10;\n}\n\n/* Declare heights because of positioning of img element */\n.carousel-item {\n  height: 32rem;\n}\n\n\n/* MARKETING CONTENT\n-------------------------------------------------- */\n\n/* Center align the text within the three columns below the carousel */\n.marketing .col-lg-4 {\n  margin-bottom: 1.5rem;\n  text-align: center;\n}\n/* rtl:begin:ignore */\n.marketing .col-lg-4 p {\n  margin-right: .75rem;\n  margin-left: .75rem;\n}\n/* rtl:end:ignore */\n\n\n/* Featurettes\n------------------------- */\n\n.featurette-divider {\n  margin: 5rem 0; /* Space out the Bootstrap <hr> more */\n}\n\n/* Thin out the marketing headings */\n/* rtl:begin:remove */\n.featurette-heading {\n  letter-spacing: -.05rem;\n}\n\n/* rtl:end:remove */\n\n/* RESPONSIVE CSS\n-------------------------------------------------- */\n\n@media (min-width: 40em) {\n  /* Bump up size of carousel content */\n  .carousel-caption p {\n    margin-bottom: 1.25rem;\n    font-size: 1.25rem;\n    line-height: 1.4;\n  }\n\n  .featurette-heading {\n    font-size: 50px;\n  }\n}\n\n@media (min-width: 62em) {\n  .featurette-heading {\n    margin-top: 7rem;\n  }\n}\n"
  },
  {
    "path": "site/src/assets/examples/carousel/carousel.rtl.css",
    "content": "/* GLOBAL STYLES\n-------------------------------------------------- */\n/* Padding below the footer and lighter body text */\n\nbody {\n  padding-top: 3rem;\n  padding-bottom: 3rem;\n  color: rgb(var(--bs-tertiary-color-rgb));\n}\n\n\n/* CUSTOMIZE THE CAROUSEL\n-------------------------------------------------- */\n\n/* Carousel base class */\n.carousel {\n  margin-bottom: 4rem;\n}\n/* Since positioning the image, we need to help out the caption */\n.carousel-caption {\n  bottom: 3rem;\n  z-index: 10;\n}\n\n/* Declare heights because of positioning of img element */\n.carousel-item {\n  height: 32rem;\n}\n\n\n/* MARKETING CONTENT\n-------------------------------------------------- */\n\n/* Center align the text within the three columns below the carousel */\n.marketing .col-lg-4 {\n  margin-bottom: 1.5rem;\n  text-align: center;\n}\n.marketing .col-lg-4 p {\n  margin-right: .75rem;\n  margin-left: .75rem;\n}\n\n\n/* Featurettes\n------------------------- */\n\n.featurette-divider {\n  margin: 5rem 0; /* Space out the Bootstrap <hr> more */\n}\n\n/* Thin out the marketing headings */\n\n/* RESPONSIVE CSS\n-------------------------------------------------- */\n\n@media (min-width: 40em) {\n  /* Bump up size of carousel content */\n  .carousel-caption p {\n    margin-bottom: 1.25rem;\n    font-size: 1.25rem;\n    line-height: 1.4;\n  }\n\n  .featurette-heading {\n    font-size: 50px;\n  }\n}\n\n@media (min-width: 62em) {\n  .featurette-heading {\n    margin-top: 7rem;\n  }\n}\n"
  },
  {
    "path": "site/src/assets/examples/carousel/index.astro",
    "content": "---\nexport const title = 'Carousel Template'\nexport const extra_css = ['carousel.css']\nimport Placeholder from \"@shortcodes/Placeholder.astro\"\n---\n\n<header data-bs-theme=\"dark\">\n  <nav class=\"navbar navbar-expand-md navbar-dark fixed-top bg-dark\">\n    <div class=\"container-fluid\">\n      <a class=\"navbar-brand\" href=\"#\">Carousel</a>\n      <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbarCollapse\" aria-controls=\"navbarCollapse\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n        <span class=\"navbar-toggler-icon\"></span>\n      </button>\n      <div class=\"collapse navbar-collapse\" id=\"navbarCollapse\">\n        <ul class=\"navbar-nav me-auto mb-2 mb-md-0\">\n          <li class=\"nav-item\">\n            <a class=\"nav-link active\" aria-current=\"page\" href=\"#\">Home</a>\n          </li>\n          <li class=\"nav-item\">\n            <a class=\"nav-link\" href=\"#\">Link</a>\n          </li>\n          <li class=\"nav-item\">\n            <a class=\"nav-link disabled\" aria-disabled=\"true\">Disabled</a>\n          </li>\n        </ul>\n        <form class=\"d-flex\" role=\"search\">\n          <input class=\"form-control me-2\" type=\"search\" placeholder=\"Search\" aria-label=\"Search\">\n          <button class=\"btn btn-outline-success\" type=\"submit\">Search</button>\n        </form>\n      </div>\n    </div>\n  </nav>\n</header>\n\n<main>\n\n  <div id=\"myCarousel\" class=\"carousel slide mb-6\" data-bs-ride=\"carousel\">\n    <div class=\"carousel-indicators\">\n      <button type=\"button\" data-bs-target=\"#myCarousel\" data-bs-slide-to=\"0\" class=\"active\" aria-current=\"true\" aria-label=\"Slide 1\"></button>\n      <button type=\"button\" data-bs-target=\"#myCarousel\" data-bs-slide-to=\"1\" aria-label=\"Slide 2\"></button>\n      <button type=\"button\" data-bs-target=\"#myCarousel\" data-bs-slide-to=\"2\" aria-label=\"Slide 3\"></button>\n    </div>\n    <div class=\"carousel-inner\">\n      <div class=\"carousel-item active\">\n        <Placeholder width=\"100%\" height=\"100%\" background=\"var(--bs-secondary-color)\" text={false} title={false} />\n        <div class=\"container\">\n          <div class=\"carousel-caption text-start\">\n            <h1>Example headline.</h1>\n            <p class=\"opacity-75\">Some representative placeholder content for the first slide of the carousel.</p>\n            <p><a class=\"btn btn-lg btn-primary\" href=\"#\">Sign up today</a></p>\n          </div>\n        </div>\n      </div>\n      <div class=\"carousel-item\">\n        <Placeholder width=\"100%\" height=\"100%\" background=\"var(--bs-secondary-color)\" text={false} title={false} />\n        <div class=\"container\">\n          <div class=\"carousel-caption\">\n            <h1>Another example headline.</h1>\n            <p>Some representative placeholder content for the second slide of the carousel.</p>\n            <p><a class=\"btn btn-lg btn-primary\" href=\"#\">Learn more</a></p>\n          </div>\n        </div>\n      </div>\n      <div class=\"carousel-item\">\n        <Placeholder width=\"100%\" height=\"100%\" background=\"var(--bs-secondary-color)\" text={false} title={false} />\n        <div class=\"container\">\n          <div class=\"carousel-caption text-end\">\n            <h1>One more for good measure.</h1>\n            <p>Some representative placeholder content for the third slide of this carousel.</p>\n            <p><a class=\"btn btn-lg btn-primary\" href=\"#\">Browse gallery</a></p>\n          </div>\n        </div>\n      </div>\n    </div>\n    <button class=\"carousel-control-prev\" type=\"button\" data-bs-target=\"#myCarousel\" data-bs-slide=\"prev\">\n      <span class=\"carousel-control-prev-icon\" aria-hidden=\"true\"></span>\n      <span class=\"visually-hidden\">Previous</span>\n    </button>\n    <button class=\"carousel-control-next\" type=\"button\" data-bs-target=\"#myCarousel\" data-bs-slide=\"next\">\n      <span class=\"carousel-control-next-icon\" aria-hidden=\"true\"></span>\n      <span class=\"visually-hidden\">Next</span>\n    </button>\n  </div>\n\n\n  <!-- Marketing messaging and featurettes\n  ================================================== -->\n  <!-- Wrap the rest of the page in another container to center all the content. -->\n\n  <div class=\"container marketing\">\n\n    <!-- Three columns of text below the carousel -->\n    <div class=\"row\">\n      <div class=\"col-lg-4\">\n        <Placeholder width=\"140\" height=\"140\" background=\"var(--bs-secondary-color)\" text={false} class=\"rounded-circle\" />\n        <h2 class=\"fw-normal\">Heading</h2>\n        <p>Some representative placeholder content for the three columns of text below the carousel. This is the first column.</p>\n        <p><a class=\"btn btn-secondary\" href=\"#\">View details &raquo;</a></p>\n      </div><!-- /.col-lg-4 -->\n      <div class=\"col-lg-4\">\n        <Placeholder width=\"140\" height=\"140\" background=\"var(--bs-secondary-color)\" text={false} class=\"rounded-circle\" />\n        <h2 class=\"fw-normal\">Heading</h2>\n        <p>Another exciting bit of representative placeholder content. This time, we've moved on to the second column.</p>\n        <p><a class=\"btn btn-secondary\" href=\"#\">View details &raquo;</a></p>\n      </div><!-- /.col-lg-4 -->\n      <div class=\"col-lg-4\">\n        <Placeholder width=\"140\" height=\"140\" background=\"var(--bs-secondary-color)\" text={false} class=\"rounded-circle\" />\n        <h2 class=\"fw-normal\">Heading</h2>\n        <p>And lastly this, the third column of representative placeholder content.</p>\n        <p><a class=\"btn btn-secondary\" href=\"#\">View details &raquo;</a></p>\n      </div><!-- /.col-lg-4 -->\n    </div><!-- /.row -->\n\n\n    <!-- START THE FEATURETTES -->\n\n    <hr class=\"featurette-divider\">\n\n    <div class=\"row featurette\">\n      <div class=\"col-md-7\">\n        <h2 class=\"featurette-heading fw-normal lh-1\">First featurette heading. <span class=\"text-body-secondary\">It’ll blow your mind.</span></h2>\n        <p class=\"lead\">Some great placeholder content for the first featurette here. Imagine some exciting prose here.</p>\n      </div>\n      <div class=\"col-md-5\">\n        <Placeholder width=\"500\" height=\"500\" background=\"var(--bs-secondary-bg)\" color=\"var(--bs-secondary-color)\" class=\"bd-placeholder-img-lg featurette-image img-fluid mx-auto\" />\n      </div>\n    </div>\n\n    <hr class=\"featurette-divider\">\n\n    <div class=\"row featurette\">\n      <div class=\"col-md-7 order-md-2\">\n        <h2 class=\"featurette-heading fw-normal lh-1\">Oh yeah, it’s that good. <span class=\"text-body-secondary\">See for yourself.</span></h2>\n        <p class=\"lead\">Another featurette? Of course. More placeholder content here to give you an idea of how this layout would work with some actual real-world content in place.</p>\n      </div>\n      <div class=\"col-md-5 order-md-1\">\n        <Placeholder width=\"500\" height=\"500\" background=\"var(--bs-secondary-bg)\" color=\"var(--bs-secondary-color)\" class=\"bd-placeholder-img-lg featurette-image img-fluid mx-auto\" />\n      </div>\n    </div>\n\n    <hr class=\"featurette-divider\">\n\n    <div class=\"row featurette\">\n      <div class=\"col-md-7\">\n        <h2 class=\"featurette-heading fw-normal lh-1\">And lastly, this one. <span class=\"text-body-secondary\">Checkmate.</span></h2>\n        <p class=\"lead\">And yes, this is the last block of representative placeholder content. Again, not really intended to be actually read, simply here to give you a better view of what this would look like with some actual content. Your content.</p>\n      </div>\n      <div class=\"col-md-5\">\n        <Placeholder width=\"500\" height=\"500\" background=\"var(--bs-secondary-bg)\" color=\"var(--bs-secondary-color)\" class=\"bd-placeholder-img-lg featurette-image img-fluid mx-auto\" />\n      </div>\n    </div>\n\n    <hr class=\"featurette-divider\">\n\n    <!-- /END THE FEATURETTES -->\n\n  </div><!-- /.container -->\n\n\n  <!-- FOOTER -->\n  <footer class=\"container\">\n    <p class=\"float-end\"><a href=\"#\">Back to top</a></p>\n    <p>&copy; 2017–{new Date().getFullYear()} Company, Inc. &middot; <a href=\"#\">Privacy</a> &middot; <a href=\"#\">Terms</a></p>\n  </footer>\n</main>\n"
  },
  {
    "path": "site/src/assets/examples/carousel-rtl/index.astro",
    "content": "---\nexport const title = 'قالب  شرائح العرض'\nexport const direction = 'rtl'\nexport const extra_css = ['../carousel/carousel.rtl.css']\nimport Placeholder from \"@shortcodes/Placeholder.astro\"\n---\n\n<header data-bs-theme=\"dark\">\n  <nav class=\"navbar navbar-expand-md navbar-dark fixed-top bg-dark\">\n    <div class=\"container-fluid\">\n      <a class=\"navbar-brand\" href=\"#\">شرائح العرض</a>\n      <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbarCollapse\" aria-controls=\"navbarCollapse\" aria-expanded=\"false\" aria-label=\"تبديل التنقل\">\n        <span class=\"navbar-toggler-icon\"></span>\n      </button>\n      <div class=\"collapse navbar-collapse\" id=\"navbarCollapse\">\n        <ul class=\"navbar-nav me-auto mb-2 mb-md-0\">\n          <li class=\"nav-item\">\n            <a class=\"nav-link active\" aria-current=\"page\" href=\"#\">الصفحة الرئيسية</a>\n          </li>\n          <li class=\"nav-item\">\n            <a class=\"nav-link\" href=\"#\">حلقة الوصل</a>\n          </li>\n          <li class=\"nav-item\">\n            <a class=\"nav-link disabled\" aria-disabled=\"true\">رابط غير مفعل</a>\n          </li>\n        </ul>\n        <form class=\"d-flex\" role=\"search\">\n          <input class=\"form-control me-2\" type=\"search\" placeholder=\"بحث\" aria-label=\"بحث\">\n          <button class=\"btn btn-outline-success\" type=\"submit\">بحث</button>\n        </form>\n      </div>\n    </div>\n  </nav>\n</header>\n\n<main>\n\n  <div id=\"myCarousel\" class=\"carousel slide mb-6\" data-bs-ride=\"carousel\">\n    <div class=\"carousel-indicators\">\n      <button type=\"button\" data-bs-target=\"#myCarousel\" data-bs-slide-to=\"0\" class=\"active\" aria-current=\"true\" aria-label=\"Slide 1\"></button>\n      <button type=\"button\" data-bs-target=\"#myCarousel\" data-bs-slide-to=\"1\" aria-label=\"Slide 2\"></button>\n      <button type=\"button\" data-bs-target=\"#myCarousel\" data-bs-slide-to=\"2\" aria-label=\"Slide 3\"></button>\n    </div>\n    <div class=\"carousel-inner\">\n      <div class=\"carousel-item active\">\n        <Placeholder width=\"100%\" height=\"100%\" background=\"var(--bs-secondary-color)\" text={false} title={false} />\n        <div class=\"container\">\n          <div class=\"carousel-caption text-start\">\n            <h1>عنوان المثال.</h1>\n            <p class=\"opacity-75\">تشير الدراسات الإحصائية حسب الجمعية الأمريكية للغات بأن الإقبال على العربية زاد %126 في الولايات المتحدة الأمريكية وحدها بين عامي 2002 و2009م.</p>\n            <p><a class=\"btn btn-lg btn-primary\" href=\"#\">سجل اليوم</a></p>\n          </div>\n        </div>\n      </div>\n      <div class=\"carousel-item\">\n        <Placeholder width=\"100%\" height=\"100%\" background=\"var(--bs-secondary-color)\" text={false} title={false} />\n        <div class=\"container\">\n          <div class=\"carousel-caption\">\n            <h1>عنوان مثال آخر.</h1>\n            <p>حسب المجلس الثقافي البريطاني فإن تعليم الإنجليزية داخل بريطانيا يسهم في تعزيز اقتصادها بما يتجاوز ملياري جنيه سنوياً، كما أنه وفر أكثر من 26 ألف وظيفة.</p>\n            <p><a class=\"btn btn-lg btn-primary\" href=\"#\">أعرف أكثر</a></p>\n          </div>\n        </div>\n      </div>\n      <div class=\"carousel-item\">\n        <Placeholder width=\"100%\" height=\"100%\" background=\"var(--bs-secondary-color)\" text={false} title={false} />\n        <div class=\"container\">\n          <div class=\"carousel-caption text-end\">\n            <h1>واحد أكثر لقياس جيد.</h1>\n            <p>الإحصاءات لحجم الاستثمار اللغوي خارج بريطانيا تتفاوت من سنة لأخرى إلا أن المدير التنفيذي للمجلس الثقافي البريطاني إدي بايرز يرى أن استثمار تعليم الإنجليزية في الخارج لا يحسب على المستوى المالي فحسب بل على المستوى السياسي أيضاً.</p>\n            <p><a class=\"btn btn-lg btn-primary\" href=\"#\">تصفح المعرض</a></p>\n          </div>\n        </div>\n      </div>\n    </div>\n    <button class=\"carousel-control-prev\" type=\"button\" data-bs-target=\"#myCarousel\" data-bs-slide=\"prev\">\n      <span class=\"carousel-control-prev-icon\" aria-hidden=\"true\"></span>\n      <span class=\"visually-hidden\">السابق</span>\n    </button>\n    <button class=\"carousel-control-next\" type=\"button\" data-bs-target=\"#myCarousel\" data-bs-slide=\"next\">\n      <span class=\"carousel-control-next-icon\" aria-hidden=\"true\"></span>\n      <span class=\"visually-hidden\">التالي</span>\n    </button>\n  </div>\n\n\n  <!-- Marketing messaging and featurettes\n  ================================================== -->\n  <!-- Wrap the rest of the page in another container to center all the content. -->\n\n  <div class=\"container marketing\">\n\n    <!-- Three columns of text below the carousel -->\n    <div class=\"row\">\n      <div class=\"col-lg-4\">\n        <Placeholder width=\"140\" height=\"140\" background=\"var(--bs-secondary-color)\" text={false} class=\"rounded-circle\" />\n        <h2 class=\"fw-normal\">عنوان</h2>\n        <p>تذكر دائماً أن الحاسوب لا يمتلك ذكاءً، ولكنه يكتسب الذكاء الاصطناعي من خلال ثلاثة عناصر وظيفية رئيسة، هي: القدرة على التحليل، والقدرة على التأليف، والاستدلال المنطقي.</p>\n        <p><a class=\"btn btn-secondary\" href=\"#\">عرض التفاصيل</a></p>\n      </div><!-- /.col-lg-4 -->\n      <div class=\"col-lg-4\">\n        <Placeholder width=\"140\" height=\"140\" background=\"var(--bs-secondary-color)\" text={false} class=\"rounded-circle\" />\n        <h2 class=\"fw-normal\">عنوان آخر</h2>\n        <p>إذا أردنا استخدام الحاسوب الذكي في معالجة اللغة العربية فإننا نجد أنفسنا أمام تحدٍّ كبير، خاصة وأن لغتنا تمتاز بتماسك منظوماتها وتداخلها، ومع ذلك فإن الذكاء الاصطناعي يمكّننا من الحصول على أربعة أنواع من المعالجة، هي: المعالجة الصوتية، والمعالجة الصرفية، والمعالجة النحوية، والمعالجة الدلالية.</p>\n        <p><a class=\"btn btn-secondary\" href=\"#\">عرض التفاصيل</a></p>\n      </div><!-- /.col-lg-4 -->\n      <div class=\"col-lg-4\">\n        <Placeholder width=\"140\" height=\"140\" background=\"var(--bs-secondary-color)\" text={false} class=\"rounded-circle\" />\n        <h2 class=\"fw-normal\">عنوان ثالث لتأكيد المعلومة</h2>\n        <p>بفضل بحوث الذكاء الاصطناعي وتقنياته استطعنا الانتقال من مرحلة التعامل مع الفيزيائي إلى مرحلة التعامل مع المنطقي، وقد انعكس هذا الانتقال بصورة إيجابية على الكيفية التي تتعامل بها الشعوب مع لغاتها الحيَّة، وهذا يعني أنه يجب أن ينعكس بصورة إيجابية على كيفية تعاملنا مع لغتنا العربية.</p>\n        <p><a class=\"btn btn-secondary\" href=\"#\">عرض التفاصيل</a></p>\n      </div><!-- /.col-lg-4 -->\n    </div><!-- /.row -->\n\n\n    <!-- START THE FEATURETTES -->\n\n    <hr class=\"featurette-divider\">\n\n    <div class=\"row featurette\">\n      <div class=\"col-md-7\">\n        <h2 class=\"featurette-heading fw-normal lh-1\">العنوان الأول المميز. <span class=\"text-body-secondary\"> سيذهل عقلك. </span></h2>\n        <p class=\"lead\">وجه الإنسان هو جزء معقَّد ومتميِّز للغاية من جسمه. وفي الواقع، إنه أحد أكثر أنظمة الإشارات المتاحة تعقيداً لدينا؛ فهو يتضمَّن أكثر من 40 عضلة مستقلة هيكلياً ووظيفياً، بحيث يمكن تشغيل كل منها بشكل مستقل عن البعض الآخر؛ وتشكِّل أحد أقوى مؤشرات العواطف.</p>\n      </div>\n      <div class=\"col-md-5\">\n        <Placeholder width=\"500\" height=\"500\" background=\"var(--bs-secondary-bg)\" color=\"var(--bs-secondary-color)\" class=\"bd-placeholder-img-lg featurette-image img-fluid mx-auto\" />\n      </div>\n    </div>\n\n    <hr class=\"featurette-divider\">\n\n    <div class=\"row featurette\">\n      <div class=\"col-md-7 order-md-2\">\n        <h2 class=\"featurette-heading fw-normal lh-1\">أوه نعم، هذا جيد. <span class=\"text-body-secondary\"> شاهد بنفسك. </span></h2>\n        <p class=\"lead\">عندما نضحك أو نبكي، فإننا نعرض عواطفنا، مما يسمح للآخرين بإلقاء نظرة خاطفة على أذهاننا أثناء \"قراءة\" وجوهنا بناءً على التغييرات في مكوّنات الوجه الرئيسة، مثل: العينين والحاجبين والجفنين والأنف والشفتين.</p>\n      </div>\n      <div class=\"col-md-5 order-md-1\">\n        <Placeholder width=\"500\" height=\"500\" background=\"var(--bs-secondary-bg)\" color=\"var(--bs-secondary-color)\" class=\"bd-placeholder-img-lg featurette-image img-fluid mx-auto\" />\n      </div>\n    </div>\n\n    <hr class=\"featurette-divider\">\n\n    <div class=\"row featurette\">\n      <div class=\"col-md-7\">\n        <h2 class=\"featurette-heading fw-normal lh-1\">وأخيرًا، هذا. <span class=\"text-body-secondary\"> كش ملك. </span></h2>\n        <p class=\"lead\">إن جميع العضلات في أجسامنا مدعمة بالأعصاب المتصلة من كافة أنحاء الجسم بالنخاع الشوكي والدماغ. وهذا الاتصال العصبي هو ثنائي الاتجاه، أي إن العصب يتسبَّب في تقلصات العضلات بناءً على إشارات الدماغ، ويقوم في الوقت نفسه بإرسال معلومات عن حالة العضلات إلى الدماغ</p>\n      </div>\n      <div class=\"col-md-5\">\n        <Placeholder width=\"500\" height=\"500\" background=\"var(--bs-secondary-bg)\" color=\"var(--bs-secondary-color)\" class=\"bd-placeholder-img-lg featurette-image img-fluid mx-auto\" />\n      </div>\n    </div>\n\n    <hr class=\"featurette-divider\">\n\n    <!-- /END THE FEATURETTES -->\n\n  </div><!-- /.container -->\n\n\n  <!-- FOOTER -->\n  <footer class=\"container\">\n    <p class=\"float-end\"><a href=\"#\">عد إلى الأعلى</a></p>\n    <p>&copy; 2017–{new Date().getFullYear()} Company, Inc. &middot; <a href=\"#\">سياسة الخصوصية</a> &middot; <a href=\"#\">شروط الاستخدام</a></p>\n  </footer>\n</main>\n"
  },
  {
    "path": "site/src/assets/examples/cheatsheet/cheatsheet.css",
    "content": "body {\n  scroll-behavior: smooth;\n}\n\n/**\n * Bootstrap \"Journal code\" icon\n * @link https://icons.getbootstrap.com/icons/journal-code/\n */\n.bd-heading a::before {\n  display: inline-block;\n  width: 1em;\n  height: 1em;\n  margin-right: .25rem;\n  content: \"\";\n  background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23999' viewBox='0 0 16 16'%3E%3Cpath d='M4 1h8a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2h1a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1V3a1 1 0 0 0-1-1H4a1 1 0 0 0-1 1H2a2 2 0 0 1 2-2z'/%3E%3Cpath d='M2 5v-.5a.5.5 0 0 1 1 0V5h.5a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1H2zm0 3v-.5a.5.5 0 0 1 1 0V8h.5a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1H2zm0 3v-.5a.5.5 0 0 1 1 0v.5h.5a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1H2z'/%3E%3Cpath fill-rule='evenodd' d='M8.646 5.646a.5.5 0 0 1 .708 0l2 2a.5.5 0 0 1 0 .708l-2 2a.5.5 0 0 1-.708-.708L10.293 8 8.646 6.354a.5.5 0 0 1 0-.708zm-1.292 0a.5.5 0 0 0-.708 0l-2 2a.5.5 0 0 0 0 .708l2 2a.5.5 0 0 0 .708-.708L5.707 8l1.647-1.646a.5.5 0 0 0 0-.708z'/%3E%3C/svg%3E\");\n  background-size: 1em;\n}\n\n/* stylelint-disable-next-line selector-max-universal */\n.bd-heading + div > * + * {\n  margin-top: 3rem;\n}\n\n/* Table of contents */\n.bd-aside a {\n  padding: .1875rem .5rem;\n  margin-top: .125rem;\n  margin-left: .3125rem;\n  color: var(--bs-body-color);\n}\n\n.bd-aside a:hover,\n.bd-aside a:focus {\n  color: var(--bs-body-color);\n  background-color: rgba(121, 82, 179, .1);\n}\n\n.bd-aside .active {\n  font-weight: 600;\n  color: var(--bs-body-color);\n}\n\n.bd-aside .btn {\n  padding: .25rem .5rem;\n  font-weight: 600;\n  color: var(--bs-body-color);\n}\n\n.bd-aside .btn:hover,\n.bd-aside .btn:focus {\n  color: var(--bs-body-color);\n  background-color: rgba(121, 82, 179, .1);\n}\n\n.bd-aside .btn:focus {\n  box-shadow: 0 0 0 1px rgba(121, 82, 179, .7);\n}\n\n.bd-aside .btn::before {\n  width: 1.25em;\n  line-height: 0;\n  content: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23ccc' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M5 14l6-6-6-6'/%3e%3c/svg%3e\");\n  transition: transform .35s ease;\n\n  /* rtl:raw:\n  transform: rotate(180deg) translateX(-2px);\n  */\n  transform-origin: .5em 50%;\n}\n\n.bd-aside .btn[aria-expanded=\"true\"]::before {\n  transform: rotate(90deg)/* rtl:ignore */;\n}\n\n\n/* Examples */\n.scrollspy-example {\n  height: 200px;\n}\n\n[id=\"modal\"] .bd-example .btn,\n[id=\"buttons\"] .bd-example .btn,\n[id=\"tooltips\"] .bd-example .btn,\n[id=\"popovers\"] .bd-example .btn,\n[id=\"dropdowns\"] .bd-example .btn-group,\n[id=\"dropdowns\"] .bd-example .dropdown,\n[id=\"dropdowns\"] .bd-example .dropup,\n[id=\"dropdowns\"] .bd-example .dropend,\n[id=\"dropdowns\"] .bd-example .dropstart {\n  margin: 0 1rem 1rem 0;\n}\n\n/* Layout */\n@media (min-width: 1200px) {\n  body {\n    display: grid;\n    grid-template-rows: auto;\n    grid-template-columns: 1fr 4fr 1fr;\n    gap: 1rem;\n  }\n\n  .bd-header {\n    position: fixed;\n    top: 0;\n    /* rtl:begin:ignore */\n    right: 0;\n    left: 0;\n    /* rtl:end:ignore */\n    z-index: 1030;\n    grid-column: 1 / span 3;\n  }\n\n  .bd-aside,\n  .bd-cheatsheet {\n    padding-top: 4rem;\n  }\n\n  /**\n   * 1. Too bad only Firefox supports subgrids ATM\n   */\n  .bd-cheatsheet,\n  .bd-cheatsheet section,\n  .bd-cheatsheet article {\n    display: inherit; /* 1 */\n    grid-template-rows: auto;\n    grid-template-columns: 1fr 4fr;\n    grid-column: 1 / span 2;\n    gap: inherit; /* 1 */\n  }\n\n  .bd-aside {\n    grid-area: 1 / 3;\n    scroll-margin-top: 4rem;\n  }\n\n  .bd-cheatsheet section,\n  .bd-cheatsheet section > h2 {\n    top: 2rem;\n    scroll-margin-top: 2rem;\n  }\n\n  .bd-cheatsheet section > h2::before {\n    position: absolute;\n    /* rtl:begin:ignore */\n    top: 0;\n    right: 0;\n    bottom: -2rem;\n    left: 0;\n    /* rtl:end:ignore */\n    z-index: -1;\n    content: \"\";\n  }\n\n  .bd-cheatsheet article,\n  .bd-cheatsheet .bd-heading {\n    top: 8rem;\n    scroll-margin-top: 8rem;\n  }\n\n  .bd-cheatsheet .bd-heading {\n    z-index: 1;\n  }\n}\n"
  },
  {
    "path": "site/src/assets/examples/cheatsheet/cheatsheet.js",
    "content": "/* global bootstrap: false */\n\n(() => {\n  'use strict'\n\n  // Tooltip and popover demos\n  document.querySelectorAll('.tooltip-demo')\n    .forEach(tooltip => {\n      new bootstrap.Tooltip(tooltip, {\n        selector: '[data-bs-toggle=\"tooltip\"]'\n      })\n    })\n\n  document.querySelectorAll('[data-bs-toggle=\"popover\"]')\n    .forEach(popover => {\n      new bootstrap.Popover(popover)\n    })\n\n  document.querySelectorAll('.toast')\n    .forEach(toastNode => {\n      const toast = new bootstrap.Toast(toastNode, {\n        autohide: false\n      })\n\n      toast.show()\n    })\n\n  // Disable empty links and submit buttons\n  document.querySelectorAll('[href=\"#\"], [type=\"submit\"]')\n    .forEach(link => {\n      link.addEventListener('click', event => {\n        event.preventDefault()\n      })\n    })\n\n  function setActiveItem() {\n    const { hash } = window.location\n\n    if (hash === '') {\n      return\n    }\n\n    const link = document.querySelector(`.bd-aside a[href=\"${hash}\"]`)\n\n    if (!link) {\n      return\n    }\n\n    const active = document.querySelector('.bd-aside .active')\n    const parent = link.parentNode.parentNode.previousElementSibling\n\n    link.classList.add('active')\n\n    if (parent.classList.contains('collapsed')) {\n      parent.click()\n    }\n\n    if (!active) {\n      return\n    }\n\n    const expanded = active.parentNode.parentNode.previousElementSibling\n\n    active.classList.remove('active')\n\n    if (expanded && parent !== expanded) {\n      expanded.click()\n    }\n  }\n\n  setActiveItem()\n  window.addEventListener('hashchange', setActiveItem)\n})()\n"
  },
  {
    "path": "site/src/assets/examples/cheatsheet/cheatsheet.rtl.css",
    "content": "body {\n  scroll-behavior: smooth;\n}\n\n/**\n * Bootstrap \"Journal code\" icon\n * @link https://icons.getbootstrap.com/icons/journal-code/\n */\n.bd-heading a::before {\n  display: inline-block;\n  width: 1em;\n  height: 1em;\n  margin-left: .25rem;\n  content: \"\";\n  background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23999' viewBox='0 0 16 16'%3E%3Cpath d='M4 1h8a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2h1a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1V3a1 1 0 0 0-1-1H4a1 1 0 0 0-1 1H2a2 2 0 0 1 2-2z'/%3E%3Cpath d='M2 5v-.5a.5.5 0 0 1 1 0V5h.5a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1H2zm0 3v-.5a.5.5 0 0 1 1 0V8h.5a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1H2zm0 3v-.5a.5.5 0 0 1 1 0v.5h.5a.5.5 0 0 1 0 1h-2a.5.5 0 0 1 0-1H2z'/%3E%3Cpath fill-rule='evenodd' d='M8.646 5.646a.5.5 0 0 1 .708 0l2 2a.5.5 0 0 1 0 .708l-2 2a.5.5 0 0 1-.708-.708L10.293 8 8.646 6.354a.5.5 0 0 1 0-.708zm-1.292 0a.5.5 0 0 0-.708 0l-2 2a.5.5 0 0 0 0 .708l2 2a.5.5 0 0 0 .708-.708L5.707 8l1.647-1.646a.5.5 0 0 0 0-.708z'/%3E%3C/svg%3E\");\n  background-size: 1em;\n}\n\n/* stylelint-disable-next-line selector-max-universal */\n.bd-heading + div > * + * {\n  margin-top: 3rem;\n}\n\n/* Table of contents */\n.bd-aside a {\n  padding: .1875rem .5rem;\n  margin-top: .125rem;\n  margin-right: .3125rem;\n  color: var(--bs-body-color);\n}\n\n.bd-aside a:hover,\n.bd-aside a:focus {\n  color: var(--bs-body-color);\n  background-color: rgba(121, 82, 179, .1);\n}\n\n.bd-aside .active {\n  font-weight: 600;\n  color: var(--bs-body-color);\n}\n\n.bd-aside .btn {\n  padding: .25rem .5rem;\n  font-weight: 600;\n  color: var(--bs-body-color);\n}\n\n.bd-aside .btn:hover,\n.bd-aside .btn:focus {\n  color: var(--bs-body-color);\n  background-color: rgba(121, 82, 179, .1);\n}\n\n.bd-aside .btn:focus {\n  box-shadow: 0 0 0 1px rgba(121, 82, 179, .7);\n}\n\n.bd-aside .btn::before {\n  width: 1.25em;\n  line-height: 0;\n  content: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23ccc' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M5 14l6-6-6-6'/%3e%3c/svg%3e\");\n  transition: transform .35s ease;\n  transform: rotate(180deg) translateX(-2px);\n  transform-origin: .5em 50%;\n}\n\n.bd-aside .btn[aria-expanded=\"true\"]::before {\n  transform: rotate(90deg);\n}\n\n\n/* Examples */\n.scrollspy-example {\n  height: 200px;\n}\n\n[id=\"modal\"] .bd-example .btn,\n[id=\"buttons\"] .bd-example .btn,\n[id=\"tooltips\"] .bd-example .btn,\n[id=\"popovers\"] .bd-example .btn,\n[id=\"dropdowns\"] .bd-example .btn-group,\n[id=\"dropdowns\"] .bd-example .dropdown,\n[id=\"dropdowns\"] .bd-example .dropup,\n[id=\"dropdowns\"] .bd-example .dropend,\n[id=\"dropdowns\"] .bd-example .dropstart {\n  margin: 0 0 1rem 1rem;\n}\n\n/* Layout */\n@media (min-width: 1200px) {\n  body {\n    display: grid;\n    grid-template-rows: auto;\n    grid-template-columns: 1fr 4fr 1fr;\n    gap: 1rem;\n  }\n\n  .bd-header {\n    position: fixed;\n    top: 0;\n    right: 0;\n    left: 0;\n    z-index: 1030;\n    grid-column: 1 / span 3;\n  }\n\n  .bd-aside,\n  .bd-cheatsheet {\n    padding-top: 4rem;\n  }\n\n  /**\n   * 1. Too bad only Firefox supports subgrids ATM\n   */\n  .bd-cheatsheet,\n  .bd-cheatsheet section,\n  .bd-cheatsheet article {\n    display: inherit; /* 1 */\n    grid-template-rows: auto;\n    grid-template-columns: 1fr 4fr;\n    grid-column: 1 / span 2;\n    gap: inherit; /* 1 */\n  }\n\n  .bd-aside {\n    grid-area: 1 / 3;\n    scroll-margin-top: 4rem;\n  }\n\n  .bd-cheatsheet section,\n  .bd-cheatsheet section > h2 {\n    top: 2rem;\n    scroll-margin-top: 2rem;\n  }\n\n  .bd-cheatsheet section > h2::before {\n    position: absolute;\n    top: 0;\n    right: 0;\n    bottom: -2rem;\n    left: 0;\n    z-index: -1;\n    content: \"\";\n  }\n\n  .bd-cheatsheet article,\n  .bd-cheatsheet .bd-heading {\n    top: 8rem;\n    scroll-margin-top: 8rem;\n  }\n\n  .bd-cheatsheet .bd-heading {\n    z-index: 1;\n  }\n}\n"
  },
  {
    "path": "site/src/assets/examples/cheatsheet/index.astro",
    "content": "---\nimport { getData } from '@libs/data'\nimport { getVersionedDocsPath } from '@libs/path'\nimport Example from '@shortcodes/Example.astro'\nimport Placeholder from '@shortcodes/Placeholder.astro'\n\nexport const title = 'Cheatsheet'\nexport const extra_css = ['cheatsheet.css']\nexport const extra_js = [{ src: 'cheatsheet.js' }]\nexport const body_class = 'bg-body-tertiary'\n---\n\n<header class=\"bd-header bg-dark py-3 d-flex align-items-stretch border-bottom border-dark\">\n  <div class=\"container-fluid d-flex align-items-center\">\n    <h1 class=\"d-flex align-items-center fs-4 text-white mb-0\">\n      <img src={getVersionedDocsPath('/assets/brand/bootstrap-logo-white.svg')} width=\"38\" height=\"30\" class=\"me-3\" alt=\"Bootstrap\">\n      Cheatsheet\n    </h1>\n    <a href={getVersionedDocsPath('examples/cheatsheet-rtl/')} class=\"ms-auto link-light\" hreflang=\"ar\">RTL cheatsheet</a>\n  </div>\n</header>\n<aside class=\"bd-aside sticky-xl-top text-body-secondary align-self-start mb-3 mb-xl-5 px-2\">\n  <h2 class=\"h6 pt-4 pb-3 mb-4 border-bottom\">On this page</h2>\n  <nav class=\"small\" id=\"toc\">\n    <ul class=\"list-unstyled\">\n      <li class=\"my-2\">\n        <button type=\"button\" class=\"btn d-inline-flex align-items-center collapsed border-0\" data-bs-toggle=\"collapse\" aria-expanded=\"false\" data-bs-target=\"#contents-collapse\" aria-controls=\"contents-collapse\">Contents</button>\n        <ul class=\"list-unstyled ps-3 collapse\" id=\"contents-collapse\">\n          <li><a class=\"d-inline-flex align-items-center rounded text-decoration-none\" href=\"#typography\">Typography</a></li>\n          <li><a class=\"d-inline-flex align-items-center rounded text-decoration-none\" href=\"#images\">Images</a></li>\n          <li><a class=\"d-inline-flex align-items-center rounded text-decoration-none\" href=\"#tables\">Tables</a></li>\n          <li><a class=\"d-inline-flex align-items-center rounded text-decoration-none\" href=\"#figures\">Figures</a></li>\n        </ul>\n      </li>\n      <li class=\"my-2\">\n        <button type=\"button\" class=\"btn d-inline-flex align-items-center collapsed border-0\" data-bs-toggle=\"collapse\" aria-expanded=\"false\" data-bs-target=\"#forms-collapse\" aria-controls=\"forms-collapse\">Forms</button>\n        <ul class=\"list-unstyled ps-3 collapse\" id=\"forms-collapse\">\n          <li><a class=\"d-inline-flex align-items-center rounded text-decoration-none\" href=\"#overview\">Overview</a></li>\n          <li><a class=\"d-inline-flex align-items-center rounded text-decoration-none\" href=\"#disabled-forms\">Disabled forms</a></li>\n          <li><a class=\"d-inline-flex align-items-center rounded text-decoration-none\" href=\"#sizing\">Sizing</a></li>\n          <li><a class=\"d-inline-flex align-items-center rounded text-decoration-none\" href=\"#input-group\">Input group</a></li>\n          <li><a class=\"d-inline-flex align-items-center rounded text-decoration-none\" href=\"#floating-labels\">Floating labels</a></li>\n          <li><a class=\"d-inline-flex align-items-center rounded text-decoration-none\" href=\"#validation\">Validation</a></li>\n        </ul>\n      </li>\n      <li class=\"my-2\">\n        <button type=\"button\" class=\"btn d-inline-flex align-items-center collapsed border-0\" data-bs-toggle=\"collapse\" aria-expanded=\"false\" data-bs-target=\"#components-collapse\" aria-controls=\"components-collapse\">Components</button>\n        <ul class=\"list-unstyled ps-3 collapse\" id=\"components-collapse\">\n          <li><a class=\"d-inline-flex align-items-center rounded text-decoration-none\" href=\"#accordion\">Accordion</a></li>\n          <li><a class=\"d-inline-flex align-items-center rounded text-decoration-none\" href=\"#alerts\">Alerts</a></li>\n          <li><a class=\"d-inline-flex align-items-center rounded text-decoration-none\" href=\"#badge\">Badge</a></li>\n          <li><a class=\"d-inline-flex align-items-center rounded text-decoration-none\" href=\"#breadcrumb\">Breadcrumb</a></li>\n          <li><a class=\"d-inline-flex align-items-center rounded text-decoration-none\" href=\"#buttons\">Buttons</a></li>\n          <li><a class=\"d-inline-flex align-items-center rounded text-decoration-none\" href=\"#button-group\">Button group</a></li>\n          <li><a class=\"d-inline-flex align-items-center rounded text-decoration-none\" href=\"#card\">Card</a></li>\n          <li><a class=\"d-inline-flex align-items-center rounded text-decoration-none\" href=\"#carousel\">Carousel</a></li>\n          <li><a class=\"d-inline-flex align-items-center rounded text-decoration-none\" href=\"#dropdowns\">Dropdowns</a></li>\n          <li><a class=\"d-inline-flex align-items-center rounded text-decoration-none\" href=\"#list-group\">List group</a></li>\n          <li><a class=\"d-inline-flex align-items-center rounded text-decoration-none\" href=\"#modal\">Modal</a></li>\n          <li><a class=\"d-inline-flex align-items-center rounded text-decoration-none\" href=\"#navs\">Navs</a></li>\n          <li><a class=\"d-inline-flex align-items-center rounded text-decoration-none\" href=\"#navbar\">Navbar</a></li>\n          <li><a class=\"d-inline-flex align-items-center rounded text-decoration-none\" href=\"#pagination\">Pagination</a></li>\n          <li><a class=\"d-inline-flex align-items-center rounded text-decoration-none\" href=\"#popovers\">Popovers</a></li>\n          <li><a class=\"d-inline-flex align-items-center rounded text-decoration-none\" href=\"#progress\">Progress</a></li>\n          <li><a class=\"d-inline-flex align-items-center rounded text-decoration-none\" href=\"#scrollspy\">Scrollspy</a></li>\n          <li><a class=\"d-inline-flex align-items-center rounded text-decoration-none\" href=\"#spinners\">Spinners</a></li>\n          <li><a class=\"d-inline-flex align-items-center rounded text-decoration-none\" href=\"#toasts\">Toasts</a></li>\n          <li><a class=\"d-inline-flex align-items-center rounded text-decoration-none\" href=\"#tooltips\">Tooltips</a></li>\n        </ul>\n      </li>\n    </ul>\n  </nav>\n</aside>\n<main class=\"bd-cheatsheet container-fluid bg-body\">\n  <section id=\"content\">\n    <h2 class=\"sticky-xl-top fw-bold pt-3 pt-xl-5 pb-2 pb-xl-3\">Contents</h2>\n\n    <article class=\"my-3\" id=\"typography\">\n      <div class=\"bd-heading sticky-xl-top align-self-start mt-5 mb-3 mt-xl-0 mb-xl-2\">\n        <h3>Typography</h3>\n        <a class=\"d-flex align-items-center\" href={getVersionedDocsPath('content/typography')}>Documentation</a>\n      </div>\n\n      <div>\n        <Example showMarkup={false} code={`\n        <p class=\"display-1\">Display 1</p>\n        <p class=\"display-2\">Display 2</p>\n        <p class=\"display-3\">Display 3</p>\n        <p class=\"display-4\">Display 4</p>\n        <p class=\"display-5\">Display 5</p>\n        <p class=\"display-6\">Display 6</p>`} />\n\n        <Example showMarkup={false} code={`\n        <p class=\"h1\">Heading 1</p>\n        <p class=\"h2\">Heading 2</p>\n        <p class=\"h3\">Heading 3</p>\n        <p class=\"h4\">Heading 4</p>\n        <p class=\"h5\">Heading 5</p>\n        <p class=\"h6\">Heading 6</p>`} />\n\n        <Example showMarkup={false} code={`\n        <p class=\"lead\">\n          This is a lead paragraph. It stands out from regular paragraphs.\n        </p>`} />\n\n        <Example showMarkup={false} code={`\n        <p>You can use the mark tag to <mark>highlight</mark> text.</p>\n        <p><del>This line of text is meant to be treated as deleted text.</del></p>\n        <p><s>This line of text is meant to be treated as no longer accurate.</s></p>\n        <p><ins>This line of text is meant to be treated as an addition to the document.</ins></p>\n        <p><u>This line of text will render as underlined.</u></p>\n        <p><small>This line of text is meant to be treated as fine print.</small></p>\n        <p><strong>This line rendered as bold text.</strong></p>\n        <p><em>This line rendered as italicized text.</em></p>`} />\n\n        <Example showMarkup={false} code={`\n        <hr>`} />\n\n        <Example showMarkup={false} code={`\n        <blockquote class=\"blockquote\">\n          <p>A well-known quote, contained in a blockquote element.</p>\n          <footer class=\"blockquote-footer\">Someone famous in <cite title=\"Source Title\">Source Title</cite></footer>\n        </blockquote>`} />\n\n        <Example showMarkup={false} code={`\n        <ul class=\"list-unstyled\">\n          <li>This is a list.</li>\n          <li>It appears completely unstyled.</li>\n          <li>Structurally, it's still a list.</li>\n          <li>However, this style only applies to immediate child elements.</li>\n          <li>Nested lists:\n            <ul>\n              <li>are unaffected by this style</li>\n              <li>will still show a bullet</li>\n              <li>and have appropriate left margin</li>\n            </ul>\n          </li>\n          <li>This may still come in handy in some situations.</li>\n        </ul>`} />\n\n        <Example showMarkup={false} code={`\n        <ul class=\"list-inline\">\n          <li class=\"list-inline-item\">This is a list item.</li>\n          <li class=\"list-inline-item\">And another one.</li>\n          <li class=\"list-inline-item\">But they're displayed inline.</li>\n        </ul>`} />\n      </div>\n    </article>\n    <article class=\"my-3\" id=\"images\">\n      <div class=\"bd-heading sticky-xl-top align-self-start mt-5 mb-3 mt-xl-0 mb-xl-2\">\n        <h3>Images</h3>\n        <a class=\"d-flex align-items-center\" href={getVersionedDocsPath('content/images')}>Documentation</a>\n      </div>\n\n      <div>\n        <Example showMarkup={false} code={`\n        <Placeholder width=\"100%\" height=\"250\" class=\"bd-placeholder-img-lg img-fluid\" text=\"Responsive image\" />`} />\n\n        <Example showMarkup={false} code={`\n        <Placeholder width=\"200\" height=\"200\" class=\"img-thumbnail\" title=\"A generic square placeholder image with a white border around it, making it resemble a photograph taken with an old instant camera\" />`} />\n      </div>\n    </article>\n    <article class=\"my-3\" id=\"tables\">\n      <div class=\"bd-heading sticky-xl-top align-self-start mt-5 mb-3 mt-xl-0 mb-xl-2\">\n        <h3>Tables</h3>\n        <a class=\"d-flex align-items-center\" href={getVersionedDocsPath('content/tables')}>Documentation</a>\n      </div>\n      <div>\n        <Example showMarkup={false} code={`\n          <table class=\"table table-striped\">\n            <thead>\n            <tr>\n              <th scope=\"col\">#</th>\n              <th scope=\"col\">First</th>\n              <th scope=\"col\">Last</th>\n              <th scope=\"col\">Handle</th>\n            </tr>\n            </thead>\n            <tbody>\n            <tr>\n              <th scope=\"row\">1</th>\n              <td>Mark</td>\n              <td>Otto</td>\n              <td>@mdo</td>\n            </tr>\n            <tr>\n              <th scope=\"row\">2</th>\n              <td>Jacob</td>\n              <td>Thornton</td>\n              <td>@fat</td>\n            </tr>\n            <tr>\n              <th scope=\"row\">3</th>\n              <td>John</td>\n              <td>Doe</td>\n              <td>@social</td>\n            </tr>\n            </tbody>\n          </table>`} />\n\n        <Example showMarkup={false} code={`\n          <table class=\"table table-dark table-borderless\">\n            <thead>\n            <tr>\n              <th scope=\"col\">#</th>\n              <th scope=\"col\">First</th>\n              <th scope=\"col\">Last</th>\n              <th scope=\"col\">Handle</th>\n            </tr>\n            </thead>\n            <tbody>\n            <tr>\n              <th scope=\"row\">1</th>\n              <td>Mark</td>\n              <td>Otto</td>\n              <td>@mdo</td>\n            </tr>\n            <tr>\n              <th scope=\"row\">2</th>\n              <td>Jacob</td>\n              <td>Thornton</td>\n              <td>@fat</td>\n            </tr>\n            <tr>\n              <th scope=\"row\">3</th>\n              <td>John</td>\n              <td>Doe</td>\n              <td>@social</td>\n            </tr>\n            </tbody>\n          </table>`} />\n\n        <Example showMarkup={false} code={[`\n          <table class=\"table table-hover\">\n            <thead>\n            <tr>\n              <th scope=\"col\">Class</th>\n              <th scope=\"col\">Heading</th>\n              <th scope=\"col\">Heading</th>\n            </tr>\n            </thead>\n            <tbody>\n            <tr>\n              <th scope=\"row\">Default</th>\n              <td>Cell</td>\n              <td>Cell</td>\n            </tr>`,\n            ...getData('theme-colors').map((themeColor) => `<tr class=\"table-${themeColor.name}\">\n                <th scope=\"row\">${themeColor.title}</th>\n                <td>Cell</td>\n                <td>Cell</td>\n              </tr>`),\n            `</tbody>\n          </table>`]} />\n\n        <Example showMarkup={false} code={`\n          <table class=\"table table-sm table-bordered\">\n            <thead>\n            <tr>\n              <th scope=\"col\">#</th>\n              <th scope=\"col\">First</th>\n              <th scope=\"col\">Last</th>\n              <th scope=\"col\">Handle</th>\n            </tr>\n            </thead>\n            <tbody>\n            <tr>\n              <th scope=\"row\">1</th>\n              <td>Mark</td>\n              <td>Otto</td>\n              <td>@mdo</td>\n            </tr>\n            <tr>\n              <th scope=\"row\">2</th>\n              <td>Jacob</td>\n              <td>Thornton</td>\n              <td>@fat</td>\n            </tr>\n            <tr>\n              <th scope=\"row\">3</th>\n              <td>John</td>\n              <td>Doe</td>\n              <td>@social</td>\n            </tr>\n            </tbody>\n          </table>`} />\n      </div>\n    </article>\n\n    <article class=\"my-3\" id=\"figures\">\n      <div class=\"bd-heading sticky-xl-top align-self-start mt-5 mb-3 mt-xl-0 mb-xl-2\">\n        <h3>Figures</h3>\n        <a class=\"d-flex align-items-center\" href={getVersionedDocsPath('content/figures')}>Documentation</a>\n      </div>\n\n      <div>\n        <Example showMarkup={false} code={`\n        <figure class=\"figure\">\n          <Placeholder width=\"400\" height=\"300\" class=\"figure-img img-fluid rounded\" />\n          <figcaption class=\"figure-caption\">A caption for the above image.</figcaption>\n        </figure>`} />\n      </div>\n    </article>\n  </section>\n\n  <section id=\"forms\">\n    <h2 class=\"sticky-xl-top fw-bold pt-3 pt-xl-5 pb-2 pb-xl-3\">Forms</h2>\n\n    <article class=\"my-3\" id=\"overview\">\n      <div class=\"bd-heading sticky-xl-top align-self-start mt-5 mb-3 mt-xl-0 mb-xl-2\">\n        <h3>Overview</h3>\n        <a class=\"d-flex align-items-center\" href={getVersionedDocsPath('forms/overview/')}>Documentation</a>\n      </div>\n\n      <div>\n        <Example showMarkup={false} code={`\n        <form>\n          <div class=\"mb-3\">\n            <label for=\"exampleInputEmail1\" class=\"form-label\">Email address</label>\n            <input type=\"email\" class=\"form-control\" id=\"exampleInputEmail1\" aria-describedby=\"emailHelp\">\n            <div id=\"emailHelp\" class=\"form-text\">We'll never share your email with anyone else.</div>\n          </div>\n          <div class=\"mb-3\">\n            <label for=\"exampleInputPassword1\" class=\"form-label\">Password</label>\n            <input type=\"password\" class=\"form-control\" id=\"exampleInputPassword1\">\n          </div>\n          <div class=\"mb-3\">\n            <label for=\"exampleSelect\" class=\"form-label\">Select menu</label>\n            <select class=\"form-select\" id=\"exampleSelect\">\n              <option selected>Open this select menu</option>\n              <option value=\"1\">One</option>\n              <option value=\"2\">Two</option>\n              <option value=\"3\">Three</option>\n            </select>\n          </div>\n          <div class=\"mb-3 form-check\">\n            <input type=\"checkbox\" class=\"form-check-input\" id=\"exampleCheck1\">\n            <label class=\"form-check-label\" for=\"exampleCheck1\">Check me out</label>\n          </div>\n          <fieldset class=\"mb-3\">\n            <legend>Radios buttons</legend>\n            <div class=\"form-check\">\n              <input type=\"radio\" name=\"radios\" class=\"form-check-input\" id=\"exampleRadio1\">\n              <label class=\"form-check-label\" for=\"exampleRadio1\">Default radio</label>\n            </div>\n            <div class=\"mb-3 form-check\">\n              <input type=\"radio\" name=\"radios\" class=\"form-check-input\" id=\"exampleRadio2\">\n              <label class=\"form-check-label\" for=\"exampleRadio2\">Another radio</label>\n            </div>\n          </fieldset>\n          <div class=\"mb-3\">\n            <label class=\"form-label\" for=\"customFile\">Upload</label>\n            <input type=\"file\" class=\"form-control\" id=\"customFile\">\n          </div>\n          <div class=\"mb-3 form-check form-switch\">\n            <input class=\"form-check-input\" type=\"checkbox\" role=\"switch\" id=\"switchCheckChecked\" checked>\n            <label class=\"form-check-label\" for=\"switchCheckChecked\">Checked switch checkbox input</label>\n          </div>\n          <div class=\"mb-3\">\n            <label for=\"customRange3\" class=\"form-label\">Example range</label>\n            <input type=\"range\" class=\"form-range\" min=\"0\" max=\"5\" step=\"0.5\" id=\"customRange3\">\n          </div>\n          <button type=\"submit\" class=\"btn btn-primary\">Submit</button>\n        </form>`} />\n      </div>\n    </article>\n    <article class=\"my-3\" id=\"disabled-forms\">\n      <div class=\"bd-heading sticky-xl-top align-self-start mt-5 mb-3 mt-xl-0 mb-xl-2\">\n        <h3>Disabled forms</h3>\n        <a class=\"d-flex align-items-center\" href={getVersionedDocsPath('forms/overview/#disabled-forms')}>Documentation</a>\n      </div>\n\n      <div>\n        <Example showMarkup={false} code={`\n        <form>\n          <fieldset disabled aria-label=\"Disabled fieldset example\">\n            <div class=\"mb-3\">\n              <label for=\"disabledTextInput\" class=\"form-label\">Disabled input</label>\n              <input type=\"text\" id=\"disabledTextInput\" class=\"form-control\" placeholder=\"Disabled input\">\n            </div>\n            <div class=\"mb-3\">\n              <label for=\"disabledSelect\" class=\"form-label\">Disabled select menu</label>\n              <select id=\"disabledSelect\" class=\"form-select\">\n                <option>Disabled select</option>\n              </select>\n            </div>\n            <div class=\"mb-3\">\n              <div class=\"form-check\">\n                <input class=\"form-check-input\" type=\"checkbox\" id=\"disabledFieldsetCheck\" disabled>\n                <label class=\"form-check-label\" for=\"disabledFieldsetCheck\">\n                  Can't check this\n                </label>\n              </div>\n            </div>\n            <fieldset class=\"mb-3\">\n              <legend>Disabled radios buttons</legend>\n              <div class=\"form-check\">\n                <input type=\"radio\" name=\"radios\" class=\"form-check-input\" id=\"disabledRadio1\" disabled>\n                <label class=\"form-check-label\" for=\"disabledRadio1\">Disabled radio</label>\n              </div>\n              <div class=\"mb-3 form-check\">\n                <input type=\"radio\" name=\"radios\" class=\"form-check-input\" id=\"disabledRadio2\" disabled>\n                <label class=\"form-check-label\" for=\"disabledRadio2\">Another radio</label>\n              </div>\n            </fieldset>\n            <div class=\"mb-3\">\n              <label class=\"form-label\" for=\"disabledCustomFile\">Upload</label>\n              <input type=\"file\" class=\"form-control\" id=\"disabledCustomFile\" disabled>\n            </div>\n            <div class=\"mb-3 form-check form-switch\">\n              <input class=\"form-check-input\" type=\"checkbox\" role=\"switch\" id=\"disabledSwitchCheckChecked\" checked disabled>\n              <label class=\"form-check-label\" for=\"disabledSwitchCheckChecked\">Disabled checked switch checkbox input</label>\n            </div>\n            <div class=\"mb-3\">\n              <label for=\"disabledRange\" class=\"form-label\">Disabled range</label>\n              <input type=\"range\" class=\"form-range\" min=\"0\" max=\"5\" step=\"0.5\" id=\"disabledRange\">\n            </div>\n            <button type=\"submit\" class=\"btn btn-primary\">Submit</button>\n          </fieldset>\n        </form>`} />\n      </div>\n    </article>\n    <article class=\"my-3\" id=\"sizing\">\n      <div class=\"bd-heading sticky-xl-top align-self-start mt-5 mb-3 mt-xl-0 mb-xl-2\">\n        <h3>Sizing</h3>\n        <a class=\"d-flex align-items-center\" href={getVersionedDocsPath('forms/form-control#sizing')}>Documentation</a>\n      </div>\n\n      <div>\n        <Example showMarkup={false} code={`\n        <div class=\"mb-3\">\n          <input class=\"form-control form-control-lg\" type=\"text\" placeholder=\".form-control-lg\" aria-label=\".form-control-lg example\">\n        </div>\n        <div class=\"mb-3\">\n          <select class=\"form-select form-select-lg\" aria-label=\".form-select-lg example\">\n            <option selected>Open this select menu</option>\n            <option value=\"1\">One</option>\n            <option value=\"2\">Two</option>\n            <option value=\"3\">Three</option>\n          </select>\n        </div>\n        <div class=\"mb-3\">\n          <input type=\"file\" class=\"form-control form-control-lg\" aria-label=\"Large file input example\">\n        </div>`} />\n\n        <Example showMarkup={false} code={`\n        <div class=\"mb-3\">\n          <input class=\"form-control form-control-sm\" type=\"text\" placeholder=\".form-control-sm\" aria-label=\".form-control-sm example\">\n        </div>\n        <div class=\"mb-3\">\n          <select class=\"form-select form-select-sm\" aria-label=\".form-select-sm example\">\n            <option selected>Open this select menu</option>\n            <option value=\"1\">One</option>\n            <option value=\"2\">Two</option>\n            <option value=\"3\">Three</option>\n          </select>\n        </div>\n        <div class=\"mb-3\">\n          <input type=\"file\" class=\"form-control form-control-sm\" aria-label=\"Small file input example\">\n        </div>\n        `} />\n      </div>\n    </article>\n    <article class=\"my-3\" id=\"input-group\">\n      <div class=\"bd-heading sticky-xl-top align-self-start mt-5 mb-3 mt-xl-0 mb-xl-2\">\n        <h3>Input group</h3>\n        <a class=\"d-flex align-items-center\" href={getVersionedDocsPath('forms/input-group')}>Documentation</a>\n      </div>\n\n      <div>\n        <Example showMarkup={false} code={`\n        <div class=\"input-group mb-3\">\n          <span class=\"input-group-text\" id=\"basic-addon1\">@</span>\n          <input type=\"text\" class=\"form-control\" placeholder=\"Username\" aria-label=\"Username\" aria-describedby=\"basic-addon1\">\n        </div>\n        <div class=\"input-group mb-3\">\n          <input type=\"text\" class=\"form-control\" placeholder=\"Recipient's username\" aria-label=\"Recipient's username\" aria-describedby=\"basic-addon2\">\n          <span class=\"input-group-text\" id=\"basic-addon2\">@example.com</span>\n        </div>\n        <label for=\"basic-url\" class=\"form-label\">Your vanity URL</label>\n        <div class=\"input-group mb-3\">\n          <span class=\"input-group-text\" id=\"basic-addon3\">https://example.com/users/</span>\n          <input type=\"text\" class=\"form-control\" id=\"basic-url\" aria-describedby=\"basic-addon3\">\n        </div>\n        <div class=\"input-group mb-3\">\n          <span class=\"input-group-text\">$</span>\n          <input type=\"text\" class=\"form-control\" aria-label=\"Amount (to the nearest dollar)\">\n          <span class=\"input-group-text\">.00</span>\n        </div>\n        <div class=\"input-group\">\n          <span class=\"input-group-text\">With textarea</span>\n          <textarea class=\"form-control\" aria-label=\"With textarea\"></textarea>\n        </div>\n        `} />\n      </div>\n    </article>\n    <article class=\"my-3\" id=\"floating-labels\">\n      <div class=\"bd-heading sticky-xl-top align-self-start mt-5 mb-3 mt-xl-0 mb-xl-2\">\n        <h3>Floating labels</h3>\n        <a class=\"d-flex align-items-center\" href={getVersionedDocsPath('forms/floating-labels')}>Documentation</a>\n      </div>\n\n      <div>\n        <Example showMarkup={false} code={`\n        <form>\n          <div class=\"form-floating mb-3\">\n            <input type=\"email\" class=\"form-control\" id=\"floatingInput\" placeholder=\"name@example.com\">\n            <label for=\"floatingInput\">Email address</label>\n          </div>\n          <div class=\"form-floating\">\n            <input type=\"password\" class=\"form-control\" id=\"floatingPassword\" placeholder=\"Password\">\n            <label for=\"floatingPassword\">Password</label>\n          </div>\n        </form>\n        `} />\n      </div>\n    </article>\n    <article class=\"my-3\" id=\"validation\">\n      <div class=\"bd-heading sticky-xl-top align-self-start mt-5 mb-3 mt-xl-0 mb-xl-2\">\n        <h3>Validation</h3>\n        <a class=\"d-flex align-items-center\" href={getVersionedDocsPath('forms/validation')}>Documentation</a>\n      </div>\n\n      <div>\n        <Example showMarkup={false} code={`\n        <form class=\"row g-3\">\n          <div class=\"col-md-4\">\n            <label for=\"validationServer01\" class=\"form-label\">First name</label>\n            <input type=\"text\" class=\"form-control is-valid\" id=\"validationServer01\" value=\"Mark\" required>\n            <div class=\"valid-feedback\">\n              Looks good!\n            </div>\n          </div>\n          <div class=\"col-md-4\">\n            <label for=\"validationServer02\" class=\"form-label\">Last name</label>\n            <input type=\"text\" class=\"form-control is-valid\" id=\"validationServer02\" value=\"Otto\" required>\n            <div class=\"valid-feedback\">\n              Looks good!\n            </div>\n          </div>\n          <div class=\"col-md-4\">\n            <label for=\"validationServerUsername\" class=\"form-label\">Username</label>\n            <div class=\"input-group has-validation\">\n              <span class=\"input-group-text\" id=\"inputGroupPrepend3\">@</span>\n              <input type=\"text\" class=\"form-control is-invalid\" id=\"validationServerUsername\" aria-describedby=\"inputGroupPrepend3\" required>\n              <div class=\"invalid-feedback\">\n                Please choose a username.\n              </div>\n            </div>\n          </div>\n          <div class=\"col-md-6\">\n            <label for=\"validationServer03\" class=\"form-label\">City</label>\n            <input type=\"text\" class=\"form-control is-invalid\" id=\"validationServer03\" required>\n            <div class=\"invalid-feedback\">\n              Please provide a valid city.\n            </div>\n          </div>\n          <div class=\"col-md-3\">\n            <label for=\"validationServer04\" class=\"form-label\">State</label>\n            <select class=\"form-select is-invalid\" id=\"validationServer04\" required>\n              <option selected disabled value=\"\">Choose...</option>\n              <option>...</option>\n            </select>\n            <div class=\"invalid-feedback\">\n              Please select a valid state.\n            </div>\n          </div>\n          <div class=\"col-md-3\">\n            <label for=\"validationServer05\" class=\"form-label\">Zip</label>\n            <input type=\"text\" class=\"form-control is-invalid\" id=\"validationServer05\" required>\n            <div class=\"invalid-feedback\">\n              Please provide a valid zip.\n            </div>\n          </div>\n          <div class=\"col-12\">\n            <div class=\"form-check\">\n              <input class=\"form-check-input is-invalid\" type=\"checkbox\" value=\"\" id=\"invalidCheck3\" required>\n              <label class=\"form-check-label\" for=\"invalidCheck3\">\n                Agree to terms and conditions\n              </label>\n              <div class=\"invalid-feedback\">\n                You must agree before submitting.\n              </div>\n            </div>\n          </div>\n          <div class=\"col-12\">\n            <button class=\"btn btn-primary\" type=\"submit\">Submit form</button>\n          </div>\n        </form>\n        `} />\n      </div>\n    </article>\n  </section>\n\n  <section id=\"components\">\n    <h2 class=\"sticky-xl-top fw-bold pt-3 pt-xl-5 pb-2 pb-xl-3\">Components</h2>\n\n    <article class=\"my-3\" id=\"accordion\">\n      <div class=\"bd-heading sticky-xl-top align-self-start mt-5 mb-3 mt-xl-0 mb-xl-2\">\n        <h3>Accordion</h3>\n        <a class=\"d-flex align-items-center\" href={getVersionedDocsPath('components/accordion')}>Documentation</a>\n      </div>\n\n      <div>\n        <Example showMarkup={false} code={`\n        <div class=\"accordion\" id=\"accordionExample\">\n          <div class=\"accordion-item\">\n            <h4 class=\"accordion-header\">\n              <button class=\"accordion-button\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#collapseOne\" aria-expanded=\"true\" aria-controls=\"collapseOne\">\n                Accordion Item #1\n              </button>\n            </h4>\n            <div id=\"collapseOne\" class=\"accordion-collapse collapse show\" data-bs-parent=\"#accordionExample\">\n              <div class=\"accordion-body\">\n                <strong>This is the first item's accordion body.</strong> It is hidden by default, until the collapse plugin adds the appropriate classes that we use to style each element. These classes control the overall appearance, as well as the showing and hiding via CSS transitions. You can modify any of this with custom CSS or overriding our default variables. It's also worth noting that just about any HTML can go within the <code>.accordion-body</code>, though the transition does limit overflow.\n              </div>\n            </div>\n          </div>\n          <div class=\"accordion-item\">\n            <h4 class=\"accordion-header\">\n              <button class=\"accordion-button collapsed\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#collapseTwo\" aria-expanded=\"false\" aria-controls=\"collapseTwo\">\n                Accordion Item #2\n              </button>\n            </h4>\n            <div id=\"collapseTwo\" class=\"accordion-collapse collapse\" data-bs-parent=\"#accordionExample\">\n              <div class=\"accordion-body\">\n                <strong>This is the second item's accordion body.</strong> It is hidden by default, until the collapse plugin adds the appropriate classes that we use to style each element. These classes control the overall appearance, as well as the showing and hiding via CSS transitions. You can modify any of this with custom CSS or overriding our default variables. It's also worth noting that just about any HTML can go within the <code>.accordion-body</code>, though the transition does limit overflow.\n              </div>\n            </div>\n          </div>\n          <div class=\"accordion-item\">\n            <h4 class=\"accordion-header\">\n              <button class=\"accordion-button collapsed\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#collapseThree\" aria-expanded=\"false\" aria-controls=\"collapseThree\">\n                Accordion Item #3\n              </button>\n            </h4>\n            <div id=\"collapseThree\" class=\"accordion-collapse collapse\" data-bs-parent=\"#accordionExample\">\n              <div class=\"accordion-body\">\n                <strong>This is the third item's accordion body.</strong> It is hidden by default, until the collapse plugin adds the appropriate classes that we use to style each element. These classes control the overall appearance, as well as the showing and hiding via CSS transitions. You can modify any of this with custom CSS or overriding our default variables. It's also worth noting that just about any HTML can go within the <code>.accordion-body</code>, though the transition does limit overflow.\n              </div>\n            </div>\n          </div>\n        </div>\n        `} />\n      </div>\n    </article>\n    <article class=\"my-3\" id=\"alerts\">\n      <div class=\"bd-heading sticky-xl-top align-self-start mt-5 mb-3 mt-xl-0 mb-xl-2\">\n        <h3>Alerts</h3>\n        <a class=\"d-flex align-items-center\" href={getVersionedDocsPath('components/alerts')}>Documentation</a>\n      </div>\n\n      <div>\n        <Example showMarkup={false} code={getData('theme-colors').map((themeColor) => `\n        <div class=\"alert alert-${themeColor.name} alert-dismissible fade show\" role=\"alert\">\n          A simple ${themeColor.name} alert with <a href=\"#\" class=\"alert-link\">an example link</a>. Give it a click if you like.\n          <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"alert\" aria-label=\"Close\"></button>\n        </div>\n        `)} />\n\n        <Example showMarkup={false} code={`\n        <div class=\"alert alert-success\" role=\"alert\">\n          <h4 class=\"alert-heading\">Well done!</h4>\n          <p>Aww yeah, you successfully read this important alert message. This example text is going to run a bit longer so that you can see how spacing within an alert works with this kind of content.</p>\n          <hr>\n          <p class=\"mb-0\">Whenever you need to, be sure to use margin utilities to keep things nice and tidy.</p>\n        </div>\n        `} />\n      </div>\n    </article>\n    <article class=\"my-3\" id=\"badge\">\n      <div class=\"bd-heading sticky-xl-top align-self-start mt-5 mb-3 mt-xl-0 mb-xl-2\">\n        <h3>Badge</h3>\n        <a class=\"d-flex align-items-center\" href={getVersionedDocsPath('components/badge')}>Documentation</a>\n      </div>\n\n      <div>\n        <Example showMarkup={false} code={`\n        <p class=\"h1\">Example heading <span class=\"badge bg-primary\">New</span></p>\n        <p class=\"h2\">Example heading <span class=\"badge bg-secondary\">New</span></p>\n        <p class=\"h3\">Example heading <span class=\"badge bg-success\">New</span></p>\n        <p class=\"h4\">Example heading <span class=\"badge bg-danger\">New</span></p>\n        <p class=\"h5\">Example heading <span class=\"badge text-bg-warning\">New</span></p>\n        <p class=\"h6\">Example heading <span class=\"badge text-bg-info\">New</span></p>\n        <p class=\"h6\">Example heading <span class=\"badge text-bg-light\">New</span></p>\n        <p class=\"h6\">Example heading <span class=\"badge bg-dark\">New</span></p>\n        `} />\n\n        <Example showMarkup={false} code={getData('theme-colors').map((themeColor) => `\n        <span class=\"badge rounded-pill ${(themeColor.name === 'light' || themeColor.name === 'warning' || themeColor.name === 'info') ? 'text-' : ''}bg-${themeColor.name}\">${themeColor.title}</span>\n        `)} />\n      </div>\n    </article>\n    <article class=\"my-3\" id=\"breadcrumb\">\n      <div class=\"bd-heading sticky-xl-top align-self-start mt-5 mb-3 mt-xl-0 mb-xl-2\">\n        <h3>Breadcrumb</h3>\n        <a class=\"d-flex align-items-center\" href={getVersionedDocsPath('components/breadcrumb')}>Documentation</a>\n      </div>\n\n      <div>\n        <Example showMarkup={false} code={`\n        <nav aria-label=\"breadcrumb\">\n          <ol class=\"breadcrumb\">\n            <li class=\"breadcrumb-item\"><a href=\"#\">Home</a></li>\n            <li class=\"breadcrumb-item\"><a href=\"#\">Library</a></li>\n            <li class=\"breadcrumb-item active\" aria-current=\"page\">Data</li>\n          </ol>\n        </nav>\n        `} />\n      </div>\n    </article>\n    <article class=\"my-3\" id=\"buttons\">\n      <div class=\"bd-heading sticky-xl-top align-self-start mt-5 mb-3 mt-xl-0 mb-xl-2\">\n        <h3>Buttons</h3>\n        <a class=\"d-flex align-items-center\" href={getVersionedDocsPath('components/buttons')}>Documentation</a>\n      </div>\n      <div>\n        <Example showMarkup={false} code={[\n          ...getData('theme-colors').map((themeColor) => `\n          <button type=\"button\" class=\"btn btn-${themeColor.name}\">${themeColor.title}</button>\n          `),\n          `<button type=\"button\" class=\"btn btn-link\">Link</button>`]} />\n\n        <Example showMarkup={false} code={getData('theme-colors').map((themeColor) => `\n          <button type=\"button\" class=\"btn btn-outline-${themeColor.name}\">${themeColor.title}</button>\n          `)} />\n\n        <Example showMarkup={false} code={`\n          <button type=\"button\" class=\"btn btn-primary btn-sm\">Small button</button>\n          <button type=\"button\" class=\"btn btn-primary\">Standard button</button>\n          <button type=\"button\" class=\"btn btn-primary btn-lg\">Large button</button>\n          `} />\n      </div>\n    </article>\n    <article class=\"my-3\" id=\"button-group\">\n      <div class=\"bd-heading sticky-xl-top align-self-start mt-5 mb-3 mt-xl-0 mb-xl-2\">\n        <h3>Button group</h3>\n        <a class=\"d-flex align-items-center\" href={getVersionedDocsPath('components/button-group')}>Documentation</a>\n      </div>\n\n      <div>\n        <Example showMarkup={false} code={`\n        <div class=\"btn-toolbar\" role=\"toolbar\" aria-label=\"Toolbar with button groups\">\n          <div class=\"btn-group me-2\" role=\"group\" aria-label=\"First group\">\n            <button type=\"button\" class=\"btn btn-secondary\">1</button>\n            <button type=\"button\" class=\"btn btn-secondary\">2</button>\n            <button type=\"button\" class=\"btn btn-secondary\">3</button>\n            <button type=\"button\" class=\"btn btn-secondary\">4</button>\n          </div>\n          <div class=\"btn-group me-2\" role=\"group\" aria-label=\"Second group\">\n            <button type=\"button\" class=\"btn btn-secondary\">5</button>\n            <button type=\"button\" class=\"btn btn-secondary\">6</button>\n            <button type=\"button\" class=\"btn btn-secondary\">7</button>\n          </div>\n          <div class=\"btn-group\" role=\"group\" aria-label=\"Third group\">\n            <button type=\"button\" class=\"btn btn-secondary\">8</button>\n          </div>\n        </div>\n        `} />\n      </div>\n    </article>\n    <article class=\"my-3\" id=\"card\">\n      <div class=\"bd-heading sticky-xl-top align-self-start mt-5 mb-3 mt-xl-0 mb-xl-2\">\n        <h3>Card</h3>\n        <a class=\"d-flex align-items-center\" href={getVersionedDocsPath('components/card')}>Documentation</a>\n      </div>\n\n      <div>\n        <Example showMarkup={false} code={`\n          <div class=\"row  row-cols-1 row-cols-md-2 g-4\">\n            <div class=\"col\">\n              <div class=\"card\">\n                <Placeholder width=\"100%\" height=\"180\" class=\"card-img-top\" text=\"Image cap\" />\n                <div class=\"card-body\">\n                  <h5 class=\"card-title\">Card title</h5>\n                  <p class=\"card-text\">Some quick example text to build on the card title and make up the bulk of the card's content.</p>\n                  <a href=\"#\" class=\"btn btn-primary\">Go somewhere</a>\n                </div>\n              </div>\n            </div>\n            <div class=\"col\">\n              <div class=\"card\">\n                <div class=\"card-header\">\n                  Featured\n                </div>\n                <div class=\"card-body\">\n                  <h5 class=\"card-title\">Card title</h5>\n                  <p class=\"card-text\">Some quick example text to build on the card title and make up the bulk of the card's content.</p>\n                  <a href=\"#\" class=\"btn btn-primary\">Go somewhere</a>\n                </div>\n                <div class=\"card-footer text-body-secondary\">\n                  2 days ago\n                </div>\n              </div>\n            </div>\n            <div class=\"col\">\n              <div class=\"card\">\n                <div class=\"card-body\">\n                  <h5 class=\"card-title\">Card title</h5>\n                  <p class=\"card-text\">Some quick example text to build on the card title and make up the bulk of the card's content.</p>\n                </div>\n                <ul class=\"list-group list-group-flush\">\n                  <li class=\"list-group-item\">An item</li>\n                  <li class=\"list-group-item\">A second item</li>\n                  <li class=\"list-group-item\">A third item</li>\n                </ul>\n                <div class=\"card-body\">\n                  <a href=\"#\" class=\"card-link\">Card link</a>\n                  <a href=\"#\" class=\"card-link\">Another link</a>\n                </div>\n              </div>\n            </div>\n            <div class=\"col\">\n              <div class=\"card\">\n                <div class=\"row g-0\">\n                  <div class=\"col-md-4\">\n                    <Placeholder width=\"100%\" height=\"250\" text=\"Image\" />\n                  </div>\n                  <div class=\"col-md-8\">\n                    <div class=\"card-body\">\n                      <h5 class=\"card-title\">Card title</h5>\n                      <p class=\"card-text\">This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</p>\n                      <p class=\"card-text\"><small class=\"text-body-secondary\">Last updated 3 mins ago</small></p>\n                    </div>\n                  </div>\n                </div>\n              </div>\n            </div>\n          </div>\n          `} />\n      </div>\n    </article>\n    <article class=\"my-3\" id=\"carousel\">\n      <div class=\"bd-heading sticky-xl-top align-self-start mt-5 mb-3 mt-xl-0 mb-xl-2\">\n        <h3>Carousel</h3>\n        <a class=\"d-flex align-items-center\" href={getVersionedDocsPath('components/carousel')}>Documentation</a>\n      </div>\n\n      <div>\n        <Example showMarkup={false} code={`\n        <div id=\"carouselExampleCaptions\" class=\"carousel slide\" data-bs-ride=\"carousel\">\n          <div class=\"carousel-indicators\">\n            <button type=\"button\" data-bs-target=\"#carouselExampleCaptions\" data-bs-slide-to=\"0\" class=\"active\" aria-current=\"true\" aria-label=\"Slide 1\"></button>\n            <button type=\"button\" data-bs-target=\"#carouselExampleCaptions\" data-bs-slide-to=\"1\" aria-label=\"Slide 2\"></button>\n            <button type=\"button\" data-bs-target=\"#carouselExampleCaptions\" data-bs-slide-to=\"2\" aria-label=\"Slide 3\"></button>\n          </div>\n          <div class=\"carousel-inner\">\n            <div class=\"carousel-item active\">\n              <Placeholder width=\"800\" height=\"400\" class=\"bd-placeholder-img-lg d-block w-100\" color=\"#555\" background=\"#777\" text=\"First slide\" />\n              <div class=\"carousel-caption d-none d-md-block\">\n                <h5>First slide label</h5>\n                <p>Some representative placeholder content for the first slide.</p>\n              </div>\n            </div>\n            <div class=\"carousel-item\">\n              <Placeholder width=\"800\" height=\"400\" class=\"bd-placeholder-img-lg d-block w-100\" color=\"#444\" background=\"#666\" text=\"Second slide\" />\n              <div class=\"carousel-caption d-none d-md-block\">\n                <h5>Second slide label</h5>\n                <p>Some representative placeholder content for the second slide.</p>\n              </div>\n            </div>\n            <div class=\"carousel-item\">\n              <Placeholder width=\"800\" height=\"400\" class=\"bd-placeholder-img-lg d-block w-100\" color=\"#333\" background=\"#555\" text=\"Third slide\" />\n              <div class=\"carousel-caption d-none d-md-block\">\n                <h5>Third slide label</h5>\n                <p>Some representative placeholder content for the third slide.</p>\n              </div>\n            </div>\n          </div>\n          <button class=\"carousel-control-prev\" type=\"button\" data-bs-target=\"#carouselExampleCaptions\"  data-bs-slide=\"prev\">\n            <span class=\"carousel-control-prev-icon\" aria-hidden=\"true\"></span>\n            <span class=\"visually-hidden\">Previous</span>\n          </button>\n          <button class=\"carousel-control-next\" type=\"button\" data-bs-target=\"#carouselExampleCaptions\"  data-bs-slide=\"next\">\n            <span class=\"carousel-control-next-icon\" aria-hidden=\"true\"></span>\n            <span class=\"visually-hidden\">Next</span>\n          </button>\n        </div>\n        `} />\n      </div>\n    </article>\n    <article class=\"my-3\" id=\"dropdowns\">\n      <div class=\"bd-heading sticky-xl-top align-self-start mt-5 mb-3 mt-xl-0 mb-xl-2\">\n        <h3>Dropdowns</h3>\n        <a class=\"d-flex align-items-center\" href={getVersionedDocsPath('components/dropdowns')}>Documentation</a>\n      </div>\n      <div>\n        <Example showMarkup={false} code={`\n        <div class=\"btn-group w-100 align-items-center justify-content-between flex-wrap me-0\">\n          <div class=\"dropdown\">\n            <button class=\"btn btn-secondary btn-sm dropdown-toggle\" type=\"button\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n              Dropdown button\n            </button>\n            <ul class=\"dropdown-menu\">\n              <li><h6 class=\"dropdown-header\">Dropdown header</h6></li>\n              <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n              <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n              <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n              <li><hr class=\"dropdown-divider\"></li>\n              <li><a class=\"dropdown-item\" href=\"#\">Separated link</a></li>\n            </ul>\n          </div>\n          <div class=\"dropdown\">\n            <button class=\"btn btn-secondary dropdown-toggle\" type=\"button\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n              Dropdown button\n            </button>\n            <ul class=\"dropdown-menu\">\n              <li><h6 class=\"dropdown-header\">Dropdown header</h6></li>\n              <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n              <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n              <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n              <li><hr class=\"dropdown-divider\"></li>\n              <li><a class=\"dropdown-item\" href=\"#\">Separated link</a></li>\n            </ul>\n          </div>\n          <div class=\"dropdown\">\n            <button class=\"btn btn-secondary btn-lg dropdown-toggle\" type=\"button\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n              Dropdown button\n            </button>\n            <ul class=\"dropdown-menu\">\n              <li><h6 class=\"dropdown-header\">Dropdown header</h6></li>\n              <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n              <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n              <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n              <li><hr class=\"dropdown-divider\"></li>\n              <li><a class=\"dropdown-item\" href=\"#\">Separated link</a></li>\n            </ul>\n          </div>\n        </div>\n        `} />\n\n        <Example showMarkup={false} code={`\n          <div class=\"btn-group\">\n            <button type=\"button\" class=\"btn btn-primary\">Primary</button>\n            <button type=\"button\" class=\"btn btn-primary dropdown-toggle dropdown-toggle-split\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n              <span class=\"visually-hidden\">Toggle Dropdown</span>\n            </button>\n            <ul class=\"dropdown-menu\">\n              <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n              <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n              <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n            </ul>\n          </div><!-- /btn-group -->\n          <div class=\"btn-group\">\n            <button type=\"button\" class=\"btn btn-secondary\">Secondary</button>\n            <button type=\"button\" class=\"btn btn-secondary dropdown-toggle dropdown-toggle-split\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n              <span class=\"visually-hidden\">Toggle Dropdown</span>\n            </button>\n            <ul class=\"dropdown-menu\">\n              <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n              <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n              <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n            </ul>\n          </div><!-- /btn-group -->\n          <div class=\"btn-group\">\n            <button type=\"button\" class=\"btn btn-success\">Success</button>\n            <button type=\"button\" class=\"btn btn-success dropdown-toggle dropdown-toggle-split\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n              <span class=\"visually-hidden\">Toggle Dropdown</span>\n            </button>\n            <ul class=\"dropdown-menu\">\n              <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n              <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n              <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n            </ul>\n          </div><!-- /btn-group -->\n          <div class=\"btn-group\">\n            <button type=\"button\" class=\"btn btn-info\">Info</button>\n            <button type=\"button\" class=\"btn btn-info dropdown-toggle dropdown-toggle-split\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n              <span class=\"visually-hidden\">Toggle Dropdown</span>\n            </button>\n            <ul class=\"dropdown-menu\">\n              <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n              <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n              <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n            </ul>\n          </div><!-- /btn-group -->\n          <div class=\"btn-group\">\n            <button type=\"button\" class=\"btn btn-warning\">Warning</button>\n            <button type=\"button\" class=\"btn btn-warning dropdown-toggle dropdown-toggle-split\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n              <span class=\"visually-hidden\">Toggle Dropdown</span>\n            </button>\n            <ul class=\"dropdown-menu\">\n              <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n              <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n              <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n            </ul>\n          </div><!-- /btn-group -->\n          <div class=\"btn-group\">\n            <button type=\"button\" class=\"btn btn-danger\">Danger</button>\n            <button type=\"button\" class=\"btn btn-danger dropdown-toggle dropdown-toggle-split\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n              <span class=\"visually-hidden\">Toggle Dropdown</span>\n            </button>\n            <ul class=\"dropdown-menu\">\n              <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n              <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n              <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n            </ul>\n          </div><!-- /btn-group -->\n          `} />\n\n        <Example showMarkup={false} code={`\n          <div class=\"btn-group w-100 align-items-center justify-content-between flex-wrap me-0\">\n            <div class=\"dropend\">\n              <button class=\"btn btn-secondary dropdown-toggle\" type=\"button\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n                Dropend button\n              </button>\n              <ul class=\"dropdown-menu\">\n                <li><h6 class=\"dropdown-header\">Dropdown header</h6></li>\n                <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n                <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n                <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n                <li><hr class=\"dropdown-divider\"></li>\n                <li><a class=\"dropdown-item\" href=\"#\">Separated link</a></li>\n              </ul>\n            </div>\n            <div class=\"dropup\">\n              <button class=\"btn btn-secondary dropdown-toggle\" type=\"button\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n                Dropup button\n              </button>\n              <ul class=\"dropdown-menu\">\n                <li><h6 class=\"dropdown-header\">Dropdown header</h6></li>\n                <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n                <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n                <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n                <li><hr class=\"dropdown-divider\"></li>\n                <li><a class=\"dropdown-item\" href=\"#\">Separated link</a></li>\n              </ul>\n            </div>\n            <div class=\"dropstart\">\n              <button class=\"btn btn-secondary dropdown-toggle\" type=\"button\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n                Dropstart button\n              </button>\n              <ul class=\"dropdown-menu\">\n                <li><h6 class=\"dropdown-header\">Dropdown header</h6></li>\n                <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n                <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n                <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n                <li><hr class=\"dropdown-divider\"></li>\n                <li><a class=\"dropdown-item\" href=\"#\">Separated link</a></li>\n              </ul>\n            </div>\n          </div>\n          `} />\n\n        <Example showMarkup={false} code={`\n          <div class=\"btn-group\">\n            <div class=\"dropdown\">\n              <button class=\"btn btn-secondary dropdown-toggle\" type=\"button\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n                End-aligned menu\n              </button>\n              <ul class=\"dropdown-menu dropdown-menu-end\">\n                <li><h6 class=\"dropdown-header\">Dropdown header</h6></li>\n                <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n                <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n                <li><hr class=\"dropdown-divider\"></li>\n                <li><a class=\"dropdown-item\" href=\"#\">Separated link</a></li>\n              </ul>\n            </div>\n          </div>\n          `} />\n      </div>\n    </article>\n    <article class=\"my-3\" id=\"list-group\">\n      <div class=\"bd-heading sticky-xl-top align-self-start mt-5 mb-3 mt-xl-0 mb-xl-2\">\n        <h3>List group</h3>\n        <a class=\"d-flex align-items-center\" href={getVersionedDocsPath('components/list-group')}>Documentation</a>\n      </div>\n\n      <div>\n        <Example showMarkup={false} code={`\n        <ul class=\"list-group\">\n          <li class=\"list-group-item disabled\" aria-disabled=\"true\">A disabled item</li>\n          <li class=\"list-group-item\">A second item</li>\n          <li class=\"list-group-item\">A third item</li>\n          <li class=\"list-group-item\">A fourth item</li>\n          <li class=\"list-group-item\">And a fifth one</li>\n        </ul>\n        `} />\n\n        <Example showMarkup={false} code={`\n        <ul class=\"list-group list-group-flush\">\n          <li class=\"list-group-item\">An item</li>\n          <li class=\"list-group-item\">A second item</li>\n          <li class=\"list-group-item\">A third item</li>\n          <li class=\"list-group-item\">A fourth item</li>\n          <li class=\"list-group-item\">And a fifth one</li>\n        </ul>\n        `} />\n\n        <Example showMarkup={false} code={[`\n        <div class=\"list-group\">\n          <a href=\"#\" class=\"list-group-item list-group-item-action\">A simple default list group item</a>`,\n          ...getData('theme-colors').map((themeColor) => `\n          <a href=\"#\" class=\"list-group-item list-group-item-action list-group-item-${themeColor.name}\">A simple ${themeColor.name} list group item</a>\n          `),\n        `</div>\n        `]} />\n      </div>\n    </article>\n    <article class=\"my-3\" id=\"modal\">\n      <div class=\"bd-heading sticky-xl-top align-self-start mt-5 mb-3 mt-xl-0 mb-xl-2\">\n        <h3>Modal</h3>\n        <a class=\"d-flex align-items-center\" href={getVersionedDocsPath('components/modal')}>Documentation</a>\n      </div>\n\n      <div>\n        <Example showMarkup={false} code={`\n        <div class=\"d-flex justify-content-between flex-wrap\">\n          <button type=\"button\" class=\"btn btn-primary\" data-bs-toggle=\"modal\" data-bs-target=\"#exampleModalDefault\">\n            Launch demo modal\n          </button>\n          <button type=\"button\" class=\"btn btn-primary\" data-bs-toggle=\"modal\" data-bs-target=\"#staticBackdropLive\">\n            Launch static backdrop modal\n          </button>\n          <button type=\"button\" class=\"btn btn-primary\" data-bs-toggle=\"modal\" data-bs-target=\"#exampleModalCenteredScrollable\">\n            Vertically centered scrollable modal\n          </button>\n          <button type=\"button\" class=\"btn btn-primary\" data-bs-toggle=\"modal\" data-bs-target=\"#exampleModalFullscreen\">\n            Full screen\n          </button>\n        </div>\n        `} />\n      </div>\n    </article>\n    <article class=\"my-3\" id=\"navs\">\n      <div class=\"bd-heading sticky-xl-top align-self-start mt-5 mb-3 mt-xl-0 mb-xl-2\">\n        <h3>Navs</h3>\n        <a class=\"d-flex align-items-center\" href={getVersionedDocsPath('components/navs-tabs')}>Documentation</a>\n      </div>\n\n      <div>\n        <Example showMarkup={false} code={`\n        <nav class=\"nav\">\n          <a class=\"nav-link active\" aria-current=\"page\" href=\"#\">Active</a>\n          <a class=\"nav-link\" href=\"#\">Link</a>\n          <a class=\"nav-link\" href=\"#\">Link</a>\n          <a class=\"nav-link disabled\" aria-disabled=\"true\">Disabled</a>\n        </nav>\n        `} />\n\n        <Example showMarkup={false} code={`\n        <nav>\n          <div class=\"nav nav-tabs mb-3\" id=\"nav-tab\" role=\"tablist\">\n            <button class=\"nav-link active\" id=\"nav-home-tab\" data-bs-toggle=\"tab\" data-bs-target=\"#nav-home\" type=\"button\" role=\"tab\" aria-controls=\"nav-home\" aria-selected=\"true\">Home</button>\n            <button class=\"nav-link\" id=\"nav-profile-tab\" data-bs-toggle=\"tab\" data-bs-target=\"#nav-profile\" type=\"button\" role=\"tab\" aria-controls=\"nav-profile\" aria-selected=\"false\">Profile</button>\n            <button class=\"nav-link\" id=\"nav-contact-tab\" data-bs-toggle=\"tab\" data-bs-target=\"#nav-contact\" type=\"button\" role=\"tab\" aria-controls=\"nav-contact\" aria-selected=\"false\">Contact</button>\n          </div>\n        </nav>\n        <div class=\"tab-content\" id=\"nav-tabContent\">\n          <div class=\"tab-pane fade show active\" id=\"nav-home\" role=\"tabpanel\" aria-labelledby=\"nav-home-tab\">\n            <p>This is some placeholder content the <strong>Home tab's</strong> associated content. Clicking another tab will toggle the visibility of this one for the next. The tab JavaScript swaps classes to control the content visibility and styling. You can use it with tabs, pills, and any other <code>.nav</code>-powered navigation.</p>\n          </div>\n          <div class=\"tab-pane fade\" id=\"nav-profile\" role=\"tabpanel\" aria-labelledby=\"nav-profile-tab\">\n            <p>This is some placeholder content the <strong>Profile tab's</strong> associated content. Clicking another tab will toggle the visibility of this one for the next. The tab JavaScript swaps classes to control the content visibility and styling. You can use it with tabs, pills, and any other <code>.nav</code>-powered navigation.</p>\n          </div>\n          <div class=\"tab-pane fade\" id=\"nav-contact\" role=\"tabpanel\" aria-labelledby=\"nav-contact-tab\">\n            <p>This is some placeholder content the <strong>Contact tab's</strong> associated content. Clicking another tab will toggle the visibility of this one for the next. The tab JavaScript swaps classes to control the content visibility and styling. You can use it with tabs, pills, and any other <code>.nav</code>-powered navigation.</p>\n          </div>\n        </div>\n        `} />\n\n        <Example showMarkup={false} code={`\n        <ul class=\"nav nav-pills\">\n          <li class=\"nav-item\">\n            <a class=\"nav-link active\" aria-current=\"page\" href=\"#\">Active</a>\n          </li>\n          <li class=\"nav-item\">\n            <a class=\"nav-link\" href=\"#\">Link</a>\n          </li>\n          <li class=\"nav-item\">\n            <a class=\"nav-link\" href=\"#\">Link</a>\n          </li>\n          <li class=\"nav-item\">\n            <a class=\"nav-link disabled\" aria-disabled=\"true\">Disabled</a>\n          </li>\n        </ul>\n        `} />\n      </div>\n    </article>\n    <article class=\"my-3\" id=\"navbar\">\n      <div class=\"bd-heading sticky-xl-top align-self-start mt-5 mb-3 mt-xl-0 mb-xl-2\">\n        <h3>Navbar</h3>\n        <a class=\"d-flex align-items-center\" href={getVersionedDocsPath('components/navbar')}>Documentation</a>\n      </div>\n      <div>\n        <Example showMarkup={false} code={`\n          <nav class=\"navbar navbar-expand-lg bg-body-tertiary\">\n            <div class=\"container-fluid\">\n              <a class=\"navbar-brand\" href=\"#\">\n                <img src=\"${getVersionedDocsPath('/assets/brand/bootstrap-logo-white.svg')}\" width=\"38\" height=\"30\" class=\"d-inline-block align-top\" alt=\"Bootstrap\" loading=\"lazy\" style=\"filter: invert(1) grayscale(100%) brightness(200%);\">\n              </a>\n              <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbarSupportedContent\" aria-controls=\"navbarSupportedContent\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n                <span class=\"navbar-toggler-icon\"></span>\n              </button>\n              <div class=\"collapse navbar-collapse\" id=\"navbarSupportedContent\">\n                <ul class=\"navbar-nav me-auto mb-2 mb-lg-0\">\n                  <li class=\"nav-item\">\n                    <a class=\"nav-link active\" aria-current=\"page\" href=\"#\">Home</a>\n                  </li>\n                  <li class=\"nav-item\">\n                    <a class=\"nav-link\" href=\"#\">Link</a>\n                  </li>\n                  <li class=\"nav-item dropdown\">\n                    <a class=\"nav-link dropdown-toggle\" href=\"#\" role=\"button\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n                      Dropdown\n                    </a>\n                    <ul class=\"dropdown-menu\">\n                      <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n                      <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n                      <li><hr class=\"dropdown-divider\"></li>\n                      <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n                    </ul>\n                  </li>\n                  <li class=\"nav-item\">\n                    <a class=\"nav-link disabled\" aria-disabled=\"true\">Disabled</a>\n                  </li>\n                </ul>\n                <form class=\"d-flex\" role=\"search\">\n                  <input class=\"form-control me-2\" type=\"search\" placeholder=\"Search\" aria-label=\"Search\">\n                  <button class=\"btn btn-outline-dark\" type=\"submit\">Search</button>\n                </form>\n              </div>\n            </div>\n          </nav>\n\n          <nav class=\"navbar navbar-expand-lg navbar-dark bg-primary mt-5\">\n            <div class=\"container-fluid\">\n              <a class=\"navbar-brand\" href=\"#\">\n                <img src=\"${getVersionedDocsPath('/assets/brand/bootstrap-logo-white.svg')}\" width=\"38\" height=\"30\" class=\"d-inline-block align-top\" alt=\"Bootstrap\" loading=\"lazy\">\n              </a>\n              <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbarSupportedContent2\" aria-controls=\"navbarSupportedContent2\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n                <span class=\"navbar-toggler-icon\"></span>\n              </button>\n              <div class=\"collapse navbar-collapse\" id=\"navbarSupportedContent2\">\n                <ul class=\"navbar-nav me-auto mb-2 mb-lg-0\">\n                  <li class=\"nav-item\">\n                    <a class=\"nav-link active\" aria-current=\"page\" href=\"#\">Home</a>\n                  </li>\n                  <li class=\"nav-item\">\n                    <a class=\"nav-link\" href=\"#\">Link</a>\n                  </li>\n                  <li class=\"nav-item dropdown\">\n                    <a class=\"nav-link dropdown-toggle\" href=\"#\" role=\"button\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n                      Dropdown\n                    </a>\n                    <ul class=\"dropdown-menu\">\n                      <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n                      <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n                      <li><hr class=\"dropdown-divider\"></li>\n                      <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n                    </ul>\n                  </li>\n                  <li class=\"nav-item\">\n                    <a class=\"nav-link disabled\" aria-disabled=\"true\">Disabled</a>\n                  </li>\n                </ul>\n                <form class=\"d-flex\" role=\"search\">\n                  <input class=\"form-control me-2\" type=\"search\" placeholder=\"Search\" aria-label=\"Search\">\n                  <button class=\"btn btn-outline-light\" type=\"submit\">Search</button>\n                </form>\n              </div>\n            </div>\n          </nav>\n          `} />\n      </div>\n    </article>\n    <article class=\"my-3\" id=\"pagination\">\n      <div class=\"bd-heading sticky-xl-top align-self-start mt-5 mb-3 mt-xl-0 mb-xl-2\">\n        <h3>Pagination</h3>\n        <a class=\"d-flex align-items-center\" href={getVersionedDocsPath('components/pagination')}>Documentation</a>\n      </div>\n\n      <div>\n        <Example showMarkup={false} code={`\n        <nav aria-label=\"Pagination example\">\n          <ul class=\"pagination pagination-sm\">\n            <li class=\"page-item\"><a class=\"page-link\" href=\"#\">1</a></li>\n            <li class=\"page-item active\" aria-current=\"page\">\n              <a class=\"page-link\" href=\"#\">2</a>\n            </li>\n            <li class=\"page-item\"><a class=\"page-link\" href=\"#\">3</a></li>\n          </ul>\n        </nav>\n        `} />\n\n        <Example showMarkup={false} code={`\n        <nav aria-label=\"Standard pagination example\">\n          <ul class=\"pagination\">\n            <li class=\"page-item\">\n              <a class=\"page-link\" href=\"#\" aria-label=\"Previous\">\n                <span aria-hidden=\"true\">&laquo;</span>\n              </a>\n            </li>\n            <li class=\"page-item\"><a class=\"page-link\" href=\"#\">1</a></li>\n            <li class=\"page-item\"><a class=\"page-link\" href=\"#\">2</a></li>\n            <li class=\"page-item\"><a class=\"page-link\" href=\"#\">3</a></li>\n            <li class=\"page-item\">\n              <a class=\"page-link\" href=\"#\" aria-label=\"Next\">\n                <span aria-hidden=\"true\">&raquo;</span>\n              </a>\n            </li>\n          </ul>\n        </nav>\n        `} />\n\n        <Example showMarkup={false} code={`\n        <nav aria-label=\"Another pagination example\">\n          <ul class=\"pagination pagination-lg flex-wrap\">\n            <li class=\"page-item disabled\">\n              <a class=\"page-link\">Previous</a>\n            </li>\n            <li class=\"page-item\"><a class=\"page-link\" href=\"#\">1</a></li>\n            <li class=\"page-item active\" aria-current=\"page\">\n              <a class=\"page-link\" href=\"#\">2</a>\n            </li>\n            <li class=\"page-item\"><a class=\"page-link\" href=\"#\">3</a></li>\n            <li class=\"page-item\">\n              <a class=\"page-link\" href=\"#\">Next</a>\n            </li>\n          </ul>\n        </nav>\n        `} />\n      </div>\n    </article>\n    <article class=\"my-3\" id=\"popovers\">\n      <div class=\"bd-heading sticky-xl-top align-self-start mt-5 mb-3 mt-xl-0 mb-xl-2\">\n        <h3>Popovers</h3>\n        <a class=\"d-flex align-items-center\" href={getVersionedDocsPath('components/popovers')}>Documentation</a>\n      </div>\n\n      <div>\n        <Example showMarkup={false} code={`\n        <button type=\"button\" class=\"btn btn-lg btn-danger\" data-bs-toggle=\"popover\" title=\"Popover title\" data-bs-content=\"And here's some amazing content. It's very engaging. Right?\">Click to toggle popover</button>\n        `} />\n\n        <Example showMarkup={false} code={`\n        <button type=\"button\" class=\"btn btn-secondary\" data-bs-container=\"body\" data-bs-toggle=\"popover\" data-bs-placement=\"top\" data-bs-content=\"Vivamus sagittis lacus vel augue laoreet rutrum faucibus.\">\n          Popover on top\n        </button>\n        <button type=\"button\" class=\"btn btn-secondary\" data-bs-container=\"body\" data-bs-toggle=\"popover\" data-bs-placement=\"right\" data-bs-content=\"Vivamus sagittis lacus vel augue laoreet rutrum faucibus.\">\n          Popover on end\n        </button>\n        <button type=\"button\" class=\"btn btn-secondary\" data-bs-container=\"body\" data-bs-toggle=\"popover\" data-bs-placement=\"bottom\" data-bs-content=\"Vivamus sagittis lacus vel augue laoreet rutrum faucibus.\">\n          Popover on bottom\n        </button>\n        <button type=\"button\" class=\"btn btn-secondary\" data-bs-container=\"body\" data-bs-toggle=\"popover\" data-bs-placement=\"left\" data-bs-content=\"Vivamus sagittis lacus vel augue laoreet rutrum faucibus.\">\n          Popover on start\n        </button>\n        `} />\n      </div>\n    </article>\n    <article class=\"my-3\" id=\"progress\">\n      <div class=\"bd-heading sticky-xl-top align-self-start mt-5 mb-3 mt-xl-0 mb-xl-2\">\n        <h3>Progress</h3>\n        <a class=\"d-flex align-items-center\" href={getVersionedDocsPath('components/progress')}>Documentation</a>\n      </div>\n\n      <div>\n        <Example showMarkup={false} code={`\n        <div class=\"progress mb-3\" role=\"progressbar\" aria-label=\"Example with label\" aria-valuenow=\"0\" aria-valuemin=\"0\" aria-valuemax=\"100\">\n          <div class=\"progress-bar\">0%</div>\n        </div>\n        <div class=\"progress mb-3\" role=\"progressbar\" aria-label=\"Success example with label\" aria-valuenow=\"25\" aria-valuemin=\"0\" aria-valuemax=\"100\">\n          <div class=\"progress-bar bg-success w-25\">25%</div>\n        </div>\n        <div class=\"progress mb-3\" role=\"progressbar\" aria-label=\"Info example with label\" aria-valuenow=\"50\" aria-valuemin=\"0\" aria-valuemax=\"100\">\n          <div class=\"progress-bar text-bg-info w-50\">50%</div>\n        </div>\n        <div class=\"progress mb-3\" role=\"progressbar\" aria-label=\"Warning example with label\" aria-valuenow=\"75\" aria-valuemin=\"0\" aria-valuemax=\"100\">\n          <div class=\"progress-bar text-bg-warning w-75\">75%</div>\n        </div>\n        <div class=\"progress\" role=\"progressbar\" aria-label=\"Danger example with label\" aria-valuenow=\"100\" aria-valuemin=\"0\" aria-valuemax=\"100\">\n          <div class=\"progress-bar bg-danger w-100\">100%</div>\n        </div>\n        `} />\n\n        <Example showMarkup={false} code={`\n        <div class=\"progress-stacked\">\n          <div class=\"progress\" role=\"progressbar\" aria-label=\"Segment one - default example\" style=\"width: 15%\" aria-valuenow=\"15\" aria-valuemin=\"0\" aria-valuemax=\"100\">\n            <div class=\"progress-bar\"></div>\n          </div>\n          <div class=\"progress\" role=\"progressbar\" aria-label=\"Segment two - animated striped success example\" style=\"width: 40%\" aria-valuenow=\"40\" aria-valuemin=\"0\" aria-valuemax=\"100\">\n            <div class=\"progress-bar progress-bar-striped progress-bar-animated bg-success\"></div>\n          </div>\n        </div>\n        `} />\n      </div>\n    </article>\n    <article class=\"my-3\" id=\"scrollspy\">\n      <div class=\"bd-heading sticky-xl-top align-self-start mt-5 mb-3 mt-xl-0 mb-xl-2\">\n        <h3>Scrollspy</h3>\n        <a class=\"d-flex align-items-center\" href={getVersionedDocsPath('components/scrollspy')}>Documentation</a>\n      </div>\n\n      <div>\n        <Example showMarkup={false} code={`\n        <nav id=\"navbar-example2\" class=\"navbar bg-body-tertiary px-3\">\n          <a class=\"navbar-brand\" href=\"#\">Navbar</a>\n          <ul class=\"nav nav-pills\">\n            <li class=\"nav-item\">\n              <a class=\"nav-link active\" href=\"#scrollspyHeading1\">First</a>\n            </li>\n            <li class=\"nav-item\">\n              <a class=\"nav-link\" href=\"#scrollspyHeading2\">Second</a>\n            </li>\n            <li class=\"nav-item dropdown\">\n              <a class=\"nav-link dropdown-toggle\" data-bs-toggle=\"dropdown\" href=\"#\" role=\"button\" aria-expanded=\"false\">Dropdown</a>\n              <ul class=\"dropdown-menu\">\n                <li><a class=\"dropdown-item\" href=\"#scrollspyHeading3\">Third</a></li>\n                <li><a class=\"dropdown-item\" href=\"#scrollspyHeading4\">Fourth</a></li>\n                <li><hr class=\"dropdown-divider\"></li>\n                <li><a class=\"dropdown-item\" href=\"#scrollspyHeading5\">Fifth</a></li>\n              </ul>\n            </li>\n          </ul>\n        </nav>\n        <div data-bs-spy=\"scroll\" data-bs-target=\"#navbar-example2\" data-bs-offset=\"0\" class=\"scrollspy-example position-relative mt-2 overflow-auto\" tabindex=\"0\">\n          <h4 id=\"scrollspyHeading1\">First heading</h4>\n          <p>This is some placeholder content for the scrollspy page. Note that as you scroll down the page, the appropriate navigation link is highlighted. It's repeated throughout the component example. We keep adding some more example copy here to emphasize the scrolling and highlighting.</p>\n          <h4 id=\"scrollspyHeading2\">Second heading</h4>\n          <p>This is some placeholder content for the scrollspy page. Note that as you scroll down the page, the appropriate navigation link is highlighted. It's repeated throughout the component example. We keep adding some more example copy here to emphasize the scrolling and highlighting.</p>\n          <h4 id=\"scrollspyHeading3\">Third heading</h4>\n          <p>This is some placeholder content for the scrollspy page. Note that as you scroll down the page, the appropriate navigation link is highlighted. It's repeated throughout the component example. We keep adding some more example copy here to emphasize the scrolling and highlighting.</p>\n          <h4 id=\"scrollspyHeading4\">Fourth heading</h4>\n          <p>This is some placeholder content for the scrollspy page. Note that as you scroll down the page, the appropriate navigation link is highlighted. It's repeated throughout the component example. We keep adding some more example copy here to emphasize the scrolling and highlighting.</p>\n          <h4 id=\"scrollspyHeading5\">Fifth heading</h4>\n          <p>This is some placeholder content for the scrollspy page. Note that as you scroll down the page, the appropriate navigation link is highlighted. It's repeated throughout the component example. We keep adding some more example copy here to emphasize the scrolling and highlighting.</p>\n        </div>\n        `} />\n      </div>\n    </article>\n    <article class=\"my-3\" id=\"spinners\">\n      <div class=\"bd-heading sticky-xl-top align-self-start mt-5 mb-3 mt-xl-0 mb-xl-2\">\n        <h3>Spinners</h3>\n        <a class=\"d-flex align-items-center\" href={getVersionedDocsPath('components/spinners')}>Documentation</a>\n      </div>\n\n      <div>\n        <Example showMarkup={false} code={getData('theme-colors').map((themeColor) => `\n        <div class=\"spinner-border text-${themeColor.name}\" role=\"status\">\n          <span class=\"visually-hidden\">Loading...</span>\n        </div>\n        `)} />\n\n        <Example showMarkup={false} code={getData('theme-colors').map((themeColor) => `\n        <div class=\"spinner-grow text-${themeColor.name}\" role=\"status\">\n          <span class=\"visually-hidden\">Loading...</span>\n        </div>\n        `)} />\n      </div>\n    </article>\n    <article class=\"my-3\" id=\"toasts\">\n      <div class=\"bd-heading sticky-xl-top align-self-start mt-5 mb-3 mt-xl-0 mb-xl-2\">\n        <h3>Toasts</h3>\n        <a class=\"d-flex align-items-center\" href={getVersionedDocsPath('components/toasts')}>Documentation</a>\n      </div>\n\n      <div>\n        <Example showMarkup={false} class=\"bg-dark p-5 align-items-center\" code={`\n        <div class=\"toast\" role=\"alert\" aria-live=\"assertive\" aria-atomic=\"true\">\n          <div class=\"toast-header\">\n            <Placeholder width=\"20\" height=\"20\" background=\"#007aff\" class=\"rounded me-2\" text={false} title={false} />\n            <strong class=\"me-auto\">Bootstrap</strong>\n            <small class=\"text-body-secondary\">11 mins ago</small>\n            <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"toast\" aria-label=\"Close\"></button>\n          </div>\n          <div class=\"toast-body\">\n            Hello, world! This is a toast message.\n          </div>\n        </div>\n        `} />\n      </div>\n    </article>\n    <article class=\"mt-3 mb-5 pb-5\" id=\"tooltips\">\n      <div class=\"bd-heading sticky-xl-top align-self-start mt-5 mb-3 mt-xl-0 mb-xl-2\">\n        <h3>Tooltips</h3>\n        <a class=\"d-flex align-items-center\" href={getVersionedDocsPath('components/tooltips')}>Documentation</a>\n      </div>\n\n      <div>\n        <Example showMarkup={false} class=\"tooltip-demo\" code={`\n        <button type=\"button\" class=\"btn btn-secondary\" data-bs-toggle=\"tooltip\" data-bs-placement=\"top\" title=\"Tooltip on top\">Tooltip on top</button>\n        <button type=\"button\" class=\"btn btn-secondary\" data-bs-toggle=\"tooltip\" data-bs-placement=\"right\" title=\"Tooltip on end\">Tooltip on end</button>\n        <button type=\"button\" class=\"btn btn-secondary\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"Tooltip on bottom\">Tooltip on bottom</button>\n        <button type=\"button\" class=\"btn btn-secondary\" data-bs-toggle=\"tooltip\" data-bs-placement=\"left\" title=\"Tooltip on start\">Tooltip on start</button>\n        <button type=\"button\" class=\"btn btn-secondary\" data-bs-toggle=\"tooltip\" data-bs-html=\"true\" title=\"<em>Tooltip</em> <u>with</u> <b>HTML</b>\">Tooltip with HTML</button>\n        `} />\n      </div>\n    </article>\n  </section>\n</main>\n\n<div class=\"modal fade\" id=\"exampleModalDefault\" tabindex=\"-1\" aria-labelledby=\"exampleModalLabel\" aria-hidden=\"true\">\n  <div class=\"modal-dialog\">\n    <div class=\"modal-content\">\n      <div class=\"modal-header\">\n        <h1 class=\"modal-title fs-5\" id=\"exampleModalLabel\">Modal title</h1>\n        <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>\n      </div>\n      <div class=\"modal-body\">\n        ...\n      </div>\n      <div class=\"modal-footer\">\n        <button type=\"button\" class=\"btn btn-secondary\" data-bs-dismiss=\"modal\">Close</button>\n        <button type=\"button\" class=\"btn btn-primary\">Save changes</button>\n      </div>\n    </div>\n  </div>\n</div>\n<div class=\"modal fade\" id=\"staticBackdropLive\" data-bs-backdrop=\"static\" data-bs-keyboard=\"false\" tabindex=\"-1\" aria-labelledby=\"staticBackdropLiveLabel\" aria-hidden=\"true\">\n  <div class=\"modal-dialog\">\n    <div class=\"modal-content\">\n      <div class=\"modal-header\">\n        <h1 class=\"modal-title fs-5\" id=\"staticBackdropLiveLabel\">Modal title</h1>\n        <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>\n      </div>\n      <div class=\"modal-body\">\n        <p>I will not close if you click outside me. Don't even try to press escape key.</p>\n      </div>\n      <div class=\"modal-footer\">\n        <button type=\"button\" class=\"btn btn-secondary\" data-bs-dismiss=\"modal\">Close</button>\n        <button type=\"button\" class=\"btn btn-primary\">Understood</button>\n      </div>\n    </div>\n  </div>\n</div>\n<div class=\"modal fade\" id=\"exampleModalCenteredScrollable\" tabindex=\"-1\" aria-labelledby=\"exampleModalCenteredScrollableTitle\" aria-hidden=\"true\">\n  <div class=\"modal-dialog modal-dialog-centered modal-dialog-scrollable\">\n    <div class=\"modal-content\">\n      <div class=\"modal-header\">\n        <h1 class=\"modal-title fs-5\" id=\"exampleModalCenteredScrollableTitle\">Modal title</h1>\n        <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>\n      </div>\n      <div class=\"modal-body\">\n        <p>This is some placeholder content to show the scrolling behavior for modals. We use repeated line breaks to demonstrate how content can exceed minimum inner height, thereby showing inner scrolling. When content becomes longer than the predefined max-height of modal, content will be cropped and scrollable within the modal.</p>\n        <br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>\n        <p>This content should appear at the bottom after you scroll.</p>\n      </div>\n      <div class=\"modal-footer\">\n        <button type=\"button\" class=\"btn btn-secondary\" data-bs-dismiss=\"modal\">Close</button>\n        <button type=\"button\" class=\"btn btn-primary\">Save changes</button>\n      </div>\n    </div>\n  </div>\n</div>\n<div class=\"modal fade\" id=\"exampleModalFullscreen\" tabindex=\"-1\" aria-labelledby=\"exampleModalFullscreenLabel\" aria-hidden=\"true\">\n  <div class=\"modal-dialog modal-fullscreen\">\n    <div class=\"modal-content\">\n      <div class=\"modal-header\">\n        <h1 class=\"modal-title fs-4\" id=\"exampleModalFullscreenLabel\">Full screen modal</h1>\n        <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>\n      </div>\n      <div class=\"modal-body\">\n        ...\n      </div>\n      <div class=\"modal-footer\">\n        <button type=\"button\" class=\"btn btn-secondary\" data-bs-dismiss=\"modal\">Close</button>\n      </div>\n    </div>\n  </div>\n</div>\n\n"
  },
  {
    "path": "site/src/assets/examples/cheatsheet-rtl/index.astro",
    "content": "---\nimport { getData } from '@libs/data'\nimport { getVersionedDocsPath } from '@libs/path'\nimport Example from '@shortcodes/Example.astro'\n\nexport const title = 'ورقة الغش'\nexport const extra_css = ['../cheatsheet/cheatsheet.rtl.css']\nexport const extra_js = [{src: '../cheatsheet/cheatsheet.js'}]\nexport const body_class = 'bg-body-tertiary'\nexport const direction = 'rtl'\nimport Placeholder from \"@shortcodes/Placeholder.astro\"\n---\n\n<header class=\"bd-header bg-dark py-3 d-flex align-items-stretch border-bottom border-dark\">\n  <div class=\"container-fluid d-flex align-items-center\">\n    <h1 class=\"d-flex align-items-center fs-4 text-white mb-0\">\n      <img src={getVersionedDocsPath('/assets/brand/bootstrap-logo-white.svg')} width=\"38\" height=\"30\" class=\"me-3\" alt=\"Bootstrap\">\n      ورقة الغش\n    </h1>\n    <a href={getVersionedDocsPath('examples/cheatsheet/')} class=\"ms-auto link-light\" hreflang=\"en\">جدول بيانات LTR</a>\n  </div>\n</header>\n<aside class=\"bd-aside sticky-xl-top text-body-secondary align-self-start mb-3 mb-xl-5 px-2\">\n  <h2 class=\"h6 pt-4 pb-3 mb-4 border-bottom\">على هذه الصفحة</h2>\n  <nav class=\"small\" id=\"toc\">\n    <ul class=\"list-unstyled\">\n      <li class=\"my-2\">\n        <button type=\"button\" class=\"btn d-inline-flex align-items-center collapsed border-0\" data-bs-toggle=\"collapse\" aria-expanded=\"false\" data-bs-target=\"#contents-collapse\" aria-controls=\"contents-collapse\">المحتوى</button>\n        <ul class=\"list-unstyled ps-3 collapse\" id=\"contents-collapse\">\n          <li><a class=\"d-inline-flex align-items-center rounded text-decoration-none\" href=\"#typography\">النصوص</a></li>\n          <li><a class=\"d-inline-flex align-items-center rounded text-decoration-none\" href=\"#images\">الصور</a></li>\n          <li><a class=\"d-inline-flex align-items-center rounded text-decoration-none\" href=\"#tables\">الجداول</a></li>\n          <li><a class=\"d-inline-flex align-items-center rounded text-decoration-none\" href=\"#figures\">النماذج البيانية</a></li>\n        </ul>\n      </li>\n      <li class=\"my-2\">\n        <button type=\"button\" class=\"btn d-inline-flex align-items-center collapsed border-0\" data-bs-toggle=\"collapse\" aria-expanded=\"false\" data-bs-target=\"#forms-collapse\" aria-controls=\"forms-collapse\">النماذج</button>\n        <ul class=\"list-unstyled ps-3 collapse\" id=\"forms-collapse\">\n          <li><a class=\"d-inline-flex align-items-center rounded text-decoration-none\" href=\"#overview\">نظرة عامة</a></li>\n          <li><a class=\"d-inline-flex align-items-center rounded text-decoration-none\" href=\"#disabled-forms\">الحقول المعطلة</a></li>\n          <li><a class=\"d-inline-flex align-items-center rounded text-decoration-none\" href=\"#sizing\">الأحجام</a></li>\n          <li><a class=\"d-inline-flex align-items-center rounded text-decoration-none\" href=\"#input-group\">مجموعة الإدخال</a></li>\n          <li><a class=\"d-inline-flex align-items-center rounded text-decoration-none\" href=\"#floating-labels\">الحقول ذوي العناوين العائمة</a></li>\n          <li><a class=\"d-inline-flex align-items-center rounded text-decoration-none\" href=\"#validation\">التحقق</a></li>\n        </ul>\n      </li>\n      <li class=\"my-2\">\n        <button type=\"button\" class=\"btn d-inline-flex align-items-center collapsed border-0\" data-bs-toggle=\"collapse\" aria-expanded=\"false\" data-bs-target=\"#components-collapse\" aria-controls=\"components-collapse\">مكونات</button>\n        <ul class=\"list-unstyled ps-3 collapse\" id=\"components-collapse\">\n          <li><a class=\"d-inline-flex align-items-center rounded text-decoration-none\" href=\"#accordion\">المطوية</a></li>\n          <li><a class=\"d-inline-flex align-items-center rounded text-decoration-none\" href=\"#alerts\">الإنذارات</a></li>\n          <li><a class=\"d-inline-flex align-items-center rounded text-decoration-none\" href=\"#badge\">الشارة</a></li>\n          <li><a class=\"d-inline-flex align-items-center rounded text-decoration-none\" href=\"#breadcrumb\">مسار التنقل التفصيلي</a></li>\n          <li><a class=\"d-inline-flex align-items-center rounded text-decoration-none\" href=\"#buttons\">الأزرار</a></li>\n          <li><a class=\"d-inline-flex align-items-center rounded text-decoration-none\" href=\"#button-group\">مجموعة الأزرار</a></li>\n          <li><a class=\"d-inline-flex align-items-center rounded text-decoration-none\" href=\"#card\">البطاقة</a></li>\n          <li><a class=\"d-inline-flex align-items-center rounded text-decoration-none\" href=\"#carousel\">شرائح العرض</a></li>\n          <li><a class=\"d-inline-flex align-items-center rounded text-decoration-none\" href=\"#dropdowns\">القوائم المنسدلة</a></li>\n          <li><a class=\"d-inline-flex align-items-center rounded text-decoration-none\" href=\"#list-group\">مجموعة العناصر</a></li>\n          <li><a class=\"d-inline-flex align-items-center rounded text-decoration-none\" href=\"#modal\">الصندوق العائم</a></li>\n          <li><a class=\"d-inline-flex align-items-center rounded text-decoration-none\" href=\"#navs\">التنقل</a></li>\n          <li><a class=\"d-inline-flex align-items-center rounded text-decoration-none\" href=\"#navbar\">شريط التنقل</a></li>\n          <li><a class=\"d-inline-flex align-items-center rounded text-decoration-none\" href=\"#pagination\">ترقيم الصفحات</a></li>\n          <li><a class=\"d-inline-flex align-items-center rounded text-decoration-none\" href=\"#popovers\">الصناديق المنبثقة</a></li>\n          <li><a class=\"d-inline-flex align-items-center rounded text-decoration-none\" href=\"#progress\">شريط التقدم</a></li>\n          <li><a class=\"d-inline-flex align-items-center rounded text-decoration-none\" href=\"#scrollspy\">المخطوطة</a></li>\n          <li><a class=\"d-inline-flex align-items-center rounded text-decoration-none\" href=\"#spinners\">الدوائر المتحركة</a></li>\n          <li><a class=\"d-inline-flex align-items-center rounded text-decoration-none\" href=\"#toasts\">الإشعارات</a></li>\n          <li><a class=\"d-inline-flex align-items-center rounded text-decoration-none\" href=\"#tooltips\">التلميحات</a></li>\n        </ul>\n      </li>\n    </ul>\n  </nav>\n</aside>\n<main class=\"bd-cheatsheet container-fluid bg-body\">\n  <section id=\"content\">\n    <h2 class=\"sticky-xl-top fw-bold pt-3 pt-xl-5 pb-2 pb-xl-3\">المحتوى</h2>\n\n    <article class=\"my-3\" id=\"typography\">\n      <div class=\"bd-heading sticky-xl-top align-self-start mt-5 mb-3 mt-xl-0 mb-xl-2\">\n        <h3>النصوص</h3>\n        <a class=\"d-flex align-items-center\" hreflang=\"en\" href={getVersionedDocsPath('content/typography')}>دليل الإستخدام</a>\n      </div>\n\n      <div>\n        <Example showMarkup={false} code={`\n        <p class=\"display-1\">العرض 1</p>\n        <p class=\"display-2\">العرض 2</p>\n        <p class=\"display-3\">العرض 3</p>\n        <p class=\"display-4\">العرض 4</p>\n        <p class=\"display-5\">العرض 5</p>\n        <p class=\"display-6\">العرض 6</p>\n        `} />\n\n        <Example showMarkup={false} code={`\n        <p class=\"h1\">عنوان 1</p>\n        <p class=\"h2\">عنوان 2</p>\n        <p class=\"h3\">عنوان 3</p>\n        <p class=\"h4\">عنوان 4</p>\n        <p class=\"h5\">عنوان 5</p>\n        <p class=\"h6\">عنوان 6</p>\n        `} />\n\n        <Example showMarkup={false} code={`\n        <p class=\"lead\">\n          هذه قطعة إملائية متميزة، فهي مصممة لتكون بارزة من بين القطع الإملائية الأخرى.\n        </p>\n        `} />\n\n        <Example showMarkup={false} code={`\n        <p>يمكنك استخدام تصنيف mark <mark>لتحديد</mark> نص.</p>\n        <p><del>من المفترض أن يتم التعامل مع هذا السطر كنص محذوف.</del></p>\n        <p><s>من المفترض أن يتم التعامل مع هذا السطر على أنه لم يعد دقيقًا.</s></p>\n        <p><ins>من المفترض أن يتم التعامل مع هذا السطر كإضافة إلى المستند.</ins></p>\n        <p><u>سيتم عرض النص في هذا السطر كما وتحته خط.</u></p>\n        <p><small>من المفترض أن يتم التعامل مع هذا السطر على أنه يحوي تفاصيل صغيرة.</small></p>\n        <p><strong>هذا السطر يحوي نص عريض.</strong></p>\n        <p><em>هذا السطر يحوي نص مائل.</em></p>\n        `} />\n\n        <Example showMarkup={false} code={`\n        <hr>\n        `} />\n\n        <Example showMarkup={false} code={`\n        <blockquote class=\"blockquote\">\n          <p>إقتباس مبهر، موضوع في عنصر blockquote</p>\n          <footer class=\"blockquote-footer\">شخص مشهور في <cite title= \"عنوان المصدر\"> عنوان المصدر </cite></footer>\n        </blockquote>\n        `} />\n\n        <Example showMarkup={false} code={`\n        <ul class=\"list-unstyled\">\n          <li>هذه قائمة عناصر.</li>\n          <li>بالرغم من أنها مصممة كي لا تظهر كذلك.</li>\n          <li>إلا أنها مجهزة كـ قائمة خلف الكواليس</li>\n          <li>هذا التصميم ينطبق فقد على القائمة الرئيسية</li>\n          <li>القوائم الفرعية\n            <ul>\n              <li>لا تتأثر بهذا التصميم</li>\n              <li>فهي تظهر عليها علامات الترقيم</li>\n              <li>وتحتوي على مساحة فارغة بجوارها</li>\n            </ul>\n          </li>\n          <li>قد يكون هذا التصميم مفيدًا في بعض الأحيان.</li>\n        </ul>\n        `} />\n\n        <Example showMarkup={false} code={`\n        <ul class=\"list-inline\">\n          <li class=\"list-inline-item\">هذا عنصر في قائمة.</li>\n          <li class=\"list-inline-item\">وهذا أيضًا.</li>\n          <li class=\"list-inline-item\">لكنهم يظهرون متجاورين.</li>\n        </ul>\n        `} />\n      </div>\n    </article>\n    <article class=\"my-3\" id=\"images\">\n      <div class=\"bd-heading sticky-xl-top align-self-start mt-5 mb-3 mt-xl-0 mb-xl-2\">\n        <h3>الصور</h3>\n        <a class=\"d-flex align-items-center\" hreflang=\"en\" href={getVersionedDocsPath('content/images')}>دليل الإستخدام</a>\n      </div>\n\n      <div>\n        <Example showMarkup={false} code={`\n        <Placeholder width=\"100%\" height=\"250\" class=\"bd-placeholder-img-lg img-fluid\" text=\"صورة مستجيبة\" />\n        `} />\n\n        <Example showMarkup={false} code={`\n        <Placeholder width=\"200\" height=\"200\" class=\"img-thumbnail\" title=\"صورة عنصر نائب مربع عام مع حدود بيضاء حولها ، مما يجعلها تشبه صورة تم التقاطها بكاميرا فورية قديمة\" />\n        `} />\n      </div>\n    </article>\n    <article class=\"my-3\" id=\"tables\">\n      <div class=\"bd-heading sticky-xl-top align-self-start mt-5 mb-3 mt-xl-0 mb-xl-2\">\n        <h3>الجداول</h3>\n        <a class=\"d-flex align-items-center\" hreflang=\"en\" href={getVersionedDocsPath('content/tables')}>دليل الإستخدام</a>\n      </div>\n\n      <div>\n        <Example showMarkup={false} code={`\n        <table class=\"table table-striped\">\n          <thead>\n          <tr>\n            <th scope=\"col\">#</th>\n            <th scope=\"col\">الاسم الاول</th>\n            <th scope=\"col\">الكنية</th>\n            <th scope=\"col\">الاسم المستعار</th>\n          </tr>\n          </thead>\n          <tbody>\n          <tr>\n            <th scope=\"row\">1</th>\n            <td>Mark</td>\n            <td>Otto</td>\n            <td><bdo lang=\"en\" dir=\"ltr\">@mdo</bdo></td>\n          </tr>\n          <tr>\n            <th scope=\"row\">2</th>\n            <td>Jacob</td>\n            <td>Thornton</td>\n            <td><bdo lang=\"en\" dir=\"ltr\">@fat</bdo></td>\n          </tr>\n          <tr>\n            <th scope=\"row\">3</th>\n            <td>John</td>\n            <td>Doe</td>\n            <td><bdo lang=\"en\" dir=\"ltr\">@social</bdo></td>\n          </tr>\n          </tbody>\n        </table>\n        `} />\n\n        <Example showMarkup={false} code={`\n        <table class=\"table table-dark table-borderless\">\n          <thead>\n          <tr>\n            <th scope=\"col\">#</th>\n            <th scope=\"col\">الاسم الاول</th>\n            <th scope=\"col\">الكنية</th>\n            <th scope=\"col\">الاسم المستعار</th>\n          </tr>\n          </thead>\n          <tbody>\n          <tr>\n            <th scope=\"row\">1</th>\n            <td>Mark</td>\n            <td>Otto</td>\n            <td><bdo lang=\"en\" dir=\"ltr\">@mdo</bdo></td>\n          </tr>\n          <tr>\n            <th scope=\"row\">2</th>\n            <td>Jacob</td>\n            <td>Thornton</td>\n            <td><bdo lang=\"en\" dir=\"ltr\">@fat</bdo></td>\n          </tr>\n          <tr>\n            <th scope=\"row\">3</th>\n            <td>John</td>\n            <td>Doe</td>\n            <td><bdo lang=\"en\" dir=\"ltr\">@social</bdo></td>\n          </tr>\n          </tbody>\n        </table>\n        `} />\n\n        <Example showMarkup={false} code={[`\n        <table class=\"table table-hover\">\n          <thead>\n          <tr>\n            <th scope=\"col\">Class</th>\n            <th scope=\"col\">عنوان</th>\n            <th scope=\"col\">عنوان</th>\n          </tr>\n          </thead>\n          <tbody>\n          <tr>\n            <th scope=\"row\">Default</th>\n            <td>خلية</td>\n            <td>خلية</td>\n          </tr>`,\n          ...getData('theme-colors').map((themeColor) => `<tr class=\"table-${themeColor.name}\">\n            <th scope=\"row\">${themeColor.title}</th>\n            <td>خلية</td>\n            <td>خلية</td>\n          </tr>`),\n          `</tbody>\n        </table>\n        `]} />\n\n        <Example showMarkup={false} code={`\n        <table class=\"table table-sm table-bordered\">\n          <thead>\n          <tr>\n            <th scope=\"col\">#</th>\n            <th scope=\"col\">الاسم الاول</th>\n            <th scope=\"col\">الكنية</th>\n            <th scope=\"col\">الاسم المستعار</th>\n          </tr>\n          </thead>\n          <tbody>\n          <tr>\n            <th scope=\"row\">1</th>\n            <td>Mark</td>\n            <td>Otto</td>\n            <td><bdo lang=\"en\" dir=\"ltr\">@mdo</bdo></td>\n          </tr>\n          <tr>\n            <th scope=\"row\">2</th>\n            <td>Jacob</td>\n            <td>Thornton</td>\n            <td><bdo lang=\"en\" dir=\"ltr\">@fat</bdo></td>\n          </tr>\n          <tr>\n            <th scope=\"row\">3</th>\n            <td>John</td>\n            <td>Doe</td>\n            <td><bdo lang=\"en\" dir=\"ltr\">@social</bdo></td>\n          </tr>\n          </tbody>\n        </table>\n        `} />\n      </div>\n    </article>\n    <article class=\"my-3\" id=\"figures\">\n      <div class=\"bd-heading sticky-xl-top align-self-start mt-5 mb-3 mt-xl-0 mb-xl-2\">\n        <h3>النماذج البيانية</h3>\n        <a class=\"d-flex align-items-center\" hreflang=\"en\" href={getVersionedDocsPath('content/figures')}>دليل الإستخدام</a>\n      </div>\n\n      <div>\n        <Example showMarkup={false} code={`\n        <figure class=\"figure\">\n          <Placeholder width=\"400\" height=\"300\" class=\"figure-img img-fluid rounded\" />\n          <figcaption class=\"figure-caption\">شرح للصورة أعلاه.</figcaption>\n        </figure>\n        `} />\n      </div>\n    </article>\n  </section>\n\n  <section id=\"forms\">\n    <h2 class=\"sticky-xl-top fw-bold pt-3 pt-xl-5 pb-2 pb-xl-3\">النماذج</h2>\n\n    <article class=\"my-3\" id=\"overview\">\n      <div class=\"bd-heading sticky-xl-top align-self-start mt-5 mb-3 mt-xl-0 mb-xl-2\">\n        <h3>نظرة عامة</h3>\n        <a class=\"d-flex align-items-center\" hreflang=\"en\" href={getVersionedDocsPath('forms/overview/')}>دليل الإستخدام</a>\n      </div>\n\n      <div>\n        <Example showMarkup={false} code={`\n        <form>\n          <div class=\"mb-3\">\n            <label for=\"exampleInputEmail1\" class=\"form-label\">البريد الإلكتروني</label>\n            <input type=\"email\" class=\"form-control\" id=\"exampleInputEmail1\" aria-describedby=\"emailHelp\">\n            <div id=\"emailHelp\" class=\"form-text\">لن نقوم بمشاركة بريدك الإلكتروني مع أي شخص آخر.</div>\n          </div>\n          <div class=\"mb-3\">\n            <label for=\"exampleInputPassword1\" class=\"form-label\">كلمة السر</label>\n            <input type=\"password\" class=\"form-control\" id=\"exampleInputPassword1\">\n          </div>\n          <div class=\"mb-3\">\n            <label for=\"exampleSelect\" class=\"form-label\">قائمة اختيار</label>\n            <select class=\"form-select\" id=\"exampleSelect\">\n              <option selected>افتح قائمة الاختيار هذه</option>\n              <option value=\"1\">واحد</option>\n              <option value=\"2\">اثنان</option>\n              <option value=\"3\">ثلاثة</option>\n            </select>\n          </div>\n          <div class=\"mb-3 form-check\">\n            <input type=\"checkbox\" class=\"form-check-input\" id=\"exampleCheck1\">\n            <label class=\"form-check-label\" for=\"exampleCheck1\">اخترني</label>\n          </div>\n          <fieldset class=\"mb-3\">\n            <legend>أزرار الاختيار الأحادي</legend>\n            <div class=\"form-check\">\n              <input type=\"radio\" name=\"radios\" class=\"form-check-input\" id=\"exampleRadio1\" checked>\n              <label class=\"form-check-label\" for=\"exampleRadio1\">الخيار الافتراضي</label>\n            </div>\n            <div class=\"mb-3 form-check\">\n              <input type=\"radio\" name=\"radios\" class=\"form-check-input\" id=\"exampleRadio2\">\n              <label class=\"form-check-label\" for=\"exampleRadio2\">خيار آخر</label>\n            </div>\n          </fieldset>\n          <div class=\"mb-3\">\n            <label class=\"form-label\" for=\"customFile\">رفع</label>\n            <input type=\"file\" class=\"form-control\" id=\"customFile\">\n          </div>\n          <div class=\"mb-3 form-check form-switch\">\n            <input class=\"form-check-input\" type=\"checkbox\" role=\"switch\" id=\"switchCheckChecked\" checked>\n            <label class=\"form-check-label\" for=\"switchCheckChecked\">زر على شكل مفتاح اختيار.</label>\n          </div>\n          <div class=\"mb-3\">\n            <label for=\"customRange3\" class=\"form-label\">مثال على حقل اختيار نطاقي</label>\n            <input type=\"range\" class=\"form-range\" min=\"0\" max=\"5\" step=\"0.5\" id=\"customRange3\">\n          </div>\n          <button type=\"submit\" class=\"btn btn-primary\">إرسال</button>\n        </form>\n        `} />\n      </div>\n    </article>\n    <article class=\"my-3\" id=\"disabled-forms\">\n      <div class=\"bd-heading sticky-xl-top align-self-start mt-5 mb-3 mt-xl-0 mb-xl-2\">\n        <h3>الحقول المعطلة</h3>\n        <a class=\"d-flex align-items-center\" hreflang=\"en\" href={getVersionedDocsPath('forms/overview/#disabled-forms')}>دليل الإستخدام</a>\n      </div>\n\n      <div>\n        <Example showMarkup={false} code={`\n        <form>\n          <fieldset disabled aria-label=\"مثال على مجموعة الحقول المعطلة\">\n            <div class=\"mb-3\">\n              <label for=\"disabledTextInput\" class=\"form-label\">حقل إدخال معطل</label>\n              <input type=\"text\" id=\"disabledTextInput\" class=\"form-control\" placeholder=\"حقل إدخال معطل\">\n            </div>\n            <div class=\"mb-3\">\n              <label for=\"disabledSelect\" class=\"form-label\">قائمة اختيار معطلة</label>\n              <select id=\"disabledSelect\" class=\"form-select\">\n                <option>خيار معطل</option>\n              </select>\n            </div>\n            <div class=\"mb-3\">\n              <div class=\"form-check\">\n                <input class=\"form-check-input\" type=\"checkbox\" id=\"disabledFieldsetCheck\" disabled>\n                <label class=\"form-check-label\" for=\"disabledFieldsetCheck\">\n                  زر اختيار معطل\n                </label>\n              </div>\n            </div>\n            <fieldset class=\"mb-3\">\n              <legend>أزرار اختيار أحادي معطلين</legend>\n              <div class=\"form-check\">\n                <input type=\"radio\" name=\"radios\" class=\"form-check-input\" id=\"disabledRadio1\" disabled>\n                <label class=\"form-check-label\" for=\"disabledRadio1\">خيار معطل</label>\n              </div>\n              <div class=\"mb-3 form-check\">\n                <input type=\"radio\" name=\"radios\" class=\"form-check-input\" id=\"disabledRadio2\" disabled>\n                <label class=\"form-check-label\" for=\"disabledRadio2\">خيار آخر معطل</label>\n              </div>\n            </fieldset>\n            <div class=\"mb-3\">\n              <label class=\"form-label\" for=\"disabledCustomFile\">رفع معطل</label>\n              <input type=\"file\" class=\"form-control\" id=\"disabledCustomFile\" disabled>\n            </div>\n            <div class=\"mb-3 form-check form-switch\">\n              <input class=\"form-check-input\" type=\"checkbox\" role=\"switch\" id=\"disabledSwitchCheckChecked\" checked disabled>\n              <label class=\"form-check-label\" for=\"disabledSwitchCheckChecked\">زر معطل على شكل مفتاح اختيار.</label>\n            </div>\n            <div class=\"mb-3\">\n              <label for=\"disabledRange\" class=\"form-label\">حقل اختيار نطاقي معطل</label>\n              <input type=\"range\" class=\"form-range\" min=\"0\" max=\"5\" step=\"0.5\" id=\"disabledRange\">\n            </div>\n            <button type=\"submit\" class=\"btn btn-primary\">إرسال</button>\n          </fieldset>\n        </form>\n        `} />\n      </div>\n    </article>\n    <article class=\"my-3\" id=\"sizing\">\n      <div class=\"bd-heading sticky-xl-top align-self-start mt-5 mb-3 mt-xl-0 mb-xl-2\">\n        <h3>الأحجام</h3>\n        <a class=\"d-flex align-items-center\" hreflang=\"en\" href={getVersionedDocsPath('forms/form-control#sizing')}>دليل الإستخدام</a>\n      </div>\n\n      <div>\n        <Example showMarkup={false} code={`\n        <div class=\"mb-3\">\n          <input class=\"form-control form-control-lg\" type=\"text\" placeholder=\"حقل إدخال كبير\" aria-label=\".form-control-lg مثال\">\n        </div>\n        <div class=\"mb-3\">\n          <select class=\"form-select form-select-lg\" aria-label=\".form-select-lg مثال\">\n            <option selected>افتح قائمة الاختيار هذه</option>\n            <option value=\"1\">واحد</option>\n            <option value=\"2\">اثنان</option>\n            <option value=\"3\">ثلاثة</option>\n          </select>\n        </div>\n        <div class=\"mb-3\">\n          <input type=\"file\" class=\"form-control form-control-lg\" aria-label=\"مثال على إدخال ملف كبير\">\n        </div>\n        `} />\n\n        <Example showMarkup={false} code={`\n        <div class=\"mb-3\">\n          <input class=\"form-control form-control-sm\" type=\"text\" placeholder=\"حقل إدخال صغير\" aria-label=\".form-control-sm مثال\">\n        </div>\n        <div class=\"mb-3\">\n          <select class=\"form-select form-select-sm\" aria-label=\".form-select-sm مثال\">\n            <option selected>افتح قائمة الاختيار هذه</option>\n            <option value=\"1\">واحد</option>\n            <option value=\"2\">اثنان</option>\n            <option value=\"3\">ثلاثة</option>\n          </select>\n        </div>\n        <div class=\"mb-3\">\n          <input type=\"file\" class=\"form-control form-control-sm\" aria-label=\"مثال على إدخال ملف صغير\">\n        </div>\n        `} />\n      </div>\n    </article>\n    <article class=\"my-3\" id=\"input-group\">\n      <div class=\"bd-heading sticky-xl-top align-self-start mt-5 mb-3 mt-xl-0 mb-xl-2\">\n        <h3>مجموعة الإدخال</h3>\n        <a class=\"d-flex align-items-center\" hreflang=\"en\" href={getVersionedDocsPath('forms/input-group')}>دليل الإستخدام</a>\n      </div>\n\n      <div>\n        <Example showMarkup={false} code={`\n        <div class=\"input-group mb-3\">\n          <span class=\"input-group-text\" id=\"basic-addon1\">أنا اسمي</span>\n          <input type=\"text\" class=\"form-control\" placeholder=\"فلان الفلاني\" aria-label=\"الاسم\" aria-describedby=\"basic-addon1\">\n        </div>\n        <div class=\"input-group mb-3\">\n          <input type=\"text\" class=\"form-control\" placeholder=\"أنا أحب الكعك والقهوة\" aria-label=\"الطعام المفضل\" aria-describedby=\"basic-addon2\">\n          <span class=\"input-group-text\" id=\"basic-addon2\">وغيرها</span>\n        </div>\n        <label for=\"basic-url\" class=\"form-label\">عنوان حسابك الشخصي</label>\n        <div class=\"input-group mb-3\">\n          <input type=\"text\" class=\"form-control\" id=\"basic-url\" aria-describedby=\"basic-addon3\">\n          <span class=\"input-group-text\" id=\"basic-addon3\"><bdo lang=\"en\" dir=\"ltr\">https://example.com/users/</bdo></span>\n        </div>\n        <div class=\"input-group mb-3\">\n          <span class=\"input-group-text\"><bdo lang=\"en\" dir=\"ltr\">.00</bdo></span>\n          <input type=\"text\" class=\"form-control\" aria-label=\"المبلغ (لأقرب دولار)\">\n          <span class=\"input-group-text\">$</span>\n        </div>\n        <div class=\"input-group\">\n          <span class=\"input-group-text\">مع textarea</span>\n          <textarea class=\"form-control\" aria-label=\"مع textarea\"></textarea>\n        </div>\n        `} />\n      </div>\n    </article>\n    <article class=\"my-3\" id=\"floating-labels\">\n      <div class=\"bd-heading sticky-xl-top align-self-start mt-5 mb-3 mt-xl-0 mb-xl-2\">\n        <h3>الحقول ذوي العناوين العائمة</h3>\n        <a class=\"d-flex align-items-center\" href={getVersionedDocsPath('forms/floating-labels')}>دليل الإستخدام</a>\n      </div>\n\n      <div>\n        <Example showMarkup={false} code={`\n        <form>\n          <div class=\"form-floating mb-3\">\n            <input type=\"email\" class=\"form-control\" id=\"floatingInput\" placeholder=\"name@example.com\">\n            <label for=\"floatingInput\">البريد الالكتروني</label>\n          </div>\n          <div class=\"form-floating\">\n            <input type=\"password\" class=\"form-control\" id=\"floatingPassword\" placeholder=\"كلمة السر\">\n            <label for=\"floatingPassword\">كلمة السر</label>\n          </div>\n        </form>\n        `} />\n      </div>\n    </article>\n    <article class=\"my-3\" id=\"validation\">\n      <div class=\"bd-heading sticky-xl-top align-self-start mt-5 mb-3 mt-xl-0 mb-xl-2\">\n        <h3>التحقق</h3>\n        <a class=\"d-flex align-items-center\" hreflang=\"en\" href={getVersionedDocsPath('forms/validation')}>دليل الإستخدام</a>\n      </div>\n\n      <div>\n        <Example showMarkup={false} code={`\n        <form class=\"row g-3\">\n          <div class=\"col-md-4\">\n            <label for=\"validationServer01\" class=\"form-label\">الاسم الاول</label>\n            <input type=\"text\" class=\"form-control is-valid\" id=\"validationServer01\" value=\"Mark\" required>\n            <div class=\"valid-feedback\">\n              يبدو صحيحًا!\n            </div>\n          </div>\n          <div class=\"col-md-4\">\n            <label for=\"validationServer02\" class=\"form-label\">الكنية</label>\n            <input type=\"text\" class=\"form-control is-valid\" id=\"validationServer02\" value=\"Otto\" required>\n            <div class=\"valid-feedback\">\n              يبدو صحيحًا!\n            </div>\n          </div>\n          <div class=\"col-md-4\">\n            <label for=\"validationServerUsername\" class=\"form-label\">اسم المستخدم</label>\n            <div class=\"input-group has-validation\">\n              <input type=\"text\" class=\"form-control is-invalid\" id=\"validationServerUsername\" aria-describedby=\"inputGroupPrepend3\" required>\n              <span class=\"input-group-text\" id=\"inputGroupPrepend3\">@</span>\n              <div class=\"invalid-feedback\">\n                يرجى اختيار اسم مستخدم.\n              </div>\n            </div>\n          </div>\n          <div class=\"col-md-6\">\n            <label for=\"validationServer03\" class=\"form-label\">مدينة</label>\n            <input type=\"text\" class=\"form-control is-invalid\" id=\"validationServer03\" required>\n            <div class=\"invalid-feedback\">\n              يرجى إدخال مدينة صحيحة.\n            </div>\n          </div>\n          <div class=\"col-md-3\">\n            <label for=\"validationServer04\" class=\"form-label\">حالة</label>\n            <select class=\"form-select is-invalid\" id=\"validationServer04\" required>\n              <option selected disabled value=\"\">اختر...</option>\n              <option>...</option>\n            </select>\n            <div class=\"invalid-feedback\">\n              يرجى اختيار ولاية صحيحة.\n            </div>\n          </div>\n          <div class=\"col-md-3\">\n            <label for=\"validationServer05\" class=\"form-label\">الرمز البريدي</label>\n            <input type=\"text\" class=\"form-control is-invalid\" id=\"validationServer05\" required>\n            <div class=\"invalid-feedback\">\n              يرجى إدخال رمز بريدي صحيح.\n            </div>\n          </div>\n          <div class=\"col-12\">\n            <div class=\"form-check\">\n              <input class=\"form-check-input is-invalid\" type=\"checkbox\" value=\"\" id=\"invalidCheck3\" required>\n              <label class=\"form-check-label\" for=\"invalidCheck3\">\n                أوافق على الشروط والأحكام\n              </label>\n              <div class=\"invalid-feedback\">\n                تجب الموافقة قبل إرسال النموذج.\n              </div>\n            </div>\n          </div>\n          <div class=\"col-12\">\n            <button class=\"btn btn-primary\" type=\"submit\">إرسال النموذج</button>\n          </div>\n        </form>\n        `} />\n      </div>\n    </article>\n  </section>\n\n  <section id=\"components\">\n    <h2 class=\"sticky-xl-top fw-bold pt-3 pt-xl-5 pb-2 pb-xl-3\">العناصر</h2>\n\n    <article class=\"my-3\" id=\"accordion\">\n      <div class=\"bd-heading sticky-xl-top align-self-start mt-5 mb-3 mt-xl-0 mb-xl-2\">\n        <h3>المطوية</h3>\n        <a class=\"d-flex align-items-center\" hreflang=\"en\" href={getVersionedDocsPath('components/accordion')}>دليل الإستخدام</a>\n      </div>\n\n      <div>\n        <Example showMarkup={false} code={`\n        <div class=\"accordion\" id=\"accordionExample\">\n          <div class=\"accordion-item\">\n            <h4 class=\"accordion-header\">\n              <button class=\"accordion-button\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#collapseOne\" aria-expanded=\"true\" aria-controls=\"collapseOne\">\n                عنصر المطوية الأول\n              </button>\n            </h4>\n            <div id=\"collapseOne\" class=\"accordion-collapse collapse show\" data-bs-parent=\"#accordionExample\">\n              <div class=\"accordion-body\">\n                <strong>هذا هو محتوى عنصر المطوية الأول.</strong> سيكون المحتوى مخفيًا بشكل إفتراضي حتى يقوم Bootstrap بإضافة الكلاسات اللازمة لكل عنصر في المطوية. هذه الكلاسات تتحكم بالمظهر العام ووتتحكم أيضا بإظهار وإخفاء أقسام المطوية عبر حركات CSS الإنتقالية. يمكنك تعديل أي من هذه عبر كلاسات CSS خاصة بك، او عبر تغيير القيم الإفتراضية المقدمة من Bootstrap. من الجدير بالذكر أنه يمكن وضع أي كود HTML هنا، ولكن الحركة الإنتقالية قد تحد من الoverflow.\n              </div>\n            </div>\n          </div>\n          <div class=\"accordion-item\">\n            <h4 class=\"accordion-header\">\n              <button class=\"accordion-button collapsed\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#collapseTwo\" aria-expanded=\"false\" aria-controls=\"collapseTwo\">\n                عنصر المطوية الثاني\n              </button>\n            </h4>\n            <div id=\"collapseTwo\" class=\"accordion-collapse collapse\" data-bs-parent=\"#accordionExample\">\n              <div class=\"accordion-body\">\n                <strong>هذا هو محتوى عنصر المطوية الثاني.</strong> سيكون المحتوى مخفيًا بشكل إفتراضي حتى يقوم Bootstrap بإضافة الكلاسات اللازمة لكل عنصر في المطوية. هذه الكلاسات تتحكم بالمظهر العام ووتتحكم أيضا بإظهار وإخفاء أقسام المطوية عبر حركات CSS الإنتقالية. يمكنك تعديل أي من هذه عبر كلاسات CSS خاصة بك، او عبر تغيير القيم الإفتراضية المقدمة من Bootstrap. من الجدير بالذكر أنه يمكن وضع أي كود HTML هنا، ولكن الحركة الإنتقالية قد تحد من الoverflow.\n              </div>\n            </div>\n          </div>\n          <div class=\"accordion-item\">\n            <h4 class=\"accordion-header\">\n              <button class=\"accordion-button collapsed\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#collapseThree\" aria-expanded=\"false\" aria-controls=\"collapseThree\">\n                عنصر المطوية الثالث\n              </button>\n            </h4>\n            <div id=\"collapseThree\" class=\"accordion-collapse collapse\" data-bs-parent=\"#accordionExample\">\n              <div class=\"accordion-body\">\n                <strong>هذا هو محتوى عنصر المطوية الثالث.</strong> سيكون المحتوى مخفيًا بشكل إفتراضي حتى يقوم Bootstrap بإضافة الكلاسات اللازمة لكل عنصر في المطوية. هذه الكلاسات تتحكم بالمظهر العام ووتتحكم أيضا بإظهار وإخفاء أقسام المطوية عبر حركات CSS الإنتقالية. يمكنك تعديل أي من هذه عبر كلاسات CSS خاصة بك، او عبر تغيير القيم الإفتراضية المقدمة من Bootstrap. من الجدير بالذكر أنه يمكن وضع أي كود HTML هنا، ولكن الحركة الإنتقالية قد تحد من الoverflow.\n              </div>\n            </div>\n          </div>\n        </div>\n        `} />\n      </div>\n    </article>\n    <article class=\"my-3\" id=\"alerts\">\n      <div class=\"bd-heading sticky-xl-top align-self-start mt-5 mb-3 mt-xl-0 mb-xl-2\">\n        <h3>الإنذارات</h3>\n        <a class=\"d-flex align-items-center\" hreflang=\"en\" href={getVersionedDocsPath('components/alerts')}>دليل الإستخدام</a>\n      </div>\n\n      <div>\n        <Example showMarkup={false} code={getData('theme-colors').map((themeColor) => `\n        <div class=\"alert alert-${themeColor.name} alert-dismissible fade show\" role=\"alert\">\n          تنبيه ${themeColor.name} بسيط مع <a href=\"#\" class=\"alert-link\">رابط مثال</a>. أعطها نقرة إذا أردت.\n          <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"alert\" aria-label=\"قريب\"></button>\n        </div>\n        `)} />\n\n        <Example showMarkup={false} code={`\n        <div class=\"alert alert-success\" role=\"alert\">\n          <h4 class=\"alert-heading\">أحسنت!</h4>\n          <p>لقد نجحت في قراءة رسالة التنبيه المهمة هذه. سيتم تشغيل نص المثال هذا لفترة أطول قليلاً حتى تتمكن من رؤية كيفية عمل التباعد داخل التنبيه مع هذا النوع من المحتوى.</p>\n          <hr>\n          <p class=\"mb-0\">كلما احتجت إلى ذلك ، تأكد من استخدام أدوات الهامش للحفاظ على الأشياء لطيفة ومرتبة.</p>\n        </div>\n        `} />\n      </div>\n    </article>\n    <article class=\"my-3\" id=\"badge\">\n      <div class=\"bd-heading sticky-xl-top align-self-start mt-5 mb-3 mt-xl-0 mb-xl-2\">\n        <h3>الشارة</h3>\n        <a class=\"d-flex align-items-center\" hreflang=\"en\" href={getVersionedDocsPath('components/badge')}>دليل الإستخدام</a>\n      </div>\n\n      <div>\n        <Example showMarkup={false} code={`\n        <p class=\"h1\">مثال على عنوان <span class=\"badge bg-primary\">جديد</span></p>\n        <p class=\"h2\">مثال على عنوان <span class=\"badge bg-secondary\">جديد</span></p>\n        <p class=\"h3\">مثال على عنوان <span class=\"badge bg-success\">جديد</span></p>\n        <p class=\"h4\">مثال على عنوان <span class=\"badge bg-danger\">جديد</span></p>\n        <p class=\"h5\">مثال على عنوان <span class=\"badge text-bg-warning\">جديد</span></p>\n        <p class=\"h6\">مثال على عنوان <span class=\"badge text-bg-info\">جديد</span></p>\n        <p class=\"h6\">مثال على عنوان <span class=\"badge text-bg-light\">جديد</span></p>\n        <p class=\"h6\">مثال على عنوان <span class=\"badge bg-dark\">جديد</span></p>\n        `} />\n\n        <Example showMarkup={false} code={getData('theme-colors').map((themeColor) => `\n        <span class=\"badge rounded-pill ${(themeColor.name === 'light' || themeColor.name === 'warning' || themeColor.name === 'info') ? 'text-' : ''}bg-${themeColor.name}\">${themeColor.title}</span>\n        `)} />\n      </div>\n    </article>\n    <article class=\"my-3\" id=\"breadcrumb\">\n      <div class=\"bd-heading sticky-xl-top align-self-start mt-5 mb-3 mt-xl-0 mb-xl-2\">\n        <h3>مسار التنقل التفصيلي (فتات الخبز)</h3>\n        <a class=\"d-flex align-items-center\" hreflang=\"en\" href={getVersionedDocsPath('components/breadcrumb')}>دليل الإستخدام</a>\n      </div>\n\n      <div>\n        <Example showMarkup={false} code={`\n        <nav aria-label=\"فتات الخبز\">\n          <ol class=\"breadcrumb\">\n            <li class=\"breadcrumb-item\"><a href=\"#\">الصفحة الرئيسية</a></li>\n            <li class=\"breadcrumb-item\"><a href=\"#\">المكتبة</a></li>\n            <li class=\"breadcrumb-item active\" aria-current=\"page\">البيانات</li>\n          </ol>\n        </nav>\n        `} />\n      </div>\n    </article>\n    <article class=\"my-3\" id=\"buttons\">\n      <div class=\"bd-heading sticky-xl-top align-self-start mt-5 mb-3 mt-xl-0 mb-xl-2\">\n        <h3>الأزرار</h3>\n        <a class=\"d-flex align-items-center\" hreflang=\"en\" href={getVersionedDocsPath('components/buttons')}>دليل الإستخدام</a>\n      </div>\n\n      <div>\n        <Example showMarkup={false} code={[\n          ...getData('theme-colors').map((themeColor) => `\n          <button type=\"button\" class=\"btn btn-${themeColor.name}\">${themeColor.title}</button>\n          `),\n          `<button type=\"button\" class=\"btn btn-link\">رابط</button>`]} />\n\n        <Example showMarkup={false} code={getData('theme-colors').map((themeColor) => `\n          <button type=\"button\" class=\"btn btn-outline-${themeColor.name}\">${themeColor.title}</button>\n          `)} />\n\n        <Example showMarkup={false} code={`\n        <button type=\"button\" class=\"btn btn-primary btn-sm\">زر صغير</button>\n        <button type=\"button\" class=\"btn btn-primary\">زر قياسي</button>\n        <button type=\"button\" class=\"btn btn-primary btn-lg\">زر كبير</button>\n        `} />\n      </div>\n    </article>\n    <article class=\"my-3\" id=\"button-group\">\n      <div class=\"bd-heading sticky-xl-top align-self-start mt-5 mb-3 mt-xl-0 mb-xl-2\">\n        <h3>مجموعة الأزرار</h3>\n        <a class=\"d-flex align-items-center\" hreflang=\"en\" href={getVersionedDocsPath('components/button-group')}>دليل الإستخدام</a>\n      </div>\n\n      <div>\n        <Example showMarkup={false} code={`\n        <div class=\"btn-toolbar\" role=\"toolbar\" aria-label=\"شريط أدوات مع مجموعات أزرار\">\n          <div class=\"btn-group me-2\" role=\"group\" aria-label=\"المجموعة الأولى\">\n            <button type=\"button\" class=\"btn btn-secondary\">1</button>\n            <button type=\"button\" class=\"btn btn-secondary\">2</button>\n            <button type=\"button\" class=\"btn btn-secondary\">3</button>\n            <button type=\"button\" class=\"btn btn-secondary\">4</button>\n          </div>\n          <div class=\"btn-group me-2\" role=\"group\" aria-label=\"المجموعة الثانية\">\n            <button type=\"button\" class=\"btn btn-secondary\">5</button>\n            <button type=\"button\" class=\"btn btn-secondary\">6</button>\n            <button type=\"button\" class=\"btn btn-secondary\">7</button>\n          </div>\n          <div class=\"btn-group\" role=\"group\" aria-label=\"المجموعة الثالثة\">\n            <button type=\"button\" class=\"btn btn-secondary\">8</button>\n          </div>\n        </div>\n        `} />\n      </div>\n    </article>\n    <article class=\"my-3\" id=\"card\">\n      <div class=\"bd-heading sticky-xl-top align-self-start mt-5 mb-3 mt-xl-0 mb-xl-2\">\n        <h3>البطاقة</h3>\n        <a class=\"d-flex align-items-center\" hreflang=\"en\" href={getVersionedDocsPath('components/card')}>دليل الإستخدام</a>\n      </div>\n\n      <div>\n        <Example showMarkup={false} code={`\n        <div class=\"row  row-cols-1 row-cols-md-2 g-4\">\n          <div class=\"col\">\n            <div class=\"card\">\n              <Placeholder width=\"100%\" height=\"180\" class=\"card-img-top\" text=\"غطاء الصورة\" />\n              <div class=\"card-body\">\n                <h5 class=\"card-title\">عنوان البطاقة</h5>\n                <p class=\"card-text\">بعض الأمثلة السريعة للنصوص للبناء على عنوان البطاقة وتشكيل الجزء الأكبر من محتوى البطاقة.</p>\n                <a href=\"#\" class=\"btn btn-primary\">اذهب لمكان ما</a>\n              </div>\n            </div>\n          </div>\n          <div class=\"col\">\n            <div class=\"card\">\n              <div class=\"card-header\">\n                متميز\n              </div>\n              <div class=\"card-body\">\n                <h5 class=\"card-title\">عنوان البطاقة</h5>\n                <p class=\"card-text\">بعض الأمثلة السريعة للنصوص للبناء على عنوان البطاقة وتشكيل الجزء الأكبر من محتوى البطاقة.</p>\n                <a href=\"#\" class=\"btn btn-primary\">اذهب لمكان ما</a>\n              </div>\n              <div class=\"card-footer text-body-secondary\">\n                منذ يومان\n              </div>\n            </div>\n          </div>\n          <div class=\"col\">\n            <div class=\"card\">\n              <div class=\"card-body\">\n                <h5 class=\"card-title\">عنوان البطاقة</h5>\n                <p class=\"card-text\">بعض الأمثلة السريعة للنصوص للبناء على عنوان البطاقة وتشكيل الجزء الأكبر من محتوى البطاقة.</p>\n              </div>\n              <ul class=\"list-group list-group-flush\">\n                <li class=\"list-group-item\">عنصر</li>\n                <li class=\"list-group-item\">عنصر آخر</li>\n                <li class=\"list-group-item\">عنصر ثالث</li>\n              </ul>\n              <div class=\"card-body\">\n                <a href=\"#\" class=\"card-link\">رابط البطاقة</a>\n                <a href=\"#\" class=\"card-link\">رابط آخر</a>\n              </div>\n            </div>\n          </div>\n          <div class=\"col\">\n            <div class=\"card\">\n              <div class=\"row g-0\">\n                <div class=\"col-md-4\">\n                  <Placeholder width=\"100%\" height=\"250\" text=\"صورة\" />\n                </div>\n                <div class=\"col-md-8\">\n                  <div class=\"card-body\">\n                    <h5 class=\"card-title\">عنوان البطاقة</h5>\n                    <p class=\"card-text\">هذه بطاقة أعرض مع نص داعم تحتها كمقدمة طبيعية لمحتوى إضافي. هذا المحتوى أطول قليلاً.</p>\n                    <p class=\"card-text\"><small class=\"text-body-secondary\">آخر تحديث منذ 3 دقائق</small></p>\n                  </div>\n                </div>\n              </div>\n            </div>\n          </div>\n        </div>\n        `} />\n      </div>\n    </article>\n    <article class=\"my-3\" id=\"carousel\">\n      <div class=\"bd-heading sticky-xl-top align-self-start mt-5 mb-3 mt-xl-0 mb-xl-2\">\n        <h3>شرائح العرض</h3>\n        <a class=\"d-flex align-items-center\" hreflang=\"en\" href={getVersionedDocsPath('components/carousel')}>دليل الإستخدام</a>\n      </div>\n\n      <div>\n        <Example showMarkup={false} code={`\n        <div id=\"carouselExampleCaptions\" class=\"carousel slide\" data-bs-ride=\"carousel\">\n          <div class=\"carousel-indicators\">\n            <button type=\"button\" data-bs-target=\"#carouselExampleCaptions\" data-bs-slide-to=\"0\" class=\"active\" aria-current=\"true\" aria-label=\"الشريحة الأولى\"></button>\n            <button type=\"button\" data-bs-target=\"#carouselExampleCaptions\" data-bs-slide-to=\"1\" aria-label=\"الشريحة الثانية\"></button>\n            <button type=\"button\" data-bs-target=\"#carouselExampleCaptions\" data-bs-slide-to=\"2\" aria-label=\"الشريحة الثالثة\"></button>\n          </div>\n          <div class=\"carousel-inner\">\n            <div class=\"carousel-item active\">\n              <Placeholder width=\"800\" height=\"400\" class=\"bd-placeholder-img-lg d-block w-100\" color=\"#555\" background=\"#777\" text=\"الشريحة الأولى\" />\n              <div class=\"carousel-caption d-none d-md-block\">\n                <h5>عنوان الشريحة الأولى</h5>\n                <p>محتوى وصفي يعبئ فراغ الشريحة الأولى.</p>\n              </div>\n            </div>\n            <div class=\"carousel-item\">\n              <Placeholder width=\"800\" height=\"400\" class=\"bd-placeholder-img-lg d-block w-100\" color=\"#444\" background=\"#666\" text=\"الشريحة الثانية\" />\n              <div class=\"carousel-caption d-none d-md-block\">\n                <h5>عنوان الشريحة الثانية</h5>\n                <p>محتوى وصفي يعبئ فراغ الشريحة الأولى.</p>\n              </div>\n            </div>\n            <div class=\"carousel-item\">\n              <Placeholder width=\"800\" height=\"400\" class=\"bd-placeholder-img-lg d-block w-100\" color=\"#333\" background=\"#555\" text=\"الشريحة الثالثة\" />\n              <div class=\"carousel-caption d-none d-md-block\">\n                <h5>عنوان الشريحة الثالثة</h5>\n                <p>محتوى وصفي يعبئ فراغ الشريحة الأولى.</p>\n              </div>\n            </div>\n          </div>\n          <button class=\"carousel-control-prev\" type=\"button\" data-bs-target=\"#carouselExampleCaptions\" data-bs-slide=\"prev\">\n            <span class=\"carousel-control-prev-icon\" aria-hidden=\"true\"></span>\n            <span class=\"visually-hidden\">السابق</span>\n          </button>\n          <button class=\"carousel-control-next\" type=\"button\" data-bs-target=\"#carouselExampleCaptions\" data-bs-slide=\"next\">\n            <span class=\"carousel-control-next-icon\" aria-hidden=\"true\"></span>\n            <span class=\"visually-hidden\">التالي</span>\n          </button>\n        </div>\n        `} />\n      </div>\n    </article>\n    <article class=\"my-3\" id=\"dropdowns\">\n      <div class=\"bd-heading sticky-xl-top align-self-start mt-5 mb-3 mt-xl-0 mb-xl-2\">\n        <h3>القوائم المنسدلة</h3>\n        <a class=\"d-flex align-items-center\" hreflang=\"en\" href={getVersionedDocsPath('components/dropdowns')}>دليل الإستخدام</a>\n      </div>\n\n      <div>\n        <Example showMarkup={false} code={`\n        <div class=\"btn-group w-100 align-items-center justify-content-between flex-wrap me-0\">\n          <div class=\"dropdown\">\n            <button class=\"btn btn-secondary btn-sm dropdown-toggle\" type=\"button\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n              زر القائمة المنسدلة\n            </button>\n            <ul class=\"dropdown-menu\">\n              <li><h6 class=\"dropdown-header\">عنوان القائمة المنسدلة</h6></li>\n              <li><a class=\"dropdown-item\" href=\"#\">عمل</a></li>\n              <li><a class=\"dropdown-item\" href=\"#\">عمل آخر</a></li>\n              <li><a class=\"dropdown-item\" href=\"#\">شيء آخر هنا</a></li>\n              <li><hr class=\"dropdown-divider\"></li>\n              <li><a class=\"dropdown-item\" href=\"#\">رابط منفصل</a></li>\n            </ul>\n          </div>\n          <div class=\"dropdown\">\n            <button class=\"btn btn-secondary dropdown-toggle\" type=\"button\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n              زر القائمة المنسدلة\n            </button>\n            <ul class=\"dropdown-menu\">\n              <li><h6 class=\"dropdown-header\">عنوان القائمة المنسدلة</h6></li>\n              <li><a class=\"dropdown-item\" href=\"#\">عمل</a></li>\n              <li><a class=\"dropdown-item\" href=\"#\">عمل آخر</a></li>\n              <li><a class=\"dropdown-item\" href=\"#\">شيء آخر هنا</a></li>\n              <li><hr class=\"dropdown-divider\"></li>\n              <li><a class=\"dropdown-item\" href=\"#\">رابط منفصل</a></li>\n            </ul>\n          </div>\n          <div class=\"dropdown\">\n            <button class=\"btn btn-secondary btn-lg dropdown-toggle\" type=\"button\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n              زر القائمة المنسدلة\n            </button>\n            <ul class=\"dropdown-menu\">\n              <li><h6 class=\"dropdown-header\">عنوان القائمة المنسدلة</h6></li>\n              <li><a class=\"dropdown-item\" href=\"#\">عمل</a></li>\n              <li><a class=\"dropdown-item\" href=\"#\">عمل آخر</a></li>\n              <li><a class=\"dropdown-item\" href=\"#\">شيء آخر هنا</a></li>\n              <li><hr class=\"dropdown-divider\"></li>\n              <li><a class=\"dropdown-item\" href=\"#\">رابط منفصل</a></li>\n            </ul>\n          </div>\n        </div>\n        `} />\n\n        <Example showMarkup={false} code={`\n        <div class=\"btn-group\">\n          <button type=\"button\" class=\"btn btn-primary\">Primary</button>\n          <button type=\"button\" class=\"btn btn-primary dropdown-toggle dropdown-toggle-split\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n            <span class=\"visually-hidden\">تبديل القائمة المنسدلة</span>\n          </button>\n          <ul class=\"dropdown-menu\">\n            <li><a class=\"dropdown-item\" href=\"#\">عمل</a></li>\n            <li><a class=\"dropdown-item\" href=\"#\">عمل آخر</a></li>\n            <li><a class=\"dropdown-item\" href=\"#\">شيء آخر هنا</a></li>\n          </ul>\n        </div><!-- /btn-group -->\n        <div class=\"btn-group\">\n          <button type=\"button\" class=\"btn btn-secondary\">Secondary</button>\n          <button type=\"button\" class=\"btn btn-secondary dropdown-toggle dropdown-toggle-split\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n            <span class=\"visually-hidden\">تبديل القائمة المنسدلة</span>\n          </button>\n          <ul class=\"dropdown-menu\">\n            <li><a class=\"dropdown-item\" href=\"#\">عمل</a></li>\n            <li><a class=\"dropdown-item\" href=\"#\">عمل آخر</a></li>\n            <li><a class=\"dropdown-item\" href=\"#\">شيء آخر هنا</a></li>\n          </ul>\n        </div><!-- /btn-group -->\n        <div class=\"btn-group\">\n          <button type=\"button\" class=\"btn btn-success\">Success</button>\n          <button type=\"button\" class=\"btn btn-success dropdown-toggle dropdown-toggle-split\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n            <span class=\"visually-hidden\">تبديل القائمة المنسدلة</span>\n          </button>\n          <ul class=\"dropdown-menu\">\n            <li><a class=\"dropdown-item\" href=\"#\">عمل</a></li>\n            <li><a class=\"dropdown-item\" href=\"#\">عمل آخر</a></li>\n            <li><a class=\"dropdown-item\" href=\"#\">شيء آخر هنا</a></li>\n          </ul>\n        </div><!-- /btn-group -->\n        <div class=\"btn-group\">\n          <button type=\"button\" class=\"btn btn-info\">Info</button>\n          <button type=\"button\" class=\"btn btn-info dropdown-toggle dropdown-toggle-split\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n            <span class=\"visually-hidden\">تبديل القائمة المنسدلة</span>\n          </button>\n          <ul class=\"dropdown-menu\">\n            <li><a class=\"dropdown-item\" href=\"#\">عمل</a></li>\n            <li><a class=\"dropdown-item\" href=\"#\">عمل آخر</a></li>\n            <li><a class=\"dropdown-item\" href=\"#\">شيء آخر هنا</a></li>\n          </ul>\n        </div><!-- /btn-group -->\n        <div class=\"btn-group\">\n          <button type=\"button\" class=\"btn btn-warning\">Warning</button>\n          <button type=\"button\" class=\"btn btn-warning dropdown-toggle dropdown-toggle-split\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n            <span class=\"visually-hidden\">تبديل القائمة المنسدلة</span>\n          </button>\n          <ul class=\"dropdown-menu\">\n            <li><a class=\"dropdown-item\" href=\"#\">عمل</a></li>\n            <li><a class=\"dropdown-item\" href=\"#\">عمل آخر</a></li>\n            <li><a class=\"dropdown-item\" href=\"#\">شيء آخر هنا</a></li>\n          </ul>\n        </div><!-- /btn-group -->\n        <div class=\"btn-group\">\n          <button type=\"button\" class=\"btn btn-danger\">Danger</button>\n          <button type=\"button\" class=\"btn btn-danger dropdown-toggle dropdown-toggle-split\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n            <span class=\"visually-hidden\">تبديل القائمة المنسدلة</span>\n          </button>\n          <ul class=\"dropdown-menu\">\n            <li><a class=\"dropdown-item\" href=\"#\">عمل</a></li>\n            <li><a class=\"dropdown-item\" href=\"#\">عمل آخر</a></li>\n            <li><a class=\"dropdown-item\" href=\"#\">شيء آخر هنا</a></li>\n          </ul>\n        </div><!-- /btn-group -->\n        `} />\n\n        <Example showMarkup={false} code={`\n        <div class=\"btn-group w-100 align-items-center justify-content-between flex-wrap me-0\">\n          <div class=\"dropend\">\n            <button class=\"btn btn-secondary dropdown-toggle\" type=\"button\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n              زر القائمة المنسدلة لليسار\n            </button>\n            <ul class=\"dropdown-menu\">\n              <li><h6 class=\"dropdown-header\">عنوان القائمة المنسدلة</h6></li>\n              <li><a class=\"dropdown-item\" href=\"#\">عمل</a></li>\n              <li><a class=\"dropdown-item\" href=\"#\">عمل آخر</a></li>\n              <li><a class=\"dropdown-item\" href=\"#\">شيء آخر هنا</a></li>\n              <li><hr class=\"dropdown-divider\"></li>\n              <li><a class=\"dropdown-item\" href=\"#\">رابط منفصل</a></li>\n            </ul>\n          </div>\n          <div class=\"dropup\">\n            <button class=\"btn btn-secondary dropdown-toggle\" type=\"button\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n              زر القائمة المنسدلة للأعلى\n            </button>\n            <ul class=\"dropdown-menu\">\n              <li><h6 class=\"dropdown-header\">عنوان القائمة المنسدلة</h6></li>\n              <li><a class=\"dropdown-item\" href=\"#\">عمل</a></li>\n              <li><a class=\"dropdown-item\" href=\"#\">عمل آخر</a></li>\n              <li><a class=\"dropdown-item\" href=\"#\">شيء آخر هنا</a></li>\n              <li><hr class=\"dropdown-divider\"></li>\n              <li><a class=\"dropdown-item\" href=\"#\">رابط منفصل</a></li>\n            </ul>\n          </div>\n          <div class=\"dropstart\">\n            <button class=\"btn btn-secondary dropdown-toggle\" type=\"button\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n              زر القائمة المنسدلة لليمين\n            </button>\n            <ul class=\"dropdown-menu\">\n              <li><h6 class=\"dropdown-header\">عنوان القائمة المنسدلة</h6></li>\n              <li><a class=\"dropdown-item\" href=\"#\">عمل</a></li>\n              <li><a class=\"dropdown-item\" href=\"#\">عمل آخر</a></li>\n              <li><a class=\"dropdown-item\" href=\"#\">شيء آخر هنا</a></li>\n              <li><hr class=\"dropdown-divider\"></li>\n              <li><a class=\"dropdown-item\" href=\"#\">رابط منفصل</a></li>\n            </ul>\n          </div>\n        </div>\n        `} />\n\n        <Example showMarkup={false} code={`\n        <div class=\"btn-group\">\n          <div class=\"dropdown\">\n            <button class=\"btn btn-secondary dropdown-toggle\" type=\"button\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n              قائمة منسدلة بمحاذاة نهاية الزر\n            </button>\n            <ul class=\"dropdown-menu dropdown-menu-end\">\n              <li><h6 class=\"dropdown-header\">عنوان القائمة المنسدلة</h6></li>\n              <li><a class=\"dropdown-item\" href=\"#\">عمل</a></li>\n              <li><a class=\"dropdown-item\" href=\"#\">عمل آخر</a></li>\n              <li><hr class=\"dropdown-divider\"></li>\n              <li><a class=\"dropdown-item\" href=\"#\">رابط منفصل</a></li>\n            </ul>\n          </div>\n        </div>\n        `} />\n      </div>\n    </article>\n    <article class=\"my-3\" id=\"list-group\">\n      <div class=\"bd-heading sticky-xl-top align-self-start mt-5 mb-3 mt-xl-0 mb-xl-2\">\n        <h3>مجموعة العناصر</h3>\n        <a class=\"d-flex align-items-center\" hreflang=\"en\" href={getVersionedDocsPath('components/list-group')}>دليل الإستخدام</a>\n      </div>\n\n      <div>\n        <Example showMarkup={false} code={`\n        <ul class=\"list-group\">\n          <li class=\"list-group-item disabled\" aria-disabled=\"true\">عنصر معطل</li>\n          <li class=\"list-group-item\">عنصر ثاني</li>\n          <li class=\"list-group-item\">عنصر ثالث</li>\n          <li class=\"list-group-item\">عنصر رابع</li>\n          <li class=\"list-group-item\">وعنصر خامس أيضًا</li>\n        </ul>\n        `} />\n\n        <Example showMarkup={false} code={`\n        <ul class=\"list-group list-group-flush\">\n          <li class=\"list-group-item\">عنصر</li>\n          <li class=\"list-group-item\">عنصر ثاني</li>\n          <li class=\"list-group-item\">عنصر ثالث</li>\n          <li class=\"list-group-item\">عنصر رابع</li>\n          <li class=\"list-group-item\">وعنصر خامس أيضًا</li>\n        </ul>\n        `} />\n\n        <Example showMarkup={false} code={[`\n        <div class=\"list-group\">\n          <a href=\"#\" class=\"list-group-item list-group-item-action\">عنصر مجموعة قائمة default بسيط</a>`,\n          ...getData('theme-colors').map((themeColor) => `\n          <a href=\"#\" class=\"list-group-item list-group-item-action list-group-item-${themeColor.name}\">عنصر مجموعة قائمة ${themeColor.name} بسيط</a>\n          `),\n        `</div>\n        `]} />\n      </div>\n    </article>\n    <article class=\"my-3\" id=\"modal\">\n      <div class=\"bd-heading sticky-xl-top align-self-start mt-5 mb-3 mt-xl-0 mb-xl-2\">\n        <h3>الصندوق العائم</h3>\n        <a class=\"d-flex align-items-center\" hreflang=\"en\" href={getVersionedDocsPath('components/modal')}>دليل الإستخدام</a>\n      </div>\n\n      <div>\n        <Example showMarkup={false} code={`\n        <div class=\"d-flex justify-content-between flex-wrap\">\n          <button type=\"button\" class=\"btn btn-primary\" data-bs-toggle=\"modal\" data-bs-target=\"#exampleModalDefault\">\n            إطلاق صندوق عائم تجريبي\n          </button>\n          <button type=\"button\" class=\"btn btn-primary\" data-bs-toggle=\"modal\" data-bs-target=\"#staticBackdropLive\">\n            إطلاق صندوق عائم عالق\n          </button>\n          <button type=\"button\" class=\"btn btn-primary\" data-bs-toggle=\"modal\" data-bs-target=\"#exampleModalCenteredScrollable\">\n            صندوق عائم متنصف عاموديًا وقابل للتمرير\n          </button>\n          <button type=\"button\" class=\"btn btn-primary\" data-bs-toggle=\"modal\" data-bs-target=\"#exampleModalFullscreen\">\n            صندوق عائم يملأ الشاشة\n          </button>\n        </div>\n        `} />\n      </div>\n    </article>\n    <article class=\"my-3\" id=\"navs\">\n      <div class=\"bd-heading sticky-xl-top align-self-start mt-5 mb-3 mt-xl-0 mb-xl-2\">\n        <h3>التنقل</h3>\n        <a class=\"d-flex align-items-center\" hreflang=\"en\" href={getVersionedDocsPath('components/navs-tabs')}>دليل الإستخدام</a>\n      </div>\n\n      <div>\n        <Example showMarkup={false} code={`\n        <nav class=\"nav\">\n          <a class=\"nav-link active\" aria-current=\"page\" href=\"#\">نشط</a>\n          <a class=\"nav-link\" href=\"#\">رابط</a>\n          <a class=\"nav-link\" href=\"#\">رابط</a>\n          <a class=\"nav-link disabled\" aria-disabled=\"true\">معطل</a>\n        </nav>\n        `} />\n\n        <Example showMarkup={false} code={`\n        <nav>\n          <div class=\"nav nav-tabs mb-3\" id=\"nav-tab\" role=\"tablist\">\n            <button class=\"nav-link active\" id=\"nav-home-tab\" data-bs-toggle=\"tab\" data-bs-target=\"#nav-home\" type=\"button\" role=\"tab\" aria-controls=\"nav-home\" aria-selected=\"true\">الصفحة الرئيسية</button>\n            <button class=\"nav-link\" id=\"nav-profile-tab\" data-bs-toggle=\"tab\" data-bs-target=\"#nav-profile\" type=\"button\" role=\"tab\" aria-controls=\"nav-profile\" aria-selected=\"false\">الملف الشخصي</button>\n            <button class=\"nav-link\" id=\"nav-contact-tab\" data-bs-toggle=\"tab\" data-bs-target=\"#nav-contact\" type=\"button\" role=\"tab\" aria-controls=\"nav-contact\" aria-selected=\"false\">اتصل بنا</button>\n          </div>\n        </nav>\n        <div class=\"tab-content\" id=\"nav-tabContent\">\n          <div class=\"tab-pane fade show active\" id=\"nav-home\" role=\"tabpanel\" aria-labelledby=\"nav-home-tab\">\n            <p class=\"px-3\">محتوى لتوضيح كيف يعمل التبويب. هذا المحتوى مرتبط بتبويب الصفحة الرئيسية. إذن، أمامنا بعض التحدّيات الصعبة. لكن لا يمكننا أن نعتمد على التطورات التكنولوجية وحدها في ميدان قوى السوق الحرة، لإخراجنا من هذه الورطة، لا سيّما أنها نفسها، مقرونة بالافتقار إلى البصيرة، هي التي أودت بنا إلى هذا التبدُّل المناخي في الدرجة الأولى.</p>\n          </div>\n          <div class=\"tab-pane fade\" id=\"nav-profile\" role=\"tabpanel\" aria-labelledby=\"nav-profile-tab\">\n            <p class=\"px-3\">محتوى لتوضيح كيف يعمل التبويب. هذا المحتوى مرتبط بتبويب الملف الشخصي. معظم البشر في بلدان العالَم النامي، لم يقتنوا بعد مكيّفهم الأول، والمشكلة إلى ازدياد. فمعظم البلدان النامية هي من البلدان الأشد حرارة والأكثر اكتظاظًا بالسكان في العالم.</p>\n          </div>\n          <div class=\"tab-pane fade\" id=\"nav-contact\" role=\"tabpanel\" aria-labelledby=\"nav-contact-tab\">\n            <p class=\"px-3\">محتوى لتوضيح كيف يعمل التبويب. هذا المحتوى مرتبط بتبويب الاتصال بنا. أمامنا بعض التحدّيات الصعبة. لكن لا يمكننا أن نعتمد على التطورات التكنولوجية وحدها في ميدان قوى السوق الحرة، بل يجب وضع معايير جدوى جديدة لشركات البناء ومعايير أعلى لجدوى التكييف من أجل تحفيز الحلول المستدامة قانونيًا.</p>\n          </div>\n        </div>\n        `} />\n\n        <Example showMarkup={false} code={`\n        <ul class=\"nav nav-pills\">\n          <li class=\"nav-item\">\n            <a class=\"nav-link active\" aria-current=\"page\" href=\"#\">نشط</a>\n          </li>\n          <li class=\"nav-item\">\n            <a class=\"nav-link\" href=\"#\">رابط</a>\n          </li>\n          <li class=\"nav-item\">\n            <a class=\"nav-link\" href=\"#\">رابط</a>\n          </li>\n          <li class=\"nav-item\">\n            <a class=\"nav-link disabled\" aria-disabled=\"true\">معطل</a>\n          </li>\n        </ul>\n        `} />\n      </div>\n    </article>\n    <article class=\"my-3\" id=\"navbar\">\n      <div class=\"bd-heading sticky-xl-top align-self-start mt-5 mb-3 mt-xl-0 mb-xl-2\">\n        <h3>شريط التنقل</h3>\n        <a class=\"d-flex align-items-center\" hreflang=\"en\" href={getVersionedDocsPath('components/navbar')}>دليل الإستخدام</a>\n      </div>\n\n      <div>\n        <Example showMarkup={false} code={`\n        <nav class=\"navbar navbar-expand-lg bg-body-tertiary\">\n          <div class=\"container-fluid\">\n            <a class=\"navbar-brand\" href=\"#\">\n              <img src=\"${getVersionedDocsPath('/assets/brand/bootstrap-logo-white.svg')}\" width=\"38\" height=\"30\" class=\"d-inline-block align-top\" alt=\"Bootstrap\" loading=\"lazy\" style=\"filter: invert(1) grayscale(100%) brightness(200%);\">\n            </a>\n            <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbarSupportedContent\" aria-controls=\"navbarSupportedContent\" aria-expanded=\"false\" aria-label=\"تبديل التنقل\">\n              <span class=\"navbar-toggler-icon\"></span>\n            </button>\n            <div class=\"collapse navbar-collapse\" id=\"navbarSupportedContent\">\n              <ul class=\"navbar-nav me-auto mb-2 mb-lg-0\">\n                <li class=\"nav-item\">\n                  <a class=\"nav-link active\" aria-current=\"page\" href=\"#\">الصفحة الرئيسية</a>\n                </li>\n                <li class=\"nav-item\">\n                  <a class=\"nav-link\" href=\"#\">رابط</a>\n                </li>\n                <li class=\"nav-item dropdown\">\n                  <a class=\"nav-link dropdown-toggle\" href=\"#\" role=\"button\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n                    قائمة منسدلة\n                  </a>\n                  <ul class=\"dropdown-menu\">\n                    <li><a class=\"dropdown-item\" href=\"#\">عمل</a></li>\n                    <li><a class=\"dropdown-item\" href=\"#\">عمل آخر</a></li>\n                    <li><hr class=\"dropdown-divider\"></li>\n                    <li><a class=\"dropdown-item\" href=\"#\">شيء آخر هنا</a></li>\n                  </ul>\n                </li>\n                <li class=\"nav-item\">\n                  <a class=\"nav-link disabled\" aria-disabled=\"true\">معطل</a>\n                </li>\n              </ul>\n              <form class=\"d-flex\" role=\"search\">\n                <input class=\"form-control me-2\" type=\"search\" placeholder=\"بحث\" aria-label=\"بحث\">\n                <button class=\"btn btn-outline-dark\" type=\"submit\">بحث</button>\n              </form>\n            </div>\n          </div>\n        </nav>\n\n        <nav class=\"navbar navbar-expand-lg navbar-dark bg-primary mt-5\">\n          <div class=\"container-fluid\">\n            <a class=\"navbar-brand\" href=\"#\">\n              <img src=\"${getVersionedDocsPath('/assets/brand/bootstrap-logo-white.svg')}\" width=\"38\" height=\"30\" class=\"d-inline-block align-top\" alt=\"Bootstrap\" loading=\"lazy\">\n            </a>\n            <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbarSupportedContent2\" aria-controls=\"navbarSupportedContent2\" aria-expanded=\"false\" aria-label=\"تبديل التنقل\">\n              <span class=\"navbar-toggler-icon\"></span>\n            </button>\n            <div class=\"collapse navbar-collapse\" id=\"navbarSupportedContent2\">\n              <ul class=\"navbar-nav me-auto mb-2 mb-lg-0\">\n                <li class=\"nav-item\">\n                  <a class=\"nav-link active\" aria-current=\"page\" href=\"#\">الصفحة الرئيسية</a>\n                </li>\n                <li class=\"nav-item\">\n                  <a class=\"nav-link\" href=\"#\">رابط</a>\n                </li>\n                <li class=\"nav-item dropdown\">\n                  <a class=\"nav-link dropdown-toggle\" href=\"#\" role=\"button\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n                    قائمة منسدلة\n                  </a>\n                  <ul class=\"dropdown-menu\">\n                    <li><a class=\"dropdown-item\" href=\"#\">عمل</a></li>\n                    <li><a class=\"dropdown-item\" href=\"#\">عمل آخر</a></li>\n                    <li><hr class=\"dropdown-divider\"></li>\n                    <li><a class=\"dropdown-item\" href=\"#\">شيء آخر هنا</a></li>\n                  </ul>\n                </li>\n                <li class=\"nav-item\">\n                  <a class=\"nav-link disabled\" aria-disabled=\"true\">معطل</a>\n                </li>\n              </ul>\n              <form class=\"d-flex\" role=\"search\">\n                <input class=\"form-control me-2\" type=\"search\" placeholder=\"بحث\" aria-label=\"بحث\">\n                <button class=\"btn btn-outline-light\" type=\"submit\">بحث</button>\n              </form>\n            </div>\n          </div>\n        </nav>\n        `} />\n      </div>\n    </article>\n    <article class=\"my-3\" id=\"pagination\">\n      <div class=\"bd-heading sticky-xl-top align-self-start mt-5 mb-3 mt-xl-0 mb-xl-2\">\n        <h3>ترقيم الصفحات</h3>\n        <a class=\"d-flex align-items-center\" hreflang=\"en\" href={getVersionedDocsPath('components/pagination')}>دليل الإستخدام</a>\n      </div>\n\n      <div>\n        <Example showMarkup={false} code={`\n        <nav aria-label=\"مثال ترقيم الصفحات\">\n          <ul class=\"pagination pagination-sm\">\n            <li class=\"page-item\"><a class=\"page-link\" href=\"#\">1</a></li>\n            <li class=\"page-item active\" aria-current=\"page\">\n              <a class=\"page-link\" href=\"#\">2</a>\n            </li>\n            <li class=\"page-item\"><a class=\"page-link\" href=\"#\">3</a></li>\n          </ul>\n        </nav>\n        `} />\n\n        <Example showMarkup={false} code={`\n        <nav aria-label=\"مثال قياسي لترقيم الصفحات\">\n          <ul class=\"pagination\">\n            <li class=\"page-item\">\n              <a class=\"page-link\" href=\"#\" aria-label=\"السابق\">\n                <span aria-hidden=\"true\">&laquo;</span>\n              </a>\n            </li>\n            <li class=\"page-item\"><a class=\"page-link\" href=\"#\">1</a></li>\n            <li class=\"page-item\"><a class=\"page-link\" href=\"#\">2</a></li>\n            <li class=\"page-item\"><a class=\"page-link\" href=\"#\">3</a></li>\n            <li class=\"page-item\">\n              <a class=\"page-link\" href=\"#\" aria-label=\"التالي\">\n                <span aria-hidden=\"true\">&raquo;</span>\n              </a>\n            </li>\n          </ul>\n        </nav>\n        `} />\n\n        <Example showMarkup={false} code={`\n        <nav aria-label=\"مثال آخر لترقيم الصفحات\">\n          <ul class=\"pagination pagination-lg flex-wrap\">\n            <li class=\"page-item disabled\">\n              <a class=\"page-link\">السابق</a>\n            </li>\n            <li class=\"page-item\"><a class=\"page-link\" href=\"#\">1</a></li>\n            <li class=\"page-item active\" aria-current=\"page\">\n              <a class=\"page-link\" href=\"#\">2</a>\n            </li>\n            <li class=\"page-item\"><a class=\"page-link\" href=\"#\">3</a></li>\n            <li class=\"page-item\">\n              <a class=\"page-link\" href=\"#\">التالى</a>\n            </li>\n          </ul>\n        </nav>\n        `} />\n      </div>\n    </article>\n    <article class=\"my-3\" id=\"popovers\">\n      <div class=\"bd-heading sticky-xl-top align-self-start mt-5 mb-3 mt-xl-0 mb-xl-2\">\n        <h3>الصناديق المنبثقة</h3>\n        <a class=\"d-flex align-items-center\" hreflang=\"en\" href={getVersionedDocsPath('components/popovers')}>دليل الإستخدام</a>\n      </div>\n\n      <div>\n        <Example showMarkup={false} code={`\n        <button type=\"button\" class=\"btn btn-lg btn-danger\" data-bs-toggle=\"popover\" title=\"عنوان الصندوق المنبثق\" data-bs-content=\"وإليك بعض المحتويات الرائعة. إنه آسر للغاية. أليس كذلك؟\">\n        انقر لعرض/إخفاء الصندوق المنبثق\n        </button>\n        `} />\n\n        <Example showMarkup={false} code={`\n        <button type=\"button\" class=\"btn btn-secondary\" data-bs-container=\"body\" data-bs-toggle=\"popover\" data-bs-placement=\"top\" data-bs-content=\"نجمٌ و لكنه ليس في السماء، بل في أعماق البحار و المحيطات!\">\n          انبثاق إلى الأعلى\n        </button>\n        <button type=\"button\" class=\"btn btn-secondary\" data-bs-container=\"body\" data-bs-toggle=\"popover\" data-bs-placement=\"right\" data-bs-content=\"نجمٌ و لكنه ليس في السماء، بل في أعماق البحار و المحيطات!\">\n          انبثاق إلى اليسار\n        </button>\n        <button type=\"button\" class=\"btn btn-secondary\" data-bs-container=\"body\" data-bs-toggle=\"popover\" data-bs-placement=\"bottom\" data-bs-content=\"نجمٌ و لكنه ليس في السماء، بل في أعماق البحار و المحيطات!\">\n          انبثاق إلى الأسفل\n        </button>\n        <button type=\"button\" class=\"btn btn-secondary\" data-bs-container=\"body\" data-bs-toggle=\"popover\" data-bs-placement=\"left\" data-bs-content=\"نجمٌ و لكنه ليس في السماء، بل في أعماق البحار و المحيطات!\">\n          انبثاق إلى اليمين\n        </button>\n        `} />\n      </div>\n    </article>\n    <article class=\"my-3\" id=\"progress\">\n      <div class=\"bd-heading sticky-xl-top align-self-start mt-5 mb-3 mt-xl-0 mb-xl-2\">\n        <h3>شريط التقدم</h3>\n        <a class=\"d-flex align-items-center\" hreflang=\"en\" href={getVersionedDocsPath('components/progress')}>دليل الإستخدام</a>\n      </div>\n\n      <div>\n        <Example showMarkup={false} code={`\n        <div class=\"progress mb-3\" role=\"progressbar\" aria-label=\"مثال مع عنوان\" aria-valuenow=\"0\" aria-valuemin=\"0\" aria-valuemax=\"100\">\n          <div class=\"progress-bar\">0%</div>\n        </div>\n        <div class=\"progress mb-3\" role=\"progressbar\" aria-label=\"مثال ناجح مع عنوان\" aria-valuenow=\"25\" aria-valuemin=\"0\" aria-valuemax=\"100\">\n          <div class=\"progress-bar bg-success w-25\">25%</div>\n        </div>\n        <div class=\"progress mb-3\" role=\"progressbar\" aria-label=\"مثال توضيح مع عنوان\" aria-valuenow=\"50\" aria-valuemin=\"0\" aria-valuemax=\"100\">\n          <div class=\"progress-bar text-bg-info w-50\">50%</div>\n        </div>\n        <div class=\"progress mb-3\" role=\"progressbar\" aria-label=\"مثال تنبيه مع عنوان\" aria-valuenow=\"75\" aria-valuemin=\"0\" aria-valuemax=\"100\">\n          <div class=\"progress-bar text-bg-warning w-75\">75%</div>\n        </div>\n        <div class=\"progress\" role=\"progressbar\" aria-label=\"مثال خطر مع عنوان\" aria-valuenow=\"100\" aria-valuemin=\"0\" aria-valuemax=\"100\">\n          <div class=\"progress-bar bg-danger w-100\">100%</div>\n        </div>\n        `} />\n\n        <Example showMarkup={false} code={`\n        <div class=\"progress-stacked\">\n          <div class=\"progress\" role=\"progressbar\" aria-label=\"القسم الأول - مثال افتراضي\" style=\"width: 15%\" aria-valuenow=\"15\" aria-valuemin=\"0\" aria-valuemax=\"100\">\n            <div class=\"progress-bar\"></div>\n          </div>\n          <div class=\"progress\" role=\"progressbar\" aria-label=\"القسم الثاني - مثال ناجح مقلّم متحرك\" style=\"width: 40%\" aria-valuenow=\"40\" aria-valuemin=\"0\" aria-valuemax=\"100\">\n            <div class=\"progress-bar progress-bar-striped progress-bar-animated bg-success\"></div>\n          </div>\n        </div>\n        `} />\n      </div>\n    </article>\n    <article class=\"my-3\" id=\"scrollspy\">\n      <div class=\"bd-heading sticky-xl-top align-self-start mt-5 mb-3 mt-xl-0 mb-xl-2\">\n        <h3>المخطوطة</h3>\n        <a class=\"d-flex align-items-center\" hreflang=\"en\" href={getVersionedDocsPath('components/scrollspy')}>دليل الإستخدام</a>\n      </div>\n\n      <div>\n        <Example showMarkup={false} code={`\n        <nav id=\"navbar-example2\" class=\"navbar bg-body-tertiary px-3\">\n          <a class=\"navbar-brand\" href=\"#\">شريط التنقل</a>\n          <ul class=\"nav nav-pills\">\n            <li class=\"nav-item\">\n              <a class=\"nav-link\" href=\"#fat\"><bdi lang=\"en\" dir=\"ltr\">@fat</bdi></a>\n            </li>\n            <li class=\"nav-item\">\n              <a class=\"nav-link\" href=\"#mdo\"><bdi lang=\"en\" dir=\"ltr\">@mdo</bdi></a>\n            </li>\n            <li class=\"nav-item dropdown\">\n              <a class=\"nav-link dropdown-toggle\" data-bs-toggle=\"dropdown\" href=\"#\" role=\"button\" aria-expanded=\"false\">قائمة منسدلة</a>\n              <ul class=\"dropdown-menu\">\n                <li><a class=\"dropdown-item\" href=\"#one\">واحد</a></li>\n                <li><a class=\"dropdown-item\" href=\"#two\">اثنان</a></li>\n                <li><hr class=\"dropdown-divider\"></li>\n                <li><a class=\"dropdown-item\" href=\"#three\">ثلاثة</a></li>\n              </ul>\n            </li>\n          </ul>\n        </nav>\n        <div data-bs-spy=\"scroll\" data-bs-target=\"#navbar-example2\" data-bs-offset=\"0\" class=\"scrollspy-example position-relative mt-2 overflow-auto\">\n          <h4 id=\"fat\"><bdi lang=\"en\" dir=\"ltr\">@fat</bdi></h4>\n          <p>محتوى لتوضيح كيف تعمل المخطوطة. ببساطة، المخطوطة عبارة عن منشور طويل يحتوي على عدة أقسام، ولديه شريط تنقل يسهل الوصول إلى هذه الأقسام الفرعية.</p>\n          <h4 id=\"mdo\"><bdi lang=\"en\" dir=\"ltr\">@mdo</bdi></h4>\n          <p>بصرف النظر عن تحسيننا جدوى المكيّفات أو عدم تحسينها، فإن الطلب على الطاقة سيزداد. وطبقاً لما جاء في مقالة معهد ماساشوستس للتكنولوجيا، السالف ذكره، ثمَّة أمر يجب عدم إغفاله، وهو كيف أن هذا الطلب سيضغط على نظم توفير الطاقة الحالية. إذ لا بد من إعادة تأهيل كل شبكات الكهرباء، وتوسيعها لتلبية طلب الطاقة في زمن الذروة، خلال موجات الحرارة المتزايدة. فحين يكون الحر شديداً يجنح الناس إلى البقاء في الداخل، وإلى زيادة تشغيل المكيّفات، سعياً إلى جو لطيف وهم يستخدمون أدوات وأجهزة مختلفة أخرى.</p>\n          <h4 id=\"one\">واحد</h4>\n          <p>وكل هذه الأمور المتزامنة من تشغيل الأجهزة، يزيد الضغط على شبكات الطاقة، كما أسلفنا. لكن مجرد زيادة سعة الشبكة ليس كافياً. إذ لا بد من تطوير الشبكات الذكية التي تستخدم الجسّاسات، ونظم المراقبة، والبرامج الإلكترونية، لتحديد متى يكون الشاغلون في المبنى، ومتى يكون ثمَّة حاجة إلى الطاقة، ومتى تكون الحرارة منخفضة، وبذلك يخرج الناس، فلا يستخدمون كثيراً من الكهرباء.</p>\n          <h4 id=\"two\">اثنان</h4>\n          <p>مع الأسف، كل هذه الحلول المبتكرة مكلِّفة، وهذا ما يجعلها عديمة الجدوى في نظر بعض الشركات الخاصة والمواطن المتقشّف. إن بعض الأفراد الواعين بيئياً يبذلون قصارى جهدهم في تقليص استهلاكهم من الطاقة، ويعون جيداً أهمية أجهزة التكييف المجدية والأرفق بالبيئة. ولكن جهات كثيرة لن تتحرّك لمجرد حافز سلامة المناخ ووقف هدر الطاقة، ما دامت لا تحركها حوافز قانونية. وعلى الحكومات أن تُقدِم عند الاهتمام بالتغيّر المناخي، على وضع التشريعات المناسبة. فبالنظم والحوافز والدعم، يمكن دفع الشركات إلى اعتماد الحلول الأجدى في مكاتبها.</p>\n          <h4 id=\"three\">ثلاثة</h4>\n          <p>وكما يتبيّن لنا، من عدد الحلول الملطِّفة للمشكلة، ومن تنوّعها، وهي الحلول التي أسلفنا الحديث عنها، فإن التكنولوجيا التي نحتاج إليها من أجل معالجة هذه التحديات، هي في مدى قدرتنا، لكنها ربما تتطلّب بعض التحسين، ودعماً استثمارياً أكبر!</p>\n          <p>ولا مانع من إضافة محتوى آخر ليس تحت أي قسم معين.</p>\n        </div>\n        `} />\n      </div>\n    </article>\n    <article class=\"my-3\" id=\"spinners\">\n      <div class=\"bd-heading sticky-xl-top align-self-start mt-5 mb-3 mt-xl-0 mb-xl-2\">\n        <h3>الدوائر المتحركة</h3>\n        <a class=\"d-flex align-items-center\" hreflang=\"en\" href={getVersionedDocsPath('components/spinners')}>دليل الإستخدام</a>\n      </div>\n\n      <div>\n        <Example showMarkup={false} code={getData('theme-colors').map((themeColor) => `\n        <div class=\"spinner-border text-${themeColor.name}\" role=\"status\">\n          <span class=\"visually-hidden\">جار التحميل...</span>\n        </div>\n        `)} />\n\n        <Example showMarkup={false} code={getData('theme-colors').map((themeColor) => `\n        <div class=\"spinner-grow text-${themeColor.name}\" role=\"status\">\n          <span class=\"visually-hidden\">جار التحميل...</span>\n        </div>\n        `)} />\n      </div>\n    </article>\n    <article class=\"my-3\" id=\"toasts\">\n      <div class=\"bd-heading sticky-xl-top align-self-start mt-5 mb-3 mt-xl-0 mb-xl-2\">\n        <h3>الإشعارات</h3>\n        <a class=\"d-flex align-items-center\" hreflang=\"en\" href={getVersionedDocsPath('components/toasts')}>دليل الإستخدام</a>\n      </div>\n\n      <div>\n        <Example showMarkup={false} class=\"bg-dark p-5 align-items-center\" code={`\n        <div class=\"toast\" role=\"alert\" aria-live=\"assertive\" aria-atomic=\"true\">\n          <div class=\"toast-header\">\n            <Placeholder width=\"20\" height=\"20\" background=\"#007aff\" class=\"rounded me-2\" text={false} title={false} />\n            <strong class=\"me-auto\">Bootstrap</strong>\n            <small class=\"text-body-secondary\">قبل 11 دقيقة</small>\n            <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"toast\" aria-label=\"قريب\"></button>\n          </div>\n          <div class=\"toast-body\">\n            مرحبًا بالعالم! هذه رسالة إشعار.\n          </div>\n        </div>\n        `} />\n      </div>\n    </article>\n    <article class=\"mt-3 mb-5 pb-5\" id=\"tooltips\">\n      <div class=\"bd-heading sticky-xl-top align-self-start mt-5 mb-3 mt-xl-0 mb-xl-2\">\n        <h3>التلميحات</h3>\n        <a class=\"d-flex align-items-center\" hreflang=\"en\" href={getVersionedDocsPath('components/tooltips')}>دليل الإستخدام</a>\n      </div>\n\n      <div>\n        <Example showMarkup={false} class=\"tooltip-demo\" code={`\n        <button type=\"button\" class=\"btn btn-secondary\" data-bs-toggle=\"tooltip\" data-bs-placement=\"top\" title=\"تلميح يظهر في الأعلى\">تلميح يظهر في الأعلى</button>\n        <button type=\"button\" class=\"btn btn-secondary\" data-bs-toggle=\"tooltip\" data-bs-placement=\"right\" title=\"تلميح يظهر على اليسار\">تلميح يظهر على اليسار</button>\n        <button type=\"button\" class=\"btn btn-secondary\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"تلميح يظهر في الأسفل\">تلميح يظهر في الأسفل</button>\n        <button type=\"button\" class=\"btn btn-secondary\" data-bs-toggle=\"tooltip\" data-bs-placement=\"left\" title=\"تلميح يظهر على اليمين\">تلميح يظهر على اليمين</button>\n        <button type=\"button\" class=\"btn btn-secondary\" data-bs-toggle=\"tooltip\" data-bs-html=\"true\" title=\"<em>تلميح</em> <u>مع</u> <b>HTML</b>\">تلميح مع HTML</button>\n        `} />\n      </div>\n    </article>\n  </section>\n</main>\n\n<div class=\"modal fade\" id=\"exampleModalDefault\" tabindex=\"-1\" aria-labelledby=\"exampleModalLabel\" aria-hidden=\"true\">\n  <div class=\"modal-dialog\">\n    <div class=\"modal-content\">\n      <div class=\"modal-header\">\n        <h1 class=\"modal-title fs-5\" id=\"exampleModalLabel\">عنوان الصندوق العائم</h1>\n        <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"إغلاق\"></button>\n      </div>\n      <div class=\"modal-body\">\n        ...\n      </div>\n      <div class=\"modal-footer\">\n        <button type=\"button\" class=\"btn btn-secondary\" data-bs-dismiss=\"modal\">إغلاق</button>\n        <button type=\"button\" class=\"btn btn-primary\">حفظ التغيرات</button>\n      </div>\n    </div>\n  </div>\n</div>\n<div class=\"modal fade\" id=\"staticBackdropLive\" data-bs-backdrop=\"static\" data-bs-keyboard=\"false\" tabindex=\"-1\" aria-labelledby=\"staticBackdropLiveLabel\" aria-hidden=\"true\">\n  <div class=\"modal-dialog\">\n    <div class=\"modal-content\">\n      <div class=\"modal-header\">\n        <h1 class=\"modal-title fs-5\" id=\"staticBackdropLiveLabel\">عنوان الصندوق العائم</h1>\n        <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"إغلاق\"></button>\n      </div>\n      <div class=\"modal-body\">\n        <p>لن أغلق إذا نقرت خارجي. لا تحاول حتى الضغط على مفتاح الهروب.</p>\n      </div>\n      <div class=\"modal-footer\">\n        <button type=\"button\" class=\"btn btn-secondary\" data-bs-dismiss=\"modal\">إغلاق</button>\n        <button type=\"button\" class=\"btn btn-primary\">حسنًا</button>\n      </div>\n    </div>\n  </div>\n</div>\n<div class=\"modal fade\" id=\"exampleModalCenteredScrollable\" tabindex=\"-1\" aria-labelledby=\"exampleModalCenteredScrollableTitle\" aria-hidden=\"true\">\n  <div class=\"modal-dialog modal-dialog-centered modal-dialog-scrollable\">\n    <div class=\"modal-content\">\n      <div class=\"modal-header\">\n        <h1 class=\"modal-title fs-5\" id=\"exampleModalCenteredScrollableTitle\">عنوان الصندوق العائم</h1>\n        <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"إغلاق\"></button>\n      </div>\n      <div class=\"modal-body\">\n        <p>نص لتوضيح عمل الصندوق العائم المتنصّف عاموديًا القابل للتمرير</p>\n        <p>في هذه الحالة، هذا الصندوق يحتوي على محتوى أكثر قليلًا، ولذلك لتوضيح كيف  يمكن إضافة خاصية الإنتصاف العامودي لصندوق عائم قابل للتمرير.</p>\n        <p>يعتبر كوب أو فنجان القهوة عادة يومية عند غالبية سكان الكرة الأرضية في الصباح والمساء، وفي حين تكثر الدراسات حول إيجابياتها هناك أيضا سلبيات كثيرة للمشروب المفضل للكثيرين.</p>\n        <p>وفي هذا الشأن، أظهرت دراسة جديدة أن تناول الكافيين بانتظام يقلل من حجم المادة الرمادية في الدماغ، مما يشير إلى أن تناول القهوة يمكن أن يضعف القدرة على معالجة المعلومات، وفقاً لما نشرته \"ديلي ميل\" البريطانية.</p>\n        <p>وأعطى باحثون سويسريون متطوعين ثلاث حصص من الكافيين 150 ملغم يوميًا لمدة 10 أيام - وهو مقدار كافيين يعادل حوالي أربعة أو خمسة أكواب صغيرة من القهوة المخمرة يوميًا، أو سبعة إسبريسو فردي.</p>\n        <p>وتبين حدوث انخفاض في المادة الرمادية، والتي توجد غالبًا في الطبقة الخارجية للدماغ، أو القشرة، وتعمل على معالجة المعلومات.</p>\n        <p>كما كان الانخفاض مذهلاً بشكل خاص في الفص الصدغي الإنسي الأيمن، بما في ذلك الحُصين، وهي منطقة من الدماغ ضرورية لتقوية الذاكرة.</p>\n      </div>\n      <div class=\"modal-footer\">\n        <button type=\"button\" class=\"btn btn-secondary\" data-bs-dismiss=\"modal\">إغلاق</button>\n        <button type=\"button\" class=\"btn btn-primary\">حفظ التغيرات</button>\n      </div>\n    </div>\n  </div>\n</div>\n<div class=\"modal fade\" id=\"exampleModalFullscreen\" tabindex=\"-1\" aria-labelledby=\"exampleModalFullscreenLabel\" aria-hidden=\"true\">\n  <div class=\"modal-dialog modal-fullscreen\">\n    <div class=\"modal-content\">\n      <div class=\"modal-header\">\n        <h1 class=\"modal-title fs-4\" id=\"exampleModalFullscreenLabel\">صندوق عائم يملأ الشاشة</h1>\n        <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"إغلاق\"></button>\n      </div>\n      <div class=\"modal-body\">\n        <p>في ما يلي، نص طويل لتعبئة كامل الشاشة. قد يبدو أنني أثرثر كثيرًا، لذا سأقوم بنسخ مقالة من إحدى الصحف العربية.</p>\n        <p>تكييف الهواء هو من التكنولوجيا التي ما إن نمتلكها حتى نصبح عاجزين عن تخيّل العيش من دونها. وتكييف الهواء في مناطق عديدة من العالم ليس ترفاً يمكن الاستغناء عنه. ولكن هذه الحاجة الحيوية تثير تحديات كبيرة على مستوى استهلاك الطاقة في معظم بلدان العالم. ويُتوقع أن تتفاقم هذه التحديات خلال العقود الثلاثة المقبلة، مع توقُّع ارتفاع عدد المكيفات في العالم نحو ثلاثة أضعاف. وفي حين أن الابتكارات التكنولوجية تحقِّق كل يوم إنجازاً جديداً، وعلى الرغم من بعض التحسينات والتدابير المحدودة التي طرأت على صناعة المكيفات، “فإن تكنولوجيتها الأساسية لا تزال تعمل كما كانت، منذ اعتمادها قبل نحو قرن من السنين\"، حسبما جاء في تقرير لمعهد ماساشوستس للتكنولوجيا (MIT)، في الأول من سبتمبر 2020م. ولمعالجة هذه المشكلات الخطيرة، لا مفر من إعادة التفكير بجد.</p>\n        <p>التكييف حاجة حيويّة. فالتعرّض للحرارة لمدة طويلة ضارٌ بالصحة. ووفقاً لمنظمة الصحة العالميّة يمكن للتعرُّض الطويل للحرارة أيضاً أن يؤدي إلى \"إعياء حراري، وضربة شمس، وتورّم في الرجلين، وطفح جلدي على العنق، وتشنج، وصداع، وحساسيّة، والخمول والوهَن. ويمكن للحرارة أن تسبِّب جفافاً خطراً، وأعراضاً حادة في أوعية الدماغ الدمويّة، وتسهم في تكوّن الجلطات\".</p>\n        <p>وموجات الحر أيضاً من أشد المخاطر الطبيعيّة المميتة. إذ يقدَّر أن بين عامي 1998 و2017م، توفي نحو 166 ألف شخص من موجات الحر. ومات 70 ألفاً من هؤلاء في أوروبا سنة 2003م وحدها. ومن دون أن يصل الخطر إلى الموت، تتسبَّب الحرارة العالية بانخفاض الأداء المعرفي لدى الشبان البالغين في المباني غير المكيّفة. فقد بيّنت دراسة أجرتها \"كليّة ت. هـ. تشان\" للصحة العامة في جامعة هارفرد، نشرتها \"بلوس ميديسين\" في 10 يوليو 2018م، أن التلاميذ الذين ينامون في مهاجع غير مكيّفة، يقل أداؤهم عن أولئك الذين ينامون في مهاجع مكيّفة. ولتجنّب مخاطر التعرّض للحرارة، يلتفت الناس إلى استخدام التكييف.</p>\n        <p>يتطلّب التكييف كثيراً من الطاقة. فنحو %10 من استهلاك الكهرباء في العالم يُنفَق في تشغيل المكيّفات. وتصل هذه النسبة إلى %50 في المملكة حسب \"المركز السعودي لكفاءة الطاقة\". أضف إلى ذلك أن معظم البشر في بلدان العالم النامي، لم يقتنوا بعد مكيّفهم الأول، والمشكلة إلى ازدياد. فمعظم البلدان النامية هي من البلدان الأشد حرارة والأكثر اكتظاظاً بالسكان في العالم. وجاء في تقرير لوكالة الطاقة الدوليّة بعنوان \"مستقبل التبريد\"، ونُشر في مايو 2018م، أن في أجزاء من أمريكا الجنوبيّة وإفريقيا وآسيا والشرق الأوسط، يعيش 2.8 مليار نسمة، ولا يملك وحدات تكييف سوى %8 من المنازل. في حين الدول المتقدِّمة مثل كوريا الجنوبيّة، واليابان، والولايات المتحدة، فإن %89 من المنازل تملك مكيفات، وفي الصين %60 من البيوت تملكها أيضاً.</p>\n        <p>ولكن مع تنامي الدخل في بلدان الاقتصاد الصاعد، يتوقّع أن تزداد المنازل التي تقتني مكيّفاً. وبحسب مقالة نُشرت في صحيفة \"نيويورك تايمز\"، في 15 مايو 2018م، سيرتفع عدد المكيّفات في العالم من نحو 1.6 مليار حالياً، إلى 5.6 مليارات عام 2050م، طبقاً لمعدَّلات النمو الاقتصادي.</p>\n        <p>ومع الافتقار إلى الابتكار وتطوير النظم لفرض معايير الجدوى الأعلى، فسيتضاعف استهلاك الطاقة لتشغيل المكيّفات ثلاثة أضعاف. وسينتج من ذلك طلب إضافي للطاقة يساوي مجموع إنتاج الطاقة في الصين حالياً. فمبيعات المكيّفات ترتفع اليوم في البلدان النامية، لكن فعاليّة هذه الوحدات مشكوك فيها. فمثلاً، أوسع وحدات التكييف انتشاراً في بعض الأسواق الآسيوية تتطلّب ضعفي ما تتطلّبه وحدات تكييف أجدى. والمكيّفات التي تباع في اليابان والاتحاد الأوروبي أجدى بنسبة %25 عادة، من تلك التي تباع في الصين والولايات المتحدة.</p>\n        <p>وبصرف النظر عن كثير من الطاقة التي يحتاج إليها المكيّف، فإنه يبث مقادير وفيرة من غازات الدفيئة نفسها. وطبقاً لموقع تكييف الهواء (airconditioning.com)، فإن المبرِّدات في معظم المكيّفات مثل مواد مركبات الكربون الكلورية فلورية أو مواد هيدروفلوروولفينات، ومركبات ثاني أكسيد الكربون الهيدروكلورية فلورية، أسوأ بكثير للبيئة من ثاني أكسيد الكربون، لأنها تحتبس من الحرارة مقادير أكبر حين تتسرّب إلى الجو.</p>\n        <p>وبالإضافة إلى ظاهرة الدفيئة، فهذه الغازات تسهم أيضاً بالإضرار بطبقة الأوزون. ويمكن لهذه المواد الكيميائية أن تتسرّب خلال عملية التصنيع أو التصليح. ويعرف كل من يملك في منزله مكيّفاً كم تتكرر أعطال هذه الأجهزة. ثم إن المكيف يُرمَى حين يتعطّل نهائياً ولا يعود قابلاً للإصلاح، والمواد المبرِّدة فيه ستتسرّب على الأرجح لتلوث الهواء.</p>\n      </div>\n      <div class=\"modal-footer\">\n        <button type=\"button\" class=\"btn btn-secondary\" data-bs-dismiss=\"modal\">إغلاق</button>\n      </div>\n    </div>\n  </div>\n</div>\n"
  },
  {
    "path": "site/src/assets/examples/checkout/checkout.css",
    "content": ".container {\n  max-width: 960px;\n}\n"
  },
  {
    "path": "site/src/assets/examples/checkout/checkout.js",
    "content": "// Example starter JavaScript for disabling form submissions if there are invalid fields\n(() => {\n  'use strict'\n\n  // Fetch all the forms we want to apply custom Bootstrap validation styles to\n  const forms = document.querySelectorAll('.needs-validation')\n\n  // Loop over them and prevent submission\n  Array.from(forms).forEach(form => {\n    form.addEventListener('submit', event => {\n      if (!form.checkValidity()) {\n        event.preventDefault()\n        event.stopPropagation()\n      }\n\n      form.classList.add('was-validated')\n    }, false)\n  })\n})()\n"
  },
  {
    "path": "site/src/assets/examples/checkout/index.astro",
    "content": "---\nimport { getVersionedDocsPath } from '@libs/path'\n\nexport const title = 'Checkout example'\nexport const extra_css = ['checkout.css']\nexport const extra_js = [{ src: 'checkout.js' }]\nexport const body_class = 'bg-body-tertiary'\n---\n\n<div class=\"container\">\n  <main>\n    <div class=\"py-5 text-center\">\n      <img class=\"d-block mx-auto mb-4\" src={getVersionedDocsPath('/assets/brand/bootstrap-logo.svg')} alt=\"\" width=\"72\" height=\"57\">\n      <h1 class=\"h2\">Checkout form</h1>\n      <p class=\"lead\">Below is an example form built entirely with Bootstrap’s form controls. Each required form group has a validation state that can be triggered by attempting to submit the form without completing it.</p>\n    </div>\n\n    <div class=\"row g-5\">\n      <div class=\"col-md-5 col-lg-4 order-md-last\">\n        <h4 class=\"d-flex justify-content-between align-items-center mb-3\">\n          <span class=\"text-primary\">Your cart</span>\n          <span class=\"badge bg-primary rounded-pill\">3</span>\n        </h4>\n        <ul class=\"list-group mb-3\">\n          <li class=\"list-group-item d-flex justify-content-between lh-sm\">\n            <div>\n              <h6 class=\"my-0\">Product name</h6>\n              <small class=\"text-body-secondary\">Brief description</small>\n            </div>\n            <span class=\"text-body-secondary\">$12</span>\n          </li>\n          <li class=\"list-group-item d-flex justify-content-between lh-sm\">\n            <div>\n              <h6 class=\"my-0\">Second product</h6>\n              <small class=\"text-body-secondary\">Brief description</small>\n            </div>\n            <span class=\"text-body-secondary\">$8</span>\n          </li>\n          <li class=\"list-group-item d-flex justify-content-between lh-sm\">\n            <div>\n              <h6 class=\"my-0\">Third item</h6>\n              <small class=\"text-body-secondary\">Brief description</small>\n            </div>\n            <span class=\"text-body-secondary\">$5</span>\n          </li>\n          <li class=\"list-group-item d-flex justify-content-between bg-body-tertiary\">\n            <div class=\"text-success\">\n              <h6 class=\"my-0\">Promo code</h6>\n              <small>EXAMPLECODE</small>\n            </div>\n            <span class=\"text-success\">−$5</span>\n          </li>\n          <li class=\"list-group-item d-flex justify-content-between\">\n            <span>Total (USD)</span>\n            <strong>$20</strong>\n          </li>\n        </ul>\n\n        <form class=\"card p-2\">\n          <div class=\"input-group\">\n            <input type=\"text\" class=\"form-control\" placeholder=\"Promo code\">\n            <button type=\"submit\" class=\"btn btn-secondary\">Redeem</button>\n          </div>\n        </form>\n      </div>\n      <div class=\"col-md-7 col-lg-8\">\n        <h4 class=\"mb-3\">Billing address</h4>\n        <form class=\"needs-validation\" novalidate>\n          <div class=\"row g-3\">\n            <div class=\"col-sm-6\">\n              <label for=\"firstName\" class=\"form-label\">First name</label>\n              <input type=\"text\" class=\"form-control\" id=\"firstName\" placeholder=\"\" value=\"\" required>\n              <div class=\"invalid-feedback\">\n                Valid first name is required.\n              </div>\n            </div>\n\n            <div class=\"col-sm-6\">\n              <label for=\"lastName\" class=\"form-label\">Last name</label>\n              <input type=\"text\" class=\"form-control\" id=\"lastName\" placeholder=\"\" value=\"\" required>\n              <div class=\"invalid-feedback\">\n                Valid last name is required.\n              </div>\n            </div>\n\n            <div class=\"col-12\">\n              <label for=\"username\" class=\"form-label\">Username</label>\n              <div class=\"input-group has-validation\">\n                <span class=\"input-group-text\">@</span>\n                <input type=\"text\" class=\"form-control\" id=\"username\" placeholder=\"Username\" required>\n              <div class=\"invalid-feedback\">\n                  Your username is required.\n                </div>\n              </div>\n            </div>\n\n            <div class=\"col-12\">\n              <label for=\"email\" class=\"form-label\">Email <span class=\"text-body-secondary\">(Optional)</span></label>\n              <input type=\"email\" class=\"form-control\" id=\"email\" placeholder=\"you@example.com\">\n              <div class=\"invalid-feedback\">\n                Please enter a valid email address for shipping updates.\n              </div>\n            </div>\n\n            <div class=\"col-12\">\n              <label for=\"address\" class=\"form-label\">Address</label>\n              <input type=\"text\" class=\"form-control\" id=\"address\" placeholder=\"1234 Main St\" required>\n              <div class=\"invalid-feedback\">\n                Please enter your shipping address.\n              </div>\n            </div>\n\n            <div class=\"col-12\">\n              <label for=\"address2\" class=\"form-label\">Address 2 <span class=\"text-body-secondary\">(Optional)</span></label>\n              <input type=\"text\" class=\"form-control\" id=\"address2\" placeholder=\"Apartment or suite\">\n            </div>\n\n            <div class=\"col-md-5\">\n              <label for=\"country\" class=\"form-label\">Country</label>\n              <select class=\"form-select\" id=\"country\" required>\n                <option value=\"\">Choose...</option>\n                <option>United States</option>\n              </select>\n              <div class=\"invalid-feedback\">\n                Please select a valid country.\n              </div>\n            </div>\n\n            <div class=\"col-md-4\">\n              <label for=\"state\" class=\"form-label\">State</label>\n              <select class=\"form-select\" id=\"state\" required>\n                <option value=\"\">Choose...</option>\n                <option>California</option>\n              </select>\n              <div class=\"invalid-feedback\">\n                Please provide a valid state.\n              </div>\n            </div>\n\n            <div class=\"col-md-3\">\n              <label for=\"zip\" class=\"form-label\">Zip</label>\n              <input type=\"text\" class=\"form-control\" id=\"zip\" placeholder=\"\" required>\n              <div class=\"invalid-feedback\">\n                Zip code required.\n              </div>\n            </div>\n          </div>\n\n          <hr class=\"my-4\">\n\n          <div class=\"form-check\">\n            <input type=\"checkbox\" class=\"form-check-input\" id=\"same-address\">\n            <label class=\"form-check-label\" for=\"same-address\">Shipping address is the same as my billing address</label>\n          </div>\n\n          <div class=\"form-check\">\n            <input type=\"checkbox\" class=\"form-check-input\" id=\"save-info\">\n            <label class=\"form-check-label\" for=\"save-info\">Save this information for next time</label>\n          </div>\n\n          <hr class=\"my-4\">\n\n          <h4 class=\"mb-3\">Payment</h4>\n\n          <div class=\"my-3\">\n            <div class=\"form-check\">\n              <input id=\"credit\" name=\"paymentMethod\" type=\"radio\" class=\"form-check-input\" checked required>\n              <label class=\"form-check-label\" for=\"credit\">Credit card</label>\n            </div>\n            <div class=\"form-check\">\n              <input id=\"debit\" name=\"paymentMethod\" type=\"radio\" class=\"form-check-input\" required>\n              <label class=\"form-check-label\" for=\"debit\">Debit card</label>\n            </div>\n            <div class=\"form-check\">\n              <input id=\"paypal\" name=\"paymentMethod\" type=\"radio\" class=\"form-check-input\" required>\n              <label class=\"form-check-label\" for=\"paypal\">PayPal</label>\n            </div>\n          </div>\n\n          <div class=\"row gy-3\">\n            <div class=\"col-md-6\">\n              <label for=\"cc-name\" class=\"form-label\">Name on card</label>\n              <input type=\"text\" class=\"form-control\" id=\"cc-name\" placeholder=\"\" required>\n              <small class=\"text-body-secondary\">Full name as displayed on card</small>\n              <div class=\"invalid-feedback\">\n                Name on card is required\n              </div>\n            </div>\n\n            <div class=\"col-md-6\">\n              <label for=\"cc-number\" class=\"form-label\">Credit card number</label>\n              <input type=\"text\" class=\"form-control\" id=\"cc-number\" placeholder=\"\" required>\n              <div class=\"invalid-feedback\">\n                Credit card number is required\n              </div>\n            </div>\n\n            <div class=\"col-md-3\">\n              <label for=\"cc-expiration\" class=\"form-label\">Expiration</label>\n              <input type=\"text\" class=\"form-control\" id=\"cc-expiration\" placeholder=\"\" required>\n              <div class=\"invalid-feedback\">\n                Expiration date required\n              </div>\n            </div>\n\n            <div class=\"col-md-3\">\n              <label for=\"cc-cvv\" class=\"form-label\">CVV</label>\n              <input type=\"text\" class=\"form-control\" id=\"cc-cvv\" placeholder=\"\" required>\n              <div class=\"invalid-feedback\">\n                Security code required\n              </div>\n            </div>\n          </div>\n\n          <hr class=\"my-4\">\n\n          <button class=\"w-100 btn btn-primary btn-lg\" type=\"submit\">Continue to checkout</button>\n        </form>\n      </div>\n    </div>\n  </main>\n\n  <footer class=\"my-5 pt-5 text-body-secondary text-center text-small\">\n    <p class=\"mb-1\">&copy; 2017–{new Date().getFullYear()} Company Name</p>\n    <ul class=\"list-inline\">\n      <li class=\"list-inline-item\"><a href=\"#\">Privacy</a></li>\n      <li class=\"list-inline-item\"><a href=\"#\">Terms</a></li>\n      <li class=\"list-inline-item\"><a href=\"#\">Support</a></li>\n    </ul>\n  </footer>\n</div>\n"
  },
  {
    "path": "site/src/assets/examples/checkout-rtl/index.astro",
    "content": "---\nimport { getVersionedDocsPath } from '@libs/path'\n\nexport const title = 'مثال إتمام الشراء'\nexport const direction = 'rtl'\nexport const extra_css = ['../checkout/checkout.css']\nexport const extra_js = [{ src: '../checkout/checkout.js' }]\nexport const body_class = 'bg-body-tertiary'\n---\n\n<div class=\"container\">\n  <main>\n    <div class=\"py-5 text-center\">\n      <img class=\"d-block mx-auto mb-4\" src={getVersionedDocsPath('/assets/brand/bootstrap-logo.svg')} alt=\"\" width=\"72\" height=\"57\">\n      <h1 class=\"h2\">نموذج إتمام الشراء</h1>\n      <p class=\"lead\">فيما يلي مثال على نموذج تم إنشاؤه بالكامل باستخدام عناصر تحكم النموذج في Bootstrap. لكل مجموعة نماذج مطلوبة حالة تحقق يمكن تشغيلها بمحاولة إرسال النموذج دون استكماله.</p>\n    </div>\n\n    <div class=\"row g-3\">\n      <div class=\"col-md-5 col-lg-4 order-md-last\">\n        <h4 class=\"d-flex justify-content-between align-items-center mb-3\">\n          <span class=\"text-body-secondary\">عربة التسوق</span>\n          <span class=\"badge bg-secondary rounded-pill\">3</span>\n        </h4>\n        <ul class=\"list-group mb-3\">\n          <li class=\"list-group-item d-flex justify-content-between lh-sm\">\n            <div>\n              <h6 class=\"my-0\">اسم المنتج</h6>\n              <small class=\"text-body-secondary\">وصف مختصر</small>\n            </div>\n            <span class=\"text-body-secondary\">$12</span>\n          </li>\n          <li class=\"list-group-item d-flex justify-content-between lh-sm\">\n            <div>\n              <h6 class=\"my-0\">المنتج الثاني</h6>\n              <small class=\"text-body-secondary\">وصف مختصر</small>\n            </div>\n            <span class=\"text-body-secondary\">$8</span>\n          </li>\n          <li class=\"list-group-item d-flex justify-content-between lh-sm\">\n            <div>\n              <h6 class=\"my-0\">البند الثالث</h6>\n              <small class=\"text-body-secondary\">وصف مختصر</small>\n            </div>\n            <span class=\"text-body-secondary\">$5</span>\n          </li>\n          <li class=\"list-group-item d-flex justify-content-between bg-body-tertiary\">\n            <div class=\"text-success\">\n              <h6 class=\"my-0\">رمز ترويجي</h6>\n              <small>EXAMPLECODE</small>\n            </div>\n            <span class=\"text-success\">-$5</span>\n          </li>\n          <li class=\"list-group-item d-flex justify-content-between\">\n            <span>مجموع (USD)</span>\n            <strong>$20</strong>\n          </li>\n        </ul>\n\n        <form class=\"card p-2\">\n          <div class=\"input-group\">\n            <input type=\"text\" class=\"form-control\" placeholder=\"رمز ترويجي\">\n            <button type=\"submit\" class=\"btn btn-secondary\">تحقق</button>\n          </div>\n        </form>\n      </div>\n      <div class=\"col-md-7 col-lg-8\">\n        <h4 class=\"mb-3\">عنوان الفوترة</h4>\n        <form class=\"needs-validation\" novalidate>\n          <div class=\"row g-3\">\n            <div class=\"col-sm-6\">\n              <label for=\"firstName\" class=\"form-label\">الاسم الأول</label>\n              <input type=\"text\" class=\"form-control\" id=\"firstName\" placeholder=\"\" value=\"\" required>\n              <div class=\"invalid-feedback\">\n                يرجى إدخال اسم أول صحيح.\n              </div>\n            </div>\n\n            <div class=\"col-sm-6\">\n              <label for=\"lastName\" class=\"form-label\">اسم العائلة</label>\n              <input type=\"text\" class=\"form-control\" id=\"lastName\" placeholder=\"\" value=\"\" required>\n              <div class=\"invalid-feedback\">\n                يرجى إدخال اسم عائلة صحيح.\n              </div>\n            </div>\n\n            <div class=\"col-12\">\n              <label for=\"username\" class=\"form-label\">اسم المستخدم</label>\n              <div class=\"input-group has-validation\">\n                <span class=\"input-group-text\">@</span>\n                <input type=\"text\" class=\"form-control\" id=\"username\" placeholder=\"اسم المستخدم\" required>\n              <div class=\"invalid-feedback\">\n                اسم المستخدم الخاص بك مطلوب.\n                </div>\n              </div>\n            </div>\n\n            <div class=\"col-12\">\n              <label for=\"email\" class=\"form-label\">البريد الإلكتروني <span class=\"text-body-secondary\">(اختياري)</span></label>\n              <input type=\"email\" class=\"form-control\" id=\"email\" placeholder=\"you@example.com\">\n              <div class=\"invalid-feedback\">\n                يرجى إدخال عنوان بريد إلكتروني صحيح لتصلكم تحديثات الشحن.\n              </div>\n            </div>\n\n            <div class=\"col-12\">\n              <label for=\"address\" class=\"form-label\">العنوان</label>\n              <input type=\"text\" class=\"form-control\" id=\"address\" placeholder=\"1234 الشارع الأول\" required>\n              <div class=\"invalid-feedback\">\n                يرجى إدخال عنوان الشحن الخاص بك.\n              </div>\n            </div>\n\n            <div class=\"col-12\">\n              <label for=\"address2\" class=\"form-label\">عنوان 2 <span class=\"text-body-secondary\">(اختياري)</span></label>\n              <input type=\"text\" class=\"form-control\" id=\"address2\" placeholder=\"شقة 24\">\n            </div>\n\n            <div class=\"col-md-5\">\n              <label for=\"country\" class=\"form-label\">البلد</label>\n              <select class=\"form-select\" id=\"country\" required>\n                <option value=\"\">اختر...</option>\n                <option>الولايات المتحدة الأمريكية</option>\n              </select>\n              <div class=\"invalid-feedback\">\n                يرجى اختيار بلد صحيح.\n              </div>\n            </div>\n\n            <div class=\"col-md-4\">\n              <label for=\"state\" class=\"form-label\">المنطقة</label>\n              <select class=\"form-select\" id=\"state\" required>\n                <option value=\"\">اختر...</option>\n                <option>كاليفورنيا</option>\n              </select>\n              <div class=\"invalid-feedback\">\n                يرجى اختيار اسم منطقة صحيح.\n              </div>\n            </div>\n\n            <div class=\"col-md-3\">\n              <label for=\"zip\" class=\"form-label\">الرمز البريدي</label>\n              <input type=\"text\" class=\"form-control\" id=\"zip\" placeholder=\"\" required>\n              <div class=\"invalid-feedback\">\n                الرمز البريدي مطلوب.\n              </div>\n            </div>\n          </div>\n\n          <hr class=\"my-4\">\n\n          <div class=\"form-check\">\n            <input type=\"checkbox\" class=\"form-check-input\" id=\"same-address\">\n            <label class=\"form-check-label\" for=\"same-address\">عنوان الشحن هو نفس عنوان الفوترة الخاص بي</label>\n          </div>\n\n          <div class=\"form-check\">\n            <input type=\"checkbox\" class=\"form-check-input\" id=\"save-info\">\n            <label class=\"form-check-label\" for=\"save-info\">احفظ هذه المعلومات في المرة القادمة</label>\n          </div>\n\n          <hr class=\"my-4\">\n\n          <h4 class=\"mb-3\">طريقة الدفع</h4>\n\n          <div class=\"my-3\">\n            <div class=\"form-check\">\n              <input id=\"credit\" name=\"paymentMethod\" type=\"radio\" class=\"form-check-input\" checked required>\n              <label class=\"form-check-label\" for=\"credit\">بطاقة ائتمان</label>\n            </div>\n            <div class=\"form-check\">\n              <input id=\"cash\" name=\"paymentMethod\" type=\"radio\" class=\"form-check-input\" required>\n              <label class=\"form-check-label\" for=\"cash\">نقد</label>\n            </div>\n            <div class=\"form-check\">\n              <input id=\"paypal\" name=\"paymentMethod\" type=\"radio\" class=\"form-check-input\" required>\n              <label class=\"form-check-label\" for=\"paypal\">PayPal</label>\n            </div>\n          </div>\n\n          <div class=\"row gy-3\">\n            <div class=\"col-md-6\">\n              <label for=\"cc-name\" class=\"form-label\">الاسم على البطاقة</label>\n              <input type=\"text\" class=\"form-control\" id=\"cc-name\" placeholder=\"\" required>\n              <small class=\"text-body-secondary\">الاسم الكامل كما هو معروض على البطاقة</small>\n              <div class=\"invalid-feedback\">\n                الاسم على البطاقة مطلوب\n              </div>\n            </div>\n\n            <div class=\"col-md-6\">\n              <label for=\"cc-number\" class=\"form-label\">رقم البطاقة</label>\n              <input type=\"text\" class=\"form-control\" id=\"cc-number\" placeholder=\"\" required>\n              <div class=\"invalid-feedback\">\n                رقم بطاقة الائتمان مطلوب\n              </div>\n            </div>\n\n            <div class=\"col-md-3\">\n              <label for=\"cc-expiration\" class=\"form-label\">تاريخ انتهاء الصلاحية</label>\n              <input type=\"text\" class=\"form-control\" id=\"cc-expiration\" placeholder=\"\" required>\n              <div class=\"invalid-feedback\">\n                تاريخ انتهاء الصلاحية مطلوب\n              </div>\n            </div>\n\n            <div class=\"col-md-3\">\n              <label for=\"cc-cvv\" class=\"form-label\">الرمز الثلاثي (CVV)</label>\n              <input type=\"text\" class=\"form-control\" id=\"cc-cvv\" placeholder=\"\" required>\n              <div class=\"invalid-feedback\">\n                رمز الحماية مطلوب\n              </div>\n            </div>\n          </div>\n\n          <hr class=\"my-4\">\n\n          <button class=\"w-100 btn btn-primary btn-lg\" type=\"submit\">الاستمرار بالدفع</button>\n        </form>\n      </div>\n    </div>\n  </main>\n  <footer class=\"my-5 pt-5 text-body-secondary text-center text-small\">\n    <p class=\"mb-1\">&copy; {new Date().getFullYear()}-2017 اسم الشركة</p>\n    <ul class=\"list-inline\">\n      <li class=\"list-inline-item\"><a href=\"#\">سياسة الخصوصية</a></li>\n      <li class=\"list-inline-item\"><a href=\"#\">اتفاقية الاستخدام</a></li>\n      <li class=\"list-inline-item\"><a href=\"#\">الدعم الفني</a></li>\n    </ul>\n  </footer>\n</div>\n"
  },
  {
    "path": "site/src/assets/examples/cover/cover.css",
    "content": "/*\n * Globals\n */\n\n\n/* Custom default button */\n.btn-light,\n.btn-light:hover,\n.btn-light:focus {\n  color: #333;\n  text-shadow: none; /* Prevent inheritance from `body` */\n}\n\n\n/*\n * Base structure\n */\n\nbody {\n  text-shadow: 0 .05rem .1rem rgba(0, 0, 0, .5);\n  box-shadow: inset 0 0 5rem rgba(0, 0, 0, .5);\n}\n\n.cover-container {\n  max-width: 42em;\n}\n\n\n/*\n * Header\n */\n\n.nav-masthead .nav-link {\n  color: rgba(255, 255, 255, .5);\n  border-bottom: .25rem solid transparent;\n}\n\n.nav-masthead .nav-link:hover,\n.nav-masthead .nav-link:focus {\n  border-bottom-color: rgba(255, 255, 255, .25);\n}\n\n.nav-masthead .nav-link + .nav-link {\n  margin-left: 1rem;\n}\n\n.nav-masthead .active {\n  color: #fff;\n  border-bottom-color: #fff;\n}\n"
  },
  {
    "path": "site/src/assets/examples/cover/index.astro",
    "content": "---\nexport const title = 'Cover Template'\nexport const extra_css = ['cover.css']\nexport const html_class = 'h-100'\nexport const body_class = 'd-flex h-100 text-center text-bg-dark'\n---\n\n<div class=\"cover-container d-flex w-100 h-100 p-3 mx-auto flex-column\">\n  <header class=\"mb-auto\">\n    <div>\n      <h3 class=\"float-md-start mb-0\">Cover</h3>\n      <nav class=\"nav nav-masthead justify-content-center float-md-end\">\n        <a class=\"nav-link fw-bold py-1 px-0 active\" aria-current=\"page\" href=\"#\">Home</a>\n        <a class=\"nav-link fw-bold py-1 px-0\" href=\"#\">Features</a>\n        <a class=\"nav-link fw-bold py-1 px-0\" href=\"#\">Contact</a>\n      </nav>\n    </div>\n  </header>\n\n  <main class=\"px-3\">\n    <h1>Cover your page.</h1>\n    <p class=\"lead\">Cover is a one-page template for building simple and beautiful home pages. Download, edit the text, and add your own fullscreen background photo to make it your own.</p>\n    <p class=\"lead\">\n      <a href=\"#\" class=\"btn btn-lg btn-light fw-bold border-white bg-white\">Learn more</a>\n    </p>\n  </main>\n\n  <footer class=\"mt-auto text-white-50\">\n    <p>Cover template for <a href=\"https://getbootstrap.com/\" class=\"text-white\">Bootstrap</a>, by <a href=\"https://x.com/mdo\" class=\"text-white\">@mdo</a>.</p>\n  </footer>\n</div>\n"
  },
  {
    "path": "site/src/assets/examples/dashboard/dashboard.css",
    "content": ".bi {\n  display: inline-block;\n  width: 1rem;\n  height: 1rem;\n}\n\n/*\n * Sidebar\n */\n\n@media (min-width: 768px) {\n  .sidebar .offcanvas-lg {\n    position: -webkit-sticky;\n    position: sticky;\n    top: 48px;\n  }\n  .navbar-search {\n    display: block;\n  }\n}\n\n.sidebar .nav-link {\n  font-size: .875rem;\n  font-weight: 500;\n}\n\n.sidebar .nav-link.active {\n  color: #2470dc;\n}\n\n.sidebar-heading {\n  font-size: .75rem;\n}\n\n/*\n * Navbar\n */\n\n.navbar-brand {\n  padding-top: .75rem;\n  padding-bottom: .75rem;\n  background-color: rgba(0, 0, 0, .25);\n  box-shadow: inset -1px 0 0 rgba(0, 0, 0, .25);\n}\n\n.navbar .form-control {\n  padding: .75rem 1rem;\n}\n"
  },
  {
    "path": "site/src/assets/examples/dashboard/dashboard.js",
    "content": "/* globals Chart:false */\n\n(() => {\n  'use strict'\n\n  // Graphs\n  const ctx = document.getElementById('myChart')\n  new Chart(ctx, {\n    type: 'line',\n    data: {\n      labels: [\n        'Sunday',\n        'Monday',\n        'Tuesday',\n        'Wednesday',\n        'Thursday',\n        'Friday',\n        'Saturday'\n      ],\n      datasets: [{\n        data: [\n          15339,\n          21345,\n          18483,\n          24003,\n          23489,\n          24092,\n          12034\n        ],\n        lineTension: 0,\n        backgroundColor: 'transparent',\n        borderColor: '#007bff',\n        borderWidth: 4,\n        pointBackgroundColor: '#007bff'\n      }]\n    },\n    options: {\n      plugins: {\n        legend: {\n          display: false\n        },\n        tooltip: {\n          boxPadding: 3\n        }\n      }\n    }\n  })\n})()\n"
  },
  {
    "path": "site/src/assets/examples/dashboard/dashboard.rtl.css",
    "content": ".bi {\n  display: inline-block;\n  width: 1rem;\n  height: 1rem;\n}\n\n/*\n * Sidebar\n */\n\n@media (min-width: 768px) {\n  .sidebar .offcanvas-lg {\n    position: -webkit-sticky;\n    position: sticky;\n    top: 48px;\n  }\n  .navbar-search {\n    display: block;\n  }\n}\n\n.sidebar .nav-link {\n  font-size: .875rem;\n  font-weight: 500;\n}\n\n.sidebar .nav-link.active {\n  color: #2470dc;\n}\n\n.sidebar-heading {\n  font-size: .75rem;\n}\n\n/*\n * Navbar\n */\n\n.navbar-brand {\n  padding-top: .75rem;\n  padding-bottom: .75rem;\n  background-color: rgba(0, 0, 0, .25);\n  box-shadow: inset 1px 0 0 rgba(0, 0, 0, .25);\n}\n\n.navbar .form-control {\n  padding: .75rem 1rem;\n}\n"
  },
  {
    "path": "site/src/assets/examples/dashboard/index.astro",
    "content": "---\nexport const title = 'Dashboard Template'\nexport const extra_css = ['dashboard.css']\nexport const extra_js = [\n  { src: 'https://cdn.jsdelivr.net/npm/chart.js@4.3.2/dist/chart.umd.js', integrity: 'sha384-eI7PSr3L1XLISH8JdDII5YN/njoSsxfbrkCTnJrzXt+ENP5MOVBxD+l6sEG4zoLp'},\n  { src: 'dashboard.js'}\n]\n---\n\n<svg xmlns=\"http://www.w3.org/2000/svg\" class=\"d-none\">\n  <symbol id=\"calendar3\" viewBox=\"0 0 16 16\">\n    <path d=\"M14 0H2a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2zM1 3.857C1 3.384 1.448 3 2 3h12c.552 0 1 .384 1 .857v10.286c0 .473-.448.857-1 .857H2c-.552 0-1-.384-1-.857V3.857z\"/>\n    <path d=\"M6.5 7a1 1 0 1 0 0-2 1 1 0 0 0 0 2zm3 0a1 1 0 1 0 0-2 1 1 0 0 0 0 2zm3 0a1 1 0 1 0 0-2 1 1 0 0 0 0 2zm-9 3a1 1 0 1 0 0-2 1 1 0 0 0 0 2zm3 0a1 1 0 1 0 0-2 1 1 0 0 0 0 2zm3 0a1 1 0 1 0 0-2 1 1 0 0 0 0 2zm3 0a1 1 0 1 0 0-2 1 1 0 0 0 0 2zm-9 3a1 1 0 1 0 0-2 1 1 0 0 0 0 2zm3 0a1 1 0 1 0 0-2 1 1 0 0 0 0 2zm3 0a1 1 0 1 0 0-2 1 1 0 0 0 0 2z\"/>\n  </symbol>\n  <symbol id=\"cart\" viewBox=\"0 0 16 16\">\n    <path d=\"M0 1.5A.5.5 0 0 1 .5 1H2a.5.5 0 0 1 .485.379L2.89 3H14.5a.5.5 0 0 1 .49.598l-1 5a.5.5 0 0 1-.465.401l-9.397.472L4.415 11H13a.5.5 0 0 1 0 1H4a.5.5 0 0 1-.491-.408L2.01 3.607 1.61 2H.5a.5.5 0 0 1-.5-.5zM3.102 4l.84 4.479 9.144-.459L13.89 4H3.102zM5 12a2 2 0 1 0 0 4 2 2 0 0 0 0-4zm7 0a2 2 0 1 0 0 4 2 2 0 0 0 0-4zm-7 1a1 1 0 1 1 0 2 1 1 0 0 1 0-2zm7 0a1 1 0 1 1 0 2 1 1 0 0 1 0-2z\"/>\n  </symbol>\n  <symbol id=\"chevron-right\" viewBox=\"0 0 16 16\">\n    <path fill-rule=\"evenodd\" d=\"M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z\"/>\n  </symbol>\n  <symbol id=\"door-closed\" viewBox=\"0 0 16 16\">\n    <path d=\"M3 2a1 1 0 0 1 1-1h8a1 1 0 0 1 1 1v13h1.5a.5.5 0 0 1 0 1h-13a.5.5 0 0 1 0-1H3V2zm1 13h8V2H4v13z\"/>\n    <path d=\"M9 9a1 1 0 1 0 2 0 1 1 0 0 0-2 0z\"/>\n  </symbol>\n  <symbol id=\"file-earmark\" viewBox=\"0 0 16 16\">\n    <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\"/>\n  </symbol>\n  <symbol id=\"file-earmark-text\" viewBox=\"0 0 16 16\">\n    <path d=\"M5.5 7a.5.5 0 0 0 0 1h5a.5.5 0 0 0 0-1h-5zM5 9.5a.5.5 0 0 1 .5-.5h5a.5.5 0 0 1 0 1h-5a.5.5 0 0 1-.5-.5zm0 2a.5.5 0 0 1 .5-.5h2a.5.5 0 0 1 0 1h-2a.5.5 0 0 1-.5-.5z\"/>\n    <path d=\"M9.5 0H4a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2V4.5L9.5 0zm0 1v2A1.5 1.5 0 0 0 11 4.5h2V14a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1h5.5z\"/>\n  </symbol>\n  <symbol id=\"gear-wide-connected\" viewBox=\"0 0 16 16\">\n    <path d=\"M7.068.727c.243-.97 1.62-.97 1.864 0l.071.286a.96.96 0 0 0 1.622.434l.205-.211c.695-.719 1.888-.03 1.613.931l-.08.284a.96.96 0 0 0 1.187 1.187l.283-.081c.96-.275 1.65.918.931 1.613l-.211.205a.96.96 0 0 0 .434 1.622l.286.071c.97.243.97 1.62 0 1.864l-.286.071a.96.96 0 0 0-.434 1.622l.211.205c.719.695.03 1.888-.931 1.613l-.284-.08a.96.96 0 0 0-1.187 1.187l.081.283c.275.96-.918 1.65-1.613.931l-.205-.211a.96.96 0 0 0-1.622.434l-.071.286c-.243.97-1.62.97-1.864 0l-.071-.286a.96.96 0 0 0-1.622-.434l-.205.211c-.695.719-1.888.03-1.613-.931l.08-.284a.96.96 0 0 0-1.186-1.187l-.284.081c-.96.275-1.65-.918-.931-1.613l.211-.205a.96.96 0 0 0-.434-1.622l-.286-.071c-.97-.243-.97-1.62 0-1.864l.286-.071a.96.96 0 0 0 .434-1.622l-.211-.205c-.719-.695-.03-1.888.931-1.613l.284.08a.96.96 0 0 0 1.187-1.186l-.081-.284c-.275-.96.918-1.65 1.613-.931l.205.211a.96.96 0 0 0 1.622-.434l.071-.286zM12.973 8.5H8.25l-2.834 3.779A4.998 4.998 0 0 0 12.973 8.5zm0-1a4.998 4.998 0 0 0-7.557-3.779l2.834 3.78h4.723zM5.048 3.967c-.03.021-.058.043-.087.065l.087-.065zm-.431.355A4.984 4.984 0 0 0 3.002 8c0 1.455.622 2.765 1.615 3.678L7.375 8 4.617 4.322zm.344 7.646.087.065-.087-.065z\"/>\n  </symbol>\n  <symbol id=\"graph-up\" viewBox=\"0 0 16 16\">\n    <path fill-rule=\"evenodd\" d=\"M0 0h1v15h15v1H0V0Zm14.817 3.113a.5.5 0 0 1 .07.704l-4.5 5.5a.5.5 0 0 1-.74.037L7.06 6.767l-3.656 5.027a.5.5 0 0 1-.808-.588l4-5.5a.5.5 0 0 1 .758-.06l2.609 2.61 4.15-5.073a.5.5 0 0 1 .704-.07Z\"/>\n  </symbol>\n  <symbol id=\"house-fill\" viewBox=\"0 0 16 16\">\n    <path d=\"M8.707 1.5a1 1 0 0 0-1.414 0L.646 8.146a.5.5 0 0 0 .708.708L8 2.207l6.646 6.647a.5.5 0 0 0 .708-.708L13 5.793V2.5a.5.5 0 0 0-.5-.5h-1a.5.5 0 0 0-.5.5v1.293L8.707 1.5Z\"/>\n    <path d=\"m8 3.293 6 6V13.5a1.5 1.5 0 0 1-1.5 1.5h-9A1.5 1.5 0 0 1 2 13.5V9.293l6-6Z\"/>\n  </symbol>\n  <symbol id=\"list\" viewBox=\"0 0 16 16\">\n    <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\"/>\n  </symbol>\n  <symbol id=\"people\" viewBox=\"0 0 16 16\">\n    <path d=\"M15 14s1 0 1-1-1-4-5-4-5 3-5 4 1 1 1 1h8Zm-7.978-1A.261.261 0 0 1 7 12.996c.001-.264.167-1.03.76-1.72C8.312 10.629 9.282 10 11 10c1.717 0 2.687.63 3.24 1.276.593.69.758 1.457.76 1.72l-.008.002a.274.274 0 0 1-.014.002H7.022ZM11 7a2 2 0 1 0 0-4 2 2 0 0 0 0 4Zm3-2a3 3 0 1 1-6 0 3 3 0 0 1 6 0ZM6.936 9.28a5.88 5.88 0 0 0-1.23-.247A7.35 7.35 0 0 0 5 9c-4 0-5 3-5 4 0 .667.333 1 1 1h4.216A2.238 2.238 0 0 1 5 13c0-1.01.377-2.042 1.09-2.904.243-.294.526-.569.846-.816ZM4.92 10A5.493 5.493 0 0 0 4 13H1c0-.26.164-1.03.76-1.724.545-.636 1.492-1.256 3.16-1.275ZM1.5 5.5a3 3 0 1 1 6 0 3 3 0 0 1-6 0Zm3-2a2 2 0 1 0 0 4 2 2 0 0 0 0-4Z\"/>\n  </symbol>\n  <symbol id=\"plus-circle\" viewBox=\"0 0 16 16\">\n    <path d=\"M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14zm0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16z\"/>\n    <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\"/>\n  </symbol>\n  <symbol id=\"puzzle\" viewBox=\"0 0 16 16\">\n    <path d=\"M3.112 3.645A1.5 1.5 0 0 1 4.605 2H7a.5.5 0 0 1 .5.5v.382c0 .696-.497 1.182-.872 1.469a.459.459 0 0 0-.115.118.113.113 0 0 0-.012.025L6.5 4.5v.003l.003.01c.004.01.014.028.036.053a.86.86 0 0 0 .27.194C7.09 4.9 7.51 5 8 5c.492 0 .912-.1 1.19-.24a.86.86 0 0 0 .271-.194.213.213 0 0 0 .039-.063v-.009a.112.112 0 0 0-.012-.025.459.459 0 0 0-.115-.118c-.375-.287-.872-.773-.872-1.469V2.5A.5.5 0 0 1 9 2h2.395a1.5 1.5 0 0 1 1.493 1.645L12.645 6.5h.237c.195 0 .42-.147.675-.48.21-.274.528-.52.943-.52.568 0 .947.447 1.154.862C15.877 6.807 16 7.387 16 8s-.123 1.193-.346 1.638c-.207.415-.586.862-1.154.862-.415 0-.733-.246-.943-.52-.255-.333-.48-.48-.675-.48h-.237l.243 2.855A1.5 1.5 0 0 1 11.395 14H9a.5.5 0 0 1-.5-.5v-.382c0-.696.497-1.182.872-1.469a.459.459 0 0 0 .115-.118.113.113 0 0 0 .012-.025L9.5 11.5v-.003a.214.214 0 0 0-.039-.064.859.859 0 0 0-.27-.193C8.91 11.1 8.49 11 8 11c-.491 0-.912.1-1.19.24a.859.859 0 0 0-.271.194.214.214 0 0 0-.039.063v.003l.001.006a.113.113 0 0 0 .012.025c.016.027.05.068.115.118.375.287.872.773.872 1.469v.382a.5.5 0 0 1-.5.5H4.605a1.5 1.5 0 0 1-1.493-1.645L3.356 9.5h-.238c-.195 0-.42.147-.675.48-.21.274-.528.52-.943.52-.568 0-.947-.447-1.154-.862C.123 9.193 0 8.613 0 8s.123-1.193.346-1.638C.553 5.947.932 5.5 1.5 5.5c.415 0 .733.246.943.52.255.333.48.48.675.48h.238l-.244-2.855zM4.605 3a.5.5 0 0 0-.498.55l.001.007.29 3.4A.5.5 0 0 1 3.9 7.5h-.782c-.696 0-1.182-.497-1.469-.872a.459.459 0 0 0-.118-.115.112.112 0 0 0-.025-.012L1.5 6.5h-.003a.213.213 0 0 0-.064.039.86.86 0 0 0-.193.27C1.1 7.09 1 7.51 1 8c0 .491.1.912.24 1.19.07.14.14.225.194.271a.213.213 0 0 0 .063.039H1.5l.006-.001a.112.112 0 0 0 .025-.012.459.459 0 0 0 .118-.115c.287-.375.773-.872 1.469-.872H3.9a.5.5 0 0 1 .498.542l-.29 3.408a.5.5 0 0 0 .497.55h1.878c-.048-.166-.195-.352-.463-.557-.274-.21-.52-.528-.52-.943 0-.568.447-.947.862-1.154C6.807 10.123 7.387 10 8 10s1.193.123 1.638.346c.415.207.862.586.862 1.154 0 .415-.246.733-.52.943-.268.205-.415.39-.463.557h1.878a.5.5 0 0 0 .498-.55l-.001-.007-.29-3.4A.5.5 0 0 1 12.1 8.5h.782c.696 0 1.182.497 1.469.872.05.065.091.099.118.115.013.008.021.01.025.012a.02.02 0 0 0 .006.001h.003a.214.214 0 0 0 .064-.039.86.86 0 0 0 .193-.27c.14-.28.24-.7.24-1.191 0-.492-.1-.912-.24-1.19a.86.86 0 0 0-.194-.271.215.215 0 0 0-.063-.039H14.5l-.006.001a.113.113 0 0 0-.025.012.459.459 0 0 0-.118.115c-.287.375-.773.872-1.469.872H12.1a.5.5 0 0 1-.498-.543l.29-3.407a.5.5 0 0 0-.497-.55H9.517c.048.166.195.352.463.557.274.21.52.528.52.943 0 .568-.447.947-.862 1.154C9.193 5.877 8.613 6 8 6s-1.193-.123-1.638-.346C5.947 5.447 5.5 5.068 5.5 4.5c0-.415.246-.733.52-.943.268-.205.415-.39.463-.557H4.605z\"/>\n  </symbol>\n  <symbol id=\"search\" viewBox=\"0 0 16 16\">\n    <path d=\"M11.742 10.344a6.5 6.5 0 1 0-1.397 1.398h-.001c.03.04.062.078.098.115l3.85 3.85a1 1 0 0 0 1.415-1.414l-3.85-3.85a1.007 1.007 0 0 0-.115-.1zM12 6.5a5.5 5.5 0 1 1-11 0 5.5 5.5 0 0 1 11 0z\"/>\n  </symbol>\n</svg>\n\n<header class=\"navbar sticky-top bg-dark flex-md-nowrap p-0 shadow\" data-bs-theme=\"dark\">\n  <a class=\"navbar-brand col-md-3 col-lg-2 me-0 px-3 fs-6 text-white\" href=\"#\">Company name</a>\n\n  <ul class=\"navbar-nav flex-row d-md-none\">\n    <li class=\"nav-item text-nowrap\">\n      <button class=\"nav-link px-3 text-white\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbarSearch\" aria-controls=\"navbarSearch\" aria-expanded=\"false\" aria-label=\"Toggle search\">\n        <svg class=\"bi\" aria-hidden=\"true\"><use xlink:href=\"#search\"/></svg>\n      </button>\n    </li>\n    <li class=\"nav-item text-nowrap\">\n      <button class=\"nav-link px-3 text-white\" type=\"button\" data-bs-toggle=\"offcanvas\" data-bs-target=\"#sidebarMenu\" aria-controls=\"sidebarMenu\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n        <svg class=\"bi\" aria-hidden=\"true\"><use xlink:href=\"#list\"/></svg>\n      </button>\n    </li>\n  </ul>\n\n  <div id=\"navbarSearch\" class=\"navbar-search w-100 collapse\">\n    <input class=\"form-control w-100 rounded-0 border-0\" type=\"text\" placeholder=\"Search\" aria-label=\"Search\">\n  </div>\n</header>\n\n<div class=\"container-fluid\">\n  <div class=\"row\">\n    <div class=\"sidebar border border-right col-md-3 col-lg-2 p-0 bg-body-tertiary\">\n      <div class=\"offcanvas-md offcanvas-end bg-body-tertiary\" tabindex=\"-1\" id=\"sidebarMenu\" aria-labelledby=\"sidebarMenuLabel\">\n        <div class=\"offcanvas-header\">\n          <h5 class=\"offcanvas-title\" id=\"sidebarMenuLabel\">Company name</h5>\n          <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"offcanvas\" data-bs-target=\"#sidebarMenu\" aria-label=\"Close\"></button>\n        </div>\n        <div class=\"offcanvas-body d-md-flex flex-column p-0 pt-lg-3 overflow-y-auto\">\n          <ul class=\"nav flex-column\">\n            <li class=\"nav-item\">\n              <a class=\"nav-link d-flex align-items-center gap-2 active\" aria-current=\"page\" href=\"#\">\n                <svg class=\"bi\" aria-hidden=\"true\"><use xlink:href=\"#house-fill\"/></svg>\n                Dashboard\n              </a>\n            </li>\n            <li class=\"nav-item\">\n              <a class=\"nav-link d-flex align-items-center gap-2\" href=\"#\">\n                <svg class=\"bi\" aria-hidden=\"true\"><use xlink:href=\"#file-earmark\"/></svg>\n                Orders\n              </a>\n            </li>\n            <li class=\"nav-item\">\n              <a class=\"nav-link d-flex align-items-center gap-2\" href=\"#\">\n                <svg class=\"bi\" aria-hidden=\"true\"><use xlink:href=\"#cart\"/></svg>\n                Products\n              </a>\n            </li>\n            <li class=\"nav-item\">\n              <a class=\"nav-link d-flex align-items-center gap-2\" href=\"#\">\n                <svg class=\"bi\" aria-hidden=\"true\"><use xlink:href=\"#people\"/></svg>\n                Customers\n              </a>\n            </li>\n            <li class=\"nav-item\">\n              <a class=\"nav-link d-flex align-items-center gap-2\" href=\"#\">\n                <svg class=\"bi\" aria-hidden=\"true\"><use xlink:href=\"#graph-up\"/></svg>\n                Reports\n              </a>\n            </li>\n            <li class=\"nav-item\">\n              <a class=\"nav-link d-flex align-items-center gap-2\" href=\"#\">\n                <svg class=\"bi\" aria-hidden=\"true\"><use xlink:href=\"#puzzle\"/></svg>\n                Integrations\n              </a>\n            </li>\n          </ul>\n\n          <h6 class=\"sidebar-heading d-flex justify-content-between align-items-center px-3 mt-4 mb-1 text-body-secondary text-uppercase\">\n            <span>Saved reports</span>\n            <a class=\"link-secondary\" href=\"#\" aria-label=\"Add a new report\">\n              <svg class=\"bi\" aria-hidden=\"true\"><use xlink:href=\"#plus-circle\"/></svg>\n            </a>\n          </h6>\n          <ul class=\"nav flex-column mb-auto\">\n            <li class=\"nav-item\">\n              <a class=\"nav-link d-flex align-items-center gap-2\" href=\"#\">\n                <svg class=\"bi\" aria-hidden=\"true\"><use xlink:href=\"#file-earmark-text\"/></svg>\n                Current month\n              </a>\n            </li>\n            <li class=\"nav-item\">\n              <a class=\"nav-link d-flex align-items-center gap-2\" href=\"#\">\n                <svg class=\"bi\" aria-hidden=\"true\"><use xlink:href=\"#file-earmark-text\"/></svg>\n                Last quarter\n              </a>\n            </li>\n            <li class=\"nav-item\">\n              <a class=\"nav-link d-flex align-items-center gap-2\" href=\"#\">\n                <svg class=\"bi\" aria-hidden=\"true\"><use xlink:href=\"#file-earmark-text\"/></svg>\n                Social engagement\n              </a>\n            </li>\n            <li class=\"nav-item\">\n              <a class=\"nav-link d-flex align-items-center gap-2\" href=\"#\">\n                <svg class=\"bi\" aria-hidden=\"true\"><use xlink:href=\"#file-earmark-text\"/></svg>\n                Year-end sale\n              </a>\n            </li>\n          </ul>\n\n          <hr class=\"my-3\">\n\n          <ul class=\"nav flex-column mb-auto\">\n            <li class=\"nav-item\">\n              <a class=\"nav-link d-flex align-items-center gap-2\" href=\"#\">\n                <svg class=\"bi\" aria-hidden=\"true\"><use xlink:href=\"#gear-wide-connected\"/></svg>\n                Settings\n              </a>\n            </li>\n            <li class=\"nav-item\">\n              <a class=\"nav-link d-flex align-items-center gap-2\" href=\"#\">\n                <svg class=\"bi\" aria-hidden=\"true\"><use xlink:href=\"#door-closed\"/></svg>\n                Sign out\n              </a>\n            </li>\n          </ul>\n        </div>\n      </div>\n    </div>\n\n    <main class=\"col-md-9 ms-sm-auto col-lg-10 px-md-4\">\n      <div class=\"d-flex justify-content-between flex-wrap flex-md-nowrap align-items-center pt-3 pb-2 mb-3 border-bottom\">\n        <h1 class=\"h2\">Dashboard</h1>\n        <div class=\"btn-toolbar mb-2 mb-md-0\">\n          <div class=\"btn-group me-2\">\n            <button type=\"button\" class=\"btn btn-sm btn-outline-secondary\">Share</button>\n            <button type=\"button\" class=\"btn btn-sm btn-outline-secondary\">Export</button>\n          </div>\n          <button type=\"button\" class=\"btn btn-sm btn-outline-secondary dropdown-toggle d-flex align-items-center gap-1\">\n            <svg class=\"bi\" aria-hidden=\"true\"><use xlink:href=\"#calendar3\"/></svg>\n            This week\n          </button>\n        </div>\n      </div>\n\n      <canvas class=\"my-4 w-100\" id=\"myChart\" width=\"900\" height=\"380\"></canvas>\n\n      <h2>Section title</h2>\n      <div class=\"table-responsive small\">\n        <table class=\"table table-striped table-sm\">\n          <thead>\n            <tr>\n              <th scope=\"col\">#</th>\n              <th scope=\"col\">Header</th>\n              <th scope=\"col\">Header</th>\n              <th scope=\"col\">Header</th>\n              <th scope=\"col\">Header</th>\n            </tr>\n          </thead>\n          <tbody>\n            <tr>\n              <td>1,001</td>\n              <td>random</td>\n              <td>data</td>\n              <td>placeholder</td>\n              <td>text</td>\n            </tr>\n            <tr>\n              <td>1,002</td>\n              <td>placeholder</td>\n              <td>irrelevant</td>\n              <td>visual</td>\n              <td>layout</td>\n            </tr>\n            <tr>\n              <td>1,003</td>\n              <td>data</td>\n              <td>rich</td>\n              <td>dashboard</td>\n              <td>tabular</td>\n            </tr>\n            <tr>\n              <td>1,003</td>\n              <td>information</td>\n              <td>placeholder</td>\n              <td>illustrative</td>\n              <td>data</td>\n            </tr>\n            <tr>\n              <td>1,004</td>\n              <td>text</td>\n              <td>random</td>\n              <td>layout</td>\n              <td>dashboard</td>\n            </tr>\n            <tr>\n              <td>1,005</td>\n              <td>dashboard</td>\n              <td>irrelevant</td>\n              <td>text</td>\n              <td>placeholder</td>\n            </tr>\n            <tr>\n              <td>1,006</td>\n              <td>dashboard</td>\n              <td>illustrative</td>\n              <td>rich</td>\n              <td>data</td>\n            </tr>\n            <tr>\n              <td>1,007</td>\n              <td>placeholder</td>\n              <td>tabular</td>\n              <td>information</td>\n              <td>irrelevant</td>\n            </tr>\n            <tr>\n              <td>1,008</td>\n              <td>random</td>\n              <td>data</td>\n              <td>placeholder</td>\n              <td>text</td>\n            </tr>\n            <tr>\n              <td>1,009</td>\n              <td>placeholder</td>\n              <td>irrelevant</td>\n              <td>visual</td>\n              <td>layout</td>\n            </tr>\n            <tr>\n              <td>1,010</td>\n              <td>data</td>\n              <td>rich</td>\n              <td>dashboard</td>\n              <td>tabular</td>\n            </tr>\n            <tr>\n              <td>1,011</td>\n              <td>information</td>\n              <td>placeholder</td>\n              <td>illustrative</td>\n              <td>data</td>\n            </tr>\n            <tr>\n              <td>1,012</td>\n              <td>text</td>\n              <td>placeholder</td>\n              <td>layout</td>\n              <td>dashboard</td>\n            </tr>\n            <tr>\n              <td>1,013</td>\n              <td>dashboard</td>\n              <td>irrelevant</td>\n              <td>text</td>\n              <td>visual</td>\n            </tr>\n            <tr>\n              <td>1,014</td>\n              <td>dashboard</td>\n              <td>illustrative</td>\n              <td>rich</td>\n              <td>data</td>\n            </tr>\n            <tr>\n              <td>1,015</td>\n              <td>random</td>\n              <td>tabular</td>\n              <td>information</td>\n              <td>text</td>\n            </tr>\n          </tbody>\n        </table>\n      </div>\n    </main>\n  </div>\n</div>\n"
  },
  {
    "path": "site/src/assets/examples/dashboard-rtl/dashboard.js",
    "content": "/* globals Chart:false */\n\n(() => {\n  'use strict'\n\n  // Graphs\n  const ctx = document.getElementById('myChart')\n  new Chart(ctx, {\n    type: 'line',\n    data: {\n      labels: [\n        'الأحد',\n        'الإثنين',\n        'الثلاثاء',\n        'الأربعاء',\n        'الخميس',\n        'الجمعة',\n        'السبت'\n      ],\n      datasets: [{\n        data: [\n          15339,\n          21345,\n          18483,\n          24003,\n          23489,\n          24092,\n          12034\n        ],\n        lineTension: 0,\n        backgroundColor: 'transparent',\n        borderColor: '#007bff',\n        borderWidth: 4,\n        pointBackgroundColor: '#007bff'\n      }]\n    },\n    options: {\n      plugins: {\n        legend: {\n          display: false\n        },\n        tooltip: {\n          boxPadding: 3\n        }\n      }\n    }\n  })\n})()\n"
  },
  {
    "path": "site/src/assets/examples/dashboard-rtl/index.astro",
    "content": "---\nexport const title = 'قالب لوحة القيادة'\nexport const direction = 'rtl'\nexport const extra_css = ['../dashboard/dashboard.rtl.css']\nexport const extra_js = [\n  { src: 'https://cdn.jsdelivr.net/npm/chart.js@4.3.2/dist/chart.umd.js', integrity: 'sha384-eI7PSr3L1XLISH8JdDII5YN/njoSsxfbrkCTnJrzXt+ENP5MOVBxD+l6sEG4zoLp'},\n  { src: 'dashboard.js'}\n]\n---\n\n<svg xmlns=\"http://www.w3.org/2000/svg\" class=\"d-none\">\n  <symbol id=\"calendar3\" viewBox=\"0 0 16 16\">\n    <path d=\"M14 0H2a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2zM1 3.857C1 3.384 1.448 3 2 3h12c.552 0 1 .384 1 .857v10.286c0 .473-.448.857-1 .857H2c-.552 0-1-.384-1-.857V3.857z\"/>\n    <path d=\"M6.5 7a1 1 0 1 0 0-2 1 1 0 0 0 0 2zm3 0a1 1 0 1 0 0-2 1 1 0 0 0 0 2zm3 0a1 1 0 1 0 0-2 1 1 0 0 0 0 2zm-9 3a1 1 0 1 0 0-2 1 1 0 0 0 0 2zm3 0a1 1 0 1 0 0-2 1 1 0 0 0 0 2zm3 0a1 1 0 1 0 0-2 1 1 0 0 0 0 2zm3 0a1 1 0 1 0 0-2 1 1 0 0 0 0 2zm-9 3a1 1 0 1 0 0-2 1 1 0 0 0 0 2zm3 0a1 1 0 1 0 0-2 1 1 0 0 0 0 2zm3 0a1 1 0 1 0 0-2 1 1 0 0 0 0 2z\"/>\n  </symbol>\n  <symbol id=\"cart\" viewBox=\"0 0 16 16\">\n    <path d=\"M0 1.5A.5.5 0 0 1 .5 1H2a.5.5 0 0 1 .485.379L2.89 3H14.5a.5.5 0 0 1 .49.598l-1 5a.5.5 0 0 1-.465.401l-9.397.472L4.415 11H13a.5.5 0 0 1 0 1H4a.5.5 0 0 1-.491-.408L2.01 3.607 1.61 2H.5a.5.5 0 0 1-.5-.5zM3.102 4l.84 4.479 9.144-.459L13.89 4H3.102zM5 12a2 2 0 1 0 0 4 2 2 0 0 0 0-4zm7 0a2 2 0 1 0 0 4 2 2 0 0 0 0-4zm-7 1a1 1 0 1 1 0 2 1 1 0 0 1 0-2zm7 0a1 1 0 1 1 0 2 1 1 0 0 1 0-2z\"/>\n  </symbol>\n  <symbol id=\"chevron-right\" viewBox=\"0 0 16 16\">\n    <path fill-rule=\"evenodd\" d=\"M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z\"/>\n  </symbol>\n  <symbol id=\"door-closed\" viewBox=\"0 0 16 16\">\n    <path d=\"M3 2a1 1 0 0 1 1-1h8a1 1 0 0 1 1 1v13h1.5a.5.5 0 0 1 0 1h-13a.5.5 0 0 1 0-1H3V2zm1 13h8V2H4v13z\"/>\n    <path d=\"M9 9a1 1 0 1 0 2 0 1 1 0 0 0-2 0z\"/>\n  </symbol>\n  <symbol id=\"file-earmark\" viewBox=\"0 0 16 16\">\n    <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\"/>\n  </symbol>\n  <symbol id=\"file-earmark-text\" viewBox=\"0 0 16 16\">\n    <path d=\"M5.5 7a.5.5 0 0 0 0 1h5a.5.5 0 0 0 0-1h-5zM5 9.5a.5.5 0 0 1 .5-.5h5a.5.5 0 0 1 0 1h-5a.5.5 0 0 1-.5-.5zm0 2a.5.5 0 0 1 .5-.5h2a.5.5 0 0 1 0 1h-2a.5.5 0 0 1-.5-.5z\"/>\n    <path d=\"M9.5 0H4a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2V4.5L9.5 0zm0 1v2A1.5 1.5 0 0 0 11 4.5h2V14a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1h5.5z\"/>\n  </symbol>\n  <symbol id=\"gear-wide-connected\" viewBox=\"0 0 16 16\">\n    <path d=\"M7.068.727c.243-.97 1.62-.97 1.864 0l.071.286a.96.96 0 0 0 1.622.434l.205-.211c.695-.719 1.888-.03 1.613.931l-.08.284a.96.96 0 0 0 1.187 1.187l.283-.081c.96-.275 1.65.918.931 1.613l-.211.205a.96.96 0 0 0 .434 1.622l.286.071c.97.243.97 1.62 0 1.864l-.286.071a.96.96 0 0 0-.434 1.622l.211.205c.719.695.03 1.888-.931 1.613l-.284-.08a.96.96 0 0 0-1.187 1.187l.081.283c.275.96-.918 1.65-1.613.931l-.205-.211a.96.96 0 0 0-1.622.434l-.071.286c-.243.97-1.62.97-1.864 0l-.071-.286a.96.96 0 0 0-1.622-.434l-.205.211c-.695.719-1.888.03-1.613-.931l.08-.284a.96.96 0 0 0-1.186-1.187l-.284.081c-.96.275-1.65-.918-.931-1.613l.211-.205a.96.96 0 0 0-.434-1.622l-.286-.071c-.97-.243-.97-1.62 0-1.864l.286-.071a.96.96 0 0 0 .434-1.622l-.211-.205c-.719-.695-.03-1.888.931-1.613l.284.08a.96.96 0 0 0 1.187-1.186l-.081-.284c-.275-.96.918-1.65 1.613-.931l.205.211a.96.96 0 0 0 1.622-.434l.071-.286zM12.973 8.5H8.25l-2.834 3.779A4.998 4.998 0 0 0 12.973 8.5zm0-1a4.998 4.998 0 0 0-7.557-3.779l2.834 3.78h4.723zM5.048 3.967c-.03.021-.058.043-.087.065l.087-.065zm-.431.355A4.984 4.984 0 0 0 3.002 8c0 1.455.622 2.765 1.615 3.678L7.375 8 4.617 4.322zm.344 7.646.087.065-.087-.065z\"/>\n  </symbol>\n  <symbol id=\"graph-up\" viewBox=\"0 0 16 16\">\n    <path fill-rule=\"evenodd\" d=\"M0 0h1v15h15v1H0V0Zm14.817 3.113a.5.5 0 0 1 .07.704l-4.5 5.5a.5.5 0 0 1-.74.037L7.06 6.767l-3.656 5.027a.5.5 0 0 1-.808-.588l4-5.5a.5.5 0 0 1 .758-.06l2.609 2.61 4.15-5.073a.5.5 0 0 1 .704-.07Z\"/>\n  </symbol>\n  <symbol id=\"house-fill\" viewBox=\"0 0 16 16\">\n    <path d=\"M8.707 1.5a1 1 0 0 0-1.414 0L.646 8.146a.5.5 0 0 0 .708.708L8 2.207l6.646 6.647a.5.5 0 0 0 .708-.708L13 5.793V2.5a.5.5 0 0 0-.5-.5h-1a.5.5 0 0 0-.5.5v1.293L8.707 1.5Z\"/>\n    <path d=\"m8 3.293 6 6V13.5a1.5 1.5 0 0 1-1.5 1.5h-9A1.5 1.5 0 0 1 2 13.5V9.293l6-6Z\"/>\n  </symbol>\n  <symbol id=\"list\" viewBox=\"0 0 16 16\">\n    <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\"/>\n  </symbol>\n  <symbol id=\"people\" viewBox=\"0 0 16 16\">\n    <path d=\"M15 14s1 0 1-1-1-4-5-4-5 3-5 4 1 1 1 1h8Zm-7.978-1A.261.261 0 0 1 7 12.996c.001-.264.167-1.03.76-1.72C8.312 10.629 9.282 10 11 10c1.717 0 2.687.63 3.24 1.276.593.69.758 1.457.76 1.72l-.008.002a.274.274 0 0 1-.014.002H7.022ZM11 7a2 2 0 1 0 0-4 2 2 0 0 0 0 4Zm3-2a3 3 0 1 1-6 0 3 3 0 0 1 6 0ZM6.936 9.28a5.88 5.88 0 0 0-1.23-.247A7.35 7.35 0 0 0 5 9c-4 0-5 3-5 4 0 .667.333 1 1 1h4.216A2.238 2.238 0 0 1 5 13c0-1.01.377-2.042 1.09-2.904.243-.294.526-.569.846-.816ZM4.92 10A5.493 5.493 0 0 0 4 13H1c0-.26.164-1.03.76-1.724.545-.636 1.492-1.256 3.16-1.275ZM1.5 5.5a3 3 0 1 1 6 0 3 3 0 0 1-6 0Zm3-2a2 2 0 1 0 0 4 2 2 0 0 0 0-4Z\"/>\n  </symbol>\n  <symbol id=\"plus-circle\" viewBox=\"0 0 16 16\">\n    <path d=\"M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14zm0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16z\"/>\n    <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\"/>\n  </symbol>\n  <symbol id=\"puzzle\" viewBox=\"0 0 16 16\">\n    <path d=\"M3.112 3.645A1.5 1.5 0 0 1 4.605 2H7a.5.5 0 0 1 .5.5v.382c0 .696-.497 1.182-.872 1.469a.459.459 0 0 0-.115.118.113.113 0 0 0-.012.025L6.5 4.5v.003l.003.01c.004.01.014.028.036.053a.86.86 0 0 0 .27.194C7.09 4.9 7.51 5 8 5c.492 0 .912-.1 1.19-.24a.86.86 0 0 0 .271-.194.213.213 0 0 0 .039-.063v-.009a.112.112 0 0 0-.012-.025.459.459 0 0 0-.115-.118c-.375-.287-.872-.773-.872-1.469V2.5A.5.5 0 0 1 9 2h2.395a1.5 1.5 0 0 1 1.493 1.645L12.645 6.5h.237c.195 0 .42-.147.675-.48.21-.274.528-.52.943-.52.568 0 .947.447 1.154.862C15.877 6.807 16 7.387 16 8s-.123 1.193-.346 1.638c-.207.415-.586.862-1.154.862-.415 0-.733-.246-.943-.52-.255-.333-.48-.48-.675-.48h-.237l.243 2.855A1.5 1.5 0 0 1 11.395 14H9a.5.5 0 0 1-.5-.5v-.382c0-.696.497-1.182.872-1.469a.459.459 0 0 0 .115-.118.113.113 0 0 0 .012-.025L9.5 11.5v-.003a.214.214 0 0 0-.039-.064.859.859 0 0 0-.27-.193C8.91 11.1 8.49 11 8 11c-.491 0-.912.1-1.19.24a.859.859 0 0 0-.271.194.214.214 0 0 0-.039.063v.003l.001.006a.113.113 0 0 0 .012.025c.016.027.05.068.115.118.375.287.872.773.872 1.469v.382a.5.5 0 0 1-.5.5H4.605a1.5 1.5 0 0 1-1.493-1.645L3.356 9.5h-.238c-.195 0-.42.147-.675.48-.21.274-.528.52-.943.52-.568 0-.947-.447-1.154-.862C.123 9.193 0 8.613 0 8s.123-1.193.346-1.638C.553 5.947.932 5.5 1.5 5.5c.415 0 .733.246.943.52.255.333.48.48.675.48h.238l-.244-2.855zM4.605 3a.5.5 0 0 0-.498.55l.001.007.29 3.4A.5.5 0 0 1 3.9 7.5h-.782c-.696 0-1.182-.497-1.469-.872a.459.459 0 0 0-.118-.115.112.112 0 0 0-.025-.012L1.5 6.5h-.003a.213.213 0 0 0-.064.039.86.86 0 0 0-.193.27C1.1 7.09 1 7.51 1 8c0 .491.1.912.24 1.19.07.14.14.225.194.271a.213.213 0 0 0 .063.039H1.5l.006-.001a.112.112 0 0 0 .025-.012.459.459 0 0 0 .118-.115c.287-.375.773-.872 1.469-.872H3.9a.5.5 0 0 1 .498.542l-.29 3.408a.5.5 0 0 0 .497.55h1.878c-.048-.166-.195-.352-.463-.557-.274-.21-.52-.528-.52-.943 0-.568.447-.947.862-1.154C6.807 10.123 7.387 10 8 10s1.193.123 1.638.346c.415.207.862.586.862 1.154 0 .415-.246.733-.52.943-.268.205-.415.39-.463.557h1.878a.5.5 0 0 0 .498-.55l-.001-.007-.29-3.4A.5.5 0 0 1 12.1 8.5h.782c.696 0 1.182.497 1.469.872.05.065.091.099.118.115.013.008.021.01.025.012a.02.02 0 0 0 .006.001h.003a.214.214 0 0 0 .064-.039.86.86 0 0 0 .193-.27c.14-.28.24-.7.24-1.191 0-.492-.1-.912-.24-1.19a.86.86 0 0 0-.194-.271.215.215 0 0 0-.063-.039H14.5l-.006.001a.113.113 0 0 0-.025.012.459.459 0 0 0-.118.115c-.287.375-.773.872-1.469.872H12.1a.5.5 0 0 1-.498-.543l.29-3.407a.5.5 0 0 0-.497-.55H9.517c.048.166.195.352.463.557.274.21.52.528.52.943 0 .568-.447.947-.862 1.154C9.193 5.877 8.613 6 8 6s-1.193-.123-1.638-.346C5.947 5.447 5.5 5.068 5.5 4.5c0-.415.246-.733.52-.943.268-.205.415-.39.463-.557H4.605z\"/>\n  </symbol>\n  <symbol id=\"search\" viewBox=\"0 0 16 16\">\n    <path d=\"M11.742 10.344a6.5 6.5 0 1 0-1.397 1.398h-.001c.03.04.062.078.098.115l3.85 3.85a1 1 0 0 0 1.415-1.414l-3.85-3.85a1.007 1.007 0 0 0-.115-.1zM12 6.5a5.5 5.5 0 1 1-11 0 5.5 5.5 0 0 1 11 0z\"/>\n  </symbol>\n</svg>\n\n<header class=\"navbar sticky-top bg-dark flex-md-nowrap p-0 shadow\" data-bs-theme=\"dark\">\n  <a class=\"navbar-brand col-md-3 col-lg-2 me-0 px-3 fs-6 text-white\" href=\"#\">اسم الشركة</a>\n\n  <ul class=\"navbar-nav flex-row d-md-none\">\n    <li class=\"nav-item text-nowrap\">\n      <button class=\"nav-link px-3 text-white\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbarSearch\" aria-controls=\"navbarSearch\" aria-expanded=\"false\" aria-label=\"تبديل البحث\">\n        <svg class=\"bi\" aria-hidden=\"true\"><use xlink:href=\"#search\"/></svg>\n      </button>\n    </li>\n    <li class=\"nav-item text-nowrap\">\n      <button class=\"nav-link px-3 text-white\" type=\"button\" data-bs-toggle=\"offcanvas\" data-bs-target=\"#sidebarMenu\" aria-controls=\"sidebarMenu\" aria-expanded=\"false\" aria-label=\"تبديل التنقل\">\n        <svg class=\"bi\" aria-hidden=\"true\"><use xlink:href=\"#list\"/></svg>\n      </button>\n    </li>\n  </ul>\n\n  <div id=\"navbarSearch\" class=\"navbar-search w-100 collapse\">\n    <input class=\"form-control w-100 rounded-0 border-0\" type=\"text\" placeholder=\"بحث\" aria-label=\"بحث\">\n  </div>\n</header>\n\n<div class=\"container-fluid\">\n  <div class=\"row\">\n    <div class=\"sidebar border border-right col-md-3 col-lg-2 p-0 bg-body-tertiary\">\n      <div class=\"offcanvas-md offcanvas-end bg-body-tertiary\" tabindex=\"-1\" id=\"sidebarMenu\" aria-labelledby=\"sidebarMenuLabel\">\n        <div class=\"offcanvas-header\">\n          <h5 class=\"offcanvas-title\" id=\"sidebarMenuLabel\">Company name</h5>\n          <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"offcanvas\" data-bs-target=\"#sidebarMenu\" aria-label=\"يغلق\"></button>\n        </div>\n        <div class=\"offcanvas-body d-md-flex flex-column p-0 pt-lg-3 overflow-y-auto\">\n          <ul class=\"nav flex-column\">\n            <li class=\"nav-item\">\n              <a class=\"nav-link d-flex align-items-center gap-2 active\" aria-current=\"page\" href=\"#\">\n                <svg class=\"bi\" aria-hidden=\"true\"><use xlink:href=\"#house-fill\"/></svg>\n                لوحة القيادة\n              </a>\n            </li>\n            <li class=\"nav-item\">\n              <a class=\"nav-link d-flex align-items-center gap-2\" href=\"#\">\n                <svg class=\"bi\" aria-hidden=\"true\"><use xlink:href=\"#file-earmark\"/></svg>\n                الطلبات\n              </a>\n            </li>\n            <li class=\"nav-item\">\n              <a class=\"nav-link d-flex align-items-center gap-2\" href=\"#\">\n                <svg class=\"bi\" aria-hidden=\"true\"><use xlink:href=\"#cart\"/></svg>\n                المنتجات\n              </a>\n            </li>\n            <li class=\"nav-item\">\n              <a class=\"nav-link d-flex align-items-center gap-2\" href=\"#\">\n                <svg class=\"bi\" aria-hidden=\"true\"><use xlink:href=\"#people\"/></svg>\n                الزبائن\n              </a>\n            </li>\n            <li class=\"nav-item\">\n              <a class=\"nav-link d-flex align-items-center gap-2\" href=\"#\">\n                <svg class=\"bi\" aria-hidden=\"true\"><use xlink:href=\"#graph-up\"/></svg>\n                التقارير\n              </a>\n            </li>\n            <li class=\"nav-item\">\n              <a class=\"nav-link d-flex align-items-center gap-2\" href=\"#\">\n                <svg class=\"bi\" aria-hidden=\"true\"><use xlink:href=\"#puzzle\"/></svg>\n                التكاملات\n              </a>\n            </li>\n          </ul>\n\n          <h6 class=\"sidebar-heading d-flex justify-content-between align-items-center px-3 mt-4 mb-1 text-body-secondary text-uppercase\">\n            <span>التقارير المحفوظة</span>\n            <a class=\"link-secondary\" href=\"#\" aria-label=\"إضافة تقرير جديد\">\n              <svg class=\"bi\" aria-hidden=\"true\"><use xlink:href=\"#plus-circle\"/></svg>\n            </a>\n          </h6>\n          <ul class=\"nav flex-column mb-auto\">\n            <li class=\"nav-item\">\n              <a class=\"nav-link d-flex align-items-center gap-2\" href=\"#\">\n                <svg class=\"bi\" aria-hidden=\"true\"><use xlink:href=\"#file-earmark-text\"/></svg>\n                الشهر الحالي\n              </a>\n            </li>\n            <li class=\"nav-item\">\n              <a class=\"nav-link d-flex align-items-center gap-2\" href=\"#\">\n                <svg class=\"bi\" aria-hidden=\"true\"><use xlink:href=\"#file-earmark-text\"/></svg>\n                الربع الأخير\n              </a>\n            </li>\n            <li class=\"nav-item\">\n              <a class=\"nav-link d-flex align-items-center gap-2\" href=\"#\">\n                <svg class=\"bi\" aria-hidden=\"true\"><use xlink:href=\"#file-earmark-text\"/></svg>\n                التفاعل الإجتماعي\n              </a>\n            </li>\n            <li class=\"nav-item\">\n              <a class=\"nav-link d-flex align-items-center gap-2\" href=\"#\">\n                <svg class=\"bi\" aria-hidden=\"true\"><use xlink:href=\"#file-earmark-text\"/></svg>\n                مبيعات نهاية العام\n              </a>\n            </li>\n          </ul>\n\n          <hr class=\"my-3\">\n\n          <ul class=\"nav flex-column mb-auto\">\n            <li class=\"nav-item\">\n              <a class=\"nav-link d-flex align-items-center gap-2\" href=\"#\">\n                <svg class=\"bi\" aria-hidden=\"true\"><use xlink:href=\"#gear-wide-connected\"/></svg>\n                إعدادات\n              </a>\n            </li>\n            <li class=\"nav-item\">\n              <a class=\"nav-link d-flex align-items-center gap-2\" href=\"#\">\n                <svg class=\"bi\" aria-hidden=\"true\"><use xlink:href=\"#door-closed\"/></svg>\n                خروج\n              </a>\n            </li>\n          </ul>\n        </div>\n      </div>\n    </div>\n\n    <main class=\"col-md-9 ms-sm-auto col-lg-10 px-md-4\">\n      <div class=\"d-flex justify-content-between flex-wrap flex-md-nowrap align-items-center pt-3 pb-2 mb-3 border-bottom\">\n        <h1 class=\"h2\">لوحة القيادة</h1>\n        <div class=\"btn-toolbar mb-2 mb-md-0\">\n          <div class=\"btn-group me-2\">\n            <button type=\"button\" class=\"btn btn-sm btn-outline-secondary\">مشاركة</button>\n            <button type=\"button\" class=\"btn btn-sm btn-outline-secondary\">تصدير</button>\n          </div>\n          <button type=\"button\" class=\"btn btn-sm btn-outline-secondary dropdown-toggle d-flex align-items-center gap-1\">\n            <svg class=\"bi\" aria-hidden=\"true\"><use xlink:href=\"#calendar3\"/></svg>\n            هذا الأسبوع\n          </button>\n        </div>\n      </div>\n\n      <canvas class=\"my-4 w-100\" id=\"myChart\" width=\"900\" height=\"380\"></canvas>\n\n      <h2>عنوان القسم</h2>\n      <div class=\"table-responsive small\">\n        <table class=\"table table-striped table-sm\">\n          <thead>\n            <tr>\n              <th scope=\"col\">#</th>\n              <th scope=\"col\">عنوان</th>\n              <th scope=\"col\">عنوان</th>\n              <th scope=\"col\">عنوان</th>\n              <th scope=\"col\">عنوان</th>\n            </tr>\n          </thead>\n          <tbody>\n            <tr>\n              <td>1,001</td>\n              <td>بيانات</td>\n              <td>عشوائية</td>\n              <td>تثري</td>\n              <td>الجدول</td>\n            </tr>\n            <tr>\n              <td>1,002</td>\n              <td>تثري</td>\n              <td>مبهة</td>\n              <td>تصميم</td>\n              <td>تنسيق</td>\n            </tr>\n            <tr>\n              <td>1,003</td>\n              <td>عشوائية</td>\n              <td>غنية</td>\n              <td>قيمة</td>\n              <td>مفيدة</td>\n            </tr>\n            <tr>\n              <td>1,003</td>\n              <td>معلومات</td>\n              <td>تثري</td>\n              <td>توضيحية</td>\n              <td>عشوائية</td>\n            </tr>\n            <tr>\n              <td>1,004</td>\n              <td>الجدول</td>\n              <td>بيانات</td>\n              <td>تنسيق</td>\n              <td>قيمة</td>\n            </tr>\n            <tr>\n              <td>1,005</td>\n              <td>قيمة</td>\n              <td>مبهة</td>\n              <td>الجدول</td>\n              <td>تثري</td>\n            </tr>\n            <tr>\n              <td>1,006</td>\n              <td>قيمة</td>\n              <td>توضيحية</td>\n              <td>غنية</td>\n              <td>عشوائية</td>\n            </tr>\n            <tr>\n              <td>1,007</td>\n              <td>تثري</td>\n              <td>مفيدة</td>\n              <td>معلومات</td>\n              <td>مبهة</td>\n            </tr>\n            <tr>\n              <td>1,008</td>\n              <td>بيانات</td>\n              <td>عشوائية</td>\n              <td>تثري</td>\n              <td>الجدول</td>\n            </tr>\n            <tr>\n              <td>1,009</td>\n              <td>تثري</td>\n              <td>مبهة</td>\n              <td>تصميم</td>\n              <td>تنسيق</td>\n            </tr>\n            <tr>\n              <td>1,010</td>\n              <td>عشوائية</td>\n              <td>غنية</td>\n              <td>قيمة</td>\n              <td>مفيدة</td>\n            </tr>\n            <tr>\n              <td>1,011</td>\n              <td>معلومات</td>\n              <td>تثري</td>\n              <td>توضيحية</td>\n              <td>عشوائية</td>\n            </tr>\n            <tr>\n              <td>1,012</td>\n              <td>الجدول</td>\n              <td>تثري</td>\n              <td>تنسيق</td>\n              <td>قيمة</td>\n            </tr>\n            <tr>\n              <td>1,013</td>\n              <td>قيمة</td>\n              <td>مبهة</td>\n              <td>الجدول</td>\n              <td>تصميم</td>\n            </tr>\n            <tr>\n              <td>1,014</td>\n              <td>قيمة</td>\n              <td>توضيحية</td>\n              <td>غنية</td>\n              <td>عشوائية</td>\n            </tr>\n            <tr>\n              <td>1,015</td>\n              <td>بيانات</td>\n              <td>مفيدة</td>\n              <td>معلومات</td>\n              <td>الجدول</td>\n            </tr>\n          </tbody>\n        </table>\n      </div>\n    </main>\n  </div>\n</div>\n"
  },
  {
    "path": "site/src/assets/examples/dropdowns/dropdowns.css",
    "content": ".dropdown-item-danger {\n  color: var(--bs-red);\n}\n.dropdown-item-danger:hover,\n.dropdown-item-danger:focus {\n  color: #fff;\n  background-color: var(--bs-red);\n}\n.dropdown-item-danger.active {\n  background-color: var(--bs-red);\n}\n\n.btn-hover-light {\n  color: var(--bs-body-color);\n  background-color: var(--bs-body-bg);\n}\n.btn-hover-light:hover,\n.btn-hover-light:focus {\n  color: var(--bs-link-hover-color);\n  background-color: var(--bs-tertiary-bg);\n}\n\n.cal-month,\n.cal-days,\n.cal-weekdays {\n  display: grid;\n  grid-template-columns: repeat(7, 1fr);\n  align-items: center;\n}\n.cal-month-name {\n  grid-column-start: 2;\n  grid-column-end: 7;\n  text-align: center;\n}\n.cal-weekday,\n.cal-btn {\n  display: flex;\n  flex-shrink: 0;\n  align-items: center;\n  justify-content: center;\n  height: 3rem;\n  padding: 0;\n}\n.cal-btn:not([disabled]) {\n  font-weight: 500;\n  color: var(--bs-emphasis-color);\n}\n.cal-btn:hover,\n.cal-btn:focus {\n  background-color: var(--bs-secondary-bg);\n}\n.cal-btn[disabled] {\n  border: 0;\n  opacity: .5;\n}\n\n.w-220px {\n  width: 220px;\n}\n\n.w-280px {\n  width: 280px;\n}\n\n.w-340px {\n  width: 340px;\n}\n\n.opacity-10 {\n  opacity: .1;\n}\n"
  },
  {
    "path": "site/src/assets/examples/dropdowns/index.astro",
    "content": "---\nexport const title = 'Dropdowns'\nexport const extra_css = ['dropdowns.css']\n---\n\n<svg xmlns=\"http://www.w3.org/2000/svg\" class=\"d-none\">\n  <symbol id=\"film\" viewBox=\"0 0 16 16\">\n    <path d=\"M0 1a1 1 0 0 1 1-1h14a1 1 0 0 1 1 1v14a1 1 0 0 1-1 1H1a1 1 0 0 1-1-1V1zm4 0v6h8V1H4zm8 8H4v6h8V9zM1 1v2h2V1H1zm2 3H1v2h2V4zM1 7v2h2V7H1zm2 3H1v2h2v-2zm-2 3v2h2v-2H1zM15 1h-2v2h2V1zm-2 3v2h2V4h-2zm2 3h-2v2h2V7zm-2 3v2h2v-2h-2zm2 3h-2v2h2v-2z\"/>\n  </symbol>\n\n  <symbol id=\"joystick\" viewBox=\"0 0 16 16\">\n    <path d=\"M10 2a2 2 0 0 1-1.5 1.937v5.087c.863.083 1.5.377 1.5.726 0 .414-.895.75-2 .75s-2-.336-2-.75c0-.35.637-.643 1.5-.726V3.937A2 2 0 1 1 10 2z\"/>\n    <path d=\"M0 9.665v1.717a1 1 0 0 0 .553.894l6.553 3.277a2 2 0 0 0 1.788 0l6.553-3.277a1 1 0 0 0 .553-.894V9.665c0-.1-.06-.19-.152-.23L9.5 6.715v.993l5.227 2.178a.125.125 0 0 1 .001.23l-5.94 2.546a2 2 0 0 1-1.576 0l-5.94-2.546a.125.125 0 0 1 .001-.23L6.5 7.708l-.013-.988L.152 9.435a.25.25 0 0 0-.152.23z\"/>\n  </symbol>\n\n  <symbol id=\"music-note-beamed\" viewBox=\"0 0 16 16\">\n    <path d=\"M6 13c0 1.105-1.12 2-2.5 2S1 14.105 1 13c0-1.104 1.12-2 2.5-2s2.5.896 2.5 2zm9-2c0 1.105-1.12 2-2.5 2s-2.5-.895-2.5-2 1.12-2 2.5-2 2.5.895 2.5 2z\"/>\n    <path fill-rule=\"evenodd\" d=\"M14 11V2h1v9h-1zM6 3v10H5V3h1z\"/>\n    <path d=\"M5 2.905a1 1 0 0 1 .9-.995l8-.8a1 1 0 0 1 1.1.995V3L5 4V2.905z\"/>\n  </symbol>\n\n  <symbol id=\"files\" viewBox=\"0 0 16 16\">\n    <path d=\"M13 0H6a2 2 0 0 0-2 2 2 2 0 0 0-2 2v10a2 2 0 0 0 2 2h7a2 2 0 0 0 2-2 2 2 0 0 0 2-2V2a2 2 0 0 0-2-2zm0 13V4a2 2 0 0 0-2-2H5a1 1 0 0 1 1-1h7a1 1 0 0 1 1 1v10a1 1 0 0 1-1 1zM3 4a1 1 0 0 1 1-1h7a1 1 0 0 1 1 1v10a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V4z\"/>\n  </symbol>\n\n  <symbol id=\"image-fill\" viewBox=\"0 0 16 16\">\n    <path d=\"M.002 3a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2h-12a2 2 0 0 1-2-2V3zm1 9v1a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1V9.5l-3.777-1.947a.5.5 0 0 0-.577.093l-3.71 3.71-2.66-1.772a.5.5 0 0 0-.63.062L1.002 12zm5-6.5a1.5 1.5 0 1 0-3 0 1.5 1.5 0 0 0 3 0z\"/>\n  </symbol>\n\n  <symbol id=\"trash\" viewBox=\"0 0 16 16\">\n    <path d=\"M5.5 5.5A.5.5 0 0 1 6 6v6a.5.5 0 0 1-1 0V6a.5.5 0 0 1 .5-.5zm2.5 0a.5.5 0 0 1 .5.5v6a.5.5 0 0 1-1 0V6a.5.5 0 0 1 .5-.5zm3 .5a.5.5 0 0 0-1 0v6a.5.5 0 0 0 1 0V6z\"/>\n    <path fill-rule=\"evenodd\" d=\"M14.5 3a1 1 0 0 1-1 1H13v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V4h-.5a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1H6a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1h3.5a1 1 0 0 1 1 1v1zM4.118 4 4 4.059V13a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V4.059L11.882 4H4.118zM2.5 3V2h11v1h-11z\"/>\n  </symbol>\n\n  <symbol id=\"question-circle\" viewBox=\"0 0 16 16\">\n    <path d=\"M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14zm0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16z\"/>\n    <path d=\"M5.255 5.786a.237.237 0 0 0 .241.247h.825c.138 0 .248-.113.266-.25.09-.656.54-1.134 1.342-1.134.686 0 1.314.343 1.314 1.168 0 .635-.374.927-.965 1.371-.673.489-1.206 1.06-1.168 1.987l.003.217a.25.25 0 0 0 .25.246h.811a.25.25 0 0 0 .25-.25v-.105c0-.718.273-.927 1.01-1.486.609-.463 1.244-.977 1.244-2.056 0-1.511-1.276-2.241-2.673-2.241-1.267 0-2.655.59-2.75 2.286zm1.557 5.763c0 .533.425.927 1.01.927.609 0 1.028-.394 1.028-.927 0-.552-.42-.94-1.029-.94-.584 0-1.009.388-1.009.94z\"/>\n  </symbol>\n\n  <symbol id=\"arrow-left-short\" viewBox=\"0 0 16 16\">\n    <path fill-rule=\"evenodd\" d=\"M12 8a.5.5 0 0 1-.5.5H5.707l2.147 2.146a.5.5 0 0 1-.708.708l-3-3a.5.5 0 0 1 0-.708l3-3a.5.5 0 1 1 .708.708L5.707 7.5H11.5a.5.5 0 0 1 .5.5z\"/>\n  </symbol>\n\n  <symbol id=\"arrow-right-short\" viewBox=\"0 0 16 16\">\n    <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 8z\"/>\n  </symbol>\n</svg>\n\n<div class=\"d-flex flex-column flex-md-row p-4 gap-4 py-md-5 align-items-center justify-content-center\">\n  <ul class=\"dropdown-menu position-static d-grid gap-1 p-2 rounded-3 mx-0 shadow w-220px\" data-bs-theme=\"light\">\n    <li><a class=\"dropdown-item rounded-2 active\" href=\"#\">Action</a></li>\n    <li><a class=\"dropdown-item rounded-2\" href=\"#\">Another action</a></li>\n    <li><a class=\"dropdown-item rounded-2\" href=\"#\">Something else here</a></li>\n    <li><hr class=\"dropdown-divider\"></li>\n    <li><a class=\"dropdown-item rounded-2\" href=\"#\">Separated link</a></li>\n  </ul>\n  <ul class=\"dropdown-menu position-static d-grid gap-1 p-2 rounded-3 mx-0 border-0 shadow w-220px\" data-bs-theme=\"dark\">\n    <li><a class=\"dropdown-item rounded-2 active\" href=\"#\">Action</a></li>\n    <li><a class=\"dropdown-item rounded-2\" href=\"#\">Another action</a></li>\n    <li><a class=\"dropdown-item rounded-2\" href=\"#\">Something else here</a></li>\n    <li><hr class=\"dropdown-divider\"></li>\n    <li><a class=\"dropdown-item rounded-2\" href=\"#\">Separated link</a></li>\n  </ul>\n</div>\n\n<div class=\"b-example-divider\"></div>\n\n<div class=\"d-flex flex-column flex-md-row p-4 gap-4 py-md-5 align-items-center justify-content-center\">\n  <div class=\"dropdown-menu d-block position-static pt-0 mx-0 rounded-3 shadow overflow-hidden w-280px\" data-bs-theme=\"light\">\n    <form class=\"p-2 mb-2 bg-body-tertiary border-bottom\">\n      <input type=\"search\" class=\"form-control\" autocomplete=\"false\" placeholder=\"Type to filter...\">\n    </form>\n    <ul class=\"list-unstyled mb-0\">\n      <li><a class=\"dropdown-item d-flex align-items-center gap-2 py-2\" href=\"#\">\n        <span class=\"d-inline-block bg-success rounded-circle p-1\"></span>\n        Action\n      </a></li>\n      <li><a class=\"dropdown-item d-flex align-items-center gap-2 py-2\" href=\"#\">\n        <span class=\"d-inline-block bg-primary rounded-circle p-1\"></span>\n        Another action\n      </a></li>\n      <li><a class=\"dropdown-item d-flex align-items-center gap-2 py-2\" href=\"#\">\n        <span class=\"d-inline-block bg-danger rounded-circle p-1\"></span>\n        Something else here\n      </a></li>\n      <li><a class=\"dropdown-item d-flex align-items-center gap-2 py-2\" href=\"#\">\n        <span class=\"d-inline-block bg-info rounded-circle p-1\"></span>\n        Separated link\n      </a></li>\n    </ul>\n  </div>\n\n  <div class=\"dropdown-menu d-block position-static border-0 pt-0 mx-0 rounded-3 shadow overflow-hidden w-280px\" data-bs-theme=\"dark\">\n    <form class=\"p-2 mb-2 bg-dark border-bottom border-dark\">\n      <input type=\"search\" class=\"form-control bg-dark\" autocomplete=\"false\" placeholder=\"Type to filter...\">\n    </form>\n    <ul class=\"list-unstyled mb-0\">\n      <li><a class=\"dropdown-item d-flex align-items-center gap-2 py-2\" href=\"#\">\n        <span class=\"d-inline-block bg-success rounded-circle p-1\"></span>\n        Action\n      </a></li>\n      <li><a class=\"dropdown-item d-flex align-items-center gap-2 py-2\" href=\"#\">\n        <span class=\"d-inline-block bg-primary rounded-circle p-1\"></span>\n        Another action\n      </a></li>\n      <li><a class=\"dropdown-item d-flex align-items-center gap-2 py-2\" href=\"#\">\n        <span class=\"d-inline-block bg-danger rounded-circle p-1\"></span>\n        Something else here\n      </a></li>\n      <li><a class=\"dropdown-item d-flex align-items-center gap-2 py-2\" href=\"#\">\n        <span class=\"d-inline-block bg-info rounded-circle p-1\"></span>\n        Separated link\n      </a></li>\n    </ul>\n  </div>\n</div>\n\n<div class=\"b-example-divider\"></div>\n\n<div class=\"d-flex flex-column flex-md-row p-4 gap-4 py-md-5 align-items-center justify-content-center\">\n  <ul class=\"dropdown-menu d-block position-static mx-0 shadow w-220px\" data-bs-theme=\"light\">\n    <li>\n      <a class=\"dropdown-item d-flex gap-2 align-items-center\" href=\"#\">\n        <svg class=\"bi\" width=\"16\" height=\"16\" aria-hidden=\"true\"><use xlink:href=\"#files\"/></svg>\n        Documents\n      </a>\n    </li>\n    <li>\n      <a class=\"dropdown-item d-flex gap-2 align-items-center\" href=\"#\">\n        <svg class=\"bi\" width=\"16\" height=\"16\" aria-hidden=\"true\"><use xlink:href=\"#image-fill\"/></svg>\n        Photos\n      </a>\n    </li>\n    <li>\n      <a class=\"dropdown-item d-flex gap-2 align-items-center\" href=\"#\">\n        <svg class=\"bi\" width=\"16\" height=\"16\" aria-hidden=\"true\"><use xlink:href=\"#film\"/></svg>\n        Movies\n      </a>\n    </li>\n    <li>\n      <a class=\"dropdown-item d-flex gap-2 align-items-center\" href=\"#\">\n        <svg class=\"bi\" width=\"16\" height=\"16\" aria-hidden=\"true\"><use xlink:href=\"#music-note-beamed\"/></svg>\n        Music\n      </a>\n    </li>\n    <li>\n      <a class=\"dropdown-item d-flex gap-2 align-items-center\" href=\"#\">\n        <svg class=\"bi\" width=\"16\" height=\"16\" aria-hidden=\"true\"><use xlink:href=\"#joystick\"/></svg>\n        Games\n      </a>\n    </li>\n    <li><hr class=\"dropdown-divider\"></li>\n    <li>\n      <a class=\"dropdown-item dropdown-item-danger d-flex gap-2 align-items-center\" href=\"#\">\n        <svg class=\"bi\" width=\"16\" height=\"16\" aria-hidden=\"true\"><use xlink:href=\"#trash\"/></svg>\n        Trash\n      </a>\n    </li>\n  </ul>\n  <ul class=\"dropdown-menu d-block position-static mx-0 border-0 shadow w-220px\" data-bs-theme=\"dark\">\n    <li>\n      <a class=\"dropdown-item d-flex gap-2 align-items-center\" href=\"#\">\n        <svg class=\"bi\" width=\"16\" height=\"16\" aria-hidden=\"true\"><use xlink:href=\"#files\"/></svg>\n        Documents\n      </a>\n    </li>\n    <li>\n      <a class=\"dropdown-item d-flex gap-2 align-items-center\" href=\"#\">\n        <svg class=\"bi\" width=\"16\" height=\"16\" aria-hidden=\"true\"><use xlink:href=\"#image-fill\"/></svg>\n        Photos\n      </a>\n    </li>\n    <li>\n      <a class=\"dropdown-item d-flex gap-2 align-items-center\" href=\"#\">\n        <svg class=\"bi\" width=\"16\" height=\"16\" aria-hidden=\"true\"><use xlink:href=\"#film\"/></svg>\n        Movies\n      </a>\n    </li>\n    <li>\n      <a class=\"dropdown-item d-flex gap-2 align-items-center\" href=\"#\">\n        <svg class=\"bi\" width=\"16\" height=\"16\" aria-hidden=\"true\"><use xlink:href=\"#music-note-beamed\"/></svg>\n        Music\n      </a>\n    </li>\n    <li>\n      <a class=\"dropdown-item d-flex gap-2 align-items-center\" href=\"#\">\n        <svg class=\"bi\" width=\"16\" height=\"16\" aria-hidden=\"true\"><use xlink:href=\"#joystick\"/></svg>\n        Games\n      </a>\n    </li>\n    <li><hr class=\"dropdown-divider\"></li>\n    <li>\n      <a class=\"dropdown-item d-flex gap-2 align-items-center\" href=\"#\">\n        <svg class=\"bi\" width=\"16\" height=\"16\" aria-hidden=\"true\"><use xlink:href=\"#trash\"/></svg>\n        Trash\n      </a>\n    </li>\n  </ul>\n</div>\n\n<div class=\"b-example-divider\"></div>\n\n<div class=\"d-flex flex-column flex-md-row p-4 gap-4 py-md-5 align-items-center justify-content-center\">\n  <div class=\"dropdown-menu d-block position-static p-2 mx-0 shadow rounded-3 w-340px\" data-bs-theme=\"light\">\n    <div class=\"d-grid gap-1\">\n      <div class=\"cal\">\n        <div class=\"cal-month\">\n          <button class=\"btn cal-btn\" type=\"button\" aria-label=\"previous month\">\n            <svg class=\"bi\" width=\"16\" height=\"16\" aria-hidden=\"true\"><use xlink:href=\"#arrow-left-short\"/></svg>\n          </button>\n          <strong class=\"cal-month-name\">June</strong>\n          <select class=\"form-select cal-month-name d-none\">\n            <option value=\"January\">January</option>\n            <option value=\"February\">February</option>\n            <option value=\"March\">March</option>\n            <option value=\"April\">April</option>\n            <option value=\"May\">May</option>\n            <option selected value=\"June\">June</option>\n            <option value=\"July\">July</option>\n            <option value=\"August\">August</option>\n            <option value=\"September\">September</option>\n            <option value=\"October\">October</option>\n            <option value=\"November\">November</option>\n            <option value=\"December\">December</option>\n          </select>\n          <button class=\"btn cal-btn\" type=\"button\" aria-label=\"next month\">\n            <svg class=\"bi\" width=\"16\" height=\"16\" aria-hidden=\"true\"><use xlink:href=\"#arrow-right-short\"/></svg>\n          </button>\n        </div>\n        <div class=\"cal-weekdays text-body-secondary\">\n          <div class=\"cal-weekday\">Sun</div>\n          <div class=\"cal-weekday\">Mon</div>\n          <div class=\"cal-weekday\">Tue</div>\n          <div class=\"cal-weekday\">Wed</div>\n          <div class=\"cal-weekday\">Thu</div>\n          <div class=\"cal-weekday\">Fri</div>\n          <div class=\"cal-weekday\">Sat</div>\n        </div>\n        <div class=\"cal-days\">\n          <button class=\"btn cal-btn\" disabled type=\"button\">30</button>\n          <button class=\"btn cal-btn\" disabled type=\"button\">31</button>\n\n          <button class=\"btn cal-btn\" type=\"button\">1</button>\n          <button class=\"btn cal-btn\" type=\"button\">2</button>\n          <button class=\"btn cal-btn\" type=\"button\">3</button>\n          <button class=\"btn cal-btn\" type=\"button\">4</button>\n          <button class=\"btn cal-btn\" type=\"button\">5</button>\n          <button class=\"btn cal-btn\" type=\"button\">6</button>\n          <button class=\"btn cal-btn\" type=\"button\">7</button>\n\n          <button class=\"btn cal-btn\" type=\"button\">8</button>\n          <button class=\"btn cal-btn\" type=\"button\">9</button>\n          <button class=\"btn cal-btn\" type=\"button\">10</button>\n          <button class=\"btn cal-btn\" type=\"button\">11</button>\n          <button class=\"btn cal-btn\" type=\"button\">12</button>\n          <button class=\"btn cal-btn\" type=\"button\">13</button>\n          <button class=\"btn cal-btn\" type=\"button\">14</button>\n\n          <button class=\"btn cal-btn\" type=\"button\">15</button>\n          <button class=\"btn cal-btn\" type=\"button\">16</button>\n          <button class=\"btn cal-btn\" type=\"button\">17</button>\n          <button class=\"btn cal-btn\" type=\"button\">18</button>\n          <button class=\"btn cal-btn\" type=\"button\">19</button>\n          <button class=\"btn cal-btn\" type=\"button\">20</button>\n          <button class=\"btn cal-btn\" type=\"button\">21</button>\n\n          <button class=\"btn cal-btn\" type=\"button\">22</button>\n          <button class=\"btn cal-btn\" type=\"button\">23</button>\n          <button class=\"btn cal-btn\" type=\"button\">24</button>\n          <button class=\"btn cal-btn\" type=\"button\">25</button>\n          <button class=\"btn cal-btn\" type=\"button\">26</button>\n          <button class=\"btn cal-btn\" type=\"button\">27</button>\n          <button class=\"btn cal-btn\" type=\"button\">28</button>\n\n          <button class=\"btn cal-btn\" type=\"button\">29</button>\n          <button class=\"btn cal-btn\" type=\"button\">30</button>\n          <button class=\"btn cal-btn\" type=\"button\">31</button>\n        </div>\n      </div>\n    </div>\n  </div>\n\n  <div class=\"dropdown-menu d-block position-static p-2 mx-0 shadow rounded-3 w-340px\" data-bs-theme=\"dark\">\n    <div class=\"d-grid gap-1\">\n      <div class=\"cal\">\n        <div class=\"cal-month\">\n          <button class=\"btn cal-btn\" type=\"button\" aria-label=\"previous month\">\n            <svg class=\"bi\" width=\"16\" height=\"16\" aria-hidden=\"true\"><use xlink:href=\"#arrow-left-short\"/></svg>\n          </button>\n          <strong class=\"cal-month-name\">June</strong>\n          <select class=\"form-select cal-month-name d-none\">\n            <option value=\"January\">January</option>\n            <option value=\"February\">February</option>\n            <option value=\"March\">March</option>\n            <option value=\"April\">April</option>\n            <option value=\"May\">May</option>\n            <option selected value=\"June\">June</option>\n            <option value=\"July\">July</option>\n            <option value=\"August\">August</option>\n            <option value=\"September\">September</option>\n            <option value=\"October\">October</option>\n            <option value=\"November\">November</option>\n            <option value=\"December\">December</option>\n          </select>\n          <button class=\"btn cal-btn\" type=\"button\" aria-label=\"next month\">\n            <svg class=\"bi\" width=\"16\" height=\"16\" aria-hidden=\"true\"><use xlink:href=\"#arrow-right-short\"/></svg>\n          </button>\n        </div>\n        <div class=\"cal-weekdays text-body-secondary\">\n          <div class=\"cal-weekday\">Sun</div>\n          <div class=\"cal-weekday\">Mon</div>\n          <div class=\"cal-weekday\">Tue</div>\n          <div class=\"cal-weekday\">Wed</div>\n          <div class=\"cal-weekday\">Thu</div>\n          <div class=\"cal-weekday\">Fri</div>\n          <div class=\"cal-weekday\">Sat</div>\n        </div>\n        <div class=\"cal-days\">\n          <button class=\"btn cal-btn\" disabled type=\"button\">30</button>\n          <button class=\"btn cal-btn\" disabled type=\"button\">31</button>\n\n          <button class=\"btn cal-btn\" type=\"button\">1</button>\n          <button class=\"btn cal-btn\" type=\"button\">2</button>\n          <button class=\"btn cal-btn\" type=\"button\">3</button>\n          <button class=\"btn cal-btn\" type=\"button\">4</button>\n          <button class=\"btn cal-btn\" type=\"button\">5</button>\n          <button class=\"btn cal-btn\" type=\"button\">6</button>\n          <button class=\"btn cal-btn\" type=\"button\">7</button>\n\n          <button class=\"btn cal-btn\" type=\"button\">8</button>\n          <button class=\"btn cal-btn\" type=\"button\">9</button>\n          <button class=\"btn cal-btn\" type=\"button\">10</button>\n          <button class=\"btn cal-btn\" type=\"button\">11</button>\n          <button class=\"btn cal-btn\" type=\"button\">12</button>\n          <button class=\"btn cal-btn\" type=\"button\">13</button>\n          <button class=\"btn cal-btn\" type=\"button\">14</button>\n\n          <button class=\"btn cal-btn\" type=\"button\">15</button>\n          <button class=\"btn cal-btn\" type=\"button\">16</button>\n          <button class=\"btn cal-btn\" type=\"button\">17</button>\n          <button class=\"btn cal-btn\" type=\"button\">18</button>\n          <button class=\"btn cal-btn\" type=\"button\">19</button>\n          <button class=\"btn cal-btn\" type=\"button\">20</button>\n          <button class=\"btn cal-btn\" type=\"button\">21</button>\n\n          <button class=\"btn cal-btn\" type=\"button\">22</button>\n          <button class=\"btn cal-btn\" type=\"button\">23</button>\n          <button class=\"btn cal-btn\" type=\"button\">24</button>\n          <button class=\"btn cal-btn\" type=\"button\">25</button>\n          <button class=\"btn cal-btn\" type=\"button\">26</button>\n          <button class=\"btn cal-btn\" type=\"button\">27</button>\n          <button class=\"btn cal-btn\" type=\"button\">28</button>\n\n          <button class=\"btn cal-btn\" type=\"button\">29</button>\n          <button class=\"btn cal-btn\" type=\"button\">30</button>\n          <button class=\"btn cal-btn\" type=\"button\">31</button>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n\n<div class=\"b-example-divider\"></div>\n\n<div class=\"d-flex flex-column flex-md-row p-4 gap-4 py-md-5 align-items-center justify-content-center\">\n  <div class=\"dropdown-menu position-static d-flex flex-column flex-lg-row align-items-stretch justify-content-start p-3 rounded-3 shadow-lg\" data-bs-theme=\"light\">\n    <nav class=\"col-lg-8\">\n      <ul class=\"list-unstyled d-flex flex-column gap-2\">\n        <li>\n          <a href=\"#\" class=\"btn btn-hover-light rounded-2 d-flex align-items-start gap-2 py-2 px-3 lh-sm text-start\">\n            <svg class=\"bi\" width=\"24\" height=\"24\" aria-hidden=\"true\"><use xlink:href=\"#image-fill\"/></svg>\n            <div>\n              <strong class=\"d-block\">Main product</strong>\n              <small>Take a tour through the product</small>\n            </div>\n          </a>\n        </li>\n        <li>\n          <a href=\"#\" class=\"btn btn-hover-light rounded-2 d-flex align-items-start gap-2 py-2 px-3 lh-sm text-start\">\n            <svg class=\"bi\" width=\"24\" height=\"24\" aria-hidden=\"true\"><use xlink:href=\"#music-note-beamed\"/></svg>\n            <div>\n              <strong class=\"d-block\">Another product</strong>\n              <small>Explore this other product we offer</small>\n            </div>\n          </a>\n        </li>\n        <li>\n          <a href=\"#\" class=\"btn btn-hover-light rounded-2 d-flex align-items-start gap-2 py-2 px-3 lh-sm text-start\">\n            <svg class=\"bi\" width=\"24\" height=\"24\" aria-hidden=\"true\"><use xlink:href=\"#question-circle\"/></svg>\n            <div>\n              <strong class=\"d-block\">Support</strong>\n              <small>Get help from our support crew</small>\n            </div>\n          </a>\n        </li>\n      </ul>\n    </nav>\n    <div class=\"d-none d-lg-block vr mx-4 opacity-10\">&nbsp;</div>\n    <hr class=\"d-lg-none\">\n    <div class=\"col-lg-auto pe-3\">\n      <nav>\n        <ul class=\"d-flex flex-column gap-2 list-unstyled small\">\n          <li><a href=\"#\" class=\"link-offset-2 link-underline link-underline-opacity-25 link-underline-opacity-75-hover\">Documentation</a></li>\n          <li><a href=\"#\" class=\"link-offset-2 link-underline link-underline-opacity-25 link-underline-opacity-75-hover\">Use cases</a></li>\n          <li><a href=\"#\" class=\"link-offset-2 link-underline link-underline-opacity-25 link-underline-opacity-75-hover\">API status</a></li>\n          <li><a href=\"#\" class=\"link-offset-2 link-underline link-underline-opacity-25 link-underline-opacity-75-hover\">Partners</a></li>\n          <li><a href=\"#\" class=\"link-offset-2 link-underline link-underline-opacity-25 link-underline-opacity-75-hover\">Resources</a></li>\n        </ul>\n      </nav>\n    </div>\n  </div>\n\n  <div class=\"dropdown-menu position-static d-flex flex-column flex-lg-row align-items-stretch justify-content-start p-3 rounded-3 shadow-lg\" data-bs-theme=\"dark\">\n    <nav class=\"col-lg-8\">\n      <ul class=\"list-unstyled d-flex flex-column gap-2\">\n        <li>\n          <a href=\"#\" class=\"btn btn-hover-light rounded-2 d-flex align-items-start gap-2 py-2 px-3 lh-sm text-start\">\n            <svg class=\"bi\" width=\"24\" height=\"24\" aria-hidden=\"true\"><use xlink:href=\"#image-fill\"/></svg>\n            <div>\n              <strong class=\"d-block\">Main product</strong>\n              <small>Take a tour through the product</small>\n            </div>\n          </a>\n        </li>\n        <li>\n          <a href=\"#\" class=\"btn btn-hover-light rounded-2 d-flex align-items-start gap-2 py-2 px-3 lh-sm text-start\">\n            <svg class=\"bi\" width=\"24\" height=\"24\" aria-hidden=\"true\"><use xlink:href=\"#music-note-beamed\"/></svg>\n            <div>\n              <strong class=\"d-block\">Another product</strong>\n              <small>Explore this other product we offer</small>\n            </div>\n          </a>\n        </li>\n        <li>\n          <a href=\"#\" class=\"btn btn-hover-light rounded-2 d-flex align-items-start gap-2 py-2 px-3 lh-sm text-start\">\n            <svg class=\"bi\" width=\"24\" height=\"24\" aria-hidden=\"true\"><use xlink:href=\"#question-circle\"/></svg>\n            <div>\n              <strong class=\"d-block\">Support</strong>\n              <small>Get help from our support crew</small>\n            </div>\n          </a>\n        </li>\n      </ul>\n    </nav>\n    <div class=\"d-none d-lg-block vr mx-4 opacity-10\">&nbsp;</div>\n    <hr class=\"d-lg-none\">\n    <div class=\"col-lg-auto pe-3\">\n      <nav>\n        <ul class=\"d-flex flex-column gap-2 list-unstyled small\">\n          <li><a href=\"#\" class=\"link-offset-2 link-underline link-underline-opacity-25 link-underline-opacity-75-hover\">Documentation</a></li>\n          <li><a href=\"#\" class=\"link-offset-2 link-underline link-underline-opacity-25 link-underline-opacity-75-hover\">Use cases</a></li>\n          <li><a href=\"#\" class=\"link-offset-2 link-underline link-underline-opacity-25 link-underline-opacity-75-hover\">API status</a></li>\n          <li><a href=\"#\" class=\"link-offset-2 link-underline link-underline-opacity-25 link-underline-opacity-75-hover\">Partners</a></li>\n          <li><a href=\"#\" class=\"link-offset-2 link-underline link-underline-opacity-25 link-underline-opacity-75-hover\">Resources</a></li>\n        </ul>\n      </nav>\n    </div>\n  </div>\n</div>\n"
  },
  {
    "path": "site/src/assets/examples/features/features.css",
    "content": ".feature-icon {\n  width: 4rem;\n  height: 4rem;\n  border-radius: .75rem;\n}\n\n.icon-square {\n  width: 3rem;\n  height: 3rem;\n  border-radius: .75rem;\n}\n\n.text-shadow-1 { text-shadow: 0 .125rem .25rem rgba(0, 0, 0, .25); }\n.text-shadow-2 { text-shadow: 0 .25rem .5rem rgba(0, 0, 0, .25); }\n.text-shadow-3 { text-shadow: 0 .5rem 1.5rem rgba(0, 0, 0, .25); }\n\n.card-cover {\n  background-repeat: no-repeat;\n  background-position: center center;\n  background-size: cover;\n}\n\n.feature-icon-small {\n  width: 3rem;\n  height: 3rem;\n}\n"
  },
  {
    "path": "site/src/assets/examples/features/index.astro",
    "content": "---\nexport const title = 'Features'\nexport const extra_css = ['features.css']\n---\n\n<svg xmlns=\"http://www.w3.org/2000/svg\" class=\"d-none\">\n  <symbol id=\"bootstrap\" viewBox=\"0 0 118 94\">\n    <title>Bootstrap</title>\n    <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M24.509 0c-6.733 0-11.715 5.893-11.492 12.284.214 6.14-.064 14.092-2.066 20.577C8.943 39.365 5.547 43.485 0 44.014v5.972c5.547.529 8.943 4.649 10.951 11.153 2.002 6.485 2.28 14.437 2.066 20.577C12.794 88.106 17.776 94 24.51 94H93.5c6.733 0 11.714-5.893 11.491-12.284-.214-6.14.064-14.092 2.066-20.577 2.009-6.504 5.396-10.624 10.943-11.153v-5.972c-5.547-.529-8.934-4.649-10.943-11.153-2.002-6.484-2.28-14.437-2.066-20.577C105.214 5.894 100.233 0 93.5 0H24.508zM80 57.863C80 66.663 73.436 72 62.543 72H44a2 2 0 01-2-2V24a2 2 0 012-2h18.437c9.083 0 15.044 4.92 15.044 12.474 0 5.302-4.01 10.049-9.119 10.88v.277C75.317 46.394 80 51.21 80 57.863zM60.521 28.34H49.948v14.934h8.905c6.884 0 10.68-2.772 10.68-7.727 0-4.643-3.264-7.207-9.012-7.207zM49.948 49.2v16.458H60.91c7.167 0 10.964-2.876 10.964-8.281 0-5.406-3.903-8.178-11.425-8.178H49.948z\"></path>\n  </symbol>\n  <symbol id=\"home\" viewBox=\"0 0 16 16\">\n    <path d=\"M8.354 1.146a.5.5 0 0 0-.708 0l-6 6A.5.5 0 0 0 1.5 7.5v7a.5.5 0 0 0 .5.5h4.5a.5.5 0 0 0 .5-.5v-4h2v4a.5.5 0 0 0 .5.5H14a.5.5 0 0 0 .5-.5v-7a.5.5 0 0 0-.146-.354L13 5.793V2.5a.5.5 0 0 0-.5-.5h-1a.5.5 0 0 0-.5.5v1.293L8.354 1.146zM2.5 14V7.707l5.5-5.5 5.5 5.5V14H10v-4a.5.5 0 0 0-.5-.5h-3a.5.5 0 0 0-.5.5v4H2.5z\"/>\n  </symbol>\n  <symbol id=\"speedometer2\" viewBox=\"0 0 16 16\">\n    <path d=\"M8 4a.5.5 0 0 1 .5.5V6a.5.5 0 0 1-1 0V4.5A.5.5 0 0 1 8 4zM3.732 5.732a.5.5 0 0 1 .707 0l.915.914a.5.5 0 1 1-.708.708l-.914-.915a.5.5 0 0 1 0-.707zM2 10a.5.5 0 0 1 .5-.5h1.586a.5.5 0 0 1 0 1H2.5A.5.5 0 0 1 2 10zm9.5 0a.5.5 0 0 1 .5-.5h1.5a.5.5 0 0 1 0 1H12a.5.5 0 0 1-.5-.5zm.754-4.246a.389.389 0 0 0-.527-.02L7.547 9.31a.91.91 0 1 0 1.302 1.258l3.434-4.297a.389.389 0 0 0-.029-.518z\"/>\n    <path fill-rule=\"evenodd\" d=\"M0 10a8 8 0 1 1 15.547 2.661c-.442 1.253-1.845 1.602-2.932 1.25C11.309 13.488 9.475 13 8 13c-1.474 0-3.31.488-4.615.911-1.087.352-2.49.003-2.932-1.25A7.988 7.988 0 0 1 0 10zm8-7a7 7 0 0 0-6.603 9.329c.203.575.923.876 1.68.63C4.397 12.533 6.358 12 8 12s3.604.532 4.923.96c.757.245 1.477-.056 1.68-.631A7 7 0 0 0 8 3z\"/>\n  </symbol>\n  <symbol id=\"table\" viewBox=\"0 0 16 16\">\n    <path d=\"M0 2a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2V2zm15 2h-4v3h4V4zm0 4h-4v3h4V8zm0 4h-4v3h3a1 1 0 0 0 1-1v-2zm-5 3v-3H6v3h4zm-5 0v-3H1v2a1 1 0 0 0 1 1h3zm-4-4h4V8H1v3zm0-4h4V4H1v3zm5-3v3h4V4H6zm4 4H6v3h4V8z\"/>\n  </symbol>\n  <symbol id=\"people-circle\" viewBox=\"0 0 16 16\">\n    <path d=\"M11 6a3 3 0 1 1-6 0 3 3 0 0 1 6 0z\"/>\n    <path fill-rule=\"evenodd\" d=\"M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8zm8-7a7 7 0 0 0-5.468 11.37C3.242 11.226 4.805 10 8 10s4.757 1.225 5.468 2.37A7 7 0 0 0 8 1z\"/>\n  </symbol>\n  <symbol id=\"collection\" viewBox=\"0 0 16 16\">\n    <path d=\"M2.5 3.5a.5.5 0 0 1 0-1h11a.5.5 0 0 1 0 1h-11zm2-2a.5.5 0 0 1 0-1h7a.5.5 0 0 1 0 1h-7zM0 13a1.5 1.5 0 0 0 1.5 1.5h13A1.5 1.5 0 0 0 16 13V6a1.5 1.5 0 0 0-1.5-1.5h-13A1.5 1.5 0 0 0 0 6v7zm1.5.5A.5.5 0 0 1 1 13V6a.5.5 0 0 1 .5-.5h13a.5.5 0 0 1 .5.5v7a.5.5 0 0 1-.5.5h-13z\"/>\n  </symbol>\n  <symbol id=\"calendar3\" viewBox=\"0 0 16 16\">\n    <path d=\"M14 0H2a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2zM1 3.857C1 3.384 1.448 3 2 3h12c.552 0 1 .384 1 .857v10.286c0 .473-.448.857-1 .857H2c-.552 0-1-.384-1-.857V3.857z\"/>\n    <path d=\"M6.5 7a1 1 0 1 0 0-2 1 1 0 0 0 0 2zm3 0a1 1 0 1 0 0-2 1 1 0 0 0 0 2zm3 0a1 1 0 1 0 0-2 1 1 0 0 0 0 2zm-9 3a1 1 0 1 0 0-2 1 1 0 0 0 0 2zm3 0a1 1 0 1 0 0-2 1 1 0 0 0 0 2zm3 0a1 1 0 1 0 0-2 1 1 0 0 0 0 2zm3 0a1 1 0 1 0 0-2 1 1 0 0 0 0 2zm-9 3a1 1 0 1 0 0-2 1 1 0 0 0 0 2zm3 0a1 1 0 1 0 0-2 1 1 0 0 0 0 2zm3 0a1 1 0 1 0 0-2 1 1 0 0 0 0 2z\"/>\n  </symbol>\n  <symbol id=\"cpu-fill\" viewBox=\"0 0 16 16\">\n    <path d=\"M6.5 6a.5.5 0 0 0-.5.5v3a.5.5 0 0 0 .5.5h3a.5.5 0 0 0 .5-.5v-3a.5.5 0 0 0-.5-.5h-3z\"/>\n    <path d=\"M5.5.5a.5.5 0 0 0-1 0V2A2.5 2.5 0 0 0 2 4.5H.5a.5.5 0 0 0 0 1H2v1H.5a.5.5 0 0 0 0 1H2v1H.5a.5.5 0 0 0 0 1H2v1H.5a.5.5 0 0 0 0 1H2A2.5 2.5 0 0 0 4.5 14v1.5a.5.5 0 0 0 1 0V14h1v1.5a.5.5 0 0 0 1 0V14h1v1.5a.5.5 0 0 0 1 0V14h1v1.5a.5.5 0 0 0 1 0V14a2.5 2.5 0 0 0 2.5-2.5h1.5a.5.5 0 0 0 0-1H14v-1h1.5a.5.5 0 0 0 0-1H14v-1h1.5a.5.5 0 0 0 0-1H14v-1h1.5a.5.5 0 0 0 0-1H14A2.5 2.5 0 0 0 11.5 2V.5a.5.5 0 0 0-1 0V2h-1V.5a.5.5 0 0 0-1 0V2h-1V.5a.5.5 0 0 0-1 0V2h-1V.5zm1 4.5h3A1.5 1.5 0 0 1 11 6.5v3A1.5 1.5 0 0 1 9.5 11h-3A1.5 1.5 0 0 1 5 9.5v-3A1.5 1.5 0 0 1 6.5 5z\"/>\n  </symbol>\n  <symbol id=\"gear-fill\" viewBox=\"0 0 16 16\">\n    <path d=\"M9.405 1.05c-.413-1.4-2.397-1.4-2.81 0l-.1.34a1.464 1.464 0 0 1-2.105.872l-.31-.17c-1.283-.698-2.686.705-1.987 1.987l.169.311c.446.82.023 1.841-.872 2.105l-.34.1c-1.4.413-1.4 2.397 0 2.81l.34.1a1.464 1.464 0 0 1 .872 2.105l-.17.31c-.698 1.283.705 2.686 1.987 1.987l.311-.169a1.464 1.464 0 0 1 2.105.872l.1.34c.413 1.4 2.397 1.4 2.81 0l.1-.34a1.464 1.464 0 0 1 2.105-.872l.31.17c1.283.698 2.686-.705 1.987-1.987l-.169-.311a1.464 1.464 0 0 1 .872-2.105l.34-.1c1.4-.413 1.4-2.397 0-2.81l-.34-.1a1.464 1.464 0 0 1-.872-2.105l.17-.31c.698-1.283-.705-2.686-1.987-1.987l-.311.169a1.464 1.464 0 0 1-2.105-.872l-.1-.34zM8 10.93a2.929 2.929 0 1 1 0-5.86 2.929 2.929 0 0 1 0 5.858z\"/>\n  </symbol>\n  <symbol id=\"speedometer\" viewBox=\"0 0 16 16\">\n    <path d=\"M8 2a.5.5 0 0 1 .5.5V4a.5.5 0 0 1-1 0V2.5A.5.5 0 0 1 8 2zM3.732 3.732a.5.5 0 0 1 .707 0l.915.914a.5.5 0 1 1-.708.708l-.914-.915a.5.5 0 0 1 0-.707zM2 8a.5.5 0 0 1 .5-.5h1.586a.5.5 0 0 1 0 1H2.5A.5.5 0 0 1 2 8zm9.5 0a.5.5 0 0 1 .5-.5h1.5a.5.5 0 0 1 0 1H12a.5.5 0 0 1-.5-.5zm.754-4.246a.389.389 0 0 0-.527-.02L7.547 7.31A.91.91 0 1 0 8.85 8.569l3.434-4.297a.389.389 0 0 0-.029-.518z\"/>\n    <path fill-rule=\"evenodd\" d=\"M6.664 15.889A8 8 0 1 1 9.336.11a8 8 0 0 1-2.672 15.78zm-4.665-4.283A11.945 11.945 0 0 1 8 10c2.186 0 4.236.585 6.001 1.606a7 7 0 1 0-12.002 0z\"/>\n  </symbol>\n  <symbol id=\"toggles2\" viewBox=\"0 0 16 16\">\n    <path d=\"M9.465 10H12a2 2 0 1 1 0 4H9.465c.34-.588.535-1.271.535-2 0-.729-.195-1.412-.535-2z\"/>\n    <path d=\"M6 15a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 1a4 4 0 1 1 0-8 4 4 0 0 1 0 8zm.535-10a3.975 3.975 0 0 1-.409-1H4a1 1 0 0 1 0-2h2.126c.091-.355.23-.69.41-1H4a2 2 0 1 0 0 4h2.535z\"/>\n    <path d=\"M14 4a4 4 0 1 1-8 0 4 4 0 0 1 8 0z\"/>\n  </symbol>\n  <symbol id=\"tools\" viewBox=\"0 0 16 16\">\n    <path d=\"M1 0L0 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\"/>\n  </symbol>\n  <symbol id=\"chevron-right\" viewBox=\"0 0 16 16\">\n    <path fill-rule=\"evenodd\" d=\"M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z\"/>\n  </symbol>\n  <symbol id=\"geo-fill\" viewBox=\"0 0 16 16\">\n    <path fill-rule=\"evenodd\" d=\"M4 4a4 4 0 1 1 4.5 3.969V13.5a.5.5 0 0 1-1 0V7.97A4 4 0 0 1 4 3.999zm2.493 8.574a.5.5 0 0 1-.411.575c-.712.118-1.28.295-1.655.493a1.319 1.319 0 0 0-.37.265.301.301 0 0 0-.057.09V14l.002.008a.147.147 0 0 0 .016.033.617.617 0 0 0 .145.15c.165.13.435.27.813.395.751.25 1.82.414 3.024.414s2.273-.163 3.024-.414c.378-.126.648-.265.813-.395a.619.619 0 0 0 .146-.15.148.148 0 0 0 .015-.033L12 14v-.004a.301.301 0 0 0-.057-.09 1.318 1.318 0 0 0-.37-.264c-.376-.198-.943-.375-1.655-.493a.5.5 0 1 1 .164-.986c.77.127 1.452.328 1.957.594C12.5 13 13 13.4 13 14c0 .426-.26.752-.544.977-.29.228-.68.413-1.116.558-.878.293-2.059.465-3.34.465-1.281 0-2.462-.172-3.34-.465-.436-.145-.826-.33-1.116-.558C3.26 14.752 3 14.426 3 14c0-.599.5-1 .961-1.243.505-.266 1.187-.467 1.957-.594a.5.5 0 0 1 .575.411z\"/>\n  </symbol>\n</svg>\n<main>\n  <h1 class=\"visually-hidden\">Features examples</h1>\n\n  <div class=\"container px-4 py-5\" id=\"featured-3\">\n    <h2 class=\"pb-2 border-bottom\">Columns with icons</h2>\n    <div class=\"row g-4 py-5 row-cols-1 row-cols-lg-3\">\n      <div class=\"feature col\">\n        <div class=\"feature-icon d-inline-flex align-items-center justify-content-center text-bg-primary bg-gradient fs-2 mb-3\">\n          <svg class=\"bi\" width=\"1em\" height=\"1em\" aria-hidden=\"true\"><use xlink:href=\"#collection\"/></svg>\n        </div>\n        <h3 class=\"fs-2 text-body-emphasis\">Featured title</h3>\n        <p>Paragraph of text beneath the heading to explain the heading. We'll add onto it with another sentence and probably just keep going until we run out of words.</p>\n        <a href=\"#\" class=\"icon-link\">\n          Call to action\n          <svg class=\"bi\" aria-hidden=\"true\"><use xlink:href=\"#chevron-right\"/></svg>\n        </a>\n      </div>\n      <div class=\"feature col\">\n        <div class=\"feature-icon d-inline-flex align-items-center justify-content-center text-bg-primary bg-gradient fs-2 mb-3\">\n          <svg class=\"bi\" width=\"1em\" height=\"1em\" aria-hidden=\"true\"><use xlink:href=\"#people-circle\"/></svg>\n        </div>\n        <h3 class=\"fs-2 text-body-emphasis\">Featured title</h3>\n        <p>Paragraph of text beneath the heading to explain the heading. We'll add onto it with another sentence and probably just keep going until we run out of words.</p>\n        <a href=\"#\" class=\"icon-link\">\n          Call to action\n          <svg class=\"bi\" aria-hidden=\"true\"><use xlink:href=\"#chevron-right\"/></svg>\n        </a>\n      </div>\n      <div class=\"feature col\">\n        <div class=\"feature-icon d-inline-flex align-items-center justify-content-center text-bg-primary bg-gradient fs-2 mb-3\">\n          <svg class=\"bi\" width=\"1em\" height=\"1em\" aria-hidden=\"true\"><use xlink:href=\"#toggles2\"/></svg>\n        </div>\n        <h3 class=\"fs-2 text-body-emphasis\">Featured title</h3>\n        <p>Paragraph of text beneath the heading to explain the heading. We'll add onto it with another sentence and probably just keep going until we run out of words.</p>\n        <a href=\"#\" class=\"icon-link\">\n          Call to action\n          <svg class=\"bi\" aria-hidden=\"true\"><use xlink:href=\"#chevron-right\"/></svg>\n        </a>\n      </div>\n    </div>\n  </div>\n\n  <div class=\"b-example-divider\"></div>\n\n  <div class=\"container px-4 py-5\" id=\"hanging-icons\">\n    <h2 class=\"pb-2 border-bottom\">Hanging icons</h2>\n    <div class=\"row g-4 py-5 row-cols-1 row-cols-lg-3\">\n      <div class=\"col d-flex align-items-start\">\n        <div class=\"icon-square text-body-emphasis bg-body-secondary d-inline-flex align-items-center justify-content-center fs-4 flex-shrink-0 me-3\">\n          <svg class=\"bi\" width=\"1em\" height=\"1em\" aria-hidden=\"true\"><use xlink:href=\"#toggles2\"/></svg>\n        </div>\n        <div>\n          <h3 class=\"fs-2 text-body-emphasis\">Featured title</h3>\n          <p>Paragraph of text beneath the heading to explain the heading. We'll add onto it with another sentence and probably just keep going until we run out of words.</p>\n          <a href=\"#\" class=\"btn btn-primary\">\n            Primary button\n          </a>\n        </div>\n      </div>\n      <div class=\"col d-flex align-items-start\">\n        <div class=\"icon-square text-body-emphasis bg-body-secondary d-inline-flex align-items-center justify-content-center fs-4 flex-shrink-0 me-3\">\n          <svg class=\"bi\" width=\"1em\" height=\"1em\" aria-hidden=\"true\"><use xlink:href=\"#cpu-fill\"/></svg>\n        </div>\n        <div>\n          <h3 class=\"fs-2 text-body-emphasis\">Featured title</h3>\n          <p>Paragraph of text beneath the heading to explain the heading. We'll add onto it with another sentence and probably just keep going until we run out of words.</p>\n          <a href=\"#\" class=\"btn btn-primary\">\n            Primary button\n          </a>\n        </div>\n      </div>\n      <div class=\"col d-flex align-items-start\">\n        <div class=\"icon-square text-body-emphasis bg-body-secondary d-inline-flex align-items-center justify-content-center fs-4 flex-shrink-0 me-3\">\n          <svg class=\"bi\" width=\"1em\" height=\"1em\" aria-hidden=\"true\"><use xlink:href=\"#tools\"/></svg>\n        </div>\n        <div>\n          <h3 class=\"fs-2 text-body-emphasis\">Featured title</h3>\n          <p>Paragraph of text beneath the heading to explain the heading. We'll add onto it with another sentence and probably just keep going until we run out of words.</p>\n          <a href=\"#\" class=\"btn btn-primary\">\n            Primary button\n          </a>\n        </div>\n      </div>\n    </div>\n  </div>\n\n  <div class=\"b-example-divider\"></div>\n\n  <div class=\"container px-4 py-5\" id=\"custom-cards\">\n    <h2 class=\"pb-2 border-bottom\">Custom cards</h2>\n\n    <div class=\"row row-cols-1 row-cols-lg-3 align-items-stretch g-4 py-5\">\n      <div class=\"col\">\n        <div class=\"card card-cover h-100 overflow-hidden text-bg-dark rounded-4 shadow-lg\" style=\"background-image: url('unsplash-photo-1.jpg');\">\n          <div class=\"d-flex flex-column h-100 p-5 pb-3 text-white text-shadow-1\">\n            <h3 class=\"pt-5 mt-5 mb-4 display-6 lh-1 fw-bold\">Short title, long jacket</h3>\n            <ul class=\"d-flex list-unstyled mt-auto\">\n              <li class=\"me-auto\">\n                <img src=\"https://github.com/twbs.png\" alt=\"Bootstrap\" width=\"32\" height=\"32\" class=\"rounded-circle border border-white\">\n              </li>\n              <li class=\"d-flex align-items-center me-3\">\n                <svg class=\"bi me-2\" width=\"1em\" height=\"1em\" role=\"img\" aria-label=\"Location\"><use xlink:href=\"#geo-fill\"/></svg>\n                <small>Earth</small>\n              </li>\n              <li class=\"d-flex align-items-center\">\n                <svg class=\"bi me-2\" width=\"1em\" height=\"1em\" role=\"img\" aria-label=\"Duration\"><use xlink:href=\"#calendar3\"/></svg>\n                <small>3d</small>\n              </li>\n            </ul>\n          </div>\n        </div>\n      </div>\n\n      <div class=\"col\">\n        <div class=\"card card-cover h-100 overflow-hidden text-bg-dark rounded-4 shadow-lg\" style=\"background-image: url('unsplash-photo-2.jpg');\">\n          <div class=\"d-flex flex-column h-100 p-5 pb-3 text-white text-shadow-1\">\n            <h3 class=\"pt-5 mt-5 mb-4 display-6 lh-1 fw-bold\">Much longer title that wraps to multiple lines</h3>\n            <ul class=\"d-flex list-unstyled mt-auto\">\n              <li class=\"me-auto\">\n                <img src=\"https://github.com/twbs.png\" alt=\"Bootstrap\" width=\"32\" height=\"32\" class=\"rounded-circle border border-white\">\n              </li>\n              <li class=\"d-flex align-items-center me-3\">\n                <svg class=\"bi me-2\" width=\"1em\" height=\"1em\" role=\"img\" aria-label=\"Location\"><use xlink:href=\"#geo-fill\"/></svg>\n                <small>Pakistan</small>\n              </li>\n              <li class=\"d-flex align-items-center\">\n                <svg class=\"bi me-2\" width=\"1em\" height=\"1em\" role=\"img\" aria-label=\"Duration\"><use xlink:href=\"#calendar3\"/></svg>\n                <small>4d</small>\n              </li>\n            </ul>\n          </div>\n        </div>\n      </div>\n\n      <div class=\"col\">\n        <div class=\"card card-cover h-100 overflow-hidden text-bg-dark rounded-4 shadow-lg\" style=\"background-image: url('unsplash-photo-3.jpg');\">\n          <div class=\"d-flex flex-column h-100 p-5 pb-3 text-shadow-1\">\n            <h3 class=\"pt-5 mt-5 mb-4 display-6 lh-1 fw-bold\">Another longer title belongs here</h3>\n            <ul class=\"d-flex list-unstyled mt-auto\">\n              <li class=\"me-auto\">\n                <img src=\"https://github.com/twbs.png\" alt=\"Bootstrap\" width=\"32\" height=\"32\" class=\"rounded-circle border border-white\">\n              </li>\n              <li class=\"d-flex align-items-center me-3\">\n                <svg class=\"bi me-2\" width=\"1em\" height=\"1em\" role=\"img\" aria-label=\"Location\"><use xlink:href=\"#geo-fill\"/></svg>\n                <small>California</small>\n              </li>\n              <li class=\"d-flex align-items-center\">\n                <svg class=\"bi me-2\" width=\"1em\" height=\"1em\" role=\"img\" aria-label=\"Duration\"><use xlink:href=\"#calendar3\"/></svg>\n                <small>5d</small>\n              </li>\n            </ul>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n\n  <div class=\"b-example-divider\"></div>\n\n  <div class=\"container px-4 py-5\" id=\"icon-grid\">\n    <h2 class=\"pb-2 border-bottom\">Icon grid</h2>\n\n    <div class=\"row row-cols-1 row-cols-sm-2 row-cols-md-3 row-cols-lg-4 g-4 py-5\">\n      <div class=\"col d-flex align-items-start\">\n        <svg class=\"bi text-body-secondary flex-shrink-0 me-3\" width=\"1.75em\" height=\"1.75em\" aria-hidden=\"true\"><use xlink:href=\"#bootstrap\"/></svg>\n        <div>\n          <h3 class=\"fw-bold mb-0 fs-4 text-body-emphasis\">Featured title</h3>\n          <p>Paragraph of text beneath the heading to explain the heading.</p>\n        </div>\n      </div>\n      <div class=\"col d-flex align-items-start\">\n        <svg class=\"bi text-body-secondary flex-shrink-0 me-3\" width=\"1.75em\" height=\"1.75em\" aria-hidden=\"true\"><use xlink:href=\"#cpu-fill\"/></svg>\n        <div>\n          <h3 class=\"fw-bold mb-0 fs-4 text-body-emphasis\">Featured title</h3>\n          <p>Paragraph of text beneath the heading to explain the heading.</p>\n        </div>\n      </div>\n      <div class=\"col d-flex align-items-start\">\n        <svg class=\"bi text-body-secondary flex-shrink-0 me-3\" width=\"1.75em\" height=\"1.75em\" aria-hidden=\"true\"><use xlink:href=\"#calendar3\"/></svg>\n        <div>\n          <h3 class=\"fw-bold mb-0 fs-4 text-body-emphasis\">Featured title</h3>\n          <p>Paragraph of text beneath the heading to explain the heading.</p>\n        </div>\n      </div>\n      <div class=\"col d-flex align-items-start\">\n        <svg class=\"bi text-body-secondary flex-shrink-0 me-3\" width=\"1.75em\" height=\"1.75em\" aria-hidden=\"true\"><use xlink:href=\"#home\"/></svg>\n        <div>\n          <h3 class=\"fw-bold mb-0 fs-4 text-body-emphasis\">Featured title</h3>\n          <p>Paragraph of text beneath the heading to explain the heading.</p>\n        </div>\n      </div>\n      <div class=\"col d-flex align-items-start\">\n        <svg class=\"bi text-body-secondary flex-shrink-0 me-3\" width=\"1.75em\" height=\"1.75em\" aria-hidden=\"true\"><use xlink:href=\"#speedometer2\"/></svg>\n        <div>\n          <h3 class=\"fw-bold mb-0 fs-4 text-body-emphasis\">Featured title</h3>\n          <p>Paragraph of text beneath the heading to explain the heading.</p>\n        </div>\n      </div>\n      <div class=\"col d-flex align-items-start\">\n        <svg class=\"bi text-body-secondary flex-shrink-0 me-3\" width=\"1.75em\" height=\"1.75em\" aria-hidden=\"true\"><use xlink:href=\"#toggles2\"/></svg>\n        <div>\n          <h3 class=\"fw-bold mb-0 fs-4 text-body-emphasis\">Featured title</h3>\n          <p>Paragraph of text beneath the heading to explain the heading.</p>\n        </div>\n      </div>\n      <div class=\"col d-flex align-items-start\">\n        <svg class=\"bi text-body-secondary flex-shrink-0 me-3\" width=\"1.75em\" height=\"1.75em\" aria-hidden=\"true\"><use xlink:href=\"#geo-fill\"/></svg>\n        <div>\n          <h3 class=\"fw-bold mb-0 fs-4 text-body-emphasis\">Featured title</h3>\n          <p>Paragraph of text beneath the heading to explain the heading.</p>\n        </div>\n      </div>\n      <div class=\"col d-flex align-items-start\">\n        <svg class=\"bi text-body-secondary flex-shrink-0 me-3\" width=\"1.75em\" height=\"1.75em\" aria-hidden=\"true\"><use xlink:href=\"#tools\"/></svg>\n        <div>\n          <h3 class=\"fw-bold mb-0 fs-4 text-body-emphasis\">Featured title</h3>\n          <p>Paragraph of text beneath the heading to explain the heading.</p>\n        </div>\n      </div>\n    </div>\n  </div>\n\n  <div class=\"b-example-divider\"></div>\n\n  <div class=\"container px-4 py-5\">\n    <h2 class=\"pb-2 border-bottom\">Features with title</h2>\n\n    <div class=\"row row-cols-1 row-cols-md-2 align-items-md-center g-5 py-5\">\n      <div class=\"col d-flex flex-column align-items-start gap-2\">\n        <h2 class=\"fw-bold text-body-emphasis\">Left-aligned title explaining these awesome features</h2>\n        <p class=\"text-body-secondary\">Paragraph of text beneath the heading to explain the heading. We'll add onto it with another sentence and probably just keep going until we run out of words.</p>\n        <a href=\"#\" class=\"btn btn-primary btn-lg\">Primary button</a>\n      </div>\n\n      <div class=\"col\">\n        <div class=\"row row-cols-1 row-cols-sm-2 g-4\">\n          <div class=\"col d-flex flex-column gap-2\">\n            <div class=\"feature-icon-small d-inline-flex align-items-center justify-content-center text-bg-primary bg-gradient fs-4 rounded-3\">\n              <svg class=\"bi\" width=\"1em\" height=\"1em\" aria-hidden=\"true\">\n                <use xlink:href=\"#collection\" />\n              </svg>\n            </div>\n            <h4 class=\"fw-semibold mb-0 text-body-emphasis\">Featured title</h4>\n            <p class=\"text-body-secondary\">Paragraph of text beneath the heading to explain the heading.</p>\n          </div>\n\n          <div class=\"col d-flex flex-column gap-2\">\n            <div class=\"feature-icon-small d-inline-flex align-items-center justify-content-center text-bg-primary bg-gradient fs-4 rounded-3\">\n              <svg class=\"bi\" width=\"1em\" height=\"1em\" aria-hidden=\"true\">\n                <use xlink:href=\"#gear-fill\" />\n              </svg>\n            </div>\n            <h4 class=\"fw-semibold mb-0 text-body-emphasis\">Featured title</h4>\n            <p class=\"text-body-secondary\">Paragraph of text beneath the heading to explain the heading.</p>\n          </div>\n\n          <div class=\"col d-flex flex-column gap-2\">\n            <div class=\"feature-icon-small d-inline-flex align-items-center justify-content-center text-bg-primary bg-gradient fs-4 rounded-3\">\n              <svg class=\"bi\" width=\"1em\" height=\"1em\" aria-hidden=\"true\">\n                <use xlink:href=\"#speedometer\" />\n              </svg>\n            </div>\n            <h4 class=\"fw-semibold mb-0 text-body-emphasis\">Featured title</h4>\n            <p class=\"text-body-secondary\">Paragraph of text beneath the heading to explain the heading.</p>\n          </div>\n\n          <div class=\"col d-flex flex-column gap-2\">\n            <div class=\"feature-icon-small d-inline-flex align-items-center justify-content-center text-bg-primary bg-gradient fs-4 rounded-3\">\n              <svg class=\"bi\" width=\"1em\" height=\"1em\" aria-hidden=\"true\">\n                <use xlink:href=\"#table\" />\n              </svg>\n            </div>\n            <h4 class=\"fw-semibold mb-0 text-body-emphasis\">Featured title</h4>\n            <p class=\"text-body-secondary\">Paragraph of text beneath the heading to explain the heading.</p>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</main>\n"
  },
  {
    "path": "site/src/assets/examples/footers/index.astro",
    "content": "---\nexport const title = 'Footers'\n---\n\n<svg xmlns=\"http://www.w3.org/2000/svg\" class=\"d-none\">\n  <symbol id=\"bootstrap\" viewBox=\"0 0 118 94\">\n    <title>Bootstrap</title>\n    <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M24.509 0c-6.733 0-11.715 5.893-11.492 12.284.214 6.14-.064 14.092-2.066 20.577C8.943 39.365 5.547 43.485 0 44.014v5.972c5.547.529 8.943 4.649 10.951 11.153 2.002 6.485 2.28 14.437 2.066 20.577C12.794 88.106 17.776 94 24.51 94H93.5c6.733 0 11.714-5.893 11.491-12.284-.214-6.14.064-14.092 2.066-20.577 2.009-6.504 5.396-10.624 10.943-11.153v-5.972c-5.547-.529-8.934-4.649-10.943-11.153-2.002-6.484-2.28-14.437-2.066-20.577C105.214 5.894 100.233 0 93.5 0H24.508zM80 57.863C80 66.663 73.436 72 62.543 72H44a2 2 0 01-2-2V24a2 2 0 012-2h18.437c9.083 0 15.044 4.92 15.044 12.474 0 5.302-4.01 10.049-9.119 10.88v.277C75.317 46.394 80 51.21 80 57.863zM60.521 28.34H49.948v14.934h8.905c6.884 0 10.68-2.772 10.68-7.727 0-4.643-3.264-7.207-9.012-7.207zM49.948 49.2v16.458H60.91c7.167 0 10.964-2.876 10.964-8.281 0-5.406-3.903-8.178-11.425-8.178H49.948z\"></path>\n  </symbol>\n  <symbol id=\"facebook\" viewBox=\"0 0 16 16\">\n    <path d=\"M16 8.049c0-4.446-3.582-8.05-8-8.05C3.58 0-.002 3.603-.002 8.05c0 4.017 2.926 7.347 6.75 7.951v-5.625h-2.03V8.05H6.75V6.275c0-2.017 1.195-3.131 3.022-3.131.876 0 1.791.157 1.791.157v1.98h-1.009c-.993 0-1.303.621-1.303 1.258v1.51h2.218l-.354 2.326H9.25V16c3.824-.604 6.75-3.934 6.75-7.951z\"/>\n  </symbol>\n  <symbol id=\"instagram\" viewBox=\"0 0 16 16\">\n      <path d=\"M8 0C5.829 0 5.556.01 4.703.048 3.85.088 3.269.222 2.76.42a3.917 3.917 0 0 0-1.417.923A3.927 3.927 0 0 0 .42 2.76C.222 3.268.087 3.85.048 4.7.01 5.555 0 5.827 0 8.001c0 2.172.01 2.444.048 3.297.04.852.174 1.433.372 1.942.205.526.478.972.923 1.417.444.445.89.719 1.416.923.51.198 1.09.333 1.942.372C5.555 15.99 5.827 16 8 16s2.444-.01 3.298-.048c.851-.04 1.434-.174 1.943-.372a3.916 3.916 0 0 0 1.416-.923c.445-.445.718-.891.923-1.417.197-.509.332-1.09.372-1.942C15.99 10.445 16 10.173 16 8s-.01-2.445-.048-3.299c-.04-.851-.175-1.433-.372-1.941a3.926 3.926 0 0 0-.923-1.417A3.911 3.911 0 0 0 13.24.42c-.51-.198-1.092-.333-1.943-.372C10.443.01 10.172 0 7.998 0h.003zm-.717 1.442h.718c2.136 0 2.389.007 3.232.046.78.035 1.204.166 1.486.275.373.145.64.319.92.599.28.28.453.546.598.92.11.281.24.705.275 1.485.039.843.047 1.096.047 3.231s-.008 2.389-.047 3.232c-.035.78-.166 1.203-.275 1.485a2.47 2.47 0 0 1-.599.919c-.28.28-.546.453-.92.598-.28.11-.704.24-1.485.276-.843.038-1.096.047-3.232.047s-2.39-.009-3.233-.047c-.78-.036-1.203-.166-1.485-.276a2.478 2.478 0 0 1-.92-.598 2.48 2.48 0 0 1-.6-.92c-.109-.281-.24-.705-.275-1.485-.038-.843-.046-1.096-.046-3.233 0-2.136.008-2.388.046-3.231.036-.78.166-1.204.276-1.486.145-.373.319-.64.599-.92.28-.28.546-.453.92-.598.282-.11.705-.24 1.485-.276.738-.034 1.024-.044 2.515-.045v.002zm4.988 1.328a.96.96 0 1 0 0 1.92.96.96 0 0 0 0-1.92zm-4.27 1.122a4.109 4.109 0 1 0 0 8.217 4.109 4.109 0 0 0 0-8.217zm0 1.441a2.667 2.667 0 1 1 0 5.334 2.667 2.667 0 0 1 0-5.334z\"/>\n  </symbol>\n</svg>\n\n<div class=\"container\">\n  <footer class=\"d-flex flex-wrap justify-content-between align-items-center py-3 my-4 border-top\">\n    <p class=\"col-md-4 mb-0 text-body-secondary\">&copy; {new Date().getFullYear()} Company, Inc</p>\n\n    <a href=\"/\" class=\"col-md-4 d-flex align-items-center justify-content-center mb-3 mb-md-0 me-md-auto link-body-emphasis text-decoration-none\" aria-label=\"Bootstrap\">\n      <svg class=\"bi me-2\" width=\"40\" height=\"32\" aria-hidden=\"true\"><use xlink:href=\"#bootstrap\"/></svg>\n    </a>\n\n    <ul class=\"nav col-md-4 justify-content-end\">\n      <li class=\"nav-item\"><a href=\"#\" class=\"nav-link px-2 text-body-secondary\">Home</a></li>\n      <li class=\"nav-item\"><a href=\"#\" class=\"nav-link px-2 text-body-secondary\">Features</a></li>\n      <li class=\"nav-item\"><a href=\"#\" class=\"nav-link px-2 text-body-secondary\">Pricing</a></li>\n      <li class=\"nav-item\"><a href=\"#\" class=\"nav-link px-2 text-body-secondary\">FAQs</a></li>\n      <li class=\"nav-item\"><a href=\"#\" class=\"nav-link px-2 text-body-secondary\">About</a></li>\n    </ul>\n  </footer>\n</div>\n\n<div class=\"b-example-divider\"></div>\n\n<div class=\"container\">\n  <footer class=\"d-flex flex-wrap justify-content-between align-items-center py-3 my-4 border-top\">\n    <div class=\"col-md-4 d-flex align-items-center\">\n      <a href=\"/\" class=\"mb-3 me-2 mb-md-0 text-body-secondary text-decoration-none lh-1\" aria-label=\"Bootstrap\">\n        <svg class=\"bi\" width=\"30\" height=\"24\" aria-hidden=\"true\"><use xlink:href=\"#bootstrap\"/></svg>\n      </a>\n      <span class=\"mb-3 mb-md-0 text-body-secondary\">&copy; {new Date().getFullYear()} Company, Inc</span>\n    </div>\n\n    <ul class=\"nav col-md-4 justify-content-end list-unstyled d-flex\">\n      <li class=\"ms-3\"><a class=\"text-body-secondary\" href=\"#\" aria-label=\"Instagram\"><svg class=\"bi\" width=\"24\" height=\"24\" aria-hidden=\"true\"><use xlink:href=\"#instagram\"/></svg></a></li>\n      <li class=\"ms-3\"><a class=\"text-body-secondary\" href=\"#\" aria-label=\"Facebook\"><svg class=\"bi\" width=\"24\" height=\"24\"><use xlink:href=\"#facebook\"/></svg></a></li>\n    </ul>\n  </footer>\n</div>\n\n<div class=\"b-example-divider\"></div>\n\n<div class=\"container\">\n  <footer class=\"py-3 my-4\">\n    <ul class=\"nav justify-content-center border-bottom pb-3 mb-3\">\n      <li class=\"nav-item\"><a href=\"#\" class=\"nav-link px-2 text-body-secondary\">Home</a></li>\n      <li class=\"nav-item\"><a href=\"#\" class=\"nav-link px-2 text-body-secondary\">Features</a></li>\n      <li class=\"nav-item\"><a href=\"#\" class=\"nav-link px-2 text-body-secondary\">Pricing</a></li>\n      <li class=\"nav-item\"><a href=\"#\" class=\"nav-link px-2 text-body-secondary\">FAQs</a></li>\n      <li class=\"nav-item\"><a href=\"#\" class=\"nav-link px-2 text-body-secondary\">About</a></li>\n    </ul>\n    <p class=\"text-center text-body-secondary\">&copy; {new Date().getFullYear()} Company, Inc</p>\n  </footer>\n</div>\n\n<div class=\"b-example-divider\"></div>\n\n<div class=\"container\">\n  <footer class=\"row row-cols-1 row-cols-sm-2 row-cols-md-5 py-5 my-5 border-top\">\n    <div class=\"col mb-3\">\n      <a href=\"/\" class=\"d-flex align-items-center mb-3 link-body-emphasis text-decoration-none\" aria-label=\"Bootstrap\">\n        <svg class=\"bi me-2\" width=\"40\" height=\"32\" aria-hidden=\"true\"><use xlink:href=\"#bootstrap\"/></svg>\n      </a>\n      <p class=\"text-body-secondary\">&copy; {new Date().getFullYear()}</p>\n    </div>\n\n    <div class=\"col mb-3\">\n\n    </div>\n\n    <div class=\"col mb-3\">\n      <h5>Section</h5>\n      <ul class=\"nav flex-column\">\n        <li class=\"nav-item mb-2\"><a href=\"#\" class=\"nav-link p-0 text-body-secondary\">Home</a></li>\n        <li class=\"nav-item mb-2\"><a href=\"#\" class=\"nav-link p-0 text-body-secondary\">Features</a></li>\n        <li class=\"nav-item mb-2\"><a href=\"#\" class=\"nav-link p-0 text-body-secondary\">Pricing</a></li>\n        <li class=\"nav-item mb-2\"><a href=\"#\" class=\"nav-link p-0 text-body-secondary\">FAQs</a></li>\n        <li class=\"nav-item mb-2\"><a href=\"#\" class=\"nav-link p-0 text-body-secondary\">About</a></li>\n      </ul>\n    </div>\n\n    <div class=\"col mb-3\">\n      <h5>Section</h5>\n      <ul class=\"nav flex-column\">\n        <li class=\"nav-item mb-2\"><a href=\"#\" class=\"nav-link p-0 text-body-secondary\">Home</a></li>\n        <li class=\"nav-item mb-2\"><a href=\"#\" class=\"nav-link p-0 text-body-secondary\">Features</a></li>\n        <li class=\"nav-item mb-2\"><a href=\"#\" class=\"nav-link p-0 text-body-secondary\">Pricing</a></li>\n        <li class=\"nav-item mb-2\"><a href=\"#\" class=\"nav-link p-0 text-body-secondary\">FAQs</a></li>\n        <li class=\"nav-item mb-2\"><a href=\"#\" class=\"nav-link p-0 text-body-secondary\">About</a></li>\n      </ul>\n    </div>\n\n    <div class=\"col mb-3\">\n      <h5>Section</h5>\n      <ul class=\"nav flex-column\">\n        <li class=\"nav-item mb-2\"><a href=\"#\" class=\"nav-link p-0 text-body-secondary\">Home</a></li>\n        <li class=\"nav-item mb-2\"><a href=\"#\" class=\"nav-link p-0 text-body-secondary\">Features</a></li>\n        <li class=\"nav-item mb-2\"><a href=\"#\" class=\"nav-link p-0 text-body-secondary\">Pricing</a></li>\n        <li class=\"nav-item mb-2\"><a href=\"#\" class=\"nav-link p-0 text-body-secondary\">FAQs</a></li>\n        <li class=\"nav-item mb-2\"><a href=\"#\" class=\"nav-link p-0 text-body-secondary\">About</a></li>\n      </ul>\n    </div>\n  </footer>\n</div>\n\n<div class=\"b-example-divider\"></div>\n\n\n<div class=\"container\">\n  <footer class=\"py-5\">\n    <div class=\"row\">\n      <div class=\"col-6 col-md-2 mb-3\">\n        <h5>Section</h5>\n        <ul class=\"nav flex-column\">\n          <li class=\"nav-item mb-2\"><a href=\"#\" class=\"nav-link p-0 text-body-secondary\">Home</a></li>\n          <li class=\"nav-item mb-2\"><a href=\"#\" class=\"nav-link p-0 text-body-secondary\">Features</a></li>\n          <li class=\"nav-item mb-2\"><a href=\"#\" class=\"nav-link p-0 text-body-secondary\">Pricing</a></li>\n          <li class=\"nav-item mb-2\"><a href=\"#\" class=\"nav-link p-0 text-body-secondary\">FAQs</a></li>\n          <li class=\"nav-item mb-2\"><a href=\"#\" class=\"nav-link p-0 text-body-secondary\">About</a></li>\n        </ul>\n      </div>\n\n      <div class=\"col-6 col-md-2 mb-3\">\n        <h5>Section</h5>\n        <ul class=\"nav flex-column\">\n          <li class=\"nav-item mb-2\"><a href=\"#\" class=\"nav-link p-0 text-body-secondary\">Home</a></li>\n          <li class=\"nav-item mb-2\"><a href=\"#\" class=\"nav-link p-0 text-body-secondary\">Features</a></li>\n          <li class=\"nav-item mb-2\"><a href=\"#\" class=\"nav-link p-0 text-body-secondary\">Pricing</a></li>\n          <li class=\"nav-item mb-2\"><a href=\"#\" class=\"nav-link p-0 text-body-secondary\">FAQs</a></li>\n          <li class=\"nav-item mb-2\"><a href=\"#\" class=\"nav-link p-0 text-body-secondary\">About</a></li>\n        </ul>\n      </div>\n\n      <div class=\"col-6 col-md-2 mb-3\">\n        <h5>Section</h5>\n        <ul class=\"nav flex-column\">\n          <li class=\"nav-item mb-2\"><a href=\"#\" class=\"nav-link p-0 text-body-secondary\">Home</a></li>\n          <li class=\"nav-item mb-2\"><a href=\"#\" class=\"nav-link p-0 text-body-secondary\">Features</a></li>\n          <li class=\"nav-item mb-2\"><a href=\"#\" class=\"nav-link p-0 text-body-secondary\">Pricing</a></li>\n          <li class=\"nav-item mb-2\"><a href=\"#\" class=\"nav-link p-0 text-body-secondary\">FAQs</a></li>\n          <li class=\"nav-item mb-2\"><a href=\"#\" class=\"nav-link p-0 text-body-secondary\">About</a></li>\n        </ul>\n      </div>\n\n      <div class=\"col-md-5 offset-md-1 mb-3\">\n        <form>\n          <h5>Subscribe to our newsletter</h5>\n          <p>Monthly digest of what's new and exciting from us.</p>\n          <div class=\"d-flex flex-column flex-sm-row w-100 gap-2\">\n            <label for=\"newsletter1\" class=\"visually-hidden\">Email address</label>\n            <input id=\"newsletter1\" type=\"email\" class=\"form-control\" placeholder=\"Email address\">\n            <button class=\"btn btn-primary\" type=\"button\">Subscribe</button>\n          </div>\n        </form>\n      </div>\n    </div>\n\n    <div class=\"d-flex flex-column flex-sm-row justify-content-between py-4 my-4 border-top\">\n      <p>&copy; {new Date().getFullYear()} Company, Inc. All rights reserved.</p>\n      <ul class=\"list-unstyled d-flex\">\n        <li class=\"ms-3\"><a class=\"link-body-emphasis\" href=\"#\" aria-label=\"Instagram\"><svg class=\"bi\" width=\"24\" height=\"24\"><use xlink:href=\"#instagram\"/></svg></a></li>\n        <li class=\"ms-3\"><a class=\"link-body-emphasis\" href=\"#\" aria-label=\"Facebook\"><svg class=\"bi\" width=\"24\" height=\"24\" aria-hidden=\"true\"><use xlink:href=\"#facebook\"/></svg></a></li>\n      </ul>\n    </div>\n  </footer>\n</div>\n"
  },
  {
    "path": "site/src/assets/examples/grid/grid.css",
    "content": ".themed-grid-col {\n  padding-top: .75rem;\n  padding-bottom: .75rem;\n  background-color: rgba(112.520718, 44.062154, 249.437846, .15);\n  border: 1px solid rgba(112.520718, 44.062154, 249.437846, .3);\n}\n\n.themed-container {\n  padding: .75rem;\n  margin-bottom: 1.5rem;\n  background-color: rgba(112.520718, 44.062154, 249.437846, .15);\n  border: 1px solid rgba(112.520718, 44.062154, 249.437846, .3);\n}\n"
  },
  {
    "path": "site/src/assets/examples/grid/index.astro",
    "content": "---\nexport const title = 'Grid Template'\nexport const extra_css = ['grid.css']\nexport const body_class = 'py-4'\n---\n\n<main>\n  <div class=\"container\">\n\n    <h1>Bootstrap grid examples</h1>\n    <p class=\"lead\">Basic grid layouts to get you familiar with building within the Bootstrap grid system.</p>\n    <p>In these examples the <code>.themed-grid-col</code> class is added to the columns to add some theming. This is not a class that is available in Bootstrap by default.</p>\n\n    <h2 class=\"mt-4\">Five grid tiers</h2>\n    <p>There are five tiers to the Bootstrap grid system, one for each range of devices we support. Each tier starts at a minimum viewport size and automatically applies to the larger devices unless overridden.</p>\n\n    <div class=\"row mb-3 text-center\">\n      <div class=\"col-4 themed-grid-col\">.col-4</div>\n      <div class=\"col-4 themed-grid-col\">.col-4</div>\n      <div class=\"col-4 themed-grid-col\">.col-4</div>\n    </div>\n\n    <div class=\"row mb-3 text-center\">\n      <div class=\"col-sm-4 themed-grid-col\">.col-sm-4</div>\n      <div class=\"col-sm-4 themed-grid-col\">.col-sm-4</div>\n      <div class=\"col-sm-4 themed-grid-col\">.col-sm-4</div>\n    </div>\n\n    <div class=\"row mb-3 text-center\">\n      <div class=\"col-md-4 themed-grid-col\">.col-md-4</div>\n      <div class=\"col-md-4 themed-grid-col\">.col-md-4</div>\n      <div class=\"col-md-4 themed-grid-col\">.col-md-4</div>\n    </div>\n\n    <div class=\"row mb-3 text-center\">\n      <div class=\"col-lg-4 themed-grid-col\">.col-lg-4</div>\n      <div class=\"col-lg-4 themed-grid-col\">.col-lg-4</div>\n      <div class=\"col-lg-4 themed-grid-col\">.col-lg-4</div>\n    </div>\n\n    <div class=\"row mb-3 text-center\">\n      <div class=\"col-xl-4 themed-grid-col\">.col-xl-4</div>\n      <div class=\"col-xl-4 themed-grid-col\">.col-xl-4</div>\n      <div class=\"col-xl-4 themed-grid-col\">.col-xl-4</div>\n    </div>\n\n    <div class=\"row mb-3 text-center\">\n      <div class=\"col-xxl-4 themed-grid-col\">.col-xxl-4</div>\n      <div class=\"col-xxl-4 themed-grid-col\">.col-xxl-4</div>\n      <div class=\"col-xxl-4 themed-grid-col\">.col-xxl-4</div>\n    </div>\n\n    <h2 class=\"mt-4\">Three equal columns</h2>\n    <p>Get three equal-width columns <strong>starting at desktops and scaling to large desktops</strong>. On mobile devices, tablets and below, the columns will automatically stack.</p>\n    <div class=\"row mb-3 text-center\">\n      <div class=\"col-md-4 themed-grid-col\">.col-md-4</div>\n      <div class=\"col-md-4 themed-grid-col\">.col-md-4</div>\n      <div class=\"col-md-4 themed-grid-col\">.col-md-4</div>\n    </div>\n\n    <h2 class=\"mt-4\">Three equal columns alternative</h2>\n    <p>By using the <code>.row-cols-*</code> classes, you can easily create a grid with equal columns.</p>\n    <div class=\"row row-cols-md-3 mb-3 text-center\">\n      <div class=\"col themed-grid-col\"><code>.col</code> child of <code>.row-cols-md-3</code></div>\n      <div class=\"col themed-grid-col\"><code>.col</code> child of <code>.row-cols-md-3</code></div>\n      <div class=\"col themed-grid-col\"><code>.col</code> child of <code>.row-cols-md-3</code></div>\n    </div>\n\n    <h2 class=\"mt-4\">Three unequal columns</h2>\n    <p>Get three columns <strong>starting at desktops and scaling to large desktops</strong> of various widths. Remember, grid columns should add up to twelve for a single horizontal block. More than that, and columns start stacking no matter the viewport.</p>\n    <div class=\"row mb-3 text-center\">\n      <div class=\"col-md-3 themed-grid-col\">.col-md-3</div>\n      <div class=\"col-md-6 themed-grid-col\">.col-md-6</div>\n      <div class=\"col-md-3 themed-grid-col\">.col-md-3</div>\n    </div>\n\n    <h2 class=\"mt-4\">Two columns</h2>\n    <p>Get two columns <strong>starting at desktops and scaling to large desktops</strong>.</p>\n    <div class=\"row mb-3 text-center\">\n      <div class=\"col-md-8 themed-grid-col\">.col-md-8</div>\n      <div class=\"col-md-4 themed-grid-col\">.col-md-4</div>\n    </div>\n\n    <h2 class=\"mt-4\">Full width, single column</h2>\n    <p class=\"text-warning\">\n      No grid classes are necessary for full-width elements.\n    </p>\n\n    <hr class=\"my-4\">\n\n    <h2 class=\"mt-4\">Two columns with two nested columns</h2>\n    <p>Per the documentation, nesting is easy—just put a row of columns within an existing column. This gives you two columns <strong>starting at desktops and scaling to large desktops</strong>, with another two (equal widths) within the larger column.</p>\n    <p>At mobile device sizes, tablets and down, these columns and their nested columns will stack.</p>\n    <div class=\"row mb-3 text-center\">\n      <div class=\"col-md-8 themed-grid-col\">\n        <div class=\"pb-3\">\n          .col-md-8\n        </div>\n        <div class=\"row\">\n          <div class=\"col-md-6 themed-grid-col\">.col-md-6</div>\n          <div class=\"col-md-6 themed-grid-col\">.col-md-6</div>\n        </div>\n      </div>\n      <div class=\"col-md-4 themed-grid-col\">.col-md-4</div>\n    </div>\n\n    <hr class=\"my-4\">\n\n    <h2 class=\"mt-4\">Mixed: mobile and desktop</h2>\n    <p>The Bootstrap v5 grid system has six tiers of classes: xs (extra small, this class infix is not used), sm (small), md (medium), lg (large), xl (x-large), and xxl (xx-large). You can use nearly any combination of these classes to create more dynamic and flexible layouts.</p>\n    <p>Each tier of classes scales up, meaning if you plan on setting the same widths for md, lg, xl and xxl, you only need to specify md.</p>\n    <div class=\"row mb-3 text-center\">\n      <div class=\"col-md-8 themed-grid-col\">.col-md-8</div>\n      <div class=\"col-6 col-md-4 themed-grid-col\">.col-6 .col-md-4</div>\n    </div>\n    <div class=\"row mb-3 text-center\">\n      <div class=\"col-6 col-md-4 themed-grid-col\">.col-6 .col-md-4</div>\n      <div class=\"col-6 col-md-4 themed-grid-col\">.col-6 .col-md-4</div>\n      <div class=\"col-6 col-md-4 themed-grid-col\">.col-6 .col-md-4</div>\n    </div>\n    <div class=\"row mb-3 text-center\">\n      <div class=\"col-6 themed-grid-col\">.col-6</div>\n      <div class=\"col-6 themed-grid-col\">.col-6</div>\n    </div>\n\n    <hr class=\"my-4\">\n\n    <h2 class=\"mt-4\">Mixed: mobile, tablet, and desktop</h2>\n    <div class=\"row mb-3 text-center\">\n      <div class=\"col-sm-6 col-lg-8 themed-grid-col\">.col-sm-6 .col-lg-8</div>\n      <div class=\"col-6 col-lg-4 themed-grid-col\">.col-6 .col-lg-4</div>\n    </div>\n    <div class=\"row mb-3 text-center\">\n      <div class=\"col-6 col-sm-4 themed-grid-col\">.col-6 .col-sm-4</div>\n      <div class=\"col-6 col-sm-4 themed-grid-col\">.col-6 .col-sm-4</div>\n      <div class=\"col-6 col-sm-4 themed-grid-col\">.col-6 .col-sm-4</div>\n    </div>\n\n    <hr class=\"my-4\">\n\n    <h2 class=\"mt-4\">Gutters</h2>\n    <p>With <code>.gx-*</code> classes, the horizontal gutters can be adjusted.</p>\n    <div class=\"row row-cols-1 row-cols-md-3 gx-4 text-center\">\n      <div class=\"col themed-grid-col\"><code>.col</code> with <code>.gx-4</code> gutters</div>\n      <div class=\"col themed-grid-col\"><code>.col</code> with <code>.gx-4</code> gutters</div>\n      <div class=\"col themed-grid-col\"><code>.col</code> with <code>.gx-4</code> gutters</div>\n      <div class=\"col themed-grid-col\"><code>.col</code> with <code>.gx-4</code> gutters</div>\n      <div class=\"col themed-grid-col\"><code>.col</code> with <code>.gx-4</code> gutters</div>\n      <div class=\"col themed-grid-col\"><code>.col</code> with <code>.gx-4</code> gutters</div>\n    </div>\n    <p class=\"mt-4\">Use the <code>.gy-*</code> classes to control the vertical gutters.</p>\n    <div class=\"row row-cols-1 row-cols-md-3 gy-4 text-center\">\n      <div class=\"col themed-grid-col\"><code>.col</code> with <code>.gy-4</code> gutters</div>\n      <div class=\"col themed-grid-col\"><code>.col</code> with <code>.gy-4</code> gutters</div>\n      <div class=\"col themed-grid-col\"><code>.col</code> with <code>.gy-4</code> gutters</div>\n      <div class=\"col themed-grid-col\"><code>.col</code> with <code>.gy-4</code> gutters</div>\n      <div class=\"col themed-grid-col\"><code>.col</code> with <code>.gy-4</code> gutters</div>\n      <div class=\"col themed-grid-col\"><code>.col</code> with <code>.gy-4</code> gutters</div>\n    </div>\n    <p class=\"mt-4\">With <code>.g-*</code> classes, the gutters in both directions can be adjusted.</p>\n    <div class=\"row row-cols-1 row-cols-md-3 g-3 text-center\">\n      <div class=\"col themed-grid-col\"><code>.col</code> with <code>.g-3</code> gutters</div>\n      <div class=\"col themed-grid-col\"><code>.col</code> with <code>.g-3</code> gutters</div>\n      <div class=\"col themed-grid-col\"><code>.col</code> with <code>.g-3</code> gutters</div>\n      <div class=\"col themed-grid-col\"><code>.col</code> with <code>.g-3</code> gutters</div>\n      <div class=\"col themed-grid-col\"><code>.col</code> with <code>.g-3</code> gutters</div>\n      <div class=\"col themed-grid-col\"><code>.col</code> with <code>.g-3</code> gutters</div>\n    </div>\n  </div>\n\n  <div class=\"container\" id=\"containers\">\n    <hr class=\"my-4\">\n\n    <h2 class=\"mt-4\">Containers</h2>\n    <p>Additional classes added in Bootstrap v4.4 allow containers that are 100% wide until a particular breakpoint. v5 adds a new <code>xxl</code> breakpoint.</p>\n  </div>\n\n  <div class=\"container themed-container text-center\">.container</div>\n  <div class=\"container-sm themed-container text-center\">.container-sm</div>\n  <div class=\"container-md themed-container text-center\">.container-md</div>\n  <div class=\"container-lg themed-container text-center\">.container-lg</div>\n  <div class=\"container-xl themed-container text-center\">.container-xl</div>\n  <div class=\"container-xxl themed-container text-center\">.container-xxl</div>\n  <div class=\"container-fluid themed-container text-center\">.container-fluid</div>\n</main>\n"
  },
  {
    "path": "site/src/assets/examples/headers/headers.css",
    "content": ".form-control-dark {\n  border-color: var(--bs-gray);\n}\n.form-control-dark:focus {\n  border-color: #fff;\n  box-shadow: 0 0 0 .25rem rgba(255, 255, 255, .25);\n}\n\n.text-small {\n  font-size: 85%;\n}\n\n.dropdown-toggle:not(:focus) {\n  outline: 0;\n}\n"
  },
  {
    "path": "site/src/assets/examples/headers/index.astro",
    "content": "---\nexport const title = 'Headers'\nexport const extra_css = ['headers.css']\n---\n\n<svg xmlns=\"http://www.w3.org/2000/svg\" class=\"d-none\">\n  <symbol id=\"bootstrap\" viewBox=\"0 0 118 94\">\n    <title>Bootstrap</title>\n    <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M24.509 0c-6.733 0-11.715 5.893-11.492 12.284.214 6.14-.064 14.092-2.066 20.577C8.943 39.365 5.547 43.485 0 44.014v5.972c5.547.529 8.943 4.649 10.951 11.153 2.002 6.485 2.28 14.437 2.066 20.577C12.794 88.106 17.776 94 24.51 94H93.5c6.733 0 11.714-5.893 11.491-12.284-.214-6.14.064-14.092 2.066-20.577 2.009-6.504 5.396-10.624 10.943-11.153v-5.972c-5.547-.529-8.934-4.649-10.943-11.153-2.002-6.484-2.28-14.437-2.066-20.577C105.214 5.894 100.233 0 93.5 0H24.508zM80 57.863C80 66.663 73.436 72 62.543 72H44a2 2 0 01-2-2V24a2 2 0 012-2h18.437c9.083 0 15.044 4.92 15.044 12.474 0 5.302-4.01 10.049-9.119 10.88v.277C75.317 46.394 80 51.21 80 57.863zM60.521 28.34H49.948v14.934h8.905c6.884 0 10.68-2.772 10.68-7.727 0-4.643-3.264-7.207-9.012-7.207zM49.948 49.2v16.458H60.91c7.167 0 10.964-2.876 10.964-8.281 0-5.406-3.903-8.178-11.425-8.178H49.948z\"></path>\n  </symbol>\n  <symbol id=\"home\" viewBox=\"0 0 16 16\">\n    <path d=\"M8.354 1.146a.5.5 0 0 0-.708 0l-6 6A.5.5 0 0 0 1.5 7.5v7a.5.5 0 0 0 .5.5h4.5a.5.5 0 0 0 .5-.5v-4h2v4a.5.5 0 0 0 .5.5H14a.5.5 0 0 0 .5-.5v-7a.5.5 0 0 0-.146-.354L13 5.793V2.5a.5.5 0 0 0-.5-.5h-1a.5.5 0 0 0-.5.5v1.293L8.354 1.146zM2.5 14V7.707l5.5-5.5 5.5 5.5V14H10v-4a.5.5 0 0 0-.5-.5h-3a.5.5 0 0 0-.5.5v4H2.5z\"/>\n  </symbol>\n  <symbol id=\"speedometer2\" viewBox=\"0 0 16 16\">\n    <path d=\"M8 4a.5.5 0 0 1 .5.5V6a.5.5 0 0 1-1 0V4.5A.5.5 0 0 1 8 4zM3.732 5.732a.5.5 0 0 1 .707 0l.915.914a.5.5 0 1 1-.708.708l-.914-.915a.5.5 0 0 1 0-.707zM2 10a.5.5 0 0 1 .5-.5h1.586a.5.5 0 0 1 0 1H2.5A.5.5 0 0 1 2 10zm9.5 0a.5.5 0 0 1 .5-.5h1.5a.5.5 0 0 1 0 1H12a.5.5 0 0 1-.5-.5zm.754-4.246a.389.389 0 0 0-.527-.02L7.547 9.31a.91.91 0 1 0 1.302 1.258l3.434-4.297a.389.389 0 0 0-.029-.518z\"/>\n    <path fill-rule=\"evenodd\" d=\"M0 10a8 8 0 1 1 15.547 2.661c-.442 1.253-1.845 1.602-2.932 1.25C11.309 13.488 9.475 13 8 13c-1.474 0-3.31.488-4.615.911-1.087.352-2.49.003-2.932-1.25A7.988 7.988 0 0 1 0 10zm8-7a7 7 0 0 0-6.603 9.329c.203.575.923.876 1.68.63C4.397 12.533 6.358 12 8 12s3.604.532 4.923.96c.757.245 1.477-.056 1.68-.631A7 7 0 0 0 8 3z\"/>\n  </symbol>\n  <symbol id=\"table\" viewBox=\"0 0 16 16\">\n    <path d=\"M0 2a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2V2zm15 2h-4v3h4V4zm0 4h-4v3h4V8zm0 4h-4v3h3a1 1 0 0 0 1-1v-2zm-5 3v-3H6v3h4zm-5 0v-3H1v2a1 1 0 0 0 1 1h3zm-4-4h4V8H1v3zm0-4h4V4H1v3zm5-3v3h4V4H6zm4 4H6v3h4V8z\"/>\n  </symbol>\n  <symbol id=\"people-circle\" viewBox=\"0 0 16 16\">\n    <path d=\"M11 6a3 3 0 1 1-6 0 3 3 0 0 1 6 0z\"/>\n    <path fill-rule=\"evenodd\" d=\"M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8zm8-7a7 7 0 0 0-5.468 11.37C3.242 11.226 4.805 10 8 10s4.757 1.225 5.468 2.37A7 7 0 0 0 8 1z\"/>\n  </symbol>\n  <symbol id=\"grid\" viewBox=\"0 0 16 16\">\n    <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-3zM2.5 2a.5.5 0 0 0-.5.5v3a.5.5 0 0 0 .5.5h3a.5.5 0 0 0 .5-.5v-3a.5.5 0 0 0-.5-.5h-3zm6.5.5A1.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-3zm1.5-.5a.5.5 0 0 0-.5.5v3a.5.5 0 0 0 .5.5h3a.5.5 0 0 0 .5-.5v-3a.5.5 0 0 0-.5-.5h-3zM1 10.5A1.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-3zm1.5-.5a.5.5 0 0 0-.5.5v3a.5.5 0 0 0 .5.5h3a.5.5 0 0 0 .5-.5v-3a.5.5 0 0 0-.5-.5h-3zm6.5.5A1.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-3zm1.5-.5a.5.5 0 0 0-.5.5v3a.5.5 0 0 0 .5.5h3a.5.5 0 0 0 .5-.5v-3a.5.5 0 0 0-.5-.5h-3z\"/>\n  </symbol>\n</svg>\n\n<main>\n  <h1 class=\"visually-hidden\">Headers examples</h1>\n\n  <div class=\"container\">\n    <header class=\"d-flex flex-wrap justify-content-center py-3 mb-4 border-bottom\">\n      <a href=\"/\" class=\"d-flex align-items-center mb-3 mb-md-0 me-md-auto link-body-emphasis text-decoration-none\">\n        <svg class=\"bi me-2\" width=\"40\" height=\"32\" aria-hidden=\"true\"><use xlink:href=\"#bootstrap\"/></svg>\n        <span class=\"fs-4\">Simple header</span>\n      </a>\n\n      <ul class=\"nav nav-pills\">\n        <li class=\"nav-item\"><a href=\"#\" class=\"nav-link active\" aria-current=\"page\">Home</a></li>\n        <li class=\"nav-item\"><a href=\"#\" class=\"nav-link\">Features</a></li>\n        <li class=\"nav-item\"><a href=\"#\" class=\"nav-link\">Pricing</a></li>\n        <li class=\"nav-item\"><a href=\"#\" class=\"nav-link\">FAQs</a></li>\n        <li class=\"nav-item\"><a href=\"#\" class=\"nav-link\">About</a></li>\n      </ul>\n    </header>\n  </div>\n\n  <div class=\"b-example-divider\"></div>\n\n  <div class=\"container\">\n    <header class=\"d-flex justify-content-center py-3\">\n      <ul class=\"nav nav-pills\">\n        <li class=\"nav-item\"><a href=\"#\" class=\"nav-link active\" aria-current=\"page\">Home</a></li>\n        <li class=\"nav-item\"><a href=\"#\" class=\"nav-link\">Features</a></li>\n        <li class=\"nav-item\"><a href=\"#\" class=\"nav-link\">Pricing</a></li>\n        <li class=\"nav-item\"><a href=\"#\" class=\"nav-link\">FAQs</a></li>\n        <li class=\"nav-item\"><a href=\"#\" class=\"nav-link\">About</a></li>\n      </ul>\n    </header>\n  </div>\n\n  <div class=\"b-example-divider\"></div>\n\n  <div class=\"container\">\n    <header class=\"d-flex flex-wrap align-items-center justify-content-center justify-content-md-between py-3 mb-4 border-bottom\">\n      <div class=\"col-md-3 mb-2 mb-md-0\">\n        <a href=\"/\" class=\"d-inline-flex link-body-emphasis text-decoration-none\">\n          <svg class=\"bi\" width=\"40\" height=\"32\" role=\"img\" aria-label=\"Bootstrap\"><use xlink:href=\"#bootstrap\"/></svg>\n        </a>\n      </div>\n\n      <ul class=\"nav col-12 col-md-auto mb-2 justify-content-center mb-md-0\">\n        <li><a href=\"#\" class=\"nav-link px-2 link-secondary\">Home</a></li>\n        <li><a href=\"#\" class=\"nav-link px-2\">Features</a></li>\n        <li><a href=\"#\" class=\"nav-link px-2\">Pricing</a></li>\n        <li><a href=\"#\" class=\"nav-link px-2\">FAQs</a></li>\n        <li><a href=\"#\" class=\"nav-link px-2\">About</a></li>\n      </ul>\n\n      <div class=\"col-md-3 text-end\">\n        <button type=\"button\" class=\"btn btn-outline-primary me-2\">Login</button>\n        <button type=\"button\" class=\"btn btn-primary\">Sign-up</button>\n      </div>\n    </header>\n  </div>\n\n  <div class=\"b-example-divider\"></div>\n\n  <header class=\"p-3 text-bg-dark\">\n    <div class=\"container\">\n      <div class=\"d-flex flex-wrap align-items-center justify-content-center justify-content-lg-start\">\n        <a href=\"/\" class=\"d-flex align-items-center mb-2 mb-lg-0 text-white text-decoration-none\">\n          <svg class=\"bi me-2\" width=\"40\" height=\"32\" role=\"img\" aria-label=\"Bootstrap\"><use xlink:href=\"#bootstrap\"/></svg>\n        </a>\n\n        <ul class=\"nav col-12 col-lg-auto me-lg-auto mb-2 justify-content-center mb-md-0\">\n          <li><a href=\"#\" class=\"nav-link px-2 text-secondary\">Home</a></li>\n          <li><a href=\"#\" class=\"nav-link px-2 text-white\">Features</a></li>\n          <li><a href=\"#\" class=\"nav-link px-2 text-white\">Pricing</a></li>\n          <li><a href=\"#\" class=\"nav-link px-2 text-white\">FAQs</a></li>\n          <li><a href=\"#\" class=\"nav-link px-2 text-white\">About</a></li>\n        </ul>\n\n        <form class=\"col-12 col-lg-auto mb-3 mb-lg-0 me-lg-3\" role=\"search\">\n          <input type=\"search\" class=\"form-control form-control-dark text-bg-dark\" placeholder=\"Search...\" aria-label=\"Search\">\n        </form>\n\n        <div class=\"text-end\">\n          <button type=\"button\" class=\"btn btn-outline-light me-2\">Login</button>\n          <button type=\"button\" class=\"btn btn-warning\">Sign-up</button>\n        </div>\n      </div>\n    </div>\n  </header>\n\n  <div class=\"b-example-divider\"></div>\n\n  <header class=\"p-3 mb-3 border-bottom\">\n    <div class=\"container\">\n      <div class=\"d-flex flex-wrap align-items-center justify-content-center justify-content-lg-start\">\n        <a href=\"/\" class=\"d-flex align-items-center mb-2 mb-lg-0 link-body-emphasis text-decoration-none\">\n          <svg class=\"bi me-2\" width=\"40\" height=\"32\" role=\"img\" aria-label=\"Bootstrap\"><use xlink:href=\"#bootstrap\"/></svg>\n        </a>\n\n        <ul class=\"nav col-12 col-lg-auto me-lg-auto mb-2 justify-content-center mb-md-0\">\n          <li><a href=\"#\" class=\"nav-link px-2 link-secondary\">Overview</a></li>\n          <li><a href=\"#\" class=\"nav-link px-2 link-body-emphasis\">Inventory</a></li>\n          <li><a href=\"#\" class=\"nav-link px-2 link-body-emphasis\">Customers</a></li>\n          <li><a href=\"#\" class=\"nav-link px-2 link-body-emphasis\">Products</a></li>\n        </ul>\n\n        <form class=\"col-12 col-lg-auto mb-3 mb-lg-0 me-lg-3\" role=\"search\">\n          <input type=\"search\" class=\"form-control\" placeholder=\"Search...\" aria-label=\"Search\">\n        </form>\n\n        <div class=\"dropdown text-end\">\n          <a href=\"#\" class=\"d-block link-body-emphasis text-decoration-none dropdown-toggle\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n            <img src=\"https://github.com/mdo.png\" alt=\"mdo\" width=\"32\" height=\"32\" class=\"rounded-circle\">\n          </a>\n          <ul class=\"dropdown-menu text-small\">\n            <li><a class=\"dropdown-item\" href=\"#\">New project...</a></li>\n            <li><a class=\"dropdown-item\" href=\"#\">Settings</a></li>\n            <li><a class=\"dropdown-item\" href=\"#\">Profile</a></li>\n            <li><hr class=\"dropdown-divider\"></li>\n            <li><a class=\"dropdown-item\" href=\"#\">Sign out</a></li>\n          </ul>\n        </div>\n      </div>\n    </div>\n  </header>\n\n  <div class=\"b-example-divider\"></div>\n\n  <header class=\"py-3 mb-3 border-bottom\">\n    <div class=\"container-fluid d-grid gap-3 align-items-center\" style=\"grid-template-columns: 1fr 2fr;\">\n      <div class=\"dropdown\">\n        <a href=\"#\" class=\"d-flex align-items-center col-lg-4 mb-2 mb-lg-0 link-body-emphasis text-decoration-none dropdown-toggle\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-label=\"Bootstrap menu\">\n          <svg class=\"bi me-2\" width=\"40\" height=\"32\" aria-hidden=\"true\"><use xlink:href=\"#bootstrap\"/></svg>\n        </a>\n        <ul class=\"dropdown-menu text-small shadow\">\n          <li><a class=\"dropdown-item active\" href=\"#\" aria-current=\"page\">Overview</a></li>\n          <li><a class=\"dropdown-item\" href=\"#\">Inventory</a></li>\n          <li><a class=\"dropdown-item\" href=\"#\">Customers</a></li>\n          <li><a class=\"dropdown-item\" href=\"#\">Products</a></li>\n          <li><hr class=\"dropdown-divider\"></li>\n          <li><a class=\"dropdown-item\" href=\"#\">Reports</a></li>\n          <li><a class=\"dropdown-item\" href=\"#\">Analytics</a></li>\n        </ul>\n      </div>\n\n      <div class=\"d-flex align-items-center\">\n        <form class=\"w-100 me-3\" role=\"search\">\n          <input type=\"search\" class=\"form-control\" placeholder=\"Search...\" aria-label=\"Search\">\n        </form>\n\n        <div class=\"flex-shrink-0 dropdown\">\n          <a href=\"#\" class=\"d-block link-body-emphasis text-decoration-none dropdown-toggle\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n            <img src=\"https://github.com/mdo.png\" alt=\"mdo\" width=\"32\" height=\"32\" class=\"rounded-circle\">\n          </a>\n          <ul class=\"dropdown-menu text-small shadow\">\n            <li><a class=\"dropdown-item\" href=\"#\">New project...</a></li>\n            <li><a class=\"dropdown-item\" href=\"#\">Settings</a></li>\n            <li><a class=\"dropdown-item\" href=\"#\">Profile</a></li>\n            <li><hr class=\"dropdown-divider\"></li>\n            <li><a class=\"dropdown-item\" href=\"#\">Sign out</a></li>\n          </ul>\n        </div>\n      </div>\n    </div>\n  </header>\n\n  <div class=\"container-fluid pb-3\">\n    <div class=\"d-grid gap-3\" style=\"grid-template-columns: 1fr 2fr;\">\n      <div class=\"bg-body-tertiary border rounded-3\">\n        <br><br><br><br><br><br><br><br><br><br>\n      </div>\n      <div class=\"bg-body-tertiary border rounded-3\">\n        <br><br><br><br><br><br><br><br><br><br>\n      </div>\n    </div>\n  </div>\n\n  <div class=\"b-example-divider\"></div>\n\n  <nav class=\"py-2 bg-body-tertiary border-bottom\">\n    <div class=\"container d-flex flex-wrap\">\n      <ul class=\"nav me-auto\">\n        <li class=\"nav-item\"><a href=\"#\" class=\"nav-link link-body-emphasis px-2 active\" aria-current=\"page\">Home</a></li>\n        <li class=\"nav-item\"><a href=\"#\" class=\"nav-link link-body-emphasis px-2\">Features</a></li>\n        <li class=\"nav-item\"><a href=\"#\" class=\"nav-link link-body-emphasis px-2\">Pricing</a></li>\n        <li class=\"nav-item\"><a href=\"#\" class=\"nav-link link-body-emphasis px-2\">FAQs</a></li>\n        <li class=\"nav-item\"><a href=\"#\" class=\"nav-link link-body-emphasis px-2\">About</a></li>\n      </ul>\n      <ul class=\"nav\">\n        <li class=\"nav-item\"><a href=\"#\" class=\"nav-link link-body-emphasis px-2\">Login</a></li>\n        <li class=\"nav-item\"><a href=\"#\" class=\"nav-link link-body-emphasis px-2\">Sign up</a></li>\n      </ul>\n    </div>\n  </nav>\n  <header class=\"py-3 mb-4 border-bottom\">\n    <div class=\"container d-flex flex-wrap justify-content-center\">\n      <a href=\"/\" class=\"d-flex align-items-center mb-3 mb-lg-0 me-lg-auto link-body-emphasis text-decoration-none\">\n        <svg class=\"bi me-2\" width=\"40\" height=\"32\" aria-hidden=\"true\"><use xlink:href=\"#bootstrap\"/></svg>\n        <span class=\"fs-4\">Double header</span>\n      </a>\n      <form class=\"col-12 col-lg-auto mb-3 mb-lg-0\" role=\"search\">\n        <input type=\"search\" class=\"form-control\" placeholder=\"Search...\" aria-label=\"Search\">\n      </form>\n    </div>\n  </header>\n\n  <div class=\"b-example-divider\"></div>\n\n  <header>\n    <div class=\"px-3 py-2 text-bg-dark border-bottom\">\n      <div class=\"container\">\n        <div class=\"d-flex flex-wrap align-items-center justify-content-center justify-content-lg-start\">\n          <a href=\"/\" class=\"d-flex align-items-center my-2 my-lg-0 me-lg-auto text-white text-decoration-none\">\n            <svg class=\"bi me-2\" width=\"40\" height=\"32\" role=\"img\" aria-label=\"Bootstrap\"><use xlink:href=\"#bootstrap\"/></svg>\n          </a>\n\n          <ul class=\"nav col-12 col-lg-auto my-2 justify-content-center my-md-0 text-small\">\n            <li>\n              <a href=\"#\" class=\"nav-link text-secondary\">\n                <svg class=\"bi d-block mx-auto mb-1\" width=\"24\" height=\"24\" aria-hidden=\"true\"><use xlink:href=\"#home\"/></svg>\n                Home\n              </a>\n            </li>\n            <li>\n              <a href=\"#\" class=\"nav-link text-white\">\n                <svg class=\"bi d-block mx-auto mb-1\" width=\"24\" height=\"24\" aria-hidden=\"true\"><use xlink:href=\"#speedometer2\"/></svg>\n                Dashboard\n              </a>\n            </li>\n            <li>\n              <a href=\"#\" class=\"nav-link text-white\">\n                <svg class=\"bi d-block mx-auto mb-1\" width=\"24\" height=\"24\" aria-hidden=\"true\"><use xlink:href=\"#table\"/></svg>\n                Orders\n              </a>\n            </li>\n            <li>\n              <a href=\"#\" class=\"nav-link text-white\">\n                <svg class=\"bi d-block mx-auto mb-1\" width=\"24\" height=\"24\" aria-hidden=\"true\"><use xlink:href=\"#grid\"/></svg>\n                Products\n              </a>\n            </li>\n            <li>\n              <a href=\"#\" class=\"nav-link text-white\">\n                <svg class=\"bi d-block mx-auto mb-1\" width=\"24\" height=\"24\" aria-hidden=\"true\"><use xlink:href=\"#people-circle\"/></svg>\n                Customers\n              </a>\n            </li>\n          </ul>\n        </div>\n      </div>\n    </div>\n    <div class=\"px-3 py-2 border-bottom mb-3\">\n      <div class=\"container d-flex flex-wrap justify-content-center\">\n        <form class=\"col-12 col-lg-auto mb-2 mb-lg-0 me-lg-auto\" role=\"search\">\n          <input type=\"search\" class=\"form-control\" placeholder=\"Search...\" aria-label=\"Search\">\n        </form>\n\n        <div class=\"text-end\">\n          <button type=\"button\" class=\"btn btn-light text-dark me-2\">Login</button>\n          <button type=\"button\" class=\"btn btn-primary\">Sign-up</button>\n        </div>\n      </div>\n    </div>\n  </header>\n\n  <div class=\"b-example-divider\"></div>\n</main>\n"
  },
  {
    "path": "site/src/assets/examples/heroes/heroes.css",
    "content": "@media (min-width: 992px) {\n  .rounded-lg-3 { border-radius: .3rem; }\n}\n"
  },
  {
    "path": "site/src/assets/examples/heroes/index.astro",
    "content": "---\nimport { getVersionedDocsPath } from '@libs/path'\n\nexport const title = 'Heroes'\nexport const extra_css = ['heroes.css']\n---\n\n<main>\n  <h1 class=\"visually-hidden\">Heroes examples</h1>\n\n  <div class=\"px-4 py-5 my-5 text-center\">\n    <img class=\"d-block mx-auto mb-4\" src={getVersionedDocsPath('/assets/brand/bootstrap-logo.svg')} alt=\"\" width=\"72\" height=\"57\">\n    <h1 class=\"display-5 fw-bold text-body-emphasis\">Centered hero</h1>\n    <div class=\"col-lg-6 mx-auto\">\n      <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>\n      <div class=\"d-grid gap-2 d-sm-flex justify-content-sm-center\">\n        <button type=\"button\" class=\"btn btn-primary btn-lg px-4 gap-3\">Primary button</button>\n        <button type=\"button\" class=\"btn btn-outline-secondary btn-lg px-4\">Secondary</button>\n      </div>\n    </div>\n  </div>\n\n  <div class=\"b-example-divider\"></div>\n\n  <div class=\"px-4 pt-5 my-5 text-center border-bottom\">\n    <h1 class=\"display-4 fw-bold text-body-emphasis\">Centered screenshot</h1>\n    <div class=\"col-lg-6 mx-auto\">\n      <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>\n      <div class=\"d-grid gap-2 d-sm-flex justify-content-sm-center mb-5\">\n        <button type=\"button\" class=\"btn btn-primary btn-lg px-4 me-sm-3\">Primary button</button>\n        <button type=\"button\" class=\"btn btn-outline-secondary btn-lg px-4\">Secondary</button>\n      </div>\n    </div>\n    <div class=\"overflow-hidden\" style=\"max-height: 30vh;\">\n      <div class=\"container px-5\">\n        <img src=\"bootstrap-docs.png\" class=\"img-fluid border rounded-3 shadow-lg mb-4\" alt=\"Example image\" width=\"700\" height=\"500\" loading=\"lazy\">\n      </div>\n    </div>\n  </div>\n\n  <div class=\"b-example-divider\"></div>\n\n  <div class=\"container col-xxl-8 px-4 py-5\">\n    <div class=\"row flex-lg-row-reverse align-items-center g-5 py-5\">\n      <div class=\"col-10 col-sm-8 col-lg-6\">\n        <img src=\"bootstrap-themes.png\" class=\"d-block mx-lg-auto img-fluid\" alt=\"Bootstrap Themes\" width=\"700\" height=\"500\" loading=\"lazy\">\n      </div>\n      <div class=\"col-lg-6\">\n        <h1 class=\"display-5 fw-bold text-body-emphasis lh-1 mb-3\">Responsive left-aligned hero with image</h1>\n        <p class=\"lead\">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>\n        <div class=\"d-grid gap-2 d-md-flex justify-content-md-start\">\n          <button type=\"button\" class=\"btn btn-primary btn-lg px-4 me-md-2\">Primary</button>\n          <button type=\"button\" class=\"btn btn-outline-secondary btn-lg px-4\">Default</button>\n        </div>\n      </div>\n    </div>\n  </div>\n\n  <div class=\"b-example-divider\"></div>\n\n  <div class=\"container col-xl-10 col-xxl-8 px-4 py-5\">\n    <div class=\"row align-items-center g-lg-5 py-5\">\n      <div class=\"col-lg-7 text-center text-lg-start\">\n        <h1 class=\"display-4 fw-bold lh-1 text-body-emphasis mb-3\">Vertically centered hero sign-up form</h1>\n        <p class=\"col-lg-10 fs-4\">Below is an example form built entirely with Bootstrap’s form controls. Each required form group has a validation state that can be triggered by attempting to submit the form without completing it.</p>\n      </div>\n      <div class=\"col-md-10 mx-auto col-lg-5\">\n        <form class=\"p-4 p-md-5 border rounded-3 bg-body-tertiary\">\n          <div class=\"form-floating mb-3\">\n            <input type=\"email\" class=\"form-control\" id=\"floatingInput\" placeholder=\"name@example.com\">\n            <label for=\"floatingInput\">Email address</label>\n          </div>\n          <div class=\"form-floating mb-3\">\n            <input type=\"password\" class=\"form-control\" id=\"floatingPassword\" placeholder=\"Password\">\n            <label for=\"floatingPassword\">Password</label>\n          </div>\n          <div class=\"checkbox mb-3\">\n            <label>\n              <input type=\"checkbox\" value=\"remember-me\"> Remember me\n            </label>\n          </div>\n          <button class=\"w-100 btn btn-lg btn-primary\" type=\"submit\">Sign up</button>\n          <hr class=\"my-4\">\n          <small class=\"text-body-secondary\">By clicking Sign up, you agree to the terms of use.</small>\n        </form>\n      </div>\n    </div>\n  </div>\n\n  <div class=\"b-example-divider\"></div>\n\n  <div class=\"container my-5\">\n    <div class=\"row p-4 pb-0 pe-lg-0 pt-lg-5 align-items-center rounded-3 border shadow-lg\">\n      <div class=\"col-lg-7 p-3 p-lg-5 pt-lg-3\">\n        <h1 class=\"display-4 fw-bold lh-1 text-body-emphasis\">Border hero with cropped image and shadows</h1>\n        <p class=\"lead\">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>\n        <div class=\"d-grid gap-2 d-md-flex justify-content-md-start mb-4 mb-lg-3\">\n          <button type=\"button\" class=\"btn btn-primary btn-lg px-4 me-md-2 fw-bold\">Primary</button>\n          <button type=\"button\" class=\"btn btn-outline-secondary btn-lg px-4\">Default</button>\n        </div>\n      </div>\n      <div class=\"col-lg-4 offset-lg-1 p-0 overflow-hidden shadow-lg\">\n          <img class=\"rounded-lg-3\" src=\"bootstrap-docs.png\" alt=\"\" width=\"720\">\n      </div>\n    </div>\n  </div>\n\n  <div class=\"b-example-divider\"></div>\n\n  <div class=\"bg-dark text-secondary px-4 py-5 text-center\">\n    <div class=\"py-5\">\n      <h1 class=\"display-5 fw-bold text-white\">Dark color hero</h1>\n      <div class=\"col-lg-6 mx-auto\">\n        <p class=\"fs-5 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>\n        <div class=\"d-grid gap-2 d-sm-flex justify-content-sm-center\">\n          <button type=\"button\" class=\"btn btn-outline-info btn-lg px-4 me-sm-3 fw-bold\">Custom button</button>\n          <button type=\"button\" class=\"btn btn-outline-light btn-lg px-4\">Secondary</button>\n        </div>\n      </div>\n    </div>\n  </div>\n\n  <div class=\"b-example-divider mb-0\"></div>\n</main>\n"
  },
  {
    "path": "site/src/assets/examples/jumbotron/index.astro",
    "content": "---\nexport const title = 'Jumbotron example'\n---\n\n<main>\n  <div class=\"container py-4\">\n    <header class=\"pb-3 mb-4 border-bottom\">\n      <a href=\"/\" class=\"d-flex align-items-center text-body-emphasis text-decoration-none\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"40\" height=\"32\" class=\"me-2\" viewBox=\"0 0 118 94\" role=\"img\"><title>Bootstrap</title><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M24.509 0c-6.733 0-11.715 5.893-11.492 12.284.214 6.14-.064 14.092-2.066 20.577C8.943 39.365 5.547 43.485 0 44.014v5.972c5.547.529 8.943 4.649 10.951 11.153 2.002 6.485 2.28 14.437 2.066 20.577C12.794 88.106 17.776 94 24.51 94H93.5c6.733 0 11.714-5.893 11.491-12.284-.214-6.14.064-14.092 2.066-20.577 2.009-6.504 5.396-10.624 10.943-11.153v-5.972c-5.547-.529-8.934-4.649-10.943-11.153-2.002-6.484-2.28-14.437-2.066-20.577C105.214 5.894 100.233 0 93.5 0H24.508zM80 57.863C80 66.663 73.436 72 62.543 72H44a2 2 0 01-2-2V24a2 2 0 012-2h18.437c9.083 0 15.044 4.92 15.044 12.474 0 5.302-4.01 10.049-9.119 10.88v.277C75.317 46.394 80 51.21 80 57.863zM60.521 28.34H49.948v14.934h8.905c6.884 0 10.68-2.772 10.68-7.727 0-4.643-3.264-7.207-9.012-7.207zM49.948 49.2v16.458H60.91c7.167 0 10.964-2.876 10.964-8.281 0-5.406-3.903-8.178-11.425-8.178H49.948z\" fill=\"currentColor\"></path></svg>\n        <span class=\"fs-4\">Jumbotron example</span>\n      </a>\n    </header>\n\n    <div class=\"p-5 mb-4 bg-body-tertiary rounded-3\">\n      <div class=\"container-fluid py-5\">\n        <h1 class=\"display-5 fw-bold\">Custom jumbotron</h1>\n        <p class=\"col-md-8 fs-4\">Using a series of utilities, you can create this jumbotron, just like the one in previous versions of Bootstrap. Check out the examples below for how you can remix and restyle it to your liking.</p>\n        <button class=\"btn btn-primary btn-lg\" type=\"button\">Example button</button>\n      </div>\n    </div>\n\n    <div class=\"row align-items-md-stretch\">\n      <div class=\"col-md-6\">\n        <div class=\"h-100 p-5 text-bg-dark rounded-3\">\n          <h2>Change the background</h2>\n          <p>Swap the background-color utility and add a `.text-*` color utility to mix up the jumbotron look. Then, mix and match with additional component themes and more.</p>\n          <button class=\"btn btn-outline-light\" type=\"button\">Example button</button>\n        </div>\n      </div>\n      <div class=\"col-md-6\">\n        <div class=\"h-100 p-5 bg-body-tertiary border rounded-3\">\n          <h2>Add borders</h2>\n          <p>Or, keep it light and add a border for some added definition to the boundaries of your content. Be sure to look under the hood at the source HTML here as we've adjusted the alignment and sizing of both column's content for equal-height.</p>\n          <button class=\"btn btn-outline-secondary\" type=\"button\">Example button</button>\n        </div>\n      </div>\n    </div>\n\n    <footer class=\"pt-3 mt-4 text-body-secondary border-top\">\n      &copy; {new Date().getFullYear()}\n    </footer>\n  </div>\n</main>\n"
  },
  {
    "path": "site/src/assets/examples/jumbotrons/index.astro",
    "content": "---\nexport const title = 'Jumbotrons'\nexport const extra_css = ['jumbotrons.css']\n---\n\n<svg xmlns=\"http://www.w3.org/2000/svg\" class=\"d-none\">\n  <symbol id=\"bootstrap\" viewBox=\"0 0 118 94\">\n    <title>Bootstrap</title>\n    <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M24.509 0c-6.733 0-11.715 5.893-11.492 12.284.214 6.14-.064 14.092-2.066 20.577C8.943 39.365 5.547 43.485 0 44.014v5.972c5.547.529 8.943 4.649 10.951 11.153 2.002 6.485 2.28 14.437 2.066 20.577C12.794 88.106 17.776 94 24.51 94H93.5c6.733 0 11.714-5.893 11.491-12.284-.214-6.14.064-14.092 2.066-20.577 2.009-6.504 5.396-10.624 10.943-11.153v-5.972c-5.547-.529-8.934-4.649-10.943-11.153-2.002-6.484-2.28-14.437-2.066-20.577C105.214 5.894 100.233 0 93.5 0H24.508zM80 57.863C80 66.663 73.436 72 62.543 72H44a2 2 0 01-2-2V24a2 2 0 012-2h18.437c9.083 0 15.044 4.92 15.044 12.474 0 5.302-4.01 10.049-9.119 10.88v.277C75.317 46.394 80 51.21 80 57.863zM60.521 28.34H49.948v14.934h8.905c6.884 0 10.68-2.772 10.68-7.727 0-4.643-3.264-7.207-9.012-7.207zM49.948 49.2v16.458H60.91c7.167 0 10.964-2.876 10.964-8.281 0-5.406-3.903-8.178-11.425-8.178H49.948z\"></path>\n  </symbol>\n  <symbol id=\"arrow-right-short\" viewBox=\"0 0 16 16\">\n    <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 8z\"/>\n  </symbol>\n  <symbol id=\"check2-circle\" viewBox=\"0 0 16 16\">\n    <path d=\"M2.5 8a5.5 5.5 0 0 1 8.25-4.764.5.5 0 0 0 .5-.866A6.5 6.5 0 1 0 14.5 8a.5.5 0 0 0-1 0 5.5 5.5 0 1 1-11 0z\"/>\n    <path d=\"M15.354 3.354a.5.5 0 0 0-.708-.708L8 9.293 5.354 6.646a.5.5 0 1 0-.708.708l3 3a.5.5 0 0 0 .708 0l7-7z\"/>\n  </symbol>\n</svg>\n\n<div class=\"container my-5\">\n  <div class=\"p-5 text-center bg-body-tertiary rounded-3\">\n    <svg class=\"bi mt-4 mb-3\" style=\"color: var(--bs-indigo);\" width=\"100\" height=\"100\" aria-hidden=\"true\"><use xlink:href=\"#bootstrap\"/></svg>\n    <h1 class=\"text-body-emphasis\">Jumbotron with icon</h1>\n    <p class=\"col-lg-8 mx-auto fs-5 text-muted\">\n      This is a custom jumbotron featuring an SVG image at the top, some longer text that wraps early thanks to a responsive <code>.col-*</code> class, and a customized call to action.\n    </p>\n    <div class=\"d-inline-flex gap-2 mb-5\">\n      <button class=\"d-inline-flex align-items-center btn btn-primary btn-lg px-4 rounded-pill\" type=\"button\">\n        Call to action\n        <svg class=\"bi ms-2\" width=\"24\" height=\"24\" aria-hidden=\"true\"><use xlink:href=\"#arrow-right-short\"/></svg>\n      </button>\n      <button class=\"btn btn-outline-secondary btn-lg px-4 rounded-pill\" type=\"button\">\n        Secondary link\n      </button>\n    </div>\n  </div>\n</div>\n\n<div class=\"b-example-divider\"></div>\n\n<div class=\"container my-5\">\n  <div class=\"position-relative p-5 text-center text-muted bg-body border border-dashed rounded-5\">\n    <button type=\"button\" class=\"position-absolute top-0 end-0 p-3 m-3 btn-close bg-secondary bg-opacity-10 rounded-pill\" aria-label=\"Close\"></button>\n    <svg class=\"bi mt-5 mb-3\" width=\"48\" height=\"48\" aria-hidden=\"true\"><use xlink:href=\"#check2-circle\"/></svg>\n    <h1 class=\"text-body-emphasis\">Placeholder jumbotron</h1>\n    <p class=\"col-lg-6 mx-auto mb-4\">\n      This faded back jumbotron is useful for placeholder content. It's also a great way to add a bit of context to a page or section when no content is available and to encourage visitors to take a specific action.\n    </p>\n    <button class=\"btn btn-primary px-5 mb-5\" type=\"button\">\n      Call to action\n    </button>\n  </div>\n</div>\n\n<div class=\"b-example-divider\"></div>\n\n<div class=\"my-5\">\n  <div class=\"p-5 text-center bg-body-tertiary\">\n    <div class=\"container py-5\">\n      <h1 class=\"text-body-emphasis\">Full-width jumbotron</h1>\n      <p class=\"col-lg-8 mx-auto lead\">\n        This takes the basic jumbotron above and makes its background edge-to-edge with a <code>.container</code> inside to align content. Similar to above, it's been recreated with built-in grid and utility classes.\n      </p>\n    </div>\n  </div>\n</div>\n\n<div class=\"b-example-divider\"></div>\n\n<div class=\"container my-5\">\n  <div class=\"p-5 text-center bg-body-tertiary rounded-3\">\n    <h1 class=\"text-body-emphasis\">Basic jumbotron</h1>\n    <p class=\"lead\">\n      This is a simple Bootstrap jumbotron that sits within a <code>.container</code>, recreated with built-in utility classes.\n    </p>\n  </div>\n</div>\n\n<div class=\"b-example-divider\"></div>\n"
  },
  {
    "path": "site/src/assets/examples/jumbotrons/jumbotrons.css",
    "content": ".border-dashed { --bs-border-style: dashed; }\n"
  },
  {
    "path": "site/src/assets/examples/list-groups/index.astro",
    "content": "---\nexport const title = 'List groups'\nexport const extra_css = ['list-groups.css']\n---\n\n<svg xmlns=\"http://www.w3.org/2000/svg\" class=\"d-none\">\n  <symbol id=\"calendar-event\" viewBox=\"0 0 16 16\">\n    <path d=\"M11 6.5a.5.5 0 0 1 .5-.5h1a.5.5 0 0 1 .5.5v1a.5.5 0 0 1-.5.5h-1a.5.5 0 0 1-.5-.5v-1z\"/>\n    <path d=\"M3.5 0a.5.5 0 0 1 .5.5V1h8V.5a.5.5 0 0 1 1 0V1h1a2 2 0 0 1 2 2v11a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2V3a2 2 0 0 1 2-2h1V.5a.5.5 0 0 1 .5-.5zM1 4v10a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1V4H1z\"/>\n  </symbol>\n\n  <symbol id=\"alarm\" viewBox=\"0 0 16 16\">\n    <path d=\"M8.5 5.5a.5.5 0 0 0-1 0v3.362l-1.429 2.38a.5.5 0 1 0 .858.515l1.5-2.5A.5.5 0 0 0 8.5 9V5.5z\"/>\n    <path d=\"M6.5 0a.5.5 0 0 0 0 1H7v1.07a7.001 7.001 0 0 0-3.273 12.474l-.602.602a.5.5 0 0 0 .707.708l.746-.746A6.97 6.97 0 0 0 8 16a6.97 6.97 0 0 0 3.422-.892l.746.746a.5.5 0 0 0 .707-.708l-.601-.602A7.001 7.001 0 0 0 9 2.07V1h.5a.5.5 0 0 0 0-1h-3zm1.038 3.018a6.093 6.093 0 0 1 .924 0 6 6 0 1 1-.924 0zM0 3.5c0 .753.333 1.429.86 1.887A8.035 8.035 0 0 1 4.387 1.86 2.5 2.5 0 0 0 0 3.5zM13.5 1c-.753 0-1.429.333-1.887.86a8.035 8.035 0 0 1 3.527 3.527A2.5 2.5 0 0 0 13.5 1z\"/>\n  </symbol>\n\n  <symbol id=\"list-check\" viewBox=\"0 0 16 16\">\n    <path fill-rule=\"evenodd\" d=\"M5 11.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-.5h9a.5.5 0 0 1 0 1h-9a.5.5 0 0 1-.5-.5zm0-4a.5.5 0 0 1 .5-.5h9a.5.5 0 0 1 0 1h-9a.5.5 0 0 1-.5-.5zM3.854 2.146a.5.5 0 0 1 0 .708l-1.5 1.5a.5.5 0 0 1-.708 0l-.5-.5a.5.5 0 1 1 .708-.708L2 3.293l1.146-1.147a.5.5 0 0 1 .708 0zm0 4a.5.5 0 0 1 0 .708l-1.5 1.5a.5.5 0 0 1-.708 0l-.5-.5a.5.5 0 1 1 .708-.708L2 7.293l1.146-1.147a.5.5 0 0 1 .708 0zm0 4a.5.5 0 0 1 0 .708l-1.5 1.5a.5.5 0 0 1-.708 0l-.5-.5a.5.5 0 0 1 .708-.708l.146.147 1.146-1.147a.5.5 0 0 1 .708 0z\"/>\n  </symbol>\n</svg>\n\n<div class=\"d-flex flex-column flex-md-row p-4 gap-4 py-md-5 align-items-center justify-content-center\">\n  <div class=\"list-group\">\n    <a href=\"#\" class=\"list-group-item list-group-item-action d-flex gap-3 py-3\" aria-current=\"true\">\n      <img src=\"https://github.com/twbs.png\" alt=\"\" width=\"32\" height=\"32\" class=\"rounded-circle flex-shrink-0\">\n      <div class=\"d-flex gap-2 w-100 justify-content-between\">\n        <div>\n          <h6 class=\"mb-0\">List group item heading</h6>\n          <p class=\"mb-0 opacity-75\">Some placeholder content in a paragraph.</p>\n        </div>\n        <small class=\"opacity-50 text-nowrap\">now</small>\n      </div>\n    </a>\n    <a href=\"#\" class=\"list-group-item list-group-item-action d-flex gap-3 py-3\" aria-current=\"true\">\n      <img src=\"https://github.com/twbs.png\" alt=\"\" width=\"32\" height=\"32\" class=\"rounded-circle flex-shrink-0\">\n      <div class=\"d-flex gap-2 w-100 justify-content-between\">\n        <div>\n          <h6 class=\"mb-0\">Another title here</h6>\n          <p class=\"mb-0 opacity-75\">Some placeholder content in a paragraph that goes a little longer so it wraps to a new line.</p>\n        </div>\n        <small class=\"opacity-50 text-nowrap\">3d</small>\n      </div>\n    </a>\n    <a href=\"#\" class=\"list-group-item list-group-item-action d-flex gap-3 py-3\" aria-current=\"true\">\n      <img src=\"https://github.com/twbs.png\" alt=\"\" width=\"32\" height=\"32\" class=\"rounded-circle flex-shrink-0\">\n      <div class=\"d-flex gap-2 w-100 justify-content-between\">\n        <div>\n          <h6 class=\"mb-0\">Third heading</h6>\n          <p class=\"mb-0 opacity-75\">Some placeholder content in a paragraph.</p>\n        </div>\n        <small class=\"opacity-50 text-nowrap\">1w</small>\n      </div>\n    </a>\n  </div>\n</div>\n\n<div class=\"b-example-divider\"></div>\n\n<div class=\"d-flex flex-column flex-md-row p-4 gap-4 py-md-5 align-items-center justify-content-center\">\n  <div class=\"list-group\">\n    <label class=\"list-group-item d-flex gap-2\">\n      <input class=\"form-check-input flex-shrink-0\" type=\"checkbox\" value=\"\" checked>\n      <span>\n        First checkbox\n        <small class=\"d-block text-body-secondary\">With support text underneath to add more detail</small>\n      </span>\n    </label>\n    <label class=\"list-group-item d-flex gap-2\">\n      <input class=\"form-check-input flex-shrink-0\" type=\"checkbox\" value=\"\">\n      <span>\n        Second checkbox\n        <small class=\"d-block text-body-secondary\">Some other text goes here</small>\n      </span>\n    </label>\n    <label class=\"list-group-item d-flex gap-2\">\n      <input class=\"form-check-input flex-shrink-0\" type=\"checkbox\" value=\"\">\n      <span>\n        Third checkbox\n        <small class=\"d-block text-body-secondary\">And we end with another snippet of text</small>\n      </span>\n    </label>\n  </div>\n\n  <div class=\"list-group\">\n    <label class=\"list-group-item d-flex gap-2\">\n      <input class=\"form-check-input flex-shrink-0\" type=\"radio\" name=\"listGroupRadios\" id=\"listGroupRadios1\" value=\"\" checked>\n      <span>\n        First radio\n        <small class=\"d-block text-body-secondary\">With support text underneath to add more detail</small>\n      </span>\n    </label>\n    <label class=\"list-group-item d-flex gap-2\">\n      <input class=\"form-check-input flex-shrink-0\" type=\"radio\" name=\"listGroupRadios\" id=\"listGroupRadios2\" value=\"\">\n      <span>\n        Second radio\n        <small class=\"d-block text-body-secondary\">Some other text goes here</small>\n      </span>\n    </label>\n    <label class=\"list-group-item d-flex gap-2\">\n      <input class=\"form-check-input flex-shrink-0\" type=\"radio\" name=\"listGroupRadios\" id=\"listGroupRadios3\" value=\"\">\n      <span>\n        Third radio\n        <small class=\"d-block text-body-secondary\">And we end with another snippet of text</small>\n      </span>\n    </label>\n  </div>\n</div>\n\n<div class=\"b-example-divider\"></div>\n\n<div class=\"d-flex flex-column flex-md-row p-4 gap-4 py-md-5 align-items-center justify-content-center\">\n  <div class=\"list-group\">\n    <label class=\"list-group-item d-flex gap-3\">\n      <input class=\"form-check-input flex-shrink-0\" type=\"checkbox\" value=\"\" checked style=\"font-size: 1.375em;\">\n      <span class=\"pt-1 form-checked-content\">\n        <strong>Finish sales report</strong>\n        <small class=\"d-block text-body-secondary\">\n          <svg class=\"bi me-1\" width=\"1em\" height=\"1em\" role=\"img\" aria-label=\"Schedule\"><use xlink:href=\"#calendar-event\"/></svg>\n          1:00–2:00pm\n        </small>\n      </span>\n    </label>\n    <label class=\"list-group-item d-flex gap-3\">\n      <input class=\"form-check-input flex-shrink-0\" type=\"checkbox\" value=\"\" style=\"font-size: 1.375em;\">\n      <span class=\"pt-1 form-checked-content\">\n        <strong>Weekly All Hands</strong>\n        <small class=\"d-block text-body-secondary\">\n          <svg class=\"bi me-1\" width=\"1em\" height=\"1em\" role=\"img\" aria-label=\"Schedule\"><use xlink:href=\"#calendar-event\"/></svg>\n          2:00–2:30pm\n        </small>\n      </span>\n    </label>\n    <label class=\"list-group-item d-flex gap-3\">\n      <input class=\"form-check-input flex-shrink-0\" type=\"checkbox\" value=\"\" style=\"font-size: 1.375em;\">\n      <span class=\"pt-1 form-checked-content\">\n        <strong>Out of office</strong>\n        <small class=\"d-block text-body-secondary\">\n          <svg class=\"bi me-1\" width=\"1em\" height=\"1em\" role=\"img\" aria-label=\"Reminder\"><use xlink:href=\"#alarm\"/></svg>\n          Tomorrow\n        </small>\n      </span>\n    </label>\n    <label class=\"list-group-item d-flex gap-3 bg-body-tertiary\">\n      <input class=\"form-check-input form-check-input-placeholder bg-body-tertiary flex-shrink-0 pe-none\" disabled type=\"checkbox\" value=\"\" style=\"font-size: 1.375em;\">\n      <span class=\"pt-1 form-checked-content\">\n        <span contenteditable=\"true\" class=\"w-100\">Add new task...</span>\n        <small class=\"d-block text-body-secondary\">\n          <svg class=\"bi me-1\" width=\"1em\" height=\"1em\" aria-hidden=\"true\"><use xlink:href=\"#list-check\"/></svg>\n          Choose list...\n        </small>\n      </span>\n    </label>\n  </div>\n</div>\n\n<div class=\"b-example-divider\"></div>\n\n<div class=\"d-flex flex-column flex-md-row p-4 gap-4 py-md-5 align-items-center justify-content-center\">\n  <div class=\"list-group list-group-checkable d-grid gap-2 border-0\">\n    <input class=\"list-group-item-check pe-none\" type=\"radio\" name=\"listGroupCheckableRadios\" id=\"listGroupCheckableRadios1\" value=\"\" checked>\n    <label class=\"list-group-item rounded-3 py-3\" for=\"listGroupCheckableRadios1\">\n      First radio\n      <span class=\"d-block small opacity-50\">With support text underneath to add more detail</span>\n    </label>\n\n    <input class=\"list-group-item-check pe-none\" type=\"radio\" name=\"listGroupCheckableRadios\" id=\"listGroupCheckableRadios2\" value=\"\">\n    <label class=\"list-group-item rounded-3 py-3\" for=\"listGroupCheckableRadios2\">\n      Second radio\n      <span class=\"d-block small opacity-50\">Some other text goes here</span>\n    </label>\n\n    <input class=\"list-group-item-check pe-none\" type=\"radio\" name=\"listGroupCheckableRadios\" id=\"listGroupCheckableRadios3\" value=\"\">\n    <label class=\"list-group-item rounded-3 py-3\" for=\"listGroupCheckableRadios3\">\n      Third radio\n      <span class=\"d-block small opacity-50\">And we end with another snippet of text</span>\n    </label>\n\n    <input class=\"list-group-item-check pe-none\" type=\"radio\" name=\"listGroupCheckableRadios\" id=\"listGroupCheckableRadios4\" value=\"\" disabled>\n    <label class=\"list-group-item rounded-3 py-3\" for=\"listGroupCheckableRadios4\">\n      Fourth disabled radio\n      <span class=\"d-block small opacity-50\">This option is disabled</span>\n    </label>\n  </div>\n</div>\n\n<div class=\"b-example-divider\"></div>\n\n<div class=\"d-flex flex-column flex-md-row p-4 gap-4 py-md-5 align-items-center justify-content-center\">\n  <div class=\"list-group list-group-radio d-grid gap-2 border-0\">\n    <div class=\"position-relative\">\n      <input class=\"form-check-input position-absolute top-50 end-0 me-3 fs-5\" type=\"radio\" name=\"listGroupRadioGrid\" id=\"listGroupRadioGrid1\" value=\"\" checked>\n      <label class=\"list-group-item py-3 pe-5\" for=\"listGroupRadioGrid1\">\n        <strong class=\"fw-semibold\">First radio</strong>\n        <span class=\"d-block small opacity-75\">With support text underneath to add more detail</span>\n      </label>\n    </div>\n\n    <div class=\"position-relative\">\n      <input class=\"form-check-input position-absolute top-50 end-0 me-3 fs-5\" type=\"radio\" name=\"listGroupRadioGrid\" id=\"listGroupRadioGrid2\" value=\"\">\n      <label class=\"list-group-item py-3 pe-5\" for=\"listGroupRadioGrid2\">\n        <strong class=\"fw-semibold\">Second radio</strong>\n        <span class=\"d-block small opacity-75\">Some other text goes here</span>\n      </label>\n    </div>\n\n    <div class=\"position-relative\">\n      <input class=\"form-check-input position-absolute top-50 end-0 me-3 fs-5\" type=\"radio\" name=\"listGroupRadioGrid\" id=\"listGroupRadioGrid3\" value=\"\">\n      <label class=\"list-group-item py-3 pe-5\" for=\"listGroupRadioGrid3\">\n        <strong class=\"fw-semibold\">Third radio</strong>\n        <span class=\"d-block small opacity-75\">And we end with another snippet of text</span>\n      </label>\n    </div>\n\n    <div class=\"position-relative\">\n      <input class=\"form-check-input position-absolute top-50 end-0 me-3 fs-5\" type=\"radio\" name=\"listGroupRadioGrid\" id=\"listGroupRadioGrid4\" value=\"\" disabled>\n      <label class=\"list-group-item py-3 pe-5\" for=\"listGroupRadioGrid4\">\n        <strong class=\"fw-semibold\">Fourth disabled radio</strong>\n        <span class=\"d-block small opacity-75\">This option is disabled</span>\n      </label>\n    </div>\n  </div>\n</div>\n"
  },
  {
    "path": "site/src/assets/examples/list-groups/list-groups.css",
    "content": ".list-group {\n  width: 100%;\n  max-width: 460px;\n  margin-inline: 1.5rem;\n}\n\n.form-check-input:checked + .form-checked-content {\n  opacity: .5;\n}\n\n.form-check-input-placeholder {\n  border-style: dashed;\n}\n[contenteditable]:focus {\n  outline: 0;\n}\n\n.list-group-checkable .list-group-item {\n  cursor: pointer;\n}\n.list-group-item-check {\n  position: absolute;\n  clip: rect(0, 0, 0, 0);\n}\n.list-group-item-check:hover + .list-group-item {\n  background-color: var(--bs-secondary-bg);\n}\n.list-group-item-check:checked + .list-group-item {\n  color: #fff;\n  background-color: var(--bs-primary);\n  border-color: var(--bs-primary);\n}\n.list-group-item-check[disabled] + .list-group-item,\n.list-group-item-check:disabled + .list-group-item {\n  pointer-events: none;\n  filter: none;\n  opacity: .5;\n}\n\n.list-group-radio .list-group-item {\n  cursor: pointer;\n  border-radius: .5rem;\n}\n.list-group-radio .form-check-input {\n  z-index: 2;\n  margin-top: -.5em;\n}\n.list-group-radio .list-group-item:hover,\n.list-group-radio .list-group-item:focus {\n  background-color: var(--bs-secondary-bg);\n}\n\n.list-group-radio .form-check-input:checked + .list-group-item {\n  background-color: var(--bs-body);\n  border-color: var(--bs-primary);\n  box-shadow: 0 0 0 2px var(--bs-primary);\n}\n.list-group-radio .form-check-input[disabled] + .list-group-item,\n.list-group-radio .form-check-input:disabled + .list-group-item {\n  pointer-events: none;\n  filter: none;\n  opacity: .5;\n}\n"
  },
  {
    "path": "site/src/assets/examples/masonry/index.astro",
    "content": "---\nexport const title = 'Masonry example'\nexport const extra_js = [{\n  src: 'https://cdn.jsdelivr.net/npm/masonry-layout@4.2.2/dist/masonry.pkgd.min.js',\n  integrity: 'sha384-GNFwBvfVxBkLMJpYMOABq3c+d3KnQxudP/mGPkzpZSTYykLBNsZEnG2D9G/X/+7D',\n  async: true\n}]\nimport Placeholder from \"@shortcodes/Placeholder.astro\"\n---\n\n<main class=\"container py-5\">\n  <h1>Bootstrap and Masonry</h1>\n  <p class=\"lead\">Integrate <a href=\"https://masonry.desandro.com/\">Masonry</a> with the Bootstrap grid system and cards component.</p>\n\n  <p>Masonry is not included in Bootstrap. Add it by including the JavaScript plugin manually, or using a CDN like so:</p>\n\n  <pre><code>\n&lt;script src=&quot;https://cdn.jsdelivr.net/npm/masonry-layout@4.2.2/dist/masonry.pkgd.min.js&quot; integrity=&quot;sha384-GNFwBvfVxBkLMJpYMOABq3c+d3KnQxudP/mGPkzpZSTYykLBNsZEnG2D9G/X/+7D&quot; crossorigin=&quot;anonymous&quot; async&gt;&lt;/script&gt;\n  </code></pre>\n\n  <p>By adding <code>data-masonry='&lcub;\"percentPosition\": true &rcub;'</code> to the <code>.row</code> wrapper, we can combine the powers of Bootstrap's responsive grid and Masonry's positioning.</p>\n\n  <hr class=\"my-5\">\n\n  <div class=\"row\" data-masonry='{\"percentPosition\": true }'>\n    <div class=\"col-sm-6 col-lg-4 mb-4\">\n      <div class=\"card\">\n        <Placeholder width=\"100%\" height=\"200\" class=\"card-img-top\" text=\"Image cap\" />\n        <div class=\"card-body\">\n          <h5 class=\"card-title\">Card title that wraps to a new line</h5>\n          <p class=\"card-text\">This is a longer card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</p>\n        </div>\n      </div>\n    </div>\n    <div class=\"col-sm-6 col-lg-4 mb-4\">\n      <div class=\"card p-3\">\n        <figure class=\"p-3 mb-0\">\n          <blockquote class=\"blockquote\">\n            <p>A well-known quote, contained in a blockquote element.</p>\n          </blockquote>\n          <figcaption class=\"blockquote-footer mb-0 text-body-secondary\">\n            Someone famous in <cite title=\"Source Title\">Source Title</cite>\n          </figcaption>\n        </figure>\n      </div>\n    </div>\n    <div class=\"col-sm-6 col-lg-4 mb-4\">\n      <div class=\"card\">\n        <Placeholder width=\"100%\" height=\"200\" class=\"card-img-top\" text=\"Image cap\" />\n        <div class=\"card-body\">\n          <h5 class=\"card-title\">Card title</h5>\n          <p class=\"card-text\">This card has supporting text below as a natural lead-in to additional content.</p>\n          <p class=\"card-text\"><small class=\"text-body-secondary\">Last updated 3 mins ago</small></p>\n        </div>\n      </div>\n    </div>\n    <div class=\"col-sm-6 col-lg-4 mb-4\">\n      <div class=\"card text-bg-primary text-center p-3\">\n        <figure class=\"mb-0\">\n          <blockquote class=\"blockquote\">\n            <p>A well-known quote, contained in a blockquote element.</p>\n          </blockquote>\n          <figcaption class=\"blockquote-footer mb-0 text-white\">\n            Someone famous in <cite title=\"Source Title\">Source Title</cite>\n          </figcaption>\n        </figure>\n      </div>\n    </div>\n    <div class=\"col-sm-6 col-lg-4 mb-4\">\n      <div class=\"card text-center\">\n        <div class=\"card-body\">\n          <h5 class=\"card-title\">Card title</h5>\n          <p class=\"card-text\">This card has a regular title and short paragraph of text below it.</p>\n          <p class=\"card-text\"><small class=\"text-body-secondary\">Last updated 3 mins ago</small></p>\n        </div>\n      </div>\n    </div>\n    <div class=\"col-sm-6 col-lg-4 mb-4\">\n      <div class=\"card\">\n        <Placeholder width=\"100%\" height=\"260\" class=\"card-img\" text=\"Card image\" />\n      </div>\n    </div>\n    <div class=\"col-sm-6 col-lg-4 mb-4\">\n      <div class=\"card p-3 text-end\">\n        <figure class=\"mb-0\">\n          <blockquote class=\"blockquote\">\n            <p>A well-known quote, contained in a blockquote element.</p>\n          </blockquote>\n          <figcaption class=\"blockquote-footer mb-0 text-body-secondary\">\n            Someone famous in <cite title=\"Source Title\">Source Title</cite>\n          </figcaption>\n        </figure>\n      </div>\n    </div>\n    <div class=\"col-sm-6 col-lg-4 mb-4\">\n      <div class=\"card\">\n        <div class=\"card-body\">\n          <h5 class=\"card-title\">Card title</h5>\n          <p class=\"card-text\">This is another card with title and supporting text below. This card has some additional content to make it slightly taller overall.</p>\n          <p class=\"card-text\"><small class=\"text-body-secondary\">Last updated 3 mins ago</small></p>\n        </div>\n      </div>\n    </div>\n  </div>\n\n</main>\n"
  },
  {
    "path": "site/src/assets/examples/modals/index.astro",
    "content": "---\nexport const title = 'Modals'\nexport const extra_css = ['modals.css']\n---\n\n<svg xmlns=\"http://www.w3.org/2000/svg\" class=\"d-none\">\n  <symbol id=\"bookmark-star\" viewBox=\"0 0 16 16\">\n    <path d=\"M7.84 4.1a.178.178 0 0 1 .32 0l.634 1.285a.178.178 0 0 0 .134.098l1.42.206c.145.021.204.2.098.303L9.42 6.993a.178.178 0 0 0-.051.158l.242 1.414a.178.178 0 0 1-.258.187l-1.27-.668a.178.178 0 0 0-.165 0l-1.27.668a.178.178 0 0 1-.257-.187l.242-1.414a.178.178 0 0 0-.05-.158l-1.03-1.001a.178.178 0 0 1 .098-.303l1.42-.206a.178.178 0 0 0 .134-.098L7.84 4.1z\"/>\n    <path d=\"M2 2a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v13.5a.5.5 0 0 1-.777.416L8 13.101l-5.223 2.815A.5.5 0 0 1 2 15.5V2zm2-1a1 1 0 0 0-1 1v12.566l4.723-2.482a.5.5 0 0 1 .554 0L13 14.566V2a1 1 0 0 0-1-1H4z\"/>\n  </symbol>\n\n  <symbol id=\"grid-fill\" viewBox=\"0 0 16 16\">\n    <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\"/>\n  </symbol>\n\n  <symbol id=\"film\" viewBox=\"0 0 16 16\">\n    <path d=\"M0 1a1 1 0 0 1 1-1h14a1 1 0 0 1 1 1v14a1 1 0 0 1-1 1H1a1 1 0 0 1-1-1V1zm4 0v6h8V1H4zm8 8H4v6h8V9zM1 1v2h2V1H1zm2 3H1v2h2V4zM1 7v2h2V7H1zm2 3H1v2h2v-2zm-2 3v2h2v-2H1zM15 1h-2v2h2V1zm-2 3v2h2V4h-2zm2 3h-2v2h2V7zm-2 3v2h2v-2h-2zm2 3h-2v2h2v-2z\"/>\n  </symbol>\n\n  <symbol id=\"google\" viewBox=\"0 0 16 16\">\n    <path d=\"M15.545 6.558a9.4 9.4 0 0 1 .139 1.626c0 2.434-.87 4.492-2.384 5.885h.002C11.978 15.292 10.158 16 8 16A8 8 0 1 1 8 0a7.7 7.7 0 0 1 5.352 2.082l-2.284 2.284A4.35 4.35 0 0 0 8 3.166c-2.087 0-3.86 1.408-4.492 3.304a4.8 4.8 0 0 0 0 3.063h.003c.635 1.893 2.405 3.301 4.492 3.301 1.078 0 2.004-.276 2.722-.764h-.003a3.7 3.7 0 0 0 1.599-2.431H8v-3.08z\"/>\n  </symbol>\n\n  <symbol id=\"github\" viewBox=\"0 0 16 16\">\n    <path d=\"M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.012 8.012 0 0 0 16 8c0-4.42-3.58-8-8-8z\"/>\n  </symbol>\n\n  <symbol id=\"facebook\" viewBox=\"0 0 16 16\">\n    <path d=\"M16 8.049c0-4.446-3.582-8.05-8-8.05C3.58 0-.002 3.603-.002 8.05c0 4.017 2.926 7.347 6.75 7.951v-5.625h-2.03V8.05H6.75V6.275c0-2.017 1.195-3.131 3.022-3.131.876 0 1.791.157 1.791.157v1.98h-1.009c-.993 0-1.303.621-1.303 1.258v1.51h2.218l-.354 2.326H9.25V16c3.824-.604 6.75-3.934 6.75-7.951z\"/>\n  </symbol>\n</svg>\n\n<div class=\"modal modal-sheet position-static d-block bg-body-secondary p-4 py-md-5\" tabindex=\"-1\" role=\"dialog\" id=\"modalSheet\">\n  <div class=\"modal-dialog\">\n    <div class=\"modal-content rounded-4 shadow\">\n      <div class=\"modal-header border-bottom-0\">\n        <h1 class=\"modal-title fs-5\">Modal title</h1>\n        <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>\n      </div>\n      <div class=\"modal-body py-0\">\n        <p>This is a modal sheet, a variation of the modal that docs itself to the bottom of the viewport like the newer share sheets in iOS.</p>\n      </div>\n      <div class=\"modal-footer flex-column align-items-stretch w-100 gap-2 pb-3 border-top-0\">\n        <button type=\"button\" class=\"btn btn-lg btn-primary\">Save changes</button>\n        <button type=\"button\" class=\"btn btn-lg btn-secondary\" data-bs-dismiss=\"modal\">Close</button>\n      </div>\n    </div>\n  </div>\n</div>\n\n<div class=\"b-example-divider\"></div>\n\n<div class=\"modal modal-sheet position-static d-block bg-body-secondary p-4 py-md-5\" tabindex=\"-1\" role=\"dialog\" id=\"modalChoice\">\n  <div class=\"modal-dialog\">\n    <div class=\"modal-content rounded-3 shadow\">\n      <div class=\"modal-body p-4 text-center\">\n        <h5 class=\"mb-0\">Enable this setting?</h5>\n        <p class=\"mb-0\">You can always change your mind in your account settings.</p>\n      </div>\n      <div class=\"modal-footer flex-nowrap p-0\">\n        <button type=\"button\" class=\"btn btn-lg btn-link fs-6 text-decoration-none col-6 py-3 m-0 rounded-0 border-end\"><strong>Yes, enable</strong></button>\n        <button type=\"button\" class=\"btn btn-lg btn-link fs-6 text-decoration-none col-6 py-3 m-0 rounded-0\" data-bs-dismiss=\"modal\">No thanks</button>\n      </div>\n    </div>\n  </div>\n</div>\n\n<div class=\"b-example-divider\"></div>\n\n<div class=\"modal modal-sheet position-static d-block bg-body-secondary p-4 py-md-5\" tabindex=\"-1\" role=\"dialog\" id=\"modalTour\">\n  <div class=\"modal-dialog\">\n    <div class=\"modal-content rounded-4 shadow\">\n      <div class=\"modal-body p-5\">\n        <h2 class=\"fw-bold mb-0\">What's new</h2>\n\n        <ul class=\"d-grid gap-4 my-5 list-unstyled small\">\n          <li class=\"d-flex gap-4\">\n            <svg class=\"bi text-body-secondary flex-shrink-0\" width=\"48\" height=\"48\" aria-hidden=\"true\"><use xlink:href=\"#grid-fill\"/></svg>\n            <div>\n              <h5 class=\"mb-0\">Grid view</h5>\n              Not into lists? Try the new grid view.\n            </div>\n          </li>\n          <li class=\"d-flex gap-4\">\n            <svg class=\"bi text-warning flex-shrink-0\" width=\"48\" height=\"48\" aria-hidden=\"true\"><use xlink:href=\"#bookmark-star\"/></svg>\n            <div>\n              <h5 class=\"mb-0\">Bookmarks</h5>\n              Save items you love for easy access later.\n            </div>\n          </li>\n          <li class=\"d-flex gap-4\">\n            <svg class=\"bi text-primary flex-shrink-0\" width=\"48\" height=\"48\" aria-hidden=\"true\"><use xlink:href=\"#film\"/></svg>\n            <div>\n              <h5 class=\"mb-0\">Video embeds</h5>\n              Share videos wherever you go.\n            </div>\n          </li>\n        </ul>\n        <button type=\"button\" class=\"btn btn-lg btn-primary mt-5 w-100\" data-bs-dismiss=\"modal\">Great, thanks!</button>\n      </div>\n    </div>\n  </div>\n</div>\n\n<div class=\"b-example-divider\"></div>\n\n<div class=\"modal modal-sheet position-static d-block bg-body-secondary p-4 py-md-5\" tabindex=\"-1\" role=\"dialog\" id=\"modalSignin\">\n  <div class=\"modal-dialog\">\n    <div class=\"modal-content rounded-4 shadow\">\n      <div class=\"modal-header p-5 pb-4 border-bottom-0\">\n        <h1 class=\"fw-bold mb-0 fs-2\">Sign up for free</h1>\n        <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>\n      </div>\n\n      <div class=\"modal-body p-5 pt-0\">\n        <form class=\"\">\n          <div class=\"form-floating mb-3\">\n            <input type=\"email\" class=\"form-control rounded-3\" id=\"floatingInput\" placeholder=\"name@example.com\">\n            <label for=\"floatingInput\">Email address</label>\n          </div>\n          <div class=\"form-floating mb-3\">\n            <input type=\"password\" class=\"form-control rounded-3\" id=\"floatingPassword\" placeholder=\"Password\">\n            <label for=\"floatingPassword\">Password</label>\n          </div>\n          <button class=\"w-100 mb-2 btn btn-lg rounded-3 btn-primary\" type=\"submit\">Sign up</button>\n          <small class=\"text-body-secondary\">By clicking Sign up, you agree to the terms of use.</small>\n          <hr class=\"my-4\">\n          <h2 class=\"fs-5 fw-bold mb-3\">Or use a third-party</h2>\n          <button class=\"w-100 py-2 mb-2 btn btn-outline-secondary rounded-3\" type=\"submit\">\n            <svg class=\"bi me-1\" width=\"16\" height=\"16\" aria-hidden=\"true\"><use xlink:href=\"#google\"/></svg>\n            Sign up with Google\n          </button>\n          <button class=\"w-100 py-2 mb-2 btn btn-outline-primary rounded-3\" type=\"submit\">\n            <svg class=\"bi me-1\" width=\"16\" height=\"16\" aria-hidden=\"true\"><use xlink:href=\"#facebook\"/></svg>\n            Sign up with Facebook\n          </button>\n          <button class=\"w-100 py-2 mb-2 btn btn-outline-secondary rounded-3\" type=\"submit\">\n            <svg class=\"bi me-1\" width=\"16\" height=\"16\" aria-hidden=\"true\"><use xlink:href=\"#github\"/></svg>\n            Sign up with GitHub\n          </button>\n        </form>\n      </div>\n    </div>\n  </div>\n</div>\n\n<div class=\"b-example-divider\"></div>\n"
  },
  {
    "path": "site/src/assets/examples/modals/modals.css",
    "content": ".modal-sheet .modal-dialog {\n  width: 380px;\n  transition: bottom .75s ease-in-out;\n}\n.modal-sheet .modal-footer {\n  padding-bottom: 2rem;\n}\n"
  },
  {
    "path": "site/src/assets/examples/navbar-bottom/index.astro",
    "content": "---\nimport { getVersionedDocsPath } from '@libs/path'\n\nexport const title = 'Bottom navbar example'\n---\n\n<main class=\"container\">\n  <div class=\"bg-body-tertiary p-5 rounded mt-3\">\n    <h1>Bottom Navbar example</h1>\n    <p class=\"lead\">This example is a quick exercise to illustrate how the bottom navbar works.</p>\n    <a class=\"btn btn-lg btn-primary\" href={getVersionedDocsPath('/components/navbar')} role=\"button\">View navbar docs &raquo;</a>\n  </div>\n</main>\n<nav class=\"navbar fixed-bottom navbar-expand-sm navbar-dark bg-dark\">\n  <div class=\"container-fluid\">\n    <a class=\"navbar-brand\" href=\"#\">Bottom navbar</a>\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbarCollapse\" aria-controls=\"navbarCollapse\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n    <div class=\"collapse navbar-collapse\" id=\"navbarCollapse\">\n      <ul class=\"navbar-nav\">\n        <li class=\"nav-item\">\n          <a class=\"nav-link active\" aria-current=\"page\" href=\"#\">Home</a>\n        </li>\n        <li class=\"nav-item\">\n          <a class=\"nav-link\" href=\"#\">Link</a>\n        </li>\n        <li class=\"nav-item\">\n          <a class=\"nav-link disabled\" aria-disabled=\"true\">Disabled</a>\n        </li>\n        <li class=\"nav-item dropup\">\n          <a class=\"nav-link dropdown-toggle\" href=\"#\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">Dropup</a>\n          <ul class=\"dropdown-menu\">\n            <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n            <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n            <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n          </ul>\n        </li>\n      </ul>\n    </div>\n  </div>\n</nav>\n"
  },
  {
    "path": "site/src/assets/examples/navbar-fixed/index.astro",
    "content": "---\nimport { getVersionedDocsPath } from '@libs/path'\n\nexport const title = 'Fixed top navbar example'\nexport const extra_css = ['navbar-fixed.css']\n---\n\n<nav class=\"navbar navbar-expand-md navbar-dark fixed-top bg-dark\">\n  <div class=\"container-fluid\">\n    <a class=\"navbar-brand\" href=\"#\">Fixed navbar</a>\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbarCollapse\" aria-controls=\"navbarCollapse\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n    <div class=\"collapse navbar-collapse\" id=\"navbarCollapse\">\n      <ul class=\"navbar-nav me-auto mb-2 mb-md-0\">\n        <li class=\"nav-item\">\n          <a class=\"nav-link active\" aria-current=\"page\" href=\"#\">Home</a>\n        </li>\n        <li class=\"nav-item\">\n          <a class=\"nav-link\" href=\"#\">Link</a>\n        </li>\n        <li class=\"nav-item\">\n          <a class=\"nav-link disabled\" aria-disabled=\"true\">Disabled</a>\n        </li>\n      </ul>\n      <form class=\"d-flex\" role=\"search\">\n        <input class=\"form-control me-2\" type=\"search\" placeholder=\"Search\" aria-label=\"Search\">\n        <button class=\"btn btn-outline-success\" type=\"submit\">Search</button>\n      </form>\n    </div>\n  </div>\n</nav>\n\n<main class=\"container\">\n  <div class=\"bg-body-tertiary p-5 rounded\">\n    <h1>Navbar example</h1>\n    <p class=\"lead\">This example is a quick exercise to illustrate how fixed to top navbar works. As you scroll, it will remain fixed to the top of your browser’s viewport.</p>\n    <a class=\"btn btn-lg btn-primary\" href={getVersionedDocsPath('/components/navbar')} role=\"button\">View navbar docs &raquo;</a>\n  </div>\n</main>\n"
  },
  {
    "path": "site/src/assets/examples/navbar-fixed/navbar-fixed.css",
    "content": "/* Show it is fixed to the top */\nbody {\n  min-height: 75rem;\n  padding-top: 4.5rem;\n}\n"
  },
  {
    "path": "site/src/assets/examples/navbar-static/index.astro",
    "content": "---\nimport { getVersionedDocsPath } from '@libs/path'\n\nexport const title = 'Top navbar example'\nexport const extra_css = ['navbar-static.css']\n---\n\n<nav class=\"navbar navbar-expand-md navbar-dark bg-dark mb-4\">\n  <div class=\"container-fluid\">\n    <a class=\"navbar-brand\" href=\"#\">Top navbar</a>\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbarCollapse\" aria-controls=\"navbarCollapse\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n    <div class=\"collapse navbar-collapse\" id=\"navbarCollapse\">\n      <ul class=\"navbar-nav me-auto mb-2 mb-md-0\">\n        <li class=\"nav-item\">\n          <a class=\"nav-link active\" aria-current=\"page\" href=\"#\">Home</a>\n        </li>\n        <li class=\"nav-item\">\n          <a class=\"nav-link\" href=\"#\">Link</a>\n        </li>\n        <li class=\"nav-item\">\n          <a class=\"nav-link disabled\" aria-disabled=\"true\">Disabled</a>\n        </li>\n      </ul>\n      <form class=\"d-flex\" role=\"search\">\n        <input class=\"form-control me-2\" type=\"search\" placeholder=\"Search\" aria-label=\"Search\">\n        <button class=\"btn btn-outline-success\" type=\"submit\">Search</button>\n      </form>\n    </div>\n  </div>\n</nav>\n\n<main class=\"container\">\n  <div class=\"bg-body-tertiary p-5 rounded\">\n    <h1>Navbar example</h1>\n    <p class=\"lead\">This example is a quick exercise to illustrate how the top-aligned navbar works. As you scroll, this navbar remains in its original position and moves with the rest of the page.</p>\n    <a class=\"btn btn-lg btn-primary\" href={getVersionedDocsPath('/components/navbar')} role=\"button\">View navbar docs &raquo;</a>\n  </div>\n</main>\n"
  },
  {
    "path": "site/src/assets/examples/navbar-static/navbar-static.css",
    "content": "/* Show it's not fixed to the top */\nbody {\n  min-height: 75rem;\n}\n"
  },
  {
    "path": "site/src/assets/examples/navbars/index.astro",
    "content": "---\nimport { getVersionedDocsPath } from '@libs/path'\n\nexport const title = 'Navbar Template'\nexport const extra_css = ['navbars.css']\n---\n\n<main>\n  <nav class=\"navbar navbar-dark bg-dark\" aria-label=\"First navbar example\">\n    <div class=\"container-fluid\">\n      <a class=\"navbar-brand\" href=\"#\">Never expand</a>\n      <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbarsExample01\" aria-controls=\"navbarsExample01\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n        <span class=\"navbar-toggler-icon\"></span>\n      </button>\n\n      <div class=\"collapse navbar-collapse\" id=\"navbarsExample01\">\n        <ul class=\"navbar-nav me-auto mb-2\">\n          <li class=\"nav-item\">\n            <a class=\"nav-link active\" aria-current=\"page\" href=\"#\">Home</a>\n          </li>\n          <li class=\"nav-item\">\n            <a class=\"nav-link\" href=\"#\">Link</a>\n          </li>\n          <li class=\"nav-item\">\n            <a class=\"nav-link disabled\" aria-disabled=\"true\">Disabled</a>\n          </li>\n          <li class=\"nav-item dropdown\">\n            <a class=\"nav-link dropdown-toggle\" href=\"#\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">Dropdown</a>\n            <ul class=\"dropdown-menu\">\n              <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n              <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n              <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n            </ul>\n          </li>\n        </ul>\n        <form role=\"search\">\n          <input class=\"form-control\" type=\"search\" placeholder=\"Search\" aria-label=\"Search\">\n        </form>\n      </div>\n    </div>\n  </nav>\n\n  <nav class=\"navbar navbar-expand navbar-dark bg-dark\" aria-label=\"Second navbar example\">\n    <div class=\"container-fluid\">\n      <a class=\"navbar-brand\" href=\"#\">Always expand</a>\n      <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbarsExample02\" aria-controls=\"navbarsExample02\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n        <span class=\"navbar-toggler-icon\"></span>\n      </button>\n\n      <div class=\"collapse navbar-collapse\" id=\"navbarsExample02\">\n        <ul class=\"navbar-nav me-auto\">\n          <li class=\"nav-item\">\n            <a class=\"nav-link active\" aria-current=\"page\" href=\"#\">Home</a>\n          </li>\n          <li class=\"nav-item\">\n            <a class=\"nav-link\" href=\"#\">Link</a>\n          </li>\n        </ul>\n        <form role=\"search\">\n          <input class=\"form-control\" type=\"search\" placeholder=\"Search\" aria-label=\"Search\">\n        </form>\n      </div>\n    </div>\n  </nav>\n\n  <nav class=\"navbar navbar-expand-sm navbar-dark bg-dark\" aria-label=\"Third navbar example\">\n    <div class=\"container-fluid\">\n      <a class=\"navbar-brand\" href=\"#\">Expand at sm</a>\n      <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbarsExample03\" aria-controls=\"navbarsExample03\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n        <span class=\"navbar-toggler-icon\"></span>\n      </button>\n\n      <div class=\"collapse navbar-collapse\" id=\"navbarsExample03\">\n        <ul class=\"navbar-nav me-auto mb-2 mb-sm-0\">\n          <li class=\"nav-item\">\n            <a class=\"nav-link active\" aria-current=\"page\" href=\"#\">Home</a>\n          </li>\n          <li class=\"nav-item\">\n            <a class=\"nav-link\" href=\"#\">Link</a>\n          </li>\n          <li class=\"nav-item\">\n            <a class=\"nav-link disabled\" aria-disabled=\"true\">Disabled</a>\n          </li>\n          <li class=\"nav-item dropdown\">\n            <a class=\"nav-link dropdown-toggle\" href=\"#\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">Dropdown</a>\n            <ul class=\"dropdown-menu\">\n              <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n              <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n              <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n            </ul>\n          </li>\n        </ul>\n        <form role=\"search\">\n          <input class=\"form-control\" type=\"search\" placeholder=\"Search\" aria-label=\"Search\">\n        </form>\n      </div>\n    </div>\n  </nav>\n\n  <nav class=\"navbar navbar-expand-md navbar-dark bg-dark\" aria-label=\"Fourth navbar example\">\n    <div class=\"container-fluid\">\n      <a class=\"navbar-brand\" href=\"#\">Expand at md</a>\n      <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbarsExample04\" aria-controls=\"navbarsExample04\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n        <span class=\"navbar-toggler-icon\"></span>\n      </button>\n\n      <div class=\"collapse navbar-collapse\" id=\"navbarsExample04\">\n        <ul class=\"navbar-nav me-auto mb-2 mb-md-0\">\n          <li class=\"nav-item\">\n            <a class=\"nav-link active\" aria-current=\"page\" href=\"#\">Home</a>\n          </li>\n          <li class=\"nav-item\">\n            <a class=\"nav-link\" href=\"#\">Link</a>\n          </li>\n          <li class=\"nav-item\">\n            <a class=\"nav-link disabled\" aria-disabled=\"true\">Disabled</a>\n          </li>\n          <li class=\"nav-item dropdown\">\n            <a class=\"nav-link dropdown-toggle\" href=\"#\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">Dropdown</a>\n            <ul class=\"dropdown-menu\">\n              <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n              <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n              <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n            </ul>\n          </li>\n        </ul>\n        <form role=\"search\">\n          <input class=\"form-control\" type=\"search\" placeholder=\"Search\" aria-label=\"Search\">\n        </form>\n      </div>\n    </div>\n  </nav>\n\n  <nav class=\"navbar navbar-expand-lg navbar-dark bg-dark\" aria-label=\"Fifth navbar example\">\n    <div class=\"container-fluid\">\n      <a class=\"navbar-brand\" href=\"#\">Expand at lg</a>\n      <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbarsExample05\" aria-controls=\"navbarsExample05\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n        <span class=\"navbar-toggler-icon\"></span>\n      </button>\n\n      <div class=\"collapse navbar-collapse\" id=\"navbarsExample05\">\n        <ul class=\"navbar-nav me-auto mb-2 mb-lg-0\">\n          <li class=\"nav-item\">\n            <a class=\"nav-link active\" aria-current=\"page\" href=\"#\">Home</a>\n          </li>\n          <li class=\"nav-item\">\n            <a class=\"nav-link\" href=\"#\">Link</a>\n          </li>\n          <li class=\"nav-item\">\n            <a class=\"nav-link disabled\" aria-disabled=\"true\">Disabled</a>\n          </li>\n          <li class=\"nav-item dropdown\">\n            <a class=\"nav-link dropdown-toggle\" href=\"#\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">Dropdown</a>\n            <ul class=\"dropdown-menu\">\n              <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n              <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n              <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n            </ul>\n          </li>\n        </ul>\n        <form role=\"search\">\n          <input class=\"form-control\" type=\"search\" placeholder=\"Search\" aria-label=\"Search\">\n        </form>\n      </div>\n    </div>\n  </nav>\n\n  <nav class=\"navbar navbar-expand-xl navbar-dark bg-dark\" aria-label=\"Sixth navbar example\">\n    <div class=\"container-fluid\">\n      <a class=\"navbar-brand\" href=\"#\">Expand at xl</a>\n      <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbarsExample06\" aria-controls=\"navbarsExample06\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n        <span class=\"navbar-toggler-icon\"></span>\n      </button>\n\n      <div class=\"collapse navbar-collapse\" id=\"navbarsExample06\">\n        <ul class=\"navbar-nav me-auto mb-2 mb-xl-0\">\n          <li class=\"nav-item\">\n            <a class=\"nav-link active\" aria-current=\"page\" href=\"#\">Home</a>\n          </li>\n          <li class=\"nav-item\">\n            <a class=\"nav-link\" href=\"#\">Link</a>\n          </li>\n          <li class=\"nav-item\">\n            <a class=\"nav-link disabled\" aria-disabled=\"true\">Disabled</a>\n          </li>\n          <li class=\"nav-item dropdown\">\n            <a class=\"nav-link dropdown-toggle\" href=\"#\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">Dropdown</a>\n            <ul class=\"dropdown-menu\">\n              <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n              <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n              <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n            </ul>\n          </li>\n        </ul>\n        <form role=\"search\">\n          <input class=\"form-control\" type=\"search\" placeholder=\"Search\" aria-label=\"Search\">\n        </form>\n      </div>\n    </div>\n  </nav>\n\n  <nav class=\"navbar navbar-expand-xxl navbar-dark bg-dark\" aria-label=\"Seventh navbar example\">\n    <div class=\"container-fluid\">\n      <a class=\"navbar-brand\" href=\"#\">Expand at xxl</a>\n      <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbarsExampleXxl\" aria-controls=\"navbarsExampleXxl\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n        <span class=\"navbar-toggler-icon\"></span>\n      </button>\n\n      <div class=\"collapse navbar-collapse\" id=\"navbarsExampleXxl\">\n        <ul class=\"navbar-nav me-auto mb-2 mb-xl-0\">\n          <li class=\"nav-item\">\n            <a class=\"nav-link active\" aria-current=\"page\" href=\"#\">Home</a>\n          </li>\n          <li class=\"nav-item\">\n            <a class=\"nav-link\" href=\"#\">Link</a>\n          </li>\n          <li class=\"nav-item\">\n            <a class=\"nav-link disabled\" aria-disabled=\"true\">Disabled</a>\n          </li>\n          <li class=\"nav-item dropdown\">\n            <a class=\"nav-link dropdown-toggle\" href=\"#\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">Dropdown</a>\n            <ul class=\"dropdown-menu\">\n              <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n              <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n              <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n            </ul>\n          </li>\n        </ul>\n        <form role=\"search\">\n          <input class=\"form-control\" type=\"search\" placeholder=\"Search\" aria-label=\"Search\">\n        </form>\n      </div>\n    </div>\n  </nav>\n\n  <nav class=\"navbar navbar-expand-lg navbar-dark bg-dark\" aria-label=\"Eighth navbar example\">\n    <div class=\"container\">\n      <a class=\"navbar-brand\" href=\"#\">Container</a>\n      <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbarsExample07\" aria-controls=\"navbarsExample07\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n        <span class=\"navbar-toggler-icon\"></span>\n      </button>\n\n      <div class=\"collapse navbar-collapse\" id=\"navbarsExample07\">\n        <ul class=\"navbar-nav me-auto mb-2 mb-lg-0\">\n          <li class=\"nav-item\">\n            <a class=\"nav-link active\" aria-current=\"page\" href=\"#\">Home</a>\n          </li>\n          <li class=\"nav-item\">\n            <a class=\"nav-link\" href=\"#\">Link</a>\n          </li>\n          <li class=\"nav-item\">\n            <a class=\"nav-link disabled\" aria-disabled=\"true\">Disabled</a>\n          </li>\n          <li class=\"nav-item dropdown\">\n            <a class=\"nav-link dropdown-toggle\" href=\"#\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">Dropdown</a>\n            <ul class=\"dropdown-menu\">\n              <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n              <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n              <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n            </ul>\n          </li>\n        </ul>\n        <form role=\"search\">\n          <input class=\"form-control\" type=\"search\" placeholder=\"Search\" aria-label=\"Search\">\n        </form>\n      </div>\n    </div>\n  </nav>\n\n  <nav class=\"navbar navbar-expand-lg navbar-dark bg-dark\" aria-label=\"Ninth navbar example\">\n    <div class=\"container-xl\">\n      <a class=\"navbar-brand\" href=\"#\">Container XL</a>\n      <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbarsExample07XL\" aria-controls=\"navbarsExample07XL\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n        <span class=\"navbar-toggler-icon\"></span>\n      </button>\n\n      <div class=\"collapse navbar-collapse\" id=\"navbarsExample07XL\">\n        <ul class=\"navbar-nav me-auto mb-2 mb-lg-0\">\n          <li class=\"nav-item\">\n            <a class=\"nav-link active\" aria-current=\"page\" href=\"#\">Home</a>\n          </li>\n          <li class=\"nav-item\">\n            <a class=\"nav-link\" href=\"#\">Link</a>\n          </li>\n          <li class=\"nav-item\">\n            <a class=\"nav-link disabled\" aria-disabled=\"true\">Disabled</a>\n          </li>\n          <li class=\"nav-item dropdown\">\n            <a class=\"nav-link dropdown-toggle\" href=\"#\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">Dropdown</a>\n            <ul class=\"dropdown-menu\">\n              <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n              <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n              <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n            </ul>\n          </li>\n        </ul>\n        <form role=\"search\">\n          <input class=\"form-control\" type=\"search\" placeholder=\"Search\" aria-label=\"Search\">\n        </form>\n      </div>\n    </div>\n  </nav>\n\n  <div class=\"container-xl mb-4\">\n    <p>Matching .container-xl...</p>\n  </div>\n\n  <nav class=\"navbar navbar-expand-lg navbar-dark bg-dark\" aria-label=\"Tenth navbar example\">\n    <div class=\"container-fluid\">\n      <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbarsExample08\" aria-controls=\"navbarsExample08\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n        <span class=\"navbar-toggler-icon\"></span>\n      </button>\n\n      <div class=\"collapse navbar-collapse justify-content-md-center\" id=\"navbarsExample08\">\n        <ul class=\"navbar-nav\">\n          <li class=\"nav-item\">\n            <a class=\"nav-link active\" aria-current=\"page\" href=\"#\">Centered nav only</a>\n          </li>\n          <li class=\"nav-item\">\n            <a class=\"nav-link\" href=\"#\">Link</a>\n          </li>\n          <li class=\"nav-item\">\n            <a class=\"nav-link disabled\" aria-disabled=\"true\">Disabled</a>\n          </li>\n          <li class=\"nav-item dropdown\">\n            <a class=\"nav-link dropdown-toggle\" href=\"#\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">Dropdown</a>\n            <ul class=\"dropdown-menu\">\n              <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n              <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n              <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n            </ul>\n          </li>\n        </ul>\n      </div>\n    </div>\n  </nav>\n\n  <div class=\"container\">\n    <nav class=\"navbar navbar-expand-lg bg-body-tertiary rounded\" aria-label=\"Eleventh navbar example\">\n      <div class=\"container-fluid\">\n        <a class=\"navbar-brand\" href=\"#\">Navbar</a>\n        <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbarsExample09\" aria-controls=\"navbarsExample09\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n          <span class=\"navbar-toggler-icon\"></span>\n        </button>\n\n        <div class=\"collapse navbar-collapse\" id=\"navbarsExample09\">\n          <ul class=\"navbar-nav me-auto mb-2 mb-lg-0\">\n            <li class=\"nav-item\">\n              <a class=\"nav-link active\" aria-current=\"page\" href=\"#\">Home</a>\n            </li>\n            <li class=\"nav-item\">\n              <a class=\"nav-link\" href=\"#\">Link</a>\n            </li>\n            <li class=\"nav-item\">\n              <a class=\"nav-link disabled\" aria-disabled=\"true\">Disabled</a>\n            </li>\n            <li class=\"nav-item dropdown\">\n              <a class=\"nav-link dropdown-toggle\" href=\"#\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">Dropdown</a>\n              <ul class=\"dropdown-menu\">\n                <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n                <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n                <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n              </ul>\n            </li>\n          </ul>\n          <form role=\"search\">\n            <input class=\"form-control\" type=\"search\" placeholder=\"Search\" aria-label=\"Search\">\n          </form>\n        </div>\n      </div>\n    </nav>\n\n    <nav class=\"navbar navbar-expand-lg bg-body-tertiary rounded\" aria-label=\"Twelfth navbar example\">\n      <div class=\"container-fluid\">\n        <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbarsExample10\" aria-controls=\"navbarsExample10\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n          <span class=\"navbar-toggler-icon\"></span>\n        </button>\n\n        <div class=\"collapse navbar-collapse justify-content-md-center\" id=\"navbarsExample10\">\n          <ul class=\"navbar-nav\">\n            <li class=\"nav-item\">\n              <a class=\"nav-link active\" aria-current=\"page\" href=\"#\">Centered nav only</a>\n            </li>\n            <li class=\"nav-item\">\n              <a class=\"nav-link\" href=\"#\">Link</a>\n            </li>\n            <li class=\"nav-item\">\n              <a class=\"nav-link disabled\" aria-disabled=\"true\">Disabled</a>\n            </li>\n            <li class=\"nav-item dropdown\">\n              <a class=\"nav-link dropdown-toggle\" href=\"#\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">Dropdown</a>\n              <ul class=\"dropdown-menu\">\n                <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n                <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n                <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n              </ul>\n            </li>\n          </ul>\n        </div>\n      </div>\n    </nav>\n\n    <nav class=\"navbar navbar-expand-lg bg-body-tertiary rounded\" aria-label=\"Thirteenth navbar example\">\n      <div class=\"container-fluid\">\n        <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbarsExample11\" aria-controls=\"navbarsExample11\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n          <span class=\"navbar-toggler-icon\"></span>\n        </button>\n\n        <div class=\"collapse navbar-collapse d-lg-flex\" id=\"navbarsExample11\">\n          <a class=\"navbar-brand col-lg-3 me-0\" href=\"#\">Centered nav</a>\n          <ul class=\"navbar-nav col-lg-6 justify-content-lg-center\">\n            <li class=\"nav-item\">\n              <a class=\"nav-link active\" aria-current=\"page\" href=\"#\">Home</a>\n            </li>\n            <li class=\"nav-item\">\n              <a class=\"nav-link\" href=\"#\">Link</a>\n            </li>\n            <li class=\"nav-item\">\n              <a class=\"nav-link disabled\" aria-disabled=\"true\">Disabled</a>\n            </li>\n            <li class=\"nav-item dropdown\">\n              <a class=\"nav-link dropdown-toggle\" href=\"#\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">Dropdown</a>\n              <ul class=\"dropdown-menu\">\n                <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n                <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n                <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n              </ul>\n            </li>\n          </ul>\n          <div class=\"d-lg-flex col-lg-3 justify-content-lg-end\">\n            <button class=\"btn btn-primary\">Button</button>\n          </div>\n        </div>\n      </div>\n    </nav>\n\n    <div>\n      <div class=\"bg-body-tertiary p-5 rounded\">\n        <div class=\"col-sm-8 mx-auto\">\n          <h1>Navbar examples</h1>\n          <p>This example is a quick exercise to illustrate how the navbar and its contents work. Some navbars extend the width of the viewport, others are confined within a <code>.container</code>. For positioning of navbars, checkout the <a href={getVersionedDocsPath('/examples/navbar-static/')}>top</a> and <a href={getVersionedDocsPath('/examples/navbar-fixed/')}>fixed top</a> examples.</p>\n          <p>At the smallest breakpoint, the collapse plugin is used to hide the links and show a menu button to toggle the collapsed content.</p>\n          <p>\n            <a class=\"btn btn-primary\" href={getVersionedDocsPath('/components/navbar')} role=\"button\">View navbar docs &raquo;</a>\n          </p>\n        </div>\n      </div>\n    </div>\n  </div>\n</main>\n"
  },
  {
    "path": "site/src/assets/examples/navbars/navbars.css",
    "content": "body {\n  padding-bottom: 20px;\n}\n\n.navbar {\n  margin-bottom: 20px;\n}\n"
  },
  {
    "path": "site/src/assets/examples/navbars-offcanvas/index.astro",
    "content": "---\nimport { getVersionedDocsPath } from '@libs/path'\n\nexport const title = 'Navbar Template'\nexport const extra_css = ['navbars-offcanvas.css']\n---\n\n<main>\n  <nav class=\"navbar navbar-dark bg-dark\" aria-label=\"Dark offcanvas navbar\">\n    <div class=\"container-fluid\">\n      <a class=\"navbar-brand\" href=\"#\">Dark offcanvas navbar</a>\n      <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"offcanvas\" data-bs-target=\"#offcanvasNavbarDark\" aria-controls=\"offcanvasNavbarDark\" aria-label=\"Toggle navigation\">\n        <span class=\"navbar-toggler-icon\"></span>\n      </button>\n      <div class=\"offcanvas offcanvas-end text-bg-dark\" tabindex=\"-1\" id=\"offcanvasNavbarDark\" aria-labelledby=\"offcanvasNavbarDarkLabel\">\n        <div class=\"offcanvas-header\">\n          <h5 class=\"offcanvas-title\" id=\"offcanvasNavbarDarkLabel\">Offcanvas</h5>\n          <button type=\"button\" class=\"btn-close btn-close-white\" data-bs-dismiss=\"offcanvas\" aria-label=\"Close\"></button>\n        </div>\n        <div class=\"offcanvas-body\">\n          <ul class=\"navbar-nav justify-content-end flex-grow-1 pe-3\">\n            <li class=\"nav-item\">\n              <a class=\"nav-link active\" aria-current=\"page\" href=\"#\">Home</a>\n            </li>\n            <li class=\"nav-item\">\n              <a class=\"nav-link\" href=\"#\">Link</a>\n            </li>\n            <li class=\"nav-item dropdown\">\n              <a class=\"nav-link dropdown-toggle\" href=\"#\" role=\"button\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n                Dropdown\n              </a>\n              <ul class=\"dropdown-menu\">\n                <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n                <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n                <li>\n                  <hr class=\"dropdown-divider\">\n                </li>\n                <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n              </ul>\n            </li>\n          </ul>\n          <form class=\"d-flex mt-3\" role=\"search\">\n            <input class=\"form-control me-2\" type=\"search\" placeholder=\"Search\" aria-label=\"Search\">\n            <button class=\"btn btn-outline-success\" type=\"submit\">Search</button>\n          </form>\n        </div>\n      </div>\n    </div>\n  </nav>\n\n  <nav class=\"navbar bg-body-tertiary\" aria-label=\"Light offcanvas navbar\">\n    <div class=\"container-fluid\">\n      <a class=\"navbar-brand\" href=\"#\">Light offcanvas navbar</a>\n      <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"offcanvas\" data-bs-target=\"#offcanvasNavbarLight\" aria-controls=\"offcanvasNavbarLight\" aria-label=\"Toggle navigation\">\n        <span class=\"navbar-toggler-icon\"></span>\n      </button>\n      <div class=\"offcanvas offcanvas-end\" tabindex=\"-1\" id=\"offcanvasNavbarLight\" aria-labelledby=\"offcanvasNavbarLightLabel\">\n        <div class=\"offcanvas-header\">\n          <h5 class=\"offcanvas-title\" id=\"offcanvasNavbarLightLabel\">Offcanvas</h5>\n          <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"offcanvas\" aria-label=\"Close\"></button>\n        </div>\n        <div class=\"offcanvas-body\">\n          <ul class=\"navbar-nav justify-content-end flex-grow-1 pe-3\">\n            <li class=\"nav-item\">\n              <a class=\"nav-link active\" aria-current=\"page\" href=\"#\">Home</a>\n            </li>\n            <li class=\"nav-item\">\n              <a class=\"nav-link\" href=\"#\">Link</a>\n            </li>\n            <li class=\"nav-item dropdown\">\n              <a class=\"nav-link dropdown-toggle\" href=\"#\" role=\"button\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n                Dropdown\n              </a>\n              <ul class=\"dropdown-menu\">\n                <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n                <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n                <li>\n                  <hr class=\"dropdown-divider\">\n                </li>\n                <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n              </ul>\n            </li>\n          </ul>\n          <form class=\"d-flex mt-3\" role=\"search\">\n            <input class=\"form-control me-2\" type=\"search\" placeholder=\"Search\" aria-label=\"Search\">\n            <button class=\"btn btn-outline-success\" type=\"submit\">Search</button>\n          </form>\n        </div>\n      </div>\n    </div>\n  </nav>\n\n  <nav class=\"navbar navbar-expand-lg navbar-dark bg-dark\" aria-label=\"Offcanvas navbar large\">\n    <div class=\"container-fluid\">\n      <a class=\"navbar-brand\" href=\"#\">Responsive offcanvas navbar</a>\n      <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"offcanvas\" data-bs-target=\"#offcanvasNavbar2\" aria-controls=\"offcanvasNavbar2\" aria-label=\"Toggle navigation\">\n        <span class=\"navbar-toggler-icon\"></span>\n      </button>\n      <div class=\"offcanvas offcanvas-end text-bg-dark\" tabindex=\"-1\" id=\"offcanvasNavbar2\" aria-labelledby=\"offcanvasNavbar2Label\">\n        <div class=\"offcanvas-header\">\n          <h5 class=\"offcanvas-title\" id=\"offcanvasNavbar2Label\">Offcanvas</h5>\n          <button type=\"button\" class=\"btn-close btn-close-white\" data-bs-dismiss=\"offcanvas\" aria-label=\"Close\"></button>\n        </div>\n        <div class=\"offcanvas-body\">\n          <ul class=\"navbar-nav justify-content-end flex-grow-1 pe-3\">\n            <li class=\"nav-item\">\n              <a class=\"nav-link active\" aria-current=\"page\" href=\"#\">Home</a>\n            </li>\n            <li class=\"nav-item\">\n              <a class=\"nav-link\" href=\"#\">Link</a>\n            </li>\n            <li class=\"nav-item dropdown\">\n              <a class=\"nav-link dropdown-toggle\" href=\"#\" role=\"button\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n                Dropdown\n              </a>\n              <ul class=\"dropdown-menu\">\n                <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n                <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n                <li>\n                  <hr class=\"dropdown-divider\">\n                </li>\n                <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n              </ul>\n            </li>\n          </ul>\n          <form class=\"d-flex mt-3 mt-lg-0\" role=\"search\">\n            <input class=\"form-control me-2\" type=\"search\" placeholder=\"Search\" aria-label=\"Search\">\n            <button class=\"btn btn-outline-success\" type=\"submit\">Search</button>\n          </form>\n        </div>\n      </div>\n    </div>\n  </nav>\n\n  <div class=\"container my-5\">\n    <div class=\"bg-body-tertiary p-5 rounded\">\n      <div class=\"col-sm-8 py-5 mx-auto\">\n        <h1 class=\"display-5 fw-normal\">Navbar with offcanvas examples</h1>\n        <p class=\"fs-5\">This example shows how responsive offcanvas menus work within the navbar. For positioning of navbars, checkout the <a href={getVersionedDocsPath('/examples/navbar-static/')}>top</a> and <a href={getVersionedDocsPath('/examples/navbar-fixed/')}>fixed top</a> examples.</p>\n        <p>From the top down, you'll see a dark navbar, light navbar and a responsive navbar—each with offcanvases built in. Resize your browser window to the large breakpoint to see the toggle for the offcanvas.</p>\n        <p>\n          <a class=\"btn btn-primary\" href={getVersionedDocsPath('/components/navbar#offcanvas')} role=\"button\">Learn more about offcanvas navbars &raquo;</a>\n        </p>\n    </div>\n    </div>\n  </div>\n</main>\n"
  },
  {
    "path": "site/src/assets/examples/navbars-offcanvas/navbars-offcanvas.css",
    "content": "body {\n  padding-bottom: 20px;\n}\n\n.navbar {\n  margin-bottom: 20px;\n}\n"
  },
  {
    "path": "site/src/assets/examples/offcanvas-navbar/index.astro",
    "content": "---\nimport { getVersionedDocsPath } from '@libs/path'\n\nexport const title = 'Offcanvas navbar template'\nexport const extra_css = ['offcanvas-navbar.css']\nexport const extra_js = [{ src: 'offcanvas-navbar.js' }]\nexport const body_class = 'bg-body-tertiary'\nexport const aliases = '/docs/[[config:docs_version]]/examples/offcanvas/'\nimport Placeholder from \"@shortcodes/Placeholder.astro\"\n---\n\n<nav class=\"navbar navbar-expand-lg fixed-top navbar-dark bg-dark\" aria-label=\"Main navigation\">\n  <div class=\"container-fluid\">\n    <a class=\"navbar-brand\" href=\"#\">Offcanvas navbar</a>\n    <button class=\"navbar-toggler p-0 border-0\" type=\"button\" id=\"navbarSideCollapse\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div class=\"navbar-collapse offcanvas-collapse\" id=\"navbarsExampleDefault\">\n      <ul class=\"navbar-nav me-auto mb-2 mb-lg-0\">\n        <li class=\"nav-item\">\n          <a class=\"nav-link active\" aria-current=\"page\" href=\"#\">Dashboard</a>\n        </li>\n        <li class=\"nav-item\">\n          <a class=\"nav-link\" href=\"#\">Notifications</a>\n        </li>\n        <li class=\"nav-item\">\n          <a class=\"nav-link\" href=\"#\">Profile</a>\n        </li>\n        <li class=\"nav-item\">\n          <a class=\"nav-link\" href=\"#\">Switch account</a>\n        </li>\n        <li class=\"nav-item dropdown\">\n          <a class=\"nav-link dropdown-toggle\" href=\"#\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">Settings</a>\n          <ul class=\"dropdown-menu\">\n            <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n            <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n            <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n          </ul>\n        </li>\n      </ul>\n      <form class=\"d-flex\" role=\"search\">\n        <input class=\"form-control me-2\" type=\"search\" placeholder=\"Search\" aria-label=\"Search\">\n        <button class=\"btn btn-outline-success\" type=\"submit\">Search</button>\n      </form>\n    </div>\n  </div>\n</nav>\n\n<div class=\"nav-scroller bg-body shadow-sm\">\n  <nav class=\"nav\" aria-label=\"Secondary navigation\">\n    <a class=\"nav-link active\" aria-current=\"page\" href=\"#\">Dashboard</a>\n    <a class=\"nav-link\" href=\"#\">\n      Friends\n      <span class=\"badge text-bg-light rounded-pill align-text-bottom\">27</span>\n    </a>\n    <a class=\"nav-link\" href=\"#\">Explore</a>\n    <a class=\"nav-link\" href=\"#\">Suggestions</a>\n    <a class=\"nav-link\" href=\"#\">Link</a>\n    <a class=\"nav-link\" href=\"#\">Link</a>\n    <a class=\"nav-link\" href=\"#\">Link</a>\n    <a class=\"nav-link\" href=\"#\">Link</a>\n    <a class=\"nav-link\" href=\"#\">Link</a>\n  </nav>\n</div>\n\n<main class=\"container\">\n  <div class=\"d-flex align-items-center p-3 my-3 text-white bg-purple rounded shadow-sm\">\n    <img class=\"me-3\" src={getVersionedDocsPath('/assets/brand/bootstrap-logo-white.svg')} alt=\"\" width=\"48\" height=\"38\">\n    <div class=\"lh-1\">\n      <h1 class=\"h6 mb-0 text-white lh-1\">Bootstrap</h1>\n      <small>Since 2011</small>\n    </div>\n  </div>\n\n  <div class=\"my-3 p-3 bg-body rounded shadow-sm\">\n    <h6 class=\"border-bottom pb-2 mb-0\">Recent updates</h6>\n    <div class=\"d-flex text-body-secondary pt-3\">\n      <Placeholder width=\"32\" height=\"32\" background=\"#007bff\" color=\"#007bff\" class=\"flex-shrink-0 me-2 rounded\" />\n      <p class=\"pb-3 mb-0 small lh-sm border-bottom\">\n        <strong class=\"d-block text-gray-dark\">@username</strong>\n        Some representative placeholder content, with some information about this user. Imagine this being some sort of status update, perhaps?\n      </p>\n    </div>\n    <div class=\"d-flex text-body-secondary pt-3\">\n      <Placeholder width=\"32\" height=\"32\" background=\"#e83e8c\" color=\"#e83e8c\" class=\"flex-shrink-0 me-2 rounded\" />\n      <p class=\"pb-3 mb-0 small lh-sm border-bottom\">\n        <strong class=\"d-block text-gray-dark\">@username</strong>\n        Some more representative placeholder content, related to this other user. Another status update, perhaps.\n      </p>\n    </div>\n    <div class=\"d-flex text-body-secondary pt-3\">\n      <Placeholder width=\"32\" height=\"32\" background=\"#6f42c1\" color=\"#6f42c1\" class=\"flex-shrink-0 me-2 rounded\" />\n      <p class=\"pb-3 mb-0 small lh-sm border-bottom\">\n        <strong class=\"d-block text-gray-dark\">@username</strong>\n        This user also gets some representative placeholder content. Maybe they did something interesting, and you really want to highlight this in the recent updates.\n      </p>\n    </div>\n    <small class=\"d-block text-end mt-3\">\n      <a href=\"#\">All updates</a>\n    </small>\n  </div>\n\n  <div class=\"my-3 p-3 bg-body rounded shadow-sm\">\n    <h6 class=\"border-bottom pb-2 mb-0\">Suggestions</h6>\n    <div class=\"d-flex text-body-secondary pt-3\">\n      <Placeholder width=\"32\" height=\"32\" background=\"#007bff\" color=\"#007bff\" class=\"flex-shrink-0 me-2 rounded\" />\n      <div class=\"pb-3 mb-0 small lh-sm border-bottom w-100\">\n        <div class=\"d-flex justify-content-between\">\n          <strong class=\"text-gray-dark\">Full Name</strong>\n          <a href=\"#\">Follow</a>\n        </div>\n        <span class=\"d-block\">@username</span>\n      </div>\n    </div>\n    <div class=\"d-flex text-body-secondary pt-3\">\n      <Placeholder width=\"32\" height=\"32\" background=\"#007bff\" color=\"#007bff\" class=\"flex-shrink-0 me-2 rounded\" />\n      <div class=\"pb-3 mb-0 small lh-sm border-bottom w-100\">\n        <div class=\"d-flex justify-content-between\">\n          <strong class=\"text-gray-dark\">Full Name</strong>\n          <a href=\"#\">Follow</a>\n        </div>\n        <span class=\"d-block\">@username</span>\n      </div>\n    </div>\n    <div class=\"d-flex text-body-secondary pt-3\">\n      <Placeholder width=\"32\" height=\"32\" background=\"#007bff\" color=\"#007bff\" class=\"flex-shrink-0 me-2 rounded\" />\n      <div class=\"pb-3 mb-0 small lh-sm border-bottom w-100\">\n        <div class=\"d-flex justify-content-between\">\n          <strong class=\"text-gray-dark\">Full Name</strong>\n          <a href=\"#\">Follow</a>\n        </div>\n        <span class=\"d-block\">@username</span>\n      </div>\n    </div>\n    <small class=\"d-block text-end mt-3\">\n      <a href=\"#\">All suggestions</a>\n    </small>\n  </div>\n</main>\n"
  },
  {
    "path": "site/src/assets/examples/offcanvas-navbar/offcanvas-navbar.css",
    "content": "html,\nbody {\n  overflow-x: hidden; /* Prevent scroll on narrow devices */\n}\n\nbody {\n  padding-top: 56px;\n}\n\n@media (max-width: 991.98px) {\n  .offcanvas-collapse {\n    position: fixed;\n    top: 56px; /* Height of navbar */\n    bottom: 0;\n    left: 100%;\n    width: 100%;\n    padding-right: 1rem;\n    padding-left: 1rem;\n    overflow-y: auto;\n    visibility: hidden;\n    background-color: #343a40;\n    transition: transform .3s ease-in-out, visibility .3s ease-in-out;\n  }\n  .offcanvas-collapse.open {\n    visibility: visible;\n    transform: translateX(-100%);\n  }\n}\n\n.nav-scroller .nav {\n  color: rgba(255, 255, 255, .75);\n}\n\n.nav-scroller .nav-link {\n  padding-top: .75rem;\n  padding-bottom: .75rem;\n  font-size: .875rem;\n  color: #6c757d;\n}\n\n.nav-scroller .nav-link:hover {\n  color: #007bff;\n}\n\n.nav-scroller .active {\n  font-weight: 500;\n  color: #343a40;\n}\n\n.bg-purple {\n  background-color: #6f42c1;\n}\n"
  },
  {
    "path": "site/src/assets/examples/offcanvas-navbar/offcanvas-navbar.js",
    "content": "(() => {\n  'use strict'\n\n  document.querySelector('#navbarSideCollapse').addEventListener('click', () => {\n    document.querySelector('.offcanvas-collapse').classList.toggle('open')\n  })\n})()\n"
  },
  {
    "path": "site/src/assets/examples/pricing/index.astro",
    "content": "---\nimport { getVersionedDocsPath } from '@libs/path'\n\nexport const title = 'Pricing example'\nexport const extra_css = ['pricing.css']\n---\n\n<svg xmlns=\"http://www.w3.org/2000/svg\" class=\"d-none\">\n  <symbol id=\"check\" viewBox=\"0 0 16 16\">\n    <title>Check</title>\n    <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\"/>\n  </symbol>\n</svg>\n\n<div class=\"container py-3\">\n  <header>\n    <div class=\"d-flex flex-column flex-md-row align-items-center pb-3 mb-4 border-bottom\">\n      <a href=\"/\" class=\"d-flex align-items-center link-body-emphasis text-decoration-none\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"40\" height=\"32\" class=\"me-2\" viewBox=\"0 0 118 94\" role=\"img\"><title>Bootstrap</title><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M24.509 0c-6.733 0-11.715 5.893-11.492 12.284.214 6.14-.064 14.092-2.066 20.577C8.943 39.365 5.547 43.485 0 44.014v5.972c5.547.529 8.943 4.649 10.951 11.153 2.002 6.485 2.28 14.437 2.066 20.577C12.794 88.106 17.776 94 24.51 94H93.5c6.733 0 11.714-5.893 11.491-12.284-.214-6.14.064-14.092 2.066-20.577 2.009-6.504 5.396-10.624 10.943-11.153v-5.972c-5.547-.529-8.934-4.649-10.943-11.153-2.002-6.484-2.28-14.437-2.066-20.577C105.214 5.894 100.233 0 93.5 0H24.508zM80 57.863C80 66.663 73.436 72 62.543 72H44a2 2 0 01-2-2V24a2 2 0 012-2h18.437c9.083 0 15.044 4.92 15.044 12.474 0 5.302-4.01 10.049-9.119 10.88v.277C75.317 46.394 80 51.21 80 57.863zM60.521 28.34H49.948v14.934h8.905c6.884 0 10.68-2.772 10.68-7.727 0-4.643-3.264-7.207-9.012-7.207zM49.948 49.2v16.458H60.91c7.167 0 10.964-2.876 10.964-8.281 0-5.406-3.903-8.178-11.425-8.178H49.948z\" fill=\"currentColor\"></path></svg>\n        <span class=\"fs-4\">Pricing example</span>\n      </a>\n\n      <nav class=\"d-inline-flex mt-2 mt-md-0 ms-md-auto\">\n        <a class=\"me-3 py-2 link-body-emphasis text-decoration-none\" href=\"#\">Features</a>\n        <a class=\"me-3 py-2 link-body-emphasis text-decoration-none\" href=\"#\">Enterprise</a>\n        <a class=\"me-3 py-2 link-body-emphasis text-decoration-none\" href=\"#\">Support</a>\n        <a class=\"py-2 link-body-emphasis text-decoration-none\" href=\"#\">Pricing</a>\n      </nav>\n    </div>\n\n    <div class=\"pricing-header p-3 pb-md-4 mx-auto text-center\">\n      <h1 class=\"display-4 fw-normal text-body-emphasis\">Pricing</h1>\n      <p class=\"fs-5 text-body-secondary\">Quickly build an effective pricing table for your potential customers with this Bootstrap example. It’s built with default Bootstrap components and utilities with little customization.</p>\n    </div>\n  </header>\n\n  <main>\n    <div class=\"row row-cols-1 row-cols-md-3 mb-3 text-center\">\n      <div class=\"col\">\n        <div class=\"card mb-4 rounded-3 shadow-sm\">\n          <div class=\"card-header py-3\">\n            <h4 class=\"my-0 fw-normal\">Free</h4>\n          </div>\n          <div class=\"card-body\">\n            <h1 class=\"card-title pricing-card-title\">$0<small class=\"text-body-secondary fw-light\">/mo</small></h1>\n            <ul class=\"list-unstyled mt-3 mb-4\">\n              <li>10 users included</li>\n              <li>2 GB of storage</li>\n              <li>Email support</li>\n              <li>Help center access</li>\n            </ul>\n            <button type=\"button\" class=\"w-100 btn btn-lg btn-outline-primary\">Sign up for free</button>\n          </div>\n        </div>\n      </div>\n      <div class=\"col\">\n        <div class=\"card mb-4 rounded-3 shadow-sm\">\n          <div class=\"card-header py-3\">\n            <h4 class=\"my-0 fw-normal\">Pro</h4>\n          </div>\n          <div class=\"card-body\">\n            <h1 class=\"card-title pricing-card-title\">$15<small class=\"text-body-secondary fw-light\">/mo</small></h1>\n            <ul class=\"list-unstyled mt-3 mb-4\">\n              <li>20 users included</li>\n              <li>10 GB of storage</li>\n              <li>Priority email support</li>\n              <li>Help center access</li>\n            </ul>\n            <button type=\"button\" class=\"w-100 btn btn-lg btn-primary\">Get started</button>\n          </div>\n        </div>\n      </div>\n      <div class=\"col\">\n        <div class=\"card mb-4 rounded-3 shadow-sm border-primary\">\n          <div class=\"card-header py-3 text-bg-primary border-primary\">\n            <h4 class=\"my-0 fw-normal\">Enterprise</h4>\n          </div>\n          <div class=\"card-body\">\n            <h1 class=\"card-title pricing-card-title\">$29<small class=\"text-body-secondary fw-light\">/mo</small></h1>\n            <ul class=\"list-unstyled mt-3 mb-4\">\n              <li>30 users included</li>\n              <li>15 GB of storage</li>\n              <li>Phone and email support</li>\n              <li>Help center access</li>\n            </ul>\n            <button type=\"button\" class=\"w-100 btn btn-lg btn-primary\">Contact us</button>\n          </div>\n        </div>\n      </div>\n    </div>\n\n    <h2 class=\"display-6 text-center mb-4\">Compare plans</h2>\n\n    <div class=\"table-responsive\">\n      <table class=\"table text-center\">\n        <thead>\n          <tr>\n            <th style=\"width: 34%;\"></th>\n            <th style=\"width: 22%;\">Free</th>\n            <th style=\"width: 22%;\">Pro</th>\n            <th style=\"width: 22%;\">Enterprise</th>\n          </tr>\n        </thead>\n        <tbody>\n          <tr>\n            <th scope=\"row\" class=\"text-start\">Public</th>\n            <td><svg class=\"bi\" width=\"24\" height=\"24\" role=\"img\" aria-label=\"Included\"><use xlink:href=\"#check\"/></svg></td>\n            <td><svg class=\"bi\" width=\"24\" height=\"24\" role=\"img\" aria-label=\"Included\"><use xlink:href=\"#check\"/></svg></td>\n            <td><svg class=\"bi\" width=\"24\" height=\"24\" role=\"img\" aria-label=\"Included\"><use xlink:href=\"#check\"/></svg></td>\n          </tr>\n          <tr>\n            <th scope=\"row\" class=\"text-start\">Private</th>\n            <td></td>\n            <td><svg class=\"bi\" width=\"24\" height=\"24\" role=\"img\" aria-label=\"Included\"><use xlink:href=\"#check\"/></svg></td>\n            <td><svg class=\"bi\" width=\"24\" height=\"24\" role=\"img\" aria-label=\"Included\"><use xlink:href=\"#check\"/></svg></td>\n          </tr>\n        </tbody>\n\n        <tbody>\n          <tr>\n            <th scope=\"row\" class=\"text-start\">Permissions</th>\n            <td><svg class=\"bi\" width=\"24\" height=\"24\" role=\"img\" aria-label=\"Included\"><use xlink:href=\"#check\"/></svg></td>\n            <td><svg class=\"bi\" width=\"24\" height=\"24\" role=\"img\" aria-label=\"Included\"><use xlink:href=\"#check\"/></svg></td>\n            <td><svg class=\"bi\" width=\"24\" height=\"24\" role=\"img\" aria-label=\"Included\"><use xlink:href=\"#check\"/></svg></td>\n          </tr>\n          <tr>\n            <th scope=\"row\" class=\"text-start\">Sharing</th>\n            <td></td>\n            <td><svg class=\"bi\" width=\"24\" height=\"24\" role=\"img\" aria-label=\"Included\"><use xlink:href=\"#check\"/></svg></td>\n            <td><svg class=\"bi\" width=\"24\" height=\"24\" role=\"img\" aria-label=\"Included\"><use xlink:href=\"#check\"/></svg></td>\n          </tr>\n          <tr>\n            <th scope=\"row\" class=\"text-start\">Unlimited members</th>\n            <td></td>\n            <td><svg class=\"bi\" width=\"24\" height=\"24\" role=\"img\" aria-label=\"Included\"><use xlink:href=\"#check\"/></svg></td>\n            <td><svg class=\"bi\" width=\"24\" height=\"24\" role=\"img\" aria-label=\"Included\"><use xlink:href=\"#check\"/></svg></td>\n          </tr>\n          <tr>\n            <th scope=\"row\" class=\"text-start\">Extra security</th>\n            <td></td>\n            <td></td>\n            <td><svg class=\"bi\" width=\"24\" height=\"24\" role=\"img\" aria-label=\"Included\"><use xlink:href=\"#check\"/></svg></td>\n          </tr>\n        </tbody>\n      </table>\n    </div>\n  </main>\n\n  <footer class=\"pt-4 my-md-5 pt-md-5 border-top\">\n    <div class=\"row\">\n      <div class=\"col-12 col-md\">\n        <img class=\"mb-2\" src={getVersionedDocsPath('/assets/brand/bootstrap-logo.svg')} alt=\"\" width=\"24\" height=\"19\">\n        <small class=\"d-block mb-3 text-body-secondary\">&copy; 2017–{new Date().getFullYear()}</small>\n      </div>\n      <div class=\"col-6 col-md\">\n        <h5>Features</h5>\n        <ul class=\"list-unstyled text-small\">\n          <li class=\"mb-1\"><a class=\"link-secondary text-decoration-none\" href=\"#\">Cool stuff</a></li>\n          <li class=\"mb-1\"><a class=\"link-secondary text-decoration-none\" href=\"#\">Random feature</a></li>\n          <li class=\"mb-1\"><a class=\"link-secondary text-decoration-none\" href=\"#\">Team feature</a></li>\n          <li class=\"mb-1\"><a class=\"link-secondary text-decoration-none\" href=\"#\">Stuff for developers</a></li>\n          <li class=\"mb-1\"><a class=\"link-secondary text-decoration-none\" href=\"#\">Another one</a></li>\n          <li class=\"mb-1\"><a class=\"link-secondary text-decoration-none\" href=\"#\">Last time</a></li>\n        </ul>\n      </div>\n      <div class=\"col-6 col-md\">\n        <h5>Resources</h5>\n        <ul class=\"list-unstyled text-small\">\n          <li class=\"mb-1\"><a class=\"link-secondary text-decoration-none\" href=\"#\">Resource</a></li>\n          <li class=\"mb-1\"><a class=\"link-secondary text-decoration-none\" href=\"#\">Resource name</a></li>\n          <li class=\"mb-1\"><a class=\"link-secondary text-decoration-none\" href=\"#\">Another resource</a></li>\n          <li class=\"mb-1\"><a class=\"link-secondary text-decoration-none\" href=\"#\">Final resource</a></li>\n        </ul>\n      </div>\n      <div class=\"col-6 col-md\">\n        <h5>About</h5>\n        <ul class=\"list-unstyled text-small\">\n          <li class=\"mb-1\"><a class=\"link-secondary text-decoration-none\" href=\"#\">Team</a></li>\n          <li class=\"mb-1\"><a class=\"link-secondary text-decoration-none\" href=\"#\">Locations</a></li>\n          <li class=\"mb-1\"><a class=\"link-secondary text-decoration-none\" href=\"#\">Privacy</a></li>\n          <li class=\"mb-1\"><a class=\"link-secondary text-decoration-none\" href=\"#\">Terms</a></li>\n        </ul>\n      </div>\n    </div>\n  </footer>\n</div>\n"
  },
  {
    "path": "site/src/assets/examples/pricing/pricing.css",
    "content": "body {\n  background-image: linear-gradient(180deg, var(--bs-secondary-bg), var(--bs-body-bg) 100px, var(--bs-body-bg));\n}\n\n.container {\n  max-width: 960px;\n}\n\n.pricing-header {\n  max-width: 700px;\n}\n"
  },
  {
    "path": "site/src/assets/examples/product/index.astro",
    "content": "---\nexport const title = 'Product example'\nexport const extra_css = ['product.css']\n---\n\n<svg xmlns=\"http://www.w3.org/2000/svg\" class=\"d-none\">\n  <symbol id=\"aperture\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" viewBox=\"0 0 24 24\">\n    <circle cx=\"12\" cy=\"12\" r=\"10\"/>\n    <path d=\"M14.31 8l5.74 9.94M9.69 8h11.48M7.38 12l5.74-9.94M9.69 16L3.95 6.06M14.31 16H2.83m13.79-4l-5.74 9.94\"/>\n  </symbol>\n  <symbol id=\"cart\" viewBox=\"0 0 16 16\">\n    <path d=\"M0 1.5A.5.5 0 0 1 .5 1H2a.5.5 0 0 1 .485.379L2.89 3H14.5a.5.5 0 0 1 .49.598l-1 5a.5.5 0 0 1-.465.401l-9.397.472L4.415 11H13a.5.5 0 0 1 0 1H4a.5.5 0 0 1-.491-.408L2.01 3.607 1.61 2H.5a.5.5 0 0 1-.5-.5zM3.102 4l.84 4.479 9.144-.459L13.89 4H3.102zM5 12a2 2 0 1 0 0 4 2 2 0 0 0 0-4zm7 0a2 2 0 1 0 0 4 2 2 0 0 0 0-4zm-7 1a1 1 0 1 1 0 2 1 1 0 0 1 0-2zm7 0a1 1 0 1 1 0 2 1 1 0 0 1 0-2z\"/>\n  </symbol>\n  <symbol id=\"chevron-right\" viewBox=\"0 0 16 16\">\n    <path fill-rule=\"evenodd\" d=\"M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z\"/>\n  </symbol>\n</svg>\n\n<nav class=\"navbar navbar-expand-md bg-dark sticky-top border-bottom\" data-bs-theme=\"dark\">\n  <div class=\"container\">\n    <a class=\"navbar-brand d-md-none\" href=\"#\">\n      <svg class=\"bi\" width=\"24\" height=\"24\" aria-hidden=\"true\"><use xlink:href=\"#aperture\"/></svg>\n      Aperture\n    </a>\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"offcanvas\" data-bs-target=\"#offcanvas\" aria-controls=\"offcanvas\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n    <div class=\"offcanvas offcanvas-end\" tabindex=\"-1\" id=\"offcanvas\" aria-labelledby=\"offcanvasLabel\">\n      <div class=\"offcanvas-header\">\n        <h5 class=\"offcanvas-title\" id=\"offcanvasLabel\">Aperture</h5>\n        <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"offcanvas\" aria-label=\"Close\"></button>\n      </div>\n      <div class=\"offcanvas-body\">\n        <ul class=\"navbar-nav flex-grow-1 justify-content-between\">\n          <li class=\"nav-item\"><a class=\"nav-link\" href=\"#\" aria-label=\"Aperture\">\n            <svg class=\"bi\" width=\"24\" height=\"24\" aria-hidden=\"true\"><use xlink:href=\"#aperture\"/></svg>\n          </a></li>\n          <li class=\"nav-item\"><a class=\"nav-link\" href=\"#\">Tour</a></li>\n          <li class=\"nav-item\"><a class=\"nav-link\" href=\"#\">Product</a></li>\n          <li class=\"nav-item\"><a class=\"nav-link\" href=\"#\">Features</a></li>\n          <li class=\"nav-item\"><a class=\"nav-link\" href=\"#\">Enterprise</a></li>\n          <li class=\"nav-item\"><a class=\"nav-link\" href=\"#\">Support</a></li>\n          <li class=\"nav-item\"><a class=\"nav-link\" href=\"#\">Pricing</a></li>\n          <li class=\"nav-item\"><a class=\"nav-link\" href=\"#\" aria-label=\"Cart\">\n            <svg class=\"bi\" width=\"24\" height=\"24\" aria-hidden=\"true\"><use xlink:href=\"#cart\"/></svg>\n          </a></li>\n        </ul>\n      </div>\n    </div>\n  </div>\n</nav>\n\n<main>\n  <div class=\"position-relative overflow-hidden p-3 p-md-5 m-md-3 text-center bg-body-tertiary\">\n    <div class=\"col-md-6 p-lg-5 mx-auto my-5\">\n      <h1 class=\"display-3 fw-bold\">Designed for engineers</h1>\n      <h3 class=\"fw-normal text-muted mb-3\">Build anything you want with Aperture</h3>\n      <div class=\"d-flex gap-3 justify-content-center lead fw-normal\">\n        <a class=\"icon-link\" href=\"#\">\n          Learn more\n          <svg class=\"bi\" aria-hidden=\"true\"><use xlink:href=\"#chevron-right\"/></svg>\n        </a>\n        <a class=\"icon-link\" href=\"#\">\n          Buy\n          <svg class=\"bi\" aria-hidden=\"true\"><use xlink:href=\"#chevron-right\"/></svg>\n        </a>\n      </div>\n    </div>\n    <div class=\"product-device shadow-sm d-none d-md-block\"></div>\n    <div class=\"product-device product-device-2 shadow-sm d-none d-md-block\"></div>\n  </div>\n\n  <div class=\"d-md-flex flex-md-equal w-100 my-md-3 ps-md-3\">\n    <div class=\"text-bg-dark me-md-3 pt-3 px-3 pt-md-5 px-md-5 text-center overflow-hidden\">\n      <div class=\"my-3 py-3\">\n        <h2 class=\"display-5\">Another headline</h2>\n        <p class=\"lead\">And an even wittier subheading.</p>\n      </div>\n      <div class=\"bg-body-tertiary shadow-sm mx-auto\" style=\"width: 80%; height: 300px; border-radius: 21px 21px 0 0;\"></div>\n    </div>\n    <div class=\"bg-body-tertiary me-md-3 pt-3 px-3 pt-md-5 px-md-5 text-center overflow-hidden\">\n      <div class=\"my-3 p-3\">\n        <h2 class=\"display-5\">Another headline</h2>\n        <p class=\"lead\">And an even wittier subheading.</p>\n      </div>\n      <div class=\"bg-dark shadow-sm mx-auto\" style=\"width: 80%; height: 300px; border-radius: 21px 21px 0 0;\"></div>\n    </div>\n  </div>\n\n  <div class=\"d-md-flex flex-md-equal w-100 my-md-3 ps-md-3\">\n    <div class=\"bg-body-tertiary me-md-3 pt-3 px-3 pt-md-5 px-md-5 text-center overflow-hidden\">\n      <div class=\"my-3 p-3\">\n        <h2 class=\"display-5\">Another headline</h2>\n        <p class=\"lead\">And an even wittier subheading.</p>\n      </div>\n      <div class=\"bg-dark shadow-sm mx-auto\" style=\"width: 80%; height: 300px; border-radius: 21px 21px 0 0;\"></div>\n    </div>\n    <div class=\"text-bg-primary me-md-3 pt-3 px-3 pt-md-5 px-md-5 text-center overflow-hidden\">\n      <div class=\"my-3 py-3\">\n        <h2 class=\"display-5\">Another headline</h2>\n        <p class=\"lead\">And an even wittier subheading.</p>\n      </div>\n      <div class=\"bg-body-tertiary shadow-sm mx-auto\" style=\"width: 80%; height: 300px; border-radius: 21px 21px 0 0;\"></div>\n    </div>\n  </div>\n\n  <div class=\"d-md-flex flex-md-equal w-100 my-md-3 ps-md-3\">\n    <div class=\"bg-body-tertiary me-md-3 pt-3 px-3 pt-md-5 px-md-5 text-center overflow-hidden\">\n      <div class=\"my-3 p-3\">\n        <h2 class=\"display-5\">Another headline</h2>\n        <p class=\"lead\">And an even wittier subheading.</p>\n      </div>\n      <div class=\"bg-body shadow-sm mx-auto\" style=\"width: 80%; height: 300px; border-radius: 21px 21px 0 0;\"></div>\n    </div>\n    <div class=\"bg-body-tertiary me-md-3 pt-3 px-3 pt-md-5 px-md-5 text-center overflow-hidden\">\n      <div class=\"my-3 py-3\">\n        <h2 class=\"display-5\">Another headline</h2>\n        <p class=\"lead\">And an even wittier subheading.</p>\n      </div>\n      <div class=\"bg-body shadow-sm mx-auto\" style=\"width: 80%; height: 300px; border-radius: 21px 21px 0 0;\"></div>\n    </div>\n  </div>\n\n  <div class=\"d-md-flex flex-md-equal w-100 my-md-3 ps-md-3\">\n    <div class=\"bg-body-tertiary me-md-3 pt-3 px-3 pt-md-5 px-md-5 text-center overflow-hidden\">\n      <div class=\"my-3 p-3\">\n        <h2 class=\"display-5\">Another headline</h2>\n        <p class=\"lead\">And an even wittier subheading.</p>\n      </div>\n      <div class=\"bg-body shadow-sm mx-auto\" style=\"width: 80%; height: 300px; border-radius: 21px 21px 0 0;\"></div>\n    </div>\n    <div class=\"bg-body-tertiary me-md-3 pt-3 px-3 pt-md-5 px-md-5 text-center overflow-hidden\">\n      <div class=\"my-3 py-3\">\n        <h2 class=\"display-5\">Another headline</h2>\n        <p class=\"lead\">And an even wittier subheading.</p>\n      </div>\n      <div class=\"bg-body shadow-sm mx-auto\" style=\"width: 80%; height: 300px; border-radius: 21px 21px 0 0;\"></div>\n    </div>\n  </div>\n</main>\n\n<footer class=\"container py-5\">\n  <div class=\"row\">\n    <div class=\"col-12 col-md\">\n      <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" class=\"d-block mb-2\" role=\"img\" viewBox=\"0 0 24 24\"><title>Product</title><circle cx=\"12\" cy=\"12\" r=\"10\"/><path d=\"M14.31 8l5.74 9.94M9.69 8h11.48M7.38 12l5.74-9.94M9.69 16L3.95 6.06M14.31 16H2.83m13.79-4l-5.74 9.94\"/></svg>\n      <small class=\"d-block mb-3 text-body-secondary\">&copy; 2017–{new Date().getFullYear()}</small>\n    </div>\n    <div class=\"col-6 col-md\">\n      <h5>Features</h5>\n      <ul class=\"list-unstyled text-small\">\n        <li><a class=\"link-secondary text-decoration-none\" href=\"#\">Cool stuff</a></li>\n        <li><a class=\"link-secondary text-decoration-none\" href=\"#\">Random feature</a></li>\n        <li><a class=\"link-secondary text-decoration-none\" href=\"#\">Team feature</a></li>\n        <li><a class=\"link-secondary text-decoration-none\" href=\"#\">Stuff for developers</a></li>\n        <li><a class=\"link-secondary text-decoration-none\" href=\"#\">Another one</a></li>\n        <li><a class=\"link-secondary text-decoration-none\" href=\"#\">Last time</a></li>\n      </ul>\n    </div>\n    <div class=\"col-6 col-md\">\n      <h5>Resources</h5>\n      <ul class=\"list-unstyled text-small\">\n        <li><a class=\"link-secondary text-decoration-none\" href=\"#\">Resource name</a></li>\n        <li><a class=\"link-secondary text-decoration-none\" href=\"#\">Resource</a></li>\n        <li><a class=\"link-secondary text-decoration-none\" href=\"#\">Another resource</a></li>\n        <li><a class=\"link-secondary text-decoration-none\" href=\"#\">Final resource</a></li>\n      </ul>\n    </div>\n    <div class=\"col-6 col-md\">\n      <h5>Resources</h5>\n      <ul class=\"list-unstyled text-small\">\n        <li><a class=\"link-secondary text-decoration-none\" href=\"#\">Business</a></li>\n        <li><a class=\"link-secondary text-decoration-none\" href=\"#\">Education</a></li>\n        <li><a class=\"link-secondary text-decoration-none\" href=\"#\">Government</a></li>\n        <li><a class=\"link-secondary text-decoration-none\" href=\"#\">Gaming</a></li>\n      </ul>\n    </div>\n    <div class=\"col-6 col-md\">\n      <h5>About</h5>\n      <ul class=\"list-unstyled text-small\">\n        <li><a class=\"link-secondary text-decoration-none\" href=\"#\">Team</a></li>\n        <li><a class=\"link-secondary text-decoration-none\" href=\"#\">Locations</a></li>\n        <li><a class=\"link-secondary text-decoration-none\" href=\"#\">Privacy</a></li>\n        <li><a class=\"link-secondary text-decoration-none\" href=\"#\">Terms</a></li>\n      </ul>\n    </div>\n  </div>\n</footer>\n"
  },
  {
    "path": "site/src/assets/examples/product/product.css",
    "content": ".container {\n  max-width: 960px;\n}\n\n.icon-link > .bi {\n  width: .75em;\n  height: .75em;\n}\n\n/*\n * Custom translucent site header\n */\n\n.site-header {\n  background-color: rgba(0, 0, 0, .85);\n  -webkit-backdrop-filter: saturate(180%) blur(20px);\n  backdrop-filter: saturate(180%) blur(20px);\n}\n.site-header a {\n  color: #8e8e8e;\n  transition: color .15s ease-in-out;\n}\n.site-header a:hover {\n  color: #fff;\n  text-decoration: none;\n}\n\n/*\n * Dummy devices (replace them with your own or something else entirely!)\n */\n\n.product-device {\n  position: absolute;\n  right: 10%;\n  bottom: -30%;\n  width: 300px;\n  height: 540px;\n  background-color: #333;\n  border-radius: 21px;\n  transform: rotate(30deg);\n}\n\n.product-device::before {\n  position: absolute;\n  top: 10%;\n  right: 10px;\n  bottom: 10%;\n  left: 10px;\n  content: \"\";\n  background-color: rgba(255, 255, 255, .1);\n  border-radius: 5px;\n}\n\n.product-device-2 {\n  top: -25%;\n  right: auto;\n  bottom: 0;\n  left: 5%;\n  background-color: #e5e5e5;\n}\n\n\n/*\n * Extra utilities\n */\n\n.flex-equal > * {\n  flex: 1;\n}\n@media (min-width: 768px) {\n  .flex-md-equal > * {\n    flex: 1;\n  }\n}\n"
  },
  {
    "path": "site/src/assets/examples/sidebars/index.astro",
    "content": "---\nexport const title = 'Sidebars'\nexport const extra_css = ['sidebars.css']\nexport const extra_js = [{src: 'sidebars.js'}]\n---\n\n<svg xmlns=\"http://www.w3.org/2000/svg\" class=\"d-none\">\n  <symbol id=\"bootstrap\" viewBox=\"0 0 118 94\">\n    <title>Bootstrap</title>\n    <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M24.509 0c-6.733 0-11.715 5.893-11.492 12.284.214 6.14-.064 14.092-2.066 20.577C8.943 39.365 5.547 43.485 0 44.014v5.972c5.547.529 8.943 4.649 10.951 11.153 2.002 6.485 2.28 14.437 2.066 20.577C12.794 88.106 17.776 94 24.51 94H93.5c6.733 0 11.714-5.893 11.491-12.284-.214-6.14.064-14.092 2.066-20.577 2.009-6.504 5.396-10.624 10.943-11.153v-5.972c-5.547-.529-8.934-4.649-10.943-11.153-2.002-6.484-2.28-14.437-2.066-20.577C105.214 5.894 100.233 0 93.5 0H24.508zM80 57.863C80 66.663 73.436 72 62.543 72H44a2 2 0 01-2-2V24a2 2 0 012-2h18.437c9.083 0 15.044 4.92 15.044 12.474 0 5.302-4.01 10.049-9.119 10.88v.277C75.317 46.394 80 51.21 80 57.863zM60.521 28.34H49.948v14.934h8.905c6.884 0 10.68-2.772 10.68-7.727 0-4.643-3.264-7.207-9.012-7.207zM49.948 49.2v16.458H60.91c7.167 0 10.964-2.876 10.964-8.281 0-5.406-3.903-8.178-11.425-8.178H49.948z\"></path>\n  </symbol>\n  <symbol id=\"home\" viewBox=\"0 0 16 16\">\n    <path d=\"M8.354 1.146a.5.5 0 0 0-.708 0l-6 6A.5.5 0 0 0 1.5 7.5v7a.5.5 0 0 0 .5.5h4.5a.5.5 0 0 0 .5-.5v-4h2v4a.5.5 0 0 0 .5.5H14a.5.5 0 0 0 .5-.5v-7a.5.5 0 0 0-.146-.354L13 5.793V2.5a.5.5 0 0 0-.5-.5h-1a.5.5 0 0 0-.5.5v1.293L8.354 1.146zM2.5 14V7.707l5.5-5.5 5.5 5.5V14H10v-4a.5.5 0 0 0-.5-.5h-3a.5.5 0 0 0-.5.5v4H2.5z\"/>\n  </symbol>\n  <symbol id=\"speedometer2\" viewBox=\"0 0 16 16\">\n    <path d=\"M8 4a.5.5 0 0 1 .5.5V6a.5.5 0 0 1-1 0V4.5A.5.5 0 0 1 8 4zM3.732 5.732a.5.5 0 0 1 .707 0l.915.914a.5.5 0 1 1-.708.708l-.914-.915a.5.5 0 0 1 0-.707zM2 10a.5.5 0 0 1 .5-.5h1.586a.5.5 0 0 1 0 1H2.5A.5.5 0 0 1 2 10zm9.5 0a.5.5 0 0 1 .5-.5h1.5a.5.5 0 0 1 0 1H12a.5.5 0 0 1-.5-.5zm.754-4.246a.389.389 0 0 0-.527-.02L7.547 9.31a.91.91 0 1 0 1.302 1.258l3.434-4.297a.389.389 0 0 0-.029-.518z\"/>\n    <path fill-rule=\"evenodd\" d=\"M0 10a8 8 0 1 1 15.547 2.661c-.442 1.253-1.845 1.602-2.932 1.25C11.309 13.488 9.475 13 8 13c-1.474 0-3.31.488-4.615.911-1.087.352-2.49.003-2.932-1.25A7.988 7.988 0 0 1 0 10zm8-7a7 7 0 0 0-6.603 9.329c.203.575.923.876 1.68.63C4.397 12.533 6.358 12 8 12s3.604.532 4.923.96c.757.245 1.477-.056 1.68-.631A7 7 0 0 0 8 3z\"/>\n  </symbol>\n  <symbol id=\"table\" viewBox=\"0 0 16 16\">\n    <path d=\"M0 2a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2V2zm15 2h-4v3h4V4zm0 4h-4v3h4V8zm0 4h-4v3h3a1 1 0 0 0 1-1v-2zm-5 3v-3H6v3h4zm-5 0v-3H1v2a1 1 0 0 0 1 1h3zm-4-4h4V8H1v3zm0-4h4V4H1v3zm5-3v3h4V4H6zm4 4H6v3h4V8z\"/>\n  </symbol>\n  <symbol id=\"people-circle\" viewBox=\"0 0 16 16\">\n    <path d=\"M11 6a3 3 0 1 1-6 0 3 3 0 0 1 6 0z\"/>\n    <path fill-rule=\"evenodd\" d=\"M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8zm8-7a7 7 0 0 0-5.468 11.37C3.242 11.226 4.805 10 8 10s4.757 1.225 5.468 2.37A7 7 0 0 0 8 1z\"/>\n  </symbol>\n  <symbol id=\"grid\" viewBox=\"0 0 16 16\">\n    <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-3zM2.5 2a.5.5 0 0 0-.5.5v3a.5.5 0 0 0 .5.5h3a.5.5 0 0 0 .5-.5v-3a.5.5 0 0 0-.5-.5h-3zm6.5.5A1.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-3zm1.5-.5a.5.5 0 0 0-.5.5v3a.5.5 0 0 0 .5.5h3a.5.5 0 0 0 .5-.5v-3a.5.5 0 0 0-.5-.5h-3zM1 10.5A1.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-3zm1.5-.5a.5.5 0 0 0-.5.5v3a.5.5 0 0 0 .5.5h3a.5.5 0 0 0 .5-.5v-3a.5.5 0 0 0-.5-.5h-3zm6.5.5A1.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-3zm1.5-.5a.5.5 0 0 0-.5.5v3a.5.5 0 0 0 .5.5h3a.5.5 0 0 0 .5-.5v-3a.5.5 0 0 0-.5-.5h-3z\"/>\n  </symbol>\n</svg>\n\n<main class=\"d-flex flex-nowrap\">\n  <h1 class=\"visually-hidden\">Sidebars examples</h1>\n\n  <div class=\"d-flex flex-column flex-shrink-0 p-3 text-bg-dark\" style=\"width: 280px;\">\n    <a href=\"/\" class=\"d-flex align-items-center mb-3 mb-md-0 me-md-auto text-white text-decoration-none\">\n      <svg class=\"bi pe-none me-2\" width=\"40\" height=\"32\" aria-hidden=\"true\"><use xlink:href=\"#bootstrap\"/></svg>\n      <span class=\"fs-4\">Sidebar</span>\n    </a>\n    <hr>\n    <ul class=\"nav nav-pills flex-column mb-auto\">\n      <li class=\"nav-item\">\n        <a href=\"#\" class=\"nav-link active\" aria-current=\"page\">\n          <svg class=\"bi pe-none me-2\" width=\"16\" height=\"16\" aria-hidden=\"true\"><use xlink:href=\"#home\"/></svg>\n          Home\n        </a>\n      </li>\n      <li>\n        <a href=\"#\" class=\"nav-link text-white\">\n          <svg class=\"bi pe-none me-2\" width=\"16\" height=\"16\" aria-hidden=\"true\"><use xlink:href=\"#speedometer2\"/></svg>\n          Dashboard\n        </a>\n      </li>\n      <li>\n        <a href=\"#\" class=\"nav-link text-white\">\n          <svg class=\"bi pe-none me-2\" width=\"16\" height=\"16\" aria-hidden=\"true\"><use xlink:href=\"#table\"/></svg>\n          Orders\n        </a>\n      </li>\n      <li>\n        <a href=\"#\" class=\"nav-link text-white\">\n          <svg class=\"bi pe-none me-2\" width=\"16\" height=\"16\" aria-hidden=\"true\"><use xlink:href=\"#grid\"/></svg>\n          Products\n        </a>\n      </li>\n      <li>\n        <a href=\"#\" class=\"nav-link text-white\">\n          <svg class=\"bi pe-none me-2\" width=\"16\" height=\"16\" aria-hidden=\"true\"><use xlink:href=\"#people-circle\"/></svg>\n          Customers\n        </a>\n      </li>\n    </ul>\n    <hr>\n    <div class=\"dropdown\">\n      <a href=\"#\" class=\"d-flex align-items-center text-white text-decoration-none dropdown-toggle\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n        <img src=\"https://github.com/mdo.png\" alt=\"\" width=\"32\" height=\"32\" class=\"rounded-circle me-2\">\n        <strong>mdo</strong>\n      </a>\n      <ul class=\"dropdown-menu dropdown-menu-dark text-small shadow\">\n        <li><a class=\"dropdown-item\" href=\"#\">New project...</a></li>\n        <li><a class=\"dropdown-item\" href=\"#\">Settings</a></li>\n        <li><a class=\"dropdown-item\" href=\"#\">Profile</a></li>\n        <li><hr class=\"dropdown-divider\"></li>\n        <li><a class=\"dropdown-item\" href=\"#\">Sign out</a></li>\n      </ul>\n    </div>\n  </div>\n\n  <div class=\"b-example-divider b-example-vr\"></div>\n\n  <div class=\"d-flex flex-column flex-shrink-0 p-3 bg-body-tertiary\" style=\"width: 280px;\">\n    <a href=\"/\" class=\"d-flex align-items-center mb-3 mb-md-0 me-md-auto link-body-emphasis text-decoration-none\">\n      <svg class=\"bi pe-none me-2\" width=\"40\" height=\"32\" aria-hidden=\"true\"><use xlink:href=\"#bootstrap\"/></svg>\n      <span class=\"fs-4\">Sidebar</span>\n    </a>\n    <hr>\n    <ul class=\"nav nav-pills flex-column mb-auto\">\n      <li class=\"nav-item\">\n        <a href=\"#\" class=\"nav-link active\" aria-current=\"page\">\n          <svg class=\"bi pe-none me-2\" width=\"16\" height=\"16\" aria-hidden=\"true\"><use xlink:href=\"#home\"/></svg>\n          Home\n        </a>\n      </li>\n      <li>\n        <a href=\"#\" class=\"nav-link link-body-emphasis\">\n          <svg class=\"bi pe-none me-2\" width=\"16\" height=\"16\" aria-hidden=\"true\"><use xlink:href=\"#speedometer2\"/></svg>\n          Dashboard\n        </a>\n      </li>\n      <li>\n        <a href=\"#\" class=\"nav-link link-body-emphasis\">\n          <svg class=\"bi pe-none me-2\" width=\"16\" height=\"16\" aria-hidden=\"true\"><use xlink:href=\"#table\"/></svg>\n          Orders\n        </a>\n      </li>\n      <li>\n        <a href=\"#\" class=\"nav-link link-body-emphasis\">\n          <svg class=\"bi pe-none me-2\" width=\"16\" height=\"16\" aria-hidden=\"true\"><use xlink:href=\"#grid\"/></svg>\n          Products\n        </a>\n      </li>\n      <li>\n        <a href=\"#\" class=\"nav-link link-body-emphasis\">\n          <svg class=\"bi pe-none me-2\" width=\"16\" height=\"16\" aria-hidden=\"true\"><use xlink:href=\"#people-circle\"/></svg>\n          Customers\n        </a>\n      </li>\n    </ul>\n    <hr>\n    <div class=\"dropdown\">\n      <a href=\"#\" class=\"d-flex align-items-center link-body-emphasis text-decoration-none dropdown-toggle\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n        <img src=\"https://github.com/mdo.png\" alt=\"\" width=\"32\" height=\"32\" class=\"rounded-circle me-2\">\n        <strong>mdo</strong>\n      </a>\n      <ul class=\"dropdown-menu text-small shadow\">\n        <li><a class=\"dropdown-item\" href=\"#\">New project...</a></li>\n        <li><a class=\"dropdown-item\" href=\"#\">Settings</a></li>\n        <li><a class=\"dropdown-item\" href=\"#\">Profile</a></li>\n        <li><hr class=\"dropdown-divider\"></li>\n        <li><a class=\"dropdown-item\" href=\"#\">Sign out</a></li>\n      </ul>\n    </div>\n  </div>\n\n  <div class=\"b-example-divider b-example-vr\"></div>\n\n  <div class=\"d-flex flex-column flex-shrink-0 bg-body-tertiary\" style=\"width: 4.5rem;\">\n    <a href=\"/\" class=\"d-block p-3 link-body-emphasis text-decoration-none\" title=\"Icon-only\" data-bs-toggle=\"tooltip\" data-bs-placement=\"right\">\n      <svg class=\"bi pe-none\" width=\"40\" height=\"32\" aria-hidden=\"true\"><use xlink:href=\"#bootstrap\"/></svg>\n      <span class=\"visually-hidden\">Icon-only</span>\n    </a>\n    <ul class=\"nav nav-pills nav-flush flex-column mb-auto text-center\">\n      <li class=\"nav-item\">\n        <a href=\"#\" class=\"nav-link active py-3 border-bottom rounded-0\" aria-current=\"page\" title=\"Home\" data-bs-toggle=\"tooltip\" data-bs-placement=\"right\">\n          <svg class=\"bi pe-none\" width=\"24\" height=\"24\" role=\"img\" aria-label=\"Home\"><use xlink:href=\"#home\"/></svg>\n        </a>\n      </li>\n      <li>\n        <a href=\"#\" class=\"nav-link py-3 border-bottom rounded-0\" title=\"Dashboard\" data-bs-toggle=\"tooltip\" data-bs-placement=\"right\">\n          <svg class=\"bi pe-none\" width=\"24\" height=\"24\" role=\"img\" aria-label=\"Dashboard\"><use xlink:href=\"#speedometer2\"/></svg>\n        </a>\n      </li>\n      <li>\n        <a href=\"#\" class=\"nav-link py-3 border-bottom rounded-0\" title=\"Orders\" data-bs-toggle=\"tooltip\" data-bs-placement=\"right\">\n          <svg class=\"bi pe-none\" width=\"24\" height=\"24\" role=\"img\" aria-label=\"Orders\"><use xlink:href=\"#table\"/></svg>\n        </a>\n      </li>\n      <li>\n        <a href=\"#\" class=\"nav-link py-3 border-bottom rounded-0\" title=\"Products\" data-bs-toggle=\"tooltip\" data-bs-placement=\"right\">\n          <svg class=\"bi pe-none\" width=\"24\" height=\"24\" role=\"img\" aria-label=\"Products\"><use xlink:href=\"#grid\"/></svg>\n        </a>\n      </li>\n      <li>\n        <a href=\"#\" class=\"nav-link py-3 border-bottom rounded-0\" title=\"Customers\" data-bs-toggle=\"tooltip\" data-bs-placement=\"right\">\n          <svg class=\"bi pe-none\" width=\"24\" height=\"24\" role=\"img\" aria-label=\"Customers\"><use xlink:href=\"#people-circle\"/></svg>\n        </a>\n      </li>\n    </ul>\n    <div class=\"dropdown border-top\">\n      <a href=\"#\" class=\"d-flex align-items-center justify-content-center p-3 link-body-emphasis text-decoration-none dropdown-toggle\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n        <img src=\"https://github.com/mdo.png\" alt=\"mdo\" width=\"24\" height=\"24\" class=\"rounded-circle\">\n      </a>\n      <ul class=\"dropdown-menu text-small shadow\">\n        <li><a class=\"dropdown-item\" href=\"#\">New project...</a></li>\n        <li><a class=\"dropdown-item\" href=\"#\">Settings</a></li>\n        <li><a class=\"dropdown-item\" href=\"#\">Profile</a></li>\n        <li><hr class=\"dropdown-divider\"></li>\n        <li><a class=\"dropdown-item\" href=\"#\">Sign out</a></li>\n      </ul>\n    </div>\n  </div>\n\n  <div class=\"b-example-divider b-example-vr\"></div>\n\n  <div class=\"flex-shrink-0 p-3\" style=\"width: 280px;\">\n    <a href=\"/\" class=\"d-flex align-items-center pb-3 mb-3 link-body-emphasis text-decoration-none border-bottom\">\n      <svg class=\"bi pe-none me-2\" width=\"30\" height=\"24\" aria-hidden=\"true\"><use xlink:href=\"#bootstrap\"/></svg>\n      <span class=\"fs-5 fw-semibold\">Collapsible</span>\n    </a>\n    <ul class=\"list-unstyled ps-0\">\n      <li class=\"mb-1\">\n        <button class=\"btn btn-toggle d-inline-flex align-items-center rounded border-0 collapsed\" data-bs-toggle=\"collapse\" data-bs-target=\"#home-collapse\" aria-expanded=\"true\">\n          Home\n        </button>\n        <div class=\"collapse show\" id=\"home-collapse\">\n          <ul class=\"btn-toggle-nav list-unstyled fw-normal pb-1 small\">\n            <li><a href=\"#\" class=\"link-body-emphasis d-inline-flex text-decoration-none rounded\">Overview</a></li>\n            <li><a href=\"#\" class=\"link-body-emphasis d-inline-flex text-decoration-none rounded\">Updates</a></li>\n            <li><a href=\"#\" class=\"link-body-emphasis d-inline-flex text-decoration-none rounded\">Reports</a></li>\n          </ul>\n        </div>\n      </li>\n      <li class=\"mb-1\">\n        <button class=\"btn btn-toggle d-inline-flex align-items-center rounded border-0 collapsed\" data-bs-toggle=\"collapse\" data-bs-target=\"#dashboard-collapse\" aria-expanded=\"false\">\n          Dashboard\n        </button>\n        <div class=\"collapse\" id=\"dashboard-collapse\">\n          <ul class=\"btn-toggle-nav list-unstyled fw-normal pb-1 small\">\n            <li><a href=\"#\" class=\"link-body-emphasis d-inline-flex text-decoration-none rounded\">Overview</a></li>\n            <li><a href=\"#\" class=\"link-body-emphasis d-inline-flex text-decoration-none rounded\">Weekly</a></li>\n            <li><a href=\"#\" class=\"link-body-emphasis d-inline-flex text-decoration-none rounded\">Monthly</a></li>\n            <li><a href=\"#\" class=\"link-body-emphasis d-inline-flex text-decoration-none rounded\">Annually</a></li>\n          </ul>\n        </div>\n      </li>\n      <li class=\"mb-1\">\n        <button class=\"btn btn-toggle d-inline-flex align-items-center rounded border-0 collapsed\" data-bs-toggle=\"collapse\" data-bs-target=\"#orders-collapse\" aria-expanded=\"false\">\n          Orders\n        </button>\n        <div class=\"collapse\" id=\"orders-collapse\">\n          <ul class=\"btn-toggle-nav list-unstyled fw-normal pb-1 small\">\n            <li><a href=\"#\" class=\"link-body-emphasis d-inline-flex text-decoration-none rounded\">New</a></li>\n            <li><a href=\"#\" class=\"link-body-emphasis d-inline-flex text-decoration-none rounded\">Processed</a></li>\n            <li><a href=\"#\" class=\"link-body-emphasis d-inline-flex text-decoration-none rounded\">Shipped</a></li>\n            <li><a href=\"#\" class=\"link-body-emphasis d-inline-flex text-decoration-none rounded\">Returned</a></li>\n          </ul>\n        </div>\n      </li>\n      <li class=\"border-top my-3\"></li>\n      <li class=\"mb-1\">\n        <button class=\"btn btn-toggle d-inline-flex align-items-center rounded border-0 collapsed\" data-bs-toggle=\"collapse\" data-bs-target=\"#account-collapse\" aria-expanded=\"false\">\n          Account\n        </button>\n        <div class=\"collapse\" id=\"account-collapse\">\n          <ul class=\"btn-toggle-nav list-unstyled fw-normal pb-1 small\">\n            <li><a href=\"#\" class=\"link-body-emphasis d-inline-flex text-decoration-none rounded\">New...</a></li>\n            <li><a href=\"#\" class=\"link-body-emphasis d-inline-flex text-decoration-none rounded\">Profile</a></li>\n            <li><a href=\"#\" class=\"link-body-emphasis d-inline-flex text-decoration-none rounded\">Settings</a></li>\n            <li><a href=\"#\" class=\"link-body-emphasis d-inline-flex text-decoration-none rounded\">Sign out</a></li>\n          </ul>\n        </div>\n      </li>\n    </ul>\n  </div>\n\n  <div class=\"b-example-divider b-example-vr\"></div>\n\n  <div class=\"d-flex flex-column align-items-stretch flex-shrink-0 bg-body-tertiary\" style=\"width: 380px;\">\n    <a href=\"/\" class=\"d-flex align-items-center flex-shrink-0 p-3 link-body-emphasis text-decoration-none border-bottom\">\n      <svg class=\"bi pe-none me-2\" width=\"30\" height=\"24\" aria-hidden=\"true\"><use xlink:href=\"#bootstrap\"/></svg>\n      <span class=\"fs-5 fw-semibold\">List group</span>\n    </a>\n    <div class=\"list-group list-group-flush border-bottom scrollarea\">\n      <a href=\"#\" class=\"list-group-item list-group-item-action active py-3 lh-sm\" aria-current=\"true\">\n        <div class=\"d-flex w-100 align-items-center justify-content-between\">\n          <strong class=\"mb-1\">List group item heading</strong>\n          <small>Wed</small>\n        </div>\n        <div class=\"col-10 mb-1 small\">Some placeholder content in a paragraph below the heading and date.</div>\n      </a>\n      <a href=\"#\" class=\"list-group-item list-group-item-action py-3 lh-sm\">\n        <div class=\"d-flex w-100 align-items-center justify-content-between\">\n          <strong class=\"mb-1\">List group item heading</strong>\n          <small class=\"text-body-secondary\">Tues</small>\n        </div>\n        <div class=\"col-10 mb-1 small\">Some placeholder content in a paragraph below the heading and date.</div>\n      </a>\n      <a href=\"#\" class=\"list-group-item list-group-item-action py-3 lh-sm\">\n        <div class=\"d-flex w-100 align-items-center justify-content-between\">\n          <strong class=\"mb-1\">List group item heading</strong>\n          <small class=\"text-body-secondary\">Mon</small>\n        </div>\n        <div class=\"col-10 mb-1 small\">Some placeholder content in a paragraph below the heading and date.</div>\n      </a>\n\n      <a href=\"#\" class=\"list-group-item list-group-item-action py-3 lh-sm\" aria-current=\"true\">\n        <div class=\"d-flex w-100 align-items-center justify-content-between\">\n          <strong class=\"mb-1\">List group item heading</strong>\n          <small class=\"text-body-secondary\">Wed</small>\n        </div>\n        <div class=\"col-10 mb-1 small\">Some placeholder content in a paragraph below the heading and date.</div>\n      </a>\n      <a href=\"#\" class=\"list-group-item list-group-item-action py-3 lh-sm\">\n        <div class=\"d-flex w-100 align-items-center justify-content-between\">\n          <strong class=\"mb-1\">List group item heading</strong>\n          <small class=\"text-body-secondary\">Tues</small>\n        </div>\n        <div class=\"col-10 mb-1 small\">Some placeholder content in a paragraph below the heading and date.</div>\n      </a>\n      <a href=\"#\" class=\"list-group-item list-group-item-action py-3 lh-sm\">\n        <div class=\"d-flex w-100 align-items-center justify-content-between\">\n          <strong class=\"mb-1\">List group item heading</strong>\n          <small class=\"text-body-secondary\">Mon</small>\n        </div>\n        <div class=\"col-10 mb-1 small\">Some placeholder content in a paragraph below the heading and date.</div>\n      </a>\n      <a href=\"#\" class=\"list-group-item list-group-item-action py-3 lh-sm\" aria-current=\"true\">\n        <div class=\"d-flex w-100 align-items-center justify-content-between\">\n          <strong class=\"mb-1\">List group item heading</strong>\n          <small class=\"text-body-secondary\">Wed</small>\n        </div>\n        <div class=\"col-10 mb-1 small\">Some placeholder content in a paragraph below the heading and date.</div>\n      </a>\n      <a href=\"#\" class=\"list-group-item list-group-item-action py-3 lh-sm\">\n        <div class=\"d-flex w-100 align-items-center justify-content-between\">\n          <strong class=\"mb-1\">List group item heading</strong>\n          <small class=\"text-body-secondary\">Tues</small>\n        </div>\n        <div class=\"col-10 mb-1 small\">Some placeholder content in a paragraph below the heading and date.</div>\n      </a>\n      <a href=\"#\" class=\"list-group-item list-group-item-action py-3 lh-sm\">\n        <div class=\"d-flex w-100 align-items-center justify-content-between\">\n          <strong class=\"mb-1\">List group item heading</strong>\n          <small class=\"text-body-secondary\">Mon</small>\n        </div>\n        <div class=\"col-10 mb-1 small\">Some placeholder content in a paragraph below the heading and date.</div>\n      </a>\n      <a href=\"#\" class=\"list-group-item list-group-item-action py-3 lh-sm\" aria-current=\"true\">\n        <div class=\"d-flex w-100 align-items-center justify-content-between\">\n          <strong class=\"mb-1\">List group item heading</strong>\n          <small class=\"text-body-secondary\">Wed</small>\n        </div>\n        <div class=\"col-10 mb-1 small\">Some placeholder content in a paragraph below the heading and date.</div>\n      </a>\n      <a href=\"#\" class=\"list-group-item list-group-item-action py-3 lh-sm\">\n        <div class=\"d-flex w-100 align-items-center justify-content-between\">\n          <strong class=\"mb-1\">List group item heading</strong>\n          <small class=\"text-body-secondary\">Tues</small>\n        </div>\n        <div class=\"col-10 mb-1 small\">Some placeholder content in a paragraph below the heading and date.</div>\n      </a>\n      <a href=\"#\" class=\"list-group-item list-group-item-action py-3 lh-sm\">\n        <div class=\"d-flex w-100 align-items-center justify-content-between\">\n          <strong class=\"mb-1\">List group item heading</strong>\n          <small class=\"text-body-secondary\">Mon</small>\n        </div>\n        <div class=\"col-10 mb-1 small\">Some placeholder content in a paragraph below the heading and date.</div>\n      </a>\n    </div>\n  </div>\n\n  <div class=\"b-example-divider b-example-vr\"></div>\n</main>\n"
  },
  {
    "path": "site/src/assets/examples/sidebars/sidebars.css",
    "content": "body {\n  min-height: 100vh;\n  min-height: -webkit-fill-available;\n}\n\nhtml {\n  height: -webkit-fill-available;\n}\n\nmain {\n  height: 100vh;\n  height: -webkit-fill-available;\n  max-height: 100vh;\n  overflow-x: auto;\n  overflow-y: hidden;\n}\n\n.dropdown-toggle { outline: 0; }\n\n.btn-toggle {\n  padding: .25rem .5rem;\n  font-weight: 600;\n  color: var(--bs-emphasis-color);\n  background-color: transparent;\n}\n.btn-toggle:hover,\n.btn-toggle:focus {\n  color: rgba(var(--bs-emphasis-color-rgb), .85);\n  background-color: var(--bs-tertiary-bg);\n}\n\n.btn-toggle::before {\n  width: 1.25em;\n  line-height: 0;\n  content: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='rgba%280,0,0,.5%29' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M5 14l6-6-6-6'/%3e%3c/svg%3e\");\n  transition: transform .35s ease;\n  transform-origin: .5em 50%;\n}\n\n[data-bs-theme=\"dark\"] .btn-toggle::before {\n  content: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='rgba%28255,255,255,.5%29' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M5 14l6-6-6-6'/%3e%3c/svg%3e\");\n}\n\n.btn-toggle[aria-expanded=\"true\"] {\n  color: rgba(var(--bs-emphasis-color-rgb), .85);\n}\n.btn-toggle[aria-expanded=\"true\"]::before {\n  transform: rotate(90deg);\n}\n\n.btn-toggle-nav a {\n  padding: .1875rem .5rem;\n  margin-top: .125rem;\n  margin-left: 1.25rem;\n}\n.btn-toggle-nav a:hover,\n.btn-toggle-nav a:focus {\n  background-color: var(--bs-tertiary-bg);\n}\n\n.scrollarea {\n  overflow-y: auto;\n}\n"
  },
  {
    "path": "site/src/assets/examples/sidebars/sidebars.js",
    "content": "/* global bootstrap: false */\n(() => {\n  'use strict'\n  const tooltipTriggerList = Array.from(document.querySelectorAll('[data-bs-toggle=\"tooltip\"]'))\n  tooltipTriggerList.forEach(tooltipTriggerEl => {\n    new bootstrap.Tooltip(tooltipTriggerEl)\n  })\n})()\n"
  },
  {
    "path": "site/src/assets/examples/sign-in/index.astro",
    "content": "---\nimport { getVersionedDocsPath } from '@libs/path'\n\nexport const title = 'Signin Template'\nexport const extra_css = ['sign-in.css']\nexport const body_class = 'd-flex align-items-center py-4 bg-body-tertiary'\n---\n\n<main class=\"form-signin w-100 m-auto\">\n  <form>\n    <img class=\"mb-4\" src={getVersionedDocsPath('/assets/brand/bootstrap-logo.svg')} alt=\"\" width=\"72\" height=\"57\">\n    <h1 class=\"h3 mb-3 fw-normal\">Please sign in</h1>\n\n    <div class=\"form-floating\">\n      <input type=\"email\" class=\"form-control\" id=\"floatingInput\" placeholder=\"name@example.com\">\n      <label for=\"floatingInput\">Email address</label>\n    </div>\n    <div class=\"form-floating\">\n      <input type=\"password\" class=\"form-control\" id=\"floatingPassword\" placeholder=\"Password\">\n      <label for=\"floatingPassword\">Password</label>\n    </div>\n\n    <div class=\"form-check text-start my-3\">\n      <input class=\"form-check-input\" type=\"checkbox\" value=\"remember-me\" id=\"checkDefault\">\n      <label class=\"form-check-label\" for=\"checkDefault\">\n        Remember me\n      </label>\n    </div>\n    <button class=\"btn btn-primary w-100 py-2\" type=\"submit\">Sign in</button>\n    <p class=\"mt-5 mb-3 text-body-secondary\">&copy; 2017–{new Date().getFullYear()}</p>\n  </form>\n</main>\n"
  },
  {
    "path": "site/src/assets/examples/sign-in/sign-in.css",
    "content": "html,\nbody {\n  height: 100%;\n}\n\n.form-signin {\n  max-width: 330px;\n  padding: 1rem;\n}\n\n.form-signin .form-floating:focus-within {\n  z-index: 2;\n}\n\n.form-signin input[type=\"email\"] {\n  margin-bottom: -1px;\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.form-signin input[type=\"password\"] {\n  margin-bottom: 10px;\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n}\n"
  },
  {
    "path": "site/src/assets/examples/starter-template/index.astro",
    "content": "---\nimport { getVersionedDocsPath } from '@libs/path'\n\nexport const title = 'Starter Template'\n---\n\n<svg xmlns=\"http://www.w3.org/2000/svg\" class=\"d-none\">\n  <symbol id=\"arrow-right-circle\" viewBox=\"0 0 16 16\">\n    <path d=\"M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0zM4.5 7.5a.5.5 0 0 0 0 1h5.793l-2.147 2.146a.5.5 0 0 0 .708.708l3-3a.5.5 0 0 0 0-.708l-3-3a.5.5 0 1 0-.708.708L10.293 7.5H4.5z\"/>\n  </symbol>\n  <symbol id=\"bootstrap\" viewBox=\"0 0 118 94\">\n    <title>Bootstrap</title>\n    <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M24.509 0c-6.733 0-11.715 5.893-11.492 12.284.214 6.14-.064 14.092-2.066 20.577C8.943 39.365 5.547 43.485 0 44.014v5.972c5.547.529 8.943 4.649 10.951 11.153 2.002 6.485 2.28 14.437 2.066 20.577C12.794 88.106 17.776 94 24.51 94H93.5c6.733 0 11.714-5.893 11.491-12.284-.214-6.14.064-14.092 2.066-20.577 2.009-6.504 5.396-10.624 10.943-11.153v-5.972c-5.547-.529-8.934-4.649-10.943-11.153-2.002-6.484-2.28-14.437-2.066-20.577C105.214 5.894 100.233 0 93.5 0H24.508zM80 57.863C80 66.663 73.436 72 62.543 72H44a2 2 0 01-2-2V24a2 2 0 012-2h18.437c9.083 0 15.044 4.92 15.044 12.474 0 5.302-4.01 10.049-9.119 10.88v.277C75.317 46.394 80 51.21 80 57.863zM60.521 28.34H49.948v14.934h8.905c6.884 0 10.68-2.772 10.68-7.727 0-4.643-3.264-7.207-9.012-7.207zM49.948 49.2v16.458H60.91c7.167 0 10.964-2.876 10.964-8.281 0-5.406-3.903-8.178-11.425-8.178H49.948z\"></path>\n  </symbol>\n</svg>\n\n<div class=\"col-lg-8 mx-auto p-4 py-md-5\">\n  <header class=\"d-flex align-items-center pb-3 mb-5 border-bottom\">\n    <a href=\"/\" class=\"d-flex align-items-center text-body-emphasis text-decoration-none\">\n      <svg class=\"bi me-2\" width=\"40\" height=\"32\" role=\"img\" aria-label=\"Bootstrap\"><use xlink:href=\"#bootstrap\"/></svg>\n      <span class=\"fs-4\">Starter template</span>\n    </a>\n  </header>\n\n  <main>\n    <h1 class=\"text-body-emphasis\">Get started with Bootstrap</h1>\n    <p class=\"fs-5 col-md-8\">Quickly and easily get started with Bootstrap's compiled, production-ready files with this barebones example featuring some basic HTML and helpful links. Download all our examples to get started.</p>\n\n    <div class=\"mb-5\">\n      <a href={getVersionedDocsPath('/examples')} class=\"btn btn-primary btn-lg px-4\">Download examples</a>\n    </div>\n\n    <hr class=\"col-3 col-md-2 mb-5\">\n\n    <div class=\"row g-5\">\n      <div class=\"col-md-6\">\n        <h2 class=\"text-body-emphasis\">Starter projects</h2>\n        <p>Ready to go beyond the starter template? Check out these open source projects that you can quickly duplicate to a new GitHub repository.</p>\n        <ul class=\"list-unstyled ps-0\">\n          <li>\n            <a class=\"icon-link mb-1\" href=\"https://github.com/twbs/examples/tree/main/icons-font\" rel=\"noopener\" target=\"_blank\">\n              <svg class=\"bi\" width=\"16\" height=\"16\" aria-hidden=\"true\"><use xlink:href=\"#arrow-right-circle\"/></svg>\n              Bootstrap npm starter\n            </a>\n          </li>\n          <li>\n            <a class=\"icon-link mb-1\" href=\"https://github.com/twbs/examples/tree/main/parcel\" rel=\"noopener\" target=\"_blank\">\n              <svg class=\"bi\" width=\"16\" height=\"16\" aria-hidden=\"true\"><use xlink:href=\"#arrow-right-circle\"/></svg>\n              Bootstrap Parcel starter\n            </a>\n          </li>\n          <li>\n            <a class=\"icon-link mb-1\" href=\"https://github.com/twbs/examples/tree/main/vite\" rel=\"noopener\" target=\"_blank\">\n              <svg class=\"bi\" width=\"16\" height=\"16\" aria-hidden=\"true\"><use xlink:href=\"#arrow-right-circle\"/></svg>\n              Bootstrap Vite starter\n            </a>\n          </li>\n          <li>\n            <a class=\"icon-link mb-1\" href=\"https://github.com/twbs/examples/tree/main/webpack\" rel=\"noopener\" target=\"_blank\">\n              <svg class=\"bi\" width=\"16\" height=\"16\" aria-hidden=\"true\"><use xlink:href=\"#arrow-right-circle\"/></svg>\n              Bootstrap Webpack starter\n            </a>\n          </li>\n        </ul>\n      </div>\n\n      <div class=\"col-md-6\">\n        <h2 class=\"text-body-emphasis\">Guides</h2>\n        <p>Read more detailed instructions and documentation on using or contributing to Bootstrap.</p>\n        <ul class=\"list-unstyled ps-0\">\n          <li>\n            <a class=\"icon-link mb-1\" href={getVersionedDocsPath('/getting-started/introduction')}>\n              <svg class=\"bi\" width=\"16\" height=\"16\" aria-hidden=\"true\"><use xlink:href=\"#arrow-right-circle\"/></svg>\n              Bootstrap quick start guide\n            </a>\n          </li>\n          <li>\n            <a class=\"icon-link mb-1\" href={getVersionedDocsPath('/getting-started/webpack')}>\n              <svg class=\"bi\" width=\"16\" height=\"16\" aria-hidden=\"true\"><use xlink:href=\"#arrow-right-circle\"/></svg>\n              Bootstrap Webpack guide\n            </a>\n          </li>\n          <li>\n            <a class=\"icon-link mb-1\" href={getVersionedDocsPath('/getting-started/parcel')}>\n              <svg class=\"bi\" width=\"16\" height=\"16\" aria-hidden=\"true\"><use xlink:href=\"#arrow-right-circle\"/></svg>\n              Bootstrap Parcel guide\n            </a>\n          </li>\n          <li>\n            <a class=\"icon-link mb-1\" href={getVersionedDocsPath('/getting-started/vite')}>\n              <svg class=\"bi\" width=\"16\" height=\"16\" aria-hidden=\"true\"><use xlink:href=\"#arrow-right-circle\"/></svg>\n              Bootstrap Vite guide\n            </a>\n          </li>\n          <li>\n            <a class=\"icon-link mb-1\" href={getVersionedDocsPath('/getting-started/contribute')}>\n              <svg class=\"bi\" width=\"16\" height=\"16\" aria-hidden=\"true\"><use xlink:href=\"#arrow-right-circle\"/></svg>\n              Contributing to Bootstrap\n            </a>\n          </li>\n        </ul>\n      </div>\n    </div>\n  </main>\n  <footer class=\"pt-5 my-5 text-body-secondary border-top\">\n    Created by the Bootstrap team &middot; &copy; {new Date().getFullYear()}\n  </footer>\n</div>\n"
  },
  {
    "path": "site/src/assets/examples/sticky-footer/index.astro",
    "content": "---\nimport { getVersionedDocsPath } from '@libs/path'\n\nexport const title = 'Sticky Footer Template'\nexport const extra_css = ['sticky-footer.css']\nexport const html_class = 'h-100'\nexport const body_class = 'd-flex flex-column h-100'\n---\n\n<!-- Begin page content -->\n<main class=\"flex-shrink-0\">\n  <div class=\"container\">\n    <h1 class=\"mt-5\">Sticky footer</h1>\n    <p class=\"lead\">Pin a footer to the bottom of the viewport in desktop browsers with this custom HTML and CSS.</p>\n    <p>Use <a href={getVersionedDocsPath('/examples/sticky-footer-navbar/')}>the sticky footer with a fixed navbar</a> if need be, too.</p>\n  </div>\n</main>\n\n<footer class=\"footer mt-auto py-3 bg-body-tertiary\">\n  <div class=\"container\">\n    <span class=\"text-body-secondary\">Place sticky footer content here.</span>\n  </div>\n</footer>\n"
  },
  {
    "path": "site/src/assets/examples/sticky-footer/sticky-footer.css",
    "content": "/* Custom page CSS\n-------------------------------------------------- */\n/* Not required for template or sticky footer method. */\n\n.container {\n  width: auto;\n  max-width: 680px;\n  padding: 0 15px;\n}\n"
  },
  {
    "path": "site/src/assets/examples/sticky-footer-navbar/index.astro",
    "content": "---\nimport { getVersionedDocsPath } from '@libs/path'\n\nexport const title = 'Sticky Footer Navbar Template'\nexport const extra_css = ['sticky-footer-navbar.css']\nexport const html_class = 'h-100'\nexport const body_class = 'd-flex flex-column h-100'\n---\n\n<header>\n  <!-- Fixed navbar -->\n  <nav class=\"navbar navbar-expand-md navbar-dark fixed-top bg-dark\">\n    <div class=\"container-fluid\">\n      <a class=\"navbar-brand\" href=\"#\">Fixed navbar</a>\n      <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbarCollapse\" aria-controls=\"navbarCollapse\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n        <span class=\"navbar-toggler-icon\"></span>\n      </button>\n      <div class=\"collapse navbar-collapse\" id=\"navbarCollapse\">\n        <ul class=\"navbar-nav me-auto mb-2 mb-md-0\">\n          <li class=\"nav-item\">\n            <a class=\"nav-link active\" aria-current=\"page\" href=\"#\">Home</a>\n          </li>\n          <li class=\"nav-item\">\n            <a class=\"nav-link\" href=\"#\">Link</a>\n          </li>\n          <li class=\"nav-item\">\n            <a class=\"nav-link disabled\" aria-disabled=\"true\">Disabled</a>\n          </li>\n        </ul>\n        <form class=\"d-flex\" role=\"search\">\n          <input class=\"form-control me-2\" type=\"search\" placeholder=\"Search\" aria-label=\"Search\">\n          <button class=\"btn btn-outline-success\" type=\"submit\">Search</button>\n        </form>\n      </div>\n    </div>\n  </nav>\n</header>\n\n<!-- Begin page content -->\n<main class=\"flex-shrink-0\">\n  <div class=\"container\">\n    <h1 class=\"mt-5\">Sticky footer with fixed navbar</h1>\n    <p class=\"lead\">Pin a footer to the bottom of the viewport in desktop browsers with this custom HTML and CSS. A fixed navbar has been added with <code class=\"small\">padding-top: 60px;</code> on the <code class=\"small\">main &gt; .container</code>.</p>\n    <p>Back to <a href={getVersionedDocsPath('/examples/sticky-footer/')}>the default sticky footer</a> minus the navbar.</p>\n  </div>\n</main>\n\n<footer class=\"footer mt-auto py-3 bg-body-tertiary\">\n  <div class=\"container\">\n    <span class=\"text-body-secondary\">Place sticky footer content here.</span>\n  </div>\n</footer>\n"
  },
  {
    "path": "site/src/assets/examples/sticky-footer-navbar/sticky-footer-navbar.css",
    "content": "/* Custom page CSS\n-------------------------------------------------- */\n/* Not required for template or sticky footer method. */\n\nmain > .container {\n  padding: 60px 15px 0;\n}\n"
  },
  {
    "path": "site/src/assets/partials/sidebar.js",
    "content": "// NOTICE!! DO NOT USE ANY OF THIS JAVASCRIPT\n// IT'S ALL JUST JUNK FOR OUR DOCS!\n// ++++++++++++++++++++++++++++++++++++++++++\n\n/*\n * JavaScript for Bootstrap's docs (https://getbootstrap.com/)\n * Copyright 2011-2026 The Bootstrap Authors\n * Licensed under the Creative Commons Attribution 3.0 Unported License.\n * For details, see https://creativecommons.org/licenses/by/3.0/.\n */\n\nexport default () => {\n  // Scroll the active sidebar link into view\n  const sidenav = document.querySelector('.bd-sidebar')\n  const sidenavActiveLink = document.querySelector('.bd-links-nav .active')\n\n  if (!sidenav || !sidenavActiveLink) {\n    return\n  }\n\n  const sidenavHeight = sidenav.clientHeight\n  const sidenavActiveLinkTop = sidenavActiveLink.offsetTop\n  const sidenavActiveLinkHeight = sidenavActiveLink.clientHeight\n  const viewportTop = sidenavActiveLinkTop\n  const viewportBottom = viewportTop - sidenavHeight + sidenavActiveLinkHeight\n\n  if (sidenav.scrollTop > viewportTop || sidenav.scrollTop < viewportBottom) {\n    sidenav.scrollTop = viewportTop - (sidenavHeight / 2) + (sidenavActiveLinkHeight / 2)\n  }\n}\n"
  },
  {
    "path": "site/src/assets/partials/snippets.js",
    "content": "// NOTICE!!! Initially embedded in our docs this JavaScript\n// file contains elements that can help you create reproducible\n// use cases in StackBlitz for instance.\n// In a real project please adapt this content to your needs.\n// ++++++++++++++++++++++++++++++++++++++++++\n\n/*\n * JavaScript for Bootstrap's docs (https://getbootstrap.com/)\n * Copyright 2011-2026 The Bootstrap Authors\n * Licensed under the Creative Commons Attribution 3.0 Unported License.\n * For details, see https://creativecommons.org/licenses/by/3.0/.\n */\n\n/* global bootstrap: false */\n\nexport default () => {\n  // --------\n  // Tooltips\n  // --------\n  // Instantiate all tooltips in a docs or StackBlitz\n  document.querySelectorAll('[data-bs-toggle=\"tooltip\"]')\n    .forEach(tooltip => {\n      new bootstrap.Tooltip(tooltip)\n    })\n\n  // --------\n  // Popovers\n  // --------\n  // Instantiate all popovers in docs or StackBlitz\n  document.querySelectorAll('[data-bs-toggle=\"popover\"]')\n    .forEach(popover => {\n      new bootstrap.Popover(popover)\n    })\n\n  // -------------------------------\n  // Toasts\n  // -------------------------------\n  // Used by 'Placement' example in docs or StackBlitz\n  const toastPlacement = document.getElementById('toastPlacement')\n  if (toastPlacement) {\n    document.getElementById('selectToastPlacement').addEventListener('change', function () {\n      if (!toastPlacement.dataset.originalClass) {\n        toastPlacement.dataset.originalClass = toastPlacement.className\n      }\n\n      toastPlacement.className = `${toastPlacement.dataset.originalClass} ${this.value}`\n    })\n  }\n\n  // Instantiate all toasts in docs pages only\n  document.querySelectorAll('.bd-example .toast')\n    .forEach(toastNode => {\n      const toast = new bootstrap.Toast(toastNode, {\n        autohide: false\n      })\n\n      toast.show()\n    })\n\n  // Instantiate all toasts in docs pages only\n  // js-docs-start live-toast\n  const toastTrigger = document.getElementById('liveToastBtn')\n  const toastLiveExample = document.getElementById('liveToast')\n\n  if (toastTrigger) {\n    const toastBootstrap = bootstrap.Toast.getOrCreateInstance(toastLiveExample)\n    toastTrigger.addEventListener('click', () => {\n      toastBootstrap.show()\n    })\n  }\n  // js-docs-end live-toast\n\n  // -------------------------------\n  // Alerts\n  // -------------------------------\n  // Used in 'Show live alert' example in docs or StackBlitz\n\n  // js-docs-start live-alert\n  const alertPlaceholder = document.getElementById('liveAlertPlaceholder')\n  const appendAlert = (message, type) => {\n    const wrapper = document.createElement('div')\n    wrapper.innerHTML = [\n      `<div class=\"alert alert-${type} alert-dismissible\" role=\"alert\">`,\n      `   <div>${message}</div>`,\n      '   <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"alert\" aria-label=\"Close\"></button>',\n      '</div>'\n    ].join('')\n\n    alertPlaceholder.append(wrapper)\n  }\n\n  const alertTrigger = document.getElementById('liveAlertBtn')\n  if (alertTrigger) {\n    alertTrigger.addEventListener('click', () => {\n      appendAlert('Nice, you triggered this alert message!', 'success')\n    })\n  }\n  // js-docs-end live-alert\n\n  // --------\n  // Carousels\n  // --------\n  // Instantiate all non-autoplaying carousels in docs or StackBlitz\n  document.querySelectorAll('.carousel:not([data-bs-ride=\"carousel\"])')\n    .forEach(carousel => {\n      bootstrap.Carousel.getOrCreateInstance(carousel)\n    })\n\n  // -------------------------------\n  // Checks & Radios\n  // -------------------------------\n  // Indeterminate checkbox example in docs and StackBlitz\n  document.querySelectorAll('.bd-example-indeterminate [type=\"checkbox\"]')\n    .forEach(checkbox => {\n      if (checkbox.id.includes('Indeterminate')) {\n        checkbox.indeterminate = true\n      }\n    })\n\n  // -------------------------------\n  // Links\n  // -------------------------------\n  // Disable empty links in docs examples only\n  document.querySelectorAll('.bd-content [href=\"#\"]')\n    .forEach(link => {\n      link.addEventListener('click', event => {\n        event.preventDefault()\n      })\n    })\n\n  // -------------------------------\n  // Modal\n  // -------------------------------\n  // Modal 'Varying modal content' example in docs and StackBlitz\n  // js-docs-start varying-modal-content\n  const exampleModal = document.getElementById('exampleModal')\n  if (exampleModal) {\n    exampleModal.addEventListener('show.bs.modal', event => {\n      // Button that triggered the modal\n      const button = event.relatedTarget\n      // Extract info from data-bs-* attributes\n      const recipient = button.getAttribute('data-bs-whatever')\n      // If necessary, you could initiate an Ajax request here\n      // and then do the updating in a callback.\n\n      // Update the modal's content.\n      const modalTitle = exampleModal.querySelector('.modal-title')\n      const modalBodyInput = exampleModal.querySelector('.modal-body input')\n\n      modalTitle.textContent = `New message to ${recipient}`\n      modalBodyInput.value = recipient\n    })\n  }\n  // js-docs-end varying-modal-content\n\n  // -------------------------------\n  // Offcanvas\n  // -------------------------------\n  // 'Offcanvas components' example in docs only\n  const myOffcanvas = document.querySelectorAll('.bd-example-offcanvas .offcanvas')\n  if (myOffcanvas) {\n    myOffcanvas.forEach(offcanvas => {\n      offcanvas.addEventListener('show.bs.offcanvas', event => {\n        event.preventDefault()\n      }, false)\n    })\n  }\n}\n"
  },
  {
    "path": "site/src/assets/search.js",
    "content": "// NOTICE!! DO NOT USE ANY OF THIS JAVASCRIPT\n// IT'S ALL JUST JUNK FOR OUR DOCS!\n// ++++++++++++++++++++++++++++++++++++++++++\n\n/*!\n * JavaScript for Bootstrap's docs (https://getbootstrap.com/)\n * Copyright 2024-2026 The Bootstrap Authors\n * Licensed under the Creative Commons Attribution 3.0 Unported License.\n * For details, see https://creativecommons.org/licenses/by/3.0/.\n */\n\nimport docsearch from '@docsearch/js'\n\n(() => {\n  // These values will be replaced by Astro's Vite plugin\n  const CONFIG = {\n    apiKey: '__API_KEY__',\n    indexName: '__INDEX_NAME__',\n    appId: '__APP_ID__'\n  }\n\n  const searchElement = document.getElementById('docsearch')\n\n  if (!searchElement) {\n    return\n  }\n\n  const siteDocsVersion = searchElement.getAttribute('data-bd-docs-version')\n\n  docsearch({\n    apiKey: CONFIG.apiKey,\n    indexName: CONFIG.indexName,\n    appId: CONFIG.appId,\n    container: searchElement,\n    searchParameters: {\n      facetFilters: [`version:${siteDocsVersion}`]\n    },\n    transformItems(items) {\n      return items.map(item => {\n        const liveUrl = 'https://getbootstrap.com/'\n\n        item.url = window.location.origin.startsWith(liveUrl) ?\n          // On production, return the result as is\n          item.url :\n          // On development or Netlify, replace `item.url` with a trailing slash,\n          // so that the result link is relative to the server root\n          item.url.replace(liveUrl, '/')\n\n        // Prevent jumping to first header\n        if (item.anchor === 'content') {\n          item.url = item.url.replace(/#content$/, '')\n          item.anchor = null\n        }\n\n        return item\n      })\n    }\n  })\n})()\n"
  },
  {
    "path": "site/src/assets/snippets.js",
    "content": "/*\n * JavaScript for Bootstrap's docs (https://getbootstrap.com/)\n * Copyright 2011-2026 The Bootstrap Authors\n * Licensed under the Creative Commons Attribution 3.0 Unported License.\n * For details, see https://creativecommons.org/licenses/by/3.0/.\n */\n\n// Note that this file is not published; we only include it in scripts.html\n// for StackBlitz to work\n\n/* eslint-disable import/no-unresolved */\nimport snippets from 'js/partials/snippets.js'\n/* eslint-enable import/no-unresolved */\n\nsnippets()\n"
  },
  {
    "path": "site/src/assets/stackblitz.js",
    "content": "// NOTICE!!! Initially embedded in our docs this JavaScript\n// file contains elements that can help you create reproducible\n// use cases in StackBlitz for instance.\n// In a real project please adapt this content to your needs.\n// ++++++++++++++++++++++++++++++++++++++++++\n\n/*!\n * JavaScript for Bootstrap's docs (https://getbootstrap.com/)\n * Copyright 2024-2026 The Bootstrap Authors\n * Licensed under the Creative Commons Attribution 3.0 Unported License.\n * For details, see https://creativecommons.org/licenses/by/3.0/.\n */\n\nimport sdk from '@stackblitz/sdk'\n// eslint-disable-next-line import/no-unresolved\nimport snippetsContent from './partials/snippets.js?raw'\n\n// These values will be replaced by Astro's Vite plugin\nconst CONFIG = {\n  cssCdn: '__CSS_CDN__',\n  jsBundleCdn: '__JS_BUNDLE_CDN__',\n  docsVersion: '__DOCS_VERSION__'\n}\n\n// Open in StackBlitz logic\ndocument.querySelectorAll('.btn-edit').forEach(btn => {\n  btn.addEventListener('click', event => {\n    const codeSnippet = event.target.closest('.bd-code-snippet')\n    const exampleEl = codeSnippet.querySelector('.bd-example')\n\n    const htmlSnippet = exampleEl.innerHTML\n    const jsSnippet = codeSnippet.querySelector('.btn-edit').getAttribute('data-sb-js-snippet')\n    // Get extra classes for this example\n    const classes = Array.from(exampleEl.classList).join(' ')\n\n    openBootstrapSnippet(htmlSnippet, jsSnippet, classes)\n  })\n})\n\nconst openBootstrapSnippet = (htmlSnippet, jsSnippet, classes) => {\n  const indexHtml = `<!doctype html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <link href=\"${CONFIG.cssCdn}\" rel=\"stylesheet\">\n    <link href=\"https://getbootstrap.com/docs/${CONFIG.docsVersion}/assets/css/docs.css\" rel=\"stylesheet\">\n    <title>Bootstrap Example</title>\n    <script defer src=\"${CONFIG.jsBundleCdn}\"></script>\n  </head>\n  <body class=\"p-3 m-0 border-0 ${classes}\">\n    <!-- Example Code Start-->\n${htmlSnippet.trimStart().replace(/^/gm, '    ').replace(/^ {4}$/gm, '').trimEnd()}\n    <!-- Example Code End -->\n  </body>\n</html>`\n\n  // Modify the snippets content to convert export default to a variable and invoke it\n  let modifiedSnippetsContent = ''\n\n  if (jsSnippet) {\n    // Replace export default with a variable assignment\n    modifiedSnippetsContent = snippetsContent.replace(\n      'export default () => {',\n      'const snippets_default = () => {'\n    )\n\n    // Add IIFE wrapper and execution\n    modifiedSnippetsContent = `(() => {\n  ${modifiedSnippetsContent}\n\n  // <stdin>\n  snippets_default();\n})();`\n  }\n\n  const project = {\n    files: {\n      'index.html': indexHtml,\n      ...(jsSnippet && { 'index.js': modifiedSnippetsContent })\n    },\n    title: 'Bootstrap Example',\n    description: `Official example from ${window.location.href}`,\n    template: jsSnippet ? 'javascript' : 'html',\n    tags: ['bootstrap']\n  }\n\n  sdk.openProject(project, { openFile: 'index.html' })\n}\n"
  },
  {
    "path": "site/src/components/Ads.astro",
    "content": "---\n---\n\n<script\n  is:inline\n  async\n  src=\"https://cdn.carbonads.com/carbon.js?serve=CKYIKKJL&placement=getbootstrapcom\"\n  id=\"_carbonads_js\"\n></script>\n"
  },
  {
    "path": "site/src/components/DocsScripts.astro",
    "content": "---\n---\n\n<script src=\"../assets/stackblitz.js\"></script>\n"
  },
  {
    "path": "site/src/components/DocsSidebar.astro",
    "content": "---\nimport { getData } from '@libs/data'\nimport { getConfig } from '@libs/config'\nimport { docsPages } from '@libs/content'\nimport { getSlug } from '@libs/utils'\n\nconst sidebar = getData('sidebar')\n---\n\n<nav class=\"bd-links w-100\" id=\"bd-docs-nav\" aria-label=\"Docs navigation\">\n  <ul class=\"bd-links-nav list-unstyled mb-0 pb-3 pb-md-2 pe-lg-2\">\n    {\n      sidebar.map((group) => {\n        const groupSlug = getSlug(group.title)\n\n        if (group.pages) {\n          return (\n            <li class=\"bd-links-group py-2\">\n              <strong class=\"bd-links-heading d-flex w-100 align-items-center fw-semibold\">\n                {group.icon && (\n                  <svg\n                    class=\"bi me-2\"\n                    style={group.icon_color && `color: var(--bs-${group.icon_color});`}\n                    aria-hidden=\"true\"\n                  >\n                    <use xlink:href={`#${group.icon}`} />\n                  </svg>\n                )}\n                {group.title}\n              </strong>\n              <ul class=\"list-unstyled fw-normal pb-2 small\">\n                {group.pages?.map((page) => {\n                  const docSlug = getSlug(page.title)\n                  const unversionedPageSlug = `${groupSlug}/${docSlug}`\n\n                  const url = `/docs/${getConfig().docs_version}/${unversionedPageSlug}`\n                  const active = Astro.params.slug === unversionedPageSlug\n\n                  const generatedPage = docsPages.find((page) => page.slug === unversionedPageSlug)\n\n                  // This test should not be necessary, see comments for `getSlug()` in `src/libs/utils.ts`.\n                  if (!generatedPage) {\n                    throw new Error(\n                      `The page '${page.title}' referenced in 'site/data/sidebar.yml' does not exist at '${url}'.`\n                    )\n                  }\n\n                  return (\n                    <li>\n                      <a\n                        href={url}\n                        class:list={['bd-links-link d-inline-block rounded', { active }]}\n                        aria-current={active ? 'page' : undefined}\n                      >\n                        {page.title}\n                      </a>\n                    </li>\n                  )\n                })}\n              </ul>\n            </li>\n          )\n        } else {\n          const active = Astro.params.slug === groupSlug\n\n          return (\n            <>\n              <li class=\"bd-links-span-all mt-1 mb-3 mx-4 border-top\" />\n              <li class=\"bd-links-span-all\">\n                <a\n                  href={`/docs/${getConfig().docs_version}/${groupSlug}/`}\n                  class:list={['bd-links-link d-inline-block rounded small', { active }]}\n                  aria-current={active ? 'page' : undefined}\n                >\n                  {group.title}\n                </a>\n              </li>\n            </>\n          )\n        }\n      })\n    }\n  </ul>\n</nav>\n"
  },
  {
    "path": "site/src/components/Scripts.astro",
    "content": "---\nimport { getVersionedBsJsProps } from '@libs/bootstrap'\nimport type { Layout } from '@libs/layout'\nimport DocsScripts from './DocsScripts.astro'\n\ninterface Props {\n  layout: Layout\n}\n\nconst { layout } = Astro.props\n---\n\n<script is:inline {...getVersionedBsJsProps()}></script>\n\n<script src=\"../assets/application.js\"></script>\n<script src=\"../assets/search.js\"></script>\n\n{layout === 'docs' && <DocsScripts />}\n"
  },
  {
    "path": "site/src/components/TableOfContents.astro",
    "content": "---\nimport type { MarkdownHeading } from 'astro'\nimport { generateToc, type TocEntry } from '@libs/toc'\n\ninterface Props {\n  headings?: MarkdownHeading[]\n  entries?: TocEntry[]\n}\n\nconst { entries, headings } = Astro.props\n\nconst toc = entries ? entries : generateToc(headings ?? [])\n---\n\n<ul>\n  {\n    toc.map(({ children, slug, text }) => {\n      return (\n        <li>\n          <a href={`#${slug}`}>{text}</a>\n          {children.length > 0 && <Astro.self entries={children} />}\n        </li>\n      )\n    })\n  }\n</ul>\n"
  },
  {
    "path": "site/src/components/footer/Footer.astro",
    "content": "---\nimport BootstrapWhiteFillIcon from '@components/icons/BootstrapWhiteFillIcon.astro'\nimport { getConfig } from '@libs/config'\nimport { getVersionedDocsPath } from '@libs/path'\n---\n\n<footer class=\"bd-footer py-4 py-md-5 mt-5 bg-body-tertiary\">\n  <div class=\"container py-4 py-md-5 px-4 px-md-3 text-body-secondary\">\n    <div class=\"row\">\n      <div class=\"col-lg-3 mb-3\">\n        <a\n          class=\"d-inline-flex align-items-center mb-2 text-body-emphasis text-decoration-none\"\n          href=\"/\"\n          aria-label=\"Bootstrap\"\n        >\n          <BootstrapWhiteFillIcon class=\"d-block me-2\" height={32} width={40} />\n          <span class=\"fs-5\">Bootstrap</span>\n        </a>\n        <ul class=\"list-unstyled small\">\n          <li class=\"mb-2\">\n            Designed and built with all the love in the world by the <a href={getVersionedDocsPath('about/team')}\n              >Bootstrap team</a\n            > with the help of <a href={`${getConfig().repo}/graphs/contributors`}>our contributors</a>.\n          </li>\n          <li class=\"mb-2\">\n            Code licensed <a href={`${getConfig().repo}/blob/main/LICENSE`} target=\"_blank\" rel=\"license noopener\"\n              >MIT</a\n            >, docs <a href=\"https://creativecommons.org/licenses/by/3.0/\" target=\"_blank\" rel=\"license noopener\"\n              >CC BY 3.0</a\n            >.\n          </li>\n          <li class=\"mb-2\">Currently v{getConfig().current_version}.</li>\n        </ul>\n      </div>\n      <div class=\"col-6 col-lg-2 offset-lg-1 mb-3\">\n        <h5>Links</h5>\n        <ul class=\"list-unstyled\">\n          <li class=\"mb-2\"><a href=\"/\">Home</a></li>\n          <li class=\"mb-2\"><a href={getVersionedDocsPath('/')}>Docs</a></li>\n          <li class=\"mb-2\"><a href={getVersionedDocsPath('examples')}>Examples</a></li>\n          <li class=\"mb-2\"><a href={getConfig().icons}>Icons</a></li>\n          <li class=\"mb-2\"><a href={getConfig().blog}>Blog</a></li>\n          <li class=\"mb-2\"><a href={getConfig().swag} target=\"_blank\" rel=\"noopener\">Swag Store</a></li>\n        </ul>\n      </div>\n      <div class=\"col-6 col-lg-2 mb-3\">\n        <h5>Guides</h5>\n        <ul class=\"list-unstyled\">\n          <li class=\"mb-2\"><a href={getVersionedDocsPath('getting-started')}>Getting started</a></li>\n          <li class=\"mb-2\"><a href={getVersionedDocsPath('examples/starter-template')}>Starter template</a></li>\n          <li class=\"mb-2\"><a href={getVersionedDocsPath('getting-started/webpack')}>Webpack</a></li>\n          <li class=\"mb-2\"><a href={getVersionedDocsPath('getting-started/parcel')}>Parcel</a></li>\n          <li class=\"mb-2\"><a href={getVersionedDocsPath('getting-started/vite')}>Vite</a></li>\n        </ul>\n      </div>\n      <div class=\"col-6 col-lg-2 mb-3\">\n        <h5>Projects</h5>\n        <ul class=\"list-unstyled\">\n          <li class=\"mb-2\">\n            <a href={`${getConfig().github_org}/bootstrap`} target=\"_blank\" rel=\"noopener\">Bootstrap 5</a>\n          </li>\n          <li class=\"mb-2\">\n            <a href={`${getConfig().github_org}/bootstrap/tree/v4-dev`} target=\"_blank\" rel=\"noopener\">Bootstrap 4</a>\n          </li>\n          <li class=\"mb-2\"><a href={`${getConfig().github_org}/icons`} target=\"_blank\" rel=\"noopener\">Icons</a></li>\n          <li class=\"mb-2\"><a href={`${getConfig().github_org}/rfs`} target=\"_blank\" rel=\"noopener\">RFS</a></li>\n          <li class=\"mb-2\">\n            <a href={`${getConfig().github_org}/examples`} target=\"_blank\" rel=\"noopener\">Examples repo</a>\n          </li>\n        </ul>\n      </div>\n      <div class=\"col-6 col-lg-2 mb-3\">\n        <h5>Community</h5>\n        <ul class=\"list-unstyled\">\n          <li class=\"mb-2\">\n            <a href={`${getConfig().github_org}/bootstrap/issues`} target=\"_blank\" rel=\"noopener\">Issues</a>\n          </li>\n          <li class=\"mb-2\">\n            <a href={`${getConfig().github_org}/bootstrap/discussions`} target=\"_blank\" rel=\"noopener\">Discussions</a>\n          </li>\n          <li class=\"mb-2\">\n            <a href=\"https://github.com/sponsors/twbs\" target=\"_blank\" rel=\"noopener\">Corporate sponsors</a>\n          </li>\n          <li class=\"mb-2\"><a href={getConfig().opencollective} target=\"_blank\" rel=\"noopener\">Open Collective</a></li>\n          <li class=\"mb-2\">\n            <a href=\"https://stackoverflow.com/questions/tagged/bootstrap-5\" target=\"_blank\" rel=\"noopener\"\n              >Stack Overflow</a\n            >\n          </li>\n        </ul>\n      </div>\n    </div>\n  </div>\n</footer>\n"
  },
  {
    "path": "site/src/components/head/Analytics.astro",
    "content": "---\nimport { getConfig } from '@libs/config'\n---\n\n<script is:inline defer src=\"https://cdn.usefathom.com/script.js\" data-site={getConfig().analytics.fathom_site}\n></script>\n"
  },
  {
    "path": "site/src/components/head/Favicons.astro",
    "content": "---\nimport { getVersionedDocsPath } from '@libs/path'\n---\n\n<link rel=\"apple-touch-icon\" href={getVersionedDocsPath('/assets/img/favicons/apple-touch-icon.png')} sizes=\"180x180\" />\n<link rel=\"icon\" href={getVersionedDocsPath('/assets/img/favicons/favicon-32x32.png')} sizes=\"32x32\" type=\"image/png\" />\n<link rel=\"icon\" href={getVersionedDocsPath('/assets/img/favicons/favicon-16x16.png')} sizes=\"16x16\" type=\"image/png\" />\n<link rel=\"manifest\" href={getVersionedDocsPath('/assets/img/favicons/manifest.json')} />\n<link rel=\"mask-icon\" href={getVersionedDocsPath('/assets/img/favicons/safari-pinned-tab.svg')} color=\"#712cf9\" />\n<link rel=\"icon\" href={getVersionedDocsPath('/assets/img/favicons/favicon.ico')} />\n<meta name=\"theme-color\" content=\"#712cf9\" />\n"
  },
  {
    "path": "site/src/components/head/Head.astro",
    "content": "---\nimport { getConfig } from '@libs/config'\nimport { getVersionedDocsPath } from '@libs/path'\nimport type { Layout } from '@libs/layout'\nimport Stylesheet from '@components/head/Stylesheet.astro'\nimport Favicons from '@components/head/Favicons.astro'\nimport Social from '@components/head/Social.astro'\nimport Analytics from '@components/head/Analytics.astro'\n\ninterface Props {\n  description: string\n  direction?: 'rtl'\n  layout: Layout\n  robots: string | undefined\n  thumbnail: string\n  title: string\n}\n\nconst { description, direction, layout, robots, thumbnail, title } = Astro.props\n\nconst canonicalUrl = new URL(Astro.url.pathname, Astro.site)\n\nconst isHome = Astro.url.pathname === '/'\nconst pageTitle = isHome\n  ? `${getConfig().title} · ${getConfig().subtitle}`\n  : `${title} · ${getConfig().title} v${getConfig().docs_version}`\n\n// Dynamic imports to avoid build-time processing\nconst Scss = import.meta.env.PROD ? null : await import('@components/head/Scss.astro')\nconst ScssProd = import.meta.env.PROD ? await import('@components/head/ScssProd.astro') : null\n---\n\n<meta charset=\"UTF-8\" />\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n\n<meta name=\"description\" content={description} />\n\n<meta name=\"author\" content={getConfig().authors} />\n<meta name=\"generator\" content={Astro.generator} />\n<meta name=\"docsearch:language\" content=\"en\" />\n<meta name=\"docsearch:version\" content={getConfig().docs_version} />\n\n<link rel=\"canonical\" href={canonicalUrl} />\n\n<link rel=\"preconnect\" href=`https://${getConfig().algolia.app_id}-dsn.algolia.net` crossorigin />\n\n<title>{pageTitle}</title>\n\n{robots && <meta name=\"robots\" content={robots} />}\n\n<script is:inline src={getVersionedDocsPath('assets/js/color-modes.js')}></script>\n\n{import.meta.env.PROD && ScssProd && (\n  <Stylesheet direction={direction} layout={layout} />\n  <ScssProd.default />\n)}\n\n{!import.meta.env.PROD && Scss && (\n  <Scss.default />\n)}\n\n<Favicons />\n<Social description={description} layout={layout} thumbnail={thumbnail} title={title} />\n<Analytics />\n"
  },
  {
    "path": "site/src/components/head/Scss.astro",
    "content": "---\n---\n\n<style is:global lang=\"scss\">\n  @import '../../../../scss/bootstrap.scss';\n  @import '../../scss/docs';\n  @import '../../scss/docs_search';\n</style>\n"
  },
  {
    "path": "site/src/components/head/ScssProd.astro",
    "content": "---\n---\n\n<style is:global lang=\"scss\">\n  @import '../../scss/docs';\n  @import '../../scss/docs_search';\n</style>\n"
  },
  {
    "path": "site/src/components/head/Social.astro",
    "content": "---\nimport { getConfig } from '@libs/config'\nimport { getVersionedDocsPath } from '@libs/path'\nimport { getStaticImageSize } from '@libs/image'\nimport type { Layout } from '@libs/layout'\n\ninterface Props {\n  description: string\n  layout: Layout\n  thumbnail: string\n  title: string\n}\n\nconst { description, layout, thumbnail, title } = Astro.props\n\nconst socialImageUrl = new URL(getVersionedDocsPath(`assets/${thumbnail}`), Astro.site)\nconst socialImageSize = await getStaticImageSize(`/docs/[version]/assets/${thumbnail}`)\n---\n\n<meta name=\"twitter:card\" content=\"summary_large_image\" />\n<meta name=\"twitter:site\" content=`@${getConfig().x}` />\n<meta name=\"twitter:creator\" content=`@${getConfig().x}` />\n\n<meta property=\"og:url\" content={new URL(Astro.url.pathname, Astro.site)} />\n<meta property=\"og:title\" content={title} />\n<meta property=\"og:description\" content={description} />\n<meta property=\"og:type\" content={layout === 'docs' ? 'article' : 'website'} />\n<meta property=\"og:image\" content={socialImageUrl} />\n<meta property=\"og:image:type\" content=\"image/png\" />\n<meta property=\"og:image:width\" content={String(socialImageSize.width)} />\n<meta property=\"og:image:height\" content={String(socialImageSize.height)} />\n"
  },
  {
    "path": "site/src/components/head/Stylesheet.astro",
    "content": "---\nimport { getVersionedBsCssProps } from '@libs/bootstrap'\nimport type { Layout } from '@libs/layout'\n\ninterface Props {\n  direction?: 'rtl'\n  layout: Layout\n}\n\nconst { direction } = Astro.props\n---\n\n<link {...getVersionedBsCssProps(direction)} />\n"
  },
  {
    "path": "site/src/components/header/Header.astro",
    "content": "---\nimport type { CollectionEntry } from 'astro:content'\nimport type { Layout } from '@libs/layout'\nimport Skippy from '@components/header/Skippy.astro'\nimport Symbols from '@components/icons/Symbols.astro'\nimport Navigation from '@components/header/Navigation.astro'\n\ninterface Props {\n  addedIn?: CollectionEntry<'docs'>['data']['added']\n  layout: Layout\n  title: string\n}\n\nconst { addedIn, layout, title } = Astro.props\n---\n\n<Skippy layout={layout} />\n<Symbols />\n\n<Navigation layout={layout} title={title} addedIn={addedIn} />\n"
  },
  {
    "path": "site/src/components/header/LinkItem.astro",
    "content": "---\ninterface Props {\n  active?: boolean\n  class?: string\n  href: string\n  rel?: HTMLAnchorElement['rel']\n  target?: HTMLAnchorElement['target']\n  track?: boolean\n}\n\nconst { active, class: className, track, ...props } = Astro.props\n\nconst content = await Astro.slots.render('default')\n---\n\n<li class=\"nav-item col-6 col-lg-auto\">\n  <a\n    aria-current={active ? true : undefined}\n    class:list={['nav-link py-2 px-0 px-lg-2', className, { active }]}\n    {...props}\n  >\n    <slot />\n  </a>\n</li>\n"
  },
  {
    "path": "site/src/components/header/Navigation.astro",
    "content": "---\nimport type { CollectionEntry } from 'astro:content'\nimport { getConfig } from '@libs/config'\nimport { getVersionedDocsPath } from '@libs/path'\nimport type { Layout } from '@libs/layout'\nimport BootstrapWhiteFillIcon from '@components/icons/BootstrapWhiteFillIcon.astro'\nimport GitHubIcon from '@components/icons/GitHubIcon.astro'\nimport HamburgerIcon from '@components/icons/HamburgerIcon.astro'\nimport LinkItem from '@components/header/LinkItem.astro'\nimport OpenCollectiveIcon from '@components/icons/OpenCollectiveIcon.astro'\nimport XIcon from '@components/icons/XIcon.astro'\nimport Versions from '@components/header/Versions.astro'\nimport ThemeToggler from '@layouts/partials/ThemeToggler.astro'\n\ninterface Props {\n  addedIn?: CollectionEntry<'docs'>['data']['added']\n  layout: Layout\n  title: string\n}\n\nconst { addedIn, layout, title } = Astro.props\n---\n\n<header class=\"navbar navbar-expand-lg bd-navbar sticky-top\">\n  <nav class=\"container-xxl bd-gutter flex-wrap flex-lg-nowrap\" aria-label=\"Main navigation\">\n    {\n      layout === 'docs' && (\n        <div class=\"bd-navbar-toggle\">\n          <button\n            class=\"navbar-toggler p-2\"\n            type=\"button\"\n            data-bs-toggle=\"offcanvas\"\n            data-bs-target=\"#bdSidebar\"\n            aria-controls=\"bdSidebar\"\n            aria-label=\"Toggle docs navigation\"\n          >\n            <HamburgerIcon class=\"bi\" height={24} width={24} />\n            <span class=\"d-none fs-6 pe-1\">Browse</span>\n          </button>\n        </div>\n      )\n    }\n    {layout !== 'docs' && <div class=\"d-lg-none\" style=\"width: 4.25rem;\" />}\n\n    <a class=\"navbar-brand p-0 me-0 me-lg-2\" href=\"/\" aria-label=\"Bootstrap\">\n      <BootstrapWhiteFillIcon class=\"d-block my-1\" height={32} width={40} />\n    </a>\n\n    <div class=\"d-flex\">\n      <div class=\"bd-search\" id=\"docsearch\" data-bd-docs-version={getConfig().docs_version}></div>\n\n      <button\n        class=\"navbar-toggler d-flex d-lg-none order-3 p-2\"\n        type=\"button\"\n        data-bs-toggle=\"offcanvas\"\n        data-bs-target=\"#bdNavbar\"\n        aria-controls=\"bdNavbar\"\n        aria-label=\"Toggle navigation\"\n      >\n        <svg class=\"bi\" aria-hidden=\"true\"><use xlink:href=\"#three-dots\"></use></svg>\n      </button>\n    </div>\n\n    <div\n      class=\"offcanvas-lg offcanvas-end flex-grow-1\"\n      tabindex=\"-1\"\n      id=\"bdNavbar\"\n      aria-labelledby=\"bdNavbarOffcanvasLabel\"\n    >\n      <div class=\"offcanvas-header px-4 pb-0\">\n        <h5 class=\"offcanvas-title text-white\" id=\"bdNavbarOffcanvasLabel\">Bootstrap</h5>\n        <button\n          type=\"button\"\n          class=\"btn-close btn-close-white\"\n          data-bs-dismiss=\"offcanvas\"\n          aria-label=\"Close\"\n          data-bs-target=\"#bdNavbar\"></button>\n      </div>\n\n      <div class=\"offcanvas-body p-4 pt-0 p-lg-0\">\n        <hr class=\"d-lg-none text-white-50\" />\n        <ul class=\"navbar-nav flex-row flex-wrap bd-navbar-nav\">\n          <LinkItem active={layout === 'docs'} href={getVersionedDocsPath('getting-started/introduction/')} track>\n            Docs\n          </LinkItem>\n          <LinkItem active={title === 'Examples'} href={getVersionedDocsPath('examples/')} track>Examples</LinkItem>\n          <LinkItem href={getConfig().icons} target=\"_blank\" rel=\"noopener\" track>Icons</LinkItem>\n          <LinkItem href={getConfig().blog} target=\"_blank\" rel=\"noopener\" track>Blog</LinkItem>\n        </ul>\n\n        <hr class=\"d-lg-none text-white-50\" />\n\n        <ul class=\"navbar-nav flex-row flex-wrap ms-md-auto\">\n          <LinkItem class=\"nav-link py-2 px-0 px-lg-2\" href={getConfig().github_org} target=\"_blank\" rel=\"noopener\">\n            <GitHubIcon class=\"navbar-nav-svg\" height={16} width={16} />\n            <small class=\"d-lg-none ms-2\">GitHub</small>\n          </LinkItem>\n          <LinkItem\n            class=\"nav-link py-2 px-0 px-lg-2\"\n            href={`https://x.com/${getConfig().x}`}\n            target=\"_blank\"\n            rel=\"noopener\"\n          >\n            <XIcon class=\"navbar-nav-svg\" height={16} width={16} />\n            <small class=\"d-lg-none ms-2\">X</small>\n          </LinkItem>\n          <LinkItem class=\"nav-link py-2 px-0 px-lg-2\" href={getConfig().opencollective} target=\"_blank\" rel=\"noopener\">\n            <OpenCollectiveIcon class=\"navbar-nav-svg\" height={16} width={16} />\n            <small class=\"d-lg-none ms-2\">Open Collective</small>\n          </LinkItem>\n          <li class=\"nav-item py-2 py-lg-1 col-12 col-lg-auto\">\n            <div class=\"vr d-none d-lg-flex h-100 mx-lg-2 text-white\"></div>\n            <hr class=\"d-lg-none my-2 text-white-50\" />\n          </li>\n\n          <Versions layout={layout} addedIn={addedIn} />\n\n          <li class=\"nav-item py-2 py-lg-1 col-12 col-lg-auto\">\n            <div class=\"vr d-none d-lg-flex h-100 mx-lg-2 text-white\"></div>\n            <hr class=\"d-lg-none my-2 text-white-50\" />\n          </li>\n\n          <li class=\"nav-item dropdown\">\n            <ThemeToggler layout={layout} />\n          </li>\n        </ul>\n      </div>\n    </div>\n  </nav>\n</header>\n"
  },
  {
    "path": "site/src/components/header/Skippy.astro",
    "content": "---\nimport type { Layout } from '@libs/layout'\n\ninterface Props {\n  layout: Layout\n}\n\nconst { layout } = Astro.props\n---\n\n<div class=\"skippy visually-hidden-focusable overflow-hidden\">\n  <div class=\"container-xl\">\n    <a class=\"d-inline-flex p-2 m-1\" href=\"#content\">Skip to main content</a>\n    {\n      layout === 'docs' && (\n        <a class=\"d-none d-md-inline-flex p-2 m-1\" href=\"#bd-docs-nav\">\n          Skip to docs navigation\n        </a>\n      )\n    }\n  </div>\n</div>\n"
  },
  {
    "path": "site/src/components/header/Versions.astro",
    "content": "---\nimport type { CollectionEntry } from 'astro:content'\nimport { getConfig } from '@libs/config'\nimport type { Layout } from '@libs/layout'\nimport { getVersionedDocsPath } from '@libs/path'\n\ninterface Props {\n  addedIn?: CollectionEntry<'docs'>['data']['added']\n  layout: Layout\n}\n\nconst { addedIn, layout } = Astro.props\nconst { slug, version } = Astro.params\n\nconst isHome = Astro.url.pathname === '/'\n\nlet versionsLink = ''\n\nif (layout === 'docs' && version === getConfig().docs_version) {\n  versionsLink = `${slug}/`\n} else if (layout === 'single' && Astro.url.pathname.startsWith(getVersionedDocsPath(''))) {\n  versionsLink = Astro.url.pathname.replace(getVersionedDocsPath(''), '')\n}\n\nconst addedIn51 = addedIn?.version === '5.1'\nconst addedIn52 = addedIn?.version === '5.2'\nconst addedIn53 = addedIn?.version === '5.3'\n---\n\n<li class=\"nav-item dropdown\">\n  <button\n    type=\"button\"\n    class=\"btn btn-link nav-link py-2 px-0 px-lg-2 dropdown-toggle\"\n    data-bs-toggle=\"dropdown\"\n    aria-expanded=\"false\"\n    data-bs-display=\"static\"\n  >\n    <span class=\"d-lg-none\" aria-hidden=\"true\">Bootstrap</span><span class=\"visually-hidden\">Bootstrap&nbsp;</span> v{\n      getConfig().docs_version\n    }\n    <span class=\"visually-hidden\">(switch to other versions)</span>\n  </button>\n  <ul class=\"dropdown-menu dropdown-menu-end\">\n    <li><h6 class=\"dropdown-header\">v5 releases</h6></li>\n    <li>\n      <a\n        class=\"dropdown-item d-flex align-items-center justify-content-between active\"\n        aria-current=\"true\"\n        href={isHome ? '/' : `/docs/${getConfig().docs_version}/${versionsLink}`}\n      >\n        Latest ({getConfig().docs_version}.x)\n        <svg class=\"bi\" aria-hidden=\"true\"><use xlink:href=\"#check2\"></use></svg>\n      </a>\n    </li>\n    <li>\n      {\n        addedIn53 ? (\n          <div class=\"dropdown-item disabled\">v5.2.3</div>\n        ) : (\n          <a class=\"dropdown-item\" href={`https://getbootstrap.com/docs/5.2/${versionsLink}`}>\n            v5.2.3\n          </a>\n        )\n      }\n    </li>\n    <li>\n      {\n        addedIn52 || addedIn53 ? (\n          <div class=\"dropdown-item disabled\">v5.1.3</div>\n        ) : (\n          <a class=\"dropdown-item\" href={`https://getbootstrap.com/docs/5.1/${versionsLink}`}>\n            v5.1.3\n          </a>\n        )\n      }\n    </li>\n    <li>\n      {\n        addedIn51 || addedIn52 || addedIn53 ? (\n          <div class=\"dropdown-item disabled\">v5.0.2</div>\n        ) : (\n          <a class=\"dropdown-item\" href={`https://getbootstrap.com/docs/5.0/${versionsLink}`}>\n            v5.0.2\n          </a>\n        )\n      }\n    </li>\n    <li><hr class=\"dropdown-divider\" /></li>\n    <li><h6 class=\"dropdown-header\">Previous releases</h6></li>\n    <li><a class=\"dropdown-item\" href=\"https://getbootstrap.com/docs/4.6/\">v4.6.x</a></li>\n    <li><a class=\"dropdown-item\" href=\"https://getbootstrap.com/docs/3.4/\">v3.4.1</a></li>\n    <li><a class=\"dropdown-item\" href=\"https://getbootstrap.com/2.3.2/\">v2.3.2</a></li>\n    <li><hr class=\"dropdown-divider\" /></li>\n    <li><a class=\"dropdown-item\" href=\"/docs/versions/\">All versions</a></li>\n  </ul>\n</li>\n"
  },
  {
    "path": "site/src/components/home/CSSVariables.astro",
    "content": "---\nimport { getVersionedDocsPath } from '@libs/path'\nimport Code from '@shortcodes/Code.astro'\n---\n\n<section class=\"row g-md-5 pb-md-5 mb-5 align-items-center\">\n  <div class=\"col-lg-8 mb-5\">\n    <div class=\"masthead-followup-icon d-inline-block mb-3\" style=\"--bg-rgb: var(--bd-pink-rgb);\">\n      <svg class=\"bi fs-1\" aria-hidden=\"true\"><use xlink:href=\"#braces\"></use></svg>\n    </div>\n    <h2 class=\"display-5 mb-3 fw-semibold lh-sm\">Build and extend in real-time with CSS&nbsp;variables</h2>\n    <p class=\"lead fw-normal\">\n      Bootstrap 5 is evolving with each release to better utilize CSS variables for global theme styles, individual\n      components, and even utilities. We provide dozens of variables for colors, font styles, and more at a <code\n        >:root</code\n      > level for use anywhere. On components and utilities, CSS variables are scoped to the relevant class and can easily\n      be modified.\n    </p>\n    <p class=\"d-flex flex-column lead fw-normal mb-0\">\n      <a href={getVersionedDocsPath('customize/css-variables')} class=\"icon-link icon-link-hover fw-semibold mb-3\">\n        Learn more about CSS variables\n        <svg class=\"bi\" aria-hidden=\"true\"><use xlink:href=\"#arrow-right\"></use></svg>\n      </a>\n    </p>\n  </div>\n  <div class=\"row gx-md-5\">\n    <div class=\"col-lg-6 mb-3\">\n      <h3 class=\"fw-semibold\">Using CSS variables</h3>\n      <p>\n        Use any of our <a href={getVersionedDocsPath('customize/css-variables/#root-variables')}\n          >global <code>:root</code> variables</a\n        > to write new styles. CSS variables use the <code>var(--bs-variableName)</code> syntax and can be inherited by children\n        elements.\n      </p>\n      <Code\n        code={`.component {\n  color: var(--bs-gray-800);\n  background-color: var(--bs-gray-100);\n  border: 1px solid var(--bs-gray-200);\n  border-radius: .25rem;\n}\n\n.component-header {\n  color: var(--bs-purple);\n}`}\n        lang=\"scss\"\n      />\n    </div>\n    <div class=\"col-lg-6 mb-3\">\n      <h3 class=\"fw-semibold\">Customizing via CSS variables</h3>\n      <p>\n        Override global, component, or utility class variables to customize Bootstrap just how you like. No need to\n        redeclare each rule, just a new variable value.\n      </p>\n      <Code\n        code={`body {\n  --bs-body-font-family: var(--bs-font-monospace);\n  --bs-body-line-height: 1.4;\n  --bs-body-bg: var(--bs-gray-100);\n}\n\n.table {\n  --bs-table-color: var(--bs-gray-600);\n  --bs-table-bg: var(--bs-gray-100);\n  --bs-table-border-color: transparent;\n}`}\n        lang=\"scss\"\n      />\n    </div>\n  </div>\n</section>\n"
  },
  {
    "path": "site/src/components/home/ComponentUtilities.astro",
    "content": "---\nimport { getVersionedDocsPath } from '@libs/path'\nimport Code from '@shortcodes/Code.astro'\n---\n\n<section class=\"pb-md-5 mb-5\">\n  <div class=\"col-lg-8 mb-5\">\n    <div class=\"masthead-followup-icon d-inline-block mb-3 me-2\" style=\"--bg-rgb: var(--bs-danger-rgb);\">\n      <svg class=\"bi fs-1\" aria-hidden=\"true\"><use xlink:href=\"#menu-button-wide-fill\"></use></svg>\n    </div>\n    <svg class=\"bi me-2 fs-2 text-body-secondary\" aria-hidden=\"true\"><use xlink:href=\"#plus\"></use></svg>\n    <div class=\"masthead-followup-icon d-inline-block mb-3\" style=\"--bg-rgb: var(--bs-info-rgb);\">\n      <svg class=\"bi fs-1\" aria-hidden=\"true\"><use xlink:href=\"#braces-asterisk\"></use></svg>\n    </div>\n    <h2 class=\"display-5 mb-3 fw-semibold lh-sm\">Components, meet the Utility&nbsp;API</h2>\n    <p class=\"lead fw-normal\">\n      New in Bootstrap 5, our utilities are now generated by our <a href={getVersionedDocsPath('utilities/api')}\n        >Utility API</a\n      >. We built it as a feature-packed Sass map that can be quickly and easily customized. It's never been easier to\n      add, remove, or modify any utility classes. Make utilities responsive, add pseudo-class variants, and give them\n      custom names.\n    </p>\n  </div>\n  <div class=\"row gx-md-5\">\n    <div class=\"col-lg-6\">\n      <h3 class=\"fw-semibold\">Quickly customize components</h3>\n      <p>\n        Apply any of our included utility classes to our components to customize their appearance, like the navigation\n        example below. There are hundreds of classes available—from <a href={getVersionedDocsPath('utilities/position')}\n          >positioning</a\n        > and <a href={getVersionedDocsPath('utilities/sizing')}>sizing</a> to <a\n          href={getVersionedDocsPath('utilities/colors')}>colors</a\n        > and <a href={getVersionedDocsPath('utilities/shadows')}>effects</a>. Mix them with CSS variable overrides for\n        even more control.\n      </p>\n      <div class=\"p-4 border rounded-3 mb-4\">\n        <ul class=\"nav nav-pills mb-4\" id=\"pillNav\" role=\"tablist\">\n          <li class=\"nav-item\" role=\"presentation\">\n            <button\n              class=\"nav-link active\"\n              id=\"home-tab\"\n              data-bs-toggle=\"tab\"\n              type=\"button\"\n              role=\"tab\"\n              aria-selected=\"true\">Home</button\n            >\n          </li>\n          <li class=\"nav-item\" role=\"presentation\">\n            <button\n              class=\"nav-link\"\n              id=\"profile-tab\"\n              data-bs-toggle=\"tab\"\n              type=\"button\"\n              role=\"tab\"\n              aria-selected=\"false\">Profile</button\n            >\n          </li>\n          <li class=\"nav-item\" role=\"presentation\">\n            <button\n              class=\"nav-link\"\n              id=\"contact-tab\"\n              data-bs-toggle=\"tab\"\n              type=\"button\"\n              role=\"tab\"\n              aria-selected=\"false\">Contact</button\n            >\n          </li>\n        </ul>\n        <ul\n          class=\"nav nav-pills nav-fill gap-2 p-1 small bg-primary rounded-5 shadow-sm\"\n          id=\"pillNav2\"\n          role=\"tablist\"\n          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);\"\n        >\n          <li class=\"nav-item\" role=\"presentation\">\n            <button\n              class=\"nav-link active rounded-5\"\n              id=\"home-tab2\"\n              data-bs-toggle=\"tab\"\n              type=\"button\"\n              role=\"tab\"\n              aria-selected=\"true\">Home</button\n            >\n          </li>\n          <li class=\"nav-item\" role=\"presentation\">\n            <button\n              class=\"nav-link rounded-5\"\n              id=\"profile-tab2\"\n              data-bs-toggle=\"tab\"\n              type=\"button\"\n              role=\"tab\"\n              aria-selected=\"false\">Profile</button\n            >\n          </li>\n          <li class=\"nav-item\" role=\"presentation\">\n            <button\n              class=\"nav-link rounded-5\"\n              id=\"contact-tab2\"\n              data-bs-toggle=\"tab\"\n              type=\"button\"\n              role=\"tab\"\n              aria-selected=\"false\">Contact</button\n            >\n          </li>\n        </ul>\n      </div>\n      <Code\n        code={`<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);\">\n  <li class=\"nav-item\" role=\"presentation\">\n    <button class=\"nav-link active rounded-5\" id=\"home-tab2\" data-bs-toggle=\"tab\" type=\"button\" role=\"tab\" aria-selected=\"true\">Home</button>\n  </li>\n  <li class=\"nav-item\" role=\"presentation\">\n    <button class=\"nav-link rounded-5\" id=\"profile-tab2\" data-bs-toggle=\"tab\" type=\"button\" role=\"tab\" aria-selected=\"false\">Profile</button>\n  </li>\n  <li class=\"nav-item\" role=\"presentation\">\n    <button class=\"nav-link rounded-5\" id=\"contact-tab2\" data-bs-toggle=\"tab\" type=\"button\" role=\"tab\" aria-selected=\"false\">Contact</button>\n  </li>\n</ul>`}\n        lang=\"html\"\n      />\n      <p class=\"d-flex mb-md-0\">\n        <a href={getVersionedDocsPath('examples/#snippets')} class=\"icon-link icon-link-hover fw-semibold\">\n          Explore customized components\n          <svg class=\"bi\" aria-hidden=\"true\"><use xlink:href=\"#arrow-right\"></use></svg>\n        </a>\n      </p>\n    </div>\n    <div class=\"col-lg-6\">\n      <h3 class=\"fw-semibold\">Create and extend utilities</h3>\n      <p>\n        Use Bootstrap's utility API to modify any of our included utilities or create your own custom utilities for any\n        project. Import Bootstrap first, then use Sass map functions to modify, add, or remove utilities.\n      </p>\n      <Code\n        code={`@import \"bootstrap/scss/bootstrap\";\n\n$utilities: map-merge(\n  $utilities,\n  (\n    \"cursor\": (\n      property: cursor,\n      class: cursor,\n      responsive: true,\n      values: auto pointer grab,\n    )\n  )\n);`}\n        lang=\"scss\"\n      />\n      <p class=\"d-flex mb-md-0\">\n        <a href={getVersionedDocsPath('utilities/api/')} class=\"icon-link icon-link-hover fw-semibold mb-3\">\n          Explore the utility API\n          <svg class=\"bi\" aria-hidden=\"true\"><use xlink:href=\"#arrow-right\"></use></svg>\n        </a>\n      </p>\n    </div>\n  </div>\n</section>\n"
  },
  {
    "path": "site/src/components/home/Customize.astro",
    "content": "---\nimport { getVersionedDocsPath } from '@libs/path'\nimport Code from '@shortcodes/Code.astro'\n---\n\n<section class=\"col-lg-7 mb-5\">\n  <div class=\"masthead-followup-icon d-inline-block mb-3\" style=\"--bg-rgb: var(--bs-primary-rgb);\">\n    <svg class=\"bi fs-1\" aria-hidden=\"true\"><use xlink:href=\"#palette2\"></use></svg>\n  </div>\n  <h2 class=\"display-5 mb-3 fw-semibold lh-sm\">Customize everything with&nbsp;Sass</h2>\n  <p class=\"lead fw-normal\">\n    Bootstrap utilizes Sass for a modular and customizable architecture. Import only the components you need, enable\n    global options like gradients and shadows, and write your own CSS with our variables, maps, functions, and mixins.\n  </p>\n  <p class=\"d-flex lead fw-normal\">\n    <a href={getVersionedDocsPath('customize/overview/')} class=\"icon-link icon-link-hover fw-semibold\">\n      Learn more about customizing\n      <svg class=\"bi\" aria-hidden=\"true\"><use xlink:href=\"#arrow-right\"></use></svg>\n    </a>\n  </p>\n</section>\n\n<section class=\"row g-md-5 mb-5 pb-md-5\">\n  <div class=\"col-lg-6\">\n    <h3>Include all of Bootstrap’s Sass</h3>\n    <p>Import one stylesheet and you're off to the races with every feature of our CSS.</p>\n    <Code\n      code={`// Variable overrides first\n$primary: #900;\n$enable-shadows: true;\n$prefix: \"mo-\";\n\n// Then import Bootstrap\n@import \"../node_modules/bootstrap/scss/bootstrap\";`}\n      lang=\"scss\"\n    />\n    <p>Learn more about our <a href={getVersionedDocsPath('customize/options')}>global Sass options</a>.</p>\n  </div>\n  <div class=\"col-lg-6\">\n    <h3>Include what you need</h3>\n    <p>The easiest way to customize Bootstrap—include only the CSS you need.</p>\n    <Code\n      code={`// Functions first\n@import \"../node_modules/bootstrap/scss/functions\";\n\n// Variable overrides second\n$primary: #900;\n$enable-shadows: true;\n$prefix: \"mo-\";\n\n// Required Bootstrap imports\n@import \"../node_modules/bootstrap/scss/variables\";\n@import \"../node_modules/bootstrap/scss/variables-dark\";\n@import \"../node_modules/bootstrap/scss/maps\";\n@import \"../node_modules/bootstrap/scss/mixins\";\n@import \"../node_modules/bootstrap/scss/root\";\n\n// Optional components\n@import \"../node_modules/bootstrap/scss/utilities\";\n@import \"../node_modules/bootstrap/scss/reboot\";\n@import \"../node_modules/bootstrap/scss/containers\";\n@import \"../node_modules/bootstrap/scss/grid\";\n@import \"../node_modules/bootstrap/scss/helpers\";\n@import \"../node_modules/bootstrap/scss/utilities/api\";`}\n      lang=\"scss\"\n    />\n    <p>Learn more about <a href={getVersionedDocsPath('customize/sass')}>using Bootstrap with Sass</a>.</p>\n  </div>\n</section>\n"
  },
  {
    "path": "site/src/components/home/GetStarted.astro",
    "content": "---\nimport { getConfig } from '@libs/config'\nimport { getVersionedDocsPath } from '@libs/path'\nimport Code from '@shortcodes/Code.astro'\n---\n\n<div class=\"col-lg-7 mx-auto pb-3 mb-3 mb-md-5 text-md-center\">\n  <div class=\"masthead-followup-icon d-inline-block mb-3\" style=\"--bg-rgb: var(--bd-violet-rgb);\">\n    <svg class=\"bi fs-1\" aria-hidden=\"true\"><use xlink:href=\"#code\"></use></svg>\n  </div>\n  <h2 class=\"display-5 mb-3 fw-semibold lh-sm\">Get started any way you&nbsp;want</h2>\n  <p class=\"lead fw-normal\">\n    Jump right into building with Bootstrap—use the CDN, install it via package manager, or download the source code.\n  </p>\n  <p class=\"d-flex justify-content-md-center lead fw-normal\">\n    <a href={getVersionedDocsPath('getting-started/download/')} class=\"icon-link icon-link-hover fw-semibold ps-md-4\">\n      Read installation docs\n      <svg class=\"bi\" aria-hidden=\"true\"><use xlink:href=\"#arrow-right\"></use></svg>\n    </a>\n  </p>\n</div>\n\n<section class=\"row g-3 g-md-5 mb-5 pb-5 justify-content-center\">\n  <div class=\"col-lg-6 py-lg-4 pe-lg-5\">\n    <svg class=\"bi mb-2 fs-2 text-body-secondary\" aria-hidden=\"true\"><use xlink:href=\"#box-seam\"></use></svg>\n    <h3 class=\"fw-semibold\">Install via package manager</h3>\n    <p class=\"pe-lg-5\">\n      Install Bootstrap’s source Sass and JavaScript files via npm, RubyGems, Composer, or Meteor. Package-managed\n      installs don’t include documentation or our full build scripts. You can also <a\n        href=\"https://github.com/twbs/examples/\">use any demo from our Examples repo</a\n      > to quickly jumpstart Bootstrap projects.\n    </p>\n    <Code code={`npm install bootstrap@${getConfig().current_version}`} lang=\"sh\" />\n    <Code code={`gem install bootstrap -v ${getConfig().current_ruby_version}`} lang=\"sh\" />\n    <p>\n      <a href={getVersionedDocsPath('getting-started/download')}>Read our installation docs</a> for more info and additional\n      package managers.\n    </p>\n  </div>\n  <div class=\"col-lg-6 py-lg-4 ps-lg-5 border-lg-start\">\n    <svg class=\"bi mb-2 fs-2 text-body-secondary\" aria-hidden=\"true\"><use xlink:href=\"#globe2\"></use></svg>\n    <h3 class=\"fw-semibold\">Include via CDN</h3>\n    <p class=\"pe-lg-5\">\n      When you only need to include Bootstrap’s compiled CSS or JS, you can use <a\n        href=\"https://www.jsdelivr.com/package/npm/bootstrap\">jsDelivr</a\n      >. See it in action with our simple <a href={getVersionedDocsPath('getting-started/introduction/#quick-start')}\n        >quick start</a\n      >, or <a href={getVersionedDocsPath('examples')}>browse the examples</a> to jumpstart your next project. You can also\n      choose to include Popper and our JS <a href={getVersionedDocsPath('getting-started/introduction/#separate')}\n        >separately</a\n      >.\n    </p>\n    <Code\n      code={`<link href=\"${getConfig().cdn.css}\" rel=\"stylesheet\" integrity=\"${\n        getConfig().cdn.css_hash\n      }\" crossorigin=\"anonymous\">`}\n      lang=\"html\"\n    />\n    <Code\n      code={`<script src=\"${getConfig().cdn.js_bundle}\" integrity=\"${\n        getConfig().cdn.js_bundle_hash\n      }\" crossorigin=\"anonymous\"></script>`}\n      lang=\"html\"\n    />\n  </div>\n\n  <div class=\"col-md-8 mx-auto text-center\">\n    <h4 class=\"fw-semibold\">Read our getting started guides</h4>\n    <p>Get a jump on including Bootstrap's source files in a new project with our official guides.</p>\n    <div class=\"d-flex flex-wrap align-items-center justify-content-center gap-4 mt-4\">\n      <a\n        class=\"d-flex flex-column align-items-center text-decoration-none animate-img\"\n        href={getVersionedDocsPath('getting-started/webpack/')}\n      >\n        <img\n          class=\"d-block mb-2\"\n          src={getVersionedDocsPath('/assets/img/webpack.svg')}\n          alt=\"\"\n          width=\"72\"\n          height=\"72\"\n          loading=\"lazy\"\n        />\n        <span class=\"text-body-secondary\">Webpack</span>\n      </a>\n      <a\n        class=\"d-flex flex-column align-items-center text-decoration-none animate-img\"\n        href={getVersionedDocsPath('getting-started/parcel/')}\n      >\n        <img\n          class=\"d-block mb-2\"\n          src={getVersionedDocsPath('/assets/img/parcel.png')}\n          alt=\"\"\n          width=\"72\"\n          height=\"72\"\n          loading=\"lazy\"\n        />\n        <span class=\"text-body-secondary\">Parcel</span>\n      </a>\n      <a\n        class=\"d-flex flex-column align-items-center text-decoration-none animate-img\"\n        href={getVersionedDocsPath('getting-started/vite/')}\n      >\n        <img\n          class=\"d-block mb-2\"\n          src={getVersionedDocsPath('/assets/img/vite.svg')}\n          alt=\"\"\n          width=\"72\"\n          height=\"72\"\n          loading=\"lazy\"\n        />\n        <span class=\"text-body-secondary\">Vite</span>\n      </a>\n    </div>\n  </div>\n</section>\n"
  },
  {
    "path": "site/src/components/home/Icons.astro",
    "content": "---\nimport { getConfig } from '@libs/config'\nimport CircleSquareIcon from '@components/icons/CircleSquareIcon.astro'\nimport ResponsiveImage from '@layouts/partials/ResponsiveImage.astro'\n---\n\n<section class=\"row g-3 g-md-5 pb-md-5 mb-5 align-items-center\">\n  <div class=\"col-lg-6\">\n    <div class=\"masthead-followup-icon d-inline-block mb-3\" style=\"--bg-rgb: var(--bd-teal-rgb);\">\n      <CircleSquareIcon height={32} width={32} />\n    </div>\n    <h2 class=\"display-5 mb-3 fw-semibold lh-sm\">Personalize it with Bootstrap&nbsp;Icons</h2>\n    <p class=\"lead fw-normal\">\n      <a href={getConfig().icons}>Bootstrap Icons</a> is an open source SVG icon library featuring over 1,800 glyphs, with\n      more added every release. They're designed to work in any project, whether you use Bootstrap itself or not. Use them\n      as SVGs or icon fonts—both options give you vector scaling and easy customization via CSS.\n    </p>\n    <p class=\"d-flex lead fw-normal mb-md-0\">\n      <a href={getConfig().icons} class=\"icon-link icon-link-hover fw-semibold\">\n        Get Bootstrap Icons\n        <svg class=\"bi\" aria-hidden=\"true\"><use xlink:href=\"#arrow-right\"></use></svg>\n      </a>\n    </p>\n  </div>\n  <div class=\"col-lg-6\">\n    <ResponsiveImage imgPath=\"/assets/img/bootstrap-icons.png\" alt=\"Bootstrap Icons\" classes=\"mx-auto d-block mt-3\" />\n  </div>\n</section>\n"
  },
  {
    "path": "site/src/components/home/MastHead.astro",
    "content": "---\nimport { getConfig } from '@libs/config'\nimport { getVersionedDocsPath } from '@libs/path'\nimport Ads from '@components/Ads.astro'\nimport Code from '@components/shortcodes/Code.astro'\nimport ResponsiveImage from '@layouts/partials/ResponsiveImage.astro'\n---\n\n<div class=\"bd-masthead mb-3\" id=\"content\">\n  <div class=\"container-xxl bd-gutter\">\n    <div class=\"col-md-8 mx-auto text-center\">\n      <a\n        class=\"d-flex flex-column flex-lg-row justify-content-center align-items-center mb-4 text-dark lh-sm text-decoration-none\"\n        href=\"https://www.herodevs.com/support/nes-bootstrap?utm_source=Bootstrap_site&utm_medium=Banner&utm_campaign=v3and4_eol\"\n        rel=\"noopener\"\n        target=\"_blank\"\n      >\n        <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\">\n          Get Security Updates for Bootstrap 3 &amp; 4\n          <svg class=\"bi\" style=\"width: 20px; height: 20px; margin-block: -2px;\" aria-hidden=\"true\"\n            ><use xlink:href=\"#arrow-right-short\"></use></svg\n          >\n        </span>\n      </a>\n      <ResponsiveImage\n        imgPath=\"/assets/brand/bootstrap-logo-shadow.png\"\n        alt=\"Bootstrap\"\n        width={200}\n        height={165}\n        classes=\"d-none d-sm-block mx-auto mb-3\"\n        lazyload={false}\n      />\n      <h1 class=\"mb-3 fw-semibold lh-1\">Build fast, responsive sites with&nbsp;Bootstrap</h1>\n      <p class=\"lead mb-4\">\n        Powerful, extensible, and feature-packed frontend toolkit. Build and customize with Sass, utilize prebuilt grid\n        system and components, and bring projects to life with powerful JavaScript plugins.\n      </p>\n      <div class=\"d-flex flex-column flex-lg-row align-items-md-stretch justify-content-md-center gap-3 mb-4\">\n        <div class=\"d-inline-block v-align-middle fs-5\">\n          <Code code={`npm i bootstrap@${getConfig().current_version}`} lang=\"sh\" />\n        </div>\n        <a\n          href={getVersionedDocsPath('getting-started/introduction')}\n          class=\"btn btn-lg bd-btn-lg btn-bd-primary d-flex align-items-center justify-content-center fw-semibold\"\n        >\n          <svg class=\"bi me-2\" aria-hidden=\"true\"><use xlink:href=\"#book-half\"></use></svg>\n          Read the docs\n        </a>\n      </div>\n      <p class=\"text-body-secondary mb-0\">\n        Currently <strong>v{getConfig().current_version}</strong>\n        <span class=\"px-1\">&middot;</span>\n        <a href={getVersionedDocsPath('getting-started/download')} class=\"link-secondary\">Download</a>\n        <span class=\"px-1\">&middot;</span>\n        <a href=\"/docs/versions/\" class=\"link-secondary text-nowrap\">All releases</a>\n      </p>\n      <Ads />\n    </div>\n  </div>\n</div>\n"
  },
  {
    "path": "site/src/components/home/Plugins.astro",
    "content": "---\nimport { getVersionedDocsPath } from '@libs/path'\nimport { getData } from '@libs/data'\nimport Code from '@shortcodes/Code.astro'\n\nconst plugins = getData('plugins')\n---\n\n<section class=\"pb-md-5 mb-5\">\n  <div class=\"col-lg-8 mb-5\">\n    <div class=\"masthead-followup-icon d-inline-block mb-3\" style=\"--bg-rgb: var(--bs-warning-rgb);\">\n      <svg class=\"bi fs-1\" aria-hidden=\"true\"><use xlink:href=\"#plugin\"></use></svg>\n    </div>\n    <h2 class=\"display-5 mb-3 fw-semibold lh-sm\">Powerful JavaScript plugins without&nbsp;jQuery</h2>\n    <p class=\"lead fw-normal\">\n      Add toggleable hidden elements, modals and offcanvas menus, popovers and tooltips, and so much more—all without\n      jQuery. Bootstrap's JavaScript is HTML-first, meaning most plugins are added with <code>data</code> attributes in your\n      HTML. Need more control? Include individual plugins programmatically.\n    </p>\n    <p class=\"d-flex lead fw-normal mb-md-0\">\n      <a href={getVersionedDocsPath('getting-started/javascript')} class=\"icon-link icon-link-hover fw-semibold\">\n        Learn more about Bootstrap JavaScript\n        <svg class=\"bi\" aria-hidden=\"true\"><use xlink:href=\"#arrow-right\"></use></svg>\n      </a>\n    </p>\n  </div>\n  <div class=\"row gx-md-5\">\n    <div class=\"col-lg-6 mb-3\">\n      <h3 class=\"fw-semibold\">Data attribute API</h3>\n      <p>\n        Why write more JavaScript when you can write HTML? Nearly all of Bootstrap's JavaScript plugins feature a\n        first-class data API, allowing you to use JavaScript just by adding <code>data</code> attributes.\n      </p>\n      <div class=\"p-4 mb-3 border rounded-3\">\n        <div class=\"dropdown\">\n          <button class=\"btn btn-primary dropdown-toggle\" type=\"button\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n            Dropdown\n          </button>\n          <ul class=\"dropdown-menu\">\n            <li><button class=\"dropdown-item\" type=\"button\">Dropdown item</button></li>\n            <li><button class=\"dropdown-item\" type=\"button\">Dropdown item</button></li>\n            <li><button class=\"dropdown-item\" type=\"button\">Dropdown item</button></li>\n          </ul>\n        </div>\n      </div>\n      <Code\n        code={`<div class=\"dropdown\">\n  <button class=\"btn btn-primary dropdown-toggle\" type=\"button\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n    Dropdown\n  </button>\n  <ul class=\"dropdown-menu\">\n    <li><button class=\"dropdown-item\" type=\"button\">Dropdown item</button></li>\n    <li><button class=\"dropdown-item\" type=\"button\">Dropdown item</button></li>\n    <li><button class=\"dropdown-item\" type=\"button\">Dropdown item</button></li>\n  </ul>\n</div>`}\n        lang=\"html\"\n      />\n      <p>\n        Learn more about <a href={getVersionedDocsPath('getting-started/javascript/#using-bootstrap-as-a-module')}\n          >our JavaScript as modules</a\n        > and <a href={getVersionedDocsPath('getting-started/javascript/#programmatic-api')}\n          >using the programmatic API</a\n        >.\n      </p>\n    </div>\n    <div class=\"col-lg-6 mb-3\">\n      <h3 class=\"fw-semibold\">Comprehensive set of plugins</h3>\n      <p>\n        Bootstrap features a dozen plugins that you can drop into any project. Drop them in all at once, or choose just\n        the ones you need.\n      </p>\n      <hr class=\"my-4\" />\n      <div class=\"row g-3\">\n        {\n          plugins.map((plugin) => {\n            return (\n              <div class=\"col-sm-6 mb-2\">\n                <a class=\"d-block pe-lg-4 text-decoration-none lh-sm\" href={getVersionedDocsPath(plugin.link)}>\n                  <h4 class=\"mb-0 fs-5 fw-semibold\">{plugin.name}</h4>\n                  <small class=\"text-body-secondary\">{plugin.description}</small>\n                </a>\n              </div>\n            )\n          })\n        }\n      </div>\n    </div>\n  </div>\n</section>\n"
  },
  {
    "path": "site/src/components/icons/BootstrapWhiteFillIcon.astro",
    "content": "---\nimport type { SvgIconProps } from '@libs/icon'\n\ntype Props = SvgIconProps\n\nconst { class: className, height, width } = Astro.props\n---\n\n<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 118 94\" role=\"img\" class={className} height={height} width={width}>\n  <title>Bootstrap</title>\n  <path\n    fill-rule=\"evenodd\"\n    clip-rule=\"evenodd\"\n    d=\"M24.509 0c-6.733 0-11.715 5.893-11.492 12.284.214 6.14-.064 14.092-2.066 20.577C8.943 39.365 5.547 43.485 0 44.014v5.972c5.547.529 8.943 4.649 10.951 11.153 2.002 6.485 2.28 14.437 2.066 20.577C12.794 88.106 17.776 94 24.51 94H93.5c6.733 0 11.714-5.893 11.491-12.284-.214-6.14.064-14.092 2.066-20.577 2.009-6.504 5.396-10.624 10.943-11.153v-5.972c-5.547-.529-8.934-4.649-10.943-11.153-2.002-6.484-2.28-14.437-2.066-20.577C105.214 5.894 100.233 0 93.5 0H24.508zM80 57.863C80 66.663 73.436 72 62.543 72H44a2 2 0 01-2-2V24a2 2 0 012-2h18.437c9.083 0 15.044 4.92 15.044 12.474 0 5.302-4.01 10.049-9.119 10.88v.277C75.317 46.394 80 51.21 80 57.863zM60.521 28.34H49.948v14.934h8.905c6.884 0 10.68-2.772 10.68-7.727 0-4.643-3.264-7.207-9.012-7.207zM49.948 49.2v16.458H60.91c7.167 0 10.964-2.876 10.964-8.281 0-5.406-3.903-8.178-11.425-8.178H49.948z\"\n    fill=\"currentColor\"\n  >\n  </path>\n</svg>\n"
  },
  {
    "path": "site/src/components/icons/CircleSquareIcon.astro",
    "content": "---\nimport type { SvgIconProps } from '@libs/icon'\n\ntype Props = SvgIconProps\n\nconst { class: className, height, width } = Astro.props\n---\n\n<svg\n  xmlns=\"http://www.w3.org/2000/svg\"\n  fill=\"currentColor\"\n  viewBox=\"0 0 16 16\"\n  class={className}\n  height={height}\n  width={width}\n  aria-hidden=\"true\"\n>\n  <path d=\"M0 6a6 6 0 1112 0A6 6 0 010 6z\"></path>\n  <path\n    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\"\n  >\n  </path>\n</svg>\n"
  },
  {
    "path": "site/src/components/icons/DropletFillIcon.astro",
    "content": "---\nimport type { SvgIconProps } from '@libs/icon'\n\ntype Props = SvgIconProps\n\nconst { class: className, height, width } = Astro.props\n---\n\n<svg\n  xmlns=\"http://www.w3.org/2000/svg\"\n  fill=\"currentColor\"\n  viewBox=\"0 0 16 16\"\n  class={className}\n  height={height}\n  width={width}\n  aria-hidden=\"true\"\n>\n  <path\n    fill-rule=\"evenodd\"\n    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\"\n    clip-rule=\"evenodd\"\n  >\n  </path>\n</svg>\n"
  },
  {
    "path": "site/src/components/icons/GitHubIcon.astro",
    "content": "---\nimport type { SvgIconProps } from '@libs/icon'\n\ntype Props = SvgIconProps\n\nconst { class: className, height, width } = Astro.props\n---\n\n<svg\n  xmlns=\"http://www.w3.org/2000/svg\"\n  viewBox=\"0 0 512 499.36\"\n  role=\"img\"\n  class={className}\n  height={height}\n  width={width}\n>\n  <title>GitHub</title>\n  <path\n    fill=\"currentColor\"\n    fill-rule=\"evenodd\"\n    d=\"M256 0C114.64 0 0 114.61 0 256c0 113.09 73.34 209 175.08 242.9 12.8 2.35 17.47-5.56 17.47-12.34 0-6.08-.22-22.18-.35-43.54-71.2 15.49-86.2-34.34-86.2-34.34-11.64-29.57-28.42-37.45-28.42-37.45-23.27-15.84 1.73-15.55 1.73-15.55 25.69 1.81 39.21 26.38 39.21 26.38 22.84 39.12 59.92 27.82 74.5 21.27 2.33-16.54 8.94-27.82 16.25-34.22-56.84-6.43-116.6-28.43-116.6-126.49 0-27.95 10-50.8 26.35-68.69-2.63-6.48-11.42-32.5 2.51-67.75 0 0 21.49-6.88 70.4 26.24a242.65 242.65 0 0 1 128.18 0c48.87-33.13 70.33-26.24 70.33-26.24 14 35.25 5.18 61.27 2.55 67.75 16.41 17.9 26.31 40.75 26.31 68.69 0 98.35-59.85 120-116.88 126.32 9.19 7.9 17.38 23.53 17.38 47.41 0 34.22-.31 61.83-.31 70.23 0 6.85 4.61 14.81 17.6 12.31C438.72 464.97 512 369.08 512 256.02 512 114.62 397.37 0 256 0z\"\n  >\n  </path>\n</svg>\n"
  },
  {
    "path": "site/src/components/icons/HamburgerIcon.astro",
    "content": "---\nimport type { SvgIconProps } from '@libs/icon'\n\ntype Props = SvgIconProps\n\nconst { class: className, height, width } = Astro.props\n---\n\n<svg\n  xmlns=\"http://www.w3.org/2000/svg\"\n  fill=\"currentColor\"\n  viewBox=\"0 0 16 16\"\n  class={className}\n  height={height}\n  width={width}\n  aria-hidden=\"true\"\n>\n  <path\n    fill-rule=\"evenodd\"\n    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\"\n  >\n  </path>\n</svg>\n"
  },
  {
    "path": "site/src/components/icons/OpenCollectiveIcon.astro",
    "content": "---\nimport type { SvgIconProps } from '@libs/icon'\n\ntype Props = SvgIconProps\n\nconst { class: className, height, width } = Astro.props\n---\n\n<svg\n  xmlns=\"http://www.w3.org/2000/svg\"\n  fill=\"currentColor\"\n  fill-rule=\"evenodd\"\n  viewBox=\"0 0 40 41\"\n  role=\"img\"\n  class={className}\n  height={height}\n  width={width}\n>\n  <title>Open Collective</title>\n  <path\n    fill-opacity=\".4\"\n    d=\"M32.8 21c0 2.4-.8 4.9-2 6.9l5.1 5.1c2.5-3.4 4.1-7.6 4.1-12 0-4.6-1.6-8.8-4-12.2L30.7 14c1.2 2 2 4.3 2 7z\"\n  >\n  </path>\n  <path d=\"M20 33.7a12.8 12.8 0 0 1 0-25.6c2.6 0 5 .7 7 2.1L32 5a20 20 0 1 0 .1 31.9l-5-5.2a13 13 0 0 1-7 2z\"> </path>\n</svg>\n"
  },
  {
    "path": "site/src/components/icons/Symbols.astro",
    "content": "---\n---\n\n<svg xmlns=\"http://www.w3.org/2000/svg\" class=\"d-none\">\n  <symbol id=\"arrow-right\" viewBox=\"0 0 16 16\">\n    <path\n      fill-rule=\"evenodd\"\n      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\"\n    ></path>\n  </symbol>\n  <symbol id=\"arrow-right-short\" viewBox=\"0 0 16 16\">\n    <path\n      fill-rule=\"evenodd\"\n      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\"\n    ></path>\n  </symbol>\n  <symbol id=\"book-half\" viewBox=\"0 0 16 16\">\n    <path\n      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\"\n    ></path>\n  </symbol>\n  <symbol id=\"box-seam\" viewBox=\"0 0 16 16\">\n    <path\n      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\"\n    ></path>\n  </symbol>\n  <symbol id=\"braces\" viewBox=\"0 0 16 16\">\n    <path\n      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\"\n    ></path>\n  </symbol>\n  <symbol id=\"braces-asterisk\" viewBox=\"0 0 16 16\">\n    <path\n      fill-rule=\"evenodd\"\n      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\"\n    ></path>\n  </symbol>\n  <symbol id=\"check2\" viewBox=\"0 0 16 16\">\n    <path\n      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\"\n    ></path>\n  </symbol>\n  <symbol id=\"chevron-expand\" viewBox=\"0 0 16 16\">\n    <path\n      fill-rule=\"evenodd\"\n      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\"\n    ></path>\n  </symbol>\n  <symbol id=\"circle-half\" viewBox=\"0 0 16 16\">\n    <path d=\"M8 15A7 7 0 1 0 8 1v14zm0 1A8 8 0 1 1 8 0a8 8 0 0 1 0 16z\"></path>\n  </symbol>\n  <symbol id=\"clipboard\" viewBox=\"0 0 16 16\">\n    <path\n      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\"\n    ></path>\n    <path\n      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\"\n    ></path>\n  </symbol>\n  <symbol id=\"code\" viewBox=\"0 0 16 16\">\n    <path\n      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\"\n    ></path>\n  </symbol>\n  <symbol id=\"file-earmark-richtext\" viewBox=\"0 0 16 16\">\n    <path\n      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\"\n    ></path>\n    <path\n      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\"\n    ></path>\n  </symbol>\n  <symbol id=\"globe2\" viewBox=\"0 0 16 16\">\n    <path\n      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\"\n    ></path>\n  </symbol>\n  <symbol id=\"grid-fill\" viewBox=\"0 0 16 16\">\n    <path\n      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\"\n    ></path>\n  </symbol>\n  <symbol id=\"lightning-charge-fill\" viewBox=\"0 0 16 16\">\n    <path\n      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\"\n    ></path>\n  </symbol>\n  <symbol id=\"list\" viewBox=\"0 0 16 16\">\n    <path\n      fill-rule=\"evenodd\"\n      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\"\n    ></path>\n  </symbol>\n  <symbol id=\"magic\" viewBox=\"0 0 16 16\">\n    <path\n      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\"\n    ></path>\n  </symbol>\n  <symbol id=\"menu-button-wide-fill\" viewBox=\"0 0 16 16\">\n    <path\n      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\"\n    ></path>\n  </symbol>\n  <symbol id=\"moon-stars-fill\" viewBox=\"0 0 16 16\">\n    <path\n      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\"\n    ></path>\n    <path\n      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\"\n    ></path>\n  </symbol>\n  <symbol id=\"palette2\" viewBox=\"0 0 16 16\">\n    <path\n      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\"\n    ></path>\n    <path d=\"M0 12.995V13a3.07 3.07 0 0 0 0-.005z\"></path>\n  </symbol>\n  <symbol id=\"plugin\" viewBox=\"0 0 16 16\">\n    <path\n      fill-rule=\"evenodd\"\n      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\"\n    ></path>\n  </symbol>\n  <symbol id=\"plus\" viewBox=\"0 0 16 16\">\n    <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\"\n    ></path>\n  </symbol>\n  <symbol id=\"sun-fill\" viewBox=\"0 0 16 16\">\n    <path\n      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\"\n    ></path>\n  </symbol>\n  <symbol id=\"three-dots\" viewBox=\"0 0 16 16\">\n    <path\n      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\"\n    ></path>\n  </symbol>\n  <symbol id=\"tools\" viewBox=\"0 0 16 16\">\n    <path\n      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\"\n    ></path>\n  </symbol>\n  <symbol id=\"ui-radios\" viewBox=\"0 0 16 16\">\n    <path\n      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\"\n    ></path>\n  </symbol>\n</svg>\n"
  },
  {
    "path": "site/src/components/icons/XIcon.astro",
    "content": "---\nimport type { SvgIconProps } from '@libs/icon'\n\ntype Props = SvgIconProps\n\nconst { class: className, height, width } = Astro.props\n---\n\n<svg\n  xmlns=\"http://www.w3.org/2000/svg\"\n  viewBox=\"0 0 1200 1227\"\n  role=\"img\"\n  class={className}\n  height={height}\n  width={width}\n>\n  <title>X</title>\n  <path\n    fill=\"currentColor\"\n    d=\"M714.163 519.284 1160.89 0h-105.86L667.137 450.887 357.328 0H0l468.492 681.821L0 1226.37h105.866l409.625-476.152 327.181 476.152H1200L714.137 519.284h.026ZM569.165 687.828l-47.468-67.894-377.686-540.24h162.604l304.797 435.991 47.468 67.894 396.2 566.721H892.476L569.165 687.854v-.026Z\"\n  >\n  </path>\n</svg>\n"
  },
  {
    "path": "site/src/components/shortcodes/AddedIn.astro",
    "content": "---\n/*\n * Outputs badge to identify the first version something was added\n */\n\ninterface Props {\n  version: string\n}\n\nconst { version } = Astro.props\n---\n\n<small\n  class=\"d-inline-flex mb-3 px-2 py-1 fw-semibold text-success-emphasis bg-success-subtle border border-success-subtle rounded-2\"\n  >Added in v{version}</small\n>\n"
  },
  {
    "path": "site/src/components/shortcodes/BsTable.astro",
    "content": "---\ninterface Props {\n  /**\n   * The CSS class to apply to the table.\n   * Note that the prop is not used in this component, but in a rehype plugin applying the classes to the table element\n   * directly on the HTML AST (HAST) generated by Astro.\n   * @default \"table\"\n   * @see src/libs/rehype.ts\n   */\n  class?: string\n}\n---\n\n<div class=\"table-responsive\">\n  <slot />\n</div>\n"
  },
  {
    "path": "site/src/components/shortcodes/Callout.astro",
    "content": "---\nimport { getCalloutByName } from '@libs/content'\nimport type { MarkdownInstance } from 'astro'\n\ninterface Props {\n  /**\n   * The name of an existing callout to display located in `src/content/callouts`.\n   * This will override any content passed in via the default slot.\n   */\n  name?:\n    | 'danger-async-methods'\n    | 'info-mediaqueries-breakpoints'\n    | 'info-npm-starter'\n    | 'info-prefersreducedmotion'\n    | 'info-sanitizer'\n    | 'warning-color-assistive-technologies'\n    | 'warning-data-bs-title-vs-title'\n    | 'warning-input-support'\n  /**\n   * The type of callout to display. One of `info`, `danger`, or `warning`.\n   * @default 'info'\n   */\n  type?: 'danger' | 'info' | 'warning'\n}\n\nconst { name, type = 'info' } = Astro.props\n\nlet Content: MarkdownInstance<{}>['Content'] | undefined\n\nif (name) {\n  const callout = await getCalloutByName(name)\n\n  if (!callout) {\n    throw new Error(`Could not find callout with name '${name}'.`)\n  }\n\n  const namedCallout = await callout.render()\n  Content = namedCallout.Content\n}\n---\n\n<div class={`bd-callout bd-callout-${type}`}>\n  {Content ? <Content /> : <slot />}\n</div>\n"
  },
  {
    "path": "site/src/components/shortcodes/CalloutDeprecatedDarkVariants.astro",
    "content": "---\n/*\n * Outputs message about dark mode component variants being deprecated in v5.3.\n */\n\ninterface Props {\n  component: string\n}\n\nconst { component } = Astro.props\n---\n\n<div class=\"bd-callout bd-callout-warning\">\n  <p>\n    <strong>Heads up!</strong> Dark variants for components were deprecated in v5.3.0 with the introduction of color modes.\n    Instead of adding <code>.{component}-dark</code>, set <code>data-bs-theme=\"dark\"</code> on the root element, a parent\n    wrapper, or the component itself.\n  </p>\n</div>\n"
  },
  {
    "path": "site/src/components/shortcodes/Code.astro",
    "content": "---\nimport fs from 'node:fs'\nimport path from 'node:path'\nimport { Prism } from '@astrojs/prism'\n\ninterface Props {\n  /**\n   * The CSS class(es) to be added to the `pre` HTML element when rendering code blocks in Markdown.\n   * Note that this prop is not used when the component is invoked directly.\n   */\n  class?: string\n  /**\n   * The code to highlight.\n   * If an array is passed, elements will be joined with a new line.\n   */\n  code?: string | string[]\n  /**\n   * The CSS class(es) to be added to the `div` wrapper HTML element.\n   */\n  containerClass?: string\n  /**\n   * The language to use for highlighting.\n   * @see https://prismjs.com/#supported-languages\n   */\n  lang?: string\n  /**\n   * If the `filePath` prop is defined, this prop can be used to specify a regex containing a match group to extract\n   * only a part of the file.\n   */\n  fileMatch?: string\n  /**\n   * A path to the file containing the code to highlight relative to the root of the repository.\n   * This takes precedence over the `code` prop.\n   */\n  filePath?: string\n  /**\n   * Defines if the `<Code>` component is nested inside an `<Example>` component or not.\n   * @default false\n   */\n  nestedInExample?: boolean\n}\n\nconst { class: className, code, containerClass, fileMatch, filePath, lang, nestedInExample = false } = Astro.props\n\nlet codeToDisplay = filePath\n  ? fs.readFileSync(path.join(process.cwd(), filePath), 'utf8')\n  : Array.isArray(code)\n    ? code.join('\\n')\n    : code\n\nif (filePath && fileMatch && codeToDisplay) {\n  const match = codeToDisplay.match(new RegExp(fileMatch))\n\n  if (!match || !match[0]) {\n    throw new Error(`The file at ${filePath} does not contains a match for the regex '${fileMatch}'.`)\n  }\n\n  codeToDisplay = match[0]\n}\n---\n\n<script>\n  import ClipboardJS from 'clipboard'\n\n  const btnTitle = 'Copy to clipboard'\n  const btnEdit = 'Edit on StackBlitz'\n\n  function snippetButtonTooltip(selector: string, title: string) {\n    document.querySelectorAll(selector).forEach((btn) => {\n      bootstrap.Tooltip.getOrCreateInstance(btn, { title })\n    })\n  }\n\n  snippetButtonTooltip('.btn-clipboard', btnTitle)\n  snippetButtonTooltip('.btn-edit', btnEdit)\n\n  const clipboard = new ClipboardJS('.btn-clipboard', {\n    target: (trigger) => trigger.closest('.bd-code-snippet')?.querySelector('.highlight')!,\n    text: (trigger) => {\n      // Trim text to workaround a Firefox issue where the structure of the DOM (uncontrolled) is relevant for the\n      // copied text.\n      // https://github.com/zenorocha/clipboard.js/issues/439#issuecomment-312344621\n      return trigger.closest('.bd-code-snippet')?.querySelector('.highlight')!.textContent?.trim()!\n    }\n  })\n\n  clipboard.on('success', (event) => {\n    const iconFirstChild = event.trigger.querySelector('.bi')?.firstElementChild\n    const tooltipBtn = bootstrap.Tooltip.getInstance(event.trigger)\n    const namespace = 'http://www.w3.org/1999/xlink'\n    const originalXhref = iconFirstChild?.getAttributeNS(namespace, 'href')\n    const isCheckIconVisible = originalXhref === '#check2'\n\n    if (isCheckIconVisible) {\n      return\n    }\n\n    tooltipBtn?.setContent({ '.tooltip-inner': 'Copied!' })\n\n    event.trigger.addEventListener(\n      'hidden.bs.tooltip',\n      () => {\n        tooltipBtn?.setContent({ '.tooltip-inner': btnTitle })\n      },\n      { once: true }\n    )\n\n    event.clearSelection()\n\n    if (originalXhref) {\n      iconFirstChild?.setAttributeNS(namespace, 'href', originalXhref.replace('clipboard', 'check2'))\n    }\n\n    setTimeout(() => {\n      if (originalXhref) {\n        iconFirstChild?.setAttributeNS(namespace, 'href', originalXhref)\n      }\n    }, 2000)\n  })\n\n  clipboard.on('error', (event) => {\n    const modifierKey = /mac/i.test(navigator.userAgent) ? '\\u2318' : 'Ctrl-'\n    const fallbackMsg = `Press ${modifierKey}C to copy`\n    const tooltipBtn = bootstrap.Tooltip.getInstance(event.trigger)\n\n    tooltipBtn?.setContent({ '.tooltip-inner': fallbackMsg })\n\n    event.trigger.addEventListener(\n      'hidden.bs.tooltip',\n      () => {\n        tooltipBtn?.setContent({ '.tooltip-inner': btnTitle })\n      },\n      { once: true }\n    )\n  })\n</script>\n\n<div class:list={[{ 'bd-code-snippet': !nestedInExample }, containerClass]}>\n  {\n    nestedInExample\n      ? (<></>)\n      : Astro.slots.has('pre')\n        ? (\n          <slot name=\"pre\" />\n        )\n        : (\n          <div class=\"bd-clipboard\">\n            <button type=\"button\" class=\"btn-clipboard\">\n              <svg class=\"bi\" role=\"img\" aria-label=\"Copy\">\n                <use xlink:href=\"#clipboard\" />\n              </svg>\n            </button>\n          </div>\n        )\n  }\n  <div class=\"highlight\">\n    {\n      codeToDisplay && lang ? (\n        <Prism code={codeToDisplay} lang={lang} />\n      ) : (\n        /* prettier-ignore */ <pre class={className}><slot /></pre>\n      )\n    }\n  </div>\n</div>\n"
  },
  {
    "path": "site/src/components/shortcodes/DeprecatedIn.astro",
    "content": "---\n/*\n * Outputs badge to identify the version something was deprecated\n */\n\ninterface Props {\n  version: string\n}\n\nconst { version } = Astro.props\n---\n\n<small\n  class=\"d-inline-flex mb-3 px-2 py-1 fw-semibold text-warning-emphasis bg-warning-subtle border border-warning-subtle rounded-2\"\n>\n  Deprecated in v{version}\n</small>\n"
  },
  {
    "path": "site/src/components/shortcodes/Example.astro",
    "content": "---\nimport { replacePlaceholdersInHtml } from '@libs/placeholder'\nimport Code from '@components/shortcodes/Code.astro'\n\ninterface Props {\n  /**\n   * Defines if extra JS snippet should be added to StackBlitz or not.\n   * @default false\n   */\n  addStackblitzJs?: boolean\n  /**\n   * The example code.\n   * If an array is passed, elements will be joined with a new line.\n   */\n  code: string | string[]\n  /**\n   * The CSS class(es) to be added to the preview wrapping `div` element.\n   */\n  class?: string\n  /**\n   * The preview wrapping `div` element ID.\n   */\n  id?: string\n  /**\n   * Language used to display the code.\n   * @default 'html'\n   */\n  lang?: string\n  /**\n   * Defines if the markup should be visible or not.\n   * @default true\n   */\n  showMarkup?: boolean\n  /**\n   * Defines if the preview should be visible or not.\n   * @default true\n   */\n  showPreview?: boolean\n}\n\nconst {\n  addStackblitzJs = false,\n  code,\n  class: className,\n  id,\n  lang = 'html',\n  showMarkup = true,\n  showPreview = true\n} = Astro.props\n\nlet markup = Array.isArray(code) ? code.join('\\n') : code\nmarkup = replacePlaceholdersInHtml(markup)\n\nconst simplifiedMarkup = markup\n  .replace(\n    /<svg.*class=\"bd-placeholder-img(?:-lg)?(?: *?bd-placeholder-img-lg)? ?(.*?)\".*?<\\/svg>/g,\n    (match, classes) => `<img src=\"...\"${classes ? ` class=\"${classes}\"` : ''} alt=\"...\">`\n  )\n  .replace(\n    /<img.*class=\"bd-placeholder-img(?:-lg)?(?: *?bd-placeholder-img-lg)? ?(.*?)\".*?>/g,\n    (match, classes) => `<img src=\"...\"${classes ? ` class=\"${classes}\"` : ''} alt=\"...\">`\n  )\n---\n\n<div class=\"bd-example-snippet bd-code-snippet\">\n  {\n    showPreview && (\n      <div id={id} class:list={['bd-example m-0 border-0', className]}>\n        <Fragment set:html={markup} />\n      </div>\n    )\n  }\n\n  {\n    showMarkup && (\n      <>\n        {showPreview && (\n          <div class=\"d-flex align-items-center highlight-toolbar ps-3 pe-2 py-1 border-0 border-top border-bottom\">\n            <small class=\"font-monospace text-body-secondary text-uppercase\">{lang}</small>\n            <div class=\"d-flex ms-auto\">\n              <button\n                type=\"button\"\n                class=\"btn-edit text-nowrap\"\n                title=\"Try it on StackBlitz\"\n                data-sb-js-snippet={addStackblitzJs ? true : undefined}\n              >\n                <svg class=\"bi\" aria-hidden=\"true\">\n                  <use xlink:href=\"#lightning-charge-fill\" />\n                </svg>\n              </button>\n              <button type=\"button\" class=\"btn-clipboard mt-0 me-0\" title=\"Copy to clipboard\">\n                <svg class=\"bi\" aria-hidden=\"true\">\n                  <use xlink:href=\"#clipboard\" />\n                </svg>\n              </button>\n            </div>\n          </div>\n        )}\n        <Code code={simplifiedMarkup} lang={lang} nestedInExample={true} />\n      </>\n    )\n  }\n</div>\n"
  },
  {
    "path": "site/src/components/shortcodes/GuideFooter.mdx",
    "content": "<hr class=\"my-5\" />\n\n_See something wrong or out of date here? Please [open an issue on GitHub]([[config:repo]]/issues/new/choose). Need help troubleshooting? [Search or start a discussion]([[config:repo]]/discussions) on GitHub._\n"
  },
  {
    "path": "site/src/components/shortcodes/JsDataAttributes.mdx",
    "content": "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\"`.\n\nAs 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}'`.\n\nThe 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.\n"
  },
  {
    "path": "site/src/components/shortcodes/JsDismiss.astro",
    "content": "---\nimport Code from '@shortcodes/Code.astro'\n\ninterface Props {\n  name: string\n}\n\nconst { name } = Astro.props\n---\n\n<p>\n  Dismissal can be achieved with the <code>data-bs-dismiss</code> attribute on a button <strong\n    >within the {name}</strong\n  > as demonstrated below:\n</p>\n\n<Code\n  code={`<button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"${name}\" aria-label=\"Close\"></button>`}\n  lang=\"html\"\n/>\n\n<p>\n  or on a button <strong>outside the {name}</strong> using the additional <code>data-bs-target</code> as demonstrated below:\n</p>\n\n<Code\n  code={`<button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"${name}\" data-bs-target=\"#my-${name}\" aria-label=\"Close\"></button>`}\n  lang=\"html\"\n/>\n"
  },
  {
    "path": "site/src/components/shortcodes/JsDocs.astro",
    "content": "---\nimport fs from 'node:fs'\nimport { getConfig } from '@libs/config'\nimport Code from '@shortcodes/Code.astro'\n\n// Prints everything between `// js-docs-start \"name\"` and `// js-docs-end \"name\"`\n// comments in the docs.\n\ninterface Props {\n  /**\n   * Reference name used to find the content to display within the content of the `file` prop.\n   */\n  name: string\n  /**\n   * File path that contains the content to display relative to the root of the repository.\n   */\n  file: string\n}\n\nconst { name, file } = Astro.props\n\nif (!name || !file) {\n  throw new Error(\n    `Missing required parameter(s) for the '<JsDocs />' component, expected both 'name' and 'file' but got 'name: ${name}' and 'file: ${file}'.`\n  )\n}\n\nlet content: string\n\ntry {\n  const fileContent = fs.readFileSync(file, 'utf8')\n\n  const matches = fileContent.match(new RegExp(`\\/\\/ js-docs-start ${name}\\n((?:.|\\n)*)\\/\\/ js-docs-end ${name}`, 'm'))\n\n  if (!matches || !matches[1]) {\n    throw new Error(\n      `Failed to find the content named '${name}', make sure that '// js-docs-start ${name}' and '// js-docs-end ${name}' are defined.`\n    )\n  }\n\n  content = matches[1]\n\n  // Fix the indentation by removing extra spaces at the beginning of each line\n  const lines = content.split('\\n')\n  const spaceCounts = lines.filter((line) => line.trim().length > 0).map((line) => line.match(/^ */)[0].length)\n  const minSpaces = spaceCounts.length ? Math.min(...spaceCounts) : 0\n  content = lines.map((line) => line.slice(minSpaces)).join('\\n')\n} catch (error) {\n  throw new Error(`Failed to find the content to render in the '<JsDocs />' component at '${file}'.`, {\n    cause: error\n  })\n}\n---\n\n<Code containerClass=\"bd-example-snippet bd-code-snippet bd-file-ref\" code={content} lang=\"js\">\n  <div slot=\"pre\" class=\"d-flex align-items-center highlight-toolbar ps-3 pe-2 py-1 border-bottom\">\n    <a\n      class=\"font-monospace link-secondary link-underline-secondary link-underline-opacity-0 link-underline-opacity-100-hover small\"\n      href={`${getConfig().repo}/blob/v${getConfig().current_version}/${file}`.replaceAll('\\\\', '/')}\n    >\n      {file}\n    </a>\n    <div class=\"d-flex ms-auto\">\n      <button type=\"button\" class=\"btn-clipboard mt-0 me-0\" title=\"Copy to clipboard\">\n        <svg class=\"bi\" aria-hidden=\"true\"><use xlink:href=\"#clipboard\"></use></svg>\n      </button>\n    </div>\n  </div>\n</Code>\n"
  },
  {
    "path": "site/src/components/shortcodes/Placeholder.astro",
    "content": "---\nimport { getPlaceholder, type PlaceholderOptions } from '@libs/placeholder'\n\ntype Props = Partial<PlaceholderOptions>\n\nconst {\n  options: { background, color, showText, showTitle, text, title },\n  props,\n  type\n} = getPlaceholder(Astro.props)\n---\n\n{\n  type === 'img' ? (\n    <img {...props} />\n  ) : (\n    <svg {...props}>\n      {showTitle && <title>{title}</title>}\n      <rect width=\"100%\" height=\"100%\" fill={background} />\n      {showText && (\n        <text x=\"50%\" y=\"50%\" fill={color} dy=\".3em\">\n          {text}\n        </text>\n      )}\n    </svg>\n  )\n}\n"
  },
  {
    "path": "site/src/components/shortcodes/ScssDocs.astro",
    "content": "---\nimport fs from 'node:fs'\nimport { getConfig } from '@libs/config'\nimport Code from '@shortcodes/Code.astro'\n\n// Prints everything between `// scss-docs-start \"name\"` and `// scss-docs-end \"name\"`\n// comments in the docs.\n\ninterface Props {\n  /**\n   * Reference name used to find the content to display within the content of the `file` prop.\n   */\n  name: string\n  /**\n   * File path that contains the content to display relative to the root of the repository.\n   */\n  file: string\n}\n\nconst { name, file } = Astro.props\n\nif (!name || !file) {\n  throw new Error(\n    `Missing required parameter(s) for the '<ScssDocs />' component, expected both 'name' and 'file' but got 'name: ${name}' and 'file: ${file}'.`\n  )\n}\n\nlet content: string\n\ntry {\n  const fileContent = fs.readFileSync(file, 'utf8')\n\n  const matches = fileContent.match(\n    new RegExp(`\\/\\/ scss-docs-start ${name}\\n((?:.|\\n)*)\\/\\/ scss-docs-end ${name}`, 'm')\n  )\n\n  if (!matches || !matches[1]) {\n    throw new Error(\n      `Failed to find the content named '${name}', make sure that '// scss-docs-start ${name}' and '// scss-docs-end ${name}' are defined.`\n    )\n  }\n\n  content = matches[1].replaceAll(' !default', '')\n\n  // Fix the indentation by removing extra spaces at the beginning of each line\n  const lines = content.split('\\n')\n  const spaceCounts = lines.filter((line) => line.trim().length > 0).map((line) => line.match(/^ */)[0].length)\n  const minSpaces = spaceCounts.length ? Math.min(...spaceCounts) : 0\n  content = lines.map((line) => line.slice(minSpaces)).join('\\n')\n} catch (error) {\n  throw new Error(`Failed to find the content to render in the '<ScssDocs />' component at '${file}'.`, {\n    cause: error\n  })\n}\n---\n\n<Code containerClass=\"bd-example-snippet bd-file-ref\" code={content} lang=\"scss\">\n  <div slot=\"pre\" class=\"d-flex align-items-center highlight-toolbar ps-3 pe-2 py-1 border-bottom\">\n    <a\n      class=\"font-monospace link-secondary link-underline-secondary link-underline-opacity-0 link-underline-opacity-100-hover small\"\n      href={`${getConfig().repo}/blob/v${getConfig().current_version}/${file}`.replaceAll('\\\\', '/')}\n    >\n      {file}\n    </a>\n    <div class=\"d-flex ms-auto\">\n      <button type=\"button\" class=\"btn-clipboard mt-0 me-0\" title=\"Copy to clipboard\">\n        <svg class=\"bi\" aria-hidden=\"true\"><use xlink:href=\"#clipboard\"></use></svg>\n      </button>\n    </div>\n  </div>\n</Code>\n"
  },
  {
    "path": "site/src/components/shortcodes/Table.astro",
    "content": "---\nimport Code from '@shortcodes/Code.astro'\nimport Example from '@shortcodes/Example.astro'\nimport * as tableContent from '@shortcodes/TableContent.md'\n\ninterface Props {\n  /**\n   * Any class(es) to be added to the `<table>` element (both in the example and code snippet).\n   */\n  class?: string\n  /**\n   * Show a simplified version in the example code snippet by replacing the table content inside `<table>` & `</table>`\n   * with `...`.\n   * @default true\n   */\n  simplified?: boolean\n}\n\nconst { class: className, simplified = true } = Astro.props\n\nconst tableCode = `<table${className ? ` class=\"${className}\"` : ''}>\n${simplified ? '  ...' : await tableContent.compiledContent()}\n</table>`\n\nconst exampleCode = `<table${className ? ` class=\"${className}\"` : ''}>\n${await tableContent.compiledContent()}\n</table>`\n---\n\n<Example showMarkup={false} code={exampleCode} />\n\n<Code code={tableCode} lang=\"html\" />\n"
  },
  {
    "path": "site/src/components/shortcodes/TableContent.md",
    "content": "  <thead>\n    <tr>\n      <th scope=\"col\">#</th>\n      <th scope=\"col\">First</th>\n      <th scope=\"col\">Last</th>\n      <th scope=\"col\">Handle</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th scope=\"row\">1</th>\n      <td>Mark</td>\n      <td>Otto</td>\n      <td>@mdo</td>\n    </tr>\n    <tr>\n      <th scope=\"row\">2</th>\n      <td>Jacob</td>\n      <td>Thornton</td>\n      <td>@fat</td>\n    </tr>\n    <tr>\n      <th scope=\"row\">3</th>\n      <td>John</td>\n      <td>Doe</td>\n      <td>@social</td>\n    </tr>\n  </tbody>\n"
  },
  {
    "path": "site/src/content/callouts/danger-async-methods.md",
    "content": "**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/[[config:docs_version]]/getting-started/javascript/#asynchronous-functions-and-transitions)\n"
  },
  {
    "path": "site/src/content/callouts/info-mediaqueries-breakpoints.md",
    "content": "**Why subtract .02px?** Browsers don’t currently support [range context queries](https://www.w3.org/TR/mediaqueries-4/#range-context), so we work around the limitations of [`min-` and `max-` prefixes](https://www.w3.org/TR/mediaqueries-4/#mq-min-max) and viewports with fractional widths (which can occur under certain conditions on high-dpi devices, for instance) by using values with higher precision.\n"
  },
  {
    "path": "site/src/content/callouts/info-npm-starter.md",
    "content": "**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.\n"
  },
  {
    "path": "site/src/content/callouts/info-prefersreducedmotion.md",
    "content": "The animation effect of this component is dependent on the `prefers-reduced-motion` media query. See the [reduced motion section of our accessibility documentation](/docs/[[config:docs_version]]/getting-started/accessibility/#reduced-motion).\n"
  },
  {
    "path": "site/src/content/callouts/info-sanitizer.md",
    "content": "By default, this component uses the built-in content sanitizer, which strips out any HTML elements that are not explicitly allowed. See the [sanitizer section in our JavaScript documentation](/docs/[[config:docs_version]]/getting-started/javascript/#sanitizer) for more details.\n"
  },
  {
    "path": "site/src/content/callouts/warning-color-assistive-technologies.md",
    "content": "**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/[[config:docs_version]]/getting-started/accessibility/#color-contrast)) or is included through alternative means, such as additional text hidden with the `.visually-hidden` class.\n"
  },
  {
    "path": "site/src/content/callouts/warning-data-bs-title-vs-title.md",
    "content": "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.\n"
  },
  {
    "path": "site/src/content/callouts/warning-input-support.md",
    "content": "Some date inputs types are [not fully supported](https://caniuse.com/input-datetime) by the latest versions of Safari and Firefox.\n"
  },
  {
    "path": "site/src/content/config.ts",
    "content": "import { z, defineCollection } from 'astro:content'\n\nconst docsSchema = z.object({\n  added: z\n    .object({\n      show_badge: z.boolean().optional(),\n      version: z.string()\n    })\n    .optional(),\n  aliases: z.string().or(z.string().array()).optional(),\n  description: z.string(),\n  direction: z.literal('rtl').optional(),\n  extra_js: z\n    .object({\n      async: z.boolean().optional(),\n      src: z.string()\n    })\n    .array()\n    .optional(),\n  sections: z\n    .object({\n      description: z.string(),\n      title: z.string()\n    })\n    .array()\n    .optional(),\n  thumbnail: z.string().optional(),\n  title: z.string(),\n  toc: z.boolean().optional()\n})\n\nconst docsCollection = defineCollection({\n  schema: docsSchema\n})\n\nconst calloutsSchema = z.object({})\n\nconst calloutsCollection = defineCollection({\n  schema: calloutsSchema\n})\n\nexport const collections = {\n  docs: docsCollection,\n  callouts: calloutsCollection\n}\n"
  },
  {
    "path": "site/src/content/docs/about/brand.mdx",
    "content": "---\ntitle: Brand guidelines\ndescription: Documentation and examples for Bootstrap’s logo and brand usage guidelines.\ntoc: true\n---\n\nHave a need for Bootstrap’s brand resources? Great! We have only a few guidelines we follow, and in turn ask you to follow as well.\n\n## Logo\n\nWhen referencing Bootstrap, use our logo mark. Do not modify our logos in any way. Do not use Bootstrap’s branding for your own open or closed source projects.\n\n<div class=\"bd-brand-item px-2 py-5 mb-3 border rounded-3\">\n  <img class=\"d-block img-fluid mx-auto\" src=\"/docs/[[config:docs_version]]/assets/brand/bootstrap-logo.svg\" alt=\"Bootstrap\" width=\"256\" height=\"204\" />\n</div>\n\nOur logo mark is also available in black and white. All rules for our primary logo apply to these as well.\n\n<div class=\"bd-brand-logos d-sm-flex text-center bg-light rounded-3 overflow-hidden w-100 mb-3\">\n  <div class=\"bd-brand-item w-100 px-2 py-5\">\n    <img src=\"/docs/[[config:docs_version]]/assets/brand/bootstrap-logo-black.svg\" alt=\"Bootstrap\" width=\"128\" height=\"102\" loading=\"lazy\" />\n  </div>\n  <div class=\"bd-brand-item w-100 px-2 py-5 inverse\">\n    <img src=\"/docs/[[config:docs_version]]/assets/brand/bootstrap-logo-white.svg\" alt=\"Bootstrap\" width=\"128\" height=\"102\" loading=\"lazy\" />\n  </div>\n</div>\n\n## Name\n\nBootstrap should always be referred to as just **Bootstrap**. No capital _s_.\n\n<div class=\"bd-brand-logos d-sm-flex text-center border rounded-3 overflow-hidden w-100 mb-3\">\n  <div class=\"bd-brand-item w-100 px-2 py-5\">\n    <div class=\"h3\">Bootstrap</div>\n    <strong class=\"text-success\">Correct</strong>\n  </div>\n  <div class=\"bd-brand-item w-100 px-2 py-5\">\n    <div class=\"h3 text-body-secondary\">BootStrap</div>\n    <strong class=\"text-danger\">Incorrect</strong>\n  </div>\n</div>\n"
  },
  {
    "path": "site/src/content/docs/about/license.mdx",
    "content": "---\ntitle: License FAQs\ndescription: Commonly asked questions about Bootstrap’s open source license.\n---\n\nBootstrap is released under the MIT license and is copyright {new Date().getFullYear()}. Boiled down to smaller chunks, it can be described with the following conditions.\n\n## It requires you to:\n\n- Keep the license and copyright notice included in Bootstrap’s CSS and JavaScript files when you use them in your works\n\n## It permits you to:\n\n- Freely download and use Bootstrap, in whole or in part, for personal, private, company internal, or commercial purposes\n- Use Bootstrap in packages or distributions that you create\n- Modify the source code\n- Grant a sublicense to modify and distribute Bootstrap to third parties not included in the license\n\n## It forbids you to:\n\n- Hold the authors and license owners liable for damages as Bootstrap is provided without warranty\n- Hold the creators or copyright holders of Bootstrap liable\n- Redistribute any piece of Bootstrap without proper attribution\n- Use any marks owned by Bootstrap in any way that might state or imply that Bootstrap endorses your distribution\n- Use any marks owned by Bootstrap in any way that might state or imply that you created the Bootstrap software in question\n\n## It does not require you to:\n\n- Include the source of Bootstrap itself, or of any modifications you may have made to it, in any redistribution you may assemble that includes it\n- Submit changes that you make to Bootstrap back to the Bootstrap project (though such feedback is encouraged)\n\nThe full Bootstrap license is located [in the project repository]([[config:repo]]/blob/v[[config:current_version]]/LICENSE) for more information.\n"
  },
  {
    "path": "site/src/content/docs/about/overview.mdx",
    "content": "---\ntitle: About Bootstrap\ndescription: Learn more about the team maintaining Bootstrap, how and why the project started, and how to get involved.\naliases:\n - \"/about/\"\n - \"/docs/[[config:docs_version]]/about/\"\n---\n\n## Team\n\nBootstrap is maintained by a [small team of developers](https://github.com/orgs/twbs/people) on GitHub. We’re actively looking to grow this team and would love to hear from you if you’re excited about CSS at scale, writing and maintaining vanilla JavaScript plugins, and improving build tooling processes for frontend code.\n\n## History\n\nOriginally created by a designer and a developer at Twitter, Bootstrap has become one of the most popular front-end frameworks and open source projects in the world.\n\nBootstrap was created at Twitter in mid-2010 by [@mdo](https://x.com/mdo) and [@fat](https://x.com/fat). Prior to being an open-sourced framework, Bootstrap was known as _Twitter Blueprint_. A few months into development, Twitter held its [first Hack Week](https://blog.x.com/engineering/en_us/a/2010/hack-week) and the project exploded as developers of all skill levels jumped in without any external guidance. It served as the style guide for internal tools development at the company for over a year before its public release, and continues to do so today.\n\nOriginally [released](https://blog.x.com/developer/en_us/a/2011/bootstrap-twitter) on <time datetime=\"2011-08-19 11:25\">Friday, August 19, 2011</time>, we’ve since had over [twenty releases]([[config:repo]]/releases), including two major rewrites with v2 and v3. With Bootstrap 2, we added responsive functionality to the entire framework as an optional stylesheet. Building on that with Bootstrap 3, we rewrote the library once more to make it responsive by default with a mobile first approach.\n\nWith Bootstrap 4, we once again rewrote the project to account for two key architectural changes: a migration to Sass and the move to CSS’s flexbox. Our intention is to help in a small way to move the web development community forward by pushing for newer CSS properties, fewer dependencies, and new technologies across more modern browsers.\n\nOur latest release, Bootstrap 5, focuses on improving v4’s codebase with as few major breaking changes as possible. We improved existing features and components, removed support for older browsers, dropped jQuery for regular JavaScript, and embraced more future-friendly technologies like CSS custom properties as part of our tooling.\n\n## Get involved\n\nGet involved with Bootstrap development by [opening an issue]([[config:repo]]/issues/new/choose) or submitting a pull request. Read our [contributing guidelines]([[config:repo]]/blob/v[[config:current_version]]/.github/CONTRIBUTING.md) for information on how we develop.\n"
  },
  {
    "path": "site/src/content/docs/about/team.mdx",
    "content": "---\ntitle: Team\ndescription: An overview of the founding team and core contributors to Bootstrap.\n---\n\nimport { getData } from '@libs/data'\n\nBootstrap is maintained by the founding team and a small group of invaluable core contributors, with the massive support and involvement of our community.\n\n<div class=\"list-group mb-3\">\n  {getData('core-team').map((member) => {\n    return (\n      <a class=\"list-group-item list-group-item-action d-flex align-items-center\" href={`https://github.com/${member.user}`}>\n        <img src={`https://github.com/${member.user}.png`} alt={`@${member.user}`} width=\"32\" height=\"32\" class=\"rounded me-2\" loading=\"lazy\"/>\n        <span>\n          <strong>{member.name}</strong> @{member.user}\n        </span>\n      </a>\n    )\n  })}\n</div>\n\nGet involved with Bootstrap development by [opening an issue]([[config:repo]]/issues/new/choose) or submitting a pull request. Read our [contributing guidelines]([[config:repo]]/blob/v[[config:current_version]]/.github/CONTRIBUTING.md) for information on how we develop.\n"
  },
  {
    "path": "site/src/content/docs/about/translations.mdx",
    "content": "---\ntitle: Translations\ndescription: Links to community-translated Bootstrap documentation sites.\n---\n\nimport { getData } from '@libs/data'\n\nCommunity members have translated Bootstrap’s documentation into various languages. None are officially supported and they may not always be up-to-date.\n\n<ul>\n  {getData('translations').map((translation) => {\n    return (\n      <li><a href={translation.url} hreflang={translation.code} lang={translation.code} >{translation.description} ({translation.name})</a></li>\n    )\n  })}\n</ul>\n\n**We don’t help organize or host translations, we just link to them.**\n\nFinished a new or better translation? Open a pull request to add it to our list.\n"
  },
  {
    "path": "site/src/content/docs/components/accordion.mdx",
    "content": "---\ntitle: Accordion\ndescription: Build vertically collapsing accordions in combination with our Collapse JavaScript plugin.\naliases:\n - \"/components/\"\n - \"/docs/[[config:docs_version]]/components/\"\ntoc: true\n---\n\n## How it works\n\nThe accordion uses [collapse]([[docsref:/components/collapse]]) internally to make it collapsible.\n\n<Callout name=\"info-prefersreducedmotion\" />\n\n## Example\n\nClick the accordions below to expand/collapse the accordion content.\n\nTo render an accordion that’s expanded by default:\n- add the `.show` class on the `.accordion-collapse` element.\n- drop the `.collapsed` class from the `.accordion-button` element and set its `aria-expanded` attribute to `true`.\n\n<Example code={`<div class=\"accordion\" id=\"accordionExample\">\n    <div class=\"accordion-item\">\n      <h2 class=\"accordion-header\">\n        <button class=\"accordion-button\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#collapseOne\" aria-expanded=\"true\" aria-controls=\"collapseOne\">\n          Accordion Item #1\n        </button>\n      </h2>\n      <div id=\"collapseOne\" class=\"accordion-collapse collapse show\" data-bs-parent=\"#accordionExample\">\n        <div class=\"accordion-body\">\n          <strong>This is the first item’s accordion body.</strong> It is shown by default, until the collapse plugin adds the appropriate classes that we use to style each element. These classes control the overall appearance, as well as the showing and hiding via CSS transitions. You can modify any of this with custom CSS or overriding our default variables. It’s also worth noting that just about any HTML can go within the <code>.accordion-body</code>, though the transition does limit overflow.\n        </div>\n      </div>\n    </div>\n    <div class=\"accordion-item\">\n      <h2 class=\"accordion-header\">\n        <button class=\"accordion-button collapsed\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#collapseTwo\" aria-expanded=\"false\" aria-controls=\"collapseTwo\">\n          Accordion Item #2\n        </button>\n      </h2>\n      <div id=\"collapseTwo\" class=\"accordion-collapse collapse\" data-bs-parent=\"#accordionExample\">\n        <div class=\"accordion-body\">\n          <strong>This is the second item’s accordion body.</strong> It is hidden by default, until the collapse plugin adds the appropriate classes that we use to style each element. These classes control the overall appearance, as well as the showing and hiding via CSS transitions. You can modify any of this with custom CSS or overriding our default variables. It’s also worth noting that just about any HTML can go within the <code>.accordion-body</code>, though the transition does limit overflow.\n        </div>\n      </div>\n    </div>\n    <div class=\"accordion-item\">\n      <h2 class=\"accordion-header\">\n        <button class=\"accordion-button collapsed\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#collapseThree\" aria-expanded=\"false\" aria-controls=\"collapseThree\">\n          Accordion Item #3\n        </button>\n      </h2>\n      <div id=\"collapseThree\" class=\"accordion-collapse collapse\" data-bs-parent=\"#accordionExample\">\n        <div class=\"accordion-body\">\n          <strong>This is the third item’s accordion body.</strong> It is hidden by default, until the collapse plugin adds the appropriate classes that we use to style each element. These classes control the overall appearance, as well as the showing and hiding via CSS transitions. You can modify any of this with custom CSS or overriding our default variables. It’s also worth noting that just about any HTML can go within the <code>.accordion-body</code>, though the transition does limit overflow.\n        </div>\n      </div>\n    </div>\n  </div>`} />\n\n### Flush\n\nAdd `.accordion-flush` to remove some borders and rounded corners to render accordions edge-to-edge with their parent container.\n\n<Example class=\"bg-body-secondary\" code={`<div class=\"accordion accordion-flush\" id=\"accordionFlushExample\">\n    <div class=\"accordion-item\">\n      <h2 class=\"accordion-header\">\n        <button class=\"accordion-button collapsed\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#flush-collapseOne\" aria-expanded=\"false\" aria-controls=\"flush-collapseOne\">\n          Accordion Item #1\n        </button>\n      </h2>\n      <div id=\"flush-collapseOne\" class=\"accordion-collapse collapse\" data-bs-parent=\"#accordionFlushExample\">\n        <div class=\"accordion-body\">Placeholder content for this accordion, which is intended to demonstrate the <code>.accordion-flush</code> class. This is the first item’s accordion body.</div>\n      </div>\n    </div>\n    <div class=\"accordion-item\">\n      <h2 class=\"accordion-header\">\n        <button class=\"accordion-button collapsed\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#flush-collapseTwo\" aria-expanded=\"false\" aria-controls=\"flush-collapseTwo\">\n          Accordion Item #2\n        </button>\n      </h2>\n      <div id=\"flush-collapseTwo\" class=\"accordion-collapse collapse\" data-bs-parent=\"#accordionFlushExample\">\n        <div class=\"accordion-body\">Placeholder content for this accordion, which is intended to demonstrate the <code>.accordion-flush</code> class. This is the second item’s accordion body. Let’s imagine this being filled with some actual content.</div>\n      </div>\n    </div>\n    <div class=\"accordion-item\">\n      <h2 class=\"accordion-header\">\n        <button class=\"accordion-button collapsed\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#flush-collapseThree\" aria-expanded=\"false\" aria-controls=\"flush-collapseThree\">\n          Accordion Item #3\n        </button>\n      </h2>\n      <div id=\"flush-collapseThree\" class=\"accordion-collapse collapse\" data-bs-parent=\"#accordionFlushExample\">\n        <div class=\"accordion-body\">Placeholder content for this accordion, which is intended to demonstrate the <code>.accordion-flush</code> class. This is the third item’s accordion body. Nothing more exciting happening here in terms of content, but just filling up the space to make it look, at least at first glance, a bit more representative of how this would look in a real-world application.</div>\n      </div>\n    </div>\n  </div>`} />\n\n### Always open\n\nOmit the `data-bs-parent` attribute on each `.accordion-collapse` to make accordion items stay open when another item is opened.\n\n<Example code={`<div class=\"accordion\" id=\"accordionPanelsStayOpenExample\">\n    <div class=\"accordion-item\">\n      <h2 class=\"accordion-header\">\n        <button class=\"accordion-button\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#panelsStayOpen-collapseOne\" aria-expanded=\"true\" aria-controls=\"panelsStayOpen-collapseOne\">\n          Accordion Item #1\n        </button>\n      </h2>\n      <div id=\"panelsStayOpen-collapseOne\" class=\"accordion-collapse collapse show\">\n        <div class=\"accordion-body\">\n          <strong>This is the first item’s accordion body.</strong> It is shown by default, until the collapse plugin adds the appropriate classes that we use to style each element. These classes control the overall appearance, as well as the showing and hiding via CSS transitions. You can modify any of this with custom CSS or overriding our default variables. It’s also worth noting that just about any HTML can go within the <code>.accordion-body</code>, though the transition does limit overflow.\n        </div>\n      </div>\n    </div>\n    <div class=\"accordion-item\">\n      <h2 class=\"accordion-header\">\n        <button class=\"accordion-button collapsed\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#panelsStayOpen-collapseTwo\" aria-expanded=\"false\" aria-controls=\"panelsStayOpen-collapseTwo\">\n          Accordion Item #2\n        </button>\n      </h2>\n      <div id=\"panelsStayOpen-collapseTwo\" class=\"accordion-collapse collapse\">\n        <div class=\"accordion-body\">\n          <strong>This is the second item’s accordion body.</strong> It is hidden by default, until the collapse plugin adds the appropriate classes that we use to style each element. These classes control the overall appearance, as well as the showing and hiding via CSS transitions. You can modify any of this with custom CSS or overriding our default variables. It’s also worth noting that just about any HTML can go within the <code>.accordion-body</code>, though the transition does limit overflow.\n        </div>\n      </div>\n    </div>\n    <div class=\"accordion-item\">\n      <h2 class=\"accordion-header\">\n        <button class=\"accordion-button collapsed\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#panelsStayOpen-collapseThree\" aria-expanded=\"false\" aria-controls=\"panelsStayOpen-collapseThree\">\n          Accordion Item #3\n        </button>\n      </h2>\n      <div id=\"panelsStayOpen-collapseThree\" class=\"accordion-collapse collapse\">\n        <div class=\"accordion-body\">\n          <strong>This is the third item’s accordion body.</strong> It is hidden by default, until the collapse plugin adds the appropriate classes that we use to style each element. These classes control the overall appearance, as well as the showing and hiding via CSS transitions. You can modify any of this with custom CSS or overriding our default variables. It’s also worth noting that just about any HTML can go within the <code>.accordion-body</code>, though the transition does limit overflow.\n        </div>\n      </div>\n    </div>\n  </div>`} />\n\n## Accessibility\n\nPlease read the [collapse accessibility section]([[docsref:/components/collapse#accessibility]]) for more information.\n\n## CSS\n\n### Variables\n\n<AddedIn version=\"5.2.0\" />\n\nAs part of Bootstrap’s evolving CSS variables approach, accordions now use local CSS variables on `.accordion` for enhanced real-time customization. Values for the CSS variables are set via Sass, so Sass customization is still supported, too.\n\n<ScssDocs name=\"accordion-css-vars\" file=\"scss/_accordion.scss\" />\n\n### Sass variables\n\n<ScssDocs name=\"accordion-variables\" file=\"scss/_variables.scss\" />\n\n## Usage\n\nThe collapse plugin utilizes a few classes to handle the heavy lifting:\n\n- `.collapse` hides the content\n- `.collapse.show` shows the content\n- `.collapsing` is added when the transition starts, and removed when it finishes\n\nThese classes can be found in `_transitions.scss`.\n\n### Via data attributes\n\nJust add `data-bs-toggle=\"collapse\"` and a `data-bs-target` to the element to automatically assign control of one or more collapsible elements. The `data-bs-target` attribute accepts a CSS selector to apply the collapse to. Be sure to add the class `collapse` to the collapsible element. If you’d like it to default open, add the additional class `show`.\n\nTo add accordion group management to a collapsible area, add the data attribute `data-bs-parent=\"#selector\"`.\n\n### Via JavaScript\n\nEnable manually with:\n\n```js\nconst accordionCollapseElementList = document.querySelectorAll('#myAccordion .collapse')\nconst accordionCollapseList = [...accordionCollapseElementList].map(accordionCollapseEl => new bootstrap.Collapse(accordionCollapseEl))\n```\n\n### Options\n\n<JsDataAttributes />\n\n<BsTable>\n| Name | Type | Default | Description |\n| --- | --- | --- | --- |\n`parent` | selector, DOM element | `null` | If parent is provided, then all collapsible elements under the specified parent will be closed when this collapsible item is shown. (similar to traditional accordion behavior - this is dependent on the `card` class). The attribute has to be set on the target collapsible area. |\n`toggle` | boolean | `true` | Toggles the collapsible element on invocation. |\n</BsTable>\n\n### Methods\n\n<Callout name=\"danger-async-methods\" type=\"danger\" />\n\nActivates your content as a collapsible element. Accepts an optional options `object`.\n\nYou can create a collapse instance with the constructor, for example:\n\n```js\nconst bsCollapse = new bootstrap.Collapse('#myCollapse', {\n  toggle: false\n})\n```\n\n<BsTable>\n| Method | Description |\n| --- | --- |\n| `dispose` | Destroys an element’s collapse. (Removes stored data on the DOM element) |\n| `getInstance` | Static method which allows you to get the collapse instance associated to a DOM element, you can use it like this: `bootstrap.Collapse.getInstance(element)`. |\n| `getOrCreateInstance` | Static method which returns a collapse instance associated to a DOM element or create a new one in case it wasn’t initialized. You can use it like this: `bootstrap.Collapse.getOrCreateInstance(element)`. |\n| `hide` | Hides a collapsible element. **Returns to the caller before the collapsible element has actually been hidden** (e.g., before the `hidden.bs.collapse` event occurs). |\n| `show` | Shows a collapsible element. **Returns to the caller before the collapsible element has actually been shown** (e.g., before the `shown.bs.collapse` event occurs). |\n| `toggle` | Toggles a collapsible element to shown or hidden. **Returns to the caller before the collapsible element has actually been shown or hidden** (i.e. before the `shown.bs.collapse` or `hidden.bs.collapse` event occurs). |\n</BsTable>\n\n### Events\n\nBootstrap’s collapse class exposes a few events for hooking into collapse functionality.\n\n<BsTable>\n| Event type | Description |\n| --- | --- |\n| `hide.bs.collapse` | This event is fired immediately when the `hide` method has been called. |\n| `hidden.bs.collapse` | This event is fired when a collapse element has been hidden from the user (will wait for CSS transitions to complete). |\n| `show.bs.collapse` | This event fires immediately when the `show` instance method is called. |\n| `shown.bs.collapse` | This event is fired when a collapse element has been made visible to the user (will wait for CSS transitions to complete). |\n</BsTable>\n\n```js\nconst myCollapsible = document.getElementById('myCollapsible')\nmyCollapsible.addEventListener('hidden.bs.collapse', event => {\n  // do something...\n})\n```\n"
  },
  {
    "path": "site/src/content/docs/components/alerts.mdx",
    "content": "---\ntitle: Alerts\ndescription: Provide contextual feedback messages for typical user actions with the handful of available and flexible alert messages.\ntoc: true\n---\n\nimport { getData } from '@libs/data'\n\n## Examples\n\nAlerts are available for any length of text, as well as an optional close button. For proper styling, use one of the eight **required** contextual classes (e.g., `.alert-success`). For inline dismissal, use the [alerts JavaScript plugin](#dismissing).\n\n<Callout>\n**Heads up!** As of v5.3.0, the `alert-variant()` Sass mixin is deprecated. Alert variants now have their CSS variables overridden in [a Sass loop](#sass-loops).\n</Callout>\n\n<Example code={getData('theme-colors').map((themeColor) => `<div class=\"alert alert-${themeColor.name}\" role=\"alert\">\n    A simple ${themeColor.name} alert—check it out!\n  </div>`)} />\n\n<Callout name=\"warning-color-assistive-technologies\" />\n\n### Live example\n\nClick the button below to show an alert (hidden with inline styles to start), then dismiss (and destroy) it with the built-in close button.\n\n<Example addStackblitzJs code={`<div id=\"liveAlertPlaceholder\"></div>\n<button type=\"button\" class=\"btn btn-primary\" id=\"liveAlertBtn\">Show live alert</button>`} />\n\nWe use the following JavaScript to trigger our live alert demo:\n\n<JsDocs name=\"live-alert\" file=\"site/src/assets/partials/snippets.js\" />\n\n### Link color\n\nUse the `.alert-link` utility class to quickly provide matching colored links within any alert.\n\n<Example code={getData('theme-colors').map((themeColor) => `<div class=\"alert alert-${themeColor.name}\" role=\"alert\">\n    A simple ${themeColor.name} alert with <a href=\"#\" class=\"alert-link\">an example link</a>. Give it a click if you like.\n  </div>`)} />\n\n### Additional content\n\nAlerts can also contain additional HTML elements like headings, paragraphs and dividers.\n\n<Example code={`<div class=\"alert alert-success\" role=\"alert\">\n    <h4 class=\"alert-heading\">Well done!</h4>\n    <p>Aww yeah, you successfully read this important alert message. This example text is going to run a bit longer so that you can see how spacing within an alert works with this kind of content.</p>\n    <hr>\n    <p class=\"mb-0\">Whenever you need to, be sure to use margin utilities to keep things nice and tidy.</p>\n  </div>`} />\n\n### Icons\n\nSimilarly, you can use [flexbox utilities]([[docsref:/utilities/flex]]) and [Bootstrap Icons]([[config:icons]]) to create alerts with icons. Depending on your icons and content, you may want to add more utilities or custom styles.\n\n<Example code={`<div class=\"alert alert-primary d-flex align-items-center\" role=\"alert\">\n    <svg xmlns=\"http://www.w3.org/2000/svg\" class=\"bi flex-shrink-0 me-2\" viewBox=\"0 0 16 16\" role=\"img\" aria-label=\"Warning:\">\n      <path d=\"M8.982 1.566a1.13 1.13 0 0 0-1.96 0L.165 13.233c-.457.778.091 1.767.98 1.767h13.713c.889 0 1.438-.99.98-1.767L8.982 1.566zM8 5c.535 0 .954.462.9.995l-.35 3.507a.552.552 0 0 1-1.1 0L7.1 5.995A.905.905 0 0 1 8 5zm.002 6a1 1 0 1 1 0 2 1 1 0 0 1 0-2z\"/>\n    </svg>\n    <div>\n      An example alert with an icon\n    </div>\n  </div>`} />\n\nNeed more than one icon for your alerts? Consider using more Bootstrap Icons and making a local SVG sprite like so to easily reference the same icons repeatedly.\n\n<Example code={`<svg xmlns=\"http://www.w3.org/2000/svg\" class=\"d-none\">\n    <symbol id=\"check-circle-fill\" viewBox=\"0 0 16 16\">\n      <path d=\"M16 8A8 8 0 1 1 0 8a8 8 0 0 1 16 0zm-3.97-3.03a.75.75 0 0 0-1.08.022L7.477 9.417 5.384 7.323a.75.75 0 0 0-1.06 1.06L6.97 11.03a.75.75 0 0 0 1.079-.02l3.992-4.99a.75.75 0 0 0-.01-1.05z\"/>\n    </symbol>\n    <symbol id=\"info-fill\" viewBox=\"0 0 16 16\">\n      <path d=\"M8 16A8 8 0 1 0 8 0a8 8 0 0 0 0 16zm.93-9.412-1 4.705c-.07.34.029.533.304.533.194 0 .487-.07.686-.246l-.088.416c-.287.346-.92.598-1.465.598-.703 0-1.002-.422-.808-1.319l.738-3.468c.064-.293.006-.399-.287-.47l-.451-.081.082-.381 2.29-.287zM8 5.5a1 1 0 1 1 0-2 1 1 0 0 1 0 2z\"/>\n    </symbol>\n    <symbol id=\"exclamation-triangle-fill\" viewBox=\"0 0 16 16\">\n      <path d=\"M8.982 1.566a1.13 1.13 0 0 0-1.96 0L.165 13.233c-.457.778.091 1.767.98 1.767h13.713c.889 0 1.438-.99.98-1.767L8.982 1.566zM8 5c.535 0 .954.462.9.995l-.35 3.507a.552.552 0 0 1-1.1 0L7.1 5.995A.905.905 0 0 1 8 5zm.002 6a1 1 0 1 1 0 2 1 1 0 0 1 0-2z\"/>\n    </symbol>\n  </svg>\n\n  <div class=\"alert alert-primary d-flex align-items-center\" role=\"alert\">\n    <svg class=\"bi flex-shrink-0 me-2\" role=\"img\" aria-label=\"Info:\"><use xlink:href=\"#info-fill\"/></svg>\n    <div>\n      An example alert with an icon\n    </div>\n  </div>\n  <div class=\"alert alert-success d-flex align-items-center\" role=\"alert\">\n    <svg class=\"bi flex-shrink-0 me-2\" role=\"img\" aria-label=\"Success:\"><use xlink:href=\"#check-circle-fill\"/></svg>\n    <div>\n      An example success alert with an icon\n    </div>\n  </div>\n  <div class=\"alert alert-warning d-flex align-items-center\" role=\"alert\">\n    <svg class=\"bi flex-shrink-0 me-2\" role=\"img\" aria-label=\"Warning:\"><use xlink:href=\"#exclamation-triangle-fill\"/></svg>\n    <div>\n      An example warning alert with an icon\n    </div>\n  </div>\n  <div class=\"alert alert-danger d-flex align-items-center\" role=\"alert\">\n    <svg class=\"bi flex-shrink-0 me-2\" role=\"img\" aria-label=\"Danger:\"><use xlink:href=\"#exclamation-triangle-fill\"/></svg>\n    <div>\n      An example danger alert with an icon\n    </div>\n  </div>`} />\n\n### Dismissing\n\nUsing the alert JavaScript plugin, it’s possible to dismiss any alert inline. Here’s how:\n\n- Be sure you’ve loaded the alert plugin, or the compiled Bootstrap JavaScript.\n- Add a [close button]([[docsref:/components/close-button]]) and the `.alert-dismissible` class, which adds extra padding to the right of the alert and positions the close button.\n- On the close button, add the `data-bs-dismiss=\"alert\"` attribute, which triggers the JavaScript functionality. Be sure to use the `<button>` element with it for proper behavior across all devices.\n- To animate alerts when dismissing them, be sure to add the `.fade` and `.show` classes.\n\nYou can see this in action with a live demo:\n\n<Example code={`<div class=\"alert alert-warning alert-dismissible fade show\" role=\"alert\">\n    <strong>Holy guacamole!</strong> You should check in on some of those fields below.\n    <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"alert\" aria-label=\"Close\"></button>\n  </div>`} />\n\n<Callout type=\"warning\">\nWhen an alert is dismissed, the element is completely removed from the page structure. If a keyboard user dismisses the alert using the close button, their focus will suddenly be lost and, depending on the browser, reset to the start of the page/document. For this reason, we recommend including additional JavaScript that listens for the `closed.bs.alert` event and programmatically sets `focus()` to the most appropriate location in the page. If you’re planning to move focus to a non-interactive element that normally does not receive focus, make sure to add `tabindex=\"-1\"` to the element.\n</Callout>\n\n## CSS\n\n### Variables\n\n<AddedIn version=\"5.2.0\" />\n\nAs part of Bootstrap’s evolving CSS variables approach, alerts now use local CSS variables on `.alert` for enhanced real-time customization. Values for the CSS variables are set via Sass, so Sass customization is still supported, too.\n\n<ScssDocs name=\"alert-css-vars\" file=\"scss/_alert.scss\" />\n\n### Sass variables\n\n<ScssDocs name=\"alert-variables\" file=\"scss/_variables.scss\" />\n\n### Sass mixins\n\n<DeprecatedIn version=\"5.3.0\" />\n\n<ScssDocs name=\"alert-variant-mixin\" file=\"scss/mixins/_alert.scss\" removeIndentation={false} />\n\n### Sass loops\n\nLoop that generates the modifier classes with an overriding of CSS variables.\n\n<ScssDocs name=\"alert-modifiers\" file=\"scss/_alert.scss\" removeIndentation={false} />\n\n## JavaScript behavior\n\n### Initialize\n\nInitialize elements as alerts\n\n```js\nconst alertList = document.querySelectorAll('.alert')\nconst alerts = [...alertList].map(element => new bootstrap.Alert(element))\n```\n\n<Callout>\nFor the sole purpose of dismissing an alert, it isn’t necessary to initialize the component manually via the JS API. By making use of `data-bs-dismiss=\"alert\"`, the component will be initialized automatically and properly dismissed.\n\nSee the [triggers](#triggers) section for more details.\n</Callout>\n\n### Triggers\n\n<JsDismiss name=\"alert\" />\n\n**Note that closing an alert will remove it from the DOM.**\n\n### Methods\n\nYou can create an alert instance with the alert constructor, for example:\n\n```js\nconst bsAlert = new bootstrap.Alert('#myAlert')\n```\n\nThis makes an alert listen for click events on descendant elements which have the `data-bs-dismiss=\"alert\"` attribute. (Not necessary when using the data-api’s auto-initialization.)\n\n<BsTable>\n| Method | Description |\n| --- | --- |\n| `close` | Closes an alert by removing it from the DOM. If the `.fade` and `.show` classes are present on the element, the alert will fade out before it is removed. |\n| `dispose` | Destroys an element’s alert. (Removes stored data on the DOM element) |\n| `getInstance` | Static method which allows you to get the alert instance associated to a DOM element. For example: `bootstrap.Alert.getInstance(alert)`. |\n| `getOrCreateInstance` | Static method which returns an alert instance associated to a DOM element or create a new one in case it wasn’t initialized. You can use it like this: `bootstrap.Alert.getOrCreateInstance(element)`. |\n</BsTable>\n\nBasic usage:\n\n```js\nconst alert = bootstrap.Alert.getOrCreateInstance('#myAlert')\nalert.close()\n```\n\n### Events\n\nBootstrap’s alert plugin exposes a few events for hooking into alert functionality.\n\n<BsTable>\n| Event | Description |\n| --- | --- |\n| `close.bs.alert` | Fires immediately when the `close` instance method is called. |\n| `closed.bs.alert` | Fired when the alert has been closed and CSS transitions have completed. |\n</BsTable>\n\n```js\nconst myAlert = document.getElementById('myAlert')\nmyAlert.addEventListener('closed.bs.alert', event => {\n  // do something, for instance, explicitly move focus to the most appropriate element,\n  // so it doesn’t get lost/reset to the start of the page\n  // document.getElementById('...').focus()\n})\n```\n"
  },
  {
    "path": "site/src/content/docs/components/badge.mdx",
    "content": "---\ntitle: Badges\ndescription: Documentation and examples for badges, our small count and labeling component.\ntoc: true\n---\n\nimport { getData } from '@libs/data'\n\n## Examples\n\nBadges scale to match the size of the immediate parent element by using relative font sizing and `em` units. As of v5, badges no longer have focus or hover styles for links.\n\n### Headings\n\n<Example code={`<h1>Example heading <span class=\"badge text-bg-secondary\">New</span></h1>\n<h2>Example heading <span class=\"badge text-bg-secondary\">New</span></h2>\n<h3>Example heading <span class=\"badge text-bg-secondary\">New</span></h3>\n<h4>Example heading <span class=\"badge text-bg-secondary\">New</span></h4>\n<h5>Example heading <span class=\"badge text-bg-secondary\">New</span></h5>\n<h6>Example heading <span class=\"badge text-bg-secondary\">New</span></h6>`} />\n\n### Buttons\n\nBadges can be used as part of links or buttons to provide a counter.\n\n<Example code={`<button type=\"button\" class=\"btn btn-primary\">\n    Notifications <span class=\"badge text-bg-secondary\">4</span>\n  </button>`} />\n\nNote that depending on how they are used, badges may be confusing for users of screen readers and similar assistive technologies. While the styling of badges provides a visual cue as to their purpose, these users will simply be presented with the content of the badge. Depending on the specific situation, these badges may seem like random additional words or numbers at the end of a sentence, link, or button.\n\nUnless the context is clear (as with the “Notifications” example, where it is understood that the “4” is the number of notifications), consider including additional context with a visually hidden piece of additional text.\n\n### Positioned\n\nUse utilities to modify a `.badge` and position it in the corner of a link or button.\n\n<Example code={`<button type=\"button\" class=\"btn btn-primary position-relative\">\n    Inbox\n    <span class=\"position-absolute top-0 start-100 translate-middle badge rounded-pill bg-danger\">\n      99+\n      <span class=\"visually-hidden\">unread messages</span>\n    </span>\n  </button>`} />\n\nYou can also replace the `.badge` class with a few more utilities without a count for a more generic indicator.\n\n<Example code={`<button type=\"button\" class=\"btn btn-primary position-relative\">\n    Profile\n    <span class=\"position-absolute top-0 start-100 translate-middle p-2 bg-danger border border-light rounded-circle\">\n      <span class=\"visually-hidden\">New alerts</span>\n    </span>\n  </button>`} />\n\n## Background colors\n\n<AddedIn version=\"5.2.0\" />\n\nSet a `background-color` with contrasting foreground `color` with [our `.text-bg-{color}` helpers]([[docsref:helpers/color-background]]). Previously it was required to manually pair your choice of [`.text-{color}`]([[docsref:/utilities/colors]]) and [`.bg-{color}`]([[docsref:/utilities/background]]) utilities for styling, which you still may use if you prefer.\n\n<Example code={getData('theme-colors').map((themeColor) => `<span class=\"badge text-bg-${themeColor.name}\">${themeColor.title}</span>`)} />\n\n<Callout name=\"warning-color-assistive-technologies\" />\n\n## Pill badges\n\nUse the `.rounded-pill` utility class to make badges more rounded with a larger `border-radius`.\n\n<Example code={getData('theme-colors').map((themeColor) => `<span class=\"badge rounded-pill text-bg-${themeColor.name}\">${themeColor.title}</span>`)} />\n\n## CSS\n\n### Variables\n\n<AddedIn version=\"5.2.0\" />\n\nAs part of Bootstrap’s evolving CSS variables approach, badges now use local CSS variables on `.badge` for enhanced real-time customization. Values for the CSS variables are set via Sass, so Sass customization is still supported, too.\n\n<ScssDocs name=\"badge-css-vars\" file=\"scss/_badge.scss\" />\n\n### Sass variables\n\n<ScssDocs name=\"badge-variables\" file=\"scss/_variables.scss\" />\n"
  },
  {
    "path": "site/src/content/docs/components/breadcrumb.mdx",
    "content": "---\ntitle: Breadcrumb\ndescription: Indicate the current page’s location within a navigational hierarchy that automatically adds separators via CSS.\ntoc: true\n---\n\n## Example\n\nUse an ordered or unordered list with linked list items to create a minimally styled breadcrumb. Use our utilities to add additional styles as desired.\n\n<Example code={`<nav aria-label=\"breadcrumb\">\n    <ol class=\"breadcrumb\">\n      <li class=\"breadcrumb-item active\" aria-current=\"page\">Home</li>\n    </ol>\n  </nav>\n\n  <nav aria-label=\"breadcrumb\">\n    <ol class=\"breadcrumb\">\n      <li class=\"breadcrumb-item\"><a href=\"#\">Home</a></li>\n      <li class=\"breadcrumb-item active\" aria-current=\"page\">Library</li>\n    </ol>\n  </nav>\n\n  <nav aria-label=\"breadcrumb\">\n    <ol class=\"breadcrumb\">\n      <li class=\"breadcrumb-item\"><a href=\"#\">Home</a></li>\n      <li class=\"breadcrumb-item\"><a href=\"#\">Library</a></li>\n      <li class=\"breadcrumb-item active\" aria-current=\"page\">Data</li>\n    </ol>\n  </nav>`} />\n\n## Dividers\n\nDividers are automatically added in CSS through [`::before`](https://developer.mozilla.org/en-US/docs/Web/CSS/::before) and [`content`](https://developer.mozilla.org/en-US/docs/Web/CSS/content). They can be changed by modifying a local CSS custom property `--bs-breadcrumb-divider`, or through the `$breadcrumb-divider` Sass variable — and `$breadcrumb-divider-flipped` for its RTL counterpart, if needed. We default to our Sass variable, which is set as a fallback to the custom property. This way, you get a global divider that you can override without recompiling CSS at any time.\n\n<Example code={`<nav style=\"--bs-breadcrumb-divider: '>';\" aria-label=\"breadcrumb\">\n    <ol class=\"breadcrumb\">\n      <li class=\"breadcrumb-item\"><a href=\"#\">Home</a></li>\n      <li class=\"breadcrumb-item active\" aria-current=\"page\">Library</li>\n    </ol>\n  </nav>`} />\n\nWhen modifying via Sass, the [quote](https://sass-lang.com/documentation/modules/string/#quote) function is required to generate the quotes around a string. For example, using `>` as the divider, you can use this:\n\n```scss\n$breadcrumb-divider: quote(\">\");\n```\n\nIt’s also possible to use an **embedded SVG icon**. Apply it via our CSS custom property, or use the Sass variable.\n\n<Callout>\n**Inlined SVG requires properly escaped characters.** Some reserved characters, such as `<`, `>` and `#`, must be URL-encoded or escaped. We do this with the `$breadcrumb-divider` variable using our [`escape-svg()` Sass function]([[docsref:/customize/sass#escape-svg]]). When customizing the CSS variable, you must handle this yourself. Read [Kevin Weber’s explanations on CodePen](https://codepen.io/kevinweber/pen/dXWoRw ) for more info.\n</Callout>\n\n<Example code={`<nav style=\"--bs-breadcrumb-divider: url(&#34;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8'%3E%3Cpath d='M2.5 0L1 1.5 3.5 4 1 6.5 2.5 8l4-4-4-4z' fill='%236c757d'/%3E%3C/svg%3E&#34;);\" aria-label=\"breadcrumb\">\n    <ol class=\"breadcrumb\">\n      <li class=\"breadcrumb-item\"><a href=\"#\">Home</a></li>\n      <li class=\"breadcrumb-item active\" aria-current=\"page\">Library</li>\n    </ol>\n  </nav>`} />\n\n```scss\n$breadcrumb-divider: url(\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='8' height='8'><path d='M2.5 0L1 1.5 3.5 4 1 6.5 2.5 8l4-4-4-4z' fill='#{$breadcrumb-divider-color}'/></svg>\");\n```\n\nYou can also remove the divider setting `--bs-breadcrumb-divider: '';` (empty strings in CSS custom properties counts as a value), or setting the Sass variable to `$breadcrumb-divider: none;`.\n\n<Example code={`<nav style=\"--bs-breadcrumb-divider: '';\" aria-label=\"breadcrumb\">\n    <ol class=\"breadcrumb\">\n      <li class=\"breadcrumb-item\"><a href=\"#\">Home</a></li>\n      <li class=\"breadcrumb-item active\" aria-current=\"page\">Library</li>\n    </ol>\n  </nav>`} />\n\n\n```scss\n$breadcrumb-divider: none;\n```\n\n## Accessibility\n\nSince breadcrumbs provide a navigation, it’s a good idea to add a meaningful label such as `aria-label=\"breadcrumb\"` to describe the type of navigation provided in the `<nav>` element, as well as applying an `aria-current=\"page\"` to the last item of the set to indicate that it represents the current page.\n\nFor more information, see the [ARIA Authoring Practices Guide breadcrumb pattern](https://www.w3.org/WAI/ARIA/apg/patterns/breadcrumb/).\n\n## CSS\n\n### Variables\n\n<AddedIn version=\"5.2.0\" />\n\nAs part of Bootstrap’s evolving CSS variables approach, breadcrumbs now use local CSS variables on `.breadcrumb` for enhanced real-time customization. Values for the CSS variables are set via Sass, so Sass customization is still supported, too.\n\n<ScssDocs name=\"breadcrumb-css-vars\" file=\"scss/_breadcrumb.scss\" />\n\n### Sass variables\n\n<ScssDocs name=\"breadcrumb-variables\" file=\"scss/_variables.scss\" />\n"
  },
  {
    "path": "site/src/content/docs/components/button-group.mdx",
    "content": "---\ntitle: Button group\ndescription: Group a series of buttons together on a single line or stack them in a vertical column.\ntoc: true\n---\n\n## Basic example\n\nWrap a series of buttons with `.btn` in `.btn-group`.\n\n<Example code={`<div class=\"btn-group\" role=\"group\" aria-label=\"Basic example\">\n    <button type=\"button\" class=\"btn btn-primary\">Left</button>\n    <button type=\"button\" class=\"btn btn-primary\">Middle</button>\n    <button type=\"button\" class=\"btn btn-primary\">Right</button>\n  </div>`} />\n\n<Callout>\nButton groups require an appropriate `role` attribute and explicit label to ensure assistive technologies like screen readers identify buttons as grouped and announce them. Use `role=\"group\"` for button groups or `role=\"toolbar\"` for button toolbars. Then use `aria-label` or `aria-labelledby` to label them.\n</Callout>\n\nThese classes can also be added to groups of links, as an alternative to the [`.nav` navigation components]([[docsref:/components/navs-tabs]]).\n\n<Example code={`<div class=\"btn-group\">\n    <a href=\"#\" class=\"btn btn-primary active\" aria-current=\"page\">Active link</a>\n    <a href=\"#\" class=\"btn btn-primary\">Link</a>\n    <a href=\"#\" class=\"btn btn-primary\">Link</a>\n  </div>`} />\n\n## Mixed styles\n\n<Example code={`<div class=\"btn-group\" role=\"group\" aria-label=\"Basic mixed styles example\">\n    <button type=\"button\" class=\"btn btn-danger\">Left</button>\n    <button type=\"button\" class=\"btn btn-warning\">Middle</button>\n    <button type=\"button\" class=\"btn btn-success\">Right</button>\n  </div>`} />\n\n## Outlined styles\n\n<Example code={`<div class=\"btn-group\" role=\"group\" aria-label=\"Basic outlined example\">\n    <button type=\"button\" class=\"btn btn-outline-primary\">Left</button>\n    <button type=\"button\" class=\"btn btn-outline-primary\">Middle</button>\n    <button type=\"button\" class=\"btn btn-outline-primary\">Right</button>\n  </div>`} />\n\n## Checkbox and radio button groups\n\nCombine button-like checkbox and radio [toggle buttons]([[docsref:/forms/checks-radios]]) into a seamless looking button group.\n\n<Example code={`<div class=\"btn-group\" role=\"group\" aria-label=\"Basic checkbox toggle button group\">\n    <input type=\"checkbox\" class=\"btn-check\" id=\"btncheck1\" autocomplete=\"off\">\n    <label class=\"btn btn-outline-primary\" for=\"btncheck1\">Checkbox 1</label>\n\n    <input type=\"checkbox\" class=\"btn-check\" id=\"btncheck2\" autocomplete=\"off\">\n    <label class=\"btn btn-outline-primary\" for=\"btncheck2\">Checkbox 2</label>\n\n    <input type=\"checkbox\" class=\"btn-check\" id=\"btncheck3\" autocomplete=\"off\">\n    <label class=\"btn btn-outline-primary\" for=\"btncheck3\">Checkbox 3</label>\n  </div>`} />\n\n<Example code={`<div class=\"btn-group\" role=\"group\" aria-label=\"Basic radio toggle button group\">\n    <input type=\"radio\" class=\"btn-check\" name=\"btnradio\" id=\"btnradio1\" autocomplete=\"off\" checked>\n    <label class=\"btn btn-outline-primary\" for=\"btnradio1\">Radio 1</label>\n\n    <input type=\"radio\" class=\"btn-check\" name=\"btnradio\" id=\"btnradio2\" autocomplete=\"off\">\n    <label class=\"btn btn-outline-primary\" for=\"btnradio2\">Radio 2</label>\n\n    <input type=\"radio\" class=\"btn-check\" name=\"btnradio\" id=\"btnradio3\" autocomplete=\"off\">\n    <label class=\"btn btn-outline-primary\" for=\"btnradio3\">Radio 3</label>\n  </div>`} />\n\n## Button toolbar\n\nCombine sets of button groups into button toolbars for more complex components. Use utility classes as needed to space out groups, buttons, and more.\n\n<Example code={`<div class=\"btn-toolbar\" role=\"toolbar\" aria-label=\"Toolbar with button groups\">\n    <div class=\"btn-group me-2\" role=\"group\" aria-label=\"First group\">\n      <button type=\"button\" class=\"btn btn-primary\">1</button>\n      <button type=\"button\" class=\"btn btn-primary\">2</button>\n      <button type=\"button\" class=\"btn btn-primary\">3</button>\n      <button type=\"button\" class=\"btn btn-primary\">4</button>\n    </div>\n    <div class=\"btn-group me-2\" role=\"group\" aria-label=\"Second group\">\n      <button type=\"button\" class=\"btn btn-secondary\">5</button>\n      <button type=\"button\" class=\"btn btn-secondary\">6</button>\n      <button type=\"button\" class=\"btn btn-secondary\">7</button>\n    </div>\n    <div class=\"btn-group\" role=\"group\" aria-label=\"Third group\">\n      <button type=\"button\" class=\"btn btn-info\">8</button>\n    </div>\n  </div>`} />\n\nFeel free to mix input groups with button groups in your toolbars. Similar to the example above, you’ll likely need some utilities though to space things properly.\n\n<Example code={`<div class=\"btn-toolbar mb-3\" role=\"toolbar\" aria-label=\"Toolbar with button groups\">\n    <div class=\"btn-group me-2\" role=\"group\" aria-label=\"First group\">\n      <button type=\"button\" class=\"btn btn-outline-secondary\">1</button>\n      <button type=\"button\" class=\"btn btn-outline-secondary\">2</button>\n      <button type=\"button\" class=\"btn btn-outline-secondary\">3</button>\n      <button type=\"button\" class=\"btn btn-outline-secondary\">4</button>\n    </div>\n    <div class=\"input-group\">\n      <div class=\"input-group-text\" id=\"btnGroupAddon\">@</div>\n      <input type=\"text\" class=\"form-control\" placeholder=\"Input group example\" aria-label=\"Input group example\" aria-describedby=\"btnGroupAddon\">\n    </div>\n  </div>\n\n  <div class=\"btn-toolbar justify-content-between\" role=\"toolbar\" aria-label=\"Toolbar with button groups\">\n    <div class=\"btn-group\" role=\"group\" aria-label=\"First group\">\n      <button type=\"button\" class=\"btn btn-outline-secondary\">1</button>\n      <button type=\"button\" class=\"btn btn-outline-secondary\">2</button>\n      <button type=\"button\" class=\"btn btn-outline-secondary\">3</button>\n      <button type=\"button\" class=\"btn btn-outline-secondary\">4</button>\n    </div>\n    <div class=\"input-group\">\n      <div class=\"input-group-text\" id=\"btnGroupAddon2\">@</div>\n      <input type=\"text\" class=\"form-control\" placeholder=\"Input group example\" aria-label=\"Input group example\" aria-describedby=\"btnGroupAddon2\">\n    </div>\n  </div>`} />\n\n## Sizing\n\nInstead of applying button sizing classes to every button in a group, just add `.btn-group-*` to each `.btn-group`, including each one when nesting multiple groups.\n\n<Example code={`<div class=\"btn-group btn-group-lg\" role=\"group\" aria-label=\"Large button group\">\n    <button type=\"button\" class=\"btn btn-outline-primary\">Left</button>\n    <button type=\"button\" class=\"btn btn-outline-primary\">Middle</button>\n    <button type=\"button\" class=\"btn btn-outline-primary\">Right</button>\n  </div>\n  <br>\n  <div class=\"btn-group\" role=\"group\" aria-label=\"Default button group\">\n    <button type=\"button\" class=\"btn btn-outline-primary\">Left</button>\n    <button type=\"button\" class=\"btn btn-outline-primary\">Middle</button>\n    <button type=\"button\" class=\"btn btn-outline-primary\">Right</button>\n  </div>\n  <br>\n  <div class=\"btn-group btn-group-sm\" role=\"group\" aria-label=\"Small button group\">\n    <button type=\"button\" class=\"btn btn-outline-primary\">Left</button>\n    <button type=\"button\" class=\"btn btn-outline-primary\">Middle</button>\n    <button type=\"button\" class=\"btn btn-outline-primary\">Right</button>\n  </div>`} />\n\n## Nesting\n\nPlace a `.btn-group` within another `.btn-group` when you want dropdown menus mixed with a series of buttons.\n\n<Example code={`<div class=\"btn-group\" role=\"group\" aria-label=\"Button group with nested dropdown\">\n    <button type=\"button\" class=\"btn btn-primary\">1</button>\n    <button type=\"button\" class=\"btn btn-primary\">2</button>\n\n    <div class=\"btn-group\" role=\"group\">\n      <button type=\"button\" class=\"btn btn-primary dropdown-toggle\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n        Dropdown\n      </button>\n      <ul class=\"dropdown-menu\">\n        <li><a class=\"dropdown-item\" href=\"#\">Dropdown link</a></li>\n        <li><a class=\"dropdown-item\" href=\"#\">Dropdown link</a></li>\n      </ul>\n    </div>\n  </div>`} />\n\n## Vertical variation\n\nMake a set of buttons appear vertically stacked rather than horizontally. **Split button dropdowns are not supported here.**\n\n<Example code={`<div class=\"btn-group-vertical\" role=\"group\" aria-label=\"Vertical button group\">\n    <button type=\"button\" class=\"btn btn-primary\">Button</button>\n    <button type=\"button\" class=\"btn btn-primary\">Button</button>\n    <button type=\"button\" class=\"btn btn-primary\">Button</button>\n    <button type=\"button\" class=\"btn btn-primary\">Button</button>\n  </div>`} />\n\n<Example code={`<div class=\"btn-group-vertical\" role=\"group\" aria-label=\"Vertical button group\">\n    <div class=\"btn-group\" role=\"group\">\n      <button type=\"button\" class=\"btn btn-primary dropdown-toggle\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n        Dropdown\n      </button>\n      <ul class=\"dropdown-menu\">\n        <li><a class=\"dropdown-item\" href=\"#\">Dropdown link</a></li>\n        <li><a class=\"dropdown-item\" href=\"#\">Dropdown link</a></li>\n      </ul>\n    </div>\n    <button type=\"button\" class=\"btn btn-primary\">Button</button>\n    <button type=\"button\" class=\"btn btn-primary\">Button</button>\n    <div class=\"btn-group dropstart\" role=\"group\">\n      <button type=\"button\" class=\"btn btn-primary dropdown-toggle\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n        Dropdown\n      </button>\n      <ul class=\"dropdown-menu\">\n        <li><a class=\"dropdown-item\" href=\"#\">Dropdown link</a></li>\n        <li><a class=\"dropdown-item\" href=\"#\">Dropdown link</a></li>\n      </ul>\n    </div>\n    <div class=\"btn-group dropend\" role=\"group\">\n      <button type=\"button\" class=\"btn btn-primary dropdown-toggle\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n        Dropdown\n      </button>\n      <ul class=\"dropdown-menu\">\n        <li><a class=\"dropdown-item\" href=\"#\">Dropdown link</a></li>\n        <li><a class=\"dropdown-item\" href=\"#\">Dropdown link</a></li>\n      </ul>\n    </div>\n    <div class=\"btn-group dropup\" role=\"group\">\n      <button type=\"button\" class=\"btn btn-primary dropdown-toggle\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n        Dropdown\n      </button>\n      <ul class=\"dropdown-menu\">\n        <li><a class=\"dropdown-item\" href=\"#\">Dropdown link</a></li>\n        <li><a class=\"dropdown-item\" href=\"#\">Dropdown link</a></li>\n      </ul>\n    </div>\n  </div>`} />\n\n<Example code={`<div class=\"btn-group-vertical\" role=\"group\" aria-label=\"Vertical radio toggle button group\">\n    <input type=\"radio\" class=\"btn-check\" name=\"vbtn-radio\" id=\"vbtn-radio1\" autocomplete=\"off\" checked>\n    <label class=\"btn btn-outline-danger\" for=\"vbtn-radio1\">Radio 1</label>\n    <input type=\"radio\" class=\"btn-check\" name=\"vbtn-radio\" id=\"vbtn-radio2\" autocomplete=\"off\">\n    <label class=\"btn btn-outline-danger\" for=\"vbtn-radio2\">Radio 2</label>\n    <input type=\"radio\" class=\"btn-check\" name=\"vbtn-radio\" id=\"vbtn-radio3\" autocomplete=\"off\">\n    <label class=\"btn btn-outline-danger\" for=\"vbtn-radio3\">Radio 3</label>\n  </div>`} />\n"
  },
  {
    "path": "site/src/content/docs/components/buttons.mdx",
    "content": "---\ntitle: Buttons\ndescription: Use Bootstrap’s custom button styles for actions in forms, dialogs, and more with support for multiple sizes, states, and more.\ntoc: true\n---\n\nimport { getData } from '@libs/data'\n\n## Base class\n\nBootstrap has a base `.btn` class that sets up basic styles such as padding and content alignment. By default, `.btn` controls have a transparent border and background color, and lack any explicit focus and hover styles.\n\n<Example code={`<button type=\"button\" class=\"btn\">Base class</button>`} />\n\nThe `.btn` class is intended to be used in conjunction with our button variants, or to serve as a basis for your own custom styles.\n\n<Callout type=\"warning\">\nIf you are using the `.btn` class on its own, remember to at least define some explicit `:focus` and/or `:focus-visible` styles.\n</Callout>\n\n## Variants\n\nBootstrap includes several button variants, each serving its own semantic purpose, with a few extras thrown in for more control.\n\n<Example code={[...getData('theme-colors').map((themeColor) => `<button type=\"button\" class=\"btn btn-${themeColor.name}\">${themeColor.title}</button>`), `\n<button type=\"button\" class=\"btn btn-link\">Link</button>`]} />\n\n<Callout name=\"warning-color-assistive-technologies\" />\n\n## Disable text wrapping\n\nIf you don’t want the button text to wrap, you can add the `.text-nowrap` class to the button. In Sass, you can set `$btn-white-space: nowrap` to disable text wrapping for each button.\n\n## Button tags\n\nThe `.btn` classes are designed to be used with the `<button>` element. However, you can also use these classes on `<a>` or `<input>` elements (though some browsers may apply a slightly different rendering).\n\nWhen using button classes on `<a>` elements that are used to trigger in-page functionality (like collapsing content), rather than linking to new pages or sections within the current page, these links should be given a `role=\"button\"` to appropriately convey their purpose to assistive technologies such as screen readers.\n\n<Example code={`<a class=\"btn btn-primary\" href=\"#\" role=\"button\">Link</a>\n<button class=\"btn btn-primary\" type=\"submit\">Button</button>\n<input class=\"btn btn-primary\" type=\"button\" value=\"Input\">\n<input class=\"btn btn-primary\" type=\"submit\" value=\"Submit\">\n<input class=\"btn btn-primary\" type=\"reset\" value=\"Reset\">`} />\n\n## Outline buttons\n\nIn need of a button, but not the hefty background colors they bring? Replace the default modifier classes with the `.btn-outline-*` ones to remove all background images and colors on any button.\n\n<Example code={getData('theme-colors').map((themeColor) => `<button type=\"button\" class=\"btn btn-outline-${themeColor.name}\">${themeColor.title}</button>`)} />\n\n<Callout>\nSome of the button styles use a relatively light foreground color, and should only be used on a dark background in order to have sufficient contrast.\n</Callout>\n\n## Sizes\n\nFancy larger or smaller buttons? Add `.btn-lg` or `.btn-sm` for additional sizes.\n\n<Example code={`<button type=\"button\" class=\"btn btn-primary btn-lg\">Large button</button>\n<button type=\"button\" class=\"btn btn-secondary btn-lg\">Large button</button>`} />\n\n<Example code={`<button type=\"button\" class=\"btn btn-primary btn-sm\">Small button</button>\n<button type=\"button\" class=\"btn btn-secondary btn-sm\">Small button</button>`} />\n\nYou can even roll your own custom sizing with CSS variables:\n\n<Example code={`<button type=\"button\" class=\"btn btn-primary\"\n          style=\"--bs-btn-padding-y: .25rem; --bs-btn-padding-x: .5rem; --bs-btn-font-size: .75rem;\">\n    Custom button\n  </button>`} />\n\n## Disabled state\n\nMake buttons look inactive by adding the `disabled` boolean attribute to any `<button>` element. Disabled buttons have `pointer-events: none` applied to, preventing hover and active states from triggering.\n\n<Example code={`<button type=\"button\" class=\"btn btn-primary\" disabled>Primary button</button>\n<button type=\"button\" class=\"btn btn-secondary\" disabled>Button</button>\n<button type=\"button\" class=\"btn btn-outline-primary\" disabled>Primary button</button>\n<button type=\"button\" class=\"btn btn-outline-secondary\" disabled>Button</button>`} />\n\nDisabled buttons using the `<a>` element behave a bit different:\n\n- `<a>`s don’t support the `disabled` attribute, so you must add the `.disabled` class to make it visually appear disabled.\n- Some future-friendly styles are included to disable all `pointer-events` on anchor buttons.\n- Disabled buttons using `<a>` should include the `aria-disabled=\"true\"` attribute to indicate the state of the element to assistive technologies.\n- Disabled buttons using `<a>` *should not* include the `href` attribute.\n\n<Example code={`<a class=\"btn btn-primary disabled\" role=\"button\" aria-disabled=\"true\">Primary link</a>\n<a class=\"btn btn-secondary disabled\" role=\"button\" aria-disabled=\"true\">Link</a>`} />\n\n### Link functionality caveat\n\nTo cover cases where you have to keep the `href` attribute on a disabled link, the `.disabled` class uses `pointer-events: none` to try to disable the link functionality of `<a>`s. Note that this CSS property is not yet standardized for HTML, but all modern browsers support it. In addition, even in browsers that do support `pointer-events: none`, keyboard navigation remains unaffected, meaning that sighted keyboard users and users of assistive technologies will still be able to activate these links. So to be safe, in addition to `aria-disabled=\"true\"`, also include a `tabindex=\"-1\"` attribute on these links to prevent them from receiving keyboard focus, and use custom JavaScript to disable their functionality altogether.\n\n<Example code={`<a href=\"#\" class=\"btn btn-primary disabled\" tabindex=\"-1\" role=\"button\" aria-disabled=\"true\">Primary link</a>\n<a href=\"#\" class=\"btn btn-secondary disabled\" tabindex=\"-1\" role=\"button\" aria-disabled=\"true\">Link</a>`} />\n\n## Block buttons\n\nCreate responsive stacks of full-width, “block buttons” like those in Bootstrap 4 with a mix of our display and gap utilities. By using utilities instead of button-specific classes, we have much greater control over spacing, alignment, and responsive behaviors.\n\n<Example code={`<div class=\"d-grid gap-2\">\n    <button class=\"btn btn-primary\" type=\"button\">Button</button>\n    <button class=\"btn btn-primary\" type=\"button\">Button</button>\n  </div>`} />\n\nHere we create a responsive variation, starting with vertically stacked buttons until the `md` breakpoint, where `.d-md-block` replaces the `.d-grid` class, thus nullifying the `gap-2` utility. Resize your browser to see them change.\n\n<Example code={`<div class=\"d-grid gap-2 d-md-block\">\n    <button class=\"btn btn-primary\" type=\"button\">Button</button>\n    <button class=\"btn btn-primary\" type=\"button\">Button</button>\n  </div>`} />\n\nYou can adjust the width of your block buttons with grid column width classes. For example, for a half-width “block button”, use `.col-6`. Center it horizontally with `.mx-auto`, too.\n\n<Example code={`<div class=\"d-grid gap-2 col-6 mx-auto\">\n    <button class=\"btn btn-primary\" type=\"button\">Button</button>\n    <button class=\"btn btn-primary\" type=\"button\">Button</button>\n  </div>`} />\n\nAdditional utilities can be used to adjust the alignment of buttons when horizontal. Here we’ve taken our previous responsive example and added some flex utilities and a margin utility on the button to right-align the buttons when they’re no longer stacked.\n\n<Example code={`<div class=\"d-grid gap-2 d-md-flex justify-content-md-end\">\n    <button class=\"btn btn-primary me-md-2\" type=\"button\">Button</button>\n    <button class=\"btn btn-primary\" type=\"button\">Button</button>\n  </div>`} />\n\n## Button plugin\n\nThe button plugin allows you to create simple on/off toggle buttons.\n\n<Callout>\nVisually, these toggle buttons are identical to the [checkbox toggle buttons]([[docsref:/forms/checks-radios#checkbox-toggle-buttons]]). However, they are conveyed differently by assistive technologies: the checkbox toggles will be announced by screen readers as “checked”/“not checked” (since, despite their appearance, they are fundamentally still checkboxes), whereas these toggle buttons will be announced as “button”/“button pressed”. The choice between these two approaches will depend on the type of toggle you are creating, and whether or not the toggle will make sense to users when announced as a checkbox or as an actual button.\n</Callout>\n\n### Toggle states\n\nAdd `data-bs-toggle=\"button\"` to toggle a button’s `active` state. If you’re pre-toggling a button, you must manually add the `.active` class **and** `aria-pressed=\"true\"` to ensure that it is conveyed appropriately to assistive technologies.\n\n<Example code={`<p class=\"d-inline-flex gap-1\">\n    <button type=\"button\" class=\"btn\" data-bs-toggle=\"button\">Toggle button</button>\n    <button type=\"button\" class=\"btn active\" data-bs-toggle=\"button\" aria-pressed=\"true\">Active toggle button</button>\n    <button type=\"button\" class=\"btn\" disabled data-bs-toggle=\"button\">Disabled toggle button</button>\n  </p>\n  <p class=\"d-inline-flex gap-1\">\n    <button type=\"button\" class=\"btn btn-primary\" data-bs-toggle=\"button\">Toggle button</button>\n    <button type=\"button\" class=\"btn btn-primary active\" data-bs-toggle=\"button\" aria-pressed=\"true\">Active toggle button</button>\n    <button type=\"button\" class=\"btn btn-primary\" disabled data-bs-toggle=\"button\">Disabled toggle button</button>\n  </p>`} />\n\n<Example code={`<p class=\"d-inline-flex gap-1\">\n    <a href=\"#\" class=\"btn\" role=\"button\" data-bs-toggle=\"button\">Toggle link</a>\n    <a href=\"#\" class=\"btn active\" role=\"button\" data-bs-toggle=\"button\" aria-pressed=\"true\">Active toggle link</a>\n    <a class=\"btn disabled\" aria-disabled=\"true\" role=\"button\" data-bs-toggle=\"button\">Disabled toggle link</a>\n  </p>\n  <p class=\"d-inline-flex gap-1\">\n    <a href=\"#\" class=\"btn btn-primary\" role=\"button\" data-bs-toggle=\"button\">Toggle link</a>\n    <a href=\"#\" class=\"btn btn-primary active\" role=\"button\" data-bs-toggle=\"button\" aria-pressed=\"true\">Active toggle link</a>\n    <a class=\"btn btn-primary disabled\" aria-disabled=\"true\" role=\"button\" data-bs-toggle=\"button\">Disabled toggle link</a>\n  </p>`} />\n\n### Methods\n\nYou can create a button instance with the button constructor, for example:\n\n```js\nconst bsButton = new bootstrap.Button('#myButton')\n```\n\n<BsTable>\n| Method | Description |\n| --- | --- |\n| `dispose` | Destroys an element’s button. (Removes stored data on the DOM element) |\n| `getInstance` | Static method which allows you to get the button instance associated with a DOM element, you can use it like this: `bootstrap.Button.getInstance(element)`. |\n| `getOrCreateInstance` | Static method which returns a button instance associated with a DOM element or creates a new one in case it wasn’t initialized. You can use it like this: `bootstrap.Button.getOrCreateInstance(element)`. |\n| `toggle` | Toggles push state. Gives the button the appearance that it has been activated. |\n</BsTable>\n\nFor example, to toggle all buttons\n\n```js\ndocument.querySelectorAll('.btn').forEach(buttonElement => {\n  const button = bootstrap.Button.getOrCreateInstance(buttonElement)\n  button.toggle()\n})\n```\n\n## CSS\n\n### Variables\n\n<AddedIn version=\"5.2.0\" />\n\nAs part of Bootstrap’s evolving CSS variables approach, buttons now use local CSS variables on `.btn` for enhanced real-time customization. Values for the CSS variables are set via Sass, so Sass customization is still supported, too.\n\n<ScssDocs name=\"btn-css-vars\" file=\"scss/_buttons.scss\" />\n\nEach `.btn-*` modifier class updates the appropriate CSS variables to minimize additional CSS rules with our `button-variant()`, `button-outline-variant()`, and `button-size()` mixins.\n\nHere’s an example of building a custom `.btn-*` modifier class as we do for the buttons unique to our docs by reassigning Bootstrap’s CSS variables with a mixture of our own CSS and Sass variables.\n\n<Example showMarkup={false} code={`\n<button type=\"button\" class=\"btn btn-bd-primary\">Custom button</button>\n`} />\n\n<ScssDocs name=\"btn-css-vars-example\" file=\"site/src/scss/_buttons.scss\" />\n\n### Sass variables\n\n<ScssDocs name=\"btn-variables\" file=\"scss/_variables.scss\" />\n\n### Sass mixins\n\nThere are three mixins for buttons: button and button outline variant mixins (both based on `$theme-colors`), plus a button size mixin.\n\n<ScssDocs name=\"btn-variant-mixin\" file=\"scss/mixins/_buttons.scss\" />\n\n<ScssDocs name=\"btn-outline-variant-mixin\" file=\"scss/mixins/_buttons.scss\" />\n\n<ScssDocs name=\"btn-size-mixin\" file=\"scss/mixins/_buttons.scss\" />\n\n### Sass loops\n\nButton variants (for regular and outline buttons) use their respective mixins with our `$theme-colors` map to generate the modifier classes in `scss/_buttons.scss`.\n\n<ScssDocs name=\"btn-variant-loops\" file=\"scss/_buttons.scss\" />\n"
  },
  {
    "path": "site/src/content/docs/components/card.mdx",
    "content": "---\ntitle: Cards\ndescription: Bootstrap’s cards provide a flexible and extensible content container with multiple variants and options.\ntoc: true\n---\n\nimport { getData } from '@libs/data'\n\n## About\n\nA **card** is a flexible and extensible content container. It includes options for headers and footers, a wide variety of content, contextual background colors, and powerful display options. If you’re familiar with Bootstrap 3, cards replace our old panels, wells, and thumbnails. Similar functionality to those components is available as modifier classes for cards.\n\n## Example\n\nCards are built with as little markup and styles as possible, but still manage to deliver a ton of control and customization. Built with flexbox, they offer easy alignment and mix well with other Bootstrap components. They have no `margin` by default, so use [spacing utilities]([[docsref:/utilities/spacing]]) as needed.\n\nBelow is an example of a basic card with mixed content and a fixed width. Cards have no fixed width to start, so they’ll naturally fill the full width of its parent element. This is easily customized with our various [sizing options](#sizing).\n\n<Example code={`<div class=\"card\" style=\"width: 18rem;\">\n    <Placeholder width=\"100%\" height=\"180\" class=\"card-img-top\" text=\"Image cap\" />\n    <div class=\"card-body\">\n      <h5 class=\"card-title\">Card title</h5>\n      <p class=\"card-text\">Some quick example text to build on the card title and make up the bulk of the card’s content.</p>\n      <a href=\"#\" class=\"btn btn-primary\">Go somewhere</a>\n    </div>\n  </div>`} />\n\n## Content types\n\nCards support a wide variety of content, including images, text, list groups, links, and more. Below are examples of what’s supported.\n\n### Body\n\nThe building block of a card is the `.card-body`. Use it whenever you need a padded section within a card.\n\n<Example code={`<div class=\"card\">\n    <div class=\"card-body\">\n      This is some text within a card body.\n    </div>\n  </div>`} />\n\n### Titles, text, and links\n\nCard titles are used by adding `.card-title` to a `<h*>` tag. In the same way, links are added and placed next to each other by adding `.card-link` to an `<a>` tag.\n\nSubtitles are used by adding a `.card-subtitle` to a `<h*>` tag. If the `.card-title` and the `.card-subtitle` items are placed in a `.card-body` item, the card title and subtitle are aligned nicely.\n\n<Example code={`<div class=\"card\" style=\"width: 18rem;\">\n    <div class=\"card-body\">\n      <h5 class=\"card-title\">Card title</h5>\n      <h6 class=\"card-subtitle mb-2 text-body-secondary\">Card subtitle</h6>\n      <p class=\"card-text\">Some quick example text to build on the card title and make up the bulk of the card’s content.</p>\n      <a href=\"#\" class=\"card-link\">Card link</a>\n      <a href=\"#\" class=\"card-link\">Another link</a>\n    </div>\n  </div>`} />\n\n### Images\n\n`.card-img-top` and `.card-img-bottom` respectively set the top and bottom corners rounded to match the card’s borders. With `.card-text`, text can be added to the card. Text within `.card-text` can also be styled with the standard HTML tags.\n\n<Example code={`<div class=\"card\" style=\"width: 18rem;\">\n    <Placeholder width=\"100%\" height=\"180\" class=\"card-img-top\" text=\"Image cap\" />\n    <div class=\"card-body\">\n      <p class=\"card-text\">Some quick example text to build on the card title and make up the bulk of the card’s content.</p>\n    </div>\n  </div>`} />\n\n### List groups\n\nCreate lists of content in a card with a flush list group.\n\n<Example code={`<div class=\"card\" style=\"width: 18rem;\">\n    <ul class=\"list-group list-group-flush\">\n      <li class=\"list-group-item\">An item</li>\n      <li class=\"list-group-item\">A second item</li>\n      <li class=\"list-group-item\">A third item</li>\n    </ul>\n  </div>`} />\n\n<Example code={`<div class=\"card\" style=\"width: 18rem;\">\n    <div class=\"card-header\">\n      Featured\n    </div>\n    <ul class=\"list-group list-group-flush\">\n      <li class=\"list-group-item\">An item</li>\n      <li class=\"list-group-item\">A second item</li>\n      <li class=\"list-group-item\">A third item</li>\n    </ul>\n  </div>`} />\n\n<Example code={`<div class=\"card\" style=\"width: 18rem;\">\n    <ul class=\"list-group list-group-flush\">\n      <li class=\"list-group-item\">An item</li>\n      <li class=\"list-group-item\">A second item</li>\n      <li class=\"list-group-item\">A third item</li>\n    </ul>\n    <div class=\"card-footer\">\n      Card footer\n    </div>\n  </div>`} />\n\n### Kitchen sink\n\nMix and match multiple content types to create the card you need, or throw everything in there. Shown below are image styles, blocks, text styles, and a list group—all wrapped in a fixed-width card.\n\n<Example code={`<div class=\"card\" style=\"width: 18rem;\">\n    <Placeholder width=\"100%\" height=\"180\" class=\"card-img-top\" text=\"Image cap\" />\n    <div class=\"card-body\">\n      <h5 class=\"card-title\">Card title</h5>\n      <p class=\"card-text\">Some quick example text to build on the card title and make up the bulk of the card’s content.</p>\n    </div>\n    <ul class=\"list-group list-group-flush\">\n      <li class=\"list-group-item\">An item</li>\n      <li class=\"list-group-item\">A second item</li>\n      <li class=\"list-group-item\">A third item</li>\n    </ul>\n    <div class=\"card-body\">\n      <a href=\"#\" class=\"card-link\">Card link</a>\n      <a href=\"#\" class=\"card-link\">Another link</a>\n    </div>\n  </div>`} />\n\n### Header and footer\n\nAdd an optional header and/or footer within a card.\n\n<Example code={`<div class=\"card\">\n    <div class=\"card-header\">\n      Featured\n    </div>\n    <div class=\"card-body\">\n      <h5 class=\"card-title\">Special title treatment</h5>\n      <p class=\"card-text\">With supporting text below as a natural lead-in to additional content.</p>\n      <a href=\"#\" class=\"btn btn-primary\">Go somewhere</a>\n    </div>\n  </div>`} />\n\nCard headers can be styled by adding `.card-header` to `<h*>` elements.\n\n<Example code={`<div class=\"card\">\n    <h5 class=\"card-header\">Featured</h5>\n    <div class=\"card-body\">\n      <h5 class=\"card-title\">Special title treatment</h5>\n      <p class=\"card-text\">With supporting text below as a natural lead-in to additional content.</p>\n      <a href=\"#\" class=\"btn btn-primary\">Go somewhere</a>\n    </div>\n  </div>`} />\n\n<Example code={`<div class=\"card\">\n    <div class=\"card-header\">\n      Quote\n    </div>\n    <div class=\"card-body\">\n      <figure>\n        <blockquote class=\"blockquote\">\n          <p>A well-known quote, contained in a blockquote element.</p>\n        </blockquote>\n        <figcaption class=\"blockquote-footer\">\n          Someone famous in <cite title=\"Source Title\">Source Title</cite>\n        </figcaption>\n      </figure>\n    </div>\n  </div>`} />\n\n<Example code={`<div class=\"card text-center\">\n    <div class=\"card-header\">\n      Featured\n    </div>\n    <div class=\"card-body\">\n      <h5 class=\"card-title\">Special title treatment</h5>\n      <p class=\"card-text\">With supporting text below as a natural lead-in to additional content.</p>\n      <a href=\"#\" class=\"btn btn-primary\">Go somewhere</a>\n    </div>\n    <div class=\"card-footer text-body-secondary\">\n      2 days ago\n    </div>\n  </div>`} />\n\n## Sizing\n\nCards assume no specific `width` to start, so they’ll be 100% wide unless otherwise stated. You can change this as needed with custom CSS, grid classes, grid Sass mixins, or utilities.\n\n### Using grid markup\n\nUsing the grid, wrap cards in columns and rows as needed.\n\n<Example code={`<div class=\"row\">\n    <div class=\"col-sm-6 mb-3 mb-sm-0\">\n      <div class=\"card\">\n        <div class=\"card-body\">\n          <h5 class=\"card-title\">Special title treatment</h5>\n          <p class=\"card-text\">With supporting text below as a natural lead-in to additional content.</p>\n          <a href=\"#\" class=\"btn btn-primary\">Go somewhere</a>\n        </div>\n      </div>\n    </div>\n    <div class=\"col-sm-6\">\n      <div class=\"card\">\n        <div class=\"card-body\">\n          <h5 class=\"card-title\">Special title treatment</h5>\n          <p class=\"card-text\">With supporting text below as a natural lead-in to additional content.</p>\n          <a href=\"#\" class=\"btn btn-primary\">Go somewhere</a>\n        </div>\n      </div>\n    </div>\n  </div>`} />\n\n### Using utilities\n\nUse our handful of [available sizing utilities]([[docsref:/utilities/sizing]]) to quickly set a card’s width.\n\n<Example code={`<div class=\"card w-75 mb-3\">\n    <div class=\"card-body\">\n      <h5 class=\"card-title\">Card title</h5>\n      <p class=\"card-text\">With supporting text below as a natural lead-in to additional content.</p>\n      <a href=\"#\" class=\"btn btn-primary\">Button</a>\n    </div>\n  </div>\n\n  <div class=\"card w-50\">\n    <div class=\"card-body\">\n      <h5 class=\"card-title\">Card title</h5>\n      <p class=\"card-text\">With supporting text below as a natural lead-in to additional content.</p>\n      <a href=\"#\" class=\"btn btn-primary\">Button</a>\n    </div>\n  </div>`} />\n\n### Using custom CSS\n\nUse custom CSS in your stylesheets or as inline styles to set a width.\n\n<Example code={`<div class=\"card\" style=\"width: 18rem;\">\n    <div class=\"card-body\">\n      <h5 class=\"card-title\">Special title treatment</h5>\n      <p class=\"card-text\">With supporting text below as a natural lead-in to additional content.</p>\n      <a href=\"#\" class=\"btn btn-primary\">Go somewhere</a>\n    </div>\n  </div>`} />\n\n## Text alignment\n\nYou can quickly change the text alignment of any card—in its entirety or specific parts—with our [text align classes]([[docsref:/utilities/text#text-alignment]]).\n\n<Example code={`<div class=\"card mb-3\" style=\"width: 18rem;\">\n    <div class=\"card-body\">\n      <h5 class=\"card-title\">Special title treatment</h5>\n      <p class=\"card-text\">With supporting text below as a natural lead-in to additional content.</p>\n      <a href=\"#\" class=\"btn btn-primary\">Go somewhere</a>\n    </div>\n  </div>\n\n  <div class=\"card text-center mb-3\" style=\"width: 18rem;\">\n    <div class=\"card-body\">\n      <h5 class=\"card-title\">Special title treatment</h5>\n      <p class=\"card-text\">With supporting text below as a natural lead-in to additional content.</p>\n      <a href=\"#\" class=\"btn btn-primary\">Go somewhere</a>\n    </div>\n  </div>\n\n  <div class=\"card text-end\" style=\"width: 18rem;\">\n    <div class=\"card-body\">\n      <h5 class=\"card-title\">Special title treatment</h5>\n      <p class=\"card-text\">With supporting text below as a natural lead-in to additional content.</p>\n      <a href=\"#\" class=\"btn btn-primary\">Go somewhere</a>\n    </div>\n  </div>`} />\n\n## Navigation\n\nAdd some navigation to a card’s header (or block) with Bootstrap’s [nav components]([[docsref:/components/navs-tabs]]).\n\n<Example code={`<div class=\"card text-center\">\n    <div class=\"card-header\">\n      <ul class=\"nav nav-tabs card-header-tabs\">\n        <li class=\"nav-item\">\n          <a class=\"nav-link active\" aria-current=\"true\" href=\"#\">Active</a>\n        </li>\n        <li class=\"nav-item\">\n          <a class=\"nav-link\" href=\"#\">Link</a>\n        </li>\n        <li class=\"nav-item\">\n          <a class=\"nav-link disabled\" aria-disabled=\"true\">Disabled</a>\n        </li>\n      </ul>\n    </div>\n    <div class=\"card-body\">\n      <h5 class=\"card-title\">Special title treatment</h5>\n      <p class=\"card-text\">With supporting text below as a natural lead-in to additional content.</p>\n      <a href=\"#\" class=\"btn btn-primary\">Go somewhere</a>\n    </div>\n  </div>`} />\n\n<Example code={`<div class=\"card text-center\">\n    <div class=\"card-header\">\n      <ul class=\"nav nav-pills card-header-pills\">\n        <li class=\"nav-item\">\n          <a class=\"nav-link active\" href=\"#\">Active</a>\n        </li>\n        <li class=\"nav-item\">\n          <a class=\"nav-link\" href=\"#\">Link</a>\n        </li>\n        <li class=\"nav-item\">\n          <a class=\"nav-link disabled\" aria-disabled=\"true\">Disabled</a>\n        </li>\n      </ul>\n    </div>\n    <div class=\"card-body\">\n      <h5 class=\"card-title\">Special title treatment</h5>\n      <p class=\"card-text\">With supporting text below as a natural lead-in to additional content.</p>\n      <a href=\"#\" class=\"btn btn-primary\">Go somewhere</a>\n    </div>\n  </div>`} />\n\n## Images\n\nCards include a few options for working with images. Choose from appending “image caps” at either end of a card, overlaying images with card content, or simply embedding the image in a card.\n\n### Image caps\n\nSimilar to headers and footers, cards can include top and bottom “image caps”—images at the top or bottom of a card.\n\n<Example code={`<div class=\"card mb-3\">\n    <Placeholder width=\"100%\" height=\"180\" class=\"card-img-top\" text=\"Image cap\" />\n    <div class=\"card-body\">\n      <h5 class=\"card-title\">Card title</h5>\n      <p class=\"card-text\">This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</p>\n      <p class=\"card-text\"><small class=\"text-body-secondary\">Last updated 3 mins ago</small></p>\n    </div>\n  </div>\n  <div class=\"card\">\n    <div class=\"card-body\">\n      <h5 class=\"card-title\">Card title</h5>\n      <p class=\"card-text\">This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</p>\n      <p class=\"card-text\"><small class=\"text-body-secondary\">Last updated 3 mins ago</small></p>\n    </div>\n    <Placeholder width=\"100%\" height=\"180\" class=\"card-img-bottom\" text=\"Image cap\" />\n  </div>`} />\n\n### Image overlays\n\nTurn an image into a card background and overlay your card’s text. Depending on the image, you may or may not need additional styles or utilities.\n\n<Example code={`<div class=\"card text-bg-dark\">\n    <Placeholder width=\"100%\" height=\"270\" class=\"bd-placeholder-img-lg card-img\" text=\"Card image\" />\n    <div class=\"card-img-overlay\">\n      <h5 class=\"card-title\">Card title</h5>\n      <p class=\"card-text\">This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</p>\n      <p class=\"card-text\"><small>Last updated 3 mins ago</small></p>\n    </div>\n  </div>`} />\n\n<Callout>\nNote that content should not be larger than the height of the image. If content is larger than the image the content will be displayed outside the image.\n</Callout>\n\n## Horizontal\n\nUsing a combination of grid and utility classes, cards can be made horizontal in a mobile-friendly and responsive way. In the example below, we remove the grid gutters with `.g-0` and use `.col-md-*` classes to make the card horizontal at the `md` breakpoint. Further adjustments may be needed depending on your card content.\n\n<Example code={`<div class=\"card mb-3\" style=\"max-width: 540px;\">\n    <div class=\"row g-0\">\n      <div class=\"col-md-4\">\n        <Placeholder width=\"100%\" height=\"250\" text=\"Image\" class=\"img-fluid rounded-start\" />\n      </div>\n      <div class=\"col-md-8\">\n        <div class=\"card-body\">\n          <h5 class=\"card-title\">Card title</h5>\n          <p class=\"card-text\">This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</p>\n          <p class=\"card-text\"><small class=\"text-body-secondary\">Last updated 3 mins ago</small></p>\n        </div>\n      </div>\n    </div>\n  </div>`} />\n\n## Card styles\n\nCards include various options for customizing their backgrounds, borders, and color.\n\n### Background and color\n\n<AddedIn version=\"5.2.0\" />\n\nSet a `background-color` with contrasting foreground `color` with [our `.text-bg-{color}` helpers]([[docsref:helpers/color-background]]). Previously it was required to manually pair your choice of [`.text-{color}`]([[docsref:/utilities/colors]]) and [`.bg-{color}`]([[docsref:/utilities/background]]) utilities for styling, which you still may use if you prefer.\n\n<Example code={getData('theme-colors').map((themeColor) => `<div class=\"card text-bg-${themeColor.name} mb-3\" style=\"max-width: 18rem;\">\n    <div class=\"card-header\">Header</div>\n    <div class=\"card-body\">\n      <h5 class=\"card-title\">${themeColor.title} card title</h5>\n      <p class=\"card-text\">Some quick example text to build on the card title and make up the bulk of the card’s content.</p>\n    </div>\n  </div>`)} />\n\n<Callout name=\"warning-color-assistive-technologies\" />\n\n### Border\n\nUse [border utilities]([[docsref:/utilities/borders]]) to change just the `border-color` of a card. Note that you can put `.text-{color}` classes on the parent `.card` or a subset of the card’s contents as shown below.\n\n<Example code={getData('theme-colors').map((themeColor) => `<div class=\"card border-${themeColor.name} mb-3\" style=\"max-width: 18rem;\">\n    <div class=\"card-header\">Header</div>\n    <div class=\"card-body${themeColor.contrast_color ? '' : ` text-${themeColor.name}`}\">\n      <h5 class=\"card-title\">${themeColor.title} card title</h5>\n      <p class=\"card-text\">Some quick example text to build on the card title and make up the bulk of the card’s content.</p>\n    </div>\n  </div>`)} />\n\n### Mixins utilities\n\nYou can also change the borders on the card header and footer as needed, and even remove their `background-color` with `.bg-transparent`.\n\n<Example code={`<div class=\"card border-success mb-3\" style=\"max-width: 18rem;\">\n    <div class=\"card-header bg-transparent border-success\">Header</div>\n    <div class=\"card-body text-success\">\n      <h5 class=\"card-title\">Success card title</h5>\n      <p class=\"card-text\">Some quick example text to build on the card title and make up the bulk of the card’s content.</p>\n    </div>\n    <div class=\"card-footer bg-transparent border-success\">Footer</div>\n  </div>`} />\n\n## Card layout\n\nIn addition to styling the content within cards, Bootstrap includes a few options for laying out series of cards. For the time being, **these layout options are not yet responsive**.\n\n### Card groups\n\nUse card groups to render cards as a single, attached element with equal width and height columns. Card groups start off stacked and use `display: flex;` to become attached with uniform dimensions starting at the `sm` breakpoint.\n\n<Example code={`<div class=\"card-group\">\n    <div class=\"card\">\n      <Placeholder width=\"100%\" height=\"180\" class=\"card-img-top\" text=\"Image cap\" />\n      <div class=\"card-body\">\n        <h5 class=\"card-title\">Card title</h5>\n        <p class=\"card-text\">This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</p>\n        <p class=\"card-text\"><small class=\"text-body-secondary\">Last updated 3 mins ago</small></p>\n      </div>\n    </div>\n    <div class=\"card\">\n      <Placeholder width=\"100%\" height=\"180\" class=\"card-img-top\" text=\"Image cap\" />\n      <div class=\"card-body\">\n        <h5 class=\"card-title\">Card title</h5>\n        <p class=\"card-text\">This card has supporting text below as a natural lead-in to additional content.</p>\n        <p class=\"card-text\"><small class=\"text-body-secondary\">Last updated 3 mins ago</small></p>\n      </div>\n    </div>\n    <div class=\"card\">\n      <Placeholder width=\"100%\" height=\"180\" class=\"card-img-top\" text=\"Image cap\" />\n      <div class=\"card-body\">\n        <h5 class=\"card-title\">Card title</h5>\n        <p class=\"card-text\">This is a wider card with supporting text below as a natural lead-in to additional content. This card has even longer content than the first to show that equal height action.</p>\n        <p class=\"card-text\"><small class=\"text-body-secondary\">Last updated 3 mins ago</small></p>\n      </div>\n    </div>\n  </div>`} />\n\nWhen using card groups with footers, their content will automatically line up.\n\n<Example code={`<div class=\"card-group\">\n    <div class=\"card\">\n      <Placeholder width=\"100%\" height=\"180\" class=\"card-img-top\" text=\"Image cap\" />\n      <div class=\"card-body\">\n        <h5 class=\"card-title\">Card title</h5>\n        <p class=\"card-text\">This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</p>\n      </div>\n      <div class=\"card-footer\">\n        <small class=\"text-body-secondary\">Last updated 3 mins ago</small>\n      </div>\n    </div>\n    <div class=\"card\">\n      <Placeholder width=\"100%\" height=\"180\" class=\"card-img-top\" text=\"Image cap\" />\n      <div class=\"card-body\">\n        <h5 class=\"card-title\">Card title</h5>\n        <p class=\"card-text\">This card has supporting text below as a natural lead-in to additional content.</p>\n      </div>\n      <div class=\"card-footer\">\n        <small class=\"text-body-secondary\">Last updated 3 mins ago</small>\n      </div>\n    </div>\n    <div class=\"card\">\n      <Placeholder width=\"100%\" height=\"180\" class=\"card-img-top\" text=\"Image cap\" />\n      <div class=\"card-body\">\n        <h5 class=\"card-title\">Card title</h5>\n        <p class=\"card-text\">This is a wider card with supporting text below as a natural lead-in to additional content. This card has even longer content than the first to show that equal height action.</p>\n      </div>\n      <div class=\"card-footer\">\n        <small class=\"text-body-secondary\">Last updated 3 mins ago</small>\n      </div>\n    </div>\n  </div>`} />\n\n### Grid cards\n\nUse the Bootstrap grid system and its [`.row-cols` classes]([[docsref:/layout/grid#row-columns]]) to control how many grid columns (wrapped around your cards) you show per row. For example, here’s `.row-cols-1` laying out the cards on one column, and `.row-cols-md-2` splitting four cards to equal width across multiple rows, from the medium breakpoint up.\n\n<Example code={`<div class=\"row row-cols-1 row-cols-md-2 g-4\">\n    <div class=\"col\">\n      <div class=\"card\">\n        <Placeholder width=\"100%\" height=\"140\" class=\"card-img-top\" text=\"Image cap\" />\n        <div class=\"card-body\">\n          <h5 class=\"card-title\">Card title</h5>\n          <p class=\"card-text\">This is a longer card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</p>\n        </div>\n      </div>\n    </div>\n    <div class=\"col\">\n      <div class=\"card\">\n        <Placeholder width=\"100%\" height=\"140\" class=\"card-img-top\" text=\"Image cap\" />\n        <div class=\"card-body\">\n          <h5 class=\"card-title\">Card title</h5>\n          <p class=\"card-text\">This is a longer card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</p>\n        </div>\n      </div>\n    </div>\n    <div class=\"col\">\n      <div class=\"card\">\n        <Placeholder width=\"100%\" height=\"140\" class=\"card-img-top\" text=\"Image cap\" />\n        <div class=\"card-body\">\n          <h5 class=\"card-title\">Card title</h5>\n          <p class=\"card-text\">This is a longer card with supporting text below as a natural lead-in to additional content.</p>\n        </div>\n      </div>\n    </div>\n    <div class=\"col\">\n      <div class=\"card\">\n        <Placeholder width=\"100%\" height=\"140\" class=\"card-img-top\" text=\"Image cap\" />\n        <div class=\"card-body\">\n          <h5 class=\"card-title\">Card title</h5>\n          <p class=\"card-text\">This is a longer card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</p>\n        </div>\n      </div>\n    </div>\n  </div>`} />\n\nChange it to `.row-cols-3` and you’ll see the fourth card wrap.\n\n<Example code={`<div class=\"row row-cols-1 row-cols-md-3 g-4\">\n    <div class=\"col\">\n      <div class=\"card\">\n        <Placeholder width=\"100%\" height=\"140\" class=\"card-img-top\" text=\"Image cap\" />\n        <div class=\"card-body\">\n          <h5 class=\"card-title\">Card title</h5>\n          <p class=\"card-text\">This is a longer card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</p>\n        </div>\n      </div>\n    </div>\n    <div class=\"col\">\n      <div class=\"card\">\n        <Placeholder width=\"100%\" height=\"140\" class=\"card-img-top\" text=\"Image cap\" />\n        <div class=\"card-body\">\n          <h5 class=\"card-title\">Card title</h5>\n          <p class=\"card-text\">This is a longer card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</p>\n        </div>\n      </div>\n    </div>\n    <div class=\"col\">\n      <div class=\"card\">\n        <Placeholder width=\"100%\" height=\"140\" class=\"card-img-top\" text=\"Image cap\" />\n        <div class=\"card-body\">\n          <h5 class=\"card-title\">Card title</h5>\n          <p class=\"card-text\">This is a longer card with supporting text below as a natural lead-in to additional content.</p>\n        </div>\n      </div>\n    </div>\n    <div class=\"col\">\n      <div class=\"card\">\n        <Placeholder width=\"100%\" height=\"140\" class=\"card-img-top\" text=\"Image cap\" />\n        <div class=\"card-body\">\n          <h5 class=\"card-title\">Card title</h5>\n          <p class=\"card-text\">This is a longer card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</p>\n        </div>\n      </div>\n    </div>\n  </div>`} />\n\nWhen you need equal height, add `.h-100` to the cards. If you want equal heights by default, you can set `$card-height: 100%` in Sass.\n\n<Example code={`<div class=\"row row-cols-1 row-cols-md-3 g-4\">\n    <div class=\"col\">\n      <div class=\"card h-100\">\n        <Placeholder width=\"100%\" height=\"140\" class=\"card-img-top\" text=\"Image cap\" />\n        <div class=\"card-body\">\n          <h5 class=\"card-title\">Card title</h5>\n          <p class=\"card-text\">This is a longer card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</p>\n        </div>\n      </div>\n    </div>\n    <div class=\"col\">\n      <div class=\"card h-100\">\n        <Placeholder width=\"100%\" height=\"140\" class=\"card-img-top\" text=\"Image cap\" />\n        <div class=\"card-body\">\n          <h5 class=\"card-title\">Card title</h5>\n          <p class=\"card-text\">This is a short card.</p>\n        </div>\n      </div>\n    </div>\n    <div class=\"col\">\n      <div class=\"card h-100\">\n        <Placeholder width=\"100%\" height=\"140\" class=\"card-img-top\" text=\"Image cap\" />\n        <div class=\"card-body\">\n          <h5 class=\"card-title\">Card title</h5>\n          <p class=\"card-text\">This is a longer card with supporting text below as a natural lead-in to additional content.</p>\n        </div>\n      </div>\n    </div>\n    <div class=\"col\">\n      <div class=\"card h-100\">\n        <Placeholder width=\"100%\" height=\"140\" class=\"card-img-top\" text=\"Image cap\" />\n        <div class=\"card-body\">\n          <h5 class=\"card-title\">Card title</h5>\n          <p class=\"card-text\">This is a longer card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</p>\n        </div>\n      </div>\n    </div>\n  </div>`} />\n\nJust like with card groups, card footers will automatically line up.\n\n<Example code={`<div class=\"row row-cols-1 row-cols-md-3 g-4\">\n    <div class=\"col\">\n      <div class=\"card h-100\">\n        <Placeholder width=\"100%\" height=\"180\" class=\"card-img-top\" text=\"Image cap\" />\n        <div class=\"card-body\">\n          <h5 class=\"card-title\">Card title</h5>\n          <p class=\"card-text\">This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</p>\n        </div>\n        <div class=\"card-footer\">\n          <small class=\"text-body-secondary\">Last updated 3 mins ago</small>\n        </div>\n      </div>\n    </div>\n    <div class=\"col\">\n      <div class=\"card h-100\">\n        <Placeholder width=\"100%\" height=\"180\" class=\"card-img-top\" text=\"Image cap\" />\n        <div class=\"card-body\">\n          <h5 class=\"card-title\">Card title</h5>\n          <p class=\"card-text\">This card has supporting text below as a natural lead-in to additional content.</p>\n        </div>\n        <div class=\"card-footer\">\n          <small class=\"text-body-secondary\">Last updated 3 mins ago</small>\n        </div>\n      </div>\n    </div>\n    <div class=\"col\">\n      <div class=\"card h-100\">\n        <Placeholder width=\"100%\" height=\"180\" class=\"card-img-top\" text=\"Image cap\" />\n        <div class=\"card-body\">\n          <h5 class=\"card-title\">Card title</h5>\n          <p class=\"card-text\">This is a wider card with supporting text below as a natural lead-in to additional content. This card has even longer content than the first to show that equal height action.</p>\n        </div>\n        <div class=\"card-footer\">\n          <small class=\"text-body-secondary\">Last updated 3 mins ago</small>\n        </div>\n      </div>\n    </div>\n  </div>`} />\n\n### Masonry\n\nIn `v4` we used a CSS-only technique to mimic the behavior of [Masonry](https://masonry.desandro.com/)-like columns, but this technique came with lots of unpleasant [side effects](https://github.com/twbs/bootstrap/pull/28922). If you want to have this type of layout in `v5`, you can just make use of Masonry plugin. **Masonry is not included in Bootstrap**, but we’ve made a [demo example]([[docsref:/examples/masonry]]) to help you get started.\n\n## CSS\n\n### Variables\n\n<AddedIn version=\"5.2.0\" />\n\nAs part of Bootstrap’s evolving CSS variables approach, cards now use local CSS variables on `.card` for enhanced real-time customization. Values for the CSS variables are set via Sass, so Sass customization is still supported, too.\n\n<ScssDocs name=\"card-css-vars\" file=\"scss/_card.scss\" />\n\n### Sass variables\n\n<ScssDocs name=\"card-variables\" file=\"scss/_variables.scss\" />\n"
  },
  {
    "path": "site/src/content/docs/components/carousel.mdx",
    "content": "---\ntitle: Carousel\ndescription: A slideshow component for cycling through elements—images or slides of text—like a carousel.\ntoc: true\n---\n\n## How it works\n\n- The carousel is a slideshow for cycling through a series of content, built with CSS 3D transforms and a bit of JavaScript. It works with a series of images, text, or custom markup. It also includes support for previous/next controls and indicators.\n\n- For performance reasons, **carousels must be manually initialized** using the [carousel constructor method](#methods). Without initialization, some of the event listeners (specifically, the events needed touch/swipe support) will not be registered until a user has explicitly activated a control or indicator.\n\n  The only exception are [autoplaying carousels](#autoplaying-carousels) with the `data-bs-ride=\"carousel\"` attribute as these are initialized automatically on page load. If you’re using autoplaying carousels with the data attribute, **don’t explicitly initialize the same carousels with the constructor method.**\n\n- Nested carousels are not supported. You should also be aware that carousels in general can often cause usability and accessibility challenges.\n\n<Callout name=\"info-prefersreducedmotion\" />\n\n## Basic examples\n\nHere is a basic example of a carousel with three slides. Note the previous/next controls. We recommend using `<button>` elements, but you can also use `<a>` elements with `role=\"button\"`.\n\n<Example code={`<div id=\"carouselExample\" class=\"carousel slide\">\n    <div class=\"carousel-inner\">\n      <div class=\"carousel-item active\">\n        <Placeholder width=\"800\" height=\"400\" class=\"bd-placeholder-img-lg d-block w-100\" color=\"#555\" background=\"#777\" text=\"First slide\" />\n      </div>\n      <div class=\"carousel-item\">\n        <Placeholder width=\"800\" height=\"400\" class=\"bd-placeholder-img-lg d-block w-100\" color=\"#444\" background=\"#666\" text=\"Second slide\" />\n      </div>\n      <div class=\"carousel-item\">\n        <Placeholder width=\"800\" height=\"400\" class=\"bd-placeholder-img-lg d-block w-100\" color=\"#333\" background=\"#555\" text=\"Third slide\" />\n      </div>\n    </div>\n    <button class=\"carousel-control-prev\" type=\"button\" data-bs-target=\"#carouselExample\" data-bs-slide=\"prev\">\n      <span class=\"carousel-control-prev-icon\" aria-hidden=\"true\"></span>\n      <span class=\"visually-hidden\">Previous</span>\n    </button>\n    <button class=\"carousel-control-next\" type=\"button\" data-bs-target=\"#carouselExample\" data-bs-slide=\"next\">\n      <span class=\"carousel-control-next-icon\" aria-hidden=\"true\"></span>\n      <span class=\"visually-hidden\">Next</span>\n    </button>\n  </div>`} />\n\nCarousels don’t automatically normalize slide dimensions. As such, you may need to use additional utilities or custom styles to appropriately size content. While carousels support previous/next controls and indicators, they’re not explicitly required. Add and customize as you see fit.\n\n**You must add the `.active` class to one of the slides**, otherwise the carousel will not be visible. Also be sure to set a unique `id` on the `.carousel` for optional controls, especially if you’re using multiple carousels on a single page. Control and indicator elements must have a `data-bs-target` attribute (or `href` for links) that matches the `id` of the `.carousel` element.\n\n### Indicators\n\nYou can add indicators to the carousel, alongside the previous/next controls. The indicators let users jump directly to a particular slide.\n\n<Example code={`<div id=\"carouselExampleIndicators\" class=\"carousel slide\">\n    <div class=\"carousel-indicators\">\n      <button type=\"button\" data-bs-target=\"#carouselExampleIndicators\" data-bs-slide-to=\"0\" class=\"active\" aria-current=\"true\" aria-label=\"Slide 1\"></button>\n      <button type=\"button\" data-bs-target=\"#carouselExampleIndicators\" data-bs-slide-to=\"1\" aria-label=\"Slide 2\"></button>\n      <button type=\"button\" data-bs-target=\"#carouselExampleIndicators\" data-bs-slide-to=\"2\" aria-label=\"Slide 3\"></button>\n    </div>\n    <div class=\"carousel-inner\">\n      <div class=\"carousel-item active\">\n        <Placeholder width=\"800\" height=\"400\" class=\"bd-placeholder-img-lg d-block w-100\" color=\"#555\" background=\"#777\" text=\"First slide\" />\n      </div>\n      <div class=\"carousel-item\">\n        <Placeholder width=\"800\" height=\"400\" class=\"bd-placeholder-img-lg d-block w-100\" color=\"#444\" background=\"#666\" text=\"Second slide\" />\n      </div>\n      <div class=\"carousel-item\">\n        <Placeholder width=\"800\" height=\"400\" class=\"bd-placeholder-img-lg d-block w-100\" color=\"#333\" background=\"#555\" text=\"Third slide\" />\n      </div>\n    </div>\n    <button class=\"carousel-control-prev\" type=\"button\" data-bs-target=\"#carouselExampleIndicators\" data-bs-slide=\"prev\">\n      <span class=\"carousel-control-prev-icon\" aria-hidden=\"true\"></span>\n      <span class=\"visually-hidden\">Previous</span>\n    </button>\n    <button class=\"carousel-control-next\" type=\"button\" data-bs-target=\"#carouselExampleIndicators\" data-bs-slide=\"next\">\n      <span class=\"carousel-control-next-icon\" aria-hidden=\"true\"></span>\n      <span class=\"visually-hidden\">Next</span>\n    </button>\n  </div>`} />\n\n### Captions\n\nYou can add captions to your slides with the `.carousel-caption` element within any `.carousel-item`. They can be easily hidden on smaller viewports, as shown below, with optional [display utilities]([[docsref:/utilities/display]]). We hide them initially with `.d-none` and bring them back on medium-sized devices with `.d-md-block`.\n\n<Example code={`<div id=\"carouselExampleCaptions\" class=\"carousel slide\">\n    <div class=\"carousel-indicators\">\n      <button type=\"button\" data-bs-target=\"#carouselExampleCaptions\" data-bs-slide-to=\"0\" class=\"active\" aria-current=\"true\" aria-label=\"Slide 1\"></button>\n      <button type=\"button\" data-bs-target=\"#carouselExampleCaptions\" data-bs-slide-to=\"1\" aria-label=\"Slide 2\"></button>\n      <button type=\"button\" data-bs-target=\"#carouselExampleCaptions\" data-bs-slide-to=\"2\" aria-label=\"Slide 3\"></button>\n    </div>\n    <div class=\"carousel-inner\">\n      <div class=\"carousel-item active\">\n        <Placeholder width=\"800\" height=\"400\" class=\"bd-placeholder-img-lg d-block w-100\" color=\"#555\" background=\"#777\" text=\"First slide\" />\n        <div class=\"carousel-caption d-none d-md-block\">\n          <h5>First slide label</h5>\n          <p>Some representative placeholder content for the first slide.</p>\n        </div>\n      </div>\n      <div class=\"carousel-item\">\n        <Placeholder width=\"800\" height=\"400\" class=\"bd-placeholder-img-lg d-block w-100\" color=\"#444\" background=\"#666\" text=\"Second slide\" />\n        <div class=\"carousel-caption d-none d-md-block\">\n          <h5>Second slide label</h5>\n          <p>Some representative placeholder content for the second slide.</p>\n        </div>\n      </div>\n      <div class=\"carousel-item\">\n        <Placeholder width=\"800\" height=\"400\" class=\"bd-placeholder-img-lg d-block w-100\" color=\"#333\" background=\"#555\" text=\"Third slide\" />\n        <div class=\"carousel-caption d-none d-md-block\">\n          <h5>Third slide label</h5>\n          <p>Some representative placeholder content for the third slide.</p>\n        </div>\n      </div>\n    </div>\n    <button class=\"carousel-control-prev\" type=\"button\" data-bs-target=\"#carouselExampleCaptions\" data-bs-slide=\"prev\">\n      <span class=\"carousel-control-prev-icon\" aria-hidden=\"true\"></span>\n      <span class=\"visually-hidden\">Previous</span>\n    </button>\n    <button class=\"carousel-control-next\" type=\"button\" data-bs-target=\"#carouselExampleCaptions\" data-bs-slide=\"next\">\n      <span class=\"carousel-control-next-icon\" aria-hidden=\"true\"></span>\n      <span class=\"visually-hidden\">Next</span>\n    </button>\n  </div>`} />\n\n### Crossfade\n\nAdd `.carousel-fade` to your carousel to animate slides with a fade transition instead of a slide. Depending on your carousel content (e.g., text only slides), you may want to add `.bg-body` or some custom CSS to the `.carousel-item`s for proper crossfading.\n\n<Example code={`<div id=\"carouselExampleFade\" class=\"carousel slide carousel-fade\">\n    <div class=\"carousel-inner\">\n      <div class=\"carousel-item active\">\n        <Placeholder width=\"800\" height=\"400\" class=\"bd-placeholder-img-lg d-block w-100\" color=\"#555\" background=\"#777\" text=\"First slide\" />\n      </div>\n      <div class=\"carousel-item\">\n        <Placeholder width=\"800\" height=\"400\" class=\"bd-placeholder-img-lg d-block w-100\" color=\"#444\" background=\"#666\" text=\"Second slide\" />\n      </div>\n      <div class=\"carousel-item\">\n        <Placeholder width=\"800\" height=\"400\" class=\"bd-placeholder-img-lg d-block w-100\" color=\"#333\" background=\"#555\" text=\"Third slide\" />\n      </div>\n    </div>\n    <button class=\"carousel-control-prev\" type=\"button\" data-bs-target=\"#carouselExampleFade\" data-bs-slide=\"prev\">\n      <span class=\"carousel-control-prev-icon\" aria-hidden=\"true\"></span>\n      <span class=\"visually-hidden\">Previous</span>\n    </button>\n    <button class=\"carousel-control-next\" type=\"button\" data-bs-target=\"#carouselExampleFade\" data-bs-slide=\"next\">\n      <span class=\"carousel-control-next-icon\" aria-hidden=\"true\"></span>\n      <span class=\"visually-hidden\">Next</span>\n    </button>\n  </div>`} />\n\n## Autoplaying carousels\n\nYou can make your carousels autoplay on page load by setting the `ride` option to `carousel`. Autoplaying carousels automatically pause while hovered with the mouse. This behavior can be controlled with the `pause` option. In browsers that support the [Page Visibility API](https://www.w3.org/TR/page-visibility/), the carousel will stop cycling when the webpage is not visible to the user (such as when the browser tab is inactive, or when the browser window is minimized).\n\n<Callout>\nFor accessibility reasons, we recommend avoiding the use of autoplaying carousels. If your page does include an autoplaying carousel, we recommend providing an additional button or control to explicitly pause/stop the carousel.\n\nSee [WCAG 2.2 Success Criterion 2.2.2 Pause, Stop, Hide](https://www.w3.org/TR/WCAG/#pause-stop-hide).\n</Callout>\n\n<Example code={`<div id=\"carouselExampleAutoplaying\" class=\"carousel slide\" data-bs-ride=\"carousel\">\n    <div class=\"carousel-inner\">\n      <div class=\"carousel-item active\">\n        <Placeholder width=\"800\" height=\"400\" class=\"bd-placeholder-img-lg d-block w-100\" color=\"#555\" background=\"#777\" text=\"First slide\" />\n      </div>\n      <div class=\"carousel-item\">\n        <Placeholder width=\"800\" height=\"400\" class=\"bd-placeholder-img-lg d-block w-100\" color=\"#444\" background=\"#666\" text=\"Second slide\" />\n      </div>\n      <div class=\"carousel-item\">\n        <Placeholder width=\"800\" height=\"400\" class=\"bd-placeholder-img-lg d-block w-100\" color=\"#333\" background=\"#555\" text=\"Third slide\" />\n      </div>\n    </div>\n    <button class=\"carousel-control-prev\" type=\"button\" data-bs-target=\"#carouselExampleAutoplaying\" data-bs-slide=\"prev\">\n      <span class=\"carousel-control-prev-icon\" aria-hidden=\"true\"></span>\n      <span class=\"visually-hidden\">Previous</span>\n    </button>\n    <button class=\"carousel-control-next\" type=\"button\" data-bs-target=\"#carouselExampleAutoplaying\" data-bs-slide=\"next\">\n      <span class=\"carousel-control-next-icon\" aria-hidden=\"true\"></span>\n      <span class=\"visually-hidden\">Next</span>\n    </button>\n  </div>`} />\n\nWhen the `ride` option is set to `true`, rather than `carousel`, the carousel won’t automatically start to cycle on page load. Instead, it will only start after the first user interaction.\n\n<Example code={`<div id=\"carouselExampleRide\" class=\"carousel slide\" data-bs-ride=\"true\">\n    <div class=\"carousel-inner\">\n      <div class=\"carousel-item active\">\n        <Placeholder width=\"800\" height=\"400\" class=\"bd-placeholder-img-lg d-block w-100\" color=\"#555\" background=\"#777\" text=\"First slide\" />\n      </div>\n      <div class=\"carousel-item\">\n        <Placeholder width=\"800\" height=\"400\" class=\"bd-placeholder-img-lg d-block w-100\" color=\"#444\" background=\"#666\" text=\"Second slide\" />\n      </div>\n      <div class=\"carousel-item\">\n        <Placeholder width=\"800\" height=\"400\" class=\"bd-placeholder-img-lg d-block w-100\" color=\"#333\" background=\"#555\" text=\"Third slide\" />\n      </div>\n    </div>\n    <button class=\"carousel-control-prev\" type=\"button\" data-bs-target=\"#carouselExampleRide\" data-bs-slide=\"prev\">\n      <span class=\"carousel-control-prev-icon\" aria-hidden=\"true\"></span>\n      <span class=\"visually-hidden\">Previous</span>\n    </button>\n    <button class=\"carousel-control-next\" type=\"button\" data-bs-target=\"#carouselExampleRide\" data-bs-slide=\"next\">\n      <span class=\"carousel-control-next-icon\" aria-hidden=\"true\"></span>\n      <span class=\"visually-hidden\">Next</span>\n    </button>\n  </div>`} />\n\n### Individual `.carousel-item` interval\n\nAdd `data-bs-interval=\"\"` to a `.carousel-item` to change the amount of time to delay between automatically cycling to the next item.\n\n<Example code={`<div id=\"carouselExampleInterval\" class=\"carousel slide\" data-bs-ride=\"carousel\">\n    <div class=\"carousel-inner\">\n      <div class=\"carousel-item active\" data-bs-interval=\"10000\">\n        <Placeholder width=\"800\" height=\"400\" class=\"bd-placeholder-img-lg d-block w-100\" color=\"#555\" background=\"#777\" text=\"First slide\" />\n      </div>\n      <div class=\"carousel-item\" data-bs-interval=\"2000\">\n        <Placeholder width=\"800\" height=\"400\" class=\"bd-placeholder-img-lg d-block w-100\" color=\"#444\" background=\"#666\" text=\"Second slide\" />\n      </div>\n      <div class=\"carousel-item\">\n        <Placeholder width=\"800\" height=\"400\" class=\"bd-placeholder-img-lg d-block w-100\" color=\"#333\" background=\"#555\" text=\"Third slide\" />\n      </div>\n    </div>\n    <button class=\"carousel-control-prev\" type=\"button\" data-bs-target=\"#carouselExampleInterval\" data-bs-slide=\"prev\">\n      <span class=\"carousel-control-prev-icon\" aria-hidden=\"true\"></span>\n      <span class=\"visually-hidden\">Previous</span>\n    </button>\n    <button class=\"carousel-control-next\" type=\"button\" data-bs-target=\"#carouselExampleInterval\" data-bs-slide=\"next\">\n      <span class=\"carousel-control-next-icon\" aria-hidden=\"true\"></span>\n      <span class=\"visually-hidden\">Next</span>\n    </button>\n  </div>`} />\n\n### Autoplaying carousels without controls\n\nHere’s a carousel with slides only. Note the presence of the `.d-block` and `.w-100` on carousel images to prevent browser default image alignment.\n\n<Example code={`<div id=\"carouselExampleSlidesOnly\" class=\"carousel slide\" data-bs-ride=\"carousel\">\n    <div class=\"carousel-inner\">\n      <div class=\"carousel-item active\">\n        <Placeholder width=\"800\" height=\"400\" class=\"bd-placeholder-img-lg d-block w-100\" color=\"#555\" background=\"#777\" text=\"First slide\" />\n      </div>\n      <div class=\"carousel-item\">\n        <Placeholder width=\"800\" height=\"400\" class=\"bd-placeholder-img-lg d-block w-100\" color=\"#444\" background=\"#666\" text=\"Second slide\" />\n      </div>\n      <div class=\"carousel-item\">\n        <Placeholder width=\"800\" height=\"400\" class=\"bd-placeholder-img-lg d-block w-100\" color=\"#333\" background=\"#555\" text=\"Third slide\" />\n      </div>\n    </div>\n  </div>`} />\n\n## Disable touch swiping\n\nCarousels support swiping left/right on touchscreen devices to move between slides. This can be disabled by setting the `touch` option to `false`.\n\n<Example code={`<div id=\"carouselExampleControlsNoTouching\" class=\"carousel slide\" data-bs-touch=\"false\">\n    <div class=\"carousel-inner\">\n      <div class=\"carousel-item active\">\n        <Placeholder width=\"800\" height=\"400\" class=\"bd-placeholder-img-lg d-block w-100\" color=\"#555\" background=\"#777\" text=\"First slide\" />\n      </div>\n      <div class=\"carousel-item\">\n        <Placeholder width=\"800\" height=\"400\" class=\"bd-placeholder-img-lg d-block w-100\" color=\"#444\" background=\"#666\" text=\"Second slide\" />\n      </div>\n      <div class=\"carousel-item\">\n        <Placeholder width=\"800\" height=\"400\" class=\"bd-placeholder-img-lg d-block w-100\" color=\"#333\" background=\"#555\" text=\"Third slide\" />\n      </div>\n    </div>\n    <button class=\"carousel-control-prev\" type=\"button\" data-bs-target=\"#carouselExampleControlsNoTouching\" data-bs-slide=\"prev\">\n      <span class=\"carousel-control-prev-icon\" aria-hidden=\"true\"></span>\n      <span class=\"visually-hidden\">Previous</span>\n    </button>\n    <button class=\"carousel-control-next\" type=\"button\" data-bs-target=\"#carouselExampleControlsNoTouching\" data-bs-slide=\"next\">\n      <span class=\"carousel-control-next-icon\" aria-hidden=\"true\"></span>\n      <span class=\"visually-hidden\">Next</span>\n    </button>\n  </div>`} />\n\n## Dark variant\n\n<DeprecatedIn version=\"5.3.0\" />\n\nAdd `.carousel-dark` to the `.carousel` for darker controls, indicators, and captions. Controls are inverted compared to their default white fill with the `filter` CSS property. Captions and controls have additional Sass variables that customize the `color` and `background-color`.\n\n<CalloutDeprecatedDarkVariants component=\"carousel\" />\n\n<Example code={`<div id=\"carouselExampleDark\" class=\"carousel carousel-dark slide\">\n    <div class=\"carousel-indicators\">\n      <button type=\"button\" data-bs-target=\"#carouselExampleDark\" data-bs-slide-to=\"0\" class=\"active\" aria-current=\"true\" aria-label=\"Slide 1\"></button>\n      <button type=\"button\" data-bs-target=\"#carouselExampleDark\" data-bs-slide-to=\"1\" aria-label=\"Slide 2\"></button>\n      <button type=\"button\" data-bs-target=\"#carouselExampleDark\" data-bs-slide-to=\"2\" aria-label=\"Slide 3\"></button>\n    </div>\n    <div class=\"carousel-inner\">\n      <div class=\"carousel-item active\" data-bs-interval=\"10000\">\n        <Placeholder width=\"800\" height=\"400\" class=\"bd-placeholder-img-lg d-block w-100\" color=\"#aaa\" background=\"#f5f5f5\" text=\"First slide\" />\n        <div class=\"carousel-caption d-none d-md-block\">\n          <h5>First slide label</h5>\n          <p>Some representative placeholder content for the first slide.</p>\n        </div>\n      </div>\n      <div class=\"carousel-item\" data-bs-interval=\"2000\">\n        <Placeholder width=\"800\" height=\"400\" class=\"bd-placeholder-img-lg d-block w-100\" color=\"#bbb\" background=\"#eee\" text=\"Second slide\" />\n        <div class=\"carousel-caption d-none d-md-block\">\n          <h5>Second slide label</h5>\n          <p>Some representative placeholder content for the second slide.</p>\n        </div>\n      </div>\n      <div class=\"carousel-item\">\n        <Placeholder width=\"800\" height=\"400\" class=\"bd-placeholder-img-lg d-block w-100\" color=\"#999\" background=\"#e5e5e5\" text=\"Third slide\" />\n        <div class=\"carousel-caption d-none d-md-block\">\n          <h5>Third slide label</h5>\n          <p>Some representative placeholder content for the third slide.</p>\n        </div>\n      </div>\n    </div>\n    <button class=\"carousel-control-prev\" type=\"button\" data-bs-target=\"#carouselExampleDark\" data-bs-slide=\"prev\">\n      <span class=\"carousel-control-prev-icon\" aria-hidden=\"true\"></span>\n      <span class=\"visually-hidden\">Previous</span>\n    </button>\n    <button class=\"carousel-control-next\" type=\"button\" data-bs-target=\"#carouselExampleDark\" data-bs-slide=\"next\">\n      <span class=\"carousel-control-next-icon\" aria-hidden=\"true\"></span>\n      <span class=\"visually-hidden\">Next</span>\n    </button>\n  </div>`} />\n\n## Custom transition\n\nThe transition duration of `.carousel-item` can be changed with the `$carousel-transition-duration` Sass variable before compiling or custom styles if you’re using the compiled CSS. If multiple transitions are applied, make sure the transform transition is defined first (e.g. `transition: transform 2s ease, opacity .5s ease-out`).\n\n## CSS\n\n### Sass variables\n\nVariables for all carousels:\n\n<ScssDocs name=\"carousel-variables\" file=\"scss/_variables.scss\" />\n\nVariables for the [dark carousel](#dark-variant):\n\n<ScssDocs name=\"carousel-dark-variables\" file=\"scss/_variables.scss\" />\n\n## Usage\n\n### Via data attributes\n\nUse data attributes to easily control the position of the carousel. `data-bs-slide` accepts the keywords `prev` or `next`, which alters the slide position relative to its current position. Alternatively, use `data-bs-slide-to` to pass a raw slide index to the carousel `data-bs-slide-to=\"2\"`, which shifts the slide position to a particular index beginning with `0`.\n\n### Via JavaScript\n\nCall carousel manually with:\n\n```js\nconst carousel = new bootstrap.Carousel('#myCarousel')\n```\n\n### Options\n\n<JsDataAttributes />\n\n<BsTable>\n| Name | Type | Default | Description |\n| --- | --- | --- | --- |\n| `interval` | number | `5000` | The amount of time to delay between automatically cycling an item. |\n| `keyboard` | boolean | `true` | Whether the carousel should react to keyboard events. |\n| `pause` | string, boolean | `\"hover\"` | If set to `\"hover\"`, pauses the cycling of the carousel on `mouseenter` and resumes the cycling of the carousel on `mouseleave`. If set to `false`, hovering over the carousel won’t pause it. On touch-enabled devices, when set to `\"hover\"`, cycling will pause on `touchend` (once the user finished interacting with the carousel) for two intervals, before automatically resuming. This is in addition to the mouse behavior. |\n| `ride` | string, boolean | `false` | If set to `true`, autoplays the carousel after the user manually cycles the first item. If set to `\"carousel\"`, autoplays the carousel on load. |\n| `touch` | boolean | `true` | Whether the carousel should support left/right swipe interactions on touchscreen devices. |\n| `wrap` | boolean | `true` | Whether the carousel should cycle continuously or have hard stops. |\n</BsTable>\n\n### Methods\n\n<Callout name=\"danger-async-methods\" type=\"danger\" />\n\nYou can create a carousel instance with the carousel constructor, and pass on any additional options. For example, to manually initialize an autoplaying carousel (assuming you’re not using the `data-bs-ride=\"carousel\"` attribute in the markup itself) with a specific interval and with touch support disabled, you can use:\n\n```js\nconst myCarouselElement = document.querySelector('#myCarousel')\n\nconst carousel = new bootstrap.Carousel(myCarouselElement, {\n  interval: 2000,\n  touch: false\n})\n```\n\n<BsTable>\n| Method | Description |\n| --- | --- |\n| `cycle` | Starts cycling through the carousel items from left to right. |\n| `dispose` | Destroys an element’s carousel. (Removes stored data on the DOM element) |\n| `getInstance` | Static method which allows you to get the carousel instance associated to a DOM element. You can use it like this: `bootstrap.Carousel.getInstance(element)`. |\n| `getOrCreateInstance` | Static method which returns a carousel instance associated to a DOM element, or creates a new one in case it wasn’t initialized. You can use it like this: `bootstrap.Carousel.getOrCreateInstance(element)`. |\n| `next` | Cycles to the next item. **Returns to the caller before the next item has been shown** (e.g., before the `slid.bs.carousel` event occurs). |\n| `nextWhenVisible` | Don’t cycle carousel to next when the page, the carousel, or the carousel’s parent aren’t visible. **Returns to the caller before the target item has been shown**. |\n| `pause` | Stops the carousel from cycling through items. |\n| `prev` | Cycles to the previous item. **Returns to the caller before the previous item has been shown** (e.g., before the `slid.bs.carousel` event occurs). |\n| `to` | Cycles the carousel to a particular frame (0 based, similar to an array). **Returns to the caller before the target item has been shown** (e.g., before the `slid.bs.carousel` event occurs). |\n</BsTable>\n\n### Events\n\nBootstrap’s carousel class exposes two events for hooking into carousel functionality. Both events have the following additional properties:\n\n- `direction`: The direction in which the carousel is sliding (either `\"left\"` or `\"right\"`).\n- `relatedTarget`: The DOM element that is being slid into place as the active item.\n- `from`: The index of the current item\n- `to`: The index of the next item\n\nAll carousel events are fired at the carousel itself (i.e. at the `<div class=\"carousel\">`).\n\n<BsTable>\n| Event type | Description |\n| --- | --- |\n| `slid.bs.carousel` | Fired when the carousel has completed its slide transition. |\n| `slide.bs.carousel` | Fires immediately when the `slide` instance method is invoked. |\n</BsTable>\n\n```js\nconst myCarousel = document.getElementById('myCarousel')\n\nmyCarousel.addEventListener('slide.bs.carousel', event => {\n  // do something...\n})\n```\n"
  },
  {
    "path": "site/src/content/docs/components/close-button.mdx",
    "content": "---\ntitle: Close button\ndescription: A generic close button for dismissing content like modals and alerts.\ntoc: true\n---\n\n## Example\n\nProvide an option to dismiss or close a component with `.btn-close`. Default styling is limited, but highly customizable. Modify the Sass variables to replace the default `background-image`. **Be sure to include text for screen readers**, as we’ve done with `aria-label`.\n\n<Example code={`<button type=\"button\" class=\"btn-close\" aria-label=\"Close\"></button>`} />\n\n## Disabled state\n\nDisabled close buttons change their `opacity`. We’ve also applied `pointer-events: none` and `user-select: none` to preventing hover and active states from triggering.\n\n<Example code={`<button type=\"button\" class=\"btn-close\" disabled aria-label=\"Close\"></button>`} />\n\n## Dark variant\n\n<DeprecatedIn version=\"5.3.0\" />\n\n<Callout type=\"warning\">\n**Heads up!** As of v5.3.0, the `.btn-close-white` class is deprecated. Instead, use `data-bs-theme=\"dark\"` to change the color mode of the close button.\n</Callout>\n\nAdd `data-bs-theme=\"dark\"` to the `.btn-close`, or to its parent element, to invert the close button. This uses the `filter` property to invert the `background-image` without overriding its value.\n\n<Example class=\"bg-dark\" code={`<div data-bs-theme=\"dark\">\n    <button type=\"button\" class=\"btn-close\" aria-label=\"Close\"></button>\n    <button type=\"button\" class=\"btn-close\" disabled aria-label=\"Close\"></button>\n  </div>`} />\n\n## CSS\n\n### Variables\n\n<AddedIn version=\"5.3.0\" />\n\nAs part of Bootstrap’s evolving CSS variables approach, close button now uses local CSS variables on `.btn-close` for enhanced real-time customization. Values for the CSS variables are set via Sass, so Sass customization is still supported, too.\n\n<ScssDocs name=\"close-css-vars\" file=\"scss/_close.scss\" />\n\n### Sass variables\n\n<ScssDocs name=\"close-variables\" file=\"scss/_variables.scss\" />\n"
  },
  {
    "path": "site/src/content/docs/components/collapse.mdx",
    "content": "---\ntitle: Collapse\ndescription: Toggle the visibility of content across your project with a few classes and our JavaScript plugins.\ntoc: true\n---\n\n## How it works\n\nThe collapse JavaScript plugin is used to show and hide content. Buttons or anchors are used as triggers that are mapped to specific elements you toggle. Collapsing an element will animate the `height` from its current value to `0`. Given how CSS handles animations, you cannot use `padding` on a `.collapse` element. Instead, use the class as an independent wrapping element.\n\n<Callout name=\"info-prefersreducedmotion\" />\n\n## Example\n\nClick the buttons below to show and hide another element via class changes:\n\n- `.collapse` hides content\n- `.collapsing` is applied during transitions\n- `.collapse.show` shows content\n\nGenerally, we recommend using a `<button>` with the `data-bs-target` attribute. While not recommended from a semantic point of view, you can also use an `<a>` link with the `href` attribute (and a `role=\"button\"`). In both cases, the `data-bs-toggle=\"collapse\"` is required.\n\n<Example code={`<p class=\"d-inline-flex gap-1\">\n    <a class=\"btn btn-primary\" data-bs-toggle=\"collapse\" href=\"#collapseExample\" role=\"button\" aria-expanded=\"false\" aria-controls=\"collapseExample\">\n      Link with href\n    </a>\n    <button class=\"btn btn-primary\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#collapseExample\" aria-expanded=\"false\" aria-controls=\"collapseExample\">\n      Button with data-bs-target\n    </button>\n  </p>\n  <div class=\"collapse\" id=\"collapseExample\">\n    <div class=\"card card-body\">\n      Some placeholder content for the collapse component. This panel is hidden by default but revealed when the user activates the relevant trigger.\n    </div>\n  </div>`} />\n\n## Horizontal\n\nThe collapse plugin supports horizontal collapsing. Add the `.collapse-horizontal` modifier class to transition the `width` instead of `height` and set a `width` on the immediate child element. Feel free to write your own custom Sass, use inline styles, or use our [width utilities]([[docsref:/utilities/sizing]]).\n\n<Callout>\nPlease note that while the example below has a `min-height` set to avoid excessive repaints in our docs, this is not explicitly required. **Only the `width` on the child element is required.**\n</Callout>\n\n<Example code={`<p>\n    <button class=\"btn btn-primary\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#collapseWidthExample\" aria-expanded=\"false\" aria-controls=\"collapseWidthExample\">\n      Toggle width collapse\n    </button>\n  </p>\n  <div style=\"min-height: 120px;\">\n    <div class=\"collapse collapse-horizontal\" id=\"collapseWidthExample\">\n      <div class=\"card card-body\" style=\"width: 300px;\">\n        This is some placeholder content for a horizontal collapse. It’s hidden by default and shown when triggered.\n      </div>\n    </div>\n  </div>`} />\n\n## Multiple toggles and targets\n\nA `<button>` or `<a>` element can show and hide multiple elements by referencing them with a selector in its `data-bs-target` or `href` attribute.\nConversely, multiple `<button>` or `<a>` elements can show and hide the same element if they each reference it with their `data-bs-target` or `href` attribute.\n\n<Example code={`<p class=\"d-inline-flex gap-1\">\n    <a class=\"btn btn-primary\" data-bs-toggle=\"collapse\" href=\"#multiCollapseExample1\" role=\"button\" aria-expanded=\"false\" aria-controls=\"multiCollapseExample1\">Toggle first element</a>\n    <button class=\"btn btn-primary\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#multiCollapseExample2\" aria-expanded=\"false\" aria-controls=\"multiCollapseExample2\">Toggle second element</button>\n    <button class=\"btn btn-primary\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\".multi-collapse\" aria-expanded=\"false\" aria-controls=\"multiCollapseExample1 multiCollapseExample2\">Toggle both elements</button>\n  </p>\n  <div class=\"row\">\n    <div class=\"col\">\n      <div class=\"collapse multi-collapse\" id=\"multiCollapseExample1\">\n        <div class=\"card card-body\">\n          Some placeholder content for the first collapse component of this multi-collapse example. This panel is hidden by default but revealed when the user activates the relevant trigger.\n        </div>\n      </div>\n    </div>\n    <div class=\"col\">\n      <div class=\"collapse multi-collapse\" id=\"multiCollapseExample2\">\n        <div class=\"card card-body\">\n          Some placeholder content for the second collapse component of this multi-collapse example. This panel is hidden by default but revealed when the user activates the relevant trigger.\n        </div>\n      </div>\n    </div>\n  </div>`} />\n\n## Accessibility\n\nBe sure to add `aria-expanded` to the control element. This attribute explicitly conveys the current state of the collapsible element tied to the control to screen readers and similar assistive technologies. If the collapsible element is closed by default, the attribute on the control element should have a value of `aria-expanded=\"false\"`. If you’ve set the collapsible element to be open by default using the `show` class, set `aria-expanded=\"true\"` on the control instead. The plugin will automatically toggle this attribute on the control based on whether or not the collapsible element has been opened or closed (via JavaScript, or because the user triggered another control element also tied to the same collapsible element). If the control element’s HTML element is not a button (e.g., an `<a>` or `<div>`), the attribute `role=\"button\"` should be added to the element.\n\nIf your control element is targeting a single collapsible element – i.e. the `data-bs-target` attribute is pointing to an `id` selector – you should add the `aria-controls` attribute to the control element, containing the `id` of the collapsible element. Modern screen readers and similar assistive technologies make use of this attribute to provide users with additional shortcuts to navigate directly to the collapsible element itself.\n\nNote that Bootstrap’s current implementation does not cover the various *optional* keyboard interactions described in the [ARIA Authoring Practices Guide accordion pattern](https://www.w3.org/WAI/ARIA/apg/patterns/accordion/) - you will need to include these yourself with custom JavaScript.\n\n## CSS\n\n### Sass variables\n\n<ScssDocs name=\"collapse-transition\" file=\"scss/_variables.scss\" />\n\n### Classes\n\nCollapse transition classes can be found in `scss/_transitions.scss` as these are shared across multiple components (collapse and accordion).\n\n<ScssDocs name=\"collapse-classes\" file=\"scss/_transitions.scss\" />\n\n## Usage\n\nThe collapse plugin utilizes a few classes to handle the heavy lifting:\n\n- `.collapse` hides the content\n- `.collapse.show` shows the content\n- `.collapsing` is added when the transition starts, and removed when it finishes\n\nThese classes can be found in `_transitions.scss`.\n\n### Via data attributes\n\nJust add `data-bs-toggle=\"collapse\"` and a `data-bs-target` to the element to automatically assign control of one or more collapsible elements. The `data-bs-target` attribute accepts a CSS selector to apply the collapse to. Be sure to add the class `collapse` to the collapsible element. If you’d like it to default open, add the additional class `show`.\n\nTo add accordion-like group management to a collapsible area, add the data attribute `data-bs-parent=\"#selector\"`. Refer to the [accordion page]([[docsref:/components/accordion]]) for more information.\n\n### Via JavaScript\n\nEnable manually with:\n\n```js\nconst collapseElementList = document.querySelectorAll('.collapse')\nconst collapseList = [...collapseElementList].map(collapseEl => new bootstrap.Collapse(collapseEl))\n```\n\n### Options\n\n<JsDataAttributes />\n\n<BsTable>\n| Name | Type | Default | Description |\n| --- | --- | --- | --- |\n`parent` | selector, DOM element | `null` | If parent is provided, then all collapsible elements under the specified parent will be closed when this collapsible item is shown. (similar to traditional accordion behavior - this is dependent on the `card` class). The attribute has to be set on the target collapsible area. |\n`toggle` | boolean | `true` | Toggles the collapsible element on invocation. |\n</BsTable>\n\n### Methods\n\n<Callout name=\"danger-async-methods\" type=\"danger\" />\n\nActivates your content as a collapsible element. Accepts an optional options `object`.\n\nYou can create a collapse instance with the constructor, for example:\n\n```js\nconst bsCollapse = new bootstrap.Collapse('#myCollapse', {\n  toggle: false\n})\n```\n\n<BsTable>\n| Method | Description |\n| --- | --- |\n| `dispose` | Destroys an element’s collapse. (Removes stored data on the DOM element) |\n| `getInstance` | Static method which allows you to get the collapse instance associated to a DOM element, you can use it like this: `bootstrap.Collapse.getInstance(element)`. |\n| `getOrCreateInstance` | Static method which returns a collapse instance associated to a DOM element or create a new one in case it wasn’t initialized. You can use it like this: `bootstrap.Collapse.getOrCreateInstance(element)`. |\n| `hide` | Hides a collapsible element. **Returns to the caller before the collapsible element has actually been hidden** (e.g., before the `hidden.bs.collapse` event occurs). |\n| `show` | Shows a collapsible element. **Returns to the caller before the collapsible element has actually been shown** (e.g., before the `shown.bs.collapse` event occurs). |\n| `toggle` | Toggles a collapsible element to shown or hidden. **Returns to the caller before the collapsible element has actually been shown or hidden** (i.e. before the `shown.bs.collapse` or `hidden.bs.collapse` event occurs). |\n</BsTable>\n\n### Events\n\nBootstrap’s collapse class exposes a few events for hooking into collapse functionality.\n\n<BsTable>\n| Event type | Description |\n| --- | --- |\n| `hide.bs.collapse` | This event is fired immediately when the `hide` method has been called. |\n| `hidden.bs.collapse` | This event is fired when a collapse element has been hidden from the user (will wait for CSS transitions to complete). |\n| `show.bs.collapse` | This event fires immediately when the `show` instance method is called. |\n| `shown.bs.collapse` | This event is fired when a collapse element has been made visible to the user (will wait for CSS transitions to complete). |\n</BsTable>\n\n```js\nconst myCollapsible = document.getElementById('myCollapsible')\nmyCollapsible.addEventListener('hidden.bs.collapse', event => {\n  // do something...\n})\n```\n"
  },
  {
    "path": "site/src/content/docs/components/dropdowns.mdx",
    "content": "---\ntitle: Dropdowns\ndescription: Toggle contextual overlays for displaying lists of links and more with the Bootstrap dropdown plugin.\ntoc: true\n---\n\n## Overview\n\nDropdowns are toggleable, contextual overlays for displaying lists of links and more. They’re made interactive with the included Bootstrap dropdown JavaScript plugin. They’re toggled by clicking, not by hovering; this is [an intentional design decision](https://markdotto.com/blog/bootstrap-explained-dropdowns/).\n\nDropdowns are built on a third party library, [Popper](https://popper.js.org/docs/v2/), which provides dynamic positioning and viewport detection. Be sure to include [popper.min.js]([[config:cdn.popper]]) before Bootstrap’s JavaScript or use `bootstrap.bundle.min.js` / `bootstrap.bundle.js` which contains Popper. Popper isn’t used to position dropdowns in navbars though as dynamic positioning isn’t required.\n\n## Accessibility\n\nThe [<abbr title=\"Web Accessibility Initiative\">WAI</abbr> <abbr title=\"Accessible Rich Internet Applications\">ARIA</abbr>](https://www.w3.org/TR/wai-aria/) standard defines an actual [`role=\"menu\"` widget](https://www.w3.org/TR/wai-aria/#menu), but this is specific to application-like menus which trigger actions or functions. <abbr title=\"Accessible Rich Internet Applications\">ARIA</abbr> menus can only contain menu items, checkbox menu items, radio button menu items, radio button groups, and sub-menus.\n\nBootstrap’s dropdowns, on the other hand, are designed to be generic and applicable to a variety of situations and markup structures. For instance, it is possible to create dropdowns that contain additional inputs and form controls, such as search fields or login forms. For this reason, Bootstrap does not expect (nor automatically add) any of the `role` and `aria-` attributes required for true <abbr title=\"Accessible Rich Internet Applications\">ARIA</abbr> menus. Authors will have to include these more specific attributes themselves.\n\nHowever, Bootstrap does add built-in support for most standard keyboard menu interactions, such as the ability to move through individual `.dropdown-item` elements using the cursor keys and close the menu with the <kbd>Esc</kbd> key.\n\n## Examples\n\nWrap the dropdown’s toggle (your button or link) and the dropdown menu within `.dropdown`, or another element that declares `position: relative;`. Ideally, you should use a `<button>` element as the dropdown trigger, but the plugin will work with `<a>` elements as well. The examples shown here use semantic `<ul>` elements where appropriate, but custom markup is supported.\n\n### Single button\n\nAny single `.btn` can be turned into a dropdown toggle with some markup changes. Here’s how you can put them to work with `<button>` elements:\n\n<Example code={`<div class=\"dropdown\">\n    <button class=\"btn btn-secondary dropdown-toggle\" type=\"button\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n      Dropdown button\n    </button>\n    <ul class=\"dropdown-menu\">\n      <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n    </ul>\n  </div>`} />\n\nWhile `<button>` is the recommended control for a dropdown toggle, there might be situations where you have to use an `<a>` element. If you do, we recommend adding a `role=\"button\"` attribute to appropriately convey control’s purpose to assistive technologies such as screen readers.\n\n<Example code={`<div class=\"dropdown\">\n    <a class=\"btn btn-secondary dropdown-toggle\" href=\"#\" role=\"button\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n      Dropdown link\n    </a>\n\n    <ul class=\"dropdown-menu\">\n      <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n    </ul>\n  </div>`} />\n\nThe best part is you can do this with any button variant, too:\n\n<Example showMarkup={false} code={`<div class=\"btn-group\">\n    <button type=\"button\" class=\"btn btn-primary dropdown-toggle\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">Primary</button>\n    <ul class=\"dropdown-menu\">\n      <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n      <li><hr class=\"dropdown-divider\"></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Separated link</a></li>\n    </ul>\n  </div>\n  <div class=\"btn-group\">\n    <button type=\"button\" class=\"btn btn-secondary dropdown-toggle\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">Secondary</button>\n    <ul class=\"dropdown-menu\">\n      <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n      <li><hr class=\"dropdown-divider\"></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Separated link</a></li>\n    </ul>\n  </div>\n  <div class=\"btn-group\">\n    <button type=\"button\" class=\"btn btn-success dropdown-toggle\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">Success</button>\n    <ul class=\"dropdown-menu\">\n      <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n      <li><hr class=\"dropdown-divider\"></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Separated link</a></li>\n    </ul>\n  </div>\n  <div class=\"btn-group\">\n    <button type=\"button\" class=\"btn btn-info dropdown-toggle\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">Info</button>\n    <ul class=\"dropdown-menu\">\n      <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n      <li><hr class=\"dropdown-divider\"></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Separated link</a></li>\n    </ul>\n  </div>\n  <div class=\"btn-group\">\n    <button type=\"button\" class=\"btn btn-warning dropdown-toggle\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">Warning</button>\n    <ul class=\"dropdown-menu\">\n      <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n      <li><hr class=\"dropdown-divider\"></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Separated link</a></li>\n    </ul>\n  </div>\n  <div class=\"btn-group\">\n    <button type=\"button\" class=\"btn btn-danger dropdown-toggle\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">Danger</button>\n    <ul class=\"dropdown-menu\">\n      <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n      <li><hr class=\"dropdown-divider\"></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Separated link</a></li>\n    </ul>\n  </div>`} />\n\n```html\n<!-- Example single danger button -->\n<div class=\"btn-group\">\n  <button type=\"button\" class=\"btn btn-danger dropdown-toggle\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n    Danger\n  </button>\n  <ul class=\"dropdown-menu\">\n    <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n    <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n    <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n    <li><hr class=\"dropdown-divider\"></li>\n    <li><a class=\"dropdown-item\" href=\"#\">Separated link</a></li>\n  </ul>\n</div>\n```\n\n### Split button\n\nSimilarly, create split button dropdowns with virtually the same markup as single button dropdowns, but with the addition of `.dropdown-toggle-split` for proper spacing around the dropdown caret.\n\nWe use this extra class to reduce the horizontal `padding` on either side of the caret by 25% and remove the `margin-left` that’s added for regular button dropdowns. Those extra changes keep the caret centered in the split button and provide a more appropriately sized hit area next to the main button.\n\n<Example showMarkup={false} code={`<div class=\"btn-group\">\n    <button type=\"button\" class=\"btn btn-primary\">Primary</button>\n    <button type=\"button\" class=\"btn btn-primary dropdown-toggle dropdown-toggle-split\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n      <span class=\"visually-hidden\">Toggle Dropdown</span>\n    </button>\n    <ul class=\"dropdown-menu\">\n      <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n      <li><hr class=\"dropdown-divider\"></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Separated link</a></li>\n    </ul>\n  </div>\n  <div class=\"btn-group\">\n    <button type=\"button\" class=\"btn btn-secondary\">Secondary</button>\n    <button type=\"button\" class=\"btn btn-secondary dropdown-toggle dropdown-toggle-split\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n      <span class=\"visually-hidden\">Toggle Dropdown</span>\n    </button>\n    <ul class=\"dropdown-menu\">\n      <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n      <li><hr class=\"dropdown-divider\"></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Separated link</a></li>\n    </ul>\n  </div>\n  <div class=\"btn-group\">\n    <button type=\"button\" class=\"btn btn-success\">Success</button>\n    <button type=\"button\" class=\"btn btn-success dropdown-toggle dropdown-toggle-split\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n      <span class=\"visually-hidden\">Toggle Dropdown</span>\n    </button>\n    <ul class=\"dropdown-menu\">\n      <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n      <li><hr class=\"dropdown-divider\"></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Separated link</a></li>\n    </ul>\n  </div>\n  <div class=\"btn-group\">\n    <button type=\"button\" class=\"btn btn-info\">Info</button>\n    <button type=\"button\" class=\"btn btn-info dropdown-toggle dropdown-toggle-split\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n      <span class=\"visually-hidden\">Toggle Dropdown</span>\n    </button>\n    <ul class=\"dropdown-menu\">\n      <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n      <li><hr class=\"dropdown-divider\"></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Separated link</a></li>\n    </ul>\n  </div>\n  <div class=\"btn-group\">\n    <button type=\"button\" class=\"btn btn-warning\">Warning</button>\n    <button type=\"button\" class=\"btn btn-warning dropdown-toggle dropdown-toggle-split\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n      <span class=\"visually-hidden\">Toggle Dropdown</span>\n    </button>\n    <ul class=\"dropdown-menu\">\n      <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n      <li><hr class=\"dropdown-divider\"></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Separated link</a></li>\n    </ul>\n  </div>\n  <div class=\"btn-group\">\n    <button type=\"button\" class=\"btn btn-danger\">Danger</button>\n    <button type=\"button\" class=\"btn btn-danger dropdown-toggle dropdown-toggle-split\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n      <span class=\"visually-hidden\">Toggle Dropdown</span>\n    </button>\n    <ul class=\"dropdown-menu\">\n      <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n      <li><hr class=\"dropdown-divider\"></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Separated link</a></li>\n    </ul>\n  </div>`} />\n\n```html\n<!-- Example split danger button -->\n<div class=\"btn-group\">\n  <button type=\"button\" class=\"btn btn-danger\">Danger</button>\n  <button type=\"button\" class=\"btn btn-danger dropdown-toggle dropdown-toggle-split\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n    <span class=\"visually-hidden\">Toggle Dropdown</span>\n  </button>\n  <ul class=\"dropdown-menu\">\n    <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n    <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n    <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n    <li><hr class=\"dropdown-divider\"></li>\n    <li><a class=\"dropdown-item\" href=\"#\">Separated link</a></li>\n  </ul>\n</div>\n```\n\n## Sizing\n\nButton dropdowns work with buttons of all sizes, including default and split dropdown buttons.\n\n<Example showMarkup={false} code={`<div class=\"btn-group\">\n    <button class=\"btn btn-secondary btn-lg dropdown-toggle\" type=\"button\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n      Large button\n    </button>\n    <ul class=\"dropdown-menu\">\n      <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n      <li><hr class=\"dropdown-divider\"></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Separated link</a></li>\n    </ul>\n  </div>\n  <div class=\"btn-group\">\n    <button type=\"button\" class=\"btn btn-lg btn-secondary\">Large split button</button>\n    <button type=\"button\" class=\"btn btn-lg btn-secondary dropdown-toggle dropdown-toggle-split\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n      <span class=\"visually-hidden\">Toggle Dropdown</span>\n    </button>\n    <ul class=\"dropdown-menu\">\n      <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n      <li><hr class=\"dropdown-divider\"></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Separated link</a></li>\n    </ul>\n  </div>`} />\n\n```html\n<!-- Large button groups (default and split) -->\n<div class=\"btn-group\">\n  <button class=\"btn btn-secondary btn-lg dropdown-toggle\" type=\"button\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n    Large button\n  </button>\n  <ul class=\"dropdown-menu\">\n    ...\n  </ul>\n</div>\n<div class=\"btn-group\">\n  <button class=\"btn btn-secondary btn-lg\" type=\"button\">\n    Large split button\n  </button>\n  <button type=\"button\" class=\"btn btn-lg btn-secondary dropdown-toggle dropdown-toggle-split\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n    <span class=\"visually-hidden\">Toggle Dropdown</span>\n  </button>\n  <ul class=\"dropdown-menu\">\n    ...\n  </ul>\n</div>\n```\n\n<Example showMarkup={false} code={`<div class=\"btn-group\">\n    <button class=\"btn btn-secondary btn-sm dropdown-toggle\" type=\"button\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n      Small button\n    </button>\n    <ul class=\"dropdown-menu\">\n      <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n      <li><hr class=\"dropdown-divider\"></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Separated link</a></li>\n    </ul>\n  </div>\n  <div class=\"btn-group\">\n    <button type=\"button\" class=\"btn btn-sm btn-secondary\">Small split button</button>\n    <button type=\"button\" class=\"btn btn-sm btn-secondary dropdown-toggle dropdown-toggle-split\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n      <span class=\"visually-hidden\">Toggle Dropdown</span>\n    </button>\n    <ul class=\"dropdown-menu\">\n      <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n      <li><hr class=\"dropdown-divider\"></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Separated link</a></li>\n    </ul>\n  </div>`} />\n\n```html\n<div class=\"btn-group\">\n  <button class=\"btn btn-secondary btn-sm dropdown-toggle\" type=\"button\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n    Small button\n  </button>\n  <ul class=\"dropdown-menu\">\n    ...\n  </ul>\n</div>\n<div class=\"btn-group\">\n  <button class=\"btn btn-secondary btn-sm\" type=\"button\">\n    Small split button\n  </button>\n  <button type=\"button\" class=\"btn btn-sm btn-secondary dropdown-toggle dropdown-toggle-split\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n    <span class=\"visually-hidden\">Toggle Dropdown</span>\n  </button>\n  <ul class=\"dropdown-menu\">\n    ...\n  </ul>\n</div>\n```\n\n## Dark dropdowns\n\n<DeprecatedIn version=\"5.3.0\" />\n\nOpt into darker dropdowns to match a dark navbar or custom style by adding `.dropdown-menu-dark` onto an existing `.dropdown-menu`. No changes are required to the dropdown items.\n\n<CalloutDeprecatedDarkVariants component=\"dropdown-menu\" />\n\n<Example code={`<div class=\"dropdown\">\n    <button class=\"btn btn-secondary dropdown-toggle\" type=\"button\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n      Dropdown button\n    </button>\n    <ul class=\"dropdown-menu dropdown-menu-dark\">\n      <li><a class=\"dropdown-item active\" href=\"#\">Action</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n      <li><hr class=\"dropdown-divider\"></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Separated link</a></li>\n    </ul>\n  </div>`} />\n\nAnd putting it to use in a navbar:\n\n<Example code={`<nav class=\"navbar navbar-expand-lg navbar-dark bg-dark\">\n    <div class=\"container-fluid\">\n      <a class=\"navbar-brand\" href=\"#\">Navbar</a>\n      <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbarNavDarkDropdown\" aria-controls=\"navbarNavDarkDropdown\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n        <span class=\"navbar-toggler-icon\"></span>\n      </button>\n      <div class=\"collapse navbar-collapse\" id=\"navbarNavDarkDropdown\">\n        <ul class=\"navbar-nav\">\n          <li class=\"nav-item dropdown\">\n            <button class=\"btn btn-dark dropdown-toggle\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n              Dropdown\n            </button>\n            <ul class=\"dropdown-menu dropdown-menu-dark\">\n              <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n              <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n              <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n            </ul>\n          </li>\n        </ul>\n      </div>\n    </div>\n  </nav>`} />\n\n## Directions\n\n<Callout>\n**Directions are flipped in RTL mode.** As such, `.dropstart` will appear on the right side.\n</Callout>\n\n### Centered\n\nMake the dropdown menu centered below the toggle with `.dropdown-center` on the parent element.\n\n<Example code={`<div class=\"dropdown-center\">\n    <button class=\"btn btn-secondary dropdown-toggle\" type=\"button\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n      Centered dropdown\n    </button>\n    <ul class=\"dropdown-menu\">\n      <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Action two</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Action three</a></li>\n    </ul>\n  </div>`} />\n\n### Dropup\n\nTrigger dropdown menus above elements by adding `.dropup` to the parent element.\n\n<Example showMarkup={false} code={`<div class=\"btn-group dropup\">\n    <button type=\"button\" class=\"btn btn-secondary dropdown-toggle\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n      Dropup\n    </button>\n    <ul class=\"dropdown-menu\">\n      <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n      <li><hr class=\"dropdown-divider\"></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Separated link</a></li>\n    </ul>\n  </div>\n  <div class=\"btn-group dropup\">\n    <button type=\"button\" class=\"btn btn-secondary\">Split dropup</button>\n    <button type=\"button\" class=\"btn btn-secondary dropdown-toggle dropdown-toggle-split\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n      <span class=\"visually-hidden\">Toggle Dropdown</span>\n    </button>\n    <ul class=\"dropdown-menu\">\n      <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n      <li><hr class=\"dropdown-divider\"></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Separated link</a></li>\n    </ul>\n  </div>`} />\n\n```html\n<!-- Default dropup button -->\n<div class=\"btn-group dropup\">\n  <button type=\"button\" class=\"btn btn-secondary dropdown-toggle\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n    Dropup\n  </button>\n  <ul class=\"dropdown-menu\">\n    <!-- Dropdown menu links -->\n  </ul>\n</div>\n\n<!-- Split dropup button -->\n<div class=\"btn-group dropup\">\n  <button type=\"button\" class=\"btn btn-secondary\">\n    Split dropup\n  </button>\n  <button type=\"button\" class=\"btn btn-secondary dropdown-toggle dropdown-toggle-split\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n    <span class=\"visually-hidden\">Toggle Dropdown</span>\n  </button>\n  <ul class=\"dropdown-menu\">\n    <!-- Dropdown menu links -->\n  </ul>\n</div>\n```\n\n### Dropup centered\n\nMake the dropup menu centered above the toggle with `.dropup-center` on the parent element.\n\n<Example code={`<div class=\"dropup-center dropup\">\n    <button class=\"btn btn-secondary dropdown-toggle\" type=\"button\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n      Centered dropup\n    </button>\n    <ul class=\"dropdown-menu\">\n      <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Action two</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Action three</a></li>\n    </ul>\n  </div>`} />\n\n### Dropend\n\nTrigger dropdown menus at the right of the elements by adding `.dropend` to the parent element.\n\n<Example showMarkup={false} code={`<div class=\"btn-group dropend\">\n    <button type=\"button\" class=\"btn btn-secondary dropdown-toggle\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n      Dropend\n    </button>\n    <ul class=\"dropdown-menu\">\n      <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n      <li><hr class=\"dropdown-divider\"></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Separated link</a></li>\n    </ul>\n  </div>\n  <div class=\"btn-group dropend\">\n    <button type=\"button\" class=\"btn btn-secondary\">Split dropend</button>\n    <button type=\"button\" class=\"btn btn-secondary dropdown-toggle dropdown-toggle-split\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n      <span class=\"visually-hidden\">Toggle Dropend</span>\n    </button>\n    <ul class=\"dropdown-menu\">\n      <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n      <li><hr class=\"dropdown-divider\"></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Separated link</a></li>\n    </ul>\n  </div>`} />\n\n```html\n<!-- Default dropend button -->\n<div class=\"btn-group dropend\">\n  <button type=\"button\" class=\"btn btn-secondary dropdown-toggle\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n    Dropend\n  </button>\n  <ul class=\"dropdown-menu\">\n    <!-- Dropdown menu links -->\n  </ul>\n</div>\n\n<!-- Split dropend button -->\n<div class=\"btn-group dropend\">\n  <button type=\"button\" class=\"btn btn-secondary\">\n    Split dropend\n  </button>\n  <button type=\"button\" class=\"btn btn-secondary dropdown-toggle dropdown-toggle-split\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n    <span class=\"visually-hidden\">Toggle Dropend</span>\n  </button>\n  <ul class=\"dropdown-menu\">\n    <!-- Dropdown menu links -->\n  </ul>\n</div>\n```\n\n### Dropstart\n\nTrigger dropdown menus at the left of the elements by adding `.dropstart` to the parent element.\n\n<Example showMarkup={false} code={`<div class=\"btn-group dropstart\">\n    <button type=\"button\" class=\"btn btn-secondary dropdown-toggle\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n      Dropstart\n    </button>\n    <ul class=\"dropdown-menu\">\n      <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n      <li><hr class=\"dropdown-divider\"></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Separated link</a></li>\n    </ul>\n  </div>\n  <div class=\"btn-group dropstart\">\n    <button type=\"button\" class=\"btn btn-secondary dropdown-toggle dropdown-toggle-split\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n      <span class=\"visually-hidden\">Toggle Dropstart</span>\n    </button>\n    <ul class=\"dropdown-menu\">\n      <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n      <li><hr class=\"dropdown-divider\"></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Separated link</a></li>\n    </ul>\n    <button type=\"button\" class=\"btn btn-secondary\">Split dropstart</button>\n  </div>`} />\n\n```html\n<!-- Default dropstart button -->\n<div class=\"btn-group dropstart\">\n  <button type=\"button\" class=\"btn btn-secondary dropdown-toggle\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n    Dropstart\n  </button>\n  <ul class=\"dropdown-menu\">\n    <!-- Dropdown menu links -->\n  </ul>\n</div>\n\n<!-- Split dropstart button -->\n<div class=\"btn-group dropstart\">\n  <button type=\"button\" class=\"btn btn-secondary dropdown-toggle dropdown-toggle-split\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n    <span class=\"visually-hidden\">Toggle Dropstart</span>\n  </button>\n  <ul class=\"dropdown-menu\">\n    <!-- Dropdown menu links -->\n  </ul>\n  <button type=\"button\" class=\"btn btn-secondary\">\n    Split dropstart\n  </button>\n</div>\n```\n\n## Menu items\n\nYou can use `<a>` or `<button>` elements as dropdown items.\n\n<Example code={`<div class=\"dropdown\">\n    <button class=\"btn btn-secondary dropdown-toggle\" type=\"button\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n      Dropdown\n    </button>\n    <ul class=\"dropdown-menu\">\n      <li><button class=\"dropdown-item\" type=\"button\">Action</button></li>\n      <li><button class=\"dropdown-item\" type=\"button\">Another action</button></li>\n      <li><button class=\"dropdown-item\" type=\"button\">Something else here</button></li>\n    </ul>\n  </div>`} />\n\nYou can also create non-interactive dropdown items with `.dropdown-item-text`. Feel free to style further with custom CSS or text utilities.\n\n<Example code={`<ul class=\"dropdown-menu\">\n    <li><span class=\"dropdown-item-text\">Dropdown item text</span></li>\n    <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n    <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n    <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n  </ul>`} />\n\n### Active\n\nAdd `.active` to items in the dropdown to **style them as active**. To convey the active state to assistive technologies, use the `aria-current` attribute — using the `page` value for the current page, or `true` for the current item in a set.\n\n<Example code={`<ul class=\"dropdown-menu\">\n    <li><a class=\"dropdown-item\" href=\"#\">Regular link</a></li>\n    <li><a class=\"dropdown-item active\" href=\"#\" aria-current=\"true\">Active link</a></li>\n    <li><a class=\"dropdown-item\" href=\"#\">Another link</a></li>\n  </ul>`} />\n\n### Disabled\n\nAdd `.disabled` to items in the dropdown to **style them as disabled**.\n\n<Example code={`<ul class=\"dropdown-menu\">\n    <li><a class=\"dropdown-item\" href=\"#\">Regular link</a></li>\n    <li><a class=\"dropdown-item disabled\" aria-disabled=\"true\">Disabled link</a></li>\n    <li><a class=\"dropdown-item\" href=\"#\">Another link</a></li>\n  </ul>`} />\n\n## Menu alignment\n\nBy default, a dropdown menu is automatically positioned 100% from the top and along the left side of its parent. You can change this with the directional `.drop*` classes, but you can also control them with additional modifier classes.\n\nAdd `.dropdown-menu-end` to a `.dropdown-menu` to right align the dropdown menu. Directions are mirrored when using Bootstrap in RTL, meaning `.dropdown-menu-end` will appear on the left side.\n\n<Callout>\n**Heads up!** Dropdowns are positioned thanks to Popper except when they are contained in a navbar.\n</Callout>\n\n<Example code={`<div class=\"btn-group\">\n    <button type=\"button\" class=\"btn btn-secondary dropdown-toggle\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n      Right-aligned menu example\n    </button>\n    <ul class=\"dropdown-menu dropdown-menu-end\">\n      <li><button class=\"dropdown-item\" type=\"button\">Action</button></li>\n      <li><button class=\"dropdown-item\" type=\"button\">Another action</button></li>\n      <li><button class=\"dropdown-item\" type=\"button\">Something else here</button></li>\n    </ul>\n  </div>`} />\n\n### Responsive alignment\n\nIf you want to use responsive alignment, disable dynamic positioning by adding the `data-bs-display=\"static\"` attribute and use the responsive variation classes.\n\nTo align **right** the dropdown menu with the given breakpoint or larger, add `.dropdown-menu{-sm|-md|-lg|-xl|-xxl}-end`.\n\n<Example code={`<div class=\"btn-group\">\n    <button type=\"button\" class=\"btn btn-secondary dropdown-toggle\" data-bs-toggle=\"dropdown\" data-bs-display=\"static\" aria-expanded=\"false\">\n      Left-aligned but right aligned when large screen\n    </button>\n    <ul class=\"dropdown-menu dropdown-menu-lg-end\">\n      <li><button class=\"dropdown-item\" type=\"button\">Action</button></li>\n      <li><button class=\"dropdown-item\" type=\"button\">Another action</button></li>\n      <li><button class=\"dropdown-item\" type=\"button\">Something else here</button></li>\n    </ul>\n  </div>`} />\n\nTo align **left** the dropdown menu with the given breakpoint or larger, add `.dropdown-menu-end` and `.dropdown-menu{-sm|-md|-lg|-xl|-xxl}-start`.\n\n<Example code={`<div class=\"btn-group\">\n    <button type=\"button\" class=\"btn btn-secondary dropdown-toggle\" data-bs-toggle=\"dropdown\" data-bs-display=\"static\" aria-expanded=\"false\">\n      Right-aligned but left aligned when large screen\n    </button>\n    <ul class=\"dropdown-menu dropdown-menu-end dropdown-menu-lg-start\">\n      <li><button class=\"dropdown-item\" type=\"button\">Action</button></li>\n      <li><button class=\"dropdown-item\" type=\"button\">Another action</button></li>\n      <li><button class=\"dropdown-item\" type=\"button\">Something else here</button></li>\n    </ul>\n  </div>`} />\n\nNote that you don’t need to add a `data-bs-display=\"static\"` attribute to dropdown buttons in navbars, since Popper isn’t used in navbars.\n\n### Alignment options\n\nTaking most of the options shown above, here’s a small kitchen sink demo of various dropdown alignment options in one place.\n\n<Example code={`<div class=\"btn-group\">\n    <button class=\"btn btn-secondary dropdown-toggle\" type=\"button\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n      Dropdown\n    </button>\n    <ul class=\"dropdown-menu\">\n      <li><a class=\"dropdown-item\" href=\"#\">Menu item</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Menu item</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Menu item</a></li>\n    </ul>\n  </div>\n\n  <div class=\"btn-group\">\n    <button type=\"button\" class=\"btn btn-secondary dropdown-toggle\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n      Right-aligned menu\n    </button>\n    <ul class=\"dropdown-menu dropdown-menu-end\">\n      <li><a class=\"dropdown-item\" href=\"#\">Menu item</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Menu item</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Menu item</a></li>\n    </ul>\n  </div>\n\n  <div class=\"btn-group\">\n    <button type=\"button\" class=\"btn btn-secondary dropdown-toggle\" data-bs-toggle=\"dropdown\" data-bs-display=\"static\" aria-expanded=\"false\">\n      Left-aligned, right-aligned lg\n    </button>\n    <ul class=\"dropdown-menu dropdown-menu-lg-end\">\n      <li><a class=\"dropdown-item\" href=\"#\">Menu item</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Menu item</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Menu item</a></li>\n    </ul>\n  </div>\n\n  <div class=\"btn-group\">\n    <button type=\"button\" class=\"btn btn-secondary dropdown-toggle\" data-bs-toggle=\"dropdown\" data-bs-display=\"static\" aria-expanded=\"false\">\n      Right-aligned, left-aligned lg\n    </button>\n    <ul class=\"dropdown-menu dropdown-menu-end dropdown-menu-lg-start\">\n      <li><a class=\"dropdown-item\" href=\"#\">Menu item</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Menu item</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Menu item</a></li>\n    </ul>\n  </div>\n\n  <div class=\"btn-group dropstart\">\n    <button type=\"button\" class=\"btn btn-secondary dropdown-toggle\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n      Dropstart\n    </button>\n    <ul class=\"dropdown-menu\">\n      <li><a class=\"dropdown-item\" href=\"#\">Menu item</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Menu item</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Menu item</a></li>\n    </ul>\n  </div>\n\n  <div class=\"btn-group dropend\">\n    <button type=\"button\" class=\"btn btn-secondary dropdown-toggle\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n      Dropend\n    </button>\n    <ul class=\"dropdown-menu\">\n      <li><a class=\"dropdown-item\" href=\"#\">Menu item</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Menu item</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Menu item</a></li>\n    </ul>\n  </div>\n\n  <div class=\"btn-group dropup\">\n    <button type=\"button\" class=\"btn btn-secondary dropdown-toggle\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n      Dropup\n    </button>\n    <ul class=\"dropdown-menu\">\n      <li><a class=\"dropdown-item\" href=\"#\">Menu item</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Menu item</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Menu item</a></li>\n    </ul>\n  </div>`} />\n\n## Menu content\n\n### Headers\n\nAdd a header to label sections of actions in any dropdown menu.\n\n<Example code={`<ul class=\"dropdown-menu\">\n    <li><h6 class=\"dropdown-header\">Dropdown header</h6></li>\n    <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n    <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n  </ul>`} />\n\n### Dividers\n\nSeparate groups of related menu items with a divider.\n\n<Example code={`<ul class=\"dropdown-menu\">\n    <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n    <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n    <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n    <li><hr class=\"dropdown-divider\"></li>\n    <li><a class=\"dropdown-item\" href=\"#\">Separated link</a></li>\n  </ul>`} />\n\n### Text\n\nPlace any freeform text within a dropdown menu with text and use [spacing utilities]([[docsref:/utilities/spacing]]). Note that you’ll likely need additional sizing styles to constrain the menu width.\n\n<Example code={`<div class=\"dropdown-menu p-4 text-body-secondary\" style=\"max-width: 200px;\">\n    <p>\n      Some example text that’s free-flowing within the dropdown menu.\n    </p>\n    <p class=\"mb-0\">\n      And this is more example text.\n    </p>\n  </div>`} />\n\n### Forms\n\nPut a form within a dropdown menu, or make it into a dropdown menu, and use [margin or padding utilities]([[docsref:/utilities/spacing]]) to give it the negative space you require.\n\n<Example code={`<div class=\"dropdown-menu\">\n    <form class=\"px-4 py-3\">\n      <div class=\"mb-3\">\n        <label for=\"exampleDropdownFormEmail1\" class=\"form-label\">Email address</label>\n        <input type=\"email\" class=\"form-control\" id=\"exampleDropdownFormEmail1\" placeholder=\"email@example.com\">\n      </div>\n      <div class=\"mb-3\">\n        <label for=\"exampleDropdownFormPassword1\" class=\"form-label\">Password</label>\n        <input type=\"password\" class=\"form-control\" id=\"exampleDropdownFormPassword1\" placeholder=\"Password\">\n      </div>\n      <div class=\"mb-3\">\n        <div class=\"form-check\">\n          <input type=\"checkbox\" class=\"form-check-input\" id=\"dropdownCheck\">\n          <label class=\"form-check-label\" for=\"dropdownCheck\">\n            Remember me\n          </label>\n        </div>\n      </div>\n      <button type=\"submit\" class=\"btn btn-primary\">Sign in</button>\n    </form>\n    <div class=\"dropdown-divider\"></div>\n    <a class=\"dropdown-item\" href=\"#\">New around here? Sign up</a>\n    <a class=\"dropdown-item\" href=\"#\">Forgot password?</a>\n  </div>`} />\n\n<Example code={`<div class=\"dropdown\">\n    <button type=\"button\" class=\"btn btn-primary dropdown-toggle\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" data-bs-auto-close=\"outside\">\n      Dropdown form\n    </button>\n    <form class=\"dropdown-menu p-4\">\n      <div class=\"mb-3\">\n        <label for=\"exampleDropdownFormEmail2\" class=\"form-label\">Email address</label>\n        <input type=\"email\" class=\"form-control\" id=\"exampleDropdownFormEmail2\" placeholder=\"email@example.com\">\n      </div>\n      <div class=\"mb-3\">\n        <label for=\"exampleDropdownFormPassword2\" class=\"form-label\">Password</label>\n        <input type=\"password\" class=\"form-control\" id=\"exampleDropdownFormPassword2\" placeholder=\"Password\">\n      </div>\n      <div class=\"mb-3\">\n        <div class=\"form-check\">\n          <input type=\"checkbox\" class=\"form-check-input\" id=\"dropdownCheck2\">\n          <label class=\"form-check-label\" for=\"dropdownCheck2\">\n            Remember me\n          </label>\n        </div>\n      </div>\n      <button type=\"submit\" class=\"btn btn-primary\">Sign in</button>\n    </form>\n  </div>`} />\n\n## Dropdown options\n\nUse `data-bs-offset` or `data-bs-reference` to change the location of the dropdown.\n\n<Example code={`<div class=\"d-flex\">\n    <div class=\"dropdown me-1\">\n      <button type=\"button\" class=\"btn btn-secondary dropdown-toggle\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" data-bs-offset=\"10,20\">\n        Offset\n      </button>\n      <ul class=\"dropdown-menu\">\n        <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n        <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n        <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n      </ul>\n    </div>\n    <div class=\"btn-group\">\n      <button type=\"button\" class=\"btn btn-secondary\">Reference</button>\n      <button type=\"button\" class=\"btn btn-secondary dropdown-toggle dropdown-toggle-split\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" data-bs-reference=\"parent\">\n        <span class=\"visually-hidden\">Toggle Dropdown</span>\n      </button>\n      <ul class=\"dropdown-menu\">\n        <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n        <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n        <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n        <li><hr class=\"dropdown-divider\"></li>\n        <li><a class=\"dropdown-item\" href=\"#\">Separated link</a></li>\n      </ul>\n    </div>\n  </div>`} />\n\n### Auto close behavior\n\nBy default, the dropdown menu is closed when clicking inside or outside the dropdown menu. You can use the `autoClose` option to change this behavior of the dropdown.\n\n<Example code={`<div class=\"btn-group\">\n    <button class=\"btn btn-secondary dropdown-toggle\" type=\"button\" data-bs-toggle=\"dropdown\" data-bs-auto-close=\"true\" aria-expanded=\"false\">\n      Default dropdown\n    </button>\n    <ul class=\"dropdown-menu\">\n      <li><a class=\"dropdown-item\" href=\"#\">Menu item</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Menu item</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Menu item</a></li>\n    </ul>\n  </div>\n\n  <div class=\"btn-group\">\n    <button class=\"btn btn-secondary dropdown-toggle\" type=\"button\" data-bs-toggle=\"dropdown\" data-bs-auto-close=\"inside\" aria-expanded=\"false\">\n      Clickable inside\n    </button>\n    <ul class=\"dropdown-menu\">\n      <li><a class=\"dropdown-item\" href=\"#\">Menu item</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Menu item</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Menu item</a></li>\n    </ul>\n  </div>\n\n  <div class=\"btn-group\">\n    <button class=\"btn btn-secondary dropdown-toggle\" type=\"button\" data-bs-toggle=\"dropdown\" data-bs-auto-close=\"outside\" aria-expanded=\"false\">\n      Clickable outside\n    </button>\n    <ul class=\"dropdown-menu\">\n      <li><a class=\"dropdown-item\" href=\"#\">Menu item</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Menu item</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Menu item</a></li>\n    </ul>\n  </div>\n\n  <div class=\"btn-group\">\n    <button class=\"btn btn-secondary dropdown-toggle\" type=\"button\" data-bs-toggle=\"dropdown\" data-bs-auto-close=\"false\" aria-expanded=\"false\">\n      Manual close\n    </button>\n    <ul class=\"dropdown-menu\">\n      <li><a class=\"dropdown-item\" href=\"#\">Menu item</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Menu item</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Menu item</a></li>\n    </ul>\n  </div>`} />\n\n## CSS\n\n### Variables\n\n<AddedIn version=\"5.2.0\" />\n\nAs part of Bootstrap’s evolving CSS variables approach, dropdowns now use local CSS variables on `.dropdown-menu` for enhanced real-time customization. Values for the CSS variables are set via Sass, so Sass customization is still supported, too.\n\n<ScssDocs name=\"dropdown-css-vars\" file=\"scss/_dropdown.scss\" />\n\n<Callout>\nDropdown items include at least one variable that is not set on `.dropdown`. This allows you to provide a new value while Bootstrap defaults to a fallback value.\n\n- `--bs-dropdown-item-border-radius`\n</Callout>\n\nCustomization through CSS variables can be seen on the `.dropdown-menu-dark` class where we override specific values without adding duplicate CSS selectors.\n\n<ScssDocs name=\"dropdown-dark-css-vars\" file=\"scss/_dropdown.scss\" />\n\n### Sass variables\n\nVariables for all dropdowns:\n\n<ScssDocs name=\"dropdown-variables\" file=\"scss/_variables.scss\" />\n\nVariables for the [dark dropdown](#dark-dropdowns):\n\n<ScssDocs name=\"dropdown-dark-variables\" file=\"scss/_variables.scss\" />\n\nVariables for the CSS-based carets that indicate a dropdown’s interactivity:\n\n<ScssDocs name=\"caret-variables\" file=\"scss/_variables.scss\" />\n\n### Sass mixins\n\nMixins are used to generate the CSS-based carets and can be found in `scss/mixins/_caret.scss`.\n\n<ScssDocs name=\"caret-mixins\" file=\"scss/mixins/_caret.scss\" />\n\n## Usage\n\nVia data attributes or JavaScript, the dropdown plugin toggles hidden content (dropdown menus) by toggling the `.show` class on the parent `.dropdown-menu`. The `data-bs-toggle=\"dropdown\"` attribute is relied on for closing dropdown menus at an application level, so it’s a good idea to always use it.\n\n<Callout>\nOn touch-enabled devices, opening a dropdown adds empty `mouseover` handlers to the immediate children of the `<body>` element. This admittedly ugly hack is necessary to work around a [quirk in iOs’ event delegation](https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html), which would otherwise prevent a tap anywhere outside of the dropdown from triggering the code that closes the dropdown. Once the dropdown is closed, these additional empty `mouseover` handlers are removed.\n</Callout>\n\n### Via data attributes\n\nAdd `data-bs-toggle=\"dropdown\"` to a link or button to toggle a dropdown.\n\n```html\n<div class=\"dropdown\">\n  <button type=\"button\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n    Dropdown trigger\n  </button>\n  <ul class=\"dropdown-menu\">\n    ...\n  </ul>\n</div>\n```\n\n### Via JavaScript\n\n<Callout type=\"warning\">\nDropdowns must have `data-bs-toggle=\"dropdown\"` on their trigger element, regardless of whether you call your dropdown via JavaScript or use the data-api.\n</Callout>\n\nCall the dropdowns via JavaScript:\n\n```js\nconst dropdownElementList = document.querySelectorAll('.dropdown-toggle')\nconst dropdownList = [...dropdownElementList].map(dropdownToggleEl => new bootstrap.Dropdown(dropdownToggleEl))\n```\n\n### Options\n\n<JsDataAttributes />\n\n<BsTable>\n| Name | Type | Default | Description |\n| --- | --- | --- | --- |\n| `autoClose` | boolean, string | `true` | Configure the auto close behavior of the dropdown: <ul class=\"my-2\"><li>`true` - the dropdown will be closed by clicking outside or inside the dropdown menu.</li><li>`false` - the dropdown will be closed by clicking the toggle button and manually calling `hide` or `toggle` method. (Also will not be closed by pressing <kbd>Esc</kbd> key)</li><li>`'inside'` - the dropdown will be closed (only) by clicking inside the dropdown menu.</li> <li>`'outside'` - the dropdown will be closed (only) by clicking outside the dropdown menu.</li></ul> Note: the dropdown can always be closed with the <kbd>Esc</kbd> key. |\n| `boundary` | string, element | `'clippingParents'` | Overflow constraint boundary of the dropdown menu (applies only to Popper’s preventOverflow modifier). By default it’s `clippingParents` and can accept an HTMLElement reference (via JavaScript only). For more information refer to Popper’s [detectOverflow docs](https://popper.js.org/docs/v2/utils/detect-overflow/#boundary). |\n| `display` | string | `'dynamic'` | By default, we use Popper for dynamic positioning. Disable this with `static`. |\n| `offset` | array, string, function | `[0, 2]` | Offset of the dropdown relative to its target. You can pass a string in data attributes with comma separated values like: `data-bs-offset=\"10,20\"`. When a function is used to determine the offset, it is called with an object containing the popper placement, the reference, and popper rects as its first argument. The triggering element DOM node is passed as the second argument. The function must return an array with two numbers: [skidding](https://popper.js.org/docs/v2/modifiers/offset/#skidding-1), [distance](https://popper.js.org/docs/v2/modifiers/offset/#distance-1). For more information refer to Popper’s [offset docs](https://popper.js.org/docs/v2/modifiers/offset/#options). |\n| `popperConfig` | null, object, function | `null` | To change Bootstrap’s default Popper config, see [Popper’s configuration](https://popper.js.org/docs/v2/constructors/#options). When a function is used to create the Popper configuration, it’s called with an object that contains the Bootstrap’s default Popper configuration. It helps you use and merge the default with your own configuration. The function must return a configuration object for Popper. |\n| `reference` | string, element, object | `'toggle'` | Reference element of the dropdown menu. Accepts the values of `'toggle'`, `'parent'`, an HTMLElement reference or an object providing `getBoundingClientRect`. For more information refer to Popper’s [constructor docs](https://popper.js.org/docs/v2/constructors/#createpopper) and [virtual element docs](https://popper.js.org/docs/v2/virtual-elements/). |\n</BsTable>\n\n#### Using function with `popperConfig`\n\n```js\nconst dropdown = new bootstrap.Dropdown(element, {\n  popperConfig(defaultBsPopperConfig) {\n    // const newPopperConfig = {...}\n    // use defaultBsPopperConfig if needed...\n    // return newPopperConfig\n  }\n})\n```\n\n### Methods\n\n<BsTable>\n| Method | Description |\n| --- | --- |\n| `dispose` | Destroys an element’s dropdown. (Removes stored data on the DOM element) |\n| `getInstance` | Static method which allows you to get the dropdown instance associated to a DOM element, you can use it like this: `bootstrap.Dropdown.getInstance(element)`. |\n| `getOrCreateInstance` | Static method which returns a dropdown instance associated to a DOM element or create a new one in case it wasn’t initialized. You can use it like this: `bootstrap.Dropdown.getOrCreateInstance(element)`. |\n| `hide` | Hides the dropdown menu of a given navbar or tabbed navigation. |\n| `show` | Shows the dropdown menu of a given navbar or tabbed navigation. |\n| `toggle` | Toggles the dropdown menu of a given navbar or tabbed navigation. |\n| `update` | Updates the position of an element’s dropdown. |\n</BsTable>\n\n### Events\n\nAll dropdown events are fired at the toggling element and then bubbled up. So you can also add event listeners on the `.dropdown-menu`’s parent element. `hide.bs.dropdown` and `hidden.bs.dropdown` events have a `clickEvent` property (only when the original Event type is `click`) that contains an Event Object for the click event.\n\n<BsTable>\n| Event type | Description |\n| --- | --- |\n| `hide.bs.dropdown` | Fires immediately when the `hide` instance method has been called. |\n| `hidden.bs.dropdown` | Fired when the dropdown has finished being hidden from the user and CSS transitions have completed. |\n| `show.bs.dropdown` | Fires immediately when the `show` instance method is called. |\n| `shown.bs.dropdown` | Fired when the dropdown has been made visible to the user and CSS transitions have completed. |\n</BsTable>\n\n```js\nconst myDropdown = document.getElementById('myDropdown')\nmyDropdown.addEventListener('show.bs.dropdown', event => {\n  // do something...\n})\n```\n"
  },
  {
    "path": "site/src/content/docs/components/list-group.mdx",
    "content": "---\ntitle: List group\ndescription: List groups are a flexible and powerful component for displaying a series of content. Modify and extend them to support just about any content within.\ntoc: true\n---\n\nimport { getData } from '@libs/data'\n\n## Basic example\n\nThe most basic list group is an unordered list with list items and the proper classes. Build upon it with the options that follow, or with your own CSS as needed.\n\n<Example code={`<ul class=\"list-group\">\n    <li class=\"list-group-item\">An item</li>\n    <li class=\"list-group-item\">A second item</li>\n    <li class=\"list-group-item\">A third item</li>\n    <li class=\"list-group-item\">A fourth item</li>\n    <li class=\"list-group-item\">And a fifth one</li>\n  </ul>`} />\n\n## Active items\n\nAdd `.active` to a `.list-group-item` to indicate the current active selection.\n\n<Example code={`<ul class=\"list-group\">\n    <li class=\"list-group-item active\" aria-current=\"true\">An active item</li>\n    <li class=\"list-group-item\">A second item</li>\n    <li class=\"list-group-item\">A third item</li>\n    <li class=\"list-group-item\">A fourth item</li>\n    <li class=\"list-group-item\">And a fifth one</li>\n  </ul>`} />\n\n## Links and buttons\n\nUse `<a>`s or `<button>`s to create _actionable_ list group items with hover, disabled, and active states by adding `.list-group-item-action`. We separate these pseudo-classes to ensure list groups made of non-interactive elements (like `<li>`s or `<div>`s) don’t provide a click or tap affordance.\n\nMake `.list-group-item-action` instances _appear_ disabled by adding `.disabled`, and `aria-disabled=\"true\"` to inform assistive technologies that the element is disabled. You may require additional JavaScript to fully disable links and buttons.\n\nBe sure to **not use the standard `.btn` classes here**.\n\n<Example code={`<div class=\"list-group\">\n    <a href=\"#\" class=\"list-group-item list-group-item-action active\" aria-current=\"true\">\n      The current link item\n    </a>\n    <a href=\"#\" class=\"list-group-item list-group-item-action\">A second link item</a>\n    <a href=\"#\" class=\"list-group-item list-group-item-action\">A third link item</a>\n    <a href=\"#\" class=\"list-group-item list-group-item-action\">A fourth link item</a>\n    <a href=\"#\" class=\"list-group-item list-group-item-action disabled\" aria-disabled=\"true\">A disabled link item</a>\n  </div>`} />\n\nWith `<button>`s, you can also make use of the `disabled` attribute instead of the `.disabled` class. Sadly, `<a>`s don’t support the disabled attribute.\n\n<Example code={`<div class=\"list-group\">\n    <button type=\"button\" class=\"list-group-item list-group-item-action active\" aria-current=\"true\">\n      The current button\n    </button>\n    <button type=\"button\" class=\"list-group-item list-group-item-action\">A second button item</button>\n    <button type=\"button\" class=\"list-group-item list-group-item-action\">A third button item</button>\n    <button type=\"button\" class=\"list-group-item list-group-item-action\">A fourth button item</button>\n    <button type=\"button\" class=\"list-group-item list-group-item-action\" disabled>A disabled button item</button>\n  </div>`} />\n\n## Flush\n\nAdd `.list-group-flush` to remove some borders and rounded corners to render list group items edge-to-edge in a parent container (e.g., cards).\n\n<Example code={`<ul class=\"list-group list-group-flush\">\n    <li class=\"list-group-item\">An item</li>\n    <li class=\"list-group-item\">A second item</li>\n    <li class=\"list-group-item\">A third item</li>\n    <li class=\"list-group-item\">A fourth item</li>\n    <li class=\"list-group-item\">And a fifth one</li>\n  </ul>`} />\n\n## Numbered\n\nAdd the `.list-group-numbered` modifier class (and optionally use an `<ol>` element) to opt into numbered list group items. Numbers are generated via CSS (as opposed to a `<ol>`s default browser styling) for better placement inside list group items and to allow for better customization.\n\nNumbers are generated by `counter-reset` on the `<ol>`, and then styled and placed with a `::before` pseudo-element on the `<li>` with `counter-increment` and `content`.\n\n<Example code={`<ol class=\"list-group list-group-numbered\">\n    <li class=\"list-group-item\">A list item</li>\n    <li class=\"list-group-item\">A list item</li>\n    <li class=\"list-group-item\">A list item</li>\n  </ol>`} />\n\nThese work great with custom content as well.\n\n<Example code={`<ol class=\"list-group list-group-numbered\">\n    <li class=\"list-group-item d-flex justify-content-between align-items-start\">\n      <div class=\"ms-2 me-auto\">\n        <div class=\"fw-bold\">Subheading</div>\n        Content for list item\n      </div>\n      <span class=\"badge text-bg-primary rounded-pill\">14</span>\n    </li>\n    <li class=\"list-group-item d-flex justify-content-between align-items-start\">\n      <div class=\"ms-2 me-auto\">\n        <div class=\"fw-bold\">Subheading</div>\n        Content for list item\n      </div>\n      <span class=\"badge text-bg-primary rounded-pill\">14</span>\n    </li>\n    <li class=\"list-group-item d-flex justify-content-between align-items-start\">\n      <div class=\"ms-2 me-auto\">\n        <div class=\"fw-bold\">Subheading</div>\n        Content for list item\n      </div>\n      <span class=\"badge text-bg-primary rounded-pill\">14</span>\n    </li>\n  </ol>`} />\n\n## Horizontal\n\nAdd `.list-group-horizontal` to change the layout of list group items from vertical to horizontal across all breakpoints. Alternatively, choose a responsive variant `.list-group-horizontal-{sm|md|lg|xl|xxl}` to make a list group horizontal starting at that breakpoint’s `min-width`. Currently **horizontal list groups cannot be combined with flush list groups.**\n\n**ProTip:** Want equal-width list group items when horizontal? Add `.flex-fill` to each list group item.\n\n<Example code={getData('breakpoints').map((breakpoint) => `<ul class=\"list-group list-group-horizontal${breakpoint.abbr}\">\n    <li class=\"list-group-item\">An item</li>\n    <li class=\"list-group-item\">A second item</li>\n    <li class=\"list-group-item\">A third item</li>\n  </ul>`)} />\n\n## Variants\n\n<Callout>\n**Heads up!** As of v5.3.0, the `list-group-item-variant()` Sass mixin is deprecated. List group item variants now have their CSS variables overridden in [a Sass loop](#sass-loops).\n</Callout>\n\nUse contextual classes to style list items with a stateful background and color.\n\n<Example code={[\n    `<ul class=\"list-group\">\n    <li class=\"list-group-item\">A simple default list group item</li>\n    `,\n    ...getData('theme-colors').map((themeColor) => `  <li class=\"list-group-item list-group-item-${themeColor.name}\">A simple ${themeColor.name} list group item</li>`),\n    `</ul>`\n  ]} />\n\n### For links and buttons\n\nContextual classes also work with `.list-group-item-action` for `<a>` and `<button>` elements. Note the addition of the hover styles here not present in the previous example. Also supported is the `.active` state; apply it to indicate an active selection on a contextual list group item.\n\n<Example code={[\n    `<div class=\"list-group\">\n    <a href=\"#\" class=\"list-group-item list-group-item-action\">A simple default list group item</a>\n    `,\n    ...getData('theme-colors').map((themeColor) => `  <a href=\"#\" class=\"list-group-item list-group-item-action list-group-item-${themeColor.name}\">A simple ${themeColor.name} list group item</a>`),\n    `</div>`\n  ]} />\n\n<Callout name=\"warning-color-assistive-technologies\" />\n\n## With badges\n\nAdd badges to any list group item to show unread counts, activity, and more with the help of some [utilities]([[docsref:/utilities/flex]]).\n\n<Example code={`<ul class=\"list-group\">\n    <li class=\"list-group-item d-flex justify-content-between align-items-center\">\n      A list item\n      <span class=\"badge text-bg-primary rounded-pill\">14</span>\n    </li>\n    <li class=\"list-group-item d-flex justify-content-between align-items-center\">\n      A second list item\n      <span class=\"badge text-bg-primary rounded-pill\">2</span>\n    </li>\n    <li class=\"list-group-item d-flex justify-content-between align-items-center\">\n      A third list item\n      <span class=\"badge text-bg-primary rounded-pill\">1</span>\n    </li>\n  </ul>`} />\n\n## Custom content\n\nAdd nearly any HTML within, even for linked list groups like the one below, with the help of [flexbox utilities]([[docsref:/utilities/flex]]).\n\n<Example code={`<div class=\"list-group\">\n    <a href=\"#\" class=\"list-group-item list-group-item-action active\" aria-current=\"true\">\n      <div class=\"d-flex w-100 justify-content-between\">\n        <h5 class=\"mb-1\">List group item heading</h5>\n        <small>3 days ago</small>\n      </div>\n      <p class=\"mb-1\">Some placeholder content in a paragraph.</p>\n      <small>And some small print.</small>\n    </a>\n    <a href=\"#\" class=\"list-group-item list-group-item-action\">\n      <div class=\"d-flex w-100 justify-content-between\">\n        <h5 class=\"mb-1\">List group item heading</h5>\n        <small class=\"text-body-secondary\">3 days ago</small>\n      </div>\n      <p class=\"mb-1\">Some placeholder content in a paragraph.</p>\n      <small class=\"text-body-secondary\">And some muted small print.</small>\n    </a>\n    <a href=\"#\" class=\"list-group-item list-group-item-action\">\n      <div class=\"d-flex w-100 justify-content-between\">\n        <h5 class=\"mb-1\">List group item heading</h5>\n        <small class=\"text-body-secondary\">3 days ago</small>\n      </div>\n      <p class=\"mb-1\">Some placeholder content in a paragraph.</p>\n      <small class=\"text-body-secondary\">And some muted small print.</small>\n    </a>\n  </div>`} />\n\n## Checkboxes and radios\n\nPlace Bootstrap’s checkboxes and radios within list group items and customize as needed. You can use them without `<label>`s, but please remember to include an `aria-label` attribute and value for accessibility.\n\n<Example code={`<ul class=\"list-group\">\n    <li class=\"list-group-item\">\n      <input class=\"form-check-input me-1\" type=\"checkbox\" value=\"\" id=\"firstCheckbox\">\n      <label class=\"form-check-label\" for=\"firstCheckbox\">First checkbox</label>\n    </li>\n    <li class=\"list-group-item\">\n      <input class=\"form-check-input me-1\" type=\"checkbox\" value=\"\" id=\"secondCheckbox\">\n      <label class=\"form-check-label\" for=\"secondCheckbox\">Second checkbox</label>\n    </li>\n    <li class=\"list-group-item\">\n      <input class=\"form-check-input me-1\" type=\"checkbox\" value=\"\" id=\"thirdCheckbox\">\n      <label class=\"form-check-label\" for=\"thirdCheckbox\">Third checkbox</label>\n    </li>\n  </ul>`} />\n\n<Example code={`<ul class=\"list-group\">\n    <li class=\"list-group-item\">\n      <input class=\"form-check-input me-1\" type=\"radio\" name=\"listGroupRadio\" value=\"\" id=\"firstRadio\" checked>\n      <label class=\"form-check-label\" for=\"firstRadio\">First radio</label>\n    </li>\n    <li class=\"list-group-item\">\n      <input class=\"form-check-input me-1\" type=\"radio\" name=\"listGroupRadio\" value=\"\" id=\"secondRadio\">\n      <label class=\"form-check-label\" for=\"secondRadio\">Second radio</label>\n    </li>\n    <li class=\"list-group-item\">\n      <input class=\"form-check-input me-1\" type=\"radio\" name=\"listGroupRadio\" value=\"\" id=\"thirdRadio\">\n      <label class=\"form-check-label\" for=\"thirdRadio\">Third radio</label>\n    </li>\n  </ul>`} />\n\nYou can use `.stretched-link` on `<label>`s to make the whole list group item clickable.\n\n<Example code={`<ul class=\"list-group\">\n    <li class=\"list-group-item\">\n      <input class=\"form-check-input me-1\" type=\"checkbox\" value=\"\" id=\"firstCheckboxStretched\">\n      <label class=\"form-check-label stretched-link\" for=\"firstCheckboxStretched\">First checkbox</label>\n    </li>\n    <li class=\"list-group-item\">\n      <input class=\"form-check-input me-1\" type=\"checkbox\" value=\"\" id=\"secondCheckboxStretched\">\n      <label class=\"form-check-label stretched-link\" for=\"secondCheckboxStretched\">Second checkbox</label>\n    </li>\n    <li class=\"list-group-item\">\n      <input class=\"form-check-input me-1\" type=\"checkbox\" value=\"\" id=\"thirdCheckboxStretched\">\n      <label class=\"form-check-label stretched-link\" for=\"thirdCheckboxStretched\">Third checkbox</label>\n    </li>\n  </ul>`} />\n\n## CSS\n\n### Variables\n\n<AddedIn version=\"5.2.0\" />\n\nAs part of Bootstrap’s evolving CSS variables approach, list groups now use local CSS variables on `.list-group` for enhanced real-time customization. Values for the CSS variables are set via Sass, so Sass customization is still supported, too.\n\n<ScssDocs name=\"list-group-css-vars\" file=\"scss/_list-group.scss\" />\n\n### Sass variables\n\n<ScssDocs name=\"list-group-variables\" file=\"scss/_variables.scss\" />\n\n### Sass mixins\n\n<DeprecatedIn version=\"5.3.0\" />\n\n<ScssDocs name=\"list-group-mixin\" file=\"scss/mixins/_list-group.scss\" />\n\n### Sass loops\n\nLoop that generates the modifier classes with an overriding of CSS variables.\n\n<ScssDocs name=\"list-group-modifiers\" file=\"scss/_list-group.scss\" />\n\n## JavaScript behavior\n\nUse the tab JavaScript plugin—include it individually or through the compiled `bootstrap.js` file—to extend our list group to create tabbable panes of local content.\n\n<div class=\"bd-example\" role=\"tabpanel\">\n  <div class=\"row\">\n    <div class=\"col-4\">\n      <div class=\"list-group\" id=\"list-tab\" role=\"tablist\">\n        <a class=\"list-group-item list-group-item-action active\" id=\"list-home-list\" data-bs-toggle=\"tab\" href=\"#list-home\" role=\"tab\" aria-controls=\"list-home\">Home</a>\n        <a class=\"list-group-item list-group-item-action\" id=\"list-profile-list\" data-bs-toggle=\"tab\" href=\"#list-profile\" role=\"tab\" aria-controls=\"list-profile\">Profile</a>\n        <a class=\"list-group-item list-group-item-action\" id=\"list-messages-list\" data-bs-toggle=\"tab\" href=\"#list-messages\" role=\"tab\" aria-controls=\"list-messages\">Messages</a>\n        <a class=\"list-group-item list-group-item-action\" id=\"list-settings-list\" data-bs-toggle=\"tab\" href=\"#list-settings\" role=\"tab\" aria-controls=\"list-settings\">Settings</a>\n      </div>\n    </div>\n    <div class=\"col-8\">\n      <div class=\"tab-content\" id=\"nav-tabContent\">\n        <div class=\"tab-pane fade show active\" id=\"list-home\" role=\"tabpanel\" aria-labelledby=\"list-home-list\">\n          <p>Some placeholder content in a paragraph relating to \"Home\". And some more content, used here just to pad out and fill this tab panel. In production, you would obviously have more real content here. And not just text. It could be anything, really. Text, images, forms.</p>\n        </div>\n        <div class=\"tab-pane fade\" id=\"list-profile\" role=\"tabpanel\" aria-labelledby=\"list-profile-list\">\n          <p>Some placeholder content in a paragraph relating to \"Profile\". And some more content, used here just to pad out and fill this tab panel. In production, you would obviously have more real content here. And not just text. It could be anything, really. Text, images, forms.</p>\n        </div>\n        <div class=\"tab-pane fade\" id=\"list-messages\" role=\"tabpanel\" aria-labelledby=\"list-messages-list\">\n          <p>Some placeholder content in a paragraph relating to \"Messages\". And some more content, used here just to pad out and fill this tab panel. In production, you would obviously have more real content here. And not just text. It could be anything, really. Text, images, forms.</p>\n        </div>\n        <div class=\"tab-pane fade\" id=\"list-settings\" role=\"tabpanel\" aria-labelledby=\"list-settings-list\">\n          <p>Some placeholder content in a paragraph relating to \"Settings\". And some more content, used here just to pad out and fill this tab panel. In production, you would obviously have more real content here. And not just text. It could be anything, really. Text, images, forms.</p>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n\n```html\n<div class=\"row\">\n  <div class=\"col-4\">\n    <div class=\"list-group\" id=\"list-tab\" role=\"tablist\">\n      <a class=\"list-group-item list-group-item-action active\" id=\"list-home-list\" data-bs-toggle=\"list\" href=\"#list-home\" role=\"tab\" aria-controls=\"list-home\">Home</a>\n      <a class=\"list-group-item list-group-item-action\" id=\"list-profile-list\" data-bs-toggle=\"list\" href=\"#list-profile\" role=\"tab\" aria-controls=\"list-profile\">Profile</a>\n      <a class=\"list-group-item list-group-item-action\" id=\"list-messages-list\" data-bs-toggle=\"list\" href=\"#list-messages\" role=\"tab\" aria-controls=\"list-messages\">Messages</a>\n      <a class=\"list-group-item list-group-item-action\" id=\"list-settings-list\" data-bs-toggle=\"list\" href=\"#list-settings\" role=\"tab\" aria-controls=\"list-settings\">Settings</a>\n    </div>\n  </div>\n  <div class=\"col-8\">\n    <div class=\"tab-content\" id=\"nav-tabContent\">\n      <div class=\"tab-pane fade show active\" id=\"list-home\" role=\"tabpanel\" aria-labelledby=\"list-home-list\">...</div>\n      <div class=\"tab-pane fade\" id=\"list-profile\" role=\"tabpanel\" aria-labelledby=\"list-profile-list\">...</div>\n      <div class=\"tab-pane fade\" id=\"list-messages\" role=\"tabpanel\" aria-labelledby=\"list-messages-list\">...</div>\n      <div class=\"tab-pane fade\" id=\"list-settings\" role=\"tabpanel\" aria-labelledby=\"list-settings-list\">...</div>\n    </div>\n  </div>\n</div>\n```\n\n### Using data attributes\n\nYou can activate a list group navigation without writing any JavaScript by simply specifying `data-bs-toggle=\"list\"` or on an element. Use these data attributes on `.list-group-item`.\n\n```html\n<div role=\"tabpanel\">\n  <!-- List group -->\n  <div class=\"list-group\" id=\"myList\" role=\"tablist\">\n    <a class=\"list-group-item list-group-item-action active\" data-bs-toggle=\"list\" href=\"#home\" role=\"tab\">Home</a>\n    <a class=\"list-group-item list-group-item-action\" data-bs-toggle=\"list\" href=\"#profile\" role=\"tab\">Profile</a>\n    <a class=\"list-group-item list-group-item-action\" data-bs-toggle=\"list\" href=\"#messages\" role=\"tab\">Messages</a>\n    <a class=\"list-group-item list-group-item-action\" data-bs-toggle=\"list\" href=\"#settings\" role=\"tab\">Settings</a>\n  </div>\n\n  <!-- Tab panes -->\n  <div class=\"tab-content\">\n    <div class=\"tab-pane active\" id=\"home\" role=\"tabpanel\">...</div>\n    <div class=\"tab-pane\" id=\"profile\" role=\"tabpanel\">...</div>\n    <div class=\"tab-pane\" id=\"messages\" role=\"tabpanel\">...</div>\n    <div class=\"tab-pane\" id=\"settings\" role=\"tabpanel\">...</div>\n  </div>\n</div>\n```\n\n### Via JavaScript\n\nEnable tabbable list item via JavaScript (each list item needs to be activated individually):\n\n```js\nconst triggerTabList = document.querySelectorAll('#myTab a')\ntriggerTabList.forEach(triggerEl => {\n  const tabTrigger = new bootstrap.Tab(triggerEl)\n\n  triggerEl.addEventListener('click', event => {\n    event.preventDefault()\n    tabTrigger.show()\n  })\n})\n```\n\nYou can activate individual list item in several ways:\n\n```js\nconst triggerEl = document.querySelector('#myTab a[href=\"#profile\"]')\nbootstrap.Tab.getInstance(triggerEl).show() // Select tab by name\n\nconst triggerFirstTabEl = document.querySelector('#myTab li:first-child a')\nbootstrap.Tab.getInstance(triggerFirstTabEl).show() // Select first tab\n```\n\n### Fade effect\n\nTo make tabs panel fade in, add `.fade` to each `.tab-pane`. The first tab pane must also have `.show` to make the initial content visible.\n\n```html\n<div class=\"tab-content\">\n  <div class=\"tab-pane fade show active\" id=\"home\" role=\"tabpanel\">...</div>\n  <div class=\"tab-pane fade\" id=\"profile\" role=\"tabpanel\">...</div>\n  <div class=\"tab-pane fade\" id=\"messages\" role=\"tabpanel\">...</div>\n  <div class=\"tab-pane fade\" id=\"settings\" role=\"tabpanel\">...</div>\n</div>\n```\n\n### Methods\n\n<Callout name=\"danger-async-methods\" type=\"danger\" />\n\nActivates your content as a tab element.\n\nYou can create a tab instance with the constructor, for example:\n\n```js\nconst bsTab = new bootstrap.Tab('#myTab')\n```\n\n<BsTable>\n| Method | Description |\n| --- | --- |\n| `dispose` | Destroys an element’s tab. |\n| `getInstance` | Static method which allows you to get the tab instance associated with a DOM element, you can use it like this: `bootstrap.Tab.getInstance(element)`. |\n| `getOrCreateInstance` | Static method which returns a tab instance associated to a DOM element or create a new one in case it wasn’t initialized. You can use it like this: `bootstrap.Tab.getOrCreateInstance(element)`. |\n| `show` | Selects the given tab and shows its associated pane. Any other tab that was previously selected becomes unselected and its associated pane is hidden. **Returns to the caller before the tab pane has actually been shown** (i.e. before the `shown.bs.tab` event occurs). |\n</BsTable>\n\n### Events\n\nWhen showing a new tab, the events fire in the following order:\n\n1. `hide.bs.tab` (on the current active tab)\n2. `show.bs.tab` (on the to-be-shown tab)\n3. `hidden.bs.tab` (on the previous active tab, the same one as for the `hide.bs.tab` event)\n4. `shown.bs.tab` (on the newly-active just-shown tab, the same one as for the `show.bs.tab` event)\n\nIf no tab was already active, then the `hide.bs.tab` and `hidden.bs.tab` events will not be fired.\n\n<BsTable>\n| Event type | Description |\n| --- | --- |\n| `hide.bs.tab` | This event fires when a new tab is to be shown (and thus the previous active tab is to be hidden). Use `event.target` and `event.relatedTarget` to target the current active tab and the new soon-to-be-active tab, respectively. |\n| `hidden.bs.tab` | This event fires after a new tab is shown (and thus the previous active tab is hidden). Use `event.target` and `event.relatedTarget` to target the previous active tab and the new active tab, respectively. |\n| `show.bs.tab` | This event fires on tab show, but before the new tab has been shown. Use `event.target` and `event.relatedTarget` to target the active tab and the previous active tab (if available) respectively. |\n| `shown.bs.tab` | This event fires on tab show after a tab has been shown. Use `event.target` and `event.relatedTarget` to target the active tab and the previous active tab (if available) respectively. |\n</BsTable>\n\n```js\nconst tabElms = document.querySelectorAll('a[data-bs-toggle=\"list\"]')\ntabElms.forEach(tabElm => {\n  tabElm.addEventListener('shown.bs.tab', event => {\n    event.target // newly activated tab\n    event.relatedTarget // previous active tab\n  })\n})\n```\n"
  },
  {
    "path": "site/src/content/docs/components/modal.mdx",
    "content": "---\ntitle: Modal\ndescription: Use Bootstrap’s JavaScript modal plugin to add dialogs to your site for lightboxes, user notifications, or completely custom content.\ntoc: true\n---\n\n## How it works\n\nBefore getting started with Bootstrap’s modal component, be sure to read the following as our menu options have recently changed.\n\n- Modals are built with HTML, CSS, and JavaScript. They’re positioned over everything else in the document and remove scroll from the `<body>` so that modal content scrolls instead.\n- Clicking on the modal “backdrop” will automatically close the modal.\n- Bootstrap only supports one modal window at a time. Nested modals aren’t supported as we believe them to be poor user experiences.\n- Modals use `position: fixed`, which can sometimes be a bit particular about its rendering. Whenever possible, place your modal HTML in a top-level position to avoid potential interference from other elements. You’ll likely run into issues when nesting a `.modal` within another fixed element.\n- Once again, due to `position: fixed`, there are some caveats with using modals on mobile devices. [See our browser support docs]([[docsref:/getting-started/browsers-devices#modals-and-dropdowns-on-mobile]]) for details.\n- Due to how HTML5 defines its semantics, [the `autofocus` HTML attribute](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#attr-autofocus) has no effect in Bootstrap modals. To achieve the same effect, use some custom JavaScript:\n\n```js\nconst myModal = document.getElementById('myModal')\nconst myInput = document.getElementById('myInput')\n\nmyModal.addEventListener('shown.bs.modal', () => {\n  myInput.focus()\n})\n```\n\n<Callout name=\"info-prefersreducedmotion\" />\n\nKeep reading for demos and usage guidelines.\n\n## Examples\n\n### Modal components\n\nBelow is a _static_ modal example (meaning its `position` and `display` have been overridden). Included are the modal header, modal body (required for `padding`), and modal footer (optional). We ask that you include modal headers with dismiss actions whenever possible, or provide another explicit dismiss action.\n\n<div class=\"bd-example bg-body-tertiary\">\n  <div class=\"modal position-static d-block\" tabindex=\"-1\">\n    <div class=\"modal-dialog\">\n      <div class=\"modal-content\">\n        <div class=\"modal-header\">\n          <h5 class=\"modal-title\">Modal title</h5>\n          <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>\n        </div>\n        <div class=\"modal-body\">\n          <p>Modal body text goes here.</p>\n        </div>\n        <div class=\"modal-footer\">\n          <button type=\"button\" class=\"btn btn-secondary\" data-bs-dismiss=\"modal\">Close</button>\n          <button type=\"button\" class=\"btn btn-primary\">Save changes</button>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n\n```html\n<div class=\"modal\" tabindex=\"-1\">\n  <div class=\"modal-dialog\">\n    <div class=\"modal-content\">\n      <div class=\"modal-header\">\n        <h5 class=\"modal-title\">Modal title</h5>\n        <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>\n      </div>\n      <div class=\"modal-body\">\n        <p>Modal body text goes here.</p>\n      </div>\n      <div class=\"modal-footer\">\n        <button type=\"button\" class=\"btn btn-secondary\" data-bs-dismiss=\"modal\">Close</button>\n        <button type=\"button\" class=\"btn btn-primary\">Save changes</button>\n      </div>\n    </div>\n  </div>\n</div>\n```\n\n<Callout>\nIn the above static example, we use `<h5>`, to avoid issues with the heading hierarchy in the documentation page. Structurally, however, a modal dialog represents its own separate document/context, so the `.modal-title` should ideally be an `<h1>`. If necessary, you can use the [font size utilities]([[docsref:/utilities/text#font-size]]) to control the heading’s appearance. All the following live examples use this approach.\n</Callout>\n\n### Live demo\n\nToggle a working modal demo by clicking the button below. It will slide down and fade in from the top of the page.\n\n<div class=\"modal fade\" id=\"exampleModalLive\" tabindex=\"-1\" aria-labelledby=\"exampleModalLiveLabel\" aria-hidden=\"true\">\n  <div class=\"modal-dialog\">\n    <div class=\"modal-content\">\n      <div class=\"modal-header\">\n        <h1 class=\"modal-title fs-5\" id=\"exampleModalLiveLabel\">Modal title</h1>\n        <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>\n      </div>\n      <div class=\"modal-body\">\n        <p>Woo-hoo, you’re reading this text in a modal!</p>\n      </div>\n      <div class=\"modal-footer\">\n        <button type=\"button\" class=\"btn btn-secondary\" data-bs-dismiss=\"modal\">Close</button>\n        <button type=\"button\" class=\"btn btn-primary\">Save changes</button>\n      </div>\n    </div>\n  </div>\n</div>\n\n<Example showMarkup={false} code={`\n<button type=\"button\" class=\"btn btn-primary\" data-bs-toggle=\"modal\" data-bs-target=\"#exampleModalLive\">Launch demo modal</button>\n`} />\n\n```html\n<!-- Button trigger modal -->\n<button type=\"button\" class=\"btn btn-primary\" data-bs-toggle=\"modal\" data-bs-target=\"#exampleModal\">\n  Launch demo modal\n</button>\n\n<!-- Modal -->\n<div class=\"modal fade\" id=\"exampleModal\" tabindex=\"-1\" aria-labelledby=\"exampleModalLabel\" aria-hidden=\"true\">\n  <div class=\"modal-dialog\">\n    <div class=\"modal-content\">\n      <div class=\"modal-header\">\n        <h1 class=\"modal-title fs-5\" id=\"exampleModalLabel\">Modal title</h1>\n        <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>\n      </div>\n      <div class=\"modal-body\">\n        ...\n      </div>\n      <div class=\"modal-footer\">\n        <button type=\"button\" class=\"btn btn-secondary\" data-bs-dismiss=\"modal\">Close</button>\n        <button type=\"button\" class=\"btn btn-primary\">Save changes</button>\n      </div>\n    </div>\n  </div>\n</div>\n```\n\n### Static backdrop\n\nWhen backdrop is set to static, the modal will not close when clicking outside of it. Click the button below to try it.\n\n<div class=\"modal fade\" id=\"staticBackdropLive\" data-bs-backdrop=\"static\" data-bs-keyboard=\"false\" tabindex=\"-1\" aria-labelledby=\"staticBackdropLiveLabel\" aria-hidden=\"true\">\n  <div class=\"modal-dialog\">\n    <div class=\"modal-content\">\n      <div class=\"modal-header\">\n        <h1 class=\"modal-title fs-5\" id=\"staticBackdropLiveLabel\">Modal title</h1>\n        <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>\n      </div>\n      <div class=\"modal-body\">\n        <p>I will not close if you click outside of me. Don’t even try to press escape key.</p>\n      </div>\n      <div class=\"modal-footer\">\n        <button type=\"button\" class=\"btn btn-secondary\" data-bs-dismiss=\"modal\">Close</button>\n        <button type=\"button\" class=\"btn btn-primary\">Understood</button>\n      </div>\n    </div>\n  </div>\n</div>\n\n<Example showMarkup={false} code={`\n<button type=\"button\" class=\"btn btn-primary\" data-bs-toggle=\"modal\" data-bs-target=\"#staticBackdropLive\">Launch static backdrop modal</button>\n`} />\n\n```html\n<!-- Button trigger modal -->\n<button type=\"button\" class=\"btn btn-primary\" data-bs-toggle=\"modal\" data-bs-target=\"#staticBackdrop\">\n  Launch static backdrop modal\n</button>\n\n<!-- Modal -->\n<div class=\"modal fade\" id=\"staticBackdrop\" data-bs-backdrop=\"static\" data-bs-keyboard=\"false\" tabindex=\"-1\" aria-labelledby=\"staticBackdropLabel\" aria-hidden=\"true\">\n  <div class=\"modal-dialog\">\n    <div class=\"modal-content\">\n      <div class=\"modal-header\">\n        <h1 class=\"modal-title fs-5\" id=\"staticBackdropLabel\">Modal title</h1>\n        <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>\n      </div>\n      <div class=\"modal-body\">\n        ...\n      </div>\n      <div class=\"modal-footer\">\n        <button type=\"button\" class=\"btn btn-secondary\" data-bs-dismiss=\"modal\">Close</button>\n        <button type=\"button\" class=\"btn btn-primary\">Understood</button>\n      </div>\n    </div>\n  </div>\n</div>\n```\n\n### Scrolling long content\n\nWhen modals become too long for the user’s viewport or device, they scroll independent of the page itself. Try the demo below to see what we mean.\n\n<div class=\"modal fade\" id=\"exampleModalLong\" tabindex=\"-1\" aria-labelledby=\"exampleModalLongTitle\" aria-hidden=\"true\">\n  <div class=\"modal-dialog\">\n    <div class=\"modal-content\">\n      <div class=\"modal-header\">\n        <h1 class=\"modal-title fs-5\" id=\"exampleModalLongTitle\">Modal title</h1>\n        <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>\n      </div>\n      <div class=\"modal-body\" style=\"min-height: 100vh\">\n        <p>This is some placeholder content to show the scrolling behavior for modals. Instead of repeating the text in the modal, we use an inline style to set a minimum height, thereby extending the length of the overall modal and demonstrating the overflow scrolling. When content becomes longer than the height of the viewport, scrolling will move the modal as needed.</p>\n      </div>\n      <div class=\"modal-footer\">\n        <button type=\"button\" class=\"btn btn-secondary\" data-bs-dismiss=\"modal\">Close</button>\n        <button type=\"button\" class=\"btn btn-primary\">Save changes</button>\n      </div>\n    </div>\n  </div>\n</div>\n\n<Example showMarkup={false} code={`\n<button type=\"button\" class=\"btn btn-primary\" data-bs-toggle=\"modal\" data-bs-target=\"#exampleModalLong\">Launch demo modal</button>\n`} />\n\nYou can also create a scrollable modal that allows scrolling the modal body by adding `.modal-dialog-scrollable` to `.modal-dialog`.\n\n<div class=\"modal fade\" id=\"exampleModalScrollable\" tabindex=\"-1\" aria-labelledby=\"exampleModalScrollableTitle\" aria-hidden=\"true\">\n  <div class=\"modal-dialog modal-dialog-scrollable\">\n    <div class=\"modal-content\">\n      <div class=\"modal-header\">\n        <h1 class=\"modal-title fs-5\" id=\"exampleModalScrollableTitle\">Modal title</h1>\n        <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>\n      </div>\n      <div class=\"modal-body\">\n        <p>This is some placeholder content to show the scrolling behavior for modals. We use repeated line breaks to demonstrate how content can exceed minimum inner height, thereby showing inner scrolling. When content becomes longer than the predefined max-height of modal, content will be cropped and scrollable within the modal.</p>\n        <br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>\n        <p>This content should appear at the bottom after you scroll.</p>\n      </div>\n      <div class=\"modal-footer\">\n        <button type=\"button\" class=\"btn btn-secondary\" data-bs-dismiss=\"modal\">Close</button>\n        <button type=\"button\" class=\"btn btn-primary\">Save changes</button>\n      </div>\n    </div>\n  </div>\n</div>\n\n<Example showMarkup={false} code={`\n<button type=\"button\" class=\"btn btn-primary\" data-bs-toggle=\"modal\" data-bs-target=\"#exampleModalScrollable\">Launch demo modal</button>\n`} />\n\n```html\n<!-- Scrollable modal -->\n<div class=\"modal-dialog modal-dialog-scrollable\">\n  ...\n</div>\n```\n\n### Vertically centered\n\nAdd `.modal-dialog-centered` to `.modal-dialog` to vertically center the modal.\n\n<Example showMarkup={false} code={`<div class=\"modal fade\" id=\"exampleModalCenter\" tabindex=\"-1\" aria-labelledby=\"exampleModalCenterTitle\" aria-hidden=\"true\">\n    <div class=\"modal-dialog modal-dialog-centered\">\n      <div class=\"modal-content\">\n        <div class=\"modal-header\">\n          <h1 class=\"modal-title fs-5\" id=\"exampleModalCenterTitle\">Modal title</h1>\n          <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>\n        </div>\n        <div class=\"modal-body\">\n          <p>This is a vertically centered modal.</p>\n        </div>\n        <div class=\"modal-footer\">\n          <button type=\"button\" class=\"btn btn-secondary\" data-bs-dismiss=\"modal\">Close</button>\n          <button type=\"button\" class=\"btn btn-primary\">Save changes</button>\n        </div>\n      </div>\n    </div>\n  </div>\n\n  <div class=\"modal fade\" id=\"exampleModalCenteredScrollable\" tabindex=\"-1\" aria-labelledby=\"exampleModalCenteredScrollableTitle\" aria-hidden=\"true\">\n    <div class=\"modal-dialog modal-dialog-centered modal-dialog-scrollable\">\n      <div class=\"modal-content\">\n        <div class=\"modal-header\">\n          <h1 class=\"modal-title fs-5\" id=\"exampleModalCenteredScrollableTitle\">Modal title</h1>\n          <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>\n        </div>\n        <div class=\"modal-body\">\n          <p>This is some placeholder content to show a vertically centered modal. We’ve added some extra copy here to show how vertically centering the modal works when combined with scrollable modals. We also use some repeated line breaks to quickly extend the height of the content, thereby triggering the scrolling. When content becomes longer than the predefined max-height of modal, content will be cropped and scrollable within the modal.</p>\n          <br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>\n          <p>Just like that.</p>\n        </div>\n        <div class=\"modal-footer\">\n          <button type=\"button\" class=\"btn btn-secondary\" data-bs-dismiss=\"modal\">Close</button>\n          <button type=\"button\" class=\"btn btn-primary\">Save changes</button>\n        </div>\n      </div>\n    </div>\n  </div>\n\n  <button type=\"button\" class=\"btn btn-primary\" data-bs-toggle=\"modal\" data-bs-target=\"#exampleModalCenter\">Vertically centered modal</button>\n  <button type=\"button\" class=\"btn btn-primary\" data-bs-toggle=\"modal\" data-bs-target=\"#exampleModalCenteredScrollable\">Vertically centered scrollable modal</button>`} />\n\n```html\n<!-- Vertically centered modal -->\n<div class=\"modal-dialog modal-dialog-centered\">\n  ...\n</div>\n\n<!-- Vertically centered scrollable modal -->\n<div class=\"modal-dialog modal-dialog-centered modal-dialog-scrollable\">\n  ...\n</div>\n```\n\n### Tooltips and popovers\n\n[Tooltips]([[docsref:/components/tooltips]]) and [popovers]([[docsref:/components/popovers]]) can be placed within modals as needed. When modals are closed, any tooltips and popovers within are also automatically dismissed.\n\n<Example showMarkup={false} code={`<div class=\"modal fade\" id=\"exampleModalPopovers\" tabindex=\"-1\" aria-labelledby=\"exampleModalPopoversLabel\" aria-hidden=\"true\">\n    <div class=\"modal-dialog\">\n      <div class=\"modal-content\">\n        <div class=\"modal-header\">\n          <h1 class=\"modal-title fs-5\" id=\"exampleModalPopoversLabel\">Modal title</h1>\n          <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>\n        </div>\n        <div class=\"modal-body\">\n          <h2 class=\"fs-5\">Popover in a modal</h2>\n          <p>This <button class=\"btn btn-secondary\" data-bs-toggle=\"popover\" title=\"Popover title\" data-bs-content=\"Popover body content is set in this attribute.\" data-bs-container=\"#exampleModalPopovers\">button</button> triggers a popover on click.</p>\n          <hr>\n          <h2 class=\"fs-5\">Tooltips in a modal</h2>\n          <p><a href=\"#\" data-bs-toggle=\"tooltip\" title=\"Tooltip\" data-bs-container=\"#exampleModalPopovers\">This link</a> and <a href=\"#\" data-bs-toggle=\"tooltip\" title=\"Tooltip\" data-bs-container=\"#exampleModalPopovers\">that link</a> have tooltips on hover.</p>\n        </div>\n        <div class=\"modal-footer\">\n          <button type=\"button\" class=\"btn btn-secondary\" data-bs-dismiss=\"modal\">Close</button>\n          <button type=\"button\" class=\"btn btn-primary\">Save changes</button>\n        </div>\n      </div>\n    </div>\n  </div>\n\n  <button type=\"button\" class=\"btn btn-primary\" data-bs-toggle=\"modal\" data-bs-target=\"#exampleModalPopovers\">Launch demo modal</button>`} />\n\n```html\n<div class=\"modal-body\">\n  <h2 class=\"fs-5\">Popover in a modal</h2>\n  <p>This <button class=\"btn btn-secondary\" data-bs-toggle=\"popover\" title=\"Popover title\" data-bs-content=\"Popover body content is set in this attribute.\">button</button> triggers a popover on click.</p>\n  <hr>\n  <h2 class=\"fs-5\">Tooltips in a modal</h2>\n  <p><a href=\"#\" data-bs-toggle=\"tooltip\" title=\"Tooltip\">This link</a> and <a href=\"#\" data-bs-toggle=\"tooltip\" title=\"Tooltip\">that link</a> have tooltips on hover.</p>\n</div>\n```\n\n### Using the grid\n\nUtilize the Bootstrap grid system within a modal by nesting `.container-fluid` within the `.modal-body`. Then, use the normal grid system classes as you would anywhere else.\n\n<div class=\"modal fade\" id=\"gridSystemModal\" tabindex=\"-1\" aria-labelledby=\"gridModalLabel\" aria-hidden=\"true\">\n  <div class=\"modal-dialog\">\n    <div class=\"modal-content\">\n      <div class=\"modal-header\">\n        <h1 class=\"modal-title fs-5\" id=\"gridModalLabel\">Grids in modals</h1>\n        <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>\n      </div>\n      <div class=\"modal-body\">\n        <div class=\"container-fluid bd-example-row\">\n          <div class=\"row\">\n            <div class=\"col-md-4\">.col-md-4</div>\n            <div class=\"col-md-4 ms-auto\">.col-md-4 .ms-auto</div>\n          </div>\n          <div class=\"row\">\n            <div class=\"col-md-3 ms-auto\">.col-md-3 .ms-auto</div>\n            <div class=\"col-md-2 ms-auto\">.col-md-2 .ms-auto</div>\n          </div>\n          <div class=\"row\">\n            <div class=\"col-md-6 ms-auto\">.col-md-6 .ms-auto</div>\n          </div>\n          <div class=\"row\">\n            <div class=\"col-sm-9\">\n              Level 1: .col-sm-9\n              <div class=\"row\">\n                <div class=\"col-8 col-sm-6\">\n                  Level 2: .col-8 .col-sm-6\n                </div>\n                <div class=\"col-4 col-sm-6\">\n                  Level 2: .col-4 .col-sm-6\n                </div>\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n      <div class=\"modal-footer\">\n        <button type=\"button\" class=\"btn btn-secondary\" data-bs-dismiss=\"modal\">Close</button>\n        <button type=\"button\" class=\"btn btn-primary\">Save changes</button>\n      </div>\n    </div>\n  </div>\n</div>\n\n<Example showMarkup={false} code={`\n<button type=\"button\" class=\"btn btn-primary\" data-bs-toggle=\"modal\" data-bs-target=\"#gridSystemModal\">Launch demo modal</button>\n`} />\n\n```html\n<div class=\"modal-body\">\n  <div class=\"container-fluid\">\n    <div class=\"row\">\n      <div class=\"col-md-4\">.col-md-4</div>\n      <div class=\"col-md-4 ms-auto\">.col-md-4 .ms-auto</div>\n    </div>\n    <div class=\"row\">\n      <div class=\"col-md-3 ms-auto\">.col-md-3 .ms-auto</div>\n      <div class=\"col-md-2 ms-auto\">.col-md-2 .ms-auto</div>\n    </div>\n    <div class=\"row\">\n      <div class=\"col-md-6 ms-auto\">.col-md-6 .ms-auto</div>\n    </div>\n    <div class=\"row\">\n      <div class=\"col-sm-9\">\n        Level 1: .col-sm-9\n        <div class=\"row\">\n          <div class=\"col-8 col-sm-6\">\n            Level 2: .col-8 .col-sm-6\n          </div>\n          <div class=\"col-4 col-sm-6\">\n            Level 2: .col-4 .col-sm-6\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n```\n\n### Varying modal content\n\nHave a bunch of buttons that all trigger the same modal with slightly different contents? Use `event.relatedTarget` and [HTML `data-bs-*` attributes](https://developer.mozilla.org/en-US/docs/Learn/HTML/Howto/Use_data_attributes) to vary the contents of the modal depending on which button was clicked.\n\nBelow is a live demo followed by example HTML and JavaScript. For more information, [read the modal events docs](#events) for details on `relatedTarget`.\n\n<Example addStackblitzJs code={`<button type=\"button\" class=\"btn btn-primary\" data-bs-toggle=\"modal\" data-bs-target=\"#exampleModal\" data-bs-whatever=\"@mdo\">Open modal for @mdo</button>\n  <button type=\"button\" class=\"btn btn-primary\" data-bs-toggle=\"modal\" data-bs-target=\"#exampleModal\" data-bs-whatever=\"@fat\">Open modal for @fat</button>\n  <button type=\"button\" class=\"btn btn-primary\" data-bs-toggle=\"modal\" data-bs-target=\"#exampleModal\" data-bs-whatever=\"@getbootstrap\">Open modal for @getbootstrap</button>\n\n  <div class=\"modal fade\" id=\"exampleModal\" tabindex=\"-1\" aria-labelledby=\"exampleModalLabel\" aria-hidden=\"true\">\n    <div class=\"modal-dialog\">\n      <div class=\"modal-content\">\n        <div class=\"modal-header\">\n          <h1 class=\"modal-title fs-5\" id=\"exampleModalLabel\">New message</h1>\n          <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>\n        </div>\n        <div class=\"modal-body\">\n          <form>\n            <div class=\"mb-3\">\n              <label for=\"recipient-name\" class=\"col-form-label\">Recipient:</label>\n              <input type=\"text\" class=\"form-control\" id=\"recipient-name\">\n            </div>\n            <div class=\"mb-3\">\n              <label for=\"message-text\" class=\"col-form-label\">Message:</label>\n              <textarea class=\"form-control\" id=\"message-text\"></textarea>\n            </div>\n          </form>\n        </div>\n        <div class=\"modal-footer\">\n          <button type=\"button\" class=\"btn btn-secondary\" data-bs-dismiss=\"modal\">Close</button>\n          <button type=\"button\" class=\"btn btn-primary\">Send message</button>\n        </div>\n      </div>\n    </div>\n  </div>`} />\n\n<JsDocs name=\"varying-modal-content\" file=\"site/src/assets/partials/snippets.js\" />\n\n### Toggle between modals\n\nToggle between multiple modals with some clever placement of the `data-bs-target` and `data-bs-toggle` attributes. For example, you could toggle a password reset modal from within an already open sign in modal. **Please note multiple modals cannot be open at the same time**—this method simply toggles between two separate modals.\n\n<Example code={`<div class=\"modal fade\" id=\"exampleModalToggle\" aria-hidden=\"true\" aria-labelledby=\"exampleModalToggleLabel\" tabindex=\"-1\">\n    <div class=\"modal-dialog modal-dialog-centered\">\n      <div class=\"modal-content\">\n        <div class=\"modal-header\">\n          <h1 class=\"modal-title fs-5\" id=\"exampleModalToggleLabel\">Modal 1</h1>\n          <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>\n        </div>\n        <div class=\"modal-body\">\n          Show a second modal and hide this one with the button below.\n        </div>\n        <div class=\"modal-footer\">\n          <button class=\"btn btn-primary\" data-bs-target=\"#exampleModalToggle2\" data-bs-toggle=\"modal\">Open second modal</button>\n        </div>\n      </div>\n    </div>\n  </div>\n  <div class=\"modal fade\" id=\"exampleModalToggle2\" aria-hidden=\"true\" aria-labelledby=\"exampleModalToggleLabel2\" tabindex=\"-1\">\n    <div class=\"modal-dialog modal-dialog-centered\">\n      <div class=\"modal-content\">\n        <div class=\"modal-header\">\n          <h1 class=\"modal-title fs-5\" id=\"exampleModalToggleLabel2\">Modal 2</h1>\n          <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>\n        </div>\n        <div class=\"modal-body\">\n          Hide this modal and show the first with the button below.\n        </div>\n        <div class=\"modal-footer\">\n          <button class=\"btn btn-primary\" data-bs-target=\"#exampleModalToggle\" data-bs-toggle=\"modal\">Back to first</button>\n        </div>\n      </div>\n    </div>\n  </div>\n  <button class=\"btn btn-primary\" data-bs-target=\"#exampleModalToggle\" data-bs-toggle=\"modal\">Open first modal</button>`} />\n\n### Change animation\n\nThe `$modal-fade-transform` variable determines the transform state of `.modal-dialog` before the modal fade-in animation, the `$modal-show-transform` variable determines the transform of `.modal-dialog` at the end of the modal fade-in animation.\n\nIf you want for example a zoom-in animation, you can set `$modal-fade-transform: scale(.8)`.\n\n### Remove animation\n\nFor modals that simply appear rather than fade in to view, remove the `.fade` class from your modal markup.\n\n```html\n<div class=\"modal\" tabindex=\"-1\" aria-labelledby=\"...\" aria-hidden=\"true\">\n  ...\n</div>\n```\n\n### Dynamic heights\n\nIf the height of a modal changes while it is open, you should call `myModal.handleUpdate()` to readjust the modal’s position in case a scrollbar appears.\n\n### Accessibility\n\nBe sure to add `aria-labelledby=\"...\"`, referencing the modal title, to `.modal`. Additionally, you may give a description of your modal dialog with `aria-describedby` on `.modal`. Note that you don’t need to add `role=\"dialog\"` since we already add it via JavaScript.\n\n### Embedding YouTube videos\n\nEmbedding YouTube videos in modals requires additional JavaScript not in Bootstrap to automatically stop playback and more. [See this helpful Stack Overflow post](https://stackoverflow.com/questions/18622508/bootstrap-3-and-youtube-in-modal) for more information.\n\n## Optional sizes\n\nModals have three optional sizes, available via modifier classes to be placed on a `.modal-dialog`. These sizes kick in at certain breakpoints to avoid horizontal scrollbars on narrower viewports.\n\n<BsTable>\n| Size | Class | Modal max-width\n| --- | --- | --- |\n| Small | `.modal-sm` | `300px` |\n| Default | <span class=\"text-body-secondary\">None</span> | `500px` |\n| Large | `.modal-lg` | `800px` |\n| Extra large | `.modal-xl` | `1140px` |\n</BsTable>\n\nOur default modal without modifier class constitutes the “medium” size modal.\n\n<Example showMarkup={false} code={`<button type=\"button\" class=\"btn btn-primary\" data-bs-toggle=\"modal\" data-bs-target=\"#exampleModalXl\">Extra large modal</button>\n  <button type=\"button\" class=\"btn btn-primary\" data-bs-toggle=\"modal\" data-bs-target=\"#exampleModalLg\">Large modal</button>\n  <button type=\"button\" class=\"btn btn-primary\" data-bs-toggle=\"modal\" data-bs-target=\"#exampleModalSm\">Small modal</button>`} />\n\n```html\n<div class=\"modal-dialog modal-xl\">...</div>\n<div class=\"modal-dialog modal-lg\">...</div>\n<div class=\"modal-dialog modal-sm\">...</div>\n```\n\n<div class=\"modal fade\" id=\"exampleModalXl\" tabindex=\"-1\" aria-labelledby=\"exampleModalXlLabel\" aria-hidden=\"true\">\n  <div class=\"modal-dialog modal-xl\">\n    <div class=\"modal-content\">\n      <div class=\"modal-header\">\n        <h1 class=\"modal-title fs-4\" id=\"exampleModalXlLabel\">Extra large modal</h1>\n        <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>\n      </div>\n      <div class=\"modal-body\">\n        ...\n      </div>\n    </div>\n  </div>\n</div>\n\n<div class=\"modal fade\" id=\"exampleModalLg\" tabindex=\"-1\" aria-labelledby=\"exampleModalLgLabel\" aria-hidden=\"true\">\n  <div class=\"modal-dialog modal-lg\">\n    <div class=\"modal-content\">\n      <div class=\"modal-header\">\n        <h1 class=\"modal-title fs-4\" id=\"exampleModalLgLabel\">Large modal</h1>\n        <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>\n      </div>\n      <div class=\"modal-body\">\n        ...\n      </div>\n    </div>\n  </div>\n</div>\n\n<div class=\"modal fade\" id=\"exampleModalSm\" tabindex=\"-1\" aria-labelledby=\"exampleModalSmLabel\" aria-hidden=\"true\">\n  <div class=\"modal-dialog modal-sm\">\n    <div class=\"modal-content\">\n      <div class=\"modal-header\">\n        <h1 class=\"modal-title fs-4\" id=\"exampleModalSmLabel\">Small modal</h1>\n        <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>\n      </div>\n      <div class=\"modal-body\">\n        ...\n      </div>\n    </div>\n  </div>\n</div>\n\n## Fullscreen Modal\n\nAnother override is the option to pop up a modal that covers the user viewport, available via modifier classes that are placed on a `.modal-dialog`.\n\n<BsTable>\n| Class | Availability |\n| --- | --- |\n| `.modal-fullscreen` | Always |\n| `.modal-fullscreen-sm-down` | `576px` |\n| `.modal-fullscreen-md-down` | `768px` |\n| `.modal-fullscreen-lg-down` | `992px` |\n| `.modal-fullscreen-xl-down` | `1200px` |\n| `.modal-fullscreen-xxl-down` | `1400px` |\n</BsTable>\n\n<Example showMarkup={false} code={`<button type=\"button\" class=\"btn btn-primary\" data-bs-toggle=\"modal\" data-bs-target=\"#exampleModalFullscreen\">Full screen</button>\n  <button type=\"button\" class=\"btn btn-primary\" data-bs-toggle=\"modal\" data-bs-target=\"#exampleModalFullscreenSm\">Full screen below sm</button>\n  <button type=\"button\" class=\"btn btn-primary\" data-bs-toggle=\"modal\" data-bs-target=\"#exampleModalFullscreenMd\">Full screen below md</button>\n  <button type=\"button\" class=\"btn btn-primary\" data-bs-toggle=\"modal\" data-bs-target=\"#exampleModalFullscreenLg\">Full screen below lg</button>\n  <button type=\"button\" class=\"btn btn-primary\" data-bs-toggle=\"modal\" data-bs-target=\"#exampleModalFullscreenXl\">Full screen below xl</button>\n  <button type=\"button\" class=\"btn btn-primary\" data-bs-toggle=\"modal\" data-bs-target=\"#exampleModalFullscreenXxl\">Full screen below xxl</button>`} />\n\n```html\n<!-- Full screen modal -->\n<div class=\"modal-dialog modal-fullscreen-sm-down\">\n  ...\n</div>\n```\n\n<div class=\"modal fade\" id=\"exampleModalFullscreen\" tabindex=\"-1\" aria-labelledby=\"exampleModalFullscreenLabel\" aria-hidden=\"true\">\n  <div class=\"modal-dialog modal-fullscreen\">\n    <div class=\"modal-content\">\n      <div class=\"modal-header\">\n        <h1 class=\"modal-title fs-4\" id=\"exampleModalFullscreenLabel\">Full screen modal</h1>\n        <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>\n      </div>\n      <div class=\"modal-body\">\n        ...\n      </div>\n      <div class=\"modal-footer\">\n        <button type=\"button\" class=\"btn btn-secondary\" data-bs-dismiss=\"modal\">Close</button>\n      </div>\n    </div>\n  </div>\n</div>\n\n<div class=\"modal fade\" id=\"exampleModalFullscreenSm\" tabindex=\"-1\" aria-labelledby=\"exampleModalFullscreenSmLabel\" aria-hidden=\"true\">\n  <div class=\"modal-dialog modal-fullscreen-sm-down\">\n    <div class=\"modal-content\">\n      <div class=\"modal-header\">\n        <h1 class=\"modal-title fs-4\" id=\"exampleModalFullscreenSmLabel\">Full screen below sm</h1>\n        <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>\n      </div>\n      <div class=\"modal-body\">\n        ...\n      </div>\n      <div class=\"modal-footer\">\n        <button type=\"button\" class=\"btn btn-secondary\" data-bs-dismiss=\"modal\">Close</button>\n      </div>\n    </div>\n  </div>\n</div>\n\n<div class=\"modal fade\" id=\"exampleModalFullscreenMd\" tabindex=\"-1\" aria-labelledby=\"exampleModalFullscreenMdLabel\" aria-hidden=\"true\">\n  <div class=\"modal-dialog modal-fullscreen-md-down\">\n    <div class=\"modal-content\">\n      <div class=\"modal-header\">\n        <h1 class=\"modal-title fs-4\" id=\"exampleModalFullscreenMdLabel\">Full screen below md</h1>\n        <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>\n      </div>\n      <div class=\"modal-body\">\n        ...\n      </div>\n      <div class=\"modal-footer\">\n        <button type=\"button\" class=\"btn btn-secondary\" data-bs-dismiss=\"modal\">Close</button>\n      </div>\n    </div>\n  </div>\n</div>\n\n<div class=\"modal fade\" id=\"exampleModalFullscreenLg\" tabindex=\"-1\" aria-labelledby=\"exampleModalFullscreenLgLabel\" aria-hidden=\"true\">\n  <div class=\"modal-dialog modal-fullscreen-lg-down\">\n    <div class=\"modal-content\">\n      <div class=\"modal-header\">\n        <h1 class=\"modal-title fs-4\" id=\"exampleModalFullscreenLgLabel\">Full screen below lg</h1>\n        <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>\n      </div>\n      <div class=\"modal-body\">\n        ...\n      </div>\n      <div class=\"modal-footer\">\n        <button type=\"button\" class=\"btn btn-secondary\" data-bs-dismiss=\"modal\">Close</button>\n      </div>\n    </div>\n  </div>\n</div>\n\n<div class=\"modal fade\" id=\"exampleModalFullscreenXl\" tabindex=\"-1\" aria-labelledby=\"exampleModalFullscreenXlLabel\" aria-hidden=\"true\">\n  <div class=\"modal-dialog modal-fullscreen-xl-down\">\n    <div class=\"modal-content\">\n      <div class=\"modal-header\">\n        <h1 class=\"modal-title fs-4\" id=\"exampleModalFullscreenXlLabel\">Full screen below xl</h1>\n        <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>\n      </div>\n      <div class=\"modal-body\">\n        ...\n      </div>\n      <div class=\"modal-footer\">\n        <button type=\"button\" class=\"btn btn-secondary\" data-bs-dismiss=\"modal\">Close</button>\n      </div>\n    </div>\n  </div>\n</div>\n\n<div class=\"modal fade\" id=\"exampleModalFullscreenXxl\" tabindex=\"-1\" aria-labelledby=\"exampleModalFullscreenXxlLabel\" aria-hidden=\"true\">\n  <div class=\"modal-dialog modal-fullscreen-xxl-down\">\n    <div class=\"modal-content\">\n      <div class=\"modal-header\">\n        <h1 class=\"modal-title fs-4\" id=\"exampleModalFullscreenXxlLabel\">Full screen below xxl</h1>\n        <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>\n      </div>\n      <div class=\"modal-body\">\n        ...\n      </div>\n      <div class=\"modal-footer\">\n        <button type=\"button\" class=\"btn btn-secondary\" data-bs-dismiss=\"modal\">Close</button>\n      </div>\n    </div>\n  </div>\n</div>\n\n## CSS\n\n### Variables\n\n<AddedIn version=\"5.2.0\" />\n\nAs part of Bootstrap’s evolving CSS variables approach, modals now use local CSS variables on `.modal` and `.modal-backdrop` for enhanced real-time customization. Values for the CSS variables are set via Sass, so Sass customization is still supported, too.\n\n<ScssDocs name=\"modal-css-vars\" file=\"scss/_modal.scss\" />\n\n<ScssDocs name=\"modal-backdrop-css-vars\" file=\"scss/_modal.scss\" />\n\n### Sass variables\n\n<ScssDocs name=\"modal-variables\" file=\"scss/_variables.scss\" />\n\n### Sass loops\n\n[Responsive fullscreen modals](#fullscreen-modal) are generated via the `$breakpoints` map and a loop in `scss/_modal.scss`.\n\n<ScssDocs name=\"modal-fullscreen-loop\" file=\"scss/_modal.scss\" />\n\n## Usage\n\nThe modal plugin toggles your hidden content on demand, via data attributes or JavaScript. It also overrides default scrolling behavior and generates a `.modal-backdrop` to provide a click area for dismissing shown modals when clicking outside the modal.\n\n### Via data attributes\n\n#### Toggle\n\nActivate a modal without writing JavaScript. Set `data-bs-toggle=\"modal\"` on a controller element, like a button, along with a `data-bs-target=\"#foo\"` or `href=\"#foo\"` to target a specific modal to toggle.\n\n```html\n<button type=\"button\" data-bs-toggle=\"modal\" data-bs-target=\"#myModal\">Launch modal</button>\n```\n\n#### Dismiss\n\n<JsDismiss name=\"modal\" />\n\n<Callout type=\"warning\">\nWhile both ways to dismiss a modal are supported, keep in mind that dismissing from outside a modal does not match the [ARIA Authoring Practices Guide dialog (modal) pattern](https://www.w3.org/WAI/ARIA/apg/patterns/dialogmodal/). Do this at your own risk.\n</Callout>\n\n### Via JavaScript\n\nCreate a modal with a single line of JavaScript:\n\n```js\nconst myModal = new bootstrap.Modal(document.getElementById('myModal'), options)\n// or\nconst myModalAlternative = new bootstrap.Modal('#myModal', options)\n```\n\n### Options\n\n<JsDataAttributes />\n\n<BsTable>\n| Name | Type | Default | Description |\n| --- | --- | --- | --- |\n| `backdrop` | boolean, `’static'` | `true` | Includes a modal-backdrop element. Alternatively, specify `static` for a backdrop which doesn’t close the modal when clicked. |\n| `focus` | boolean | `true` | Puts the focus on the modal when initialized. |\n| `keyboard` | boolean | `true` | Closes the modal when escape key is pressed. |\n</BsTable>\n\n### Methods\n\n<Callout name=\"danger-async-methods\" type=\"danger\" />\n\n#### Passing options\n\nActivates your content as a modal. Accepts an optional options `object`.\n\n```js\nconst myModal = new bootstrap.Modal('#myModal', {\n  keyboard: false\n})\n```\n\n<BsTable>\n| Method | Description |\n| --- | --- |\n| `dispose` | Destroys an element’s modal. (Removes stored data on the DOM element) |\n| `getInstance` | _Static_ method which allows you to get the modal instance associated with a DOM element. |\n| `getOrCreateInstance` | _Static_ method which allows you to get the modal instance associated with a DOM element, or create a new one in case it wasn’t initialized. |\n| `handleUpdate` | Manually readjust the modal’s position if the height of a modal changes while it is open (i.e. in case a scrollbar appears). |\n| `hide` | Manually hides a modal. **Returns to the caller before the modal has actually been hidden** (i.e. before the `hidden.bs.modal` event occurs). |\n| `show` | Manually opens a modal. **Returns to the caller before the modal has actually been shown** (i.e. before the `shown.bs.modal` event occurs). Also, you can pass a DOM element as an argument that can be received in the modal events (as the `relatedTarget` property). (i.e. `const modalToggle = document.getElementById('toggleMyModal'); myModal.show(modalToggle)`. |\n| `toggle` | Manually toggles a modal. **Returns to the caller before the modal has actually been shown or hidden** (i.e. before the `shown.bs.modal` or `hidden.bs.modal` event occurs). |\n</BsTable>\n\n### Events\n\nBootstrap’s modal class exposes a few events for hooking into modal functionality. All modal events are fired at the modal itself (i.e. at the `<div class=\"modal\">`).\n\n<BsTable>\n| Event | Description |\n| --- | --- |\n| `hide.bs.modal` | This event is fired immediately when the `hide` instance method has been called. Can be prevented by calling `event.preventDefault()`. See [JavaScript events documentation]([[docsref:/getting-started/javascript#events]]) for more details on event prevention. |\n| `hidden.bs.modal` | This event is fired when the modal has finished being hidden from the user (will wait for CSS transitions to complete). |\n| `hidePrevented.bs.modal` | This event is fired when the modal is shown, its backdrop is `static` and a click outside of the modal is performed. The event is also fired when the escape key is pressed and the `keyboard` option is set to `false`. |\n| `show.bs.modal` | This event fires immediately when the `show` instance method is called. If caused by a click, the clicked element is available as the `relatedTarget` property of the event. |\n| `shown.bs.modal` | This event is fired when the modal has been made visible to the user (will wait for CSS transitions to complete). If caused by a click, the clicked element is available as the `relatedTarget` property of the event. |\n</BsTable>\n\n```js\nconst myModalEl = document.getElementById('myModal')\nmyModalEl.addEventListener('hidden.bs.modal', event => {\n  // do something...\n})\n```\n"
  },
  {
    "path": "site/src/content/docs/components/navbar.mdx",
    "content": "---\ntitle: Navbar\ndescription: Documentation and examples for Bootstrap’s powerful, responsive navigation header, the navbar. Includes support for branding, navigation, and more, including support for our collapse plugin.\ntoc: true\n---\n\nimport { getConfig } from '@libs/config'\n\n## How it works\n\nHere’s what you need to know before getting started with the navbar:\n\n- Navbars require a wrapping `.navbar` with `.navbar-expand{-sm|-md|-lg|-xl|-xxl}` for responsive collapsing and [color scheme](#color-schemes) classes.\n- Navbars and their contents are fluid by default. Change the [container](#containers) to limit their horizontal width in different ways.\n- Use our [spacing]([[docsref:/utilities/spacing]]) and [flex]([[docsref:/utilities/flex]]) utility classes for controlling spacing and alignment within navbars.\n- Navbars are responsive by default, but you can easily modify them to change that. Responsive behavior depends on our Collapse JavaScript plugin.\n- Ensure accessibility by using a `<nav>` element or, if using a more generic element such as a `<div>`, add a `role=\"navigation\"` to every navbar to explicitly identify it as a landmark region for users of assistive technologies.\n- Indicate the current item by using `aria-current=\"page\"` for the current page or `aria-current=\"true\"` for the current item in a set.\n- **New in v5.2.0:** Navbars can be themed with CSS variables that are scoped to the `.navbar` base class. `.navbar-light` has been deprecated and `.navbar-dark` has been rewritten to override CSS variables instead of adding additional styles.\n\n<Callout name=\"info-prefersreducedmotion\" />\n\n## Supported content\n\nNavbars come with built-in support for a handful of sub-components. Choose from the following as needed:\n\n- `.navbar-brand` for your company, product, or project name.\n- `.navbar-nav` for a full-height and lightweight navigation (including support for dropdowns).\n- `.navbar-toggler` for use with our collapse plugin and other [navigation toggling](#responsive-behaviors) behaviors.\n- Flex and spacing utilities for any form controls and actions.\n- `.navbar-text` for adding vertically centered strings of text.\n- `.collapse.navbar-collapse` for grouping and hiding navbar contents by a parent breakpoint.\n- Add an optional `.navbar-nav-scroll` to set a `max-height` and [scroll expanded navbar content](#scrolling).\n\nHere’s an example of all the sub-components included in a responsive light-themed navbar that automatically collapses at the `lg` (large) breakpoint.\n\n<Example code={`<nav class=\"navbar navbar-expand-lg bg-body-tertiary\">\n    <div class=\"container-fluid\">\n      <a class=\"navbar-brand\" href=\"#\">Navbar</a>\n      <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbarSupportedContent\" aria-controls=\"navbarSupportedContent\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n        <span class=\"navbar-toggler-icon\"></span>\n      </button>\n      <div class=\"collapse navbar-collapse\" id=\"navbarSupportedContent\">\n        <ul class=\"navbar-nav me-auto mb-2 mb-lg-0\">\n          <li class=\"nav-item\">\n            <a class=\"nav-link active\" aria-current=\"page\" href=\"#\">Home</a>\n          </li>\n          <li class=\"nav-item\">\n            <a class=\"nav-link\" href=\"#\">Link</a>\n          </li>\n          <li class=\"nav-item dropdown\">\n            <a class=\"nav-link dropdown-toggle\" href=\"#\" role=\"button\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n              Dropdown\n            </a>\n            <ul class=\"dropdown-menu\">\n              <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n              <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n              <li><hr class=\"dropdown-divider\"></li>\n              <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n            </ul>\n          </li>\n          <li class=\"nav-item\">\n            <a class=\"nav-link disabled\" aria-disabled=\"true\">Disabled</a>\n          </li>\n        </ul>\n        <form class=\"d-flex\" role=\"search\">\n          <input class=\"form-control me-2\" type=\"search\" placeholder=\"Search\" aria-label=\"Search\"/>\n          <button class=\"btn btn-outline-success\" type=\"submit\">Search</button>\n        </form>\n      </div>\n    </div>\n  </nav>`} />\n\nThis example uses [background]([[docsref:/utilities/background]]) (`bg-body-tertiary`) and [spacing]([[docsref:/utilities/spacing]]) (`me-auto`, `mb-2`, `mb-lg-0`, `me-2`) utility classes.\n\n### Brand\n\nThe `.navbar-brand` can be applied to most elements, but an anchor works best, as some elements might require utility classes or custom styles.\n\n#### Text\n\nAdd your text within an element with the `.navbar-brand` class.\n\n<Example code={`<!-- As a link -->\n  <nav class=\"navbar bg-body-tertiary\">\n    <div class=\"container-fluid\">\n      <a class=\"navbar-brand\" href=\"#\">Navbar</a>\n    </div>\n  </nav>\n\n  <!-- As a heading -->\n  <nav class=\"navbar bg-body-tertiary\">\n    <div class=\"container-fluid\">\n      <span class=\"navbar-brand mb-0 h1\">Navbar</span>\n    </div>\n  </nav>`} />\n\n#### Image\n\nYou can replace the text within the `.navbar-brand` with an `<img>`.\n\n<Example code={`<nav class=\"navbar bg-body-tertiary\">\n    <div class=\"container\">\n      <a class=\"navbar-brand\" href=\"#\">\n        <img src=\"/docs/${getConfig().docs_version}/assets/brand/bootstrap-logo.svg\" alt=\"Bootstrap\" width=\"30\" height=\"24\">\n      </a>\n    </div>\n  </nav>`} />\n\n#### Image and text\n\nYou can also make use of some additional utilities to add an image and text at the same time. Note the addition of `.d-inline-block` and `.align-text-top` on the `<img>`.\n\n<Example code={`<nav class=\"navbar bg-body-tertiary\">\n    <div class=\"container-fluid\">\n      <a class=\"navbar-brand\" href=\"#\">\n        <img src=\"/docs/${getConfig().docs_version}/assets/brand/bootstrap-logo.svg\" alt=\"Logo\" width=\"30\" height=\"24\" class=\"d-inline-block align-text-top\">\n        Bootstrap\n      </a>\n    </div>\n  </nav>`} />\n\n### Nav\n\nNavbar navigation links build on our `.nav` options with their own modifier class and require the use of [toggler classes](#toggler) for proper responsive styling. **Navigation in navbars will also grow to occupy as much horizontal space as possible** to keep your navbar contents securely aligned.\n\nAdd the `.active` class on `.nav-link` to indicate the current page.\n\nPlease note that you should also add the `aria-current` attribute on the active `.nav-link`.\n\n<Example code={`<nav class=\"navbar navbar-expand-lg bg-body-tertiary\">\n    <div class=\"container-fluid\">\n      <a class=\"navbar-brand\" href=\"#\">Navbar</a>\n      <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbarNav\" aria-controls=\"navbarNav\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n        <span class=\"navbar-toggler-icon\"></span>\n      </button>\n      <div class=\"collapse navbar-collapse\" id=\"navbarNav\">\n        <ul class=\"navbar-nav\">\n          <li class=\"nav-item\">\n            <a class=\"nav-link active\" aria-current=\"page\" href=\"#\">Home</a>\n          </li>\n          <li class=\"nav-item\">\n            <a class=\"nav-link\" href=\"#\">Features</a>\n          </li>\n          <li class=\"nav-item\">\n            <a class=\"nav-link\" href=\"#\">Pricing</a>\n          </li>\n          <li class=\"nav-item\">\n            <a class=\"nav-link disabled\" aria-disabled=\"true\">Disabled</a>\n          </li>\n        </ul>\n      </div>\n    </div>\n  </nav>`} />\n\nAnd because we use classes for our navs, you can avoid the list-based approach entirely if you like.\n\n<Example code={`<nav class=\"navbar navbar-expand-lg bg-body-tertiary\">\n    <div class=\"container-fluid\">\n      <a class=\"navbar-brand\" href=\"#\">Navbar</a>\n      <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbarNavAltMarkup\" aria-controls=\"navbarNavAltMarkup\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n        <span class=\"navbar-toggler-icon\"></span>\n      </button>\n      <div class=\"collapse navbar-collapse\" id=\"navbarNavAltMarkup\">\n        <div class=\"navbar-nav\">\n          <a class=\"nav-link active\" aria-current=\"page\" href=\"#\">Home</a>\n          <a class=\"nav-link\" href=\"#\">Features</a>\n          <a class=\"nav-link\" href=\"#\">Pricing</a>\n          <a class=\"nav-link disabled\" aria-disabled=\"true\">Disabled</a>\n        </div>\n      </div>\n    </div>\n  </nav>`} />\n\nYou can also use dropdowns in your navbar. Dropdown menus require a wrapping element for positioning, so be sure to use separate and nested elements for `.nav-item` and `.nav-link` as shown below.\n\n<Example code={`<nav class=\"navbar navbar-expand-lg bg-body-tertiary\">\n    <div class=\"container-fluid\">\n      <a class=\"navbar-brand\" href=\"#\">Navbar</a>\n      <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbarNavDropdown\" aria-controls=\"navbarNavDropdown\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n        <span class=\"navbar-toggler-icon\"></span>\n      </button>\n      <div class=\"collapse navbar-collapse\" id=\"navbarNavDropdown\">\n        <ul class=\"navbar-nav\">\n          <li class=\"nav-item\">\n            <a class=\"nav-link active\" aria-current=\"page\" href=\"#\">Home</a>\n          </li>\n          <li class=\"nav-item\">\n            <a class=\"nav-link\" href=\"#\">Features</a>\n          </li>\n          <li class=\"nav-item\">\n            <a class=\"nav-link\" href=\"#\">Pricing</a>\n          </li>\n          <li class=\"nav-item dropdown\">\n            <a class=\"nav-link dropdown-toggle\" href=\"#\" role=\"button\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n              Dropdown link\n            </a>\n            <ul class=\"dropdown-menu\">\n              <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n              <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n              <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n            </ul>\n          </li>\n        </ul>\n      </div>\n    </div>\n  </nav>`} />\n\n### Forms\n\nPlace various form controls and components within a navbar:\n\n<Example code={`<nav class=\"navbar bg-body-tertiary\">\n    <div class=\"container-fluid\">\n      <form class=\"d-flex\" role=\"search\">\n        <input class=\"form-control me-2\" type=\"search\" placeholder=\"Search\" aria-label=\"Search\"/>\n        <button class=\"btn btn-outline-success\" type=\"submit\">Search</button>\n      </form>\n    </div>\n  </nav>`} />\n\nImmediate child elements of `.navbar` use flex layout and will default to `justify-content: space-between`. Use additional [flex utilities]([[docsref:/utilities/flex]]) as needed to adjust this behavior.\n\n<Example code={`<nav class=\"navbar bg-body-tertiary\">\n    <div class=\"container-fluid\">\n      <a class=\"navbar-brand\">Navbar</a>\n      <form class=\"d-flex\" role=\"search\">\n        <input class=\"form-control me-2\" type=\"search\" placeholder=\"Search\" aria-label=\"Search\"/>\n        <button class=\"btn btn-outline-success\" type=\"submit\">Search</button>\n      </form>\n    </div>\n  </nav>`} />\n\nInput groups work, too. If your navbar is an entire form, or mostly a form, you can use the `<form>` element as the container and save some HTML.\n\n<Example code={`<nav class=\"navbar bg-body-tertiary\">\n    <form class=\"container-fluid\">\n      <div class=\"input-group\">\n        <span class=\"input-group-text\" id=\"basic-addon1\">@</span>\n        <input type=\"text\" class=\"form-control\" placeholder=\"Username\" aria-label=\"Username\" aria-describedby=\"basic-addon1\"/>\n      </div>\n    </form>\n  </nav>`} />\n\nVarious buttons are supported as part of these navbar forms, too. This is also a great reminder that vertical alignment utilities can be used to align different sized elements.\n\n<Example code={`<nav class=\"navbar bg-body-tertiary\">\n    <form class=\"container-fluid justify-content-start\">\n      <button class=\"btn btn-outline-success me-2\" type=\"button\">Main button</button>\n      <button class=\"btn btn-sm btn-outline-secondary\" type=\"button\">Smaller button</button>\n    </form>\n  </nav>`} />\n\n### Text\n\nNavbars may contain bits of text with the help of `.navbar-text`. This class adjusts vertical alignment and horizontal spacing for strings of text.\n\n<Example code={`<nav class=\"navbar bg-body-tertiary\">\n    <div class=\"container-fluid\">\n      <span class=\"navbar-text\">\n        Navbar text with an inline element\n      </span>\n    </div>\n  </nav>`} />\n\nMix and match with other components and utilities as needed.\n\n<Example code={`<nav class=\"navbar navbar-expand-lg bg-body-tertiary\">\n    <div class=\"container-fluid\">\n      <a class=\"navbar-brand\" href=\"#\">Navbar w/ text</a>\n      <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbarText\" aria-controls=\"navbarText\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n        <span class=\"navbar-toggler-icon\"></span>\n      </button>\n      <div class=\"collapse navbar-collapse\" id=\"navbarText\">\n        <ul class=\"navbar-nav me-auto mb-2 mb-lg-0\">\n          <li class=\"nav-item\">\n            <a class=\"nav-link active\" aria-current=\"page\" href=\"#\">Home</a>\n          </li>\n          <li class=\"nav-item\">\n            <a class=\"nav-link\" href=\"#\">Features</a>\n          </li>\n          <li class=\"nav-item\">\n            <a class=\"nav-link\" href=\"#\">Pricing</a>\n          </li>\n        </ul>\n        <span class=\"navbar-text\">\n          Navbar text with an inline element\n        </span>\n      </div>\n    </div>\n  </nav>`} />\n\n## Color schemes\n\n<Callout type=\"warning\">\n**New dark navbars in v5.3.0 —** We’ve deprecated `.navbar-dark` in favor of the new `data-bs-theme=\"dark\"`. Add `data-bs-theme=\"dark\"` to the `.navbar` to enable a component-specific color mode. [Learn more about our color modes.]([[docsref:/customize/color-modes]])\n\n---\n\n**New in v5.2.0  —** Navbar theming is now powered by CSS variables and `.navbar-light` has been deprecated. CSS variables are applied to `.navbar`, defaulting to the “light” appearance, and can be overridden with `.navbar-dark`.\n</Callout>\n\nNavbar themes are easier than ever thanks to Bootstrap’s combination of Sass and CSS variables. The default is our “light navbar” for use with light background colors, but you can also apply `data-bs-theme=\"dark\"` to the `.navbar` parent for dark background colors. Then, customize with `.bg-*` and additional utilities.\n\n<Example showMarkup={false} code={`\n<nav class=\"navbar navbar-expand-lg bg-dark border-bottom border-body\" data-bs-theme=\"dark\">\n  <div class=\"container-fluid\">\n    <a class=\"navbar-brand\" href=\"#\">Navbar</a>\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbarColor01\" aria-controls=\"navbarColor01\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n    <div class=\"collapse navbar-collapse\" id=\"navbarColor01\">\n      <ul class=\"navbar-nav me-auto mb-2 mb-lg-0\">\n        <li class=\"nav-item\">\n          <a class=\"nav-link active\" aria-current=\"page\" href=\"#\">Home</a>\n        </li>\n        <li class=\"nav-item\">\n          <a class=\"nav-link\" href=\"#\">Features</a>\n        </li>\n        <li class=\"nav-item\">\n          <a class=\"nav-link\" href=\"#\">Pricing</a>\n        </li>\n        <li class=\"nav-item\">\n          <a class=\"nav-link\" href=\"#\">About</a>\n        </li>\n      </ul>\n      <form class=\"d-flex\" role=\"search\">\n        <input class=\"form-control me-2\" type=\"search\" placeholder=\"Search\" aria-label=\"Search\"/>\n        <button class=\"btn btn-outline-light\" type=\"submit\">Search</button>\n      </form>\n    </div>\n  </div>\n</nav>\n\n<nav class=\"navbar navbar-expand-lg bg-primary\" data-bs-theme=\"dark\">\n  <div class=\"container-fluid\">\n    <a class=\"navbar-brand\" href=\"#\">Navbar</a>\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbarColor02\" aria-controls=\"navbarColor02\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n    <div class=\"collapse navbar-collapse\" id=\"navbarColor02\">\n      <ul class=\"navbar-nav me-auto mb-2 mb-lg-0\">\n        <li class=\"nav-item\">\n          <a class=\"nav-link active\" aria-current=\"page\" href=\"#\">Home</a>\n        </li>\n        <li class=\"nav-item\">\n          <a class=\"nav-link\" href=\"#\">Features</a>\n        </li>\n        <li class=\"nav-item\">\n          <a class=\"nav-link\" href=\"#\">Pricing</a>\n        </li>\n        <li class=\"nav-item\">\n          <a class=\"nav-link\" href=\"#\">About</a>\n        </li>\n      </ul>\n      <form class=\"d-flex\" role=\"search\">\n        <input class=\"form-control me-2\" type=\"search\" placeholder=\"Search\" aria-label=\"Search\"/>\n        <button class=\"btn btn-outline-light\" type=\"submit\">Search</button>\n      </form>\n    </div>\n  </div>\n</nav>\n\n<nav class=\"navbar navbar-expand-lg\" style=\"background-color: #e3f2fd;\" data-bs-theme=\"light\">\n  <div class=\"container-fluid\">\n    <a class=\"navbar-brand\" href=\"#\">Navbar</a>\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbarColor03\" aria-controls=\"navbarColor03\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n    <div class=\"collapse navbar-collapse\" id=\"navbarColor03\">\n      <ul class=\"navbar-nav me-auto mb-2 mb-lg-0\">\n        <li class=\"nav-item\">\n          <a class=\"nav-link active\" aria-current=\"page\" href=\"#\">Home</a>\n        </li>\n        <li class=\"nav-item\">\n          <a class=\"nav-link\" href=\"#\">Features</a>\n        </li>\n        <li class=\"nav-item\">\n          <a class=\"nav-link\" href=\"#\">Pricing</a>\n        </li>\n        <li class=\"nav-item\">\n          <a class=\"nav-link\" href=\"#\">About</a>\n        </li>\n      </ul>\n      <form class=\"d-flex\" role=\"search\">\n        <input class=\"form-control me-2\" type=\"search\" placeholder=\"Search\" aria-label=\"Search\"/>\n        <button class=\"btn btn-outline-primary\" type=\"submit\">Search</button>\n      </form>\n    </div>\n  </div>\n</nav>\n`} />\n\n```html\n<nav class=\"navbar bg-dark border-bottom border-body\" data-bs-theme=\"dark\">\n  <!-- Navbar content -->\n</nav>\n\n<nav class=\"navbar bg-primary\" data-bs-theme=\"dark\">\n  <!-- Navbar content -->\n</nav>\n\n<nav class=\"navbar\" style=\"background-color: #e3f2fd;\" data-bs-theme=\"light\">\n  <!-- Navbar content -->\n</nav>\n```\n\n## Containers\n\nAlthough it’s not required, you can wrap a navbar in a `.container` to center it on a page–though note that an inner container is still required. Or you can add a container inside the `.navbar` to only center the contents of a [fixed or static top navbar](#placement).\n\n<Example code={`<div class=\"container\">\n    <nav class=\"navbar navbar-expand-lg bg-body-tertiary\">\n      <div class=\"container-fluid\">\n        <a class=\"navbar-brand\" href=\"#\">Navbar</a>\n      </div>\n    </nav>\n  </div>`} />\n\nUse any of the responsive containers to change how wide the content in your navbar is presented.\n\n<Example code={`<nav class=\"navbar navbar-expand-lg bg-body-tertiary\">\n    <div class=\"container-md\">\n      <a class=\"navbar-brand\" href=\"#\">Navbar</a>\n    </div>\n  </nav>`} />\n\n## Placement\n\nUse our [position utilities]([[docsref:/utilities/position]]) to place navbars in non-static positions. Choose from fixed to the top, fixed to the bottom, stickied to the top (scrolls with the page until it reaches the top, then stays there), or stickied to the bottom (scrolls with the page until it reaches the bottom, then stays there).\n\nFixed navbars use `position: fixed`, meaning they’re pulled from the normal flow of the DOM and may require custom CSS (e.g., `padding-top` on the `<body>`) to prevent overlap with other elements.\n\n<Example code={`<nav class=\"navbar bg-body-tertiary\">\n    <div class=\"container-fluid\">\n      <a class=\"navbar-brand\" href=\"#\">Default</a>\n    </div>\n  </nav>`} />\n\n<Example code={`<nav class=\"navbar fixed-top bg-body-tertiary\">\n    <div class=\"container-fluid\">\n      <a class=\"navbar-brand\" href=\"#\">Fixed top</a>\n    </div>\n  </nav>`} />\n\n<Example code={`<nav class=\"navbar fixed-bottom bg-body-tertiary\">\n    <div class=\"container-fluid\">\n      <a class=\"navbar-brand\" href=\"#\">Fixed bottom</a>\n    </div>\n  </nav>`} />\n\n<Example code={`<nav class=\"navbar sticky-top bg-body-tertiary\">\n    <div class=\"container-fluid\">\n      <a class=\"navbar-brand\" href=\"#\">Sticky top</a>\n    </div>\n  </nav>`} />\n\n<Example code={`<nav class=\"navbar sticky-bottom bg-body-tertiary\">\n    <div class=\"container-fluid\">\n      <a class=\"navbar-brand\" href=\"#\">Sticky bottom</a>\n    </div>\n  </nav>`} />\n\n## Scrolling\n\nAdd `.navbar-nav-scroll` to a `.navbar-nav` (or other navbar sub-component) to enable vertical scrolling within the toggleable contents of a collapsed navbar. By default, scrolling kicks in at `75vh` (or 75% of the viewport height), but you can override that with the local CSS custom property `--bs-navbar-height` or custom styles. At larger viewports when the navbar is expanded, content will appear as it does in a default navbar.\n\nPlease note that this behavior comes with a potential drawback of `overflow`—when setting `overflow-y: auto` (required to scroll the content here), `overflow-x` is the equivalent of `auto`, which will crop some horizontal content.\n\nHere’s an example navbar using `.navbar-nav-scroll` with `style=\"--bs-scroll-height: 100px;\"`, with some extra margin utilities for optimum spacing.\n\n<Example code={`<nav class=\"navbar navbar-expand-lg bg-body-tertiary\">\n    <div class=\"container-fluid\">\n      <a class=\"navbar-brand\" href=\"#\">Navbar scroll</a>\n      <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbarScroll\" aria-controls=\"navbarScroll\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n        <span class=\"navbar-toggler-icon\"></span>\n      </button>\n      <div class=\"collapse navbar-collapse\" id=\"navbarScroll\">\n        <ul class=\"navbar-nav me-auto my-2 my-lg-0 navbar-nav-scroll\" style=\"--bs-scroll-height: 100px;\">\n          <li class=\"nav-item\">\n            <a class=\"nav-link active\" aria-current=\"page\" href=\"#\">Home</a>\n          </li>\n          <li class=\"nav-item\">\n            <a class=\"nav-link\" href=\"#\">Link</a>\n          </li>\n          <li class=\"nav-item dropdown\">\n            <a class=\"nav-link dropdown-toggle\" href=\"#\" role=\"button\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n              Link\n            </a>\n            <ul class=\"dropdown-menu\">\n              <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n              <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n              <li><hr class=\"dropdown-divider\"></li>\n              <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n            </ul>\n          </li>\n          <li class=\"nav-item\">\n            <a class=\"nav-link disabled\" aria-disabled=\"true\">Link</a>\n          </li>\n        </ul>\n        <form class=\"d-flex\" role=\"search\">\n          <input class=\"form-control me-2\" type=\"search\" placeholder=\"Search\" aria-label=\"Search\"/>\n          <button class=\"btn btn-outline-success\" type=\"submit\">Search</button>\n        </form>\n      </div>\n    </div>\n  </nav>`} />\n\n## Responsive behaviors\n\nNavbars can use `.navbar-toggler`, `.navbar-collapse`, and `.navbar-expand{-sm|-md|-lg|-xl|-xxl}` classes to determine when their content collapses behind a button. In combination with other utilities, you can easily choose when to show or hide particular elements.\n\nFor navbars that never collapse, add the `.navbar-expand` class on the navbar. For navbars that always collapse, don’t add any `.navbar-expand` class.\n\n### Toggler\n\nNavbar togglers are left-aligned by default, but should they follow a sibling element like a `.navbar-brand`, they’ll automatically be aligned to the far right. Reversing your markup will reverse the placement of the toggler. Below are examples of different toggle styles.\n\nWith no `.navbar-brand` shown at the smallest breakpoint:\n\n<Example code={`<nav class=\"navbar navbar-expand-lg bg-body-tertiary\">\n    <div class=\"container-fluid\">\n      <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbarTogglerDemo01\" aria-controls=\"navbarTogglerDemo01\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n        <span class=\"navbar-toggler-icon\"></span>\n      </button>\n      <div class=\"collapse navbar-collapse\" id=\"navbarTogglerDemo01\">\n        <a class=\"navbar-brand\" href=\"#\">Hidden brand</a>\n        <ul class=\"navbar-nav me-auto mb-2 mb-lg-0\">\n          <li class=\"nav-item\">\n            <a class=\"nav-link active\" aria-current=\"page\" href=\"#\">Home</a>\n          </li>\n          <li class=\"nav-item\">\n            <a class=\"nav-link\" href=\"#\">Link</a>\n          </li>\n          <li class=\"nav-item\">\n            <a class=\"nav-link disabled\" aria-disabled=\"true\">Disabled</a>\n          </li>\n        </ul>\n        <form class=\"d-flex\" role=\"search\">\n          <input class=\"form-control me-2\" type=\"search\" placeholder=\"Search\" aria-label=\"Search\"/>\n          <button class=\"btn btn-outline-success\" type=\"submit\">Search</button>\n        </form>\n      </div>\n    </div>\n  </nav>`} />\n\nWith a brand name shown on the left and toggler on the right:\n\n<Example code={`<nav class=\"navbar navbar-expand-lg bg-body-tertiary\">\n    <div class=\"container-fluid\">\n      <a class=\"navbar-brand\" href=\"#\">Navbar</a>\n      <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbarTogglerDemo02\" aria-controls=\"navbarTogglerDemo02\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n        <span class=\"navbar-toggler-icon\"></span>\n      </button>\n      <div class=\"collapse navbar-collapse\" id=\"navbarTogglerDemo02\">\n        <ul class=\"navbar-nav me-auto mb-2 mb-lg-0\">\n          <li class=\"nav-item\">\n            <a class=\"nav-link active\" aria-current=\"page\" href=\"#\">Home</a>\n          </li>\n          <li class=\"nav-item\">\n            <a class=\"nav-link\" href=\"#\">Link</a>\n          </li>\n          <li class=\"nav-item\">\n            <a class=\"nav-link disabled\" aria-disabled=\"true\">Disabled</a>\n          </li>\n        </ul>\n        <form class=\"d-flex\" role=\"search\">\n          <input class=\"form-control me-2\" type=\"search\" placeholder=\"Search\" aria-label=\"Search\"/>\n          <button class=\"btn btn-outline-success\" type=\"submit\">Search</button>\n        </form>\n      </div>\n    </div>\n  </nav>`} />\n\nWith a toggler on the left and brand name on the right:\n\n<Example code={`<nav class=\"navbar navbar-expand-lg bg-body-tertiary\">\n    <div class=\"container-fluid\">\n      <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbarTogglerDemo03\" aria-controls=\"navbarTogglerDemo03\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n        <span class=\"navbar-toggler-icon\"></span>\n      </button>\n      <a class=\"navbar-brand\" href=\"#\">Navbar</a>\n      <div class=\"collapse navbar-collapse\" id=\"navbarTogglerDemo03\">\n        <ul class=\"navbar-nav me-auto mb-2 mb-lg-0\">\n          <li class=\"nav-item\">\n            <a class=\"nav-link active\" aria-current=\"page\" href=\"#\">Home</a>\n          </li>\n          <li class=\"nav-item\">\n            <a class=\"nav-link\" href=\"#\">Link</a>\n          </li>\n          <li class=\"nav-item\">\n            <a class=\"nav-link disabled\" aria-disabled=\"true\">Disabled</a>\n          </li>\n        </ul>\n        <form class=\"d-flex\" role=\"search\">\n          <input class=\"form-control me-2\" type=\"search\" placeholder=\"Search\" aria-label=\"Search\"/>\n          <button class=\"btn btn-outline-success\" type=\"submit\">Search</button>\n        </form>\n      </div>\n    </div>\n  </nav>`} />\n\n### External content\n\nSometimes you want to use the collapse plugin to trigger a container element for content that structurally sits outside of the `.navbar` . Because our plugin works on the `id` and `data-bs-target` matching, that’s easily done!\n\n<Example code={`<div class=\"collapse\" id=\"navbarToggleExternalContent\" data-bs-theme=\"dark\">\n    <div class=\"bg-dark p-4\">\n      <h5 class=\"text-body-emphasis h4\">Collapsed content</h5>\n      <span class=\"text-body-secondary\">Toggleable via the navbar brand.</span>\n    </div>\n  </div>\n  <nav class=\"navbar navbar-dark bg-dark\">\n    <div class=\"container-fluid\">\n      <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbarToggleExternalContent\" aria-controls=\"navbarToggleExternalContent\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n        <span class=\"navbar-toggler-icon\"></span>\n      </button>\n    </div>\n  </nav>`} />\n\nWhen you do this, we recommend including additional JavaScript to move the focus programmatically to the container when it is opened. Otherwise, keyboard users and users of assistive technologies will likely have a hard time finding the newly revealed content - particularly if the container that was opened comes *before* the toggler in the document’s structure. We also recommend making sure that the toggler has the `aria-controls` attribute, pointing to the `id` of the content container. In theory, this allows assistive technology users to jump directly from the toggler to the container it controls–but support for this is currently quite patchy.\n\n### Offcanvas\n\nTransform your expanding and collapsing navbar into an offcanvas drawer with the [offcanvas component]([[docsref:/components/offcanvas]]). We extend both the offcanvas default styles and use our `.navbar-expand-*` classes to create a dynamic and flexible navigation sidebar.\n\nIn the example below, to create an offcanvas navbar that is always collapsed across all breakpoints, omit the `.navbar-expand-*` class entirely.\n\n<Example code={`<nav class=\"navbar bg-body-tertiary fixed-top\">\n    <div class=\"container-fluid\">\n      <a class=\"navbar-brand\" href=\"#\">Offcanvas navbar</a>\n      <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"offcanvas\" data-bs-target=\"#offcanvasNavbar\" aria-controls=\"offcanvasNavbar\" aria-label=\"Toggle navigation\">\n        <span class=\"navbar-toggler-icon\"></span>\n      </button>\n      <div class=\"offcanvas offcanvas-end\" tabindex=\"-1\" id=\"offcanvasNavbar\" aria-labelledby=\"offcanvasNavbarLabel\">\n        <div class=\"offcanvas-header\">\n          <h5 class=\"offcanvas-title\" id=\"offcanvasNavbarLabel\">Offcanvas</h5>\n          <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"offcanvas\" aria-label=\"Close\"></button>\n        </div>\n        <div class=\"offcanvas-body\">\n          <ul class=\"navbar-nav justify-content-end flex-grow-1 pe-3\">\n            <li class=\"nav-item\">\n              <a class=\"nav-link active\" aria-current=\"page\" href=\"#\">Home</a>\n            </li>\n            <li class=\"nav-item\">\n              <a class=\"nav-link\" href=\"#\">Link</a>\n            </li>\n            <li class=\"nav-item dropdown\">\n              <a class=\"nav-link dropdown-toggle\" href=\"#\" role=\"button\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n                Dropdown\n              </a>\n              <ul class=\"dropdown-menu\">\n                <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n                <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n                <li>\n                  <hr class=\"dropdown-divider\">\n                </li>\n                <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n              </ul>\n            </li>\n          </ul>\n          <form class=\"d-flex mt-3\" role=\"search\">\n            <input class=\"form-control me-2\" type=\"search\" placeholder=\"Search\" aria-label=\"Search\"/>\n            <button class=\"btn btn-outline-success\" type=\"submit\">Search</button>\n          </form>\n        </div>\n      </div>\n    </div>\n  </nav>`} />\n\nTo create an offcanvas navbar that expands into a normal navbar at a specific breakpoint like `lg`, use `.navbar-expand-lg`.\n\n```html\n<nav class=\"navbar navbar-expand-lg bg-body-tertiary fixed-top\">\n  <a class=\"navbar-brand\" href=\"#\">Offcanvas navbar</a>\n  <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"offcanvas\" data-bs-target=\"#navbarOffcanvasLg\" aria-controls=\"navbarOffcanvasLg\" aria-label=\"Toggle navigation\">\n    <span class=\"navbar-toggler-icon\"></span>\n  </button>\n  <div class=\"offcanvas offcanvas-end\" tabindex=\"-1\" id=\"navbarOffcanvasLg\" aria-labelledby=\"navbarOffcanvasLgLabel\">\n    ...\n  </div>\n</nav>\n```\n\nWhen using offcanvas in a dark navbar, be aware that you may need to have a dark background on the offcanvas content to avoid the text becoming illegible. In the example below, we add `.navbar-dark` and `.bg-dark` to the `.navbar`, `.text-bg-dark` to the `.offcanvas`, `.dropdown-menu-dark` to `.dropdown-menu`, and `.btn-close-white` to `.btn-close` for proper styling with a dark offcanvas.\n\n<Example code={`<nav class=\"navbar navbar-dark bg-dark fixed-top\">\n    <div class=\"container-fluid\">\n      <a class=\"navbar-brand\" href=\"#\">Offcanvas dark navbar</a>\n      <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"offcanvas\" data-bs-target=\"#offcanvasDarkNavbar\" aria-controls=\"offcanvasDarkNavbar\" aria-label=\"Toggle navigation\">\n        <span class=\"navbar-toggler-icon\"></span>\n      </button>\n      <div class=\"offcanvas offcanvas-end text-bg-dark\" tabindex=\"-1\" id=\"offcanvasDarkNavbar\" aria-labelledby=\"offcanvasDarkNavbarLabel\">\n        <div class=\"offcanvas-header\">\n          <h5 class=\"offcanvas-title\" id=\"offcanvasDarkNavbarLabel\">Dark offcanvas</h5>\n          <button type=\"button\" class=\"btn-close btn-close-white\" data-bs-dismiss=\"offcanvas\" aria-label=\"Close\"></button>\n        </div>\n        <div class=\"offcanvas-body\">\n          <ul class=\"navbar-nav justify-content-end flex-grow-1 pe-3\">\n            <li class=\"nav-item\">\n              <a class=\"nav-link active\" aria-current=\"page\" href=\"#\">Home</a>\n            </li>\n            <li class=\"nav-item\">\n              <a class=\"nav-link\" href=\"#\">Link</a>\n            </li>\n            <li class=\"nav-item dropdown\">\n              <a class=\"nav-link dropdown-toggle\" href=\"#\" role=\"button\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n                Dropdown\n              </a>\n              <ul class=\"dropdown-menu dropdown-menu-dark\">\n                <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n                <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n                <li>\n                  <hr class=\"dropdown-divider\">\n                </li>\n                <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n              </ul>\n            </li>\n          </ul>\n          <form class=\"d-flex mt-3\" role=\"search\">\n            <input class=\"form-control me-2\" type=\"search\" placeholder=\"Search\" aria-label=\"Search\"/>\n            <button class=\"btn btn-success\" type=\"submit\">Search</button>\n          </form>\n        </div>\n      </div>\n    </div>\n  </nav>`} />\n\n## CSS\n\n### Variables\n\n<AddedIn version=\"5.2.0\" />\n\nAs part of Bootstrap’s evolving CSS variables approach, navbars now use local CSS variables on `.navbar` for enhanced real-time customization. Values for the CSS variables are set via Sass, so Sass customization is still supported, too.\n\n<ScssDocs name=\"navbar-css-vars\" file=\"scss/_navbar.scss\" />\n\nSome additional CSS variables are also present on `.navbar-nav`:\n\n<ScssDocs name=\"navbar-nav-css-vars\" file=\"scss/_navbar.scss\" />\n\nCustomization through CSS variables can be seen on the `.navbar-dark` class where we override specific values without adding duplicate CSS selectors.\n\n<ScssDocs name=\"navbar-dark-css-vars\" file=\"scss/_navbar.scss\" />\n\n### Sass variables\n\nVariables for all navbars:\n\n<ScssDocs name=\"navbar-variables\" file=\"scss/_variables.scss\" />\n\nVariables for the [dark navbar](#color-schemes):\n\n<ScssDocs name=\"navbar-dark-variables\" file=\"scss/_variables.scss\" />\n\n### Sass loops\n\n[Responsive navbar expand/collapse classes](#responsive-behaviors) (e.g., `.navbar-expand-lg`) are combined with the `$breakpoints` map and generated through a loop in `scss/_navbar.scss`.\n\n<ScssDocs name=\"navbar-expand-loop\" file=\"scss/_navbar.scss\" />\n"
  },
  {
    "path": "site/src/content/docs/components/navs-tabs.mdx",
    "content": "---\ntitle: Navs and tabs\ndescription: Documentation and examples for how to use Bootstrap’s included navigation components.\naliases: \"/docs/[[config:docs_version]]/components/navs/\"\ntoc: true\n---\n\n## Base nav\n\nNavigation available in Bootstrap share general markup and styles, from the base `.nav` class to the active and disabled states. Swap modifier classes to switch between each style.\n\nThe base `.nav` component is built with flexbox and provide a strong foundation for building all types of navigation components. It includes some style overrides (for working with lists), some link padding for larger hit areas, and basic disabled styling.\n\n<Callout>\nThe base `.nav` component does not include any `.active` state. The following examples include the class, mainly to demonstrate that this particular class does not trigger any special styling.\n\nTo convey the active state to assistive technologies, use the `aria-current` attribute — using the `page` value for current page, or `true` for the current item in a set.\n</Callout>\n\n<Example code={`<ul class=\"nav\">\n    <li class=\"nav-item\">\n      <a class=\"nav-link active\" aria-current=\"page\" href=\"#\">Active</a>\n    </li>\n    <li class=\"nav-item\">\n      <a class=\"nav-link\" href=\"#\">Link</a>\n    </li>\n    <li class=\"nav-item\">\n      <a class=\"nav-link\" href=\"#\">Link</a>\n    </li>\n    <li class=\"nav-item\">\n      <a class=\"nav-link disabled\" aria-disabled=\"true\">Disabled</a>\n    </li>\n  </ul>`} />\n\nClasses are used throughout, so your markup can be super flexible. Use `<ul>`s like above, `<ol>` if the order of your items is important, or roll your own with a `<nav>` element. Because the `.nav` uses `display: flex`, the nav links behave the same as nav items would, but without the extra markup.\n\n<Example code={`<nav class=\"nav\">\n    <a class=\"nav-link active\" aria-current=\"page\" href=\"#\">Active</a>\n    <a class=\"nav-link\" href=\"#\">Link</a>\n    <a class=\"nav-link\" href=\"#\">Link</a>\n    <a class=\"nav-link disabled\" aria-disabled=\"true\">Disabled</a>\n  </nav>`} />\n\n## Available styles\n\nChange the style of `.nav`s component with modifiers and utilities. Mix and match as needed, or build your own.\n\n### Horizontal alignment\n\nChange the horizontal alignment of your nav with [flexbox utilities]([[docsref:/utilities/flex#justify-content]]). By default, navs are left-aligned, but you can easily change them to center or right-aligned.\n\nCentered with `.justify-content-center`:\n\n<Example code={`<ul class=\"nav justify-content-center\">\n    <li class=\"nav-item\">\n      <a class=\"nav-link active\" aria-current=\"page\" href=\"#\">Active</a>\n    </li>\n    <li class=\"nav-item\">\n      <a class=\"nav-link\" href=\"#\">Link</a>\n    </li>\n    <li class=\"nav-item\">\n      <a class=\"nav-link\" href=\"#\">Link</a>\n    </li>\n    <li class=\"nav-item\">\n      <a class=\"nav-link disabled\" aria-disabled=\"true\">Disabled</a>\n    </li>\n  </ul>`} />\n\nRight-aligned with `.justify-content-end`:\n\n<Example code={`<ul class=\"nav justify-content-end\">\n    <li class=\"nav-item\">\n      <a class=\"nav-link active\" aria-current=\"page\" href=\"#\">Active</a>\n    </li>\n    <li class=\"nav-item\">\n      <a class=\"nav-link\" href=\"#\">Link</a>\n    </li>\n    <li class=\"nav-item\">\n      <a class=\"nav-link\" href=\"#\">Link</a>\n    </li>\n    <li class=\"nav-item\">\n      <a class=\"nav-link disabled\" aria-disabled=\"true\">Disabled</a>\n    </li>\n  </ul>`} />\n\n### Vertical\n\nStack your navigation by changing the flex item direction with the `.flex-column` utility. Need to stack them on some viewports but not others? Use the responsive versions (e.g., `.flex-sm-column`).\n\n<Example code={`<ul class=\"nav flex-column\">\n    <li class=\"nav-item\">\n      <a class=\"nav-link active\" aria-current=\"page\" href=\"#\">Active</a>\n    </li>\n    <li class=\"nav-item\">\n      <a class=\"nav-link\" href=\"#\">Link</a>\n    </li>\n    <li class=\"nav-item\">\n      <a class=\"nav-link\" href=\"#\">Link</a>\n    </li>\n    <li class=\"nav-item\">\n      <a class=\"nav-link disabled\" aria-disabled=\"true\">Disabled</a>\n    </li>\n  </ul>`} />\n\nAs always, vertical navigation is possible without `<ul>`s, too.\n\n<Example code={`<nav class=\"nav flex-column\">\n    <a class=\"nav-link active\" aria-current=\"page\" href=\"#\">Active</a>\n    <a class=\"nav-link\" href=\"#\">Link</a>\n    <a class=\"nav-link\" href=\"#\">Link</a>\n    <a class=\"nav-link disabled\" aria-disabled=\"true\">Disabled</a>\n  </nav>`} />\n\n### Tabs\n\nTakes the basic nav from above and adds the `.nav-tabs` class to generate a tabbed interface. Use them to create tabbable regions with our [tab JavaScript plugin](#javascript-behavior).\n\n<Example code={`<ul class=\"nav nav-tabs\">\n    <li class=\"nav-item\">\n      <a class=\"nav-link active\" aria-current=\"page\" href=\"#\">Active</a>\n    </li>\n    <li class=\"nav-item\">\n      <a class=\"nav-link\" href=\"#\">Link</a>\n    </li>\n    <li class=\"nav-item\">\n      <a class=\"nav-link\" href=\"#\">Link</a>\n    </li>\n    <li class=\"nav-item\">\n      <a class=\"nav-link disabled\" aria-disabled=\"true\">Disabled</a>\n    </li>\n  </ul>`} />\n\n### Pills\n\nTake that same HTML, but use `.nav-pills` instead:\n\n<Example code={`<ul class=\"nav nav-pills\">\n    <li class=\"nav-item\">\n      <a class=\"nav-link active\" aria-current=\"page\" href=\"#\">Active</a>\n    </li>\n    <li class=\"nav-item\">\n      <a class=\"nav-link\" href=\"#\">Link</a>\n    </li>\n    <li class=\"nav-item\">\n      <a class=\"nav-link\" href=\"#\">Link</a>\n    </li>\n    <li class=\"nav-item\">\n      <a class=\"nav-link disabled\" aria-disabled=\"true\">Disabled</a>\n    </li>\n  </ul>`} />\n\n### Underline\n\nTake that same HTML, but use `.nav-underline` instead:\n\n<Example code={`<ul class=\"nav nav-underline\">\n    <li class=\"nav-item\">\n      <a class=\"nav-link active\" aria-current=\"page\" href=\"#\">Active</a>\n    </li>\n    <li class=\"nav-item\">\n      <a class=\"nav-link\" href=\"#\">Link</a>\n    </li>\n    <li class=\"nav-item\">\n      <a class=\"nav-link\" href=\"#\">Link</a>\n    </li>\n    <li class=\"nav-item\">\n      <a class=\"nav-link disabled\" aria-disabled=\"true\">Disabled</a>\n    </li>\n  </ul>`} />\n\n### Fill and justify\n\nForce your `.nav`’s contents to extend the full available width with one of two modifier classes. To proportionately fill all available space with your `.nav-item`s, use `.nav-fill`. Notice that all horizontal space is occupied, but not every nav item has the same width.\n\n<Example code={`<ul class=\"nav nav-pills nav-fill\">\n    <li class=\"nav-item\">\n      <a class=\"nav-link active\" aria-current=\"page\" href=\"#\">Active</a>\n    </li>\n    <li class=\"nav-item\">\n      <a class=\"nav-link\" href=\"#\">Much longer nav link</a>\n    </li>\n    <li class=\"nav-item\">\n      <a class=\"nav-link\" href=\"#\">Link</a>\n    </li>\n    <li class=\"nav-item\">\n      <a class=\"nav-link disabled\" aria-disabled=\"true\">Disabled</a>\n    </li>\n  </ul>`} />\n\nWhen using a `<nav>`-based navigation, you can safely omit `.nav-item` as only `.nav-link` is required for styling `<a>` elements.\n\n<Example code={`<nav class=\"nav nav-pills nav-fill\">\n    <a class=\"nav-link active\" aria-current=\"page\" href=\"#\">Active</a>\n    <a class=\"nav-link\" href=\"#\">Much longer nav link</a>\n    <a class=\"nav-link\" href=\"#\">Link</a>\n    <a class=\"nav-link disabled\" aria-disabled=\"true\">Disabled</a>\n  </nav>`} />\n\nFor equal-width elements, use `.nav-justified`. All horizontal space will be occupied by nav links, but unlike the `.nav-fill` above, every nav item will be the same width.\n\n<Example code={`<ul class=\"nav nav-pills nav-justified\">\n    <li class=\"nav-item\">\n      <a class=\"nav-link active\" aria-current=\"page\" href=\"#\">Active</a>\n    </li>\n    <li class=\"nav-item\">\n      <a class=\"nav-link\" href=\"#\">Much longer nav link</a>\n    </li>\n    <li class=\"nav-item\">\n      <a class=\"nav-link\" href=\"#\">Link</a>\n    </li>\n    <li class=\"nav-item\">\n      <a class=\"nav-link disabled\" aria-disabled=\"true\">Disabled</a>\n    </li>\n  </ul>`} />\n\nSimilar to the `.nav-fill` example using a `<nav>`-based navigation.\n\n<Example code={`<nav class=\"nav nav-pills nav-justified\">\n    <a class=\"nav-link active\" aria-current=\"page\" href=\"#\">Active</a>\n    <a class=\"nav-link\" href=\"#\">Much longer nav link</a>\n    <a class=\"nav-link\" href=\"#\">Link</a>\n    <a class=\"nav-link disabled\" aria-disabled=\"true\">Disabled</a>\n  </nav>`} />\n\n## Working with flex utilities\n\nIf you need responsive nav variations, consider using a series of [flexbox utilities]([[docsref:/utilities/flex]]). While more verbose, these utilities offer greater customization across responsive breakpoints. In the example below, our nav will be stacked on the lowest breakpoint, then adapt to a horizontal layout that fills the available width starting from the small breakpoint.\n\n<Example code={`<nav class=\"nav nav-pills flex-column flex-sm-row\">\n    <a class=\"flex-sm-fill text-sm-center nav-link active\" aria-current=\"page\" href=\"#\">Active</a>\n    <a class=\"flex-sm-fill text-sm-center nav-link\" href=\"#\">Longer nav link</a>\n    <a class=\"flex-sm-fill text-sm-center nav-link\" href=\"#\">Link</a>\n    <a class=\"flex-sm-fill text-sm-center nav-link disabled\" aria-disabled=\"true\">Disabled</a>\n  </nav>`} />\n\n## Regarding accessibility\n\nIf you’re using navs to provide a navigation bar, be sure to add a `role=\"navigation\"` to the most logical parent container of the `<ul>`, or wrap a `<nav>` element around the whole navigation. Do not add the role to the `<ul>` itself, as this would prevent it from being announced as an actual list by assistive technologies.\n\nNote that navigation bars, even if visually styled as tabs with the `.nav-tabs` class, should **not** be given `role=\"tablist\"`, `role=\"tab\"` or `role=\"tabpanel\"` attributes. These are only appropriate for dynamic tabbed interfaces, as described in the [ARIA Authoring Practices Guide tabs pattern](https://www.w3.org/WAI/ARIA/apg/patterns/tabpanel/). See [JavaScript behavior](#javascript-behavior) for dynamic tabbed interfaces in this section for an example. The `aria-current` attribute is not necessary on dynamic tabbed interfaces since our JavaScript handles the selected state by adding `aria-selected=\"true\"` on the active tab.\n\n## Using dropdowns\n\nAdd dropdown menus with a little extra HTML and the [dropdowns JavaScript plugin]([[docsref:/components/dropdowns#usage]]).\n\n### Tabs with dropdowns\n\n<Example code={`<ul class=\"nav nav-tabs\">\n    <li class=\"nav-item\">\n      <a class=\"nav-link active\" aria-current=\"page\" href=\"#\">Active</a>\n    </li>\n    <li class=\"nav-item dropdown\">\n      <a class=\"nav-link dropdown-toggle\" data-bs-toggle=\"dropdown\" href=\"#\" role=\"button\" aria-expanded=\"false\">Dropdown</a>\n      <ul class=\"dropdown-menu\">\n        <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n        <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n        <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n        <li><hr class=\"dropdown-divider\"></li>\n        <li><a class=\"dropdown-item\" href=\"#\">Separated link</a></li>\n      </ul>\n    </li>\n    <li class=\"nav-item\">\n      <a class=\"nav-link\" href=\"#\">Link</a>\n    </li>\n    <li class=\"nav-item\">\n      <a class=\"nav-link disabled\" aria-disabled=\"true\">Disabled</a>\n    </li>\n  </ul>`} />\n\n### Pills with dropdowns\n\n<Example code={`<ul class=\"nav nav-pills\">\n    <li class=\"nav-item\">\n      <a class=\"nav-link active\" aria-current=\"page\" href=\"#\">Active</a>\n    </li>\n    <li class=\"nav-item dropdown\">\n      <a class=\"nav-link dropdown-toggle\" data-bs-toggle=\"dropdown\" href=\"#\" role=\"button\" aria-expanded=\"false\">Dropdown</a>\n      <ul class=\"dropdown-menu\">\n        <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n        <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n        <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n        <li><hr class=\"dropdown-divider\"></li>\n        <li><a class=\"dropdown-item\" href=\"#\">Separated link</a></li>\n      </ul>\n    </li>\n    <li class=\"nav-item\">\n      <a class=\"nav-link\" href=\"#\">Link</a>\n    </li>\n    <li class=\"nav-item\">\n      <a class=\"nav-link disabled\" aria-disabled=\"true\">Disabled</a>\n    </li>\n  </ul>`} />\n\n## CSS\n\n### Variables\n\n<AddedIn version=\"5.2.0\" />\n\nAs part of Bootstrap’s evolving CSS variables approach, navs now use local CSS variables on `.nav`, `.nav-tabs`, and `.nav-pills` for enhanced real-time customization. Values for the CSS variables are set via Sass, so Sass customization is still supported, too.\n\nOn the `.nav` base class:\n\n<ScssDocs name=\"nav-css-vars\" file=\"scss/_nav.scss\" />\n\nOn the `.nav-tabs` modifier class:\n\n<ScssDocs name=\"nav-tabs-css-vars\" file=\"scss/_nav.scss\" />\n\nOn the `.nav-pills` modifier class:\n\n<ScssDocs name=\"nav-pills-css-vars\" file=\"scss/_nav.scss\" />\n\n<AddedIn version=\"5.3.0\" />\n\nOn the `.nav-underline` modifier class:\n\n<ScssDocs name=\"nav-underline-css-vars\" file=\"scss/_nav.scss\" />\n\n### Sass variables\n\n<ScssDocs name=\"nav-variables\" file=\"scss/_variables.scss\" />\n\n## JavaScript behavior\n\nUse the tab JavaScript plugin—include it individually or through the compiled `bootstrap.js` file—to extend our navigational tabs and pills to create tabbable panes of local content.\n\n<Example showMarkup={false} code={`\n<ul class=\"nav nav-tabs mb-3\" id=\"myTab\" role=\"tablist\">\n  <li class=\"nav-item\" role=\"presentation\">\n    <button class=\"nav-link active\" id=\"home-tab\" data-bs-toggle=\"tab\" data-bs-target=\"#home-tab-pane\" type=\"button\" role=\"tab\" aria-controls=\"home-tab-pane\" aria-selected=\"true\">Home</button>\n  </li>\n  <li class=\"nav-item\" role=\"presentation\">\n    <button class=\"nav-link\" id=\"profile-tab\" data-bs-toggle=\"tab\" data-bs-target=\"#profile-tab-pane\" type=\"button\" role=\"tab\" aria-controls=\"profile-tab-pane\" aria-selected=\"false\">Profile</button>\n  </li>\n  <li class=\"nav-item\" role=\"presentation\">\n    <button class=\"nav-link\" id=\"contact-tab\" data-bs-toggle=\"tab\" data-bs-target=\"#contact-tab-pane\" type=\"button\" role=\"tab\" aria-controls=\"contact-tab-pane\" aria-selected=\"false\">Contact</button>\n  </li>\n  <li class=\"nav-item\" role=\"presentation\">\n    <button class=\"nav-link\" id=\"disabled-tab\" data-bs-toggle=\"tab\" data-bs-target=\"#disabled-tab-pane\" type=\"button\" role=\"tab\" aria-controls=\"disabled-tab-pane\" aria-selected=\"false\" disabled>Disabled</button>\n  </li>\n</ul>\n<div class=\"tab-content\" id=\"myTabContent\">\n  <div class=\"tab-pane fade show active\" id=\"home-tab-pane\" role=\"tabpanel\" aria-labelledby=\"home-tab\" tabindex=\"0\">\n    <p>This is some placeholder content the <strong>Home tab’s</strong> associated content. Clicking another tab will toggle the visibility of this one for the next. The tab JavaScript swaps classes to control the content visibility and styling. You can use it with tabs, pills, and any other <code>.nav</code>-powered navigation.</p>\n  </div>\n  <div class=\"tab-pane fade\" id=\"profile-tab-pane\" role=\"tabpanel\" aria-labelledby=\"profile-tab\" tabindex=\"0\">\n    <p>This is some placeholder content the <strong>Profile tab’s</strong> associated content. Clicking another tab will toggle the visibility of this one for the next. The tab JavaScript swaps classes to control the content visibility and styling. You can use it with tabs, pills, and any other <code>.nav</code>-powered navigation.</p>\n  </div>\n  <div class=\"tab-pane fade\" id=\"contact-tab-pane\" role=\"tabpanel\" aria-labelledby=\"contact-tab\" tabindex=\"0\">\n    <p>This is some placeholder content the <strong>Contact tab’s</strong> associated content. Clicking another tab will toggle the visibility of this one for the next. The tab JavaScript swaps classes to control the content visibility and styling. You can use it with tabs, pills, and any other <code>.nav</code>-powered navigation.</p>\n  </div>\n  <div class=\"tab-pane fade\" id=\"disabled-tab-pane\" role=\"tabpanel\" aria-labelledby=\"disabled-tab\" tabindex=\"0\">\n    <p>This is some placeholder content the <strong>Disabled tab’s</strong> associated content.</p>\n  </div>\n</div>\n`} />\n\n```html\n<ul class=\"nav nav-tabs\" id=\"myTab\" role=\"tablist\">\n  <li class=\"nav-item\" role=\"presentation\">\n    <button class=\"nav-link active\" id=\"home-tab\" data-bs-toggle=\"tab\" data-bs-target=\"#home-tab-pane\" type=\"button\" role=\"tab\" aria-controls=\"home-tab-pane\" aria-selected=\"true\">Home</button>\n  </li>\n  <li class=\"nav-item\" role=\"presentation\">\n    <button class=\"nav-link\" id=\"profile-tab\" data-bs-toggle=\"tab\" data-bs-target=\"#profile-tab-pane\" type=\"button\" role=\"tab\" aria-controls=\"profile-tab-pane\" aria-selected=\"false\">Profile</button>\n  </li>\n  <li class=\"nav-item\" role=\"presentation\">\n    <button class=\"nav-link\" id=\"contact-tab\" data-bs-toggle=\"tab\" data-bs-target=\"#contact-tab-pane\" type=\"button\" role=\"tab\" aria-controls=\"contact-tab-pane\" aria-selected=\"false\">Contact</button>\n  </li>\n  <li class=\"nav-item\" role=\"presentation\">\n    <button class=\"nav-link\" id=\"disabled-tab\" data-bs-toggle=\"tab\" data-bs-target=\"#disabled-tab-pane\" type=\"button\" role=\"tab\" aria-controls=\"disabled-tab-pane\" aria-selected=\"false\" disabled>Disabled</button>\n  </li>\n</ul>\n<div class=\"tab-content\" id=\"myTabContent\">\n  <div class=\"tab-pane fade show active\" id=\"home-tab-pane\" role=\"tabpanel\" aria-labelledby=\"home-tab\" tabindex=\"0\">...</div>\n  <div class=\"tab-pane fade\" id=\"profile-tab-pane\" role=\"tabpanel\" aria-labelledby=\"profile-tab\" tabindex=\"0\">...</div>\n  <div class=\"tab-pane fade\" id=\"contact-tab-pane\" role=\"tabpanel\" aria-labelledby=\"contact-tab\" tabindex=\"0\">...</div>\n  <div class=\"tab-pane fade\" id=\"disabled-tab-pane\" role=\"tabpanel\" aria-labelledby=\"disabled-tab\" tabindex=\"0\">...</div>\n</div>\n```\n\nTo help fit your needs, this works with `<ul>`-based markup, as shown above, or with any arbitrary “roll your own” markup. Note that if you’re using `<nav>`, you shouldn’t add `role=\"tablist\"` directly to it, as this would override the element’s native role as a navigation landmark. Instead, switch to an alternative element (in the example below, a simple `<div>`) and wrap the `<nav>` around it.\n\n<Example showMarkup={false} code={`\n<nav>\n  <div class=\"nav nav-tabs mb-3\" id=\"nav-tab\" role=\"tablist\">\n    <button class=\"nav-link active\" id=\"nav-home-tab\" data-bs-toggle=\"tab\" data-bs-target=\"#nav-home\" type=\"button\" role=\"tab\" aria-controls=\"nav-home\" aria-selected=\"true\">Home</button>\n    <button class=\"nav-link\" id=\"nav-profile-tab\" data-bs-toggle=\"tab\" data-bs-target=\"#nav-profile\" type=\"button\" role=\"tab\" aria-controls=\"nav-profile\" aria-selected=\"false\">Profile</button>\n    <button class=\"nav-link\" id=\"nav-contact-tab\" data-bs-toggle=\"tab\" data-bs-target=\"#nav-contact\" type=\"button\" role=\"tab\" aria-controls=\"nav-contact\" aria-selected=\"false\">Contact</button>\n    <button class=\"nav-link\" id=\"nav-disabled-tab\" data-bs-toggle=\"tab\" data-bs-target=\"#nav-disabled\" type=\"button\" role=\"tab\" aria-controls=\"nav-disabled\" aria-selected=\"false\" disabled>Disabled</button>\n  </div>\n</nav>\n<div class=\"tab-content\" id=\"nav-tabContent\">\n  <div class=\"tab-pane fade show active\" id=\"nav-home\" role=\"tabpanel\" aria-labelledby=\"nav-home-tab\" tabindex=\"0\">\n    <p>This is some placeholder content the <strong>Home tab’s</strong> associated content. Clicking another tab will toggle the visibility of this one for the next. The tab JavaScript swaps classes to control the content visibility and styling. You can use it with tabs, pills, and any other <code>.nav</code>-powered navigation.</p>\n  </div>\n  <div class=\"tab-pane fade\" id=\"nav-profile\" role=\"tabpanel\" aria-labelledby=\"nav-profile-tab\" tabindex=\"0\">\n    <p>This is some placeholder content the <strong>Profile tab’s</strong> associated content. Clicking another tab will toggle the visibility of this one for the next. The tab JavaScript swaps classes to control the content visibility and styling. You can use it with tabs, pills, and any other <code>.nav</code>-powered navigation.</p>\n  </div>\n  <div class=\"tab-pane fade\" id=\"nav-contact\" role=\"tabpanel\" aria-labelledby=\"nav-contact-tab\" tabindex=\"0\">\n    <p>This is some placeholder content the <strong>Contact tab’s</strong> associated content. Clicking another tab will toggle the visibility of this one for the next. The tab JavaScript swaps classes to control the content visibility and styling. You can use it with tabs, pills, and any other <code>.nav</code>-powered navigation.</p>\n  </div>\n  <div class=\"tab-pane fade\" id=\"nav-disabled\" role=\"tabpanel\" aria-labelledby=\"nav-disabled-tab\" tabindex=\"0\">\n    <p>This is some placeholder content the <strong>Disabled tab’s</strong> associated content.</p>\n  </div>\n</div>\n`} />\n\n```html\n<nav>\n  <div class=\"nav nav-tabs\" id=\"nav-tab\" role=\"tablist\">\n    <button class=\"nav-link active\" id=\"nav-home-tab\" data-bs-toggle=\"tab\" data-bs-target=\"#nav-home\" type=\"button\" role=\"tab\" aria-controls=\"nav-home\" aria-selected=\"true\">Home</button>\n    <button class=\"nav-link\" id=\"nav-profile-tab\" data-bs-toggle=\"tab\" data-bs-target=\"#nav-profile\" type=\"button\" role=\"tab\" aria-controls=\"nav-profile\" aria-selected=\"false\">Profile</button>\n    <button class=\"nav-link\" id=\"nav-contact-tab\" data-bs-toggle=\"tab\" data-bs-target=\"#nav-contact\" type=\"button\" role=\"tab\" aria-controls=\"nav-contact\" aria-selected=\"false\">Contact</button>\n    <button class=\"nav-link\" id=\"nav-disabled-tab\" data-bs-toggle=\"tab\" data-bs-target=\"#nav-disabled\" type=\"button\" role=\"tab\" aria-controls=\"nav-disabled\" aria-selected=\"false\" disabled>Disabled</button>\n  </div>\n</nav>\n<div class=\"tab-content\" id=\"nav-tabContent\">\n  <div class=\"tab-pane fade show active\" id=\"nav-home\" role=\"tabpanel\" aria-labelledby=\"nav-home-tab\" tabindex=\"0\">...</div>\n  <div class=\"tab-pane fade\" id=\"nav-profile\" role=\"tabpanel\" aria-labelledby=\"nav-profile-tab\" tabindex=\"0\">...</div>\n  <div class=\"tab-pane fade\" id=\"nav-contact\" role=\"tabpanel\" aria-labelledby=\"nav-contact-tab\" tabindex=\"0\">...</div>\n  <div class=\"tab-pane fade\" id=\"nav-disabled\" role=\"tabpanel\" aria-labelledby=\"nav-disabled-tab\" tabindex=\"0\">...</div>\n</div>\n```\n\nThe tabs plugin also works with pills.\n\n<Example showMarkup={false} code={`\n<ul class=\"nav nav-pills mb-3\" id=\"pills-tab\" role=\"tablist\">\n  <li class=\"nav-item\" role=\"presentation\">\n    <button class=\"nav-link active\" id=\"pills-home-tab\" data-bs-toggle=\"pill\" data-bs-target=\"#pills-home\" type=\"button\" role=\"tab\" aria-controls=\"pills-home\" aria-selected=\"true\">Home</button>\n  </li>\n  <li class=\"nav-item\" role=\"presentation\">\n    <button class=\"nav-link\" id=\"pills-profile-tab\" data-bs-toggle=\"pill\" data-bs-target=\"#pills-profile\" type=\"button\" role=\"tab\" aria-controls=\"pills-profile\" aria-selected=\"false\">Profile</button>\n  </li>\n  <li class=\"nav-item\" role=\"presentation\">\n    <button class=\"nav-link\" id=\"pills-contact-tab\" data-bs-toggle=\"pill\" data-bs-target=\"#pills-contact\" type=\"button\" role=\"tab\" aria-controls=\"pills-contact\" aria-selected=\"false\">Contact</button>\n  </li>\n  <li class=\"nav-item\" role=\"presentation\">\n    <button class=\"nav-link\" id=\"pills-disabled-tab\" data-bs-toggle=\"pill\" data-bs-target=\"#pills-disabled\" type=\"button\" role=\"tab\" aria-controls=\"pills-disabled\" aria-selected=\"false\" disabled>Disabled</button>\n  </li>\n</ul>\n<div class=\"tab-content\" id=\"pills-tabContent\">\n  <div class=\"tab-pane fade show active\" id=\"pills-home\" role=\"tabpanel\" aria-labelledby=\"pills-home-tab\" tabindex=\"0\">\n    <p>This is some placeholder content the <strong>Home tab’s</strong> associated content. Clicking another tab will toggle the visibility of this one for the next. The tab JavaScript swaps classes to control the content visibility and styling. You can use it with tabs, pills, and any other <code>.nav</code>-powered navigation.</p>\n  </div>\n  <div class=\"tab-pane fade\" id=\"pills-profile\" role=\"tabpanel\" aria-labelledby=\"pills-profile-tab\" tabindex=\"0\">\n    <p>This is some placeholder content the <strong>Profile tab’s</strong> associated content. Clicking another tab will toggle the visibility of this one for the next. The tab JavaScript swaps classes to control the content visibility and styling. You can use it with tabs, pills, and any other <code>.nav</code>-powered navigation.</p>\n  </div>\n  <div class=\"tab-pane fade\" id=\"pills-contact\" role=\"tabpanel\" aria-labelledby=\"pills-contact-tab\" tabindex=\"0\">\n    <p>This is some placeholder content the <strong>Contact tab’s</strong> associated content. Clicking another tab will toggle the visibility of this one for the next. The tab JavaScript swaps classes to control the content visibility and styling. You can use it with tabs, pills, and any other <code>.nav</code>-powered navigation.</p>\n  </div>\n  <div class=\"tab-pane fade\" id=\"pills-disabled\" role=\"tabpanel\" aria-labelledby=\"pills-disabled-tab\" tabindex=\"0\">\n    <p>This is some placeholder content the <strong>Disabled tab’s</strong> associated content.</p>\n  </div>\n</div>\n`} />\n\n```html\n<ul class=\"nav nav-pills mb-3\" id=\"pills-tab\" role=\"tablist\">\n  <li class=\"nav-item\" role=\"presentation\">\n    <button class=\"nav-link active\" id=\"pills-home-tab\" data-bs-toggle=\"pill\" data-bs-target=\"#pills-home\" type=\"button\" role=\"tab\" aria-controls=\"pills-home\" aria-selected=\"true\">Home</button>\n  </li>\n  <li class=\"nav-item\" role=\"presentation\">\n    <button class=\"nav-link\" id=\"pills-profile-tab\" data-bs-toggle=\"pill\" data-bs-target=\"#pills-profile\" type=\"button\" role=\"tab\" aria-controls=\"pills-profile\" aria-selected=\"false\">Profile</button>\n  </li>\n  <li class=\"nav-item\" role=\"presentation\">\n    <button class=\"nav-link\" id=\"pills-contact-tab\" data-bs-toggle=\"pill\" data-bs-target=\"#pills-contact\" type=\"button\" role=\"tab\" aria-controls=\"pills-contact\" aria-selected=\"false\">Contact</button>\n  </li>\n  <li class=\"nav-item\" role=\"presentation\">\n    <button class=\"nav-link\" id=\"pills-disabled-tab\" data-bs-toggle=\"pill\" data-bs-target=\"#pills-disabled\" type=\"button\" role=\"tab\" aria-controls=\"pills-disabled\" aria-selected=\"false\" disabled>Disabled</button>\n  </li>\n</ul>\n<div class=\"tab-content\" id=\"pills-tabContent\">\n  <div class=\"tab-pane fade show active\" id=\"pills-home\" role=\"tabpanel\" aria-labelledby=\"pills-home-tab\" tabindex=\"0\">...</div>\n  <div class=\"tab-pane fade\" id=\"pills-profile\" role=\"tabpanel\" aria-labelledby=\"pills-profile-tab\" tabindex=\"0\">...</div>\n  <div class=\"tab-pane fade\" id=\"pills-contact\" role=\"tabpanel\" aria-labelledby=\"pills-contact-tab\" tabindex=\"0\">...</div>\n  <div class=\"tab-pane fade\" id=\"pills-disabled\" role=\"tabpanel\" aria-labelledby=\"pills-disabled-tab\" tabindex=\"0\">...</div>\n</div>\n```\n\nAnd with vertical pills. Ideally, for vertical tabs, you should also add `aria-orientation=\"vertical\"` to the tab list container.\n\n<Example showMarkup={false} code={`\n<div class=\"d-flex align-items-start\">\n  <div class=\"nav flex-column nav-pills me-3\" id=\"v-pills-tab\" role=\"tablist\" aria-orientation=\"vertical\">\n    <button class=\"nav-link active\" id=\"v-pills-home-tab\" data-bs-toggle=\"pill\" data-bs-target=\"#v-pills-home\" type=\"button\" role=\"tab\" aria-controls=\"v-pills-home\" aria-selected=\"true\">Home</button>\n    <button class=\"nav-link\" id=\"v-pills-profile-tab\" data-bs-toggle=\"pill\" data-bs-target=\"#v-pills-profile\" type=\"button\" role=\"tab\" aria-controls=\"v-pills-profile\" aria-selected=\"false\">Profile</button>\n    <button class=\"nav-link\" id=\"v-pills-disabled-tab\" data-bs-toggle=\"pill\" data-bs-target=\"#v-pills-disabled\" type=\"button\" role=\"tab\" aria-controls=\"v-pills-disabled\" aria-selected=\"false\" disabled>Disabled</button>\n    <button class=\"nav-link\" id=\"v-pills-messages-tab\" data-bs-toggle=\"pill\" data-bs-target=\"#v-pills-messages\" type=\"button\" role=\"tab\" aria-controls=\"v-pills-messages\" aria-selected=\"false\">Messages</button>\n    <button class=\"nav-link\" id=\"v-pills-settings-tab\" data-bs-toggle=\"pill\" data-bs-target=\"#v-pills-settings\" type=\"button\" role=\"tab\" aria-controls=\"v-pills-settings\" aria-selected=\"false\">Settings</button>\n  </div>\n  <div class=\"tab-content\" id=\"v-pills-tabContent\">\n    <div class=\"tab-pane fade show active\" id=\"v-pills-home\" role=\"tabpanel\" aria-labelledby=\"v-pills-home-tab\" tabindex=\"0\">\n      <p>This is some placeholder content the <strong>Home tab’s</strong> associated content. Clicking another tab will toggle the visibility of this one for the next. The tab JavaScript swaps classes to control the content visibility and styling. You can use it with tabs, pills, and any other <code>.nav</code>-powered navigation.</p>\n    </div>\n    <div class=\"tab-pane fade\" id=\"v-pills-profile\" role=\"tabpanel\" aria-labelledby=\"v-pills-profile-tab\" tabindex=\"0\">\n      <p>This is some placeholder content the <strong>Profile tab’s</strong> associated content. Clicking another tab will toggle the visibility of this one for the next. The tab JavaScript swaps classes to control the content visibility and styling. You can use it with tabs, pills, and any other <code>.nav</code>-powered navigation.</p>\n    </div>\n    <div class=\"tab-pane fade\" id=\"v-pills-disabled\" role=\"tabpanel\" aria-labelledby=\"v-pills-disabled-tab\" tabindex=\"0\">\n      <p>This is some placeholder content the <strong>Disabled tab’s</strong> associated content.</p>\n    </div>\n    <div class=\"tab-pane fade\" id=\"v-pills-messages\" role=\"tabpanel\" aria-labelledby=\"v-pills-messages-tab\" tabindex=\"0\">\n      <p>This is some placeholder content the <strong>Messages tab’s</strong> associated content. Clicking another tab will toggle the visibility of this one for the next. The tab JavaScript swaps classes to control the content visibility and styling. You can use it with tabs, pills, and any other <code>.nav</code>-powered navigation.</p>\n    </div>\n    <div class=\"tab-pane fade\" id=\"v-pills-settings\" role=\"tabpanel\" aria-labelledby=\"v-pills-settings-tab\" tabindex=\"0\">\n      <p>This is some placeholder content the <strong>Settings tab’s</strong> associated content. Clicking another tab will toggle the visibility of this one for the next. The tab JavaScript swaps classes to control the content visibility and styling. You can use it with tabs, pills, and any other <code>.nav</code>-powered navigation.</p>\n    </div>\n  </div>\n</div>\n`} />\n\n```html\n<div class=\"d-flex align-items-start\">\n  <div class=\"nav flex-column nav-pills me-3\" id=\"v-pills-tab\" role=\"tablist\" aria-orientation=\"vertical\">\n    <button class=\"nav-link active\" id=\"v-pills-home-tab\" data-bs-toggle=\"pill\" data-bs-target=\"#v-pills-home\" type=\"button\" role=\"tab\" aria-controls=\"v-pills-home\" aria-selected=\"true\">Home</button>\n    <button class=\"nav-link\" id=\"v-pills-profile-tab\" data-bs-toggle=\"pill\" data-bs-target=\"#v-pills-profile\" type=\"button\" role=\"tab\" aria-controls=\"v-pills-profile\" aria-selected=\"false\">Profile</button>\n    <button class=\"nav-link\" id=\"v-pills-disabled-tab\" data-bs-toggle=\"pill\" data-bs-target=\"#v-pills-disabled\" type=\"button\" role=\"tab\" aria-controls=\"v-pills-disabled\" aria-selected=\"false\" disabled>Disabled</button>\n    <button class=\"nav-link\" id=\"v-pills-messages-tab\" data-bs-toggle=\"pill\" data-bs-target=\"#v-pills-messages\" type=\"button\" role=\"tab\" aria-controls=\"v-pills-messages\" aria-selected=\"false\">Messages</button>\n    <button class=\"nav-link\" id=\"v-pills-settings-tab\" data-bs-toggle=\"pill\" data-bs-target=\"#v-pills-settings\" type=\"button\" role=\"tab\" aria-controls=\"v-pills-settings\" aria-selected=\"false\">Settings</button>\n  </div>\n  <div class=\"tab-content\" id=\"v-pills-tabContent\">\n    <div class=\"tab-pane fade show active\" id=\"v-pills-home\" role=\"tabpanel\" aria-labelledby=\"v-pills-home-tab\" tabindex=\"0\">...</div>\n    <div class=\"tab-pane fade\" id=\"v-pills-profile\" role=\"tabpanel\" aria-labelledby=\"v-pills-profile-tab\" tabindex=\"0\">...</div>\n    <div class=\"tab-pane fade\" id=\"v-pills-disabled\" role=\"tabpanel\" aria-labelledby=\"v-pills-disabled-tab\" tabindex=\"0\">...</div>\n    <div class=\"tab-pane fade\" id=\"v-pills-messages\" role=\"tabpanel\" aria-labelledby=\"v-pills-messages-tab\" tabindex=\"0\">...</div>\n    <div class=\"tab-pane fade\" id=\"v-pills-settings\" role=\"tabpanel\" aria-labelledby=\"v-pills-settings-tab\" tabindex=\"0\">...</div>\n  </div>\n</div>\n```\n\n### Accessibility\n\nDynamic tabbed interfaces, as described in the [ARIA Authoring Practices Guide tabs pattern](https://www.w3.org/WAI/ARIA/apg/patterns/tabpanel/), require `role=\"tablist\"`, `role=\"tab\"`, `role=\"tabpanel\"`, and additional `aria-` attributes in order to convey their structure, functionality, and current state to users of assistive technologies (such as screen readers). As a best practice, we recommend using `<button>` elements for the tabs, as these are controls that trigger a dynamic change, rather than links that navigate to a new page or location.\n\nIn line with the ARIA Authoring Practices pattern, only the currently active tab receives keyboard focus. When the JavaScript plugin is initialized, it will set `tabindex=\"-1\"` on all inactive tab controls. Once the currently active tab has focus, the cursor keys activate the previous/next tab. The <kbd>Home</kbd> and <kbd>End</kbd> keys activate the first and last tabs, respectively. The plugin will change the [roving `tabindex`](https://www.w3.org/WAI/ARIA/apg/practices/keyboard-interface/) accordingly. However, note that the JavaScript plugin does not distinguish between horizontal and vertical tab lists when it comes to cursor key interactions: regardless of the tab list’s orientation, both the up *and* left cursor go to the previous tab, and down *and* right cursor go to the next tab.\n\n<Callout type=\"warning\">\nIn general, to facilitate keyboard navigation, it’s recommended to make the tab panels themselves focusable as well, unless the first element containing meaningful content inside the tab panel is already focusable. The JavaScript plugin does not try to handle this aspect—where appropriate, you’ll need to explicitly make your tab panels focusable by adding `tabindex=\"0\"` in your markup.\n</Callout>\n\n<Callout type=\"danger\">\nThe tab JavaScript plugin **does not** support tabbed interfaces that contain dropdown menus, as these cause both usability and accessibility issues. From a usability perspective, the fact that the currently displayed tab’s trigger element is not immediately visible (as it’s inside the closed dropdown menu) can cause confusion. From an accessibility point of view, there is currently no sensible way to map this sort of construct to a standard WAI ARIA pattern, meaning that it cannot be easily made understandable to users of assistive technologies.\n</Callout>\n\n### Using data attributes\n\nYou can activate a tab or pill navigation without writing any JavaScript by simply specifying `data-bs-toggle=\"tab\"` or `data-bs-toggle=\"pill\"` on an element. Use these data attributes on `.nav-tabs` or `.nav-pills`.\n\n```html\n<!-- Nav tabs -->\n<ul class=\"nav nav-tabs\" id=\"myTab\" role=\"tablist\">\n  <li class=\"nav-item\" role=\"presentation\">\n    <button class=\"nav-link active\" id=\"home-tab\" data-bs-toggle=\"tab\" data-bs-target=\"#home\" type=\"button\" role=\"tab\" aria-controls=\"home\" aria-selected=\"true\">Home</button>\n  </li>\n  <li class=\"nav-item\" role=\"presentation\">\n    <button class=\"nav-link\" id=\"profile-tab\" data-bs-toggle=\"tab\" data-bs-target=\"#profile\" type=\"button\" role=\"tab\" aria-controls=\"profile\" aria-selected=\"false\">Profile</button>\n  </li>\n  <li class=\"nav-item\" role=\"presentation\">\n    <button class=\"nav-link\" id=\"messages-tab\" data-bs-toggle=\"tab\" data-bs-target=\"#messages\" type=\"button\" role=\"tab\" aria-controls=\"messages\" aria-selected=\"false\">Messages</button>\n  </li>\n  <li class=\"nav-item\" role=\"presentation\">\n    <button class=\"nav-link\" id=\"settings-tab\" data-bs-toggle=\"tab\" data-bs-target=\"#settings\" type=\"button\" role=\"tab\" aria-controls=\"settings\" aria-selected=\"false\">Settings</button>\n  </li>\n</ul>\n\n<!-- Tab panes -->\n<div class=\"tab-content\">\n  <div class=\"tab-pane active\" id=\"home\" role=\"tabpanel\" aria-labelledby=\"home-tab\" tabindex=\"0\">...</div>\n  <div class=\"tab-pane\" id=\"profile\" role=\"tabpanel\" aria-labelledby=\"profile-tab\" tabindex=\"0\">...</div>\n  <div class=\"tab-pane\" id=\"messages\" role=\"tabpanel\" aria-labelledby=\"messages-tab\" tabindex=\"0\">...</div>\n  <div class=\"tab-pane\" id=\"settings\" role=\"tabpanel\" aria-labelledby=\"settings-tab\" tabindex=\"0\">...</div>\n</div>\n```\n\n### Via JavaScript\n\nEnable tabbable tabs via JavaScript (each tab needs to be activated individually):\n\n```js\nconst triggerTabList = document.querySelectorAll('#myTab button')\ntriggerTabList.forEach(triggerEl => {\n  const tabTrigger = new bootstrap.Tab(triggerEl)\n\n  triggerEl.addEventListener('click', event => {\n    event.preventDefault()\n    tabTrigger.show()\n  })\n})\n```\n\nYou can activate individual tabs in several ways:\n\n```js\nconst triggerEl = document.querySelector('#myTab button[data-bs-target=\"#profile\"]')\nbootstrap.Tab.getInstance(triggerEl).show() // Select tab by name\n\nconst triggerFirstTabEl = document.querySelector('#myTab li:first-child button')\nbootstrap.Tab.getInstance(triggerFirstTabEl).show() // Select first tab\n```\n\n### Fade effect\n\nTo make tabs fade in, add `.fade` to each `.tab-pane`. The first tab pane must also have `.show` to make the initial content visible.\n\n```html\n<div class=\"tab-content\">\n  <div class=\"tab-pane fade show active\" id=\"home\" role=\"tabpanel\" aria-labelledby=\"home-tab\" tabindex=\"0\">...</div>\n  <div class=\"tab-pane fade\" id=\"profile\" role=\"tabpanel\" aria-labelledby=\"profile-tab\" tabindex=\"0\">...</div>\n  <div class=\"tab-pane fade\" id=\"messages\" role=\"tabpanel\" aria-labelledby=\"messages-tab\" tabindex=\"0\">...</div>\n  <div class=\"tab-pane fade\" id=\"settings\" role=\"tabpanel\" aria-labelledby=\"settings-tab\" tabindex=\"0\">...</div>\n</div>\n```\n\n### Methods\n\n<Callout name=\"danger-async-methods\" type=\"danger\" />\n\nActivates your content as a tab element.\n\nYou can create a tab instance with the constructor, for example:\n\n```js\nconst bsTab = new bootstrap.Tab('#myTab')\n```\n\n<BsTable>\n| Method | Description |\n| --- | --- |\n| `dispose` | Destroys an element’s tab. |\n| `getInstance` | Static method which allows you to get the tab instance associated with a DOM element, you can use it like this: `bootstrap.Tab.getInstance(element)`. |\n| `getOrCreateInstance` | Static method which returns a tab instance associated to a DOM element or create a new one in case it wasn’t initialized. You can use it like this: `bootstrap.Tab.getOrCreateInstance(element)`. |\n| `show` | Selects the given tab and shows its associated pane. Any other tab that was previously selected becomes unselected and its associated pane is hidden. **Returns to the caller before the tab pane has actually been shown** (i.e. before the `shown.bs.tab` event occurs). |\n</BsTable>\n\n### Events\n\nWhen showing a new tab, the events fire in the following order:\n\n1. `hide.bs.tab` (on the current active tab)\n2. `show.bs.tab` (on the to-be-shown tab)\n3. `hidden.bs.tab` (on the previous active tab, the same one as for the `hide.bs.tab` event)\n4. `shown.bs.tab` (on the newly-active just-shown tab, the same one as for the `show.bs.tab` event)\n\nIf no tab was already active, then the `hide.bs.tab` and `hidden.bs.tab` events will not be fired.\n\n<BsTable>\n| Event type | Description |\n| --- | --- |\n| `hide.bs.tab` | This event fires when a new tab is to be shown (and thus the previous active tab is to be hidden). Use `event.target` and `event.relatedTarget` to target the current active tab and the new soon-to-be-active tab, respectively. |\n| `hidden.bs.tab` | This event fires after a new tab is shown (and thus the previous active tab is hidden). Use `event.target` and `event.relatedTarget` to target the previous active tab and the new active tab, respectively. |\n| `show.bs.tab` | This event fires on tab show, but before the new tab has been shown. Use `event.target` and `event.relatedTarget` to target the active tab and the previous active tab (if available) respectively. |\n| `shown.bs.tab` | This event fires on tab show after a tab has been shown. Use `event.target` and `event.relatedTarget` to target the active tab and the previous active tab (if available) respectively. |\n</BsTable>\n\n```js\nconst tabEl = document.querySelector('button[data-bs-toggle=\"tab\"]')\ntabEl.addEventListener('shown.bs.tab', event => {\n  event.target // newly activated tab\n  event.relatedTarget // previous active tab\n})\n```\n"
  },
  {
    "path": "site/src/content/docs/components/offcanvas.mdx",
    "content": "---\ntitle: Offcanvas\ndescription: Build hidden sidebars into your project for navigation, shopping carts, and more with a few classes and our JavaScript plugin.\ntoc: true\n---\n\n## How it works\n\nOffcanvas is a sidebar component that can be toggled via JavaScript to appear from the left, right, top, or bottom edge of the viewport. Buttons or anchors are used as triggers that are attached to specific elements you toggle, and `data` attributes are used to invoke our JavaScript.\n\n- Offcanvas shares some of the same JavaScript code as modals. Conceptually, they are quite similar, but they are separate plugins.\n- Similarly, some [source Sass](#sass-variables) variables for offcanvas’s styles and dimensions are inherited from the modal’s variables.\n- When shown, offcanvas includes a default backdrop that can be clicked to hide the offcanvas.\n- Similar to modals, only one offcanvas can be shown at a time.\n\n**Heads up!** Given how CSS handles animations, you cannot use `margin` or `translate` on an `.offcanvas` element. Instead, use the class as an independent wrapping element.\n\n<Callout name=\"info-prefersreducedmotion\" />\n\n## Examples\n\n### Offcanvas components\n\nBelow is an offcanvas example that is shown by default (via `.show` on `.offcanvas`). Offcanvas includes support for a header with a close button and an optional body class for some initial `padding`. We suggest that you include offcanvas headers with dismiss actions whenever possible, or provide an explicit dismiss action.\n\n<Example class=\"bd-example-offcanvas p-0 bg-body-tertiary overflow-hidden\" code={`<div class=\"offcanvas offcanvas-start show\" tabindex=\"-1\" id=\"offcanvas\" aria-labelledby=\"offcanvasLabel\">\n    <div class=\"offcanvas-header\">\n      <h5 class=\"offcanvas-title\" id=\"offcanvasLabel\">Offcanvas</h5>\n      <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"offcanvas\" aria-label=\"Close\"></button>\n    </div>\n    <div class=\"offcanvas-body\">\n      Content for the offcanvas goes here. You can place just about any Bootstrap component or custom elements here.\n    </div>\n  </div>`} />\n\n### Live demo\n\nUse the buttons below to show and hide an offcanvas element via JavaScript that toggles the `.show` class on an element with the `.offcanvas` class.\n\n- `.offcanvas` hides content (default)\n- `.offcanvas.show` shows content\n\nYou can use a link with the `href` attribute, or a button with the `data-bs-target` attribute. In both cases, the `data-bs-toggle=\"offcanvas\"` is required.\n\n<Example code={`<a class=\"btn btn-primary\" data-bs-toggle=\"offcanvas\" href=\"#offcanvasExample\" role=\"button\" aria-controls=\"offcanvasExample\">\n    Link with href\n  </a>\n  <button class=\"btn btn-primary\" type=\"button\" data-bs-toggle=\"offcanvas\" data-bs-target=\"#offcanvasExample\" aria-controls=\"offcanvasExample\">\n    Button with data-bs-target\n  </button>\n\n  <div class=\"offcanvas offcanvas-start\" tabindex=\"-1\" id=\"offcanvasExample\" aria-labelledby=\"offcanvasExampleLabel\">\n    <div class=\"offcanvas-header\">\n      <h5 class=\"offcanvas-title\" id=\"offcanvasExampleLabel\">Offcanvas</h5>\n      <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"offcanvas\" aria-label=\"Close\"></button>\n    </div>\n    <div class=\"offcanvas-body\">\n      <div>\n        Some text as placeholder. In real life you can have the elements you have chosen. Like, text, images, lists, etc.\n      </div>\n      <div class=\"dropdown mt-3\">\n        <button class=\"btn btn-secondary dropdown-toggle\" type=\"button\" data-bs-toggle=\"dropdown\">\n          Dropdown button\n        </button>\n        <ul class=\"dropdown-menu\">\n          <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n          <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n          <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n        </ul>\n      </div>\n    </div>\n  </div>`} />\n\n### Body scrolling\n\nScrolling the `<body>` element is disabled when an offcanvas and its backdrop are visible. Use the `data-bs-scroll` attribute to enable `<body>` scrolling.\n\n<Example code={`<button class=\"btn btn-primary\" type=\"button\" data-bs-toggle=\"offcanvas\" data-bs-target=\"#offcanvasScrolling\" aria-controls=\"offcanvasScrolling\">Enable body scrolling</button>\n\n  <div class=\"offcanvas offcanvas-start\" data-bs-scroll=\"true\" data-bs-backdrop=\"false\" tabindex=\"-1\" id=\"offcanvasScrolling\" aria-labelledby=\"offcanvasScrollingLabel\">\n    <div class=\"offcanvas-header\">\n      <h5 class=\"offcanvas-title\" id=\"offcanvasScrollingLabel\">Offcanvas with body scrolling</h5>\n      <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"offcanvas\" aria-label=\"Close\"></button>\n    </div>\n    <div class=\"offcanvas-body\">\n      <p>Try scrolling the rest of the page to see this option in action.</p>\n    </div>\n  </div>`} />\n\n### Body scrolling and backdrop\n\nYou can also enable `<body>` scrolling with a visible backdrop.\n\n<Example code={`<button class=\"btn btn-primary\" type=\"button\" data-bs-toggle=\"offcanvas\" data-bs-target=\"#offcanvasWithBothOptions\" aria-controls=\"offcanvasWithBothOptions\">Enable both scrolling & backdrop</button>\n\n  <div class=\"offcanvas offcanvas-start\" data-bs-scroll=\"true\" tabindex=\"-1\" id=\"offcanvasWithBothOptions\" aria-labelledby=\"offcanvasWithBothOptionsLabel\">\n    <div class=\"offcanvas-header\">\n      <h5 class=\"offcanvas-title\" id=\"offcanvasWithBothOptionsLabel\">Backdrop with scrolling</h5>\n      <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"offcanvas\" aria-label=\"Close\"></button>\n    </div>\n    <div class=\"offcanvas-body\">\n      <p>Try scrolling the rest of the page to see this option in action.</p>\n    </div>\n  </div>`} />\n\n### Static backdrop\n\nWhen backdrop is set to static, the offcanvas will not close when clicking outside of it.\n\n<Example code={`<button class=\"btn btn-primary\" type=\"button\" data-bs-toggle=\"offcanvas\" data-bs-target=\"#staticBackdrop\" aria-controls=\"staticBackdrop\">\n    Toggle static offcanvas\n  </button>\n\n  <div class=\"offcanvas offcanvas-start\" data-bs-backdrop=\"static\" tabindex=\"-1\" id=\"staticBackdrop\" aria-labelledby=\"staticBackdropLabel\">\n    <div class=\"offcanvas-header\">\n      <h5 class=\"offcanvas-title\" id=\"staticBackdropLabel\">Offcanvas</h5>\n      <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"offcanvas\" aria-label=\"Close\"></button>\n    </div>\n    <div class=\"offcanvas-body\">\n      <div>\n        I will not close if you click outside of me.\n      </div>\n    </div>\n  </div>`} />\n\n## Dark offcanvas\n\n<DeprecatedIn version=\"5.3.0\" /> <AddedIn version=\"5.2.0\" />\n\nChange the appearance of offcanvases with utilities to better match them to different contexts like dark navbars. Here we add `.text-bg-dark` to the `.offcanvas` and `.btn-close-white` to `.btn-close` for proper styling with a dark offcanvas. If you have dropdowns within, consider also adding `.dropdown-menu-dark` to `.dropdown-menu`.\n\n<Callout type=\"warning\">\n**Heads up!** Dark variants for components were deprecated in v5.3.0 with the introduction of color modes. Instead of manually adding classes mentioned above, set `data-bs-theme=\"dark\"` on the root element, a parent wrapper, or the component itself.\n</Callout>\n\n<Example class=\"bd-example-offcanvas p-0 bg-body-secondary overflow-hidden\" code={`<div class=\"offcanvas offcanvas-start show text-bg-dark\" tabindex=\"-1\" id=\"offcanvasDark\" aria-labelledby=\"offcanvasDarkLabel\">\n    <div class=\"offcanvas-header\">\n      <h5 class=\"offcanvas-title\" id=\"offcanvasDarkLabel\">Offcanvas</h5>\n      <button type=\"button\" class=\"btn-close btn-close-white\" data-bs-dismiss=\"offcanvasDark\" aria-label=\"Close\"></button>\n    </div>\n    <div class=\"offcanvas-body\">\n      <p>Place offcanvas content here.</p>\n    </div>\n  </div>`} />\n\n## Responsive\n\n<AddedIn version=\"5.2.0\" />\n\nResponsive offcanvas classes hide content outside the viewport from a specified breakpoint and down. Above that breakpoint, the contents within will behave as usual. For example, `.offcanvas-lg` hides content in an offcanvas below the `lg` breakpoint, but shows the content above the `lg` breakpoint. Responsive offcanvas classes are available for each breakpoint.\n\n- `.offcanvas`\n- `.offcanvas-sm`\n- `.offcanvas-md`\n- `.offcanvas-lg`\n- `.offcanvas-xl`\n- `.offcanvas-xxl`\n\nTo make a responsive offcanvas, replace the `.offcanvas` base class with a responsive variant and ensure your close button has an explicit `data-bs-target`.\n\n<Example code={`<button class=\"btn btn-primary d-lg-none\" type=\"button\" data-bs-toggle=\"offcanvas\" data-bs-target=\"#offcanvasResponsive\" aria-controls=\"offcanvasResponsive\">Toggle offcanvas</button>\n\n  <div class=\"alert alert-info d-none d-lg-block\">Resize your browser to show the responsive offcanvas toggle.</div>\n\n  <div class=\"offcanvas-lg offcanvas-end\" tabindex=\"-1\" id=\"offcanvasResponsive\" aria-labelledby=\"offcanvasResponsiveLabel\">\n    <div class=\"offcanvas-header\">\n      <h5 class=\"offcanvas-title\" id=\"offcanvasResponsiveLabel\">Responsive offcanvas</h5>\n      <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"offcanvas\" data-bs-target=\"#offcanvasResponsive\" aria-label=\"Close\"></button>\n    </div>\n    <div class=\"offcanvas-body\">\n      <p class=\"mb-0\">This is content within an <code>.offcanvas-lg</code>.</p>\n    </div>\n  </div>`} />\n\n## Placement\n\nThere’s no default placement for offcanvas components, so you must add one of the modifier classes below.\n\n- `.offcanvas-start` places offcanvas on the left of the viewport (shown above)\n- `.offcanvas-end` places offcanvas on the right of the viewport\n- `.offcanvas-top` places offcanvas on the top of the viewport\n- `.offcanvas-bottom` places offcanvas on the bottom of the viewport\n\nTry the top, right, and bottom examples out below.\n\n<Example code={`<button class=\"btn btn-primary\" type=\"button\" data-bs-toggle=\"offcanvas\" data-bs-target=\"#offcanvasTop\" aria-controls=\"offcanvasTop\">Toggle top offcanvas</button>\n\n  <div class=\"offcanvas offcanvas-top\" tabindex=\"-1\" id=\"offcanvasTop\" aria-labelledby=\"offcanvasTopLabel\">\n    <div class=\"offcanvas-header\">\n      <h5 class=\"offcanvas-title\" id=\"offcanvasTopLabel\">Offcanvas top</h5>\n      <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"offcanvas\" aria-label=\"Close\"></button>\n    </div>\n    <div class=\"offcanvas-body\">\n      ...\n    </div>\n  </div>`} />\n\n<Example code={`<button class=\"btn btn-primary\" type=\"button\" data-bs-toggle=\"offcanvas\" data-bs-target=\"#offcanvasRight\" aria-controls=\"offcanvasRight\">Toggle right offcanvas</button>\n\n  <div class=\"offcanvas offcanvas-end\" tabindex=\"-1\" id=\"offcanvasRight\" aria-labelledby=\"offcanvasRightLabel\">\n    <div class=\"offcanvas-header\">\n      <h5 class=\"offcanvas-title\" id=\"offcanvasRightLabel\">Offcanvas right</h5>\n      <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"offcanvas\" aria-label=\"Close\"></button>\n    </div>\n    <div class=\"offcanvas-body\">\n      ...\n    </div>\n  </div>`} />\n\n<Example code={`<button class=\"btn btn-primary\" type=\"button\" data-bs-toggle=\"offcanvas\" data-bs-target=\"#offcanvasBottom\" aria-controls=\"offcanvasBottom\">Toggle bottom offcanvas</button>\n\n  <div class=\"offcanvas offcanvas-bottom\" tabindex=\"-1\" id=\"offcanvasBottom\" aria-labelledby=\"offcanvasBottomLabel\">\n    <div class=\"offcanvas-header\">\n      <h5 class=\"offcanvas-title\" id=\"offcanvasBottomLabel\">Offcanvas bottom</h5>\n      <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"offcanvas\" aria-label=\"Close\"></button>\n    </div>\n    <div class=\"offcanvas-body small\">\n      ...\n    </div>\n  </div>`} />\n\n## Accessibility\n\nSince the offcanvas panel is conceptually a modal dialog, be sure to add `aria-labelledby=\"...\"`—referencing the offcanvas title—to `.offcanvas`. Note that you don’t need to add `role=\"dialog\"` since we already add it via JavaScript.\n\n## CSS\n\n### Variables\n\n<AddedIn version=\"5.2.0\" />\n\nAs part of Bootstrap’s evolving CSS variables approach, offcanvas now uses local CSS variables on `.offcanvas` for enhanced real-time customization. Values for the CSS variables are set via Sass, so Sass customization is still supported, too.\n\n<ScssDocs name=\"offcanvas-css-vars\" file=\"scss/_offcanvas.scss\" />\n\n### Sass variables\n\n<ScssDocs name=\"offcanvas-variables\" file=\"scss/_variables.scss\" />\n\n## Usage\n\nThe offcanvas plugin utilizes a few classes and attributes to handle the heavy lifting:\n\n- `.offcanvas` hides the content\n- `.offcanvas.show` shows the content\n- `.offcanvas-start` hides the offcanvas on the left\n- `.offcanvas-end` hides the offcanvas on the right\n- `.offcanvas-top` hides the offcanvas on the top\n- `.offcanvas-bottom` hides the offcanvas on the bottom\n\nAdd a dismiss button with the `data-bs-dismiss=\"offcanvas\"` attribute, which triggers the JavaScript functionality. Be sure to use the `<button>` element with it for proper behavior across all devices.\n\n### Via data attributes\n\n#### Toggle\n\nAdd `data-bs-toggle=\"offcanvas\"` and a `data-bs-target` or `href` to the element to automatically assign control of one offcanvas element. The `data-bs-target` attribute accepts a CSS selector to apply the offcanvas to. Be sure to add the class `offcanvas` to the offcanvas element. If you’d like it to default open, add the additional class `show`.\n\n#### Dismiss\n\n<JsDismiss name=\"offcanvas\" />\n\n<Callout type=\"warning\">\nWhile both ways to dismiss an offcanvas are supported, keep in mind that dismissing from outside an offcanvas does not match the [ARIA Authoring Practices Guide dialog (modal) pattern](https://www.w3.org/WAI/ARIA/apg/patterns/dialogmodal/). Do this at your own risk.\n</Callout>\n\n### Via JavaScript\n\nEnable manually with:\n\n```js\nconst offcanvasElementList = document.querySelectorAll('.offcanvas')\nconst offcanvasList = [...offcanvasElementList].map(offcanvasEl => new bootstrap.Offcanvas(offcanvasEl))\n```\n\n### Options\n\n<JsDataAttributes />\n\n<BsTable>\n| Name | Type | Default | Description |\n| --- | --- | --- | --- |\n| `backdrop` | boolean or the string `static` | `true` | Apply a backdrop on body while offcanvas is open. Alternatively, specify `static` for a backdrop which doesn’t close the offcanvas when clicked. |\n| `keyboard` | boolean | `true` | Closes the offcanvas when escape key is pressed. |\n| `scroll` | boolean | `false` | Allow body scrolling while offcanvas is open. |\n</BsTable>\n\n### Methods\n\n<Callout name=\"danger-async-methods\" type=\"danger\" />\n\nActivates your content as an offcanvas element. Accepts an optional options `object`.\n\nYou can create an offcanvas instance with the constructor, for example:\n\n```js\nconst bsOffcanvas = new bootstrap.Offcanvas('#myOffcanvas')\n```\n\n<BsTable>\n| Method | Description |\n| --- | --- |\n| `dispose` | Destroys an element’s offcanvas. |\n| `getInstance` | *Static* method which allows you to get the offcanvas instance associated with a DOM element. |\n| `getOrCreateInstance` | *Static* method which allows you to get the offcanvas instance associated with a DOM element, or create a new one in case it wasn’t initialized. |\n| `hide` | Hides an offcanvas element. **Returns to the caller before the offcanvas element has actually been hidden** (i.e. before the `hidden.bs.offcanvas` event occurs). |\n| `show` | Shows an offcanvas element. **Returns to the caller before the offcanvas element has actually been shown** (i.e. before the `shown.bs.offcanvas` event occurs). |\n| `toggle` | Toggles an offcanvas element to shown or hidden. **Returns to the caller before the offcanvas element has actually been shown or hidden** (i.e. before the `shown.bs.offcanvas` or `hidden.bs.offcanvas` event occurs). |\n</BsTable>\n\n### Events\n\nBootstrap’s offcanvas class exposes a few events for hooking into offcanvas functionality.\n\n<BsTable>\n| Event type | Description |\n| --- | --- |\n| `hide.bs.offcanvas` | This event is fired immediately when the `hide` method has been called. |\n| `hidden.bs.offcanvas` | This event is fired when an offcanvas element has been hidden from the user (will wait for CSS transitions to complete). |\n| `hidePrevented.bs.offcanvas` | This event is fired when the offcanvas is shown, its backdrop is `static` and a click outside of the offcanvas is performed. The event is also fired when the escape key is pressed and the `keyboard` option is set to `false`. |\n| `show.bs.offcanvas` | This event fires immediately when the `show` instance method is called. |\n| `shown.bs.offcanvas` | This event is fired when an offcanvas element has been made visible to the user (will wait for CSS transitions to complete). |\n</BsTable>\n\n```js\nconst myOffcanvas = document.getElementById('myOffcanvas')\nmyOffcanvas.addEventListener('hidden.bs.offcanvas', event => {\n  // do something...\n})\n```\n"
  },
  {
    "path": "site/src/content/docs/components/pagination.mdx",
    "content": "---\ntitle: Pagination\ndescription: Documentation and examples for showing pagination to indicate a series of related content exists across multiple pages.\ntoc: true\n---\n\n## Overview\n\nWe use a large block of connected links for our pagination, making links hard to miss and easily scalable—all while providing large hit areas. Pagination is built with list HTML elements so screen readers can announce the number of available links. Use a wrapping `<nav>` element to identify it as a navigation section to screen readers and other assistive technologies.\n\nIn addition, as pages likely have more than one such navigation section, it’s advisable to provide a descriptive `aria-label` for the `<nav>` to reflect its purpose. For example, if the pagination component is used to navigate between a set of search results, an appropriate label could be `aria-label=\"Search results pages\"`.\n\n<Example code={`<nav aria-label=\"Page navigation example\">\n    <ul class=\"pagination\">\n      <li class=\"page-item\"><a class=\"page-link\" href=\"#\">Previous</a></li>\n      <li class=\"page-item\"><a class=\"page-link\" href=\"#\">1</a></li>\n      <li class=\"page-item\"><a class=\"page-link\" href=\"#\">2</a></li>\n      <li class=\"page-item\"><a class=\"page-link\" href=\"#\">3</a></li>\n      <li class=\"page-item\"><a class=\"page-link\" href=\"#\">Next</a></li>\n    </ul>\n  </nav>`} />\n\n## Working with icons\n\nLooking to use an icon or symbol in place of text for some pagination links? Be sure to provide proper screen reader support with `aria` attributes.\n\n<Example code={`<nav aria-label=\"Page navigation example\">\n    <ul class=\"pagination\">\n      <li class=\"page-item\">\n        <a class=\"page-link\" href=\"#\" aria-label=\"Previous\">\n          <span aria-hidden=\"true\">&laquo;</span>\n        </a>\n      </li>\n      <li class=\"page-item\"><a class=\"page-link\" href=\"#\">1</a></li>\n      <li class=\"page-item\"><a class=\"page-link\" href=\"#\">2</a></li>\n      <li class=\"page-item\"><a class=\"page-link\" href=\"#\">3</a></li>\n      <li class=\"page-item\">\n        <a class=\"page-link\" href=\"#\" aria-label=\"Next\">\n          <span aria-hidden=\"true\">&raquo;</span>\n        </a>\n      </li>\n    </ul>\n  </nav>`} />\n\n## Active\n\nAdd `.active` to indicate a `.page-item` is the one currently being viewed. If using an `<a>` on the current page, `aria-current=\"page\"` should be added for assistive technologies.\n\n<Example code={`<nav aria-label=\"...\">\n    <ul class=\"pagination\">\n      <li class=\"page-item\"><a href=\"#\" class=\"page-link\">Previous</a></li>\n      <li class=\"page-item\"><a class=\"page-link\" href=\"#\">1</a></li>\n      <li class=\"page-item active\">\n        <a class=\"page-link\" href=\"#\" aria-current=\"page\">2</a>\n      </li>\n      <li class=\"page-item\"><a class=\"page-link\" href=\"#\">3</a></li>\n      <li class=\"page-item\"><a class=\"page-link\" href=\"#\">Next</a></li>\n    </ul>\n  </nav>`} />\n\nIf using a non-interactive element, like a `<span>` for the current page, you may omit the `aria-current` attribute.\n\n```html\n<li class=\"page-item active\">\n  <span class=\"page-link\">2</span>\n</li>\n```\n\n## Disabled\n\nAdd `.disabled` to a `.page-item` to make it appear un-clickable. While `.disabled` uses `pointer-events: none` to disable the link‘s interactivity, that CSS property is not yet standardized and doesn’t account for keyboard navigation. As such, you should always add `tabindex=\"-1\"` on disabled links and use custom JavaScript to fully disable their functionality.\n\n<Example code={`<nav aria-label=\"...\">\n    <ul class=\"pagination\">\n      <li class=\"page-item disabled\">\n        <a class=\"page-link\">Previous</a>\n      </li>\n      <li class=\"page-item\"><a class=\"page-link\" href=\"#\">1</a></li>\n      <li class=\"page-item active\">\n        <a class=\"page-link\" href=\"#\" aria-current=\"page\">2</a>\n      </li>\n      <li class=\"page-item\"><a class=\"page-link\" href=\"#\">3</a></li>\n      <li class=\"page-item\">\n        <a class=\"page-link\" href=\"#\">Next</a>\n      </li>\n    </ul>\n  </nav>`} />\n\nAnd just like active page items, you can swap out the disabled `<a>` for a `<span>` to remove click functionality and prevent keyboard focus while retaining intended styles.\n\n```html\n<li class=\"page-item disabled\">\n  <span class=\"page-link\">Previous</span>\n</li>\n```\n\n## Sizing\n\nFancy larger or smaller pagination? Add `.pagination-lg` or `.pagination-sm` for additional sizes.\n\n<Example code={`<nav aria-label=\"...\">\n    <ul class=\"pagination pagination-lg\">\n      <li class=\"page-item active\" >\n        <a class=\"page-link\" aria-current=\"page\">1</a>\n      </li>\n      <li class=\"page-item\"><a class=\"page-link\" href=\"#\">2</a></li>\n      <li class=\"page-item\"><a class=\"page-link\" href=\"#\">3</a></li>\n    </ul>\n  </nav>`} />\n\n<Example code={`<nav aria-label=\"...\">\n    <ul class=\"pagination pagination-sm\">\n      <li class=\"page-item active\">\n        <a class=\"page-link\" aria-current=\"page\">1</a>\n      </li>\n      <li class=\"page-item\"><a class=\"page-link\" href=\"#\">2</a></li>\n      <li class=\"page-item\"><a class=\"page-link\" href=\"#\">3</a></li>\n    </ul>\n  </nav>`} />\n\n## Alignment\n\nChange the alignment of pagination components with [flexbox utilities]([[docsref:/utilities/flex]]). For example, with `.justify-content-center`:\n\n<Example code={`<nav aria-label=\"Page navigation example\">\n    <ul class=\"pagination justify-content-center\">\n      <li class=\"page-item disabled\">\n        <a class=\"page-link\">Previous</a>\n      </li>\n      <li class=\"page-item\"><a class=\"page-link\" href=\"#\">1</a></li>\n      <li class=\"page-item\"><a class=\"page-link\" href=\"#\">2</a></li>\n      <li class=\"page-item\"><a class=\"page-link\" href=\"#\">3</a></li>\n      <li class=\"page-item\">\n        <a class=\"page-link\" href=\"#\">Next</a>\n      </li>\n    </ul>\n  </nav>`} />\n\nOr with `.justify-content-end`:\n\n<Example code={`<nav aria-label=\"Page navigation example\">\n    <ul class=\"pagination justify-content-end\">\n      <li class=\"page-item disabled\">\n        <a class=\"page-link\">Previous</a>\n      </li>\n      <li class=\"page-item\"><a class=\"page-link\" href=\"#\">1</a></li>\n      <li class=\"page-item\"><a class=\"page-link\" href=\"#\">2</a></li>\n      <li class=\"page-item\"><a class=\"page-link\" href=\"#\">3</a></li>\n      <li class=\"page-item\">\n        <a class=\"page-link\" href=\"#\">Next</a>\n      </li>\n    </ul>\n  </nav>`} />\n\n## CSS\n\n### Variables\n\n<AddedIn version=\"5.2.0\" />\n\nAs part of Bootstrap’s evolving CSS variables approach, pagination now uses local CSS variables on `.pagination` for enhanced real-time customization. Values for the CSS variables are set via Sass, so Sass customization is still supported, too.\n\n<ScssDocs name=\"pagination-css-vars\" file=\"scss/_pagination.scss\" />\n\n### Sass variables\n\n<ScssDocs name=\"pagination-variables\" file=\"scss/_variables.scss\" />\n\n### Sass mixins\n\n<ScssDocs name=\"pagination-mixin\" file=\"scss/mixins/_pagination.scss\" />\n"
  },
  {
    "path": "site/src/content/docs/components/placeholders.mdx",
    "content": "---\ntitle: Placeholders\ndescription: Use loading placeholders (skeleton loaders) for your components or pages to indicate something may still be loading.\ntoc: true\nadded:\n  version: \"5.1\"\n---\n\nimport { getData } from '@libs/data'\n\n## About\n\nPlaceholders can be used to enhance the experience of your application. They’re built only with HTML and CSS, meaning you don’t need any JavaScript to create them. You will, however, need some custom JavaScript to toggle their visibility. Their appearance, color, and sizing can be easily customized with our utility classes.\n\n## Example\n\nIn the example below, we take a typical card component and recreate it with placeholders applied to create a “loading card”. Size and proportions are the same between the two.\n\n<Example showMarkup={false} class=\"bd-example-placeholder-cards d-flex justify-content-around\" code={`<div class=\"card\">\n    <Placeholder width=\"100%\" height=\"180\" class=\"card-img-top\" text={false} background=\"#20c997\" />\n    <div class=\"card-body\">\n      <h5 class=\"card-title\">Card title</h5>\n      <p class=\"card-text\">Some quick example text to build on the card title and make up the bulk of the card’s content.</p>\n      <a href=\"#\" class=\"btn btn-primary\">Go somewhere</a>\n    </div>\n  </div>\n\n  <div class=\"card\" aria-hidden=\"true\">\n    <Placeholder width=\"100%\" height=\"180\" class=\"card-img-top\" text={false} />\n    <div class=\"card-body\">\n      <div class=\"h5 card-title placeholder-glow\">\n        <span class=\"placeholder col-6\"></span>\n      </div>\n      <p class=\"card-text placeholder-glow\">\n        <span class=\"placeholder col-7\"></span>\n        <span class=\"placeholder col-4\"></span>\n        <span class=\"placeholder col-4\"></span>\n        <span class=\"placeholder col-6\"></span>\n        <span class=\"placeholder col-8\"></span>\n      </p>\n      <a class=\"btn btn-primary disabled placeholder col-6\" aria-disabled=\"true\"></a>\n    </div>\n  </div>`} />\n\n```html\n<div class=\"card\">\n  <img src=\"...\" class=\"card-img-top\" alt=\"...\">\n\n  <div class=\"card-body\">\n    <h5 class=\"card-title\">Card title</h5>\n    <p class=\"card-text\">Some quick example text to build on the card title and make up the bulk of the card’s content.</p>\n    <a href=\"#\" class=\"btn btn-primary\">Go somewhere</a>\n  </div>\n</div>\n\n<div class=\"card\" aria-hidden=\"true\">\n  <img src=\"...\" class=\"card-img-top\" alt=\"...\">\n  <div class=\"card-body\">\n    <h5 class=\"card-title placeholder-glow\">\n      <span class=\"placeholder col-6\"></span>\n    </h5>\n    <p class=\"card-text placeholder-glow\">\n      <span class=\"placeholder col-7\"></span>\n      <span class=\"placeholder col-4\"></span>\n      <span class=\"placeholder col-4\"></span>\n      <span class=\"placeholder col-6\"></span>\n      <span class=\"placeholder col-8\"></span>\n    </p>\n    <a class=\"btn btn-primary disabled placeholder col-6\" aria-disabled=\"true\"></a>\n  </div>\n</div>\n```\n\n## How it works\n\nCreate placeholders with the `.placeholder` class and a grid column class (e.g., `.col-6`) to set the `width`. They can replace the text inside an element or be added as a modifier class to an existing component.\n\nWe apply additional styling to `.btn`s via `::before` to ensure the `height` is respected. You may extend this pattern for other situations as needed, or add a `&nbsp;` within the element to reflect the height when actual text is rendered in its place.\n\n<Example code={`<p aria-hidden=\"true\">\n    <span class=\"placeholder col-6\"></span>\n  </p>\n\n  <a class=\"btn btn-primary disabled placeholder col-4\" aria-disabled=\"true\"></a>`} />\n\n<Callout>\nThe use of `aria-hidden=\"true\"` only indicates that the element should be hidden to screen readers. The *loading* behavior of the placeholder depends on how authors will actually use the placeholder styles, how they plan to update things, etc. Some JavaScript code may be needed to *swap* the state of the placeholder and inform AT users of the update.\n</Callout>\n\n### Width\n\nYou can change the `width` through grid column classes, width utilities, or inline styles.\n\n<Example code={`<span class=\"placeholder col-6\"></span>\n<span class=\"placeholder w-75\"></span>\n<span class=\"placeholder\" style=\"width: 25%;\"></span>`} />\n\n### Color\n\nBy default, the `placeholder` uses `currentColor`. This can be overridden with a custom color or utility class.\n\n<Example code={[\n  `<span class=\"placeholder col-12\"></span>\n  `,\n  ...getData('theme-colors').map((themeColor) => `<span class=\"placeholder col-12 bg-${themeColor.name}\"></span>`)\n]} />\n\n### Sizing\n\nThe size of `.placeholder`s are based on the typographic style of the parent element. Customize them with sizing modifiers: `.placeholder-lg`, `.placeholder-sm`, or `.placeholder-xs`.\n\n<Example code={`<span class=\"placeholder col-12 placeholder-lg\"></span>\n<span class=\"placeholder col-12\"></span>\n<span class=\"placeholder col-12 placeholder-sm\"></span>\n<span class=\"placeholder col-12 placeholder-xs\"></span>`} />\n\n### Animation\n\nAnimate placeholders with `.placeholder-glow` or `.placeholder-wave` to better convey the perception of something being *actively* loaded.\n\n<Example code={`<p class=\"placeholder-glow\">\n    <span class=\"placeholder col-12\"></span>\n  </p>\n\n  <p class=\"placeholder-wave\">\n    <span class=\"placeholder col-12\"></span>\n  </p>`} />\n\n## CSS\n\n### Sass variables\n\n<ScssDocs name=\"placeholders\" file=\"scss/_variables.scss\" />\n"
  },
  {
    "path": "site/src/content/docs/components/popovers.mdx",
    "content": "---\ntitle: Popovers\ndescription: Documentation and examples for adding Bootstrap popovers, like those found in iOS, to any element on your site.\ntoc: true\n---\n\n## Overview\n\nThings to know when using the popover plugin:\n\n- Popovers rely on the third party library [Popper](https://popper.js.org/docs/v2/) for positioning. You must include [popper.min.js]([[config:cdn.popper]]) before `bootstrap.js`, or use one `bootstrap.bundle.min.js` which contains Popper.\n- Popovers require the [popover plugin]([[docsref:/components/popovers]]) as a dependency.\n- Popovers are opt-in for performance reasons, so **you must initialize them yourself**.\n- Zero-length `title` and `content` values will never show a popover.\n- Specify `container: 'body'` to avoid rendering problems in more complex components (like our input groups, button groups, etc).\n- Triggering popovers on hidden elements will not work.\n- Popovers for `.disabled` or `disabled` elements must be triggered on a wrapper element.\n- When triggered from anchors that wrap across multiple lines, popovers will be centered between the anchors’ overall width. Use `.text-nowrap` on your `<a>`s to avoid this behavior.\n- Popovers must be hidden before their corresponding elements have been removed from the DOM.\n- Popovers can be triggered thanks to an element inside a shadow DOM.\n\n<Callout name=\"info-sanitizer\" />\n\n<Callout name=\"info-prefersreducedmotion\" />\n\nKeep reading to see how popovers work with some examples.\n\n## Examples\n\n### Enable popovers\n\nAs mentioned above, you must initialize popovers before they can be used. One way to initialize all popovers on a page would be to select them by their `data-bs-toggle` attribute, like so:\n\n```js\nconst popoverTriggerList = document.querySelectorAll('[data-bs-toggle=\"popover\"]')\nconst popoverList = [...popoverTriggerList].map(popoverTriggerEl => new bootstrap.Popover(popoverTriggerEl))\n```\n\n### Live demo\n\nWe use JavaScript similar to the snippet above to render the following live popover. Titles are set via `data-bs-title` and body content is set via `data-bs-content`.\n\n<Callout name=\"warning-data-bs-title-vs-title\" type=\"warning\" />\n\n<Example addStackblitzJs code={`<button type=\"button\" class=\"btn btn-lg btn-danger\" data-bs-toggle=\"popover\" data-bs-title=\"Popover title\" data-bs-content=\"And here’s some amazing content. It’s very engaging. Right?\">Click to toggle popover</button>`} />\n\n### Four directions\n\nFour options are available: top, right, bottom, and left. Directions are mirrored when using Bootstrap in RTL. Set `data-bs-placement` to change the direction.\n\n<Example addStackblitzJs code={`<button type=\"button\" class=\"btn btn-secondary\" data-bs-container=\"body\" data-bs-toggle=\"popover\" data-bs-placement=\"top\" data-bs-content=\"Top popover\">\n    Popover on top\n  </button>\n  <button type=\"button\" class=\"btn btn-secondary\" data-bs-container=\"body\" data-bs-toggle=\"popover\" data-bs-placement=\"right\" data-bs-content=\"Right popover\">\n    Popover on right\n  </button>\n  <button type=\"button\" class=\"btn btn-secondary\" data-bs-container=\"body\" data-bs-toggle=\"popover\" data-bs-placement=\"bottom\" data-bs-content=\"Bottom popover\">\n    Popover on bottom\n  </button>\n  <button type=\"button\" class=\"btn btn-secondary\" data-bs-container=\"body\" data-bs-toggle=\"popover\" data-bs-placement=\"left\" data-bs-content=\"Left popover\">\n    Popover on left\n  </button>`} />\n\n### Custom `container`\n\nWhen you have some styles on a parent element that interfere with a popover, you’ll want to specify a custom `container` so that the popover’s HTML appears within that element instead. This is common in responsive tables, input groups, and the like.\n\n```js\nconst popover = new bootstrap.Popover('.example-popover', {\n  container: 'body'\n})\n```\n\nAnother situation where you’ll want to set an explicit custom `container` are popovers inside a [modal dialog]([[docsref:/components/modal]]), to make sure that the popover itself is appended to the modal. This is particularly important for popovers that contain interactive elements – modal dialogs will trap focus, so unless the popover is a child element of the modal, users won’t be able to focus or activate these interactive elements.\n\n```js\nconst popover = new bootstrap.Popover('.example-popover', {\n  container: '.modal-body'\n})\n```\n\n### Custom popovers\n\n<AddedIn version=\"5.2.0\" />\n\nYou can customize the appearance of popovers using [CSS variables](#variables). We set a custom class with `data-bs-custom-class=\"custom-popover\"` to scope our custom appearance and use it to override some of the local CSS variables.\n\n<ScssDocs name=\"custom-popovers\" file=\"site/src/scss/_component-examples.scss\" />\n\n<Example addStackblitzJs class=\"custom-popover-demo\" code={`<button type=\"button\" class=\"btn btn-secondary\"\n          data-bs-toggle=\"popover\" data-bs-placement=\"right\"\n          data-bs-custom-class=\"custom-popover\"\n          data-bs-title=\"Custom popover\"\n          data-bs-content=\"This popover is themed via CSS variables.\">\n    Custom popover\n  </button>`} />\n\n### Dismiss on next click\n\nUse the `focus` trigger to dismiss popovers on the user’s next click of an element other than the toggle element.\n\n<Callout type=\"danger\">\n**Dismissing on next click requires specific HTML for proper cross-browser and cross-platform behavior.** You can only use `<a>` elements, not `<button>`s, and you must include a [`tabindex`](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/tabindex).\n</Callout>\n\n<Example addStackblitzJs code={`<a tabindex=\"0\" class=\"btn btn-lg btn-danger\" role=\"button\" data-bs-toggle=\"popover\" data-bs-trigger=\"focus\" data-bs-title=\"Dismissible popover\" data-bs-content=\"And here’s some amazing content. It’s very engaging. Right?\">Dismissible popover</a>`} />\n\n```js\nconst popover = new bootstrap.Popover('.popover-dismiss', {\n  trigger: 'focus'\n})\n```\n\n### Disabled elements\n\nElements with the `disabled` attribute aren’t interactive, meaning users cannot hover or click them to trigger a popover (or tooltip). As a workaround, you’ll want to trigger the popover from a wrapper `<div>` or `<span>`, ideally made keyboard-focusable using `tabindex=\"0\"`.\n\nFor disabled popover triggers, you may also prefer `data-bs-trigger=\"hover focus\"` so that the popover appears as immediate visual feedback to your users as they may not expect to _click_ on a disabled element.\n\n<Example addStackblitzJs code={`<span class=\"d-inline-block\" tabindex=\"0\" data-bs-toggle=\"popover\" data-bs-trigger=\"hover focus\" data-bs-content=\"Disabled popover\">\n    <button class=\"btn btn-primary\" type=\"button\" disabled>Disabled button</button>\n  </span>`} />\n\n## CSS\n\n### Variables\n\n<AddedIn version=\"5.2.0\" />\n\nAs part of Bootstrap’s evolving CSS variables approach, popovers now use local CSS variables on `.popover` for enhanced real-time customization. Values for the CSS variables are set via Sass, so Sass customization is still supported, too.\n\n<ScssDocs name=\"popover-css-vars\" file=\"scss/_popover.scss\" />\n\n### Sass variables\n\n<ScssDocs name=\"popover-variables\" file=\"scss/_variables.scss\" />\n\n## Usage\n\nEnable popovers via JavaScript:\n\n```js\nconst exampleEl = document.getElementById('example')\nconst popover = new bootstrap.Popover(exampleEl, options)\n```\n\n<Callout type=\"warning\">\n**Keep popovers accessible to keyboard and assistive technology users** by only adding them to HTML elements that are traditionally keyboard-focusable and interactive (such as links or form controls). While other HTML elements can be made focusable by adding `tabindex=\"0\"`, this can create annoying and confusing tab stops on non-interactive elements for keyboard users, and most assistive technologies currently do not announce popovers in this situation. Additionally, do not rely solely on `hover` as the trigger for your popovers as this will make them impossible to trigger for keyboard users.\n\nAvoid adding an excessive amount of content in popovers with the `html` option. Once popovers are displayed, their content is tied to the trigger element with the `aria-describedby` attribute, causing all of the popover’s content to be announced to assistive technology users as one long, uninterrupted stream.\n\nPopovers do not manage keyboard focus order, and their placement can be random in the DOM, so be careful when adding interactive elements (like forms or links), as it may lead to an illogical focus order or make the popover content itself completely unreachable for keyboard users. In cases where you must use these elements, consider using a modal dialog instead.\n</Callout>\n\n### Options\n\n<JsDataAttributes />\n\n<Callout type=\"warning\">\nNote that for security reasons the `sanitize`, `sanitizeFn`, and `allowList` options cannot be supplied using data attributes.\n</Callout>\n\n<BsTable>\n| Name | Type | Default | Description |\n| --- | --- | --- | --- |\n| `allowList` | object | [Default value]([[docsref:/getting-started/javascript#sanitizer]]) | An object containing allowed tags and attributes. Those not explicitly allowed will be removed by [the content sanitizer]([[docsref:/getting-started/javascript#sanitizer]]). <Callout type=\"warning\">**Exercise caution when adding to this list.** Refer to [OWASP’s Cross Site Scripting Prevention Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html) for more information.</Callout> |\n| `animation` | boolean | `true` | Apply a CSS fade transition to the popover. |\n| `boundary` | string, element | `'clippingParents'` | Overflow constraint boundary of the popover (applies only to Popper’s preventOverflow modifier). By default, it’s `'clippingParents'` and can accept an HTMLElement reference (via JavaScript only). For more information refer to Popper’s [detectOverflow docs](https://popper.js.org/docs/v2/utils/detect-overflow/#boundary). |\n| `container` | string, element, false | `false` | Appends the popover to a specific element. Example: `container: 'body'`. This option is particularly useful in that it allows you to position the popover in the flow of the document near the triggering element -&nbsp;which will prevent the popover from floating away from the triggering element during a window resize. |\n| `content` | string, element, function | `''` | The popover’s text content. If a function is given, it will be called with its `this` reference set to the element that the popover is attached to. |\n| `customClass` | string, function | `''` | Add classes to the popover when it is shown. Note that these classes will be added in addition to any classes specified in the template. To add multiple classes, separate them with spaces: `'class-1 class-2'`. You can also pass a function that should return a single string containing additional class names. |\n| `delay` | number, object | `0` | Delay showing and hiding the popover (ms)—doesn’t apply to manual trigger type. If a number is supplied, delay is applied to both hide/show. Object structure is: `delay: { \"show\": 500, \"hide\": 100 }`. |\n| `fallbackPlacements` | string, array | `['top', 'right', 'bottom', 'left']` | Define fallback placements by providing a list of placements in array (in order of preference). For more information refer to Popper’s [behavior docs](https://popper.js.org/docs/v2/modifiers/flip/#fallbackplacements). |\n| `html` | boolean | `false` | Allow HTML in the popover. If true, HTML tags in the popover’s `title` will be rendered in the popover. If false, `innerText` property will be used to insert content into the DOM. Prefer text when dealing with user-generated input to [prevent XSS attacks](https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html). |\n| `offset` | number, string, function | `[0, 8]` | Offset of the popover relative to its target. You can pass a string in data attributes with comma separated values like: `data-bs-offset=\"10,20\"`. When a function is used to determine the offset, it is called with an object containing the popper placement, the reference, and popper rects as its first argument. The triggering element DOM node is passed as the second argument. The function must return an array with two numbers: [skidding](https://popper.js.org/docs/v2/modifiers/offset/#skidding-1), [distance](https://popper.js.org/docs/v2/modifiers/offset/#distance-1). For more information refer to Popper’s [offset docs](https://popper.js.org/docs/v2/modifiers/offset/#options). |\n| `placement` | string, function | `'right'` | How to position the popover: auto, top, bottom, left, right. When `auto` is specified, it will dynamically reorient the popover. When a function is used to determine the placement, it is called with the popover DOM node as its first argument and the triggering element DOM node as its second. The `this` context is set to the popover instance. |\n| `popperConfig` | null, object, function | `null` | To change Bootstrap’s default Popper config, see [Popper’s configuration](https://popper.js.org/docs/v2/constructors/#options). When a function is used to create the Popper configuration, it’s called with an object that contains the Bootstrap’s default Popper configuration. It helps you use and merge the default with your own configuration. The function must return a configuration object for Popper. |\n| `sanitize` | boolean | `true` | Enable [content sanitization]([[docsref:/getting-started/javascript#sanitizer]]). If true, the `template`, `content` and `title` options will be sanitized. <Callout type=\"warning\">**Exercise caution when disabling content sanitization.** Refer to [OWASP’s Cross Site Scripting Prevention Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html) for more information. Vulnerabilities caused solely by disabling content sanitization are not considered within scope for Bootstrap’s security model.</Callout> |\n| `sanitizeFn` | null, function | `null` | Provide an alternative [content sanitization]([[docsref:/getting-started/javascript#sanitizer]]) function. This can be useful if you prefer to use a dedicated library to perform sanitization. |\n| `selector` | string, false | `false` | If a selector is provided, popover objects will be delegated to the specified targets. In practice, this is used to also apply popovers to dynamically added DOM elements (`jQuery.on` support). See [this issue]([[config:repo]]/issues/4215) and [an informative example](https://codepen.io/Johann-S/pen/djJYPb). **Note**: `title` attribute must not be used as a selector. |\n| `template` | string | `'<div class=\"popover\" role=\"tooltip\"><div class=\"popover-arrow\"></div><h3 class=\"popover-header\"></h3><div class=\"popover-body\"></div></div>'` | Base HTML to use when creating the popover. The popover’s `title` will be injected into the `.popover-header`. The popover’s `content` will be injected into the `.popover-body`. `.popover-arrow` will become the popover’s arrow. The outermost wrapper element should have the `.popover` class and `role=\"tooltip\"`. |\n| `title` | string, element, function | `''` | The popover title. If a function is given, it will be called with its `this` reference set to the element that the popover is attached to. |\n| `trigger` | string | `'click'` | How popover is triggered: click, hover, focus, manual. You may pass multiple triggers; separate them with a space. `'manual'` indicates that the popover will be triggered programmatically via the `.popover('show')`, `.popover('hide')` and `.popover('toggle')` methods; this value cannot be combined with any other trigger. `'hover'` on its own will result in popovers that cannot be triggered via the keyboard, and should only be used if alternative methods for conveying the same information for keyboard users is present. |\n</BsTable>\n\n<Callout>\n#### Data attributes for individual popovers\n\nOptions for individual popovers can alternatively be specified through the use of data attributes, as explained above.\n</Callout>\n\n#### Using function with `popperConfig`\n\n```js\nconst popover = new bootstrap.Popover(element, {\n  popperConfig(defaultBsPopperConfig) {\n    // const newPopperConfig = {...}\n    // use defaultBsPopperConfig if needed...\n    // return newPopperConfig\n  }\n})\n```\n\n### Methods\n\n<Callout name=\"danger-async-methods\" type=\"danger\" />\n\n<BsTable>\n| Method | Description |\n| --- | --- |\n| `disable` | Removes the ability for an element’s popover to be shown. The popover will only be able to be shown if it is re-enabled. |\n| `dispose` | Hides and destroys an element’s popover (Removes stored data on the DOM element). Popovers that use delegation (which are created using [the `selector` option](#options)) cannot be individually destroyed on descendant trigger elements. |\n| `enable` | Gives an element’s popover the ability to be shown. **Popovers are enabled by default.** |\n| `getInstance` | _Static_ method which allows you to get the popover instance associated with a DOM element. |\n| `getOrCreateInstance` | _Static_ method which allows you to get the popover instance associated with a DOM element, or create a new one in case it wasn’t initialized. |\n| `hide` | Hides an element’s popover. **Returns to the caller before the popover has actually been hidden** (i.e. before the `hidden.bs.popover` event occurs). This is considered a “manual” triggering of the popover. |\n| `setContent` | Gives a way to change the popover’s content after its initialization. |\n| `show` | Reveals an element’s popover. **Returns to the caller before the popover has actually been shown** (i.e. before the `shown.bs.popover` event occurs). This is considered a “manual” triggering of the popover. Popovers whose title and content are both zero-length are never displayed. |\n| `toggle` | Toggles an element’s popover. **Returns to the caller before the popover has actually been shown or hidden** (i.e. before the `shown.bs.popover` or `hidden.bs.popover` event occurs). This is considered a “manual” triggering of the popover. |\n| `toggleEnabled` | Toggles the ability for an element’s popover to be shown or hidden. |\n| `update` | Updates the position of an element’s popover. |\n</BsTable>\n\n\n```js\n// getOrCreateInstance example\nconst popover = bootstrap.Popover.getOrCreateInstance('#example') // Returns a Bootstrap popover instance\n\n// setContent example\npopover.setContent({\n  '.popover-header': 'another title',\n  '.popover-body': 'another content'\n})\n```\n\n<Callout>\nThe `setContent` method accepts an `object` argument, where each property-key is a valid `string` selector within the popover template, and each related property-value can be `string` | `element` | `function` | `null`\n</Callout>\n\n### Events\n\n<BsTable>\n| Event | Description |\n| --- | --- |\n| `hide.bs.popover` | This event is fired immediately when the `hide` instance method has been called. |\n| `hidden.bs.popover` | This event is fired when the popover has finished being hidden from the user (will wait for CSS transitions to complete). |\n| `inserted.bs.popover` | This event is fired after the `show.bs.popover` event when the popover template has been added to the DOM. |\n| `show.bs.popover` | This event fires immediately when the `show` instance method is called. |\n| `shown.bs.popover` | This event is fired when the popover has been made visible to the user (will wait for CSS transitions to complete). |\n</BsTable>\n\n```js\nconst myPopoverTrigger = document.getElementById('myPopover')\nmyPopoverTrigger.addEventListener('hidden.bs.popover', () => {\n  // do something...\n})\n```\n"
  },
  {
    "path": "site/src/content/docs/components/progress.mdx",
    "content": "---\ntitle: Progress\ndescription: Documentation and examples for using Bootstrap custom progress bars featuring support for stacked bars, animated backgrounds, and text labels.\ntoc: true\n---\n\n<Callout>\n**New markup in v5.3.0 —** We’ve deprecated the previous HTML structure for progress bars and replaced it with a more accessible one. The previous structure will continue to work until v6. [See what’s changed in our migration guide.]([[docsref:/migration#improved-markup-for-progress-bars]])\n</Callout>\n\n## How it works\n\nProgress components are built with two HTML elements, some CSS to set the width, and a few attributes. We don’t use [the HTML5 `<progress>` element](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/progress), ensuring you can stack progress bars, animate them, and place text labels over them.\n\n- We use the `.progress` as a wrapper to indicate the max value of the progress bar.\n- The `.progress` wrapper also requires a `role=\"progressbar\"` and `aria` attributes to make it accessible, including an accessible name (using `aria-label`, `aria-labelledby`, or similar).\n- We use the inner `.progress-bar` purely for the visual bar and label.\n- The `.progress-bar` requires an inline style, utility class, or custom CSS to set its width.\n- We provide a special `.progress-stacked` class to create multiple/stacked progress bars.\n\nPut that all together, and you have the following examples.\n\n<Example code={`<div class=\"progress\" role=\"progressbar\" aria-label=\"Basic example\" aria-valuenow=\"0\" aria-valuemin=\"0\" aria-valuemax=\"100\">\n    <div class=\"progress-bar\" style=\"width: 0%\"></div>\n  </div>\n  <div class=\"progress\" role=\"progressbar\" aria-label=\"Basic example\" aria-valuenow=\"25\" aria-valuemin=\"0\" aria-valuemax=\"100\">\n    <div class=\"progress-bar\" style=\"width: 25%\"></div>\n  </div>\n  <div class=\"progress\" role=\"progressbar\" aria-label=\"Basic example\" aria-valuenow=\"50\" aria-valuemin=\"0\" aria-valuemax=\"100\">\n    <div class=\"progress-bar\" style=\"width: 50%\"></div>\n  </div>\n  <div class=\"progress\" role=\"progressbar\" aria-label=\"Basic example\" aria-valuenow=\"75\" aria-valuemin=\"0\" aria-valuemax=\"100\">\n    <div class=\"progress-bar\" style=\"width: 75%\"></div>\n  </div>\n  <div class=\"progress\" role=\"progressbar\" aria-label=\"Basic example\" aria-valuenow=\"100\" aria-valuemin=\"0\" aria-valuemax=\"100\">\n    <div class=\"progress-bar\" style=\"width: 100%\"></div>\n  </div>`} />\n\n## Bar sizing\n\n### Width\n\nBootstrap provides a handful of [utilities for setting width]([[docsref:/utilities/sizing]]). Depending on your needs, these may help with quickly configuring the width of the `.progress-bar`.\n\n<Example code={`<div class=\"progress\" role=\"progressbar\" aria-label=\"Basic example\" aria-valuenow=\"75\" aria-valuemin=\"0\" aria-valuemax=\"100\">\n    <div class=\"progress-bar w-75\"></div>\n  </div>`} />\n\n### Height\n\nYou only set a `height` value on the `.progress` container, so if you change that value, the inner `.progress-bar` will automatically resize accordingly.\n\n<Example code={`<div class=\"progress\" role=\"progressbar\" aria-label=\"Example 1px high\" aria-valuenow=\"25\" aria-valuemin=\"0\" aria-valuemax=\"100\" style=\"height: 1px\">\n    <div class=\"progress-bar\" style=\"width: 25%\"></div>\n  </div>\n  <div class=\"progress\" role=\"progressbar\" aria-label=\"Example 20px high\" aria-valuenow=\"25\" aria-valuemin=\"0\" aria-valuemax=\"100\" style=\"height: 20px\">\n    <div class=\"progress-bar\" style=\"width: 25%\"></div>\n  </div>`} />\n\n## Labels\n\nAdd labels to your progress bars by placing text within the `.progress-bar`.\n\n<Example code={`<div class=\"progress\" role=\"progressbar\" aria-label=\"Example with label\" aria-valuenow=\"25\" aria-valuemin=\"0\" aria-valuemax=\"100\">\n    <div class=\"progress-bar\" style=\"width: 25%\">25%</div>\n  </div>`} />\n\n### Long labels\n\nNote that by default, the content inside the `.progress-bar` is controlled with `overflow: hidden`, so it doesn’t bleed out of the bar. If your progress bar is shorter than its label, the content will be capped and may become unreadable. To change this behavior, you can use `.overflow-visible` from the [overflow utilities]([[docsref:/utilities/overflow]]).\n\n<Callout type=\"warning\">\nLabels longer than the progress bar within may not be fully accessible using this method because it relies on the text color having the correct contrast ratio with both the `.progress` and `.progress-bar` background colors. Use caution when implementing this example.\n\nIf the text can overlap the progress bar, we often recommend displaying the label outside of the progress bar for better accessibility.\n</Callout>\n\n## Backgrounds\n\nUse background utility classes to change the appearance of individual progress bars.\n\n<Example code={`<div class=\"progress\" role=\"progressbar\" aria-label=\"Success example\" aria-valuenow=\"25\" aria-valuemin=\"0\" aria-valuemax=\"100\">\n    <div class=\"progress-bar bg-success\" style=\"width: 25%\"></div>\n  </div>\n  <div class=\"progress\" role=\"progressbar\" aria-label=\"Info example\" aria-valuenow=\"50\" aria-valuemin=\"0\" aria-valuemax=\"100\">\n    <div class=\"progress-bar bg-info\" style=\"width: 50%\"></div>\n  </div>\n  <div class=\"progress\" role=\"progressbar\" aria-label=\"Warning example\" aria-valuenow=\"75\" aria-valuemin=\"0\" aria-valuemax=\"100\">\n    <div class=\"progress-bar bg-warning\" style=\"width: 75%\"></div>\n  </div>\n  <div class=\"progress\" role=\"progressbar\" aria-label=\"Danger example\" aria-valuenow=\"100\" aria-valuemin=\"0\" aria-valuemax=\"100\">\n    <div class=\"progress-bar bg-danger\" style=\"width: 100%\"></div>\n  </div>`} />\n\n<Callout name=\"warning-color-assistive-technologies\" />\n\nIf you’re adding labels to progress bars with a custom background color, make sure to also set an appropriate [text color]([[docsref:/utilities/colors#colors]]), so the labels remain readable and have sufficient contrast. We recommend using the [color and background]([[docsref:/helpers/color-background]]) helper classes.\n\n<Example code={`<div class=\"progress\" role=\"progressbar\" aria-label=\"Success example\" aria-valuenow=\"25\" aria-valuemin=\"0\" aria-valuemax=\"100\">\n    <div class=\"progress-bar text-bg-success\" style=\"width: 25%\">25%</div>\n  </div>\n  <div class=\"progress\" role=\"progressbar\" aria-label=\"Info example\" aria-valuenow=\"50\" aria-valuemin=\"0\" aria-valuemax=\"100\">\n    <div class=\"progress-bar text-bg-info\" style=\"width: 50%\">50%</div>\n  </div>\n  <div class=\"progress\" role=\"progressbar\" aria-label=\"Warning example\" aria-valuenow=\"75\" aria-valuemin=\"0\" aria-valuemax=\"100\">\n    <div class=\"progress-bar text-bg-warning\" style=\"width: 75%\">75%</div>\n  </div>\n  <div class=\"progress\" role=\"progressbar\" aria-label=\"Danger example\" aria-valuenow=\"100\" aria-valuemin=\"0\" aria-valuemax=\"100\">\n    <div class=\"progress-bar text-bg-danger\" style=\"width: 100%\">100%</div>\n  </div>`} />\n\n## Multiple bars\n\nYou can include multiple progress components inside a container with `.progress-stacked` to create a single stacked progress bar. Note that in this case, the styling to set the visual width of the progress bar *must* be applied to the `.progress` elements, rather than the `.progress-bar`s.\n\n<Example code={`<div class=\"progress-stacked\">\n    <div class=\"progress\" role=\"progressbar\" aria-label=\"Segment one\" aria-valuenow=\"15\" aria-valuemin=\"0\" aria-valuemax=\"100\" style=\"width: 15%\">\n      <div class=\"progress-bar\"></div>\n    </div>\n    <div class=\"progress\" role=\"progressbar\" aria-label=\"Segment two\" aria-valuenow=\"30\" aria-valuemin=\"0\" aria-valuemax=\"100\" style=\"width: 30%\">\n      <div class=\"progress-bar bg-success\"></div>\n    </div>\n    <div class=\"progress\" role=\"progressbar\" aria-label=\"Segment three\" aria-valuenow=\"20\" aria-valuemin=\"0\" aria-valuemax=\"100\" style=\"width: 20%\">\n      <div class=\"progress-bar bg-info\"></div>\n    </div>\n  </div>`} />\n\n## Striped\n\nAdd `.progress-bar-striped` to any `.progress-bar` to apply a stripe via CSS gradient over the progress bar’s background color.\n\n<Example code={`<div class=\"progress\" role=\"progressbar\" aria-label=\"Default striped example\" aria-valuenow=\"10\" aria-valuemin=\"0\" aria-valuemax=\"100\">\n    <div class=\"progress-bar progress-bar-striped\" style=\"width: 10%\"></div>\n  </div>\n  <div class=\"progress\" role=\"progressbar\" aria-label=\"Success striped example\" aria-valuenow=\"25\" aria-valuemin=\"0\" aria-valuemax=\"100\">\n    <div class=\"progress-bar progress-bar-striped bg-success\" style=\"width: 25%\"></div>\n  </div>\n  <div class=\"progress\" role=\"progressbar\" aria-label=\"Info striped example\" aria-valuenow=\"50\" aria-valuemin=\"0\" aria-valuemax=\"100\">\n    <div class=\"progress-bar progress-bar-striped bg-info\" style=\"width: 50%\"></div>\n  </div>\n  <div class=\"progress\" role=\"progressbar\" aria-label=\"Warning striped example\" aria-valuenow=\"75\" aria-valuemin=\"0\" aria-valuemax=\"100\">\n    <div class=\"progress-bar progress-bar-striped bg-warning\" style=\"width: 75%\"></div>\n  </div>\n  <div class=\"progress\" role=\"progressbar\" aria-label=\"Danger striped example\" aria-valuenow=\"100\" aria-valuemin=\"0\" aria-valuemax=\"100\">\n    <div class=\"progress-bar progress-bar-striped bg-danger\" style=\"width: 100%\"></div>\n  </div>`} />\n\n## Animated stripes\n\nThe striped gradient can also be animated. Add `.progress-bar-animated` to `.progress-bar` to animate the stripes right to left via CSS3 animations.\n\n<Example code={`<div class=\"progress\" role=\"progressbar\" aria-label=\"Animated striped example\" aria-valuenow=\"75\" aria-valuemin=\"0\" aria-valuemax=\"100\">\n    <div class=\"progress-bar progress-bar-striped progress-bar-animated\" style=\"width: 75%\"></div>\n  </div>`} />\n\n## CSS\n\n### Variables\n\n<AddedIn version=\"5.2.0\" />\n\nAs part of Bootstrap’s evolving CSS variables approach, progress bars now use local CSS variables on `.progress` for enhanced real-time customization. Values for the CSS variables are set via Sass, so Sass customization is still supported, too.\n\n<ScssDocs name=\"progress-css-vars\" file=\"scss/_progress.scss\" />\n\n### Sass variables\n\n<ScssDocs name=\"progress-variables\" file=\"scss/_variables.scss\" />\n\n### Keyframes\n\nUsed for creating the CSS animations for `.progress-bar-animated`. Included in `scss/_progress-bar.scss`.\n\n<ScssDocs name=\"progress-keyframes\" file=\"scss/_progress.scss\" />\n"
  },
  {
    "path": "site/src/content/docs/components/scrollspy.mdx",
    "content": "---\ntitle: Scrollspy\ndescription: Automatically update Bootstrap navigation or list group components based on scroll position to indicate which link is currently active in the viewport.\ntoc: true\n---\n\n## How it works\n\nScrollspy toggles the `.active` class on anchor (`<a>`) elements when the element with the `id` referenced by the anchor’s `href` is scrolled into view. Scrollspy is best used in conjunction with a Bootstrap [nav component]([[docsref:/components/navs-tabs]]) or [list group]([[docsref:/components/list-group]]), but it will also work with any anchor elements in the current page. Here’s how it works.\n\n- To start, scrollspy requires two things: a navigation, list group, or a simple set of links, plus a scrollable container. The scrollable container can be the `<body>` or a custom element with a set `height` and `overflow-y: scroll`.\n\n- On the scrollable container, add `data-bs-spy=\"scroll\"` and `data-bs-target=\"#navId\"` where `navId` is the unique `id` of the associated navigation. If there is no focusable element inside the element, be sure to also include a `tabindex=\"0\"` to ensure keyboard access.\n\n- As you scroll the “spied” container, an `.active` class is added and removed from anchor links within the associated navigation. Links must have resolvable `id` targets, otherwise they’re ignored. For example, a `<a href=\"#home\">home</a>` must correspond to something in the DOM like `<div id=\"home\"></div>`\n\n- Target elements that are not visible will be ignored. See the [Non-visible elements](#non-visible-elements) section below.\n\n## Examples\n\n### Navbar\n\nScroll the area below the navbar and watch the active class change. Open the dropdown menu and watch the dropdown items be highlighted as well.\n\n<Example showMarkup={false} code={`<nav id=\"navbar-example2\" class=\"navbar bg-body-tertiary px-3 mb-3 rounded-2\">\n    <a class=\"navbar-brand\" href=\"#\">Navbar</a>\n    <ul class=\"nav nav-pills\">\n      <li class=\"nav-item\">\n        <a class=\"nav-link\" href=\"#scrollspyHeading1\">First</a>\n      </li>\n      <li class=\"nav-item\">\n        <a class=\"nav-link\" href=\"#scrollspyHeading2\">Second</a>\n      </li>\n      <li class=\"nav-item dropdown\">\n        <a class=\"nav-link dropdown-toggle\" data-bs-toggle=\"dropdown\" href=\"#\" role=\"button\" aria-expanded=\"false\">Dropdown</a>\n        <ul class=\"dropdown-menu\">\n          <li><a class=\"dropdown-item\" href=\"#scrollspyHeading3\">Third</a></li>\n          <li><a class=\"dropdown-item\" href=\"#scrollspyHeading4\">Fourth</a></li>\n          <li><hr class=\"dropdown-divider\"></li>\n          <li><a class=\"dropdown-item\" href=\"#scrollspyHeading5\">Fifth</a></li>\n        </ul>\n      </li>\n    </ul>\n  </nav>\n  <div class=\"scrollspy-example bg-body-tertiary p-3 rounded-2\" data-bs-spy=\"scroll\" data-bs-target=\"#navbar-example2\" data-bs-root-margin=\"0px 0px -40%\" data-bs-smooth-scroll=\"true\" tabindex=\"0\">\n    <h4 id=\"scrollspyHeading1\">First heading</h4>\n    <p>This is some placeholder content for the scrollspy page. Note that as you scroll down the page, the appropriate navigation link is highlighted. It’s repeated throughout the component example. We keep adding some more example copy here to emphasize the scrolling and highlighting.</p>\n    <h4 id=\"scrollspyHeading2\">Second heading</h4>\n    <p>This is some placeholder content for the scrollspy page. Note that as you scroll down the page, the appropriate navigation link is highlighted. It’s repeated throughout the component example. We keep adding some more example copy here to emphasize the scrolling and highlighting.</p>\n    <h4 id=\"scrollspyHeading3\">Third heading</h4>\n    <p>This is some placeholder content for the scrollspy page. Note that as you scroll down the page, the appropriate navigation link is highlighted. It’s repeated throughout the component example. We keep adding some more example copy here to emphasize the scrolling and highlighting.</p>\n    <h4 id=\"scrollspyHeading4\">Fourth heading</h4>\n    <p>This is some placeholder content for the scrollspy page. Note that as you scroll down the page, the appropriate navigation link is highlighted. It’s repeated throughout the component example. We keep adding some more example copy here to emphasize the scrolling and highlighting.</p>\n    <h4 id=\"scrollspyHeading5\">Fifth heading</h4>\n    <p>This is some placeholder content for the scrollspy page. Note that as you scroll down the page, the appropriate navigation link is highlighted. It’s repeated throughout the component example. We keep adding some more example copy here to emphasize the scrolling and highlighting.</p>\n  </div>`} />\n\n```html\n<nav id=\"navbar-example2\" class=\"navbar bg-body-tertiary px-3 mb-3\">\n  <a class=\"navbar-brand\" href=\"#\">Navbar</a>\n  <ul class=\"nav nav-pills\">\n    <li class=\"nav-item\">\n      <a class=\"nav-link\" href=\"#scrollspyHeading1\">First</a>\n    </li>\n    <li class=\"nav-item\">\n      <a class=\"nav-link\" href=\"#scrollspyHeading2\">Second</a>\n    </li>\n    <li class=\"nav-item dropdown\">\n      <a class=\"nav-link dropdown-toggle\" data-bs-toggle=\"dropdown\" href=\"#\" role=\"button\" aria-expanded=\"false\">Dropdown</a>\n      <ul class=\"dropdown-menu\">\n        <li><a class=\"dropdown-item\" href=\"#scrollspyHeading3\">Third</a></li>\n        <li><a class=\"dropdown-item\" href=\"#scrollspyHeading4\">Fourth</a></li>\n        <li><hr class=\"dropdown-divider\"></li>\n        <li><a class=\"dropdown-item\" href=\"#scrollspyHeading5\">Fifth</a></li>\n      </ul>\n    </li>\n  </ul>\n</nav>\n<div data-bs-spy=\"scroll\" data-bs-target=\"#navbar-example2\" data-bs-root-margin=\"0px 0px -40%\" data-bs-smooth-scroll=\"true\" class=\"scrollspy-example bg-body-tertiary p-3 rounded-2\" tabindex=\"0\">\n  <h4 id=\"scrollspyHeading1\">First heading</h4>\n  <p>...</p>\n  <h4 id=\"scrollspyHeading2\">Second heading</h4>\n  <p>...</p>\n  <h4 id=\"scrollspyHeading3\">Third heading</h4>\n  <p>...</p>\n  <h4 id=\"scrollspyHeading4\">Fourth heading</h4>\n  <p>...</p>\n  <h4 id=\"scrollspyHeading5\">Fifth heading</h4>\n  <p>...</p>\n</div>\n```\n\n### Nested nav\n\nScrollspy also works with nested `.nav`s. If a nested `.nav` is `.active`, its parents will also be `.active`. Scroll the area next to the navbar and watch the active class change.\n\n<Example showMarkup={false} code={`\n<div class=\"row\">\n  <div class=\"col-4\">\n    <nav id=\"navbar-example3\" class=\"h-100 flex-column align-items-stretch pe-4 border-end\">\n      <nav class=\"nav nav-pills flex-column\">\n        <a class=\"nav-link\" href=\"#item-1\">Item 1</a>\n        <nav class=\"nav nav-pills flex-column\">\n          <a class=\"nav-link ms-3 my-1\" href=\"#item-1-1\">Item 1-1</a>\n          <a class=\"nav-link ms-3 my-1\" href=\"#item-1-2\">Item 1-2</a>\n        </nav>\n        <a class=\"nav-link\" href=\"#item-2\">Item 2</a>\n        <a class=\"nav-link\" href=\"#item-3\">Item 3</a>\n        <nav class=\"nav nav-pills flex-column\">\n          <a class=\"nav-link ms-3 my-1\" href=\"#item-3-1\">Item 3-1</a>\n          <a class=\"nav-link ms-3 my-1\" href=\"#item-3-2\">Item 3-2</a>\n        </nav>\n      </nav>\n    </nav>\n  </div>\n  <div class=\"col-8\">\n    <div data-bs-spy=\"scroll\" data-bs-target=\"#navbar-example3\" data-bs-smooth-scroll=\"true\" class=\"scrollspy-example-2\" tabindex=\"0\">\n      <div id=\"item-1\">\n        <h4>Item 1</h4>\n        <p>This is some placeholder content for the scrollspy page. Note that as you scroll down the page, the appropriate navigation link is highlighted. It’s repeated throughout the component example. We keep adding some more example copy here to emphasize the scrolling and highlighting.</p>\n        <p>Keep in mind that the JavaScript plugin tries to pick the right element among all that may be visible. Multiple visible scrollspy targets at the same time may cause some issues.</p>\n      </div>\n      <div id=\"item-1-1\">\n        <h5>Item 1-1</h5>\n        <p>This is some placeholder content for the scrollspy page. Note that as you scroll down the page, the appropriate navigation link is highlighted. It’s repeated throughout the component example. We keep adding some more example copy here to emphasize the scrolling and highlighting.</p>\n        <p>Keep in mind that the JavaScript plugin tries to pick the right element among all that may be visible. Multiple visible scrollspy targets at the same time may cause some issues.</p>\n      </div>\n      <div id=\"item-1-2\">\n        <h5>Item 1-2</h5>\n        <p>This is some placeholder content for the scrollspy page. Note that as you scroll down the page, the appropriate navigation link is highlighted. It’s repeated throughout the component example. We keep adding some more example copy here to emphasize the scrolling and highlighting.</p>\n        <p>Keep in mind that the JavaScript plugin tries to pick the right element among all that may be visible. Multiple visible scrollspy targets at the same time may cause some issues.</p>\n      </div>\n      <div id=\"item-2\">\n        <h4>Item 2</h4>\n        <p>This is some placeholder content for the scrollspy page. Note that as you scroll down the page, the appropriate navigation link is highlighted. It’s repeated throughout the component example. We keep adding some more example copy here to emphasize the scrolling and highlighting.</p>\n        <p>Keep in mind that the JavaScript plugin tries to pick the right element among all that may be visible. Multiple visible scrollspy targets at the same time may cause some issues.</p>\n      </div>\n      <div id=\"item-3\">\n        <h4>Item 3</h4>\n        <p>This is some placeholder content for the scrollspy page. Note that as you scroll down the page, the appropriate navigation link is highlighted. It’s repeated throughout the component example. We keep adding some more example copy here to emphasize the scrolling and highlighting.</p>\n        <p>Keep in mind that the JavaScript plugin tries to pick the right element among all that may be visible. Multiple visible scrollspy targets at the same time may cause some issues.</p>\n      </div>\n      <div id=\"item-3-1\">\n        <h5>Item 3-1</h5>\n        <p>This is some placeholder content for the scrollspy page. Note that as you scroll down the page, the appropriate navigation link is highlighted. It’s repeated throughout the component example. We keep adding some more example copy here to emphasize the scrolling and highlighting.</p>\n        <p>Keep in mind that the JavaScript plugin tries to pick the right element among all that may be visible. Multiple visible scrollspy targets at the same time may cause some issues.</p>\n      </div>\n      <div id=\"item-3-2\">\n        <h5>Item 3-2</h5>\n        <p>This is some placeholder content for the scrollspy page. Note that as you scroll down the page, the appropriate navigation link is highlighted. It’s repeated throughout the component example. We keep adding some more example copy here to emphasize the scrolling and highlighting.</p>\n        <p>Keep in mind that the JavaScript plugin tries to pick the right element among all that may be visible. Multiple visible scrollspy targets at the same time may cause some issues.</p>\n      </div>\n    </div>\n  </div>\n</div>\n`} />\n\n```html\n<div class=\"row\">\n  <div class=\"col-4\">\n    <nav id=\"navbar-example3\" class=\"h-100 flex-column align-items-stretch pe-4 border-end\">\n      <nav class=\"nav nav-pills flex-column\">\n        <a class=\"nav-link\" href=\"#item-1\">Item 1</a>\n        <nav class=\"nav nav-pills flex-column\">\n          <a class=\"nav-link ms-3 my-1\" href=\"#item-1-1\">Item 1-1</a>\n          <a class=\"nav-link ms-3 my-1\" href=\"#item-1-2\">Item 1-2</a>\n        </nav>\n        <a class=\"nav-link\" href=\"#item-2\">Item 2</a>\n        <a class=\"nav-link\" href=\"#item-3\">Item 3</a>\n        <nav class=\"nav nav-pills flex-column\">\n          <a class=\"nav-link ms-3 my-1\" href=\"#item-3-1\">Item 3-1</a>\n          <a class=\"nav-link ms-3 my-1\" href=\"#item-3-2\">Item 3-2</a>\n        </nav>\n      </nav>\n    </nav>\n  </div>\n\n  <div class=\"col-8\">\n    <div data-bs-spy=\"scroll\" data-bs-target=\"#navbar-example3\" data-bs-smooth-scroll=\"true\" class=\"scrollspy-example-2\" tabindex=\"0\">\n      <div id=\"item-1\">\n        <h4>Item 1</h4>\n        <p>...</p>\n      </div>\n      <div id=\"item-1-1\">\n        <h5>Item 1-1</h5>\n        <p>...</p>\n      </div>\n      <div id=\"item-1-2\">\n        <h5>Item 1-2</h5>\n        <p>...</p>\n      </div>\n      <div id=\"item-2\">\n        <h4>Item 2</h4>\n        <p>...</p>\n      </div>\n      <div id=\"item-3\">\n        <h4>Item 3</h4>\n        <p>...</p>\n      </div>\n      <div id=\"item-3-1\">\n        <h5>Item 3-1</h5>\n        <p>...</p>\n      </div>\n      <div id=\"item-3-2\">\n        <h5>Item 3-2</h5>\n        <p>...</p>\n      </div>\n    </div>\n  </div>\n</div>\n```\n\n### List group\n\nScrollspy also works with `.list-group`s. Scroll the area next to the list group and watch the active class change.\n\n<Example showMarkup={false} code={`\n<div class=\"row\">\n  <div class=\"col-4\">\n    <div id=\"list-example\" class=\"list-group\">\n      <a class=\"list-group-item list-group-item-action\" href=\"#list-item-1\">Item 1</a>\n      <a class=\"list-group-item list-group-item-action\" href=\"#list-item-2\">Item 2</a>\n      <a class=\"list-group-item list-group-item-action\" href=\"#list-item-3\">Item 3</a>\n      <a class=\"list-group-item list-group-item-action\" href=\"#list-item-4\">Item 4</a>\n    </div>\n  </div>\n  <div class=\"col-8\">\n    <div data-bs-spy=\"scroll\" data-bs-target=\"#list-example\" data-bs-smooth-scroll=\"true\" class=\"scrollspy-example\" tabindex=\"0\">\n      <h4 id=\"list-item-1\">Item 1</h4>\n      <p>This is some placeholder content for the scrollspy page. Note that as you scroll down the page, the appropriate navigation link is highlighted. It’s repeated throughout the component example. We keep adding some more example copy here to emphasize the scrolling and highlighting.</p>\n      <h4 id=\"list-item-2\">Item 2</h4>\n      <p>This is some placeholder content for the scrollspy page. Note that as you scroll down the page, the appropriate navigation link is highlighted. It’s repeated throughout the component example. We keep adding some more example copy here to emphasize the scrolling and highlighting.</p>\n      <h4 id=\"list-item-3\">Item 3</h4>\n      <p>This is some placeholder content for the scrollspy page. Note that as you scroll down the page, the appropriate navigation link is highlighted. It’s repeated throughout the component example. We keep adding some more example copy here to emphasize the scrolling and highlighting.</p>\n      <h4 id=\"list-item-4\">Item 4</h4>\n      <p>This is some placeholder content for the scrollspy page. Note that as you scroll down the page, the appropriate navigation link is highlighted. It’s repeated throughout the component example. We keep adding some more example copy here to emphasize the scrolling and highlighting.</p>\n    </div>\n  </div>\n</div>\n`} />\n\n```html\n<div class=\"row\">\n  <div class=\"col-4\">\n    <div id=\"list-example\" class=\"list-group\">\n      <a class=\"list-group-item list-group-item-action\" href=\"#list-item-1\">Item 1</a>\n      <a class=\"list-group-item list-group-item-action\" href=\"#list-item-2\">Item 2</a>\n      <a class=\"list-group-item list-group-item-action\" href=\"#list-item-3\">Item 3</a>\n      <a class=\"list-group-item list-group-item-action\" href=\"#list-item-4\">Item 4</a>\n    </div>\n  </div>\n  <div class=\"col-8\">\n    <div data-bs-spy=\"scroll\" data-bs-target=\"#list-example\" data-bs-smooth-scroll=\"true\" class=\"scrollspy-example\" tabindex=\"0\">\n      <h4 id=\"list-item-1\">Item 1</h4>\n      <p>...</p>\n      <h4 id=\"list-item-2\">Item 2</h4>\n      <p>...</p>\n      <h4 id=\"list-item-3\">Item 3</h4>\n      <p>...</p>\n      <h4 id=\"list-item-4\">Item 4</h4>\n      <p>...</p>\n    </div>\n  </div>\n</div>\n```\n\n### Simple anchors\n\nScrollspy is not limited to nav components and list groups, so it will work on any `<a>` anchor elements in the current document. Scroll the area and watch the `.active` class change.\n\n<Example showMarkup={false} code={`\n<div class=\"row\">\n  <div class=\"col-4\">\n    <div id=\"simple-list-example\" class=\"d-flex flex-column gap-2 simple-list-example-scrollspy text-center\">\n      <a class=\"p-1 rounded\" href=\"#simple-list-item-1\">Item 1</a>\n      <a class=\"p-1 rounded\" href=\"#simple-list-item-2\">Item 2</a>\n      <a class=\"p-1 rounded\" href=\"#simple-list-item-3\">Item 3</a>\n      <a class=\"p-1 rounded\" href=\"#simple-list-item-4\">Item 4</a>\n      <a class=\"p-1 rounded\" href=\"#simple-list-item-5\">Item 5</a>\n    </div>\n  </div>\n  <div class=\"col-8\">\n    <div data-bs-spy=\"scroll\" data-bs-target=\"#simple-list-example\" data-bs-offset=\"0\" data-bs-smooth-scroll=\"true\" class=\"scrollspy-example\" tabindex=\"0\">\n      <h4 id=\"simple-list-item-1\">Item 1</h4>\n      <p>This is some placeholder content for the scrollspy page. Note that as you scroll down the page, the appropriate navigation link is highlighted. It’s repeated throughout the component example. We keep adding some more example copy here to emphasize the scrolling and highlighting.</p>\n      <h4 id=\"simple-list-item-2\">Item 2</h4>\n      <p>This is some placeholder content for the scrollspy page. Note that as you scroll down the page, the appropriate navigation link is highlighted. It’s repeated throughout the component example. We keep adding some more example copy here to emphasize the scrolling and highlighting.</p>\n      <h4 id=\"simple-list-item-3\">Item 3</h4>\n      <p>This is some placeholder content for the scrollspy page. Note that as you scroll down the page, the appropriate navigation link is highlighted. It’s repeated throughout the component example. We keep adding some more example copy here to emphasize the scrolling and highlighting.</p>\n      <h4 id=\"simple-list-item-4\">Item 4</h4>\n      <p>This is some placeholder content for the scrollspy page. Note that as you scroll down the page, the appropriate navigation link is highlighted. It’s repeated throughout the component example. We keep adding some more example copy here to emphasize the scrolling and highlighting.</p>\n      <h4 id=\"simple-list-item-5\">Item 5</h4>\n      <p>This is some placeholder content for the scrollspy page. Note that as you scroll down the page, the appropriate navigation link is highlighted. It’s repeated throughout the component example. We keep adding some more example copy here to emphasize the scrolling and highlighting.</p>\n    </div>\n  </div>\n</div>\n`} />\n\n```html\n<div class=\"row\">\n  <div class=\"col-4\">\n    <div id=\"simple-list-example\" class=\"d-flex flex-column gap-2 simple-list-example-scrollspy text-center\">\n      <a class=\"p-1 rounded\" href=\"#simple-list-item-1\">Item 1</a>\n      <a class=\"p-1 rounded\" href=\"#simple-list-item-2\">Item 2</a>\n      <a class=\"p-1 rounded\" href=\"#simple-list-item-3\">Item 3</a>\n      <a class=\"p-1 rounded\" href=\"#simple-list-item-4\">Item 4</a>\n      <a class=\"p-1 rounded\" href=\"#simple-list-item-5\">Item 5</a>\n    </div>\n  </div>\n  <div class=\"col-8\">\n    <div data-bs-spy=\"scroll\" data-bs-target=\"#simple-list-example\" data-bs-offset=\"0\" data-bs-smooth-scroll=\"true\" class=\"scrollspy-example\" tabindex=\"0\">\n      <h4 id=\"simple-list-item-1\">Item 1</h4>\n      <p>...</p>\n      <h4 id=\"simple-list-item-2\">Item 2</h4>\n      <p>...</p>\n      <h4 id=\"simple-list-item-3\">Item 3</h4>\n      <p>...</p>\n      <h4 id=\"simple-list-item-4\">Item 4</h4>\n      <p>...</p>\n      <h4 id=\"simple-list-item-5\">Item 5</h4>\n      <p>...</p>\n    </div>\n  </div>\n</div>\n```\n\n## Non-visible elements\n\nTarget elements that aren’t visible will be ignored and their corresponding nav items won’t receive an `.active` class. Scrollspy instances initialized in a non-visible wrapper will ignore all target elements. Use the `refresh` method to check for observable elements once the wrapper becomes visible.\n\n```js\ndocument.querySelectorAll('#nav-tab>[data-bs-toggle=\"tab\"]').forEach(el => {\n  el.addEventListener('shown.bs.tab', () => {\n    const target = el.getAttribute('data-bs-target')\n    const scrollElem = document.querySelector(`${target} [data-bs-spy=\"scroll\"]`)\n    bootstrap.ScrollSpy.getOrCreateInstance(scrollElem).refresh()\n  })\n})\n```\n\n## Usage\n\n### Via data attributes\n\nTo easily add scrollspy behavior to your topbar navigation, add `data-bs-spy=\"scroll\"` to the element you want to spy on (most typically this would be the `<body>`). Then add the `data-bs-target` attribute with the `id` or class name of the parent element of any Bootstrap `.nav` component.\n\n```html\n<body data-bs-spy=\"scroll\" data-bs-target=\"#navbar-example\">\n  ...\n  <div id=\"navbar-example\">\n    <ul class=\"nav nav-tabs\" role=\"tablist\">\n      ...\n    </ul>\n  </div>\n  ...\n</body>\n```\n\n### Via JavaScript\n\n```js\nconst scrollSpy = new bootstrap.ScrollSpy(document.body, {\n  target: '#navbar-example'\n})\n```\n\n### Options\n\n<JsDataAttributes />\n\n<BsTable>\n| Name | Type | Default | Description |\n| --- | --- | --- | --- |\n| `rootMargin` | string | `0px 0px -25%` | Intersection Observer [rootMargin](https://developer.mozilla.org/en-US/docs/Web/API/IntersectionObserver/rootMargin) valid units, when calculating scroll position. |\n| `smoothScroll` | boolean | `false` | Enables smooth scrolling when a user clicks on a link that refers to ScrollSpy observables. |\n| `target` | string, DOM element | `null` | Specifies element to apply Scrollspy plugin. |\n| `threshold` | array | `[0.1, 0.5, 1]` | `IntersectionObserver` [threshold](https://developer.mozilla.org/en-US/docs/Web/API/IntersectionObserver/IntersectionObserver#threshold) valid input, when calculating scroll position. |\n\n</BsTable>\n\n<Callout type=\"warning\">\n**Deprecated Options**\n\nUp until v5.1.3 we were using `offset` & `method` options, which are now deprecated and replaced by `rootMargin`.\nTo keep backwards compatibility, we will continue to parse a given `offset` to `rootMargin`, but this feature will be removed in **v6**.\n</Callout>\n\n### Methods\n\n<BsTable>\n| Method | Description |\n| --- | --- |\n| `dispose` | Destroys an element’s scrollspy. (Removes stored data on the DOM element) |\n| `getInstance` | *Static* method to get the scrollspy instance associated with a DOM element. |\n| `getOrCreateInstance` | *Static* method to get the scrollspy instance associated with a DOM element, or to create a new one in case it wasn’t initialized. |\n| `refresh` | When adding or removing elements in the DOM, you’ll need to call the refresh method. |\n</BsTable>\n\nHere’s an example using the refresh method:\n\n```js\nconst dataSpyList = document.querySelectorAll('[data-bs-spy=\"scroll\"]')\ndataSpyList.forEach(dataSpyEl => {\n  bootstrap.ScrollSpy.getInstance(dataSpyEl).refresh()\n})\n```\n\n### Events\n\n<BsTable>\n| Event | Description |\n| --- | --- |\n| `activate.bs.scrollspy` | This event fires on the scroll element whenever an anchor is activated by the scrollspy. |\n</BsTable>\n\n```js\nconst firstScrollSpyEl = document.querySelector('[data-bs-spy=\"scroll\"]')\nfirstScrollSpyEl.addEventListener('activate.bs.scrollspy', () => {\n  // do something...\n})\n```\n"
  },
  {
    "path": "site/src/content/docs/components/spinners.mdx",
    "content": "---\ntitle: Spinners\ndescription: Indicate the loading state of a component or page with Bootstrap spinners, built entirely with HTML, CSS, and no JavaScript.\ntoc: true\n---\n\nimport { getData } from '@libs/data'\n\n## About\n\nBootstrap “spinners” can be used to show the loading state in your projects. They’re built only with HTML and CSS, meaning you don’t need any JavaScript to create them. You will, however, need some custom JavaScript to toggle their visibility. Their appearance, alignment, and sizing can be easily customized with our amazing utility classes.\n\nFor accessibility purposes, each loader here includes `role=\"status\"` and a nested `<span class=\"visually-hidden\">Loading...</span>`.\n\n<Callout name=\"info-prefersreducedmotion\" />\n\n## Border spinner\n\nUse the border spinners for a lightweight loading indicator.\n\n<Example code={`<div class=\"spinner-border\" role=\"status\">\n    <span class=\"visually-hidden\">Loading...</span>\n  </div>`} />\n\n### Colors\n\nThe border spinner uses `currentColor` for its `border-color`, meaning you can customize the color with [text color utilities][color]. You can use any of our text color utilities on the standard spinner.\n\n<Example code={getData('theme-colors').map((themeColor) => `<div class=\"spinner-border text-${themeColor.name}\" role=\"status\">\n    <span class=\"visually-hidden\">Loading...</span>\n  </div>`)} />\n\n<Callout>\n**Why not use `border-color` utilities?** Each border spinner specifies a `transparent` border for at least one side, so `.border-{color}` utilities would override that.\n</Callout>\n\n## Growing spinner\n\nIf you don’t fancy a border spinner, switch to the grow spinner. While it doesn’t technically spin, it does repeatedly grow!\n\n<Example code={`<div class=\"spinner-grow\" role=\"status\">\n    <span class=\"visually-hidden\">Loading...</span>\n  </div>`} />\n\nOnce again, this spinner is built with `currentColor`, so you can easily change its appearance with [text color utilities][color]. Here it is in blue, along with the supported variants.\n\n<Example code={getData('theme-colors').map((themeColor) => `<div class=\"spinner-grow text-${themeColor.name}\" role=\"status\">\n    <span class=\"visually-hidden\">Loading...</span>\n  </div>`)} />\n\n## Alignment\n\nSpinners in Bootstrap are built with `rem`s, `currentColor`, and `display: inline-flex`. This means they can easily be resized, recolored, and quickly aligned.\n\n### Margin\n\nUse [margin utilities][margin] like `.m-5` for easy spacing.\n\n<Example code={`<div class=\"spinner-border m-5\" role=\"status\">\n    <span class=\"visually-hidden\">Loading...</span>\n  </div>`} />\n\n### Placement\n\nUse [flexbox utilities][flex], [float utilities][float], or [text alignment][text] utilities to place spinners exactly where you need them in any situation.\n\n#### Flex\n\n<Example code={`<div class=\"d-flex justify-content-center\">\n    <div class=\"spinner-border\" role=\"status\">\n      <span class=\"visually-hidden\">Loading...</span>\n    </div>\n  </div>`} />\n\n<Example code={`<div class=\"d-flex align-items-center\">\n    <strong role=\"status\">Loading...</strong>\n    <div class=\"spinner-border ms-auto\" aria-hidden=\"true\"></div>\n  </div>`} />\n\n#### Floats\n\n<Example code={`<div class=\"clearfix\">\n    <div class=\"spinner-border float-end\" role=\"status\">\n      <span class=\"visually-hidden\">Loading...</span>\n    </div>\n  </div>`} />\n\n#### Text align\n\n<Example code={`<div class=\"text-center\">\n    <div class=\"spinner-border\" role=\"status\">\n      <span class=\"visually-hidden\">Loading...</span>\n    </div>\n  </div>`} />\n\n## Size\n\nAdd `.spinner-border-sm` and `.spinner-grow-sm` to make a smaller spinner that can quickly be used within other components.\n\n<Example code={`<div class=\"spinner-border spinner-border-sm\" role=\"status\">\n    <span class=\"visually-hidden\">Loading...</span>\n  </div>\n  <div class=\"spinner-grow spinner-grow-sm\" role=\"status\">\n    <span class=\"visually-hidden\">Loading...</span>\n  </div>`} />\n\nOr, use custom CSS or inline styles to change the dimensions as needed.\n\n<Example code={`<div class=\"spinner-border\" style=\"width: 3rem; height: 3rem;\" role=\"status\">\n    <span class=\"visually-hidden\">Loading...</span>\n  </div>\n  <div class=\"spinner-grow\" style=\"width: 3rem; height: 3rem;\" role=\"status\">\n    <span class=\"visually-hidden\">Loading...</span>\n  </div>`} />\n\n## Buttons\n\nUse spinners within buttons to indicate an action is currently processing or taking place. You may also swap the text out of the spinner element and utilize button text as needed.\n\n<Example code={`<button class=\"btn btn-primary\" type=\"button\" disabled>\n    <span class=\"spinner-border spinner-border-sm\" aria-hidden=\"true\"></span>\n    <span class=\"visually-hidden\" role=\"status\">Loading...</span>\n  </button>\n  <button class=\"btn btn-primary\" type=\"button\" disabled>\n    <span class=\"spinner-border spinner-border-sm\" aria-hidden=\"true\"></span>\n    <span role=\"status\">Loading...</span>\n  </button>`} />\n\n<Example code={`<button class=\"btn btn-primary\" type=\"button\" disabled>\n    <span class=\"spinner-grow spinner-grow-sm\" aria-hidden=\"true\"></span>\n    <span class=\"visually-hidden\" role=\"status\">Loading...</span>\n  </button>\n  <button class=\"btn btn-primary\" type=\"button\" disabled>\n    <span class=\"spinner-grow spinner-grow-sm\" aria-hidden=\"true\"></span>\n    <span role=\"status\">Loading...</span>\n  </button>`} />\n\n## CSS\n\n### Variables\n\n<AddedIn version=\"5.2.0\" />\n\nAs part of Bootstrap’s evolving CSS variables approach, spinners now use local CSS variables on `.spinner-border` and `.spinner-grow` for enhanced real-time customization. Values for the CSS variables are set via Sass, so Sass customization is still supported, too.\n\nBorder spinner variables:\n\n<ScssDocs name=\"spinner-border-css-vars\" file=\"scss/_spinners.scss\" />\n\nGrowing spinner variables:\n\n<ScssDocs name=\"spinner-grow-css-vars\" file=\"scss/_spinners.scss\" />\n\nFor both spinners, small spinner modifier classes are used to update the values of these CSS variables as needed. For example, the `.spinner-border-sm` class does the following:\n\n<ScssDocs name=\"spinner-border-sm-css-vars\" file=\"scss/_spinners.scss\" />\n\n### Sass variables\n\n<ScssDocs name=\"spinner-variables\" file=\"scss/_variables.scss\" />\n\n### Keyframes\n\nUsed for creating the CSS animations for our spinners. Included in `scss/_spinners.scss`.\n\n<ScssDocs name=\"spinner-border-keyframes\" file=\"scss/_spinners.scss\" />\n\n<ScssDocs name=\"spinner-grow-keyframes\" file=\"scss/_spinners.scss\" />\n\n\n[color]:   [[docsref:/utilities/colors]]\n[flex]:    [[docsref:/utilities/flex]]\n[float]:   [[docsref:/utilities/float]]\n[margin]:  [[docsref:/utilities/spacing]]\n[text]:    [[docsref:/utilities/text]]\n"
  },
  {
    "path": "site/src/content/docs/components/toasts.mdx",
    "content": "---\ntitle: Toasts\ndescription: Push notifications to your visitors with a toast, a lightweight and easily customizable alert message.\ntoc: true\n---\n\nToasts are lightweight notifications designed to mimic the push notifications that have been popularized by mobile and desktop operating systems. They’re built with flexbox, so they’re easy to align and position.\n\n## Overview\n\nThings to know when using the toast plugin:\n\n- Toasts are opt-in for performance reasons, so **you must initialize them yourself**.\n- Toasts will automatically hide if you do not specify `autohide: false`.\n\n<Callout name=\"info-prefersreducedmotion\" />\n\n## Examples\n\n### Basic\n\nTo encourage extensible and predictable toasts, we recommend a header and body. Toast headers use `display: flex`, allowing easy alignment of content thanks to our margin and flexbox utilities.\n\nToasts are as flexible as you need and have very little required markup. At a minimum, we require a single element to contain your “toasted” content and strongly encourage a dismiss button.\n\n<Example code={`<div class=\"toast\" role=\"alert\" aria-live=\"assertive\" aria-atomic=\"true\">\n    <div class=\"toast-header\">\n      <Placeholder width=\"20\" height=\"20\" background=\"#007aff\" class=\"rounded me-2\" text={false} title={false} />\n      <strong class=\"me-auto\">Bootstrap</strong>\n      <small>11 mins ago</small>\n      <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"toast\" aria-label=\"Close\"></button>\n    </div>\n    <div class=\"toast-body\">\n      Hello, world! This is a toast message.\n    </div>\n  </div>`} />\n\n<Callout type=\"warning\">\nPreviously, our scripts dynamically added the `.hide` class to completely hide a toast (with `display:none`, rather than just with `opacity:0`). This is now not necessary anymore. However, for backwards compatibility, our script will continue to toggle the class (even though there is no practical need for it) until the next major version.\n</Callout>\n\n### Live example\n\nClick the button below to show a toast (positioned with our utilities in the lower right corner) that has been hidden by default.\n\n<div class=\"toast-container position-fixed bottom-0 end-0 p-3\">\n  <div id=\"liveToast\" class=\"toast\" role=\"alert\" aria-live=\"assertive\" aria-atomic=\"true\">\n    <div class=\"toast-header\">\n      <Placeholder width=\"20\" height=\"20\" background=\"#007aff\" class=\"rounded me-2\" text={false} title={false} />\n      <strong class=\"me-auto\">Bootstrap</strong>\n      <small>11 mins ago</small>\n      <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"toast\" aria-label=\"Close\"></button>\n    </div>\n    <div class=\"toast-body\">\n      Hello, world! This is a toast message.\n    </div>\n  </div>\n</div>\n\n<Example showMarkup={false} code={`\n<button type=\"button\" class=\"btn btn-primary\" id=\"liveToastBtn\">Show live toast</button>\n`} />\n\n```html\n<button type=\"button\" class=\"btn btn-primary\" id=\"liveToastBtn\">Show live toast</button>\n\n<div class=\"toast-container position-fixed bottom-0 end-0 p-3\">\n  <div id=\"liveToast\" class=\"toast\" role=\"alert\" aria-live=\"assertive\" aria-atomic=\"true\">\n    <div class=\"toast-header\">\n      <img src=\"...\" class=\"rounded me-2\" alt=\"...\">\n      <strong class=\"me-auto\">Bootstrap</strong>\n      <small>11 mins ago</small>\n      <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"toast\" aria-label=\"Close\"></button>\n    </div>\n    <div class=\"toast-body\">\n      Hello, world! This is a toast message.\n    </div>\n  </div>\n</div>\n```\n\nWe use the following JavaScript to trigger our live toast demo:\n\n<JsDocs name=\"live-toast\" file=\"site/src/assets/partials/snippets.js\" />\n\n### Translucent\n\nToasts are slightly translucent to blend in with what’s below them.\n\n<Example class=\"bg-dark\" code={`<div class=\"toast\" role=\"alert\" aria-live=\"assertive\" aria-atomic=\"true\">\n    <div class=\"toast-header\">\n      <Placeholder width=\"20\" height=\"20\" background=\"#007aff\" class=\"rounded me-2\" text={false} title={false} />\n      <strong class=\"me-auto\">Bootstrap</strong>\n      <small class=\"text-body-secondary\">11 mins ago</small>\n      <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"toast\" aria-label=\"Close\"></button>\n    </div>\n    <div class=\"toast-body\">\n      Hello, world! This is a toast message.\n    </div>\n  </div>`} />\n\n### Stacking\n\nYou can stack toasts by wrapping them in a toast container, which will vertically add some spacing.\n\n<Example code={`<div class=\"toast-container position-static\">\n    <div class=\"toast\" role=\"alert\" aria-live=\"assertive\" aria-atomic=\"true\">\n      <div class=\"toast-header\">\n        <Placeholder width=\"20\" height=\"20\" background=\"#007aff\" class=\"rounded me-2\" text={false} title={false} />\n        <strong class=\"me-auto\">Bootstrap</strong>\n        <small class=\"text-body-secondary\">just now</small>\n        <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"toast\" aria-label=\"Close\"></button>\n      </div>\n      <div class=\"toast-body\">\n        See? Just like this.\n      </div>\n    </div>\n\n    <div class=\"toast\" role=\"alert\" aria-live=\"assertive\" aria-atomic=\"true\">\n      <div class=\"toast-header\">\n        <Placeholder width=\"20\" height=\"20\" background=\"#007aff\" class=\"rounded me-2\" text={false} title={false} />\n        <strong class=\"me-auto\">Bootstrap</strong>\n        <small class=\"text-body-secondary\">2 seconds ago</small>\n        <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"toast\" aria-label=\"Close\"></button>\n      </div>\n      <div class=\"toast-body\">\n        Heads up, toasts will stack automatically\n      </div>\n    </div>\n  </div>`} />\n\n### Custom content\n\nCustomize your toasts by removing sub-components, tweaking them with [utilities]([[docsref:/utilities/api]]), or by adding your own markup. Here we’ve created a simpler toast by removing the default `.toast-header`, adding a custom hide icon from [Bootstrap Icons]([[config:icons]]), and using some [flexbox utilities]([[docsref:/utilities/flex]]) to adjust the layout.\n\n<Example code={`<div class=\"toast align-items-center\" role=\"alert\" aria-live=\"assertive\" aria-atomic=\"true\">\n    <div class=\"d-flex\">\n      <div class=\"toast-body\">\n        Hello, world! This is a toast message.\n      </div>\n      <button type=\"button\" class=\"btn-close me-2 m-auto\" data-bs-dismiss=\"toast\" aria-label=\"Close\"></button>\n    </div>\n  </div>`} />\n\nAlternatively, you can also add additional controls and components to toasts.\n\n<Example code={`<div class=\"toast\" role=\"alert\" aria-live=\"assertive\" aria-atomic=\"true\">\n    <div class=\"toast-body\">\n      Hello, world! This is a toast message.\n      <div class=\"mt-2 pt-2 border-top\">\n        <button type=\"button\" class=\"btn btn-primary btn-sm\">Take action</button>\n        <button type=\"button\" class=\"btn btn-secondary btn-sm\" data-bs-dismiss=\"toast\">Close</button>\n      </div>\n    </div>\n  </div>`} />\n\n### Color schemes\n\nBuilding on the above example, you can create different toast color schemes with our [color]([[docsref:/utilities/colors]]) and [background]([[docsref:/utilities/background]]) utilities. Here we’ve added `.text-bg-primary` to the `.toast`, and then added `.btn-close-white` to our close button. For a crisp edge, we remove the default border with `.border-0`.\n\n<Example code={`<div class=\"toast align-items-center text-bg-primary border-0\" role=\"alert\" aria-live=\"assertive\" aria-atomic=\"true\">\n    <div class=\"d-flex\">\n      <div class=\"toast-body\">\n        Hello, world! This is a toast message.\n      </div>\n      <button type=\"button\" class=\"btn-close btn-close-white me-2 m-auto\" data-bs-dismiss=\"toast\" aria-label=\"Close\"></button>\n    </div>\n  </div>`} />\n\n## Placement\n\nPlace toasts with custom CSS as you need them. The top right is often used for notifications, as is the top middle. If you’re only ever going to show one toast at a time, put the positioning styles right on the `.toast`.\n\n<Example addStackblitzJs code={`<form>\n    <div class=\"mb-3\">\n      <label for=\"selectToastPlacement\">Toast placement</label>\n      <select class=\"form-select mt-2\" id=\"selectToastPlacement\">\n        <option value=\"\" selected>Select a position...</option>\n        <option value=\"top-0 start-0\">Top left</option>\n        <option value=\"top-0 start-50 translate-middle-x\">Top center</option>\n        <option value=\"top-0 end-0\">Top right</option>\n        <option value=\"top-50 start-0 translate-middle-y\">Middle left</option>\n        <option value=\"top-50 start-50 translate-middle\">Middle center</option>\n        <option value=\"top-50 end-0 translate-middle-y\">Middle right</option>\n        <option value=\"bottom-0 start-0\">Bottom left</option>\n        <option value=\"bottom-0 start-50 translate-middle-x\">Bottom center</option>\n        <option value=\"bottom-0 end-0\">Bottom right</option>\n      </select>\n    </div>\n  </form>\n  <div aria-live=\"polite\" aria-atomic=\"true\" class=\"bg-body-secondary position-relative bd-example-toasts rounded-3\">\n    <div class=\"toast-container p-3\" id=\"toastPlacement\">\n      <div class=\"toast\">\n        <div class=\"toast-header\">\n          <Placeholder width=\"20\" height=\"20\" background=\"#007aff\" class=\"rounded me-2\" text={false} title={false} />\n          <strong class=\"me-auto\">Bootstrap</strong>\n          <small>11 mins ago</small>\n        </div>\n        <div class=\"toast-body\">\n          Hello, world! This is a toast message.\n        </div>\n      </div>\n    </div>\n  </div>`} />\n\nFor systems that generate more notifications, consider using a wrapping element so they can easily stack.\n\n<Example class=\"bd-example-toasts p-0\" code={`<div aria-live=\"polite\" aria-atomic=\"true\" class=\"position-relative\">\n    <!-- Position it: -->\n    <!-- - \\`.toast-container\\` for spacing between toasts -->\n    <!-- - \\`top-0\\` & \\`end-0\\` to position the toasts in the upper right corner -->\n    <!-- - \\`.p-3\\` to prevent the toasts from sticking to the edge of the container  -->\n    <div class=\"toast-container top-0 end-0 p-3\">\n\n      <!-- Then put toasts within -->\n      <div class=\"toast\" role=\"alert\" aria-live=\"assertive\" aria-atomic=\"true\">\n        <div class=\"toast-header\">\n          <Placeholder width=\"20\" height=\"20\" background=\"#007aff\" class=\"rounded me-2\" text={false} title={false} />\n          <strong class=\"me-auto\">Bootstrap</strong>\n          <small class=\"text-body-secondary\">just now</small>\n          <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"toast\" aria-label=\"Close\"></button>\n        </div>\n        <div class=\"toast-body\">\n          See? Just like this.\n        </div>\n      </div>\n\n      <div class=\"toast\" role=\"alert\" aria-live=\"assertive\" aria-atomic=\"true\">\n        <div class=\"toast-header\">\n          <Placeholder width=\"20\" height=\"20\" background=\"#007aff\" class=\"rounded me-2\" text={false} title={false} />\n          <strong class=\"me-auto\">Bootstrap</strong>\n          <small class=\"text-body-secondary\">2 seconds ago</small>\n          <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"toast\" aria-label=\"Close\"></button>\n        </div>\n        <div class=\"toast-body\">\n          Heads up, toasts will stack automatically\n        </div>\n      </div>\n    </div>\n  </div>`} />\n\nYou can also get fancy with flexbox utilities to align toasts horizontally and/or vertically.\n\n<Example class=\"bd-example-toasts d-flex\" code={`<!-- Flexbox container for aligning the toasts -->\n  <div aria-live=\"polite\" aria-atomic=\"true\" class=\"d-flex justify-content-center align-items-center w-100\">\n\n    <!-- Then put toasts within -->\n    <div class=\"toast\" role=\"alert\" aria-live=\"assertive\" aria-atomic=\"true\">\n      <div class=\"toast-header\">\n        <Placeholder width=\"20\" height=\"20\" background=\"#007aff\" class=\"rounded me-2\" text={false} title={false} />\n        <strong class=\"me-auto\">Bootstrap</strong>\n        <small>11 mins ago</small>\n        <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"toast\" aria-label=\"Close\"></button>\n      </div>\n      <div class=\"toast-body\">\n        Hello, world! This is a toast message.\n      </div>\n    </div>\n  </div>`} />\n\n## Accessibility\n\nToasts are intended to be small interruptions to your visitors or users, so to help those with screen readers and similar assistive technologies, you should wrap your toasts in an [`aria-live` region](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/ARIA_Live_Regions). Changes to live regions (such as injecting/updating a toast component) are automatically announced by screen readers without needing to move the user’s focus or otherwise interrupt the user. Additionally, include `aria-atomic=\"true\"` to ensure that the entire toast is always announced as a single (atomic) unit, rather than just announcing what was changed (which could lead to problems if you only update part of the toast’s content, or if displaying the same toast content at a later point in time). If the information needed is important for the process, e.g. for a list of errors in a form, then use the [alert component]([[docsref:/components/alerts]]) instead of toast.\n\nNote that the live region needs to be present in the markup *before* the toast is generated or updated. If you dynamically generate both at the same time and inject them into the page, they will generally not be announced by assistive technologies.\n\nYou also need to adapt the `role` and `aria-live` level depending on the content. If it’s an important message like an error, use `role=\"alert\" aria-live=\"assertive\"`, otherwise use `role=\"status\" aria-live=\"polite\"` attributes.\n\nAs the content you’re displaying changes, be sure to update the [`delay` timeout](#options) so that users have enough time to read the toast.\n\n```html\n<div class=\"toast\" role=\"alert\" aria-live=\"polite\" aria-atomic=\"true\" data-bs-delay=\"10000\">\n  <div role=\"alert\" aria-live=\"assertive\" aria-atomic=\"true\">...</div>\n</div>\n```\n\nWhen using `autohide: false`, you must add a close button to allow users to dismiss the toast.\n\n<Example code={`<div role=\"alert\" aria-live=\"assertive\" aria-atomic=\"true\" class=\"toast\" data-bs-autohide=\"false\">\n    <div class=\"toast-header\">\n      <Placeholder width=\"20\" height=\"20\" background=\"#007aff\" class=\"rounded me-2\" text={false} title={false} />\n      <strong class=\"me-auto\">Bootstrap</strong>\n      <small>11 mins ago</small>\n      <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"toast\" aria-label=\"Close\"></button>\n    </div>\n    <div class=\"toast-body\">\n      Hello, world! This is a toast message.\n    </div>\n  </div>`} />\n\nWhile technically it’s possible to add focusable/actionable controls (such as additional buttons or links) in your toast, you should avoid doing this for autohiding toasts. Even if you give the toast a long [`delay` timeout](#options), keyboard and assistive technology users may find it difficult to reach the toast in time to take action (since toasts don’t receive focus when they are displayed). If you absolutely must have further controls, we recommend using a toast with `autohide: false`.\n\n## CSS\n\n### Variables\n\n<AddedIn version=\"5.2.0\" />\n\nAs part of Bootstrap’s evolving CSS variables approach, toasts now use local CSS variables on `.toast` for enhanced real-time customization. Values for the CSS variables are set via Sass, so Sass customization is still supported, too.\n\n<ScssDocs name=\"toast-css-vars\" file=\"scss/_toasts.scss\" />\n\n### Sass variables\n\n<ScssDocs name=\"toast-variables\" file=\"scss/_variables.scss\" />\n\n## Usage\n\nInitialize toasts via JavaScript:\n\n```js\nconst toastElList = document.querySelectorAll('.toast')\nconst toastList = [...toastElList].map(toastEl => new bootstrap.Toast(toastEl, option))\n```\n\n### Triggers\n\n<JsDismiss name=\"toast\" />\n\n### Options\n\n<JsDataAttributes />\n\n<BsTable>\n| Name | Type | Default | Description |\n| --- | --- | --- | --- |\n| `animation` | boolean | `true` | Apply a CSS fade transition to the toast. |\n| `autohide` | boolean | `true` | Automatically hide the toast after the delay. |\n| `delay` | number | `5000` | Delay in milliseconds before hiding the toast. |\n</BsTable>\n\n### Methods\n\n<Callout name=\"danger-async-methods\" type=\"danger\" />\n\n<BsTable>\n| Method | Description |\n| --- | --- |\n| `dispose` | Hides an element’s toast. Your toast will remain on the DOM but won’t show anymore. |\n| `getInstance` | *Static* method which allows you to get the toast instance associated with a DOM element. <br/> For example: `const myToastEl = document.getElementById('myToastEl')` `const myToast = bootstrap.Toast.getInstance(myToastEl)` Returns a Bootstrap toast instance. |\n| `getOrCreateInstance` | *Static* method which allows you to get the toast instance associated with a DOM element, or create a new one, in case it wasn’t initialized. <br/>`const myToastEl = document.getElementById('myToastEl')` `const myToast = bootstrap.Toast.getOrCreateInstance(myToastEl)` Returns a Bootstrap toast instance. |\n| `hide` | Hides an element’s toast. **Returns to the caller before the toast has actually been hidden** (i.e. before the `hidden.bs.toast` event occurs). You have to manually call this method if you made `autohide` to `false`. |\n| `isShown` | Returns a boolean according to toast’s visibility state. |\n| `show` | Reveals an element’s toast. **Returns to the caller before the toast has actually been shown** (i.e. before the `shown.bs.toast` event occurs). You have to manually call this method, instead your toast won’t show. |\n</BsTable>\n\n### Events\n\n<BsTable>\n| Event | Description |\n| --- | --- |\n| `hide.bs.toast` | This event is fired immediately when the `hide` instance method has been called. |\n| `hidden.bs.toast` | This event is fired when the toast has finished being hidden from the user. |\n| `show.bs.toast` | This event fires immediately when the `show` instance method is called. |\n| `shown.bs.toast` | This event is fired when the toast has been made visible to the user. |\n</BsTable>\n\n```js\nconst myToastEl = document.getElementById('myToast')\nmyToastEl.addEventListener('hidden.bs.toast', () => {\n  // do something...\n})\n```\n"
  },
  {
    "path": "site/src/content/docs/components/tooltips.mdx",
    "content": "---\ntitle: Tooltips\ndescription: Documentation and examples for adding custom Bootstrap tooltips with CSS and JavaScript using CSS3 for animations and data-bs-attributes for local title storage.\ntoc: true\n---\n\n## Overview\n\nThings to know when using the tooltip plugin:\n\n- Tooltips rely on the third party library [Popper](https://popper.js.org/docs/v2/) for positioning. You must include [popper.min.js]([[config:cdn.popper]]) before `bootstrap.js`, or use one `bootstrap.bundle.min.js` which contains Popper.\n- Tooltips are opt-in for performance reasons, so **you must initialize them yourself**.\n- Tooltips with zero-length titles are never displayed.\n- Specify `container: 'body'` to avoid rendering problems in more complex components (like our input groups, button groups, etc).\n- Triggering tooltips on hidden elements will not work.\n- Tooltips for `.disabled` or `disabled` elements must be triggered on a wrapper element.\n- When triggered from hyperlinks that span multiple lines, tooltips will be centered. Use `white-space: nowrap;` on your `<a>`s to avoid this behavior.\n- Tooltips must be hidden before their corresponding elements have been removed from the DOM.\n- Tooltips can be triggered thanks to an element inside a shadow DOM.\n\nGot all that? Great, let’s see how they work with some examples.\n\n<Callout name=\"info-sanitizer\" />\n\n<Callout name=\"info-prefersreducedmotion\" />\n\n## Examples\n\n### Enable tooltips\n\nAs mentioned above, you must initialize tooltips before they can be used. One way to initialize all tooltips on a page would be to select them by their `data-bs-toggle` attribute, like so:\n\n```js\nconst tooltipTriggerList = document.querySelectorAll('[data-bs-toggle=\"tooltip\"]')\nconst tooltipList = [...tooltipTriggerList].map(tooltipTriggerEl => new bootstrap.Tooltip(tooltipTriggerEl))\n```\n\n### Tooltips on links\n\nHover over the links below to see tooltips:\n\n<Example addStackblitzJs class=\"tooltip-demo\" code={`<p class=\"muted\">Placeholder text to demonstrate some <a href=\"#\" data-bs-toggle=\"tooltip\" data-bs-title=\"Default tooltip\">inline links</a> with tooltips. This is now just filler, no killer. Content placed here just to mimic the presence of <a href=\"#\" data-bs-toggle=\"tooltip\" data-bs-title=\"Another tooltip\">real text</a>. And all that just to give you an idea of how tooltips would look when used in real-world situations. So hopefully you’ve now seen how <a href=\"#\" data-bs-toggle=\"tooltip\" data-bs-title=\"Another one here too\">these tooltips on links</a> can work in practice, once you use them on <a href=\"#\" data-bs-toggle=\"tooltip\" data-bs-title=\"The last tip!\">your own</a> site or project.</p>`} />\n\n<Callout name=\"warning-data-bs-title-vs-title\" type=\"warning\" />\n\n### Custom tooltips\n\n<AddedIn version=\"5.2.0\" />\n\nYou can customize the appearance of tooltips using [CSS variables](#variables). We set a custom class with `data-bs-custom-class=\"custom-tooltip\"` to scope our custom appearance and use it to override a local CSS variable.\n\n<ScssDocs name=\"custom-tooltip\" file=\"site/src/scss/_component-examples.scss\" />\n\n<Example addStackblitzJs class=\"tooltip-demo\" code={`<button type=\"button\" class=\"btn btn-secondary\"\n          data-bs-toggle=\"tooltip\" data-bs-placement=\"top\"\n          data-bs-custom-class=\"custom-tooltip\"\n          data-bs-title=\"This top tooltip is themed via CSS variables.\">\n    Custom tooltip\n  </button>`} />\n\n### Directions\n\nHover over the buttons below to see the four tooltips directions: top, right, bottom, and left. Directions are mirrored when using Bootstrap in RTL.\n\n<Example showMarkup={false} class=\"tooltip-demo\" code={`<div class=\"bd-example-tooltips\">\n    <button type=\"button\" class=\"btn btn-secondary\" data-bs-toggle=\"tooltip\" data-bs-placement=\"top\" data-bs-title=\"Tooltip on top\">Tooltip on top</button>\n    <button type=\"button\" class=\"btn btn-secondary\" data-bs-toggle=\"tooltip\" data-bs-placement=\"right\" data-bs-title=\"Tooltip on right\">Tooltip on right</button>\n    <button type=\"button\" class=\"btn btn-secondary\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" data-bs-title=\"Tooltip on bottom\">Tooltip on bottom</button>\n    <button type=\"button\" class=\"btn btn-secondary\" data-bs-toggle=\"tooltip\" data-bs-placement=\"left\" data-bs-title=\"Tooltip on left\">Tooltip on left</button>\n    <button type=\"button\" class=\"btn btn-secondary\" data-bs-toggle=\"tooltip\" data-bs-html=\"true\" data-bs-title=\"<em>Tooltip</em> <u>with</u> <b>HTML</b>\">Tooltip with HTML</button>\n  </div>`} />\n\n```html\n<button type=\"button\" class=\"btn btn-secondary\" data-bs-toggle=\"tooltip\" data-bs-placement=\"top\" data-bs-title=\"Tooltip on top\">\n  Tooltip on top\n</button>\n<button type=\"button\" class=\"btn btn-secondary\" data-bs-toggle=\"tooltip\" data-bs-placement=\"right\" data-bs-title=\"Tooltip on right\">\n  Tooltip on right\n</button>\n<button type=\"button\" class=\"btn btn-secondary\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" data-bs-title=\"Tooltip on bottom\">\n  Tooltip on bottom\n</button>\n<button type=\"button\" class=\"btn btn-secondary\" data-bs-toggle=\"tooltip\" data-bs-placement=\"left\" data-bs-title=\"Tooltip on left\">\n  Tooltip on left\n</button>\n```\n\nAnd with custom HTML added:\n\n```html\n<button type=\"button\" class=\"btn btn-secondary\" data-bs-toggle=\"tooltip\" data-bs-html=\"true\" data-bs-title=\"<em>Tooltip</em> <u>with</u> <b>HTML</b>\">\n  Tooltip with HTML\n</button>\n```\n\nWith an SVG:\n\n<div class=\"bd-example tooltip-demo\">\n  <a href=\"#\" class=\"d-inline-block\" data-bs-toggle=\"tooltip\" data-bs-title=\"Default tooltip\" aria-label=\"Hover or focus to see default tooltip\">\n    <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"50\" height=\"50\" viewBox=\"0 0 100 100\" aria-hidden=\"true\">\n      <rect width=\"100%\" height=\"100%\" fill=\"#563d7c\"/>\n      <circle cx=\"50\" cy=\"50\" r=\"30\" fill=\"#007bff\"/>\n    </svg>\n  </a>\n</div>\n\n## CSS\n\n### Variables\n\n<AddedIn version=\"5.2.0\" />\n\nAs part of Bootstrap’s evolving CSS variables approach, tooltips now use local CSS variables on `.tooltip` for enhanced real-time customization. Values for the CSS variables are set via Sass, so Sass customization is still supported, too.\n\n<ScssDocs name=\"tooltip-css-vars\" file=\"scss/_tooltip.scss\" />\n\n### Sass variables\n\n<ScssDocs name=\"tooltip-variables\" file=\"scss/_variables.scss\" />\n\n## Usage\n\nThe tooltip plugin generates content and markup on demand, and by default places tooltips after their trigger element. Trigger the tooltip via JavaScript:\n\n```js\nconst exampleEl = document.getElementById('example')\nconst tooltip = new bootstrap.Tooltip(exampleEl, options)\n```\n\n<Callout type=\"warning\">\nTooltips automatically attempt to change positions when a parent container has `overflow: auto` or `overflow: scroll`, but still keeps the original placement’s positioning. Set the [`boundary` option](https://popper.js.org/docs/v2/modifiers/flip/#boundary) (for the flip modifier using the `popperConfig` option) to any HTMLElement to override the default value, `'clippingParents'`, such as `document.body`:\n\n```js\nconst tooltip = new bootstrap.Tooltip('#example', {\n  boundary: document.body // or document.querySelector('#boundary')\n})\n```\n</Callout>\n\n### Markup\n\nThe required markup for a tooltip is only a `data` attribute and `title` on the HTML element you wish to have a tooltip. The generated markup of a tooltip is rather simple, though it does require a position (by default, set to `top` by the plugin).\n\n<Callout type=\"warning\">\n**Keep tooltips accessible to keyboard and assistive technology users** by only adding them to HTML elements that are traditionally keyboard-focusable and interactive (such as links or form controls). While other HTML elements can be made focusable by adding `tabindex=\"0\"`, this can create annoying and confusing tab stops on non-interactive elements for keyboard users, and most assistive technologies currently do not announce tooltips in this situation. Additionally, do not rely solely on `hover` as the trigger for your tooltips as this will make them impossible to trigger for keyboard users.\n</Callout>\n\n```html\n<!-- HTML to write -->\n<a href=\"#\" data-bs-toggle=\"tooltip\" data-bs-title=\"Some tooltip text!\">Hover over me</a>\n\n<!-- Generated markup by the plugin -->\n<div class=\"tooltip bs-tooltip-auto\" role=\"tooltip\">\n  <div class=\"tooltip-arrow\"></div>\n  <div class=\"tooltip-inner\">\n    Some tooltip text!\n  </div>\n</div>\n```\n\n### Disabled elements\n\nElements with the `disabled` attribute aren’t interactive, meaning users cannot focus, hover, or click them to trigger a tooltip (or popover). As a workaround, you’ll want to trigger the tooltip from a wrapper `<div>` or `<span>`, ideally made keyboard-focusable using `tabindex=\"0\"`.\n\n<Example class=\"tooltip-demo\" addStackblitzJs code={`<span class=\"d-inline-block\" tabindex=\"0\" data-bs-toggle=\"tooltip\" data-bs-title=\"Disabled tooltip\">\n    <button class=\"btn btn-primary\" type=\"button\" disabled>Disabled button</button>\n  </span>`} />\n\n### Options\n\n<JsDataAttributes />\n\n<Callout type=\"warning\">\nNote that for security reasons the `sanitize`, `sanitizeFn`, and `allowList` options cannot be supplied using data attributes.\n</Callout>\n\n\n<BsTable>\n| Name | Type | Default | Description |\n| --- | --- | --- | --- |\n| `allowList` | object | [Default value]([[docsref:/getting-started/javascript#sanitizer]]) | An object containing allowed tags and attributes. Those not explicitly allowed will be removed by [the content sanitizer]([[docsref:/getting-started/javascript#sanitizer]]). <Callout type=\"warning\">**Exercise caution when adding to this list.** Refer to [OWASP’s Cross Site Scripting Prevention Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html) for more information.</Callout> |\n| `animation` | boolean | `true` | Apply a CSS fade transition to the tooltip. |\n| `boundary` | string, element | `'clippingParents'` | Overflow constraint boundary of the tooltip (applies only to Popper’s preventOverflow modifier). By default, it’s `'clippingParents'` and can accept an HTMLElement reference (via JavaScript only). For more information refer to Popper’s [detectOverflow docs](https://popper.js.org/docs/v2/utils/detect-overflow/#boundary). |\n| `container` | string, element, false | `false` | Appends the tooltip to a specific element. Example: `container: 'body'`. This option is particularly useful in that it allows you to position the tooltip in the flow of the document near the triggering element -&nbsp;which will prevent the tooltip from floating away from the triggering element during a window resize. |\n| `customClass` | string, function | `''` | Add classes to the tooltip when it is shown. Note that these classes will be added in addition to any classes specified in the template. To add multiple classes, separate them with spaces: `'class-1 class-2'`. You can also pass a function that should return a single string containing additional class names. |\n| `delay` | number, object | `0` | Delay showing and hiding the tooltip (ms)—doesn’t apply to manual trigger type. If a number is supplied, delay is applied to both hide/show. Object structure is: `delay: { \"show\": 500, \"hide\": 100 }`. |\n| `fallbackPlacements` | array | `['top', 'right', 'bottom', 'left']` | Define fallback placements by providing a list of placements in array (in order of preference). For more information refer to Popper’s [behavior docs](https://popper.js.org/docs/v2/modifiers/flip/#fallbackplacements). |\n| `html` | boolean | `false` | Allow HTML in the tooltip. If true, HTML tags in the tooltip’s `title` will be rendered in the tooltip. If false, `innerText` property will be used to insert content into the DOM. Prefer text when dealing with user-generated input to [prevent XSS attacks](https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html). |\n| `offset` | array, string, function | `[0, 6]` | Offset of the tooltip relative to its target. You can pass a string in data attributes with comma separated values like: `data-bs-offset=\"10,20\"`. When a function is used to determine the offset, it is called with an object containing the popper placement, the reference, and popper rects as its first argument. The triggering element DOM node is passed as the second argument. The function must return an array with two numbers: [skidding](https://popper.js.org/docs/v2/modifiers/offset/#skidding-1), [distance](https://popper.js.org/docs/v2/modifiers/offset/#distance-1). For more information refer to Popper’s [offset docs](https://popper.js.org/docs/v2/modifiers/offset/#options). |\n| `placement` | string, function | `'top'` | How to position the tooltip: auto, top, bottom, left, right. When `auto` is specified, it will dynamically reorient the tooltip. When a function is used to determine the placement, it is called with the tooltip DOM node as its first argument and the triggering element DOM node as its second. The `this` context is set to the tooltip instance. |\n| `popperConfig` | null, object, function | `null` | To change Bootstrap’s default Popper config, see [Popper’s configuration](https://popper.js.org/docs/v2/constructors/#options). When a function is used to create the Popper configuration, it’s called with an object that contains the Bootstrap’s default Popper configuration. It helps you use and merge the default with your own configuration. The function must return a configuration object for Popper. |\n| `sanitize` | boolean | `true` | Enable [content sanitization]([[docsref:/getting-started/javascript#sanitizer]]). If true, the `template`, `content` and `title` options will be sanitized. <Callout type=\"warning\">**Exercise caution when disabling content sanitization.** Refer to [OWASP’s Cross Site Scripting Prevention Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html) for more information. Vulnerabilities caused solely by disabling content sanitization are not considered within scope for Bootstrap’s security model.</Callout> |\n| `sanitizeFn` | null, function | `null` | Provide an alternative [content sanitization]([[docsref:/getting-started/javascript#sanitizer]]) function. This can be useful if you prefer to use a dedicated library to perform sanitization. |\n| `selector` | string, false | `false` | If a selector is provided, tooltip objects will be delegated to the specified targets. In practice, this is used to also apply tooltips to dynamically added DOM elements (`jQuery.on` support). See [this issue]([[config:repo]]/issues/4215) and [an informative example](https://codepen.io/Johann-S/pen/djJYPb). **Note**: `title` attribute must not be used as a selector. |\n| `template` | string | `'<div class=\"tooltip\" role=\"tooltip\"><div class=\"tooltip-arrow\"></div><div class=\"tooltip-inner\"></div></div>'` | Base HTML to use when creating the tooltip. The tooltip’s `title` will be injected into the `.tooltip-inner`. `.tooltip-arrow` will become the tooltip’s arrow. The outermost wrapper element should have the `.tooltip` class and `role=\"tooltip\"`. |\n| `title` | string, element, function | `''` | The tooltip title. If a function is given, it will be called with its `this` reference set to the element that the popover is attached to. |\n| `trigger` | string | `'hover focus'` | How tooltip is triggered: click, hover, focus, manual. You may pass multiple triggers; separate them with a space. `'manual'` indicates that the tooltip will be triggered programmatically via the `.tooltip('show')`, `.tooltip('hide')` and `.tooltip('toggle')` methods; this value cannot be combined with any other trigger. `'hover'` on its own will result in tooltips that cannot be triggered via the keyboard, and should only be used if alternative methods for conveying the same information for keyboard users is present. |\n</BsTable>\n\n<Callout>\n#### Data attributes for individual tooltips\n\nOptions for individual tooltips can alternatively be specified through the use of data attributes, as explained above.\n</Callout>\n\n#### Using function with `popperConfig`\n\n```js\nconst tooltip = new bootstrap.Tooltip(element, {\n  popperConfig(defaultBsPopperConfig) {\n    // const newPopperConfig = {...}\n    // use defaultBsPopperConfig if needed...\n    // return newPopperConfig\n  }\n})\n```\n\n### Methods\n\n<Callout name=\"danger-async-methods\" type=\"danger\" />\n\n<BsTable>\n| Method | Description |\n| --- | --- |\n| `disable` | Removes the ability for an element’s tooltip to be shown. The tooltip will only be able to be shown if it is re-enabled. |\n| `dispose` | Hides and destroys an element’s tooltip (Removes stored data on the DOM element). Tooltips that use delegation (which are created using [the `selector` option](#options)) cannot be individually destroyed on descendant trigger elements. |\n| `enable` | Gives an element’s tooltip the ability to be shown. **Tooltips are enabled by default.** |\n| `getInstance` | *Static* method which allows you to get the tooltip instance associated with a DOM element. |\n| `getOrCreateInstance` | *Static* method which allows you to get the tooltip instance associated with a DOM element, or create a new one in case it wasn’t initialized. |\n| `hide` | Hides an element’s tooltip. **Returns to the caller before the tooltip has actually been hidden** (i.e. before the `hidden.bs.tooltip` event occurs). This is considered a “manual” triggering of the tooltip. |\n| `setContent` | Gives a way to change the tooltip’s content after its initialization. |\n| `show` | Reveals an element’s tooltip. **Returns to the caller before the tooltip has actually been shown** (i.e. before the `shown.bs.tooltip` event occurs). This is considered a “manual” triggering of the tooltip. Tooltips with zero-length titles are never displayed. |\n| `toggle` | Toggles an element’s tooltip. **Returns to the caller before the tooltip has actually been shown or hidden** (i.e. before the `shown.bs.tooltip` or `hidden.bs.tooltip` event occurs). This is considered a “manual” triggering of the tooltip. |\n| `toggleEnabled` | Toggles the ability for an element’s tooltip to be shown or hidden. |\n| `update` | Updates the position of an element’s tooltip. |\n</BsTable>\n\n```js\nconst tooltip = bootstrap.Tooltip.getInstance('#example') // Returns a Bootstrap tooltip instance\n\n// setContent example\ntooltip.setContent({ '.tooltip-inner': 'another title' })\n```\n\n<Callout>\nThe `setContent` method accepts an `object` argument, where each property-key is a valid `string` selector within the tooltip template, and each related property-value can be `string` | `element` | `function` | `null`\n</Callout>\n\n### Events\n\n<BsTable>\n| Event | Description |\n| --- | --- |\n| `hide.bs.tooltip` | This event is fired immediately when the `hide` instance method has been called. |\n| `hidden.bs.tooltip` | This event is fired when the tooltip has finished being hidden from the user (will wait for CSS transitions to complete). |\n| `inserted.bs.tooltip` | This event is fired after the `show.bs.tooltip` event when the tooltip template has been added to the DOM. |\n| `show.bs.tooltip` | This event fires immediately when the `show` instance method is called. |\n| `shown.bs.tooltip` | This event is fired when the tooltip has been made visible to the user (will wait for CSS transitions to complete). |\n</BsTable>\n\n```js\nconst myTooltipEl = document.getElementById('myTooltip')\nconst tooltip = bootstrap.Tooltip.getOrCreateInstance(myTooltipEl)\n\nmyTooltipEl.addEventListener('hidden.bs.tooltip', () => {\n  // do something...\n})\n\ntooltip.hide()\n```\n"
  },
  {
    "path": "site/src/content/docs/content/figures.mdx",
    "content": "---\ntitle: Figures\ndescription: Documentation and examples for displaying related images and text with the figure component in Bootstrap.\ntoc: true\n---\n\nAnytime you need to display a piece of content—like an image with an optional caption, consider using a `<figure>`.\n\nUse the included `.figure`, `.figure-img` and `.figure-caption` classes to provide some baseline styles for the HTML5 `<figure>` and `<figcaption>` elements. Images in figures have no explicit size, so be sure to add the `.img-fluid` class to your `<img>` to make it responsive.\n\n<Example code={`<figure class=\"figure\">\n    <Placeholder width=\"400\" height=\"300\" class=\"figure-img img-fluid rounded\" />\n    <figcaption class=\"figure-caption\">A caption for the above image.</figcaption>\n  </figure>`} />\n\nAligning the figure’s caption is easy with our [text utilities]([[docsref:/utilities/text#text-alignment]]).\n\n<Example code={`<figure class=\"figure\">\n    <Placeholder width=\"400\" height=\"300\" class=\"figure-img img-fluid rounded\" />\n    <figcaption class=\"figure-caption text-end\">A caption for the above image.</figcaption>\n  </figure>`} />\n\n## CSS\n\n### Sass variables\n\n<ScssDocs name=\"figure-variables\" file=\"scss/_variables.scss\" />\n"
  },
  {
    "path": "site/src/content/docs/content/images.mdx",
    "content": "---\ntitle: Images\ndescription: Documentation and examples for opting images into responsive behavior (so they never become wider than their parent) and add lightweight styles to them—all via classes.\ntoc: true\n---\n\n## Responsive images\n\nImages in Bootstrap are made responsive with `.img-fluid`. This applies `max-width: 100%;` and `height: auto;` to the image so that it scales with the parent width.\n\n<Example code={`<Placeholder width=\"100%\" height=\"250\" class=\"bd-placeholder-img-lg img-fluid\" text=\"Responsive image\" />`} />\n\n## Image thumbnails\n\nIn addition to our [border-radius utilities]([[docsref:/utilities/borders]]), you can use `.img-thumbnail` to give an image a rounded 1px border appearance.\n\n<Example code={`<Placeholder width=\"200\" height=\"200\" class=\"img-thumbnail\" title=\"A generic square placeholder image with a white border around it, making it resemble a photograph taken with an old instant camera\" />`} />\n\n## Aligning images\n\nAlign images with the [helper float classes]([[docsref:/utilities/float]]) or [text alignment classes]([[docsref:/utilities/text#text-alignment]]). `block`-level images can be centered using [the `.mx-auto` margin utility class]([[docsref:/utilities/spacing#horizontal-centering]]).\n\n<Example code={`<Placeholder width=\"200\" height=\"200\" class=\"rounded float-start\" />\n<Placeholder width=\"200\" height=\"200\" class=\"rounded float-end\" />`} />\n\n\n<Example code={`<Placeholder width=\"200\" height=\"200\" class=\"rounded mx-auto d-block\" />`} />\n\n<Example code={`<div class=\"text-center\">\n    <Placeholder width=\"200\" height=\"200\" class=\"rounded\" />\n  </div>`} />\n\n\n## Picture\n\nIf you are using the `<picture>` element to specify multiple `<source>` elements for a specific `<img>`, make sure to add the `.img-*` classes to the `<img>` and not to the `<picture>` tag.\n\n```html\n<picture>\n  <source srcset=\"...\" type=\"image/svg+xml\">\n  <img src=\"...\" class=\"img-fluid img-thumbnail\" alt=\"...\">\n</picture>\n```\n\n## CSS\n\n### Sass variables\n\nVariables are available for image thumbnails.\n\n<ScssDocs name=\"thumbnail-variables\" file=\"scss/_variables.scss\" />\n"
  },
  {
    "path": "site/src/content/docs/content/reboot.mdx",
    "content": "---\ntitle: Reboot\ndescription: Reboot, a collection of element-specific CSS changes in a single file, kickstart Bootstrap to provide an elegant, consistent, and simple baseline to build upon.\naliases: \"/docs/[[config:docs_version]]/content/\"\ntoc: true\n---\n\n## Approach\n\nReboot builds upon Normalize, providing many HTML elements with somewhat opinionated styles using only element selectors. Additional styling is done only with classes. For example, we reboot some `<table>` styles for a simpler baseline and later provide `.table`, `.table-bordered`, and more.\n\nHere are our guidelines and reasons for choosing what to override in Reboot:\n\n- Update some browser default values to use `rem`s instead of `em`s for scalable component spacing.\n- Avoid `margin-top`. Vertical margins can collapse, yielding unexpected results. More importantly though, a single direction of `margin` is a simpler mental model.\n- For easier scaling across device sizes, block elements should use `rem`s for `margin`s.\n- Keep declarations of `font`-related properties to a minimum, using `inherit` whenever possible.\n\n## CSS variables\n\n<AddedIn version=\"5.2.0\"/>\n\nWith v5.1.1, we standardized our required `@import`s across all our CSS bundles (including `bootstrap.css`, `bootstrap-reboot.css`, and `bootstrap-grid.css`) to include `_root.scss`. This adds `:root` level CSS variables to all bundles, regardless of how many of them are used in that bundle. Ultimately Bootstrap 5 will continue to see more [CSS variables]([[docsref:/customize/css-variables]]) added over time, in order to provide more real-time customization without the need to always recompile Sass. Our approach is to take our source Sass variables and transform them into CSS variables. That way, even if you don’t use CSS variables, you still have all the power of Sass. **This is still in-progress and will take time to fully implement.**\n\nFor example, consider these `:root` CSS variables for common `<body>` styles:\n\n<ScssDocs name=\"root-body-variables\" file=\"scss/_root.scss\" />\n\nIn practice, those variables are then applied in Reboot like so:\n\n<ScssDocs name=\"reboot-body-rules\" file=\"scss/_reboot.scss\" />\n\nWhich allows you to make real-time customizations however you like:\n\n```html\n<body style=\"--bs-body-color: #333;\">\n  <!-- ... -->\n</body>\n```\n\n## Page defaults\n\nThe `<html>` and `<body>` elements are updated to provide better page-wide defaults. More specifically:\n\n- The `box-sizing` is globally set on every element—including `*::before` and `*::after`, to `border-box`. This ensures that the declared width of element is never exceeded due to padding or border.\n  - No base `font-size` is declared on the `<html>`, but `16px` is assumed (the browser default). `font-size: 1rem` is applied on the `<body>` for easy responsive type-scaling via media queries while respecting user preferences and ensuring a more accessible approach. This browser default can be overridden by modifying the `$font-size-root` variable.\n- The `<body>` also sets a global `font-family`, `font-weight`, `line-height`, and `color`. This is inherited later by some form elements to prevent font inconsistencies.\n- For safety, the `<body>` has a declared `background-color`, defaulting to `#fff`.\n\n## Native font stack\n\nBootstrap utilizes a “native font stack” or “system font stack” for optimum text rendering on every device and OS. These system fonts have been designed specifically with today’s devices in mind, with improved rendering on screens, variable font support, and more. Read more about [native font stacks in this *Smashing Magazine* article](https://www.smashingmagazine.com/2015/11/using-system-ui-fonts-practical-guide/).\n\n```scss\n$font-family-sans-serif:\n  // Cross-platform generic font family (default user interface font)\n  system-ui,\n  // Safari for macOS and iOS (San Francisco)\n  -apple-system,\n  // Windows\n  \"Segoe UI\",\n  // Android\n  Roboto,\n  // older macOS and iOS\n  \"Helvetica Neue\",\n  // Linux\n  \"Noto Sans\",\n  \"Liberation Sans\",\n  // Basic web fallback\n  Arial,\n  // Sans serif fallback\n  sans-serif,\n  // Emoji fonts\n  \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\" !default;\n```\n\nNote that because the font stack includes emoji fonts, many common symbol/dingbat Unicode characters will be rendered as multicolored pictographs. Their appearance will vary, depending on the style used in the browser/platform’s native emoji font, and they won’t be affected by any CSS `color` styles.\n\nThis `font-family` is applied to the `<body>` and automatically inherited globally throughout Bootstrap. To switch the global `font-family`, update `$font-family-base` and recompile Bootstrap.\n\n## Headings\n\nAll heading elements—`<h1>`—`<h6>` have their `margin-top` removed, `margin-bottom: .5rem` set, and `line-height` tightened. While headings inherit their `color` by default, you can also override it via optional CSS variable, `--bs-heading-color`.\n\n<BsTable>\n| Heading | Example |\n| --- | --- |\n| `<h1></h1>` | <span class=\"h1\">h1. Bootstrap heading</span> |\n| `<h2></h2>` | <span class=\"h2\">h2. Bootstrap heading</span> |\n| `<h3></h3>` | <span class=\"h3\">h3. Bootstrap heading</span> |\n| `<h4></h4>` | <span class=\"h4\">h4. Bootstrap heading</span> |\n| `<h5></h5>` | <span class=\"h5\">h5. Bootstrap heading</span> |\n| `<h6></h6>` | <span class=\"h6\">h6. Bootstrap heading</span> |\n</BsTable>\n\n## Paragraphs\n\nAll `<p>` elements have their `margin-top` removed and `margin-bottom: 1rem` set for easy spacing.\n\n<Example code={`<p>This is an example paragraph.</p>`} />\n\n## Links\n\nLinks have a default `color` and underline applied. While links change on `:hover`, they don’t change based on whether someone `:visited` the link. They also receive no special `:focus` styles.\n\n<Example code={`<a href=\"#\">This is an example link</a>`} />\n\nAs of v5.3.x, link `color` is set using `rgba()` and new `-rgb` CSS variables, allowing for easy customization of link color opacity. Change the link color opacity with the `--bs-link-opacity` CSS variable:\n\n<Example code={`<a href=\"#\" style=\"--bs-link-opacity: .5\">This is an example link</a>`} />\n\n\nPlaceholder links—those without an `href`—are targeted with a more specific selector and have their `color` and `text-decoration` reset to their default values.\n\n<Example code={`<a>This is a placeholder link</a>`} />\n\n## Horizontal rules\n\nThe `<hr>` element has been simplified. Similar to browser defaults, `<hr>`s are styled via `border-top`, have a default `opacity: .25`, and automatically inherit their `border-color` via `color`, including when `color` is set via the parent. They can be modified with text, border, and opacity utilities.\n\n<Example code={`<hr>\n\n  <div class=\"text-success\">\n    <hr>\n  </div>\n\n  <hr class=\"border border-danger border-2 opacity-50\">\n  <hr class=\"border border-primary border-3 opacity-75\">`} />\n\n## Lists\n\nAll lists—`<ul>`, `<ol>`, and `<dl>`—have their `margin-top` removed and a `margin-bottom: 1rem`. Nested lists have no `margin-bottom`. We’ve also reset the `padding-left` on `<ul>` and `<ol>` elements.\n\n<div class=\"bd-example\">\n* All lists have their top margin removed\n* And their bottom margin normalized\n* Nested lists have no bottom margin\n  * This way they have a more even appearance\n  * Particularly when followed by more list items\n* The left padding has also been reset\n\n1. Here’s an ordered list\n2. With a few list items\n3. It has the same overall look\n4. As the previous unordered list\n</div>\n\nFor simpler styling, clear hierarchy, and better spacing, description lists have updated `margin`s. `<dd>`s reset `margin-left` to `0` and add `margin-bottom: .5rem`. `<dt>`s are **bolded**.\n\n<Example showMarkup={false} code={`\n<dl>\n  <dt>Description lists</dt>\n  <dd>A description list is perfect for defining terms.</dd>\n  <dt>Term</dt>\n  <dd>Definition for the term.</dd>\n  <dd>A second definition for the same term.</dd>\n  <dt>Another term</dt>\n  <dd>Definition for this other term.</dd>\n</dl>\n`} />\n\n## Inline code\n\nWrap inline snippets of code with `<code>`. Be sure to escape HTML angle brackets.\n\n<Example code={`For example, <code>&lt;section&gt;</code> should be wrapped as inline.`} />\n\n## Code blocks\n\nUse `<pre>`s for multiple lines of code. Once again, be sure to escape any angle brackets in the code for proper rendering. The `<pre>` element is reset to remove its `margin-top` and use `rem` units for its `margin-bottom`.\n\n<Example code={`<pre><code>&lt;p&gt;Sample text here...&lt;/p&gt;\n&lt;p&gt;And another line of sample text here...&lt;/p&gt;\n</code></pre>`} />\n\n## Variables\n\nFor indicating variables use the `<var>` tag.\n\n<Example code={`<var>y</var> = <var>m</var><var>x</var> + <var>b</var>`} />\n\n## User input\n\nUse the `<kbd>` to indicate input that is typically entered via keyboard.\n\n<Example code={`To switch directories, type <kbd>cd</kbd> followed by the name of the directory.<br>\nTo edit settings, press <kbd><kbd>Ctrl</kbd> + <kbd>,</kbd></kbd>`} />\n\n## Sample output\n\nFor indicating sample output from a program use the `<samp>` tag.\n\n<Example code={`<samp>This text is meant to be treated as sample output from a computer program.</samp>`} />\n\n## Tables\n\nTables are slightly adjusted to style `<caption>`s, collapse borders, and ensure consistent `text-align` throughout. Additional changes for borders, padding, and more come with [the `.table` class]([[docsref:/content/tables]]).\n\n<Example code={`<table>\n    <caption>\n      This is an example table, and this is its caption to describe the contents.\n    </caption>\n    <thead>\n      <tr>\n        <th>Table heading</th>\n        <th>Table heading</th>\n        <th>Table heading</th>\n        <th>Table heading</th>\n      </tr>\n    </thead>\n    <tbody>\n      <tr>\n        <td>Table cell</td>\n        <td>Table cell</td>\n        <td>Table cell</td>\n        <td>Table cell</td>\n      </tr>\n      <tr>\n        <td>Table cell</td>\n        <td>Table cell</td>\n        <td>Table cell</td>\n        <td>Table cell</td>\n      </tr>\n      <tr>\n        <td>Table cell</td>\n        <td>Table cell</td>\n        <td>Table cell</td>\n        <td>Table cell</td>\n      </tr>\n    </tbody>\n  </table>`} />\n\n## Forms\n\nVarious form elements have been rebooted for simpler base styles. Here are some of the most notable changes:\n\n- `<fieldset>`s have no borders, padding, or margin so they can be easily used as wrappers for individual inputs or groups of inputs.\n- `<legend>`s, like fieldsets, have also been restyled to be displayed as a heading of sorts.\n- `<label>`s are set to `display: inline-block` to allow `margin` to be applied.\n- `<input>`s, `<select>`s, `<textarea>`s, and `<button>`s are mostly addressed by Normalize, but Reboot removes their `margin` and sets `line-height: inherit`, too.\n- `<textarea>`s are modified to only be resizable vertically as horizontal resizing often “breaks” page layout.\n- `<button>`s and `<input>` button elements have `cursor: pointer` when `:not(:disabled)`.\n\nThese changes, and more, are demonstrated below.\n\n<Callout name=\"warning-input-support\" type=\"warning\" />\n\n<Example showMarkup={false} code={`<form>\n  <fieldset>\n    <legend>Example legend</legend>\n    <p>\n      <label for=\"input\">Example input</label>\n      <input type=\"text\" id=\"input\" placeholder=\"Example input\"/>\n    </p>\n    <p>\n      <label for=\"email\">Example email</label>\n      <input type=\"email\" id=\"email\" placeholder=\"test@example.com\"/>\n    </p>\n    <p>\n      <label for=\"tel\">Example telephone</label>\n      <input type=\"tel\" id=\"tel\"/>\n    </p>\n    <p>\n      <label for=\"url\">Example url</label>\n      <input type=\"url\" id=\"url\"/>\n    </p>\n    <p>\n      <label for=\"number\">Example number</label>\n      <input type=\"number\" id=\"number\"/>\n    </p>\n    <p>\n      <label for=\"search\">Example search</label>\n      <input type=\"search\" id=\"search\"/>\n    </p>\n    <p>\n      <label for=\"range\">Example range</label>\n      <input type=\"range\" id=\"range\" min=\"0\" max=\"10\"/>\n    </p>\n    <p>\n      <label for=\"file\">Example file input</label>\n      <input type=\"file\" id=\"file\"/>\n    </p>\n    <p>\n      <label for=\"select\">Example select</label>\n      <select id=\"select\">\n        <option value=\"\">Choose...</option>\n        <optgroup label=\"Option group 1\">\n          <option value=\"\">Option 1</option>\n          <option value=\"\">Option 2</option>\n          <option value=\"\">Option 3</option>\n        </optgroup>\n        <optgroup label=\"Option group 2\">\n          <option value=\"\">Option 4</option>\n          <option value=\"\">Option 5</option>\n          <option value=\"\">Option 6</option>\n        </optgroup>\n      </select>\n    </p>\n    <p>\n      <label>\n        <input type=\"checkbox\" value=\"\"/>\n        Check this checkbox\n      </label>\n    </p>\n    <p>\n      <label>\n        <input type=\"radio\" name=\"optionsRadios\" id=\"optionsRadios1\" value=\"option1\" checked/>\n        Option one is this and that\n      </label>\n      <label>\n        <input type=\"radio\" name=\"optionsRadios\" id=\"optionsRadios2\" value=\"option2\"/>\n        Option two is something else that’s also super long to demonstrate the wrapping of these fancy form controls.\n      </label>\n      <label>\n        <input type=\"radio\" name=\"optionsRadios\" id=\"optionsRadios3\" value=\"option3\" disabled/>\n        Option three is disabled\n      </label>\n    </p>\n    <p>\n      <label for=\"textarea\">Example textarea</label>\n      <textarea id=\"textarea\" rows=\"3\"></textarea>\n    </p>\n    <p>\n      <label for=\"date\">Example date</label>\n      <input type=\"date\" id=\"date\"/>\n    </p>\n    <p>\n      <label for=\"time\">Example time</label>\n      <input type=\"time\" id=\"time\"/>\n    </p>\n    <p>\n      <label for=\"password\">Example password</label>\n      <input type=\"password\" id=\"password\"/>\n    </p>\n    <p>\n      <label for=\"datetime-local\">Example datetime-local</label>\n      <input type=\"datetime-local\" id=\"datetime-local\"/>\n    </p>\n    <p>\n      <label for=\"week\">Example week</label>\n      <input type=\"week\" id=\"week\"/>\n    </p>\n    <p>\n      <label for=\"month\">Example month</label>\n      <input type=\"month\" id=\"month\"/>\n    </p>\n    <p>\n      <label for=\"color\">Example color</label>\n      <input type=\"color\" id=\"color\"/>\n    </p>\n    <p>\n      <label for=\"output\">Example output</label>\n      <output name=\"result\" id=\"output\">100</output>\n    </p>\n    <p>\n      <button type=\"submit\">Button submit</button>\n      <input type=\"submit\" value=\"Input submit button\"/>\n      <input type=\"reset\" value=\"Input reset button\"/>\n      <input type=\"button\" value=\"Input button\"/>\n    </p>\n    <p>\n      <button type=\"submit\" disabled>Button submit</button>\n      <input type=\"submit\" value=\"Input submit button\" disabled/>\n      <input type=\"reset\" value=\"Input reset button\" disabled/>\n      <input type=\"button\" value=\"Input button\" disabled/>\n    </p>\n  </fieldset>\n</form>`} />\n\n### Pointers on buttons\n\nReboot includes an enhancement for `role=\"button\"` to change the default cursor to `pointer`. Add this attribute to elements to help indicate elements are interactive. This role isn’t necessary for `<button>` elements, which get their own `cursor` change.\n\n<Example code={`<span role=\"button\" tabindex=\"0\">Non-button element button</span>`} />\n\n## Misc elements\n\n### Address\n\nThe `<address>` element is updated to reset the browser default `font-style` from `italic` to `normal`. `line-height` is also now inherited, and `margin-bottom: 1rem` has been added. `<address>`s are for presenting contact information for the nearest ancestor (or an entire body of work). Preserve formatting by ending lines with `<br>`.\n\n<Example showMarkup={false} code={`<address>\n    <strong>ACME Corporation</strong><br/>\n    1123 Fictional St,<br/>\n    San Francisco, CA 94103<br/>\n    <abbr title=\"Phone\">P:</abbr> (123) 456-7890\n  </address>\n\n  <address>\n    <strong>Full Name</strong><br/>\n    <a href=\"mailto:first.last@example.com\">first.last@example.com</a>\n  </address>`} />\n\n### Blockquote\n\nThe default `margin` on blockquotes is `1em 40px`, so we reset that to `0 0 1rem` for something more consistent with other elements.\n\n<Example showMarkup={false} code={`<figure>\n    <blockquote class=\"blockquote\">\n      <p>A well-known quote, contained in a blockquote element.</p>\n    </blockquote>\n    <figcaption>\n      Someone famous in <cite title=\"Source Title\">Source Title</cite>\n    </figcaption>\n  </figure>`} />\n\n### Inline elements\n\nThe `<abbr>` element receives basic styling to make it stand out amongst paragraph text.\n\n<Example showMarkup={false} code={`\nThe <abbr title=\"HyperText Markup Language\">HTML</abbr> abbreviation element.\n`} />\n\n### Summary\n\nThe default `cursor` on summary is `text`, so we reset that to `pointer` to convey that the element can be interacted with by clicking on it.\n\n<Example showMarkup={false} code={`\n<details>\n  <summary>Some details</summary>\n  <p>More info about the details.</p>\n</details>\n\n<details open>\n  <summary>Even more details</summary>\n  <p>Here are even more details about the details.</p>\n</details>\n`} />\n\n## HTML5 `[hidden]` attribute\n\nHTML5 adds [a new global attribute named `[hidden]`](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/hidden), which is styled as `display: none` by default. Borrowing an idea from [PureCSS](https://purecss.io/), we improve upon this default by making `[hidden] { display: none !important; }` to help prevent its `display` from getting accidentally overridden.\n\n```html\n<input type=\"text\" hidden>\n```\n\n<Callout>\nSince `[hidden]` is not compatible with jQuery’s `$(...).hide()` and `$(...).show()` methods, we don’t specifically endorse `[hidden]` over other techniques for managing the `display` of elements.\n</Callout>\n\nTo merely toggle the visibility of an element, meaning its `display` is not modified and the element can still affect the flow of the document, use [the `.invisible` class]([[docsref:/utilities/visibility]]) instead.\n"
  },
  {
    "path": "site/src/content/docs/content/tables.mdx",
    "content": "---\ntitle: Tables\ndescription: Documentation and examples for opt-in styling of tables (given their prevalent use in JavaScript plugins) with Bootstrap.\ntoc: true\n---\n\nimport { getData } from '@libs/data'\n\n## Overview\n\nDue to the widespread use of `<table>` elements across third-party widgets like calendars and date pickers, Bootstrap’s tables are **opt-in**. Add the base class `.table` to any `<table>`, then extend with our optional modifier classes or custom styles. All table styles are not inherited in Bootstrap, meaning any nested tables can be styled independent from the parent.\n\nUsing the most basic table markup, here’s how `.table`-based tables look in Bootstrap.\n\n<Table class=\"table\" simplified={false} />\n\n## Variants\n\nUse contextual classes to color tables, table rows or individual cells.\n\n<Callout>\n**Heads up!** Because of the more complicated CSS used to generate our table variants, they most likely won’t see color mode adaptive styling until v6.\n</Callout>\n\n<div class=\"bd-example\">\n  <table class=\"table\">\n    <thead>\n      <tr>\n        <th scope=\"col\">Class</th>\n        <th scope=\"col\">Heading</th>\n        <th scope=\"col\">Heading</th>\n      </tr>\n    </thead>\n    <tbody>\n      <tr>\n        <th scope=\"row\">Default</th>\n        <td>Cell</td>\n        <td>Cell</td>\n      </tr>\n      {getData('theme-colors').map((themeColor) => {\n        return (\n          <tr class={`table-${themeColor.name}`}>\n            <th scope=\"row\">{themeColor.title}</th>\n            <td>Cell</td>\n            <td>Cell</td>\n          </tr>\n        )\n      })}\n    </tbody>\n  </table>\n</div>\n\n<Code code={[\n  `<!-- On tables -->`,\n  ...getData('theme-colors').map((themeColor) => `<table class=\"table table-${themeColor.name}\">...</table>`),\n  `\n<!-- On rows -->`,\n  ...getData('theme-colors').map((themeColor) => `<tr class=\"table-${themeColor.name}\">...</tr>`),\n  `\n<!-- On cells (\\`td\\` or \\`th\\`) -->\n<tr>`,\n  ...getData('theme-colors').map((themeColor) => `  <td class=\"table-${themeColor.name}\">...</td>`),\n  `</tr>`\n]} lang=\"html\" />\n\n<Callout name=\"warning-color-assistive-technologies\" />\n\n## Accented tables\n\n### Striped rows\n\nUse `.table-striped` to add zebra-striping to any table row within the `<tbody>`.\n\n<Table class=\"table table-striped\" />\n\n### Striped columns\n\nUse `.table-striped-columns` to add zebra-striping to any table column.\n\n<Table class=\"table table-striped-columns\" />\n\nThese classes can also be added to table variants:\n\n<Table class=\"table table-dark table-striped\" />\n\n<Table class=\"table table-dark table-striped-columns\" />\n\n<Table class=\"table table-success table-striped\" />\n\n<Table class=\"table table-success table-striped-columns\" />\n\n### Hoverable rows\n\nAdd `.table-hover` to enable a hover state on table rows within a `<tbody>`.\n\n<Table class=\"table table-hover\" />\n\n<Table class=\"table table-dark table-hover\" />\n\nThese hoverable rows can also be combined with the striped rows variant:\n\n<Table class=\"table table-striped table-hover\" />\n\n### Active tables\n\nHighlight a table row or cell by adding a `.table-active` class.\n\n<Example showMarkup={false} code={`\n<table class=\"table\">\n  <thead>\n    <tr>\n      <th scope=\"col\">#</th>\n      <th scope=\"col\">First</th>\n      <th scope=\"col\">Last</th>\n      <th scope=\"col\">Handle</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr class=\"table-active\">\n      <th scope=\"row\">1</th>\n      <td>Mark</td>\n      <td>Otto</td>\n      <td>@mdo</td>\n    </tr>\n    <tr>\n      <th scope=\"row\">2</th>\n      <td>Jacob</td>\n      <td>Thornton</td>\n      <td>@fat</td>\n    </tr>\n    <tr>\n      <th scope=\"row\">3</th>\n      <td>John</td>\n      <td>Doe</td>\n      <td class=\"table-active\">@social</td>\n    </tr>\n  </tbody>\n</table>\n`} />\n\n```html\n<table class=\"table\">\n  <thead>\n    ...\n  </thead>\n  <tbody>\n    <tr class=\"table-active\">\n      ...\n    </tr>\n    <tr>\n      ...\n    </tr>\n    <tr>\n      <th scope=\"row\">3</th>\n      <td>John</td>\n      <td>Doe</td>\n      <td class=\"table-active\">@social</td>\n    </tr>\n  </tbody>\n</table>\n```\n\n<Example showMarkup={false} code={`\n<table class=\"table table-dark\">\n  <thead>\n    <tr>\n      <th scope=\"col\">#</th>\n      <th scope=\"col\">First</th>\n      <th scope=\"col\">Last</th>\n      <th scope=\"col\">Handle</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr class=\"table-active\">\n      <th scope=\"row\">1</th>\n      <td>Mark</td>\n      <td>Otto</td>\n      <td>@mdo</td>\n    </tr>\n    <tr>\n      <th scope=\"row\">2</th>\n      <td>Jacob</td>\n      <td>Thornton</td>\n      <td>@fat</td>\n    </tr>\n    <tr>\n      <th scope=\"row\">3</th>\n      <td>John</td>\n      <td>Doe</td>\n      <td class=\"table-active\">@social</td>\n    </tr>\n  </tbody>\n</table>\n`} />\n\n```html\n<table class=\"table table-dark\">\n  <thead>\n    ...\n  </thead>\n  <tbody>\n    <tr class=\"table-active\">\n      ...\n    </tr>\n    <tr>\n      ...\n    </tr>\n    <tr>\n      <th scope=\"row\">3</th>\n      <td>John</td>\n      <td>Doe</td>\n      <td class=\"table-active\">@social</td>\n    </tr>\n  </tbody>\n</table>\n```\n\n## How do the variants and accented tables work?\n\nFor the accented tables ([striped rows](#striped-rows), [striped columns](#striped-columns), [hoverable rows](#hoverable-rows), and [active tables](#active-tables)), we used some techniques to make these effects work for all our [table variants](#variants):\n\n- We start by setting the background of a table cell with the `--bs-table-bg` custom property. All table variants then set that custom property to colorize the table cells. This way, we don’t get into trouble if semi-transparent colors are used as table backgrounds.\n- Then we add an inset box shadow on the table cells with `box-shadow: inset 0 0 0 9999px var(--bs-table-bg-state, var(--bs-table-bg-type, var(--bs-table-accent-bg)));` to layer on top of any specified `background-color`. It uses custom cascade to override the `box-shadow`, regardless the CSS specificity. Because we use a huge spread and no blur, the color will be monotone. Since `--bs-table-accent-bg` is set to `transparent` by default, we don’t have a default box shadow.\n- When either `.table-striped`, `.table-striped-columns`, `.table-hover` or `.table-active` classes are added, either `--bs-table-bg-type` or `--bs-table-bg-state` (by default set to `initial`) are set to a semitransparent color (`--bs-table-striped-bg`, `--bs-table-active-bg` or `--bs-table-hover-bg`) to colorize the background and override default `--bs-table-accent-bg`.\n- For each table variant, we generate a `--bs-table-accent-bg` color with the highest contrast depending on that color. For example, the accent color for `.table-primary` is darker while `.table-dark` has a lighter accent color.\n- Text and border colors are generated the same way, and their colors are inherited by default.\n\nBehind the scenes it looks like this:\n\n<ScssDocs name=\"table-variant\" file=\"scss/mixins/_table-variants.scss\" />\n\n## Table borders\n\n### Bordered tables\n\nAdd `.table-bordered` for borders on all sides of the table and cells.\n\n<Table class=\"table table-bordered\" />\n\n[Border color utilities]([[docsref:/utilities/borders#border-color]]) can be added to change colors:\n\n<Table class=\"table table-bordered border-primary\" />\n\n### Tables without borders\n\nAdd `.table-borderless` for a table without borders.\n\n<Table class=\"table table-borderless\" />\n\n<Table class=\"table table-dark table-borderless\" />\n\n## Small tables\n\nAdd `.table-sm` to make any `.table` more compact by cutting all cell `padding` in half.\n\n<Table class=\"table table-sm\" />\n\n<Table class=\"table table-dark table-sm\" />\n\n## Table group dividers\n\nAdd a thicker border, darker between table groups—`<thead>`, `<tbody>`, and `<tfoot>`—with `.table-group-divider`. Customize the color by changing the `border-top-color` (which we don’t currently provide a utility class for at this time).\n\n<Example code={`<table class=\"table\">\n    <thead>\n      <tr>\n        <th scope=\"col\">#</th>\n        <th scope=\"col\">First</th>\n        <th scope=\"col\">Last</th>\n        <th scope=\"col\">Handle</th>\n      </tr>\n    </thead>\n    <tbody class=\"table-group-divider\">\n      <tr>\n        <th scope=\"row\">1</th>\n        <td>Mark</td>\n        <td>Otto</td>\n        <td>@mdo</td>\n      </tr>\n      <tr>\n        <th scope=\"row\">2</th>\n        <td>Jacob</td>\n        <td>Thornton</td>\n        <td>@fat</td>\n      </tr>\n      <tr>\n        <th scope=\"row\">3</th>\n        <td>John</td>\n        <td>Doe</td>\n        <td>@social</td>\n      </tr>\n    </tbody>\n  </table>`} />\n\n## Vertical alignment\n\nTable cells of `<thead>` are always vertical aligned to the bottom. Table cells in `<tbody>` inherit their alignment from `<table>` and are aligned to the top by default. Use the [vertical align]([[docsref:/utilities/vertical-align]]) classes to re-align where needed.\n\n<Example showMarkup={false} code={`\n<div class=\"table-responsive\">\n  <table class=\"table align-middle\">\n    <thead>\n      <tr>\n        <th scope=\"col\" class=\"w-25\">Heading 1</th>\n        <th scope=\"col\" class=\"w-25\">Heading 2</th>\n        <th scope=\"col\" class=\"w-25\">Heading 3</th>\n        <th scope=\"col\" class=\"w-25\">Heading 4</th>\n      </tr>\n    </thead>\n    <tbody>\n      <tr>\n        <td>This cell inherits <code>vertical-align: middle;</code> from the table</td>\n        <td>This cell inherits <code>vertical-align: middle;</code> from the table</td>\n        <td>This cell inherits <code>vertical-align: middle;</code> from the table</td>\n        <td>This here is some placeholder text, intended to take up quite a bit of vertical space, to demonstrate how the vertical alignment works in the preceding cells.</td>\n      </tr>\n      <tr class=\"align-bottom\">\n        <td>This cell inherits <code>vertical-align: bottom;</code> from the table row</td>\n        <td>This cell inherits <code>vertical-align: bottom;</code> from the table row</td>\n        <td>This cell inherits <code>vertical-align: bottom;</code> from the table row</td>\n        <td>This here is some placeholder text, intended to take up quite a bit of vertical space, to demonstrate how the vertical alignment works in the preceding cells.</td>\n      </tr>\n      <tr>\n        <td>This cell inherits <code>vertical-align: middle;</code> from the table</td>\n        <td>This cell inherits <code>vertical-align: middle;</code> from the table</td>\n        <td class=\"align-top\">This cell is aligned to the top.</td>\n        <td>This here is some placeholder text, intended to take up quite a bit of vertical space, to demonstrate how the vertical alignment works in the preceding cells.</td>\n      </tr>\n    </tbody>\n  </table>\n</div>\n`} />\n\n```html\n<div class=\"table-responsive\">\n  <table class=\"table align-middle\">\n    <thead>\n      <tr>\n        ...\n      </tr>\n    </thead>\n    <tbody>\n      <tr>\n        ...\n      </tr>\n      <tr class=\"align-bottom\">\n        ...\n      </tr>\n      <tr>\n        <td>...</td>\n        <td>...</td>\n        <td class=\"align-top\">This cell is aligned to the top.</td>\n        <td>...</td>\n      </tr>\n    </tbody>\n  </table>\n</div>\n```\n\n## Nesting\n\nBorder styles, active styles, and table variants are not inherited by nested tables.\n\n<Example showMarkup={false} code={`\n<table class=\"table table-striped table-bordered\">\n  <thead>\n    <tr>\n      <th scope=\"col\">#</th>\n      <th scope=\"col\">First</th>\n      <th scope=\"col\">Last</th>\n      <th scope=\"col\">Handle</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th scope=\"row\">1</th>\n      <td>Mark</td>\n      <td>Otto</td>\n      <td>@mdo</td>\n    </tr>\n    <tr>\n      <td colspan=\"4\">\n        <table class=\"table mb-0\">\n          <thead>\n            <tr>\n              <th scope=\"col\">Header</th>\n              <th scope=\"col\">Header</th>\n              <th scope=\"col\">Header</th>\n            </tr>\n          </thead>\n          <tbody>\n            <tr>\n              <th scope=\"row\">A</th>\n              <td>First</td>\n              <td>Last</td>\n            </tr>\n            <tr>\n              <th scope=\"row\">B</th>\n              <td>First</td>\n              <td>Last</td>\n            </tr>\n            <tr>\n              <th scope=\"row\">C</th>\n              <td>First</td>\n              <td>Last</td>\n            </tr>\n          </tbody>\n        </table>\n      </td>\n    </tr>\n    <tr>\n      <th scope=\"row\">3</th>\n      <td>John</td>\n      <td>Doe</td>\n      <td>@social</td>\n    </tr>\n  </tbody>\n</table>\n`} />\n\n```html\n<table class=\"table table-striped table-bordered\">\n  <thead>\n    ...\n  </thead>\n  <tbody>\n    ...\n    <tr>\n      <td colspan=\"4\">\n        <table class=\"table mb-0\">\n          ...\n        </table>\n      </td>\n    </tr>\n    ...\n  </tbody>\n</table>\n```\n\n## How nesting works\n\nTo prevent _any_ styles from leaking to nested tables, we use the child combinator (`>`) selector in our CSS. Since we need to target all the `td`s and `th`s in the `thead`, `tbody`, and `tfoot`, our selector would look pretty long without it. As such, we use the rather odd looking `.table > :not(caption) > * > *` selector to target all `td`s and `th`s of the `.table`, but none of any potential nested tables.\n\nNote that if you add `<tr>`s as direct children of a table, those `<tr>` will be wrapped in a `<tbody>` by default, thus making our selectors work as intended.\n\n## Anatomy\n\n### Table head\n\nSimilar to tables and dark tables, use the modifier classes `.table-light` or `.table-dark` to make `<thead>`s appear light or dark gray.\n\n<Example showMarkup={false} code={`\n<table class=\"table\">\n  <thead class=\"table-light\">\n    <tr>\n      <th scope=\"col\">#</th>\n      <th scope=\"col\">First</th>\n      <th scope=\"col\">Last</th>\n      <th scope=\"col\">Handle</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th scope=\"row\">1</th>\n      <td>Mark</td>\n      <td>Otto</td>\n      <td>@mdo</td>\n    </tr>\n    <tr>\n      <th scope=\"row\">2</th>\n      <td>Jacob</td>\n      <td>Thornton</td>\n      <td>@fat</td>\n    </tr>\n    <tr>\n      <th scope=\"row\">3</th>\n      <td>John</td>\n      <td>Doe</td>\n      <td>@social</td>\n    </tr>\n  </tbody>\n</table>\n`} />\n\n```html\n<table class=\"table\">\n  <thead class=\"table-light\">\n    ...\n  </thead>\n  <tbody>\n    ...\n  </tbody>\n</table>\n```\n\n<Example showMarkup={false} code={`\n<table class=\"table\">\n  <thead class=\"table-dark\">\n    <tr>\n      <th scope=\"col\">#</th>\n      <th scope=\"col\">First</th>\n      <th scope=\"col\">Last</th>\n      <th scope=\"col\">Handle</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th scope=\"row\">1</th>\n      <td>Mark</td>\n      <td>Otto</td>\n      <td>@mdo</td>\n    </tr>\n    <tr>\n      <th scope=\"row\">2</th>\n      <td>Jacob</td>\n      <td>Thornton</td>\n      <td>@fat</td>\n    </tr>\n    <tr>\n      <th scope=\"row\">3</th>\n      <td>John</td>\n      <td>Doe</td>\n      <td>@social</td>\n    </tr>\n  </tbody>\n</table>\n`} />\n\n```html\n<table class=\"table\">\n  <thead class=\"table-dark\">\n    ...\n  </thead>\n  <tbody>\n    ...\n  </tbody>\n</table>\n```\n\n### Table foot\n\n<Example showMarkup={false} code={`\n<table class=\"table\">\n  <thead>\n    <tr>\n      <th scope=\"col\">#</th>\n      <th scope=\"col\">First</th>\n      <th scope=\"col\">Last</th>\n      <th scope=\"col\">Handle</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th scope=\"row\">1</th>\n      <td>Mark</td>\n      <td>Otto</td>\n      <td>@mdo</td>\n    </tr>\n    <tr>\n      <th scope=\"row\">2</th>\n      <td>Jacob</td>\n      <td>Thornton</td>\n      <td>@fat</td>\n    </tr>\n    <tr>\n      <th scope=\"row\">3</th>\n      <td>John</td>\n      <td>Doe</td>\n      <td>@social</td>\n    </tr>\n  </tbody>\n  <tfoot>\n    <tr>\n      <td>Footer</td>\n      <td>Footer</td>\n      <td>Footer</td>\n      <td>Footer</td>\n    </tr>\n  </tfoot>\n</table>\n`} />\n\n```html\n<table class=\"table\">\n  <thead>\n    ...\n  </thead>\n  <tbody>\n    ...\n  </tbody>\n  <tfoot>\n    ...\n  </tfoot>\n</table>\n```\n\n### Captions\n\nA `<caption>` functions like a heading for a table. It helps users with screen readers to find a table and understand what it’s about and decide if they want to read it.\n\n<div class=\"bd-example\">\n  <table class=\"table\">\n    <caption>List of users</caption>\n    <TableContent />\n  </table>\n</div>\n\n```html\n<table class=\"table table-sm\">\n  <caption>List of users</caption>\n  <thead>\n    ...\n  </thead>\n  <tbody>\n    ...\n  </tbody>\n</table>\n```\n\nYou can also put the `<caption>` on the top of the table with `.caption-top`.\n\n<Example code={`<table class=\"table caption-top\">\n    <caption>List of users</caption>\n    <thead>\n      <tr>\n        <th scope=\"col\">#</th>\n        <th scope=\"col\">First</th>\n        <th scope=\"col\">Last</th>\n        <th scope=\"col\">Handle</th>\n      </tr>\n    </thead>\n    <tbody>\n      <tr>\n        <th scope=\"row\">1</th>\n        <td>Mark</td>\n        <td>Otto</td>\n        <td>@mdo</td>\n      </tr>\n      <tr>\n        <th scope=\"row\">2</th>\n        <td>Jacob</td>\n        <td>Thornton</td>\n        <td>@fat</td>\n      </tr>\n      <tr>\n        <th scope=\"row\">3</th>\n        <td>John</td>\n        <td>Doe</td>\n        <td>@social</td>\n      </tr>\n    </tbody>\n  </table>`} />\n\n## Responsive tables\n\nResponsive tables allow tables to be scrolled horizontally with ease. Make any table responsive across all viewports by wrapping a `.table` with `.table-responsive`. Or, pick a maximum breakpoint with which to have a responsive table up to by using `.table-responsive{-sm|-md|-lg|-xl|-xxl}`.\n\n<Callout type=\"warning\">\n##### Vertical clipping/truncation\n\nResponsive tables make use of `overflow-y: hidden`, which clips off any content that goes beyond the bottom or top edges of the table. In particular, this can clip off dropdown menus and other third-party widgets.\n</Callout>\n\n### Always responsive\n\nAcross every breakpoint, use `.table-responsive` for horizontally scrolling tables.\n\n<Example showMarkup={false} code={`\n<div class=\"table-responsive\">\n  <table class=\"table\">\n    <thead>\n      <tr>\n        <th scope=\"col\">#</th>\n        <th scope=\"col\">Heading</th>\n        <th scope=\"col\">Heading</th>\n        <th scope=\"col\">Heading</th>\n        <th scope=\"col\">Heading</th>\n        <th scope=\"col\">Heading</th>\n        <th scope=\"col\">Heading</th>\n        <th scope=\"col\">Heading</th>\n        <th scope=\"col\">Heading</th>\n        <th scope=\"col\">Heading</th>\n      </tr>\n    </thead>\n    <tbody>\n      <tr>\n        <th scope=\"row\">1</th>\n        <td>Cell</td>\n        <td>Cell</td>\n        <td>Cell</td>\n        <td>Cell</td>\n        <td>Cell</td>\n        <td>Cell</td>\n        <td>Cell</td>\n        <td>Cell</td>\n        <td>Cell</td>\n      </tr>\n      <tr>\n        <th scope=\"row\">2</th>\n        <td>Cell</td>\n        <td>Cell</td>\n        <td>Cell</td>\n        <td>Cell</td>\n        <td>Cell</td>\n        <td>Cell</td>\n        <td>Cell</td>\n        <td>Cell</td>\n        <td>Cell</td>\n      </tr>\n      <tr>\n        <th scope=\"row\">3</th>\n        <td>Cell</td>\n        <td>Cell</td>\n        <td>Cell</td>\n        <td>Cell</td>\n        <td>Cell</td>\n        <td>Cell</td>\n        <td>Cell</td>\n        <td>Cell</td>\n        <td>Cell</td>\n      </tr>\n    </tbody>\n  </table>\n</div>\n`} />\n\n```html\n<div class=\"table-responsive\">\n  <table class=\"table\">\n    ...\n  </table>\n</div>\n```\n\n### Breakpoint specific\n\nUse `.table-responsive{-sm|-md|-lg|-xl|-xxl}` as needed to create responsive tables up to a particular breakpoint. From that breakpoint and up, the table will behave normally and not scroll horizontally.\n\n**These tables may appear broken until their responsive styles apply at specific viewport widths.**\n\n{getData('breakpoints').map((breakpoint) => {\n  return (\n    <div class=\"bd-example\">\n      <div class={`table-responsive${breakpoint.abbr}`}>\n        <table class=\"table\">\n          <thead>\n            <tr>\n              <th scope=\"col\">#</th>\n              <th scope=\"col\">Heading</th>\n              <th scope=\"col\">Heading</th>\n              <th scope=\"col\">Heading</th>\n              <th scope=\"col\">Heading</th>\n              <th scope=\"col\">Heading</th>\n              <th scope=\"col\">Heading</th>\n              <th scope=\"col\">Heading</th>\n              <th scope=\"col\">Heading</th>\n            </tr>\n          </thead>\n          <tbody>\n            <tr>\n              <th scope=\"row\">1</th>\n              <td>Cell</td>\n              <td>Cell</td>\n              <td>Cell</td>\n              <td>Cell</td>\n              <td>Cell</td>\n              <td>Cell</td>\n              <td>Cell</td>\n              <td>Cell</td>\n            </tr>\n            <tr>\n              <th scope=\"row\">2</th>\n              <td>Cell</td>\n              <td>Cell</td>\n              <td>Cell</td>\n              <td>Cell</td>\n              <td>Cell</td>\n              <td>Cell</td>\n              <td>Cell</td>\n              <td>Cell</td>\n            </tr>\n            <tr>\n              <th scope=\"row\">3</th>\n              <td>Cell</td>\n              <td>Cell</td>\n              <td>Cell</td>\n              <td>Cell</td>\n              <td>Cell</td>\n              <td>Cell</td>\n              <td>Cell</td>\n              <td>Cell</td>\n            </tr>\n          </tbody>\n        </table>\n      </div>\n    </div>\n  )\n})}\n\n<Code code={getData('breakpoints').map((breakpoint) => `<div class=\"table-responsive${breakpoint.abbr}\">\n    <table class=\"table\">\n      ...\n    </table>\n</div>\n`)} lang=\"html\" />\n\n## CSS\n\n### Sass variables\n\n<ScssDocs name=\"table-variables\" file=\"scss/_variables.scss\" />\n\n### Sass loops\n\n<ScssDocs name=\"table-loop\" file=\"scss/_variables.scss\" />\n\n### Customizing\n\n- The factor variables (`$table-striped-bg-factor`, `$table-active-bg-factor` & `$table-hover-bg-factor`) are used to determine the contrast in table variants.\n- Apart from the light & dark table variants, theme colors are lightened by the `$table-bg-scale` variable.\n"
  },
  {
    "path": "site/src/content/docs/content/typography.mdx",
    "content": "---\ntitle: Typography\ndescription: Documentation and examples for Bootstrap typography, including global settings, headings, body text, lists, and more.\ntoc: true\n---\n\n## Global settings\n\nBootstrap sets basic global display, typography, and link styles. When more control is needed, check out the [textual utility classes]([[docsref:/utilities/text]]).\n\n- Use a [native font stack]([[docsref:/content/reboot#native-font-stack]]) that selects the best `font-family` for each OS and device.\n- For a more inclusive and accessible type scale, we use the browser’s default root `font-size` (typically 16px) so visitors can customize their browser defaults as needed.\n- Use the `$font-family-base`, `$font-size-base`, and `$line-height-base` attributes as our typographic base applied to the `<body>`.\n- Set the global link color via `$link-color`.\n- Use `$body-bg` to set a `background-color` on the `<body>` (`#fff` by default).\n\nThese styles can be found within `_reboot.scss`, and the global variables are defined in `_variables.scss`. Make sure to set `$font-size-base` in `rem`.\n\n## Headings\n\nAll HTML headings, `<h1>` through `<h6>`, are available.\n\n<BsTable>\n| Heading | Example |\n| --- | --- |\n| `<h1></h1>` | <span class=\"h1\">h1. Bootstrap heading</span> |\n| `<h2></h2>` | <span class=\"h2\">h2. Bootstrap heading</span> |\n| `<h3></h3>` | <span class=\"h3\">h3. Bootstrap heading</span> |\n| `<h4></h4>` | <span class=\"h4\">h4. Bootstrap heading</span> |\n| `<h5></h5>` | <span class=\"h5\">h5. Bootstrap heading</span> |\n| `<h6></h6>` | <span class=\"h6\">h6. Bootstrap heading</span> |\n</BsTable>\n\n```html\n<h1>h1. Bootstrap heading</h1>\n<h2>h2. Bootstrap heading</h2>\n<h3>h3. Bootstrap heading</h3>\n<h4>h4. Bootstrap heading</h4>\n<h5>h5. Bootstrap heading</h5>\n<h6>h6. Bootstrap heading</h6>\n```\n\n`.h1` through `.h6` classes are also available, for when you want to match the font styling of a heading but cannot use the associated HTML element.\n\n<Example code={`<p class=\"h1\">h1. Bootstrap heading</p>\n<p class=\"h2\">h2. Bootstrap heading</p>\n<p class=\"h3\">h3. Bootstrap heading</p>\n<p class=\"h4\">h4. Bootstrap heading</p>\n<p class=\"h5\">h5. Bootstrap heading</p>\n<p class=\"h6\">h6. Bootstrap heading</p>`} />\n\n### Customizing headings\n\nUse the included utility classes to recreate the small secondary heading text from Bootstrap 3.\n\n<Example code={`<h3>\n    Fancy display heading\n    <small class=\"text-body-secondary\">With faded secondary text</small>\n  </h3>`} />\n\n## Display headings\n\nTraditional heading elements are designed to work best in the meat of your page content. When you need a heading to stand out, consider using a **display heading**—a larger, slightly more opinionated heading style.\n\n<Example showMarkup={false} code={`\n<div class=\"display-1 pb-3 mb-3 border-bottom\">Display 1</div>\n<div class=\"display-2 pb-3 mb-3 border-bottom\">Display 2</div>\n<div class=\"display-3 pb-3 mb-3 border-bottom\">Display 3</div>\n<div class=\"display-4 pb-3 mb-3 border-bottom\">Display 4</div>\n<div class=\"display-5 pb-3 mb-3 border-bottom\">Display 5</div>\n<div class=\"display-6\">Display 6</div>\n`} />\n\n```html\n<h1 class=\"display-1\">Display 1</h1>\n<h1 class=\"display-2\">Display 2</h1>\n<h1 class=\"display-3\">Display 3</h1>\n<h1 class=\"display-4\">Display 4</h1>\n<h1 class=\"display-5\">Display 5</h1>\n<h1 class=\"display-6\">Display 6</h1>\n```\n\nDisplay headings are configured via the `$display-font-sizes` Sass map and two variables, `$display-font-weight` and `$display-line-height`.\n\nDisplay headings are customizable via two variables, `$display-font-family` and `$display-font-style`.\n\n<ScssDocs name=\"display-headings\" file=\"scss/_variables.scss\" />\n\n## Lead\n\nMake a paragraph stand out by adding `.lead`.\n\n<Example code={`<p class=\"lead\">\n    This is a lead paragraph. It stands out from regular paragraphs.\n  </p>`} />\n\n## Inline text elements\n\nStyling for common inline HTML5 elements.\n\n<Example code={`<p>You can use the mark tag to <mark>highlight</mark> text.</p>\n<p><del>This line of text is meant to be treated as deleted text.</del></p>\n<p><s>This line of text is meant to be treated as no longer accurate.</s></p>\n<p><ins>This line of text is meant to be treated as an addition to the document.</ins></p>\n<p><u>This line of text will render as underlined.</u></p>\n<p><small>This line of text is meant to be treated as fine print.</small></p>\n<p><strong>This line rendered as bold text.</strong></p>\n<p><em>This line rendered as italicized text.</em></p>`} />\n\nBeware that those tags should be used for semantic purpose:\n\n- `<mark>` represents text which is marked or highlighted for reference or notation purposes.\n- `<small>` represents side-comments and small print, like copyright and legal text.\n- `<s>` represents element that are no longer relevant or no longer accurate.\n- `<u>` represents a span of inline text which should be rendered in a way that indicates that it has a non-textual annotation.\n\nIf you want to style your text, you should use the following classes instead:\n\n- `.mark` will apply the same styles as `<mark>`.\n- `.small` will apply the same styles as `<small>`.\n- `.text-decoration-underline` will apply the same styles as `<u>`.\n- `.text-decoration-line-through` will apply the same styles as `<s>`.\n\nWhile not shown above, feel free to use `<b>` and `<i>` in HTML5. `<b>` is meant to highlight words or phrases without conveying additional importance, while `<i>` is mostly for voice, technical terms, etc.\n\n## Text utilities\n\nChange text alignment, transform, style, weight, line-height, decoration and color with our [text utilities]([[docsref:/utilities/text]]) and [color utilities]([[docsref:/utilities/colors]]).\n\n## Abbreviations\n\nStylized implementation of HTML’s `<abbr>` element for abbreviations and acronyms to show the expanded version on hover. Abbreviations have a default underline and gain a help cursor to provide additional context on hover and to users of assistive technologies.\n\nAdd `.initialism` to an abbreviation for a slightly smaller font-size.\n\n<Example code={`<p><abbr title=\"attribute\">attr</abbr></p>\n<p><abbr title=\"HyperText Markup Language\" class=\"initialism\">HTML</abbr></p>`} />\n\n## Blockquotes\n\nFor quoting blocks of content from another source within your document. Wrap `<blockquote class=\"blockquote\">` around any HTML as the quote.\n\n<Example code={`<blockquote class=\"blockquote\">\n    <p>A well-known quote, contained in a blockquote element.</p>\n  </blockquote>`} />\n\n### Naming a source\n\nThe HTML spec requires that blockquote attribution be placed outside the `<blockquote>`. When providing attribution, wrap your `<blockquote>` in a `<figure>` and use a `<figcaption>` or a block level element (e.g., `<p>`) with the `.blockquote-footer` class. Be sure to wrap the name of the source work in `<cite>` as well.\n\n<Example code={`<figure>\n    <blockquote class=\"blockquote\">\n      <p>A well-known quote, contained in a blockquote element.</p>\n    </blockquote>\n    <figcaption class=\"blockquote-footer\">\n      Someone famous in <cite title=\"Source Title\">Source Title</cite>\n    </figcaption>\n  </figure>`} />\n\n### Alignment\n\nUse text utilities as needed to change the alignment of your blockquote.\n\n<Example code={`<figure class=\"text-center\">\n    <blockquote class=\"blockquote\">\n      <p>A well-known quote, contained in a blockquote element.</p>\n    </blockquote>\n    <figcaption class=\"blockquote-footer\">\n      Someone famous in <cite title=\"Source Title\">Source Title</cite>\n    </figcaption>\n  </figure>`} />\n\n<Example code={`<figure class=\"text-end\">\n    <blockquote class=\"blockquote\">\n      <p>A well-known quote, contained in a blockquote element.</p>\n    </blockquote>\n    <figcaption class=\"blockquote-footer\">\n      Someone famous in <cite title=\"Source Title\">Source Title</cite>\n    </figcaption>\n  </figure>`} />\n\n## Lists\n\n### Unstyled\n\nRemove the default `list-style` and left margin on list items (immediate children only). **This only applies to immediate children list items**, meaning you will need to add the class for any nested lists as well.\n\n<Example code={`<ul class=\"list-unstyled\">\n    <li>This is a list.</li>\n    <li>It appears completely unstyled.</li>\n    <li>Structurally, it’s still a list.</li>\n    <li>However, this style only applies to immediate child elements.</li>\n    <li>Nested lists:\n      <ul>\n        <li>are unaffected by this style</li>\n        <li>will still show a bullet</li>\n        <li>and have appropriate left margin</li>\n      </ul>\n    </li>\n    <li>This may still come in handy in some situations.</li>\n  </ul>`} />\n\n### Inline\n\nRemove a list’s bullets and apply some light `margin` with a combination of two classes, `.list-inline` and `.list-inline-item`.\n\n<Example code={`<ul class=\"list-inline\">\n    <li class=\"list-inline-item\">This is a list item.</li>\n    <li class=\"list-inline-item\">And another one.</li>\n    <li class=\"list-inline-item\">But they’re displayed inline.</li>\n  </ul>`} />\n\n### Description list alignment\n\nAlign terms and descriptions horizontally by using our grid system’s predefined classes (or semantic mixins). For longer terms, you can optionally add a `.text-truncate` class to truncate the text with an ellipsis.\n\n<Example code={`<dl class=\"row\">\n    <dt class=\"col-sm-3\">Description lists</dt>\n    <dd class=\"col-sm-9\">A description list is perfect for defining terms.</dd>\n\n    <dt class=\"col-sm-3\">Term</dt>\n    <dd class=\"col-sm-9\">\n      <p>Definition for the term.</p>\n      <p>And some more placeholder definition text.</p>\n    </dd>\n\n    <dt class=\"col-sm-3\">Another term</dt>\n    <dd class=\"col-sm-9\">This definition is short, so no extra paragraphs or anything.</dd>\n\n    <dt class=\"col-sm-3 text-truncate\">Truncated term is truncated</dt>\n    <dd class=\"col-sm-9\">This can be useful when space is tight. Adds an ellipsis at the end.</dd>\n\n    <dt class=\"col-sm-3\">Nesting</dt>\n    <dd class=\"col-sm-9\">\n      <dl class=\"row\">\n        <dt class=\"col-sm-4\">Nested definition list</dt>\n        <dd class=\"col-sm-8\">I heard you like definition lists. Let me put a definition list inside your definition list.</dd>\n      </dl>\n    </dd>\n  </dl>`} />\n\n## Responsive font sizes\n\nIn Bootstrap 5, we’ve enabled responsive font sizes by default, allowing text to scale more naturally across device and viewport sizes. Have a look at the [RFS page]([[docsref:/getting-started/rfs]]) to find out how this works.\n\n## CSS\n\n### Sass variables\n\nHeadings have some dedicated variables for sizing and spacing.\n\n<ScssDocs name=\"headings-variables\" file=\"scss/_variables.scss\" />\n\nMiscellaneous typography elements covered here and in [Reboot]([[docsref:/content/reboot]]) also have dedicated variables.\n\n<ScssDocs name=\"type-variables\" file=\"scss/_variables.scss\" />\n\n### Sass mixins\n\nThere are no dedicated mixins for typography, but Bootstrap does use [Responsive Font Sizing (RFS)]([[docsref:/getting-started/rfs]]).\n"
  },
  {
    "path": "site/src/content/docs/customize/color-modes.mdx",
    "content": "---\ntitle: Color modes\ndescription: Bootstrap now supports color modes, or themes, as of v5.3.0. Explore our default light color mode and the new dark mode, or create your own using our styles as your template.\ntoc: true\nadded:\n  version: \"5.3\"\n---\n\nimport { getDocsRelativePath } from '@libs/path'\n\n<Callout>\n**Try it yourself!** Download the source code and working demo for using Bootstrap with Stylelint, and the color modes from the [twbs/examples repository](https://github.com/twbs/examples/tree/main/color-modes). You can also [open the example in StackBlitz](https://stackblitz.com/github/twbs/examples/tree/main/color-modes?file=index.html).\n</Callout>\n\n## Dark mode\n\n**Bootstrap now supports color modes, starting with dark mode!** With v5.3.0 you can implement your own color mode toggler (see below for an example from Bootstrap’s docs) and apply the different color modes as you see fit. We support a light mode (default) and now dark mode. Color modes can be toggled globally on the `<html>` element, or on specific components and elements, thanks to the `data-bs-theme` attribute.\n\nAlternatively, you can also switch to a media query implementation thanks to our color mode mixin—see [the usage section for details](#building-with-sass). Heads up though—this eliminates your ability to change themes on a per-component basis as shown below.\n\n## Example\n\nFor example, to change the color mode of a dropdown menu, add `data-bs-theme=\"light\"` or `data-bs-theme=\"dark\"` to the parent `.dropdown`. Now, no matter the global color mode, these dropdowns will display with the specified theme value.\n\n<Example class=\"d-flex justify-content-between\" code={`<div class=\"dropdown\" data-bs-theme=\"light\">\n    <button class=\"btn btn-secondary dropdown-toggle\" type=\"button\" id=\"dropdownMenuButtonLight\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n      Default dropdown\n    </button>\n    <ul class=\"dropdown-menu\" aria-labelledby=\"dropdownMenuButtonLight\">\n      <li><a class=\"dropdown-item active\" href=\"#\">Action</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n      <li><hr class=\"dropdown-divider\"></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Separated link</a></li>\n    </ul>\n  </div>\n\n  <div class=\"dropdown\" data-bs-theme=\"dark\">\n    <button class=\"btn btn-secondary dropdown-toggle\" type=\"button\" id=\"dropdownMenuButtonDark\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n      Dark dropdown\n    </button>\n    <ul class=\"dropdown-menu\" aria-labelledby=\"dropdownMenuButtonDark\">\n      <li><a class=\"dropdown-item active\" href=\"#\">Action</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n      <li><hr class=\"dropdown-divider\"></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Separated link</a></li>\n    </ul>\n  </div>`} />\n\n## How it works\n\n- As shown above, color mode styles are controlled by the `data-bs-theme` attribute. This attribute can be applied to the `<html>` element, or to any other element or Bootstrap component. If applied to the `<html>` element, it will apply to everything. If applied to a component or element, it will be scoped to that specific component or element.\n\n- For each color mode you wish to support, you’ll need to add new overrides for the shared global CSS variables. We do this already in our `_root.scss` stylesheet for dark mode, with light mode being the default values. In writing color mode specific styles, use the mixin:\n\n  ```scss\n  // Color mode variables in _root.scss\n  @include color-mode(dark) {\n    // CSS variable overrides here...\n  }\n  ```\n\n- We use a custom `_variables-dark.scss` to power those shared global CSS variable overrides for dark mode. This file isn’t required for your own custom color modes, but it’s required for our dark mode for two reasons. First, it’s better to have a single place to reset global colors. Second, some Sass variables had to be overridden for background images embedded in our CSS for accordions, form components, and more.\n\n## Usage\n\n### Enable dark mode\n\nEnable the built in dark color mode across your entire project by adding the `data-bs-theme=\"dark\"` attribute to the `<html>` element. This will apply the dark color mode to all components and elements, other than those with a specific `data-bs-theme` attribute applied. Building on the [quick start template]([[docsref:/getting-started/introduction#quick-start]]):\n\n```html\n<!doctype html>\n<html lang=\"en\" data-bs-theme=\"dark\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <title>Bootstrap demo</title>\n    <link href=\"[[config:cdn.css]]\" rel=\"stylesheet\" integrity=\"[[config:cdn.css_hash]]\" crossorigin=\"anonymous\">\n  </head>\n  <body>\n    <h1>Hello, world!</h1>\n    <script src=\"[[config:cdn.js_bundle]]\" integrity=\"[[config:cdn.js_bundle_hash]]\" crossorigin=\"anonymous\"></script>\n  </body>\n</html>\n```\n\nBootstrap does not yet ship with a built-in color mode picker, but you can use the one from our own documentation if you like. [Learn more in the JavaScript section.](#javascript)\n\n### Building with Sass\n\nOur new dark mode option is available to use for all users of Bootstrap, but it’s controlled via data attributes instead of media queries and does not automatically toggle your project’s color mode. You can disable our dark mode entirely via Sass by changing `$enable-dark-mode` to `false`.\n\nWe use a custom Sass mixin, `color-mode()`, to help you control _how_ color modes are applied. By default, we use a `data` attribute approach, allowing you to create more user-friendly experiences where your visitors can choose to have an automatic dark mode or control their preference (like in our own docs here). This is also an easy and scalable way to add different themes and more custom color modes beyond light and dark.\n\nIn case you want to use media queries and only make color modes automatic, you can change the mixin’s default type via Sass variable. Consider the following snippet and its compiled CSS output.\n\n```scss\n$color-mode-type: data;\n\n@include color-mode(dark) {\n  .element {\n    color: var(--bs-primary-text-emphasis);\n    background-color: var(--bs-primary-bg-subtle);\n  }\n}\n```\n\nOutputs to:\n\n```css\n[data-bs-theme=dark] .element {\n  color: var(--bs-primary-text-emphasis);\n  background-color: var(--bs-primary-bg-subtle);\n}\n```\n\nAnd when setting to `media-query`:\n\n```scss\n$color-mode-type: media-query;\n\n@include color-mode(dark) {\n  .element {\n    color: var(--bs-primary-text-emphasis);\n    background-color: var(--bs-primary-bg-subtle);\n  }\n}\n```\n\nOutputs to:\n\n```css\n@media (prefers-color-scheme: dark) {\n  .element {\n    color: var(--bs-primary-text-emphasis);\n    background-color: var(--bs-primary-bg-subtle);\n  }\n}\n```\n\n## Custom color modes\n\nWhile the primary use case for color modes is light and dark mode, custom color modes are also possible. Create your own `data-bs-theme` selector with a custom value as the name of your color mode, then modify our Sass and CSS variables as needed. We opted to create a separate `_variables-dark.scss` stylesheet to house Bootstrap’s dark mode specific Sass variables, but that’s not required for you.\n\nFor example, you can create a “blue theme” with the selector `data-bs-theme=\"blue\"`. In your custom Sass or CSS file, add the new selector and override any global or component CSS variables as needed. If you’re using Sass, you can also use Sass’s functions within your CSS variable overrides.\n\n<ScssDocs name=\"custom-color-mode\" file=\"site/src/scss/_content.scss\" />\n\n<Example showMarkup={false} code={`<div class=\"bd-example text-body bg-body\" data-bs-theme=\"blue\">\n  <div class=\"h4\">Example blue theme</div>\n  <p>Some paragraph text to show how the blue theme might look with written copy.</p>\n\n  <hr class=\"my-4\"/>\n\n  <div class=\"dropdown\">\n    <button class=\"btn btn-secondary dropdown-toggle\" type=\"button\" id=\"dropdownMenuButtonCustom\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n      Dropdown button\n    </button>\n    <ul class=\"dropdown-menu\" aria-labelledby=\"dropdownMenuButtonCustom\">\n      <li><a class=\"dropdown-item active\" href=\"#\">Action</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n      <li><hr class=\"dropdown-divider\"></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Separated link</a></li>\n    </ul>\n  </div>\n</div>`} />\n\n```html\n<div data-bs-theme=\"blue\">\n  ...\n</div>\n```\n\n## JavaScript\n\nTo allow visitors or users to toggle color modes, you’ll need to create a toggle element to control the `data-bs-theme` attribute on the root element, `<html>`. We’ve built a toggler in our documentation that initially defers to a user’s current system color mode, but provides an option to override that and pick a specific color mode.\n\nHere’s a look at the JavaScript that powers it. Feel free to inspect our own documentation navbar to see how it’s implemented using HTML and CSS from our own components. It is suggested to include the JavaScript at the top of your page to reduce potential screen flickering during reloading of your site. Note that if you decide to use media queries for your color modes, your JavaScript may need to be modified or removed if you prefer an implicit control.\n\n<Code containerClass=\"bd-example-snippet\" lang=\"js\" filePath={getDocsRelativePath('/static/docs/[version]/assets/js/color-modes.js')} />\n\n## Adding theme colors\n\nAdding a new color in `$theme-colors` is not enough for some of our components like [alerts]([[docsref:/components/alerts]]) and [list groups]([[docsref:/components/list-group]]). New colors must also be defined in `$theme-colors-text`, `$theme-colors-bg-subtle`, and `$theme-colors-border-subtle` for light theme; but also in `$theme-colors-text-dark`, `$theme-colors-bg-subtle-dark`, and `$theme-colors-border-subtle-dark` for dark theme.\n\nThis is a manual process because Sass cannot generate its own Sass variables from an existing variable or map. In future versions of Bootstrap, we'll revisit this setup to reduce the duplication.\n\n```scss\n// Required\n@import \"functions\";\n@import \"variables\";\n@import \"variables-dark\";\n\n// Add a custom color to $theme-colors\n$custom-colors: (\n  \"custom-color\": #712cf9\n);\n$theme-colors: map-merge($theme-colors, $custom-colors);\n\n@import \"maps\";\n@import \"mixins\";\n@import \"utilities\";\n\n// Add a custom color to new theme maps\n\n// Light mode\n$custom-colors-text: (\"custom-color\": #712cf9);\n$custom-colors-bg-subtle: (\"custom-color\": #e1d2fe);\n$custom-colors-border-subtle: (\"custom-color\": #bfa1fc);\n\n$theme-colors-text: map-merge($theme-colors-text, $custom-colors-text);\n$theme-colors-bg-subtle: map-merge($theme-colors-bg-subtle, $custom-colors-bg-subtle);\n$theme-colors-border-subtle: map-merge($theme-colors-border-subtle, $custom-colors-border-subtle);\n\n// Dark mode\n$custom-colors-text-dark: (\"custom-color\": #e1d2f2);\n$custom-colors-bg-subtle-dark: (\"custom-color\": #8951fa);\n$custom-colors-border-subtle-dark: (\"custom-color\": #e1d2f2);\n\n$theme-colors-text-dark: map-merge($theme-colors-text-dark, $custom-colors-text-dark);\n$theme-colors-bg-subtle-dark: map-merge($theme-colors-bg-subtle-dark, $custom-colors-bg-subtle-dark);\n$theme-colors-border-subtle-dark: map-merge($theme-colors-border-subtle-dark, $custom-colors-border-subtle-dark);\n\n// Remainder of Bootstrap imports\n@import \"root\";\n@import \"reboot\";\n// etc\n```\n\n## CSS\n\n### Variables\n\nDozens of root level CSS variables are repeated as overrides for dark mode. These are scoped to the color mode selector, which defaults to `data-bs-theme` but [can be configured](#building-with-sass) to use a `prefers-color-scheme` media query. Use these variables as a guideline for generating your own new color modes.\n\n<ScssDocs name=\"root-dark-mode-vars\" file=\"scss/_root.scss\" />\n\n### Sass variables\n\nCSS variables for our dark color mode are partially generated from dark mode specific Sass variables in `_variables-dark.scss`. This also includes some custom overrides for changing the colors of embedded SVGs used throughout our components.\n\n<ScssDocs name=\"sass-dark-mode-vars\" file=\"scss/_variables-dark.scss\" />\n\n### Sass mixins\n\nStyles for dark mode, and any custom color modes you create, can be scoped appropriately to the `data-bs-theme` attribute selector or media query with the customizable `color-mode()` mixin. See the [Sass usage section](#building-with-sass) for more details.\n\n<ScssDocs name=\"color-mode-mixin\" file=\"scss/mixins/_color-mode.scss\" />\n"
  },
  {
    "path": "site/src/content/docs/customize/color.mdx",
    "content": "---\ntitle: Color\ndescription: Bootstrap is supported by an extensive color system that themes our styles and components. This enables more comprehensive customization and extension for any project.\ntoc: true\n---\n\nimport { getData } from '@libs/data'\nimport { getSequence } from '@libs/utils'\n\n## Colors\n\n<AddedIn version=\"5.3.0\" />\n\nBootstrap’s color palette has continued to expand and become more nuanced in v5.3.0. We’ve added new variables for `secondary` and `tertiary` text and background colors, plus `{color}-bg-subtle`, `{color}-border-subtle`, and `{color}-text-emphasis` for our theme colors. These new colors are available through Sass and CSS variables (but not our color maps or utility classes) with the express goal of making it easier to customize across multiple colors modes like light and dark. These new variables are globally set on `:root` and are adapted for our new dark color mode while our original theme colors remain unchanged.\n\nColors ending in `-rgb` provide the `red, green, blue` values for use in `rgb()` and `rgba()` color modes. For example, `rgba(var(--bs-secondary-bg-rgb), .5)`.\n\n<Callout type=\"warning\">\n**Heads up!** There’s some potential confusion with our new secondary and tertiary colors, and our existing secondary theme color, as well as our light and dark theme colors. Expect this to be ironed out in v6.\n</Callout>\n\n<div class=\"table-responsive\">\n  <table class=\"table table-swatches\">\n    <thead>\n      <tr>\n        <th style=\"width: 340px;\">Description</th>\n        <th style=\"width: 200px;\" class=\"ps-0\">Swatch</th>\n        <th>Variables</th>\n      </tr>\n    </thead>\n    <tbody>\n      <tr>\n        <td rowspan=\"2\">\n          **Body —** Default foreground (color) and background, including components.\n        </td>\n        <td class=\"ps-0\">\n          <div class=\"p-3 rounded-2\" style=\"background-color: var(--bs-body-color);\">&nbsp;</div>\n        </td>\n        <td>\n          `--bs-body-color`<br/>`--bs-body-color-rgb`\n        </td>\n      </tr>\n      <tr>\n        <td>\n          <div class=\"p-3 rounded-2 border\" style=\"background-color: var(--bs-body-bg);\">&nbsp;</div>\n        </td>\n        <td>\n          `--bs-body-bg`<br/>`--bs-body-bg-rgb`\n        </td>\n      </tr>\n      <tr>\n        <td rowspan=\"2\">\n          **Secondary —** Use the `color` option for lighter text. Use the `bg` option for dividers and to indicate disabled component states.\n        </td>\n        <td class=\"ps-0\">\n          <div class=\"p-3 rounded-2\" style=\"background-color: var(--bs-secondary-color);\">&nbsp;</div>\n        </td>\n        <td>\n          `--bs-secondary-color`<br/>`--bs-secondary-color-rgb`\n        </td>\n      </tr>\n      <tr>\n        <td>\n          <div class=\"p-3 rounded-2 border\" style=\"background-color: var(--bs-secondary-bg);\">&nbsp;</div>\n        </td>\n        <td>\n          `--bs-secondary-bg`<br/>`--bs-secondary-bg-rgb`\n        </td>\n      </tr>\n      <tr>\n        <td rowspan=\"2\">\n          **Tertiary —** Use the `color` option for even lighter text. Use the `bg` option to style backgrounds for hover states, accents, and wells.\n        </td>\n        <td class=\"ps-0\">\n          <div class=\"p-3 rounded-2\" style=\"background-color: var(--bs-tertiary-color);\">&nbsp;</div>\n        </td>\n        <td>\n          `--bs-tertiary-color`<br/>`--bs-tertiary-color-rgb`\n        </td>\n      </tr>\n      <tr>\n        <td>\n          <div class=\"p-3 rounded-2 border\" style=\"background-color: var(--bs-tertiary-bg);\">&nbsp;</div>\n        </td>\n        <td>\n          `--bs-tertiary-bg`<br/>`--bs-tertiary-bg-rgb`\n        </td>\n      </tr>\n      <tr>\n        <td>\n          **Emphasis —** For higher contrast text. Not applicable for backgrounds.\n        </td>\n        <td class=\"ps-0\">\n          <div class=\"p-3 rounded-2\" style=\"background-color: var(--bs-emphasis-color);\">&nbsp;</div>\n        </td>\n        <td>\n          `--bs-emphasis-color`<br/>`--bs-emphasis-color-rgb`\n        </td>\n      </tr>\n      <tr>\n        <td>\n          **Border —** For component borders, dividers, and rules. Use `--bs-border-color-translucent` to blend with backgrounds with an `rgba()` value.\n        </td>\n        <td class=\"ps-0\">\n          <div class=\"p-3 rounded-2\" style=\"background-color: var(--bs-border-color);\">&nbsp;</div>\n        </td>\n        <td>\n          `--bs-border-color`<br/>`--bs-border-color-rgb`\n        </td>\n      </tr>\n      <tr>\n        <td rowspan=\"4\">\n          **Primary —** Main theme color, used for hyperlinks, focus styles, and component and form active states.\n        </td>\n        <td class=\"ps-0\">\n          <div class=\"p-3 rounded-2 bg-primary\">&nbsp;</div>\n        </td>\n        <td>\n          `--bs-primary`<br/>`--bs-primary-rgb`\n        </td>\n      </tr>\n      <tr>\n        <td>\n          <div class=\"p-3 rounded-2\" style=\"background-color: var(--bs-primary-bg-subtle)\">&nbsp;</div>\n        </td>\n        <td>\n          `--bs-primary-bg-subtle`\n        </td>\n      </tr>\n      <tr>\n        <td>\n          <div class=\"p-3 rounded-2\" style=\"border: 5px var(--bs-primary-border-subtle) solid\">&nbsp;</div>\n        </td>\n        <td>\n          `--bs-primary-border-subtle`\n        </td>\n      </tr>\n      <tr>\n        <td>\n          <div class=\"py-3 fw-bold h5\" style=\"color: var(--bs-primary-text-emphasis)\">Text</div>\n        </td>\n        <td>\n          `--bs-primary-text-emphasis`\n        </td>\n      </tr>\n      <tr>\n        <td rowspan=\"4\">\n          **Success —** Theme color used for positive or successful actions and information.\n        </td>\n        <td class=\"ps-0\">\n          <div class=\"p-3 rounded-2 bg-success\">&nbsp;</div>\n        </td>\n        <td>\n          `--bs-success`<br/>`--bs-success-rgb`\n        </td>\n      </tr>\n      <tr>\n        <td>\n          <div class=\"p-3 rounded-2\" style=\"background-color: var(--bs-success-bg-subtle)\">&nbsp;</div>\n        </td>\n        <td>\n          `--bs-success-bg-subtle`\n        </td>\n      </tr>\n      <tr>\n        <td>\n          <div class=\"p-3 rounded-2\" style=\"border: 5px var(--bs-success-border-subtle) solid\">&nbsp;</div>\n        </td>\n        <td>\n          `--bs-success-border-subtle`\n        </td>\n      </tr>\n      <tr>\n        <td>\n          <div class=\"py-3 fw-bold h5\" style=\"color: var(--bs-success-text-emphasis)\">Text</div>\n        </td>\n        <td>\n          `--bs-success-text-emphasis`\n        </td>\n      </tr>\n      <tr>\n        <td rowspan=\"4\">\n          **Danger —** Theme color used for errors and dangerous actions.\n        </td>\n        <td class=\"ps-0\">\n          <div class=\"p-3 rounded-2 bg-danger\">&nbsp;</div>\n        </td>\n        <td>\n          `--bs-danger`<br/>`--bs-danger-rgb`\n        </td>\n      </tr>\n      <tr>\n        <td>\n          <div class=\"p-3 rounded-2\" style=\"background-color: var(--bs-danger-bg-subtle)\">&nbsp;</div>\n        </td>\n        <td>\n          `--bs-danger-bg-subtle`\n        </td>\n      </tr>\n      <tr>\n        <td>\n          <div class=\"p-3 rounded-2\" style=\"border: 5px var(--bs-danger-border-subtle) solid\">&nbsp;</div>\n        </td>\n        <td>\n          `--bs-danger-border-subtle`\n        </td>\n      </tr>\n      <tr>\n        <td>\n          <div class=\"py-3 fw-bold h5\" style=\"color: var(--bs-danger-text-emphasis)\">Text</div>\n        </td>\n        <td>\n          `--bs-danger-text-emphasis`\n        </td>\n      </tr>\n      <tr>\n        <td rowspan=\"4\">\n          **Warning —** Theme color used for non-destructive warning messages.\n        </td>\n        <td class=\"ps-0\">\n          <div class=\"p-3 rounded-2 bg-warning\">&nbsp;</div>\n        </td>\n        <td>\n          `--bs-warning`<br/>`--bs-warning-rgb`\n        </td>\n      </tr>\n      <tr>\n        <td>\n          <div class=\"p-3 rounded-2\" style=\"background-color: var(--bs-warning-bg-subtle)\">&nbsp;</div>\n        </td>\n        <td>\n          `--bs-warning-bg-subtle`\n        </td>\n      </tr>\n      <tr>\n        <td>\n          <div class=\"p-3 rounded-2\" style=\"border: 5px var(--bs-warning-border-subtle) solid\">&nbsp;</div>\n        </td>\n        <td>\n          `--bs-warning-border-subtle`\n        </td>\n      </tr>\n      <tr>\n        <td>\n          <div class=\"py-3 fw-bold h5\" style=\"color: var(--bs-warning-text-emphasis)\">Text</div>\n        </td>\n        <td>\n          `--bs-warning-text-emphasis`\n        </td>\n      </tr>\n      <tr>\n        <td rowspan=\"4\">\n          **Info —** Theme color used for neutral and informative content.\n        </td>\n        <td class=\"ps-0\">\n          <div class=\"p-3 rounded-2 bg-info\">&nbsp;</div>\n        </td>\n        <td>\n          `--bs-info`<br/>`--bs-info-rgb`\n        </td>\n      </tr>\n      <tr>\n        <td>\n          <div class=\"p-3 rounded-2\" style=\"background-color: var(--bs-info-bg-subtle)\">&nbsp;</div>\n        </td>\n        <td>\n          `--bs-info-bg-subtle`\n        </td>\n      </tr>\n      <tr>\n        <td>\n          <div class=\"p-3 rounded-2\" style=\"border: 5px var(--bs-info-border-subtle) solid\">&nbsp;</div>\n        </td>\n        <td>\n          `--bs-info-border-subtle`\n        </td>\n      </tr>\n      <tr>\n        <td>\n          <div class=\"py-3 fw-bold h5\" style=\"color: var(--bs-info-text-emphasis)\">Text</div>\n        </td>\n        <td>\n          `--bs-info-text-emphasis`\n        </td>\n      </tr>\n      <tr>\n        <td rowspan=\"4\">\n          **Light —** Additional theme option for less contrasting colors.\n        </td>\n        <td class=\"ps-0\">\n          <div class=\"p-3 rounded-2 bg-light\">&nbsp;</div>\n        </td>\n        <td>\n          `--bs-light`<br/>`--bs-light-rgb`\n        </td>\n      </tr>\n      <tr>\n        <td>\n          <div class=\"p-3 rounded-2\" style=\"background-color: var(--bs-light-bg-subtle)\">&nbsp;</div>\n        </td>\n        <td>\n          `--bs-light-bg-subtle`\n        </td>\n      </tr>\n      <tr>\n        <td>\n          <div class=\"p-3 rounded-2\" style=\"border: 5px var(--bs-light-border-subtle) solid\">&nbsp;</div>\n        </td>\n        <td>\n          `--bs-light-border-subtle`\n        </td>\n      </tr>\n      <tr>\n        <td>\n          <div class=\"py-3 fw-bold h5\" style=\"color: var(--bs-light-text-emphasis)\">Text</div>\n        </td>\n        <td>\n          `--bs-light-text-emphasis`\n        </td>\n      </tr>\n      <tr>\n        <td rowspan=\"4\">\n          **Dark —** Additional theme option for higher contrasting colors.\n        </td>\n        <td class=\"ps-0\">\n          <div class=\"p-3 rounded-2 bg-dark\">&nbsp;</div>\n        </td>\n        <td>\n          `--bs-dark`<br/>`--bs-dark-rgb`\n        </td>\n      </tr>\n      <tr>\n        <td>\n          <div class=\"p-3 rounded-2\" style=\"background-color: var(--bs-dark-bg-subtle)\">&nbsp;</div>\n        </td>\n        <td>\n          `--bs-dark-bg-subtle`\n        </td>\n      </tr>\n      <tr>\n        <td>\n          <div class=\"p-3 rounded-2\" style=\"border: 5px var(--bs-dark-border-subtle) solid\">&nbsp;</div>\n        </td>\n        <td>\n          `--bs-dark-border-subtle`\n        </td>\n      </tr>\n      <tr>\n        <td>\n          <div class=\"py-3 fw-bold h5\" style=\"color: var(--bs-dark-text-emphasis)\">Text</div>\n        </td>\n        <td>\n          `--bs-dark-text-emphasis`\n        </td>\n      </tr>\n    </tbody>\n  </table>\n</div>\n\n### Using the new colors\n\nThese new colors are accessible via CSS variables and utility classes—like `--bs-primary-bg-subtle` and `.bg-primary-subtle`—allowing you to compose your own CSS rules with the variables, or to quickly apply styles via classes. The utilities are built with the color’s associated CSS variables, and since we customize those CSS variables for dark mode, they are also adaptive to color mode by default.\n\n<Example code={`<div class=\"p-3 text-primary-emphasis bg-primary-subtle border border-primary-subtle rounded-3\">\n    Example element with utilities\n  </div>`} />\n\n### Theme colors\n\nWe use a subset of all colors to create a smaller color palette for generating color schemes, also available as Sass variables and a Sass map in Bootstrap’s `scss/_variables.scss` file.\n\n<div class=\"row\">\n  {getData('theme-colors').map((themeColor) => {\n    return (\n      <div class=\"col-md-4\">\n        <div class={`p-3 mb-3 text-bg-${themeColor.name} rounded-3`}>{themeColor.title}</div>\n      </div>\n    )\n  })}\n</div>\n\nAll these colors are available as a Sass map, `$theme-colors`.\n\n<ScssDocs name=\"theme-colors-map\" file=\"scss/_variables.scss\" />\n\nCheck out [our Sass maps and loops docs]([[docsref:/customize/sass#maps-and-loops]]) for how to modify these colors.\n\n### All colors\n\nAll Bootstrap colors are available as Sass variables and a Sass map in `scss/_variables.scss` file. To avoid increased file sizes, we don’t create text or background color classes for each of these variables. Instead, we choose a subset of these colors for a [theme palette](#theme-colors).\n\nBe sure to monitor contrast ratios as you customize colors. As shown below, we’ve added three contrast ratios to each of the main colors—one for the swatch’s current colors, one for against white, and one for against black.\n\n<div class=\"row font-monospace\">\n  {getData('colors').map((color) => {\n    if ((color.name !== \"white\") && (color.name !== \"gray\") && (color.name !== \"gray-dark\")) {\n      return (\n        <div class=\"col-md-4 mb-3\">\n          <div class={`p-3 mb-2 position-relative swatch-${color.name}`}>\n            <strong class=\"d-block\">${color.name}</strong>\n            {color.hex}\n          </div>\n\n          {getSequence(100, 900, 100).map((value) => {\n            return (\n              <div class={`p-3 bd-${color.name}-${value}`}>${color.name}-{value}</div>\n            )\n          })}\n        </div>\n      )\n    }\n  })}\n\n  <div class=\"col-md-4 mb-3\">\n    <div class=\"p-3 mb-2 position-relative swatch-gray-500\"><strong class=\"d-block\">$gray-500</strong>#adb5bd</div>\n    {getData('grays').map((gray) => {\n      return (\n        <div class={`p-3 bd-gray-${gray.name}`}>$gray-{gray.name}</div>\n      )\n    })}\n  </div>\n\n  <div class=\"col-md-4 mb-3\">\n    <div class=\"p-3 mb-2 bd-black text-white\">\n      <strong class=\"d-block\">$black</strong>\n      #000\n    </div>\n    <div class=\"p-3 mb-2 bd-white border\">\n      <strong class=\"d-block\">$white</strong>\n      #fff\n    </div>\n  </div>\n</div>\n\n### Notes on Sass\n\nSass cannot programmatically generate variables, so we manually created variables for every tint and shade ourselves. We specify the midpoint value (e.g., `$blue-500`) and use custom color functions to tint (lighten) or shade (darken) our colors via Sass’s `mix()` color function.\n\nUsing `mix()` is not the same as `lighten()` and `darken()`—the former blends the specified color with white or black, while the latter only adjusts the lightness value of each color. The result is a much more complete suite of colors, as [shown in this CodePen demo](https://codepen.io/emdeoh/pen/zYOQOPB).\n\nOur `tint-color()` and `shade-color()` functions use `mix()` alongside our `$theme-color-interval` variable, which specifies a stepped percentage value for each mixed color we produce. See the `scss/_functions.scss` and `scss/_variables.scss` files for the full source code.\n\n## Color Sass maps\n\nBootstrap’s source Sass files include three maps to help you quickly and easily loop over a list of colors and their hex values.\n\n- `$colors` lists all our available base (`500`) colors\n- `$theme-colors` lists all semantically named theme colors (shown below)\n- `$grays` lists all tints and shades of gray\n\nWithin `scss/_variables.scss`, you’ll find Bootstrap’s color variables and Sass map. Here’s an example of the `$colors` Sass map:\n\n<ScssDocs name=\"colors-map\" file=\"scss/_variables.scss\" />\n\nAdd, remove, or modify values within the map to update how they’re used in many other components. Unfortunately at this time, not _every_ component utilizes this Sass map. Future updates will strive to improve upon this. Until then, plan on making use of the `${color}` variables and this Sass map.\n\n### Example\n\nHere’s how you can use these in your Sass:\n\n```scss\n.alpha { color: $purple; }\n.beta {\n  color: $yellow-300;\n  background-color: $indigo-900;\n}\n```\n\n[Color]([[docsref:/utilities/colors]]) and [background]([[docsref:/utilities/background]]) utility classes are also available for setting `color` and `background-color` using the `500` color values.\n\n## Generating utilities\n\n<AddedIn version=\"5.1.0\"/>\n\nBootstrap doesn’t include `color` and `background-color` utilities for every color variable, but you can generate these yourself with our [utility API]([[docsref:/utilities/api]]) and our extended Sass maps added in v5.1.0.\n\n1. To start, make sure you’ve imported our functions, variables, mixins, and utilities.\n2. Use our `map-merge-multiple()` function to quickly merge multiple Sass maps together in a new map.\n3. Merge this new combined map to extend any utility with a `{color}-{level}` class name.\n\nHere’s an example that generates text color utilities (e.g., `.text-purple-500`) using the above steps.\n\n```scss\n@import \"bootstrap/scss/functions\";\n@import \"bootstrap/scss/variables\";\n@import \"bootstrap/scss/variables-dark\";\n@import \"bootstrap/scss/maps\";\n@import \"bootstrap/scss/mixins\";\n@import \"bootstrap/scss/utilities\";\n\n$all-colors: map-merge-multiple($blues, $indigos, $purples, $pinks, $reds, $oranges, $yellows, $greens, $teals, $cyans);\n\n$utilities: map-merge(\n  $utilities,\n  (\n    \"color\": map-merge(\n      map-get($utilities, \"color\"),\n      (\n        values: map-merge(\n          map-get(map-get($utilities, \"color\"), \"values\"),\n          (\n            $all-colors\n          ),\n        ),\n      ),\n    ),\n  )\n);\n\n@import \"bootstrap/scss/utilities/api\";\n```\n\nThis will generate new `.text-{color}-{level}` utilities for every color and level. You can do the same for any other utility and property as well.\n"
  },
  {
    "path": "site/src/content/docs/customize/components.mdx",
    "content": "---\ntitle: Components\ndescription: Learn how and why we build nearly all our components responsively and with base and modifier classes.\ntoc: true\n---\n\n## Base classes\n\nBootstrap’s components are largely built with a base-modifier nomenclature. We group as many shared properties as possible into a base class, like `.btn`, and then group individual styles for each variant into modifier classes, like `.btn-primary` or `.btn-success`.\n\nTo build our modifier classes, we use Sass’s `@each` loops to iterate over a Sass map. This is especially helpful for generating variants of a component by our `$theme-colors` and creating responsive variants for each breakpoint. As you customize these Sass maps and recompile, you’ll automatically see your changes reflected in these loops.\n\nCheck out [our Sass maps and loops docs]([[docsref:/customize/sass#maps-and-loops]]) for how to customize these loops and extend Bootstrap’s base-modifier approach to your own code.\n\n## Modifiers\n\nMany of Bootstrap’s components are built with a base-modifier class approach. This means the bulk of the styling is contained to a base class (e.g., `.btn`) while style variations are confined to modifier classes (e.g., `.btn-danger`). These modifier classes are built from the `$theme-colors` map to make customizing the number and name of our modifier classes.\n\nHere are two examples of how we loop over the `$theme-colors` map to generate modifiers to the `.alert` and `.list-group` components.\n\n<ScssDocs name=\"alert-modifiers\" file=\"scss/_alert.scss\" />\n\n<ScssDocs name=\"list-group-modifiers\" file=\"scss/_list-group.scss\" />\n\n## Responsive\n\nThese Sass loops aren’t limited to color maps, either. You can also generate responsive variations of your components. Take for example our responsive alignment of the dropdowns where we mix an `@each` loop for the `$grid-breakpoints` Sass map with a media query include.\n\n<ScssDocs name=\"responsive-breakpoints\" file=\"scss/_dropdown.scss\" />\n\nShould you modify your `$grid-breakpoints`, your changes will apply to all the loops iterating over that map.\n\n<ScssDocs name=\"grid-breakpoints\" file=\"scss/_variables.scss\" />\n\nFor more information and examples on how to modify our Sass maps and variables, please refer to [the CSS section of the Grid documentation]([[docsref:/layout/grid#css]]).\n\n## Creating your own\n\nWe encourage you to adopt these guidelines when building with Bootstrap to create your own components. We’ve extended this approach ourselves to the custom components in our documentation and examples. Components like our callouts are built just like our provided components with base and modifier classes.\n\n<Example showMarkup={false} code={`\n<div class=\"bd-callout my-0\">\n  <strong>This is a callout.</strong> We built it custom for our docs so our messages to you stand out. It has three variants via modifier classes.\n</div>\n`} />\n\n```html\n<div class=\"callout\">...</div>\n```\n\nIn your CSS, you’d have something like the following where the bulk of the styling is done via `.callout`. Then, the unique styles between each variant is controlled via modifier class.\n\n```scss\n// Base class\n.callout {}\n\n// Modifier classes\n.callout-info {}\n.callout-warning {}\n.callout-danger {}\n```\n\nFor the callouts, that unique styling is just a `border-left-color`. When you combine that base class with one of those modifier classes, you get your complete component family:\n\n<Callout>\n**This is an info callout.** Example text to show it in action.\n</Callout>\n\n<Callout type=\"warning\">\n**This is a warning callout.** Example text to show it in action.\n</Callout>\n\n<Callout type=\"danger\">\n**This is a danger callout.** Example text to show it in action.\n</Callout>\n"
  },
  {
    "path": "site/src/content/docs/customize/css-variables.mdx",
    "content": "---\ntitle: CSS variables\ndescription: Use Bootstrap’s CSS custom properties for fast and forward-looking design and development.\ntoc: true\n---\n\nBootstrap includes many [CSS custom properties (variables)](https://developer.mozilla.org/en-US/docs/Web/CSS/Using_CSS_custom_properties) in its compiled CSS for real-time customization without the need to recompile Sass. These provide easy access to commonly used values like our theme colors, breakpoints, and primary font stacks when working in your browser’s inspector, a code sandbox, or general prototyping.\n\n**All our custom properties are prefixed with `bs-`** to avoid conflicts with third party CSS.\n\n## Root variables\n\nHere are the variables we include (note that the `:root` is required) that can be accessed anywhere Bootstrap’s CSS is loaded. They’re located in our `_root.scss` file and included in our compiled dist files.\n\n### Default\n\nThese CSS variables are available everywhere, regardless of color mode.\n\n<Code lang=\"css\" filePath=\"dist/css/bootstrap.css\" fileMatch=\":(root,\\n\\[data-bs-theme=light\\] {[^}]*})\" />\n\n### Dark mode\n\nThese variables are scoped to our built-in dark mode.\n\n<Code lang=\"css\" filePath=\"dist/css/bootstrap.css\" fileMatch=\"(\\[data-bs-theme=dark\\] {[^}]*})\" />\n\n## Component variables\n\nBootstrap 5 is increasingly making use of custom properties as local variables for various components. This way we reduce our compiled CSS, ensure styles aren’t inherited in places like nested tables, and allow some basic restyling and extending of Bootstrap components after Sass compilation.\n\nHave a look at our table documentation for some [insight into how we’re using CSS variables]([[docsref:/content/tables#how-do-the-variants-and-accented-tables-work]]). Our [navbars also use CSS variables]([[docsref:/components/navbar#css]]) as of v5.2.0. We’re also using CSS variables across our grids—primarily for gutters the [new opt-in CSS grid]([[docsref:/layout/css-grid]])—with more component usage coming in the future.\n\nWhenever possible, we'll assign CSS variables at the base component level (e.g., `.navbar` for navbar and its sub-components). This reduces guessing on where and how to customize, and allows for easy modifications by our team in future updates.\n\n## Prefix\n\nMost CSS variables use a prefix to avoid collisions with your own codebase. This prefix is in addition to the `--` that’s required on every CSS variable.\n\nCustomize the prefix via the `$prefix` Sass variable. By default, it’s set to `bs-` (note the trailing dash).\n\n## Examples\n\nCSS variables offer similar flexibility to Sass’s variables, but without the need for compilation before being served to the browser. For example, here we’re resetting our page’s font and link styles with CSS variables.\n\n```css\nbody {\n  font: 1rem/1.5 var(--bs-font-sans-serif);\n}\na {\n  color: var(--bs-blue);\n}\n```\n\n## Focus variables\n\n<AddedIn version=\"5.3.0\"/>\n\nBootstrap provides custom `:focus` styles using a combination of Sass and CSS variables that can be optionally added to specific components and elements. We do not yet globally override all `:focus` styles.\n\nIn our Sass, we set default values that can be customized before compiling.\n\n<ScssDocs name=\"focus-ring-variables\" file=\"scss/_variables.scss\" />\n\nThose variables are then reassigned to `:root` level CSS variables that can be customized in real-time, including with options for `x` and `y` offsets (which default to their fallback value of `0`).\n\n<ScssDocs name=\"root-focus-variables\" file=\"scss/_root.scss\" />\n\n## Grid breakpoints\n\nWhile we include our grid breakpoints as CSS variables (except for `xs`), be aware that **CSS variables do not work in media queries**. This is by design in the CSS spec for variables, but may change in coming years with support for `env()` variables. Check out [this Stack Overflow answer](https://stackoverflow.com/a/47212942) for some helpful links. In the meantime, you can use these variables in other CSS situations, as well as in your JavaScript.\n"
  },
  {
    "path": "site/src/content/docs/customize/optimize.mdx",
    "content": "---\ntitle: Optimize\ndescription: Keep your projects lean, responsive, and maintainable so you can deliver the best experience and focus on more important jobs.\ntoc: true\n---\n\n## Lean Sass imports\n\nWhen using Sass in your asset pipeline, make sure you optimize Bootstrap by only `@import`ing the components you need. Your largest optimizations will likely come from the `Layout & Components` section of our `bootstrap.scss`.\n\n<ScssDocs name=\"import-stack\" file=\"scss/bootstrap.scss\" />\n\n\nIf you’re not using a component, comment it out or delete it entirely. For example, if you’re not using the carousel, remove that import to save some file size in your compiled CSS. Keep in mind there are some dependencies across Sass imports that may make it more difficult to omit a file.\n\n## Lean JavaScript\n\nBootstrap’s JavaScript includes every component in our primary dist files (`bootstrap.js` and `bootstrap.min.js`), and even our primary dependency (Popper) with our bundle files (`bootstrap.bundle.js` and `bootstrap.bundle.min.js`). While you’re customizing via Sass, be sure to remove related JavaScript.\n\nFor instance, assuming you’re using your own JavaScript bundler like Webpack, Parcel, or Vite, you’d only import the JavaScript you plan on using. In the example below, we show how to just include our modal JavaScript:\n\n```js\n// Import just what we need\n\n// import 'bootstrap/js/dist/alert';\n// import 'bootstrap/js/dist/button';\n// import 'bootstrap/js/dist/carousel';\n// import 'bootstrap/js/dist/collapse';\n// import 'bootstrap/js/dist/dropdown';\nimport 'bootstrap/js/dist/modal';\n// import 'bootstrap/js/dist/offcanvas';\n// import 'bootstrap/js/dist/popover';\n// import 'bootstrap/js/dist/scrollspy';\n// import 'bootstrap/js/dist/tab';\n// import 'bootstrap/js/dist/toast';\n// import 'bootstrap/js/dist/tooltip';\n```\n\nThis way, you’re not including any JavaScript you don’t intend to use for components like buttons, carousels, and tooltips. If you’re importing dropdowns, tooltips or popovers, be sure to list the Popper dependency in your `package.json` file.\n\n<Callout>\n**Heads up!** Files in `bootstrap/js/dist` use the **default export**. To use them, do the following:\n\n```js\nimport Modal from 'bootstrap/js/dist/modal'\nconst modal = new Modal(document.getElementById('myModal'))\n```\n</Callout>\n\n## Autoprefixer .browserslistrc\n\nBootstrap depends on Autoprefixer to automatically add browser prefixes to certain CSS properties. Prefixes are dictated by our `.browserslistrc` file, found in the root of the Bootstrap repo. Customizing this list of browsers and recompiling the Sass will automatically remove some CSS from your compiled CSS, if there are vendor prefixes unique to that browser or version.\n\n## Unused CSS\n\n_Help wanted with this section, please consider opening a PR. Thanks!_\n\nWhile we don’t have a prebuilt example for using [PurgeCSS](https://github.com/FullHuman/purgecss) with Bootstrap, there are some helpful articles and walkthroughs that the community has written. Here are some options:\n\n- https://medium.com/dwarves-foundation/remove-unused-css-styles-from-bootstrap-using-purgecss-88395a2c5772\n- https://lukelowrey.com/automatically-removeunused-css-from-bootstrap-or-other-frameworks/\n\nLastly, this [CSS Tricks article on unused CSS](https://css-tricks.com/how-do-you-remove-unused-css-from-a-site/) shows how to use PurgeCSS and other similar tools.\n\n## Minify and gzip\n\nWhenever possible, be sure to compress all the code you serve to your visitors. If you’re using Bootstrap dist files, try to stick to the minified versions (indicated by the `.min.css` and `.min.js` extensions). If you’re building Bootstrap from the source with your own build system, be sure to implement your own minifiers for HTML, CSS, and JS.\n\n## Non-blocking files\n\nWhile minifying and using compression might seem like enough, making your files non-blocking ones is also a big step in making your site well-optimized and fast enough.\n\nIf you are using a [Lighthouse](https://developer.chrome.com/docs/lighthouse/overview/) plugin in Google Chrome, you may have stumbled over FCP. [The First Contentful Paint](https://web.dev/articles/fcp) metric measures the time from when the page starts loading to when any part of the page’s content is rendered on the screen.\n\nYou can improve FCP by deferring non-critical JavaScript or CSS. What does that mean? Simply, JavaScript or stylesheets that don’t need to be present on the first paint of your page should be marked with `async` or `defer` attributes.\n\nThis ensures that the less important resources are loaded later and not blocking the first paint. On the other hand, critical resources can be included as inline scripts or styles.\n\nIf you want to learn more about this, there are already a lot of great articles about it:\n\n- https://developer.chrome.com/docs/lighthouse/performance/render-blocking-resources/\n- https://web.dev/articles/defer-non-critical-css\n\n## Always use HTTPS\n\nYour website should only be available over HTTPS connections in production. HTTPS improves the security, privacy, and availability of all sites, and [there is no such thing as non-sensitive web traffic](https://https.cio.gov/everything/). The steps to configure your website to be served exclusively over HTTPS vary widely depending on your architecture and web hosting provider, and thus are beyond the scope of these docs.\n\nSites served over HTTPS should also access all stylesheets, scripts, and other assets over HTTPS connections. Otherwise, you’ll be sending users [mixed active content](https://developer.mozilla.org/en-US/docs/Web/Security/Mixed_content), leading to potential vulnerabilities where a site can be compromised by altering a dependency. This can lead to security issues and in-browser warnings displayed to users. Whether you’re getting Bootstrap from a CDN or serving it yourself, ensure that you only access it over HTTPS connections.\n"
  },
  {
    "path": "site/src/content/docs/customize/options.mdx",
    "content": "---\ntitle: Options\ndescription: Quickly customize Bootstrap with built-in variables to easily toggle global CSS preferences for controlling style and behavior.\n---\n\nCustomize Bootstrap with our built-in custom variables file and easily toggle global CSS preferences with new `$enable-*` Sass variables. Override a variable’s value and recompile with `npm run test` as needed.\n\nYou can find and customize these variables for key global options in Bootstrap’s `scss/_variables.scss` file.\n\n<BsTable class=\"table table-options\">\n| Variable                       | Values                             | Description                                                                            |\n| ------------------------------ | ---------------------------------- | -------------------------------------------------------------------------------------- |\n| `$spacer`                      | `1rem` (default), or any value > 0 | Specifies the default spacer value to programmatically generate our [spacer utilities]([[docsref:/utilities/spacing]]). |\n| `$enable-dark-mode`            | `true` (default) or `false`        | Enables built-in [dark mode support]([[docsref:/customize/color-modes#dark-mode]]) across the project and its components. |\n| `$enable-rounded`              | `true` (default) or `false`        | Enables predefined `border-radius` styles on various components. |\n| `$enable-shadows`              | `true` or `false` (default)        | Enables predefined decorative `box-shadow` styles on various components. Does not affect `box-shadow`s used for focus states. |\n| `$enable-gradients`            | `true` or `false` (default)        | Enables predefined gradients via `background-image` styles on various components. |\n| `$enable-transitions`          | `true` (default) or `false`        | Enables predefined `transition`s on various components. |\n| `$enable-reduced-motion`       | `true` (default) or `false`        | Enables the [`prefers-reduced-motion` media query]([[docsref:/getting-started/accessibility#reduced-motion]]), which suppresses certain animations/transitions based on the users’ browser/operating system preferences. |\n| `$enable-grid-classes`         | `true` (default) or `false`        | Enables the generation of CSS classes for the grid system (e.g. `.row`, `.col-md-1`, etc.). |\n| `$enable-cssgrid`              | `true` or `false` (default)        | Enables the experimental CSS Grid system (e.g. `.grid`, `.g-col-md-1`, etc.). |\n| `$enable-container-classes`    | `true` (default) or `false`        | Enables the generation of CSS classes for layout containers. (New in v5.2.0) |\n| `$enable-caret`                | `true` (default) or `false`        | Enables pseudo element caret on `.dropdown-toggle`. |\n| `$enable-button-pointers`      | `true` (default) or `false`        | Add “hand” cursor to non-disabled button elements. |\n| `$enable-rfs`                  | `true` (default) or `false`        | Globally enables [RFS]([[docsref:/getting-started/rfs]]). |\n| `$enable-validation-icons`     | `true` (default) or `false`        | Enables `background-image` icons within textual inputs and some custom forms for validation states. |\n| `$enable-negative-margins`     | `true` or `false` (default)        | Enables the generation of [negative margin utilities]([[docsref:/utilities/spacing#negative-margin]]). |\n| `$enable-deprecation-messages` | `true` (default) or `false`        | Set to `false` to hide warnings when using any of the deprecated mixins and functions that are planned to be removed in `v6`. |\n| `$enable-important-utilities`  | `true` (default) or `false`        | Enables the `!important` suffix in utility classes. |\n| `$enable-smooth-scroll`        | `true` (default) or `false`        | Applies `scroll-behavior: smooth` globally, except for users asking for reduced motion through [`prefers-reduced-motion` media query]([[docsref:/getting-started/accessibility#reduced-motion]]) |\n</BsTable>\n"
  },
  {
    "path": "site/src/content/docs/customize/overview.mdx",
    "content": "---\ntitle: Customize\ndescription: Learn how to theme, customize, and extend Bootstrap with Sass, a boatload of global options, an expansive color system, and more.\ntoc: false\naliases: \"/docs/[[config:docs_version]]/customize/\"\nsections:\n  - title: Sass\n    description: Utilize our source Sass files to take advantage of variables, maps, mixins, and functions.\n  - title: Options\n    description: Customize Bootstrap with built-in variables to easily toggle global CSS preferences.\n  - title: Color\n    description: Learn about and customize the color systems that support the entire toolkit.\n  - title: Color modes\n    description: Explore our default light mode and the new dark mode, or create custom color modes yourself.\n  - title: Components\n    description: Learn how we build nearly all our components responsively and with base and modifier classes.\n  - title: CSS variables\n    description: Use Bootstrap’s CSS custom properties for fast and forward-looking design and development.\n  - title: Optimize\n    description: Keep your projects lean, responsive, and maintainable so you can deliver the best experience.\n---\n\n## Overview\n\nThere are multiple ways to customize Bootstrap. Your best path can depend on your project, the complexity of your build tools, the version of Bootstrap you’re using, browser support, and more.\n\nOur two preferred methods are:\n\n1. Using Bootstrap [via package manager]([[docsref:/getting-started/download#package-managers]]) so you can use and extend our source files.\n2. Using Bootstrap’s compiled distribution files or [jsDelivr]([[docsref:/getting-started/download#cdn-via-jsdelivr]]) so you can add onto or override Bootstrap’s styles.\n\nWhile we cannot go into details here on how to use every package manager, we can give some guidance on [using Bootstrap with your own Sass compiler]([[docsref:/customize/sass]]).\n\nFor those who want to use the distribution files, review the [getting started page]([[docsref:/getting-started/introduction]]) for how to include those files and an example HTML page. From there, consult the docs for the layout, components, and behaviors you’d like to use.\n\nAs you familiarize yourself with Bootstrap, continue exploring this section for more details on how to utilize our global options, making use of and changing our color system, how we build our components, how to use our growing list of CSS custom properties, and how to optimize your code when building with Bootstrap.\n\n## CSPs and embedded SVGs\n\nSeveral Bootstrap components include embedded SVGs in our CSS to style components consistently and easily across browsers and devices. **For organizations with more strict <abbr title=\"Content Security Policy\">CSP</abbr> configurations**, we’ve documented all instances of our embedded SVGs (all of which are applied via `background-image`) so you can more thoroughly review your options.\n\n- [Accordion]([[docsref:/components/accordion]])\n- [Carousel controls]([[docsref:/components/carousel#with-controls]])\n- [Close button]([[docsref:/components/close-button]]) (used in alerts and modals)\n- [Form checkboxes and radio buttons]([[docsref:/forms/checks-radios]])\n- [Form switches]([[docsref:/forms/checks-radios#switches]])\n- [Form validation icons]([[docsref:/forms/validation#server-side]])\n- [Navbar toggle buttons]([[docsref:/components/navbar#responsive-behaviors]])\n- [Select menus]([[docsref:/forms/select]])\n\nBased on [community conversation](https://github.com/twbs/bootstrap/issues/25394), some options for addressing this in your own codebase include [replacing the URLs with locally hosted assets]([[docsref:/getting-started/webpack#extracting-svg-files]]), removing the images and using inline images (not possible in all components), and modifying your CSP. Our recommendation is to carefully review your own security policies and decide on the best path forward, if necessary.\n"
  },
  {
    "path": "site/src/content/docs/customize/sass.mdx",
    "content": "---\ntitle: Sass\ndescription: Utilize our source Sass files to take advantage of variables, maps, mixins, and functions to help you build faster and customize your project.\ntoc: true\n---\n\nUtilize our source Sass files to take advantage of variables, maps, mixins, and more.\n\n<Callout type=\"warning\">\nSass deprecation warnings are shown when compiling source Sass files with the latest versions of Dart Sass. This does not prevent compilation or usage of Bootstrap. We’re [working on a long-term fix]([[config:repo]]/issues/40962), but in the meantime these deprecation notices can be ignored.\n</Callout>\n\n## File structure\n\nWhenever possible, avoid modifying Bootstrap’s core files. For Sass, that means creating your own stylesheet that imports Bootstrap so you can modify and extend it. Assuming you’re using a package manager like npm, you’ll have a file structure that looks like this:\n\n```text\nyour-project/\n├── scss/\n│   └── custom.scss\n└── node_modules/\n│   └── bootstrap/\n│       ├── js/\n│       └── scss/\n└── index.html\n```\n\nIf you’ve downloaded our source files and aren’t using a package manager, you’ll want to manually create something similar to that structure, keeping Bootstrap’s source files separate from your own.\n\n```text\nyour-project/\n├── scss/\n│   └── custom.scss\n├── bootstrap/\n│   ├── js/\n│   └── scss/\n└── index.html\n```\n\n## Importing\n\nIn your `custom.scss`, you’ll import Bootstrap’s source Sass files. You have two options: include all of Bootstrap, or pick the parts you need. We encourage the latter, though be aware there are some requirements and dependencies across our components. You also will need to include some JavaScript for our plugins.\n\n```scss\n// Custom.scss\n// Option A: Include all of Bootstrap\n\n// Include any default variable overrides here (though functions won’t be available)\n\n@import \"../node_modules/bootstrap/scss/bootstrap\";\n\n// Then add additional custom code here\n```\n\n```scss\n// Custom.scss\n// Option B: Include parts of Bootstrap\n\n// 1. Include functions first (so you can manipulate colors, SVGs, calc, etc)\n@import \"../node_modules/bootstrap/scss/functions\";\n\n// 2. Include any default variable overrides here\n\n// 3. Include remainder of required Bootstrap stylesheets (including any separate color mode stylesheets)\n@import \"../node_modules/bootstrap/scss/variables\";\n@import \"../node_modules/bootstrap/scss/variables-dark\";\n\n// 4. Include any default map overrides here\n\n// 5. Include remainder of required parts\n@import \"../node_modules/bootstrap/scss/maps\";\n@import \"../node_modules/bootstrap/scss/mixins\";\n@import \"../node_modules/bootstrap/scss/root\";\n\n// 6. Include any other optional stylesheet partials as desired; list below is not inclusive of all available stylesheets\n@import \"../node_modules/bootstrap/scss/utilities\";\n@import \"../node_modules/bootstrap/scss/reboot\";\n@import \"../node_modules/bootstrap/scss/type\";\n@import \"../node_modules/bootstrap/scss/images\";\n@import \"../node_modules/bootstrap/scss/containers\";\n@import \"../node_modules/bootstrap/scss/grid\";\n@import \"../node_modules/bootstrap/scss/helpers\";\n// ...\n\n// 7. Optionally include utilities API last to generate classes based on the Sass map in `_utilities.scss`\n@import \"../node_modules/bootstrap/scss/utilities/api\";\n\n// 8. Add additional custom code here\n```\n\nWith that setup in place, you can begin to modify any of the Sass variables and maps in your `custom.scss`. You can also start to add parts of Bootstrap under the `// Optional` section as needed. We suggest using the full import stack from our `bootstrap.scss` file as your starting point.\n\n## Compiling\n\nIn order to use your custom Sass code as CSS in the browser, you need a Sass compiler. Sass ships as a CLI package, but you can also compile it with other build tools like [Gulp](https://gulpjs.com/) or [Webpack](https://webpack.js.org/), or with GUI applications. Some IDEs also have Sass compilers built in or as downloadable extensions.\n\nWe like to use the CLI to compile our Sass, but you can use whichever method you prefer. From the command line, run the following:\n\n```sh\n# Install Sass globally\nnpm install -g sass\n\n# Watch your custom Sass for changes and compile it to CSS\nsass --watch ./scss/custom.scss ./css/custom.css\n```\n\nLearn more about your options at [sass-lang.com/install](https://sass-lang.com/install/) and [compiling with VS Code](https://code.visualstudio.com/docs/languages/css#_transpiling-sass-and-less-into-css).\n\n<Callout>\n**Using Bootstrap with another build tool?** Consider reading our guides for compiling with [Webpack]([[docsref:/getting-started/webpack]]), [Parcel]([[docsref:/getting-started/parcel]]), or [Vite]([[docsref:/getting-started/vite]]). We also have production-ready demos in [our examples repository on GitHub](https://github.com/twbs/examples).\n</Callout>\n\n## Including\n\nOnce your CSS is compiled, you can include it in your HTML files. Inside your `index.html` you’ll want to include your compiled CSS file. Be sure to update the path to your compiled CSS file if you’ve changed it.\n\n```html\n<!doctype html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <title>Custom Bootstrap</title>\n    <link href=\"/css/custom.css\" rel=\"stylesheet\">\n  </head>\n  <body>\n    <h1>Hello, world!</h1>\n  </body>\n</html>\n```\n\n## Variable defaults\n\nEvery Sass variable in Bootstrap includes the `!default` flag allowing you to override the variable’s default value in your own Sass without modifying Bootstrap’s source code. Copy and paste variables as needed, modify their values, and remove the `!default` flag. If a variable has already been assigned, then it won’t be re-assigned by the default values in Bootstrap.\n\nYou will find the complete list of Bootstrap’s variables in `scss/_variables.scss`. Some variables are set to `null`, these variables don’t output the property unless they are overridden in your configuration.\n\nVariable overrides must come after our functions are imported, but before the rest of the imports.\n\nHere’s an example that changes the `background-color` and `color` for the `<body>` when importing and compiling Bootstrap via npm:\n\n```scss\n// Required\n@import \"../node_modules/bootstrap/scss/functions\";\n\n// Default variable overrides\n$body-bg: #000;\n$body-color: #111;\n\n// Required\n@import \"../node_modules/bootstrap/scss/variables\";\n@import \"../node_modules/bootstrap/scss/variables-dark\";\n@import \"../node_modules/bootstrap/scss/maps\";\n@import \"../node_modules/bootstrap/scss/mixins\";\n@import \"../node_modules/bootstrap/scss/root\";\n\n// Optional Bootstrap components here\n@import \"../node_modules/bootstrap/scss/reboot\";\n@import \"../node_modules/bootstrap/scss/type\";\n// etc\n```\n\nRepeat as necessary for any variable in Bootstrap, including the global options below.\n\n<Callout name=\"info-npm-starter\" />\n\n## Maps and loops\n\nBootstrap includes a handful of Sass maps, key value pairs that make it easier to generate families of related CSS. We use Sass maps for our colors, grid breakpoints, and more. Just like Sass variables, all Sass maps include the `!default` flag and can be overridden and extended.\n\nSome of our Sass maps are merged into empty ones by default. This is done to allow easy expansion of a given Sass map, but comes at the cost of making _removing_ items from a map slightly more difficult.\n\n### Modify map\n\nAll variables in the `$theme-colors` map are defined as standalone variables. To modify an existing color in our `$theme-colors` map, add the following to your custom Sass file:\n\n```scss\n$primary: #0074d9;\n$danger: #ff4136;\n```\n\nLater on, these variables are set in Bootstrap’s `$theme-colors` map:\n\n```scss\n$theme-colors: (\n  \"primary\": $primary,\n  \"danger\": $danger\n);\n```\n\n### Add to map\n\nAdd new colors to `$theme-colors`, or any other map, by creating a new Sass map with your custom values and merging it with the original map. In this case, we'll create a new `$custom-colors` map and merge it with `$theme-colors`.\n\n```scss\n// Create your own map\n$custom-colors: (\n  \"custom-color\": #900\n);\n\n// Merge the maps\n$theme-colors: map-merge($theme-colors, $custom-colors);\n```\n\n### Remove from map\n\nTo remove colors from `$theme-colors`, or any other map, use `map-remove`. Be aware you must insert `$theme-colors` between our requirements just after its definition in `variables` and before its usage in `maps`:\n\n```scss\n// Required\n@import \"../node_modules/bootstrap/scss/functions\";\n@import \"../node_modules/bootstrap/scss/variables\";\n@import \"../node_modules/bootstrap/scss/variables-dark\";\n\n$theme-colors: map-remove($theme-colors, \"info\", \"light\", \"dark\");\n\n@import \"../node_modules/bootstrap/scss/maps\";\n@import \"../node_modules/bootstrap/scss/mixins\";\n@import \"../node_modules/bootstrap/scss/root\";\n\n// Optional\n@import \"../node_modules/bootstrap/scss/reboot\";\n@import \"../node_modules/bootstrap/scss/type\";\n// etc\n```\n\n## Required keys\n\nBootstrap assumes the presence of some specific keys within Sass maps as we used and extend these ourselves. As you customize the included maps, you may encounter errors where a specific Sass map’s key is being used.\n\nFor example, we use the `primary`, `success`, and `danger` keys from `$theme-colors` for links, buttons, and form states. Replacing the values of these keys should present no issues, but removing them may cause Sass compilation issues. In these instances, you’ll need to modify the Sass code that makes use of those values.\n\n## Functions\n\n### Colors\n\nNext to the [Sass maps]([[docsref:/customize/color#color-sass-maps]]) we have, theme colors can also be used as standalone variables, like `$primary`.\n\n```scss\n.custom-element {\n  color: $gray-100;\n  background-color: $dark;\n}\n```\n\nYou can lighten or darken colors with Bootstrap’s `tint-color()` and `shade-color()` functions. These functions will mix colors with black or white, unlike Sass’ native `lighten()` and `darken()` functions which will change the lightness by a fixed amount, which often doesn’t lead to the desired effect.\n\n`shift-color()` combines these two functions by shading the color if the weight is positive and tinting the color if the weight is negative.\n\n<ScssDocs name=\"color-functions\" file=\"scss/_functions.scss\" />\n\nIn practice, you’d call the function and pass in the color and weight parameters.\n\n```scss\n.custom-element {\n  color: tint-color($primary, 10%);\n}\n\n.custom-element-2 {\n  color: shade-color($danger, 30%);\n}\n\n.custom-element-3 {\n  color: shift-color($success, 40%);\n  background-color: shift-color($success, -60%);\n}\n```\n\n### Color contrast\n\nIn order to meet the [Web Content Accessibility Guidelines (WCAG)](https://www.w3.org/TR/WCAG/) contrast requirements, authors **must** provide a minimum [text color contrast of 4.5:1](https://www.w3.org/TR/WCAG/#contrast-minimum) and a minimum [non-text color contrast of 3:1](https://www.w3.org/TR/WCAG/#non-text-contrast), with very few exceptions.\n\nTo help with this, we included the `color-contrast` function in Bootstrap. It uses the [WCAG contrast ratio algorithm](https://www.w3.org/TR/WCAG/#dfn-contrast-ratio) for calculating contrast thresholds based on [relative luminance](https://www.w3.org/TR/WCAG/#dfn-relative-luminance) in an `sRGB` color space to automatically return a light (`#fff`), dark (`#212529`) or black (`#000`) contrast color based on the specified base color. This function is especially useful for mixins or loops where you’re generating multiple classes.\n\nFor example, to generate color swatches from our `$theme-colors` map:\n\n```scss\n@each $color, $value in $theme-colors {\n  .swatch-#{$color} {\n    color: color-contrast($value);\n  }\n}\n```\n\nIt can also be used for one-off contrast needs:\n\n```scss\n.custom-element {\n  color: color-contrast(#000); // returns `color: #fff`\n}\n```\n\nYou can also specify a base color with our color map functions:\n\n```scss\n.custom-element {\n  color: color-contrast($dark); // returns `color: #fff`\n}\n```\n\n### Escape SVG\n\nWe use the `escape-svg` function to escape the `<`, `>` and `#` characters for SVG background images. When using the `escape-svg` function, data URIs must be quoted.\n\n### Add and Subtract functions\n\nWe use the `add` and `subtract` functions to wrap the CSS `calc` function. The primary purpose of these functions is to avoid errors when a “unitless” `0` value is passed into a `calc` expression. Expressions like `calc(10px - 0)` will return an error in all browsers, despite being mathematically correct.\n\nExample where the calc is valid:\n\n```scss\n$border-radius: .25rem;\n$border-width: 1px;\n\n.element {\n  // Output calc(.25rem - 1px) is valid\n  border-radius: calc($border-radius - $border-width);\n}\n\n.element {\n  // Output the same calc(.25rem - 1px) as above\n  border-radius: subtract($border-radius, $border-width);\n}\n```\n\nExample where the calc is invalid:\n\n```scss\n$border-radius: .25rem;\n$border-width: 0;\n\n.element {\n  // Output calc(.25rem - 0) is invalid\n  border-radius: calc($border-radius - $border-width);\n}\n\n.element {\n  // Output .25rem\n  border-radius: subtract($border-radius, $border-width);\n}\n```\n\n## Mixins\n\nOur `scss/mixins/` directory has a ton of mixins that power parts of Bootstrap and can also be used across your own project.\n\n### Color schemes\n\nA shorthand mixin for the `prefers-color-scheme` media query is available with support for `light` and `dark` color schemes. See [the color modes documentation]([[docsref:/customize/color-modes]]) for information on our color mode mixin.\n\n<ScssDocs name=\"mixin-color-scheme\" file=\"scss/mixins/_color-scheme.scss\" />\n\n```scss\n.custom-element {\n  @include color-scheme(light) {\n    // Insert light mode styles here\n  }\n\n  @include color-scheme(dark) {\n    // Insert dark mode styles here\n  }\n}\n```\n"
  },
  {
    "path": "site/src/content/docs/docsref.mdx",
    "content": "---\ntitle: Docs reference\ndescription: Examples of Bootstrap’s documentation-specific components and styles.\naliases: \"/docsref/\"\ntoc: true\nrobots: noindex,follow\n---\n\n## Buttons\n\n<button class=\"btn btn-bd-primary\">Primary button</button>\n<button class=\"btn btn-bd-accent\">Accent button</button>\n<button class=\"btn btn-bd-light\">Light button</button>\n\n## Callouts\n\n<Callout>\n  Default callout\n</Callout>\n\n<Callout type=\"warning\">\n  Warning callout\n</Callout>\n\n<Callout type=\"danger\">\n  Danger callout\n</Callout>\n\n## Code example\n\n```scss\n.test {\n  --color: blue;\n}\n```\n\n<Example showMarkup={false} code={`The <abbr title=\"HyperText Markup Language\">HTML</abbr> abbreviation element.`} />\n\n<Example code={`<div class=\"test\">This is a test.</div>`} />\n\n<ScssDocs name=\"variable-gradient\" file=\"scss/_variables.scss\" />\n\n<JsDocs name=\"live-toast\" file=\"site/src/assets/partials/snippets.js\" />\n"
  },
  {
    "path": "site/src/content/docs/extend/approach.mdx",
    "content": "---\ntitle: Approach\ndescription: Learn about the guiding principles, strategies, and techniques used to build and maintain Bootstrap so you can more easily customize and extend it yourself.\naliases:\n  - \"/docs/[[config:docs_version]]/extend/\"\n---\n\nWhile the getting started pages provide an introductory tour of the project and what it offers, this document focuses on _why_ we do the things we do in Bootstrap. It explains our philosophy to building on the web so that others can learn from us, contribute with us, and help us improve.\n\nSee something that doesn’t sound right, or perhaps could be done better? [Open an issue]([[config:repo]]/issues/new/choose)—we’d love to discuss it with you.\n\n## Summary\n\nWe'll dive into each of these more throughout, but at a high level, here’s what guides our approach.\n\n- Components should be responsive and mobile-first\n- Components should be built with a base class and extended via modifier classes\n- Component states should obey a common z-index scale\n- Whenever possible, prefer an HTML and CSS implementation over JavaScript\n- Whenever possible, use utilities over custom styles\n- Whenever possible, avoid enforcing strict HTML requirements (children selectors)\n\n## Responsive\n\nBootstrap’s responsive styles are built to be responsive, an approach that’s often referred to as _mobile-first_. We use this term in our docs and largely agree with it, but at times it can be too broad. While not every component _must_ be entirely responsive in Bootstrap, this responsive approach is about reducing CSS overrides by pushing you to add styles as the viewport becomes larger.\n\nAcross Bootstrap, you’ll see this most clearly in our media queries. In most cases, we use `min-width` queries that begin to apply at a specific breakpoint and carry up through the higher breakpoints. For example, a `.d-none` applies from `min-width: 0` to infinity. On the other hand, a `.d-md-none` applies from the medium breakpoint and up.\n\nAt times we'll use `max-width` when a component’s inherent complexity requires it. At times, these overrides are functionally and mentally clearer to implement and support than rewriting core functionality from our components. We strive to limit this approach, but will use it from time to time.\n\n## Classes\n\nAside from our Reboot, a cross-browser normalization stylesheet, all our styles aim to use classes as selectors. This means steering clear of type selectors (e.g., `input[type=\"text\"]`) and extraneous parent classes (e.g., `.parent .child`) that make styles too specific to easily override.\n\nAs such, components should be built with a base class that houses common, not-to-be overridden property-value pairs. For example, `.btn` and `.btn-primary`. We use `.btn` for all the common styles like `display`, `padding`, and `border-width`. We then use modifiers like `.btn-primary` to add the color, background-color, border-color, etc.\n\nModifier classes should only be used when there are multiple properties or values to be changed across multiple variants. Modifiers are not always necessary, so be sure you’re actually saving lines of code and preventing unnecessary overrides when creating them. Good examples of modifiers are our theme color classes and size variants.\n\n## z-index scales\n\nThere are two `z-index` scales in Bootstrap—elements within a component and overlay components.\n\n### Component elements\n\n- Some components in Bootstrap are built with overlapping elements to prevent double borders without modifying the `border` property. For example, button groups, input groups, and pagination.\n- These components share a standard `z-index` scale of `0` through `3`.\n- `0` is default (initial), `1` is `:hover`, `2` is `:active`/`.active`, and `3` is `:focus`.\n- This approach matches our expectations of highest user priority. If an element is focused, it’s in view and at the user’s attention. Active elements are second highest because they indicate state. Hover is third highest because it indicates user intent, but nearly _anything_ can be hovered.\n\n### Overlay components\n\nBootstrap includes several components that function as an overlay of some kind. This includes, in order of highest `z-index`, dropdowns, fixed and sticky navbars, modals, tooltips, and popovers. These components have their own `z-index` scale that begins at `1000`. This starting number was chosen arbitrarily and serves as a small buffer between our styles and your project’s custom styles.\n\nEach overlay component increases its `z-index` value slightly in such a way that common UI principles allow user focused or hovered elements to remain in view at all times. For example, a modal is document blocking (e.g., you cannot take any other action save for the modal’s action), so we put that above our navbars.\n\nLearn more about this in our [`z-index` layout page]([[docsref:/layout/z-index]]).\n\n## HTML and CSS over JS\n\nWhenever possible, we prefer to write HTML and CSS over JavaScript. In general, HTML and CSS are more prolific and accessible to more people of all different experience levels. HTML and CSS are also faster in your browser than JavaScript, and your browser generally provides a great deal of functionality for you.\n\nThis principle is our first-class JavaScript API using `data` attributes. You don’t need to write nearly any JavaScript to use our JavaScript plugins; instead, write HTML. Read more about this in [our JavaScript overview page]([[docsref:/getting-started/javascript#data-attributes]]).\n\nLastly, our styles build on the fundamental behaviors of common web elements. Whenever possible, we prefer to use what the browser provides. For example, you can put a `.btn` class on nearly any element, but most elements don’t provide any semantic value or browser functionality. So instead, we use `<button>`s and `<a>`s.\n\nThe same goes for more complex components. While we _could_ write our own form validation plugin to add classes to a parent element based on an input’s state, thereby allowing us to style the text say red, we prefer using the `:valid`/`:invalid` pseudo-elements every browser provides us.\n\n## Utilities\n\nUtility classes—formerly helpers in Bootstrap 3—are a powerful ally in combating CSS bloat and poor page performance. A utility class is typically a single, immutable property-value pairing expressed as a class (e.g., `.d-block` represents `display: block;`). Their primary appeal is speed of use while writing HTML and limiting the amount of custom CSS you have to write.\n\nSpecifically regarding custom CSS, utilities can help combat increasing file size by reducing your most commonly repeated property-value pairs into single classes. This can have a dramatic effect at scale in your projects.\n\n## Flexible HTML\n\nWhile not always possible, we strive to avoid being overly dogmatic in our HTML requirements for components. Thus, we focus on single classes in our CSS selectors and try to avoid immediate children selectors (`>`). This gives you more flexibility in your implementation and helps keep our CSS simpler and less specific.\n\n## Code conventions\n\n[Code Guide](https://codeguide.co/) (from Bootstrap co-creator, @mdo) documents how we write our HTML and CSS across Bootstrap. It specifies guidelines for general formatting, common sense defaults, property and attribute orders, and more.\n\nWe use [Stylelint](https://stylelint.io/) to enforce these standards and more in our Sass/CSS. [Our custom Stylelint config](https://github.com/twbs/stylelint-config-twbs-bootstrap) is open source and available for others to use and extend.\n\nWe use [vnu-jar](https://www.npmjs.com/package/vnu-jar) to enforce standard and semantic HTML, as well as detecting common errors.\n"
  },
  {
    "path": "site/src/content/docs/extend/icons.mdx",
    "content": "---\ntitle: Icons\ndescription: Guidance and suggestions for using external icon libraries with Bootstrap.\n---\n\nimport { getData } from '@libs/data'\n\nWhile Bootstrap doesn’t include an icon set by default, we do have our own comprehensive icon library called Bootstrap Icons. Feel free to use them or any other icon set in your project. We’ve included details for Bootstrap Icons and other preferred icon sets below.\n\nWhile most icon sets include multiple file formats, we prefer SVG implementations for their improved accessibility and vector support.\n\n## Bootstrap Icons\n\nBootstrap Icons is a growing library of SVG icons that are designed by [@mdo](https://github.com/mdo) and maintained by [the Bootstrap Team](https://github.com/orgs/twbs/people). The beginnings of this icon set come from Bootstrap’s very own components—our forms, carousels, and more. Bootstrap has very few icon needs out of the box, so we didn’t need much. However, once we got going, we couldn’t stop making more.\n\nOh, and did we mention they’re completely open source? Licensed under MIT, just like Bootstrap, our icon set is available to everyone.\n\n[Learn more about Bootstrap Icons]([[config:icons]]), including how to install them and recommended usage.\n\n## Alternatives\n\nWe’ve tested and used these icon sets ourselves as preferred alternatives to Bootstrap Icons.\n\n<ul>\n{getData('icons').preferred.map((icon) => {\n  return (\n    <li><a href={icon.website}>{icon.name}</a></li>\n  )\n})}\n</ul>\n\n## More options\n\nWhile we haven’t tried these out ourselves, they do look promising and provide multiple formats, including SVG.\n\n<ul>\n{getData('icons').more.map((icon) => {\n  return (\n    <li><a href={icon.website}>{icon.name}</a></li>\n  )\n})}\n</ul>\n"
  },
  {
    "path": "site/src/content/docs/forms/checks-radios.mdx",
    "content": "---\ntitle: Checks and radios\ndescription: Create consistent cross-browser and cross-device checkboxes and radios with our completely rewritten checks component.\naliases: \"/docs/[[config:docs_version]]/forms/checks/\"\ntoc: true\n---\n\n## Approach\n\nBrowser default checkboxes and radios are replaced with the help of `.form-check`, a series of classes for both input types that improves the layout and behavior of their HTML elements, that provide greater customization and cross browser consistency. Checkboxes are for selecting one or several options in a list, while radios are for selecting one option from many.\n\nStructurally, our `<input>`s and `<label>`s are sibling elements as opposed to an `<input>` within a `<label>`. This is slightly more verbose as you must specify `id` and `for` attributes to relate the `<input>` and `<label>`. We use the sibling selector (`~`) for all our `<input>` states, like `:checked` or `:disabled`. When combined with the `.form-check-label` class, we can easily style the text for each item based on the `<input>`’s state.\n\nOur checks use custom Bootstrap icons to indicate checked or indeterminate states.\n\n## Checks\n\n<Example code={`<div class=\"form-check\">\n    <input class=\"form-check-input\" type=\"checkbox\" value=\"\" id=\"checkDefault\">\n    <label class=\"form-check-label\" for=\"checkDefault\">\n      Default checkbox\n    </label>\n  </div>\n  <div class=\"form-check\">\n    <input class=\"form-check-input\" type=\"checkbox\" value=\"\" id=\"checkChecked\" checked>\n    <label class=\"form-check-label\" for=\"checkChecked\">\n      Checked checkbox\n    </label>\n  </div>`} />\n\n### Indeterminate\n\nCheckboxes can utilize the `:indeterminate` pseudo class when manually set via JavaScript (there is no available HTML attribute for specifying it).\n\n<Example addStackblitzJs class=\"bd-example-indeterminate\" code={`<div class=\"form-check\">\n    <input class=\"form-check-input\" type=\"checkbox\" value=\"\" id=\"checkIndeterminate\">\n    <label class=\"form-check-label\" for=\"checkIndeterminate\">\n      Indeterminate checkbox\n    </label>\n  </div>`} />\n\n### Disabled\n\nAdd the `disabled` attribute and the associated `<label>`s are automatically styled to match with a lighter color to help indicate the input’s state.\n\n<Example addStackblitzJs class=\"bd-example-indeterminate\" code={`<div class=\"form-check\">\n    <input class=\"form-check-input\" type=\"checkbox\" value=\"\" id=\"checkIndeterminateDisabled\" disabled>\n    <label class=\"form-check-label\" for=\"checkIndeterminateDisabled\">\n      Disabled indeterminate checkbox\n    </label>\n  </div>\n  <div class=\"form-check\">\n    <input class=\"form-check-input\" type=\"checkbox\" value=\"\" id=\"checkDisabled\" disabled>\n    <label class=\"form-check-label\" for=\"checkDisabled\">\n      Disabled checkbox\n    </label>\n  </div>\n  <div class=\"form-check\">\n    <input class=\"form-check-input\" type=\"checkbox\" value=\"\" id=\"checkCheckedDisabled\" checked disabled>\n    <label class=\"form-check-label\" for=\"checkCheckedDisabled\">\n      Disabled checked checkbox\n    </label>\n  </div>`} />\n\n## Radios\n\n<Example code={`<div class=\"form-check\">\n    <input class=\"form-check-input\" type=\"radio\" name=\"radioDefault\" id=\"radioDefault1\">\n    <label class=\"form-check-label\" for=\"radioDefault1\">\n      Default radio\n    </label>\n  </div>\n  <div class=\"form-check\">\n    <input class=\"form-check-input\" type=\"radio\" name=\"radioDefault\" id=\"radioDefault2\" checked>\n    <label class=\"form-check-label\" for=\"radioDefault2\">\n      Default checked radio\n    </label>\n  </div>`} />\n\n### Disabled\n\nAdd the `disabled` attribute and the associated `<label>`s are automatically styled to match with a lighter color to help indicate the input’s state.\n\n<Example code={`<div class=\"form-check\">\n    <input class=\"form-check-input\" type=\"radio\" name=\"radioDisabled\" id=\"radioDisabled\" disabled>\n    <label class=\"form-check-label\" for=\"radioDisabled\">\n      Disabled radio\n    </label>\n  </div>\n  <div class=\"form-check\">\n    <input class=\"form-check-input\" type=\"radio\" name=\"radioDisabled\" id=\"radioCheckedDisabled\" checked disabled>\n    <label class=\"form-check-label\" for=\"radioCheckedDisabled\">\n      Disabled checked radio\n    </label>\n  </div>`} />\n\n## Switches\n\nA switch has the markup of a custom checkbox but uses the `.form-switch` class to render a toggle switch. Consider using `role=\"switch\"` to more accurately convey the nature of the control to assistive technologies that support this role. In older assistive technologies, it will simply be announced as a regular checkbox as a fallback. Switches also support the `disabled` attribute.\n\n<Example code={`<div class=\"form-check form-switch\">\n    <input class=\"form-check-input\" type=\"checkbox\" role=\"switch\" id=\"switchCheckDefault\">\n    <label class=\"form-check-label\" for=\"switchCheckDefault\">Default switch checkbox input</label>\n  </div>\n  <div class=\"form-check form-switch\">\n    <input class=\"form-check-input\" type=\"checkbox\" role=\"switch\" id=\"switchCheckChecked\" checked>\n    <label class=\"form-check-label\" for=\"switchCheckChecked\">Checked switch checkbox input</label>\n  </div>\n  <div class=\"form-check form-switch\">\n    <input class=\"form-check-input\" type=\"checkbox\" role=\"switch\" id=\"switchCheckDisabled\" disabled>\n    <label class=\"form-check-label\" for=\"switchCheckDisabled\">Disabled switch checkbox input</label>\n  </div>\n  <div class=\"form-check form-switch\">\n    <input class=\"form-check-input\" type=\"checkbox\" role=\"switch\" id=\"switchCheckCheckedDisabled\" checked disabled>\n    <label class=\"form-check-label\" for=\"switchCheckCheckedDisabled\">Disabled checked switch checkbox input</label>\n  </div>`} />\n\n### Native switches\n\nProgressively enhance your switches for mobile Safari (iOS 17.4+) by adding a `switch` attribute to your input to enable haptic feedback when toggling switches, just like native iOS switches. There are no style changes attached to using this attribute in Bootstrap as all our switches use custom styles.\n\n<Example code={`<div class=\"form-check form-switch\">\n    <input class=\"form-check-input\" type=\"checkbox\" value=\"\" id=\"checkNativeSwitch\" switch>\n    <label class=\"form-check-label\" for=\"checkNativeSwitch\">\n      Native switch haptics\n    </label>\n  </div>`} />\n\nBe sure to read more about [the switch attribute on the WebKit blog](https://webkit.org/blog/15054/an-html-switch-control/). Safari 17.4+ on macOS and iOS both have native-style switches in HTML while other browsers simply fall back to the standard checkbox appearance. Applying the attribute to a non-Bootstrap checkbox in more recent versions of Safari will render a native switch.\n\n## Default (stacked)\n\nBy default, any number of checkboxes and radios that are immediate sibling will be vertically stacked and appropriately spaced with `.form-check`.\n\n<Example code={`<div class=\"form-check\">\n    <input class=\"form-check-input\" type=\"checkbox\" value=\"\" id=\"defaultCheck1\">\n    <label class=\"form-check-label\" for=\"defaultCheck1\">\n      Default checkbox\n    </label>\n  </div>\n  <div class=\"form-check\">\n    <input class=\"form-check-input\" type=\"checkbox\" value=\"\" id=\"defaultCheck2\" disabled>\n    <label class=\"form-check-label\" for=\"defaultCheck2\">\n      Disabled checkbox\n    </label>\n  </div>`} />\n\n<Example code={`<div class=\"form-check\">\n    <input class=\"form-check-input\" type=\"radio\" name=\"exampleRadios\" id=\"exampleRadios1\" value=\"option1\" checked>\n    <label class=\"form-check-label\" for=\"exampleRadios1\">\n      Default radio\n    </label>\n  </div>\n  <div class=\"form-check\">\n    <input class=\"form-check-input\" type=\"radio\" name=\"exampleRadios\" id=\"exampleRadios2\" value=\"option2\">\n    <label class=\"form-check-label\" for=\"exampleRadios2\">\n      Second default radio\n    </label>\n  </div>\n  <div class=\"form-check\">\n    <input class=\"form-check-input\" type=\"radio\" name=\"exampleRadios\" id=\"exampleRadios3\" value=\"option3\" disabled>\n    <label class=\"form-check-label\" for=\"exampleRadios3\">\n      Disabled radio\n    </label>\n  </div>`} />\n\n## Inline\n\nGroup checkboxes or radios on the same horizontal row by adding `.form-check-inline` to any `.form-check`.\n\n<Example code={`<div class=\"form-check form-check-inline\">\n    <input class=\"form-check-input\" type=\"checkbox\" id=\"inlineCheckbox1\" value=\"option1\">\n    <label class=\"form-check-label\" for=\"inlineCheckbox1\">1</label>\n  </div>\n  <div class=\"form-check form-check-inline\">\n    <input class=\"form-check-input\" type=\"checkbox\" id=\"inlineCheckbox2\" value=\"option2\">\n    <label class=\"form-check-label\" for=\"inlineCheckbox2\">2</label>\n  </div>\n  <div class=\"form-check form-check-inline\">\n    <input class=\"form-check-input\" type=\"checkbox\" id=\"inlineCheckbox3\" value=\"option3\" disabled>\n    <label class=\"form-check-label\" for=\"inlineCheckbox3\">3 (disabled)</label>\n  </div>`} />\n\n<Example code={`<div class=\"form-check form-check-inline\">\n    <input class=\"form-check-input\" type=\"radio\" name=\"inlineRadioOptions\" id=\"inlineRadio1\" value=\"option1\">\n    <label class=\"form-check-label\" for=\"inlineRadio1\">1</label>\n  </div>\n  <div class=\"form-check form-check-inline\">\n    <input class=\"form-check-input\" type=\"radio\" name=\"inlineRadioOptions\" id=\"inlineRadio2\" value=\"option2\">\n    <label class=\"form-check-label\" for=\"inlineRadio2\">2</label>\n  </div>\n  <div class=\"form-check form-check-inline\">\n    <input class=\"form-check-input\" type=\"radio\" name=\"inlineRadioOptions\" id=\"inlineRadio3\" value=\"option3\" disabled>\n    <label class=\"form-check-label\" for=\"inlineRadio3\">3 (disabled)</label>\n  </div>`} />\n\n## Reverse\n\nPut your checkboxes, radios, and switches on the opposite side with the `.form-check-reverse` modifier class.\n\n<Example code={`<div class=\"form-check form-check-reverse\">\n    <input class=\"form-check-input\" type=\"checkbox\" value=\"\" id=\"reverseCheck1\">\n    <label class=\"form-check-label\" for=\"reverseCheck1\">\n      Reverse checkbox\n    </label>\n  </div>\n  <div class=\"form-check form-check-reverse\">\n    <input class=\"form-check-input\" type=\"checkbox\" value=\"\" id=\"reverseCheck2\" disabled>\n    <label class=\"form-check-label\" for=\"reverseCheck2\">\n      Disabled reverse checkbox\n    </label>\n  </div>\n\n  <div class=\"form-check form-switch form-check-reverse\">\n    <input class=\"form-check-input\" type=\"checkbox\" id=\"switchCheckReverse\">\n    <label class=\"form-check-label\" for=\"switchCheckReverse\">Reverse switch checkbox input</label>\n  </div>`} />\n\n## Without labels\n\nOmit the wrapping `.form-check` for checkboxes and radios that have no label text. Remember to still provide some form of accessible name for assistive technologies (for instance, using `aria-label`). See the [forms overview accessibility]([[docsref:/forms/overview/#accessibility]]) section for details.\n\n<Example code={`<div>\n    <input class=\"form-check-input\" type=\"checkbox\" id=\"checkboxNoLabel\" value=\"\" aria-label=\"...\">\n  </div>\n\n  <div>\n    <input class=\"form-check-input\" type=\"radio\" name=\"radioNoLabel\" id=\"radioNoLabel1\" value=\"\" aria-label=\"...\">\n  </div>`} />\n\n## Toggle buttons\n\nCreate button-like checkboxes and radio buttons by using `.btn` styles rather than `.form-check-label` on the `<label>` elements. These toggle buttons can further be grouped in a [button group]([[docsref:/components/button-group]]) if needed.\n\n### Checkbox toggle buttons\n\n<Example code={`<input type=\"checkbox\" class=\"btn-check\" id=\"btn-check\" autocomplete=\"off\">\n<label class=\"btn btn-primary\" for=\"btn-check\">Single toggle</label>\n\n<input type=\"checkbox\" class=\"btn-check\" id=\"btn-check-2\" checked autocomplete=\"off\">\n<label class=\"btn btn-primary\" for=\"btn-check-2\">Checked</label>\n\n<input type=\"checkbox\" class=\"btn-check\" id=\"btn-check-3\" autocomplete=\"off\" disabled>\n<label class=\"btn btn-primary\" for=\"btn-check-3\">Disabled</label>`} />\n\n<Example code={`<input type=\"checkbox\" class=\"btn-check\" id=\"btn-check-4\" autocomplete=\"off\">\n<label class=\"btn\" for=\"btn-check-4\">Single toggle</label>\n\n<input type=\"checkbox\" class=\"btn-check\" id=\"btn-check-5\" checked autocomplete=\"off\">\n<label class=\"btn\" for=\"btn-check-5\">Checked</label>\n\n<input type=\"checkbox\" class=\"btn-check\" id=\"btn-check-6\" autocomplete=\"off\" disabled>\n<label class=\"btn\" for=\"btn-check-6\">Disabled</label>`} />\n\n<Callout>\nVisually, these checkbox toggle buttons are identical to the [button plugin toggle buttons]([[docsref:/components/buttons#button-plugin]]). However, they are conveyed differently by assistive technologies: the checkbox toggles will be announced by screen readers as “checked“/“not checked“ (since, despite their appearance, they are fundamentally still checkboxes), whereas the button plugin toggle buttons will be announced as “button“/“button pressed“. The choice between these two approaches will depend on the type of toggle you are creating, and whether or not the toggle will make sense to users when announced as a checkbox or as an actual button.\n</Callout>\n\n### Radio toggle buttons\n\n<Example code={`<input type=\"radio\" class=\"btn-check\" name=\"options\" id=\"option1\" autocomplete=\"off\" checked>\n<label class=\"btn btn-secondary\" for=\"option1\">Checked</label>\n\n<input type=\"radio\" class=\"btn-check\" name=\"options\" id=\"option2\" autocomplete=\"off\">\n<label class=\"btn btn-secondary\" for=\"option2\">Radio</label>\n\n<input type=\"radio\" class=\"btn-check\" name=\"options\" id=\"option3\" autocomplete=\"off\" disabled>\n<label class=\"btn btn-secondary\" for=\"option3\">Disabled</label>\n\n<input type=\"radio\" class=\"btn-check\" name=\"options\" id=\"option4\" autocomplete=\"off\">\n<label class=\"btn btn-secondary\" for=\"option4\">Radio</label>`} />\n\n<Example code={`<input type=\"radio\" class=\"btn-check\" name=\"options-base\" id=\"option5\" autocomplete=\"off\" checked>\n<label class=\"btn\" for=\"option5\">Checked</label>\n\n<input type=\"radio\" class=\"btn-check\" name=\"options-base\" id=\"option6\" autocomplete=\"off\">\n<label class=\"btn\" for=\"option6\">Radio</label>\n\n<input type=\"radio\" class=\"btn-check\" name=\"options-base\" id=\"option7\" autocomplete=\"off\" disabled>\n<label class=\"btn\" for=\"option7\">Disabled</label>\n\n<input type=\"radio\" class=\"btn-check\" name=\"options-base\" id=\"option8\" autocomplete=\"off\">\n<label class=\"btn\" for=\"option8\">Radio</label>`} />\n\n### Outlined styles\n\nDifferent variants of `.btn`, such as the various outlined styles, are supported.\n\n<Example code={`<input type=\"checkbox\" class=\"btn-check\" id=\"btn-check-outlined\" autocomplete=\"off\">\n<label class=\"btn btn-outline-primary\" for=\"btn-check-outlined\">Single toggle</label><br>\n\n<input type=\"checkbox\" class=\"btn-check\" id=\"btn-check-2-outlined\" checked autocomplete=\"off\">\n<label class=\"btn btn-outline-secondary\" for=\"btn-check-2-outlined\">Checked</label><br>\n\n<input type=\"radio\" class=\"btn-check\" name=\"options-outlined\" id=\"success-outlined\" autocomplete=\"off\" checked>\n<label class=\"btn btn-outline-success\" for=\"success-outlined\">Checked success radio</label>\n\n<input type=\"radio\" class=\"btn-check\" name=\"options-outlined\" id=\"danger-outlined\" autocomplete=\"off\">\n<label class=\"btn btn-outline-danger\" for=\"danger-outlined\">Danger radio</label>`} />\n\n## CSS\n\n### Sass variables\n\nVariables for checks:\n\n<ScssDocs name=\"form-check-variables\" file=\"scss/_variables.scss\" />\n\nVariables for switches:\n\n<ScssDocs name=\"form-switch-variables\" file=\"scss/_variables.scss\" />\n"
  },
  {
    "path": "site/src/content/docs/forms/floating-labels.mdx",
    "content": "---\ntitle: Floating labels\ndescription: Create beautifully simple form labels that float over your input fields.\ntoc: true\n---\n\n## Example\n\nWrap a pair of `<input class=\"form-control\">` and `<label>` elements in `.form-floating` to enable floating labels with Bootstrap’s textual form fields.\n\nA non-empty `placeholder` attribute is required on each `<input>` as our CSS-only floating label implementation relies on the `:placeholder-shown` pseudo-element to detect when the input is empty. The placeholder text itself is not visible; only the `<label>` is shown to users.\n\nAlso note that the `<input>` must come first so we can utilize a sibling selector (i.e., `~`).\n\n<Example code={`<div class=\"form-floating mb-3\">\n    <input type=\"email\" class=\"form-control\" id=\"floatingInput\" placeholder=\"name@example.com\">\n    <label for=\"floatingInput\">Email address</label>\n  </div>\n  <div class=\"form-floating\">\n    <input type=\"password\" class=\"form-control\" id=\"floatingPassword\" placeholder=\"Password\">\n    <label for=\"floatingPassword\">Password</label>\n  </div>`} />\n\nWhen there’s a `value` already defined, `<label>`s will automatically adjust to their floated position.\n\n<Example code={`<form class=\"form-floating\">\n    <input type=\"email\" class=\"form-control\" id=\"floatingInputValue\" placeholder=\"name@example.com\" value=\"test@example.com\">\n    <label for=\"floatingInputValue\">Input with value</label>\n  </form>`} />\n\nForm validation styles also work as expected.\n\n<Example code={`<form class=\"form-floating\">\n    <input type=\"email\" class=\"form-control is-invalid\" id=\"floatingInputInvalid\" placeholder=\"name@example.com\" value=\"test@example.com\">\n    <label for=\"floatingInputInvalid\">Invalid input</label>\n  </form>`} />\n\n## Textareas\n\nBy default, `<textarea>`s with `.form-control` will be the same height as `<input>`s.\n\n<Example code={`<div class=\"form-floating\">\n    <textarea class=\"form-control\" placeholder=\"Leave a comment here\" id=\"floatingTextarea\"></textarea>\n    <label for=\"floatingTextarea\">Comments</label>\n  </div>`} />\n\nTo set a custom height on your `<textarea>`, do not use the `rows` attribute. Instead, set an explicit `height` (either inline or via custom CSS).\n\n<Example code={`<div class=\"form-floating\">\n    <textarea class=\"form-control\" placeholder=\"Leave a comment here\" id=\"floatingTextarea2\" style=\"height: 100px\"></textarea>\n    <label for=\"floatingTextarea2\">Comments</label>\n  </div>`} />\n\n## Selects\n\nOther than `.form-control`, floating labels are only available on `.form-select`s. They work in the same way, but unlike `<input>`s, they’ll always show the `<label>` in its floated state. **Selects with `size` and `multiple` are not supported.**\n\n<Example code={`<div class=\"form-floating\">\n    <select class=\"form-select\" id=\"floatingSelect\" aria-label=\"Floating label select example\">\n      <option selected>Open this select menu</option>\n      <option value=\"1\">One</option>\n      <option value=\"2\">Two</option>\n      <option value=\"3\">Three</option>\n    </select>\n    <label for=\"floatingSelect\">Works with selects</label>\n  </div>`} />\n\n## Disabled\n\nAdd the `disabled` boolean attribute on an input, a textarea or a select to give it a grayed out appearance, remove pointer events, and prevent focusing.\n\n<Example code={`<div class=\"form-floating mb-3\">\n    <input type=\"email\" class=\"form-control\" id=\"floatingInputDisabled\" placeholder=\"name@example.com\" disabled>\n    <label for=\"floatingInputDisabled\">Email address</label>\n  </div>\n  <div class=\"form-floating mb-3\">\n    <textarea class=\"form-control\" placeholder=\"Leave a comment here\" id=\"floatingTextareaDisabled\" disabled></textarea>\n    <label for=\"floatingTextareaDisabled\">Comments</label>\n  </div>\n  <div class=\"form-floating mb-3\">\n    <textarea class=\"form-control\" placeholder=\"Leave a comment here\" id=\"floatingTextarea2Disabled\" style=\"height: 100px\" disabled>Disabled textarea with some text inside</textarea>\n    <label for=\"floatingTextarea2Disabled\">Comments</label>\n  </div>\n  <div class=\"form-floating\">\n    <select class=\"form-select\" id=\"floatingSelectDisabled\" aria-label=\"Floating label disabled select example\" disabled>\n      <option selected>Open this select menu</option>\n      <option value=\"1\">One</option>\n      <option value=\"2\">Two</option>\n      <option value=\"3\">Three</option>\n    </select>\n    <label for=\"floatingSelectDisabled\">Works with selects</label>\n  </div>`} />\n\n## Readonly plaintext\n\nFloating labels also support `.form-control-plaintext`, which can be helpful for toggling from an editable `<input>` to a plaintext value without affecting the page layout.\n\n<Example code={`<div class=\"form-floating mb-3\">\n    <input type=\"email\" readonly class=\"form-control-plaintext\" id=\"floatingEmptyPlaintextInput\" placeholder=\"name@example.com\">\n    <label for=\"floatingEmptyPlaintextInput\">Empty input</label>\n  </div>\n  <div class=\"form-floating mb-3\">\n    <input type=\"email\" readonly class=\"form-control-plaintext\" id=\"floatingPlaintextInput\" placeholder=\"name@example.com\" value=\"name@example.com\">\n    <label for=\"floatingPlaintextInput\">Input with value</label>\n  </div>`} />\n\n## Input groups\n\nFloating labels also support `.input-group`.\n\n<Example code={`<div class=\"input-group mb-3\">\n    <span class=\"input-group-text\">@</span>\n    <div class=\"form-floating\">\n      <input type=\"text\" class=\"form-control\" id=\"floatingInputGroup1\" placeholder=\"Username\">\n      <label for=\"floatingInputGroup1\">Username</label>\n    </div>\n  </div>`} />\n\nWhen using `.input-group` and `.form-floating` along with form validation, the `-feedback` should be placed outside of the `.form-floating`, but inside of the `.input-group`. This means that the feedback will need to be shown using javascript.\n\n<Example code={`<div class=\"input-group has-validation\">\n    <span class=\"input-group-text\">@</span>\n    <div class=\"form-floating is-invalid\">\n      <input type=\"text\" class=\"form-control is-invalid\" id=\"floatingInputGroup2\" placeholder=\"Username\" required>\n      <label for=\"floatingInputGroup2\">Username</label>\n    </div>\n    <div class=\"invalid-feedback\">\n      Please choose a username.\n    </div>\n  </div>`} />\n\n## Layout\n\nWhen working with the Bootstrap grid system, be sure to place form elements within column classes.\n\n<Example code={`<div class=\"row g-2\">\n    <div class=\"col-md\">\n      <div class=\"form-floating\">\n        <input type=\"email\" class=\"form-control\" id=\"floatingInputGrid\" placeholder=\"name@example.com\" value=\"mdo@example.com\">\n        <label for=\"floatingInputGrid\">Email address</label>\n      </div>\n    </div>\n    <div class=\"col-md\">\n      <div class=\"form-floating\">\n        <select class=\"form-select\" id=\"floatingSelectGrid\">\n          <option selected>Open this select menu</option>\n          <option value=\"1\">One</option>\n          <option value=\"2\">Two</option>\n          <option value=\"3\">Three</option>\n        </select>\n        <label for=\"floatingSelectGrid\">Works with selects</label>\n      </div>\n    </div>\n  </div>`} />\n\n## CSS\n\n### Sass variables\n\n<ScssDocs name=\"form-floating-variables\" file=\"scss/_variables.scss\" />\n"
  },
  {
    "path": "site/src/content/docs/forms/form-control.mdx",
    "content": "---\ntitle: Form controls\ndescription: Give textual form controls like `<input>`s and `<textarea>`s an upgrade with custom styles, sizing, focus states, and more.\ntoc: true\n---\n\n## Example\n\nForm controls are styled with a mix of Sass and CSS variables, allowing them to adapt to color modes and support any customization method.\n\n<Example code={`<div class=\"mb-3\">\n    <label for=\"exampleFormControlInput1\" class=\"form-label\">Email address</label>\n    <input type=\"email\" class=\"form-control\" id=\"exampleFormControlInput1\" placeholder=\"name@example.com\">\n  </div>\n  <div class=\"mb-3\">\n    <label for=\"exampleFormControlTextarea1\" class=\"form-label\">Example textarea</label>\n    <textarea class=\"form-control\" id=\"exampleFormControlTextarea1\" rows=\"3\"></textarea>\n  </div>`} />\n\n## Sizing\n\nSet heights using classes like `.form-control-lg` and `.form-control-sm`.\n\n<Example code={`<input class=\"form-control form-control-lg\" type=\"text\" placeholder=\".form-control-lg\" aria-label=\".form-control-lg example\">\n<input class=\"form-control\" type=\"text\" placeholder=\"Default input\" aria-label=\"default input example\">\n<input class=\"form-control form-control-sm\" type=\"text\" placeholder=\".form-control-sm\" aria-label=\".form-control-sm example\">`} />\n\n## Form text\n\nBlock-level or inline-level form text can be created using `.form-text`.\n\n<Callout type=\"warning\">\nForm text should be explicitly associated with the form control it relates to using the `aria-describedby` attribute. This will ensure that assistive technologies—such as screen readers—will announce this form text when the user focuses or enters the control.\n</Callout>\n\nForm text below inputs can be styled with `.form-text`. If a block-level element will be used, a top margin is added for easy spacing from the inputs above.\n\n<Example code={`<label for=\"inputPassword5\" class=\"form-label\">Password</label>\n  <input type=\"password\" id=\"inputPassword5\" class=\"form-control\" aria-describedby=\"passwordHelpBlock\">\n  <div id=\"passwordHelpBlock\" class=\"form-text\">\n    Your password must be 8-20 characters long, contain letters and numbers, and must not contain spaces, special characters, or emoji.\n  </div>`} />\n\nInline text can use any typical inline HTML element (be it a `<span>`, `<small>`, or something else) with nothing more than the `.form-text` class.\n\n<Example code={`<div class=\"row g-3 align-items-center\">\n    <div class=\"col-auto\">\n      <label for=\"inputPassword6\" class=\"col-form-label\">Password</label>\n    </div>\n    <div class=\"col-auto\">\n      <input type=\"password\" id=\"inputPassword6\" class=\"form-control\" aria-describedby=\"passwordHelpInline\">\n    </div>\n    <div class=\"col-auto\">\n      <span id=\"passwordHelpInline\" class=\"form-text\">\n        Must be 8-20 characters long.\n      </span>\n    </div>\n  </div>`} />\n\n## Disabled\n\nAdd the `disabled` boolean attribute on an input to give it a grayed out appearance, remove pointer events, and prevent focusing.\n\n<Example code={`<input class=\"form-control\" type=\"text\" placeholder=\"Disabled input\" aria-label=\"Disabled input example\" disabled>\n<input class=\"form-control\" type=\"text\" value=\"Disabled readonly input\" aria-label=\"Disabled input example\" disabled readonly>`} />\n\n## Readonly\n\nAdd the `readonly` boolean attribute on an input to prevent modification of the input’s value. `readonly` inputs can still be focused and selected, while `disabled` inputs cannot.\n\n<Example code={`<input class=\"form-control\" type=\"text\" value=\"Readonly input here...\" aria-label=\"readonly input example\" readonly>`} />\n\n## Readonly plain text\n\nIf you want to have `<input readonly>` elements in your form styled as plain text, replace `.form-control` with `.form-control-plaintext` to remove the default form field styling and preserve the correct `margin` and `padding`.\n\n<Example code={`<div class=\"mb-3 row\">\n    <label for=\"staticEmail\" class=\"col-sm-2 col-form-label\">Email</label>\n    <div class=\"col-sm-10\">\n      <input type=\"text\" readonly class=\"form-control-plaintext\" id=\"staticEmail\" value=\"email@example.com\">\n    </div>\n  </div>\n  <div class=\"mb-3 row\">\n    <label for=\"inputPassword\" class=\"col-sm-2 col-form-label\">Password</label>\n    <div class=\"col-sm-10\">\n      <input type=\"password\" class=\"form-control\" id=\"inputPassword\">\n    </div>\n  </div>`} />\n\n<Example code={`<form class=\"row g-3\">\n    <div class=\"col-auto\">\n      <label for=\"staticEmail2\" class=\"visually-hidden\">Email</label>\n      <input type=\"text\" readonly class=\"form-control-plaintext\" id=\"staticEmail2\" value=\"email@example.com\">\n    </div>\n    <div class=\"col-auto\">\n      <label for=\"inputPassword2\" class=\"visually-hidden\">Password</label>\n      <input type=\"password\" class=\"form-control\" id=\"inputPassword2\" placeholder=\"Password\">\n    </div>\n    <div class=\"col-auto\">\n      <button type=\"submit\" class=\"btn btn-primary mb-3\">Confirm identity</button>\n    </div>\n  </form>`} />\n\n## File input\n\n<Example code={`<div class=\"mb-3\">\n    <label for=\"formFile\" class=\"form-label\">Default file input example</label>\n    <input class=\"form-control\" type=\"file\" id=\"formFile\">\n  </div>\n  <div class=\"mb-3\">\n    <label for=\"formFileMultiple\" class=\"form-label\">Multiple files input example</label>\n    <input class=\"form-control\" type=\"file\" id=\"formFileMultiple\" multiple>\n  </div>\n  <div class=\"mb-3\">\n    <label for=\"formFileDisabled\" class=\"form-label\">Disabled file input example</label>\n    <input class=\"form-control\" type=\"file\" id=\"formFileDisabled\" disabled>\n  </div>\n  <div class=\"mb-3\">\n    <label for=\"formFileSm\" class=\"form-label\">Small file input example</label>\n    <input class=\"form-control form-control-sm\" id=\"formFileSm\" type=\"file\">\n  </div>\n  <div>\n    <label for=\"formFileLg\" class=\"form-label\">Large file input example</label>\n    <input class=\"form-control form-control-lg\" id=\"formFileLg\" type=\"file\">\n  </div>`} />\n\n## Color\n\nSet the `type=\"color\"` and add `.form-control-color` to the `<input>`. We use the modifier class to set fixed `height`s and override some inconsistencies between browsers.\n\n<Example code={`<label for=\"exampleColorInput\" class=\"form-label\">Color picker</label>\n<input type=\"color\" class=\"form-control form-control-color\" id=\"exampleColorInput\" value=\"#563d7c\" title=\"Choose your color\">`} />\n\n## Datalists\n\nDatalists allow you to create a group of `<option>`s that can be accessed (and autocompleted) from within an `<input>`. These are similar to `<select>` elements, but come with more menu styling limitations and differences. While most browsers and operating systems include some support for `<datalist>` elements, their styling is inconsistent at best.\n\nLearn more about [support for datalist elements](https://caniuse.com/datalist).\n\n<Example code={`<label for=\"exampleDataList\" class=\"form-label\">Datalist example</label>\n  <input class=\"form-control\" list=\"datalistOptions\" id=\"exampleDataList\" placeholder=\"Type to search...\">\n  <datalist id=\"datalistOptions\">\n    <option value=\"San Francisco\">\n    <option value=\"New York\">\n    <option value=\"Seattle\">\n    <option value=\"Los Angeles\">\n    <option value=\"Chicago\">\n  </datalist>`} />\n\n## CSS\n\n### Sass variables\n\n`$input-*` are shared across most of our form controls (and not buttons).\n\n<ScssDocs name=\"form-input-variables\" file=\"scss/_variables.scss\" />\n\n`$form-label-*` and `$form-text-*` are for our `<label>`s and `.form-text` component.\n\n<ScssDocs name=\"form-label-variables\" file=\"scss/_variables.scss\" />\n\n<ScssDocs name=\"form-text-variables\" file=\"scss/_variables.scss\" />\n\n`$form-file-*` are for file input.\n\n<ScssDocs name=\"form-file-variables\" file=\"scss/_variables.scss\" />\n"
  },
  {
    "path": "site/src/content/docs/forms/input-group.mdx",
    "content": "---\ntitle: Input group\ndescription: Easily extend form controls by adding text, buttons, or button groups on either side of textual inputs, custom selects, and custom file inputs.\ntoc: true\n---\n\n## Basic example\n\nPlace one add-on or button on either side of an input. You may also place one on both sides of an input. Remember to place `<label>`s outside the input group.\n\n<Example code={`<div class=\"input-group mb-3\">\n    <span class=\"input-group-text\" id=\"basic-addon1\">@</span>\n    <input type=\"text\" class=\"form-control\" placeholder=\"Username\" aria-label=\"Username\" aria-describedby=\"basic-addon1\">\n  </div>\n\n  <div class=\"input-group mb-3\">\n    <input type=\"text\" class=\"form-control\" placeholder=\"Recipient’s username\" aria-label=\"Recipient’s username\" aria-describedby=\"basic-addon2\">\n    <span class=\"input-group-text\" id=\"basic-addon2\">@example.com</span>\n  </div>\n\n  <div class=\"mb-3\">\n    <label for=\"basic-url\" class=\"form-label\">Your vanity URL</label>\n    <div class=\"input-group\">\n      <span class=\"input-group-text\" id=\"basic-addon3\">https://example.com/users/</span>\n      <input type=\"text\" class=\"form-control\" id=\"basic-url\" aria-describedby=\"basic-addon3 basic-addon4\">\n    </div>\n    <div class=\"form-text\" id=\"basic-addon4\">Example help text goes outside the input group.</div>\n  </div>\n\n  <div class=\"input-group mb-3\">\n    <span class=\"input-group-text\">$</span>\n    <input type=\"text\" class=\"form-control\" aria-label=\"Amount (to the nearest dollar)\">\n    <span class=\"input-group-text\">.00</span>\n  </div>\n\n  <div class=\"input-group mb-3\">\n    <input type=\"text\" class=\"form-control\" placeholder=\"Username\" aria-label=\"Username\">\n    <span class=\"input-group-text\">@</span>\n    <input type=\"text\" class=\"form-control\" placeholder=\"Server\" aria-label=\"Server\">\n  </div>\n\n  <div class=\"input-group\">\n    <span class=\"input-group-text\">With textarea</span>\n    <textarea class=\"form-control\" aria-label=\"With textarea\"></textarea>\n  </div>`} />\n\n## Wrapping\n\nInput groups wrap by default via `flex-wrap: wrap` in order to accommodate custom form field validation within an input group. You may disable this with `.flex-nowrap`.\n\n<Example code={`<div class=\"input-group flex-nowrap\">\n    <span class=\"input-group-text\" id=\"addon-wrapping\">@</span>\n    <input type=\"text\" class=\"form-control\" placeholder=\"Username\" aria-label=\"Username\" aria-describedby=\"addon-wrapping\">\n  </div>`} />\n\n## Border radius\n\nDue to limitations of browser support at the time, `border-radius` styles can only be applied to the first and last children within the `.input-group` class. Any non-visible element in one of those positions will cause the input group to render incorrectly. This will unfortunately not be fixed until v6 most likely.\n\n<Example code={`<div class=\"input-group\">\n    <span class=\"input-group-text\" id=\"visible-addon\">@</span>\n    <input type=\"text\" class=\"form-control\" placeholder=\"Username\" aria-label=\"Username\" aria-describedby=\"visible-addon\">\n    <input type=\"text\" class=\"form-control d-none\" placeholder=\"Hidden input\" aria-label=\"Hidden input\" aria-describedby=\"visible-addon\">\n  </div>`} />\n\n## Sizing\n\nAdd the relative form sizing classes to the `.input-group` itself and contents within will automatically resize—no need for repeating the form control size classes on each element.\n\n**Sizing on the individual input group elements isn’t supported.**\n\n<Example code={`<div class=\"input-group input-group-sm mb-3\">\n    <span class=\"input-group-text\" id=\"inputGroup-sizing-sm\">Small</span>\n    <input type=\"text\" class=\"form-control\" aria-label=\"Sizing example input\" aria-describedby=\"inputGroup-sizing-sm\">\n  </div>\n\n  <div class=\"input-group mb-3\">\n    <span class=\"input-group-text\" id=\"inputGroup-sizing-default\">Default</span>\n    <input type=\"text\" class=\"form-control\" aria-label=\"Sizing example input\" aria-describedby=\"inputGroup-sizing-default\">\n  </div>\n\n  <div class=\"input-group input-group-lg\">\n    <span class=\"input-group-text\" id=\"inputGroup-sizing-lg\">Large</span>\n    <input type=\"text\" class=\"form-control\" aria-label=\"Sizing example input\" aria-describedby=\"inputGroup-sizing-lg\">\n  </div>`} />\n\n## Checkboxes and radios\n\nPlace any checkbox or radio option within an input group’s addon instead of text. We recommend adding `.mt-0` to the `.form-check-input` when there’s no visible text next to the input.\n\n<Example code={`<div class=\"input-group mb-3\">\n    <div class=\"input-group-text\">\n      <input class=\"form-check-input mt-0\" type=\"checkbox\" value=\"\" aria-label=\"Checkbox for following text input\">\n    </div>\n    <input type=\"text\" class=\"form-control\" aria-label=\"Text input with checkbox\">\n  </div>\n\n  <div class=\"input-group\">\n    <div class=\"input-group-text\">\n      <input class=\"form-check-input mt-0\" type=\"radio\" value=\"\" aria-label=\"Radio button for following text input\">\n    </div>\n    <input type=\"text\" class=\"form-control\" aria-label=\"Text input with radio button\">\n  </div>`} />\n\n## Multiple inputs\n\nWhile multiple `<input>`s are supported visually, validation styles are only available for input groups with a single `<input>`.\n\n<Example code={`<div class=\"input-group\">\n    <span class=\"input-group-text\">First and last name</span>\n    <input type=\"text\" aria-label=\"First name\" class=\"form-control\">\n    <input type=\"text\" aria-label=\"Last name\" class=\"form-control\">\n  </div>`} />\n\n## Multiple addons\n\nMultiple add-ons are supported and can be mixed with checkbox and radio input versions.\n\n<Example code={`<div class=\"input-group mb-3\">\n    <span class=\"input-group-text\">$</span>\n    <span class=\"input-group-text\">0.00</span>\n    <input type=\"text\" class=\"form-control\" aria-label=\"Dollar amount (with dot and two decimal places)\">\n  </div>\n\n  <div class=\"input-group\">\n    <input type=\"text\" class=\"form-control\" aria-label=\"Dollar amount (with dot and two decimal places)\">\n    <span class=\"input-group-text\">$</span>\n    <span class=\"input-group-text\">0.00</span>\n  </div>`} />\n\n## Button addons\n\n<Example code={`<div class=\"input-group mb-3\">\n    <button class=\"btn btn-outline-secondary\" type=\"button\" id=\"button-addon1\">Button</button>\n    <input type=\"text\" class=\"form-control\" placeholder=\"\" aria-label=\"Example text with button addon\" aria-describedby=\"button-addon1\">\n  </div>\n\n  <div class=\"input-group mb-3\">\n    <input type=\"text\" class=\"form-control\" placeholder=\"Recipient’s username\" aria-label=\"Recipient’s username\" aria-describedby=\"button-addon2\">\n    <button class=\"btn btn-outline-secondary\" type=\"button\" id=\"button-addon2\">Button</button>\n  </div>\n\n  <div class=\"input-group mb-3\">\n    <button class=\"btn btn-outline-secondary\" type=\"button\">Button</button>\n    <button class=\"btn btn-outline-secondary\" type=\"button\">Button</button>\n    <input type=\"text\" class=\"form-control\" placeholder=\"\" aria-label=\"Example text with two button addons\">\n  </div>\n\n  <div class=\"input-group\">\n    <input type=\"text\" class=\"form-control\" placeholder=\"Recipient’s username\" aria-label=\"Recipient’s username with two button addons\">\n    <button class=\"btn btn-outline-secondary\" type=\"button\">Button</button>\n    <button class=\"btn btn-outline-secondary\" type=\"button\">Button</button>\n  </div>`} />\n\n## Buttons with dropdowns\n\n<Example code={`<div class=\"input-group mb-3\">\n    <button class=\"btn btn-outline-secondary dropdown-toggle\" type=\"button\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">Dropdown</button>\n    <ul class=\"dropdown-menu\">\n      <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n      <li><hr class=\"dropdown-divider\"></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Separated link</a></li>\n    </ul>\n    <input type=\"text\" class=\"form-control\" aria-label=\"Text input with dropdown button\">\n  </div>\n\n  <div class=\"input-group mb-3\">\n    <input type=\"text\" class=\"form-control\" aria-label=\"Text input with dropdown button\">\n    <button class=\"btn btn-outline-secondary dropdown-toggle\" type=\"button\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">Dropdown</button>\n    <ul class=\"dropdown-menu dropdown-menu-end\">\n      <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n      <li><hr class=\"dropdown-divider\"></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Separated link</a></li>\n    </ul>\n  </div>\n\n  <div class=\"input-group\">\n    <button class=\"btn btn-outline-secondary dropdown-toggle\" type=\"button\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">Dropdown</button>\n    <ul class=\"dropdown-menu\">\n      <li><a class=\"dropdown-item\" href=\"#\">Action before</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Another action before</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n      <li><hr class=\"dropdown-divider\"></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Separated link</a></li>\n    </ul>\n    <input type=\"text\" class=\"form-control\" aria-label=\"Text input with 2 dropdown buttons\">\n    <button class=\"btn btn-outline-secondary dropdown-toggle\" type=\"button\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">Dropdown</button>\n    <ul class=\"dropdown-menu dropdown-menu-end\">\n      <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n      <li><hr class=\"dropdown-divider\"></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Separated link</a></li>\n    </ul>\n  </div>`} />\n\n## Segmented buttons\n\n<Example code={`<div class=\"input-group mb-3\">\n    <button type=\"button\" class=\"btn btn-outline-secondary\">Action</button>\n    <button type=\"button\" class=\"btn btn-outline-secondary dropdown-toggle dropdown-toggle-split\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n      <span class=\"visually-hidden\">Toggle Dropdown</span>\n    </button>\n    <ul class=\"dropdown-menu\">\n      <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n      <li><hr class=\"dropdown-divider\"></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Separated link</a></li>\n    </ul>\n    <input type=\"text\" class=\"form-control\" aria-label=\"Text input with segmented dropdown button\">\n  </div>\n\n  <div class=\"input-group\">\n    <input type=\"text\" class=\"form-control\" aria-label=\"Text input with segmented dropdown button\">\n    <button type=\"button\" class=\"btn btn-outline-secondary\">Action</button>\n    <button type=\"button\" class=\"btn btn-outline-secondary dropdown-toggle dropdown-toggle-split\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n      <span class=\"visually-hidden\">Toggle Dropdown</span>\n    </button>\n    <ul class=\"dropdown-menu dropdown-menu-end\">\n      <li><a class=\"dropdown-item\" href=\"#\">Action</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Another action</a></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Something else here</a></li>\n      <li><hr class=\"dropdown-divider\"></li>\n      <li><a class=\"dropdown-item\" href=\"#\">Separated link</a></li>\n    </ul>\n  </div>`} />\n\n## Custom forms\n\nInput groups include support for custom selects and custom file inputs. Browser default versions of these are not supported.\n\n### Custom select\n\n<Example code={`<div class=\"input-group mb-3\">\n    <label class=\"input-group-text\" for=\"inputGroupSelect01\">Options</label>\n    <select class=\"form-select\" id=\"inputGroupSelect01\">\n      <option selected>Choose...</option>\n      <option value=\"1\">One</option>\n      <option value=\"2\">Two</option>\n      <option value=\"3\">Three</option>\n    </select>\n  </div>\n\n  <div class=\"input-group mb-3\">\n    <select class=\"form-select\" id=\"inputGroupSelect02\">\n      <option selected>Choose...</option>\n      <option value=\"1\">One</option>\n      <option value=\"2\">Two</option>\n      <option value=\"3\">Three</option>\n    </select>\n    <label class=\"input-group-text\" for=\"inputGroupSelect02\">Options</label>\n  </div>\n\n  <div class=\"input-group mb-3\">\n    <button class=\"btn btn-outline-secondary\" type=\"button\">Button</button>\n    <select class=\"form-select\" id=\"inputGroupSelect03\" aria-label=\"Example select with button addon\">\n      <option selected>Choose...</option>\n      <option value=\"1\">One</option>\n      <option value=\"2\">Two</option>\n      <option value=\"3\">Three</option>\n    </select>\n  </div>\n\n  <div class=\"input-group\">\n    <select class=\"form-select\" id=\"inputGroupSelect04\" aria-label=\"Example select with button addon\">\n      <option selected>Choose...</option>\n      <option value=\"1\">One</option>\n      <option value=\"2\">Two</option>\n      <option value=\"3\">Three</option>\n    </select>\n    <button class=\"btn btn-outline-secondary\" type=\"button\">Button</button>\n  </div>`} />\n\n### Custom file input\n\n<Example code={`<div class=\"input-group mb-3\">\n    <label class=\"input-group-text\" for=\"inputGroupFile01\">Upload</label>\n    <input type=\"file\" class=\"form-control\" id=\"inputGroupFile01\">\n  </div>\n\n  <div class=\"input-group mb-3\">\n    <input type=\"file\" class=\"form-control\" id=\"inputGroupFile02\">\n    <label class=\"input-group-text\" for=\"inputGroupFile02\">Upload</label>\n  </div>\n\n  <div class=\"input-group mb-3\">\n    <button class=\"btn btn-outline-secondary\" type=\"button\" id=\"inputGroupFileAddon03\">Button</button>\n    <input type=\"file\" class=\"form-control\" id=\"inputGroupFile03\" aria-describedby=\"inputGroupFileAddon03\" aria-label=\"Upload\">\n  </div>\n\n  <div class=\"input-group\">\n    <input type=\"file\" class=\"form-control\" id=\"inputGroupFile04\" aria-describedby=\"inputGroupFileAddon04\" aria-label=\"Upload\">\n    <button class=\"btn btn-outline-secondary\" type=\"button\" id=\"inputGroupFileAddon04\">Button</button>\n  </div>`} />\n\n## CSS\n\n### Sass variables\n\n<ScssDocs name=\"input-group-variables\" file=\"scss/_variables.scss\" />\n"
  },
  {
    "path": "site/src/content/docs/forms/layout.mdx",
    "content": "---\ntitle: Layout\ndescription: Give your forms some structure—from inline to horizontal to custom grid implementations—with our form layout options.\ntoc: true\n---\n\n## Forms\n\nEvery group of form fields should reside in a `<form>` element. Bootstrap provides no default styling for the `<form>` element, but there are some powerful browser features that are provided by default.\n\n- New to browser forms? Consider reviewing [the MDN form docs](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/form) for an overview and complete list of available attributes.\n- `<button>`s within a `<form>` default to `type=\"submit\"`, so strive to be specific and always include a `type`.\n\nSince Bootstrap applies `display: block` and `width: 100%` to almost all our form controls, forms will by default stack vertically. Additional classes can be used to vary this layout on a per-form basis.\n\n## Utilities\n\n[Margin utilities]([[docsref:/utilities/spacing]]) are the easiest way to add some structure to forms. They provide basic grouping of labels, controls, optional form text, and form validation messaging. We recommend sticking to `margin-bottom` utilities, and using a single direction throughout the form for consistency.\n\nFeel free to build your forms however you like, with `<fieldset>`s, `<div>`s, or nearly any other element.\n\n<Example code={`<div class=\"mb-3\">\n    <label for=\"formGroupExampleInput\" class=\"form-label\">Example label</label>\n    <input type=\"text\" class=\"form-control\" id=\"formGroupExampleInput\" placeholder=\"Example input placeholder\">\n  </div>\n  <div class=\"mb-3\">\n    <label for=\"formGroupExampleInput2\" class=\"form-label\">Another label</label>\n    <input type=\"text\" class=\"form-control\" id=\"formGroupExampleInput2\" placeholder=\"Another input placeholder\">\n  </div>`} />\n\n## Form grid\n\nMore complex forms can be built using our grid classes. Use these for form layouts that require multiple columns, varied widths, and additional alignment options. **Requires the `$enable-grid-classes` Sass variable to be enabled** (on by default).\n\n<Example code={`<div class=\"row\">\n    <div class=\"col\">\n      <input type=\"text\" class=\"form-control\" placeholder=\"First name\" aria-label=\"First name\">\n    </div>\n    <div class=\"col\">\n      <input type=\"text\" class=\"form-control\" placeholder=\"Last name\" aria-label=\"Last name\">\n    </div>\n  </div>`} />\n\n## Gutters\n\nBy adding [gutter modifier classes]([[docsref:/layout/gutters]]), you can have control over the gutter width in as well the inline as block direction. **Also requires the `$enable-grid-classes` Sass variable to be enabled** (on by default).\n\n<Example code={`<div class=\"row g-3\">\n    <div class=\"col\">\n      <input type=\"text\" class=\"form-control\" placeholder=\"First name\" aria-label=\"First name\">\n    </div>\n    <div class=\"col\">\n      <input type=\"text\" class=\"form-control\" placeholder=\"Last name\" aria-label=\"Last name\">\n    </div>\n  </div>`} />\n\nMore complex layouts can also be created with the grid system.\n\n<Example code={`<form class=\"row g-3\">\n    <div class=\"col-md-6\">\n      <label for=\"inputEmail4\" class=\"form-label\">Email</label>\n      <input type=\"email\" class=\"form-control\" id=\"inputEmail4\">\n    </div>\n    <div class=\"col-md-6\">\n      <label for=\"inputPassword4\" class=\"form-label\">Password</label>\n      <input type=\"password\" class=\"form-control\" id=\"inputPassword4\">\n    </div>\n    <div class=\"col-12\">\n      <label for=\"inputAddress\" class=\"form-label\">Address</label>\n      <input type=\"text\" class=\"form-control\" id=\"inputAddress\" placeholder=\"1234 Main St\">\n    </div>\n    <div class=\"col-12\">\n      <label for=\"inputAddress2\" class=\"form-label\">Address 2</label>\n      <input type=\"text\" class=\"form-control\" id=\"inputAddress2\" placeholder=\"Apartment, studio, or floor\">\n    </div>\n    <div class=\"col-md-6\">\n      <label for=\"inputCity\" class=\"form-label\">City</label>\n      <input type=\"text\" class=\"form-control\" id=\"inputCity\">\n    </div>\n    <div class=\"col-md-4\">\n      <label for=\"inputState\" class=\"form-label\">State</label>\n      <select id=\"inputState\" class=\"form-select\">\n        <option selected>Choose...</option>\n        <option>...</option>\n      </select>\n    </div>\n    <div class=\"col-md-2\">\n      <label for=\"inputZip\" class=\"form-label\">Zip</label>\n      <input type=\"text\" class=\"form-control\" id=\"inputZip\">\n    </div>\n    <div class=\"col-12\">\n      <div class=\"form-check\">\n        <input class=\"form-check-input\" type=\"checkbox\" id=\"gridCheck\">\n        <label class=\"form-check-label\" for=\"gridCheck\">\n          Check me out\n        </label>\n      </div>\n    </div>\n    <div class=\"col-12\">\n      <button type=\"submit\" class=\"btn btn-primary\">Sign in</button>\n    </div>\n  </form>`} />\n\n## Horizontal form\n\nCreate horizontal forms with the grid by adding the `.row` class to form groups and using the `.col-*-*` classes to specify the width of your labels and controls. Be sure to add `.col-form-label` to your `<label>`s as well so they’re vertically centered with their associated form controls.\n\nAt times, you maybe need to use margin or padding utilities to create that perfect alignment you need. For example, we’ve removed the `padding-top` on our stacked radio inputs label to better align the text baseline.\n\n<Example code={`<form>\n    <div class=\"row mb-3\">\n      <label for=\"inputEmail3\" class=\"col-sm-2 col-form-label\">Email</label>\n      <div class=\"col-sm-10\">\n        <input type=\"email\" class=\"form-control\" id=\"inputEmail3\">\n      </div>\n    </div>\n    <div class=\"row mb-3\">\n      <label for=\"inputPassword3\" class=\"col-sm-2 col-form-label\">Password</label>\n      <div class=\"col-sm-10\">\n        <input type=\"password\" class=\"form-control\" id=\"inputPassword3\">\n      </div>\n    </div>\n    <fieldset class=\"row mb-3\">\n      <legend class=\"col-form-label col-sm-2 pt-0\">Radios</legend>\n      <div class=\"col-sm-10\">\n        <div class=\"form-check\">\n          <input class=\"form-check-input\" type=\"radio\" name=\"gridRadios\" id=\"gridRadios1\" value=\"option1\" checked>\n          <label class=\"form-check-label\" for=\"gridRadios1\">\n            First radio\n          </label>\n        </div>\n        <div class=\"form-check\">\n          <input class=\"form-check-input\" type=\"radio\" name=\"gridRadios\" id=\"gridRadios2\" value=\"option2\">\n          <label class=\"form-check-label\" for=\"gridRadios2\">\n            Second radio\n          </label>\n        </div>\n        <div class=\"form-check disabled\">\n          <input class=\"form-check-input\" type=\"radio\" name=\"gridRadios\" id=\"gridRadios3\" value=\"option3\" disabled>\n          <label class=\"form-check-label\" for=\"gridRadios3\">\n            Third disabled radio\n          </label>\n        </div>\n      </div>\n    </fieldset>\n    <div class=\"row mb-3\">\n      <div class=\"col-sm-10 offset-sm-2\">\n        <div class=\"form-check\">\n          <input class=\"form-check-input\" type=\"checkbox\" id=\"gridCheck1\">\n          <label class=\"form-check-label\" for=\"gridCheck1\">\n            Example checkbox\n          </label>\n        </div>\n      </div>\n    </div>\n    <button type=\"submit\" class=\"btn btn-primary\">Sign in</button>\n  </form>`} />\n\n### Horizontal form label sizing\n\nBe sure to use `.col-form-label-sm` or `.col-form-label-lg` to your `<label>`s or `<legend>`s to correctly follow the size of `.form-control-lg` and `.form-control-sm`.\n\n<Example code={`<div class=\"row mb-3\">\n    <label for=\"colFormLabelSm\" class=\"col-sm-2 col-form-label col-form-label-sm\">Email</label>\n    <div class=\"col-sm-10\">\n      <input type=\"email\" class=\"form-control form-control-sm\" id=\"colFormLabelSm\" placeholder=\"col-form-label-sm\">\n    </div>\n  </div>\n  <div class=\"row mb-3\">\n    <label for=\"colFormLabel\" class=\"col-sm-2 col-form-label\">Email</label>\n    <div class=\"col-sm-10\">\n      <input type=\"email\" class=\"form-control\" id=\"colFormLabel\" placeholder=\"col-form-label\">\n    </div>\n  </div>\n  <div class=\"row\">\n    <label for=\"colFormLabelLg\" class=\"col-sm-2 col-form-label col-form-label-lg\">Email</label>\n    <div class=\"col-sm-10\">\n      <input type=\"email\" class=\"form-control form-control-lg\" id=\"colFormLabelLg\" placeholder=\"col-form-label-lg\">\n    </div>\n  </div>`} />\n\n## Column sizing\n\nAs shown in the previous examples, our grid system allows you to place any number of `.col`s within a `.row`. They’ll split the available width equally between them. You may also pick a subset of your columns to take up more or less space, while the remaining `.col`s equally split the rest, with specific column classes like `.col-sm-7`.\n\n<Example code={`<div class=\"row g-3\">\n    <div class=\"col-sm-7\">\n      <input type=\"text\" class=\"form-control\" placeholder=\"City\" aria-label=\"City\">\n    </div>\n    <div class=\"col-sm\">\n      <input type=\"text\" class=\"form-control\" placeholder=\"State\" aria-label=\"State\">\n    </div>\n    <div class=\"col-sm\">\n      <input type=\"text\" class=\"form-control\" placeholder=\"Zip\" aria-label=\"Zip\">\n    </div>\n  </div>`} />\n\n## Auto-sizing\n\nThe example below uses a flexbox utility to vertically center the contents and changes `.col` to `.col-auto` so that your columns only take up as much space as needed. Put another way, the column sizes itself based on the contents.\n\n<Example code={`<form class=\"row gy-2 gx-3 align-items-center\">\n    <div class=\"col-auto\">\n      <label class=\"visually-hidden\" for=\"autoSizingInput\">Name</label>\n      <input type=\"text\" class=\"form-control\" id=\"autoSizingInput\" placeholder=\"Jane Doe\">\n    </div>\n    <div class=\"col-auto\">\n      <label class=\"visually-hidden\" for=\"autoSizingInputGroup\">Username</label>\n      <div class=\"input-group\">\n        <div class=\"input-group-text\">@</div>\n        <input type=\"text\" class=\"form-control\" id=\"autoSizingInputGroup\" placeholder=\"Username\">\n      </div>\n    </div>\n    <div class=\"col-auto\">\n      <label class=\"visually-hidden\" for=\"autoSizingSelect\">Preference</label>\n      <select class=\"form-select\" id=\"autoSizingSelect\">\n        <option selected>Choose...</option>\n        <option value=\"1\">One</option>\n        <option value=\"2\">Two</option>\n        <option value=\"3\">Three</option>\n      </select>\n    </div>\n    <div class=\"col-auto\">\n      <div class=\"form-check\">\n        <input class=\"form-check-input\" type=\"checkbox\" id=\"autoSizingCheck\">\n        <label class=\"form-check-label\" for=\"autoSizingCheck\">\n          Remember me\n        </label>\n      </div>\n    </div>\n    <div class=\"col-auto\">\n      <button type=\"submit\" class=\"btn btn-primary\">Submit</button>\n    </div>\n  </form>`} />\n\nYou can then remix that once again with size-specific column classes.\n\n<Example code={`<form class=\"row gx-3 gy-2 align-items-center\">\n    <div class=\"col-sm-3\">\n      <label class=\"visually-hidden\" for=\"specificSizeInputName\">Name</label>\n      <input type=\"text\" class=\"form-control\" id=\"specificSizeInputName\" placeholder=\"Jane Doe\">\n    </div>\n    <div class=\"col-sm-3\">\n      <label class=\"visually-hidden\" for=\"specificSizeInputGroupUsername\">Username</label>\n      <div class=\"input-group\">\n        <div class=\"input-group-text\">@</div>\n        <input type=\"text\" class=\"form-control\" id=\"specificSizeInputGroupUsername\" placeholder=\"Username\">\n      </div>\n    </div>\n    <div class=\"col-sm-3\">\n      <label class=\"visually-hidden\" for=\"specificSizeSelect\">Preference</label>\n      <select class=\"form-select\" id=\"specificSizeSelect\">\n        <option selected>Choose...</option>\n        <option value=\"1\">One</option>\n        <option value=\"2\">Two</option>\n        <option value=\"3\">Three</option>\n      </select>\n    </div>\n    <div class=\"col-auto\">\n      <div class=\"form-check\">\n        <input class=\"form-check-input\" type=\"checkbox\" id=\"autoSizingCheck2\">\n        <label class=\"form-check-label\" for=\"autoSizingCheck2\">\n          Remember me\n        </label>\n      </div>\n    </div>\n    <div class=\"col-auto\">\n      <button type=\"submit\" class=\"btn btn-primary\">Submit</button>\n    </div>\n  </form>`} />\n\n## Inline forms\n\nUse the `.row-cols-*` classes to create responsive horizontal layouts. By adding [gutter modifier classes]([[docsref:/layout/gutters]]), we'll have gutters in horizontal and vertical directions. On narrow mobile viewports, the `.col-12` helps stack the form controls and more. The `.align-items-center` aligns the form elements to the middle, making the `.form-check` align properly.\n\n<Example code={`<form class=\"row row-cols-lg-auto g-3 align-items-center\">\n    <div class=\"col-12\">\n      <label class=\"visually-hidden\" for=\"inlineFormInputGroupUsername\">Username</label>\n      <div class=\"input-group\">\n        <div class=\"input-group-text\">@</div>\n        <input type=\"text\" class=\"form-control\" id=\"inlineFormInputGroupUsername\" placeholder=\"Username\">\n      </div>\n    </div>\n\n    <div class=\"col-12\">\n      <label class=\"visually-hidden\" for=\"inlineFormSelectPref\">Preference</label>\n      <select class=\"form-select\" id=\"inlineFormSelectPref\">\n        <option selected>Choose...</option>\n        <option value=\"1\">One</option>\n        <option value=\"2\">Two</option>\n        <option value=\"3\">Three</option>\n      </select>\n    </div>\n\n    <div class=\"col-12\">\n      <div class=\"form-check\">\n        <input class=\"form-check-input\" type=\"checkbox\" id=\"inlineFormCheck\">\n        <label class=\"form-check-label\" for=\"inlineFormCheck\">\n          Remember me\n        </label>\n      </div>\n    </div>\n\n    <div class=\"col-12\">\n      <button type=\"submit\" class=\"btn btn-primary\">Submit</button>\n    </div>\n  </form>`} />\n"
  },
  {
    "path": "site/src/content/docs/forms/overview.mdx",
    "content": "---\ntitle: Forms\ndescription: Examples and usage guidelines for form control styles, layout options, and custom components for creating a wide variety of forms.\ntoc: true\naliases: \"/docs/[[config:docs_version]]/forms/\"\nsections:\n  - title: Form control\n    description: Style textual inputs and textareas with support for multiple states.\n  - title: Select\n    description: Improve browser default select elements with a custom initial appearance.\n  - title: Checks & radios\n    description: Use our custom radio buttons and checkboxes in forms for selecting input options.\n  - title: Range\n    description: Replace browser default range inputs with our custom version.\n  - title: Input group\n    description: Attach labels and buttons to your inputs for increased semantic value.\n  - title: Floating labels\n    description: Create beautifully simple form labels that float over your input fields.\n  - title: Layout\n    description: Create inline, horizontal, or complex grid-based layouts with your forms.\n  - title: Validation\n    description: Validate your forms with custom or native validation behaviors and styles.\n---\n\n## Overview\n\nBootstrap’s form controls expand on [our Rebooted form styles]([[docsref:/content/reboot#forms]]) with classes. Use these classes to opt into their customized displays for a more consistent rendering across browsers and devices.\n\nBe sure to use an appropriate `type` attribute on all inputs (e.g., `email` for email address or `number` for numerical information) to take advantage of newer input controls like email verification, number selection, and more.\n\nHere’s a quick example to demonstrate Bootstrap’s form styles. Keep reading for documentation on required classes, form layout, and more.\n\n<Example code={`<form>\n    <div class=\"mb-3\">\n      <label for=\"exampleInputEmail1\" class=\"form-label\">Email address</label>\n      <input type=\"email\" class=\"form-control\" id=\"exampleInputEmail1\" aria-describedby=\"emailHelp\">\n      <div id=\"emailHelp\" class=\"form-text\">We'll never share your email with anyone else.</div>\n    </div>\n    <div class=\"mb-3\">\n      <label for=\"exampleInputPassword1\" class=\"form-label\">Password</label>\n      <input type=\"password\" class=\"form-control\" id=\"exampleInputPassword1\">\n    </div>\n    <div class=\"mb-3 form-check\">\n      <input type=\"checkbox\" class=\"form-check-input\" id=\"exampleCheck1\">\n      <label class=\"form-check-label\" for=\"exampleCheck1\">Check me out</label>\n    </div>\n    <button type=\"submit\" class=\"btn btn-primary\">Submit</button>\n  </form>`} />\n\n## Disabled forms\n\nAdd the `disabled` boolean attribute on an input to prevent user interactions and make it appear lighter.\n\n```html\n<input class=\"form-control\" id=\"disabledInput\" type=\"text\" placeholder=\"Disabled input here...\" disabled>\n```\n\nAdd the `disabled` attribute to a `<fieldset>` to disable all the controls within. Browsers treat all native form controls (`<input>`, `<select>`, and `<button>` elements) inside a `<fieldset disabled>` as disabled, preventing both keyboard and mouse interactions on them.\n\nHowever, if your form also includes custom button-like elements such as `<a class=\"btn btn-*\">...</a>`, these will only be given a style of `pointer-events: none`, meaning they are still focusable and operable using the keyboard. In this case, you must manually modify these controls by adding `tabindex=\"-1\"` to prevent them from receiving focus and `aria-disabled=\"disabled\"` to signal their state to assistive technologies.\n\n<Example code={`<form>\n    <fieldset disabled>\n      <legend>Disabled fieldset example</legend>\n      <div class=\"mb-3\">\n        <label for=\"disabledTextInput\" class=\"form-label\">Disabled input</label>\n        <input type=\"text\" id=\"disabledTextInput\" class=\"form-control\" placeholder=\"Disabled input\">\n      </div>\n      <div class=\"mb-3\">\n        <label for=\"disabledSelect\" class=\"form-label\">Disabled select menu</label>\n        <select id=\"disabledSelect\" class=\"form-select\">\n          <option>Disabled select</option>\n        </select>\n      </div>\n      <div class=\"mb-3\">\n        <div class=\"form-check\">\n          <input class=\"form-check-input\" type=\"checkbox\" id=\"disabledFieldsetCheck\" disabled>\n          <label class=\"form-check-label\" for=\"disabledFieldsetCheck\">\n            Can’t check this\n          </label>\n        </div>\n      </div>\n      <button type=\"submit\" class=\"btn btn-primary\">Submit</button>\n    </fieldset>\n  </form>`} />\n\n## Accessibility\n\nEnsure that all form controls have an appropriate accessible name so that their purpose can be conveyed to users of assistive technologies. The simplest way to achieve this is to use a `<label>` element, or—in the case of buttons—to include sufficiently descriptive text as part of the `<button>...</button>` content.\n\nFor situations where it’s not possible to include a visible `<label>` or appropriate text content, there are alternative ways of still providing an accessible name, such as:\n\n- `<label>` elements hidden using the `.visually-hidden` class\n- Pointing to an existing element that can act as a label using `aria-labelledby`\n- Providing a `title` attribute\n- Explicitly setting the accessible name on an element using `aria-label`\n\nIf none of these are present, assistive technologies may resort to using the `placeholder` attribute as a fallback for the accessible name on `<input>` and `<textarea>` elements. The examples in this section provide a few suggested, case-specific approaches.\n\nWhile using visually hidden content (`.visually-hidden`, `aria-label`, and even `placeholder` content, which disappears once a form field has content) will benefit assistive technology users, a lack of visible label text may still be problematic for certain users. Some form of visible label is generally the best approach, both for accessibility and usability.\n\n## CSS\n\nMany form variables are set at a general level to be re-used and extended by individual form components. You’ll see these most often as `$input-btn-*` and `$input-*` variables.\n\n### Sass variables\n\n`$input-btn-*` variables are shared global variables between our [buttons]([[docsref:/components/buttons]]) and our form components. You’ll find these frequently reassigned as values to other component-specific variables.\n\n<ScssDocs name=\"input-btn-variables\" file=\"scss/_variables.scss\" />\n"
  },
  {
    "path": "site/src/content/docs/forms/range.mdx",
    "content": "---\ntitle: Range\ndescription: Use our custom range inputs for consistent cross-browser styling and built-in customization.\ntoc: true\n---\n\n## Overview\n\nCreate custom `<input type=\"range\">` controls with `.form-range`. The track (the background) and thumb (the value) are both styled to appear the same across browsers. As only Firefox supports “filling” their track from the left or right of the thumb as a means to visually indicate progress, we do not currently support it.\n\n<Example code={`<label for=\"range1\" class=\"form-label\">Example range</label>\n<input type=\"range\" class=\"form-range\" id=\"range1\">`} />\n\n## Disabled\n\nAdd the `disabled` boolean attribute on an input to give it a grayed out appearance, remove pointer events, and prevent focusing.\n\n<Example code={`<label for=\"disabledRange\" class=\"form-label\">Disabled range</label>\n<input type=\"range\" class=\"form-range\" id=\"disabledRange\" disabled>`} />\n\n## Min and max\n\nRange inputs have implicit values for `min` and `max`—`0` and `100`, respectively. You may specify new values for those using the `min` and `max` attributes.\n\n<Example code={`<label for=\"range2\" class=\"form-label\">Example range</label>\n<input type=\"range\" class=\"form-range\" min=\"0\" max=\"5\" id=\"range2\">`} />\n\n## Steps\n\nBy default, range inputs “snap” to integer values. To change this, you can specify a `step` value. In the example below, we double the number of steps by using `step=\"0.5\"`.\n\n<Example code={`<label for=\"range3\" class=\"form-label\">Example range</label>\n<input type=\"range\" class=\"form-range\" min=\"0\" max=\"5\" step=\"0.5\" id=\"range3\">`} />\n\n## Output value\n\nThe value of the range input can be shown using the `output` element and a bit of JavaScript.\n\n<Example code={`<label for=\"range4\" class=\"form-label\">Example range</label>\n  <input type=\"range\" class=\"form-range\" min=\"0\" max=\"100\" value=\"50\" id=\"range4\">\n  <output for=\"range4\" id=\"rangeValue\" aria-hidden=\"true\"></output>\n\n  <script>\n    // This is an example script, please modify as needed\n    const rangeInput = document.getElementById('range4');\n    const rangeOutput = document.getElementById('rangeValue');\n\n    // Set initial value\n    rangeOutput.textContent = rangeInput.value;\n\n    rangeInput.addEventListener('input', function() {\n      rangeOutput.textContent = this.value;\n    });\n  </script>`} />\n\n## CSS\n\n### Sass variables\n\n<ScssDocs name=\"form-range-variables\" file=\"scss/_variables.scss\" />\n"
  },
  {
    "path": "site/src/content/docs/forms/select.mdx",
    "content": "---\ntitle: Select\ndescription: Customize the native `<select>`s with custom CSS that changes the element’s initial appearance.\ntoc: true\n---\n\n## Default\n\nCustom `<select>` menus need only a custom class, `.form-select` to trigger the custom styles. Custom styles are limited to the `<select>`’s initial appearance and cannot modify the `<option>`s due to browser limitations.\n\n<Example code={`<select class=\"form-select\" aria-label=\"Default select example\">\n    <option selected>Open this select menu</option>\n    <option value=\"1\">One</option>\n    <option value=\"2\">Two</option>\n    <option value=\"3\">Three</option>\n  </select>`} />\n\n## Sizing\n\nYou may also choose from small and large custom selects to match our similarly sized text inputs.\n\n<Example code={`<select class=\"form-select form-select-lg mb-3\" aria-label=\"Large select example\">\n    <option selected>Open this select menu</option>\n    <option value=\"1\">One</option>\n    <option value=\"2\">Two</option>\n    <option value=\"3\">Three</option>\n  </select>\n\n  <select class=\"form-select form-select-sm\" aria-label=\"Small select example\">\n    <option selected>Open this select menu</option>\n    <option value=\"1\">One</option>\n    <option value=\"2\">Two</option>\n    <option value=\"3\">Three</option>\n  </select>`} />\n\nThe `multiple` attribute is also supported:\n\n<Example code={`<select class=\"form-select\" multiple aria-label=\"Multiple select example\">\n    <option selected>Open this select menu</option>\n    <option value=\"1\">One</option>\n    <option value=\"2\">Two</option>\n    <option value=\"3\">Three</option>\n  </select>`} />\n\nAs is the `size` attribute:\n\n<Example code={`<select class=\"form-select\" size=\"3\" aria-label=\"Size 3 select example\">\n    <option selected>Open this select menu</option>\n    <option value=\"1\">One</option>\n    <option value=\"2\">Two</option>\n    <option value=\"3\">Three</option>\n  </select>`} />\n\n## Disabled\n\nAdd the `disabled` boolean attribute on a select to give it a grayed out appearance and remove pointer events.\n\n<Example code={`<select class=\"form-select\" aria-label=\"Disabled select example\" disabled>\n    <option selected>Open this select menu</option>\n    <option value=\"1\">One</option>\n    <option value=\"2\">Two</option>\n    <option value=\"3\">Three</option>\n  </select>`} />\n\n## CSS\n\n### Sass variables\n\n<ScssDocs name=\"form-select-variables\" file=\"scss/_variables.scss\" />\n"
  },
  {
    "path": "site/src/content/docs/forms/validation.mdx",
    "content": "---\ntitle: Validation\ndescription: Provide valuable, actionable feedback to your users with HTML5 form validation, via browser default behaviors or custom styles and JavaScript.\ntoc: true\nextra_js:\n  - src: \"[[docsref:/assets/js/validate-forms.js]]\"\n    async: true\n---\n\nimport { getDocsRelativePath } from '@libs/path'\n\n<Callout type=\"warning\">\nWe are aware that currently the client-side custom validation styles and tooltips are not accessible, since they are not exposed to assistive technologies. While we work on a solution, we’d recommend either using the server-side option or the default browser validation method.\n</Callout>\n\n## How it works\n\nHere’s how form validation works with Bootstrap:\n\n- HTML form validation is applied via CSS’s two pseudo-classes, `:invalid` and `:valid`. It applies to `<input>`, `<select>`, and `<textarea>` elements.\n- Bootstrap scopes the `:invalid` and `:valid` styles to parent `.was-validated` class, usually applied to the `<form>`. Otherwise, any required field without a value shows up as invalid on page load. This way, you may choose when to activate them (typically after form submission is attempted).\n- To reset the appearance of the form (for instance, in the case of dynamic form submissions using Ajax), remove the `.was-validated` class from the `<form>` again after submission.\n- As a fallback, `.is-invalid` and `.is-valid` classes may be used instead of the pseudo-classes for [server-side validation](#server-side). They do not require a `.was-validated` parent class.\n- Due to constraints in how CSS works, we cannot (at present) apply styles to a `<label>` that comes before a form control in the DOM without the help of custom JavaScript.\n- All modern browsers support the [constraint validation API](https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#the-constraint-validation-api), a series of JavaScript methods for validating form controls.\n- Feedback messages may utilize the [browser defaults](#browser-defaults) (different for each browser, and unstylable via CSS) or our custom feedback styles with additional HTML and CSS.\n- You may provide custom validity messages with `setCustomValidity` in JavaScript.\n\nWith that in mind, consider the following demos for our custom form validation styles, optional server-side classes, and browser defaults.\n\n## Custom styles\n\nFor custom Bootstrap form validation messages, you’ll need to add the `novalidate` boolean attribute to your `<form>`. This disables the browser default feedback tooltips, but still provides access to the form validation APIs in JavaScript. Try to submit the form below; our JavaScript will intercept the submit button and relay feedback to you. When attempting to submit, you’ll see the `:invalid` and `:valid` styles applied to your form controls.\n\nCustom feedback styles apply custom colors, borders, focus styles, and background icons to better communicate feedback. Background icons for `<select>`s are only available with `.form-select`, and not `.form-control`.\n\n<Example code={`<form class=\"row g-3 needs-validation\" novalidate>\n    <div class=\"col-md-4\">\n      <label for=\"validationCustom01\" class=\"form-label\">First name</label>\n      <input type=\"text\" class=\"form-control\" id=\"validationCustom01\" value=\"Mark\" required>\n      <div class=\"valid-feedback\">\n        Looks good!\n      </div>\n    </div>\n    <div class=\"col-md-4\">\n      <label for=\"validationCustom02\" class=\"form-label\">Last name</label>\n      <input type=\"text\" class=\"form-control\" id=\"validationCustom02\" value=\"Otto\" required>\n      <div class=\"valid-feedback\">\n        Looks good!\n      </div>\n    </div>\n    <div class=\"col-md-4\">\n      <label for=\"validationCustomUsername\" class=\"form-label\">Username</label>\n      <div class=\"input-group has-validation\">\n        <span class=\"input-group-text\" id=\"inputGroupPrepend\">@</span>\n        <input type=\"text\" class=\"form-control\" id=\"validationCustomUsername\" aria-describedby=\"inputGroupPrepend\" required>\n        <div class=\"invalid-feedback\">\n          Please choose a username.\n        </div>\n      </div>\n    </div>\n    <div class=\"col-md-6\">\n      <label for=\"validationCustom03\" class=\"form-label\">City</label>\n      <input type=\"text\" class=\"form-control\" id=\"validationCustom03\" required>\n      <div class=\"invalid-feedback\">\n        Please provide a valid city.\n      </div>\n    </div>\n    <div class=\"col-md-3\">\n      <label for=\"validationCustom04\" class=\"form-label\">State</label>\n      <select class=\"form-select\" id=\"validationCustom04\" required>\n        <option selected disabled value=\"\">Choose...</option>\n        <option>...</option>\n      </select>\n      <div class=\"invalid-feedback\">\n        Please select a valid state.\n      </div>\n    </div>\n    <div class=\"col-md-3\">\n      <label for=\"validationCustom05\" class=\"form-label\">Zip</label>\n      <input type=\"text\" class=\"form-control\" id=\"validationCustom05\" required>\n      <div class=\"invalid-feedback\">\n        Please provide a valid zip.\n      </div>\n    </div>\n    <div class=\"col-12\">\n      <div class=\"form-check\">\n        <input class=\"form-check-input\" type=\"checkbox\" value=\"\" id=\"invalidCheck\" required>\n        <label class=\"form-check-label\" for=\"invalidCheck\">\n          Agree to terms and conditions\n        </label>\n        <div class=\"invalid-feedback\">\n          You must agree before submitting.\n        </div>\n      </div>\n    </div>\n    <div class=\"col-12\">\n      <button class=\"btn btn-primary\" type=\"submit\">Submit form</button>\n    </div>\n  </form>`} />\n\n<Code containerClass=\"bd-example-snippet\" lang=\"js\" filePath={getDocsRelativePath('/static/docs/[version]/assets/js/validate-forms.js')} />\n\n## Browser defaults\n\nNot interested in custom validation feedback messages or writing JavaScript to change form behaviors? All good, you can use the browser defaults. Try submitting the form below. Depending on your browser and OS, you’ll see a slightly different style of feedback.\n\nWhile these feedback styles cannot be styled with CSS, you can still customize the feedback text through JavaScript.\n\n<Example code={`<form class=\"row g-3\">\n    <div class=\"col-md-4\">\n      <label for=\"validationDefault01\" class=\"form-label\">First name</label>\n      <input type=\"text\" class=\"form-control\" id=\"validationDefault01\" value=\"Mark\" required>\n    </div>\n    <div class=\"col-md-4\">\n      <label for=\"validationDefault02\" class=\"form-label\">Last name</label>\n      <input type=\"text\" class=\"form-control\" id=\"validationDefault02\" value=\"Otto\" required>\n    </div>\n    <div class=\"col-md-4\">\n      <label for=\"validationDefaultUsername\" class=\"form-label\">Username</label>\n      <div class=\"input-group\">\n        <span class=\"input-group-text\" id=\"inputGroupPrepend2\">@</span>\n        <input type=\"text\" class=\"form-control\" id=\"validationDefaultUsername\" aria-describedby=\"inputGroupPrepend2\" required>\n      </div>\n    </div>\n    <div class=\"col-md-6\">\n      <label for=\"validationDefault03\" class=\"form-label\">City</label>\n      <input type=\"text\" class=\"form-control\" id=\"validationDefault03\" required>\n    </div>\n    <div class=\"col-md-3\">\n      <label for=\"validationDefault04\" class=\"form-label\">State</label>\n      <select class=\"form-select\" id=\"validationDefault04\" required>\n        <option selected disabled value=\"\">Choose...</option>\n        <option>...</option>\n      </select>\n    </div>\n    <div class=\"col-md-3\">\n      <label for=\"validationDefault05\" class=\"form-label\">Zip</label>\n      <input type=\"text\" class=\"form-control\" id=\"validationDefault05\" required>\n    </div>\n    <div class=\"col-12\">\n      <div class=\"form-check\">\n        <input class=\"form-check-input\" type=\"checkbox\" value=\"\" id=\"invalidCheck2\" required>\n        <label class=\"form-check-label\" for=\"invalidCheck2\">\n          Agree to terms and conditions\n        </label>\n      </div>\n    </div>\n    <div class=\"col-12\">\n      <button class=\"btn btn-primary\" type=\"submit\">Submit form</button>\n    </div>\n  </form>`} />\n\n## Server-side\n\nWe recommend using client-side validation, but in case you require server-side validation, you can indicate invalid and valid form fields with `.is-invalid` and `.is-valid`. Note that `.invalid-feedback` is also supported with these classes.\n\nFor invalid fields, ensure that the invalid feedback/error message is associated with the relevant form field using `aria-describedby` (noting that this attribute allows more than one `id` to be referenced, in case the field already points to additional form text).\n\nTo fix [issues with border radius](https://github.com/twbs/bootstrap/issues/25110), input groups require an additional `.has-validation` class.\n\n<Example code={`<form class=\"row g-3\">\n    <div class=\"col-md-4\">\n      <label for=\"validationServer01\" class=\"form-label\">First name</label>\n      <input type=\"text\" class=\"form-control is-valid\" id=\"validationServer01\" value=\"Mark\" required>\n      <div class=\"valid-feedback\">\n        Looks good!\n      </div>\n    </div>\n    <div class=\"col-md-4\">\n      <label for=\"validationServer02\" class=\"form-label\">Last name</label>\n      <input type=\"text\" class=\"form-control is-valid\" id=\"validationServer02\" value=\"Otto\" required>\n      <div class=\"valid-feedback\">\n        Looks good!\n      </div>\n    </div>\n    <div class=\"col-md-4\">\n      <label for=\"validationServerUsername\" class=\"form-label\">Username</label>\n      <div class=\"input-group has-validation\">\n        <span class=\"input-group-text\" id=\"inputGroupPrepend3\">@</span>\n        <input type=\"text\" class=\"form-control is-invalid\" id=\"validationServerUsername\" aria-describedby=\"inputGroupPrepend3 validationServerUsernameFeedback\" required>\n        <div id=\"validationServerUsernameFeedback\" class=\"invalid-feedback\">\n          Please choose a username.\n        </div>\n      </div>\n    </div>\n    <div class=\"col-md-6\">\n      <label for=\"validationServer03\" class=\"form-label\">City</label>\n      <input type=\"text\" class=\"form-control is-invalid\" id=\"validationServer03\" aria-describedby=\"validationServer03Feedback\" required>\n      <div id=\"validationServer03Feedback\" class=\"invalid-feedback\">\n        Please provide a valid city.\n      </div>\n    </div>\n    <div class=\"col-md-3\">\n      <label for=\"validationServer04\" class=\"form-label\">State</label>\n      <select class=\"form-select is-invalid\" id=\"validationServer04\" aria-describedby=\"validationServer04Feedback\" required>\n        <option selected disabled value=\"\">Choose...</option>\n        <option>...</option>\n      </select>\n      <div id=\"validationServer04Feedback\" class=\"invalid-feedback\">\n        Please select a valid state.\n      </div>\n    </div>\n    <div class=\"col-md-3\">\n      <label for=\"validationServer05\" class=\"form-label\">Zip</label>\n      <input type=\"text\" class=\"form-control is-invalid\" id=\"validationServer05\" aria-describedby=\"validationServer05Feedback\" required>\n      <div id=\"validationServer05Feedback\" class=\"invalid-feedback\">\n        Please provide a valid zip.\n      </div>\n    </div>\n    <div class=\"col-12\">\n      <div class=\"form-check\">\n        <input class=\"form-check-input is-invalid\" type=\"checkbox\" value=\"\" id=\"invalidCheck3\" aria-describedby=\"invalidCheck3Feedback\" required>\n        <label class=\"form-check-label\" for=\"invalidCheck3\">\n          Agree to terms and conditions\n        </label>\n        <div id=\"invalidCheck3Feedback\" class=\"invalid-feedback\">\n          You must agree before submitting.\n        </div>\n      </div>\n    </div>\n    <div class=\"col-12\">\n      <button class=\"btn btn-primary\" type=\"submit\">Submit form</button>\n    </div>\n  </form>`} />\n\n## Supported elements\n\nValidation styles are available for the following form controls and components:\n\n- `<input>`s and `<textarea>`s with `.form-control` (including up to one `.form-control` in input groups)\n- `<select>`s with `.form-select`\n- `.form-check`s\n\n<Example code={`<form class=\"was-validated\">\n    <div class=\"mb-3\">\n      <label for=\"validationTextarea\" class=\"form-label\">Textarea</label>\n      <textarea class=\"form-control\" id=\"validationTextarea\" placeholder=\"Required example textarea\" required></textarea>\n      <div class=\"invalid-feedback\">\n        Please enter a message in the textarea.\n      </div>\n    </div>\n\n    <div class=\"form-check mb-3\">\n      <input type=\"checkbox\" class=\"form-check-input\" id=\"validationFormCheck1\" required>\n      <label class=\"form-check-label\" for=\"validationFormCheck1\">Check this checkbox</label>\n      <div class=\"invalid-feedback\">Example invalid feedback text</div>\n    </div>\n\n    <div class=\"form-check\">\n      <input type=\"radio\" class=\"form-check-input\" id=\"validationFormCheck2\" name=\"radio-stacked\" required>\n      <label class=\"form-check-label\" for=\"validationFormCheck2\">Toggle this radio</label>\n    </div>\n    <div class=\"form-check mb-3\">\n      <input type=\"radio\" class=\"form-check-input\" id=\"validationFormCheck3\" name=\"radio-stacked\" required>\n      <label class=\"form-check-label\" for=\"validationFormCheck3\">Or toggle this other radio</label>\n      <div class=\"invalid-feedback\">More example invalid feedback text</div>\n    </div>\n\n    <div class=\"mb-3\">\n      <select class=\"form-select\" required aria-label=\"select example\">\n        <option value=\"\">Open this select menu</option>\n        <option value=\"1\">One</option>\n        <option value=\"2\">Two</option>\n        <option value=\"3\">Three</option>\n      </select>\n      <div class=\"invalid-feedback\">Example invalid select feedback</div>\n    </div>\n\n    <div class=\"mb-3\">\n      <input type=\"file\" class=\"form-control\" aria-label=\"file example\" required>\n      <div class=\"invalid-feedback\">Example invalid form file feedback</div>\n    </div>\n\n    <div class=\"mb-3\">\n      <button class=\"btn btn-primary\" type=\"submit\" disabled>Submit form</button>\n    </div>\n  </form>`} />\n\n## Tooltips\n\nIf your form layout allows it, you can swap the `.{valid|invalid}-feedback` classes for `.{valid|invalid}-tooltip` classes to display validation feedback in a styled tooltip. Be sure to have a parent with `position: relative` on it for tooltip positioning. In the example below, our column classes have this already, but your project may require an alternative setup.\n\n<Example code={`<form class=\"row g-3 needs-validation\" novalidate>\n    <div class=\"col-md-4 position-relative\">\n      <label for=\"validationTooltip01\" class=\"form-label\">First name</label>\n      <input type=\"text\" class=\"form-control\" id=\"validationTooltip01\" value=\"Mark\" required>\n      <div class=\"valid-tooltip\">\n        Looks good!\n      </div>\n    </div>\n    <div class=\"col-md-4 position-relative\">\n      <label for=\"validationTooltip02\" class=\"form-label\">Last name</label>\n      <input type=\"text\" class=\"form-control\" id=\"validationTooltip02\" value=\"Otto\" required>\n      <div class=\"valid-tooltip\">\n        Looks good!\n      </div>\n    </div>\n    <div class=\"col-md-4 position-relative\">\n      <label for=\"validationTooltipUsername\" class=\"form-label\">Username</label>\n      <div class=\"input-group has-validation\">\n        <span class=\"input-group-text\" id=\"validationTooltipUsernamePrepend\">@</span>\n        <input type=\"text\" class=\"form-control\" id=\"validationTooltipUsername\" aria-describedby=\"validationTooltipUsernamePrepend\" required>\n        <div class=\"invalid-tooltip\">\n          Please choose a unique and valid username.\n        </div>\n      </div>\n    </div>\n    <div class=\"col-md-6 position-relative\">\n      <label for=\"validationTooltip03\" class=\"form-label\">City</label>\n      <input type=\"text\" class=\"form-control\" id=\"validationTooltip03\" required>\n      <div class=\"invalid-tooltip\">\n        Please provide a valid city.\n      </div>\n    </div>\n    <div class=\"col-md-3 position-relative\">\n      <label for=\"validationTooltip04\" class=\"form-label\">State</label>\n      <select class=\"form-select\" id=\"validationTooltip04\" required>\n        <option selected disabled value=\"\">Choose...</option>\n        <option>...</option>\n      </select>\n      <div class=\"invalid-tooltip\">\n        Please select a valid state.\n      </div>\n    </div>\n    <div class=\"col-md-3 position-relative\">\n      <label for=\"validationTooltip05\" class=\"form-label\">Zip</label>\n      <input type=\"text\" class=\"form-control\" id=\"validationTooltip05\" required>\n      <div class=\"invalid-tooltip\">\n        Please provide a valid zip.\n      </div>\n    </div>\n    <div class=\"col-12\">\n      <button class=\"btn btn-primary\" type=\"submit\">Submit form</button>\n    </div>\n  </form>`} />\n\n## CSS\n\n### Variables\n\n<AddedIn version=\"5.3.0\"/>\n\nAs part of Bootstrap’s evolving CSS variables approach, forms now use local CSS variables for validation for enhanced real-time customization. Values for the CSS variables are set via Sass, so Sass customization is still supported, too.\n\n<ScssDocs name=\"root-form-validation-variables\" file=\"scss/_root.scss\" />\n\nThese variables are also color mode adaptive, meaning they change color while in dark mode.\n\n### Sass variables\n\n<ScssDocs name=\"form-feedback-variables\" file=\"scss/_variables.scss\" />\n\n<ScssDocs name=\"form-validation-colors\" file=\"scss/_variables.scss\" />\n\n<ScssDocs name=\"form-validation-colors-dark\" file=\"scss/_variables-dark.scss\" />\n\n### Sass mixins\n\nTwo mixins are combined, through our [loop](#sass-loops), to generate our form validation feedback styles.\n\n<ScssDocs name=\"form-validation-mixins\" file=\"scss/mixins/_forms.scss\" />\n\n### Sass maps\n\nThis is the validation Sass map from `_variables.scss`. Override or extend this to generate different or additional states.\n\n<ScssDocs name=\"form-validation-states\" file=\"scss/_variables.scss\" />\n\nMaps of `$form-validation-states` can contain three optional parameters to override tooltips and focus styles.\n\n### Sass loops\n\nUsed to iterate over `$form-validation-states` map values to generate our validation styles. Any modifications to the above Sass map will be reflected in your compiled CSS via this loop.\n\n<ScssDocs name=\"form-validation-states-loop\" file=\"scss/forms/_validation.scss\" />\n\n### Customizing\n\nValidation states can be customized via Sass with the `$form-validation-states` map. Located in our `_variables.scss` file, this Sass map is how we generate the default `valid`/`invalid` validation states. Included is a nested map for customizing each state’s color, icon, tooltip color, and focus shadow. While no other states are supported by browsers, those using custom styles can easily add more complex form feedback.\n"
  },
  {
    "path": "site/src/content/docs/getting-started/accessibility.mdx",
    "content": "---\ntitle: Accessibility\ndescription: A brief overview of Bootstrap’s features and limitations for the creation of accessible content.\ntoc: true\n---\n\nBootstrap provides an easy-to-use framework of ready-made styles, layout tools, and interactive components, allowing developers to create websites and applications that are visually appealing, functionally rich, and accessible out of the box.\n\n## Overview and limitations\n\nThe overall accessibility of any project built with Bootstrap depends in large part on the author’s markup, additional styling, and scripting they’ve included. However, provided that these have been implemented correctly, it should be perfectly possible to create websites and applications with Bootstrap that fulfill [<abbr title=\"Web Content Accessibility Guidelines\">WCAG</abbr> 2.2](https://www.w3.org/TR/WCAG/) (A/AA/AAA), [Section 508](https://www.section508.gov/), and similar accessibility standards and requirements.\n\n### Structural markup\n\nBootstrap’s styling and layout can be applied to a wide range of markup structures. This documentation aims to provide developers with best practice examples to demonstrate the use of Bootstrap itself and illustrate appropriate semantic markup, including ways in which potential accessibility concerns can be addressed.\n\n### Interactive components\n\nBootstrap’s interactive components—such as modal dialogs, dropdown menus, and custom tooltips—are designed to work for touch, mouse, and keyboard users. Through the use of relevant [<abbr title=\"Web Accessibility Initiative\">WAI</abbr>-<abbr title=\"Accessible Rich Internet Applications\">ARIA</abbr>](https://www.w3.org/WAI/standards-guidelines/aria/) roles and attributes, these components should also be understandable and operable using assistive technologies (such as screen readers).\n\nBecause Bootstrap’s components are purposely designed to be fairly generic, authors may need to include further <abbr title=\"Accessible Rich Internet Applications\">ARIA</abbr> roles and attributes, as well as JavaScript behavior, to more accurately convey the precise nature and functionality of their component. This is usually noted in the documentation.\n\n### Color contrast\n\nSome combinations of colors that currently make up Bootstrap’s default palette—used throughout the framework for things such as button variations, alert variations, form validation indicators—may lead to *insufficient* color contrast (below the recommended [WCAG 2.2 text color contrast ratio of 4.5:1](https://www.w3.org/TR/WCAG/#contrast-minimum) and the [WCAG 2.2 non-text color contrast ratio of 3:1](https://www.w3.org/TR/WCAG/#non-text-contrast)), particularly when used against a light background. Authors are encouraged to test their specific uses of color and, where necessary, manually modify/extend these default colors to ensure adequate color contrast ratios.\n\n### Visually hidden content\n\nContent which should be visually hidden, but remain accessible to assistive technologies such as screen readers, can be styled using the `.visually-hidden` class. This can be useful in situations where additional visual information or cues (such as meaning denoted through the use of color) need to also be conveyed to non-visual users.\n\n```html\n<p class=\"text-danger\">\n  <span class=\"visually-hidden\">Danger: </span>\n  This action is not reversible\n</p>\n```\n\nFor visually hidden interactive controls, such as traditional “skip” links, use the `.visually-hidden-focusable` class. This will ensure that the control becomes visible once focused (for sighted keyboard users). **Watch out, compared to the equivalent `.sr-only` and `.sr-only-focusable` classes in past versions, Bootstrap 5’s `.visually-hidden-focusable` is a standalone class, and must not be used in combination with the `.visually-hidden` class.**\n\n```html\n<a class=\"visually-hidden-focusable\" href=\"#content\">Skip to main content</a>\n```\n\n### Reduced motion\n\nBootstrap includes support for the [`prefers-reduced-motion` media feature](https://www.w3.org/TR/mediaqueries-5/#prefers-reduced-motion). In browsers/environments that allow the user to specify their preference for reduced motion, most CSS transition effects in Bootstrap (for instance, when a modal dialog is opened or closed, or the sliding animation in carousels) will be disabled, and meaningful animations (such as spinners) will be slowed down.\n\nOn browsers that support `prefers-reduced-motion`, and where the user has *not* explicitly signaled that they’d prefer reduced motion (i.e. where `prefers-reduced-motion: no-preference`), Bootstrap enables smooth scrolling using the `scroll-behavior` property.\n\n## Additional resources\n\n- [Web Content Accessibility Guidelines (WCAG) 2.2](https://www.w3.org/TR/WCAG/)\n- [The A11Y Project](https://www.a11yproject.com/)\n- [MDN accessibility documentation](https://developer.mozilla.org/en-US/docs/Web/Accessibility)\n- [Color Contrast Analyser (CCA)](https://www.tpgi.com/color-contrast-checker/)\n- [\"HTML Codesniffer\" bookmarklet for identifying accessibility issues](https://github.com/squizlabs/HTML_CodeSniffer)\n- [Microsoft Accessibility Insights](https://accessibilityinsights.io/)\n- [Deque Axe testing tools](https://www.deque.com/axe/)\n- [Introduction to Web Accessibility](https://www.w3.org/WAI/fundamentals/accessibility-intro/)\n"
  },
  {
    "path": "site/src/content/docs/getting-started/best-practices.mdx",
    "content": "---\ntitle: Best practices\ndescription: Learn about some of the best practices we’ve gathered from years of working on and using Bootstrap.\n---\n\nWe’ve designed and developed Bootstrap to work in a number of environments. Here are some of the best practices we’ve gathered from years of working on and using it ourselves.\n\n<Callout>\n**Heads up!** This copy is a work in progress.\n</Callout>\n\n### General outline\n\n- Working with CSS\n- Working with Sass files\n- Building new CSS components\n- Working with flexbox\n- Ask in [our GitHub Discussions](https://github.com/twbs/bootstrap/discussions)\n"
  },
  {
    "path": "site/src/content/docs/getting-started/browsers-devices.mdx",
    "content": "---\ntitle: Browsers and devices\ndescription: Learn about the browsers and devices, from modern to old, that are supported by Bootstrap, including known quirks and bugs for each.\ntoc: true\n---\n\n## Supported browsers\n\nBootstrap supports the **latest, stable releases** of all major browsers and platforms.\n\nAlternative browsers which use the latest version of WebKit, Blink, or Gecko, whether directly or via the platform’s web view API, are not explicitly supported. However, Bootstrap should (in most cases) display and function correctly in these browsers as well. More specific support information is provided below.\n\nYou can find our supported range of browsers and their versions [in our `.browserslistrc file`]([[config:repo]]/blob/v[[config:current_version]]/.browserslistrc):\n\n<Code lang=\"plaintext\" filePath=\".browserslistrc\" />\n\nWe use [Autoprefixer](https://github.com/postcss/autoprefixer) to handle intended browser support via CSS prefixes, which uses [Browserslist](https://github.com/browserslist/browserslist) to manage these browser versions. Consult their documentation for how to integrate these tools into your projects.\n\n### Mobile devices\n\nGenerally speaking, Bootstrap supports the latest versions of each major platform’s default browsers. Note that proxy browsers (such as Opera Mini, Opera Mobile’s Turbo mode, UC Browser Mini, Amazon Silk) are not supported.\n\n<BsTable class=\"table\">\n| | Chrome | Firefox | Safari | Android Browser &amp; WebView |\n| --- | --- | --- | --- | --- |\n| **Android** | Supported | Supported | <span class=\"text-body-secondary\">&mdash;</span> | v6.0+ |\n| **iOS** | Supported | Supported | Supported | <span class=\"text-body-secondary\">&mdash;</span> |\n</BsTable>\n\n### Desktop browsers\n\nSimilarly, the latest versions of most desktop browsers are supported.\n\n<BsTable class=\"table\">\n| | Chrome | Firefox | Microsoft Edge | Opera | Safari |\n| --- | --- | --- | --- | --- | --- |\n| **Mac** | Supported | Supported | Supported | Supported | Supported |\n| **Windows** | Supported | Supported | Supported | Supported | <span class=\"text-body-secondary\">&mdash;</span> |\n</BsTable>\n\nFor Firefox, in addition to the latest normal stable release, we also support the latest [Extended Support Release (ESR)](https://www.mozilla.org/en-US/firefox/enterprise/) version of Firefox.\n\nUnofficially, Bootstrap should look and behave well enough in Chromium and Chrome for Linux, and Firefox for Linux, though they are not officially supported.\n\n## Internet Explorer\n\nInternet Explorer is not supported. **If you require Internet Explorer support, please use Bootstrap v4.**\n\n## Modals and dropdowns on mobile\n\n### Overflow and scrolling\n\nSupport for `overflow: hidden;` on the `<body>` element is quite limited in iOS and Android. To that end, when you scroll past the top or bottom of a modal in either of those devices’ browsers, the `<body>` content will begin to scroll. See [Chrome bug #175502](https://issues.chromium.org/issues/40301599) (fixed in Chrome v40) and [WebKit bug #153852](https://bugs.webkit.org/show_bug.cgi?id=153852).\n\n### iOS text fields and scrolling\n\nAs of iOS 9.2, while a modal is open, if the initial touch of a scroll gesture is within the boundary of a textual `<input>` or a `<textarea>`, the `<body>` content underneath the modal will be scrolled instead of the modal itself. See [WebKit bug #153856](https://bugs.webkit.org/show_bug.cgi?id=153856).\n\n### Navbar Dropdowns\n\nThe `.dropdown-backdrop` element isn’t used on iOS in the nav because of the complexity of z-indexing. Thus, to close dropdowns in navbars, you must directly click the dropdown element (or [any other element which will fire a click event in iOS](https://developer.mozilla.org/en-US/docs/Web/API/Element/click_event#Safari_Mobile)).\n\n## Browser zooming\n\nPage zooming inevitably presents rendering artifacts in some components, both in Bootstrap and the rest of the web. Depending on the issue, we may be able to fix it (search first and then open an issue if need be). However, we tend to ignore these as they often have no direct solution other than hacky workarounds.\n\n## Validators\n\nIn order to provide the best possible experience to old and buggy browsers, Bootstrap uses [CSS browser hacks](http://browserhacks.com/) in several places to target special CSS to certain browser versions in order to work around bugs in the browsers themselves. These hacks understandably cause CSS validators to complain that they are invalid. In a couple places, we also use bleeding-edge CSS features that aren’t yet fully standardized, but these are used purely for progressive enhancement.\n\nThese validation warnings don’t matter in practice since the non-hacky portion of our CSS does fully validate and the hacky portions don’t interfere with the proper functioning of the non-hacky portion, hence why we deliberately ignore these particular warnings.\n\nOur HTML docs likewise have some trivial and inconsequential HTML validation warnings due to our inclusion of a workaround for [a certain Firefox bug](https://bugzilla.mozilla.org/show_bug.cgi?id=654072).\n"
  },
  {
    "path": "site/src/content/docs/getting-started/contents.mdx",
    "content": "---\ntitle: Contents\ndescription: Discover what’s included in Bootstrap, including our compiled and source code flavors.\ntoc: true\n\n# TODO: possible to replace the tree by something like https://docs.astro.build/en/guides/content-collections/#what-are-content-collections?\n---\n\n## Compiled Bootstrap\n\nOnce downloaded, unzip the compressed folder and you’ll see something like this:\n\n{/* NOTE: This info is intentionally duplicated in the README. Copy any changes made here over to the README too, but be sure to keep in mind to add the `dist` folder. */}\n\n```text\nbootstrap/\n├── css/\n│   ├── bootstrap-grid.css\n│   ├── bootstrap-grid.css.map\n│   ├── bootstrap-grid.min.css\n│   ├── bootstrap-grid.min.css.map\n│   ├── bootstrap-grid.rtl.css\n│   ├── bootstrap-grid.rtl.css.map\n│   ├── bootstrap-grid.rtl.min.css\n│   ├── bootstrap-grid.rtl.min.css.map\n│   ├── bootstrap-reboot.css\n│   ├── bootstrap-reboot.css.map\n│   ├── bootstrap-reboot.min.css\n│   ├── bootstrap-reboot.min.css.map\n│   ├── bootstrap-reboot.rtl.css\n│   ├── bootstrap-reboot.rtl.css.map\n│   ├── bootstrap-reboot.rtl.min.css\n│   ├── bootstrap-reboot.rtl.min.css.map\n│   ├── bootstrap-utilities.css\n│   ├── bootstrap-utilities.css.map\n│   ├── bootstrap-utilities.min.css\n│   ├── bootstrap-utilities.min.css.map\n│   ├── bootstrap-utilities.rtl.css\n│   ├── bootstrap-utilities.rtl.css.map\n│   ├── bootstrap-utilities.rtl.min.css\n│   ├── bootstrap-utilities.rtl.min.css.map\n│   ├── bootstrap.css\n│   ├── bootstrap.css.map\n│   ├── bootstrap.min.css\n│   ├── bootstrap.min.css.map\n│   ├── bootstrap.rtl.css\n│   ├── bootstrap.rtl.css.map\n│   ├── bootstrap.rtl.min.css\n│   └── bootstrap.rtl.min.css.map\n└── js/\n    ├── bootstrap.bundle.js\n    ├── bootstrap.bundle.js.map\n    ├── bootstrap.bundle.min.js\n    ├── bootstrap.bundle.min.js.map\n    ├── bootstrap.esm.js\n    ├── bootstrap.esm.js.map\n    ├── bootstrap.esm.min.js\n    ├── bootstrap.esm.min.js.map\n    ├── bootstrap.js\n    ├── bootstrap.js.map\n    ├── bootstrap.min.js\n    └── bootstrap.min.js.map\n```\n\nThis is the most basic form of Bootstrap: compiled files for quick drop-in usage in nearly any web project. We provide compiled CSS and JS (`bootstrap.*`), as well as compiled and minified CSS and JS (`bootstrap.min.*`). [Source maps](https://web.dev/articles/source-maps) (`bootstrap.*.map`) are available for use with certain browsers’ developer tools. Bundled JS files (`bootstrap.bundle.js` and minified `bootstrap.bundle.min.js`) include [Popper](https://popper.js.org/docs/v2/).\n\n### CSS files\n\nBootstrap includes a handful of options for including some or all of our compiled CSS.\n\n<BsTable class=\"table\">\n| CSS files | Layout | Content | Components | Utilities |\n| --- | --- | --- | --- | --- |\n| `bootstrap.css`<br/> `bootstrap.min.css`<br/> `bootstrap.rtl.css`<br/> `bootstrap.rtl.min.css` | Included | Included | Included | Included |\n| `bootstrap-grid.css`<br/> `bootstrap-grid.rtl.css`<br/> `bootstrap-grid.min.css`<br/> `bootstrap-grid.rtl.min.css` | [Only grid system]([[docsref:/layout/grid]]) | — | — | [Only flex utilities]([[docsref:/utilities/flex]]) |\n| `bootstrap-utilities.css`<br/> `bootstrap-utilities.rtl.css`<br/> `bootstrap-utilities.min.css`<br/> `bootstrap-utilities.rtl.min.css` | — | — | — | Included |\n| `bootstrap-reboot.css`<br/> `bootstrap-reboot.rtl.css`<br/> `bootstrap-reboot.min.css`<br/> `bootstrap-reboot.rtl.min.css` | — | [Only Reboot]([[docsref:/content/reboot]]) | — | — |\n</BsTable>\n\n### JS files\n\nSimilarly, we have options for including some or all of our compiled JavaScript.\n\n<BsTable class=\"table\">\n| JS Files | Popper |\n| --- | --- |\n| `bootstrap.bundle.js`<br/> `bootstrap.bundle.min.js`<br/> | Included |\n| `bootstrap.js`<br/> `bootstrap.min.js`<br/> | – |\n</BsTable>\n\n## Bootstrap source code\n\nThe Bootstrap source code download includes the compiled CSS and JavaScript assets, along with source Sass, JavaScript, and documentation. More specifically, it includes the following and more:\n\n```text\nbootstrap/\n├── dist/\n│   ├── css/\n│   └── js/\n├── site/\n│   └──content/\n│      └── docs/\n│          └── [[config:docs_version]]/\n│              └── examples/\n├── js/\n└── scss/\n```\n\nThe `scss/` and `js/` are the source code for our CSS and JavaScript. The `dist/` folder includes everything listed in the compiled download section above. The `site/content/docs/` folder includes the source code for our hosted documentation, including our live examples of Bootstrap usage.\n\nBeyond that, any other included file provides support for packages, license information, and development.\n"
  },
  {
    "path": "site/src/content/docs/getting-started/contribute.mdx",
    "content": "---\ntitle: Contribute\ndescription: Help develop Bootstrap with our documentation build scripts and tests.\ntoc: true\naliases: \"/docs/[[config:docs_version]]/getting-started/build-tools/\"\nadded:\n  show_badge: false\n  version: \"5.1\"\n---\n## Tooling setup\n\nBootstrap uses [npm scripts](https://docs.npmjs.com/misc/scripts/) to build the documentation and compile source files. Our [package.json]([[config:repo]]/blob/v[[config:current_version]]/package.json) houses these scripts for compiling code, running tests, and more. These aren’t intended for use outside our repository and documentation.\n\nTo use our build system and run our documentation locally, you’ll need a copy of Bootstrap’s source files and Node. Follow these steps and you should be ready to rock:\n\n1. [Download and install Node.js](https://nodejs.org/en/download/), which we use to manage our dependencies.\n2. Either [download Bootstrap’s sources]([[config:download.source]]) or fork and clone [Bootstrap’s repository]([[config:repo]]).\n3. Navigate to the root `/bootstrap` directory and run `npm install` to install our local dependencies listed in [package.json]([[config:repo]]/blob/v[[config:current_version]]/package.json).\n\nWhen completed, you’ll be able to run the various commands provided from the command line.\n\n## Using npm scripts\n\nOur [package.json]([[config:repo]]/blob/v[[config:current_version]]/package.json) includes numerous tasks for developing the project. Run `npm run` to see all the npm scripts in your terminal. **Primary tasks include:**\n\n<BsTable>\n| Task | Description |\n| --- | --- |\n| `npm start` | Compiles CSS and JavaScript, builds the documentation, and starts a local server. |\n| `npm run dist` | Creates the `dist/` directory with compiled files. Uses [Sass](https://sass-lang.com/), [Autoprefixer](https://github.com/postcss/autoprefixer), and [terser](https://github.com/terser/terser). |\n| `npm test` | Runs tests locally after running `npm run dist` |\n| `npm run docs-serve` | Builds and runs the documentation locally. |\n</BsTable>\n\n<Callout name=\"info-npm-starter\" />\n\n## Sass\n\nBootstrap uses [Dart Sass](https://sass-lang.com/dart-sass/) for compiling our Sass source files into CSS files (included in our build process), and we recommend you do the same if you’re compiling Sass using your own asset pipeline. We previously used Node Sass for Bootstrap v4, but LibSass and packages built on top of it, including Node Sass, are now [deprecated](https://sass-lang.com/blog/libsass-is-deprecated/).\n\nDart Sass uses a rounding precision of 10 and for efficiency reasons does not allow adjustment of this value. We don’t lower this precision during further processing of our generated CSS, such as during minification, but if you chose to do so we recommend maintaining a precision of at least 6 to prevent issues with browser rounding.\n\n## Autoprefixer\n\nBootstrap uses [Autoprefixer](https://github.com/postcss/autoprefixer) (included in our build process) to automatically add vendor prefixes to some CSS properties at build time. Doing so saves us time and code by allowing us to write key parts of our CSS a single time while eliminating the need for vendor mixins like those found in v3.\n\nWe maintain the list of browsers supported through Autoprefixer in a separate file within our GitHub repository. See [.browserslistrc]([[config:repo]]/blob/v[[config:current_version]]/.browserslistrc) for details.\n\n## RTLCSS\n\nBootstrap uses [RTLCSS](https://rtlcss.com/) to process compiled CSS and convert them to RTL – basically replacing horizontal direction aware properties (e.g. `padding-left`) with their opposite. It allows us only write our CSS a single time and make minor tweaks using RTLCSS [control](https://rtlcss.com/learn/usage-guide/control-directives/) and [value](https://rtlcss.com/learn/usage-guide/value-directives/) directives.\n\n## Local documentation\n\nRunning our documentation locally requires the use of Astro. Astro is a modern static site generator that allows us to build our documentation with a combination of Markdown and React components. Here’s how to get it started:\n\n1. Run through the [tooling setup](#tooling-setup) above to install all dependencies.\n2. From the root `/bootstrap` directory, run `npm run docs-serve` in the command line.\n3. Open http://localhost:9001 in your browser, and voilà.\n\nLearn more about using Astro by reading its [documentation](https://docs.astro.build/en/getting-started/).\n\n## Troubleshooting\n\nShould you encounter problems with installing dependencies, uninstall all previous dependency versions (global and local). Then, rerun `npm install`.\n"
  },
  {
    "path": "site/src/content/docs/getting-started/download.mdx",
    "content": "---\ntitle: Download\ndescription: Download Bootstrap to get the compiled CSS and JavaScript, source code, or include it with your favorite package managers like npm, RubyGems, and more.\ntoc: true\n---\n\n## Compiled CSS and JS\n\nDownload ready-to-use compiled code for **Bootstrap v[[config:current_version]]** to easily drop into your project, which includes:\n\n- Compiled and minified CSS bundles (see [CSS files comparison]([[docsref:/getting-started/contents#css-files]]))\n- Compiled and minified JavaScript plugins (see [JS files comparison]([[docsref:/getting-started/contents#js-files]]))\n\nThis doesn’t include documentation, source files, or any optional JavaScript dependencies like Popper.\n\n<a href=\"[[config:download.dist]]\" class=\"btn btn-bd-primary\">Download</a>\n\n## Source files\n\nCompile Bootstrap with your own asset pipeline by downloading our source Sass, JavaScript, and documentation files. This option requires some additional tooling:\n\n- [Sass compiler]([[docsref:/getting-started/contribute#sass]]) for compiling Sass source files into CSS files\n- [Autoprefixer](https://github.com/postcss/autoprefixer) for CSS vendor prefixing\n\nShould you require our full set of [build tools]([[docsref:/getting-started/contribute#tooling-setup]]), they are included for developing Bootstrap and its docs, but they’re likely unsuitable for your own purposes.\n\n<a href=\"[[config:download.source]]\" class=\"btn btn-bd-primary\">Download source</a>\n\n## Examples\n\nIf you want to download and examine our [examples]([[docsref:/examples]]), you can grab the already built examples:\n\n<a href=\"[[config:download.dist_examples]]\" class=\"btn btn-bd-primary\">Download Examples</a>\n\n## CDN via jsDelivr\n\nSkip the download with [jsDelivr](https://www.jsdelivr.com/) to deliver cached version of Bootstrap’s compiled CSS and JS to your project.\n\n```html\n<link href=\"[[config:cdn.css]]\" rel=\"stylesheet\" integrity=\"[[config:cdn.css_hash]]\" crossorigin=\"anonymous\">\n<script src=\"[[config:cdn.js_bundle]]\" integrity=\"[[config:cdn.js_bundle_hash]]\" crossorigin=\"anonymous\"></script>\n```\n\nIf you’re using our compiled JavaScript and prefer to include Popper separately, add Popper before our JS, via a CDN preferably.\n\n```html\n<script src=\"[[config:cdn.popper]]\" integrity=\"[[config:cdn.popper_hash]]\" crossorigin=\"anonymous\"></script>\n<script src=\"[[config:cdn.js]]\" integrity=\"[[config:cdn.js_hash]]\" crossorigin=\"anonymous\"></script>\n```\n\n### Alternative CDNs\n\nWe recommend [jsDelivr](https://www.jsdelivr.com/) and use it ourselves in our documentation. However, in some cases—like in some specific countries or environments—you may need to use other CDN providers like [cdnjs](https://cdnjs.com/) or [unpkg](https://unpkg.com/).\n\nYou’ll find the same files on these CDN providers, albeit with different URLs. With cdnjs, you can [use this direct Bootstrap package link](https://cdnjs.com/libraries/bootstrap) to copy and paste ready-to-use HTML snippets for each dist file from any version of Bootstrap.\n\n<Callout type=\"warning\">\n**If the SRI hashes differ for a given file, you shouldn’t use the files from that CDN, because it means that the file was modified by someone else.**\n</Callout>\n\nNote that you should compare same length hashes, e.g. `sha384` with `sha384`, otherwise it’s expected for them to be different.\nAs such, you can use an online tool like [SRI Hash Generator](https://www.srihash.org/) to make sure that the hashes are the same for a given file.\nAlternatively, assuming you have OpenSSL installed, you can achieve the same from the CLI, for example:\n\n```sh\nopenssl dgst -sha384 -binary bootstrap.min.js | openssl base64 -A\n```\n\n## Package managers\n\nPull in Bootstrap’s **source files** into nearly any project with some of the most popular package managers. No matter the package manager, Bootstrap will **require a [Sass compiler]([[docsref:/getting-started/contribute#sass]]) and [Autoprefixer](https://github.com/postcss/autoprefixer)** for a setup that matches our official compiled versions.\n\n### npm\n\nInstall Bootstrap in your Node.js powered apps with [the npm package](https://www.npmjs.com/package/bootstrap):\n\n```sh\nnpm install bootstrap@[[config:current_version]]\n```\n\n`const bootstrap = require('bootstrap')` or `import bootstrap from 'bootstrap'` will load all of Bootstrap’s plugins onto a `bootstrap` object.\nThe `bootstrap` module itself exports all of our plugins. You can manually load Bootstrap’s plugins individually by loading the `/js/dist/*.js` files under the package’s top-level directory.\n\nBootstrap’s `package.json` contains some additional metadata under the following keys:\n\n- `sass` - path to Bootstrap’s main [Sass](https://sass-lang.com/) source file\n- `style` - path to Bootstrap’s non-minified CSS that’s been compiled using the default settings (no customization)\n\n<Callout name=\"info-npm-starter\" />\n\n### yarn\n\nInstall Bootstrap in your Node.js powered apps with [the yarn package](https://yarnpkg.com/en/package/bootstrap):\n\n```sh\nyarn add bootstrap@[[config:current_version]]\n```\n\n<Callout type=\"warning\">\n**Yarn 2+ (aka Yarn Berry) doesn’t support the `node_modules` directory by default**: using our [Sass & JS example](https://github.com/twbs/examples/tree/main/sass-js) needs some adjustments:\n\n```sh\nyarn config set nodeLinker node-modules # Use the node_modules linker\ntouch yarn.lock # Create an empty yarn.lock file\nyarn install # Install the dependencies\nyarn start # Start the project\n```\n</Callout>\n\n### Bun\n\nInstall Bootstrap in your Bun or Node.js powered apps with [the Bun CLI](https://bun.sh/):\n\n```sh\nbun add bootstrap@[[config:current_version]]\n```\n\n### RubyGems\n\nInstall Bootstrap in your Ruby apps using [Bundler](https://bundler.io/) (**recommended**) and [RubyGems](https://rubygems.org/) by adding the following line to your [`Gemfile`](https://bundler.io/guides/gemfile.html):\n\n```ruby\ngem 'bootstrap', '~> [[config:current_ruby_version]]'\n```\n\nAlternatively, if you’re not using Bundler, you can install the gem by running this command:\n\n```sh\ngem install bootstrap -v [[config:current_ruby_version]]\n```\n\n[See the gem’s README](https://github.com/twbs/bootstrap-rubygem/blob/main/README.md) for further details.\n\n### Composer\n\nYou can also install and manage Bootstrap’s Sass and JavaScript using [Composer](https://getcomposer.org/):\n\n```sh\ncomposer require twbs/bootstrap:[[config:current_version]]\n```\n\n### NuGet\n\nIf you develop in .NET Framework, you can also install and manage Bootstrap’s [CSS](https://www.nuget.org/packages/bootstrap/) or [Sass](https://www.nuget.org/packages/bootstrap.sass/) and JavaScript using [NuGet](https://www.nuget.org/). Newer projects should use [libman](https://learn.microsoft.com/en-us/aspnet/core/client-side/libman/) or another method as NuGet is designed for compiled code, not frontend assets.\n\n```powershell\nInstall-Package bootstrap\n```\n\n```powershell\nInstall-Package bootstrap.sass\n```\n\n## IntelliSense extension\n\n<img class=\"d-block mb-4 img-fluid rounded-3\" src=\"/docs/[[config:docs_version]]/assets/img/bootstrap-intellisense-autocomplete.png\" width=\"573\" height=\"332\" alt=\"\" />\n\nInstall the community-maintained [IntelliSense extension](https://marketplace.visualstudio.com/items?itemName=hossaini.bootstrap-intellisense) for Visual Studio Code to get IntelliSense auto-completion for Bootstrap classes.\n\n<a href=\"https://marketplace.visualstudio.com/items?itemName=hossaini.bootstrap-intellisense\" class=\"btn btn-bd-primary\">View in VS Code Marketplace</a>\n"
  },
  {
    "path": "site/src/content/docs/getting-started/introduction.mdx",
    "content": "---\ntitle: Get started with Bootstrap\ndescription: Bootstrap is a powerful, feature-packed frontend toolkit. Build anything—from prototype to production—in minutes.\naliases:\n - \"/docs/[[config:docs_version]]/getting-started/\"\n - \"/docs/getting-started/\"\n - \"/getting-started/\"\ntoc: true\n---\n\n## Quick start\n\nGet started by including Bootstrap’s production-ready CSS and JavaScript via CDN without the need for any build steps. See it in practice with this [Bootstrap CodePen demo](https://codepen.io/team/bootstrap/pen/qBamdLj).\n\n<br/>\n\n1. **Create a new `index.html` file in your project root.** Include the `<meta name=\"viewport\">` tag as well for [proper responsive behavior](https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/meta/name/viewport) in mobile devices.\n\n   ```html\n   <!doctype html>\n   <html lang=\"en\">\n     <head>\n       <meta charset=\"utf-8\">\n       <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n       <title>Bootstrap demo</title>\n     </head>\n     <body>\n       <h1>Hello, world!</h1>\n     </body>\n   </html>\n   ```\n\n2. **Include Bootstrap’s CSS and JS.** Place the `<link>` tag in the `<head>` for our CSS, and the `<script>` tag for our JavaScript bundle (including Popper for positioning dropdowns, popovers, and tooltips) before the closing `</body>`. Learn more about our [CDN links](#cdn-links).\n\n   ```html\n   <!doctype html>\n   <html lang=\"en\">\n     <head>\n       <meta charset=\"utf-8\">\n       <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n       <title>Bootstrap demo</title>\n       <link href=\"[[config:cdn.css]]\" rel=\"stylesheet\" integrity=\"[[config:cdn.css_hash]]\" crossorigin=\"anonymous\">\n     </head>\n     <body>\n       <h1>Hello, world!</h1>\n       <script src=\"[[config:cdn.js_bundle]]\" integrity=\"[[config:cdn.js_bundle_hash]]\" crossorigin=\"anonymous\"></script>\n     </body>\n   </html>\n   ```\n\n   You can also include [Popper](https://popper.js.org/docs/v2/) and our JS separately. If you don’t plan to use dropdowns, popovers, or tooltips, save some kilobytes by not including Popper.\n\n   ```html\n   <script src=\"[[config:cdn.popper]]\" integrity=\"[[config:cdn.popper_hash]]\" crossorigin=\"anonymous\"></script>\n   <script src=\"[[config:cdn.js]]\" integrity=\"[[config:cdn.js_hash]]\" crossorigin=\"anonymous\"></script>\n   ```\n\n3. **Hello, world!** Open the page in your browser of choice to see your Bootstrapped page. Now you can start building with Bootstrap by creating your own [layout]([[docsref:/layout/grid]]), adding dozens of [components]([[docsref:/components/buttons]]), and utilizing [our official examples]([[docsref:/examples]]).\n\n## CDN links\n\nAs reference, here are our primary CDN links.\n\n<BsTable>\n| Description | URL |\n| --- | --- |\n| CSS | `[[config:cdn.css]]` |\n| JS | `[[config:cdn.js_bundle]]` |\n</BsTable>\n\nYou can also use the CDN to fetch any of our [additional builds listed in the Contents page]([[docsref:/getting-started/contents]]).\n\nWhen using CDN links, be sure to use the `integrity` attribute to verify the correct files and versions. These hashes are unique to each file and version of Bootstrap, so when you update to a new version, be sure the `integrity` attribute is also updated.\n\nWe also include a `crossorigin=\"anonymous\"` attribute to prevent [CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) errors.\n\n## Next steps\n\n- Read a bit more about some [important global environment settings](#important-globals) that Bootstrap utilizes.\n- Read about what’s included in Bootstrap in our [contents section]([[docsref:/getting-started/contents/]]) and the list of [components that require JavaScript](#js-components) below.\n- Need a little more power? Consider building with Bootstrap by [including the source files via package manager]([[docsref:/getting-started/download#package-managers]]).\n- Looking to use Bootstrap as a module with `<script type=\"module\">`? Please refer to our [using Bootstrap as a module]([[docsref:/getting-started/javascript#using-bootstrap-as-a-module]]) section.\n\n## JS components\n\nCurious which components explicitly require our JavaScript and Popper? If you’re at all unsure about the general page structure, keep reading for an example page template.\n\n- Accordions for extending our Collapse plugin\n- Alerts for dismissing\n- Buttons for toggling states and checkbox/radio functionality\n- Carousel for all slide behaviors, controls, and indicators\n- Collapse for toggling visibility of content\n- Dropdowns for displaying and positioning (also requires [Popper](https://popper.js.org/docs/v2/))\n- Modals for displaying, positioning, and scroll behavior\n- Navbar for extending our Collapse and Offcanvas plugins to implement responsive behaviors\n- Navs with the Tab plugin for toggling content panes\n- Offcanvases for displaying, positioning, and scroll behavior\n- Scrollspy for scroll behavior and navigation updates\n- Toasts for displaying and dismissing\n- Tooltips and popovers for displaying and positioning (also requires [Popper](https://popper.js.org/docs/v2/))\n\n## Important globals\n\nBootstrap employs a handful of important global styles and settings, all of which are almost exclusively geared towards the *normalization* of cross browser styles. Let’s dive in.\n\n### HTML5 doctype\n\nBootstrap requires the use of the HTML5 doctype. Without it, you’ll see some funky and incomplete styling.\n\n```html\n<!doctype html>\n<html lang=\"en\">\n  ...\n</html>\n```\n\n### Viewport meta\n\nBootstrap is developed *mobile first*, a strategy in which we optimize code for mobile devices first and then scale up components as necessary using CSS media queries. To ensure proper rendering and touch zooming for all devices, add the responsive viewport meta tag to your `<head>`.\n\n```html\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n```\n\nYou can see an example of this in action in the [quick start](#quick-start).\n\n### Box-sizing\n\nFor more straightforward sizing in CSS, we switch the global `box-sizing` value from `content-box` to `border-box`. This ensures `padding` does not affect the final computed width of an element, but it can cause problems with some third-party software like Google Maps and Google Custom Search Engine.\n\nOn the rare occasion you need to override it, use something like the following:\n\n```css\n.selector-for-some-widget {\n  box-sizing: content-box;\n}\n```\n\nWith the above snippet, nested elements—including generated content via `::before` and `::after`—will all inherit the specified `box-sizing` for that `.selector-for-some-widget`.\n\nLearn more about [box model and sizing at CSS Tricks](https://css-tricks.com/box-sizing/).\n\n### Reboot\n\nFor improved cross-browser rendering, we use [Reboot]([[docsref:/content/reboot]]) to correct inconsistencies across browsers and devices while providing slightly more opinionated resets to common HTML elements.\n\n## Community\n\nStay up-to-date on the development of Bootstrap and reach out to the community with these helpful resources.\n\n- Read and subscribe to [The Official Bootstrap Blog]([[config:blog]]).\n- Ask questions and explore [our GitHub Discussions](https://github.com/twbs/bootstrap/discussions).\n- Discuss, ask questions, and more on [the community Discord](https://discord.gg/bZUvakRU3M) or [Bootstrap subreddit](https://www.reddit.com/r/bootstrap/).\n- Chat with fellow Bootstrappers in IRC. On the `irc.libera.chat` server, in the `#bootstrap` channel.\n- Implementation help may be found at Stack Overflow (tagged [`bootstrap-5`](https://stackoverflow.com/questions/tagged/bootstrap-5)).\n- Developers should use the keyword `bootstrap` on packages that modify or add to the functionality of Bootstrap when distributing through [npm](https://www.npmjs.com/search?q=keywords:bootstrap) or similar delivery mechanisms for maximum discoverability.\n\nYou can also follow [@getbootstrap on X](https://x.com/[[config:x]]) for the latest gossip and awesome music videos.\n"
  },
  {
    "path": "site/src/content/docs/getting-started/javascript.mdx",
    "content": "---\ntitle: JavaScript\ndescription: Bring Bootstrap to life with our optional JavaScript plugins. Learn about each plugin, our data and programmatic API options, and more.\ntoc: true\n---\n\n## Individual or compiled\n\nPlugins can be included individually (using Bootstrap’s individual `js/dist/*.js`), or all at once using `bootstrap.js` or the minified `bootstrap.min.js` (don’t include both).\n\nIf you use a bundler (Webpack, Parcel, Vite…), you can use `/js/dist/*.js` files which are UMD ready.\n\n## Usage with JavaScript frameworks\n\nWhile the Bootstrap CSS can be used with any framework, **the Bootstrap JavaScript is not fully compatible with JavaScript frameworks like React, Vue, and Angular** which assume full knowledge of the DOM. Both Bootstrap and the framework may attempt to mutate the same DOM element, resulting in bugs like dropdowns that are stuck in the “open” position.\n\nA better alternative for those using this type of frameworks is to use a framework-specific package **instead of** the Bootstrap JavaScript. Here are some of the most popular options:\n\n- React: [React Bootstrap](https://react-bootstrap.github.io/)\n  <Callout>\n  **Try it yourself!** Download the source code and working demo for using Bootstrap with React, Next.js, and React Bootstrap from the [twbs/examples repository](https://github.com/twbs/examples/tree/main/react-nextjs). You can also [open the example in StackBlitz](https://stackblitz.com/github/twbs/examples/tree/main/react-nextjs?file=src%2Fpages%2Findex.tsx).\n  </Callout>\n- Vue: [BootstrapVue](https://bootstrap-vue.org/) (Bootstrap 4)\n- Vue 3: [BootstrapVueNext](https://bootstrap-vue-next.github.io/bootstrap-vue-next/) (Bootstrap 5, currently in alpha)\n- Angular: [ng-bootstrap](https://ng-bootstrap.github.io/) or [ngx-bootstrap](https://valor-software.com/ngx-bootstrap)\n\n## Using Bootstrap as a module\n\n<Callout>\n**Try it yourself!** Download the source code and working demo for using Bootstrap as an ES module from the [twbs/examples repository](https://github.com/twbs/examples/tree/main/sass-js-esm). You can also [open the example in StackBlitz](https://stackblitz.com/github/twbs/examples/tree/main/sass-js-esm?file=index.html).\n</Callout>\n\nWe provide a version of Bootstrap built as `ESM` (`bootstrap.esm.js` and `bootstrap.esm.min.js`) which allows you to use Bootstrap as a module in the browser, if your [targeted browsers support it](https://caniuse.com/es6-module).\n\n```html\n<script type=\"module\">\n  import { Toast } from 'bootstrap.esm.min.js'\n\n  Array.from(document.querySelectorAll('.toast'))\n    .forEach(toastNode => new Toast(toastNode))\n</script>\n```\n\nCompared to JS bundlers, using ESM in the browser requires you to use the full path and filename instead of the module name. [Read more about JS modules in the browser.](https://v8.dev/features/modules#specifiers) That’s why we use `'bootstrap.esm.min.js'` instead of `'bootstrap'` above. However, this is further complicated by our Popper dependency, which imports Popper into our JavaScript like so:\n\n```js\nimport * as Popper from \"@popperjs/core\"\n```\n\nIf you try this as-is, you’ll see an error in the console like the following:\n\n```text\nUncaught TypeError: Failed to resolve module specifier \"@popperjs/core\". Relative references must start with either \"/\", \"./\", or \"../\".\n```\n\nTo fix this, you can use an `importmap` to resolve the arbitrary module names to complete paths. If your [targeted browsers](https://caniuse.com/?search=importmap) do not support `importmap`, you’ll need to use the [es-module-shims](https://github.com/guybedford/es-module-shims) project. Here’s how it works for Bootstrap and Popper:\n\n```html\n<!doctype html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <link href=\"[[config:cdn.css]]\" rel=\"stylesheet\" integrity=\"[[config:cdn.css_hash]]\" crossorigin=\"anonymous\">\n    <title>Hello, modularity!</title>\n  </head>\n  <body>\n    <h1>Hello, modularity!</h1>\n    <button id=\"popoverButton\" type=\"button\" class=\"btn btn-primary btn-lg\" data-bs-toggle=\"popover\" title=\"ESM in Browser\" data-bs-content=\"Bang!\">Custom popover</button>\n\n    <script async src=\"https://cdn.jsdelivr.net/npm/es-module-shims@1/dist/es-module-shims.min.js\" crossorigin=\"anonymous\"></script>\n    <script type=\"importmap\">\n    {\n      \"imports\": {\n        \"@popperjs/core\": \"[[config:cdn.popper_esm]]\",\n        \"bootstrap\": \"https://cdn.jsdelivr.net/npm/bootstrap@[[config:current_version]]/dist/js/bootstrap.esm.min.js\"\n      }\n    }\n    </script>\n    <script type=\"module\">\n      import * as bootstrap from 'bootstrap'\n\n      new bootstrap.Popover(document.getElementById('popoverButton'))\n    </script>\n  </body>\n</html>\n```\n\n## Dependencies\n\nSome plugins and CSS components depend on other plugins. If you include plugins individually, make sure to check for these dependencies in the docs.\n\nOur dropdowns, popovers, and tooltips also depend on [Popper](https://popper.js.org/docs/v2/).\n\n## Data attributes\n\nNearly all Bootstrap plugins can be enabled and configured through HTML alone with data attributes (our preferred way of using JavaScript functionality). Be sure to **only use one set of data attributes on a single element** (e.g., you cannot trigger a tooltip and modal from the same button.)\n\n<JsDataAttributes />\n\n## Selectors\n\nWe use the native `querySelector` and `querySelectorAll` methods to query DOM elements for performance reasons, so you must use [valid selectors](https://www.w3.org/TR/CSS21/syndata.html#value-def-identifier). If you use special selectors like `collapse:Example`, be sure to escape them.\n\n## Events\n\nBootstrap provides custom events for most plugins’ unique actions. Generally, these come in an infinitive and past participle form - where the infinitive (ex. `show`) is triggered at the start of an event, and its past participle form (ex. `shown`) is triggered on the completion of an action.\n\nAll infinitive events provide [`preventDefault()`](https://developer.mozilla.org/en-US/docs/Web/API/Event/preventDefault) functionality. This provides the ability to stop the execution of an action before it starts. Returning false from an event handler will also automatically call `preventDefault()`.\n\n```js\nconst myModal = document.querySelector('#myModal')\n\nmyModal.addEventListener('show.bs.modal', event => {\n  return event.preventDefault() // stops modal from being shown\n})\n```\n\n## Programmatic API\n\nAll constructors accept an optional options object or nothing (which initiates a plugin with its default behavior):\n\n```js\nconst myModalEl = document.querySelector('#myModal')\nconst modal = new bootstrap.Modal(myModalEl) // initialized with defaults\n\nconst configObject = { keyboard: false }\nconst modal1 = new bootstrap.Modal(myModalEl, configObject) // initialized with no keyboard\n```\n\nIf you’d like to get a particular plugin instance, each plugin exposes a `getInstance` method. For example, to retrieve an instance directly from an element:\n\n```js\nbootstrap.Popover.getInstance(myPopoverEl)\n```\n\nThis method will return `null` if an instance is not initiated over the requested element.\n\nAlternatively, `getOrCreateInstance` can be used to get the instance associated with a DOM element, or create a new one in case it wasn’t initialized.\n\n```js\nbootstrap.Popover.getOrCreateInstance(myPopoverEl, configObject)\n```\n\nIn case an instance wasn’t initialized, it may accept and use an optional configuration object as second argument.\n\n### CSS selectors in constructors\n\nIn addition to the `getInstance` and `getOrCreateInstance` methods, all plugin constructors can accept a DOM element or a valid [CSS selector](#selectors) as the first argument. Plugin elements are found with the `querySelector` method since our plugins only support a single element.\n\n```js\nconst modal = new bootstrap.Modal('#myModal')\nconst dropdown = new bootstrap.Dropdown('[data-bs-toggle=\"dropdown\"]')\nconst offcanvas = bootstrap.Offcanvas.getInstance('#myOffcanvas')\nconst alert = bootstrap.Alert.getOrCreateInstance('#myAlert')\n```\n\n### Asynchronous functions and transitions\n\nAll programmatic API methods are **asynchronous** and return to the caller once the transition is started, but **before it ends**. In order to execute an action once the transition is complete, you can listen to the corresponding event.\n\n```js\nconst myCollapseEl = document.querySelector('#myCollapse')\n\nmyCollapseEl.addEventListener('shown.bs.collapse', event => {\n  // Action to execute once the collapsible area is expanded\n})\n```\n\nIn addition, a method call on a **transitioning component will be ignored**.\n\n```js\nconst myCarouselEl = document.querySelector('#myCarousel')\nconst carousel = bootstrap.Carousel.getInstance(myCarouselEl) // Retrieve a Carousel instance\n\nmyCarouselEl.addEventListener('slid.bs.carousel', event => {\n  carousel.to('2') // Will slide to the slide 2 as soon as the transition to slide 1 is finished\n})\n\ncarousel.to('1') // Will start sliding to the slide 1 and returns to the caller\ncarousel.to('2') // !! Will be ignored, as the transition to the slide 1 is not finished !!\n```\n\n#### `dispose` method\n\nWhile it may seem correct to use the `dispose` method immediately after `hide()`, it will lead to incorrect results. Here’s an example of the problem use:\n\n```js\nconst myModal = document.querySelector('#myModal')\nmyModal.hide() // it is asynchronous\n\nmyModal.addEventListener('shown.bs.hidden', event => {\n  myModal.dispose()\n})\n```\n\n### Default settings\n\nYou can change the default settings for a plugin by modifying the plugin’s `Constructor.Default` object:\n\n```js\n// changes default for the modal plugin’s `keyboard` option to false\nbootstrap.Modal.Default.keyboard = false\n```\n\n## Methods and properties\n\nEvery Bootstrap plugin exposes the following methods and static properties.\n\n<BsTable class=\"table\">\n| Method | Description |\n| --- | --- |\n| `dispose` | Destroys an element’s modal. (Removes stored data on the DOM element) |\n| `getInstance` | *Static* method which allows you to get the modal instance associated with a DOM element. |\n| `getOrCreateInstance` | *Static* method which allows you to get the modal instance associated with a DOM element, or create a new one in case it wasn’t initialized. |\n</BsTable>\n\n<BsTable class=\"table\">\n| Static property | Description |\n| --- | --- |\n| `NAME` | Returns the plugin name. (Example: `bootstrap.Tooltip.NAME`) |\n| `VERSION` | The version of each of Bootstrap’s plugins can be accessed via the `VERSION` property of the plugin’s constructor (Example: `bootstrap.Tooltip.VERSION`) |\n</BsTable>\n\n## Sanitizer\n\nOur tooltip and popover components are able to render arbitrary HTML to the page if configured to do so.\nTo prevent cross-site scripting (XSS) attacks, these components use our built-in content sanitizer to sanitize any options which accept HTML before they are rendered to the page. Content sanitization is enabled by default.\n\nThe tags and attributes allowed by default are as follows. Any tags or attributes not explicitly allowed will be removed during sanitization:\n\n<JsDocs name=\"allow-list\" file=\"js/src/util/sanitizer.js\" removeIndentation={false} />\n\n<Callout type=\"warning\">\n**Exercise caution when using these advanced options.** Refer to [OWASP’s Cross Site Scripting Prevention Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html) for more information. Vulnerabilities caused solely by disabling or modifying content sanitization are not considered within scope for Bootstrap’s security model.\n</Callout>\n\nYou can add new values to this default `allowList`:\n\n```js\nconst myDefaultAllowList = bootstrap.Tooltip.Default.allowList\n\n// To allow table elements\nmyDefaultAllowList.table = []\n\n// To allow td elements and data-bs-option attributes on td elements\nmyDefaultAllowList.td = ['data-bs-option']\n\n// You can push your custom regex to validate your attributes.\n// Be careful about your regular expressions being too lax\nconst myCustomRegex = /^data-my-app-[\\w-]+/\nmyDefaultAllowList['*'].push(myCustomRegex)\n```\n\nYou can also replace our sanitizer with a dedicated library, for example [DOMPurify](https://www.npmjs.com/package/dompurify):\n\n```js\nconst yourTooltipEl = document.querySelector('#yourTooltip')\nconst tooltip = new bootstrap.Tooltip(yourTooltipEl, {\n  sanitizeFn(content) {\n    return DOMPurify.sanitize(content)\n  }\n})\n```\n\n## Optionally using jQuery\n\n**You don’t need jQuery in Bootstrap 5**, but it’s still possible to use our components with jQuery. If Bootstrap detects `jQuery` in the `window` object, it'll add all of our components in jQuery’s plugin system. This allows you to do the following:\n\n```js\n// to enable tooltips with the default configuration\n$('[data-bs-toggle=\"tooltip\"]').tooltip()\n\n// to initialize tooltips with given configuration\n$('[data-bs-toggle=\"tooltip\"]').tooltip({\n  boundary: 'clippingParents',\n  customClass: 'myClass'\n})\n\n// to trigger the `show` method\n$('#myTooltip').tooltip('show')\n```\n\nThe same goes for our other components.\n\n### No conflict\n\nSometimes it is necessary to use Bootstrap plugins with other UI frameworks. In these circumstances, namespace collisions can occasionally occur. If this happens, you may call `.noConflict` on the plugin you wish to revert the value of.\n\n```js\nconst bootstrapButton = $.fn.button.noConflict() // return $.fn.button to previously assigned value\n$.fn.bootstrapBtn = bootstrapButton // give $().bootstrapBtn the Bootstrap functionality\n```\n\nBootstrap does not officially support third-party JavaScript libraries like Prototype or jQuery UI. Despite `.noConflict` and namespaced events, there may be compatibility problems that you need to fix on your own.\n\n### jQuery events\n\nBootstrap will detect jQuery if `jQuery` is present in the `window` object and there is no `data-bs-no-jquery` attribute set on `<body>`. If jQuery is found, Bootstrap will emit events thanks to jQuery’s event system. So if you want to listen to Bootstrap’s events, you’ll have to use the jQuery methods (`.on`, `.one`) instead of `addEventListener`.\n\n```js\n$('#myTab a').on('shown.bs.tab', () => {\n  // do something...\n})\n```\n\n## Disabled JavaScript\n\nBootstrap’s plugins have no special fallback when JavaScript is disabled. If you care about the user experience in this case, use [`<noscript>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/noscript) to explain the situation (and how to re-enable JavaScript) to your users, and/or add your own custom fallbacks.\n"
  },
  {
    "path": "site/src/content/docs/getting-started/parcel.mdx",
    "content": "---\ntitle: Bootstrap and Parcel\ndescription: The official guide for how to include and bundle Bootstrap’s CSS and JavaScript in your project using Parcel.\ntoc: true\nthumbnail: guides/bootstrap-parcel@2x.png\n---\n\n<img class=\"d-block mx-auto mb-4 img-fluid rounded-3\" srcset=\"/docs/[[config:docs_version]]/assets/img/guides/bootstrap-parcel.png, /docs/[[config:docs_version]]/assets/img/guides/bootstrap-parcel@2x.png 2x\" src=\"/docs/[[config:docs_version]]/assets/img/guides/bootstrap-parcel.png\" width=\"800\" height=\"400\" alt=\"\"/>\n\n<Callout>\n**Want to skip to the end?** Download the source code and working demo for this guide from the [twbs/examples repository](https://github.com/twbs/examples/tree/main/parcel). You can also [open the example in StackBlitz](https://stackblitz.com/github/twbs/examples/tree/main/parcel?file=index.html) but not run it because Parcel isn’t currently supported there.\n</Callout>\n\n## What is Parcel?\n\n[Parcel](https://parceljs.org/) is a web application bundler designed to simplify the development process with a zero-configuration setup out of the box. It offers features found in more advanced bundlers while focusing on ease of use, making it ideal for developers seeking a quick start.\n\n## Setup\n\nWe’re building a Parcel project with Bootstrap from scratch, so there are some prerequisites and upfront steps before we can really get started. This guide requires you to have Node.js installed and some familiarity with the terminal.\n\n1. **Create a project folder and set up npm.** We'll create the `my-project` folder and initialize npm with the `-y` argument to avoid it asking us all the interactive questions.\n\n   ```sh\n   mkdir my-project && cd my-project\n   npm init -y\n   ```\n\n2. **Install Parcel.** Unlike our Webpack guide, there’s only a single build tool dependency here. Parcel will automatically install language transformers (like Sass) as it detects them. We use `--save-dev` to signal that this dependency is only for development use and not for production.\n\n   ```sh\n   npm i --save-dev parcel\n   ```\n\n3. **Install Bootstrap.** Now we can install Bootstrap. We'll also install Popper since our dropdowns, popovers, and tooltips depend on it for their positioning. If you don’t plan on using those components, you can omit Popper here.\n\n   ```sh\n   npm i --save bootstrap @popperjs/core\n   ```\n\nNow that we have all the necessary dependencies installed, we can get to work creating the project files and importing Bootstrap.\n\n## Project structure\n\nWe’ve already created the `my-project` folder and initialized npm. Now we'll also create our `src` folder, stylesheet, and JavaScript file to round out the project structure. Run the following from `my-project`, or manually create the folder and file structure shown below.\n\n```sh\nmkdir {src,src/js,src/scss}\ntouch src/index.html src/js/main.js src/scss/styles.scss\n```\n\nWhen you’re done, your complete project should look like this:\n\n```text\nmy-project/\n├── src/\n│   ├── js/\n│   │   └── main.js\n│   ├── scss/\n│   │   └── styles.scss\n│   └── index.html\n├── package-lock.json\n└── package.json\n```\n\nAt this point, everything is in the right place, but Parcel needs an HTML page and npm script to start our server.\n\n## Configure Parcel\n\nWith dependencies installed and our project folder ready for us to start coding, we can now configure Parcel and run our project locally. Parcel itself requires no configuration file by design, but we do need an npm script and an HTML file to start our server.\n\n1. **Fill in the `src/index.html` file.** Parcel needs a page to render, so we use our `index.html` page to set up some basic HTML, including our CSS and JavaScript files.\n\n   ```html\n   <!doctype html>\n   <html lang=\"en\">\n     <head>\n       <meta charset=\"utf-8\">\n       <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n       <title>Bootstrap w/ Parcel</title>\n       <link rel=\"stylesheet\" href=\"scss/styles.scss\">\n       <script type=\"module\" src=\"js/main.js\"></script>\n     </head>\n     <body>\n       <div class=\"container py-4 px-3 mx-auto\">\n         <h1>Hello, Bootstrap and Parcel!</h1>\n         <button class=\"btn btn-primary\">Primary button</button>\n       </div>\n     </body>\n   </html>\n   ```\n\n   We’re including a little bit of Bootstrap styling here with the `div class=\"container\"` and `<button>` so that we see when Bootstrap’s CSS is loaded by Parcel.\n\n   Parcel will automatically detect we’re using Sass and install the [Sass Parcel plugin](https://parceljs.org/languages/sass/) to support it. However, if you wish, you can also manually run `npm i --save-dev @parcel/transformer-sass`.\n\n2. **Add the Parcel npm scripts.** Open the `package.json` and add the following `start` script to the `scripts` object. We'll use this script to start our Parcel development server and render the HTML file we created after it’s compiled into the `dist` directory.\n\n   ```json\n   {\n      // ...\n      \"scripts\": {\n        \"start\": \"parcel serve src/index.html --public-url / --dist-dir dist\",\n        \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\"\n      },\n      // ...\n   }\n   ```\n\n3. **And finally, we can start Parcel.** From the `my-project` folder in your terminal, run that newly added npm script:\n\n   ```sh\n   npm start\n   ```\n\n   <img class=\"img-fluid\" src=\"/docs/[[config:docs_version]]/assets/img/guides/parcel-dev-server.png\" alt=\"Parcel dev server running\" />\n\nIn the next and final section to this guide, we'll import all of Bootstrap’s CSS and JavaScript.\n\n## Import Bootstrap\n\nImporting Bootstrap into Parcel requires two imports, one into our `styles.scss` and one into our `main.js`.\n\n1. **Import Bootstrap’s CSS.** Add the following to `src/scss/styles.scss` to import all of Bootstrap’s source Sass.\n\n   ```scss\n   // Import all of Bootstrap’s CSS\n   @import \"bootstrap/scss/bootstrap\";\n   ```\n\n   *You can also import our stylesheets individually if you want. [Read our Sass import docs]([[docsref:/customize/sass#importing]]) for details.*\n\n   **Optional:** You may see Sass deprecation warnings with the latest versions of Dart Sass. These can silenced by adding the following configuration in a `.sassrc.js` file in the root folder with the following:\n\n   ```js\n   module.exports = {\n     silenceDeprecations: ['import', 'mixed-decls', 'color-functions', 'global-builtin']\n   }\n   ```\n\n2. **Import Bootstrap’s JS.** Add the following to `src/js/main.js` to import all of Bootstrap’s JS. Popper will be imported automatically through Bootstrap.\n\n   ```js\n   // Import all of Bootstrap’s JS\n   import * as bootstrap from 'bootstrap'\n   ```\n\n   You can also import JavaScript plugins individually as needed to keep bundle sizes down:\n\n   ```js\n   import Alert from 'bootstrap/js/dist/alert'\n\n   // or, specify which plugins you need:\n   import { Tooltip, Toast, Popover } from 'bootstrap'\n   ```\n\n   *[Read our JavaScript docs]([[docsref:/getting-started/javascript/]]) for more information on how to use Bootstrap’s plugins.*\n\n3. **And you’re done! 🎉** With Bootstrap’s source Sass and JS fully loaded, your local development server should now look like this:\n\n   <img class=\"img-fluid\" src=\"/docs/[[config:docs_version]]/assets/img/guides/parcel-dev-server-bootstrap.png\" alt=\"Parcel dev server running with Bootstrap\" />\n\n   Now you can start adding any Bootstrap components you want to use. Be sure to [check out the complete Parcel example project](https://github.com/twbs/examples/tree/main/parcel) for how to include additional custom Sass and optimize your build by importing only the parts of Bootstrap’s CSS and JS that you need.\n\n<GuideFooter />\n"
  },
  {
    "path": "site/src/content/docs/getting-started/rfs.mdx",
    "content": "---\ntitle: RFS\ndescription: Bootstrap’s resizing engine responsively scales common CSS properties to better utilize available space across viewports and devices.\ntoc: true\n---\n\n## What is RFS?\n\nBootstrap’s side project [RFS](https://github.com/twbs/rfs/tree/[[config:rfs_version]]) is a unit resizing engine which was initially developed to resize font sizes (hence its abbreviation for Responsive Font Sizes). Nowadays RFS is capable of rescaling most CSS properties with unit values like `margin`, `padding`, `border-radius`, or even `box-shadow`.\n\nThe mechanism automatically calculates the appropriate values based on the dimensions of the browser viewport. It will be compiled into `calc()` functions with a mix of `rem` and viewport units to enable the responsive scaling behavior.\n\n## Using RFS\n\nThe mixins are included in Bootstrap and are available once you include Bootstrap’s `scss`. RFS can also be [installed standalone](https://github.com/twbs/rfs/tree/[[config:rfs_version]]#installation) if needed.\n\n### Using the mixins\n\nThe `rfs()` mixin has shorthands for `font-size`, `margin`, `margin-top`, `margin-right`, `margin-bottom`, `margin-left`, `padding`, `padding-top`, `padding-right`, `padding-bottom`, and `padding-left`. See the example below for source Sass and compiled CSS.\n\n```scss\n.title {\n  @include font-size(4rem);\n}\n```\n\n```css\n.title {\n  font-size: calc(1.525rem + 3.3vw);\n}\n\n@media (min-width: 1200px) {\n  .title {\n    font-size: 4rem;\n  }\n}\n```\n\nAny other property can be passed to the `rfs()` mixin like this:\n\n```scss\n.selector {\n  @include rfs(4rem, border-radius);\n}\n```\n\n`!important` can also just be added to whatever value you want:\n\n```scss\n.selector {\n  @include padding(2.5rem !important);\n}\n```\n\n### Using the functions\n\nWhen you don’t want to use the includes, there are also two functions:\n\n- `rfs-value()` converts a value into a `rem` value if a `px` value is passed, in other cases it returns the same result.\n- `rfs-fluid-value()` returns the fluid version of a value if the property needs rescaling.\n\nIn this example, we use one of Bootstrap’s built-in [responsive breakpoint mixins]([[docsref:/layout/breakpoints]]) to only apply styling below the `lg` breakpoint.\n\n```scss\n.selector {\n  @include media-breakpoint-down(lg) {\n    padding: rfs-fluid-value(2rem);\n    font-size: rfs-fluid-value(1.125rem);\n  }\n}\n```\n\n```css\n@media (max-width: 991.98px) {\n  .selector {\n    padding: calc(1.325rem + 0.9vw);\n    font-size: 1.125rem; /* 1.125rem is small enough, so RFS won’t rescale this */\n  }\n}\n```\n\n## Extended documentation\n\nRFS is a separate project under the Bootstrap organization. More about RFS and its configuration can be found on its [GitHub repository](https://github.com/twbs/rfs/tree/[[config:rfs_version]]).\n"
  },
  {
    "path": "site/src/content/docs/getting-started/rtl.mdx",
    "content": "---\ntitle: RTL\ndescription: Learn how to enable support for right-to-left text in Bootstrap across our layout, components, and utilities.\ntoc: true\n---\n\n## Get familiar\n\nWe recommend getting familiar with Bootstrap first by reading through our [Getting Started Introduction page]([[docsref:/getting-started/introduction]]). Once you’ve run through it, continue reading here for how to enable RTL.\n\nYou may also want to read up on [the RTLCSS project](https://rtlcss.com/), as it powers our approach to RTL.\n\n<Callout type=\"warning\">\n**Bootstrap’s RTL feature is still experimental** and will evolve based on user feedback. Spotted something or have an improvement to suggest? [Open an issue]([[config:repo]]/issues/new/choose), we’d love to get your insights.\n</Callout>\n\n## Required HTML\n\nThere are two strict requirements for enabling RTL in Bootstrap-powered pages.\n\n1. Set `dir=\"rtl\"` on the `<html>` element.\n2. Add an appropriate `lang` attribute, like `lang=\"ar\"`, on the `<html>` element.\n\nFrom there, you’ll need to include an RTL version of our CSS. For example, here’s the stylesheet for our compiled and minified CSS with RTL enabled:\n\n```html\n<link rel=\"stylesheet\" href=\"[[config:cdn.css_rtl]]\" integrity=\"[[config:cdn.css_rtl_hash]]\" crossorigin=\"anonymous\">\n```\n\n### Starter template\n\nYou can see the above requirements reflected in this modified RTL starter template.\n\n```html\n<!doctype html>\n<html lang=\"ar\" dir=\"rtl\">\n  <head>\n    <!-- Required meta tags -->\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n\n    <!-- Bootstrap CSS -->\n    <link rel=\"stylesheet\" href=\"[[config:cdn.css_rtl]]\" integrity=\"[[config:cdn.css_rtl_hash]]\" crossorigin=\"anonymous\">\n\n    <title>مرحبًا بالعالم!</title>\n  </head>\n  <body>\n    <h1>مرحبًا بالعالم!</h1>\n\n    <!-- Optional JavaScript; choose one of the two! -->\n\n    <!-- Option 1: Bootstrap Bundle with Popper -->\n    <script src=\"[[config:cdn.js_bundle]]\" integrity=\"[[config:cdn.js_bundle_hash]]\" crossorigin=\"anonymous\"></script>\n\n    <!-- Option 2: Separate Popper and Bootstrap JS -->\n    <!--\n    <script src=\"[[config:cdn.popper]]\" integrity=\"[[config:cdn.popper_hash]]\" crossorigin=\"anonymous\"></script>\n    <script src=\"[[config:cdn.js]]\" integrity=\"[[config:cdn.js_hash]]\" crossorigin=\"anonymous\"></script>\n    -->\n  </body>\n</html>\n```\n\n### RTL examples\n\nGet started with one of our several [RTL examples]([[docsref:/examples/#rtl]]).\n\n## Approach\n\nOur approach to building RTL support into Bootstrap comes with two important decisions that impact how we write and use our CSS:\n\n1. **First, we decided to build it with the [RTLCSS](https://rtlcss.com/) project.** This gives us some powerful features for managing changes and overrides when moving from LTR to RTL. It also allows us to build two versions of Bootstrap from one codebase.\n\n2. **Second, we’ve renamed a handful of directional classes to adopt a logical properties approach.** Most of you have already interacted with logical properties thanks to our flex utilities—they replace direction properties like `left` and `right` in favor `start` and `end`. That makes the class names and values appropriate for LTR and RTL without any overhead.\n\n  For example, instead of `.ml-3` for `margin-left`, use `.ms-3`.\n\nWorking with RTL, through our source Sass or compiled CSS, shouldn’t be much different from our default LTR though.\n\n## Customize from source\n\nWhen it comes to [customization]([[docsref:/customize/sass]]), the preferred way is to take advantage of variables, maps, and mixins. This approach works the same for RTL, even if it’s post-processed from the compiled files, thanks to [how RTLCSS works](https://rtlcss.com/learn/getting-started/why-rtlcss/).\n\n### Custom RTL values\n\nUsing [RTLCSS value directives](https://rtlcss.com/learn/usage-guide/value-directives/), you can make a variable output a different value for RTL. For example, to decrease the weight for `$font-weight-bold` throughout the codebase, you may use the `/*rtl: {value}*/` syntax:\n\n```scss\n$font-weight-bold: 700 #{/* rtl:600 */} !default;\n```\n\nWhich would output to the following for our default CSS and RTL CSS:\n\n```css\n/* bootstrap.css */\ndt {\n  font-weight: 700 /* rtl:600 */;\n}\n\n/* bootstrap.rtl.css */\ndt {\n  font-weight: 600;\n}\n```\n\n### Alternative font stack\n\nIn the case you’re using a custom font, be aware that not all fonts support the non-Latin alphabet. To switch from Pan-European to Arabic family, you may need to use `/*rtl:insert: {value}*/` in your font stack to modify the names of font families.\n\nFor example, to switch from `Helvetica Neue` font for LTR to `Helvetica Neue Arabic` for RTL, your Sass code could look like this:\n\n```scss\n$font-family-sans-serif:\n  Helvetica Neue #{\"/* rtl:insert:Arabic */\"},\n  // Cross-platform generic font family (default user interface font)\n  system-ui,\n  // Safari for macOS and iOS (San Francisco)\n  -apple-system,\n  // Chrome < 56 for macOS (San Francisco)\n  BlinkMacSystemFont,\n  // Windows\n  \"Segoe UI\",\n  // Android\n  Roboto,\n  // Basic web fallback\n  Arial,\n  // Linux\n  \"Noto Sans\",\n  // Sans serif fallback\n  sans-serif,\n  // Emoji fonts\n  \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\" !default;\n```\n\n### LTR and RTL at the same time\n\nNeed both LTR and RTL on the same page? Thanks to [RTLCSS String Maps](https://rtlcss.com/learn/usage-guide/string-map/), this is pretty straightforward. Wrap your `@import`s with a class, and set a custom rename rule for RTLCSS:\n\n```scss\n/* rtl:begin:options: {\n  \"autoRename\": true,\n  \"stringMap\":[ {\n    \"name\": \"ltr-rtl\",\n    \"priority\": 100,\n    \"search\": [\"ltr\"],\n    \"replace\": [\"rtl\"],\n    \"options\": {\n      \"scope\": \"*\",\n      \"ignoreCase\": false\n    }\n  } ]\n} */\n.ltr {\n  @import \"../node_modules/bootstrap/scss/bootstrap\";\n}\n/*rtl:end:options*/\n```\n\nAfter running Sass then RTLCSS, each selector in your CSS files will be prepended by `.ltr`, and `.rtl` for RTL files. Now you’re able to use both files on the same page, and simply use `.ltr` or `.rtl` on your components wrappers to use one or the other direction.\n\n<Callout type=\"warning\">\n**Edge cases and known limitations** to consider when working with a combined LTR and RTL implementation:\n\n1. When switching `.ltr` and `.rtl`, make sure you add `dir` and `lang` attributes accordingly.\n2. Loading both files can be a real performance bottleneck: consider some [optimization]([[docsref:/customize/optimize]]), and maybe try to [load one of those files asynchronously](https://www.filamentgroup.com/lab/load-css-simpler/).\n3. Nesting styles this way will prevent our `form-validation-state()` mixin from working as intended, thus require you tweak it a bit by yourself. [See #31223](https://github.com/twbs/bootstrap/issues/31223).\n</Callout>\n\nDo you want to automate this process and address several edge cases involving both directions within a single stylesheet? Then, consider using [PostCSS RTLCSS](https://github.com/elchininet/postcss-rtlcss) as a [PostCSS](https://github.com/postcss/postcss) plugin to process your source files. PostCSS RTLCSS uses [RTLCSS](https://rtlcss.com) behind the scenes to manage the direction flipping process, but it separates the flipped declarations into rules with a different prefix for LTR and RTL, something that allows you to have both directions within the same stylesheet file. By doing this, you can switch between LTR and RTL orientations by simply changing the `dir` of the page (or even by modifying a specific class if you configure the plugin accordingly).\n\n<Callout type=\"warning\">\n**Important things to take into account** when using PostCSS RTLCSS to build a combined LTR and RTL implementation:\n\n1. It is recommended that you add the `dir` attribute to the `html` element. This way, the entire page will be affected when you change the direction. Also, make sure you add the `lang` attribute accordingly.\n2. Having a single bundle with both directions will increase the size of the final stylesheet (on average, by 20%-30%): consider some [optimization]([[docsref:/customize/optimize]]).\n3. Take into account that PostCSS RTLCSS is not compatible with `/* rtl:remove */` directives because it doesn’t remove any CSS rule. You should replace your `/* rtl:remove */`, `/* rtl:begin:remove */` and `/* rtl:end:remove */` directives with `/* rtl:freeze */`, `/* rtl:begin:freeze */` and `/* rtl:end:freeze */` directives respectively. These directives will prefix the targeted rules or declarations with the current direction but will not create an RTL counterpart (same result as the `remove` ones in RTLCSS).\n</Callout>\n\n## The breadcrumb case\n\nThe [breadcrumb separator]([[docsref:/components/breadcrumb]]#dividers) is the only case requiring its own brand-new variable— namely `$breadcrumb-divider-flipped` —defaulting to `$breadcrumb-divider`.\n\n## Additional resources\n\n- [RTLCSS](https://rtlcss.com/)\n- [RTL Styling 101](https://rtlstyling.com/posts/rtl-styling)\n"
  },
  {
    "path": "site/src/content/docs/getting-started/vite.mdx",
    "content": "---\ntitle: Bootstrap and Vite\ndescription: The official guide for how to include and bundle Bootstrap’s CSS and JavaScript in your project using Vite.\ntoc: true\nthumbnail: guides/bootstrap-vite@2x.png\nadded:\n  show_badge: false\n  version: \"5.2\"\n---\n\n<img class=\"d-block mx-auto mb-4 img-fluid rounded-3\" srcset=\"/docs/[[config:docs_version]]/assets/img/guides/bootstrap-vite.png, /docs/[[config:docs_version]]/assets/img/guides/bootstrap-vite@2x.png 2x\" src=\"/docs/[[config:docs_version]]/assets/img/guides/bootstrap-vite.png\" width=\"800\" height=\"400\" alt=\"\" />\n\n<Callout>\n**Want to skip to the end?** Download the source code and working demo for this guide from the [twbs/examples repository](https://github.com/twbs/examples/tree/main/vite). You can also [open the example in StackBlitz](https://stackblitz.com/github/twbs/examples/tree/main/vite?file=index.html) for live editing.\n</Callout>\n\n## What is Vite?\n\n[Vite](https://vite.dev/) is a modern frontend build tool designed for speed and simplicity. It provides an efficient and streamlined development experience, especially for modern JavaScript frameworks.\n\n## Setup\n\nWe’re building a Vite project with Bootstrap from scratch, so there are some prerequisites and upfront steps before we can really get started. This guide requires you to have Node.js installed and some familiarity with the terminal.\n\n1. **Create a project folder and set up npm.** We'll create the `my-project` folder and initialize npm with the `-y` argument to avoid it asking us all the interactive questions.\n\n   ```sh\n   mkdir my-project && cd my-project\n   npm init -y\n   ```\n\n2. **Install Vite.** Unlike our Webpack guide, there’s only a single build tool dependency here. We use `--save-dev` to signal that this dependency is only for development use and not for production.\n\n   ```sh\n   npm i --save-dev vite\n   ```\n\n3. **Install Bootstrap.** Now we can install Bootstrap. We'll also install Popper since our dropdowns, popovers, and tooltips depend on it for their positioning. If you don’t plan on using those components, you can omit Popper here.\n\n   ```sh\n   npm i --save bootstrap @popperjs/core\n   ```\n\n4. **Install additional dependency.** In addition to Vite and Bootstrap, we need another dependency (Sass) to properly import and bundle Bootstrap’s CSS.\n\n   ```sh\n   npm i --save-dev sass\n   ```\n\nNow that we have all the necessary dependencies installed and set up, we can get to work creating the project files and importing Bootstrap.\n\n## Project structure\n\nWe’ve already created the `my-project` folder and initialized npm. Now we'll also create our `src` folder, stylesheet, and JavaScript file to round out the project structure. Run the following from `my-project`, or manually create the folder and file structure shown below.\n\n```sh\nmkdir {src,src/js,src/scss}\ntouch src/index.html src/js/main.js src/scss/styles.scss vite.config.js\n```\n\nWhen you’re done, your complete project should look like this:\n\n```text\nmy-project/\n├── src/\n│   ├── js/\n│   │   └── main.js\n│   └── scss/\n│   |   └── styles.scss\n|   └── index.html\n├── package-lock.json\n├── package.json\n└── vite.config.js\n```\n\nAt this point, everything is in the right place, but Vite won’t work because we haven’t filled in our `vite.config.js` yet.\n\n## Configure Vite\n\nWith dependencies installed and our project folder ready for us to start coding, we can now configure Vite and run our project locally.\n\n1. **Open `vite.config.js` in your editor.** Since it’s blank, we'll need to add some boilerplate config to it so we can start our server. This part of the config tells Vite where to look for our project’s JavaScript and how the development server should behave (pulling from the `src` folder with hot reload).\n\n   ```js\n   import { resolve } from 'path'\n\n   export default {\n     root: resolve(__dirname, 'src'),\n     build: {\n       outDir: '../dist'\n     },\n     server: {\n       port: 8080\n     },\n     // Optional: Silence Sass deprecation warnings. See note below.\n     css: {\n        preprocessorOptions: {\n           scss: {\n             silenceDeprecations: [\n               'import',\n               'mixed-decls',\n               'color-functions',\n               'global-builtin',\n             ],\n           },\n        },\n     },\n   }\n   ```\n\n   **Note:** Sass deprecation warnings are shown when compiling source Sass files with the latest versions of Dart Sass. This does not prevent compilation or usage of Bootstrap. We’re [working on a long-term fix]([[config:repo]]/issues/40962), but in the meantime these deprecation notices can be ignored.\n\n2. **Next we fill in `src/index.html`.** This is the HTML page Vite will load in the browser to utilize the bundled CSS and JS we'll add to it in later steps.\n\n   ```html\n   <!doctype html>\n   <html lang=\"en\">\n     <head>\n       <meta charset=\"utf-8\">\n       <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n       <title>Bootstrap w/ Vite</title>\n       <script type=\"module\" src=\"./js/main.js\"></script>\n     </head>\n     <body>\n       <div class=\"container py-4 px-3 mx-auto\">\n         <h1>Hello, Bootstrap and Vite!</h1>\n         <button class=\"btn btn-primary\">Primary button</button>\n       </div>\n     </body>\n   </html>\n   ```\n\n   We’re including a little bit of Bootstrap styling here with the `div class=\"container\"` and `<button>` so that we see when Bootstrap’s CSS is loaded by Vite.\n\n3. **Now we need an npm script to run Vite.** Open `package.json` and add the `start` script shown below (you should already have the test script). We'll use this script to start our local Vite dev server.\n\n   ```json\n   {\n     // ...\n     \"scripts\": {\n       \"start\": \"vite\",\n       \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\"\n     },\n     // ...\n   }\n   ```\n\n4. **And finally, we can start Vite.** From the `my-project` folder in your terminal, run that newly added npm script:\n\n   ```sh\n   npm start\n   ```\n\n   <img class=\"img-fluid\" src=\"/docs/[[config:docs_version]]/assets/img/guides/vite-dev-server.png\" alt=\"Vite dev server running\" />\n\nIn the next and final section to this guide, we’ll import all of Bootstrap’s CSS and JavaScript.\n\n## Import Bootstrap\n\n1. **Import Bootstrap’s CSS.** Add the following to `src/scss/styles.scss` to import all of Bootstrap’s source Sass.\n\n   ```scss\n   // Import all of Bootstrap’s CSS\n   @import \"bootstrap/scss/bootstrap\";\n   ```\n\n   *You can also import our stylesheets individually if you want. [Read our Sass import docs]([[docsref:/customize/sass#importing]]) for details.*\n\n3. **Next we load the CSS and import Bootstrap’s JavaScript.** Add the following to `src/js/main.js` to load the CSS and import all of Bootstrap’s JS. Popper will be imported automatically through Bootstrap.\n\n   ```js\n   // Import our custom CSS\n   import '../scss/styles.scss'\n\n   // Import all of Bootstrap’s JS\n   import * as bootstrap from 'bootstrap'\n   ```\n\n   You can also import JavaScript plugins individually as needed to keep bundle sizes down:\n\n   ```js\n   import Alert from 'bootstrap/js/dist/alert';\n\n   // or, specify which plugins you need:\n   import { Tooltip, Toast, Popover } from 'bootstrap';\n   ```\n\n   *[Read our JavaScript docs]([[docsref:/getting-started/javascript/]]) for more information on how to use Bootstrap’s plugins.*\n\n4. **And you’re done! 🎉** With Bootstrap’s source Sass and JS fully loaded, your local development server should now look like this:\n\n   <img class=\"img-fluid\" src=\"/docs/[[config:docs_version]]/assets/img/guides/vite-dev-server-bootstrap.png\" alt=\"Vite dev server running with Bootstrap\" />\n\n   Now you can start adding any Bootstrap components you want to use. Be sure to [check out the complete Vite example project](https://github.com/twbs/examples/tree/main/vite) for how to include additional custom Sass and optimize your build by importing only the parts of Bootstrap’s CSS and JS that you need.\n\n<GuideFooter />\n"
  },
  {
    "path": "site/src/content/docs/getting-started/webpack.mdx",
    "content": "---\ntitle: Bootstrap and Webpack\ndescription: The official guide for how to include and bundle Bootstrap’s CSS and JavaScript in your project using Webpack.\ntoc: true\nthumbnail: guides/bootstrap-webpack@2x.png\n---\n\n<img class=\"d-block mx-auto mb-4 img-fluid rounded-3\" srcset=\"/docs/[[config:docs_version]]/assets/img/guides/bootstrap-webpack.png, /docs/[[config:docs_version]]/assets/img/guides/bootstrap-webpack@2x.png 2x\" src=\"/docs/[[config:docs_version]]/assets/img/guides/bootstrap-webpack.png\" width=\"800\" height=\"400\" alt=\"\"/>\n\n<Callout>\n**Want to skip to the end?** Download the source code and working demo for this guide from the [twbs/examples repository](https://github.com/twbs/examples/tree/main/webpack). You can also [open the example in StackBlitz](https://stackblitz.com/github/twbs/examples/tree/main/webpack?file=index.html) for live editing.\n</Callout>\n\n## What is Webpack?\n\n[Webpack](https://webpack.js.org/) is a JavaScript module bundler that processes modules and their dependencies to generate static assets. It simplifies managing complex web applications with multiple files and dependencies.\n\n## Setup\n\nWe’re building a Webpack project with Bootstrap from scratch, so there are some prerequisites and upfront steps before we can really get started. This guide requires you to have Node.js installed and some familiarity with the terminal.\n\n1. **Create a project folder and set up npm.** We'll create the `my-project` folder and initialize npm with the `-y` argument to avoid it asking us all the interactive questions.\n\n   ```sh\n   mkdir my-project && cd my-project\n   npm init -y\n   ```\n\n2. **Install Webpack.** Next we need to install our Webpack development dependencies: `webpack` for the core of Webpack, `webpack-cli` so we can run Webpack commands from the terminal, and `webpack-dev-server` so we can run a local development server. Additionally, we'll install `html-webpack-plugin` to be able to store our `index.html` in `src` directory instead of the default `dist` one. We use `--save-dev` to signal that these dependencies are only for development use and not for production.\n\n   ```sh\n   npm i --save-dev webpack webpack-cli webpack-dev-server html-webpack-plugin\n   ```\n\n3. **Install Bootstrap.** Now we can install Bootstrap. We'll also install Popper since our dropdowns, popovers, and tooltips depend on it for their positioning. If you don’t plan on using those components, you can omit Popper here.\n\n   ```sh\n   npm i --save bootstrap @popperjs/core\n   ```\n\n4. **Install additional dependencies.** In addition to Webpack and Bootstrap, we need a few more dependencies to properly import and bundle Bootstrap’s CSS and JS with Webpack. These include Sass, some loaders, and Autoprefixer.\n\n   ```sh\n   npm i --save-dev autoprefixer css-loader postcss-loader sass sass-loader style-loader\n   ```\n\nNow that we have all the necessary dependencies installed, we can get to work creating the project files and importing Bootstrap.\n\n## Project structure\n\nWe’ve already created the `my-project` folder and initialized npm. Now we'll also create our `src` and `dist` folders to round out the project structure. Run the following from `my-project`, or manually create the folder and file structure shown below.\n\n```sh\nmkdir {src,src/js,src/scss}\ntouch src/index.html src/js/main.js src/scss/styles.scss webpack.config.js\n```\n\nWhen you’re done, your complete project should look like this:\n\n```text\nmy-project/\n├── src/\n│   ├── js/\n│   │   └── main.js\n│   ├── scss/\n│   │   └── styles.scss\n│   └── index.html\n├── package-lock.json\n├── package.json\n└── webpack.config.js\n```\n\nAt this point, everything is in the right place, but Webpack won’t work because we haven’t filled in our `webpack.config.js` yet.\n\n## Configure Webpack\n\nWith dependencies installed and our project folder ready for us to start coding, we can now configure Webpack and run our project locally.\n\n1. **Open `webpack.config.js` in your editor.** Since it’s blank, we'll need to add some boilerplate config to it so we can start our server. This part of the config tells Webpack where to look for our project’s JavaScript, where to output the compiled code to (`dist`), and how the development server should behave (pulling from the `dist` folder with hot reload).\n\n   ```js\n   'use strict'\n\n   const path = require('path')\n   const HtmlWebpackPlugin = require('html-webpack-plugin')\n\n   module.exports = {\n     mode: 'development',\n     entry: './src/js/main.js',\n     output: {\n       filename: 'main.js',\n       path: path.resolve(__dirname, 'dist')\n     },\n     devServer: {\n       static: path.resolve(__dirname, 'dist'),\n       port: 8080,\n       hot: true\n     },\n     plugins: [\n       new HtmlWebpackPlugin({ template: './src/index.html' })\n     ]\n   }\n   ```\n\n2. **Next we fill in our `src/index.html`.** This is the HTML page Webpack will load in the browser to utilize the bundled CSS and JS we'll add to it in later steps. Before we can do that, we have to give it something to render and include the `output` JS from the previous step.\n\n   ```html\n   <!doctype html>\n   <html lang=\"en\">\n     <head>\n       <meta charset=\"utf-8\">\n       <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n       <title>Bootstrap w/ Webpack</title>\n     </head>\n     <body>\n       <div class=\"container py-4 px-3 mx-auto\">\n         <h1>Hello, Bootstrap and Webpack!</h1>\n         <button class=\"btn btn-primary\">Primary button</button>\n       </div>\n     </body>\n   </html>\n   ```\n\n   We’re including a little bit of Bootstrap styling here with the `div class=\"container\"` and `<button>` so that we see when Bootstrap’s CSS is loaded by Webpack.\n\n3. **Now we need an npm script to run Webpack.** Open `package.json` and add the `start` script shown below (you should already have the test script). We'll use this script to start our local Webpack dev server. You can also add a `build` script shown below to build your project.\n\n   ```json\n   {\n     // ...\n     \"scripts\": {\n       \"start\": \"webpack serve\",\n       \"build\": \"webpack build --mode=production\",\n       \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\"\n     },\n     // ...\n   }\n   ```\n\n4. **And finally, we can start Webpack.** From the `my-project` folder in your terminal, run that newly added npm script:\n\n   ```sh\n   npm start\n   ```\n\n   <img class=\"img-fluid\" src=\"/docs/[[config:docs_version]]/assets/img/guides/webpack-dev-server.png\" alt=\"Webpack dev server running\"/>\n\nIn the next and final section to this guide, we'll set up the Webpack loaders and import all of Bootstrap’s CSS and JavaScript.\n\n## Import Bootstrap\n\nImporting Bootstrap into Webpack requires the loaders we installed in the first section. We’ve installed them with npm, but now Webpack needs to be configured to use them.\n\n1. **Set up the loaders in `webpack.config.js`.** Your configuration file is now complete and should match the snippet below. The only new part here is the `module` section.\n\n   ```js\n   'use strict'\n\n   const path = require('path')\n   const autoprefixer = require('autoprefixer')\n   const HtmlWebpackPlugin = require('html-webpack-plugin')\n\n   module.exports = {\n     mode: 'development',\n     entry: './src/js/main.js',\n     output: {\n       filename: 'main.js',\n       path: path.resolve(__dirname, 'dist')\n     },\n     devServer: {\n       static: path.resolve(__dirname, 'dist'),\n       port: 8080,\n       hot: true\n     },\n     plugins: [\n       new HtmlWebpackPlugin({ template: './src/index.html' })\n     ],\n     module: {\n       rules: [\n         {\n           test: /\\.(scss)$/,\n           use: [\n             {\n               // Adds CSS to the DOM by injecting a `<style>` tag\n               loader: 'style-loader'\n             },\n             {\n               // Interprets `@import` and `url()` like `import/require()` and will resolve them\n               loader: 'css-loader'\n             },\n             {\n               // Loader for webpack to process CSS with PostCSS\n               loader: 'postcss-loader',\n               options: {\n                 postcssOptions: {\n                   plugins: [\n                     autoprefixer\n                   ]\n                 }\n               }\n             },\n             {\n               // Loads a SASS/SCSS file and compiles it to CSS\n               loader: 'sass-loader',\n               options: {\n                 sassOptions: {\n                   // Optional: Silence Sass deprecation warnings. See note below.\n                   silenceDeprecations: [\n                     'mixed-decls',\n                     'color-functions',\n                     'global-builtin',\n                     'import'\n                   ]\n                 }\n               }\n             }\n           ]\n         }\n       ]\n     }\n   }\n   ```\n\n   Here’s a recap of why we need all these loaders. `style-loader` injects the CSS into a `<style>` element in the `<head>` of the HTML page, `css-loader` helps with using `@import` and `url()`, `postcss-loader` is required for Autoprefixer, and `sass-loader` allows us to use Sass.\n\n   **Note:** Sass deprecation warnings are shown when compiling source Sass files with the latest versions of Dart Sass. This does not prevent compilation or usage of Bootstrap. We’re [working on a long-term fix]([[config:repo]]/issues/40962), but in the meantime these deprecation notices can be ignored.\n\n2. **Now, let’s import Bootstrap’s CSS.** Add the following to `src/scss/styles.scss` to import all of Bootstrap’s source Sass.\n\n   ```scss\n   // Import all of Bootstrap’s CSS\n   @import \"bootstrap/scss/bootstrap\";\n   ```\n\n   *You can also import our stylesheets individually if you want. [Read our Sass import docs]([[docsref:/customize/sass#importing]]) for details.*\n\n3. **Next we load the CSS and import Bootstrap’s JavaScript.** Add the following to `src/js/main.js` to load the CSS and import all of Bootstrap’s JS. Popper will be imported automatically through Bootstrap.\n\n   ```js\n   // Import our custom CSS\n   import '../scss/styles.scss'\n\n   // Import all of Bootstrap’s JS\n   import * as bootstrap from 'bootstrap'\n   ```\n\n   You can also import JavaScript plugins individually as needed to keep bundle sizes down:\n\n   ```js\n   import Alert from 'bootstrap/js/dist/alert'\n\n   // or, specify which plugins you need:\n   import { Tooltip, Toast, Popover } from 'bootstrap'\n   ```\n\n   *[Read our JavaScript docs]([[docsref:/getting-started/javascript/]]) for more information on how to use Bootstrap’s plugins.*\n\n4. **And you’re done! 🎉** With Bootstrap’s source Sass and JS fully loaded, your local development server should now look like this:\n\n   <img class=\"img-fluid\" src=\"/docs/[[config:docs_version]]/assets/img/guides/webpack-dev-server-bootstrap.png\" alt=\"Webpack dev server running with Bootstrap\"/>\n\n   Now you can start adding any Bootstrap components you want to use. Be sure to [check out the complete Webpack example project](https://github.com/twbs/examples/tree/main/webpack) for how to include additional custom Sass and optimize your build by importing only the parts of Bootstrap’s CSS and JS that you need.\n\n## Production optimizations\n\nDepending on your setup, you may want to implement some additional security and speed optimizations useful for running the project in production. Note that these optimizations are not applied on [the Webpack example project](https://github.com/twbs/examples/tree/main/webpack) and are up to you to implement.\n\n### Extracting CSS\n\nThe `style-loader` we configured above conveniently emits CSS into the bundle so that manually loading a CSS file in `dist/index.html` isn’t necessary. This approach may not work with a strict Content Security Policy, however, and it may become a bottleneck in your application due to the large bundle size.\n\nTo separate the CSS so that we can load it directly from `dist/index.html`, use the `mini-css-extract-loader` Webpack plugin.\n\nFirst, install the plugin:\n\n```sh\nnpm install --save-dev mini-css-extract-plugin\n```\n\nThen instantiate and use the plugin in the Webpack configuration:\n\n```diff\n--- a/webpack.config.js\n+++ b/webpack.config.js\n@@ -3,6 +3,7 @@\n const path = require('path')\n const autoprefixer = require('autoprefixer')\n const HtmlWebpackPlugin = require('html-webpack-plugin')\n+const miniCssExtractPlugin = require('mini-css-extract-plugin')\n\n module.exports = {\n   mode: 'development',\n@@ -17,7 +18,8 @@ module.exports = {\n     hot: true\n   },\n   plugins: [\n-    new HtmlWebpackPlugin({ template: './src/index.html' })\n+    new HtmlWebpackPlugin({ template: './src/index.html' }),\n+    new miniCssExtractPlugin()\n   ],\n   module: {\n     rules: [\n@@ -25,8 +27,8 @@ module.exports = {\n         test: /\\.(scss)$/,\n         use: [\n           {\n-            // Adds CSS to the DOM by injecting a `<style>` tag\n-            loader: 'style-loader'\n+            // Extracts CSS for each JS file that includes CSS\n+            loader: miniCssExtractPlugin.loader\n           },\n           {\n```\n\nAfter running `npm run build` again, there will be a new file `dist/main.css`, which will contain all of the CSS imported by `src/js/main.js`. If you view `dist/index.html` in your browser now, the style will be missing, as it is now in `dist/main.css`. You can include the generated CSS in `dist/index.html` like this:\n\n```diff\n--- a/dist/index.html\n+++ b/dist/index.html\n@@ -3,6 +3,7 @@\n   <head>\n     <meta charset=\"utf-8\">\n     <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n+    <link rel=\"stylesheet\" href=\"./main.css\">\n     <title>Bootstrap w/ Webpack</title>\n   </head>\n   <body>\n```\n\n### Extracting SVG files\n\nBootstrap’s CSS includes multiple references to SVG files via inline `data:` URIs. If you define a Content Security Policy for your project that blocks `data:` URIs for images, then these SVG files will not load. You can get around this problem by extracting the inline SVG files using Webpack’s asset modules feature.\n\nConfigure Webpack to extract inline SVG files like this:\n\n```diff\n--- a/webpack.config.js\n+++ b/webpack.config.js\n@@ -23,6 +23,14 @@ module.exports = {\n   },\n   module: {\n     rules: [\n+      {\n+        mimetype: 'image/svg+xml',\n+        scheme: 'data',\n+        type: 'asset/resource',\n+        generator: {\n+          filename: 'icons/[hash].svg'\n+        }\n+      },\n       {\n         test: /\\.(scss)$/,\n         use: [\n```\n\nAfter running `npm run build` again, you’ll find the SVG files extracted into `dist/icons` and properly referenced from CSS.\n\n<GuideFooter />\n"
  },
  {
    "path": "site/src/content/docs/helpers/clearfix.mdx",
    "content": "---\ntitle: Clearfix\ndescription: Quickly and easily clear floated content within a container by adding a clearfix utility.\naliases: \"/docs/[[config:docs_version]]/helpers/\"\n---\n\nEasily clear `float`s by adding `.clearfix` **to the parent element**. Can also be used as a mixin.\n\nUse in HTML:\n\n```html\n<div class=\"clearfix\">...</div>\n```\n\nThe mixin source code:\n\n<ScssDocs name=\"clearfix\" file=\"scss/mixins/_clearfix.scss\" />\n\nUse the mixin in SCSS:\n\n```scss\n.element {\n  @include clearfix;\n}\n```\n\nThe following example shows how the clearfix can be used. Without the clearfix the wrapping div would not span around the buttons which would cause a broken layout.\n\n<Example code={`<div class=\"bg-info clearfix\">\n    <button type=\"button\" class=\"btn btn-secondary float-start\">Example Button floated left</button>\n    <button type=\"button\" class=\"btn btn-secondary float-end\">Example Button floated right</button>\n  </div>`} />\n"
  },
  {
    "path": "site/src/content/docs/helpers/color-background.mdx",
    "content": "---\ntitle: Color and background\ndescription: Set a background color with contrasting foreground color.\ntoc: true\nadded:\n  version: \"5.2\"\n---\n\nimport { getData } from '@libs/data'\n\n## Overview\n\nColor and background helpers combine the power of our [`.text-*` utilities]([[docsref:/utilities/colors]]) and [`.bg-*` utilities]([[docsref:/utilities/background]]) in one class. Using our Sass `color-contrast()` function, we automatically determine a contrasting `color` for a particular `background-color`.\n\n<Callout type=\"warning\">\n**Heads up!** There’s currently no support for a CSS-native `color-contrast` function, so we use our own via Sass. This means that customizing our theme colors via CSS variables may cause color contrast issues with these utilities.\n</Callout>\n\n<Example code={getData('theme-colors').map((themeColor) => `<div class=\"text-bg-${themeColor.name} p-3\">${themeColor.title} with contrasting color</div>`)} />\n\n<Callout name=\"warning-color-assistive-technologies\" />\n\n## With components\n\nUse them in place of combined `.text-*` and `.bg-*` classes, like on [badges]([[docsref:/components/badge#background-colors]]):\n\n<Example code={`<span class=\"badge text-bg-primary\">Primary</span>\n<span class=\"badge text-bg-info\">Info</span>`} />\n\nOr on [cards]([[docsref:/components/card#background-and-color]]):\n\n<Example code={`<div class=\"card text-bg-primary mb-3\" style=\"max-width: 18rem;\">\n    <div class=\"card-header\">Header</div>\n    <div class=\"card-body\">\n      <p class=\"card-text\">Some quick example text to build on the card title and make up the bulk of the card’s content.</p>\n    </div>\n  </div>\n  <div class=\"card text-bg-info mb-3\" style=\"max-width: 18rem;\">\n    <div class=\"card-header\">Header</div>\n    <div class=\"card-body\">\n      <p class=\"card-text\">Some quick example text to build on the card title and make up the bulk of the card’s content.</p>\n    </div>\n  </div>`} />\n"
  },
  {
    "path": "site/src/content/docs/helpers/colored-links.mdx",
    "content": "---\ntitle: Colored links\ndescription: Colored links with hover states\ntoc: true\n---\n\nimport { getData } from '@libs/data'\n\n## Link colors\n\nYou can use the `.link-*` classes to colorize links. Unlike the [`.text-*` classes]([[docsref:/utilities/colors]]), these classes have a `:hover` and `:focus` state. Some of the link styles use a relatively light foreground color, and should only be used on a dark background in order to have sufficient contrast.\n\n<Callout>\n**Heads up!** `.link-body-emphasis` is currently the only colored link that adapts to color modes. It’s treated as a special case until v6 arrives and we can more thoroughly rebuild our theme colors for color modes. Until then, it’s a unique, high-contrast link color with custom `:hover` and `:focus` styles. However, it still responds to the new link utilities.\n</Callout>\n\n<Example code={[\n  ...getData('theme-colors').map((themeColor) => `<p><a href=\"#\" class=\"link-${themeColor.name}\">${themeColor.title} link</a></p>`),\n  `<p><a href=\"#\" class=\"link-body-emphasis\">Emphasis link</a></p>`\n]} />\n\n<Callout name=\"warning-color-assistive-technologies\" />\n\n## Link utilities\n\n<AddedIn version=\"5.3.0\"/>\n\nColored links can also be modified by our [link utilities]([[docsref:/utilities/link/]]).\n\n<Example code={[\n  ...getData('theme-colors').map((themeColor) => `<p><a href=\"#\" class=\"link-${themeColor.name} link-offset-2 link-underline-opacity-25 link-underline-opacity-100-hover\">${themeColor.title} link</a></p>`),\n  `<p><a href=\"#\" class=\"link-body-emphasis link-offset-2 link-underline-opacity-25 link-underline-opacity-75-hover\">Emphasis link</a></p>`\n]} />\n"
  },
  {
    "path": "site/src/content/docs/helpers/focus-ring.mdx",
    "content": "---\ntitle: Focus ring\ndescription: Utility classes that allows you to add and modify custom focus ring styles to elements and components.\ntoc: true\nadded:\n  version: \"5.3\"\n---\n\nimport { getData } from '@libs/data'\n\nThe `.focus-ring` helper removes the default `outline` on `:focus`, replacing it with a `box-shadow` that can be more broadly customized. The new shadow is made up of a series of CSS variables, inherited from the `:root` level, that can be modified for any element or component.\n\n## Example\n\nClick directly on the link below to see the focus ring in action, or into the example below and then press <kbd>Tab</kbd>.\n\n<Example code={`<a href=\"#\" class=\"d-inline-flex focus-ring py-1 px-2 text-decoration-none border rounded-2\">\n    Custom focus ring\n  </a>`} />\n\n## Customize\n\nModify the styling of a focus ring with our CSS variables, Sass variables, utilities, or custom styles.\n\n### CSS variables\n\nModify the `--bs-focus-ring-*` CSS variables as needed to change the default appearance.\n\n<Example code={`<a href=\"#\" class=\"d-inline-flex focus-ring py-1 px-2 text-decoration-none border rounded-2\" style=\"--bs-focus-ring-color: rgba(var(--bs-success-rgb), .25)\">\n    Green focus ring\n  </a>`} />\n\n`.focus-ring` sets styles via global CSS variables that can be overridden on any parent element, as shown above. These variables are generated from their Sass variable counterparts.\n\n<ScssDocs name=\"root-focus-variables\" file=\"scss/_root.scss\" />\n\nBy default, there is no `--bs-focus-ring-x`, `--bs-focus-ring-y`, or `--bs-focus-ring-blur`, but we provide CSS variables with fallbacks to initial `0` values. Modify them to change the default appearance.\n\n<Example code={`<a href=\"#\" class=\"d-inline-flex focus-ring py-1 px-2 text-decoration-none border rounded-2\" style=\"--bs-focus-ring-x: 10px; --bs-focus-ring-y: 10px; --bs-focus-ring-blur: 4px\">\n    Blurry offset focus ring\n  </a>`} />\n\n### Sass variables\n\nCustomize the focus ring Sass variables to modify all usage of the focus ring styles across your Bootstrap-powered project.\n\n<ScssDocs name=\"focus-ring-variables\" file=\"scss/_variables.scss\" />\n\n### Sass utilities API\n\nIn addition to `.focus-ring`, we have several `.focus-ring-*` utilities to modify the helper class defaults. Modify the color with any of our [theme colors]([[docsref:/customize/color#theme-colors]]). Note that the light and dark variants may not be visible on all background colors given current color mode support.\n\n<Example code={getData('theme-colors').map((themeColor) => `<p><a href=\"#\" class=\"d-inline-flex focus-ring focus-ring-${themeColor.name} py-1 px-2 text-decoration-none border rounded-2\">${themeColor.title} focus</a></p>`)} />\n\nFocus ring utilities are declared in our utilities API in `scss/_utilities.scss`. [Learn how to use the utilities API.]([[docsref:/utilities/api#using-the-api]])\n\n<ScssDocs name=\"utils-focus-ring\" file=\"scss/_utilities.scss\" />\n"
  },
  {
    "path": "site/src/content/docs/helpers/icon-link.mdx",
    "content": "---\ntitle: Icon link\ndescription: Quickly create stylized hyperlinks with Bootstrap Icons or other icons.\ntoc: true\nadded:\n  version: \"5.3\"\n---\n\nThe icon link helper component modifies our default link styles to enhance their appearance and quickly align any pairing of icon and text. Alignment is set via inline flexbox styling and a default `gap` value. We stylize the underline with a custom offset and color. Icons are automatically sized to `1em` to best match their associated text’s `font-size`.\n\nIcon links assume [Bootstrap Icons](https://icons.getbootstrap.com) are being used, but you can use any icon or image you like.\n\n<Callout>\nWhen icons are purely decorative, they should be hidden from assistive technologies using `aria-hidden=\"true\"`, as we’ve done in our examples. For icons that convey meaning, provide an appropriate text alternative by adding `role=\"img\"` and an appropriate `aria-label=\"...\"` to the SVGs.\n</Callout>\n\n## Example\n\nTake a regular `<a>` element, add `.icon-link`, and insert an icon on either the left or right of your link text. The icon is automatically sized, placed, and colored.\n\n<Example code={`<a class=\"icon-link\" href=\"#\">\n    <svg xmlns=\"http://www.w3.org/2000/svg\" class=\"bi\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n      <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\"/>\n    </svg>\n    Icon link\n  </a>`} />\n\n<Example code={`<a class=\"icon-link\" href=\"#\">\n    Icon link\n    <svg xmlns=\"http://www.w3.org/2000/svg\" class=\"bi\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n      <path 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\"/>\n    </svg>\n  </a>`} />\n\n## Style on hover\n\nAdd `.icon-link-hover` to move the icon to the right on hover.\n\n<Example code={`<a class=\"icon-link icon-link-hover\" href=\"#\">\n    Icon link\n    <svg xmlns=\"http://www.w3.org/2000/svg\" class=\"bi\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n      <path 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\"/>\n    </svg>\n  </a>`} />\n\n## Customize\n\nModify the styling of an icon link with our link CSS variables, Sass variables, utilities, or custom styles.\n\n### CSS variables\n\nModify the `--bs-link-*` and `--bs-icon-link-*` CSS variables as needed to change the default appearance.\n\nCustomize the hover `transform` by overriding the `--bs-icon-link-transform` CSS variable:\n\n<Example code={`<a class=\"icon-link icon-link-hover\" style=\"--bs-icon-link-transform: translate3d(0, -.125rem, 0);\" href=\"#\">\n    <svg xmlns=\"http://www.w3.org/2000/svg\" class=\"bi\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n      <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\"/>\n      <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\"/>\n    </svg>\n    Icon link\n  </a>`} />\n\nCustomize the color by overriding the `--bs-link-*` CSS variable:\n\n<Example code={`<a class=\"icon-link icon-link-hover\" style=\"--bs-link-hover-color-rgb: 25, 135, 84;\" href=\"#\">\n    Icon link\n    <svg xmlns=\"http://www.w3.org/2000/svg\" class=\"bi\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n      <path 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\"/>\n    </svg>\n  </a>`} />\n\n### Sass variables\n\nCustomize the icon link Sass variables to modify all icon link styles across your Bootstrap-powered project.\n\n<ScssDocs name=\"icon-link-variables\" file=\"scss/_variables.scss\" />\n\n### Sass utilities API\n\nModify icon links with any of [our link utilities]([[docsref:/utilities/link/]]) for modifying underline color and offset.\n\n<Example code={`<a class=\"icon-link icon-link-hover link-success link-underline-success link-underline-opacity-25\" href=\"#\">\n    Icon link\n    <svg xmlns=\"http://www.w3.org/2000/svg\" class=\"bi\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n      <path 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\"/>\n    </svg>\n  </a>`} />\n"
  },
  {
    "path": "site/src/content/docs/helpers/position.mdx",
    "content": "---\ntitle: Position\ndescription: Use these helpers for quickly configuring the position of an element.\ntoc: true\n---\n\n## Fixed top\n\nPosition an element at the top of the viewport, from edge to edge. Be sure you understand the ramifications of fixed position in your project; you may need to add additional CSS.\n\n```html\n<div class=\"fixed-top\">...</div>\n```\n\n## Fixed bottom\n\nPosition an element at the bottom of the viewport, from edge to edge. Be sure you understand the ramifications of fixed position in your project; you may need to add additional CSS.\n\n```html\n<div class=\"fixed-bottom\">...</div>\n```\n\n## Sticky top\n\nPosition an element at the top of the viewport, from edge to edge, but only after you scroll past it.\n\n```html\n<div class=\"sticky-top\">...</div>\n```\n\n## Responsive sticky top\n\nResponsive variations also exist for `.sticky-top` utility.\n\n```html\n<div class=\"sticky-sm-top\">Stick to the top on viewports sized SM (small) or wider</div>\n<div class=\"sticky-md-top\">Stick to the top on viewports sized MD (medium) or wider</div>\n<div class=\"sticky-lg-top\">Stick to the top on viewports sized LG (large) or wider</div>\n<div class=\"sticky-xl-top\">Stick to the top on viewports sized XL (extra-large) or wider</div>\n<div class=\"sticky-xxl-top\">Stick to the top on viewports sized XXL (extra-extra-large) or wider</div>\n```\n\n## Sticky bottom\n\nPosition an element at the bottom of the viewport, from edge to edge, but only after you scroll past it.\n\n```html\n<div class=\"sticky-bottom\">...</div>\n```\n\n## Responsive sticky bottom\n\nResponsive variations also exist for `.sticky-bottom` utility.\n\n```html\n<div class=\"sticky-sm-bottom\">Stick to the bottom on viewports sized SM (small) or wider</div>\n<div class=\"sticky-md-bottom\">Stick to the bottom on viewports sized MD (medium) or wider</div>\n<div class=\"sticky-lg-bottom\">Stick to the bottom on viewports sized LG (large) or wider</div>\n<div class=\"sticky-xl-bottom\">Stick to the bottom on viewports sized XL (extra-large) or wider</div>\n<div class=\"sticky-xxl-bottom\">Stick to the bottom on viewports sized XXL (extra-extra-large) or wider</div>\n```\n"
  },
  {
    "path": "site/src/content/docs/helpers/ratio.mdx",
    "content": "---\ntitle: Ratios\ndescription: Use generated pseudo elements to make an element maintain the aspect ratio of your choosing. Perfect for responsively handling video or slideshow embeds based on the width of the parent.\ntoc: true\n---\n\n## About\n\nUse the ratio helper to manage the aspect ratios of external content like `<iframe>`s, `<embed>`s, `<video>`s, and `<object>`s. These helpers also can be used on any standard HTML child element (e.g., a `<div>` or `<img>`). Styles are applied from the parent `.ratio` class directly to the child.\n\nAspect ratios are declared in a Sass map and included in each class via CSS variable, which also allows [custom aspect ratios](#custom-ratios).\n\n<Callout>\n**Pro-Tip!** You don’t need `frameborder=\"0\"` on your `<iframe>`s as we override that for you in [Reboot]([[docsref:/content/reboot]]).\n</Callout>\n\n## Example\n\nWrap any embed, like an `<iframe>`, in a parent element with `.ratio` and an aspect ratio class. The immediate child element is automatically sized thanks to our universal selector `.ratio > *`.\n\n<Example code={`<div class=\"ratio ratio-16x9\">\n    <iframe src=\"https://www.youtube.com/embed/zpOULjyy-n8?rel=0\" title=\"YouTube video\" allowfullscreen></iframe>\n  </div>`} />\n\n## Aspect ratios\n\nAspect ratios can be customized with modifier classes. By default the following ratio classes are provided:\n\n<Example class=\"bd-example-ratios\" code={`<div class=\"ratio ratio-1x1\">\n    <div>1x1</div>\n  </div>\n  <div class=\"ratio ratio-4x3\">\n    <div>4x3</div>\n  </div>\n  <div class=\"ratio ratio-16x9\">\n    <div>16x9</div>\n  </div>\n  <div class=\"ratio ratio-21x9\">\n    <div>21x9</div>\n  </div>`} />\n\n## Custom ratios\n\nEach `.ratio-*` class includes a CSS custom property (or CSS variable) in the selector. You can override this CSS variable to create custom aspect ratios on the fly with some quick math on your part.\n\nFor example, to create a 2x1 aspect ratio, set `--bs-aspect-ratio: 50%` on the `.ratio`.\n\n<Example class=\"bd-example-ratios\" code={`<div class=\"ratio\" style=\"--bs-aspect-ratio: 50%;\">\n    <div>2x1</div>\n  </div>`} />\n\nThis CSS variable makes it easy to modify the aspect ratio across breakpoints. The following is 4x3 to start, but changes to a custom 2x1 at the medium breakpoint.\n\n```scss\n.ratio-4x3 {\n  @include media-breakpoint-up(md) {\n    --bs-aspect-ratio: 50%; // 2x1\n  }\n}\n```\n\n<Example class=\"bd-example-ratios bd-example-ratios-breakpoint\" code={`<div class=\"ratio ratio-4x3\">\n    <div>4x3, then 2x1</div>\n  </div>`} />\n\n\n## Sass maps\n\nWithin `_variables.scss`, you can change the aspect ratios you want to use. Here’s our default `$ratio-aspect-ratios` map. Modify the map as you like and recompile your Sass to put them to use.\n\n<ScssDocs name=\"aspect-ratios\" file=\"scss/_variables.scss\" />\n"
  },
  {
    "path": "site/src/content/docs/helpers/stacks.mdx",
    "content": "---\ntitle: Stacks\ndescription: Shorthand helpers that build on top of our flexbox utilities to make component layout faster and easier than ever.\ntoc: true\nadded:\n  version: \"5.1\"\n---\n\nStacks offer a shortcut for applying a number of flexbox properties to quickly and easily create layouts in Bootstrap. All credit for the concept and implementation goes to the open source [Pylon project](https://almonk.github.io/pylon/).\n\n<Callout type=\"warning\">\n**Heads up!** Support for gap utilities with flexbox isn’t available in Safari prior to 14.5, so consider verifying your intended browser support. Grid layout should have no issues. [Read more](https://caniuse.com/flexbox-gap).\n</Callout>\n\n## Vertical\n\nUse `.vstack` to create vertical layouts. Stacked items are full-width by default. Use `.gap-*` utilities to add space between items.\n\n<Example class=\"bd-example-flex\" code={`<div class=\"vstack gap-3\">\n    <div class=\"p-2\">First item</div>\n    <div class=\"p-2\">Second item</div>\n    <div class=\"p-2\">Third item</div>\n  </div>`} />\n\n## Horizontal\n\nUse `.hstack` for horizontal layouts. Stacked items are vertically centered by default and only take up their necessary width. Use `.gap-*` utilities to add space between items.\n\n<Example class=\"bd-example-flex\" code={`<div class=\"hstack gap-3\">\n    <div class=\"p-2\">First item</div>\n    <div class=\"p-2\">Second item</div>\n    <div class=\"p-2\">Third item</div>\n  </div>`} />\n\nUsing horizontal margin utilities like `.ms-auto` as spacers:\n\n<Example class=\"bd-example-flex\" code={`<div class=\"hstack gap-3\">\n    <div class=\"p-2\">First item</div>\n    <div class=\"p-2 ms-auto\">Second item</div>\n    <div class=\"p-2\">Third item</div>\n  </div>`} />\n\nAnd with [vertical rules]([[docsref:/helpers/vertical-rule]]):\n\n<Example class=\"bd-example-flex\" code={`<div class=\"hstack gap-3\">\n    <div class=\"p-2\">First item</div>\n    <div class=\"p-2 ms-auto\">Second item</div>\n    <div class=\"vr\"></div>\n    <div class=\"p-2\">Third item</div>\n  </div>`} />\n\n## Examples\n\nUse `.vstack` to stack buttons and other elements:\n\n<Example code={`<div class=\"vstack gap-2 col-md-5 mx-auto\">\n    <button type=\"button\" class=\"btn btn-secondary\">Save changes</button>\n    <button type=\"button\" class=\"btn btn-outline-secondary\">Cancel</button>\n  </div>`} />\n\nCreate an inline form with `.hstack`:\n\n<Example code={`<div class=\"hstack gap-3\">\n    <input class=\"form-control me-auto\" type=\"text\" placeholder=\"Add your item here...\" aria-label=\"Add your item here...\">\n    <button type=\"button\" class=\"btn btn-secondary\">Submit</button>\n    <div class=\"vr\"></div>\n    <button type=\"button\" class=\"btn btn-outline-danger\">Reset</button>\n  </div>`} />\n\n## CSS\n\n<ScssDocs name=\"stacks\" file=\"scss/helpers/_stacks.scss\" />\n"
  },
  {
    "path": "site/src/content/docs/helpers/stretched-link.mdx",
    "content": "---\ntitle: Stretched link\ndescription: Make any HTML element or Bootstrap component clickable by “stretching” a nested link via CSS.\n---\n\nAdd `.stretched-link` to a link to make its [containing block](https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block) clickable via a `::after` pseudo element. In most cases, this means that an element with `position: relative;` that contains a link with the `.stretched-link` class is clickable. Please note given [how CSS `position` works](https://www.w3.org/TR/CSS21/visuren.html#propdef-position), `.stretched-link` cannot be mixed with most table elements.\n\nCards have `position: relative` by default in Bootstrap, so in this case you can safely add the `.stretched-link` class to a link in the card without any other HTML changes.\n\nMultiple links and tap targets are not recommended with stretched links. However, some `position` and `z-index` styles can help should this be required.\n\n<Example code={`<div class=\"card\" style=\"width: 18rem;\">\n    <Placeholder width=\"100%\" height=\"180\" class=\"card-img-top\" text={false} title=\"Card image cap\" />\n    <div class=\"card-body\">\n      <h5 class=\"card-title\">Card with stretched link</h5>\n      <p class=\"card-text\">Some quick example text to build on the card title and make up the bulk of the card’s content.</p>\n      <a href=\"#\" class=\"btn btn-primary stretched-link\">Go somewhere</a>\n    </div>\n  </div>`} />\n\nMost custom components do not have `position: relative` by default, so we need to add the `.position-relative` here to prevent the link from stretching outside the parent element.\n\n<Example code={`<div class=\"d-flex position-relative\">\n    <Placeholder width=\"144\" height=\"144\" class=\"flex-shrink-0 me-3\" text={false} title=\"Generic placeholder image22222\" />\n    <div>\n      <h5 class=\"mt-0\">Custom component with stretched link</h5>\n      <p>This is some placeholder content for the custom component. It is intended to mimic what some real-world content would look like, and we’re using it here to give the component a bit of body and size.</p>\n      <a href=\"#\" class=\"stretched-link\">Go somewhere</a>\n    </div>\n  </div>`} />\n\n<Example code={`<div class=\"row g-0 bg-body-secondary position-relative\">\n    <div class=\"col-md-6 mb-md-0 p-md-4\">\n      <Placeholder width=\"100%\" height=\"200\" class=\"w-100\" text={false} title=\"Generic placeholder image\" />\n    </div>\n    <div class=\"col-md-6 p-4 ps-md-0\">\n      <h5 class=\"mt-0\">Columns with stretched link</h5>\n      <p>Another instance of placeholder content for this other custom component. It is intended to mimic what some real-world content would look like, and we’re using it here to give the component a bit of body and size.</p>\n      <a href=\"#\" class=\"stretched-link\">Go somewhere</a>\n    </div>\n  </div>`} />\n\n## Identifying the containing block\n\nIf the stretched link doesn’t seem to work, the [containing block](https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#Identifying_the_containing_block) will probably be the cause. The following CSS properties will make an element the containing block:\n\n- A `position` value other than `static`\n- A `transform` or `perspective` value other than `none`\n- A `will-change` value of `transform` or `perspective`\n- A `filter` value other than `none` or a `will-change` value of `filter` (only works on Firefox)\n\n<Example code={`<div class=\"card\" style=\"width: 18rem;\">\n    <Placeholder width=\"100%\" height=\"180\" class=\"card-img-top\" text={false} title=\"Card image cap\" />\n    <div class=\"card-body\">\n      <h5 class=\"card-title\">Card with stretched links</h5>\n      <p class=\"card-text\">Some quick example text to build on the card title and make up the bulk of the card’s content.</p>\n      <p class=\"card-text\">\n        <a href=\"#\" class=\"stretched-link text-danger\" style=\"position: relative;\">Stretched link will not work here, because <code>position: relative</code> is added to the link</a>\n      </p>\n      <p class=\"card-text bg-body-tertiary\" style=\"transform: rotate(0);\">\n        This <a href=\"#\" class=\"text-warning stretched-link\">stretched link</a> will only be spread over the <code>p</code>-tag, because a transform is applied to it.\n      </p>\n    </div>\n  </div>`} />\n"
  },
  {
    "path": "site/src/content/docs/helpers/text-truncation.mdx",
    "content": "---\ntitle: Text truncation\ndescription: Truncate long strings of text with an ellipsis.\ntoc: false\n---\n\nFor longer content, you can add a `.text-truncate` class to truncate the text with an ellipsis. **Requires `display: inline-block` or `display: block`.**\n\n<Example code={`<!-- Block level -->\n  <div class=\"row\">\n    <div class=\"col-2 text-truncate\">\n      This text is quite long, and will be truncated once displayed.\n    </div>\n  </div>\n\n  <!-- Inline level -->\n  <span class=\"d-inline-block text-truncate\" style=\"max-width: 150px;\">\n    This text is quite long, and will be truncated once displayed.\n  </span>`} />\n"
  },
  {
    "path": "site/src/content/docs/helpers/vertical-rule.mdx",
    "content": "---\ntitle: Vertical rule\ndescription: Use the custom vertical rule helper to create vertical dividers like the `<hr>` element.\ntoc: true\nadded:\n  version: \"5.1\"\n---\n\n## How it works\n\nVertical rules are inspired by the `<hr>` element, allowing you to create vertical dividers in common layouts. They’re styled just like `<hr>` elements:\n\n- They’re `1px` wide\n- They have `min-height` of `1em`\n- Their color is set via `currentColor` and `opacity`\n\nCustomize them with additional styles as needed.\n\n## Example\n\n<Example code={`<div class=\"vr\"></div>`} />\n\nVertical rules scale their height in flex layouts:\n\n<Example code={`<div class=\"d-flex\" style=\"height: 200px;\">\n    <div class=\"vr\"></div>\n  </div>`} />\n\n## With stacks\n\nThey can also be used in [stacks]([[docsref:/helpers/stacks]]):\n\n<Example class=\"bd-example-flex\" code={`<div class=\"hstack gap-3\">\n    <div class=\"p-2\">First item</div>\n    <div class=\"p-2 ms-auto\">Second item</div>\n    <div class=\"vr\"></div>\n    <div class=\"p-2\">Third item</div>\n  </div>`} />\n\n## CSS\n\n### Sass variables\n\nCustomize the vertical rule Sass variable to change its width.\n\n<ScssDocs name=\"vr-variables\" file=\"scss/_variables.scss\" />\n"
  },
  {
    "path": "site/src/content/docs/helpers/visually-hidden.mdx",
    "content": "---\ntitle: Visually hidden\ndescription: Use these helpers to visually hide elements but keep them accessible to assistive technologies.\naliases: \"/docs/[[config:docs_version]]/helpers/screen-readers/\"\n---\n\nVisually hide an element while still allowing it to be exposed to assistive technologies (such as screen readers) with `.visually-hidden`. Use `.visually-hidden-focusable` to visually hide an element by default, but to display it when it’s focused (e.g. by a keyboard-only user). `.visually-hidden-focusable` can also be applied to a container–thanks to `:focus-within`, the container will be displayed when any child element of the container receives focus.\n\n<Example code={`<h2 class=\"visually-hidden\">Title for screen readers</h2>\n  <a class=\"visually-hidden-focusable\" href=\"#content\">Skip to main content</a>\n  <div class=\"visually-hidden-focusable\">A container with a <a href=\"#\">focusable element</a>.</div>`} />\n\nBoth `visually-hidden` and `visually-hidden-focusable` can also be used as mixins.\n\n```scss\n// Usage as a mixin\n\n.visually-hidden-title {\n  @include visually-hidden;\n}\n\n.skip-navigation {\n  @include visually-hidden-focusable;\n}\n```\n"
  },
  {
    "path": "site/src/content/docs/layout/breakpoints.mdx",
    "content": "---\ntitle: Breakpoints\ndescription: Breakpoints are customizable widths that determine how your responsive layout behaves across device or viewport sizes in Bootstrap.\naliases: \"/docs/[[config:docs_version]]/layout/\"\ntoc: true\n---\n\n## Core concepts\n\n- **Breakpoints are the building blocks of responsive design.** Use them to control when your layout can be adapted at a particular viewport or device size.\n\n- **Use media queries to architect your CSS by breakpoint.** Media queries are a feature of CSS that allow you to conditionally apply styles based on a set of browser and operating system parameters. We most commonly use `min-width` in our media queries.\n\n- **Mobile first, responsive design is the goal.** Bootstrap’s CSS aims to apply the bare minimum of styles to make a layout work at the smallest breakpoint, and then layers on styles to adjust that design for larger devices. This optimizes your CSS, improves rendering time, and provides a great experience for your visitors.\n\n## Available breakpoints\n\nBootstrap includes six default breakpoints, sometimes referred to as _grid tiers_, for building responsively. These breakpoints can be customized if you’re using our source Sass files.\n\n<BsTable>\n| Breakpoint | Class infix | Dimensions |\n| --- | --- | --- |\n| Extra small | <em>None</em> |&lt;576px |\n| Small | `sm` | &ge;576px |\n| Medium | `md` | &ge;768px |\n| Large | `lg` | &ge;992px |\n| Extra large | `xl` | &ge;1200px |\n| Extra extra large | `xxl` | &ge;1400px |\n</BsTable>\n\n\nEach breakpoint was chosen to comfortably hold containers whose widths are multiples of 12. Breakpoints are also representative of a subset of common device sizes and viewport dimensions—they don’t specifically target every use case or device. Instead, the ranges provide a strong and consistent foundation to build on for nearly any device.\n\nThese breakpoints are customizable via Sass—you’ll find them in a Sass map in our `_variables.scss` stylesheet.\n\n<ScssDocs name=\"grid-breakpoints\" file=\"scss/_variables.scss\" />\n\nFor more information and examples on how to modify our Sass maps and variables, please refer to [the CSS section of the Grid documentation]([[docsref:/layout/grid#css]]).\n\n## Media queries\n\nSince Bootstrap is developed to be mobile first, we use a handful of [media queries](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_media_queries/Using_media_queries) to create sensible breakpoints for our layouts and interfaces. These breakpoints are mostly based on minimum viewport widths and allow us to scale up elements as the viewport changes.\n\n### Min-width\n\nBootstrap primarily uses the following media query ranges—or breakpoints—in our source Sass files for our layout, grid system, and components.\n\n```scss\n// Source mixins\n\n// No media query necessary for xs breakpoint as it’s effectively `@media (min-width: 0) { ... }`\n@include media-breakpoint-up(sm) { ... }\n@include media-breakpoint-up(md) { ... }\n@include media-breakpoint-up(lg) { ... }\n@include media-breakpoint-up(xl) { ... }\n@include media-breakpoint-up(xxl) { ... }\n\n// Usage\n\n// Example: Hide starting at `min-width: 0`, and then show at the `sm` breakpoint\n.custom-class {\n  display: none;\n}\n@include media-breakpoint-up(sm) {\n  .custom-class {\n    display: block;\n  }\n}\n```\n\nThese Sass mixins translate in our compiled CSS using the values declared in our Sass variables. For example:\n\n```scss\n// X-Small devices (portrait phones, less than 576px)\n// No media query for `xs` since this is the default in Bootstrap\n\n// Small devices (landscape phones, 576px and up)\n@media (min-width: 576px) { ... }\n\n// Medium devices (tablets, 768px and up)\n@media (min-width: 768px) { ... }\n\n// Large devices (desktops, 992px and up)\n@media (min-width: 992px) { ... }\n\n// X-Large devices (large desktops, 1200px and up)\n@media (min-width: 1200px) { ... }\n\n// XX-Large devices (larger desktops, 1400px and up)\n@media (min-width: 1400px) { ... }\n```\n\n### Max-width\n\nWe occasionally use media queries that go in the other direction (the given screen size _or smaller_):\n\n```scss\n// No media query necessary for xs breakpoint as it’s effectively `@media (max-width: 0) { ... }`\n@include media-breakpoint-down(sm) { ... }\n@include media-breakpoint-down(md) { ... }\n@include media-breakpoint-down(lg) { ... }\n@include media-breakpoint-down(xl) { ... }\n@include media-breakpoint-down(xxl) { ... }\n\n// Example: Style from medium breakpoint and down\n@include media-breakpoint-down(md) {\n  .custom-class {\n    display: block;\n  }\n}\n```\n\nThese mixins take those declared breakpoints, subtract `.02px` from them, and use them as our `max-width` values. For example:\n\n```scss\n// `xs` returns only a ruleset and no media query\n// ... { ... }\n\n// `sm` applies to x-small devices (portrait phones, less than 576px)\n@media (max-width: 575.98px) { ... }\n\n// `md` applies to small devices (landscape phones, less than 768px)\n@media (max-width: 767.98px) { ... }\n\n// `lg` applies to medium devices (tablets, less than 992px)\n@media (max-width: 991.98px) { ... }\n\n// `xl` applies to large devices (desktops, less than 1200px)\n@media (max-width: 1199.98px) { ... }\n\n// `xxl` applies to x-large devices (large desktops, less than 1400px)\n@media (max-width: 1399.98px) { ... }\n```\n\n<Callout name=\"info-mediaqueries-breakpoints\" type=\"warning\" />\n\n### Single breakpoint\n\nThere are also media queries and mixins for targeting a single segment of screen sizes using the minimum and maximum breakpoint widths.\n\n```scss\n@include media-breakpoint-only(xs) { ... }\n@include media-breakpoint-only(sm) { ... }\n@include media-breakpoint-only(md) { ... }\n@include media-breakpoint-only(lg) { ... }\n@include media-breakpoint-only(xl) { ... }\n@include media-breakpoint-only(xxl) { ... }\n```\n\nFor example the `@include media-breakpoint-only(md) { ... }` will result in :\n\n```scss\n@media (min-width: 768px) and (max-width: 991.98px) { ... }\n```\n\n### Between breakpoints\n\nSimilarly, media queries may span multiple breakpoint widths:\n\n```scss\n@include media-breakpoint-between(md, xl) { ... }\n```\n\nWhich results in:\n\n```scss\n// Example\n// Apply styles starting from medium devices and up to extra large devices\n@media (min-width: 768px) and (max-width: 1199.98px) { ... }\n```\n"
  },
  {
    "path": "site/src/content/docs/layout/columns.mdx",
    "content": "---\ntitle: Columns\ndescription: Learn how to modify columns with a handful of options for alignment, ordering, and offsetting thanks to our flexbox grid system. Plus, see how to use column classes to manage widths of non-grid elements.\ntoc: true\n---\n\n<Callout>\n**Heads up!** Be sure to [read the Grid page]([[docsref:/layout/grid]]) first before diving into how to modify and customize your grid columns.\n</Callout>\n\n## How they work\n\n- **Columns build on the grid’s flexbox architecture.** Flexbox means we have options for changing individual columns and [modifying groups of columns at the row level]([[docsref:/layout/grid#row-columns]]). You choose how columns grow, shrink, or otherwise change.\n\n- **When building grid layouts, all content goes in columns.** The hierarchy of Bootstrap’s grid goes from [container]([[docsref:/layout/containers]]) to row to column to your content. On rare occasions, you may combine content and column, but be aware there can be unintended consequences.\n\n- **Bootstrap includes predefined classes for creating fast, responsive layouts.** With [six breakpoints]([[docsref:/layout/breakpoints]]) and a dozen columns at each grid tier, we have dozens of classes already built for you to create your desired layouts. This can be disabled via Sass if you wish.\n\n## Alignment\n\nUse flexbox alignment utilities to vertically and horizontally align columns.\n\n### Vertical alignment\n\nChange the vertical alignment with any of the responsive `align-items-*` classes.\n\n<Example class=\"bd-example-row bd-example-row-flex-cols\" code={`<div class=\"container text-center\">\n    <div class=\"row align-items-start\">\n      <div class=\"col\">\n        One of three columns\n      </div>\n      <div class=\"col\">\n        One of three columns\n      </div>\n      <div class=\"col\">\n        One of three columns\n      </div>\n    </div>\n  </div>`} />\n\n<Example class=\"bd-example-row bd-example-row-flex-cols\" code={`<div class=\"container text-center\">\n    <div class=\"row align-items-center\">\n      <div class=\"col\">\n        One of three columns\n      </div>\n      <div class=\"col\">\n        One of three columns\n      </div>\n      <div class=\"col\">\n        One of three columns\n      </div>\n    </div>\n  </div>`} />\n\n<Example class=\"bd-example-row bd-example-row-flex-cols\" code={`<div class=\"container text-center\">\n    <div class=\"row align-items-end\">\n      <div class=\"col\">\n        One of three columns\n      </div>\n      <div class=\"col\">\n        One of three columns\n      </div>\n      <div class=\"col\">\n        One of three columns\n      </div>\n    </div>\n  </div>`} />\n\nOr, change the alignment of each column individually with any of the responsive `.align-self-*` classes.\n\n<Example class=\"bd-example-row bd-example-row-flex-cols\" code={`<div class=\"container text-center\">\n    <div class=\"row\">\n      <div class=\"col align-self-start\">\n        One of three columns\n      </div>\n      <div class=\"col align-self-center\">\n        One of three columns\n      </div>\n      <div class=\"col align-self-end\">\n        One of three columns\n      </div>\n    </div>\n  </div>`} />\n\n### Horizontal alignment\n\nChange the horizontal alignment with any of the responsive `justify-content-*` classes.\n\n<Example class=\"bd-example-row\" code={`<div class=\"container text-center\">\n    <div class=\"row justify-content-start\">\n      <div class=\"col-4\">\n        One of two columns\n      </div>\n      <div class=\"col-4\">\n        One of two columns\n      </div>\n    </div>\n    <div class=\"row justify-content-center\">\n      <div class=\"col-4\">\n        One of two columns\n      </div>\n      <div class=\"col-4\">\n        One of two columns\n      </div>\n    </div>\n    <div class=\"row justify-content-end\">\n      <div class=\"col-4\">\n        One of two columns\n      </div>\n      <div class=\"col-4\">\n        One of two columns\n      </div>\n    </div>\n    <div class=\"row justify-content-around\">\n      <div class=\"col-4\">\n        One of two columns\n      </div>\n      <div class=\"col-4\">\n        One of two columns\n      </div>\n    </div>\n    <div class=\"row justify-content-between\">\n      <div class=\"col-4\">\n        One of two columns\n      </div>\n      <div class=\"col-4\">\n        One of two columns\n      </div>\n    </div>\n    <div class=\"row justify-content-evenly\">\n      <div class=\"col-4\">\n        One of two columns\n      </div>\n      <div class=\"col-4\">\n        One of two columns\n      </div>\n    </div>\n  </div>`} />\n\n### Column wrapping\n\nIf more than 12 columns are placed within a single row, each group of extra columns will, as one unit, wrap onto a new line.\n\n<Example class=\"bd-example-row\" code={`<div class=\"container\">\n    <div class=\"row\">\n      <div class=\"col-9\">.col-9</div>\n      <div class=\"col-4\">.col-4<br>Since 9 + 4 = 13 &gt; 12, this 4-column-wide div gets wrapped onto a new line as one contiguous unit.</div>\n      <div class=\"col-6\">.col-6<br>Subsequent columns continue along the new line.</div>\n    </div>\n  </div>`} />\n\n### Column breaks\n\nBreaking columns to a new line in flexbox requires a small hack: add an element with `width: 100%` wherever you want to wrap your columns to a new line. Normally this is accomplished with multiple `.row`s, but not every implementation method can account for this.\n\n<Example class=\"bd-example-row\" code={`<div class=\"container text-center\">\n    <div class=\"row\">\n      <div class=\"col-6 col-sm-3\">.col-6 .col-sm-3</div>\n      <div class=\"col-6 col-sm-3\">.col-6 .col-sm-3</div>\n\n      <!-- Force next columns to break to new line -->\n      <div class=\"w-100\"></div>\n\n      <div class=\"col-6 col-sm-3\">.col-6 .col-sm-3</div>\n      <div class=\"col-6 col-sm-3\">.col-6 .col-sm-3</div>\n    </div>\n  </div>`} />\n\nYou may also apply this break at specific breakpoints with our [responsive display utilities]([[docsref:/utilities/display]]).\n\n<Example class=\"bd-example-row\" code={`<div class=\"container text-center\">\n    <div class=\"row\">\n      <div class=\"col-6 col-sm-4\">.col-6 .col-sm-4</div>\n      <div class=\"col-6 col-sm-4\">.col-6 .col-sm-4</div>\n\n      <!-- Force next columns to break to new line at md breakpoint and up -->\n      <div class=\"w-100 d-none d-md-block\"></div>\n\n      <div class=\"col-6 col-sm-4\">.col-6 .col-sm-4</div>\n      <div class=\"col-6 col-sm-4\">.col-6 .col-sm-4</div>\n    </div>\n  </div>`} />\n\n## Reordering\n\n### Order classes\n\nUse `.order-` classes for controlling the **visual order** of your content. These classes are responsive, so you can set the `order` by breakpoint (e.g., `.order-1.order-md-2`). Includes support for `1` through `5` across all six grid tiers.\n\n<Example class=\"bd-example-row\" code={`<div class=\"container text-center\">\n    <div class=\"row\">\n      <div class=\"col\">\n        First in DOM, no order applied\n      </div>\n      <div class=\"col order-5\">\n        Second in DOM, with a larger order\n      </div>\n      <div class=\"col order-1\">\n        Third in DOM, with an order of 1\n      </div>\n    </div>\n  </div>`} />\n\nThere are also responsive `.order-first` and `.order-last` classes that change the `order` of an element by applying `order: -1` and `order: 6`, respectively. These classes can also be intermixed with the numbered `.order-*` classes as needed.\n\n<Example class=\"bd-example-row\" code={`<div class=\"container text-center\">\n    <div class=\"row\">\n      <div class=\"col order-last\">\n        First in DOM, ordered last\n      </div>\n      <div class=\"col\">\n        Second in DOM, unordered\n      </div>\n      <div class=\"col order-first\">\n        Third in DOM, ordered first\n      </div>\n    </div>\n  </div>`} />\n\n\nIf you need more `.order-*` classes, you can add new ones by modifying our `$utilities` Sass map. [Read our Sass maps and loops docs]([[docsref:/customize/sass#maps-and-loops]]) or [our Modify utilities docs]([[docsref:/utilities/api#modify-utilities]]) for details.\n\n```scss\n$utilities: map-merge(\n  $utilities,\n  (\n    \"order\": map-merge(\n      map-get($utilities, \"order\"),\n      (\n        values: map-merge(\n          map-get(map-get($utilities, \"order\"), \"values\"),\n          (\n            6: 6, // Add a new `.order-{breakpoint}-6` utility\n            last: 7 // Change the `.order-{breakpoint}-last` utility to use the next number\n          )\n        ),\n      ),\n    ),\n  )\n);\n```\n\n### Offsetting columns\n\nYou can offset grid columns in two ways: our responsive `.offset-` grid classes and our [margin utilities]([[docsref:/utilities/spacing]]). Grid classes are sized to match columns while margins are more useful for quick layouts where the width of the offset is variable.\n\n#### Offset classes\n\nMove columns to the right using `.offset-md-*` classes. These classes increase the left margin of a column by `*` columns. For example, `.offset-md-4` moves `.col-md-4` over four columns.\n\n<Example class=\"bd-example-row\" code={`<div class=\"container text-center\">\n    <div class=\"row\">\n      <div class=\"col-md-4\">.col-md-4</div>\n      <div class=\"col-md-4 offset-md-4\">.col-md-4 .offset-md-4</div>\n    </div>\n    <div class=\"row\">\n      <div class=\"col-md-3 offset-md-3\">.col-md-3 .offset-md-3</div>\n      <div class=\"col-md-3 offset-md-3\">.col-md-3 .offset-md-3</div>\n    </div>\n    <div class=\"row\">\n      <div class=\"col-md-6 offset-md-3\">.col-md-6 .offset-md-3</div>\n    </div>\n  </div>`} />\n\nIn addition to column clearing at responsive breakpoints, you may need to reset offsets. See this in action in [the grid example]([[docsref:/examples/grid/]]).\n\n<Example class=\"bd-example-row\" code={`<div class=\"container text-center\">\n    <div class=\"row\">\n      <div class=\"col-sm-5 col-md-6\">.col-sm-5 .col-md-6</div>\n      <div class=\"col-sm-5 offset-sm-2 col-md-6 offset-md-0\">.col-sm-5 .offset-sm-2 .col-md-6 .offset-md-0</div>\n    </div>\n    <div class=\"row\">\n      <div class=\"col-sm-6 col-md-5 col-lg-6\">.col-sm-6 .col-md-5 .col-lg-6</div>\n      <div class=\"col-sm-6 col-md-5 offset-md-2 col-lg-6 offset-lg-0\">.col-sm-6 .col-md-5 .offset-md-2 .col-lg-6 .offset-lg-0</div>\n    </div>\n  </div>`} />\n\n#### Margin utilities\n\nWith the move to flexbox in v4, you can use margin utilities like `.me-auto` to force sibling columns away from one another.\n\n<Example class=\"bd-example-row\" code={`<div class=\"container text-center\">\n    <div class=\"row\">\n      <div class=\"col-md-4\">.col-md-4</div>\n      <div class=\"col-md-4 ms-auto\">.col-md-4 .ms-auto</div>\n    </div>\n    <div class=\"row\">\n      <div class=\"col-md-3 ms-md-auto\">.col-md-3 .ms-md-auto</div>\n      <div class=\"col-md-3 ms-md-auto\">.col-md-3 .ms-md-auto</div>\n    </div>\n    <div class=\"row\">\n      <div class=\"col-auto me-auto\">.col-auto .me-auto</div>\n      <div class=\"col-auto\">.col-auto</div>\n    </div>\n  </div>`} />\n\n## Standalone column classes\n\nThe `.col-*` classes can also be used outside a `.row` to give an element a specific width. Whenever column classes are used as non-direct children of a row, the paddings are omitted.\n\n<Example class=\"bd-example-row\" code={`<div class=\"col-3 p-3 mb-2\">\n    .col-3: width of 25%\n  </div>\n\n  <div class=\"col-sm-9 p-3\">\n    .col-sm-9: width of 75% above sm breakpoint\n  </div>`} />\n\nThe classes can be used together with utilities to create responsive floated images. Make sure to wrap the content in a [`.clearfix`]([[docsref:/helpers/clearfix]]) wrapper to clear the float if the text is shorter.\n\n<Example code={`<div class=\"clearfix\">\n    <Placeholder width=\"100%\" height=\"210\" class=\"col-md-6 float-md-end mb-3 ms-md-3\" text=\"Responsive floated image\" />\n\n    <p>\n      A paragraph of placeholder text. We’re using it here to show the use of the clearfix class. We’re adding quite a few meaningless phrases here to demonstrate how the columns interact here with the floated image.\n    </p>\n\n    <p>\n      As you can see the paragraphs gracefully wrap around the floated image. Now imagine how this would look with some actual content in here, rather than just this boring placeholder text that goes on and on, but actually conveys no tangible information at. It simply takes up space and should not really be read.\n    </p>\n\n    <p>\n      And yet, here you are, still persevering in reading this placeholder text, hoping for some more insights, or some hidden easter egg of content. A joke, perhaps. Unfortunately, there’s none of that here.\n    </p>\n  </div>`} />\n"
  },
  {
    "path": "site/src/content/docs/layout/containers.mdx",
    "content": "---\ntitle: Containers\ndescription: Containers are a fundamental building block of Bootstrap that contain, pad, and align your content within a given device or viewport.\ntoc: true\n---\n\n## How they work\n\nContainers are the most basic layout element in Bootstrap and are **required when using our default grid system**. Containers are used to contain, pad, and (sometimes) center the content within them. While containers *can* be nested, most layouts do not require a nested container.\n\nBootstrap comes with three different containers:\n\n- `.container`, which sets a `max-width` at each responsive breakpoint\n- `.container-{breakpoint}`, which is `width: 100%` until the specified breakpoint\n- `.container-fluid`, which is `width: 100%` at all breakpoints\n\nThe table below illustrates how each container’s `max-width` compares to the original `.container` and `.container-fluid` across each breakpoint.\n\nSee them in action and compare them in our [Grid example]([[docsref:/examples/grid/#containers]]).\n\n<BsTable>\n|  | Extra small<div class=\"fw-normal\">&lt;576px</div> | Small<div class=\"fw-normal\">&ge;576px</div> | Medium<div class=\"fw-normal\">&ge;768px</div> | Large<div class=\"fw-normal\">&ge;992px</div> | X-Large<div class=\"fw-normal\">&ge;1200px</div> | XX-Large<div class=\"fw-normal\">&ge;1400px</div> |\n| --- | --- | --- | --- | --- | --- | --- |\n| `.container` | <span class=\"text-body-secondary\">100%</span> | 540px | 720px | 960px | 1140px | 1320px |\n| `.container-sm` | <span class=\"text-body-secondary\">100%</span> | 540px | 720px | 960px | 1140px | 1320px |\n| `.container-md` | <span class=\"text-body-secondary\">100%</span> | <span class=\"text-body-secondary\">100%</span> | 720px | 960px | 1140px | 1320px |\n| `.container-lg` | <span class=\"text-body-secondary\">100%</span> | <span class=\"text-body-secondary\">100%</span> | <span class=\"text-body-secondary\">100%</span> | 960px | 1140px | 1320px |\n| `.container-xl` | <span class=\"text-body-secondary\">100%</span> | <span class=\"text-body-secondary\">100%</span> | <span class=\"text-body-secondary\">100%</span> | <span class=\"text-body-secondary\">100%</span> | 1140px | 1320px |\n| `.container-xxl` | <span class=\"text-body-secondary\">100%</span> | <span class=\"text-body-secondary\">100%</span> | <span class=\"text-body-secondary\">100%</span> | <span class=\"text-body-secondary\">100%</span> | <span class=\"text-body-secondary\">100%</span> | 1320px |\n| `.container-fluid` | <span class=\"text-body-secondary\">100%</span> | <span class=\"text-body-secondary\">100%</span> | <span class=\"text-body-secondary\">100%</span> | <span class=\"text-body-secondary\">100%</span> | <span class=\"text-body-secondary\">100%</span> | <span class=\"text-body-secondary\">100%</span> |\n</BsTable>\n\n## Default container\n\nOur default `.container` class is a responsive, fixed-width container, meaning its `max-width` changes at each breakpoint.\n\n```html\n<div class=\"container\">\n  <!-- Content here -->\n</div>\n```\n\n## Responsive containers\n\nResponsive containers allow you to specify a class that is 100% wide until the specified breakpoint is reached, after which we apply `max-width`s for each of the higher breakpoints. For example, `.container-sm` is 100% wide to start until the `sm` breakpoint is reached, where it will scale up with `md`, `lg`, `xl`, and `xxl`.\n\n```html\n<div class=\"container-sm\">100% wide until small breakpoint</div>\n<div class=\"container-md\">100% wide until medium breakpoint</div>\n<div class=\"container-lg\">100% wide until large breakpoint</div>\n<div class=\"container-xl\">100% wide until extra large breakpoint</div>\n<div class=\"container-xxl\">100% wide until extra extra large breakpoint</div>\n```\n\n## Fluid containers\n\nUse `.container-fluid` for a full width container, spanning the entire width of the viewport.\n\n```html\n<div class=\"container-fluid\">\n  ...\n</div>\n```\n\n## CSS\n\n### Sass variables\n\nAs shown above, Bootstrap generates a series of predefined container classes to help you build the layouts you desire. You may customize these predefined container classes by modifying the Sass map (found in `_variables.scss`) that powers them:\n\n<ScssDocs name=\"container-max-widths\" file=\"scss/_variables.scss\" />\n\nFor more information and examples on how to modify our Sass maps and variables, please refer to [the Sass section of the Grid documentation]([[docsref:/layout/grid#css]]).\n\n### Sass mixins\n\nIn addition to customizing the Sass, you can also create your own containers with our Sass mixin.\n\n```scss\n// Source mixin\n@mixin make-container($padding-x: $container-padding-x) {\n  width: 100%;\n  padding-right: $padding-x;\n  padding-left: $padding-x;\n  margin-right: auto;\n  margin-left: auto;\n}\n\n// Usage\n.custom-container {\n  @include make-container();\n}\n```\n"
  },
  {
    "path": "site/src/content/docs/layout/css-grid.mdx",
    "content": "---\ntitle: CSS Grid\ndescription: Learn how to enable, use, and customize our alternate layout system built on CSS Grid with examples and code snippets.\ntoc: true\nadded:\n  version: \"5.1\"\n---\n\nBootstrap’s default grid system represents the culmination of over a decade of CSS layout techniques, tried and tested by millions of people. But, it was also created without many of the modern CSS features and techniques we’re seeing in browsers like the new CSS Grid.\n\n<Callout type=\"warning\">\n**Heads up—our CSS Grid system is experimental and opt-in as of v5.1.0!** We included it in our documentation’s CSS to demonstrate it for you, but it’s disabled by default. Keep reading to learn how to enable it in your projects.\n</Callout>\n\n## How it works\n\nWith Bootstrap 5, we’ve added the option to enable a separate grid system that’s built on CSS Grid, but with a Bootstrap twist. You still get classes you can apply on a whim to build responsive layouts, but with a different approach under the hood.\n\n- **CSS Grid is opt-in.** Disable the default grid system by setting `$enable-grid-classes: false` and enable the CSS Grid by setting `$enable-cssgrid: true`. Then, recompile your Sass.\n\n- **Replace instances of `.row` with `.grid`.** The `.grid` class sets `display: grid` and creates a `grid-template` that you build on with your HTML.\n\n- **Replace `.col-*` classes with `.g-col-*` classes.** This is because our CSS Grid columns use the `grid-column` property instead of `width`.\n\n- **Columns and gutter sizes are set via CSS variables.** Set these on the parent `.grid` and customize however you want, inline or in a stylesheet, with `--bs-columns` and `--bs-gap`.\n\nIn the future, Bootstrap will likely shift to a hybrid solution as the `gap` property has achieved nearly full browser support for flexbox.\n\n## Key differences\n\nCompared to the default grid system:\n\n- Flex utilities don’t affect the CSS Grid columns in the same way.\n\n- Gaps replaces gutters. The `gap` property replaces the horizontal `padding` from our default grid system and functions more like `margin`.\n\n- As such, unlike `.row`s, `.grid`s have no negative margins and margin utilities cannot be used to change the grid gutters. Grid gaps are applied horizontally and vertically by default. See the [customizing section](#customizing) for more details.\n\n- Inline and custom styles should be viewed as replacements for modifier classes (e.g., `style=\"--bs-columns: 3;\"` vs `class=\"row-cols-3\"`).\n\n- Nesting works similarly, but may require you to reset your column counts on each instance of a nested `.grid`. See the [nesting section](#nesting) for details.\n\n## Examples\n\n### Three columns\n\nThree equal-width columns across all viewports and devices can be created by using the `.g-col-4` classes. Add [responsive classes](#responsive) to change the layout by viewport size.\n\n<Example class=\"bd-example-cssgrid\" code={`<div class=\"grid text-center\">\n    <div class=\"g-col-4\">.g-col-4</div>\n    <div class=\"g-col-4\">.g-col-4</div>\n    <div class=\"g-col-4\">.g-col-4</div>\n  </div>`} />\n\n### Responsive\n\nUse responsive classes to adjust your layout across viewports. Here we start with two columns on the narrowest viewports, and then grow to three columns on medium viewports and above.\n\n<Example class=\"bd-example-cssgrid\" code={`<div class=\"grid text-center\">\n    <div class=\"g-col-6 g-col-md-4\">.g-col-6 .g-col-md-4</div>\n    <div class=\"g-col-6 g-col-md-4\">.g-col-6 .g-col-md-4</div>\n    <div class=\"g-col-6 g-col-md-4\">.g-col-6 .g-col-md-4</div>\n  </div>`} />\n\nCompare that to this two column layout at all viewports.\n\n<Example class=\"bd-example-cssgrid\" code={`<div class=\"grid text-center\">\n    <div class=\"g-col-6\">.g-col-6</div>\n    <div class=\"g-col-6\">.g-col-6</div>\n  </div>`} />\n\n## Wrapping\n\nGrid items automatically wrap to the next line when there’s no more room horizontally. Note that the `gap` applies to horizontal and vertical gaps between grid items.\n\n<Example class=\"bd-example-cssgrid\" code={`<div class=\"grid text-center\">\n    <div class=\"g-col-6\">.g-col-6</div>\n    <div class=\"g-col-6\">.g-col-6</div>\n\n    <div class=\"g-col-6\">.g-col-6</div>\n    <div class=\"g-col-6\">.g-col-6</div>\n  </div>`} />\n\n## Starts\n\nStart classes aim to replace our default grid’s offset classes, but they’re not entirely the same. CSS Grid creates a grid template through styles that tell browsers to “start at this column” and “end at this column”. Those properties are `grid-column-start` and `grid-column-end`. Start classes are shorthand for the former. Pair them with the column classes to size and align your columns however you need. Start classes begin at `1` as `0` is an invalid value for these properties.\n\n<Example class=\"bd-example-cssgrid\" code={`<div class=\"grid text-center\">\n    <div class=\"g-col-3 g-start-2\">.g-col-3 .g-start-2</div>\n    <div class=\"g-col-4 g-start-6\">.g-col-4 .g-start-6</div>\n  </div>`} />\n\n## Auto columns\n\nWhen there are no classes on the grid items (the immediate children of a `.grid`), each grid item will automatically be sized to one column.\n\n<Example class=\"bd-example-cssgrid\" code={`<div class=\"grid text-center\">\n    <div>1</div>\n    <div>1</div>\n    <div>1</div>\n    <div>1</div>\n    <div>1</div>\n    <div>1</div>\n    <div>1</div>\n    <div>1</div>\n    <div>1</div>\n    <div>1</div>\n    <div>1</div>\n    <div>1</div>\n  </div>`} />\n\nThis behavior can be mixed with grid column classes.\n\n<Example class=\"bd-example-cssgrid\" code={`<div class=\"grid text-center\">\n    <div class=\"g-col-6\">.g-col-6</div>\n    <div>1</div>\n    <div>1</div>\n    <div>1</div>\n    <div>1</div>\n    <div>1</div>\n    <div>1</div>\n  </div>`} />\n\n## Nesting\n\nSimilar to our default grid system, our CSS Grid allows for easy nesting of `.grid`s. However, unlike the default, this grid inherits changes in the rows, columns, and gaps. Consider the example below:\n\n- We override the default number of columns with a local CSS variable: `--bs-columns: 3`.\n- In the first auto-column, the column count is inherited and each column is one-third of the available width.\n- In the second auto-column, we’ve reset the column count on the nested `.grid` to 12 (our default).\n- The third auto-column has no nested content.\n\nIn practice this allows for more complex and custom layouts when compared to our default grid system.\n\n<Example class=\"bd-example-cssgrid\" code={`<div class=\"grid text-center overflow-x-auto\" style=\"--bs-columns: 3;\">\n    <div>\n      First auto-column\n      <div class=\"grid\">\n        <div>Auto-column</div>\n        <div>Auto-column</div>\n      </div>\n    </div>\n    <div>\n      Second auto-column\n      <div class=\"grid\" style=\"--bs-columns: 12;\">\n        <div class=\"g-col-6\">6 of 12</div>\n        <div class=\"g-col-4\">4 of 12</div>\n        <div class=\"g-col-2\">2 of 12</div>\n      </div>\n    </div>\n    <div>Third auto-column</div>\n  </div>`} />\n\n## Customizing\n\nCustomize the number of columns, the number of rows, and the width of the gaps with local CSS variables.\n\n<BsTable>\n| Variable | Fallback value | Description |\n| --- | --- | --- |\n| `--bs-rows` | `1` | The number of rows in your grid template |\n| `--bs-columns` | `12` | The number of columns in your grid template |\n| `--bs-gap` | `1.5rem` | The size of the gap between columns (vertical and horizontal) |\n</BsTable>\n\nThese CSS variables have no default value; instead, they apply fallback values that are used _until_ a local instance is provided. For example, we use `var(--bs-rows, 1)` for our CSS Grid rows, which ignores `--bs-rows` because that hasn’t been set anywhere yet. Once it is, the `.grid` instance will use that value instead of the fallback value of `1`.\n\n### No grid classes\n\nImmediate children elements of `.grid` are grid items, so they’ll be sized without explicitly adding a `.g-col` class.\n\n<Example class=\"bd-example-cssgrid\" code={`<div class=\"grid text-center\" style=\"--bs-columns: 3;\">\n    <div>Auto-column</div>\n    <div>Auto-column</div>\n    <div>Auto-column</div>\n  </div>`} />\n\n### Columns and gaps\n\nAdjust the number of columns and the gap.\n\n<Example class=\"bd-example-cssgrid\" code={`<div class=\"grid text-center\" style=\"--bs-columns: 4; --bs-gap: 5rem;\">\n    <div class=\"g-col-2\">.g-col-2</div>\n    <div class=\"g-col-2\">.g-col-2</div>\n  </div>`} />\n\n<Example class=\"bd-example-cssgrid\" code={`<div class=\"grid text-center\" style=\"--bs-columns: 10; --bs-gap: 1rem;\">\n    <div class=\"g-col-6\">.g-col-6</div>\n    <div class=\"g-col-4\">.g-col-4</div>\n  </div>`} />\n\n### Adding rows\n\nAdding more rows and changing the placement of columns:\n\n<Example class=\"bd-example-cssgrid\" code={`<div class=\"grid text-center\" style=\"--bs-rows: 3; --bs-columns: 3;\">\n    <div>Auto-column</div>\n    <div class=\"g-start-2\" style=\"grid-row: 2\">Auto-column</div>\n    <div class=\"g-start-3\" style=\"grid-row: 3\">Auto-column</div>\n  </div>`} />\n\n### Gaps\n\nChange the vertical gaps only by modifying the `row-gap`. Note that we use `gap` on `.grid`s, but `row-gap` and `column-gap` can be modified as needed.\n\n<Example class=\"bd-example-cssgrid\" code={`<div class=\"grid text-center\" style=\"row-gap: 0;\">\n    <div class=\"g-col-6\">.g-col-6</div>\n    <div class=\"g-col-6\">.g-col-6</div>\n\n    <div class=\"g-col-6\">.g-col-6</div>\n    <div class=\"g-col-6\">.g-col-6</div>\n  </div>`} />\n\nBecause of that, you can have different vertical and horizontal `gap`s, which can take a single value (all sides) or a pair of values (vertical and horizontal). This can be applied with an inline style for `gap`, or with our `--bs-gap` CSS variable.\n\n<Example class=\"bd-example-cssgrid\" code={`<div class=\"grid text-center\" style=\"--bs-gap: .25rem 1rem;\">\n    <div class=\"g-col-6\">.g-col-6</div>\n    <div class=\"g-col-6\">.g-col-6</div>\n\n    <div class=\"g-col-6\">.g-col-6</div>\n    <div class=\"g-col-6\">.g-col-6</div>\n  </div>`} />\n\n## Sass\n\nOne limitation of the CSS Grid is that our default classes are still generated by two Sass variables, `$grid-columns` and `$grid-gutter-width`. This effectively predetermines the number of classes generated in our compiled CSS. You have two options here:\n\n- Modify those default Sass variables and recompile your CSS.\n- Use inline or custom styles to augment the provided classes.\n\nFor example, you can increase the column count and change the gap size, and then size your “columns” with a mix of inline styles and predefined CSS Grid column classes (e.g., `.g-col-4`).\n\n<Example class=\"bd-example-cssgrid\" code={`<div class=\"grid text-center\" style=\"--bs-columns: 18; --bs-gap: .5rem;\">\n    <div style=\"grid-column: span 14;\">14 columns</div>\n    <div class=\"g-col-4\">.g-col-4</div>\n  </div>`} />\n"
  },
  {
    "path": "site/src/content/docs/layout/grid.mdx",
    "content": "---\ntitle: Grid system\ndescription: Use our powerful mobile-first flexbox grid to build layouts of all shapes and sizes thanks to a twelve column system, six default responsive tiers, Sass variables and mixins, and dozens of predefined classes.\ntoc: true\n---\n\n## Example\n\nBootstrap’s grid system uses a series of containers, rows, and columns to layout and align content. It’s built with [flexbox](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Flexible_Box_Layout/Basic_Concepts_of_Flexbox) and is fully responsive. Below is an example and an in-depth explanation for how the grid system comes together.\n\n<Callout>\n**New to or unfamiliar with flexbox?** [Read this CSS Tricks flexbox guide](https://css-tricks.com/snippets/css/a-guide-to-flexbox/#flexbox-background) for background, terminology, guidelines, and code snippets.\n</Callout>\n\n<Example class=\"bd-example-row\" code={`<div class=\"container text-center\">\n    <div class=\"row\">\n      <div class=\"col\">\n        Column\n      </div>\n      <div class=\"col\">\n        Column\n      </div>\n      <div class=\"col\">\n        Column\n      </div>\n    </div>\n  </div>`} />\n\nThe above example creates three equal-width columns across all devices and viewports using our predefined grid classes. Those columns are centered in the page with the parent `.container`.\n\n## How it works\n\nBreaking it down, here’s how the grid system comes together:\n\n- **Our grid supports [six responsive breakpoints]([[docsref:/layout/breakpoints]]).**  Breakpoints are based on `min-width` media queries, meaning they affect that breakpoint and all those above it (e.g., `.col-sm-4` applies to `sm`, `md`, `lg`, `xl`, and `xxl`). This means you can control container and column sizing and behavior by each breakpoint.\n\n- **Containers center and horizontally pad your content.** Use `.container` for a responsive pixel width, `.container-fluid` for `width: 100%` across all viewports and devices, or a responsive container (e.g., `.container-md`) for a combination of fluid and pixel widths.\n\n- **Rows are wrappers for columns.** Each column has horizontal `padding` (called a gutter) for controlling the space between them. This `padding` is then counteracted on the rows with negative margins to ensure the content in your columns is visually aligned down the left side. Rows also support modifier classes to [uniformly apply column sizing](#row-columns) and [gutter classes]([[docsref:/layout/gutters]]) to change the spacing of your content.\n\n- **Columns are incredibly flexible.** There are 12 template columns available per row, allowing you to create different combinations of elements that span any number of columns. Column classes indicate the number of template columns to span (e.g., `col-4` spans four). `width`s are set in percentages so you always have the same relative sizing.\n\n- **Gutters are also responsive and customizable.** [Gutter classes are available]([[docsref:/layout/gutters]]) across all breakpoints, with all the same sizes as our [margin and padding spacing]([[docsref:/utilities/spacing]]). Change horizontal gutters with `.gx-*` classes, vertical gutters with `.gy-*`, or all gutters with `.g-*` classes. `.g-0` is also available to remove gutters.\n\n- **Sass variables, maps, and mixins power the grid.** If you don’t want to use the predefined grid classes in Bootstrap, you can use our [grid’s source Sass](#sass-variables) to create your own with more semantic markup. We also include some CSS custom properties to consume these Sass variables for even greater flexibility for you.\n\nBe aware of the limitations and [bugs around flexbox](https://github.com/philipwalton/flexbugs), like the [inability to use some HTML elements as flex containers](https://github.com/philipwalton/flexbugs#flexbug-9).\n\n## Grid options\n\nBootstrap’s grid system can adapt across all six default breakpoints, and any breakpoints you customize. The six default grid tiers are as follows:\n\n- Extra small (xs)\n- Small (sm)\n- Medium (md)\n- Large (lg)\n- Extra large (xl)\n- Extra extra large (xxl)\n\nAs noted above, each of these breakpoints have their own container, unique class prefix, and modifiers. Here’s how the grid changes across these breakpoints:\n\n<div class=\"table-responsive\">\n  <table class=\"table mb-4\">\n    <thead>\n      <tr>\n        <th scope=\"col\"></th>\n        <th scope=\"col\">xs<br/><span class=\"fw-normal\">&lt;576px</span></th>\n        <th scope=\"col\">sm<br/><span class=\"fw-normal\">&ge;576px</span></th>\n        <th scope=\"col\">md<br/><span class=\"fw-normal\">&ge;768px</span></th>\n        <th scope=\"col\">lg<br/><span class=\"fw-normal\">&ge;992px</span></th>\n        <th scope=\"col\">xl<br/><span class=\"fw-normal\">&ge;1200px</span></th>\n        <th scope=\"col\">xxl<br/><span class=\"fw-normal\">&ge;1400px</span></th>\n      </tr>\n    </thead>\n    <tbody>\n      <tr>\n        <th class=\"text-nowrap\" scope=\"row\">Container <code class=\"fw-normal\">max-width</code></th>\n        <td>None (auto)</td>\n        <td>540px</td>\n        <td>720px</td>\n        <td>960px</td>\n        <td>1140px</td>\n        <td>1320px</td>\n      </tr>\n      <tr>\n        <th class=\"text-nowrap\" scope=\"row\">Class prefix</th>\n        <td><code>.col-</code></td>\n        <td><code>.col-sm-</code></td>\n        <td><code>.col-md-</code></td>\n        <td><code>.col-lg-</code></td>\n        <td><code>.col-xl-</code></td>\n        <td><code>.col-xxl-</code></td>\n      </tr>\n      <tr>\n        <th class=\"text-nowrap\" scope=\"row\"># of columns</th>\n        <td colspan=\"6\">12</td>\n      </tr>\n      <tr>\n        <th class=\"text-nowrap\" scope=\"row\">Gutter width</th>\n        <td colspan=\"6\">1.5rem (.75rem on left and right)</td>\n      </tr>\n      <tr>\n        <th class=\"text-nowrap\" scope=\"row\">Custom gutters</th>\n        <td colspan=\"6\"><a href=\"[[docsref:/layout/gutters]]\">Yes</a></td>\n      </tr>\n      <tr>\n        <th class=\"text-nowrap\" scope=\"row\">Nestable</th>\n        <td colspan=\"6\"><a href=\"#nesting\">Yes</a></td>\n      </tr>\n      <tr>\n        <th class=\"text-nowrap\" scope=\"row\">Column ordering</th>\n        <td colspan=\"6\"><a href=\"[[docsref:/layout/columns#reordering]]\">Yes</a></td>\n      </tr>\n    </tbody>\n  </table>\n</div>\n\n## Auto-layout columns\n\nUtilize breakpoint-specific column classes for easy column sizing without an explicit numbered class like `.col-sm-6`.\n\n### Equal-width\n\nFor example, here are two grid layouts that apply to every device and viewport, from `xs` to `xxl`. Add any number of unit-less classes for each breakpoint you need and every column will be the same width.\n\n<Example class=\"bd-example-row\" code={`<div class=\"container text-center\">\n    <div class=\"row\">\n      <div class=\"col\">\n        1 of 2\n      </div>\n      <div class=\"col\">\n        2 of 2\n      </div>\n    </div>\n    <div class=\"row\">\n      <div class=\"col\">\n        1 of 3\n      </div>\n      <div class=\"col\">\n        2 of 3\n      </div>\n      <div class=\"col\">\n        3 of 3\n      </div>\n    </div>\n  </div>`} />\n\n### Setting one column width\n\nAuto-layout for flexbox grid columns also means you can set the width of one column and have the sibling columns automatically resize around it. You may use predefined grid classes (as shown below), grid mixins, or inline widths. Note that the other columns will resize no matter the width of the center column.\n\n<Example class=\"bd-example-row\" code={`<div class=\"container text-center\">\n    <div class=\"row\">\n      <div class=\"col\">\n        1 of 3\n      </div>\n      <div class=\"col-6\">\n        2 of 3 (wider)\n      </div>\n      <div class=\"col\">\n        3 of 3\n      </div>\n    </div>\n    <div class=\"row\">\n      <div class=\"col\">\n        1 of 3\n      </div>\n      <div class=\"col-5\">\n        2 of 3 (wider)\n      </div>\n      <div class=\"col\">\n        3 of 3\n      </div>\n    </div>\n  </div>`} />\n\n### Variable width content\n\nUse `col-{breakpoint}-auto` classes to size columns based on the natural width of their content.\n\n<Example class=\"bd-example-row\" code={`<div class=\"container text-center\">\n    <div class=\"row justify-content-md-center\">\n      <div class=\"col col-lg-2\">\n        1 of 3\n      </div>\n      <div class=\"col-md-auto\">\n        Variable width content\n      </div>\n      <div class=\"col col-lg-2\">\n        3 of 3\n      </div>\n    </div>\n    <div class=\"row\">\n      <div class=\"col\">\n        1 of 3\n      </div>\n      <div class=\"col-md-auto\">\n        Variable width content\n      </div>\n      <div class=\"col col-lg-2\">\n        3 of 3\n      </div>\n    </div>\n  </div>`} />\n\n## Responsive classes\n\nBootstrap’s grid includes six tiers of predefined classes for building complex responsive layouts. Customize the size of your columns on extra small, small, medium, large, or extra large devices however you see fit.\n\n### All breakpoints\n\nFor grids that are the same from the smallest of devices to the largest, use the `.col` and `.col-*` classes. Specify a numbered class when you need a particularly sized column; otherwise, feel free to stick to `.col`.\n\n<Example class=\"bd-example-row\" code={`<div class=\"container text-center\">\n    <div class=\"row\">\n      <div class=\"col\">col</div>\n      <div class=\"col\">col</div>\n      <div class=\"col\">col</div>\n      <div class=\"col\">col</div>\n    </div>\n    <div class=\"row\">\n      <div class=\"col-8\">col-8</div>\n      <div class=\"col-4\">col-4</div>\n    </div>\n  </div>`} />\n\n### Stacked to horizontal\n\nUsing a single set of `.col-sm-*` classes, you can create a basic grid system that starts out stacked and becomes horizontal at the small breakpoint (`sm`).\n\n<Example class=\"bd-example-row\" code={`<div class=\"container text-center\">\n    <div class=\"row\">\n      <div class=\"col-sm-8\">col-sm-8</div>\n      <div class=\"col-sm-4\">col-sm-4</div>\n    </div>\n    <div class=\"row\">\n      <div class=\"col-sm\">col-sm</div>\n      <div class=\"col-sm\">col-sm</div>\n      <div class=\"col-sm\">col-sm</div>\n    </div>\n  </div>`} />\n\n### Mix and match\n\nDon’t want your columns to simply stack in some grid tiers? Use a combination of different classes for each tier as needed. See the example below for a better idea of how it all works.\n\n<Example class=\"bd-example-row\" code={`<div class=\"container text-center\">\n    <!-- Stack the columns on mobile by making one full-width and the other half-width -->\n    <div class=\"row\">\n      <div class=\"col-md-8\">.col-md-8</div>\n      <div class=\"col-6 col-md-4\">.col-6 .col-md-4</div>\n    </div>\n\n    <!-- Columns start at 50% wide on mobile and bump up to 33.3% wide on desktop -->\n    <div class=\"row\">\n      <div class=\"col-6 col-md-4\">.col-6 .col-md-4</div>\n      <div class=\"col-6 col-md-4\">.col-6 .col-md-4</div>\n      <div class=\"col-6 col-md-4\">.col-6 .col-md-4</div>\n    </div>\n\n    <!-- Columns are always 50% wide, on mobile and desktop -->\n    <div class=\"row\">\n      <div class=\"col-6\">.col-6</div>\n      <div class=\"col-6\">.col-6</div>\n    </div>\n  </div>`} />\n\n### Row columns\n\nUse the responsive `.row-cols-*` classes to quickly set the number of columns that best render your content and layout. Whereas normal `.col-*` classes apply to the individual columns (e.g., `.col-md-4`), the row columns classes are set on the parent `.row` as a shortcut. With `.row-cols-auto` you can give the columns their natural width.\n\nUse these row columns classes to quickly create basic grid layouts or to control your card layouts.\n\n<Example class=\"bd-example-row\" code={`<div class=\"container text-center\">\n    <div class=\"row row-cols-2\">\n      <div class=\"col\">Column</div>\n      <div class=\"col\">Column</div>\n      <div class=\"col\">Column</div>\n      <div class=\"col\">Column</div>\n    </div>\n  </div>`} />\n\n<Example class=\"bd-example-row\" code={`<div class=\"container text-center\">\n    <div class=\"row row-cols-3\">\n      <div class=\"col\">Column</div>\n      <div class=\"col\">Column</div>\n      <div class=\"col\">Column</div>\n      <div class=\"col\">Column</div>\n    </div>\n  </div>`} />\n\n<Example class=\"bd-example-row\" code={`<div class=\"container text-center\">\n    <div class=\"row row-cols-auto\">\n      <div class=\"col\">Column</div>\n      <div class=\"col\">Column</div>\n      <div class=\"col\">Column</div>\n      <div class=\"col\">Column</div>\n    </div>\n  </div>`} />\n\n<Example class=\"bd-example-row\" code={`<div class=\"container text-center\">\n    <div class=\"row row-cols-4\">\n      <div class=\"col\">Column</div>\n      <div class=\"col\">Column</div>\n      <div class=\"col\">Column</div>\n      <div class=\"col\">Column</div>\n    </div>\n  </div>`} />\n\n<Example class=\"bd-example-row\" code={`<div class=\"container text-center\">\n    <div class=\"row row-cols-4\">\n      <div class=\"col\">Column</div>\n      <div class=\"col\">Column</div>\n      <div class=\"col-6\">Column</div>\n      <div class=\"col\">Column</div>\n    </div>\n  </div>`} />\n\n<Example class=\"bd-example-row\" code={`<div class=\"container text-center\">\n    <div class=\"row row-cols-1 row-cols-sm-2 row-cols-md-4\">\n      <div class=\"col\">Column</div>\n      <div class=\"col\">Column</div>\n      <div class=\"col\">Column</div>\n      <div class=\"col\">Column</div>\n    </div>\n  </div>`} />\n\nYou can also use the accompanying Sass mixin, `row-cols()`:\n\n```scss\n.element {\n  // Three columns to start\n  @include row-cols(3);\n\n  // Five columns from medium breakpoint up\n  @include media-breakpoint-up(md) {\n    @include row-cols(5);\n  }\n}\n```\n\n## Nesting\n\nTo nest your content with the default grid, add a new `.row` and set of `.col-sm-*` columns within an existing `.col-sm-*` column. Nested rows should include a set of columns that add up to 12 or fewer (it is not required that you use all 12 available columns).\n\n<Example class=\"bd-example-row\" code={`<div class=\"container text-center\">\n    <div class=\"row\">\n      <div class=\"col-sm-3\">\n        Level 1: .col-sm-3\n      </div>\n      <div class=\"col-sm-9\">\n        <div class=\"row\">\n          <div class=\"col-8 col-sm-6\">\n            Level 2: .col-8 .col-sm-6\n          </div>\n          <div class=\"col-4 col-sm-6\">\n            Level 2: .col-4 .col-sm-6\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>`} />\n\n## CSS\n\nWhen using Bootstrap’s source Sass files, you have the option of using Sass variables and mixins to create custom, semantic, and responsive page layouts. Our predefined grid classes use these same variables and mixins to provide a whole suite of ready-to-use classes for fast responsive layouts.\n\n### Sass variables\n\nVariables and maps determine the number of columns, the gutter width, and the media query point at which to begin floating columns. We use these to generate the predefined grid classes documented above, as well as for the custom mixins listed below.\n\n```scss\n$grid-columns:      12;\n$grid-gutter-width: 1.5rem;\n$grid-row-columns:  6;\n```\n\n<ScssDocs name=\"grid-breakpoints\" file=\"scss/_variables.scss\" />\n\n<ScssDocs name=\"container-max-widths\" file=\"scss/_variables.scss\" />\n\n### Sass mixins\n\nMixins are used in conjunction with the grid variables to generate semantic CSS for individual grid columns.\n\n```scss\n// Creates a wrapper for a series of columns\n@include make-row();\n\n// Make the element grid-ready (applying everything but the width)\n@include make-col-ready();\n\n// Without optional size values, the mixin will create equal columns (similar to using .col)\n@include make-col();\n@include make-col($size, $columns: $grid-columns);\n\n// Offset with margins\n@include make-col-offset($size, $columns: $grid-columns);\n```\n\n### Example usage\n\nYou can modify the variables to your own custom values, or just use the mixins with their default values. Here’s an example of using the default settings to create a two-column layout with a gap between.\n\n```scss\n.example-container {\n  @include make-container();\n  // Make sure to define this width after the mixin to override\n  // `width: 100%` generated by `make-container()`\n  width: 800px;\n}\n\n.example-row {\n  @include make-row();\n}\n\n.example-content-main {\n  @include make-col-ready();\n\n  @include media-breakpoint-up(sm) {\n    @include make-col(6);\n  }\n  @include media-breakpoint-up(lg) {\n    @include make-col(8);\n  }\n}\n\n.example-content-secondary {\n  @include make-col-ready();\n\n  @include media-breakpoint-up(sm) {\n    @include make-col(6);\n  }\n  @include media-breakpoint-up(lg) {\n    @include make-col(4);\n  }\n}\n```\n\n<Example code={`<div class=\"example-container\">\n    <div class=\"example-row\">\n      <div class=\"example-content-main\">Main content</div>\n      <div class=\"example-content-secondary\">Secondary content</div>\n    </div>\n  </div>`} />\n\n## Customizing the grid\n\nUsing our built-in grid Sass variables and maps, it’s possible to completely customize the predefined grid classes. Change the number of tiers, the media query dimensions, and the container widths—then recompile.\n\n### Columns and gutters\n\nThe number of grid columns can be modified via Sass variables. `$grid-columns` is used to generate the widths (in percent) of each individual column while `$grid-gutter-width` sets the width for the column gutters. `$grid-row-columns` is used to set the maximum number of columns of `.row-cols-*`, any number over this limit is ignored.\n\n```scss\n$grid-columns: 12 !default;\n$grid-gutter-width: 1.5rem !default;\n$grid-row-columns: 6 !default;\n```\n\n### Grid tiers\n\nMoving beyond the columns themselves, you may also customize the number of grid tiers. If you wanted just four grid tiers, you’d update the `$grid-breakpoints` and `$container-max-widths` to something like this:\n\n```scss\n$grid-breakpoints: (\n  xs: 0,\n  sm: 480px,\n  md: 768px,\n  lg: 1024px\n);\n\n$container-max-widths: (\n  sm: 420px,\n  md: 720px,\n  lg: 960px\n);\n```\n\nWhen making any changes to the Sass variables or maps, you’ll need to save your changes and recompile. Doing so will output a brand-new set of predefined grid classes for column widths, offsets, and ordering. Responsive visibility utilities will also be updated to use the custom breakpoints. Make sure to set grid values in `px` (not `rem`, `em`, or `%`).\n"
  },
  {
    "path": "site/src/content/docs/layout/gutters.mdx",
    "content": "---\ntitle: Gutters\ndescription: Gutters are the padding between your columns, used to responsively space and align content in the Bootstrap grid system.\ntoc: true\n---\n\n## How they work\n\n- **Gutters are the gaps between column content, created by horizontal `padding`.** We set `padding-right` and `padding-left` on each column, and use negative `margin` to offset that at the start and end of each row to align content.\n\n- **Gutters start at `1.5rem` (`24px`) wide.** This allows us to match our grid to the [padding and margin spacers]([[docsref:/utilities/spacing]]) scale.\n\n- **Gutters can be responsively adjusted.** Use breakpoint-specific gutter classes to modify horizontal gutters, vertical gutters, and all gutters.\n\n## Horizontal gutters\n\n`.gx-*` classes can be used to control the horizontal gutter widths. The `.container` or `.container-fluid` parent may need to be adjusted if larger gutters are used too to avoid unwanted overflow, using a matching padding utility. For example, in the following example we’ve increased the padding with `.px-4`:\n\n<Example class=\"bd-example-cols\" code={`<div class=\"container px-4 text-center\">\n    <div class=\"row gx-5\">\n      <div class=\"col\">\n        <div class=\"p-3\">Custom column padding</div>\n      </div>\n      <div class=\"col\">\n        <div class=\"p-3\">Custom column padding</div>\n      </div>\n    </div>\n  </div>`} />\n\nAn alternative solution is to add a wrapper around the `.row` with the `.overflow-hidden` class:\n\n<Example class=\"bd-example-cols\" code={`<div class=\"container overflow-hidden text-center\">\n    <div class=\"row gx-5\">\n      <div class=\"col\">\n        <div class=\"p-3\">Custom column padding</div>\n      </div>\n      <div class=\"col\">\n        <div class=\"p-3\">Custom column padding</div>\n      </div>\n    </div>\n  </div>`} />\n\n## Vertical gutters\n\n`.gy-*` classes can be used to control the vertical gutter widths within a row when columns wrap to new lines. Like the horizontal gutters, the vertical gutters can cause some overflow below the `.row` at the end of a page. If this occurs, you add a wrapper around `.row` with the `.overflow-hidden` class:\n\n<Example class=\"bd-example-cols\" code={`<div class=\"container overflow-hidden text-center\">\n    <div class=\"row gy-5\">\n      <div class=\"col-6\">\n        <div class=\"p-3\">Custom column padding</div>\n      </div>\n      <div class=\"col-6\">\n        <div class=\"p-3\">Custom column padding</div>\n      </div>\n      <div class=\"col-6\">\n        <div class=\"p-3\">Custom column padding</div>\n      </div>\n      <div class=\"col-6\">\n        <div class=\"p-3\">Custom column padding</div>\n      </div>\n    </div>\n  </div>`} />\n\n## Horizontal & vertical gutters\n\nUse `.g-*` classes to control the horizontal and vertical grid gutters. In the example below, we use a smaller gutter width, so there isn’t a need for the `.overflow-hidden` wrapper class.\n\n<Example class=\"bd-example-cols\" code={`<div class=\"container text-center\">\n    <div class=\"row g-2\">\n      <div class=\"col-6\">\n        <div class=\"p-3\">Custom column padding</div>\n      </div>\n      <div class=\"col-6\">\n        <div class=\"p-3\">Custom column padding</div>\n      </div>\n      <div class=\"col-6\">\n        <div class=\"p-3\">Custom column padding</div>\n      </div>\n      <div class=\"col-6\">\n        <div class=\"p-3\">Custom column padding</div>\n      </div>\n    </div>\n  </div>`} />\n\n## Row columns gutters\n\nGutter classes can also be added to [row columns]([[docsref:/layout/grid#row-columns]]). In the following example, we use responsive row columns and responsive gutter classes.\n\n<Example class=\"bd-example-cols\" code={`<div class=\"container text-center\">\n    <div class=\"row row-cols-2 row-cols-lg-5 g-2 g-lg-3\">\n      <div class=\"col\">\n        <div class=\"p-3\">Row column</div>\n      </div>\n      <div class=\"col\">\n        <div class=\"p-3\">Row column</div>\n      </div>\n      <div class=\"col\">\n        <div class=\"p-3\">Row column</div>\n      </div>\n      <div class=\"col\">\n        <div class=\"p-3\">Row column</div>\n      </div>\n      <div class=\"col\">\n        <div class=\"p-3\">Row column</div>\n      </div>\n      <div class=\"col\">\n        <div class=\"p-3\">Row column</div>\n      </div>\n      <div class=\"col\">\n        <div class=\"p-3\">Row column</div>\n      </div>\n      <div class=\"col\">\n        <div class=\"p-3\">Row column</div>\n      </div>\n      <div class=\"col\">\n        <div class=\"p-3\">Row column</div>\n      </div>\n      <div class=\"col\">\n        <div class=\"p-3\">Row column</div>\n      </div>\n    </div>\n  </div>`} />\n\n## No gutters\n\nThe gutters between columns in our predefined grid classes can be removed with `.g-0`. This removes the negative `margin`s from `.row` and the horizontal `padding` from all immediate children columns.\n\n**Need an edge-to-edge design?** Drop the parent `.container` or `.container-fluid` and add `.mx-0` to the `.row` to prevent overflow.\n\nIn practice, here’s how it looks. Note that you can continue to use this with all other predefined grid classes (including column widths, responsive tiers, reorders, and more).\n\n<Example class=\"bd-example-row\" code={`<div class=\"row g-0 text-center\">\n    <div class=\"col-sm-6 col-md-8\">.col-sm-6 .col-md-8</div>\n    <div class=\"col-6 col-md-4\">.col-6 .col-md-4</div>\n  </div>`} />\n\n## Change the gutters\n\nClasses are built from the `$gutters` Sass map which is inherited from the `$spacers` Sass map.\n\n```scss\n$grid-gutter-width: 1.5rem;\n$gutters: (\n  0: 0,\n  1: $spacer * .25,\n  2: $spacer * .5,\n  3: $spacer,\n  4: $spacer * 1.5,\n  5: $spacer * 3,\n);\n```\n"
  },
  {
    "path": "site/src/content/docs/layout/utilities.mdx",
    "content": "---\ntitle: Utilities for layout\ndescription: For faster mobile-friendly and responsive development, Bootstrap includes dozens of utility classes for showing, hiding, aligning, and spacing content.\ntoc: true\n---\n\n## Changing `display`\n\nUse our [display utilities]([[docsref:/utilities/display]]) for responsively toggling common values of the `display` property. Mix it with our grid system, content, or components to show or hide them across specific viewports.\n\n## Flexbox options\n\nBootstrap is built with flexbox, but not every element’s `display` has been changed to `display: flex` as this would add many unnecessary overrides and unexpectedly change key browser behaviors. Most of [our components]([[docsref:/components/alerts]]) are built with flexbox enabled.\n\nShould you need to add `display: flex` to an element, do so with `.d-flex` or one of the responsive variants (e.g., `.d-sm-flex`). You’ll need this class or `display` value to allow the use of our extra [flexbox utilities]([[docsref:/utilities/flex]]) for sizing, alignment, spacing, and more.\n\n## Margin and padding\n\nUse the `margin` and `padding` [spacing utilities]([[docsref:/utilities/spacing]]) to control how elements and components are spaced and sized. Bootstrap includes a six-level scale for spacing utilities, based on a `1rem` value default `$spacer` variable. Choose values for all viewports (e.g., `.me-3` for `margin-right: 1rem` in LTR), or pick responsive variants to target specific viewports (e.g., `.me-md-3` for `margin-right: 1rem` —in LTR— starting at the `md` breakpoint).\n\n## Toggle `visibility`\n\nWhen toggling `display` isn’t needed, you can toggle the `visibility` of an element with our [visibility utilities]([[docsref:/utilities/visibility]]). Invisible elements will still affect the layout of the page, but are visually hidden from visitors.\n"
  },
  {
    "path": "site/src/content/docs/layout/z-index.mdx",
    "content": "---\ntitle: Z-index\ndescription: While not a part of Bootstrap’s grid system, z-indexes play an important part in how our components overlay and interact with one another.\n---\n\nSeveral Bootstrap components utilize `z-index`, the CSS property that helps control layout by providing a third axis to arrange content. We utilize a default z-index scale in Bootstrap that’s been designed to properly layer navigation, tooltips and popovers, modals, and more.\n\nThese higher values start at an arbitrary number, high and specific enough to ideally avoid conflicts. We need a standard set of these across our layered components—tooltips, popovers, navbars, dropdowns, modals—so we can be reasonably consistent in the behaviors. There’s no reason we couldn’t have used `100`+ or `500`+.\n\nWe don’t encourage customization of these individual values; should you change one, you likely need to change them all.\n\n<ScssDocs name=\"zindex-stack\" file=\"scss/_variables.scss\" />\n\nTo handle overlapping borders within components (e.g., buttons and inputs in input groups), we use low single digit `z-index` values of `1`, `2`, and `3` for default, hover, and active states. On hover/focus/active, we bring a particular element to the forefront with a higher `z-index` value to show their border over the sibling elements.\n"
  },
  {
    "path": "site/src/content/docs/migration.mdx",
    "content": "---\ntitle: Migrating to v5\ndescription: Track and review changes to the Bootstrap source files, documentation, and components to help you migrate from v4 to v5.\naliases: \"/migration/\"\ntoc: true\n---\n\n## v5.3.6\n\n### Dependencies\n\n- Migrated from Hugo to Astro for building our documentation\n\n## v5.3.0\n\nIf you’re migrating from our previous alpha releases of v5.3.0, please review their changes in addition to this section.\n\n### Helpers\n\n- [Colored links]([[docsref:/helpers/colored-links]]) once again have `!important` so they work better with our newly added link utilities.\n\n### Utilities\n\n- Added new `.d-inline-grid` [display utility]([[docsref:/utilities/display]]).\n\n## v5.3.0-alpha2\n\nIf you’re migrating from our previous alpha release of v5.3.0, please review the changes listed below.\n\n### CSS variables\n\n- Removed several duplicate and unused root CSS variables.\n\n### Color modes\n\n- Dark mode colors are now derived from our theme colors (e.g., `$primary`) in Sass, rather than color specific tints or shades (e.g., `$blue-300`). This allows for a more automated dark mode when customizing the default theme colors.\n\n- Added Sass maps for generating theme colors for dark mode text, subtle background, and subtle border.\n\n- [Snippet examples]([[docsref:/examples/#snippets]]) are now ready for dark mode with updated markup and reduced custom styles.\n\n- Added `color-scheme: dark` to dark mode CSS to change OS level controls like scrollbars\n\n- Form validation `border-color` and text `color` states now respond to dark mode, thanks to new Sass and CSS variables.\n\n- Dropped recently added form control background CSS variables and reassigned the Sass variables to use CSS variables instead. This simplifies the styling across color modes and avoids an issue where form controls in dark mode wouldn’t update properly.\n\n- Our `box-shadow`s will once again always stay dark instead of inverting to white when in dark mode.\n\n- Improved HTML and JavaScript for our color mode toggle script. The selector for changing the active SVG has been improved, and the markup made more accessible with ARIA attributes.\n\n- Improved docs code syntax colors and more across light and dark modes.\n\n### Typography\n\n- We no longer set a color for `$headings-color-dark` or `--bs-heading-color` for dark mode. To avoid several problems of headings within components appearing the wrong color, we’ve set the Sass variable to `null` and added a `null` check like we use on the default light mode.\n\n### Components\n\n- Cards now have a `color` set on them to improve rendering across color modes.\n\n- Added new `.nav-underline` variant for our navigation with a simpler bottom border under the active nav link. [See the docs for an example.]([[docsref:/components/navs-tabs#underline]])\n\n- Navs now have new `:focus-visible` styles that better match our custom button focus styles.\n\n### Helpers\n\n- Added new `.icon-link` helper to quickly place and align Bootstrap Icons alongside a textual link. Icon links support our new link utilities, too.\n\n- Added new focus ring helper for removing the default `outline` and setting a custom `box-shadow` focus ring.\n\n### Utilities\n\n- Renamed Sass and CSS variables `${color}-text` to `${color}-text-emphasis` to match their associated utilities.\n\n- Added new `.link-body-emphasis` helper alongside our [colored links]([[docsref:/helpers/colored-links]]). This creates a colored link using our color mode responsive emphasis color.\n\n- Added new link utilities for link color opacity, underline offset, underline color, and underline opacity. [Explore the new links utilities.]([[docsref:/utilities/link]])\n\n- CSS variable based `border-width` utilities have been reverted to set their property directly (as was done prior to v5.2.0). This avoids inheritance issues across nested elements, including tables.\n\n- Added new `.border-black` utility to match our `.text-black` and `.bg-black` utilities.\n\n- <span class=\"badge text-warning-emphasis bg-warning-subtle\">Deprecated</span> The `.text-muted` utility and `$text-muted` Sass variable have been deprecated and replaced with `.text-body-secondary` and `$body-secondary-color`.\n\n### Docs\n\n- Examples are now displayed with the appropriate light or dark color mode as dictated by the setting in our docs. Each example has an individual color mode picker.\n\n- Improved included JavaScript for live Toast demo.\n\n- Added `twbs/examples` repo contents to the top of the Examples page.\n\n### Tooling\n\n- Added SCSS testing via True to help test our utilities API and other customizations.\n\n- Replaced instances of our bootstrap-npm-starter project with the newer and more complete [twbs/examples repo](https://github.com/twbs/examples).\n\n<hr class=\"mb-4\"/>\n\nFor a complete list of changes, [see the v5.3.0-alpha2 project on GitHub](https://github.com/orgs/twbs/projects/13).\n\n## v5.3.0-alpha1\n\n<hr class=\"mb-4\"/>\n\n### Color modes!\n\nLearn more by reading the new [color modes documentation]([[docsref:/customize/color-modes]]).\n\n- **Global support for light (default) and dark color modes.** Set color mode globally on the `:root` element, on groups of elements and components with a wrapper class, or directly on components, with `data-bs-theme=\"light|dark\"`. Also included is a new `color-mode()` mixin that can output a ruleset with the `data-bs-theme` selector or a media query, depending on your preference.\n\n  <span class=\"badge text-warning-emphasis bg-warning-subtle\">Deprecated</span> Color modes replace dark variants for components, so  `.btn-close-white`, `.carousel-dark`, `.dropdown-menu-dark`, and `.navbar-dark` are deprecated.\n\n- **New extended color system.** We’ve added new theme colors (but not in `$theme-colors`) for a more nuanced, system-wide color palette with new secondary, tertiary, and emphasis colors for `color` and `background-color`. These new colors are available as Sass variables, CSS variables, and utilities.\n\n- We’ve also expanded our theme color Sass variables, CSS variables, and utilities to include text emphasis, subtle background colors, and subtle border colors. These are available as Sass variables, CSS variables, and utilities.\n\n- Adds new `_variables-dark.scss` stylesheet to house dark-mode specific overrides. This stylesheet should be imported immediately after the existing `_variables.scss` file in your import stack.\n\n  ```diff\n  diff --git a/scss/bootstrap.scss b/scss/bootstrap.scss\n  index 8f8296def..449d70487 100644\n  --- a/scss/bootstrap.scss\n  +++ b/scss/bootstrap.scss\n  @@ -6,6 +6,7 @@\n   // Configuration\n   @import \"functions\";\n   @import \"variables\";\n  +@import \"variables-dark\";\n   @import \"maps\";\n   @import \"mixins\";\n   @import \"utilities\";\n  ```\n\n### CSS variables\n\n- Restores CSS variables for breakpoints, though we don’t use them in our media queries as they’re not supported. However, these can be useful in JS-specific contexts.\n\n- Per the color modes update, we’ve added new utilities for new Sass CSS variables `secondary` and `tertiary` text and background colors, plus `{color}-bg-subtle`, `{color}-border-subtle`, and `{color}-text-emphasis` for our theme colors. These new colors are available through Sass and CSS variables (but not our color maps) with the express goal of making it easier to customize across multiple colors modes like light and dark.\n\n- Adds additional variables for alerts, `.btn-close`, and `.offcanvas`.\n\n- The `--bs-heading-color` variable is back with an update and dark mode support. First, we now check for a `null` value on the associated Sass variable, `$headings-color`, before trying to output the CSS variable, so by default it’s not present in our compiled CSS. Second, we use the CSS variable with a fallback value, `inherit`, allowing the original behavior to persist, but also allowing for overrides.\n\n- Converts links to use CSS variables for styling `color`, but not `text-decoration`. Colors are now set with `--bs-link-color-rgb` and `--bs-link-opacity` as `rgba()` color, allowing you to customize the translucency with ease. The `a:hover` pseudo-class now overrides `--bs-link-color-rgb` instead of explicitly setting the `color` property.\n\n- `--bs-border-width` is now being used in more components for greater control over default global styling.\n\n- Adds new root CSS variables for our `box-shadow`s, including `--bs-box-shadow`, `--bs-box-shadow-sm`, `--bs-box-shadow-lg`, and `--bs-box-shadow-inset`.\n\n### Components\n\n#### Alert\n\n- Alert variants are now styled via CSS variables.\n\n- <span class=\"badge text-warning-emphasis bg-warning-subtle\">Deprecated</span> The `alert-variant()` mixin is now deprecated. We now [use a Sass loop]([[docsref:/components/alerts#sass-loops]]) directly to modify the component’s default CSS variables for each variant.\n\n#### List group\n\n- List group item variants are now styled via CSS variables.\n\n- <span class=\"badge text-warning-emphasis bg-warning-subtle\">Deprecated</span> The `list-group-item-variant()` mixin is now deprecated. We now [use a Sass loop]([[docsref:/components/list-group#sass-loops]]) directly to modify the component’s default CSS variables for each variant.\n\n#### Dropdowns\n\n- <span class=\"badge text-warning-emphasis bg-warning-subtle\">Deprecated</span> The `.dropdown-menu-dark` class has been deprecated and replaced with `data-bs-theme=\"dark\"` on the dropdown or any parent element. [See the docs for an example.]([[docsref:/components/dropdowns#dark-dropdowns]])\n\n#### Close button\n\n- <span class=\"badge text-warning-emphasis bg-warning-subtle\">Deprecated</span> The `.btn-close-white` class has been deprecated and replaced with `data-bs-theme=\"dark\"` on the close button or any parent element. [See the docs for an example.]([[docsref:/components/close-button#dark-variant]])\n\n#### Navbar\n\n- <span class=\"badge text-warning-emphasis bg-warning-subtle\">Deprecated</span> The `.navbar-dark` class has been deprecated and replaced with `data-bs-theme=\"dark\"` on the navbar or any parent element. [See the docs for updated examples.]([[docsref:/components/navbar#color-schemes]])\n\n### Progress bars\n\nThe markup for [progress bars]([[docsref:/components/progress]]) has been updated in v5.3.0. Due to the placement of `role` and various `aria-` attributes on the inner `.progress-bar` element, **some screen readers were not announcing zero value progress bars**. Now, `role=\"progressbar\"` and the relevant `aria-*` attributes are on the outer `.progress` element, leaving the `.progress-bar` purely for the visual presentation of the bar and optional label.\n\nWhile we recommend adopting the new markup for improved compatibility with all screen readers, note that the legacy progress bar structure will continue to work as before.\n\n```html\n<!-- Previous markup -->\n<div class=\"progress\">\n  <div class=\"progress-bar\" role=\"progressbar\" aria-label=\"Basic example\" style=\"width: 25%\" aria-valuenow=\"25\" aria-valuemin=\"0\" aria-valuemax=\"100\"></div>\n</div>\n\n<!-- New markup -->\n<div class=\"progress\" role=\"progressbar\" aria-label=\"Basic example\" aria-valuenow=\"25\" aria-valuemin=\"0\" aria-valuemax=\"100\">\n  <div class=\"progress-bar\" style=\"width: 25%\"></div>\n</div>\n```\n\nWe’ve also introduced a new `.progress-stacked` class to more logically wrap [multiple progress bars]([[docsref:/components/progress#multiple-bars]]) into a single stacked progress bar.\n\n```html\n<!-- Previous markup -->\n<div class=\"progress\">\n  <div class=\"progress-bar\" role=\"progressbar\" aria-label=\"Segment one\" style=\"width: 15%\" aria-valuenow=\"15\" aria-valuemin=\"0\" aria-valuemax=\"100\"></div>\n  <div class=\"progress-bar bg-success\" role=\"progressbar\" aria-label=\"Segment two\" style=\"width: 30%\" aria-valuenow=\"30\" aria-valuemin=\"0\" aria-valuemax=\"100\"></div>\n  <div class=\"progress-bar bg-info\" role=\"progressbar\" aria-label=\"Segment three\" style=\"width: 20%\" aria-valuenow=\"20\" aria-valuemin=\"0\" aria-valuemax=\"100\"></div>\n</div>\n\n<!-- New markup -->\n<div class=\"progress-stacked\">\n  <div class=\"progress\" role=\"progressbar\" aria-label=\"Segment one\" aria-valuenow=\"15\" aria-valuemin=\"0\" aria-valuemax=\"100\" style=\"width: 15%\">\n    <div class=\"progress-bar\"></div>\n  </div>\n  <div class=\"progress\" role=\"progressbar\" aria-label=\"Segment two\" aria-valuenow=\"30\" aria-valuemin=\"0\" aria-valuemax=\"100\" style=\"width: 30%\">\n    <div class=\"progress-bar bg-success\"></div>\n  </div>\n  <div class=\"progress\" role=\"progressbar\" aria-label=\"Segment three\" aria-valuenow=\"20\" aria-valuemin=\"0\" aria-valuemax=\"100\" style=\"width: 20%\">\n    <div class=\"progress-bar bg-info\"></div>\n  </div>\n</div>\n```\n\n### Forms\n\n- `.form-control` is now styled with CSS variables to support color modes. This includes the addition of two new root CSS variables for the default and disabled form control backgrounds.\n\n- `.form-check` and `.form-switch` components are now built with CSS variables for setting the `background-image`. The usage here differs from other components in that the various focus, active, etc states for each component aren’t set on the base class. Instead, the states override one variable (e.g., `--bs-form-switch-bg`).\n\n- Floating form labels now have a `background-color` to fix support for `<textarea>` elements. Additional changes have been made to also support disabled states and more.\n\n- Fixed display of date and time inputs in WebKit based browsers.\n\n### Utilities\n\n- <span class=\"badge text-warning-emphasis bg-warning-subtle\">Deprecated</span> `.text-muted` will be replaced by `.text-body-secondary` in v6.\n\n  With the addition of the expanded theme colors and variables, the `.text-muted` variables and utility have been deprecated with v5.3.0. Its default value has also been reassigned to the new `--bs-secondary-color` CSS variable to better support color modes. It will be removed in v6.0.0.\n\n- Adds new `.overflow-x`, `.overflow-y`, and several `.object-fit-*` utilities. _The object-fit property is used to specify how an `<img>` or `<video>` should be resized to fit its container, giving us a responsive alternative to using `background-image` for a resizable fill/fit image._\n\n- Adds new `.fw-medium` utility.\n\n- Added new [`.z-*` utilities]([[docsref:/utilities/z-index]]) for `z-index`.\n\n- [Box shadow utilities]([[docsref:/utilities/shadows]]) (and Sass variables) have been updated for dark mode. They now use `--bs-body-color-rgb` to generate the `rgba()` color values, allowing them to easily adapt to color modes based on the specified foreground color.\n\nFor a complete list of changes, [see the v5.3.0 project on GitHub](https://github.com/twbs/bootstrap/projects/).\n\n## v5.2.0\n\n<hr class=\"mb-4\"/>\n\n### Refreshed design\n\nBootstrap v5.2.0 features a subtle design update for a handful of components and properties across the project, **most notably through refined `border-radius` values on buttons and form controls**. Our documentation also has been updated with a new homepage, simpler docs layout that no longer collapses sections of the sidebar, and more prominent examples of [Bootstrap Icons](https://icons.getbootstrap.com).\n\n### More CSS variables\n\n**We’ve updated all our components to use CSS variables.** While Sass still underpins everything, each component has been updated to include CSS variables on the component base classes (e.g., `.btn`), allowing for more real-time customization of Bootstrap. In subsequent releases, we'll continue to expand our use of CSS variables into our layout, forms, helpers, and utilities. Read more about CSS variables in each component on their respective documentation pages.\n\nOur CSS variable usage will be somewhat incomplete until Bootstrap 6. While we’d love to fully implement these across the board, they do run the risk of causing breaking changes. For example, setting `$alert-border-width: var(--bs-border-width)` in our source code breaks potential Sass in your own code if you were doing `$alert-border-width * 2` for some reason.\n\nAs such, wherever possible, we will continue to push towards more CSS variables, but please recognize our implementation may be slightly limited in v5.\n\n### New `_maps.scss`\n\n**Bootstrap v5.2.0 introduced a new Sass file with `_maps.scss`.** It pulls out several Sass maps from `_variables.scss` to fix an issue where updates to an original map were not applied to secondary maps that extend them. For example, updates to `$theme-colors` were not being applied to other theme maps that relied on `$theme-colors`, breaking key customization workflows. In short, Sass has a limitation where once a default variable or map has been _used_, it cannot be updated. _There’s a similar shortcoming with CSS variables when they’re used to compose other CSS variables._\n\nThis is why variable customizations in Bootstrap have to come after `@import \"functions\"`, but before `@import \"variables\"` and the rest of our import stack. The same applies to Sass maps—you must override the defaults before they get used. The following maps have been moved to the new `_maps.scss`:\n\n- `$theme-colors-rgb`\n- `$utilities-colors`\n- `$utilities-text`\n- `$utilities-text-colors`\n- `$utilities-bg`\n- `$utilities-bg-colors`\n- `$negative-spacers`\n- `$gutters`\n\nYour custom Bootstrap CSS builds should now look something like this with a separate maps import.\n\n```diff\n  // Functions come first\n  @import \"functions\";\n\n  // Optional variable overrides here\n+ $custom-color: #df711b;\n+ $custom-theme-colors: (\n+   \"custom\": $custom-color\n+ );\n\n  // Variables come next\n  @import \"variables\";\n\n+ // Optional Sass map overrides here\n+ $theme-colors: map-merge($theme-colors, $custom-theme-colors);\n+\n+ // Followed by our default maps\n+ @import \"maps\";\n+\n  // Rest of our imports\n  @import \"mixins\";\n  @import \"utilities\";\n  @import \"root\";\n  @import \"reboot\";\n  // etc\n```\n\n### New utilities\n\n- Expanded [`font-weight` utilities]([[docsref:/utilities/text#font-weight-and-italics]]) to include `.fw-semibold` for semibold fonts.\n- Expanded [`border-radius` utilities]([[docsref:/utilities/borders#sizes]]) to include two new sizes, `.rounded-4` and `.rounded-5`, for more options.\n\n### Additional changes\n\n- **Introduced new `$enable-container-classes` option. —** Now when opting into the experimental CSS Grid layout, `.container-*` classes will still be compiled, unless this option is set to `false`. Containers also now keep their gutter values.\n\n- **Offcanvas component now has [responsive variations]([[docsref:/components/offcanvas#responsive]]).** The original `.offcanvas` class remains unchanged—it hides content across all viewports. To make it responsive, change that `.offcanvas` class to any `.offcanvas-{sm|md|lg|xl|xxl}` class.\n\n- **Thicker table dividers are now opt-in. —** We’ve removed the thicker and more difficult to override border between table groups and moved it to an optional class you can apply, `.table-group-divider`. [See the table docs for an example.]([[docsref:/content/tables#table-group-dividers]])\n\n- **[Scrollspy has been rewritten](https://github.com/twbs/bootstrap/pull/33421) to use the Intersection Observer API**, which means you no longer need relative parent wrappers, deprecates `offset` config, and more. Look for your Scrollspy implementations to be more accurate and consistent in their nav highlighting.\n\n- **Popovers and tooltips now use CSS variables.** Some CSS variables have been updated from their Sass counterparts to reduce the number of variables. As a result, three variables have been deprecated in this release: `$popover-arrow-color`, `$popover-arrow-outer-color`, and `$tooltip-arrow-color`.\n\n- **Added new `.text-bg-{color}` helpers.** Instead of setting individual `.text-*` and `.bg-*` utilities, you can now use [the `.text-bg-*` helpers]([[docsref:helpers/color-background]]) to set a `background-color` with contrasting foreground `color`.\n\n- Added `.form-check-reverse` modifier to flip the order of labels and associated checkboxes/radios.\n\n- Added [striped columns]([[docsref:/content/tables#striped-columns]]) support to tables via the new `.table-striped-columns` class.\n\nFor a complete list of changes, [see the v5.2.0 project on GitHub](https://github.com/twbs/bootstrap/projects/32).\n\n## v5.1.0\n\n<hr class=\"mb-4\"/>\n\n- **Added experimental support for [CSS Grid layout]([[docsref:/layout/css-grid]]). —** This is a work in progress, and is not yet ready for production use, but you can opt into the new feature via Sass. To enable it, disable the default grid, by setting `$enable-grid-classes: false` and enable the CSS Grid by setting `$enable-cssgrid: true`.\n\n- **Updated navbars to support offcanvas. —** Add [offcanvas drawers in any navbar]([[docsref:/components/navbar#offcanvas]]) with the responsive `.navbar-expand-*` classes and some offcanvas markup.\n\n- **Added new [placeholder component]([[docsref:/components/placeholders/]]). —** Our newest component, a way to provide temporary blocks in lieu of real content to help indicate that something is still loading in your site or app.\n\n- **Collapse plugin now supports [horizontal collapsing]([[docsref:/components/collapse#horizontal]]). —** Add `.collapse-horizontal` to your `.collapse` to collapse the `width` instead of the `height`. Avoid browser repainting by setting a `min-height` or `height`.\n\n- **Added new stack and vertical rule helpers. —** Quickly apply multiple flexbox properties to quickly create custom layouts with [stacks]([[docsref:/helpers/stacks/]]). Choose from horizontal (`.hstack`) and vertical (`.vstack`) stacks. Add vertical dividers similar to `<hr>` elements with the [new `.vr` helpers]([[docsref:/helpers/vertical-rule/]]).\n\n- **Added new global `:root` CSS variables. —** Added several new CSS variables to the `:root` level for controlling `<body>` styles. More are in the works, including across our utilities and components, but for now read up [CSS variables in the Customize section]([[docsref:/customize/css-variables/]]).\n\n- **Overhauled color and background utilities to use CSS variables, and added new [text opacity]([[docsref:/utilities/text#opacity]]) and [background opacity]([[docsref:/utilities/background#opacity]]) utilities. —** `.text-*` and `.bg-*` utilities are now built with CSS variables and `rgba()` color values, allowing you to easily customize any utility with new opacity utilities.\n\n- **Added new snippet examples based to show how to customize our components. —** Pull ready to use customized components and other common design patterns with our new [Snippets examples]([[docsref:/examples/#snippets]]). Includes [footers]([[docsref:/examples/footers/]]), [dropdowns]([[docsref:/examples/dropdowns/]]), [list groups]([[docsref:/examples/list-groups/]]), and [modals]([[docsref:/examples/modals/]]).\n\n- **Removed unused positioning styles from popovers and tooltips** as these are handled solely by Popper. `$tooltip-margin` has been deprecated and set to `null` in the process.\n\nWant more information? [Read the v5.1.0 blog post.](https://blog.getbootstrap.com/2021/08/04/bootstrap-5-1-0/)\n\n## v5.0.0\n\n<hr class=\"mb-4\"/>\n\n<Callout>\n**Hey there!** Changes to our first major release of Bootstrap 5, v5.0.0, are documented below. They don’t reflect the additional changes shown above.\n</Callout>\n\n### Dependencies\n\n- Dropped jQuery.\n- Upgraded from Popper v1.x to Popper v2.x.\n- Replaced Libsass with Dart Sass as our Sass compiler given Libsass was deprecated.\n- Migrated from Jekyll to Hugo for building our documentation\n\n### Browser support\n\n- Dropped Internet Explorer 10 and 11\n- Dropped Microsoft Edge < 16 (Legacy Edge)\n- Dropped Firefox < 60\n- Dropped Safari < 12\n- Dropped iOS Safari < 12\n- Dropped Chrome < 60\n\n<hr class=\"my-5\"/>\n\n### Documentation changes\n\n- Redesigned homepage, docs layout, and footer.\n- Added [new Parcel guide]([[docsref:/getting-started/parcel]]).\n- Added [new Customize section]([[docsref:/customize/overview/]]), replacing [v4’s Theming page](https://getbootstrap.com/docs/4.6/getting-started/theming/), with new details on Sass, global configuration options, color schemes, CSS variables, and more.\n- Reorganized all form documentation into [new Forms section]([[docsref:/forms/overview/]]), breaking apart the content into more focused pages.\n- Similarly, updated [the Layout section]([[docsref:/layout/breakpoints]]), to flesh out grid content more clearly.\n- Renamed “Navs” component page to \"Navs & Tabs\".\n- Renamed “Checks” page to \"Checks & radios\".\n- Redesigned the navbar and added a new subnav to make it easier to get around our sites and docs versions.\n- Added new keyboard shortcut for the search field: <kbd><kbd>Ctrl</kbd> + <kbd>/</kbd></kbd>.\n\n### Sass\n\n- We’ve ditched the default Sass map merges to make it easier to remove redundant values. Keep in mind you now have to define all values in the Sass maps like `$theme-colors`. Check out how to deal with [Sass maps]([[docsref:/customize/sass#maps-and-loops]]).\n\n- <span class=\"badge text-bg-danger\">Breaking</span> Renamed `color-yiq()` function and related variables to `color-contrast()` as it’s no longer related to YIQ color space. [See #30168.](https://github.com/twbs/bootstrap/pull/30168/)\n  - `$yiq-contrasted-threshold` is renamed to `$min-contrast-ratio`.\n  - `$yiq-text-dark` and `$yiq-text-light` are respectively renamed to `$color-contrast-dark` and `$color-contrast-light`.\n\n- <span class=\"badge text-bg-danger\">Breaking</span> Media query mixins parameters have changed for a more logical approach.\n  - `media-breakpoint-down()` uses the breakpoint itself instead of the next breakpoint (e.g., `media-breakpoint-down(lg)` instead of `media-breakpoint-down(md)` targets viewports smaller than `lg`).\n  - Similarly, the second parameter in `media-breakpoint-between()` also uses the breakpoint itself instead of the next breakpoint (e.g., `media-breakpoint-between(sm, lg)` instead of `media-breakpoint-between(sm, md)` targets viewports between `sm` and `lg`).\n\n- <span class=\"badge text-bg-danger\">Breaking</span> Removed print styles and `$enable-print-styles` variable. Print display classes are still around. [See #28339](https://github.com/twbs/bootstrap/pull/28339).\n\n- <span class=\"badge text-bg-danger\">Breaking</span> Dropped `color()`, `theme-color()`, and `gray()` functions in favor of variables. [See #29083](https://github.com/twbs/bootstrap/pull/29083).\n\n- <span class=\"badge text-bg-danger\">Breaking</span> Renamed `theme-color-level()` function to `color-level()` and now accepts any color you want instead of only `$theme-color` colors. [See #29083](https://github.com/twbs/bootstrap/pull/29083) **Watch out:** `color-level()` was later on dropped in `v5.0.0-alpha3`.\n\n- <span class=\"badge text-bg-danger\">Breaking</span> Renamed `$enable-prefers-reduced-motion-media-query` and `$enable-pointer-cursor-for-buttons` to `$enable-reduced-motion` and `$enable-button-pointers` for brevity.\n\n- <span class=\"badge text-bg-danger\">Breaking</span> Removed the `bg-gradient-variant()` mixin. Use the `.bg-gradient` class to add gradients to elements instead of the generated `.bg-gradient-*` classes.\n\n- <span class=\"badge text-bg-danger\">Breaking</span> **Removed previously deprecated mixins:**\n  - `hover`, `hover-focus`, `plain-hover-focus`, and `hover-focus-active`\n  - `float()`\n  - `form-control-mixin()`\n  - `nav-divider()`\n  - `retina-img()`\n  - `text-hide()` (also dropped the associated utility class, `.text-hide`)\n  - `visibility()`\n  - `form-control-focus()`\n\n- <span class=\"badge text-bg-danger\">Breaking</span> Renamed `scale-color()` function to `shift-color()` to avoid collision with Sass’s own color scaling function.\n\n- `box-shadow` mixins now allow `null` values and drop `none` from multiple arguments. [See #30394](https://github.com/twbs/bootstrap/pull/30394).\n\n- The `border-radius()` mixin now has a default value.\n\n### Color system\n\n- The color system which worked with `color-level()` and `$theme-color-interval` was removed in favor of a new color system. All `lighten()` and `darken()` functions in our codebase are replaced by `tint-color()` and `shade-color()`. These functions will mix the color with either white or black instead of changing its lightness by a fixed amount. The `shift-color()` will either tint or shade a color depending on whether its weight parameter is positive or negative. [See #30622](https://github.com/twbs/bootstrap/pull/30622) for more details.\n\n- Added new tints and shades for every color, providing nine separate colors for each base color, as new Sass variables.\n\n- Improved color contrast. Bumped color contrast ratio from 3:1 to 4.5:1 and updated blue, green, cyan, and pink colors to ensure WCAG 2.2 AA contrast. Also changed our color contrast color from `$gray-900` to `$black`.\n\n- To support our color system, we’ve added new custom `tint-color()` and `shade-color()` functions to mix our colors appropriately.\n\n### Grid updates\n\n- **New breakpoint!** Added new `xxl` breakpoint for `1400px` and up. No changes to all other breakpoints.\n\n- **Improved gutters.** Gutters are now set in rems, and are narrower than v4 (`1.5rem`, or about `24px`, down from `30px`). This aligns our grid system’s gutters with our spacing utilities.\n  - Added new [gutter class]([[docsref:/layout/gutters]]) (`.g-*`, `.gx-*`, and `.gy-*`) to control horizontal/vertical gutters, horizontal gutters, and vertical gutters.\n  - <span class=\"badge text-bg-danger\">Breaking</span> Renamed `.no-gutters` to `.g-0` to match new gutter utilities.\n\n- Columns no longer have `position: relative` applied, so you may have to add `.position-relative` to some elements to restore that behavior.\n\n- <span class=\"badge text-bg-danger\">Breaking</span> Dropped several `.order-*` classes that often went unused. We now only provide `.order-0` to `.order-5` out of the box.\n\n- <span class=\"badge text-bg-danger\">Breaking</span> Dropped the `.media` component as it can be easily replicated with utilities. [See #28265](https://github.com/twbs/bootstrap/pull/28265) and the [flex utilities page for an example]([[docsref:/utilities/flex#media-object]]).\n\n- <span class=\"badge text-bg-danger\">Breaking</span> `bootstrap-grid.css` now only applies `box-sizing: border-box` to the column instead of resetting the global box-sizing. This way, our grid styles can be used in more places without interference.\n\n- `$enable-grid-classes` no longer disables the generation of container classes anymore. [See #29146.](https://github.com/twbs/bootstrap/pull/29146)\n\n- Updated the `make-col` mixin to default to equal columns without a specified size.\n\n### Content, Reboot, etc\n\n- **[RFS]([[docsref:/getting-started/rfs]]) is now enabled by default.** Headings using the `font-size()` mixin will automatically adjust their `font-size` to scale with the viewport. _This feature was previously opt-in with v4._\n\n- <span class=\"badge text-bg-danger\">Breaking</span> Overhauled our display typography to replace our `$display-*` variables and with a `$display-font-sizes` Sass map. Also removed the individual `$display-*-weight` variables for a single `$display-font-weight` and adjusted `font-size`s.\n\n- Added two new `.display-*` heading sizes, `.display-5` and `.display-6`.\n\n- **Links are underlined by default** (not just on hover), unless they’re part of specific components.\n\n- **Redesigned tables** to refresh their styles and rebuild them with CSS variables for more control over styling.\n\n- <span class=\"badge text-bg-danger\">Breaking</span> Nested tables do not inherit styles anymore.\n\n- <span class=\"badge text-bg-danger\">Breaking</span> `.thead-light` and `.thead-dark` are dropped in favor of the `.table-*` variant classes which can be used for all table elements (`thead`, `tbody`, `tfoot`, `tr`, `th` and `td`).\n\n- <span class=\"badge text-bg-danger\">Breaking</span> The `table-row-variant()` mixin is renamed to `table-variant()` and accepts only 2 parameters: `$color` (color name) and `$value` (color code). The border color and accent colors are automatically calculated based on the table factor variables.\n\n- Split table cell padding variables into `-y` and `-x`.\n\n- <span class=\"badge text-bg-danger\">Breaking</span> Dropped `.pre-scrollable` class. [See #29135](https://github.com/twbs/bootstrap/pull/29135)\n\n- <span class=\"badge text-bg-danger\">Breaking</span> `.text-*` utilities do not add hover and focus states to links anymore. `.link-*` helper classes can be used instead. [See #29267](https://github.com/twbs/bootstrap/pull/29267)\n\n- <span class=\"badge text-bg-danger\">Breaking</span> Dropped `.text-justify` class. [See #29793](https://github.com/twbs/bootstrap/pull/29793)\n\n- <span class=\"badge text-bg-danger\">Breaking</span> ~~`<hr>` elements now use `height` instead of `border` to better support the `size` attribute. This also enables use of padding utilities to create thicker dividers (e.g., `<hr class=\"py-1\">`).~~\n\n- Reset default horizontal `padding-left` on `<ul>` and `<ol>` elements from browser default `40px` to `2rem`.\n\n- Added `$enable-smooth-scroll`, which applies `scroll-behavior: smooth` globally—except for users asking for reduced motion through `prefers-reduced-motion` media query. [See #31877](https://github.com/twbs/bootstrap/pull/31877)\n\n### RTL\n\n- Horizontal direction specific variables, utilities, and mixins have all been renamed to use logical properties like those found in flexbox layouts—e.g., `start` and `end` in lieu of `left` and `right`.\n\n### Forms\n\n- **Added new floating forms!** We’ve promoted the Floating labels example to fully supported form components. [See the new Floating labels page.]([[docsref:/forms/floating-labels]])\n\n- <span class=\"badge text-bg-danger\">Breaking</span> **Consolidated native and custom form elements.** Checkboxes, radios, selects, and other inputs that had native and custom classes in v4 have been consolidated. Now nearly all our form elements are entirely custom, most without the need for custom HTML.\n  - `.custom-control.custom-checkbox` is now `.form-check`.\n  - `.custom-control.custom-radio` is now `.form-check`.\n  - `.custom-control.custom-switch` is now `.form-check.form-switch`.\n  - `.custom-select` is now `.form-select`.\n  - `.custom-file` and `.form-control-file` have been replaced by custom styles on top of `.form-control`.\n  - `.custom-range` is now `.form-range`.\n  - Dropped native `.form-control-file` and `.form-control-range`.\n\n- <span class=\"badge text-bg-danger\">Breaking</span> Dropped `.input-group-append` and `.input-group-prepend`. You can now just add buttons and `.input-group-text` as direct children of the input groups.\n\n- The longstanding [Missing border radius on input group with validation feedback bug](https://github.com/twbs/bootstrap/issues/25110) is finally fixed by adding an additional `.has-validation` class to input groups with validation.\n\n- <span class=\"badge text-bg-danger\">Breaking</span> **Dropped form-specific layout classes for our grid system.** Use our grid and utilities instead of `.form-group`, `.form-row`, or `.form-inline`.\n\n- <span class=\"badge text-bg-danger\">Breaking</span> Form labels now require `.form-label`.\n\n- <span class=\"badge text-bg-danger\">Breaking</span> `.form-text` no longer sets `display`, allowing you to create inline or block help text as you wish just by changing the HTML element.\n\n- Form controls no longer used fixed `height` when possible, instead deferring to `min-height` to improve customization and compatibility with other components.\n\n- Validation icons are no longer applied to `<select>`s with `multiple`.\n\n- Rearranged source Sass files under `scss/forms/`, including input group styles.\n\n<hr class=\"my-5\"/>\n\n### Components\n\n- Unified `padding` values for alerts, breadcrumbs, cards, dropdowns, list groups, modals, popovers, and tooltips to be based on our `$spacer` variable. [See #30564](https://github.com/twbs/bootstrap/pull/30564).\n\n#### Accordion\n\n- Added [new accordion component]([[docsref:/components/accordion]]).\n\n#### Alerts\n\n- Alerts now have [examples with icons]([[docsref:/components/alerts#icons]]).\n\n- Removed custom styles for `<hr>`s in each alert since they already use `currentColor`.\n\n#### Badges\n\n- <span class=\"badge text-bg-danger\">Breaking</span> Dropped all `.badge-*` color classes for background utilities (e.g., use `.bg-primary` instead of `.badge-primary`).\n\n- <span class=\"badge text-bg-danger\">Breaking</span> Dropped `.badge-pill`—use the `.rounded-pill` utility instead.\n\n- <span class=\"badge text-bg-danger\">Breaking</span> Removed hover and focus styles for `<a>` and `<button>` elements.\n\n- Increased default padding for badges from `.25em`/`.5em` to `.35em`/`.65em`.\n\n#### Breadcrumbs\n\n- Simplified the default appearance of breadcrumbs by removing `padding`, `background-color`, and `border-radius`.\n\n- Added new CSS custom property `--bs-breadcrumb-divider` for easy customization without needing to recompile CSS.\n\n#### Buttons\n\n- <span class=\"badge text-bg-danger\">Breaking</span> **[Toggle buttons]([[docsref:/forms/checks-radios#toggle-buttons]]), with checkboxes or radios, no longer require JavaScript and have new markup.** We no longer require a wrapping element, add `.btn-check` to the `<input>`, and pair it with any `.btn` classes on the `<label>`. [See #30650](https://github.com/twbs/bootstrap/pull/30650). _The docs for this has moved from our Buttons page to the new Forms section._\n\n- <span class=\"badge text-bg-danger\">Breaking</span> **Dropped `.btn-block` for utilities.** Instead of using `.btn-block` on the `.btn`, wrap your buttons with `.d-grid` and a `.gap-*` utility to space them as needed. Switch to responsive classes for even more control over them. [Read the docs for some examples.]([[docsref:/components/buttons#block-buttons]])\n\n- Updated our `button-variant()` and `button-outline-variant()` mixins to support additional parameters.\n\n- Updated buttons to ensure increased contrast on hover and active states.\n\n- Disabled buttons now have `pointer-events: none;`.\n\n#### Card\n\n- <span class=\"badge text-bg-danger\">Breaking</span> Dropped `.card-deck` in favor of our grid. Wrap your cards in column classes and add a parent `.row-cols-*` container to recreate card decks (but with more control over responsive alignment).\n\n- <span class=\"badge text-bg-danger\">Breaking</span> Dropped `.card-columns` in favor of Masonry. [See #28922](https://github.com/twbs/bootstrap/pull/28922).\n\n- <span class=\"badge text-bg-danger\">Breaking</span> Replaced the `.card` based accordion with a [new Accordion component]([[docsref:/components/accordion]]).\n\n#### Carousel\n\n- Added new [`.carousel-dark` variant]([[docsref:/components/carousel#dark-variant]]) for dark text, controls, and indicators (great for lighter backgrounds).\n\n- Replaced chevron icons for carousel controls with new SVGs from [Bootstrap Icons]([[config:icons]]).\n\n#### Close button\n\n- <span class=\"badge text-bg-danger\">Breaking</span> Renamed `.close` to `.btn-close` for a less generic name.\n\n- Close buttons now use a `background-image` (embedded SVG) instead of a `&times;` in the HTML, allowing for easier customization without the need to touch your markup.\n\n- Added new `.btn-close-white` variant that uses `filter: invert(1)` to enable higher contrast dismiss icons against darker backgrounds.\n\n#### Collapse\n\n- Removed scroll anchoring for accordions.\n\n#### Dropdowns\n\n- Added new `.dropdown-menu-dark` variant and associated variables for on-demand dark dropdowns.\n\n- Added new variable for `$dropdown-padding-x`.\n\n- Darkened the dropdown divider for improved contrast.\n\n- <span class=\"badge text-bg-danger\">Breaking</span> All the events for the dropdown are now triggered on the dropdown toggle button and then bubbled up to the parent element.\n\n- Dropdown menus now have a `data-bs-popper=\"static\"` attribute set when the positioning of the dropdown is static, or dropdown is in the navbar. This is added by our JavaScript and helps us use custom position styles without interfering with Popper’s positioning.\n\n- <span class=\"badge text-bg-danger\">Breaking</span> Dropped `flip` option for dropdown plugin in favor of native Popper configuration. You can now disable the flipping behavior by passing an empty array for [`fallbackPlacements`](https://popper.js.org/docs/v2/modifiers/flip/#fallbackplacements) option in [flip](https://popper.js.org/docs/v2/modifiers/flip/) modifier.\n\n- Dropdown menus can now be clickable with a new `autoClose` option to handle the [auto close behavior]([[docsref:/components/dropdowns#auto-close-behavior]]). You can use this option to accept the click inside or outside the dropdown menu to make it interactive.\n\n- Dropdowns now support `.dropdown-item`s wrapped in `<li>`s.\n\n#### Jumbotron\n\n- <span class=\"badge text-bg-danger\">Breaking</span> Dropped the jumbotron component as it can be replicated with utilities. [See our new Jumbotron example for a demo.]([[docsref:/examples/jumbotron]])\n\n#### List group\n\n- Added new [`.list-group-numbered` modifier]([[docsref:/components/list-group#numbered]]) to list groups.\n\n#### Navs and tabs\n\n- Added new `null` variables for `font-size`, `font-weight`, `color`, and `:hover` `color` to the `.nav-link` class.\n\n#### Navbars\n\n- <span class=\"badge text-bg-danger\">Breaking</span> Navbars now require a container within (to drastically simplify spacing requirements and CSS required).\n- <span class=\"badge text-bg-danger\">Breaking</span> The `.active` class can no longer be applied to `.nav-item`s, it must be applied directly on `.nav-link`s.\n\n#### Offcanvas\n\n- Added the new [offcanvas component]([[docsref:/components/offcanvas]]).\n\n#### Pagination\n\n- Pagination links now have customizable `margin-left` that are dynamically rounded on all corners when separated from one another.\n\n- Added `transition`s to pagination links.\n\n#### Popovers\n\n- <span class=\"badge text-bg-danger\">Breaking</span> Renamed `.arrow` to `.popover-arrow` in our default popover template.\n\n- Renamed `whiteList` option to `allowList`.\n\n#### Spinners\n\n- Spinners now honor `prefers-reduced-motion: reduce` by slowing down animations. [See #31882](https://github.com/twbs/bootstrap/pull/31882).\n\n- Improved spinner vertical alignment.\n\n#### Toasts\n\n- Toasts can now be [positioned]([[docsref:/components/toasts#placement]]) in a `.toast-container` with the help of [positioning utilities]([[docsref:/utilities/position]]).\n\n- Changed default toast duration to 5 seconds.\n\n- Removed `overflow: hidden` from toasts and replaced with proper `border-radius`s with `calc()` functions.\n\n#### Tooltips\n\n- <span class=\"badge text-bg-danger\">Breaking</span> Renamed `.arrow` to `.tooltip-arrow` in our default tooltip template.\n\n- <span class=\"badge text-bg-danger\">Breaking</span> The default value for the `fallbackPlacements` is changed to `['top', 'right', 'bottom', 'left']` for better placement of popper elements.\n\n- <span class=\"badge text-bg-danger\">Breaking</span> Renamed `whiteList` option to `allowList`.\n\n### Utilities\n\n- <span class=\"badge text-bg-danger\">Breaking</span> Renamed several utilities to use logical property names instead of directional names with the addition of RTL support:\n  - Renamed `.float-left` and `.float-right` to `.float-start` and `.float-end`.\n  - Renamed `.border-left` and `.border-right` to `.border-start` and `.border-end`.\n  - Renamed `.rounded-left` and `.rounded-right` to `.rounded-start` and `.rounded-end`.\n  - Renamed `.ml-*` and `.mr-*` to `.ms-*` and `.me-*`.\n  - Renamed `.pl-*` and `.pr-*` to `.ps-*` and `.pe-*`.\n  - Renamed `.text-*-left` and `.text-*-right` to `.text-*-start` and `.text-*-end`.\n\n- <span class=\"badge text-bg-danger\">Breaking</span> Disabled negative margins by default.\n\n- Added new `.bg-body` class for quickly setting the `<body>`’s background to additional elements.\n\n- Added new [position utilities]([[docsref:/utilities/position#arrange-elements]]) for `top`, `right`, `bottom`, and `left`. Values include `0`, `50%`, and `100%` for each property.\n\n- Added new `.translate-middle-x` & `.translate-middle-y` utilities to horizontally or vertically center absolute/fixed positioned elements.\n\n- Added new [`border-width` utilities]([[docsref:/utilities/borders#border-width]]).\n\n- <span class=\"badge text-bg-danger\">Breaking</span> Renamed `.text-monospace` to `.font-monospace`.\n\n- <span class=\"badge text-bg-danger\">Breaking</span> Removed `.text-hide` as it’s an antiquated method for hiding text that shouldn’t be used anymore.\n\n- Added `.fs-*` utilities for `font-size` utilities (with RFS enabled). These use the same scale as HTML’s default headings (1-6, large to small), and can be modified via Sass map.\n\n- <span class=\"badge text-bg-danger\">Breaking</span> Renamed `.font-weight-*` utilities as `.fw-*` for brevity and consistency.\n\n- <span class=\"badge text-bg-danger\">Breaking</span> Renamed `.font-italic` utility to `.fst-italic` for brevity and consistency with new `.fst-normal` utility.\n\n- Added `.d-grid` to display utilities and new `gap` utilities (`.gap`) for CSS Grid and flexbox layouts.\n\n- <span class=\"badge text-bg-danger\">Breaking</span> Removed `.rounded-sm` and `rounded-lg`, and introduced a new scale of classes, `.rounded-0` to `.rounded-3`. [See #31687](https://github.com/twbs/bootstrap/pull/31687).\n\n- Added new `line-height` utilities: `.lh-1`, `.lh-sm`, `.lh-base` and `.lh-lg`. See [here]([[docsref:/utilities/text#line-height]]).\n\n- Moved the `.d-none` utility in our CSS to give it more weight over other display utilities.\n\n- Extended the `.visually-hidden-focusable` helper to also work on containers, using `:focus-within`.\n\n### Helpers\n\n- <span class=\"badge text-bg-danger\">Breaking</span> **Responsive embed helpers have been renamed to [ratio helpers]([[docsref:/helpers/ratio]])** with new class names and improved behaviors, as well as a helpful CSS variable.\n  - Classes have been renamed to change `by` to `x` in the aspect ratio. For example, `.ratio-16by9` is now `.ratio-16x9`.\n  - We’ve dropped the `.embed-responsive-item` and element group selector in favor of a simpler `.ratio > *` selector. No more class is needed, and the ratio helper now works with any HTML element.\n  - The `$embed-responsive-aspect-ratios` Sass map has been renamed to `$aspect-ratios` and its values have been simplified to include the class name and the percentage as the `key: value` pair.\n  - CSS variables are now generated and included for each value in the Sass map. Modify the `--bs-aspect-ratio` variable on the `.ratio` to create any [custom aspect ratio]([[docsref:/helpers/ratio#custom-ratios]]).\n\n- <span class=\"badge text-bg-danger\">Breaking</span> **\"Screen reader\" classes are now [\"visually hidden\" classes]([[docsref:/helpers/visually-hidden]]).**\n  - Changed the Sass file from `scss/helpers/_screenreaders.scss` to `scss/helpers/_visually-hidden.scss`\n  - Renamed `.sr-only` and `.sr-only-focusable` to `.visually-hidden` and `.visually-hidden-focusable`\n  - Renamed `sr-only()` and `sr-only-focusable()` mixins to `visually-hidden()` and `visually-hidden-focusable()`.\n\n- `bootstrap-utilities.css` now also includes our helpers. Helpers don’t need to be imported in custom builds anymore.\n\n### JavaScript\n\n- **Dropped jQuery dependency** and rewrote plugins to be in regular JavaScript.\n\n- <span class=\"badge text-bg-danger\">Breaking</span> Data attributes for all JavaScript plugins are now namespaced to help distinguish Bootstrap functionality from third parties and your own code. For example, we use `data-bs-toggle` instead of `data-toggle`.\n\n- **All plugins can now accept a CSS selector as the first argument.** You can either pass a DOM element or any valid CSS selector to create a new instance of the plugin:\n\n  ```js\n  const modal = new bootstrap.Modal('#myModal')\n  const dropdown = new bootstrap.Dropdown('[data-bs-toggle=\"dropdown\"]')\n  ```\n\n- `popperConfig` can be passed as a function that accepts the Bootstrap’s default Popper config as an argument, so that you can merge this default configuration in your way. **Applies to dropdowns, popovers, and tooltips.**\n\n- The default value for the `fallbackPlacements` is changed to `['top', 'right', 'bottom', 'left']` for better placement of Popper elements. **Applies to dropdowns, popovers, and tooltips.**\n\n- Removed underscore from public static methods like `_getInstance()` → `getInstance()`.\n\n- Removed `util.js`, with its functionality now integrated into individual plugins. If you previously included `util.js` manually, you can safely remove it, as it is no longer needed. Each plugin now contains only the utilities it requires, enhancing modularity and reducing dependencies.\n"
  },
  {
    "path": "site/src/content/docs/utilities/api.mdx",
    "content": "---\ntitle: Utility API\ndescription: The utility API is a Sass-based tool to generate utility classes.\naliases: \"/docs/[[config:docs_version]]/utilities/\"\ntoc: true\n---\n\nBootstrap utilities are generated with our utility API and can be used to modify or extend our default set of utility classes via Sass. Our utility API is based on a series of Sass maps and functions for generating families of classes with various options. If you’re unfamiliar with Sass maps, read up on the [official Sass docs](https://sass-lang.com/documentation/values/maps/) to get started.\n\nThe `$utilities` map contains all our utilities and is later merged with your custom `$utilities` map, if present. The utility map contains a keyed list of utility groups which accept the following options:\n\n<BsTable class=\"table table-utilities\">\n| Option | Type | Default&nbsp;value | Description |\n| --- | --- | --- | --- |\n| [`property`](#property) | **Required** | – | Name of the property, this can be a string or an array of strings (e.g., horizontal paddings or margins). |\n| [`values`](#values) | **Required** | – | List of values, or a map if you don’t want the class name to be the same as the value. If `null` is used as map key, `class` is not prepended to the class name. |\n| [`class`](#class) | Optional | null | Name of the generated class. If not provided and `property` is an array of strings, `class` will default to the first element of the `property` array. If not provided and `property` is a string, the `values` keys are used for the `class` names. |\n| [`css-var`](#css-variable-utilities) | Optional | `false` | Boolean to generate CSS variables instead of CSS rules. |\n| [`css-variable-name`](#css-variable-utilities) | Optional | null | Custom un-prefixed name for the CSS variable inside the ruleset. |\n| [`local-vars`](#local-css-variables) | Optional | null | Map of local CSS variables to generate in addition to the CSS rules. |\n| [`state`](#states) | Optional | null | List of pseudo-class variants (e.g., `:hover` or `:focus`) to generate. |\n| [`responsive`](#responsive) | Optional | `false` | Boolean indicating if responsive classes should be generated. |\n| `rfs` | Optional | `false` | Boolean to enable [fluid rescaling with RFS]([[docsref:/getting-started/rfs]]). |\n| [`print`](#print) | Optional | `false` | Boolean indicating if print classes need to be generated. |\n| `rtl` | Optional | `true` | Boolean indicating if utility should be kept in RTL. |\n</BsTable>\n\n## API explained\n\nAll utility variables are added to the `$utilities` variable within our `_utilities.scss` stylesheet. Each group of utilities looks something like this:\n\n```scss\n$utilities: (\n  \"opacity\": (\n    property: opacity,\n    values: (\n      0: 0,\n      25: .25,\n      50: .5,\n      75: .75,\n      100: 1,\n    )\n  )\n);\n```\n\nWhich outputs the following:\n\n```css\n.opacity-0 { opacity: 0; }\n.opacity-25 { opacity: .25; }\n.opacity-50 { opacity: .5; }\n.opacity-75 { opacity: .75; }\n.opacity-100 { opacity: 1; }\n```\n\n### Property\n\nThe required `property` key must be set for any utility, and it must contain a valid CSS property. This property is used in the generated utility’s ruleset. When the `class` key is omitted, it also serves as the default class name. Consider the `text-decoration` utility:\n\n```scss\n$utilities: (\n  \"text-decoration\": (\n    property: text-decoration,\n    values: none underline line-through\n  )\n);\n```\n\nOutput:\n\n```css\n.text-decoration-none { text-decoration: none !important; }\n.text-decoration-underline { text-decoration: underline !important; }\n.text-decoration-line-through { text-decoration: line-through !important; }\n```\n\n### Values\n\nUse the `values` key to specify which values for the specified `property` should be used in the generated class names and rules. Can be a list or map (set in the utilities or in a Sass variable).\n\nAs a list, like with [`text-decoration` utilities]([[docsref:/utilities/text#text-decoration]]):\n\n```scss\nvalues: none underline line-through\n```\n\nAs a map, like with [`opacity` utilities]([[docsref:/utilities/opacity]]):\n\n```scss\nvalues: (\n  0: 0,\n  25: .25,\n  50: .5,\n  75: .75,\n  100: 1,\n)\n```\n\nAs a Sass variable that sets the list or map, as in our [`position` utilities]([[docsref:/utilities/position]]):\n\n```scss\nvalues: $position-values\n```\n\n### Class\n\nUse the `class` option to change the class prefix used in the compiled CSS. For example, to change from `.opacity-*` to `.o-*`:\n\n```scss\n$utilities: (\n  \"opacity\": (\n    property: opacity,\n    class: o,\n    values: (\n      0: 0,\n      25: .25,\n      50: .5,\n      75: .75,\n      100: 1,\n    )\n  )\n);\n```\n\nOutput:\n\n```css\n.o-0 { opacity: 0 !important; }\n.o-25 { opacity: .25 !important; }\n.o-50 { opacity: .5 !important; }\n.o-75 { opacity: .75 !important; }\n.o-100 { opacity: 1 !important; }\n```\n\nIf `class: null`, generates classes for each of the `values` keys:\n\n```scss\n$utilities: (\n  \"visibility\": (\n    property: visibility,\n    class: null,\n    values: (\n      visible: visible,\n      invisible: hidden,\n    )\n  )\n);\n```\n\nOutput:\n\n```css\n.visible { visibility: visible !important; }\n.invisible { visibility: hidden !important; }\n```\n\n### CSS variable utilities\n\nSet the `css-var` boolean option to `true` and the API will generate local CSS variables for the given selector instead of the usual `property: value` rules. Add an optional `css-variable-name` to set a different CSS variable name than the class name.\n\nConsider our `.text-opacity-*` utilities. If we add the `css-variable-name` option, we'll get a custom output.\n\n```scss\n$utilities: (\n  \"text-opacity\": (\n    css-var: true,\n    css-variable-name: text-alpha,\n    class: text-opacity,\n    values: (\n      25: .25,\n      50: .5,\n      75: .75,\n      100: 1\n    )\n  ),\n);\n```\n\nOutput:\n\n```css\n.text-opacity-25 { --bs-text-alpha: .25; }\n.text-opacity-50 { --bs-text-alpha: .5; }\n.text-opacity-75 { --bs-text-alpha: .75; }\n.text-opacity-100 { --bs-text-alpha: 1; }\n```\n\n### Local CSS variables\n\nUse the `local-vars` option to specify a Sass map that will generate local CSS variables within the utility class’s ruleset. Please note that it may require additional work to consume those local CSS variables in the generated CSS rules. For example, consider our `.bg-*` utilities:\n\n```scss\n$utilities: (\n  \"background-color\": (\n    property: background-color,\n    class: bg,\n    local-vars: (\n      \"bg-opacity\": 1\n    ),\n    values: map-merge(\n      $utilities-bg-colors,\n      (\n        \"transparent\": transparent\n      )\n    )\n  )\n);\n```\n\nOutput:\n\n```css\n.bg-primary {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-primary-rgb), var(--bs-bg-opacity)) !important;\n}\n```\n\n### States\n\nUse the `state` option to generate pseudo-class variations. Example pseudo-classes are `:hover` and `:focus`. When a list of states are provided, classnames are created for that pseudo-class. For example, to change opacity on hover, add `state: hover` and you’ll get `.opacity-hover:hover` in your compiled CSS.\n\nNeed multiple pseudo-classes? Use a space-separated list of states: `state: hover focus`.\n\n```scss\n$utilities: (\n  \"opacity\": (\n    property: opacity,\n    class: opacity,\n    state: hover,\n    values: (\n      0: 0,\n      25: .25,\n      50: .5,\n      75: .75,\n      100: 1,\n    )\n  )\n);\n```\n\nOutput:\n\n```css\n.opacity-0-hover:hover { opacity: 0 !important; }\n.opacity-25-hover:hover { opacity: .25 !important; }\n.opacity-50-hover:hover { opacity: .5 !important; }\n.opacity-75-hover:hover { opacity: .75 !important; }\n.opacity-100-hover:hover { opacity: 1 !important; }\n```\n\n### Responsive\n\nAdd the `responsive` boolean to generate responsive utilities (e.g., `.opacity-md-25`) across [all breakpoints]([[docsref:/layout/breakpoints]]).\n\n```scss\n$utilities: (\n  \"opacity\": (\n    property: opacity,\n    responsive: true,\n    values: (\n      0: 0,\n      25: .25,\n      50: .5,\n      75: .75,\n      100: 1,\n    )\n  )\n);\n```\n\nOutput:\n\n```css\n.opacity-0 { opacity: 0 !important; }\n.opacity-25 { opacity: .25 !important; }\n.opacity-50 { opacity: .5 !important; }\n.opacity-75 { opacity: .75 !important; }\n.opacity-100 { opacity: 1 !important; }\n\n@media (min-width: 576px) {\n  .opacity-sm-0 { opacity: 0 !important; }\n  .opacity-sm-25 { opacity: .25 !important; }\n  .opacity-sm-50 { opacity: .5 !important; }\n  .opacity-sm-75 { opacity: .75 !important; }\n  .opacity-sm-100 { opacity: 1 !important; }\n}\n\n@media (min-width: 768px) {\n  .opacity-md-0 { opacity: 0 !important; }\n  .opacity-md-25 { opacity: .25 !important; }\n  .opacity-md-50 { opacity: .5 !important; }\n  .opacity-md-75 { opacity: .75 !important; }\n  .opacity-md-100 { opacity: 1 !important; }\n}\n\n@media (min-width: 992px) {\n  .opacity-lg-0 { opacity: 0 !important; }\n  .opacity-lg-25 { opacity: .25 !important; }\n  .opacity-lg-50 { opacity: .5 !important; }\n  .opacity-lg-75 { opacity: .75 !important; }\n  .opacity-lg-100 { opacity: 1 !important; }\n}\n\n@media (min-width: 1200px) {\n  .opacity-xl-0 { opacity: 0 !important; }\n  .opacity-xl-25 { opacity: .25 !important; }\n  .opacity-xl-50 { opacity: .5 !important; }\n  .opacity-xl-75 { opacity: .75 !important; }\n  .opacity-xl-100 { opacity: 1 !important; }\n}\n\n@media (min-width: 1400px) {\n  .opacity-xxl-0 { opacity: 0 !important; }\n  .opacity-xxl-25 { opacity: .25 !important; }\n  .opacity-xxl-50 { opacity: .5 !important; }\n  .opacity-xxl-75 { opacity: .75 !important; }\n  .opacity-xxl-100 { opacity: 1 !important; }\n}\n```\n\n### Print\n\nEnabling the `print` option will **also** generate utility classes for print, which are only applied within the `@media print { ... }` media query.\n\n```scss\n$utilities: (\n  \"opacity\": (\n    property: opacity,\n    print: true,\n    values: (\n      0: 0,\n      25: .25,\n      50: .5,\n      75: .75,\n      100: 1,\n    )\n  )\n);\n```\n\nOutput:\n\n```css\n.opacity-0 { opacity: 0 !important; }\n.opacity-25 { opacity: .25 !important; }\n.opacity-50 { opacity: .5 !important; }\n.opacity-75 { opacity: .75 !important; }\n.opacity-100 { opacity: 1 !important; }\n\n@media print {\n  .opacity-print-0 { opacity: 0 !important; }\n  .opacity-print-25 { opacity: .25 !important; }\n  .opacity-print-50 { opacity: .5 !important; }\n  .opacity-print-75 { opacity: .75 !important; }\n  .opacity-print-100 { opacity: 1 !important; }\n}\n```\n\n## Importance\n\nAll utilities generated by the API include `!important` to ensure they override components and modifier classes as intended. You can toggle this setting globally with the `$enable-important-utilities` variable (defaults to `true`).\n\n## Using the API\n\nNow that you’re familiar with how the utilities API works, learn how to add your own custom classes and modify our default utilities.\n\n### Override utilities\n\nOverride existing utilities by using the same key. For example, if you want additional responsive overflow utility classes, you can do this:\n\n```scss\n$utilities: (\n  \"overflow\": (\n    responsive: true,\n    property: overflow,\n    values: visible hidden scroll auto,\n  ),\n);\n```\n\n### Add utilities\n\nNew utilities can be added to the default `$utilities` map with a `map-merge`. Make sure our required Sass files and `_utilities.scss` are imported first, then use the `map-merge` to add your additional utilities. For example, here’s how to add a responsive `cursor` utility with three values.\n\n```scss\n@import \"bootstrap/scss/functions\";\n@import \"bootstrap/scss/variables\";\n@import \"bootstrap/scss/variables-dark\";\n@import \"bootstrap/scss/maps\";\n@import \"bootstrap/scss/mixins\";\n@import \"bootstrap/scss/utilities\";\n\n$utilities: map-merge(\n  $utilities,\n  (\n    \"cursor\": (\n      property: cursor,\n      class: cursor,\n      responsive: true,\n      values: auto pointer grab,\n    )\n  )\n);\n\n@import \"bootstrap/scss/utilities/api\";\n```\n\n### Modify utilities\n\nModify existing utilities in the default `$utilities` map with `map-get` and `map-merge` functions. In the example below, we’re adding an additional value to the `width` utilities. Start with an initial `map-merge` and then specify which utility you want to modify. From there, fetch the nested `\"width\"` map with `map-get` to access and modify the utility’s options and values.\n\n```scss\n@import \"bootstrap/scss/functions\";\n@import \"bootstrap/scss/variables\";\n@import \"bootstrap/scss/variables-dark\";\n@import \"bootstrap/scss/maps\";\n@import \"bootstrap/scss/mixins\";\n@import \"bootstrap/scss/utilities\";\n\n$utilities: map-merge(\n  $utilities,\n  (\n    \"width\": map-merge(\n      map-get($utilities, \"width\"),\n      (\n        values: map-merge(\n          map-get(map-get($utilities, \"width\"), \"values\"),\n          (10: 10%),\n        ),\n      ),\n    ),\n  )\n);\n\n@import \"bootstrap/scss/utilities/api\";\n```\n\n#### Enable responsive\n\nYou can enable responsive classes for an existing set of utilities that are not currently responsive by default. For example, to make the `border` classes responsive:\n\n```scss\n@import \"bootstrap/scss/functions\";\n@import \"bootstrap/scss/variables\";\n@import \"bootstrap/scss/variables-dark\";\n@import \"bootstrap/scss/maps\";\n@import \"bootstrap/scss/mixins\";\n@import \"bootstrap/scss/utilities\";\n\n$utilities: map-merge(\n  $utilities,\n  (\n    \"border\": map-merge(\n      map-get($utilities, \"border\"),\n      ( responsive: true ),\n    ),\n  )\n);\n\n@import \"bootstrap/scss/utilities/api\";\n```\n\nThis will now generate responsive variations of `.border` and `.border-0` for each breakpoint. Your generated CSS will look like this:\n\n```css\n.border { ... }\n.border-0 { ... }\n\n@media (min-width: 576px) {\n  .border-sm { ... }\n  .border-sm-0 { ... }\n}\n\n@media (min-width: 768px) {\n  .border-md { ... }\n  .border-md-0 { ... }\n}\n\n@media (min-width: 992px) {\n  .border-lg { ... }\n  .border-lg-0 { ... }\n}\n\n@media (min-width: 1200px) {\n  .border-xl { ... }\n  .border-xl-0 { ... }\n}\n\n@media (min-width: 1400px) {\n  .border-xxl { ... }\n  .border-xxl-0 { ... }\n}\n```\n\n#### Rename utilities\n\nMissing v4 utilities, or used to another naming convention? The utilities API can be used to override the resulting `class` of a given utility—for example, to rename `.ms-*` utilities to oldish `.ml-*`:\n\n```scss\n@import \"bootstrap/scss/functions\";\n@import \"bootstrap/scss/variables\";\n@import \"bootstrap/scss/variables-dark\";\n@import \"bootstrap/scss/maps\";\n@import \"bootstrap/scss/mixins\";\n@import \"bootstrap/scss/utilities\";\n\n$utilities: map-merge(\n  $utilities,\n  (\n    \"margin-start\": map-merge(\n      map-get($utilities, \"margin-start\"),\n      ( class: ml ),\n    ),\n  )\n);\n\n@import \"bootstrap/scss/utilities/api\";\n```\n\n### Remove utilities\n\nRemove any of the default utilities with the [`map-remove()` Sass function](https://sass-lang.com/documentation/modules/map/#remove).\n\n```scss\n@import \"bootstrap/scss/functions\";\n@import \"bootstrap/scss/variables\";\n@import \"bootstrap/scss/variables-dark\";\n@import \"bootstrap/scss/maps\";\n@import \"bootstrap/scss/mixins\";\n@import \"bootstrap/scss/utilities\";\n\n// Remove multiple utilities with a comma-separated list\n$utilities: map-remove($utilities, \"width\", \"float\");\n\n@import \"bootstrap/scss/utilities/api\";\n```\n\nYou can also use the [`map-merge()` Sass function](https://sass-lang.com/documentation/modules/map/#merge) and set the group key to `null` to remove the utility.\n\n```scss\n@import \"bootstrap/scss/functions\";\n@import \"bootstrap/scss/variables\";\n@import \"bootstrap/scss/variables-dark\";\n@import \"bootstrap/scss/maps\";\n@import \"bootstrap/scss/mixins\";\n@import \"bootstrap/scss/utilities\";\n\n$utilities: map-merge(\n  $utilities,\n  (\n    \"width\": null\n  )\n);\n\n@import \"bootstrap/scss/utilities/api\";\n```\n\n### Add, remove, modify\n\nYou can add, remove, and modify many utilities all at once with the [`map-merge()` Sass function](https://sass-lang.com/documentation/modules/map/#merge). Here’s how you can combine the previous examples into one larger map.\n\n```scss\n@import \"bootstrap/scss/functions\";\n@import \"bootstrap/scss/variables\";\n@import \"bootstrap/scss/variables-dark\";\n@import \"bootstrap/scss/maps\";\n@import \"bootstrap/scss/mixins\";\n@import \"bootstrap/scss/utilities\";\n\n$utilities: map-merge(\n  $utilities,\n  (\n    // Remove the `width` utility\n    \"width\": null,\n    // Make an existing utility responsive\n    \"border\": map-merge(\n      map-get($utilities, \"border\"),\n      ( responsive: true ),\n    ),\n    // Add new utilities\n    \"cursor\": (\n      property: cursor,\n      class: cursor,\n      responsive: true,\n      values: auto pointer grab,\n    )\n  )\n);\n\n@import \"bootstrap/scss/utilities/api\";\n```\n\n#### Remove utility in RTL\n\nSome edge cases make [RTL styling difficult](https://rtlstyling.com/posts/rtl-styling#common-things-that-might-not-work-for-rtl), such as line breaks in Arabic. Thus utilities can be dropped from RTL output by setting the `rtl` option to `false`:\n\n```scss\n$utilities: (\n  \"word-wrap\": (\n    property: word-wrap word-break,\n    class: text,\n    values: (break: break-word),\n    rtl: false\n  ),\n);\n```\n\nOutput:\n\n```css\n/* rtl:begin:remove */\n.text-break {\n  word-wrap: break-word !important;\n  word-break: break-word !important;\n}\n/* rtl:end:remove */\n```\n\nThis doesn’t output anything in RTL, thanks to [the RTLCSS `remove` control directive](https://rtlcss.com/learn/usage-guide/control-directives/#remove).\n"
  },
  {
    "path": "site/src/content/docs/utilities/background.mdx",
    "content": "---\ntitle: Background\ndescription: Convey meaning through `background-color` and add decoration with gradients.\ntoc: true\n---\n\nimport { getData } from '@libs/data'\n\n<Callout name=\"warning-color-assistive-technologies\" />\n\n## Background color\n\nSimilar to the contextual text color classes, set the background of an element to any contextual class. Background utilities **do not set `color`**, so in some cases you’ll want to use `.text-*` [color utilities]([[docsref:/utilities/colors]]).\n\n<Callout>\nBackground utilities like `.bg-*` that generated from our original `$theme-colors` Sass map don’t yet respond to color modes, however, any `.bg-*-subtle` utility will. This will be resolved in v6.\n</Callout>\n\n<Example code={[\n  ...getData('theme-colors').map((themeColor) => `<div class=\"p-3 mb-2 bg-${themeColor.name} ${themeColor.contrast_color ? `text-${themeColor.contrast_color}` : `text-white`}\">.bg-${themeColor.name}</div>\n<div class=\"p-3 mb-2 bg-${themeColor.name}-subtle text-${themeColor.name}-emphasis\">.bg-${themeColor.name}-subtle</div>`),\n  `<div class=\"p-3 mb-2 bg-body-secondary\">.bg-body-secondary</div>\n<div class=\"p-3 mb-2 bg-body-tertiary\">.bg-body-tertiary</div>\n<div class=\"p-3 mb-2 bg-body text-body\">.bg-body</div>\n<div class=\"p-3 mb-2 bg-black text-white\">.bg-black</div>\n<div class=\"p-3 mb-2 bg-white text-dark\">.bg-white</div>\n<div class=\"p-3 mb-2 bg-transparent text-body\">.bg-transparent</div>`\n]} />\n\n## Background gradient\n\nBy adding a `.bg-gradient` class, a linear gradient is added as background image to the backgrounds. This gradient starts with a semi-transparent white which fades out to the bottom.\n\nDo you need a gradient in your custom CSS? Just add `background-image: var(--bs-gradient);`.\n\n{getData('theme-colors').map((themeColor) => {\n  return (\n    <div class={`p-3 mb-2 bg-${themeColor.name} bg-gradient${themeColor.contrast_color ? (' text-' + themeColor.contrast_color) : ' text-white'}`}>.bg-{themeColor.name}.bg-gradient</div>\n  )\n})}\n<div class=\"p-3 mb-2 bg-black bg-gradient text-white\">.bg-black.bg-gradient</div>\n\n## Opacity\n\n<AddedIn version=\"5.1.0\" />\n\nAs of v5.1.0, `background-color` utilities are generated with Sass using CSS variables. This allows for real-time color changes without compilation and dynamic alpha transparency changes.\n\n### How it works\n\nConsider our default `.bg-success` utility.\n\n```css\n.bg-success {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-success-rgb), var(--bs-bg-opacity)) !important;\n}\n```\n\nWe use an RGB version of our `--bs-success` (with the value of `25, 135, 84`) CSS variable and attached a second CSS variable, `--bs-bg-opacity`, for the alpha transparency (with a default value `1` thanks to a local CSS variable). That means anytime you use `.bg-success` now, your computed `color` value is `rgba(25, 135, 84, 1)`. The local CSS variable inside each `.bg-*` class avoids inheritance issues so nested instances of the utilities don’t automatically have a modified alpha transparency.\n\n### Example\n\nTo change that opacity, override `--bs-bg-opacity` via custom styles or inline styles.\n\n<Example code={`<div class=\"bg-success p-2 text-white\">This is default success background</div>\n<div class=\"bg-success p-2\" style=\"--bs-bg-opacity: .5;\">This is 50% opacity success background</div>`} />\n\nOr, choose from any of the `.bg-opacity` utilities:\n\n<Example code={`<div class=\"bg-success p-2 text-white\">This is default success background</div>\n<div class=\"bg-success p-2 text-white bg-opacity-75\">This is 75% opacity success background</div>\n<div class=\"bg-success p-2 text-dark bg-opacity-50\">This is 50% opacity success background</div>\n<div class=\"bg-success p-2 text-dark bg-opacity-25\">This is 25% opacity success background</div>\n<div class=\"bg-success p-2 text-dark bg-opacity-10\">This is 10% opacity success background</div>`} />\n\n## CSS\n\nIn addition to the following Sass functionality, consider reading about our included [CSS custom properties]([[docsref:/customize/css-variables]]) (aka CSS variables) for colors and more.\n\n### Sass variables\n\nMost `background-color` utilities are generated by our theme colors, reassigned from our generic color palette variables.\n\n<ScssDocs name=\"color-variables\" file=\"scss/_variables.scss\" />\n\n<ScssDocs name=\"theme-color-variables\" file=\"scss/_variables.scss\" />\n\n<ScssDocs name=\"variable-gradient\" file=\"scss/_variables.scss\" />\n\nGrayscale colors are also available, but only a subset are used to generate any utilities.\n\n<ScssDocs name=\"gray-color-variables\" file=\"scss/_variables.scss\" />\n\nVariables for setting `background-color` in `.bg-*-subtle` utilities in light and dark mode:\n\n<ScssDocs name=\"theme-bg-subtle-variables\" file=\"scss/_variables.scss\" />\n\n<ScssDocs name=\"theme-bg-subtle-dark-variables\" file=\"scss/_variables-dark.scss\" />\n\n### Sass maps\n\nTheme colors are then put into a Sass map so we can loop over them to generate our utilities, component modifiers, and more.\n\n<ScssDocs name=\"theme-colors-map\" file=\"scss/_variables.scss\" />\n\nGrayscale colors are also available as a Sass map. **This map is not used to generate any utilities.**\n\n<ScssDocs name=\"gray-colors-map\" file=\"scss/_variables.scss\" />\n\nRGB colors are generated from a separate Sass map:\n\n<ScssDocs name=\"theme-colors-rgb\" file=\"scss/_maps.scss\" />\n\nBackground color opacities build on that with their own map that’s consumed by the utilities API:\n\n<ScssDocs name=\"utilities-bg-colors\" file=\"scss/_maps.scss\" />\n\nColor mode background colors are also available as a Sass map:\n\n<ScssDocs name=\"theme-bg-subtle-map\" file=\"scss/_maps.scss\" />\n\n<ScssDocs name=\"theme-bg-subtle-dark-map\" file=\"scss/_maps.scss\" />\n\n### Sass mixins\n\n**No mixins are used to generate our background utilities**, but we do have some additional mixins for other situations where you’d like to create your own gradients.\n\n<ScssDocs name=\"gradient-bg-mixin\" file=\"scss/mixins/_gradients.scss\" />\n\n<ScssDocs name=\"gradient-mixins\" file=\"scss/mixins/_gradients.scss\" />\n\n### Sass utilities API\n\nBackground utilities are declared in our utilities API in `scss/_utilities.scss`. [Learn how to use the utilities API.]([[docsref:/utilities/api#using-the-api]])\n\n<ScssDocs name=\"utils-bg-color\" file=\"scss/_utilities.scss\" />\n"
  },
  {
    "path": "site/src/content/docs/utilities/borders.mdx",
    "content": "---\ntitle: Borders\ndescription: Use border utilities to quickly style the border and border-radius of an element. Great for images, buttons, or any other element.\ntoc: true\n---\n\nimport { getData } from '@libs/data'\n\n## Border\n\nUse border utilities to add or remove an element’s borders. Choose from all borders or one at a time.\n\n### Additive\n\nAdd borders to custom elements:\n\n<Example class=\"bd-example-border-utils\" code={`<span class=\"border\"></span>\n<span class=\"border-top\"></span>\n<span class=\"border-end\"></span>\n<span class=\"border-bottom\"></span>\n<span class=\"border-start\"></span>`} />\n\n### Subtractive\n\nOr remove borders:\n\n<Example class=\"bd-example-border-utils\" code={`<span class=\"border border-0\"></span>\n<span class=\"border border-top-0\"></span>\n<span class=\"border border-end-0\"></span>\n<span class=\"border border-bottom-0\"></span>\n<span class=\"border border-start-0\"></span>`} />\n\n## Color\n\n<Callout>\nBorder utilities like `.border-*` that generated from our original `$theme-colors` Sass map don’t yet respond to color modes, however, any `.border-*-subtle` utility will. This will be resolved in v6.\n</Callout>\n\nChange the border color using utilities built on our theme colors.\n\n<Example class=\"bd-example-border-utils\" code={[\n  ...getData('theme-colors').map((themeColor) => `<span class=\"border border-${themeColor.name}\"></span>\n<span class=\"border border-${themeColor.name}-subtle\"></span>`),\n  `<span class=\"border border-black\"></span>\n<span class=\"border border-white\"></span>`\n]} />\n\nOr modify the default `border-color` of a component:\n\n<Example code={`<div class=\"mb-4\">\n    <label for=\"exampleFormControlInput1\" class=\"form-label\">Email address</label>\n    <input type=\"email\" class=\"form-control border-success\" id=\"exampleFormControlInput1\" placeholder=\"name@example.com\">\n  </div>\n\n  <div class=\"h4 pb-2 mb-4 text-danger border-bottom border-danger\">\n    Dangerous heading\n  </div>\n\n  <div class=\"p-3 bg-info bg-opacity-10 border border-info border-start-0 rounded-end\">\n    Changing border color and width\n  </div>`} />\n\n## Opacity\n\n<AddedIn version=\"5.2.0\" />\n\nBootstrap `border-{color}` utilities are generated with Sass using CSS variables. This allows for real-time color changes without compilation and dynamic alpha transparency changes.\n\n### How it works\n\nConsider our default `.border-success` utility.\n\n```css\n.border-success {\n  --bs-border-opacity: 1;\n  border-color: rgba(var(--bs-success-rgb), var(--bs-border-opacity)) !important;\n}\n```\n\nWe use an RGB version of our `--bs-success` (with the value of `25, 135, 84`) CSS variable and attached a second CSS variable, `--bs-border-opacity`, for the alpha transparency (with a default value `1` thanks to a local CSS variable). That means anytime you use `.border-success` now, your computed `color` value is `rgba(25, 135, 84, 1)`. The local CSS variable inside each `.border-*` class avoids inheritance issues so nested instances of the utilities don’t automatically have a modified alpha transparency.\n\n### Example\n\nTo change that opacity, override `--bs-border-opacity` via custom styles or inline styles.\n\n<Example code={`<div class=\"border border-success p-2 mb-2\">This is default success border</div>\n<div class=\"border border-success p-2\" style=\"--bs-border-opacity: .5;\">This is 50% opacity success border</div>`} />\n\nOr, choose from any of the `.border-opacity` utilities:\n\n<Example code={`<div class=\"border border-success p-2 mb-2\">This is default success border</div>\n<div class=\"border border-success p-2 mb-2 border-opacity-75\">This is 75% opacity success border</div>\n<div class=\"border border-success p-2 mb-2 border-opacity-50\">This is 50% opacity success border</div>\n<div class=\"border border-success p-2 mb-2 border-opacity-25\">This is 25% opacity success border</div>\n<div class=\"border border-success p-2 border-opacity-10\">This is 10% opacity success border</div>`} />\n\n## Width\n\n<Example class=\"bd-example-border-utils\" code={`<span class=\"border border-1\"></span>\n<span class=\"border border-2\"></span>\n<span class=\"border border-3\"></span>\n<span class=\"border border-4\"></span>\n<span class=\"border border-5\"></span>`} />\n\n## Radius\n\nAdd classes to an element to easily round its corners.\n\n<Example class=\"bd-example-rounded-utils\" code={`<Placeholder width=\"75\" height=\"75\" class=\"rounded\" title=\"Example rounded image\" />\n<Placeholder width=\"75\" height=\"75\" class=\"rounded-top\" title=\"Example top rounded image\" />\n<Placeholder width=\"75\" height=\"75\" class=\"rounded-end\" title=\"Example right rounded image\" />\n<Placeholder width=\"75\" height=\"75\" class=\"rounded-bottom\" title=\"Example bottom rounded image\" />\n<Placeholder width=\"75\" height=\"75\" class=\"rounded-start\" title=\"Example left rounded image\" />`} />\n\n### Sizes\n\nUse the scaling classes for larger or smaller rounded corners. Sizes range from `0` to `5` including `circle` and `pill`, and can be configured by modifying the utilities API.\n\n<Example class=\"bd-example-rounded-utils\" code={`<Placeholder width=\"75\" height=\"75\" class=\"rounded-0\" title=\"Example non-rounded image\" />\n<Placeholder width=\"75\" height=\"75\" class=\"rounded-1\" title=\"Example small rounded image\" />\n<Placeholder width=\"75\" height=\"75\" class=\"rounded-2\" title=\"Example default rounded image\" />\n<Placeholder width=\"75\" height=\"75\" class=\"rounded-3\" title=\"Example large rounded image\" />\n<Placeholder width=\"75\" height=\"75\" class=\"rounded-4\" title=\"Example larger rounded image\" />\n<Placeholder width=\"75\" height=\"75\" class=\"rounded-5\" title=\"Example extra large rounded image\" />\n<Placeholder width=\"75\" height=\"75\" class=\"rounded-circle\" title=\"Completely round image\" />\n<Placeholder width=\"150\" height=\"75\" class=\"rounded-pill\" title=\"Rounded pill image\" />`} />\n\n<Example class=\"bd-example-rounded-utils\" code={`<Placeholder width=\"75\" height=\"75\" class=\"rounded-bottom-1\" title=\"Example small rounded image\" />\n<Placeholder width=\"75\" height=\"75\" class=\"rounded-start-2\" title=\"Example default left rounded image\" />\n<Placeholder width=\"75\" height=\"75\" class=\"rounded-end-circle\" title=\"Example right completely round image\" />\n<Placeholder width=\"75\" height=\"75\" class=\"rounded-start-pill\" title=\"Example left rounded pill image\" />\n<Placeholder width=\"75\" height=\"75\" class=\"rounded-5 rounded-top-0\" title=\"Example extra large bottom rounded image\" />`} />\n\n## CSS\n\n### Variables\n\n<AddedIn version=\"5.2.0\" />\n\n<ScssDocs name=\"root-border-var\" file=\"scss/_root.scss\" />\n\n### Sass variables\n\n<ScssDocs name=\"border-variables\" file=\"scss/_variables.scss\" />\n\n<ScssDocs name=\"border-radius-variables\" file=\"scss/_variables.scss\" />\n\nVariables for setting `border-color` in `.border-*-subtle` utilities in light and dark mode:\n\n<ScssDocs name=\"theme-border-subtle-variables\" file=\"scss/_variables.scss\" />\n\n<ScssDocs name=\"theme-border-subtle-dark-variables\" file=\"scss/_variables-dark.scss\" />\n\n### Sass maps\n\nColor mode adaptive border colors are also available as a Sass map:\n\n<ScssDocs name=\"theme-border-subtle-map\" file=\"scss/_maps.scss\" />\n\n<ScssDocs name=\"theme-border-subtle-dark-map\" file=\"scss/_maps.scss\" />\n\n### Sass mixins\n\n<ScssDocs name=\"border-radius-mixins\" file=\"scss/mixins/_border-radius.scss\" />\n\n### Sass utilities API\n\nBorder utilities are declared in our utilities API in `scss/_utilities.scss`. [Learn how to use the utilities API.]([[docsref:/utilities/api#using-the-api]])\n\n<ScssDocs name=\"utils-borders\" file=\"scss/_utilities.scss\" />\n\n<ScssDocs name=\"utils-border-radius\" file=\"scss/_utilities.scss\" />\n"
  },
  {
    "path": "site/src/content/docs/utilities/colors.mdx",
    "content": "---\ntitle: Colors\ndescription: Convey meaning through `color` with a handful of color utility classes. Includes support for styling links with hover states, too.\ntoc: true\n---\n\nimport { getData } from '@libs/data'\n\n<Callout name=\"warning-color-assistive-technologies\" />\n\n## Colors\n\nColorize text with color utilities. If you want to colorize links, you can use the [`.link-*` helper classes]([[docsref:/helpers/colored-links]]) which have `:hover` and `:focus` states.\n\n<Callout>\nColor utilities like `.text-*` that generated from our original `$theme-colors` Sass map don’t yet respond to color modes, however, any `.text-*-emphasis` utility will. This will be resolved in v6.\n</Callout>\n\n<Example code={[\n  ...getData('theme-colors').map((themeColor) => `<p class=\"text-${themeColor.name}${themeColor.contrast_color ? ` bg-${themeColor.contrast_color}` : ``}\">.text-${themeColor.name}</p>\n<p class=\"text-${themeColor.name}-emphasis\">.text-${themeColor.name}-emphasis</p>`),\n  `\n<p class=\"text-body\">.text-body</p>\n<p class=\"text-body-emphasis\">.text-body-emphasis</p>\n<p class=\"text-body-secondary\">.text-body-secondary</p>\n<p class=\"text-body-tertiary\">.text-body-tertiary</p>\n\n<p class=\"text-black bg-white\">.text-black</p>\n<p class=\"text-white bg-dark\">.text-white</p>\n<p class=\"text-black-50 bg-white\">.text-black-50</p>\n<p class=\"text-white-50 bg-dark\">.text-white-50</p>`\n]} />\n\n<Callout type=\"warning\">\n**Deprecation:** With the addition of `.text-opacity-*` utilities and CSS variables for text utilities, `.text-black-50` and `.text-white-50` are deprecated as of v5.1.0. They’ll be removed in v6.0.0.\n</Callout>\n\n<Callout type=\"warning\">\n**Deprecation:** With the addition of the expanded theme colors and variables, the `.text-muted` utility has been deprecated as of v5.3.0. Its default value has also been reassigned to the new `--bs-secondary-color` CSS variable to better support color modes. It will be removed in v6.0.0.\n</Callout>\n\n## Opacity\n\n<AddedIn version=\"5.1.0\" />\n\nAs of v5.1.0, text color utilities are generated with Sass using CSS variables. This allows for real-time color changes without compilation and dynamic alpha transparency changes.\n\n### How it works\n\nConsider our default `.text-primary` utility.\n\n```css\n.text-primary {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-primary-rgb), var(--bs-text-opacity)) !important;\n}\n```\n\nWe use an RGB version of our `--bs-primary` (with the value of `13, 110, 253`) CSS variable and attached a second CSS variable, `--bs-text-opacity`, for the alpha transparency (with a default value `1` thanks to a local CSS variable). That means anytime you use `.text-primary` now, your computed `color` value is `rgba(13, 110, 253, 1)`. The local CSS variable inside each `.text-*` class avoids inheritance issues so nested instances of the utilities don’t automatically have a modified alpha transparency.\n\n### Example\n\nTo change that opacity, override `--bs-text-opacity` via custom styles or inline styles.\n\n<Example code={`<div class=\"text-primary\">This is default primary text</div>\n<div class=\"text-primary\" style=\"--bs-text-opacity: .5;\">This is 50% opacity primary text</div>`} />\n\nOr, choose from any of the `.text-opacity` utilities:\n\n<Example code={`<div class=\"text-primary\">This is default primary text</div>\n<div class=\"text-primary text-opacity-75\">This is 75% opacity primary text</div>\n<div class=\"text-primary text-opacity-50\">This is 50% opacity primary text</div>\n<div class=\"text-primary text-opacity-25\">This is 25% opacity primary text</div>`} />\n\n## Specificity\n\nSometimes contextual classes cannot be applied due to the specificity of another selector. In some cases, a sufficient workaround is to wrap your element’s content in a `<div>` or more semantic element with the desired class.\n\n## CSS\n\nIn addition to the following Sass functionality, consider reading about our included [CSS custom properties]([[docsref:/customize/css-variables]]) (aka CSS variables) for colors and more.\n\n### Sass variables\n\nMost `color` utilities are generated by our theme colors, reassigned from our generic color palette variables.\n\n<ScssDocs name=\"color-variables\" file=\"scss/_variables.scss\" />\n\n<ScssDocs name=\"theme-color-variables\" file=\"scss/_variables.scss\" />\n\nGrayscale colors are also available, but only a subset are used to generate any utilities.\n\n<ScssDocs name=\"gray-color-variables\" file=\"scss/_variables.scss\" />\n\n<ScssDocs name=\"theme-text-map\" file=\"scss/_maps.scss\" />\n\nVariables for setting colors in `.text-*-emphasis` utilities in light and dark mode:\n\n<ScssDocs name=\"theme-text-variables\" file=\"scss/_variables.scss\" />\n\n<ScssDocs name=\"theme-text-dark-variables\" file=\"scss/_variables-dark.scss\" />\n\n### Sass maps\n\nTheme colors are then put into a Sass map so we can loop over them to generate our utilities, component modifiers, and more.\n\n<ScssDocs name=\"theme-colors-map\" file=\"scss/_variables.scss\" />\n\nGrayscale colors are also available as a Sass map. **This map is not used to generate any utilities.**\n\n<ScssDocs name=\"gray-colors-map\" file=\"scss/_variables.scss\" />\n\nRGB colors are generated from a separate Sass map:\n\n<ScssDocs name=\"theme-colors-rgb\" file=\"scss/_maps.scss\" />\n\nColor opacities build on that with their own map that’s consumed by the utilities API:\n\n<ScssDocs name=\"utilities-text-colors\" file=\"scss/_maps.scss\" />\n\nColor mode adaptive text colors are also available as a Sass map:\n\n<ScssDocs name=\"theme-text-map\" file=\"scss/_maps.scss\" />\n\n<ScssDocs name=\"theme-text-dark-map\" file=\"scss/_maps.scss\" />\n\n### Sass utilities API\n\nColor utilities are declared in our utilities API in `scss/_utilities.scss`. [Learn how to use the utilities API.]([[docsref:/utilities/api#using-the-api]])\n\n<ScssDocs name=\"utils-color\" file=\"scss/_utilities.scss\" />\n"
  },
  {
    "path": "site/src/content/docs/utilities/display.mdx",
    "content": "---\ntitle: Display property\ndescription: Quickly and responsively toggle the display value of components and more with our display utilities. Includes support for some of the more common values, as well as some extras for controlling display when printing.\ntoc: true\n---\n\n## How it works\n\nChange the value of the [`display` property](https://developer.mozilla.org/en-US/docs/Web/CSS/display) with our responsive display utility classes. We purposely support only a subset of all possible values for `display`. Classes can be combined for various effects as you need.\n\n## Notation\n\nDisplay utility classes that apply to all [breakpoints]([[docsref:/layout/breakpoints]]), from `xs` to `xxl`, have no breakpoint abbreviation in them. This is because those classes are applied from `min-width: 0;` and up, and thus are not bound by a media query. The remaining breakpoints, however, do include a breakpoint abbreviation.\n\nAs such, the classes are named using the format:\n\n- `.d-{value}` for `xs`\n- `.d-{breakpoint}-{value}` for `sm`, `md`, `lg`, `xl`, and `xxl`.\n\nWhere *value* is one of:\n\n- `none`\n- `inline`\n- `inline-block`\n- `block`\n- `grid`\n- `inline-grid`\n- `table`\n- `table-cell`\n- `table-row`\n- `flex`\n- `inline-flex`\n\nThe display values can be altered by changing the `display` values defined in `$utilities` and recompiling the SCSS.\n\nThe media queries affect screen widths with the given breakpoint *or larger*. For example, `.d-lg-none` sets `display: none;` on `lg`, `xl`, and `xxl` screens.\n\n## Examples\n\n<Example code={`<div class=\"d-inline p-2 text-bg-primary\">d-inline</div>\n<div class=\"d-inline p-2 text-bg-dark\">d-inline</div>`} />\n\n<Example code={`<span class=\"d-block p-2 text-bg-primary\">d-block</span>\n<span class=\"d-block p-2 text-bg-dark\">d-block</span>`} />\n\n## Hiding elements\n\nFor faster mobile-friendly development, use responsive display classes for showing and hiding elements by device. Avoid creating entirely different versions of the same site, instead hide elements responsively for each screen size.\n\nTo hide elements simply use the `.d-none` class or one of the `.d-{sm,md,lg,xl,xxl}-none` classes for any responsive screen variation.\n\nTo show an element only on a given interval of screen sizes you can combine one `.d-*-none` class with a `.d-*-*` class, for example `.d-none .d-md-block .d-xl-none` will hide the element for all screen sizes except on medium and large devices.\n\n<BsTable>\n| Screen size | Class |\n| --- | --- |\n| Hidden on all | `.d-none` |\n| Hidden only on xs | `.d-none .d-sm-block` |\n| Hidden only on sm | `.d-sm-none .d-md-block` |\n| Hidden only on md | `.d-md-none .d-lg-block` |\n| Hidden only on lg | `.d-lg-none .d-xl-block` |\n| Hidden only on xl | `.d-xl-none .d-xxl-block` |\n| Hidden only on xxl | `.d-xxl-none` |\n| Visible on all | `.d-block` |\n| Visible only on xs | `.d-block .d-sm-none` |\n| Visible only on sm | `.d-none .d-sm-block .d-md-none` |\n| Visible only on md | `.d-none .d-md-block .d-lg-none` |\n| Visible only on lg | `.d-none .d-lg-block .d-xl-none` |\n| Visible only on xl | `.d-none .d-xl-block .d-xxl-none` |\n| Visible only on xxl | `.d-none .d-xxl-block` |\n</BsTable>\n\n<Example code={`<div class=\"d-lg-none\">hide on lg and wider screens</div>\n<div class=\"d-none d-lg-block\">hide on screens smaller than lg</div>`} />\n\n## Display in print\n\nChange the `display` value of elements when printing with our print display utility classes. Includes support for the same `display` values as our responsive `.d-*` utilities.\n\n- `.d-print-none`\n- `.d-print-inline`\n- `.d-print-inline-block`\n- `.d-print-block`\n- `.d-print-grid`\n- `.d-print-inline-grid`\n- `.d-print-table`\n- `.d-print-table-row`\n- `.d-print-table-cell`\n- `.d-print-flex`\n- `.d-print-inline-flex`\n\nThe print and display classes can be combined.\n\n<Example code={`<div class=\"d-print-none\">Screen Only (Hide on print only)</div>\n<div class=\"d-none d-print-block\">Print Only (Hide on screen only)</div>\n<div class=\"d-none d-lg-block d-print-block\">Hide up to large on screen, but always show on print</div>`} />\n\n## CSS\n\n### Sass utilities API\n\nDisplay utilities are declared in our utilities API in `scss/_utilities.scss`. [Learn how to use the utilities API.]([[docsref:/utilities/api#using-the-api]])\n\n<ScssDocs name=\"utils-display\" file=\"scss/_utilities.scss\" />\n"
  },
  {
    "path": "site/src/content/docs/utilities/flex.mdx",
    "content": "---\ntitle: Flex\ndescription: Quickly manage the layout, alignment, and sizing of grid columns, navigation, components, and more with a full suite of responsive flexbox utilities. For more complex implementations, custom CSS may be necessary.\ntoc: true\n---\n\nimport { getData } from '@libs/data'\nimport { getSequence } from '@libs/utils'\n\n## Enable flex behaviors\n\nApply `display` utilities to create a flexbox container and transform **direct children elements** into flex items. Flex containers and items are able to be modified further with additional flex properties.\n\n<Example class=\"bd-example-flex\" code={`<div class=\"d-flex p-2\">I'm a flexbox container!</div>`} />\n\n<Example class=\"bd-example-flex\" code={`<div class=\"d-inline-flex p-2\">I'm an inline flexbox container!</div>`} />\n\nResponsive variations also exist for `.d-flex` and `.d-inline-flex`.\n\n<ul>\n{getData('breakpoints').map((breakpoint) => {\n  return (\n    <Fragment>\n      <li><code>.d{breakpoint.abbr}-flex</code></li>\n      <li><code>.d{breakpoint.abbr}-inline-flex</code></li>\n    </Fragment>\n  )\n})}\n</ul>\n\n## Direction\n\nSet the direction of flex items in a flex container with direction utilities. In most cases you can omit the horizontal class here as the browser default is `row`. However, you may encounter situations where you needed to explicitly set this value (like responsive layouts).\n\nUse `.flex-row` to set a horizontal direction (the browser default), or `.flex-row-reverse` to start the horizontal direction from the opposite side.\n\n<Example class=\"bd-example-flex\" code={`<div class=\"d-flex flex-row mb-3\">\n    <div class=\"p-2\">Flex item 1</div>\n    <div class=\"p-2\">Flex item 2</div>\n    <div class=\"p-2\">Flex item 3</div>\n  </div>\n  <div class=\"d-flex flex-row-reverse\">\n    <div class=\"p-2\">Flex item 1</div>\n    <div class=\"p-2\">Flex item 2</div>\n    <div class=\"p-2\">Flex item 3</div>\n  </div>`} />\n\nUse `.flex-column` to set a vertical direction, or `.flex-column-reverse`  to start the vertical direction from the opposite side.\n\n<Example class=\"bd-example-flex\" code={`<div class=\"d-flex flex-column mb-3\">\n    <div class=\"p-2\">Flex item 1</div>\n    <div class=\"p-2\">Flex item 2</div>\n    <div class=\"p-2\">Flex item 3</div>\n  </div>\n  <div class=\"d-flex flex-column-reverse\">\n    <div class=\"p-2\">Flex item 1</div>\n    <div class=\"p-2\">Flex item 2</div>\n    <div class=\"p-2\">Flex item 3</div>\n  </div>`} />\n\nResponsive variations also exist for `flex-direction`.\n\n<ul>\n{getData('breakpoints').map((breakpoint) => {\n  return (\n    <Fragment>\n      <li><code>.flex{breakpoint.abbr}-row</code></li>\n      <li><code>.flex{breakpoint.abbr}-row-reverse</code></li>\n      <li><code>.flex{breakpoint.abbr}-column</code></li>\n      <li><code>.flex{breakpoint.abbr}-column-reverse</code></li>\n    </Fragment>\n  )\n})}\n</ul>\n\n## Justify content\n\nUse `justify-content` utilities on flexbox containers to change the alignment of flex items on the main axis (the x-axis to start, y-axis if `flex-direction: column`). Choose from `start` (browser default), `end`, `center`, `between`, `around`, or `evenly`.\n\n<div class=\"bd-example bd-example-flex\">\n  <div class=\"d-flex justify-content-start mb-3\">\n    <div class=\"p-2 bd-highlight\">Justify</div>\n    <div class=\"p-2 bd-highlight\">Content</div>\n    <div class=\"p-2 bd-highlight\">Start</div>\n  </div>\n  <div class=\"d-flex justify-content-end mb-3\">\n    <div class=\"p-2 bd-highlight\">Justify</div>\n    <div class=\"p-2 bd-highlight\">Content</div>\n    <div class=\"p-2 bd-highlight\">End</div>\n  </div>\n  <div class=\"d-flex justify-content-center mb-3\">\n    <div class=\"p-2 bd-highlight\">Justify</div>\n    <div class=\"p-2 bd-highlight\">Content</div>\n    <div class=\"p-2 bd-highlight\">Center</div>\n  </div>\n  <div class=\"d-flex justify-content-between mb-3\">\n    <div class=\"p-2 bd-highlight\">Justify</div>\n    <div class=\"p-2 bd-highlight\">Content</div>\n    <div class=\"p-2 bd-highlight\">Between</div>\n  </div>\n  <div class=\"d-flex justify-content-around mb-3\">\n    <div class=\"p-2 bd-highlight\">Justify</div>\n    <div class=\"p-2 bd-highlight\">Content</div>\n    <div class=\"p-2 bd-highlight\">Around</div>\n  </div>\n  <div class=\"d-flex justify-content-evenly\">\n    <div class=\"p-2 bd-highlight\">Justify</div>\n    <div class=\"p-2 bd-highlight\">Content</div>\n    <div class=\"p-2 bd-highlight\">Evenly</div>\n  </div>\n</div>\n\n```html\n<div class=\"d-flex justify-content-start\">...</div>\n<div class=\"d-flex justify-content-end\">...</div>\n<div class=\"d-flex justify-content-center\">...</div>\n<div class=\"d-flex justify-content-between\">...</div>\n<div class=\"d-flex justify-content-around\">...</div>\n<div class=\"d-flex justify-content-evenly\">...</div>\n```\n\nResponsive variations also exist for `justify-content`.\n\n<ul>\n{getData('breakpoints').map((breakpoint) => {\n  return (\n    <Fragment>\n      <li><code>.justify-content{breakpoint.abbr}-start</code></li>\n      <li><code>.justify-content{breakpoint.abbr}-end</code></li>\n      <li><code>.justify-content{breakpoint.abbr}-center</code></li>\n      <li><code>.justify-content{breakpoint.abbr}-between</code></li>\n      <li><code>.justify-content{breakpoint.abbr}-around</code></li>\n      <li><code>.justify-content{breakpoint.abbr}-evenly</code></li>\n    </Fragment>\n  )\n})}\n</ul>\n\n## Align items\n\nUse `align-items` utilities on flexbox containers to change the alignment of flex items on the cross axis (the y-axis to start, x-axis if `flex-direction: column`). Choose from `start`, `end`, `center`, `baseline`, or `stretch` (browser default).\n\n<div class=\"bd-example bd-example-flex\">\n  <div class=\"d-flex align-items-start mb-3\" style=\"height: 100px\">\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n  </div>\n  <div class=\"d-flex align-items-end mb-3\" style=\"height: 100px\">\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n  </div>\n  <div class=\"d-flex align-items-center mb-3\" style=\"height: 100px\">\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n  </div>\n  <div class=\"d-flex align-items-baseline mb-3\" style=\"height: 100px\">\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n  </div>\n  <div class=\"d-flex align-items-stretch\" style=\"height: 100px\">\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n  </div>\n</div>\n\n```html\n<div class=\"d-flex align-items-start\">...</div>\n<div class=\"d-flex align-items-end\">...</div>\n<div class=\"d-flex align-items-center\">...</div>\n<div class=\"d-flex align-items-baseline\">...</div>\n<div class=\"d-flex align-items-stretch\">...</div>\n```\n\nResponsive variations also exist for `align-items`.\n\n<ul>\n{getData('breakpoints').map((breakpoint) => {\n  return (\n    <Fragment>\n      <li><code>.align-items{breakpoint.abbr}-start</code></li>\n      <li><code>.align-items{breakpoint.abbr}-end</code></li>\n      <li><code>.align-items{breakpoint.abbr}-center</code></li>\n      <li><code>.align-items{breakpoint.abbr}-baseline</code></li>\n      <li><code>.align-items{breakpoint.abbr}-stretch</code></li>\n    </Fragment>\n  )\n})}\n</ul>\n\n## Align self\n\nUse `align-self` utilities on flexbox items to individually change their alignment on the cross axis (the y-axis to start, x-axis if `flex-direction: column`). Choose from the same options as `align-items`: `start`, `end`, `center`, `baseline`, or `stretch` (browser default).\n\n<div class=\"bd-example bd-example-flex\">\n  <div class=\"d-flex mb-3\" style=\"height: 100px\">\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"align-self-start p-2\">Aligned flex item</div>\n    <div class=\"p-2\">Flex item</div>\n  </div>\n  <div class=\"d-flex mb-3\" style=\"height: 100px\">\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"align-self-end p-2\">Aligned flex item</div>\n    <div class=\"p-2\">Flex item</div>\n  </div>\n  <div class=\"d-flex mb-3\" style=\"height: 100px\">\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"align-self-center p-2\">Aligned flex item</div>\n    <div class=\"p-2\">Flex item</div>\n  </div>\n  <div class=\"d-flex mb-3\" style=\"height: 100px\">\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"align-self-baseline p-2\">Aligned flex item</div>\n    <div class=\"p-2\">Flex item</div>\n  </div>\n  <div class=\"d-flex\" style=\"height: 100px\">\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"align-self-stretch p-2\">Aligned flex item</div>\n    <div class=\"p-2\">Flex item</div>\n  </div>\n</div>\n\n```html\n<div class=\"align-self-start\">Aligned flex item</div>\n<div class=\"align-self-end\">Aligned flex item</div>\n<div class=\"align-self-center\">Aligned flex item</div>\n<div class=\"align-self-baseline\">Aligned flex item</div>\n<div class=\"align-self-stretch\">Aligned flex item</div>\n```\n\nResponsive variations also exist for `align-self`.\n\n<ul>\n{getData('breakpoints').map((breakpoint) => {\n  return (\n    <Fragment>\n      <li><code>.align-self{breakpoint.abbr}-start</code></li>\n      <li><code>.align-self{breakpoint.abbr}-end</code></li>\n      <li><code>.align-self{breakpoint.abbr}-center</code></li>\n      <li><code>.align-self{breakpoint.abbr}-baseline</code></li>\n      <li><code>.align-self{breakpoint.abbr}-stretch</code></li>\n    </Fragment>\n  )\n})}\n</ul>\n\n## Fill\n\nUse the `.flex-fill` class on a series of sibling elements to force them into widths equal to their content (or equal widths if their content does not surpass their border-boxes) while taking up all available horizontal space.\n\n<Example class=\"bd-example-flex\" code={`<div class=\"d-flex\">\n    <div class=\"p-2 flex-fill\">Flex item with a lot of content</div>\n    <div class=\"p-2 flex-fill\">Flex item</div>\n    <div class=\"p-2 flex-fill\">Flex item</div>\n  </div>`} />\n\nResponsive variations also exist for `flex-fill`.\n\n<ul>\n{getData('breakpoints').map((breakpoint) => {\n  return (\n    <li><code>.flex{breakpoint.abbr}-fill</code></li>\n  )\n})}\n</ul>\n\n## Grow and shrink\n\nUse `.flex-grow-*` utilities to toggle a flex item’s ability to grow to fill available space. In the example below, the `.flex-grow-1` elements uses all available space it can, while allowing the remaining two flex items their necessary space.\n\n<Example class=\"bd-example-flex\" code={`<div class=\"d-flex\">\n    <div class=\"p-2 flex-grow-1\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Third flex item</div>\n  </div>`} />\n\nUse `.flex-shrink-*` utilities to toggle a flex item’s ability to shrink if necessary. In the example below, the second flex item with `.flex-shrink-1` is forced to wrap its contents to a new line, “shrinking” to allow more space for the previous flex item with `.w-100`.\n\n<Example class=\"bd-example-flex\" code={`<div class=\"d-flex\">\n    <div class=\"p-2 w-100\">Flex item</div>\n    <div class=\"p-2 flex-shrink-1\">Flex item</div>\n  </div>`} />\n\nResponsive variations also exist for `flex-grow` and `flex-shrink`.\n\n<ul>\n{getData('breakpoints').map((breakpoint) => {\n  return (\n    <Fragment>\n      <li><code>.flex{breakpoint.abbr}-{'{'}grow|shrink{'}'}-0</code></li>\n      <li><code>.flex{breakpoint.abbr}-{'{'}grow|shrink{'}'}-1</code></li>\n    </Fragment>\n  )\n})}\n</ul>\n\n## Auto margins\n\nFlexbox can do some pretty awesome things when you mix flex alignments with auto margins. Shown below are three examples of controlling flex items via auto margins: default (no auto margin), pushing two items to the right (`.me-auto`), and pushing two items to the left (`.ms-auto`).\n\n<Example class=\"bd-example-flex\" code={`<div class=\"d-flex mb-3\">\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n  </div>\n\n  <div class=\"d-flex mb-3\">\n    <div class=\"me-auto p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n  </div>\n\n  <div class=\"d-flex mb-3\">\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"ms-auto p-2\">Flex item</div>\n  </div>`} />\n\n### With align-items\n\nVertically move one flex item to the top or bottom of a container by mixing `align-items`, `flex-direction: column`, and `margin-top: auto` or `margin-bottom: auto`.\n\n<Example class=\"bd-example-flex\" code={`<div class=\"d-flex align-items-start flex-column mb-3\" style=\"height: 200px;\">\n    <div class=\"mb-auto p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n  </div>\n\n  <div class=\"d-flex align-items-end flex-column mb-3\" style=\"height: 200px;\">\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"mt-auto p-2\">Flex item</div>\n  </div>`} />\n\n## Wrap\n\nChange how flex items wrap in a flex container. Choose from no wrapping at all (the browser default) with `.flex-nowrap`, wrapping with `.flex-wrap`, or reverse wrapping with `.flex-wrap-reverse`.\n\n<div class=\"bd-example bd-example-flex\">\n  <div class=\"d-flex flex-nowrap\" style=\"width: 8rem;\">\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n  </div>\n</div>\n\n```html\n<div class=\"d-flex flex-nowrap\">\n  ...\n</div>\n```\n\n<div class=\"bd-example bd-example-flex\">\n  <div class=\"d-flex flex-wrap\">\n    <div class=\"p-2\">Flex item 1</div>\n    <div class=\"p-2\">Flex item 2</div>\n    <div class=\"p-2\">Flex item 3</div>\n    <div class=\"p-2\">Flex item 4</div>\n    <div class=\"p-2\">Flex item 5</div>\n    <div class=\"p-2\">Flex item 6</div>\n    <div class=\"p-2\">Flex item 7</div>\n    <div class=\"p-2\">Flex item 8</div>\n    <div class=\"p-2\">Flex item 9</div>\n    <div class=\"p-2\">Flex item 10</div>\n    <div class=\"p-2\">Flex item 11</div>\n    <div class=\"p-2\">Flex item 12</div>\n    <div class=\"p-2\">Flex item 13</div>\n    <div class=\"p-2\">Flex item 14</div>\n  </div>\n</div>\n\n```html\n<div class=\"d-flex flex-wrap\">\n  ...\n</div>\n```\n\n<div class=\"bd-example bd-example-flex\">\n  <div class=\"d-flex flex-wrap-reverse\">\n    <div class=\"p-2\">Flex item 1</div>\n    <div class=\"p-2\">Flex item 2</div>\n    <div class=\"p-2\">Flex item 3</div>\n    <div class=\"p-2\">Flex item 4</div>\n    <div class=\"p-2\">Flex item 5</div>\n    <div class=\"p-2\">Flex item 6</div>\n    <div class=\"p-2\">Flex item 7</div>\n    <div class=\"p-2\">Flex item 8</div>\n    <div class=\"p-2\">Flex item 9</div>\n    <div class=\"p-2\">Flex item 10</div>\n    <div class=\"p-2\">Flex item 11</div>\n    <div class=\"p-2\">Flex item 12</div>\n    <div class=\"p-2\">Flex item 13</div>\n    <div class=\"p-2\">Flex item 14</div>\n  </div>\n</div>\n\n```html\n<div class=\"d-flex flex-wrap-reverse\">\n  ...\n</div>\n```\n\n\nResponsive variations also exist for `flex-wrap`.\n\n<ul>\n{getData('breakpoints').map((breakpoint) => {\n  return (\n    <Fragment>\n      <li><code>.flex{breakpoint.abbr}-nowrap</code></li>\n      <li><code>.flex{breakpoint.abbr}-wrap</code></li>\n      <li><code>.flex{breakpoint.abbr}-wrap-reverse</code></li>\n    </Fragment>\n  )\n})}\n</ul>\n\n## Order\n\nChange the _visual_ order of specific flex items with a handful of `order` utilities. We only provide options for making an item first or last, as well as a reset to use the DOM order. As `order` takes any integer value from 0 to 5, add custom CSS for any additional values needed.\n\n<Example class=\"bd-example-flex\" code={`<div class=\"d-flex flex-nowrap\">\n    <div class=\"order-3 p-2\">First flex item</div>\n    <div class=\"order-2 p-2\">Second flex item</div>\n    <div class=\"order-1 p-2\">Third flex item</div>\n  </div>`} />\n\nResponsive variations also exist for `order`.\n\n<ul>\n{getData('breakpoints').map((breakpoint) => getSequence(0, 5).map((value) => {\n  return (\n    <li><code>.order{breakpoint.abbr}-{value}</code></li>\n  )\n}))}\n</ul>\n\nAdditionally there are also responsive `.order-first` and `.order-last` classes that change the `order` of an element by applying `order: -1` and `order: 6`, respectively.\n\n<ul>\n{getData('breakpoints').map((breakpoint) => ['first', 'last'].map((value) => {\n  return (\n    <li><code>.order{breakpoint.abbr}-{value}</code></li>\n  )\n}))}\n</ul>\n\n## Align content\n\nUse `align-content` utilities on flexbox containers to align flex items _together_ on the cross axis. Choose from `start` (browser default), `end`, `center`, `between`, `around`, or `stretch`. To demonstrate these utilities, we’ve enforced `flex-wrap: wrap` and increased the number of flex items.\n\n**Heads up!** This property has no effect on single rows of flex items.\n\n<div class=\"bd-example bd-example-flex\">\n  <div class=\"d-flex align-content-start flex-wrap mb-3\" style=\"height: 200px\">\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n  </div>\n</div>\n\n```html\n<div class=\"d-flex align-content-start flex-wrap\">\n  ...\n</div>\n```\n\n<div class=\"bd-example bd-example-flex\">\n  <div class=\"d-flex align-content-end flex-wrap mb-3\" style=\"height: 200px\">\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n  </div>\n</div>\n\n```html\n<div class=\"d-flex align-content-end flex-wrap\">...</div>\n```\n\n<div class=\"bd-example bd-example-flex\">\n  <div class=\"d-flex align-content-center flex-wrap mb-3\" style=\"height: 200px\">\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n  </div>\n</div>\n\n```html\n<div class=\"d-flex align-content-center flex-wrap\">...</div>\n```\n\n<div class=\"bd-example bd-example-flex\">\n  <div class=\"d-flex align-content-between flex-wrap mb-3\" style=\"height: 200px\">\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n  </div>\n</div>\n\n```html\n<div class=\"d-flex align-content-between flex-wrap\">...</div>\n```\n\n<div class=\"bd-example bd-example-flex\">\n  <div class=\"d-flex align-content-around flex-wrap mb-3\" style=\"height: 200px\">\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n  </div>\n</div>\n\n```html\n<div class=\"d-flex align-content-around flex-wrap\">...</div>\n```\n\n<div class=\"bd-example bd-example-flex\">\n  <div class=\"d-flex align-content-stretch flex-wrap mb-3\" style=\"height: 200px\">\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n    <div class=\"p-2\">Flex item</div>\n  </div>\n</div>\n\n```html\n<div class=\"d-flex align-content-stretch flex-wrap\">...</div>\n```\n\nResponsive variations also exist for `align-content`.\n\n<ul>\n{getData('breakpoints').map((breakpoint) => {\n  return (\n    <Fragment>\n      <li><code>.align-content{breakpoint.abbr}-start</code></li>\n      <li><code>.align-content{breakpoint.abbr}-end</code></li>\n      <li><code>.align-content{breakpoint.abbr}-center</code></li>\n      <li><code>.align-content{breakpoint.abbr}-between</code></li>\n      <li><code>.align-content{breakpoint.abbr}-around</code></li>\n      <li><code>.align-content{breakpoint.abbr}-stretch</code></li>\n    </Fragment>\n  )\n})}\n</ul>\n\n## Media object\n\nLooking to replicate the [media object component](https://getbootstrap.com/docs/4.6/components/media-object/) from Bootstrap 4? Recreate it in no time with a few flex utilities that allow even more flexibility and customization than before.\n\n<Example code={`<div class=\"d-flex\">\n    <div class=\"flex-shrink-0\">\n      <Placeholder width=\"100\" height=\"100\" color=\"#999\" background=\"#e5e5e5\" text=\"Image\" />\n    </div>\n    <div class=\"flex-grow-1 ms-3\">\n      This is some content from a media component. You can replace this with any content and adjust it as needed.\n    </div>\n  </div>`} />\n\nAnd say you want to vertically center the content next to the image:\n\n<Example code={`<div class=\"d-flex align-items-center\">\n    <div class=\"flex-shrink-0\">\n      <Placeholder width=\"100\" height=\"100\" color=\"#999\" background=\"#e5e5e5\" text=\"Image\" />\n    </div>\n    <div class=\"flex-grow-1 ms-3\">\n      This is some content from a media component. You can replace this with any content and adjust it as needed.\n    </div>\n  </div>`} />\n\n## CSS\n\n### Sass utilities API\n\nFlexbox utilities are declared in our utilities API in `scss/_utilities.scss`. [Learn how to use the utilities API.]([[docsref:/utilities/api#using-the-api]])\n\n<ScssDocs name=\"utils-flex\" file=\"scss/_utilities.scss\" />\n"
  },
  {
    "path": "site/src/content/docs/utilities/float.mdx",
    "content": "---\ntitle: Float\ndescription: Toggle floats on any element, across any breakpoint, using our responsive float utilities.\ntoc: true\n---\n\nimport { getData } from '@libs/data'\n\n## Overview\n\nThese utility classes float an element to the left or right, or disable floating, based on the current viewport size using the [CSS `float` property](https://developer.mozilla.org/en-US/docs/Web/CSS/float). `!important` is included to avoid specificity issues. These use the same viewport breakpoints as our grid system. Please be aware float utilities have no effect on flex items.\n\n<Example code={`<div class=\"float-start\">Float start on all viewport sizes</div><br>\n<div class=\"float-end\">Float end on all viewport sizes</div><br>\n<div class=\"float-none\">Don’t float on all viewport sizes</div>`} />\n\nUse the [clearfix helper]([[docsref:/helpers/clearfix]]) on a parent element to clear floats.\n\n## Responsive\n\nResponsive variations also exist for each `float` value.\n\n<Example code={`<div class=\"float-sm-end\">Float end on viewports sized SM (small) or wider</div><br>\n<div class=\"float-md-end\">Float end on viewports sized MD (medium) or wider</div><br>\n<div class=\"float-lg-end\">Float end on viewports sized LG (large) or wider</div><br>\n<div class=\"float-xl-end\">Float end on viewports sized XL (extra large) or wider</div><br>\n<div class=\"float-xxl-end\">Float end on viewports sized XXL (extra extra large) or wider</div><br>`} />\n\nHere are all the support classes:\n\n<ul>\n{getData('breakpoints').map((breakpoint) => {\n  return (\n    <Fragment>\n      <li><code>.float{breakpoint.abbr}-start</code></li>\n      <li><code>.float{breakpoint.abbr}-end</code></li>\n      <li><code>.float{breakpoint.abbr}-none</code></li>\n    </Fragment>\n  )\n})}\n</ul>\n\n## CSS\n\n### Sass utilities API\n\nFloat utilities are declared in our utilities API in `scss/_utilities.scss`. [Learn how to use the utilities API.]([[docsref:/utilities/api#using-the-api]])\n\n<ScssDocs name=\"utils-float\" file=\"scss/_utilities.scss\" />\n"
  },
  {
    "path": "site/src/content/docs/utilities/interactions.mdx",
    "content": "---\ntitle: Interactions\ndescription: Utility classes that change how users interact with contents of a website.\ntoc: false\n---\n\n## Text selection\n\nChange the way in which the content is selected when the user interacts with it.\n\n<Example code={`<p class=\"user-select-all\">This paragraph will be entirely selected when clicked by the user.</p>\n<p class=\"user-select-auto\">This paragraph has default select behavior.</p>\n<p class=\"user-select-none\">This paragraph will not be selectable when clicked by the user.</p>`} />\n\n## Pointer events\n\nBootstrap provides `.pe-none` and `.pe-auto` classes to prevent or add element interactions.\n\n<Example code={`<p><a href=\"#\" class=\"pe-none\" tabindex=\"-1\" aria-disabled=\"true\">This link</a> can not be clicked.</p>\n<p><a href=\"#\" class=\"pe-auto\">This link</a> can be clicked (this is default behavior).</p>\n<p class=\"pe-none\"><a href=\"#\" tabindex=\"-1\" aria-disabled=\"true\">This link</a> can not be clicked because the <code>pointer-events</code> property is inherited from its parent. However, <a href=\"#\" class=\"pe-auto\">this link</a> has a <code>pe-auto</code> class and can be clicked.</p>`} />\n\nThe `.pe-none` class (and the `pointer-events` CSS property it sets) only prevents interactions with a pointer (mouse, stylus, touch). Links and controls with `.pe-none` are, by default, still focusable and actionable for keyboard users. To ensure that they are completely neutralized even for keyboard users, you may need to add further attributes such as `tabindex=\"-1\"` (to prevent them from receiving keyboard focus) and `aria-disabled=\"true\"` (to convey the fact they are effectively disabled to assistive technologies), and possibly use JavaScript to completely prevent them from being actionable.\n\nIf possible, the simpler solution is:\n\n- For form controls, add the `disabled` HTML attribute.\n- For links, remove the `href` attribute, making it a non-interactive anchor or placeholder link.\n\n## CSS\n\n### Sass utilities API\n\nInteraction utilities are declared in our utilities API in `scss/_utilities.scss`. [Learn how to use the utilities API.]([[docsref:/utilities/api#using-the-api]])\n\n<ScssDocs name=\"utils-interaction\" file=\"scss/_utilities.scss\" />\n"
  },
  {
    "path": "site/src/content/docs/utilities/link.mdx",
    "content": "---\ntitle: Link\ndescription: Link utilities are used to stylize your anchors to adjust their color, opacity, underline offset, underline color, and more.\ntoc: true\nadded:\n  version: \"5.3\"\n---\n\nimport { getData } from '@libs/data'\n\n## Link opacity\n\nChange the alpha opacity of the link `rgba()` color value with utilities. Please be aware that changes to a color’s opacity can lead to links with [*insufficient* contrast]([[docsref:getting-started/accessibility/#color-contrast]]).\n\n<Example code={`<p><a class=\"link-opacity-10\" href=\"#\">Link opacity 10</a></p>\n<p><a class=\"link-opacity-25\" href=\"#\">Link opacity 25</a></p>\n<p><a class=\"link-opacity-50\" href=\"#\">Link opacity 50</a></p>\n<p><a class=\"link-opacity-75\" href=\"#\">Link opacity 75</a></p>\n<p><a class=\"link-opacity-100\" href=\"#\">Link opacity 100</a></p>`} />\n\nYou can even change the opacity level on hover.\n\n<Example code={`<p><a class=\"link-opacity-10-hover\" href=\"#\">Link hover opacity 10</a></p>\n<p><a class=\"link-opacity-25-hover\" href=\"#\">Link hover opacity 25</a></p>\n<p><a class=\"link-opacity-50-hover\" href=\"#\">Link hover opacity 50</a></p>\n<p><a class=\"link-opacity-75-hover\" href=\"#\">Link hover opacity 75</a></p>\n<p><a class=\"link-opacity-100-hover\" href=\"#\">Link hover opacity 100</a></p>`} />\n\n## Link underlines\n\n### Underline color\n\nChange the underline’s color independent of the link text color.\n\n<Example code={getData('theme-colors').map((themeColor) => `<p><a href=\"#\" class=\"link-underline-${themeColor.name}\">${themeColor.title} underline</a></p>`)} />\n\n### Underline offset\n\nChange the underline’s distance from your text. Offset is set in `em` units to automatically scale with the element’s current `font-size`.\n\n<Example code={`<p><a href=\"#\">Default link</a></p>\n<p><a class=\"link-offset-1\" href=\"#\">Offset 1 link</a></p>\n<p><a class=\"link-offset-2\" href=\"#\">Offset 2 link</a></p>\n<p><a class=\"link-offset-3\" href=\"#\">Offset 3 link</a></p>`} />\n\n### Underline opacity\n\nChange the underline’s opacity. Requires adding `.link-underline` to first set an `rgba()` color we use to then modify the alpha opacity.\n\n<Example code={`<p><a class=\"link-offset-2 link-underline link-underline-opacity-0\" href=\"#\">Underline opacity 0</a></p>\n<p><a class=\"link-offset-2 link-underline link-underline-opacity-10\" href=\"#\">Underline opacity 10</a></p>\n<p><a class=\"link-offset-2 link-underline link-underline-opacity-25\" href=\"#\">Underline opacity 25</a></p>\n<p><a class=\"link-offset-2 link-underline link-underline-opacity-50\" href=\"#\">Underline opacity 50</a></p>\n<p><a class=\"link-offset-2 link-underline link-underline-opacity-75\" href=\"#\">Underline opacity 75</a></p>\n<p><a class=\"link-offset-2 link-underline link-underline-opacity-100\" href=\"#\">Underline opacity 100</a></p>`} />\n\n### Hover variants\n\nJust like the `.link-opacity-*-hover` utilities, `.link-offset` and `.link-underline-opacity` utilities include `:hover` variants by default. Mix and match to create unique link styles.\n\n<Example code={`<a class=\"link-offset-2 link-offset-3-hover link-underline link-underline-opacity-0 link-underline-opacity-75-hover\" href=\"#\">\n    Underline opacity 0\n  </a>`} />\n\n## Colored links\n\n[Colored link helpers]([[docsref:/helpers/colored-links/]]) have been updated to pair with our link utilities. Use the new utilities to modify the link opacity, underline opacity, and underline offset.\n\n<Example code={[\n  ...getData('theme-colors').map((themeColor) => `<p><a href=\"#\" class=\"link-${themeColor.name} link-offset-2 link-underline-opacity-25 link-underline-opacity-100-hover\">${themeColor.title} link</a></p>`),\n  `<p><a href=\"#\" class=\"link-body-emphasis link-offset-2 link-underline-opacity-25 link-underline-opacity-75-hover\">Emphasis link</a></p>`\n]} />\n\n<Callout name=\"warning-color-assistive-technologies\" />\n\n## CSS\n\nIn addition to the following Sass functionality, consider reading about our included [CSS custom properties]([[docsref:/customize/css-variables]]) (aka CSS variables) for colors and more.\n\n### Sass utilities API\n\nLink utilities are declared in our utilities API in `scss/_utilities.scss`. [Learn how to use the utilities API.]([[docsref:/utilities/api#using-the-api]])\n\n<ScssDocs name=\"utils-links\" file=\"scss/_utilities.scss\" />\n"
  },
  {
    "path": "site/src/content/docs/utilities/object-fit.mdx",
    "content": "---\ntitle: Object fit\ndescription: Use the object fit utilities to modify how the content of a <a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/Replaced_element\" target=\"_blank\" rel=\"noopener noreferrer\">replaced element</a>, such as an `<img>` or `<video>`, should be resized to fit its container.\ntoc: true\nadded:\n  version: \"5.3\"\n---\n\n## How it works\n\nChange the value of the [`object-fit` property](https://developer.mozilla.org/en-US/docs/Web/CSS/object-fit) with our responsive `object-fit` utility classes. This property tells the content to fill the parent container in a variety of ways, such as preserving the aspect ratio or stretching to take up as much space as possible.\n\nClasses for the value of `object-fit` are named using the format `.object-fit-{value}`. Choose from the following values:\n\n- `contain`\n- `cover`\n- `fill`\n- `scale` (for scale-down)\n- `none`\n\n## Examples\n\nAdd the `object-fit-{value}` class to the [replaced element](https://developer.mozilla.org/en-US/docs/Web/CSS/Replaced_element):\n\n<Example class=\"d-flex overflow-auto\" code={`<Placeholder width=\"140\" height=\"120\" class=\"object-fit-contain border rounded\" text=\"Object fit contain\" markup=\"img\" />\n<Placeholder width=\"140\" height=\"120\" class=\"object-fit-cover border rounded\" text=\"Object fit cover\" markup=\"img\" />\n<Placeholder width=\"140\" height=\"120\" class=\"object-fit-fill border rounded\" text=\"Object fit fill\" markup=\"img\" />\n<Placeholder width=\"140\" height=\"120\" class=\"object-fit-scale border rounded\" text=\"Object fit scale down\" markup=\"img\" />\n<Placeholder width=\"140\" height=\"120\" class=\"object-fit-none border rounded\" text=\"Object fit none\" markup=\"img\" />`} />\n\n## Responsive\n\nResponsive variations also exist for each `object-fit` value using the format `.object-fit-{breakpoint}-{value}`, for the following breakpoint abbreviations: `sm`, `md`, `lg`, `xl`, and `xxl`. Classes can be combined for various effects as you need.\n\n<Example class=\"d-flex overflow-auto\" code={`<Placeholder width=\"140\" height=\"80\" class=\"object-fit-sm-contain border rounded\" text=\"Contain on sm\" markup=\"img\" />\n<Placeholder width=\"140\" height=\"80\" class=\"object-fit-md-contain border rounded\" text=\"Contain on md\" markup=\"img\" />\n<Placeholder width=\"140\" height=\"80\" class=\"object-fit-lg-contain border rounded\" text=\"Contain on lg\" markup=\"img\" />\n<Placeholder width=\"140\" height=\"80\" class=\"object-fit-xl-contain border rounded\" text=\"Contain on xl\" markup=\"img\" />\n<Placeholder width=\"140\" height=\"80\" class=\"object-fit-xxl-contain border rounded\" text=\"Contain on xxl\" markup=\"img\" />`} />\n\n## Video\n\nThe `.object-fit-{value}` and responsive `.object-fit-{breakpoint}-{value}` utilities also work on `<video>` elements.\n\n```html\n<video src=\"...\" class=\"object-fit-contain\" autoplay></video>\n<video src=\"...\" class=\"object-fit-cover\" autoplay></video>\n<video src=\"...\" class=\"object-fit-fill\" autoplay></video>\n<video src=\"...\" class=\"object-fit-scale\" autoplay></video>\n<video src=\"...\" class=\"object-fit-none\" autoplay></video>\n```\n\n## CSS\n\n### Sass utilities API\n\nObject fit utilities are declared in our utilities API in `scss/_utilities.scss`. [Learn how to use the utilities API.]([[docsref:/utilities/api#using-the-api]])\n\n<ScssDocs name=\"utils-object-fit\" file=\"scss/_utilities.scss\" />\n"
  },
  {
    "path": "site/src/content/docs/utilities/opacity.mdx",
    "content": "---\ntitle: Opacity\ndescription: Control the opacity of elements.\nadded:\n  version: \"5.1\"\n---\n\nThe `opacity` property sets the opacity level for an element. The opacity level describes the transparency level, where `1` is not transparent at all, `.5` is 50% visible, and `0` is completely transparent.\n\nSet the `opacity` of an element using `.opacity-{value}` utilities.\n\n<div class=\"bd-example d-sm-flex\">\n  <div class=\"opacity-100 p-3 m-2 bg-primary text-light fw-bold rounded\">100%</div>\n  <div class=\"opacity-75 p-3 m-2 bg-primary text-light fw-bold rounded\">75%</div>\n  <div class=\"opacity-50 p-3 m-2 bg-primary text-light fw-bold rounded\">50%</div>\n  <div class=\"opacity-25 p-3 m-2 bg-primary text-light fw-bold rounded\">25%</div>\n  <div class=\"opacity-0 p-3 m-2 bg-primary text-light fw-bold rounded\">0%</div>\n</div>\n\n```html\n<div class=\"opacity-100\">...</div>\n<div class=\"opacity-75\">...</div>\n<div class=\"opacity-50\">...</div>\n<div class=\"opacity-25\">...</div>\n<div class=\"opacity-0\">...</div>\n```\n\n## CSS\n\n### Sass utilities API\n\nOpacity utilities are declared in our utilities API in `scss/_utilities.scss`. [Learn how to use the utilities API.]([[docsref:/utilities/api#using-the-api]])\n\n<ScssDocs name=\"utils-opacity\" file=\"scss/_utilities.scss\" />\n"
  },
  {
    "path": "site/src/content/docs/utilities/overflow.mdx",
    "content": "---\ntitle: Overflow\ndescription: Use these shorthand utilities for quickly configuring how content overflows an element.\ntoc: true\n---\n\n## Overflow\n\nAdjust the `overflow` property on the fly with four default values and classes. These classes are not responsive by default.\n\n<div class=\"bd-example d-md-flex\">\n  <div class=\"overflow-auto p-3 mb-3 mb-md-0 me-md-3 bg-body-tertiary\" style=\"max-width: 260px; max-height: 100px;\">\n    This is an example of using <code>.overflow-auto</code> on an element with set width and height dimensions. By design, this content will vertically scroll.\n  </div>\n  <div class=\"overflow-hidden p-3 mb-3 mb-md-0 me-md-3 bg-body-tertiary\" style=\"max-width: 260px; max-height: 100px;\">\n    This is an example of using <code>.overflow-hidden</code> on an element with set width and height dimensions.\n  </div>\n  <div class=\"overflow-visible p-3 mb-3 mb-md-0 me-md-3 bg-body-tertiary\" style=\"max-width: 260px; max-height: 100px;\">\n    This is an example of using <code>.overflow-visible</code> on an element with set width and height dimensions.\n  </div>\n  <div class=\"overflow-scroll p-3 bg-body-tertiary\" style=\"max-width: 260px; max-height: 100px;\">\n    This is an example of using <code>.overflow-scroll</code> on an element with set width and height dimensions.\n  </div>\n</div>\n\n```html\n<div class=\"overflow-auto\">...</div>\n<div class=\"overflow-hidden\">...</div>\n<div class=\"overflow-visible\">...</div>\n<div class=\"overflow-scroll\">...</div>\n```\n\n### `overflow-x`\n\nAdjust the `overflow-x` property to affect the overflow of content horizontally.\n\n<div class=\"bd-example d-md-flex\">\n  <div class=\"overflow-x-auto p-3 mb-3 mb-md-0 me-md-3 bg-body-tertiary w-100\" style=\"max-width: 200px; max-height: 100px; white-space: nowrap;\">\n    <div><code>.overflow-x-auto</code> example on an element</div>\n    <div> with set width and height dimensions.</div>\n  </div>\n  <div class=\"overflow-x-hidden p-3 mb-3 mb-md-0 me-md-3 bg-body-tertiary w-100\" style=\"max-width: 200px; max-height: 100px;white-space: nowrap;\">\n    <div><code>.overflow-x-hidden</code> example</div>\n    <div>on an element with set width and height dimensions.</div>\n  </div>\n  <div class=\"overflow-x-visible p-3 mb-3 mb-md-0 me-md-3 bg-body-tertiary w-100\" style=\"max-width: 200px; max-height: 100px;white-space: nowrap;\">\n    <div><code>.overflow-x-visible</code> example </div>\n    <div>on an element with set width and height dimensions.</div>\n  </div>\n  <div class=\"overflow-x-scroll p-3 bg-body-tertiary w-100\" style=\"max-width: 200px; max-height: 100px;white-space: nowrap;\">\n    <div><code>.overflow-x-scroll</code> example on an element</div>\n    <div> with set width and height dimensions.</div>\n  </div>\n</div>\n\n```html\n<div class=\"overflow-x-auto\">...</div>\n<div class=\"overflow-x-hidden\">...</div>\n<div class=\"overflow-x-visible\">...</div>\n<div class=\"overflow-x-scroll\">...</div>\n```\n\n### `overflow-y`\n\nAdjust the `overflow-y` property to affect the overflow of content vertically.\n\n<div class=\"bd-example d-md-flex\">\n  <div class=\"overflow-y-auto p-3 mb-3 mb-md-0 me-md-3 bg-body-tertiary w-100\" style=\"max-width: 200px; max-height: 100px;\">\n    <code>.overflow-y-auto</code> example on an element with set width and height dimensions.\n  </div>\n  <div class=\"overflow-y-hidden p-3 mb-3 mb-md-0 me-md-3 bg-body-tertiary w-100\" style=\"max-width: 200px; max-height: 100px;\">\n    <code>.overflow-y-hidden</code> example on an element with set width and height dimensions.\n  </div>\n  <div class=\"overflow-y-visible p-3 mb-3 mb-md-0 me-md-3 bg-body-tertiary w-100\" style=\"max-width: 200px; max-height: 100px;\">\n    <code>.overflow-y-visible</code> example on an element with set width and height dimensions.\n  </div>\n  <div class=\"overflow-y-scroll p-3 bg-body-tertiary w-100\" style=\"max-width: 200px; max-height: 100px;\">\n    <code>.overflow-y-scroll</code> example on an element with set width and height dimensions.\n  </div>\n</div>\n\n```html\n<div class=\"overflow-y-auto\">...</div>\n<div class=\"overflow-y-hidden\">...</div>\n<div class=\"overflow-y-visible\">...</div>\n<div class=\"overflow-y-scroll\">...</div>\n```\n\nUsing Sass variables, you may customize the overflow utilities by changing the `$overflows` variable in `_variables.scss`.\n\n## CSS\n\n### Sass utilities API\n\nOverflow utilities are declared in our utilities API in `scss/_utilities.scss`. [Learn how to use the utilities API.]([[docsref:/utilities/api#using-the-api]])\n\n<ScssDocs name=\"utils-overflow\" file=\"scss/_utilities.scss\" />\n"
  },
  {
    "path": "site/src/content/docs/utilities/position.mdx",
    "content": "---\ntitle: Position\ndescription: Use these shorthand utilities for quickly configuring the position of an element.\ntoc: true\n---\n\n## Position values\n\nQuick positioning classes are available, though they are not responsive.\n\n```html\n<div class=\"position-static\">...</div>\n<div class=\"position-relative\">...</div>\n<div class=\"position-absolute\">...</div>\n<div class=\"position-fixed\">...</div>\n<div class=\"position-sticky\">...</div>\n```\n\n## Arrange elements\n\nArrange elements easily with the edge positioning utilities. The format is `{property}-{position}`.\n\nWhere *property* is one of:\n\n- `top` - for the vertical `top` position\n- `start` - for the horizontal `left` position (in LTR)\n- `bottom` - for the vertical `bottom` position\n- `end` - for the horizontal `right` position (in LTR)\n\nWhere *position* is one of:\n\n- `0` - for `0` edge position\n- `50` - for `50%` edge position\n- `100` - for `100%` edge position\n\n(You can add more position values by adding entries to the `$position-values` Sass map variable.)\n\n<Example class=\"bd-example-position-utils\" code={`<div class=\"position-relative\">\n    <div class=\"position-absolute top-0 start-0\"></div>\n    <div class=\"position-absolute top-0 end-0\"></div>\n    <div class=\"position-absolute top-50 start-50\"></div>\n    <div class=\"position-absolute bottom-50 end-50\"></div>\n    <div class=\"position-absolute bottom-0 start-0\"></div>\n    <div class=\"position-absolute bottom-0 end-0\"></div>\n  </div>`} />\n\n## Center elements\n\nIn addition, you can also center the elements with the transform utility class `.translate-middle`.\n\nThis class applies the transformations `translateX(-50%)` and `translateY(-50%)` to the element which, in combination with the edge positioning utilities, allows you to absolute center an element.\n\n<Example class=\"bd-example-position-utils\" code={`<div class=\"position-relative\">\n    <div class=\"position-absolute top-0 start-0 translate-middle\"></div>\n    <div class=\"position-absolute top-0 start-50 translate-middle\"></div>\n    <div class=\"position-absolute top-0 start-100 translate-middle\"></div>\n    <div class=\"position-absolute top-50 start-0 translate-middle\"></div>\n    <div class=\"position-absolute top-50 start-50 translate-middle\"></div>\n    <div class=\"position-absolute top-50 start-100 translate-middle\"></div>\n    <div class=\"position-absolute top-100 start-0 translate-middle\"></div>\n    <div class=\"position-absolute top-100 start-50 translate-middle\"></div>\n    <div class=\"position-absolute top-100 start-100 translate-middle\"></div>\n  </div>`} />\n\nBy adding `.translate-middle-x` or `.translate-middle-y` classes, elements can be positioned only in horizontal or vertical direction.\n\n<Example class=\"bd-example-position-utils\" code={`<div class=\"position-relative\">\n    <div class=\"position-absolute top-0 start-0\"></div>\n    <div class=\"position-absolute top-0 start-50 translate-middle-x\"></div>\n    <div class=\"position-absolute top-0 end-0\"></div>\n    <div class=\"position-absolute top-50 start-0 translate-middle-y\"></div>\n    <div class=\"position-absolute top-50 start-50 translate-middle\"></div>\n    <div class=\"position-absolute top-50 end-0 translate-middle-y\"></div>\n    <div class=\"position-absolute bottom-0 start-0\"></div>\n    <div class=\"position-absolute bottom-0 start-50 translate-middle-x\"></div>\n    <div class=\"position-absolute bottom-0 end-0\"></div>\n  </div>`} />\n\n## Examples\n\nHere are some real life examples of these classes:\n\n<Example class=\"bd-example-position-examples d-flex justify-content-around align-items-center\" code={`<button type=\"button\" class=\"btn btn-primary position-relative\">\n    Mails <span class=\"position-absolute top-0 start-100 translate-middle badge rounded-pill text-bg-secondary\">+99 <span class=\"visually-hidden\">unread messages</span></span>\n  </button>\n\n  <div class=\"position-relative py-2 px-4 text-bg-secondary border border-secondary rounded-pill\">\n    Marker <svg width=\"1em\" height=\"1em\" viewBox=\"0 0 16 16\" class=\"position-absolute top-100 start-50 translate-middle mt-1\" fill=\"var(--bs-secondary)\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path d=\"M7.247 11.14L2.451 5.658C1.885 5.013 2.345 4 3.204 4h9.592a1 1 0 0 1 .753 1.659l-4.796 5.48a1 1 0 0 1-1.506 0z\"/></svg>\n  </div>\n\n  <button type=\"button\" class=\"btn btn-primary position-relative\">\n    Alerts <span class=\"position-absolute top-0 start-100 translate-middle badge border border-light rounded-circle bg-danger p-2\"><span class=\"visually-hidden\">unread messages</span></span>\n  </button>`} />\n\nYou can use these classes with existing components to create new ones. Remember that you can extend its functionality by adding entries to the `$position-values` variable.\n\n<Example class=\"bd-example-position-examples\" code={`<div class=\"position-relative m-4\">\n    <div class=\"progress\" role=\"progressbar\" aria-label=\"Progress\" aria-valuenow=\"50\" aria-valuemin=\"0\" aria-valuemax=\"100\" style=\"height: 1px;\">\n      <div class=\"progress-bar\" style=\"width: 50%\"></div>\n    </div>\n    <button type=\"button\" class=\"position-absolute top-0 start-0 translate-middle btn btn-sm btn-primary rounded-pill\" style=\"width: 2rem; height:2rem;\">1</button>\n    <button type=\"button\" class=\"position-absolute top-0 start-50 translate-middle btn btn-sm btn-primary rounded-pill\" style=\"width: 2rem; height:2rem;\">2</button>\n    <button type=\"button\" class=\"position-absolute top-0 start-100 translate-middle btn btn-sm btn-secondary rounded-pill\" style=\"width: 2rem; height:2rem;\">3</button>\n  </div>`} />\n\n## CSS\n\n### Sass maps\n\nDefault position utility values are declared in a Sass map, then used to generate our utilities.\n\n<ScssDocs name=\"position-map\" file=\"scss/_variables.scss\" />\n\n### Sass utilities API\n\nPosition utilities are declared in our utilities API in `scss/_utilities.scss`. [Learn how to use the utilities API.]([[docsref:/utilities/api#using-the-api]])\n\n<ScssDocs name=\"utils-position\" file=\"scss/_utilities.scss\" />\n"
  },
  {
    "path": "site/src/content/docs/utilities/shadows.mdx",
    "content": "---\ntitle: Shadows\ndescription: Add or remove shadows to elements with box-shadow utilities.\ntoc: true\n---\n\n## Examples\n\nWhile shadows on components are disabled by default in Bootstrap and can be enabled via `$enable-shadows`, you can also quickly add or remove a shadow with our `box-shadow` utility classes. Includes support for `.shadow-none` and three default sizes (which have associated variables to match).\n\n<Example class=\"overflow-hidden\" code={`<div class=\"shadow-none p-3 mb-5 bg-body-tertiary rounded\">No shadow</div>\n<div class=\"shadow-sm p-3 mb-5 bg-body-tertiary rounded\">Small shadow</div>\n<div class=\"shadow p-3 mb-5 bg-body-tertiary rounded\">Regular shadow</div>\n<div class=\"shadow-lg p-3 mb-5 bg-body-tertiary rounded\">Larger shadow</div>`} />\n\n## CSS\n\n### Sass variables\n\n<ScssDocs name=\"box-shadow-variables\" file=\"scss/_variables.scss\" />\n\n### Sass utilities API\n\nShadow utilities are declared in our utilities API in `scss/_utilities.scss`. [Learn how to use the utilities API.]([[docsref:/utilities/api#using-the-api]])\n\n<ScssDocs name=\"utils-shadow\" file=\"scss/_utilities.scss\" />\n"
  },
  {
    "path": "site/src/content/docs/utilities/sizing.mdx",
    "content": "---\ntitle: Sizing\ndescription: Easily make an element as wide or as tall with our width and height utilities.\ntoc: true\n---\n\n## Relative to the parent\n\nWidth and height utilities are generated from the utility API in `_utilities.scss`. Includes support for `25%`, `50%`, `75%`, `100%`, and `auto` by default. Modify those values as you need to generate different utilities here.\n\n<Example class=\"bd-example-flex\" code={`<div class=\"w-25 p-3\">Width 25%</div>\n<div class=\"w-50 p-3\">Width 50%</div>\n<div class=\"w-75 p-3\">Width 75%</div>\n<div class=\"w-100 p-3\">Width 100%</div>\n<div class=\"w-auto p-3\">Width auto</div>`} />\n\n<Example class=\"bd-example-flex\" code={`<div style=\"height: 100px;\">\n    <div class=\"h-25 d-inline-block\" style=\"width: 120px;\">Height 25%</div>\n    <div class=\"h-50 d-inline-block\" style=\"width: 120px;\">Height 50%</div>\n    <div class=\"h-75 d-inline-block\" style=\"width: 120px;\">Height 75%</div>\n    <div class=\"h-100 d-inline-block\" style=\"width: 120px;\">Height 100%</div>\n    <div class=\"h-auto d-inline-block\" style=\"width: 120px;\">Height auto</div>\n  </div>`} />\n\nYou can also use `max-width: 100%;` and `max-height: 100%;` utilities as needed.\n\n<Example class=\"bd-example-flex\" code={`<div style=\"width: 50%; height: 100px;\">\n    <div class=\"mw-100\" style=\"width: 200%;\">Max-width 100%</div>\n  </div>`} />\n\n<Example class=\"bd-example-flex\" code={`<div style=\"height: 100px;\">\n    <div class=\"mh-100\" style=\"width: 100px; height: 200px;\">Max-height 100%</div>\n  </div>`} />\n\n## Relative to the viewport\n\nYou can also use utilities to set the width and height relative to the viewport.\n\n```html\n<div class=\"min-vw-100\">Min-width 100vw</div>\n<div class=\"min-vh-100\">Min-height 100vh</div>\n<div class=\"vw-100\">Width 100vw</div>\n<div class=\"vh-100\">Height 100vh</div>\n```\n\n## CSS\n\n### Sass utilities API\n\nSizing utilities are declared in our utilities API in `scss/_utilities.scss`. [Learn how to use the utilities API.]([[docsref:/utilities/api#using-the-api]])\n\n<ScssDocs name=\"utils-sizing\" file=\"scss/_utilities.scss\" />\n"
  },
  {
    "path": "site/src/content/docs/utilities/spacing.mdx",
    "content": "---\ntitle: Spacing\ndescription: Bootstrap includes a wide range of shorthand responsive margin, padding, and gap utility classes to modify an element’s appearance.\ntoc: true\n---\n\n## Margin and padding\n\nAssign responsive-friendly `margin` or `padding` values to an element or a subset of its sides with shorthand classes. Includes support for individual properties, all properties, and vertical and horizontal properties. Classes are built from a default Sass map ranging from `.25rem` to `3rem`.\n\n<Callout>\n**Using the CSS Grid layout module?** Consider using [the gap utility](#gap) instead.\n</Callout>\n\n### Notation\n\nSpacing utilities that apply to all breakpoints, from `xs` to `xxl`, have no breakpoint abbreviation in them. This is because those classes are applied from `min-width: 0` and up, and thus are not bound by a media query. The remaining breakpoints, however, do include a breakpoint abbreviation.\n\nThe classes are named using the format `{property}{sides}-{size}` for `xs` and `{property}{sides}-{breakpoint}-{size}` for `sm`, `md`, `lg`, `xl`, and `xxl`.\n\nWhere *property* is one of:\n\n- `m` - for classes that set `margin`\n- `p` - for classes that set `padding`\n\nWhere *sides* is one of:\n\n- `t` - for classes that set `margin-top` or `padding-top`\n- `b` - for classes that set `margin-bottom` or `padding-bottom`\n- `s` - (start) for classes that set `margin-left` or `padding-left` in LTR, `margin-right` or `padding-right` in RTL\n- `e` - (end) for classes that set `margin-right` or `padding-right` in LTR, `margin-left` or `padding-left` in RTL\n- `x` - for classes that set both `*-left` and `*-right`\n- `y` - for classes that set both `*-top` and `*-bottom`\n- blank - for classes that set a `margin` or `padding` on all 4 sides of the element\n\nWhere *size* is one of:\n\n- `0` - for classes that eliminate the `margin` or `padding` by setting it to `0`\n- `1` - (by default) for classes that set the `margin` or `padding` to `$spacer * .25`\n- `2` - (by default) for classes that set the `margin` or `padding` to `$spacer * .5`\n- `3` - (by default) for classes that set the `margin` or `padding` to `$spacer`\n- `4` - (by default) for classes that set the `margin` or `padding` to `$spacer * 1.5`\n- `5` - (by default) for classes that set the `margin` or `padding` to `$spacer * 3`\n- `auto` - for classes that set the `margin` to auto\n\n(You can add more sizes by adding entries to the `$spacers` Sass map variable.)\n\n### Examples\n\nHere are some representative examples of these classes:\n\n```scss\n.mt-0 {\n  margin-top: 0 !important;\n}\n\n.ms-1 {\n  margin-left: ($spacer * .25) !important;\n}\n\n.px-2 {\n  padding-left: ($spacer * .5) !important;\n  padding-right: ($spacer * .5) !important;\n}\n\n.p-3 {\n  padding: $spacer !important;\n}\n```\n\n### Horizontal centering\n\nAdditionally, Bootstrap also includes an `.mx-auto` class for horizontally centering fixed-width block level content—that is, content that has `display: block` and a `width` set—by setting the horizontal margins to `auto`.\n\n<Example showMarkup={false} code={`<div class=\"mx-auto p-2\" style=\"width: 200px; background-color: rgba(var(--bd-violet-rgb),.15); border: rgba(var(--bd-violet-rgb),.3) solid 1px;\">\n    Centered element\n  </div>`} />\n\n```html\n<div class=\"mx-auto p-2\" style=\"width: 200px;\">\n  Centered element\n</div>\n```\n\n## Negative margin\n\nIn CSS, `margin` properties can utilize negative values (`padding` cannot). These negative margins are **disabled by default**, but can be enabled in Sass by setting `$enable-negative-margins: true`.\n\nThe syntax is nearly the same as the default, positive margin utilities, but with the addition of `n` before the requested size. Here’s an example class that’s the opposite of `.mt-1`:\n\n```scss\n.mt-n1 {\n  margin-top: -0.25rem !important;\n}\n```\n\n## Gap\n\nWhen using `display: grid` or `display: flex`, you can make use of `gap` utilities on the parent element. This can save on having to add margin utilities to individual children of a grid or flex container. Gap utilities are responsive by default, and are generated via our utilities API, based on the `$spacers` Sass map.\n\n<Example class=\"bd-example-cssgrid\" code={`<div style=\"grid-template-columns: 1fr 1fr;\" class=\"d-grid gap-3\">\n    <div class=\"p-2\">Grid item 1</div>\n    <div class=\"p-2\">Grid item 2</div>\n    <div class=\"p-2\">Grid item 3</div>\n    <div class=\"p-2\">Grid item 4</div>\n  </div>`} />\n\nSupport includes responsive options for all of Bootstrap’s grid breakpoints, as well as six sizes from the `$spacers` map (`0`–`5`). There is no `.gap-auto` utility class as it’s effectively the same as `.gap-0`.\n\n### row-gap\n\n`row-gap` sets the vertical space between children items in the specified container.\n\n<Example class=\"bd-example-cssgrid\" code={`<div style=\"grid-template-columns: 1fr 1fr;\" class=\"d-grid gap-0 row-gap-3\">\n    <div class=\"p-2\">Grid item 1</div>\n    <div class=\"p-2\">Grid item 2</div>\n    <div class=\"p-2\">Grid item 3</div>\n    <div class=\"p-2\">Grid item 4</div>\n  </div>`} />\n\n### column-gap\n\n`column-gap` sets the horizontal space between children items in the specified container.\n\n<Example class=\"bd-example-cssgrid\" code={`<div style=\"grid-template-columns: 1fr 1fr;\" class=\"d-grid gap-0 column-gap-3\">\n    <div class=\"p-2\">Grid item 1</div>\n    <div class=\"p-2\">Grid item 2</div>\n    <div class=\"p-2\">Grid item 3</div>\n    <div class=\"p-2\">Grid item 4</div>\n  </div>`} />\n\n## CSS\n\n### Sass maps\n\nSpacing utilities are declared via Sass map and then generated with our utilities API.\n\n<ScssDocs name=\"spacer-variables-maps\" file=\"scss/_variables.scss\" />\n\n### Sass utilities API\n\nSpacing utilities are declared in our utilities API in `scss/_utilities.scss`. [Learn how to use the utilities API.]([[docsref:/utilities/api#using-the-api]])\n\n<ScssDocs name=\"utils-spacing\" file=\"scss/_utilities.scss\" />\n"
  },
  {
    "path": "site/src/content/docs/utilities/text.mdx",
    "content": "---\ntitle: Text\ndescription: Documentation and examples for common text utilities to control alignment, wrapping, weight, and more.\ntoc: true\n---\n\n## Text alignment\n\nEasily realign text to components with text alignment classes. For start, end, and center alignment, responsive classes are available that use the same viewport width breakpoints as the grid system.\n\n<Example code={`<p class=\"text-start\">Start aligned text on all viewport sizes.</p>\n<p class=\"text-center\">Center aligned text on all viewport sizes.</p>\n<p class=\"text-end\">End aligned text on all viewport sizes.</p>\n\n<p class=\"text-sm-end\">End aligned text on viewports sized SM (small) or wider.</p>\n<p class=\"text-md-end\">End aligned text on viewports sized MD (medium) or wider.</p>\n<p class=\"text-lg-end\">End aligned text on viewports sized LG (large) or wider.</p>\n<p class=\"text-xl-end\">End aligned text on viewports sized XL (extra large) or wider.</p>\n<p class=\"text-xxl-end\">End aligned text on viewports sized XXL (extra extra large) or wider.</p>`} />\n\n<Callout>\nNote that we don’t provide utility classes for justified text. While, aesthetically, justified text might look more appealing, it does make word-spacing more random and therefore harder to read.\n</Callout>\n\n## Text wrapping and overflow\n\nWrap text with a `.text-wrap` class.\n\n<Example code={`<div class=\"badge text-bg-primary text-wrap\" style=\"width: 6rem;\">\n    This text should wrap.\n  </div>`} />\n\nPrevent text from wrapping with a `.text-nowrap` class.\n\n<Example code={`<div class=\"text-nowrap bg-body-secondary border\" style=\"width: 8rem;\">\n    This text should overflow the parent.\n  </div>`} />\n\n## Word break\n\nPrevent long strings of text from breaking your components’ layout by using `.text-break` to set `word-wrap: break-word` and `word-break: break-word`. We use `word-wrap` instead of the more common `overflow-wrap` for wider browser support, and add the deprecated `word-break: break-word` to avoid issues with flex containers.\n\n<Example code={`<p class=\"text-break\">mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm</p>`} />\n\n<Callout type=\"warning\">\nNote that [breaking words isn’t possible in Arabic](https://rtlstyling.com/posts/rtl-styling#3.-line-break), which is the most used RTL language. Therefore `.text-break` is removed from our RTL compiled CSS.\n</Callout>\n\n## Text transform\n\nTransform text in components with our text capitalization classes: `text-lowercase`, `text-uppercase` or `text-capitalize`.\n\n<Example code={`<p class=\"text-lowercase\">Lowercased text.</p>\n<p class=\"text-uppercase\">Uppercased text.</p>\n<p class=\"text-capitalize\">CapiTaliZed text.</p>`} />\n\nNote how `.text-capitalize` only changes the first letter of each word, leaving the case of any other letters unaffected.\n\n## Font size\n\nQuickly change the `font-size` of text. While our heading classes (e.g., `.h1`–`.h6`) apply `font-size`, `font-weight`, and `line-height`, these utilities _only_ apply `font-size`. Sizing for these utilities matches HTML’s heading elements, so as the number increases, their size decreases.\n\n<Example code={`<p class=\"fs-1\">.fs-1 text</p>\n<p class=\"fs-2\">.fs-2 text</p>\n<p class=\"fs-3\">.fs-3 text</p>\n<p class=\"fs-4\">.fs-4 text</p>\n<p class=\"fs-5\">.fs-5 text</p>\n<p class=\"fs-6\">.fs-6 text</p>`} />\n\nCustomize your available `font-size`s by modifying the `$font-sizes` Sass map.\n\n## Font weight and italics\n\nQuickly change the `font-weight` or `font-style` of text with these utilities. `font-style` utilities are abbreviated as `.fst-*` and `font-weight` utilities are abbreviated as `.fw-*`.\n\n<Example code={`<p class=\"fw-bold\">Bold text.</p>\n<p class=\"fw-bolder\">Bolder weight text (relative to the parent element).</p>\n<p class=\"fw-semibold\">Semibold weight text.</p>\n<p class=\"fw-medium\">Medium weight text.</p>\n<p class=\"fw-normal\">Normal weight text.</p>\n<p class=\"fw-light\">Light weight text.</p>\n<p class=\"fw-lighter\">Lighter weight text (relative to the parent element).</p>\n<p class=\"fst-italic\">Italic text.</p>\n<p class=\"fst-normal\">Text with normal font style</p>`} />\n\n## Line height\n\nChange the line height with `.lh-*` utilities.\n\n<Example code={`<p class=\"lh-1\">This is a long paragraph written to show how the line-height of an element is affected by our utilities. Classes are applied to the element itself or sometimes the parent element. These classes can be customized as needed with our utility API.</p>\n<p class=\"lh-sm\">This is a long paragraph written to show how the line-height of an element is affected by our utilities. Classes are applied to the element itself or sometimes the parent element. These classes can be customized as needed with our utility API.</p>\n<p class=\"lh-base\">This is a long paragraph written to show how the line-height of an element is affected by our utilities. Classes are applied to the element itself or sometimes the parent element. These classes can be customized as needed with our utility API.</p>\n<p class=\"lh-lg\">This is a long paragraph written to show how the line-height of an element is affected by our utilities. Classes are applied to the element itself or sometimes the parent element. These classes can be customized as needed with our utility API.</p>`} />\n\n## Monospace\n\nChange a selection to our monospace font stack with `.font-monospace`.\n\n<Example code={`<p class=\"font-monospace\">This is in monospace</p>`} />\n\n## Reset color\n\nReset a text or link’s color with `.text-reset`, so that it inherits the color from its parent.\n\n<Example code={`<p class=\"text-body-secondary\">\n    Secondary body text with a <a href=\"#\" class=\"text-reset\">reset link</a>.\n  </p>`} />\n\n## Text decoration\n\nDecorate text in components with text decoration classes.\n\n<Example code={`<p class=\"text-decoration-underline\">This text has a line underneath it.</p>\n<p class=\"text-decoration-line-through\">This text has a line going through it.</p>\n<a href=\"#\" class=\"text-decoration-none\">This link has its text decoration removed</a>`} />\n\n## CSS\n\n### Sass variables\n\nDefault type and font related Sass variables:\n\n<ScssDocs name=\"font-variables\" file=\"scss/_variables.scss\" />\n\n### Sass maps\n\nFont-size utilities are generated from this map, in combination with our utilities API.\n\n<ScssDocs name=\"font-sizes\" file=\"scss/_variables.scss\" />\n\n<ScssDocs name=\"theme-text-map\" file=\"scss/_maps.scss\" />\n\n### Sass utilities API\n\nFont and text utilities are declared in our utilities API in `scss/_utilities.scss`. [Learn how to use the utilities API.]([[docsref:/utilities/api#using-the-api]])\n\n<ScssDocs name=\"utils-text\" file=\"scss/_utilities.scss\" />\n"
  },
  {
    "path": "site/src/content/docs/utilities/vertical-align.mdx",
    "content": "---\ntitle: Vertical alignment\ndescription: Easily change the vertical alignment of inline, inline-block, inline-table, and table cell elements.\n---\n\nChange the alignment of elements with the [`vertical-alignment`](https://developer.mozilla.org/en-US/docs/Web/CSS/vertical-align) utilities. Please note that vertical-align only affects inline, inline-block, inline-table, and table cell elements.\n\nChoose from `.align-baseline`, `.align-top`, `.align-middle`, `.align-bottom`, `.align-text-bottom`, and `.align-text-top` as needed.\n\nTo vertically center non-inline content (like `<div>`s and more), use our [flex box utilities]([[docsref:/utilities/flex#align-items]]).\n\nWith inline elements:\n\n<Example code={`<span class=\"align-baseline\">baseline</span>\n<span class=\"align-top\">top</span>\n<span class=\"align-middle\">middle</span>\n<span class=\"align-bottom\">bottom</span>\n<span class=\"align-text-top\">text-top</span>\n<span class=\"align-text-bottom\">text-bottom</span>`} />\n\nWith table cells:\n\n<Example code={`<table style=\"height: 100px;\">\n    <tbody>\n      <tr>\n        <td class=\"align-baseline\">baseline</td>\n        <td class=\"align-top\">top</td>\n        <td class=\"align-middle\">middle</td>\n        <td class=\"align-bottom\">bottom</td>\n        <td class=\"align-text-top\">text-top</td>\n        <td class=\"align-text-bottom\">text-bottom</td>\n      </tr>\n    </tbody>\n  </table>`} />\n\n## CSS\n\n### Sass utilities API\n\nVertical align utilities are declared in our utilities API in `scss/_utilities.scss`. [Learn how to use the utilities API.]([[docsref:/utilities/api#using-the-api]])\n\n<ScssDocs name=\"utils-vertical-align\" file=\"scss/_utilities.scss\" />\n"
  },
  {
    "path": "site/src/content/docs/utilities/visibility.mdx",
    "content": "---\ntitle: Visibility\ndescription: Control the visibility of elements, without modifying their display, with visibility utilities.\n---\n\nSet the `visibility` of elements with our visibility utilities. These utility classes do not modify the `display` value at all and do not affect layout – `.invisible` elements still take up space in the page.\n\n<Callout type=\"warning\">\nElements with the `.invisible` class will be hidden *both* visually and for assistive technology/screen reader users.\n</Callout>\n\nApply `.visible` or `.invisible` as needed.\n\n```html\n<div class=\"visible\">...</div>\n<div class=\"invisible\">...</div>\n```\n\n```scss\n// Class\n.visible {\n  visibility: visible !important;\n}\n.invisible {\n  visibility: hidden !important;\n}\n```\n\n## CSS\n\n### Sass utilities API\n\nVisibility utilities are declared in our utilities API in `scss/_utilities.scss`. [Learn how to use the utilities API.]([[docsref:/utilities/api#using-the-api]])\n\n<ScssDocs name=\"utils-visibility\" file=\"scss/_utilities.scss\" />\n"
  },
  {
    "path": "site/src/content/docs/utilities/z-index.mdx",
    "content": "---\ntitle: Z-index\ndescription: Use our low-level `z-index` utilities to quickly change the stack level of an element or component.\ntoc: true\nadded:\n  version: \"5.3\"\n---\n\n## Example\n\nUse `z-index` utilities to stack elements on top of one another. Requires a `position` value other than `static`, which can be set with custom styles or using our [position utilities]([[docsref:/utilities/position/]]).\n\n<Callout>\nWe call these “low-level” `z-index` utilities because of their default values of `-1` through `3`, which we use for the layout of overlapping components. High-level `z-index` values are used for overlay components like modals and tooltips.\n</Callout>\n\n<Example class=\"bd-example-zindex-levels position-relative\" code={`<div class=\"z-3 position-absolute p-5 rounded-3\"><span>z-3</span></div>\n<div class=\"z-2 position-absolute p-5 rounded-3\"><span>z-2</span></div>\n<div class=\"z-1 position-absolute p-5 rounded-3\"><span>z-1</span></div>\n<div class=\"z-0 position-absolute p-5 rounded-3\"><span>z-0</span></div>\n<div class=\"z-n1 position-absolute p-5 rounded-3\"><span>z-n1</span></div>`} />\n\n## Overlays\n\nBootstrap overlay components—dropdown, modal, offcanvas, popover, toast, and tooltip—all have their own `z-index` values to ensure a usable experience with competing “layers” of an interface.\n\nRead about them in the [`z-index` layout page]([[docsref:/layout/z-index]]).\n\n## Component approach\n\nOn some components, we use our low-level `z-index` values to manage repeating elements that overlap one another (like buttons in a button group or items in a list group).\n\nLearn about our [`z-index` approach]([[docsref:/extend/approach#z-index-scales]]).\n\n## CSS\n\n### Sass maps\n\nCustomize this Sass map to change the available values and generated utilities.\n\n<ScssDocs name=\"zindex-levels-map\" file=\"scss/_variables.scss\" />\n\n### Sass utilities API\n\nPosition utilities are declared in our utilities API in `scss/_utilities.scss`. [Learn how to use the utilities API.]([[docsref:/utilities/api#using-the-api]])\n\n<ScssDocs name=\"utils-zindex\" file=\"scss/_utilities.scss\" />\n"
  },
  {
    "path": "site/src/env.d.ts",
    "content": "/// <reference path=\"../.astro/types.d.ts\" />\n/// <reference types=\"astro/client\" />\n\ninterface ImportMetaEnv {\n  readonly NETLIFY?: string\n}\n\ninterface ImportMeta {\n  readonly env: ImportMetaEnv\n}\n"
  },
  {
    "path": "site/src/layouts/BaseLayout.astro",
    "content": "---\nimport type { CollectionEntry } from 'astro:content'\nimport { getConfig } from '@libs/config'\nimport type { Layout, LayoutOverridesHTMLAttributes } from '@libs/layout'\nimport Head from '@components/head/Head.astro'\nimport Header from '@components/header/Header.astro'\nimport Scripts from '@components/Scripts.astro'\nimport Footer from '@components/footer/Footer.astro'\nimport { stripMarkdown } from '@libs/utils'\n\n// The following props can be directly passed to the base layout component from any page or layout extending it,\n// e.g. <BaseLayout layout=\"docs\" robots=\"noindex\" />.\ntype Props = {\n  // A specific layout to use for the current page used to determine if some components should be rendered or not.\n  // Available layouts are defined in `src/libs/layout.ts`.\n  layout?: Layout\n  // An object containing HTML attributes that can be overridden for some HTML elements used in the base layout keyed by\n  // HTML element names.\n  overrides?: {\n    body?: LayoutOverridesHTMLAttributes<'body'>\n    // Note that main can also be overridden by the Astro slot named \"main\" and that the slot will take precedence over\n    // any override.\n    main?: LayoutOverridesHTMLAttributes<'main'>\n  }\n  // A string containing the robots meta tag content. If not set, the tag will not be rendered.\n  robots?: string\n  // An override for the page title. If not defined, the title will either be the content of the `title` frontmatter\n  // property when rendering a markdown page or default back to the one defined in the `config.yml` file.\n  title?: string\n} & MarkdownProps\n\n// The following props are automatically set by Astro (if defined) based on the markdown frontmatter when rendering a\n// markdown page. They can be accessed through the `Astro.props.frontmatter` object but note that they won't be set when\n// not rendering a markdown page.\ntype MarkdownProps = { frontmatter?: Partial<CollectionEntry<'docs'>['data']> }\n\nconst { frontmatter, layout, overrides, robots } = Astro.props\n\nconst title = Astro.props.title ?? frontmatter?.title ?? getConfig().title\nconst description = frontmatter?.description ? stripMarkdown(frontmatter.description) : getConfig().description\nconst thumbnail = frontmatter?.thumbnail ? `img/${frontmatter.thumbnail}` : 'brand/bootstrap-social.png'\n\nconst bodyProps = overrides?.body ?? {}\nconst mainProps = overrides?.main ?? {}\n---\n\n<!DOCTYPE html>\n<html lang=\"en\" data-bs-theme=\"auto\">\n  <head>\n    <Head\n      description={description}\n      direction={frontmatter?.direction}\n      layout={layout}\n      robots={robots}\n      thumbnail={thumbnail}\n      title={title}\n    />\n  </head>\n  <body {...bodyProps}>\n    <Header layout={layout} title={title} addedIn={frontmatter?.added} />\n\n    {\n      Astro.slots.has('main') ? (\n        <slot name=\"main\" />\n      ) : (\n        <main {...mainProps}>\n          <slot />\n        </main>\n      )\n    }\n\n    <Footer />\n\n    <Scripts layout={layout} />\n\n    {frontmatter?.extra_js && frontmatter.extra_js.map((js) => <script is:inline async={js.async} src={js.src} />)}\n\n    {\n      layout === 'docs' && (\n        <div class=\"position-fixed\" aria-hidden=\"true\">\n          <input type=\"text\" tabindex=\"-1\" />\n        </div>\n      )\n    }\n  </body>\n</html>\n"
  },
  {
    "path": "site/src/layouts/DocsLayout.astro",
    "content": "---\nimport type { MarkdownHeading } from 'astro'\nimport type { CollectionEntry } from 'astro:content'\nimport { getConfig } from '@libs/config'\nimport type { LayoutOverridesHTMLAttributes } from '@libs/layout'\nimport { getSlug, processMarkdownToHtml } from '@libs/utils'\nimport { getVersionedDocsPath } from '@libs/path'\nimport Ads from '@components/Ads.astro'\nimport BaseLayout from '@layouts/BaseLayout.astro'\nimport DocsSidebar from '@components/DocsSidebar.astro'\nimport TableOfContents from '@components/TableOfContents.astro'\n\ninterface Props {\n  frontmatter: CollectionEntry<'docs'>['data']\n  headings?: MarkdownHeading[]\n  id: CollectionEntry<'docs'>['id']\n}\n\nconst { frontmatter, headings, id } = Astro.props\n\n// Extract the directory/section from the ID (format: \"directory/filename.mdx\")\nconst parentDirectory = id.includes('/') ? id.split('/')[0] : ''\n\nconst bodyProps: LayoutOverridesHTMLAttributes<'body'> = {}\n\nif (frontmatter.toc) {\n  bodyProps['data-bs-spy'] = 'scroll'\n  bodyProps['data-bs-target'] = '#TableOfContents'\n}\n---\n\n<BaseLayout {...Astro.props} layout=\"docs\" overrides={{ body: bodyProps }}>\n  <div slot=\"main\" class=\"container-xxl bd-gutter mt-3 my-md-4 bd-layout\">\n    <aside class=\"bd-sidebar\">\n      <div class=\"offcanvas-lg offcanvas-start\" tabindex=\"-1\" id=\"bdSidebar\" aria-labelledby=\"bdSidebarOffcanvasLabel\">\n        <div class=\"offcanvas-header border-bottom\">\n          <h5 class=\"offcanvas-title\" id=\"bdSidebarOffcanvasLabel\">Browse docs</h5>\n          <button\n            type=\"button\"\n            class=\"btn-close\"\n            data-bs-dismiss=\"offcanvas\"\n            aria-label=\"Close\"\n            data-bs-target=\"#bdSidebar\"></button>\n        </div>\n\n        <div class=\"offcanvas-body\">\n          <DocsSidebar />\n        </div>\n      </div>\n    </aside>\n\n    <main class=\"bd-main order-1\">\n      <div class=\"bd-intro pt-2 ps-lg-2\">\n        <div class=\"d-md-flex flex-md-row-reverse align-items-center justify-content-between\">\n          <div class=\"mb-3 mb-md-0 d-flex text-nowrap\">\n            {\n              // This is needed because we want to show the badge if show_badge isn't present or is set to false\n              frontmatter.added &&\n                ((frontmatter.added.show_badge !== undefined && frontmatter.added.show_badge === true) ||\n                  frontmatter.added.show_badge === undefined) && (\n                  <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\">\n                    Added in v{frontmatter.added.version}\n                  </small>\n                )\n            }\n            <a\n              class=\"btn btn-sm btn-bd-light rounded-2\"\n              href={`${getConfig().repo}/blob/v${getConfig().current_version}/site/src/content/docs/${id}`}\n              title=\"View and edit this file on GitHub\"\n              target=\"_blank\"\n              rel=\"noopener\"\n            >\n              View on GitHub\n            </a>\n          </div>\n          <h1 class=\"bd-title mb-0\" id=\"content\">{frontmatter.title}</h1>\n        </div>\n        <div class=\"bd-subtitle\">\n          {frontmatter.description && <Fragment set:html={processMarkdownToHtml(frontmatter.description)} />}\n        </div>\n      </div>\n\n\n      <div class=\"bd-toc mt-3 mb-5 my-lg-0 mb-lg-5 px-sm-1 text-body-secondary\">\n        {\n          frontmatter.toc && headings && (\n            <button\n              class=\"btn btn-link p-md-0 mb-2 mb-md-0 text-decoration-none bd-toc-toggle d-md-none\"\n              type=\"button\"\n              data-bs-toggle=\"collapse\"\n              data-bs-target=\"#tocContents\"\n              aria-expanded=\"false\"\n              aria-controls=\"tocContents\"\n            >\n              On this page\n              <svg class=\"bi d-md-none ms-2\" aria-hidden=\"true\">\n                <use xlink:href=\"#chevron-expand\" />\n              </svg>\n            </button>\n            <strong class=\"d-none d-md-block h6 my-2 ms-3\" id=\"docs-tocs\">On this page</strong>\n            <hr class=\"d-none d-md-block my-2 ms-3\" />\n            <div class=\"collapse bd-toc-collapse\" id=\"tocContents\">\n              <nav id=\"TableOfContents\" aria-labelledby=\"docs-tocs\">\n                <TableOfContents headings={headings} />\n              </nav>\n            </div>\n          )\n        }\n        <Ads />\n      </div>\n\n      <div class=\"bd-content ps-lg-2\">\n        {\n          frontmatter.sections && (\n            <div class=\"row g-3\">\n              {frontmatter.sections.map((section) => (\n                <div class=\"col-md-6\">\n                  <a\n                    class=\"d-block text-decoration-none\"\n                    href={getVersionedDocsPath(\n                      `${parentDirectory ? parentDirectory + '/' : ''}${getSlug(section.title)}/`\n                    )}\n                  >\n                    <strong class=\"d-block h5 mb-0\">{section.title}</strong>\n                    <span class=\"text-secondary\">{section.description}</span>\n                  </a>\n                </div>\n              ))}\n            </div>\n          )\n        }\n\n        <slot />\n      </div>\n    </main>\n  </div>\n</BaseLayout>\n"
  },
  {
    "path": "site/src/layouts/ExamplesLayout.astro",
    "content": "---\nimport type { HTMLAttributes } from 'astro/types'\nimport { getVersionedBsJsProps } from '@libs/bootstrap'\nimport { getConfig } from '@libs/config'\nimport type { ExampleFrontmatter } from '@libs/examples'\nimport { getVersionedDocsPath } from '@libs/path'\nimport Stylesheet from '@components/head/Stylesheet.astro'\nimport Favicons from '@components/head/Favicons.astro'\nimport ThemeToggler from '@layouts/partials/ThemeToggler.astro'\nimport Icons from '@layouts/partials/Icons.astro'\n\ntype Props = ExampleFrontmatter\n\nconst { body_class, direction, extra_css, extra_js, html_class, include_js, title = 'Example' } = Astro.props\n\nconst pageTitle = `${title} · ${getConfig().title} v${getConfig().docs_version}`\nconst canonicalUrl = new URL(Astro.url.pathname, Astro.site)\n\nconst htmlProps: HTMLAttributes<'html'> = direction === 'rtl' ? { lang: 'ar', dir: 'rtl' } : { lang: 'en' }\n---\n\n<!DOCTYPE html>\n<html {...htmlProps} class:list={html_class} data-bs-theme=\"auto\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n    <meta name=\"description\" content=\"\" />\n    <meta name=\"author\" content={getConfig().authors} />\n    <meta name=\"generator\" content={Astro.generator} />\n    <title>{pageTitle}</title>\n\n    <link rel=\"canonical\" href={canonicalUrl} />\n\n    <script is:inline src={getVersionedDocsPath('assets/js/color-modes.js')}></script>\n\n    <Stylesheet direction={direction} layout=\"examples\" />\n    <Favicons />\n\n    <style is:global>\n      .bd-placeholder-img {\n        font-size: 1.125rem;\n        text-anchor: middle;\n        -webkit-user-select: none;\n        -moz-user-select: none;\n        user-select: none;\n      }\n\n      @media (min-width: 768px) {\n        .bd-placeholder-img-lg {\n          font-size: 3.5rem;\n        }\n      }\n\n      .b-example-divider {\n        width: 100%;\n        height: 3rem;\n        background-color: rgba(0, 0, 0, 0.1);\n        border: solid rgba(0, 0, 0, 0.15);\n        border-width: 1px 0;\n        box-shadow: inset 0 0.5em 1.5em rgba(0, 0, 0, 0.1), inset 0 0.125em 0.5em rgba(0, 0, 0, 0.15);\n      }\n\n      .b-example-vr {\n        flex-shrink: 0;\n        width: 1.5rem;\n        height: 100vh;\n      }\n\n      .bi {\n        vertical-align: -0.125em;\n        fill: currentColor;\n      }\n\n      .nav-scroller {\n        position: relative;\n        z-index: 2;\n        height: 2.75rem;\n        overflow-y: hidden;\n      }\n\n      .nav-scroller .nav {\n        display: flex;\n        flex-wrap: nowrap;\n        padding-bottom: 1rem;\n        margin-top: -1px;\n        overflow-x: auto;\n        text-align: center;\n        white-space: nowrap;\n        -webkit-overflow-scrolling: touch;\n      }\n\n      .btn-bd-primary {\n        --bd-violet-bg: #712cf9;\n        --bd-violet-rgb: 112.520718, 44.062154, 249.437846;\n\n        --bs-btn-font-weight: 600;\n        --bs-btn-color: var(--bs-white);\n        --bs-btn-bg: var(--bd-violet-bg);\n        --bs-btn-border-color: var(--bd-violet-bg);\n        --bs-btn-hover-color: var(--bs-white);\n        --bs-btn-hover-bg: #6528e0;\n        --bs-btn-hover-border-color: #6528e0;\n        --bs-btn-focus-shadow-rgb: var(--bd-violet-rgb);\n        --bs-btn-active-color: var(--bs-btn-hover-color);\n        --bs-btn-active-bg: #5a23c8;\n        --bs-btn-active-border-color: #5a23c8;\n      }\n\n      .bd-mode-toggle {\n        z-index: 1500;\n      }\n\n      .bd-mode-toggle .bi {\n        width: 1em;\n        height: 1em;\n      }\n\n      .bd-mode-toggle .dropdown-menu .active .bi {\n        display: block !important;\n      }\n    </style>\n\n    {extra_css?.map((extraCss) => <link href={extraCss} rel=\"stylesheet\" />)}\n  </head>\n  <body class:list={body_class}>\n    <Icons />\n\n    <div class=\"dropdown position-fixed bottom-0 end-0 mb-3 me-3 bd-mode-toggle\">\n      <ThemeToggler layout=\"examples\" />\n    </div>\n\n    <slot />\n\n    {\n      include_js !== false && (\n        <Fragment>\n          <script is:inline {...getVersionedBsJsProps()} />\n          {extra_js?.map((js) => (\n            <script\n              is:inline\n              async={js.async}\n              src={js.src}\n              integrity={js.integrity}\n              {...(js.integrity && { crossorigin: 'anonymous' })}\n            />\n          ))}\n        </Fragment>\n      )\n    }\n  </body>\n</html>\n"
  },
  {
    "path": "site/src/layouts/RedirectLayout.astro",
    "content": "---\nimport { getConfig } from '@libs/config'\n\ninterface Props {\n  path: string\n}\n\nconst { path } = Astro.props\n\nconst url = new URL(path, Astro.site)\n---\n\n<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n    <title>{getConfig().title}</title>\n    <link rel=\"canonical\" href={url} />\n    <meta name=\"robots\" content=\"noindex\" />\n    <meta http-equiv=\"refresh\" content={`0; url=${url}`} />\n  </head>\n</html>\n"
  },
  {
    "path": "site/src/layouts/SingleLayout.astro",
    "content": "---\nimport Ads from '@components/Ads.astro'\nimport BaseLayout from '@layouts/BaseLayout.astro'\n\ninterface Props {\n  description: string\n  title: string\n}\n\nconst { description, title } = Astro.props\n---\n\n<BaseLayout {...Astro.props} layout=\"single\">\n  <Fragment slot=\"main\">\n    <header class=\"py-5 border-bottom\">\n      <div class=\"container-xxl bd-gutter pt-md-1 pb-md-4\">\n        <div class=\"row\">\n          <div class=\"col-xl-8\">\n            <h1 class=\"bd-title mt-0\">{title}</h1>\n            <p class=\"bd-subtitle\">{description}</p>\n            <slot name=\"header-content\" />\n          </div>\n          <div class=\"col-xl-4 d-lg-flex justify-content-xl-end\">\n            <Ads />\n          </div>\n        </div>\n      </div>\n    </header>\n\n    <main class=\"bd-content order-1 py-5\" id=\"content\">\n      <div class=\"container-xxl bd-gutter\">\n        <slot />\n        <slot name=\"main-content\" />\n      </div>\n    </main>\n  </Fragment>\n</BaseLayout>\n"
  },
  {
    "path": "site/src/layouts/partials/ExamplesMain.astro",
    "content": "---\nimport { getVersionedDocsPath } from '@libs/path'\nimport { getConfig } from '@libs/config'\nimport { getData } from '@libs/data'\nimport { getSlug } from '@libs/utils'\n---\n\n{\n  getData('examples').map(({ category, description, examples, external }) => {\n    return (\n      <div class=\"bd-content\">\n        <h2 id={getSlug(category)}>{category}</h2>\n        <p>{description}</p>\n        {category === 'RTL' && (\n          <div class=\"bd-callout bd-callout-warning small\">\n            <p>\n              <strong>RTL is still experimental</strong> and will evolve with feedback. Spotted something or have an\n              improvement to suggest?\n            </p>\n            <p>\n              <a href={`${getConfig().repo}/issues/new/choose`}>Please open an issue.</a>\n            </p>\n          </div>\n        )}\n        <div class=\"row\">\n          {examples.map((example, index) => {\n            if (external) {\n              return (\n                <article class=\"col-md-6 col-lg-4 mb-3 d-flex gap-3\">\n                  <svg class=\"bi fs-5 flex-shrink-0 mt-1\" aria-hidden=\"true\">\n                    <use xlink:href=\"#box-seam\" />\n                  </svg>\n                  <div>\n                    <h3 class=\"h5 mb-1\">\n                      <a\n                        class=\"d-block link-offset-1\"\n                        href={`${getConfig().github_org}${example.url}/`}\n                        target=\"_blank\"\n                        rel=\"noopener\"\n                        id={`starter-${index}`}\n                      >\n                        {example.name}\n                      </a>\n                    </h3>\n                    <p class=\"text-body-secondary\">{example.description}</p>\n                    <p>\n                      <a\n                        class=\"icon-link small link-secondary link-offset-1\"\n                        href={`https://stackblitz.com/github/twbs${example.url}?file=${\n                          example.indexPath ? example.indexPath : 'index.html'\n                        }`}\n                        target=\"_blank\"\n                        rel=\"noopener\"\n                        aria-labelledby={`edit-${index} starter-${index}`}\n                      >\n                        <svg class=\"bi flex-shrink-0\" aria-hidden=\"true\">\n                          <use xlink:href=\"#lightning-charge-fill\" />\n                        </svg>\n                        <span id={`edit-${index}`}>Edit in StackBlitz</span>\n                      </a>\n                    </p>\n                  </div>\n                </article>\n              )\n            }\n\n            return (\n              <article class=\"col-sm-6 col-md-3 mb-3\">\n                <a\n                  class=\"d-block link-offset-1\"\n                  href={`/docs/${getConfig().docs_version}/examples/${getSlug(example.name)}/`}\n                  hreflang={example.name.includes('RTL') ? 'ar' : undefined}\n                >\n                  <img\n                    class=\"img-thumbnail mb-3\"\n                    srcset={`${getVersionedDocsPath(\n                      `/assets/img/examples/${getSlug(example.name)}.png`\n                    )}, ${getVersionedDocsPath(`/assets/img/examples/${getSlug(example.name)}@2x.png`)} 2x`}\n                    src={getVersionedDocsPath(`/assets/img/examples/${getSlug(example.name)}.png`)}\n                    alt=\"\"\n                    width=\"480\"\n                    height=\"300\"\n                    loading=\"lazy\"\n                  />\n                  <h3 class=\"h5 mb-1\">{example.name}</h3>\n                </a>\n                <p class=\"text-body-secondary\">{example.description}</p>\n              </article>\n            )\n          })}\n        </div>\n      </div>\n    )\n  })\n}\n"
  },
  {
    "path": "site/src/layouts/partials/Icons.astro",
    "content": "<svg xmlns=\"http://www.w3.org/2000/svg\" class=\"d-none\">\n  <symbol id=\"check2\" viewBox=\"0 0 16 16\">\n    <path\n      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\"\n    ></path>\n  </symbol>\n  <symbol id=\"circle-half\" viewBox=\"0 0 16 16\">\n    <path d=\"M8 15A7 7 0 1 0 8 1v14zm0 1A8 8 0 1 1 8 0a8 8 0 0 1 0 16z\"></path>\n  </symbol>\n  <symbol id=\"moon-stars-fill\" viewBox=\"0 0 16 16\">\n    <path\n      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\"\n    ></path>\n    <path\n      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\"\n    ></path>\n  </symbol>\n  <symbol id=\"sun-fill\" viewBox=\"0 0 16 16\">\n    <path\n      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\"\n    ></path>\n  </symbol>\n</svg>\n"
  },
  {
    "path": "site/src/layouts/partials/ResponsiveImage.astro",
    "content": "---\n// TODO: This Astro component could be improved to implement the equivalent of Hugo's `imageConfig`\n// and calculate the width and height of the image automatically\n\nimport { getVersionedDocsPath } from '@libs/path'\n\ninterface Props {\n  imgPath: string\n  alt: string\n  classes?: string\n  lazyload?: boolean\n  width?: number\n  height?: number\n}\n\nconst { imgPath, alt, classes = '', lazyload = true, width, height } = Astro.props\n\nconst classNames = ['img-fluid', 'mx-auto', classes].filter(Boolean).join(' ')\n\nconst basePath = getVersionedDocsPath(imgPath.split('/').slice(0, -1).join('/'))\nconst basename = imgPath.split('/').pop()?.split('.')[0] || ''\nconst ext = imgPath.includes('.') ? `.${imgPath.split('.').pop()}` : ''\n\nconst imgPath1x = `${basePath}/${basename}${ext}`\nconst imgPath2x = `${basePath}/${basename}@2x${ext}`\n---\n\n<img\n  class={classNames}\n  srcset={`${imgPath1x}, ${imgPath2x} 2x`}\n  src={imgPath1x}\n  alt={alt}\n  loading={lazyload ? 'lazy' : undefined}\n  width={width}\n  height={height}\n/>\n"
  },
  {
    "path": "site/src/layouts/partials/ThemeToggler.astro",
    "content": "---\nimport type { Layout } from '@libs/layout'\n\ninterface Props {\n  layout: Layout\n}\n\nconst { layout } = Astro.props\n---\n\n<button\n  class=`btn ${layout === 'examples' ? 'btn-bd-primary' : 'btn-link nav-link px-0 px-lg-2'} py-2 dropdown-toggle d-flex align-items-center`\n  id=\"bd-theme\"\n  type=\"button\"\n  aria-expanded=\"false\"\n  data-bs-toggle=\"dropdown\"\n  {...layout !== 'examples' ? { 'data-bs-display': 'static' } : {}}\n  aria-label=\"Toggle theme (auto)\"\n>\n  <svg class=\"bi my-1 theme-icon-active\" aria-hidden=\"true\"><use href=\"#circle-half\"></use></svg>\n  <span class=`${layout === 'examples' ? 'visually-hidden' : 'd-lg-none ms-2'}` id=\"bd-theme-text\">Toggle theme</span>\n</button>\n<ul class=`dropdown-menu dropdown-menu-end${layout === 'examples' ? ' shadow' : ''}` aria-labelledby=\"bd-theme-text\">\n  <li>\n    <button\n      type=\"button\"\n      class=\"dropdown-item d-flex align-items-center\"\n      data-bs-theme-value=\"light\"\n      aria-pressed=\"false\"\n    >\n      <svg class=\"bi me-2 opacity-50\" aria-hidden=\"true\"><use href=\"#sun-fill\"></use></svg>\n      Light\n      <svg class=\"bi ms-auto d-none\" aria-hidden=\"true\"><use href=\"#check2\"></use></svg>\n    </button>\n  </li>\n  <li>\n    <button\n      type=\"button\"\n      class=\"dropdown-item d-flex align-items-center\"\n      data-bs-theme-value=\"dark\"\n      aria-pressed=\"false\"\n    >\n      <svg class=\"bi me-2 opacity-50\" aria-hidden=\"true\"><use href=\"#moon-stars-fill\"></use></svg>\n      Dark\n      <svg class=\"bi ms-auto d-none\" aria-hidden=\"true\"><use href=\"#check2\"></use></svg>\n    </button>\n  </li>\n  <li>\n    <button\n      type=\"button\"\n      class=\"dropdown-item d-flex align-items-center active\"\n      data-bs-theme-value=\"auto\"\n      aria-pressed=\"true\"\n    >\n      <svg class=\"bi me-2 opacity-50\" aria-hidden=\"true\"><use href=\"#circle-half\"></use></svg>\n      Auto\n      <svg class=\"bi ms-auto d-none\" aria-hidden=\"true\"><use href=\"#check2\"></use></svg>\n    </button>\n  </li>\n</ul>\n"
  },
  {
    "path": "site/src/libs/astro.ts",
    "content": "import fs from 'node:fs'\nimport path from 'node:path'\nimport { rehypeHeadingIds } from '@astrojs/markdown-remark'\nimport mdx from '@astrojs/mdx'\nimport sitemap from '@astrojs/sitemap'\nimport type { AstroIntegration } from 'astro'\nimport autoImport from 'astro-auto-import'\nimport type { Element, Text } from 'hast'\nimport rehypeAutolinkHeadings from 'rehype-autolink-headings'\nimport { getConfig } from './config'\nimport { rehypeBsTable } from './rehype'\nimport { remarkBsConfig, remarkBsDocsref } from './remark'\nimport { configurePrism } from './prism'\nimport {\n  docsDirectory,\n  getDocsFsPath,\n  getDocsPublicFsPath,\n  getDocsStaticFsPath,\n  validateVersionedDocsPaths\n} from './path'\n\n// A list of directories in `src/components` that contains components that will be auto imported in all pages for\n// convenience.\n// Note: adding a new component to one of the existing directories requires a restart of the dev server.\nconst autoImportedComponentDirectories = ['shortcodes']\n\n// A list of static file paths that will be aliased to a different path.\nconst staticFileAliases = {\n  '/docs/[version]/assets/img/favicons/apple-touch-icon.png': '/apple-touch-icon.png',\n  '/docs/[version]/assets/img/favicons/favicon.ico': '/favicon.ico'\n}\n\n// A list of pages that will be excluded from the sitemap.\nconst sitemapExcludes = ['/404', '/docs', `/docs/${getConfig().docs_version}`]\n\nconst headingsRangeRegex = new RegExp(`^h[${getConfig().anchors.min}-${getConfig().anchors.max}]$`)\n\nexport function bootstrap(): AstroIntegration[] {\n  const sitemapExcludedUrls = sitemapExcludes.map((url) => `${getConfig().baseURL}${url}/`)\n\n  configurePrism()\n\n  return [\n    bootstrap_auto_import(),\n    {\n      name: 'bootstrap-integration',\n      hooks: {\n        'astro:config:setup': ({ addWatchFile, updateConfig }) => {\n          // Reload the config when the integration is modified.\n          addWatchFile(path.join(getDocsFsPath(), 'src/libs/astro.ts'))\n\n          // Add the remark and rehype plugins.\n          updateConfig({\n            markdown: {\n              rehypePlugins: [\n                rehypeHeadingIds,\n                [\n                  rehypeAutolinkHeadings,\n                  {\n                    behavior: 'append',\n                    content: [{ type: 'text', value: ' ' }],\n                    properties: (element: Element) => ({\n                      class: 'anchor-link',\n                      ariaLabel: `Link to this section: ${(element.children[0] as Text).value}`\n                    }),\n                    test: (element: Element) => element.tagName.match(headingsRangeRegex)\n                  }\n                ],\n                rehypeBsTable\n              ],\n              remarkPlugins: [remarkBsConfig, remarkBsDocsref]\n            }\n          })\n        },\n        'astro:config:done': () => {\n          cleanPublicDirectory()\n          copyBootstrap()\n          copyStatic()\n          aliasStatic()\n        },\n        'astro:build:done': ({ dir }) => {\n          validateVersionedDocsPaths(dir)\n        }\n      }\n    },\n    // https://github.com/withastro/astro/issues/6475\n    mdx() as AstroIntegration,\n    sitemap({\n      filter: (page) => sitemapFilter(page, sitemapExcludedUrls)\n    })\n  ]\n}\n\nfunction bootstrap_auto_import() {\n  const autoImportedComponents: string[] = []\n  const autoImportedComponentDefinitions: string[] = []\n\n  for (const autoImportedComponentDirectory of autoImportedComponentDirectories) {\n    const components = fs.readdirSync(path.join(getDocsFsPath(), 'src/components', autoImportedComponentDirectory), {\n      withFileTypes: true\n    })\n\n    for (const component of components) {\n      if (component.isFile()) {\n        autoImportedComponents.push(\n          `./${path.posix.join(docsDirectory, 'src/components', autoImportedComponentDirectory, component.name)}`\n        )\n\n        if (component.name.endsWith('.astro')) {\n          autoImportedComponentDefinitions.push(\n            `export const ${component.name.replace('.astro', '')}: typeof import('@shortcodes/${\n              component.name\n            }').default`\n          )\n        }\n      }\n    }\n  }\n\n  const autoImportedComponentDefinition = `/**\n * DO NOT EDIT THIS FILE MANUALLY.\n *\n * This file is automatically generated by the Bootstrap Astro Integration.\n * It contains the type definitions for the components that are auto imported in all pages.\n * @see site/src/libs/astro.ts\n */\nexport declare global {\n  ${autoImportedComponentDefinitions.join('\\n  ')}\n}\n`\n\n  fs.writeFileSync(path.join(getDocsFsPath(), 'src/types/auto-import.d.ts'), autoImportedComponentDefinition)\n\n  return autoImport({\n    imports: autoImportedComponents\n  })\n}\n\nfunction cleanPublicDirectory() {\n  fs.rmSync(getDocsPublicFsPath(), { force: true, recursive: true })\n}\n\n// Copy the `dist` folder from the root of the repo containing the latest version of Bootstrap to make it available from\n// the `/docs/${docs_version}/dist` URL.\nfunction copyBootstrap() {\n  const source = path.join(process.cwd(), 'dist')\n  const destination = path.join(getDocsPublicFsPath(), 'docs', getConfig().docs_version, 'dist')\n\n  fs.mkdirSync(destination, { recursive: true })\n  fs.cpSync(source, destination, { recursive: true })\n}\n\n// Copy the content as-is of the `static` folder to make it available from the `/` URL.\n// A folder named `[version]` will automatically be renamed to the current version of the docs extracted from the\n// `config.yml` file.\nfunction copyStatic() {\n  const source = getDocsStaticFsPath()\n  const destination = path.join(getDocsPublicFsPath())\n\n  copyStaticRecursively(source, destination)\n}\n\n// Alias (copy) some static files to different paths.\nfunction aliasStatic() {\n  const source = getDocsStaticFsPath()\n  const destination = path.join(getDocsPublicFsPath())\n\n  for (const [aliasSource, aliasDestination] of Object.entries(staticFileAliases)) {\n    fs.cpSync(path.join(source, aliasSource), path.join(destination, aliasDestination))\n  }\n}\n\n// See `copyStatic()` for more details.\nfunction copyStaticRecursively(source: string, destination: string) {\n  const entries = fs.readdirSync(source, { withFileTypes: true })\n\n  for (const entry of entries) {\n    if (entry.isFile()) {\n      fs.cpSync(path.join(source, entry.name), replacePathVersionPlaceholder(path.join(destination, entry.name)))\n    } else if (entry.isDirectory()) {\n      fs.mkdirSync(replacePathVersionPlaceholder(path.join(destination, entry.name)), { recursive: true })\n\n      copyStaticRecursively(path.join(source, entry.name), path.join(destination, entry.name))\n    }\n  }\n}\n\nfunction replacePathVersionPlaceholder(name: string) {\n  return name.replace('[version]', getConfig().docs_version)\n}\n\nfunction sitemapFilter(page: string, excludedUrls: string[]) {\n  if (excludedUrls.includes(page)) {\n    return false\n  }\n\n  return true\n}\n"
  },
  {
    "path": "site/src/libs/bootstrap.ts",
    "content": "import type { HTMLAttributes } from 'astro/types'\nimport { getConfig } from '@libs/config'\nimport { getVersionedDocsPath } from '@libs/path'\n\nexport function getVersionedBsCssProps(direction: 'rtl' | undefined) {\n  let bsCssLinkHref = '/dist/css/bootstrap'\n\n  if (direction === 'rtl') {\n    bsCssLinkHref = `${bsCssLinkHref}.rtl`\n  }\n\n  if (import.meta.env.PROD) {\n    bsCssLinkHref = `${bsCssLinkHref}.min`\n  }\n\n  bsCssLinkHref = `${bsCssLinkHref}.css`\n\n  const bsCssLinkProps: HTMLAttributes<'link'> = {\n    href: getVersionedDocsPath(bsCssLinkHref),\n    rel: 'stylesheet'\n  }\n\n  if (import.meta.env.PROD) {\n    bsCssLinkProps.integrity = direction === 'rtl' ? getConfig().cdn.css_rtl_hash : getConfig().cdn.css_hash\n  }\n\n  return bsCssLinkProps\n}\n\nexport function getVersionedBsJsProps() {\n  let bsJsScriptSrc = '/dist/js/bootstrap.bundle'\n\n  if (import.meta.env.PROD) {\n    bsJsScriptSrc = `${bsJsScriptSrc}.min`\n  }\n\n  bsJsScriptSrc = `${bsJsScriptSrc}.js`\n\n  const bsJsLinkProps: HTMLAttributes<'script'> = {\n    src: getVersionedDocsPath(bsJsScriptSrc)\n  }\n\n  if (import.meta.env.PROD) {\n    bsJsLinkProps.integrity = getConfig().cdn.js_bundle_hash\n  }\n\n  return bsJsLinkProps\n}\n"
  },
  {
    "path": "site/src/libs/config.ts",
    "content": "import fs from 'node:fs'\nimport yaml from 'js-yaml'\nimport { z } from 'zod'\nimport { zPrefixedVersionSemver, zVersionMajorMinor, zVersionSemver } from './validation'\n\n// The config schema used to validate the config file content and ensure all values required by the site are valid.\nconst configSchema = z.object({\n  algolia: z.object({\n    api_key: z.string(),\n    app_id: z.string(),\n    index_name: z.string()\n  }),\n  analytics: z.object({\n    fathom_site: z.string()\n  }),\n  anchors: z.object({\n    min: z.number(),\n    max: z.number()\n  }),\n  authors: z.string(),\n  baseURL: z.url(),\n  blog: z.url(),\n  cdn: z.object({\n    css: z.url(),\n    css_rtl: z.url(),\n    css_hash: z.string(),\n    css_rtl_hash: z.string(),\n    js: z.url(),\n    js_hash: z.string(),\n    js_bundle: z.url(),\n    js_bundle_hash: z.string(),\n    popper: z.url(),\n    popper_esm: z.url(),\n    popper_hash: z.string()\n  }),\n  current_version: zVersionSemver,\n  current_ruby_version: zVersionSemver,\n  description: z.string(),\n  docs_version: zVersionMajorMinor,\n  docsDir: z.string(),\n  download: z.object({\n    dist: z.url(),\n    dist_examples: z.url(),\n    source: z.url()\n  }),\n  github_org: z.url(),\n  icons: z.url(),\n  opencollective: z.url(),\n  repo: z.url(),\n  rfs_version: zPrefixedVersionSemver,\n  subtitle: z.string(),\n  swag: z.url(),\n  title: z.string(),\n  toc: z.object({\n    min: z.number(),\n    max: z.number()\n  }),\n  x: z.string()\n})\n\nlet config: Config | undefined\n\n// A helper to get the config loaded fom the `config.yml` file. If the config does not match the `configSchema`, an\n// error is thrown to indicate that the config file is invalid and some action is required.\nexport function getConfig(): Config {\n  if (config) {\n    // Returns the config if it has already been loaded.\n    return config\n  }\n\n  try {\n    // Load the config from the `config.yml` file.\n    const rawConfig = yaml.load(fs.readFileSync('./config.yml', 'utf8'))\n\n    // Parse the config using the config schema to validate its content and get back a fully typed config object.\n    config = configSchema.parse(rawConfig)\n\n    return config\n  } catch (error) {\n    if (error instanceof z.ZodError) {\n      console.error('The `config.yml` file content is invalid:', error.issues)\n    }\n\n    throw new Error('Failed to load configuration from `config.yml`', { cause: error })\n  }\n}\n\ntype Config = z.infer<typeof configSchema>\n"
  },
  {
    "path": "site/src/libs/content.ts",
    "content": "import { getCollection, getEntryBySlug } from 'astro:content'\n\nexport const docsPages = await getCollection('docs')\nexport const callouts = await getCollection('callouts')\n\nexport const aliasedDocsPages = await getCollection('docs', ({ data }) => {\n  return data.aliases !== undefined\n})\n\nexport function getCalloutByName(name: string) {\n  return getEntryBySlug('callouts', name)\n}\n"
  },
  {
    "path": "site/src/libs/data.ts",
    "content": "import fs from 'node:fs'\nimport yaml from 'js-yaml'\nimport { z } from 'zod'\nimport {\n  zHexColor,\n  zLanguageCode,\n  zNamedHexColors,\n  zPxSizeOrEmpty,\n  zVersionMajorMinor,\n  zVersionSemver\n} from './validation'\nimport { capitalizeFirstLetter } from './utils'\n\n// An object containing all the data types and their associated schema. The key should match the name of the data file\n// in the `./site/data/` directory.\nconst dataDefinitions = {\n  breakpoints: z\n    .object({\n      breakpoint: z.string(),\n      abbr: z.string(),\n      name: z.string(),\n      'min-width': zPxSizeOrEmpty,\n      container: zPxSizeOrEmpty\n    })\n    .array(),\n  colors: zNamedHexColors(13),\n  'core-team': z\n    .object({\n      name: z.string(),\n      user: z.string()\n    })\n    .array(),\n  'docs-versions': z\n    .object({\n      group: z.string(),\n      baseurl: z.url(),\n      description: z.string(),\n      versions: z.union([zVersionSemver, zVersionMajorMinor]).array()\n    })\n    .array(),\n  examples: z\n    .object({\n      category: z.string(),\n      external: z.boolean().optional(),\n      description: z.string(),\n      examples: z\n        .object({\n          description: z.string(),\n          indexPath: z.string().optional(),\n          name: z.string(),\n          url: z.string().optional()\n        })\n        .array()\n    })\n    .array(),\n  grays: zNamedHexColors(9),\n  icons: z.object({\n    preferred: z\n      .object({\n        name: z.string(),\n        website: z.url()\n      })\n      .array(),\n    more: z\n      .object({\n        name: z.string(),\n        website: z.url()\n      })\n      .array()\n  }),\n  plugins: z\n    .object({\n      description: z.string(),\n      link: z.string().startsWith('components/'),\n      name: z.string()\n    })\n    .array(),\n  sidebar: z\n    .object({\n      title: z.string(),\n      icon: z.string().optional(),\n      icon_color: z.string().optional(),\n      pages: z\n        .object({\n          title: z.string()\n        })\n        .array()\n        .optional()\n    })\n    .array(),\n  'theme-colors': z\n    .object({\n      name: z.string(),\n      hex: zHexColor,\n      contrast_color: z.union([z.literal('dark'), z.literal('white')]).optional()\n    })\n    .array()\n    .transform((val) => {\n      // Add a `title` property to each theme color object being the capitalized version of the `name` property.\n      return val.map((themeColor) => ({ ...themeColor, title: capitalizeFirstLetter(themeColor.name) }))\n    }),\n  translations: z\n    .object({\n      name: z.string(),\n      code: zLanguageCode,\n      description: z.string(),\n      url: z.url()\n    })\n    .array()\n} satisfies Record<string, DataSchema>\n\nlet data = new Map<DataType, z.infer<DataSchema>>()\n\n// A helper to get data loaded fom a yml file in the `./site/data/` directory. If the data does not match its associated\n// schema from `dataDefinitions`, an error is thrown to indicate that the data file is invalid and some action is\n// required.\nexport function getData<TType extends DataType>(type: TType): z.infer<(typeof dataDefinitions)[TType]> {\n  if (data.has(type)) {\n    // Returns the data if it has already been loaded.\n    return data.get(type)\n  }\n\n  const dataPath = `./site/data/${type}.yml`\n\n  try {\n    // Load the data from the yml  file.\n    const rawData = yaml.load(fs.readFileSync(dataPath, 'utf8'))\n\n    // Parse the data using the data schema to validate its content and get back a fully typed data object.\n    const parsedData = dataDefinitions[type].parse(rawData)\n\n    // Cache the data.\n    data.set(type, parsedData)\n\n    return parsedData\n  } catch (error) {\n    if (error instanceof z.ZodError) {\n      console.error(`The \\`${dataPath}\\` file content is invalid:`, error.issues)\n    }\n\n    throw new Error(`Failed to load data from \\`${dataPath}\\``, { cause: error })\n  }\n}\n\ntype DataType = keyof typeof dataDefinitions\ntype DataSchema = z.ZodTypeAny\n"
  },
  {
    "path": "site/src/libs/examples.ts",
    "content": "import type { AstroInstance } from 'astro'\nimport fs from 'node:fs'\nimport path from 'node:path'\nimport { z } from 'zod'\nimport { getDocsFsPath } from './path'\n\nexport const exampleFrontmatterSchema = z.object({\n  body_class: z.string().optional(),\n  direction: z.literal('rtl').optional(),\n  extra_css: z.string().array().optional(),\n  extra_js: z\n    .object({\n      async: z.boolean().optional(),\n      integrity: z.string().optional(),\n      src: z.string()\n    })\n    .array()\n    .optional(),\n  html_class: z.string().optional(),\n  include_js: z.boolean().optional(),\n  title: z.string()\n})\n\nexport type ExampleFrontmatter = z.infer<typeof exampleFrontmatterSchema>\n\nexport function getExamplesAssets() {\n  const source = path.join(getDocsFsPath(), 'src/assets/examples')\n\n  return getExamplesAssetsRecursively(source)\n}\n\nexport function getAliasedExamplesPages(pages: AstroInstance[]) {\n  return pages.filter(isAliasedAstroInstance)\n}\n\nexport function getExampleNameFromPagePath(examplePath: string) {\n  const matches = examplePath.match(/([^/]+)\\/(?:[^/]+)\\.astro$/)\n\n  if (!matches || !matches[1]) {\n    throw new Error(`Failed to get example name from path: '${examplePath}'.`)\n  }\n\n  return matches[1]\n}\n\nfunction getExamplesAssetsRecursively(source: string, assets: string[] = []) {\n  const entries = fs.readdirSync(source, { withFileTypes: true })\n\n  for (const entry of entries) {\n    if (entry.isFile() && !entry.name.endsWith('.astro')) {\n      assets.push(sanitizeAssetPath(path.join(source, entry.name)))\n    } else if (entry.isDirectory()) {\n      getExamplesAssetsRecursively(path.join(source, entry.name), assets)\n    }\n  }\n\n  return assets\n}\n\nfunction sanitizeAssetPath(assetPath: string) {\n  const matches = assetPath.match(/([^\\/\\\\]+[\\/\\\\][^\\/\\\\]+\\.\\w+)$/)\n\n  if (!matches || !matches[1]) {\n    throw new Error(`Failed to get example asset path from path: '${assetPath}'.`)\n  }\n\n  return matches[1].replaceAll('\\\\', '/')\n}\n\nfunction isAliasedAstroInstance(page: AstroInstance): page is AliasedAstroInstance {\n  return (page as AliasedAstroInstance).aliases !== undefined\n}\n\ntype AliasedAstroInstance = AstroInstance & { aliases: string | string[] }\n"
  },
  {
    "path": "site/src/libs/icon.ts",
    "content": "export interface SvgIconProps {\n  class?: string\n  height: number\n  width: number\n}\n"
  },
  {
    "path": "site/src/libs/image.ts",
    "content": "import path from 'node:path'\nimport { promises as fs } from 'node:fs'\nimport sizeOf from 'image-size'\nimport { getDocsStaticFsPath } from './path'\n\nexport async function getStaticImageSize(imagePath: string) {\n  const fullPath = path.join(getDocsStaticFsPath(), imagePath)\n  const buffer = await fs.readFile(fullPath)\n  const size = await sizeOf(buffer)\n\n  if (!size?.height || !size?.width) {\n    throw new Error(`Failed to get size of static image at '${imagePath}'.`)\n  }\n\n  return { height: size.height, width: size.width }\n}\n"
  },
  {
    "path": "site/src/libs/layout.ts",
    "content": "import type { HTMLAttributes, HTMLTag } from 'astro/types'\n\nexport type Layout = 'docs' | 'examples' | 'single' | undefined\n\nexport type LayoutOverridesHTMLAttributes<TTag extends HTMLTag> = HTMLAttributes<TTag> & {\n  [key in `data-${string}`]: string\n}\n"
  },
  {
    "path": "site/src/libs/path.ts",
    "content": "import fs from 'node:fs'\nimport path from 'node:path'\nimport { getConfig } from './config'\nimport { fileURLToPath } from 'node:url'\n\n// The docs directory path relative to the root of the project.\nexport const docsDirectory = getConfig().docsDir\n\n// A list of all the docs paths that were generated during a build.\nconst generatedVersionedDocsPaths: string[] = []\n\nexport function getVersionedDocsPath(docsPath: string): string {\n  const { docs_version } = getConfig()\n\n  const sanitizedDocsPath = docsPath.replace(/^\\//, '')\n\n  if (import.meta.env.PROD) {\n    generatedVersionedDocsPaths.push(sanitizedDocsPath)\n  }\n\n  return `/docs/${docs_version}/${sanitizedDocsPath}`\n}\n\n// Validate that all the generated versioned docs paths point to an existing page or asset.\n// This is useful to catch typos in docs paths.\n// Note: this function is only called during a production build.\n// Note: this could at some point be refactored to use Astro list of generated `routes` accessible in the\n// `astro:build:done` integration hook. Although as of 03/14/2023, this is not possible due to the route's data only\n// containing information regarding the last page generated page for dynamic routes.\n// @see https://github.com/withastro/astro/issues/5802\nexport function validateVersionedDocsPaths(distUrl: URL) {\n  const { docs_version } = getConfig()\n\n  for (const docsPath of generatedVersionedDocsPaths) {\n    const sanitizedDocsPath = sanitizeVersionedDocsPathForValidation(docsPath)\n    const absoluteDocsPath = fileURLToPath(new URL(path.join('./docs', docs_version, sanitizedDocsPath), distUrl))\n\n    const docsPathExists = fs.existsSync(absoluteDocsPath)\n\n    if (!docsPathExists) {\n      throw new Error(`A versioned docs path was generated but does not point to a valid page or asset: '${docsPath}'.`)\n    }\n  }\n}\n\nexport function getDocsRelativePath(docsPath: string) {\n  return path.join(docsDirectory, docsPath)\n}\n\nexport function getDocsStaticFsPath() {\n  return path.join(getDocsFsPath(), 'static')\n}\n\nexport function getDocsPublicFsPath() {\n  return path.join(getDocsFsPath(), 'public')\n}\n\nexport function getDocsFsPath() {\n  return path.join(process.cwd(), docsDirectory)\n}\n\nfunction sanitizeVersionedDocsPathForValidation(docsPath: string) {\n  // Remove the hash part of the path if any.\n  let sanitizedDocsPath = docsPath.split('#')[0]\n\n  // Append the `index.html` part if the path doesn't have an extension.\n  if (!sanitizedDocsPath.includes('.')) {\n    sanitizedDocsPath = path.join(sanitizedDocsPath, 'index.html')\n  }\n\n  return sanitizedDocsPath\n}\n"
  },
  {
    "path": "site/src/libs/placeholder.ts",
    "content": "import type { HTMLAttributes } from 'astro/types'\nimport * as htmlparser2 from 'htmlparser2'\nimport { getData } from './data'\n\nconst placeholderRegex = /<Placeholder\\s+([^>]+)\\/>/g\n\n/**\n * Generates all the placeholder attributes and options required to render a placeholder.\n * @see src/components/shortcodes/Placeholder.astro\n */\nexport function getPlaceholder(userOptions: Partial<PlaceholderOptions>): Placeholder {\n  const options = getOptionsWithDefaults(userOptions)\n  const { class: className, height, markup, text, title, width } = options\n\n  const showText = text !== false\n  const showTitle = title !== false\n\n  const placeholderClassList = ['bd-placeholder-img', className].join(' ')\n  const placeholderRole = showTitle || showText ? 'img' : undefined\n  const placeholderAriaHidden = !showText && !showTitle ? 'true' : undefined\n\n  const placeholderLabel =\n    showText || showTitle\n      ? `${showTitle ? title : ''}${showTitle && showText ? ': ' : ''}${showText ? text : ''}`\n      : undefined\n\n  const optionsWithVisibilities = { ...options, showText, showTitle }\n\n  if (markup === 'img') {\n    return {\n      type: 'img',\n      options: optionsWithVisibilities,\n      props: {\n        alt: placeholderLabel,\n        class: placeholderClassList,\n        height,\n        src: getPlaceholderSrc(showTitle, showText, options),\n        width\n      }\n    }\n  }\n\n  return {\n    type: 'svg',\n    options: optionsWithVisibilities,\n    props: {\n      'aria-hidden': placeholderAriaHidden,\n      'aria-label': placeholderLabel,\n      class: placeholderClassList,\n      height,\n      preserveAspectRatio: 'xMidYMid slice',\n      role: placeholderRole,\n      width,\n      xmlns: 'http://www.w3.org/2000/svg'\n    }\n  }\n}\n\n/**\n * Replaces placeholders described using the `<Placeholder />` component in HTML markup with the expected HTML content.\n * This is useful to render examples that have a pretty large set of constraints:\n *\n *  - The provided HTML code is not valid MDX (e.g. unclosed void elements like <img>) but can contain the\n *      `<Placeholder />` Astro component. This means that we cannot use an Astro slot for example that requires valid\n *      MDX.\n *  - The provided HTML code cannot be parsed in a forgiving way with XML mode enabled (to not lose the structure due\n *      to self-closing MDX or Astro components) and serialized back to a string while closing all known void elements\n *      in order to render it as MDX using `@mdx-js/mdx` & `astro/jsx-runtime`. This works perfectly (tested) but the\n *      DOM needs to contains the exact same HTML markup (even indentation) provided to the example as it is used on the\n *      client to send the example to StackBlitz with the same indentation as the original example.\n *\n * If you are not sure if you need to use this function, you probably don't.\n */\nexport function replacePlaceholdersInHtml(html: string) {\n  return html.replace(placeholderRegex, (match) => {\n    const document = htmlparser2.parseDocument(match, { xmlMode: true })\n    const placeholderElement = document.firstChild\n\n    if (\n      document.children.length > 1 ||\n      !placeholderElement ||\n      placeholderElement.type !== htmlparser2.ElementType.Tag ||\n      placeholderElement.name !== 'Placeholder'\n    ) {\n      throw new Error('Invalid placeholder element.')\n    }\n\n    const placeholder = getPlaceholder(sanitizeHtmlAttributesFromMdx(placeholderElement.attribs))\n\n    return renderPlaceholderToString(placeholder)\n  })\n}\n\nfunction renderPlaceholderToString(placeholder: Placeholder) {\n  let placeholderStr = `<${placeholder.type}`\n\n  for (const [key, value] of Object.entries(placeholder.props)) {\n    if (value === undefined) {\n      continue\n    }\n\n    placeholderStr = `${placeholderStr} ${key}=\"${value}\"`\n  }\n\n  if (placeholder.type === 'img') {\n    return `${placeholderStr} />`\n  }\n\n  placeholderStr = `${placeholderStr}>`\n\n  if (placeholder.options.showTitle) {\n    placeholderStr = `${placeholderStr}<title>${placeholder.options.title}</title>`\n  }\n\n  placeholderStr = `${placeholderStr}<rect width=\"100%\" height=\"100%\" fill=\"${placeholder.options.background}\" />`\n\n  if (placeholder.options.showText) {\n    placeholderStr = `${placeholderStr}<text x=\"50%\" y=\"50%\" fill=\"${placeholder.options.color}\" dy=\".3em\">${placeholder.options.text}</text>`\n  }\n\n  return `${placeholderStr}</${placeholder.type}>`\n}\n\nfunction getOptionsWithDefaults(options: Partial<PlaceholderOptions>) {\n  const optionsWithDefaults = Object.assign(\n    {},\n    {\n      background: getData('grays')[5].hex,\n      color: getData('grays')[2].hex,\n      height: '180',\n      markup: 'svg',\n      title: 'Placeholder',\n      width: '100%'\n    },\n    options\n  )\n\n  if (optionsWithDefaults.text === undefined) {\n    optionsWithDefaults.text = `${optionsWithDefaults.width}x${optionsWithDefaults.height}`\n  }\n\n  return optionsWithDefaults as PlaceholderOptions\n}\n\nfunction getPlaceholderSrc(\n  showTitle: boolean,\n  showText: boolean,\n  { background, color, text, title }: PlaceholderOptions\n) {\n  // Sanitize the background and text colors by removing the leading hash if any.\n  const bgColor = background.replace(/^#/, '')\n  const textColor = color.replace(/^#/, '')\n\n  // Build the raw SVG string first\n  let svg = `<svg style='font-size: 1.125rem; font-family:system-ui,-apple-system,\"Segoe UI\",Roboto,\"Helvetica Neue\",\"Noto Sans\",\"Liberation Sans\",Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",\"Segoe UI Symbol\",\"Noto Color Emoji\"; -webkit-user-select: none; -moz-user-select: none; user-select: none; text-anchor: middle;' width='200' height='200' xmlns='http://www.w3.org/2000/svg'>`\n\n  if (showTitle) {\n    svg += `<title>${title}</title>`\n  }\n\n  svg += `<rect width='100%' height='100%' fill='#${bgColor}'></rect>`\n\n  if (showText) {\n    svg += `<text x='50%' y='50%' fill='#${textColor}' dy='.3em'>${text}</text>`\n  }\n\n  svg += `</svg>`\n\n  const encodedSvg = encodeURIComponent(svg)\n\n  return `data:image/svg+xml,${encodedSvg}`\n}\n\nfunction sanitizeHtmlAttributesFromMdx(attributes: Record<string, unknown>) {\n  const sanitizedAttributes: typeof attributes = {}\n\n  for (const [key, value] of Object.entries(attributes)) {\n    if (value === undefined) {\n      continue\n    } else if (value === '{false}') {\n      sanitizedAttributes[key] = false\n    } else if (value === '{true}') {\n      sanitizedAttributes[key] = true\n    } else {\n      sanitizedAttributes[key] = value\n    }\n  }\n\n  return sanitizedAttributes\n}\n\nexport interface PlaceholderOptions {\n  /**\n   * The SVG background color.\n   * @default \"#868e96\"\n   */\n  background: string\n  /**\n   * CSS classes to append to `bd-placeholder-img` for the `svg` or `img` elements.\n   */\n  class?: string\n  /**\n   * The text color (foreground).\n   * @default \"#dee2e6\"\n   */\n  color: string\n  /**\n   * The placeholder height.\n   * @default \"180\"\n   */\n  height: string\n  /**\n   * If it should render `svg` or `img` tags.\n   * @default \"svg\"\n   */\n  markup: 'img' | 'svg'\n  /**\n   * The text to show in the image. You can explicitly pass the `false` boolean value (and not the string \"false\") to\n   * hide the text.\n   * @default \"${width}x{$height)\"\n   */\n  text: string | false\n  /**\n   * Used in the SVG `title` tag. You can explicitly pass the `false` boolean value (and not the string \"false\") to\n   * hide the title.\n   * @default \"Placeholder\"\n   */\n  title: string | false\n  /**\n   * The placeholder width.\n   * @default \"100%\"\n   */\n  width: string\n}\n\ninterface PlaceholderVisibilities {\n  showText: boolean\n  showTitle: boolean\n}\n\ntype Placeholder =\n  | {\n      type: 'img'\n      options: PlaceholderOptions & PlaceholderVisibilities\n      props: HTMLAttributes<'img'>\n    }\n  | {\n      type: 'svg'\n      options: PlaceholderOptions & PlaceholderVisibilities\n      props: HTMLAttributes<'svg'>\n    }\n"
  },
  {
    "path": "site/src/libs/prism.ts",
    "content": "import Prism, { type hooks } from 'prismjs'\nconst { Token } = Prism\n\nlet isPrismConfigured = false\n\nexport function configurePrism() {\n  if (isPrismConfigured) {\n    return\n  }\n\n  isPrismConfigured = true\n\n  Prism.hooks.add('after-tokenize', lineWrapPlugin)\n}\n\n// A plugin to wrap each line in a .line span, except for comments and empty lines\nfunction lineWrapPlugin(env: hooks.HookEnvironmentMap['after-tokenize']) {\n  // Skip processing if the language isn't one we want to modify\n  if (env.language !== 'bash' && env.language !== 'sh' && env.language !== 'powershell') {\n    return\n  }\n\n  // First, split tokens into lines\n  const lines: (string | Prism.Token)[][] = [[]]\n\n  for (let i = 0; i < env.tokens.length; i++) {\n    const token = env.tokens[i]\n\n    if (typeof token === 'string') {\n      // Split string tokens by newlines\n      const parts = token.split('\\n')\n\n      for (let j = 0; j < parts.length; j++) {\n        if (j > 0) {\n          // Start a new line after each newline\n          lines.push([])\n        }\n\n        if (parts[j]) {\n          lines[lines.length - 1].push(parts[j])\n        }\n      }\n    } else {\n      lines[lines.length - 1].push(token)\n    }\n  }\n\n  // Now rebuild tokens with the line structure\n  env.tokens = []\n\n  for (let i = 0; i < lines.length; i++) {\n    const line = lines[i]\n\n    // Check if this is an empty line\n    const isEmptyLine = line.length === 0 || (line.length === 1 && typeof line[0] === 'string' && line[0].trim() === '')\n\n    // Check if this is a comment-only line\n    const isCommentLine = line.every((token) => {\n      if (typeof token === 'string') {\n        return token.trim() === ''\n      }\n      return token.type === 'comment'\n    })\n\n    if (isEmptyLine || isCommentLine) {\n      // For comment or empty lines, just add the tokens without a wrapper\n      env.tokens.push(...line)\n\n      // Add a newline after each line (except the last)\n      if (i < lines.length - 1) {\n        env.tokens.push('\\n')\n      }\n    } else {\n      // For normal lines, wrap with .line class\n      const lineToken = new Token('span', '', ['line'])\n      const lineChildren: (string | Prism.Token)[] = []\n\n      // Add the line content\n      lineChildren.push(...line)\n\n      // For the last token in the line, append a newline\n      if (i < lines.length - 1) {\n        lineChildren.push('\\n')\n      }\n\n      // Set line content\n      lineToken.content = lineChildren\n\n      // Add the entire structure to tokens\n      env.tokens.push(lineToken)\n    }\n  }\n}\n"
  },
  {
    "path": "site/src/libs/rehype.ts",
    "content": "import type { Root } from 'hast'\nimport type { Plugin } from 'unified'\nimport { SKIP, visit } from 'unist-util-visit'\n\n// A rehype plugin to apply CSS classes to tables rendered in markdown (or MDX) files when wrapped in a `<BsTable />`\n// component.\nexport const rehypeBsTable: Plugin<[], Root> = function () {\n  return function rehypeBsTablePlugin(ast) {\n    visit(ast, 'element', (node, _index, parent) => {\n      if (node.tagName !== 'table' || parent?.type !== 'mdxJsxFlowElement' || parent.name !== 'BsTable') {\n        return SKIP\n      }\n\n      const classAttribute = parent.attributes.find(\n        (attribute) => attribute.type === 'mdxJsxAttribute' && attribute.name === 'class'\n      )\n\n      if (classAttribute && typeof classAttribute.value !== 'string') {\n        return SKIP\n      }\n\n      const tableClass = typeof classAttribute?.value === 'string' ? classAttribute.value : 'table'\n\n      if (!node.properties) {\n        node.properties = {}\n      }\n\n      node.properties = {\n        ...node.properties,\n        class: tableClass\n      }\n    })\n  }\n}\n"
  },
  {
    "path": "site/src/libs/remark.ts",
    "content": "import type { Root } from 'mdast'\nimport type { MdxJsxAttribute, MdxJsxExpressionAttribute } from 'mdast-util-mdx-jsx'\nimport type { Plugin } from 'unified'\nimport { visit } from 'unist-util-visit'\nimport { getConfig } from './config'\nimport { getVersionedDocsPath } from './path'\n\n// [[config:foo]]\n// [[config:foo.bar]]\nconst configRegExp = /\\[\\[config:(?<name>[\\w\\.]+)]]/g\n// [[docsref:/foo]]\n// [[docsref:/foo/bar#baz]]\nconst docsrefRegExp = /\\[\\[docsref:(?<path>[\\w\\.\\/#-]+)]]/g\n\n// A remark plugin to replace config values embedded in markdown (or MDX) files.\n// For example, [[config:foo]] will be replaced with the value of the `foo` key in the `config.yml` file.\n// Nested values are also supported, e.g. [[config:foo.bar]].\n// Note: this also works in frontmatter.\n// Note: this plugin is meant to facilitate the migration from Hugo to Astro while keeping the differences to a minimum.\n// At some point, this plugin should maybe be removed and embrace a more MDX-friendly syntax.\nexport const remarkBsConfig: Plugin<[], Root> = function () {\n  return function remarkBsConfigPlugin(ast, file) {\n    if (containsFrontmatter(file.data.astro)) {\n      replaceInFrontmatter(file.data.astro.frontmatter, replaceConfigInText)\n    }\n\n    // https://github.com/syntax-tree/mdast#nodes\n    // https://github.com/syntax-tree/mdast-util-mdx-jsx#nodes\n    visit(ast, ['code', 'definition', 'image', 'inlineCode', 'link', 'mdxJsxFlowElement', 'text'], (node) => {\n      switch (node.type) {\n        case 'code':\n        case 'inlineCode':\n        case 'text': {\n          node.value = replaceConfigInText(node.value)\n          break\n        }\n        case 'image': {\n          if (node.alt) {\n            node.alt = replaceConfigInText(node.alt)\n          }\n\n          node.url = replaceConfigInText(node.url)\n          break\n        }\n        case 'definition':\n        case 'link': {\n          node.url = replaceConfigInText(node.url)\n          break\n        }\n        case 'mdxJsxFlowElement': {\n          node.attributes = replaceConfigInAttributes(node.attributes)\n          break\n        }\n      }\n    })\n  }\n}\n\n// A remark plugin to add versioned docs links in markdown (or MDX) files.\n// For example, [[docsref:/foo]] will be replaced with the `/docs/${docs_version}/foo` value with the `docs_version`\n// value being read from the `config.yml` file.\n// Note: this also works in frontmatter.\n// Note: this plugin is meant to facilitate the migration from Hugo to Astro while keeping the differences to a minimum.\n// At some point, this plugin should maybe be removed and embrace a more MDX-friendly syntax.\nexport const remarkBsDocsref: Plugin<[], Root> = function () {\n  return function remarkBsDocsrefPlugin(ast, file) {\n    if (containsFrontmatter(file.data.astro)) {\n      replaceInFrontmatter(file.data.astro.frontmatter, replaceDocsrefInText)\n    }\n\n    // https://github.com/syntax-tree/mdast#nodes\n    // https://github.com/syntax-tree/mdast-util-mdx-jsx#nodes\n    visit(ast, ['definition', 'link', 'mdxJsxTextElement'], (node) => {\n      switch (node.type) {\n        case 'definition':\n        case 'link': {\n          node.url = replaceDocsrefInText(node.url)\n          break\n        }\n        case 'mdxJsxTextElement': {\n          node.attributes = replaceDocsrefInAttributes(node.attributes)\n          break\n        }\n      }\n    })\n  }\n}\n\nexport function replaceConfigInText(text: string) {\n  return text.replace(configRegExp, (_match, path) => {\n    const value = getConfigValueAtPath(path)\n\n    if (!value) {\n      throw new Error(`Failed to find a valid configuration value for '${path}'.`)\n    }\n\n    return value\n  })\n}\n\nfunction replaceConfigInAttributes(attributes: (MdxJsxAttribute | MdxJsxExpressionAttribute)[]) {\n  return attributes.map((attribute) => {\n    if (attribute.type === 'mdxJsxAttribute' && typeof attribute.value === 'string') {\n      attribute.value = replaceConfigInText(attribute.value)\n    }\n\n    return attribute\n  })\n}\n\nfunction replaceDocsrefInText(text: string) {\n  return text.replace(docsrefRegExp, (_match, path) => {\n    return getVersionedDocsPath(path)\n  })\n}\n\nfunction replaceDocsrefInAttributes(attributes: (MdxJsxAttribute | MdxJsxExpressionAttribute)[]) {\n  return attributes.map((attribute) => {\n    if (attribute.type === 'mdxJsxAttribute' && typeof attribute.value === 'string') {\n      attribute.value = replaceDocsrefInText(attribute.value)\n    }\n\n    return attribute\n  })\n}\n\nfunction getConfigValueAtPath(path: string) {\n  const config = getConfig()\n\n  const value = path.split('.').reduce((values, part) => {\n    if (!values || typeof values !== 'object') {\n      return undefined\n    }\n\n    return (values as any)?.[part]\n  }, config as unknown)\n\n  return typeof value === 'string' ? value : undefined\n}\n\nfunction replaceInFrontmatter(record: Record<string, unknown>, replacer: (value: string) => string) {\n  for (const [key, value] of Object.entries(record)) {\n    if (typeof value === 'string') {\n      record[key] = replacer(value)\n    } else if (Array.isArray(value)) {\n      record[key] = value.map((arrayValue) => {\n        return typeof arrayValue === 'string'\n          ? replacer(arrayValue)\n          : typeof arrayValue === 'object'\n            ? replaceInFrontmatter(arrayValue, replacer)\n            : arrayValue\n      })\n    }\n  }\n\n  return record\n}\n\nfunction containsFrontmatter(data: unknown): data is { frontmatter: Record<string, unknown> } {\n  return data != undefined && typeof data === 'object' && 'frontmatter' in data\n}\n"
  },
  {
    "path": "site/src/libs/toc.ts",
    "content": "import type { MarkdownHeading } from 'astro'\nimport { getConfig } from './config'\n\n// Generate a tree like structure from a list of headings.\nexport function generateToc(allHeadings: MarkdownHeading[]) {\n  const headings = allHeadings.filter(\n    (heading) => heading.depth >= getConfig().toc.min && heading.depth <= getConfig().toc.max\n  )\n\n  const toc: TocEntry[] = []\n\n  for (const heading of headings) {\n    if (toc.length === 0) {\n      toc.push({ ...heading, children: [] })\n      continue\n    }\n\n    const previousEntry = toc[toc.length - 1]\n\n    if (heading.depth === previousEntry.depth) {\n      toc.push({ ...heading, children: [] })\n      continue\n    }\n\n    const children = getEntryChildrenAtDepth(previousEntry, heading.depth - previousEntry.depth)\n    children.push({ ...heading, children: [] })\n  }\n\n  return toc\n}\n\nfunction getEntryChildrenAtDepth(entry: TocEntry, depth: number): TocEntry['children'] {\n  if (!entry) {\n    return []\n  }\n\n  return depth === 1 ? entry.children : getEntryChildrenAtDepth(entry.children[entry.children.length - 1], depth - 1)\n}\n\nexport interface TocEntry extends MarkdownHeading {\n  children: TocEntry[]\n}\n"
  },
  {
    "path": "site/src/libs/utils.ts",
    "content": "import { slug } from 'github-slugger'\nimport fromMarkdown from 'mdast-util-from-markdown'\nimport toString from 'mdast-util-to-string'\nimport { remark } from 'remark'\nimport remarkHtml from 'remark-html'\n\nexport function capitalizeFirstLetter(str: string) {\n  return str.charAt(0).toUpperCase() + str.slice(1)\n}\n\nexport function getSequence(start: number, end: number, step = 1) {\n  const sequence = []\n\n  for (let i = start; i <= end; i += step) {\n    sequence.push(i)\n  }\n\n  return sequence\n}\n\n// This function is used in the docs sidebar to generate partial slugs and properly order the sidebar entries and also\n// to generate docs frontmatter sections slugs.\n// Note: this should be refactored and removed, the sidebar ordering defined in `site/data/sidebar.yml` should not rely\n// on slugified custom titles that are expected to generate a string matching the actual file names on disk, this is\n// error prone. Instead, custom sidebar titles should be defined in the frontmatter of the MDX files when needed and\n// `site/data/sidebar.yml` should only reference the actual file names and slug extracted from the docs content\n// collection. Same goes for the docs frontmatter sections.\nexport function getSlug(str: string) {\n  return slug(str).replace(/--+/g, '-')\n}\n\nexport function trimLeadingAndTrailingSlashes(str: string) {\n  return str.replace(/^\\/+|\\/+$/g, '')\n}\n\nexport function stripMarkdown(str: string) {\n  return toString(fromMarkdown(str))\n}\n\nexport function processMarkdownToHtml(markdown: string): string {\n  // Use remark to process markdown to HTML\n  const result = remark().use(remarkHtml).processSync(markdown)\n  return result.toString()\n}\n"
  },
  {
    "path": "site/src/libs/validation.ts",
    "content": "import { z } from 'zod'\n\nexport const zVersionMajorMinor = z.string().regex(/^\\d+\\.\\d+$/)\n\n// https://ihateregex.io/expr/semver/\nconst unboundSemverRegex =\n  /(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?/\n\nexport const zVersionSemver = z.string().regex(new RegExp(`^${unboundSemverRegex.source}$`))\nexport const zPrefixedVersionSemver = z.string().regex(new RegExp(`^v${unboundSemverRegex.source}$`))\n\nexport const zHexColor = z.string().regex(/^#(?:[0-9a-fA-F]{3}){1,2}$/)\n\nexport const zNamedHexColors = (count: number) => {\n  return z\n    .object({\n      name: z.union([z.string(), z.number()]),\n      hex: zHexColor\n    })\n    .array()\n    .length(count)\n}\n\nexport const zPxSizeOrEmpty = z.string().regex(/^(?:\\d+px)?$/)\n\nexport const zLanguageCode = z.string().regex(/^[a-z]{2}(?:-[a-zA-Z]{2})?$/)\n"
  },
  {
    "path": "site/src/pages/404.astro",
    "content": "---\nimport BaseLayout from '@layouts/BaseLayout.astro'\n---\n\n<BaseLayout\n  overrides={{\n    body: { class: 'd-flex flex-column min-vh-100' },\n    main: { class: 'my-auto p-5', id: 'content' }\n  }}\n  robots=\"noindex,follow\"\n  title=\"404 - File not found\"\n>\n  <div class=\"text-center py-5\">\n    <h1 class=\"display-1\">404</h1>\n    <h2>File not found</h2>\n  </div>\n</BaseLayout>\n"
  },
  {
    "path": "site/src/pages/[...alias].astro",
    "content": "---\nimport type { InferGetStaticPropsType } from 'astro'\nimport RedirectLayout from '@layouts/RedirectLayout.astro'\nimport { getVersionedDocsPath } from '@libs/path'\nimport { trimLeadingAndTrailingSlashes } from '@libs/utils'\nimport { replaceConfigInText } from '@libs/remark'\nimport { aliasedDocsPages } from '@libs/content'\nimport { getAliasedExamplesPages, getExampleNameFromPagePath } from '@libs/examples'\n\nexport async function getStaticPaths() {\n  function normalizeAliases(aliases: string | string[] | undefined): string[] {\n    return aliases ? (Array.isArray(aliases) ? aliases : [aliases]) : []\n  }\n\n  function getAliasStaticPath(alias: string, path: string) {\n    return { params: { alias: trimLeadingAndTrailingSlashes(replaceConfigInText(alias)) }, props: { path } }\n  }\n\n  const staticPaths = []\n\n  const examplesPageModules = import.meta.glob('../assets/examples/**/*.astro', { eager: true })\n  const examplesPages = Object.entries(examplesPageModules).map(([file, module]) => {\n    return {\n      file,\n      ...module\n    }\n  })\n  const aliasedExamplesPages = getAliasedExamplesPages(examplesPages)\n\n  // Generate static paths for all examples pages with aliases.\n  for (const aliasedExamplesPage of aliasedExamplesPages) {\n    const aliases = normalizeAliases(aliasedExamplesPage.aliases)\n\n    for (const alias of aliases) {\n      staticPaths.push(getAliasStaticPath(alias, `/examples/${getExampleNameFromPagePath(aliasedExamplesPage.file)}`))\n    }\n  }\n\n  // Generate static paths for all docs pages with aliases.\n  for (const aliasedDocsPage of aliasedDocsPages) {\n    const aliases = normalizeAliases(aliasedDocsPage.data.aliases)\n\n    for (const alias of aliases) {\n      staticPaths.push(getAliasStaticPath(alias, aliasedDocsPage.slug))\n    }\n  }\n\n  return staticPaths.flat()\n}\n\ntype Props = InferGetStaticPropsType<typeof getStaticPaths>\n\nconst { path } = Astro.props\n---\n\n<RedirectLayout path={getVersionedDocsPath(path)} />\n"
  },
  {
    "path": "site/src/pages/docs/[version]/[...slug].astro",
    "content": "---\nimport type { InferGetStaticPropsType } from 'astro'\nimport DocsLayout from '@layouts/DocsLayout.astro'\nimport { getConfig } from '@libs/config'\nimport { docsPages } from '@libs/content'\nimport Code from '@shortcodes/Code.astro'\n\nexport async function getStaticPaths() {\n  return docsPages.map((docsPage) => {\n    return {\n      params: { slug: docsPage.slug, version: getConfig().docs_version },\n      props: docsPage\n    }\n  })\n}\n\ntype Props = InferGetStaticPropsType<typeof getStaticPaths>\n\nconst { id, data, render } = Astro.props\nconst { Content, headings, remarkPluginFrontmatter } = await render()\n---\n\n<DocsLayout frontmatter={remarkPluginFrontmatter as typeof data} headings={headings} id={id}>\n  <Content components={{ pre: Code }} />\n</DocsLayout>\n"
  },
  {
    "path": "site/src/pages/docs/[version]/examples/[...asset].ts",
    "content": "import fs from 'node:fs'\nimport path from 'node:path'\nimport type { APIRoute } from 'astro'\nimport mime from 'mime'\nimport { getConfig } from '@libs/config'\nimport { getExamplesAssets } from '@libs/examples'\nimport { getDocsFsPath } from '@libs/path'\n\nexport function getStaticPaths() {\n  const examplesAssets = getExamplesAssets()\n\n  return examplesAssets.map((examplesAsset) => {\n    return {\n      params: { asset: examplesAsset, version: getConfig().docs_version }\n    }\n  })\n}\n\nexport const GET: APIRoute = ({ params }) => {\n  const asset = params.asset\n\n  if (!asset) {\n    throw new Error('Missing asset parameter while generating an example asset.')\n  }\n\n  const assetPath = path.join(getDocsFsPath(), 'src/assets/examples', asset)\n  const buffer = fs.readFileSync(assetPath)\n  const mimetype = mime.getType(assetPath)\n  const headers: ResponseInit['headers'] = typeof mimetype === 'string' ? { 'Content-Type': mimetype } : {}\n\n  return new Response(buffer, { headers })\n}\n"
  },
  {
    "path": "site/src/pages/docs/[version]/examples/[...example].astro",
    "content": "---\nimport ExamplesLayout from '@layouts/ExamplesLayout.astro'\nimport { getConfig } from '@libs/config'\nimport { exampleFrontmatterSchema, getExampleNameFromPagePath, type ExampleFrontmatter } from '@libs/examples'\n\nexport async function getStaticPaths() {\n  const examplesPageModules = import.meta.glob('../../../../assets/examples/**/*.astro', { eager: true })\n  const examplesPages = Object.entries(examplesPageModules).map(([file, module]) => {\n    return {\n      file,\n      ...module\n    }\n  })\n\n  return examplesPages.map((examplesPage) => {\n    const { default: Content, file, url, ...props } = examplesPage\n    const example = getExampleNameFromPagePath(examplesPage.file)\n    let frontmatter: ExampleFrontmatter\n\n    try {\n      frontmatter = exampleFrontmatterSchema.parse(props)\n    } catch (error) {\n      throw new Error(`Invalid frontmatter for the '${example}' example.`, { cause: error })\n    }\n\n    return {\n      params: { example, version: getConfig().docs_version },\n      props: { ...frontmatter, Content }\n    }\n  })\n}\n\ntype Props = ExampleFrontmatter\n\nconst { Content, ...props } = Astro.props\n---\n\n<ExamplesLayout {...props}>\n  <Content />\n</ExamplesLayout>\n"
  },
  {
    "path": "site/src/pages/docs/[version]/examples/index.astro",
    "content": "---\nimport SingleLayout from '@layouts/SingleLayout.astro'\nimport { getConfig } from '@libs/config'\nimport ExamplesMain from '@layouts/partials/ExamplesMain.astro'\nexport function getStaticPaths() {\n  return [\n    {\n      params: { version: getConfig().docs_version }\n    }\n  ]\n}\n---\n\n<SingleLayout\n  title=\"Examples\"\n  description=\"Quickly get a project started with any of our examples ranging from using parts of the framework to custom components and layouts.\"\n>\n  <div class=\"d-flex flex-column flex-md-row gap-3\" slot=\"header-content\">\n    <a\n      href={getConfig().download.dist_examples}\n      class=\"btn btn-lg bd-btn-lg btn-bd-primary d-flex align-items-center justify-content-center fw-semibold\"\n    >\n      <svg class=\"bi me-2\" aria-hidden=\"true\"><use xlink:href=\"#box-seam\"></use></svg>\n      Download examples\n    </a>\n    <a href={getConfig().download.source} class=\"btn btn-lg bd-btn-lg btn-outline-secondary\"> Download source code</a>\n  </div>\n  <Fragment slot=\"main-content\">\n    <ExamplesMain />\n  </Fragment>\n</SingleLayout>\n"
  },
  {
    "path": "site/src/pages/docs/[version]/index.astro",
    "content": "---\nimport RedirectLayout from '@layouts/RedirectLayout.astro'\nimport { getConfig } from '@libs/config'\nimport { getVersionedDocsPath } from '@libs/path'\n\nexport function getStaticPaths() {\n  return [\n    {\n      params: { version: getConfig().docs_version }\n    }\n  ]\n}\n---\n\n<RedirectLayout path={getVersionedDocsPath('/getting-started/introduction/')} />\n"
  },
  {
    "path": "site/src/pages/docs/index.astro",
    "content": "---\nimport RedirectLayout from '@layouts/RedirectLayout.astro'\nimport { getVersionedDocsPath } from '@libs/path'\n---\n\n<RedirectLayout path={getVersionedDocsPath('/getting-started/introduction/')} />\n"
  },
  {
    "path": "site/src/pages/docs/versions.astro",
    "content": "---\nimport SingleLayout from '@layouts/SingleLayout.astro'\nimport { getConfig } from '@libs/config'\nimport { getData } from '@libs/data'\n\nfunction getVersionsSortedDesc<TKey extends string, TVersions extends Record<TKey, string>>(\n  versions: TVersions[],\n  orderBy: TKey\n) {\n  return [...versions].sort((versionA, versionB) => {\n    return versionB[orderBy].localeCompare(versionA[orderBy])\n  })\n}\n---\n\n<SingleLayout\n  title=\"Versions\"\n  description=\"An appendix of hosted documentation for nearly every release of Bootstrap, from v1 through v5.\"\n>\n  <div class=\"row\">\n    {\n      getVersionsSortedDesc(getData('docs-versions'), 'group').map((docsVersion) => {\n        return (\n          <div class=\"col-md-6 col-lg-4 col-xl mb-4\">\n            <h2>{docsVersion.group}</h2>\n            <p>{docsVersion.description}</p>\n            <div class=\"list-group\">\n              {docsVersion.versions\n                .slice()\n                .sort((a, b) => b.localeCompare(a))\n                .map((version) => {\n                  const isCurrentVersion = version === getConfig().docs_version\n\n                  return (\n                    <a\n                      class:list={[\n                        'list-group-item list-group-item-action py-2 text-primary',\n                        isCurrentVersion && 'd-flex justify-content-between align-items-center'\n                      ]}\n                      href={`${docsVersion.baseurl}/${version}/`}\n                    >\n                      {version}\n                      {isCurrentVersion && <span class=\"badge text-bg-primary\">Latest</span>}\n                    </a>\n                  )\n                })}\n            </div>\n          </div>\n        )\n      })\n    }\n  </div>\n</SingleLayout>\n"
  },
  {
    "path": "site/src/pages/examples.astro",
    "content": "---\nimport RedirectLayout from '@layouts/RedirectLayout.astro'\nimport { getVersionedDocsPath } from '@libs/path'\n---\n\n<RedirectLayout path={getVersionedDocsPath('examples')} />\n"
  },
  {
    "path": "site/src/pages/index.astro",
    "content": "---\nimport BaseLayout from '@layouts/BaseLayout.astro'\nimport GetStarted from '@components/home/GetStarted.astro'\nimport Customize from '@components/home/Customize.astro'\nimport CSSVariables from '@components/home/CSSVariables.astro'\nimport ComponentUtilities from '@components/home/ComponentUtilities.astro'\nimport MastHead from '@components/home/MastHead.astro'\nimport Plugins from '@components/home/Plugins.astro'\nimport Icons from '@components/home/Icons.astro'\n---\n\n<BaseLayout>\n  <MastHead />\n  <div class=\"container-xxl bd-gutter masthead-followup\">\n    <GetStarted />\n    <Customize />\n    <CSSVariables />\n    <ComponentUtilities />\n    <Plugins />\n    <Icons />\n  </div>\n</BaseLayout>\n"
  },
  {
    "path": "site/src/pages/robots.txt.ts",
    "content": "import type { APIRoute } from 'astro'\n\nexport const GET: APIRoute = function GET({ site }) {\n  const isProduction = import.meta.env.PROD\n  const isNetlify = import.meta.env.NETLIFY === 'true'\n\n  const allowCrawling = !isNetlify && isProduction\n\n  const robotsTxt = `# www.robotstxt.org${allowCrawling ? '\\n# Allow crawling of all content' : ''}\nUser-agent: *\nDisallow: ${allowCrawling ? '' : '/'}\nSitemap: ${new URL('sitemap-index.xml', site)}\n`\n\n  return new Response(robotsTxt, {\n    headers: {\n      'Content-Type': 'text/plain'\n    }\n  })\n}\n"
  },
  {
    "path": "site/src/plugins/algolia-plugin.js",
    "content": "import { getConfig } from '../libs/config.ts'\n\n/**\n * Vite plugin to replace placeholder values in search.js with actual configuration values\n */\nexport function algoliaPlugin() {\n  const config = getConfig()\n\n  return {\n    name: 'algolia-config-replacer',\n    transform(code, id) {\n      if (id.includes('search.js')) {\n        return code\n          .replace(/__API_KEY__/g, config.algolia.api_key)\n          .replace(/__INDEX_NAME__/g, config.algolia.index_name)\n          .replace(/__APP_ID__/g, config.algolia.app_id)\n      }\n\n      return code\n    }\n  }\n}\n"
  },
  {
    "path": "site/src/plugins/stackblitz-plugin.js",
    "content": "import { getConfig } from '../libs/config.ts'\n\n/**\n * Vite plugin to replace placeholder values in stackblitz.js with actual configuration values\n */\nexport function stackblitzPlugin() {\n  const config = getConfig()\n\n  return {\n    name: 'stackblitz-config-replacer',\n    transform(code, id) {\n      if (id.includes('stackblitz.js')) {\n        return code\n          .replace(/__CSS_CDN__/g, config.cdn.css)\n          .replace(/__JS_BUNDLE_CDN__/g, config.cdn.js_bundle)\n          .replace(/__DOCS_VERSION__/g, config.docs_version)\n      }\n\n      return code\n    }\n  }\n}\n"
  },
  {
    "path": "site/src/scss/_ads.scss",
    "content": "// stylelint-disable declaration-no-important, selector-max-id\n\n//\n// Carbon ads\n//\n\n#carbonads {\n  position: static;\n  max-width: 400px;\n  padding: 15px 15px 15px 160px;\n  margin: 1rem 0;\n  overflow: hidden;\n  @include font-size(.8125rem);\n  line-height: 1.4;\n  text-align: left;\n  background-color: var(--bs-tertiary-bg);\n\n  a {\n    color: var(--bs-body-color);\n    text-decoration: none;\n  }\n\n  @include media-breakpoint-up(sm) {\n    @include border-radius(.5rem);\n  }\n}\n\n.carbon-img {\n  float: left;\n  margin-left: -145px;\n}\n\n@container (max-width: 240px) {\n  #carbonads {\n    padding-left: 15px;\n  }\n\n  .carbon-img {\n    display: block;\n    float: none;\n    margin-left: 0;\n  }\n\n  .carbon-wrap {\n    display: flex;\n    flex-direction: column;\n    gap: .5rem;\n  }\n\n  .carbon-img > img {\n    width: 100%;\n    max-width: 100% !important;\n    height: auto;\n    @include border-radius(var(--bs-border-radius-sm));\n  }\n}\n\n.carbon-poweredby {\n  display: block;\n  margin-top: .75rem;\n  color: var(--bs-fg-3) !important;\n}\n"
  },
  {
    "path": "site/src/scss/_anchor.scss",
    "content": ".anchor-link {\n  padding: 0 .175rem;\n  font-weight: 400;\n  color: rgba($link-color, .5);\n  text-decoration: none;\n  opacity: 0;\n  @include transition(color .15s ease-in-out, opacity .15s ease-in-out);\n\n  &::after {\n    content: \"#\";\n  }\n\n  &:focus,\n  &:hover,\n  :hover > &,\n  :target > & {\n    color: $link-color;\n    text-decoration: none;\n    opacity: 1;\n  }\n}\n"
  },
  {
    "path": "site/src/scss/_brand.scss",
    "content": "//\n// Brand guidelines\n//\n\n// Logo series wrapper\n.bd-brand-logos {\n  color: $bd-violet;\n\n  .inverse {\n    color: $white;\n    background-color: $bd-violet;\n  }\n}\n\n// Individual items\n.bd-brand-item {\n  + .bd-brand-item {\n    border-top: 1px solid var(--bs-border-color);\n  }\n\n  @include media-breakpoint-up(md) {\n    + .bd-brand-item {\n      border-top: 0;\n      border-left: 1px solid var(--bs-border-color);\n    }\n  }\n}\n\n\n//\n// Color swatches\n//\n\n.color-swatches {\n  margin: 0 -5px;\n\n  // Docs colors\n  .bd-purple {\n    background-color: $bd-purple;\n  }\n  .bd-purple-light {\n    background-color: $bd-purple-light;\n  }\n  .bd-purple-lighter {\n    background-color: #e5e1ea;\n  }\n  .bd-gray {\n    background-color: #f9f9f9;\n  }\n}\n\n.color-swatch {\n  width: 4rem;\n  height: 4rem;\n\n  @include media-breakpoint-up(md) {\n    width: 6rem;\n    height: 6rem;\n  }\n}\n"
  },
  {
    "path": "site/src/scss/_buttons.scss",
    "content": "// Buttons\n//\n// Custom buttons for the docs.\n\n// scss-docs-start btn-css-vars-example\n.btn-bd-primary {\n  --bs-btn-font-weight: 600;\n  --bs-btn-color: var(--bs-white);\n  --bs-btn-bg: var(--bd-violet-bg);\n  --bs-btn-border-color: var(--bd-violet-bg);\n  --bs-btn-hover-color: var(--bs-white);\n  --bs-btn-hover-bg: #{shade-color($bd-violet, 10%)};\n  --bs-btn-hover-border-color: #{shade-color($bd-violet, 10%)};\n  --bs-btn-focus-shadow-rgb: var(--bd-violet-rgb);\n  --bs-btn-active-color: var(--bs-btn-hover-color);\n  --bs-btn-active-bg: #{shade-color($bd-violet, 20%)};\n  --bs-btn-active-border-color: #{shade-color($bd-violet, 20%)};\n}\n// scss-docs-end btn-css-vars-example\n\n.btn-bd-accent {\n  --bs-btn-font-weight: 600;\n  --bs-btn-color: var(--bd-accent);\n  --bs-btn-border-color: var(--bd-accent);\n  --bs-btn-hover-color: var(--bd-dark);\n  --bs-btn-hover-bg: var(--bd-accent);\n  --bs-btn-hover-border-color: var(--bd-accent);\n  --bs-btn-focus-shadow-rgb: var(--bd-accent-rgb);\n  --bs-btn-active-color: var(--bs-btn-hover-color);\n  --bs-btn-active-bg: var(--bs-btn-hover-bg);\n  --bs-btn-active-border-color: var(--bs-btn-hover-border-color);\n}\n\n.btn-bd-light {\n  --btn-custom-color: #{mix($bd-violet, $white, 75%)};\n\n  --bs-btn-color: var(--bs-gray-600);\n  --bs-btn-border-color: var(--bs-border-color);\n  --bs-btn-hover-color: var(--btn-custom-color);\n  --bs-btn-hover-border-color: var(--btn-custom-color);\n  --bs-btn-active-color: var(--btn-custom-color);\n  --bs-btn-active-bg: var(--bs-white);\n  --bs-btn-active-border-color: var(--btn-custom-color);\n  --bs-btn-focus-border-color: var(--btn-custom-color);\n  --bs-btn-focus-shadow-rgb: var(--bd-violet-rgb);\n}\n\n.bd-btn-lg {\n  --bs-btn-border-radius: .5rem;\n\n  padding: .8125rem 2rem;\n}\n"
  },
  {
    "path": "site/src/scss/_callouts.scss",
    "content": "//\n// Callouts\n//\n\n.bd-callout {\n  --#{$prefix}link-color-rgb: var(--bd-callout-link);\n  --#{$prefix}code-color: var(--bd-callout-code-color);\n\n  padding: 1.25rem;\n  margin-top: 1.25rem;\n  margin-bottom: 1.25rem;\n  color: var(--bd-callout-color, inherit);\n  background-color: var(--bd-callout-bg, var(--bs-gray-100));\n  border-left: .25rem solid var(--bd-callout-border, var(--bs-gray-300));\n\n  h4 {\n    margin-bottom: .25rem;\n  }\n\n  > :last-child {\n    margin-bottom: 0;\n  }\n\n  + .bd-callout {\n    margin-top: -.25rem;\n  }\n\n  .highlight {\n    background-color: rgba($black, .05);\n  }\n}\n\n// Variations\n@each $variant in $bd-callout-variants {\n  .bd-callout-#{$variant} {\n    --bd-callout-color: var(--bs-#{$variant}-text-emphasis);\n    --bd-callout-bg: var(--bs-#{$variant}-bg-subtle);\n    --bd-callout-border: var(--bs-#{$variant}-border-subtle);\n  }\n}\n"
  },
  {
    "path": "site/src/scss/_clipboard-js.scss",
    "content": "// clipboard.js\n//\n// JS-based `Copy` buttons for code snippets.\n\n.bd-clipboard,\n.bd-edit {\n  position: relative;\n  display: none;\n  float: right;\n\n  + .highlight {\n    margin-top: 0;\n  }\n\n  @include media-breakpoint-up(md) {\n    display: block;\n  }\n}\n\n.btn-clipboard,\n.btn-edit {\n  display: block;\n  padding: .5em;\n  line-height: 1;\n  color: var(--bs-body-color);\n  background-color: var(--bd-pre-bg);\n  border: 0;\n  @include border-radius(.25rem);\n\n  &:hover {\n    color: var(--bs-link-hover-color);\n  }\n\n  &:focus {\n    z-index: 3;\n  }\n}\n\n.btn-clipboard {\n  position: relative;\n  z-index: 2;\n  margin-top: 1.25rem;\n  margin-right: .75rem;\n}\n"
  },
  {
    "path": "site/src/scss/_colors.scss",
    "content": "//\n// Docs color palette classes\n//\n\n@each $color, $value in map-merge($colors, (\"gray-500\": $gray-500)) {\n  .swatch-#{$color} {\n    color: color-contrast($value);\n    background-color: #{$value};\n\n    &::after {\n      $contrast-ratio: \"#{contrast-ratio($value, color-contrast($value))}\";\n      $against-white: \"#{contrast-ratio($value, $white)}\";\n      $against-black: \"#{contrast-ratio($value, $black)}\";\n      position: absolute;\n      top: 1rem;\n      right: 1rem;\n      padding-left: 1rem;\n      font-size: .75rem;\n      line-height: 1.35;\n      white-space: pre;\n      content:\n        str-slice($contrast-ratio, 1, 4) \"\\A\"\n        str-slice($against-white, 1, 4) \"\\A\"\n        str-slice($against-black, 1, 4);\n      background-color: $value;\n      background-image:\n        linear-gradient(\n          to bottom,\n          transparent .25rem,\n          color-contrast($value) .25rem .75rem,\n          transparent .75rem 1.25rem,\n          $white 1.25rem 1.75rem,\n          transparent 1.75rem 2.25rem,\n          $black 2.25rem 2.75rem,\n          transparent 2.75rem\n        );\n      background-repeat: no-repeat;\n      background-size: .5rem 100%;\n    }\n  }\n}\n\n// stylelint-disable declaration-block-single-line-max-declarations\n.bd-blue-100 { color: color-contrast($blue-100); background-color: $blue-100; }\n.bd-blue-200 { color: color-contrast($blue-200); background-color: $blue-200; }\n.bd-blue-300 { color: color-contrast($blue-300); background-color: $blue-300; }\n.bd-blue-400 { color: color-contrast($blue-400); background-color: $blue-400; }\n.bd-blue-500 { color: color-contrast($blue-500); background-color: $blue-500; }\n.bd-blue-600 { color: color-contrast($blue-600); background-color: $blue-600; }\n.bd-blue-700 { color: color-contrast($blue-700); background-color: $blue-700; }\n.bd-blue-800 { color: color-contrast($blue-800); background-color: $blue-800; }\n.bd-blue-900 { color: color-contrast($blue-900); background-color: $blue-900; }\n\n.bd-indigo-100 { color: color-contrast($indigo-100); background-color: $indigo-100; }\n.bd-indigo-200 { color: color-contrast($indigo-200); background-color: $indigo-200; }\n.bd-indigo-300 { color: color-contrast($indigo-300); background-color: $indigo-300; }\n.bd-indigo-400 { color: color-contrast($indigo-400); background-color: $indigo-400; }\n.bd-indigo-500 { color: color-contrast($indigo-500); background-color: $indigo-500; }\n.bd-indigo-600 { color: color-contrast($indigo-600); background-color: $indigo-600; }\n.bd-indigo-700 { color: color-contrast($indigo-700); background-color: $indigo-700; }\n.bd-indigo-800 { color: color-contrast($indigo-800); background-color: $indigo-800; }\n.bd-indigo-900 { color: color-contrast($indigo-900); background-color: $indigo-900; }\n\n.bd-purple-100 { color: color-contrast($purple-100); background-color: $purple-100; }\n.bd-purple-200 { color: color-contrast($purple-200); background-color: $purple-200; }\n.bd-purple-300 { color: color-contrast($purple-300); background-color: $purple-300; }\n.bd-purple-400 { color: color-contrast($purple-400); background-color: $purple-400; }\n.bd-purple-500 { color: color-contrast($purple-500); background-color: $purple-500; }\n.bd-purple-600 { color: color-contrast($purple-600); background-color: $purple-600; }\n.bd-purple-700 { color: color-contrast($purple-700); background-color: $purple-700; }\n.bd-purple-800 { color: color-contrast($purple-800); background-color: $purple-800; }\n.bd-purple-900 { color: color-contrast($purple-900); background-color: $purple-900; }\n\n.bd-pink-100 { color: color-contrast($pink-100); background-color: $pink-100; }\n.bd-pink-200 { color: color-contrast($pink-200); background-color: $pink-200; }\n.bd-pink-300 { color: color-contrast($pink-300); background-color: $pink-300; }\n.bd-pink-400 { color: color-contrast($pink-400); background-color: $pink-400; }\n.bd-pink-500 { color: color-contrast($pink-500); background-color: $pink-500; }\n.bd-pink-600 { color: color-contrast($pink-600); background-color: $pink-600; }\n.bd-pink-700 { color: color-contrast($pink-700); background-color: $pink-700; }\n.bd-pink-800 { color: color-contrast($pink-800); background-color: $pink-800; }\n.bd-pink-900 { color: color-contrast($pink-900); background-color: $pink-900; }\n\n.bd-red-100 { color: color-contrast($red-100); background-color: $red-100; }\n.bd-red-200 { color: color-contrast($red-200); background-color: $red-200; }\n.bd-red-300 { color: color-contrast($red-300); background-color: $red-300; }\n.bd-red-400 { color: color-contrast($red-400); background-color: $red-400; }\n.bd-red-500 { color: color-contrast($red-500); background-color: $red-500; }\n.bd-red-600 { color: color-contrast($red-600); background-color: $red-600; }\n.bd-red-700 { color: color-contrast($red-700); background-color: $red-700; }\n.bd-red-800 { color: color-contrast($red-800); background-color: $red-800; }\n.bd-red-900 { color: color-contrast($red-900); background-color: $red-900; }\n\n.bd-orange-100 { color: color-contrast($orange-100); background-color: $orange-100; }\n.bd-orange-200 { color: color-contrast($orange-200); background-color: $orange-200; }\n.bd-orange-300 { color: color-contrast($orange-300); background-color: $orange-300; }\n.bd-orange-400 { color: color-contrast($orange-400); background-color: $orange-400; }\n.bd-orange-500 { color: color-contrast($orange-500); background-color: $orange-500; }\n.bd-orange-600 { color: color-contrast($orange-600); background-color: $orange-600; }\n.bd-orange-700 { color: color-contrast($orange-700); background-color: $orange-700; }\n.bd-orange-800 { color: color-contrast($orange-800); background-color: $orange-800; }\n.bd-orange-900 { color: color-contrast($orange-900); background-color: $orange-900; }\n\n.bd-yellow-100 { color: color-contrast($yellow-100); background-color: $yellow-100; }\n.bd-yellow-200 { color: color-contrast($yellow-200); background-color: $yellow-200; }\n.bd-yellow-300 { color: color-contrast($yellow-300); background-color: $yellow-300; }\n.bd-yellow-400 { color: color-contrast($yellow-400); background-color: $yellow-400; }\n.bd-yellow-500 { color: color-contrast($yellow-500); background-color: $yellow-500; }\n.bd-yellow-600 { color: color-contrast($yellow-600); background-color: $yellow-600; }\n.bd-yellow-700 { color: color-contrast($yellow-700); background-color: $yellow-700; }\n.bd-yellow-800 { color: color-contrast($yellow-800); background-color: $yellow-800; }\n.bd-yellow-900 { color: color-contrast($yellow-900); background-color: $yellow-900; }\n\n.bd-green-100 { color: color-contrast($green-100); background-color: $green-100; }\n.bd-green-200 { color: color-contrast($green-200); background-color: $green-200; }\n.bd-green-300 { color: color-contrast($green-300); background-color: $green-300; }\n.bd-green-400 { color: color-contrast($green-400); background-color: $green-400; }\n.bd-green-500 { color: color-contrast($green-500); background-color: $green-500; }\n.bd-green-600 { color: color-contrast($green-600); background-color: $green-600; }\n.bd-green-700 { color: color-contrast($green-700); background-color: $green-700; }\n.bd-green-800 { color: color-contrast($green-800); background-color: $green-800; }\n.bd-green-900 { color: color-contrast($green-900); background-color: $green-900; }\n\n.bd-teal-100 { color: color-contrast($teal-100); background-color: $teal-100; }\n.bd-teal-200 { color: color-contrast($teal-200); background-color: $teal-200; }\n.bd-teal-300 { color: color-contrast($teal-300); background-color: $teal-300; }\n.bd-teal-400 { color: color-contrast($teal-400); background-color: $teal-400; }\n.bd-teal-500 { color: color-contrast($teal-500); background-color: $teal-500; }\n.bd-teal-600 { color: color-contrast($teal-600); background-color: $teal-600; }\n.bd-teal-700 { color: color-contrast($teal-700); background-color: $teal-700; }\n.bd-teal-800 { color: color-contrast($teal-800); background-color: $teal-800; }\n.bd-teal-900 { color: color-contrast($teal-900); background-color: $teal-900; }\n\n.bd-cyan-100 { color: color-contrast($cyan-100); background-color: $cyan-100; }\n.bd-cyan-200 { color: color-contrast($cyan-200); background-color: $cyan-200; }\n.bd-cyan-300 { color: color-contrast($cyan-300); background-color: $cyan-300; }\n.bd-cyan-400 { color: color-contrast($cyan-400); background-color: $cyan-400; }\n.bd-cyan-500 { color: color-contrast($cyan-500); background-color: $cyan-500; }\n.bd-cyan-600 { color: color-contrast($cyan-600); background-color: $cyan-600; }\n.bd-cyan-700 { color: color-contrast($cyan-700); background-color: $cyan-700; }\n.bd-cyan-800 { color: color-contrast($cyan-800); background-color: $cyan-800; }\n.bd-cyan-900 { color: color-contrast($cyan-900); background-color: $cyan-900; }\n\n.bd-gray-100 { color: color-contrast($gray-100); background-color: $gray-100; }\n.bd-gray-200 { color: color-contrast($gray-200); background-color: $gray-200; }\n.bd-gray-300 { color: color-contrast($gray-300); background-color: $gray-300; }\n.bd-gray-400 { color: color-contrast($gray-400); background-color: $gray-400; }\n.bd-gray-500 { color: color-contrast($gray-500); background-color: $gray-500; }\n.bd-gray-600 { color: color-contrast($gray-600); background-color: $gray-600; }\n.bd-gray-700 { color: color-contrast($gray-700); background-color: $gray-700; }\n.bd-gray-800 { color: color-contrast($gray-800); background-color: $gray-800; }\n.bd-gray-900 { color: color-contrast($gray-900); background-color: $gray-900; }\n\n.bd-white {\n  color: color-contrast($white);\n  background-color: $white;\n\n  // Astro HTML parser adds extra <p> tags to the content\n  p {\n    margin: 0;\n  }\n}\n\n.bd-black {\n  color: color-contrast($black);\n  background-color: $black;\n\n  // Astro HTML parser adds extra <p> tags to the content\n  p {\n    margin: 0;\n  }\n}\n"
  },
  {
    "path": "site/src/scss/_component-examples.scss",
    "content": "//\n// Docs examples\n//\n\n.bd-code-snippet {\n  margin: 0 ($bd-gutter-x * -.5) 1rem;\n  border: solid var(--bs-border-color);\n  border-width: 1px 0;\n\n  @include media-breakpoint-up(md) {\n    margin-right: 0;\n    margin-left: 0;\n    border-width: 1px;\n    @include border-radius(var(--bs-border-radius));\n  }\n}\n\n.bd-example {\n  --bd-example-padding: 1rem;\n\n  position: relative;\n  padding: var(--bd-example-padding);\n  margin: 0 ($bd-gutter-x * -.5) 1rem;\n  border: solid var(--bs-border-color);\n  border-width: 1px 0;\n  @include clearfix();\n\n  @include media-breakpoint-up(md) {\n    --bd-example-padding: 1.5rem;\n\n    margin-right: 0;\n    margin-left: 0;\n    border-width: 1px;\n    @include border-radius(var(--bs-border-radius));\n  }\n\n  + p {\n    margin-top: 2rem;\n  }\n\n  > .form-control {\n    + .form-control {\n      margin-top: .5rem;\n    }\n  }\n\n  > .nav + .nav,\n  > .alert + .alert,\n  > .navbar + .navbar,\n  > .progress + .progress {\n    margin-top: $spacer;\n  }\n\n  > .dropdown-menu {\n    position: static;\n    display: block;\n  }\n\n  > :last-child,\n  > nav:last-child .breadcrumb {\n    margin-bottom: 0;\n  }\n\n  > hr:last-child {\n    margin-bottom: $spacer;\n  }\n\n  // Images\n  > svg + svg,\n  > img + img {\n    margin-left: .5rem;\n  }\n\n  // Buttons\n  > .btn,\n  > .btn-group {\n    margin: .25rem .125rem;\n  }\n  > .btn-toolbar + .btn-toolbar {\n    margin-top: .5rem;\n  }\n\n  // List groups\n  > .list-group {\n    max-width: 400px;\n  }\n\n  > [class*=\"list-group-horizontal\"] {\n    max-width: 100%;\n  }\n\n  // Navbars\n  .fixed-top,\n  .sticky-top {\n    position: static;\n    margin: calc(-1 * var(--bd-example-padding)) calc(-1 * var(--bd-example-padding)) var(--bd-example-padding); // stylelint-disable-line function-disallowed-list\n  }\n\n  .fixed-bottom,\n  .sticky-bottom {\n    position: static;\n    margin: var(--bd-example-padding) calc(-1 * var(--bd-example-padding)) calc(-1 * var(--bd-example-padding)); // stylelint-disable-line function-disallowed-list\n\n  }\n\n  // Pagination\n  .pagination {\n    margin-bottom: 0;\n  }\n}\n\n//\n// Grid examples\n//\n\n.bd-example-row [class^=\"col\"],\n.bd-example-cols [class^=\"col\"] > *,\n.bd-example-cssgrid [class*=\"grid\"] > * {\n  padding-top: .75rem;\n  padding-bottom: .75rem;\n  background-color: rgba(var(--bd-violet-rgb), .15);\n  border: 1px solid rgba(var(--bd-violet-rgb), .3);\n}\n\n.bd-example-row .row + .row,\n.bd-example-cssgrid .grid + .grid {\n  margin-top: 1rem;\n}\n\n.bd-example-row-flex-cols .row {\n  min-height: 10rem;\n  background-color: rgba(var(--bd-violet-rgb), .15);\n}\n\n.bd-example-flex div:not(.vr) {\n  background-color: rgba(var(--bd-violet-rgb), .15);\n  border: 1px solid rgba(var(--bd-violet-rgb), .3);\n}\n\n// Grid mixins\n.example-container {\n  width: 800px;\n  @include make-container();\n}\n\n.example-row {\n  @include make-row();\n}\n\n.example-content-main {\n  @include make-col-ready();\n\n  @include media-breakpoint-up(sm) {\n    @include make-col(6);\n  }\n\n  @include media-breakpoint-up(lg) {\n    @include make-col(8);\n  }\n}\n\n.example-content-secondary {\n  @include make-col-ready();\n\n  @include media-breakpoint-up(sm) {\n    @include make-col(6);\n  }\n\n  @include media-breakpoint-up(lg) {\n    @include make-col(4);\n  }\n}\n\n// Ratio helpers\n.bd-example-ratios {\n  .ratio {\n    display: inline-block;\n    width: 10rem;\n    color: var(--bs-secondary-color);\n    background-color: var(--bs-tertiary-bg);\n    border: var(--bs-border-width) solid var(--bs-border-color);\n\n    > div {\n      display: flex;\n      align-items: center;\n      justify-content: center;\n    }\n  }\n}\n.bd-example-ratios-breakpoint {\n  .ratio-4x3 {\n    width: 16rem;\n\n    @include media-breakpoint-up(md) {\n      --bs-aspect-ratio: 50%; // 2x1\n    }\n  }\n}\n\n.bd-example-offcanvas {\n  .offcanvas {\n    position: static;\n    display: block;\n    height: 200px;\n    visibility: visible;\n    transform: translate(0);\n  }\n}\n\n// Tooltips\n.tooltip-demo {\n  a {\n    white-space: nowrap;\n  }\n\n  .btn {\n    margin: .25rem .125rem;\n  }\n}\n\n// scss-docs-start custom-tooltip\n.custom-tooltip {\n  --bs-tooltip-bg: var(--bd-violet-bg);\n  --bs-tooltip-color: var(--bs-white);\n}\n// scss-docs-end custom-tooltip\n\n// scss-docs-start custom-popovers\n.custom-popover {\n  --bs-popover-max-width: 200px;\n  --bs-popover-border-color: var(--bd-violet-bg);\n  --bs-popover-header-bg: var(--bd-violet-bg);\n  --bs-popover-header-color: var(--bs-white);\n  --bs-popover-body-padding-x: 1rem;\n  --bs-popover-body-padding-y: .5rem;\n}\n// scss-docs-end custom-popovers\n\n// Scrollspy demo on fixed height div\n.scrollspy-example {\n  height: 200px;\n  margin-top: .5rem;\n  overflow: auto;\n}\n\n.scrollspy-example-2 {\n  height: 350px;\n  overflow: auto;\n}\n\n.simple-list-example-scrollspy {\n  .active {\n    background-color: rgba(var(--bd-violet-rgb), .15);\n  }\n}\n\n.bd-example-border-utils {\n  [class^=\"border\"] {\n    display: inline-block;\n    width: 5rem;\n    height: 5rem;\n    margin: .25rem;\n    background-color: var(--bs-tertiary-bg);\n  }\n}\n\n.bd-example-rounded-utils {\n  [class*=\"rounded\"] {\n    margin: .25rem;\n  }\n}\n\n.bd-example-position-utils {\n  position: relative;\n  padding: 2rem;\n\n  .position-relative {\n    height: 200px;\n    background-color: var(--bs-tertiary-bg);\n  }\n\n  .position-absolute {\n    width: 2rem;\n    height: 2rem;\n    background-color: var(--bs-body-color);\n    @include border-radius();\n  }\n}\n\n.bd-example-position-examples {\n  &::after {\n    content: none;\n  }\n}\n\n// Placeholders\n.bd-example-placeholder-cards {\n  &::after {\n    display: none;\n  }\n\n  .card {\n    width: 18rem;\n  }\n}\n\n// Toasts\n.bd-example-toasts {\n  min-height: 240px;\n}\n\n.bd-example-zindex-levels {\n  min-height: 15rem;\n\n  > div {\n    color: var(--bs-body-bg);\n    background-color: var(--bd-violet);\n    border: 1px solid var(--bd-purple);\n\n    > span {\n      position: absolute;\n      right: 5px;\n      bottom: 0;\n    }\n  }\n\n  > :nth-child(2) {\n    top: 3rem;\n    left: 3rem;\n  }\n  > :nth-child(3) {\n    top: 4.5rem;\n    left: 4.5rem;\n  }\n  > :nth-child(4) {\n    top: 6rem;\n    left: 6rem;\n  }\n  > :nth-child(5) {\n    top: 7.5rem;\n    left: 7.5rem;\n  }\n}\n\n//\n// Code snippets\n//\n\n.highlight {\n  position: relative;\n  padding: .75rem ($bd-gutter-x * .5);\n  background-color: var(--bd-pre-bg);\n\n  @include media-breakpoint-up(md) {\n    padding: .75rem 1.25rem;\n    @include border-radius(calc(var(--bs-border-radius) - 1px));\n  }\n\n  @include media-breakpoint-up(lg) {\n    pre {\n      margin-right: 1.875rem;\n    }\n  }\n\n  pre {\n    padding: .25rem 0 .875rem;\n    margin-top: .8125rem;\n    margin-bottom: 0;\n    overflow: overlay;\n    white-space: pre;\n    background-color: transparent;\n    border: 0;\n  }\n\n  pre code {\n    @include font-size(inherit);\n    color: var(--bs-body-color); // Effectively the base text color\n    word-wrap: normal;\n  }\n}\n\n.bd-example-snippet .highlight pre {\n  margin-right: 0;\n}\n\n.highlight-toolbar {\n  background-color: var(--bd-pre-bg);\n\n  + .highlight {\n    @include border-top-radius(0);\n  }\n}\n\n.bd-file-ref {\n  .highlight-toolbar {\n    @include media-breakpoint-up(md) {\n      @include border-top-radius(calc(var(--bs-border-radius) - 1px));\n    }\n  }\n}\n\n.bd-content .bd-code-snippet {\n  margin-bottom: 1rem;\n}\n"
  },
  {
    "path": "site/src/scss/_content.scss",
    "content": "//\n// Bootstrap docs content theming\n//\n\n.bd-content {\n  > h2,\n  > h3,\n  > h4 {\n    --bs-heading-color: var(--bs-emphasis-color);\n  }\n\n  // Offset content from fixed navbar when jumping to headings\n  > h2:not(:first-child) {\n    margin-top: 3rem;\n  }\n\n  > h3 {\n    margin-top: 2rem;\n  }\n\n  > ul li,\n  > ol li {\n    margin-bottom: .25rem;\n\n    // stylelint-disable selector-max-type, selector-max-compound-selectors\n    > p ~ ul {\n      margin-top: -.5rem;\n      margin-bottom: 1rem;\n    }\n    // stylelint-enable selector-max-type, selector-max-compound-selectors\n  }\n\n  // Override Bootstrap defaults\n  > .table,\n  > .table-responsive .table {\n    --bs-table-border-color: var(--bs-border-color);\n\n    max-width: 100%;\n    margin-bottom: 1.5rem;\n    @include font-size(.875rem);\n\n    @include media-breakpoint-down(lg) {\n      &.table-bordered {\n        border: 0;\n      }\n    }\n\n    thead {\n      border-bottom: 2px solid currentcolor;\n    }\n\n    tbody:not(:first-child) {\n      border-top: 2px solid currentcolor;\n    }\n\n    th,\n    td {\n      &:first-child {\n        padding-left: 0;\n      }\n\n      &:not(:last-child) {\n        padding-right: 1.5rem;\n      }\n    }\n\n    th {\n      color: var(--bs-emphasis-color);\n    }\n\n    &:not(.bd-callout) > strong { // Keep callout correct color when used within tables\n      color: var(--bs-emphasis-color);\n    }\n\n    // Prevent breaking of code\n    th,\n    td:first-child > code { // stylelint-disable-line selector-max-compound-selectors\n      white-space: nowrap;\n    }\n  }\n}\n\n.table-options {\n  td:nth-child(2) {\n    min-width: 160px;\n  }\n}\n\n.table-options td:last-child,\n.table-utilities td:last-child {\n  min-width: 280px;\n}\n\n.table-swatches {\n  th {\n    color: var(--bs-emphasis-color);\n  }\n\n  td code {\n    white-space: nowrap;\n  }\n\n  // Astro HTML parser adds extra <p> tags to the content\n  td p {\n    margin: 0;\n  }\n}\n\n.bd-title {\n  --bs-heading-color: var(--bs-emphasis-color);\n  @include font-size(3rem);\n}\n\n.bd-subtitle {\n  @include font-size(1.5rem);\n  font-weight: 300;\n}\n\n.bi {\n  width: 1em;\n  height: 1em;\n  vertical-align: -.125em;\n  fill: currentcolor;\n}\n\n.border-lg-start {\n  @include media-breakpoint-up(lg) {\n    border-left: var(--bs-border-width) solid var(--bs-border-color);\n  }\n}\n\n// stylelint-disable selector-no-qualifying-type\n.bd-summary-link {\n  color: var(--bs-link-color);\n\n  &:hover,\n  details[open] > & {\n    color: var(--bs-link-hover-color);\n  }\n}\n// stylelint-enable selector-no-qualifying-type\n\n// scss-docs-start custom-color-mode\n[data-bs-theme=\"blue\"] {\n  --bs-body-color: var(--bs-white);\n  --bs-body-color-rgb: #{to-rgb($white)};\n  --bs-body-bg: var(--bs-blue);\n  --bs-body-bg-rgb: #{to-rgb($blue)};\n  --bs-tertiary-bg: #{$blue-600};\n\n  .dropdown-menu {\n    --bs-dropdown-bg: #{mix($blue-500, $blue-600)};\n    --bs-dropdown-link-active-bg: #{$blue-700};\n  }\n\n  .btn-secondary {\n    --bs-btn-bg: #{mix($gray-600, $blue-400, .5)};\n    --bs-btn-border-color: #{rgba($white, .25)};\n    --bs-btn-hover-bg: #{darken(mix($gray-600, $blue-400, .5), 5%)};\n    --bs-btn-hover-border-color: #{rgba($white, .25)};\n    --bs-btn-active-bg: #{darken(mix($gray-600, $blue-400, .5), 10%)};\n    --bs-btn-active-border-color: #{rgba($white, .5)};\n    --bs-btn-focus-border-color: #{rgba($white, .5)};\n    --bs-btn-focus-box-shadow: 0 0 0 .25rem rgba(255, 255, 255, .2);\n  }\n}\n// scss-docs-end custom-color-mode\n"
  },
  {
    "path": "site/src/scss/_footer.scss",
    "content": "//\n// Footer\n//\n\n.bd-footer {\n  a {\n    color: var(--bs-body-color);\n    text-decoration: none;\n\n    &:hover,\n    &:focus {\n      color: var(--bs-link-hover-color);\n      text-decoration: underline;\n    }\n  }\n}\n"
  },
  {
    "path": "site/src/scss/_layout.scss",
    "content": ".bd-gutter {\n  --bs-gutter-x: #{$bd-gutter-x};\n}\n\n.bd-layout {\n\n  @include media-breakpoint-up(lg) {\n    display: grid;\n    grid-template-areas: \"sidebar main\";\n    grid-template-columns: 1fr 5fr;\n    gap: $grid-gutter-width;\n  }\n}\n\n.bd-sidebar {\n  grid-area: sidebar;\n}\n\n.bd-main {\n  grid-area: main;\n\n  @include media-breakpoint-down(lg) {\n    max-width: 760px;\n    margin-inline: auto;\n  }\n\n  @include media-breakpoint-up(md) {\n    display: grid;\n    grid-template-areas:\n      \"intro\"\n      \"toc\"\n      \"content\";\n    grid-template-rows: auto auto 1fr;\n    gap: inherit;\n  }\n\n  @include media-breakpoint-up(lg) {\n    grid-template-areas:\n      \"intro   toc\"\n      \"content toc\";\n    grid-template-rows: auto 1fr;\n    grid-template-columns: 4fr 1fr;\n  }\n}\n\n.bd-intro {\n  grid-area: intro;\n}\n\n.bd-toc {\n  grid-area: toc;\n}\n\n.bd-content {\n  grid-area: content;\n  min-width: 1px; // Fix width when bd-content contains a `<pre>` https://github.com/twbs/bootstrap/issues/25410\n}\n"
  },
  {
    "path": "site/src/scss/_masthead.scss",
    "content": ".bd-masthead {\n  --bd-pink-rgb: #{to-rgb($pink)};\n  padding: 3rem 0;\n  // stylelint-disable\n  background-image: linear-gradient(180deg, rgba(var(--bs-body-bg-rgb), .01), rgba(var(--bs-body-bg-rgb), 1) 85%),\n                    radial-gradient(ellipse at top left, rgba(var(--bs-primary-rgb), .5), transparent 50%),\n                    radial-gradient(ellipse at top right, rgba(var(--bd-accent-rgb), .5), transparent 50%),\n                    radial-gradient(ellipse at center right, rgba(var(--bd-violet-rgb), .5), transparent 50%),\n                    radial-gradient(ellipse at center left, rgba(var(--bd-pink-rgb), .5), transparent 50%);\n  // stylelint-enable\n\n  h1 {\n    --bs-heading-color: var(--bs-emphasis-color);\n    @include font-size(4rem);\n  }\n\n  .lead {\n    @include font-size(1rem);\n    font-weight: 400;\n    color: var(--bs-secondary-color);\n  }\n\n  .bd-code-snippet {\n    margin: 0;\n    border-color: var(--bs-border-color-translucent);\n    border-width: 1px;\n    @include border-radius(.5rem);\n  }\n\n  .highlight {\n    width: 100%;\n    padding: .5rem 1rem;\n    overflow: hidden;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n    background-color: rgba(var(--bs-body-color-rgb), .075);\n    @include border-radius(calc(.5rem - 1px));\n\n    @include media-breakpoint-up(lg) {\n      padding-right: 4rem;\n    }\n\n    pre {\n      padding: 0;\n      margin: .625rem 0;\n      overflow: hidden;\n    }\n  }\n  .btn-clipboard {\n    position: absolute;\n    top: -.625rem;\n    right: 0;\n    background-color: transparent;\n  }\n\n  #carbonads { // stylelint-disable-line selector-max-id\n    max-width: 400px;\n    margin-block: 2rem;\n    margin-inline: auto;\n  }\n\n  @include media-breakpoint-up(md) {\n    .lead {\n      @include font-size(1.5rem);\n    }\n  }\n}\n\n.masthead-followup {\n  h2,\n  h3,\n  h4 {\n    --bs-heading-color: var(--bs-emphasis-color);\n  }\n\n  .lead {\n    @include font-size(1rem);\n  }\n\n  @include media-breakpoint-up(md) {\n    .lead {\n      @include font-size(1.25rem);\n    }\n  }\n}\n\n.masthead-followup-icon {\n  padding: 1rem;\n  color: rgba(var(--bg-rgb), 1);\n  background-color: rgba(var(--bg-rgb), .1);\n  background-blend-mode: multiply;\n  @include border-radius(1rem);\n  mix-blend-mode: darken;\n\n  svg {\n    filter: drop-shadow(0 1px 1px var(--bs-body-bg));\n  }\n}\n\n.masthead-notice {\n  background-color: var(--bd-accent);\n  box-shadow: inset 0 -1px 1px rgba(var(--bs-body-color-rgb), .15), 0 .25rem 1.5rem rgba(var(--bs-body-bg-rgb), .75);\n}\n\n.animate-img {\n  > img {\n    @include transition(transform .2s ease-in-out);\n  }\n\n  &:hover > img {\n    transform: scale(1.1);\n  }\n\n  &:active > img {\n    transform: scale(1);\n  }\n}\n\n@if $enable-dark-mode {\n  [data-bs-theme=\"dark\"] {\n    .masthead-followup-icon {\n      mix-blend-mode: lighten;\n    }\n  }\n}\n"
  },
  {
    "path": "site/src/scss/_navbar.scss",
    "content": ".bd-navbar {\n  padding: .75rem 0;\n  background-color: transparent;\n  box-shadow: 0 .5rem 1rem rgba($black, .15), inset 0 -1px 0 rgba($white, .15);\n\n  @media (forced-colors) {\n    background-color: Canvas;\n  }\n\n  &::after {\n    position: absolute;\n    inset: 0;\n    z-index: -1;\n    display: block;\n    content: \"\";\n    background-image: linear-gradient(rgba(var(--bd-violet-rgb), 1), rgba(var(--bd-violet-rgb), .95));\n  }\n\n  .bd-navbar-toggle {\n    @include media-breakpoint-down(lg) {\n      width: 4.25rem;\n    }\n  }\n\n  .navbar-toggler {\n    padding: 0;\n    margin-right: -.5rem;\n    border: 0;\n\n    &:first-child {\n      margin-left: -.5rem;\n    }\n\n    .bi {\n      width: 1.5rem;\n      height: 1.5rem;\n    }\n\n    &:focus {\n      box-shadow: none;\n    }\n  }\n\n  .navbar-brand {\n    color: $white;\n    @include transition(transform .2s ease-in-out);\n\n    &:hover {\n      transform: rotate(-5deg) scale(1.1);\n    }\n  }\n\n  .navbar-toggler,\n  .nav-link {\n    padding-right: $spacer * .25;\n    padding-left: $spacer * .25;\n    color: rgba($white, .85);\n\n    &:hover,\n    &:focus {\n      color: $white;\n    }\n\n    &.active {\n      font-weight: 600;\n      color: $white;\n    }\n  }\n\n  .navbar-nav-svg {\n    display: inline-block;\n    vertical-align: -.125rem;\n  }\n\n  .offcanvas-lg {\n    background-color: var(--bd-violet-bg);\n    border-left: 0;\n\n    @include media-breakpoint-down(lg) {\n      box-shadow: var(--bs-box-shadow-lg);\n    }\n  }\n\n  .dropdown-toggle {\n    &:focus:not(:focus-visible) {\n      outline: 0;\n    }\n  }\n\n  .dropdown-menu {\n    --bs-dropdown-min-width: 12rem;\n    --bs-dropdown-padding-x: .25rem;\n    --bs-dropdown-padding-y: .25rem;\n    --bs-dropdown-link-hover-bg: rgba(var(--bd-violet-rgb), .1);\n    --bs-dropdown-link-active-bg: rgba(var(--bd-violet-rgb), 1);\n    @include rfs(.875rem, --bs-dropdown-font-size);\n    @include font-size(.875rem);\n    @include border-radius(.5rem);\n    box-shadow: $dropdown-box-shadow;\n\n    li + li {\n      margin-top: .125rem;\n    }\n\n    .dropdown-item {\n      @include border-radius(.25rem);\n\n      &:active {\n        .bi {\n          color: inherit !important; // stylelint-disable-line declaration-no-important\n        }\n      }\n    }\n\n    .active {\n      font-weight: 600;\n\n      .bi {\n        display: block !important; // stylelint-disable-line declaration-no-important\n      }\n    }\n  }\n\n  .dropdown-menu-end {\n    --bs-dropdown-min-width: 8rem;\n  }\n}\n\n@include color-mode(dark) {\n  .bd-navbar {\n    box-shadow: 0 .5rem 1rem rgba($black, .15), inset 0 -1px 0 rgba($white, .15);\n  }\n}\n"
  },
  {
    "path": "site/src/scss/_placeholder-img.scss",
    "content": "//\n// Placeholder svg used in the docs.\n//\n\n// Remember to update `site/_layouts/examples.html` too if this changes!\n\n.bd-placeholder-img {\n  @include font-size(1.125rem);\n  user-select: none;\n  text-anchor: middle;\n}\n\n.bd-placeholder-img-lg {\n  @include font-size(3.5rem);\n}\n"
  },
  {
    "path": "site/src/scss/_scrolling.scss",
    "content": "// When navigating with the keyboard, prevent focus from landing behind the sticky header\n\nmain {\n  a,\n  button,\n  input,\n  select,\n  textarea,\n  h2,\n  h3,\n  h4,\n  [tabindex=\"0\"] {\n    scroll-margin-top: 80px;\n    scroll-margin-bottom: 100px;\n  }\n}\n"
  },
  {
    "path": "site/src/scss/_search.scss",
    "content": "// stylelint-disable selector-class-pattern\n\n:root {\n  --docsearch-primary-color: var(--bd-violet);\n  --docsearch-logo-color: var(--bd-violet);\n}\n\n@include color-mode(dark, true) {\n  // From here, the values are copied from https://cdn.jsdelivr.net/npm/@docsearch/css@3\n  // in html[data-theme=\"dark\"] selector\n  // and are slightly modified for formatting purpose\n  --docsearch-text-color: #f5f6f7;\n  --docsearch-container-background: rgba(9, 10, 17, .8);\n  --docsearch-modal-background: #15172a;\n  --docsearch-modal-shadow: inset 1px 1px 0 0 #2c2e40, 0 3px 8px 0 #000309;\n  --docsearch-searchbox-background: #090a11;\n  --docsearch-searchbox-focus-background: #000;\n  --docsearch-hit-color: #bec3c9;\n  --docsearch-hit-shadow: none;\n  --docsearch-hit-background: #090a11;\n  --docsearch-key-gradient: linear-gradient(-26.5deg, #565872, #31355b);\n  --docsearch-key-shadow: inset 0 -2px 0 0 #282d55, inset 0 0 1px 1px #51577d, 0 2px 2px 0 rgba(3, 4, 9, .3);\n  --docsearch-footer-background: #1e2136;\n  --docsearch-footer-shadow: inset 0 1px 0 0 rgba(73, 76, 106, .5), 0 -4px 8px 0 rgba(0, 0, 0, .2);\n  --docsearch-muted-color: #7f8497;\n}\n\n.bd-search {\n  position: relative;\n\n  @include media-breakpoint-up(lg) {\n    position: absolute;\n    top: .875rem;\n    left: 50%;\n    width: 200px;\n    margin-left: -100px;\n  }\n\n  @include media-breakpoint-up(xl) {\n    width: 280px;\n    margin-left: -140px;\n  }\n\n}\n\n.DocSearch-Container {\n  --docsearch-muted-color: var(--bs-secondary-color);\n  --docsearch-hit-shadow: none;\n\n  position: fixed;\n  z-index: 2000; // Make sure to be over all components showcased in the documentation\n  cursor: auto; // Needed because of [role=\"button\"] in Algolia search modal. Remove once https://github.com/algolia/docsearch/issues/1370 is tackled.\n\n  @include media-breakpoint-up(lg) {\n    padding-top: 4rem;\n  }\n}\n\n.DocSearch-Button {\n  --docsearch-searchbox-background: #{rgba($black, .1)};\n  --docsearch-searchbox-color: #{$white};\n  --docsearch-searchbox-focus-background: #{rgba($black, .25)};\n  --docsearch-searchbox-shadow: #{0 0 0 .25rem rgba($bd-accent, .4)};\n  --docsearch-text-color: #{$white};\n  --docsearch-muted-color: #{rgba($white, .65)};\n\n  width: 100%;\n  height: 38px; // Match Bootstrap inputs\n  margin: 0;\n  border: 1px solid rgba($white, .4);\n  @include border-radius(.375rem);\n\n  .DocSearch-Search-Icon {\n    opacity: .65;\n  }\n\n  &:active,\n  &:focus,\n  &:hover {\n    border-color: rgba($bd-accent, 1);\n\n    .DocSearch-Search-Icon {\n      opacity: 1;\n    }\n  }\n\n  @include media-breakpoint-down(lg) {\n    &,\n    &:hover,\n    &:focus {\n      background: transparent;\n      border: 0;\n      box-shadow: none;\n    }\n    &:focus {\n      box-shadow: var(--docsearch-searchbox-shadow);\n    }\n  }\n}\n\n.DocSearch-Button-Keys,\n.DocSearch-Button-Placeholder {\n  @include media-breakpoint-down(lg) {\n    display: none;\n  }\n}\n\n.DocSearch-Button-Keys {\n  min-width: 0;\n  padding: .125rem .25rem;\n  background: rgba($black, .25);\n  @include border-radius(.25rem);\n}\n\n.DocSearch-Button-Key {\n  top: 0;\n  width: auto;\n  height: 1.25rem;\n  padding-right: .125rem;\n  padding-left: .125rem;\n  margin-right: 0;\n  font-size: .875rem;\n  background: none;\n  box-shadow: none;\n}\n\n.DocSearch-Commands-Key {\n  padding-left: 1px;\n  font-size: .875rem;\n  background-color: rgba($black, .1);\n  background-image: none;\n  box-shadow: none;\n}\n\n.DocSearch-Form {\n  @include border-radius(var(--bs-border-radius));\n}\n\n.DocSearch-Hits {\n  mark {\n    padding: 0;\n  }\n}\n\n.DocSearch-Hit {\n  padding-bottom: 0;\n  @include border-radius(0);\n\n  a {\n    @include border-radius(0);\n    border: solid var(--bs-border-color);\n    border-width: 0 1px 1px;\n  }\n\n  &:first-child a {\n    @include border-top-radius(var(--bs-border-radius));\n    border-top-width: 1px;\n  }\n  &:last-child a {\n    @include border-bottom-radius(var(--bs-border-radius));\n  }\n}\n\n.DocSearch-Hit-icon {\n  display: flex;\n  align-items: center;\n}\n\n// Fix --docsearch-logo-color that doesn't do anything\n.DocSearch-Logo svg .cls-1,\n.DocSearch-Logo svg .cls-2 {\n  fill: var(--docsearch-logo-color);\n}\n"
  },
  {
    "path": "site/src/scss/_sidebar.scss",
    "content": ".bd-sidebar {\n  @include media-breakpoint-up(lg) {\n    position: sticky;\n    top: 5rem;\n    // Override collapse behaviors\n    // stylelint-disable-next-line declaration-no-important\n    display: block !important;\n    height: subtract(100vh, 6rem);\n    // Prevent focus styles to be cut off:\n    padding-left: .25rem;\n    margin-left: -.25rem;\n    overflow-y: auto;\n  }\n\n  @include media-breakpoint-down(lg) {\n    .offcanvas-lg {\n      border-right-color: var(--bs-border-color);\n      box-shadow: var(--bs-box-shadow-lg);\n    }\n  }\n}\n\n.bd-links-heading {\n  color: var(--bs-emphasis-color);\n}\n\n.bd-links-nav {\n  @include media-breakpoint-down(lg) {\n    font-size: .875rem;\n  }\n\n  @include media-breakpoint-between(xs, lg) {\n    column-count: 2;\n    column-gap: 1.5rem;\n\n    .bd-links-group {\n      break-inside: avoid;\n    }\n\n    .bd-links-span-all {\n      column-span: all;\n    }\n  }\n}\n\n.bd-links-link {\n  padding: .1875rem .5rem;\n  margin-top: .125rem;\n  margin-left: 1.125rem;\n  color: var(--bs-body-color);\n  text-decoration: if($link-decoration == none, null, none);\n\n  &:hover,\n  &:focus,\n  &.active {\n    color: var(--bs-emphasis-color);\n    text-decoration: if($link-hover-decoration == underline, none, null);\n    background-color: var(--bd-sidebar-link-bg);\n  }\n\n  &.active {\n    font-weight: 600;\n  }\n}\n"
  },
  {
    "path": "site/src/scss/_skippy.scss",
    "content": ".skippy {\n  background-color: $bd-purple;\n\n  a {\n    color: $white;\n  }\n}\n"
  },
  {
    "path": "site/src/scss/_syntax.scss",
    "content": ":root,\n[data-bs-theme=\"light\"] {\n  // --base00: #fff;\n  // --base01: #f5f5f5;\n  --base02: #c8c8fa;\n  --base03: #565c64;\n  --base04: #666;\n  --base05: #333;\n  --base06: #fff;\n  --base07: #{$teal-700}; // #9a6700\n  --base08: #{mix($red-500, $red-600, 50%)}; // #bc4c00\n  --base09: #{$cyan-700}; // #087990\n  --base0A: #{$purple-500}; // #795da3\n  --base0B: #{$blue-700}; // #183691\n  --base0C: #{$blue-700}; // #183691\n  --base0D: #{$purple-500}; // #795da3\n  --base0E: #{$pink-600}; // #a71d5d\n  --base0F: #333;\n}\n\n@include color-mode(dark, true) {\n  // --base00: #282c34;\n  // --base01: #353b45;\n  --base02: #3e4451;\n  --base03: #868e96;\n  --base04: #868e96;\n  --base05: #abb2bf;\n  --base06: #b6bdca;\n  --base07: #{$orange-300}; // #d19a66\n  --base08: #{$cyan-300};\n  --base09: #{$orange-300}; // #d19a66\n  --base0A: #{$yellow-200}; // #e5c07b\n  --base0B: #{$teal-300}; // #98c379\n  --base0C: #{$teal-300}; // #56b6c2\n  --base0D: #{$blue-300}; // #61afef\n  --base0E: #{$indigo-200}; // #c678dd\n  --base0F: #{$red-300}; // #be5046\n}\n\n// Shell prompts\n.language-bash .line::before,\n.language-sh .line::before {\n  display: inline-block;\n  color: var(--base03);\n  content: \"$ \";\n  user-select: none;\n}\n\n.language-powershell .line::before {\n  display: inline-block;\n  color: var(--base0C);\n  content: \"PM> \";\n  user-select: none;\n}\n\n// Token styles\n.token {\n  &.comment,\n  &.prolog,\n  &.doctype,\n  &.cdata {\n    color: var(--base03);\n  }\n\n  &.punctuation {\n    color: var(--base05);\n  }\n\n  &.property {\n    color: var(--base0A);\n  }\n\n  &.tag {\n    color: var(--base08);\n  }\n\n  &.boolean,\n  &.number {\n    color: var(--base09);\n  }\n\n  &.constant,\n  &.symbol,\n  &.deleted {\n    color: var(--base08);\n  }\n\n  &.attr-name,\n  &.string,\n  &.char,\n  &.builtin,\n  &.inserted {\n    color: var(--base0C);\n  }\n\n  &.operator,\n  &.entity,\n  &.url {\n    color: var(--base05);\n  }\n\n  &.atrule,\n  &.attr-value,\n  &.keyword {\n    color: var(--base0E);\n  }\n\n  &.function {\n    color: var(--base0B);\n  }\n\n  &.selector,\n  &.class-name {\n    color: var(--base07);\n  }\n\n  &.regex,\n  &.important {\n    color: var(--base0A);\n  }\n\n  &.variable {\n    color: var(--base08);\n  }\n\n  &.important,\n  &.bold {\n    font-weight: $font-weight-bold;\n  }\n\n  &.italic {\n    font-style: italic;\n  }\n\n  &.entity {\n    cursor: help;\n  }\n}\n\n.language-diff {\n  .token {\n    &.deleted {\n      color: $red-400;\n      background-color: transparent;\n    }\n    &.inserted {\n      color: $green-400;\n      background-color: transparent;\n    }\n  }\n}\n\n.language-bash,\n.language-sh {\n  .token.comment {\n    color: var(--base03);\n  }\n}\n"
  },
  {
    "path": "site/src/scss/_toc.scss",
    "content": "// stylelint-disable selector-max-type, selector-no-qualifying-type\n\n.bd-toc {\n  font-size: .875rem;\n  container-type: inline-size;\n\n  @include media-breakpoint-up(lg) {\n    position: sticky;\n    top: 5rem;\n    right: 0;\n    z-index: 2;\n    height: subtract(100vh, 7rem);\n    overflow-y: auto;\n  }\n\n  nav {\n    @include font-size(.875rem);\n\n    ul {\n      padding-left: 0;\n      margin-bottom: 0;\n      list-style: none;\n\n      ul {\n        padding-left: 1rem;\n      }\n    }\n\n    a {\n      display: block;\n      padding: .125rem 0 .125rem .75rem;\n      color: inherit;\n      text-decoration: none;\n      border-left: .125rem solid transparent;\n\n      &:hover,\n      &.active {\n        color: var(--bd-toc-color);\n        border-left-color: var(--bd-toc-color);\n      }\n\n      &.active {\n        font-weight: 500;\n      }\n\n      code {\n        font: inherit;\n      }\n    }\n  }\n}\n\n.bd-toc-toggle {\n  display: flex;\n  align-items: center;\n\n  @include media-breakpoint-down(sm) {\n    justify-content: space-between;\n    width: 100%;\n  }\n\n  @include media-breakpoint-down(md) {\n    color: var(--bs-body-color);\n    border: 1px solid var(--bs-border-color);\n    @include border-radius(var(--bs-border-radius));\n\n    &:hover,\n    &:focus,\n    &:active,\n    &[aria-expanded=\"true\"] {\n      color: var(--bd-violet);\n      background-color: var(--bs-body-bg);\n      border-color: var(--bd-violet);\n    }\n\n    &:focus,\n    &[aria-expanded=\"true\"] {\n      box-shadow: 0 0 0 3px rgba(var(--bd-violet-rgb), .25);\n    }\n  }\n}\n\n.bd-toc-collapse {\n  @include media-breakpoint-down(md) {\n    nav {\n      padding: 1.25rem 1.25rem 1.25rem 1rem;\n      background-color: var(--bs-tertiary-bg);\n      border: 1px solid var(--bs-border-color);\n      @include border-radius(var(--bs-border-radius));\n    }\n  }\n\n  @include media-breakpoint-up(md) {\n    display: block !important; // stylelint-disable-line declaration-no-important\n  }\n}\n"
  },
  {
    "path": "site/src/scss/_variables.scss",
    "content": "// Local docs variables\n$bd-purple:        #4c0bce;\n$bd-violet:        lighten(saturate($bd-purple, 5%), 15%); // stylelint-disable-line function-disallowed-list\n$bd-purple-light:  lighten(saturate($bd-purple, 5%), 45%); // stylelint-disable-line function-disallowed-list\n$bd-accent:        #ffe484;\n\n$bd-gutter-x: 3rem;\n$bd-callout-variants: info, warning, danger !default;\n\n:root,\n[data-bs-theme=\"light\"] {\n  --bd-purple: #{$bd-purple};\n  --bd-violet: #{$bd-violet};\n  --bd-accent: #{$bd-accent};\n  --bd-violet-rgb: #{to-rgb($bd-violet)}; // stylelint-disable-line scss/dollar-variable-no-missing-interpolation\n  --bd-accent-rgb: #{to-rgb($bd-accent)}; // stylelint-disable-line scss/dollar-variable-no-missing-interpolation\n  --bd-pink-rgb: #{to-rgb($pink-500)};\n  --bd-teal-rgb: #{to-rgb($teal-500)};\n  --bd-violet-bg: var(--bd-violet);\n  --bd-toc-color: var(--bd-violet);\n  --bd-sidebar-link-bg: rgba(var(--bd-violet-rgb), .1);\n  --bd-callout-link: #{to-rgb($blue-600)};\n  --bd-callout-code-color: #{$pink-600};\n  --bd-pre-bg: var(--bs-tertiary-bg);\n}\n\n@include color-mode(dark, true) {\n  --bd-violet: #{mix($bd-violet, $white, 75%)}; // stylelint-disable-line scss/dollar-variable-no-missing-interpolation\n  --bd-violet-bg: #{$bd-violet};\n  --bd-toc-color: var(--#{$prefix}emphasis-color);\n  --bd-sidebar-link-bg: rgba(#{to-rgb(mix($bd-violet, $black, 75%))}, .5); // stylelint-disable-line scss/dollar-variable-no-missing-interpolation\n  --bd-callout-link: #{to-rgb($blue-300)};\n  --bd-callout-code-color: #{$pink-300};\n  --bd-pre-bg: #{adjust-color($gray-900, $lightness: -2.5%)}; // stylelint-disable-line scss/at-function-named-arguments\n}\n"
  },
  {
    "path": "site/src/scss/docs.scss",
    "content": "/*!\n * Bootstrap Docs (https://getbootstrap.com/)\n * Copyright 2011-2026 The Bootstrap Authors\n * Licensed under the Creative Commons Attribution 3.0 Unported License.\n * For details, see https://creativecommons.org/licenses/by/3.0/.\n */\n\n// Dev notes\n//\n// Background information on nomenclature and architecture decisions here.\n//\n// - Bootstrap functions, variables, and mixins are included for easy reuse.\n//   Doing so gives us access to the same core utilities provided by Bootstrap.\n//   For example, consistent media queries through those mixins.\n//\n// - Bootstrap's **docs variables** are prefixed with `$bd-`.\n//   These custom colors avoid collision with the components Bootstrap provides.\n//\n// - Classes are prefixed with `.bd-`.\n//   These classes indicate custom-built or modified components for the design\n//   and layout of the Bootstrap docs. They are not included in our builds.\n//\n// Happy Bootstrapping!\n\n// Load Bootstrap variables and mixins\n@import \"../../../scss/functions\";\n@import \"../../../scss/variables\";\n@import \"../../../scss/mixins\";\n\n// fusv-disable\n$enable-grid-classes: false;\n$enable-cssgrid: true;\n// fusv-enable\n@import \"../../../scss/grid\";\n\n// Load docs components\n@import \"variables\";\n@import \"navbar\";\n@import \"masthead\";\n@import \"ads\";\n@import \"content\";\n@import \"skippy\";\n@import \"sidebar\";\n@import \"layout\";\n@import \"toc\";\n@import \"footer\";\n@import \"component-examples\";\n@import \"buttons\";\n@import \"callouts\";\n@import \"brand\";\n@import \"colors\";\n@import \"clipboard-js\";\n@import \"placeholder-img\";\n@import \"scrolling\";\n\n// Load docs dependencies\n@import \"syntax\";\n@import \"anchor\";\n"
  },
  {
    "path": "site/src/scss/docs_search.scss",
    "content": "/*!\n * Bootstrap Docs (https://getbootstrap.com/)\n * Copyright 2024-2026 The Bootstrap Authors\n * Licensed under the Creative Commons Attribution 3.0 Unported License.\n * For details, see https://creativecommons.org/licenses/by/3.0/.\n */\n\n@import \"../../../scss/functions\";\n@import \"../../../scss/variables\";\n@import \"../../../scss/mixins\";\n@import \"variables\";\n\n@import \"@docsearch/css/dist/style\";\n@import \"search\";\n"
  },
  {
    "path": "site/src/types/auto-import.d.ts",
    "content": "/**\n * DO NOT EDIT THIS FILE MANUALLY.\n *\n * This file is automatically generated by the Bootstrap Astro Integration.\n * It contains the type definitions for the components that are auto imported in all pages.\n * @see site/src/libs/astro.ts\n */\nexport declare global {\n  export const AddedIn: typeof import('@shortcodes/AddedIn.astro').default\n  export const BsTable: typeof import('@shortcodes/BsTable.astro').default\n  export const Callout: typeof import('@shortcodes/Callout.astro').default\n  export const CalloutDeprecatedDarkVariants: typeof import('@shortcodes/CalloutDeprecatedDarkVariants.astro').default\n  export const Code: typeof import('@shortcodes/Code.astro').default\n  export const DeprecatedIn: typeof import('@shortcodes/DeprecatedIn.astro').default\n  export const Example: typeof import('@shortcodes/Example.astro').default\n  export const JsDismiss: typeof import('@shortcodes/JsDismiss.astro').default\n  export const JsDocs: typeof import('@shortcodes/JsDocs.astro').default\n  export const Placeholder: typeof import('@shortcodes/Placeholder.astro').default\n  export const ScssDocs: typeof import('@shortcodes/ScssDocs.astro').default\n  export const Table: typeof import('@shortcodes/Table.astro').default\n}\n"
  },
  {
    "path": "site/src/types/window.d.ts",
    "content": "export declare global {\n  export const StackBlitzSDK: typeof import('@stackblitz/sdk').default\n\n  /**\n   * The `bootstrap` object is exposed to the global scope and also to the `window` object in the browser.\n   * We rely on the DefinitelyTyped community types for this object to get proper type checking for part of the\n   * documentation using the Bootstrap API and avoid any misuse of the API.\n   * To temporarily or permanently disable this feature (e.g. when modifying the Bootstrap API used in the\n   * documentation), the 2 lines containing `typeof import('bootstrap')` can be commented and replaced by the commented\n   * lines containing `any`.\n   *\n   * The documentation is currently using the following APIs from Bootstrap:\n   *\n   *  - `bootstrap.Tooltip.getOrCreateInstance`\n   *  - `bootstrap.Tooltip.getInstance`\n   *\n   */\n  export const bootstrap: typeof import('bootstrap')\n  // export const bootstrap: any\n\n  interface Window {\n    bootstrap: typeof import('bootstrap')\n    // bootstrap: any\n  }\n}\n"
  },
  {
    "path": "site/static/CNAME",
    "content": "getbootstrap.com\n"
  },
  {
    "path": "site/static/docs/[version]/assets/img/favicons/manifest.json",
    "content": "{\n  \"name\": \"Bootstrap\",\n  \"short_name\": \"Bootstrap\",\n  \"icons\": [\n    {\n      \"src\": \"android-chrome-192x192.png\",\n      \"sizes\": \"192x192\",\n      \"type\": \"image/png\"\n    },\n    {\n      \"src\": \"android-chrome-512x512.png\",\n      \"sizes\": \"512x512\",\n      \"type\": \"image/png\"\n    }\n  ],\n  \"start_url\": \"/?utm_source=a2hs\",\n  \"theme_color\": \"#7952b3\",\n  \"background_color\": \"#7952b3\",\n  \"display\": \"standalone\"\n}\n"
  },
  {
    "path": "site/static/docs/[version]/assets/js/color-modes.js",
    "content": "/*!\n * Color mode toggler for Bootstrap's docs (https://getbootstrap.com/)\n * Copyright 2011-2026 The Bootstrap Authors\n * Licensed under the Creative Commons Attribution 3.0 Unported License.\n */\n\n(() => {\n  'use strict'\n\n  const getStoredTheme = () => localStorage.getItem('theme')\n  const setStoredTheme = theme => localStorage.setItem('theme', theme)\n\n  const getPreferredTheme = () => {\n    const storedTheme = getStoredTheme()\n    if (storedTheme) {\n      return storedTheme\n    }\n\n    return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'\n  }\n\n  const setTheme = theme => {\n    if (theme === 'auto') {\n      document.documentElement.setAttribute('data-bs-theme', (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'))\n    } else {\n      document.documentElement.setAttribute('data-bs-theme', theme)\n    }\n  }\n\n  setTheme(getPreferredTheme())\n\n  const showActiveTheme = (theme, focus = false) => {\n    const themeSwitcher = document.querySelector('#bd-theme')\n\n    if (!themeSwitcher) {\n      return\n    }\n\n    const themeSwitcherText = document.querySelector('#bd-theme-text')\n    const activeThemeIcon = document.querySelector('.theme-icon-active use')\n    const btnToActive = document.querySelector(`[data-bs-theme-value=\"${theme}\"]`)\n    const svgOfActiveBtn = btnToActive.querySelector('svg use').getAttribute('href')\n\n    document.querySelectorAll('[data-bs-theme-value]').forEach(element => {\n      element.classList.remove('active')\n      element.setAttribute('aria-pressed', 'false')\n    })\n\n    btnToActive.classList.add('active')\n    btnToActive.setAttribute('aria-pressed', 'true')\n    activeThemeIcon.setAttribute('href', svgOfActiveBtn)\n    const themeSwitcherLabel = `${themeSwitcherText.textContent} (${btnToActive.dataset.bsThemeValue})`\n    themeSwitcher.setAttribute('aria-label', themeSwitcherLabel)\n\n    if (focus) {\n      themeSwitcher.focus()\n    }\n  }\n\n  window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', () => {\n    const storedTheme = getStoredTheme()\n    if (storedTheme !== 'light' && storedTheme !== 'dark') {\n      setTheme(getPreferredTheme())\n    }\n  })\n\n  window.addEventListener('DOMContentLoaded', () => {\n    showActiveTheme(getPreferredTheme())\n\n    document.querySelectorAll('[data-bs-theme-value]')\n      .forEach(toggle => {\n        toggle.addEventListener('click', () => {\n          const theme = toggle.getAttribute('data-bs-theme-value')\n          setStoredTheme(theme)\n          setTheme(theme)\n          showActiveTheme(theme, true)\n        })\n      })\n  })\n})()\n"
  },
  {
    "path": "site/static/docs/[version]/assets/js/validate-forms.js",
    "content": "// Example starter JavaScript for disabling form submissions if there are invalid fields\n(() => {\n  'use strict'\n\n  // Fetch all the forms we want to apply custom Bootstrap validation styles to\n  const forms = document.querySelectorAll('.needs-validation')\n\n  // Loop over them and prevent submission\n  Array.from(forms).forEach(form => {\n    form.addEventListener('submit', event => {\n      if (!form.checkValidity()) {\n        event.preventDefault()\n        event.stopPropagation()\n      }\n\n      form.classList.add('was-validated')\n    }, false)\n  })\n})()\n"
  },
  {
    "path": "site/static/sw.js",
    "content": "// NOTICE!! DO NOT USE ANY OF THIS JAVASCRIPT\n// IT'S ALL JUST JUNK FOR OUR DOCS!\n// ++++++++++++++++++++++++++++++++++++++++++\n\n(function () {\n  'use strict'\n\n  if ('serviceWorker' in navigator) {\n    window.addEventListener('load', function () {\n      navigator.serviceWorker.getRegistrations().then(function (registrations) {\n        for (var registration of registrations) {\n          registration.unregister()\n            .then(function () {\n              return self.clients.matchAll()\n            })\n            .then(function (clients) {\n              clients.forEach(function (client) {\n                if (client.url && 'navigate' in client) {\n                  client.navigate(client.url)\n                }\n              })\n            })\n        }\n      })\n    })\n  }\n})()\n"
  },
  {
    "path": "site/tsconfig.json",
    "content": "{\n  \"extends\": \"astro/tsconfigs/strict\",\n  \"compilerOptions\": {\n    \"baseUrl\": \".\",\n    \"paths\": {\n      \"@assets/*\": [\"src/assets/*\"],\n      \"@components/*\": [\"src/components/*\"],\n      \"@layouts/*\": [\"src/layouts/*\"],\n      \"@libs/*\": [\"src/libs/*\"],\n      \"@shortcodes/*\": [\"src/components/shortcodes/*\"]\n    }\n  }\n}\n"
  }
]